LlwiCi5cIiAkWEZyZWU4NjogeGMvbGliL2ZvbnRjb25maWcvc3JjL2ZvbnRjb25maWcubWFuLHYgMS4zIDIwMDIvMDgvMTEgMTg6MTA6NDMga2VpdGhwIEV4cCAkCi5cIgouXCIgQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgouXCIKLlwiIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwouXCIgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLlwiIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAouXCIgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwouXCIgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgouXCIgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci5cIiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwouXCIgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0Ci5cIiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgouXCIKLlwiIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi5cIiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi5cIiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi5cIiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLlwiIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLlwiIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLlwiIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi5cIgouZGUgVFEKLmJyCi5ucwouVFAgXFwkMQouLgouVEggRk9OVENPTkZJRyAzICJWZXJzaW9uIDEuMCIgIlhGcmVlODYiCgouU0ggTkFNRQpmb250Y29uZmlnIFwtIEZvbnQgY29uZmlndXJhdGlvbiBhbmQgY3VzdG9taXphdGlvbiBsaWJyYXJ5CgouU0ggU1lOT1BTSVMKLm5mCi5CICNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KLkIgI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgouZmkKLlNIIERFU0NSSVBUSU9OCi5CIEZvbnRjb25maWcKaXMgYSBsaWJyYXJ5IGRlc2lnbmVkIHRvIHByb3ZpZGUgc3lzdGVtLXdpZGUgZm9udCBjb25maWd1cmF0aW9uLApjdXN0b21pemF0aW9uIGFuZCBhcHBsaWNhdGlvbiBhY2Nlc3MuCgouU0ggRlVOQ1RJT05BTCBPVkVSVklFVwpGb250Y29uZmlnIGNvbnRhaW5zIHR3byBlc3NlbnRpYWwgbW9kdWxlcywgdGhlIGNvbmZpZ3VyYXRpb24gbW9kdWxlIHdoaWNoCmJ1aWxkcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIGZyb20gWE1MIGZpbGVzIGFuZCB0aGUgbWF0Y2hpbmcgbW9kdWxlCndoaWNoIGFjY2VwdHMgZm9udCBwYXR0ZXJucyBhbmQgcmV0dXJucyB0aGUgbmVhcmVzdCBtYXRjaGluZyBmb250LgoKLlNTIEZPTlQgQ09ORklHVVJBVElPTgpUaGUgY29uZmlndXJhdGlvbiBtb2R1bGUgY29uc2lzdHMgb2YgdGhlIEZjQ29uZmlnIGRhdGF0eXBlLCBsaWJleHBhdCBhbmQKRmNDb25maWdQYXJzZSB3aGljaCB3YWxrcyBvdmVyIGFuIFhNTCB0cmVlIGFuZCBhbW1lbmRzIGEgY29uZmlndXJhdGlvbiB3aXRoCmRhdGEgZm91bmQgd2l0aGluLiAgRnJvbSBhbiBleHRlcm5hbCBwZXJzcGVjdGl2ZSwgY29uZmlndXJhdGlvbiBvZiB0aGUKbGlicmFyeSBjb25zaXN0cyBvZiBnZW5lcmF0aW5nIGEgdmFsaWQgWE1MIHRyZWUgYW5kIGZlZWRpbmcgdGhhdCB0bwpGY0NvbmZpZ1BhcnNlLiAgVGhlIG9ubHkgb3RoZXIgbWVjaGFuaXNtIHByb3ZpZGVkIHRvIGFwcGxpY2F0aW9ucyBmb3IKY2hhbmdpbmcgdGhlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiBpcyB0byBhZGQgZm9udHMgYW5kIGRpcmVjdG9yaWVzIHRvIHRoZQpsaXN0IG9mIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGZvbnQgZmlsZXMuICAKLlAKVGhlIGludGVudCBpcyB0byBtYWtlIGZvbnQgY29uZmlndXJhdGlvbnMgcmVsYXRpdmVseSBzdGF0aWMsIGFuZCBzaGFyZWQgYnkKYXMgbWFueSBhcHBsaWNhdGlvbnMgYXMgcG9zc2libGUuICBJdCBpcyBob3BlZCB0aGF0IHRoaXMgd2lsbCBsZWFkIHRvIG1vcmUKc3RhYmxlIGZvbnQgc2VsZWN0aW9uIHdoZW4gcGFzc2luZyBuYW1lcyBmcm9tIG9uZSBhcHBsaWNhdGlvbiB0byBhbm90aGVyLgpYTUwgd2FzIGNob3NlbiBhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3JtYXQgYmVjYXVzZSBpdCBwcm92aWRlcyBhIGZvcm1hdAp3aGljaCBpcyBlYXN5IGZvciBleHRlcm5hbCBhZ2VudHMgdG8gZWRpdCB3aGlsZSByZXRhaW5pbmcgdGhlIGNvcnJlY3QKc3RydWN0dXJlIGFuZCBzeW50YXguCi5QCkZvbnQgY29uZmlndXJhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGZvbnQgbWF0Y2hpbmc7IGFwcGxpY2F0aW9ucyBuZWVkaW5nIHRvCmRvIHRoZWlyIG93biBtYXRjaGluZyBjYW4gYWNjZXNzIHRoZSBhdmFpbGFibGUgZm9udHMgZnJvbSB0aGUgbGlicmFyeSBhbmQKcGVyZm9ybSBwcml2YXRlIG1hdGNoaW5nLiAgVGhlIGludGVudCBpcyB0byBwZXJtaXQgYXBwbGljYXRpb25zIHRvIHBpY2sgYW5kCmNob29zZSBhcHByb3ByaWF0ZSBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGxpYnJhcnkgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZW0gdG8KY2hvb3NlIGJldHdlZW4gdGhpcyBsaWJyYXJ5IGFuZCBhIHByaXZhdGUgY29uZmlndXJhdGlvbiBtZWNoYW5pc20uICBUaGUgaG9wZQppcyB0aGF0IHRoaXMgd2lsbCBlbnN1cmUgdGhhdCBjb25maWd1cmF0aW9uIG9mIGZvbnRzIGZvciBhbGwgYXBwbGljYXRpb25zCmNhbiBiZSBjZW50cmFsaXplZCBpbiBvbmUgcGxhY2UuICBDZW50cmFsaXppbmcgZm9udCBjb25maWd1cmF0aW9uIHdpbGwgbWFrZQpzaW1wbGlmeSBhbmQgcmVndWxhcml6ZSBmb250IGluc3RhbGxhdGlvbiBhbmQgY3VzdG9taXphdGlvbi4KCi5TUyBGT05UIFBST1BFUlRJRVMKV2hpbGUgZm9udCBwYXR0ZXJucyBtYXkgY29udGFpbiBlc3NlbnRpYWxseSBhbnkgcHJvcGVydGllcywgdGhlcmUgYXJlIHNvbWUKd2VsbCBrbm93biBwcm9wZXJ0aWVzIHdpdGggYXNzb2NpYXRlZCB0eXBlcy4gIEZvbnRjb25maWcgdXNlcyBzb21lIG9mIHRoZXNlCnByb3BlcnRpZXMgZm9yIGZvbnQgbWF0Y2hpbmcgYW5kIGZvbnQgY29tcGxldGlvbi4gIE90aGVycyBhcmUgcHJvdmlkZWQgYXMgYQpjb252ZW5pZW5jZSBmb3IgdGhlIGFwcGxpY2F0aW9ucyByZW5kZXJpbmcgbWVjaGFuaXNtLgouc3AKLm5mCi50YSAxaSAyLjc1aSAzLjVpIDUuNWkKLmxjIFwoZW0KUHJvcGVydHkJQ1BQIHN5bWJvbAlUeXBlCURlc2NyaXB0aW9uCgEBAQEKZmFtaWx5CUZDX0ZBTUlMWQlTdHJpbmcJRm9udCBmYW1pbHkgbmFtZQpzdHlsZQlGQ19TVFlMRQlTdHJpbmcJRm9udCBzdHlsZS4gT3ZlcnJpZGVzIHdlaWdodCBhbmQgc2xhbnQKc2xhbnQJRkNfU0xBTlQJSW50CUl0YWxpYywgb2JsaXF1ZSBvciByb21hbgp3ZWlnaHQJRkNfV0VJR0hUCUludAlMaWdodCwgbWVkaXVtLCBkZW1pYm9sZCwgYm9sZCBvciBibGFjawpzaXplCUZDX1NJWkUJRG91YmxlCVBvaW50IHNpemUKYXNwZWN0CUZDX0FTUEVDVAlEb3VibGUJU3RyZXRjaGVzIGdseXBocyBob3Jpem9udGFsbHkgYmVmb3JlIGhpbnRpbmcKcGl4ZWxzaXplCUZDX1BJWEVMX1NJWkUJRG91YmxlCVBpeGVsIHNpemUKc3BhY2luZwlGQ19TUEFDSU5HCUludAlQcm9wb3J0aW9uYWwsIG1vbm9zcGFjZSBvciBjaGFyY2VsbApmb3VuZHJ5CUZDX0ZPVU5EUlkJU3RyaW5nCUZvbnQgZm91bmRyeSBuYW1lCmFudGlhbGlhcwlGQ19BTlRJQUxJQVMJQm9vbAlXaGV0aGVyIGdseXBocyBjYW4gYmUgYW50aWFsaWFzZWQKaGludGluZwlGQ19ISU5USU5HCUJvb2wJV2hldGhlciB0aGUgcmFzdGVyaXplciBzaG91bGQgdXNlIGhpbnRpbmcKdmVydGljYWxsYXlvdXQJRkNfVkVSVElDQUxfTEFZT1VUCUJvb2wJVXNlIHZlcnRpY2FsIGxheW91dAphdXRvaGludAlGQ19BVVRPSElOVAlCb29sCVVzZSBhdXRvaGludGVyIGluc3RlYWQgb2Ygbm9ybWFsIGhpbnRlcgpnbG9iYWxhZHZhbmNlCUZDX0dMT0JBTF9BRFZBTkNFCUJvb2wJVXNlIGZvbnQgZ2xvYmFsIGFkdmFuY2UgZGF0YQpmaWxlCUZDX0ZJTEUJU3RyaW5nCVRoZSBmaWxlbmFtZSBob2xkaW5nIHRoZSBmb250CmluZGV4CUZDX0lOREVYCUludAlUaGUgaW5kZXggb2YgdGhlIGZvbnQgd2l0aGluIHRoZSBmaWxlCmZ0ZmFjZQlGQ19GVF9GQUNFCUZUX0ZhY2UJVXNlIHRoZSBzcGVjaWZpZWQgRnJlZVR5cGUgZmFjZSBvYmplY3QKcmFzdGVyaXplcglGQ19SQVNURVJJWkVSCVN0cmluZwlXaGljaCByYXN0ZXJpemVyIGlzIGluIHVzZQpvdXRsaW5lCUZDX09VVExJTkUJQm9vbAlXaGV0aGVyIHRoZSBnbHlwaHMgYXJlIG91dGxpbmVzCnNjYWxhYmxlCUZDX1NDQUxBQkxFCUJvb2wJV2hldGhlciBnbHlwaHMgY2FuIGJlIHNjYWxlZApzY2FsZQlGQ19TQ0FMRQlEb3VibGUJU2NhbGUgZmFjdG9yIGZvciBwb2ludC0+cGl4ZWwgY29udmVyc2lvbnMKZHBpCUZDX0RQSQlEb3VibGUJVGFyZ2V0IGRvdHMgcGVyIGluY2gKcmdiYQlGQ19SR0JBCUludAlyZ2IsIGJnciwgdnJnYiwgdmJnciAtIHN1YnBpeGVsIGdlb21ldHJ5Cm1pbnNwYWNlCUZDX01JTlNQQUNFCUJvb2wJRWxpbWluYXRlIGxlYWRpbmcgZnJvbSBsaW5lIHNwYWNpbmcKY2hhcnNldAlGQ19DSEFSU0VUCUNoYXJTZXQJVW5pY29kZSBjaGFycyBlbmNvZGVkIGJ5IHRoZSBmb250CmxhbmcJRkNfTEFORwlTdHJpbmcJTGlzdCBvZiBSRkMtMzA2Ni1zdHlsZSBsYW5ndWFnZXMgdGhpcyBmb250IHN1cHBvcnRzCi5EVAouZmkKCi5TUyBGT05UIE1BVENISU5HCkZvbnRjb25maWcgcGVyZm9ybXMgbWF0Y2hpbmcgYnkgbWVhc3VyaW5nIHRoZSBkaXN0YW5jZSBmcm9tIGEgcHJvdmlkZWQKcGF0dGVybiB0byBhbGwgb2YgdGhlIGF2YWlsYWJsZSBmb250cyBpbiB0aGUgc3lzdGVtLiAgVGhlIGNsb3Nlc3QgbWF0Y2hpbmcKZm9udCBpcyBzZWxlY3RlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgZm9udCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCwgYnV0CmRvZXNuJ3QgZW5zdXJlIHRoYXQgaXQgaXMgYW55dGhpbmcgbGlrZSB0aGUgcmVxdWVzdGVkIHBhdHRlcm4uCi5QCkZvbnQgbWF0Y2hpbmcgc3RhcnRzIHdpdGggYW4gYXBwbGljYXRpb24gY29uc3RydWN0ZWQgcGF0dGVybi4gIFRoZSBkZXNpcmVkCmF0dHJpYnV0ZXMgb2YgdGhlIHJlc3VsdGluZyBmb250IGFyZSBjb2xsZWN0ZWQgdG9nZXRoZXIgaW4gYW4gRmNQYXR0ZXJuCm9iamVjdC4gIEVhY2ggcHJvcGVydHkgb2YgdGhlIHBhdHRlcm4gY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzOyB0aGVzZQphcmUgbGlzdGVkIGluIHByaW9yaXR5IG9yZGVyOyBtYXRjaGVzIGVhcmxpZXIgaW4gdGhlIGxpc3QgYXJlIGNvbnNpZGVyZWQKImNsb3NlciIgdGhhbiBtYXRjaGVzIGxhdGVyIGluIHRoZSBsaXN0LgouUApUaGUgaW5pdGlhbCBwYXR0ZXJuIGlzIG1vZGlmaWVkIGJ5IGFwcGx5aW5nIHRoZSBsaXN0IG9mIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zCnNwZWNpZmljIHRvIHBhdHRlcm5zIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uOyBlYWNoIGNvbnNpc3RzIG9mIGEgbWF0Y2gKcHJlZGljYXRlIGFuZCBhIHNldCBvZiBlZGl0aW5nIG9wZXJhdGlvbnMuICBUaGV5IGFyZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIKdGhleSBhcHBlYXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbi4gIEVhY2ggbWF0Y2ggY2F1c2VzIHRoZSBhc3NvY2lhdGVkCnNlcXVlbmNlIG9mIGVkaXRpbmcgb3BlcmF0aW9ucyB0byBiZSBhcHBsaWVkLgouUApBZnRlciB0aGUgcGF0dGVybiBoYXMgYmVlbiBlZGl0ZWQsIGEgc2VxdWVuY2Ugb2YgZGVmYXVsdCBzdWJzdGl0dXRpb25zIGFyZQpwZXJmb3JtZWQgdG8gY2Fub25pY2FsaXplIHRoZSBzZXQgb2YgYXZhaWxhYmxlIHByb3BlcnRpZXM7IHRoaXMgYXZvaWRzIHRoZQpuZWVkIGZvciB0aGUgbG93ZXIgbGF5ZXJzIHRvIGNvbnN0YW50bHkgcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaW91cwpmb250IHByb3BlcnRpZXMgZHVyaW5nIHJlbmRlcmluZy4KLlAKVGhlIGNhbm9uaWNhbCBmb250IHBhdHRlcm4gaXMgZmluYWxseSBtYXRjaGVkIGFnYWluc3QgYWxsIGF2YWlsYWJsZSBmb250cy4KVGhlIGRpc3RhbmNlIGZyb20gdGhlIHBhdHRlcm4gdG8gdGhlIGZvbnQgaXMgbWVhc3VyZWQgZm9yIGVhY2ggb2Ygc2V2ZXJhbApwcm9wZXJ0aWVzOiBmb3VuZHJ5LCBjaGFyc2V0LCBmYW1pbHksIGxhbmcsIHNwYWNpbmcsIHBpeGVsc2l6ZSwgc3R5bGUsCnNsYW50LCB3ZWlnaHQsIGFudGlhbGlhcywgcmFzdGVyaXplciBhbmQgb3V0bGluZS4gIFRoaXMgbGlzdCBpcyBpbiBwcmlvcml0eQpvcmRlciAtLSByZXN1bHRzIG9mIGNvbXBhcmluZyBlYXJsaWVyIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCB3ZWlnaCBtb3JlCmhlYXZpbHkgdGhhbiBsYXRlciBlbGVtZW50cy4KLlAKVGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSB0byB0aGlzIHJ1bGU7IGZhbWlseSBuYW1lcyBhcmUgc3BsaXQgaW50byB0d28KYmluZGluZ3M7IHN0cm9uZyBhbmQgd2Vhay4gIFN0cm9uZyBmYW1pbHkgbmFtZXMgYXJlIGdpdmVuIGdyZWF0ZXIgcHJlY2VkZW5jZQppbiB0aGUgbWF0Y2ggdGhhbiBsYW5nIGVsZW1lbnRzIHdoaWxlIHdlYWsgZmFtaWx5IG5hbWVzIGFyZSBnaXZlbiBsb3dlcgpwcmVjZWRlbmNlIHRoYW4gbGFuZyBlbGVtZW50cy4gIFRoaXMgcGVybWl0cyB0aGUgZG9jdW1lbnQgbGFuZ3VhZ2UgdG8gZHJpdmUKZm9udCBzZWxlY3Rpb24gd2hlbiBhbnkgZG9jdW1lbnQgc3BlY2lmaWVkIGZvbnQgaXMgdW5hdmFpbGFibGUuCi5QClRoZSBwYXR0ZXJuIHJlcHJlc2VudGluZyB0aGF0IGZvbnQgaXMgYXVnbWVudGVkIHRvIGluY2x1ZGUgYW55IHByb3BlcnRpZXMKZm91bmQgaW4gdGhlIHBhdHRlcm4gYnV0IG5vdCBmb3VuZCBpbiB0aGUgZm9udCBpdHNlbGY7IHRoaXMgcGVybWl0cyB0aGUKYXBwbGljYXRpb24gdG8gcGFzcyByZW5kZXJpbmcgaW5zdHJ1Y3Rpb25zIG9yIGFueSBvdGhlciBkYXRhIHRocm91Z2ggdGhlCm1hdGNoaW5nIHN5c3RlbS4gIEZpbmFsbHksIHRoZSBsaXN0IG9mIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zIHNwZWNpZmljIHRvCmZvbnRzIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGFyZSBhcHBsaWVkIHRvIHRoZSBwYXR0ZXJuLiAgVGhpcyBtb2RpZmllZApwYXR0ZXJuIGlzIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbi4KLlAKVGhlIHJldHVybiB2YWx1ZSBjb250YWlucyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGxvY2F0ZSBhbmQgcmFzdGVyaXplIHRoZQpmb250LCBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZSwgcGl4ZWwgc2l6ZSBhbmQgb3RoZXIgcmVuZGVyaW5nIGRhdGEuICBBcwpub25lIG9mIHRoZSBpbmZvcm1hdGlvbiBpbnZvbHZlZCBwZXJ0YWlucyB0byB0aGUgRnJlZVR5cGUgbGlicmFyeSwKYXBwbGljYXRpb25zIGFyZSBmcmVlIHRvIHVzZSBhbnkgcmFzdGVyaXphdGlvbiBlbmdpbmUgb3IgZXZlbiB0byB0YWtlCnRoZSBpZGVudGlmaWVkIGZvbnQgZmlsZSBhbmQgYWNjZXNzIGl0IGRpcmVjdGx5LgouUApUaGUgbWF0Y2gvZWRpdCBzZXF1ZW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJlIHBlcmZvcm1lZCBpbiB0d28gcGFzc2VzCmJlY2F1c2UgdGhlcmUgYXJlIGVzc2VudGlhbGx5IHR3byBkaWZmZXJlbnQgb3BlcmF0aW9ucyBuZWNlc3NhcnkgLS0gdGhlCmZpcnN0IGlzIHRvIG1vZGlmeSBob3cgZm9udHMgYXJlIHNlbGVjdGVkOyBhbGlhc2luZyBmYW1pbGllcyBhbmQgYWRkaW5nCnN1aXRhYmxlIGRlZmF1bHRzLiAgVGhlIHNlY29uZCBpcyB0byBtb2RpZnkgaG93IHRoZSBzZWxlY3RlZCBmb250cyBhcmUKcmFzdGVyaXplZC4gIFRob3NlIG11c3QgYXBwbHkgdG8gdGhlIHNlbGVjdGVkIGZvbnQsIG5vdCB0aGUgb3JpZ2luYWwgcGF0dGVybgphcyBmYWxzZSBtYXRjaGVzIHdpbGwgb2Z0ZW4gb2NjdXIuCi5TUyBGT05UIExJU1QgTUFUQ0hJTkcKLlAKV2hpbGUgbWFueSBhcHBsaWNhdGlvbnMgd2FudCB0byBsb2NhdGUgYSBzaW5nbGUgZm9udCBiZXN0IG1hdGNoaW5nIHRoZWlyCnNlYXJjaCBjcml0ZXJpYSwgb3RoZXIgYXBwbGljYXRpb25zIG5lZWQgdG8gYnVpbGQgYSBzZXQgb2YgZm9udHMgd2hpY2ggY2FuCmJlIHVzZWQgdG8gcHJlc2VudCBhbnkgVW5pY29kZSBkYXRhLiAgRm9udGNvbmZpZyBwcm92aWRlcyBhbiBBUEkgdG8gZ2VuZXJhdGUKYSBsaXN0IHNvcnRlZCBieSB0aGUgbmVhcm5lc3Mgb2YgZWFjaCBmb250IHRvIHRoZSBwYXR0ZXJuLiAgRXZlcnkgZm9udCBpbgp0aGUgc3lzdGVtIGlzIGNvbnNpZGVyZWQsIHRoZSBiZXN0IG1hdGNoaW5nIGZvbnRzIGFyZSBwbGFjZWQgZmlyc3QuICBUaGUKYXBwbGljYXRpb24gdGhlbiBjYW4gc2VsZWN0IHdoZXRoZXIgdGhlIHJlbWFpbmluZyBmb250cyBhcmUgdW5jb25kaXRpb25hbGx5IAppbmNsdWRlZCBpbiB0aGUgbGlzdCwgb3Igd2hldGhlciB0aGV5IGFyZSBpbmNsdWRlZCBvbmx5IGlmIHRoZXkgY292ZXIKcG9ydGlvbnMgb2YgVW5pY29kZSBub3QgY292ZXJlZCBieSBhbnkgb2YgdGhlIHByZWNlZWRpbmcgZm9udHMuCi5QClRoZSBsaXN0IHJlc3VsdGluZyBmcm9tIHRoaXMgbWF0Y2ggaXMgcmVwcmVzZW50ZWQgYnkgcmVmZXJlbmNlcyB0byB0aGUKb3JpZ2luYWwgZm9udCBwYXR0ZXJucyBhbmQgc28gY29uc3VtZXMgdmVyeSBsaXR0bGUgbWVtb3J5LiAgVXNpbmcgYSBsaXN0CmVudHJ5IGludm9sdmVzIGNyZWF0aW5nIGEgcGF0dGVybiB3aGljaCBjb21iaW5lcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKZm9udCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIGFuZCBleGVjdXRpbmcgdGhlIGZvbnQKc3Vic3RpdHV0aW9ucy4KLlNTIEZPTlQgTkFNRVMKRm9udGNvbmZpZyBwcm92aWRlcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gZm9yIHBhdHRlcm5zIHRoYXQgdGhlIGxpYnJhcnkKY2FuIGJvdGggYWNjZXB0IGFuZCBnZW5lcmF0ZS4gIFRoZSByZXByZXNlbnRhdGlvbiBpcyBpbiB0aHJlZSBwYXJ0cywgZmlyc3QgYQpsaXN0IG9mIGZhbWlseSBuYW1lcywgc2Vjb25kIGEgbGlzdCBvZiBwb2ludCBzaXplcyBhbmQgZmluYWxseSBhIGxpc3Qgb2YKYWRkaXRpb25hbCBwcm9wZXJ0aWVzOgoubmYKCTxmYW1pbGllcz4tPHBvaW50IHNpemVzPjo8bmFtZTE+PTx2YWx1ZXMxPjo8bmFtZTI+PTx2YWx1ZXMyPi4uLgouZmkKVmFsdWVzIGluIGEgbGlzdCBhcmUgc2VwYXJhdGVkIHdpdGggY29tbWFzLiAgVGhlIG5hbWUgbmVlZG4ndCBpbmNsdWRlIGVpdGhlcgpmYW1pbGllcyBvciBwb2ludCBzaXplczsgdGhleSBjYW4gYmUgZWxpZGVkLiAgSW4gYWRkaXRpb24sIHRoZXJlIGFyZQpzeW1ib2xpYyBjb25zdGFudHMgdGhhdCBzaW11bHRhbmVvdXNseSBpbmRpY2F0ZSBib3RoIGEgbmFtZSBhbmQgYSB2YWx1ZS4KSGVyZSBhcmUgc29tZSBleGFtcGxlczoKLnNwCi5uZgoudGEgMWkgM2kKCVRpbWVzLTEyCTEyIHBvaW50IFRpbWVzIFJvbWFuCglUaW1lcy0xMjpib2xkCTEyIHBvaW50IFRpbWVzIEJvbGQKCUNvdXJpZXI6aXRhbGljCUNvdXJpZXIgSXRhbGljIGluIHRoZSBkZWZhdWx0IHNpemUKCU1vbm9zcGFjZTptYXRyaXg9MSAuMSAwIDEJVGhlIHVzZXJzIHByZWZlcnJlZCBtb25vc3BhY2UgZm9udAoJCXdpdGggYXJ0aWZpY2lhbCBvYmxpcXVpbmcKLmZpCi5EVAoKLlNIIExBTkcgVEFHUwouUApFYWNoIGZvbnQgaW4gdGhlIGRhdGFiYXNlIGNvbnRhaW5zIGEgbGlzdCBvZiBsYW5ndWFnZXMgaXQgc3VwcG9ydHMuICBUaGlzIGlzCmNvbXB1dGVkIGJ5IGNvbXBhcmluZyB0aGUgVW5pY29kZSBjb3ZlcmFnZSBvZiB0aGUgZm9udCB3aXRoIHRoZSBvcnRob2dyYXBoeQpvZiBlYWNoIGxhbmd1YWdlLiAgTGFuZ3VhZ2VzIGFyZSB0YWdnZWQgdXNpbmcgYW4gUkZDLTMwNjYgY29tcGF0aWJsZSBuYW1pbmcKYW5kIG9jY3VyIGluIHR3byBwYXJ0cyAtLSB0aGUgSVNPNjM5IGxhbmd1YWdlIHRhZyBmb2xsb3dlZCBhIGh5cGhlbiBhbmQgdGhlbgpieSB0aGUgSVNPIDMxNjYgY291bnRyeSBjb2RlLiAgVGhlIGh5cGhlbiBhbmQgY291bnRyeSBjb2RlIG1heSBiZSBlbGlkZWQuCgouUApGb250Y29uZmlnIGhhcyBvcnRob2dyYXBoaWVzIGZvciBzZXZlcmFsIGxhbmd1YWdlcyBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgpObyBwcm92aXNpb24gaGFzIGJlZW4gbWFkZSBmb3IgYWRkaW5nIG5ldyBvbmVzIGFzaWRlIGZyb20gcmVidWlsZGluZyB0aGUKbGlicmFyeS4gIEl0IGN1cnJlbnRseSBzdXBwb3J0cyAxMjIgb2YgdGhlIDEzOSBsYW5ndWFnZXMgbmFtZWQgaW4gSVNPIDYzOS0xLAoxNDEgb2YgdGhlIGxhbmd1YWdlcyB3aXRoIHR3by1sZXR0ZXIgY29kZXMgZnJvbSBJU08gNjM5LTIgYW5kIGFub3RoZXIgMzAKbGFuZ3VhZ2VzIHdpdGggb25seSB0aHJlZS1sZXR0ZXIgY29kZXMuCgouU0ggREFUQVRZUEVTCgouVFAKLkIgRmNDaGFyOAouVFEKLkIgRmNDaGFyMTYKLlRRCi5CIEZjQ2hhcjMyCi5UUQouQiBGY0Jvb2wKVGhlc2UgYXJlIHByaW1pdGl2ZSBkYXRhdHlwZXM7IHRoZSBGY0NoYXIqIHR5cGVzIGhvbGQgcHJlY2lzZWx5IHRoZSBudW1iZXIKb2YgYml0cyBzdGF0ZWQgKGlmIHN1cHBvcnRlZCBieSB0aGUgQyBpbXBsZW1lbnRhdGlvbikuICBGY0Jvb2wgaG9sZHMKb25lIG9mIHR3byBDUFAgc3ltYm9sczogRmNGYWxzZSBvciBGY1RydWUuCgouVFAKLkIgRmNNYXRyaXgKQW4gRmNNYXRyaXggaG9sZHMgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uLCB1c3VhbGx5IHVzZWQgdG8gcmVzaGFwZSBnbHlwaHMuCkEgc21hbGwgc2V0IG9mIG1hdHJpeCBvcGVyYXRpb25zIGFyZSBwcm92aWRlZCB0byBtYW5pcHVsYXRlIHRoZXNlLgouc3AKLm5mCgl0eXBlZGVmIHN0cnVjdCBfRmNNYXRyaXggewoJCWRvdWJsZSB4eCwgeHksIHl4LCB5eTsKCX0gRmNNYXRyaXg7Ci5maQoKLlRQCi5CIEZjQ2hhclNldApBbiBGY0NoYXJTZXQgaXMgYW4gYWJzdHJhY3QgdHlwZSB0aGF0IGhvbGRzIHRoZSBzZXQgb2YgZW5jb2RlZCB1bmljb2RlIGNoYXJzCmluIGEgZm9udC4gIE9wZXJhdGlvbnMgdG8gYnVpbGQgYW5kIGNvbXBhcmUgdGhlc2Ugc2V0cyBhcmUgcHJvdmlkZWQuCgouVFAKLkIgRmNUeXBlClRhZ3MgdGhlIGtpbmQgb2YgZGF0YSBzdG9yZWQgaW4gYW4gRmNWYWx1ZS4KCi5UUAouQiBGY1ZhbHVlCkFuIEZjVmFsdWUgb2JqZWN0IGhvbGRzIGEgc2luZ2xlIHZhbHVlIHdpdGggb25lIG9mIGEgbnVtYmVyIG9mIGRpZmZlcmVudAp0eXBlcy4gIFRoZSAndHlwZScgdGFnIGluZGljYXRlcyB3aGljaCBtZW1iZXIgaXMgdmFsaWQuCi5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY1ZhbHVlIHsKCQlGY1R5cGUgdHlwZTsKCQl1bmlvbiB7CgkJCWNvbnN0IEZjQ2hhcjggKnM7CgkJCWludCBpOwoJCQlGY0Jvb2wgYjsKCQkJZG91YmxlIGQ7CgkJCWNvbnN0IEZjTWF0cml4ICptOwoJCQljb25zdCBGY0NoYXJTZXQgKmM7CgkJfSB1OwoJfSBGY1ZhbHVlOwouZmkKLlAKLnRhIDFpIDJpIDNpIDRpCi5uZgoubGMgXChlbQoJdHlwZQlVbmlvbiBtZW1iZXIJRGF0YXR5cGUKCQEBAQoJRmNUeXBlVm9pZAkobm9uZSkJKG5vbmUpCglGY1R5cGVJbnRlZ2VyCWkJaW50CglGY1R5cGVEb3VibGUJZAlkb3VibGUKCUZjVHlwZVN0cmluZwlzCWNoYXIgKgoJRmNUeXBlQm9vbAliCWIKCUZjVHlwZU1hdHJpeAltCUZjTWF0cml4ICoKCUZjVHlwZUNoYXJTZXQJYwlGY0NoYXJTZXQgKgouZmkKLkRUCi5UUAouQiBGY1BhdHRlcm4KaG9sZHMgYSBzZXQgb2YgbmFtZXMgd2l0aCBhc3NvY2lhdGVkIHZhbHVlIGxpc3RzOyBlYWNoIG5hbWUgcmVmZXJzIHRvIGEKcHJvcGVydHkgb2YgYSBmb250LiAgRmNQYXR0ZXJucyBhcmUgdXNlZCBhcyBpbnB1dHMgdG8gdGhlIG1hdGNoaW5nIGNvZGUgYXMKd2VsbCBhcyBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGZvbnRzLiAgRWFjaCBwcm9wZXJ0eSBjYW4gaG9sZApvbmUgb3IgbW9yZSB2YWx1ZXM7IGNvbnZlbnRpb25hbGx5IGFsbCBvZiB0aGUgc2FtZSB0eXBlLCBhbHRob3VnaCB0aGUKaW50ZXJmYWNlIGRvZXNuJ3QgZGVtYW5kIHRoYXQuCgouVFAKLkIgRmNGb250U2V0Ci5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY0ZvbnRTZXQgewoJCWludCBuZm9udDsKCQlpbnQgc2ZvbnQ7CgkJRmNQYXR0ZXJuICoqZm9udHM7Cgl9IEZjRm9udFNldDsKLmZpCQpBbiBGY0ZvbnRTZXQgY29udGFpbnMgYSBsaXN0IG9mIEZjUGF0dGVybnMuICBJbnRlcm5hbGx5IGZvbnRjb25maWcgdXNlcyB0aGlzCmRhdGEgc3RydWN0dXJlIHRvIGhvbGQgc2V0cyBvZiBmb250cy4gIEV4dGVybmFsbHksIGZvbnRjb25maWcgcmV0dXJucyB0aGUKcmVzdWx0cyBvZiBsaXN0aW5nIGZvbnRzIGluIHRoaXMgZm9ybWF0LiAgJ25mb250JyBob2xkcyB0aGUgbnVtYmVyIG9mCnBhdHRlcm5zIGluIHRoZSAnZm9udHMnIGFycmF5OyAnc2ZvbnQnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhhdAphcnJheS4KCi5UUAouQiBGY1N0clNldAouQiBGY1N0ckxpc3QKRmNTdHJTZXQgaG9sZHMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBjYW4gYmUgYXBwZW5kZWQgdG8gYW5kIGVudW1lcmF0ZWQuCkl0cyB1bmlxdWUgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCB0aGUgZW51bWVyYXRpb24gd29ya3MgZXZlbiB3aGlsZSBzdHJpbmdzCmFyZSBhcHBlbmRlZCBkdXJpbmcgZW51bWVyYXRpb24uICBGY1N0ckxpc3QgaXMgdXNlZCBkdXJpbmcgZW51bWVyYXRpb24gdG8Kc2FmZWx5IGFuZCBjb3JyZWN0bHkgd2FsayB0aGUgbGlzdCBvZiBzdHJpbmdzIGV2ZW4gd2hpbGUgdGhhdCBsaXN0IGlzIGVkaXRlZAppbiB0aGUgbWlkZGxlIG9mIGVudW1lcmF0aW9uLgoKLlRQCi5CIEZjT2JqZWN0U2V0Ci5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY09iamVjdFNldCB7CgkJaW50IG5vYmplY3Q7CgkJaW50IHNvYmplY3Q7CgkJY29uc3QgY2hhciAqKm9iamVjdHM7Cgl9IEZjT2JqZWN0U2V0OwouZmkKLnNwCmhvbGRzIGEgc2V0IG9mIG5hbWVzIGFuZCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGZyb20gZm9udHMgYXJlCnBsYWNlZCBpbiB0aGUgdGhlIGxpc3Qgb2YgcmV0dXJuZWQgcGF0dGVybnMgd2hlbiBsaXN0aW5nIGZvbnRzLgoKLlRQCi5CIEZjT2JqZWN0VHlwZQouc3AKCXR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGUgewoJCWNvbnN0IGNoYXIgKm9iamVjdDsKCQlGY1R5cGUgdHlwZTsKCX0gRmNPYmplY3RUeXBlOwouZmkKbWFya3MgdGhlIHR5cGUgb2YgYSBwYXR0ZXJuIGVsZW1lbnQgZ2VuZXJhdGVkIHdoZW4gcGFyc2luZyBmb250IG5hbWVzLgpBcHBsaWNhdGlvbnMgY2FuIGFkZCBuZXcgb2JqZWN0IHR5cGVzIHNvIHRoYXQgZm9udCBuYW1lcyBtYXkgY29udGFpbiB0aGUgbmV3CmVsZW1lbnRzLgoKLlRQCi5CIEZjQ29uc3RhbnQKLnNwCgl0eXBlZGVmIHN0cnVjdCBfRmNDb25zdGFudCB7CgkgICAgY29uc3QgRmNDaGFyOCAqbmFtZTsKCSAgICBjb25zdCBjaGFyICpvYmplY3Q7CgkgICAgaW50IHZhbHVlOwoJfSBGY0NvbnN0YW50OwouZmkKUHJvdmlkZXMgZm9yIHN5bWJvbGljIGNvbnN0YW50cyBmb3IgbmV3IHBhdHRlcm4gZWxlbWVudHMuICBXaGVuICduYW1lJyBpcwpzZWVuIGluIGEgZm9udCBuYW1lLCBhbiAnb2JqZWN0JyBlbGVtZW50IGlzIGNyZWF0ZWQgd2l0aCB2YWx1ZSAndmFsdWUnLgoKLlRQCi5CIEZjQmxhbmtzCmhvbGRzIGEgbGlzdCBvZiBVbmljb2RlIGNoYXJzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBibGFuazsgdW5leHBlY3RlZGx5CmJsYW5rIGNoYXJzIGFyZSBhc3N1bWVkIHRvIGJlIGludmFsaWQgYW5kIGFyZSBlbGlkZWQgZnJvbSB0aGUgY2hhcnNldAphc3NvY2lhdGVkIHdpdGggdGhlIGZvbnQuCgouVFAKLkIgRmNGaWxlQ2FjaGUKaG9sZHMgdGhlIHBlci11c2VyIGNhY2hlIGluZm9ybWF0aW9uIGZvciB1c2Ugd2hpbGUgbG9hZGluZyB0aGUgZm9udApkYXRhYmFzZS4gVGhpcyBpcyBidWlsdCBhdXRvbWF0aWNhbGx5IGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdoZW4KdGhhdCBpcyBsb2FkZWQuICBBcHBsaWNhdGlvbnMgbXVzdCBhbHdheXMgcGFzcyAnMCcgd2hlbiBvbmUgaXMgcmVxdWVzdGVkLgoKLlRQCi5CIEZjQ29uZmlnCmhvbGRzIGEgY29tcGxldGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeTsgdGhlcmUgaXMgb25lIGRlZmF1bHQKY29uZmlndXJhdGlvbiwgb3RoZXIgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gWE1MIGRhdGEgc3RydWN0dXJlcy4gIEFsbApwdWJsaWMgZW50cnkgcG9pbnRzIHRoYXQgbmVlZCBnbG9iYWwgZGF0YSBjYW4gdGFrZSBhbiBvcHRpb25hbCBGY0NvbmZpZyoKYXJndW1lbnQ7IHBhc3NpbmcgMCB1c2VzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBGY0NvbmZpZyBvYmplY3RzIGhvbGQgdHdvCnNldHMgb2YgZm9udHMsIHRoZSBmaXJzdCBjb250YWlucyB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24sIHRoZQpzZWNvbmQgc2V0IGhvbGRzIHRob3NlIGFkZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhdCBydW4tdGltZS4gIEludGVyZmFjZXMKdGhhdCBuZWVkIHRvIHJlZmVyZW5jZSBhIHBhcnRpY3VsYXQgc2V0IHVzZSBvbmUgb2YgdGhlIEZjU2V0TmFtZSBlbnVtZXJhdGVkCnZhbHVlcy4KCi5UUAouQiBGY1NldE5hbWUKU3BlY2lmaWVzIG9uZSBvZiB0aGUgdHdvIHNldHMgb2YgZm9udHMgYXZhaWxhYmxlIGluIGEgY29uZmlndXJhdGlvbjsKRmNTZXRTeXN0ZW0gZm9yIHRob3NlIGZvbnRzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQKRmNTZXRBcHBsaWNhdGlvbiB3aGljaCBob2xkcyBmb250cyBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24uCgouVFAKLkIgRmNSZXN1bHQKVXNlZCBhcyBhIHJldHVybiB0eXBlIGZvciBmdW5jdGlvbnMgbWFuaXB1bGF0aW5nIEZjUGF0dGVybiBvYmplY3RzLgouUAoudGEgMWkgM2kgNGkKLmxjIFwoZW0KCVJlc3VsdCBjb2RlCU1lYW5pbmcKLmJyCgkBAQouYnIKCUZjUmVzdWx0TWF0Y2gJT2JqZWN0IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgSUQKLmJyCglGY1Jlc3VsdE5vTWF0Y2gJT2JqZWN0IGRvZXNuJ3QgZXhpc3QgYXQgYWxsCi5icgoJRmNSZXN1bHRUeXBlTWlzbWF0Y2gJT2JqZWN0IGV4aXN0cywgYnV0IHRoZSB0eXBlIGRvZXNuJ3QgbWF0Y2gKLmJyCglGY1Jlc3VsdE5vSWQJT2JqZWN0IGV4aXN0cywgYnV0IGhhcyBmZXdlciB2YWx1ZXMgdGhhbiBzcGVjaWZpZWQKLmJyCi5EVAoKLlRQCi5CIEZjQXRvbWljClVzZWQgZm9yIGxvY2tpbmcgYWNjZXNzIHRvIGNvbmZpZyBmaWxlcy4gIFByb3ZpZGVzIGEgc2FmZSB3YXkgdG8gdXBkYXRlCmNvbmZpZ3VyYXRpb24gZmlsZXMuCgouU0ggRlVOQ1RJT05TCgouU1MgRmNNYXRyaXgKRmNNYXRyaXggc3RydWN0dXJlcyBob2xkIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBpbiBtYXRyaXggZm9ybS4KLlRQCiNkZWZpbmUgRmNNYXRyaXhJbml0KG0pCSgobSktPnh4ID0gKG0pLT55eSA9IDEsIChtKS0+eHkgPSAobSktPnl4ID0gMCkKSW5pdGlhbGl6ZXMgYSBtYXRyaXggdG8gdGhlIGlkZW50aWZ5IHRyYW5zZm9ybWF0aW9uLgoKLlRQCkZjTWF0cml4ICpGY01hdHJpeENvcHkgKGNvbnN0IEZjTWF0cml4ICptYXQpCkFsbG9jYXRlcyBhIG5ldyBGY01hdHJpeCBhbmQgY29waWVzICdtYXQnIGludG8gaXQuCgouVFAKRmNCb29sIEZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0MikKUmV0dXJucyBGY1RydWUgaWYgJ21hdDEnIGFuZCAnbWF0MicgYXJlIGVxdWFsLCBlbHNlIEZjRmFsc2UuCgouVFAKdm9pZCBGY01hdHJpeE11bHRpcGx5IChGY01hdHJpeCAqcmVzdWx0LCBjb25zdCBGY01hdHJpeCAqYSwgY29uc3QgRmNNYXRyaXggKmIpCk11bHRpcGxpZXMgJ2EnIGFuZCAnYicgdG9nZXRoZXIsIHBsYWNpbmcgdGhlIHJlc3VsdCBpbgoncmVzdWx0Jy4gICdyZXN1bHQnIG1heSByZWZlciB0byB0aGUgc2FtIG1hdHJpeCBhcyBlaXRoZXIgJ2EnIG9yICdiJy4KCi5UUAp2b2lkIEZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKQpJZiAnYycgaXMgY29zKGFuZ2xlKSBhbmQgJ3MnIGlzIHNpbihhbmdsZSksIEZjTWF0cml4Um90YXRlIHJvdGF0ZXMgdGhlCm1hdHJpeCBieSAnYW5nbGUnLgoKLlRQCnZvaWQgRmNNYXRyaXhTY2FsZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBzeCwgZG91YmxlIHN5KQpTY2FsZXMgJ20nIGJ5ICdzeCcgaW4gdGhlIGhvcml6b250YWwgZGltZW5zaW9uIGFuZCAnc3knIGluIHRoZQp2ZXJ0aWNhbCBkaW1lbnNpb24uCgouVFAKdm9pZCBGY01hdHJpeFNoZWFyIChGY01hdHJpeCAqbSwgZG91YmxlIHNoLCBkb3VibGUgc3YpClNoZWFycyAnbScgYnkgJ3NoJyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gYW5kICdzdicgaW4gdGhlCnZlcnRpY2FsIGRpcmVjdGlvbi4KCi5TUyBGY0NoYXJTZXQKQW4gRmNDaGFyU2V0IGlzIGEgYm9vbGVhbiBhcnJheSBpbmRpY2F0aW5nIGEgc2V0IG9mIHVuaWNvZGUgY2hhcnMuICBUaG9zZQphc3NvY2lhdGVkIHdpdGggYSBmb250IGFyZSBtYXJrZWQgY29uc3RhbnQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQuCkZjQ2hhclNldHMgbWF5IGJlIHJlZmVyZW5jZSBjb3VudGVkIGludGVybmFsbHkgdG8gcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbjsKdGhpcyBtYXkgYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgYXMgdGhlIHJlc3VsdCBvZiBGY0NoYXJTZXRDb3B5IG1heQpyZXR1cm4gaXQncyBhcmd1bWVudCwgYW5kIHRoYXQgQ2hhclNldCBtYXkgcmVtYWluIHVubW9kaWZpYWJsZS4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldENyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBGY0NoYXJTZXQgb2JqZWN0LgoKLlRQCnZvaWQgRmNDaGFyU2V0RGVzdHJveSAoRmNDaGFyU2V0ICpmY3MpCkZyZWVzIGFuIEZjQ2hhclNldCBvYmplY3QuCgouVFAKRmNCb29sIEZjQ2hhclNldEFkZENoYXIgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQpBZGRzIGEgc2luZ2xlIHVuaWNvZGUgY2hhciB0byB0aGUgc2V0LCByZXR1cm5pbmcgRmNGYWxzZSBvbgpmYWlsdXJlLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgYSBjb25zdGFudCBzZXQgb3IgZnJvbSBydW5uaW5nIG91dCBvZiBtZW1vcnkuCgouVFAKRmNDaGFyU2V0ICpGY0NoYXJTZXRDb3B5IChGY0NoYXJTZXQgKnNyYykKTWFrZXMgYSBjb3B5IG9mICdzcmMnOyBub3RlIHRoYXQgdGhpcyBtYXkgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIG1vcmUgdGhhbgppbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiAnc3JjJy4KCi5UUApGY0Jvb2wgRmNDaGFyU2V0RXF1YWwgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQpSZXR1cm5zIHdoZXRoZXIgJ2EnIGFuZCAnYicgY29udGFpbiB0aGUgc2FtZSBzZXQgb2YgdW5pY29kZSBjaGFycy4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldEludGVyc2VjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpClJldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gYm90aCAnYScgYW5kICdiJy4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldFVuaW9uIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7ClJldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gZWl0aGVyICdhJyBvciAnYicuCgouVFAgCkZjQ2hhclNldCAqRmNDaGFyU2V0U3VidHJhY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQpSZXR1cm5zIGEgc2V0IGluY2x1ZGluZyBvbmx5IHRob3NlIGNoYXJzIGZvdW5kIGluICdhJyBidXQgbm90ICdiJy4KCi5UUApGY0Jvb2wgRmNDaGFyU2V0SGFzQ2hhciAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpClJldHVybnMgd2hldGhlciAnZmNzJyBjb250YWlucyB0aGUgY2hhciAndWNzNCcuCgouVFAKRmNDaGFyMzIgRmNDaGFyU2V0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSkKUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuaWNvZGUgY2hhcnMgaW4gJ2EnLgoKLlRQCkZjQ2hhcjMyIEZjQ2hhclNldEludGVyc2VjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHRoYXQgYXJlIGluIGJvdGggJ2EnIGFuZCAnYicuCgouVFAKRmNDaGFyMzIgRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpClJldHVybnMgdGhlIG51bWJlciBvZiBjaGFycyB0aGF0IGFyZSBpbiAnYScgYnV0IG5vdCBpbiAnYicuCgouVFAKRmNCb29sIEZjQ2hhclNldElzU3Vic2V0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKUmV0dXJucyB3aGV0aGVyICdhJyBpcyBhIHN1YnNldCBvZiAnYicuCgouVFAgRmNDaGFyMzIgRmNDaGFyU2V0Rmlyc3RQYWdlIChjb25zdCBGY0NoYXJTZXQgKmEsIEZjQ2hhcjMyIFtGQ19DSEFSU0VUX01BUF9TSVpFXSwgRmNDaGFyMzIgKm5leHQpCkJ1aWxkcyBhbiBhcnJheSBvZiBiaXRzIG1hcmtpbmcgdGhlIGZpcnN0IHBhZ2Ugb2YgVW5pY29kZSBjb3ZlcmFnZSBvZiAnYScuClJldHVybnMgdGhlIGJhc2Ugb2YgdGhlIGFycmF5LiAgJ25leHQnIGNvbnRhaW5zIHRoZSBuZXh0IHBhZ2UgaW4gdGhlIGZvbnQuCgouVFAgRmNDaGFyMzIgRmNDaGFyU2V0TmV4dFBhZ2UgKGNvbnN0IEZjQ2hhclNldCAqYSwgRmNDaGFyMzIgW0ZDX0NIQVJTRVRfTUFQX1NJWkVdLCBGY0NoYXIzMiAqbmV4dCkKQnVpbGRzIGFuIGFycmF5IG9mIGJpdHMgbWFya2luZyB0aGUgVW5pY29kZSBjb3ZlcmFnZSBvZiAnYScgZm9yIHBhZ2UgJypuZXh0Jy4KUmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgYXJyYXkuICAnbmV4dCcgY29udGFpbnMgdGhlIG5leHQgcGFnZSBpbiB0aGUgZm9udC4KCi5TUyBGY1ZhbHVlCkZjVmFsdWUgaXMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHR5cGUgdGFnIGFuZCBhIHVuaW9uIG9mIGFsbCBwb3NzaWJsZQpkYXRhdHlwZXMuICBUaGUgdGFnIGlzIGFuIGVudW0gb2YgdHlwZSAKLkIgRmNUeXBlCmFuZCBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgbWVhc3VyZSBvZiBydW4tdGltZQp0eXBlY2hlY2tpbmcsIGFsdGhvdWdoIHRoYXQgZGVwZW5kcyBvbiBjYXJlZnVsIHByb2dyYW1taW5nLgoKLlRQCnZvaWQgRmNWYWx1ZURlc3Ryb3kgKEZjVmFsdWUgdikKRnJlZXMgYW55IG1lbW9yeSByZWZlcmVuY2VkIGJ5IGB2Jy4gIFZhbHVlcyBvZiB0eXBlIEZjVHlwZVN0cmluZywKRmNUeXBlTWF0cml4IGFuZCBGY1R5cGVDaGFyU2V0IHJlZmVyZW5jZSBtZW1vcnksIHRoZSBvdGhlciB0eXBlcyBkbyBub3QuCgouVFAKRmNWYWx1ZSBGY1ZhbHVlU2F2ZSAoRmNWYWx1ZSB2KQpSZXR1cm5zIGEgY29weSBvZiBgdicgZHVwbGljYXRpbmcgYW55IG9iamVjdCByZWZlcmVuY2VkIGJ5IGl0IHNvIHRoYXQgYHYnCm1heSBiZSBzYWZlbHkgZGVzdHJveWVkIHdpdGhvdXQgaGFybWluZyB0aGUgbmV3IHZhbHVlLgoKLlNTIEZjUGF0dGVybgpBbiBGY1BhdHRlcm4gaXMgYW4gb3BhcXVlIHR5cGUgdGhhdCBob2xkcyBib3RoIHBhdHRlcm5zIHRvIG1hdGNoIGFnYWluc3QgdGhlCmF2YWlsYWJsZSBmb250cywgYXMgd2VsbCBhcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBmb250LgoKLlRQCkZjUGF0dGVybiAqRmNQYXR0ZXJuQ3JlYXRlICh2b2lkKQpDcmVhdGVzIGEgcGF0dGVybiB3aXRoIG5vIHByb3BlcnRpZXM7IHVzZWQgdG8gYnVpbGQgcGF0dGVybnMgZnJvbSBzY3JhdGNoLgoKLlRQCnZvaWQgRmNQYXR0ZXJuRGVzdHJveSAoRmNQYXR0ZXJuICpwKQpEZXN0cm95cyBhIHBhdHRlcm4sIGluIHRoZSBwcm9jZXNzIGRlc3Ryb3lpbmcgYWxsIHJlbGF0ZWQgdmFsdWVzLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5FcXVhbCAoY29uc3QgRmNQYXR0ZXJuICpwYSwgY29uc3QgRmNQYXR0ZXJuICpwYik7ClJldHVybnMgd2hldGhlciAncGEnIGFuZCAncGInIGFyZSBleGFjdGx5IGFsaWtlLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5FcXVhbFN1YnNldCAoY29uc3QgRmNQYXR0ZXJuICpwYSwgY29uc3QgRmNQYXR0ZXJuICpwYiwgY29uc3QgRmNPYmplY3RTZXQgKm9zKQpSZXR1cm5zIHdoZXRoZXIgJ3BhJyBhbmQgJ3BiJyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdmFsdWVzIGZvciBhbGwgb2YgdGhlCm9iamVjdHMgaW4gJ29zJy4KCi5UUApGY0NoYXIzMiBGY1BhdHRlcm5IYXNoIChjb25zdCBGY1BhdHRlcm4gKnApClJldHVybnMgYSAzMi1iaXQgbnVtYmVyIHdoaWNoIGlzIHRoZSBzYW1lIGZvciBhbnkgdHdvIHBhdHRlcm5zIHdoaWNoIGFyZQpleGFjdGx5IGFsaWtlLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5BZGQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlLCBGY0Jvb2wgYXBwZW5kKQpBZGRzIGEgc2luZ2xlIHZhbHVlIHRvIHRoZSBsaXN0IG9mIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG5hbWVkCmBvYmplY3QnLiAgSWYgYGFwcGVuZCcgaXMgRmNUcnVlLCB0aGUgdmFsdWUgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhbnkKZXhpc3RpbmcgbGlzdCwgb3RoZXJ3aXNlIGl0IGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbmluZy4gIGB2YWx1ZScgaXMgc2F2ZWQKKHdpdGggRmNWYWx1ZVNhdmUpIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgcGF0dGVybiBzbyB0aGF0IHRoZSBsaWJyYXJ5CnJldGFpbnMgbm8gcmVmZXJlbmNlIHRvIGFueSBhcHBsaWNhdGlvbi1zdXBwbGllZCBkYXRhIHN0cnVjdHVyZS4KCi5UUApGY0Jvb2wgRmNQYXR0ZXJuQWRkV2VhayAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjVmFsdWUgdmFsdWUsIEZjQm9vbCBhcHBlbmQpCkZjUGF0dGVybkFkZFdlYWsgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgRmNQYXR0ZXJuQWRkIGV4Y2VwdCB0aGF0IGFueQp2YWx1ZXMgYWRkZWQgdG8gdGhlIGxpc3QgaGF2ZSBiaW5kaW5nICd3ZWFrJyBpbnN0ZWFkIG9mICdzdHJvbmcnLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5BZGRJbnRlZ2VyIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGkpCi5UUQpGY0Jvb2wgRmNQYXR0ZXJuQWRkRG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgZG91YmxlIGQpCi5UUQpGY0Jvb2wgRmNQYXR0ZXJuQWRkU3RyaW5nIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgY2hhciAqcykKLlRRCkZjQm9vbCBGY1BhdHRlcm5BZGRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY01hdHJpeCAqcykKLlRRCkZjQm9vbCBGY1BhdHRlcm5BZGRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgRmNDaGFyU2V0ICpjKQouVFEKRmNCb29sIEZjUGF0dGVybkFkZEJvb2wgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY0Jvb2wgYikKVGhlc2UgYXJlIGFsbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdGhhdCBpbnNlcnQgb2JqZWN0cyBvZiB0aGUgc3BlY2lmaWVkCnR5cGUgaW50byB0aGUgcGF0dGVybi4gIFVzZSB0aGVzZSBpbiBwcmVmZXJlbmNlIHRvIEZjUGF0dGVybkFkZCBhcyB0aGV5CndpbGwgcHJvdmlkZSBjb21waWxlLXRpbWUgdHlwZWNoZWNraW5nLiAgVGhlc2UgYWxsIGFwcGVuZCB2YWx1ZXMgdG8KYW55IGV4aXN0aW5nIGxpc3Qgb2YgdmFsdWVzLgoKLlRQCkZjUmVzdWx0IEZjUGF0dGVybkdldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNWYWx1ZSAqdikKUmV0dXJucyBpbiBgdicgdGhlIGBpZCd0aCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGBvYmplY3QnLgpUaGUgdmFsdWUgcmV0dXJuZWQgaXMgbm90IGEgY29weSwgYnV0IHJhdGhlciByZWZlcnMgdG8gdGhlIGRhdGEgc3RvcmVkCndpdGhpbiB0aGUgcGF0dGVybiBkaXJlY3RseS4gIEFwcGxpY2F0aW9ucyBtdXN0IG5vdCBmcmVlIHRoaXMgdmFsdWUuCgouVFAKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0SW50ZWdlciAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBpbnQgKmkpOwouVFEKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0RG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIGRvdWJsZSAqZCk7Ci5UUQpGY1Jlc3VsdCBGY1BhdHRlcm5HZXRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgY2hhciAqKmNvbnN0IHMpOwouVFEKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0TWF0cml4IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjTWF0cml4ICoqcyk7Ci5UUQpGY1Jlc3VsdCBGY1BhdHRlcm5HZXRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQ2hhclNldCAqKmMpOwouVFEKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0Qm9vbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBGY0Jvb2wgKmIpOwpUaGVzZSBhcmUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRoYXQgY2FsbCBGY1BhdHRlcm5HZXQgYW5kIHZlcmlmeSB0aGF0IHRoZQpyZXR1cm5lZCBkYXRhIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlLiBUaGV5IHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaCBpZgp0aGlzIGlzIG5vdCB0aGUgY2FzZS4gIE5vdGUgdGhhdCB0aGVzZSAobGlrZSBGY1BhdHRlcm5HZXQpIGRvIG5vdCBtYWtlIGEKY29weSBvZiBhbnkgZGF0YSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieSB0aGUgcmV0dXJuIHZhbHVlLiAgVXNlIHRoZXNlCmluIHByZWZlcmVuY2UgdG8gRmNQYXR0ZXJuR2V0IHRvIHByb3ZpZGUgY29tcGlsZS10aW1lIHR5cGVjaGVja2luZy4KCi5UUApGY1BhdHRlcm4gKkZjUGF0dGVybkJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIC4uLik7Ci5UUQpGY1BhdHRlcm4gKkZjUGF0dGVyblZhQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgdmFfbGlzdCB2YSkKQnVpbGRzIGEgcGF0dGVybiB1c2luZyBhIGxpc3Qgb2Ygb2JqZWN0cywgdHlwZXMgYW5kIHZhbHVlcy4gIEVhY2gKdmFsdWUgdG8gYmUgZW50ZXJlZCBpbiB0aGUgcGF0dGVybiBpcyBzcGVjaWZpZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6Ci5JUAoxLiBPYmplY3QgbmFtZSwgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvcGVydHkgdG8gYmUgYWRkZWQuCi5JUAoyLiBPYmplY3QgdHlwZSwgb25lIG9mIHRoZSBGY1R5cGUgZW51bWVyYXRlZCB2YWx1ZXMKLklQCjMuIFZhbHVlLCBub3QgYW4gRmNWYWx1ZSwgYnV0IHRoZSByYXcgdHlwZSBhcyBwYXNzZWQgdG8gYW55IG9mIHRoZQpGY1BhdHRlcm5BZGQ8dHlwZT4gZnVuY3Rpb25zLiAgTXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LgouSVAKVGhlIGFyZ3VtZW50IGxpc3QgaXMgdGVybWluYXRlZCBieSBhIG51bGwgb2JqZWN0IG5hbWUsIG5vIG9iamVjdCB0eXBlIG5vcgp2YWx1ZSBuZWVkIGJlIHBhc3NlZCBmb3IgdGhpcy4gIFRoZSB2YWx1ZXMgYXJlIGFkZGVkIHRvIGBwYXR0ZXJuJywgaWYKYHBhdHRlcm4nIGlzIG51bGwsIGEgbmV3IHBhdHRlcm4gaXMgY3JlYXRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGUgcGF0dGVybiBpcwpyZXR1cm5lZC4gRXhhbXBsZToKLlJTCi5JUApwYXR0ZXJuID0gRmNQYXR0ZXJuQnVpbGQgKDAsIEZDX0ZBTUlMWSwgRnRUeXBlU3RyaW5nLCAiVGltZXMiLCAoY2hhciAqKSAwKTsKLlJFCi5JUApGY1BhdHRlcm5WYUJ1aWxkIGlzIHVzZWQgd2hlbiB0aGUgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGluIHRoZSBmb3JtIG9mIGEKdmFyYXJncyB2YWx1ZS4KCi5UUApGY0Jvb2wgRmNQYXR0ZXJuRGVsIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCkKRGVsZXRlcyBhbGwgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgYG9iamVjdCcsIHJldHVybmluZyAKd2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RlZCBvciBub3QuCgouVFAKdm9pZCBGY1BhdHRlcm5QcmludCAoY29uc3QgRmNQYXR0ZXJuICpwKQpQcmludHMgYW4gZWFzaWx5IHJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIHBhdHRlcm4gdG8gc3Rkb3V0LiAgVGhlcmUgaXMKbm8gcHJvdmlzaW9uIGZvciByZXBhcnNpbmcgZGF0YSBpbiB0aGlzIGZvcm1hdCwgaXQncyBqdXN0IGZvciBkaWFnbm9zdGljcwphbmQgZGVidWdnaW5nLgoKLlRQCnZvaWQgRmNEZWZhdWx0U3Vic3RpdHV0ZSAoRmNQYXR0ZXJuICpwYXR0ZXJuKQpTdXBwbGllcyBkZWZhdWx0IHZhbHVlcyBmb3IgdW5kZXJzcGVjaWZpZWQgZm9udCBwYXR0ZXJuczoKLlJTCi5JUCBcKGJ1IApQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHN0eWxlIG9yIHdlaWdodCBhcmUgc2V0IHRvIE1lZGl1bQouSVAgXChidQpQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHN0eWxlIG9yIHNsYW50IGFyZSBzZXQgdG8gUm9tYW4KLklQIFwoYnUKUGF0dGVybnMgd2l0aG91dCBhIHNwZWNpZmllZCBwaXhlbCBzaXplIGFyZSBnaXZlbiBvbmUgY29tcHV0ZWQgZnJvbQphbnkgc3BlY2lmaWVkIHBvaW50IHNpemUgKGRlZmF1bHQgMTIpLCBkcGkgKGRlZmF1bHQgNzUpIGFuZCBzY2FsZSAoZGVmYXVsdAoxKS4KLlJFCgouVFAKRmNQYXR0ZXJuICpGY05hbWVQYXJzZSAoY29uc3QgY2hhciAqbmFtZSkKQ29udmVydHMgJ25hbWUnIGZyb20gdGhlIHN0YW5kYXJkIHRleHQgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZSBpbnRvIGEgcGF0dGVybi4KCi5UUApGY0NoYXI4ICpGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCkKQ29udmVydHMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byB0aGUgc3RhbmRhcmQgdGV4dCBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlLgpUaGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBzdGF0aWMsIGJ1dCBpbnN0ZWFkIHJlZmVycyB0byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5CndoaWNoIHNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgoKLlNTIEZjRm9udFNldApBbiBGY0ZvbnRTZXQgc2ltcGx5IGhvbGRzIGEgbGlzdCBvZiBwYXR0ZXJuczsgdGhlc2UgYXJlIHVzZWQgdG8gcmV0dXJuIHRoZQpyZXN1bHRzIG9mIGxpc3RpbmcgYXZhaWxhYmxlIGZvbnRzLgouVFAKRmNGb250U2V0ICpGY0ZvbnRTZXRDcmVhdGUgKHZvaWQpCkNyZWF0ZXMgYW4gZW1wdHkgZm9udCBzZXQuCgouVFAKdm9pZCBGY0ZvbnRTZXREZXN0cm95IChGY0ZvbnRTZXQgKnMpOwpEZXN0cm95cyBhIGZvbnQgc2V0LiAgTm90ZSB0aGF0IHRoaXMgZGVzdHJveXMgYW55IHJlZmVyZW5jZWQgcGF0dGVybnMgYXMKd2VsbC4KCi5UUCAKRmNCb29sIEZjRm9udFNldEFkZCAoRmNGb250U2V0ICpzLCBGY1BhdHRlcm4gKmZvbnQpCkFkZHMgYSBwYXR0ZXJuIHRvIGEgZm9udCBzZXQuICBOb3RlIHRoYXQgdGhlIHBhdHRlcm4gaXMgbm90IGNvcGllZCBiZWZvcmUKYmVpbmcgaW5zZXJ0ZWQgaW50byB0aGUgc2V0LgoKLlNTIEZjT2JqZWN0U2V0CkFuIEZjT2JqZWN0U2V0IGhvbGRzIGEgbGlzdCBvZiBwYXR0ZXJuIHByb3BlcnR5IG5hbWVzOyBpdCBpcyB1c2VkIHRvCmluZGljaWF0ZSB3aGljaCBwcm9wZXJ0aWVzIGFyZSB0byBiZSByZXR1cm5lZCBpbiB0aGUgcGF0dGVybnMgZnJvbQpGY0ZvbnRMaXN0LgoKLlRQCkZjT2JqZWN0U2V0ICpGY09iamVjdFNldENyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBzZXQuCgouVFAKRmNCb29sIEZjT2JqZWN0U2V0QWRkIChGY09iamVjdFNldCAqb3MsIGNvbnN0IGNoYXIgKm9iamVjdCkKQWRkcyBhIHByb3ByZXR5IG5hbWUgdG8gdGhlIHNldC4KCi5UUAp2b2lkIEZjT2JqZWN0U2V0RGVzdHJveSAoRmNPYmplY3RTZXQgKm9zKQpEZXN0cm95cyBhbiBvYmplY3Qgc2V0LgoKCi5UUApGY09iamVjdFNldCAqRmNPYmplY3RTZXRCdWlsZCAoY29uc3QgY2hhciAqZmlyc3QsIC4uLikKLlRRCkZjT2JqZWN0U2V0ICpGY09iamVjdFNldFZhQnVpbGQgKGNvbnN0IGNoYXIgKmZpcnN0LCB2YV9saXN0IHZhKQpUaGVzZSBidWlsZCBhbiBvYmplY3Qgc2V0IGZyb20gYSBudWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcy4KCi5TUyBGY09iamVjdFR5cGUKUHJvdmlkZXMgZm9yIGFwcGxjYXRpb24tc3BlY2lmaWVkIGZvbnQgbmFtZSBvYmplY3QgdHlwZXMgc28gdGhhdCBuZXcKcGF0dGVybiBlbGVtZW50cyBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gZm9udCBuYW1lcy4KCi5UUCBGY0Jvb2wgRmNOYW1lUmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKQpSZWdpc3RlciAnbnR5cGUnIG5ldyBvYmplY3QgdHlwZXMuCgouVFAKRmNCb29sIEZjTmFtZVVucmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKQpVbnJlZ2lzdGVyICdudHlwZScgb2JqZWN0IHR5cGVzLgogICAgCi5UUApjb25zdCBGY09iamVjdFR5cGUgKkZjTmFtZUdldE9iamVjdFR5cGUgKGNvbnN0IGNoYXIgKm9iamVjdCkKUmV0dXJuIHRoZSBvYmplY3QgdHlwZSBmb3IgdGhlIHBhdHRlcm4gZWxlbWVudCBuYW1lZCAnb2JqZWN0Jy4KCi5TUyBGY0NvbnN0YW50ClByb3ZpZGVzIGZvciBhcHBsaWNhdGlvbi1zcGVjaWZpZWQgc3ltYm9saWMgY29uc3RhbnRzIGZvciBmb250IG5hbWVzLgoKLlRQCkZjQm9vbCBGY05hbWVSZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cykKUmVnaXN0ZXIgJ25jb25zdHMnIG5ldyBzeW1ib2xpYyBjb25zdGFudHMuCgouVFAKRmNCb29sIEZjTmFtZVVucmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpClVucmVnaXN0ZXIgJ25jb25zdHMnIHN5bWJvbGljIGNvbnN0YW50cy4KICAgIAouVFAKY29uc3QgRmNDb25zdGFudCAqRmNOYW1lR2V0Q29uc3RhbnQgKEZjQ2hhcjggKnN0cmluZykKUmV0dXJuIHRoZSBGY0NvbnN0YW50IHN0cnVjdHVyZSByZWxhdGVkIHRvIHN5bWJvbGljIGNvbnN0YW50ICdzdHJpbmcnLgoKLlRQCkZjQm9vbCBGY05hbWVDb25zdGFudCAoRmNDaGFyOCAqc3RyaW5nLCBpbnQgKnJlc3VsdCk7ClJldHVybnMgd2hldGhlciBhIHN5bWJvbGljIGNvbnN0YW50IHdpdGggbmFtZSAnc3RyaW5nJyBpcyByZWdpc3RlcmVkLApwbGFjaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgaW4gJ3Jlc3VsdCcgaWYgcHJlc2VudC4KCi5TUyBGY0JsYW5rcwpBbiBGY0JsYW5rcyBvYmplY3QgaG9sZHMgYSBsaXN0IG9mIFVuaWNvZGUgY2hhcnMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvCmJlIGJsYW5rIHdoZW4gZHJhd24uICBXaGVuIHNjYW5uaW5nIG5ldyBmb250cywgYW55IGdseXBocyB3aGljaCBhcmUKZW1wdHkgYW5kIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIGJyb2tlbiBhbmQgbm90IHBsYWNlZCBpbgp0aGUgRmNDaGFyU2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm9udC4gIFRoaXMgcHJvdmlkZXMgYSBzaWduaWZpY2FudGx5IG1vcmUKYWNjdXJhdGUgQ2hhclNldCBmb3IgYXBwbGljYXRpb25zLgoKLlRQCkZjQmxhbmtzICpGY0JsYW5rc0NyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBGY0JsYW5rcyBvYmplY3QuCgouVFAKdm9pZCBGY0JsYW5rc0Rlc3Ryb3kgKEZjQmxhbmtzICpiKQpEZXN0cm95cyBhbiBGY0JsYW5rcyBvYmplY3QsIGZyZWVpbmcgYW55IGFzc29jaWF0ZWQgbWVtb3J5LgoKLlRQCkZjQm9vbCBGY0JsYW5rc0FkZCAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpCkFkZHMgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIGFuIEZjQmxhbmtzIG9iamVjdCwgcmV0dXJuaW5nIEZjRmFsc2UKaWYgdGhpcyBwcm9jZXNzIHJhbiBvdXQgb2YgbWVtb3J5LgoKLlRQCkZjQm9vbCBGY0JsYW5rc0lzTWVtYmVyIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCkKUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRmNCbGFua3Mgb2JqZWN0IGNvbnRhaW5zIHRoZSBpbmRpY2F0ZWQgVW5pY29kZQp2YWx1ZS4KCi5TUyBGY0NvbmZpZwpBbiBGY0NvbmZpZyBvYmplY3QgaG9sZHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgY29uZmlndXJhdGlvbi4KVGhlcmUgaXMgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hpY2ggYXBwbGljYXRpb25zIG1heSB1c2UgYnkgcGFzc2luZyAwIHRvCmFueSBmdW5jdGlvbiB1c2luZyB0aGUgZGF0YSB3aXRoaW4gYW4gRmNDb25maWcuCgouVFAKRmNDb25maWcgKkZjQ29uZmlnQ3JlYXRlICh2b2lkKQpDcmVhdGVzIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb24uCgouVFAgCnZvaWQgRmNDb25maWdEZXN0cm95IChGY0NvbmZpZyAqY29uZmlnKQpEZXN0cm95cyBhIGNvbmZpZ3VyYXRpb24gYW5kIGFueSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4gIE5vdGUgdGhhdCBjYWxsaW5nCnRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcmV0dXJuIGZyb20gRmNDb25maWdHZXRDdXJyZW50IHdpbGwgcGxhY2UgdGhlIGxpYnJhcnkKaW4gYW4gaW5kZXRlcm1pbmF0ZSBzdGF0ZS4KCi5UUApGY0Jvb2wgRmNDb25maWdTZXRDdXJyZW50IChGY0NvbmZpZyAqY29uZmlnKQpTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byAnY29uZmlnJy4gIEltcGxpY2l0bHkgY2FsbHMKRmNDb25maWdCdWlsZEZvbnRzIGlmIG5lY2Vzc2FyeSwgcmV0dXJuaW5nIEZjRmFsc2UgaWYgdGhhdCBjYWxsIGZhaWxzLgoKLlRQCkZjQ29uZmlnICpGY0NvbmZpZ0dldEN1cnJlbnQgKHZvaWQpClJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb25maWd1cmF0aW9uLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ1VwdG9EYXRlIChGY0NvbmZpZyAqY29uZmlnKQpDaGVja3MgYWxsIG9mIHRoZSBmaWxlcyByZWxhdGVkIHRvICdjb25maWcnIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlCmluLW1lbW9yeSB2ZXJzaW9uIGlzIGluIHN5bmMgd2l0aCB0aGUgZGlzayB2ZXJzaW9uLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ0J1aWxkRm9udHMgKEZjQ29uZmlnICpjb25maWcpCkJ1aWxkcyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBmb250cyBmb3IgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uICBOb3RlIHRoYXQKYW55IGNoYW5nZXMgdG8gdGhlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhpcyBjYWxsIGhhdmUgaW5kZXRlcm1pbmF0ZSBlZmZlY3RzLgpSZXR1cm5zIEZjRmFsc2UgaWYgdGhpcyBvcGVyYXRpb24gcnVucyBvdXQgb2YgbWVtb3J5LgoKLlRQCkZjU3RyTGlzdCAqRmNDb25maWdHZXRDb25maWdEaXJzIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBsaXN0IG9mIGZvbnQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCmZvciAnY29uZmlnJy4gIERvZXMgbm90IGluY2x1ZGUgYW55IHN1YmRpcmVjdG9yaWVzLgoKLlRQCkZjU3RyTGlzdCAqRmNDb25maWdHZXRGb250RGlycyAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgbGlzdCBvZiBmb250IGRpcmVjdG9yaWVzIGluICdjb25maWcnLiBUaGlzIGluY2x1ZGVzIHRoZQpjb25maWd1cmVkIGZvbnQgZGlyZWN0b3JpZXMgYWxvbmcgd2l0aCBhbnkgZGlyZWN0b3JpZXMgYmVsb3cgdGhvc2UgaW4gdGhlCmZpbGVzeXN0ZW0uCgouVFAgCkZjU3RyTGlzdCAqRmNDb25maWdHZXRDb25maWdGaWxlcyAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgbGlzdCBvZiBrbm93biBjb25maWd1cmF0aW9uIGZpbGVzIHVzZWQgdG8gZ2VuZXJhdGUgJ2NvbmZpZycuCk5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IGluY2x1ZGUgYW55IGNvbmZpZ3VyYXRpb24gZG9uZSB3aXRoIEZjQ29uZmlnUGFyc2UuCgouVFAKY2hhciAqRmNDb25maWdHZXRDYWNoZSAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB1c2VkIHRvIHN0b3JlIHBlci11c2VyIGZvbnQgaW5mb3JtYXRpb24uCgouVFAKRmNGb250U2V0ICpGY0NvbmZpZ0dldEZvbnRzIChGY0NvbmZpZyAqY29uZmlnLCBGY1NldE5hbWUgc2V0KQpSZXR1cm5zIG9uZSBvZiB0aGUgdHdvIHNldHMgb2YgZm9udHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBhcyBzcGVjaWZpZWQgCmJ5ICdzZXQnLgoKLlRQCkZjQmxhbmtzICpGY0NvbmZpZ0dldEJsYW5rcyAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgRmNCbGFua3Mgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiwgaWYgbm8KYmxhbmtzIHdlcmUgcHJlc2VudCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLgoKLlRQCmludCBGY0NvbmZpZ0dldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIGF1dG9tYXRpYyBjaGVja3Mgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKGluCnNlY29uZHMpIHNwZWNpZmllZCBpbiAnY29uZmlnJy4gIFRoZSBjb25maWd1cmF0aW9uIGlzIGNoZWNrZWQgZHVyaW5nCmEgY2FsbCB0byBGY0ZvbnRMaXN0IHdoZW4gdGhpcyBpbnRlcnZhbCBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ1NldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnLCBpbnQgcmVzY2FuSW50ZXJ2YWwpClNldHMgdGhlIHJlc2NhbiBpbnRlcnZhbDsgcmV0dXJucyBGY0ZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlIChGY0NvbmZpZyAqY29uZmlnLCBjb25zdCBjaGFyICpmaWxlKQpBZGRzIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZvbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24uCgouVFAgCkZjQm9vbCBGY0NvbmZpZ0FwcEZvbnRBZGREaXIgKEZjQ29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKmRpcikKU2NhbnMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGZvbnRzLCBhZGRpbmcgZWFjaCBvbmUgZm91bmQgdG8gdGhlCmFwcGxpY2F0aW9uLXNwZWNpZmljIHNldCBvZiBmb250cy4KCi5UUCAKdm9pZCBGY0NvbmZpZ0FwcEZvbnRDbGVhciAoRmNDb25maWcgKmNvbmZpZykKQ2xlYXJzIHRoZSBzZXQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgZm9udHMuCgouVFAKRmNCb29sIEZjQ29uZmlnU3Vic3RpdHV0ZVdpdGhQYXQgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcCwgRmNQYXR0ZXJuICpwX3BhdCBGY01hdGNoS2luZCBraW5kKQpQZXJmb3JtcyB0aGUgc2VxdWVuY2Ugb2YgcGF0dGVybiBtb2RpZmljYXRpb24gb3BlcmF0aW9ucywgaWYgJ2tpbmQnIGlzCkZjTWF0Y2hQYXR0ZXJuLCB0aGVuIHRob3NlIHRhZ2dlZCBhcyBwYXR0ZXJuIG9wZXJhdGlvbnMgYXJlIGFwcGxpZWQsIGVsc2UgCmlmICdraW5kJyBpcyBGY01hdGNoRm9udCwgdGhvc2UgdGFnZ2VkIGFzIGZvbnQgb3BlcmF0aW9ucyBhcmUgYXBwbGllZCBhbmQKcF9wYXQgaXMgdXNlZCBmb3IgPHRlc3Q+IGVsZW1lbnRzIHdpdGggdGFyZ2V0PXBhdHRlcm4uCgouVFAKRmNCb29sIEZjQ29uZmlnU3Vic3RpdHV0ZSAoRmNDb25maWcgKmNvbmZpZywgRmNQYXR0ZXJuICpwLCBGY01hdGNoS2luZCBraW5kKQpDYWxscyBGY0NvbmZpZ1N1YnN0aXR1dGVXaXRoUGF0IHNldHRpbmcgcF9wYXQgdG8gTlVMTC4KCi5UUApGY1BhdHRlcm4gKkZjRm9udE1hdGNoIChGY0NvbmZpZyAqY29uZmlnLCBGY1BhdHRlcm4gKnAsIEZjUmVzdWx0ICpyZXN1bHQpClJldHVybnMgdGhlIGZvbnQgaW4gJ2NvbmZpZycgbW9zdCBjbG9zZSBtYXRjaGluZyAncCcuICBUaGlzIGZ1bmN0aW9uCnNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciBGY0NvbmZpZ1N1YnN0aXR1dGUgYW5kIEZjRGVmYXVsdFN1YnN0aXR1dGUgaGF2ZQpiZWVuIGNhbGxlZCBmb3IgJ3AnOyBvdGhlcndpc2UgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgY29ycmVjdC4KCi5UUApGY0ZvbnRTZXQgKkZjRm9udFNvcnQgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcCwgRmNCb29sIHRyaW0sIEZjQ2hhclNldCAqKmNzcCwgRmNSZXN1bHQgKnJlc3VsdCkgUmV0dXJucyB0aGUgbGlzdCBvZiBmb250cyBzb3J0ZWQgYnkKY2xvc2VuZXNzIHRvICdwJy4gIElmICd0cmltJyBpcyBGY1RydWUsIGVsZW1lbnRzIGluIHRoZSBsaXN0IHdoaWNoIGRvbid0CmluY2x1ZGUgVW5pY29kZSBjb3ZlcmFnZSBub3QgcHJvdmlkZWQgYnkgZWFybGllciBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUKZWxpZGVkLiAgVGhlIHVuaW9uIG9mIFVuaWNvZGUgY292ZXJhZ2Ugb2YgYWxsIG9mIHRoZSBmb250cyBpcyByZXR1cm5lZCBpbgonY3NwJywgaWYgJ2NzcCcgaXMgbm90IE5VTEwuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlcgpGY0NvbmZpZ1N1YnN0aXR1dGUgYW5kIEZjRGVmYXVsdFN1YnN0aXR1dGUgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgJ3AnOwpvdGhlcndpc2UgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgY29ycmVjdC4KLlAKVGhlIHJldHVybmVkIEZjRm9udFNldCByZWZlcmVuY2VzIEZjUGF0dGVybiBzdHJ1Y3R1cmVzIHdoaWNoIG1heSBiZSBzaGFyZWQKYnkgdGhlIHJldHVybiB2YWx1ZSBmcm9tIG11bHRpcGxlIEZjRm9udFNvcnQgY2FsbHMsIGFwcGxpY2F0aW9ucyBtdXN0IG5vdAptb2RpZnkgdGhlc2UgcGF0dGVybnMuICBJbnN0ZWFkLCB0aGV5IHNob3VsZCBiZSBwYXNzZWQsIGFsb25nIHdpdGggJ3AnIHRvCkZjRm9udFJlbmRlclByZXBhcmUgd2hpY2ggY29tYmluZXMgdGhlbSBpbnRvIGEgY29tcGxldGUgcGF0dGVybi4KLlAKVGhlIEZjRm9udFNldCByZXR1cm5lZCBieSBGY0ZvbnRTb3J0IGlzIGRlc3Ryb3llZCBieSBjYWxpbmcgRmNGb250U2V0RGVzdHJveS4KCi5UUApGY1BhdHRlcm4gKkZjRm9udFJlbmRlclByZXBhcmUgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcGF0LCBGY1BhdHRlcm4gKmZvbnQpCkNyZWF0ZXMgYSBuZXcgcGF0dGVybiBjb25zaXN0aW5nIG9mIGVsZW1lbnRzIG9mICdmb250JyBub3QgYXBwZWFyaW5nIGluCidwYXQnLCBlbGVtZW50cyBvZiAncGF0JyBub3QgYXBwZWFyaW5nIGluICdmb250JyBhbmQgdGhlIGJlc3QgbWF0Y2hpbmcgdmFsdWUKZnJvbSAncGF0JyBmb3IgZWxlbWVudHMgYXBwZWFyaW5nIGluIGJvdGguICBUaGUgcmVzdWx0IGlzIHBhc3NlZCB0bwpGY0NvbmZpZ1N1YnN0aXR1dGUgd2l0aCAna2luZCcgRmNNYXRjaEZvbnQgYW5kIHRoZW4gcmV0dXJuZWQuCgouVFAKRmNGb250U2V0ICpGY0ZvbnRMaXN0IChGY0NvbmZpZyAqY29uZmlnLCBGY1BhdHRlcm4gKnAsIEZjT2JqZWN0U2V0ICpvcykKU2VsZWN0cyBmb250cyBtYXRjaGluZyAncCcsIGNyZWF0ZXMgcGF0dGVybnMgZnJvbSB0aG9zZSBmb250cyBjb250YWluaW5nCm9ubHkgdGhlIG9iamVjdHMgaW4gJ29zJyBhbmQgcmV0dXJucyB0aGUgc2V0IG9mIHVuaXF1ZSBzdWNoIHBhdHRlcm5zLgoKLlRQCmNoYXIgKkZjQ29uZmlnRmlsZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCkdpdmVuIHRoZSBzcGVjaWZpZWQgZXh0ZXJuYWwgZW50aXR5IG5hbWUsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBmaWxlbmFtZS4KVGhpcyBwcm92aWRlcyBhcHBsaWNhdGlvbnMgYSB3YXkgdG8gY29udmVydCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gZmlsZQpyZWZlcmVuY2VzIGludG8gZmlsZW5hbWUgZm9ybS4gCi5QCkEgbnVsbCBvciBlbXB0eSAnbmFtZScgaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIHNob3VsZApiZSB1c2VkOyB3aGljaCBmaWxlIHRoaXMgcmVmZXJlbmNlcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZQpGQ19DT05GSUdfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIE5leHQsIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoICd+JywgaXQKcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudCB1c2VycyBob21lIGRpcmVjdG9yeS4gIE90aGVyd2lzZSBpZiB0aGUgbmFtZQpkb2Vzbid0IHN0YXJ0IHdpdGggJy8nLCBpdCByZWZlcnMgdG8gYSBmaWxlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KZGlyZWN0b3J5OyB0aGUgYnVpbHQtaW4gZGVmYXVsdCBkaXJlY3RvcnkgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUKRkNfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KCi5TUyBJbml0aWFsaXphdGlvbgpUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIGxpYnJhcnkgaXMgaW5pdGlhbGl6ZWQuCgouVFAKRmNDb25maWcgKkZjSW5pdExvYWRDb25maWcgKHZvaWQpCkxvYWRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24uCkRvZXMgbm90IGxvYWQgYW55IGZvbnQgaW5mb3JtYXRpb24uCgouVFAKRmNDb25maWcgKkZjSW5pdExvYWRDb25maWdBbmRGb250cyAodm9pZCkKTG9hZHMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBidWlsZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCmF2YWlsYWJsZSBmb250cy4gIFJldHVybnMgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uLgoKLlRQCkZjQm9vbCBGY0luaXQgKHZvaWQpCkxvYWRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdGhlIGZvbnRzIHJlZmVyZW5jZWQgdGhlcmVpbiBhbmQKc2V0cyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIHRoYXQgcmVzdWx0LiAgUmV0dXJucyB3aGV0aGVyIHRoaXMKcHJvY2VzcyBzdWNjZWVkZWQgb3Igbm90LiAgSWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBoYXMgYWxyZWFkeQpiZWVuIGxvYWRlZCwgdGhpcyByb3V0aW5lIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBGY1RydWUuCgouVFAKaW50IEZjR2V0VmVyc2lvbiAodm9pZCkKUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuCgouVFAKRmNCb29sIEZjSW5pdFJlaW5pdGlhbGl6ZSAodm9pZCkKRm9yY2VzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSByZWxvYWRlZCBhbmQgcmVzZXRzIHRoZSBkZWZhdWx0CmNvbmZpZ3VyYXRpb24uCgouVFAKRmNCb29sIEZjSW5pdEJyaW5nVXB0b0RhdGUgKHZvaWQpCkNoZWNrcyB0aGUgcmVzY2FuIGludGVydmFsIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNoZWNraW5nIHRoZQpjb25maWd1cmF0aW9uIGlmIHRoZSBpbnRlcnZhbCBoYXMgcGFzc2VkIGFuZCByZWxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaWYKd2hlbiBhbnkgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCgouU1MgRmNBdG9taWMKVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgYSBzYWZlIHdheSB0byB1cGRhdGUgY29uZmlnIGZpbGVzLCBhbGxvd2luZyBvbmdvaW5nCnJlYWRpbmcgb2YgdGhlIG9sZCBjb25maWcgZmlsZSB3aGlsZSBsb2NrZWQgZm9yIHdyaXRpbmcgYW5kIGVuc3VyaW5nIHRoYXQgYQpjb25zaXN0ZW50IGFuZCBjb21wbGV0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgZmlsZSBpcyBhbHdheXMgYXZhaWxhYmxlLgoKLlRQCkZjQXRvbWljICogRmNBdG9taWNDcmVhdGUgKGNvbnN0IEZjQ2hhcjggICAqZmlsZSkKQ3JlYXRlcyBhIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgZGF0YSBuZWVkZWQgdG8gY29udHJvbCBhY2Nlc3MgdG8gJ2ZpbGUnLgpXcml0aW5nIGlzIGRvbmUgdG8gYSBzZXBhcmF0ZSBmaWxlLiAgT25jZSB0aGF0IGZpbGUgaXMgY29tcGxldGUsIHRoZSBvcmlnaW5hbApjb25maWd1cmF0aW9uIGZpbGUgaXMgYXRvbWljYWxseSByZXBsYWNlZCBzbyB0aGF0IHJlYWRpbmcgcHJvY2VzcyBhbHdheXMgc2VlCmEgY29uc2lzdGVudCBhbmQgY29tcGxldGUgZmlsZSB3aXRob3V0IHRoZSBuZWVkIHRvIGxvY2sgZm9yIHJlYWRpbmcuCgouVFAKRmNCb29sIEZjQXRvbWljTG9jayAoRmNBdG9taWMgKmF0b21pYykKQXR0ZW1wdHMgdG8gbG9jayB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5ICdhdG9taWMnLiAgUmV0dXJucyBGY0ZhbHNlIGlmIHRoZQpmaWxlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MsIGVsc2UgcmV0dXJucyBGY1RydWUgYW5kIGxlYXZlcyB0aGUgZmlsZQpsb2NrZWQuCgouVFAKRmNDaGFyOCAqRmNBdG9taWNOZXdGaWxlIChGY0F0b21pYyAqYXRvbWljKQpSZXR1cm5zIHRoZSBmaWxlbmFtZSBmb3Igd3JpdGluZyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJlZmVybmNlZCBieQonYXRvbWljJy4KCi5UUApGY0NoYXI4ICpGY0F0b21pY09yaWdGaWxlIChGY0F0b21pYyAqYXRvbWljKQpSZXR1cm5zIHRoZSBmaWxlIHJlZmVybmNlZCBieSAnYXRvbWljJy4KCi5UUApGY0Jvb2wgRmNBdG9taWNSZXBsYWNlT3JpZyAoRmNBdG9taWMgKmF0b21pYykKUmVwbGFjZXMgdGhlIG9yaWdpbmFsIGZpbGUgcmVmZXJlbmNlZCBieSAnYXRvbWljJyB3aXRoIHRoZSBuZXcgZmlsZS4KCi5UUAp2b2lkIEZjQXRvbWljRGVsZXRlTmV3IChGY0F0b21pYyAqYXRvbWljKQpEZWxldGVzIHRoZSBuZXcgZmlsZS4KCi5UUAp2b2lkIEZjQXRvbWljVW5sb2NrIChGY0F0b21pYyAqYXRvbWljKQpVbmxvY2tzIHRoZSBmaWxlLgoKLlRQCnZvaWQgRmNBdG9taWNEZXN0cm95IChGY0F0b21pYyAqYXRvbWljKQpEZXN0cm95cyAnYXRvbWljJy4KCi5TUyBGcmVlVHlwZSBzcGVjaWZpYyBmdW5jdGlvbnMKLm5mCi5CICNpbmNsdWRlIDxmb250Y29uZmlnL2ZjZnJlZXR5cGUuaD4KLmZpCldoaWxlIHRoZSBmb250Y29uZmlnIGxpYnJhcnkgZG9lc24ndCBpbnNpc3QgdGhhdCBGcmVlVHlwZSBiZSB1c2VkIGFzIHRoZQpyYXN0ZXJpemF0aW9uIG1lY2hhbmlzbSBmb3IgZm9udHMsIGl0IGRvZXMgcHJvdmlkZSBzb21lIGNvbnZlbmllbmNlCmZ1bmN0aW9ucy4KCi5UUApGVF9VSW50IEZjRnJlZVR5cGVDaGFySW5kZXggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCkKTWFwcyBhIFVuaWNvZGUgY2hhciB0byBhIGdseXBoIGluZGV4LiAgVGhpcyBmdW5jdGlvbiB1c2VzIGluZm9ybWF0aW9uIGZyb20Kc2V2ZXJhbCBwb3NzaWJsZSB1bmRlcmx5aW5nIGVuY29kaW5nIHRhYmxlcyB0byB3b3JrIGFyb3VuZCBicm9rZW4gZm9udHMuCkFzIGEgcmVzdWx0LCB0aGlzIGZ1bmN0aW9uIGlzbid0IGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gcGVyZm9ybWFuY2UKc2Vuc2l0aXZlIGFyZWFzOyByZXN1bHRzIGZyb20gdGhpcyBmdW5jdGlvbiBhcmUgaW50ZW5kZWQgdG8gYmUgY2FjaGVkIGJ5CmhpZ2hlciBsZXZlbCBmdW5jdGlvbnMuCgouVFAKRmNDaGFyU2V0ICpGY0ZyZWVUeXBlQ2hhclNldCAoRlRfRmFjZSBmYWNlLCBGY0JsYW5rcyAqYmxhbmtzKSBTY2FucyBhCkZyZWVUeXBlIGZhY2UgYW5kIHJldHVybnMgdGhlIHNldCBvZiBlbmNvZGVkIFVuaWNvZGUgY2hhcnMuICBUaGlzIHNjYW5zCnNldmVyYWwgZW5jb2RpbmcgdGFibGVzIHRvIGJ1aWxkIGFzIGNvbXBsZXRlIGEgbGlzdCBhcyBwb3NzaWJsZS4gIElmCidibGFua3MnIGlzIG5vdCAwLCB0aGUgZ2x5cGhzIGluIHRoZSBmb250IGFyZSBleGFtaW5lZCBhbmQgYW55IGJsYW5rIGdseXBocwpub3QgaW4gJ2JsYW5rcycgYXJlIG5vdCBwbGFjZWQgaW4gdGhlIHJldHVybmVkIEZjQ2hhclNldC4KCi5UUApGY1BhdHRlcm4gKkZjRnJlZVR5cGVRdWVyeSAoY29uc3QgY2hhciAqZmlsZSwgaW50IGlkLCBGY0JsYW5rcyAqYmxhbmtzLCBpbnQgKmNvdW50KQpDb25zdHJ1Y3RzIGEgcGF0dGVybiByZXByZXNlbnRpbmcgdGhlICdpZCd0aCBmb250IGluICdmaWxlJy4gIFRoZSBudW1iZXIKb2YgZm9udHMgaW4gJ2ZpbGUnIGlzIHJldHVybmVkIGluICdjb3VudCcuCgouU1MgWE1MIHNwZWNpZmljIGZ1bmN0aW9ucwouVFAKRmNCb29sIEZjQ29uZmlnUGFyc2VBbmRMb2FkIChGY0NvbmZpZyAqY29uZmlnLCBjb25zdCBGY0NoYXI4ICpmaWxlLCBGY0Jvb2wgY29tcGxhaW4pCldhbGtzIHRoZSBjb25maWd1cmF0aW9uIGluICdmaWxlJyBhbmQgY29uc3RydWN0cyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gaW4KJ2NvbmZpZycuICBBbnkgaW5jbHVkZSBmaWxlcyByZWZlcmVuY2VkIGZyb20gd2l0aGluICdmaWxlJyB3aWxsIGJlIGxvYWRlZAp3aXRoIEZjQ29uZmlnTG9hZCBhbmQgYWxzbyBwYXJzZWQuICBJZiAnY29tcGxhaW4nIGlzIEZjRmFsc2UsIG5vIHdhcm5pbmcKd2lsbCBiZSBkaXNwbGF5ZWQgaWYgJ2ZpbGUnIGRvZXMgbm90IGV4aXN0LgoKLlNTIEZpbGUgYW5kIERpcmVjdG9yeSByb3V0aW5lcwoKLlRQCkZjQm9vbCBGY0ZpbGVTY2FuIChGY0ZvbnRTZXQgKnNldCwgRmNTdHJTZXQgKmRpcnMsIEZjRmlsZUNhY2hlICpjYWNoZSwgRmNCbGFua3MgKmJsYW5rcywgY29uc3QgY2hhciAqZmlsZSwgRmNCb29sIGZvcmNlKQpTY2FucyBhIHNpbmdsZSBmaWxlIGFuZCBhZGRzIGFsbCBmb250cyBmb3VuZCB0byAnc2V0Jy4gIElmICdmb3JjZScgaXMgRmNUcnVlLAp0aGVuIHRoZSBmaWxlIGlzIHNjYW5uZWQgZXZlbiBpZiBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGlzIGZvdW5kIGluICdjYWNoZScuCklmICdmaWxlJyBpcyBhIGRpcmVjdG9yeSwgaXQgaXMgYWRkZWQgdG8gJ2RpcnMnLgoKLlRQCkZjQm9vbCBGY0RpclNjYW4gKEZjRm9udFNldCAqc2V0LCBGY1N0clNldCAqZGlycywgRmNGaWxlQ2FjaGUgKmNhY2hlLCBGY0JsYW5rcyAqYmxhbmtzLCBjb25zdCBjaGFyICpkaXIsIEZjQm9vbCBmb3JjZSkKU2NhbnMgYW4gZW50aXJlIGRpcmVjdG9yeSBhbmQgYWRkcyBhbGwgZm9udHMgZm91bmQgdG8gJ3NldCcuICBJZiAnZm9yY2UnIGlzCkZjVHJ1ZSwgdGhlbiB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgZmlsZXMgd2l0aGluIGl0IGFyZSBzY2FubmVkIGV2ZW4gaWYKaW5mb3JtYXRpb24gaXMgcHJlc2VudCBpbiB0aGUgcGVyLWRpcmVjdG9yeSBjYWNoZSBmaWxlIG9yICdjYWNoZScuICBBbnkKc3ViZGlyZWN0b3JpZXMgZm91bmQgYXJlIGFkZGVkIHRvICdkaXJzJy4KCi5UUApGY0Jvb2wgRmNEaXJTYXZlIChGY0ZvbnRTZXQgKnNldCwgRmNTdHJTZXQgKmRpcnMsIGNvbnN0IGNoYXIgKmRpcikKQ3JlYXRlcyB0aGUgcGVyLWRpcmVjdG9yeSBjYWNoZSBmaWxlIGZvciAnZGlyJyBhbmQgcG9wdWxhdGVzIGl0IHdpdGggdGhlCmZvbnRzIGluICdzZXQnIGFuZCBzdWJkaXJlY3RvcmllcyBpbiAnZGlycycuCgouVFAKRmNCb29sIEZjRGlyQ2FjaGVWYWxpZCAoY29uc3QgRmNDaGFyOCAqY2FjaGVfZmlsZSkKUmV0dXJucyBGY1RydWUgaWYgJ2NhY2hlX2ZpbGUnIGlzIG5vIG9sZGVyIHRoYW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGl0LAplbHNlIEZjRmFsc2UuCgouU1MgRmNTdHJTZXQgYW5kIEZjU3RyTGlzdApBIGRhdGEgc3RydWN0dXJlIGZvciBlbnVtZXJhdGluZyBzdHJpbmdzLCB1c2VkIHRvIGxpc3QgZGlyZWN0b3JpZXMgd2hpbGUKc2Nhbm5pbmcgdGhlIGNvbmZpZ3VyYXRpb24gYXMgZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHdoaWxlIHNjYW5uaW5nLgoKLlRQCkZjU3RyU2V0ICpGY1N0clNldENyZWF0ZSAodm9pZCkKQ3JlYXRlIGFuIGVtcHR5IHNldC4KCi5UUApGY0Jvb2wgRmNTdHJTZXRNZW1iZXIgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpClJldHVybnMgd2hldGhlciAncycgaXMgYSBtZW1iZXIgb2YgJ3NldCcuCgouVFAKRmNCb29sIEZjU3RyU2V0QWRkIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQpBZGRzIGEgY29weSBvZiAncycgdG8gJ3NldCcuCgouVFAKRmNCb29sIEZjU3RyU2V0QWRkRmlsZW5hbWUgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpCkFkZHMgYSBjb3B5ICdzJyB0byAnc2V0JywgVGhlIGNvcHkgaXMgY3JlYXRlZCB3aXRoIEZjU3RyQ29weUZpbGVuYW1lCnNvIHRoYXQgbGVhZGluZyAnficgdmFsdWVzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgSE9NRQplbnZpcm9ubWVudCB2YXJpYWJsZS4KCi5UUApGY0Jvb2wgRmNTdHJTZXREZWwgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpClJlbW92ZXMgJ3MnIGZyb20gJ3NldCcsIHJldHVybmluZyBGY1RydWUgaWYgJ3MnIHdhcyBhIG1lbWJlciBlbHNlIEZjRmFsc2UuCgouVFAKdm9pZCBGY1N0clNldERlc3Ryb3kgKEZjU3RyU2V0ICpzZXQpCkRlc3Ryb3lzICdzZXQnLgoKLlRQCkZjU3RyTGlzdCAqRmNTdHJMaXN0Q3JlYXRlIChGY1N0clNldCAqc2V0KQpDcmVhdGVzIGFuIGVudW1lcmF0b3IgdG8gbGlzdCB0aGUgc3RyaW5ncyBpbiAnc2V0Jy4KCi5UUApGY0NoYXI4ICpGY1N0ckxpc3ROZXh0IChGY1N0ckxpc3QgKmxpc3QpClJldHVybnMgdGhlIG5leHQgc3RyaW5nIGluICdzZXQnLgoKLlRQCnZvaWQgRmNTdHJMaXN0RG9uZSAoRmNTdHJMaXN0ICpsaXN0KQpEZXN0cm95cyB0aGUgZW51bWVyYXRvciAnbGlzdCcuCgouU1MgU3RyaW5nIHV0aWxpdGllcwoKLlRQCmludCBGY1V0ZjhUb1VjczQgKEZjQ2hhcjggKnNyYywgRmNDaGFyMzIgKmRzdCwgaW50IGxlbikKQ29udmVydHMgdGhlIG5leHQgVW5pY29kZSBjaGFyIGZyb20gJ3NyYycgaW50byAnZHN0JyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyCm9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIGNoYXIuICAnc3JjJyBudXN0IGJlIGF0IGxlYXN0ICdsZW4nIGJ5dGVzIGxvbmcuCgouVFAKaW50IEZjVWNzNFRvVXRmOCAoRmNDaGFyMzIgc3JjLCBGY0NoYXI4IGRzdFtGQ19VVEY4X01BWF9MRU5dKQpDb252ZXJ0cyB0aGUgVW5pY29kZSBjaGFyIGZyb20gJ3NyYycgaW50byAnZHN0JyBhbmQgcmV0dXJucyB0aGUKbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBlbmNvZGUgdGhlIGNoYXIuCgouVFAKRmNCb29sIEZjVXRmOExlbiAoRmNDaGFyOCAqc3JjLCBpbnQgbGVuLCBpbnQgKm5jaGFyLCBpbnQgKndjaGFyKQpDb3VudHMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNoYXJzIGluICdsZW4nIGJ5dGVzIG9mICdzcmMnLiAgUGxhY2VzIHRoYXQKY291bnQgaW4gJ25jaGFyJy4gICd3Y2hhcicgY29udGFpbnMgMSwgMiBvciA0IGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mCmJ5dGVzIG5lZWRlZCB0byBob2xkIHRoZSBsYXJnZXN0IHVuaWNvZGUgY2hhciBjb3VudGVkLiAgVGhlIHJldHVybiB2YWx1ZQppbmRpY2F0ZXMgd2hldGhlciAnc3JjJyBpcyBhIHdlbGwtZm9ybWVkIFVURjggc3RyaW5nLgoKLlRQCmludCBGY1V0ZjE2VG9VY3M0IChGY0NoYXI4ICpzcmMsIEZjRW5kaWFuIGVuZGlhbiwgRmNDaGFyMzIgKmRzdCwgaW50IGxlbikKQ29udmVydHMgdGhlIG5leHQgVW5pY29kZSBjaGFyIGZyb20gJ3NyYycgaW50byAnZHN0JyBhbmQgcmV0dXJucyB0aGUKbnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIGNoYXIuICdzcmMnIG11c3QgYmUgYXQgbGVhc3QgJ2xlbicgYnl0ZXMKbG9uZy4gIEJ5dGVzIG9mICdzcmMnIGFyZSBjb21iaW5lZCBpbnRvIDE2LWJpdCB1bml0cyBhY2NvcmRpbmcgdG8gJ2VuZGlhbicuCgouVFAKRmNCb29sIEZjVXRmMTZMZW4gKEZjQ2hhcjggKnNyYywgRmNFbmRpYW4gZW5kaWFuLCBpbnQgbGVuLCBpbnQgKm5jaGFyLCBpbnQgKndjaGFyKQpDb3VudHMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNoYXJzIGluICdsZW4nIGJ5dGVzIG9mICdzcmMnLiAgQnl0ZXMgb2YKJ3NyYycgYXJlIGNvbWJpbmVkIGludG8gMTYtYml0IHVuaXRzIGFjY29yZGluZyB0byAnZW5kaWFuJy4gIFBsYWNlcyB0aGF0CmNvdW50IGluICduY2hhcicuICAnd2NoYXInIGNvbnRhaW5zIDEsIDIgb3IgNCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZgpieXRlcyBuZWVkZWQgdG8gaG9sZCB0aGUgbGFyZ2VzdCB1bmljb2RlIGNoYXIgY291bnRlZC4gIFRoZSByZXR1cm4gdmFsdWUKaW5kaWNhdGVzIHdoZXRoZXIgJ3N0cmluZycgaXMgYSB3ZWxsLWZvcm1lZCBVVEYxNiBzdHJpbmcuCgouVFAKRmNDaGFyOCAqRmNTdHJDb3B5IChjb25zdCBGY0NoYXI4ICpzKQpBbGxvY2F0ZXMgbWVtb3J5LCBjb3BpZXMgJ3MnIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgYnVmZmVyLiAgWWVzLCB0aGlzIGlzCidzdHJkdXAnLCBidXQgdGhhdCBmdW5jdGlvbiBpc24ndCBhdmFpbGFibGUgb24gZXZlcnkgcGxhdGZvcm0uCgouVFAKRmNDaGFyOCAqRmNTdHJDb3B5RmlsZW5hbWUgKGNvbnN0IEZjQ2hhcjggKnMpCkp1c3QgbGlrZSBGY1N0ckNvcHkgZXhjZXB0IHRoYXQgaXQgY29udmVydHMgYW55IGxlYWRpbmcgJ34nIGNoYXJhY3RlcnMgaW4KJ3MnIHRvIHRoZSB2YWx1ZSBvZiB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KICAgIAouVFAKaW50IEZjU3RyQ21wSWdub3JlQ2FzZSAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQpSZXR1cm5zIHRoZSB1c3VhbCA8MCwgMCwgPjAgcmVzdWx0IG9mIGNvbXBhcmluZyAnczEnIGFuZCAnczInLiAgVGhpcyB0ZXN0CmlzIGNhc2UtaW5zZW5zaXRpdmUgaW4gdGhlIEFTQ0lJIHJhbmdlIGFuZCB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBVVEY4CmVuY29kZWQgc3RyaW5ncywgYWx0aG91Z2ggaXQgZG9lcyBub3QgY2hlY2sgZm9yIHdlbGwgZm9ybWVkIHN0cmluZ3MuCgouVFAKRmNDaGFyOCAqRmNTdHJEaXJuYW1lIChjb25zdCBGY0NoYXI4ICpmaWxlKQpSZXR1cm5zIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyAnZmlsZScuCgouVFAKRmNDaGFyOCAqRmNTdHJCYXNlbmFtZSAoY29uc3QgRmNDaGFyOCAqZmlsZSkKUmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgJ2ZpbGUnIHN0cmlwcGVkIG9mIGFueSBsZWFkaW5nIGRpcmVjdG9yeSBuYW1lcy4KCi5TSCBDT05GSUdVUkFUSU9OIEZJTEUgRk9STUFUCkNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGZvbnRjb25maWcgYXJlIHN0b3JlZCBpbiBYTUwgZm9ybWF0OyB0aGlzCmZvcm1hdCBtYWtlcyBleHRlcm5hbCBjb25maWd1cmF0aW9uIHRvb2xzIGVhc2llciB0byB3cml0ZSBhbmQgZW5zdXJlcyB0aGF0CnRoZXkgd2lsbCBnZW5lcmF0ZSBzeW50YWN0aWNhbGx5IGNvcnJlY3QgY29uZmlndXJhdGlvbiBmaWxlcy4gIEFzIFhNTApmaWxlcyBhcmUgcGxhaW4gdGV4dCwgdGhleSBjYW4gYWxzbyBiZSBtYW5pcHVsYXRlZCBieSB0aGUgZXhwZXJ0IHVzZXIgdXNpbmcKYSB0ZXh0IGVkaXRvci4KLlAKVGhlIGZvbnRjb25maWcgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIHJlc2lkZXMgaW4gdGhlIGV4dGVybmFsIGVudGl0eQoiZm9udHMuZHRkIjsgdGhpcyBpcyBub3JtYWxseSBzdG9yZWQgaW4gdGhlIGRlZmF1bHQgZm9udCBjb25maWd1cmF0aW9uCmRpcmVjdG9yeSAoL2V0Yy9mb250cykuICBFYWNoIGNvbmZpZ3VyYXRpb24gZmlsZSBzaG91bGQgY29udGFpbiB0aGUKZm9sbG93aW5nIHN0cnVjdHVyZToKLnNwCi5uZgoJPD94bWwgdmVyc2lvbj0iMS4wIj8+Cgk8IURPQ1RZUEUgZm9udGNvbmZpZyBTWVNURU0gImZvbnRzLmR0ZCI+Cgk8Zm9udGNvbmZpZz4KCS4uLgoJPC9mb250Y29uZmlnPgouZmkKLlAKLlNTIDxmb250Y29uZmlnPgpUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBmb3IgYSBmb250IGNvbmZpZ3VyYXRpb24gYW5kIGNhbiBjb250YWluCjxkaXI+LCA8Y2FjaGU+LCA8aW5jbHVkZT4sIDxtYXRjaD4gYW5kIDxhbGlhcz4gZWxlbWVudHMgaW4gYW55IG9yZGVyLgoKLlNTIDxkaXI+ClRoaXMgZWxlbWVudCBjb250YWlucyBhIGRpcmVjdG9yeSBuYW1lIHdoaWNoIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZm9udCBmaWxlcwp0byBpbmNsdWRlIGluIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZvbnRzLgoKLlNTIDxjYWNoZT4KVGhpcyBlbGVtZW50IGNvbnRhaW5zIGEgZmlsZSBuYW1lIGZvciB0aGUgcGVyLXVzZXIgY2FjaGUgb2YgZm9udAppbmZvcm1hdGlvbi4gIElmIGl0IHN0YXJ0cyB3aXRoICd+JywgaXQgcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgdXNlcnMKaG9tZSBkaXJlY3RvcnkuICBUaGlzIGZpbGUgaXMgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGZvbnRzIHRoYXQKaXNuJ3QgcHJlc2VudCBpbiB0aGUgcGVyLWRpcmVjdG9yeSBjYWNoZSBmaWxlcy4gIEl0IGlzIGF1dG9tYXRpY2FsbHkKbWFpbnRhaW5lZCBieSB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5LiAgVGhlIGRlZmF1bHQgZm9yIHRoaXMgZmlsZSAKaXMgYGB+Ly5mb250cy5jYWNoZScnLgoKLlNTIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJubyI+ClRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFdoZW4KdGhlIFhNTCBkYXRhdHlwZSBpcyB0cmF2ZXJzZWQgYnkgRmNDb25maWdQYXJzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlCndpbGwgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgY29uZmlndXJhdGlvbiBieSBwYXNzaW5nIHRoZSBmaWxlbmFtZSB0bwpGY0NvbmZpZ0xvYWRBbmRQYXJzZS4gIElmICdpZ25vcmVfbWlzc2luZycgaXMgc2V0IHRvICJ5ZXMiIGluc3RlYWQgb2YgdGhlCmRlZmF1bHQgIm5vIiwgYSBtaXNzaW5nIGZpbGUgd2lsbCBlbGljaXQgbm8gd2FybmluZyBtZXNzYWdlIGZyb20gdGhlIGxpYnJhcnkuCgouU1MgPGNvbmZpZz4KVGhpcyBlbGVtZW50IHByb3ZpZGVzIGEgcGxhY2UgdG8gY29uc29sb2RhdGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uCmluZm9ybWF0aW9uLiAgPGNvbmZpZz4gY2FuIGNvbnRhaW4gPGJsYW5rPiBhbmQgPHJlc2Nhbj4gZWxlbWVudHMgaW4gYW55Cm9yZGVyLgoKLlNTIDxibGFuaz4KRm9udHMgb2Z0ZW4gaW5jbHVkZSAiYnJva2VuIiBnbHlwaHMgd2hpY2ggYXBwZWFyIGluIHRoZSBlbmNvZGluZyBidXQgYXJlCmRyYXduIGFzIGJsYW5rcyBvbiB0aGUgc2NyZWVuLiAgV2l0aGluIHRoZSA8Ymxhbms+IGVsZW1lbnQsIHBsYWNlIGVhY2gKVW5pY29kZSBjaGFyYWN0ZXJzIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGJsYW5rIGluIGFuIDxpbnQ+IGVsZW1lbnQuCkNoYXJhY3RlcnMgb3V0c2lkZSBvZiB0aGlzIHNldCB3aGljaCBhcmUgZHJhd24gYXMgYmxhbmsgd2lsbCBiZSBlbGlkZWQgZnJvbQp0aGUgc2V0IG9mIGNoYXJhY3RlcnMgc3VwcG9ydGVkIGJ5IHRoZSBmb250LiAgPGIKCi5TUyA8cmVzY2FuPgpUaGUgPHJlc2Nhbj4gZWxlbWVudCBob2xkcyBhbiA8aW50PiBlbGVtZW50IHdoaWNoIGluZGljYXRlcyB0aGUgZGVmYXVsdAppbnRlcnZhbCBiZXR3ZWVuIGF1dG9tYXRpYyBjaGVja3MgZm9yIGZvbnQgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgpGb250Y29uZmlnIHdpbGwgdmFsaWRhdGUgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhbmQKYXV0b21hdGljYWxseSByZWJ1aWxkIHRoZSBpbnRlcm5hbCBkYXRhc3RydWN0dXJlcyB3aGVuIHRoaXMgaW50ZXJ2YWwgcGFzc2VzLgoKLlNTIDxtYXRjaCB0YXJnZXQ9InBhdHRlcm4iPgpUaGlzIGVsZW1lbnQgaG9sZHMgZmlyc3QgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgPHRlc3Q+IGVsZW1lbnRzIGFuZCB0aGVuCmEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIDxlZGl0PiBlbGVtZW50cy4gIFBhdHRlcm5zIHdoaWNoIG1hdGNoIGFsbCBvZiB0aGUKdGVzdHMgYXJlIHN1YmplY3RlZCB0byBhbGwgdGhlIGVkaXRzLiAgSWYgJ3RhcmdldCcgaXMgc2V0IHRvICJmb250IiBpbnN0ZWFkCm9mIHRoZSBkZWZhdWx0ICJwYXR0ZXJuIiwgdGhlbiB0aGlzIGVsZW1lbnQgYXBwbGllcyB0byB0aGUgZm9udCBuYW1lCnJlc3VsdGluZyBmcm9tIGEgbWF0Y2ggcmF0aGVyIHRoYW4gYSBmb250IHBhdHRlcm4gdG8gYmUgbWF0Y2hlZC4KCi5TUyA8dGVzdCBxdWFsPSJhbnkiIG5hbWU9InByb3BlcnR5IiBjb21wYXJlPSJlcSI+ClRoaXMgZWxlbWVudCBjb250YWlucyBhIHNpbmdsZSB2YWx1ZSB3aGljaCBpcyBjb21wYXJlZCB3aXRoIHRoZSBwYXR0ZXJuCnByb3BlcnR5ICJwcm9wZXJ0eSIgKHN1YnN0aXR1dGUgYW55IG9mIHRoZSBwcm9wZXJ0eSBuYW1lcyBzZWVuIGFib3ZlKS4KJ2NvbXBhcmUnIGNhbiBiZSBvbmUgb2YgImVxIiwgIm5vdF9lcSIsICJsZXNzIiwgImxlc3NfZXEiLCAibW9yZSIsIG9yCiJtb3JlX2VxIi4gICdxdWFsJyBtYXkgZWl0aGVyIGJlIHRoZSBkZWZhdWx0LCAiYW55IiwgaW4gd2hpY2ggY2FzZSB0aGUgbWF0Y2gKc3VjY2VlZHMgaWYgYW55IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbWF0Y2hlcyB0aGUgdGVzdCB2YWx1ZSwgb3IKImFsbCIsIGluIHdoaWNoIGNhc2UgYWxsIG9mIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBtdXN0Cm1hdGNoIHRoZSB0ZXN0IHZhbHVlLgoKLlNTIDxlZGl0IG5hbWU9InByb3BlcnR5IiBtb2RlPSJhc3NpZ24iIGJpbmRpbmc9IndlYWsiPgpUaGlzIGVsZW1lbnQgY29udGFpbnMgYSBsaXN0IG9mIGV4cHJlc3Npb24gZWxlbWVudHMgKGFueSBvZiB0aGUgdmFsdWUgb3IKb3BlcmF0b3IgZWxlbWVudHMpLiAgVGhlIGV4cHJlc3Npb24gZWxlbWVudHMgYXJlIGV2YWx1YXRlZCBhdCBydW4tdGltZSBhbmQKbW9kaWZ5IHRoZSBwcm9wZXJ0eSAicHJvcGVydHkiLiAgVGhlIG1vZGlmaWNhdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIKInByb3BlcnR5IiB3YXMgbWF0Y2hlZCBieSBvbmUgb2YgdGhlIGFzc29jaWF0ZWQgPHRlc3Q+IGVsZW1lbnRzLCBpZiBzbywgdGhlCm1vZGlmaWNhdGlvbiBtYXkgYWZmZWN0IHRoZSBmaXJzdCBtYXRjaGVkIHZhbHVlLiAgQW55IHZhbHVlcyBpbnNlcnRlZCBpbnRvCnRoZSBwcm9wZXJ0eSBhcmUgZ2l2ZW4gdGhlIGluZGljYXRlZCBiaW5kaW5nLiAnbW9kZScgaXMgb25lIG9mOgoubmYKLlJTCi50YSAxaSAzaSA1aQpNb2RlCU9wZXJhdGlvbiB3aXRoIG1hdGNoCU9wZXJhdGlvbiB3aXRob3V0IG1hdGNoCgEBAQoiYXNzaWduIglSZXBsYWNlIG1hdGNoaW5nIHZhbHVlCVJlcGxhY2UgYWxsIHZhbHVlcwoiYXNzaWduX3JlcGxhY2UiCVJlcGxhY2UgYWxsIHZhbHVlcwlSZXBsYWNlIGFsbCB2YWx1ZXMKInByZXBlbmQiCUluc2VydCBiZWZvcmUgbWF0Y2hpbmcgdmFsdWUJSW5zZXJ0IGF0IGhlYWQgb2YgbGlzdAoicHJlcGVuZF9maXJzdCIJSW5zZXJ0IGF0IGhlYWQgb2YgbGlzdAlJbnNlcnQgYXQgaGVhZCBvZiBsaXN0CiJhcHBlbmQiCUFwcGVuZCBhZnRlciBtYXRjaGluZyB2YWx1ZQlBcHBlbmQgYXQgZW5kIG9mIGxpc3QKImFwcGVuZF9sYXN0IglBcHBlbmQgYXQgZW5kIG9mIGxpc3QJQXBwZW5kIGF0IGVuZCBvZiBsaXN0Ci5SRQouRFQKLmZpCi5TUyA8aW50PgouU1MgPGRvdWJsZT4KLlNTIDxzdHJpbmc+Ci5TUyA8Ym9vbD4KVGhlc2UgZWxlbWVudHMgaG9sZCBhIHNpbmdsZSB2YWx1ZSBvZiB0aGUgaW5kaWNhdGVkIHR5cGUuICA8Ym9vbD4gZWxlbWVudHMKaG9sZCBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KLlNTIDxtYXRyaXg+ClRoaXMgZWxlbWVudCBob2xkcyB0aGUgZm91ciA8ZG91YmxlPiBlbGVtZW50cyBvZiBhbiBhZmZpbmUgdHJhbnNmb3JtYXRpb24uCi5TUyA8bmFtZT4KSG9sZHMgYSBwcm9wZXJ0eSBuYW1lLiAgRXZhbHVhdGVzIHRvIHRoZSBmaXJzdCB2YWx1ZSBmcm9tIHRoZSBwcm9wZXJ0eSBvZgp0aGUgZm9udCwgbm90IHRoZSBwYXR0ZXJuLgouU1MgPGNvbnN0PgpIb2xkcyB0aGUgbmFtZSBvZiBhIGNvbnN0YW50OyB0aGVzZSBhcmUgYWx3YXlzIGludGVnZXJzIGFuZCBzZXJ2ZSBhcwpzeW1ib2xpYyBuYW1lcyBmb3IgY29tbW9uIGZvbnQgdmFsdWVzOgouUlMKLnNwCi5uZgoudGEgMWkgMmkgM2kKLmxjIFwoZW0KQ29uc3RhbnQJUHJvcGVydHkJQ1BQIHN5bWJvbAoBAQEKbGlnaHQJd2VpZ2h0CUZDX1dFSUdIVF9MSUdIVAptZWRpdW0Jd2VpZ2h0CUZDX1dFSUdIVF9NRURJVU0KZGVtaWJvbGQJd2VpZ2h0CUZDX1dFSUdIVF9ERU1JQk9MRApib2xkCXdlaWdodAlGQ19XRUlHSFRfQk9MRApibGFjawl3ZWlnaHQJRkNfV0VJR0hUX0JMQUNLCnJvbWFuCXNsYW50CUZDX1NMQU5UX1JPTUFOCml0YWxpYwlzbGFudAlGQ19TTEFOVF9JVEFMSUMKb2JsaXF1ZQlzbGFudAlGQ19TTEFOVF9PQkxJUVVFCnByb3BvcnRpb25hbAlzcGFjaW5nCUZDX1BST1BPUlRJT05BTAptb25vCXNwYWNpbmcJRkNfTU9OTwpjaGFyY2VsbAlzcGFjaW5nCUZDX0NIQVJDRUxMCnJnYglyZ2JhCUZDX1JHQkFfUkdCCmJncglyZ2JhCUZDX1JHQkFfQkdSCnZyZ2IJcmdiYQlGQ19SR0JBX1ZSR0IKdmJncglyZ2JhCUZDX1JHQkFfVkJHUgouRFQKLmZpCi5SRQouU1MgPG9yPgouU1MgPGFuZD4KLlNTIDxwbHVzPgouU1MgPG1pbnVzPgouU1MgPHRpbWVzPgouU1MgPGRpdmlkZT4KVGhlc2UgZWxlbWVudHMgcGVyZm9ybSB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBvbiBhIGxpc3Qgb2YgZXhwcmVzc2lvbgplbGVtZW50cy4gIDxvcj4gYW5kIDxhbmQ+IGFyZSBib29sZWFuLCBub3QgYml0d2lzZS4KLlNTIDxlcT4KLlNTIDxub3RfZXE+Ci5TUyA8bGVzcz4KLlNTIDxsZXNzX2VxPgouU1MgPG1vcmU+Ci5TUyA8bW9yZV9lcT4KVGhlc2UgZWxlbWVudHMgY29tcGFyZSB0d28gdmFsdWVzLCBwcm9kdWNpbmcgYSBib29sZWFuIHJlc3VsdC4KLlNTIDxub3Q+CkludmVydHMgdGhlIGJvb2xlYW4gc2Vuc2Ugb2YgaXRzIG9uZSBleHByZXNzaW9uIGVsZW1lbnQKLlNTIDxpZj4KVGhpcyBlbGVtZW50IHRha2VzIHRocmVlIGV4cHJlc3Npb24gZWxlbWVudHM7IGlmIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaXMKdHJ1ZSwgaXQgcHJvZHVjZXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQsIG90aGVyd2lzZSBpdCBwcm9kdWNlcyB0aGUgdmFsdWUKb2YgdGhlIHRoaXJkLgouU1MgPGFsaWFzPgpBbGlhcyBlbGVtZW50cyBwcm92aWRlIGEgc2hvcnRoYW5kIG5vdGF0aW9uIGZvciB0aGUgc2V0IG9mIGNvbW1vbiBtYXRjaApvcGVyYXRpb25zIG5lZWRlZCB0byBzdWJzdGl0dXRlIG9uZSBmb250IGZhbWlseSBmb3IgYW5vdGhlci4gIFRoZXkgY29udGFpbiBhCjxmYW1pbHk+IGVsZW1lbnQgZm9sbG93ZWQgYnkgb3B0aW9uYWwgPHByZWZlcj4sIDxhY2NlcHQ+IGFuZCA8ZGVmYXVsdD4KZWxlbWVudHMuICBGb250cyBtYXRjaGluZyB0aGUgPGZhbWlseT4gZWxlbWVudCBhcmUgZWRpdGVkIHRvIHByZXBlbmQgdGhlCmxpc3Qgb2YgPHByZWZlcj5lZCBmYW1pbGllcyBiZWZvcmUgdGhlIG1hdGNoaW5nIDxmYW1pbHk+LCBhcHBlbmQgdGhlCjxhY2NlcHQ+YWJsZSBmYW1pbHlzIGFmdGVyIHRoZSBtYXRjaGluZyA8ZmFtaWx5PiBhbmQgYXBwZW5kIHRoZSA8ZGVmYXVsdD4KZmFtaWxpZXMgdG8gdGhlIGVuZCBvZiB0aGUgZmFtaWx5IGxpc3QuCi5TUyA8ZmFtaWx5PgpIb2xkcyBhIHNpbmdsZSBmb250IGZhbWlseSBuYW1lCi5TUyA8cHJlZmVyPgouU1MgPGFjY2VwdD4KLlNTIDxkZWZhdWx0PgpUaGVzZSBob2xkIGEgbGlzdCBvZiA8ZmFtaWx5PiBlbGVtZW50cyB0byBiZSB1c2VkIGJ5IHRoZSA8YWxpYXM+IGVsZW1lbnQuCi5TSCBFWEFNUExFIENPTkZJR1VSQVRJT04gRklMRQouU1MgU3lzdGVtIGNvbmZpZ3VyYXRpb24gZmlsZQpUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGZpbGUKLnNwCi5uZgo8P3htbCB2ZXJzaW9uPSIxLjAiPz4KPCFET0NUWVBFIGZvbnRjb25maWcgU1lTVEVNICJmb250cy5kdGQiPgo8IS0tIC9ldGMvZm9udHMvZm9udHMuY29uZiBmaWxlIHRvIGNvbmZpZ3VyZSBzeXN0ZW0gZm9udCBhY2Nlc3MgLS0+Cjxmb250Y29uZmlnPgo8IS0tIAoJRmluZCBmb250cyBpbiB0aGVzZSBkaXJlY3RvcmllcwotLT4KPGRpcj4vdXNyL1gxMVI2L2xpYi9YMTEvZm9udHMvdHJ1ZXR5cGU8L2Rpcj4KPGRpcj4vdXNyL1gxMVI2L2xpYi9YMTEvZm9udHMvVHlwZTE8L2Rpcj4KCjwhLS0KCUFjY2VwdCBkZXByZWNhdGVkICdtb25vJyBhbGlhcywgcmVwbGFjaW5nIGl0IHdpdGggJ21vbm9zcGFjZScKLS0+CjxtYXRjaCB0YXJnZXQ9InBhdHRlcm4iPgoJPHRlc3QgcXVhbD0iYW55IiBuYW1lPSJmYW1pbHkiPjxzdHJpbmc+bW9ubzwvc3RyaW5nPjwvdGVzdD4KCTxlZGl0IG5hbWU9ImZhbWlseSIgbW9kZT0iYXNzaWduIj48c3RyaW5nPm1vbm9zcGFjZTwvc3RyaW5nPjwvZWRpdD4KPC9tYXRjaD4KCjwhLS0KCU5hbWVzIG5vdCBpbmNsdWRpbmcgYW55IHdlbGwga25vd24gYWxpYXMgYXJlIGdpdmVuICdzYW5zJwotLT4KPG1hdGNoIHRhcmdldD0icGF0dGVybiI+Cgk8dGVzdCBxdWFsPSJhbGwiIG5hbWU9ImZhbWlseSIgbW9kZT0ibm90X2VxIj5zYW5zPC90ZXN0PgoJPHRlc3QgcXVhbD0iYWxsIiBuYW1lPSJmYW1pbHkiIG1vZGU9Im5vdF9lcSI+c2VyaWY8L3Rlc3Q+Cgk8dGVzdCBxdWFsPSJhbGwiIG5hbWU9ImZhbWlseSIgbW9kZT0ibm90X2VxIj5tb25vc3BhY2U8L3Rlc3Q+Cgk8ZWRpdCBuYW1lPSJmYW1pbHkiIG1vZGU9ImFwcGVuZF9sYXN0Ij48c3RyaW5nPnNhbnM8L3N0cmluZz48L2VkaXQ+CjwvbWF0Y2g+Cgo8IS0tCglMb2FkIHBlci11c2VyIGN1c3RvbWl6YXRpb24gZmlsZSwgYnV0IGRvbid0IGNvbXBsYWluCglpZiBpdCBkb2Vzbid0IGV4aXN0Ci0tPgo8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5+Ly5mb250cy5jb25mPC9pbmNsdWRlPgoKPCEtLQoJQWxpYXMgd2VsbCBrbm93biBmb250IG5hbWVzIHRvIGF2YWlsYWJsZSBUcnVlVHlwZSBmb250cy4KCVRoZXNlIHN1YnN0aXR1dGUgVHJ1ZVR5cGUgZmFjZXMgZm9yIHNpbWlsYXIgVHlwZTEKCWZhY2VzIHRvIGltcHJvdmUgc2NyZWVuIGFwcGVhcmFuY2UuCi0tPgo8YWxpYXM+Cgk8ZmFtaWx5PlRpbWVzPC9mYW1pbHk+Cgk8cHJlZmVyPjxmYW1pbHk+VGltZXMgTmV3IFJvbWFuPC9mYW1pbHk+PC9wcmVmZXI+Cgk8ZGVmYXVsdD48ZmFtaWx5PnNlcmlmPC9mYW1pbHk+PC9kZWZhdWx0Pgo8L2FsaWFzPgo8YWxpYXM+Cgk8ZmFtaWx5PkhlbHZldGljYTwvZmFtaWx5PgoJPHByZWZlcj48ZmFtaWx5PlZlcmRhbmE8L2ZhbWlseT48L3ByZWZlcj4KCTxkZWZhdWx0PjxmYW1pbHk+c2FuczwvZmFtaWx5PjwvZGVmYXVsdD4KPC9hbGlhcz4KPGFsaWFzPgoJPGZhbWlseT5Db3VyaWVyPC9mYW1pbHk+Cgk8cHJlZmVyPjxmYW1pbHk+Q291cmllciBOZXc8L2ZhbWlseT48L3ByZWZlcj4KCTxkZWZhdWx0PjxmYW1pbHk+bW9ub3NwYWNlPC9mYW1pbHk+PC9kZWZhdWx0Pgo8L2FsaWFzPgoKPCEtLQoJUHJvdmlkZSByZXF1aXJlZCBhbGlhc2VzIGZvciBzdGFuZGFyZCBuYW1lcwoJRG8gdGhlc2UgYWZ0ZXIgdGhlIHVzZXJzIGNvbmZpZ3VyYXRpb24gZmlsZSBzbyB0aGF0CglhbnkgYWxpYXNlcyB0aGVyZSBhcmUgdXNlZCBwcmVmZXJlbnRpYWxseQotLT4KPGFsaWFzPgoJPGZhbWlseT5zZXJpZjwvZmFtaWx5PgoJPHByZWZlcj48ZmFtaWx5PlRpbWVzIE5ldyBSb21hbjwvZmFtaWx5PjwvcHJlZmVyPgo8L2FsaWFzPgo8YWxpYXM+Cgk8ZmFtaWx5PnNhbnM8L2ZhbWlseT4KCTxwcmVmZXI+PGZhbWlseT5WZXJkYW5hPC9mYW1pbHk+PC9wcmVmZXI+CjwvYWxpYXM+CjxhbGlhcz4KCTxmYW1pbHk+bW9ub3NwYWNlPC9mYW1pbHk+Cgk8cHJlZmVyPjxmYW1pbHk+QW5kYWxlIE1vbm88L2ZhbWlseT48L3ByZWZlcj4KPC9hbGlhcz4KPC9mb250Y29uZmlnPgouZmkKLlNTIFVzZXIgY29uZmlndXJhdGlvbiBmaWxlClRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IGxpdmVzIGluCn4vLmZvbnRzLmNvbmYKLnNwCi5uZgo8P3htbCB2ZXJzaW9uPSIxLjAiPz4KPCFET0NUWVBFIGZvbnRjb25maWcgU1lTVEVNICJmb250cy5kdGQiPgo8IS0tIH4vLmZvbnRzLmNvbmYgZm9yIHBlci11c2VyIGZvbnQgY29uZmlndXJhdGlvbiAtLT4KPGZvbnRjb25maWc+Cgo8IS0tCglQcml2YXRlIGZvbnQgZGlyZWN0b3J5Ci0tPgo8ZGlyPn4vbWlzYy9mb250czwvZGlyPgoKPCEtLQoJdXNlIHJnYiBzdWItcGl4ZWwgb3JkZXJpbmcgdG8gaW1wcm92ZSBnbHlwaCBhcHBlYXJhbmNlIG9uCglMQ0Qgc2NyZWVucy4gIENoYW5nZXMgYWZmZWN0aW5nIHJlbmRlcmluZywgYnV0IG5vdCBtYXRjaGluZwoJc2hvdWxkIGFsd2F5cyB1c2UgdGFyZ2V0PSJmb250Ii4KLS0+CjxtYXRjaCB0YXJnZXQ9ImZvbnQiPgoJPGVkaXQgbmFtZT0icmdiYSIgbW9kZT0iYXNzaWduIj48Y29uc3Q+cmdiPC9jb25zdD48L2VkaXQ+CjwvbWF0Y2g+CjwvZm9udGNvbmZpZz4KLmZpCi5TSCBGSUxFUwouQiBmb250cy5jb25mCmNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBmb250Y29uZmlnIGxpYnJhcnkKY29uc2lzdGluZyBvZiBkaXJlY3RvcmllcyB0byBsb29rIGF0IGZvciBmb250IGluZm9ybWF0aW9uIGFzIHdlbGwgYXMKaW5zdHJ1Y3Rpb25zIG9uIGVkaXRpbmcgcHJvZ3JhbSBzcGVjaWZpZWQgZm9udCBwYXR0ZXJucyBiZWZvcmUgYXR0ZW1wdGluZyB0bwptYXRjaCB0aGUgYXZhaWxhYmxlIGZvbnRzLiAgSXQgaXMgaW4geG1sIGZvcm1hdC4KCi5CIGZvbnRzLmR0ZCAKaXMgYSBEVEQgdGhhdCBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcy4KCi5CIH4vLmZvbnRzLmNvbmYKaXMgdGhlIGNvbnZlbnRpb25hbCBsb2NhdGlvbiBmb3IgcGVyLXVzZXIgZm9udCBjb25maWd1cmF0aW9uLCBhbHRob3VnaCB0aGUKYWN0dWFsIGxvY2F0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgZ2xvYmFsIGZvbnRzLmNvbmYgZmlsZS4KCi5CIH4vLmZvbnRzLmNhY2hlCmlzIHRoZSBjb252ZW50aW9uYWwgcmVwb3NpdG9yeSBvZiBmb250IGluZm9ybWF0aW9uIHRoYXQgaXNuJ3QgZm91bmQgaW4gdGhlCnBlci1kaXJlY3RvcnkgY2FjaGVzLiAgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW5lZCBieSBmb250Y29uZmlnLgoKLlNIIEFVVEhPUgpLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgdGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgo=