Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDIwMDMgR2x5cGggJiBDb2csIExMQwovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gTW9kaWZpZWQgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCAtIGh0dHA6Ly9wb3BwbGVyLmZyZWVkZXNrdG9wLm9yZwovLwovLyBBbGwgY2hhbmdlcyBtYWRlIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgdG8gdGhpcyBmaWxlIGFyZSBsaWNlbnNlZAovLyB1bmRlciBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyCi8vCi8vIENvcHlyaWdodCAoQykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDA5IENhcmxvcyBHYXJjaWEgQ2FtcG9zIDxjYXJsb3NnY0Bnbm9tZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgU1BMQVNIT1VUUFVUREVWX0gKI2RlZmluZSBTUExBU0hPVVRQVVRERVZfSAoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGludGVyZmFjZQojZW5kaWYKCiNpbmNsdWRlICJnb28vZ3R5cGVzLmgiCiNpbmNsdWRlICJzcGxhc2gvU3BsYXNoVHlwZXMuaCIKI2luY2x1ZGUgInNwbGFzaC9TcGxhc2hQYXR0ZXJuLmgiCiNpbmNsdWRlICJwb3BwbGVyLWNvbmZpZy5oIgojaW5jbHVkZSAiT3V0cHV0RGV2LmgiCiNpbmNsdWRlICJHZnhTdGF0ZS5oIgoKY2xhc3MgR2Z4OEJpdEZvbnQ7CmNsYXNzIFNwbGFzaEJpdG1hcDsKY2xhc3MgU3BsYXNoOwpjbGFzcyBTcGxhc2hQYXRoOwpjbGFzcyBTcGxhc2hGb250RW5naW5lOwpjbGFzcyBTcGxhc2hGb250OwpjbGFzcyBUM0ZvbnRDYWNoZTsKc3RydWN0IFQzRm9udENhY2hlVGFnOwpzdHJ1Y3QgVDNHbHlwaFN0YWNrOwpzdHJ1Y3QgU3BsYXNoVHJhbnNwYXJlbmN5R3JvdXA7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTcGxhc2ggZHluYW1pYyBwYXR0ZXJuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2hBeGlhbFBhdHRlcm46IHB1YmxpYyBTcGxhc2hQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hBeGlhbFBhdHRlcm4oU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4U3RhdGUgKnN0YXRlLCBHZnhBeGlhbFNoYWRpbmcgKnNoYWRpbmcpOwoKICB2aXJ0dWFsIFNwbGFzaFBhdHRlcm4gKmNvcHkoKSB7IHJldHVybiBuZXcgU3BsYXNoQXhpYWxQYXR0ZXJuKGNvbG9yTW9kZSwgc3RhdGUsIHNoYWRpbmcpOyB9CgogIHZpcnR1YWwgflNwbGFzaEF4aWFsUGF0dGVybigpOwoKICB2aXJ0dWFsIEdCb29sIGdldENvbG9yKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgYyk7CgogIHZpcnR1YWwgR0Jvb2wgaXNTdGF0aWMoKSB7IHJldHVybiBnRmFsc2U7IH0KCnByaXZhdGU6CiAgTWF0cml4IGljdG07CiAgZG91YmxlIHgwLCB5MCwgeDEsIHkxOwogIGRvdWJsZSBkeCwgZHksIG11bDsKICBkb3VibGUgdDAsIHQxOwogIEdmeEF4aWFsU2hhZGluZyAqc2hhZGluZzsKICBHZnhTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZTsKICBkb3VibGUgKmJib3g7Cn07CgovLyBzZWUgR2Z4U3RhdGUuaCwgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZwpjbGFzcyBTcGxhc2hHb3VyYXVkUGF0dGVybjogcHVibGljIFNwbGFzaEdvdXJhdWRDb2xvciB7CnB1YmxpYzoKCiAgU3BsYXNoR291cmF1ZFBhdHRlcm4oR0Jvb2wgYkRpcmVjdENvbG9yVHJhbnNsYXRpb24sIEdmeFN0YXRlICpzdGF0ZSwgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZyAqc2hhZGluZyk7CgogIHZpcnR1YWwgU3BsYXNoUGF0dGVybiAqY29weSgpIHsgcmV0dXJuIG5ldyBTcGxhc2hHb3VyYXVkUGF0dGVybihiRGlyZWN0Q29sb3JUcmFuc2xhdGlvbiwgc3RhdGUsIHNoYWRpbmcpOyB9CgogIHZpcnR1YWwgflNwbGFzaEdvdXJhdWRQYXR0ZXJuKCk7CgogIHZpcnR1YWwgR0Jvb2wgZ2V0Q29sb3IoaW50IHgsIGludCB5LCBTcGxhc2hDb2xvclB0ciBjKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgdmlydHVhbCBHQm9vbCBpc1N0YXRpYygpIHsgcmV0dXJuIGdGYWxzZTsgfQoKICB2aXJ0dWFsIEdCb29sIGlzUGFyYW1ldGVyaXplZCgpIHsgcmV0dXJuIHNoYWRpbmctPmlzUGFyYW1ldGVyaXplZCgpOyB9CiAgdmlydHVhbCBpbnQgZ2V0TlRyaWFuZ2xlcygpIHsgcmV0dXJuIHNoYWRpbmctPmdldE5UcmlhbmdsZXMoKTsgfQogIHZpcnR1YWwgIHZvaWQgZ2V0VHJpYW5nbGUoaW50IGksIGRvdWJsZSAqeDAsIGRvdWJsZSAqeTAsIGRvdWJsZSAqY29sb3IwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp4MSwgZG91YmxlICp5MSwgZG91YmxlICpjb2xvcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKngyLCBkb3VibGUgKnkyLCBkb3VibGUgKmNvbG9yMikgCiAgeyByZXR1cm4gc2hhZGluZy0+Z2V0VHJpYW5nbGUoaSwgeDAsIHkwLCBjb2xvcjAsIHgxLCB5MSwgY29sb3IxLCB4MiwgeTIsIGNvbG9yMik7IH0KCiAgdmlydHVhbCB2b2lkIGdldFBhcmFtZXRlcml6ZWRDb2xvcihkb3VibGUgdCwgU3BsYXNoQ29sb3JNb2RlIG1vZGUsIFNwbGFzaENvbG9yUHRyIGMpOwoKcHJpdmF0ZToKICBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nICpzaGFkaW5nOwogIEdmeFN0YXRlICpzdGF0ZTsKICBHQm9vbCBiRGlyZWN0Q29sb3JUcmFuc2xhdGlvbjsKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBudW1iZXIgb2YgVHlwZSAzIGZvbnRzIHRvIGNhY2hlCiNkZWZpbmUgc3BsYXNoT3V0VDNGb250Q2FjaGVTaXplIDgKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaE91dHB1dERldgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoT3V0cHV0RGV2OiBwdWJsaWMgT3V0cHV0RGV2IHsKcHVibGljOgoKICAvLyBDb25zdHJ1Y3Rvci4KICBTcGxhc2hPdXRwdXREZXYoU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZUEsIGludCBiaXRtYXBSb3dQYWRBLAoJCSAgR0Jvb2wgcmV2ZXJzZVZpZGVvQSwgU3BsYXNoQ29sb3JQdHIgcGFwZXJDb2xvckEsCgkJICBHQm9vbCBiaXRtYXBUb3BEb3duQSA9IGdUcnVlLAoJCSAgR0Jvb2wgYWxsb3dBbnRpYWxpYXNBID0gZ1RydWUpOwoKICAvLyBEZXN0cnVjdG9yLgogIHZpcnR1YWwgflNwbGFzaE91dHB1dERldigpOwoKICAvLy0tLS0tIGdldCBpbmZvIGFib3V0IG91dHB1dCBkZXZpY2UKCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgZnVuY3Rpb25TaGFkZWRGaWxsKCksIGF4aWFsU2hhZGVkRmlsbCgpLCBhbmQKICAvLyByYWRpYWxTaGFkZWRGaWxsKCk/ICBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZXNlIHNoYWRlZCBmaWxscwogIC8vIHdpbGwgYmUgcmVkdWNlZCB0byBhIHNlcmllcyBvZiBvdGhlciBkcmF3aW5nIG9wZXJhdGlvbnMuCiAgdmlydHVhbCBHQm9vbCB1c2VTaGFkZWRGaWxscyhpbnQgdHlwZSkKICB7IHJldHVybiAodHlwZSA9PSAyIHx8IHR5cGUgPT0gNCB8fCB0eXBlID09IDUgKSA/IGdUcnVlIDogZ0ZhbHNlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIHVwc2lkZS1kb3duIGNvb3JkaW5hdGVzPwogIC8vIChVcHNpZGUtZG93biBtZWFucyAoMCwwKSBpcyB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBwYWdlLikKICB2aXJ0dWFsIEdCb29sIHVwc2lkZURvd24oKSB7IHJldHVybiBnVHJ1ZTsgfQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBkcmF3Q2hhcigpIG9yIGRyYXdTdHJpbmcoKT8KICB2aXJ0dWFsIEdCb29sIHVzZURyYXdDaGFyKCkgeyByZXR1cm4gZ1RydWU7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgYmVnaW5UeXBlM0NoYXIvZW5kVHlwZTNDaGFyPyAgT3RoZXJ3aXNlLAogIC8vIHRleHQgaW4gVHlwZSAzIGZvbnRzIHdpbGwgYmUgZHJhd24gd2l0aCBkcmF3Q2hhci9kcmF3U3RyaW5nLgogIHZpcnR1YWwgR0Jvb2wgaW50ZXJwcmV0VHlwZTNDaGFycygpIHsgcmV0dXJuIGdUcnVlOyB9CgogIC8vIFRoaXMgZGV2aWNlIG5vdyBzdXBwb3J0cyB0ZXh0IGluIHBhdHRlcm4gY29sb3JzcGFjZSEKICB2aXJ0dWFsIEdCb29sIHN1cHBvcnRUZXh0Q1NQYXR0ZXJuKEdmeFN0YXRlICpzdGF0ZSkKICAJeyByZXR1cm4gc3RhdGUtPmdldEZpbGxDb2xvclNwYWNlKCktPmdldE1vZGUoKSA9PSBjc1BhdHRlcm47IH0KCiAgLy8tLS0tLSBpbml0aWFsaXphdGlvbiBhbmQgY29udHJvbAoKICAvLyBTdGFydCBhIHBhZ2UuCiAgdmlydHVhbCB2b2lkIHN0YXJ0UGFnZShpbnQgcGFnZU51bSwgR2Z4U3RhdGUgKnN0YXRlKTsKCiAgLy8gRW5kIGEgcGFnZS4KICB2aXJ0dWFsIHZvaWQgZW5kUGFnZSgpOwoKICAvLy0tLS0tIHNhdmUvcmVzdG9yZSBncmFwaGljcyBzdGF0ZQogIHZpcnR1YWwgdm9pZCBzYXZlU3RhdGUoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKEdmeFN0YXRlICpzdGF0ZSk7CgogIC8vLS0tLS0gdXBkYXRlIGdyYXBoaWNzIHN0YXRlCiAgdmlydHVhbCB2b2lkIHVwZGF0ZUFsbChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVDVE0oR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgbTExLCBkb3VibGUgbTEyLAoJCQkgZG91YmxlIG0yMSwgZG91YmxlIG0yMiwgZG91YmxlIG0zMSwgZG91YmxlIG0zMik7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUxpbmVEYXNoKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZsYXRuZXNzKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUxpbmVKb2luKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUxpbmVDYXAoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlTWl0ZXJMaW1pdChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lV2lkdGgoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3Ryb2tlQWRqdXN0KEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxDb2xvcihHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VDb2xvcihHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCB1cGRhdGVCbGVuZE1vZGUoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlsbE9wYWNpdHkoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3Ryb2tlT3BhY2l0eShHZnhTdGF0ZSAqc3RhdGUpOwoKICAvLy0tLS0tIHVwZGF0ZSB0ZXh0IHN0YXRlCiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZvbnQoR2Z4U3RhdGUgKnN0YXRlKTsKCiAgLy8tLS0tLSBwYXRoIHBhaW50aW5nCiAgdmlydHVhbCB2b2lkIHN0cm9rZShHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCBmaWxsKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIGVvRmlsbChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgR0Jvb2wgYXhpYWxTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4QXhpYWxTaGFkaW5nICpzaGFkaW5nLCBkb3VibGUgdE1pbiwgZG91YmxlIHRNYXgpOwogIHZpcnR1YWwgR0Jvb2wgZ291cmF1ZFRyaWFuZ2xlU2hhZGVkRmlsbChHZnhTdGF0ZSAqc3RhdGUsIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmcgKnNoYWRpbmcpOwoKICAvLy0tLS0tIHBhdGggY2xpcHBpbmcKICB2aXJ0dWFsIHZvaWQgY2xpcChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCBlb0NsaXAoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgY2xpcFRvU3Ryb2tlUGF0aChHZnhTdGF0ZSAqc3RhdGUpOwoKICAvLy0tLS0tIHRleHQgZHJhd2luZwogIHZpcnR1YWwgdm9pZCBkcmF3Q2hhcihHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSB4LCBkb3VibGUgeSwKCQkJZG91YmxlIGR4LCBkb3VibGUgZHksCgkJCWRvdWJsZSBvcmlnaW5YLCBkb3VibGUgb3JpZ2luWSwKCQkJQ2hhckNvZGUgY29kZSwgaW50IG5CeXRlcywgVW5pY29kZSAqdSwgaW50IHVMZW4pOwogIHZpcnR1YWwgR0Jvb2wgYmVnaW5UeXBlM0NoYXIoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgeCwgZG91YmxlIHksCgkJCSAgICAgICBkb3VibGUgZHgsIGRvdWJsZSBkeSwKCQkJICAgICAgIENoYXJDb2RlIGNvZGUsIFVuaWNvZGUgKnUsIGludCB1TGVuKTsKICB2aXJ0dWFsIHZvaWQgZW5kVHlwZTNDaGFyKEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIGJlZ2luVGV4dE9iamVjdChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgR0Jvb2wgZGV2aWNlSGFzVGV4dENsaXAoR2Z4U3RhdGUgKnN0YXRlKSB7IHJldHVybiB0ZXh0Q2xpcFBhdGggJiYgaGF2ZUNTUGF0dGVybjsgfQogIHZpcnR1YWwgdm9pZCBlbmRUZXh0T2JqZWN0KEdmeFN0YXRlICpzdGF0ZSk7CgogIC8vLS0tLS0gaW1hZ2UgZHJhd2luZwogIHZpcnR1YWwgdm9pZCBkcmF3SW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgR0Jvb2wgaW52ZXJ0LAoJCQkgICAgIEdCb29sIGludGVycG9sYXRlLCBHQm9vbCBpbmxpbmVJbWcpOwogIHZpcnR1YWwgdm9pZCBkcmF3SW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLAoJCQkgR0Jvb2wgaW50ZXJwb2xhdGUsIGludCAqbWFza0NvbG9ycywgR0Jvb2wgaW5saW5lSW1nKTsKICB2aXJ0dWFsIHZvaWQgZHJhd01hc2tlZEltYWdlKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCQkgICAgICAgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCSAgICAgICBHQm9vbCBpbnRlcnBvbGF0ZSwKCQkJICAgICAgIFN0cmVhbSAqbWFza1N0ciwgaW50IG1hc2tXaWR0aCwgaW50IG1hc2tIZWlnaHQsCgkJCSAgICAgICBHQm9vbCBtYXNrSW52ZXJ0LCBHQm9vbCBtYXNrSW50ZXJwb2xhdGUpOwogIHZpcnR1YWwgdm9pZCBkcmF3U29mdE1hc2tlZEltYWdlKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkJICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCQkJICAgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCQkgICBHQm9vbCBpbnRlcnBvbGF0ZSwKCQkJCSAgIFN0cmVhbSAqbWFza1N0ciwKCQkJCSAgIGludCBtYXNrV2lkdGgsIGludCBtYXNrSGVpZ2h0LAoJCQkJICAgR2Z4SW1hZ2VDb2xvck1hcCAqbWFza0NvbG9yTWFwLAoJCQkJICAgR0Jvb2wgbWFza0ludGVycG9sYXRlKTsKICAvLyBJZiBjdXJyZW50IGNvbG9yc3BhY2UgaXN0IHBhdHRlcm4sCiAgLy8gbmVlZCB0aGlzIGRldmljZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBtYXNrcyBpbiBwYXR0ZXJuIGNvbG9yc3BhY2U/CiAgLy8gRGVmYXVsdCBpcyBmYWxzZQogIHZpcnR1YWwgR0Jvb2wgZmlsbE1hc2tDU1BhdHRlcm4oR2Z4U3RhdGUgKiBzdGF0ZSkKICAJeyByZXR1cm4gc3RhdGUtPmdldEZpbGxDb2xvclNwYWNlKCktPmdldE1vZGUoKSA9PSBjc1BhdHRlcm47IH0KICB2aXJ0dWFsIHZvaWQgZW5kTWFza0NsaXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pOwoKICAvLy0tLS0tIFR5cGUgMyBmb250IG9wZXJhdG9ycwogIHZpcnR1YWwgdm9pZCB0eXBlM0QwKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHd4LCBkb3VibGUgd3kpOwogIHZpcnR1YWwgdm9pZCB0eXBlM0QxKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHd4LCBkb3VibGUgd3ksCgkJICAgICAgIGRvdWJsZSBsbHgsIGRvdWJsZSBsbHksIGRvdWJsZSB1cngsIGRvdWJsZSB1cnkpOwoKICAvLy0tLS0tIHRyYW5zcGFyZW5jeSBncm91cHMgYW5kIHNvZnQgbWFza3MKICB2aXJ0dWFsIHZvaWQgYmVnaW5UcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSAqYmJveCwKCQkJCSAgICAgIEdmeENvbG9yU3BhY2UgKmJsZW5kaW5nQ29sb3JTcGFjZSwKCQkJCSAgICAgIEdCb29sIGlzb2xhdGVkLCBHQm9vbCBrbm9ja291dCwKCQkJCSAgICAgIEdCb29sIGZvclNvZnRNYXNrKTsKICB2aXJ0dWFsIHZvaWQgZW5kVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgcGFpbnRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSAqYmJveCk7CiAgdmlydHVhbCB2b2lkIHNldFNvZnRNYXNrKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlICpiYm94LCBHQm9vbCBhbHBoYSwKCQkJICAgRnVuY3Rpb24gKnRyYW5zZmVyRnVuYywgR2Z4Q29sb3IgKmJhY2tkcm9wQ29sb3IpOwogIHZpcnR1YWwgdm9pZCBjbGVhclNvZnRNYXNrKEdmeFN0YXRlICpzdGF0ZSk7CgogIC8vLS0tLS0gc3BlY2lhbCBhY2Nlc3MKCiAgLy8gQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgUERGIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZC4KICB2b2lkIHN0YXJ0RG9jKFhSZWYgKnhyZWZBKTsKIAogIHZvaWQgc2V0UGFwZXJDb2xvcihTcGxhc2hDb2xvclB0ciBwYXBlckNvbG9yQSk7CgogIEdCb29sIGlzUmV2ZXJzZVZpZGVvKCkgeyByZXR1cm4gcmV2ZXJzZVZpZGVvOyB9CiAgdm9pZCBzZXRSZXZlcnNlVmlkZW8oR0Jvb2wgcmV2ZXJzZVZpZGVvQSkgeyByZXZlcnNlVmlkZW8gPSByZXZlcnNlVmlkZW9BOyB9CgogIC8vIEdldCB0aGUgYml0bWFwIGFuZCBpdHMgc2l6ZS4KICBTcGxhc2hCaXRtYXAgKmdldEJpdG1hcCgpIHsgcmV0dXJuIGJpdG1hcDsgfQogIGludCBnZXRCaXRtYXBXaWR0aCgpOwogIGludCBnZXRCaXRtYXBIZWlnaHQoKTsKCiAgLy8gUmV0dXJucyB0aGUgbGFzdCByYXN0ZXJpemVkIGJpdG1hcCwgdHJhbnNmZXJyaW5nIG93bmVyc2hpcCB0byB0aGUKICAvLyBjYWxsZXIuCiAgU3BsYXNoQml0bWFwICp0YWtlQml0bWFwKCk7CgogIC8vIEdldCB0aGUgU3BsYXNoIG9iamVjdC4KICBTcGxhc2ggKmdldFNwbGFzaCgpIHsgcmV0dXJuIHNwbGFzaDsgfQoKICAvLyBHZXQgdGhlIG1vZGlmaWVkIHJlZ2lvbi4KICB2b2lkIGdldE1vZFJlZ2lvbihpbnQgKnhNaW4sIGludCAqeU1pbiwgaW50ICp4TWF4LCBpbnQgKnlNYXgpOwoKICAvLyBDbGVhciB0aGUgbW9kaWZpZWQgcmVnaW9uLgogIHZvaWQgY2xlYXJNb2RSZWdpb24oKTsKCiAgLy8gU2V0IHRoZSBTcGxhc2ggZmlsbCBjb2xvci4KICB2b2lkIHNldEZpbGxDb2xvcihpbnQgciwgaW50IGcsIGludCBiKTsKCiAgU3BsYXNoRm9udCAqZ2V0Q3VycmVudEZvbnQoKSB7IHJldHVybiBmb250OyB9CgojaWYgMSAvL350bXA6IHR1cm4gb2ZmIGFudGktYWxpYXNpbmcgdGVtcG9yYXJpbHkKICB2aXJ0dWFsIEdCb29sIGdldFZlY3RvckFudGlhbGlhcygpOwogIHZpcnR1YWwgdm9pZCBzZXRWZWN0b3JBbnRpYWxpYXMoR0Jvb2wgdmFhKTsKI2VuZGlmCgogIHZvaWQgc2V0RnJlZVR5cGVIaW50aW5nKEdCb29sIGVuYWJsZSk7Cgpwcml2YXRlOgoKICB2b2lkIHNldHVwU2NyZWVuUGFyYW1zKGRvdWJsZSBoRFBJLCBkb3VibGUgdkRQSSk7CiNpZiBTUExBU0hfQ01ZSwogIFNwbGFzaFBhdHRlcm4gKmdldENvbG9yKEdmeEdyYXkgZ3JheSwgR2Z4UkdCICpyZ2IsIEdmeENNWUsgKmNteWspOwojZWxzZQogIFNwbGFzaFBhdHRlcm4gKmdldENvbG9yKEdmeEdyYXkgZ3JheSwgR2Z4UkdCICpyZ2IpOwojZW5kaWYKICBTcGxhc2hQYXRoICpjb252ZXJ0UGF0aChHZnhTdGF0ZSAqc3RhdGUsIEdmeFBhdGggKnBhdGgpOwogIHZvaWQgZG9VcGRhdGVGb250KEdmeFN0YXRlICpzdGF0ZSk7CiAgdm9pZCBkcmF3VHlwZTNHbHlwaChUM0ZvbnRDYWNoZSAqdDNGb250LAoJCSAgICAgIFQzRm9udENhY2hlVGFnICp0YWcsIEd1Y2hhciAqZGF0YSk7CiAgc3RhdGljIEdCb29sIGltYWdlTWFza1NyYyh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBsaW5lKTsKICBzdGF0aWMgR0Jvb2wgaW1hZ2VTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgY29sb3JMaW5lLAoJCQlHdWNoYXIgKmFscGhhTGluZSk7CiAgc3RhdGljIEdCb29sIGFscGhhSW1hZ2VTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgbGluZSwKCQkJICAgICBHdWNoYXIgKmFscGhhTGluZSk7CiAgc3RhdGljIEdCb29sIG1hc2tlZEltYWdlU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGxpbmUsCgkJCSAgICAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCiAgR0Jvb2wgaGF2ZUNTUGF0dGVybjsJCS8vIHNldCBpZiB0ZXh0IGhhcyBiZWVuIGRyYXduIHdpdGggYQoJCQkJCQkJLy8gICBjbGlwcGluZyByZW5kZXIgbW9kZSBiZWNhdXNlIG9mIHBhdHRlcm4gY29sb3JzcGFjZQogIEdCb29sIGtlZXBBbHBoYUNoYW5uZWw7CS8vIGRvbid0IGZpbGwgd2l0aCBwYXBlciBjb2xvciwga2VlcCBhbHBoYSBjaGFubmVsCgogIFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGU7CiAgaW50IGJpdG1hcFJvd1BhZDsKICBHQm9vbCBiaXRtYXBUb3BEb3duOwogIEdCb29sIGFsbG93QW50aWFsaWFzOwogIEdCb29sIHZlY3RvckFudGlhbGlhczsKICBHQm9vbCBlbmFibGVGcmVlVHlwZUhpbnRpbmc7CiAgR0Jvb2wgcmV2ZXJzZVZpZGVvOwkJLy8gcmV2ZXJzZSB2aWRlbyBtb2RlCiAgU3BsYXNoQ29sb3IgcGFwZXJDb2xvcjsJLy8gcGFwZXIgY29sb3IKICBTcGxhc2hTY3JlZW5QYXJhbXMgc2NyZWVuUGFyYW1zOwoKICBYUmVmICp4cmVmOwkJCS8vIHhyZWYgdGFibGUgZm9yIGN1cnJlbnQgZG9jdW1lbnQKCiAgU3BsYXNoQml0bWFwICpiaXRtYXA7CiAgU3BsYXNoICpzcGxhc2g7CiAgU3BsYXNoRm9udEVuZ2luZSAqZm9udEVuZ2luZTsKCiAgVDNGb250Q2FjaGUgKgkJCS8vIFR5cGUgMyBmb250IGNhY2hlCiAgICB0M0ZvbnRDYWNoZVtzcGxhc2hPdXRUM0ZvbnRDYWNoZVNpemVdOwogIGludCBuVDNGb250czsJCQkvLyBudW1iZXIgb2YgdmFsaWQgZW50cmllcyBpbiB0M0ZvbnRDYWNoZQogIFQzR2x5cGhTdGFjayAqdDNHbHlwaFN0YWNrOwkvLyBUeXBlIDMgZ2x5cGggY29udGV4dCBzdGFjawoKICBTcGxhc2hGb250ICpmb250OwkJLy8gY3VycmVudCBmb250CiAgR0Jvb2wgbmVlZEZvbnRVcGRhdGU7CQkvLyBzZXQgd2hlbiB0aGUgZm9udCBuZWVkcyB0byBiZSB1cGRhdGVkCiAgU3BsYXNoUGF0aCAqdGV4dENsaXBQYXRoOwkvLyBjbGlwcGluZyBwYXRoIGJ1aWx0IHdpdGggdGV4dCBvYmplY3QKCiAgU3BsYXNoVHJhbnNwYXJlbmN5R3JvdXAgKgkvLyB0cmFuc3BhcmVuY3kgZ3JvdXAgc3RhY2sKICAgIHRyYW5zcEdyb3VwU3RhY2s7CiAgU3BsYXNoQml0bWFwICptYXNrQml0bWFwOyAvLyBmb3IgaW1hZ2UgbWFza3MgaW4gcGF0dGVybiBjb2xvcnNwYWNlCn07CgojZW5kaWYK