LyoKICogQ29weXJpZ2h0IDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICiNkZWZpbmUgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICgovKiBNQVkgTk9UIENPTlRBSU4gWDExIG9yIERHQSBzcGVjaWZpYyBpbmNsdWRlcy9kZWZpbmVzL3N0cnVjdHMhICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid3R5cGVzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkZHJhd2kuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkY29taW1wbC5oIgoKI2luY2x1ZGUgIndpbmUvd2luZWQzZF9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgIndpbmUvbGlzdC5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQgLSBhIGhlbHBlciBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERUZJTkVfR1VJRChJSURfSVBhcmVudCwgMHhjMjBlNGM4OCwgMHg3NGU3LCAweDQ5NDAsIDB4YmEsIDB4OWYsIDB4MmUsIDB4MzIsIDB4M2YsIDB4OWQsIDB4YzksIDB4ODEpOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50ICpMUFBBUkVOVCwgKlBQQVJFTlQ7CgojZGVmaW5lIElOVEVSRkFDRSBJUGFyZW50CkRFQ0xBUkVfSU5URVJGQUNFXyhJUGFyZW50LElVbmtub3duKQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgU1RETUVUSE9EXyhIUkVTVUxULFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iamVjdCkgUFVSRTsKICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOwogICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOwp9OwojdW5kZWYgSU5URVJGQUNFCgojaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkKLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KI2RlZmluZSBJUGFyZW50X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiNkZWZpbmUgSVBhcmVudF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQojZGVmaW5lIElQYXJlbnRfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCiNlbmRpZgoKCi8qIFR5cGRlZiB0aGUgaW50ZXJmYWNlcyAqLwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICBJRGlyZWN0RHJhd0ltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwgICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRERldmljZUltcGwgICAgICAgIElEaXJlY3QzRERldmljZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgIElEaXJlY3QzRExpZ2h0SW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50SW1wbCAgICAgICAgICAgICAgICBJUGFyZW50SW1wbDsKCi8qIENhbGxiYWNrcyBmb3IgaW1wbGljaXQgb2JqZWN0IGRlc3RydWN0aW9uICovCmV4dGVybiBVTE9ORyBXSU5BUEkgRDNEN0NCX0Rlc3Ryb3lTd2FwQ2hhaW4oSVdpbmVEM0RTd2FwQ2hhaW4gKnBTd2FwQ2hhaW4pOwoKZXh0ZXJuIFVMT05HIFdJTkFQSSBEM0Q3Q0JfRGVzdHJveURlcHRoU3RlbmNpbFN1cmZhY2UoSVdpbmVEM0RTdXJmYWNlICpwU3VyZmFjZSk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXcgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IEZ2ZlRvRGVjbAp7CiAgICBEV09SRCBmdmY7CiAgICBJV2luZUQzRFZlcnRleERlY2xhcmF0aW9uICpkZWNsOwp9OwoKc3RydWN0IElEaXJlY3REcmF3SW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Nyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzQpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXczKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Mik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0Q3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRDMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEMik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0QpOwoKICAgIC8qIFNlZSBjb21tZW50IGluIElEaXJlY3REcmF3OjpBZGRSZWYgKi8KICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjcsIHJlZjQsIHJlZjIsIHJlZjMsIHJlZjEsIG51bUlmYWNlczsKCiAgICAvKiBXaW5lRDNEIGxpbmthZ2UgKi8KICAgIElXaW5lRDNEICAgICAgICAgICAgICAgICp3aW5lRDNEOwogICAgSVdpbmVEM0REZXZpY2UgICAgICAgICAgKndpbmVEM0REZXZpY2U7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqRGVwdGhTdGVuY2lsQnVmZmVyOwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgZDNkX2luaXRpYWxpemVkOwoKICAgIC8qIE1pc2MgZGRyYXcgZmllbGRzICovCiAgICBVSU5UICAgICAgICAgICAgICAgICAgICB0b3RhbF92aWRtZW07CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBjdXJfc2NhbmxpbmU7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBmYWtlX3ZibGFuazsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkOwoKICAgIC8qIERpcmVjdERyYXcgdGhpbmdzLCB3aGljaCBhcmUgbm90IGhhbmRsZWQgYnkgV2luZUQzRCAqLwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbGV2ZWw7CgogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQ7CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBvcmlnX2JwcDsKCiAgICBERENBUFMgICAgICAgICAgICAgICAgICBjYXBzOwoKICAgIC8qIEQzRCB0aGluZ3MgKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpkM2RfdGFyZ2V0OwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgZDNkX3dpbmRvdzsKICAgIElEaXJlY3QzRERldmljZUltcGwgICAgICpkM2RkZXZpY2U7CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkM2R2ZXJzaW9uOwoKICAgIC8qIFZhcmlvdXMgSFdORHMgKi8KICAgIEhXTkQgICAgICAgICAgICAgICAgICAgIGZvY3Vzd2luZG93OwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgZGV2aWNld2luZG93OwoKICAgIC8qIFRoZSBzdXJmYWNlIHR5cGUgdG8gcmVxdWVzdCAqLwogICAgV0lORUQzRFNVUkZUWVBFICAgICAgICAgSW1wbFR5cGU7CgoKICAgIC8qIE91ciBwcml2YXRlIHdpbmRvdyBjbGFzcyAqLwogICAgY2hhciBjbGFzc25hbWVbMzJdOwogICAgV05EQ0xBU1NBIHduZF9jbGFzczsKCiAgICAvKiBIZWxwZXJzIGZvciBzdXJmYWNlIGNyZWF0aW9uICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0ZXhfcm9vdDsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGRlcHRoc3RlbmNpbDsKCiAgICAvKiBGb3IgdGhlIGRsbCB1bmxvYWQgY2xlYW51cCBjb2RlICovCiAgICBzdHJ1Y3QgbGlzdCBkZHJhd19saXN0X2VudHJ5OwogICAgLyogVGhlIHN1cmZhY2UgbGlzdCAtIGNhbid0IHJlbGF5IHRoaXMgdG8gV2luZUQzRAogICAgICogYmVjYXVzZSBvZiBJUGFyZW50CiAgICAgKi8KICAgIHN0cnVjdCBsaXN0IHN1cmZhY2VfbGlzdDsKICAgIExPTkcgc3VyZmFjZXM7CgogICAgLyogRlZGIG1hbmFnZW1lbnQgKi8KICAgIHN0cnVjdCBGdmZUb0RlY2wgICAgICAgKmRlY2xzOwogICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbnVtQ29udmVydGVkRGVjbHMsIGRlY2xBcnJheVNpemU7Cn07CgovKiBEZWNsYXJlIHRoZSBWVGFibGVzLiBUaGV5IGNhbiBiZSBmb3VuZCBkZHJhdy5jICovCmNvbnN0IElEaXJlY3REcmF3N1Z0YmwgSURpcmVjdERyYXc3X1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3NFZ0YmwgSURpcmVjdERyYXc0X1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3M1Z0YmwgSURpcmVjdERyYXczX1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3MlZ0YmwgSURpcmVjdERyYXcyX1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3VnRibCAgSURpcmVjdERyYXcxX1Z0Ymw7CgovKiBIZWxwZXIgc3RydWN0dXJlcyAqLwp0eXBlZGVmIHN0cnVjdCBFbnVtRGlzcGxheU1vZGVzQ0JTCnsKICAgIHZvaWQgKmNvbnRleHQ7CiAgICBMUERERU5VTU1PREVTQ0FMTEJBQ0syIGNhbGxiYWNrOwp9IEVudW1EaXNwbGF5TW9kZXNDQlM7Cgp0eXBlZGVmIHN0cnVjdCBFbnVtU3VyZmFjZXNDQlMKewogICAgdm9pZCAqY29udGV4dDsKICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgY2FsbGJhY2s7CiAgICBMUEREU1VSRkFDRURFU0MyIHBERFNEOwogICAgRFdPUkQgRmxhZ3M7Cn0gRW51bVN1cmZhY2VzQ0JTOwoKLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8Kdm9pZApERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTMiogcE91dCk7CnZvaWQKRERSQVdfQ29udmVydF9ERERFVklDRUlERU5USUZJRVJfMl9Ub18xKGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIqIHBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREREVWSUNFSURFTlRJRklFUiogcE91dCk7CnZvaWQKSURpcmVjdERyYXdJbXBsX0Rlc3Ryb3koSURpcmVjdERyYXdJbXBsICpUaGlzKTsKCkhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3SW1wbF9SZWNyZWF0ZVN1cmZhY2VzQ2FsbGJhY2soSURpcmVjdERyYXdTdXJmYWNlNyAqc3VyZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KTsKSVdpbmVEM0RWZXJ0ZXhEZWNsYXJhdGlvbiAqCklEaXJlY3REcmF3SW1wbF9GaW5kRGVjbChJRGlyZWN0RHJhd0ltcGwgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmdmYpOwoKdm9pZApyZW1vdmVfZGRyYXdfb2JqZWN0KElEaXJlY3REcmF3SW1wbCAqZGRyYXcpOwoKLyogVGhlIGRlZmF1bHQgc3VyZmFjZSB0eXBlICovCmV4dGVybiBXSU5FRDNEU1VSRlRZUEUgRGVmYXVsdFN1cmZhY2VUeXBlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2U3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3U3VyZmFjZTMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdHYW1tYUNvbnRyb2wpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZTIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZSk7CgogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgIHJlZjsKICAgIElVbmtub3duICAgICAgICAgICAgICAgICppZmFjZVRvUmVsZWFzZTsKCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOwoKICAgIC8qIENvbm5lY3Rpb25zIHRvIG90aGVyIE9iamVjdHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICpkZHJhdzsKICAgIElXaW5lRDNEU3VyZmFjZSAgICAgICAgICpXaW5lRDNEU3VyZmFjZTsKICAgIElXaW5lRDNEQmFzZVRleHR1cmUgICAgICp3aW5lRDNEVGV4dHVyZTsKCiAgICAvKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgYXR0YWNoaW5nIHN1cmZhY2VzIHRvIG90aGVyIHN1cmZhY2VzICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqbmV4dF9hdHRhY2hlZDsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpmaXJzdF9hdHRhY2hlZDsKCiAgICAvKiBDb21wbGV4IHN1cmZhY2VzIGFyZSBvcmdhbml6ZWQgaW4gYSB0cmVlLCBhbHRob3VnaCB0aGUgdHJlZSBpcyBkZWdlbmVyYXRlZCB0byBhIGxpc3QgaW4gbW9zdCBjYXNlcy4KICAgICAqIEluIG1pcG1hcCBhbmQgcHJpbWFyeSBzdXJmYWNlcyBlYWNoIGxldmVsIGhhcyBvbmx5IG9uZSBhdHRhY2htZW50LCB3aGljaCBpcyB0aGUgbmV4dCBzdXJmYWNlIGxldmVsLgogICAgICogT25seSB0aGUgY3ViZSB0ZXh0dXJlIHJvb3QgaGFzIDYgc3VyZmFjZXMgYXR0YWNoZWQsIHdoaWNoIHRoZW4gaGF2ZSBhIG5vcm1hbCBtaXBtYXAgY2hhaW4gYXR0YWNoZWQKICAgICAqIHRvIHRoZW0uIFNvIGhhcmRjb2RlIHRoZSBhcnJheSB0byA2LCBhIGR5bmFtaWMgYXJyYXkgb3IgYSBsaXN0IHdvdWxkIGJlIGFuIG92ZXJraWxsLgogICAgICovCiNkZWZpbmUgTUFYX0NPTVBMRVhfQVRUQUNIRUQgNgogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKmNvbXBsZXhfYXJyYXlbTUFYX0NPTVBMRVhfQVRUQUNIRURdOwogICAgLyogWW91IGNhbid0IHRyYXZlcnNlIHRoZSB0cmVlIHVwd2FyZHMuIE9ubHkgYSBmbGFnIGZvciBTdXJmYWNlOjpSZWxlYXNlIGJlY2F1c2UgaXRzIG5lZWRlZCB0aGVyZSwKICAgICAqIGJ1dCBubyBwb2ludGVyIHRvIHByZXZlbnQgdGVtcHRhdGlvbnMgdG8gdHJhdmVyc2UgaXQgaW4gdGhlIHdyb25nIGRpcmVjdGlvbi4KICAgICAqLwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaXNfY29tcGxleF9yb290OwoKICAgIC8qIFN1cmZhY2UgZGVzY3JpcHRpb24sIGZvciBHZXRBdHRhY2hlZFN1cmZhY2UgKi8KICAgIEREU1VSRkFDRURFU0MyICAgICAgICAgIHN1cmZhY2VfZGVzYzsKCiAgICAvKiBNaXNjIHRoaW5ncyAqLwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgdW5pcXVlbmVzc192YWx1ZTsKICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIG1pcG1hcF9sZXZlbDsKICAgIFdJTkVEM0RTVVJGVFlQRSAgICAgICAgIEltcGxUeXBlOwoKICAgIC8qIEZvciBEM0REZXZpY2UgY3JlYXRpb24gKi8KICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGlzUmVuZGVyVGFyZ2V0OwoKICAgIC8qIENsaXBwZXIgb2JqZWN0cyAqLwogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAgKmNsaXBwZXI7CgogICAgLyogRm9yIHRoZSBkZHJhdyBzdXJmYWNlIGxpc3QgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgICAgICAgIHN1cmZhY2VfbGlzdF9lbnRyeTsKCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBIYW5kbGU7Cn07CgovKiBWVGFibGUgZGVjbGFyYXRpb24uIEl0J3MgbG9jYXRlZCBpbiBzdXJmYWNlLmMgLyBzdXJmYWNlX3RodW5rcy5jICovCmNvbnN0IElEaXJlY3REcmF3U3VyZmFjZTdWdGJsIElEaXJlY3REcmF3U3VyZmFjZTdfVnRibDsKY29uc3QgSURpcmVjdERyYXdTdXJmYWNlM1Z0YmwgSURpcmVjdERyYXdTdXJmYWNlM19WdGJsOwpjb25zdCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbFZ0YmwgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfVnRibDsKY29uc3QgSURpcmVjdDNEVGV4dHVyZTJWdGJsIElEaXJlY3QzRFRleHR1cmUyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIElEaXJlY3QzRFRleHR1cmUxX1Z0Ymw7CgpIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0FkZEF0dGFjaGVkU3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpTdXJmKTsKCi8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgYSBnaXZlbiBzdXJmYWNlICovCiNkZWZpbmUgUEZHRVRfQlBQKHBmKSAocGYuZHdGbGFncyZERFBGX1BBTEVUVEVJTkRFWEVEOD8xOigocGYuZHdSR0JCaXRDb3VudCs3KS84KSkKI2RlZmluZSBHRVRfQlBQKGRlc2MpIFBGR0VUX0JQUChkZXNjLmRkcGZQaXhlbEZvcm1hdCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJUGFyZW50IEltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElQYXJlbnRJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSVBhcmVudCk7CiAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogSVBhcmVudEltcGwgZmllbGRzICovCiAgICBJVW5rbm93biAgICAgICpjaGlsZDsKCn07Cgpjb25zdCBJUGFyZW50VnRibCBJUGFyZW50X1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBlbnVtCnsKICAgIEREcmF3SGFuZGxlX1Vua25vd24gICAgICAgPSAwLAogICAgRERyYXdIYW5kbGVfVGV4dHVyZSAgICAgICA9IDEsCiAgICBERHJhd0hhbmRsZV9NYXRlcmlhbCAgICAgID0gMiwKICAgIEREcmF3SGFuZGxlX01hdHJpeCAgICAgICAgPSAzLAogICAgRERyYXdIYW5kbGVfU3RhdGVCbG9jayAgICA9IDQKfSBERHJhd0hhbmRsZVR5cGVzOwoKc3RydWN0IEhhbmRsZUVudHJ5CnsKICAgIHZvaWQgICAgKnB0cjsKICAgIEREcmF3SGFuZGxlVHlwZXMgICAgICB0eXBlOwp9OwoKc3RydWN0IElEaXJlY3QzRERldmljZUltcGwKewogICAgLyogSVVua25vd24gKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZTcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZSk7CiAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogT3RoZXIgb2JqZWN0IGNvbm5lY3Rpb25zICovCiAgICBJV2luZUQzRERldmljZSAgICAgICAgICAqd2luZUQzRERldmljZTsKICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICpkZHJhdzsKICAgIElXaW5lRDNESW5kZXhCdWZmZXIgICAgICppbmRleGJ1ZmZlcjsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICp0YXJnZXQ7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBPZmZTY3JlZW5UYXJnZXQ7CgogICAgLyogVmlld3BvcnQgbWFuYWdlbWVudCAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2aWV3cG9ydF9saXN0OwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpjdXJyZW50X3ZpZXdwb3J0OwogICAgRDNEVklFV1BPUlQ3IGFjdGl2ZV92aWV3cG9ydDsKCiAgICAvKiBMaWdodCBzdGF0ZSAqLwogICAgRFdPUkQgbWF0ZXJpYWw7CgogICAgLyogUmVuZGVyaW5nIGZ1bmN0aW9ucyB0byB3cmFwIEQzRCgxLTMpIHRvIEQzRDcgKi8KICAgIEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlX3R5cGU7CiAgICBEV09SRCB2ZXJ0ZXhfdHlwZTsKICAgIERXT1JEIHJlbmRlcl9mbGFnczsKICAgIERXT1JEIG5iX3ZlcnRpY2VzOwogICAgTFBCWVRFIHZlcnRleF9idWZmZXI7CiAgICBEV09SRCB2ZXJ0ZXhfc2l6ZTsKICAgIERXT1JEIGJ1ZmZlcl9zaXplOwoKICAgIC8qIEhhbmRsZSBtYW5hZ2VtZW50ICovCiAgICBzdHJ1Y3QgSGFuZGxlRW50cnkgICAgICAqSGFuZGxlczsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICBudW1IYW5kbGVzOwp9OwoKLyogVnRhYmxlcyBpbiB2YXJpb3VzIHZlcnNpb25zICovCmNvbnN0IElEaXJlY3QzRERldmljZTdWdGJsIElEaXJlY3QzRERldmljZTdfVnRibDsKY29uc3QgSURpcmVjdDNERGV2aWNlM1Z0YmwgSURpcmVjdDNERGV2aWNlM19WdGJsOwpjb25zdCBJRGlyZWN0M0REZXZpY2UyVnRibCBJRGlyZWN0M0REZXZpY2UyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRERldmljZVZ0YmwgIElEaXJlY3QzRERldmljZTFfVnRibDsKCi8qIFRoZSBJSUQgKi8KY29uc3QgR1VJRCBJSURfRDNEREVWSUNFX1dpbmVEM0Q7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCkhSRVNVTFQgSURpcmVjdDNESW1wbF9HZXRDYXBzKElXaW5lRDNEICpXaW5lRDNELCBEM0RERVZJQ0VERVNDICpEZXNjMTIzLCBEM0RERVZJQ0VERVNDNyAqRGVzYzcpOwpEV09SRCBJRGlyZWN0M0REZXZpY2VJbXBsX0NyZWF0ZUhhbmRsZShJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzKTsKV0lORUQzRFpCVUZGRVJUWVBFIElEaXJlY3QzRERldmljZUltcGxfVXBkYXRlRGVwdGhTdGVuY2lsKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpOwoKLyogU3RydWN0dXJlcyAqLwpzdHJ1Y3QgRW51bVRleHR1cmVGb3JtYXRzQ0JTCnsKICAgIExQRDNERU5VTVRFWFRVUkVGT1JNQVRTQ0FMTEJBQ0sgY2J2MjsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGNidjc7CiAgICB2b2lkICpDb250ZXh0Owp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBObyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgYXMgdGhpcyBpcyBvbmx5IGFub3RoZXIgaW50ZXJmYWNlIHRvIERpcmVjdERyYXcgKi8KCi8qIHRoZSBWdGFibGVzICovCmNvbnN0IElEaXJlY3QzRFZ0YmwgIElEaXJlY3QzRDFfVnRibDsKY29uc3QgSURpcmVjdDNEMlZ0YmwgSURpcmVjdDNEMl9WdGJsOwpjb25zdCBJRGlyZWN0M0QzVnRibCBJRGlyZWN0M0QzX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRDdWdGJsIElEaXJlY3QzRDdfVnRibDsKCi8qIFN0cnVjdHVyZSBmb3IgRW51bVpCdWZmZXJGb3JtYXRzICovCnN0cnVjdCBFbnVtWkJ1ZmZlckZvcm1hdHNEYXRhCnsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrOwogICAgdm9pZCAqQ29udGV4dDsKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0NsaXBwZXIpOwogICAgTE9ORyByZWY7CgogICAgSVdpbmVEM0RDbGlwcGVyICAgICAgICAgICAqd2luZUQzRENsaXBwZXI7CiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhd19vd25lcjsKfTsKCmNvbnN0IElEaXJlY3REcmF3Q2xpcHBlclZ0YmwgSURpcmVjdERyYXdDbGlwcGVyX1Z0Ymw7Cgp0eXBlZGVmIElXaW5lRDNEQ2xpcHBlciogKFdJTkFQSSAqZm5XaW5lRGlyZWN0M0RDcmVhdGVDbGlwcGVyKShJVW5rbm93biAqKTsKZm5XaW5lRGlyZWN0M0RDcmVhdGVDbGlwcGVyIHBXaW5lRGlyZWN0M0RDcmVhdGVDbGlwcGVyOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlSW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3UGFsZXR0ZSk7CiAgICBMT05HIHJlZjsKCiAgICAvKiBXaW5lRDNEIHVwbGluayAqLwogICAgSVdpbmVEM0RQYWxldHRlICAgICAgICAgICAqd2luZUQzRFBhbGV0dGU7CgogICAgLyogSURpcmVjdERyYXdQYWxldHRlIGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXdfb3duZXI7CiAgICBJVW5rbm93biAgICAgICAgICAgICAgICAgICppZmFjZVRvUmVsZWFzZTsKfTsKY29uc3QgSURpcmVjdERyYXdQYWxldHRlVnRibCBJRGlyZWN0RHJhd1BhbGV0dGVfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGlyZWN0RHJhdyBDbGFzc0ZhY3RvcnkgaW1wbGVtZW50YXRpb24gLSBpbmNvbXBsZXRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0CnsKICAgIElDT01fVkZJRUxEX01VTFRJKElDbGFzc0ZhY3RvcnkpOwoKICAgIExPTkcgcmVmOwogICAgSFJFU1VMVCAoKnBmbkNyZWF0ZUluc3RhbmNlKShJVW5rbm93biAqcFVua091dGVyLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwT2JqKTsKfSBJQ2xhc3NGYWN0b3J5SW1wbDsKCi8qIEhlbHBlciBzdHJ1Y3R1cmVzICovCnN0cnVjdCBvYmplY3RfY3JlYXRpb25faW5mbwp7CiAgICBjb25zdCBDTFNJRCAqY2xzaWQ7CiAgICBIUkVTVUxUICgqcGZuQ3JlYXRlSW5zdGFuY2UpKElVbmtub3duICpwVW5rT3V0ZXIsIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqcHBPYmopOwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RMaWdodCBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RMaWdodEltcGwKewogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETGlnaHQpOwogICAgTE9ORyByZWY7CgogICAgLyogSURpcmVjdDNETGlnaHQgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhdzsKCiAgICAvKiBJZiB0aGlzIGxpZ2h0IGlzIGFjdGl2ZSBmb3Igb25lIHZpZXdwb3J0LCBwdXQgdGhlIHZpZXdwb3J0IGhlcmUgKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAgICAgKmFjdGl2ZV92aWV3cG9ydDsKCiAgICBEM0RMSUdIVDIgbGlnaHQ7CiAgICBEM0RMSUdIVDcgbGlnaHQ3OwoKICAgIERXT1JEIGR3TGlnaHRJbmRleDsKCiAgICAvKiBDaGFpbmVkIGxpc3QgdXNlZCBmb3IgYWRkaW5nIC8gcmVtb3ZpbmcgZnJvbSB2aWV3cG9ydHMgKi8KICAgIElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgKm5leHQ7CgogICAgLyogQWN0aXZhdGlvbiBmdW5jdGlvbiAqLwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmFjdGl2YXRlKShJRGlyZWN0M0RMaWdodEltcGwqKTsKICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCpkZXNhY3RpdmF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7CiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqdXBkYXRlKShJRGlyZWN0M0RMaWdodEltcGwqKTsKfTsKCi8qIFZ0YWJsZSAqLwpjb25zdCBJRGlyZWN0M0RMaWdodFZ0YmwgSURpcmVjdDNETGlnaHRfVnRibDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8Kdm9pZCBsaWdodF91cGRhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKTsKdm9pZCBsaWdodF9hY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwp2b2lkIGxpZ2h0X2Rlc2FjdGl2YXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZSAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRE1hdGVyaWFsSW1wbAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbDMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsKTsKICAgIExPTkcgIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RNYXRlcmlhbDIgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICAgICAqZGRyYXc7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAgICAgICAqYWN0aXZlX2RldmljZTsKCiAgICBEM0RNQVRFUklBTCBtYXQ7CiAgICBEV09SRCBIYW5kbGU7CgogICAgdm9pZCAoKmFjdGl2YXRlKShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIHRoaXMpOwp9OwoKLyogVlRhYmxlcyBpbiB2YXJpb3VzIHZlcnNpb25zICovCmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsVnRibCBJRGlyZWN0M0RNYXRlcmlhbF9WdGJsOwpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDJWdGJsIElEaXJlY3QzRE1hdGVyaWFsMl9WdGJsOwpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDNWdGJsIElEaXJlY3QzRE1hdGVyaWFsM19WdGJsOwoKLyogSGVscGVyIGZ1bmN0aW9ucyAqLwp2b2lkIG1hdGVyaWFsX2FjdGl2YXRlKElEaXJlY3QzRE1hdGVyaWFsSW1wbCogVGhpcyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRFZpZXdwb3J0SW1wbAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RWaWV3cG9ydDMpOwogICAgTE9ORyByZWY7CgogICAgLyogSURpcmVjdDNEVmlld3BvcnQgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhdzsKCiAgICAvKiBJZiB0aGlzIHZpZXdwb3J0IGlzIGFjdGl2ZSBmb3Igb25lIGRldmljZSwgcHV0IHRoZSBkZXZpY2UgaGVyZSAqLwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgICAgICAqYWN0aXZlX2RldmljZTsKCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgIG51bV9saWdodHM7CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgIG1hcF9saWdodHM7CgogICAgaW50ICAgICAgICAgICAgICAgICAgICAgICB1c2VfdnAyOwoKICAgIHVuaW9uCiAgICB7CiAgICAgICAgRDNEVklFV1BPUlQgdnAxOwogICAgICAgIEQzRFZJRVdQT1JUMiB2cDI7CiAgICB9IHZpZXdwb3J0czsKCiAgICAvKiBBY3RpdmF0aW9uIGZ1bmN0aW9uICovCiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqYWN0aXZhdGUpKElEaXJlY3QzRFZpZXdwb3J0SW1wbCopOwoKICAgIC8qIEZpZWxkIHVzZWQgdG8gY2hhaW4gdmlld3BvcnRzIHRvZ2V0aGVyICovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgICAgICpuZXh0OwoKICAgIC8qIExpZ2h0cyBsaXN0ICovCiAgICBJRGlyZWN0M0RMaWdodEltcGwgICAgICAgICpsaWdodHM7CgogICAgLyogQmFja2dyb3VuZCBtYXRlcmlhbCAqLwogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsICAgICAqYmFja2dyb3VuZDsKfTsKCi8qIFZ0YWJsZSAqLwpjb25zdCBJRGlyZWN0M0RWaWV3cG9ydDNWdGJsIElEaXJlY3QzRFZpZXdwb3J0M19WdGJsOwoKLyogSGVscGVyIGZ1bmN0aW9ucyAqLwp2b2lkIHZpZXdwb3J0X2FjdGl2YXRlKElEaXJlY3QzRFZpZXdwb3J0SW1wbCogVGhpcyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwKewogICAgLyogSVVua25vd24gKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIpOwogICAgTE9ORyAgICAgICAgICAgICAgICAgcmVmOwoKICAgIC8qIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAqZGRyYXc7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAqZDNkZGV2OwoKICAgIEQzREVYRUNVVEVCVUZGRVJERVNDIGRlc2M7CiAgICBEM0RFWEVDVVRFREFUQSAgICAgICBkYXRhOwoKICAgIC8qIFRoaXMgYnVmZmVyIHdpbGwgc3RvcmUgdGhlIHRyYW5zZm9ybWVkIHZlcnRpY2VzICovCiAgICB2b2lkICAgICAgICAgICAgICAgICAqdmVydGV4X2RhdGE7CiAgICBXT1JEICAgICAgICAgICAgICAgICAqaW5kaWNlczsKICAgIGludCAgICAgICAgICAgICAgICAgIG5iX2luZGljZXM7CgogICAgLyogVGhpcyBmbGFncyBpcyBzZXQgdG8gVFJVRSBpZiB3ZSBhbGxvY2F0ZWQgb3Vyc2VsdmVzIHRoZQogICAgICogZGF0YSBidWZmZXIKICAgICAqLwogICAgQk9PTCAgICAgICAgICAgICAgICAgbmVlZF9mcmVlOwp9OwoKLyogVGhlIFZUYWJsZSAqLwpjb25zdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyVnRibCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX1Z0Ymw7CgovKiBUaGUgZXhlY3V0ZSBmdW5jdGlvbiAqLwp2b2lkCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0V4ZWN1dGUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqVmlld3BvcnRJbXBsKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbAp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmVydGV4QnVmZmVyNyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIpOwogICAgTE9ORyAgICAgICAgICAgICAgICAgcmVmOwoKICAgIC8qKiogV2luZUQzRCBhbmQgZGRyYXcgbGlua3MgKioqLwogICAgSVdpbmVEM0RWZXJ0ZXhCdWZmZXIgKndpbmVEM0RWZXJ0ZXhCdWZmZXI7CiAgICBJV2luZUQzRFZlcnRleERlY2xhcmF0aW9uICp3aW5lRDNEVmVydGV4RGVjbGFyYXRpb247CiAgICBJRGlyZWN0RHJhd0ltcGwgKmRkcmF3OwoKICAgIC8qKiogU3RvcmFnZSBmb3IgRDNENyBzcGVjaWZpYyB0aGluZ3MgKioqLwogICAgRFdPUkQgICAgICAgICAgICAgICAgQ2FwczsKfTsKCi8qIFRoZSBWdGFibGVzICovCmNvbnN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdWdGJsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVnRibDsKY29uc3QgSURpcmVjdDNEVmVydGV4QnVmZmVyVnRibCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIxX1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSGVscGVyIGZ1bmN0aW9ucyBmcm9tIHV0aWxzLmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2RlZmluZSBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlKSBcCiAgICAoKChkM2R2dFZlcnRleFR5cGUpICYgRDNERlZGX1RFWENPVU5UX01BU0spID4+IEQzREZWRl9URVhDT1VOVF9TSElGVCkKCiNkZWZpbmUgR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCB0ZXhfbnVtKSBcCiAgICAoKCgoKGQzZHZ0VmVydGV4VHlwZSkgPj4gKDE2ICsgKDIgKiAodGV4X251bSkpKSkgKyAxKSAmIDB4MDMpICsgMSkKCnZvaWQgUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCwgV0lORUQzREZPUk1BVCBXaW5lRDNERm9ybWF0KTsKV0lORUQzREZPUk1BVCBQaXhlbEZvcm1hdF9ERDJXaW5lRDNEKGNvbnN0IEREUElYRUxGT1JNQVQgKkREUGl4ZWxGb3JtYXQpOwp2b2lkIEREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKGNvbnN0IEREU1VSRkFDRURFU0MyICpscGRkc2QpOwp2b2lkIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQoY29uc3QgRERQSVhFTEZPUk1BVCAqUGl4ZWxGb3JtYXQpOwp2b2lkIGR1bXBfRDNETUFUUklYKGNvbnN0IEQzRE1BVFJJWCAqbWF0KTsKdm9pZCBERFJBV19kdW1wX0REQ0FQUyhjb25zdCBERENBUFMgKmxwY2Fwcyk7CkRXT1JEIGdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShEV09SRCBkM2R2dFZlcnRleFR5cGUpOwp2b2lkIEREUkFXX2R1bXBfRERTQ0FQUzIoY29uc3QgRERTQ0FQUzIgKmluKTsKdm9pZCBERFJBV19kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoRFdPUkQgY29vcGxldmVsKTsKCi8qIFRoaXMgb25seSBuZWVkcyB0byBiZSBoZXJlIGFzIGxvbmcgdGhlIHByb2Nlc3N2ZXJ0aWNlcyBmdW5jdGlvbmFsaXR5IG9mCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgaXNuJ3QgaW4gV2luZUQzRCAqLwp2b2lkIG11bHRpcGx5X21hdHJpeChMUEQzRE1BVFJJWCBkZXN0LCBjb25zdCBEM0RNQVRSSVggKnNyYzEsIGNvbnN0IEQzRE1BVFJJWCAqc3JjMik7CgovKiBVc2VkIGZvciBnZW5lcmljIGR1bXBpbmcgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKfSBmbGFnX2luZm87CgojZGVmaW5lIEZFKHgpIHsgeCwgI3ggfQoKdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKICAgIHZvaWQgKCpmdW5jKShjb25zdCB2b2lkICopOwogICAgcHRyZGlmZl90IG9mZnNldDsKfSBtZW1iZXJfaW5mbzsKCi8qIFN0cnVjdHVyZSBjb3B5ICovCiNkZWZpbmUgTUUoeCxmLGUpIHsgeCwgI3gsICh2b2lkICgqKShjb25zdCB2b2lkICopKShmKSwgb2Zmc2V0b2YoU1RSVUNULCBlKSB9CgojZGVmaW5lIEREX1NUUlVDVF9DT1BZX0JZU0laRSh0byxmcm9tKSAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBEV09SRCBfX3NpemUgPSAodG8pLT5kd1NpemU7ICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgRFdPUkQgX19jb3B5c2l6ZSA9IF9fc2l6ZTsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIERXT1JEIF9fcmVzZXRzaXplID0gX19zaXplOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBhc3NlcnQodG8gIT0gZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKF9fcmVzZXRzaXplID4gc2l6ZW9mKCp0bykpICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBfX3Jlc2V0c2l6ZSA9IHNpemVvZigqdG8pOyAgICAgICAgICBcCiAgICAgICAgICAgICAgICBtZW1zZXQodG8sMCxfX3Jlc2V0c2l6ZSk7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKChmcm9tKS0+ZHdTaXplIDwgX19zaXplKSAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBfX2NvcHlzaXplID0gKGZyb20pLT5kd1NpemU7ICAgICAgICBcCiAgICAgICAgICAgICAgICBtZW1jcHkodG8sZnJvbSxfX2NvcHlzaXplKTsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgKHRvKS0+ZHdTaXplID0gX19zaXplOy8qcmVzdG9yZSBzaXplKi8gIFwKICAgICAgICB9IHdoaWxlICgwKQoKCiNlbmRpZgoKSFJFU1VMVCBocl9kZHJhd19mcm9tX3dpbmVkM2QoSFJFU1VMVCBocik7Cg==