Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBEZWx1eGUgUGFpbnQgTG9hZGVyCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCi8vIC0gTWFyayBTaWJseSAobWFya3NpYmx5QGJsaXR6YmFzaWMuY29tKQovLyAtIEFhcm9uIFNodW1hdGUgKHRyZWtAc3RhcnRyZWtlci5jb20pCi8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gIEludGVybmFsIHR5cGVkZWZzIGFuZCBzdHJ1Y3R1cmVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZmRlZiBfV0lOMzIKI3ByYWdtYSBwYWNrKHB1c2gsIDEpCiNlbHNlCiNwcmFnbWEgcGFjaygxKQojZW5kaWYKCnR5cGVkZWYgc3RydWN0IHsKICAgIFdPUkQgdywgaDsgICAgICAgICAgICAgICAgICAgIC8qIHJhc3RlciB3aWR0aCAmIGhlaWdodCBpbiBwaXhlbHMgKi8KICAgIFdPUkQgeCwgeTsgICAgICAgICAgICAgICAgICAgIC8qIHBvc2l0aW9uIGZvciB0aGlzIGltYWdlICovCiAgICBCWVRFIG5QbGFuZXM7ICAgICAgICAgICAgICAgICAvKiAjIHNvdXJjZSBiaXRwbGFuZXMgKi8KICAgIEJZVEUgbWFza2luZzsgICAgICAgICAgICAgICAgIC8qIG1hc2tpbmcgdGVjaG5pcXVlICovCiAgICBCWVRFIGNvbXByZXNzaW9uOyAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBhbGdvcml0aG0gKi8KICAgIEJZVEUgcGFkMTsgICAgICAgICAgICAgICAgICAgIC8qIFVOVVNFRC4gIEZvciBjb25zaXN0ZW5jeSwgcHV0IDAgaGVyZS4qLwogICAgV09SRCB0cmFuc3BhcmVudENvbG9yOyAgICAgICAgLyogdHJhbnNwYXJlbnQgImNvbG9yIG51bWJlciIgKi8KICAgIEJZVEUgeEFzcGVjdCwgeUFzcGVjdDsgICAgICAgIC8qIGFzcGVjdCByYXRpbywgYSByYXRpb25hbCBudW1iZXIgeC95ICovCiAgICBXT1JEIHBhZ2VXaWR0aCwgcGFnZUhlaWdodDsgICAvKiBzb3VyY2UgInBhZ2UiIHNpemUgaW4gcGl4ZWxzICovCn0gQk1IRDsKCiNpZmRlZiBfV0lOMzIKI3ByYWdtYSBwYWNrKHBvcCkKI2Vsc2UKI3ByYWdtYSBwYWNrKCkKI2VuZGlmCgojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4Kc3RhdGljIHZvaWQKU3dhcEhlYWRlcihCTUhEICpoZWFkZXIpIHsKCVN3YXBTaG9ydCgmaGVhZGVyLT53KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5oKTsKCVN3YXBTaG9ydCgmaGVhZGVyLT54KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT55KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT50cmFuc3BhcmVudENvbG9yKTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5wYWdlV2lkdGgpOwoJU3dhcFNob3J0KCZoZWFkZXItPnBhZ2VIZWlnaHQpOwp9CiNlbmRpZgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyogSUZGIGNodW5rIElEcyAqLwoKdHlwZWRlZiBEV09SRCBJRkZfSUQ7CgojZGVmaW5lIE1BS0VfSUQoYSwgYiwgYywgZCkgICAgICAgICAoKElGRl9JRCkoYSk8PDI0IHwgKElGRl9JRCkoYik8PDE2IHwgKElGRl9JRCkoYyk8PDggfCAoSUZGX0lEKShkKSkKCiNkZWZpbmUgSURfRk9STSAgICAgTUFLRV9JRCgnRicsICdPJywgJ1InLCAnTScpICAgICAvKiBFQSBJRkYgODUgZ3JvdXAgaWRlbnRpZmllciAqLwojZGVmaW5lIElEX0NBVCAgICAgIE1BS0VfSUQoJ0MnLCAnQScsICdUJywgJyAnKSAgICAgLyogRUEgSUZGIDg1IGdyb3VwIGlkZW50aWZpZXIgKi8KI2RlZmluZSBJRF9MSVNUICAgICBNQUtFX0lEKCdMJywgJ0knLCAnUycsICdUJykgICAgIC8qIEVBIElGRiA4NSBncm91cCBpZGVudGlmaWVyICovCiNkZWZpbmUgSURfUFJPUCAgICAgTUFLRV9JRCgnUCcsICdSJywgJ08nLCAnUCcpICAgICAvKiBFQSBJRkYgODUgZ3JvdXAgaWRlbnRpZmllciAqLwojZGVmaW5lIElEX0VORCAgICAgIE1BS0VfSUQoJ0UnLCAnTicsICdEJywgJyAnKSAgICAgLyogdW5vZmZpY2lhbCBFTkQtb2YtRk9STSBpZGVudGlmaWVyIChzZWUgQW1pZ2EgUktNIERldmljZXMgRWQuMyBwYWdlIDM3NikgKi8KCiNkZWZpbmUgSURfSUxCTSAgICAgTUFLRV9JRCgnSScsICdMJywgJ0InLCAnTScpICAgICAvKiBFQSBJRkYgODUgcmFzdGVyIGJpdG1hcCBmb3JtICovCiNkZWZpbmUgSURfREVFUCAgICAgTUFLRV9JRCgnRCcsICdFJywgJ0UnLCAnUCcpICAgICAvKiBDaHVua3kgcGl4ZWwgaW1hZ2UgZmlsZXMgKFVzZWQgaW4gVFYgUGFpbnQpICovCiNkZWZpbmUgSURfUkdCOCAgICAgTUFLRV9JRCgnUicsICdHJywgJ0InLCAnOCcpICAgICAvKiBSR0IgaW1hZ2UgZm9ybXMsIFR1cmJvIFNpbHZlciAoSW1wdWxzZSkgKi8KI2RlZmluZSBJRF9SR0JOICAgICBNQUtFX0lEKCdSJywgJ0cnLCAnQicsICdOJykgICAgIC8qIFJHQiBpbWFnZSBmb3JtcywgVHVyYm8gU2lsdmVyIChJbXB1bHNlKSAqLwojZGVmaW5lIElEX1BCTSAgICAgIE1BS0VfSUQoJ1AnLCAnQicsICdNJywgJyAnKSAgICAgLyogMjU2LWNvbG9yIGNodW5reSBmb3JtYXQgKERQYWludCAyID8pICovCiNkZWZpbmUgSURfQUNCTSAgICAgTUFLRV9JRCgnQScsICdDJywgJ0InLCAnTScpICAgICAvKiBBbWlnYSBDb250aWd1b3VzIEJpdG1hcCAoQW1pZ2FCYXNpYykgKi8KLyogZ2VuZXJpYyAqLwojZGVmaW5lIElEX0ZWRVIgICAgIE1BS0VfSUQoJ0YnLCAnVicsICdFJywgJ1InKSAgICAgLyogQW1pZ2FPUyB2ZXJzaW9uIHN0cmluZyAqLwojZGVmaW5lIElEX0pVTksgICAgIE1BS0VfSUQoJ0onLCAnVScsICdOJywgJ0snKSAgICAgLyogYWx3YXlzIGlnbm9yZSB0aGlzIGNodW5rICovCiNkZWZpbmUgSURfQU5OTyAgICAgTUFLRV9JRCgnQScsICdOJywgJ04nLCAnTycpICAgICAvKiBFQSBJRkYgODUgR2VuZXJpYyBBbm5vdGF0aW9uIGNodW5rICovCiNkZWZpbmUgSURfQVVUSCAgICAgTUFLRV9JRCgnQScsICdVJywgJ1QnLCAnSCcpICAgICAvKiBFQSBJRkYgODUgR2VuZXJpYyBBdXRob3IgY2h1bmsgKi8KI2RlZmluZSBJRF9DSFJTICAgICBNQUtFX0lEKCdDJywgJ0gnLCAnUicsICdTJykgICAgIC8qIEVBIElGRiA4NSBHZW5lcmljIGNoYXJhY3RlciBzdHJpbmcgY2h1bmsgKi8KI2RlZmluZSBJRF9OQU1FICAgICBNQUtFX0lEKCdOJywgJ0EnLCAnTScsICdFJykgICAgIC8qIEVBIElGRiA4NSBHZW5lcmljIE5hbWUgb2YgYXJ0LCBtdXNpYywgZXRjLiBjaHVuayAqLwojZGVmaW5lIElEX1RFWFQgICAgIE1BS0VfSUQoJ1QnLCAnRScsICdYJywgJ1QnKSAgICAgLyogRUEgSUZGIDg1IEdlbmVyaWMgdW5mb3JtYXR0ZWQgQVNDSUkgdGV4dCBjaHVuayAqLwojZGVmaW5lIElEX2NvcHkgICAgIE1BS0VfSUQoJygnLCAnYycsICcpJywgJyAnKSAgICAgLyogRUEgSUZGIDg1IEdlbmVyaWMgQ29weXJpZ2h0IHRleHQgY2h1bmsgKi8KLyogSUxCTSBjaHVua3MgKi8KI2RlZmluZSBJRF9CTUhEICAgICBNQUtFX0lEKCdCJywgJ00nLCAnSCcsICdEJykgICAgIC8qIElMQk0gQml0bWFwSGVhZGVyICovCiNkZWZpbmUgSURfQ01BUCAgICAgTUFLRV9JRCgnQycsICdNJywgJ0EnLCAnUCcpICAgICAvKiBJTEJNIDhiaXQgUkdCIGNvbG9ybWFwICovCiNkZWZpbmUgSURfR1JBQiAgICAgTUFLRV9JRCgnRycsICdSJywgJ0EnLCAnQicpICAgICAvKiBJTEJNICJob3RzcG90IiBjb29yZGlhbnRlcyAqLwojZGVmaW5lIElEX0RFU1QgICAgIE1BS0VfSUQoJ0QnLCAnRScsICdTJywgJ1QnKSAgICAgLyogSUxCTSBkZXN0aW5hdGlvbiBpbWFnZSBpbmZvICovCiNkZWZpbmUgSURfU1BSVCAgICAgTUFLRV9JRCgnUycsICdQJywgJ1InLCAnVCcpICAgICAvKiBJTEJNIHNwcml0ZSBpZGVudGlmaWVyICovCiNkZWZpbmUgSURfQ0FNRyAgICAgTUFLRV9JRCgnQycsICdBJywgJ00nLCAnRycpICAgICAvKiBBbWlnYSB2aWV3cG9ydG1vZGVzICovCiNkZWZpbmUgSURfQk9EWSAgICAgTUFLRV9JRCgnQicsICdPJywgJ0QnLCAnWScpICAgICAvKiBJTEJNIGltYWdlIGRhdGEgKi8KI2RlZmluZSBJRF9DUk5HICAgICBNQUtFX0lEKCdDJywgJ1InLCAnTicsICdHJykgICAgIC8qIGNvbG9yIGN5Y2xpbmcgKi8KI2RlZmluZSBJRF9DQ1JUICAgICBNQUtFX0lEKCdDJywgJ0MnLCAnUicsICdUJykgICAgIC8qIGNvbG9yIGN5Y2xpbmcgKi8KI2RlZmluZSBJRF9DTFVUICAgICBNQUtFX0lEKCdDJywgJ0wnLCAnVScsICdUJykgICAgIC8qIENvbG9yIExvb2t1cCBUYWJsZSBjaHVuayAqLwojZGVmaW5lIElEX0RQSSAgICAgIE1BS0VfSUQoJ0QnLCAnUCcsICdJJywgJyAnKSAgICAgLyogRG90cyBwZXIgaW5jaCBjaHVuayAqLwojZGVmaW5lIElEX0RQUFYgICAgIE1BS0VfSUQoJ0QnLCAnUCcsICdQJywgJ1YnKSAgICAgLyogRFBhaW50IHBlcnNwZWN0aXZlIGNodW5rIChFQSkgKi8KI2RlZmluZSBJRF9EUk5HICAgICBNQUtFX0lEKCdEJywgJ1InLCAnTicsICdHJykgICAgIC8qIERQYWludCBJViBlbmhhbmNlZCBjb2xvciBjeWNsZSBjaHVuayAoRUEpICovCiNkZWZpbmUgSURfRVBTRiAgICAgTUFLRV9JRCgnRScsICdQJywgJ1MnLCAnRicpICAgICAvKiBFbmNhcHN1bGF0ZWQgUG9zdHNjcmlwdCBjaHVuayAqLwojZGVmaW5lIElEX0NNWUsgICAgIE1BS0VfSUQoJ0MnLCAnTScsICdZJywgJ0snKSAgICAgLyogQ3lhbiwgTWFnZW50YSwgWWVsbG93LCAmIEJsYWNrIGNvbG9yIG1hcCAoU29mdC1Mb2dpaykgKi8KI2RlZmluZSBJRF9DTkFNICAgICBNQUtFX0lEKCdDJywgJ04nLCAnQScsICdNJykgICAgIC8qIENvbG9yIG5hbWluZyBjaHVuayAoU29mdC1Mb2dpaykgKi8KI2RlZmluZSBJRF9QQ0hHICAgICBNQUtFX0lEKCdQJywgJ0MnLCAnSCcsICdHJykgICAgIC8qIExpbmUgYnkgbGluZSBwYWxldHRlIGNvbnRyb2wgaW5mb3JtYXRpb24gKFNlYmFzdGlhbm8gVmlnbmEpICovCiNkZWZpbmUgSURfUFJWVyAgICAgTUFLRV9JRCgnUCcsICdSJywgJ1YnLCAnVycpICAgICAvKiBBIG1pbmkgZHVwbGljYXRlIElMQk0gdXNlZCBmb3IgcHJldmlldyAoR2FyeSBCb25oYW0pICovCiNkZWZpbmUgSURfWEJNSSAgICAgTUFLRV9JRCgnWCcsICdCJywgJ00nLCAnSScpICAgICAvKiBlWHRlbmRlZCBCaXRNYXAgSW5mb3JtYXRpb24gKFNvZnQtTG9naWspICovCiNkZWZpbmUgSURfQ1RCTCAgICAgTUFLRV9JRCgnQycsICdUJywgJ0InLCAnTCcpICAgICAvKiBOZXd0ZWsgRHluYW1pYyBIYW0gY29sb3IgY2h1bmsgKi8KI2RlZmluZSBJRF9EWUNQICAgICBNQUtFX0lEKCdEJywgJ1knLCAnQycsICdQJykgICAgIC8qIE5ld3RlayBEeW5hbWljIEhhbSBjaHVuayAqLwojZGVmaW5lIElEX1NIQU0gICAgIE1BS0VfSUQoJ1MnLCAnSCcsICdBJywgJ00nKSAgICAgLyogU2xpY2VkIEhBTSBjb2xvciBjaHVuayAqLwojZGVmaW5lIElEX0FCSVQgICAgIE1BS0VfSUQoJ0EnLCAnQicsICdJJywgJ1QnKSAgICAgLyogQUNCTSBib2R5IGNodW5rICovCiNkZWZpbmUgSURfRENPTCAgICAgTUFLRV9JRCgnRCcsICdDJywgJ08nLCAnTCcpICAgICAvKiB1bm9mZmljaWFsIGRpcmVjdCBjb2xvciAqLwoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW50ZXJmYWNlCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpGb3JtYXQoKSB7CglyZXR1cm4gIklGRiI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkRlc2NyaXB0aW9uKCkgewoJcmV0dXJuICJJRkYgSW50ZXJsZWF2ZWQgQml0bWFwIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRXh0ZW5zaW9uKCkgewoJcmV0dXJuICJpZmYsbGJtIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKUmVnRXhwcigpIHsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpNaW1lVHlwZSgpIHsKCXJldHVybiAiaW1hZ2UveC1pZmYiOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKVmFsaWRhdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CglEV09SRCB0eXBlID0gMDsKCgkvLyByZWFkIGNodW5rIHR5cGUKCWlvLT5yZWFkX3Byb2MoJnR5cGUsIDQsIDEsIGhhbmRsZSk7CiNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgoJU3dhcExvbmcoJnR5cGUpOwojZW5kaWYKCglpZih0eXBlICE9IElEX0ZPUk0pCgkJcmV0dXJuIEZBTFNFOwoJCQoJLy8gc2tpcCA0IGJ5dGVzCglpby0+cmVhZF9wcm9jKCZ0eXBlLCA0LCAxLCBoYW5kbGUpOwoKCS8vIHJlYWQgY2h1bmsgdHlwZQoJaW8tPnJlYWRfcHJvYygmdHlwZSwgNCwgMSwgaGFuZGxlKTsKI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCglTd2FwTG9uZygmdHlwZSk7CiNlbmRpZgoKCS8vIEZpbGUgZm9ybWF0IDogSURfUEJNID0gUGFja2VkIEJpdG1hcCwgSURfSUxCTSA9IEludGVybGVhdmVkIEJpdG1hcAoJcmV0dXJuICh0eXBlID09IElEX0lMQk0pIHx8ICh0eXBlID09IElEX1BCTSk7Cn0KCgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKCXJldHVybiBGQUxTRTsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WIApTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKCXJldHVybiBGQUxTRTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCkxvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CglpZiAoaGFuZGxlICE9IE5VTEwpIHsKCQlGSUJJVE1BUCAqZGliID0gTlVMTDsKCgkJRFdPUkQgdHlwZSwgc2l6ZTsKCgkJaW8tPnJlYWRfcHJvYygmdHlwZSwgNCwgMSwgaGFuZGxlKTsKI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJU3dhcExvbmcoJnR5cGUpOwojZW5kaWYKCgkJaWYodHlwZSAhPSBJRF9GT1JNKQoJCQlyZXR1cm4gTlVMTDsKCgkJaW8tPnJlYWRfcHJvYygmc2l6ZSwgNCwgMSwgaGFuZGxlKTsKI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJU3dhcExvbmcoJnNpemUpOwojZW5kaWYKCgkJaW8tPnJlYWRfcHJvYygmdHlwZSwgNCwgMSwgaGFuZGxlKTsKI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJU3dhcExvbmcoJnR5cGUpOwojZW5kaWYKCgkJaWYoKHR5cGUgIT0gSURfSUxCTSkgJiYgKHR5cGUgIT0gSURfUEJNKSkKCQkJcmV0dXJuIE5VTEw7CgoJCXNpemUgLT0gNDsKCgkJdW5zaWduZWQgd2lkdGggPSAwLCBoZWlnaHQgPSAwLCBwbGFuZXMgPSAwLCBkZXB0aCA9IDAsIGNvbXAgPSAwOwoKCQl3aGlsZSAoc2l6ZSkgewoJCQlEV09SRCBjaF90eXBlLGNoX3NpemU7CgoJCQlpby0+cmVhZF9wcm9jKCZjaF90eXBlLCA0LCAxLCBoYW5kbGUpOwojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQkJU3dhcExvbmcoJmNoX3R5cGUpOwojZW5kaWYKCgkJCWlvLT5yZWFkX3Byb2MoJmNoX3NpemUsNCwxLGhhbmRsZSApOwojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQkJU3dhcExvbmcoJmNoX3NpemUpOwojZW5kaWYKCgkJCXVuc2lnbmVkIGNoX2VuZCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKSArIGNoX3NpemU7CgoJCQlpZiAoY2hfdHlwZSA9PSBJRF9CTUhEKSB7CQkJLy8gQml0bWFwIEhlYWRlcgoJCQkJaWYgKGRpYikKCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CgoJCQkJQk1IRCBibWhkOwoKCQkJCWlvLT5yZWFkX3Byb2MoJmJtaGQsIHNpemVvZihibWhkKSwgMSwgaGFuZGxlKTsKI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJCQlTd2FwSGVhZGVyKCZibWhkKTsKI2VuZGlmCgoJCQkJd2lkdGggPSBibWhkLnc7CgkJCQloZWlnaHQgPSBibWhkLmg7CgkJCQlwbGFuZXMgPSBibWhkLm5QbGFuZXM7CgkJCQljb21wID0gYm1oZC5jb21wcmVzc2lvbjsKCgkJCQlpZihibWhkLm1hc2tpbmcgJiAxKQoJCQkJCXBsYW5lcysrOwkvLyB0aGVyZSBpcyBhIG1hc2sgKCAnc3RlbmNpbCcgKQoKCQkJCWlmIChwbGFuZXMgPiA4ICYmIHBsYW5lcyAhPSAyNCkKCQkJCQlyZXR1cm4gTlVMTDsKCgkJCQlkZXB0aCA9IHBsYW5lcyA+IDggPyAyNCA6IDg7CgoJCQkJaWYoIGRlcHRoID09IDI0ICkgewoJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CgkJCQl9IGVsc2UgewoJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZSh3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CgkJCQl9CgkJCX0gZWxzZSBpZiAoY2hfdHlwZSA9PSBJRF9DTUFQKSB7CS8vIFBhbGV0dGUgKENvbG9yIE1hcCkKCQkJCWlmICghZGliKQoJCQkJCXJldHVybiBOVUxMOwoKCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CgkJCQlpZihwYWwgIT0gTlVMTCkgewoJCQkJCXVuc2lnbmVkIHBhbGV0dGVfZW50cmllcyA9IE1JTigodW5zaWduZWQpY2hfc2l6ZSAvIDMsIEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKGRpYikpOwoJCQkJCWZvciAodW5zaWduZWQgayA9IDA7IGsgPCBwYWxldHRlX2VudHJpZXM7IGsrKykgewkJCQkJCgkJCQkJCWlvLT5yZWFkX3Byb2MoJnBhbFtrXS5yZ2JSZWQsIDEsIDEsIGhhbmRsZSApOwoJCQkJCQlpby0+cmVhZF9wcm9jKCZwYWxba10ucmdiR3JlZW4sIDEsIDEsIGhhbmRsZSApOwoJCQkJCQlpby0+cmVhZF9wcm9jKCZwYWxba10ucmdiQmx1ZSwgMSwgMSwgaGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgaWYgKGNoX3R5cGUgPT0gSURfQk9EWSkgewoJCQkJaWYgKCFkaWIpCgkJCQkJcmV0dXJuIE5VTEw7CgoJCQkJaWYgKHR5cGUgPT0gSURfUEJNKSB7CgkJCQkJLy8gTk9OIElOVEVSTEFDRUQgKExCTSkKCgkJCQkJdW5zaWduZWQgbGluZSA9IEZyZWVJbWFnZV9HZXRMaW5lKGRpYikgKyAxICYgfjE7CgkJCQkJCgkJCQkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgaSsrKSB7CgkJCQkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYikgLSBpIC0gMSk7CgoJCQkJCQlpZiAoY29tcCA9PSAxKSB7CgkJCQkJCQkvLyB1c2UgUkxFIGNvbXByZXNzaW9uCgoJCQkJCQkJRFdPUkQgbnVtYmVyX29mX2J5dGVzX3dyaXR0ZW4gPSAwOwoJCQkJCQkJQllURSBybGVfY291bnQ7CgkJCQkJCQlCWVRFIGJ5dGU7CgoJCQkJCQkJd2hpbGUgKG51bWJlcl9vZl9ieXRlc193cml0dGVuIDwgbGluZSkgewoJCQkJCQkJCWlvLT5yZWFkX3Byb2MoJnJsZV9jb3VudCwgMSwgMSwgaGFuZGxlKTsKCgkJCQkJCQkJaWYgKHJsZV9jb3VudCA8IDEyOCkgewoJCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHJsZV9jb3VudCArIDE7IGsrKykgewoJCQkJCQkJCQkJaW8tPnJlYWRfcHJvYygmYnl0ZSwgMSwgMSwgaGFuZGxlKTsKCgkJCQkJCQkJCQliaXRzW251bWJlcl9vZl9ieXRlc193cml0dGVuKytdICs9IGJ5dGU7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgaWYgKHJsZV9jb3VudCA+IDEyOCkgewoJCQkJCQkJCQlpby0+cmVhZF9wcm9jKCZieXRlLCAxLCAxLCBoYW5kbGUpOwoKCQkJCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCAyNTcgLSBybGVfY291bnQ7IGsrKykgewoJCQkJCQkJCQkJYml0c1tudW1iZXJfb2ZfYnl0ZXNfd3JpdHRlbisrXSArPSBieXRlOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gZG9uJ3QgdXNlIGNvbXByZXNzaW9uCgoJCQkJCQkJaW8tPnJlYWRfcHJvYyhiaXRzLCBsaW5lLCAxLCBoYW5kbGUpOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gZGliOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBJTlRFUkxBQ0VEIChJTEJNKQoKCQkJCQl1bnNpZ25lZCBwaXhlbF9zaXplID0gZGVwdGgvODsKCQkJCQl1bnNpZ25lZCBuX3dpZHRoPSh3aWR0aCsxNSkmfjE1OwoJCQkJCXVuc2lnbmVkIHBsYW5lX3NpemUgPSBuX3dpZHRoLzg7CgkJCQkJdW5zaWduZWQgc3JjX3NpemUgPSBwbGFuZV9zaXplICogcGxhbmVzOwoJCQkJCUJZVEUgKnNyYyA9IChCWVRFKiltYWxsb2Moc3JjX3NpemUpOwoJCQkJCUJZVEUgKmRlc3QgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOwoKCQkJCQlkZXN0ICs9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpICogaGVpZ2h0OwoKCQkJCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJCQkJZGVzdCAtPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKCgkJCQkJCS8vIHJlYWQgYWxsIHBsYW5lcyBpbiBvbmUgaGl0LAoJCQkJCQkvLyAnY296IFBTUCBjb21wcmVzc2VzIGFjcm9zcyBwbGFuZXMuLi4KCgkJCQkJCWlmIChjb21wKSB7CgkJCQkJCQkvLyB1bnBhY2tlciBhbGdvcml0aG0KCgkJCQkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBzcmNfc2l6ZTspIHsKCQkJCQkJCQkvLyByZWFkIHRoZSBuZXh0IHNvdXJjZSBieXRlIGludG8gdAoJCQkJCQkJCXNpZ25lZCBjaGFyIHQgPSAwOwoJCQkJCQkJCWlvLT5yZWFkX3Byb2MoJnQsIDEsIDEsIGhhbmRsZSk7CgkJCQkJCQkJCgkJCQkJCQkJaWYgKHQgPj0gMCkgewoJCQkJCQkJCQkvLyB0ID0gWzAuLjEyN10gPT4gY29weSB0aGUgbmV4dCB0KzEgYnl0ZXMgbGl0ZXJhbGx5CgkJCQkJCQkJCXVuc2lnbmVkIHNpemVfdG9fcmVhZCA9IHQgKyAxOwoKCQkJCQkJCQkJaWYoKHNpemVfdG9fcmVhZCArIHgpID4gc3JjX3NpemUpIHsKCQkJCQkJCQkJCS8vIHNhbml0eSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIAoJCQkJCQkJCQkJc2l6ZV90b19yZWFkID0gc3JjX3NpemUgLSB4OwoJCQkJCQkJCQkJaW8tPnJlYWRfcHJvYyhzcmMgKyB4LCBzaXplX3RvX3JlYWQsIDEsIGhhbmRsZSk7CgkJCQkJCQkJCQl4ICs9ICh0ICsgMSk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQlpby0+cmVhZF9wcm9jKHNyYyArIHgsIHNpemVfdG9fcmVhZCwgMSwgaGFuZGxlKTsKCQkJCQkJCQkJCXggKz0gc2l6ZV90b19yZWFkOwoJCQkJCQkJCQl9CgkJCQkJCQkJfSBlbHNlIGlmICh0ICE9IC0xMjgpIHsKCQkJCQkJCQkJLy8gdCA9IFstMS4uLTEyN10gID0+IHJlcGxpY2F0ZSB0aGUgbmV4dCBieXRlIC10KzEgdGltZXMKCQkJCQkJCQkJQllURSBiID0gMDsKCQkJCQkJCQkJaW8tPnJlYWRfcHJvYygmYiwgMSwgMSwgaGFuZGxlKTsKCQkJCQkJCQkJdW5zaWduZWQgc2l6ZV90b19jb3B5ID0gKHVuc2lnbmVkKSgtKGludCl0ICsgMSk7CgoJCQkJCQkJCQlpZigoc2l6ZV90b19jb3B5ICsgeCkgPiBzcmNfc2l6ZSkgewoJCQkJCQkJCQkJLy8gc2FuaXR5IGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgCgkJCQkJCQkJCQlzaXplX3RvX2NvcHkgPSBzcmNfc2l6ZSAtIHg7CgkJCQkJCQkJCQltZW1zZXQoc3JjICsgeCwgYiwgc2l6ZV90b19jb3B5KTsKCQkJCQkJCQkJCXggKz0gKHVuc2lnbmVkKSgtKGludCl0ICsgMSk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQltZW1zZXQoc3JjICsgeCwgYiwgc2l6ZV90b19jb3B5KTsKCQkJCQkJCQkJCXggKz0gc2l6ZV90b19jb3B5OwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCS8vIHQgPSAtMTI4ID0+IG5vb3AKCQkJCQkJCX0KCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWlvLT5yZWFkX3Byb2Moc3JjLCBzcmNfc2l6ZSwgMSwgaGFuZGxlKTsKCQkJCQkJfQoKCQkJCQkJLy8gbGF6eSBwbGFuYXItPmNodW5reS4uLgoKCQkJCQkJZm9yICh1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKCQkJCQkJCWZvciAodW5zaWduZWQgbiA9IDA7IG4gPCBwbGFuZXM7IG4rKykgewoJCQkJCQkJCUJZVEUgYml0ID0gKEJZVEUpKCBzcmNbbiAqIHBsYW5lX3NpemUgKyAoeCAvIDgpXSA+PiAoKHheNykgJiA3KSApOwoKCQkJCQkJCQlkZXN0W3ggKiBwaXhlbF9zaXplICsgKG4gLyA4KV0gfD0gKGJpdCAmIDEpIDw8IChuICYgNyk7CgkJCQkJCQl9CgkJCQkJCX0KCiNpZiBGUkVFSU1BR0VfQ09MT1JPUkRFUiA9PSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IKCQkJCQkJaWYgKGRlcHRoID09IDI0KSB7CgkJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7ICsreCl7CgkJCQkJCQkJSU5QTEFDRVNXQVAoZGVzdFt4ICogM10sIGRlc3RbeCAqIDMgKyAyXSk7CgkJCQkJCQl9CgkJCQkJCX0KI2VuZGlmCgkJCQkJfQoKCQkJCQlmcmVlKHNyYyk7CgoJCQkJCXJldHVybiBkaWI7CgkJCQl9CgkJCX0KCgkJCS8vIEV2ZXJ5IG9kZC1sZW5ndGggY2h1bmsgaXMgZm9sbG93ZWQgYnkgYSAwIHBhZCBieXRlLiAgVGhpcyBwYWQKCQkJLy8gIGJ5dGUgaXMgbm90IGNvdW50ZWQgaW4gY2hfc2l6ZS4KCQkJaWYgKGNoX3NpemUgJiAxKSB7CgkJCQljaF9zaXplKys7CgkJCQljaF9lbmQrKzsKCQkJfQoKCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGNoX2VuZCAtIGlvLT50ZWxsX3Byb2MoaGFuZGxlKSwgU0VFS19DVVIpOwoKCQkJc2l6ZSAtPSBjaF9zaXplICsgODsKCQl9CgoJCWlmIChkaWIpCgkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKCX0KCglyZXR1cm4gMDsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyAgIEluaXQKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKdm9pZCBETExfQ0FMTENPTlYKSW5pdElGRihQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgewoJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CgoJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOwoJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CglwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CglwbHVnaW4tPnNhdmVfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBWYWxpZGF0ZTsKCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CglwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CglwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CglwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKfQo=