Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDIwMDMgR2x5cGggJiBDb2csIExMQwovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gTW9kaWZpZWQgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCAtIGh0dHA6Ly9wb3BwbGVyLmZyZWVkZXNrdG9wLm9yZwovLwovLyBBbGwgY2hhbmdlcyBtYWRlIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgdG8gdGhpcyBmaWxlIGFyZSBsaWNlbnNlZAovLyB1bmRlciBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyCi8vCi8vIENvcHlyaWdodCAoQykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgQ2FybG9zIEdhcmNpYSBDYW1wb3MgPGNhcmxvc2djQGdub21lLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYXMgSGFydG1ldHogPGFoYXJ0bWV0ekBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTcgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTUgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxNSwgMjAxNiBXaWxsaWFtIEJhZGVyIDx3aWxsaWFtYmFkZXJAaG90bWFpbC5jb20+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgU1BMQVNIT1VUUFVUREVWX0gKI2RlZmluZSBTUExBU0hPVVRQVVRERVZfSAoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGludGVyZmFjZQojZW5kaWYKCiNpbmNsdWRlICJnb28vZ3R5cGVzLmgiCiNpbmNsdWRlICJzcGxhc2gvU3BsYXNoVHlwZXMuaCIKI2luY2x1ZGUgInNwbGFzaC9TcGxhc2hQYXR0ZXJuLmgiCiNpbmNsdWRlICJwb3BwbGVyLWNvbmZpZy5oIgojaW5jbHVkZSAiT3V0cHV0RGV2LmgiCiNpbmNsdWRlICJHZnhTdGF0ZS5oIgojaW5jbHVkZSAiR2xvYmFsUGFyYW1zLmgiCgpjbGFzcyBQREZEb2M7CmNsYXNzIEdmeDhCaXRGb250OwpjbGFzcyBTcGxhc2hCaXRtYXA7CmNsYXNzIFNwbGFzaDsKY2xhc3MgU3BsYXNoUGF0aDsKY2xhc3MgU3BsYXNoRm9udEVuZ2luZTsKY2xhc3MgU3BsYXNoRm9udDsKY2xhc3MgVDNGb250Q2FjaGU7CnN0cnVjdCBUM0ZvbnRDYWNoZVRhZzsKc3RydWN0IFQzR2x5cGhTdGFjazsKc3RydWN0IFNwbGFzaFRyYW5zcGFyZW5jeUdyb3VwOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoIGR5bmFtaWMgcGF0dGVybgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoRnVuY3Rpb25QYXR0ZXJuOiBwdWJsaWMgU3BsYXNoUGF0dGVybiB7CnB1YmxpYzoKCiAgU3BsYXNoRnVuY3Rpb25QYXR0ZXJuKFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGUsIEdmeFN0YXRlICpzdGF0ZSwgR2Z4RnVuY3Rpb25TaGFkaW5nICpzaGFkaW5nKTsKCiAgU3BsYXNoUGF0dGVybiAqY29weSgpIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBTcGxhc2hGdW5jdGlvblBhdHRlcm4oY29sb3JNb2RlLCBzdGF0ZSwgKEdmeEZ1bmN0aW9uU2hhZGluZyAqKSBzaGFkaW5nKTsgfQoKICB+U3BsYXNoRnVuY3Rpb25QYXR0ZXJuKCk7CgogIEdCb29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpIG92ZXJyaWRlIHsgcmV0dXJuIGdUcnVlOyB9CgogIEdCb29sIGlzU3RhdGljKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIEdCb29sIGdldENvbG9yKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgYykgb3ZlcnJpZGU7CgogIHZpcnR1YWwgR2Z4RnVuY3Rpb25TaGFkaW5nICpnZXRTaGFkaW5nKCkgeyByZXR1cm4gc2hhZGluZzsgfQoKICBHQm9vbCBpc0NNWUsoKSBvdmVycmlkZSB7IHJldHVybiBnZnhNb2RlID09IGNzRGV2aWNlQ01ZSzsgfQoKcHJvdGVjdGVkOgogIE1hdHJpeCBpY3RtOwogIGRvdWJsZSB4TWluLCB5TWluLCB4TWF4LCB5TWF4OwogIEdmeEZ1bmN0aW9uU2hhZGluZyAqc2hhZGluZzsKICBHZnhTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZTsKICBHZnhDb2xvclNwYWNlTW9kZSBnZnhNb2RlOwp9OwoKY2xhc3MgU3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm46IHB1YmxpYyBTcGxhc2hQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hVbml2YXJpYXRlUGF0dGVybihTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeFVuaXZhcmlhdGVTaGFkaW5nICpzaGFkaW5nKTsKCiAgflNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuKCk7CgogIEdCb29sIGdldENvbG9yKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgYykgb3ZlcnJpZGU7CgogIEdCb29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpIG92ZXJyaWRlOwoKICBHQm9vbCBpc1N0YXRpYygpIG92ZXJyaWRlIHsgcmV0dXJuIGdGYWxzZTsgfQoKICB2aXJ0dWFsIEdCb29sIGdldFBhcmFtZXRlcihkb3VibGUgeHMsIGRvdWJsZSB5cywgZG91YmxlICp0KSA9IDA7CgogIHZpcnR1YWwgR2Z4VW5pdmFyaWF0ZVNoYWRpbmcgKmdldFNoYWRpbmcoKSB7IHJldHVybiBzaGFkaW5nOyB9CgogIEdCb29sIGlzQ01ZSygpIG92ZXJyaWRlIHsgcmV0dXJuIGdmeE1vZGUgPT0gY3NEZXZpY2VDTVlLOyB9Cgpwcm90ZWN0ZWQ6CiAgTWF0cml4IGljdG07CiAgZG91YmxlIHQwLCB0MSwgZHQ7CiAgR2Z4VW5pdmFyaWF0ZVNoYWRpbmcgKnNoYWRpbmc7CiAgR2Z4U3RhdGUgKnN0YXRlOwogIFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGU7CiAgR2Z4Q29sb3JTcGFjZU1vZGUgZ2Z4TW9kZTsKfTsKCmNsYXNzIFNwbGFzaEF4aWFsUGF0dGVybjogcHVibGljIFNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hBeGlhbFBhdHRlcm4oU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4U3RhdGUgKnN0YXRlLCBHZnhBeGlhbFNoYWRpbmcgKnNoYWRpbmcpOwoKICBTcGxhc2hQYXR0ZXJuICpjb3B5KCkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IFNwbGFzaEF4aWFsUGF0dGVybihjb2xvck1vZGUsIHN0YXRlLCAoR2Z4QXhpYWxTaGFkaW5nICopIHNoYWRpbmcpOyB9CgogIH5TcGxhc2hBeGlhbFBhdHRlcm4oKTsKCiAgR0Jvb2wgZ2V0UGFyYW1ldGVyKGRvdWJsZSB4cywgZG91YmxlIHlzLCBkb3VibGUgKnQpIG92ZXJyaWRlOwoKcHJpdmF0ZToKICBkb3VibGUgeDAsIHkwLCB4MSwgeTE7CiAgZG91YmxlIGR4LCBkeSwgbXVsOwp9OwoKLy8gc2VlIEdmeFN0YXRlLmgsIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmcKY2xhc3MgU3BsYXNoR291cmF1ZFBhdHRlcm46IHB1YmxpYyBTcGxhc2hHb3VyYXVkQ29sb3IgewpwdWJsaWM6CgogIFNwbGFzaEdvdXJhdWRQYXR0ZXJuKEdCb29sIGJEaXJlY3RDb2xvclRyYW5zbGF0aW9uLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmcgKnNoYWRpbmcsIFNwbGFzaENvbG9yTW9kZSBtb2RlKTsKCiAgU3BsYXNoUGF0dGVybiAqY29weSgpIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBTcGxhc2hHb3VyYXVkUGF0dGVybihiRGlyZWN0Q29sb3JUcmFuc2xhdGlvbiwgc3RhdGUsIHNoYWRpbmcsIG1vZGUpOyB9CgogIH5TcGxhc2hHb3VyYXVkUGF0dGVybigpOwoKICBHQm9vbCBnZXRDb2xvcihpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIGMpIG92ZXJyaWRlIHsgcmV0dXJuIGdGYWxzZTsgfQoKICBHQm9vbCB0ZXN0UG9zaXRpb24oaW50IHgsIGludCB5KSBvdmVycmlkZSB7IHJldHVybiBnRmFsc2U7IH0KCiAgR0Jvb2wgaXNTdGF0aWMoKSBvdmVycmlkZSB7IHJldHVybiBnRmFsc2U7IH0KCiAgR0Jvb2wgaXNDTVlLKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2Z4TW9kZSA9PSBjc0RldmljZUNNWUs7IH0KCiAgR0Jvb2wgaXNQYXJhbWV0ZXJpemVkKCkgb3ZlcnJpZGUgeyByZXR1cm4gc2hhZGluZy0+aXNQYXJhbWV0ZXJpemVkKCk7IH0KICBpbnQgZ2V0TlRyaWFuZ2xlcygpIG92ZXJyaWRlIHsgcmV0dXJuIHNoYWRpbmctPmdldE5UcmlhbmdsZXMoKTsgfQogICB2b2lkIGdldFRyaWFuZ2xlKGludCBpLCBkb3VibGUgKngwLCBkb3VibGUgKnkwLCBkb3VibGUgKmNvbG9yMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqeDEsIGRvdWJsZSAqeTEsIGRvdWJsZSAqY29sb3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp4MiwgZG91YmxlICp5MiwgZG91YmxlICpjb2xvcjIpIG92ZXJyaWRlCiAgeyByZXR1cm4gc2hhZGluZy0+Z2V0VHJpYW5nbGUoaSwgeDAsIHkwLCBjb2xvcjAsIHgxLCB5MSwgY29sb3IxLCB4MiwgeTIsIGNvbG9yMik7IH0KCiAgdm9pZCBnZXRQYXJhbWV0ZXJpemVkQ29sb3IoZG91YmxlIHQsIFNwbGFzaENvbG9yTW9kZSBtb2RlLCBTcGxhc2hDb2xvclB0ciBjKSBvdmVycmlkZTsKCnByaXZhdGU6CiAgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZyAqc2hhZGluZzsKICBHZnhTdGF0ZSAqc3RhdGU7CiAgR0Jvb2wgYkRpcmVjdENvbG9yVHJhbnNsYXRpb247CiAgU3BsYXNoQ29sb3JNb2RlIG1vZGU7CiAgR2Z4Q29sb3JTcGFjZU1vZGUgZ2Z4TW9kZTsKfTsKCi8vIHNlZSBHZnhTdGF0ZS5oLCBHZnhSYWRpYWxTaGFkaW5nCmNsYXNzIFNwbGFzaFJhZGlhbFBhdHRlcm46IHB1YmxpYyBTcGxhc2hVbml2YXJpYXRlUGF0dGVybiB7CnB1YmxpYzoKCiAgU3BsYXNoUmFkaWFsUGF0dGVybihTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeFJhZGlhbFNoYWRpbmcgKnNoYWRpbmcpOwoKICBTcGxhc2hQYXR0ZXJuICpjb3B5KCkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IFNwbGFzaFJhZGlhbFBhdHRlcm4oY29sb3JNb2RlLCBzdGF0ZSwgKEdmeFJhZGlhbFNoYWRpbmcgKikgc2hhZGluZyk7IH0KCiAgflNwbGFzaFJhZGlhbFBhdHRlcm4oKTsKCiAgR0Jvb2wgZ2V0UGFyYW1ldGVyKGRvdWJsZSB4cywgZG91YmxlIHlzLCBkb3VibGUgKnQpIG92ZXJyaWRlOwoKcHJpdmF0ZToKICBkb3VibGUgeDAsIHkwLCByMCwgZHgsIGR5LCBkcjsKICBkb3VibGUgYSwgaW52YTsKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBudW1iZXIgb2YgVHlwZSAzIGZvbnRzIHRvIGNhY2hlCiNkZWZpbmUgc3BsYXNoT3V0VDNGb250Q2FjaGVTaXplIDgKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaE91dHB1dERldgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoT3V0cHV0RGV2OiBwdWJsaWMgT3V0cHV0RGV2IHsKcHVibGljOgoKICAvLyBDb25zdHJ1Y3Rvci4KICBTcGxhc2hPdXRwdXREZXYoU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZUEsIGludCBiaXRtYXBSb3dQYWRBLAoJCSAgR0Jvb2wgcmV2ZXJzZVZpZGVvQSwgU3BsYXNoQ29sb3JQdHIgcGFwZXJDb2xvckEsCgkJICBHQm9vbCBiaXRtYXBUb3BEb3duQSA9IGdUcnVlLAoJCSAgU3BsYXNoVGhpbkxpbmVNb2RlIHRoaW5MaW5lTW9kZSA9IHNwbGFzaFRoaW5MaW5lRGVmYXVsdCwKCQkgIEdCb29sIG92ZXJwcmludFByZXZpZXdBID0gZ2xvYmFsUGFyYW1zLT5nZXRPdmVycHJpbnRQcmV2aWV3KCkpOwoKICAvLyBEZXN0cnVjdG9yLgogIH5TcGxhc2hPdXRwdXREZXYoKTsKCiAgLy8tLS0tLSBnZXQgaW5mbyBhYm91dCBvdXRwdXQgZGV2aWNlCgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIHRpbGluZ1BhdHRlcm5GaWxsKCk/ICBJZiB0aGlzIHJldHVybnMgZmFsc2UsCiAgLy8gdGlsaW5nIHBhdHRlcm4gZmlsbHMgd2lsbCBiZSByZWR1Y2VkIHRvIGEgc2VyaWVzIG9mIG90aGVyIGRyYXdpbmcKICAvLyBvcGVyYXRpb25zLgogIEdCb29sIHVzZVRpbGluZ1BhdHRlcm5GaWxsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ1RydWU7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgZnVuY3Rpb25TaGFkZWRGaWxsKCksIGF4aWFsU2hhZGVkRmlsbCgpLCBhbmQKICAvLyByYWRpYWxTaGFkZWRGaWxsKCk/ICBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZXNlIHNoYWRlZCBmaWxscwogIC8vIHdpbGwgYmUgcmVkdWNlZCB0byBhIHNlcmllcyBvZiBvdGhlciBkcmF3aW5nIG9wZXJhdGlvbnMuCiAgR0Jvb2wgdXNlU2hhZGVkRmlsbHMoaW50IHR5cGUpIG92ZXJyaWRlCiAgeyByZXR1cm4gKHR5cGUgPj0gMSAmJiB0eXBlIDw9IDUpID8gZ1RydWUgOiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgdXBzaWRlLWRvd24gY29vcmRpbmF0ZXM/CiAgLy8gKFVwc2lkZS1kb3duIG1lYW5zICgwLDApIGlzIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHBhZ2UuKQogIEdCb29sIHVwc2lkZURvd24oKSBvdmVycmlkZSB7IHJldHVybiBiaXRtYXBUb3BEb3duIF4gYml0bWFwVXBzaWRlRG93bjsgfQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBkcmF3Q2hhcigpIG9yIGRyYXdTdHJpbmcoKT8KICBHQm9vbCB1c2VEcmF3Q2hhcigpIG92ZXJyaWRlIHsgcmV0dXJuIGdUcnVlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGJlZ2luVHlwZTNDaGFyL2VuZFR5cGUzQ2hhcj8gIE90aGVyd2lzZSwKICAvLyB0ZXh0IGluIFR5cGUgMyBmb250cyB3aWxsIGJlIGRyYXduIHdpdGggZHJhd0NoYXIvZHJhd1N0cmluZy4KICBHQm9vbCBpbnRlcnByZXRUeXBlM0NoYXJzKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ1RydWU7IH0KCiAgLy8tLS0tLSBpbml0aWFsaXphdGlvbiBhbmQgY29udHJvbAoKICAvLyBTdGFydCBhIHBhZ2UuCiAgdm9pZCBzdGFydFBhZ2UoaW50IHBhZ2VOdW0sIEdmeFN0YXRlICpzdGF0ZSwgWFJlZiAqeHJlZikgb3ZlcnJpZGU7CgogIC8vIEVuZCBhIHBhZ2UuCiAgdm9pZCBlbmRQYWdlKCkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gc2F2ZS9yZXN0b3JlIGdyYXBoaWNzIHN0YXRlCiAgdm9pZCBzYXZlU3RhdGUoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHJlc3RvcmVTdGF0ZShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwoKICAvLy0tLS0tIHVwZGF0ZSBncmFwaGljcyBzdGF0ZQogIHZvaWQgdXBkYXRlQWxsKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVDVE0oR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgbTExLCBkb3VibGUgbTEyLAoJCQkgZG91YmxlIG0yMSwgZG91YmxlIG0yMiwgZG91YmxlIG0zMSwgZG91YmxlIG0zMikgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVMaW5lRGFzaChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlRmxhdG5lc3MoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUxpbmVKb2luKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVMaW5lQ2FwKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVNaXRlckxpbWl0KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVMaW5lV2lkdGgoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZVN0cm9rZUFkanVzdChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlRmlsbENvbG9yU3BhY2UoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZVN0cm9rZUNvbG9yU3BhY2UoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUZpbGxDb2xvcihHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlU3Ryb2tlQ29sb3IoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUJsZW5kTW9kZShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlRmlsbE9wYWNpdHkoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZVN0cm9rZU9wYWNpdHkoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZVBhdHRlcm5PcGFjaXR5KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBjbGVhclBhdHRlcm5PcGFjaXR5KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVGaWxsT3ZlcnByaW50KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVTdHJva2VPdmVycHJpbnQoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZU92ZXJwcmludE1vZGUoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZVRyYW5zZmVyKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gdXBkYXRlIHRleHQgc3RhdGUKICB2b2lkIHVwZGF0ZUZvbnQoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSBwYXRoIHBhaW50aW5nCiAgdm9pZCBzdHJva2UoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIGZpbGwoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIGVvRmlsbChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIEdCb29sIHRpbGluZ1BhdHRlcm5GaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4ICpnZngsIENhdGFsb2cgKmNhdGFsb2csIE9iamVjdCAqc3RyLAoJCQkJICBkb3VibGUgKnBtYXQsIGludCBwYWludFR5cGUsIGludCB0aWxpbmdUeXBlLCBEaWN0ICpyZXNEaWN0LAoJCQkJICBkb3VibGUgKm1hdCwgZG91YmxlICpiYm94LAoJCQkJICBpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEsCgkJCQkgIGRvdWJsZSB4U3RlcCwgZG91YmxlIHlTdGVwKSBvdmVycmlkZTsKICBHQm9vbCBmdW5jdGlvblNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnhGdW5jdGlvblNoYWRpbmcgKnNoYWRpbmcpIG92ZXJyaWRlOwogIEdCb29sIGF4aWFsU2hhZGVkRmlsbChHZnhTdGF0ZSAqc3RhdGUsIEdmeEF4aWFsU2hhZGluZyAqc2hhZGluZywgZG91YmxlIHRNaW4sIGRvdWJsZSB0TWF4KSBvdmVycmlkZTsKICBHQm9vbCByYWRpYWxTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4UmFkaWFsU2hhZGluZyAqc2hhZGluZywgZG91YmxlIHRNaW4sIGRvdWJsZSB0TWF4KSBvdmVycmlkZTsKICBHQm9vbCBnb3VyYXVkVHJpYW5nbGVTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZyAqc2hhZGluZykgb3ZlcnJpZGU7CgogIC8vLS0tLS0gcGF0aCBjbGlwcGluZwogIHZvaWQgY2xpcChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgZW9DbGlwKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBjbGlwVG9TdHJva2VQYXRoKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gdGV4dCBkcmF3aW5nCiAgdm9pZCBkcmF3Q2hhcihHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSB4LCBkb3VibGUgeSwKCQkJZG91YmxlIGR4LCBkb3VibGUgZHksCgkJCWRvdWJsZSBvcmlnaW5YLCBkb3VibGUgb3JpZ2luWSwKCQkJQ2hhckNvZGUgY29kZSwgaW50IG5CeXRlcywgVW5pY29kZSAqdSwgaW50IHVMZW4pIG92ZXJyaWRlOwogIEdCb29sIGJlZ2luVHlwZTNDaGFyKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHgsIGRvdWJsZSB5LAoJCQkgICAgICAgZG91YmxlIGR4LCBkb3VibGUgZHksCgkJCSAgICAgICBDaGFyQ29kZSBjb2RlLCBVbmljb2RlICp1LCBpbnQgdUxlbikgb3ZlcnJpZGU7CiAgdm9pZCBlbmRUeXBlM0NoYXIoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIGJlZ2luVGV4dE9iamVjdChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgZW5kVGV4dE9iamVjdChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwoKICAvLy0tLS0tIGltYWdlIGRyYXdpbmcKICB2b2lkIGRyYXdJbWFnZU1hc2soR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBHQm9vbCBpbnZlcnQsCgkJCSAgICAgR0Jvb2wgaW50ZXJwb2xhdGUsIEdCb29sIGlubGluZUltZykgb3ZlcnJpZGU7CiAgdm9pZCBzZXRTb2Z0TWFza0Zyb21JbWFnZU1hc2soR2Z4U3RhdGUgKnN0YXRlLAoJCQkJCU9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdCb29sIGludmVydCwKCQkJCQlHQm9vbCBpbmxpbmVJbWcsIGRvdWJsZSAqYmFzZU1hdHJpeCkgb3ZlcnJpZGU7CiAgdm9pZCB1bnNldFNvZnRNYXNrRnJvbUltYWdlTWFzayhHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSAqYmFzZU1hdHJpeCkgb3ZlcnJpZGU7CiAgdm9pZCBkcmF3SW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLAoJCQkgR0Jvb2wgaW50ZXJwb2xhdGUsIGludCAqbWFza0NvbG9ycywgR0Jvb2wgaW5saW5lSW1nKSBvdmVycmlkZTsKICB2b2lkIGRyYXdNYXNrZWRJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkJICAgICAgIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLAoJCQkgICAgICAgR0Jvb2wgaW50ZXJwb2xhdGUsCgkJCSAgICAgICBTdHJlYW0gKm1hc2tTdHIsIGludCBtYXNrV2lkdGgsIGludCBtYXNrSGVpZ2h0LAoJCQkgICAgICAgR0Jvb2wgbWFza0ludmVydCwgR0Jvb2wgbWFza0ludGVycG9sYXRlKSBvdmVycmlkZTsKICB2b2lkIGRyYXdTb2Z0TWFza2VkSW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCQkgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJCQkgICBHZnhJbWFnZUNvbG9yTWFwICpjb2xvck1hcCwKCQkJCSAgIEdCb29sIGludGVycG9sYXRlLAoJCQkJICAgU3RyZWFtICptYXNrU3RyLAoJCQkJICAgaW50IG1hc2tXaWR0aCwgaW50IG1hc2tIZWlnaHQsCgkJCQkgICBHZnhJbWFnZUNvbG9yTWFwICptYXNrQ29sb3JNYXAsCgkJCQkgICBHQm9vbCBtYXNrSW50ZXJwb2xhdGUpIG92ZXJyaWRlOwoKICAvLy0tLS0tIFR5cGUgMyBmb250IG9wZXJhdG9ycwogIHZvaWQgdHlwZTNEMChHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSB3eCwgZG91YmxlIHd5KSBvdmVycmlkZTsKICB2b2lkIHR5cGUzRDEoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgd3gsIGRvdWJsZSB3eSwKCQkgICAgICAgZG91YmxlIGxseCwgZG91YmxlIGxseSwgZG91YmxlIHVyeCwgZG91YmxlIHVyeSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gdHJhbnNwYXJlbmN5IGdyb3VwcyBhbmQgc29mdCBtYXNrcwogIEdCb29sIGNoZWNrVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKnN0YXRlLCBHQm9vbCBrbm9ja291dCkgb3ZlcnJpZGU7CiAgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUdyb3VwKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlICpiYm94LAoJCQkJICAgICAgR2Z4Q29sb3JTcGFjZSAqYmxlbmRpbmdDb2xvclNwYWNlLAoJCQkJICAgICAgR0Jvb2wgaXNvbGF0ZWQsIEdCb29sIGtub2Nrb3V0LAoJCQkJICAgICAgR0Jvb2wgZm9yU29mdE1hc2spIG92ZXJyaWRlOwogIHZvaWQgZW5kVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHBhaW50VHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgKmJib3gpIG92ZXJyaWRlOwogIHZvaWQgc2V0U29mdE1hc2soR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgKmJib3gsIEdCb29sIGFscGhhLAoJCQkgICBGdW5jdGlvbiAqdHJhbnNmZXJGdW5jLCBHZnhDb2xvciAqYmFja2Ryb3BDb2xvcikgb3ZlcnJpZGU7CiAgdm9pZCBjbGVhclNvZnRNYXNrKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gc3BlY2lhbCBhY2Nlc3MKCiAgLy8gQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgUERGIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZC4KICB2b2lkIHN0YXJ0RG9jKFBERkRvYyAqZG9jQSk7CiAKICB2b2lkIHNldFBhcGVyQ29sb3IoU3BsYXNoQ29sb3JQdHIgcGFwZXJDb2xvckEpOwoKICBHQm9vbCBpc1JldmVyc2VWaWRlbygpIHsgcmV0dXJuIHJldmVyc2VWaWRlbzsgfQogIHZvaWQgc2V0UmV2ZXJzZVZpZGVvKEdCb29sIHJldmVyc2VWaWRlb0EpIHsgcmV2ZXJzZVZpZGVvID0gcmV2ZXJzZVZpZGVvQTsgfQoKICAvLyBHZXQgdGhlIGJpdG1hcCBhbmQgaXRzIHNpemUuCiAgU3BsYXNoQml0bWFwICpnZXRCaXRtYXAoKSB7IHJldHVybiBiaXRtYXA7IH0KICBpbnQgZ2V0Qml0bWFwV2lkdGgoKTsKICBpbnQgZ2V0Qml0bWFwSGVpZ2h0KCk7CgogIC8vIFJldHVybnMgdGhlIGxhc3QgcmFzdGVyaXplZCBiaXRtYXAsIHRyYW5zZmVycmluZyBvd25lcnNoaXAgdG8gdGhlCiAgLy8gY2FsbGVyLgogIFNwbGFzaEJpdG1hcCAqdGFrZUJpdG1hcCgpOwoKICAvLyBTZXQgdGhpcyBmbGFnIHRvIHRydWUgdG8gZ2VuZXJhdGUgYW4gdXBzaWRlLWRvd24gYml0bWFwICh1c2VmdWwKICAvLyBmb3IgV2luZG93cyBCTVAgZmlsZXMpLgogIHZvaWQgc2V0Qml0bWFwVXBzaWRlRG93bihHQm9vbCBmKSB7IGJpdG1hcFVwc2lkZURvd24gPSBmOyB9CgogIC8vIEdldCB0aGUgU3BsYXNoIG9iamVjdC4KICBTcGxhc2ggKmdldFNwbGFzaCgpIHsgcmV0dXJuIHNwbGFzaDsgfQoKICAvLyBHZXQgdGhlIG1vZGlmaWVkIHJlZ2lvbi4KICB2b2lkIGdldE1vZFJlZ2lvbihpbnQgKnhNaW4sIGludCAqeU1pbiwgaW50ICp4TWF4LCBpbnQgKnlNYXgpOwoKICAvLyBDbGVhciB0aGUgbW9kaWZpZWQgcmVnaW9uLgogIHZvaWQgY2xlYXJNb2RSZWdpb24oKTsKCiAgU3BsYXNoRm9udCAqZ2V0Q3VycmVudEZvbnQoKSB7IHJldHVybiBmb250OyB9CgogIC8vIElmIDxza2lwVGV4dEE+IGlzIHRydWUsIGRvbid0IGRyYXcgaG9yaXpvbnRhbCB0ZXh0LgogIC8vIElmIDxza2lwUm90YXRlZFRleHRBPiBpcyB0cnVlLCBkb24ndCBkcmF3IHJvdGF0ZWQgKG5vbi1ob3Jpem9udGFsKSB0ZXh0LgogIHZvaWQgc2V0U2tpcFRleHQoR0Jvb2wgc2tpcEhvcml6VGV4dEEsIEdCb29sIHNraXBSb3RhdGVkVGV4dEEpCiAgICB7IHNraXBIb3JpelRleHQgPSBza2lwSG9yaXpUZXh0QTsgc2tpcFJvdGF0ZWRUZXh0ID0gc2tpcFJvdGF0ZWRUZXh0QTsgfQoKICBpbnQgZ2V0TmVzdENvdW50KCkgeyByZXR1cm4gbmVzdENvdW50OyB9CgojaWYgMSAvL350bXA6IHR1cm4gb2ZmIGFudGktYWxpYXNpbmcgdGVtcG9yYXJpbHkKICBHQm9vbCBnZXRWZWN0b3JBbnRpYWxpYXMoKSBvdmVycmlkZTsKICB2b2lkIHNldFZlY3RvckFudGlhbGlhcyhHQm9vbCB2YWEpIG92ZXJyaWRlOwojZW5kaWYKCiAgR0Jvb2wgZ2V0Rm9udEFudGlhbGlhcygpIHsgcmV0dXJuIGZvbnRBbnRpYWxpYXM7IH0KICB2b2lkIHNldEZvbnRBbnRpYWxpYXMoR0Jvb2wgYW50aSkgeyBmb250QW50aWFsaWFzID0gYW50aTsgfQoKICB2b2lkIHNldEZyZWVUeXBlSGludGluZyhHQm9vbCBlbmFibGUsIEdCb29sIGVuYWJsZVNsaWdodEhpbnRpbmcpOwoKcHJvdGVjdGVkOgogIHZvaWQgZG9VcGRhdGVGb250KEdmeFN0YXRlICpzdGF0ZSk7Cgpwcml2YXRlOgogIEdCb29sIHVuaXZhcmlhdGVTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgU3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm4gKnBhdHRlcm4sIGRvdWJsZSB0TWluLCBkb3VibGUgdE1heCk7CgogIHZvaWQgc2V0dXBTY3JlZW5QYXJhbXMoZG91YmxlIGhEUEksIGRvdWJsZSB2RFBJKTsKICBTcGxhc2hQYXR0ZXJuICpnZXRDb2xvcihHZnhHcmF5IGdyYXkpOwogIFNwbGFzaFBhdHRlcm4gKmdldENvbG9yKEdmeFJHQiAqcmdiKTsKI2lmZGVmIFNQTEFTSF9DTVlLCiAgU3BsYXNoUGF0dGVybiAqZ2V0Q29sb3IoR2Z4Q01ZSyAqY215ayk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0Q29sb3IoR2Z4Q29sb3IgKmRldmljZU4pOwojZW5kaWYKICB2b2lkIGdldE1hdHRlQ29sb3IoIFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGUsIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLCBHZnhDb2xvciAqIG1hdHRlQ29sb3IsIFNwbGFzaENvbG9yIHNwbGFzaE1hdHRlQ29sb3IpOwogIHZvaWQgc2V0T3ZlcnByaW50TWFzayhHZnhDb2xvclNwYWNlICpjb2xvclNwYWNlLCBHQm9vbCBvdmVycHJpbnRGbGFnLAoJCQlpbnQgb3ZlcnByaW50TW9kZSwgR2Z4Q29sb3IgKnNpbmdsZUNvbG9yLCBHQm9vbCBncmF5SW5kZXhlZCA9IGdGYWxzZSk7CiAgU3BsYXNoUGF0aCAqY29udmVydFBhdGgoR2Z4U3RhdGUgKnN0YXRlLCBHZnhQYXRoICpwYXRoLAoJCQkgIEdCb29sIGRyb3BFbXB0eVN1YnBhdGhzKTsKICB2b2lkIGRyYXdUeXBlM0dseXBoKEdmeFN0YXRlICpzdGF0ZSwgVDNGb250Q2FjaGUgKnQzRm9udCwKCQkgICAgICBUM0ZvbnRDYWNoZVRhZyAqdGFnLCBHdWNoYXIgKmRhdGEpOwojaWZkZWYgVVNFX0NNUwogIEdCb29sIHVzZUljY0ltYWdlU3JjKHZvaWQgKmRhdGEpOwogIHN0YXRpYyB2b2lkIGljY1RyYW5zZm9ybSh2b2lkICpkYXRhLCBTcGxhc2hCaXRtYXAgKmJpdG1hcCk7CiAgc3RhdGljIEdCb29sIGljY0ltYWdlU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJR3VjaGFyICphbHBoYUxpbmUpOwojZW5kaWYKICBzdGF0aWMgR0Jvb2wgaW1hZ2VNYXNrU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGxpbmUpOwogIHN0YXRpYyBHQm9vbCBpbWFnZVNyYyh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBjb2xvckxpbmUsCgkJCUd1Y2hhciAqYWxwaGFMaW5lKTsKICBzdGF0aWMgR0Jvb2wgYWxwaGFJbWFnZVNyYyh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBsaW5lLAoJCQkgICAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKICBzdGF0aWMgR0Jvb2wgbWFza2VkSW1hZ2VTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgbGluZSwKCQkJICAgICAgR3VjaGFyICphbHBoYUxpbmUpOwogIHN0YXRpYyBHQm9vbCB0aWxpbmdCaXRtYXBTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgbGluZSwKCQkJICAgICBHdWNoYXIgKmFscGhhTGluZSk7CgogIEdCb29sIGtlZXBBbHBoYUNoYW5uZWw7CS8vIGRvbid0IGZpbGwgd2l0aCBwYXBlciBjb2xvciwga2VlcCBhbHBoYSBjaGFubmVsCgogIFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGU7CiAgaW50IGJpdG1hcFJvd1BhZDsKICBHQm9vbCBiaXRtYXBUb3BEb3duOwogIEdCb29sIGJpdG1hcFVwc2lkZURvd247CiAgR0Jvb2wgZm9udEFudGlhbGlhczsKICBHQm9vbCB2ZWN0b3JBbnRpYWxpYXM7CiAgR0Jvb2wgb3ZlcnByaW50UHJldmlldzsKICBHQm9vbCBlbmFibGVGcmVlVHlwZUhpbnRpbmc7CiAgR0Jvb2wgZW5hYmxlU2xpZ2h0SGludGluZzsKICBHQm9vbCByZXZlcnNlVmlkZW87CQkvLyByZXZlcnNlIHZpZGVvIG1vZGUKICBTcGxhc2hDb2xvciBwYXBlckNvbG9yOwkvLyBwYXBlciBjb2xvcgogIFNwbGFzaFNjcmVlblBhcmFtcyBzY3JlZW5QYXJhbXM7CiAgR0Jvb2wgc2tpcEhvcml6VGV4dDsKICBHQm9vbCBza2lwUm90YXRlZFRleHQ7CgogIFBERkRvYyAqZG9jOwkJCS8vIHRoZSBjdXJyZW50IGRvY3VtZW50CiAgWFJlZiAqeHJlZjsgICAgICAgLy8gdGhlIHhyZWYgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKCiAgU3BsYXNoQml0bWFwICpiaXRtYXA7CiAgU3BsYXNoICpzcGxhc2g7CiAgU3BsYXNoRm9udEVuZ2luZSAqZm9udEVuZ2luZTsKCiAgVDNGb250Q2FjaGUgKgkJCS8vIFR5cGUgMyBmb250IGNhY2hlCiAgICB0M0ZvbnRDYWNoZVtzcGxhc2hPdXRUM0ZvbnRDYWNoZVNpemVdOwogIGludCBuVDNGb250czsJCQkvLyBudW1iZXIgb2YgdmFsaWQgZW50cmllcyBpbiB0M0ZvbnRDYWNoZQogIFQzR2x5cGhTdGFjayAqdDNHbHlwaFN0YWNrOwkvLyBUeXBlIDMgZ2x5cGggY29udGV4dCBzdGFjawoKICBTcGxhc2hGb250ICpmb250OwkJLy8gY3VycmVudCBmb250CiAgR0Jvb2wgbmVlZEZvbnRVcGRhdGU7CQkvLyBzZXQgd2hlbiB0aGUgZm9udCBuZWVkcyB0byBiZSB1cGRhdGVkCiAgU3BsYXNoUGF0aCAqdGV4dENsaXBQYXRoOwkvLyBjbGlwcGluZyBwYXRoIGJ1aWx0IHdpdGggdGV4dCBvYmplY3QKCiAgU3BsYXNoVHJhbnNwYXJlbmN5R3JvdXAgKgkvLyB0cmFuc3BhcmVuY3kgZ3JvdXAgc3RhY2sKICAgIHRyYW5zcEdyb3VwU3RhY2s7CiAgU3BsYXNoQml0bWFwICptYXNrQml0bWFwOyAvLyBmb3IgaW1hZ2UgbWFza3MgaW4gcGF0dGVybiBjb2xvcnNwYWNlCiAgaW50IG5lc3RDb3VudDsKfTsKCiNlbmRpZgo=