Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDIwMDMgR2x5cGggJiBDb2csIExMQwovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gTW9kaWZpZWQgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCAtIGh0dHA6Ly9wb3BwbGVyLmZyZWVkZXNrdG9wLm9yZwovLwovLyBBbGwgY2hhbmdlcyBtYWRlIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgdG8gdGhpcyBmaWxlIGFyZSBsaWNlbnNlZAovLyB1bmRlciBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyCi8vCi8vIENvcHlyaWdodCAoQykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgQ2FybG9zIEdhcmNpYSBDYW1wb3MgPGNhcmxvc2djQGdub21lLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYXMgSGFydG1ldHogPGFoYXJ0bWV0ekBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTcgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTUsIDIwMTggQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxNSwgMjAxNiBXaWxsaWFtIEJhZGVyIDx3aWxsaWFtYmFkZXJAaG90bWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxOCBTdGVmYW4gQnL8bnMgPHN0ZWZhbi5icnVlbnNAcnd0aC1hYWNoZW4uZGU+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgU1BMQVNIT1VUUFVUREVWX0gKI2RlZmluZSBTUExBU0hPVVRQVVRERVZfSAoKI2luY2x1ZGUgInNwbGFzaC9TcGxhc2hUeXBlcy5oIgojaW5jbHVkZSAic3BsYXNoL1NwbGFzaFBhdHRlcm4uaCIKI2luY2x1ZGUgInBvcHBsZXItY29uZmlnLmgiCiNpbmNsdWRlICJPdXRwdXREZXYuaCIKI2luY2x1ZGUgIkdmeFN0YXRlLmgiCiNpbmNsdWRlICJHbG9iYWxQYXJhbXMuaCIKCmNsYXNzIFBERkRvYzsKY2xhc3MgR2Z4OEJpdEZvbnQ7CmNsYXNzIFNwbGFzaEJpdG1hcDsKY2xhc3MgU3BsYXNoOwpjbGFzcyBTcGxhc2hQYXRoOwpjbGFzcyBTcGxhc2hGb250RW5naW5lOwpjbGFzcyBTcGxhc2hGb250OwpjbGFzcyBUM0ZvbnRDYWNoZTsKc3RydWN0IFQzRm9udENhY2hlVGFnOwpzdHJ1Y3QgVDNHbHlwaFN0YWNrOwpzdHJ1Y3QgU3BsYXNoVHJhbnNwYXJlbmN5R3JvdXA7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTcGxhc2ggZHluYW1pYyBwYXR0ZXJuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2hGdW5jdGlvblBhdHRlcm46IHB1YmxpYyBTcGxhc2hQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hGdW5jdGlvblBhdHRlcm4oU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4U3RhdGUgKnN0YXRlLCBHZnhGdW5jdGlvblNoYWRpbmcgKnNoYWRpbmcpOwoKICBTcGxhc2hQYXR0ZXJuICpjb3B5KCkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IFNwbGFzaEZ1bmN0aW9uUGF0dGVybihjb2xvck1vZGUsIHN0YXRlLCAoR2Z4RnVuY3Rpb25TaGFkaW5nICopIHNoYWRpbmcpOyB9CgogIH5TcGxhc2hGdW5jdGlvblBhdHRlcm4oKTsKCiAgYm9vbCB0ZXN0UG9zaXRpb24oaW50IHgsIGludCB5KSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CgogIGJvb2wgaXNTdGF0aWMoKSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQoKICBib29sIGdldENvbG9yKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgYykgb3ZlcnJpZGU7CgogIHZpcnR1YWwgR2Z4RnVuY3Rpb25TaGFkaW5nICpnZXRTaGFkaW5nKCkgeyByZXR1cm4gc2hhZGluZzsgfQoKICBib29sIGlzQ01ZSygpIG92ZXJyaWRlIHsgcmV0dXJuIGdmeE1vZGUgPT0gY3NEZXZpY2VDTVlLOyB9Cgpwcm90ZWN0ZWQ6CiAgTWF0cml4IGljdG07CiAgZG91YmxlIHhNaW4sIHlNaW4sIHhNYXgsIHlNYXg7CiAgR2Z4RnVuY3Rpb25TaGFkaW5nICpzaGFkaW5nOwogIEdmeFN0YXRlICpzdGF0ZTsKICBTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlOwogIEdmeENvbG9yU3BhY2VNb2RlIGdmeE1vZGU7Cn07CgpjbGFzcyBTcGxhc2hVbml2YXJpYXRlUGF0dGVybjogcHVibGljIFNwbGFzaFBhdHRlcm4gewpwdWJsaWM6CgogIFNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuKFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGUsIEdmeFN0YXRlICpzdGF0ZSwgR2Z4VW5pdmFyaWF0ZVNoYWRpbmcgKnNoYWRpbmcpOwoKICB+U3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm4oKTsKCiAgYm9vbCBnZXRDb2xvcihpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIGMpIG92ZXJyaWRlOwoKICBib29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpIG92ZXJyaWRlOwoKICBib29sIGlzU3RhdGljKCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KCiAgdmlydHVhbCBib29sIGdldFBhcmFtZXRlcihkb3VibGUgeHMsIGRvdWJsZSB5cywgZG91YmxlICp0KSA9IDA7CgogIHZpcnR1YWwgR2Z4VW5pdmFyaWF0ZVNoYWRpbmcgKmdldFNoYWRpbmcoKSB7IHJldHVybiBzaGFkaW5nOyB9CgogIGJvb2wgaXNDTVlLKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2Z4TW9kZSA9PSBjc0RldmljZUNNWUs7IH0KCnByb3RlY3RlZDoKICBNYXRyaXggaWN0bTsKICBkb3VibGUgdDAsIHQxLCBkdDsKICBHZnhVbml2YXJpYXRlU2hhZGluZyAqc2hhZGluZzsKICBHZnhTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZTsKICBHZnhDb2xvclNwYWNlTW9kZSBnZnhNb2RlOwp9OwoKY2xhc3MgU3BsYXNoQXhpYWxQYXR0ZXJuOiBwdWJsaWMgU3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm4gewpwdWJsaWM6CgogIFNwbGFzaEF4aWFsUGF0dGVybihTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeEF4aWFsU2hhZGluZyAqc2hhZGluZyk7CgogIFNwbGFzaFBhdHRlcm4gKmNvcHkoKSBvdmVycmlkZSB7IHJldHVybiBuZXcgU3BsYXNoQXhpYWxQYXR0ZXJuKGNvbG9yTW9kZSwgc3RhdGUsIChHZnhBeGlhbFNoYWRpbmcgKikgc2hhZGluZyk7IH0KCiAgflNwbGFzaEF4aWFsUGF0dGVybigpOwoKICBib29sIGdldFBhcmFtZXRlcihkb3VibGUgeHMsIGRvdWJsZSB5cywgZG91YmxlICp0KSBvdmVycmlkZTsKCnByaXZhdGU6CiAgZG91YmxlIHgwLCB5MCwgeDEsIHkxOwogIGRvdWJsZSBkeCwgZHksIG11bDsKfTsKCi8vIHNlZSBHZnhTdGF0ZS5oLCBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nCmNsYXNzIFNwbGFzaEdvdXJhdWRQYXR0ZXJuOiBwdWJsaWMgU3BsYXNoR291cmF1ZENvbG9yIHsKcHVibGljOgoKICBTcGxhc2hHb3VyYXVkUGF0dGVybihib29sIGJEaXJlY3RDb2xvclRyYW5zbGF0aW9uLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmcgKnNoYWRpbmcpOwoKICBTcGxhc2hQYXR0ZXJuICpjb3B5KCkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IFNwbGFzaEdvdXJhdWRQYXR0ZXJuKGJEaXJlY3RDb2xvclRyYW5zbGF0aW9uLCBzdGF0ZSwgc2hhZGluZyk7IH0KCiAgflNwbGFzaEdvdXJhdWRQYXR0ZXJuKCk7CgogIGJvb2wgZ2V0Q29sb3IoaW50IHgsIGludCB5LCBTcGxhc2hDb2xvclB0ciBjKSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQoKICBib29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CgogIGJvb2wgaXNTdGF0aWMoKSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQoKICBib29sIGlzQ01ZSygpIG92ZXJyaWRlIHsgcmV0dXJuIGdmeE1vZGUgPT0gY3NEZXZpY2VDTVlLOyB9CgogIGJvb2wgaXNQYXJhbWV0ZXJpemVkKCkgb3ZlcnJpZGUgeyByZXR1cm4gc2hhZGluZy0+aXNQYXJhbWV0ZXJpemVkKCk7IH0KICBpbnQgZ2V0TlRyaWFuZ2xlcygpIG92ZXJyaWRlIHsgcmV0dXJuIHNoYWRpbmctPmdldE5UcmlhbmdsZXMoKTsgfQogICB2b2lkIGdldFRyaWFuZ2xlKGludCBpLCBkb3VibGUgKngwLCBkb3VibGUgKnkwLCBkb3VibGUgKmNvbG9yMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqeDEsIGRvdWJsZSAqeTEsIGRvdWJsZSAqY29sb3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp4MiwgZG91YmxlICp5MiwgZG91YmxlICpjb2xvcjIpIG92ZXJyaWRlCiAgeyBzaGFkaW5nLT5nZXRUcmlhbmdsZShpLCB4MCwgeTAsIGNvbG9yMCwgeDEsIHkxLCBjb2xvcjEsIHgyLCB5MiwgY29sb3IyKTsgfQoKICB2b2lkIGdldFBhcmFtZXRlcml6ZWRDb2xvcihkb3VibGUgdCwgU3BsYXNoQ29sb3JNb2RlIG1vZGUsIFNwbGFzaENvbG9yUHRyIGMpIG92ZXJyaWRlOwoKcHJpdmF0ZToKICBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nICpzaGFkaW5nOwogIEdmeFN0YXRlICpzdGF0ZTsKICBib29sIGJEaXJlY3RDb2xvclRyYW5zbGF0aW9uOwogIEdmeENvbG9yU3BhY2VNb2RlIGdmeE1vZGU7Cn07CgovLyBzZWUgR2Z4U3RhdGUuaCwgR2Z4UmFkaWFsU2hhZGluZwpjbGFzcyBTcGxhc2hSYWRpYWxQYXR0ZXJuOiBwdWJsaWMgU3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm4gewpwdWJsaWM6CgogIFNwbGFzaFJhZGlhbFBhdHRlcm4oU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4U3RhdGUgKnN0YXRlLCBHZnhSYWRpYWxTaGFkaW5nICpzaGFkaW5nKTsKCiAgU3BsYXNoUGF0dGVybiAqY29weSgpIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBTcGxhc2hSYWRpYWxQYXR0ZXJuKGNvbG9yTW9kZSwgc3RhdGUsIChHZnhSYWRpYWxTaGFkaW5nICopIHNoYWRpbmcpOyB9CgogIH5TcGxhc2hSYWRpYWxQYXR0ZXJuKCk7CgogIGJvb2wgZ2V0UGFyYW1ldGVyKGRvdWJsZSB4cywgZG91YmxlIHlzLCBkb3VibGUgKnQpIG92ZXJyaWRlOwoKcHJpdmF0ZToKICBkb3VibGUgeDAsIHkwLCByMCwgZHgsIGR5LCBkcjsKICBkb3VibGUgYSwgaW52YTsKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBudW1iZXIgb2YgVHlwZSAzIGZvbnRzIHRvIGNhY2hlCiNkZWZpbmUgc3BsYXNoT3V0VDNGb250Q2FjaGVTaXplIDgKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaE91dHB1dERldgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoT3V0cHV0RGV2OiBwdWJsaWMgT3V0cHV0RGV2IHsKcHVibGljOgoKICAvLyBDb25zdHJ1Y3Rvci4KICBTcGxhc2hPdXRwdXREZXYoU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZUEsIGludCBiaXRtYXBSb3dQYWRBLAoJCSAgYm9vbCByZXZlcnNlVmlkZW9BLCBTcGxhc2hDb2xvclB0ciBwYXBlckNvbG9yQSwKCQkgIGJvb2wgYml0bWFwVG9wRG93bkEgPSB0cnVlLAoJCSAgU3BsYXNoVGhpbkxpbmVNb2RlIHRoaW5MaW5lTW9kZSA9IHNwbGFzaFRoaW5MaW5lRGVmYXVsdCwKCQkgIGJvb2wgb3ZlcnByaW50UHJldmlld0EgPSBnbG9iYWxQYXJhbXMtPmdldE92ZXJwcmludFByZXZpZXcoKSk7CgogIC8vIERlc3RydWN0b3IuCiAgflNwbGFzaE91dHB1dERldigpOwoKICAvLy0tLS0tIGdldCBpbmZvIGFib3V0IG91dHB1dCBkZXZpY2UKCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgdGlsaW5nUGF0dGVybkZpbGwoKT8gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwKICAvLyB0aWxpbmcgcGF0dGVybiBmaWxscyB3aWxsIGJlIHJlZHVjZWQgdG8gYSBzZXJpZXMgb2Ygb3RoZXIgZHJhd2luZwogIC8vIG9wZXJhdGlvbnMuCiAgYm9vbCB1c2VUaWxpbmdQYXR0ZXJuRmlsbCgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgZnVuY3Rpb25TaGFkZWRGaWxsKCksIGF4aWFsU2hhZGVkRmlsbCgpLCBhbmQKICAvLyByYWRpYWxTaGFkZWRGaWxsKCk/ICBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZXNlIHNoYWRlZCBmaWxscwogIC8vIHdpbGwgYmUgcmVkdWNlZCB0byBhIHNlcmllcyBvZiBvdGhlciBkcmF3aW5nIG9wZXJhdGlvbnMuCiAgYm9vbCB1c2VTaGFkZWRGaWxscyhpbnQgdHlwZSkgb3ZlcnJpZGUKICB7IHJldHVybiAodHlwZSA+PSAxICYmIHR5cGUgPD0gNSkgPyB0cnVlIDogZmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgdXBzaWRlLWRvd24gY29vcmRpbmF0ZXM/CiAgLy8gKFVwc2lkZS1kb3duIG1lYW5zICgwLDApIGlzIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHBhZ2UuKQogIGJvb2wgdXBzaWRlRG93bigpIG92ZXJyaWRlIHsgcmV0dXJuIGJpdG1hcFRvcERvd24gXiBiaXRtYXBVcHNpZGVEb3duOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGRyYXdDaGFyKCkgb3IgZHJhd1N0cmluZygpPwogIGJvb2wgdXNlRHJhd0NoYXIoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGJlZ2luVHlwZTNDaGFyL2VuZFR5cGUzQ2hhcj8gIE90aGVyd2lzZSwKICAvLyB0ZXh0IGluIFR5cGUgMyBmb250cyB3aWxsIGJlIGRyYXduIHdpdGggZHJhd0NoYXIvZHJhd1N0cmluZy4KICBib29sIGludGVycHJldFR5cGUzQ2hhcnMoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CgogIC8vLS0tLS0gaW5pdGlhbGl6YXRpb24gYW5kIGNvbnRyb2wKCiAgLy8gU3RhcnQgYSBwYWdlLgogIHZvaWQgc3RhcnRQYWdlKGludCBwYWdlTnVtLCBHZnhTdGF0ZSAqc3RhdGUsIFhSZWYgKnhyZWYpIG92ZXJyaWRlOwoKICAvLyBFbmQgYSBwYWdlLgogIHZvaWQgZW5kUGFnZSgpIG92ZXJyaWRlOwoKICAvLy0tLS0tIHNhdmUvcmVzdG9yZSBncmFwaGljcyBzdGF0ZQogIHZvaWQgc2F2ZVN0YXRlKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCByZXN0b3JlU3RhdGUoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSB1cGRhdGUgZ3JhcGhpY3Mgc3RhdGUKICB2b2lkIHVwZGF0ZUFsbChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlQ1RNKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIG0xMSwgZG91YmxlIG0xMiwKCQkJIGRvdWJsZSBtMjEsIGRvdWJsZSBtMjIsIGRvdWJsZSBtMzEsIGRvdWJsZSBtMzIpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlTGluZURhc2goR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUZsYXRuZXNzKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVMaW5lSm9pbihHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlTGluZUNhcChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlTWl0ZXJMaW1pdChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlTGluZVdpZHRoKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVTdHJva2VBZGp1c3QoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUZpbGxDb2xvclNwYWNlKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVTdHJva2VDb2xvclNwYWNlKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVGaWxsQ29sb3IoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZVN0cm9rZUNvbG9yKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVCbGVuZE1vZGUoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUZpbGxPcGFjaXR5KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVTdHJva2VPcGFjaXR5KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVQYXR0ZXJuT3BhY2l0eShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgY2xlYXJQYXR0ZXJuT3BhY2l0eShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlRmlsbE92ZXJwcmludChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlU3Ryb2tlT3ZlcnByaW50KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVPdmVycHJpbnRNb2RlKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVUcmFuc2ZlcihHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwoKICAvLy0tLS0tIHVwZGF0ZSB0ZXh0IHN0YXRlCiAgdm9pZCB1cGRhdGVGb250KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gcGF0aCBwYWludGluZwogIHZvaWQgc3Ryb2tlKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBmaWxsKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBlb0ZpbGwoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICBib29sIHRpbGluZ1BhdHRlcm5GaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4ICpnZngsIENhdGFsb2cgKmNhdGFsb2csIE9iamVjdCAqc3RyLAoJCQkJICBjb25zdCBkb3VibGUgKnBtYXQsIGludCBwYWludFR5cGUsIGludCB0aWxpbmdUeXBlLCBEaWN0ICpyZXNEaWN0LAoJCQkJICBjb25zdCBkb3VibGUgKm1hdCwgY29uc3QgZG91YmxlICpiYm94LAoJCQkJICBpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEsCgkJCQkgIGRvdWJsZSB4U3RlcCwgZG91YmxlIHlTdGVwKSBvdmVycmlkZTsKICBib29sIGZ1bmN0aW9uU2hhZGVkRmlsbChHZnhTdGF0ZSAqc3RhdGUsIEdmeEZ1bmN0aW9uU2hhZGluZyAqc2hhZGluZykgb3ZlcnJpZGU7CiAgYm9vbCBheGlhbFNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnhBeGlhbFNoYWRpbmcgKnNoYWRpbmcsIGRvdWJsZSB0TWluLCBkb3VibGUgdE1heCkgb3ZlcnJpZGU7CiAgYm9vbCByYWRpYWxTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4UmFkaWFsU2hhZGluZyAqc2hhZGluZywgZG91YmxlIHRNaW4sIGRvdWJsZSB0TWF4KSBvdmVycmlkZTsKICBib29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nICpzaGFkaW5nKSBvdmVycmlkZTsKCiAgLy8tLS0tLSBwYXRoIGNsaXBwaW5nCiAgdm9pZCBjbGlwKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBlb0NsaXAoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIGNsaXBUb1N0cm9rZVBhdGgoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSB0ZXh0IGRyYXdpbmcKICB2b2lkIGRyYXdDaGFyKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHgsIGRvdWJsZSB5LAoJCQlkb3VibGUgZHgsIGRvdWJsZSBkeSwKCQkJZG91YmxlIG9yaWdpblgsIGRvdWJsZSBvcmlnaW5ZLAoJCQlDaGFyQ29kZSBjb2RlLCBpbnQgbkJ5dGVzLCBVbmljb2RlICp1LCBpbnQgdUxlbikgb3ZlcnJpZGU7CiAgYm9vbCBiZWdpblR5cGUzQ2hhcihHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSB4LCBkb3VibGUgeSwKCQkJICAgICAgIGRvdWJsZSBkeCwgZG91YmxlIGR5LAoJCQkgICAgICAgQ2hhckNvZGUgY29kZSwgVW5pY29kZSAqdSwgaW50IHVMZW4pIG92ZXJyaWRlOwogIHZvaWQgZW5kVHlwZTNDaGFyKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBiZWdpblRleHRPYmplY3QoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIGVuZFRleHRPYmplY3QoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSBpbWFnZSBkcmF3aW5nCiAgdm9pZCBkcmF3SW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpbnZlcnQsCgkJCSAgICAgYm9vbCBpbnRlcnBvbGF0ZSwgYm9vbCBpbmxpbmVJbWcpIG92ZXJyaWRlOwogIHZvaWQgc2V0U29mdE1hc2tGcm9tSW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwKCQkJCQlPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGludmVydCwKCQkJCQlib29sIGlubGluZUltZywgZG91YmxlICpiYXNlTWF0cml4KSBvdmVycmlkZTsKICB2b2lkIHVuc2V0U29mdE1hc2tGcm9tSW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlICpiYXNlTWF0cml4KSBvdmVycmlkZTsKICB2b2lkIGRyYXdJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJIGludCB3aWR0aCwgaW50IGhlaWdodCwgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCSBib29sIGludGVycG9sYXRlLCBpbnQgKm1hc2tDb2xvcnMsIGJvb2wgaW5saW5lSW1nKSBvdmVycmlkZTsKICB2b2lkIGRyYXdNYXNrZWRJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkJICAgICAgIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLAoJCQkgICAgICAgYm9vbCBpbnRlcnBvbGF0ZSwKCQkJICAgICAgIFN0cmVhbSAqbWFza1N0ciwgaW50IG1hc2tXaWR0aCwgaW50IG1hc2tIZWlnaHQsCgkJCSAgICAgICBib29sIG1hc2tJbnZlcnQsIGJvb2wgbWFza0ludGVycG9sYXRlKSBvdmVycmlkZTsKICB2b2lkIGRyYXdTb2Z0TWFza2VkSW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCQkgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJCQkgICBHZnhJbWFnZUNvbG9yTWFwICpjb2xvck1hcCwKCQkJCSAgIGJvb2wgaW50ZXJwb2xhdGUsCgkJCQkgICBTdHJlYW0gKm1hc2tTdHIsCgkJCQkgICBpbnQgbWFza1dpZHRoLCBpbnQgbWFza0hlaWdodCwKCQkJCSAgIEdmeEltYWdlQ29sb3JNYXAgKm1hc2tDb2xvck1hcCwKCQkJCSAgIGJvb2wgbWFza0ludGVycG9sYXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSBUeXBlIDMgZm9udCBvcGVyYXRvcnMKICB2b2lkIHR5cGUzRDAoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgd3gsIGRvdWJsZSB3eSkgb3ZlcnJpZGU7CiAgdm9pZCB0eXBlM0QxKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHd4LCBkb3VibGUgd3ksCgkJICAgICAgIGRvdWJsZSBsbHgsIGRvdWJsZSBsbHksIGRvdWJsZSB1cngsIGRvdWJsZSB1cnkpIG92ZXJyaWRlOwoKICAvLy0tLS0tIHRyYW5zcGFyZW5jeSBncm91cHMgYW5kIHNvZnQgbWFza3MKICBib29sIGNoZWNrVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKnN0YXRlLCBib29sIGtub2Nrb3V0KSBvdmVycmlkZTsKICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKnN0YXRlLCBjb25zdCBkb3VibGUgKmJib3gsCgkJCQkgICAgICBHZnhDb2xvclNwYWNlICpibGVuZGluZ0NvbG9yU3BhY2UsCgkJCQkgICAgICBib29sIGlzb2xhdGVkLCBib29sIGtub2Nrb3V0LAoJCQkJICAgICAgYm9vbCBmb3JTb2Z0TWFzaykgb3ZlcnJpZGU7CiAgdm9pZCBlbmRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgcGFpbnRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUsIGNvbnN0IGRvdWJsZSAqYmJveCkgb3ZlcnJpZGU7CiAgdm9pZCBzZXRTb2Z0TWFzayhHZnhTdGF0ZSAqc3RhdGUsIGNvbnN0IGRvdWJsZSAqYmJveCwgYm9vbCBhbHBoYSwKCQkJICAgRnVuY3Rpb24gKnRyYW5zZmVyRnVuYywgR2Z4Q29sb3IgKmJhY2tkcm9wQ29sb3IpIG92ZXJyaWRlOwogIHZvaWQgY2xlYXJTb2Z0TWFzayhHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwoKICAvLy0tLS0tIHNwZWNpYWwgYWNjZXNzCgogIC8vIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IFBERiBkb2N1bWVudCBoYXMgYmVlbiBsb2FkZWQuCiAgdm9pZCBzdGFydERvYyhQREZEb2MgKmRvY0EpOwogCiAgdm9pZCBzZXRQYXBlckNvbG9yKFNwbGFzaENvbG9yUHRyIHBhcGVyQ29sb3JBKTsKCiAgYm9vbCBpc1JldmVyc2VWaWRlbygpIHsgcmV0dXJuIHJldmVyc2VWaWRlbzsgfQogIHZvaWQgc2V0UmV2ZXJzZVZpZGVvKGJvb2wgcmV2ZXJzZVZpZGVvQSkgeyByZXZlcnNlVmlkZW8gPSByZXZlcnNlVmlkZW9BOyB9CgogIC8vIEdldCB0aGUgYml0bWFwIGFuZCBpdHMgc2l6ZS4KICBTcGxhc2hCaXRtYXAgKmdldEJpdG1hcCgpIHsgcmV0dXJuIGJpdG1hcDsgfQogIGludCBnZXRCaXRtYXBXaWR0aCgpOwogIGludCBnZXRCaXRtYXBIZWlnaHQoKTsKCiAgLy8gUmV0dXJucyB0aGUgbGFzdCByYXN0ZXJpemVkIGJpdG1hcCwgdHJhbnNmZXJyaW5nIG93bmVyc2hpcCB0byB0aGUKICAvLyBjYWxsZXIuCiAgU3BsYXNoQml0bWFwICp0YWtlQml0bWFwKCk7CgogIC8vIFNldCB0aGlzIGZsYWcgdG8gdHJ1ZSB0byBnZW5lcmF0ZSBhbiB1cHNpZGUtZG93biBiaXRtYXAgKHVzZWZ1bAogIC8vIGZvciBXaW5kb3dzIEJNUCBmaWxlcykuCiAgdm9pZCBzZXRCaXRtYXBVcHNpZGVEb3duKGJvb2wgZikgeyBiaXRtYXBVcHNpZGVEb3duID0gZjsgfQoKICAvLyBHZXQgdGhlIFNwbGFzaCBvYmplY3QuCiAgU3BsYXNoICpnZXRTcGxhc2goKSB7IHJldHVybiBzcGxhc2g7IH0KCiAgLy8gR2V0IHRoZSBtb2RpZmllZCByZWdpb24uCiAgdm9pZCBnZXRNb2RSZWdpb24oaW50ICp4TWluLCBpbnQgKnlNaW4sIGludCAqeE1heCwgaW50ICp5TWF4KTsKCiAgLy8gQ2xlYXIgdGhlIG1vZGlmaWVkIHJlZ2lvbi4KICB2b2lkIGNsZWFyTW9kUmVnaW9uKCk7CgogIFNwbGFzaEZvbnQgKmdldEN1cnJlbnRGb250KCkgeyByZXR1cm4gZm9udDsgfQoKICAvLyBJZiA8c2tpcFRleHRBPiBpcyB0cnVlLCBkb24ndCBkcmF3IGhvcml6b250YWwgdGV4dC4KICAvLyBJZiA8c2tpcFJvdGF0ZWRUZXh0QT4gaXMgdHJ1ZSwgZG9uJ3QgZHJhdyByb3RhdGVkIChub24taG9yaXpvbnRhbCkgdGV4dC4KICB2b2lkIHNldFNraXBUZXh0KGJvb2wgc2tpcEhvcml6VGV4dEEsIGJvb2wgc2tpcFJvdGF0ZWRUZXh0QSkKICAgIHsgc2tpcEhvcml6VGV4dCA9IHNraXBIb3JpelRleHRBOyBza2lwUm90YXRlZFRleHQgPSBza2lwUm90YXRlZFRleHRBOyB9CgogIGludCBnZXROZXN0Q291bnQoKSB7IHJldHVybiBuZXN0Q291bnQ7IH0KCiNpZiAxIC8vfnRtcDogdHVybiBvZmYgYW50aS1hbGlhc2luZyB0ZW1wb3JhcmlseQogIGJvb2wgZ2V0VmVjdG9yQW50aWFsaWFzKCkgb3ZlcnJpZGU7CiAgdm9pZCBzZXRWZWN0b3JBbnRpYWxpYXMoYm9vbCB2YWEpIG92ZXJyaWRlOwojZW5kaWYKCiAgYm9vbCBnZXRGb250QW50aWFsaWFzKCkgeyByZXR1cm4gZm9udEFudGlhbGlhczsgfQogIHZvaWQgc2V0Rm9udEFudGlhbGlhcyhib29sIGFudGkpIHsgZm9udEFudGlhbGlhcyA9IGFudGk7IH0KCiAgdm9pZCBzZXRGcmVlVHlwZUhpbnRpbmcoYm9vbCBlbmFibGUsIGJvb2wgZW5hYmxlU2xpZ2h0SGludGluZyk7Cgpwcm90ZWN0ZWQ6CiAgdm9pZCBkb1VwZGF0ZUZvbnQoR2Z4U3RhdGUgKnN0YXRlKTsKCnByaXZhdGU6CiAgYm9vbCB1bml2YXJpYXRlU2hhZGVkRmlsbChHZnhTdGF0ZSAqc3RhdGUsIFNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuICpwYXR0ZXJuLCBkb3VibGUgdE1pbiwgZG91YmxlIHRNYXgpOwoKICB2b2lkIHNldHVwU2NyZWVuUGFyYW1zKGRvdWJsZSBoRFBJLCBkb3VibGUgdkRQSSk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0Q29sb3IoR2Z4R3JheSBncmF5KTsKICBTcGxhc2hQYXR0ZXJuICpnZXRDb2xvcihHZnhSR0IgKnJnYik7CiNpZmRlZiBTUExBU0hfQ01ZSwogIFNwbGFzaFBhdHRlcm4gKmdldENvbG9yKEdmeENNWUsgKmNteWspOwogIFNwbGFzaFBhdHRlcm4gKmdldENvbG9yKEdmeENvbG9yICpkZXZpY2VOKTsKI2VuZGlmCiAgc3RhdGljIHZvaWQgZ2V0TWF0dGVDb2xvciggU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsIGNvbnN0IEdmeENvbG9yICogbWF0dGVDb2xvciwgU3BsYXNoQ29sb3Igc3BsYXNoTWF0dGVDb2xvcik7CiAgdm9pZCBzZXRPdmVycHJpbnRNYXNrKEdmeENvbG9yU3BhY2UgKmNvbG9yU3BhY2UsIGJvb2wgb3ZlcnByaW50RmxhZywKCQkJaW50IG92ZXJwcmludE1vZGUsIGNvbnN0IEdmeENvbG9yICpzaW5nbGVDb2xvciwgYm9vbCBncmF5SW5kZXhlZCA9IGZhbHNlKTsKICBTcGxhc2hQYXRoIGNvbnZlcnRQYXRoKEdmeFN0YXRlICpzdGF0ZSwgR2Z4UGF0aCAqcGF0aCwKCQkJICBib29sIGRyb3BFbXB0eVN1YnBhdGhzKTsKICB2b2lkIGRyYXdUeXBlM0dseXBoKEdmeFN0YXRlICpzdGF0ZSwgVDNGb250Q2FjaGUgKnQzRm9udCwKCQkgICAgICBUM0ZvbnRDYWNoZVRhZyAqdGFnLCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKI2lmZGVmIFVTRV9DTVMKICBib29sIHVzZUljY0ltYWdlU3JjKHZvaWQgKmRhdGEpOwogIHN0YXRpYyB2b2lkIGljY1RyYW5zZm9ybSh2b2lkICpkYXRhLCBTcGxhc2hCaXRtYXAgKmJpdG1hcCk7CiAgc3RhdGljIGJvb2wgaWNjSW1hZ2VTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgY29sb3JMaW5lLAoJCQl1bnNpZ25lZCBjaGFyICphbHBoYUxpbmUpOwojZW5kaWYKICBzdGF0aWMgYm9vbCBpbWFnZU1hc2tTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgbGluZSk7CiAgc3RhdGljIGJvb2wgaW1hZ2VTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgY29sb3JMaW5lLAoJCQl1bnNpZ25lZCBjaGFyICphbHBoYUxpbmUpOwogIHN0YXRpYyBib29sIGFscGhhSW1hZ2VTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgbGluZSwKCQkJICAgICB1bnNpZ25lZCBjaGFyICphbHBoYUxpbmUpOwogIHN0YXRpYyBib29sIG1hc2tlZEltYWdlU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGxpbmUsCgkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmFscGhhTGluZSk7CiAgc3RhdGljIGJvb2wgdGlsaW5nQml0bWFwU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGxpbmUsCgkJCSAgICAgdW5zaWduZWQgY2hhciAqYWxwaGFMaW5lKTsKCiAgYm9vbCBrZWVwQWxwaGFDaGFubmVsOwkvLyBkb24ndCBmaWxsIHdpdGggcGFwZXIgY29sb3IsIGtlZXAgYWxwaGEgY2hhbm5lbAoKICBTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlOwogIGludCBiaXRtYXBSb3dQYWQ7CiAgYm9vbCBiaXRtYXBUb3BEb3duOwogIGJvb2wgYml0bWFwVXBzaWRlRG93bjsKICBib29sIGZvbnRBbnRpYWxpYXM7CiAgYm9vbCB2ZWN0b3JBbnRpYWxpYXM7CiAgYm9vbCBvdmVycHJpbnRQcmV2aWV3OwogIGJvb2wgZW5hYmxlRnJlZVR5cGVIaW50aW5nOwogIGJvb2wgZW5hYmxlU2xpZ2h0SGludGluZzsKICBib29sIHJldmVyc2VWaWRlbzsJCS8vIHJldmVyc2UgdmlkZW8gbW9kZQogIFNwbGFzaENvbG9yIHBhcGVyQ29sb3I7CS8vIHBhcGVyIGNvbG9yCiAgU3BsYXNoU2NyZWVuUGFyYW1zIHNjcmVlblBhcmFtczsKICBib29sIHNraXBIb3JpelRleHQ7CiAgYm9vbCBza2lwUm90YXRlZFRleHQ7CgogIFBERkRvYyAqZG9jOwkJCS8vIHRoZSBjdXJyZW50IGRvY3VtZW50CiAgWFJlZiAqeHJlZjsgICAgICAgLy8gdGhlIHhyZWYgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKCiAgU3BsYXNoQml0bWFwICpiaXRtYXA7CiAgU3BsYXNoICpzcGxhc2g7CiAgU3BsYXNoRm9udEVuZ2luZSAqZm9udEVuZ2luZTsKCiAgVDNGb250Q2FjaGUgKgkJCS8vIFR5cGUgMyBmb250IGNhY2hlCiAgICB0M0ZvbnRDYWNoZVtzcGxhc2hPdXRUM0ZvbnRDYWNoZVNpemVdOwogIGludCBuVDNGb250czsJCQkvLyBudW1iZXIgb2YgdmFsaWQgZW50cmllcyBpbiB0M0ZvbnRDYWNoZQogIFQzR2x5cGhTdGFjayAqdDNHbHlwaFN0YWNrOwkvLyBUeXBlIDMgZ2x5cGggY29udGV4dCBzdGFjawoKICBTcGxhc2hGb250ICpmb250OwkJLy8gY3VycmVudCBmb250CiAgYm9vbCBuZWVkRm9udFVwZGF0ZTsJCS8vIHNldCB3aGVuIHRoZSBmb250IG5lZWRzIHRvIGJlIHVwZGF0ZWQKICBTcGxhc2hQYXRoICp0ZXh0Q2xpcFBhdGg7CS8vIGNsaXBwaW5nIHBhdGggYnVpbHQgd2l0aCB0ZXh0IG9iamVjdAoKICBTcGxhc2hUcmFuc3BhcmVuY3lHcm91cCAqCS8vIHRyYW5zcGFyZW5jeSBncm91cCBzdGFjawogICAgdHJhbnNwR3JvdXBTdGFjazsKICBpbnQgbmVzdENvdW50Owp9OwoKI2VuZGlmCg==