Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDIwMDMgR2x5cGggJiBDb2csIExMQwovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gTW9kaWZpZWQgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCAtIGh0dHA6Ly9wb3BwbGVyLmZyZWVkZXNrdG9wLm9yZwovLwovLyBBbGwgY2hhbmdlcyBtYWRlIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgdG8gdGhpcyBmaWxlIGFyZSBsaWNlbnNlZAovLyB1bmRlciBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyCi8vCi8vIENvcHlyaWdodCAoQykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgQ2FybG9zIEdhcmNpYSBDYW1wb3MgPGNhcmxvc2djQGdub21lLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYXMgSGFydG1ldHogPGFoYXJ0bWV0ekBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTEgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSE9VVFBVVERFVl9ICiNkZWZpbmUgU1BMQVNIT1VUUFVUREVWX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSAiZ29vL2d0eXBlcy5oIgojaW5jbHVkZSAic3BsYXNoL1NwbGFzaFR5cGVzLmgiCiNpbmNsdWRlICJzcGxhc2gvU3BsYXNoUGF0dGVybi5oIgojaW5jbHVkZSAicG9wcGxlci1jb25maWcuaCIKI2luY2x1ZGUgIk91dHB1dERldi5oIgojaW5jbHVkZSAiR2Z4U3RhdGUuaCIKCmNsYXNzIEdmeDhCaXRGb250OwpjbGFzcyBTcGxhc2hCaXRtYXA7CmNsYXNzIFNwbGFzaDsKY2xhc3MgU3BsYXNoUGF0aDsKY2xhc3MgU3BsYXNoRm9udEVuZ2luZTsKY2xhc3MgU3BsYXNoRm9udDsKY2xhc3MgVDNGb250Q2FjaGU7CnN0cnVjdCBUM0ZvbnRDYWNoZVRhZzsKc3RydWN0IFQzR2x5cGhTdGFjazsKc3RydWN0IFNwbGFzaFRyYW5zcGFyZW5jeUdyb3VwOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoT3ZlcnByaW50Q29sb3IKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIFNwbGFzaE92ZXJwcmludENvbG9yOiBwdWJsaWMgU3BsYXNoUGF0dGVybiB7CnB1YmxpYzoKICBTcGxhc2hPdmVycHJpbnRDb2xvcihHZnhDb2xvclNwYWNlICpjb2xvclNwYWNlLCBTcGxhc2hDb2xvclB0ciBjb2xvckEsIEd1Y2hhciB0b2xlcmFuY2UpOwoKICB2aXJ0dWFsIFNwbGFzaFBhdHRlcm4gKmNvcHkoKSB7IHJldHVybiBuZXcgU3BsYXNoT3ZlcnByaW50Q29sb3IoY29sb3JTcGFjZSwgY29sb3IsIHRvbGVyYW5jZSk7IH0KCiAgdmlydHVhbCB+U3BsYXNoT3ZlcnByaW50Q29sb3IoKTsKCiAgdmlydHVhbCBHQm9vbCBnZXRDb2xvcihpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIGMpOwoKICB2aXJ0dWFsIEdCb29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpIHsgcmV0dXJuIGdGYWxzZTsgfQoKICB2aXJ0dWFsIEdCb29sIGlzU3RhdGljKCkgeyByZXR1cm4gZ1RydWU7IH0KCiAgdmlydHVhbCB2b2lkIG92ZXJwcmludChHQm9vbCBvcCwgR3VjaGFyIGFscGhhU3JjLCBTcGxhc2hDb2xvclB0ciBjb2xvclNyYywgCiAgICAgICAgICAgICAgICAgICAgICAgICBHdWNoYXIgYWxwaGFEZXN0LCBTcGxhc2hDb2xvclB0ciBjb2xvckRlc3QsIFNwbGFzaENvbG9yUHRyIGNvbG9yUmVzdWx0KTsKCnByaXZhdGU6CiAgR2Z4Q29sb3JTcGFjZSAqY29sb3JTcGFjZTsKICBTcGxhc2hDb2xvciBjb2xvcjsKICBHdWNoYXIgdG9sZXJhbmNlOwp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoIGR5bmFtaWMgcGF0dGVybgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm46IHB1YmxpYyBTcGxhc2hQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hVbml2YXJpYXRlUGF0dGVybihTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeFVuaXZhcmlhdGVTaGFkaW5nICpzaGFkaW5nKTsKCiAgdmlydHVhbCB+U3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm4oKTsKCiAgdmlydHVhbCBHQm9vbCBnZXRDb2xvcihpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIGMpOwoKICB2aXJ0dWFsIEdCb29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpOwoKICB2aXJ0dWFsIEdCb29sIGlzU3RhdGljKCkgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIHZpcnR1YWwgR0Jvb2wgZ2V0UGFyYW1ldGVyKGRvdWJsZSB4cywgZG91YmxlIHlzLCBkb3VibGUgKnQpID0gMDsKCiAgdmlydHVhbCBHZnhVbml2YXJpYXRlU2hhZGluZyAqZ2V0U2hhZGluZygpIHsgcmV0dXJuIHNoYWRpbmc7IH0KCnByb3RlY3RlZDoKICBNYXRyaXggaWN0bTsKICBkb3VibGUgdDAsIHQxLCBkdDsKICBHZnhVbml2YXJpYXRlU2hhZGluZyAqc2hhZGluZzsKICBHZnhTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZTsKfTsKCmNsYXNzIFNwbGFzaEF4aWFsUGF0dGVybjogcHVibGljIFNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hBeGlhbFBhdHRlcm4oU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4U3RhdGUgKnN0YXRlLCBHZnhBeGlhbFNoYWRpbmcgKnNoYWRpbmcpOwoKICB2aXJ0dWFsIFNwbGFzaFBhdHRlcm4gKmNvcHkoKSB7IHJldHVybiBuZXcgU3BsYXNoQXhpYWxQYXR0ZXJuKGNvbG9yTW9kZSwgc3RhdGUsIChHZnhBeGlhbFNoYWRpbmcgKikgc2hhZGluZyk7IH0KCiAgdmlydHVhbCB+U3BsYXNoQXhpYWxQYXR0ZXJuKCk7CgogIHZpcnR1YWwgR0Jvb2wgZ2V0UGFyYW1ldGVyKGRvdWJsZSB4cywgZG91YmxlIHlzLCBkb3VibGUgKnQpOwoKICB2aXJ0dWFsIHZvaWQgb3ZlcnByaW50KEdCb29sIG9wLCBHdWNoYXIgYWxwaGFTcmMsIFNwbGFzaENvbG9yUHRyIGNvbG9yU3JjLCAKICAgICAgICAgICAgICAgICAgICAgICAgIEd1Y2hhciBhbHBoYURlc3QsIFNwbGFzaENvbG9yUHRyIGNvbG9yRGVzdCwgU3BsYXNoQ29sb3JQdHIgY29sb3JSZXN1bHQpOwoKcHJpdmF0ZToKICBkb3VibGUgeDAsIHkwLCB4MSwgeTE7CiAgZG91YmxlIGR4LCBkeSwgbXVsOwogIFNwbGFzaE92ZXJwcmludENvbG9yICpvcFBhdHRlcm47Cn07CgovLyBzZWUgR2Z4U3RhdGUuaCwgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZwpjbGFzcyBTcGxhc2hHb3VyYXVkUGF0dGVybjogcHVibGljIFNwbGFzaEdvdXJhdWRDb2xvciB7CnB1YmxpYzoKCiAgU3BsYXNoR291cmF1ZFBhdHRlcm4oR0Jvb2wgYkRpcmVjdENvbG9yVHJhbnNsYXRpb24sIEdmeFN0YXRlICpzdGF0ZSwgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZyAqc2hhZGluZywgU3BsYXNoQ29sb3JNb2RlIG1vZGUpOwoKICB2aXJ0dWFsIFNwbGFzaFBhdHRlcm4gKmNvcHkoKSB7IHJldHVybiBuZXcgU3BsYXNoR291cmF1ZFBhdHRlcm4oYkRpcmVjdENvbG9yVHJhbnNsYXRpb24sIHN0YXRlLCBzaGFkaW5nLCBtb2RlKTsgfQoKICB2aXJ0dWFsIH5TcGxhc2hHb3VyYXVkUGF0dGVybigpOwoKICB2aXJ0dWFsIEdCb29sIGdldENvbG9yKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgYykgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIHZpcnR1YWwgR0Jvb2wgdGVzdFBvc2l0aW9uKGludCB4LCBpbnQgeSkgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIHZpcnR1YWwgR0Jvb2wgaXNTdGF0aWMoKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgdmlydHVhbCBHQm9vbCBpc1BhcmFtZXRlcml6ZWQoKSB7IHJldHVybiBzaGFkaW5nLT5pc1BhcmFtZXRlcml6ZWQoKTsgfQogIHZpcnR1YWwgaW50IGdldE5UcmlhbmdsZXMoKSB7IHJldHVybiBzaGFkaW5nLT5nZXROVHJpYW5nbGVzKCk7IH0KICB2aXJ0dWFsICB2b2lkIGdldFRyaWFuZ2xlKGludCBpLCBkb3VibGUgKngwLCBkb3VibGUgKnkwLCBkb3VibGUgKmNvbG9yMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqeDEsIGRvdWJsZSAqeTEsIGRvdWJsZSAqY29sb3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp4MiwgZG91YmxlICp5MiwgZG91YmxlICpjb2xvcjIpCiAgeyByZXR1cm4gc2hhZGluZy0+Z2V0VHJpYW5nbGUoaSwgeDAsIHkwLCBjb2xvcjAsIHgxLCB5MSwgY29sb3IxLCB4MiwgeTIsIGNvbG9yMik7IH0KCiAgdmlydHVhbCB2b2lkIGdldFBhcmFtZXRlcml6ZWRDb2xvcihkb3VibGUgdCwgU3BsYXNoQ29sb3JNb2RlIG1vZGUsIFNwbGFzaENvbG9yUHRyIGMpOwoKICB2aXJ0dWFsIHZvaWQgb3ZlcnByaW50KEdCb29sIG9wLCBHdWNoYXIgYWxwaGFTcmMsIFNwbGFzaENvbG9yUHRyIGNvbG9yU3JjLCAKICAgICAgICAgICAgICAgICAgICAgICAgIEd1Y2hhciBhbHBoYURlc3QsIFNwbGFzaENvbG9yUHRyIGNvbG9yRGVzdCwgU3BsYXNoQ29sb3JQdHIgY29sb3JSZXN1bHQpOwpwcml2YXRlOgogIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmcgKnNoYWRpbmc7CiAgR2Z4U3RhdGUgKnN0YXRlOwogIEdCb29sIGJEaXJlY3RDb2xvclRyYW5zbGF0aW9uOwogIFNwbGFzaE92ZXJwcmludENvbG9yICpvcFBhdHRlcm47CiAgU3BsYXNoQ29sb3JNb2RlIG1vZGU7Cn07CgovLyBzZWUgR2Z4U3RhdGUuaCwgR2Z4UmFkaWFsU2hhZGluZwpjbGFzcyBTcGxhc2hSYWRpYWxQYXR0ZXJuOiBwdWJsaWMgU3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm4gewpwdWJsaWM6CgogIFNwbGFzaFJhZGlhbFBhdHRlcm4oU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4U3RhdGUgKnN0YXRlLCBHZnhSYWRpYWxTaGFkaW5nICpzaGFkaW5nKTsKCiAgdmlydHVhbCBTcGxhc2hQYXR0ZXJuICpjb3B5KCkgeyByZXR1cm4gbmV3IFNwbGFzaFJhZGlhbFBhdHRlcm4oY29sb3JNb2RlLCBzdGF0ZSwgKEdmeFJhZGlhbFNoYWRpbmcgKikgc2hhZGluZyk7IH0KCiAgdmlydHVhbCB+U3BsYXNoUmFkaWFsUGF0dGVybigpOwoKICB2aXJ0dWFsIEdCb29sIGdldFBhcmFtZXRlcihkb3VibGUgeHMsIGRvdWJsZSB5cywgZG91YmxlICp0KTsKCiAgdmlydHVhbCB2b2lkIG92ZXJwcmludChHQm9vbCBvcCwgR3VjaGFyIGFscGhhU3JjLCBTcGxhc2hDb2xvclB0ciBjb2xvclNyYywgCiAgICAgICAgICAgICAgICAgICAgICAgICBHdWNoYXIgYWxwaGFEZXN0LCBTcGxhc2hDb2xvclB0ciBjb2xvckRlc3QsIFNwbGFzaENvbG9yUHRyIGNvbG9yUmVzdWx0KTsKCnByaXZhdGU6CiAgZG91YmxlIHgwLCB5MCwgcjAsIGR4LCBkeSwgZHI7CiAgZG91YmxlIGEsIGludmE7CiAgU3BsYXNoT3ZlcnByaW50Q29sb3IgKm9wUGF0dGVybjsKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBudW1iZXIgb2YgVHlwZSAzIGZvbnRzIHRvIGNhY2hlCiNkZWZpbmUgc3BsYXNoT3V0VDNGb250Q2FjaGVTaXplIDgKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaE91dHB1dERldgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoT3V0cHV0RGV2OiBwdWJsaWMgT3V0cHV0RGV2IHsKcHVibGljOgoKICAvLyBDb25zdHJ1Y3Rvci4KICBTcGxhc2hPdXRwdXREZXYoU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZUEsIGludCBiaXRtYXBSb3dQYWRBLAoJCSAgR0Jvb2wgcmV2ZXJzZVZpZGVvQSwgU3BsYXNoQ29sb3JQdHIgcGFwZXJDb2xvckEsCgkJICBHQm9vbCBiaXRtYXBUb3BEb3duQSA9IGdUcnVlLAoJCSAgR0Jvb2wgYWxsb3dBbnRpYWxpYXNBID0gZ1RydWUpOwoKICAvLyBEZXN0cnVjdG9yLgogIHZpcnR1YWwgflNwbGFzaE91dHB1dERldigpOwoKICAvLy0tLS0tIGdldCBpbmZvIGFib3V0IG91dHB1dCBkZXZpY2UKCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgdGlsaW5nUGF0dGVybkZpbGwoKT8gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwKICAvLyB0aWxpbmcgcGF0dGVybiBmaWxscyB3aWxsIGJlIHJlZHVjZWQgdG8gYSBzZXJpZXMgb2Ygb3RoZXIgZHJhd2luZwogIC8vIG9wZXJhdGlvbnMuCiAgdmlydHVhbCBHQm9vbCB1c2VUaWxpbmdQYXR0ZXJuRmlsbCgpIHsgcmV0dXJuIGdUcnVlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGZ1bmN0aW9uU2hhZGVkRmlsbCgpLCBheGlhbFNoYWRlZEZpbGwoKSwgYW5kCiAgLy8gcmFkaWFsU2hhZGVkRmlsbCgpPyAgSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGVzZSBzaGFkZWQgZmlsbHMKICAvLyB3aWxsIGJlIHJlZHVjZWQgdG8gYSBzZXJpZXMgb2Ygb3RoZXIgZHJhd2luZyBvcGVyYXRpb25zLgogIHZpcnR1YWwgR0Jvb2wgdXNlU2hhZGVkRmlsbHMoaW50IHR5cGUpCiAgeyByZXR1cm4gKHR5cGUgPj0gMiAmJiB0eXBlIDw9IDUpID8gZ1RydWUgOiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgdXBzaWRlLWRvd24gY29vcmRpbmF0ZXM/CiAgLy8gKFVwc2lkZS1kb3duIG1lYW5zICgwLDApIGlzIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHBhZ2UuKQogIHZpcnR1YWwgR0Jvb2wgdXBzaWRlRG93bigpIHsgcmV0dXJuIGdUcnVlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGRyYXdDaGFyKCkgb3IgZHJhd1N0cmluZygpPwogIHZpcnR1YWwgR0Jvb2wgdXNlRHJhd0NoYXIoKSB7IHJldHVybiBnVHJ1ZTsgfQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBiZWdpblR5cGUzQ2hhci9lbmRUeXBlM0NoYXI/ICBPdGhlcndpc2UsCiAgLy8gdGV4dCBpbiBUeXBlIDMgZm9udHMgd2lsbCBiZSBkcmF3biB3aXRoIGRyYXdDaGFyL2RyYXdTdHJpbmcuCiAgdmlydHVhbCBHQm9vbCBpbnRlcnByZXRUeXBlM0NoYXJzKCkgeyByZXR1cm4gZ1RydWU7IH0KCiAgLy8gVGhpcyBkZXZpY2Ugbm93IHN1cHBvcnRzIHRleHQgaW4gcGF0dGVybiBjb2xvcnNwYWNlIQogIHZpcnR1YWwgR0Jvb2wgc3VwcG9ydFRleHRDU1BhdHRlcm4oR2Z4U3RhdGUgKnN0YXRlKQogIAl7IHJldHVybiBzdGF0ZS0+Z2V0RmlsbENvbG9yU3BhY2UoKS0+Z2V0TW9kZSgpID09IGNzUGF0dGVybjsgfQoKICAvLy0tLS0tIGluaXRpYWxpemF0aW9uIGFuZCBjb250cm9sCgogIC8vIFN0YXJ0IGEgcGFnZS4KICB2aXJ0dWFsIHZvaWQgc3RhcnRQYWdlKGludCBwYWdlTnVtLCBHZnhTdGF0ZSAqc3RhdGUpOwoKICAvLyBFbmQgYSBwYWdlLgogIHZpcnR1YWwgdm9pZCBlbmRQYWdlKCk7CgogIC8vLS0tLS0gc2F2ZS9yZXN0b3JlIGdyYXBoaWNzIHN0YXRlCiAgdmlydHVhbCB2b2lkIHNhdmVTdGF0ZShHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCByZXN0b3JlU3RhdGUoR2Z4U3RhdGUgKnN0YXRlKTsKCiAgLy8tLS0tLSB1cGRhdGUgZ3JhcGhpY3Mgc3RhdGUKICB2aXJ0dWFsIHZvaWQgdXBkYXRlQWxsKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUNUTShHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSBtMTEsIGRvdWJsZSBtMTIsCgkJCSBkb3VibGUgbTIxLCBkb3VibGUgbTIyLCBkb3VibGUgbTMxLCBkb3VibGUgbTMyKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGluZURhc2goR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmxhdG5lc3MoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGluZUpvaW4oR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGluZUNhcChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVNaXRlckxpbWl0KEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUxpbmVXaWR0aChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VBZGp1c3QoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlsbENvbG9yKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0cm9rZUNvbG9yKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUJsZW5kTW9kZShHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVGaWxsT3BhY2l0eShHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VPcGFjaXR5KEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxPdmVycHJpbnQoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3Ryb2tlT3ZlcnByaW50KEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZU92ZXJwcmludE1vZGUoR2Z4U3RhdGUgKnN0YXRlKTsKCiAgLy8tLS0tLSB1cGRhdGUgdGV4dCBzdGF0ZQogIHZpcnR1YWwgdm9pZCB1cGRhdGVGb250KEdmeFN0YXRlICpzdGF0ZSk7CgogIC8vLS0tLS0gcGF0aCBwYWludGluZwogIHZpcnR1YWwgdm9pZCBzdHJva2UoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgZmlsbChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCBlb0ZpbGwoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIEdCb29sIHRpbGluZ1BhdHRlcm5GaWxsKEdmeFN0YXRlICpzdGF0ZSwgQ2F0YWxvZyAqY2F0YWxvZywgT2JqZWN0ICpzdHIsCgkJCQkgIGRvdWJsZSAqcG1hdCwgaW50IHBhaW50VHlwZSwgaW50IHRpbGluZ1R5cGUsIERpY3QgKnJlc0RpY3QsCgkJCQkgIGRvdWJsZSAqbWF0LCBkb3VibGUgKmJib3gsCgkJCQkgIGludCB4MCwgaW50IHkwLCBpbnQgeDEsIGludCB5MSwKCQkJCSAgZG91YmxlIHhTdGVwLCBkb3VibGUgeVN0ZXApOwogIHZpcnR1YWwgR0Jvb2wgYXhpYWxTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4QXhpYWxTaGFkaW5nICpzaGFkaW5nLCBkb3VibGUgdE1pbiwgZG91YmxlIHRNYXgpOwogIHZpcnR1YWwgR0Jvb2wgcmFkaWFsU2hhZGVkRmlsbChHZnhTdGF0ZSAqc3RhdGUsIEdmeFJhZGlhbFNoYWRpbmcgKnNoYWRpbmcsIGRvdWJsZSB0TWluLCBkb3VibGUgdE1heCk7CiAgdmlydHVhbCBHQm9vbCBnb3VyYXVkVHJpYW5nbGVTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZyAqc2hhZGluZyk7CgogIC8vLS0tLS0gcGF0aCBjbGlwcGluZwogIHZpcnR1YWwgdm9pZCBjbGlwKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIGVvQ2xpcChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCBjbGlwVG9TdHJva2VQYXRoKEdmeFN0YXRlICpzdGF0ZSk7CgogIC8vLS0tLS0gdGV4dCBkcmF3aW5nCiAgdmlydHVhbCB2b2lkIGRyYXdDaGFyKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHgsIGRvdWJsZSB5LAoJCQlkb3VibGUgZHgsIGRvdWJsZSBkeSwKCQkJZG91YmxlIG9yaWdpblgsIGRvdWJsZSBvcmlnaW5ZLAoJCQlDaGFyQ29kZSBjb2RlLCBpbnQgbkJ5dGVzLCBVbmljb2RlICp1LCBpbnQgdUxlbik7CiAgdmlydHVhbCBHQm9vbCBiZWdpblR5cGUzQ2hhcihHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSB4LCBkb3VibGUgeSwKCQkJICAgICAgIGRvdWJsZSBkeCwgZG91YmxlIGR5LAoJCQkgICAgICAgQ2hhckNvZGUgY29kZSwgVW5pY29kZSAqdSwgaW50IHVMZW4pOwogIHZpcnR1YWwgdm9pZCBlbmRUeXBlM0NoYXIoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgYmVnaW5UZXh0T2JqZWN0KEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCBHQm9vbCBkZXZpY2VIYXNUZXh0Q2xpcChHZnhTdGF0ZSAqc3RhdGUpIHsgcmV0dXJuIHRleHRDbGlwUGF0aCAmJiBoYXZlQ1NQYXR0ZXJuOyB9CiAgdmlydHVhbCB2b2lkIGVuZFRleHRPYmplY3QoR2Z4U3RhdGUgKnN0YXRlKTsKCiAgLy8tLS0tLSBpbWFnZSBkcmF3aW5nCiAgdmlydHVhbCB2b2lkIGRyYXdJbWFnZU1hc2soR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBHQm9vbCBpbnZlcnQsCgkJCSAgICAgR0Jvb2wgaW50ZXJwb2xhdGUsIEdCb29sIGlubGluZUltZyk7CiAgdmlydHVhbCB2b2lkIGRyYXdJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJIGludCB3aWR0aCwgaW50IGhlaWdodCwgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCSBHQm9vbCBpbnRlcnBvbGF0ZSwgaW50ICptYXNrQ29sb3JzLCBHQm9vbCBpbmxpbmVJbWcpOwogIHZpcnR1YWwgdm9pZCBkcmF3TWFza2VkSW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJCSAgICAgICBHZnhJbWFnZUNvbG9yTWFwICpjb2xvck1hcCwKCQkJICAgICAgIEdCb29sIGludGVycG9sYXRlLAoJCQkgICAgICAgU3RyZWFtICptYXNrU3RyLCBpbnQgbWFza1dpZHRoLCBpbnQgbWFza0hlaWdodCwKCQkJICAgICAgIEdCb29sIG1hc2tJbnZlcnQsIEdCb29sIG1hc2tJbnRlcnBvbGF0ZSk7CiAgdmlydHVhbCB2b2lkIGRyYXdTb2Z0TWFza2VkSW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCQkgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJCQkgICBHZnhJbWFnZUNvbG9yTWFwICpjb2xvck1hcCwKCQkJCSAgIEdCb29sIGludGVycG9sYXRlLAoJCQkJICAgU3RyZWFtICptYXNrU3RyLAoJCQkJICAgaW50IG1hc2tXaWR0aCwgaW50IG1hc2tIZWlnaHQsCgkJCQkgICBHZnhJbWFnZUNvbG9yTWFwICptYXNrQ29sb3JNYXAsCgkJCQkgICBHQm9vbCBtYXNrSW50ZXJwb2xhdGUpOwogIC8vIElmIGN1cnJlbnQgY29sb3JzcGFjZSBpc3QgcGF0dGVybiwKICAvLyBuZWVkIHRoaXMgZGV2aWNlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG1hc2tzIGluIHBhdHRlcm4gY29sb3JzcGFjZT8KICAvLyBEZWZhdWx0IGlzIGZhbHNlCiAgdmlydHVhbCBHQm9vbCBmaWxsTWFza0NTUGF0dGVybihHZnhTdGF0ZSAqIHN0YXRlKQogIAl7IHJldHVybiBzdGF0ZS0+Z2V0RmlsbENvbG9yU3BhY2UoKS0+Z2V0TW9kZSgpID09IGNzUGF0dGVybjsgfQogIHZpcnR1YWwgdm9pZCBlbmRNYXNrQ2xpcChHZnhTdGF0ZSAqIC8qc3RhdGUqLyk7CgogIC8vLS0tLS0gVHlwZSAzIGZvbnQgb3BlcmF0b3JzCiAgdmlydHVhbCB2b2lkIHR5cGUzRDAoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgd3gsIGRvdWJsZSB3eSk7CiAgdmlydHVhbCB2b2lkIHR5cGUzRDEoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgd3gsIGRvdWJsZSB3eSwKCQkgICAgICAgZG91YmxlIGxseCwgZG91YmxlIGxseSwgZG91YmxlIHVyeCwgZG91YmxlIHVyeSk7CgogIC8vLS0tLS0gdHJhbnNwYXJlbmN5IGdyb3VwcyBhbmQgc29mdCBtYXNrcwogIHZpcnR1YWwgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUdyb3VwKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlICpiYm94LAoJCQkJICAgICAgR2Z4Q29sb3JTcGFjZSAqYmxlbmRpbmdDb2xvclNwYWNlLAoJCQkJICAgICAgR0Jvb2wgaXNvbGF0ZWQsIEdCb29sIGtub2Nrb3V0LAoJCQkJICAgICAgR0Jvb2wgZm9yU29mdE1hc2spOwogIHZpcnR1YWwgdm9pZCBlbmRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCBwYWludFRyYW5zcGFyZW5jeUdyb3VwKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlICpiYm94KTsKICB2aXJ0dWFsIHZvaWQgc2V0U29mdE1hc2soR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgKmJib3gsIEdCb29sIGFscGhhLAoJCQkgICBGdW5jdGlvbiAqdHJhbnNmZXJGdW5jLCBHZnhDb2xvciAqYmFja2Ryb3BDb2xvcik7CiAgdmlydHVhbCB2b2lkIGNsZWFyU29mdE1hc2soR2Z4U3RhdGUgKnN0YXRlKTsKCiAgLy8tLS0tLSBzcGVjaWFsIGFjY2VzcwoKICAvLyBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBQREYgZG9jdW1lbnQgaGFzIGJlZW4gbG9hZGVkLgogIHZvaWQgc3RhcnREb2MoWFJlZiAqeHJlZkEpOwogCiAgdm9pZCBzZXRQYXBlckNvbG9yKFNwbGFzaENvbG9yUHRyIHBhcGVyQ29sb3JBKTsKCiAgR0Jvb2wgaXNSZXZlcnNlVmlkZW8oKSB7IHJldHVybiByZXZlcnNlVmlkZW87IH0KICB2b2lkIHNldFJldmVyc2VWaWRlbyhHQm9vbCByZXZlcnNlVmlkZW9BKSB7IHJldmVyc2VWaWRlbyA9IHJldmVyc2VWaWRlb0E7IH0KCiAgLy8gR2V0IHRoZSBiaXRtYXAgYW5kIGl0cyBzaXplLgogIFNwbGFzaEJpdG1hcCAqZ2V0Qml0bWFwKCkgeyByZXR1cm4gYml0bWFwOyB9CiAgaW50IGdldEJpdG1hcFdpZHRoKCk7CiAgaW50IGdldEJpdG1hcEhlaWdodCgpOwoKICAvLyBSZXR1cm5zIHRoZSBsYXN0IHJhc3Rlcml6ZWQgYml0bWFwLCB0cmFuc2ZlcnJpbmcgb3duZXJzaGlwIHRvIHRoZQogIC8vIGNhbGxlci4KICBTcGxhc2hCaXRtYXAgKnRha2VCaXRtYXAoKTsKCiAgLy8gR2V0IHRoZSBTcGxhc2ggb2JqZWN0LgogIFNwbGFzaCAqZ2V0U3BsYXNoKCkgeyByZXR1cm4gc3BsYXNoOyB9CgogIC8vIEdldCB0aGUgbW9kaWZpZWQgcmVnaW9uLgogIHZvaWQgZ2V0TW9kUmVnaW9uKGludCAqeE1pbiwgaW50ICp5TWluLCBpbnQgKnhNYXgsIGludCAqeU1heCk7CgogIC8vIENsZWFyIHRoZSBtb2RpZmllZCByZWdpb24uCiAgdm9pZCBjbGVhck1vZFJlZ2lvbigpOwoKICBTcGxhc2hGb250ICpnZXRDdXJyZW50Rm9udCgpIHsgcmV0dXJuIGZvbnQ7IH0KCiNpZiAxIC8vfnRtcDogdHVybiBvZmYgYW50aS1hbGlhc2luZyB0ZW1wb3JhcmlseQogIHZpcnR1YWwgR0Jvb2wgZ2V0VmVjdG9yQW50aWFsaWFzKCk7CiAgdmlydHVhbCB2b2lkIHNldFZlY3RvckFudGlhbGlhcyhHQm9vbCB2YWEpOwojZW5kaWYKCiAgdm9pZCBzZXRGcmVlVHlwZUhpbnRpbmcoR0Jvb2wgZW5hYmxlLCBHQm9vbCBlbmFibGVTbGlnaHRIaW50aW5nKTsKCnByaXZhdGU6CiAgR0Jvb2wgdW5pdmFyaWF0ZVNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBTcGxhc2hVbml2YXJpYXRlUGF0dGVybiAqcGF0dGVybiwgZG91YmxlIHRNaW4sIGRvdWJsZSB0TWF4KTsKCiAgdm9pZCBzZXR1cFNjcmVlblBhcmFtcyhkb3VibGUgaERQSSwgZG91YmxlIHZEUEkpOwojaWYgU1BMQVNIX0NNWUsKICBTcGxhc2hQYXR0ZXJuICpnZXRDb2xvcihHZnhDb2xvclNwYWNlICpjb2xvclNwYWNlLCBHZnhHcmF5IGdyYXksIEdmeFJHQiAqcmdiLCBHZnhDTVlLICpjbXlrKTsKI2Vsc2UKICBTcGxhc2hQYXR0ZXJuICpnZXRDb2xvcihHZnhHcmF5IGdyYXksIEdmeFJHQiAqcmdiKTsKI2VuZGlmCiAgU3BsYXNoUGF0aCAqY29udmVydFBhdGgoR2Z4U3RhdGUgKnN0YXRlLCBHZnhQYXRoICpwYXRoKTsKICB2b2lkIGRvVXBkYXRlRm9udChHZnhTdGF0ZSAqc3RhdGUpOwogIHZvaWQgZHJhd1R5cGUzR2x5cGgoVDNGb250Q2FjaGUgKnQzRm9udCwKCQkgICAgICBUM0ZvbnRDYWNoZVRhZyAqdGFnLCBHdWNoYXIgKmRhdGEpOwogIHN0YXRpYyBHQm9vbCBpbWFnZU1hc2tTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgbGluZSk7CiAgc3RhdGljIEdCb29sIGltYWdlU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJR3VjaGFyICphbHBoYUxpbmUpOwogIHN0YXRpYyBHQm9vbCBhbHBoYUltYWdlU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGxpbmUsCgkJCSAgICAgR3VjaGFyICphbHBoYUxpbmUpOwogIHN0YXRpYyBHQm9vbCBtYXNrZWRJbWFnZVNyYyh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBsaW5lLAoJCQkgICAgICBHdWNoYXIgKmFscGhhTGluZSk7CiAgc3RhdGljIEdCb29sIHRpbGluZ0JpdG1hcFNyYyh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBsaW5lLAoJCQkgICAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCiAgR0Jvb2wgaGF2ZUNTUGF0dGVybjsJCS8vIHNldCBpZiB0ZXh0IGhhcyBiZWVuIGRyYXduIHdpdGggYQoJCQkJCQkJLy8gICBjbGlwcGluZyByZW5kZXIgbW9kZSBiZWNhdXNlIG9mIHBhdHRlcm4gY29sb3JzcGFjZQogIEdCb29sIGtlZXBBbHBoYUNoYW5uZWw7CS8vIGRvbid0IGZpbGwgd2l0aCBwYXBlciBjb2xvciwga2VlcCBhbHBoYSBjaGFubmVsCgogIFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGU7CiAgaW50IGJpdG1hcFJvd1BhZDsKICBHQm9vbCBiaXRtYXBUb3BEb3duOwogIEdCb29sIGFsbG93QW50aWFsaWFzOwogIEdCb29sIHZlY3RvckFudGlhbGlhczsKICBHQm9vbCBlbmFibGVGcmVlVHlwZUhpbnRpbmc7CiAgR0Jvb2wgZW5hYmxlU2xpZ2h0SGludGluZzsKICBHQm9vbCByZXZlcnNlVmlkZW87CQkvLyByZXZlcnNlIHZpZGVvIG1vZGUKICBTcGxhc2hDb2xvciBwYXBlckNvbG9yOwkvLyBwYXBlciBjb2xvcgogIFNwbGFzaFNjcmVlblBhcmFtcyBzY3JlZW5QYXJhbXM7CgogIFhSZWYgKnhyZWY7CQkJLy8geHJlZiB0YWJsZSBmb3IgY3VycmVudCBkb2N1bWVudAoKICBTcGxhc2hCaXRtYXAgKmJpdG1hcDsKICBTcGxhc2ggKnNwbGFzaDsKICBTcGxhc2hGb250RW5naW5lICpmb250RW5naW5lOwoKICBUM0ZvbnRDYWNoZSAqCQkJLy8gVHlwZSAzIGZvbnQgY2FjaGUKICAgIHQzRm9udENhY2hlW3NwbGFzaE91dFQzRm9udENhY2hlU2l6ZV07CiAgaW50IG5UM0ZvbnRzOwkJCS8vIG51bWJlciBvZiB2YWxpZCBlbnRyaWVzIGluIHQzRm9udENhY2hlCiAgVDNHbHlwaFN0YWNrICp0M0dseXBoU3RhY2s7CS8vIFR5cGUgMyBnbHlwaCBjb250ZXh0IHN0YWNrCgogIFNwbGFzaEZvbnQgKmZvbnQ7CQkvLyBjdXJyZW50IGZvbnQKICBHQm9vbCBuZWVkRm9udFVwZGF0ZTsJCS8vIHNldCB3aGVuIHRoZSBmb250IG5lZWRzIHRvIGJlIHVwZGF0ZWQKICBTcGxhc2hQYXRoICp0ZXh0Q2xpcFBhdGg7CS8vIGNsaXBwaW5nIHBhdGggYnVpbHQgd2l0aCB0ZXh0IG9iamVjdAoKICBTcGxhc2hUcmFuc3BhcmVuY3lHcm91cCAqCS8vIHRyYW5zcGFyZW5jeSBncm91cCBzdGFjawogICAgdHJhbnNwR3JvdXBTdGFjazsKICBTcGxhc2hCaXRtYXAgKm1hc2tCaXRtYXA7IC8vIGZvciBpbWFnZSBtYXNrcyBpbiBwYXR0ZXJuIGNvbG9yc3BhY2UKfTsKCiNlbmRpZgo=