Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDE5OTYtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA1IEpvbmF0aGFuIEJsYW5kZm9yZCA8anJiQHJlZGhhdC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBUaG9ya2lsZCBTdHJheSA8dGhvcmtpbGRAaWZpLnVpby5ubz4KLy8gQ29weXJpZ2h0IChDKSAyMDA3IEplZmYgTXVpemVsYWFyIDxqZWZmQGluZmlkaWdtLm5ldD4KLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDExLCAyMDE3IEFkcmlhbiBKb2huc29uIDxham9obnNvbkByZWRuZW9uLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMsIDIwMTUgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSBDYXJsb3MgR2FyY2lhIENhbXBvcyA8Y2FybG9zZ2NAZ25vbWUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTIsIDIwMTMgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBGYWJpbyBEJ1Vyc28gPGZhYmlvZHVyc29AaG90bWFpbC5pdD4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDE3LCAyMDE4IE9saXZlciBTYW5kZXIgPG9saXZlci5zYW5kZXJAdHUtZHJlc2Rlbi5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDE4IEtsYXLkbHZkYWxlbnMgRGF0YWtvbnN1bHQgQUIsIGEgS0RBQiBHcm91cCBjb21wYW55LCA8aW5mb0BrZGFiLmNvbT4uIFdvcmsgc3BvbnNvcmVkIGJ5IHRoZSBMaU11eCBwcm9qZWN0IG9mIHRoZSBjaXR5IG9mIE11bmljaAovLyBDb3B5cmlnaHQgKEMpIDIwMTggQWRhbSBSZWljaG9sZCA8YWRhbS5yZWljaG9sZEB0LW9ubGluZS5kZT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBPVVRQVVRERVZfSAojZGVmaW5lIE9VVFBVVERFVl9ICgojaWZkZWYgVVNFX0dDQ19QUkFHTUFTCiNwcmFnbWEgaW50ZXJmYWNlCiNlbmRpZgoKI2luY2x1ZGUgInBvcHBsZXItY29uZmlnLmgiCiNpbmNsdWRlICJnb28vZ3R5cGVzLmgiCiNpbmNsdWRlICJDaGFyVHlwZXMuaCIKI2luY2x1ZGUgIk9iamVjdC5oIgojaW5jbHVkZSAiUG9wcGxlckNhY2hlLmgiCiNpbmNsdWRlICJQcm9maWxlRGF0YS5oIgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHN0cmluZz4KCmNsYXNzIEFubm90OwpjbGFzcyBEaWN0OwpjbGFzcyBHb29TdHJpbmc7CmNsYXNzIEdmeFN0YXRlOwpjbGFzcyBHZng7CnN0cnVjdCBHZnhDb2xvcjsKY2xhc3MgR2Z4Q29sb3JTcGFjZTsKY2xhc3MgR2Z4SW1hZ2VDb2xvck1hcDsKY2xhc3MgR2Z4RnVuY3Rpb25TaGFkaW5nOwpjbGFzcyBHZnhBeGlhbFNoYWRpbmc7CmNsYXNzIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmc7CmNsYXNzIEdmeFBhdGNoTWVzaFNoYWRpbmc7CmNsYXNzIEdmeFJhZGlhbFNoYWRpbmc7CmNsYXNzIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmc7CmNsYXNzIEdmeFBhdGNoTWVzaFNoYWRpbmc7CmNsYXNzIFN0cmVhbTsKY2xhc3MgTGlua3M7CmNsYXNzIEFubm90TGluazsKY2xhc3MgQ2F0YWxvZzsKY2xhc3MgUGFnZTsKY2xhc3MgRnVuY3Rpb247CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBPdXRwdXREZXYKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIE91dHB1dERldiB7CnB1YmxpYzoKCiAgLy8gQ29uc3RydWN0b3IuCiAgT3V0cHV0RGV2KCkgCiNpZmRlZiBVU0VfQ01TCiA6IGljY0NvbG9yU3BhY2VDYWNoZSg1KQojZW5kaWYKICB7CiAgfQoKICAvLyBEZXN0cnVjdG9yLgogIHZpcnR1YWwgfk91dHB1dERldigpIHt9CgogIC8vLS0tLS0gZ2V0IGluZm8gYWJvdXQgb3V0cHV0IGRldmljZQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSB1cHNpZGUtZG93biBjb29yZGluYXRlcz8KICAvLyAoVXBzaWRlLWRvd24gbWVhbnMgKDAsMCkgaXMgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcGFnZS4pCiAgdmlydHVhbCBHQm9vbCB1cHNpZGVEb3duKCkgPSAwOwoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBkcmF3Q2hhcigpIG9yIGRyYXdTdHJpbmcoKT8KICB2aXJ0dWFsIEdCb29sIHVzZURyYXdDaGFyKCkgPSAwOwoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSB0aWxpbmdQYXR0ZXJuRmlsbCgpPyAgSWYgdGhpcyByZXR1cm5zIGZhbHNlLAogIC8vIHRpbGluZyBwYXR0ZXJuIGZpbGxzIHdpbGwgYmUgcmVkdWNlZCB0byBhIHNlcmllcyBvZiBvdGhlciBkcmF3aW5nCiAgLy8gb3BlcmF0aW9ucy4KICB2aXJ0dWFsIEdCb29sIHVzZVRpbGluZ1BhdHRlcm5GaWxsKCkgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2Ugc3VwcG9ydCBzcGVjaWZpYyBzaGFkaW5nIHR5cGVzPwogIC8vIHNlZSBnb3VyYXVkVHJpYW5nbGVTaGFkZWRGaWxsKCkgYW5kIHBhdGNoTWVzaFNoYWRlZEZpbGwoKQogIHZpcnR1YWwgR0Jvb2wgdXNlU2hhZGVkRmlsbHMoaW50IHR5cGUpIHsgcmV0dXJuIGdGYWxzZTsgfQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBGaWxsQ29sb3JTdG9wKCk/CiAgdmlydHVhbCBHQm9vbCB1c2VGaWxsQ29sb3JTdG9wKCkgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGRyYXdGb3JtKCk/ICBJZiB0aGlzIHJldHVybnMgZmFsc2UsCiAgLy8gZm9ybS10eXBlIFhPYmplY3RzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgKGkuZS4sIHVucm9sbGVkKS4KICB2aXJ0dWFsIEdCb29sIHVzZURyYXdGb3JtKCkgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGJlZ2luVHlwZTNDaGFyL2VuZFR5cGUzQ2hhcj8gIE90aGVyd2lzZSwKICAvLyB0ZXh0IGluIFR5cGUgMyBmb250cyB3aWxsIGJlIGRyYXduIHdpdGggZHJhd0NoYXIvZHJhd1N0cmluZy4KICB2aXJ0dWFsIEdCb29sIGludGVycHJldFR5cGUzQ2hhcnMoKSA9IDA7CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgbmVlZCBub24tdGV4dCBjb250ZW50PwogIHZpcnR1YWwgR0Jvb2wgbmVlZE5vblRleHQoKSB7IHJldHVybiBnVHJ1ZTsgfQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHJlcXVpcmUgaW5jQ2hhckNvdW50IHRvIGJlIGNhbGxlZCBmb3IgdGV4dCBvbgogIC8vIG5vbi1zaG93biBsYXllcnM/CiAgdmlydHVhbCBHQm9vbCBuZWVkQ2hhckNvdW50KCkgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgCiAgLy8gRG9lcyB0aGlzIGRldmljZSBuZWVkIHRvIGNsaXAgcGFnZXMgdG8gdGhlIGNyb3AgYm94IGV2ZW4gd2hlbiB0aGUKICAvLyBib3ggaXMgdGhlIGNyb3AgYm94PwogIHZpcnR1YWwgR0Jvb2wgbmVlZENsaXBUb0Nyb3BCb3goKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8tLS0tLSBpbml0aWFsaXphdGlvbiBhbmQgY29udHJvbAoKICAvLyBTZXQgZGVmYXVsdCB0cmFuc2Zvcm0gbWF0cml4LgogIHZpcnR1YWwgdm9pZCBzZXREZWZhdWx0Q1RNKGRvdWJsZSAqY3RtKTsKCiAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgcGFnZSBzbGljZSBzaG91bGQgYmUgZGlzcGxheWVkLiAgSWYgdGhpcwogIC8vIHJldHVybnMgZmFsc2UsIHRoZSBwYWdlIGRpc3BsYXkgaXMgYWJvcnRlZC4gIFR5cGljYWxseSwgYW4KICAvLyBPdXRwdXREZXYgd2lsbCB1c2Ugc29tZSBhbHRlcm5hdGUgbWVhbnMgdG8gZGlzcGxheSB0aGUgcGFnZQogIC8vIGJlZm9yZSByZXR1cm5pbmcgZmFsc2UuCiAgdmlydHVhbCBHQm9vbCBjaGVja1BhZ2VTbGljZShQYWdlICpwYWdlLCBkb3VibGUgaERQSSwgZG91YmxlIHZEUEksCgkJCSAgICAgICBpbnQgcm90YXRlLCBHQm9vbCB1c2VNZWRpYUJveCwgR0Jvb2wgY3JvcCwKCQkJICAgICAgIGludCBzbGljZVgsIGludCBzbGljZVksIGludCBzbGljZVcsIGludCBzbGljZUgsCgkJCSAgICAgICBHQm9vbCBwcmludGluZywKCQkJICAgICAgIEdCb29sICgqIGFib3J0Q2hlY2tDYmspKHZvaWQgKmRhdGEpID0gTlVMTCwKCQkJICAgICAgIHZvaWQgKiBhYm9ydENoZWNrQ2JrRGF0YSA9IE5VTEwsCgkJCSAgICAgICBHQm9vbCAoKmFubm90RGlzcGxheURlY2lkZUNiaykoQW5ub3QgKmFubm90LCB2b2lkICp1c2VyX2RhdGEpID0gTlVMTCwKCQkJICAgICAgIHZvaWQgKmFubm90RGlzcGxheURlY2lkZUNia0RhdGEgPSBOVUxMKQogICAgeyByZXR1cm4gZ1RydWU7IH0KCiAgLy8gU3RhcnQgYSBwYWdlLgogIHZpcnR1YWwgdm9pZCBzdGFydFBhZ2UoaW50IHBhZ2VOdW0sIEdmeFN0YXRlICpzdGF0ZSwgWFJlZiAqeHJlZikge30KCiAgLy8gRW5kIGEgcGFnZS4KICB2aXJ0dWFsIHZvaWQgZW5kUGFnZSgpIHt9CgogIC8vIER1bXAgcGFnZSBjb250ZW50cyB0byBkaXNwbGF5LgogIHZpcnR1YWwgdm9pZCBkdW1wKCkge30KCiAgLy8tLS0tLSBjb29yZGluYXRlIGNvbnZlcnNpb24KCiAgLy8gQ29udmVydCBiZXR3ZWVuIGRldmljZSBhbmQgdXNlciBjb29yZGluYXRlcy4KICB2aXJ0dWFsIHZvaWQgY3Z0RGV2VG9Vc2VyKGRvdWJsZSBkeCwgZG91YmxlIGR5LCBkb3VibGUgKnV4LCBkb3VibGUgKnV5KTsKICB2aXJ0dWFsIHZvaWQgY3Z0VXNlclRvRGV2KGRvdWJsZSB1eCwgZG91YmxlIHV5LCBpbnQgKmR4LCBpbnQgKmR5KTsKCiAgZG91YmxlICpnZXREZWZDVE0oKSB7IHJldHVybiBkZWZDVE07IH0KICBkb3VibGUgKmdldERlZklDVE0oKSB7IHJldHVybiBkZWZJQ1RNOyB9CgogIC8vLS0tLS0gc2F2ZS9yZXN0b3JlIGdyYXBoaWNzIHN0YXRlCiAgdmlydHVhbCB2b2lkIHNhdmVTdGF0ZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQoKICAvLy0tLS0tIHVwZGF0ZSBncmFwaGljcyBzdGF0ZQogIHZpcnR1YWwgdm9pZCB1cGRhdGVBbGwoR2Z4U3RhdGUgKnN0YXRlKTsKCiAgLy8gVXBkYXRlIHRoZSBDdXJyZW50IFRyYW5zZm9ybWF0aW9uIE1hdHJpeCAoQ1RNKSwgaS5lLiwgdGhlIG5ldyBtYXRyaXgKICAvLyBnaXZlbiBpbiBtMTEsIC4uLiwgbTMyIGlzIGNvbWJpbmVkIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIENUTS4KICAvLyBBdCB0aGUgc2FtZSB0aW1lLCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc3RhdGUtPmdldENUTSgpIGFscmVhZHkKICAvLyBjb250YWlucyB0aGUgY29ycmVjdCBuZXcgQ1RNLCBzbyBvbmUgbWF5IGFzIHdlbGwgcmVwbGFjZSB0aGUKICAvLyBDVE0gb2YgdGhlIHJlbmRlcmVyIHdpdGggdGhhdC4KICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ1RNKEdmeFN0YXRlICogLypzdGF0ZSovLCBkb3VibGUgLyptMTEqLywgZG91YmxlIC8qbTEyKi8sCgkJCSBkb3VibGUgLyptMjEqLywgZG91YmxlIC8qbTIyKi8sIGRvdWJsZSAvKm0zMSovLCBkb3VibGUgLyptMzIqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGluZURhc2goR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZsYXRuZXNzKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lSm9pbihHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGluZUNhcChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlTWl0ZXJMaW1pdChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGluZVdpZHRoKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VBZGp1c3QoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUFscGhhSXNTaGFwZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlVGV4dEtub2Nrb3V0KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVGaWxsQ29sb3JTcGFjZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3Ryb2tlQ29sb3JTcGFjZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlsbENvbG9yKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VDb2xvcihHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlQmxlbmRNb2RlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVGaWxsT3BhY2l0eShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3Ryb2tlT3BhY2l0eShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlUGF0dGVybk9wYWNpdHkoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGNsZWFyUGF0dGVybk9wYWNpdHkoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxPdmVycHJpbnQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0cm9rZU92ZXJwcmludChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlT3ZlcnByaW50TW9kZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlVHJhbnNmZXIoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxDb2xvclN0b3AoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKm9mZnNldCovKSB7fQoKICAvLy0tLS0tIHVwZGF0ZSB0ZXh0IHN0YXRlCiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZvbnQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVRleHRNYXQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUNoYXJTcGFjZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlUmVuZGVyKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVSaXNlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVXb3JkU3BhY2UoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUhvcml6U2NhbGluZyhHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlVGV4dFBvcyhHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlVGV4dFNoaWZ0KEdmeFN0YXRlICogLypzdGF0ZSovLCBkb3VibGUgLypzaGlmdCovKSB7fQogIHZpcnR1YWwgdm9pZCBzYXZlVGV4dFBvcyhHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVRleHRQb3MoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CgogIC8vLS0tLS0gcGF0aCBwYWludGluZwogIHZpcnR1YWwgdm9pZCBzdHJva2UoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGZpbGwoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGVvRmlsbChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIEdCb29sIHRpbGluZ1BhdHRlcm5GaWxsKEdmeFN0YXRlICogLypzdGF0ZSovLCBHZnggKiAvKmdmeCovLCBDYXRhbG9nICogLypjYXQqLywgT2JqZWN0ICogLypzdHIqLywKCQkJCSAgZG91YmxlICogLypwbWF0Ki8sIGludCAvKnBhaW50VHlwZSovLCBpbnQgLyp0aWxpbmdUeXBlKi8sIERpY3QgKiAvKnJlc0RpY3QqLywKCQkJCSAgZG91YmxlICogLyptYXQqLywgZG91YmxlICogLypiYm94Ki8sCgkJCQkgIGludCAvKngwKi8sIGludCAvKnkwKi8sIGludCAvKngxKi8sIGludCAvKnkxKi8sCgkJCQkgIGRvdWJsZSAvKnhTdGVwKi8sIGRvdWJsZSAvKnlTdGVwKi8pCiAgICB7IHJldHVybiBnRmFsc2U7IH0KICB2aXJ0dWFsIEdCb29sIGZ1bmN0aW9uU2hhZGVkRmlsbChHZnhTdGF0ZSAqIC8qc3RhdGUqLywKCQkJCSAgIEdmeEZ1bmN0aW9uU2hhZGluZyAqIC8qc2hhZGluZyovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCBheGlhbFNoYWRlZEZpbGwoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIEdmeEF4aWFsU2hhZGluZyAqIC8qc2hhZGluZyovLCBkb3VibGUgLyp0TWluKi8sIGRvdWJsZSAvKnRNYXgqLykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQogIHZpcnR1YWwgR0Jvb2wgYXhpYWxTaGFkZWRTdXBwb3J0RXh0ZW5kKEdmeFN0YXRlICogLypzdGF0ZSovLCBHZnhBeGlhbFNoYWRpbmcgKiAvKnNoYWRpbmcqLykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQogIHZpcnR1YWwgR0Jvb2wgcmFkaWFsU2hhZGVkRmlsbChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgR2Z4UmFkaWFsU2hhZGluZyAqIC8qc2hhZGluZyovLCBkb3VibGUgLypzTWluKi8sIGRvdWJsZSAvKnNNYXgqLykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQogIHZpcnR1YWwgR0Jvb2wgcmFkaWFsU2hhZGVkU3VwcG9ydEV4dGVuZChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgR2Z4UmFkaWFsU2hhZGluZyAqIC8qc2hhZGluZyovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCBnb3VyYXVkVHJpYW5nbGVTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZyAqc2hhZGluZykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQogIHZpcnR1YWwgR0Jvb2wgcGF0Y2hNZXNoU2hhZGVkRmlsbChHZnhTdGF0ZSAqc3RhdGUsIEdmeFBhdGNoTWVzaFNoYWRpbmcgKnNoYWRpbmcpCiAgICB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8tLS0tLSBwYXRoIGNsaXBwaW5nCiAgdmlydHVhbCB2b2lkIGNsaXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGVvQ2xpcChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgY2xpcFRvU3Ryb2tlUGF0aChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KCiAgLy8tLS0tLSB0ZXh0IGRyYXdpbmcKICB2aXJ0dWFsIHZvaWQgYmVnaW5TdHJpbmdPcChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgZW5kU3RyaW5nT3AoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGJlZ2luU3RyaW5nKEdmeFN0YXRlICogLypzdGF0ZSovLCBjb25zdCBHb29TdHJpbmcgKiAvKnMqLykge30KICB2aXJ0dWFsIHZvaWQgZW5kU3RyaW5nKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQoKICAvLyBEcmF3IG9uZSBnbHlwaCBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbgogIC8vCiAgLy8gQXJndW1lbnRzIGFyZToKICAvLyBDaGFyQ29kZSBjb2RlOiBUaGlzIGlzIHRoZSBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgY29udGVudCBzdHJlYW0uIEl0IG5lZWRzIHRvIGJlIG1hcHBlZCBiYWNrIHRvIGEgZ2x5cGggaW5kZXguCiAgLy8gaW50IG5CeXRlczogVGhlIHRleHQgc3RyaW5ncyBpbiB0aGUgY29udGVudCBzdHJlYW0gY2FuIGNvbnNpc3RzIG9mIGVpdGhlciA4LWJpdCBvciAxNi1iaXQKICAvLyAgICAgICAgICAgICBjaGFyYWN0ZXIgY29kZXMgZGVwZW5kaW5nIG9uIHRoZSBmb250LiBuQnl0ZXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY2hhcmFjdGVyIGNvZGUuCiAgLy8gVW5pY29kZSAqdTogVGhlIFVDUy00IG1hcHBpbmcgdXNlZCBmb3IgdGV4dCBleHRyYWN0aW9uIChUZXh0T3V0cHV0RGV2KS4KICAvLyBpbnQgdUxlbjogVGhlIG51bWJlciBvZiB1bmljb2RlIGVudHJpZXMgaW4gdS4gIFVzdWFsbHkgJzEnLCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyLAogIC8vICAgICAgICAgICBidXQgaXQgbWF5IGFsc28gaGF2ZSBsYXJnZXIgdmFsdWVzLCBmb3IgZXhhbXBsZSBmb3IgbGlnYXR1cmVzLgogIHZpcnR1YWwgdm9pZCBkcmF3Q2hhcihHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlIC8qeCovLCBkb3VibGUgLyp5Ki8sCgkJCWRvdWJsZSAvKmR4Ki8sIGRvdWJsZSAvKmR5Ki8sCgkJCWRvdWJsZSAvKm9yaWdpblgqLywgZG91YmxlIC8qb3JpZ2luWSovLAoJCQlDaGFyQ29kZSAvKmNvZGUqLywgaW50IC8qbkJ5dGVzKi8sIFVuaWNvZGUgKiAvKnUqLywgaW50IC8qdUxlbiovKSB7fQogIHZpcnR1YWwgdm9pZCBkcmF3U3RyaW5nKEdmeFN0YXRlICogLypzdGF0ZSovLCBjb25zdCBHb29TdHJpbmcgKiAvKnMqLykge30KICB2aXJ0dWFsIEdCb29sIGJlZ2luVHlwZTNDaGFyKEdmeFN0YXRlICogLypzdGF0ZSovLCBkb3VibGUgLyp4Ki8sIGRvdWJsZSAvKnkqLywKCQkJICAgICAgIGRvdWJsZSAvKmR4Ki8sIGRvdWJsZSAvKmR5Ki8sCgkJCSAgICAgICBDaGFyQ29kZSAvKmNvZGUqLywgVW5pY29kZSAqIC8qdSovLCBpbnQgLyp1TGVuKi8pOwogIHZpcnR1YWwgdm9pZCBlbmRUeXBlM0NoYXIoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGJlZ2luVGV4dE9iamVjdChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgZW5kVGV4dE9iamVjdChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgaW5jQ2hhckNvdW50KGludCAvKm5DaGFycyovKSB7fQogIHZpcnR1YWwgdm9pZCBiZWdpbkFjdHVhbFRleHQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGNvbnN0IEdvb1N0cmluZyAqIC8qdGV4dCovICkge30KICB2aXJ0dWFsIHZvaWQgZW5kQWN0dWFsVGV4dChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KCiAgLy8tLS0tLSBpbWFnZSBkcmF3aW5nCiAgLy8gRHJhdyBhbiBpbWFnZSBtYXNrLiAgQW4gaW1hZ2UgbWFzayBpcyBhIG9uZS1iaXQtcGVyLXBpeGVsIGltYWdlLCB3aGVyZSBlYWNoIHBpeGVsCiAgLy8gY2FuIG9ubHkgYmUgJ2ZpbGwgY29sb3InIG9yICd0cmFuc3BhcmVudCcuCiAgLy8KICAvLyBJZiAnaW52ZXJ0JyBpcyBmYWxzZSwgYSBzYW1wbGUgdmFsdWUgb2YgMCBtYXJrcyB0aGUgcGFnZSB3aXRoIHRoZSBjdXJyZW50IGNvbG9yLAogIC8vIGFuZCBhIDEgbGVhdmVzIHRoZSBwcmV2aW91cyBjb250ZW50cyB1bmNoYW5nZWQuIElmICdpbnZlcnQnIGlzIHRydWUsIHRoZXNlIG1lYW5pbmdzIGFyZSByZXZlcnNlZC4KICB2aXJ0dWFsIHZvaWQgZHJhd0ltYWdlTWFzayhHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdCb29sIGludmVydCwgR0Jvb2wgaW50ZXJwb2xhdGUsCgkJCSAgICAgR0Jvb2wgaW5saW5lSW1nKTsKICB2aXJ0dWFsIHZvaWQgc2V0U29mdE1hc2tGcm9tSW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwKCQkJCQlPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBHQm9vbCBpbnZlcnQsCgkJCQkJR0Jvb2wgaW5saW5lSW1nLCBkb3VibGUgKmJhc2VNYXRyaXgpOwogIHZpcnR1YWwgdm9pZCB1bnNldFNvZnRNYXNrRnJvbUltYWdlTWFzayhHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSAqYmFzZU1hdHJpeCk7CiAgdmlydHVhbCB2b2lkIGRyYXdJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJIGludCB3aWR0aCwgaW50IGhlaWdodCwgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCSBHQm9vbCBpbnRlcnBvbGF0ZSwgaW50ICptYXNrQ29sb3JzLCBHQm9vbCBpbmxpbmVJbWcpOwogIHZpcnR1YWwgdm9pZCBkcmF3TWFza2VkSW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJCSAgICAgICBHZnhJbWFnZUNvbG9yTWFwICpjb2xvck1hcCwgR0Jvb2wgaW50ZXJwb2xhdGUsCgkJCSAgICAgICBTdHJlYW0gKm1hc2tTdHIsIGludCBtYXNrV2lkdGgsIGludCBtYXNrSGVpZ2h0LAoJCQkgICAgICAgR0Jvb2wgbWFza0ludmVydCwgR0Jvb2wgbWFza0ludGVycG9sYXRlKTsKICB2aXJ0dWFsIHZvaWQgZHJhd1NvZnRNYXNrZWRJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJCSAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkJCSAgIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLAoJCQkJICAgR0Jvb2wgaW50ZXJwb2xhdGUsCgkJCQkgICBTdHJlYW0gKm1hc2tTdHIsCgkJCQkgICBpbnQgbWFza1dpZHRoLCBpbnQgbWFza0hlaWdodCwKCQkJCSAgIEdmeEltYWdlQ29sb3JNYXAgKm1hc2tDb2xvck1hcCwKCQkJCSAgIEdCb29sIG1hc2tJbnRlcnBvbGF0ZSk7CgogIC8vLS0tLS0gZ3JvdXBpbmcgb3BlcmF0b3JzCgogIHZpcnR1YWwgdm9pZCBlbmRNYXJrZWRDb250ZW50KEdmeFN0YXRlICpzdGF0ZSk7CiAgdmlydHVhbCB2b2lkIGJlZ2luTWFya2VkQ29udGVudChjb25zdCBjaGFyICpuYW1lLCBEaWN0ICpwcm9wZXJ0aWVzKTsKICB2aXJ0dWFsIHZvaWQgbWFya1BvaW50KGNvbnN0IGNoYXIgKm5hbWUpOwogIHZpcnR1YWwgdm9pZCBtYXJrUG9pbnQoY29uc3QgY2hhciAqbmFtZSwgRGljdCAqcHJvcGVydGllcyk7CgoKCiNpZmRlZiBPUElfU1VQUE9SVAogIC8vLS0tLS0gT1BJIGZ1bmN0aW9ucwogIHZpcnR1YWwgdm9pZCBvcGlCZWdpbihHZnhTdGF0ZSAqc3RhdGUsIERpY3QgKm9waURpY3QpOwogIHZpcnR1YWwgdm9pZCBvcGlFbmQoR2Z4U3RhdGUgKnN0YXRlLCBEaWN0ICpvcGlEaWN0KTsKI2VuZGlmCgogIC8vLS0tLS0gVHlwZSAzIGZvbnQgb3BlcmF0b3JzCiAgdmlydHVhbCB2b2lkIHR5cGUzRDAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKnd4Ki8sIGRvdWJsZSAvKnd5Ki8pIHt9CiAgdmlydHVhbCB2b2lkIHR5cGUzRDEoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKnd4Ki8sIGRvdWJsZSAvKnd5Ki8sCgkJICAgICAgIGRvdWJsZSAvKmxseCovLCBkb3VibGUgLypsbHkqLywgZG91YmxlIC8qdXJ4Ki8sIGRvdWJsZSAvKnVyeSovKSB7fQoKICAvLy0tLS0tIGZvcm0gWE9iamVjdHMKICB2aXJ0dWFsIHZvaWQgZHJhd0Zvcm0oUmVmIC8qaWQqLykge30KCiAgLy8tLS0tLSBQb3N0U2NyaXB0IFhPYmplY3RzCiAgdmlydHVhbCB2b2lkIHBzWE9iamVjdChTdHJlYW0gKiAvKnBzU3RyZWFtKi8sIFN0cmVhbSAqIC8qbGV2ZWwxU3RyZWFtKi8pIHt9CgogIC8vLS0tLS0gUHJvZmlsaW5nCiAgdm9pZCBzdGFydFByb2ZpbGUoKTsKICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFByb2ZpbGVEYXRhPiogZ2V0UHJvZmlsZUhhc2goKSBjb25zdCB7IHJldHVybiBwcm9maWxlSGFzaC5nZXQoKTsgfQogIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFByb2ZpbGVEYXRhPj4gZW5kUHJvZmlsZSgpOwoKICAvLy0tLS0tIHRyYW5zcGFyZW5jeSBncm91cHMgYW5kIHNvZnQgbWFza3MKICB2aXJ0dWFsIEdCb29sIGNoZWNrVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIEdCb29sIC8qa25vY2tvdXQqLykgeyByZXR1cm4gZ1RydWU7IH0KICB2aXJ0dWFsIHZvaWQgYmVnaW5UcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlICogLypiYm94Ki8sCgkJCQkgICAgICBHZnhDb2xvclNwYWNlICogLypibGVuZGluZ0NvbG9yU3BhY2UqLywKCQkJCSAgICAgIEdCb29sIC8qaXNvbGF0ZWQqLywgR0Jvb2wgLyprbm9ja291dCovLAoJCQkJICAgICAgR0Jvb2wgLypmb3JTb2Z0TWFzayovKSB7fQogIHZpcnR1YWwgdm9pZCBlbmRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgcGFpbnRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlICogLypiYm94Ki8pIHt9CiAgdmlydHVhbCB2b2lkIHNldFNvZnRNYXNrKEdmeFN0YXRlICogLypzdGF0ZSovLCBkb3VibGUgKiAvKmJib3gqLywgR0Jvb2wgLyphbHBoYSovLAoJCQkgICBGdW5jdGlvbiAqIC8qdHJhbnNmZXJGdW5jKi8sIEdmeENvbG9yICogLypiYWNrZHJvcENvbG9yKi8pIHt9CiAgdmlydHVhbCB2b2lkIGNsZWFyU29mdE1hc2soR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CgogIC8vLS0tLS0gbGlua3MKICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0xpbmsoQW5ub3RMaW5rICogLypsaW5rKi8pIHt9CgojaWYgMSAvL350bXA6IHR1cm4gb2ZmIGFudGktYWxpYXNpbmcgdGVtcG9yYXJpbHkKICB2aXJ0dWFsIEdCb29sIGdldFZlY3RvckFudGlhbGlhcygpIHsgcmV0dXJuIGdGYWxzZTsgfQogIHZpcnR1YWwgdm9pZCBzZXRWZWN0b3JBbnRpYWxpYXMoR0Jvb2wgLyp2YWEqLykge30KI2VuZGlmCgojaWZkZWYgVVNFX0NNUwogIFBvcHBsZXJDYWNoZSAqZ2V0SWNjQ29sb3JTcGFjZUNhY2hlKCk7CiNlbmRpZgoKcHJpdmF0ZToKCiAgZG91YmxlIGRlZkNUTVs2XTsJCS8vIGRlZmF1bHQgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gbWF0cml4CiAgZG91YmxlIGRlZklDVE1bNl07CQkvLyBpbnZlcnNlIG9mIGRlZmF1bHQgQ1RNCiAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgUHJvZmlsZURhdGE+PiBwcm9maWxlSGFzaDsKCiNpZmRlZiBVU0VfQ01TCiAgUG9wcGxlckNhY2hlIGljY0NvbG9yU3BhY2VDYWNoZTsKI2VuZGlmCn07CgojZW5kaWYK