LyoKICogQ29weXJpZ2h0IKkgMjAwNCwgQXBwbGUgQ29tcHV0ZXIsIEluYy4gYW5kIFRoZSBNb3ppbGxhIEZvdW5kYXRpb24uIAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKiAKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBvciBUaGUgTW96aWxsYQogKiBGb3VuZGF0aW9uICgiTW96aWxsYSIpIG5vciB0aGUgbmFtZXMgb2YgdGhlaXIgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCiAqIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUsIE1PWklMTEEgQU5EIFRIRUlSIENPTlRSSUJVVE9SUyAiQVMKICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECiAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQogKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFLCBNT1pJTExBIE9SCiAqIFRIRUlSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgogKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwogKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICoKICogUmV2aXNpb24gMSAoTWFyY2ggNCwgMjAwNCk6CiAqIEluaXRpYWwgcHJvcG9zYWwuCiAqCiAqIFJldmlzaW9uIDIgKE1hcmNoIDEwLCAyMDA0KToKICogQWxsIGNhbGxzIGludG8gc2NyaXB0IHdlcmUgbWFkZSBhc3luY2hyb25vdXMuICBSZXN1bHRzIGFyZQogKiBwcm92aWRlZCB2aWEgdGhlIE5QU2NyaXB0UmVzdWx0RnVuY3Rpb25QdHIgY2FsbGJhY2suCiAqCiAqIFJldmlzaW9uIDMgKE1hcmNoIDEwLCAyMDA0KToKICogQ29ycmVjdGVkIGNvbW1lbnRzIHRvIG5vdCByZWZlciB0byBjbGFzcyByZXRhaW4vcmVsZWFzZSBGdW5jdGlvblB0cnMuCiAqCiAqIFJldmlzaW9uIDQgKE1hcmNoIDExLCAyMDA0KToKICogQWRkZWQgYWRkaXRpb25hbCBjb252ZW5pZW5jZSBOUE5fU2V0RXhjZXB0aW9uV2l0aFVURjgoKS4KICogQ2hhbmdlZCBOUEhhc1Byb3BlcnR5RnVuY3Rpb25QdHIgYW5kIE5QSGFzTWV0aG9kRnVuY3Rpb25QdHIgdG8gdGFrZSBOUENsYXNzCiAqIHBvaW50ZXJzIGluc3RlYWQgb2YgTlBPYmplY3QgcG9pbnRlcnMuCiAqIEFkZGVkIE5QSXNWYWxpZElkZW50aWZpZXIoKS4KICoKICogUmV2aXNpb24gNSAoTWFyY2ggMTcsIDIwMDQpOgogKiBBZGRlZCBjb250ZXh0IHBhcmFtZXRlciB0byByZXN1bHQgY2FsbGJhY2tzIGZyb20gU2NyaXB0T2JqZWN0IGZ1bmN0aW9ucy4KICoKICogUmV2aXNpb24gNiAoTWFyY2ggMjksIDIwMDQpOgogKiBSZW5hbWVkIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB1c2VyIGFnZW50IHRvIE5QTl8qLiAgUmVtb3ZlZCBfIGZyb20KICogdHlwZSBuYW1lcy4KICogUmVuYW1lZCAiSmF2YVNjcmlwdCIgdHlwZXMgdG8gIlNjcmlwdCIuCiAqCiAqIFJldmlzaW9uIDcgKEFwcmlsIDIxLCAyMDA0KToKICogTlBJZGVudGlmaWVyIGJlY29tZXMgYSB2b2lkKiwgd2FzIGludDMyX3QKICogUmVtb3ZlIE5QX0lzVmFsaWRJZGVudGlmaWVyLCByZW5hbWVkIE5QX0lkZW50aWZpZXJGcm9tVVRGOCB0byBOUF9HZXRJZGVudGlmaWVyCiAqIEFkZGVkIE5QVmFyaWFudCBhbmQgbW9kaWZpZWQgZnVuY3Rpb25zIHRvIHVzZSB0aGlzIG5ldyB0eXBlLgogKgogKiBSZXZpc2lvbiA4IChKdWx5IDksIDIwMDQpOgogKiBVcGRhdGVkIHRvIGpvaW50IEFwcGxlLU1vemlsbGEgbGljZW5zZS4KICoKICogUmV2aXNpb24gOSAoQXVndXN0IDEyLCAyMDA0KToKICogQ2hhbmdlZCBOUFZhcmlhbnRUeXBlIGVudW0gdmFsdWVzIHRvIGZvcm0gUFZhcmlhbnRUeXBlX1hYWAogKiBBZGRlZCBOUFAgYXJndW1lbnRzIHRvIE5QT2JqZWN0IGZ1bmN0aW9ucy4KICogUmVwbGFjZWQgTlBWYXJpYW50IGZ1bmN0aW9ucyB3aXRoIG1hY3Jvcy4KICovCiNpZm5kZWYgX05QX1JVTlRJTUVfSF8KI2RlZmluZSBfTlBfUlVOVElNRV9IXwoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCiNpbmNsdWRlICJucGFwaS5oIgoKLyoKICAgIFRoaXMgQVBJIGlzIHVzZWQgdG8gZmFjaWxpdGF0ZSBiaW5kaW5nIGNvZGUgd3JpdHRlbiBpbiBDIHRvIHNjcmlwdAogICAgb2JqZWN0cy4gIFRoZSBBUEkgaW4gdGhpcyBoZWFkZXIgZG9lcyBub3QgYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBhCiAgICB1c2VyIGFnZW50LiAgVGhhdCBpcywgaXQgY2FuIGJlIHVzZWQgdG8gYmluZCBDIGNvZGUgdG8gc2NyaXB0aW5nCiAgICBlbnZpcm9ubWVudHMgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiBhIHVzZXIgYWdlbnQuCiAgICAKICAgIEhvd2V2ZXIsIHRoZSBub3JtYWwgdXNlIG9mIHRoZSB0aGlzIEFQSSBpcyBpbiB0aGUgY29udGV4dCBvZiBhCiAgICBzY3JpcHRpbmcgZW52aXJvbm1lbnQgcnVubmluZyBpbiBhIGJyb3dzZXIgb3Igb3RoZXIgdXNlciBhZ2VudC4KICAgIEluIHBhcnRpY3VsYXIgaXQgaXMgdXNlZCB0byBzdXBwb3J0IHRoZSBleHRlbmRlZCBOZXRzY2FwZQogICAgc2NyaXB0LWFiaWxpdHkgQVBJIGZvciBwbHVnaW5zIChOUC1TQVApLiAgTlAtU0FQIGlzIGFuIGV4dGVuc2lvbgogICAgb2YgdGhlIE5ldHNjYXBlIHBsdWdpbiBBUEkuICBBcyBzdWNoIHdlIGhhdmUgYWRvcHRlZCB0aGUgdXNlIG9mCiAgICB0aGUgIk5QIiBwcmVmaXggZm9yIHRoaXMgQVBJLgoKICAgIFRoZSBmb2xsb3dpbmcgTlB7TnxQfVZhcmlhYmxlcyB3ZXJlIGFkZGVkIHRvIHRoZSBOZXRzY2FwZSBwbHVnaW4KICAgIEFQSSAoaW4gbnBhcGkuaCk6CgogICAgTlBOVldpbmRvd05QT2JqZWN0CiAgICBOUE5WUGx1Z2luRWxlbWVudE5QT2JqZWN0CiAgICBOUFBWcGx1Z2luU2NyaXB0YWJsZU5QT2JqZWN0CgogICAgVGhlc2UgdmFyaWFibGVzIGFyZSBleHBvc2VkIHRocm91Z2ggTlBOX0dldFZhbHVlKCkgYW5kCiAgICBOUFBfR2V0VmFsdWUoKSAocmVzcGVjdGl2ZWx5KSBhbmQgYXJlIHVzZWQgdG8gZXN0YWJsaXNoIHRoZQogICAgaW5pdGlhbCBiaW5kaW5nIGJldHdlZW4gdGhlIHVzZXIgYWdlbnQgYW5kIG5hdGl2ZSBjb2RlLiAgVGhlIERPTQogICAgb2JqZWN0cyBpbiB0aGUgdXNlciBhZ2VudCBjYW4gYmUgZXhhbWluZWQgYW5kIG1hbmlwdWxhdGVkIHVzaW5nCiAgICB0aGUgTlBOXyBmdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIE5QT2JqZWN0cyBkZXNjcmliZWQgaW4gdGhpcwogICAgaGVhZGVyLgoKICAgIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdGhlIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzY3JpcHRpbmcKICAgIGxhbmd1YWdlIHVzZWQgYnkgdGhlIHNjcmlwdGluZyBlbnZpcm9ubWVudCBoYXZlIGJlZW4gbWluaW1pemVkLgoqLwoKCi8qCiAgICBPYmplY3RzIChub24tcHJpbWl0aXZlIGRhdGEpIHBhc3NlZCBiZXR3ZWVuICdDJyBhbmQgc2NyaXB0IGlzCiAgICBhbHdheXMgd3JhcHBlZCBpbiBhbiBOUE9iamVjdC4gIFRoZSAnaW50ZXJmYWNlJyBvZiBhbiBOUE9iamVjdCBpcwogICAgZGVzY3JpYmVkIGJ5IGFuIE5QQ2xhc3MuCiovCnR5cGVkZWYgc3RydWN0IE5QT2JqZWN0IE5QT2JqZWN0Owp0eXBlZGVmIHN0cnVjdCBOUENsYXNzIE5QQ2xhc3M7Cgp0eXBlZGVmIGNoYXIgTlBVVEY4Owp0eXBlZGVmIHN0cnVjdCBfTlBTdHJpbmcgewogICAgY29uc3QgTlBVVEY4ICpVVEY4Q2hhcmFjdGVyczsKICAgIHVpbnQzMl90IFVURjhMZW5ndGg7Cn0gTlBTdHJpbmc7CiAgCnR5cGVkZWYgZW51bSB7CiAgICBOUFZhcmlhbnRUeXBlX1ZvaWQsCiAgICBOUFZhcmlhbnRUeXBlX051bGwsCiAgICBOUFZhcmlhbnRUeXBlX0Jvb2wsCiAgICBOUFZhcmlhbnRUeXBlX0ludDMyLAogICAgTlBWYXJpYW50VHlwZV9Eb3VibGUsCiAgICBOUFZhcmlhbnRUeXBlX1N0cmluZywKICAgIE5QVmFyaWFudFR5cGVfT2JqZWN0Cn0gTlBWYXJpYW50VHlwZTsKCnR5cGVkZWYgc3RydWN0IF9OUFZhcmlhbnQgewogICAgTlBWYXJpYW50VHlwZSB0eXBlOwogICAgdW5pb24gewogICAgICAgIGJvb2wgYm9vbFZhbHVlOwogICAgICAgIGludDMyX3QgaW50VmFsdWU7CiAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOwogICAgICAgIE5QU3RyaW5nIHN0cmluZ1ZhbHVlOwogICAgICAgIE5QT2JqZWN0ICpvYmplY3RWYWx1ZTsKICAgIH0gdmFsdWU7Cn0gTlBWYXJpYW50OwoKLyoKICAgIE5QTl9SZWxlYXNlVmFyaWFudFZhbHVlIGlzIGNhbGxlZCBvbiBhbGwgJ291dCcgcGFyYW1ldGVycyByZWZlcmVuY2VzLgogICAgU3BlY2lmaWNhbGx5IGl0IGlzIGNhbGxlZCBvbiB2YXJpYW50cyB0aGF0IGFyZSByZXN1bHRhbnQgb3V0IHBhcmFtZXRlcnMKICAgIGluIE5QR2V0UHJvcGVydHlGdW5jdGlvblB0ciBhbmQgTlBJbnZva2VGdW5jdGlvblB0ci4gIFJlc3VsdGFudCB2YXJpYW50cwogICAgZnJvbSB0aGVzZSB0d28gZnVuY3Rpb25zIHNob3VsZCBiZSBpbml0aWFsaXplZCB1c2luZyB0aGUKICAgIE5QTl9Jbml0aWFsaXplVmFyaWFudFhYWCgpIGZ1bmN0aW9ucy4KICAgIAogICAgQWZ0ZXIgY2FsbGluZyBOUFJlbGVhc2VWYXJpYW50VmFsdWUsIHRoZSB0eXBlIG9mIHRoZSB2YXJpYW50IHdpbGwKICAgIGJlIHNldCB0byBOUFZhcmlhbnRVbmRlZmluZWRUeXBlLgoqLwp2b2lkIE5QTl9SZWxlYXNlVmFyaWFudFZhbHVlIChOUFZhcmlhbnQgKnZhcmlhbnQpOwoKI2RlZmluZSBOUFZBUklBTlRfSVNfVk9JRChfdikgICAgKChfdikudHlwZSA9PSBOUFZhcmlhbnRUeXBlX1ZvaWQpCiNkZWZpbmUgTlBWQVJJQU5UX0lTX05VTEwoX3YpICAgICgoX3YpLnR5cGUgPT0gTlBWYXJpYW50VHlwZV9OdWxsKQojZGVmaW5lIE5QVkFSSUFOVF9JU19CT09MRUFOKF92KSAoKF92KS50eXBlID09IE5QVmFyaWFudFR5cGVfQm9vbCkKI2RlZmluZSBOUFZBUklBTlRfSVNfSU5UMzIoX3YpICAgKChfdikudHlwZSA9PSBOUFZhcmlhbnRUeXBlX0ludDMyKQojZGVmaW5lIE5QVkFSSUFOVF9JU19ET1VCTEUoX3YpICAoKF92KS50eXBlID09IE5QVmFyaWFudFR5cGVfRG91YmxlKQojZGVmaW5lIE5QVkFSSUFOVF9JU19TVFJJTkcoX3YpICAoKF92KS50eXBlID09IE5QVmFyaWFudFR5cGVfU3RyaW5nKQojZGVmaW5lIE5QVkFSSUFOVF9JU19PQkpFQ1QoX3YpICAoKF92KS50eXBlID09IE5QVmFyaWFudFR5cGVfT2JqZWN0KQoKI2RlZmluZSBOUFZBUklBTlRfVE9fQk9PTEVBTihfdikgKChfdikudmFsdWUuYm9vbFZhbHVlKQojZGVmaW5lIE5QVkFSSUFOVF9UT19JTlQzMihfdikgICAoKF92KS52YWx1ZS5pbnRWYWx1ZSkKI2RlZmluZSBOUFZBUklBTlRfVE9fRE9VQkxFKF92KSAgKChfdikudmFsdWUuZG91YmxlVmFsdWUpCiNkZWZpbmUgTlBWQVJJQU5UX1RPX1NUUklORyhfdikgICgoX3YpLnZhbHVlLnN0cmluZ1ZhbHVlKQojZGVmaW5lIE5QVkFSSUFOVF9UT19PQkpFQ1QoX3YpICAoKF92KS52YWx1ZS5vYmplY3RWYWx1ZSkKCiNkZWZpbmUgTlBfQkVHSU5fTUFDUk8gIGRvIHsKI2RlZmluZSBOUF9FTkRfTUFDUk8gICAgfSB3aGlsZSAoMCkKCiNkZWZpbmUgVk9JRF9UT19OUFZBUklBTlQoX3YpICAgICAgICAgICAgICAgIE5QX0JFR0lOX01BQ1JPIChfdikudHlwZSA9IE5QVmFyaWFudFR5cGVfVm9pZDsgKF92KS52YWx1ZS5vYmplY3RWYWx1ZSA9IE5VTEw7IE5QX0VORF9NQUNSTwojZGVmaW5lIE5VTExfVE9fTlBWQVJJQU5UKF92KSAgICAgICAgICAgICAgICBOUF9CRUdJTl9NQUNSTyAoX3YpLnR5cGUgPSBOUFZhcmlhbnRUeXBlX051bGw7IChfdikudmFsdWUub2JqZWN0VmFsdWUgPSBOVUxMOyBOUF9FTkRfTUFDUk8KI2RlZmluZSBCT09MRUFOX1RPX05QVkFSSUFOVChfdmFsLCBfdikgICAgICAgTlBfQkVHSU5fTUFDUk8gKF92KS50eXBlID0gTlBWYXJpYW50VHlwZV9Cb29sOyAoX3YpLnZhbHVlLmJvb2xWYWx1ZSA9ICEhKF92YWwpOyBOUF9FTkRfTUFDUk8KI2RlZmluZSBJTlQzMl9UT19OUFZBUklBTlQoX3ZhbCwgX3YpICAgICAgICAgTlBfQkVHSU5fTUFDUk8gKF92KS50eXBlID0gTlBWYXJpYW50VHlwZV9JbnQzMjsgKF92KS52YWx1ZS5pbnRWYWx1ZSA9IF92YWw7IE5QX0VORF9NQUNSTwojZGVmaW5lIERPVUJMRV9UT19OUFZBUklBTlQoX3ZhbCwgX3YpICAgICAgICBOUF9CRUdJTl9NQUNSTyAoX3YpLnR5cGUgPSBOUFZhcmlhbnRUeXBlX0RvdWJsZTsgKF92KS52YWx1ZS5kb3VibGVWYWx1ZSA9IF92YWw7IE5QX0VORF9NQUNSTwojZGVmaW5lIFNUUklOR1pfVE9fTlBWQVJJQU5UKF92YWwsIF92KSAgICAgICBOUF9CRUdJTl9NQUNSTyAoX3YpLnR5cGUgPSBOUFZhcmlhbnRUeXBlX1N0cmluZzsgTlBTdHJpbmcgc3RyID0geyBfdmFsLCBzdHJsZW4oX3ZhbCkgfTsgKF92KS52YWx1ZS5zdHJpbmdWYWx1ZSA9IHN0cjsgTlBfRU5EX01BQ1JPCiNkZWZpbmUgU1RSSU5HTl9UT19OUFZBUklBTlQoX3ZhbCwgX2xlbiwgX3YpIE5QX0JFR0lOX01BQ1JPIChfdikudHlwZSA9IE5QVmFyaWFudFR5cGVfU3RyaW5nOyBOUFN0cmluZyBzdHIgPSB7IF92YWwsIF9sZW4gfTsgKF92KS52YWx1ZS5zdHJpbmdWYWx1ZSA9IHN0cjsgTlBfRU5EX01BQ1JPCiNkZWZpbmUgT0JKRUNUX1RPX05QVkFSSUFOVChfdmFsLCBfdikgICAgICAgIE5QX0JFR0lOX01BQ1JPIChfdikudHlwZSA9IE5QVmFyaWFudFR5cGVfT2JqZWN0OyAoX3YpLnZhbHVlLm9iamVjdFZhbHVlID0gX3ZhbDsgTlBfRU5EX01BQ1JPCgovKgogICAgICAgIFR5cGUgbWFwcGluZ3MgKEphdmFTY3JpcHQgdHlwZXMgaGF2ZSBiZWVuIHVzZWQgZm9yIGlsbHVzdHJhdGlvbgogICAgcHVycG9zZXMpOgoKICAgICAgICBKYXZhU2NyaXB0ICAgICAgIHRvICAgICAgICAgICAgIEMgKE5QVmFyaWFudCB3aXRoIHR5cGU6KQogICAgICAgIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgTlBWYXJpYW50VHlwZV9Wb2lkCiAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUFZhcmlhbnRUeXBlX051bGwKICAgICAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgIE5QVmFyaWFudFR5cGVfQm9vbAogICAgICAgIE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgTlBWYXJpYW50VHlwZV9Eb3VibGUgb3IgTlBWYXJpYW50VHlwZV9JbnQzMgogICAgICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgTlBWYXJpYW50VHlwZV9TdHJpbmcKICAgICAgICBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgIE5QVmFyaWFudFR5cGVfT2JqZWN0CgogICAgICAgIEMgKE5QVmFyaWFudCB3aXRoIHR5cGU6KSAgIHRvICAgSmF2YVNjcmlwdAogICAgICAgIE5QVmFyaWFudFR5cGVfVm9pZCAgICAgICAgICAgICAgdW5kZWZpbmVkCiAgICAgICAgTlBWYXJpYW50VHlwZV9OdWxsICAgICAgICAgICAgICBudWxsCiAgICAgICAgTlBWYXJpYW50VHlwZV9Cb29sICAgICAgICAgICAgICBCb29sZWFuIAogICAgICAgIE5QVmFyaWFudFR5cGVfSW50MzIgICAgICAgICAgICAgTnVtYmVyCiAgICAgICAgTlBWYXJpYW50VHlwZV9Eb3VibGUgICAgICAgICAgICBOdW1iZXIKICAgICAgICBOUFZhcmlhbnRUeXBlX1N0cmluZyAgICAgICAgICAgIFN0cmluZwogICAgICAgIE5QVmFyaWFudFR5cGVfT2JqZWN0ICAgICAgICAgICAgT2JqZWN0CiovCgp0eXBlZGVmIHZvaWQgKk5QSWRlbnRpZmllcjsKCi8qCiAgICBOUE9iamVjdHMgaGF2ZSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzLiAgTWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcmUKICAgIGlkZW50aWZpZWQgd2l0aCBOUElkZW50aWZpZXJzLiAgVGhlc2UgaWRlbnRpZmllcnMgbWF5IGJlIHJlZmxlY3RlZAogICAgaW4gc2NyaXB0LiAgTlBJZGVudGlmaWVycyBjYW4gYmUgZWl0aGVyIHN0cmluZ3Mgb3IgaW50ZWdlcnMsIElPVywKICAgIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgY2FuIGJlIGlkZW50aWZpZWQgYnkgZWl0aGVyIHN0cmluZ3Mgb3IKICAgIGludGVnZXJzIChpLmUuIGZvb1siYmFyIl0gdnMgZm9vWzFdKS4gTlBJZGVudGlmaWVycyBjYW4gYmUKICAgIGNvbXBhcmVkIHVzaW5nID09LiAgSW4gY2FzZSBvZiBhbnkgZXJyb3JzLCB0aGUgcmVxdWVzdGVkCiAgICBOUElkZW50aWZpZXIocykgd2lsbCBiZSBOVUxMLgoqLwpOUElkZW50aWZpZXIgTlBOX0dldFN0cmluZ0lkZW50aWZpZXIoY29uc3QgTlBVVEY4ICpuYW1lKTsKdm9pZCBOUE5fR2V0U3RyaW5nSWRlbnRpZmllcnMoY29uc3QgTlBVVEY4ICoqbmFtZXMsIGludDMyX3QgbmFtZUNvdW50LCBOUElkZW50aWZpZXIgKmlkZW50aWZpZXJzKTsKTlBJZGVudGlmaWVyIE5QTl9HZXRJbnRJZGVudGlmaWVyKGludDMyX3QgaW50aWQpOwpib29sIE5QTl9JZGVudGlmaWVySXNTdHJpbmcoTlBJZGVudGlmaWVyIGlkZW50aWZpZXIpOwoKLyoKICAgIFRoZSBOUFVURjggcmV0dXJuZWQgZnJvbSBOUE5fVVRGOEZyb21JZGVudGlmaWVyIFNIT1VMRCBiZSBmcmVlZC4KKi8KTlBVVEY4ICpOUE5fVVRGOEZyb21JZGVudGlmaWVyKE5QSWRlbnRpZmllciBpZGVudGlmaWVyKTsKCi8qCiAgICBHZXQgdGhlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgaWRlbnRpZmllci4gSWYgaWRlbnRpZmllciBpcyBub3QgYW4KICAgIGludGVnZXIgaWRlbnRpZmllciwgdGhlIGJlaGF2aW91ciBpcyB1bmRlZmluZWQuCiovCmludDMyX3QgTlBOX0ludEZyb21JZGVudGlmaWVyKE5QSWRlbnRpZmllciBpZGVudGlmaWVyKTsKCi8qCiAgICBOUE9iamVjdCBiZWhhdmlvciBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgZm9sbG93aW5nIHNldCBvZgogICAgY2FsbGJhY2sgZnVuY3Rpb25zLgoKICAgIFRoZSBOUFZhcmlhbnQgKnJlc3VsdCBhcmd1bWVudCBvZiB0aGVzZSBmdW5jdGlvbnMgKHdoZXJlCiAgICBhcHBsaWNhYmxlKSBzaG91bGQgYmUgcmVsZWFzZWQgdXNpbmcgTlBOX1JlbGVhc2VWYXJpYW50VmFsdWUoKS4KKi8KdHlwZWRlZiBOUE9iamVjdCAqKCpOUEFsbG9jYXRlRnVuY3Rpb25QdHIpKE5QUCBucHAsIE5QQ2xhc3MgKmFDbGFzcyk7CnR5cGVkZWYgdm9pZCAoKk5QRGVhbGxvY2F0ZUZ1bmN0aW9uUHRyKShOUE9iamVjdCAqb2JqKTsKdHlwZWRlZiB2b2lkICgqTlBJbnZhbGlkYXRlRnVuY3Rpb25QdHIpKE5QT2JqZWN0ICpvYmopOwp0eXBlZGVmIGJvb2wgKCpOUEhhc01ldGhvZEZ1bmN0aW9uUHRyKShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7CnR5cGVkZWYgYm9vbCAoKk5QSW52b2tlRnVuY3Rpb25QdHIpKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCk7CnR5cGVkZWYgYm9vbCAoKk5QSW52b2tlRGVmYXVsdEZ1bmN0aW9uUHRyKShOUE9iamVjdCAqbnBvYmosIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KTsKdHlwZWRlZiBib29sICgqTlBIYXNQcm9wZXJ0eUZ1bmN0aW9uUHRyKShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7CnR5cGVkZWYgYm9vbCAoKk5QR2V0UHJvcGVydHlGdW5jdGlvblB0cikoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIE5QVmFyaWFudCAqcmVzdWx0KTsKdHlwZWRlZiBib29sICgqTlBTZXRQcm9wZXJ0eUZ1bmN0aW9uUHRyKShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICp2YWx1ZSk7CnR5cGVkZWYgYm9vbCAoKk5QUmVtb3ZlUHJvcGVydHlGdW5jdGlvblB0cikoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7CgovKgogICAgTlBPYmplY3RzIHJldHVybmVkIGJ5IGNyZWF0ZSBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9mIG9uZS4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eQogICAgdG8gcmVsZWFzZSB0aGUgcmV0dXJuZWQgb2JqZWN0LgoKICAgIE5QSW52b2tlRnVuY3Rpb25QdHIgZnVuY3Rpb24gbWF5IHJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSBhIHRoZSBtZXRob2QgY291bGQgbm90IGJlIGludm9rZWQuCiAgICAKICAgIE5QR2V0UHJvcGVydHlGdW5jdGlvblB0ciBhbmQgTlBTZXRQcm9wZXJ0eUZ1bmN0aW9uUHRyIG1heSByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSBkb2Vzbid0CiAgICBleGlzdC4KICAgIAogICAgTlBJbnZhbGlkYXRlRnVuY3Rpb25QdHIgaXMgY2FsbGVkIGJ5IHRoZSBzY3JpcHRpbmcgZW52aXJvbm1lbnQgd2hlbiB0aGUgbmF0aXZlIGNvZGUgaXMKICAgIHNodXRkb3duLiAgQW55IGF0dGVtcHQgdG8gbWVzc2FnZSBhIE5QT2JqZWN0IGluc3RhbmNlIGFmdGVyIHRoZSBpbnZhbGlkYXRlCiAgICBjYWxsYmFjayBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLCBldmVuIGlmIHRoZQogICAgbmF0aXZlIGNvZGUgaXMgc3RpbGwgcmV0YWluaW5nIHRob3NlIE5QT2JqZWN0IGluc3RhbmNlcy4KICAgIChUaGUgcnVudGltZSB3aWxsIHR5cGljYWxseSByZXR1cm4gaW1tZWRpYXRlbHksIHdpdGggMCBvciBOVUxMLCBmcm9tIGFuIGF0dGVtcHQgdG8KICAgIGRpc3BhdGNoIHRvIGEgTlBPYmplY3QsIGJ1dCB0aGlzIGJlaGF2aW9yIHNob3VsZCBub3QgYmUgZGVwZW5kZWQgdXBvbi4pCiovCnN0cnVjdCBOUENsYXNzCnsKICAgIHVpbnQzMl90IHN0cnVjdFZlcnNpb247CiAgICBOUEFsbG9jYXRlRnVuY3Rpb25QdHIgYWxsb2NhdGU7CiAgICBOUERlYWxsb2NhdGVGdW5jdGlvblB0ciBkZWFsbG9jYXRlOwogICAgTlBJbnZhbGlkYXRlRnVuY3Rpb25QdHIgaW52YWxpZGF0ZTsKICAgIE5QSGFzTWV0aG9kRnVuY3Rpb25QdHIgaGFzTWV0aG9kOwogICAgTlBJbnZva2VGdW5jdGlvblB0ciBpbnZva2U7CiAgICBOUEludm9rZURlZmF1bHRGdW5jdGlvblB0ciBpbnZva2VEZWZhdWx0OwogICAgTlBIYXNQcm9wZXJ0eUZ1bmN0aW9uUHRyIGhhc1Byb3BlcnR5OwogICAgTlBHZXRQcm9wZXJ0eUZ1bmN0aW9uUHRyIGdldFByb3BlcnR5OwogICAgTlBTZXRQcm9wZXJ0eUZ1bmN0aW9uUHRyIHNldFByb3BlcnR5OwogICAgTlBSZW1vdmVQcm9wZXJ0eUZ1bmN0aW9uUHRyIHJlbW92ZVByb3BlcnR5Owp9OwoKI2RlZmluZSBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiAxCgpzdHJ1Y3QgTlBPYmplY3QgewogICAgTlBDbGFzcyAqX2NsYXNzOwogICAgdWludDMyX3QgcmVmZXJlbmNlQ291bnQ7CiAgICAvLyBBZGRpdGlvbmFsIHNwYWNlIG1heSBiZSBhbGxvY2F0ZWQgaGVyZSBieSB0eXBlcyBvZiBOUE9iamVjdHMKfTsKCi8qCiAgICBJZiB0aGUgY2xhc3MgaGFzIGFuIGFsbG9jYXRlIGZ1bmN0aW9uLCBOUE5fQ3JlYXRlT2JqZWN0IGludm9rZXMgdGhhdCBmdW5jdGlvbiwKICAgIG90aGVyd2lzZSBhIE5QT2JqZWN0IGlzIGFsbG9jYXRlZCBhbmQgcmV0dXJuZWQuICBJZiBhIGNsYXNzIGhhcyBhbiBhbGxvY2F0ZQogICAgZnVuY3Rpb24gaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoYXQgaW1wbGVtZW50YXRpb24gdG8gc2V0IHRoZSBpbml0aWFsIHJldGFpbgogICAgY291bnQgdG8gMS4KKi8KTlBPYmplY3QgKk5QTl9DcmVhdGVPYmplY3QoTlBQIG5wcCwgTlBDbGFzcyAqYUNsYXNzKTsKCi8qCiAgICBJbmNyZW1lbnQgdGhlIE5QT2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50LgoqLwpOUE9iamVjdCAqTlBOX1JldGFpbk9iamVjdCAoTlBPYmplY3QgKm9iaik7CgovKgogICAgRGVjcmVtZW50ZWQgdGhlIE5QT2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50LiAgSWYgdGhlIHJlZmVyZW5jZQogICAgY291bnQgZ29lcyB0byB6ZXJvLCB0aGUgY2xhc3MncyBkZXN0cm95IGZ1bmN0aW9uIGlzIGludm9rZSBpZgogICAgc3BlY2lmaWVkLCBvdGhlcndpc2UgdGhlIG9iamVjdCBpcyBmcmVlZCBkaXJlY3RseS4KKi8Kdm9pZCBOUE5fUmVsZWFzZU9iamVjdCAoTlBPYmplY3QgKm9iaik7CgovKgogICAgRnVuY3Rpb25zIHRvIGFjY2VzcyBzY3JpcHQgb2JqZWN0cyByZXByZXNlbnRlZCBieSBOUE9iamVjdC4KCiAgICBDYWxscyB0byBzY3JpcHQgb2JqZWN0cyBhcmUgc3luY2hyb25vdXMuICBJZiBhIGZ1bmN0aW9uIHJldHVybnMgYQogICAgdmFsdWUsIGl0IHdpbGwgYmUgc3VwcGxpZWQgdmlhIHRoZSByZXN1bHQgTlBWYXJpYW50CiAgICBhcmd1bWVudC4gU3VjY2Vzc2Z1bCBjYWxscyB3aWxsIHJldHVybiB0cnVlLCBmYWxzZSB3aWxsIGJlCiAgICByZXR1cm5lZCBpbiBjYXNlIG9mIGFuIGVycm9yLgogICAgCiAgICBDYWxscyBtYWRlIGZyb20gcGx1Z2luIGNvZGUgdG8gc2NyaXB0IG11c3QgYmUgbWFkZSBmcm9tIHRoZSB0aHJlYWQKICAgIG9uIHdoaWNoIHRoZSBwbHVnaW4gd2FzIGluaXRpYWxpemVkLgoqLwpib29sIE5QTl9JbnZva2UoTlBQIG5wcCwgTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgbWV0aG9kTmFtZSwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOwpib29sIE5QTl9JbnZva2VEZWZhdWx0KE5QUCBucHAsIE5QT2JqZWN0ICpucG9iaiwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOwpib29sIE5QTl9FdmFsdWF0ZShOUFAgbnBwLCBOUE9iamVjdCAqbnBvYmosIE5QU3RyaW5nICpzY3JpcHQsIE5QVmFyaWFudCAqcmVzdWx0KTsKYm9vbCBOUE5fR2V0UHJvcGVydHkoTlBQIG5wcCwgTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgcHJvcGVydHlOYW1lLCBOUFZhcmlhbnQgKnJlc3VsdCk7CmJvb2wgTlBOX1NldFByb3BlcnR5KE5QUCBucHAsIE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSwgY29uc3QgTlBWYXJpYW50ICp2YWx1ZSk7CmJvb2wgTlBOX1JlbW92ZVByb3BlcnR5KE5QUCBucHAsIE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSk7CmJvb2wgTlBOX0hhc1Byb3BlcnR5KE5QUCBucHAsIE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSk7CmJvb2wgTlBOX0hhc01ldGhvZChOUFAgbnBwLCBOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciBtZXRob2ROYW1lKTsKCi8qCiAgICBOUE5fU2V0RXhjZXB0aW9uIG1heSBiZSBjYWxsZWQgdG8gdHJpZ2dlciBhIHNjcmlwdCBleGNlcHRpb24gdXBvbiByZXR1cm4KICAgIGZyb20gZW50cnkgcG9pbnRzIGludG8gTlBPYmplY3RzLgoqLwp2b2lkIE5QTl9TZXRFeGNlcHRpb24gKE5QT2JqZWN0ICpvYmosIGNvbnN0IE5QVVRGOCAqbWVzc2FnZSk7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZgo=