ZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQWJvdXQuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmOWM2MC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0IHRoaXMgbWFudWFsPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08aDE+QWJvdXQgVGhpcyBNYW51YWw8L2gxPjxwPgotCi1UaGUgSFRNTCB2ZXJzaW9uIG9mIHRoZSBTV0lHIFVzZXJzIE1hbnVhbCBpcyBhIGRpcmVjdCB0cmFuc2xhdGlvbgotb2YgdGhlIHByaW50ZWQgdmVyc2lvbiB3aGljaCBpcyBwcm9kdWNlZCB1c2luZyBGcmFtZW1ha2VyIDUuICBUaGUKLWNvbnZlcnNpb24gcHJvY2VzcyB3YXMgcm91Z2hseSBhcyBmb2xsb3dzIDoKLQotPHVsPgotPGxpPiBSYXcgSFRNTCB3YXMgcHJvZHVjZWQgdXNpbmcgRnJhbWVtYWtlciA1IGFuZCBRdWFkcmFsYXkgV2ViV29ya3MgTGl0ZS4KLTxsaT4gVGFibGVzIGFuZCBmaWd1cmVzIHdlcmUgY29udmVydGVkIGludG8gR0lGIGltYWdlcy4KLTxsaT4gQWxsIG9mIHRoaXMgb3V0cHV0IHdhcyBmZWQgaW50byBhIG1hZ2ljIFB5dGhvbiBzY3JpcHQgdGhhdCBjbGVhbmVkCi11cCB0aGUgSFRNTCBzb3VyY2UgYW5kIG1lcmdlZCB0aGUgR0lGIGZpZ3VyZXMgaW50byB0aGUgdGV4dC4KLTxsaT4gQSB0YWJsZSBvZiBjb250ZW50cyBhbmQgYWxwaGFiZXRpemVkIHRvcGljIGluZGV4IHdlcmUgcHJvZHVjZWQgZnJvbQotSFRNTCBoZWFkaW5nIHRhZ3MgYnkgdGhlIHNhbWUgc2NyaXB0LgotPC91bD4KLQotV2hpbGUgdGhlIGNvbnZlcnNpb24gcHJvY2VzcyBpcyBtb3N0bHkgY29tcGxldGUsIHRoZXJlIGFyZSBhIGZldyB0aGluZ3MKLXRvIGtlZXAgaW4gbWluZCA6Ci0KLTx1bD4KLTxsaT4gU29tZSBzZWN0aW9ucyBvZiBwcmVmb3JtYXR0ZWQgdGV4dCBtYXkgaGF2ZSB3ZWlyZCBmb3JtYXR0aW5nCi1wcm9ibGVtcy4KLTxsaT4gRnJhbWVtYWtlciB0YWJsZXMgd2VyZSBjb252ZXJ0ZWQgaW50byBHSUYgaW1hZ2VzIGluc3RlYWQKLW9mIEhUTUwgdGFibGVzLS10aGlzIGlzIGEgbGl0dGxlIHdlaXJkLCBidXQgdGhlIGVhc2llc3QgCi1hcHByb2FjaCBmb3Igbm93LgotPGxpPiBUaGVyZSBtYXkgYmUgYSBmZXcgbWlub3IgZm9ybWF0dGluZyBwcm9ibGVtcyB0aHJvdWdob3V0IAotZHVlIHRvIG1pbm9yICJnbGl0Y2hlcyIgdGhhdCBzbGlwcGVkIHRocm91Z2ggdGhlIGNvbnZlcnNpb24gcHJvY2VzcwotKGFsdGhvdWdoIEkndmUgdHJpZWQgdG8gY29ycmVjdCBhcyBtYW55IGFzIHRoZXNlIGFzIHBvc3NpYmxlKS4KLTxsaT4gVGhlIHByaW50ZWQgdmVyc2lvbiBvZiB0aGUgU1dJRyBtYW51YWwgaXMgbW9yZSB0aGFuIAotMzAwIHBhZ2VzIGxvbmctLXJlc3VsdGluZyBpbiBhYm91dCA2NzAgS2J5dGVzIG9mIEhUTUwuIFRoZSBIVE1MIHZlcnNpb24KLWlzIGJyb2tlbiB1cCBpbnRvIGNoYXB0ZXJzLiAgRWFjaCBjaGFwdGVyIGlzIGZhaXJseSB3ZWxsLWNvbnRhaW5lZCwgYnV0Ci1zb21lIG1heSBjb250YWluIGFzIG1hbnkgYXMgNTAgcGFnZXMgb2YgcHJpbnRlZCB0ZXh0LgotPC91bD4KLQotUGxlYXNlIHJlcG9ydCBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbiB0byBiZWF6bGV5QGNzLnV0YWguZWR1LgotCi08aHI+Ci08YWRkcmVzcz4KLUxhc3QgTW9kaWZpZWQgOiBBdWd1c3QgMywgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0FkdmFuY2VkLmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML0FkdmFuY2VkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTU5OTAuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9BZHZhbmNlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWR2YW5jZWQgVG9waWNzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4xMSBBZHZhbmNlZCBUb3BpY3M8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5DcmVhdGluZyBtdWx0aS1tb2R1bGUgcGFja2FnZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+RHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjMiPkluc2lkZSB0aGUgU1dJRyB0eXBlLWNoZWNrZXI8L2E+Ci08L3VsPgotCi08YSBuYW1lPSJuMSI+PC9hPjxoMj4gQ3JlYXRpbmcgbXVsdGktbW9kdWxlIHBhY2thZ2VzPC9oMj4KLVNXSUcgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHBhY2thZ2VzIGNvbnNpc3Rpbmcgb2YgbWFueSBkaWZmZXJlbnQgbW9kdWxlcy4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdGVjaG5pY2FsIGFzcGVjdHMgb2YgZG9pbmcgdGhpcyBhbmQgdGVjaG5pcXVlcyBmb3IgbWFuYWdpbmcgdGhlIHByb2JsZW0uPHA+Ci08YSBuYW1lPSJuNCI+PC9hPjxoMz4gUnVudGltZSBzdXBwb3J0IChhbmQgcG90ZW50aWFsIHByb2JsZW1zKTwvaDM+Ci1BbGwgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyByZWx5IHVwb24gYSBzbWFsbCBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGR1cmluZyBydW4tdGltZS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBwcmltYXJpbHkgdXNlZCBmb3IgcG9pbnRlciB0eXBlLWNoZWNraW5nLCBleGNlcHRpb24gaGFuZGxpbmcsIGFuZCBzbyBvbi4gV2hlbiB5b3UgcnVuIFNXSUcsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIHdyYXBwZXIgZmlsZSAoYW5kIGRlY2xhcmVkIGFzIHN0YXRpYykuIElmIHlvdSBjcmVhdGUgYSBzeXN0ZW0gY29uc2lzdGluZyBvZiBtYW55IG1vZHVsZXMsIGVhY2ggb25lIHdpbGwgaGF2ZSBhbiBpZGVudGljYWwgY29weSBvZiB0aGVzZSBydW50aW1lIGxpYnJhcmllcyA6PHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDExLjEucG5nIj48L2NlbnRlcj48cD4KLTxwPgotVGhpcyBkdXBsaWNhdGlvbiBvZiBydW50aW1lIGxpYnJhcmllcyBpcyB1c3VhbGx5IGhhcm1sZXNzIHNpbmNlIHRoZXJlIGFyZSBubyBuYW1lc3BhY2UgY29uZmxpY3RzIGFuZCBtZW1vcnkgb3ZlcmhlYWQgaXMgbWluaW1hbC4gSG93ZXZlciwgdGhlcmUgaXMgc2VyaW91cyBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdCBtb2R1bGVzIGRvIG5vdCBzaGFyZSB0eXBlLWluZm9ybWF0aW9uLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgYSBwcm9ibGVtIHdoZW4gd29ya2luZyB3aXRoIEMrKyAoYXMgZGVzY3JpYmVkIG5leHQpLjxwPgotPGEgbmFtZT0ibjUiPjwvYT48aDM+IFdoeSBkb2Vzbid0IEMrKyBpbmhlcml0YW5jZSB3b3JrIGJldHdlZW4gbW9kdWxlcz88L2gzPgotQ29uc2lkZXIgZm9yIGEgbW9tZW50IHRoZSBmb2xsb3dpbmcgdHdvIGludGVyZmFjZSBmaWxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gRmlsZSA6IGEuaQotJW1vZHVsZSBhCi0KLS8vIEhlcmUgaXMgYSBiYXNlIGNsYXNzCi1jbGFzcyBhIHsKLXB1YmxpYzoKLQlhKCk7Ci0JfmEoKTsKLQl2b2lkIGZvbyhkb3VibGUpOwotfTsKLQotCi0vLyBGaWxlIDogYi5pCi0lbW9kdWxlIGIKLQotLy8gSGVyZSBpcyBhIGRlcml2ZWQgY2xhc3MKLSVleHRlcm4gYS5pICAgICAgICAgICAgICAgICAvLyBHZXRzIGRlZmluaXRpb24gb2YgYmFzZSBjbGFzcwotCi1jbGFzcyBiIDogcHVibGljIGEgewotcHVibGljOgotCWJhcigpOwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBjb21waWxlZCBpbnRvIHR3byBzZXBhcmF0ZSBtb2R1bGVzLCB0aGUgY29kZSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5LiBJbiBmYWN0LCB5b3UgZ2V0IGEgdHlwZSBlcnJvciBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPltiZWF6bGV5QGd1aW5uZXNzIHNoYWRvd10kIHB5dGhvbgotUHl0aG9uIDEuNCAoSmFuIDE2IDE5OTcpICBbR0NDIDIuNy4yXQotQ29weXJpZ2h0IDE5OTEtMTk5NSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sIEFtc3RlcmRhbQotJmd0OyZndDsmZ3Q7IGZyb20gYSBpbXBvcnQgKgotJmd0OyZndDsmZ3Q7IGZyb20gYiBpbXBvcnQgKgotJmd0OyZndDsmZ3Q7ICMgQ3JlYXRlIGEgbmV3ICJiIgotJmd0OyZndDsmZ3Q7IGIgPSBuZXdfYigpCi0mZ3Q7Jmd0OyZndDsgIyBDYWxsIGEgZnVuY3Rpb24gaW4gdGhlIGJhc2UgY2xhc3MKLS4uLgotJmd0OyZndDsmZ3Q7IGFfZm9vKGIsMykKLVRyYWNlYmFjayAoaW5uZXJtb3N0IGxhc3QpOgotICBGaWxlICImbHQ7c3RkaW4mZ3Q7IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IFR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiBhX2Zvby4gRXhwZWN0ZWQgX2FfcC4KLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ib3dldmVyLCBmcm9tIG91ciBjbGFzcyBkZWZpbml0aW9ucyB3ZSBrbm93IHRoYXQgImIiIGlzIGFuICJhIiBieSBpbmhlcml0YW5jZSBhbmQgdGhlcmUgc2hvdWxkIGJlIG5vIHR5cGUtZXJyb3IuIFRoaXMgcHJvYmxlbSBpcyBkaXJlY3RseSBkdWUgdG8gdGhlIGxhY2sgb2YgdHlwZS1zaGFyaW5nIGJldHdlZW4gbW9kdWxlcy4gSWYgd2UgbG9vayBjbG9zZWx5IGF0IHRoZSBtb2R1bGUgbW9kdWxlcyBjcmVhdGVkIGhlcmUsIHRoZXkgbG9vayBsaWtlIHRoaXMgOjxwPgotPGNlbnRlcj48aW1nIHNyYz0iY2gxMS4yLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLVRoZSB0eXBlIGluZm9ybWF0aW9uIGxpc3RlZCBzaG93cyB0aGUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHZhcmlvdXMgQyBkYXRhdHlwZXMuICBJbiB0aGUgImEiIG1vZHVsZSwgd2Ugc2VlIHRoYXQgImEiIGNhbiBvbmx5IGFjY2VwdCBpbnN0YW5jZXMgb2YgaXRzZWxmLiAgSW4gdGhlICJiIiBtb2R1bGUsIHdlIHNlZSB0aGF0ICJhIiAgY2FuIGFjY2VwdCBib3RoICJhIiBhbmQgImIiIGluc3RhbmNlcy0td2hpY2ggaXMgY29ycmVjdCBnaXZlbiB0aGF0IGEgImIiICBpcyBhbiAiYSIgYnkgaW5oZXJpdGFuY2UuPHA+Ci08cD4KLVVuZm9ydHVuYXRlbHksIHRoaXMgcHJvYmxlbSBpcyBpbmhlcmVudCBpbiB0aGUgbWV0aG9kIGJ5IHdoaWNoIFNXSUcgbWFrZXMgbW9kdWxlcy4gIFdoZW4gd2UgbWFkZSB0aGUgImEiIG1vZHVsZSwgd2UgaGFkIG5vIGlkZWEgd2hhdCBkZXJpdmVkIGNsYXNzZXMgbWlnaHQgYmUgdXNlZCBhdCBhIGxhdGVyIHRpbWUuIEhvd2V2ZXIsIGl0J3MgaW1wb3NzaWJsZSB0byBwcm9kdWNlIHRoZSBwcm9wZXIgdHlwZSBpbmZvcm1hdGlvbiB1bnRpbCBhZnRlciB3ZSBrbm93IGFsbCBvZiB0aGUgZGVyaXZlZCBjbGFzc2VzLiAgIEEgbmljZSBwcm9ibGVtIHRvIGJlIHN1cmUsIGJ1dCBvbmUgdGhhdCBjYW4gYmUgZml4ZWQgYnkgbWFraW5nIGFsbCBtb2R1bGVzIHNoYXJlIGEgc2luZ2xlIGNvcHkgb2YgdGhlIFNXSUcgcnVuLXRpbWUgbGlicmFyeS48cD4KLTxhIG5hbWU9Im42Ij48L2E+PGgzPiBUaGUgU1dJRyBydW50aW1lIGxpYnJhcnk8L2gzPgotVG8gcmVkdWNlIG92ZXJoZWFkIGFuZCB0byBmaXggdHlwZS1oYW5kbGluZyBwcm9ibGVtcywgaXQgaXMgcG9zc2libGUgdG8gc2hhcmUgdGhlIFNXSUcgcnVuLXRpbWUgZnVuY3Rpb25zIGJldHdlZW4gbXVsdGlwbGUgbW9kdWxlcy4gICAgVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeSB3aGljaCBpcyBvcHRpb25hbGx5IGJ1aWx0IGR1cmluZyBTV0lHIGluc3RhbGxhdGlvbi4gIFRvIHVzZSB0aGUgcnVudGltZSBsaWJyYXJpZXMsIGZvbGxvdyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTEuICBCdWlsZCB0aGUgU1dJRyBydW4tdGltZSBsaWJyYXJpZXMuICBUaGUgPHR0PlNXSUcxLjEvUnVudGltZTwvdHQ+IGRpcmVjdG9yeSBjb250YWlucyBhIG1ha2VmaWxlIGZvciBkb2luZyB0aGlzLiAgIElmIHN1Y2Nlc3NmdWxseSBidWlsdCwgeW91IHdpbGwgZW5kIHVwIHdpdGggNiBmaWxlcyB0aGF0IGFyZSB1c3VhbGx5IGluc3RhbGxlZCBpbiA8dHQ+L3Vzci9sb2NhbC9saWI8L3R0Pi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5saWJzd2lndGNsLmEgICAgICAgICAgICAgICAgICMgVGNsIGxpYnJhcnkgKHN0YXRpYykKLWxpYnN3aWd0Y2wuc28gICAgICAgICAgICAgICAgIyBUY2wgbGlicmFyeSAoc2hhcmVkKQotbGlic3dpZ3BsLmEgICAgICAgICAgICAgICAgICAjIFBlcmwgbGlicmFyeSAoc3RhdGljKQotbGlic3dpZ3BsLnNvICAgICAgICAgICAgICAgICAjIFBlcmwgbGlicmFyeSAoc2hhcmVkKQotbGlic3dpZ3B5LmEgICAgICAgICAgICAgICAgICAjIFB5dGhvbiBsaWJyYXJ5IChzdGF0aWMpCi1saWJzd2lncHkuc28gICAgICAgICAgICAgICAgICMgUHl0aG9uIGxpYnJhcnkgKHNoYXJlZCkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm90ZSB0aGF0IGNlcnRhaW4gbGlicmFyaWVzIG1heSBiZSBtaXNzaW5nIGR1ZSB0byBtaXNzaW5nIHBhY2thZ2VzIG9yIHVuc3VwcG9ydGVkIGZlYXR1cmVzIChsaWtlIGR5bmFtaWMgbG9hZGluZykgb24geW91ciBtYWNoaW5lLjxwPgotPHA+Ci0yLiAgIENvbXBpbGUgYWxsIFNXSUcgbW9kdWxlcyB1c2luZyB0aGUgPHR0Pi1jPC90dD4gb3B0aW9uLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLWMgLXB5dGhvbiBhLmkKLSUgc3dpZyAtYyAtcHl0aG9uIGIuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0Pi1jPC90dD4gb3B0aW9uIHRlbGxzIFNXSUcgdG8gb21pdCBydW50aW1lIHN1cHBvcnQuICBJdCdzIG5vdyB1cCB0byB5b3UgdG8gcHJvdmlkZSBpdCBzZXBhcmF0ZWx5LS13aGljaCB3ZSB3aWxsIGRvIHVzaW5nIG91ciBsaWJyYXJpZXMuPHA+Ci08cD4KLTMuICAgQnVpbGQgU1dJRyBtb2R1bGVzIGJ5IGxpbmtpbmcgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgcnVudGltZSBsaWJyYXJpZXMuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1jIC1weXRob24gYS5pCi0lIHN3aWcgLWMgLXB5dGhvbiBiLmkKLSUgZ2NjIC1jIGFfd3JhcC5jIGJfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi0lIGxkIC1zaGFyZWQgYV93cmFwLm8gYl93cmFwLm8gLWxzd2lncHkgIC1vIGEuc28KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3IgaWYgYnVpbGRpbmcgYSBuZXcgZXhlY3V0YWJsZSAoc3RhdGljIGxpbmtpbmcpPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1jIC10Y2wgLWx0Y2xzaC5pIGEuaQotJSBnY2MgYV93cmFwLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbHRjbCAtbHN3aWd0Y2wgLWxtIC1vIG15dGNsc2gKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIGNvbXBsZXRlZCB5b3Ugc2hvdWxkIG5vdyBlbmQgdXAgd2l0aCBhIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBsaWtlIHRoaXMgOjxwPgotPGNlbnRlcj48aW1nIHNyYz0iY2gxMS4zLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotSW4gdGhpcyBjb25maWd1cmF0aW9uLCB0aGUgcnVudGltZSBsaWJyYXJ5IG1hbmFnZXMgYWxsIGRhdGF0eXBlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYmV0d2VlbiBtb2R1bGVzLiAgIFRoaXMgbWFuYWdlbWVudCBwcm9jZXNzIGlzIGR5bmFtaWMgaW4gbmF0dXJlLS13aGVuIG5ldyBtb2R1bGVzIGFyZSBsb2FkZWQsIHRoZXkgY29udHJpYnV0ZSBpbmZvcm1hdGlvbiB0byB0aGUgcnVuLXRpbWUgc3lzdGVtLiAgIEluIHRoZSBDKysgd29ybGQsIG9uZSBjb3VsZCBpbmNyZW1lbnRhbGx5IGxvYWQgY2xhc3NlcyBhcyBuZWVkZWQuICBBcyB0aGlzIHByb2Nlc3Mgb2NjdXJzLCB0eXBlIGluZm9ybWF0aW9uIGlzIHVwZGF0ZWQgYW5kIGJhc2UtY2xhc3NlcyBsZWFybiBhYm91dCBkZXJpdmVkIGNsYXNzZXMgYXMgbmVlZGVkLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDM+IEEgZmV3IGR5bmFtaWMgbG9hZGluZyBnb3RjaGFzPC9oMz4KLVdoZW4gd29ya2luZyB3aXRoIGR5bmFtaWMgbG9hZGluZywgaXQgaXMgY3JpdGljYWwgdG8gY2hlY2sgdGhhdCBvbmx5IG9uZSBjb3B5IG9mIHRoZSBydW4tdGltZSBsaWJyYXJ5IGlzIGJlaW5nIGxvYWRlZCBpbnRvIHRoZSBzeXN0ZW0uICBXaGVuIHdvcmtpbmcgd2l0aCA8dHQ+LmE8L3R0PiBsaWJyYXJ5IGZpbGVzLCBwcm9ibGVtcyBjYW4gc29tZXRpbWVzIG9jY3VyIHNvIHRoZXJlIGFyZSBhIGZldyBhcHByb2FjaGVzIHRvIHRoZSBwcm9ibGVtLjxwPgotPHA+Ci0xLiAgUmVidWlsZCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGV4ZWN1dGFibGUgd2l0aCB0aGUgU1dJRyBydW50aW1lIGxpYnJhcnkgYXR0YWNoZWQgdG8gaXQuICAgVGhpcyBpcyBhY3R1YWxseSwgZmFpcmx5IGVhc3kgdG8gZG8gdXNpbmcgU1dJRy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIG15dGNsc2gKLSV7Ci0KLXN0YXRpYyB2b2lkICpfX2VtYmVkZnVuYyh2b2lkICphKSB7IHJldHVybiBhfTsKLSV9Ci0KLXZvaWQgKl9fZW1iZWRmdW5jKHZvaWQgKik7Ci0laW5jbHVkZSB0Y2xzaC5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93LCBydW4gU1dJRyBhbmQgY29tcGlsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLWMgLXRjbCBteXRjbHNoLmkKLSUgZ2NjIG15dGNsc2hfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlIC1ML3Vzci9sb2NhbC9saWIgLWx0Y2wgLWxzd2lndGNsIC1sZGwgLWxtIFwKLSAgICAgIC1vIHRjbHNoCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgcHJvZHVjZXMgYSBuZXcgZXhlY3V0YWJsZSAiPHR0PnRjbHNoPC90dD4iIHRoYXQgY29udGFpbnMgYSBjb3B5IG9mIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeS4gICBUaGUgd2VpcmQgPHR0Pl9fZW1iZWRmdW5jKCk8L3R0PiBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gZm9yY2UgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgcnVudGltZSBsaWJyYXJ5IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBleGVjdXRhYmxlLiAgICA8cD4KLTxwPgotVG8gbWFrZSBuZXcgZHluYW1pY2FsbHkgbG9hZGFibGUgU1dJRyBtb2R1bGVzLCBzaW1wbHkgY29tcGlsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLWMgLXRjbCBleGFtcGxlLmkKLSUgZ2NjIC1jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi0lIGxkIC1zaGFyZWQgZXhhbXBsZV93cmFwLm8gLW8gZXhhbXBsZS5zbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1MaW5raW5nIGFnYWluc3QgdGhlIDx0dD5zd2lndGNsPC90dD4gbGlicmFyeSBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGFzIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIDx0dD50Y2xzaDwvdHQ+IGV4ZWN1dGFibGUgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB5b3VyIG1vZHVsZSBpcyBsb2FkZWQuPHA+Ci08cD4KLTIuICBVc2luZyBzaGFyZWQgbGlicmFyeSB2ZXJzaW9ucyBvZiB0aGUgcnVudGltZSBsaWJyYXJ5PHA+Ci08cD4KLUlmIHN1cHBvcnRlZCBvbiB5b3VyIG1hY2hpbmUsIHRoZSBydW50aW1lIGxpYnJhcmllcyB3aWxsIGJlIGJ1aWx0IGFzIHNoYXJlZCBsaWJyYXJpZXMgKGluZGljYXRlZCBieSBhIDx0dD4uc288L3R0PiwgPHR0Pi5zbDwvdHQ+LCBvciAuPHR0PmRsbDwvdHQ+IHN1ZmZpeCkuICAgVG8gY29tcGlsZSB1c2luZyB0aGUgcnVudGltZSBsaWJyYXJpZXMsIHlvdSBsaW5rIHByb2Nlc3Mgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBsZCAtc2hhcmVkIHN3aWd0Y2xfd3JhcC5vIC1vIGxpYnN3aWd0Y2wuc28gICAgICAgICAgICAgIyBJcml4Ci0lIGdjYyAtc2hhcmVkIHN3aWd0Y2xfd3JhcC5vIC1vIGxpYnN3aWd0Y2wuc28gICAgICAgICAgICAjIExpbnV4Ci0lIGxkIC1HIHN3aWd0Y2xfd3JhcC5vIC1vIGxpYnN3aWd0Y2wuc28gICAgICAgICAgICAgICAgICAjIFNvbGFyaXMKLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIG9yZGVyIGZvciB0aGUgPHR0PmxpYnN3aWd0Y2wuc288L3R0PiBsaWJyYXJ5IHRvIHdvcmssIGl0IG5lZWRzIHRvIGJlIHBsYWNlZCBpbiBhIGxvY2F0aW9uIHdoZXJlIHRoZSBkeW5hbWljIGxvYWRlciBjYW4gZmluZCBpdC4gIFR5cGljYWxseSB0aGlzIGlzIGEgc3lzdGVtIGxpYnJhcnkgZGlyZWN0b3J5IChpZS4gPHR0Pi91c3IvbG9jYWwvbGliPC90dD4gb3IgPHR0Pi91c3IvbGliPC90dD4pLiAgIDxwPgotPHA+Ci1XaGVuIHJ1bm5pbmcgd2l0aCB0aGUgc2hhcmVkIGxpYmFyeSB2ZXJzaW9uLCB5b3UgbWF5IGdldCBlcnJvciBtZXNzYWdlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VW5hYmxlIHRvIGxvY2F0ZSBsaWJzd2lndGNsLnNvIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGluZGljYXRlcyB0aGF0IHRoZSBsb2FkZXIgd2FzIHVuYWJsZSB0byBmaW5kIHRoZSBzaGFyZWQgbGliYXJ5IGF0IHJ1bi10aW1lLiAgICAgVG8gZmluZCBzaGFyZWQgbGliYXJpZXMsIHRoZSBsb2FkZXIgbG9va3MgdGhyb3VnaCBhIGNvbGxlY3Rpb24gb2YgcHJlZGV0ZXJtaW5lZCBwYXRocy4gIElmIHRoZSA8dHQ+bGlic3dpZ3RjbC5zbzwvdHQ+IGZpbGUgaXMgbm90IGluIGFueSBvZiB0aGVzZSBkaXJlY3RvcmllcywgaXQgcmVzdWx0cyBpbiBhbiBlcnJvci4gICBPbiBtb3N0IG1hY2hpbmVzLCB5b3UgY2FuIGNoYW5nZSB0aGUgbG9hZGVyIHNlYXJjaCBwYXRoIGJ5IGNoYW5naW5nIHRoZSBVbml4IGVudmlyb25tZW50IHZhcmlhYmxlIDx0dD5MRF9MSUJSQVJZX1BBVEg8L3R0Pi4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXRlbnYgTERfTElCUkFSWV9QQVRIIC46L2hvbWUvYmVhemxleS9wYWNrYWdlcy9saWIKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSBzb21ld2hhdCBiZXR0ZXIgYXBwcm9hY2ggaXMgdG8gbGluayB5b3VyIG1vZHVsZSB3aXRoIHRoZSBwcm9wZXIgcGF0aCBlbmNvZGVkLiAgVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSB1c2luZyB0aGUgYC1ycGF0aCcgb3IgYC1SJyBvcHRpb24gdG8geW91ciBsaW5rZXIgKHNlZSB0aGUgbWFuIHBhZ2UpLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgbGQgLXNoYXJlZCBleGFtcGxlX3dyYXAubyBleGFtcGxlLm8gLXJwYXRoIC9ob21lL2JlYXpsZXkvcGFja2FnZXMvbGliIFwKLSAgICAgICAtTC9ob21lL2JlYXpsZXkvcGFja2FnZXMvbGliIC1sc3dpZ3RjbC5zbyAtbyBleGFtcGxlLnNvCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+LXJwYXRoPC90dD4gb3B0aW9uIGVuY29kZXMgdGhlIGxvY2F0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW50byB5b3VyIG1vZHVsZXMgYW5kIGdldHMgYXJvdW5kIGhhdmluZyB0byBzZXQgdGhlIDx0dD5MRF9MSUJSQVJZX1BBVEg8L3R0PiB2YXJpYWJsZS4gIDxwPgotPHA+Ci1JZiBhbGwgZWxzZSBmYWlscywgcHVsbCB1cCB0aGUgbWFuIHBhZ2VzIGZvciB5b3VyIGxpbmtlciBhbmQgc3RhcnQgcGxheWluZyBhcm91bmQuICAgPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gRHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9oMj4KLUR5bmFtaWMgbG9hZGluZyBvZiBDKysgbW9kdWxlcyBwcmVzZW50cyBhIHNwZWNpYWwgcHJvYmxlbSBmb3IgbWFueSBzeXN0ZW1zLiAgIFRoaXMgaXMgYmVjYXVzZSBDKysgbW9kdWxlcyBvZnRlbiBuZWVkIGFkZGl0aW9uYWwgc3VwcG9ydGluZyBjb2RlIGZvciBwcm9wZXIgaW5pdGlhbGl6YXRpb24gYW5kIG9wZXJhdGlvbi4gICBTdGF0aWMgY29uc3RydWN0b3JzIGFyZSBhbHNvIGEgYml0IG9mIGEgcHJvYmxlbS48cD4KLTxwPgotV2hpbGUgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgQysrIG1vZHVsZXMgaXMsIGJ5IG5vIG1lYW5zLCBhbmQgZXhhY3Qgc2NpZW5jZSwgaGVyZSBhcmUgYSBmZXcgcnVsZXMgb2YgdGh1bWIgdG8gZm9sbG93IDo8cD4KLTxwPgotPHVsPgotPGxpPkRvbid0IHVzZSBzdGF0aWMgY29uc3RydWN0b3JzIGlmIGF0IGFsbCBwb3NzaWJsZSAobm90IGFsd2F5cyBhdm9pZGFibGUpLgotPGxpPlRyeSBsaW5raW5nIHlvdXIgbW9kdWxlIHdpdGggdGhlIEMrKyBjb21waWxlciB1c2luZyBhIGNvbW1hbmQgbGlrZSBgYysrIC1zaGFyZWQnLiAgVGhpcyBvZnRlbiBzb2x2ZXMgYWxvdCBvZiBwcm9ibGVtcy4KLTxsaT5Tb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgYWdhaW5zdCBzcGVjaWFsIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBtb2R1bGVzIGNvbXBpbGVkIHdpdGggZysrIG9mdGVuIG5lZWQgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIDx0dD5saWJnY2MuYTwvdHQ+LCA8dHQ+bGliZysrLmE8L3R0PiwgYW5kIDx0dD5saWJzdGRjKysuYTwvdHQ+IGxpYnJhcmllcy4KLTxsaT5SZWFkIHRoZSBjb21waWxlciBhbmQgbGlua2VyIG1hbiBwYWdlcyBvdmVyIGFuZCBvdmVyIHVudGlsIHlvdSBoYXZlIHRoZW0gbWVtb3JpemVkICh0aGlzIG1heSBub3QgaGVscCBpbiBzb21lIGNhc2VzIGhvd2V2ZXIpLgotPGxpPlNlYXJjaCBhcnRpY2xlcyBvbiBVc2VuZXQsIHBhcnRpY3VsYXJseSBpbiA8dHQ+Y29tcC5sYW5nLnRjbDwvdHQ+LCA8dHQ+Y29tcC5sYW5nLnBlcmw8L3R0PiwgYW5kIDx0dD5jb21wLmxhbmcucHl0aG9uPC90dD4uICAgIEJ1aWxkaW5nIEMrKyBtb2R1bGVzIGlzIGEgY29tbW9uIHByb2JsZW0uCi08L3VsPgotPHA+Ci1UaGUgU1dJRyBkaXN0cmlidXRpb24gY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gYWJvdXQgQysrIG1vZHVsZXMgaW4gdGhlIERvYyBkaXJlY3RvcnkgYXMgd2VsbC48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBJbnNpZGUgdGhlIFNXSUcgdHlwZS1jaGVja2VyPC9oMj4KLVRoZSBTV0lHIHJ1bnRpbWUgdHlwZS1jaGVja2VyIHBsYXlzIGEgY3JpdGljYWwgcm9sZSBpbiB0aGUgY29ycmVjdCBvcGVyYXRpb24gb2YgU1dJRyBtb2R1bGVzLiAgIEl0IG5vdCBvbmx5IGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgcG9pbnRlciB0eXBlcywgYnV0IGFsc28gbWFuYWdlcyBDKysgaW5oZXJpdGFuY2UsIGFuZCBwZXJmb3JtcyBwcm9wZXIgdHlwZS1jYXN0aW5nIG9mIHBvaW50ZXJzIHdoZW4gbmVjZXNzYXJ5LiAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHNvbWUgaW5zaWdodCBpbnRvIHdoYXQgaXQgZG9lcywgaG93IGl0IHdvcmtzLCBhbmQgd2h5IGl0IGlzIHRoZSB3YXkgaXQgaXMuPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMz4gVHlwZSBlcXVpdmFsZW5jZTwvaDM+Ci1TV0lHIHVzZXMgYSBuYW1lLWJhc2VkIGFwcHJvYWNoIHRvIG1hbmFnaW5nIHBvaW50ZXIgZGF0YXR5cGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB1c2luZyBhIHBvaW50ZXIgbGlrZSAiPHR0PmRvdWJsZSAqPC90dD4iLCB0aGUgdHlwZS1jaGVja2VyIHdpbGwgbG9vayBmb3IgYSBwYXJ0aWN1bGFyIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGF0IGRhdGF0eXBlIHN1Y2ggYXMgIjx0dD5fZG91YmxlX3A8L3R0PiIuICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQsIGEgdHlwZS1lcnJvciBpcyByZXBvcnRlZC48cD4KLTxwPgotSG93ZXZlciwgdGhlIG1hdGNoaW5nIHByb2Nlc3MgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBkYXRhdHlwZXMgbWF5IHVzZSBhIHZhcmlldHkgb2YgZGlmZmVyZW50IG5hbWVzLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBkb3VibGUgICBSZWFsOwotdHlwZWRlZiBSZWFsICogICBSZWFsUHRyOwotdHlwZWRlZiBkb3VibGUgICBGbG9hdDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotZGVmaW5lIHR3byBzZXRzIG9mIGVxdWl2YWxlbnQgdHlwZXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPntkb3VibGUsIFJlYWwsIEZsb2F0fQote1JlYWxQdHIsIFJlYWwgKn0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQWxsIG9mIHRoZSB0eXBlcyBpbiBlYWNoIHNldCBhcmUgZnJlZWx5IGludGVyY2hhbmdhYmxlIGFuZCB0aGUgdHlwZS1jaGVja2VyIGtub3dzIGFib3V0IHRoZSByZWxhdGlvbnNoaXBzIGJ5IG1hbmFnaW5nIGEgdGFibGUgb2YgZXF1aXZhbGVuY2VzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotZG91YmxlICAgID0mZ3Q7IHsgUmVhbCwgRmxvYXQgfQotUmVhbCAgICAgID0mZ3Q7IHsgZG91YmxlLCBGbG9hdCB9Ci1GbG9hdCAgICAgPSZndDsgeyBkb3VibGUsIFJlYWwgfQotUmVhbFB0ciAgID0mZ3Q7IHsgUmVhbCAqIH0KLVJlYWwgKiAgICA9Jmd0OyB7IFJlYWxQdHIgfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4geW91IGRlY2xhcmUgYSBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZm9vKFJlYWwgKmEpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIGZpcnN0IGNoZWNrcyB0byBzZWUgaWYgdGhlIGFyZ3VtZW50IHBhc3NlZCBpcyBhICI8dHQ+UmVhbCAqPC90dD4iLiAgIElmIG5vdCwgaXQgY2hlY2tzIHRvIHNlZSBpZiBpdCBpcyBhbnkgb2YgdGhlIG90aGVyIGVxdWl2YWxlbnQgdHlwZXMgKDx0dD5kb3VibGUgKjwvdHQ+LCA8dHQ+UmVhbFB0cjwvdHQ+LCA8dHQ+RmxvYXQgKjwvdHQ+KS4gIElmIHNvLCB0aGUgdmFsdWUgaXMgYWNjZXB0ZWQgYW5kIG5vIGVycm9yIG9jY3Vycy48cD4KLTxwPgotRGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGUgdmFyaW91cyBkYXRhdHlwZXMgYXJlIGFsc28gbGVnYWwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhIGZ1bmN0aW9uIGxpa2UgdGhpcyw8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGJhcihGbG9hdCAqKiphKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHR5cGUtY2hlY2tlciB3aWxsIGFjY2VwdCBwb2ludGVycyBvZiB0eXBlIDx0dD5kb3VibGUgKioqPC90dD4gYW5kIDx0dD5SZWFsICoqKi48L3R0PiAgSG93ZXZlciwgdGhlIHR5cGUtY2hlY2tlciBkb2VzIG5vdCBhbHdheXMgY2FwdHVyZSB0aGUgZnVsbC1yYW5nZSBvZiBwb3NzaWJpbGl0aWVzLiAgRm9yIGV4YW1wbGUsIGEgZGF0YXR5cGUgb2YgYDx0dD5SZWFsUHRyICoqPC90dD4nIGlzIGVxdWl2YWxlbnQgdG8gYSBgPHR0PkZsb2F0ICoqKjwvdHQ+JyBidXQgd291bGQgYmUgZmxhZ2dlZCBhcyBhIHR5cGUgZXJyb3IuICAgSWYgeW91IGVuY291bnRlciB0aGlzIGtpbmQgb2YgcHJvYmxlbSwgeW91IGNhbiBtYW51YWxseSBmb3JjZSBTV0lHIHRvIG1ha2UgYW4gZXF1aXZhbGVuY2UgYXMgZm9sbG93czo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBUZWxsIHRoZSB0eXBlIGNoZWNrZXIgdGhhdCBgRmxvYXRfcHBwJyBhbmQgYFJlYWxQdHJfcHAnIGFyZSBlcXVpdmFsZW50LgotJWluaXQgJXsKLQlTV0lHX1JlZ2lzdGVyTWFwcGluZygiRmxvYXRfcHBwIiwiUmVhbFB0cl9wcCIsMCk7Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Eb2luZyB0aGlzIHNob3VsZCBoYXJkbHkgZXZlciBiZSBuZWNlc3NhcnkgKEkgaGF2ZSBuZXZlciBlbmNvdW50ZXJlZCBhIGNhc2Ugd2hlcmUgdGhpcyB3YXMgbmVjZXNzYXJ5KSwgYnV0IGlmIGFsbCBlbHNlIGZhaWxzLCB5b3UgY2FuIGZvcmNlIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIgaW50byBkb2luZyB3aGF0IHlvdSB3YW50LjxwPgotPHA+Ci1UeXBlLWVxdWl2YWxlbmNlIG9mIEMrKyBjbGFzc2VzIGlzIGhhbmRsZWQgaW4gYSBzaW1pbGFyIG1hbm5lciwgYnV0IGlzIGVuY29kZWQgaW4gYSBtYW5uZXIgdG8gc3VwcG9ydCBpbmhlcml0YW5jZS4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGNsYXNzZXMgaGllcmFyY2h5IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBBIHsgfTsKLWNsYXNzIEIgOiBwdWJsaWMgQSB7IH07Ci1jbGFzcyBDIDogcHVibGljIEIgeyB9OwotY2xhc3MgRCB7fTsKLWNsYXNzIEUgOiBwdWJsaWMgQywgcHVibGljIEQge307Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSB0eXBlLWNoZWNrZXIgZW5jb2RlcyB0aGlzIGludG8gdGhlIGZvbGxvd2luZyBzZXRzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5BID0mZ3Q7IHsgQiwgQywgRSB9ICAgICAgICAgICAgICAiQiBpc2EgQSwgQyBpc2EgQSwgRSBpc2EgQSIKLUIgPSZndDsgeyBDLCBFIH0gICAgICAgICAgICAgICAgICJDIGlzYSBCLCBFIGlzYSBCIgotQyA9Jmd0OyB7IEUgfSAgICAgICAgICAgICAgICAgICAgIkUgaXNhIEMiCi1EID0mZ3Q7IHsgRSB9ICAgICAgICAgICAgICAgICAgICAiRSBpc2EgRCIKLUUgPSZndDsgeyB9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBlbmNvZGluZyByZWZsZWN0cyB0aGUgY2xhc3MgaGllcmFyY2h5LiBGb3IgZXhhbXBsZSwgYW55IG9iamVjdCBvZiB0eXBlICJBIiB3aWxsIGFsc28gYWNjZXB0IG9iamVjdHMgb2YgdHlwZSBCLEMsIGFuZCBFIGJlY2F1c2UgdGhlc2UgYXJlIGFsbCBkZXJpdmVkIGZyb20gQS4gIEhvd2V2ZXIsIGl0IGlzIG5vdCBsZWdhbCB0byBnbyB0aGUgb3RoZXIgd2F5LiBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gYSBvYmplY3QgZnJvbSBjbGFzcyBFIHdpbGwgbm90IGFjY2VwdCBhbiBvYmplY3QgZnJvbSBjbGFzcyBBLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDM+IFR5cGUgY2FzdGluZzwvaDM+Ci1XaGVuIHdvcmtpbmcgd2l0aCBDKysgY2xhc3NlcywgU1dJRyBuZWVkcyB0byBwZXJmb3JtIHByb3BlciB0eXBlY2FzdGluZyBiZXR3ZWVuIGRlcml2ZWQgYW5kIGJhc2UgY2xhc3Nlcy4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aGVuIHdvcmtpbmcgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gICBUbyBkbyB0aGlzLCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgY3JlYXRlZCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgKkV0b0Eodm9pZCAqcHRyKSB7Ci0JRSAqaW4gPSAoRSAqKSBwdHI7Ci0JQSAqb3V0ID0gKEEgKikgaW47ICAgICAgIC8vIENhc3QgdXNpbmcgQysrCi0JcmV0dXJuICh2b2lkICopIG91dDsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQWxsIHBvaW50ZXJzIGFyZSBpbnRlcm5hbGx5IHJlcHJlc2VudGVkIGFzIHZvaWQgKiwgYnV0IGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBhbHdheXMgaW52b2tlZCB3aGVuIHBvaW50ZXIgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgYmV0d2VlbiBiYXNlIGFuZCBkZXJpdmVkIGNsYXNzZXMgaW4gYSBDKysgY2xhc3MgaGllcmFyY2h5LjxwPgotPGEgbmFtZT0ibjEwIj48L2E+PGgzPiBXaHkgYSBuYW1lIGJhc2VkIGFwcHJvYWNoPzwvaDM+Ci1TV0lHIHVzZXMgYSBuYW1lLWJhc2VkIGFwcHJvYWNoIHRvIHR5cGUtY2hlY2tpbmcgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMgOjxwPgotPHA+Ci08dWw+Ci08bGk+T25lIG9mIFNXSUcncyBtYWluIHVzZXMgaXMgY29kZSBkZXZlbG9wbWVudCBhbmQgZGVidWdnaW5nLiAgIEluIHRoaXMgZW52aXJvbm1lbnQsIHRoZSB0eXBlIG5hbWUgb2YgYW4gb2JqZWN0IHR1cm5zIG91dCB0byBiZSBhIHVzZWZ1bCBwaWVjZSBvZiBpbmZvcm1hdGlvbiBpbiB0cmFja2luZyBkb3duIHByb2JsZW1zLgotPGxpPkluIGxhbmd1YWdlcyBsaWtlIFBlcmwsIHRoZSBuYW1lIG9mIGEgZGF0YXR5cGUgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhpbmdzIGxpa2UgcGFja2FnZXMgYW5kIGNsYXNzZXMuICAgIEJ5IHVzaW5nIGRhdGF0eXBlIG5hbWVzIHdlIGdldCBhIG5hdHVyYWwgbWFwcGluZyBiZXR3ZWVuIEMgYW5kIFBlcmwuCi08bGk+SSBiZWxpZXZlIHVzaW5nIHRoZSBvcmlnaW5hbCBuYW1lcyBvZiBkYXRhdHlwZXMgaXMgbW9yZSBpbnR1aXRpdmUgdGhhbiBtdW5naW5nIHRoZW0gaW50byBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQuCi08L3VsPgotPHA+Ci1BbiBhbHRlcm5hdGl2ZSB0byBhIG5hbWUgYmFzZWQgc2NoZW1lIHdvdWxkIGJlIHRvIGdlbmVyYXRlIHR5cGUtc2lnbmF0dXJlcyBiYXNlZCBvbiB0aGUgc3RydWN0dXJlIG9mIGEgZGF0YXR5cGUuICAgU3VjaCBhIHNjaGVtZSB3b3VsZCByZXN1bHQgaW4gcGVyZmVjdCB0eXBlLWNoZWNraW5nLCBidXQgSSB0aGluayBpdCB3b3VsZCBhbHNvIHJlc3VsdCBpbiBhIHZlcnkgY29uZnVzaW5nIHNjcmlwdGluZyBsYW5ndWFnZSBtb2R1bGUuICBGb3IgdGhpcyByZWFzb24sIEkgc2VlIFNXSUcgc3RpY2tpbmcgd2l0aCB0aGUgbmFtZS1iYXNlZCBhcHByb2FjaC0tYXQgbGVhc3QgZm9yIHRoZSBmb3Jlc2VlYWJsZSBmdXR1cmUuICA8cD4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMz4gUGVyZm9ybWFuY2Ugb2YgdGhlIHR5cGUtY2hlY2tlcjwvaDM+Ci1UaGUgdHlwZS1jaGVja2VyIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHMgd2hlbiBtYXRjaGluZyBhIGRhdGF0eXBlIDo8cD4KLTxwPgotCi08ZGw+Ci08ZHQ+MS4JIENoZWNrIGEgcG9pbnRlciBhZ2FpbnN0IHRoZSB0eXBlIHN1cHBsaWVkIGluIHRoZSBvcmlnaW5hbCBDIGRlY2xhcmF0aW9uLiAgSWYgdGhlcmUgaXMgYSBwZXJmZWN0IG1hdGNoLCB3ZSdyZSBkb25lLgotPGR0PjIuCSBDaGVjayB0aGUgc3VwcGxpZWQgcG9pbnRlciBhZ2FpbnN0IGEgY2FjaGUgb2YgcmVjZW50bHkgdXNlZCBkYXRhdHlwZXMuICAKLTxkdD4zLgkgU2VhcmNoIGZvciBhIG1hdGNoIGFnYWluc3QgdGhlIGZ1bGwgbGlzdCBvZiBlcXVpdmFsZW50IGRhdGF0eXBlcy4KLTxkdD40LgkgSWYgbm90IGZvdW5kLCByZXBvcnQgYW4gZXJyb3IuCi0KLTwvZGw+Ci08cD4KLU1vc3Qgd2VsbC1zdHJ1Y3R1cmVkIEMgY29kZXMgd2lsbCBmaW5kIGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBmaXJzdCBhdHRlbXB0LCBwcm92aWRpbmcgdGhlIGJlc3QgcG9zc2libGUgcGVyZm9ybWFuY2UuICBGb3IgQysrIGNvZGVzLCBpdCBpcyBxdWl0ZSBjb21tb24gdG8gYmUgcGFzc2luZyB2YXJpb3VzIG9iamVjdHMgb2YgYSBjb21tb24gYmFzZS1jbGFzcyBhcm91bmQgYmV0d2VlbiBmdW5jdGlvbnMuICAgV2hlbiBiYXNlLWNsYXNzIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCwgaXQgYWxtb3N0IGFsd2F5cyByZXN1bHRzIGluIGEgbWlzY29tcGFyZSAoYmVjYXVzZSB0aGUgdHlwZS1jaGVja2VyIGlzIGxvb2tpbmcgZm9yIHRoZSBiYXNlLXR5cGUpLiAgSW4gdGhpcyBjYXNlLCB3ZSBkcm9wIGRvd24gdG8gYSBzbWFsbCBjYWNoZSBvZiByZWNlbnRseSB1c2VkIGRhdGF0eXBlcy4gICBJZiB3ZSd2ZSB1c2VkIGEgcG9pbnRlciBvZiB0aGUgc2FtZSB0eXBlIHJlY2VudGx5LCBpdCB3aWxsIGJlIGluIHRoZSBjYWNoZSBhbmQgd2UgY2FuIG1hdGNoIGFnYWluc3QgaXQuICAgIEZvciB0aWdodCBsb29wcywgdGhpcyByZXN1bHRzIGluIGFib3V0IDEwLTE1JSBvdmVyaGVhZCBvdmVyIGZpbmRpbmcgYSBtYXRjaCBvbiB0aGUgZmlyc3QgdHJ5LiAgIEZpbmFsbHksIGFzIGEgbGFzdCByZXNvcnQsIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBpbnRlcm5hbCBwb2ludGVyIHRhYmxlcyBmb3IgYSBtYXRjaC4gIFRoaXMgaW52b2x2ZXMgYSBjb21iaW5hdGlvbiBvZiBoYXNoIHRhYmxlIGxvb2t1cCBhbmQgbGluZWFyIHNlYXJjaC4gIElmIGEgbWF0Y2ggaXMgZm91bmQsIGl0IGlzIHBsYWNlZCBpbnRvIHRoZSBjYWNoZSBhbmQgdGhlIHJlc3VsdCByZXR1cm5lZC4gIElmIG5vdCwgd2UgZmluYWxseSByZXBvcnQgYSB0eXBlLW1pc21hdGNoLjxwPgotPHA+Ci1BcyBhIHJ1bGUgb2YgIHRodW1iLCBDKysgcHJvZ3JhbXMgcmVxdWlyZSBzb21ld2hhdCBtb3JlIHByb2Nlc3NpbmcgdGhhbiBDIHByb2dyYW1zLCBidXQgdGhpcyBzZWVtcyB0byBiZSBhdm9pZGFibGUuICAgIEFsc28sIGtlZXAgaW4gbWluZCB0aGF0IHBlcmZvcm1hbmNlIHBlbmFsdGllcyBpbiB0aGUgdHlwZS1jaGVja2VyIGRvbid0IG5lY2Vzc2FyaWx5IHRyYW5zbGF0ZSBpbnRvIGJpZyBwZW5hbHRpZXMgaW4gdGhlIG92ZXJhbGwgYXBwbGljYXRpb24uICBQZXJmb3JtYW5jZSBpcyBtb3N0IGdyZWF0bHkgYWZmZWN0ZWQgYnkgdGhlIGVmZmljaWVuY3kgb2YgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHRoZSB0eXBlcyBvZiBvcGVyYXRpb25zIHlvdXIgQyBjb2RlIGlzIHBlcmZvcm1pbmcuPHA+Ci08cD4KLTxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDc6MTMgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29udGVudHMuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29udGVudHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlNWU1Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0NvbnRlbnRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPiBTV0lHIDEuMSBVc2VycyBNYW51YWwgLSBUYWJsZSBvZiBDb250ZW50cyA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci0KLTxoMT4gU1dJRyAxLjEgVXNlcnMgTWFudWFsIDwvaDE+Ci0KLTx1bD4KLTxsaT4gPGEgaHJlZj0iQ29weXJpZ2h0Lmh0bWwiPkNvcHlyaWdodDwvYT4KLTxsaT4gPGEgaHJlZj0iQWJvdXQuaHRtbCI+QWJvdXQgdGhpcyBtYW51YWw8L2E+Ci08bGk+IDxhIGhyZWY9IkluZGV4Lmh0bWwiPkFscGhhYmV0aWNhbCBUb3BpYyBJbmRleDwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iUHJlZmFjZS5odG1sIj5QcmVmYWNlPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjEiPkludHJvZHVjdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iUHJlZmFjZS5odG1sI24yIj5TV0lHIHJlc291cmNlczwvYT4KLTxsaT4gPGEgaHJlZj0iUHJlZmFjZS5odG1sI24zIj5BYm91dCB0aGlzIG1hbnVhbDwvYT4KLTxsaT4gPGEgaHJlZj0iUHJlZmFjZS5odG1sI240Ij5DcmVkaXRzPC9hPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjUiPldoYXQncyBuZXc/PC9hPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjYiPkJ1ZyByZXBvcnRzPC9hPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjciPlNXSUcgaXMgZnJlZTwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwiPjEgSW50cm9kdWN0aW9uPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMSI+V2hhdCBpcyBTV0lHPzwvYT4KLTxsaT4gPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjIiPkxpZmUgYmVmb3JlIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24zIj5MaWZlIGFmdGVyIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI240Ij5UaGUgU1dJRyBwYWNrYWdlPC9hPgotPGxpPiA8YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuNSI+QSBTV0lHIGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI242Ij5DIHN5bnRheCwgYnV0IG5vdCBhIEMgY29tcGlsZXI8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI243Ij5Ob24taW50cnVzaXZlIGludGVyZmFjZSBidWlsZGluZzwvYT4KLTxsaT4gPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjgiPkhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI245Ij5FdmVudCBkcml2ZW4gQyBwcm9ncmFtbWluZzwvYT4KLTxsaT4gPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjEwIj5BdXRvbWF0aWMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uPC9hPgotPGxpPiA8YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMTEiPlN1bW1hcnk8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xMiI+U1dJRyBmb3IgV2luZG93cyBhbmQgTWFjaW50b3NoPC9hPgotPC91bD4KLTxoMj48YSBocmVmPSJTY3JpcHRpbmcuaHRtbCI+MiBTY3JpcHRpbmcgTGFuZ3VhZ2VzPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMSI+VGhlIHR3byBsYW5ndWFnZSB2aWV3IG9mIHRoZSB3b3JsZDwvYT4KLTxsaT4gPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjIiPkhvdyBkb2VzIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRhbGsgdG8gQz88L2E+Ci08bGk+IDxhIGhyZWY9IlNjcmlwdGluZy5odG1sI24zIj5CdWlsZGluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjQiPlNoYXJlZCBsaWJyYXJpZXMgYW5kIGR5bmFtaWMgbG9hZGluZzwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iU1dJRy5odG1sIj4zIFNXSUcgQmFzaWNzPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJTV0lHLmh0bWwjbjEiPlJ1bm5pbmcgU1dJRzwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI24yIj5TaW1wbGUgQyBmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50czwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI24zIj5Qb2ludGVycyBhbmQgY29tcGxleCBvYmplY3RzPC9hPgotPGxpPiA8YSBocmVmPSJTV0lHLmh0bWwjbjQiPkdldHRpbmcgZG93biB0byBidXNpbmVzczwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI241Ij5TdHJ1Y3R1cmVzLCB1bmlvbnMsIGFuZCBvYmplY3Qgb3JpZW50ZWQgQyBwcm9ncmFtbWluZzwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI242Ij5DKysgc3VwcG9ydDwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI243Ij5PYmplY3RpdmUtQzwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI244Ij5Db25kaXRpb25hbCBjb21waWxhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI245Ij5Db2RlIEluc2VydGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI24xMCI+QSBnZW5lcmFsIGludGVyZmFjZSBidWlsZGluZyBzdHJhdGVneTwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iTGlicmFyeS5odG1sIj40IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5PC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEiPlRoZSAlaW5jbHVkZSBkaXJlY3RpdmU8L2E+Ci08bGk+IDxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMiI+VGhlICVleHRlcm4gZGlyZWN0aXZlPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjMiPlRoZSAlaW1wb3J0IGRpcmVjdGl2ZTwvYT4KLTxsaT4gPGEgaHJlZj0iTGlicmFyeS5odG1sI240Ij5JbmNsdWRpbmcgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZTwvYT4KLTxsaT4gPGEgaHJlZj0iTGlicmFyeS5odG1sI241Ij5UaGUgU1dJRyBsaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjYiPkxpYnJhcnkgZXhhbXBsZTwvYT4KLTxsaT4gPGEgaHJlZj0iTGlicmFyeS5odG1sI243Ij5DcmVhdGluZyBMaWJyYXJ5IEZpbGVzPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjgiPldvcmtpbmcgd2l0aCBsaWJyYXJ5IGZpbGVzPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjkiPlN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBtdWx0aXBsZSBtb2R1bGVzPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEwIj5Nb3JlIGFib3V0IHRoZSBTV0lHIGxpYnJhcnk8L2E+Ci08L3VsPgotPGgyPjxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCI+NSBEb2N1bWVudGF0aW9uIFN5c3RlbTwvYT48L2gyPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xIj5JbnRyb2R1Y3Rpb248L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMiI+SG93IGl0IHdvcmtzPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjMiPkNob29zaW5nIGEgZG9jdW1lbnRhdGlvbiBmb3JtYXQ8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuNCI+RnVuY3Rpb24gdXNhZ2UgYW5kIGFyZ3VtZW50IG5hbWVzPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjUiPlRpdGxlcywgc2VjdGlvbnMsIGFuZCBzdWJzZWN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI242Ij5Gb3JtYXR0aW5nPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjciPkFkZGluZyBBZGRpdGlvbmFsIFRleHQ8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuOCI+RGlzYWJsaW5nIGFsbCBkb2N1bWVudGF0aW9uPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjkiPkFuIEV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTAiPkFTQ0lJIERvY3VtZW50YXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTEiPkhUTUwgRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xMiI+TGFUZVggRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xMyI+QysrIFN1cHBvcnQ8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTQiPlRoZSBGaW5hbCBXb3JkPzwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iVHlwZW1hcHMuaHRtbCI+NiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwczwvYT48L2gyPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMSI+SW50cm9kdWN0aW9uPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI24yIj5UaGUgU1dJRyBQb2ludGVyIExpYnJhcnk8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjMiPkludHJvZHVjdGlvbiB0byB0eXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuNCI+TWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI241Ij5BcHBseWluZyBjb25zdHJhaW50cyB0byBpbnB1dCB2YWx1ZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjYiPldyaXRpbmcgbmV3IHR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI243Ij5Db21tb24gdHlwZW1hcCBtZXRob2RzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI244Ij5Xcml0aW5nIHR5cGVtYXAgY29kZTwvYT4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuOSI+VHlwZW1hcHMgZm9yIGhhbmRsaW5nIGFycmF5czwvYT4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMTAiPlR5cGVtYXBzIGFuZCB0aGUgU1dJRyBMaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI24xMSI+SW1wbGVtZW50aW5nIGNvbnN0cmFpbnRzIHdpdGggdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjEyIj5UeXBlbWFwIGV4YW1wbGVzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI24xMyI+SG93IHRvIGJyZWFrIGV2ZXJ5dGhpbmcgd2l0aCBhIHR5cGVtYXA8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjE0Ij5UeXBlbWFwcyBhbmQgdGhlIGZ1dHVyZTwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sIj43IEV4Y2VwdGlvbiBIYW5kbGluZzwvYT48L2gyPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI24xIj5UaGUgJWV4Y2VwdCBkaXJlY3RpdmU8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMiI+SGFuZGxpbmcgZXhjZXB0aW9ucyBpbiBDIGNvZGU8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMyI+RXhjZXB0aW9uIGhhbmRsaW5nIHdpdGggbG9uZ2ptcCgpPC9hPgotPGxpPiA8YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjQiPkhhbmRsaW5nIEMrKyBleGNlcHRpb25zPC9hPgotPGxpPiA8YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjUiPkRlZmluaW5nIGRpZmZlcmVudCBleGNlcHRpb24gaGFuZGxlcnM8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNiI+VXNpbmcgVGhlIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnk8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNyI+RGVidWdnaW5nIGFuZCBvdGhlciBpbnRlcmVzdGluZyB1c2VzIGZvciAlZXhjZXB0PC9hPgotPGxpPiA8YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjgiPk1vcmUgRXhhbXBsZXM8L2E+Ci08L3VsPgotPGgyPjxhIGhyZWY9IlBlcmw1Lmh0bWwiPjggU1dJRyBhbmQgUGVybDU8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjEiPlByZWxpbWluYXJpZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjIiPkJ1aWxkaW5nIFBlcmwgRXh0ZW5zaW9ucyB1bmRlciBXaW5kb3dzIDk1L05UPC9hPgotPGxpPiA8YSBocmVmPSJQZXJsNS5odG1sI24zIj5Nb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQiPkJhc2ljIFBlcmwgaW50ZXJmYWNlPC9hPgotPGxpPiA8YSBocmVmPSJQZXJsNS5odG1sI241Ij5BIHNpbXBsZSBQZXJsIGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjYiPkFjY2Vzc2luZyBhcnJheXMgYW5kIG90aGVyIHN0cmFuZ2Ugb2JqZWN0czwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuNyI+SW1wbGVtZW50aW5nIG1ldGhvZHMgaW4gUGVybDwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuOCI+U2hhZG93IGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjkiPkdldHRpbmcgc2VyaW91czwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuMTAiPldyYXBwaW5nIEMgbGlicmFyaWVzIGFuZCBvdGhlciBwYWNrYWdlczwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuMTEiPkJ1aWxkaW5nIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQjwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuMTIiPkhhbmRsaW5nIG91dHB1dCB2YWx1ZXMgKHRoZSBlYXN5IHdheSk8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjEzIj5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE0Ij5SZW1hcHBpbmcgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE1Ij5UaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9hPgotPGxpPiA8YSBocmVmPSJQZXJsNS5odG1sI24xNiI+V2hlcmUgdG8gZ28gZnJvbSBoZXJlPzwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iUHl0aG9uLmh0bWwiPjkgU1dJRyBhbmQgUHl0aG9uPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJQeXRob24uaHRtbCNuMSI+UHJlbGltaW5hcmllczwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIiPkJ1aWxkaW5nIFB5dGhvbiBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI24zIj5UaGUgbG93LWxldmVsIFB5dGhvbi9DIGludGVyZmFjZTwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQiPlB5dGhvbiBzaGFkb3cgY2xhc3NlczwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjUiPkFib3V0IHRoZSBFeGFtcGxlczwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjYiPlNvbHZpbmcgYSBzaW1wbGUgaGVhdC1lcXVhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjciPldyYXBwaW5nIGEgQyBsaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSJQeXRob24uaHRtbCNuOCI+UHV0dGluZyBpdCBhbGwgdG9nZXRoZXI8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI245Ij5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI24xMCI+UmVtYXBwaW5nIEMgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI24xMSI+SW1wbGVtZW50aW5nIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGluIFB5dGhvbjwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjEyIj5PdGhlciBvZGRzIGFuZCBlbmRzPC9hPgotPGxpPiA8YSBocmVmPSJQeXRob24uaHRtbCNuMTMiPlRoZSBnb3J5IGRldGFpbHMgb2Ygc2hhZG93IGNsYXNzZXM8L2E+Ci08L3VsPgotPGgyPjxhIGhyZWY9IlRjbC5odG1sIj4xMCBTV0lHIGFuZCBUY2w8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI24xIj5QcmVsaW1pbmFyaWVzPC9hPgotPGxpPiA8YSBocmVmPSJUY2wuaHRtbCNuMiI+QnVpbGRpbmcgVGNsL1RrIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjMiPkJhc2ljIFRjbCBJbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI240Ij5UaGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZTwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjUiPkFib3V0IHRoZSBleGFtcGxlczwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjYiPkJpbmFyeSB0cmVlcyBpbiBUY2w8L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI243Ij5CdWlsZGluZyBDL0MrKyBkYXRhIHN0cnVjdHVyZXMgd2l0aCBUazwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjgiPkFjY2Vzc2luZyBhcnJheXM8L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI245Ij5CdWlsZGluZyBhIHNpbXBsZSBPcGVuR0wgbW9kdWxlPC9hPgotPGxpPiA8YSBocmVmPSJUY2wuaHRtbCNuMTAiPkV4Y2VwdGlvbiBoYW5kbGluZzwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjExIj5UeXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjEyIj5Db25maWd1cmF0aW9uIG1hbmFnZW1lbnQgd2l0aCBTV0lHPC9hPgotPGxpPiA8YSBocmVmPSJUY2wuaHRtbCNuMTMiPkJ1aWxkaW5nIG5ldyBraW5kcyBvZiBUY2wgaW50ZXJmYWNlcyAoaW4gVGNsKTwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjE0Ij5FeHRlbmRpbmcgdGhlIFRjbCBOZXRzY2FwZSBQbHVnaW48L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI24xNSI+VGNsOC4wIGZlYXR1cmVzPC9hPgotPC91bD4KLTxoMj48YSBocmVmPSJBZHZhbmNlZC5odG1sIj4xMSBBZHZhbmNlZCBUb3BpY3M8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IkFkdmFuY2VkLmh0bWwjbjEiPkNyZWF0aW5nIG11bHRpLW1vZHVsZSBwYWNrYWdlczwvYT4KLTxsaT4gPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuMiI+RHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9hPgotPGxpPiA8YSBocmVmPSJBZHZhbmNlZC5odG1sI24zIj5JbnNpZGUgdGhlIFNXSUcgdHlwZS1jaGVja2VyPC9hPgotPC91bD4KLTxoMj48YSBocmVmPSJFeHRlbmRpbmcuaHRtbCI+MTIgRXh0ZW5kaW5nIFNXSUc8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xIj5JbnRyb2R1Y3Rpb248L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yIj5Db21waWxpbmcgYSBTV0lHIGV4dGVuc2lvbjwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjMiPlNXSUcgb3V0cHV0PC9hPgotPGxpPiA8YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNCI+VGhlIExhbmd1YWdlIGNsYXNzIChzaW1wbGUgdmVyc2lvbik8L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI241Ij5BIHRvdXIgb2YgU1dJRyBkYXRhdHlwZXM8L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI242Ij5UeXBlbWFwcyAoZnJvbSBDKTwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjciPkZpbGUgbWFuYWdlbWVudDwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjgiPk5hbWluZyBTZXJ2aWNlczwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjkiPkNvZGUgR2VuZXJhdGlvbiBGdW5jdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xMCI+V3JpdGluZyBhIFJlYWwgTGFuZ3VhZ2UgTW9kdWxlPC9hPgotPGxpPiA8YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTEiPkMrKyBQcm9jZXNzaW5nPC9hPgotPGxpPiA8YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTIiPkRvY3VtZW50YXRpb24gUHJvY2Vzc2luZzwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjEzIj5UaGUgRnV0dXJlIG9mIFNXSUc8L2E+Ci08L3VsPgotCi08cD48aHI+Ci08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ3OjE4IDE5OTcgPC9hZGRyZXNzPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29weXJpZ2h0Lmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML0NvcHlyaWdodC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4ODI4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29weXJpZ2h0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPHRpdGxlPiBTV0lHIERvY3VtZW50YXRpb24gQ29weXJpZ2h0PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgQkdDT0xPUj0iI0ZGRkZGRiI+Ci08aDI+IFNXSUcgVXNlcnMgTWFudWFsIDwvaDI+Ci08Yj4KLVZlcnNpb24gMS4xPGJyPgotSnVuZSwgMTk5NyA8YnI+Ci08L2I+Ci08cD4KLUNvcHlyaWdodChDKSAxOTk2LCAxOTk3PGJyPgotQWxsIFJpZ2h0cyBSZXNlcnZlZDxicj4KLTxicj4KLURhdmlkIE0uIEJlYXpsZXk8YnI+Ci1EZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBVdGFoIDxicj4KLVNhbHQgTGFrZSBDaXR5LCBVdGFoIDg0MTEyIDwvYnI+Ci08dHQ+YmVhemxleUBjcy51dGFoLmVkdTwvdHQ+Ci0KLTxwPgotVGhpcyBkb2N1bWVudCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIGluIHdob2xlIG9yIHBhcnQgcHJvdmlkZWQgdGhpcwotY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZC4gIENvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZG9jdW1lbnQKLWlzIHByb2hpYml0ZWQgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIGNvbnNlbnQgb2YgdGhlIGF1dGhvci4KLQotPGhyPgotU1dJRyAxLjEgaXMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgYnkgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgdGhlCi1Vbml2ZXJpdHkgb2YgQ2FsaWZvcm5pYSBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlLgotCi08cD4KLVRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgdGhlIFJlZ2VudHMKLW9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBUaGUgZm9sbG93aW5nIHRlcm1zIGFwcGx5IHRvIGFsbAotZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2Z0d2FyZSB1bmxlc3MgZXhwbGljaXRseSBkaXNjbGFpbWVkCi1pbiBpbmRpdmlkdWFsIGZpbGVzLgotCi08cD4KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHdpdGhvdXQgd3JpdHRlbiBhZ3JlZW1lbnQgYW5kIHdpdGhvdXQKLWxpY2Vuc2Ugb3Igcm95YWx0eSBmZWVzLCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQgdGhhdCAKLSgxKSBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0d28gcGFyYWdyYXBocwotYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvdXJjZSBjb2RlIGFuZCAoMikgcmVkaXN0cmlidXRpb25zCi1pbmNsdWRpbmcgYmluYXJpZXMgcmVwcm9kdWNlcyB0aGVzZSBub3RpY2VzIGluIHRoZSBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLiAgIFN1YnN0YW50aWFsIG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBzb2Z0d2FyZSBtYXkgYmUKLWNvcHlyaWdodGVkIGJ5IHRoZWlyIGF1dGhvcnMgYW5kIG5lZWQgbm90IGZvbGxvdyB0aGUgbGljZW5zaW5nIHRlcm1zCi1kZXNjcmliZWQgaGVyZSwgcHJvdmlkZWQgdGhhdCB0aGUgbmV3IHRlcm1zIGFyZSBjbGVhcmx5IGluZGljYXRlZCBpbgotYWxsIGZpbGVzIHdoZXJlIHRoZXkgYXBwbHkuCi08cD4KLUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IsIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEsIFRIRSAKLVVOSVZFUlNJVFkgT0YgVVRBSCBPUiBESVNUUklCVVRPUlMgT0YgVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgVE8gQU5ZCi1QQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLAotRVZFTiBJRiBUSEUgQVVUSE9SUyBPUiBBTlkgT0YgVEhFIEFCT1ZFIFBBUlRJRVMgSEFWRSBCRUVOIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotPHA+Ci1USEUgQVVUSE9SLCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBLCBBTkQgVEhFIFVOSVZFUlNJVFkgT0YgVVRBSAotU1BFQ0lGSUNBTExZIERJU0NMQUlNIEFOWSBXQVJSQU5USUVTLElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAKLVRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIAotVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBIQVZFIE5PIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwKLVNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KLQotPGhyPgotPGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL3d3dy5jcy51dGFoLmVkdS9+YmVhemxleSI+IGJlYXpsZXlAY3MudXRhaC5lZHUgPC9hPiA8YnI+Ci1MYXN0IE1vZGlmaWVkLCBBdWd1c3QgMywgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0RvY3VtZW50YXRpb24uaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRG9jdW1lbnRhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2U4MzZmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRG9jdW1lbnRhdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+RG9jdW1lbnRhdGlvbiBTeXN0ZW08L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxhIG5hbWU9Im4wIj48L2E+PGgxPjUgRG9jdW1lbnRhdGlvbiBTeXN0ZW08L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5JbnRyb2R1Y3Rpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+SG93IGl0IHdvcmtzPC9hPgotPGxpPiA8YSBocmVmPSIjbjMiPkNob29zaW5nIGEgZG9jdW1lbnRhdGlvbiBmb3JtYXQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+RnVuY3Rpb24gdXNhZ2UgYW5kIGFyZ3VtZW50IG5hbWVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjUiPlRpdGxlcywgc2VjdGlvbnMsIGFuZCBzdWJzZWN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5Gb3JtYXR0aW5nPC9hPgotPGxpPiA8YSBocmVmPSIjbjciPkFkZGluZyBBZGRpdGlvbmFsIFRleHQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+RGlzYWJsaW5nIGFsbCBkb2N1bWVudGF0aW9uPC9hPgotPGxpPiA8YSBocmVmPSIjbjkiPkFuIEV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPkFTQ0lJIERvY3VtZW50YXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPkhUTUwgRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMiI+TGFUZVggRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMyI+QysrIFN1cHBvcnQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTQiPlRoZSBGaW5hbCBXb3JkPzwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb248L2gyPgotV2hpbGUgU1dJRyBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIGludGVyZmFjZXMsIGl0IGlzIG9mdGVuIGRpZmZpY3VsdCB0byBrZWVwIHRyYWNrIG9mIGFsbCBvZiB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGFuZCBvdGhlciBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIHdyYXBwZWQuIFRoaXMgZXNwZWNpYWxseSBiZWNvbWVzIGEgcHJvYmxlbSB3aGVuIHlvdXIgaW50ZXJmYWNlIHN0YXJ0cyB0byBncm93IGluIHNpemUgZnJvbSBhIGhhbmRmdWwgdG8gc2V2ZXJhbCBodW5kcmVkIGZ1bmN0aW9ucy4gVG8gYWRkcmVzcyB0aGVzZSBjb25jZXJucywgU1dJRyBjYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMgaW5jbHVkaW5nIEFTQ0lJLCBIVE1MLCBhbmQgTGFUZVguIFRoZSBnb2FsIGlzIHRoYXQgeW91IGNvdWxkIGxvb2sgYXQgdGhlIGRvY3VtZW50YXRpb24gZmlsZSB0byBzZWUgd2hhdCBmdW5jdGlvbnMgd2VyZSB3cmFwcGVkIGFuZCBob3cgdGhleSBhcmUgdXNlZCBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS48cD4KLTxwPgotVXNhZ2UgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggZGVjbGFyYXRpb24gZm91bmQgaW4gYW4gaW50ZXJmYWNlIGZpbGUuIFRoaXMgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZSBtb2R1bGUgc28gdGhlIFRjbCBtb2R1bGUgd2lsbCBmb2xsb3cgVGNsIHN5bnRheCwgdGhlIFBlcmwgbW9kdWxlIHdpbGwgdXNlIFBlcmwgc3ludGF4LCBhbmQgc28gb24uIEluIGFkZGl0aW9uLCBDL0MrKyBjb21tZW50cyBjYW4gYmUgdXNlZCB0byBhZGQgZGVzY3JpcHRpdmUgdGV4dCB0byBlYWNoIGZ1bmN0aW9uLiBDb21tZW50cyBjYW4gYmUgcHJvY2Vzc2VkIGluIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBzdHlsZXMgdG8gc3VpdCBwZXJzb25hbCBwcmVmZXJlbmNlcyBvciB0byBtYXRjaCB0aGUgc3R5bGUgdXNlZCBpbiBhIHBhcnRpY3VsYXIgaW5wdXQgZmlsZS48cD4KLTxwPgotQXV0b21hdGljIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiBmb3IgQy9DKysgcHJvZ3JhbXMgaXMgYSBmYWlybHkgZm9ybWlkYWJsZSBwcm9ibGVtIGFuZCBTV0lHIHdhcyBuZXZlciBpbnRlbmRlZCB0byBiZSBhIHN1YnN0aXR1dGUgZm9yIGEgZnVsbC1ibG93biBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4gSG93ZXZlciwgSSBmZWVsIHRoYXQgaXMgZG9lcyBhIHJlYXNvbmFibGUgam9iIG9mICBkb2N1bWVudGluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4gSXQgc2VlbXMgdG8gZG8ganVzdCBmaW5lIGZvciBtYW55IG9mIFNXSUcncyBwcmltYXJ5IGFwcGxpY2F0aW9ucy0tcmFwaWQgcHJvdG90eXBpbmcsIGRlYnVnZ2luZywgYW5kIGRldmVsb3BtZW50LjxwPgotPGEgbmFtZT0ibjIiPjwvYT48aDI+IEhvdyBpdCB3b3JrczwvaDI+Ci1Gb3IgZWFjaCBkZWNsYXJhdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZSwgU1dJRyBjcmVhdGVzIGEgIkRvY3VtZW50YXRpb24gRW50cnkuIiBUaGlzIGVudHJ5IGNvbnRhaW5zIHRocmVlIGNvbXBvbmVudHM7ICgxKSBhIHVzYWdlIHN0cmluZywgKDIpIGEgQyBpbmZvcm1hdGlvbiBzdHJpbmcsIGFuZCAoMykgZGVzY3JpcHRpdmUgdGV4dC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgdGhpcyBkZWNsYXJhdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50IGZhY3QoaW50IG4pOwotLyogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBhIGZhY3RvcmlhbCAqLwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZG9jdW1lbnRhdGlvbiBlbnRyeSBwcm9kdWNlZCBieSB0aGUgU1dJRyBBU0NJSSBtb2R1bGUgd2lsbCBsb29rIGxpa2UgdGhpcyBmb3IgVGNsOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmZhY3QgbgotCVsgcmV0dXJucyBpbnQgXQotCVRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgYSBmYWN0b3JpYWwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGZpcnN0IGxpbmUgc2hvd3MgaG93IHRvIGNhbGwgdGhlIGZ1bmN0aW9uLCB0aGUgc2Vjb25kIGxpbmUgc2hvd3Mgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmdW5jdGlvbiAocmVsYXRlZCB0byBpdHMgQyBpbXBsZW1lbnRhdGlvbiksIHdoaWxlIHRoZSB0aGlyZCBsaW5lIGNvbnRhaW5zIHRoZSBjb21tZW50IHRleHQuIFRoZSBmaXJzdCB0d28gbGluZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcgYW5kIG1heSBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlLiBGb3IgZXhhbXBsZSwgdGhlIFBlcmw1IG1vZHVsZSB3b3VsZCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIG91dHB1dCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZmFjdCgkbikKLQlbIHJldHVybnMgaW50IF0KLQlUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIGEgZmFjdG9yaWFsCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotT2YgY291cnNlLCB0aGlzIGlzIG9ubHkgYSBzaW1wbGUgZXhhbXBsZSwgbW9yZSBzb3BoaXN0aWNhdGVkIHRoaW5ncyBhcmUgcG9zc2libGUuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gQ2hvb3NpbmcgYSBkb2N1bWVudGF0aW9uIGZvcm1hdDwvaDI+Ci1UaGUgdHlwZSBvZiBkb2N1bWVudGF0aW9uIGlzIHNlbGVjdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS1kYXNjaWkJCQlQcm9kdWNlIEFTQ0lJIGRvY3VtZW50YXRpb24KLS1kaHRtbAkJCVByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uCi0tZGxhdGV4CQkJUHJvZHVjZSBMYVRlWCBkb2N1bWVudGF0aW9uCi0tZG5vbmUJCQlQcm9kdWNlIG5vIGRvY3VtZW50YXRpb24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHZhcmlvdXMgZG9jdW1lbnRhdGlvbiBtb2R1bGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGxhbmd1YWdlIG1vZHVsZXMgc28gdGhlIGV4YWN0IGNob2ljZSBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuIFdpdGggYSBsaXR0bGUgQysrIGhhY2tpbmcsIGl0IGlzIGFsc28gcG9zc2libGUgZm9yIHlvdSB0byBhZGQgeW91ciBvd24gbW9kdWxlcyB0byBTV0lHLiBGb3IgZXhhbXBsZSwgd2l0aCBhIGJpdCBvZiB3b3JrIHlvdSBjb3VsZCB0dXJuIGFsbCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBpbnRvIGFuIG9ubGluZSBoZWxwIGNvbW1hbmQgaW4geW91ciBzY3JpcHRpbmcgbGFuZ3VhZ2UuIDxwPgotPGEgbmFtZT0ibjQiPjwvYT48aDI+IEZ1bmN0aW9uIHVzYWdlIGFuZCBhcmd1bWVudCBuYW1lczwvaDI+Ci1UaGUgZnVuY3Rpb24gdXNhZ2Ugc3RyaW5nIGlzIHByb2R1Y2VkIHRvIG1hdGNoIHRoZSBkZWNsYXJhdGlvbiBnaXZlbiBpbiB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZS4gVGhlIG5hbWVzIG9mIGFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGFyZ3VtZW50IG5hbWVzLiBGb3IgZXhhbXBsZSwgdGhlIGRlY2xhcmF0aW9uczxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgaW5zZXJ0X2l0ZW0oTGlzdCAqLCBjaGFyICopOwotY2hhciAqbG9va3VwX2l0ZW0oY2hhciAqbmFtZSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXdpbGwgcHJvZHVjZSB0aGUgZm9sbG93aW5nIGRvY3VtZW50YXRpb24gKGZvciBQeXRob24pIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnNlcnRfaXRlbShMaXN0ICosIGNoYXIgKikKLQlbIHJldHVybnMgdm9pZCBdCi0KLWxvb2t1cF9pdGVtKG5hbWUpCi0JWyByZXR1cm5zIGNoYXIgKiBdCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gYXJndW1lbnQgbmFtZXMgYXJlIG9taXR0ZWQsIFNXSUcgd2lsbCB1c2UgdGhlIEMgZGF0YXR5cGVzIG9mIHRoZSBhcmd1bWVudHMgaW4gdGhlIGRvY3VtZW50YXRpb24uICAgSWYgYW4gYXJndW1lbnQgbmFtZSBpcyBzcGVjaWZpZWQsIFNXSUcgd2lsbCB1c2UgdGhhdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpbnN0ZWFkLiAgT2YgY291cnNlLCBpdCBpcyB1cCB0byBlYWNoIGxhbmd1YWdlIG1vZHVsZSB0byBjcmVhdGUgYW4gYXBwcm9wcmlhdGUgdXNhZ2Ugc3RyaW5nIHNvIHlvdXIgcmVzdWx0cyBtYXkgdmFyeSBkZXBlbmRpbmcgb24gaG93IHRoaW5ncyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gZWFjaCBtb2R1bGUuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gVGl0bGVzLCBzZWN0aW9ucywgYW5kIHN1YnNlY3Rpb25zPC9oMj4KLVRoZSBTV0lHIGRvY3VtZW50YXRpb24gc3lzdGVtIGlzIGhpZXJhcmNoaWNhbCBpbiBuYXR1cmUgYW5kIGlzIG9yZ2FuaXplZCBpbnRvIGEgY29sbGVjdGlvbiBvZiBzZWN0aW9ucywgc3Vic2VjdGlvbnMsIHN1YnN1YnNlY3Rpb25zLCBhbmQgc28gb24uIFRoZSBmb2xsb3dpbmcgU1dJRyBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIG9yZ2FuaXplIGFuIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPHVsPgotPGxpPjx0dD4ldGl0bGUgIlRpdGxlIFRleHQiPC90dD4uIFNldCB0aGUgZG9jdW1lbnRhdGlvbiB0aXRsZSAobWF5IG9ubHkgYmUgdXNlZCBvbmNlKQotPGxpPjx0dD4lc2VjdGlvbiAiU2VjdGlvbiB0aXRsZSI8L3R0Pi4gU3RhcnQgYSBuZXcgc2VjdGlvbi4KLTxsaT48dHQ+JXN1YnNlY3Rpb24gIlN1YnNlY3Rpb24gdGl0bGUiPC90dD4uIENyZWF0ZSBhIG5ldyBzdWJzZWN0aW9uLgotPGxpPjx0dD4lc3Vic3Vic2VjdGlvbiAiU3Vic3Vic2VjdGlvbiB0aXRsZSI8L3R0Pi4gQ3JlYXRlIGEgbmV3IHN1YnN1YnNlY3Rpb24uCi08L3VsPgotPHA+Ci1UaGUgPHR0PiV0aXRsZTwvdHQ+IGRpcmVjdGl2ZSBzaG91bGQgYmUgcGxhY2VkIHByaW9yIHRvIHRoZSBmaXJzdCBkZWNsYXJhdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZSBhbmQgbWF5IG9ubHkgYmUgdXNlZCBvbmNlIChzdWJzZXF1ZW50IG9jY3VycmVuY2VzIHdpbGwgc2ltcGx5IGJlIGlnbm9yZWQpLiBUaGUgc2VjdGlvbiBkaXJlY3RpdmVzIG1heSBiZSBwbGFjZWQgYW55d2hlcmUuIEhvd2V2ZXIsIDx0dD4lc3Vic2VjdGlvbjwvdHQ+IGNhbiBvbmx5IGJlIHVzZWQgYWZ0ZXIgYSA8dHQ+JXNlY3Rpb248L3R0PiBkaXJlY3RpdmUgYW5kIDx0dD4lc3Vic3Vic2VjdGlvbjwvdHQ+IGNhbiBvbmx5IGJlIHVzZWQgYWZ0ZXIgYSA8dHQ+JXN1YnNlY3Rpb248L3R0PiBkaXJlY3RpdmUuPHA+Ci08cD4KLVdpdGggdGhlIG9yZ2FuaXphdGlvbiBkaXJlY3RpdmVzLCBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXRpdGxlICJFeGFtcGxlIEludGVyZmFjZSBGaWxlIgotJW1vZHVsZSBleGFtcGxlCi0lewotI2luY2x1ZGUgIm15X2hlYWRlci5oIgotJX0KLQotJXNlY3Rpb24gIk1hdGhlbWF0aWNhbCBGdW5jdGlvbnMiCi0KLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0KLSVzZWN0aW9uICJHcmFwaGljcyIKLSVzdWJzZWN0aW9uICIyRCBQbG90dGluZyIKLS4uLiBEZWNsYXJhdGlvbnMgLi4uCi0lc3Vic2VjdGlvbiAiM0QgUGxvdHRpbmciCi0lc3Vic3Vic2VjdGlvbiAiVmlld2luZyB0cmFuc2Zvcm1hdGlvbnMiCi0uLi4gRGVjbGFyYXRpb25zIC4uLgotJXN1YnN1YnNlY3Rpb24gIkxpZ2h0aW5nIgotLi4uIERlY2xhcmF0aW9ucyAuLi4KLSVzdWJzdWJzZWN0aW9uICJQcmltaXRpdmVzIgotLi4uIERlY2xhcmF0aW9ucyAuLi4KLQotJXNlY3Rpb24gIkZpbGUgSS9PIgotCi0uLi4gRGVjbGFyYXRpb25zIC4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjYiPjwvYT48aDI+IEZvcm1hdHRpbmc8L2gyPgotRG9jdW1lbnRhdGlvbiB0ZXh0IGNhbiBiZSBzb3J0ZWQsIGNob3BwZWQsIHNsaWNlZCwgYW5kIGRpY2VkIGluIGEgdmFyaWV0eSBvZiB3YXlzLiBGb3JtYXR0aW5nIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCB1c2luZyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYWZ0ZXIgdGhlIDx0dD4ldGl0bGU8L3R0PiwgPHR0PiVzZWN0aW9uPC90dD4sIDx0dD4lc3Vic2VjdGlvbjwvdHQ+LCBvciA8dHQ+JXN1YnN1YnNlY3Rpb248L3R0PiBkaXJlY3RpdmVzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXRpdGxlICJNeSBEb2N1bWVudGF0aW9uIiwgc29ydCwgYmVmb3JlLCBwcmUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB0ZWxscyBTV0lHIHRvIHNvcnQgYWxsIG9mIHRoZSBkb2N1bWVudGF0aW9uLCB1c2UgY29tbWVudHMgdGhhdCBhcmUgYmVmb3JlIGVhY2ggZGVjbGFyYXRpb24sIGFuZCBhc3N1bWUgdGhhdCB0ZXh0IGlzIHByZWZvcm1hdHRlZC4gVGhlc2UgZm9ybWF0dGluZyBkaXJlY3RpdmVzIGFyZSBhcHBsaWVkIHRvIGFsbCBjaGlsZHJlbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiB0cmVlLS1pbiB0aGlzIGNhc2UsIGV2ZXJ5dGhpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUuPHA+Ci08cD4KLUlmIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkIGZvciBhIHNlY3Rpb24gbGlrZSB0aGlzPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXN1YnNlY3Rpb24gIjNEIEdyYXBoaWNzIiwgbm9zb3J0LCBhZnRlcgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci10aGVuIHRoZSBlZmZlY3Qgd2lsbCBvbmx5IGFwcGx5IHRvIHRoYXQgcGFydGljdWxhciBzZWN0aW9uIChhbmQgYWxsIG9mIGl0cyBzdWJzZWN0aW9ucykuIEluIHRoaXMgY2FzZSwgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1YnNlY3Rpb24gd291bGQgb3ZlcnJpZGUgYW55IHByZXZpb3VzIGZvcm1hdHRpbmcsIGJ1dCB0aGVzZSBjaGFuZ2VzIHdvdWxkIG9ubHkgYXBwbHkgdG8gdGhpcyBzdWJzZWN0aW9uLiBUaGUgbmV4dCBzdWJzZWN0aW9uIGNvdWxkIHVzZSBpdHMgb3duIGZvcm1hdHRpbmcgb3IgdGhhdCBvZiBpdHMgcGFyZW50LjxwPgotPHA+Ci1TdHlsZSBwYXJhbWV0ZXJzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgPHR0PiVzdHlsZTwvdHQ+IGFuZCA8dHQ+JWxvY2Fsc3R5bGU8L3R0PiBwYXJhbWV0ZXJzLiBUaGUgPHR0PiVzdHlsZTwvdHQ+IGRpcmVjdGl2ZSBhcHBsaWVzIGEgbmV3IGZvcm1hdCB0byB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBhbGwgb2YgaXRzIHBhcmVudHMuIFRoZSA8dHQ+JWxvY2Fsc3R5bGU8L3R0PiBkaXJlY3RpdmUgYXBwbGllcyBhIG5ldyBmb3JtYXQgdG8gdGhlIGN1cnJlbnQgc2VjdGlvbi4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVzdHlsZSBzb3J0LGJlZm9yZSwgc2tpcD0xICAgICAgIyBBcHBseSB0aGVzZSBmb3JtYXRzIGV2ZXJ5d2hlcmUKLSVsb2NhbHN0eWxlIHNvcnQgICAgICAgICAgICAgICAgIyBBcHBseSB0aGlzIGZvcm1hdCB0byB0aGUgY3VycmVudCBzZWN0aW9uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVVzZSBvZiB0aGVzZSBkaXJlY3RpdmVzIHVzdWFsbHkgaXNuJ3QgcmVxdWlyZWQgc2luY2UgaXQncyBlYXN5IGVub3VnaCB0byBzaW1wbHkgc3BlY2lmeSB0aGUgaW5mb3JtYXRpb24gYWZ0ZXIgZWFjaCBzZWN0aW9uLjxwPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgzPiBEZWZhdWx0IEZvcm1hdHRpbmc8L2gzPgotQnkgZGVmYXVsdCwgU1dJRyB3aWxsIHJlZm9ybWF0IGNvbW1lbnQgdGV4dCwgcHJvZHVjZSBkb2N1bWVudGF0aW9uIGluIHRoZSBvcmRlciBlbmNvdW50ZXJlZCBpbiBhbiBpbnRlcmZhY2UgZmlsZSAobm9zb3J0KSwgYW5kIGFubm90YXRlIGRlc2NyaXB0aW9ucyB3aXRoIGEgQyBpbmZvcm1hdGlvbiBzdHJpbmcuICAgVGhpcyBiZWhhdmlvciBtb3N0IGNsb3NlbHkgbWF0Y2hlcyB0aGF0IHVzZWQgaW4gU1dJRyAxLjAsIGFsdGhvdWdoIGl0IGlzIG5vdCBhbiBleGFjdCBtYXRjaCBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gdGhlIG9sZCBkb2N1bWVudGF0aW9uIHN5c3RlbS48cD4KLTxwPgotV2hlbiB1c2VkIGluIHRoZSBkZWZhdWx0IG1vZGUsIGNvbW1lbnQgdGV4dCBtYXkgY29udGFpbiBkb2N1bWVudGF0aW9uIHNwZWNpZmljIGZvcm1hdHRpbmcgbWFya3VwLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGVtYmVkIExhVGVYIG9yIEhUTUwgbWFya3VwIGluIGNvbW1lbnRzIHRvIGhhdmUgcHJlY2lzZSBjb250cm9sIG92ZXIgdGhlIGxvb2sgb2YgdGhlIGZpbmFsIGRvY3VtZW50LjxwPgotPGEgbmFtZT0ibjE2Ij48L2E+PGgzPiBDb21tZW50IEZvcm1hdHRpbmcgdmFyaWFibGVzPC9oMz4KLVRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgY2FuIGJlIGNoYW5nZWQgYnkgY2hhbmdpbmcgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXR0aW5nIHZhcmlhYmxlcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotYWZ0ZXIgICAgICAgICAgICAgICAgIFVzZSBjb21tZW50cyBhZnRlciBhIGRlY2xhcmF0aW9uIChkZWZhdWx0KQotYmVmb3JlICAgICAgICAgICAgICAgIFVzZSBjb21tZW50cyBiZWZvcmUgYSBkZWNsYXJhdGlvbgotY2hvcF90b3A9bmxpbmVzICAgICAgIENvbW1lbnQgY2hvcHBpbmcgKHByZWZvcm1hdHRlZCkKLWNob3BfYm90dG9tPW5saW5lcyAgICBDb21tZW50IGNob3BwaW5nIChwcmVmb3JtYXR0ZWQpCi1jaG9wX2xlZnQ9bmNoYXIgICAgICAgQ29tbWVudCBjaG9wcGluZyAocHJlZm9ybWF0dGVkKQotY2hvcF9yaWdodD1uY2hhciAgICAgIENvbW1lbnQgY2hvcHBpbmcgKHByZWZvcm1hdHRlZCkKLWZvcm1hdCAgICAgICAgICAgICAgICBBbGxvdyBTV0lHIHRvIHJlZm9ybWF0IHRleHQgKHRoZSBkZWZhdWx0KQotaWdub3JlICAgICAgICAgICAgICAgIElnbm9yZSBjb21tZW50cwotaW5mbyAgICAgICAgICAgICAgICAgIFByaW50IEMgaW5mb3JtYXRpb24gdGV4dCAoZGVmYXVsdCkKLWtlZXAgICAgICAgICAgICAgICAgICBLZWVwIGNvbW1lbnRzIChvcHBvc2l0ZSBvZiBpZ25vcmUpCi1ub2luZm8gICAgICAgICAgICAgICAgRG9uJ3QgcHJpbnQgQyBpbmZvcm1hdGlvbiB0ZXh0Ci1ub3NvcnQgICAgICAgICAgICAgICAgRG9uJ3Qgc29ydCBkb2N1bWVudGF0aW9uIChkZWZhdWx0KQotcHJlICAgICAgICAgICAgICAgICAgIEFzc3VtZSB0ZXh0IGlzIHByZWZvcm1hdHRlZAotc2tpcD1ubGluZXMgICAgICAgICAgIE51bWJlciBvZiBibGFuayBsaW5lcyBiZXR3ZWVuIGNvbW1lbnQgYW5kIGRlY2xhcmF0aW9uCi1zb3J0ICAgICAgICAgICAgICAgICAgU29ydCBkb2N1bWVudGF0aW9uCi10YWJpZnkgICAgICAgICAgICAgICAgTGVhdmUgdGFicyBpbnRhY3QKLXVudGFiaWZ5ICAgICAgICAgICAgICBDb252ZXJ0IHRhYnMgdG8gc3BhY2VzIChkZWZhdWx0KQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Nb3JlIHZhcmlhYmxlcyBtYXkgYmUgYXZhaWxhYmxlIGRlcGVuZGluZyBvbiBwYXJ0aWN1bGFyIGRvY3VtZW50YXRpb24gbW9kdWxlcy4gVGhlIHVzZSBvZiB0aGVzZSB2YXJpYWJsZXMgaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IGZldyBzZWN0aW9ucy48cD4KLTxhIG5hbWU9Im4xNyI+PC9hPjxoMz4gU29ydGluZyA8L2gzPgotRG9jdW1lbnRhdGlvbiBjYW4gYmUgc29ydGVkIHVzaW5nIHRoZSBgPHR0PnNvcnQ8L3R0PicgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXRpdGxlICJNeSBpbnRlcmZhY2UiLHNvcnQKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB1c2VkLCBhbGwgZG9jdW1lbnRhdGlvbiBlbnRyaWVzLCBpbmNsdWRpbmcgc2VjdGlvbnMgd2lsbCBiZSBhbHBoYWJldGljYWxseSBzb3J0ZWQuIFNvcnRpbmcgY2FuIGJlIGRpc2FibGVkIGluIHBhcnRpY3VsYXIgc2VjdGlvbnMgYW5kIHN1YnNlY3Rpb24gYnkgc3BlY2lmeWluZyB0aGUgYDx0dD5ub3NvcnQ8L3R0PicgcGFyYW1ldGVyIGluIGEgc2VjdGlvbiBkZWNsYXJhdGlvbi4gQnkgZGVmYXVsdCwgU1dJRyBkb2VzIG5vdCBzb3J0IGRvY3VtZW50YXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCBpdCByZWFsbHkgb25seSBjb21lcyBpbiBoYW5keSBpZiB5b3UgaGF2ZSBhIHJlYWxseSBtZXNzeSBpbnRlcmZhY2UgZmlsZS48cD4KLTxwPgotRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3J0aW5nLiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lYWxwaGEgCQlTb3J0IGRvY3VtZW50YXRpb24gYWxwaGFiZXRpY2FsbHkgKG9ic29sZXRlKQotJXJhdwkJS2VlcCBkb2N1bWVudGF0aW9uIGluIG9yZGVyIChvYnNvbGV0ZSkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlc2UgZGlyZWN0aXZlcyBvbmx5IGFwcGx5IGdsb2JhbGx5IGFuZCBzaG91bGQgbmVhciB0aGUgYmVnaW5uaW5nIG9mIGZpbGUuIEZ1dHVyZSBzdXBwb3J0IG9mIHRoZXNlIGRpcmVjdGl2ZXMgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGdlbmVyYWxseSBkaXNjb3VyYWdlZC48cD4KLTxhIG5hbWU9Im4xOCI+PC9hPjxoMz4gQ29tbWVudCBwbGFjZW1lbnQgYW5kIGZvcm1hdHRpbmc8L2gzPgotQ29tbWVudHMgbWF5IGJlIHBsYWNlZCBiZWZvcmUgb3IgYWZ0ZXIgYSBkZWNsYXJhdGlvbi4gVGhpcyBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGA8dHQ+YmVmb3JlPC90dD4nIGFuZCBgPHR0PmFmdGVyPC90dD4nIHBhcmFtZXRlcnMuICAgIFRoZSBzcGFjZSBiZXR3ZWVuIGEgY29tbWVudCBhbmQgYSBkZWNsYXJhdGlvbiBjYW4gYmUgc2V0IGJ5IGNoYW5naW5nIHRoZSBgPHR0PnNraXA8L3R0PicgcGFyYW1ldGVyLiAgQnkgZGVmYXVsdCwgPHR0PnNraXA9MTwvdHQ+LCBpbmRpY2F0aW5nIHRoYXQgYSBjb21tZW50IGFuZCBkZWNsYXJhdGlvbiBtdXN0IGJlIG9uIGFkamFjZW50IGxpbmVzLiAgICBVc2Ugb2YgdGhlIDx0dD5za2lwPC90dD4gcGFyYW1ldGVyIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgdG8gaWdub3JlIGNvbW1lbnRzIHRoYXQgYXJlIHRvbyBmYXIgYXdheSBhbmQgcG9zc2libHkgdW5yZWxhdGVkIHRvIGEgZGVjbGFyYXRpb24uPHA+Ci08cD4KLUJ5IGRlZmF1bHQsIFNXSUcgcmVmb3JtYXRzIHRoZSB0ZXh0IGZvdW5kIGluIGEgY29tbWVudC4gICBIb3dldmVyLCBpbiBtYW55IGNhc2VzLCB5b3VyIGZpbGUgbWF5IGhhdmUgcHJlZm9ybWF0dGVkIGNvbW1lbnRzIG9yIGNvbW1lbnQgYmxvY2tzLiAgIFRvIGhhbmRsZSBzdWNoIGNvbW1lbnRzIGNvcnJlY3RseSwgeW91IGNhbiB1c2UgcHJlZm9ybWF0dGVkIG1vZGUuICBUaGlzIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgYHByZScgcGFyYW1ldGVyIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVzZWN0aW9uICJQcmVmb3JtYXR0ZWQgU2VjdGlvbiIscHJlCi0lc2VjdGlvbiAiUmVmb3JtYXR0ZWQgU2VjdGlvbiIsIGZvcm1hdAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbGwgZGVjbGFyYXRpb25zIGluIHRoaXMgc2VjdGlvbiB3aWxsIG5vdyBiZSBhc3N1bWVkIHRvIGhhdmUgcHJlZm9ybWF0dGVkIGNvbW1lbnRzLiAgIFdoZW4gdXNpbmcgdGhlIHByZWZvcm1hdCBtb2RlLCBhIHZhcmlldHkgb2Ygb3RoZXIgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbSA6PHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDUuMS5wbmciPjwvY2VudGVyPgotCi0uPHA+Ci08cD4KLVRoZSBjaG9wcGluZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIHN0cmlwIG91dCB0aGUgdGV4dCBvZiBibG9jayBjb21tZW50cy4gIEZvciBleGFtcGxlLCB1c2luZyA8dHQ+Y2hvcF9sZWZ0PTM8L3R0PiwgPHR0PmNob3BfdG9wPTE8L3R0PiwgPHR0PmNob3BfYm90dG9tPTE8L3R0PiBvbiB0aGUgYWJvdmUgY29tbWVudCBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIG91dHB1dCA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotUGxvdDJEX2xpbmUgeDEgeTEgeDIgeTIgY29sb3IKLQlbIHJldHVybnMgdm9pZCBdCi0Jdm9pZCBQbG90MkRfbGluZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIFBpeGVsIGNvbG9yKSAgCi0KLQlEcmF3cyBhIGxpbmUgYmV0d2VlbiB0aGUgcG9pbnRzICh4MSx5MSkgYW5kICh4Mix5MikgdXNpbmcgdGhlIAotCXRoZSBnaXZlbiBjb2xvci4gICBUaGUgbGluZSBpcyBjcm9wcGVkIHRvIGZpdCBpbiB0aGUgY3VycmVudCAgCi0JYm91bmRpbmcgYm94LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQlVc2VzIHRoZSBCcmVzZW5oYW0gbGluZSBkcmF3aW5nIGFsZ29yaXRobS4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGNob3BwaW5nIHBhcmFtZXRlcnMgb25seSBhcHBseSBpZiBhIGNvbW1lbnQgaXMgc3VmZmljaWVudGx5IGxhcmdlIChpLmUuLiBpZiB0aGUgbnVtYmVyIG9mIGxpbmVzIGV4Y2VlZCA8dHQ+Y2hvcF90b3A8L3R0Pis8dHQ+Y2hvcF9ib3R0b208L3R0PikuICAgVGh1cywgaW4gb3VyIGV4YW1wbGUsIGEgb25lIGxpbmUgY29tbWVudCB3aWxsIGJlIHVuYWx0ZXJlZCBldmVuIHRob3VnaCBjaG9wcGluZyBoYXMgYmVlbiBzZXQuICAgQnkgZGVmYXVsdCwgU1dJRyBzZXRzIGNob3BfbGVmdD0zIGFuZCBhbGwgb3RoZXJzIHRvIHplcm8uICAgVGhpcyBzZXR0aW5nIHJlbW92ZXMgdGhlICBgPHR0Pi8qIDwvdHQ+YCBvciBgPHR0Pi8vIDwvdHQ+YCBwcmVjZWVkaW5nIGEgY29tbWVudC48cD4KLTxhIG5hbWU9Im4xOSI+PC9hPjxoMz4gVGFicyBhbmQgb3RoZXIgYW5ub3lhbmNlczwvaDM+Ci1XaGVuIHVzaW5nIHRoZSBwcmVmb3JtYXR0ZWQgbW9kZSwgU1dJRyB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCB0YWJzIHRvIHdoaXRlIHNwYWNlLiAgVGhpcyBpcyBkb25lIGFzc3VtaW5nIHRoYXQgdGFicyBhcmUgcGxhY2VkIGV2ZXJ5IDggY2hhcmFjdGVycy4gICBUaGUgdGFiaWZpY2F0aW9uIG1vZGUgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIHRoZSBgdGFiaWZ5JyBhbmQgYHVudGFiaWZ5JyBwYXJhbWV0ZXJzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lc2VjdGlvbiAiVW50YWJpZmllZCBTZWN0aW9uIix1bnRhYmlmeQotJXNlY3Rpb24gIkxlYXZlIHRob3NlIHRhYnMgYWxvbmUiLCB0YWJpZnkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGFicyBhcmUgc2ltcGx5IGlnbm9yZWQgd2hlbiBjb21tZW50cyBhcmUgcmVmb3JtYXR0ZWQgKHdlbGwsIGFjdHVhbGx5LCB0aGV5J3JlIGp1c3QgY29waWVkIGludG8gdGhlIG91dHB1dCwgYnV0IHRoZSB0YXJnZXQgZG9jdW1lbnRhdGlvbiBtZXRob2Qgd2lsbCBpZ25vcmUgdGhlbSkuPHA+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IElnbm9yaW5nIGNvbW1lbnRzPC9oMz4KLVRvIGlnbm9yZSB0aGUgY29tbWVudHMgaW4gYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIHlvdSBjYW4gdXNlIHRoZSBgaWdub3JlJyBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXNlY3Rpb24gIk5vIENvbW1lbnRzIiwgaWdub3JlCi0lc2VjdGlvbiAiS2VlcCBDb21tZW50cyIsIGtlZXAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGA8dHQ+a2VlcDwvdHQ+JyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBkaXNhYmxlIHRoZSBlZmZlY3Qgb2YgYW4gaWdub3JlIHBhcmFtZXRlciAoaWYgc2V0IGJ5IGEgc2VjdGlvbidzIHBhcmVudCkuPHA+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IEMgSW5mb3JtYXRpb248L2gzPgotTm9ybWFsbHksIGVhY2ggZGVjbGFyYXRpb24gaW4gYSBmaWxlIHdpbGwgaGF2ZSBhIEMgaW5mb3JtYXRpb24gdGFnIGF0dGFjaGVkIHRvIGl0LiAgVGhpcyBpcyB1c3VhbGx5IGVuY2xvc2VkIGluIFsgXSBhbmQgY29udGFpbnMgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gYWxvbmcgd2l0aCBvdGhlciBpbmZvcm1hdGlvbi4gICBUaGlzIHRleHQgY2FuIGRpc2FibGVkIHVzaW5nIHRoZSBgbm9pbmZvJyBwYXJhbWV0ZXJzIGFuZCByZWVuYWJsZWQgdXNpbmcgdGhlIGBpbmZvJyBwYXJhbWV0ZXIuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXNlY3Rpb24gIk5vIEMgSW5mb3JtYXRpb24iLCBub2luZm8KLSVzZWN0aW9uICJQcmludCBDIEluZm9ybWF0aW9uIiwgaW5mbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gQWRkaW5nIEFkZGl0aW9uYWwgVGV4dDwvaDI+Ci1BZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCBjYW4gYmUgYWRkZWQgdXNpbmcgdGhlIDx0dD4ldGV4dDwvdHQ+IGRpcmVjdGl2ZSBhcyBzaG93biA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PiV0ZXh0ICV7Ci08L3R0PgotVGhpcyBpcyBzb21lIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiB0ZXh0LgotCi0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PiV0ZXh0PC90dD4gZGlyZWN0aXZlIGlzIHByaW1hcmlseSB1c2VkIHRvIGFkZCB0ZXh0IHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcGFydGljdWxhciBkZWNsYXJhdGlvbi4gICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvIHByb3ZpZGUgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIGEgbW9kdWxlIGJlZm9yZSBkZWZpbmluZyBhbGwgb2YgdGhlIGZ1bmN0aW9ucy4gICBBbnkgdGV4dCBjYW4gYmUgcGxhY2VkIGluc2lkZSB0aGUgPHR0PiV7LCV9PC90dD4gYmxvY2sgZXhjZXB0IGZvciBhIGA8dHQ+JX08L3R0PicgdGhhdCBlbmRzIHRoZSBibG9jay4gRm9yIHRoZSBwdXJwb3NlcyBvZiBzb3J0aW5nLCB0ZXh0IHNlZ21lbnRzIHdpbGwgYWx3YXlzIGFwcGVhciBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24uPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gRGlzYWJsaW5nIGFsbCBkb2N1bWVudGF0aW9uPC9oMj4KLUFsbCBkb2N1bWVudGF0aW9uIGNhbiBiZSBzdXBwcmVzc2VkIGZvciBhIHBvcnRpb24gb2YgYW4gaW50ZXJmYWNlIGZpbGUgYnkgdXNpbmcgdGhlIDx0dD4lZGlzYWJsZWRvYzwvdHQ+IGFuZCA8dHQ+JWVuYWJsZWRvYyA8L3R0PmRpcmVjdGl2ZXMuICAgVGhlc2Ugd291bGQgYmUgdXNlZCBhcyBmb2xsb3dzOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVkaXNhYmxlZG9jCi0uLi4gQSBhIGJ1bmNoIG9mIGRlY2xhcmF0aW9ucyB3aXRoIG5vIGRvY3VtZW50YXRpb24gLi4uCi0lZW5hYmxlZG9jCi0uLi4gTm93IGRlY2xhcmF0aW9ucyBhcmUgZG9jdW1lbnRlZCBhZ2FpbiAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlc2UgZGlyZWN0aXZlcyBjYW4gYmUgc2FmZWx5IG5lc3RlZC4gIFRodXMsIHRoZSBvY2N1cnJlbmNlIG9mIHRoZXNlIGRpcmVjdGl2ZXMgaW5zaWRlIGEgPHR0PiVkaXNhYmxlZG9jIDwvdHQ+c2VjdGlvbiBoYXMgbm8gZWZmZWN0IChvbmx5IHRoZSBvdXRlci1tb3N0IG9jY3VycmVuY2UgaXMgaW1wb3J0YW50KS48cD4KLTxwPgotVGhlIHByaW1hcnkgdXNlIG9mIHRoZXNlIGRpcmVjdGl2ZXMgaXMgZm9yIGRpc2FibGluZyB0aGUgZG9jdW1lbnRhdGlvbiBvbiBjb21tb25seSB1c2VkIG1vZHVsZXMgdGhhdCB5b3UgbWlnaHQgdXNlIHJlcGVhdGVkbHkgKGJ1dCBkb24ndCB3YW50IGFueSBkb2N1bWVudGF0aW9uIGZvcikuICBGb3IgZXhhbXBsZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJWRpc2FibGVkb2MKLSVpbmNsdWRlIHdpc2guaQotJWluY2x1ZGUgYXJyYXkuaQotJWluY2x1ZGUgdGltZXIuaQotJWVuYWJsZWRvYwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBBbiBFeGFtcGxlPC9oMj4KLVRvIGlsbHVzdHJhdGUgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGluIGFjdGlvbiwgaGVyZSBpcyBzb21lIGNvZGUgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGZpbGUgYGFycmF5LmknLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vCi0vLyBhcnJheS5pCi0vLyBUaGlzIFNXSUcgbGlicmFyeSBmaWxlIHByb3ZpZGVzIGFjY2VzcyB0byBDIGFycmF5cy4KLQotJW1vZHVsZSBjYXJyYXkKLQotJXNlY3Rpb24gIlNXSUcgQyBBcnJheSBNb2R1bGUiLGluZm8sYWZ0ZXIscHJlLG5vc29ydCxza2lwPTEsY2hvcF9sZWZ0PTMsCi1jaG9wX3JpZ2h0PTAsY2hvcF90b3A9MCxjaG9wX2JvdHRvbT0wCi0KLSV0ZXh0ICV7Ci0laW5jbHVkZSBhcnJheS5pCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHNjcmlwdGluZyBsYW5ndWFnZSBhY2Nlc3MgdG8gdmFyaW91cyBraW5kcyBvZiBDL0MrKwotYXJyYXlzLiBGb3IgZWFjaCBkYXRhdHlwZSwgYSBjb2xsZWN0aW9uIG9mIGZvdXIgZnVuY3Rpb25zIGFyZSBjcmVhdGVkIDoKLQotICAgJmx0O3R5cGUmZ3Q7X2FycmF5KHNpemUpICAgICAgICAgICAgICA6IENyZWF0ZSBhIG5ldyBhcnJheSBvZiBnaXZlbiBzaXplCi0gICAmbHQ7dHlwZSZndDtfZ2V0KGFycmF5LCBpbmRleCkgICAgICAgIDogR2V0IGFuIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkKLSAgICZsdDt0eXBlJmd0O19zZXQoYXJyYXksIGluZGV4LCB2YWx1ZSkgOiBTZXQgYW4gZWxlbWVudCBpbiB0aGUgYXJyYXkKLSAgICZsdDt0eXBlJmd0O19kZXN0cm95KGFycmF5KSAgICAgICAgICAgOiBEZXN0cm95IGFuIGFycmF5Ci0KLVRoZSBmdW5jdGlvbnMgaW4gdGhpcyBsaWJyYXJ5IGFyZSBvbmx5IGxvdy1sZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMKLWRlc2lnbmVkIHRvIGRpcmVjdGx5IGFjY2VzcyBDIGFycmF5cy4gIExpa2UgQywgbm8gYm91bmRzIGNoZWNraW5nIGlzCi1wZXJmb3JtZWQgc28gdXNlIGF0IHlvdXIgb3duIHBlcmlsLgotJX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEludGVnZXIgYXJyYXkgc3VwcG9ydAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJXN1YnNlY3Rpb24gIkludGVnZXIgQXJyYXlzIgotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gaW50ZWdlciBhcnJheXMgKG1hcHBlZAotICAgb250byB0aGUgQyAnaW50JyBkYXRhdHlwZS4gKi8KLQotJXsKLQkuLi4gU3VwcG9ydGluZyBDIGNvZGUgLi4uCi0lfQotaW50ICppbnRfYXJyYXkoaW50IG5pdGVtcyk7Ci0vKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIGludGVnZXJzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICBUaGUgYXJyYXkgaXMgY3JlYXRlZCB1c2luZyBtYWxsb2MoKSBpbiBDIGFuZCBuZXcoKSBpbiBDKysuICovCi0KLXZvaWQgaW50X2Rlc3Ryb3koaW50ICphcnJheSk7Ci0vKiBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuICovCi0KLWludCBpbnRfZ2V0KGludCAqYXJyYXksIGludCBpbmRleCk7Ci0vKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhcnJheVtpbmRleF0uICovCi0KLWludCBpbnRfc2V0KGludCAqYXJyYXksIGludCBpbmRleCwgaW50IHZhbHVlKTsKLS8qIFNldHMgYXJyYXlbaW5kZXhdID0gdmFsdWUuICBSZXR1cm5zIHZhbHVlLiAqLwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmxvYXRpbmcgcG9pbnQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSVzdWJzZWN0aW9uICJGbG9hdGluZyBQb2ludCBBcnJheXMiCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBwcm92aWRlIGFjY2VzcyB0byBhcnJheXMgb2YgZmxvYXRzIGFuZCBkb3VibGVzLiAqLwotCi0lewotCS4uIFN1cHBvcnRpbmcgQyBjb2RlIC4uLgotJX0KLWRvdWJsZSAqZG91YmxlX2FycmF5KGludCBuaXRlbXMpOwotLyogQ3JlYXRlcyBhIG5ldyBhcnJheSBvZiBkb3VibGVzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICBUaGUgYXJyYXkgaXMgY3JlYXRlZCB1c2luZyBtYWxsb2MoKSBpbiBDIGFuZCBuZXcoKSBpbiBDKysuICovCi0KLXZvaWQgZG91YmxlX2Rlc3Ryb3koZG91YmxlICphcnJheSk7Ci0vKiBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuICovCi0KLWRvdWJsZSBkb3VibGVfZ2V0KGRvdWJsZSAqYXJyYXksIGludCBpbmRleCk7Ci0vKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhcnJheVtpbmRleF0uICovCi0KLWRvdWJsZSBkb3VibGVfc2V0KGRvdWJsZSAqYXJyYXksIGludCBpbmRleCwgZG91YmxlIHZhbHVlKTsKLS8qIFNldHMgYXJyYXlbaW5kZXhdID0gdmFsdWUuICBSZXR1cm5zIHZhbHVlLiAqLwotCi1mbG9hdCAqZmxvYXRfYXJyYXkoaW50IG5pdGVtcyk7Ci0vKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIGZsb2F0cy4gbml0ZW1zIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgVGhlIGFycmF5IGlzIGNyZWF0ZWQgdXNpbmcgbWFsbG9jKCkgaW4gQyBhbmQgbmV3KCkgaW4gQysrLiAqLwotCi12b2lkIGZsb2F0X2Rlc3Ryb3koZmxvYXQgKmFycmF5KTsKLS8qIERlc3Ryb3lzIHRoZSBnaXZlbiBhcnJheS4gKi8KLQotZmxvYXQgZmxvYXRfZ2V0KGZsb2F0ICphcnJheSwgaW50IGluZGV4KTsKLS8qIFJldHVybnMgdGhlIHZhbHVlIG9mIGFycmF5W2luZGV4XS4gKi8KLQotZmxvYXQgZmxvYXRfc2V0KGZsb2F0ICphcnJheSwgaW50IGluZGV4LCBmbG9hdCB2YWx1ZSk7Ci0vKiBTZXRzIGFycmF5W2luZGV4XSA9IHZhbHVlLiAgUmV0dXJucyB2YWx1ZS4gKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENoYXJhY3RlciBzdHJpbmdzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lc3Vic2VjdGlvbiAiU3RyaW5nIEFycmF5cyIKLQotJXRleHQgJXsKLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlICdjaGFyICoqJyBkYXRhdHlwZS4gICBUaGlzCi1pcyBwcmltYXJpbHkgdXNlZCB0byBoYW5kbGUgYXJndW1lbnQgbGlzdHMgYW5kIG90aGVyIHNpbWlsYXIgc3RydWN0dXJlcyB0aGF0Ci1uZWVkIHRvIGJlIHBhc3NlZCB0byBhIEMvQysrIGZ1bmN0aW9uLgotJX0KLQotI2lmIGRlZmluZWQoU1dJR1RDTCkKLSV0ZXh0ICV7Ci1UbyBjb252ZXJ0IGZyb20gYSBUY2wgbGlzdCBpbnRvIGEgJ2NoYXIgKionLCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgOgotCi0gICAgICMgJGxpc3QgaXMgYSBsaXN0Ci0gICAgIHNldCBhcmdzIFtzdHJpbmdfYXJyYXkgZXhwciB7W2xsZW5ndGggJGxpc3RdICsgMX1dCi0gICAgIHNldCBpIDAKLSAgICAgZm9yZWFjaCBhICRsaXN0IHsKLSAgICAgICAgc3RyaW5nX3NldCAkYXJncyAkaSAkYQotICAgICAgICBpbmNyIGkgMQotICAgICB9Ci0gICAgIHN0cmluZ19zZXQgJGkgIiIKLSAgICAgIyAkYXJncyBpcyBub3cgYSBjaGFyICoqIHR5cGUKLSV9Ci0jZWxpZiBkZWZpbmVkKFNXSUdQRVJMKQotCi0ldGV4dCAlewotVG8gY29udmVydCBmcm9tIGEgUGVybCBsaXN0IGludG8gYSAnY2hhciAqKicsIGNvZGUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nCi1jYW4gYmUgdXNlZCA6Ci0KLSAgICAjIEBsaXN0IGlzIGEgbGlzdAotICAgIG15ICRsID0gc2NhbGFyKEBsaXN0KTsKLSAgICBteSAkYXJncyA9IHN0cmluZ19hcnJheSgkbCsxKTsKLSAgICBteSAkaSA9IDA7Ci0gICAgZm9yZWFjaCAkYXJnIChAbGlzdCkgewotICAgICAgICBzdHJpbmdfc2V0KCRhcmdzLCRpLCRhcmcpOwotICAgICAgICAkaSsrOwotICAgIH0gICAKLSAgICBzdHJpbmdfc2V0KCRhcmdzLCRpLCIiKTsKLQotKG9mIGNvdXJzZSwgdGhlcmUgaXMgYWx3YXlzIG1vcmUgdGhhbiBvbmUgd2F5IHRvIGRvIGl0KQotJX0KLSNlbGlmIGRlZmluZWQoU1dJR1BZVEhPTikKLQotJXRleHQgJXsKLVRvIGNvbnZlcnQgZnJvbSBhIFB5dGhvbiBsaXN0IHRvIGEgJ2NoYXIgKionLCBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZwotY2FuIGJlIHVzZWQgOgotCi0gICAgIyAnbGlzdCcgaXMgYSBsaXN0Ci0gICAgYXJncyA9IHN0cmluZ19hcnJheShsZW4obGlzdCkrMSkKLSAgICBmb3IgaSBpbiByYW5nZSgwLGxlbihsaXN0KSk6Ci0Jc3RyaW5nX3NldChhcmdzLGksbGlzdFtpXSkKLSAgICBzdHJpbmdfc2V0KGFyZ3MsbGVuKGxpc3QpLCIiKQotJX0KLQotI2VuZGlmCi0KLSV7Ci0JLi4uIFN1cHBvcnRpbmcgQyBjb2RlIC4uLgotJX0KLWNoYXIgKipzdHJpbmdfYXJyYXkoaW50IG5pdGVtcyk7Ci0vKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIHN0cmluZ3MuIG5pdGVtcyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KLSAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gRWFjaCBlbGVtZW50Ci0gICBvZiB0aGUgYXJyYXkgaXMgc2V0IHRvIE5VTEwgdXBvbiBpbml0aWFsaXphdGlvbi4gKi8KLQotdm9pZCBzdHJpbmdfZGVzdHJveShjaGFyICphcnJheSk7Ci0vKiBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuIEVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgaXMgYXNzdW1lZCB0byBiZQotICAgYSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpIG9yIG5ldygpLiAgQWxsIG9mCi0gICB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgZGVzdHJveWVkIGFzIHdlbGwuIChJdCBpcyBwcm9iYWJseSBvbmx5IHNhZmUgdG8KLSAgIHVzZSB0aGlzIGZ1bmN0aW9uIG9uIGFuIGFycmF5IGNyZWF0ZWQgYnkgc3RyaW5nX2FycmF5KSAqLwotCi1jaGFyICpzdHJpbmdfZ2V0KGNoYXIgKiphcnJheSwgaW50IGluZGV4KTsKLS8qIFJldHVybnMgdGhlIHZhbHVlIG9mIGFycmF5W2luZGV4XS4gUmV0dXJucyBhIHN0cmluZyBvZiB6ZXJvIGxlbmd0aAotICAgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpcyBOVUxMLiAqLwotCi1jaGFyICpzdHJpbmdfc2V0KGNoYXIgKiphcnJheSwgaW50IGluZGV4LCBjaGFyICp2YWx1ZSk7Ci0vKiBTZXRzIGFycmF5W2luZGV4XSA9IHZhbHVlLiAgdmFsdWUgaXMgYXNzdW1lZCB0byBiZSBhIE5VTEwtdGVybWluYXRlZAotICAgc3RyaW5nLiAgQSBzdHJpbmcgb2YgemVybyBsZW5ndGggaXMgbWFwcGVkIGludG8gYSBOVUxMIHZhbHVlLiAgV2hlbgotICAgc2V0dGluZyB0aGUgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIGNvcGllZCBpbnRvIGEgbmV3IHN0cmluZyBhbGxvY2F0ZWQKLSAgIHdpdGggbWFsbG9jKCkgb3IgbmV3KCkuICBBbnkgcHJldmlvdXMgdmFsdWUgaW4gdGhlIGFycmF5IHdpbGwgYmUKLSAgIGRlc3Ryb3llZC4gKi8KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhpcyBmaWxlLCBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBhcmUgcGxhY2VkIGludG8gYSBuZXcgc2VjdGlvbi4gIFdlIHNwZWNpZnkgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBmb3Igb3VyIHNlY3Rpb24uICBTaW5jZSB0aGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGxpYnJhcnkgZmlsZSwgd2UgaGF2ZSBubyBpZGVhIHdoYXQgZm9ybWF0dGluZyBvdXIgcGFyZW50IG1pZ2h0IGJlIHVzaW5nIHNvIGFuIGV4cGxpY2l0IGRlY2xhcmF0aW9uIG1ha2VzIHN1cmUgd2UgZ2V0IGl0IHJpZ2h0LiBFYWNoIGNvbW1lbnQgY29udGFpbnMgcHJlZm9ybWF0dGVkIHRleHQgZGVzY3JpYmluZyBlYWNoIGZ1bmN0aW9uLiAgIEZpbmFsbHksIGluIHRoZSBjYXNlIG9mIHRoZSBzdHJpbmcgZnVuY3Rpb25zLCB3ZSBhcmUgdXNpbmcgYSBjb21iaW5hdGlvbiBvZiBjb25kaXRpb25hbCBjb21waWxhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gZGlyZWN0aXZlcyB0byBwcm9kdWNlIGxhbmd1YWdlLXNwZWNpZmljIGRvY3VtZW50YXRpb24uICAgSW4gdGhpcyBjYXNlLCB0aGUgZG9jdW1lbnRhdGlvbiBjb250YWlucyBhIHVzYWdlIGV4YW1wbGUgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuPHA+Ci08cD4KLVdoZW4gcHJvY2Vzc2VkIHRocm91Z2ggdGhlIEFTQ0lJIG1vZHVsZSwgdGhpcyBmaWxlIHdpbGwgcHJvZHVjZSBkb2N1bWVudGF0aW9uIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ny4gIFNXSUcgQyBBcnJheSBNb2R1bGUKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSVpbmNsdWRlIGFycmF5LmkKLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgc2NyaXB0aW5nIGxhbmd1YWdlIGFjY2VzcyB0byB2YXJpb3VzIGtpbmRzIG9mIEMvQysrCi1hcnJheXMuIEZvciBlYWNoIGRhdGF0eXBlLCBhIGNvbGxlY3Rpb24gb2YgZm91ciBmdW5jdGlvbnMgYXJlIGNyZWF0ZWQgOgotCi0gICAmbHQ7dHlwZSZndDtfYXJyYXkoc2l6ZSkgICAgICAgICAgICAgIDogQ3JlYXRlIGEgbmV3IGFycmF5IG9mIGdpdmVuIHNpemUKLSAgICZsdDt0eXBlJmd0O19nZXQoYXJyYXksIGluZGV4KSAgICAgICAgOiBHZXQgYW4gZWxlbWVudCBmcm9tIHRoZSBhcnJheQotICAgJmx0O3R5cGUmZ3Q7X3NldChhcnJheSwgaW5kZXgsIHZhbHVlKSA6IFNldCBhbiBlbGVtZW50IGluIHRoZSBhcnJheQotICAgJmx0O3R5cGUmZ3Q7X2Rlc3Ryb3koYXJyYXkpICAgICAgICAgICA6IERlc3Ryb3kgYW4gYXJyYXkKLQotVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGxpYnJhcnkgYXJlIG9ubHkgbG93LWxldmVsIGFjY2Vzc29yIGZ1bmN0aW9ucwotZGVzaWduZWQgdG8gZGlyZWN0bHkgYWNjZXNzIEMgYXJyYXlzLiAgTGlrZSBDLCBubyBib3VuZHMgY2hlY2tpbmcgaXMKLXBlcmZvcm1lZCBzbyB1c2UgYXQgeW91ciBvd24gcGVyaWwuCi0KLTcuMS4gIEludGVnZXIgQXJyYXlzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gaW50ZWdlciBhcnJheXMgKG1hcHBlZAotb250byB0aGUgQyAnaW50JyBkYXRhdHlwZS4gICAKLQotCi1pbnRfYXJyYXkobml0ZW1zKQotICAgICAgICBbIHJldHVybnMgaW50ICogXQotICAgICAgICBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIGludGVnZXJzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gICAKLSAgICAgICAgCi1pbnRfZGVzdHJveShhcnJheSkKLSAgICAgICAgWyByZXR1cm5zIHZvaWQgIF0KLSAgICAgICAgRGVzdHJveXMgdGhlIGdpdmVuIGFycmF5LiAgIAotICAgICAgICAKLWludF9nZXQoYXJyYXksaW5kZXgpCi0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiAgIAotICAgICAgICAKLWludF9zZXQoYXJyYXksaW5kZXgsdmFsdWUpCi0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgU2V0cyBhcnJheVtpbmRleF0gPSB2YWx1ZS4gIFJldHVybnMgdmFsdWUuICAgCi0gICAgICAgIAotNy4yLiAgRmxvYXRpbmcgUG9pbnQgQXJyYXlzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgYWNjZXNzIHRvIGFycmF5cyBvZiBmbG9hdHMgYW5kIGRvdWJsZXMuICAgCi0KLQotZG91YmxlX2FycmF5KG5pdGVtcykKLSAgICAgICAgWyByZXR1cm5zIGRvdWJsZSAqIF0KLSAgICAgICAgQ3JlYXRlcyBhIG5ldyBhcnJheSBvZiBkb3VibGVzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gICAKLSAgICAgICAgCi1kb3VibGVfZGVzdHJveShhcnJheSkKLSAgICAgICAgWyByZXR1cm5zIHZvaWQgIF0KLSAgICAgICAgRGVzdHJveXMgdGhlIGdpdmVuIGFycmF5LiAgIAotICAgICAgICAKLWRvdWJsZV9nZXQoYXJyYXksaW5kZXgpCi0gICAgICAgIFsgcmV0dXJucyBkb3VibGUgIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiAgIAotICAgICAgICAKLWRvdWJsZV9zZXQoYXJyYXksaW5kZXgsdmFsdWUpCi0gICAgICAgIFsgcmV0dXJucyBkb3VibGUgIF0KLSAgICAgICAgU2V0cyBhcnJheVtpbmRleF0gPSB2YWx1ZS4gIFJldHVybnMgdmFsdWUuICAgCi0gICAgICAgIAotZmxvYXRfYXJyYXkobml0ZW1zKQotICAgICAgICBbIHJldHVybnMgZmxvYXQgKiBdCi0gICAgICAgIENyZWF0ZXMgYSBuZXcgYXJyYXkgb2YgZmxvYXRzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gICAKLSAgICAgICAgCi1mbG9hdF9kZXN0cm95KGFycmF5KQotICAgICAgICBbIHJldHVybnMgdm9pZCAgXQotICAgICAgICBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuICAgCi0gICAgICAgIAotZmxvYXRfZ2V0KGFycmF5LGluZGV4KQotICAgICAgICBbIHJldHVybnMgZmxvYXQgIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiAgIAotICAgICAgICAKLWZsb2F0X3NldChhcnJheSxpbmRleCx2YWx1ZSkKLSAgICAgICAgWyByZXR1cm5zIGZsb2F0ICBdCi0gICAgICAgIFNldHMgYXJyYXlbaW5kZXhdID0gdmFsdWUuICBSZXR1cm5zIHZhbHVlLiAgIAotICAgICAgICAKLTcuMy4gIFN0cmluZyBBcnJheXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgJ2NoYXIgKionIGRhdGF0eXBlLiAgIFRoaXMKLWlzIHByaW1hcmlseSB1c2VkIHRvIGhhbmRsZSBhcmd1bWVudCBsaXN0cyBhbmQgb3RoZXIgc2ltaWxhciBzdHJ1Y3R1cmVzIHRoYXQKLW5lZWQgdG8gYmUgcGFzc2VkIHRvIGEgQy9DKysgZnVuY3Rpb24uCi0KLVRvIGNvbnZlcnQgZnJvbSBhIFB5dGhvbiBsaXN0IHRvIGEgJ2NoYXIgKionLCBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZwotY2FuIGJlIHVzZWQgOgotCi0gICAgIyAnbGlzdCcgaXMgYSBsaXN0Ci0gICAgYXJncyA9IHN0cmluZ19hcnJheShsZW4obGlzdCkrMSkKLSAgICBmb3IgaSBpbiByYW5nZSgwLGxlbihsaXN0KSk6Ci0Jc3RyaW5nX3NldChhcmdzLGksbGlzdFtpXSkKLSAgICBzdHJpbmdfc2V0KGFyZ3MsbGVuKGxpc3QpLCIiKQotCi1zdHJpbmdfYXJyYXkobml0ZW1zKQotICAgICAgICBbIHJldHVybnMgY2hhciAqKiBdCi0gICAgICAgIENyZWF0ZXMgYSBuZXcgYXJyYXkgb2Ygc3RyaW5ncy4gbml0ZW1zIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgICAgICBUaGUgYXJyYXkgaXMgY3JlYXRlZCB1c2luZyBtYWxsb2MoKSBpbiBDIGFuZCBuZXcoKSBpbiBDKysuIEVhY2ggZWxlbWVudAotICAgICAgICBvZiB0aGUgYXJyYXkgaXMgc2V0IHRvIE5VTEwgdXBvbiBpbml0aWFsaXphdGlvbi4gICAKLSAgICAgICAgCi1zdHJpbmdfZGVzdHJveShhcnJheSkKLSAgICAgICAgWyByZXR1cm5zIHZvaWQgIF0KLSAgICAgICAgRGVzdHJveXMgdGhlIGdpdmVuIGFycmF5LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IGlzIGFzc3VtZWQgdG8gYmUKLSAgICAgICAgYSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpIG9yIG5ldygpLiAgQWxsIG9mCi0gICAgICAgIHRoZXNlIHN0cmluZ3Mgd2lsbCBiZSBkZXN0cm95ZWQgYXMgd2VsbC4gKEl0IGlzIHByb2JhYmx5IG9ubHkgc2FmZSB0bwotICAgICAgICB1c2UgdGhpcyBmdW5jdGlvbiBvbiBhbiBhcnJheSBjcmVhdGVkIGJ5IHN0cmluZ19hcnJheSkgICAKLSAgICAgICAgCi1zdHJpbmdfZ2V0KGFycmF5LGluZGV4KQotICAgICAgICBbIHJldHVybnMgY2hhciAqIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiBSZXR1cm5zIGEgc3RyaW5nIG9mIHplcm8gbGVuZ3RoCi0gICAgICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaXMgTlVMTC4gICAKLSAgICAgICAgCi1zdHJpbmdfc2V0KGFycmF5LGluZGV4LHZhbHVlKQotICAgICAgICBbIHJldHVybnMgY2hhciAqIF0KLSAgICAgICAgU2V0cyBhcnJheVtpbmRleF0gPSB2YWx1ZS4gIHZhbHVlIGlzIGFzc3VtZWQgdG8gYmUgYSBOVUxMLXRlcm1pbmF0ZWQKLSAgICAgICAgc3RyaW5nLiAgQSBzdHJpbmcgb2YgemVybyBsZW5ndGggaXMgbWFwcGVkIGludG8gYSBOVUxMIHZhbHVlLiAgV2hlbgotICAgICAgICBzZXR0aW5nIHRoZSB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgY29waWVkIGludG8gYSBuZXcgc3RyaW5nIGFsbG9jYXRlZAotICAgICAgICB3aXRoIG1hbGxvYygpIG9yIG5ldygpLiAgQW55IHByZXZpb3VzIHZhbHVlIGluIHRoZSBhcnJheSB3aWxsIGJlCi0gICAgICAgIGRlc3Ryb3llZC4gICAKLSAgICAgICAgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IEFTQ0lJIERvY3VtZW50YXRpb248L2gyPgotVGhlIEFTQ0lJIG1vZHVsZSBwcm9kdWNlcyBkb2N1bWVudGF0aW9uIGluIHBsYWludGV4dCBhcyBzaG93biBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZS4gIFR3byBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSAoZGVmYXVsdCB2YWx1ZXMgc2hvd24pIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5hc2NpaV9pbmRlbnQgPSA4Ci1hc2NpaV9jb2x1bW5zID0gNzAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotYDx0dD5hc2NpaV9pbmRlbnQ8L3R0Picgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbmRlbnQgZWFjaCBmdW5jdGlvbiBkZXNjcmlwdGlvbi4gICBgPHR0PmFzY2lpX2NvbHVtbnM8L3R0Picgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgb3V0cHV0IHdoZW4gcmVmb3JtYXR0aW5nIHRleHQuPHA+Ci08cD4KLVdoZW4gcmVmb3JtYXR0aW5nIHRleHQsIGFsbCBleHRyYW5lb3VzIHdoaXRlLXNwYWNlIGlzIHN0cmlwcGVkIGFuZCB0ZXh0IGlzIGZpbGxlZCB0byBmaXQgaW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29sdW1ucy4gICBUaGUgb3V0cHV0IHRleHQgd2lsbCBiZSBsZWZ0LWp1c3RpZmllZC4gICAgQSBzaW5nbGUgbmV3bGluZSBpcyBpZ25vcmVkLCBidXQgbXVsdGlwbGUgbmV3bGluZXMgY2FuIGJlIHVzZWQgdG8gc3RhcnQgYSBuZXcgcGFyYWdyYXBoLiAgIFRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYFxcJyBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIG5ld2xpbmUuPHA+Ci08cD4KLVByZWZvcm1hdHRlZCB0ZXh0IGlzIHByaW50ZWQgaW50byB0aGUgcmVzdWx0aW5nIG91dHB1dCB1bm1vZGlmaWVkIGFsdGhvdWdoIGl0IG1heSBiZSBpbmRlbnRlZCB3aGVuIHVzZWQgYXMgcGFydCBvZiBhIGZ1bmN0aW9uIGRlc2NyaXB0aW9uLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBIVE1MIERvY3VtZW50YXRpb248L2gyPgotVGhlIEhUTUwgbW9kdWxlIHByb2R1Y2VzIGRvY3VtZW50YXRpb24gaW4gSFRNTCBmb3JtYXQgKHdobyB3b3VsZCBoYXZlIGd1ZXNzZWQ/KS4gIEhvd2V2ZXIsIGEgbnVtYmVyIG9mIHN0eWxlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSAgKHNob3duIHdpdGggZGVmYXVsdCB2YWx1ZXMpPHA+Ci08YmxvY2txdW90ZT48cHJlPgotaHRtbF90aXRsZSA9ICImbHQ7SDEmZ3Q7OiZsdDsvSDEmZ3Q7IgotaHRtbF9jb250ZW50cyA9ICImbHQ7SDEmZ3Q7OiZsdDsvSDEmZ3Q7IgotaHRtbF9zZWN0aW9uID0gIiZsdDtIUiZndDsmbHQ7SDImZ3Q7OiZsdDsvSDImZ3Q7IgotaHRtbF9zdWJzZWN0aW9uID0gIiZsdDtIMyZndDs6Jmx0Oy9IMyZndDsiCi1odG1sX3N1YnN1YnNlY3Rpb24gPSAiJmx0O0g0Jmd0OzombHQ7L0g0Jmd0OyIKLWh0bWxfdXNhZ2UgPSAiJmx0O0ImZ3Q7Jmx0O1RUJmd0OzombHQ7L1RUJmd0OyZsdDsvQiZndDsiCi1odG1sX2Rlc2NyaXAgPSAiJmx0O0JMT0NLUVVPVEUmZ3Q7OiZsdDsvQkxPQ0tRVU9URSZndDsiCi1odG1sX3RleHQgPSAiJmx0O1AmZ3Q7IgotaHRtbF9jaW5mbyA9ICIiCi1odG1sX3ByZWZvcm1hdCA9ICImbHQ7UFJFJmd0OzombHQ7L1BSRSZndDsiCi1odG1sX2JvZHkgPSAiJmx0O0JPRFkgYmdfY29sb3I9XCIjZmZmZmZmXCImZ3Q7OiZsdDsvQk9EWSZndDsiCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUFueSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBjaGFuZ2VkLCBieSBzaW1wbHkgc3BlY2lmeWluZyB0aGVtIGFmdGVyIGEgPHR0PiV0aXRsZTwvdHQ+IG9yIDx0dD4lc2VjdGlvbjwvdHQ+IGRpcmVjdGl2ZS4gIEhvd2V2ZXIsIHRoZSBlZmZlY3RzIGFyZSBhcHBsaWVkIGdsb2JhbGx5IHNvIGl0IHByb2JhYmx5IG1ha2VzIHNlbnNlIHRvIHVzZSB0aGUgPHR0PiVzdHlsZTwvdHQ+IGRpcmVjdGl2ZSBpbnN0ZWFkLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVzdHlsZSBodG1sX2NvbnRlbnRzPSImbHQ7SFImZ3Q7Jmx0O0gxJmd0OzombHQ7L0gxJmd0OyIKLS4uLiBSZXN0IG9mIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRWFjaCB0YWcgdXNlcyBhICI6IiB0byBzZXBhcmF0ZSB0aGUgc3RhcnQgYW5kIGVuZCB0YWdzLiAgIEFueSB0ZXh0IHdpbGwgYmUgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2YgdGhlICI6Ii4gIFNpbmNlIHN0cmluZ3MgYXJlIHNwZWNpZmllZCBpbiBTV0lHIHVzaW5nIHF1b3RlcywgYW55IHF1b3RlcyB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW50byBhIHRhZyBzaG91bGQgYmUgZXNjYXBlZCB1c2luZyB0aGUgIlwiIGNoYXJhY3Rlci48cD4KLTxwPgotU2FtcGxlIEhUTUwgb3V0cHV0IGlzIHNob3duIGJlbG93IDo8cD4KLTxwPjxhIGhyZWY9ImNoNS4yLnBuZyI+U2FtcGxlIFNjcmVlbnNob3QgMSA8L2E+PHA+Ci08cD4KLTxwPgotU2luY2Ugb3VyIGV4YW1wbGUgdXNlZCBwcmVmb3JtYXR0ZWQgdGV4dCwgdGhlIG91dHB1dCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIEFTQ0lJIG1vZHVsZS4gIEhvd2V2ZXIsIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQgbW9kZSwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IEhUTUwgbWFya3VwIGRpcmVjdGx5IGludG8geW91ciBDIGNvbW1lbnRzIGZvciBhIG1vcmUgcGVyc29uYWxpemVkIGRvY3VtZW50LjxwPgotPHA+Ci1Gb3IgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LCBTV0lHIGFsc28gcHJvZHVjZXMgYSB0YWJsZSBvZiBjb250ZW50cyB3aXRoIGxpbmtzIHRvIGVhY2ggc2VjdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LiAgV2l0aCBhIGxhcmdlIGludGVyZmFjZSwgdGhlIGNvbnRlbnRzIG1heSBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+PGEgaHJlZj0iY2g1LjMucG5nIj5TYW1wbGUgU2NyZWVuc2hvdCAyIDwvYT48cD4KLTxwPgotPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDI+IExhVGVYIERvY3VtZW50YXRpb248L2gyPgotVGhlIExhVGVYIG1vZHVsZSBvcGVyYXRlcyBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIHRoZSBIVE1MIG1vZHVsZS4gIFRoZSBmb2xsb3dpbmcgc3R5bGUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIChzb21lIGtub3dsZWRnZSBvZiBMYVRlWCBpcyBhc3N1bWVkKS48cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1sYXRleF9wYXJpbmRlbnQgPSAiMC4waW4iCi1sYXRleF90ZXh0d2lkdGggPSAiNi41aW4iCi1sYXRleF9kb2N1bWVudHN0eWxlID0gIlsxMXB0XXthcnRpY2xlfSIKLWxhdGV4X29kZHNpZGVtYXJnaW4gPSAiMC4waW4iCi1sYXRleF9wYWdlc3R5bGUgPSAiXFxwYWdlc3R5bGV7aGVhZGluZ3N9IgotbGF0ZXhfdGl0bGUgPSAie1xcTGFyZ2UgXFxiZiA6fSBcXFxcXG4iCi1sYXRleF9wcmVmb3JtYXQgPSAie1xcc21hbGwgXFxiZWdpbnt2ZXJiYXRpbX06XFxlbmR7dmVyYmF0aW19fSIKLWxhdGV4X3VzYWdlID0gIntcXHR0IFxcYmYgOiB9IgotbGF0ZXhfZGVzY3JpcCA9ICJ7XFxcXFxuIFxcbWFrZWJveFswLjVpbl17fSBcYmVnaW57bWluaXBhZ2V9W3RdezZpbn0gOiBcbiAKLVxcZW5ke21pbmlwYWdlfSBcXFxcIjsKLWxhdGV4X3RleHQgPSAiOlxcXFwiCi1sYXRleF9jaW5mbyA9ICJ7XFx0dCA6IH0iCi1sYXRleF9zZWN0aW9uID0gIlxcc2VjdGlvbns6fSIKLWxhdGV4X3N1YnNlY3Rpb24gPSAiXFxzdWJzZWN0aW9uezp9IgotbGF0ZXhfc3Vic3Vic2VjdGlvbiA9ICJcXHN1YnN1YnNlY3Rpb257On0iCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBzdHlsZSBwYXJhbWV0ZXJzLCB3ZWxsLCBsb29rIGRvd25yaWdodCB1Z2x5LiAgIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBzdHJpbmdzIHVzZWQgYnkgU1dJRyBoYXZlIGVzY2FwZSBjb2RlcyBpbiB0aGVtIHNvIGl0J3MgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUgYFwnIGNoYXJhY3RlciBhcyBgXFwnLiAgIFRodXMsIHdpdGhpbiBTV0lHIHlvdXIgY29kZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXN0eWxlIGxhdGV4X3NlY3Rpb249IlxcbmV3cGFnZSBcbiBcXHNlY3Rpb257On0iCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBkZWZhdWx0IHZhbHVlcyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgY3JlYXRpbmcgYSByZWFkYWJsZSBMYVRlWCBkb2N1bWVudCBpbiBhbnkgY2FzZSB5b3UgZG9uJ3Qgd2FudCB0byB3b3JyeSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzdHlsZSBwYXJhbWV0ZXJzLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgyPiBDKysgU3VwcG9ydDwvaDI+Ci1DKysgY2xhc3NlcyBhcmUgZW5jYXBzdWxhdGVkIGluIGEgbmV3IHN1YnNlY3Rpb24gb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gIFRoaXMgc3Vic2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgYWxsIG9mIHRoZSBtZW1iZXIgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuICBTaW5jZSBsYW5ndWFnZSBtb2R1bGVzIGFyZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGRvY3VtZW50YXRpb24sIHRoZSB1c2Ugb2Ygc2hhZG93IGNsYXNzZXMgd2lsbCByZXN1bHQgaW4gZG9jdW1lbnRhdGlvbiBkZXNjcmliaW5nIHRoZSByZXN1bHRpbmcgc2hhZG93IGNsYXNzZXMsIG5vdCB0aGUgbG93ZXIgbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBjb2RlLjxwPgotPHA+Ci1XaGlsZSBpdCdzIG5vdCBlbnRpcmVseSBjbGVhciB0aGF0IHRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGRvY3VtZW50IEMrKyBjb2RlLCBpdCBpcyBhIHN0YXJ0IChhbmQgaXQncyBiZXR0ZXIgdGhhbiBubyBkb2N1bWVudGF0aW9uKS48cD4KLTxhIG5hbWU9Im4xNCI+PC9hPjxoMj4gVGhlIEZpbmFsIFdvcmQ/PC9oMj4KLUVhcmx5IHZlcnNpb25zIG9mIFNXSUcgdXNlZCBhIGZhaXJseSBwcmltaXRpdmUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0sIHRoYXQgY291bGQgYmVzdCBiZSBkZXNjcmliZWQgYXMgImJhcmVseSB1c2FibGUuIiAgVGhlIHN5c3RlbSBkZXNjcmliZWQgaGVyZSByZXByZXNlbnRzIGFuIGFsbW9zdCB0b3RhbCByZXdyaXRlIG9mIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFdoaWxlIGl0IGlzLCBieSBubyBtZWFucywgYSBwZXJmZWN0IHNvbHV0aW9uLCBJIHRoaW5rIGl0IGlzIGEgc3RlcCBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLiAgICAgVGhlIFNXSUcgbGlicmFyeSBpcyBub3cgZW50aXJlbHkgc2VsZi1kb2N1bWVudGluZyBhbmQgaXMgYSBnb29kIHNvdXJjZSBvZiBkb2N1bWVudGF0aW9uIGV4YW1wbGVzLiAgIEFzIGFsd2F5cyBzdWdnZXN0aW9ucyBhbmQgaW1wcm92ZW1lbnRzIGFyZSB3ZWxjb21lLjxwPgotPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjU1IDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0V4Y2VwdGlvbnMuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRXhjZXB0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWU1NzViLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRXhjZXB0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+RXhjZXB0aW9uIEhhbmRsaW5nPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT43IEV4Y2VwdGlvbiBIYW5kbGluZzwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPlRoZSAlZXhjZXB0IGRpcmVjdGl2ZTwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5IYW5kbGluZyBleGNlcHRpb25zIGluIEMgY29kZTwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5FeGNlcHRpb24gaGFuZGxpbmcgd2l0aCBsb25nam1wKCk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+SGFuZGxpbmcgQysrIGV4Y2VwdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+RGVmaW5pbmcgZGlmZmVyZW50IGV4Y2VwdGlvbiBoYW5kbGVyczwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5Vc2luZyBUaGUgU1dJRyBleGNlcHRpb24gbGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5EZWJ1Z2dpbmcgYW5kIG90aGVyIGludGVyZXN0aW5nIHVzZXMgZm9yICVleGNlcHQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+TW9yZSBFeGFtcGxlczwvYT4KLTwvdWw+Ci0KLUluIHNvbWUgY2FzZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBjYXRjaCBlcnJvcnMgdGhhdCBvY2N1ciBpbiBDIGZ1bmN0aW9ucyBhbmQgcHJvcGFnYXRlIHRoZW0gdXAgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UgKGllLiByYWlzZSBhbiBleGNlcHRpb24pLiBCeSBkZWZhdWx0LCBTV0lHIGRvZXMgbm90aGluZywgYnV0IHlvdSBjYW4gY3JlYXRlIGEgdXNlci1kZWZpbmFibGUgZXhjZXB0aW9uIGhhbmRsZXIgdXNpbmcgdGhlIDx0dD4lZXhjZXB0PC90dD4gZGlyZWN0aXZlLjxwPgotPGEgbmFtZT0ibjEiPjwvYT48aDI+IFRoZSAlZXhjZXB0IGRpcmVjdGl2ZTwvaDI+Ci1UaGUgPHR0PiVleGNlcHQ8L3R0PiBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBkZWZpbmUgYW4gZXhjZXB0aW9uIGhhbmRsZXIuIEl0IHdvcmtzIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocHl0aG9uKSB7Ci0JdHJ5IHsKLQkkZnVuY3Rpb24KLQl9Ci0JY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLQkgCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCJpbmRleCBvdXQtb2YtYm91bmRzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQXMgYW4gYXJndW1lbnQsIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBDL0MrKyBjb2RlIGlzIHRoZW4gZW5jbG9zZWQgaW4gYnJhY2VzLiBUaGUgc3ltYm9sIDx0dD4kZnVuY3Rpb24gPC90dD5pcyByZXBsYWNlZCB3aXRoIHRoZSByZWFsIEMvQysrIGZ1bmN0aW9uIGNhbGwgdGhhdCBTV0lHIHdvdWxkIGJlIG9yZGluYXJpbHkgbWFrZSBpbiB0aGUgd3JhcHBlciBjb2RlLiBUaGUgQyBjb2RlIHlvdSBzcGVjaWZ5IGluc2lkZSB0aGUgPHR0PiVleGNlcHQ8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIGFueXRoaW5nIHlvdSBsaWtlIGluY2x1ZGluZyBjdXN0b20gQyBjb2RlIGFuZCBDKysgZXhjZXB0aW9ucy48cD4KLTxwPgotVG8gZGVsZXRlIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLCBzaW1wbHkgdXNlIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSB3aXRoIG5vIGNvZGUuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lZXhjZXB0KHB5dGhvbik7IAkJCQkvLyBEZWxldGVzIGFueSBwcmV2aW91c2x5IGRlZmluZWQgaGFuZGxlcgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1FeGNlcHRpb25zIGNhbiBiZSByZWRlZmluZWQgYXMgbmVjZXNzYXJ5LiBUaGUgc2NvcGUgb2YgYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgZnJvbSB0aGUgcG9pbnQgb2YgZGVmaW5pdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGUgZGVmaW5pdGlvbiBvZiBhIG5ldyBleGNlcHRpb24gaGFuZGxlciwgb3IgdW50aWwgdGhlIGhhbmRsZXIgaXMgZGVsZXRlZC48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBIYW5kbGluZyBleGNlcHRpb25zIGluIEMgY29kZTwvaDI+Ci1DIGhhcyBubyBmb3JtYWwgbWVjaGFuaXNtIGZvciBoYW5kbGluZyBleGNlcHRpb25zIHNvIHRoZXJlIGFyZSBtYW55IHBvc3NpYmlsaXRpZXMuIFRoZSBmaXJzdCBhcHByb2FjaCBpcyB0byBzaW1wbHkgcHJvdmlkZSBzb21lIGZ1bmN0aW9ucyBmb3Igc2V0dGluZyBhbmQgY2hlY2tpbmcgYW4gZXJyb3IgY29kZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotCi0vKiBGaWxlIDogZXhjZXB0LmMgKi8KLQotc3RhdGljIGNoYXIgZXJyb3JfbWVzc2FnZVsyNTZdOwotc3RhdGljIGludCBlcnJvcl9zdGF0dXMgPSAwOwotCi12b2lkIHRocm93X2V4Y2VwdGlvbihjaGFyICptc2cpIHsKLQlzdHJuY3B5KGVycm9yX21lc3NhZ2UsbXNnLDI1Nik7Ci0JZXJyb3Jfc3RhdHVzID0gMTsKLX0KLQotdm9pZCBjbGVhcl9leGNlcHRpb24oKSB7Ci0JZXJyb3Jfc3RhdHVzID0gMDsKLX0KLWNoYXIgKmNoZWNrX2V4Y2VwdGlvbigpIHsKLQlpZiAoZXJyb3Jfc3RhdHVzKSByZXR1cm4gZXJyb3JfbWVzc2FnZTsKLQllbHNlIHJldHVybiBOVUxMOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyB3b3JrLCBmdW5jdGlvbnMgd2lsbCBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCA8dHQ+dGhyb3dfZXhjZXB0aW9uKCk8L3R0PiB0byBpbmRpY2F0ZSBhbiBlcnJvciBvY2N1cnJlZC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSBpbnYoZG91YmxlIHgpIHsKLQlpZiAoeCAhPSAwKSByZXR1cm4gMS4wL3g7Ci0JZWxzZSB7Ci0JCXRocm93X2V4Y2VwdGlvbigiRGl2aXNpb24gYnkgemVybyIpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGNhdGNoIHRoZSBleGNlcHRpb24sIHlvdSBjYW4gd3JpdGUgYSBzaW1wbGUgZXhjZXB0aW9uIGhhbmRsZXIgc3VjaCBhcyB0aGUgZm9sbG93aW5nIChzaG93biBmb3IgUGVybDUpIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lZXhjZXB0KHBlcmw1KSB7Ci0JY2hhciAqZXJyOwotCWNsZWFyX2V4Y2VwdGlvbigpOwotCSRmdW5jdGlvbgotCWlmICgoZXJyID0gY2hlY2tfZXhjZXB0aW9uKCkpKSB7Ci0JCWNyb2FrKGVycik7Ci0JfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3csIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCBpdCB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBhIFBlcmwgZXJyb3IuIFRoZSBkb3duc2lkZSB0byB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgaXNuJ3QgcGFydGljdWxhcmx5IGNsZWFuIGFuZCBpdCBhc3N1bWVzIHRoYXQgeW91ciBDIGNvZGUgaXMgYSB3aWxsaW5nIHBhcnRpY2lwYW50IGluIGdlbmVyYXRpbmcgZXJyb3IgbWVzc2FnZXMuIChUaGlzIGlzbid0IGdvaW5nIHRvIG1hZ2ljYWxseSBhZGQgZXhjZXB0aW9ucyB0byBhIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgdGhlbSkuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gRXhjZXB0aW9uIGhhbmRsaW5nIHdpdGggbG9uZ2ptcCgpPC9oMj4KLUV4Y2VwdGlvbiBoYW5kbGluZyBjYW4gYWxzbyBiZSBhZGRlZCB0byBDIGNvZGUgdXNpbmcgdGhlIDx0dD4mbHQ7c2V0am1wLmgmZ3Q7PC90dD4gbGlicmFyeS4gVGhpcyB1c3VhbGx5IGlzbid0IGRvY3VtZW50ZWQgdmVyeSB3ZWxsIChhdCBsZWFzdCBub3QgaW4gYW55IG9mIG15IEMgYm9va3MpLiBJbiBhbnkgY2FzZSwgaGVyZSdzIG9uZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIEMgcHJlcHJvY2Vzc29yIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBGaWxlIDogZXhjZXB0LmMKLSAgIEp1c3QgdGhlIGRlY2xhcmF0aW9uIG9mIGEgZmV3IGdsb2JhbCB2YXJpYWJsZXMgd2UncmUgZ29pbmcgdG8gdXNlICovCi0KLSNpbmNsdWRlICZsdDtzZXRqbXAuaCZndDsKLWptcF9idWYgZXhjZXB0aW9uX2J1ZmZlcjsKLWludCBleGNlcHRpb25fc3RhdHVzOwotCi0vKiBGaWxlIDogZXhjZXB0LmggKi8KLSNpbmNsdWRlICZsdDtzZXRqbXAuaCZndDsKLWV4dGVybiBqbXBfYnVmIGV4Y2VwdGlvbl9idWZmZXI7Ci1leHRlcm4gaW50IGV4Y2VwdGlvbl9zdGF0dXM7Ci0KLSNkZWZpbmUgdHJ5IGlmICgoZXhjZXB0aW9uX3N0YXR1cyA9IHNldGptcChleGNlcHRpb25fYnVmZmVyKSkgPT0gMCkKLSNkZWZpbmUgY2F0Y2godmFsKSBlbHNlIGlmIChleGNlcHRpb25fc3RhdHVzID09IHZhbCkKLSNkZWZpbmUgdGhyb3codmFsKSBsb25nam1wKGV4Y2VwdGlvbl9idWZmZXIsdmFsKQotI2RlZmluZSBmaW5hbGx5IGVsc2UKLQotLyogRXhjZXB0aW9uIGNvZGVzICovCi0KLSNkZWZpbmUgUmFuZ2VFcnJvciAgICAgMQotI2RlZmluZSBEaXZpc2lvbkJ5WmVybyAyCi0jZGVmaW5lIE91dE9mTWVtb3J5ICAgIDMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCB3aXRoaW4gYSBDIHByb2dyYW0sIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIGludihkb3VibGUgeCkgewotCWlmICh4KSByZXR1cm4gMS4wL3g7Ci0JZWxzZSB7dGhyb3coRGl2aXNpb25CeVplcm8pOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1GaW5hbGx5LCB0byBjcmVhdGUgYSBTV0lHIGV4Y2VwdGlvbiBoYW5kbGVyLCB3cml0ZSB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lewotI2luY2x1ZGUgImV4Y2VwdC5oIgotJX0KLQotJWV4Y2VwdChwZXJsNSkgewotCXRyeSB7Ci0JCSRmdW5jdGlvbgotCX0gY2F0Y2goUmFuZ2VFcnJvcikgewotCQljcm9haygiUmFuZ2UgRXJyb3IiKTsKLQl9IGNhdGNoKERpdmlzaW9uQnlaZXJvKSB7Ci0JCWNyb2FrKCJEaXZpc2lvbiBieSB6ZXJvIik7Ci0JfSBjYXRjaChPdXRPZk1lbW9yeSkgewotCQljcm9haygiT3V0IG9mIG1lbW9yeSIpOwotCX0gZmluYWxseSB7Ci0JCWNyb2FrKCJVbmtub3duIGV4Y2VwdGlvbiIpOwotCX0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BdCB0aGlzIHBvaW50LCB5b3UncmUgc2F5aW5nIHRoaXMgc3VyZSBsb29rcyBhbG90IGxpa2UgQysrIGFuZCB5b3UnZCBiZSByaWdodCAoQysrIGV4Y2VwdGlvbnMgYXJlIG9mdGVuIGltcGxlbWVudGVkIGluIGEgc2ltaWxhciBtYW5uZXIpLiAgQXMgYWx3YXlzLCB0aGUgdXN1YWwgZGlzY2xhaW1lcnMgYXBwbHktLXlvdXIgbWlsZWFnZSBtYXkgdmFyeS4gIDxwPgotPGEgbmFtZT0ibjQiPjwvYT48aDI+IEhhbmRsaW5nIEMrKyBleGNlcHRpb25zPC9oMj4KLUhhbmRsaW5nIEMrKyBleGNlcHRpb25zIGlzIGFsbW9zdCBjb21wbGV0ZWx5IHRyaXZpYWwgKHdlbGwsIGFsbCBleGNlcHQgZm9yIHRoZSBhY3R1YWwgQysrIHBhcnQpLiAgIEEgdHlwaWNhbCBTV0lHIGV4Y2VwdGlvbiBoYW5kbGVyIHdpbGwgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocGVybDUpIHsKLQl0cnkgewotCQkkZnVuY3Rpb24KLQl9IGNhdGNoKFJhbmdlRXJyb3IpIHsKLQkJY3JvYWsoIlJhbmdlIEVycm9yIik7Ci0JfSBjYXRjaChEaXZpc2lvbkJ5WmVybykgewotCQljcm9haygiRGl2aXNpb24gYnkgemVybyIpOwotCX0gY2F0Y2goT3V0T2ZNZW1vcnkpIHsKLQkJY3JvYWsoIk91dCBvZiBtZW1vcnkiKTsKLQl9IGNhdGNoKC4uLikgewotCQljcm9haygiVW5rbm93biBleGNlcHRpb24iKTsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBleGNlcHRpb24gdHlwZXMgbmVlZCB0byBiZSBkZWNsYXJlZCBhcyBjbGFzc2VzIGVsc2V3aGVyZSwgcG9zc2libHkgaW4gYSBoZWFkZXIgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgUmFuZ2VFcnJvciB7fTsKLWNsYXNzIERpdmlzaW9uQnlaZXJvIHt9OwotY2xhc3MgT3V0T2ZNZW1vcnkge307Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5ld2VyIHZlcnNpb25zIG9mIHRoZSBTV0lHIHBhcnNlciBzaG91bGQgaWdub3JlIGV4Y2VwdGlvbnMgc3BlY2lmaWVkIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSBpbnYoZG91YmxlKSB0aHJvdyhEaXZpc2lvbkJ5WmVybyk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBEZWZpbmluZyBkaWZmZXJlbnQgZXhjZXB0aW9uIGhhbmRsZXJzPC9oMj4KLUJ5IGRlZmF1bHQsIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSBjcmVhdGVzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRoYXQgaXMgdXNlZCBmb3IgYWxsIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgZm9sbG93IGl0LiAgIENyZWF0aW5nIG9uZSB1bml2ZXJzYWwgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIGFsbCBmdW5jdGlvbnMgbWF5IGJlIHVud2llbGR5IGFuZCBwcm9tb3RlIGV4Y2Vzc2l2ZSBjb2RlIGJsb2F0IHNpbmNlIHRoZSBoYW5kbGVyIHdpbGwgYmUgaW5saW5lZCBpbnRvIGVhY2ggd3JhcHBlciBmdW5jdGlvbiBjcmVhdGVkLiAgIEZvciB0aGlzIHJlYXNvbiwgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGNhbiBiZSByZWRlZmluZWQgYXQgYW55IHBvaW50IGluIGFuIGludGVyZmFjZSBmaWxlLiAgVGh1cywgYSBtb3JlIGVmZmljaWVudCB1c2Ugb2YgZXhjZXB0aW9uIGhhbmRsaW5nIG1heSB3b3JrIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWV4Y2VwdChweXRob24pIHsKLQkuLi4geW91ciBleGNlcHRpb24gaGFuZGxlciAuLi4KLX0KLS8qIERlZmluZSBjcml0aWNhbCBvcGVyYXRpb25zIHRoYXQgY2FuIHRocm93IGV4Y2VwdGlvbnMgaGVyZSAqLwotCi0lZXhjZXB0KHB5dGhvbik7ICAgICAgICAgLy8gQ2xlYXIgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyCi0KLS8qIERlZmluZSBub24tY3JpdGljYWwgb3BlcmF0aW9ucyB0aGF0IGRvbid0IHRocm93IGV4Y2VwdGlvbnMgKi8KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjkiPjwvYT48aDM+IEFwcGx5aW5nIGV4Y2VwdGlvbiBoYW5kbGVycyB0byBzcGVjaWZpYyBkYXRhdHlwZXMuPC9oMz4KLUFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIHVzaW5nIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSBpcyB0byB1c2UgdGhlICJleGNlcHQiIHR5cGVtYXAuICBUaGlzIGFsbG93cyB5b3UgdG8gYXR0YWNoIGFuIGVycm9yIGhhbmRsZXIgdG8gc3BlY2lmaWMgZGF0YXR5cGVzIGFuZCBmdW5jdGlvbiBuYW1lLiAgIFRoZSB0eXBlbWFwIGlzIGFwcGxpZWQgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixleGNlcHQpIHZvaWQgKiB7Ci0JJGZ1bmN0aW9uCi0JaWYgKCEkc291cmNlKSB7Ci0JCVB5RXhjX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwiT3V0IG9mIG1lbW9yeSBpbiAkbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgKm1hbGxvYyhpbnQgc2l6ZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gYXBwbGllZCwgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiA8dHQ+bWFsbG9jKCk8L3R0PiBhbmQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGl0J3MgaW52YWxpZC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5QeXRob24gMS40IChKYW4gMTYgMTk5NykgIFtHQ0MgMi43LjJdCi1Db3B5cmlnaHQgMTk5MS0xOTk1IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtCi0mZ3Q7Jmd0OyZndDsgZnJvbSBleGFtcGxlIGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgYSA9IG1hbGxvYygyMDQ4KQotJmd0OyZndDsmZ3Q7IGIgPSBtYWxsb2MoMTUwMDAwMDAwMCkKLVRyYWNlYmFjayAoaW5uZXJtb3N0IGxhc3QpOgotICBGaWxlICImbHQ7c3RkaW4mZ3Q7IiwgbGluZSAxLCBpbiA/Ci1NZW1vcnlFcnJvcjogT3V0IG9mIG1lbW9yeSBpbiBtYWxsb2MKLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TaW5jZSB0eXBlbWFwcyBjYW4gYmUgbmFtZWQsIHlvdSBjYW4gZGVmaW5lIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhIHNwZWNpZmljIGZ1bmN0aW9uIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixleGNlcHQpIHZvaWQgKm1hbGxvYyB7Ci0JLi4uCi19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIDx0dD5tYWxsb2MoKTwvdHQ+IGZ1bmN0aW9uIHJldHVybmluZyA8dHQ+dm9pZCAqPC90dD4uICBXaGlsZSB5b3UgcHJvYmFibHkgd291bGRuJ3Qgd2FudCB0byB3cml0ZSBhIGRpZmZlcmVudCBleGNlcHRpb24gaGFuZGxlciBmb3IgZXZlcnkgZnVuY3Rpb24sIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBoaWdoIGRlZ3JlZSBvZiBjb250cm9sIGlmIHlvdSBuZWVkIGl0LiAgICBXaGVuIHR5cGVtYXBzIGFyZSB1c2VkLCB0aGV5IG92ZXJyaWRlIGFueSBleGNlcHRpb24gaGFuZGxlciBkZWZpbmVkIHdpdGggPHR0PiVleGNlcHQ8L3R0Pi48cD4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBVc2luZyBUaGUgU1dJRyBleGNlcHRpb24gbGlicmFyeTwvaDI+Ci1UaGUgPHR0PmV4Y2VwdGlvbi5pPC90dD4gbGlicmFyeSBmaWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nIGxhbmd1YWdlIGluZGVwZW5kZW50IGV4Y2VwdGlvbnMgaW4geW91ciBpbnRlcmZhY2VzLiAgICBUbyB1c2UgaXQsIHNpbXBseSBwdXQgYW4gIjx0dD4laW5jbHVkZSBleGNlcHRpb24uaTwvdHQ+IiBpbiB5b3VyIGludGVyZmFjZSBmaWxlLiAgIFRoaXMgY3JlYXRlcyBhIGZ1bmN0aW9uPHR0PiBTV0lHX2V4Y2VwdGlvbigpPC90dD4gdGhhdCBjYW4gYmUgdXNlZCB0byByYWlzZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXhjZXB0aW9ucyBpbiBhIHBvcnRhYmxlIG1hbm5lci4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gTGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZXhjZXB0aW9uIGhhbmRsZXIKLSVpbmNsdWRlIGV4Y2VwdGlvbi5pICAgICAgIAotCi0lZXhjZXB0IHsKLQl0cnkgewotCQkkZnVuY3Rpb24KLQl9IGNhdGNoKFJhbmdlRXJyb3IpIHsKLQkJU1dJR19leGNlcHRpb24oU1dJR19WYWx1ZUVycm9yLCAiUmFuZ2UgRXJyb3IiKTsKLQl9IGNhdGNoKERpdmlzaW9uQnlaZXJvKSB7Ci0JCVNXSUdfZXhjZXB0aW9uKFNXSUdfRGl2aXNpb25CeVplcm8sICJEaXZpc2lvbiBieSB6ZXJvIik7Ci0JfSBjYXRjaChPdXRPZk1lbW9yeSkgewotCQlTV0lHX2V4Y2VwdGlvbihTV0lHX01lbW9yeUVycm9yLCAiT3V0IG9mIG1lbW9yeSIpOwotCX0gY2F0Y2goLi4uKSB7Ci0JCVNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJVbmtub3duIGV4Y2VwdGlvbiIpOwotCX0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQXMgYXJndW1lbnRzLCAgPHR0PlNXSUdfZXhjZXB0aW9uKCk8L3R0PiAgdGFrZXMgYW4gZXJyb3IgdHlwZSBjb2RlIChhbiBpbnRlZ2VyKSBhbmQgYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcuICAgVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgZXJyb3IgdHlwZXMgYXJlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5TV0lHX01lbW9yeUVycm9yCi1TV0lHX0lPRXJyb3IKLVNXSUdfUnVudGltZUVycm9yCi1TV0lHX0luZGV4RXJyb3IKLVNXSUdfVHlwZUVycm9yCi1TV0lHX0RpdmlzaW9uQnlaZXJvCi1TV0lHX092ZXJmbG93RXJyb3IKLVNXSUdfU3ludGF4RXJyb3IKLVNXSUdfVmFsdWVFcnJvcgotU1dJR19TeXN0ZW1FcnJvcgotU1dJR19Vbmtub3duRXJyb3IKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU2luY2UgdGhlIDx0dD5TV0lHX2V4Y2VwdGlvbigpPC90dD4gZnVuY3Rpb24gaXMgZGVmaW5lZCBhdCB0aGUgQy1sZXZlbCBpdCBjYW4gYmUgdXNlZCBlbHNld2hlcmUgaW4gU1dJRy4gVGhpcyBpbmNsdWRlcyB0eXBlbWFwcyBhbmQgaGVscGVyIGZ1bmN0aW9ucy4gICBUaGUgZXhjZXB0aW9uIGxpYnJhcnkgcHJvdmlkZXMgYSBsYW5ndWFnZS1pbmRlcGVuZGVudCBleGNlcHRpb24gaGFuZGxpbmcgbWVjaGFuaXNtLCBzbyBtYW55IG9mIFNXSUcncyBsaWJyYXJ5IGZpbGVzIG5vdyByZWx5IHVwb24gdGhlIGxpYnJhcnkgYXMgd2VsbC48cD4KLTxhIG5hbWU9Im43Ij48L2E+PGgyPiBEZWJ1Z2dpbmcgYW5kIG90aGVyIGludGVyZXN0aW5nIHVzZXMgZm9yICVleGNlcHQ8L2gyPgotU2luY2UgdGhlIDx0dD4lZXhjZXB0IDwvdHQ+ZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gZW5jYXBzdWxhdGUgdGhlIGFjdHVhbCBDIGZ1bmN0aW9uIGNhbGwsIGl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2luZyBvcGVyYXRpb25zLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQodGNsKSB7Ci0JcHJpbnRmKCJFbnRlcmluZyBmdW5jdGlvbiA6ICRuYW1lXG4iKTsKLQkkZnVuY3Rpb24KLQlwcmludGYoIkxlYXZpbmcgZnVuY3Rpb24gOiAkbmFtZVxuIik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWFsbG93cyB5b3UgdG8gIGZvbGxvdyB0aGUgZnVuY3Rpb24gY2FsbHMgaW4gb3JkZXIgdG8gc2VlIHdoZXJlIGFuIGFwcGxpY2F0aW9uIG1pZ2h0IGJlIGNyYXNoaW5nLiAgIDxwPgotPHA+Ci1FeGNlcHRpb24gaGFuZGxlcnMgY2FuIGFsc28gYmUgY2hhaW5lZC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lZXhjZXB0KHRjbCkgewotCXByaW50ZigiRW50ZXJpbmcgZnVuY3Rpb24gOiAkbmFtZVxuIik7Ci0JJGV4Y2VwdAotCXByaW50ZigiTGVhdmluZyBmdW5jdGlvbiA6ICRuYW1lXG4iKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQW55IHByZXZpb3VzbHkgZGVmaW5lZCBleGNlcHRpb24gaGFuZGxlciB3aWxsIGJlIGluc2VydGVkIGluIHBsYWNlIG9mIHRoZSAiPHR0PiRleGNlcHQ8L3R0PiIgc3ltYm9sLiAgQXMgYSByZXN1bHQsIHlvdSBjYW4gYXR0YWNoIGRlYnVnZ2luZyBjb2RlIHRvIGV4aXN0aW5nIGhhbmRsZXJzIGlmIG5lY2Vzc2FyeS4gICBIb3dldmVyLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgYW55IEMvQysrIGRlY2xhcmF0aW9ucyBhcmUgbWFkZSAoYXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFyZSBhcHBsaWVkIGltbWVkaWF0ZWx5IHRvIGFsbCBmdW5jdGlvbnMgdGhhdCBmb2xsb3cgdGhlbSkuPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gTW9yZSBFeGFtcGxlczwvaDI+Ci1CeSBub3csIHlvdSBrbm93IG1vc3Qgb2YgdGhlIGV4Y2VwdGlvbiBiYXNpY3MuICBTZWUgdGhlIFNXSUcgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBtb3JlIGV4YW1wbGVzIGFuZCBpZGVhcy4gIEZ1cnRoZXIgY2hhcHRlcnMgc2hvdyBob3cgdG8gZ2VuZXJhdGUgZXhjZXB0aW9ucyBpbiBzcGVjaWZpYyBzY3JpcHRpbmcgbGFuZ3VhZ2VzLjxwPgotPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjU3IDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0V4dGVuZGluZy5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9FeHRlbmRpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMmQyZi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0V4dGVuZGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg0OCArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkV4dGVuZGluZyBTV0lHPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4xMiBFeHRlbmRpbmcgU1dJRzwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPkludHJvZHVjdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5Db21waWxpbmcgYSBTV0lHIGV4dGVuc2lvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5TV0lHIG91dHB1dDwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5UaGUgTGFuZ3VhZ2UgY2xhc3MgKHNpbXBsZSB2ZXJzaW9uKTwvYT4KLTxsaT4gPGEgaHJlZj0iI241Ij5BIHRvdXIgb2YgU1dJRyBkYXRhdHlwZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNiI+VHlwZW1hcHMgKGZyb20gQyk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+RmlsZSBtYW5hZ2VtZW50PC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPk5hbWluZyBTZXJ2aWNlczwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5Db2RlIEdlbmVyYXRpb24gRnVuY3Rpb25zPC9hPgotPGxpPiA8YSBocmVmPSIjbjEwIj5Xcml0aW5nIGEgUmVhbCBMYW5ndWFnZSBNb2R1bGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPkMrKyBQcm9jZXNzaW5nPC9hPgotPGxpPiA8YSBocmVmPSIjbjEyIj5Eb2N1bWVudGF0aW9uIFByb2Nlc3Npbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTMiPlRoZSBGdXR1cmUgb2YgU1dJRzwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb248L2gyPgotVGhpcyBjaGFwdGVyIGF0dGVtcHRzIHRvIGRlc2NyaWJlIHRoZSBwcm9jZXNzIG9mIGV4dGVuZGluZyBTV0lHIHRvIHN1cHBvcnQgbmV3IHRhcmdldCBsYW5ndWFnZXMgYW5kIGRvY3VtZW50YXRpb24gbWV0aG9kcy4gRmlyc3QgYSB3b3JkIG9mIHdhcm5pbmctLVNXSUcgc3RhcnRlZCBvdXQgYmVpbmcgYSByZWxhdGl2ZWx5IHNpbXBsZSBzeXN0ZW0gZm9yIGJ1aWxkaW5nIGludGVyZmFjZXMgdG8gQU5TSSBDIHByb2dyYW1zLiBTaW5jZSB0aGVuLCBpdCBoYXMgZ3Jvd24gaW50byBzb21ldGhpbmcgbXVjaCBtb3JlIHRoYW4gdGhhdCAoYWx0aG91Z2ggSSdtIHN0aWxsIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoYXQpLiBBcyBhIHJlc3VsdCwgaXQgaXMgdW5kZXJnb2luZyBhIG51bWJlciBvZiBncm93aW5nIHBhaW5zLiBDZXJ0YWluIHBhcnRzIG9mIHRoZSBjb2RlIGhhdmUgYmVlbiByZXdyaXR0ZW4gYW5kIG90aGVycyBjYW4gcHJvYmFibHkgYmUgZGVzY3JpYmVkIGFzIGEgaGFja2lzaCBuaWdodG1hcmUuIEknbSBhbHdheXMgd29ya2luZyBvbiB3YXlzIHRvIGltcHJvdmUgdGhlIGltcGxlbWVudGF0aW9uLCBidXQgZXhwZWN0IHRvIGZpbmQgYSBmZXcgd2FydHMgYW5kIGluY29uc2lzdGVuY2llcy48cD4KLTxhIG5hbWU9Im4xNCI+PC9hPjxoMz4gUHJlcmVxdWlzaXRlczwvaDM+Ci1JbiBvcmRlciB0byBkZXZlbG9wIG9yIG1vZGlmeSBhIFNXSUcgbW9kdWxlLCBJIGFzc3VtZSB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPHVsPgotPGxpPlRoYXQgeW91IHVuZGVyc3RhbmQgdGhlIEMgQVBJIGZvciB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG9mIGludGVyZXN0LgotPGxpPllvdSBoYXZlIGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGhvdyBTV0lHIG9wZXJhdGVzIGFuZCBhIGdvb2QgaWRlYSBvZiBob3cgdHlwZW1hcHMgd29yay4KLTxsaT5UaGF0IHlvdSBoYXZlIHNvbWUgZXhwZXJpZW5jZSB3aXRoIEMrKy4gU1dJRyBpcyB3cml0dGVuIGluIEMrKywgYnV0IGRvZXNuJ3QgdXNlIGl0IG1heGltYWxseS4gSG93ZXZlciwgZmFtaWxpYXJpdHkgd2l0aCBjbGFzc2VzLCBpbmhlcml0YW5jZSwgYW5kIG9wZXJhdG9yIG92ZXJsb2FkaW5nIHdpbGwgaGVscC4KLTxsaT5UaGF0IHlvdSdyZSBqdXN0IGEgbGl0dGxlIGNyYXp5ICh0aGlzIHdpbGwgaGVscCBhbG90KS4KLTwvdWw+Ci08YSBuYW1lPSJuMTUiPjwvYT48aDM+IFNXSUcgT3JnYW5pemF0aW9uPC9oMz4KLVNXSUcgaXMgYnVpbHQgYXJvdW5kIGEgY2VudHJhbCBjb3JlIG9mIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBpbnRlcmZhY2UgZmlsZXMsIG1hbmFnaW5nIGRvY3VtZW50YXRpb24sIGhhbmRsaW5nIGRhdGF0eXBlcywgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLiBUaGlzIGNvZGUgaXMgY29udGFpbmVkIGluIHRoZSAiU1dJRyIgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24sIGJ1dCBjb250YWlucyBubyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhbnkgb25lIHNjcmlwdGluZyBsYW5ndWFnZS4gVGhlIHZhcmlvdXMgc2NyaXB0aW5nIGxhbmd1YWdlIG1vZHVsZXMgYXJlIGltcGxlbWVudGVkIGFzIEMrKyBjbGFzc2VzIGFuZCBmb3VuZCBpbiB0aGUgIk1vZHVsZXMiIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJpYnV0aW9uLiBUaGUgYmFzaWMgaWRlYSBiZWhpbmQgd3JpdGluZyBhIG1vZHVsZSBpcyB0aGF0IHlvdSB3cml0ZSBhIGxhbmd1YWdlIGNsYXNzIGNvbnRhaW5pbmcgYWJvdXQgYSBkb3plbiBtZXRob2RzIGZvciBjcmVhdGluZyB3cmFwcGVyIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGV0Yy4uLi4gVG8gdXNlIHRoZSBsYW5ndWFnZSwgeW91IHNpbXBseSBjcmVhdGUgYSBsYW5ndWFnZSAib2JqZWN0IiwgcGFzcyBpdCBvbiB0aGUgcGFyc2VyIGFuZCB5b3UgbWFnaWNhbGx5IGdldCB3cmFwcGVyIGNvZGUuIERvY3VtZW50YXRpb24gbW9kdWxlcyBhcmUgd3JpdHRlbiBpbiBhIHNpbWlsYXIgbWFubmVyLjxwPgotPHA+Ci1BbiBpbXBvcnRhbnQgYXNwZWN0IG9mIHRoZSBkZXNpZ24gaXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEFOU0kgQyBhbmQgQysrLiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiBTV0lHIHdhcyBkZXZlbG9wZWQgdG8gc3VwcG9ydCBBTlNJIEMgcHJvZ3JhbXMuIFRvIGFkZCBDKysgc3VwcG9ydCwgYW4gYWRkaXRpb25hbCAibGF5ZXIiIHdhcyBhZGRlZCB0byB0aGUgc3lzdGVtLS0tdGhhdCBpcywgYWxsIG9mIHRoZSBDKysgc3VwcG9ydCBpcyByZWFsbHkgYnVpbHQgb24gdG9wIG9mIHRoZSBBTlNJIEMgc3VwcG9ydC4gTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgYm90aCBDIGFuZCBDKysgYWx0aG91Z2ggYSBtb2R1bGUgd3JpdHRlbiBvbmx5IGZvciBDIGNhbiBzdGlsbCB3b3JrIHdpdGggQysrIChkdWUgdG8gdGhlIGxheWVyZWQgaW1wbGVtZW50YXRpb24pLiA8cD4KLTxwPgotQXMgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIFNXSUcsIGFsbCBmaWxlcyBpbiB0aGUgIlNXSUciIGRpcmVjdG9yeSBzaG91bGQgYmUgY29uc2lkZXJlZCAiY3JpdGljYWwuIiBNYWtpbmcgY2hhbmdlcyBoZXJlIGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGluIGFsbCBTV0lHIGxhbmd1YWdlIG1vZHVsZXMuICBXaGVuIG1ha2luZyBjdXN0b21pemF0aW9ucywgb25lIHNob3VsZCBvbmx5IGNvbnNpZGVyIGZpbGVzIGluIHRoZSAiTW9kdWxlcyIgZGlyZWN0b3J5IGlmIGF0IGFsbCBwb3NzaWJsZS48cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXI8L2gzPgotVGhlIHJlbWFpbmRlciBvZiB0aGlzIGNoYXB0ZXIgaXMgYSBib3R0b20tdXAgYXBwcm9hY2ggaXMgdG8gYnVpbGRpbmcgU1dJRyBtb2R1bGVzLiBJdCB3aWxsIHN0YXJ0IHdpdGggdGhlIGJhc2ljcyBhbmQgZ3JhZHVhbGx5IGJ1aWxkIHVwIGEgd29ya2luZyBsYW5ndWFnZSBtb2R1bGUsIGludHJvZHVjaW5nIG5ldyBjb25jZXB0cyBhcyBuZWVkZWQuPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gQ29tcGlsaW5nIGEgU1dJRyBleHRlbnNpb248L2gyPgotVGhlIGZpcnN0IG9yZGVyIG9mIGJ1c2luZXNzIGlzIHRoYXQgb2YgY29tcGlsaW5nIGFuIGV4dGVuc2lvbiB0byBTV0lHIGFuZCB1c2luZyBpdC4gVGhpcyBpcyB0aGUgZWFzeSBwYXJ0LjxwPgotPGEgbmFtZT0ibjE3Ij48L2E+PGgzPiBSZXF1aXJlZCBmaWxlczwvaDM+Ci1UbyBidWlsZCBhbnkgU1dJRyBleHRlbnNpb24geW91IG5lZWQgdG8gbG9jYXRlIHRoZSBmaWxlcyAiPHR0PnN3aWcuaDwvdHQ+IiBhbmQgIjx0dD5saWJzd2lnLmE8L3R0PiIuIEluIGEgdHlwaWNhbCBpbnN0YWxsYXRpb24sIHRoZXNlIHdpbGwgdXN1YWxseSBiZSBmb3VuZCBpbiA8dHQ+L3Vzci9sb2NhbC9pbmNsdWRlPC90dD4gYW5kIDx0dD4vdXNyL2xvY2FsL2xpYjwvdHQ+IHJlc3BlY3RpdmVseS4gQWxsIGV4dGVuc2lvbiBtb2R1bGVzIHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSAiPHR0PnN3aWcuaDwvdHQ+IiBoZWFkZXIgZmlsZSBhbmQgbGluayBhZ2FpbnN0IHRoZSA8dHQ+bGlic3dpZy5hPC90dD4gbGlicmFyeS4gPHA+Ci08YSBuYW1lPSJuMTgiPjwvYT48aDM+IFJlcXVpcmVkIEMrKyBjb21waWxlcjwvaDM+Ci1EdWUgdG8gbmFtZS1tYW5nbGluZyBpbiB0aGUgQysrIGNvbXBpbGVyICh3aGljaCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBjb21waWxlciBpbXBsZW1lbnRhdGlvbnMpLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgc2FtZSBDKysgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIFNXSUcuIElmIHlvdSBkb24ndCBrbm93IHdoaWNoIEMrKyBjb21waWxlciB3YXMgdXNlZCwgdHlwaW5nIGA8dHQ+c3dpZyAtdmVyc2lvbjwvdHQ+JyB3aWxsIGNhdXNlIFNXSUcgdG8gcHJpbnQgb3V0IGl0cyB2ZXJzaW9uIG51bWJlciBhbmQgdGhlIEMrKyBjb21waWxlciB0aGF0IHdhcyB1c2VkIHRvIGJ1aWxkIGl0LjxwPgotPGEgbmFtZT0ibjE5Ij48L2E+PGgzPiBXcml0aW5nIGEgbWFpbiBwcm9ncmFtPC9oMz4KLVRvIGdldCBhbnkgZXh0ZW5zaW9uIHRvIHdvcmssIGl0IGlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNtYWxsIDx0dD5tYWluKCk8L3R0PiBwcm9ncmFtIHRvIGNyZWF0ZSBhIGxhbmd1YWdlIG9iamVjdCBhbmQgc3RhcnQgdGhlIFNXSUcgcGFyc2VyLiBGb3IgZXhhbXBsZSA6PGJyPjxwPgotPGJsb2NrcXVvdGU+PHByZT4jaW5jbHVkZSAmbHQ7c3dpZy5oJmd0OwotI2luY2x1ZGUgInN3aWd0Y2wuaCIgICAgICAgICAgICAgICAgICAgICAgIC8vIExhbmd1YWdlIHNwZWNpZmljIGhlYWRlcgotCi1leHRlcm4gaW50IFNXSUdfbWFpbihpbnQsIGNoYXIgKiosIExhbmd1YWdlICosIERvY3VtZW50YXRpb24gKik7Ci1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQkKLQlUQ0wgKmwgPSBuZXcgVGNsOyAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTGFuZ3VhZ2Ugb2JqZWN0Ci0JaW5pdF9hcmdzKGFyZ2MsIGFyZ3YpOyAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBhcmdzCi0JcmV0dXJuIFNXSUdfbWFpbihhcmdjLCBhcmd2LCBsLCAwKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4yMCI+PC9hPjxoMz4gQ29tcGlsaW5nPC9oMz4KLVRvIGNvbXBpbGUgeW91ciBleHRlbnNpb24sIGRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgYysrIHRjbC5jeHggbWFpbi5jeHggLWxzd2lnIC1vIG15c3dpZwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2Ugd2UgZ2V0IGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFNXSUcgdGhhdCBjb21waWxlcyBUY2wgZXh0ZW5zaW9ucy48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBTV0lHIG91dHB1dDwvaDI+Ci1UaGUgb3V0cHV0IG9mIFNXSUcgaXMgYSBzaW5nbGUgZmlsZSB0aGF0IGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzIDo8cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoMTIuMS5wbmciPjwvY2VudGVyPjxwPgotPHA+Ci08cD4KLUR1cmluZyBjb2RlIGdlbmVyYXRpb24sIHRoZSB0aHJlZSBzZWN0aW9ucyBhcmUgY3JlYXRlZCBhcyBzZXBhcmF0ZSBmaWxlcyB0aGF0IGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZpbGUgaGFuZGxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+RklMRSAqZl9oZWFkZXI7ICAgICAgICAgICAgICAvLyBIZWFkZXIgc2VjdGlvbgotRklMRSAqZl93cmFwcGVyczsgICAgICAgICAgICAvLyBXcmFwcGVyIHNlY3Rpb24KLUZJTEUgKmZfaW5pdDsgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT24gZXhpdCwgdGhlIHRocmVlIGZpbGVzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBvdXRwdXQgZmlsZS48cD4KLTxwPgotV2hlbiBnZW5lcmF0aW5nIGNvZGUsIHlvdXIgbGFuZ3VhZ2UgbW9kdWxlIHNob3VsZCB1c2UgdGhlIEkvTyBmdW5jdGlvbnMgaW4gdGhlIEMgPHR0PiZsdDtzdGRpby5oJmd0OzwvdHQ+IGxpYnJhcnkuIFNXSUcgZG9lcyBub3QgdXNlIHRoZSBDKysgc3RyZWFtcyBsaWJyYXJ5LjxwPgotPHA+Ci1UaGUgdXNlIG9mIGVhY2ggb3V0cHV0IHNlY3Rpb24gY2FuIGJlIHJvdWdobHkgZGVzY3JpYmVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08dWw+Ci08bGk+VGhlIGhlYWRlciBzZWN0aW9uIGNvbnRhaW5zIGZvcndhcmQgZGVjbGFyYXRpb25zLCBoZWFkZXIgZmlsZXMsIGhlbHBlciBmdW5jdGlvbnMsIGFuZCBydW4tdGltZSBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyKS4gQWxsIGNvZGUgaW5jbHVkZWQgd2l0aCAleywlfSBhbHNvIGVuZHMgdXAgaGVyZS4KLTxsaT5UaGUgd3JhcHBlciBzZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUgU1dJRyBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuIAotPGxpPlRoZSBpbml0aWFsaXphdGlvbiBzZWN0aW9uIGlzIGEgc2luZ2xlIEMgZnVuY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUuIEZvciBsYXJnZSBtb2R1bGVzLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBxdWl0ZSBsYXJnZS4gSW4gYW55IGNhc2UsIG91dHB1dCB0byA8dHQ+Zl9pbml0PC90dD4gc2hvdWxkIGJlIHRyZWF0ZWQgd2l0aCBzb21lIGNhcmUgY29uc2lkZXJpbmcgdGhhdCB0aGUgZmlsZSBpcyBlc3NlbnRpYWxseSBvbmUgYmlnIEMgZnVuY3Rpb24uCi08L3VsPgotPGEgbmFtZT0ibjQiPjwvYT48aDI+IFRoZSBMYW5ndWFnZSBjbGFzcyAoc2ltcGxlIHZlcnNpb24pPC9oMj4KLVdyaXRpbmcgYSBuZXcgbGFuZ3VhZ2UgbW9kdWxlIGludm9sdmVzIGluaGVyaXRpbmcgZnJvbSB0aGUgU1dJRyA8dHQ+TGFuZ3VhZ2U8L3R0PiBjbGFzcyBhbmQgaW1wbGVtZW50aW5nIG1ldGhvZHMgZm9yIGEgZmV3IHZpcnR1YWwgZnVuY3Rpb25zLiBBIG1pbmltYWwgZGVmaW5pdGlvbiBvZiBhIG5ldyBMYW5ndWFnZSBtb2R1bGUgaXMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gRmlsZSA6IG15bGFuZy5oCi0vLyBBIG1pbmltYWwgU1dJRyBMYW5ndWFnZSBtb2R1bGUKLQotY2xhc3MgTVlMQU5HIDogcHVibGljIExhbmd1YWdlIHsKLXByaXZhdGU6Ci0JY2hhciAqbW9kdWxlOwotcHVibGljIDoKLQlNWUxBTkcoKSB7IAotCQltb2R1bGUgPSAwOwotCX07Ci0JLy8gVmlydHVhbCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIFNXSUcgcGFyc2VyCi0JIHZvaWQgcGFyc2VfYXJncyhpbnQsIGNoYXIgKmFyZ3ZbXSk7Ci0JIHZvaWQgcGFyc2UoKTsKLQkgdm9pZCBjcmVhdGVfZnVuY3Rpb24oY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIFBhcm1MaXN0ICopOwotCSB2b2lkIGxpbmtfdmFyaWFibGUoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICopOwotCSB2b2lkIGRlY2xhcmVfY29uc3QoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIGNoYXIgKik7Ci0JIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsKLQkgdm9pZCBoZWFkZXJzKHZvaWQpOwotCSB2b2lkIGNsb3NlKHZvaWQpOwotCSB2b2lkIHNldF9tb2R1bGUoY2hhciAqLGNoYXIgKiopOwotCSB2b2lkIGNyZWF0ZV9jb21tYW5kKGNoYXIgKiwgY2hhciAqKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotR2l2ZW4gdGhlIGFib3ZlIGhlYWRlciBmaWxlLCB3ZSBjYW4gY3JlYXRlIGEgdmVyeSBzaW1wbGlzdGljIGxhbmd1YWdlIG1vZHVsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEEgc2ltcGxlIFNXSUcgTGFuZ3VhZ2UgbW9kdWxlCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2luY2x1ZGUgInN3aWcuaCIKLSNpbmNsdWRlICJteWxhbmcuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OnBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLS8vCi0vLyBQYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgaW5pdGlhbGl6ZXMgdmFyaWFibGVzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6cGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JcHJpbnRmKCJHZXR0aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zXG4iKTsKLQl0eXBlbWFwX2xhbmcgPSAibXlsYW5nIjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB2b2lkIE1ZTEFORzo6cGFyc2UoKQotLy8KLS8vIFN0YXJ0IHBhcnNpbmcgYW4gaW50ZXJmYWNlIGZpbGUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgTVlMQU5HOjpwYXJzZSgpIHsKLQlmcHJpbnRmKHN0ZGVyciwiTWFraW5nIHdyYXBwZXJzIGZvciBNeSBMYW5ndWFnZVxuIik7Ci0JaGVhZGVycygpOwotCXl5cGFyc2UoKTsgICAgICAgLy8gUnVuIHRoZSBTV0lHIHBhcnNlcgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6c2V0X21vZHVsZShjaGFyICptb2RfbmFtZSxjaGFyICoqbW9kX2xpc3QpCi0vLwotLy8gU2V0cyB0aGUgbW9kdWxlIG5hbWUuICBEb2VzIG5vdGhpbmcgaWYgaXQncyBhbHJlYWR5IHNldCAoc28gaXQgY2FuCi0vLyBiZSBvdmVycmlkZGVuIGFzIGEgY29tbWFuZCBsaW5lIG9wdGlvbikuCi0vLwotLy8gbW9kX2xpc3QgaXMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsIG1vZHVsZXMuICBUaGlzCi0vLyBpcyByZWFsbHkgb25seSB1c2VmdWwgd2hlbiBidWlsZGluZyBzdGF0aWMgZXhlY3V0YWJsZXMuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OnNldF9tb2R1bGUoY2hhciAqbW9kX25hbWUsIGNoYXIgKiptb2RfbGlzdCkgewotICBpZiAobW9kdWxlKSByZXR1cm47Ci0gIG1vZHVsZSA9IG5ldyBjaGFyW3N0cmxlbihtb2RfbmFtZSkrMV07Ci0gIHN0cmNweShtb2R1bGUsbW9kX25hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmhlYWRlcnModm9pZCkKLS8vCi0vLyBHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGVzIGZvciBNWUxBTkcgaW50ZXJmYWNlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBNWUxBTkc6OmhlYWRlcnModm9pZCkgewotICAJZW1pdF9iYW5uZXIoZl9oZWFkZXIpOyAgICAgICAgLy8gUHJpbnQgdGhlIFNXSUcgYmFubmVyIG1lc3NhZ2UKLQlmcHJpbnRmKGZfaGVhZGVyLCIvKiBJbXBsZW1lbnRhdGlvbiA6IE15IExhbmd1YWdlICovXG5cbiIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6aW5pdGlhbGl6ZSh2b2lkKQotLy8KLS8vIFByb2R1Y2VzIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiAgIEFzc3VtZXMgdGhhdCB0aGUgbW9kdWxlCi0vLyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6aW5pdGlhbGl6ZSgpIHsKLQlpZiAoIW1vZHVsZSkgbW9kdWxlID0gInN3aWciOyAgICAgICAgIC8vIFBpY2sgYSBkZWZhdWx0IG5hbWUKLQkvLyBTdGFydCBnZW5lcmF0aW5nIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotCWZwcmludGYoZl9pbml0LCJpbnQgJXNfaW5pdGlhbGl6ZSgpIHtcbiIsIG1vZHVsZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpjbG9zZSh2b2lkKQotLy8KLS8vIEZpbmlzaCB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIENsb3NlIGFueSBhZGRpdGlvbmFsIGZpbGVzIGFuZAotLy8gcmVzb3VyY2VzIGluIHVzZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBNWUxBTkc6OmNsb3NlKHZvaWQpIHsKLQkvLyBGaW5pc2ggb2ZmIG91ciBpbml0IGZ1bmN0aW9uCi0JZnByaW50ZihmX2luaXQsIn1cbiIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6Y3JlYXRlX2NvbW1hbmQoY2hhciAqY25hbWUsIGNoYXIgKmluYW1lKQotLy8KLS8vIENyZWF0ZXMgYSBuZXcgY29tbWFuZCBmcm9tIGEgQyBmdW5jdGlvbi4KLS8vIAkJY25hbWUgPSBOYW1lIG9mIHRoZSBDIGZ1bmN0aW9uCi0vLwkJaW5hbWUgPSBOYW1lIG9mIGZ1bmN0aW9uIGluIHNjcmlwdGluZyBsYW5ndWFnZQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6Y3JlYXRlX2NvbW1hbmQoY2hhciAqY25hbWUsIGNoYXIgKmluYW1lKSB7Ci0JZnByaW50ZihmX2luaXQsIlx0IENyZWF0aW5nIGNvbW1hbmQgJXNcbiIsIGluYW1lKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmNyZWF0ZV9mdW5jdGlvbihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKmQsIFBhcm1MaXN0ICpsKQotLy8KLS8vIENyZWF0ZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBpbnRlcnByZXRlci4KLS8vCQluYW1lID0gTmFtZSBvZiByZWFsIEMgZnVuY3Rpb24KLS8vCQlpbmFtZSA9IE5hbWUgb2YgZnVuY3Rpb24gaW4gc2NyaXB0aW5nIGxhbmd1YWdlCi0vLwkJZCA9IFJldHVybiBkYXRhdHlwZQotLy8JCWwgPSBGdW5jdGlvbiBwYXJhbWV0ZXJzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgTVlMQU5HOjpjcmVhdGVfZnVuY3Rpb24oY2hhciAqbmFtZSwgY2hhciAqaW5hbWUsIERhdGFUeXBlICpkLCBQYXJtTGlzdCAqbCkgewotCWZwcmludGYoZl93cmFwcGVycywiXG53cmFwXyVzKCkgeyB9XG5cbiIsIG5hbWUpOwotCWNyZWF0ZV9jb21tYW5kKG5hbWUsaW5hbWUpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpsaW5rX3ZhcmlhYmxlKGNoYXIgKm5hbWUsIGNoYXIgKmluYW1lLCBEYXRhVHlwZSAqdCkKLS8vCi0vLyBDcmVhdGUgYSBsaW5rIHRvIGEgQyB2YXJpYWJsZS4KLS8vCQluYW1lID0gTmFtZSBvZiBDIHZhcmlhYmxlCi0vLwkJaW5hbWUgPSBOYW1lIG9mIHZhcmlhYmxlIGluIHNjcmlwdGluZyBsYW5ndWFnZQotLy8JCXQgPSBEYXRhdHlwZSBvZiB0aGUgdmFyaWFibGUKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBNWUxBTkc6OmxpbmtfdmFyaWFibGUoY2hhciAqbmFtZSwgY2hhciAqaW5hbWUsIERhdGFUeXBlICp0KSB7Ci0JZnByaW50ZihmX2luaXQsIlx0IExpbmtpbmcgdmFyaWFibGUgOiAlc1xuIiwgaW5hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKQotLy8KLS8vIE1ha2VzIGEgY29uc3RhbnQuIAotLy8JCW5hbWUgPSBOYW1lIG9mIHRoZSBjb25zdGFudAotLy8gCQlpbmFtZSA9IFNjcmlwdGluZyBsYW5ndWFnZSBuYW1lIG9mIGNvbnN0YW50Ci0vLwkJdHlwZSA9IERhdGF0eXBlIG9mIHRoZSBjb25zdGFudAotLy8JCXZhbHVlID0gQ29uc3RhbnQgdmFsdWUgKGFzIGEgc3RyaW5nKQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKSB7Ci0JZnByaW50ZihmX2luaXQsIlx0IENyZWF0aW5nIGNvbnN0YW50IDogJXMgPSAlc1xuIiwgbmFtZSwgdmFsdWUpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyBjb21waWxlIG91ciBuZXcgbGFuZ3VhZ2UsIHdlIHdyaXRlIGEgbWFpbiBwcm9ncmFtIChhcyBkZXNjcmliZWQgcHJldmlvdXNseSkgYW5kIGRvIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgZysrIG1haW4uY3h4IG15bGFuZy5jeHggLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbHN3aWcgLW8gbXlzd2lnCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgdHJ5IHJ1bm5pbmcgdGhpcyBuZXcgdmVyc2lvbiBvZiBTV0lHIG9uIGEgZmV3IGludGVyZmFjZSBmaWxlcyB0byBzZWUgd2hhdCBoYXBwZW5zLiBUaGUgdmFyaW91cyA8dHQ+cHJpbnRmKCk8L3R0PiBzdGF0ZW1lbnRzIHdpbGwgc2hvdyB5b3Ugd2hlcmUgb3V0cHV0IGFwcGVhcnMgYW5kIGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLiBGb3IgZXhhbXBsZSwgaWYgd2UgcnVuIHRoaXMgbW9kdWxlIG9uIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBleGFtcGxlLmkgKi8KLSVtb2R1bGUgZXhhbXBsZQotJXsKLS8qIFB1dCBoZWFkZXJzIGFuZCBvdGhlciBkZWNsYXJhdGlvbnMgaGVyZSAqLwotJX0KLQotLy8gQSBmdW5jdGlvbgotZXh0ZXJuIGRvdWJsZSBmb28oZG91YmxlIGEsIGRvdWJsZSBiKTsKLQotLy8gQSB2YXJpYWJsZQotZXh0ZXJuIGludCBiYXI7Ci0KLS8vIEEgY29uc3RhbnQKLSNkZWZpbmUgU1BBTSA0MgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSBnZXQgdGhlIGZvbGxvd2luZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qCi0gKiBGSUxFIDogZXhhbXBsZV93cmFwLmMKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IDoKLSAqIFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAoU1dJRykKLSAqIFZlcnNpb24gMS4xICAoRmluYWwpCi0gKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcKLSAqIFRoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGlzIGZpbGUgaW4gYW55IG1hbm5lciBwcm92aWRlZAotICogdGhpcyBub3RpY2UgcmVtYWlucyBpbnRhY3QuCi0gKgotICogRG8gbm90IG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUtLWNoYW5nZXMgd2lsbCBiZSBsb3N0IQotICoKLSAqLwotCi0KLSNkZWZpbmUgU1dJR0NPREUKLS8qIEltcGxlbWVudGF0aW9uIDogTXkgTGFuZ3VhZ2UgKi8KLQotCi0vKiBQdXQgaGVhZGVycyBhbmQgb3RoZXIgZGVjbGFyYXRpb25zIGhlcmUgKi8KLWV4dGVybiBkb3VibGUgZm9vKGRvdWJsZSAsZG91YmxlICk7Ci1leHRlcm4gaW50ICBiYXI7Ci0KLXdyYXBfZm9vKCkgeyB9Ci0KLWludCBleGFtcGxlX2luaXRpYWxpemUoKSB7Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIGZvbwotICAgICAgICAgTGlua2luZyB2YXJpYWJsZSA6IGJhcgotICAgICAgICAgQ3JlYXRpbmcgY29uc3RhbnQgOiBTUEFNID0gNDIKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTG9va2luZyBhdCB0aGUgbGFuZ3VhZ2UgbW9kdWxlIGFuZCB0aGUgb3V0cHV0IGdpdmVzIHNvbWUgaWRlYSBvZiBob3cgdGhpbmdzIGFyZSBzdHJ1Y3R1cmVkLiAgVGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZpbGUgaXMgYSBiYW5uZXIgbWVzc2FnZSBwcmludGVkIGJ5IHRoZSA8dHQ+ZW1pdF9iYW5uZXIoKTwvdHQ+IGZ1bmN0aW9uLiAgICBUaGUgImV4dGVybiIgZGVjbGFyYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkIGJ5IHRoZSBTV0lHIGNvbXBpbGVyIHdoZW4gdXNlIGFuIGV4dGVybiBtb2RpZmllci4gICBUaGUgd3JhcHBlciBmdW5jdGlvbnMgYXBwZWFyIGFmdGVyIGFsbCBvZiB0aGUgaGVhZGVycyBhbmQgZm9yd2FyZCBkZWNsYXJhdGlvbnMuICBGaW5hbGx5LCAgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIHdyaXR0ZW4uPHA+Ci08cD4KLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBtaW5pbWFsIG1vZHVsZSBpcyBlbm91Z2ggdG8gdXNlIHZpcnR1YWxseSBhbGwgYXNwZWN0cyBvZiBTV0lHLiBJZiB3ZSBmZWVkIFNXSUcgYSBDKysgZmlsZSwgd2Ugd2lsbCBzZWUgb3VyIGxvdy1sZXZlbCBtb2R1bGUgZnVuY3Rpb25zIGJlaW5nIGNhbGxlZCBldmVuIHRob3VnaCB3ZSBoYXZlIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYW55IEMrKyBoYW5kbGluZyAodGhpcyBpcyBkdWUgdG8gdGhlIGxheWVyZWQgYXBwcm9hY2ggb2YgaW1wbGVtZW50aW5nIEMrKyBvbiB0b3Agb2YgQykuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlIGV4YW1wbGUKLXN0cnVjdCBWZWN0b3IgewotICAgICAgICBkb3VibGUgeCx5LHo7Ci0gICAgICAgIFZlY3RvcigpOwotICAgICAgICB+VmVjdG9yKCk7Ci0gICAgICAgIGRvdWJsZSBtYWduaXR1ZGUoKTsKLX07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXByb2R1Y2VzIGFjY2Vzc29yIGZ1bmN0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qCi0gKiBGSUxFIDogZXhhbXBsZV93cmFwLmMKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IDoKLSAqIFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAoU1dJRykKLSAqIFZlcnNpb24gMS4xICAoRmluYWwpCi0gKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcKLSAqIFRoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGlzIGZpbGUgaW4gYW55IG1hbm5lciBwcm92aWRlZAotICogdGhpcyBub3RpY2UgcmVtYWlucyBpbnRhY3QuCi0gKgotICogRG8gbm90IG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUtLWNoYW5nZXMgd2lsbCBiZSBsb3N0IQotICoKLSAqLwotCi0KLSNkZWZpbmUgU1dJR0NPREUKLS8qIEltcGxlbWVudGF0aW9uIDogTXkgTGFuZ3VhZ2UgKi8KLQotc3RhdGljIGRvdWJsZSAgVmVjdG9yX3hfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgIHZhbCkgewotICAgIG9iai0mZ3Q7eCA9IHZhbDsKLSAgICByZXR1cm4gdmFsOwotfQotCi13cmFwX1ZlY3Rvcl94X3NldCgpIHsgfQotCi1zdGF0aWMgZG91YmxlICBWZWN0b3JfeF9nZXQoVmVjdG9yICpvYmopIHsKLSAgICBkb3VibGUgIHJlc3VsdDsKLSAgICByZXN1bHQgPSAoZG91YmxlICkgb2JqLSZndDt4OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXdyYXBfVmVjdG9yX3hfZ2V0KCkgeyB9Ci0KLXN0YXRpYyBkb3VibGUgIFZlY3Rvcl95X3NldChWZWN0b3IgKm9iaiwgZG91YmxlICB2YWwpIHsKLSAgICBvYmotJmd0O3kgPSB2YWw7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotd3JhcF9WZWN0b3JfeV9zZXQoKSB7IH0KLQotc3RhdGljIGRvdWJsZSAgVmVjdG9yX3lfZ2V0KFZlY3RvciAqb2JqKSB7Ci0gICAgZG91YmxlICByZXN1bHQ7Ci0gICAgcmVzdWx0ID0gKGRvdWJsZSApIG9iai0mZ3Q7eTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi13cmFwX1ZlY3Rvcl95X2dldCgpIHsgfQotCi1zdGF0aWMgZG91YmxlICBWZWN0b3Jfel9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSAgdmFsKSB7Ci0gICAgb2JqLSZndDt6ID0gdmFsOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXdyYXBfVmVjdG9yX3pfc2V0KCkgeyB9Ci0KLXN0YXRpYyBkb3VibGUgIFZlY3Rvcl96X2dldChWZWN0b3IgKm9iaikgewotICAgIGRvdWJsZSAgcmVzdWx0OwotICAgIHJlc3VsdCA9IChkb3VibGUgKSBvYmotJmd0O3o7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotd3JhcF9WZWN0b3Jfel9nZXQoKSB7IH0KLQotc3RhdGljIFZlY3RvciAqbmV3X1ZlY3RvcigpIHsKLSAgICByZXR1cm4gbmV3IFZlY3RvcigpOwotfQotCi13cmFwX25ld19WZWN0b3IoKSB7IH0KLQotc3RhdGljIHZvaWQgZGVsZXRlX1ZlY3RvcihWZWN0b3IgKm9iaikgewotICAgIGRlbGV0ZSBvYmo7Ci19Ci0KLXdyYXBfZGVsZXRlX1ZlY3RvcigpIHsgfQotCi1zdGF0aWMgZG91YmxlICBWZWN0b3JfbWFnbml0dWRlKFZlY3RvciAqb2JqKSB7Ci0gICAgZG91YmxlICBfcmVzdWx0ID0gKGRvdWJsZSApb2JqLSZndDttYWduaXR1ZGUoKTsKLSAgICByZXR1cm4gX3Jlc3VsdDsKLX0KLQotd3JhcF9WZWN0b3JfbWFnbml0dWRlKCkgeyB9Ci0KLWludCBleGFtcGxlX2luaXRpYWxpemUoKSB7Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIFZlY3Rvcl94X3NldAotICAgICAgICAgQ3JlYXRpbmcgY29tbWFuZCBWZWN0b3JfeF9nZXQKLSAgICAgICAgIENyZWF0aW5nIGNvbW1hbmQgVmVjdG9yX3lfc2V0Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIFZlY3Rvcl95X2dldAotICAgICAgICAgQ3JlYXRpbmcgY29tbWFuZCBWZWN0b3Jfel9zZXQKLSAgICAgICAgIENyZWF0aW5nIGNvbW1hbmQgVmVjdG9yX3pfZ2V0Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIG5ld19WZWN0b3IKLSAgICAgICAgIENyZWF0aW5nIGNvbW1hbmQgZGVsZXRlX1ZlY3RvcgotICAgICAgICAgQ3JlYXRpbmcgY29tbWFuZCBWZWN0b3JfbWFnbml0dWRlCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdpdGgganVzdCBhIGxpdHRsZSB3b3JrLCB3ZSBhbHJlYWR5IHNlZSB0aGF0IFNXSUcgZG9lcyBxdWl0ZSBhbG90IGZvciB1cy4gICBOb3cgb3VyIHRhc2sgaXMgdG8gZmlsbCBpbiB0aGUgdmFyaW91cyBMYW5ndWFnZSBtZXRob2RzIHdpdGggdGhlIHJlYWwgY29kZSBuZWVkZWQgdG8gcHJvZHVjZSBhIHdvcmtpbmcgbW9kdWxlLiAgIEJlZm9yZSBkb2luZyB0aGF0LCB3ZSBmaXJzdCBuZWVkIHRvIHRha2UgYSB0b3VyIG9mIHNvbWUgaW1wb3J0YW50IFNXSUcgZGF0YXR5cGVzIGFuZCBmdW5jdGlvbnMuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQSB0b3VyIG9mIFNXSUcgZGF0YXR5cGVzPC9oMj4KLVdoaWxlIFNXSUcgaGFzIGJlY29tZSBzb21ld2hhdCBjb21wbGljYXRlZCBvdmVyIHRoZSBsYXN0IHllYXIsIGl0cyBpbnRlcm5hbCBvcGVyYXRpb24gaXMgYmFzZWQgb24ganVzdCBhIGZldyBmdW5kYW1lbnRhbCBkYXRhdHlwZXMuIFRoZXNlIHR5cGVzIGFyZSBkZXNjcmliZWQgbm93IGFsdGhvdWdoIGV4YW1wbGVzIG9mIHVzaW5nIHRoZSB2YXJpb3VzIGRhdGF0eXBlcyBhcmUgc2hvd24gbGF0ZXIuPHA+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IFRoZSBEYXRhVHlwZSBjbGFzczwvaDM+Ci1BbGwgQyBkYXRhdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0KLWNsYXNzIERhdGFUeXBlIHsKLXB1YmxpYzoKLQlEYXRhVHlwZSgpOwotCURhdGFUeXBlKERhdGFUeXBlICopOwotCX5EYXRhVHlwZSgpOwotCWludCAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgIC8vIFNXSUcgVHlwZSBjb2RlCi0JY2hhciAgICAgICAgbmFtZVtNQVhOQU1FXTsgICAgICAgLy8gTmFtZSBvZiB0eXBlCi0JY2hhciAgICAgICAgaXNfcG9pbnRlcjsgICAgICAgICAgLy8gSXMgdGhpcyBhIHBvaW50ZXI/Ci0JY2hhciAgICAgICAgaW1wbGljaXRfcHRyOyAgICAgICAgLy8gSW1wbGljaXQgcHRyCi0JY2hhciAgICAgICAgaXNfcmVmZXJlbmNlOyAgICAgICAgLy8gQSBDKysgcmVmZXJlbmNlIHR5cGUKLQljaGFyICAgICAgICBzdGF0dXM7ICAgICAgICAgICAgICAvLyBJcyB0aGlzIGRhdGF0eXBlIHJlYWQtb25seT8KLQljaGFyICAgICAgICAqcXVhbGlmaWVyOyAgICAgICAgICAvLyBBIHF1YWxpZmllciBzdHJpbmcgKGllLiBjb25zdCkuCi0JY2hhciAgICAgICAgKmFycmF5c3RyOyAgICAgICAgICAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgYXJyYXkgcGFydAotCWludCAgICAgICAgIGlkOyAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpZmllciAodW5pcXVlIGZvciBldmVyeSB0eXBlKS4KLQkvLyBPdXRwdXQgbWV0aG9kcwotCWNoYXIgICAgICAgKnByaW50X3R5cGUoKTsgICAgICAgIC8vIFJldHVybiBzdHJpbmcgY29udGFpbmluZyBkYXRhdHlwZQotCWNoYXIgICAgICAgKnByaW50X2Z1bGwoKTsgICAgICAgIC8vIFJldHVybiBzdHJpbmcgd2l0aCBmdWxsIGRhdGF0eXBlCi0JY2hhciAgICAgICAqcHJpbnRfY2FzdCgpOyAgICAgICAgLy8gUmV0dXJuIHN0cmluZyBmb3IgdHlwZSBjYXN0aW5nCi0JY2hhciAgICAgICAqcHJpbnRfbWFuZ2xlKCk7ICAgICAgLy8gUmV0dXJuIG1hbmdsZWQgdmVyc2lvbiBvZiB0eXBlCi0JY2hhciAgICAgICAqcHJpbnRfbWFuZ2xlX2RlZmF1bHQoKTsgLy8gRGVmYXVsdCBtYW5nbGluZyBzY2hlbWUKLQljaGFyICAgICAgICpwcmludF9yZWFsKCk7ICAgICAgICAvLyBQcmludCB0aGUgcmVhbCBkYXRhdHlwZQotCWNoYXIgICAgICAgKnByaW50X2FycmF5Y2FzdCgpOyAgIC8vIFByaW50cyBhbiBhcnJheSBjYXN0Ci0JLy8gQXJyYXkgcXVlcnkgZnVuY3Rpb25zCi0JaW50ICAgICAgICBhcnJheV9kaW1lbnNpb25zKCk7ICAgLy8gUmV0dXJuIG51bWJlciBvZiBhcnJheSBkaW1lbnNpb25zIChpZiBhbnkpCi0JY2hhciAgICAgICAqZ2V0X2RpbWVuc2lvbihpbnQpOyAgLy8gUmV0dXJuIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIGRpbWVuc2lvbgotfTsKLQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZnVuZGFtZW50YWwgQyBkYXRhdHlwZXMgYXJlIGdpdmVuIGEgdW5pcXVlIG51bWVyaWNhbCBjb2RlIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgPHR0PnR5cGU8L3R0PiBmaWVsZC4gVGhlIGN1cnJlbnQgbGlzdCBvZiB0eXBlcyBpcyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5DIERhdGF0eXBlICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUcgVHlwZSBDb2RlCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0lOVAotc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9TSE9SVAotbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9MT05HCi1jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NIQVIKLWZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRkxPQVQKLWRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1ZPSUQKLXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgIFRfVUlOVAotdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgVF9VU0hPUlQKLXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgICAgIFRfVUxPTkcKLXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICAgIFRfVUNIQVIKLXNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgIFRfU0NIQVIKLWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQk9PTAotJmx0O3VzZXImZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9VU0VSCi1lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0VSUk9SCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSA8dHQ+VF9VU0VSPC90dD4gdHlwZSBpcyB1c2VkIGZvciBhbGwgZGVyaXZlZCBkYXRhdHlwZXMgaW5jbHVkaW5nIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMuIFRoZSA8dHQ+VF9FUlJPUjwvdHQ+IHR5cGUgaW5kaWNhdGVzIHRoYXQgYSBwYXJzZS90eXBlIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQgd2VudCB1bmRldGVjdGVkIChhcyBmYXIgYXMgSSBrbm93IHRoaXMgZG9lc24ndCBoYXBwZW4pLjxwPgotPHA+Ci1UaGUgPHR0Pm5hbWVbXTwvdHQ+IGZpZWxkIGNvbnRhaW5zIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgZGF0YXR5cGUgYXMgc2VlbiBieSB0aGUgcGFyc2VyIGFuZCBpcyBjdXJyZW50bHkgbGltaXRlZCB0byBhIG1heGltdW0gb2YgOTYgYnl0ZXMgKG1vcmUgdGhhbiBlbm91Z2ggZm9yIG1vc3QgYXBwbGljYXRpb25zKS4gIElmIGEgdHlwZWRlZiBoYXMgYmVlbiB1c2VkLCB0aGUgbmFtZSBmaWVsZCBjb250YWlucyB0aGUgYWN0dWFsIG5hbWUgdXNlZCwgbm90IHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgQyBkYXRhdHlwZS4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+QyBEYXRhdHlwZSAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgbmFtZVtdCi1kb3VibGUgICAgICAgICAgICAgICAgVF9ET1VCTEUgICAgICAgICAgICBkb3VibGUKLXVuc2lnbmVkIGludCAgICAgICAgICBUX1VJTlQgICAgICAgICAgICAgIHVuc2lnbmVkIGludAotc2lnbmVkIGxvbmcgICAgICAgICAgIFRfTE9ORyAgICAgICAgICAgICAgc2lnbmVkIGxvbmcKLXN0cnVjdCBWZWN0b3IgICAgICAgICBUX1VTRVIgICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IKLVJlYWwgICAgICAgICAgICAgICAgICBUX0RPVUJMRSAgICAgICAgICAgIFJlYWwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQyBxdWFsaWZpZXJzIHN1Y2ggYXMgIjx0dD5jb25zdDwvdHQ+IiBvciAiPHR0PnZvbGF0aWxlPC90dD4iIGFyZSBzdG9yZWQgc2VwYXJhdGVseSBpbiB0aGUgPHR0PnF1YWxpZmllcjwvdHQ+IGZpZWxkLiBJbiBvcmRlciB0byBwcm9kdWNlIHVzYWJsZSB3cmFwcGVyIGNvZGUsIFNXSUcgb2Z0ZW4gbmVlZHMgdG8gc3RyaXAgdGhlIHF1YWxpZmllcnMuIEZvciBleGFtcGxlLCB0cnlpbmcgdG8gYXNzaWduIGEgcGFzc2VkIGZ1bmN0aW9uIGFyZ3VtZW50IGludG8gYSB0eXBlIG9mICI8dHQ+Y29uc3QgaW50PC90dD4iIHdpbGwgaXJyaXRhdGUgbW9zdCBjb21waWxlcnMuIFVuZm9ydHVuYXRlbHksIHRoaXMga2luZCBvZiBhc3NpZ25tZW50IGlzIHVuYXZvaWRhYmxlIHdoZW4gY29udmVydGluZyBhcmd1bWVudHMgYmV0d2VlbiBhIHNjcmlwdGluZyBhbmQgQyByZXByZXNlbnRhdGlvbi48cD4KLTxwPgotVGhlIDx0dD5pc19wb2ludGVyPC90dD4gZmllbGQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgcGFydGljdWxhciBkYXRhdHlwZSBpcyBhIHBvaW50ZXIuIFRoZSB2YWx1ZSBvZiA8dHQ+aXNfcG9pbnRlcjwvdHQ+IGRldGVybWluZXMgdGhlIGxldmVsIG9mIGluZGlyZWN0aW9uIHVzZWQuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5DIERhdGF0eXBlICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAgaXNfcG9pbnRlcgotZG91YmxlICogICAgICAgICAgICAgVF9ET1VCTEUgICAgICAgICAgICAgIDEKLWludCAqKiogICAgICAgICAgICAgIFRfSU5UICAgICAgICAgICAgICAgICAzCi1jaGFyICogICAgICAgICAgICAgICBUX0NIQVIgICAgICAgICAgICAgICAgMQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmltcGxpY2l0X3B0cjwvdHQ+IGZpZWxkIGlzIGFuIGludGVybmFsbHkgdXNlZCBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIHRvIHByb3Blcmx5IGhhbmRsZSB0aGUgdXNlIG9mIHBvaW50ZXJzIGluIHR5cGVkZWYgc3RhdGVtZW50cy4gSG93ZXZlciwgZm9yIHRoZSBjdXJpb3VzLCBpbiBpbmRpY2F0ZXMgdGhlIGxldmVsIG9mIGluZGlyZWN0aW9uIGltcGxpY2l0bHkgZGVmaW5lZCBpbiBhIGRhdGF0eXBlLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBjaGFyICpTdHJpbmc7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWlzIHJlcHJlc2VudGVkIGJ5IGEgZGF0YXR5cGUgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGUgICAgICAgICAgID0gVF9DSEFSOwotbmFtZVtdICAgICAgICAgPSAiU3RyaW5nIjsKLWlzX3BvaW50ZXIgICAgID0gMTsKLWltcGxpY2l0X3B0ciAgID0gMTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm9ybWFsbHksIGxhbmd1YWdlIG1vZHVsZXMgZG8gbm90IHdvcnJ5IGFib3V0IHRoZSA8dHQ+aW1wbGljaXRfcHRyIDwvdHQ+ZmllbGQuPHA+Ci08cD4KLUMrKyByZWZlcmVuY2VzIGFyZSBpbmRpY2F0ZWQgYnkgdGhlIDx0dD5pc19yZWZlcmVuY2U8L3R0PiBmaWVsZC4gQnkgZGVmYXVsdCwgdGhlIHBhcnNlciBjb252ZXJ0cyByZWZlcmVuY2VzIGludG8gcG9pbnRlcnMgd2hpY2ggbWFrZXMgdGhlbSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG90aGVyIHBvaW50ZXIgZGF0YXR5cGVzLiBIb3dldmVyLCBrbm93aW5nIHRoYXQgc29tZXRoaW5nIGlzIGEgcmVmZXJlbmNlIGVmZmVjdHMgc29tZSBjb2RlIGdlbmVyYXRpb24gcHJvY2VkdXJlcyBzbyB0aGlzIGZpZWxkIGNhbiBiZSBjaGVja2VkIHRvIHNlZSBpZiBhIGRhdGF0eXBlIHJlYWxseSBpcyBhIEMrKyByZWZlcmVuY2UuPHA+Ci08cD4KLVRoZSA8dHQ+YXJyYXlzdHI8L3R0PiBmaWVsZCBpcyB1c2VkIHRvIGhvbGQgdGhlIGFycmF5IGRpbWVuc2lvbnMgb2YgYXJyYXkgZGF0YXR5cGVzLiBUaGUgZGltZW5zaW9ucyBhcmUgc2ltcGx5IHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+QyBEYXRhdHlwZSAgICAgICAgICAgIHR5cGUgICAgICAgICAgaXNfcG9pbnRlciAgICAgICAgYXJyYXlzdHIKLWRvdWJsZSBhWzUwXSAgICAgICAgICBUX0RPVUJMRSAgICAgICAxICAgICAgICAgICAgICAgIFs1MF0KLWludCBiWzIwXVszMF1bNTBdICAgICBUX0lOVCAgICAgICAgICAxICAgICAgICAgICAgICAgIFsyMF1bMzBdWzUwXQotY2hhciAqW01BWF0gICAgICAgICAgIFRfQ0hBUiAgICAgICAgIDIgICAgICAgICAgICAgICAgW01BWF0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBjb252ZXJ0cyBhbGwgYXJyYXlzIGludG8gcG9pbnRlcnMuIFRodXMgYSAiPHR0PmRvdWJsZSBbNTBdPC90dD4iIGlzIHJlYWxseSBqdXN0IGEgc3BlY2lhbCB2ZXJzaW9uIG9mICI8dHQ+ZG91YmxlICo8L3R0PiIuIElmIGEgZGF0YXR5cGUgaXMgbm90IGRlY2xhcmVkIGFzIGFuIGFycmF5LCB0aGUgPHR0PmFycmF5c3RyPC90dD4gZmllbGQgY29udGFpbnMgdGhlIE5VTEwgcG9pbnRlci48cD4KLTxwPgotQSBjb2xsZWN0aW9uIG9mICJvdXRwdXQiIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSBmb3IgZGF0YXR5cGVzLiBUaGUgbmFtZXMgb2YgdGhlc2UgbWV0aG9kcyBhcmUgbWFpbmx5ICJoaXN0b3JpY2FsIiBpbiB0aGF0IHRoZXkgZG9uJ3QgYWN0dWFsbHkgInByaW50IiBhbnl0aGluZywgYnV0IG5vdyByZXR1cm4gY2hhcmFjdGVyIHN0cmluZ3MgaW5zdGVhZC4gQXNzdW1pbmcgdGhhdCA8dHQ+dDwvdHQ+IGlzIGEgZGF0YXR5cGUgcmVwcmVzZW50aW5nIHRoZSBDIGRhdGF0eXBlICI8dHQ+Y29uc3QgaW50ICo8L3R0PiIsIGhlcmUncyB3aGF0IHRoZSBtZXRob2RzIHByb2R1Y2UgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPk9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dAotdC0mZ3Q7cHJpbnRfdHlwZSgpICAgICAgICAgICAgICAgICAgICAgaW50ICoKLXQtJmd0O3ByaW50X2Z1bGwoKSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqCi10LSZndDtwcmludF9jYXN0KCkgICAgICAgICAgICAgICAgICAgICAoaW50ICopCi10LSZndDtwcmludF9tYW5nbGUoKSAgICAgICAgICAgICAgICAgICAmbHQ7IGxhbmd1YWdlIGRlcGVuZGVudCAmZ3Q7Ci10LSZndDtwcmludF9tYW5nbGVfZGVmYXVsdCgpICAgICAgICAgICBfaW50X3AKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQSBmZXcgYWRkaXRpb25hbCBvdXRwdXQgbWV0aG9kcyBhcmUgcHJvdmlkZWQgZm9yIGRlYWxpbmcgd2l0aCBhcnJheXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGUgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgT3V0cHV0Ci1pbnQgYVs1MF0gICAgICAgICAgICB0LSZndDtwcmludF90eXBlKCkgICAgICAgICAgICAgIGludCAqCi1pbnQgYVs1MF0gICAgICAgICAgICB0LSZndDtwcmludF9yZWFsKCkgICAgICAgICAgICAgIGludCBbNTBdCi1pbnQgYVs1MF0gICAgICAgICAgICB0LSZndDtwcmludF9hcnJheWNhc3QoKSAgICAgICAgIChpbnQgKikKLWludCBhWzUwXVs1MF0gICAgICAgIHQtJmd0O3ByaW50X2FycmF5Y2FzdCgpICAgICAgICAgKGludCAoKilbNTBdKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGFycmF5cyBpcyBhbHNvIGF2YWlsYWJsZSB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZSAgICAgICAgICAgICAgICAgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICBSZXN1bHQKLWludCBhWzUwXSAgICAgICAgICAgIHQtJmd0O2FycmF5X2RpbWVuc2lvbigpICAgICAgICAgMQotaW50IGFbNTBdICAgICAgICAgICAgdC0mZ3Q7Z2V0X2RpbWVuc2lvbigwKSAgICAgICAgICA1MAotaW50IGJbTUFYTl1bMTBdICAgICAgdC0mZ3Q7YXJyYXlfZGltZW5zaW9uKCkgICAgICAgICAyCi1pbnQgYltNQVhOXVsxMF0gICAgICB0LSZndDtnZXRfZGltZW5zaW9uKDApICAgICAgICAgIE1BWE4KLWludCBiW01BWE5dWzEwXSAgICAgIHQtJmd0O2dldF9kaW1lbnNpb24oMSkgICAgICAgICAgMTAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5EYXRhVHlwZTwvdHQ+IGNsYXNzIGNvbnRhaW5zIGEgdmFyaWV0eSBvZiBvdGhlciBtZXRob2RzIGZvciBtYW5hZ2luZyB0eXBlZGVmcywgc2NvcGluZywgYW5kIG90aGVyIG9wZXJhdGlvbnMuICAgIFRoZXNlIGFyZSB1c3VhbGx5IG9ubHkgdXNlZCBieSB0aGUgU1dJRyBwYXJzZXIuICAgV2hpbGUgYXZhaWxhYmxlIHRvIGxhbmd1YWdlIG1vZHVsZXMgdG9vLCB0aGV5IGFyZSBuZXZlciB1c2VkIChhdCBsZWFzdCBub3QgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pLCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIGF2b2lkZWQgdW5sZXNzIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgKG5vdCB0aGF0IHRoaXMgaXMgYSBzdHJpY3QgcmVxdWlyZW1lbnQgb2YgY291cnNlKS48cD4KLTxhIG5hbWU9Im4yMiI+PC9hPjxoMz4gRnVuY3Rpb24gUGFyYW1ldGVyczwvaDM+Ci1FYWNoIGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24gY2FsbCBpcyByZXByZXNlbnRlZCB1c2luZyB0aGUgPHR0PlBhcm08L3R0PiBzdHJ1Y3R1cmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBQYXJtIHsKLQlQYXJtKERhdGFUeXBlICp0eXBlLCBjaGFyICpuYW1lKTsKLQlQYXJtKFBhcm0gKnApOwotCX5QYXJtKCk7Ci0JRGF0YVR5cGUgICAqdDsgICAgICAgICAgICAgICAgLy8gRGF0YXR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLQlpbnQgICAgICAgIGNhbGxfdHlwZTsgICAgICAgICAvLyBDYWxsIHR5cGUgKHZhbHVlIG9yIHJlZmVyZW5jZSBvciB2YWx1ZSkKLQljaGFyICAgICAgICpuYW1lOyAgICAgICAgICAgICAvLyBOYW1lIG9mIHBhcmFtZXRlciAob3B0aW9uYWwpCi0JY2hhciAgICAgICAqZGVmdmFsdWU7ICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSAoYXMgYSBzdHJpbmcpCi0JaW50ICAgICAgICBpZ25vcmU7ICAgICAgICAgICAgLy8gSWdub3JlIGZsYWcKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0dD50PC90dD4gaXMgdGhlIGRhdGF0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIDx0dD5uYW1lPC90dD4gaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG5hbWUsIGFuZCA8dHQ+ZGVmdmFsdWU8L3R0PiBpcyBhIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUgKGlmIHN1cHBsaWVkKS4gPHA+Ci08cD4KLTx0dD5jYWxsX3R5cGU8L3R0PiBpcyBhbiBpbnRlZ2VyIGNvZGUgZGVzY3JpYmluZyBhbnkgc3BlY2lhbCBwcm9jZXNzaW5nLiAgSXQgY2FuIGJlIG9uZSBvZiB0d28gdmFsdWVzIDo8cD4KLTxwPgotPHVsPgotPGxpPjx0dD5DQUxMX1ZBTFVFPC90dD4uICBUaGlzIG1lYW5zIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciwgYnV0IHdlIHNob3VsZCBtYWtlIGl0IHdvcmsgbGlrZSBhIGNhbGwtYnktdmFsdWUgYXJndW1lbnQgaW4gdGhlIHNjcmlwdGluZyBpbnRlcmZhY2UuICAgVGhpcyB2YWx1ZSB1c2VkIHRvIGJlIHNldCBieSB0aGUgPHR0PiV2YWw8L3R0PiBkaXJlY3RpdmUsIGJ1dCB0aGlzIGFwcHJvYWNoIGlzIG5vdyBkZXByZWNhdGVkIChzaW5jZSB0aGUgc2FtZSBlZmZlY3QgY2FuIGJlIGFjaGlldmVkIGJ5IHR5cGVtYXBzKS4KLTxsaT48dHQ+Q0FMTF9SRUZFUkVOQ0U8L3R0Pi4gIFRoaXMgaXMgc2V0IHdoZW4gYSBjb21wbGV4IGRhdGF0eXBlIGlzIGJlaW5nIHBhc3NlZCBieSB2YWx1ZSB0byBhIGZ1bmN0aW9uLiAgU2luY2UgU1dJRyBjYW4ndCBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgYnkgdmFsdWUsIHRoZSBkYXRhdHlwZSBpcyBpbXBsaWNpdGx5IGNoYW5nZWQgaW50byBhIHBvaW50ZXIgYW5kPHR0PiBjYWxsX3R5cGU8L3R0PiBzZXQgdG8gPHR0PkNBTExfUkVGRVJFTkNFPC90dD4uICAgIE1hbnkgb2YgU1dJRydzIGludGVybmFscyBsb29rIGF0IHRoaXMgd2hlbiBnZW5lcmF0aW5nIGNvZGUuICAgIEEgY29tbW9uIG1pc3Rha2UgaXMgZm9yZ2V0dGluZyB0aGF0IGFsbCBjb21wbGV4IGRhdGF0eXBlcyBpbiBTV0lHIGFyZSBwb2ludGVycy4gICAgVGhpcyBpcyBldmVuIHRoZSBjYXNlIHdoZW4gd3JpdGluZyBhIGxhbmd1YWdlLW1vZHVsZS0tLXRoZSBjb252ZXJzaW9uIHRvIHBvaW50ZXJzIHRha2VzIHBsYWNlIGluIHRoZSBwYXJzZXIgYmVmb3JlIGRhdGEgaXMgZXZlbiBwYXNzZWQgaW50byBhIHBhcnRpY3VsYXIgbW9kdWxlLgotPC91bD4KLTxwPgotVGhlIDx0dD5pZ25vcmU8L3R0PiBmaWVsZCBpcyBzZXQgd2hlbiBTV0lHIGRldGVjdHMgdGhhdCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0byBiZSAiaWdub3JlZCIgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXIgZnVuY3Rpb25zLiAgIEFuICJpZ25vcmVkIiBwYXJhbWV0ZXIgaXMgdXN1YWxseSBzZXQgdG8gYSBkZWZhdWx0IHZhbHVlIGFuZCBlZmZlY3RpdmVseSBkaXNhcHBlYXJzIHdoZW4gYSBmdW5jdGlvbiBjYWxsIGlzIG1hZGUgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSAodGhhdCBpcywgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGZld2VyIGFyZ3VtZW50cyB0aGFuIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlKS4gICAgIFRoZSAgPHR0Pmlnbm9yZTwvdHQ+IGZpZWxkIGlzIG5vcm1hbGx5IG9ubHkgc2V0IHdoZW4gYW4gImlnbm9yZSIgdHlwZW1hcCAgaGFzIGJlZW4gdXNlZC48cD4KLTxwPgotQWxsIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgaW4gdGhlIHN0cnVjdHVyZSA8dHQ+UGFybUxpc3Q8L3R0Pi4gICAgVGhpcyBzdHJ1Y3R1cmUgaGFzIHRoZSBmb2xsb3dpbmcgdXNlci1hY2Nlc2libGUgbWV0aG9kcyBhdmFpbGFibGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIFBhcm1MaXN0IHsKLXB1YmxpYzoKLSAgaW50ICAgbnBhcm1zOyAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcGFybXMgaW4gbGlzdAotICB2b2lkICBhcHBlbmQoUGFybSAqcCk7ICAgICAgICAgIC8vIEFwcGVuZCBhIHBhcmFtZXRlciB0byB0aGUgZW5kCi0gIHZvaWQgIGluc2VydChQYXJtICpwLCBpbnQgcG9zKTsgLy8gSW5zZXJ0IGEgcGFyYW1ldGVyIGludG8gdGhlIGxpc3QKLSAgdm9pZCAgZGVsKGludCBwb3MpOyAgICAgICAgICAgICAvLyBEZWxldGUgYSBwYXJhbWV0ZXIgYXQgcG9zaXRpb24gcG9zCi0gIGludCAgIG51bW9wdCgpOyAgICAgICAgICAgICAgICAgLy8gR2V0IG51bWJlciBvZiBvcHRpb25hbCBhcmd1bWVudHMKLSAgaW50ICAgbnVtYXJnKCk7ICAgICAgICAgICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBhcmd1bWVudHMKLSAgUGFybSAqZ2V0KGludCBwb3MpOyAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmFtZXRlciBhdCBwb3NpdGlvbiBwb3MKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBtZXRob2RzIG9wZXJhdGUgaW4gdGhlIG1hbm5lciB0aGF0IHlvdSB3b3VsZCBleHBlY3QuICAgIFRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIGxhbmd1YWdlIG1vZHVsZSBpcyB3YWxraW5nIGRvd24gdGhlIHBhcmFtZXRlciBsaXN0IGFuZCBwcm9jZXNzaW5nIGluZGl2aWR1YWwgcGFyYW1ldGVycy4gIFRoaXMgY2FuIGJlIGRvbmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gV2FsayBkb3duIGEgcGFyYW1ldGVyIGxpc3QKLVBhcm1MaXN0ICpsOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0IChhbHJlYWR5IGNyZWF0ZWQpCi1QYXJtICpwOwotCi1mb3IgKGludCBpID0gMDsgaSAmbHQ7IGwtJmd0O25wYXJtczsgaSsrKSB7Ci0JcCA9IGwtJmd0O2dldChpKTsgICAgICAgICAgICAgIC8vIEdldCBpdGggcGFyYW1ldGVyCi0JLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHBhcmFtZXRlcgotCS4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjMiPjwvYT48aDM+IFRoZSBTdHJpbmcgQ2xhc3M8L2gzPgotVGhlIHByb2Nlc3Mgb2Ygd3JpdGluZyB3cmFwcGVyIGZ1bmN0aW9ucyBpcyBtYWlubHkganVzdCBhIHRlZGlvdXMgZXhlcmNpc2UgaW4gc3RyaW5nIG1hbmlwdWxhdGlvbi4gIFRvIG1ha2UgdGhpcyBlYXNpZXIsICB0aGUgPHR0PlN0cmluZzwvdHQ+IGNsYXNzIHByb3ZpZGVzIHJlbGF0aXZlbHkgc2ltcGxlIG1lY2hhbmlzbSBmb3IgY29uc3RydWN0aW5nIHN0cmluZ3MsIGNvbmNhdGVuYXRpbmcgdmFsdWVzLCByZXBsYWNpbmcgc3ltYm9scywgYW5kIHNvIG9uLiAgICA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBTdHJpbmcgewotcHVibGljOgotICBTdHJpbmcoKTsKLSAgU3RyaW5nKGNvbnN0IGNoYXIgKnMpOwotICB+U3RyaW5nKCk7Ci0gIGNoYXIgICpnZXQoKSBjb25zdDsKLSAgZnJpZW5kIFN0cmluZyZhbXA7IG9wZXJhdG9yJmx0OyZsdDsoU3RyaW5nJmFtcDssY29uc3QgY2hhciAqcyk7Ci0gIGZyaWVuZCBTdHJpbmcmYW1wOyBvcGVyYXRvciZsdDsmbHQ7KFN0cmluZyZhbXA7LGNvbnN0IGludCk7Ci0gIGZyaWVuZCBTdHJpbmcmYW1wOyBvcGVyYXRvciZsdDsmbHQ7KFN0cmluZyZhbXA7LGNvbnN0IGNoYXIpOwotICBmcmllbmQgU3RyaW5nJmFtcDsgb3BlcmF0b3ImbHQ7Jmx0OyhTdHJpbmcmYW1wOyxTdHJpbmcmYW1wOyk7Ci0gIGZyaWVuZCBTdHJpbmcmYW1wOyBvcGVyYXRvciZndDsmZ3Q7KGNvbnN0IGNoYXIgKnMsIFN0cmluZyZhbXA7KTsKLSAgZnJpZW5kIFN0cmluZyZhbXA7IG9wZXJhdG9yJmd0OyZndDsoU3RyaW5nJmFtcDssU3RyaW5nJmFtcDspOwotICBTdHJpbmcmYW1wOyBvcGVyYXRvcj0oY29uc3QgY2hhciAqKTsKLSAgb3BlcmF0b3IgY2hhciooKSBjb25zdCB7IHJldHVybiBzdHI7IH0KLSAgdm9pZCAgIHVudGFiaWZ5KCk7Ci0gIHZvaWQgICByZXBsYWNlKGNoYXIgKnRva2VuLCBjaGFyICpyZXApOwotICB2b2lkICAgcmVwbGFjZWlkKGNoYXIgKmlkLCBjaGFyICpyZXApOwotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU3RyaW5ncyBjYW4gYmUgbWFuaXB1bGF0ZWQgaW4gYSBtYW5uZXIgdGhhdCBsb29rcyBzaW1pbGFyIHRvIEMrKyBJL08gb3BlcmF0aW9ucy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5TdHJpbmcgczsKLQotcyAmbHQ7Jmx0OyAidm9pZCIgJmx0OyZsdDsgIiBmb28oKSB7XG4iCi0gICZsdDsmbHQ7IHRhYjQgJmx0OyZsdDsgInByaW50ZihcIkhlbGxvIFdvcmxkXCIpO1xuIgotICAmbHQ7Jmx0OyAifVxuIjsKLQotZnByaW50ZihmX3dyYXBwZXJzLCIlcyIsIChjaGFyICopIHMpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1wcm9kdWNlcyB0aGUgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGZvbygpIHsKLSAgICBwcmludGYoIkhlbGxvIFdvcmxkIik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+Jmx0OyZsdDs8L3R0PiBvcGVyYXRvciBhbHdheXMgYXBwZW5kcyB0byB0aGUgZW5kIG9mIGEgc3RyaW5nIHdoaWxlIDx0dD4mZ3Q7Jmd0OzwvdHQ+IGNhbiBiZSB1c2VkIHRvIGluc2VydCBhIHN0cmluZyBhdCB0aGUgYmVnaW5uaW5nLiAgIFN0cmluZ3MgbWF5IGJlIHVzZWQgYW55d2hlcmUgYSA8dHQ+Y2hhciAqPC90dD4gaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+U3RyaW5nIHMxLHMyOwotLi4uCi1pZiAoc3RyY21wKHMxLHMyKSA9PSAwKSB7Ci0JcHJpbnRmKCJFcXVhbCFcbiIpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmdldCgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgcmV0dXJuIHRoZSA8dHQ+Y2hhciAqPC90dD4gY29udGFpbmluZyB0aGUgc3RyaW5nIGRhdGEuICAgVGhlIDx0dD51bnRhYmlmeSgpPC90dD4gbWV0aG9kIHJlcGxhY2VzIHRhYnMgd2l0aCB3aGl0ZXNwYWNlLiAgIFRoZSA8dHQ+cmVwbGFjZSgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gc3Vic3RyaW5nIHJlcGxhY2VtZW50IGFuZCBpcyB1c2VkIGJ5IHR5cGVtYXBzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cy5yZXBsYWNlKCIkdGFyZ2V0IiwiX2FyZzMiKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5yZXBsYWNlaWQoKTwvdHQ+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHZhbGlkIEMgaWRlbnRpZmllcnMgd2l0aCBhIG5ldyB2YWx1ZS4gIEMgaWRlbnRpZmllcnMgbXVzdCBiZSBzdXJyb3VuZGVkIGJ5IHdoaXRlLXNwYWNlIG9yIG90aGVyIG5vbi1pZGVudGlmaWVyIGNoYXJhY3RlcnMuICAgIFRoZSA8dHQ+cmVwbGFjZSgpPC90dD4gbWV0aG9kIGRvZXMgbm90IGhhdmUgdGhpcyByZXN0cmljdGlvbi48cD4KLTxhIG5hbWU9Im4yNCI+PC9hPjxoMz4gSGFzaCBUYWJsZXM8L2gzPgotSGFzaCB0YWJsZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIDx0dD5IYXNoPC90dD4gY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIEhhc2ggewotcHVibGljOgotICBIYXNoKCk7Ci0gIH5IYXNoKCk7Ci0gIGludCAgICBhZGQoY29uc3QgY2hhciAqa2V5LCB2b2lkICpvYmplY3QpOwotICBpbnQgICAgYWRkKGNvbnN0IGNoYXIgKmtleSwgdm9pZCAqb2JqZWN0LCB2b2lkICgqZGVsKSh2b2lkICopKTsKLSAgdm9pZCAgKmxvb2t1cChjb25zdCBjaGFyICprZXkpOwotICB2b2lkICAgcmVtb3ZlKGNvbnN0IGNoYXIgKmtleSk7Ci0gIHZvaWQgICpmaXJzdCgpOwotICB2b2lkICAqbmV4dCgpOwotICBjaGFyICAqZmlyc3RrZXkoKTsKLSAgY2hhciAgKm5leHRrZXkoKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUhhc2ggdGFibGVzIHN0b3JlIGFyYml0cmFyeSBvYmplY3RzIChjYXN0IHRvIDx0dD52b2lkICo8L3R0Pikgd2l0aCBzdHJpbmcga2V5cy4gICAgQW4gb3B0aW9uYWwgb2JqZWN0IGRlbGV0aW9uIGZ1bmN0aW9uIG1heSBiZSByZWdpc3RlcmVkIHdpdGggZWFjaCBlbnRyeSB0byBkZWxldGUgb2JqZWN0cyB3aGVuIHRoZSBoYXNoIGlzIGRlc3Ryb3llZC4gIEhhc2ggdGFibGVzIGFyZSBwcmltYXJpbHkgdXNlZCBmb3IgbWFuYWdpbmcgaW50ZXJuYWwgc3ltYm9sIHRhYmxlcyBhbHRob3VnaCBsYW5ndWFnZSBtb2R1bGVzIG1heSBhbHNvIHVzZSB0aGVtIHRvIGtlZXAgdHJhY2sgb2Ygc3BlY2lhbCBzeW1ib2xzIGFuZCBvdGhlciBzdGF0ZS48cD4KLTxwPgotVGhlIGZvbGxvd2luZyBoYXNoIHRhYmxlIHNob3dzIGhvdyBvbmUgbWlnaHQga2VlcCB0cmFjayBvZiByZWFsIGFuZCByZW5hbWVkIGZ1bmN0aW9uIG5hbWVzLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPkhhc2ggd3JhcHBlZF9mdW5jdGlvbnM7Ci0KLWludCBhZGRfZnVuY3Rpb24oY2hhciAqbmFtZSwgY2hhciAqcmVuYW1lZCkgewotCWNoYXIgKm5uID0gbmV3IGNoYXJbc3RybGVuKHJlbmFtZWQpKzFdOwotCXN0cmNweShubixyZW5hbWVkKTsKLQlpZiAod3JhcHBlZF9mdW5jdGlvbnMuYWRkKG5hbWUsbm4pID09IC0xKSB7Ci0JCXByaW50ZigiRnVuY3Rpb24gbXVsdGlwbHkgZGVmaW5lZCFcbiIpOwotCQlkZWxldGUgW10gbm47Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci1jaGFyICpnZXRfcmVuYW1lZChjaGFyICpuYW1lKSB7Ci0JY2hhciAqcm4gPSAoY2hhciAqKSB3cmFwcGVkX2Z1bmN0aW9ucy5sb29rdXAobmFtZSk7Ci0JcmV0dXJuIHJuOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PnJlbW92ZSgpPC90dD4gbWV0aG9kIHJlbW92ZXMgYSBoYXNoLXRhYmxlIGVudHJ5LiAgVGhlIDx0dD5maXJzdCgpPC90dD4gYW5kIDx0dD5uZXh0KCk8L3R0PiBtZXRob2RzIGFyZSBpdGVyYXRvcnMgZm9yIGV4dHJhY3RpbmcgYWxsIG9mIHRoZSBoYXNoZWQgb2JqZWN0cy4gICAgVGhleSByZXR1cm4gTlVMTCB3aGVuIG5vIG1vcmUgb2JqZWN0cyBhcmUgZm91bmQgaW4gdGhlIGhhc2guICAgVGhlIDx0dD5maXJzdGtleSgpPC90dD4gYW5kIDx0dD5uZXh0a2V5KCkgPC90dD5tZXRob2RzIGFyZSBpdGVyYXRvcnMgdGhhdCByZXR1cm4gdGhlIGhhc2gga2V5cy4gICBOVUxMIGlzIHJldHVybmVkIHdoZW4gbm8gbW9yZSBrZXlzIGFyZSBmb3VuZC48cD4KLTxhIG5hbWU9Im4yNSI+PC9hPjxoMz4gVGhlIFdyYXBwZXJGdW5jdGlvbiBjbGFzczwvaDM+Ci1GaW5hbGx5LCBhIDx0dD5XcmFwcGVyRnVuY3Rpb248L3R0PiBjbGFzcyBpcyBhdmFpbGFibGUgZm9yIHNpbXBsaWZ5aW5nIHRoZSBjcmVhdGlvbiBvZiB3cmFwcGVyIGZ1bmN0aW9ucy4gICBUaGUgY2xhc3MgaXMgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIG9yZ2FuaXplIGNvZGUgZ2VuZXJhdGlvbiBhbmQgcHJvdmlkZSBhIGZldyBzdXBwb3J0aW5nIHNlcnZpY2VzLiAgICAgVGhlIGNsYXNzIGlzIGRlZmluZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgV3JhcHBlckZ1bmN0aW9uIHsKLXB1YmxpYzoKLSAgU3RyaW5nICBkZWY7Ci0gIFN0cmluZyAgbG9jYWxzOwotICBTdHJpbmcgIGNvZGU7Ci0gIHZvaWQgICAgcHJpbnQoRklMRSAqZik7Ci0gIHZvaWQgICAgcHJpbnQoU3RyaW5nICZhbXA7Zik7Ci0gIHZvaWQgICAgYWRkX2xvY2FsKGNoYXIgKnR5cGUsIGNoYXIgKm5hbWUsIGNoYXIgKmRlZnZhbHVlID0gMCk7Ci0gIGNoYXIgICAqbmV3X2xvY2FsKGNoYXIgKnR5cGUsIGNoYXIgKm5hbWUsIGNoYXIgKmRlZnZhbHVlID0gMCk7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaHJlZSBzdHJpbmdzIGFyZSBhdmFpbGFibGUuICBUaGUgPHR0PmRlZjwvdHQ+IHN0cmluZyBjb250YWlucyB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCB0aGUgPHR0PmxvY2FsczwvdHQ+IHN0cmluZyBjb250YWluIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgYW5kIHRoZSA8dHQ+Y29kZTwvdHQ+IHN0cmluZyBjb250YWlucyB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS48cD4KLTxwPgotVGhlIG1ldGhvZCA8dHQ+YWRkX2xvY2FsKCk8L3R0PiBjcmVhdGVzIGEgbmV3IGxvY2FsIHZhcmlhYmxlIHdoaWNoIGlzIG1hbmFnZWQgd2l0aCBhbiBpbnRlcm5hbCBzeW1ib2wgdGFibGUgKHRoYXQgZGV0ZWN0cyB2YXJpYWJsZSBjb25mbGljdHMgYW5kIHJlcG9ydHMgcG90ZW50aWFsIGVycm9ycykuICAgICBUaGUgPHR0Pm5ld19sb2NhbCgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBsb2NhbCB2YXJpYWJsZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLiAgIFNpbmNlIGEgcmVuYW1pbmcgbWlnaHQgYmUgcmVxdWlyZWQsIHRoaXMgbGF0dGVyIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdhcyBhY3R1YWxseSBzZWxlY3RlZCBmb3IgdXNlICh0eXBpY2FsbHksIHRoaXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCBuYW1lKS48cD4KLTxwPgotVGhlIDx0dD5wcmludCgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGVtaXQgdGhlIHdyYXBwZXIgZnVuY3Rpb24gdG8gYSBmaWxlLiAgVGhlIHByaW50aW5nIHByb2Nlc3MgY29uc29saWRhdGVzIGFsbCBvZiB0aGUgc3RyaW5ncyBpbnRvIGEgc2luZ2xlIHJlc3VsdC48cD4KLTxwPgotSGVyZSBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb24gY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPldyYXBwZXJGdW5jdGlvbiBmOwotCi1mLmRlZiAmbHQ7Jmx0OyAidm9pZCBjb3VudF9uKGludCBuKSB7IjsKLWYuYWRkX2xvY2FsKCJpbnQiLCJpIik7Ci1mLmNvZGUgJmx0OyZsdDsgdGFiNCAmbHQ7Jmx0OyAiZm9yIChpID0gMDsgaSAmbHQ7IG47IGkrKykge1xuIgotICAgICAgICZsdDsmbHQ7IHRhYjggJmx0OyZsdDsgInByaW50ZihcIiVkXFxuXCIsaSk7XG4iCi0gICAgICAgJmx0OyZsdDsgdGFiNCAmbHQ7Jmx0OyAifVxuIgotICAgICAgICZsdDsmbHQ7ICJ9XG4iOwotCi1mLnByaW50KGZfd3JhcHBlcnMpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGNvdW50X24oaW50IG4pIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSsrKSB7Ci0gICAgICAgICBwcmludGYoIiVkXG4iLGkpOwotICAgIH0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT2YgY291cnNlLCBhcyB5b3UgY2FuIGd1ZXNzLCB0aGUgZnVuY3Rpb25zIGFjdHVhbGx5IGdlbmVyYXRlZCBieSB5b3VyIGxhbmd1YWdlIG1vZHVsZSB3aWxsIGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGlzLjxwPgotPGEgbmFtZT0ibjYiPjwvYT48aDI+IFR5cGVtYXBzIChmcm9tIEMpPC9oMj4KLVRoZSB0eXBlbWFwcGVyIHBsYXlzIGEgYmlnIHJvbGUgaW4gZ2VuZXJhdGluZyBjb2RlIGZvciBhbGwgb2YgU1dJRydzIG1vZHVsZXMuICAgIFVuZGVyc3RhbmRpbmcgdGhlIDx0dD4ldHlwZW1hcDwvdHQ+IGRpcmVjdGl2ZSBhbmQgaG93IGl0IHdvcmtzIGlzIHByb2JhYmx5IGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyB0aGlzIHNlY3Rpb24uPHA+Ci08YSBuYW1lPSJuMjYiPjwvYT48aDM+IFRoZSB0eXBlbWFwIEMgQVBJLjwvaDM+Ci0gVGhlcmUgaXMgYSByZWxhdGl2ZWx5IHNpbXBsZSBDIEFQSSBmb3IgbWFuYWdpbmcgdHlwZW1hcHMgaW4gbGFuZ3VhZ2UgbW9kdWxlcy48cD4KLTxwPgotPGg2PiA8Yj52b2lkIHR5cGVtYXBfcmVnaXN0ZXIoY2hhciAqb3AsIGNoYXIgKmxhbmcsIERhdGFUeXBlICp0eXBlLCBjaGFyICpwbmFtZSw8L2I+IDxiPiAgICAgICAgICAgICAgICAgICBjaGFyICpjb2RlLCBQYXJtTGlzdCAqbCA9IDApOzwvYj48L2g2PgotPGRsPgotPGR0PjxkZD4KLTxkdD48ZGQ+UmVnaXN0ZXJzIGEgbmV3IHR5cGVtYXAgd2l0aCB0aGUgdHlwZW1hcHBlci4gICBUaGlzIGlzIHRoZSBDIGVxdWl2YWxlbnQgb2YgdGhlIDx0dD4ldHlwZW1hcCA8L3R0PmRpcmVjdGl2ZS4gIEZvciBleGFtcGxlIDoKLTxkdD48ZGQ+Ci08YmxvY2txdW90ZT48cHJlPgkldHlwZW1hcChsYW5nLG9wKSB0eXBlIHBuYW1lIHsgLi4uIGNvZGUgLi4uIH07Ci0JJXR5cGVtYXAobGFuZyxvcCkgdHlwZSBwbmFtZShQYXJtTGlzdCkgeyAuLi4gY29kZSAuLi4gfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGR0PjxkZD48dHQ+Y29kZTwvdHQ+IGNvbnRhaW5zIHRoZSBhY3R1YWwgdHlwZW1hcCBjb2RlLCB3aGlsZSA8dHQ+bDwvdHQ+IGlzIGEgcGFyYW1ldGVyIGxpc3QgY29udGFpbmluZyBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICAgIE5vcm1hbGx5LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgdGhpcyBmdW5jdGlvbiBmcm9tIGxhbmd1YWdlIG1vZHVsZXMuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCB0eXBlbWFwX3JlZ2lzdGVyX2RlZmF1bHQoY2hhciAqb3AsIGNoYXIgKmxhbmcsIGludCB0eXBlLCBpbnQgcHRyLCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcnJheXN0ciwgIGNoYXIgKmNvZGUsIFBhcm1MaXN0ICphcmdzKTwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5SZWdpc3RlcnMgYSBkZWZhdWx0IHR5cGVtYXAuICBUaGlzIHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgbm9ybWFsIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiwgYnV0IHRha2VzIGEgdHlwZSBjb2RlIChhbiBpbnRlZ2VyKSBpbnN0ZWFkLiAgICBEZWZhdWx0IHR5cGVtYXBzIGFyZSBtb3JlIGdlbmVyYWwgdGhhbiBub3JtYWwgdHlwZW1hcHMgKHNlZSBiZWxvdykuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gY2hhciAqdHlwZW1hcF9sb29rdXAoY2hhciAqb3AsIGNoYXIgKmxhbmcsIERhdGFUeXBlICp0eXBlLCAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwbmFtZSwgY2hhciAqc291cmNlLCBjaGFyICp0YXJnZXQsICAgICAgICAgICAgICAgICAgICAgIFdyYXBwZXJGdW5jdGlvbiAqZiA9IDApOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5Mb29rcyB1cCBhIHR5cGVtYXAsIHBlcmZvcm1zIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMsIGFuZCByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZW1hcCBjb2RlLiAgICBUaGUgdHVwbGUgPHR0PihvcCwgbGFuZywgdHlwZSwgcG5hbWUpPC90dD4gZGV0ZXJtaW5lIHdoaWNoIHR5cGVtYXAgdG8gZmluZC4gIDx0dD5zb3VyY2U8L3R0PiBjb250YWlucyB0aGUgc3RyaW5nICB0byBiZSBhc3NpZ25lZCB0byB0aGUgPHR0PiRzb3VyY2U8L3R0PiB2YXJpYWJsZSwgPHR0PnRhcmdldDwvdHQ+IGNvbnRhaW5zIHRoZSBzdHJpbmcgdG8gYmUgYXNzaWduZWQgdG8gdGhlPHR0PiAkdGFyZ2V0PC90dD4gdmFyaWFibGUuICA8dHQ+ZjwvdHQ+IGlzIGFuIG9wdGlvbmFsICB3cmFwcGVyIGZ1bmN0aW9uIG9iamVjdC4gICBJdCBzaG91bGQgYmUgc3VwcGxpZWQgdG8gc3VwcG9ydCBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzIChpZS4gdHlwZW1hcHMgdGhhdCBkZWNsYXJlIGFkZGl0aW9uYWwgbG9jYWwgdmFyaWFibGVzKS4gCi08ZHQ+PGRkPgotPGR0PjxkZD48dHQ+dHlwZW1hcF9sb29rdXAoKTwvdHQ+IHJldHVybnMgTlVMTCBpcyBubyB0eXBlbWFwIGlzIGZvdW5kLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdXBkYXRlZCB0eXBlbWFwIGNvZGUuICAgIFRoaXMgY29kZSBoYXMgYSBudW1iZXIgb2YgdmFyaWFibGVzIHN1YnN0aXR1dGVkIGluY2x1ZGluZyA8dHQ+JHNvdXJjZTwvdHQ+LCA8dHQ+JHRhcmdldDwvdHQ+LCA8dHQ+JHR5cGU8L3R0PiwgPHR0PiRtYW5nbGU8L3R0PiwgYW5kIDx0dD4kYmFzZXR5cGU8L3R0Pi4gIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGNoYXIgKnR5cGVtYXBfY2hlY2soY2hhciAqb3AsIGNoYXIgKmxhbmcsIERhdGFUeXBlICp0eXBlLCBjaGFyICpwbmFtZSk8L2g2PgotPHA+Ci08ZGw+Ci08ZHQ+PGRkPkNoZWNrcyB0byBzZWUgaWYgYSB0eXBlbWFwIGV4aXN0cy4gIFRoZSB0dXBsZSA8dHQ+KG9wLCBsYW5nLCB0eXBlLCBwbmFtZSk8L3R0PiBkZXRlcm1pbmUgd2hpY2ggdHlwZW1hcCB0byBmaW5kLiAgICBJZiB0aGUgdHlwZW1hcCBleGlzdHMsIHRoZSByYXcgdHlwZW1hcCBjb2RlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBOVUxMIGlzIHJldHVybmVkLiAgIFdoaWxlIDx0dD50eXBlbWFwX2xvb2t1cCgpPC90dD4gY291bGQgYmUgdXNlZCB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIG1vcmUgY29tcGFjdCBhbmQgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgc2luY2UgaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4KLTxkdD48ZGQ+Ci08L2RsPgotPGEgbmFtZT0ibjI3Ij48L2E+PGgzPiBXaGF0IGhhcHBlbnMgb24gdHlwZW1hcCBsb29rdXA/PC9oMz4KLVdoZW4gbG9va2luZyBmb3IgYSB0eXBlbWFwLCBTV0lHIHNlYXJjaGVzIGZvciBhIG1hdGNoIGluIGEgc2VyaWVzIG9mIHN0ZXBzLjxwPgotPHA+Ci08dWw+Ci08bGk+RXhwbGljaXQgdHlwZW1hcHMuICAgVGhlc2UgYXJlIHNwZWNpZmllZCBkaXJlY3RseSB3aXRoIHRoZSA8dHQ+JXR5cGVtYXAoKTwvdHQ+IGRpcmVjdGl2ZS4gIE5hbWVkIHR5cGVtYXBzIGhhdmUgdGhlIGhpZ2hlc3QgcHJlY2VkZW5jZSB3aGlsZSBhcnJheXMgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHBvaW50ZXJzIChzZWUgdGhlIHR5cGVtYXAgY2hhcHRlciBmb3IgbW9yZSBkZXRhaWxzKS4KLTxsaT5JZiBubyBleHBsaWNpdCB0eXBlbWFwIGlzIGZvdW5kLCBtYXBwaW5ncyBhcHBsaWVkIHdpdGggdGhlIDx0dD4lYXBwbHkgPC90dD5kaXJlY3RpdmUgYXJlIGNoZWNrZWQuICAgQmFzaWNhbGx5LCA8dHQ+JWFwcGx5IDwvdHQ+aXMgbm90aGluZyBtb3JlIHRoYW4gYSBnbG9yaWZpZWQgcmVuYW1pbmcgb3BlcmF0aW9uLiAgIFdlIHJlbmFtZSB0aGUgZGF0YXR5cGUgYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IGV4cGxpY2l0IHR5cGVtYXBzIHRoYXQgbWF0Y2guICBJZiBzbywgd2UgdXNlIHRoZSB0eXBlbWFwIHRoYXQgd2FzIGZvdW5kLgotPGxpPkRlZmF1bHQgdHlwZW1hcHMuICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQgd2l0aCBlaXRoZXIgZXhwbGljaXQgdHlwZW1hcHMgb3IgYXBwbHkgZGlyZWN0aXZlcywgd2UgbWFrZSBhIGZpbmFsIHNlYXJjaCB1c2luZyB0aGUgZGVmYXVsdCB0eXBlbWFwLiAgVW5saWtlIG90aGVyIHR5cGVtYXBzLCBkZWZhdWx0IHR5cGVtYXBzIGFyZSBhcHBsaWVkIHRvIHRoZSByYXcgU1dJRyBpbnRlcm5hbCBkYXRhdHlwZXMgKDx0dD5UX0lOVDwvdHQ+LCA8dHQ+VF9ET1VCTEU8L3R0PiwgPHR0PlRfQ0hBUjwvdHQ+LCBldGMuLi4pLiAgIEFzIGEgcmVzdWx0LCB0aGV5IGFyZSBpbnNlbnRpdmUgdG8gdHlwZWRlZnMgYW5kIHJlbmFtaW5nIG9wZXJhdGlvbnMuICAgIElmIG5vdGhpbmcgaXMgZm91bmQgaGVyZSwgYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQgaW5kaWNhdGluZyB0aGF0IG5vIG1hcHBpbmcgd2FzIGZvdW5kIGZvciB0aGF0IHBhcnRpY3VsYXIgZGF0YXR5cGUuCi08L3VsPgotPHA+Ci1Bbm90aGVyIHdheSB0byB0aGluayBvZiB0aGUgdHlwZW1hcCBtZWNoYW5pc20gaXMgdGhhdCBpdCBhbHdheXMgdHJpZXMgdG8gYXBwbHkgdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZW1hcCB0aGF0IGNhbiBiZSBmb3VuZCBmb3IgYW55IHBhcnRpY3VsYXIgZGF0YXR5cGUuICAgV2hlbiBzZWFyY2hpbmcsIGl0IHN0YXJ0cyB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIGFuZCB3b3JrcyBpdHMgd2F5IG91dCB0byB0aGUgbW9zdCBnZW5lcmFsIHNwZWNpZmljYXRpb24uICAgSWYgbm90aGluZyBpcyBmb3VuZCBpdCBnaXZlcyB1cCBhbmQgcmV0dXJucyBhIE5VTEwgcG9pbnRlci48cD4KLTxhIG5hbWU9Im4yOCI+PC9hPjxoMz4gSG93IG1hbnkgdHlwZW1hcHMgYXJlIHRoZXJlPzwvaDM+Ci1BbGwgdHlwZW1hcHMgYXJlIGlkZW50aWZpZWQgYnkgYW4gb3BlcmF0aW9uIHN0cmluZyBzdWNoIGFzICJpbiIsICJvdXQiLCAibWVtYmVyaW4iLCBldGMuLi4gIEEgbnVtYmVyIG9mIHR5cGVtYXBzIGFyZSBkZWZpbmVkIGJ5IG90aGVyIHBhcnRzIG9mIFNXSUcsIGJ1dCB5b3UgY2FuIGNyZWF0ZSBhbnkgc29ydCBvZiB0eXBlbWFwIHRoYXQgeW91IHdpc2ggYnkgc2ltcGx5IHBpY2tpbmcgYSBuZXcgbmFtZSBhbmQgdXNpbmcgaXQgd2hlbiBtYWtpbmcgY2FsbHMgdG8gPHR0PnR5cGVtYXBfbG9va3VwKCk8L3R0PiAgYW5kIDx0dD50eXBlbWFwX2NoZWNrKCk8L3R0Pi4gICAgPHA+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gRmlsZSBtYW5hZ2VtZW50PC9oMj4KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBmb3IgbWFuYWdpbmcgZmlsZXMgd2l0aGluIFNXSUcuICA8cD4KLTxwPgotPGg2PiB2b2lkIGFkZF9kaXJlY3RvcnkoY2hhciAqZGlybmFtZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Ci08ZHQ+PGRkPkFkZHMgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSBzZWFyY2ggcGF0aCB1c2VkIHRvIGxvY2F0ZSBTV0lHIGxpYnJhcnkgZmlsZXMuICBUaGlzIGlzIHRoZSBDIGVxdWl2YWxlbnQgb2YgdGhlIDx0dD5zd2lnPC90dD4gPHR0Pi1JPC90dD4gb3B0aW9uLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGludCBpbnNlcnRfZmlsZShjaGFyICpmaWxlbmFtZSwgRklMRSAqb3V0cHV0KTs8L2g2PgotPGRsPgotPGR0PjxkZD4KLTxkdD48ZGQ+U2VhcmNoZXMgZm9yIGEgZmlsZSBhbmQgY29waWVzIGl0IGludG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uICAgVGhlIHNlYXJjaCBwcm9jZXNzIGdvZXMgdGhyb3VnaCB0aGUgU1dJRyBsaWJyYXJ5IG1lY2hhbmlzbSB3aGljaCBmaXJzdCBjaGVja3MgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIGluIHZhcmlvdXMgcGFydHMgb2YgdGhlIFNXSUcgbGlicmFyeSBmb3IgYSBtYXRjaC4gIFJldHVybnMgLTEgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kLiBMYW5ndWFnZSBtb2R1bGVzIG9mdGVuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGluc2VydCBzdXBwb3J0aW5nIGNvZGUuICBVc3VhbGx5IHRoZXNlIGNvZGUgZnJhZ21lbnRzIGFyZSBnaXZlbiBhIGA8dHQ+LnN3ZzwvdHQ+JyBzdWZmaXggYW5kIGFyZSBwbGFjZWQgaW4gdGhlIFNXSUcgbGlicmFyeS4gCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gaW50IGdldF9maWxlKGNoYXIgKmZpbGVuYW1lLCBTdHJpbmcgJmFtcDtzdHIpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD4JU2VhcmNoZXMgZm9yIGEgZmlsZSBhbmQgcmV0dXJucyBpdHMgY29udGVudHMgIGluIHRoZSBTdHJpbmcgPHR0PnN0ci48L3R0PlJldHVybnMgYSAtMSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuCi08L2RsPgotPHA+Ci08aDY+IGludCBjaGVja291dF9maWxlKGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Ci08ZHQ+PGRkPkNvcGllcyBhIGZpbGUgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgPHR0PmRlc3QgPC90dD5pcyB0aGUgZmlsZW5hbWUgb2YgdGhlIGRlc2lyZWQgZmlsZS4gICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJlcGxhY2UgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMuICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBnaXZlIHRoZSB1c2VyIHN1cHBvcnRpbmcgY29kZS4gRm9yIGV4YW1wbGUsIHdlIGNvdWxkIGNoZWNrIG91dCBhIE1ha2VmaWxlIGlmIG5vbmUgZXhpc3RzLiAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGludCBpbmNsdWRlX2ZpbGUoY2hhciAqZmlsZW5hbWUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5UaGUgQyBlcXVpdmFsZW50IG9mIHRoZSBTV0lHIDx0dD4laW5jbHVkZTwvdHQ+IGRpcmVjdGl2ZS4gICBXaGVuIGNhbGxlZCwgU1dJRyB3aWxsIGF0dGVtcHQgdG8gb3BlbiA8dHQ+ZmlsZW5hbWU8L3R0PiBhbmQgc3RhcnQgcGFyc2luZyBhbGwgb2YgaXRzIGNvbnRlbnRzLiAgIElmIHN1Y2Nlc3NmdWwsIHBhcnNpbmcgb2YgdGhlIG5ldyBmaWxlIHdpbGwgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLCB0aGUgcGFyc2VyIHN3aXRjaGVzIGJhY2sgdG8gdGhlIGlucHV0IGZpbGUgYmVpbmcgcmVhZCBwcmlvciB0byB0aGlzIGNhbGwuICAgICBSZXR1cm5zIC0xIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZC4KLTwvZGw+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gTmFtaW5nIFNlcnZpY2VzPC9oMj4KLVRoZSBuYW1pbmcgbW9kdWxlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGdlbmVyYXRpbmcgdGhlIG5hbWVzIG9mIHdyYXBwZXIgZnVuY3Rpb25zLCBhY2Nlc3NvciBmdW5jdGlvbnMsIGFuZCBvdGhlciBhc3BlY3RzIG9mIFNXSUcuICAgRWFjaCBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IG5hbWUgdGhhdCBpcyBhIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBDIGlkZW50aWZpZXIgd2hlcmUgaW52YWxpZCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gYSAiXyIuICA8cD4KLTxwPgotPGg2PiBjaGFyICAqbmFtZV93cmFwcGVyKGNoYXIgKmZuYW1lLCBjaGFyICpwcmVmaXgpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPlJldHVybnMgdGhlIG5hbWUgb2YgYSB3cmFwcGVyIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgaXQgd2lsbCBiZSAiPHR0Pl93cmFwX3ByZWZpeGZuYW1lPC90dD4iLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGNoYXIgICpuYW1lX21lbWJlcihjaGFyICptbmFtZSwgY2hhciAqY2xhc3NuYW1lOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPlJldHVybnMgdGhlIG5hbWUgb2YgYSBDKysgYWNjZXNzb3IgZnVuY3Rpb24uICBOb3JtYWxseSwgdGhpcyBpcyAiPHR0PmNsYXNzbmFtZV9tbmFtZTwvdHQ+Ii4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICAqbmFtZV9nZXQoY2hhciAqdm5hbWUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPlJldHVybnMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBnZXQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgY2xhc3MgZGF0YSBtZW1iZXIuICBOb3JtYWxseSAiPHR0PnZuYW1lX2dldDwvdHQ+IiBpcyByZXR1cm5lZC4gCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gY2hhciAgKm5hbWVfc2V0KGNoYXIgKnZuYW1lKTs8L2g2PgotPGRsPgotPGR0PjxkZD5SZXR1cm5zIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIGNsYXNzIGRhdGEgbWVtYmVyLiAgTm9ybWFsbHksICI8dHQ+dm5hbWVfc2V0PC90dD4iIGlzIHJldHVybmVkLiAKLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICAqbmFtZV9jb25zdHJ1Y3QoY2hhciAqY2xhc3NuYW1lKTs8L2g2PgotPGRsPgotPGR0PjxkZD5SZXR1cm5zIHRoZSBuYW1lIG9mIGEgY29uc3RydWN0b3IgZnVuY3Rpb24uICBOb3JtYWxseSByZXR1cm5zICI8dHQ+bmV3X2NsYXNzbmFtZTwvdHQ+Ii4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICAqbmFtZV9kZXN0cm95KGNoYXIgKmNsYXNzbmFtZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UmV0dXJucyB0aGUgbmFtZSBvZiBhIGRlc3RydWN0b3IgZnVuY3Rpb24uIE5vcm1hbGx5IHJldHVybnMgIjx0dD5kZWxldGVfY2xhc3NuYW1lPC90dD4iLgotPGR0PjxkZD4KLTwvZGw+Ci1FYWNoIGZ1bmN0aW9uIG1heSBhbHNvIGFjY2VwdCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb2YgPHR0PkFTX0lTPC90dD4uICBUaGlzIHN1cHByZXNzZXMgdGhlIGNvbnZlcnNpb24gb2YgaWxsZWdhbCBjaGFyYWN0ZXJzIChhIHByb2Nlc3MgdGhhdCBpcyBzb21ldGltZXMgcmVxdWlyZWQpLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jaGFyICpuYW1lID0gbmFtZV9tZW1iZXIoImZvbyIsImJhciIsQVNfSVMpOyAgIC8vIFByb2R1Y2UgYSBuYW1lLCBidXQgZG9uJ3QgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwgY2hhcmFjdGVycy4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSXQgaXMgY3JpdGljYWwgdGhhdCBsYW5ndWFnZSBtb2R1bGVzIHVzZSB0aGUgbmFtaW5nIGZ1bmN0aW9ucy4gICBUaGVzZSBmdW5jdGlvbiBhcmUgdXNlZCB0aHJvdWdob3V0IFNXSUcgYW5kIHByb3ZpZGUgYSBjZW50cmFsaXplZCBtZWNoYW5pc20gZm9yIGtlZXBpbmcgdHJhY2sgb2YgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgbWFuYWdpbmcgbXVsdGlwbGUgZmlsZXMsIGFuZCBzbyBmb3J0aC4gIEluIGZ1dHVyZSByZWxlYXNlcywgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgbmFtaW5nIHNjaGVtZSB1c2VkIGJ5IFNXSUcuICBVc2luZyB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGluc3VyZSBmdXR1cmUgY29tcGF0aWJpbGl0eS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBDb2RlIEdlbmVyYXRpb24gRnVuY3Rpb25zPC9oMj4KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGVtaXQgY29kZSB0aGF0IGlzIGdlbmVyYWxseSB1c2VmdWwgYW5kIHVzZWQgaW4gZXNzZW50aWFsbHkgZXZlcnkgU1dJRyBsYW5ndWFnZSBtb2R1bGUuPHA+Ci08cD4KLTxoNj4gaW50IGVtaXRfYXJncyhEYXRhVHlwZSAqdCwgUGFybUxpc3QgKmwsIFdyYXBwZXJGdW5jdGlvbiAmYW1wO2YpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYWxsIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgdXNlZCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUuICA8dHQ+dDwvdHQ+IGlzIHRoZSByZXR1cm4gZGF0YXR5cGUgb2YgdGhlIGZ1bmN0aW9uLCA8dHQ+bDwvdHQ+IGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBob2xkaW5nIGFsbCBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgPHR0PmY8L3R0PiBpcyBhIFdyYXBwZXJGdW5jdGlvbiBvYmplY3Qgd2hlcmUgdGhlIGxvY2FsICB2YXJpYWJsZXMgd2lsbCBiZSBjcmVhdGVkLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgZW1pdF9mdW5jX2NhbGwoY2hhciAqbmFtZSwgRGF0YVR5cGUgKnQsIFBhcm1MaXN0ICpsLCAgICAgICAgICAgICAgICAgICAgIFdyYXBwZXJGdW5jdGlvbiAmYW1wO2YpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBmdW5jdGlvbiBjYWxsIHRvIGEgQyBmdW5jdGlvbi4gIDx0dD5uYW1lPC90dD4gaXMgdGhlIG5hbWUgb2YgdGhlIEMgZnVuY3Rpb24sIDx0dD50PC90dD4gaXMgdGhlIHJldHVybiBkYXRhdHlwZSwgPHR0Pmw8L3R0PiBpcyB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgPHR0PmY8L3R0PiBpcyBhIFdyYXBwZXJGdW5jdGlvbiBvYmplY3QuICBUaGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgb25lIGhhcyBmaXJzdCBjYWxsZWQgPHR0PmVtaXRfYXJncygpPC90dD4uCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBlbWl0X2Jhbm5lcihGSUxFICpmaWxlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5FbWl0cyB0aGUgU1dJRyBiYW5uZXIgY29tbWVudCB0byB0aGUgb3V0cHV0IGZpbGUuICAKLTwvZGw+Ci08cD4KLTxoNj4gdm9pZCAgZW1pdF9zZXRfZ2V0KGNoYXIgKm5hbWUsIGNoYXIgKnJlbmFtZSwgRGF0YVR5cGUgKnQpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkdpdmVuIGEgdmFyaWFibGUgb2YgdHlwZSA8dHQ+dDwvdHQ+LCB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdHdvIGZ1bmN0aW9ucyB0byBzZXQgYW5kIGdldCB0aGUgdmFsdWUuICBUaGVzZSBmdW5jdGlvbnMgYXJlIHRoZW4gd3JhcHBlZCBsaWtlIG5vcm1hbCBDIGZ1bmN0aW9ucy4gIDx0dD5uYW1lPC90dD4gaXMgdGhlIHJlYWwgbmFtZSBvZiB0aGUgdmFyaWFibGUuICA8dHQ+cmVuYW1lPC90dD4gaXMgdGhlIHJlbmFtZWQgdmVyc2lvbiBvZiB0aGUgdmFyaWFibGUuICAKLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkICBlbWl0X3B0cl9lcXVpdmFsZW5jZShGSUxFICpmaWxlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5UbyBrZWVwIHRyYWNrIG9mIGRhdGF0eXBlcywgU1dJRyBtYWludGFpbnMgYW4gaW50ZXJuYWwgdGFibGUgb2YgImVxdWl2YWxlbnQiIGRhdGF0eXBlcy4gIFRoaXMgdGFibGUgaXMgdXBkYXRlZCBieSB0eXBlZGVmLCBjbGFzcyBkZWZpbml0aW9ucywgYW5kIG90aGVyIEMgY29uc3RydWN0cy4gICBUaGlzIGZ1bmN0aW9uIGVtaXRzIGNvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlLWNoZWNrZXIgdGhhdCBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHBvaW50ZXJzIHdvcmsgY29ycmVjdGx5LiAgVHlwaWNhbGx5IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFuIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHBhcnNlZCBjb21wbGV0ZWx5LgotPC9kbD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gV3JpdGluZyBhIFJlYWwgTGFuZ3VhZ2UgTW9kdWxlPC9oMj4KLVdoZXcsIGFzc3VtaW5nIHlvdSd2ZSBtYWRlIGl0IHRoaXMgZmFyLCB3ZSdyZSByZWFkeSB0byB3cml0ZSBhIHJlYWwgbGFuZ3VhZ2UgbW9kdWxlLiAgSW4gdGhpcyBleGFtcGxlLCB3ZSdsbCBkZXZlbG9wIGEgc2ltcGxlIFRjbCBtb2R1bGUuICAgVGNsIGhhcyBiZWVuIGNob3NlbiBiZWNhdXNlIGl0IGhhcyBhIHJlbGF0aXZlbHkgc2ltcGxlIEMgQVBJIHRoYXQgaXMgd2VsbCBkb2N1bWVudGVkIGFuZCBlYXN5IHRvIHVuZGVyc3RhbmQuICAgIFRoZSBtb2R1bGUgZGV2ZWxvcGVkIGhlcmUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSByZWFsIFNXSUcgVGNsIG1vZHVsZSAod2hpY2ggaXMgc2lnbmlmaWNhbnRseSBtb3JlIGNvbXBsaWNhdGVkKS4gICA8cD4KLTxhIG5hbWU9Im4yOSI+PC9hPjxoMz4gVGhlIGhlYWRlciBmaWxlPC9oMz4KLVdlIHdpbGwgc3RhcnQgd2l0aCB0aGUgc2FtZSBoZWFkZXIgZmlsZSBhcyBiZWZvcmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGUgOiBteWxhbmcuaAotLy8gQSBzaW1wbGUgU1dJRyBMYW5ndWFnZSBtb2R1bGUKLQotY2xhc3MgTVlMQU5HIDogcHVibGljIExhbmd1YWdlIHsKLXByaXZhdGU6Ci0JY2hhciAqbW9kdWxlOwotcHVibGljIDoKLQlNWUxBTkcoKSB7IAotCQltb2R1bGUgPSAwOwotCX07Ci0JLy8gVmlydHVhbCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIFNXSUcgcGFyc2VyCi0JIHZvaWQgcGFyc2VfYXJncyhpbnQsIGNoYXIgKmFyZ3ZbXSk7Ci0JIHZvaWQgcGFyc2UoKTsKLQkgdm9pZCBjcmVhdGVfZnVuY3Rpb24oY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIFBhcm1MaXN0ICopOwotCSB2b2lkIGxpbmtfdmFyaWFibGUoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICopOwotCSB2b2lkIGRlY2xhcmVfY29uc3QoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIGNoYXIgKik7Ci0JIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsKLQkgdm9pZCBoZWFkZXJzKHZvaWQpOwotCSB2b2lkIGNsb3NlKHZvaWQpOwotCSB2b2lkIHNldF9tb2R1bGUoY2hhciAqLGNoYXIgKiopOwotCSB2b2lkIGNyZWF0ZV9jb21tYW5kKGNoYXIgKiwgY2hhciAqKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zMCI+PC9hPjxoMz4gQ29tbWFuZCBMaW5lIE9wdGlvbnMgYW5kIEJhc2ljIEluaXRpYWxpemF0aW9uPC9oMz4KLUNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBwYXJzZWQgdXNpbmcgdGhlIDx0dD5wYXJzZV9hcmdzKCk8L3R0PiBtZXRob2QgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQSBzaW1wbGUgU1dJRyBMYW5ndWFnZSBtb2R1bGUKLS8vCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2luY2x1ZGUgInN3aWcuaCIKLSNpbmNsdWRlICJteWxhbmcuaCIKLQotc3RhdGljIGNoYXIgKnVzYWdlID0gIlwKLU15IExhbmd1YWdlIE9wdGlvbnNcblwKLSAgICAgLW1vZHVsZSBuYW1lICAgIC0gU2V0IG5hbWUgb2YgbW9kdWxlXG5cbiI7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCi0vLwotLy8gUGFyc2UgbXkgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYnkgdmFyaWFibGVzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTVlMQU5HOjpwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgLy8gTG9vayBmb3IgY2VydGFpbiBjb21tYW5kIGxpbmUgb3B0aW9ucwotICBmb3IgKGludCBpID0gMTsgaSAmbHQ7IGFyZ2M7IGkrKykgewotICAgIGlmIChhcmd2W2ldKSB7Ci0gICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sIi1tb2R1bGUiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChhcmd2W2krMV0pIHsKLSAgICAgICAgICBzZXRfbW9kdWxlKGFyZ3ZbaSsxXSwwKTsKLSAgICAgICAgICBtYXJrX2FyZyhpKTsKLSAgICAgICAgICBtYXJrX2FyZyhpKzEpOwotICAgICAgICAgIGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhcmdfZXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwiLWhlbHAiKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgdXNhZ2UpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyBTZXQgbG9jYXRpb24gb2YgU1dJRyBsaWJyYXJ5Ci0gIHN0cmNweShMaWJEaXIsInRjbCIpOwotCi0gIC8vIEFkZCBhIHN5bWJvbCB0byB0aGUgcGFyc2VyIGZvciBjb25kaXRpb25hbCBjb21waWxhdGlvbgotICBhZGRfc3ltYm9sKCJTV0lHVENMIiwwLDApOwotCi0gIC8vIEFkZCB0eXBlbWFwIGRlZmluaXRpb25zCi0gIHR5cGVtYXBfbGFuZyA9ICJ0Y2wiOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1QYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvbGxvd3MgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgZm9yIHdyaXRpbmcgYSBDKysgbWFpbiBwcm9ncmFtIHdpdGggb25lIGNhdmVhdC4gIEZvciBlYWNoIG9wdGlvbiB0aGF0IHlvdXIgbGFuZ3VhZ2UgbW9kdWxlIHBhcnNlcywgeW91IG5lZWQgdG8gY2FsbCB0aGUgZnVuY3Rpb24gPHR0Pm1hcmtfYXJnKCk8L3R0Pi4gICBUaGlzIHRlbGxzIHRoZSBTV0lHIG1haW4gcHJvZ3JhbSB0aGF0IHlvdXIgbW9kdWxlIGZvdW5kIGEgdmFsaWQgb3B0aW9uIGFuZCB1c2VkIGl0LiAgIElmIHlvdSBkb24ndCBkbyB0aGlzLCBTV0lHIHdpbGwgZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdW5yZWNvZ25pemVkIGNvbW1hbmQgbGluZSBvcHRpb25zLjxwPgotPHA+Ci1BZnRlciBwcm9jZXNzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCB5b3UgbmV4dCBuZWVkIHRvIHNldCB0aGUgdmFyaWFibGUgPHR0PkxpYkRpcjwvdHQ+IHdpdGggdGhlIG5hbWUgb2YgdGhlIHN1YmRpcmVjdG9yeSB5b3VyICBsYW5ndWFnZSB3aWxsIHVzZSB0byBmaW5kIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkuICAgIFNpbmNlIHdlIGFyZSBtYWtpbmcgYSBuZXcgVGNsIG1vZHVsZSwgd2UnbGwganVzdCBzZXQgdGhpcyB0byAiPHR0PnRjbDwvdHQ+Ii48cD4KLTxwPgotTmV4dCwgd2UgbWF5IHdhbnQgdG8gYWRkIGEgc3ltYm9sIHRvIFNXSUcncyBzeW1ib2wgdGFibGUuICBJbiB0aGlzIGNhc2Ugd2UncmUgYWRkaW5nICI8dHQ+U1dJR1RDTDwvdHQ+IiB0byBpbmRpY2F0ZSB0aGF0IHdlJ3JlIHVzaW5nIFRjbC4gIFNXSUcgbW9kdWxlcyBjYW4gdXNlIHRoaXMgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGFuZCBkZXRlY3RpbmcgeW91ciBtb2R1bGUgdXNpbmcgPHR0PiNpZmRlZjwvdHQ+LiAgICA8cD4KLTxwPgotRmluYWxseSwgd2UgbmVlZCB0byBzZXQgdGhlIHZhcmlhYmxlIDx0dD50eXBlbWFwX2xhbmc8L3R0Pi4gIFRoaXMgc2hvdWxkIGJlIGFzc2lnbmVkIGEgbmFtZSB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBmb3IgYWxsIHR5cGVtYXAgZGVjbGFyYXRpb25zLiAgICBXaGVuIGEgdXNlciBnaXZlcyBhIHR5cGVtYXAsIHRoZXkgd291bGQgdXNlIHRoaXMgbmFtZSBhcyB0aGUgdGFyZ2V0IGxhbmd1YWdlLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBTdGFydGluZyB0aGUgcGFyc2VyPC9oMz4KLVRvIHN0YXJ0IHRoZSBTV0lHIHBhcnNlciwgdGhlIDx0dD5wYXJzZSgpPC90dD4gbWV0aG9kIGlzIHVzZWQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdm9pZCBNWUxBTkc6OnBhcnNlKCkKLS8vCi0vLyBTdGFydCBwYXJzaW5nIGFuIGludGVyZmFjZSBmaWxlIGZvciBNWUxBTkcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OnBhcnNlKCkgewotCi0JZnByaW50ZihzdGRlcnIsIk1ha2luZyB3cmFwcGVycyBmb3IgVGNsXG4iKTsKLQloZWFkZXJzKCk7ICAgICAgIC8vIEVtaXQgaGVhZGVyIGZpbGVzIGFuZCBvdGhlciBzdXBwb3J0aW5nIGNvZGUKLQotCS8vIFRlbGwgdGhlIHBhcnNlciB0byBmaXJzdCBpbmNsdWRlIGEgdHlwZW1hcCBkZWZpbml0aW9uIGZpbGUKLQotCWlmIChpbmNsdWRlX2ZpbGUoImxhbmcubWFwIikgPT0gLTEpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBmaW5kIGxhbmcubWFwIVxuIik7Ci0JICAgIFNXSUdfZXhpdCgxKTsKLSAgICAgICB9Ci0JeXlwYXJzZSgpOyAgICAgICAvLyBSdW4gdGhlIFNXSUcgcGFyc2VyCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgZnVuY3Rpb24gc2hvdWxkIHByaW50IHNvbWUga2luZCBvZiBtZXNzYWdlIHRvIHRoZSB1c2VyIGluZGljYXRpbmcgd2hhdCBsYW5ndWFnZSBpcyBiZWluZyB0YXJnZXRlZC4gIFRoZSA8dHQ+aGVhZGVycygpPC90dD4gbWV0aG9kIGlzIGNhbGxlZCAoc2VlIGJlbG93KSB0byBlbWl0IHN1cHBvcnQgY29kZSBhbmQgaGVhZGVyIGZpbGVzLiAgICBGaW5hbGx5LCB3ZSBtYWtlIGEgY2FsbCB0byA8dHQ+eXlwYXJzZSgpPC90dD4uICBUaGlzIHN0YXJ0cyB0aGUgU1dJRyBwYXJzZXIgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHJlYWQuICA8cD4KLTxwPgotSW4gb3VyIGltcGxlbWVudGF0aW9uLCB3ZSBoYXZlIGFsc28gYWRkZWQgY29kZSB0byBpbW1lZGlhdGVseSBpbmNsdWRlIGEgZmlsZSBgPHR0PmxhbmcubWFwPC90dD4nLiAgVGhpcyBmaWxlIHdpbGwgY29udGFpbiB0eXBlbWFwIGRlZmluaXRpb25zIHRvIGJlIHVzZWQgYnkgb3VyIG1vZHVsZSBhbmQgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBsYXRlci4gICA8cD4KLTxhIG5hbWU9Im4zMiI+PC9hPjxoMz4gRW1pdHRpbmcgaGVhZGVycyBhbmQgc3VwcG9ydCBjb2RlPC9oMz4KLVByaW9yIHRvIGVtaXR0aW5nIGFueSBjb2RlLCBvdXIgbW9kdWxlIHNob3VsZCBlbWl0IHN0YW5kYXJkIGhlYWRlciBmaWxlcyBhbmQgc3VwcG9ydCBjb2RlLiAgVGhpcyBpcyBkb25lIHVzaW5nIHRoZSA8dHQ+aGVhZGVycygpPC90dD4gbWV0aG9kIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmhlYWRlcnModm9pZCkKLS8vCi0vLyBHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGVzIGZvciBNWUxBTkcgaW50ZXJmYWNlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6aGVhZGVycyh2b2lkKQotewotICBlbWl0X2Jhbm5lcihmX2hlYWRlcik7ICAgICAgICAgICAgICAgLy8gUHJpbnQgdGhlIFNXSUcgYmFubmVyIG1lc3NhZ2UKLSAgZnByaW50ZihmX2hlYWRlciwiLyogSW1wbGVtZW50YXRpb24gOiBNeSBUQ0wgKi9cblxuIik7Ci0KLSAgLy8gSW5jbHVkZSBoZWFkZXIgZmlsZSBjb2RlIGZyYWdtZW50IGludG8gdGhlIG91dHB1dAotICBpZiAoaW5zZXJ0X2ZpbGUoImhlYWRlci5zd2ciLGZfaGVhZGVyKSA9PSAtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCJGYXRhbCBFcnJvci4gVW5hYmxlIHRvIGxvY2F0ZSAnaGVhZGVyLnN3ZycuXG4iKTsKLSAgICBTV0lHX2V4aXQoMSk7Ci0gIH0KLQotICAvLyBFbWl0IHRoZSBkZWZhdWx0IFNXSUcgcG9pbnRlciB0eXBlLWNoZWNrZXIgKGZvciBzdHJpbmdzKQotICBpZiAoaW5zZXJ0X2ZpbGUoInN3aWdwdHIuc3dnIixmX2hlYWRlcikgPT0gLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiRmF0YWwgRXJyb3IuIFVuYWJsZSB0byBsb2NhdGUgJ3N3aWdwdHIuc3dnJy5cbiIpOwotICAgIFNXSUdfZXhpdCgxKTsKLSAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgd2UgZW1pdCB0aGUgc3RhbmRhcmQgU1dJRyBiYW5uZXIgZm9sbG93ZWQgYnkgYSBjb21tZW50IGluZGljYXRpbmcgd2hpY2ggbGFuZ3VhZ2UgbW9kdWxlIGlzIGJlaW5nIHVzZWQuICAgQWZ0ZXIgdGhhdCwgd2UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgdHdvIGRpZmZlcmVudCBmaWxlcy4gIGA8dHQ+aGVhZGVyLnN3Zyc8L3R0PiBpcyBhIGZpbGUgY29udGFpbmluZyBzdGFuZGFyZCBkZWNsYXJhdGlvbnMgbmVlZGVkIHRvIGJ1aWxkIGEgVGNsIGV4dGVuc2lvbi4gIEZvciBvdXIgZXhhbXBsZSwgaXQgd2lsbCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGhlYWRlci5zd2cgKi8KLSNpbmNsdWRlICZsdDt0Y2wuaCZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGZpbGUgYDx0dD5zd2lncHRyLnN3Zyc8L3R0PiBjb250YWlucyB0aGUgc3RhbmRhcmQgU1dJRyBwb2ludGVyLXR5cGUgY2hlY2tpbmcgbGlicmFyeS4gICBUaGlzIGxpYnJhcnkgY29udGFpbnMgYWJvdXQgMzAwIGxpbmVzIG9mIHJhdGhlciBuYXN0eSBsb29raW5nIHN1cHBvcnQgY29kZSB0aGF0IGRlZmluZSB0aGUgZm9sbG93aW5nIDMgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGg2PiB2b2lkIFNXSUdfUmVnaXN0ZXJNYXBwaW5nKGNoYXIgKnR5cGUxLCBjaGFyICp0eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKigqY2FzdCkodm9pZCAqKSk8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGEgbWFwcGluZyBiZXR3ZWVuIEMgZGF0YXR5cGVzIDx0dD50eXBlMTwvdHQ+IGFuZCA8dHQ+dHlwZTI8L3R0Pi4gIFRoaXMgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUtY2hlY2tlciBhbmQgaXMgc2ltaWxpYXIgdG8gYSB0eXBlZGVmLiAgPHR0PmNhc3Q8L3R0PiBpcyBhbiBvcHRpb25hbCAgZnVuY3Rpb24gcG9pbnRlciBkZWZpbmluZyBhIG1ldGhvZCBmb3IgcHJvcGVyIHBvaW50ZXIgY29udmVyc2lvbiAoaWYgbmVlZGVkKS4gIE5vcm1hbGx5LCBjYXN0IGlzIG9ubHkgdXNlZCB3aGVuIGNvbnZlcnRpbmcgYmV0d2VlbiBiYXNlIGFuZCBkZXJpdmVkIGNsYXNzZXMgaW4gQysrIGFuZCBpcyBuZWVkZWQgZm9yIHByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLTwvZGw+Ci08cD4KLTxoNj4gdm9pZCBTV0lHX01ha2VQdHIoY2hhciAqc3RyLCB2b2lkICpwdHIsIGNoYXIgKnR5cGUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPk1ha2VzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgQyBwb2ludGVyLiAgVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPHR0PnN0cjwvdHQ+IHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdC4gIDx0dD5wdHI8L3R0PiBjb250YWlucyB0aGUgcG9pbnRlciB2YWx1ZSBhbmQgPHR0PnR5cGU8L3R0PiBpcyBhIHN0cmluZyBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGF0eXBlLiAKLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICpTV0lHX0dldFB0cihjaGFyICpzdHIsIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkV4dHJhY3RzIGEgcG9pbnRlciBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24sIHBlcmZvcm1zIHR5cGUtY2hlY2tpbmcsIGFuZCBjYXN0aW5nLiAgIDx0dD5zdHI8L3R0PiBpcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBvaW50ZXItdmFsdWUgcmVwcmVzZW50YXRpb24sIDx0dD5wdHI8L3R0PiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcG9pbnRlciB0aGF0IHdpbGwgYmUgcmV0dXJuZWQsIGFuZCA8dHQ+dHlwZSA8L3R0PmlzIHRoZSBzdHJpbmcgY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZS4gIElmIGEgdHlwZS1lcnJvciBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgPHR0PmNoYXIgKjwvdHQ+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmluZyB0aGF0IHdhcyBpbnZhbGlkLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gICBJZiBhIE5VTEwgcG9pbnRlciBpcyBnaXZlbiBmb3IgPHR0PnR5cGU8L3R0PiwgdGhlIGZ1bmN0aW9uIHdpbGwgYWNjZXB0IGEgcG9pbnRlciBvZiBhbnkgdHlwZS4KLTwvZGw+Ci08cD4KLVdlIHdpbGwgdXNlIHRoZXNlIGZ1bmN0aW9ucyBsYXRlci48cD4KLTxhIG5hbWU9Im4zMyI+PC9hPjxoMz4gU2V0dGluZyBhIG1vZHVsZSBuYW1lPC9oMz4KLVRoZSA8dHQ+c2V0X21vZHVsZSgpPC90dD4gbWV0aG9kIGlzIHVzZWQgd2hlbmV2ZXIgdGhlIDx0dD4lbW9kdWxlPC90dD4gZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkLjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpzZXRfbW9kdWxlKGNoYXIgKm1vZF9uYW1lLGNoYXIgKiptb2RfbGlzdCkKLS8vCi0vLyBTZXRzIHRoZSBtb2R1bGUgbmFtZS4gIERvZXMgbm90aGluZyBpZiBpdCdzIGFscmVhZHkgc2V0IChzbyBpdCBjYW4KLS8vIGJlIG92ZXJyaWRkZW50IGFzIGEgY29tbWFuZCBsaW5lIG9wdGlvbikuCi0vLwotLy8gbW9kX2xpc3QgaXMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsIG1vZHVsZXMgdG8gaW5pdGlhbGl6ZQotLy8gYW5kIGlzIG9ubHkgcHJvdmlkZWQgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIHNvbWV0aGluZyBsaWtlIHRoaXMgOgotLy8gJW1vZHVsZSBmb28sIG1vZDEsIG1vZDIsIG1vZDMsIG1vZDQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6c2V0X21vZHVsZShjaGFyICptb2RfbmFtZSwgY2hhciAqKm1vZF9saXN0KSB7Ci0JaWYgKG1vZHVsZSkgcmV0dXJuOwotCW1vZHVsZSA9IG5ldyBjaGFyW3N0cmxlbihtb2RfbmFtZSkrMV07Ci0Jc3RyY3B5KG1vZHVsZSxtb2RfbmFtZSk7Ci0JLy8gTWFrZSBzdXJlIHRoZSBuYW1lIGNvbmZvcm1zIHRvIFRjbCBuYW1pbmcgY29udmVudGlvbnMKLQlmb3IgKGNoYXIgKmMgPSBtb2R1bGU7ICgqYyk7IGMrKykKLQkJKmMgPSB0b2xvd2VyKCpjKTsKLQl0b3VwcGVyKG1vZHVsZSk7Ci19IAotCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZnVuY3Rpb24gbWF5LCBpbiBmYWN0LCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGNvdXJzZSBvZiBwcm9jZXNzaW5nLiAgTm9ybWFsbHksIHdlIG9ubHkgYWxsb3cgYSBtb2R1bGUgbmFtZSB0byBiZSBzZXQgb25jZSBhbmQgaWdub3JlIGFsbCBzdWJzZXF1ZW50IGNhbGxzIGhvd2V2ZXIuPHA+Ci08YSBuYW1lPSJuMzQiPjwvYT48aDM+IEZpbmFsIEluaXRpYWxpemF0aW9uPC9oMz4KLVRoZSBpbml0aWFsaXphdGlvbiBvZiBhIG1vZHVsZSB0YWtlcyBzZXZlcmFsIHN0ZXBzLS1wYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCBwcmludGluZyBzdGFuZGFyZCBoZWFkZXIgZmlsZXMsIHN0YXJ0aW5nIHRoZSBwYXJzZXIsIGFuZCBzZXR0aW5nIHRoZSBtb2R1bGUgbmFtZS4gIFRoZSBmaW5hbCBzdGVwIGluIGluaXRpYWxpemF0aW9uIGlzIGNhbGxpbmcgdGhlIDx0dD5pbml0aWFsaXplKCk8L3R0PiBtZXRob2QgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmluaXRpYWxpemUodm9pZCkKLS8vCi0vLyBQcm9kdWNlcyBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gICBBc3N1bWVzIHRoYXQgdGhlIG1vZHVsZQotLy8gbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6aW5pdGlhbGl6ZSgpCi17Ci0JLy8gQ2hlY2sgaWYgYSBtb2R1bGUgaGFzIGJlZW4gZGVmaW5lZAotCWlmICghbW9kdWxlKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nLiBObyBtb2R1bGUgbmFtZSBnaXZlbiFcbiIpOwotCQltb2R1bGUgPSAic3dpZyI7Ci0JfQotCi0JLy8gR2VuZXJhdGUgYSBDUFAgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCi0JZnByaW50ZihmX2hlYWRlciwiI2RlZmluZSBTV0lHX2luaXQgICAgJXNfSW5pdFxuXG5cbiIsIG1vZHVsZSk7Ci0KLQkvLyBTdGFydCBnZW5lcmF0aW5nIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotCWZwcmludGYoZl9pbml0LCJpbnQgU1dJR19pbml0KFRjbF9JbnRlcnAgKmludGVycCkge1xuIik7Ci0JZnByaW50ZihmX2luaXQsIlx0IGlmIChpbnRlcnAgPT0gMCkgcmV0dXJuIFRDTF9FUlJPUjtcbiIpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmluaXRpYWxpemUoKTwvdHQ+IG1ldGhvZCBzaG91bGQgY3JlYXRlIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkgZW1pdHRpbmcgY29kZSB0byA8dHQ+Zl9pbml0PC90dD4gYXMgc2hvd24uICAgQnkgdGhpcyBwb2ludCwgd2Ugc2hvdWxkIGFscmVhZHkga25vdyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlLCBidXQgc2hvdWxkIGNoZWNrIGp1c3QgaW4gY2FzZS4gICBUaGUgcHJlZmVycmVkIHN0eWxlIG9mIGNyZWF0aW5nIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyB0byBjcmVhdGUgYSBDIHByZXByb2Nlc3NvciBzeW1ib2wgPHR0PlNXSUdfaW5pdDwvdHQ+LiAgICAgIERvaW5nIHNvIG1heSBsb29rIHdlaXJkLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgbWFueSBTV0lHIGxpYnJhcnkgZmlsZXMgbWF5IHdhbnQgdG8ga25vdyB0aGUgbmFtZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICAgSWYgd2UgZGVmaW5lIGEgc3ltYm9sIGZvciBpdCwgdGhlc2UgZmlsZXMgY2FuIHNpbXBseSBhc3N1bWUgdGhhdCBpdCdzIGNhbGxlZCA8dHQ+U1dJR19pbml0KCk8L3R0PiBhbmQgZXZlcnl0aGluZyB3aWxsIHdvcmsgb3V0IChva2F5LCBzbyBpdCdzIGEgaGFjaykuPHA+Ci08YSBuYW1lPSJuMzUiPjwvYT48aDM+IENsZWFudXAgPC9oMz4KLVdoZW4gYW4gaW50ZXJmYWNlIGZpbGUgaGFzIGZpbmlzaGVkIHBhcnNpbmcsIHdlIG5lZWQgdG8gY2xlYW4gZXZlcnl0aGluZyB1cC4gIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgPHR0PmNsb3NlKCk8L3R0PiBtZXRob2QgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpjbG9zZSh2b2lkKQotLy8KLS8vIFdyYXAgdGhpbmdzIHVwLiAgQ2xvc2UgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OmNsb3NlKHZvaWQpCi17Ci0gIC8vIER1bXAgdGhlIHBvaW50ZXIgZXF1aXZhbGVuY3kgdGFibGUKLSAgZW1pdF9wdHJfZXF1aXZhbGVuY2UoZl9pbml0KTsKLQotICAvLyBGaW5pc2ggb2ZmIG91ciBpbml0IGZ1bmN0aW9uIGFuZCBwcmludCBpdCB0byB0aGUgaW5pdCBmaWxlCi0gIGZwcmludGYoZl9pbml0LCJcdCByZXR1cm4gVENMX09LO1xuIik7Ci0gIGZwcmludGYoZl9pbml0LCJ9XG4iKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5jbG9zZSgpPC90dD4gbWV0aG9kIHNob3VsZCBmaXJzdCBjYWxsIDx0dD5lbWl0X3B0cl9lcXVpdmFsZW5jZSgpPC90dD4gaWYgdGhlIFNXSUcgcG9pbnRlciB0eXBlIGNoZWNrZXIgaGFzIGJlZW4gdXNlZC4gIFRoaXMgZHVtcHMgb3V0IHN1cHBvcnQgY29kZSB0byBtYWtlIHN1cmUgdGhlIHR5cGUtY2hlY2tlciB3b3JrcyBjb3JyZWN0bHkuICBBZnRlcndhcmRzLCB3ZSBzaW1wbHkgbmVlZCB0byB0ZXJtaW5hdGUgb3VyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGFzIHNob3duLiAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQsIFNXSUcgZHVtcHMgb3V0IGFsbCBvZiBpdHMgZG9jdW1lbnRhdGlvbiBmaWxlcyBhbmQgZXhpdHMuPHA+Ci08YSBuYW1lPSJuMzYiPjwvYT48aDM+IENyZWF0aW5nIENvbW1hbmRzPC9oMz4KLU5vdywgd2UncmUgbW92aW5nIGludG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBwYXJ0IG9mIFNXSUcuICAgIFRoZSBmaXJzdCBzdGVwIGlzIHRvIG1ha2UgYSBmdW5jdGlvbiB0byBjcmVhdGUgc2NyaXB0aW5nIGxhbmd1YWdlIGNvbW1hbmRzLiAgVGhpcyBpcyBkb25lIHVzaW5nIHRoZSA8dHQ+Y3JlYXRlX2NvbW1hbmQoKTwvdHQ+IGZ1bmN0aW9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmNyZWF0ZV9jb21tYW5kKGNoYXIgKmNuYW1lLCBjaGFyICppbmFtZSkKLS8vCi0vLyBDcmVhdGVzIGEgVGNsIGNvbW1hbmQgZnJvbSBhIEMgZnVuY3Rpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6Y3JlYXRlX2NvbW1hbmQoY2hhciAqY25hbWUsIGNoYXIgKmluYW1lKSB7Ci0JLy8gQ3JlYXRlIGEgbmFtZSBmb3IgdGhlIHdyYXBwZXIgZnVuY3Rpb24KLQljaGFyICp3bmFtZSA9IG5hbWVfd3JhcHBlcihjbmFtZSwiIik7Ci0KLQkvLyBDcmVhdGUgYSBUY2wgY29tbWFuZAotCWZwcmludGYoZl9pbml0LCJcdCBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsXCIlc1wiLCVzLCAoQ2xpZW50RGF0YSkgTlVMTCwKLQkJKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpO1xuIiwgaW5hbWUsIHduYW1lKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRm9yIG91ciBUY2wgbW9kdWxlLCB0aGlzIGp1c3QgY2FsbHMgVGNsX0NyZWF0ZUNvbW1hbmQgdG8gbWFrZSBhIG5ldyBzY3JpcHRpbmcgbGFuZ3VhZ2UgY29tbWFuZC4gPHA+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IENyZWF0aW5nIGEgV3JhcHBlciBGdW5jdGlvbjwvaDM+Ci1UaGUgbW9zdCBjb21wbGljYXRlZCBwYXJ0IG9mIHdyaXRpbmcgYSBsYW5ndWFnZSBtb2R1bGUgaXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgd3JhcHBlciBmdW5jdGlvbnMuICBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIDx0dD5jcmVhdGVfZnVuY3Rpb24oKTwvdHQ+IG1ldGhvZCBhcyBzaG93biBoZXJlIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmNyZWF0ZV9mdW5jdGlvbihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKmQsIFBhcm1MaXN0ICpsKQotLy8KLS8vIENyZWF0ZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBpbnRlcnByZXRlci4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OmNyZWF0ZV9mdW5jdGlvbihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsIFBhcm1MaXN0ICpsKQotewotICBTdHJpbmcgICAgICAgICAgIHNvdXJjZSwgdGFyZ2V0OwotICBjaGFyICAgICAgICAgICAgICp0bTsKLSAgU3RyaW5nICAgICAgICAgICBjbGVhbnVwLCBvdXRhcmc7Ci0gIFdyYXBwZXJGdW5jdGlvbiAgZjsKLQotICAvLyBNYWtlIGEgd3JhcHBlciBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCi0gIGNoYXIgKnduYW1lID0gbmFtZV93cmFwcGVyKGluYW1lLCIiKTsKLQotICAvLyBOb3cgd3JpdGUgdGhlIHdyYXBwZXIgZnVuY3Rpb24gaXRzZWxmCi0gIGYuZGVmICZsdDsmbHQ7ICJzdGF0aWMgaW50ICIgJmx0OyZsdDsgd25hbWUgJmx0OyZsdDsgIihDbGllbnREYXRhIGNsaWVudERhdGEsIFRjbF9JbnRlcnAgKmludGVycCwgaW50IAotYXJnYywgY2hhciAqYXJndltdKSB7XG4iOwotCi0gIC8vIEVtaXQgYWxsIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgZm9yIGhvbGRpbmcgYXJndW1lbnRzLgotICBpbnQgcGNvdW50ID0gZW1pdF9hcmdzKHQsbCxmKTsKLQotICAvLyBHZXQgbnVtYmVyIG9mIG9wdGlvbmFsL2RlZmF1bHQgYXJndW1lbnRzCi0gIGludCBudW1vcHQgPSBsLSZndDtudW1vcHQoKTsKLQotICAvLyBFbWl0IGNvdW50IHRvIGNoZWNrIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCi0gIGYuY29kZSAmbHQ7Jmx0OyB0YWI0ICZsdDsmbHQ7ICJpZiAoKGFyZ2MgJmx0OyAiICZsdDsmbHQ7IChwY291bnQtbnVtb3B0KSArIDEgJmx0OyZsdDsgIikgfHwgKGFyZ2MgJmd0OyAiIAotICAgICAgICAgJmx0OyZsdDsgbC0mZ3Q7bnVtYXJnKCkrMSAmbHQ7Jmx0OyAiKSkge1xuIgotICAgICAgICAgJmx0OyZsdDsgdGFiOCAmbHQ7Jmx0OyAiVGNsX1NldFJlc3VsdChpbnRlcnAsIFwiV3JvbmcgIyBhcmdzLlwiLFRDTF9TVEFUSUMpO1xuIgotICAgICAgICAgJmx0OyZsdDsgdGFiOCAmbHQ7Jmx0OyAicmV0dXJuIFRDTF9FUlJPUjtcbiIKLSAgICAgICAgICZsdDsmbHQ7IHRhYjQgJmx0OyZsdDsgIn1cbiI7Ci0KLSAgLy8gTm93IHdhbGsgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0IGFuZCBnZW5lcmF0ZSBjb2RlIHRvIGdldCBhcmd1bWVudHMKLSAgaW50IGogPSAwOyAgICAgICAgICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2Ygbm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotCi0gIGZvciAoaW50IGkgPSAwOyBpICZsdDsgcGNvdW50IDsgaSsrKSB7Ci0gICAgUGFybSAmYW1wO3AgPSAoKmwpW2ldOyAgICAgICAgIC8vIEdldCB0aGUgaXRoIGFyZ3VtZW50Ci0gICAgc291cmNlID0gIiI7Ci0gICAgdGFyZ2V0ID0gIiI7Ci0KLSAgICAvLyBQcm9kdWNlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzb3VyY2UgYW5kIHRhcmdldCBhcmd1bWVudHMKLSAgICBzb3VyY2UgJmx0OyZsdDsgImFyZ3ZbIiAmbHQ7Jmx0OyBqKzEgJmx0OyZsdDsgIl0iOwotICAgIHRhcmdldCAmbHQ7Jmx0OyAiX2FyZyIgJmx0OyZsdDsgaTsKLSAgICBpZiAoIXAuaWdub3JlKSB7Ci0gICAgICBpZiAoaiAmZ3Q7PSAocGNvdW50LW51bW9wdCkpICAvLyBDaGVjayBpZiBwYXJzaW5nIGFuIG9wdGlvbmFsIGFyZ3VtZW50Ci0gICAgICAgIGYuY29kZSAmbHQ7Jmx0OyB0YWI0ICZsdDsmbHQ7ICJpZiBhcmdjICZndDsiICZsdDsmbHQ7IGorMSAmbHQ7Jmx0OyAiKSB7XG4iOwotCi0gICAgICAvLyBHZXQgdHlwZW1hcCBmb3IgdGhpcyBhcmd1bWVudAotICAgICAgdG0gPSB0eXBlbWFwX2xvb2t1cCgiaW4iLHR5cGVtYXBfbGFuZyxwLnQscC5uYW1lLHNvdXJjZSx0YXJnZXQsJmFtcDtmKTsKLSAgICAgIGlmICh0bSkgewotICAgICAgICBmLmNvZGUgJmx0OyZsdDsgdG0gJmx0OyZsdDsgIlxuIjsKLSAgICAgICAgZi5jb2RlLnJlcGxhY2UoIiRhcmciLHNvdXJjZSk7ICAgLy8gUGVyZm9ybSBhIHZhcmlhYmxlIHJlcGxhY2VtZW50Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXMgOiBMaW5lICVkLiBObyB0eXBlbWFwcGluZyBmb3IgZGF0YXR5cGUgJXNcbiIsCi0gICAgICAgICAgICAgICAgaW5wdXRfZmlsZSxsaW5lX251bWJlciwgcC50LSZndDtwcmludF90eXBlKCkpOwotICAgICAgfQotICAgICAgaWYgKGogJmd0Oz0gKHBjb3VudC1udW1vcHQpKQotICAgICAgICBmLmNvZGUgJmx0OyZsdDsgdGFiNCAmbHQ7Jmx0OyAifSBcbiI7Ci0gICAgICBqKys7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkgc29ydCBvZiBhIGNvbnN0YWludCB0eXBlbWFwCi0gICAgaWYgKCh0bSA9IHR5cGVtYXBfbG9va3VwKCJjaGVjayIsdHlwZW1hcF9sYW5nLHAudCxwLm5hbWUsc291cmNlLHRhcmdldCkpKSB7Ci0gICAgICBmLmNvZGUgJmx0OyZsdDsgdG0gJmx0OyZsdDsgIlxuIjsKLSAgICAgIGYuY29kZS5yZXBsYWNlKCIkYXJnIixzb3VyY2UpOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbnkgY2xlYW51cCBjb2RlIChzYXZlIGl0IGZvciBsYXRlcikKLSAgICBpZiAoKHRtID0gdHlwZW1hcF9sb29rdXAoImZyZWVhcmciLHR5cGVtYXBfbGFuZyxwLnQscC5uYW1lLHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVycC0mZ3Q7cmVzdWx0IikpKSB7Ci0gICAgICBjbGVhbnVwICZsdDsmbHQ7IHRtICZsdDsmbHQ7ICJcbiI7Ci0gICAgICBjbGVhbnVwLnJlcGxhY2UoIiRhcmciLHNvdXJjZSk7Ci0gICAgfQotICAgIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgiYXJnb3V0Iix0eXBlbWFwX2xhbmcscC50LHAubmFtZSx0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnAtJmd0O3Jlc3VsdCIpKSkgewotICAgICAgb3V0YXJnICZsdDsmbHQ7IHRtICZsdDsmbHQ7ICJcbiI7Ci0gICAgICBvdXRhcmcucmVwbGFjZSgiJGFyZyIsc291cmNlKTsKLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgd3JpdGUgY29kZSB0byBtYWtlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIGVtaXRfZnVuY19jYWxsKG5hbWUsdCxsLGYpOwotCi0gIC8vIFJldHVybiB2YWx1ZSBpZiBuZWNlc3NhcnkKLSAgaWYgKCh0LSZndDt0eXBlICE9IFRfVk9JRCkgfHwgKHQtJmd0O2lzX3BvaW50ZXIpKSB7Ci0gICAgaWYgKCh0bSA9IHR5cGVtYXBfbG9va3VwKCJvdXQiLHR5cGVtYXBfbGFuZyx0LG5hbWUsIl9yZXN1bHQiLCJpbnRlcnAtJmd0O3Jlc3VsdCIpKSkgewotICAgICAgLy8gWWVwLiAgVXNlIGl0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKLSAgICAgIGYuY29kZSAmbHQ7Jmx0OyB0bSAmbHQ7Jmx0OyAiXG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwiJXMgOiBMaW5lICVkLiBObyByZXR1cm4gdHlwZW1hcCBmb3IgZGF0YXR5cGUgJXNcbiIsCi0gICAgICAgICAgICAgIGlucHV0X2ZpbGUsbGluZV9udW1iZXIsdC0mZ3Q7cHJpbnRfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEdW1wIGFyZ3VtZW50IG91dHB1dCBjb2RlOwotICBmLmNvZGUgJmx0OyZsdDsgb3V0YXJnOwotCi0gIC8vIER1bXAgdGhlIGFyZ3VtZW50IGNsZWFudXAgY29kZQotICBmLmNvZGUgJmx0OyZsdDsgY2xlYW51cDsKLQotICAvLyBMb29rIGZvciBhbnkgcmVtYWluaW5nIGNsZWFudXAuICBUaGlzIHByb2Nlc3NlcyB0aGUgJW5ldyBkaXJlY3RpdmUKLSAgaWYgKE5ld09iamVjdCkgewotICAgIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgibmV3ZnJlZSIsdHlwZW1hcF9sYW5nLHQsaW5hbWUsIl9yZXN1bHQiLCIiKSkpIHsKLSAgICAgIGYuY29kZSAmbHQ7Jmx0OyB0bSAmbHQ7Jmx0OyAiXG4iOwotICAgIH0KLSAgfQotCi0gIC8vIFNwZWNpYWwgcHJvY2Vzc2luZyBvbiByZXR1cm4gdmFsdWUuCi0gIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgicmV0Iix0eXBlbWFwX2xhbmcsdCxuYW1lLCJfcmVzdWx0IiwiIikpKSB7Ci0gICAgZi5jb2RlICZsdDsmbHQ7IHRtICZsdDsmbHQ7ICJcbiI7Ci0gIH0KLQotICAvLyBXcmFwIHRoaW5ncyB1cCAoaW4gYSBtYW5uZXIgb2Ygc3BlYWtpbmcpCi0gIGYuY29kZSAmbHQ7Jmx0OyB0YWI0ICZsdDsmbHQ7ICJyZXR1cm4gVENMX09LO1xufSI7Ci0KLSAgLy8gU3Vic3RpdHV0ZSB0aGUgY2xlYW51cCBjb2RlIChzb21lIGV4Y2VwdGlvbiBoYW5kbGVycyBsaWtlIHRvIGhhdmUgdGhpcykKLSAgZi5jb2RlLnJlcGxhY2UoIiRjbGVhbnVwIixjbGVhbnVwKTsKLQotICAvLyBFbWl0IHRoZSBmdW5jdGlvbgotICBmLnByaW50KGZfd3JhcHBlcnMpOwotCi0gIC8vIE5vdyByZWdpc3RlciB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgbGFuZ3VhZ2UKLSAgY3JlYXRlX2NvbW1hbmQoaW5hbWUsaW5hbWUpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1DcmVhdGluZyBhIHdyYXBwZXIgZnVuY3Rpb24gcmVhbGx5IGJvaWxzIGRvd24gdG8gMyBjb21wb25lbnRzIDo8cD4KLTxwPgotPHVsPgotPGxpPkVtaXQgbG9jYWwgdmFyaWFibGVzIGFuZCBoYW5kbGluZyBpbnB1dCBhcmd1bWVudHMuICAKLTxsaT5DYWxsIHRoZSByZWFsIEMgZnVuY3Rpb24uCi08bGk+Q29udmVydCB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHJlcHJlc2VudGF0aW9uLgotPC91bD4KLTxwPgotSW4gb3VyIGltcGxlbWVudGF0aW9uLCBtb3N0IG9mIHRoaXMgd29yayBpcyBkb25lIHVzaW5nIHR5cGVtYXBzLiAgIEluIGZhY3QsIHRoZSByb2xlIG9mIHRoZSBDKysgY29kZSBpcyByZWFsbHkganVzdCB0byBwcm9jZXNzIHR5cGVtYXBzIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlciBhbmQgdG8gY29tYmluZSBzdHJpbmdzIGluIHRoZSBjb3JyZWN0IG1hbm5lci4gIFRoZSBmb2xsb3dpbmcgdHlwZW1hcHMgYXJlIHVzZWQgaW4gdGhpcyBwcm9jZWR1cmUgOjxwPgotPHA+Ci08dWw+Ci08bGk+ImluIi4gIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIFRjbCB0byBDLgotPGxpPiJvdXQiLiBUaGlzIGlzIHVzZWQgdG8gY29udmVydCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gQyB0byBUY2wuCi08bGk+ImNoZWNrIi4gVGhpcyBpcyB1c2VkIHRvIGFwcGx5IGNvbnN0cmFpbnRzIHRvIHRoZSBpbnB1dCB2YWx1ZXMuCi08bGk+ImFyZ291dCIuIFVzZWQgdG8gcmV0dXJuIHZhbHVlcyB0aHJvdWdoIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCi08bGk+ImZyZWVhcmciLiBVc2VkIHRvICBjbGVhbiB1cCBhcmd1bWVudHMgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsIChwb3NzaWJseSB0byByZWxlYXNlIG1lbW9yeSwgZXRjLi4uKQotPGxpPiJyZXQiLiBVc2VkIHRvIGNsZWFuIHVwIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBDIGZ1bmN0aW9uIChwb3NzaWJseSB0byByZWxlYXNlIG1lbW9yeSkuCi08bGk+Im5ld2ZyZWUiIHRoaXMgaXMgc3BlY2lhbCBwcm9jZXNzaW5nIGFwcGxpZWQgd2hlbiB0aGUgPHR0PiVuZXc8L3R0PiBkaXJlY3RpdmUgaGFzIGJlZW4gdXNlZC4gIFVzdWFsbHkgaXRzIHVzZWQgdG8gY2xlYW4gdXAgbWVtb3J5LgotPC91bD4KLTxwPgotSXQgbWF5IHRha2UgYXdoaWxlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIHNpbmsgaW4sIGJ1dCBpdHMgb3BlcmF0aW9uIHdpbGwgaG9wZWZ1bGx5IGJlY29tZSBtb3JlIGNsZWFyIHNob3J0bHkuICAgPHA+Ci08YSBuYW1lPSJuMzgiPjwvYT48aDM+IE1hbmlwdWxhdGluZyBHbG9iYWwgVmFyaWFibGVzPC9oMz4KLVRvIHByb3ZpZGUgYWNjZXNzIHRvIEMgZ2xvYmFsIHZhcmlhYmxlcywgdGhlIDx0dD5saW5rX3ZhcmlhYmxlKCk8L3R0PiBtZXRob2QgaXMgdXNlZC4gSW4gdGhlIGNhc2Ugb2YgVGNsLCBvbmx5IDx0dD5pbnQ8L3R0PiwgPHR0PmRvdWJsZTwvdHQ+LCBhbmQgPHR0PmNoYXIgKiA8L3R0PmRhdGF0eXBlcyBjYW4gYmUgc2FmZWx5IGxpbmtlZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpsaW5rX3ZhcmlhYmxlKGNoYXIgKm5hbWUsIGNoYXIgKmluYW1lLCBEYXRhVHlwZSAqdCkKLS8vCi0vLyBDcmVhdGUgYSBUY2wgbGluayB0byBhIEMgdmFyaWFibGUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6bGlua192YXJpYWJsZShjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQpIHsKLSAgY2hhciAqdG07Ci0KLSAgLy8gVXNlcyBhIHR5cGVtYXAgdG8gc3RpY2sgY29kZSBpbnRvIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLSAgaWYgKCh0bSA9IHR5cGVtYXBfbG9va3VwKCJ2YXJpbml0Iix0eXBlbWFwX2xhbmcsdCxuYW1lLG5hbWUsaW5hbWUpKSkgewotICAgIFN0cmluZyB0ZW1wID0gdG07Ci0gICAgaWYgKFN0YXR1cyAmYW1wOyBTVEFUX1JFQURPTkxZKQotICAgICAgdGVtcC5yZXBsYWNlKCIkc3RhdHVzIiwiIHwgVENMX0xJTktfUkVBRF9PTkxZIik7Ci0gICAgZWxzZQotICAgICAgdGVtcC5yZXBsYWNlKCIkc3RhdHVzIiwiIik7Ci0gICAgZnByaW50ZihmX2luaXQsIiVzXG4iLChjaGFyICopIHRlbXApOwotICB9IGVsc2UgewotICAgIGZwcmludGYoc3RkZXJyLCIlcyA6IExpbmUgJWQuIFVuYWJsZSB0byBsaW5rIHdpdGggdmFyaWFibGUgdHlwZSAlc1xuIiwKLSAgICAgICAgICAgIGlucHV0X2ZpbGUsbGluZV9udW1iZXIsdC0mZ3Q7cHJpbnRfdHlwZSgpKTsKLSAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiB0aGlzIGNhc2UsICB0aGUgcHJvY2VkdXJlIGlzIGxvb2tpbmcgZm9yIGEgdHlwZW1hcCAidmFyaW5pdCIuICBXZSdsbCB1c2UgdGhlIGNvZGUgc3BlY2lmaWVkIHdpdGggdGhpcyB0eXBlbWFwIHRvIGNyZWF0ZSB2YXJpYWJsZSBsaW5rcy4gIElmIG5vIHR5cGVtYXAgaXMgc3VwcGxpZWQgb3IgdGhlIHVzZXIgZ2l2ZXMgYW4gdW5zdXBwb3J0ZWQgZGF0YXR5cGVzLCBhIHdhcm5pbmcgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC48cD4KLTxwPgotSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgPHR0PlN0YXR1czwvdHQ+IHZhcmlhYmxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgb3Igbm90IGEgdmFyaWFibGUgaXMgcmVhZC1vbmx5IG9yIG5vdC4gIFRvIHRlc3QgZm9yIHRoaXMsIHVzZSB0aGUgdGVjaG5pcXVlIHNob3duIGluIHRoZSBjb2RlIGFib3ZlLiAgIFJlYWQtb25seSB2YXJpYWJsZXMgbWF5IHJlcXVpcmUgc3BlY2lhbCBwcm9jZXNzaW5nIGFzIHNob3duLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBDb25zdGFudHM8L2gzPgotRmluYWxseSwgY3JlYXRpbmcgY29uc3RhbnRzIGlzIGFjY29tcGxpc2hlZCB1c2luZyB0aGUgPHR0PmRlY2xhcmVfY29uc3QoKTwvdHQ+IG1ldGhvZC4gICBGb3IgVGNsLCB3ZSBjb3VsZCBkbyB0aGlzIDo8cD4KLSA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKQotLy8KLS8vIE1ha2VzIGEgY29uc3RhbnQuICAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKSB7Ci0KLSAgY2hhciAqdG07Ci0gIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgiY29uc3QiLHR5cGVtYXBfbGFuZyx0eXBlLG5hbWUsbmFtZSxpbmFtZSkpKSB7Ci0gICAgU3RyaW5nIHN0ciA9IHRtOwotICAgIHN0ci5yZXBsYWNlKCIkdmFsdWUiLHZhbHVlKTsKLSAgICBmcHJpbnRmKGZfaW5pdCwiJXNcbiIsIChjaGFyICopIHN0cik7Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzIDogTGluZSAlZC4gVW5hYmxlIHRvIGNyZWF0ZSBjb25zdGFudCAlcyA9ICVzXG4iLAotICAgICAgICAgICAgaW5wdXRfZmlsZSwgbGluZV9udW1iZXIsIHR5cGUtJmd0O3ByaW50X3R5cGUoKSwgdmFsdWUpOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdlIHRha2UgdGhlIHNhbWUgYXBwcm9hY2ggdXNlZCB0byBjcmVhdGUgdmFyaWFibGVzLiAgSW4gdGhpcyBjYXNlLCB0aGUgYDx0dD5jb25zdDwvdHQ+JyB0eXBlbWFwIHNwZWNpZmllcyB0aGUgc3BlY2lhbCBwcm9jZXNzaW5nLjxwPgotPHA+Ci1UaGUgdmFsdWUgb2YgYSBjb25zdGFudCBpcyBhIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgU1dJRyBwYXJzZXIuICBJdCBtYXkgY29udGFpbiBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24gc3VjaCBhcyAiMyArIDQqKDcrOCkiLiAgIEJlY2F1c2Ugb2YgdGhpcywgaXQgaXMgY3JpdGljYWwgdG8gdXNlIHRoaXMgc3RyaW5nIGluIGEgd2F5IHRoYXQgYWxsb3dzIGl0IHRvIGJlIGV2YWx1YXRlZCBieSB0aGUgQyBjb21waWxlciAodGhpcyB3aWxsIGJlIGFwcGFyZW50IHdoZW4gdGhlIHR5cGVtYXBzIGFyZSBnaXZlbikuPHA+Ci08YSBuYW1lPSJuNDAiPjwvYT48aDM+IEEgUXVpY2sgSW50ZXJtaXNzaW9uPC9oMz4KLVdlIGFyZSBub3cgZG9uZSB3cml0aW5nIGFsbCBvZiB0aGUgbWV0aG9kcyBmb3Igb3VyIGxhbmd1YWdlIGNsYXNzLiAgIE9mIGFsbCBvZiB0aGUgbWV0aG9kcywgPHR0PmNyZWF0ZV9mdW5jdGlvbigpPC90dD4gaXMgdGhlIG1vc3QgY29tcGxpY2F0ZWQgYW5kIHRlbmRzIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsuICAgV2UgaGF2ZSBhbHNvIGlnbm9yZWQgaXNzdWVzIHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbiBwcm9jZXNzaW5nIGFuZCBDKysgaGFuZGxpbmcgKGFsdGhvdWdoIEMrKyB3aWxsIHdvcmsgd2l0aCB0aGUgZnVuY3Rpb25zIHdlIGhhdmUgZGVmaW5lZCBzbyBmYXIpLjxwPgotPHA+Ci1XaGlsZSBvdXIgQysrIGltcGxlbWVudGF0aW9uIGlzIGRvbmUsIHdlIHN0aWxsIGRvIG5vdCBoYXZlIGEgd29ya2luZyBsYW5ndWFnZSBtb2R1bGUuICAgSW4gZmFjdCwgaWYgd2UgcnVuIFNXSUcgb24gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGV4YW1wbGUuaSAqLwotJW1vZHVsZSBleGFtcGxlCi0lewotLyogUHV0IGhlYWRlcnMgYW5kIG90aGVyIGRlY2xhcmF0aW9ucyBoZXJlICovCi0lfQotCi0vLyBBIGZ1bmN0aW9uCi1leHRlcm4gZG91YmxlIGZvbyhkb3VibGUgYSwgZG91YmxlIGIpOwotCi0vLyBBIHZhcmlhYmxlCi1leHRlcm4gaW50IGJhcjsKLQotLy8gQSBjb25zdGFudAotI2RlZmluZSBTUEFNIDQyCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdlIGdldCB0aGUgZm9sbG93aW5nIGVycm9ycyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+W2JlYXpsZXlAZ3Vpbm5lc3MgbGFuZ10kIC4vbXlzd2lnIGV4YW1wbGUuaQotTWFraW5nIHdyYXBwZXJzIGZvciBNeSBUY2wKLWV4YW1wbGUuaSA6IExpbmUgOS4gTm8gdHlwZW1hcHBpbmcgZm9yIGRhdGF0eXBlIGRvdWJsZQotZXhhbXBsZS5pIDogTGluZSA5LiBObyB0eXBlbWFwcGluZyBmb3IgZGF0YXR5cGUgZG91YmxlCi1leGFtcGxlLmkgOiBMaW5lIDkuIE5vIHJldHVybiB0eXBlbWFwIGZvciBkYXRhdHlwZSBkb3VibGUKLWV4YW1wbGUuaSA6IExpbmUgMTIuIFVuYWJsZSB0byBsaW5rIHdpdGggdmFyaWFibGUgdHlwZSBpbnQKLWV4YW1wbGUuaSA6IExpbmUgMTYuIFVuYWJsZSB0byBjcmVhdGUgY29uc3RhbnQgaW50ICA9IDQyCi1bYmVhemxleUBndWlubmVzcyBsYW5nXSQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHdlIGhhdmUgbm90IHlldCBkZWZpbmVkIGFueSBwcm9jZXNzaW5nIGZvciByZWFsIGRhdGF0eXBlcy4gRm9yIGV4YW1wbGUsIG91ciBsYW5ndWFnZSBtb2R1bGUgaGFzIG5vIGlkZWEgaG93IHRvIGNvbnZlcnQgZG91YmxlcyBpbnRvIFRjbCBzdHJpbmdzLCBob3cgdG8gbGluayB3aXRoIEMgdmFyaWFibGVzIGFuZCBzbyBvbi4gICBUbyBkbyB0aGlzLCB3ZSBuZWVkIHRvIHdyaXRlIGEgY29sbGVjdGlvbiBvZiB0eXBlbWFwcy48cD4KLTxhIG5hbWU9Im40MSI+PC9hPjxoMz4gV3JpdGluZyB0aGUgZGVmYXVsdCB0eXBlbWFwczwvaDM+Ci1JbiBvdXIgZWFybGllciA8dHQ+cGFyc2UoKTwvdHQ+IG1ldGhvZCwgdGhlcmUgaXMgYSBzdGF0ZW1lbnQgdG8gaW5jbHVkZSB0aGUgZmlsZSBgPHR0PmxhbmcubWFwPC90dD4nLiAgIFdlIHdpbGwgdXNlIHRoaXMgZmlsZSB0byB3cml0ZSB0eXBlbWFwcyBmb3Igb3VyIG5ldyBsYW5ndWFnZSBtb2R1bGUuICBUaGUgYDx0dD5sYW5nLm1hcDwvdHQ+JyBmaWxlIHdpbGwgYWN0dWFsbHkgZ28gdGhyb3VnaCB0aGUgU1dJRyBwYXJzZXIgc28gd2UgY2FuIHdyaXRlIG91ciB0eXBlbWFwcyB1c2luZyB0aGUgbm9ybWFsIDx0dD4ldHlwZW1hcDwvdHQ+IGRpcmVjdGl2ZS4gIFRoaXMgYXBwcm9hY2ggbWFrZXMgaXQgZWFzeSBmb3IgdXMgdG8gZGVidWcgYW5kIHRlc3Qgb3VyIG1vZHVsZSBiZWNhdXNlIHRoZSB0eXBlbWFwcyBjYW4gYmUgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgd2l0aG91dCBoYXZpbmcgdG8gcmVwZWF0ZWRseSByZWNvbXBpbGUgdGhlIEMrKyBwYXJ0IG9mIHRoZSBtb2R1bGUuICA8cD4KLTxwPgotV2l0aG91dCBmdXJ0aGVyIGRlbGF5LCBoZXJlIGlzIHRoZSB0eXBlbWFwIGZpbGUgZm9yIG91ciBtb2R1bGUgKHlvdSBtaWdodCB3YW50IHRvIHNpdCBkb3duKSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbGFuZy5tYXAKLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIHR5cGUtbWFwcGluZ3MgZm9yIG91ciBsYW5ndWFnZSAoVENMKS4KLS8vIEEgdHlwZW1hcCBvZiAnU1dJR19ERUZBVUxUX1RZUEUnIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBkZWZhdWx0Ci0vLyBtYXBwaW5ncy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRlVOQ1RJT04gSU5QVVRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIEludGVnZXJzCi0ldHlwZW1hcChpbikgaW50ICAgICAgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgIHNob3J0ICAgICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICBsb25nICAgICAgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgc2lnbmVkIGNoYXIgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBpbnQgIHRlbXA7Ci0gIGlmIChUY2xfR2V0SW50KGludGVycCwgJHNvdXJjZSwgJmFtcDt0ZW1wKSA9PSBUQ0xfRVJST1IpIHJldHVybiBUQ0xfRVJST1I7Ci0gICR0YXJnZXQgPSAoJHR5cGUpIHRlbXA7Ci19Ci0KLS8vIEZsb2F0aW5nIHBvaW50Ci0ldHlwZW1hcChpbikgZmxvYXQgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICBkb3VibGUgIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIGRvdWJsZSB0ZW1wOwotICBpZiAoVGNsX0dldERvdWJsZShpbnRlcnAsICRzb3VyY2UsICZhbXA7dGVtcCkgPT0gVENMX0VSUk9SKSByZXR1cm4gVENMX0VSUk9SOwotICAkdGFyZ2V0ID0gKCR0eXBlKSB0ZW1wOwotfQotCi0vLyBTdHJpbmdzCi0ldHlwZW1hcChpbikgY2hhciAqICBTV0lHX0RFRkFVTFRfVFlQRQotewotICAkdGFyZ2V0ID0gJHNvdXJjZTsKLX0KLQotLy8gdm9pZCAqCi0ldHlwZW1hcChpbikgdm9pZCAqICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBpZiAoU1dJR19HZXRQdHIoJHNvdXJjZSwodm9pZCAqKikgJmFtcDskdGFyZ2V0LCAoY2hhciAqKSAwKSkgewotICAgIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCJUeXBlIGVycm9yLiAgRXhwZWN0ZWQgYSBwb2ludGVyIixUQ0xfU1RBVElDKTsKLSAgICByZXR1cm4gVENMX0VSUk9SOwotICB9Ci19Ci0KLS8vIFVzZXIgZGVmaW5lZCB0eXBlcyBhbmQgYWxsIG90aGVyIHBvaW50ZXJzCi0ldHlwZW1hcChpbikgVXNlciAqIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIGlmIChTV0lHX0dldFB0cigkc291cmNlLCh2b2lkICoqKSAmYW1wOyR0YXJnZXQsICIkbWFuZ2xlIikpIHsKLSAgICBUY2xfU2V0UmVzdWx0KGludGVycCwiVHlwZSBlcnJvci4gIEV4cGVjdGVkIGEgJG1hbmdsZSIsVENMX1NUQVRJQyk7Ci0gICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGVU5DVElPTiBPVVRQVVRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIFNpZ25lZCBpbnRlZ2VycwotJXR5cGVtYXAob3V0KSBpbnQgICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgc2hvcnQgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICBzaWduZWQgY2hhciBTV0lHX0RFRkFVTFRfVFlQRQotewotICBzcHJpbnRmKCR0YXJnZXQsIiVsZCIsIChsb25nKSAkc291cmNlKTsKLX0KLQotLy8gVW5zaWduZWQgaW50ZWdlcnMKLSV0eXBlbWFwKG91dCkgdW5zaWduZWQgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgc3ByaW50ZigkdGFyZ2V0LCIlbHUiLCAodW5zaWduZWQgbG9uZykgJHNvdXJjZSk7Ci19Ci0KLS8vIEZsb2F0aW5nIHBvaW50Ci0ldHlwZW1hcChvdXQpIGRvdWJsZSBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgZmxvYXQgIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIFRjbF9QcmludERvdWJsZShpbnRlcnAsKGRvdWJsZSkgJHNvdXJjZSxpbnRlcnAtJmd0O3Jlc3VsdCk7Ci19Ci0KLS8vIFN0cmluZ3MKLSV0eXBlbWFwKG91dCkgY2hhciAqU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgVGNsX1NldFJlc3VsdChpbnRlcnAsJHNvdXJjZSxUQ0xfVk9MQVRJTEUpOwotfQotCi0vLyBQb2ludGVycwotJXR5cGVtYXAob3V0KSBVc2VyICpTV0lHX0RFRkFVTFRfVFlQRQotewotICBTV0lHX01ha2VQdHIoJHRhcmdldCwodm9pZCAqKSAkc291cmNlLCAiJG1hbmdsZSIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWQVJJQUJMRSBDUkVBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBJbnRlZ2VycwotJXR5cGVtYXAodmFyaW5pdCkgaW50ICAgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIFRjbF9MaW5rVmFyKGludGVycCwgIiR0YXJnZXQiLCAoY2hhciAqKSAmYW1wOyRzb3VyY2UsIFRDTF9MSU5LX0lOVCAkc3RhdHVzKTsKLX0KLQotLy8gRG91YmxlcwotJXR5cGVtYXAodmFyaW5pdCkgZG91YmxlIFNXSUdfREVGQVVMVF9UWVBFIHsKLSAgVGNsX0xpbmtWYXIoaW50ZXJwLCIkdGFyZ2V0IiwgKGNoYXIgKikgJmFtcDskc291cmNlLCBUQ0xfTElOS19ET1VCTEUgJHN0YXR1cyk7Ci19Ci0KLS8vIFN0cmluZ3MKLSV0eXBlbWFwKHZhcmluaXQpIGNoYXIgKiBTV0lHX0RFRkFVTFRfVFlQRSB7Ci0gIFRjbF9MaW5rVmFyKGludGVycCwiJHRhcmdldCIsIChjaGFyICopICZhbXA7JHNvdXJjZSwgVENMX0xJTktfU1RSSU5HICRzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBTaWduZWQgSW50ZWdlcnMKLSV0eXBlbWFwKGNvbnN0KSBpbnQgICAgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgIHNob3J0ICAgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgICBzaWduZWQgY2hhciAgIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIHN0YXRpYyBjaGFyICpfd3JhcF8kdGFyZ2V0OwotICBfd3JhcF8kdGFyZ2V0ID0gKGNoYXIgKikgbWFsbG9jKDQwKTsKLSAgc3ByaW50Zihfd3JhcF8kdGFyZ2V0LCIlbGQiLCR2YWx1ZSk7Ci0gIFRjbF9MaW5rVmFyKGludGVycCwiJHRhcmdldCIsIChjaGFyICopICZhbXA7X3dyYXBfJHRhcmdldCwgVENMX0xJTktfU1RSSU5HIHwgCi1UQ0xfTElOS19SRUFEX09OTFkpOwotfQotCi0vLyBVbnNpZ25lZCBpbnRlZ2VycwotJXR5cGVtYXAoY29uc3QpIHVuc2lnbmVkICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBzdGF0aWMgY2hhciAqX3dyYXBfJHRhcmdldDsKLSAgX3dyYXBfJHRhcmdldCA9IChjaGFyICopIG1hbGxvYyg0MCk7Ci0gIHNwcmludGYoX3dyYXBfJHRhcmdldCwiJWx1IiwkdmFsdWUpOwotICBUY2xfTGlua1ZhcihpbnRlcnAsIiR0YXJnZXQiLCAoY2hhciAqKSAmYW1wO193cmFwXyR0YXJnZXQsIFRDTF9MSU5LX1NUUklORyB8IAotVENMX0xJTktfUkVBRF9PTkxZKTsKLX0KLQotLy8gRG91YmxlcyBhbmQgZmxvYXRzCi0ldHlwZW1hcChjb25zdCkgZG91YmxlIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgIGZsb2F0ICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBzdGF0aWMgY2hhciAqX3dyYXBfJHRhcmdldDsKLSAgX3dyYXBfJHRhcmdldCA9IChjaGFyICopIG1hbGxvYyg0MCk7Ci0gIHNwcmludGYoX3dyYXBfJHRhcmdldCwiJWYiLCR2YWx1ZSk7Ci0gIFRjbF9MaW5rVmFyKGludGVycCwiJHRhcmdldCIsIChjaGFyICopICZhbXA7X3dyYXBfJHRhcmdldCwgVENMX0xJTktfU1RSSU5HIHwgCi1UQ0xfTElOS19SRUFEX09OTFkpOwotfQotCi0vLyBTdHJpbmdzCi0ldHlwZW1hcChjb25zdCkgY2hhciAqU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgc3RhdGljIGNoYXIgKl93cmFwXyR0YXJnZXQgPSAiJHZhbHVlIjsKLSAgVGNsX0xpbmtWYXIoaW50ZXJwLCIkdGFyZ2V0IiwgKGNoYXIgKikgJmFtcDtfd3JhcF8kdGFyZ2V0LCBUQ0xfTElOS19TVFJJTkcgfCAKLVRDTF9MSU5LX1JFQURfT05MWSk7Ci19Ci0KLS8vIFBvaW50ZXJzCi0ldHlwZW1hcChjb25zdCkgVXNlciAqU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgc3RhdGljIGNoYXIgKl93cmFwXyR0YXJnZXQ7Ci0gIF93cmFwXyR0YXJnZXQgPSAoY2hhciAqKSBtYWxsb2MoMjArc3RybGVuKCIkbWFuZ2xlIikpOwotICBTV0lHX01ha2VQdHIoX3dyYXBfJHRhcmdldCwgKHZvaWQgKikgJHZhbHVlLCAiJG1hbmdsZSIpOwotICBUY2xfTGlua1ZhcihpbnRlcnAsIiR0YXJnZXQiLCAoY2hhciAqKSAmYW1wO193cmFwXyR0YXJnZXQsIFRDTF9MSU5LX1NUUklORyB8IAotVENMX0xJTktfUkVBRF9PTkxZKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93IHRoYXQgd2UgaGF2ZSBvdXIgdHlwZW1hcHMgZmlsZSwgd2UgYXJlIGRvbmUgYW5kIGNhbiBzdGFydCBwcm9kdWNpbmcgYSB2YXJpZXR5IG9mIGludGVyZXN0aW5nIFRjbCBleHRlbnNpb24gbW9kdWxlcy4gICBTaG91bGQgZXJyb3JzIGFycmlzZSwgb25lIHdpbGwgZWl0aGVyIGhhdmUgdG8gcHJ5IGludG8gdGhlIEMrKyBtb2R1bGUgb3IgdGhlIHR5cGVtYXBzIGZpbGUgZm9yIGEgY29ycmVjdGlvbi4gPHA+Ci08YSBuYW1lPSJuNDIiPjwvYT48aDM+IFRoZSBTV0lHIGxpYnJhcnkgYW5kIGluc3RhbGxhdGlvbiBpc3N1ZXM8L2gzPgotVG8gbWFrZSBhIG5ldyBTV0lHIG1vZHVsZSBnZW5lcmFsbHkgdXNhYmxlLCB5b3Ugd2lsbCB3YW50IHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5QdXQgdGhlIG5ldyBiaW5hcnkgaW4gYSBwdWJsaWNseSBhY2Nlc3NpYmxlIGxvY2F0aW9uIChpZS4gPHR0Pi91c3IvbG9jYWwvYmluPC90dD4pLgotPGxpPk1ha2UgYSBzdWJkaXJlY3RvcnkgZm9yIHlvdXIgbGFuZ3VhZ2UgaW4gdGhlIFNXSUcgbGlicmFyeS4gIFRoZSBsaWJyYXJ5IHNob3VsZCBtYXRjaCB1cCB3aXRoIHRoZSBuYW1lIHlvdSBhc3NpZ25lZCB0byB0aGUgPHR0PkxpYkRpcjwvdHQ+IHZhcmlhYmxlIGluIDx0dD5wYXJzZV9hcmdzKCk8L3R0Pi4gIAotPGxpPkNvcHkgdGhlIGZpbGUgYDx0dD5sYW5nLm1hcDwvdHQ+JyB0byB0aGUgU1dJRyBsaWJyYXJ5IGRpcmVjdG9yeS4gICBZb3VyIG5ldyB2ZXJzaW9uIG9mIFNXSUcgd2lsbCBub3cgYmUgYWJsZSB0byBmaW5kIGl0IG5vIG1hdHRlciB3aGF0IGRpcmVjdG9yeSBTV0lHIGlzIGV4ZWN1dGVkIGZyb20uCi08bGk+UHJvdmlkZSBzb21lIGRvY3VtZW50YXRpb24gYWJvdXQgaG93IHlvdXIgbW9kdWxlIHdvcmtzLgotPC91bD4KLTxwPgotU1dJRyBleHRlbnNpb25zIGFyZSBvbmx5IGFibGUgdG8gdGFyZ2V0IGEgc2luZ2xlIHNjcmlwdGluZyBsYW5ndWFnZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIG1ha2UgeW91ciBtb2R1bGUgcGFydCBvZiB0aGUgZnVsbCB2ZXJzaW9uIG9mIFNXSUcsIHlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoZSBmaWxlIGA8dHQ+c3dpZ21haW4uY3h4PC90dD4nIGluIHRoZSA8dHQ+U1dJRzEuMS9Nb2R1bGVzPC90dD4gZGlyZWN0b3J5LiAgICBUbyBkbyB0aGlzLCBmb2xsb3cgdGhlc2Ugc3RlcHMgOjxwPgotPHA+Ci08dWw+Ci08bGk+QWRkIGEgPHR0PiNpbmNsdWRlICJsYW5nLmgiPC90dD4gdG8gdGhlPHR0PiBzd2lnbWFpbi5jeHg8L3R0PiBmaWxlLgotPGxpPkNyZWF0ZSBhIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHlvdXIgbW9kdWxlIGFuZCB3cml0ZSBjb2RlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB5b3VyIGxhbmd1YWdlIChqdXN0IGNvcHkgdGhlIHRlY2huaXF1ZSB1c2VkIGZvciB0aGUgb3RoZXIgbGFuZ3VhZ2VzKS4KLTxsaT5Nb2RpZnkgIDx0dD5Nb2R1bGVzL01ha2VmaWxlPC90dD4gdG8gaW5jbHVkZSB5b3VyIG1vZHVsZSBhcyBwYXJ0IG9mIGl0cyBjb21waWxhdGlvbiBwcm9jZXNzLgotPGxpPlJlYnVpbGQgU1dJRyBieSB0eXBpbmcgYG1ha2UnLgotPC91bD4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMj4gQysrIFByb2Nlc3Npbmc8L2gyPgotTGFuZ3VhZ2UgbW9kdWxlcyBoYXZlIHRoZSBvcHRpb24gdG8gcHJvdmlkZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIEMrKyBjbGFzc2VzLiAgIFVzdWFsbHkgdGhpcyBpcyB0byBwcm92aWRlIHNvbWUgc29ydCBvZiBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHN1Y2ggYXMgc2hhZG93IGNsYXNzZXMuICBUaGUgcHJvY2VzcyBvZiBkZXZlbG9waW5nIHRoZXNlIGV4dGVuc2lvbnMgaXMgaGlnaGx5IHRlY2huaWNhbCBhbmQgdGhlIGJlc3QgYXBwcm9hY2ggbWF5IGJlIHRvIGNvcHkgcGllY2VzIGZyb20gb3RoZXIgU1dJRyBtb2R1bGVzIHRoYXQgcHJvdmlkZSBvYmplY3Qgb3JpZW50ZWQgc3VwcG9ydC48cD4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gSG93IEMrKyBwcm9jZXNzaW5nIHdvcmtzPC9oMz4KLVRoZSB3cmFwcGluZyBvZiBDKysgY2xhc3NlcyBmb2xsb3dzIGEgImZpbGUiIG1ldGFwaG9yLiAgIFdoZW4gYSBjbGFzcyBpcyBlbmNvdW50ZXJlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgcGVyZm9ybWVkIDo8cD4KLTxwPgotPHVsPgotPGxpPk9wZW4gYSBuZXcgY2xhc3MuCi08bGk+SW5oZXJpdCBmcm9tIGJhc2UgY2xhc3Nlcy4KLTxsaT5BZGQgbWVtYmVycyB0byB0aGUgY2xhc3MgKGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGV0Yy4uLikKLTxsaT5DbG9zZSB0aGUgY2xhc3MgYW5kIGVtaXQgb2JqZWN0LW9yaWVudGVkIGNvZGUuCi08L3VsPgotPHA+Ci1BcyBhIGNsYXNzIGlzIGNvbnN0cnVjdGVkLCBhIGxhbmd1YWdlIG1vZHVsZSBtYXkgbmVlZCB0byBrZWVwIHRyYWNrIG9mICBhIHZhcmlldHkgb2YgZGF0YSBzdWNoIGFzIHdoZXRoZXIgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzIGhhdmUgYmVlbiBnaXZlbiwgYXJlIHRoZXJlIGFueSBkYXRhIG1lbWJlcnMsIGhhdmUgZGF0YXR5cGVzIGJlZW4gcmVuYW1lZCwgYW5kIHNvIG9uLiAgIEl0IGlzIG5vdCBhbHdheXMgYSBjbGVhci1jdXQgcHJvY2Vzcy48cD4KLTxhIG5hbWU9Im40NCI+PC9hPjxoMz4gTGFuZ3VhZ2UgZXh0ZW5zaW9uczwvaDM+Ci1Qcm92aWRpbmcgYWRkaXRpb25hbCBzdXBwb3J0IGZvciBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgZm9sbG93aW5nIExhbmd1YWdlIGV4dGVuc2lvbnMuICBUaGVzZSBhcmUgYWRkaXRpb25hbCBtZXRob2RzIHRoYXQgY2FuIGJlIGRlZmluZWQgZm9yIHRoZSBMYW5ndWFnZSBjbGFzcy48cD4KLTxwPgotPGg2PiB2b2lkIGNwcF9vcGVuX2NsYXNzKGNoYXIgKm5hbWUsIGNoYXIgKnJlbmFtZSwgY2hhciAqY3R5cGUsIGludCBzdHJpcCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+T3BlbnMgYSBuZXcgY2xhc3MuICA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcywgPHR0PnJlbmFtZTwvdHQ+IGlzIHRoZSByZW5hbWVkIHZlcnNpb24gb2YgdGhlIGNsYXNzIChvciBOVUxMIGlmIG5vdCByZW5hbWVkKSwgPHR0PmN0eXBlPC90dD4gaXMgdGhlIGNsYXNzIHR5cGUgKDx0dD5zdHJ1Y3Q8L3R0PiwgPHR0PmNsYXNzPC90dD4sIDx0dD51bmlvbjwvdHQ+KSwgYW5kIDx0dD5zdHJpcDwvdHQ+IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0cyBzYWZlIHRvIGRyb3AgdGhlIGxlYWRpbmcgdHlwZSBzcGVjaWZpZXIgKHRoaXMgaXMgb2Z0ZW4gdW5zYWZlIGZvciBBTlNJIEMpLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgY3BwX2luaGVyaXQoY2hhciAqKmJhc2VjbGFzcywgaW50IG1vZGUgPSBJTkhFUklUX0FMTCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+SW5oZXJpdHMgZnJvbSBiYXNlIGNsYXNzZXMuICA8dHQ+YmFzZWNsYXNzPC90dD4gaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgY2xhc3MgbmFtZXMgY29ycmVzcG9uZGluZyB0byBhbGwgb2YgdGhlIGJhc2UgY2xhc3NlcyBvZiBhbiBvYmplY3QuICAgPHR0Pm1vZGU8L3R0PiBpcyBhbiBpbmhlcml0YW5jZSBtb2RlIHRoYXQgaXMgdGhlIG9yJ2QgdmFsdWUgb2YgPHR0PklOSEVSSVRfRlVOQzwvdHQ+ICwgPHR0PklOSEVSSVRfVkFSPC90dD4sIDx0dD5JTkhFUklUX0NPTlNUPC90dD4sICBvciA8dHQ+SU5IRVJJVF9BTEw8L3R0Pi4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF9tZW1iZXJfZnVuYyhjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsICAgICAgICAgICAgICAgICAgICAgIFBhcm1MaXN0ICpsKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGEgbWVtYmVyIGZ1bmN0aW9uLiAgPHR0Pm5hbWU8L3R0PiBpcyB0aGUgcmVhbCBuYW1lIG9mIHRoZSBtZW1iZXIsIDx0dD5pbmFtZTwvdHQ+IGlzIHRoZSByZW5hbWVkIHZlcnNpb24gKE5VTEwgaWYgbm90IHJlbmFtZWQpLCA8dHQ+dDwvdHQ+IGlzIHRoZSByZXR1cm4gZGF0YXR5cGUsIGFuZCA8dHQ+bDwvdHQ+IGlzIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdC4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF9zdGF0aWNfZnVuYyhjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsICAgICAgICAgICAgICAgICAgICAgIFBhcm1MaXN0ICpsKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGUgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uLiAgVGhlIGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciA8dHQ+Y3BwX21lbWJlcl9mdW5jKCk8L3R0Pi4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF92YXJpYWJsZShjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBtZW1iZXIgdmFyaWFibGUuICA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSByZWFsIG5hbWUgb2YgdGhlIG1lbWJlciwgPHR0PmluYW1lPC90dD4gaXMgdGhlIHJlbmFtZWQgdmVyc2lvbiAoTlVMTCBpcyBub3QgcmVuYW1lZCkuICA8dHQ+dDwvdHQ+IGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjcHBfc3RhdGljX3ZhcihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlLiAgVGhlIGNhbGxpbmcgY29udmVudGlvbiBpcyB0aGUgc2FtZSBhcyBmb3IgPHR0PmNwcF92YXJpYWJsZSgpPC90dD4uCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjcHBfZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGEgY29uc3RhbnQgaW5zaWRlIGEgQysrIGNsYXNzLiBOb3JtYWxseSB0aGlzIGlzIGFuIGVudW0gb3IgbWVtYmVyIGRlY2xhcmVkIGFzIGNvbnN0LiAgPHR0Pm5hbWU8L3R0PiBpcyB0aGUgcmVhbCBuYW1lLCA8dHQ+aW5hbWU8L3R0PiBpcyB0aGUgcmVuYW1lZCB2ZXJzaW9uIChOVUxMIGlmIG5vdCByZW5hbWVkKSwgPHR0PnR5cGU8L3R0PiBpcyB0aGUgdHlwZSBvZiB0aGUgY29uc3RhbnQsIGFuZCA8dHQ+dmFsdWU8L3R0PiBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZS4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF9jb25zdHJ1Y3RvcihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgUGFybUxpc3QgKmwpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBjb25zdHJ1Y3Rvci4gPHR0Pm5hbWU8L3R0PiBpcyB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IsIDx0dD5pbmFtZTwvdHQ+IGlzIHRoZSByZW5hbWVkIHZlcnNpb24sIGFuZCA8dHQ+bDwvdHQ+IGlzIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdC4gIE5vcm1hbGx5LCA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNsYXNzLiAgSWYgbm90LCB0aGlzIG1heSBhY3R1YWxseSBiZSBhIG1lbWJlciBmdW5jdGlvbiB3aXRoIG5vIGRlY2xhcmVkIHJldHVybiB0eXBlIChhc3N1bWVkIHRvIGJlIGFuIGludCBpbiBDKyspLiAgIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgY3BwX2Rlc3RydWN0b3IoY2hhciAqbmFtZSwgY2hhciAqbmV3bmFtZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Q3JlYXRlcyBhIGRlc3RydWN0b3IuICA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSByZWFsIG5hbWUgb2YgdGhlIGRlc3RydWN0b3IgKHVzdWFsbHkgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MpLCBhbmQgPHR0Pm5ld25hbWU8L3R0PiBpcyB0aGUgcmVuYW1lZCB2ZXJzaW9uIChOVUxMIGlmIG5vdCByZW5hbWVkKS4gIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgY3BwX2Nsb3NlX2NsYXNzKCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Q2xvc2VzIHRoZSBjdXJyZW50IGNsYXNzLiAgIExhbmd1YWdlIG1vZHVsZXMgc2hvdWxkIGZpbmlzaCBvZmYgY29kZSBnZW5lcmF0aW9uIGZvciBhIGNsYXNzIG9uY2UgdGhpcyBoYXMgYmVlbiBjYWxsZWQuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjcHBfY2xlYW51cCgpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNhbGxlZCBhZnRlciBhbGwgQysrIGNsYXNzZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4gIE9ubHkgdXNlZCB0byBwcm92aWRlIHNvbWUga2luZCBvZiBnbG9iYWwgY2xlYW51cCBmb3IgYWxsIGNsYXNzZXMuCi08L2RsPgotPGEgbmFtZT0ibjQ1Ij48L2E+PGgzPiBIaW50czwvaDM+Ci1TcGVjaWFsIEMrKyBjb2RlIGdlbmVyYXRpb24gaXMgbm90IGZvciB0aGUgd2VhayBvZiBoZWFydC4gIE1vc3Qgb2YgU1dJRydzIGJ1aWx0IGluIG1vZHVsZXMgaGF2ZSBiZWVuIGRldmVsb3BlZCBmb3Igd2VsbCBvdmVyIGEgeWVhciBhbmQgb2JqZWN0IG9yaWVudGVkIHN1cHBvcnQgaGFzIGJlZW4gaW4gY29udGludWFsIGRldmVsb3BtZW50LiAgSWYgd3JpdGluZyBhIG5ldyBsYW5ndWFnZSBtb2R1bGUsIGxvb2tpbmcgYXQgdGhlIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24sIFRjbCwgb3IgUGVybDUgd291bGQgYmUgYSBnb29kIHN0YXJ0LjxwPgotPGEgbmFtZT0ibjEyIj48L2E+PGgyPiBEb2N1bWVudGF0aW9uIFByb2Nlc3Npbmc8L2gyPgotVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIG9wZXJhdGVzIChmb3IgdGhlIG1vc3QgcGFydCksIGluZGVwZW5kZW50bHkgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBsYW5ndWFnZSBtb2R1bGVzIGFyZSBzdGlsbCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhICJ1c2FnZSIgc3RyaW5nIGRlc2NyaWJpbmcgaG93IGVhY2ggZnVuY3Rpb24sIHZhcmlhYmxlLCBvciBjb25zdGFudCBpcyB0byBiZSB1c2VkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuPHA+Ci08YSBuYW1lPSJuNDYiPjwvYT48aDM+IERvY3VtZW50YXRpb24gZW50cmllczwvaDM+Ci1FYWNoIEMvQysrIGRlY2xhcmF0aW9uIGluIGFuIGludGVyZmFjZSBmaWxlIGdldHMgYXNzaWduZWQgdG8gYSAiRG9jdW1lbnRhdGlvbiBFbnRyeSIgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlIDx0dD5Eb2NFbnRyeTwvdHQ+IG9iamVjdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgRG9jRW50cnkgewotcHVibGljOgotICBTdHJpbmcgICAgICB1c2FnZTsgICAgICAgICAgICAvLyBTaG9ydCBkZXNjcmlwdGlvbiAKLSAgU3RyaW5nICAgICAgY2luZm87ICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgQyBpbnRlcmZhY2UgKG9wdGlvbmFsKS4KLSAgU3RyaW5nICAgICAgdGV4dDsgICAgICAgICAgICAgLy8gU3VwcG9ydGluZyB0ZXh0IChvcHRpb25hbCkKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+dXNhZ2U8L3R0PiBzdHJpbmcgaXMgdXNlZCB0byBob2xkIHRoZSBjYWxsaW5nIHNlcXVlbmNlIGZvciB0aGUgZnVuY3Rpb24uICBUaGUgPHR0PmNpbmZvPC90dD4gZmllbGQgaXMgdXNlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgQyBjb2RlLiAgPHR0PnRleHQ8L3R0PiBpcyBmaWxsZWQgaW4gd2l0aCBjb21tZW50IHRleHQuPHA+Ci08cD4KLVRoZSBnbG9iYWwgdmFyaWFibGUgPHR0PmRvY19lbnRyeTwvdHQ+IGFsd2F5cyBjb250YWlucyB0aGUgZG9jdW1lbnRhdGlvbiBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24gYmVpbmcgcHJvY2Vzc2VkLiAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gY2hvb3NlIHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBieSByZWZlcnJpbmcgdG8gYW5kIG1vZGlmeWluZyBpdHMgZmllbGRzLjxwPgotPGEgbmFtZT0ibjQ3Ij48L2E+PGgzPiBDcmVhdGluZyBhIHVzYWdlIHN0cmluZzwvaDM+Ci1UbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHVzYWdlIHN0cmluZywgbGFuZ3VhZ2UgbW9kdWxlcyBuZWVkIHRvIG1vZGlmeSB0aGUgYHVzYWdlJyBmaWVsZCBvZiA8dHQ+ZG9jX2VudHJ5PC90dD4uICAgVGhpcyBjYW4gYmUgZG9uZSBieSBjcmVhdGluZyBhIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjaGFyICpUQ0w6OnVzYWdlX3N0cmluZyhjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsIFBhcm1MaXN0ICpsKSwKLS8vCi0vLyBHZW5lcmF0ZXMgYSBnZW5lcmljIHVzYWdlIHN0cmluZyBmb3IgYSBUY2wgZnVuY3Rpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2hhciAqIFRDTDo6dXNhZ2Vfc3RyaW5nKGNoYXIgKmluYW1lLCBEYXRhVHlwZSAqLCBQYXJtTGlzdCAqbCkgewotCi0gIHN0YXRpYyBTdHJpbmcgdGVtcDsKLSAgUGFybSAgKnA7Ci0gIGludCAgIGksIG51bW9wdCxwY291bnQ7Ci0KLSAgdGVtcCA9ICIiOwotICB0ZW1wICZsdDsmbHQ7IGluYW1lICZsdDsmbHQ7ICIgIjsKLQotICAvKiBOb3cgZ28gdGhyb3VnaCBhbmQgcHJpbnQgcGFyYW1ldGVycyAqLwotICBpID0gMDsKLSAgcGNvdW50ID0gbC0mZ3Q7bnBhcm1zOwotICBudW1vcHQgPSBsLSZndDtudW1vcHQoKTsKLSAgcCA9IGwtJmd0O2dldF9maXJzdCgpOwotICB3aGlsZSAocCAhPSAwKSB7Ci0gICAgaWYgKCFwLSZndDtpZ25vcmUpIHsKLSAgICAgIGlmIChpICZndDs9IChwY291bnQtbnVtb3B0KSkKLSAgICAgICAgdGVtcCAmbHQ7Jmx0OyAiPyI7Ci0KLSAgICAgIC8qIElmIHBhcmFtZXRlciBoYXMgYmVlbiBuYW1lZCwgdXNlIHRoYXQuICAgT3RoZXJ3aXNlLCBqdXN0IHByaW50IGEgdHlwZSAgKi8KLQotICAgICAgaWYgKChwLSZndDt0LSZndDt0eXBlICE9IFRfVk9JRCkgfHwgKHAtJmd0O3QtJmd0O2lzX3BvaW50ZXIpKSB7Ci0gICAgICAgIGlmIChzdHJsZW4ocC0mZ3Q7bmFtZSkgJmd0OyAwKSB7Ci0gICAgICAgICAgdGVtcCAmbHQ7Jmx0OyBwLSZndDtuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHRlbXAgJmx0OyZsdDsgInsgIiAmbHQ7Jmx0OyBwLSZndDt0LSZndDtwcmludF90eXBlKCkgJmx0OyZsdDsgIiB9IjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGkgJmd0Oz0gKHBjb3VudC1udW1vcHQpKQotICAgICAgICB0ZW1wICZsdDsmbHQ7ICI/IjsKLSAgICAgIHRlbXAgJmx0OyZsdDsgIiAiOwotICAgICAgaSsrOwotICAgIH0KLSAgICBwID0gbC0mZ3Q7Z2V0X25leHQoKTsKLSAgfQotICByZXR1cm4gdGVtcDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93LCB3aXRoaW4gdGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZnVuY3Rpb24sIGluY2x1ZGUgY29kZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGwgaW4gdGhlIGRvY3VtZW50YXRpb24gZW50cnkKLWRvY19lbnRyeS0mZ3Q7dXNhZ2UgJmx0OyZsdDsgdXNhZ2Vfc3RyaW5nKGluYW1lLHQsbCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHByb2R1Y2UgZnVsbCBkb2N1bWVudGF0aW9uLCBlYWNoIGxhbmd1YWdlIG1vZHVsZSBuZWVkcyB0byBmaWxsIGluIHRoZSBkb2N1bWVudGF0aW9uIHVzYWdlIHN0cmluZyBmb3IgYWxsIGRlY2xhcmF0aW9ucy4gICAgTG9va2luZyBhdCBleGlzdGluZyBTV0lHIG1vZHVsZXMgY2FuIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQuPHA+Ci08YSBuYW1lPSJuNDgiPjwvYT48aDM+IFdyaXRpbmcgYSBuZXcgZG9jdW1lbnRhdGlvbiBtb2R1bGU8L2gzPgotV3JpdGluZyBhIG5ldyBkb2N1bWVudGF0aW9uIG1vZHVsZSBpcyByb3VnaGx5IHRoZSBzYW1lIGlkZWEgYXMgd3JpdGluZyBhIG5ldyBMYW5ndWFnZSBjbGFzcy4gIFRvIGRvIGl0LCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgYSAiRG9jdW1lbnRhdGlvbiBPYmplY3QiIGJ5IGluaGVyaXRpbmcgZnJvbSB0aGUgZm9sbG93aW5nIGJhc2UgY2xhc3MgYW5kIGRlZmluaW5nIGFsbCBvZiB0aGUgdmlydHVhbCBtZXRob2RzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBEb2N1bWVudGF0aW9uIHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCB0aXRsZShEb2NFbnRyeSAqZGUpID0gMDsKLSAgdmlydHVhbCB2b2lkIG5ld3NlY3Rpb24oRG9jRW50cnkgKmRlLCBpbnQgc2VjdG51bSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgZW5kc2VjdGlvbigpID0gMDsKLSAgdmlydHVhbCB2b2lkIHByaW50X2RlY2woRG9jRW50cnkgKmRlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBwcmludF90ZXh0KERvY0VudHJ5ICpkZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgc2VwYXJhdG9yKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgaW5pdChjaGFyICpmaWxlbmFtZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgY2xvc2Uodm9pZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgc3R5bGUoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpID0gMDsKLX07Ci0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGg2PiB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTs8L2g2PgotPGRsPgotPGR0PjxkZD5QYXJzZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAgQW55IHNwZWNpYWwgb3B0aW9ucyB5b3Ugd2FudCB0byBwcm92aWRlIHNob3VsZCBiZSBwbGFjZWQgaGVyZS4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiAgdm9pZCB0aXRsZShEb2NFbnRyeSAqZGU7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UHJvZHVjZXMgZG9jdW1lbnRhdGlvbiBvdXRwdXQgZm9yIGEgdGl0bGUuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBuZXdzZWN0aW9uKERvY0VudHJ5ICpkZSwgaW50IHNlY3RudW07PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Q2FsbGVkIHdoZW5ldmVyIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaXMgaGllcmFyY2hpY2FsIGluIG5hdHVyZSBzbyBlYWNoIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBnb2VzIGRvd24gb25lIGxldmVsIGluIHRoZSBoaWVyYXJjaHkuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBlbmRzZWN0aW9uKCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+RW5kcyB0aGUgY3VycmVudCBzZWN0aW9uLiAgTW92ZXMgdXAgb25lIGxldmVsIGluIHRoZSBkb2N1bWVudGF0aW9uIGhpZXJhcmNoeS4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIHByaW50X2RlY2woRG9jRW50cnkgKmRlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGRvY3VtZW50YXRpb24gZm9yIGEgQyBkZWNsYXJhdGlvbiAoZnVuY3Rpb24sIHZhcmlhYmxlLCBvciBjb25zdGFudCkuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBwcmludF90ZXh0KERvY0VudHJ5ICpkZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UHJpbnRzIGRvY3VtZW50YXRpb24gdGhhdCBoYXMgYmVlbiBnaXZlbiB3aXRoIHRoZSA8dHQ+JXRleHQgJXsgJX08L3R0PiBkaXJlY3RpdmUuIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgc2VwYXJhdG9yKCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UHJpbnRzIGFuIG9wdGlvbmFsIHNlcGFyYXRvciBiZXR3ZWVuIHNlY3Rpb25zLiAgCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBpbml0KGNoYXIgKmZpbGVuYW1lKTs8L2g2PgotPGRsPgotPGR0PjxkZD5Jbml0aWFsaXplcyB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBjb21tYW5kIGxpbmUgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkLiA8dHQ+ZmlsZW5hbWU8L3R0PiBpcyB0aGUgZmlsZSB3aGVyZSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBwbGFjZWQuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjbG9zZSh2b2lkKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DbG9zZXMgdGhlIGRvY3VtZW50YXRpb24gZmlsZS4gIEFsbCByZW1haW5pbmcgb3V0cHV0IHNob3VsZCBiZSBjb21wbGV0ZSBhbmQgZmlsZXMgY2xvc2VkIHVwb24gZXhpdC4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIHN0eWxlKGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DYWxsZWQgdG8gc2V0IHN0eWxlIHBhcmFtZXRlcnMuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgPHR0PiVzdHlsZTwvdHQ+IGFuZCA8dHQ+JWxvY2Fsc3R5bGU8L3R0PiBkaXJlY3RpdmVzLiAgSXQgaXMgYWxzbyBjYWxsZWQgd2hlbmV2ZXIgc3R5bGUgcGFyYW1ldGVycyBhcmUgZ2l2ZW4gYWZ0ZXIgYSBzZWN0aW9uIGRpcmVjdGl2ZS4KLTwvZGw+Ci08YSBuYW1lPSJuNDkiPjwvYT48aDM+IFVzaW5nIGEgbmV3IGRvY3VtZW50YXRpb24gbW9kdWxlPC9oMz4KLVVzaW5nIGEgbmV3IGRvY3VtZW50YXRpb24gbW9kdWxlIHJlcXVpcmVzIGEgY2hhbmdlIHRvIFNXSUcncyBtYWluIHByb2dyYW0uIElmIHlvdSBhcmUgd3JpdGluZyB5b3VyIG93biBtYWluKCkgcHJvZ3JhbSwgeW91IGNhbiB1c2UgYSBuZXcgZG9jdW1lbnRhdGlvbiBtb2R1bGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2luY2x1ZGUgJmx0O3N3aWcuaCZndDsKLSNpbmNsdWRlICJzd2lndGNsLmgiICAgICAgICAgICAgICAgICAgICAgICAvLyBMYW5ndWFnZSBzcGVjaWZpYyBoZWFkZXIKLSNpbmNsdWRlICJteWRvYy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgRG9jdW1lbnRhdGlvbiBtb2R1bGUKLQotZXh0ZXJuIGludCBTV0lHX21haW4oaW50LCBjaGFyICoqLCBMYW5ndWFnZSAqLCBEb2N1bWVudGF0aW9uICopOwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0JCi0JVENMICpsID0gbmV3IFRDTDsgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IExhbmd1YWdlIG9iamVjdAotCU15RG9jICpkID0gbmV3IE15RG9jOyAgICAgICAgICAgICAgIC8vIE5ldyBkb2N1bWVudGF0aW9uIG9iamVjdAotCWluaXRfYXJncyhhcmdjLCBhcmd2KTsgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgYXJncwotCXJldHVybiBTV0lHX21haW4oYXJnYywgYXJndiwgbCwgZCk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTAiPjwvYT48aDM+IFdoZXJlIHRvIGdvIGZvciBtb3JlIGluZm9ybWF0aW9uPC9oMz4KLVRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgZG9jdW1lbnRhdGlvbiBtb2R1bGVzLCBsb29rIGF0IHNvbWUgb2YgdGhlIGV4aXN0aW5nIFNXSUcgbW9kdWxlcyBjb250YWluZWQgaW4gdGhlIDx0dD5TV0lHMS4xL1NXSUc8L3R0PiBkaXJlY3RvcnkuICBUaGUgQVNDSUkgYW5kIEhUTUwgbW9kdWxlcyBhcmUgZ29vZCBzdGFydGluZyBwb2ludHMgZm9yIGZpbmRpbmcgbW9yZSBpbmZvcm1hdGlvbi4gPHA+Ci08YSBuYW1lPSJuMTMiPjwvYT48aDI+IFRoZSBGdXR1cmUgb2YgU1dJRzwvaDI+Ci1TV0lHJ3MgQysrIEFQSSBpcyB0aGUgbW9zdCByYXBpZGx5IGV2b2x2aW5nIHBvcnRpb24gb2YgU1dJRy4gIFdoaWxlIGludGVyZmFjZS1maWxlIGNvbXBhdGliaWxpdHkgd2lsbCBiZSBtYWludGFpbmVkIGFzIG11Y2ggYXMgcG9zc2libGUgaW4gZnV0dXJlIHJlbGVhc2VzLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIFNXSUcgaXMgbGlrZWx5IHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGluIHRoZSBmdXR1cmUuICAgVGhpcyB3aWxsIHBvc3NpYmx5IGhhdmUgbWFueSByYW1pZmljYXRpb25zIG9uIHRoZSBjb25zdHJ1Y3Rpb24gb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gICBIZXJlIGFyZSBhIGZldyBzaWduaWZpY2FudCBjaGFuZ2VzIHRoYXQgYXJlIGNvbWluZyA6PHA+Ci08cD4KLQotPGRsPgotPGR0PjEuCSBBIGNvbXBsZXRlIHJlb3JnYW5pemF0aW9uIG9mIHRoZSBTV0lHIHR5cGUgc3lzdGVtLiAgIERhdGF0eXBlcyB3aWxsIGJlIHJlcHJlc2VudGVkIGluIGEgbW9yZSBmbGV4aWJsZSBtYW5uZXIgdGhhdCBwcm92aWRlIGZ1bGwgc3VwcG9ydCBmb3IgYXJyYXlzLCBmdW5jdGlvbiBwb2ludGVycywgY2xhc3Nlcywgc3RydWN0dXJlcywgYW5kIHR5cGVzIHBvc3NpYmx5IGNvbWluZyBmcm9tIG90aGVyIGxhbmd1YWdlcyAoc3VjaCBhcyBGb3J0cmFuKS4gICAKLTxkdD4yLgkgT2JqZWN0aWZpY2F0aW9uIG9mIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGNsYXNzZXMsIGV0Yy4uLiBDdXJyZW50bHkgbWFueSBvZiBTV0lHJ3MgZnVuY3Rpb25zIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzIHN1Y2ggYXMgZnVuY3Rpb25zIGJlaW5nIGRlc2NyaWJlZCBieSBuYW1lLCByZXR1cm4gZGF0YXR5cGUsIGFuZCBwYXJhbWV0ZXJzLiAgVGhlc2UgYXR0cmlidXRlcyB3aWxsIGJlIGNvbnNvbGlkYXRlZCBpbnRvIGEgc2luZ2xlICJGdW5jdGlvbiIgb2JqZWN0LCAiVmFyaWFibGUiIG9iamVjdCwgIkNvbnN0YW50IiBvYmplY3QsIGFuZCBzbyBmb3J0aC4gIAotPGR0PjMuCSBBIGNvbXBsZXRlIHJld3JpdGUgb2YgdGhlIFNXSUcgcGFyc2VyLiAgICBUaGlzIHdpbGwgYmUgY2xvc2VseSB0aWVkIHRvIHRoZSBjaGFuZ2UgaW4gZGF0YXR5cGUgcmVwcmVzZW50YXRpb24gYW1vbmcgb3RoZXIgdGhpbmdzLgotPGR0PjQuCSBJbmNyZWFzZWQgcmVsaWFuY2Ugb24gdHlwZW1hcHMuICAgTWFueSBvZiBTV0lHJ3Mgb2xkZXIgbW9kdWxlcyBkbyBub3QgcmVseSBvbiB0eXBlbWFwcywgYnV0IHRoaXMgaXMgbGlrZWx5IHRvIGNoYW5nZS4gIFR5cGVtYXBzIHByb3ZpZGUgYSBtb3JlIGNvbmNpc2UgaW1wbGVtZW50YXRpb24gYW5kIGFyZSBlYXNpZXIgdG8gbWFpbnRhaW4uICBNb2R1bGVzIHdyaXR0ZW4gZm9yIDEuMSB0aGF0IGFkb3B0IHR5cGVtYXBzIG5vdyB3aWxsIGJlIG11Y2ggZWFzaWVyIHRvIGludGVncmF0ZSBpbnRvIGZ1dHVyZSByZWxlYXNlcy4KLTxkdD41LgkgQSBwb3NzaWJsZSByZW9yZ2FuaXphdGlvbiBvZiBvYmplY3Qtb3JpZW50ZWQgY29kZSBnZW5lcmF0aW9uLiAgIFRoZSBsYXllcmVkIGFwcHJvYWNoIHdpbGwgcHJvYmFibHkgcmVtYWluIGluIHBsYWNlIGhvd2V2ZXIuCi08ZHQ+Ni4JIEJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZS1maWxlcyAoZXhwb3J0aW5nLCBpbXBvcnRpbmcsIGV0Yy4uLikKLQotPC9kbD4KLTxwPgotSW4gcGxhbm5pbmcgZm9yIHRoZSBmdXR1cmUsICBtdWNoIG9mIGEgbGFuZ3VhZ2UncyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBkZXNjcmliZWQgaW4gdGVybXMgb2YgdHlwZW1hcHMuICBTdGlja2luZyB0byB0aGlzIGFwcHJvYWNoIHdpbGwgbWFrZSBpdCBzaWduaWZpY2FudGx5IGVhc2llciB0byBtb3ZlIHRvIG5ldyByZWxlYXNlcy4gICAgSSBhbnRpY2lwYXRlIHRoYXQgdGhlcmUgd2lsbCBiZSBmZXcgZHJhc3RpYyBjaGFuZ2VzIHRvIHRoZSBMYW5ndWFnZSBtb2R1bGUgcHJlc2VudGVkIGluIHRoaXMgc2VjdGlvbiAob3RoZXIgdGhhbiBjaGFuZ2VzIHRvIG1hbnkgb2YgdGhlIGNhbGxpbmcgbWVjaGFuaXNtcykuPHA+Ci0KLTxwPjxocj4KLQotPGFkZHJlc3M+U1dJRyAxLjEgLSBMYXN0IE1vZGlmaWVkIDogTW9uIEF1ZyAgNCAxMDo0NzoxNyAxOTk3PC9hZGRyZXNzPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbmRleC5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzY2MmVhLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvSW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+IFNXSUcgMS4xIFVzZXJzIE1hbnVhbCAtIFRvcGljIEluZGV4IDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLQotPGgxPiBBbHBoYWJldGljYWwgVG9waWMgSW5kZXggPC9oMT4KLTxoMj4gLSBBIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJQeXRob24uaHRtbCNuNTMiPkEgY29tcGxldGUgYXBwbGljYXRpb248L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI243Ij5BIGZldyBkeW5hbWljIGxvYWRpbmcgZ290Y2hhczwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNDkiPkEgZmV3IGhlbHBlciBmdW5jdGlvbnM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xMCI+QSBnZW5lcmFsIGludGVyZmFjZSBidWlsZGluZyBzdHJhdGVneTwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQ2Ij5BIG1hdGhlbWF0aWNhbCBmdW5jdGlvbiAgcGxvdHRlcjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240MCI+QSBRdWljayBJbnRlcm1pc3Npb248L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjkiPkEgc2ltcGxlIGV4YW1wbGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xNiI+QSBzaW1wbGUgZXhhbXBsZTwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNSI+QSBzaW1wbGUgUGVybCBleGFtcGxlPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNjciPkEgc2ltcGxlIHNoYWRvdyBjbGFzczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMxIj5BIHNpbXBsZSBTV0lHIGludGVyZmFjZSBmaWxlPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24zNyI+QSBzaW1wbGUgdHlwZW1hcCBleGFtcGxlPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuNSI+QSBTV0lHIGV4YW1wbGU8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNSI+QSB0b3VyIG9mIFNXSUcgZGF0YXR5cGVzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzAiPkEgVHlwZW1hcCBJbXBsZW1lbnRhdGlvbjwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjUiPkFib3V0IHRoZSBleGFtcGxlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNSI+QWJvdXQgdGhlIEV4YW1wbGVzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI24zIj5BYm91dCB0aGlzIG1hbnVhbDwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjM3Ij5BY2Nlc3NpbmcgYXJyYXkgZGF0YTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQzIj5BY2Nlc3NpbmcgYXJyYXkgc3RydWN0dXJlIG1lbWJlcnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242MiI+QWNjZXNzaW5nIGFycmF5IHN0cnVjdHVyZSBtZW1iZXJzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjgiPkFjY2Vzc2luZyBhcnJheXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNiI+QWNjZXNzaW5nIGFycmF5cyBhbmQgb3RoZXIgc3RyYW5nZSBvYmplY3RzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzYiPkFjY2Vzc2luZyBtZW1iZXIgZGF0YTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjciPkFkZGluZyBBZGRpdGlvbmFsIFRleHQ8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDAiPkFkZGluZyBtZW1iZXIgZnVuY3Rpb25zIHRvIEMgc3RydWN0dXJlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjY2Ij5BZGRpbmcgbmF0aXZlIFB5dGhvbiBmdW5jdGlvbnMgdG8gYSBTV0lHIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTUiPkFkZGluZyBuZXcgbWV0aG9kczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243MSI+QWRkaW5nIG5ldyBtZXRob2RzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMTciPkFkZGl0aW9uYWwgU1dJRyBvcHRpb25zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuOSI+QW4gRXhhbXBsZTwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjUwIj5BbiBPcGVuR0wgcGFja2FnZTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI241Ij5BcHBseWluZyBjb25zdHJhaW50cyB0byBpbnB1dCB2YWx1ZXM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjI3Ij5BcHBseWluZyBjb25zdHJhaW50cyB0byBuZXcgZGF0YXR5cGVzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjkiPkFwcGx5aW5nIGV4Y2VwdGlvbiBoYW5kbGVycyB0byBzcGVjaWZpYyBkYXRhdHlwZXMuPC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zOCI+QXJyYXkgbWVtYmVyczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zMCI+QXJyYXlzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjEwIj5BU0NJSSBEb2N1bWVudGF0aW9uPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMzEiPkF1dG9tYXRlZCBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xMCI+QXV0b21hdGljIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbjwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gQiAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iUGVybDUuaHRtbCNuNCI+QmFzaWMgUGVybCBpbnRlcmZhY2U8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24zIj5CYXNpYyBUY2wgSW50ZXJmYWNlPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242Ij5CaW5hcnkgdHJlZXMgaW4gVGNsPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlByZWZhY2UuaHRtbCNuNiI+QnVnIHJlcG9ydHM8L2E+IChQcmVmYWNlKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240MiI+QnVpbGRpbmcgYSBDIGRhdGEgc3RydWN0dXJlIGluIFRjbDwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yMCI+QnVpbGRpbmcgYSBkeW5hbWljIG1vZHVsZSB3aXRoIE1ha2VNYWtlcjwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTEiPkJ1aWxkaW5nIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQjwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjE1Ij5CdWlsZGluZyBhIFBlcmw1IG1vZHVsZTwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xNiI+QnVpbGRpbmcgYSBQeXRob24gbW9kdWxlPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQ1Ij5CdWlsZGluZyBhIHNpbXBsZSAyRCBpbWFnaW5nIGNsYXNzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjkiPkJ1aWxkaW5nIGEgc2ltcGxlIE9wZW5HTCBtb2R1bGU8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMjEiPkJ1aWxkaW5nIGEgc3RhdGljIHZlcnNpb24gb2YgUGVybDwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjQ0Ij5CdWlsZGluZyBhbiBvYmplY3Qgb3JpZW50ZWQgQyBpbnRlcmZhY2U8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjciPkJ1aWxkaW5nIEMvQysrIGRhdGEgc3RydWN0dXJlcyB3aXRoIFRrPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI241MiI+QnVpbGRpbmcgbGFyZ2UgIG11bHRpLW1vZHVsZSBzeXN0ZW1zPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjE5Ij5CdWlsZGluZyBsaWJyYXJpZXMgYW5kIG1vZHVsZXM8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMTMiPkJ1aWxkaW5nIG5ldyBraW5kcyBvZiBUY2wgaW50ZXJmYWNlcyAoaW4gVGNsKTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yIj5CdWlsZGluZyBQZXJsIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIiPkJ1aWxkaW5nIFB5dGhvbiBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMyI+QnVpbGRpbmcgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjIiPkJ1aWxkaW5nIFRjbC9UayBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBDIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJTV0lHLmh0bWwjbjM5Ij5DIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240MCI+QyBmaWxlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjIxIj5DIEluZm9ybWF0aW9uPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjE0Ij5DIFByZXByb2Nlc3NvciBkaXJlY3RpdmVzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuNiI+QyBzeW50YXgsIGJ1dCBub3QgYSBDIGNvbXBpbGVyPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjMyIj5DKysgQ2xhc3NlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjgiPkMrKyBDbGFzc2VzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240NCI+QysrIGV4YW1wbGU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xMSI+QysrIFByb2Nlc3Npbmc8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjYiPkMrKyBzdXBwb3J0PC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjEzIj5DKysgU3VwcG9ydDwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI242OCI+Q2F0ZWdvcmllczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjM3Ij5DaGFuZ2luZyBtZW1iZXIgZGF0YTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjE5Ij5DaGFyYWN0ZXIgU3RyaW5nczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zNyI+Q2hhcmFjdGVyIHN0cmluZ3MgYW5kIHN0cnVjdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTciPkNoZWNraW5nIGluIGxpYnJhcnkgZmlsZXM8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTUiPkNoZWNraW5nIG91dCBsaWJyYXJ5IGZpbGVzPC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjMiPkNob29zaW5nIGEgZG9jdW1lbnRhdGlvbiBmb3JtYXQ8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjIiPkNsYXNzIG1ldGhvZHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zNSI+Q2xlYW51cDwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNzciPkNvZGUgYmxvY2tzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuOSI+Q29kZSBHZW5lcmF0aW9uIEZ1bmN0aW9uczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuOSI+Q29kZSBJbnNlcnRpb248L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242NiI+Q29tYmluaW5nIFRjbC9UayBFeHRlbnNpb25zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zMCI+Q29tbWFuZCBMaW5lIE9wdGlvbnMgYW5kIEJhc2ljIEluaXRpYWxpemF0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xNiI+Q29tbWVudCBGb3JtYXR0aW5nIHZhcmlhYmxlczwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xOCI+Q29tbWVudCBwbGFjZW1lbnQgYW5kIGZvcm1hdHRpbmc8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTMiPkNvbW1lbnRzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI243Ij5Db21tb24gdHlwZW1hcCBtZXRob2RzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMjIiPkNvbXBpbGF0aW9uIHByb2JsZW1zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjIyIj5Db21waWxhdGlvbiBwcm9ibGVtcyBhbmQgY29tcGlsaW5nIHdpdGggQysrPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMTkiPkNvbXBpbGF0aW9uIHByb2JsZW1zIGFuZCBjb21waWxpbmcgd2l0aCBDKys8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjAiPkNvbXBpbGluZzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE5Ij5Db21waWxpbmcgYSBkeW5hbWljIG1vZHVsZTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjE2Ij5Db21waWxpbmcgYSBkeW5hbWljIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xOSI+Q29tcGlsaW5nIGEgZHluYW1pYyBtb2R1bGUgKFVuaXgpPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yIj5Db21waWxpbmcgYSBTV0lHIGV4dGVuc2lvbjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zMiI+Q29tcGlsaW5nIG1vZHVsZXMgd2l0aCBzaGFkb3cgY2xhc3NlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuOCI+Q29uZGl0aW9uYWwgY29tcGlsYXRpb248L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xMiI+Q29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHdpdGggU1dJRzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMzkiPkNvbnN0YW50czwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjEiPkNvbnN0YW50czwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjI1Ij5Db25zdGFudHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuOSI+Q29uc3RhbnRzPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24yOSI+Q29uc3RhbnRzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjI3Ij5Db25zdGFudHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjI2Ij5Db25zdHJhaW50IG1ldGhvZHM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjAiPkNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243MiI+Q29uc3RydWN0b3JzIGFuZCBEZXN0cnVjdG9yczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDUiPkNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241NyI+Q29udmVydGluZyAgYSBUY2wgbGlzdCB0byBhIGNoYXIgKio8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU4Ij5Db252ZXJ0aW5nICBQeXRob24gbGlzdCB0byBhIGNoYXIgKio8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240MSI+Q29udmVydGluZyBhIFBlcmw1IGFycmF5IHRvIGEgY2hhciAqKjwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU5Ij5Db252ZXJ0aW5nIGEgUHl0aG9uIGZpbGUgb2JqZWN0IHRvIGEgRklMRSAqPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzQiPkNvcHlpbmcgYSB0eXBlbWFwPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjUiPkNyZWF0aW5nIGEgbmV3IHBhY2thZ2UgaW5pdGlhbGl6YXRpb24gbGlicmFyeTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24zMiI+Q3JlYXRpbmcgYSBuZXcgdHlwZW1hcDwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ3Ij5DcmVhdGluZyBhIHVzYWdlIHN0cmluZzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zNyI+Q3JlYXRpbmcgYSBXcmFwcGVyIEZ1bmN0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMTciPkNyZWF0aW5nIGFycmF5czwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjM2Ij5DcmVhdGluZyBDb21tYW5kczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuNyI+Q3JlYXRpbmcgTGlicmFyeSBGaWxlczwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzciPkNyZWF0aW5nIGxvY2FsIHZhcmlhYmxlczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuMSI+Q3JlYXRpbmcgbXVsdGktbW9kdWxlIHBhY2thZ2VzPC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24zMyI+Q3JlYXRpbmcgbmV3IG9iamVjdHM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zMSI+Q3JlYXRpbmcgcmVhZC1vbmx5IHZhcmlhYmxlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI240Ij5DcmVkaXRzPC9hPiAoUHJlZmFjZSk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMjIiPkNyb3NzIHBsYXRmb3JtIHdvZXM8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIEQgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNyI+RGVidWdnaW5nIGFuZCBvdGhlciBpbnRlcmVzdGluZyB1c2VzIGZvciAlZXhjZXB0PC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xNSI+RGVmYXVsdCBGb3JtYXR0aW5nPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjM0Ij5EZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50czwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI241Ij5EZWZpbmluZyBkaWZmZXJlbnQgZXhjZXB0aW9uIGhhbmRsZXJzPC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243MyI+RGVmaW5pbmcgc3ltYm9sczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzMiPkRlbGV0aW5nIGEgdHlwZW1hcDwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjM1Ij5EZWxldGluZyBvYmplY3RzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjQiPkRlcml2ZWQgdHlwZXMsIHN0cnVjdHMsIGFuZCBjbGFzc2VzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjgiPkRpc2FibGluZyBhbGwgZG9jdW1lbnRhdGlvbjwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ2Ij5Eb2N1bWVudGF0aW9uIGVudHJpZXM8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMTgiPkRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbjwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xMiI+RG9jdW1lbnRhdGlvbiBQcm9jZXNzaW5nPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjY4Ij5EeW5hbWljIGxvYWRpbmc8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuMiI+RHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gRSAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjMyIj5FbWl0dGluZyBoZWFkZXJzIGFuZCBzdXBwb3J0IGNvZGU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjUwIj5FbnVtcyBhbmQgY29uc3RhbnRzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuOSI+RXZlbnQgZHJpdmVuIEMgcHJvZ3JhbW1pbmc8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuOSI+RXhjZXB0aW9uIGhhbmRsaW5nPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTMiPkV4Y2VwdGlvbiBoYW5kbGluZzwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjEwIj5FeGNlcHRpb24gaGFuZGxpbmc8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI24zIj5FeGNlcHRpb24gaGFuZGxpbmcgd2l0aCBsb25nam1wKCk8L2E+ICg3IEV4Y2VwdGlvbiBIYW5kbGluZyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNDQiPkV4dGVuZGluZyBhbmQgZml4aW5nIHRoZSBnZCBtb2R1bGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMTQiPkV4dGVuZGluZyB0aGUgVGNsIE5ldHNjYXBlIFBsdWdpbjwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIEYgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI243Ij5GaWxlIG1hbmFnZW1lbnQ8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMzQiPkZpbmFsIEluaXRpYWxpemF0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xOCI+RmxvYXRpbmcgUG9pbnQ8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuNiI+Rm9ybWF0dGluZzwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQ4Ij5Gcm9tIEMgdG8gU1dJRyB0byBQeXRob248L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjIiPkZ1bmN0aW9uIFBhcmFtZXRlcnM8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjQiPkZ1bmN0aW9uIHVzYWdlIGFuZCBhcmd1bWVudCBuYW1lczwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjI3Ij5GdW5jdGlvbnM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIzIj5GdW5jdGlvbnM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yNSI+RnVuY3Rpb25zPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIEcgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNCI+R2V0dGluZyBkb3duIHRvIGJ1c2luZXNzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMzkiPkdldHRpbmcgZXZlbiBtb3JlIHNlcmlvdXMgYWJvdXQgYXJyYXkgYWNjZXNzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuOSI+R2V0dGluZyBzZXJpb3VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xOCI+R2V0dGluZyB0aGUgcmlnaHQgaGVhZGVyIGZpbGVzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMTUiPkdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODQiPkdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjE4Ij5HZXR0aW5nIHRoZSByaWdodCBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMjgiPkdsb2JhbCB2YXJpYWJsZXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMjYiPkdsb2JhbCB2YXJpYWJsZXM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjM2Ij5HcmFwaGljYWwgV2ViLVN0YXRpc3RpY3MgaW4gUGVybDU8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMwIj5HcmFwaHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gSCAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI240Ij5IYW5kbGluZyBDKysgZXhjZXB0aW9uczwvYT4gKDcgRXhjZXB0aW9uIEhhbmRsaW5nKTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMiI+SGFuZGxpbmcgZXhjZXB0aW9ucyBpbiBDIGNvZGU8L2E+ICg3IEV4Y2VwdGlvbiBIYW5kbGluZyk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xMiI+SGFuZGxpbmcgb3V0cHV0IHZhbHVlcyAodGhlIGVhc3kgd2F5KTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjgiPkhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjQiPkhhc2ggVGFibGVzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ1Ij5IaW50czwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240MyI+SG93IEMrKyBwcm9jZXNzaW5nIHdvcmtzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjIiPkhvdyBkb2VzIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRhbGsgdG8gQz88L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24yIj5Ib3cgaXQgd29ya3M8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yOCI+SG93IG1hbnkgdHlwZW1hcHMgYXJlIHRoZXJlPzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODgiPkhvdyB0byBhdm9pZCBjcmVhdGluZyB0aGUgaW50ZXJmYWNlIGZyb20gaGVsbDwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI24xMCI+SG93IHRvIGF2b2lkIHJlYWRpbmcgdGhlIG1hbnVhbDwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMTMiPkhvdyB0byBicmVhayBldmVyeXRoaW5nIHdpdGggYSB0eXBlbWFwPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjg3Ij5Ib3cgdG8gY29wZSB3aXRoIEMrKzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjIzIj5Ib3cgdG8gc3Vydml2ZSB0aGlzIG1hbnVhbDwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTEiPkhUTUwgRG9jdW1lbnRhdGlvbjwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBJIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjIwIj5JZ25vcmluZyBjb21tZW50czwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI242OSI+SW1wbGVtZW50YXRpb25zIGFuZCBQcm90b2NvbHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMSI+SW1wbGVtZW50aW5nIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGluIFB5dGhvbjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjExIj5JbXBsZW1lbnRpbmcgY29uc3RyYWludHMgd2l0aCB0eXBlbWFwczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjQzIj5JbXBsZW1lbnRpbmcgbWV0aG9kcyBpbiBDPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjciPkltcGxlbWVudGluZyBtZXRob2RzIGluIFBlcmw8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI240MCI+SW1wbGVtZW50aW5nIHNwZWNpYWwgUHl0aG9uIG1ldGhvZHMgaW4gQzwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuNCI+SW5jbHVkaW5nIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjU0Ij5Jbmhlcml0YW5jZTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI241MiI+SW5oZXJpdGFuY2U8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjYiPkluaGVyaXRhbmNlPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzciPkluaGVyaXRhbmNlIGFuZCBzaGFkb3cgY2xhc3NlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNzkiPkluaXRpYWxpemF0aW9uIGJsb2NrczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243OCI+SW5saW5lZCBjb2RlIGJsb2NrczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xMSI+SW5wdXQgZm9ybWF0PC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yMSI+SW5wdXQgTWV0aG9kczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMjMiPklucHV0L091dHB1dCBNZXRob2RzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI24zIj5JbnNpZGUgdGhlIFNXSUcgdHlwZS1jaGVja2VyPC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjEiPkluc3RhbmNlIG1ldGhvZHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTciPkludGVnZXJzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xIj5JbnRyb2R1Y3Rpb248L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMSI+SW50cm9kdWN0aW9uPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJQcmVmYWNlLmh0bWwjbjEiPkludHJvZHVjdGlvbjwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjEiPkludHJvZHVjdGlvbjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjMiPkludHJvZHVjdGlvbiB0byB0eXBlbWFwczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjM0Ij5JbnZva2luZyBtZW1iZXIgZnVuY3Rpb25zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjU1Ij5JdGVyYXRvcnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gTCAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ0Ij5MYW5ndWFnZSBleHRlbnNpb25zPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xMiI+TGFUZVggRG9jdW1lbnRhdGlvbjwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iTGlicmFyeS5odG1sI242Ij5MaWJyYXJ5IGV4YW1wbGU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24zIj5MaWZlIGFmdGVyIFNXSUc8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMiI+TGlmZSBiZWZvcmUgU1dJRzwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTYiPkxpbWl0YXRpb25zIGluIHRoZSBQYXJzZXIgKGFuZCB2YXJpb3VzIHRoaW5ncyB0byBrZWVwIGluIG1pbmQpPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjciPkxpbWl0YXRpb25zIHRvIHRoaXMgYXBwcm9hY2g8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yOSI+TGlua2luZyB0byBjb21wbGV4IHZhcmlhYmxlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjEzIj5MaW5raW5nIHdpdGggc2hhcmVkIGxpYnJhcmllczwvYT4gKDIgU2NyaXB0aW5nIExhbmd1YWdlcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIE0gLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlRjbC5odG1sI240MSI+TWFraW5nIGEgcXVpY2sgYSBkaXJ0eSBUY2wgbW9kdWxlPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zNSI+TWFraW5nIGEgcXVpY2sgYW5kIGRpcnR5IFB5dGhvbiBtb2R1bGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEyIj5tYWxsb2MuaTwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuNCI+TWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yOSI+TWFuYWdpbmcgc3BlY2lhbCBkYXRhLXR5cGVzIHdpdGggaGVscGVyIGZ1bmN0aW9uczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjM4Ij5NYW5pcHVsYXRpbmcgR2xvYmFsIFZhcmlhYmxlczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242MCI+TWFwcGluZyBDIHN0cnVjdHVyZXMgaW50byBUY2wgTGlzdHM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjYxIj5NYXBwaW5nIFB5dGhvbiB0dXBsZXMgaW50byBzbWFsbCBhcnJheXM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzMiPk1lbWJlciBkYXRhPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240OCI+TWVtYmVyIGRhdGE8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjMiPk1lbWJlciBkYXRhPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjQ2Ij5NZW1iZXIgZnVuY3Rpb25zPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNDkiPk1lcmdpbmcgbW9kdWxlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243OCI+TWV0aG9kcyB0aGF0IHJldHVybiBuZXcgb2JqZWN0czwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQ5Ij5Nb2R1bGUgYW5kIHBhY2thZ2UgbmFtZXM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242OCI+TW9kdWxlIG5hbWVzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIyIj5Nb2R1bGVzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMyI+TW9kdWxlcywgcGFja2FnZXMsIGFuZCBjbGFzc2VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEwIj5Nb3JlIGFib3V0IHRoZSBTV0lHIGxpYnJhcnk8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuOCI+TW9yZSBFeGFtcGxlczwvYT4gKDcgRXhjZXB0aW9uIEhhbmRsaW5nKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjI4Ij5Nb3RpdmF0aW9ucyBmb3IgdXNpbmcgdHlwZW1hcHM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gTiAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iVGNsLmh0bWwjbjU2Ij5OYW1lIGJhc2VkIHR5cGUgY29udmVyc2lvbjwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNTciPk5hbWUgYmFzZWQgdHlwZSBjb252ZXJzaW9uPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNDAiPk5hbWUgYmFzZWQgdHlwZSBjb252ZXJzaW9uPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuOCI+TmFtaW5nIFNlcnZpY2VzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjc2Ij5OZXN0ZWQgb2JqZWN0czwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjUyIj5OZXN0ZWQgT2JqZWN0czwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240MSI+TmVzdGVkIHN0cnVjdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI243Ij5Ob24taW50cnVzaXZlIGludGVyZmFjZSBidWlsZGluZzwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gTyAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iUGVybDUuaHRtbCNuNTEiPk9iamVjdCBPd25lcnNoaXA8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243MSI+T2JqZWN0IG93bmVyc2hpcDwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNyI+T2JqZWN0aXZlLUM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTkiPk9iamVjdGl2ZS1DIEV4YW1wbGU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlByZWZhY2UuaHRtbCNuOSI+T3JnYW5pemF0aW9uIG9mIHRoaXMgbWFudWFsPC9hPiAoUHJlZmFjZSk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjcyIj5PdGhlciBpc3N1ZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMiI+T3RoZXIgb2RkcyBhbmQgZW5kczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDIiPk90aGVyIHRoaW5ncyB0byBub3RlIGFib3V0IHN0cnVjdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjIyIj5PdXRwdXQgTWV0aG9kczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zMyI+T3ZlcnJpZGluZyBjYWxsIGJ5IHJlZmVyZW5jZTwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBQIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xOCI+UGFja2luZyBhIGRhdGEgc3RydWN0dXJlPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjU2Ij5QYXJ0aWFsIGNsYXNzIGRlZmluaXRpb25zPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjI3Ij5QYXNzaW5nIGNvbXBsZXggZGF0YXR5cGVzIGJ5IHZhbHVlPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzkiPlBlcmZvcm1hbmNlIGNvbmNlcm5zIGFuZCBkaXNhYmxpbmcgdGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2U8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjc5Ij5QZXJmb3JtYW5jZSBjb25jZXJucyBhbmQgaGludHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI24xMSI+UGVyZm9ybWFuY2Ugb2YgdGhlIHR5cGUtY2hlY2tlcjwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24zOCI+UGVybDUgdHlwZW1hcHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTMiPlBsYWNpbmcgdGhlIGZpbGVzIGluIHRoZSBsaWJyYXJ5PC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNDciPlBsb3R0aW5nIGFuIHVuc3RydWN0dXJlZCBtZXNoPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNDciPlBvaW50ZXIgaGFuZGxpbmc8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242MyI+UG9pbnRlciBoYW5kbGluZzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNjUiPlBvaW50ZXIgaGFuZGxpbmc8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xNSI+UG9pbnRlciBMaWJyYXJ5IEZ1bmN0aW9uczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMjgiPlBvaW50ZXJzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzAiPlBvaW50ZXJzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24yNiI+UG9pbnRlcnM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjMiPlBvaW50ZXJzIGFuZCBjb21wbGV4IG9iamVjdHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMzUiPlBvaW50ZXJzIHRvIGZ1bmN0aW9uczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243NSI+UHJlZGVmaW5lZCBTeW1ib2xzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMSI+UHJlbGltaW5hcmllczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xIj5QcmVsaW1pbmFyaWVzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMSI+UHJlbGltaW5hcmllczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODEiPlByZXBhcmluZyBhIEMgcHJvZ3JhbSBmb3IgU1dJRzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQyIj5QcmVwYXJpbmcgYSBtb2R1bGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQcmVmYWNlLmh0bWwjbjgiPlByZXJlcXVpc2l0ZXM8L2E+IChQcmVmYWNlKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xNCI+UHJlcmVxdWlzaXRlczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243NCI+UHJpbnRpbmc8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNTIiPlByb2JsZW1zIHdpdGggdGhlIE9wZW5HTCBpbnRlcmZhY2U8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240OSI+UHJvdGVjdGlvbjwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI242NCI+UHJvdGVjdGlvbjwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjgiPlB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMzUiPlB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNCI+UHl0aG9uIHNoYWRvdyBjbGFzc2VzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU1Ij5QeXRob24gdHlwZW1hcHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFIgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xNyI+UmVidWlsZGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyIChha2EuIHN0YXRpYyBsaW5raW5nKTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTEiPlJlZmVyZW5jZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjciPlJlZmVycmluZyB0byBvdGhlciBjbGFzc2VzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzgiPlJlbGF0aW9uc2hpcCB3aXRoIHBvaW50ZXJzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMCI+UmVtYXBwaW5nIEMgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNTgiPlJlbWFwcGluZyBjb25zdGFudHM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTQiPlJlbWFwcGluZyBkYXRhdHlwZXMgd2l0aCB0eXBlbWFwczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243MCI+UmVuYW1pbmc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTQiPlJlbmFtaW5nPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjMyIj5SZW5hbWluZyBkZWNsYXJhdGlvbnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xOCI+UmVxdWlyZWQgQysrIGNvbXBpbGVyPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjE3Ij5SZXF1aXJlZCBmaWxlczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240NSI+UmVxdWlyZWQgZmlsZXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yOCI+UmV0dXJuIGJ5IHZhbHVlPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240OCI+UmV0dXJuIHZhbHVlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjU5Ij5SZXR1cm5pbmcgdmFsdWVzIGluIGFyZ3VtZW50czwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjIzIj5SdW4gdGltZSBwb2ludGVyIHR5cGUgY2hlY2tpbmc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE3Ij5SdW5uaW5nIFNXSUc8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xNCI+UnVubmluZyBTV0lHPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xIj5SdW5uaW5nIFNXSUc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xNiI+UnVubmluZyBTV0lHPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24yNSI+UnVubmluZyBTV0lHIGZyb20gRGV2ZWxvcGVyIFN0dWRpbzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjAiPlJ1bm5pbmcgU1dJRyBmcm9tIERldmVsb3BlciBTdHVkaW88L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yMyI+UnVubmluZyBTV0lHIGZyb20gRGV2ZWxvcGVyIFN0dWRpbzwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuNCI+UnVudGltZSBzdXBwb3J0IChhbmQgcG90ZW50aWFsIHByb2JsZW1zKTwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFMgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMyIj5TYW1wbGUgUGVybCBTY3JpcHQ8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjM2Ij5TY29wZTwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjMzIj5TZXR0aW5nIGEgbW9kdWxlIG5hbWU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMjMiPlNldHRpbmcgYSBwYWNrYWdlIHByZWZpeDwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI244Ij5TaGFkb3cgY2xhc3NlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjcwIj5TaGFkb3cgY2xhc3NlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMTEiPlNoYWRvdyBjbGFzc2VzPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjUzIj5TaGFkb3cgRnVuY3Rpb25zPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzUiPlNoYWRvdyBGdW5jdGlvbnM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuNCI+U2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pYyBsb2FkaW5nPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xNyI+U2hvcnRjdXRzPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yIj5TaW1wbGUgQyBmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50czwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMjUiPlNpbXBsZSBjb25zdHJhaW50IGV4YW1wbGU8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjIiPlNpbXBsZSBwb2ludGVyczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjYiPlNvbHZpbmcgYSBzaW1wbGUgaGVhdC1lcXVhdGlvbjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTciPlNvcnRpbmc8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjM4Ij5TcGVjaWFsIHZhcmlhYmxlczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjY0Ij5TdGFuZGFyZCAgdHlwZW1hcHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjIiPlN0YW5kYXJkICB0eXBlbWFwczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240NiI+U3RhbmRhcmQgdHlwZW1hcHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zMSI+U3RhcnRpbmcgdGhlIHBhcnNlcjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuOSI+U3RhdGljIGluaXRpYWxpemF0aW9uIG9mIG11bHRpcGxlIG1vZHVsZXM8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlNjcmlwdGluZy5odG1sI24xMiI+U3RhdGljIGxpbmtpbmc8L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjIxIj5TdGF0aWMgbGlua2luZzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjQ3Ij5TdGF0aWMgbWVtYmVyczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjMxIj5TdHJ1Y3R1cmVzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24yNyI+U3RydWN0dXJlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjI5Ij5TdHJ1Y3R1cmVzIGFuZCBDKysgY2xhc3NlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjEwIj5TdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNSI+U3RydWN0dXJlcywgdW5pb25zLCBhbmQgb2JqZWN0IG9yaWVudGVkIEMgcHJvZ3JhbW1pbmc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xMSI+U3VtbWFyeTwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI240MSI+U3VtbWFyeSAoc28gZmFyKTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDMiPlN1cHBvcnRlZCBDKysgZmVhdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTUiPlNXSUcgRGlyZWN0aXZlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjEyIj5TV0lHIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2g8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMTMiPlNXSUcgaW50ZXJmYWNlIGZpbGU8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJQcmVmYWNlLmh0bWwjbjciPlNXSUcgaXMgZnJlZTwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjIxIj5TV0lHIG9uIHRoZSBQb3dlciBNYWNpbnRvc2g8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMjAiPlNXSUcgb24gV2luZG93cyA5NS9OVDwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xNSI+U1dJRyBPcmdhbml6YXRpb248L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMyI+U1dJRyBvdXRwdXQ8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjEyIj5TV0lHIE91dHB1dDwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI24yIj5TV0lHIHJlc291cmNlczwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI241NyI+U1dJRywgQysrLCBhbmQgdGhlIExlZ2lzbGF0aW9uIG9mIE1vcmFsaXR5PC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFQgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTkiPlRhYnMgYW5kIG90aGVyIGFubm95YW5jZXM8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241NCI+VGNsIHR5cGVtYXBzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xNSI+VGNsOC4wIGZlYXR1cmVzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTEiPnRjbHNoLmk8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTMiPlRlbXBsYXRlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243NCI+VGhlICNpZiBkaXJlY3RpdmU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMSI+VGhlICVleGNlcHQgZGlyZWN0aXZlPC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iTGlicmFyeS5odG1sI24yIj5UaGUgJWV4dGVybiBkaXJlY3RpdmU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMyI+VGhlICVpbXBvcnQgZGlyZWN0aXZlPC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEiPlRoZSAlaW5jbHVkZSBkaXJlY3RpdmU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zNCI+VGhlIEMrKyBjb2RlPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjIxIj5UaGUgRGF0YVR5cGUgY2xhc3M8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjE0Ij5UaGUgRmluYWwgV29yZD88L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTgiPlRoZSBmdXR1cmUgb2YgQysrIGFuZCBTV0lHPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTMiPlRoZSBGdXR1cmUgb2YgU1dJRzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMyI+VGhlIGdvcnkgZGV0YWlscyBvZiBzaGFkb3cgY2xhc3NlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE1Ij5UaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjkiPlRoZSBoZWFkZXIgZmlsZTwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjE5Ij5UaGUgaWRlYSAoaW4gYSBudXRzaGVsbCk8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240Ij5UaGUgTGFuZ3VhZ2UgY2xhc3MgKHNpbXBsZSB2ZXJzaW9uKTwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zIj5UaGUgbG93LWxldmVsIFB5dGhvbi9DIGludGVyZmFjZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMzIj5UaGUgTUFUTEFCIGVuZ2luZSBpbnRlcmZhY2U8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240Ij5UaGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTYiPlRoZSBvcmdhbml6YXRpb24gb2YgdGhpcyBjaGFwdGVyPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243NiI+VGhlIG91dHB1dCBvZiBTV0lHPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNzEiPlRoZSBzdGVwLWJ5LXN0ZXAgcHJvY2VzcyBmb3IgbWFraW5nIGEgcGx1Z2luIGV4dGVuc2lvbi48L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjIzIj5UaGUgU3RyaW5nIENsYXNzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjE0Ij5UaGUgc3dpZyBjb21tYW5kPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI244MiI+VGhlIFNXSUcgaW50ZXJmYWNlIGZpbGU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuNSI+VGhlIFNXSUcgbGlicmFyeTwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQyIj5UaGUgU1dJRyBsaWJyYXJ5IGFuZCBpbnN0YWxsYXRpb24gaXNzdWVzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjQiPlRoZSBTV0lHIHBhY2thZ2U8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yIj5UaGUgU1dJRyBQb2ludGVyIExpYnJhcnk8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IkFkdmFuY2VkLmh0bWwjbjYiPlRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeTwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzAiPlRoZSB0aGlzIHBvaW50ZXI8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMSI+VGhlIHR3byBsYW5ndWFnZSB2aWV3IG9mIHRoZSB3b3JsZDwvYT4gKDIgU2NyaXB0aW5nIExhbmd1YWdlcyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjYiPlRoZSB0eXBlbWFwIEMgQVBJLjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjUiPlRoZSB1c2Ugb2YgaWQ8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTYiPlRoZSB3b3JsZCdzIGZhc3Rlc3Qgd2F5IHRvIHdyaXRlIGEgTWFrZWZpbGU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yNSI+VGhlIFdyYXBwZXJGdW5jdGlvbiBjbGFzczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuNSI+VGl0bGVzLCBzZWN0aW9ucywgYW5kIHN1YnNlY3Rpb25zPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjkiPlR1cm5pbmcgYSBTV0lHIG1vZHVsZSBpbnRvIGEgVGNsIFBhY2thZ2UuPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQ0Ij5UdXJuaW5nIFBlcmwgcmVmZXJlbmNlcyBpbnRvIEMgcG9pbnRlcnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242OSI+VHdvIGNsYXNzZXM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI245Ij5UeXBlIGNhc3Rpbmc8L2E+ICgxMSBBZHZhbmNlZCBUb3BpY3MpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuOCI+VHlwZSBlcXVpdmFsZW5jZTwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjI2Ij5UeXBlZGVmPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjM2Ij5UeXBlZGVmIGFuZCBzdHJ1Y3R1cmVzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xMiI+VHlwZW1hcCBleGFtcGxlczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzUiPlR5cGVtYXAgbWF0Y2hpbmcgcnVsZXM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjM5Ij5UeXBlbWFwIHZhcmlhYmxlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU2Ij5UeXBlbWFwIHZhcmlhYmxlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241NSI+VHlwZW1hcCB2YXJpYWJsZXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjExIj5UeXBlbWFwczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNiI+VHlwZW1hcHMgKGZyb20gQyk8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xNCI+VHlwZW1hcHMgYW5kIHRoZSBmdXR1cmU8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjEwIj5UeXBlbWFwcyBhbmQgdGhlIFNXSUcgTGlicmFyeTwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuOSI+VHlwZW1hcHMgZm9yIGhhbmRsaW5nIGFycmF5czwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBVIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJQeXRob24uaHRtbCNuMzgiPlVzZSBQeXRob24gZm9yIGNvbnRyb2wsIEMgZm9yIHBlcmZvcm1hbmNlPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjUxIj5Vc2Ugc3RhdGljIGxpbmtpbmc8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjEiPlVzZWZ1bCBmdW5jdGlvbnM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNDUiPlVzZWZ1bCBmdW5jdGlvbnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242MyI+VXNlZnVsIEZ1bmN0aW9uczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zNiI+VXNpbmcgIG91ciBuZXcgbW9kdWxlPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjIwIj5Vc2luZyBhIGR5bmFtaWMgbW9kdWxlPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240OSI+VXNpbmcgYSBuZXcgZG9jdW1lbnRhdGlvbiBtb2R1bGU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yNCI+VXNpbmcgZGlmZmVyZW50IG5hbWVzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNTAiPlVzaW5nIGR5bmFtaWMgbG9hZGluZzwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjI0Ij5Vc2luZyBOTUFLRTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjI2Ij5Vc2luZyBOTUFLRTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjEiPlVzaW5nIE5NQUtFPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMjAiPlVzaW5nIHNvbWUgdHlwZW1hcHM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI240MyI+VXNpbmcgdGhlIGdkIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241MSI+VXNpbmcgdGhlIE9wZW5HTCBtb2R1bGU8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjcyIj5Vc2luZyB0aGUgcGx1Z2luPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNiI+VXNpbmcgVGhlIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnk8L2E+ICg3IEV4Y2VwdGlvbiBIYW5kbGluZyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNjAiPlVzaW5nIHR5cGVtYXBzIHRvIHJldHVybiBhcmd1bWVudHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240MiI+VXNpbmcgdHlwZW1hcHMgdG8gcmV0dXJuIHZhbHVlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjE4Ij5Vc2luZyB5b3VyIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24yNCI+VXNpbmcgW2luY3IgVGNsXSBuYW1lc3BhY2VzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gViAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjI0Ij5WYXJpYWJsZSBMaW5raW5nPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjgiPlZhcmlhYmxlIGxpbmtpbmc8L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yMCI+VmFyaWFibGVzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFcgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjUwIj5XaGF0IGdldHMgY3JlYXRlZD88L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yNyI+V2hhdCBoYXBwZW5zIG9uIHR5cGVtYXAgbG9va3VwPzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjUiPldoYXQgaGFwcGVucyB3aGVuIFNXSUcgZW5jb3VudGVycyBhbiB1bmtub3duIGRhdGF0eXBlPzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU0Ij5XaGF0IGlzIGEgdHlwZW1hcD88L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNTMiPldoYXQgaXMgYSB0eXBlbWFwPzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24zMSI+V2hhdCBpcyBhIHR5cGVtYXA/PC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMSI+V2hhdCBpcyBTV0lHPzwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODUiPldoYXQgdG8gZG8gd2l0aCBtYWluKCk8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlByZWZhY2UuaHRtbCNuNSI+V2hhdCdzIG5ldz88L2E+IChQcmVmYWNlKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zMyI+V2hlcmUgdG8gZ28gZm9yIG1vcmUgaW5mb3JtYXRpb248L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNTAiPldoZXJlIHRvIGdvIGZvciBtb3JlIGluZm9ybWF0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTYiPldoZXJlIHRvIGdvIGZyb20gaGVyZT88L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkFkdmFuY2VkLmh0bWwjbjEwIj5XaHkgYSBuYW1lIGJhc2VkIGFwcHJvYWNoPzwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI241Ij5XaHkgZG9lc24ndCBDKysgaW5oZXJpdGFuY2Ugd29yayBiZXR3ZWVuIG1vZHVsZXM/PC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODMiPldoeSB1c2Ugc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGVzPzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjMwIj5XaHkgd3JpdGUgc2hhZG93IGNsYXNzZXMgaW4gUHl0aG9uPzwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNjcmlwdGluZy5odG1sI242Ij5XaWxsIGFkZGluZyBhIHNjcmlwdGluZyBsYW5ndWFnZSB0byBteSBDIHByb2dyYW0gbWFrZSBpdCB1bm1hbmFnYWJsZT88L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjUiPldpbGwgc2NyaXB0aW5nIGxhbmd1YWdlcyBtYWtlIG15IEMgcHJvZ3JhbSBpbmVmZmljaWVudD88L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iTGlicmFyeS5odG1sI244Ij5Xb3JraW5nIHdpdGggbGlicmFyeSBmaWxlczwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI244NiI+V29ya2luZyB3aXRoIHRoZSBDIHByZXByb2Nlc3NvcjwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI244MCI+V3JhcHBlciBjb2RlIGJsb2NrczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjciPldyYXBwZXIgZnVuY3Rpb25zPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243Ij5XcmFwcGluZyBhIEMgbGlicmFyeTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTQiPldyYXBwaW5nIGEgbGlicmFyeSBmaWxlPC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xMCI+V3JhcHBpbmcgQyBsaWJyYXJpZXMgYW5kIG90aGVyIHBhY2thZ2VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNDYiPldyYXBwaW5nIGdsLmg8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjQ3Ij5XcmFwcGluZyBnbHUuaDwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNDgiPldyYXBwaW5nIHRoZSBhdXggbGlicmFyeTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24zNCI+V3JhcHBpbmcgdGhlIE1BVExBQiBtYXRyaXggZnVuY3Rpb25zPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTkiPldyaXRpbmcgYSBtYWluIHByb2dyYW08L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjQiPldyaXRpbmcgYSBtYWluIHByb2dyYW0gYW5kIFRjbF9BcHBJbml0KCk8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ4Ij5Xcml0aW5nIGEgbmV3IGRvY3VtZW50YXRpb24gbW9kdWxlPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjEwIj5Xcml0aW5nIGEgUmVhbCBMYW5ndWFnZSBNb2R1bGU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI242Ij5Xcml0aW5nIG5ldyB0eXBlbWFwczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQxIj5Xcml0aW5nIHRoZSBkZWZhdWx0IHR5cGVtYXBzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuOCI+V3JpdGluZyB0eXBlbWFwIGNvZGU8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj48L2Jsb2NrcXVvdGU+Ci0KLTxwPjxocj4KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDc6MTggMTk5NyA8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbnRyb2R1Y3Rpb24uaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvSW50cm9kdWN0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Y2ZjZTkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbnRyb2R1Y3Rpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotPGEgbmFtZT0ibjAiPjwvYT48aDE+MSBJbnRyb2R1Y3Rpb248L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5XaGF0IGlzIFNXSUc/PC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPkxpZmUgYmVmb3JlIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMyI+TGlmZSBhZnRlciBTV0lHPC9hPgotPGxpPiA8YSBocmVmPSIjbjQiPlRoZSBTV0lHIHBhY2thZ2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QSBTV0lHIGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNiI+QyBzeW50YXgsIGJ1dCBub3QgYSBDIGNvbXBpbGVyPC9hPgotPGxpPiA8YSBocmVmPSIjbjciPk5vbi1pbnRydXNpdmUgaW50ZXJmYWNlIGJ1aWxkaW5nPC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPkhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuOSI+RXZlbnQgZHJpdmVuIEMgcHJvZ3JhbW1pbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPkF1dG9tYXRpYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPlN1bW1hcnk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTIiPlNXSUcgZm9yIFdpbmRvd3MgYW5kIE1hY2ludG9zaDwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBXaGF0IGlzIFNXSUc/PC9oMj4KLVNXSUcgaXMgYSBjb2RlIGRldmVsb3BtZW50IHRvb2wgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBxdWlja2x5IGJ1aWxkIHBvd2VyZnVsIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2VzIHRvIEMsIEMrKywgb3IgT2JqZWN0aXZlLUMgcHJvZ3JhbXMuIEluIGEgbnV0c2hlbGwsIFNXSUcgaXMgYSBjb21waWxlciB0aGF0IHRha2VzIEMgZGVjbGFyYXRpb25zIGFuZCB0dXJucyB0aGVtIGludG8gdGhlICJnbHVlIiBuZWVkZWQgdG8gYWNjZXNzIHRoZW0gZnJvbSBjb21tb24gc2NyaXB0aW5nIGxhbmd1YWdlcyBpbmNsdWRpbmcgUGVybCwgUHl0aG9uLCBhbmQgVGNsLiBTV0lHIHVzdWFsbHkgcmVxdWlyZXMgbm8gbW9kaWZpY2F0aW9ucyB0byBleGlzdGluZyBDIGNvZGUgYW5kIGNhbiBvZnRlbiBiZSB1c2VkIHRvIGJ1aWxkIGEgd29ya2luZyBpbnRlcmZhY2UgaW4gYSBtYXR0ZXIgb2YgbWludXRlcy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkbyBhIG51bWJlciBvZiBpbnRlcmVzdGluZyB0aGluZ3MgaW5jbHVkaW5nIDo8cD4KLTxwPgotPHVsPgotPGxpPkJ1aWxkaW5nIHBvd2VyZnVsIGludGVyZmFjZXMgdG8gZXhpc3RpbmcgQyBwcm9ncmFtcy4KLTxsaT5SYXBpZCBwcm90b3R5cGluZyBhbmQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQuCi08bGk+SW50ZXJhY3RpdmUgZGVidWdnaW5nLgotPGxpPk1ha2luZyBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSAodXNpbmcgVGsgZm9yIGV4YW1wbGUpLgotPGxpPlBvd2VyZnVsIHRlc3Rpbmcgb2YgQyBsaWJyYXJpZXMgYW5kIHByb2dyYW1zICh1c2luZyBzY3JpcHRzKS4KLTxsaT5CdWlsZGluZyBoaWdoIHBlcmZvcm1hbmNlIEMgbW9kdWxlcyBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcy4KLTxsaT5NYWtpbmcgQyBwcm9ncmFtbWluZyBtb3JlIGVuam95YWJsZSAob3IgdG9sZXJhYmxlIGRlcGVuZGluZyBvbiB5b3VyIHBvaW50IG9mIHZpZXcpCi08bGk+SW1wcmVzc2luZyB5b3VyIGZyaWVuZHMuCi08L3VsPgotPHA+Ci1UaGVyZSBhcmUgc29tZSBjb21wdXRlciBzY2llbnRpc3RzIHdobyBzZWVtIHRvIGJlbGlldmUgdGhhdCB0aGUgb25seSB3YXkgdG8gc29sdmUgY29tcGxpY2F0ZWQgcHJvYmxlbXMgaXMgdG8gY3JlYXRlIHNvZnR3YXJlIG9mIGVwaWMgcHJvcG9ydGlvbnMgYW5kIHRvIGhhdmUgc29tZSBzb3J0IG9mICJncmFuZCIgc29mdHdhcmUgZGVzaWduLiBVbmZvcnR1bmF0ZWx5IHRoaXMgc2VlbXMgdG8gbGVhZCB0byBzb2x1dGlvbnMgdGhhdCBhcmUgZXZlbiBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIG9yaWdpbmFsIHByb2JsZW0uIFRoaXMsIGluIHR1cm4gZW5hYmxlcyB0aGUgdXNlciB0byBmb3JnZXQgYWJvdXQgdGhlIG9yaWdpbmFsIHByb2JsZW0gYW5kIHNwZW5kIHRoZWlyIHRpbWUgY3Vyc2luZyBhdCB0aGVpciBtYWNoaW5lIChoZW5jZSwgdGhlIHRlcm0gImVuYWJsaW5nIHRlY2hub2xvZ3kiKS4gU1dJRywgb24gdGhlIG90aGVyIGhhbmQsIHdhcyBkZXZlbG9wZWQgYmVjYXVzZSBJIHdhcyBmZWQgdXAgd2l0aCBob3cgbXVjaCB0aW1lIEkgd2FzIHdhc3RpbmcgdHJ5aW5nIHRvIGRldmVsb3AgZmxleGlibGUgc2NpZW50aWZpYyBhcHBsaWNhdGlvbnMuIEkgd2FudGVkIGEgdG9vbCB0aGF0IHdvdWxkIGxldCBtZSB1c2Ugc2NyaXB0aW5nIGxhbmd1YWdlcyB0byBnbHVlIGRpZmZlcmVudCB0aGluZ3MgdG9nZXRoZXIsIGJ1dCBkaWRuJ3QgZ2V0IGluIHRoZSB3YXkgb2YgdGhlIHJlYWwgcHJvYmxlbXMgSSB3YXMgd29ya2luZyBvbi4gSSB3YW50ZWQgYSBzaW1wbGUgdG9vbCB0aGF0IHNjaWVudGlzdHMgYW5kIGVuZ2luZWVycyBjb3VsZCB1c2UgdG8gcHV0IHRvZ2V0aGVyIGFwcGxpY2F0aW9ucyBpbnZvbHZpbmcgbnVtYmVyIGNydW5jaGluZywgZGF0YSBhbmFseXNpcywgYW5kIHZpc3VhbGl6YXRpb24gd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgdGVkaW91cyBzeXN0ZW1zIHByb2dyYW1taW5nLCBtYWtpbmcgc3Vic3RhbnRpYWwgbW9kaWZpY2F0aW9ucyB0byBleGlzdGluZyBjb2RlLCB0cnlpbmcgdG8gZmlndXJlIG91dCBhIGJpZyBtb25vbGl0aGljIGNvbXB1dGluZyAiZW52aXJvbm1lbnQsIiBvciBoYXZpbmcgdG8gZ2V0IGEgc2Vjb25kIGRlZ3JlZSBpbiBjb21wdXRlciBzY2llbmNlLiBJbiAgc2hvcnQsIEkgd2FudGVkIHRvIGhhdmUgYSB0b29sIHRoYXQgd291bGQgaW1wcm92ZSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgYnV0IHN0YXkgb3V0IG9mIHRoZSB3YXkgYXMgbXVjaCBhcyBwb3NzaWJsZS48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBMaWZlIGJlZm9yZSBTV0lHPC9oMj4KLVNXSUcgd2FzIGRldmVsb3BlZCB0byBtYWtlIG15IGxpZmUgZWFzaWVyIGFzIGEgQyBwcm9ncmFtbWVyLiBXaGlsZSBDIGlzIGdyZWF0IGZvciBoaWdoIHBlcmZvcm1hbmNlIGFuZCBzeXN0ZW1zIHByb2dyYW1taW5nLCB0cnlpbmcgdG8gbWFrZSBhbiBpbnRlcmFjdGl2ZSBhbmQgaGlnaGx5IGZsZXhpYmxlIEMgcHJvZ3JhbSBpcyBhIG5pZ2h0bWFyZSAoaW4gZmFjdCwgaXQncyBtdWNoIHdvcnNlIHRoYW4gdGhhdCkuIFRoZSByZWFsIHByb2JsZW0gaXMgdGhhdCBmb3IgZXZlcnkgQyBwcm9ncmFtIEkgd3JvdGUsIEkgbmVlZGVkIHRvIGhhdmUgc29tZSBzb3J0IG9mIGludGVyZmFjZSwgYnV0IGJlaW5nIG1vcmUgaW50ZXJlc3RlZCBpbiBvdGhlciBwcm9ibGVtcywgSSB3b3VsZCBhbHdheXMgZW5kIHVwIHdyaXRpbmcgYSByZWFsbHkgYmFkIGludGVyZmFjZSB0aGF0IHdhcyBoYXJkIHRvIGV4dGVuZCwgaGFyZCB0byBtb2RpZnksIGFuZCBoYXJkIHRvIHVzZS4gIEkgc3VwcG9zZSBJIGNvdWxkIGhhdmUgdHJpZWQgdG8gZG8gc29tZXRoaW5nIGZhbmN5IHVzaW5nIFgxMSwgYnV0IHdobyBoYXMgdGltZSB0byB3YXN0ZSB3ZWVrcyBvciBtb250aHMgdHJ5aW5nIHRvIGNvbWUgdXAgd2l0aCBhbiBpbnRlcmZhY2UgdGhhdCBpcyBwcm9iYWJseSBnb2luZyB0byBlbmQgdXAgYmVpbmcgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIEMgY29kZT8gVGhlcmUgYXJlIG1vcmUgaW50ZXJlc3RpbmcgcHJvYmxlbXMgdG8gd29yayBvbi48cD4KLTxwPgotVGhlIHJlYWwgcHJvYmxlbSwgcGVyaGFwcywgaXMgdGhhdCBtb3N0IEMgcHJvZ3JhbXMgZW5kIHVwIGJlaW5nIHN0cnVjdHVyZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5BIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCi08bGk+QSA8dHQ+bWFpbigpPC90dD4gcHJvZ3JhbSB0aGF0IHN0YXJ0cyBldmVyeXRoaW5nIHVwLgotPGxpPkEgYnVuY2ggb2YgaGFja3MgYWRkZWQgdG8gbWFrZSBpdCB1c2FibGUuCi08L3VsPgotPHA+Ci1UaGUgPHR0Pm1haW4oKTwvdHQ+IHByb2dyYW0gbWF5IGJlIHdyaXR0ZW4gdG8gaGFuZGxlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgb3IgdG8gcmVhZCBkYXRhIGZyb20gPHR0PnN0ZGluPC90dD4sIGJ1dCBlaXRoZXIgd2F5LCBtb2RpZnlpbmcgb3IgZXh0ZW5kaW5nIHRoZSBwcm9ncmFtIHRvIGRvIHNvbWV0aGluZyBuZXcgcmVxdWlyZXMgY2hhbmdpbmcgdGhlIEMgY29kZSwgcmVjb21waWxpbmcsIGFuZCB0ZXN0aW5nLiBJZiB5b3UgbWFrZSBhIG1pc3Rha2UsIHlvdSBuZWVkIHRvIHJlcGVhdCB0aGlzIGN5Y2xlIHVudGlsIHRoaW5ncyB3b3JrLiBPZiBjb3Vyc2UsIGFzIG1vcmUgYW5kIG1vcmUgZmVhdHVyZXMgYXJlIGFkZGVkLCB5b3VyIEMgcHJvZ3JhbSB0dXJucyBpbnRvIGEgaGlkZW91cyB1bmludGVsbGlnaWJsZSBtZXNzIHRoYXQgaXMgZXZlbiBtb3JlIGRpZmZpY3VsdCB0byBtb2RpZnkgdGhhbiBpdCB3YXMgYmVmb3JlIChPZiBjb3Vyc2UsIGlmIHlvdSdyZSBsdWNreSwgeW91ciBwcm9qZWN0IHN0YXJ0cyBvdXQgYXMgYW4gdW5pbnRlbGxpZ2libGUgbWVzcykuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gTGlmZSBhZnRlciBTV0lHPC9oMj4KLVdpdGggU1dJRywgSSB3YXMgaG9waW5nIHRvIGF2b2lkIG1hbnkgb2YgdGhlIGhlYWRhY2hlcyBvZiB3b3JraW5nIHdpdGggQyBwcm9ncmFtcywgYnkgc3RydWN0dXJpbmcgdGhpbmdzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08dWw+Ci08bGk+QSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLgotPGxpPkEgbmljZSBpbnRlcnByZXRlZCBpbnRlcmZhY2UgbGFuZ3VhZ2UgdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgZXZlcnl0aGluZy4KLTwvdWw+Ci08cD4KLVdpdGggdGhpcyBtb2RlbCwgeW91IGtlZXAgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHlvdXIgQyBwcm9ncmFtLCBidXQgYWNjZXNzIGl0IHRocm91Z2ggYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlIGluc3RlYWQgb2Ygd3JpdGluZyBtb3JlIEMgY29kZS4gVGhpcyBpcyBuaWNlIGJlY2F1c2UgeW91IGFyZSBnaXZlbiBmdWxsIGZyZWVkb20gdG8gY2FsbCBmdW5jdGlvbnMgaW4gYW55IG9yZGVyLCBhY2Nlc3MgdmFyaWFibGVzLCBhbmQgd3JpdGUgc2NyaXB0cyB0byBkbyBhbGwgc29ydHMgb2YgaW50ZXJlc3RpbmcgdGhpbmdzLiBJZiB5b3Ugd2FudCB0byBjaGFuZ2Ugc29tZXRoaW5nLCBqdXN0IG1vZGlmeSBhIHNjcmlwdCwgYW5kIHJlcnVuIGl0LiBJZiB5b3UncmUgdHJ5aW5nIHRvIGRlYnVnIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMsIHlvdSBjYW4gY2FsbCB0aGVtIGluZGl2aWR1YWxseSBhbmQgc2VlIHdoYXQgdGhleSBkby4gSWYgeW91J3JlIHRyeWluZyB0byBidWlsZCBhIHBhY2thZ2Ugb3V0IG9mIHZhcmlvdXMgY29tcG9uZW50cywgeW91IGNhbiBqdXN0IGdsdWUgZXZlcnl0aGluZyB0b2dldGhlciB3aXRoIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGFuZCBoYXZlIGEgY29tbW9uIGludGVyZmFjZSB0byBhbGwgb2YgdGhlIHZhcmlvdXMgcGllY2VzLiA8cD4KLTxwPgotU1dJRyB0cmllcyB0byBtYWtlIHRoZSBpbnRlZ3JhdGlvbiBiZXR3ZWVuIHNjcmlwdGluZyBsYW5ndWFnZXMgYW5kIEMgYXMgcGFpbmxlc3MgYXMgcG9zc2libGUuIFRoaXMgYWxsb3dzIHlvdSB0byBmb2N1cyBvbiB0aGUgdW5kZXJseWluZyBDIHByb2dyYW0gYW5kIHVzaW5nIHRoZSBoaWdoLWxldmVsIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UsIGJ1dCBub3QgdGhlIHRlZGlvdXMgYW5kIGNvbXBsZXggY2hvcmUgb2YgbWFraW5nIHRoZSB0d28gbGFuZ3VhZ2VzIHRhbGsgdG8gZWFjaCBvdGhlci48cD4KLTxwPgotSSBsaWtlIHRoaXMgbW9kZWwgb2YgcHJvZ3JhbW1pbmcuIFdoaWxlIGl0J3MgY2VydGFpbmx5IG5vICJzaWx2ZXItYnVsbGV0IiwgaXQgaGFzIG1hZGUgcHJvZ3JhbW1pbmcgYWxvdCBtb3JlIGVuam95YWJsZSBhbmQgaGFzIGVuYWJsZWQgdXMgdG8gc29sdmUgY29tcGxpY2F0ZWQgcHJvYmxlbXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdW5uZWNjZXNzYXJpbHkgZGlmZmljdWx0IHVzaW5nIG9ubHkgQy48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBUaGUgU1dJRyBwYWNrYWdlPC9oMj4KLVNXSUcgaXMgYSBjb21waWxlciB0aGF0IHRha2VzIEFOU0kgQyBkZWNsYXJhdGlvbnMgYW5kIHR1cm5zIHRoZW0gaW50byBhIGZpbGUgY29udGFpbmluZyB0aGUgQyBjb2RlIGZvciBiaW5kaW5nIEMgZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHMgdG8gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKFNXSUcgYWxzbyBzdXBwb3J0cyBDKysgY2xhc3MgYW5kIE9iamVjdGl2ZS1DIGludGVyZmFjZSBkZWZpbml0aW9ucykuIElucHV0IGlzIHNwZWNpZmllZCBpbiB0aGUgZm9ybSBvZiBhbiAiaW50ZXJmYWNlIGZpbGUiIGNvbnRhaW5pbmcgZGVjbGFyYXRpb25zIChpbnB1dCBjYW4gYWxzbyBiZSBnaXZlbiBmcm9tIEMgc291cmNlIGZpbGVzIHByb3ZpZGVkIHRoZXkgYXJlIHN1ZmZpY2llbnRseSBjbGVhbikuIFRoZSBTV0lHIHBhcnNlciB0YWtlcyB0aGlzIGlucHV0IGZpbGUgYW5kIHBhc3NlcyBpdCBvbiB0byBhIGNvZGUgZ2VuZXJhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBtb2R1bGUuIFRoZXNlIG1vZHVsZXMgcHJvZHVjZSBhbiBpbnRlcmZhY2UgZm9yIGEgcGFydGljdWxhciBzY3JpcHRpbmcgbGFuZ3VhZ2UgYWxvbmcgd2l0aCBhIGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIGludGVyZmFjZSB0aGF0IHdhcyBjcmVhdGVkLiBEaWZmZXJlbnQgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcmUgc3VwcG9ydGVkIGJ5IHdyaXRpbmcgbmV3IGJhY2stZW5kIG1vZHVsZXMgdG8gdGhlIHN5c3RlbS48cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoMS4xLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBBIFNXSUcgZXhhbXBsZTwvaDI+Ci1UaGUgYmVzdCB3YXkgdG8gaWxsdXN0cmF0ZSBTV0lHIGlzIHdpdGggYSBzaW1wbGUgZXhhbXBsZS4gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBDIGNvZGU6IDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBleGFtcGxlLmMgKi8KLQotZG91YmxlICBNeV92YXJpYWJsZSAgPSAzLjA7Ci0KLS8qIENvbXB1dGUgZmFjdG9yaWFsIG9mIG4gKi8KLWludCAgZmFjdChpbnQgbikgewotCWlmIChuICZsdDs9IDEpIHJldHVybiAxOwotCWVsc2UgcmV0dXJuIG4qZmFjdChuLTEpOwotfQotCi0vKiBDb21wdXRlIG4gbW9kIG0gKi8KLWludCBteV9tb2QoaW50IG4sIGludCBtKSB7Ci0JcmV0dXJuKG4gJSBtKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gYWNjZXNzIHRoZXNlIGZ1bmN0aW9ucyBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSAgPHR0Pk15X3ZhcmlhYmxlPC90dD4gZnJvbSBUY2wuICBXZSBzdGFydCBieSBtYWtpbmcgYSBTV0lHIGludGVyZmFjZSBmaWxlIGFzIHNob3duIGJlbG93IChieSBjb252ZW50aW9uLCB0aGVzZSBmaWxlcyBjYXJyeSBhIC5pIHN1ZmZpeCkgOiAgPHA+Ci08YSBuYW1lPSJuMTMiPjwvYT48aDM+IFNXSUcgaW50ZXJmYWNlIGZpbGU8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEZpbGUgOiBleGFtcGxlLmkgKi8KLSVtb2R1bGUgZXhhbXBsZQotJXsKLS8qIFB1dCBoZWFkZXJzIGFuZCBvdGhlciBkZWNsYXJhdGlvbnMgaGVyZSAqLwotJX0KLQotZXh0ZXJuIGRvdWJsZSBNeV92YXJpYWJsZTsKLWV4dGVybiBpbnQgICAgZmFjdChpbnQpOwotZXh0ZXJuIGludCAgICBteV9tb2QoaW50IG4sIGludCBtKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGludGVyZmFjZSBmaWxlIGNvbnRhaW5zIEFOU0kgQyBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICBUaGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGJ5IFNXSUcuICAgVGhlIDx0dD4leywlfTwvdHQ+IGJsb2NrIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGluc2VydGluZyBhZGRpdGlvbmFsIGNvZGUgc3VjaCBhcyBDIGhlYWRlciBmaWxlcyBvciBhZGRpdGlvbmFsIEMgZnVuY3Rpb25zLiA8cD4KLTxhIG5hbWU9Im4xNCI+PC9hPjxoMz4gVGhlIHN3aWcgY29tbWFuZDwvaDM+Ci1TV0lHIGlzIGludm9rZWQgdXNpbmcgdGhlIDx0dD5zd2lnPC90dD4gY29tbWFuZC4gV2UgY2FuIHVzZSB0aGlzIHRvIGJ1aWxkIGEgVGNsIG1vZHVsZSAodW5kZXIgTGludXgpIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgZXhhbXBsZS5pCi1HZW5lcmF0aW5nIHdyYXBwZXJzIGZvciBUY2wuCi11bml4ICZndDsgZ2NjIC1jIC1mcGljIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZQotdW5peCAmZ3Q7IGdjYyAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvIAotdW5peCAmZ3Q7IHRjbHNoCi0lIGxvYWQgLi9leGFtcGxlLnNvCi0lIGZhY3QgNAotMjQKLSUgbXlfbW9kIDIzIDcKLTIKLSUgZXhwciAkTXlfdmFyaWFibGUgKyA0LjUKLTcuNQotJQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCTxwPgotVGhlIDx0dD5zd2lnPC90dD4gY29tbWFuZCBwcm9kdWNlZCBhIG5ldyBmaWxlIGNhbGxlZCA8dHQ+ZXhhbXBsZV93cmFwLmM8L3R0PiB0aGF0IHNob3VsZCBiZSBjb21waWxlZCBhbG9uZyB3aXRoIHRoZSA8dHQ+ZXhhbXBsZS5jPC90dD4gZmlsZS4gIE1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMgYW5kIHNjcmlwdGluZyBsYW5ndWFnZXMgbm93IHN1cHBvcnQgZHluYW1pYyBsb2FkaW5nIG9mIG1vZHVsZXMuICAgSW4gb3VyIGV4YW1wbGUsIG91ciBUY2wgbW9kdWxlIGhhcyBiZWVuIGNvbXBpbGVkIGludG8gYSBzaGFyZWQgbGlicmFyeSB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byBUY2wgYW5kIHVzZWQuICAgV2hlbiBsb2FkZWQsIFRjbCB3aWxsIG5vdyBoYXZlIG91ciBuZXcgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYWRkZWQgdG8gaXQuICBUYWtpbmcgYSBjYXJlZnVsIGxvb2sgYXQgdGhlIGZpbGUgPHR0PmV4YW1wbGVfd3JhcC5jPC90dD4gcmV2ZWFscyBhIGhpZGVvdXMgbWVzcywgYnV0IGZvcnR1bmF0ZWx5IHlvdSBhbG1vc3QgbmV2ZXIgbmVlZCB0byB3b3JyeSBhYm91dCBpdC48cD4KLTxhIG5hbWU9Im4xNSI+PC9hPjxoMz4gQnVpbGRpbmcgYSBQZXJsNSBtb2R1bGU8L2gzPgotTm93LCBsZXQncyB0dXJuIHRoZXNlIGZ1bmN0aW9ucyBpbnRvIGEgUGVybDUgbW9kdWxlLiBXaXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcyB0eXBlIHRoZSBmb2xsb3dpbmcgKHNob3duIGZvciBTb2xhcmlzKTo8cD4KLTxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1wZXJsNSBleGFtcGxlLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFBlcmw1Ci11bml4ICZndDsgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyBcCi0JLUkvdXNyL2xvY2FsL2xpYi9wZXJsNS9zdW40LXNvbGFyaXMvNS4wMDMvQ09SRQotdW5peCZndDsgbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28gCQkJCQkJCQkjIFRoaXMgaXMgZm9yIFNvbGFyaXMKLXVuaXggJmd0OyBwZXJsNS4wMDMKLXVzZSBleGFtcGxlOwotcHJpbnQgZXhhbXBsZTo6ZmFjdCg0KSwgIlxuIjsKLXByaW50IGV4YW1wbGU6Om15X21vZCgyMyw3KSwgIlxuIjsKLXByaW50ICRleGFtcGxlOjpNeV92YXJpYWJsZSArIDQuNSwgIlxuIjsKLSZsdDtjdHJsLWQmZ3Q7Ci0yNAotMgotNy41Ci11bml4ICZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gQnVpbGRpbmcgYSBQeXRob24gbW9kdWxlPC9oMz4KLUZpbmFsbHksIGxldCdzIGJ1aWxkIGEgbW9kdWxlIGZvciBQeXRob24xLjQgKHNob3duIGZvciBJcml4KS48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaQotR2VuZXJhdGluZyB3cmFwcGVycyBmb3IgUHl0aG9uCi11bml4ICZndDsgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjQKLXVuaXggJmd0OyBsZCAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlbW9kdWxlLnNvICAgICAjIElyaXgKLXVuaXggJmd0OyBQeXRob24KLVB5dGhvbiAxLjQgKFNlcCAxMCAxOTk2KSAgW0dDQyAyLjcuMF0KLUNvcHlyaWdodCAxOTkxLTE5OTYgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLAotQW1zdGVyZGFtCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IGV4YW1wbGUKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmZhY3QoNCkKLTI0Ci0mZ3Q7Jmd0OyZndDsgZXhhbXBsZS5teV9tb2QoMjMsNykKLTIKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmN2YXIuTXlfdmFyaWFibGUgKyA0LjUKLTcuNQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjE3Ij48L2E+PGgzPiBTaG9ydGN1dHM8L2gzPgotVG8gdGhlIHRydWx5IGxhenkgcHJvZ3JhbW1lciwgb25lIG1heSB3b25kZXIgd2h5IHdlIG5lZWRlZCB0aGUgZXh0cmEgaW50ZXJmYWNlIGZpbGUgYXQgYWxsLiBBcyBpdCB0dXJucyBvdXQsIHdlIGNhbiBvZnRlbiBkbyB3aXRob3V0IGl0LiBGb3IgZXhhbXBsZSwgd2UgY291bGQgYWxzbyBidWlsZCBhIFBlcmw1IG1vZHVsZSBieSBqdXN0IHJ1bm5pbmcgU1dJRyBvbiB0aGUgQyBzb3VyY2UgYW5kIHNwZWNpZnlpbmcgYSBtb2R1bGUgbmFtZSBhcyBmb2xsb3dzPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtbW9kdWxlIGV4YW1wbGUgZXhhbXBsZS5jCi11bml4ICZndDsgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyBcCi0JLUkvdXNyL2xvY2FsL2xpYi9wZXJsNS9zdW40LXNvbGFyaXMvNS4wMDMvQ09SRQotdW5peCZndDsgbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28KLXVuaXggJmd0OyBwZXJsNS4wMDMKLXVzZSBleGFtcGxlOwotcHJpbnQgZXhhbXBsZTo6ZmFjdCg0KSwgIlxuIjsKLXByaW50IGV4YW1wbGU6Om15X21vZCgyMyw3KSwgIlxuIjsKLXByaW50ICRleGFtcGxlOjpNeV92YXJpYWJsZSArIDQuNSwgIlxuIjsKLSZsdDtjdHJsLWQmZ3Q7Ci0yNAotMgotNy41Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU9mIGNvdXJzZSwgdGhlcmUgYXJlIHNvbWUgcmVzdHJpY3Rpb25zIGFzIFNXSUcgaXMgbm90IGEgZnVsbCBDL0MrKyBwYXJzZXIuIElmIHlvdSBtYWtlIGhlYXZ5IHVzZSBvZiB0aGUgQyBwcmVwcm9jZXNzb3IsIGNvbXBsaWNhdGVkIGRlY2xhcmF0aW9ucywgb3IgQysrLCBnaXZpbmcgU1dJRyBhIHJhdyBzb3VyY2UgZmlsZSBwcm9iYWJseSBpc24ndCBnb2luZyB0byB3b3JrIHZlcnkgd2VsbCAoaW4gdGhpcyBjYXNlLCB5b3Ugd291bGQgcHJvYmFibHkgd2FudCB0byB1c2UgYSBzZXBhcmF0ZSBpbnRlcmZhY2UgZmlsZSkuIDxwPgotPHA+Ci1TV0lHIGFsc28gc3VwcG9ydHMgYSBsaW1pdGVkIGZvcm0gb2YgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIElmIHdlIHdhbnRlZCB0byBtYWtlIGEgY29tYmluYXRpb24gU1dJRy9DIGhlYWRlciBmaWxlLCB3ZSBtaWdodCBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vKiBGaWxlIDogZXhhbXBsZS5oICovCi0jaWZkZWYgU1dJRwotJW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSB0Y2xzaC5pCi0jZW5kaWYKLWV4dGVybiBkb3VibGUgTXlfdmFyaWFibGU7Ci1leHRlcm4gaW50ICAgIGZhY3QoaW50KTsKLWV4dGVybiBpbnQgICAgbXlfbW9kKGludCBuLCBpbnQgbSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4xOCI+PC9hPjxoMz4gRG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uPC9oMz4KLUluIGFkZGl0aW9uIHRvIHByb2R1Y2luZyBhbiBpbnRlcmZhY2UsIFNXSUcgYWxzbyBwcm9kdWNlcyBkb2N1bWVudGF0aW9uLiBGb3Igb3VyIHNpbXBsZSBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlIG1heSBsb29rIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotZXhhbXBsZV93cmFwLmMKLQotWyBNb2R1bGUgOiBleGFtcGxlLCBQYWNrYWdlIDogZXhhbXBsZSBdCi0KLSRNeV92YXJpYWJsZQotICAgICAgICBbIEdsb2JhbCA6IGRvdWJsZSBNeV92YXJpYWJsZSBdCi0KLWZhY3Qobik7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLQotbXlfbW9kKG4sbSk7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLQotZ2V0X3RpbWUoKTsKLSAgICAgICAgWyByZXR1cm5zIGNoYXIgKiBdCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQyBjb21tZW50cyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgZGVzY3JpcHRpb25zLiBTV0lHIGNhbiBldmVuIGdyYWIgdGhlc2Ugb3V0IG9mIEMgc291cmNlIGZpbGVzIGluIGEgdmFyaWV0eSBvZiB3YXlzLiBGb3IgZXhhbXBsZSwgaWYgd2UgcHJvY2VzcyA8dHQ+ZXhhbXBsZS5jPC90dD4gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcGVybDUgLVNiZWZvcmUgLW1vZHVsZSBleGFtcGxlIGV4YW1wbGUuYwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSB3aWxsIGdldCBhIGRvY3VtZW50YXRpb24gZmlsZSB0aGF0IGxvb2tzIGxpa2UgdGhpcyAod2l0aCBvdXIgQyBjb21tZW50cyBhZGRlZCkgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWV4YW1wbGVfd3JhcC5jCi0KLVsgTW9kdWxlIDogZXhhbXBsZSwgUGFja2FnZSA6IGV4YW1wbGUgXQotCi0KLSRNeV92YXJpYWJsZQotICAgICAgICBbIEdsb2JhbCA6IGRvdWJsZSBNeV92YXJpYWJsZSBdCi0KLWZhY3Qobik7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgQ29tcHV0ZSBmYWN0b3JpYWwgb2YgbiAKLQotbXlfbW9kKG4sbSk7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgQ29tcHV0ZSBuIG1vZCBtIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTkiPjwvYT48aDM+IEJ1aWxkaW5nIGxpYnJhcmllcyBhbmQgbW9kdWxlczwvaDM+Ci1JbiBhZGRpdGlvbiB0byBnZW5lcmF0aW5nIHdyYXBwZXIgY29kZSwgU1dJRyBwcm92aWRlcyBleHRlbnNpdmUgc3VwcG9ydCBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMgYW5kIGJ1aWxkaW5nIGludGVyZmFjZSBsaWJyYXJpZXMuIEZvciBleGFtcGxlLCBvdXIgPHR0PmV4YW1wbGUuaTwvdHQ+IGZpbGUsIGNvdWxkIGJlIHVzZWQgaW4gYW5vdGhlciBpbnRlcmZhY2UgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBmb28KLSVpbmNsdWRlIGV4YW1wbGUuaSAgICAgICAgICAgICAvLyBHZXQgZGVmaW5pdGlvbnMgZnJvbSBleGFtcGxlLmkKLQotLi4uIE5vdyBtb3JlIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gYSBsYXJnZSBzeXN0ZW0sIGFuIGludGVyZmFjZSBtaWdodCBiZSBidWlsdCBmcm9tIGEgdmFyaWV0eSBvZiBwaWVjZXMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHBhY2thZ2UKLQotJWluY2x1ZGUgbmV0d29yay5pCi0laW5jbHVkZSBmaWxlLmkKLSVpbmNsdWRlIGdyYXBoaWNzLmkKLSVpbmNsdWRlIG9iamVjdHMuaQotJWluY2x1ZGUgc2ltdWxhdGlvbi5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNXSUcgY29tZXMgd2l0aCBhIGxpYnJhcnkgb2YgZXhpc3RpbmcgZnVuY3Rpb25zIGtub3duIGFzIHRoZSBTV0lHIGxpYnJhcnkuICBUaGUgbGlicmFyeSBjb250YWlucyBhIG1peCBvZiBsYW5ndWFnZSBpbmRlcGVuZGVudCBhbmQgbGFuZ3VhZ2UgZGVwZW5kZW50IGZ1bmN0aW9uYWxpdHkuICAgRm9yIGV4YW1wbGUsIHRoZSBmaWxlIGA8dHQ+YXJyYXkuaTwvdHQ+JyBwcm92aWRlcyBhY2Nlc3MgdG8gQyBhcnJheXMgd2hpbGUgdGhlIGZpbGUgYDx0dD53aXNoLmk8L3R0PicgaW5jbHVkZXMgc3BlY2lhbGl6ZWQgY29kZSBmb3IgcmVidWlsZGluZyB0aGUgVGNsIHdpc2ggaW50ZXJwcmV0ZXIuICAgVXNpbmcgdGhlIGxpYnJhcnksIHlvdSBjYW4gdXNlIGV4aXN0aW5nIG1vZHVsZXMgdG8gYnVpbGQgdXAgeW91ciBvd24gcGVyc29uYWxpemVkIGVudmlyb25tZW50IGZvciBidWlsZGluZyBpbnRlcmZhY2VzLiAgIElmIGNoYW5nZXMgYXJlIG1hZGUgdG8gYW55IG9mIHRoZSBjb21wb25lbnRzLCB0aGV5IHdpbGwgYXBwZWFyIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSBTV0lHIGlzIHJ1bi4gPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gQyBzeW50YXgsIGJ1dCBub3QgYSBDIGNvbXBpbGVyPC9oMj4KLVNXSUcgdXNlcyBBTlNJIEMgc3ludGF4LCBidXQgaXMgbm90IGEgZnVsbCBBTlNJIEMgY29tcGlsZXIuIEJ5IHVzaW5nIEMgc3ludGF4LCBJIGhvcGUgdG8gbWFrZSBTV0lHIGVhc3kgdG8gdXNlIHdpdGggbW9zdCBDIHByb2dyYW1zLCBlYXN5IHRvIGxlYXJuLCBhbmQgZWFzeSB0byByZW1lbWJlci4gT3RoZXIgdG9vbHMgdGVuZCB0byB1c2UgYSBwcmVjaXNlIGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlLCBidXQgSSBwZXJzb25hbGx5IGZpbmQgdGhpcyBhcHByb2FjaCB0byBiZSBwYWluZnVsLiBXaGVuIEkgd2FudCB0byBidWlsZCBhbiBpbnRlcmZhY2UgdG8gYSBjb2xsZWN0aW9uIG9mIHNldmVyYWwgaHVuZHJlZCBDIGZ1bmN0aW9ucywgSSBkb24ndCBuZWNlc3NhcmlseSB3YW50IHRvIHdyaXRlIGEgc3BlY2lhbCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgZWFjaCBvbmUuIE5vciBkbyBJIHdhbnQgdG8gaGF2ZSB0byBnbyBkaWcgdXAgdGhlIG1hbnVhbCBiZWNhdXNlIEkgY2FuJ3QgcmVtZW1iZXIgdGhlIHN5bnRheC48cD4KLTxwPgotT24gdGhlIG90aGVyIGhhbmQsIHVzaW5nIEMgc3ludGF4IGNhbiBiZSBhbWJpZ3VvdXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBmb28oZG91YmxlICphKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2UgZG9uJ3QgcmVhbGx5IGtub3cgaWYgPHR0PmE8L3R0PiBpcyBhbiBhcnJheSBvZiBzb21lIGZpeGVkIHNpemUsIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGJsb2NrIG9mIG1lbW9yeSwgYSBzaW5nbGUgdmFsdWUsIG9yIGFuIG91dHB1dCB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uIEZvciB0aGUgbW9zdCBwYXJ0LCBTV0lHIHRha2VzIGEgbGl0ZXJhbCBhcHByb2FjaCAoPHR0PmE8L3R0PiBpcyBvYnZpb3VzbHkgYSA8dHQ+ZG91YmxlICo8L3R0PikgYW5kIGxlYXZlcyBpdCB1cCB0byB0aGUgdXNlciB0byB1c2UgdGhlIGZ1bmN0aW9uIGluIGEgY29ycmVjdCBtYW5uZXIuICBGb3J0dW5hdGVseSwgdGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBoZWxwIFNXSUcgb3V0IHVzaW5nIGFkZGl0aW9uYWwgZGlyZWN0aXZlcyBhbmQgImhlbHBlciIgZnVuY3Rpb25zLiBUaHVzLCB0aGUgaW5wdXQgdG8gU1dJRyBpcyBvZnRlbiBhIG1peCBvZiBDIGRlY2xhcmF0aW9ucywgc3BlY2lhbCBkaXJlY3RpdmVzIGFuZCBoaW50cy4gICBMaWtlIFBlcmwgcHJvZ3JhbW1pbmcsIHRoZXJlIGlzIGFsbW9zdCBhbHdheXMgbW9yZSB0aGFuIG9uZSB3YXkgdG8gZG8gYWxtb3N0IGFueXRoaW5nLjxwPgotPHA+Ci1TV0lHIGRvZXMgbm90IGN1cnJlbnRseSBwYXJzZSBldmVyeSBjb25jZWl2YWJsZSB0eXBlIG9mIEMgZGVjbGFyYXRpb24gdGhhdCBpdCBtaWdodCBlbmNvdW50ZXIgaW4gYSBDL0MrKyBmaWxlLiBNYW55IHRoaW5ncyBtYXkgYmUgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gaW50ZWdyYXRlIHdpdGggYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKEMrKyB0ZW1wbGF0ZXMgZm9yIGV4YW1wbGUpLiBUaHVzLCBTV0lHIG1heSBub3QgcmVjb2duaXplIGFkdmFuY2VkIEMvQysrIGNvbnN0cnVjdHMuICBJIG1ha2Ugbm8gYXBvbG9naWVzIGZvciB0aGlzLS1TV0lHIHdhcyBkZXNpZ25lZCB0byBhY2Nlc3MgQywgYnV0IHdhcyBuZXZlciBpbnRlbmRlZCB0byBtYWdpY2FsbHkgdHVybiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGludG8gc29tZSBzb3J0IG9mIGJpemFycmUgQysrIGludGVycHJldGVyLiAgIE9mIGNvdXJzZSwgU1dJRydzIHBhcnNlciBpcyBhbHdheXMgYmVpbmcgaW1wcm92ZWQgc28gY3VycmVudGx5IHVuc3VwcG9ydGVkIGZlYXR1cmVzIG1heSBiZSBzdXBwb3J0ZWQgaW4gbGF0ZXIgcmVsZWFzZXMuPHA+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gTm9uLWludHJ1c2l2ZSBpbnRlcmZhY2UgYnVpbGRpbmc8L2gyPgotV2hlbiB1c2VkIGFzIEkgaW50ZW5kZWQsIFNXSUcgcmVxdWlyZXMgbWluaW1hbCBtb2RpZmljYXRpb24gdG8gZXhpc3RpbmcgQyBjb2RlLiBUaGlzIG1ha2VzIFNXSUcgZXh0cmVtZWx5IGVhc3kgdG8gdXNlIHdpdGggZXhpc3RpbmcgcGFja2FnZXMsIGJ1dCBhbHNvIHByb21vdGVzIHNvZnR3YXJlIHJldXNlIGFuZCBtb2R1bGFyaXR5LiBCeSBtYWtpbmcgdGhlIEMgY29kZSBpbmRlcGVuZGVudCBvZiB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UsIHlvdSBjYW4gY2hhbmdlIHRoZSBpbnRlcmZhY2UgYW5kIHJldXNlIHRoZSBjb2RlIGluIG90aGVyIGFwcGxpY2F0aW9ucy4gSW4gYSBzaW1pbGFyIHNwaXJpdCwgSSBkb24ndCBiZWxpZXZlIHRoYXQgdGhlcmUgaXMgYW55IG9uZSAiYmVzdCIgc2NyaXB0aW5nIGxhbmd1YWdlLS11c2Ugd2hpY2hldmVyIG9uZSB5b3UgbGlrZSAodGhleSdyZSBhbGwgcHJldHR5IGdvb2QpLiBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHdoeSBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gY291bGRuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcyB0byBzZXJ2ZSBkaWZmZXJlbnQgbmVlZHMgKG9yIHRvIGhhdmUgbm8gc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZSBhdCBhbGwpLjxwPgotPGEgbmFtZT0ibjgiPjwvYT48aDI+IEhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2gyPgotU1dJRyBpcyBkZXNpZ25lZCB0byBwcm9kdWNlIHdvcmtpbmcgY29kZSB0aGF0IG5lZWRzIG5vIGhhbmQtbW9kaWZpY2F0aW9uIChpbiBmYWN0LCBpZiB5b3UgbG9vayBhdCB0aGUgb3V0cHV0LCB5b3UgcHJvYmFibHkgd29uJ3Qgd2FudCB0byBtb2RpZnkgaXQpLiBJZGVhbGx5LCBTV0lHIHNob3VsZCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkgaW5zaWRlIGEgTWFrZWZpbGUganVzdCBhcyBvbmUgd291bGQgY2FsbCB0aGUgQyBjb21waWxlci4gWW91IHNob3VsZCB0aGluayBvZiB5b3VyIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UgYmVpbmcgZGVmaW5lZCBlbnRpcmVseSBieSB0aGUgaW5wdXQgdG8gU1dJRywgbm90IHRoZSByZXN1bHRpbmcgb3V0cHV0IGZpbGUuIFdoaWxlIHRoaXMgYXBwcm9hY2ggbWF5IGxpbWl0IGZsZXhpYmlsaXR5IGZvciBoYXJkLWNvcmUgaGFja2VycywgaXQgYWxsb3dzIG90aGVycyB0byBmb3JnZXQgYWJvdXQgdGhlIGxvdy1sZXZlbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBUaGlzIGlzIG15IGdvYWwuPHA+Ci08YSBuYW1lPSJuOSI+PC9hPjxoMj4gRXZlbnQgZHJpdmVuIEMgcHJvZ3JhbW1pbmc8L2gyPgotQnkgYWRkaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZSB0byBhIHByb2dyYW0sIFNXSUcgZW5jb3VyYWdlcyBhbiBldmVudC1kcml2ZW4gc3R5bGUgb2YgcHJvZ3JhbW1pbmcgKGFsdGhvdWdoIGl0IG1heSBub3QgYmUgaW1tZWRpYXRlbHkgb2J2aW91cykuIEFuIGV2ZW50IGRyaXZlbiBwcm9ncmFtIGJhc2ljYWxseSBjb25zaXN0cyBvZiBhIGxhcmdlLWNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIChjYWxsZWQgY2FsbGJhY2sgZnVuY3Rpb25zKSwgYW5kIGFuIGluZmluaXRlIGxvb3AgdGhhdCBqdXN0IHNpdHMgYW5kIHdhaXRzIGZvciB0aGUgdXNlciB0byBkbyBzb21ldGhpbmcuIFdoZW4gdGhlIHVzZXIgZG9lcyBzb21ldGhpbmcgbGlrZSB0eXBlIGEgY29tbWFuZCwgaGl0IGEga2V5LCBvciBtb3ZlIHRoZSBtb3VzZSB0aGUgcHJvZ3JhbSB3aWxsIGNhbGwgYSBmdW5jdGlvbiB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbi0tdGhpcyBpcyBhbiBldmVudC4gT2YgY291cnNlLCB1bmxlc3MgeW91J3ZlIGJlZW4gbGl2aW5nIGluIGNhdmUgZm9yIHRoZSBsYXN0IDIwIHllYXJzLCB5b3UndmUgdXNlZCB0aGlzIGtpbmQgb2YgYXBwcm9hY2ggd2hlbiBydW5uaW5nIGFueSBzb3J0IG9mIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZS48cD4KLTxwPgotV2hpbGUgeW91IG1heSBub3QgYmUgdXNpbmcgU1dJRyB0byBkZXZlbG9wIGEgR1VJLCB0aGUgdW5kZXJseWluZyBjb25jZXB0IGlzIHRoZSBzYW1lLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlIGFjdHMgYXMgYW4gZXZlbnQtbG9vcCB3YWl0aW5nIGZvciB5b3UgdG8gaXNzdWUgY29tbWFuZHMuIFVubGlrZSBhIHRyYWRpdGlvbmFsIEMgYXBwbGljYXRpb24gKHRoYXQgbWF5IHVzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyksIHRoZXJlIGlzIG5vIGxvbmdlciBhIGZpeGVkIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMuIEZ1bmN0aW9ucyBtYXkgYmUgaXNzdWVkIGluIGFueSBvcmRlciBhbmQgYXQgYW55IHRpbWUuIE9mIGNvdXJzZSwgdGhpcyBmbGV4aWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudCEgPHA+Ci08cD4KLUhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kIHdoZW4gZGV2ZWxvcGluZyBhbiBhcHBsaWNhdGlvbiB3aXRoIFNXSUcgOjxwPgotPHA+Ci08dWw+Ci08bGk+RnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYW5kIGluIGFueSBvcmRlci4gSXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIGZvciBmdW5jdGlvbnMgdG8gY2hlY2sgdGhlaXIgYXJndW1lbnRzIGFuZCBpbnRlcm5hbCBzdGF0ZSB0byBzZWUgaWYgaXQncyBsZWdhbCB0byBwcm9jZWVkIChOb3QgZG9pbmcgc28gdXN1YWxseSByZXN1bHRzIGluIG15c3RlcmlvdXMgY3Jhc2hlcyBsYXRlciBvbikuCi08bGk+Q29kZSBzaG91bGQgYmUgc3RydWN0dXJlZCBhcyBhIGNvbGxlY3Rpb24gb2YgaW5kZXBlbmRlbnQgbW9kdWxlcywgbm90IGEgaHVnZSBtZXNzIG9mIGludGVycmVsYXRlZCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyAoaWUuIHNwYWdoZXR0aSBjb2RlKS4KLTxsaT5HbG9iYWwgdmFyaWFibGVzIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4KLTxsaT5DYXJlZnVsIGF0dGVudGlvbiB0byB0aGUgbmFtaW5nIG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIG1heSBiZSByZXF1aXJlZCB0byBhdm9pZCBuYW1lc3BhY2UgY29uZmxpY3RzIHdoZW4gY29tYmluaW5nIHBhY2thZ2VzLgotPC91bD4KLTxwPgotV2hpbGUgaXQgbWF5IGJlIGhhcmQgKG9yIGltcG9zc2libGUpIHRvIGFkZHJlc3MgYWxsIHRoZXNlIHByb2JsZW1zIGluIGEgbGVnYWN5IGNvZGUsIEkgYmVsaWV2ZSB0aGF0IHVzaW5nIFNXSUcgZW5jb3VyYWdlcyBhbGwgb2YgdGhlIGFib3ZlIHF1YWxpdGllcyB3aGVuIGRldmVsb3BpbmcgbmV3IGFwcGxpY2F0aW9ucy4gVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBpcyBtb3JlIHJlbGlhYmxlLCBtb3JlIG1vZHVsYXIsIGFuZCBlYXNpZXIgdG8gaW50ZWdyYXRlIGludG8gbGFyZ2VyIHBhY2thZ2VzLiAgQnkgcHJvdmlkaW5nIGEgbm9uLWludHJ1c2l2ZSwgZWFzeSB0byB1c2UgdG9vbCwgaXQgaXMgcG9zc2libGUgdG8gZGV2ZWxvcCBoaWdobHkgcmVsaWFibGUgZXZlbnQtZHJpdmVuIGNvZGUgZnJvbSB0aGUgc3RhcnQtLW5vdCBhcyBhIGhhY2sgdG8gYmUgYWRkZWQgbGF0ZXIuIEFzIGEgZmluYWwgc2FsZXMgcGl0Y2gsIGluIHRoZSBpbml0aWFsIGFwcGxpY2F0aW9uIGZvciB3aGljaCBTV0lHIHdhcyBkZXZlbG9wZWQsIGNvZGUgcmVsaWFiaWxpdHkgYW5kIGZsZXhpYmlsaXR5IGhhcyBpbmNyZWFzZWQgc3Vic3RhbnRpYWxseSB3aGlsZSBjb2RlIHNpemUgaGFzIGRlY3JlYXNlZCBieSBtb3JlIHRoYW4gMjUlLiBJIGJlbGlldmUgdGhpcyBpcyBhIGdvb2QgdGhpbmcuPHA+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IEF1dG9tYXRpYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb248L2gyPgotU1dJRyBtYWtlcyBpdCB2ZXJ5IGVhc3kgdG8gYnVpbGQgbGFyZ2UgaW50ZXJhY3RpdmUgQyBwcm9ncmFtcywgYnV0IGl0IGNhbiBzb21ldGltZXMgYmUgaGFyZCB0byByZW1lbWJlciB3aGF0IEMgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGhvdyB0aGV5IGFyZSBjYWxsZWQgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtLCBTV0lHIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGEgZG9jdW1lbnRhdGlvbiBmaWxlIGluIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmb3JtYXRzLiBDIGNvbW1lbnRzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBkZXNjcmlwdGlvbnMgb2YgZWFjaCBmdW5jdGlvbiwgYW5kIGRvY3VtZW50YXRpb24gY2FuIGJlIGdyb3VwZWQgaW50byBhIGhpZXJhcmNoeSBvZiBzZWN0aW9ucyBhbmQgc3Vic2VjdGlvbnMuIFRoZSBkb2N1bWVudGF0aW9uIGZpbGUgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIHJlYXNvbmFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFdoaWxlIGl0J3Mgbm8gY29tcGV0aXRpb24gZm9yIGEgZnVsbC1ibG93biBDIGNvZGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IsIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBjYW4gZG8gYSByZWFzb25hYmxlIGpvYiBvZiBkb2N1bWVudGluZyBhbiBpbnRlcmZhY2UuPHA+Ci08YSBuYW1lPSJuMTEiPjwvYT48aDI+IFN1bW1hcnk8L2gyPgotQXQgdGhpcyBwb2ludCwgeW91IGtub3cgYWJvdXQgOTUlIG9mIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyB0byBzdGFydCB1c2luZyBTV0lHLiBGaXJzdCwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZCB1c2luZyBBTlNJIEMsIEMrKywgb3IgT2JqZWN0aXZlLUMgc3ludGF4LiBUaGVzZSBtYXkgYXBwZWFyIGluIGEgc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGUgb3IgeW91IGNhbiB1c2UgYSBDIHNvdXJjZSBmaWxlIChpZiBpdCBpcyBzdWZmaWNpZW50bHkgY2xlYW4pLiBTV0lHIHJlcXVpcmVzIG5vIG1vZGlmaWNhdGlvbnMgdG8gZXhpc3RpbmcgQyBjb2RlIHNvIGl0J3MgZWFzeSB0byBnZXQgc3RhcnRlZC4gVG8gYnVpbGQgYSBtb2R1bGUsIHVzZSB0aGUgPHR0PnN3aWc8L3R0PiBjb21tYW5kIHdpdGggYW4gYXBwcm9wcmlhdGUgdGFyZ2V0IGxhbmd1YWdlIG9wdGlvbi4gVGhpcyBnZW5lcmF0ZXMgYSBDIGZpbGUgdGhhdCB5b3UgbmVlZCB0byBjb21waWxlIHdpdGggdGhlIHJlc3Qgb2YgeW91ciBjb2RlIGFuZCB5b3UncmUgcmVhZHkgdG8gZ28uIDxwPgotPHA+Ci1JIGRvbid0IGNvbnNpZGVyIHRoZXJlIHRvIGJlIGEgInJpZ2h0IiBvciAid3JvbmciIHdheSB0byB1c2UgU1dJRywgYWx0aG91Z2ggSSBwZXJzb25hbGx5IHVzZSBzZXBhcmF0ZSBpbnRlcmZhY2UgZmlsZXMgZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zIDo8cD4KLTxwPgotPHVsPgotPGxpPkl0IGhlbHBzIGtlZXAgbWUgb3JnYW5pemVkLgotPGxpPkl0J3MgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHdyYXAgZXZlcnkgc2luZ2xlIEMgZnVuY3Rpb24gaW4gYSBwcm9ncmFtLgotPGxpPlNXSUcgcHJvdmlkZXMgYSBudW1iZXIgb2YgZGlyZWN0aXZlcyB0aGF0IEkgdGVuZCB0byB1c2UgYWxvdC4KLTxsaT5IYXZpbmcgYSBzcGVjaWFsIGludGVyZmFjZSBmaWxlIG1ha2VzIGl0IGNsZWFyIHdoZXJlIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlIGlzIGRlZmluZWQuIElmIHlvdSBkZWNpZGUgdG8gY2hhbmdlIHNvbWV0aGluZyBpbiB0aGUgaW50ZXJmYWNlLCBpdCdzIGVhc3kgdG8gdHJhY2sgZG93biBpZiB5b3UgaGF2ZSBzcGVjaWFsIGZpbGUuIAotPC91bD4KLTxwPgotT2YgY291cnNlLCB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuIDxwPgotPGEgbmFtZT0ibjEyIj48L2E+PGgyPiBTV0lHIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2g8L2gyPgotU1dJRyBoYXMgYmVlbiBwcmltYXJpbHkgZGV2ZWxvcGVkIGFuZCBkZXNpZ25lZCB0byB3b3JrIHdpdGggVW5peC1iYXNlZCBhcHBsaWNhdGlvbnMuIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IFNXSUcgYXJlIGF2YWlsYWJsZSBvbiBhIHZhcmlldHkgb2Ygb3RoZXIgcGxhdGZvcm1zIGluY2x1ZGluZyBXaW5kb3dzIDk1L05UIGFuZCBNYWNpbnRvc2guIFNXSUcgZ2VuZXJhdGVkIGNvZGUgaXMgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCB0aGVzZSB2ZXJzaW9ucyAoYW5kIFNXSUcgaXRzZWxmIGNhbiBub3cgcnVuIG9uIHRoZXNlIHBsYXRmb3JtcykuIDxwPgotPGEgbmFtZT0ibjIwIj48L2E+PGgzPiBTV0lHIG9uIFdpbmRvd3MgOTUvTlQ8L2gzPgotVGhlIFdpbmRvd3MgOTUvTlQgcG9ydCBvZiBTV0lHIChwcm92aWRlZCBieSBLZXZpbiBCdXRsZXIpLCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCB0cmFuc2xhdGlvbiBvZiB0aGUgVW5peCB2ZXJzaW9uLiBBdCB0aGlzIHRpbWUgaXQgaXMgb25seSBrbm93biB0byB3b3JrIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgNC54LCBidXQgdGhlcmUgaXMgbm90aGluZyB0byBwcmV2ZW50IGl0cyB1c2Ugd2l0aCBvdGhlciBjb21waWxlcnMgKGF0IGxlYXN0IG5vdCB0aGF0IEknbSBhd2FyZSBvZikuIFNXSUcgc2hvdWxkIGJlIGludm9rZWQgZnJvbSB0aGUgTVMtRE9TIHByb21wdCBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciBhcyBpbiBVbml4LiBTV0lHIGNhbiBhbHNvIGJlIHVzZWQgaW4gTk1BS0UgYnVpbGQgZmlsZXMgYW5kIGFkZGVkIHRvIFZpc3VhbCBDKysgcHJvamVjdHMgdW5kZXIgdGhlIGN1c3RvbSBidWlsZCBzZXR0aW5nLiBBcyBvZiB0aGlzIHdyaXRpbmcsIFNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFdpbmRvd3MgdmVyc2lvbnMgb2YgVGNsL1RrLCBQeXRob24sIGFuZCBQZXJsIChpbmNsdWRpbmcgdGhlIEFjdGl2ZVdhcmUgUGVybCBmb3IgV2luMzIgcG9ydCkuIFNXSUcgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiBsb25nIGZpbGVuYW1lcywgc28gaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgU1dJRyBjb21waWxlciB3aWxsIG9wZXJhdGUgY29ycmVjdGx5IHVuZGVyIFdpbmRvd3MgMy4xIG9yIERPUyAodGhlIHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgYnkgU1dJRyBtYXkgY29tcGlsZSBob3dldmVyKS48cD4KLTxhIG5hbWU9Im4yMSI+PC9hPjxoMz4gU1dJRyBvbiB0aGUgUG93ZXIgTWFjaW50b3NoPC9oMz4KLUEgTWFjaW50b3NoIHBvcnQgb2YgU1dJRyBpcyBhbHNvIGF2YWlsYWJsZSwgYnV0IGlzIGhpZ2hseSBleHBlcmltZW50YWwgYXQgdGhpcyB0aW1lLiBJdCBvbmx5IHdvcmtzIG9uIFBvd2VyUEMgYmFzZWQgTWFjaW50b3NoIHN5c3RlbXMgcnVubmluZyBTeXN0ZW0gNyBvciBsYXRlci4gTW9kdWxlcyBjYW4gYmUgY29tcGlsZWQgd2l0aCB0aGUgTWV0cm93ZXJrcyBDb2RlIFdhcnJpb3IgY29tcGlsZXIsIGJ1dCBzdXBwb3J0IGZvciBvdGhlciBjb21waWxlcnMgaXMgdW5rbm93bi4gRHVlIHRvIHRoZSBsYWNrIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uIHRoZSBNYWMsIFNXSUcgaGFzIGJlZW4gcGFja2FnZWQgaW4gYSBUY2wvVGsgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHZhcmlvdXMgc2V0dGluZ3MgYW5kIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGJlIHNwZWNpZmllZCB3aXRoIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlLiBVbmRlcm5lYXRoIHRoZSBob29kLCBTV0lHIGlzIGlkZW50aWNhbCB0byB0aGUgVW5peC9XaW5kb3dzIHZlcnNpb24uIEl0IHJlY29nbml6ZXMgdGhlIHNhbWUgc2V0IG9mIG9wdGlvbnMgYW5kIGdlbmVyYXRlcyBpZGVudGljYWwgY29kZS4gQW55IFNXSUcgY29tbWFuZCBsaW5lIG9wdGlvbiBsaXN0ZWQgaW4gdGhpcyBtYW51YWwgY2FuIGJlIGdpdmVuIHRvIHRoZSBNYWMgdmVyc2lvbiB1bmRlciAiQWR2YW5jZWQgT3B0aW9ucyIgc2hvd24gaW4gdGhlIGZpZ3VyZS4gQXQgdGhpcyB3cml0aW5nLCBTV0lHIGlzIG9ubHkga25vd24gdG8gc3VwcG9ydCBNYWMgdmVyc2lvbnMgb2YgVGNsL1RrLiBXb3JrIG9uIE1hY2ludG9zaCB2ZXJzaW9ucyBvZiBQeXRob24gYW5kIFBlcmwgaXMgdW5kZXJ3YXkuPHA+Ci08cD5DbGljayA8YSBocmVmPSJjaDEuMi5wbmciPmhlcmU8L2E+IHRvIHNlZSBhIE1hY2ludG9zaCBzY3JlZW4gc2hvdC48cD4KLTxwPgotPHA+Ci08YSBuYW1lPSJuMjIiPjwvYT48aDM+IENyb3NzIHBsYXRmb3JtIHdvZXM8L2gzPgotV2hpbGUgU1dJRyBhbmQgdmFyaW91cyBmcmVlbHkgYXZhaWxhYmxlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXJlIHN1cHBvcnRlZCBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCBkZXZlbG9waW5nIGNyb3NzIHBsYXRmb3JtIGFwcGxpY2F0aW9ucyB3aXRoIHRoZXNlIHRvb2xzIGlzIHN0aWxsIGltbWF0dXJlIGFuZCBmaWxsZWQgd2l0aCBwaXRmYWxscy4gSW4gZmFjdCwgaXQncyBwcm9iYWJseSBvbmx5IHJlY29tbWVuZGVkIGZvciB0cnVlIG1hc29jaGlzdHMuIERlc3BpdGUgdGhpcywgaXQncyBpbnRlcmVzdGluZyB0byB0aGluayBhYm91dCB1c2luZyBmcmVlbHkgYXZhaWxhYmxlIHRvb2xzIHRvIHByb3ZpZGUgY29tbW9uIGludGVyZmFjZXMgdG8gQy9DKysgY29kZS4gSSBiZWxpZXZlIHRoYXQgU1dJRyBtYXkgaGVscCwgYnV0IGl0IGlzIGJ5IG5vIG1lYW5zIGEgY3Jvc3MtcGxhdGZvcm0gc29sdXRpb24gYnkgaXRzZWxmLiA8cD4KLTxhIG5hbWU9Im4yMyI+PC9hPjxoMz4gSG93IHRvIHN1cnZpdmUgdGhpcyBtYW51YWw8L2gzPgotVGhpcyBtYW51YWwgd2FzIHdyaXR0ZW4gdG8gc3VwcG9ydCB0aGUgVW5peCB2ZXJzaW9uIG9mIFNXSUcuIEhvd2V2ZXIsIGFsbCBvZiB0aGUgbWFpbiBjb25jZXB0cyBhbmQgdXNhZ2Ugb2YgU1dJRyBhbHNvIGFwcGx5IHRvIHRoZSBXaW5kb3dzIGFuZCBNYWNpbnRvc2ggdmVyc2lvbnMuIFlvdSBzaG91bGQgYmUgZm9yZXdhcm5lZCB0aGF0IG1vc3Qgb2YgdGhlIGV4YW1wbGVzIGFyZSBVbml4LWNlbnRyaWMgYW5kIG1heSBub3QgY29tcGlsZSBjb3JyZWN0bHkgb24gb3RoZXIgbWFjaGluZXMuIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIGV4YW1wbGVzIHByb3ZpZGVkIHdpdGggdGhlIFNXSUcgZGlzdHJpYnV0aW9uIGhhdmUgbm93IGJlZW4gdGVzdGVkIHVuZGVyIGJvdGggVW5peCBhbmQgV2luZG93cy1OVC4gIFdoZW4gYXBwbGljYWJsZSwgSSB3aWxsIHRyeSB0byBwb2ludCBvdXQgaW5jb21wYXRpYmlsaXRpZXMsIGJ1dCBtYWtlIG5vIHByb21pc2VzLi4uIDxwPgotPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjUwIDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0xpYnJhcnkuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvTGlicmFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y3MTNmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvTGlicmFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+TXVsdGlwbGUgRmlsZXMgYW5kIHRoZSBTV0lHIExpYnJhcnk8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxhIG5hbWU9Im4wIj48L2E+PGgxPjQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnk8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5UaGUgJWluY2x1ZGUgZGlyZWN0aXZlPC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPlRoZSAlZXh0ZXJuIGRpcmVjdGl2ZTwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5UaGUgJWltcG9ydCBkaXJlY3RpdmU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+SW5jbHVkaW5nIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+VGhlIFNXSUcgbGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5MaWJyYXJ5IGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+Q3JlYXRpbmcgTGlicmFyeSBGaWxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI244Ij5Xb3JraW5nIHdpdGggbGlicmFyeSBmaWxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5TdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgbXVsdGlwbGUgbW9kdWxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMCI+TW9yZSBhYm91dCB0aGUgU1dJRyBsaWJyYXJ5PC9hPgotPC91bD4KLQotRm9yIGluY3JlYXNlZCBtb2R1bGFyaXR5IGFuZCBjb252ZW5pZW5jZSwgaXQgaXMgdXN1YWxseSB1c2VmdWwgdG8gYnJlYWsgYW4gaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gdXAgaW50byBtdWx0aXBsZSBmaWxlcyBvciBtb2R1bGVzLiBTV0lHIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGZlYXR1cmVzIGZvciBkb2luZyBqdXN0IHRoaXMuPHA+Ci08YSBuYW1lPSJuMSI+PC9hPjxoMj4gVGhlICVpbmNsdWRlIGRpcmVjdGl2ZTwvaDI+Ci1UaGUgPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlIGluc2VydHMgY29kZSBmcm9tIGFub3RoZXIgZmlsZSBpbnRvIHRoZSBjdXJyZW50IGludGVyZmFjZSBmaWxlLiBJdCBpcyBwcmltYXJpbHkgdXNlZCB0byBidWlsZCBhIHBhY2thZ2UgZnJvbSBhIGNvbGxlY3Rpb24gb2Ygc21hbGxlciBtb2R1bGVzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gRmlsZSA6IGludGVyZmFjZS5pCi0lbW9kdWxlIHBhY2thZ2UKLSVpbmNsdWRlIGVxdWF0aW9ucy5pCi0laW5jbHVkZSBncmFwaGljcy5pCi0laW5jbHVkZSBmaWxlaW8uaQotJWluY2x1ZGUgZGF0YS5pCi0laW5jbHVkZSBuZXR3b3JrLmMKLSVpbmNsdWRlICIuLi9JbmNsdWRlL3VzZXIuaCIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB1c2VkIGluIHRoaXMgbWFubmVyLCBTV0lHIHdpbGwgY3JlYXRlIGEgc2luZ2xlIHdyYXBwZXIgZmlsZSBjb250YWluaW5nIGFsbCBvZiB0aGUgaW5jbHVkZWQgZnVuY3Rpb25zLiA8cD4KLTxwPgotVGhlIDx0dD4laW5jbHVkZTwvdHQ+IGRpcmVjdGl2ZSBjYW4gcHJvY2VzcyBTV0lHIGludGVyZmFjZSBmaWxlcywgQyBoZWFkZXIgZmlsZXMsIGFuZCBDIHNvdXJjZSBmaWxlcyAocHJvdmlkZWQgdGhleSBhcmUgc3VmZmljaWVudGx5IGNsZWFuKS4gV2hlbiBwcm9jZXNzaW5nIGEgQyBzb3VyY2UgZmlsZSwgU1dJRyB3aWxsIGF1dG9tYXRpY2FsbHkgZGVjbGFyZSBhbGwgZnVuY3Rpb25zIGl0IGZpbmRzIGFzICJleHRlcm4iLiBUaHVzLCB1c2Ugb2YgYSBoZWFkZXIgZmlsZSBtYXkgbm90IGJlIHJlcXVpcmVkIGluIHRoaXMgY2FzZS48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBUaGUgJWV4dGVybiBkaXJlY3RpdmU8L2gyPgotVGhlIDx0dD4lZXh0ZXJuPC90dD4gZGlyZWN0aXZlIGlzIGxpa2UgPHR0PiVpbmNsdWRlPC90dD4gZXhjZXB0IHRoYXQgaXQgb25seSBzY2FucyBhIGZpbGUgZm9yIHR5cGUgYW5kIGNsYXNzIGluZm9ybWF0aW9uLiBJdCBkb2VzIG5vdCBhY3R1YWxseSB3cmFwIGFueXRoaW5nIGZvdW5kIGluIHRoZSBpbnB1dCBmaWxlLiBUaGlzIGRpcmVjdGl2ZSBpcyBwcmltYXJpbHkgdXNlZCBmb3IgaGFuZGxpbmcgY2xhc3MgaGllcmFyY2hpZXMgYW5kIG11bHRpcGxlIG1vZHVsZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGRlcml2ZWQKLSVleHRlcm4gYmFzZWNsYXNzLmggCQkJCS8vIEdyYWIgZGVmaW5pdGlvbiBvZiBhIGJhc2UgY2xhc3MKLQotLy8gTm93IHdyYXAgYSBkZXJpdmVkIGNsYXNzCi1jbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2VDbGFzcyB7Ci1wdWJsaWM6Ci0JLi4uCi19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGludGVyZmFjZSBmaWxlIHdvdWxkIGdyYWIgdGhlIG1lbWJlciBmdW5jdGlvbnMgYW5kIGRhdGEgZnJvbSBhIGJhc2VjbGFzcywgYnV0IG9ubHkgdXNlIHRoZW0gaW4gdGhlIHNwZWNpZmljYXRpb24gb2YgYSBkZXJpdmVkIGNsYXNzLiA8dHQ+JWV4dGVybjwvdHQ+IHByb2Nlc3Npbmcgb2YgZmlsZXMgaXMgYWxzbyB1c2VmdWwgZm9yIHBpY2tpbmcgdXAgY29tbW9uIHR5cGVkZWZzIGFuZCBkZWZpbml0aW9ucyBpbiBhIGxhcmdlIHBhY2thZ2UuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gVGhlICVpbXBvcnQgZGlyZWN0aXZlPC9oMj4KLVRoZSA8dHQ+JWV4dGVybjwvdHQ+IGRpcmVjdGl2ZSBpcyB1c2VkIHRvIGdhdGhlciBkZWNsYXJhdGlvbnMgZnJvbSBmaWxlcyB0aGF0IHlvdSBkb24ndCB3YW50IHRvIHdyYXAgaW50byBhbiBpbnRlcmZhY2UuIFVuZm9ybnVuYXRlbHksIHRoZSBleGFjdCByb2xlIG9mIHRoZXNlIGZpbGVzIGlzIG5vdCBhbHdheXMgY2xlYXIuIFRoZXkgY291bGQganVzdCBjb250YWluIGRlZmluaXRpb25zLCBvciB0aGV5IG1pZ2h0IGNvcnJlc3BvbmQgdG8gYW4gZW50cmlyZWx5IGRpZmZlcmVudCBTV0lHIG1vZHVsZS4gVGhlIDx0dD4laW1wb3J0PC90dD4gZGlyZWN0aXZlIGlzIGEgc3Ryb25nZXIgdmVyc2lvbiBvZiA8dHQ+JWV4dGVybjwvdHQ+IHRoYXQgdGVsbHMgU1dJRyB0aGF0IGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBmaWxlIGFyZSBpbmRlZWQsIGluIGFuIGVudGlyZWx5IGRpZmZlcmVudCBtb2R1bGUuIFRoaXMgaW5mb3JtYXRpb24gbWF5IGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdmFyaW91cyBsYW5ndWFnZSBtb2R1bGVzIHNpbmNlIHRoZXkgd2lsbCBoYXZlIGEgYmV0dGVyIGlkZWEgb2Ygd2hlcmUgdGhpbmdzIGFyZSBkZWZpbmVkIGFuZCBob3cgdGhleSBhcmUgdG8gYmUgdXNlZC48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBJbmNsdWRpbmcgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZTwvaDI+Ci1NdWNoIGxpa2UgdGhlIEMgb3IgQysrIGNvbXBpbGVyLCBTV0lHIGNhbiBhbHNvIGluY2x1ZGUgbGlicmFyeSBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIHRoZSA8dHQ+LWw8L3R0PiBvcHRpb24gYXMgc2hvd248cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSMgSW5jbHVkZSBhIGxpYnJhcnkgZmlsZSBhdCBjb21waWxlIHRpbWUKLSUgc3dpZyAtdGNsIC1sd2lzaC5pIGludGVyZmFjZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgYXBwcm9hY2ggdHVybnMgb3V0IHRvIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgYnVpbGRpbmcgZXh0ZW5zaW9ucyB0byBkaWZmZXJlbnQga2luZHMgb2YgbGFuZ3VhZ2VzLiBXaGVuIGxpYnJhcmllcyBhcmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLCB0aGV5IGFyZSBpbmNsdWRlZCBhZnRlciBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiA8dHQ+aW50ZXJmYWNlLmk8L3R0PiBoYXZlIGJlZW4gd3JhcHBlZC4gVGh1cywgdGhpcyBkb2VzIG5vdCB3b3JrIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIGluY2x1ZGUgY29tbW9uIGRlY2xhcmF0aW9ucywgdHlwZW1hcHMsIGFuZCBvdGhlciBmaWxlcy48cD4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBUaGUgU1dJRyBsaWJyYXJ5IDwvaDI+Ci1TV0lHIGNvbWVzIHdpdGggYSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHVwIG1vcmUgY29tcGxleCBpbnRlcmZhY2VzLiBBcyB5b3UgYnVpbGQgdXAgYSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMsIHlvdSBtYXkgYWxzbyBmaW5kIHlvdXJzZWxmIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgaW50ZXJmYWNlIGZpbGVzLiBXaGlsZSB0aGUgPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBmaWxlcywgaXQgYWxzbyBzZWFyY2hlcyB0aGUgZmlsZXMgaW5zdGFsbGVkIGluIHRoZSBTV0lHIGxpYnJhcnkgKHRoaW5rIG9mIHRoaXMgYXMgdGhlIFNXSUcgZXF1aXZhbGVudCBvZiB0aGUgQyBsaWJyYXJ5KS4gV2hlbiB5b3UgdXNlIDx0dD4laW5jbHVkZTwvdHQ+LCBTV0lHIHdpbGwgc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIDo8cD4KLTxwPgotPHVsPgotPGxpPlRoZSBjdXJyZW50IGRpcmVjdG9yeQotPGxpPkRpcmVjdG9yaWVzIHNwZWNpZmllZCB3aXRoIHRoZSAtSSBvcHRpb24KLTxsaT4uPHR0Pi9zd2lnX2xpYjwvdHQ+Ci08bGk+PHR0Pi91c3IvbG9jYWwvbGliL3N3aWdfbGliPC90dD4gKG9yIHdoZXJldmVyIHlvdSBpbnN0YWxsZWQgU1dJRykKLTwvdWw+Ci08cD4KLVdpdGhpbiBlYWNoIGRpcmVjdG9yeSwgeW91IGNhbiBhbHNvIGNyZWF0ZSBzdWJkaXJlY3RvcmllcyBmb3IgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UuIElmIGZvdW5kLCBTV0lHIHdpbGwgc2VhcmNoIHRoZXNlIGRpcmVjdG9yaWVzIGZpcnN0LCBhbGxvd2luZyB0aGUgY3JlYXRpb24gb2YgbGFuZ3VhZ2Utc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIGEgcGFydGljdWxhciBsaWJyYXJ5IGZpbGUuPHA+Ci08cD4KLVlvdSBjYW4gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBTV0lHIGxpYnJhcnkgYnkgc2V0dGluZyB0aGUgPHR0PlNXSUdfTElCPC90dD4gZW52aXJvbm1lbnQgdmFyaWFibGUuPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gTGlicmFyeSBleGFtcGxlPC9oMj4KLVRoZSBTV0lHIGxpYnJhcnkgaXMgcmVhbGx5IGEgcmVwb3NpdG9yeSBvZiAidXNlZnVsIG1vZHVsZXMiIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYmV0dGVyIGludGVyZmFjZXMuIFRvIHVzZSBhIGxpYnJhcnkgZmlsZSwgeW91IGNhbiBzaW1wbHkgdXNlIHRoZSA8dHQ+JWluY2x1ZGUgPC90dD5kaXJlY3RpdmUgd2l0aCB0aGUgbmFtZSBvZiBhIGxpYnJhcnkgZmlsZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi0laW5jbHVkZSBwb2ludGVyLmkgCQkJCS8vIEdyYWIgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5Ci0KLS8vIGErYiAtLSZndDsgYwotZXh0ZXJuIGRvdWJsZSBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGV4YW1wbGUsIHdlIGFyZSBpbmNsdWRpbmcgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5IHRoYXQgYWRkcyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBDIHBvaW50ZXJzLiBUaGVzZSBhZGRlZCBmdW5jdGlvbnMgYmVjb21lIHBhcnQgb2YgeW91ciBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBuZWVkZWQuIEZvciBleGFtcGxlLCB3ZSBjYW4gd3JpdGUgYSBUY2wgc2NyaXB0IGxpa2UgdGhpcyB0aGF0IGludm9sdmVzIGJvdGggdGhlIDx0dD5hZGQoKTwvdHQ+IGZ1bmN0aW9uIGFuZCB0d28gZnVuY3Rpb25zIGZyb20gdGhlIDx0dD5wb2ludGVyLmk8L3R0PiBsaWJyYXJ5IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zZXQgYyBbcHRyY3JlYXRlIGRvdWJsZSAwXSAgICA7IyBDcmVhdGUgYSBkb3VibGUgKiBmb3IgaG9sZGluZyB0aGUgcmVzdWx0Ci1hZGQgNCAzLjUgJGMgICAgICAgICAgICAgICAgICA7IyBDYWxsIG91ciBDIGZ1bmN0aW9uCi1wdXRzIFtwdHJ2YWx1ZSAkY10gICAgICAgICAgICA7IyBQcmludCBvdXQgdGhlIHJlc3VsdAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IENyZWF0aW5nIExpYnJhcnkgRmlsZXM8L2gyPgotSXQgaXMgZWFzeSB0byBjcmVhdGUgeW91ciBvd24gbGlicmFyeSBmaWxlcy4gVG8gaWxsdXN0cmF0ZSB0aGUgcHJvY2Vzcywgd2UgY29uc2lkZXIgdHdvIGRpZmZlcmVudCBsaWJyYXJ5IGZpbGVzLS1vbmUgdG8gYnVpbGQgYSBuZXcgPHR0PnRjbHNoPC90dD4gcHJvZ3JhbSwgYW5kIG9uZSB0byBhZGQgYSBmZXcgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgzPiB0Y2xzaC5pPC9oMz4KLVRvIGJ1aWxkIGEgbmV3IDx0dD50Y2xzaDwvdHQ+IGFwcGxpY2F0aW9uLCB5b3UgbmVlZCB0byBzdXBwbHkgYSA8dHQ+VGNsX0FwcEluaXQoKTwvdHQ+IGZ1bmN0aW9uLiAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIChzaW1wbGlmaWVkIHNvbWV3aGF0IGZvciBjbGFyaXR5KSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8gRmlsZSA6IHRjbHNoLmkKLSV7Ci0jaWYgVENMX01BSk9SX1ZFUlNJT04gPT0gNyAmYW1wOyZhbXA7IFRDTF9NSU5PUl9WRVJTSU9OICZndDs9IDQKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBUY2xfTWFpbihhcmdjLCBhcmd2LCBUY2xfQXBwSW5pdCk7Ci0gIHJldHVybigwKTsKLX0KLSNlbHNlCi1leHRlcm4gaW50IG1haW4oKTsKLSNlbmRpZgotaW50IFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCl7Ci0gIGludCBTV0lHX2luaXQoVGNsX0ludGVycCAqKTsgCi0KLSAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSAKLSAgICByZXR1cm4gVENMX0VSUk9SOwotCi0gIC8qIE5vdyBpbml0aWFsaXplIG91ciBmdW5jdGlvbnMgKi8KLQotICBpZiAoU1dJR19pbml0KGludGVycCkgPT0gVENMX0VSUk9SKQotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSAgcmV0dXJuIFRDTF9PSzsKLX0KLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBlbnRpcmUgZmlsZSBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb2RlIGJsb2NrLiBUaGlzIGNvZGUgd2lsbCBiZSBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIHRoZSByZXN1bHRpbmcgd3JhcHBlciBmaWxlLCBwcm92aWRpbmcgdXMgd2l0aCB0aGUgbmVlZGVkIDx0dD5UY2xfQXBwSW5pdCgpPC90dD4gZnVuY3Rpb24uPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDM+IG1hbGxvYy5pPC9oMz4KLU5vdyBzdXBwb3NlIHdlIHdhbnRlZCB0byB3cml0ZSBhIGZpbGUgPHR0Pm1hbGxvYy5pPC90dD4gdGhhdCBhZGRlZCBhIGZldyBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuICBXZSBjb3VsZCBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBGaWxlIDogbWFsbG9jLmkKLSV7Ci0jaW5jbHVkZSAmbHQ7bWFsbG9jLmgmZ3Q7Ci0lfQotCi0ldHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90Ci12b2lkICptYWxsb2Moc2l6ZV90IG5ieXRlcyk7Ci12b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IG5ieXRlcyk7Ci12b2lkIGZyZWUodm9pZCAqKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIGEgZ2VuZXJhbCBwdXJwb3NlIGxpYnJhcnkgdGhhdCBjb3VsZCBiZSB1c2VkIHdoZW5ldmVyIHdlIG5lZWRlZCBhY2Nlc3MgdG8gdGhlIDx0dD5tYWxsb2MoKTwvdHQ+IGZ1bmN0aW9ucy4gU2luY2UgdGhpcyBpbnRlcmZhY2UgZmlsZSBpcyBsYW5ndWFnZSBpbmRlcGVuZGVudCwgd2UgY2FuIHVzZSBpdCBhbnl3aGVyZS48cD4KLTxhIG5hbWU9Im4xMyI+PC9hPjxoMz4gUGxhY2luZyB0aGUgZmlsZXMgaW4gdGhlIGxpYnJhcnk8L2gzPgotV2hpbGUgYm90aCBvZiBvdXIgZXhhbXBsZXMgYXJlIFNXSUcgaW50ZXJmYWNlIGZpbGVzLCB0aGV5IGFyZSBxdWl0ZSBkaWZmZXJlbnQgaW4gZnVuY3Rpb25hbGl0eSBzaW5jZSA8dHQ+dGNsc2guaTwvdHQ+IHdvdWxkIG9ubHkgd29yayB3aXRoIFRjbCB3aGlsZSA8dHQ+bWFsbG9jLmk8L3R0PiB3b3VsZCB3b3JrIHdpdGggYW55IG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiAgICBUaHVzLCB3ZSBzaG91bGQgcHV0IHRoZXNlIGZpbGVzIGludG8gdGhlIFNXSUcgbGlicmFyeSBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PgotLi9zd2lnX2xpYi9tYWxsb2MuaQotLi9zd2lnX2xpYi90Y2wvdGNsc2guaQotPC90dD48L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gdXNlZCBpbiBvdGhlciBpbnRlcmZhY2UgZmlsZXMsIHRoaXMgYWxsb3dzIHVzIHRvIHVzZSA8dHQ+bWFsbG9jLmk8L3R0PiB3aXRoIGFueSB0YXJnZXQgbGFuZ3VhZ2Ugd2hpbGUgPHR0PnRjbHNoLmk8L3R0PiB3aWxsIG9ubHkgYmUgYWNjZXNzaWJsZSBpZiBjcmVhdGluZyBmb3Igd3JhcHBlcnMgZm9yIFRjbCAoaWUuICB3aGVuIGNyZWF0aW5nIGEgUGVybDUgbW9kdWxlLCBTV0lHIHdpbGwgbm90IGxvb2sgaW4gdGhlIDx0dD50Y2w8L3R0PiBzdWJkaXJlY3RvcnkuPHA+Ci08cD4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGxhbmd1YWdlIHNwZWNpZmljIGxpYnJhcmllcyBjYW4gbWFzayBnZW5lcmFsIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIG1ha2UgYSBQZXJsIHNwZWNpZmljIG1vZGlmaWNhdGlvbiB0byA8dHQ+bWFsbG9jLmk8L3R0PiwgeW91IGNvdWxkIG1ha2UgYSBzcGVjaWFsIHZlcnNpb24gYW5kIGNhbGwgaXQgPHR0Pi4vc3dpZ19saWIvcGVybDUvbWFsbG9jLmk8L3R0Pi4gV2hlbiB1c2luZyBQZXJsLCB5b3UnZCBnZXQgdGhpcyB2ZXJzaW9uLCB3aGlsZSBhbGwgb3RoZXIgdGFyZ2V0ICBsYW5ndWFnZXMgd291bGQgdXNlIHRoZSBnZW5lcmFsIHB1cnBvc2UgdmVyc2lvbi48cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBXb3JraW5nIHdpdGggbGlicmFyeSBmaWxlczwvaDI+Ci1UaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGFkZGl0aW9uYWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkgZGVzY3JpYmVkIG5leHQuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDM+IFdyYXBwaW5nIGEgbGlicmFyeSBmaWxlPC9oMz4KLUlmIHlvdSB3b3VsZCBsaWtlIHRvIHdyYXAgYSBmaWxlIGluIHRoZSBTV0lHIGxpYnJhcnksIHNpbXBseSBnaXZlIFNXSUcgdGhlIG5hbWUgb2YgdGhlIGFwcHJvcHJpYXRlIGxpYnJhcnkgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLXB5dGhvbiBwb2ludGVyLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSWYgdGhlIGZpbGUgPHR0PnBvaW50ZXIuaTwvdHQ+IGlzIG5vdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIFNXSUcgd2lsbCBsb29rIGl0IHVwIGluIHRoZSBsaWJyYXJ5LCBnZW5lcmF0ZSB3cmFwcGVyIGNvZGUsIGFuZCBwbGFjZSB0aGUgb3V0cHV0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gVGhpcyB0ZWNobmlxdWUgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBtYWtlIGEgbW9kdWxlIG91dCBvZiBhIGxpYnJhcnkgZmlsZSByZWdhcmRsZXNzIG9mIHdoZXJlIHlvdSBhcmUgd29ya2luZy48cD4KLTxhIG5hbWU9Im4xNSI+PC9hPjxoMz4gQ2hlY2tpbmcgb3V0IGxpYnJhcnkgZmlsZXM8L2gzPgotQXQgdGltZXMsIGl0IGlzIHVzZWZ1bCB0byBjaGVjayBhIGZpbGUgb3V0IG9mIHRoZSBsaWJyYXJ5IGFuZCBjb3B5IGl0IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZSBmaWxlIG9yIHRvIHNpbXBseSByZXRyaWV2ZSB1c2VmdWwgZmlsZXMuIFRvIGNoZWNrIGEgZmlsZSBvdXQgb2YgdGhlIGxpYnJhcnksIHJ1biBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1jbyAtcHl0aG9uIGFycmF5LmkKLWFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5Ci11bml4ICZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGxpYnJhcnkgZmlsZSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdW5sZXNzIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgKGluIHdoaWNoIGNhc2Ugbm90aGluZyBpcyBkb25lKS4gPHA+Ci08cD4KLVRoZSBTV0lHIGxpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQgdG8gaW50ZXJmYWNlIGZpbGVzLiBTdXBwb3NlIHlvdSBoYWQgYSBjb29sIFBlcmwgc2NyaXB0IHRoYXQgeW91IGxpa2VkIHRvIHVzZSBhbG90LiBZb3UgY291bGQgcGxhY2UgdGhpcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiBOb3cgd2hlbmV2ZXIgeW91IHdhbnRlZCB0byB1c2UgaXQsIHlvdSBjb3VsZCByZXRyaWV2ZSBpdCBieSBpc3N1aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtcGVybDUgLWNvIG15c2NyaXB0LnBsCi1teXNjcmlwdC5wbCBjaGVja2VkIG91dCBmcm9tIHRoZSBTV0lHIGxpYnJhcnkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU3VwcG9ydCBmaWxlcyBjYW4gYWxzbyBiZSBjaGVja2VkIG91dCB3aXRoaW4gYW4gaW50ZXJmYWNlIGZpbGUgdXNpbmcgdGhlIDx0dD4lY2hlY2tvdXQ8L3R0PiBkaXJlY3RpdmUuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWNoZWNrb3V0IG15c2NyaXB0LnBsCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgd2lsbCBhdHRlbXB0IHRvIGNvcHkgdGhlIGZpbGUgPHR0Pm15c2NyaXB0LnBsPC90dD4gdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoZW4gU1dJRyBpcyBydW4uIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBub3RoaW5nIGlzIGRvbmUuPHA+Ci08YSBuYW1lPSJuMTYiPjwvYT48aDM+IFRoZSB3b3JsZCdzIGZhc3Rlc3Qgd2F5IHRvIHdyaXRlIGEgTWFrZWZpbGU8L2gzPgotU2luY2UgdGhlIFNXSUcgbGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCB0byBTV0lHIGludGVyZmFjZSBmaWxlcywgaXQgY2FuIGJlIHVzZWQgdG8gaG9sZCBvdGhlciBraW5kcyBvZiB1c2VmdWwgZmlsZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgbmVlZCBhIHF1aWNrIE1ha2VmaWxlIGZvciBidWlsZGluZyBUY2wgZXh0ZW5zaW9ucywgdHlwZSB0aGUgZm9sbG93aW5nOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXgmZ3Q7IHN3aWcgLXRjbCAtY28gTWFrZWZpbGUKLU1ha2VmaWxlIGNoZWNrZWQgb3V0IGZyb20gdGhlIFNXSUcgbGlicmFyeQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1EdXJpbmcgaW5zdGFsbGF0aW9uLCBTV0lHIGNyZWF0ZXMgYSBjb2xsZWN0aW9uIG9mIHByZWNvbmZpZ3VyZWQgTWFrZWZpbGVzIGZvciB2YXJpb3VzIHNjcmlwdGluZyBsYW5ndWFnZXMuIElmIHlvdSBuZWVkIHRvIG1ha2UgYSBuZXcgbW9kdWxlLCBqdXN0IGNoZWNrIG91dCBvbmUgb2YgdGhlc2UgTWFrZWZpbGVzLCBtYWtlIGEgZmV3IGNoYW5nZXMsIGFuZCB5b3Ugc2hvdWxkIGJlIHJlYWR5IHRvIGNvbXBpbGUgYW5kIGV4dGVuc2lvbiBmb3IgeW91ciBzeXN0ZW0uPHA+Ci08YSBuYW1lPSJuMTciPjwvYT48aDM+IENoZWNraW5nIGluIGxpYnJhcnkgZmlsZXM8L2gzPgotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjaGVjayBmaWxlcyBpbnRvIHRoZSBTV0lHIGxpYnJhcnkuIElmIHlvdSd2ZSBtYWRlIGFuIGludGVyZXN0aW5nIGludGVyZmFjZSB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGtlZXAgYXJvdW5kLCBzaW1wbHkgdHlwZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLWNpIC1weXRob24gY29vbC5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWFuZCB0aGUgZmlsZSBgPHR0PmNvb2wuaTwvdHQ+JyB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgUHl0aG9uIHNlY3Rpb24gb2YgdGhlIGxpYnJhcnkuIElmIHlvdXIgaW50ZXJmYWNlIGZpbGUgaXMgZ2VuZXJhbCBwdXJwb3NlLCB5b3UgY2FuIGluc3RhbGwgaXQgaW50byB0aGUgZ2VuZXJhbCBsaWJyYXJ5IGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1jaSAuLi9jb29sLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBmaWxlcyBhcmUgY2hlY2tlZCBpbiwgdGhleSBhcmUgcGxhY2VkIGludG8gdGhlIGRpcmVjdG9yeSBkZWZpbmVkIGJ5IHRoZSA8dHQ+U1dJR19MSUI8L3R0PiB2YXJpYWJsZSB0aGF0IHdhcyB1c2VkIGR1cmluZyBTV0lHIGNvbXBpbGF0aW9uIG9yIHRoZSA8dHQ+U1dJR19MSUI8L3R0PiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoaWYgc2V0KS4gSWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcywgdHlwZSB0aGUgZm9sbG93aW5nIHRvIGRpc3BsYXkgaXRzIGxvY2F0aW9uLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1zd2lnbGliCi0vdXNyL2xvY2FsL2xpYi9zd2lnX2xpYgotdW5peCAmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIG9yZGVyIHRvIGNoZWNrIGZpbGVzIGludG8gdGhlIGxpYnJhcnksIHlvdSBtdXN0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBvbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkuIEZvciB0aGlzIHJlYXNvbiwgb25lIG9mIHRoZSBwcmltYXJ5IHVzZXMgZm9yIHRoZSA8dHQ+LWNpPC90dD4gb3B0aW9uIGlzIHRvIHByb3ZpZGUgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBpbnN0YWxsaW5nIFNXSUcgZXh0ZW5zaW9ucy4gSWYgdGhlc2UgZXh0ZW5zaW9ucyBuZWVkIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcywgdGhhdCBjYW4gYmUgZG9uZSBieSBzaW1wbHkgcnVubmluZyBTV0lHLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDI+IFN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBtdWx0aXBsZSBtb2R1bGVzPC9oMj4KLVdoZW4gdXNpbmcgc3RhdGljIGxpbmtpbmcsIHNvbWUgbGFuZ3VhZ2UgbW9kdWxlcyBhbGxvdyBtdWx0aXBsZSBtb2R1bGVzIHRvIGJlIGluaXRpYWxpemVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgcGFja2FnZSwgZXF1YXRpb25zLCBncmFwaGljcywgZmlsZWlvLCBkYXRhLCBuZXR3b3JrLCB1c2VyCi0KLS4uLiBNb3JlIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIG1vZHVsZSBsaXN0IGNhbiBjb250YWluIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgb3IgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiBSZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgY2hhcHRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGZlYXR1cmUuPHA+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IE1vcmUgYWJvdXQgdGhlIFNXSUcgbGlicmFyeTwvaDI+Ci1GdWxsIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIFNXSUcgbGlicmFyeSBpcyBpbmNsdWRlZCBpbiB0aGUgU1dJRyBzb3VyY2UgZGlzdHJpYnV0aW9uLiBJbiBmYWN0LCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHLCB3aGljaCBsZWFkcyB1cyB0byB0aGUgbmV4dCBzZWN0aW9uLi4uPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjU0IDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1Blcmw1Lmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML1Blcmw1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2FmYjguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9QZXJsNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxOSArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlNXSUcgYW5kIFBlcmw1PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT44IFNXSUcgYW5kIFBlcmw1PC9oMT48cD48dWw+Ci08bGk+IDxhIGhyZWY9IiNuMSI+UHJlbGltaW5hcmllczwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5CdWlsZGluZyBQZXJsIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5Nb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+QmFzaWMgUGVybCBpbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QSBzaW1wbGUgUGVybCBleGFtcGxlPC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPkFjY2Vzc2luZyBhcnJheXMgYW5kIG90aGVyIHN0cmFuZ2Ugb2JqZWN0czwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5JbXBsZW1lbnRpbmcgbWV0aG9kcyBpbiBQZXJsPC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPlNoYWRvdyBjbGFzc2VzPC9hPgotPGxpPiA8YSBocmVmPSIjbjkiPkdldHRpbmcgc2VyaW91czwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMCI+V3JhcHBpbmcgQyBsaWJyYXJpZXMgYW5kIG90aGVyIHBhY2thZ2VzPC9hPgotPGxpPiA8YSBocmVmPSIjbjExIj5CdWlsZGluZyBhIFBlcmw1IGludGVyZmFjZSB0byBNQVRMQUI8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTIiPkhhbmRsaW5nIG91dHB1dCB2YWx1ZXMgKHRoZSBlYXN5IHdheSk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTMiPkV4Y2VwdGlvbiBoYW5kbGluZzwvYT4KLTxsaT4gPGEgaHJlZj0iI24xNCI+UmVtYXBwaW5nIGRhdGF0eXBlcyB3aXRoIHR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSIjbjE1Ij5UaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9hPgotPGxpPiA8YSBocmVmPSIjbjE2Ij5XaGVyZSB0byBnbyBmcm9tIGhlcmU/PC9hPgotPC91bD4KLQotSW4gdGhpcyBjaGFwdGVyLCB3ZSBkaXNjdXNzIFNXSUcncyBzdXBwb3J0IG9mIFBlcmw1LiBXaGlsZSB0aGUgUGVybDUgbW9kdWxlIGlzIG9uZSBvZiB0aGUgZWFybGllc3QgU1dJRyBtb2R1bGVzLCBpdCBoYXMgY29udGludWVkIHRvIGV2b2x2ZSBhbmQgaGFzIGJlZW4gaW1wcm92ZWQgZ3JlYXRseSB3aXRoIHRoZSBoZWxwIG9mIFNXSUcgdXNlcnMuIEZvciB0aGUgYmVzdCByZXN1bHRzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IFNXSUcgYmUgdXNlZCB3aXRoIFBlcmw1LjAwMyBvciBsYXRlci4gRWFybGllciB2ZXJzaW9ucyBhcmUgcHJvYmxlbWF0aWMgYW5kIFNXSUcgZ2VuZXJhdGVkIGV4dGVuc2lvbnMgbWF5IG5vdCBjb21waWxlIG9yIHJ1biBjb3JyZWN0bHkuPHA+Ci08YSBuYW1lPSJuMSI+PC9hPjxoMj4gUHJlbGltaW5hcmllczwvaDI+Ci1JbiBvcmRlciBmb3IgdGhpcyBzZWN0aW9uIHRvIG1ha2UgbXVjaCBzZW5zZSwgeW91IHdpbGwgbmVlZCB0byBoYXZlIFBlcmw1LjAwMiAob3IgbGF0ZXIpIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4gWW91IHNob3VsZCBhbHNvIGRldGVybWluZSBpZiB5b3VyIHZlcnNpb24gb2YgUGVybCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHVzZSBkeW5hbWljIGxvYWRpbmcgb3Igbm90LiBTV0lHIHdpbGwgd29yayB3aXRoIG9yIHdpdGhvdXQgaXQsIGJ1dCB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyB3aWxsIGJlIGRpZmZlcmVudC48cD4KLTxhIG5hbWU9Im4xNyI+PC9hPjxoMz4gUnVubmluZyBTV0lHPC9oMz4KLVRvIGJ1aWxkIGEgUGVybDUgbW9kdWxlLCBydW4gc3dpZyB1c2luZyB0aGUgPHR0Pi1wZXJsNTwvdHQ+IG9wdGlvbiBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1zd2lnIC1wZXJsNSBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIHByb2R1Y2UgMyBmaWxlcy4gVGhlIGZpcnN0IGZpbGUsIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+IGNvbnRhaW5zIGFsbCBvZiB0aGUgQyBjb2RlIG5lZWRlZCB0byBidWlsZCBhIFBlcmw1IG1vZHVsZS4gVGhlIHNlY29uZCBmaWxlLCA8dHQ+ZXhhbXBsZS5wbTwvdHQ+IGNvbnRhaW5zIHN1cHBvcnRpbmcgUGVybCBjb2RlIG5lZWRlZCB0byBwcm9wZXJseSBsb2FkIHRoZSBtb2R1bGUgaW50byBQZXJsLiBUaGUgdGhpcmQgZmlsZSB3aWxsIGJlIGEgZG9jdW1lbnRhdGlvbiBmaWxlICh0aGUgZXhhY3QgZmlsZW5hbWUgZGVwZW5kcyBvbiB0aGUgZG9jdW1lbnRhdGlvbiBzdHlsZSkuIFRvIGZpbmlzaCBidWlsZGluZyBhIG1vZHVsZSwgeW91IHdpbGwgbmVlZCB0byBjb21waWxlIHRoZSBmaWxlIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+IGFuZCBsaW5rIGl0IHdpdGggdGhlIHJlc3Qgb2YgeW91ciBwcm9ncmFtIChhbmQgcG9zc2libHkgUGVybCBpdHNlbGYpLiBUaGVyZSBhcmUgc2V2ZXJhbCBtZXRob2RzIGZvciBkb2luZyB0aGlzLjxwPgotPGEgbmFtZT0ibjE4Ij48L2E+PGgzPiBHZXR0aW5nIHRoZSByaWdodCBoZWFkZXIgZmlsZXM8L2gzPgotSW4gb3JkZXIgdG8gY29tcGlsZSwgeW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIGZvbGxvd2luZyBQZXJsNSBoZWFkZXIgZmlsZXMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSNpbmNsdWRlICJFeHRlcm4uaCIKLSNpbmNsdWRlICJwZXJsLmgiCi0jaW5jbHVkZSAiWFNVQi5oIgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGVzZSBhcmUgdXN1YWxseSBsb2NhdGVkIGluIGEgZGlyZWN0b3J5IGxpa2UgdGhpczxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi91c3IvbG9jYWwvbGliL3Blcmw1L2FyY2gtb3NuYW1lLzUuMDAzL0NPUkUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIFNXSUcgY29uZmlndXJhdGlvbiBzY3JpcHQgd2lsbCB0cnkgdG8gZmluZCB0aGlzIGRpcmVjdG9yeSwgYnV0IGl0J3Mgbm90IGVudGlyZWx5IGZvb2xwcm9vZi4gWW91IG1heSBoYXZlIHRvIGRpZyBhcm91bmQgeW91cnNlbGYuPHA+Ci08YSBuYW1lPSJuMTkiPjwvYT48aDM+IENvbXBpbGluZyBhIGR5bmFtaWMgbW9kdWxlPC9oMz4KLVRvIGNvbXBpbGUgYSBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBnY2MgZXhhbXBsZS5jCi0lIGdjYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvbGliL3Blcmw1L2FyY2gtb3NuYW1lLzUuMDAzL0NPUkUgCi0JLURib29sPWNoYXIgLWMKLSUgbGQgLXNoYXJlZCBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8gLW8gZXhhbXBsZS5zbyAgICAjIElyaXgKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSBtdXN0IG1hdGNoIHRoZSBtb2R1bGUgbmFtZSB1c2VkIGluIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlLiBJZiB5b3UgdXNlZCBgPHR0PiVtb2R1bGUgZXhhbXBsZTwvdHQ+JywgdGhlbiB0aGUgdGFyZ2V0IHNob3VsZCBiZSBuYW1lZCBgPHR0PmV4YW1wbGUuc288L3R0PicsIGA8dHQ+ZXhhbXBsZS5zbDwvdHQ+Jywgb3IgdGhlIGFwcHJvcHJpYXRlIG5hbWUgb24geW91ciBzeXN0ZW0gKGNoZWNrIHRoZSBtYW4gcGFnZXMgZm9yIHRoZSBsaW5rZXIpLjxwPgotPHA+Ci1VbmZvcnR1bmF0ZWx5LCB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyBkeW5hbWljIG1vZHVsZXMgdmFyaWVzIG9uIGV2ZXJ5IHNpbmdsZSBtYWNoaW5lLiBCb3RoIHRoZSBDIGNvbXBpbGVyIGFuZCBsaW5rZXIgbWF5IG5lZWQgc3BlY2lhbCBjb21tYW5kIGxpbmUgb3B0aW9ucy4gU1dJRyB0cmllcyB0byBndWVzcyBob3cgdG8gYnVpbGQgZHluYW1pYyBtb2R1bGVzIG9uIHlvdXIgbWFjaGluZSBpbiBvcmRlciB0byBydW4gaXRzIGV4YW1wbGUgcHJvZ3JhbXMuIEFnYWluLCB0aGUgY29uZmlndXJlIHNjcmlwdCBpc24ndCBmb29scHJvb2YgLjxwPgotPGEgbmFtZT0ibjIwIj48L2E+PGgzPiBCdWlsZGluZyBhIGR5bmFtaWMgbW9kdWxlIHdpdGggTWFrZU1ha2VyPC9oMz4KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIFBlcmwgdG8gYnVpbGQgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcyBmb3IgeW91IHVzaW5nIHRoZSBNYWtlTWFrZXIgdXRpbGl0eS4gICAgVG8gZG8gdGhpcywgd3JpdGUgYSBzaW1wbGUgUGVybCBzY3JpcHQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEZpbGUgOiBNYWtlZmlsZS5QTAotdXNlIEV4dFV0aWxzOjpNYWtlTWFrZXI7Ci1Xcml0ZU1ha2VmaWxlKAotCWBOQU1FJyAgICA9Jmd0OyBgZXhhbXBsZScsICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHBhY2thZ2UKLQlgTElCUycgICAgPSZndDsgW2AtbG0nXSwgICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiBjdXN0b20gbGlicmFyaWVzCi0JYE9CSkVDVCcgID0mZ3Q7IGBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8nICAjIE9iamVjdCBmaWxlcwotKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCB0byBidWlsZCBhIG1vZHVsZSwgc2ltcGx5IGZvbGxvdyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBwZXJsIE1ha2VmaWxlLlBMCi0lIG1ha2UKLSUgbWFrZSBpbnN0YWxsCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgaXMgdGhlIHByZWZlcnJlZCBhcHByb2FjaCBpZiB5b3UgYnVpbGRpbmcgZ2VuZXJhbCBwdXJwb3NlIFBlcmw1IG1vZHVsZXMgZm9yIGRpc3RyaWJ1dGlvbi4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgTWFrZU1ha2VyIGNhbiBiZSBmb3VuZCBpbiAiUHJvZ3JhbW1pbmcgUGVybCwgMm5kIGVkLiIgYnkgTGFycnkgV2FsbCwgVG9tIENocmlzdGlhbnNlbiwgYW5kIFJhbmRhbCBTY2h3YXJ0ei48cD4KLTxhIG5hbWU9Im4yMSI+PC9hPjxoMz4gQnVpbGRpbmcgYSBzdGF0aWMgdmVyc2lvbiBvZiBQZXJsPC9oMz4KLUlmIHlvdSBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBsb2FkaW5nLCBvciBpZiB5b3UndmUgdHJpZWQgdG8gdXNlIGl0IHdpdGhvdXQgc3VjY2VzcywgeW91IGNhbiBidWlsZCBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBQZXJsIGludGVycHJldGVyIHdpdGggeW91ciBTV0lHIGV4dGVuc2lvbnMgYWRkZWQgdG8gaXQuIFRvIGJ1aWxkIGEgc3RhdGljIGV4dGVuc2lvbiwgeW91IGZpcnN0IG5lZWQgdG8gaW52b2tlIFNXSUcgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtc3RhdGljIGV4YW1wbGUuaQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1CeSBkZWZhdWx0IFNXSUcgaW5jbHVkZXMgY29kZSBmb3IgZHluYW1pYyBsb2FkaW5nLCBidXQgdGhlIDx0dD4tc3RhdGljPC90dD4gb3B0aW9uIHRha2VzIGl0IG91dC48cD4KLTxwPgotTmV4dCwgeW91IHdpbGwgbmVlZCB0byBzdXBwbHkgYSA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB5b3VyIGV4dGVuc2lvbiBhbmQgc3RhcnRzIHRoZSBQZXJsIGludGVycHJldGVyLiBXaGlsZSwgdGhpcyBtYXkgc291bmQgZGF1bnRpbmcsIFNXSUcgY2FuIGRvIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUgZXhhbXBsZQotCi1leHRlcm4gZG91YmxlIE15X3ZhcmlhYmxlOwotZXh0ZXJuIGludCBmYWN0KGludCk7Ci0KLS8vIEluY2x1ZGUgY29kZSBmb3IgcmVidWlsZGluZyBQZXJsCi0laW5jbHVkZSBwZXJsbWFpbi5pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBzYW1lIHRoaW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgcnVubmluZyBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcGVybDUgLXN0YXRpYyAtbHBlcmxtYWluLmkgZXhhbXBsZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+cGVybWFpbi5pPC90dD4gZmlsZSBpbnNlcnRzIFBlcmwncyA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gaW50byB0aGUgd3JhcHBlciBjb2RlIGFuZCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUuIElmIHlvdSBqdXN0IHdhbnQgdG8gbWFrZSBhIHF1aWNrIGEgZGlydHkgbW9kdWxlLCB0aGlzIG1heSBiZSB0aGUgZWFzaWVzdCB3YXkuIEJ5IGRlZmF1bHQsIHRoZSA8dHQ+cGVybG1haW4uaTwvdHQ+IGNvZGUgZG9lcyBub3QgaW5pdGlhbGl6ZSBhbnkgb3RoZXIgUGVybCBleHRlbnNpb25zLiBJZiB5b3UgbmVlZCB0byB1c2Ugb3RoZXIgcGFja2FnZXMsIHlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5IGl0IGFwcHJvcHJpYXRlbHkuIFlvdSBjYW4gZG8gdGhpcyBieSBqdXN0IGNvcHlpbmcgPHR0PnBlcmxtYWluLmk8L3R0PiBvdXQgb2YgdGhlIFNXSUcgbGlicmFyeSwgcGxhY2luZyBpdCBpbiB5b3VyIG93biBkaXJlY3RvcnksICBhbmQgbW9kaWZ5aW5nIGl0IHRvIHN1aXQgeW91ciBwdXJwb3Nlcy48cD4KLTxwPgotVG8gYnVpbGQgeW91ciBuZXcgUGVybCBleGVjdXRhYmxlLCBmb2xsb3cgdGhlIGV4YWN0IHNhbWUgcHJvY2VkdXJlIGFzIGZvciBhIGR5bmFtaWMgbW9kdWxlLCBidXQgY2hhbmdlIHRoZSBsaW5rIGxpbmUgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBsZCBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8gLUwvdXNyL2xvY2FsL2xpYi9wZXJsNS9hcmNoLzUuMDAzL0NPUkUgXAotCS1scGVybCAtbHNvY2tldCAtbG5zbCAtbG0gLW8gbXlwZXJsCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgd2lsbCBwcm9kdWNlIGEgbmV3IHZlcnNpb24gb2YgUGVybCBjYWxsZWQgPHR0Pm15cGVybDwvdHQ+LiBJdCBzaG91bGQgYmUgZnVuY3Rpb25hbGl0eSBpZGVudGljYWwgdG8gUGVybCB3aXRoIHlvdXIgQy9DKysgZXh0ZW5zaW9uIGFkZGVkIHRvIGl0LiAgRGVwZW5kaW5nIG9uIHlvdXIgbWFjaGluZSwgeW91IG1heSBuZWVkIHRvIGxpbmsgd2l0aCBhZGRpdGlvbmFsIGxpYnJhcmllcyBzdWNoIGFzIDx0dD4tbHNvY2tldCwgLWxuc2wsIC1sZGw8L3R0PiwgZXRjLi4uPHA+Ci08YSBuYW1lPSJuMjIiPjwvYT48aDM+IENvbXBpbGF0aW9uIHByb2JsZW1zIGFuZCBjb21waWxpbmcgd2l0aCBDKys8L2gzPgotSW4gc29tZSBjYXNlcywgeW91IG1heSBnZXQgYWxvdCBvZiBlcnJvciBtZXNzYWdlcyBhYm91dCB0aGUgYDx0dD5ib29sPC90dD4nIGRhdGF0eXBlIHdoZW4gY29tcGlsaW5nIGEgU1dJRyBtb2R1bGUuIElmIHlvdSBleHBlcmllbmNlIHRoaXMgcHJvYmxlbSwgeW91IGNhbiB0cnkgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5Vc2UgPHR0Pi1ESEFTX0JPT0w8L3R0PiB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyIGNvZGUKLTxsaT5PciB1c2UgPHR0Pi1EYm9vbD1jaGFyPC90dD4gd2hlbiBjb21waWxpbmcuCi08L3VsPgotPHA+Ci1Db21waWxpbmcgZHluYW1pYyBtb2R1bGVzIGZvciBDKysgaXMgYWxzbyBhIHRyaWNreSBidXNpbmVzcy4gIFdoZW4gY29tcGlsaW5nIEMrKyBtb2R1bGVzLCB5b3UgbWF5IG5lZWQgdG8gbGluayB1c2luZyB0aGUgQysrIGNvbXBpbGVyIHN1Y2ggYXMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBjKysgLXNoYXJlZCBleGFtcGxlX3dyYXAubyBleGFtcGxlLm8gLW8gZXhhbXBsZS5zbwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JdCBtYXkgYWxzbyBiZSBuZWNlc3NhcnkgdG8gbGluayBhZ2FpbnN0IHRoZSA8dHQ+bGliZ2NjLmE8L3R0PiwgPHR0PmxpYmcrKy5hPC90dD4sIGFuZCA8dHQ+bGlic3RkYysrLmE8L3R0PiBsaWJyYXJpZXMgKGFzc3VtaW5nIGcrKykuIEMrKyBtYXkgYWxzbyBjb21wbGFpbiBhYm91dCBvbmUgbGluZSBpbiB0aGUgUGVybCBoZWFkZXIgZmlsZSAiPHR0PnBlcmwuaDwvdHQ+IiBhbmQgdGhlIGludmFsaWQgdXNlIG9mIHRoZSAiZXhwbGljaXQiIGtleXdvcmQuIFRvIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbSwgcHV0IHRoZSBvcHRpb24gPHR0Pi1EZXhwbGljaXQ9PC90dD4gaW4geW91ciBjb21waWxlciBmbGFncy48cD4KLTxwPgotSWYgYWxsIGVsc2UgZmFpbHMsIHB1dCBvbiB5b3VyIHdpemFyZCBjYXAgYW5kIHN0YXJ0IGxvb2tpbmcgYXJvdW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuICBPbmNlIHlvdSd2ZSBmaWd1cmVkIG91dCBob3cgdG8gZ2V0IG9uZSBtb2R1bGUgdG8gY29tcGlsZSwgeW91IGNhbiBjb21waWxlIGp1c3QgYWJvdXQgYWxsIG90aGVyIG1vZHVsZXMuPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gQnVpbGRpbmcgUGVybCBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2gyPgotQnVpbGRpbmcgYSBTV0lHIGV4dGVuc2lvbiB0byBQZXJsIHVuZGVyIFdpbmRvd3MgOTUvTlQgaXMgcm91Z2hseSBzaW1pbGFyIHRvIHRoZSBwcm9jZXNzIHVzZWQgd2l0aCBVbml4LiAgIE5vcm1hbGx5LCB5b3Ugd2lsbCB3YW50IHRvIHByb2R1Y2UgYSBETEwgdGhhdCBjYW4gYmUgbG9hZGVkIGludG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIuICAgIFRoaXMgc2VjdGlvbiBhc3N1bWVzIHlvdSBhcmUgdXNpbmcgU1dJRyB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDQueCBhbHRob3VnaCB0aGUgcHJvY2VkdXJlIG1heSBiZSBzaW1pbGFyIHdpdGggb3RoZXIgY29tcGlsZXJzLiAgIFNXSUcgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBBY3RpdmVXYXJlIFBlcmwgZm9yIFdpbjMyIHBvcnQgYW5kIFBlcmwgNS4wMDQuICBJZiB1c2luZyB0aGUgQWN0aXZlV2FyZSB2ZXJzaW9uLCBhbGwgUGVybCBleHRlbnNpb25zIG11c3QgYmUgY29tcGlsZWQgdXNpbmcgQysrITxwPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBSdW5uaW5nIFNXSUcgZnJvbSBEZXZlbG9wZXIgU3R1ZGlvPC9oMz4KLUlmIHlvdSBhcmUgZGV2ZWxvcGluZyB5b3VyIGFwcGxpY2F0aW9uIHdpdGhpbiBNaWNyb3NvZnQgZGV2ZWxvcGVyIHN0dWRpbywgU1dJRyBjYW4gYmUgaW52b2tlZCBhcyBhIGN1c3RvbSBidWlsZCBvcHRpb24uICAgICAgVGhlIHByb2Nlc3Mgcm91Z2hseSByZXF1aXJlcyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5PcGVuIHVwIGEgbmV3IHdvcmtzcGFjZSBhbmQgdXNlIHRoZSBBcHBXaXphcmQgdG8gc2VsZWN0IGEgRExMIHByb2plY3QuCi08bGk+QWRkIGJvdGggdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgKHRoZSAuaSBmaWxlKSwgYW55IHN1cHBvcnRpbmcgQyBmaWxlcywgYW5kIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZpbGUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgU1dJRyAoaWUuIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+KS4gICBOb3RlIDogSWYgdXNpbmcgQysrLCBjaG9vc2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciB0aGUgd3JhcHBlciBmaWxlIHN1Y2ggYXMgPHR0PmV4YW1wbGVfd3JhcC5jeHg8L3R0Pi4gRG9uJ3Qgd29ycnkgaWYgdGhlIHdyYXBwZXIgZmlsZSBkb2Vzbid0IGV4aXN0IHlldC0tRGV2ZWxvcGVyIHN0dWRpbyB3aWxsIGtlZXAgYSByZWZlcmVuY2UgdG8gaXQgYXJvdW5kLgotPGxpPlNlbGVjdCB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSBhbmQgZ28gdG8gdGhlIHNldHRpbmdzIG1lbnUuICAgVW5kZXIgc2V0dGluZ3MsIHNlbGVjdCB0aGUgIkN1c3RvbSBCdWlsZCIgb3B0aW9uLgotPGxpPkVudGVyICJTV0lHIiBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQuCi08bGk+RW50ZXIgIjx0dD5zd2lnIC1wZXJsNSAtbyAkKFByb2pEaXIpXCQoSW5wdXROYW1lKV93cmFwLmN4eCAkKElucHV0UGF0aCk8L3R0PiIgaW4gdGhlICJCdWlsZCBjb21tYW5kKHMpIGZpZWxkIgotPGxpPkVudGVyICI8dHQ+JChQcm9qRGlyKVwkKElucHV0TmFtZSlfd3JhcC5jPC90dD54eCIgaW4gdGhlICJPdXRwdXQgZmlsZXMocykgZmllbGQiLgotPGxpPk5leHQsIHNlbGVjdCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBlbnRpcmUgcHJvamVjdCBhbmQgZ28gdG8gIkMrKzpQcmVwcm9jZXNzb3IiLiBBZGQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIHlvdXIgUGVybCA1IGluc3RhbGxhdGlvbiB1bmRlciAiQWRkaXRpb25hbCBpbmNsdWRlIGRpcmVjdG9yaWVzIi4KLTxsaT5EZWZpbmUgdGhlIHN5bWJvbHMgV0lOMzIgYW5kIE1TV0lOMzIgdW5kZXIgcHJlcHJvY2Vzc29yIG9wdGlvbnMuICBJZiB1c2luZyB0aGUgQWN0aXZlV2FyZSBwb3J0LCBhbHNvIGRlZmluZSB0aGUgc3ltYm9sIFBFUkxfT0JKRUNULiAgIE5vdGUgdGhhdCBhbGwgZXh0ZW5zaW9ucyB0byB0aGUgQWN0aXZlV2FyZSBwb3J0IG11c3QgYmUgY29tcGlsZWQgd2l0aCB0aGUgQysrIGNvbXBpbGVyIHNpbmNlIFBlcmwgaGFzIGJlZW4gZW5jYXBzdWxhdGVkIGluIGEgQysrIGNsYXNzLgotPGxpPkZpbmFsbHksIHNlbGVjdCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBlbnRpcmUgcHJvamVjdCBhbmQgZ28gdG8gIkxpbmsgT3B0aW9ucyIuICBBZGQgdGhlIFBlcmwgbGlicmFyeSAgZmlsZSB0byB5b3VyIGxpbmsgbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUgInBlcmwubGliIi4gIEFsc28sIHNldCB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgeW91ciBQZXJsIG1vZHVsZSAoaWUuIGV4YW1wbGUuZGxsKS4KLTxsaT5CdWlsZCB5b3VyIHByb2plY3QuCi08L3VsPgotPHA+Ci1Ob3csIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwsIFNXSUcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGludm9rZWQgd2hlbiB5b3UgYnVpbGQgeW91ciBwcm9qZWN0LiAgQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCByZXN1bHQgaW4gU1dJRyBiZWluZyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIGZpbGUuICBUbyBydW4geW91ciBuZXcgUGVybCBleHRlbnNpb24sIHNpbXBseSBydW4gUGVybCBhbmQgdXNlIHRoZSB1c2UgY29tbWFuZCBhcyBub3JtYWwuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLURPUyAmZ3Q7IHBlcmwKLXVzZSBleGFtcGxlOwotJGEgPSBleGFtcGxlOjpmYWN0KDQpOwotcHJpbnQgIiRhXG4iOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JdCBhcHBlYXJzIHRoYXQgRExMJ3Mgd2lsbCB3b3JrIGlmIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gICBUbyBtYWtlIGEgZ2VuZXJhbGx5IERMTCBhdmFpbGFibGUsIGl0IHNob3VsZCBiZSBwbGFjZSAoYWxvbmcgd2l0aCBpdHMgc3VwcG9ydCBmaWxlcykgaW4gdGhlIDx0dD5MaWJcQXV0b1xbbW9kdWxlXSA8L3R0PnN1Yi1kaXJlY3Rvcnkgb2YgdGhlIFBlcmwgZGlyZWN0b3J5IHdoZXJlIFttb2R1bGVdIGlzIHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlLjxwPgotPGEgbmFtZT0ibjI0Ij48L2E+PGgzPiBVc2luZyBOTUFLRTwvaDM+Ci1BbHRlcm5hdGl2ZWx5LCBTV0lHIGV4dGVuc2lvbnMgY2FuIGJlIGJ1aWx0IGJ5IHdyaXRpbmcgYSBNYWtlZmlsZSBmb3IgTk1BS0UuICAgVG8gZG8gdGhpcywgbWFrZSBzdXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIE1TVkMrKyBhcmUgYXZhaWxhYmxlIGFuZCB0aGUgTVNWQysrIHRvb2xzIGFyZSBpbiB5b3VyIHBhdGguICAgTm93LCBqdXN0IHdyaXRlIGEgc2hvcnQgTWFrZWZpbGUgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIE1ha2VmaWxlIGZvciBidWlsZGluZyBhbiBBY3RpdmVXYXJlIFBlcmwgZm9yIFdpbjMyIGV4dGVuc2lvbgotIyBOb3RlIDogRXh0ZW5zaW9ucyBtdXN0IGJlIGNvbXBpbGVkIHdpdGggdGhlIEMrKyBjb21waWxlciEKLQotU1JDUyAgICAgICAgICA9IGV4YW1wbGUuY3h4Ci1JRklMRSAgICAgICAgID0gZXhhbXBsZQotSU5URVJGQUNFICAgICA9ICQoSUZJTEUpLmkKLVdSQVBGSUxFICAgICAgPSAkKElGSUxFKV93cmFwLmN4eAotCi0jIExvY2F0aW9uIG9mIHRoZSBWaXN1YWwgQysrIHRvb2xzICgzMiBiaXQgYXNzdW1lZCkKLQotVE9PTFMgICAgICAgICA9IGM6XG1zZGV2Ci1UQVJHRVQgICAgICAgID0gZXhhbXBsZS5kbGwKLUNDICAgICAgICAgICAgPSAkKFRPT0xTKVxiaW5cY2wuZXhlCi1MSU5LICAgICAgICAgID0gJChUT09MUylcYmluXGxpbmsuZXhlCi1JTkNMVURFMzIgICAgID0gLUkkKFRPT0xTKVxpbmNsdWRlCi1NQUNISU5FICAgICAgID0gSVg4NgotCi0jIEMgTGlicmFyeSBuZWVkZWQgdG8gYnVpbGQgYSBETEwKLQotRExMSUJDICAgICAgICA9IG1zdmNydC5saWIgb2xkbmFtZXMubGliICAKLQotIyBXaW5kb3dzIGxpYnJhcmllcyB0aGF0IGFyZSBhcHBhcmVudGx5IG5lZWRlZAotV0lOTElCICAgICAgICA9IGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgY29tZGxnMzIubGliIAotd2luc3Bvb2wubGliCi0KLSMgTGlicmFyaWVzIGNvbW1vbiB0byBhbGwgRExMcwotTElCUyAgICAgICAgICA9ICQoRExMSUJDKSAkKFdJTkxJQikgCi0KLSMgTGlua2VyIG9wdGlvbnMKLUxPUFQgICAgICA9IC1kZWJ1ZzpmdWxsIC1kZWJ1Z3R5cGU6Y3YgL05PREVGQVVMVExJQiAvUkVMRUFTRSAvTk9MT0dPIC8KLU1BQ0hJTkU6JChNQUNISU5FKSAtZW50cnk6X0RsbE1haW5DUlRTdGFydHVwQDEyIC1kbGwKLQotIyBDIGNvbXBpbGVyIGZsYWdzCi0KLUNGTEFHUyAgICAgICAgPSAvWjcgL09kIC9jIC9XMyAvbm9sb2dvCi0KLSMgUGVybCA1LjAwNAotUEVSTF9JTkNMVURFID0gLUlkOlxwZXJsNVxsaWJcQ09SRQotUEVSTExJQiAgICAgID0gZDpccGVybDVcbGliXENPUkVccGVybC5saWIKLVBFUkxGTEFHUyAgICA9IC9EV0lOMzIgL0RNU1dJTjMyIC9EV0lOMzJJT19JU19TVERJTwotCi0jIEFjdGl2ZVdhcmUKLVBFUkxfSU5DTFVERSAgPSAtSWQ6XHBlcmwgLUlkOlxwZXJsXGluYyAKLVBFUkxfTElCICAgICAgICA9IGQ6XHBlcmxcUmVsZWFzZVxwZXJsMzAwLmxpYgotUEVSTEZMQUdTID0gL0RXSU4zMiAvRE1TV0lOMzIgL0RQRVJMX09CSkVDVAotCi1wZXJsOjoKLQkuLlwuLlxzd2lnIC1wZXJsNSAtbyAkKFdSQVBGSUxFKSAkKElOVEVSRkFDRSkKLQkkKENDKSAkKENGTEFHUykgJChQRVJMRkxBR1MpICQoUEVSTF9JTkNMVURFKSAkKFNSQ1MpICQoV1JBUEZJTEUpCi0Jc2V0IExJQj0kKFRPT0xTKVxsaWIKLQkkKExJTkspICQoTE9QVCkgLW91dDpleGFtcGxlLmRsbCAkKExJQlMpICQoUEVSTExJQikgZXhhbXBsZS5vYmogCi1leGFtcGxlX3dyYXAub2JqCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRvIGJ1aWxkIHRoZSBleHRlbnNpb24sIHJ1biBOTUFLRSAobm90ZSB0aGF0IHlvdSBtYXkgYmUgdG8gcnVuIDx0dD52Y3ZhcnMzMjwvdHQ+IGJlZm9yZSBkb2luZyB0aGlzIHRvIHNldCB0aGUgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLiBUaGlzIGlzIGEgc2ltcGxpc3RpYyBNYWtlZmlsZSwgYnV0IGhvcGVmdWxseSBpdHMgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZC4gICA8cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBNb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNsYXNzZXM8L2gyPgotV2hlbiB5b3UgY3JlYXRlIGEgU1dJRyBleHRlbnNpb24sIGV2ZXJ5dGhpbmcgZ2V0cyB0aHJvd24gdG9nZXRoZXIgaW50byBhIHNpbmdsZSBQZXJsNSBtb2R1bGUuIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUuIFRvIHVzZSB0aGUgbW9kdWxlLCBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHBlcmw1Ci11c2UgZXhhbXBsZTsgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIHRoZSBleGFtcGxlIG1vZHVsZQotcHJpbnQgZXhhbXBsZTo6ZmFjdCg0KSwiXG4iICAgICAgICMgQ2FsbCBhIGZ1bmN0aW9uIGluIGl0Ci0yNAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Vc3VhbGx5LCBhIG1vZHVsZSBjb25zaXN0cyBvZiBhIGNvbGxlY3Rpb24gb2YgY29kZSB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgZmlsZS4gQSBwYWNrYWdlLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgdGhlIFBlcmwgZXF1aXZhbGVudCBvZiBhIG5hbWVzcGFjZS4gQSBwYWNrYWdlIGlzIGFsb3QgbGlrZSBhIG1vZHVsZSwgZXhjZXB0IHRoYXQgaXQgaXMgaW5kZXBlbmRlbnQgb2YgZmlsZXMuIEFueSBudW1iZXIgb2YgZmlsZXMgbWF5IGJlIHBhcnQgb2YgdGhlIHNhbWUgcGFja2FnZS0tb3IgYSBwYWNrYWdlIG1heSBiZSBicm9rZW4gdXAgaW50byBhIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBpZiB5b3UgcHJlZmVyIHRvIHRoaW5rIGFib3V0IGl0IGluIHRoaXMgd2F5LjxwPgotPHA+Ci1CeSBkZWZhdWx0LCBTV0lHIGluc3RhbGxzIGl0cyBmdW5jdGlvbnMgaW50byBhIHBhY2thZ2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBtb2R1bGUuIFRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgZ2l2aW5nIFNXSUcgdGhlIC1wYWNrYWdlIG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtcGFja2FnZSBGb29CYXIgZXhhbXBsZS5pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoaXMgY2FzZSwgd2Ugc3RpbGwgY3JlYXRlIGEgbW9kdWxlIGNhbGxlZCBgPHR0PmV4YW1wbGU8L3R0PicsIGJ1dCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IG1vZHVsZSB3aWxsIGJlIGluc3RhbGxlZCBpbnRvIHRoZSBwYWNrYWdlIGA8dHQ+Rm9vQmFyPC90dD4uJyBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIGV4YW1wbGU7ICAgICAgICAgICAgICAgICAgICAgICAjIExvYWQgdGhlIG1vZHVsZSBsaWtlIGJlZm9yZQotcHJpbnQgRm9vQmFyOjpmYWN0KDQpLCJcbiI7ICAgICAgICAjIENhbGwgYSBmdW5jdGlvbiBpbiBwYWNrYWdlIEZvb0JhcgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1QZXJsIHN1cHBvcnRzIG9iamVjdCBvcmllbnRlZCBwcm9ncmFtbWluZyB1c2luZyBwYWNrYWdlcy4gQSBwYWNrYWdlIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgbmFtZXNwYWNlIGZvciBhIGNsYXNzIGNvbnRhaW5pbmcgbWV0aG9kcyBhbmQgZGF0YS4gVGhlIHJlYWRlciBpcyB3ZWxsIGFkdmlzZWQgdG8gY29uc3VsdCAiUHJvZ3JhbW1pbmcgUGVybCwgMm5kIEVkLiIgYnkgV2FsbCwgQ2hyaXN0aWFuc2VuLCBhbmQgU2Nod2FydHogZm9yIG1vc3Qgb2YgdGhlIGdvcnkgZGV0YWlscy4gPHA+Ci08YSBuYW1lPSJuNCI+PC9hPjxoMj4gQmFzaWMgUGVybCBpbnRlcmZhY2U8L2gyPgotPGEgbmFtZT0ibjI1Ij48L2E+PGgzPiBGdW5jdGlvbnM8L2gzPgotQyBmdW5jdGlvbnMgYXJlIGNvbnZlcnRlZCBpbnRvIG5ldyBQZXJsIGNvbW1hbmRzIChvciBzdWJyb3V0aW5lcykuIERlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHNvIGFsbG93ZWQuICAgQW4gaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLWludCBmb28oaW50IGEpOwotZG91YmxlIGJhciAoZG91YmxlLCBkb3VibGUgYiA9IDMuMCk7Ci0uLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2lsbCBiZSB1c2VkIGluIFBlcmwgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51c2UgZXhhbXBsZTsKLSRhID0gJmFtcDtleGFtcGxlOjpmb28oMik7Ci0kYiA9ICZhbXA7ZXhhbXBsZTo6YmFyKDMuNSwtMS41KTsKLSRjID0gJmFtcDtleGFtcGxlOjpiYXIoMy41KTsgICAgICAgICAgICAjIFVzZSBkZWZhdWx0IGFyZ3VtZW50IGZvciAybmQgcGFyYW1ldGVyCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU9rYXksIHRoaXMgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4uLmVub3VnaCBzYWlkLjxwPgotPGEgbmFtZT0ibjI2Ij48L2E+PGgzPiBHbG9iYWwgdmFyaWFibGVzPC9oMz4KLUdsb2JhbCB2YXJpYWJsZXMgYXJlIGhhbmRsZWQgdXNpbmcgcHVyZSBtYWdpYy0td2VsbCwgUGVybCdzIG1hZ2ljIHZhcmlhYmxlIG1lY2hhbmlzbSB0aGF0IGlzLiAgSW4gYSBudXRzaGVsbCwgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBjZXJ0YWluIFBlcmwgdmFyaWFibGVzICJtYWdpY2FsIiBieSBhdHRhY2hpbmcgbWV0aG9kcyBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB2YWx1ZXMgYW1vbmcgb3RoZXIgdGhpbmdzLiAgIFNXSUcgZ2VuZXJhdGVzIGEgcGFpciBvZiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBDIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGF0dGFjaGVzIHRoZW0gdG8gYSBQZXJsIHZhcmlhYmxlIG9mIHRoZSBzYW1lIG5hbWUuICBUaHVzLCBhbiBpbnRlcmZhY2UgbGlrZSB0aGlzIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZTsKLS4uLgotZG91YmxlIFNwYW07Ci0uLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotaXMgYWNjZXNzZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIGV4YW1wbGU7Ci1wcmludCAkZXhhbXBsZTo6U3BhbSwiXG4iOwotJGV4YW1wbGU6OlNwYW0gPSAkZXhhbXBsZTo6U3BhbSArIDQKLSMgLi4uIGV0YyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBzdXBwb3J0cyBnbG9iYWwgdmFyaWFibGVzIG9mIGFsbCBDIGRhdGF0eXBlcyBpbmNsdWRpbmcgcG9pbnRlcnMgYW5kIGNvbXBsZXggb2JqZWN0cy48cD4KLTxhIG5hbWU9Im4yNyI+PC9hPjxoMz4gQ29uc3RhbnRzPC9oMz4KLUNvbnN0YW50cyBhcmUgY3JlYXRlZCBhcyByZWFkLW9ubHkgbWFnaWNhbCB2YXJpYWJsZXMgYW5kIG9wZXJhdGUgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IFBvaW50ZXJzPC9oMz4KLVNXSUcgcmVwcmVzZW50cyBwb2ludGVycyBhcyBibGVzc2VkIHJlZmVyZW5jZXMuICBBIGJsZXNzZWQgcmVmZXJlbmNlIGlzIHRoZSBzYW1lIGFzIGEgUGVybCByZWZlcmVuY2UgZXhjZXB0IHRoYXQgaXQgaGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gaXQgaW5kaWNhdGluZyB3aGF0IGtpbmQgb2YgcmVmZXJlbmNlIGl0IGlzLiBUaGF0IGlzLCBpZiB5b3UgaGF2ZSBhIEMgZGVjbGFyYXRpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5NYXRyaXggKm5ld19NYXRyaXgoaW50IG4sIGludCBtKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyB3aWxsIHJldHVybiBhIHZhbHVlIGFzIGlmIHlvdSBoYWQgZG9uZSB0aGlzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0kcHRyID0gbmV3X01hdHJpeChpbnQgbiwgaW50IG0pOyAgICAgIyBTYXZlIHBvaW50ZXIgcmV0dXJuIHJlc3VsdAotYmxlc3MgJHB0ciwgIk1hdHJpeFB0ciI7ICAgICAgICAgICAgICMgQmxlc3MgaXQgYXMgYSBNYXRyaXhQdHIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyB1c2VzIHRoZSAiYmxlc3NpbmciIHRvIGNoZWNrIHRoZSBkYXRhdHlwZSBvZiB2YXJpb3VzIHBvaW50ZXJzLiAgIEluIHRoZSBldmVudCBvZiBhIG1pc21hdGNoLCBhbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuPHA+Ci08cD4KLVRvIGNoZWNrIHRvIHNlZSBpZiBhIHZhbHVlIGlzIHRoZSBOVUxMIHBvaW50ZXIsIHVzZSB0aGUgPHR0PmRlZmluZWQoKTwvdHQ+IGNvbW1hbmQgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWlmIChkZWZpbmVkKCRwdHIpKSB7Ci0JcHJpbnQgIk5vdCBhIE5VTEwgcG9pbnRlci4iOwotfSBlbHNlIHsKLQlwcmludCAiSXMgYSBOVUxMIHBvaW50ZXIuIjsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gY3JlYXRlIGEgTlVMTCBwb2ludGVyLCB5b3Ugc2hvdWxkIHBhc3MgdGhlIDx0dD51bmRlZiA8L3R0PnZhbHVlIHRvIGEgZnVuY3Rpb24uICAgPHA+Ci08cD4KLVRoZSAidmFsdWUiIG9mIGEgUGVybCByZWZlcmVuY2UgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB1bmRlcmx5aW5nIEMgcG9pbnRlciB0aGF0IFNXSUcgd3JhcHBlciBmdW5jdGlvbnMgcmV0dXJuLiAgICBTdXBwb3NlIHRoYXQgPHR0PiRhPC90dD4gYW5kIDx0dD4kYjwvdHQ+IGFyZSB0d28gcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lIEMgb2JqZWN0LiAgIEluIGdlbmVyYWwsIDx0dD4kYTwvdHQ+IGFuZCA8dHQ+JGI8L3R0PiB3aWxsIGJlIGRpZmZlcmVudC0tc2luY2UgdGhleSBhcmUgZGlmZmVyZW50IHJlZmVyZW5jZXMuICAgVGh1cywgaXQgaXMgYSBtaXN0YWtlIHRvIGNoZWNrIHRoZSBlcXVhbGl0eSBvZiA8dHQ+JGEgPC90dD5hbmQgPHR0PiRiPC90dD4gdG8gY2hlY2sgdGhlIGVxdWFsaXR5IG9mIHR3byBDIHBvaW50ZXJzLiAgVGhlIGNvcnJlY3QgbWV0aG9kIHRvIGNoZWNrIGVxdWFsaXR5IG9mIEMgcG9pbnRlcnMgaXMgdG8gZGVyZWZlcmVuY2UgdGhlbSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pZiAoJCRhID09ICQkYikgewotCXByaW50ICJhIGFuZCBiIHBvaW50IHRvIHRoZSBzYW1lIHRoaW5nIGluIEMiOwotfSBlbHNlIHsKLQlwcmludCAiYSBhbmQgYiBwb2ludCB0byBkaWZmZXJlbnQgb2JqZWN0cy4iOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JdCBpcyBlYXN5IHRvIGdldCBidXJuZWQgYnkgIHJlZmVyZW5jZXMgaW4gbW9yZSBzdWJ0bGUgd2F5cy4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHN0b3JpbmcgYSBoYXNoIHRhYmxlIG9mIG9iamVjdHMsIGl0IG1heSBiZSBiZXN0IHRvIHVzZSB0aGUgYWN0dWFsIEMgcG9pbnRlciB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgUGVybCByZWZlcmVuY2UgYXMgYSBrZXkuICBTaW5jZSBlYWNoIFBlcmwgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEMgb2JqZWN0IG1heSBiZSBkaWZmZXJlbnQsIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gZmluZCBhbnl0aGluZyBpbiB0aGUgaGFzaCB3aXRob3V0IHRoaXMuIEFzIGEgZ2VuZXJhbCBydWxlLCB0aGUgYmVzdCB3YXkgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCByZWZlcmVuY2VzIGlzIHRvIG1ha2Ugc3VyZSBoYXNoIHRhYmxlcywgY29tcGFyaXNvbnMsIGFuZCBvdGhlciBwb2ludGVyIG9wZXJhdGlvbnMgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIChpZS4gPHR0PiQkYTwvdHQ+KSwgbm90IHRoZSByZWZlcmVuY2UgaXRzZWxmLjxwPgotPGEgbmFtZT0ibjI5Ij48L2E+PGgzPiBTdHJ1Y3R1cmVzIGFuZCBDKysgY2xhc3NlczwvaDM+Ci1Gb3Igc3RydWN0dXJlcyBhbmQgY2xhc3NlcywgU1dJRyBwcm9kdWNlcyBhIHNldCBvZiBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIG1lbWJlciBmdW5jdGlvbnMgYW5kIG1lbWJlciBkYXRhLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgdmVjdG9yCi0KLWNsYXNzIFZlY3RvciB7Ci1wdWJsaWM6Ci0JZG91YmxlIHgseSx6OwotCVZlY3RvcigpOwotCX5WZWN0b3IoKTsKLQlkb3VibGUgbWFnbml0dWRlKCk7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGdldHMgdHVybmVkIGludG8gdGhlIGZvbGxvd2luZyBjb2xsZWN0aW9uIG9mIFBlcmwgZnVuY3Rpb25zIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+dmVjdG9yOjpWZWN0b3JfeF9nZXQoJG9iaik7Ci12ZWN0b3I6OlZlY3Rvcl94X3NldCgkb2JqLCR4KTsKLXZlY3Rvcjo6VmVjdG9yX3lfZ2V0KCRvYmopOwotdmVjdG9yOjpWZWN0b3JfeV9zZXQoJG9iaiwkeSk7Ci12ZWN0b3I6OlZlY3Rvcl96X2dldCgkb2JqKTsKLXZlY3Rvcjo6VmVjdG9yX3pfc2V0KCRvYmosJHopOwotdmVjdG9yOjpuZXdfVmVjdG9yKCk7Ci12ZWN0b3I6OmRlbGV0ZV9WZWN0b3IoJG9iaik7Ci12ZWN0b3I6OlZlY3Rvcl9tYWduaXR1ZGUoJG9iaik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHVzZSB0aGUgY2xhc3MsIHNpbXBseSB1c2UgdGhlc2UgZnVuY3Rpb25zLiAgQXMgaXQgdHVybnMgb3V0LCBTV0lHIGhhcyBhIG1lY2hhbmlzbSBmb3IgY3JlYXRpbmcgc2hhZG93IGNsYXNzZXMgdGhhdCBoaWRlcyB0aGVzZSBmdW5jdGlvbnMgYW5kIHVzZXMgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSBpbnN0ZWFkLS1rZWVwIHJlYWRpbmcuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQSBzaW1wbGUgUGVybCBleGFtcGxlPC9oMj4KLUluIHRoZSBuZXh0IGZldyBzZWN0aW9ucywgdXNlIG9mIHRoZSBQZXJsNSBtb2R1bGUgd2lsbCBiZSBpbGx1c3RyYXRlZCB0aHJvdWdoIGEgc2VyaWVzIG9mIGluY3JlYXNpbmdseSBjb21wbGV4IGV4YW1wbGVzLiBJbiB0aGUgZXhhbXBsZSwgd2Ugd2lsbCB3cml0ZSBzb21lIHNpbXBsZSBncmFwaCBhbGdvcml0aG1zIHRvIGlsbHVzdHJhdGUgaG93IEMgYW5kIFBlcmwgY2FuIGludGVyYWN0IHdpdGggZWFjaCBvdGhlci4gPHA+Ci08YSBuYW1lPSJuMzAiPjwvYT48aDM+IEdyYXBoczwvaDM+Ci1BIGRpcmVjdGVkIGdyYXBoIGlzIHNpbXBseSBhIGNvbGxlY3Rpb24gb2Ygbm9kZXMgKG9yIHZlcnRpY2VzKSB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlciBieSBhIGNvbGxlY3Rpb24gb2YgZWRnZXMgOjxwPgotPHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDguMS5wbmciPjwvY2VudGVyPjxwPjxwPgotPHA+Ci1UbyByZXByZXNlbnQgc2ltcGxlIGdyYXBocywgd2UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIEMgZGF0YSBzdHJ1Y3R1cmVzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vKiBGaWxlIDogZ3JhcGguaCAqLwotLyogU2ltcGxlIGRhdGEgc3RydWN0dXJlcyBmb3IgZGlyZWN0ZWQgZ3JhcGggb2YgTm9kZXMgYW5kIEVkZ2VzICovCi0KLXN0cnVjdCBFZGdlOwotdHlwZWRlZiBzdHJ1Y3QgTm9kZSB7Ci0gIGludCAgICAgICAgICAgdjsgICAgICAgICAgICAvKiBWZXJ0ZXggbnVtYmVyICAgICAgICAgICAgICAqLwotICBzdHJ1Y3QgRWRnZSAgKmFkajsgICAgICAgICAgLyogQWRqYWNlbmN5IExpc3QgICAgICAgICAgICAgKi8KLX0gTm9kZTsKLQotdHlwZWRlZiBzdHJ1Y3QgRWRnZSB7Ci0gIE5vZGUgICAgICAgICAgKm5vZGU7ICAgICAgICAvKiBDb25uZWN0aW5nIE5vZGUgICAgICAgICAgICAqLwotICBkb3VibGUgICAgICAgICAgICB3OyAgICAgICAgLyogV2VpZ2h0IChvcHRpb25hbCkgICAgICAgICAgKi8KLSAgc3RydWN0IEVkZ2UgICAqbmV4dDsgICAgICAgIC8qIE5leHQgZWRnZSAgICAgICAgICAgICAgICAgICovCi19IEVkZ2U7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUVhY2ggbm9kZSBjb250YWlucyBhIHVuaXF1ZSBudW1iZXIgdiBmb3IgaWRlbnRpZnlpbmcgaXQsIGFuZCBhIGxpbmtlZCBsaXN0IG9mIG90aGVyIG5vZGVzIHRoYXQgYXJlIG5lYXJieS4gICBUaGlzIGxpbmtlZCBsaXN0IGlzIG1hbmFnZWQgYnkgdGhlIDx0dD5FZGdlPC90dD4gc3RydWN0dXJlLiAgIEFzc29jaWF0ZWQgd2l0aCBlYWNoIGVkZ2UgaXMgYW4gb3B0aW9uYWwgd2VpZ2h0aW5nIGZhY3Rvci4gICAgVGhpcyBjb3VsZCBiZSBzb21ldGhpbmcgbGlrZSBtaWxlcyBiZXR3ZWVuIGNpdGllcywgYmFuZHdpZHRoLCBvciBzb21lIG90aGVyIG51bWVyaWNhbCBwcm9wZXJ0eSBhYm91dCBhIHBhcnRpY3VsYXIgbGluay4gICBPa2F5LCBlbm91Z2ggdGFsayBhYm91dCBkYXRhIHN0cnVjdHVyZXMgZm9yIG5vdy48cD4KLTxwPgotVG8gY29uc3RydWN0IG5vZGVzIGFuZCBhZGQgZWRnZXMsIHdlIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBDIGNvZGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBncmFwaC5jICAgICAgICAgICAqLwotLyogRGlyZWN0ZWQgZ3JhcGggZnVuY3Rpb25zICovCi0KLSNpbmNsdWRlICJncmFwaC5oIgotc3RhdGljIGludCBub2RlX2NvdW50ID0gMDsgICAgICAgICAgLyogTnVtYmVyIG9mIG5vZGVzIGNyZWF0ZWQgKi8KLQotLyogQ3JlYXRlIGEgbmV3IE5vZGUgKi8KLU5vZGUgKm5ld19Ob2RlKCkgewotICBOb2RlICpub2RlOwotICBub2RlID0gKE5vZGUgKikgbWFsbG9jKHNpemVvZihOb2RlKSk7Ci0gIG5vZGUtJmd0O3YgPSBub2RlX2NvdW50Kys7ICAgICAgIC8qIEJ1bXAgdXAgdGhlIGNvdW50ICovCi0gIG5vZGUtJmd0O2FkaiA9IChFZGdlICopIDA7ICAgICAgICAgICAKLSAgcmV0dXJuIG5vZGU7Ci19Ci0KLS8qIEFkZCBhbiAiZWRnZSIgdG8gYW5vdGhlciBub2RlLiAqLwotCi1FZGdlICpOb2RlX2FkZGVkZ2UoTm9kZSAqbXlub2RlLCBOb2RlICpvdGhlcm5vZGUsIGRvdWJsZSB3KSB7Ci0gIEVkZ2UgKmVkZ2U7Ci0gIGVkZ2UgPSAoRWRnZSAqKSBtYWxsb2Moc2l6ZW9mKEVkZ2UpKTsKLSAgZWRnZS0mZ3Q7bm9kZSA9IG90aGVybm9kZTsgICAgICAgIAotICBlZGdlLSZndDt3ID0gdzsKLSAgZWRnZS0mZ3Q7bmV4dCA9IG15bm9kZS0mZ3Q7YWRqOyAgICAvKiBhZGQgdG8gbXkgYWRqYWNlbmN5IGxpc3QgKi8KLSAgbXlub2RlLSZndDthZGogPSBlZGdlOyAgICAgICAgICAgCi0gIHJldHVybiBlZGdlOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzEiPjwvYT48aDM+IEEgc2ltcGxlIFNXSUcgaW50ZXJmYWNlIGZpbGU8L2gzPgotU28gZmFyLCB0aGUgY29kZSBkb2Vzbid0IGRvIG11Y2gsIGJ1dCBpdCdzIGVub3VnaCB0byB3cmFwIGludG8gUGVybDUgbW9kdWxlLiAgU2luY2UgdGhlIEMgY29kZSBpcyBmYWlybHkgc2ltcGxlIHJpZ2h0IG5vdywgd2UgY2FuIGRvIHRoaXMgYnkgY3JlYXRpbmcgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBncmFwaAotJXsKLSNpbmNsdWRlICJncmFwaC5oIgotJX0KLSVpbmNsdWRlIGdyYXBoLmggICAgICAgICAgICAgLy8gR2V0IHN0cnVjdHVyZSBkZWZpbml0aW9uCi0laW5jbHVkZSBncmFwaC5jICAgICAgICAgICAgIC8vIEdldCBzdXBwb3J0IGZ1bmN0aW9ucwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XZSdsbCBjYWxsIG91ciBtb2R1bGUgImdyYXBoIiBhbmQgc2ltcGx5IHJlYWQgaW4gYm90aCB0aGUgZmlsZXMgPHR0PmdyYXBoLmg8L3R0PiBhbmQgPHR0PmdyYXBoLmM8L3R0PiB0byBidWlsZCBhbiBpbnRlcmZhY2UuICAgPHA+Ci08YSBuYW1lPSJuMzIiPjwvYT48aDM+IFNhbXBsZSBQZXJsIFNjcmlwdDwvaDM+Ci1PbmNlIGNvbXBpbGVkLCB3ZSBjYW4gbm93IHN0YXJ0IHVzaW5nIG91ciBuZXcgbW9kdWxlLiAgIEFsbCBvZiB0aGUgQyBmdW5jdGlvbnMgZm91bmQgaW4gPHR0PmdyYXBoLmg8L3R0PiBhbmQgPHR0PmdyYXBoLmM8L3R0PiBjYW4gYmUgY2FsbGVkIG5vcm1hbGx5IC4gICBFdmVuIHRob3VnaCB3ZSBhcmUgdXNpbmcgcG9pbnRlcnMsIHRoaXMgaXMgbm90IGEgcHJvYmxlbS4gIEhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSBzY3JpcHQgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSMgUGVybCBjb2RlIHRvIHVzZSBvdXIgZ3JhcGggY29kZQotCi11c2UgZ3JhcGg7Ci1wYWNrYWdlIGdyYXBoOwotCi0jIENyZWF0ZSBzb21lIG5vZGVzCi0kbjAgPSBuZXdfTm9kZSgpOwotJG4xID0gbmV3X05vZGUoKTsKLSRuMiA9IG5ld19Ob2RlKCk7Ci0KLSMgTWFrZSBzb21lIGVkZ2VzCi1Ob2RlX2FkZGVkZ2UoJG4wLCRuMSwwKTsgICAgICAgICMgIDAgLSZndDsgMQotTm9kZV9hZGRlZGdlKCRuMCwkbjIsMCk7ICAgICAgICAjICAwIC0mZ3Q7IDIKLU5vZGVfYWRkZWRnZSgkbjEsJG4yLDApOyAgICAgICAgIyAgMSAtJmd0OyAyCi1Ob2RlX2FkZGVkZ2UoJG4yLCRuMCwwKTsgICAgICAgICMgIDIgLSZndDsgMAotCi0jIEEgcHJvY2VkdXJlIHRvIHByaW50IG91dCBhIG5vZGUgYW5kIGl0cyBhZGphY2VuY3kgbGlzdAotc3ViIHByaW50X25vZGUgewotCW15ICRub2RlID0gc2hpZnQ7Ci0gICAgCXByaW50ICJOb2RlIDogIiwgTm9kZV92X2dldCgkbm9kZSksICIsIEFkaiA6ICI7Ci0gICAgCW15ICRhZGogPSBOb2RlX2Fkal9nZXQoJG5vZGUpOwotICAgIAl3aGlsZSAoZGVmaW5lZCgkYWRqKSkgeyAgICAgICAgICAgICAgICAgICMgVGhpcyBjaGVja3MgZm9yIGEgTlVMTCBwb2ludGVyCi0JCW15ICRhbm9kZSA9IEVkZ2Vfbm9kZV9nZXQoJGFkaik7Ci0JCW15ICR2ID0gTm9kZV92X2dldCgkYW5vZGUpOwotCQlwcmludCAiJHYgIjsKLQkJJGFkaiA9IEVkZ2VfbmV4dF9nZXQoJGFkaik7ICAgICAgICMgTW92ZSB0byBuZXh0IG5vZGUKLSAgICAJfQotICAgIAlwcmludCAiXG4iOwotfQotCi0jIFByaW50IG91dCBub2RlIGluZm9ybWF0aW9uCi1wcmludF9ub2RlKCRuMCk7Ci1wcmludF9ub2RlKCRuMSk7Ci1wcmludF9ub2RlKCRuMik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gZXhlY3V0ZWQsIHRoaXMgc2NyaXB0IHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5Ob2RlIDogMCwgQWRqIDogMiAxIAotTm9kZSA6IDEsIEFkaiA6IDIgCi1Ob2RlIDogMiwgQWRqIDogMCAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGlsZSBvdXIgdHdvIEMgZnVuY3Rpb25zIGFyZSB1c2VkIGluIHRoZSBzY3JpcHQsIFNXSUcgYWxzbyBjcmVhdGVkIGEgY29sbGVjdGlvbiBvZiBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHRoZSB0d28gQyBkYXRhIHN0cnVjdHVyZXMuICAgVGhlIGZ1bmN0aW9ucyA8dHQ+Tm9kZV92X2dldCgpPC90dD4sIDx0dD5Ob2RlX2Fkal9nZXQoKTwvdHQ+LCAgPHR0PkVkZ2Vfbm9kZV9nZXQoKTwvdHQ+LCBhbmQgPHR0PkVkZ2VfbmV4dF9nZXQoKTwvdHQ+IGFyZSB1c2VkIHRvIGFjY2VzcyAgdGhlIGNvcnJlc3BvbmRpbmcgbWVtYmVycyBvZiBvdXIgPHR0Pk5vZGU8L3R0PiBhbmQgPHR0PkVkZ2U8L3R0PiBzdHJ1Y3R1cmVzLiAgICBBcyBhcmd1bWVudHMsIHRoZXNlIGZ1bmN0aW9ucyBzaW1wbHkgdGFrZSBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0dXJlLjxwPgotPHA+Ci1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgdGhpbmdzIHRvIG5vdGljZSBhYm91dCB0aGUgY29kZS48cD4KLTxwPgotPHVsPgotPGxpPlBvaW50ZXJzIHRvIGNvbXBsZXggb2JqZWN0cyBhcmUgbWFuaXB1bGF0ZWQgbGlrZSBvcmRpbmFyeSBzY2FsYXIgdmFsdWVzLCBidXQgaW4gcmVhbGl0eSB0aGV5IGFyZSBibGVzc2VkIHJlZmVyZW5jZXMuICBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgeW91IHNob3VsZCB0aGluayBvZiB0aGVtIGFzIGZ1bm55IG9wYXF1ZSBvYmplY3RzIChpbiBvdGhlciB3b3JkcywgZG9uJ3Qgd29ycnkgYWJvdXQgaXQpLgotPGxpPlRvIGNoZWNrIGZvciBhIE5VTEwgcG9pbnRlciwgdXNlIHRoZSBleHByZXNzaW9uIDx0dD5kZWZpbmVkKCRwdHIpPC90dD4uICBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgYSBwb2ludGVyIGlzIG5vbi1OVUxMLCBmYWxzZSBpZiBpdCBpc24ndC4gICBJbiBvdXIgZXhhbXBsZSwgd2UgdXNlIHRoaXMgdG8gd2FsayBkb3duIGEgbGlua2VkIGxpc3Qgb2YgcG9pbnRlcnMgdW50aWwgd2UgcmVhY2ggYSBOVUxMIHZhbHVlLgotPC91bD4KLTxwPgotRXZlbiB0aG91Z2ggdGhlIG9yaWdpbmFsIEMgY29kZSB3YXMgcmF0aGVyIHVzZWxlc3MgYnkgaXRzZWxmLCAgd2UgaGF2ZSB1c2VkIGl0IHRvIGJ1aWxkIGEgc2ltcGxlIGdyYXBoIGluIFBlcmwgYWxvbmcgd2l0aCBhIGRlYnVnZ2luZyBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgb3V0IG5vZGUgaW5mb3JtYXRpb24uICBJbiBmYWN0LCB3aXRob3V0IG1ha2luZyBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgQyBjb2RlLCB3ZSBjYW4gdXNlIHRoaXMgdG8gYnVpbGQgdXAgc29tZXRoaW5nIG1vcmUgY29tcGxleCBzdWNoIGFzIGEgZGF0YWJhc2Ugb2YgY2l0aWVzIGFuZCBtaWxlYWdlcy4gPHA+Ci08cD4KLTxlbT5Tb21lIGNpdGllcyBhbmQgbWlsZWFnZXM8L2VtPjxwPgotPHA+Ci1IZXJlJ3MgYSBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIFBlcmwgc2NyaXB0IHRvIHJlYWQgaW4gdGhlIGFib3ZlIG1pbGVhZ2UgdGFibGUgYW5kIHR1cm4gaXQgaW50byBhIGdyYXBoOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgUmVhZCBhIGZpbGUgd2l0aCBjaXRpZXMgaW50byBhIGdyYXBoCi0KLXVzZSBncmFwaDsKLXBhY2thZ2UgZ3JhcGg7Ci0KLSVDaXRpZXMgPSAoKTsgICAgICAgICAgICAgICMgSGFzaCB0YWJsZSBtYXBwaW5nIGNpdGllcyB0byBub2RlcwotJU5vZGVzID0gKCk7ICAgICAgICAgICAgICAgIyBNYXBwaW5nIG9mIE5vZGUgaW5kaWNpZXMgdG8gY2l0aWVzCi1zdWIgcmVhZF9jaXRpZXMgewotICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OwotICAgIG9wZW4oQ0lUSUVTLCRmaWxlbmFtZSk7Ci0gICAgd2hpbGUgKCZsdDtDSVRJRVMmZ3Q7KSB7Ci0JCWNob3A7Ci0JCW15IEBhID0gc3BsaXQoLywgKy8pOwotCQlteSAkbm9kZTE7Ci0JCW15ICRub2RlMjsKLQkJIyBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiBjaXR5IGlzIGFscmVhZHkgYSBub2RlCi0JCWlmICghZXhpc3RzICRDaXRpZXN7JGFbMF19KSB7Ci0JCQkkbm9kZTEgPSBuZXdfTm9kZSgpOwotCQkJJENpdGllc3skYVswXX0gPSAkbm9kZTE7Ci0JCQlteSAkbm9kZV9udW0gPSBOb2RlX3ZfZ2V0KCRub2RlMSk7Ci0JCQkkTm9kZXN7JG5vZGVfbnVtfSA9ICRhWzBdOwotCQl9IGVsc2UgewotCQkJJG5vZGUxID0gJENpdGllc3skYVswXX07Ci0JCX0KLQkJaWYgKCFleGlzdHMgJENpdGllc3skYVsxXX0pIHsKLQkJCSRub2RlMiA9IG5ld19Ob2RlKCk7Ci0JCQkkQ2l0aWVzeyRhWzFdfSA9ICRub2RlMjsKLQkJCW15ICRub2RlX251bSA9IE5vZGVfdl9nZXQoJG5vZGUyKTsKLQkJCSROb2Rlc3skbm9kZV9udW19ID0gJGFbMV07Ci0JCX0gZWxzZSB7Ci0JCQkkbm9kZTIgPSAkQ2l0aWVzeyRhWzFdfTsKLQkJfQotCQkjIEFkZCBlZGdlcwotCQlOb2RlX2FkZGVkZ2UoJG5vZGUxLCRub2RlMiwkYVsyXSk7Ci0JCU5vZGVfYWRkZWRnZSgkbm9kZTIsJG5vZGUxLCRhWzJdKTsKLQl9Ci19Ci0KLQotCi1zdWIgcHJpbnRfbmVhciB7Ci0gICAgbXkgJGNpdHkgPSBzaGlmdDsKLSAgICBpZiAoZXhpc3RzICRDaXRpZXN7JGNpdHl9KSB7Ci0JCW15ICRub2RlID0gJENpdGllc3skY2l0eX07Ci0JCXByaW50ICJDaXRpZXMgbmVhciAkY2l0eSA6ICI7Ci0JCW15ICRhZGogPSBOb2RlX2Fkal9nZXQoJG5vZGUpOwotCQl3aGlsZSAoZGVmaW5lZCgkYWRqKSkgewotCQkJIG15ICRhbm9kZSA9IEVkZ2Vfbm9kZV9nZXQoJGFkaik7Ci0JCQkgbXkgJHYgPSBOb2RlX3ZfZ2V0KCRhbm9kZSk7Ci0JCQkgcHJpbnQgJE5vZGVzeyR2fSwiLCAiOwotCQkJICRhZGogPSBFZGdlX25leHRfZ2V0KCRhZGopOwotCQl9Ci0gICAgfQotICAgIHByaW50ICJcbiI7Ci19Ci1yZWFkX2NpdGllcygiY2l0aWVzIik7Ci1wcmludF9uZWFyKCJEZW52ZXIiKTsKLXByaW50X25lYXIoIkxhcyBWZWdhcyIpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5DaXRpZXMgbmVhciBEZW52ZXIgOiBNb2FiLCBLYW5zYXMgQ2l0eSwgU2FudGEgRmUsIENoZXllbm5lLCBBbGJ1cXVlcnF1ZSwgCi1DaXRpZXMgbmVhciBMYXMgVmVnYXMgOiBGbGFnc3RhZmYsIExvcyBBbmdlbGVzLCBNb2FiLCBTYWx0IExha2UgQ2l0eSwgCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgZXhhbXBsZSwgd2UgYXJlIHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9ucyBhcyBiZWZvcmUsIGJ1dCB3ZSBhcmUgbm93IGludHJvZHVjaW5nIHR3byBQZXJsIGhhc2ggdGFibGVzLiAgIFRoZSA8dHQ+JUNpdGllczwvdHQ+IGhhc2ggaXMgdXNlZCB0byBhc3NvY2lhdGUgY2l0eSBuYW1lcyB3aXRoIGEgY29ycmVzcG9uZGluZyBub2RlIGluIHRoZSBncmFwaC4gIFRoZSA8dHQ+JU5vZGVzPC90dD4gaGFzaCBkb2VzIGV4YWN0bHkgdGhlIG9wcG9zaXRlLS0tbWFwcGluZyBub2RlIG51bWJlcnMgYmFjayB0byB0aGUgbmFtZXMgb2YgY2l0aWVzLiAgIEJvdGggb2YgdGhlc2Ugd2lsbCBjb21lIGluIHF1aXRlIGhhbmR5IGZvciBtYXBwaW5nIHRoaW5ncyBiZXR3ZWVuIHRoZSBQZXJsIHdvcmxkIGFuZCB0aGUgQyB3b3JsZCBsYXRlci48cD4KLTxwPgotQmVmb3JlIHByb2NlZWRpbmcsIGxldCdzIHN0b3AgYW5kIHN1bW1hcml6ZSB3aGF0IHdlIGhhdmUgZG9uZS4gICAgIEdpdmVuIGEgY291cGxlIG9mIHZlcnkgc2ltcGxlIEMgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIGdyYXBoLCB3ZSBoYXZlIHdyaXR0ZW4gYSBwcm9ncmFtIHRoYXQgY2FuIHJlYWQgaW4gYSBtaWxlYWdlIHRhYmxlLCBjb25zdHJ1Y3QgYSB3ZWlnaHRlZCBncmFwaCBvZiB0aGUgZGF0YSBhbmQgcHJpbnQgb3V0IGEgbGlzdCBvZiB0aGUgY2l0aWVzIHRoYXQgYXJlIG5lYXJieSBvdGhlciBjaXRpZXMuICAgICBZZXQsIHRoZSBDIGNvZGUga25vd3Mgbm90aGluZyBhYm91dCB0aGUgUGVybCBpbnRlcmZhY2Ugb3IgdGhpcyB3aG9sZSBtaWxlYWdlIHByb2dyYW0gd2UndmUgYnVpbHQgdXAgYXJvdW5kIGl0LiAgICAgV2hpbGUgd2UgY291bGQgaGF2ZSB3cml0dGVuIHRoZSBlbnRpcmUgcHJvZ3JhbSBpbiBDLCB3ZSB3b3VsZCBoYXZlIGhhZCB0byB3cml0ZSBhIG1haW4gcHJvZ3JhbSwgc29tZSBjb2RlIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUsIGFuZCBhIGhhc2ggdGFibGUgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG1hcHBpbmcgYmV0d2VlbiBub2RlcyBhbmQgY2l0aWVzLiAgUGVybCwgb24gdGhlIG90aGVyIGhhbmQsIGlzIHZlcnkgZ29vZCBhdCBtYW5hZ2luZyB0aGVzZSB0YXNrcy48cD4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBBY2Nlc3NpbmcgYXJyYXlzIGFuZCBvdGhlciBzdHJhbmdlIG9iamVjdHM8L2gyPgotTm93IGxldCdzIGFkZCBzb21lIG5ldyBmdW5jdGlvbmFsaXR5IHRvIG91ciBncmFwaCBwcm9ncmFtIGZyb20gdGhlIHByZXZpb3VzIGV4YW1wbGUuICBJbiB0aGlzIGNhc2UsIHdlJ2xsIGFkZCBhIGRlcHRoLWZpcnN0IHNlYXJjaCBhbGdvcml0aG0gdG8gc2VlIGlmIHR3byBub2RlcyBhcmUgY29ubmVjdGVkIHRvIGVhY2ggb3RoZXIgKHBvc3NpYmx5IHRocm91Z2ggbWFueSBvdGhlciBub2RlcyBpbi1iZXR3ZWVuKS4gIDxwPgotPHA+Ci1XZSdsbCBmaXJzdCBhZGQgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgdG8gdGhlIGZpbGUgPHR0PmdyYXBoLmg8L3R0PjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEZpbGUgOiBncmFwaC5oICovCi0uLi4KLSNkZWZpbmUgTUFYX05PREVTICAgMTAwMAotI2RlZmluZSBVTlNFRU4gICAgICAtMQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3csIGEgIG1vZGlmaWVkIHZlcnNpb24gb2YgPHR0PmdyYXBoLmM8L3R0PiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGdyYXBoLmMgKi8KLS8qIERpcmVjdGVkIGdyYXBoIGZ1bmN0aW9ucyAqLwotCi0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICJncmFwaC5oIgotCi1pbnQgbm9kZV9jb3VudCA9IDA7ICAgICAgICAgIC8qIE51bWJlciBvZiBub2RlcyBjcmVhdGVkICAgICAqLwotaW50IHNlZW5bTUFYX05PREVTXTsgICAgICAgICAvKiBVc2VkIGJ5IHRoZSBzZWFyY2ggZnVuY3Rpb24gKi8KLQotLi4uCi0KLS8qIEZ1bmN0aW9uIHRvIHNlYXJjaCBmb3Igbm9kZSB3aXRoIGdpdmVuIHZlcnRleCBudW1iZXIgKi8KLXN0YXRpYyBpbnQgdmlzaXQoTm9kZSAqbixpbnQgdikgewotICBFZGdlICplOwotCi0gIGlmIChzZWVuW24tJmd0O3ZdICE9IFVOU0VFTikgcmV0dXJuIFVOU0VFTjsgIC8qIEN5Y2xlIGRldGVjdGVkICovCi0gIGlmIChuLSZndDt2ID09IHYpIHJldHVybiAxOyAgICAgICAgICAgICAgICAgIC8qIE1hdGNoIGZvdW5kICAgICovCi0gIGUgPSBuLSZndDthZGo7Ci0gIHdoaWxlIChlKSB7Ci0gICAgc2VlbltuLSZndDt2XSA9IGUtJmd0O25vZGUtJmd0O3Y7Ci0gICAgaWYgKHZpc2l0KGUtJmd0O25vZGUsdikgJmd0OyAwKSByZXR1cm4gMTsgICAgIAotICAgIGUgPSBlLSZndDtuZXh0OwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIERlcHRoLWZpcnN0IHNlYXJjaCBmb3IgYSBnaXZlbiBub2RlICovCi1pbnQgTm9kZV9zZWFyY2goTm9kZSAqc3RhcnQsIGludCB2KSB7Ci0gIGludCBpOwotICAKLSAgZm9yIChpID0gMDsgaSAmbHQ7IG5vZGVfY291bnQ7IGkrKykKLSAgICBzZWVuW2ldID0gVU5TRUVOOwotICByZXR1cm4gdmlzaXQoc3RhcnQsdik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBpZGVhIGhlcmUgaXMgc2ltcGxlLCB0aGUgZnVuY3Rpb24gPHR0Pk5vZGVfc2VhcmNoKCk8L3R0PiB0YWtlcyBhIHN0YXJ0aW5nIG5vZGUgYW5kIHN0YXJ0cyBsb29raW5nIGZvciBhIG5vZGUgd2l0aCBnaXZlbiB2ZXJ0ZXguICAgVXBvbiBzdGFydHVwLCB0aGUgc2VhcmNoIGZ1bmN0aW9uIGNsZWFycyBhbiBhcnJheSBvZiB2YWx1ZXMgaW5kaWNhdGluZyB3aGV0aGVyIGEgbm9kZSBoYXMgYmVlbiBzZWVuIG9yIG5vdC4gICBXaGlsZSB0aGlzIGFycmF5IGlzIHByaW1hcmlseSB1c2VkIHRvIGRldGVjdCBjeWNsZXMsIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gc3RvcmUgdGhlIHBhdGggYmV0d2VlbiB0d28gbm9kZXMgYXMgd2UgcHJvY2VlZCB0aHJvdWdoIHRoZSBhbGdvcml0aG0uICAgVXBvbiBleGl0LCB3ZSBjYW4gdGhlbiB1c2UgdGhlIGFycmF5IHRvIGZpZ3VyZSBvdXQgaG93IHdlIGdvdCBiZXR3ZWVuIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIG5vZGUuICAgIE9mIGNvdXJzZSwgdGhpcyBsZWFkcyB1cyB0byB0aGUgcXVlc3Rpb24gb2YgaG93IHdlIGFjY2VzcyB0aGlzIGFycmF5IGluIFBlcmwuPHA+Ci08cD4KLUFzIGEgZ2VuZXJhbCBydWxlLCBoYW5kbGluZyBhcnJheXMgaXMgc29tZXdoYXQgcHJvYmxlbWF0aWMgc2luY2UgdGhlIG1hcHBpbmcgYmV0d2VlbiBhcnJheXMgYW5kIHBvaW50ZXJzIG1heSBub3QgYmUgd2hhdCB5b3UgZXhwZWN0IChldmVuIGluIEMpIGFuZCB0aGVyZSBpcyBub3QgbmVjZXNzYXJpbHkgYSBuYXR1cmFsIG1hcHBpbmcgYmV0d2VlbiBhcnJheXMgaW4gQyBhbmQgYXJyYXlzIGluIFBlcmwgKGZvciBleGFtcGxlLCBpZiB3ZSd2ZSBnb3QgYSBDIGFycmF5IHdpdGggMSBtaWxsaW9uIGVsZW1lbnRzIGluIGl0LCB3ZSBhbG1vc3QgY2VydGFpbmx5IHdvdWxkbid0IHdhbnQgdG8gY29udmVydCBpdCB0byBhIFBlcmwgYXJyYXkhKS48cD4KLTxwPgotVG8gYWNjZXNzIG91ciBhcnJheSwgd2Ugd2lsbCB3cml0ZSBhIEMgaGVscGVyIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBpbnZpZHVhbCBlbGVtZW50cy4gICBIb3dldmVyLCByYXRoZXIgdGhhbiBhZGRpbmcgdGhpcyBmdW5jdGlvbiB0byB0aGUgQyBjb2RlLCB3ZSBjYW4gaW5zZXJ0IGl0IGRpcmVjdGx5IGludG8gb3VyIFNXSUcgaW50ZXJmYWNlIGZpbGUuICAgIFdlIHdpbGwgYWxzbyBzdHJpcCB0aGUgZnVuY3Rpb24gbmFtZXMgb3V0IG9mIHRoZSA8dHQ+LmM8L3R0PiBmaWxlIGFuZCBwdXQgdGhlaXIgcHJvdG90eXBlcyBpbiB0aGUgaGVhZGVyIGZpbGUgOiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdyYXBoCi0lewotI2luY2x1ZGUgImdyYXBoLmgiCi0lfQotJWluY2x1ZGUgZ3JhcGguaAotCi0laW5saW5lICV7Ci0vKiBHZXQgc2VlbiB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIG5vZGUgICovCi1pbnQgZ2V0X3NlZW4oaW50IGluZGV4KSB7Ci0gIGV4dGVybiBpbnQgbm9kZV9jb3VudDsKLSAgZXh0ZXJuIGludCBzZWVuW107Ci0gIGlmICgoaW5kZXggJmx0OyAwKSB8fCAoaW5kZXggJmd0Oz0gbm9kZV9jb3VudCkpIHJldHVybiAtMTsKLSAgZWxzZSByZXR1cm4gc2VlbltpbmRleF07Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIGludGVyZmFjZSBmaWxlIGlsbHVzdHJhdGVzIG9uZSBvZiB0aGUga2V5IHBvaW50cyBhYm91dCBTV0lHLS1ldmVuIHRob3VnaCBTV0lHIHVzZXMgQyBzeW50YXgsIHdyYXBwaW5nIGFyYml0cmFyeSBDIGNvZGUgZG9lc24ndCBhbHdheXMgcmVzdWx0IGluIGEgZ29vZCBpbnRlcmZhY2UuICBBbG1vc3QgYW55IHNpZ25pZmljYW50IHBhY2thZ2Ugd2lsbCByZXF1aXJlIHRoZSB1c2Ugb2YgIGEgZmV3ICJoZWxwZXIiIGZ1bmN0aW9ucyB0byBnZXQgYXQgY2VydGFpbiBkYXRhIHN0cnVjdHVyZXMgb3IgdG8gY2hhbmdlIHRoZSB3YXkgaW4gd2hpY2ggYSBmdW5jdGlvbiBpcyBjYWxsZWQuICAgPHA+Ci08cD4KLVdpdGggb3VyIG5ldyBDIHNlYXJjaCBmdW5jdGlvbiwgd2UgY2FuIG5vdyB3cml0ZSBhIFBlcmwgZnVuY3Rpb24gdG8gZmluZCBhIHJvdXRlIGJldHdlZW4gdHdvIGNpdGllcy4gIFRoaXMgZnVuY3Rpb24gc2ltcGx5IHRha2VzIHRoZSBuYW1lcyBvZiB0d28gY2l0aWVzLCB1c2VzIHRoZSA8dHQ+Q2l0aWVzPC90dD4gaGFzaCB0byBsb29rIHVwIHRoZWlyIG5vZGVzIGFuZCBjYWxscyB0aGUgQyA8dHQ+Tm9kZV9zZWFyY2goKTwvdHQ+IGZ1bmN0aW9uLiAgIEFmdGVyd2FyZHMsIHdlIHdhbGsgdGhyb3VnaCB0aGUgPHR0PnNlZW5bXTwvdHQ+IGFycmF5IHVzaW5nIG91ciBoZWxwZXIgZnVuY3Rpb24gYW5kIHByaW50IHRoZSByb3V0ZS48cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1zdWIgZmluZF9yb3V0ZSB7Ci0gICAgbXkgJHN0YXJ0ID0gc2hpZnQ7Ci0gICAgbXkgJGRlc3QgPSBzaGlmdDsKLSAgICAjIExvb2t1cCBub2RlcyBmcm9tIG5hbWVzCi0gICAgaWYgKCghZXhpc3RzICRDaXRpZXN7JHN0YXJ0fSkgfHwgKCFleGlzdHMgJENpdGllc3skZGVzdH0pKSB7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBteSAkbm9kZTEgPSAkQ2l0aWVzeyRzdGFydH07Ci0gICAgbXkgJG5vZGUyID0gJENpdGllc3skZGVzdH07Ci0gICAgcHJpbnQgIiRzdGFydCAtLSZndDsgJGRlc3QgOlxuIjsKLQotICAgICMgRGVwdGggZmlyc3Qgc2VhcmNoIGZvciBhIHJvdXRlIGJldHdlZW4gY2l0aWVzCi0gICAgbXkgJGZvdW5kID0gTm9kZV9zZWFyY2goJG5vZGUxLE5vZGVfdl9nZXQoJG5vZGUyKSk7Ci0gICAgaWYgKCRmb3VuZCkgewotCSR2ID0gTm9kZV92X2dldCgkbm9kZTEpOwotCXdoaWxlICgkdiAhPSAkVU5TRUVOKSB7Ci0JICAgIHByaW50ICIgICAgJE5vZGVzeyR2fVxuIjsKLQkgICAgJHYgPSBnZXRfc2Vlbigkdik7Ci0JfQotICAgIH0gZWxzZSB7Ci0JcHJpbnQgIiAgICBZb3UgY2FuJ3QgZ2V0IHRoZXJlIGZyb20gaGVyZVxuIjsKLSAgICB9Ci19Ci0gICAgCi1yZWFkX2NpdGllcygiY2l0aWVzIik7Ci1maW5kX3JvdXRlKCJTYWx0IExha2UgQ2l0eSIsIkRlbnZlciIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1PZiBjb3Vyc2UsIGRlcHRoIGZpcnN0IHNlYXJjaCBpc24ndCB2ZXJ5IGdvb2QgYXQgZmluZGluZyBhbiBvcHRpbWFsIHJvdXRlLS0tb2J2aW91c2x5IHRoaXMgb3V0cHV0IG11c3QgYmUgdGhlIHZlcnkgc2NlbmljIHJvdXRlITxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlNhbHQgTGFrZSBDaXR5IC0tJmd0OyBEZW52ZXIgOgotICAgIFNhbHQgTGFrZSBDaXR5Ci0gICAgVHdpbiBGYWxscwotICAgIEJvaXNlCi0gICAgUG9ydGxhbmQKLSAgICBFdWdlbmUKLSAgICBTYW4gRnJhbmNpc2NvCi0gICAgTG9zIEFuZ2VsZXMKLSAgICBMYXMgVmVnYXMKLSAgICBGbGFnc3RhZmYKLSAgICBBbGJ1cXVlcnF1ZQotICAgIFNhbnRhIEZlCi0gICAgRHVyYW5nbwotICAgIE1vYWIKLSAgICBEZW52ZXIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im43Ij48L2E+PGgyPiBJbXBsZW1lbnRpbmcgbWV0aG9kcyBpbiBQZXJsPC9oMj4KLU9idmlvdXNseSwgb3VyIGRlcHRoIHNlYXJjaCBhbGdvcml0aG0gaXNuJ3Qgc28gdXNlZnVsIGluIHRoaXMgc3BlY2lmaWMgYXBwbGljYXRpb24uICAgUGVyaGFwcyB3ZSB3b3VsZCBsaWtlIHRvICB0cnkgYSBicmVhZHRoLWZpcnN0IHNlYXJjaCBhbGdvcml0aG0gaW5zdGVhZC4gICAgV2UgY291bGQgY2hvb3NlIHRvIHdyaXRlIGl0IGluIEMsIGJ1dCB0aGUgYnJlYWR0aCBmaXJzdCBzZWFyY2ggYWxnb3JpdGhtIGRlcGVuZHMgb24gdGhlIHVzZSBvZiBhIHF1ZXVlIHRvIGhvbGQgdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gdmlzaXQuICBUaHVzLCB3ZSdkIGhhdmUgdG8gd3JpdGUgYSBxdWV1ZSBkYXRhIHN0cnVjdHVyZSBmaXJzdC4gICBIb3dldmVyLCBhIFBlcmwgYXJyYXkgc21lbGxzIGFsb3QgbGlrZSBhIHF1ZXVlIGlmIHdlIG1hbmlwdWxhdGUgaXQgaW4gdGhlIHJpZ2h0IHdheS4gIFNvIHdlIGNhbiB1c2UgUGVybCB0byBjb21lIHVwIHdpdGggYSBxdWljayBhbmQgZGlydHkgYnJlYWR0aCBmaXJzdCBzZWFyY2ggd2l0aG91dCBkcm9wcGluZyBkb3duIGludG8gQyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXZpc2l0ID0gKCk7Ci1zdWIgYnJlYWR0aF9zZWFyY2ggewotICAgIG15ICRub2RlMSA9IHNoaWZ0OwotICAgIG15ICRub2RlMiA9IHNoaWZ0OwotICAgIG15IEBxdWV1ZTsKLSAgICAldmlzaXQgPSAoKTsKLSAgICAjIFB1dCBzdGFydGluZyBub2RlIGludG8gcXVldWUKLSAgICBwdXNoIEBxdWV1ZSwgJG5vZGUxOwotICAgICR2aXNpdHtOb2RlX3ZfZ2V0KCRub2RlMSl9ID0gTm9kZV92X2dldCgkbm9kZTEpOwotICAgIHdoaWxlIChAcXVldWUpIHsgICAgICAgICAgICAjIExvb3AgdW50aWwgcXVldWUgaXMgZW1wdHkKLQlteSAkbiA9IHNoaWZ0IEBxdWV1ZTsgICAgICMgUG9wIG9mZiBhbiBub2RlCi0JbXkgJG52ID0gTm9kZV92X2dldCgkbik7Ci0JcmV0dXJuIDEgaWYgKCQkbiA9PSAkJG5vZGUyKTsgICAjIEV4aXQgaWYgd2UgZm91bmQgdGhlIGRlc3RpbmF0aW9uCi0JIyBQdXQgY2hpbGRyZW4gb250byB0aGUgcXVldWUKLQlteSAkZSA9IE5vZGVfYWRqX2dldCgkbik7Ci0Jd2hpbGUgKGRlZmluZWQoJGUpKSB7Ci0JICAgIG15ICRtID0gRWRnZV9ub2RlX2dldCgkZSk7Ci0JICAgIG15ICR2ID0gTm9kZV92X2dldCgkbSk7Ci0JICAgIGlmICghZXhpc3RzICR2aXNpdHskdn0pIHsKLQkJcHVzaCBAcXVldWUsICRtOwotCQkkdmlzaXR7JHZ9ID0gJG52OwotCSAgICB9Ci0JICAgICRlID0gRWRnZV9uZXh0X2dldCgkZSk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3ViIGZpbmRfcm91dGUgewotICAgIG15ICRzdGFydCA9IHNoaWZ0OwotICAgIG15ICRkZXN0ID0gc2hpZnQ7Ci0gICAgIyBMb29rdXAgbm9kZXMgZnJvbSBuYW1lcwotICAgIHJldHVybiBpZiAoKCFleGlzdHMgJENpdGllc3skc3RhcnR9KSB8fCAoIWV4aXN0cyAkQ2l0aWVzeyRkZXN0fSkpOwotICAgIHByaW50ICIkc3RhcnQgLS0mZ3Q7ICRkZXN0IDpcbiI7Ci0gICAgbXkgJG5vZGUxID0gJENpdGllc3skc3RhcnR9OwotICAgIG15ICRub2RlMiA9ICRDaXRpZXN7JGRlc3R9OwotICAgIG15ICRmb3VuZCA9IGJyZWFkdGhfc2VhcmNoKCRub2RlMSwkbm9kZTIpOwotICAgIG15IEBwYXRoOwotICAgIGlmICgkZm91bmQpIHsKLQlteSAkdiA9IE5vZGVfdl9nZXQoJG5vZGUyKTsKLQlkZWxldGUgJHZpc2l0e05vZGVfdl9nZXQoJG5vZGUxKX07Ci0Jd2hpbGUgKGV4aXN0cygkdmlzaXR7JHZ9KSkgewotCSAgICB1bnNoaWZ0IEBwYXRoLCROb2Rlc3skdn07Ci0JICAgICR2ID0gJHZpc2l0eyR2fTsKLQl9Ci0JdW5zaGlmdCBAcGF0aCwkc3RhcnQ7Ci0JZm9yZWFjaCAkYyAoQHBhdGgpIHsgcHJpbnQgIiAgICAkY1xuIjt9Ci0gICAgfSBlbHNlIHsKLQlwcmludCAiICAgIFlvdSBjYW4ndCBnZXQgdGhlcmUgZnJvbSBoZXJlXG4iOwotICAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotT3VyIFBlcmwgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIHF1ZXVlIHVzaW5nIGFuIGFycmF5IGFuZCBtYW5pcHVsYXRpbmcgaXQgd2l0aCBzaGlmdCBhbmQgcHVzaCBvcGVyYXRpb25zLiAgIFRoZSBnbG9iYWwgaGFzaCA8dHQ+JXZpc2l0PC90dD4gaXMgdXNlZCB0byBkZXRlY3QgY3ljbGVzIGFuZCB0byBkZXRlcm1pbmUgaG93IHdlIGdvdCB0byBlYWNoIG5vZGUuICAgIFdoZW4gd2UgZmluZCBhIHJvdXRlLCB3ZSBjYW4gbWFyY2ggYmFja3dhcmRzIHRocm91Z2ggdGhlIHJvdXRlIHRvIGRldGVybWluZSB0aGUgZW50aXJlIHBhdGguICAgV2hlbiB3ZSBydW4gb3VyIG5ldyBjb2RlLCB3ZSBnZXQgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZmluZF9yb3V0ZSgiU2FsdCBMYWtlIENpdHkiLCAiRGVudmVyIik7Ci1TYWx0IExha2UgQ2l0eSAtLSZndDsgRGVudmVyIDoKLSAgICBTYWx0IExha2UgQ2l0eQotICAgIENoZXllbm5lCi0gICAgRGVudmVyCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUNsZWFybHkgdGhpcyBpcyBhIG1vcmUgZWZmaWNpZW50IHJvdXRlLS1hbHRob3VnaCBhZG1pdHRlZGx5IG5vdCB2ZXJ5IHNjZW5pYy4gICBJZiB3ZSB3YW50ZWQgdG8gZ2V0IGV2ZW4gbW9yZSBzZXJpb3VzLCB3ZSBjb3VsZCBhZGQgYSBwcmlvcml0eSBzZWFyY2ggYmFzZWQgb24gbWlsZWFnZXMuICAgIExhdGVyIG9uIHdlIG1pZ2h0IGltcGxlbWVudCB0aGVzZSBmZWF0dXJlcyBpbiBDIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuICAgRWl0aGVyIHdheSwgaXQgaXMgcmVhc29uYWJseSBlYXN5IHRvIG1hbmlwdWxhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIGluIFBlcmwgYW5kIHRvIG1peCB0aGVtIHdpdGggQyBjb2RlICh3ZWxsLCB3aXRoIGEgbGl0dGxlIHByYWN0aWNlIHBlcmhhcHMpLiA8cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBTaGFkb3cgY2xhc3NlczwvaDI+Ci1CeSBub3csIHlvdSd2ZSBwcm9iYWJseSBub3RpY2VkIHRoYXQgZXhhbXBsZXMgaGF2ZSBiZWVuIHVzaW5nICBhbG90IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB0byBnZXQgYXQgdGhlIG1lbWJlcnMgb2Ygb3VyIDx0dD5Ob2RlPC90dD4gYW5kIDx0dD5FZGdlPC90dD4gc3RydWN0dXJlcy4gIFRoaXMgdGVuZHMgdG8gbWFrZSB0aGUgUGVybCBjb2RlIGxvb2sgcmF0aGVyIGNsdXR0ZXJlZCAod2VsbCwgbW9yZSB0aGFuIG5vcm1hbCBQZXJsIGNvZGUgaW4gYW55IGNhc2UpIGFuZCBpdCBpc24ndCB2ZXJ5IG9iamVjdCBvcmllbnRlZC48cD4KLTxwPgotV2l0aCBhIGxpdHRsZSBtYWdpYywgU1dJRyBjYW4gdHVybiBDIHN0cnVjdHMgYW5kIEMrKyBjbGFzc2VzIGludG8gZnVsbHkgZnVuY3Rpb25hbCBQZXJsIGNsYXNzZXMgdGhhdCB3b3JrIGluIGEgbW9yZS1vci1sZXNzIG5vcm1hbCBmYXNoaW9uLiAgICAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lIGJ5IHdyaXRpbmcgYW4gYWRkaXRpb25hbCBQZXJsIGxheWVyIHRoYXQgYnVpbGRzIFBlcmwgY2xhc3NlcyBvbiB0b3Agb2YgdGhlIGxvdy1sZXZlbCBTV0lHIGludGVyZmFjZS4gIFRoZXNlIFBlcmwgY2xhc3NlcyBhcmUgc2FpZCB0byAic2hhZG93IiBhbiB1bmRlcmx5aW5nIEMvQysrIGNsYXNzLiAgICA8cD4KLTxwPgotVG8gaGF2ZSBTV0lHIGNyZWF0ZSBzaGFkb3cgY2xhc3NlcywgdXNlIHRoZSA8dHQ+LXNoYWRvdyA8L3R0Pm9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtc2hhZG93IGdyYXBoLmkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgZmlsZXMgYXMgYmVmb3JlIGV4Y2VwdCB0aGF0IHRoZSA8dHQ+LnBtPC90dD4gZmlsZSB3aWxsIG5vdyBjb250YWluIHNpZ25pZmljYW50bHkgbW9yZSBzdXBwb3J0aW5nIFBlcmwgY29kZS4gICBXaGlsZSB0aGVyZSBhcmUgc29tZSByYXRoZXIgc3VidGxlIGFzcGVjdHMgb2YgdGhpcyB0cmFuc2Zvcm1hdGlvbiwgZm9yIG5vdyB3ZSdsbCBvbWl0IHRoZSBkZXRhaWxzIGFuZCBpbGx1c3RyYXRlIHRoZSBjaGFuZ2VzIGluIGFuIGV4YW1wbGUgZmlyc3QgKHRoZSB1c2Ugb2Ygc2hhZG93IGNsYXNzZXMgaGFzIGJlZW4gdW5kZXJsaW5lZCk8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFJlYWQgYSBmaWxlIHdpdGggY2l0aWVzIGludG8gYSBncmFwaAotIyBVc2VzIHNoYWRvdyBjbGFzc2VzCi0KLXVzZSBncmFwaDsKLXBhY2thZ2UgZ3JhcGg7Ci0KLSVDaXRpZXMgPSAoKTsgICAgICAgICAgICAgICMgSGFzaCB0YWJsZSBtYXBwaW5nIGNpdGllcyB0byBub2RlcwotJU5vZGVzID0gKCk7ICAgICAgICAgICAgICAgIyBNYXBwaW5nIG9mIE5vZGUgaW5kaWNpZXMgdG8gY2l0aWVzCi0KLXN1YiByZWFkX2NpdGllcyB7Ci0gICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7Ci0gICAgb3BlbihDSVRJRVMsJGZpbGVuYW1lKTsKLSAgICB3aGlsZSAoJmx0O0NJVElFUyZndDspIHsKLQljaG9wOwotCW15IEBhID0gc3BsaXQoLywgKy8pOwotCW15ICRub2RlMTsKLQlteSAkbm9kZTI7Ci0JIyBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiBjaXR5IGlzIGFscmVhZHkgYSBub2RlCi0JaWYgKCFleGlzdHMgJENpdGllc3skYVswXX0pIHsKLQkgICAgJG5vZGUxID0gbmV3X05vZGUoKTsKLQkgICAgJENpdGllc3skYVswXX0gPSAkbm9kZTE7Ci0JICAgICROb2Rlc3skbm9kZTEtJmd0O3t2fX0gPSAkYVswXTsgICAgICAjIE5vdGUgYWNjZXNzIG9mIGB2JwotCX0gZWxzZSB7Ci0JICAgICRub2RlMSA9ICRDaXRpZXN7JGFbMF19OwotCX0KLQlpZiAoIWV4aXN0cyAkQ2l0aWVzeyRhWzFdfSkgewotCSAgICAkbm9kZTIgPSBuZXdfTm9kZTsKLQkgICAgJENpdGllc3skYVsxXX0gPSAkbm9kZTI7Ci0JICAgICROb2Rlc3skbm9kZTItJmd0O3t2fX0gPSAkYVsxXTsKLQl9IGVsc2UgewotCSAgICAkbm9kZTIgPSAkQ2l0aWVzeyRhWzFdfTsKLQl9Ci0JIyBBZGQgZWRnZXMKLQlOb2RlX2FkZGVkZ2UoJG5vZGUxLCRub2RlMiwkYVsyXSk7Ci0JTm9kZV9hZGRlZGdlKCRub2RlMiwkbm9kZTEsJGFbMl0pOwotICAgIH0KLX0KLQotJXZpc2l0Owotc3ViIGJyZWFkdGhfc2VhcmNoIHsKLSAgICBteSAkbm9kZTEgPSBzaGlmdDsKLSAgICBteSAkbm9kZTIgPSBzaGlmdDsKLSAgICBteSBAcXVldWU7Ci0gICAgJXZpc2l0ID0gKCk7Ci0gICAgbXkgJGRlc3QgPSAkbm9kZTItJmd0O3t2fTsKLSAgICAjIFB1dCBzdGFydGluZyBub2RlIGludG8gcXVldWUKLSAgICBwdXNoIEBxdWV1ZSwgJG5vZGUxOwotICAgICR2aXNpdHskbm9kZTEtJmd0O3t2fX0gPSAkbm9kZTEtJmd0O3t2fTsKLSAgICB3aGlsZSAoQHF1ZXVlKSB7Ci0JbXkgJG4gPSBzaGlmdCBAcXVldWU7Ci0JcmV0dXJuIDEgaWYgKCRuLSZndDt7dn0gPT0gJG5vZGUyLSZndDt7dn0pOwotCSMgUHV0IGNoaWxkcmVuIG9udG8gdGhlIHF1ZXVlCi0JbXkgJGUgPSAkbi0mZ3Q7e2Fkan07Ci0Jd2hpbGUgKGRlZmluZWQoJGUpKSB7Ci0JICAgIGlmICghZXhpc3RzICR2aXNpdHskZS0mZ3Q7e25vZGV9LSZndDt7dn19KSB7Ci0JCXB1c2ggQHF1ZXVlLCAkZS0mZ3Q7e25vZGV9OwotCQkkdmlzaXR7JGUtJmd0O3tub2RlfS0mZ3Q7e3Z9fSA9ICRuLSZndDt7dn07Ci0JICAgIH0KLQkgICAgJGUgPSAkZS0mZ3Q7e25leHR9OwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN1YiBmaW5kX3JvdXRlIHsKLSAgICBteSAkc3RhcnQgPSBzaGlmdDsKLSAgICBteSAkZGVzdCA9IHNoaWZ0OwotICAgICMgTG9va3VwIG5vZGVzIGZyb20gbmFtZXMKLSAgICByZXR1cm4gaWYgKCghZXhpc3RzICRDaXRpZXN7JHN0YXJ0fSkgfHwgKCFleGlzdHMgJENpdGllc3skZGVzdH0pKTsKLSAgICBwcmludCAiJHN0YXJ0IC0tJmd0OyAkZGVzdCA6XG4iOwotICAgIG15ICRub2RlMSA9ICRDaXRpZXN7JHN0YXJ0fTsKLSAgICBteSAkbm9kZTIgPSAkQ2l0aWVzeyRkZXN0fTsKLSAgICBteSAkZm91bmQgPSBicmVhZHRoX3NlYXJjaCgkbm9kZTEsJG5vZGUyKTsKLSAgICBteSBAcGF0aDsKLSAgICBpZiAoJGZvdW5kKSB7Ci0JbXkgJHYgPSAkbm9kZTItJmd0O3t2fTsKLQlkZWxldGUgJHZpc2l0eyRub2RlMS0mZ3Q7e3Z9fTsKLQl3aGlsZSAoZXhpc3RzKCR2aXNpdHskdn0pKSB7Ci0JICAgIHVuc2hpZnQgQHBhdGgsJE5vZGVzeyR2fTsKLQkgICAgJHYgPSAkdmlzaXR7JHZ9OwotCX0KLQl1bnNoaWZ0IEBwYXRoLCRzdGFydDsKLQlmb3JlYWNoICRjIChAcGF0aCkgewotCSAgICBwcmludCAiICAgICRjXG4iOwotCX0KLSAgICB9IGVsc2UgewotCXByaW50ICIgICAgWW91IGNhbid0IGdldCB0aGVyZSBmcm9tIGhlcmVcbiI7Ci0gICAgfQotfQotcmVhZF9jaXRpZXMoImNpdGllcyIpOwotCi1maW5kX3JvdXRlKCJTYWx0IExha2UgQ2l0eSIsIkRlbnZlciIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Gb3IgdGhlIG1vc3QgcGFydCwgdGhlIGNvZGUgaXMgdGhlIHNhbWUgZXhjZXB0IHRoYXQgd2UgY2FuIG5vdyBhY2Nlc3MgbWVtYmVycyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB1c2luZyA8dHQ+LSZndDs8L3R0PiBpbnN0ZWFkIG9mIHRoZSBsb3cgbGV2ZWwgYWNjZXNzb3IgZnVuY3Rpb25zLiBsaWtlIGJlZm9yZS4gIEhvd2V2ZXIsIHRoaXMgZXhhbXBsZSBpcyBvbmx5IHNjcmF0Y2hpbmcgdGhlIHN1cmZhY2Ugb2Ygd2hhdCBjYW4gYmUgZG9uZSB3aXRoIHNoYWRvdyBjbGFzc2VzLi4ua2VlcCByZWFkaW5nLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDI+IEdldHRpbmcgc2VyaW91czwvaDI+Ci1Ob3cgdGhhdCB3ZSd2ZSBnb3QgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIHdvcmtpbmcsIGl0J3MgdGltZSB0byBnZXQgcmVhbGx5IHNlcmlvdXMuICBTdXBwb3NlIHRoYXQgaW4gYWRkaXRpb24gdG8gd29ya2luZyB3aXRoIHRoZSBtaWxlYWdlIGRhdGEgb2YgdmFyaW91cyBjaXRpZXMsIHdlIHdhbnQgdG8gbWFrZSBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBmcm9tIGdlb2dyYXBoaWNhbCBkYXRhIChsYXR0aXR1ZGUvbG9uZ2l0dWRlKS4gICAgIFRvIGRvIHRoaXMsIHdlJ2xsIHVzZSBTV0lHIHRvICBnbHVlIHRvZ2V0aGVyIGEgYnVuY2ggb2Ygc3R1ZmYuICAgRmlyc3QsIGZvciB0aGUgcHVycG9zZXMgb2YgaWxsdXN0cmF0aW9uLCBsZXQncyBjcmVhdGUgYSBuZXcgQyBkYXRhIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBhIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2UgbWlnaHQgd2FudCB0byB1c2UgaXQgaW4gc29tZSBDIGZ1bmN0aW9ucyBsYXRlciA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGxvY2F0aW9uLmggKi8KLS8qIERhdGEgc3RydWN0dXJlIGZvciBob2xkaW5nIGxvbmdpdHVkZSBhbmQgbGF0dGl0dWRlIGluZm9ybWF0aW9uICovCi0KLXR5cGVkZWYgc3RydWN0IExvY2F0aW9uIHsKLSAgY2hhciAgICAqbmFtZTsKLSAgZG91YmxlICBsYXRfZGVncmVlczsKLSAgZG91YmxlICBsYXRfbWludXRlczsKLSAgZG91YmxlICBsYXRfc2Vjb25kczsKLSAgY2hhciAgICBsYXRfZGlyZWN0aW9uOwotICBkb3VibGUgIGxvbmdfZGVncmVlczsKLSAgZG91YmxlICBsb25nX21pbnV0ZXM7Ci0gIGRvdWJsZSAgbG9uZ19zZWNvbmRzOwotICBjaGFyICAgIGxvbmdfZGlyZWN0aW9uOwotfSBMb2NhdGlvbjsKLQotZXh0ZXJuIExvY2F0aW9uICpuZXdfTG9jYXRpb24oY2hhciAqbmFtZSk7Ci0gCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSBhbHNvICBwcm9iYWJseSB3YW50IGEgQyBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgb25lIG9mIHRoZXNlIG9iamVjdHM6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGxvY2F0aW9uLmMgKi8KLSNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKLQotLyogTWFrZSBhIG5ldyBsb2NhdGlvbiAqLwotTG9jYXRpb24gKm5ld19Mb2NhdGlvbihjaGFyICpuYW1lKSB7Ci0gIExvY2F0aW9uICpsOwotICBsID0gKExvY2F0aW9uICopIG1hbGxvYyhzaXplb2YoTG9jYXRpb24pKTsKLSAgbC0mZ3Q7bmFtZSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obmFtZSkrMSk7Ci0gIHN0cmNweShsLSZndDtuYW1lLG5hbWUpOwotICByZXR1cm4gbDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93IGxldCdzIG1ha2UgYW4gaW50ZXJmYWNlIGZpbGUgZm9yIHRoaXMgbW9kdWxlIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBGaWxlIDogbG9jYXRpb24uaQotJW1vZHVsZSBsb2NhdGlvbgotJXsKLSNpbmNsdWRlICJsb2NhdGlvbi5oIgotJX0KLQotJWluY2x1ZGUgbG9jYXRpb24uaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSBjb3VsZCB1c2UgdGhpcyBpbnRlcmZhY2UgZmlsZSB0byBtYWtlIGFuIGVudGlyZWx5IG5ldyBQZXJsNSBtb2R1bGUgb3Igd2UgY2FuIGNvbWJpbmUgaXQgd2l0aCB0aGUgZ3JhcGggbW9kdWxlLiAgICBJbiB0aGlzIGxhdHRlciBjYXNlLCB3ZSBzaW1wbHkgbmVlZCB0byBwdXQgIjx0dD4laW5jbHVkZSBsb2NhdGlvbi5pPC90dD4iIGluIHRoZSBmaWxlIDx0dD5ncmFwaC5pPC90dD4uPHA+Ci08cD4KLU5vdywgZmluYWxseSwgd2UgY291bGQgd3JpdGUgYSBQZXJsIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCA6PHA+Ci08cD4KLTxlbT5HZW9ncmFwaGljIGRhdGE8L2VtPjxwPgotPGJsb2NrcXVvdGU+PHByZT5zdWIgcmVhZF9sb2NhdGlvbnMgewotICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OwotICAgIG9wZW4oTE9DQVRJT05TLCRmaWxlbmFtZSk7Ci0gICAgd2hpbGUgKCZsdDtMT0NBVElPTlMmZ3Q7KSB7Ci0JY2hvcDsKLQlteSBAYSA9IHNwbGl0KC8sICsvKTsKLQlteSAkbG9jOwotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBjaXR5IEkga25vdyBhYm91dAotCWlmIChleGlzdHMgJENpdGllc3skYVswXX0pIHsKLQkgICAgIyBDcmVhdGUgYSBuZXcgbG9jYXRpb24KLQkgICAgJGxvYyA9IG5ld19Mb2NhdGlvbigkYVswXSk7Ci0JICAgIG15IEBjb29yZHMgPSBzcGxpdCgnICcsJGFbMV0pOwotCSAgICAjIEEgbmljZSB3YXkgdG8gYXNzaWduIGF0dHJpYnV0ZXMgdG8gYW4gb2JqZWN0Ci0JICAgICUkbG9jID0gKGxhdF9kZWdyZWVzID0mZ3Q7ICRjb29yZHNbMF0sCi0JCSAgICAgbGF0X21pbnV0ZXMgPSZndDsgJGNvb3Jkc1sxXSwKLQkJICAgICBsYXRfc2Vjb25kcyA9Jmd0OyAkY29vcmRzWzJdLAotCQkgICAgIGxhdF9kaXJlY3Rpb24gPSZndDsgJGNvb3Jkc1szXSwKLQkJICAgICBsb25nX2RlZ3JlZXMgPSZndDsgJGNvb3Jkc1s0XSwKLQkJICAgICBsb25nX21pbnV0ZXMgPSZndDsgJGNvb3Jkc1s1XSwKLQkJICAgICBsb25nX3NlY29uZHMgPSZndDsgJGNvb3Jkc1s2XSwKLQkJICAgICBsb25nX2RpcmVjdGlvbiA9Jmd0OyAkY29vcmRzWzddKTsKLQkgICAgbXkgJHYgPSAkQ2l0aWVzeyRhWzBdfS0mZ3Q7e3Z9OwotCSAgICAkTG9jYXRpb25zeyR2fSA9ICRsb2M7Ci0JfQotICAgIH0KLSAgICBjbG9zZSBMT0NBVElPTlM7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BZ2Fpbiwgd2UgYXJlIHVzaW5nIHNoYWRvdyBjbGFzc2VzIHdoaWNoIGFyZSBhbGxvd2luZyB1cyB0byBhc3NpZ24gYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgQyBzdHJ1Y3R1cmUgaW4gdGhlIHNhbWUgd2F5IGFzIG9uZSB3b3VsZCBjcmVhdGUgYSBQZXJsIGhhc2ggdGFibGUuIFdlIGhhdmUgYWxzbyBjcmVhdGVkIHRoZSA8dHQ+JUxvY2F0aW9uczwvdHQ+IGhhc2ggdG8gYXNzb2NpYXRlIG5vZGUgbnVtYmVycyB3aXRoIGEgZ2l2ZW4gbG9jYXRpb24gb2JqZWN0LjxwPgotPHA+Ci1PZiBjb3Vyc2UsIGhhdmluZyBsb2NhdGlvbnMgaXNuJ3QgdG9vIHVzZWZ1bCB3aXRob3V0IGEgd2F5IHRvIGxvb2sgYXQgdGhlbSBzbyB3ZSdsbCBncmFiIHRoZSBwdWJsaWMgZG9tYWluIDx0dD5nZDwvdHQ+IGxpYnJhcnkgYnkgVGhvbWFzIEJvdXRlbGwuICAgRmlyc3QsIHdlJ2xsIHdyaXRlIGEgc2ltcGxlIEMgZnVuY3Rpb24gdG8gZHJhdyB0d28gbG9jYXRpb25zIGFuZCBkcmF3IGEgbGluZSBiZXR3ZWVuIHRoZW0gKHNvbWUgY29kZSBoYXMgYmVlbiBvbWl0dGVkIGZvciBjbGFyaXR5KSA6LjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBwbG90LmMgKi8KLSNpbmNsdWRlICZsdDtnZC5oJmd0OwotI2luY2x1ZGUgJmx0O2dkZm9udHMuaCZndDsKLSNpbmNsdWRlICJsb2NhdGlvbi5oIgotZG91YmxlIHhtaW4seW1pbix4bWF4LHltYXg7ICAgLyogUGxvdHRpbmcgcmFuZ2UgKi8KLQotLyogTWFrZSBhIHBsb3Qgb2YgdHdvIGxvY2F0aW9ucyB3aXRoIGEgbGluZSBiZXR3ZWVuIHRoZW0gKi8KLXZvaWQgcGxvdF9jaXRpZXMoZ2RJbWFnZVB0ciBpbSwgTG9jYXRpb24gKmNpdHkxLCBMb2NhdGlvbiAqY2l0eTIsCi0JCSAgICAgaW50IGNvbG9yKSB7Ci0uLi4KLSAgLyogQ29udmVydCB0aGUgdHdvIGxvY2F0aW9ucyBpbnRvIHNjcmVlbiBjb29yZGluYXRlcyAoYnVuY2ggYG8gbWF0aCkgKi8KLS4uLgotICAvKiBEcmF3IHRoZSBjaXRpZXMgKi8KLSAgZ2RJbWFnZVN0cmluZyhpbSxnZEZvbnRTbWFsbCwuLi4pCi0gIGdkSW1hZ2VTdHJpbmcoaW0sZ2RGb250U21hbGwsLi4uKQotICBnZEltYWdlTGluZShpbSxpeDEsaGVpZ2h0LWl5MSxpeDIsaGVpZ2h0LWl5Mixjb2xvcik7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU5leHQsIHdlJ2xsIHdyYXAgYSBmZXcgY3JpdGljYWwgZ2QgZnVuY3Rpb25zIGludG8gUGVybC4gICBXZSBkb24ndCBuZWVkIHRoZSBlbnRpcmUgbGlicmFyeSBzbyB0aGVyZSdzIG5vdCBtdWNoIHNlbnNlIGluIHdyYXBwaW5nIHRoZSB3aG9sZSB0aGluZyAoaXQncyBlYXN5IGVub3VnaCB0byBkbyBpZiB5b3UgcmVhbGx5IHdhbnQgdG8gb2YgY291cnNlKS4gV2UnbGwganVzdCB3cmFwIGEgY291cGxlIG9mIGZ1bmN0aW9ucyB0byBpbGx1c3RyYXRlIGhvdyBpdCBjYW4gYmUgdXNlZCAob25lIG1pZ2h0IGFsc28gY29uc2lkZXIgdXNpbmcgdGhlIGFscmVhZHkgZXhpc3RpbmcgZ2QgbW9kdWxlIGZvciBQZXJsIGFzIHdlbGwpLiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotdHlwZWRlZiBzdHJ1Y3QgZ2RJbWFnZVN0cnVjdCBnZEltYWdlOwotdHlwZWRlZiBnZEltYWdlICogZ2RJbWFnZVB0cjsKLQotLyogRnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgaW1hZ2VzLiAqLwotZ2RJbWFnZVB0ciBnZEltYWdlQ3JlYXRlKGludCBzeCwgaW50IHN5KTsKLWludCAgZ2RJbWFnZUNvbG9yQWxsb2NhdGUoZ2RJbWFnZVB0ciBpbSwgaW50IHIsIGludCBnLCBpbnQgYik7Ci0laW5saW5lICV7Ci0gIC8qIFNob3J0Y3V0IGZvciBkdW1waW5nIGEgZmlsZSAqLwotICB2b2lkIGR1bXBfZ2lmKGdkSW1hZ2VQdHIgaW0sIGNoYXIgKmZpbGVuYW1lKSB7Ci0gICAgRklMRSAqZjsKLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7Ci0gICAgZ2RJbWFnZUdpZihpbSxmKTsKLSAgICBmY2xvc2UoZik7Ci0gIH0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdlIGNhbiBub3cgc2xhcCBldmVyeXRoaW5nIHRvZ2V0aGVyIHVzaW5nIGEgbmV3IGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcy4gd2UnbGwga2VlcCB0aGUgb2xkIGdyYXBoIG1vZHVsZSBuYW1lIHNvIG91ciBleGlzdGluZyBzY3JpcHRzIHN0aWxsIHdvcmsgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIEZpbGUgOiBwYWNrYWdlLmkKLSVtb2R1bGUgZ3JhcGgKLSVpbmNsdWRlIGdyYXBoLmkgICAgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBncmFwaCBwcm9ncmFtCi0laW5jbHVkZSBsb2NhdGlvbi5pICAgICAgICAvLyBUaGUgbG9jYXRpb24gZGF0YSBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotJWluY2x1ZGUgZ2QuaSAgICAgICAgICAgICAgLy8gZ2QgbW9kdWxlCi0laW5jbHVkZSBwbG90LmMgICAgICAgICAgICAvLyBGdW5jdGlvbiB0byBwbG90IGNpdGllcwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGV3ISBBZnRlciBhbGwgb2YgdGhhdCB3b3JrLCB3ZSBjYW4gZG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cmVhZF9jaXRpZXMoImNpdGllcyIpOwotcmVhZF9sb2NhdGlvbnMoImxvY2F0aW9ucyIpOwotCi0jIENyZWF0ZSBhIG5ldyBpbWFnZSB3aXRoIGdkCi0kaW0gPSBnZEltYWdlQ3JlYXRlKDUwMCw1MDApOwotJHdoaXRlID0gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoJGltLDI1NSwyNTUsMjU1KTsKLSRibGFjayA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKCRpbSwwLDAsMCk7Ci0KLSMgU2V0IHBsb3R0aW5nIHJhbmdlICh2YXJpYWJsZXMgaW4gdGhlIEMgY29kZSkKLSR4bWluID0gLTEzMDsKLSR4bWF4ID0gLTkwOwotJHltaW4gPSAzMDsKLSR5bWF4ID0gNTA7Ci0KLSMgTWFrZSBhIHBsb3Qgb2YgdGhlIGVudGlyZSBncmFwaAotQGxvYyA9IGVhY2ggJUNpdGllczsKLXdoaWxlIChAbG9jKSB7Ci0gICAgbXkgJGNpdHkgPSAkbG9jWzBdOwotICAgIG15ICRub2RlID0gJENpdGllc3skY2l0eX07Ci0gICAgaWYgKGV4aXN0cyAkTG9jYXRpb25zeyRub2RlLSZndDt7dn19KSB7Ci0JbXkgJGxvYzEgPSAkTG9jYXRpb25zeyRub2RlLSZndDt7dn19OwotCW15ICRlID0gJG5vZGUtJmd0O3thZGp9OwotCXdoaWxlIChkZWZpbmVkKCRlKSkgewotICAgCSAgICAgIGlmIChleGlzdHMgJExvY2F0aW9uc3skZS0mZ3Q7e25vZGV9LSZndDt7dn19KSB7Ci0JCSAgbXkgJGxvYzIgPSAkTG9jYXRpb25zeyRlLSZndDt7bm9kZX0tJmd0O3t2fX07Ci0JCSAgcGxvdF9jaXRpZXMoJGltLCRsb2MxLCRsb2MyLCRibGFjayk7Ci0JICAgICAgfQotCSAgICAgICRlID0gJGUtJmd0O3tuZXh0fTsKLQkgIH0KLSAgICB9Ci0gICAgQGxvYyA9IGVhY2ggJUNpdGllczsKLX0KLSMgRHVtcCBvdXQgYSBHSUYgZmlsZQotZHVtcF9naWYoJGltLCJ0ZXN0LmdpZiIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIHJ1biwgd2Ugbm93IGdldCB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOC4yLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotTm90IHRvbyBiYWQgZm9yIGp1c3QgYSBsaXR0bGUgd29yay4uLi48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gV3JhcHBpbmcgQyBsaWJyYXJpZXMgYW5kIG90aGVyIHBhY2thZ2VzPC9oMj4KLVNXSUcgY2FuIGJlIHVzZWQgdG8gYnVpbGQgUGVybCBpbnRlcmZhY2VzIHRvIGV4aXN0aW5nIEMgbGlicmFyaWVzIGFuZCBwYWNrYWdlcy4gVGhlIGdlbmVyYWwgc3RyYXRlZ3kgZm9yIGRvaW5nIHRoaXMgaXMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5Mb2NhdGUgaW1wb3J0YW50IGhlYWRlciBmaWxlcyBmb3IgdGhlIHBhY2thZ2UuCi08bGk+Q29weSB0aGVtIGludG8gYSBTV0lHIGludGVyZmFjZSBmaWxlLgotPGxpPkVkaXQgdGhlIGludGVyZmFjZSBmaWxlIGJ5IHJlbW92aW5nIHByb2JsZW1hdGljIGRlY2xhcmF0aW9ucywgdW5uZWVkZWQgZnVuY3Rpb25zLCBhbmQgb3RoZXIgY2x1dHRlciAodGhpcyBjYW4gb2Z0ZW4gYmUgZm91bmQgYnkganVzdCBydW5uaW5nIFNXSUcpLgotPGxpPkFkZCBzdXBwb3J0IGZ1bmN0aW9ucyB0byBpbXByb3ZlIHRoZSBpbnRlcmZhY2UuCi08L3VsPgotPHA+Ci1XaGlsZSBTV0lHIGNhbiBzb21ldGltZXMgYmUgdXNlZCB0byBzaW1wbHkgcHJvY2VzcyBhIHJhdyBoZWFkZXIgZmlsZSwgdGhlIHJlc3VsdHMgYXJlbid0IGFsd2F5cyB3aGF0IHlvdSB3b3VsZCBleHBlY3QuICAgQnkgd29ya2luZyB3aXRoIGEgc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGUsIHlvdSBnZXQgYW4gb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdGhpbmdzIHVwLiAgIElmIHlvdSdyZSB1c2luZyBhIHN0YWJsZSBwYWNrYWdlLCBjaGFuY2VzIGFyZSB0aGF0IGl0J3Mgbm90IGdvaW5nIHRvIGNoYW5nZSBzdWRkZW5seSBzbyB0aGVyZSBpcyByZWFsbHkgbGl0dGxlIHByb2JsZW0gaW4gZG9pbmcgdGhpcy4gICBUbyBpbGx1c3RyYXRlIHRoZSBwcm9jZXNzLCB3ZSB3aWxsIGJ1aWxkIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQiBpbiB0aGUgbmV4dCBleGFtcGxlLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBCdWlsZGluZyBhIFBlcmw1IGludGVyZmFjZSB0byBNQVRMQUI8L2gyPgotVG8gaWxsdXN0cmF0ZSB0aGUgcHJvY2Vzcywgd2UgY2FuIGJ1aWxkIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQiBieSB3cmFwcGluZyBpdHMgQyBBUEkuICBUaGUgTUFUTEFCIHN5c3RlbSBjb25zaXN0cyBvZiB0aGUgTUFUTEFCIGVuZ2luZSwgYW5kIGxpYnJhcnkgb2YgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIG1hdHJpY2VzLCBhbmQgYSBjb2xsZWN0aW9uIG9mIHV0aWxpdHkgZnVuY3Rpb24uICBBIGZ1bGwgZGVzY3JpcHRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSAiRXh0ZXJuYWwgSW50ZXJmYWNlIEd1aWRlIiBwcm92aWRlZCB3aXRoIE1BVExBQi4gICBFdmVuIGlmIHlvdSBkb24ndCBoYXZlIE1BVExBQiwgdGhpcyBzZWN0aW9uIGNhbiBwcm92aWRlIHNvbWUgaWRlYXMgb24gaG93IHRvIGhhbmRsZSBvdGhlciBsaWJyYXJpZXMuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IFRoZSBNQVRMQUIgZW5naW5lIGludGVyZmFjZTwvaDM+Ci1UaGUgZmlyc3Qgc3RlcCBpbiBidWlsZGluZyBhbiBpbnRlcmZhY2Ugd2lsbCBiZSB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgTUFUTEFCIGVuZ2luZS4gIFRoaXMgaXMgYSBzZXBhcmF0ZSBwcm9jZXNzIHRoYXQgcnVucyBpbiB0aGUgYmFja2dyb3VuZCwgYnV0IHdlIG5lZWQgdG8gaGF2ZSBzb21lIG1lY2hhbmlzbSBmb3Igc3RhcnRpbmcgaXQgYW5kIGlzc3VpbmcgY29tbWFuZHMuICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgTUFUTEFCIGludGVyZmFjZS4sPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PmludCAgICAgIGVuZ0Nsb3NlKEVuZ2luZSAqZXApOwotaW50ICAgICAgZW5nRXZhbFN0cmluZyhFbmdpbmUgKmVwLCBjaGFyICpzdHJpbmcpOwotTWF0cml4ICAqZW5nR2V0TWF0cml4KEVuZ2luZSAqZXAsIGNoYXIgKm5hbWUpOwotaW50ICAgICAgZW5nUHV0TWF0cml4KEVuZ2luZSAqZXAsIE1hdHJpeCAqbXApOwotRW5naW5lICAqZW5nT3BlbihjaGFyICpzdGFydGNvbW1hbmQpOwotdm9pZCAgICAgZW5nT3V0cHV0QnVmZmVyKEVuZ2luZSAqZXAsIGNoYXIgKnAsIGludCBzaXplKTsKLQotPC90dD48L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSB3ZSBjb3VsZCB3cmFwIHRoZXNlIGRpcmVjdGx5LCBlYWNoIGZ1bmN0aW9uIHJlcXVpcmVzIGFuIG9iamVjdCAiRW5naW5lIi4gICBUaGV5IGNvdWxkIGJlIGEgbGl0dGxlIGFubm95aW5nIHRvIHVzZSBpbiBQZXJsIHNpbmNlIHdlIHdvdWxkIGhhdmUgdG8gcGFzcyBhIHBvaW50ZXIgdG8gdGhlIGVuZ2luZSB3aXRoIGV2ZXJ5IGNvbW1hbmQuICAgVGhpcyBwcm9iYWJseSBpc24ndCBuZWNlc3Nhcnkgb3IgZGVzaXJlZC4gICAgIFRodXMsIHdlIGNvdWxkIHdyaXRlIHNvbWUgd3JhcHBlcnMgYXJvdW5kIHRoZXNlIHRvIHByb2R1Y2UgYSBiZXR0ZXIgaW50ZXJmYWNlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIGVuZ2luZS5pIDogU1dJRyBmaWxlIGZvciBNQVRMQUIgZW5naW5lCi0lewotI2RlZmluZSBCVUZGRVJfU0laRSAgIDMyNzY4Ci1zdGF0aWMgRW5naW5lICAqZW5nID0gMDsKLXN0YXRpYyBjaGFyICAgbWxfb3V0cHV0W0JVRkZFUl9TSVpFXTsgICAvKiBSZXN1bHQgQnVmZmVyICovCi0lfQotCi0laW5saW5lICV7Ci0KLQotLyogSW5pdGlhbGl6ZSB0aGUgTUFUTEFCIGVuZ2luZSAqLwotaW50IGluaXQodm9pZCkgewotCWlmIChlbmcpIHJldHVybiAtMTsgICAvKiBBbHJlYWR5IG9wZW4gKi8KLQlpZiAoIShlbmcgPSBlbmdPcGVuKCJtYXRsYWI0MiIpKSkgewotCSAgZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBvcGVuIG1hdGxhYi5cbiIpOwotCSAgcmV0dXJuIC0xOwotICAgICAgIH0KLQllbmdPdXRwdXRCdWZmZXIoZW5nLG1sX291dHB1dCxCVUZGRVJfU0laRSk7Ci0JcmV0dXJuIDA7Ci19Ci0vKiBFeGVjdXRlIGEgTUFUTEFCIGNvbW1hbmQgKi8KLWNoYXIgKm1hdGxhYihjaGFyICpjKSB7Ci0JaWYgKCFlbmcpIHJldHVybiAibm90IGluaXRpYWxpemVkISI7Ci0JZW5nRXZhbFN0cmluZyhlbmcsIGMpOwotCXJldHVybiAmYW1wO21sX291dHB1dFswXTsKLX0KLQotLyogR2V0IGEgbWF0cml4IGZyb20gTUFUTEFCICovCi1NYXRyaXggKkdldE1hdHJpeChjaGFyICpuYW1lKSB7Ci0JaWYgKCFlbmcpIHJldHVybiAoTWF0cml4ICopIDA7Ci0JcmV0dXJuKGVuZ0dldE1hdHJpeChlbmcsbmFtZSkpOwotfQotCi0vKiBTZW5kIGEgbWF0cml4IHRvIE1BVExBQiAqLwotaW50IFB1dE1hdHJpeChNYXRyaXggKm0pIHsKLQlpZiAoIWVuZykgcmV0dXJuIC0xOwotCXJldHVybihlbmdQdXRNYXRyaXgoZW5nLG0pKTsKLX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zNCI+PC9hPjxoMz4gV3JhcHBpbmcgdGhlIE1BVExBQiBtYXRyaXggZnVuY3Rpb25zPC9oMz4KLU5leHQsIHdlIG5lZWQgdG8gYnVpbGQgYW4gaW50ZXJmYWNlIHRvIHRoZSBNQVRMQUIgbWF0cml4IG1hbmlwdWxhdGlvbiBsaWJyYXJ5LiAgIFRoaXMgbGlicmFyeSBjb250YWlucyBhYm91dCAzMCBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBib3RoIHJlYWwgYW5kIGNvbXBsZXggdmFsdWVkIG1hdHJpY2VzLiAgSGVyZSB3ZSB3aWxsIG9ubHkgY29uc2lkZXIgcmVhbC12YWx1ZWQgbWF0cmljZXMuICAgIFRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBtYXRyaWNlcywgd2UnbGwgd3JpdGUgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIGZpbGUgd2l0aCBhIGxpc3Qgb2YgdGhlIGZ1bmN0aW9ucyBhbG9uZyB3aXRoIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMuPHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8KLS8vIG14LmkgOiBTV0lHIGZpbGUgZm9yIE1BVExBQiBtYXRyaXggbWFuaXB1bGF0aW9uCi0laW5saW5lICV7Ci0vKiBHZXQgYW4gZWxlbWVudCBmcm9tIGEgbWF0cml4ICovCi1kb3VibGUgZ2V0cihNYXRyaXggKm1hdCwgaW50IGksIGludCBqKSB7Ci0gIGRvdWJsZSAqcHI7Ci0gIGludCBtOwotICBwciA9IG14R2V0UHIobWF0KTsKLSAgbSA9IG14R2V0TShtYXQpOwotICByZXR1cm4gcHJbbSpqICsgaV07Ci19Ci0vKiBTZXQgYW4gZWxlbWVudCBvZiBhIG1hdHJpeCAqLwotdm9pZCBzZXRyKE1hdHJpeCAqbWF0LCBpbnQgaSwgaW50IGosIGRvdWJsZSB2YWwpIHsKLSAgZG91YmxlICpwcjsKLSAgaW50IG07Ci0gIHByID0gbXhHZXRQcihtYXQpOwotICBtID0gbXhHZXRNKG1hdCk7Ci0gICAgcHJbbSpqICsgaV0gPSB2YWw7Ci19Ci0lfQotCi0vKiBOb3cgc29tZSBNQVRMQUIgY29tbWFuZCAqLwotTWF0cml4ICpteENyZWF0ZUZ1bGwoaW50IG0sIGludCBuLCBpbnQgQ29tcGxleEZsYWcpOwotaW50IG14R2V0TShNYXRyaXggKm1hdCk7Ci1pbnQgbXhHZXROKE1hdHJpeCAqbWF0KTsKLWNoYXIgKm14R2V0TmFtZShNYXRyaXggKm1hdCk7Ci12b2lkIG14U2V0TmFtZShNYXRyaXggKm1hdCwgY2hhciAqbmFtZSk7Ci1kb3VibGUgKm14R2V0UHIoTWF0cml4ICptYXQpOwotdm9pZCBteFNldFByKE1hdHJpeCAqbWF0LCBkb3VibGUgKnByKTsKLWRvdWJsZSBteEdldFNjYWxhcihNYXRyaXggKm1hdCk7Ci12b2lkIG14RnJlZU1hdHJpeChNYXRyaXggKnBtKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gUHV0dGluZyBpdCBhbGwgdG9nZXRoZXI8L2gzPgotRmluYWxseSB3ZSBhcmUgcmVhZHkgdG8gcHV0IG91ciBpbnRlcmZhY2UgdG9nZXRoZXIuICAgVGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCBhIGJpZyBtb25vbGl0aGljIGludGVyZmFjZSBmaWxlLS13ZSBjYW4gc2ltcGx5IGJ1aWxkIGl0IHVwIGluIHBpZWNlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gbWF0bGFiLmkKLS8vIFNpbXBsZSBTV0lHIGludGVyZmFjZSB0byBNQVRMQUIKLSVtb2R1bGUgbWF0bGFiCi0lewotI2luY2x1ZGUgImVuZ2luZS5oIgotJX0KLSVpbmNsdWRlIGVuZ2luZS5pCi0laW5jbHVkZSBteC5pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU91ciBtb2R1bGUgY2FuIGJlIGNvbXBpbGVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1wZXJsNSBtYXRsYWIuaQotdW5peCAmZ3Q7IGdjYyAtYyBtYXRsYWJfd3JhcC5jIC1JL3Vzci9sb2NhbC9saWIvcGVybDUvYXJjaC1vc25hbWUvNS4wMDMvQ09SRSAtRGJvb2w9Y2hhciAKLQktSSQoTUFUTEFCKS9leHRlcm4vaW5jbHVkZQotdW5peCAmZ3Q7IGxkIC1zaGFyZWQgbWF0bGFiX3dyYXAubyAtTCQoTUFUTEFCKS9leHRlcm4vbGliIC1sbWF0IC1vIG1hdGxhYi5zbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVyZTx0dD4gJChNQVRMQUIpIDwvdHQ+aXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBNQVRMQUIgaW5zdGFsbGF0aW9uICh5b3UgbWF5IGhhdmUgdG8gZGlnIGZvciB0aGlzKS48cD4KLTxwPgotV2l0aCBvdXIgbmV3IE1BVExBQiBtb2R1bGUsIHdlIGNhbiBub3cgd3JpdGUgUGVybCBzY3JpcHRzIHRoYXQgaXNzdWUgTUFUTEFCIGNvbW1hbmRzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIG1hdGxhYjsKLW1hdGxhYjo6aW5pdCgpOwotbWF0bGFiOjptYXRsYWIoInggPSAtODouMjU6ODsgXAotICAgICAgICAgICAgICAgIHkgPSB4OyBcCi0gICAgICAgICAgICAgICAgW1gsWV0gPSBtZXNoZ3JpZCh4LHkpOyBcCi0gICAgICAgICAgICAgICAgUiA9IHNxcnQoWC5eMiArIFkuXjIpK2VwczsgXAotICAgICAgICAgICAgICAgIFogPSBzaW4oUikuL1I7IFwKLSAgICAgICAgICAgICAgICBtZXNoKFopOyAiKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQ3JlYXRlcyBhIHNpbXBsZSAzRCBzdXJmYWNlIHBsb3QuPHA+Ci08YSBuYW1lPSJuMzYiPjwvYT48aDM+IEdyYXBoaWNhbCBXZWItU3RhdGlzdGljcyBpbiBQZXJsNTwvaDM+Ci1Ob3csIGxldHMgdXNlIG91ciBNQVRMQUIgbW9kdWxlIHRvIGdlbmVyYXRlIHBsb3RzIG9mIHdlYi1zZXJ2ZXIgaGl0cyBmb3IgYSBnaXZlbiBtb250aC4gIFRvIGRvIHRoaXMsIHdlJ2xsIHVzZSBvdXIgTUFUTEFCIG1vZHVsZSwgYW5kIGNyZWF0ZSBhIHNwZWNpYWwgcHVycG9zZSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBkYXlzIGFuZCBob3Vycy4gICA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBTaW1wbGUgQyBmdW5jdGlvbiBmb3IgcmVjb3JkaW5nIGEgaGl0Ci0lbW9kdWxlIHdlYmdyYXBoCi0laW5saW5lICUKLQl2b2lkIGhpdChkb3VibGUgKm0sIGludCBkYXksIGludCBob3VyKSB7Ci0JCWlmICgoZGF5ICZndDs9IDApICZhbXA7JmFtcDsgKGRheSAmbHQ7PSAzMSkpIHsKLQkJCSoobSsyNCooZGF5LTEpK2hvdXIpICs9IDEuMDsKLQkJfQotCX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIHdlIGNvdWxkIHdyaXRlIHRoaXMgZnVuY3Rpb24gaW4gUGVybCwgaXQgd2lsbCBiZSBtdWNoIGZhc3RlciBpbiBDLiAgSWYgd2UncmUgcHJvY2Vzc2luZyBhIGh1Z2UgZmlsZSwgdGhlbiB0aGUgZXh0cmEgYml0IG9mIHBlcmZvcm1hbmNlIHdpbGwgaGVscCB1cyBvdXQuICBPbmNlIGNvbXBpbGVkLCB3ZSBjYW4gbm93IHdyaXRlIGEgUGVybDUgc2NyaXB0IGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIG1hdGxhYjsKLXVzZSB3ZWJncmFwaDsKLQotIyBJbml0aWFsaXplIG1hdGxhYiBlbmdpbmUKLW1hdGxhYjo6aW5pdCgpOwotIyBNYWtlIGEgbWF0cml4IGZvciBhbGwgaGl0cwotJG1fYWxsID0gbWF0bGFiOjpteENyZWF0ZUZ1bGwoMjQsMzEsMCk7Ci1tYXRsYWI6Om14U2V0TmFtZSgkbV9hbGwsImFsbCIpOwotJGFsbCA9IG1hdGxhYjo6bXhHZXRQcigkbV9hbGwpOyAgICAgICAgICMgR2V0IGRvdWJsZSAqIG9mIE1hdHJpeAotCi1mb3JlYWNoICRmaWxlIChAQVJHVikgewotICBvcGVuKEZJTEUsJGZpbGUpOwotICBwcmludCAiUHJvY2Vzc2luZyAiLCRmaWxlLCJcbiI7Ci0gIHdoaWxlICgmbHQ7RklMRSZndDspIHsJCQotICAgIEBmaWVsZHMgPSBzcGxpdCgvXHMrLywgJF8pOwotICAgIG5leHQgaWYgKCRmaWVsZHNbOF0gIT0gMjAwKTsKLSAgICBAZGF0ZXRpbWUgPSBzcGxpdCgvXFt8XC98Oi8sICRmaWVsZHNbM10pOwotICAgIGlmICgkZGF0ZXRpbWVbMl0gPX4gL0Fwci8pIHsKLSAgICAgIHdlYmdyYXBoOjpoaXQoJGFsbCwgJGRhdGV0aW1lWzFdLCRkYXRldGltZVs0XSk7Ci0gICAgfQotICB9Ci0gICMgRHVtcCB0ZW1wb3JhcnkgcmVzdWx0cwotfSAgI2ZvcmVhY2gKLW1hdGxhYjo6UHV0TWF0cml4KCRtX2FsbCk7Ci1tYXRsYWI6Om1hdGxhYigiZmlndXJlKDEpOyBcCi0gICAgICAgICAgICAgICAgc3VyZihhbGwpOyBcCi0gICAgICAgICAgICAgICAgdmlldyg0MCw0MCk7IFwKLSAgICAgICAgICAgICAgICBzaGFkaW5nIGludGVycDsgXAotICAgICAgICAgICAgICAgIHRpdGxlKCdBbGwgaGl0cycpOyBcCi0gICAgICAgICAgICAgICAgc2V0KGdjYSwneGxhYmVsJyx0ZXh0KDAsMCwnRGF5JykpOyBcCi0gICAgICAgICAgICAgICAgc2V0KGdjYSwneWxhYmVsJyx0ZXh0KDAsMCwnSG91cicpKTsgXAotICAgICAgICAgICAgICAgIHByaW50IC1kZ2lmOCBzdGF0c19hbGwuZ2lmIik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gcnVuIG9uIHRoZSB3ZWItc2VydmVyIGxvZ3MgZm9yIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgsIHRoaXMgc2NyaXB0IHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgR0lGIGZpbGUgKHNob3dpbmcgaGl0cyBwZXIgaG91cikgOjxwPgotPHA+PGNlbnRlcj48aW1nIHNyYz0iY2g4LjMucG5nIj48L2NlbnRlcj48cD4KLTxwPgotPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDI+IEhhbmRsaW5nIG91dHB1dCB2YWx1ZXMgKHRoZSBlYXN5IHdheSk8L2gyPgotU29tZSBDIGxpYnJhcmllcyByZWx5IG9uIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB2YWx1ZXMgaW4gdGhlaXIgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZmFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KSB7Ci0JKnJlc3VsdCA9IGErYjsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQnkgZGVmYXVsdCwgU1dJRyBkb2VzIG5vdCBoYW5kbGUgdGhpcyBjYXNlIChsZWF2aW5nIGl0IHVwIHRvIHlvdSB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gYWJvdXQgdGhlIDx0dD5yZXN1bHQ8L3R0PiBwYXJhbWV0ZXIpLiAgSG93ZXZlciwgdGhpcyBwcm9ibGVtIGlzIGVhc2lseSBmaXhlZCB1c2luZyB0aGUgPHR0PnR5cGVtYXBzLmk8L3R0PiBsaWJyYXJ5IGZpbGUgKHNlZSB0aGUgVHlwZW1hcHMgY2hhcHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbikuICAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgd2l0aCBvdXRwdXQgYXJndW1lbnRzCi0lbW9kdWxlIGV4YW1wbGUKLQotJWluY2x1ZGUgdHlwZW1hcHMuaSAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgdHlwZW1hcHMgbGlicmF5cgotJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHtkb3VibGUgKnJlc3VsdH07ICAgLy8gTWFrZSAicmVzdWx0IiBhbiBvdXRwdXQgcGFyYW1ldGVyCi0KLXZvaWQgZmFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB1c2VkIGluIGEgUGVybCBzY3JpcHQsIHRoZSBmYWRkIGZ1bmN0aW9uIG5vdyB0YWtlcyAyIHBhcmFtZXRlcnMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4kYSA9IGZhZGQoMyw0KTsgICAgICAgICAgICAjICRhIGdldHMgdGhlIHZhbHVlIG9mIGRvdWJsZSAqcmVzdWx0Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gbXVsdGlwbGUgb3V0cHV0IGFyZ3VtZW50cyBhcmUgaW52b2x2ZWQsIGEgUGVybCBhcnJheSBvZiB2YWx1ZXMgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLiAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIFBlcmwgcmVmZXJlbmNlcyBhcyBmdW5jdGlvbiB2YWx1ZXMuICBUaGlzIGlzIGRvbmUgYXMgc2hvd24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgd2l0aCBvdXRwdXQgYXJndW1lbnRzCi0lbW9kdWxlCi0laW5jbHVkZSB0eXBlbWFwcy5pCi0KLSVhcHBseSBkb3VibGUgKlJFRkVSRU5DRSB7ZG91YmxlICpyZXN1bHR9OyAgICAvLyBNYWtlICJyZXN1bHQiIGEgUGVybCByZWZlcmVuY2UKLQotdm9pZCBmYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3cgaW4gYSBQZXJsIHNjcmlwdCwgdGhlIGZ1bmN0aW9uIHdvcmtzIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JGMgPSAwLjA7ICAgICAgICAgICAgICAgICAgICAjIFZhcmlhYmxlIGZvciBob2xkaW5nIHRoZSByZXN1bHQKLWZhZGQoMyw0LFwkYyk7ICAgICAgICAgICAgICAgIyBmYWRkKCkgcGxhY2VzIHRoZSByZXN1bHQgaW4gJGMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gYWRkaXRpb24gdG8gaGFuZGxpbmcgcG9pbnRlcnMgYXMgb3V0cHV0IHZhbHVlcyBvciByZWZlcmVuY2VzLCB0d28gb3RoZXIgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiAgVGhlIDx0dD5JTlBVVDwvdHQ+IG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCBhIHBvaW50ZXIgaXMgYW4gaW5wdXQgdmFsdWUgYW5kIHRoZSA8dHQ+Qk9USDwvdHQ+IG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCBhIHBvaW50ZXIgaXMgYm90aCBhbiBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlLiAgICBUaGVzZSB3b3VsZCBiZSBzcGVjaWZpZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWFwcGx5IGRvdWJsZSAqSU5QVVQge2RvdWJsZSAqaW59OyAgICAgICAgIC8vIGRvdWJsZSAqaW4gaXMgYW4gaW5wdXQgdmFsdWUKLSVhcHBseSBkb3VibGUgKkJPVEgge2RvdWJsZSAqcn07ICAgICAgICAgICAvLyBkb3VibGUgKnIgaXMgYm90aCBhbiBpbnB1dC9vdXRwdXQgdmFsdWUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBwcm9jZXNzaW5nIG9mIGRhdGF0eXBlcyBpcyBidWlsdCB1c2luZyBTV0lHJ3MgdHlwZW1hcCBtZWNoYW5pc20uICAgVGhlIGRldGFpbHMgb2YgdHlwZW1hcHMgaXMgZGVzY3JpYmVkIHNob3J0bHkgYWx0aG91Z2ggdGhlIDx0dD50eXBlbWFwcy5pPC90dD4gbGlicmFyeSBhbHJlYWR5IGluY2x1ZGVzIGEgdmFyaWV0eSBvZiB1c2VmdWwgdHlwZW1hcHMgcmVhZHkgZm9yIHVzZS48cD4KLTxhIG5hbWU9Im4xMyI+PC9hPjxoMj4gRXhjZXB0aW9uIGhhbmRsaW5nIDwvaDI+Ci1UaGUgU1dJRyA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB1c2VyLWRlZmluYWJsZSBleGNlcHRpb24gaGFuZGxlciBmb3IgY29udmVydGluZyBleGNlcHRpb25zIGluIHlvdXIgQy9DKysgcHJvZ3JhbSBpbnRvIFBlcmwgZXhjZXB0aW9ucy4gIFRoZSBjaGFwdGVyIG9uIGV4Y2VwdGlvbiBoYW5kbGluZyBjb250YWlucyBtb3JlIGRldGFpbHMsIGJ1dCBzdXBwb3NlIHlvdSBoYXZlIGEgQysrIGNsYXNzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgUmFuZ2VFcnJvciB7fTsgICAvLyBVc2VkIGZvciBhbiBleGNlcHRpb24KLQotY2xhc3MgRG91YmxlQXJyYXkgewotICBwcml2YXRlOgotICAgIGludCBuOwotICAgIGRvdWJsZSAqcHRyOwotICBwdWJsaWM6Ci0gICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IG9mIGZpeGVkIHNpemUKLSAgICBEb3VibGVBcnJheShpbnQgc2l6ZSkgewotICAgICAgcHRyID0gbmV3IGRvdWJsZVtzaXplXTsKLSAgICAgIG4gPSBzaXplOwotICAgIH0KLSAgICAvLyBEZXN0cm95IGFuIGFycmF5Ci0gICAgfkRvdWJsZUFycmF5KCkgewotICAgICAgIGRlbGV0ZSBwdHI7Ci0gICAgfQotICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheQotICAgIGludCAgIGxlbmd0aCgpIHsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIC8vIEdldCBhbiBpdGVtIGZyb20gdGhlIGFycmF5IGFuZCBwZXJmb3JtIGJvdW5kcyBjaGVja2luZy4KLSAgICBkb3VibGUgZ2V0aXRlbShpbnQgaSkgewotICAgICAgaWYgKChpICZndDs9IDApICZhbXA7JmFtcDsgKGkgJmx0OyBuKSkKLSAgICAgICAgcmV0dXJuIHB0cltpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgIH0KLQotICAgIC8vIFNldCBhbiBpdGVtIGluIHRoZSBhcnJheSBhbmQgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcuCi0gICAgdm9pZCBzZXRpdGVtKGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICBpZiAoKGkgJmd0Oz0gMCkgJmFtcDsmYW1wOyAoaSAmbHQ7IG4pKQotICAgICAgICBwdHJbaV0gPSB2YWw7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgICAgfQotICAgIH0KLSAgfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBjYW4gdGhyb3cgYSByYW5nZSBleGNlcHRpb24gZm9yIGFuIG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzLiAgIFdlIGNhbiBjYXRjaCB0aGlzIGluIG91ciBQZXJsIGV4dGVuc2lvbiBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocGVybDUpIHsKLSAgdHJ5IHsKLSAgICAkZnVuY3Rpb24gICAgICAgICAgICAgICAgLy8gR2V0cyBzdWJzdGl0dXRlZCBieSBhY3R1YWwgZnVuY3Rpb24gY2FsbAotICB9Ci0gIGNhdGNoIChSYW5nZUVycm9yKSB7Ci0gICAgY3JvYWsoIkFycmF5IGluZGV4IG91dC1vZi1ib3VuZHMiKTsKLSAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIHdoZW4gdGhlIEMrKyBjbGFzcyB0aHJvd3MgYSBSYW5nZUVycm9yIGV4Y2VwdGlvbiwgb3VyIHdyYXBwZXIgZnVuY3Rpb25zIHdpbGwgY2F0Y2ggaXQsIHR1cm4gaXQgaW50byBhIFBlcmwgZXhjZXB0aW9uLCBhbmQgYWxsb3cgYSBncmFjZWZ1bCBkZWF0aCBhcyBvcHBvc2VkIHRvIGp1c3QgaGF2aW5nIHNvbWUgc29ydCBvZiBteXN0ZXJpb3VzIHByb2dyYW0gY3Jhc2guICAgICBTaW5jZSBTV0lHJ3MgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIHVzZXItZGVmaW5hYmxlLCB3ZSBhcmUgbm90IGxpbWl0ZWQgdG8gQysrIGV4Y2VwdGlvbiBoYW5kbGluZy4gICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHdyaXRlIGEgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCB3b3JrcyB3aXRoIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMuIFBsZWFzZSBzZWUgdGhlIGNoYXB0ZXIgb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBtb3JlIGRldGFpbHMuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDI+IFJlbWFwcGluZyBkYXRhdHlwZXMgd2l0aCB0eXBlbWFwczwvaDI+Ci1XaGlsZSBTV0lHIGRvZXMgYSByZWFzb25hYmxlIGpvYiB3aXRoIG1vc3QgQy9DKysgZGF0YXR5cGVzLCBpdCBkb2Vzbid0IGFsd2F5cyBkbyB3aGF0IHlvdSB3YW50LiAgIEhvd2V2ZXIsIHlvdSBjYW4gcmVtYXAgU1dJRydzIHRyZWF0bWVudCBvZiBqdXN0IGFib3V0IGFueSBkYXRhdHlwZSB1c2luZyBhIHR5cGVtYXAuICBBIHR5cGVtYXAgc2ltcGx5IHNwZWNpZmllcyBhIGNvbnZlcnNpb24gYmV0d2VlbiBQZXJsIGFuZCBDIGRhdGF0eXBlcyBhbmQgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBmdW5jdGlvbiBhcmd1bWVudHMsIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXMsIGFuZCBtb3JlLiAgQSBzaW1pbGlhciBtZWNoYW5pc20gaXMgdXNlZCBieSB0aGUgeHN1YnBwIGNvbXBpbGVyIHByb3ZpZGVkIHdpdGggUGVybCBhbHRob3VnaCB0aGUgU1dJRyB2ZXJzaW9uIHByb3ZpZGVzIG1hbnkgbW9yZSBvcHRpb25zLjxwPgotPGEgbmFtZT0ibjM3Ij48L2E+PGgzPiBBIHNpbXBsZSB0eXBlbWFwIGV4YW1wbGU8L2gzPgotVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBhIHNpbXBsZSB0eXBlbWFwIGNhbiBiZSB3cml0dGVuIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLQotJXR5cGVtYXAocGVybDUsaW4pIGludCB7Ci0JJHRhcmdldCA9IChpbnQpIFN2SVYoJHNvdXJjZSk7Ci0JcHJpbnRmKCJSZWNlaXZlZCBhbiBpbnRlZ2VyIDogJWRcbiIsICR0YXJnZXQpOwotfQotLi4uCi1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UeXBlbWFwIHNwZWNpZmljYXRpb25zIHJlcXVpcmUgYSBsYW5ndWFnZSBuYW1lLCBtZXRob2QgbmFtZSwgZGF0YXR5cGUsIGFuZCBjb252ZXJzaW9uIGNvZGUuIEZvciBQZXJsNSwgInBlcmw1IiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgbGFuZ3VhZ2UgbmFtZS4gIFRoZSAiaW4iIG1ldGhvZCByZWZlcnMgdG8gdGhlIGlucHV0IGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uLiAgVGhlIGBpbnQnIGRhdGF0eXBlIHRlbGxzIFNXSUcgdGhhdCB3ZSBhcmUgcmVtYXBwaW5nIGludGVnZXJzLiAgIFRoZSBjb252ZXJzaW9uIGNvZGUgaXMgdXNlZCB0byBjb252ZXJ0IGZyb20gYSBQZXJsIHNjYWxhciB2YWx1ZSB0byAgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YXR5cGUuICBXaXRoaW4gdGhlIHN1cHBvcnQgY29kZSwgdGhlIHZhcmlhYmxlPHR0PiAkc291cmNlPC90dD4gY29udGFpbnMgdGhlIHNvdXJjZSBkYXRhIChhIFBlcmwgb2JqZWN0KSBhbmQgPHR0PiR0YXJnZXQ8L3R0PiBjb250YWlucyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNvbnZlcnNpb24gKGEgQyBsb2NhbCB2YXJpYWJsZSkuIDxwPgotPHA+Ci1XaGVuIHRoaXMgZXhhbXBsZSBpcyB1c2VkIGluIFBlcmw1LCBpdCB3aWxsIG9wZXJhdGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIGV4YW1wbGU7Ci0kbiA9IGV4YW1wbGU6OmZhY3QoNik7Ci1wcmludCAiJG5cbiI7Ci0uLi4KLQotT3V0cHV0IDoKLVJlY2VpdmVkIGFuIGludGVnZXIgOiA2Ci03MjAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotR2VuZXJhbCBkaXNjdXNzaW9uIG9mIHR5cGVtYXBzIGNhbiBiZSBmb3VuZCBpbiB0aGUgbWFpbiBTV0lHIHVzZXJzIHJlZmVyZW5jZS4gIDxwPgotPGEgbmFtZT0ibjM4Ij48L2E+PGgzPiBQZXJsNSB0eXBlbWFwczwvaDM+Ci1UaGUgZm9sbG93aW5nIHR5cGVtYXAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIFBlcmw1IG1vZHVsZXM8cD4KLTxwPgotPHR0PiV0eXBlbWFwKHBlcmw1LGluKTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydHMgUGVybDUgb2JqZWN0IHRvIGlucHV0IGZ1bmN0aW9uIGFyZ3VtZW50cy48cD4KLTx0dD4ldHlwZW1hcChwZXJsNSxvdXQpPC90dD4gICAgICAgICAgICAgICAgICAgICBDb252ZXJ0cyBmdW5jdGlvbiByZXR1cm4gdmFsdWUgdG8gYSBQZXJsNSB2YWx1ZS48cD4KLTx0dD4ldHlwZW1hcChwZXJsNSx2YXJpbik8L3R0PiAgICAgICAgICAgICAgICBDb252ZXJ0cyBhIFBlcmw1IG9iamVjdCB0byBhIGdsb2JhbCB2YXJpYWJsZS48cD4KLTx0dD4ldHlwZW1hcChwZXJsNSx2YXJvdXQpPC90dD4gICAgICAgICAgICAgQ29udmVydHMgYSBnbG9iYWwgdmFyaWFibGUgdG8gYSBQZXJsNSBvYmplY3QuPHA+Ci08dHQ+JXR5cGVtYXAocGVybDUsZnJlZWFyZyk8L3R0PiAgICAgICAgICBDbGVhbnMgdXAgYSBmdW5jdGlvbiBhcmd1bWVudCBhZnRlciBhIGZ1bmN0aW9uIGNhbGw8cD4KLTx0dD4ldHlwZW1hcChwZXJsNSxhcmdvdXQpPC90dD4gICAgICAgICAgICAgT3V0cHV0IGFyZ3VtZW50IGhhbmRsaW5nPHA+Ci08dHQ+JXR5cGVtYXAocGVybDUscmV0KSAgICAgICAgPC90dD5DbGVhbiB1cCByZXR1cm4gdmFsdWUgZnJvbSBhIGZ1bmN0aW9uLjxwPgotPHR0PiV0eXBlbWFwKG1lbWJlcmluKTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyBvZiBDKysgbWVtYmVyIGRhdGEgKGFsbCBsYW5ndWFnZXMpLjxwPgotPHR0PiV0eXBlbWFwKG1lbWJlcm91dCk8L3R0PiAgICAgICAgICAgICAgICAgICAgIFJldHVybiBvZiBDKysgbWVtYmVyIGRhdGEgKGFsbCBsYW5ndWFnZXMpLjxwPgotPHR0PiV0eXBlbWFwKHBlcmw1LGNoZWNrKTwvdHQ+ICAgICAgICAgICAgICAgQ2hlY2sgdmFsdWUgb2YgaW5wdXQgcGFyYW1ldGVyLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBUeXBlbWFwIHZhcmlhYmxlczwvaDM+Ci1UaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtYXkgYmUgdXNlZCB3aXRoaW4gdGhlIEMgY29kZSB1c2VkIGluIGEgdHlwZW1hcCA6PHA+Ci08cD4KLTx0dD4kc291cmNlPC90dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSB2YWx1ZSBvZiBhIGNvbnZlcnNpb248cD4KLTx0dD4kdGFyZ2V0PC90dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCBvZiBjb252ZXJzaW9uICh3aGVyZSByZXN1bHQgc2hvdWxkIGJlIHN0b3JlZCk8cD4KLTx0dD4kdHlwZTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDIGRhdGF0eXBlIGJlaW5nIHJlbWFwcGVkPHA+Ci08dHQ+JG1hbmdsZTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVkIHZlcnNpb24gb2YgZGF0YXR5cGUgKGZvciBibGVzc2luZyBvYmplY3RzKTxwPgotPHR0PiRhcmc8L3R0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBhcmd1bWVudCAod2hlbiBhcHBsaWNhYmxlKS48cD4KLTxhIG5hbWU9Im40MCI+PC9hPjxoMz4gTmFtZSBiYXNlZCB0eXBlIGNvbnZlcnNpb248L2gzPgotVHlwZW1hcHMgYXJlIGJhc2VkIGJvdGggb24gdGhlIGRhdGF0eXBlIGFuZCBhbiBvcHRpb25hbCBuYW1lIGF0dGFjaGVkIHRvIGEgZGF0YXR5cGUuICAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZm9vCi0KLS8vIFRoaXMgdHlwZW1hcCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNoYXIgKiogZnVuY3Rpb24gYXJndW1lbnRzCi0ldHlwZW1hcChwZXJsNSxpbikgY2hhciAqKiB7IC4uLiB9Ci0KLS8vIFRoaXMgdHlwZW1hcCBpcyBhcHBsaWVkIG9ubHkgdG8gY2hhciAqKiBhcmd1bWVudHMgbmFtZWQgYGFyZ3YnCi0ldHlwZW1hcChwZXJsNSxpbikgY2hhciAqKmFyZ3YgeyAuLi4gfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGV4YW1wbGUsIHR3byB0eXBlbWFwcyBhcmUgYXBwbGllZCB0byB0aGUgY2hhciAqKiBkYXRhdHlwZS4gIEhvd2V2ZXIsIHRoZSBzZWNvbmQgdHlwZW1hcCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBhcmd1bWVudHMgbmFtZWQgYGFyZ3YnLiAgQSBuYW1lZCB0eXBlbWFwIHdpbGwgYWx3YXlzIG92ZXJyaWRlIGFuIHVubmFtZWQgdHlwZW1hcC48cD4KLTxwPgotRHVlIHRvIHRoZSBuYW1lIG1hdGNoaW5nIHNjaGVtZSwgdHlwZW1hcHMgZG8gbm90IGZvbGxvdyB0eXBlZGVmIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcChwZXJsNSxpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotCi1kb3VibGUgZm9vKGRvdWJsZSk7ICAgICAgICAgICAgICAvLyBVc2VzIHRoZSBkb3VibGUgdHlwZW1hcCBhYm92ZQotdHlwZWRlZiBkb3VibGUgUmVhbDsKLVJlYWwgYmFyKFJlYWwpOyAgICAgICAgICAgICAgICAgIC8vIERvZXMgbm90IHVzZSB0aGUgdHlwZW1hcCBhYm92ZSAoZG91YmxlICE9IFJlYWwpCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUlzIGlzIG9kZCBiZWhhdmlvciB0byBiZSBzdXJlLCBidXQgeW91IGNhbiB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbSB1c2luZyB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcChwZXJsNSxpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotZG91YmxlIGZvbyhkb3VibGUpOyAgICAgICAgICAgICAgLy8gVXNlcyB0aGUgZG91YmxlIHR5cGVtYXAgYWJvdmUKLQotdHlwZWRlZiBkb3VibGUgUmVhbDsKLSVhcHBseSBkb3VibGUgeyBSZWFsIH07ICAgICAgICAgIC8vIEFwcGx5IHRoZSBkb3VibGUgdHlwZW1hcCB0byBSZWFscy4KLVJlYWwgYmFyKFJlYWwpOyAgICAgICAgICAgICAgICAgIC8vIFVzZXMgdGhlIGRvdWJsZSB0eXBlbWFwIGFscmVhZHkgZGVmaW5lZC4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTmFtZWQgdHlwZW1hcHMgYXJlIGV4dHJlbWVseSB1c2VmdWwgZm9yIG1hbmFnaW5nIHNwZWNpYWwgY2FzZXMuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBuYW1lZCB0eXBlbWFwcyB0byBwcm9jZXNzIG91dHB1dCBhcmd1bWVudHMgKGllLiBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBoYXZlIHZhbHVlcyByZXR1cm5lZCBpbiB0aGVtKS48cD4KLTxhIG5hbWU9Im40MSI+PC9hPjxoMz4gQ29udmVydGluZyBhIFBlcmw1IGFycmF5IHRvIGEgY2hhciAqKiA8L2gzPgotQSBjb21tb24gcHJvYmxlbSBpbiBtYW55IEMgcHJvZ3JhbXMgaXMgdGhlIHByb2Nlc3Npbmcgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgd2hpY2ggYXJlIHVzdWFsbHkgcGFzc2VkIGluIGFuIGFycmF5IG9mIE5VTEwgdGVybWluYXRlZCBzdHJpbmdzLiAgVGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIGFsbG93cyBhIFBlcmw1IGFycmF5IHJlZmVyZW5jZSB0byBiZSB1c2VkIGFzIGEgY2hhciAqKiBkYXRhdHlwZS48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGFyZ3YKLQotLy8gVGhpcyB0ZWxscyBTV0lHIHRvIHRyZWF0IGNoYXIgKiogYXMgYSBzcGVjaWFsIGNhc2UKLSV0eXBlbWFwKHBlcmw1LGluKSBjaGFyICoqIHsKLQlBViAqdGVtcGF2OwotCUkzMiBsZW47Ci0JaW50IGk7Ci0JU1YgICoqdHY7Ci0JaWYgKCFTdlJPSygkc291cmNlKSkKLQkgICAgY3JvYWsoIiRzb3VyY2UgaXMgbm90IGEgcmVmZXJlbmNlLiIpOwotICAgICAgICBpZiAoU3ZUWVBFKFN2UlYoJHNvdXJjZSkpICE9IFNWdF9QVkFWKQotCSAgICBjcm9haygiJHNvdXJjZSBpcyBub3QgYW4gYXJyYXkuIik7Ci0gICAgICAgdGVtcGF2ID0gKEFWKilTdlJWKCRzb3VyY2UpOwotCWxlbiA9IGF2X2xlbih0ZW1wYXYpOwotCSR0YXJnZXQgPSAoY2hhciAqKikgbWFsbG9jKChsZW4rMikqc2l6ZW9mKGNoYXIgKikpOwotCWZvciAoaSA9IDA7IGkgJmx0Oz0gbGVuOyBpKyspIHsKLQkgICAgdHYgPSBhdl9mZXRjaCh0ZW1wYXYsIGksIDApOwkKLQkgICAgJHRhcmdldFtpXSA9IChjaGFyICopIFN2UFYoKnR2LG5hKTsKLSAgICAgICAgfQotCSR0YXJnZXRbaV0gPSAwOwotfTsKLQotLy8gVGhpcyBjbGVhbnMgdXAgb3VyIGNoYXIgKiogYXJyYXkgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwKLSV0eXBlbWFwKHBlcmw1LGZyZWVhcmcpIGNoYXIgKiogewotCWZyZWUoJHNvdXJjZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBuZXcgUGVybCBhcnJheSBhbmQgcGxhY2VzIGEgY2hhciAqKiBpbnRvIGl0Ci0ldHlwZW1hcChwZXJsNSxvdXQpIGNoYXIgKiogewotCUFWICpteWF2OwotCVNWICoqc3ZzOwotCWludCBpID0gMCxsZW4gPSAwOwotCS8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgZWxlbWVudHMgd2UgaGF2ZSAqLwotCXdoaWxlICgkc291cmNlW2xlbl0pCi0JICAgbGVuKys7Ci0Jc3ZzID0gKFNWICoqKSBtYWxsb2MobGVuKnNpemVvZihTViAqKSk7Ci0JZm9yIChpID0gMDsgaSAmbHQ7IGxlbiA7IGkrKykgewotCSAgICBzdnNbaV0gPSBzdl9uZXdtb3J0YWwoKTsKLQkgICAgc3Zfc2V0cHYoKFNWKilzdnNbaV0sJHNvdXJjZVtpXSk7Ci0JfTsKLQlteWF2ID0JYXZfbWFrZShsZW4sc3ZzKTsKLQlmcmVlKHN2cyk7Ci0gICAgICAgJHRhcmdldCA9IG5ld1JWKChTViopbXlhdik7Ci0gICAgICAgc3ZfMm1vcnRhbCgkdGFyZ2V0KTsKLX0KLQotLy8gTm93IGEgZmV3IHRlc3QgZnVuY3Rpb25zCi0laW5saW5lICV7Ci1pbnQgcHJpbnRfYXJncyhjaGFyICoqYXJndikgewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoYXJndltpXSkgewotICAgICAgICAgcHJpbnRmKCJhcmd2WyVkXSA9ICVzXG4iLCBpLGFyZ3ZbaV0pOwotICAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotLy8gUmV0dXJucyBhIGNoYXIgKiogbGlzdCAKLWNoYXIgKipnZXRfYXJncygpIHsKLSAgICBzdGF0aWMgY2hhciAqdmFsdWVzW10gPSB7ICJEYXZlIiwgIk1pa2UiLCAiU3VzYW4iLCAiSm9obiIsICJNaWNoZWxsZSIsIDB9OwotICAgIHJldHVybiAmYW1wO3ZhbHVlc1swXTsKLX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdGhpcyBtb2R1bGUgaXMgY29tcGlsZWQsIG91ciB3cmFwcGVkIEMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluIGEgUGVybCBzY3JpcHQgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdXNlIGFyZ3Y7Ci1AYSA9ICgiRGF2ZSIsICJNaWtlIiwgIkpvaG4iLCAiTWFyeSIpOyAgICAgICAgICAgIyBDcmVhdGUgYW4gYXJyYXkgb2Ygc3RyaW5ncwotYXJndjo6cHJpbnRfYXJncyhcQGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUGFzcyBpdCB0byBvdXIgQyBmdW5jdGlvbgotJGIgPSBhcmd2OjpnZXRfYXJncygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgR2V0IGFycmF5IG9mIHN0cmluZ3MgZnJvbSBDCi1wcmludCBAJGIsIlxuIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcmludCBpdCBvdXQKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotT2YgY291cnNlLCB0aGVyZSBhcmUgbWFueSBvdGhlciBwb3NzaWJpbGl0aWVzLiAgQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYXJyYXkgcmVmZXJlbmNlcywgd2UgY291bGQgcGFzcyBpbiBzdHJpbmdzIHNlcGFyYXRlZCBieSBzb21lIGRlbGltZXRlciBhbmQgcGVyZm9ybSBhIHNwbGl0dGluZyBvcGVyYXRpb24gaW4gQy4gPHA+Ci08YSBuYW1lPSJuNDIiPjwvYT48aDM+IFVzaW5nIHR5cGVtYXBzIHRvIHJldHVybiB2YWx1ZXM8L2gzPgotU29tZXRpbWVzIGl0IGlzIGRlc2lyYWJsZSBmb3IgYSBmdW5jdGlvbiB0byByZXR1cm4gYSB2YWx1ZSBpbiBvbmUgb2YgaXRzIGFyZ3VtZW50cy4gQSBuYW1lZCB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIGhhbmRsZSB0aGlzIGNhc2UuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSByZXR1cm4KLQotLy8gVGhpcyB0ZWxscyBTV0lHIHRvIHRyZWF0IGFuIGRvdWJsZSAqIGFyZ3VtZW50IHdpdGggbmFtZSAnT3V0RG91YmxlJyBhcwotLy8gYW4gb3V0cHV0IHZhbHVlLiAgCi0KLSV0eXBlbWFwKHBlcmw1LGFyZ291dCkgZG91YmxlICpPdXREb3VibGUgewotCSR0YXJnZXQgPSBzdl9uZXdtb3J0YWwoKTsKLQlzdl9zZXRudigkdGFyZ2V0LCAqJHNvdXJjZSk7Ci0JYXJndmkrKzsgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcmV0dXJuIGNvdW50IC0tIGltcG9ydGFudCEgKi8KLX0KLQotLy8gSWYgd2UgZG9uJ3QgY2FyZSB3aGF0IHRoZSBpbnB1dCB2YWx1ZSBpcywgd2UgY2FuIG1ha2UgdGhlIHR5cGVtYXAgaWdub3JlIGl0LgotCi0ldHlwZW1hcChwZXJsNSxpZ25vcmUpIGRvdWJsZSAqT3V0RG91YmxlKGRvdWJsZSBqdW5rKSB7Ci0JJHRhcmdldCA9ICZhbXA7anVuazsgICAgICAgLyoganVuayBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgKi8KLX0KLQotLy8gTm93IGEgZnVuY3Rpb24gdG8gdGVzdCBpdAotJXsKLS8qIFJldHVybnMgdGhlIGZpcnN0IHR3byBpbnB1dCBhcmd1bWVudHMgKi8KLWludCBtdWx0b3V0KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpvdXQxLCBkb3VibGUgKm91dDIpIHsKLQkqb3V0MSA9IGE7Ci0JKm91dDIgPSBiOwotCXJldHVybiAwOwotfTsKLSV9Ci0KLS8vIElmIHdlIG5hbWUgYm90aCBwYXJhbWV0ZXJzIE91dERvdWJsZSBib3RoIHdpbGwgYmUgb3V0cHV0Ci0KLWludCBtdWx0b3V0KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpPdXREb3VibGUsIGRvdWJsZSAqT3V0RG91YmxlKTsKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIG91dHB1dCBhcmd1bWVudHMgYXJlIGVuY291bnRlcmVkLCB0aGV5IGFyZSBzaW1wbHkgYXBwZW5kZWQgdG8gdGhlIHN0YWNrIHVzZWQgdG8gcmV0dXJuIHJlc3VsdHMuICAgVGhpcyB3aWxsIHNob3cgdXAgYXMgYW4gYXJyYXkgd2hlbiB1c2VkIGluIFBlcmwuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+QHIgPSBtdWx0b3V0KDcsMTMpOwotcHJpbnQgIm11bHRvdXQoNywxMykgPSBAclxuIjsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQzIj48L2E+PGgzPiBBY2Nlc3NpbmcgYXJyYXkgc3RydWN0dXJlIG1lbWJlcnM8L2gzPgotQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2RlZmluZSBOQU1FTEVOICAgMzIKLXR5cGVkZWYgc3RydWN0IHsKLQljaGFyICAgbmFtZVtOQU1FTEVOXTsKLQkuLi4KLX0gUGVyc29uOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1CeSBkZWZhdWx0LCBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gdGhlIGhhbmRsZSB0aGUgbmFtZSBzdHJ1Y3R1cmUgc2luY2UgaXQncyBhbiBhcnJheSwgbm90IGEgcG9pbnRlci4gIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG1ha2UgdGhlIGFycmF5IG1lbWJlciByZWFkb25seS4gICAgSG93ZXZlciwgbWVtYmVyIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhpcyBtZW1iZXIgd3JpdGFibGUgZnJvbSBQZXJsIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKG1lbWJlcmluKSBjaGFyW05BTUVMRU5dIHsKLQkvKiBDb3B5IGF0IG1vc3QgTkFNRUxFTiBjaGFyYWN0ZXJzIGludG8gJHRhcmdldCAqLwotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLE5BTUVMRU4pOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuZXZlciBhIDx0dD5jaGFyW05BTUVMRU5dPC90dD4gdHlwZSBpcyBlbmNvdW50ZXJlZCBpbiBhIHN0cnVjdHVyZSBvciBjbGFzcywgdGhpcyB0eXBlbWFwIHByb3ZpZGVzIGEgc2FmZSBtZWNoYW5pc20gZm9yIHNldHRpbmcgaXRzIHZhbHVlLiAgIEFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG1pZ2h0IGNob29zZSB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBuYW1lIHdhcyB0b28gbG9uZyB0byBmaXQgaW50byB0aGUgZmllbGQuPHA+Ci08cD4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSA8dHQ+W05BTUVMRU5dPC90dD4gYXJyYXkgc2l6ZSBpcyBhdHRhY2hlZCB0byB0aGUgdHlwZW1hcC4gQSBkYXRhdHlwZSBpbnZvbHZpbmcgc29tZSBvdGhlciBraW5kIG9mIGFycmF5IHdvdWxkIGJlIGFmZmVjdGVkLiAgIEhvd2V2ZXIsIHdlIGNhbiB3cml0ZSBhIHR5cGVtYXAgdGhhdCB3aWxsIHdvcmsgZm9yIGFueSBhcnJheSBkaW1lbnNpb24gYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAobWVtYmVyaW4pIGNoYXIgW0FOWV0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLCRkaW0wKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBjb2RlIGlzIGdlbmVyYXRlZCwgPHR0PiRkaW0wPC90dD4gZ2V0cyBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBhcnJheSBkaW1lbnNpb24uPHA+Ci08YSBuYW1lPSJuNDQiPjwvYT48aDM+IFR1cm5pbmcgUGVybCByZWZlcmVuY2VzIGludG8gQyBwb2ludGVyczwvaDM+Ci1BIGZyZXF1ZW50IGNvbmZ1c2lvbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QgaXMgZXJyb3JzIGNhdXNlZCBieSB0aGUgbWl4aW5nIG9mIFBlcmwgcmVmZXJlbmNlcyBhbmQgQyBwb2ludGVycy4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGEgQyBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIGl0cyBhcmd1bWVudHMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqYykgewotCSpjID0gYSArIGI7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgY29tbW9uIG1pc2ludGVycHJldGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIGZvbGxvd2luZyBQZXJsIHNjcmlwdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQZXJsIHNjcmlwdAotJGEgPSAzLjU7Ci0kYiA9IDcuNTsKLSRjID0gMC4wOyAgICAgICAgICAjIE91dHB1dCB2YWx1ZQotYWRkKCRhLCRiLFwkYyk7ICAgICMgUGxhY2UgcmVzdWx0IGluIGMgKEV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3Qgd29yaykKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVW5mb3J0dW5hdGVseSwgdGhpcyBkb2VzIE5PVCB3b3JrLiAgVGhlcmUgYXJlIG1hbnkgcmVhc29ucyBmb3IgdGhpcywgYnV0IHRoZSBtYWluIG9uZSBpcyB0aGF0IFNXSUcgaGFzIG5vIGlkZWEgd2hhdCBhIDx0dD5kb3VibGUgKjwvdHQ+IHJlYWxseSBpcy4gIEl0IGNvdWxkIGJlIGFuIGlucHV0IHZhbHVlLCBhbiBvdXRwdXQgdmFsdWUsIG9yIGFuIGFycmF5IG9mIDIgbWlsbGlvbiBlbGVtZW50cy4gIEFzIGEgcmVzdWx0LCBTV0lHIGxlYXZlcyBpdCBhbG9uZSBhbmQgbG9va3MgZXhjbHVzaXZlbHkgZm9yIGEgQyBwb2ludGVyIHZhbHVlICh3aGljaCBpcyBub3QgdGhlIHNhbWUgYXMgYSBQZXJsIHJlZmVyZW5jZS0td2VsbCwgYXQgbGVhc3Qgbm90ZSBvZiB0aGUgdHlwZSB1c2VkIGluIHRoZSBhYm92ZSBzY3JpcHQpLjxwPgotPHA+Ci1Ib3dldmVyLCB5b3UgY2FuIHVzZSBhIHR5cGVtYXAgdG8gZ2V0IHRoZSBkZXNpcmVkIGVmZmVjdC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHBlcmw1LGluKSBkb3VibGUgKiAoZG91YmxlIGR2YWx1ZSkgewotICBTViogdGVtcHN2OwotICBpZiAoIVN2Uk9LKCRzb3VyY2UpKSB7Ci0gICAgY3JvYWsoImV4cGVjdGVkIGEgcmVmZXJlbmNlXG4iKTsKLSAgfQotICB0ZW1wc3YgPSBTdlJWKCRzb3VyY2UpOwotICBpZiAoKCFTdk5PSyh0ZW1wc3YpKSAmYW1wOyZhbXA7ICghU3ZJT0sodGVtcHN2KSkpIHsKLSAgICBjcm9haygiZXhwZWN0ZWQgYSBkb3VibGUgcmVmZXJlbmNlXG4iKTsKLSAgfQotICBkdmFsdWUgPSBTdk5WKHRlbXBzdik7Ci0gICR0YXJnZXQgPSAmYW1wO2R2YWx1ZTsKLX0KLQotJXR5cGVtYXAocGVybDUsYXJnb3V0KSBkb3VibGUgKiB7Ci0gIFNWICp0ZW1wc3Y7Ci0gIHRlbXBzdiA9IFN2UlYoJGFyZyk7Ci0gIHN2X3NldG52KHRlbXBzdiwgKiRzb3VyY2UpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3csIGlmIHlvdSBwbGFjZSB0aGlzIGJlZm9yZSBvdXIgYWRkIGZ1bmN0aW9uLCB3ZSBjYW4gZG8gdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JGEgPSAzLjU7Ci0kYiA9IDcuNTsKLSRjID0gMC4wOwotYWRkKCRhLCRiLFwkYyk7ICAgICAgICAgICAgIyBOb3cgaXQgd29ya3MhCi1wcmludCAiJGNcbiI7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVlvdSdsbCBnZXQgdGhlIG91dHB1dCB2YWx1ZSBvZiAiMTEuMCIgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnRlZC4gICBXaGlsZSB0aGlzIGlzIHByZXR0eSBjb29sLCBpdCBzaG91bGQgYmUgc3RyZXNzZWQgdGhhdCB5b3UgY2FuIGVhc2lseSBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCB3aXRoIHR5cGVtYXBzLS1vZiBjb3Vyc2UgU1dJRyBpcyBoYXMgbmV2ZXIgYmVlbiB0b28gY29uY2VybmVkIGFib3V0IGxlZ2lzbGF0aW5nIG1vcmFsaXR5Li4uLjxwPgotPGEgbmFtZT0ibjQ1Ij48L2E+PGgzPiBVc2VmdWwgZnVuY3Rpb25zPC9oMz4KLVdoZW4gd3JpdGluZyB0eXBlbWFwcywgaXQgaXMgbmVjZXNzYXJ5IHRvIHdvcmsgZGlyZWN0bHkgd2l0aCBQZXJsNSBvYmplY3RzLiAgICBUaGlzLCB1bmZvcnR1bmF0ZWx5LCBjYW4gYmUgYSBkYXVudGluZyB0YXNrLiAgQ29uc3VsdCB0aGUgInBlcmxndXRzIiBtYW4tcGFnZSBmb3IgYWxsIG9mIHRoZSByZWFsbHkgdWdseSBkZXRhaWxzLiAgQSBzaG9ydCBzdW1tYXJ5IG9mIGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25zIGlzIHByb3ZpZGVkIGhlcmUgZm9yIHJlZmVyZW5jZS4gIEl0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IFNXSUcgY2FuIGJlIHVzZWYgcXVpdGUgZWZmZWN0aXZlbHkgd2l0aG91dCBrbm93aW5nIGFueSBvZiB0aGVzZSBkZXRhaWxzLS1lc3BlY2lhbGx5IG5vdyB0aGF0IHRoZXJlIGFyZSB0eXBlbWFwIGxpYnJhcmllcyB0aGF0IGNhbiBhbHJlYWR5IGJlZW4gd3JpdHRlbi48cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjEucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjIucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjMucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjQucG5nIj48YnI+Ci08L2NlbnRlcj48cD4KLTxwPgotPGEgbmFtZT0ibjQ2Ij48L2E+PGgzPiBTdGFuZGFyZCB0eXBlbWFwczwvaDM+Ci1UaGUgZm9sbG93aW5nIHR5cGVtYXBzIHNob3cgaG93IHRvIGNvbnZlcnQgYSBmZXcgY29tbW9uIHR5cGVzIG9mIG9iamVjdHMgYmV0d2VlbiBQZXJsIGFuZCBDIChhbmQgdG8gZ2l2ZSBhIGJldHRlciBpZGVhIG9mIGhvdyBldmVyeXRoaW5nIHdvcmtzKS4gPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoOC50YWJsZS41LnBuZyI+PGJyPgotPGltZyBzcmM9ImNoOC50YWJsZS42LnBuZyI+PGJyPgotPC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im40NyI+PC9hPjxoMz4gUG9pbnRlciBoYW5kbGluZzwvaDM+Ci1TV0lHIHBvaW50ZXJzIGFyZSByZXByZXNlbnRlZCBhcyBibGVzc2VkIHJlZmVyZW5jZXMuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlYWQgcG9pbnRlciB2YWx1ZXMuPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoOC50YWJsZS43LnBuZyI+Ci08L2NlbnRlcj48cD4KLTxhIG5hbWU9Im40OCI+PC9hPjxoMz4gUmV0dXJuIHZhbHVlcyA8L2gzPgotUmV0dXJuIHZhbHVlcyBhcmUgcGxhY2VkIG9uIHRoZSBhcmd1bWVudCBzdGFjayBvZiBlYWNoIHdyYXBwZXIgZnVuY3Rpb24uICBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgc3RhY2sgcG9pbnRlciBpcyBjb250YWluZWQgaW4gYSB2YXJpYWJsZSA8dHQ+YXJndmk8L3R0Pi4gIFdoZW5ldmVyIGEgbmV3IG91dHB1dCB2YWx1ZSBpcyBhZGRlZCwgaXQgaXMgY3JpdGljYWwgdGhhdCB0aGlzIHZhbHVlIGJlIGluY3JlbWVudGVkLiAgIEZvciBtdWx0aXBsZSBvdXRwdXQgdmFsdWVzLCB0aGUgZmluYWwgdmFsdWUgb2YgPHR0PmFyZ3ZpPC90dD4gc2hvdWxkIGJlIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IHZhbHVlcy4gPHA+Ci08cD4KLVRoZSB0b3RhbCBudW1iZXIgb2YgcmV0dXJuIHZhbHVlcyBzaG91bGQgbm90IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIGlucHV0IHZhbHVlcyB1bmxlc3MgeW91IGV4cGxpY2l0bHkgZXh0ZW5kIHRoZSBhcmd1bWVudCBzdGFjay4gICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSA8dHQ+RVhURU5EKCk8L3R0PiBtYWNybyBhcyBpbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAocGVybDUsYXJnb3V0KSBpbnQgKk9VVFBVVCB7Ci0JaWYgKGFyZ3ZpICZndDs9IGl0ZW1zKSB7ICAgICAgICAgICAgCi0JCUVYVEVORChzcCwxKTsgICAgICAgICAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgYnkgMSBvYmplY3QgKi8KLQl9Ci0JJHRhcmdldCA9IHN2X25ld21vcnRhbCgpOwotCXN2X3NldGl2KCR0YXJnZXQsKElWKSAqKCRzb3VyY2UpKTsKLQlhcmd2aSsrOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgyPiBUaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9oMj4KLVBlcmw1IHNoYWRvdyBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCBvbiB0b3Agb2YgdGhlIGxvdy1sZXZlbCBDIGludGVyZmFjZSBwcm92aWRlZCBieSBTV0lHLiAgIEJ5IGltcGxlbWVudGluZyB0aGUgY2xhc3NlcyBpbiBQZXJsIGluc3RlYWQgb2YgQywgd2UgZ2V0IGEgbnVtYmVyIG9mIGFkdmFudGFnZXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+VGhlIGNsYXNzZXMgYXJlIGVhc2llciB0byBpbXBsZW1lbnQgKGFmdGVyIGFsbCBQZXJsIG1ha2VzIGxvdHMgb2YgdGhpbmdzIGVhc2llcikuCi08bGk+Qnkgd3JpdGluZyBpbiBQZXJsLCB0aGUgY2xhc3NlcyB0ZW5kIHRvIGludGVyYWN0IGJldHRlciB3aXRoIG90aGVyIFBlcmwgb2JqZWN0cyBhbmQgcHJvZ3JhbXMuCi08bGk+WW91IGNhbiBtb2RpZnkgdGhlIHJlc3VsdGluZyBQZXJsIGNvZGUgd2l0aG91dCByZWNvbXBpbGluZyB0aGUgQyBtb2R1bGUuCi08L3VsPgotPHA+Ci1TaGFkb3cgY2xhc3NlcyBhcmUgbmV3IGluIFNXSUcgMS4xIGFuZCBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwuICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYSBjb21iaW5hdGlvbiBvZiBjb250cmlidXRpb25zIHByb3ZpZGVkIGJ5IEdhcnkgSG9sdCBhbmQgRGF2aWQgRmxldGNoZXItLW1hbnkgdGhhbmtzITxwPgotPGEgbmFtZT0ibjQ5Ij48L2E+PGgzPiAgTW9kdWxlIGFuZCBwYWNrYWdlIG5hbWVzPC9oMz4KLVdoZW4gc2hhZG93IGNsYXNzaW5nIGlzIGVuYWJsZWQsIFNXSUcgZ2VuZXJhdGVzIGEgbG93LWxldmVsIHBhY2thZ2UgbmFtZWQgYG1vZHVsZWMnIHdoZXJlIGBtb2R1bGUnIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgeW91IHByb3ZpZGVkIHdpdGggdGhlIDx0dD4lbW9kdWxlPC90dD4gZGlyZWN0aXZlIChTV0lHIGFwcGVuZHMgYSBgYycgdG8gdGhlIG5hbWUgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyB0aGUgbG93LWxldmVsIEMgYmluZGluZ3MpLiAgICAgVGhpcyBsb3ctbGV2ZWwgcGFja2FnZSBpcyBleGFjdGx5IHRoZSBzYW1lIG1vZHVsZSB0aGF0IFNXSUcgd291bGQgaGF2ZSBjcmVhdGVkIHdpdGhvdXQgdGhlIDx0dD5gLXNoYWRvdzwvdHQ+JyBvcHRpb24sIG9ubHkgcmVuYW1lZC48cD4KLTxwPgotVXNpbmcgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UsIFNXSUcgY3JlYXRlcyBQZXJsIHdyYXBwZXJzIGFyb3VuZCBjbGFzc2VzLCBzdHJ1Y3RzLCBhbmQgZnVuY3Rpb25zLiAgICBUaGlzIGNvbGxlY3Rpb24gb2Ygd3JhcHBlcnMgYmVjb21lcyB0aGUgUGVybCBtb2R1bGUgdGhhdCB5b3Ugd2lsbCB1c2UgaW4geW91ciBQZXJsIGNvZGUsIG5vdCB0aGUgbG93LWxldmVsIHBhY2thZ2UgKHRoZSBvcmlnaW5hbCBwYWNrYWdlIGlzIGhpZGRlbiwgYnV0IHdvcmtpbmcgYmVoaW5kIHRoZSBzY2VuZXMpLjxwPgotPGEgbmFtZT0ibjUwIj48L2E+PGgzPiBXaGF0IGdldHMgY3JlYXRlZD88L2gzPgotU3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIFNXSUcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgdmVjdG9yCi1zdHJ1Y3QgVmVjdG9yIHsKLQlWZWN0b3IoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JflZlY3RvcigpOwotCWRvdWJsZSB4LHksejsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gd3JhcHBlZCwgU1dJRyBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGxvdy1sZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VmVjdG9yICpuZXdfVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotdm9pZCAgICBkZWxldGVfVmVjdG9yKFZlY3RvciAqdik7Ci1kb3VibGUgIFZlY3Rvcl94X2dldChWZWN0b3IgKnYpOwotZG91YmxlICBWZWN0b3JfeF9zZXQoVmVjdG9yICp2LCBkb3VibGUgdmFsdWUpOwotZG91YmxlICBWZWN0b3JfeV9nZXQoVmVjdG9yICp2KTsKLWRvdWJsZSAgVmVjdG9yX3lfc2V0KFZlY3RvciAqdiwgZG91YmxlIHZhbHVlKTsKLWRvdWJsZSAgVmVjdG9yX3pfZ2V0KFZlY3RvciAqdik7Ci1kb3VibGUgIFZlY3Rvcl96X3NldChWZWN0b3IgKnYsIGRvdWJsZSB2YWx1ZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXNlIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHVzZWQgdG8gY3JlYXRlIGEgUGVybCBzaGFkb3cgY2xhc3MgdGhhdCBsb29rcyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnBhY2thZ2UgVmVjdG9yOwotQElTQSA9IHF3KCB2ZWN0b3IgKTsKLSVPV05FUiA9ICgpOwotJUJMRVNTRURNRU1CRVJTID0gKCk7Ci0KLXN1YiBuZXcgKCkgewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgbXkgQGFyZ3MgPSBAXzsKLSAgICAkc2VsZiA9IHZlY3RvcmM6Om5ld19WZWN0b3IoQGFyZ3MpOwotICAgIHJldHVybiB1bmRlZiBpZiAoIWRlZmluZWQoJHNlbGYpKTsKLSAgICBibGVzcyAkc2VsZiwgIlZlY3RvciI7Ci0gICAgJE9XTkVSeyRzZWxmfSA9IDE7Ci0gICAgbXkgJXJldHZhbDsKLSAgICB0aWUgJXJldHZhbCwgIlZlY3RvciIsICRzZWxmOwotICAgIHJldHVybiBibGVzcyBcJXJldHZhbCwiVmVjdG9yIjsKLX0KLQotc3ViIERFU1RST1kgewotICAgIG15ICRzZWxmID0gc2hpZnQ7IAotICAgIGlmIChleGlzdHMgJE9XTkVSeyRzZWxmfSkgewotCSBkZWxldGVfVmVjdG9yKCRzZWxmKSk7Ci0JIGRlbGV0ZSAkT1dORVJ7JHNlbGZ9OwotfQotCi1zdWIgRkVUQ0ggewotICAgIG15ICgkc2VsZiwkZmllbGQpID0gQF87Ci0gICAgbXkgJG1lbWJlcl9mdW5jID0gInZlY3RvcmM6OlZlY3Rvcl8ke2ZpZWxkfV9nZXQiOwotICAgIG15ICR2YWwgPSAmYW1wOyRtZW1iZXJfZnVuYygkc2VsZik7Ci0gICAgaWYgKGV4aXN0cyAkQkxFU1NFRE1FTUJFUlN7JGZpZWxkfSkgewotICAgICAgICByZXR1cm4gdW5kZWYgaWYgKCFkZWZpbmVkKCR2YWwpKTsKLSAgICAgICAgbXkgJXJldHZhbDsKLSAgICAgICAgdGllICVyZXR2YWwsJEJMRVNTRURNRU1CRVJTeyRmaWVsZH0sJHZhbDsKLSAgICAgICAgcmV0dXJuIGJsZXNzIFwlcmV0dmFsLCAkQkxFU1NFRE1FTUJFUlN7JGZpZWxkfTsKLSAgICB9Ci0gICAgcmV0dXJuICR2YWw7Ci19Ci0KLXN1YiBTVE9SRSB7Ci0gICAgbXkgKCRzZWxmLCRmaWVsZCwkbmV3dmFsKSA9IEBfOwotICAgIG15ICRtZW1iZXJfZnVuYyA9ICJ2ZWN0b3JjOjpWZWN0b3JfJHtmaWVsZH1fc2V0IjsKLSAgICBpZiAoZXhpc3RzICRCTEVTU0VETUVNQkVSU3skZmllbGR9KSB7Ci0gICAgICAgICZhbXA7JG1lbWJlcl9mdW5jKCRzZWxmLHRpZWQoJXskbmV3dmFsfSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICZhbXA7JG1lbWJlcl9mdW5jKCRzZWxmLCRuZXd2YWwpOwotICAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRWFjaCBzdHJ1Y3R1cmUgb3IgY2xhc3MgaXMgbWFwcGVkIGludG8gYSBQZXJsIHBhY2thZ2Ugb2YgdGhlIHNhbWUgbmFtZS4gVGhlIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFyZSBtYXBwZWQgaW50byBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0aGUgcGFja2FnZSBhbmQgYXJlIGFsd2F5cyBuYW1lZCAibmV3IiBhbmQgIkRFU1RST1kiLiAgICBUaGUgY29uc3RydWN0b3IgYWx3YXlzIHJldHVybnMgYSB0aWVkIGhhc2ggdGFibGUuICAgVGhpcyBoYXNoIHRhYmxlIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBtZW1iZXIgdmFyaWFibGVzIG9mIGEgc3RydWN0dXJlIGluIGFkZGl0aW9uIHRvIGJlaW5nIGFibGUgdG8gaW52b2tlIG1lbWJlciBmdW5jdGlvbnMuICBUaGUgPHR0PiVPV05FUjwvdHQ+IGFuZCA8dHQ+JUJMRVNTRURNRU1CRVJTPC90dD4gaGFzaCB0YWJsZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBhbmQgZGVzY3JpYmVkIHNob3J0bHkuIDxwPgotPHA+Ci1UbyB1c2Ugb3VyIG5ldyBzaGFkb3cgY2xhc3Mgd2UgY2FuIHNpbXBseSBkbyB0aGUgZm9sbG93aW5nOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgUGVybCBjb2RlIHVzaW5nIFZlY3RvciBjbGFzcwotJHYgPSBuZXcgVmVjdG9yKDIsMyw0KTsKLSR3ID0gVmVjdG9yLSZndDtuZXcoLTEsLTIsLTMpOwotCi0jIEFzc2lnbm1lbnQgb2YgYSBzaW5nbGUgbWVtYmVyCi0kdi0mZ3Q7e3h9ID0gNy41OwotCi0jIEFzc2lnbm1lbnQgb2YgYWxsIG1lbWJlcnMKLSUkdiA9ICggeD0mZ3Q7MywKLQkgeT0mZ3Q7OSwKLQkgej0mZ3Q7LTIpOwotCi0jIFJlYWRpbmcgbWVtYmVycwotJHggPSAkdi0mZ3Q7e3h9OwotCi0jIERlc3RydWN0aW9uCi0kdi0mZ3Q7REVTVFJPWSgpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTEiPjwvYT48aDM+IE9iamVjdCBPd25lcnNoaXA8L2gzPgotSW4gb3JkZXIgZm9yIHNoYWRvdyBjbGFzc2VzIHRvIHdvcmsgcHJvcGVybHksIGl0IGlzIG5lY2Vzc2FyeSBmb3IgUGVybCB0byBtYW5hZ2Ugc29tZSBtZWNoYW5pc20gb2Ygb2JqZWN0IG93bmVyc2hpcC4gICBIZXJlJ3MgdGhlIGNydXggb2YgdGhlIHByb2JsZW0tLS1zdXBwb3NlIHlvdSBoYWQgYSBmdW5jdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlZlY3RvciAqVmVjdG9yX2dldChWZWN0b3IgKnYsIGludCBpbmRleCkgewotCXJldHVybiAmYW1wO3ZbaV07Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZnVuY3Rpb24gdGFrZXMgYSBWZWN0b3IgcG9pbnRlciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYW5vdGhlciBWZWN0b3IuICAgU3VjaCBhIGZ1bmN0aW9uIG1pZ2h0IGJlIHVzZWQgdG8gbWFuYWdlIGFycmF5cyBvciBsaXN0cyBvZiB2ZWN0b3JzIChpbiBDKS4gICBOb3cgY29udHJhc3QgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb25zdHJ1Y3RvciBmb3IgYSBWZWN0b3Igb2JqZWN0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5WZWN0b3IgKm5ld19WZWN0b3IoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikgewotCVZlY3RvciAqdjsKLQl2ID0gbmV3IFZlY3Rvcih4LHkseik7ICAgICAgICAvLyBDYWxsIEMrKyBjb25zdHJ1Y3RvcgotCXJldHVybiB2OwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Cb3RoIGZ1bmN0aW9ucyByZXR1cm4gYSBWZWN0b3IsIGJ1dCB0aGUgY29uc3RydWN0b3IgaXMgcmV0dXJuaW5nIGEgYnJhbmQtbmV3IFZlY3RvciB3aGlsZSB0aGUgb3RoZXIgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgVmVjdG9yIHRoYXQgd2FzIGFscmVhZHkgY3JlYXRlZCAoaG9wZWZ1bGx5KS4gICAgSW4gUGVybCwgYm90aCB2ZWN0b3JzIHdpbGwgYmUgaW5kaXN0aW5ndWlzaGFibGUtLS1jbGVhcmx5IGEgcHJvYmxlbSBjb25zaWRlcmluZyB0aGF0IHdlIHdvdWxkIHByb2JhYmx5IGxpa2UgdGhlIG5ld2x5IGNyZWF0ZWQgVmVjdG9yIHRvIGJlIGRlc3Ryb3llZCB3aGVuIHdlIGFyZSBkb25lIHdpdGggaXQuPHA+Ci08cD4KLVRvIG1hbmFnZSB0aGVzZSBwcm9ibGVtcywgZWFjaCBjbGFzcyBjb250YWlucyB0d28gbWV0aG9kcyB0aGF0IGFjY2VzcyBhbiBpbnRlcm5hbCBoYXNoIHRhYmxlIGNhbGxlZCA8dHQ+JU9XTkVSPC90dD4uICAgVGhpcyBoYXNoIGtlZXBzIGEgbGlzdCBvZiBhbGwgb2YgdGhlIG9iamVjdHMgdGhhdCBQZXJsIGtub3dzIHRoYXQgaXQgaGFzIGNyZWF0ZWQuICAgIFRoaXMgaGFwcGVucyBpbiB0d28gY2FzZXM6ICgxKSB3aGVuIHRoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBjYWxsZWQsICBhbmQgKDIpIHdoZW4gYSBmdW5jdGlvbiBpbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcgb2JqZWN0IChhcyBpcyBkb25lIHdoZW4gU1dJRyBuZWVkcyB0byByZXR1cm4gYSBjb21wbGV4IGRhdGF0eXBlIGJ5IHZhbHVlKS4gICBXaGVuIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQsIHRoZSBQZXJsIHNoYWRvdyBjbGFzcyBtb2R1bGUgY2hlY2tzIHRoZSA8dHQ+JU9XTkVSPC90dD4gaGFzaCB0byBzZWUgaWYgUGVybCBjcmVhdGVkIHRoZSBvYmplY3QuICAgSWYgc28sIHRoZSBDL0MrKyBkZXN0cnVjdG9yIGlzIGludm9rZWQuICBJZiBub3QsIHdlIHNpbXBseSBkZXN0cm95IHRoZSBQZXJsIG9iamVjdCBhbmQgbGVhdmUgdGhlIHVuZGVybHlpbmcgQyBvYmplY3QgYWxvbmUgKHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgc29tZW9uZSBlbHNlIG11c3QgaGF2ZSBjcmVhdGVkIGl0KS48cD4KLTxwPgotVGhpcyBzY2hlbWUgd29ya3MgcmVtYXJrYWJseSB3ZWxsIGluIHByYWN0aWNlIGJ1dCBpdCBpc24ndCBmb29scHJvb2YuICBJbiBmYWN0LCBpdCB3aWxsIGZhaWwgaWYgeW91IGNyZWF0ZSBhIG5ldyBDIG9iamVjdCBpbiBQZXJsLCBwYXNzIGl0IG9uIHRvIGEgQyBmdW5jdGlvbiB0aGF0IHJlbWVtYmVycyB0aGUgb2JqZWN0LCBhbmQgdGhlbiBkZXN0cm95IHRoZSBjb3JyZXNwb25kaW5nIFBlcmwgb2JqZWN0ICh0aGlzIHNpdHVhdGlvbiB0dXJucyBvdXQgdG8gY29tZSB1cCBmcmVxdWVudGx5IHdoZW4gY29uc3RydWN0aW5nIG9iamVjdHMgbGlrZSBsaW5rZWQgbGlzdHMgYW5kIHRyZWVzKS4gICBXaGVuIEMgdGFrZXMgcG9zc2Vzc2lvbiBvZiBhbiBvYmplY3QsIHlvdSBjYW4gY2hhbmdlIFBlcmwncyBvd2Vyc2hpcCBieSBzaW1wbHkgZGVsZXRpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSA8dHQ+JU9XTkVSPC90dD4gaGFzaC4gIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgPHR0PkRJU09XTiA8L3R0Pm1ldGhvZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFBlcmwgY29kZSB0byBjaGFuZ2Ugb3duZXJzaGlwIG9mIGFuIG9iamVjdAotJHYgPSBuZXcgVmVjdG9yKHgseSx6KTsKLSR2LSZndDtESVNPV04oKTsgICAgIAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyBhY3F1aXJlIG93bmVyc2hpcCBvZiBhbiBvYmplY3QsIHRoZSA8dHQ+QUNRVUlSRTwvdHQ+IG1ldGhvZCBjYW4gYmUgdXNlZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEdpdmVuIFBlcmwgb3duZXJzaGlwIG9mIGEgZmlsZQotJHUgPSBWZWN0b3JfZ2V0KCR2KTsKLSR1LSZndDtBQ1FVSVJFKCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFzIGFsd2F5cywgYSBsaXR0bGUgY2FyZSBpcyBpbiBvcmRlci4gICAgU1dJRyBkb2VzIG5vdCBwcm92aWRlIHJlZmVyZW5jZSBjb3VudGluZywgZ2FyYmFnZSBjb2xsZWN0aW9uLCBvciBhZHZhbmNlZCBmZWF0dXJlcyBvbmUgbWlnaHQgZmluZCBpbiBzb3BoaXN0aWNhdGVkIGxhbmd1YWdlcy48cD4KLTxhIG5hbWU9Im41MiI+PC9hPjxoMz4gTmVzdGVkIE9iamVjdHM8L2gzPgotU3VwcG9zZSB0aGF0IHdlIGhhdmUgYSBuZXcgb2JqZWN0IHRoYXQgbG9va3MgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdHJ1Y3QgUGFydGljbGUgewotCVZlY3RvciByOwotCVZlY3RvciB2OwotCVZlY3RvciBmOwotCWludAl0eXBlOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBtZW1iZXJzIG9mIHRoZSBzdHJ1Y3R1cmUgYXJlIGNvbXBsZXggb2JqZWN0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGVuY2Fwc3VsYXRlZCBpbiBhIFBlcmwgc2hhZG93IGNsYXNzLiAgICBUbyBoYW5kbGUgdGhlc2UgY29ycmVjdGx5LCB3ZSB1c2UgdGhlIDx0dD4lQkxFU1NFRE1FTUJFUlM8L3R0PiBoYXNoIHdoaWNoIHdvdWxkIGxvb2sgbGlrZSB0aGlzIChhbG9uZyB3aXRoIHNvbWUgc3VwcG9ydGluZyBjb2RlKSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cGFja2FnZSBQYXJ0aWNsZTsKLS4uLgotJUJMRVNTRURNRU1CRVJTID0gKAotCXIgPSZndDsgYFZlY3RvcicsCi0JdiA9Jmd0OyBgVmVjdG9yJywKLQlmID0mZ3Q7IGBWZWN0b3InLAotKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBmZXRjaGluZyBtZW1iZXJzIGZyb20gdGhlIHN0cnVjdHVyZSwgIDx0dD4lQkxFU1NFRE1FTUJFUlM8L3R0PiBpcyBjaGVja2VkLiAgIElmIHRoZSByZXF1ZXN0ZWQgZmllbGQgaXMgcHJlc2VudCwgd2UgY3JlYXRlIGEgdGllZC1oYXNoIHRhYmxlIGFuZCByZXR1cm4gaXQuICAgSWYgbm90LCB3ZSBqdXN0IHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtZW1iZXIgdW5tb2RpZmllZC48cD4KLTxwPgotVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgdXMgdG8gb3BlcmF0ZSBvbiBuZXN0ZWQgc3RydWN0dXJlcyBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIFBlcmwgYWNjZXNzIG9mIG5lc3RlZCBzdHJ1Y3R1cmUKLSRwID0gbmV3IFBhcnRpY2xlKCk7Ci0kcC0mZ3Q7e2Z9LSZndDt7eH0gPSAwLjA7Ci0lJHskcC0mZ3Q7e3Z9fSA9ICggeD0mZ3Q7MCwgeT0mZ3Q7MCwgej0mZ3Q7MCk7ICAgICAgICAgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTxhIG5hbWU9Im41MyI+PC9hPjxoMz4gU2hhZG93IEZ1bmN0aW9uczwvaDM+Ci1XaGVuIGZ1bmN0aW9ucyB0YWtlIGFyZ3VtZW50cyBpbnZvbHZpbmcgYSBjb21wbGV4IG9iamVjdCwgaXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNoYWRvdyBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5kb3VibGUgZG90X3Byb2R1Y3QoVmVjdG9yICp2MSwgVmVjdG9yICp2Mik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNpbmNlIFZlY3RvciBpcyBhbiBvYmplY3QgYWxyZWFkeSB3cmFwcGVkIGludG8gYSBzaGFkb3cgY2xhc3MsIHdlIG5lZWQgdG8gbW9kaWZ5IHRoaXMgZnVuY3Rpb24gdG8gYWNjZXB0IGFyZ3VtZW50cyB0aGF0IGFyZSBnaXZlbiBpbiB0aGUgZm9ybSBvZiB0aWVkIGhhc2ggdGFibGVzLiAgIFRoaXMgaXMgZG9uZSBieSBjcmVhdGluZyBhIFBlcmwgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdWIgZG90X3Byb2R1Y3QgewotICAgIG15IEBhcmdzID0gQF87Ci0gICAgJGFyZ3NbMF0gPSB0aWVkKCV7JGFyZ3NbMF19KTsgICAgICAgICAjIEdldCB0aGUgcmVhbCBwb2ludGVyIHZhbHVlcwotICAgICRhcmdzWzFdID0gdGllZCgleyRhcmdzWzFdfSk7Ci0gICAgbXkgJHJlc3VsdCA9IHZlY3RvcmM6OmRvdF9wcm9kdWN0KEBhcmdzKTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmdW5jdGlvbiByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGJ1dCBvcGVyYXRlcyBpbiBhbiBpZGVudGljYWwgbWFubmVyLjxwPgotPGEgbmFtZT0ibjU0Ij48L2E+PGgzPiAgSW5oZXJpdGFuY2U8L2gzPgotU2ltcGxlIEMrKyBpbmhlcml0YW5jZSBpcyBoYW5kbGVkIHVzaW5nIHRoZSBQZXJsIDx0dD5ASVNBPC90dD4gYXJyYXkgaW4gZWFjaCBjbGFzcyBwYWNrYWdlLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gc2hhcGVzLmkKLS8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgZm9yIHNoYXBlcyBjbGFzcwotJW1vZHVsZSBzaGFwZXMKLSV7Ci0jaW5jbHVkZSAic2hhcGVzLmgiCi0lfQotCi1jbGFzcyBTaGFwZSB7Ci1wdWJsaWM6Ci0JdmlydHVhbCBkb3VibGUgYXJlYSgpID0gMDsKLQl2aXJ0dWFsIGRvdWJsZSBwZXJpbWV0ZXIoKSA9IDA7Ci0Jdm9pZCAgICBzZXRfbG9jYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KTsKLX07Ci1jbGFzcyBDaXJjbGUgOiBwdWJsaWMgU2hhcGUgewotcHVibGljOgotCUNpcmNsZShkb3VibGUgcmFkaXVzKTsKLQl+Q2lyY2xlKCk7Ci0JZG91YmxlIGFyZWEoKTsKLQlkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotY2xhc3MgU3F1YXJlIDogcHVibGljIFNoYXBlIHsKLXB1YmxpYzoKLQlTcXVhcmUoZG91YmxlIHNpemUpOwotCX5TcXVhcmUoKTsKLQlkb3VibGUgYXJlYSgpOwotCWRvdWJsZSBwZXJpbWV0ZXIoKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHJlc3VsdGluZywgUGVybCB3cmFwcGVyIGNsYXNzIHdpbGwgY3JlYXRlIHRoZSBmb2xsb3dpbmcgY29kZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPlBhY2thZ2UgU2hhcGU7Ci1ASVNBID0gKHNoYXBlcyk7Ci0uLi4KLVBhY2thZ2UgQ2lyY2xlOwotQElTQSA9IChzaGFwZXMgU2hhcGUpOwotLi4uCi1QYWNrYWdlIFNxdWFyZTsKLUBJU0EgPSAoc2hhcGVzIFNoYXBlKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5ASVNBPC90dD4gYXJyYXkgZGV0ZXJtaW5lcyB3aGVyZSB0byBsb29rIGZvciBtZXRob2RzIG9mIGEgcGFydGljdWxhciBjbGFzcy4gIEluIHRoaXMgY2FzZSwgYm90aCB0aGUgPHR0PkNpcmNsZTwvdHQ+IGFuZCA8dHQ+U3F1YXJlPC90dD4gY2xhc3NlcyBpbmhlcml0IGZ1bmN0aW9ucyBmcm9tIDx0dD5TaGFwZTwvdHQ+IHNvIHdlJ2xsIHdhbnQgdG8gbG9vayBpbiB0aGUgPHR0PlNoYXBlPC90dD4gYmFzZSBjbGFzcyBmb3IgdGhlbS4gICAgQWxsIGNsYXNzZXMgYWxzbyBpbmhlcml0IGZyb20gdGhlIHRvcC1sZXZlbCBtb2R1bGUgPHR0PnNoYXBlczwvdHQ+LiAgIFRoaXMgaXMgYmVjYXVzZSBjZXJ0YWluIGNvbW1vbiBvcGVyYXRpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQgc2hhZG93IGNsYXNzZXMgYXJlIGltcGxlbWVudGVkIG9ubHkgb25jZSBhbmQgcmV1c2VkIGluIHRoZSB3cmFwcGVyIGNvZGUgZm9yIHZhcmlvdXMgY2xhc3NlcyBhbmQgc3RydWN0dXJlcy48cD4KLTxwPgotU2luY2UgU1dJRyBzaGFkb3cgY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQgaW4gUGVybCwgaXQgaXMgZWFzeSB0byBzdWJjbGFzcyBmcm9tIGFueSBTV0lHIGdlbmVyYXRlZCBjbGFzcy4gIFRvIGRvIHRoaXMsIHNpbXBseSBwdXQgdGhlIG5hbWUgb2YgYSBTV0lHIGNsYXNzIGluIHRoZSA8dHQ+QElTQTwvdHQ+IGFycmF5IGZvciB5b3VyIG5ldyBjbGFzcy4gSG93ZXZlciwgYmUgZm9yZXdhcm5lZCB0aGF0IHRoaXMgaXMgbm90IGEgdHJpdmlhbCBwcm9ibGVtLiAgSW4gcGFydGljdWxhciwgaW5oZXJpdGFuY2Ugb2YgZGF0YSBtZW1iZXJzIGlzIGV4dHJlbWVseSB0cmlja3kgKGFuZCBJJ20gbm90IGV2ZW4gc3VyZSBpZiBpdCByZWFsbHkgd29ya3MpLiA8cD4KLTxhIG5hbWU9Im41NSI+PC9hPjxoMz4gSXRlcmF0b3JzPC9oMz4KLVdpdGggZWFjaCBjbGFzcyBvciBzdHJ1Y3R1cmUsIFNXSUcgYWxzbyBnZW5lcmF0ZXMgYSBwYWlyIG9mIGZ1bmN0aW9ucyB0byBzdXBwb3J0IFBlcmwgaXRlcmF0b3JzLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIDx0dD5rZXlzPC90dD4gYW5kIDx0dD5lYWNoPC90dD4gZnVuY3Rpb25zIG9uIGEgQy9DKysgb2JqZWN0LiAgSXRlcmF0b3JzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBjb2RlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3ViIEZJUlNUS0VZIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIEBJVEVSQVRPUlN7JHNlbGZ9ID0gW2B4JywneScsJ3onLCBdOwotICAgIG15ICRmaXJzdCA9IHNoaWZ0IEB7JElURVJBVE9SU3skc2VsZn19OwotICAgIHJldHVybiAkZmlyc3Q7Ci19Ci0KLXN1YiBORVhUS0VZIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgICRuZWxlbSA9IHNjYWxhciBAeyRJVEVSQVRPUlN7JHNlbGZ9fTsKLSAgICBpZiAoJG5lbGVtICZndDsgMCkgewotICAgICAgICBteSAkbWVtYmVyID0gc2hpZnQgQHskSVRFUkFUT1JTeyRzZWxmfX07Ci0gICAgICAgIHJldHVybiAkbWVtYmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEBJVEVSQVRPUlN7JHNlbGZ9ID0gW2B4JywneScsJ3onLCBdOwotICAgICAgICByZXR1cm4gKCk7Ci0gICAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4lSVRFUkFUT1JTPC90dD4gaGFzaCB0YWJsZSBtYWludGFpbnMgdGhlIHN0YXRlIG9mIGVhY2ggb2JqZWN0IGZvciB3aGljaCB0aGUgPHR0PmtleXM8L3R0PiBvciA8dHQ+ZWFjaDwvdHQ+IGZ1bmN0aW9uIGhhcyBiZWVuIGFwcGxpZWQgdG8uICAgIFRoZSBzdGF0ZSBpcyBtYWludGFpbmVkIGJ5IGtlZXBpbmcgYSBsaXN0IG9mIHRoZSBtZW1iZXIgbmFtZXMuPHA+Ci08cD4KLVdoaWxlIGl0ZXJhdG9ycyBtYXkgYmUgb2YgbGltaXRlZCB1c2Ugd2hlbiB3b3JraW5nIHdpdGggQy9DKysgY29kZSwgaXQgdHVybnMgb3V0IHRoZXkgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhbiBlbGVtZW50IGJ5IGVsZW1lbnQgY29weSBvZiBhbiBvYmplY3QuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JHYgPSBuZXcgVmVjdG9yKDEsMiwzKTsKLSR3ID0gbmV3IFZlY3RvcigwLDAsMCk7Ci0lJHcgPSAlJHY7ICAgICAgICAgICAgICAgICMgQ29weSBjb250ZW50cyBvZiB2IGludG8gdwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ib3dldmVyLCB0aGlzIGlzIG5vdCBhIGRlZXAgY29weSBzbyB0aGV5IHByb2JhYmx5IHdvcmtzIGJldHRlciB3aXRoIEMgdGhhbiB3aXRoIEMrKy48cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMj4gV2hlcmUgdG8gZ28gZnJvbSBoZXJlPzwvaDI+Ci1UaGUgU1dJRyBQZXJsNSBtb2R1bGUgaXMgY29uc3RhbnRseSBpbXByb3ZpbmcgdG8gcHJvdmlkZSBiZXR0ZXIgaW50ZWdyYXRpb24gd2l0aCBQZXJsIGFuZCB0byBiZSBlYXNpZXIgdG8gdXNlLiAgIFRoZSBpbnRyb2R1Y3Rpb24gb2Ygc2hhZG93IGNsYXNzZXMgYW5kIHR5cGVtYXBzIGluIHRoaXMgcmVsZWFzZSBhcmUgb25lIG1vcmUgc3RlcCBpbiB0aGF0IGRpcmVjdGlvbi4gICAgVGhlIFNXSUcgPHR0PkV4YW1wbGVzPC90dD4gZGlyZWN0b3J5IGNvbnRhaW5zIG1vcmUgc2ltcGxlIGV4YW1wbGVzIG9mIGJ1aWxkaW5nIFBlcmw1IG1vZHVsZXMuIEFzIGFsd2F5cywgc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmluZyB0aGUgUGVybDUgaW1wbGVtZW50YXRpb24gYXJlIHdlbGNvbWUuPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ3OjAxIDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1ByZWZhY2UuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHJlZmFjZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzIwN2Y5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHJlZmFjZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCEtLSBQdWJsaXNoZWQgYnkgUXVhZHJhbGF5IFdlYldvcmtzIEhUTUwgTGl0ZSAxLjUuMSAtLT4KLTwhLS0gQW5kIG11bmdlZCBieSBEYXZlJ3Mgc3BlY2lhbCBQeXRob24gc2NyaXB0IC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5QcmVmYWNlPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4gUHJlZmFjZTwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPkludHJvZHVjdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5TV0lHIHJlc291cmNlczwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5BYm91dCB0aGlzIG1hbnVhbDwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5DcmVkaXRzPC9hPgotPGxpPiA8YSBocmVmPSIjbjUiPldoYXQncyBuZXc/PC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPkJ1ZyByZXBvcnRzPC9hPgotPGxpPiA8YSBocmVmPSIjbjciPlNXSUcgaXMgZnJlZTwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb248L2gyPgotU1dJRyBpcyBhIHRvb2wgZm9yIHNvbHZpbmcgcHJvYmxlbXMuPHA+Ci08cD4KLU1vcmUgc3BlY2lmaWNhbGx5LCBTV0lHIGlzIGEgc2ltcGxlIHRvb2wgZm9yIGJ1aWxkaW5nIGludGVyYWN0aXZlIEMsIEMrKywgb3IgT2JqZWN0aXZlLUMgcHJvZ3JhbXMgd2l0aCBjb21tb24gc2NyaXB0aW5nIGxhbmd1YWdlcyBzdWNoIGFzIFRjbCwgUGVybCwgYW5kIFB5dGhvbi4gT2YgY291cnNlLCBtb3JlIGltcG9ydGFudGx5LCBTV0lHIGlzIGEgdG9vbCBmb3IgbWFraW5nIEMgcHJvZ3JhbW1pbmcgbW9yZSBlbmpveWFibGUgYW5kIHByb21vdGluZyBsYXppbmVzcyAoYW4gZXNzZW50aWFsIGZlYXR1cmUpLiBTV0lHIGlzIG5vdCBwYXJ0IG9mIGFuIG92ZXJncm93biBzb2Z0d2FyZSBlbmdpbmVlcmluZyBwcm9qZWN0LCBhbiBhdHRlbXB0IHRvIGJ1aWxkIHNvbWUgc29ydCBvZiBtb25vbGl0aGljIHByb2dyYW1taW5nIGVudmlyb25tZW50LCBvciBhbiBhdHRlbXB0IHRvIGZvcmNlIGV2ZXJ5b25lIHRvIHJld3JpdGUgYWxsIG9mIHRoZWlyIGNvZGUgKGllLiBjb2RlIHJldXNlKS4gSW4gZmFjdCwgbm9uZSBvZiB0aGVzZSB0aGluZ3MgaGF2ZSBldmVyIGJlZW4gYSBwcmlvcml0eS48cD4KLTxwPgotU1dJRyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgaW4gdGhlIFRoZW9yZXRpY2FsIFBoeXNpY3MgRGl2aXNpb24gYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBidWlsZGluZyBpbnRlcmZhY2VzIHRvIGxhcmdlIG1hdGVyaWFscyBzY2llbmNlIHJlc2VhcmNoIHNpbXVsYXRpb25zIGJlaW5nIHJ1biBvbiB0aGUgQ29ubmVjdGlvbiBNYWNoaW5lIDUgc3VwZXJjb21wdXRlci4gSW4gdGhpcyBlbnZpcm9ubWVudCwgd2Ugd2VyZSBmYWNlZCB3aXRoIHRoZSBwcm9ibGVtcyBvZiB3b3JraW5nIHdpdGggaHVnZSBhbW91bnRzIG9mIGRhdGEsIGNvbXBsaWNhdGVkIG1hY2hpbmVzLCBhbmQgY29uc3RhbnRseSBjaGFuZ2luZyBjb2RlLiBBcyBzY2llbnRpc3RzLCB3ZSBuZWVkZWQgYSBtZWNoYW5pc20gZm9yIGJ1aWxkaW5nIGludGVyYWN0aXZlIHByb2dyYW1zIHRoYXQgd2FzIGV4dHJlbWVseSBlYXN5IHRvIHVzZSwgY291bGQga2VlcCBwYWNlIHdpdGggY29kZSB0aGF0IHdhcyBjb25zdGFudGx5IGNoYW5naW5nLCBhbmQgZGlkbid0IGdldCBpbiB0aGUgd2F5IG9mIHRoZSByZWFsIHByb2JsZW1zIHRoYXQgd2VyZSBiZWluZyBzb2x2ZWQuIE1haW5seSwgd2UganVzdCB3YW50ZWQgdG8gImN1dCB0aGUgY3JhcCIgYW5kIHdvcmsgb24gdGhlIHJlYWwgcHJvYmxlbXMgYXQgaGFuZC48cD4KLTxwPgotV2hpbGUgU1dJRyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIHNjaWVudGlmaWMgYXBwbGljYXRpb25zLCBpdCBoYXMgYmVjb21lIGEgZ2VuZXJhbCBwdXJwb3NlIHRvb2wgdGhhdCBpcyBiZWluZyB1c2VkIGluIGFuIGluY3JlYXNpbmcgdmFyaWV0eSBvZiBvdGhlciBjb21wdXRpbmcgYXBwbGljYXRpb25zLS1pbiBmYWN0IGFsbW9zdCBhbnl0aGluZyB3aGVyZSBDIHByb2dyYW1taW5nIGlzIGludm9sdmVkLiBTb21lIG9mIHRoZSBhcHBsaWNhdGlvbiBhcmVhcyB0aGF0IEkgYW0gYXdhcmUgb2YgaW5jbHVkZSBzY2llbnRpZmljIGFwcGxpY2F0aW9ucywgdmlzdWFsaXphdGlvbiwgZGF0YWJhc2VzLCBzZW1pY29uZHVjdG9yIENBRCwgcmVtb3RlIHNlbnNpbmcgYW5kIGRpc3RyaWJ1dGVkIG9iamVjdHMuIERldmVsb3BtZW50IGhhcyBiZWVuIHByYWdtYXRpYyBpbiBuYXR1cmUtLWZlYXR1cmVzIGhhdmUgYmVlbiBhZGRlZCB0byBhZGRyZXNzIGludGVyZXN0aW5nIHByb2JsZW1zIGFzIHRoZXkgYXJpc2UuIE1vc3Qgb2YgdGhlIHJlYWxseSBjb29sIHN0dWZmIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIG9yIHN1Z2dlc3RlZCBieSBTV0lHJ3MgdXNlcnMuIFRoZXJlIGhhcyBuZXZlciByZWFsbHkgYmVlbiBhICJncmFuZCIgZGVzaWduIHRvIFNXSUcgb3RoZXIgdGhhbiB0aGUgZ29hbCBvZiBjcmVhdGluZyBhIHByYWN0aWNhbCBwcm9ncmFtbWluZyB0b29sIHRoYXQgY291bGQgYmUgdXNlZCBpbiBvdGhlciBhcHBsaWNhdGlvbnMuPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gU1dJRyByZXNvdXJjZXM8L2gyPgotVGhlIG9mZmljaWFsIGxvY2F0aW9uIG9mIFNXSUcgcmVsYXRlZCBtYXRlcmlhbCBpczxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkvU1dJRwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIHNpdGUgY29udGFpbnMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSwgdXNlcnMgZ3VpZGUsIGFuZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYnVncywgaW5zdGFsbGF0aW9uIHByb2JsZW1zLCBhbmQgaW1wbGVtZW50YXRpb24gdHJpY2tzLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGZpbGVzIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIGZ0cCBhdCA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5mdHA6Ly9mdHAuY3MudXRhaC5lZHUvcHViL2JlYXpsZXkvU1dJRwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Zb3UgY2FuIGFsc28gc3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBieSBzZW5kaW5nIGEgbWVzc2FnZSB3aXRoIHRoZSB0ZXh0ICJzdWJzY3JpYmUgc3dpZyIgdG8gPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+bWFqb3Jkb21vQGNzLnV0YWguZWR1Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBtYWlsaW5nIGxpc3Qgb2Z0ZW4gZGlzY3Vzc2VzIHNvbWUgb2YgdGhlIG1vcmUgdGVjaG5pY2FsIGFzcGVjdHMgb2YgU1dJRyBhbG9uZyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGJldGEgcmVsZWFzZXMgYW5kIGZ1dHVyZSB3b3JrLjxwPgotPGEgbmFtZT0ibjMiPjwvYT48aDI+IEFib3V0IHRoaXMgbWFudWFsPC9oMj4KLVRoaXMgbWFudWFsIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFyYWxsZWwgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgU1dJRyBiZWNhdXNlIEkgaGF0ZSBibGFjayBib3hlcyBhbmQgSSBkb24ndCBsaWtlIHVzaW5nIHNvZnR3YXJlIHRoYXQgaXMgcG9vcmx5IGRvY3VtZW50ZWQuIFRoaXMgbWFudWFsIGF0dGVtcHRzIHRvIGRlc2NyaWJlIGFsbCBhc3BlY3RzIG9mIFNXSUcgYW5kIGhvdyBpdCBjYW4gYmUgdXNlZCB0byBzb2x2ZSBpbnRlcmVzdGluZyBwcm9ibGVtcy4gRG9uJ3QgbGV0IHRoZSBzaXplIHNjYXJlIHlvdSwgU1dJRyBjYW4gYmUgcXVpdGUgZWFzeSB0byB1c2UuIEhvd2V2ZXIsIGNvdmVyaW5nIGF1dG9tYXRpYyBjb2RlIGdlbmVyYXRpb24gZm9yIGZvdXIgZGlmZmVyZW50IHNjcmlwdGluZyBsYW5ndWFnZXMgdGFrZXMgYWJpdCBvZiBleHBsYW5hdGlvbi4gU1dJRyBjYW4gZG8gcXVpdGUgYSBmZXcgaW50ZXJlc3RpbmcgdGhpbmdzIHRoYXQgbWlnaHQgbm90IGJlIHNvIG9idmlvdXMgc28gSSBob3BlIHRoYXQgdGhlIG1hbnVhbCBjYW4gc2hlZCBzb21lIGxpZ2h0IG9uIG1hbnkgb2YgdGhlc2UgaXNzdWVzLiBUaGUgbWFudWFsIGFsc28gc2VydmVzIGFzIGEgZ2VuZXJhbCByZWZlcmVuY2UgZGVzY3JpYmluZyBtYW55IG9mIFNXSUcncyBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMgKEkgdXNlIHRoZSBtYW51YWwgcXVpdGUgcmVndWxhcmx5IG15c2VsZikuPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMz4gUHJlcmVxdWlzaXRlczwvaDM+Ci1UaGlzIG1hbnVhbCBhc3N1bWVzIHRoYXQgeW91IGFyZSBpbnRlcmVzdGVkIGluIHdyaXRpbmcgaW50ZXJhY3RpdmUgQyBwcm9ncmFtcyBhbmQgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBoZWFyZCBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1Y2ggYXMgVGNsLCBQeXRob24sIGFuZCBQZXJsLiBBIGRldGFpbGVkIGtub3dsZWRnZSBvZiB0aGVzZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGlzIG5vdCByZXF1aXJlZCBhbHRob3VnaCBzb21lIGZhbWlsaWFyaXR5IGNlcnRhaW5seSB3b24ndCBodXJ0LiBObyBwcmlvciBleHBlcmllbmNlIHdpdGggYnVpbGRpbmcgQyBleHRlbnNpb25zIHRvIHRoZXNlIGxhbmd1YWdlcyBpcyByZXF1aXJlZC0tLWFmdGVyIGFsbCwgdGhpcyBpcyB3aGF0IFNXSUcgYWxsb3dzIHlvdSB0byBkbyBhdXRvbWF0aWNhbGx5LiBIb3dldmVyLCBJIGRvIGFzc3VtZSB0aGF0IHlvdSBhcmUgcmVhc29uYWJseSBmYW1pbGlhciB3aXRoIHRoZSB1c2Ugb2YgY29tcGlsZXJzLCBsaW5rZXJzLCBhbmQgbWFrZWZpbGVzIHNpbmNlIG1ha2luZyBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9ucyBpcyBzb21ld2hhdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gd3JpdGluZyBhIG5vcm1hbCBDIHByb2dyYW0gKGFsdGhvdWdoIG5vdCBzaWduaWZpY2FudGx5IG1vcmUgY29tcGxleCkuPHA+Ci08YSBuYW1lPSJuOSI+PC9hPjxoMz4gT3JnYW5pemF0aW9uIG9mIHRoaXMgbWFudWFsPC9oMz4KLVRoZSBmaXJzdCBmZXcgY2hhcHRlcnMgb2YgdGhpcyBtYW51YWwgZGVzY3JpYmUgU1dJRyBpbiBnZW5lcmFsIGFuZCBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIGl0cyBjYXBhYmlsaXRpZXMuIFRoZSByZW1haW5pbmcgY2hhcHRlcnMgYXJlIGRldm90ZWQgdG8gc3BlY2lmaWMgU1dJRyBsYW5ndWFnZSBtb2R1bGVzIGFuZCBhcmUgc2VsZiBjb250YWluZWQuIFRodXMsIGlmIHlvdSBhcmUgdXNpbmcgU1dJRyB0byBidWlsZCBQeXRob24gaW50ZXJmYWNlcywgeW91IGNhbiBza2lwIHJpZ2h0IHRvIHRoYXQgY2hhcHRlciBhbmQgZmluZCBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdy4gU28sIGluIGEgc2Vuc2UsIHlvdSBhcmUgcmVhbGx5IGdldHRpbmcgMyBvciA0IG1hbnVhbHMgaW4gb25lLjxwPgotPGEgbmFtZT0ibjEwIj48L2E+PGgzPiBIb3cgdG8gYXZvaWQgcmVhZGluZyB0aGUgbWFudWFsPC9oMz4KLUlmIHlvdSBoYXRlIHJlYWRpbmcgbWFudWFscywgZ2xhbmNlIGF0IHRoZSAiSW50cm9kdWN0aW9uIiB3aGljaCBjb250YWlucyBhIGZldyBzaW1wbGUgZXhhbXBsZXMgYW5kIHRoZSBvdmVyYWxsIHBoaWxvc29waHkuIFRoZXNlIGV4YW1wbGVzIGNvbnRhaW4gYWJvdXQgOTUlIG9mIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyB0byB1c2UgU1dJRy4gQWZ0ZXIgdGhhdCwgc2ltcGx5IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgY2hhcHRlcnMgZm9yIHJlZmVyZW5jZS4gVGhlIFNXSUcgZGlzdHJpYnV0aW9uIGFsc28gY29tZXMgd2l0aCBhIGxhcmdlIGRpcmVjdG9yeSBvZiBleGFtcGxlcyB0aGF0IGlsbHVzdHJhdGUgaG93IHRvIGRvIG1vc3Qga2luZHMgb2YgdGhpbmdzLiA8cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBDcmVkaXRzPC9oMj4KLVRoaXMgd29yayB3b3VsZCBjZXJ0YWlubHkgbm90IGJlIHBvc3NpYmxlIHdpdGhvdXQgdGhlIHN1cHBvcnQgb2YgbWFueSBwZW9wbGUuIEkgd291bGQgbGlrZSB0byBhY2tub3dsZWRnZSBQZXRlciBMb21kYWhsLCBCcmFkIEhvbGlhbiwgU2h1amlhIFpob3UsIE5pZWxzIEplbnNlbiwgYW5kIFRpbSBHZXJtYW5uIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgYWxsb3dpbmcgbWUgdG8gcHVyc3VlIHRoaXMgcHJvamVjdCBhbmQgZm9yIGJlaW5nIHRoZSBmaXJzdCB1c2Vycy4gUGF0cmljayBUdWxsbWFubiBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIHN1Z2dlc3RlZCB0aGUgaWRlYSBvZiBhdXRvbWF0aWMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLiBKb2huIFNjaG1pZHQgYW5kIEt1cnRpcyBCbGVla2VyIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggdGVzdGVkIG91dCB0aGUgZWFybHkgdmVyc2lvbnMuIEknZCBhbHNvIGxpa2UgdG8gYWNrbm93bGVkZ2UgQ2hyaXMgSm9obnNvbiBhbmQgdGhlIFNjaWVudGlmaWMgQ29tcHV0aW5nIGFuZCBJbWFnaW5nIEdyb3VwIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggZm9yIHRoZWlyIGNvbnRpbnVlZCBzdXBwb3J0LiBKb2huIEJ1Y2ttYW4sIExhcnJ5IFZpcmRlbiwgYW5kIFRvbSBTY2h3YWxsZXIgcHJvdmlkZWQgdmFsdWFibGUgaW5wdXQgb24gdGhlIGZpcnN0IHJlbGVhc2VzIGFuZCBpbXByb3ZpbmcgdGhlIHBvcnRhYmlsaXR5IG9mIFNXSUcuIERhdmlkIEZsZXRjaGVyIGFuZCBHYXJ5IEhvbHQgaGF2ZSBwcm92aWRlZCBhIGdyZWF0IGRlYWwgb2YgaW5wdXQgb24gaW1wcm92aW5nIFNXSUcncyBQZXJsNSBpbXBsZW1lbnRhdGlvbi4gSSdkIGFsc28gbGlrZSB0byB0aGFuayBLZXZpbiBCdXRsZXIgZm9yIGhpcyB2YWx1YWJsZSBpbnB1dCBhbmQgY29udHJpYnV0aW9uIG9mIGEgV2luZG93cyBOVCBwb3J0LiBGaW5hbGx5LCBJJ2QgbGlrZSB0byBhY2tub3dsZWRnZSBhbGwgb2YgdGhlIHVzZXJzIHdobyBoYXZlIGJyYXZlZCB0aGUgZmlyc3QgZmV3IHJlbGVhc2VzIGFuZCBoYXZlIGJlZW4gaW5zdHJ1bWVudGFsIGluIHN1Z2dlc3Rpbmcgd2F5IHRvIG1ha2UgU1dJRyBtb3JlIGZ1biB0byB1c2UgdGhhbiBJIGV2ZXIgaW1hZ2luZWQgcG9zc2libGUuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gV2hhdCdzIG5ldz88L2gyPgotVGhlIGZvbGxvd2luZyBzaWduaWZpY2FudCBmZWF0dXJlcyBhcmUgbmV3IGluIHZlcnNpb24gMS4xPHA+Ci08cD4KLTx1bD4KLTxsaT5TdXBwb3J0IGZvciB0eXBlbWFwcyAoYSBtZWNoYW5pc20gZm9yIGN1c3RvbWl6aW5nIFNXSUcpLgotPGxpPk11bHRpcGxlIGluaGVyaXRhbmNlLgotPGxpPkRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzLgotPGxpPlBlcmw1IHNoYWRvdyBjbGFzc2VzLgotPGxpPlRjbDguMCBtb2R1bGUgKHVzZXMgdGhlIG5hdGl2ZSBUY2w4IG9iamVjdCBpbnRlcmZhY2UpLgotPGxpPkFuIGVudGlyZWx5IG5ldyBkb2N1bWVudGF0aW9uIHN5c3RlbS4KLTxsaT5MaW1pdGVkIHN1cHBvcnQgZm9yIG5lc3RlZCBzdHJ1Y3R1cmVzLgotPGxpPk5ldyBvYmplY3Qgb3JpZW50ZWQgVGNsIGludGVyZmFjZS4KLTxsaT5Vc2VyIGRlZmluZWQgZXhjZXB0aW9uIGhhbmRsaW5nLgotPGxpPk5ldyBkaXJlY3RpdmVzIGZvciBiZXR0ZXIgbGlicmFyeSBzdXBwb3J0ICglaW5saW5lLCAlZXh0ZXJuICVpbXBvcnQpCi08bGk+T2JqZWN0aXZlLUMgc3VwcG9ydC4KLTxsaT5TdXBwb3J0IGZvciBXaW5kb3dzLU5UIGFuZCBNYWNpbnRvc2guCi08bGk+TG90cyBvZiBtaW5vciBidWcgZml4ZXMgdG8gYWxtb3N0IGV2ZXJ5dGhpbmcuCi08L3VsPgotPHA+Ci1UaGlzIHJlbGVhc2Ugc2hvdWxkIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggaW50ZXJmYWNlIGZpbGVzIGdlbmVyYXRlZCBmb3IgU1dJRyAxLjAuIEhvd2V2ZXIsIG1hbnkgdGhpbmdzIGhhdmUgY2hhbmdlZCBpbiB0aGUgU1dJRyBDKysgQVBJIHNvIHNwZWNpYWwgcHVycG9zZSBTV0lHIEMrKyBleHRlbnNpb25zIHdyaXR0ZW4gZm9yIDEuMCB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gQnVnIHJlcG9ydHM8L2gyPgotV2hpbGUgZXZlcnkgYXR0ZW1wdCBoYXMgYmVlbiBtYWRlIHRvIG1ha2UgU1dJRyBidWctZnJlZSwgb2NjYXNpb25hbGx5IGJ1Z3Mgd2lsbCBhcnJpc2UuIFRvIHJlcG9ydCBhIGJ1Zywgc2VuZCBtYWlsIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBhdCA8dHQ+c3dpZ0Bjcy51dGFoLmVkdTwvdHQ+LiBJbiB5b3VyIG1lc3NhZ2UsIGJlIGFzIHNwZWNpZmljIGFzIHBvc3NpYmxlLCBpbmNsdWRpbmcgKGlmIGFwcGxpY2FibGUpLCBlcnJvciBtZXNzYWdlcywgdHJhY2ViYWNrcyAoaWYgYSBjb3JlIGR1bXAgb2NjdXJyZWQpLCBjb3JyZXNwb25kaW5nIHBvcnRpb25zIG9mIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlIHVzZWQsIGFuZCBhbnkgaW1wb3J0YW50IHBpZWNlcyBvZiB0aGUgU1dJRyBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlLiBJIGF0dGVtcHQgdG8gcmVzcG9uZCB0byBhbGwgYnVnIHJlcG9ydHMsIGJ1dCBJIGNhbiBvbmx5IGZpeCBidWdzIGlmIEkga25vdyBhYm91dCB0aGVtLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IFNXSUcgaXMgZnJlZTwvaDI+Ci1TV0lHIGlzIGEgY29tcGxldGVseSBmcmVlIHBhY2thZ2UgdGhhdCB5b3UgY2FuIHVzZSBpbiBhbnkgbWFubmVyIHRoYXQgeW91IHdpc2gsIGluY2x1ZGluZyBtb2RpZmljYXRpb24sIHJlZGlzdHJpYnV0aW9uLCBhbmQgdXNlIGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuIFRoZSBvbmx5IHJlc3RyaWN0aW9uIG9uIGl0cyB1c2UgaXMgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIFNXSUcgY29tcGlsZXIgc2hvdWxkIHJlcHJvZHVjZSB0aGUgU1dJRyBjb3B5cmlnaHQgbm90aWNlIGluIHRoZSBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIFRoZSBjb2RlIGdlbmVyYXRlZCBieSBTV0lHIGNhbiBiZSByZWRpc3RyaWJ1dGVkIGluIGFueSBtYW5uZXIuIE9uIGEgbW9yZSBwZXJzb25hbCBub3RlLCBpZiB5b3UndmUgdXNlZCBTV0lHIHRvIG1ha2Ugc29tZXRoaW5nIGNvb2wsIEknZCBsaWtlIHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgaXQgc28gdGhhdCBJIGNhbiBtYWtlIFNXSUcgYmV0dGVyIChhbmQgdG8gc2F0aXNmeSBteSBjdXJpb3NpdHkpLjxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDY6NDkgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHl0aG9uLmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML1B5dGhvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdhYjUzLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHl0aG9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzM0ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+U1dJRyBhbmQgUHl0aG9uPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT45IFNXSUcgYW5kIFB5dGhvbjwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPlByZWxpbWluYXJpZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+QnVpbGRpbmcgUHl0aG9uIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5UaGUgbG93LWxldmVsIFB5dGhvbi9DIGludGVyZmFjZTwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5QeXRob24gc2hhZG93IGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QWJvdXQgdGhlIEV4YW1wbGVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPlNvbHZpbmcgYSBzaW1wbGUgaGVhdC1lcXVhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5XcmFwcGluZyBhIEMgbGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI244Ij5QdXR0aW5nIGl0IGFsbCB0b2dldGhlcjwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPlJlbWFwcGluZyBDIGRhdGF0eXBlcyB3aXRoIHR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSIjbjExIj5JbXBsZW1lbnRpbmcgQyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gUHl0aG9uPC9hPgotPGxpPiA8YSBocmVmPSIjbjEyIj5PdGhlciBvZGRzIGFuZCBlbmRzPC9hPgotPGxpPiA8YSBocmVmPSIjbjEzIj5UaGUgZ29yeSBkZXRhaWxzIG9mIHNoYWRvdyBjbGFzc2VzPC9hPgotPC91bD4KLQotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBTV0lHJ3Mgc3VwcG9ydCBvZiBQeXRob24uIE1hbnkgb2YgdGhlIGV4YW1wbGUgcHJlc2VudGVkIGhlcmUgd2lsbCBoYXZlIGEgc2NpZW50aWZpYyBiaWFzIGdpdmVuIFB5dGhvbidzIGluY3JlYXNpbmcgdXNlIGluIHNjaWVudGlmaWMgYXBwbGljYXRpb25zICh0aGlzIGlzIGhvdyBJIHByaW1hcmlseSB1c2UgUHl0aG9uKSwgYnV0IHRoZSB0ZWNobmlxdWVzIGFyZSB3aWRlbHkgYXBwbGljYWJsZSB0byBvdGhlciBhcmVhcy48cD4KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBQcmVsaW1pbmFyaWVzPC9oMj4KLVNXSUcgMS4xIHdvcmtzIHdpdGggUHl0aG9uIDEuMyBhbmQgUHl0aG9uIDEuNC4gR2l2ZW4gdGhlIGNob2ljZSwgeW91IHNob3VsZCB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbi4gWW91IHNob3VsZCBhbHNvIGRldGVybWluZSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljIGxvYWRpbmcuIFNXSUcgd2lsbCB3b3JrIHdpdGggb3Igd2l0aG91dCBkeW5hbWljIGxvYWRpbmcsIGJ1dCB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyB3aWxsIHZhcnkuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDM+IFJ1bm5pbmcgU1dJRzwvaDM+Ci1UbyBidWlsZCBhIFB5dGhvbiBtb2R1bGUsIHJ1biBTV0lHIHVzaW5nIHRoZSA8dHQ+LXB5dGhvbjwvdHQ+IG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXN3aWcgLXB5dGhvbiBleGFtcGxlLmkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyB3aWxsIHByb2R1Y2UgMiBmaWxlcy4gVGhlIGZpbGUgPHR0PmV4YW1wbGVfd3JhcC5jPC90dD4gY29udGFpbnMgYWxsIG9mIHRoZSBDIGNvZGUgbmVlZGVkIHRvIGJ1aWxkIGEgUHl0aG9uIG1vZHVsZSBhbmQgYSBkb2N1bWVudGF0aW9uIGZpbGUgZGVzY3JpYmVzIHRoZSByZXN1bHRpbmcgaW50ZXJmYWNlLiBUbyBidWlsZCBhIFB5dGhvbiBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gY29tcGlsZSB0aGUgZmlsZSA8dHQ+ZXhhbXBsZV93cmFwLmM8L3R0PiBhbmQgbGluayBpdCB3aXRoIHRoZSByZXN0IG9mIHlvdXIgcHJvZ3JhbSAoYW5kIHBvc3NpYmx5IFB5dGhvbiBpdHNlbGYpLiBXaGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3NlcywgU1dJRyB3aWxsIGFsc28gcHJvZHVjZSBhIDx0dD4ucHk8L3R0PiBmaWxlLCBidXQgdGhpcyBpcyBkZXNjcmliZWQgbGF0ZXIuPHA+Ci08YSBuYW1lPSJuMTUiPjwvYT48aDM+IEdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvaDM+Ci1JbiBvcmRlciB0byBjb21waWxlLCB5b3UgbmVlZCB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBQeXRob24gZGlzdHJpYnV0aW9uIDo8cD4KLTxwPgotRm9yIFB5dGhvbiAxLjMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi91c3IvbG9jYWwvaW5jbHVkZS9QeSAKLS91c3IvbG9jYWwvbGliL3B5dGhvbi9saWIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRm9yIFB5dGhvbiAxLjQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjQKLS91c3IvbG9jYWwvbGliL3B5dGhvbjEuNC9jb25maWcKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGV4YWN0IGxvY2F0aW9uIG1heSB2YXJ5IG9uIHlvdXIgbWFjaGluZSwgYnV0IHRoZSBhYm92ZSBsb2NhdGlvbnMgYXJlIHR5cGljYWwuIDxwPgotPGEgbmFtZT0ibjE2Ij48L2E+PGgzPiBDb21waWxpbmcgYSBkeW5hbWljIG1vZHVsZTwvaDM+Ci1UbyBidWlsZCBhIHNoYXJlZCBvYmplY3QgZmlsZSwgeW91IG5lZWQgdG8gY29tcGlsZSB5b3VyIG1vZHVsZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgKHNob3duIGZvciBJcml4KTo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkKLSUgZ2NjIC1jIGV4YW1wbGUuYwotJSBnY2MgLWMgZXhhbXBsZV93cmFwLmMgLURIQVZFX0NPTkZJR19IIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNCBcCi0JLUkvdXNyL2xvY2FsL2xpYi9weXRob24xLjQvY29uZmlnCi0lIGxkIC1zaGFyZWQgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGVtb2R1bGUuc28KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVW5mb3J0dW5hdGVseSwgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgYSBzaGFyZWQgb2JqZWN0IGZpbGUgdmFyaWVzIG9uIGV2ZXJ5IHNpbmdsZSBtYWNoaW5lIHNvIHlvdSBtYXkgbmVlZCB0byByZWFkIHVwIG9uIHRoZSBtYW4gcGFnZXMgZm9yIHlvdXIgQyBjb21waWxlciBhbmQgbGlua2VyLjxwPgotPHA+Ci1XaGVuIGJ1aWxkaW5nIGEgZHluYW1pYyBtb2R1bGUsIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyBpbXBvcnRhbnQuIElmIHRoZSBuYW1lIG9mIHlvdXIgU1dJRyBtb2R1bGUgaXMgIjx0dD5leGFtcGxlPC90dD4iLCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QgZmlsZSBzaG91bGQgYmUgIjx0dD5leGFtcGxlbW9kdWxlLnNvPC90dD4iIChvciBlcXVpdmFsZW50IGRlcGVuZGluZyBvbiB5b3VyIG1hY2hpbmUpLiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgb3I8dHQ+IC1tb2R1bGU8L3R0PiBjb21tYW5kIGxpbmUgb3B0aW9uLjxwPgotPHA+Ci1XaGlsZSBkeW5hbWljIGxvYWRpbmcgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIG1ha2luZyBTV0lHIG1vZHVsZXMsIGl0IGlzIG5vdCBmb29scHJvb2YgYW5kIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgSW4gdGhlc2UgY2FzZXMsIHlvdSBjYW4gcmVidWlsZCB0aGUgUHl0aG9uIGludGVycHJldGVyIHdpdGggeW91ciBleHRlbnNpb25zIGFkZGVkLjxwPgotPGEgbmFtZT0ibjE3Ij48L2E+PGgzPiBSZWJ1aWxkaW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgKGFrYS4gc3RhdGljIGxpbmtpbmcpPC9oMz4KLVRoZSBub3JtYWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBuZXcgbW9kdWxlIHRvIFB5dGhvbiBpbnZvbHZlcyBmaW5kaW5nIHRoZSBQeXRob24gc291cmNlLCBhZGRpbmcgYW4gZW50cnkgdG8gdGhlIDx0dD5Nb2R1bGVzL1NldHVwPC90dD4gZmlsZSwgYW5kIHJlYnVpbGRpbmcgdGhlIGludGVycHJldGVyIHVzaW5nIHRoZSBQeXRob24gTWFrZWZpbGUuIFdoaWxlIGl0J3MgcG9zc2libGUgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3MgYnkgdXNpbmcgdGhlIFZQQVRIIGZlYXR1cmUgb2YgYG1ha2UnLCBJJ3ZlIGFsd2F5cyBmb3VuZCB0aGUgcHJvY2VzcyB0byBiZSBhIGxpdHRsZSB0b28gY29tcGxpY2F0ZWQuIDxwPgotPHA+Ci1TV0lHIHByb3ZpZGVzIGFuIGV4dHJlbWVseSBlYXN5LCBhbHRob3VnaCBzb21ld2hhdCB1bmNvbnZlbnRpb25hbCwgbWVjaGFuaXNtIGZvciByZWJ1aWxkaW5nIFB5dGhvbiB1c2luZyBTV0lHJ3MgbGlicmFyeSBmZWF0dXJlLiBXaGVuIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3RhdGljIHZlcnNpb24gb2YgUHl0aG9uLCBzaW1wbHkgbWFrZSBhbiBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi1leHRlcm4gaW50IGZhY3QoaW50KTsKLWV4dGVybiBpbnQgbW9kKGludCwgaW50KTsKLWV4dGVybiBkb3VibGUgTXlfdmFyaWFibGU7Ci0KLSVpbmNsdWRlIGVtYmVkLmkgICAgICAgICAgICAgIC8vIEluY2x1ZGUgY29kZSBmb3IgYSBzdGF0aWMgdmVyc2lvbiBvZiBQeXRob24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5lbWJlZC5pPC90dD4gbGlicmFyeSBmaWxlIGluY2x1ZGVzIHN1cHBvcnRpbmcgY29kZSB0aGF0IGNvbnRhaW5zIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlYnVpbGQgUHl0aG9uLiBUbyBidWlsZCB5b3VyIG1vZHVsZSwgc2ltcGx5IGRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaQotJSBnY2MgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1ESEFWRV9DT05GSUdfSCAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjQgXAotCS1JL3Vzci9sb2NhbC9saWIvcHl0aG9uMS40L2NvbmZpZyBcCi0JLUwvdXNyL2xvY2FsL2xpYi9weXRob24xLjQvY29uZmlnIC1sTW9kdWxlcyAtbFB5dGhvbiAtbE9iamVjdHMgLWxQYXJzZXIgLWxtIFwKLQktbyBteXB5dGhvbgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PbiBzb21lIG1hY2hpbmVzLCB5b3UgbWF5IG5lZWQgbmVlZCB0byBzdXBwbHkgYWRkaXRpb25hbCBsaWJyYXJpZXMgb24gdGhlIGxpbmsgbGluZS4gSW4gcGFydGljdWxhciwgeW91IG1heSBuZWVkIHRvIHN1cHBseSA8dHQ+LWxzb2NrZXQ8L3R0Piw8dHQ+IC1sbnNsPC90dD4sIGFuZCA8dHQ+LWxkbDwvdHQ+LiA8cD4KLTxwPgotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhZGQgdGhlIGVtYmVkLmkgbGlicmFyeSB0byBhbiBleGlzdGluZyBpbnRlcmZhY2UgYnkgcnVubmluZyBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5lbWJlZC5pPC90dD4gZmlsZSB1c2VzIGFsbCBvZiB0aGUgbW9kdWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgdXNlZCBpbiB5b3VyIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFB5dGhvbi4gVGh1cywgeW91ciBuZXcgdmVyc2lvbiBvZiBQeXRob24gd2lsbCBiZSBpZGVudGljYWwgdG8gdGhlIG9sZCBvbmUgZXhjZXB0IHdpdGggeW91ciBuZXcgbW9kdWxlIGFkZGVkLiBJZiB5b3UgaGF2ZSBjb25maWd1cmVkIFB5dGhvbiB0byB1c2UgbW9kdWxlcyBzdWNoIGFzIDx0dD50a2ludGVyLDwvdHQ+IHlvdSBtYXkgbmVlZCB0byBzdXBwbHkgbGlua2FnZSB0byB0aGUgVGNsL1RrIGxpYnJhcmllcyBhbmQgWDExIGxpYnJhcmllcy48cD4KLTxwPgotUHl0aG9uJ3MgPHR0Pm1haW4oKTwvdHQ+IHByb2dyYW0gaXMgcmF0aGVyIHVuZnJpZW5kbHkgdG93YXJkcyBDKysgY29kZSwgYnV0IFNXSUcncyA8dHQ+ZW1iZWQuaTwvdHQ+IG1vZHVsZSBwcm92aWRlcyBhIHJlcGxhY2VtZW50IHRoYXQgY2FuIGJlIGNvbXBpbGVkIHdpdGggdGhlIEMrKyBjb21waWxlci0tbWFraW5nIGl0IGVhc3kgdG8gYnVpbGQgQysrIFB5dGhvbiBleHRlbnNpb25zLjxwPgotPHA+Ci1UaGUgPHR0PmVtYmVkLmk8L3R0PiBsaWJyYXJ5IHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBQeXRob24gMS40LiBJZiB5b3UgYXJlIHVzaW5nIFB5dGhvbiAxLjMsIHlvdSBzaG91bGQgdXNlIHRoZSBmaWxlIDx0dD5lbWJlZDEzLmk8L3R0PiBpbnN0ZWFkICh0aGlzIGNhbiBiZSBkb25lIGJ5IG1ha2luZyBhIHN5bWJvbGljIGxpbmsgaW4gdGhlIFNXSUcgbGlicmFyeSkgb3Igc2ltcGx5IHVzaW5nIHRoZSA8dHQ+LWw8L3R0PiBvcHRpb24uPHA+Ci08YSBuYW1lPSJuMTgiPjwvYT48aDM+IFVzaW5nIHlvdXIgbW9kdWxlPC9oMz4KLVRvIHVzZSB5b3VyIG1vZHVsZSBpbiBQeXRob24sIHNpbXBseSB1c2UgUHl0aG9uJ3MgaW1wb3J0IGNvbW1hbmQuIFRoZSBwcm9jZXNzIGlzIGlkZW50aWNhbCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHlvdSB1c2VkIGR5bmFtaWMgbG9hZGluZyBvciByZWJ1aWx0IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgcHl0aG9uCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IGV4YW1wbGUKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmZhY3QoNCkKLTI0Ci0mZ3Q7Jmd0OyZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjE5Ij48L2E+PGgzPiBDb21waWxhdGlvbiBwcm9ibGVtcyBhbmQgY29tcGlsaW5nIHdpdGggQysrPC9oMz4KLUZvciB0aGUgbW9zdCBwYXJ0LCBjb21waWxpbmcgYSBQeXRob24gbW9kdWxlIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+RHluYW1pYyBsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiBJZiB5b3UgY2FuJ3QgZ2V0IGEgbW9kdWxlIHRvIGJ1aWxkLCB5b3UgbWlnaHQgdHJ5IGJ1aWxkaW5nIGEgbmV3IHZlcnNpb24gb2YgUHl0aG9uIHVzaW5nIHN0YXRpYyBsaW5raW5nIGluc3RlYWQuCi08bGk+SW4gb3JkZXIgdG8gYnVpbGQgQysrIG1vZHVsZXMsIHlvdSBtYXkgbmVlZCB0byBsaW5rIHdpdGggdGhlIEMrKyBjb21waWxlIHVzaW5nIGEgY29tbWFuZCBsaWtlIGA8dHQ+YysrIC1zaGFyZWQgZXhhbXBsZV93cmFwLm8gZXhhbXBsZS5vIC1vIGV4YW1wbGVtb2R1bGUuc288L3R0PicKLTxsaT5JZiBidWlsZGluZyBhIGR5bmFtaWMgQysrIG1vZHVsZSB1c2luZyBnKyssIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGxpbmsgYWdhaW5zdCA8dHQ+bGliZ2NjLmE8L3R0PiwgPHR0PmxpYmcrKy5hPC90dD4sIGFuZCA8dHQ+bGlic3RjKysuYTwvdHQ+IGxpYnJhcmllcy4KLTxsaT5NYWtlIHN1cmUgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcy4gQSBtb2R1bGUgY29tcGlsZWQgd2l0aCBQeXRob24gMS4zIGhlYWRlcnMgcHJvYmFibHkgd29uJ3Qgd29yayB3aXRoIFB5dGhvbiAxLjQuCi08L3VsPgotPGEgbmFtZT0ibjIiPjwvYT48aDI+IEJ1aWxkaW5nIFB5dGhvbiBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2gyPgotQnVpbGRpbmcgYSBTV0lHIGV4dGVuc2lvbiB0byBQeXRob24gdW5kZXIgV2luZG93cyA5NS9OVCBpcyByb3VnaGx5IHNpbWlsYXIgdG8gdGhlIHByb2Nlc3MgdXNlZCB3aXRoIFVuaXguICAgTm9ybWFsbHksIHlvdSB3aWxsIHdhbnQgdG8gcHJvZHVjZSBhIERMTCB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgICBUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBwcm9jZXNzIG9mIHVzaW5nIFNXSUcgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0LnggYWx0aG91Z2ggdGhlIHByb2NlZHVyZSBtYXkgYmUgc2ltaWxhciB3aXRoIG90aGVyIGNvbXBpbGVycy4gICBTV0lHIGN1cnJlbnRseSBzdXBwb3J0cyBib3RoIHRoZSBiYXNpYyBQeXRob24gcmVsZWFzZSBhbmQgUHl0aG9ud2luLiAgSW4gb3JkZXIgdG8gYnVpbGQgZXh0ZW5zaW9ucywgeW91IHdpbGwgbmVlZCB0byBkb3dubG9hZCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiB0byB0aGVzZSBwYWNrYWdlcyBhcyB5b3Ugd2lsbCBuZWVkIHRoZSBQeXRob24gaGVhZGVyIGZpbGVzLjxwPgotPGEgbmFtZT0ibjIwIj48L2E+PGgzPiBSdW5uaW5nIFNXSUcgZnJvbSBEZXZlbG9wZXIgU3R1ZGlvPC9oMz4KLUlmIHlvdSBhcmUgZGV2ZWxvcGluZyB5b3VyIGFwcGxpY2F0aW9uIHdpdGhpbiBNaWNyb3NvZnQgZGV2ZWxvcGVyIHN0dWRpbywgU1dJRyBjYW4gYmUgaW52b2tlZCBhcyBhIGN1c3RvbSBidWlsZCBvcHRpb24uICAgICAgVGhlIHByb2Nlc3Mgcm91Z2hseSBmb2xsb3dzIHRoZXNlIHN0ZXBzIDo8cD4KLTxwPgotPHVsPgotPGxpPk9wZW4gdXAgYSBuZXcgd29ya3NwYWNlIGFuZCB1c2UgdGhlIEFwcFdpemFyZCB0byBzZWxlY3QgYSBETEwgcHJvamVjdC4KLTxsaT5BZGQgYm90aCB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSAodGhlIC5pIGZpbGUpLCBhbnkgc3VwcG9ydGluZyBDIGZpbGVzLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZmlsZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieSBTV0lHIChpZS4gPHR0PmV4YW1wbGVfd3JhcC5jPC90dD4pLiAgIE5vdGUgOiBJZiB1c2luZyBDKyssIGNob29zZSBhIGRpZmZlcmVudCBzdWZmaXggZm9yIHRoZSB3cmFwcGVyIGZpbGUgc3VjaCBhcyA8dHQ+ZXhhbXBsZV93cmFwLmN4eDwvdHQ+LiBEb24ndCB3b3JyeSBpZiB0aGUgd3JhcHBlciBmaWxlIGRvZXNuJ3QgZXhpc3QgeWV0LS1EZXZlbG9wZXIgU3R1ZGlvIHdpbGwga2VlcCBhIHJlZmVyZW5jZSB0byBpdCBhcm91bmQuCi08bGk+U2VsZWN0IHRoZSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCBnbyB0byB0aGUgc2V0dGluZ3MgbWVudS4gICBVbmRlciBzZXR0aW5ncywgc2VsZWN0IHRoZSAiQ3VzdG9tIEJ1aWxkIiBvcHRpb24uCi08bGk+RW50ZXIgIlNXSUciIGluIHRoZSBkZXNjcmlwdGlvbiBmaWVsZC4KLTxsaT5FbnRlciAiPHR0PnN3aWcgLXB5dGhvbiAtbyAkKFByb2pEaXIpXCQoSW5wdXROYW1lKV93cmFwLmMgJChJbnB1dFBhdGgpPC90dD4iIGluIHRoZSAiQnVpbGQgY29tbWFuZChzKSBmaWVsZCIKLTxsaT5FbnRlciAiPHR0PiQoUHJvakRpcilcJChJbnB1dE5hbWUpX3dyYXAuYzwvdHQ+IiBpbiB0aGUgIk91dHB1dCBmaWxlcyhzKSBmaWVsZCIuCi08bGk+TmV4dCwgc2VsZWN0IHRoZSBzZXR0aW5ncyBmb3IgdGhlIGVudGlyZSBwcm9qZWN0IGFuZCBnbyB0byAiQysrOlByZXByb2Nlc3NvciIuIEFkZCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgeW91ciBQeXRob24gaW5zdGFsbGF0aW9uIHVuZGVyICJBZGRpdGlvbmFsIGluY2x1ZGUgZGlyZWN0b3JpZXMiLgotPGxpPkRlZmluZSB0aGUgc3ltYm9sICBfX1dJTjMyX18gdW5kZXIgcHJlcHJvY2Vzc29yIG9wdGlvbnMuICAKLTxsaT5GaW5hbGx5LCBzZWxlY3QgdGhlIHNldHRpbmdzIGZvciB0aGUgZW50aXJlIHByb2plY3QgYW5kIGdvIHRvICJMaW5rIE9wdGlvbnMiLiAgQWRkIHRoZSBQeXRob24gbGlicmFyeSAgZmlsZSB0byB5b3VyIGxpbmsgbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUgInB5dGhvbjE0LmxpYiIuICBBbHNvLCBzZXQgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHlvdXIgUHl0aG9uIG1vZHVsZSAoaWUuIGV4YW1wbGUuZGxsKS4KLTxsaT5CdWlsZCB5b3VyIHByb2plY3QuCi08L3VsPgotPHA+Ci1Ob3csIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwsIFNXSUcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGludm9rZWQgd2hlbiB5b3UgYnVpbGQgeW91ciBwcm9qZWN0LiAgQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCByZXN1bHQgaW4gU1dJRyBiZWluZyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIGZpbGUuICBUbyBydW4geW91ciBuZXcgUHl0aG9uIGV4dGVuc2lvbiwgc2ltcGx5IHJ1biBQeXRob24gYW5kIHVzZSB0aGUgPHR0PmltcG9ydDwvdHQ+IGNvbW1hbmQgYXMgbm9ybWFsLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1NU0RPUyAmZ3Q7IHB5dGhvbgotJmd0OyZndDsmZ3Q7IGltcG9ydCBleGFtcGxlCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgZXhhbXBsZS5mYWN0KDQpCi0yNAotJmd0OyZndDsmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IFVzaW5nIE5NQUtFPC9oMz4KLUFsdGVybmF0aXZlbHksIFNXSUcgZXh0ZW5zaW9ucyBjYW4gYmUgYnVpbHQgYnkgd3JpdGluZyBhIE1ha2VmaWxlIGZvciBOTUFLRS4gICBNYWtlIHN1cmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTVNWQysrIGFyZSBhdmFpbGFibGUgYW5kIHRoZSBNU1ZDKysgdG9vbHMgYXJlIGluIHlvdXIgcGF0aC4gICBOb3csIGp1c3Qgd3JpdGUgYSBzaG9ydCBNYWtlZmlsZSBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGEgUHl0aG9uIGV4dGVuc2lvbgotCi1TUkNTICAgICAgICAgID0gZXhhbXBsZS5jCi1JRklMRSAgICAgICAgID0gZXhhbXBsZQotSU5URVJGQUNFICAgICA9ICQoSUZJTEUpLmkKLVdSQVBGSUxFICAgICAgPSAkKElGSUxFKV93cmFwLmMKLQotIyBMb2NhdGlvbiBvZiB0aGUgVmlzdWFsIEMrKyB0b29scyAoMzIgYml0IGFzc3VtZWQpCi0KLVRPT0xTICAgICAgICAgPSBjOlxtc2RldgotVEFSR0VUICAgICAgICA9IGV4YW1wbGUuZGxsCi1DQyAgICAgICAgICAgID0gJChUT09MUylcYmluXGNsLmV4ZQotTElOSyAgICAgICAgICA9ICQoVE9PTFMpXGJpblxsaW5rLmV4ZQotSU5DTFVERTMyICAgICA9IC1JJChUT09MUylcaW5jbHVkZQotTUFDSElORSAgICAgICA9IElYODYKLQotIyBDIExpYnJhcnkgbmVlZGVkIHRvIGJ1aWxkIGEgRExMCi0KLURMTElCQyAgICAgICAgPSBtc3ZjcnQubGliIG9sZG5hbWVzLmxpYiAgCi0KLSMgV2luZG93cyBsaWJyYXJpZXMgdGhhdCBhcmUgYXBwYXJlbnRseSBuZWVkZWQKLVdJTkxJQiAgICAgICAgPSBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGNvbWRsZzMyLmxpYiAKLXdpbnNwb29sLmxpYgotCi0jIExpYnJhcmllcyBjb21tb24gdG8gYWxsIERMTHMKLUxJQlMgICAgICAgICAgPSAkKERMTElCQykgJChXSU5MSUIpIAotCi0jIExpbmtlciBvcHRpb25zCi1MT1BUICAgICAgPSAtZGVidWc6ZnVsbCAtZGVidWd0eXBlOmN2IC9OT0RFRkFVTFRMSUIgL1JFTEVBU0UgL05PTE9HTyBcCi0gICAgICAgICAgICAgL01BQ0hJTkU6JChNQUNISU5FKSAtZW50cnk6X0RsbE1haW5DUlRTdGFydHVwQDEyIC1kbGwKLQotIyBDIGNvbXBpbGVyIGZsYWdzCi0KLUNGTEFHUyAgICAgICAgPSAvWjcgL09kIC9jIC9ub2xvZ28KLVBZX0lOQ0xVREUgICAgPSAtSWQ6XHB5dGhvbi0xLjRcSW5jbHVkZSAtSWQ6XHB5dGhvbi0xLjQgLUlkOlxweXRob24tMS40XFBjCi1QWV9MSUIgICAgICAgID0gZDpccHl0aG9uLTEuNFx2YzQwXHB5dGhvbjE0LmxpYgotUFlfRkxBR1MgPSAvRF9fV0lOMzJfXwotCi1weXRob246OgotCXN3aWcgLXB5dGhvbiAtbyAkKFdSQVBGSUxFKSAkKElOVEVSRkFDRSkKLQkkKENDKSAkKENGTEFHUykgJChQWV9GTEFHUykgJChQWV9JTkNMVURFKSAkKFNSQ1MpICQoV1JBUEZJTEUpCi0Jc2V0IExJQj0kKFRPT0xTKVxsaWIKLQkkKExJTkspICQoTE9QVCkgLW91dDpleGFtcGxlLmRsbCAkKExJQlMpICQoUFlfTElCKSBleGFtcGxlLm9iaiBleGFtcGxlX3dyYXAub2JqCi0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyBidWlsZCB0aGUgZXh0ZW5zaW9uLCBydW4gTk1BS0UgKHlvdSBtYXkgbmVlZCB0byBydW4gPHR0PnZjdmFyczMyPC90dD4gZmlyc3QpLiBUaGlzIGlzIGEgcHJldHR5IHNpbXBsaXN0aWMgTWFrZWZpbGUsIGJ1dCBob3BlZnVsbHkgaXRzIGVub3VnaCB0byBnZXQgeW91IHN0YXJ0ZWQuICAgPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gVGhlIGxvdy1sZXZlbCBQeXRob24vQyBpbnRlcmZhY2U8L2gyPgotVGhlIFNXSUcgUHl0aG9uIG1vZHVsZSBpcyBiYXNlZCB1cG9uIGEgYmFzaWMgbG93LWxldmVsIGludGVyZmFjZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBDIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGFuZCBDKysgY2xhc3Nlcy4gVGhpcyBsb3ctbGV2ZWwgaW50ZXJmYWNlIGlzIG9mdGVuIHVzZWQgdG8gY3JlYXRlIG1vcmUgc29waGlzdGljYXRlZCBpbnRlcmZhY2VzIChzdWNoIGFzIHNoYWRvdyBjbGFzc2VzKSBzbyBpdCBtYXkgYmUgaGlkZGVuIGluIHByYWN0aWNlLjxwPgotPGEgbmFtZT0ibjIyIj48L2E+PGgzPiBNb2R1bGVzPC9oMz4KLVRoZSBTV0lHIDx0dD4lbW9kdWxlPC90dD4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgUHl0aG9uIG1vZHVsZS4gSWYgeW91IHNwZWNpZmllZCBgPHR0PiVtb2R1bGUgZXhhbXBsZTwvdHQ+JywgdGhlbiBldmVyeXRoaW5nIGZvdW5kIGluIGEgU1dJRyBpbnRlcmZhY2UgZmlsZSB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFB5dGhvbiBgPHR0PmV4YW1wbGU8L3R0PicgbW9kdWxlLiAgTWFrZSBzdXJlIHlvdSBkb24ndCB1c2UgdGhlIHNhbWUgbmFtZSBhcyBhIGJ1aWx0LWluIFB5dGhvbiBjb21tYW5kIG9yIHN0YW5kYXJkIG1vZHVsZSBvciB5b3VyIHJlc3VsdHMgbWF5IGJlIHVucHJlZGljdGFibGUuIDxwPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBGdW5jdGlvbnM8L2gzPgotQy9DKysgZnVuY3Rpb25zIGFyZSBtYXBwZWQgZGlyZWN0bHkgaW50byBhIG1hdGNoaW5nIFB5dGhvbiBmdW5jdGlvbi4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotZXh0ZXJuIGludCBmYWN0KGludCBuKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotZ2V0cyB0dXJuZWQgaW50byB0aGUgUHl0aG9uIGZ1bmN0aW9uIDx0dD5leGFtcGxlLmZhY3Qobik8L3R0PiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyZndDsmZ3Q7IGltcG9ydCBleGFtcGxlCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgZXhhbXBsZS5mYWN0KDQpCi0yNAotJmd0OyZndDsmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjQiPjwvYT48aDM+IFZhcmlhYmxlIExpbmtpbmc8L2gzPgotU1dJRyBwcm92aWRlcyBhY2Nlc3MgdG8gQy9DKysgZ2xvYmFsIHZhcmlhYmxlcywgYnV0IHRoZSBtZWNoYW5pc20gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gb25lIG1pZ2h0IGV4cGVjdCBkdWUgdG8gdGhlIG9iamVjdCBtb2RlbCB1c2VkIGluIFB5dGhvbi4gV2hlbiB5b3UgdHlwZSB0aGUgZm9sbG93aW5nIGluIFB5dGhvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+YSA9IDMuNAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0iYSIgYmVjb21lcyBhIG5hbWUgZm9yIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZSAzLjQuIElmIHlvdSBsYXRlciB0eXBlPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+YiA9IGEKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlbiAiYSIgYW5kICJiIiBhcmUgYm90aCBuYW1lcyBmb3IgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZSAzLjQuIEluIG90aGVyIHdvcmRzLCB0aGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgY29udGFpbmluZyAzLjQgYW5kICJhIiBhbmQgImIiIGFyZSBib3RoIG5hbWVzIHRoYXQgcmVmZXIgdG8gaXQuIFRoaXMgaXMgYSB2ZXJ5IGRpZmZlcmVudCBtb2RlbCB0aGFuIHRoYXQgdXNlZCBpbiBDLiBGb3IgdGhpcyByZWFzb24sIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSBmb3IgbWFwcGluZyAiYXNzaWdubWVudCIgaW4gUHl0aG9uIG9udG8gQyBnbG9iYWwgdmFyaWFibGVzIChiZWNhdXNlIGFzc2lnbm1lbnQgaXMgUHl0aG9uIGlzIHJlYWxseSBhIG5hbWluZyBvcGVyYXRpb24pLjxwPgotPHA+Ci1UbyBwcm92aWRlIGFjY2VzcyB0byBDIGdsb2JhbCB2YXJpYWJsZXMsIFNXSUcgY3JlYXRlcyBhIHNwZWNpYWwgUHl0aG9uIG9iamVjdCBjYWxsZWQgYDx0dD5jdmFyPC90dD4nIHRoYXQgaXMgYWRkZWQgdG8gZWFjaCBTV0lHIGdlbmVyYXRlZCBtb2R1bGUuIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gYWNjZXNzIGdsb2JhbCB2YXJpYWJsZXMgIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgd2l0aCBnbG9iYWwgdmFyaWFibGVzCi0lbW9kdWxlIGV4YW1wbGUKLS4uLgotZXh0ZXJuIGludCBNeV92YXJpYWJsZTsKLWV4dGVybiBkb3VibGUgZGVuc2l0eTsKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3cgaW4gUHl0aG9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgaW1wb3J0IGV4YW1wbGUKLSZndDsmZ3Q7Jmd0OyAjIFByaW50IG91dCB2YWx1ZSBvZiBhIEMgZ2xvYmFsIHZhcmlhYmxlCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgZXhhbXBsZS5jdmFyLk15X3ZhcmlhYmxlCi00Ci0mZ3Q7Jmd0OyZndDsgIyBTZXQgdGhlIHZhbHVlIG9mIGEgQyBnbG9iYWwgdmFyaWFibGUKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmN2YXIuZGVuc2l0eSA9IDAuODQ0MgotJmd0OyZndDsmZ3Q7ICMgVXNlIGluIGEgbWF0aCBvcGVyYXRpb24KLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmN2YXIuZGVuc2l0eSA9IGV4YW1wbGUuY3Zhci5kZW5zaXR5KjEuMTAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSnVzdCByZW1lbWJlciwgYWxsIEMgZ2xvYmFscyBuZWVkIHRvIGJlIHByZWZpeGVkIHdpdGggYSAiPHR0PmN2YXIuPC90dD4iIGFuZCB5b3Ugd2lsbCBiZSBzZXQuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBhIG5hbWUgb3RoZXIgdGhhbiAiPHR0PmN2YXI8L3R0PiIsIGl0IGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSA8dHQ+LWdsb2JhbHM8L3R0PiBvcHRpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIC1nbG9iYWxzIG15dmFyIGV4YW1wbGUuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Tb21lIGNhcmUgaXMgaW4gb3JkZXIgd2hlbiBpbXBvcnRpbmcgbXVsdGlwbGUgU1dJRyBtb2R1bGVzLiBJZiB5b3UgdXNlIHRoZSAiPHR0PmZyb20gJmx0O2ZpbGUmZ3Q7IGltcG9ydCAqPC90dD4iIHN0eWxlIG9mIGltcG9ydGluZywgeW91IHdpbGwgZ2V0IGEgbmFtZSBjbGFzaCBvbiB0aGUgdmFyaWFibGUgYDx0dD5jdmFyPC90dD4nIGFuZCB3aWxsIG9ubHkgYmUgYWJsZSB0byBhY2Nlc3MgZ2xvYmFsIHZhcmlhYmxlcyBmcm9tIHRoZSBsYXN0IG1vZHVsZSBsb2FkZWQuIFNXSUcgZG9lcyBub3QgY3JlYXRlIDx0dD5jdmFyPC90dD4gaWYgdGhlcmUgYXJlIG5vIGdsb2JhbCB2YXJpYWJsZXMgaW4gYSBtb2R1bGUuPHA+Ci08YSBuYW1lPSJuMjUiPjwvYT48aDM+IENvbnN0YW50czwvaDM+Ci1DL0MrKyBjb25zdGFudHMgYXJlIGluc3RhbGxlZCBhcyBuZXcgUHl0aG9uIG9iamVjdHMgY29udGFpbmluZyB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuIFRoZXNlIGNvbnN0YW50cyBhcmUgZ2l2ZW4gdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBDIGNvbnN0YW50LiAiQ29uc3RhbnRzIiBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc3RhbnRzIGluIFB5dGhvbi0tLWluIG90aGVyIHdvcmRzLCB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIHRoZW0gYW5kIHN1ZmZlciB0aGUgY29uc2VxdWVuY2VzITxwPgotPGEgbmFtZT0ibjI2Ij48L2E+PGgzPiBQb2ludGVyczwvaDM+Ci1Qb2ludGVycyB0byBDL0MrKyBvYmplY3RzIGFyZSByZXByZXNlbnRlZCBhcyBjaGFyYWN0ZXIgc3RyaW5ncyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8xMDBmOGUyX1ZlY3Rvcl9wCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgTlVMTCBwb2ludGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgIk5VTEwiLiBZb3UgY2FuIGFsc28gZXhwbGljaXRseSBjcmVhdGUgYSBOVUxMIHBvaW50ZXIgY29uc2lzdGluZyBvZiB0aGUgdmFsdWUgMCBhbmQgYSB0eXBlIHN1Y2ggYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8wX1ZlY3Rvcl9wCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHNvbWUgUHl0aG9uIHVzZXJzLCB0aGUgaWRlYSBvZiByZXByZXNlbnRpbmcgcG9pbnRlcnMgYXMgc3RyaW5ncyBtYXkgc2VlbSBzdHJhbmdlLCBidXQga2VlcCBpbiBtaW5kIHRoYXQgcG9pbnRlcnMgYXJlIG1lYW50IHRvIGJlIG9wYXF1ZSBvYmplY3RzLiBJbiBwcmFjdGljZSwgeW91IG1heSBuZXZlciBub3RpY2UgdGhhdCBwb2ludGVycyBhcmUgY2hhcmFjdGVyIHN0cmluZ3MuIFRoZXJlIGlzIGFsc28gYSBjZXJ0YWluIGVmZmljaWVuY3kgaW4gdXNpbmcgdGhpcyByZXByZXNlbnRhdGlvbiBhcyBpdCBpcyBlYXN5IHRvIHBhc3MgcG9pbnRlcnMgYXJvdW5kIGJldHdlZW4gbW9kdWxlcyBhbmQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gcmVseSBvbiBhIG5ldyBQeXRob24gZGF0YXR5cGUuIEV2ZW50dWFsbHksIHBvaW50ZXJzIG1heSBiZSByZXByZXNlbnRlZCBhcyBzcGVjaWFsIFB5dGhvbiBvYmplY3RzLCBidXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiB3b3JrcyByZW1hcmthYmx5IHdlbGwgc28gdGhlcmUgaGFzIGJlZW4gbGl0dGxlIG5lZWQgdG8gcmVwbGFjZSBpdC48cD4KLTxhIG5hbWU9Im4yNyI+PC9hPjxoMz4gU3RydWN0dXJlcyA8L2gzPgotVGhlIGxvdy1sZXZlbCBTV0lHIGludGVyZmFjZSBvbmx5IHByb3ZpZGVzIGEgc2ltcGxlIGludGVyZmFjZSB0byBDIHN0cnVjdHVyZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdHJ1Y3QgVmVjdG9yIHsKLQlkb3VibGUgeCx5LHo7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1nZXRzIG1hcHBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY29sbGVjdGlvbiBvZiBDIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIFZlY3Rvcl94X2dldChWZWN0b3IgKm9iaikKLWRvdWJsZSBWZWN0b3JfeF9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSB4KQotZG91YmxlIFZlY3Rvcl95X2dldChWZWN0b3IgKm9iaikKLWRvdWJsZSBWZWN0b3JfeV9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSB5KQotZG91YmxlIFZlY3Rvcl96X2dldChWZWN0b3IgKm9iaikKLWRvdWJsZSBWZWN0b3Jfel9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSB6KQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGVzZSBmdW5jdGlvbnMgYXJlIHRoZW4gdXNlZCBpbiB0aGUgcmVzdWx0aW5nIFB5dGhvbiBpbnRlcmZhY2UuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIHYgaXMgYSBWZWN0b3IgdGhhdCBnb3QgY3JlYXRlZCBzb21laG93Ci0mZ3Q7Jmd0OyZndDsgVmVjdG9yX3hfZ2V0KHYpCi0zLjUKLSZndDsmZ3Q7Jmd0OyBWZWN0b3JfeF9zZXQodiw3LjgpICAgICAgICMgQ2hhbmdlIHggY29tcG9uZW50Ci0mZ3Q7Jmd0OyZndDsgcHJpbnQgVmVjdG9yX3hfZ2V0KHYpLCBWZWN0b3JfeV9nZXQodiksIFZlY3Rvcl96X2dldCh2KQotNy44IC00LjUgMC4wCi0mZ3Q7Jmd0OyZndDsgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpbWlsYXIgYWNjZXNzIGlzIHByb3ZpZGVkIGZvciB1bmlvbnMgYW5kIHRoZSBkYXRhIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IEMrKyBDbGFzc2VzPC9oMz4KLUMrKyBjbGFzc2VzIGFyZSBoYW5kbGVkIGJ5IGJ1aWxkaW5nIGEgc2V0IG9mIGxvdyBsZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3QgewotcHVibGljOgotICBMaXN0KCk7Ci0gIH5MaXN0KCk7Ci0gIGludCAgc2VhcmNoKGNoYXIgKml0ZW0pOwotICB2b2lkIGluc2VydChjaGFyICppdGVtKTsKLSAgdm9pZCByZW1vdmUoY2hhciAqaXRlbSk7Ci0gIGNoYXIgKmdldChpbnQgbik7Ci0gIGludCAgbGVuZ3RoOwotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIHdyYXBwZWQgYnkgU1dJRywgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2lsbCBiZSBjcmVhdGVkIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5MaXN0ICAgICpuZXdfTGlzdCgpOwotdm9pZCAgICAgZGVsZXRlX0xpc3QoTGlzdCAqbCk7Ci1pbnQgICAgICBMaXN0X3NlYXJjaChMaXN0ICpsLCBjaGFyICppdGVtKTsKLXZvaWQgICAgIExpc3RfaW5zZXJ0KExpc3QgKmwsIGNoYXIgKml0ZW0pOwotdm9pZCAgICAgTGlzdF9yZW1vdmUoTGlzdCAqbCwgY2hhciAqaXRlbSk7Ci1jaGFyICAgICpMaXN0X2dldChMaXN0ICpsLCBpbnQgbik7Ci1pbnQgICAgICBMaXN0X2xlbmd0aF9nZXQoTGlzdCAqbCk7Ci1pbnQgICAgICBMaXN0X2xlbmd0aF9zZXQoTGlzdCAqbCwgaW50IG4pOwotdm9pZCAgICAgTGlzdF9wcmludChMaXN0ICpsKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2l0aGluIFB5dGhvbiwgdGhlc2UgZnVuY3Rpb25zIHVzZWQgdG8gYWNjZXNzIHRoZSBDKysgY2xhc3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSZndDsmZ3Q7Jmd0OyBsID0gbmV3X0xpc3QoKQotJmd0OyZndDsmZ3Q7IExpc3RfaW5zZXJ0KGwsIkFsZSIpCi0mZ3Q7Jmd0OyZndDsgTGlzdF9pbnNlcnQobCwiU3RvdXQiKQotJmd0OyZndDsmZ3Q7IExpc3RfaW5zZXJ0KGwsIkxhZ2VyIikKLSZndDsmZ3Q7Jmd0OyBMaXN0X3ByaW50KGwpCi1MYWdlcgotU3RvdXQKLUFsZQotJmd0OyZndDsmZ3Q7IHByaW50IExpc3RfbGVuZ3RoX2dldChsKQotMwotJmd0OyZndDsmZ3Q7IHByaW50IGwKLV8xMDA4NTYwX0xpc3RfcAotJmd0OyZndDsmZ3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUMrKyBvYmplY3RzIGFyZSByZWFsbHkganVzdCBwb2ludGVycy4gTWVtYmVyIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgYWNjZXNzZWQgYnkgc2ltcGx5IHBhc3NpbmcgYSBwb2ludGVyIGludG8gYSBjb2xsZWN0aW9uIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IHRha2UgdGhlIHBvaW50ZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LjxwPgotPHA+Ci1XaGlsZSBzb21ld2hhdCBwcmltaXRpdmUsIHRoZSBsb3ctbGV2ZWwgU1dJRyBpbnRlcmZhY2UgcHJvdmlkZXMgZGlyZWN0IGFuZCBmbGV4aWJsZSBhY2Nlc3MgdG8gQysrIG9iamVjdHMuIEFzIGl0IHR1cm5zIG91dCwgYSBtb3JlIGVsZWdhbnQgbWV0aG9kIG9mIGFjY2Vzc2luZyBzdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzIGlzIGF2YWlsYWJsZSB1c2luZyBzaGFkb3cgY2xhc3Nlcy48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBQeXRob24gc2hhZG93IGNsYXNzZXM8L2gyPgotVGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgcHJvdmlkZXMgYWNjZXNzIHRvIEMgc3RydWN0dXJlcyBhbmQgQysrIGNsYXNzZXMsIGJ1dCBpdCBkb2Vzbid0IGxvb2sgbXVjaCBsaWtlIGEgY2xhc3MgdGhhdCBtaWdodCBiZSBjcmVhdGVkIGluIFB5dGhvbi4gSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBsb3ctbGV2ZWwgQyBpbnRlcmZhY2UgdG8gd3JpdGUgYSBQeXRob24gY2xhc3MgdGhhdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBDKysgY2xhc3MuIEluIHRoaXMgY2FzZSwgdGhlIFB5dGhvbiBjbGFzcyBpcyBzYWlkIHRvICJzaGFkb3ciIHRoZSBDKysgY2xhc3MuICBUaGF0IGlzLCBpdCBiZWhhdmVzIGxpa2UgdGhlIG9yaWdpbmFsIGNsYXNzLCBidXQgaXMgcmVhbGx5IGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBhIEMrKyBjbGFzcy48cD4KLTxhIG5hbWU9Im4yOSI+PC9hPjxoMz4gQSBzaW1wbGUgZXhhbXBsZTwvaDM+Ci1Gb3Igb3VyIGVhcmxpZXIgTGlzdCBjbGFzcywgYSBQeXRob24gc2hhZG93IGNsYXNzIGNvdWxkIGJlIHdyaXR0ZW4gYnkgaGFuZCBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3Q6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlzZWxmLnRoaXMgPSBuZXdfTGlzdCgpCi0JZGVmIF9fZGVsX18oc2VsZik6Ci0JCWRlbGV0ZV9MaXN0KHNlbGYudGhpcykKLQlkZWYgc2VhcmNoKHNlbGYsaXRlbSk6Ci0JCXJldHVybiBMaXN0X3NlYXJjaChzZWxmLnRoaXMsaXRlbSkKLQlkZWYgaW5zZXJ0KHNlbGYsaXRlbSk6Ci0JCUxpc3RfaW5zZXJ0KHNlbGYudGhpcyxpdGVtKQotCWRlZiByZW1vdmUoc2VsZixpdGVtKToKLQkJTGlzdF9yZW1vdmUoc2VsZi50aGlzLGl0ZW0pCi0JZGVmIGdldChzZWxmLG4pOgotCQlyZXR1cm4gTGlzdF9nZXQoc2VsZi50aGlzLG4pCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsbmFtZSk6Ci0JCWlmIG5hbWUgPT0gImxlbmd0aCIgOiByZXR1cm4gTGlzdF9sZW5ndGhfZ2V0KHNlbGYudGhpcykpCi0JCWVsc2UgOiByZXR1cm4gc2VsZi5fX2RpY3RfX1tuYW1lXQotCWRlZiBfX3NldGF0dHJfXyhzZWxmLG5hbWUsdmFsdWUpOgotCQlpZiBuYW1lID09ICJsZW5ndGgiOiBMaXN0X2xlbmd0aF9zZXQoc2VsZi50aGlzLHZhbHVlKQotCQllbHNlIDogc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gdXNlZCBpbiBhIFB5dGhvbiBzY3JpcHQsIHdlIGNhbiB1c2UgdGhlIGNsYXNzIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLQotJmd0OyZndDsmZ3Q7IGwgPSBMaXN0KCkKLSZndDsmZ3Q7Jmd0OyBsLmluc2VydCgiQWxlIikKLSZndDsmZ3Q7Jmd0OyBsLmluc2VydCgiU3RvdXQiKQotJmd0OyZndDsmZ3Q7IGwuaW5zZXJ0KCJMYWdlciIpCi0mZ3Q7Jmd0OyZndDsgTGlzdF9wcmludChsLnRoaXMpCi1MYWdlcgotU3RvdXQKLUFsZQotJmd0OyZndDsmZ3Q7IGwubGVuZ3RoCi0zCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU9idmlvdXNseSwgdGhpcyBpcyBhIG11Y2ggbmljZXIgaW50ZXJmYWNlIHRoYW4gYmVmb3JlLS1hbmQgaXQgb25seSByZXF1aXJlZCBhIHNtYWxsIGFtb3VudCBvZiBQeXRob24gY29kaW5nLjxwPgotPGEgbmFtZT0ibjMwIj48L2E+PGgzPiBXaHkgd3JpdGUgc2hhZG93IGNsYXNzZXMgaW4gUHl0aG9uPzwvaDM+Ci1XaGlsZSBvbmUgY291bGQgd3JhcCBDL0MrKyBvYmplY3RzIGRpcmVjdGx5IGludG8gUHl0aG9uIGFzIG5ldyBQeXRob24gdHlwZXMsIHRoaXMgYXBwcm9hY2ggaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zLiBGaXJzdCwgYXMgdGhlIEMvQysrIGNvZGUgZ2V0cyBjb21wbGljYXRlZCwgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgc3RhcnRzIHRvIGJlY29tZSBleHRyZW1lbHkgdWdseS4gSXQgYWxzbyBiZWNvbWVzIGhhcmQgdG8gaGFuZGxlIGluaGVyaXRhbmNlIGFuZCBtb3JlIGFkdmFuY2VkIGxhbmd1YWdlIGZlYXR1cmVzLiBBIHNlY29uZCwgYW5kIG1vcmUgc2VyaW91cyBwcm9ibGVtLCBpcyB0aGF0IFB5dGhvbiAidHlwZXMiIGNyZWF0ZWQgaW4gQyBjYW4gbm90IGJlIHN1YmNsYXNzZWQgb3IgdXNlZCBpbiB0aGUgc2FtZSB3YXkgYXMgb25lIG1pZ2h0IHVzZSBhIHJlYWwgUHl0aG9uIGNsYXNzLiBBcyBhIHJlc3VsdCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIGludGVyZXN0aW5nIHRoaW5ncyBsaWtlIGNyZWF0ZSBQeXRob24gY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSBDKysgY2xhc3Nlcy4gIDxwPgotPHA+Ci1CeSB3cml0aW5nIHNoYWRvdyBjbGFzc2VzIGluIFB5dGhvbiBpbnN0ZWFkIG9mIEMsIHRoZSBjbGFzc2VzIGJlY29tZSByZWFsIFB5dGhvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYmFzZS1jbGFzc2VzIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvciBmb3Igb3RoZXIgYXBwbGljYXRpb25zLiBXcml0aW5nIHRoZSBzaGFkb3cgY2xhc3NlcyBpbiBQeXRob24gYWxzbyBncmVhdGx5IHNpbXBsaWVzIGNvZGluZyBjb21wbGV4aXR5IGFzIHdyaXRpbmcgaW4gUHl0aG9uIGlzIG11Y2ggZWFzaWVyIHRoYW4gdHJ5aW5nIHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcgaW4gQy4gRmluYWxseSwgYnkgd3JpdGluZyBzaGFkb3cgY2xhc3NlcyBpbiBQeXRob24sIHRoZXkgYXJlIGVhc3kgdG8gbW9kaWZ5IGFuZCBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGV2ZXIgcmVjb21waWxpbmcgYW55IG9mIHRoZSBDIGNvZGUuICAgVGhlIGRvd25zaWRlIHRvIHRoaXMgYXBwcm9hY2ggaXMgd29yc2UgcGVyZm9ybWFuY2UtLWEgY29uY2VybiBmb3Igc29tZSB1c2Vycy48cD4KLTxwPgotVGhlIHByb2JsZW1zIG9mIGNvbWJpbmluZyBDKysgYW5kIFB5dGhvbiBoYXZlIGJlZW4gb2YgZ3JlYXQgaW50ZXJlc3QgdG8gdGhlIFB5dGhvbiBjb21tdW5pdHkuICAgU1dJRyBpcyBwcmltYXJpbHkgY29uY2VybmVkIHdpdGggYWNjZXNzaW5nIEMrKyBmcm9tIFB5dGhvbi4gICBSZWFkZXJzIHdobyBhcmUgaW50ZXJlc3RlZCBpbiBtb3JlIHRoYW4gdGhpcyAoYW5kIHRoZSBpZGVhIG9mIGFjY2Vzc2luZyBQeXRob24gY2xhc3NlcyBmcm9tIEMrKykgYXJlIGVuY291cmFnZWQgdG8gbG9vayBpbnRvIHRoZSBNRVNTIGV4dGVuc2lvbiB3aGljaCBhaW1zIHRvIHByb3ZpZGUgYSB0aWdodGVyIGludGVncmF0aW9uIGJldHdlZW4gQysrIGFuZCBQeXRob24uICBUaGUgcmVjZW50bHkgYW5ub3VuY2VkIEdSQUQgcGFja2FnZSBhbHNvIHNob3dzIG11Y2ggcHJvbWlzZSBhbmQgcHJvdmlkZXMgdmVyeSBjb21wcmVoZW5zaXZlIEMrKy9QeXRob24gaW50ZXJmYWNlLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBBdXRvbWF0ZWQgc2hhZG93IGNsYXNzIGdlbmVyYXRpb248L2gzPgotU1dJRyBjYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBzaGFkb3cgY2xhc3NlcyBpZiB5b3UgdXNlIHRoZSA8dHQ+LXNoYWRvdzwvdHQ+IG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcHl0aG9uIC1zaGFkb3cgaW50ZXJmYWNlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIGNyZWF0ZSB0aGUgZm9sbG93aW5nIHR3byBmaWxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50ZXJmYWNlX3dyYXAuYwotbW9kdWxlLnB5Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBmaWxlIDx0dD5pbnRlcmZhY2Vfd3JhcC5jPC90dD4gY29udGFpbnMgdGhlIG5vcm1hbCBTV0lHIEMvQysrIHdyYXBwZXJzLiBUaGUgZmlsZSA8dHQ+bW9kdWxlLnB5PC90dD4gY29udGFpbnMgdGhlIFB5dGhvbiBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gc2hhZG93IGNsYXNzZXMuIFRoZSBuYW1lIG9mIHRoaXMgZmlsZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUuPHA+Ci08cD4KLUFzc29jaWF0ZWQgd2l0aCB0aGUgdHdvIGZpbGVzIGFyZSBUV08gUHl0aG9uIG1vZHVsZXMuIFRoZSBDIG1vZHVsZSBgPHR0Pm1vZHVsZWM8L3R0PicgY29udGFpbnMgdGhlIGxvdy1sZXZlbCBDIGludGVyZmFjZSB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGhvdXQgdGhlIDx0dD4tc2hhZG93PC90dD4gb3B0aW9uLiBUaGUgUHl0aG9uIG1vZHVsZSBgPHR0Pm1vZHVsZTwvdHQ+JyBjb250YWlucyB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0IGFyb3VuZCB0aGUgbG93LWxldmVsIGludGVyZmFjZS4gVG8gdXNlIHRoZSBtb2R1bGUsIHNpbXBseSB1c2UgYDx0dD5pbXBvcnQgbW9kdWxlPC90dD4nLiBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIGA8dHQ+bW9kdWxlYzwvdHQ+JyBtb2R1bGUgaXMgY29tcGxldGVseSBoaWRkZW4gYWx0aG91Z2ggeW91IGNhbiBjZXJ0YWlubHkgdXNlIGl0IGlmIHlvdSB3YW50IHRvLjxwPgotPGEgbmFtZT0ibjMyIj48L2E+PGgzPiBDb21waWxpbmcgbW9kdWxlcyB3aXRoIHNoYWRvdyBjbGFzc2VzPC9oMz4KLVRvIGNvbXBpbGUgYSBtb2R1bGUgaW52b2x2aW5nIHNoYWRvdyBjbGFzc2VzLCB5b3UgY2FuIHVzZSB0aGUgc2FtZSBwcm9jZWR1cmUgYXMgYmVmb3JlIGV4Y2VwdCB0aGF0IHRoZSBtb2R1bGUgbmFtZSBub3cgaGFzIGFuIGV4dHJhIGA8dHQ+YzwvdHQ+JyBhcHBlbmRlZCB0byB0aGUgbmFtZS4gVGh1cywgYW4gaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotLi4uIGEgYnVuY2ggb2YgZGVjbGFyYXRpb25zIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1taWdodCBiZSBjb21waWxlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLXB5dGhvbiAtc2hhZG93IGV4YW1wbGUuaQotJSBnY2MgLWMgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNCBcCi0JLUkvdXNyL2xvY2FsL2xpYi9weXRob24xLjQvY29uZmlnIC1ESEFWRV9DT05GSUdfSAotJSBsZCAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlY21vZHVsZS5zbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3RpY2UgdGhlIG5hbWluZyBvZiBgPHR0PmV4YW1wbGVjbW9kdWxlLnNvPC90dD4nIGFzIG9wcG9zZWQgdG8gYDx0dD5leGFtcGxlbW9kdWxlLnNvPC90dD4nIHRoYXQgd291bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aG91dCBzaGFkb3cgY2xhc3Nlcy48cD4KLTxwPgotV2hlbiB1c2luZyBzdGF0aWMgbGlua2luZywgbm8gY2hhbmdlcyBuZWVkIHRvIGJlIG1hZGUgdG8gdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IFdoZXJlIHRvIGdvIGZvciBtb3JlIGluZm9ybWF0aW9uPC9oMz4KLVNoYWRvdyBjbGFzc2VzIHR1cm4gb3V0IHRvIGJlIHNvIHVzZWZ1bCB0aGF0IHRoZXkgYXJlIHVzZWQgYWxtb3N0IGFsbCBvZiB0aGUgdGltZSB3aXRoIFNXSUcuIEFsbCBvZiB0aGUgZXhhbXBsZXMgcHJlc2VudGVkIGhlcmUgd2lsbCBhc3N1bWUgdGhhdCBzaGFkb3cgY2xhc3NlcyBoYXZlIGJlZW4gZW5hYmxlZC4gVGhlIHByZWNpc2UgaW1wbGVtZW50YXRpb24gb2Ygc2hhZG93IGNsYXNzZXMgaXMgZGVzY3JpYmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyIGFuZCBpcyBub3QgbmVjZXNzYXJ5ICB0byBlZmZlY3RpdmVseSB1c2UgU1dJRy48cD4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBBYm91dCB0aGUgRXhhbXBsZXM8L2gyPgotVGhlIG5leHQgZmV3IHNlY3Rpb25zIHdpbGwgZ28gdGhyb3VnaCBhIHNlcmllcyBvZiBQeXRob24gZXhhbXBsZXMgb2YgdmFyeWluZyBjb21wbGV4aXR5LiBUaGVzZSBleGFtcGxlcyBhcmUgZGVzaWduZWQgdG8gaWxsdXN0cmF0ZSBob3cgU1dJRyBjYW4gYmUgdXNlZCB0byBpbnRlZ3JhdGUgQy9DKysgYW5kIFB5dGhvbiBpbiBhIHZhcmlldHkgb2Ygd2F5cy4gU29tZSBvZiB0aGUgdGhpbmdzIHRoYXQgd2lsbCBiZSBjb3ZlcmVkIGluY2x1ZGUgOjxwPgotPHA+Ci08dWw+Ci08bGk+Q29udHJvbGxpbmcgYSBzaW1wbGUgQysrIHByb2dyYW0gd2l0aCBQeXRob24KLTxsaT5XcmFwcGluZyBhIEMgbGlicmFyeS4KLTxsaT5BZGRpbmcgUHl0aG9uIG1ldGhvZHMgdG8gZXhpc3RpbmcgQysrIGNsYXNzZXMKLTxsaT5BY2Nlc3NpbmcgYXJyYXlzIGFuZCBvdGhlciBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzLgotPGxpPkJ1aWxkaW5nIHJldXNhYmxlIGNvbXBvbmVudHMuCi08bGk+V3JpdGluZyBDL0MrKyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gUHl0aG9uLgotPC91bD4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBTb2x2aW5nIGEgc2ltcGxlIGhlYXQtZXF1YXRpb248L2gyPgotSW4gdGhpcyBleGFtcGxlLCB3ZSB3aWxsIHNob3cgaG93IFB5dGhvbiBjYW4gYmUgdXNlZCB0byBjb250cm9sIGEgc2ltcGxlIHBoeXNpY3MgYXBwbGljYXRpb24tLWluIHRoaXMgY2FzZSwgc29tZSBDKysgY29kZSBmb3Igc29sdmluZyBhIDJEIGhlYXQgZXF1YXRpb24uICBUaGlzIGV4YW1wbGUgaXMgcHJvYmFibHkgb3Zlcmx5IHNpbXBsaXN0aWMsIGJ1dCBob3BlZnVsbHkgaXQncyBlbm91Z2ggdG8gZ2l2ZSB5b3Ugc29tZSBpZGVhcy48cD4KLTxhIG5hbWU9Im4zNCI+PC9hPjxoMz4gVGhlIEMrKyBjb2RlIDwvaDM+Ci1PdXIgc2ltcGxlIGFwcGxpY2F0aW9uIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGZpbGVzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBGaWxlIDogcGRlLmgKLS8vIEhlYWRlciBmaWxlIGZvciBIZWF0IGVxdWF0aW9uIHNvbHZlcgotCi0jaW5jbHVkZSAmbHQ7bWF0aC5oJmd0OwotI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0KLS8vIEEgc2ltcGxlIDJEIEdyaWQgc3RydWN0dXJlIAotCi0vLyBBIHNpbXBsZSBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgYSAyRCBncmlkIG9mIHZhbHVlcwotc3RydWN0IEdyaWQyZCB7Ci0gIEdyaWQyZChpbnQgbmksIGludCBuaik7Ci0gIH5HcmlkMmQoKTsKLSAgZG91YmxlICoqZGF0YTsKLSAgaW50ICAgICAgeHBvaW50czsKLSAgaW50ICAgICAgeXBvaW50czsKLX07Ci0KLS8vIFNpbXBsZSBjbGFzcyBmb3Igc29sdmluZyBhIGhlYXQgZXF1YXRpb24gKi8KLWNsYXNzIEhlYXQyZCB7Ci1wcml2YXRlOgotICBHcmlkMmQgICAgKndvcms7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXBvcmFyeSBncmlkLCBuZWVkZWQgZm9yIHNvbHZlcgotICBkb3VibGUgICAgaCxrOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyaWQgc3BhY2luZwotcHVibGljOiAgICAKLSAgSGVhdDJkKGludCBuaSwgaW50IG5qKTsgCi0gIH5IZWF0MmQoKTsKLSAgR3JpZDJkICAgICpncmlkOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhCi0gIGRvdWJsZSAgICAgZHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGltZXN0ZXAKLSAgZG91YmxlICAgICB0aW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGFwc2VkIHRpbWUKLSAgdm9pZCAgICAgICBzb2x2ZShpbnQgbnN0ZXBzKTsgICAgICAgICAgICAvLyBSdW4gZm9yIG5zdGVwcwotICB2b2lkICAgICAgIHNldF90ZW1wKGRvdWJsZSB0ZW1wKTsgICAgICAgIC8vIFNldCB0ZW1wZXJhdHVyZQotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIHN1cHBvcnRpbmcgQysrIGNvZGUgaW1wbGVtZW50cyBhIHNpbXBsZSBwYXJ0aWFsIGRpZmZlcmVudGlhbCBlcXVhdGlvbiBzb2x2ZXIgYW5kIHNvbWUgb3BlcmF0aW9ucyBvbiB0aGUgZ3JpZCBkYXRhIHN0cnVjdHVyZS4gICBUaGUgcHJlY2lzZSBpbXBsZW1lbnRhdGlvbiBpc24ndCBpbXBvcnRhbnQgaGVyZSwgYnV0IGFsbCBvZiB0aGUgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlICI8dHQ+RXhhbXBsZXMvcHl0aG9uL21hbnVhbCIgPC90dD5kaXJlY3Rvcnkgb2YgdGhlIFNXSUcgZGlzdHJpYnV0aW9uLiA8cD4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gTWFraW5nIGEgcXVpY2sgYW5kIGRpcnR5IFB5dGhvbiBtb2R1bGU8L2gzPgotR2l2ZW4gb3VyIHNpbXBsZSBhcHBsaWNhdGlvbiwgbWFraW5nIGEgUHl0aG9uIG1vZHVsZSBpcyBlYXN5LiAgU2ltcGx5IHVzZSB0aGUgZm9sbG93aW5nIFNXSUcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGUgOiBwZGUuaQotJW1vZHVsZSBwZGUKLSV7Ci0jaW5jbHVkZSAicGRlLmgiCi0lfQotCi0laW5jbHVkZSBwZGUuaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TaW5jZSA8dHQ+cGRlLmg8L3R0PiBpcyBmYWlybHkgc2ltcGxlLCB3ZSBjYW4gc2ltcGx5IGluY2x1ZGUgaXQgZGlyZWN0bHkgaW50byBvdXIgaW50ZXJmYWNlIGZpbGUgdXNpbmcgPHR0PiVpbmNsdWRlPC90dD4uICBIb3dldmVyLCB3ZSBhbHNvIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGFsc28gaW5jbHVkZSBpdCBpbiB0aGUgPHR0PiV7LCV9PC90dD4gYmxvY2stLW90aGVyd2lzZSB3ZSdsbCBnZXQgYSBodWdlIG51bWJlciBvZiBjb21waWxlciBlcnJvcnMgd2hlbiB3ZSBjb21waWxlIHRoZSByZXN1bHRpbmcgd3JhcHBlciBmaWxlLiAgPHA+Ci08cD4KLVRvIGJ1aWxkIHRoZSBtb2R1bGUgc2ltcGx5IHJ1biBTV0lHIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcHl0aG9uIC1zaGFkb3cgcGRlLmkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotYW5kIGNvbXBpbGUgdXNpbmcgdGhlIHRlY2huaXF1ZXMgZGVzY3JpYmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBjaGFwdGVyLjxwPgotPGEgbmFtZT0ibjM2Ij48L2E+PGgzPiBVc2luZyAgb3VyIG5ldyBtb2R1bGU8L2gzPgotV2UgYXJlIG5vdyByZWFkeSB0byB1c2Ugb3VyIG5ldyBtb2R1bGUuICAgVG8gZG8gdGhpcywgd2UgY2FuIHNpbXBseSB3cml0ZSBhIFB5dGhvbiBzY3JpcHQgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEEgZmFpcmx5IHVuaW50ZXJlc3RpbmcgZXhhbXBsZQotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi1oID0gSGVhdDJkKDUwLDUwKSAgICAgICAgICAjIENyZWF0ZXMgYSBuZXcgInByb2JsZW0iCi0KLWguc2V0X3RlbXAoMS4wKQotcHJpbnQgIkR0ID0gIiwgaC5kdAotCi0jIFNvbHZlIHNvbWV0aGluZwotCi1mb3IgaSBpbiByYW5nZSgwLDI1KToJCi0JaC5zb2x2ZSgxMDApCi0JcHJpbnQgInRpbWUgPSAiLCBoLnRpbWUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIHJ1biwgd2UgZ2V0IHJhdGhlciBleGNpdGluZyBvdXRwdXQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1EdCA9ICAyLjVlLTA1Ci10aW1lID0gIDAuMDAyNQotdGltZSA9ICAwLjAwNQotdGltZSA9ICAwLjAwNzUKLS4uLgotdGltZSA9ICAwLjA2Ci10aW1lID0gIDAuMDYyNQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0ob2theSwgaXQncyBub3QgdGhhdCBleGNpdGluZy0td2VsbCwgbWF5YmUgaXQgaXMgaWYgeW91IGRvbid0IGdldCBvdXQgbXVjaCkuPHA+Ci08cD4KLVdoaWxlIHRoaXMgaGFzIG9ubHkgYmVlbiBhIHNpbXBsZSBleGFtcGxlIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgd2UgY291bGQgaGF2ZSBqdXN0IGFzIGVhc2lseSB3cml0dGVuIHRoZSBzYW1lIHRoaW5nIGluIEMrKy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFB5dGhvbiBleGFtcGxlIHdyaXR0ZW4gaW4gQysrCi0KLSNpbmNsdWRlICJwZGUuaCIKLSNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQotICBIZWF0MmQgKmg7Ci0KLSAgaCA9IG5ldyBIZWF0MmQoNTAsNTApOwotICBwcmludGYoIkR0ID0gJWdcbiIsIGgtJmd0O2R0KTsKLSAgCi0gIGgtJmd0O3NldF90ZW1wKDEuMCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyAyNTsgaSsrKSB7Ci0gICAgaC0mZ3Q7c29sdmUoMTAwKTsKLSAgICBwcmludGYoInRpbWUgPSAlZ1xuIiwgaC0mZ3Q7dGltZSk7Ci0gIH0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRm9yIHRoZSBtb3N0IHBhcnQsIHRoZSBjb2RlIGxvb2tzIGlkZW50aWNhbCAoYWx0aG91Z2ggdGhlIFB5dGhvbiB2ZXJzaW9uIGlzIHNpbXBsZXIpLiAgQXMgZm9yIHBlcmZvcm1hbmNlLCB0aGUgUHl0aG9uIHZlcnNpb24gcnVucyBsZXNzIHRoYW4gMSUgc2xvd2VyIHRoYW4gdGhlIEMrKyB2ZXJzaW9uIG9uIG15IG1hY2hpbmUuICBHaXZlbiB0aGF0IG1vc3Qgb2YgdGhlIGNvbXB1dGF0aW9uYWwgd29yayBpcyB3cml0dGVuIGluIEMrKywgdGhlcmUgaXMgdmVyeSBsaXR0bGUgcGVyZm9ybWFuY2UgcGVuYWx0eSBmb3Igd3JpdGluZyB0aGUgb3V0ZXIgbG9vcCBvZiBvdXIgY2FsY3VsYXRpb24gaW4gUHl0aG9uIGluIHRoaXMgY2FzZS48cD4KLTxwPgotVW5mb3J0dW5hdGVseSwgb3VyIFB5dGhvbiB2ZXJzaW9uIHN1ZmZlcnMgYSBudW1iZXIgb2YgZHJhd2JhY2tzLiAgTW9zdCBub3RhYmx5LCB0aGVyZSBpcyBubyB3YXkgZm9yIHVzIHRvIGFjY2VzcyBhbnkgb2YgdGhlIGdyaWQgZGF0YSAod2hpY2ggaXMgZWFzaWx5IGFjY29tcGxpc2hlZCBpbiBDKyspLiBIb3dldmVyLCB0aGVyZSBhcmUgd2F5cyB0byBmaXggdGhpcyA6PHA+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IEFjY2Vzc2luZyBhcnJheSBkYXRhPC9oMz4KLUxldCdzIG1vZGlmeSBvdXIgaGVhdCBlcXVhdGlvbiBwcm9ibGVtIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBncmlkIGRhdGEgZGlyZWN0bHkgZnJvbSBQeXRob24uICAgVGhpcyBjYW4gYmUgZG9uZSBieSBtb2RpZnlpbmcgb3VyIGludGVyZmFjZSBmaWxlIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUgcGRlCi0lewotI2luY2x1ZGUgInBkZS5oIgotJX0KLQotJWluY2x1ZGUgcGRlLmgKLQotLy8gQWRkIGEgZmV3ICJoZWxwZXIiIGZ1bmN0aW9ucyB0byBleHRyYWN0IGdyaWQgZGF0YSAKLSVpbmxpbmUgJXsKLWRvdWJsZSAgR3JpZDJkX2dldChHcmlkMmQgKmcsIGludCBpLCBpbnQgaikgewotICAgICAgcmV0dXJuIGctJmd0O2RhdGFbaV1bal07Ci19Ci12b2lkICAgIEdyaWQyZF9zZXQoR3JpZDJkICpnLCBpbnQgaSwgaW50IGosIGRvdWJsZSB2YWwpIHsKLSAgICAgIGctJmd0O2RhdGFbaV1bal0gPSB2YWw7Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1SYXRoZXIgdGhhbiBtb2RpZnlpbmcgb3VyIEMrKyBjb2RlLCBpdCBpcyBlYXN5IGVub3VnaCB0byBzdXBwbHkgYSBmZXcgYWNjZXNzb3IgZnVuY3Rpb25zIGRpcmVjdGx5IGluIG91ciBpbnRlcmZhY2UgZmlsZS4gIFRoZXNlIGZ1bmN0aW9uIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBQeXRob24gc28gdGhpcyBhcHByb2FjaCBtYWtlcyBzZW5zZSBhbmQgaXQgaGVscHMgdXMga2VlcCBvdXIgQysrIGNvZGUgZnJlZSBmcm9tIHVubmVjZXNzYXJ5IGNsdXR0ZXIuICAgVGhlIDx0dD4laW5saW5lPC90dD4gZGlyZWN0aXZlIGlzIGEgY29udmVuaWVudCBtZXRob2QgZm9yIGFkZGluZyBoZWxwZXIgZnVuY3Rpb25zIHNpbmNlIHRoZSBmdW5jdGlvbnMgeW91IGRlY2xhcmUgc2hvdyB1cCBpbiB0aGUgaW50ZXJmYWNlIGF1dG9tYXRpY2FsbHkuPHA+Ci08cD4KLVdlIGNhbiBub3cgdXNlIG91ciBhY2Nlc3NvciBmdW5jdGlvbnMgdG8gd3JpdGUgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgUHl0aG9uIHNjcmlwdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBBbiBleGFtcGxlIHVzaW5nIG91ciBzZXQvZ2V0IGZ1bmN0aW9ucwotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotZGVmIGluaXRjb25kKGgpOgotCWguc2V0X3RlbXAoMC4wKQotCW54ID0gaC5ncmlkLnhwb2ludHMKLQlmb3IgaSBpbiByYW5nZSgwLG54KToKLQkJR3JpZDJkX3NldChoLmdyaWQsaSwwLDEuMCkgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCBncmlkIHZhbHVlcwotCi0jIER1bXAgb3V0IHRvIGEgZmlsZQotZGVmIGR1bXAoaCxmaWxlbmFtZSk6Ci0JZiA9IG9wZW4oZmlsZW5hbWUsInciKQotCW54ID0gaC5ncmlkLnhwb2ludHMKLQlueSA9IGguZ3JpZC55cG9pbnRzCi0JZm9yIGkgaW4gcmFuZ2UoMCxueCk6Ci0JCWZvciBqIGluIHJhbmdlKDAsbnkpOgotCQkJZi53cml0ZShzdHIoR3JpZDJkX2dldChoLmdyaWQsaSxqKSkrIlxuIikgICMgR2V0IGdyaWQgdmFsdWUKLQlmLmNsb3NlKCkKLQotIyBTZXQgdXAgYSBwcm9ibGVtIGFuZCBydW4gaXQKLQotaCA9IEhlYXQyZCg1MCw1MCkKLWluaXRjb25kKGgpCi1maWxlbm8gPSAxCi1mb3IgaSBpbiByYW5nZSgwLDI1KToKLQloLnNvbHZlKDEwMCkKLQlkdW1wKGgsIkRhdCIrc3RyKGZpbGVubykpCi0JcHJpbnQgInRpbWUgPSAiLCBoLnRpbWUKLQlmaWxlbm8gPSBmaWxlbm8rMQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdlIG5vdyBoYXZlIGEgUHl0aG9uIHNjcmlwdCB0aGF0IGNhbiBjcmVhdGUgYSBncmlkLCBzZXQgdXAgYW4gaW5pdGlhbCBjb25kaXRpb24sIHJ1biBhIHNpbXVsYXRpb24sIGFuZCBkdW1wIGEgY29sbGVjdGlvbiBvZiBkYXRhZmlsZXMuICBTbywgd2l0aCBqdXN0IGEgbGl0dGxlIHN1cHBvcnRpbmcgY29kZSBpbiBvdXIgaW50ZXJmYWNlIGZpbGUsIHdlIGNhbiBzdGFydCB0byBkbyB1c2VmdWwgd29yayBmcm9tIFB5dGhvbi4gIDxwPgotPGEgbmFtZT0ibjM4Ij48L2E+PGgzPiBVc2UgUHl0aG9uIGZvciBjb250cm9sLCBDIGZvciBwZXJmb3JtYW5jZTwvaDM+Ci1Ob3cgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MgZ3JpZCBkYXRhIGZyb20gUHl0aG9uLCBpdCBpcyBwb3NzaWJsZSB0byBxdWlja2x5IHdyaXRlIGNvZGUgZm9yIGFsbCBzb3J0cyBvZiBvcGVyYXRpb25zLiAgIEhvd2V2ZXIsIFB5dGhvbiBtYXkgbm90IHByb3ZpZGUgZW5vdWdoIHBlcmZvcm1hbmNlIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlIDx0dD5kdW1wKCk8L3R0PiBmdW5jdGlvbiBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSBtYXkgYmVjb21lIHF1aXRlIHNsb3cgYXMgcHJvYmxlbSBzaXplcyBpbmNyZWFzZS4gICBUaHVzLCB3ZSBtaWdodCBjb25zaWRlciB3cml0aW5nIGl0IGluIEMrKyBzdWNoIGFzIHRoZSBmb2xsb3dzOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZHVtcChIZWF0MmQgKmgsIGNoYXIgKmZpbGVuYW1lKSB7Ci0gICAgICBGSUxFICpmOwotICAgICAgaW50ICAgaSxqOwotCi0gICAgICBmID0gZm9wZW4oZmlsZW5hbWUsInciKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgJmx0OyBoLSZndDtncmlkLSZndDt4cG9pbnRzOyBpKyspCi0JZm9yIChqID0gMDsgaiAmbHQ7IGgtJmd0O2dyaWQtJmd0O3lwb2ludHM7IGorKykKLQkgIGZwcmludGYoZiwiJTAuMTdmXG4iLGgtJmd0O2dyaWQtJmd0O2RhdGFbaV1bal0pOwotICAgICAgZmNsb3NlKGYpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyB1c2UgdGhpcyBuZXcgZnVuY3Rpb24sIHNpbXBsZSBwdXQgaXRzIGRlY2xhcmF0aW9uIGluIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCBnZXQgcmlkIG9mIHRoZSBvbGQgUHl0aG9uIHZlcnNpb24uICBUaGUgUHl0aG9uIHNjcmlwdCB3b24ndCBrbm93IHRoYXQgeW91IGNoYW5nZWQgdGhlIGltcGxlbWVudGF0aW9uLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBHZXR0aW5nIGV2ZW4gbW9yZSBzZXJpb3VzIGFib3V0IGFycmF5IGFjY2VzczwvaDM+Ci1XZSBoYXZlIHByb3ZpZGVkIGFjY2VzcyB0byBncmlkIGRhdGEgdXNpbmcgYSBwYWlyIG9mIGdldC9zZXQgZnVuY3Rpb25zLiAgSG93ZXZlciwgdXNpbmcgdGhlc2UgZnVuY3Rpb25zIGlzIGEgbGl0dGxlIGNsdW1zeSBiZWNhdXNlIHRoZXkgYWx3YXlzIGhhdmUgdG8gYmUgY2FsbGVkIGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5HcmlkMmRfc2V0KGdyaWQsaSxqLDEuMCkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNlIHRvIG1ha2UgdGhlIGdldC9zZXQgZnVuY3Rpb25zIGFwcGVhciBsaWtlICBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSA8dHQ+R3JpZDJEPC90dD4gY2xhc3MuICAgVGhhdCB3YXkgd2UgY291bGQgdXNlIHRoZW0gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5ncmlkLnNldChpLGosMS4wKQotZ3JpZC5nZXQoaSxqKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIHByb3ZpZGVzIGEgc2ltcGxlIHRlY2huaXF1ZSBmb3IgZG9pbmcgdGhpcyBhcyBpbGx1c3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHBkZQotJXsKLSNpbmNsdWRlICJwZGUuaCIKLSV9Ci0laW5jbHVkZSBwZGUuaAotCi0vLyBBZGQgYSBmZXcgImhlbHBlciIgZnVuY3Rpb25zIHRvIGV4dHJhY3QgZ3JpZCBkYXRhIAotJXsKLSAgICBkb3VibGUgIEdyaWQyZF9nZXQoR3JpZDJkICpnLCBpbnQgaSwgaW50IGopIHsKLSAgICAgIHJldHVybiBnLSZndDtkYXRhW2ldW2pdOwotICAgIH0KLSAgICB2b2lkICAgIEdyaWQyZF9zZXQoR3JpZDJkICpnLCBpbnQgaSwgaW50IGosIGRvdWJsZSB2YWwpIHsKLSAgICAgIGctJmd0O2RhdGFbaV1bal0gPSB2YWw7Ci0gICAgfQotJX0KLQotLy8gTm93IGFkZCB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGFzIG1ldGhvZHMgb2YgR3JpZDJkCi0KLSVhZGRtZXRob2RzIEdyaWQyZCB7Ci0gICAgZG91YmxlIGdldChpbnQgaSwgaW50IGopOyAgICAgICAgICAgICAgLy8gR2V0cyBleHBhbmRlZCB0byBHcmlkMmRfZ2V0KCkKLSAgICB2b2lkICAgc2V0KGludCBpLCBpbnQgaiwgZG91YmxlIHZhbCk7ICAvLyBHZXRzIGV4cGFuZGVkIHRvIEdyaWQyZF9zZXQoKQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlIHRlbGxzIFNXSUcgdGhhdCB5b3Ugd2FudCB0byBhZGQgbmV3IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZyBDKysgY2xhc3Mgb3IgQyBzdHJ1Y3R1cmUgZm9yIHRoZSBwdXJwb3NlcyBvZiBidWlsZGluZyBhbiBpbnRlcmZhY2UuICAgSW4gcmVhbGl0eSwgU1dJRyBsZWF2ZXMgdGhlIG9yaWdpbmFsIEMrKyBjbGFzcyB1bmNoYW5nZWQsIGJ1dCB0aGUgcmVzdWx0aW5nIFB5dGhvbiBpbnRlcmZhY2Ugd2lsbCBoYXZlIHNvbWUgbmV3IGZ1bmN0aW9ucyB0aGF0IGFwcGVhciB0byBiZSBjbGFzcyBtZW1iZXJzLjxwPgotPHA+Ci1TV0lHIHVzZXMgYSBuYW1pbmcgY29udmVudGlvbiBmb3IgYWRkaW5nIG1ldGhvZHMgdG8gYSBjbGFzcy4gIElmIHlvdSBoYXZlIGEgY2xhc3MgPHR0PkZvbzwvdHQ+IGFuZCB5b3UgYWRkIGEgbWVtYmVyIGZ1bmN0aW9uIDx0dD5iYXIoYXJncyksPC90dD4gU1dJRyB3aWxsIGxvb2sgZm9yIGEgZnVuY3Rpb24gY2FsbGVkIDx0dD5Gb29fYmFyKHRoaXMsYXJncyk8L3R0PiB0aGF0IGltcGxlbWVudHMgdGhlIGRlc2lyZWQgZnVuY3Rpb25hbGl0eS4gICBZb3UgY2FuIHdyaXRlIHRoaXMgZnVuY3Rpb24geW91cnNlbGYsIGFzIGluIHRoZSBwcmV2aW91cyBpbnRlcmZhY2UgZmlsZSwgYnV0IHlvdSBjYW4gYWxzbyBqdXN0IHN1cHBseSB0aGUgY29kZSBpbW1lZGlhdGVseSBhZnRlciBhIGRlY2xhcmF0aW9uIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBwZGUKLSV7Ci0jaW5jbHVkZSAicGRlLmgiCi0lfQotJWluY2x1ZGUgcGRlLmgKLQotLy8gQWRkIHNvbWUgbmV3IGFjY2Vzc29yIG1ldGhvZHMgdG8gdGhlIEdyaWQyRCBjbGFzcwotJWFkZG1ldGhvZHMgR3JpZDJkIHsKLSAgZG91YmxlIGdldChpbnQgaSwgaW50IGopIHsKLSAgICByZXR1cm4gc2VsZi0mZ3Q7ZGF0YVtpXVtqXTsKLSAgfTsKLSAgdm9pZCBzZXQoaW50IGksIGludCBqLCBkb3VibGUgdmFsKSB7Ci0gICAgc2VsZi0mZ3Q7ZGF0YVtpXVtqXSA9IHZhbDsKLSAgfTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhpcyBjYXNlLCBTV0lHIHdpbGwgdGFrZSB0aGUgc3VwcGxpZWQgY29kZSwgYW5kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBmdW5jdGlvbiBmb3IgdGhlIG1ldGhvZC4gIFRoZSBzcGVjaWFsIHZhcmlhYmxlICI8dHQ+c2VsZjwvdHQ+IiBpcyB1c2VkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdC4gIFRoZSA8dHQ+c2VsZiA8L3R0PnBvaW50ZXIgaXMgZXhhY3RseSBsaWtlIHRoZSBDKysgIjx0dD50aGlzPC90dD4iIHBvaW50ZXIsIGV4Y2VwdCB0aGF0IHRoZSBuYW1lIGhhcyBiZWVuIGNoYW5nZWQgaW4gb3JkZXIgdG8gcmVtaW5kIHlvdSB0aGF0IHlvdSBhcmVuJ3QgcmVhbGx5IHdyaXRpbmcgYSByZWFsIGNsYXNzIG1lbWJlciBmdW5jdGlvbi4gIChBY3R1YWxseSwgdGhlIHJlYWwgcmVhc29uIHdlIGNhbid0IHVzZSAidGhpcyIgaXMgYmVjYXVzZSB0aGUgQysrIGNvbXBpbGVyIHdpbGwgc3RhcnQgY29tcGxhaW5pbmchKTxwPgotPHA+Ci0gRmluYWxseSwgaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBtYXkgYWxzbyBiZSB1c2VkIGluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdHJ1Y3QgR3JpZDJkIHsKLSAgR3JpZDJkKGludCBuaSwgaW50IG5qKTsKLSAgfkdyaWQyZCgpOwotICBkb3VibGUgKipkYXRhOwotICBpbnQgICAgICB4cG9pbnRzOwotICBpbnQgICAgICB5cG9pbnRzOwotICAlYWRkbWV0aG9kcyB7Ci0JZG91YmxlIGdldChpbnQgaSwgaW50IGopOwotCXZvaWQgICBzZXQoaW50IGksIGludCBqLCBkb3VibGUgdmFsdWUpOwotICB9Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGxhdHRlciBjYXNlIGlzIHJlYWxseSBvbmx5IHVzZWZ1bCBpZiB0aGUgQysrIGNsYXNzIGRlZmluaXRpb24gaXMgaW5jbHVkZWQgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgaXRzZWxmLiAgIElmIHlvdSBhcmUgcHVsbGluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvdXQgb2YgYSBzZXBhcmF0ZSBmaWxlIG9yIGEgQysrIGhlYWRlciBmaWxlLCB1c2luZyBhIHNlcGFyYXRlIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBpcyBwcmVmZXJhYmxlLiAgSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBhcHBlYXJzIGJlZm9yZSBvciBhZnRlciB0aGUgcmVhbCBjbGFzcyBkZWZpbml0aW9uLS1TV0lHIHdpbGwgY29ycmVjdGx5IGFzc29jaWF0ZSB0aGUgdHdvIGRlZmluaXRpb25zLjxwPgotPHA+Ci1Pa2F5LCBlbm91Z2ggdGFsay4gIEJ5IGFkZGluZyB0aGUgc2V0L2dldCBmdW5jdGlvbnMgYXMgbWV0aG9kcywgd2UgY2FuIG5vdyBjaGFuZ2Ugb3VyIFB5dGhvbiBzY3JpcHQgdG8gbG9vayBsaWtlIHRoaXMgKGNoYW5nZXMgYXJlIHVuZGVybGluZWQpIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEFuIGV4YW1wbGUgdXNpbmcgb3VyIG5ldyBzZXQvZ2V0IGZ1bmN0aW9ucwotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotCi1kZWYgaW5pdGNvbmQoaCk6Ci0JaC5zZXRfdGVtcCgwLjApCi0JbnggPSBoLmdyaWQueHBvaW50cwotCWZvciBpIGluIHJhbmdlKDAsbngpOgotCQloLmdyaWQuc2V0KGksMCwxLjApICAgICAgICAgIyBOb3RlIGNoYW5nZWQgaW50ZXJmYWNlCi0KLSMgRHVtcCBvdXQgdG8gYSBmaWxlCi1kZWYgZHVtcChoLGZpbGVuYW1lKToKLQlmID0gb3BlbihmaWxlbmFtZSwidyIpCi0JbnggPSBoLmdyaWQueHBvaW50cwotCW55ID0gaC5ncmlkLnlwb2ludHMKLQlmb3IgaSBpbiByYW5nZSgwLG54KToKLQkJZm9yIGogaW4gcmFuZ2UoMCxueSk6Ci0JCQlmLndyaXRlKHN0cihoLmdyaWQuZ2V0KGksaikpKyJcbiIpCi0JZi5jbG9zZSgpCi0KLSMgU2V0IHVwIGEgcHJvYmxlbSBhbmQgcnVuIGl0Ci0KLWggPSBIZWF0MmQoNTAsNTApCi1pbml0Y29uZChoKQotZmlsZW5vID0gMQotCi1mb3IgaSBpbiByYW5nZSgwLDI1KToKLQloLnNvbHZlKDEwMCkKLQloLmR1bXAoIkRhdCIrc3RyKGZpbGVubykpCi0JcHJpbnQgInRpbWUgPSAiLCBoLnRpbWUKLQlmaWxlbm8gPSBmaWxlbm8rMQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU5vdyBpdCdzIHN0YXJ0aW5nIHRvIGxvb2sgYSBsaXR0bGUgYmV0dGVyLCBidXQgd2UgY2FuIGRvIGV2ZW4gYmV0dGVyLi4uPHA+Ci08YSBuYW1lPSJuNDAiPjwvYT48aDM+IEltcGxlbWVudGluZyBzcGVjaWFsIFB5dGhvbiBtZXRob2RzIGluIEM8L2gzPgotTm93IHRoYXQgeW91J3JlIGdldHRpbmcgaW50byB0aGUgc3Bpcml0IG9mIHRoaW5ncywgbGV0J3MgbWFrZSBpdCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3Mgb3VyIDx0dD5HcmlkMkQ8L3R0PiBkYXRhIGxpa2UgYSBQeXRob24gYXJyYXkuICBBcyBpdCB0dXJucyBvdXQsIHdlIGNhbiBkbyB0aGlzIHdpdGggYSBsaXR0bGUgdHJpY2tlcnkgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUuICBEb24ndCBmb3JnZXQgdG8gcHV0IG9uIHlvdXIgUHl0aG9uIHdpemFyZCBjYXAuLi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBTV0lHIGludGVyZmFjZSBmaWxlIHdpdGggUHl0aG9uIGFycmF5IG1ldGhvZHMgYWRkZWQKLSVtb2R1bGUgcGRlCi0lewotI2luY2x1ZGUgInBkZS5oIgotJX0KLQotJWluY2x1ZGUgcGRlLmgKLQotJWlubGluZSAlewotICAvLyBEZWZpbmUgYSBuZXcgR3JpZDJkIHJvdyBjbGFzcyAKLSAgc3RydWN0IEdyaWQyZFJvdyB7Ci0gICAgR3JpZDJkICpnOyAgICAgICAvLyBHcmlkCi0gICAgaW50ICAgIHJvdzsgICAgICAvLyBSb3cgbnVtYmVyCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IFB5dGhvbiB0byBhY2Nlc3Mgc2VxdWVuY2UgdHlwZXMgKGxpc3RzLCB0dXBsZXMsIC4uLikKLSAgICBkb3VibGUgX19nZXRpdGVtX18oaW50IGkpIHsKLSAgICAgIHJldHVybiBnLSZndDtkYXRhW3Jvd11baV07Ci0gICAgfTsKLSAgICB2b2lkIF9fc2V0aXRlbV9fKGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICBnLSZndDtkYXRhW3Jvd11baV0gPSB2YWw7Ci0gICAgfTsKLSAgfTsKLSV9Ci0KLS8vIE5vdyBhZGQgYSBfX2dldGl0ZW1fXyBtZXRob2QgdG8gR3JpZDJEIHRvIHJldHVybiBhIHJvdwotJWFkZG1ldGhvZHMgR3JpZDJkIHsKLSAgR3JpZDJkUm93IF9fZ2V0aXRlbV9fKGludCBpKSB7Ci0gICAgR3JpZDJkUm93IHI7Ci0gICAgci5nID0gc2VsZjsKLSAgICByLnJvdyA9IGk7Ci0gICAgcmV0dXJuIHI7Ci0gIH07Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XZSBoYXZlIG5vdyByZXBsYWNlZCBvdXIgZ2V0L3NldCBmdW5jdGlvbnMgd2l0aDx0dD4gdGhlIF9fZ2V0aXRlbV9fPC90dD4gYW5kIDx0dD5fX3NldGl0ZW1fXzwvdHQ+IGZ1bmN0aW9ucyB0aGF0IFB5dGhvbiBuZWVkcyB0byBhY2Nlc3MgYXJyYXlzLiAgV2UgaGF2ZSBhbHNvIGFkZGVkIGEgc3BlY2lhbCA8dHQ+R3JpZDJkUm93PC90dD4gY2xhc3MuICBUaGlzIGlzIG5lZWRlZCB0byBhbGxvdyB1cyB0byBtYWtlIGEgZnVubnkga2luZCBvZiAibXVsdGlkaW1lbnNpb25hbCIgYXJyYXkgaW4gUHl0aG9uICh0aGlzIG1heSB0YWtlIGEgZmV3IG1pbnV0ZXMgb2YgdGhvdWdodCB0byBmaWd1cmUgb3V0KS4gVXNpbmcgdGhpcyBuZXcgaW50ZXJmYWNlIGZpbGUsIHdlIGNhbiBub3cgd3JpdGUgYSBQeXRob24gc2NyaXB0IGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBBbiBleGFtcGxlIHNjcmlwdCB1c2luZyBvdXIgYXJyYXkgYWNjZXNzIGZ1bmN0aW9ucwotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotCi1kZWYgaW5pdGNvbmQoaCk6Ci0JaC5zZXRfdGVtcCgwLjApCi0JbnggPSBoLmdyaWQueHBvaW50cwotCWZvciBpIGluIHJhbmdlKDAsbngpOgotCQloLmdyaWRbaV1bMF0gPSAxLjAgICAgICAgICAgICAjIE5vdGUgbmljZSBhcnJheSBhY2Nlc3MKLQotIyBTZXQgdXAgYSBwcm9ibGVtIGFuZCBydW4gaXQKLQotaCA9IEhlYXQyZCg1MCw1MCkKLWluaXRjb25kKGgpCi1maWxlbm8gPSAxCi0KLWZvciBpIGluIHJhbmdlKDAsMjUpOgotCWguc29sdmUoMTAwKQotCWguZHVtcCgiRGF0IitzdHIoZmlsZW5vKSkKLQlwcmludCAidGltZSA9ICIsIGgudGltZQotCWZpbGVubyA9IGZpbGVubysxCi0KLSMgQ2FsY3VsYXRlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgb3ZlciB0aGUgcmVnaW9uCi0KLXN1bSA9IDAuMAotZm9yIGkgaW4gcmFuZ2UoMCxoLmdyaWQueHBvaW50cyk6Ci0JZm9yIGogaW4gcmFuZ2UoMCxoLmdyaWQueXBvaW50cyk6Ci0JCXN1bSA9IHN1bSArIGguZ3JpZFtpXVtqXSAgICAgICAgIyBOb3RlIG5pY2UgYXJyYXkgYWNjZXNzCi0KLWF2ZyA9IHN1bS8oaC5ncmlkLnhwb2ludHMqaC5ncmlkLnlwb2ludHMpCi0KLXByaW50ICJBdmcgdGVtcGVyYXR1cmUgPSAiLGF2ZwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQxIj48L2E+PGgzPiBTdW1tYXJ5IChzbyBmYXIpPC9oMz4KLUluIG91ciBmaXJzdCBleGFtcGxlLCB3ZSBoYXZlIHRha2VuIGEgdmVyeSBzaW1wbGUgQysrIHByb2JsZW0gYW5kIHdyYXBwZWQgaXQgaW50byBhIFB5dGhvbiBtb2R1bGUuICBXaXRoIGEgbGl0dGxlIGV4dHJhIHdvcmssIHdlIGhhdmUgYmVlbiBhYmxlIHRvIHByb3ZpZGUgYXJyYXkgdHlwZSBhY2Nlc3MgdG8gb3VyIEMrKyBkYXRhIGZyb20gUHl0aG9uIGFuZCB0byB3cml0ZSBzb21lIGNvbXB1dGF0aW9uYWxseSBpbnRlbnNpdmUgb3BlcmF0aW9ucyBpbiBDKysuICAgIEF0IHRoaXMgcG9pbnQsIGl0IHdvdWxkIGVhc3kgdG8gd3JpdGUgYWxsIHNvcnRzIG9mIFB5dGhvbiBzY3JpcHRzIHRvIHNldCB1cCBwcm9ibGVtcywgcnVuIHNpbXVsYXRpb25zLCBsb29rIGF0IHRoZSBkYXRhLCBhbmQgdG8gZGVidWcgbmV3IG9wZXJhdGlvbnMgaW1wbGVtZW50ZWQgaW4gQysrLiAgIDxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IFdyYXBwaW5nIGEgQyBsaWJyYXJ5PC9oMj4KLUluIHRoaXMgbmV4dCBleGFtcGxlLCB3ZSBmb2N1cyBvbiB3cmFwcGluZyB0aGUgZ2QtMS4yIGxpYnJhcnkuICBnZCBpcyBwdWJsaWMgZG9tYWluIGxpYnJhcnkgZm9yIGZhc3QgR0lGIGltYWdlIGNyZWF0aW9uIHdyaXR0ZW4gYnkgVGhvbWFzIEJvdXRlbGwgYW5kIGF2YWlsYWJsZSBvbiB0aGUgaW50ZXJuZXQuICAgZ2QtMS4yIGlzIGNvcHlyaWdodCAxOTk0LDE5OTUsIFF1ZXN0IFByb3RlaW4gRGF0YWJhc2UgQ2VudGVyLCBDb2xkIFNwcmluZyBIYXJib3IgTGFicy4gIFRoaXMgZXhhbXBsZSBhc3N1bWVzIHRoYXQgeW91IGhhdmUgZ2QtMS4yIGF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gdXNlIHRoZSBpZGVhcyBoZXJlIHRvIHdyYXAgb3RoZXIga2luZHMgb2YgQyBsaWJyYXJpZXMuPHA+Ci08YSBuYW1lPSJuNDIiPjwvYT48aDM+IFByZXBhcmluZyBhIG1vZHVsZTwvaDM+Ci1XcmFwcGluZyBhIEMgbGlicmFyeSBpbnRvIGEgUHl0aG9uIG1vZHVsZSB1c3VhbGx5IGludm9sdmVzIHdvcmtpbmcgd2l0aCB0aGUgQyBoZWFkZXIgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBsaWJyYXJ5LiAgSW4gc29tZSBjYXNlcywgYSBoZWFkZXIgZmlsZSBjYW4gYmUgdXNlZCBkaXJlY3RseSAod2l0aG91dCBtb2RpZmljYXRpb24pIHdpdGggU1dJRy4gIE90aGVyIHRpbWVzLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNvcHkgdGhlIGhlYWRlciBmaWxlIGludG8gYSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCBtYWtlIGEgZmV3IHRvdWNoLXVwcyBhbmQgbW9kaWZpY2F0aW9ucy4gSW4gZWl0aGVyIGNhc2UsIGl0J3MgdXN1YWxseSBub3QgdG9vIGRpZmZpY3VsdC48cD4KLTxwPgotVG8gbWFrZSBhIG1vZHVsZSwgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjaGVja2xpc3QgOjxwPgotPHA+Ci08dWw+Ci08bGk+TG9jYXRlIHRoZSBoZWFkZXIgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2FnZQotPGxpPkxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBoZWFkZXIgZmlsZXMgdG8gc2VlIGlmIFNXSUcgY2FuIGhhbmRsZSB0aGVtLiAgSW4gcGFydGljdWxhciwgU1dJRyBjYW4gbm90IGhhbmRsZSBleGNlc3NpdmUgdXNlIG9mIEMgcHJlcHJvY2Vzc29yIG1hY3Jvcywgb3Igbm9uLUFOU0kgQyBzeW50YXguIFRoZSBiZXN0IHdheSB0byBpZGVudGlmeSBwcm9ibGVtcyBpcyB0byBzaW1wbHkgcnVuIFNXSUcgb24gdGhlIGZpbGUgYW5kIHNlZSB3aGF0IGVycm9ycyAoaWYgYW55KSBnZXQgcmVwb3J0ZWQuCi08bGk+TWFrZSBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgZm9yIHlvdXIgbW9kdWxlIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgdGhlIGFwcHJvcHJpYXRlIGhlYWRlciBmaWxlcywgYW5kIGFueSBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdCB5b3Ugd291bGQgbGlrZSB0byBwcm92aWRlLgotPGxpPklmIHRoZSBoZWFkZXIgZmlsZSBpcyBjbGVhbiwgc2ltcGx5IHVzZSBTV0lHJ3MgPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlLiAgSWYgbm90LCBwYXN0ZSB0aGUgaGVhZGVyIGZpbGUgaW50byB5b3VyIGludGVyZmFjZSBmaWxlIGFuZCBlZGl0IGl0IHVudGlsIFNXSUcgY2FuIGhhbmRsZSBpdC4KLTxsaT5DbGVhbiB1cCB0aGUgaW50ZXJmYWNlIGJ5IHBvc3NpYmx5IGFkZGluZyBzdXBwb3J0aW5nIGNvZGUsIGRlbGV0aW5nIHVubmVjZXNzYXJ5IGZ1bmN0aW9ucywgYW5kIGVsaW1pbmF0aW5nIGNsdXR0ZXIuCi08bGk+UnVuIFNXSUcgYW5kIGNvbXBpbGUuCi08L3VsPgotPHA+Ci1JbiB0aGUgY2FzZSBvZiB0aGUgZ2QgbGlicmFyeSwgd2UgY2FuIHNpbXBseSB1c2UgdGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotCi0lc2VjdGlvbiAiZ2QtMS4yIixpZ25vcmUKLSVpbmNsdWRlICJnZC5oIgotCi0vLyBUaGVzZSB3aWxsIGNvbWUgaW4gaGFuZHkgbGF0ZXIKLUZJTEUgKmZvcGVuKGNoYXIgKiwgY2hhciAqKTsKLXZvaWQgZmNsb3NlKEZJTEUgKmYpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoaXMgZmlsZSwgd2UgZmlyc3QgdGVsbCBTV0lHIHRvIHB1dCBhbGwgb2YgdGhlIGdkIGZ1bmN0aW9ucyBpbiBhIHNlcGFyYXRlIGRvY3VtZW50YXRpb24gc2VjdGlvbiBhbmQgdG8gaWdub3JlIGFsbCBjb21tZW50cy4gICBUaGlzIHVzdWFsbHkgaGVscHMgY2xlYW4gdXAgdGhlIGRvY3VtZW50YXRpb24gd2hlbiB3b3JraW5nIHdpdGggcmF3IGhlYWRlciBmaWxlcy4gICBOZXh0LCB3ZSBzaW1wbHkgaW5jbHVkZSB0aGUgY29udGVudHMgb2YgImdkLmgiIGRpcmVjdGx5LiAgIEZpbmFsbHksIHdlIHByb3ZpZGUgd3JhcHBlcnMgdG8gPHR0PmZvcGVuKCk8L3R0PiBhbmQgPHR0PmZjbG9zZSgpPC90dD4gc2luY2UgdGhlc2Ugd2lsbCBjb21lIGluIGhhbmR5IGluIG91ciBQeXRob24gaW50ZXJmYWNlLjxwPgotPHA+Ci1JZiB3ZSBnaXZlIHRoaXMgaW50ZXJmYWNlIGZpbGUgdG8gU1dJRywgd2Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIC1zaGFkb3cgIC1JL3Vzci9sb2NhbC9pbmNsdWRlIGdkLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFB5dGhvbgotL3Vzci9sb2NhbC9pbmNsdWRlL2dkLmggOiBMaW5lIDMyLiAgQXJyYXlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChpZ25vcmVkKS4KLS91c3IvbG9jYWwvaW5jbHVkZS9nZC5oIDogTGluZSAzMy4gIEFycmF5cyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAoaWdub3JlZCkuCi0vdXNyL2xvY2FsL2luY2x1ZGUvZ2QuaCA6IExpbmUgMzQuICBBcnJheXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKGlnbm9yZWQpLgotL3Vzci9sb2NhbC9pbmNsdWRlL2dkLmggOiBMaW5lIDM1LiAgQXJyYXlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChpZ25vcmVkKS4KLS91c3IvbG9jYWwvaW5jbHVkZS9nZC5oIDogTGluZSA0MS4gIEFycmF5cyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAoaWdub3JlZCkuCi0vdXNyL2xvY2FsL2luY2x1ZGUvZ2QuaCA6IExpbmUgNDIuICBBcnJheXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKGlnbm9yZWQpLgotJQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSBTV0lHIHdhcyBhYmxlIHRvIGhhbmRsZSBtb3N0IG9mIHRoZSBoZWFkZXIgZmlsZSwgaXQgYWxzbyByYW4gaW50byBhIGZldyB1bnN1cHBvcnRlZCBkZWNsYXJhdGlvbnMtLS1pbiB0aGlzIGNhc2UsIGEgZmV3IGRhdGEgc3RydWN0dXJlcyB3aXRoIGFycmF5IG1lbWJlcnMuICBIb3dldmVyLCB0aGUgd2FybmluZyBtZXNzYWdlcyBhbHNvIHRlbGwgdXMgdGhhdCB0aGVzZSBkZWNsYXJhdGlvbnMgaGF2ZSBzaW1wbHkgYmVlbiBpZ25vcmVkLiAgIFRodXMsIHdlIGNhbiBjaG9vc2UgdG8gY29udGludWUgYW5kIGJ1aWxkIG91ciBpbnRlcmZhY2UgYW55d2F5cy4gIEFzIGl0IHR1cm5zIG91dCBpbiB0aGlzIGNhc2UsIHRoZSBpZ25vcmVkIGRlY2xhcmF0aW9ucyBhcmUgb2YgbGl0dGxlIG9yIG5vIGNvbnNlcXVlbmNlIHNvIHdlIGNhbiBpZ25vcmUgdGhlIHdhcm5pbmdzLjxwPgotPHA+Ci1JZiBTV0lHIGlzIHVuYWJsZSB0byBwcm9jZXNzIGEgcmF3IGhlYWRlciBmaWxlIG9yIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGVsaW1pbmF0ZSB0aGUgd2FybmluZyBtZXNzYWdlcywgeW91IGNhbiBzdHJ1Y3R1cmUgeW91ciBpbnRlcmZhY2UgZmlsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotCi0lc2VjdGlvbiAiZ2QtMS4yIixpZ25vcmUKLQotLi4uIHBhc3RlIHRoZSBjb250ZW50cyBvZiBnZC5oIGhlcmUgYW5kIHJlbW92ZSBwcm9ibGVtcyAuLi4KLQotLy8gQSBmZXcgZXh0cmEgc3VwcG9ydCBmdW5jdGlvbnMKLQotRklMRSAqZm9wZW4oY2hhciAqLCBjaGFyICopOwotdm9pZCBmY2xvc2UoRklMRSAqZik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgbGF0dGVyIG9wdGlvbiByZXF1aXJlcyBhIGxpdHRsZSBtb3JlIHdvcmsgKHNpbmNlIHlvdSBuZWVkIHRvIHBhc3RlIHRoZSBjb250ZW50cyBvZiBnZC5oIGludG8gdGhlIGZpbGUgYW5kIGVkaXQgaXQpLCBidXQgaXMgb3RoZXJ3aXNlIG5vdCBtdWNoIG1vcmUgZGlmZmljdWx0IHRvIGRvLiAgIEZvciBoaWdobHkgY29tcGxleCBDIGxpYnJhcmllcyBvciBoZWFkZXIgZmlsZXMgdGhhdCBnbyBvdmVyYm9hcmQgd2l0aCB0aGUgQyBwcmVwcm9jZXNzb3IsIHlvdSBtYXkgbmVlZCB0byBkbyB0aGlzIG1vcmUgb2Z0ZW4uICA8cD4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gVXNpbmcgdGhlIGdkIG1vZHVsZTwvaDM+Ci1Ob3csIHRoYXQgd2UgaGF2ZSBjcmVhdGVkIGEgbW9kdWxlIGZyb20gdGhlIGdkIGxpYnJhcnksIHdlIGNhbiB1c2UgaXQgaW4gUHl0aG9uIHNjcmlwdHMuICBUaGUgZm9sbG93aW5nIHNjcmlwdCBtYWtlcyBhIHNpbXBsZSBpbWFnZSBvZiBhIGJsYWNrIGJhY2tncm91bmQgd2l0aCBhIHdoaXRlIGxpbmUgZHJhd24gb24gaXQuICBOb3RpY2UgaG93IHdlIGhhdmUgdXNlZCBvdXIgd3JhcHBlZCB2ZXJzaW9ucyBvZiA8dHQ+Zm9wZW4oKTwvdHQ+IGFuZCA8dHQ+ZmNsb3NlKCk8L3R0PiB0byBjcmVhdGUgYSBGSUxFIGhhbmRsZSBmb3IgdXNlIGluIHRoZSBnZCBsaWJyYXJ5ICh0aGVyZSBhcmUgYWxzbyB3YXlzIHRvIHVzZSBQeXRob24gZmlsZSBvYmplY3RzLCBidXQgdGhpcyBpcyBkZXNjcmliZWQgbGF0ZXIpLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgU2ltcGxlIGdkIHByb2dyYW0KLQotZnJvbSBnZCBpbXBvcnQgKgotCi1pbSA9IGdkSW1hZ2VDcmVhdGUoNjQsNjQpCi1ibGFjayA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKGltLDAsMCwwKQotd2hpdGUgPSBnZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwyNTUsMjU1LDI1NSkKLWdkSW1hZ2VMaW5lKGltLDAsMCw2Myw2Myx3aGl0ZSkKLW91dCA9IGZvcGVuKCJ0ZXN0LmdpZiIsInciKQotZ2RJbWFnZUdpZihpbSxvdXQpCi1mY2xvc2Uob3V0KQotZ2RJbWFnZURlc3Ryb3koaW0pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhhdCB3YXMgc2ltcGxlIGVub3VnaC0tYW5kIGl0IG9ubHkgcmVxdWlyZWQgYWJvdXQgNSBtaW51dGVzIG9mIHdvcmsuICBVbmZvcnR1bmF0ZWx5LCBvdXIgZ2QgbW9kdWxlIHN0aWxsIGhhcyBhIGZldyBwcm9ibGVtcy4uLjxwPgotPGEgbmFtZT0ibjQ0Ij48L2E+PGgzPiBFeHRlbmRpbmcgYW5kIGZpeGluZyB0aGUgZ2QgbW9kdWxlPC9oMz4KLVdoaWxlIG91ciBmaXJzdCBhdHRlbXB0IGF0IHdyYXBwaW5nIGdkIHdvcmtzIGZvciBzaW1wbGUgZnVuY3Rpb25zLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcHJvYmxlbXMuICAgRm9yIGV4YW1wbGUsIHRoZSBnZC0xLjIgbGlicmFyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGZvciBkcmF3aW5nIHBvbHlnb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGdkSW1hZ2VQb2x5Z29uKGdkSW1hZ2VQdHIgaW0sIGdkUG9pbnRQdHIgcG9pbnRzLCBpbnQgcG9pbnRzVG90YWwsIGludCBjb2xvcik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+Z2RJbWFnZVB0cjwvdHQ+IHR5cGUgaXMgY3JlYXRlZCBieSBhbm90aGVyIGZ1bmN0aW9uIGluIG91ciBtb2R1bGUgYW5kIHRoZSBwYXJhbWV0ZXJzIDx0dD5wb2ludHNUb3RhbDwvdHQ+IGFuZCA8dHQ+Y29sb3I8L3R0PiBhcmUgc2ltcGxlIGludGVnZXJzLiAgSG93ZXZlciwgdGhlIDJuZCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRzIGFzIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgZ2QtMS4yIGhlYWRlciBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT50eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHgsIHk7Ci19IGdkUG9pbnQsICpnZFBvaW50UHRyOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1VbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8gY3JlYXRlIGEgZ2RQb2ludCBpbiBQeXRob24gYW5kIGNvbnNlcXVlbnRseSBubyB3YXkgdG8gY2FsbCB0aGUgZ2RJbWFnZVBvbHlnb24gZnVuY3Rpb24uICAgQSB0ZW1wb3Jhcnkgc2V0YmFjaywgYnV0IG9uZSB0aGF0IGlzIG5vdCBkaWZmaWN1bHQgdG8gc29sdmUgdXNpbmcgdGhlICA8dHQ+JWFkZG1ldGhvZHM8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBnZAotJXsKLSNpbmNsdWRlICJnZC5oIgotJX0KLQotJWluY2x1ZGUgImdkLmgiCi0KLS8vIEZpeCB1cCB0aGUgZ2RQb2ludCBzdHJ1Y3R1cmUgYSBsaXR0bGUgYml0Ci0lYWRkbWV0aG9kcyBnZFBvaW50IHsKLSAgLy8gQ29uc3RydWN0b3IgdG8gbWFrZSBhbiBhcnJheSBvZiAiUG9pbnRzIgotICBnZFBvaW50KGludCBucG9pbnRzKSB7Ci0gICAgcmV0dXJuIChnZFBvaW50ICopIG1hbGxvYyhucG9pbnRzKnNpemVvZihnZFBvaW50KSk7Ci0gIH07Ci0gIC8vIERlc3RydWN0b3IgdG8gZGVzdHJveSB0aGlzIGFycmF5Ci0gIH5nZFBvaW50KCkgewotICAgIGZyZWUoc2VsZik7Ci0gIH07Ci0gIC8vIFB5dGhvbiBtZXRob2QgZm9yIGFycmF5IGFjY2VzcwotICBnZFBvaW50ICpfX2dldGl0ZW1fXyhpbnQgaSkgewotICAgIHJldHVybiBzZWxmK2k7Ci0gIH07Ci19OwotCi1GSUxFICpmb3BlbihjaGFyICosIGNoYXIgKik7Ci12b2lkIGZjbG9zZShGSUxFICpmKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2l0aCB0aGVzZSBzaW1wbGUgYWRkaXRpb25zLCB3ZSBjYW4gbm93IGNyZWF0ZSBhcnJheXMgb2YgcG9pbnRzIGFuZCB1c2UgdGhlIHBvbHlnb24gZnVuY3Rpb24gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBTaW1wbGUgZ2QgcHJvZ3JhbQotCi1mcm9tIGdkIGltcG9ydCAqCi0KLWltID0gZ2RJbWFnZUNyZWF0ZSg2NCw2NCkKLWJsYWNrID0gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMCwwLDApCi13aGl0ZSA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKGltLDI1NSwyNTUsMjU1KQotCi1wdHMgPSBnZFBvaW50KDMpOyAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBhbiBhcnJheSBvZiBQb2ludHMKLXB0c1swXS54LHB0c1swXS55ID0gKDUsNSkgICAgICAgICAgICMgQXNzaWduIGEgc2V0IG9mIHBvaW50cwotcHRzWzFdLngscHRzWzFdLnkgPSAoNjAsMjUpCi1wdHNbMl0ueCxwdHNbMl0ueSA9ICgxNiw2MCkKLQotZ2RJbWFnZVBvbHlnb24oaW0scHRzLDMsd2hpdGUpICAgICAgIyBEcmF3IGEgcG9seWdvbiBmcm9tIG91ciBhcnJheSBvZiBwb2ludHMKLW91dCA9IGZvcGVuKCJ0ZXN0LmdpZiIsInciKQotZ2RJbWFnZUdpZihpbSxvdXQpCi1mY2xvc2Uob3V0KQotZ2RJbWFnZURlc3Ryb3koaW0pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40NSI+PC9hPjxoMz4gQnVpbGRpbmcgYSBzaW1wbGUgMkQgaW1hZ2luZyBjbGFzczwvaDM+Ci1Ob3cgaXQncyB0aW1lIHRvIGdldCBkb3duIHRvIGJ1c2luZXNzLiAgVXNpbmcgb3VyIGdkLTEuMiBtb2R1bGUsIHdlIGNhbiB3cml0ZSBhIHNpbXBsZSAyRCBpbWFnaW5nIGNsYXNzIHRoYXQgaGlkZXMgYWxvdCBvZiB0aGUgdW5kZXJseWluZyBkZXRhaWxzIGFuZCBwcm92aWRlcyBzY2FsaW5nLCB0cmFuc2xhdGlvbnMsIGFuZCBhIGhvc3Qgb2Ygb3RoZXIgb3BlcmF0aW9ucy4gIChJdCdzIGEgZmFpciBhbW91bnQgY29kZSwgYnV0IGFuIGludGVyZXN0aW5nIGV4YW1wbGUgb2YgaG93IG9uZSBjYW4gdGFrZSBhIHNpbXBsZSBDIGxpYnJhcnkgYW5kIHR1cm4gaXQgaW50byBzb21ldGhpbmcgdGhhdCBsb29rcyBjb21wbGV0ZWx5IGRpZmZlcmVudCkuPHA+Ci08cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGltYWdlLnB5Ci0jIEdlbmVyaWMgMkQgSW1hZ2UgQ2xhc3MKLSMKLSMgQnVpbHQgdXNpbmcgdGhlICdnZC0xLjInIGxpYnJhcnkgYnkgVGhvbWFzIEJvdXRlbGwKLSMKLQotaW1wb3J0IGdkCi0KLWNsYXNzIEltYWdlOgotCWRlZiBfX2luaXRfXyhzZWxmLHdpZHRoLGhlaWdodCx4bWluPTAuMCx5bWluPTAuMCx4bWF4PTEuMCx5bWF4PTEuMCk6Ci0JCXNlbGYuaW0gPSBnZC5nZEltYWdlQ3JlYXRlKHdpZHRoLGhlaWdodCkKLQkJc2VsZi54bWluICAgPSB4bWluCi0JCXNlbGYueW1pbiAgID0geW1pbgotCQlzZWxmLnhtYXggICA9IHhtYXgKLQkJc2VsZi55bWF4ICAgPSB5bWF4Ci0JCXNlbGYud2lkdGggID0gd2lkdGgKLQkJc2VsZi5oZWlnaHQgPSBoZWlnaHQKLQkJc2VsZi5keCAgICAgPSAxLjAqKHhtYXgteG1pbikKLQkJc2VsZi5keSAgICAgPSAxLjAqKHltYXgteW1pbikKLQkJc2VsZi54dGljayAgPSBzZWxmLmR4LzEwLjAKLQkJc2VsZi55dGljayAgPSBzZWxmLmR5LzEwLjAKLQkJc2VsZi50aWNrbGVuPSAzCi0JCXNlbGYubmFtZSAgID0gImltYWdlLmdpZiIKLQkJZ2QuZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZi5pbSwwLDAsMCkgICAgICAgICMgQmxhY2sKLQkJZ2QuZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZi5pbSwyNTUsMjU1LDI1NSkgICMgV2hpdGUKLQkJZ2QuZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZi5pbSwyNTUsMCwwKSAgICAgICMgUmVkCi0JCWdkLmdkSW1hZ2VDb2xvckFsbG9jYXRlKHNlbGYuaW0sMCwyNTUsMCkgICAgICAjIEdyZWVuCi0JCWdkLmdkSW1hZ2VDb2xvckFsbG9jYXRlKHNlbGYuaW0sMCwwLDI1NSkgICAgICAjIEJsdWUKLQotCWRlZiBfX2RlbF9fKHNlbGYpOgotCQlwcmludCAiRGVsZXRpbmciCi0JCWdkLmdkSW1hZ2VEZXN0cm95KHNlbGYuaW0pCi0JCi0JIyBEdW1wIG91dCB0aGlzIGltYWdlIHRvIGEgZmlsZQotCWRlZiB3cml0ZShzZWxmLG5hbWU9Ik5PTkUiKToKLQkJaWYgbmFtZSA9PSAiTk9ORSI6Ci0JCQluYW1lID0gc2VsZi5uYW1lCi0JCWYgPSBnZC5mb3BlbihuYW1lLCJ3IikKLQkJZ2QuZ2RJbWFnZUdpZihzZWxmLmltLGYpCi0JCWdkLmZjbG9zZShmKQotCQlzZWxmLm5hbWUgPSBuYW1lCi0JCi0JIyBWaXJ0dWFsIG1ldGhvZCB0aGF0IGRlcml2ZWQgY2xhc3NlcyBkZWZpbmUKLQlkZWYgZHJhdyhzZWxmKToKLQkJcHJpbnQgIk5vIGRyYXdpbmcgbWV0aG9kIHNwZWNpZmllZC4iCi0KLQkjIEEgY29tYmluYXRpb24gb2Ygd3JpdGUgYW5kIGRyYXcKLQlkZWYgc2hvdyhzZWxmLGZpbGVuYW1lPSJOT05FIik6Ci0JCXNlbGYuZHJhdygpCi0JCXNlbGYud3JpdGUoZmlsZW5hbWUpCi0KLQkjIExvYWQgdXAgYSBjb2xvcm1hcCBmcm9tIGEgUHl0aG9uIGFycmF5IG9mIChSLEcsQikgdHVwbGVzCi0JZGVmIGNvbG9ybWFwKHNlbGYsIGNtYXApOgotCQlmb3IgaSBpbiByYW5nZSgwLDI1NSk6Ci0JCQlnZC5nZEltYWdlQ29sb3JEZWFsbG9jYXRlKHNlbGYuaW0saSkKLQkJZm9yIGMgaW4gY21hcDoKLQkJCWdkLmdkSW1hZ2VDb2xvckFsbG9jYXRlKHNlbGYuaW0sY1swXSxjWzFdLGNbMl0pCi0KLQkjIENoYW5nZSB2aWV3aW5nIHJlZ2lvbgotCWRlZiByZWdpb24oc2VsZix4bWluLHltaW4seG1heCx5bWF4KToKLQkJc2VsZi54bWluID0geG1pbgotCQlzZWxmLnltaW4gPSB5bWluCi0JCXNlbGYueG1heCA9IHhtYXgKLQkJc2VsZi55bWF4ID0geW1heAotCQlzZWxmLmR4ICAgICA9IDEuMCooeG1heC14bWluKQotCQlzZWxmLmR5ICAgICA9IDEuMCooeW1heC15bWluKQotCi0JIyBUcmFuc2Zvcm1zIGEgMkQgcG9pbnQgaW50byBzY3JlZW4gY29vcmRpbmF0ZXMKLQlkZWYgdHJhbnNmb3JtKHNlbGYseCx5KToKLQkJbnB0ID0gW10KLQkJaXggPSAoeC1zZWxmLnhtaW4pL3NlbGYuZHgqc2VsZi53aWR0aCArIDAuNQotCQlpeSA9IChzZWxmLnltYXgteSkvc2VsZi5keSpzZWxmLmhlaWdodCArIDAuNQotCQlyZXR1cm4gKGl4LGl5KQotCi0JIyBBIGZldyBncmFwaGljcyBwcmltaXRpdmVzCi0JZGVmIGNsZWFyKHNlbGYsY29sb3IpOgotCQlnZC5nZEltYWdlRmlsbGVkUmVjdGFuZ2xlKHNlbGYuaW0sMCwwLHNlbGYud2lkdGgsc2VsZi5oZWlnaHQsY29sb3IpCi0KLQlkZWYgcGxvdChzZWxmLHgseSxjb2xvcik6Ci0JCWl4LGl5ID0gc2VsZi50cmFuc2Zvcm0oeCx5KQotCQlnZC5nZEltYWdlU2V0UGl4ZWwoc2VsZi5pbSxpeCxpeSxjb2xvcikKLQotCWRlZiBsaW5lKHNlbGYseDEseTEseDIseTIsY29sb3IpOgotCQlpeDEsaXkxID0gc2VsZi50cmFuc2Zvcm0oeDEseTEpCi0JCWl4MixpeTIgPSBzZWxmLnRyYW5zZm9ybSh4Mix5MikKLQkJZ2QuZ2RJbWFnZUxpbmUoc2VsZi5pbSxpeDEsaXkxLGl4MixpeTIsY29sb3IpCi0KLQlkZWYgYm94KHNlbGYseDEseTEseDIseTIsY29sb3IpOgotCQlpeDEsaXkxID0gc2VsZi50cmFuc2Zvcm0oeDEseTEpCi0JCWl4MixpeTIgPSBzZWxmLnRyYW5zZm9ybSh4Mix5MikKLQkJZ2QuZ2RJbWFnZVJlY3RhbmdsZShzZWxmLmltLGl4MSxpeTEsaXgyLGl5Mixjb2xvcikKLQotCWRlZiBzb2xpZGJveChzZWxmLHgxLHkxLHgyLHkyLGNvbG9yKToKLQkJaXgxLGl5MSA9IHNlbGYudHJhbnNmb3JtKHgxLHkxKQotCQlpeDIsaXkyID0gc2VsZi50cmFuc2Zvcm0oeDIseTIpCi0JCWdkLmdkSW1hZ2VGaWxsZWRSZWN0YW5nbGUoc2VsZi5pbSxpeDEsaXkxLGl4MixpeTIsY29sb3IpCi0JCi0JZGVmIGFyYyhzZWxmLGN4LGN5LHcsaCxzLGUsY29sb3IpOgotCQlpeCxpeSA9IHNlbGYudHJhbnNmb3JtKGN4LGN5KQotCQlpdyA9ICh4IC0gc2VsZi54bWluKS9zZWxmLmR4ICogc2VsZi53aWR0aAotCQlpaCA9ICh5IC0gc2VsZi55bWluKS9zZWxmLmR5ICogc2VsZi5oZWlnaHQKLQkJZ2QuZ2RJbWFnZUFyYyhzZWxmLmltLGl4LGl5LGl3LGloLHMsZSxjb2xvcikKLQotCWRlZiBmaWxsKHNlbGYseCx5LGNvbG9yKToKLQkJaXgsaXkgPSBzZWxmLnRyYW5zZm9ybSh4LHkpCi0JCWdkLmdkSW1hZ2VGaWxsKHNlbGYsaXgsaXksY29sb3IpCi0KLQlkZWYgYXhpcyhzZWxmLGNvbG9yKToKLQkJc2VsZi5saW5lKHNlbGYueG1pbiwwLHNlbGYueG1heCwwLGNvbG9yKQotCQlzZWxmLmxpbmUoMCxzZWxmLnltaW4sMCxzZWxmLnltYXgsY29sb3IpCi0JCXggPSAtc2VsZi54dGljayooaW50KC1zZWxmLnhtaW4vc2VsZi54dGljaykrMSkKLQkJd2hpbGUgeCAmbHQ7PSBzZWxmLnhtYXg6Ci0JCSAgICBpeCxpeSA9IHNlbGYudHJhbnNmb3JtKHgsMCkKLQkJICAgIGdkLmdkSW1hZ2VMaW5lKHNlbGYuaW0saXgsaXktc2VsZi50aWNrbGVuLGl4LGl5K3NlbGYudGlja2xlbixjb2xvcikKLQkJICAgIHggPSB4ICsgc2VsZi54dGljawotCQl5ID0gLXNlbGYueXRpY2sqKGludCgtc2VsZi55bWluL3NlbGYueXRpY2spKzEpCi0JCXdoaWxlIHkgJmx0Oz0gc2VsZi55bWF4OgotCQkgICAgaXgsaXkgPSBzZWxmLnRyYW5zZm9ybSgwLHkpCi0JCSAgICBnZC5nZEltYWdlTGluZShzZWxmLmltLGl4LXNlbGYudGlja2xlbixpeSxpeCtzZWxmLnRpY2tsZW4saXksY29sb3IpCi0JCSAgICB5ID0geSArIHNlbGYueXRpY2sKLQotCSMgc2NhbGV4KHMpLiAgU2NhbGVzIHRoZSB4LWF4aXMuICBzIGlzIGdpdmVuIGFzIGEgc2NhbGluZyBmYWN0b3IKLQlkZWYgc2NhbGV4KHNlbGYscyk6Ci0JCXhjID0gc2VsZi54bWluICsgc2VsZi5keC8yLjAKLQkJZHggPSBzZWxmLmR4KnMKLQkJeG1pbiA9IHhjIC0gZHgvMi4wCi0JCXhtYXggPSB4YyArIGR4LzIuMAotCQlzZWxmLnJlZ2lvbih4bWluLHNlbGYueW1pbix4bWF4LHNlbGYueW1heCkKLQotCSMgc2NhbGV5KHMpLiAgU2NhbGVzIHRoZSB5LWF4aXMuICAKLQlkZWYgc2NhbGV5KHNlbGYscyk6Ci0JCXljID0gc2VsZi55bWluICsgc2VsZi5keS8yLjAKLQkJZHkgPSBzZWxmLmR5KnMKLQkJeW1pbiA9IHljIC0gZHkvMi4wCi0JCXltYXggPSB5YyArIGR5LzIuMAotCQlzZWxmLnJlZ2lvbihzZWxmLnhtaW4seW1pbixzZWxmLnhtYXgseW1heCkKLQotCSMgWm9vbXMgYSBjdXJyZW50IGltYWdlLiAgcyBpcyBnaXZlbiBhcyBhIHBlcmNlbnQgCi0JZGVmIHpvb20oc2VsZixzKToKLQkJcyA9IDEwMC4wL3MKLQkJc2VsZi5zY2FsZXgocykKLQkJc2VsZi5zY2FsZXkocykKLQotCSMgTW92ZSBpbWFnZSBsZWZ0LiAgcyBpcyBnaXZlbiBpbiByYW5nZSAwLDEwMC4gMTAwIG1vdmVzIGEgZnVsbCBzY3JlZW4gbGVmdAotCWRlZiBsZWZ0KHNlbGYscyk6Ci0JCWR4ID0gc2VsZi5keCpzLzEwMC4wCi0JCXhtaW4gPSBzZWxmLnhtaW4gKyBkeAotCQl4bWF4ID0gc2VsZi54bWF4ICsgZHgKLQkJc2VsZi5yZWdpb24oeG1pbixzZWxmLnltaW4seG1heCxzZWxmLnltYXgpCi0KLQkjIE1vdmUgaW1hZ2UgcmlnaHQuICBzIGlzIGdpdmVuIGluIHJhbmdlIDAsMTAwLiAxMDAgbW92ZXMgYSBmdWxsIHNjcmVlbiByaWdodAotCWRlZiByaWdodChzZWxmLHMpOgotCQlzZWxmLmxlZnQoLXMpCi0KLQkjIE1vdmUgaW1hZ2UgZG93bi4gIHMgaXMgZ2l2ZW4gaW4gcmFuZ2UgMCwxMDAuIDEwMCBtb3ZlcyBhIGZ1bGwgc2NyZWVuIGRvd24KLQlkZWYgZG93bihzZWxmLHMpOgotCQlkeSA9IHNlbGYuZHkqcy8xMDAuMAotCQl5bWluID0gc2VsZi55bWluICsgZHkKLQkJeW1heCA9IHNlbGYueW1heCArIGR5Ci0JCXNlbGYucmVnaW9uKHNlbGYueG1pbix5bWluLHNlbGYueG1heCx5bWF4KQotCi0JIyBNb3ZlIGltYWdlIHVwLiAgcyBpcyBnaXZlbiBpbiByYW5nZSAwLDEwMC4gMTAwIG1vdmVzIGEgZnVsbCBzY3JlZW4gdXAKLQlkZWYgdXAoc2VsZixzKToKLQkJc2VsZi5kb3duKC1zKQotCi0JIyBDZW50ZXIgaW1hZ2UKLQlkZWYgY2VudGVyKHNlbGYseCx5KToKLQkJc2VsZi5yaWdodCg1MC14KQotCQlzZWxmLnVwKDUwLXkpCi0JCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU91ciBpbWFnZSBjbGFzcyBwcm92aWRlcyBhIG51bWJlciBvZiBtZXRob2RzIGZvciBjcmVhdGluZyBpbWFnZXMsIHBsb3R0aW5nIHBvaW50cywgbWFraW5nIGxpbmVzLCBhbmQgb3RoZXIgZ3JhcGhpY2FsIG9iamVjdHMuICBXZSBoYXZlIGFsc28gcHJvdmlkZWQgc29tZSBtZXRob2RzIGZvciBtb3ZpbmcgYW5kIHNjYWxpbmcgdGhlIGltYWdlLiAgIE5vdywgbGV0J3MgdXNlIHRoaXMgaW1hZ2UgY2xhc3MgdG8gZG8gc29tZSBpbnRlcmVzdGluZyB0aGluZ3MgOjxwPgotPHA+Ci08YSBuYW1lPSJuNDYiPjwvYT48aDM+IEEgbWF0aGVtYXRpY2FsIGZ1bmN0aW9uICBwbG90dGVyIDwvaDM+Ci1IZXJlJ3MgIGEgc2ltcGxlIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGxvdCBtYXRoZW1hdGljYWwgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGZ1bmNwbG90LnB5Ci0KLWZyb20gaW1hZ2UgaW1wb3J0ICoKLQotY2xhc3MgUGxvdEZ1bmMoSW1hZ2UpOgotCWRlZiBfX2luaXRfXyhzZWxmLGZ1bmMseG1pbix5bWluLHhtYXgseW1heCx3aWR0aD01MDAsaGVpZ2h0PTUwMCk6Ci0JCUltYWdlLl9faW5pdF9fKHNlbGYsd2lkdGgsaGVpZ2h0LHhtaW4seW1pbix4bWF4LHltYXgpCi0JCXNlbGYuZnVuYyA9IGZ1bmMgICAgICAgICAgICAjIFRoZSBmdW5jdGlvbiBiZWluZyBwbG90dGVkCi0JCXNlbGYubnBvaW50cyA9IDEwMCAgICAgICAgICAjIE51bWJlciBvZiBzYW1wbGVzCi0JCXNlbGYuY29sb3IgPSAxCi0JZGVmIGRyYXcoc2VsZik6Ci0JCXNlbGYuY2xlYXIoMCkKLQkJbGFzdHggPSBzZWxmLnhtaW4KLQkJbGFzdHkgPSBzZWxmLmZ1bmMobGFzdHgpCi0JCWR4ID0gMS4wKihzZWxmLnhtYXgtc2VsZi54bWluKS9zZWxmLm5wb2ludHMKLQkJeCA9IGxhc3R4K2R4Ci0JCWZvciBpIGluIHJhbmdlKDAsc2VsZi5ucG9pbnRzKToKLQkJCXkgPSBzZWxmLmZ1bmMoeCkKLQkJCXNlbGYubGluZShsYXN0eCxsYXN0eSx4LHksc2VsZi5jb2xvcikKLQkJCWxhc3R4ID0geAotCQkJbGFzdHkgPSB5Ci0JCQl4ID0geCArIGR4Ci0JCXNlbGYuYXhpcygxKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Nb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkIGluIG91ciBiYXNlIGltYWdlIGNsYXNzIHNvIHRoaXMgaXMgcHJldHR5IHNpbXBsZS4gIEhvd2V2ZXIsIGlmIHdlIHdhbnRlZCB0byBtYWtlIGEgR0lGIGltYWdlIG9mIGEgbWF0aGVtYXRpY2FsIGZ1bmN0aW9uLCB3ZSBjb3VsZCBqdXN0IGRvIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBmcm9tIGZ1bmNwbG90IGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IG1hdGgKLSZndDsmZ3Q7Jmd0OyBwID0gUGxvdEZ1bmMobGFtYmRhIHg6IDAuNSptYXRoLnNpbih4KSswLjc1Km1hdGguc2luKDIqeCktMC42Km1hdGguc2luKDMqeCksCi0gICAgICAgICAgICAgICAgIC0xMCwtMiwxMCwyKQotJmd0OyZndDsmZ3Q7IHAuc2hvdygicGxvdC5naWYiKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGljaCB3b3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgR0lGIGltYWdlIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOS4xLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotPGEgbmFtZT0ibjQ3Ij48L2E+PGgzPiBQbG90dGluZyBhbiB1bnN0cnVjdHVyZWQgbWVzaDwvaDM+Ci1PZiBjb3Vyc2UsIHBlcmhhcHMgd2Ugd2FudCB0byBwbG90IHNvbWV0aGluZyBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkIGxpa2UgYSBtZXNoLiBSZWNlbnRseSwgYSBjb2xsZWFndWUgY2FtZSB0byBtZSB3aXRoIHNvbWUgdW5zdHJ1Y3R1cmVkIG1lc2ggZGF0YSBjb250YWluZWQgaW4gYSBwYWlyIG9mIEFTQ0lJIGZvcm1hdHRlZCBmaWxlcy4gICBUaGVzZSBmaWxlcyBjb250YWluZWQgYSBjb2xsZWN0aW9uIG9mIHBvaW50cywgYW5kIGEgbGlzdCBvZiBjb25uZWN0aXZpdGllcyBkZWZpbmluZyBhIG1lc2ggb24gdGhlc2UgcG9pbnRzLiAgIFJlYWRpbmcgYW5kIHBsb3R0aW5nIHRoaXMgZGF0YSBpbiBQeXRob24gdHVybmVkIG91dCB0byBiZSByZWxhdGl2ZWx5IGVhc3kgdXNpbmcgdGhlIGZvbGxvd2luZyBzY3JpcHQgYW5kIG91ciBpbWFnZSBiYXNlIGNsYXNzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIHBsb3RtZXNoLnB5Ci0jIFBsb3RzIGFuIHVuc3RydWN0dXJlZCBtZXNoIHN0b3JlZCBhcyBhbiBBU0NJSSBmaWxlCi1mcm9tIGltYWdlIGltcG9ydCAqCi1pbXBvcnQgc3RyaW5nCi0KLWNsYXNzIFBsb3RNZXNoKEltYWdlKToKLQlkZWYgX19pbml0X18oc2VsZixmaWxlbmFtZSx4bWluLHltaW4seG1heCx5bWF4LHdpZHRoPTUwMCxoZWlnaHQ9NTAwKToKLQkJSW1hZ2UuX19pbml0X18oc2VsZix3aWR0aCxoZWlnaHQseG1pbix5bWluLHhtYXgseW1heCkKLQkJIyByZWFkIGluIGEgbWVzaCBmaWxlIGluIHBpZWNlcwotCQlwdHMgPSBbXQotCQkjIFJlYWQgaW4gZGF0YSBwb2ludHMKLQkJYXRvaSA9IHN0cmluZy5hdG9pCi0JCWF0b2YgPSBzdHJpbmcuYXRvZgotCQlmID0gb3BlbihmaWxlbmFtZSsiLnB0cyIsInIiKQotCQlucG9pbnRzID0gYXRvaShmLnJlYWRsaW5lKCkpCi0JCWZvciBpIGluIHJhbmdlKDAsbnBvaW50cyk6Ci0JCQlsID0gc3RyaW5nLnNwbGl0KGYucmVhZGxpbmUoKSkKLQkJCXB0cy5hcHBlbmQoKGF0b2YobFswXSksYXRvZihsWzFdKSkpCi0JCWYuY2xvc2UoKQkKLQotCQkjIFJlYWQgaW4gbWVzaCBkYXRhCi0JCWYgPSBvcGVuKGZpbGVuYW1lKyIudHJpcyIsInIiKQotCQludHJpcyA9IHN0cmluZy5hdG9pKGYucmVhZGxpbmUoKSkKLQkJdHJpcyA9IFsgXQotCQlmb3IgaSBpbiByYW5nZSgwLG50cmlzKToKLQkJCWwgPSBzdHJpbmcuc3BsaXQoZi5yZWFkbGluZSgpKQotCQkJdHJpcy5hcHBlbmQoKGF0b2kobFswXSktMSxhdG9pKGxbMV0pLTEsYXRvaShsWzJdKS0xLGF0b2kobFszXSkpKQotCQlmLmNsb3NlKCkKLQotCSMgU2V0IHVwIGxvY2FsIGF0dHJpYnV0ZXMKLQkJc2VsZi5wdHMgPSBwdHMKLQkJc2VsZi5ucG9pbnRzID0gbnBvaW50cwotCQlzZWxmLnRyaXMgPSB0cmlzCi0JCXNlbGYubnRyaXMgPSBudHJpcwotCi0JIyBEcmF3IG1lc2gKLQlkZWYgZHJhdyhzZWxmKToKLQkJc2VsZi5jbGVhcigwKTsKLQkJaSA9IDAKLQkJd2hpbGUgaSAmbHQ7IHNlbGYubnRyaXM6Ci0JCQl0cmkgPSBzZWxmLnRyaXNbaV0KLQkJCXB0MSA9IHNlbGYucHRzW3RyaVswXV0KLQkJCXB0MiA9IHNlbGYucHRzW3RyaVsxXV0KLQkJCXB0MyA9IHNlbGYucHRzW3RyaVsyXV0KLQkJCSMgTm93IGRyYXcgdGhlIG1lc2gKLQkJCXNlbGYudHJpYW5nbGUocHQxWzBdLHB0MVsxXSxwdDJbMF0scHQyWzFdLHB0M1swXSxwdDNbMV0sdHJpWzNdKTsKLQkJCWkgPSBpICsgMQotCi0JIyBEcmF3IGEgdHJpYW5nbGUKLQlkZWYgdHJpYW5nbGUoc2VsZix4MSx5MSx4Mix5Mix4Myx5Myxjb2xvcik6Ci0JCXNlbGYubGluZSh4MSx5MSx4Mix5Mixjb2xvcikKLQkJc2VsZi5saW5lKHgyLHkyLHgzLHkzLGNvbG9yKQotCQlzZWxmLmxpbmUoeDMseTMseDEseTEsY29sb3IpCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgY2xhc3Mgc2ltcGx5IHJlYWRzIHRoZSBkYXRhIGludG8gYSBmZXcgUHl0aG9uIGxpc3RzLCBoYXMgYSBkcmF3aW5nIGZ1bmN0aW9uIGZvciBtYWtpbmcgYSBwbG90LCBhbmQgYWRkcyBhIHNwZWNpYWwgbWV0aG9kIGZvciBtYWtpbmcgdHJpYW5nbGVzLiAgTWFraW5nIGEgcGxvdCBpcyBub3cgZWFzeSwganVzdCBkbyB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZnJvbSBwbG90bWVzaC5weSBpbXBvcnQgKgotJmd0OyZndDsmZ3Q7IG1lc2ggPSBQbG90TWVzaCgibWVzaCIsNSwwLDM1LDI1KQotJmd0OyZndDsmZ3Q7IG1lc2guc2hvdygibWVzaC5naWYiKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgR0lGIGltYWdlIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOS4yLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotV2hlbiBydW4gaW50ZXJhY3RpdmVseSwgd2UgY2FuIGFsc28gdXNlIHNpbXBsZSBjb21tYW5kcyB0byB6b29tIGluIGFuZCBtb3ZlIHRoZSBpbWFnZSBhcm91bmQuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgbWVzaCA9IFBsb3RNZXNoKCJtZXNoIiw1LDAsMzUsMjUpCi0mZ3Q7Jmd0OyZndDsgbWVzaC56b29tKDIwMCkgICAgICAgICAgICAgICAgICAgIyBFbmxhcmdlIGJ5IDIwMCUKLSZndDsmZ3Q7Jmd0OyBtZXNoLmxlZnQoNTApICAgICAgICAgICAgICAgICAgICAjIE1vdmUgaW1hZ2UgaGFsZiBhIHNjcmVlbiB0byBsZWZ0Ci0mZ3Q7Jmd0OyZndDsgbWVzaC5zaG93KCkKLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGlsZSBhIFB5dGhvbi1vbmx5IGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHVuc3VpdGFibGUgZm9yIGh1Z2UgZGF0YXNldHMsIHBlcmZvcm1hbmNlIGNyaXRpY2FsIG9wZXJhdGlvbnMgY291bGQgYmUgbW92ZWQgdG8gQyBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG91ciBJbWFnZSBiYXNlIGNsYXNzLiAgPHA+Ci08YSBuYW1lPSJuNDgiPjwvYT48aDM+IEZyb20gQyB0byBTV0lHIHRvIFB5dGhvbjwvaDM+Ci1UaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBudW1iZXIgb2YgdGhpbmdzIHRoYXQgYXJlIHBvc3NpYmxlIHdpdGggU1dJRyBhbmQgUHl0aG9uLiAgRmlyc3QsIGl0IGlzIHVzdWFsbHkgcmVsYXRpdmVseSBlYXN5IHRvIGJ1aWxkIGEgUHl0aG9uIGludGVyZmFjZSB0byBhbiBleGlzdGluZyBDIGxpYnJhcnkuICAgIFdpdGggYSBsaXR0bGUgZXh0cmEgd29yaywgaXQgaXMgcG9zc2libGUgdG8gaW1wcm92ZSB0aGUgaW50ZXJmYWNlIGJ5IGFkZGluZyBhIGZldyBzdXBwb3J0IGZ1bmN0aW9ucyBzdWNoIGFzIG91ciBQb2ludCAgZXh0ZW5zaW9ucy4gIEZpbmFsbHksIG9uY2UgaW4gUHl0aG9uLCBpdCBpcyBwb3NzaWJsZSB0byBlbmNhcHN1bGF0ZSBDIGxpYnJhcmllcyBpbiBuZXcga2luZHMgb2YgUHl0aG9uIG9iamVjdHMgYW5kIGNsYXNzZXMuICBXZSBidWlsdCBhIHNpbXBsZSBJbWFnZSBiYXNlIGNsYXNzIGFuZCB1c2VkIGl0IHRvIHBsb3QgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyBhbmQgdW5zdHJ1Y3R1cmVkIDJEIG1lc2ggZGF0YS0tLXR3byBlbnRpcmVseSBkaWZmZXJlbnQgdGFza3MsIHlldCBlYXNpbHkgYWNjb21wbGlzaGVkIHdpdGggYSBzbWFsbCBhbW91bnQgb2YgUHl0aG9uIGNvZGUuICAgSWYgd2UgbGF0ZXIgZGVjaWRlZCB0byB1c2UgYSBkaWZmZXJlbnQgQyBsaWJyYXJ5IHN1Y2ggYXMgT3BlbkdMLCB3ZSBjb3VsZCB3cmFwIGl0IGluIFNXSUcsIGNoYW5nZSB0aGUgSW1hZ2UgYmFzZSBjbGFzcyBhcHByb3ByaWF0ZWx5ICwgYW5kIHVzZSB0aGUgZnVuY3Rpb24gYW5kIG1lc2ggcGxvdHRpbmcgZXhhbXBsZXMgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiAgIEkgdGhpbmsgdGhpcyBpcyBwcmV0dHkgY29vbC48cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBQdXR0aW5nIGl0IGFsbCB0b2dldGhlcjwvaDI+Ci1GaW5hbGx5LCBsZXQncyBjb21iaW5lIG91ciBoZWF0IGVxdWF0aW9uIHNvbHZlciBhbmQgZ3JhcGhpY3MgbW9kdWxlIGludG8gYSBzaW5nbGUgYXBwbGljYXRpb24uICAgVG8gZG8gdGhpcywgd2UgZmlyc3QgbmVlZCB0byBrbm93IGhvdyB0byBjb21iaW5lIHR3byBkaWZmZXJlbnQgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcy4gV2hlbiBkaWZmZXJlbnQgU1dJRyBtb2R1bGVzIG5lZWQgdG8gYmUgY29tYmluZWQsIHRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3MgeW91IGNhbiBkby48cD4KLTxhIG5hbWU9Im40OSI+PC9hPjxoMz4gTWVyZ2luZyBtb2R1bGVzPC9oMz4KLVR3byBTV0lHIG1vZHVsZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbW9kdWxlIGlmIHlvdSBtYWtlIGFuIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBwYWNrYWdlCi0laW5jbHVkZSBwZGUuaQotJWluY2x1ZGUgZ2QuaQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIHdpbGwgY29tYmluZSBldmVyeXRoaW5nIGluIGJvdGggaW50ZXJmYWNlIGZpbGVzIGludG8gYSBzaW5nbGUgc3VwZXItbW9kdWxlIGNhbGxlZCAicGFja2FnZSIuIFRoZSBhZHZhbnRhZ2UgdG8gdGhpcyBhcHByb2FjaCBpcyB0aGF0IGl0IGlzIGV4dHJlbWVseSBxdWljayBhbmQgZWFzeS4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgbW9kdWxlIG5hbWVzIG9mICJwZGUiIGFuZCAiZ2QiIHdpbGwgYmUgbG9zdC4gIElmIHlvdSBoYWQgYSBidW5jaCBvZiBzY3JpcHRzIHRoYXQgcmVsaWVkIG9uIHRob3NlIG5hbWVzLCB0aGV5IHdvdWxkIG5vIGxvbmdlciB3b3JrLiAgICBUaHVzLCBjb21iaW5pbmcgbW9kdWxlcyBpbiB0aGlzIHdheSBpcyBwcm9iYWJseSBvbmx5IGEgZ29vZCBpZGVhIGlmIHRoZSBtb2R1bGVzIGFyZSBjbG9zZWx5IHJlbGF0ZWQuPHA+Ci08YSBuYW1lPSJuNTAiPjwvYT48aDM+IFVzaW5nIGR5bmFtaWMgbG9hZGluZzwvaDM+Ci1JZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBkeW5hbWljIGxvYWRpbmcsIHlvdSBjYW4gYnVpbGQgZWFjaCBTV0lHIG1vZHVsZSBpbnRvIGEgc2VwYXJhdGUgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlIGFuZCBsb2FkIGVhY2ggb25lIGluZGl2aWR1YWxseSBpbnRvIFB5dGhvbi4gIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBhcHByb2FjaCBpZiBpdCBpcyBzdXBwb3J0ZWQgb24geW91ciBzeXN0ZW0uICAgU1dJRyB3cmFwcGVyIGZpbGVzIGRlY2xhcmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgYXMgInN0YXRpYyIgc28gdXNpbmcgZHluYW1pYyBsb2FkaW5nIHdpdGggbXVsdGlwbGUgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyB3aWxsIG5vdCB1c3VhbGx5IGNhdXNlIGFueSBuYW1lc3BhY2UgY2xhc2hlcy4gIDxwPgotPGEgbmFtZT0ibjUxIj48L2E+PGgzPiBVc2Ugc3RhdGljIGxpbmtpbmc8L2gzPgotQXMgYW4gYWx0ZXJuYXRpdmUgdG8gZHluYW1pYyBsb2FkaW5nLCB5b3UgY2FuIHVzZSBhIHNwZWNpYWwgZm9ybSBvZiB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBwYWNrYWdlLCBwZGVjLCBnZGMKLSVpbmNsdWRlIGVtYmVkLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIGJ1aWxkIGEgc3RhdGljIHZlcnNpb24gb2YgUHl0aG9uIHdpdGggMyBDIGV4dGVuc2lvbiBtb2R1bGVzIGFkZGVkICg8dHQ+cGFja2FnZTwvdHQ+LCA8dHQ+cGRlYzwvdHQ+LCBhbmQgPHR0PmdkYzwvdHQ+KS4gIFdoZW4gdXNpbmcgdGhpcyB0ZWNobmlxdWUsIHRoZSBuYW1lcyBvZiB0aGUgbW9kdWxlcyByZWZlciB0byB0aGUgbG93LWxldmVsIFNXSUcgZ2VuZXJhdGVkIEMvQysrIG1vZHVsZXMuICBTaW5jZSBzaGFkb3cgY2xhc3NlcyBhcmUgYmVpbmcgdXNlZCwgdGhlc2UgbW9kdWxlcyBtdXN0IGhhdmUgYW4gZXh0cmEgYGMnIGFwcGVuZGVkIHRvIHRoZSBuYW1lICh0aHVzLCAicGRlYyIgYW5kICJnZGMiIGluc3RlYWQgb2YgInBkZSIgYW5kICJnZCIpLiAgIFRoZSBleHRyYSBtb2R1bGVzIHNwZWNpZmllZCB3aXRoIHRoZSA8dHQ+JW1vZHVsZXM8L3R0PiBkaXJlY3RpdmUgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gYmUgU1dJRy1nZW5lcmF0ZWQgbW9kdWxlcy4gSW4gcHJhY3RpY2UsIGFsbW9zdCBhbnkga2luZCBvZiBQeXRob24gbW9kdWxlIGNhbiBiZSBsaXN0ZWQgaGVyZS4gIEl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgZXh0cmEgbW9kdWxlcyBuYW1lcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIGlmIHRoZSA8dHQ+ZW1iZWQuaSA8L3R0PmxpYnJhcnkgZmlsZSBpcyBub3QgdXNlZC48cD4KLTxhIG5hbWU9Im41MiI+PC9hPjxoMz4gQnVpbGRpbmcgbGFyZ2UgIG11bHRpLW1vZHVsZSBzeXN0ZW1zPC9oMz4KLUJ5IGRlZmF1bHQsIFNXSUcgaW5jbHVkZXMgdGhlIEMgY29kZSBmb3IgdGhlIFNXSUcgdHlwZS1jaGVja2VyIGFuZCB2YXJpYWJsZSBsaW5raW5nIGludG8gZXZlcnkgbW9kdWxlLiAgSG93ZXZlciwgd2hlbiwgYnVpbGRpbmcgc3lzdGVtcyBpbnZvbHZpbmcgbGFyZ2UgbnVtYmVycyBvZiBTV0lHIG1vZHVsZXMsICBjb21tb24gY29kZSBzdWNoIGFzIHRoZSBTV0lHIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCB2YXJpYWJsZSBsaW5raW5nIGV4dGVuc2lvbnMgY2FuIGJlIHNoYXJlZCBpZiB5b3UgcnVuIFNXSUcgd2l0aCB0aGUgPHR0Pi1jPC90dD4gb3B0aW9uLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtYyAtcHl0aG9uIGdyYXBoaWNzLmkKLSUgc3dpZyAtYyAtcHl0aG9uIG5ldHdvcmsuaQotJSBzd2lnIC1jIC1weXRob24gYW5hbHlzaXMuaQotJSBzd2lnIC1jIC1weXRob24gbWF0aC5pCi0lIGdjYyAtYyBncmFwaGljc193cmFwLmMgbmV0d29ya193cmFwLmMgYW5hbHlzaXNfd3JhcC5jIG1hdGhfd3JhcC5jCi0lIGxkIC1zaGFyZWQgZ3JhcGhpY3Nfd3JhcC5vIC1sc3dpZ3B5IC1vIGdyYXBoaWNzbW9kdWxlLnNvIAotJSBsZCAtc2hhcmVkIG5ldHdvcmtfd3JhcC5vIC1sc3dpZ3B5IC1vIG5ldHdvcmttb2R1bGUuc28gCi0lIGxkIC1zaGFyZWQgYW5hbHlzaXNfd3JhcC5vIC1sc3dpZ3B5IC1vIGFuYWx5c2lzbW9kdWxlLnNvIAotJSBsZCAtc2hhcmVkIG1hdGhfd3JhcC5vIC1vIC1sc3dpZ3B5IG15bWF0aG1vZHVsZS5zbyAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHR0PnN3aWdweTwvdHQ+IGlzIGEgc3BlY2lhbCBwdXJwb3NlIGxpYnJhcnkgdGhhdCBjb250YWlucyB0aGUgU1dJRyBwb2ludGVyIHR5cGUgY2hlY2tlciBhbmQgb3RoZXIgc3VwcG9ydCBjb2RlIChzZWUgdGhlIDx0dD5NaXNjPC90dD4gc3ViZGlyZWN0b3J5IG9mIHRoZSBTV0lHIGRpc3RyaWJ1dGlvbikuIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlIHNhbWUgc3VwcG9ydCBjb2RlIHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzLiAgIFRoZSA8dHQ+c3dpZ3B5PC90dD4gbGlicmFyeSBjYW4gYWxzbyBiZSBhcHBsaWVkIHdoZW4gc3RhdGljIGxpbmtpbmcgaXMgYmVpbmcgdXNlZC4gIFNlZSB0aGUgQWR2YW5jZWQgVG9waWNzIGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgU1dJRyB3aXRoIG11bHRpcGxlIG1vZHVsZXMuPHA+Ci08YSBuYW1lPSJuNTMiPjwvYT48aDM+IEEgY29tcGxldGUgYXBwbGljYXRpb248L2gzPgotVGhlIGZvbGxvd2luZyBQeXRob24gc2NyaXB0IHNob3dzIGFuIGFwcGxpY2F0aW9uIHRoYXQgY29tYmluZXMgb3VyIEMrKyBoZWF0IGVxdWF0aW9uIHNvbHZlciwgb3VyIGdkIGxpYnJhcnksIGFuZCBvdXIgSW1hZ2UgYmFzZSBjbGFzcyB0aGF0IHdlIGRldmVsb3BlZC4gPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBTb2x2ZSB0aGUgaGVhdCBlcXVhdGlvbi4KLSMgTWFrZSBhIHNlcmllcyBvZiBkYXRhIGZpbGVzCi0jIE1ha2UgYSBtb3ZpZSBvZiBHSUYgaW1hZ2VzCi0KLWZyb20gcGRlIGltcG9ydCAqCi1mcm9tIGltYWdlIGltcG9ydCAqCi1pbXBvcnQgc3RyaW5nCi0KLSMgSW1hZ2UgY2xhc3MKLWNsYXNzIEhlYXRJbWcoSW1hZ2UpOgotCWRlZiBfX2luaXRfXyhzZWxmLGgsd2lkdGg9MzAwLGhlaWdodD0zMDApOgotCQlJbWFnZS5fX2luaXRfXyhzZWxmLHdpZHRoLGhlaWdodCwwLjAsMC4wLDEuMCwxLjApCi0JCXNlbGYuaCA9IGgKLQkJIyBDcmVhdGUgYSBncmV5c2NhbGUgY29sb3JtYXAKLQkJY21hcCA9IFtdCi0JCWZvciBpIGluIHJhbmdlKDAsMjU1KToKLQkJCWNtYXAuYXBwZW5kKChpLGksaSkpCi0JCXNlbGYuY29sb3JtYXAoY21hcCkKLQkJc2VsZi5jbWluID0gMC4wCi0JCXNlbGYuY21heCA9IDEuMAotCQlzZWxmLmltZ25vID0gMQotCWRlZiBkcmF3KHNlbGYpOgotCQlzZWxmLmNsZWFyKDApCi0JCWR4ID0gMS4wLyhzZWxmLmguZ3JpZC54cG9pbnRzLTIpCi0JCWR5ID0gMS4wLyhzZWxmLmguZ3JpZC55cG9pbnRzLTIpCi0JCWkgPSAxCi0JCXggPSAwLjAKLQkJd2hpbGUgaSAmbHQ7IHNlbGYuaC5ncmlkLnhwb2ludHM6Ci0JCQlqID0gMTsKLQkJCXkgPSAwLjAKLQkJCXdoaWxlIGogJmx0OyBzZWxmLmguZ3JpZC55cG9pbnRzOgotCQkJCWMgPSBpbnQoKHNlbGYuaC5ncmlkW2ldW2pdLXNlbGYuY21pbikvKHNlbGYuY21heC0gCi0JCQkJCSBzZWxmLmNtaW4pKjI1NSkKLQkJCQlzZWxmLnNvbGlkYm94KHgseStkeSx4K2R4LHksYykKLQkJCQlqID0gaiArIDEKLQkJCQl5ID0geSArIGR5Ci0JCQlpID0gaSArIDEKLQkJCXggPSB4ICsgZHgKLQkJc2VsZi5uYW1lID0gImltYWdlIitzdHJpbmcuemZpbGwoc2VsZi5pbWdubyw0KSsiLmdpZiIKLQkJc2VsZi5pbWdubyA9IHNlbGYuaW1nbm8rMQotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotZGVmIGluaXRjb25kKGgpOgotCWguc2V0X3RlbXAoMC4wKQotCW54ID0gaC5ncmlkLnhwb2ludHMKLQlmb3IgaSBpbiByYW5nZSgwLG54KToKLQkJaC5ncmlkW2ldWzBdID0gMS4wCi0KLSMgU2V0IHVwIGEgcHJvYmxlbSBhbmQgcnVuIGl0Ci1oID0gSGVhdDJkKDUwLDUwKQotCi0jIE1ha2UgYW4gaW1hZ2Ugb2JqZWN0Ci1pbWcgPSBIZWF0SW1nKGgpCi0KLWluaXRjb25kKGgpCi1maWxlbm8gPSAxCi0KLSMgUnVuIGl0Ci1mb3IgaSBpbiByYW5nZSgwLDI1KToKLQloLnNvbHZlKDEwMCkKLQloLmR1bXAoIkRhdCIrc3RyKGZpbGVubykpCi0JaW1nLnNob3coKQotCXByaW50ICJ0aW1lID0gIiwgaC50aW1lCi0JZmlsZW5vID0gZmlsZW5vKzEKLQotIyBDYWxjdWxhdGUgYXZlcmFnZSB0ZW1wZXJhdHVyZSBhbmQgZXhpdAotc3VtID0gMC4wCi1mb3IgaSBpbiByYW5nZSgwLGguZ3JpZC54cG9pbnRzKToKLQlmb3IgaiBpbiByYW5nZSgwLGguZ3JpZC55cG9pbnRzKToKLQkJc3VtID0gc3VtICsgaC5ncmlkW2ldW2pdCi1hdmcgPSBzdW0vKGguZ3JpZC54cG9pbnRzKmguZ3JpZC55cG9pbnRzKQotcHJpbnQgIkF2ZyB0ZW1wZXJhdHVyZSA9ICIsYXZnCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gcnVuLCB3ZSBub3cgZ2V0IGEgY29sbGVjdGlvbiBvZiBkYXRhZmlsZXMgYW5kIHNlcmllcyBvZiBpbWFnZXMgbGlrZSB0aGlzIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOS4zLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotVGh1cywgd2UgaGF2ZSBhIHNpbXBsZSBwaHlzaWNzIGFwcGxpY2F0aW9uIHRoYXQgb25seSB0YWtlcyBhYm91dCAxIHBhZ2Ugb2YgUHl0aG9uIGNvZGUsIHJ1bnMgYSBzaW11bGF0aW9uLCBjcmVhdGVzIGRhdGEgZmlsZXMsIGFuZCBhIG1vdmllIG9mIGltYWdlcy4gIFdlIGNhbiBlYXNpbHkgY2hhbmdlIGFueSBhc3BlY3Qgb2YgdGhlIHNpbXVsYXRpb24sIGludGVyYWN0aXZlbHkgcXVlcnkgdmFyaWFibGVzIGFuZCBleGFtaW5lIGRhdGEuICBOZXcgcHJvY2VkdXJlcyBjYW4gYmUgd3JpdHRlbiBhbmQgdGVzdGVkIGluIFB5dGhvbiBhbmQgbGF0ZXIgaW1wbGVtZW50ZWQgaW4gQysrIGlmIG5lZWRlZC4gICBNb3JlIGltcG9ydGFudGx5LCB3ZSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWN0dWFsbHkgZnVuIHRvIHVzZSBhbmQgbW9kaWZ5ICh3ZWxsLCBhdCBsZWFzdCBJIHRoaW5rIHNvKS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBFeGNlcHRpb24gaGFuZGxpbmcgPC9oMj4KLVRoZSBTV0lHIDx0dD4lZXhjZXB0PC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHVzZXItZGVmaW5hYmxlIGV4Y2VwdGlvbiBoYW5kbGVyIGluIGNoYXJnZSBvZiBjb252ZXJ0aW5nIGV4Y2VwdGlvbnMgaW4geW91ciBDL0MrKyBwcm9ncmFtIGludG8gUHl0aG9uIGV4Y2VwdGlvbnMuICBUaGUgY2hhcHRlciBvbiBleGNlcHRpb24gaGFuZGxpbmcgY29udGFpbnMgbW9yZSBkZXRhaWxzLCBidXQgc3VwcG9zZSB5b3UgaGF2ZSBhIEMrKyBjbGFzcyBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWNsYXNzIFJhbmdlRXJyb3Ige307ICAgLy8gVXNlZCBmb3IgYW4gZXhjZXB0aW9uCi0KLWNsYXNzIERvdWJsZUFycmF5IHsKLSAgcHJpdmF0ZToKLSAgICBpbnQgbjsKLSAgICBkb3VibGUgKnB0cjsKLSAgcHVibGljOgotICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSBvZiBmaXhlZCBzaXplCi0gICAgRG91YmxlQXJyYXkoaW50IHNpemUpIHsKLSAgICAgIHB0ciA9IG5ldyBkb3VibGVbc2l6ZV07Ci0gICAgICBuID0gc2l6ZTsKLSAgICB9Ci0gICAgLy8gRGVzdHJveSBhbiBhcnJheQotICAgIH5Eb3VibGVBcnJheSgpIHsKLSAgICAgICBkZWxldGUgcHRyOwotICAgIH0KLSAgICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKLSAgICBpbnQgICBsZW5ndGgoKSB7Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICAvLyBHZXQgYW4gaXRlbSBmcm9tIHRoZSBhcnJheSBhbmQgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcuCi0gICAgZG91YmxlIGdldGl0ZW0oaW50IGkpIHsKLSAgICAgIGlmICgoaSAmZ3Q7PSAwKSAmYW1wOyZhbXA7IChpICZsdDsgbikpCi0gICAgICAgIHJldHVybiBwdHJbaV07Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IFJhbmdlRXJyb3IoKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgYW4gaXRlbSBpbiB0aGUgYXJyYXkgYW5kIHBlcmZvcm0gYm91bmRzIGNoZWNraW5nLgotICAgIHZvaWQgc2V0aXRlbShpbnQgaSwgZG91YmxlIHZhbCkgewotICAgICAgaWYgKChpICZndDs9IDApICZhbXA7JmFtcDsgKGkgJmx0OyBuKSkKLSAgICAgICAgcHRyW2ldID0gdmFsOwotICAgICAgZWxzZSB7Ci0gICAgICAgIHRocm93IFJhbmdlRXJyb3IoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgY2FuIHRocm93IGEgcmFuZ2UgZXhjZXB0aW9uIGZvciBhbiBvdXQtb2YtYm91bmRzIGFycmF5IGFjY2Vzcy4gICBXZSBjYW4gY2F0Y2ggdGhpcyBpbiBvdXIgUHl0aG9uIGV4dGVuc2lvbiBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocHl0aG9uKSB7Ci0gIHRyeSB7Ci0gICAgJGZ1bmN0aW9uCi0gIH0KLSAgY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwiaW5kZXggb3V0LW9mLWJvdW5kcyIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdGhlIEMrKyBjbGFzcyB0aHJvd3MgYSBSYW5nZUVycm9yIGV4Y2VwdGlvbiwgb3VyIHdyYXBwZXIgZnVuY3Rpb25zIHdpbGwgY2F0Y2ggaXQsIHR1cm4gaXQgaW50byBhIFB5dGhvbiBleGNlcHRpb24sIGFuZCBhbGxvdyBhIGdyYWNlZnVsIGRlYXRoIGFzIG9wcG9zZWQgdG8ganVzdCBoYXZpbmcgc29tZSBzb3J0IG9mIG15c3RlcmlvdXMgcHJvZ3JhbSBjcmFzaC4gICAgIFNpbmNlIFNXSUcncyBleGNlcHRpb24gaGFuZGxpbmcgaXMgdXNlci1kZWZpbmFibGUsIHdlIGFyZSBub3QgbGltaXRlZCB0byBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLiAgIFBsZWFzZSBzZWUgdGhlIGNoYXB0ZXIgb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBtb3JlIGRldGFpbHMgYW5kIHVzaW5nIHRoZSA8dHQ+ZXhjZXB0aW9uLmk8L3R0PiBsaWJyYXJ5IGZvciB3cml0aW5nIGxhbmd1YWdlLWluZGVwZW5kZW50IGV4Y2VwdGlvbiBoYW5kbGVycy48cD4KLTxwPgotUHl0aG9uIGV4Y2VwdGlvbnMgY2FuIGJlIHJhaXNlZCB1c2luZyB0aGUgPHR0PlB5RXJyX1NldFN0cmluZygpPC90dD4gZnVuY3Rpb24gYXMgc2hvd24gYWJvdmUuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGEgbGlzdCBvZiB0aGUgZGlmZmVyZW50IFB5dGhvbiBleGNlcHRpb25zIGF2YWlsYWJsZS48cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoOS50YWJsZS4xLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gUmVtYXBwaW5nIEMgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2gyPgotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBob3cgU1dJRydzIHRyZWF0bWVudCBvZiB2YXJpb3VzIEMvQysrIGRhdGF0eXBlcyBjYW4gYmUgcmVtYXBwZWQgdXNpbmcgdGhlIFNXSUcgPHR0PiV0eXBlbWFwPC90dD4gZGlyZWN0aXZlLiAgIFdoaWxlIG5vdCByZXF1aXJlZCwgdGhpcyBzZWN0aW9uIGFzc3VtZXMgc29tZSBmYW1pbGlhcml0eSB3aXRoICBQeXRob24ncyBDIEFQSS4gICBUaGUgcmVhZGVyIGlzIGFkdmlzZWQgdG8gY29uc3VsdCAgdGhlIFB5dGhvbiByZWZlcmVuY2UgbWFudWFsIG9yIG9uZSBvZiB0aGUgYm9va3Mgb24gUHl0aG9uLiAgQSBnbGFuY2UgYXQgdGhlIGNoYXB0ZXIgb24gU1dJRyB0eXBlbWFwcyB3aWxsIGFsc28gYmUgdXNlZnVsLiAgPHA+Ci08YSBuYW1lPSJuNTQiPjwvYT48aDM+IFdoYXQgaXMgYSB0eXBlbWFwPzwvaDM+Ci1BIHR5cGVtYXAgaXMgbWVjaGFuaXNtIGJ5IHdoaWNoIFNXSUcncyBwcm9jZXNzaW5nIG9mIGEgcGFydGljdWxhciBDIGRhdGF0eXBlIGNhbiBiZSBvdmVycmlkZGVuLiAgIEEgc2ltcGxlIHR5cGVtYXAgbWlnaHQgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi0ldHlwZW1hcChweXRob24saW4pIGludCB7Ci0JJHRhcmdldCA9IChpbnQpIFB5TG9uZ19Bc0xvbmcoJHNvdXJjZSk7Ci0JcHJpbnRmKCJSZWNlaXZlZCBhbiBpbnRlZ2VyIDogJWRcbiIsJHRhcmdldCk7Ci19Ci1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UeXBlbWFwcyByZXF1aXJlIGEgbGFuZ3VhZ2UgIG5hbWUsICBtZXRob2QgbmFtZSwgZGF0YXR5cGUsIGFuZCBjb252ZXJzaW9uIGNvZGUuICBGb3IgUHl0aG9uLCAicHl0aG9uIiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgbGFuZ3VhZ2UgbmFtZS4gVGhlICJpbiIgbWV0aG9kIGluIHRoaXMgZXhhbXBsZSByZWZlcnMgdG8gYW4gaW5wdXQgYXJndW1lbnQgb2YgYSBmdW5jdGlvbi4gVGhlIGRhdGF0eXBlIGBpbnQnIHRlbGxzIFNXSUcgdGhhdCB3ZSBhcmUgcmVtYXBwaW5nIGludGVnZXJzLiAgVGhlIHN1cHBsaWVkIGNvZGUgaXMgdXNlZCB0byBjb252ZXJ0IGZyb20gYSA8dHQ+UHlPYmplY3QgKjwvdHQ+IHRvIHRoZSBjb3JyZXNwb25kaW5nIEMgZGF0YXR5cGUuICBXaXRoaW4gdGhlIHN1cHBvcnRpbmcgQyBjb2RlLCB0aGUgdmFyaWFibGUgPHR0PiRzb3VyY2U8L3R0PiBjb250YWlucyB0aGUgc291cmNlIGRhdGEgKHRoZSA8dHQ+UHlPYmplY3Q8L3R0PiBpbiB0aGlzIGNhc2UpIGFuZCA8dHQ+JHRhcmdldDwvdHQ+IGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGNvbnZlcnNpb24uICA8cD4KLTxwPgotV2hlbiB0aGlzIGV4YW1wbGUgaXMgY29tcGlsZWQgaW50byBhIFB5dGhvbiBtb2R1bGUsIGl0IHdpbGwgb3BlcmF0ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZnJvbSBleGFtcGxlIGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgZmFjdCg2KQotUmVjZWl2ZWQgYW4gaW50ZWdlciA6IDYKLTcyMAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BIGZ1bGwgZGlzY3Vzc2lvbiBvZiB0eXBlbWFwcyBjYW4gYmUgZm91bmQgaW4gdGhlIG1haW4gU1dJRyB1c2VycyByZWZlcmVuY2UuICBXZSB3aWxsIHByaW1hcmlseSBiZSBjb25jZXJuZWQgd2l0aCBQeXRob24gdHlwZW1hcHMgaGVyZS48cD4KLTxhIG5hbWU9Im41NSI+PC9hPjxoMz4gUHl0aG9uIHR5cGVtYXBzPC9oMz4KLVRoZSBmb2xsb3dpbmcgdHlwZW1hcCBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gUHl0aG9uIG1vZHVsZXMgOjxwPgotPHA+Ci08dHQ+JXR5cGVtYXAocHl0aG9uLGluKQk8L3R0PkNvbnZlcnRzIFB5dGhvbiBvYmplY3RzIHRvIGlucHV0IGZ1bmN0aW9uIGFyZ3VtZW50czxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixvdXQpPC90dD4JQ29udmVydHMgcmV0dXJuIHZhbHVlIG9mIGEgQyBmdW5jdGlvbiB0byBhIFB5dGhvbiBvYmplY3Q8cD4KLTx0dD4ldHlwZW1hcChweXRob24sdmFyaW4pCTwvdHQ+QXNzaWducyBhIGdsb2JhbCB2YXJpYWJsZSBmcm9tIGEgUHl0aG9uIG9iamVjdDxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbix2YXJvdXQpPC90dD4JUmV0dXJucyBhIGdsb2JhbCB2YXJpYWJsZSBhcyBhIFB5dGhvbiBvYmplY3Q8cD4KLTx0dD4ldHlwZW1hcChweXRob24sZnJlZWFyZyk8L3R0PglDbGVhbnMgdXAgYSBmdW5jdGlvbiBhcmd1bWVudCAoaWYgbmVjZXNzYXJ5KTxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixhcmdvdXQpPC90dD4JT3V0cHV0IGFyZ3VtZW50IHByb2Nlc3Npbmc8cD4KLTx0dD4ldHlwZW1hcChweXRob24scmV0KTwvdHQ+CUNsZWFudXAgb2YgZnVuY3Rpb24gcmV0dXJuIHZhbHVlczxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixjb25zdCk8L3R0PglDcmVhdGlvbiBvZiBQeXRob24gY29uc3RhbnRzPHA+Ci08dHQ+JXR5cGVtYXAobWVtYmVyaW4pPC90dD4JU2V0dGluZyBvZiBDKysgbWVtYmVyIGRhdGE8cD4KLTx0dD4ldHlwZW1hcChtZW1iZXJvdXQpPC90dD4JUmV0dXJuIG9mIEMrKyBtZW1iZXIgZGF0YTxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixjaGVjayk8L3R0PglDaGVja3MgZnVuY3Rpb24gaW5wdXQgdmFsdWVzLjxwPgotPGEgbmFtZT0ibjU2Ij48L2E+PGgzPiBUeXBlbWFwIHZhcmlhYmxlczwvaDM+Ci1UaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtYXkgYmUgdXNlZCB3aXRoaW4gdGhlIEMgY29kZSB1c2VkIGluIGEgdHlwZW1hcDo8cD4KLTxwPgotPHR0PiRzb3VyY2U8L3R0PglTb3VyY2UgdmFsdWUgb2YgYSBjb252ZXJzaW9uPHA+Ci08dHQ+JHRhcmdldDwvdHQ+CVRhcmdldCBvZiBjb252ZXJzaW9uICh3aGVyZSB0aGUgcmVzdWx0IHNob3VsZCBiZSBzdG9yZWQpPHA+Ci08dHQ+JHR5cGU8L3R0PglDIGRhdGF0eXBlIGJlaW5nIHJlbWFwcGVkPHA+Ci08dHQ+JG1hbmdsZTwvdHQ+CU1hbmdsZWQgdmVyc2lvbiBvZiBkYXRhICh1c2VkIGZvciBwb2ludGVyIHR5cGUtY2hlY2tpbmcpPHA+Ci08dHQ+JHZhbHVlPC90dD4JVmFsdWUgb2YgYSBjb25zdGFudCAoY29uc3QgdHlwZW1hcCBvbmx5KTxwPgotPGEgbmFtZT0ibjU3Ij48L2E+PGgzPiBOYW1lIGJhc2VkIHR5cGUgY29udmVyc2lvbjwvaDM+Ci1UeXBlbWFwcyBhcmUgYmFzZWQgYm90aCBvbiB0aGUgZGF0YXR5cGUgYW5kIGFuIG9wdGlvbmFsIG5hbWUgYXR0YWNoZWQgdG8gYSBkYXRhdHlwZS4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBmb28KLQotLy8gVGhpcyB0eXBlbWFwIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgY2hhciAqKiBmdW5jdGlvbiBhcmd1bWVudHMKLSV0eXBlbWFwKHB5dGhvbixpbikgY2hhciAqKiB7IC4uLiB9Ci0KLS8vIFRoaXMgdHlwZW1hcCBpcyBhcHBsaWVkIG9ubHkgdG8gY2hhciAqKiBhcmd1bWVudHMgbmFtZWQgYGFyZ3YnCi0ldHlwZW1hcChweXRob24saW4pIGNoYXIgKiphcmd2IHsgLi4uIH0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBleGFtcGxlLCB0d28gdHlwZW1hcHMgYXJlIGFwcGxpZWQgdG8gdGhlIDx0dD5jaGFyICoqPC90dD4gZGF0YXR5cGUuICBIb3dldmVyLCB0aGUgc2Vjb25kIHR5cGVtYXAgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gYXJndW1lbnRzIG5hbWVkIGA8dHQ+YXJndjwvdHQ+Jy4gIEEgbmFtZWQgdHlwZW1hcCB3aWxsIGFsd2F5cyBvdmVycmlkZSBhbiB1bm5hbWVkIHR5cGVtYXAuPHA+Ci08cD4KLUR1ZSB0byB0aGUgbmFtZS1iYXNlZCBuYXR1cmUgb2YgdHlwZW1hcHMsIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdHlwZW1hcHMgYXJlIGluZGVwZW5kZW50IG9mIHR5cGVkZWYgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbiwgaW4pIGRvdWJsZSB7Ci0JLi4uIGdldCBhIGRvdWJsZSAuLi4KLX0KLXZvaWQgZm9vKGRvdWJsZSk7ICAgICAgICAgICAgLy8gVXNlcyB0aGUgYWJvdmUgdHlwZW1hcAotdHlwZWRlZiBkb3VibGUgUmVhbDsKLXZvaWQgYmFyKFJlYWwpOyAgICAgICAgICAgICAgLy8gRG9lcyBub3QgdXNlIHRoZSBhYm92ZSB0eXBlbWFwIChkb3VibGUgIT0gUmVhbCkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0sIHRoZSA8dHQ+JWFwcGx5PC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSV0eXBlbWFwKHB5dGhvbixpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotdm9pZCBmb28oZG91YmxlKTsKLQotdHlwZWRlZiBkb3VibGUgUmVhbDsgICAgICAgICAvLyBVc2VzIHR5cGVtYXAKLSVhcHBseSBkb3VibGUgeyBSZWFsIH07ICAgICAgLy8gQXBwbGllcyBhbGwgImRvdWJsZSIgdHlwZW1hcHMgdG8gUmVhbC4KLXZvaWQgYmFyKFJlYWwpOyAgICAgICAgICAgICAgLy8gTm93IHVzZXMgdGhlIHNhbWUgdHlwZW1hcC4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41OCI+PC9hPjxoMz4gQ29udmVydGluZyAgUHl0aG9uIGxpc3QgdG8gYSBjaGFyICoqIDwvaDM+Ci1BIGNvbW1vbiBwcm9ibGVtIGluIG1hbnkgQyBwcm9ncmFtcyBpcyB0aGUgcHJvY2Vzc2luZyBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCB3aGljaCBhcmUgdXN1YWxseSBwYXNzZWQgaW4gYW4gYXJyYXkgb2YgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZ3MuICAgVGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIGFsbG93cyBhIFB5dGhvbiBsaXN0IG9iamVjdCB0byBiZSB1c2VkIGFzIGEgPHR0PmNoYXIgKio8L3R0PiBvYmplY3QuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBhcmd2Ci0KLS8vIFRoaXMgdGVsbHMgU1dJRyB0byB0cmVhdCBjaGFyICoqIGFzIGEgc3BlY2lhbCBjYXNlCi0ldHlwZW1hcChweXRob24saW4pIGNoYXIgKiogewotICAvKiBDaGVjayBpZiBpcyBhIGxpc3QgKi8KLSAgaWYgKFB5TGlzdF9DaGVjaygkc291cmNlKSkgewotICAgIGludCBzaXplID0gUHlMaXN0X1NpemUoJHNvdXJjZSk7Ci0gICAgaW50IGkgPSAwOwotICAgICR0YXJnZXQgPSAoY2hhciAqKikgbWFsbG9jKChzaXplKzEpKnNpemVvZihjaGFyICopKTsKLSAgICBmb3IgKGkgPSAwOyBpICZsdDsgc2l6ZTsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCAqbyA9IFB5TGlzdF9HZXRJdGVtKCRzb3VyY2UsaSk7Ci0gICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sobykpCi0JJHRhcmdldFtpXSA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5TGlzdF9HZXRJdGVtKCRzb3VyY2UsaSkpOwotICAgICAgZWxzZSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwibGlzdCBtdXN0IGNvbnRhaW4gc3RyaW5ncyIpOwotCWZyZWUoJHRhcmdldCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICAgICR0YXJnZXRbaV0gPSAwOwotICB9IGVsc2UgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIm5vdCBhIGxpc3QiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi0vLyBUaGlzIGNsZWFucyB1cCB0aGUgY2hhciAqKiBhcnJheSB3ZSBtYWxsb2MnZCBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwKLSV0eXBlbWFwKHB5dGhvbixmcmVlYXJnKSBjaGFyICoqIHsKLSAgZnJlZSgoY2hhciAqKSAkc291cmNlKTsKLX0KLQotLy8gVGhpcyBhbGxvd3MgYSBDIGZ1bmN0aW9uIHRvIHJldHVybiBhIGNoYXIgKiogYXMgYSBQeXRob24gbGlzdAotJXR5cGVtYXAocHl0aG9uLG91dCkgY2hhciAqKiB7Ci0gIGludCBsZW4saTsKLSAgbGVuID0gMDsKLSAgd2hpbGUgKCRzb3VyY2VbbGVuXSkgbGVuKys7Ci0gICR0YXJnZXQgPSBQeUxpc3RfTmV3KGxlbik7Ci0gIGZvciAoaSA9IDA7IGkgJmx0OyBsZW47IGkrKykgewotICAgIFB5TGlzdF9TZXRJdGVtKCR0YXJnZXQsaSxQeVN0cmluZ19Gcm9tU3RyaW5nKCRzb3VyY2VbaV0pKTsKLSAgfQotfQotCi0vLyBOb3cgYSBmZXcgdGVzdCBmdW5jdGlvbnMKLSVpbmxpbmUgJXsKLWludCBwcmludF9hcmdzKGNoYXIgKiphcmd2KSB7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChhcmd2W2ldKSB7Ci0gICAgICAgICBwcmludGYoImFyZ3ZbJWRdID0gJXNcbiIsIGksYXJndltpXSk7Ci0gICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQotCi0vLyBSZXR1cm5zIGEgY2hhciAqKiBsaXN0IAotCi1jaGFyICoqZ2V0X2FyZ3MoKSB7Ci0gICAgc3RhdGljIGNoYXIgKnZhbHVlc1tdID0geyAiRGF2ZSIsICJNaWtlIiwgIlN1c2FuIiwgIkpvaG4iLCAiTWljaGVsbGUiLCAwfTsKLSAgICByZXR1cm4gJmFtcDt2YWx1ZXNbMF07Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoaXMgbW9kdWxlIGlzIGNvbXBpbGVkLCBvdXIgd3JhcHBlZCBDIGZ1bmN0aW9ucyBub3cgb3BlcmF0ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZnJvbSBhcmd2IGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgcHJpbnRfYXJncyhbIkRhdmUiLCJNaWtlIiwiTWFyeSIsIkphbmUiLCJKb2huIl0pCi1hcmd2WzBdID0gRGF2ZQotYXJndlsxXSA9IE1pa2UKLWFyZ3ZbMl0gPSBNYXJ5Ci1hcmd2WzNdID0gSmFuZQotYXJndls0XSA9IEpvaG4KLTUKLSZndDsmZ3Q7Jmd0OyBnZXRfYXJncygpCi1bYERhdmUnLCBgTWlrZScsIGBTdXNhbicsIGBKb2huJywgYE1pY2hlbGxlJ10KLSZndDsmZ3Q7Jmd0OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PdXIgdHlwZS1tYXBwaW5nIG1ha2VzIHRoZSBQeXRob24gaW50ZXJmYWNlIHRvIHRoZXNlIGZ1bmN0aW9ucyBtb3JlIG5hdHVyYWwgYW5kIGVhc3kgdG8gdXNlLiAgICAgPHA+Ci08YSBuYW1lPSJuNTkiPjwvYT48aDM+IENvbnZlcnRpbmcgYSBQeXRob24gZmlsZSBvYmplY3QgdG8gYSBGSUxFICo8L2gzPgotSW4gb3VyIHByZXZpb3VzIGV4YW1wbGUgaW52b2x2aW5nIGdkLTEuMiwgd2UgaGFkIHRvIHdyaXRlIHdyYXBwZXJzIGFyb3VuZCA8dHQ+Zm9wZW4oKTwvdHQ+IGFuZCA8dHQ+ZmNsb3NlKCk8L3R0PiBzbyB0aGF0IHdlIGNvdWxkIHByb3ZpZGUgZ2Qgd2l0aCBhIDx0dD5GSUxFICo8L3R0PiBwb2ludGVyLiAgSG93ZXZlciwgd2UgY291bGQgaGF2ZSB1c2VkIGEgdHlwZW1hcCBsaWtlIHRoaXMgaW5zdGVhZCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gVHlwZSBtYXBwaW5nIGZvciBncmFiYmluZyBhIEZJTEUgKiBmcm9tIFB5dGhvbgotCi0ldHlwZW1hcChweXRob24saW4pIEZJTEUgKiB7Ci0gIGlmICghUHlGaWxlX0NoZWNrKCRzb3VyY2UpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTmVlZCBhIGZpbGUhIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotICAkdGFyZ2V0ID0gUHlGaWxlX0FzRmlsZSgkc291cmNlKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93LCB3ZSBjYW4gcmV3cml0ZSBvbmUgb2Ygb3VyIGVhcmxpZXIgZXhhbXBsZXMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFNpbXBsZSBnZCBwcm9ncmFtCi0KLWZyb20gZ2QgaW1wb3J0ICoKLQotaW0gPSBnZEltYWdlQ3JlYXRlKDY0LDY0KQotYmxhY2sgPSBnZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwwLDAsMCkKLXdoaXRlID0gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMjU1LDI1NSwyNTUpCi1nZEltYWdlTGluZShpbSwwLDAsNjMsNjMsd2hpdGUpCi1mID0gb3BlbigidGVzdC5naWYiLCJ3IikgICAgICAgICAgICAgICAjIENyZWF0ZSBhIFB5dGhvbiBmaWxlIG9iamVjdAotZ2RJbWFnZUdpZihpbSxmKSAgICAgICAgICAgICAgICAgICAgICAgIyBQYXNzIHRvIGEgQyBmdW5jdGlvbiBhcyBGSUxFICoKLWYuY2xvc2UoKQotZ2RJbWFnZURlc3Ryb3koaW0pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNjAiPjwvYT48aDM+IFVzaW5nIHR5cGVtYXBzIHRvIHJldHVybiBhcmd1bWVudHM8L2gzPgotQSBjb21tb24gcHJvYmxlbSBpbiBzb21lIEMgcHJvZ3JhbXMgaXMgdGhhdCB2YWx1ZXMgbWF5IGJlIHJldHVybmVkIGluIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBpbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogUmV0dXJucyBhIHN0YXR1cyB2YWx1ZSBhbmQgdHdvIHZhbHVlcyBpbiBvdXQxIGFuZCBvdXQyICovCi1pbnQgc3BhbShkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqb3V0MSwgZG91YmxlICpvdXQyKSB7Ci0JLi4uIERvIGEgYnVuY2ggb2Ygc3R1ZmYgLi4uCi0JKm91dDEgPSByZXN1bHQxOwotCSpvdXQyID0gcmVzdWx0MjsKLQlyZXR1cm4gc3RhdHVzOwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSBuYW1lZCB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIGhhbmRsZSB0aGlzIGNhc2UgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBvdXRhcmcKLQotLy8gVGhpcyB0ZWxscyBTV0lHIHRvIHRyZWF0IGFuIGRvdWJsZSAqIGFyZ3VtZW50IHdpdGggbmFtZSAnT3V0VmFsdWUnIGFzCi0vLyBhbiBvdXRwdXQgdmFsdWUuICBXZSdsbCBhcHBlbmQgdGhlIHZhbHVlIHRvIHRoZSBjdXJyZW50IHJlc3VsdCB3aGljaCAKLS8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBMaXN0IG9iamVjdCBieSBTV0lHLgotCi0ldHlwZW1hcChweXRob24sYXJnb3V0KSBkb3VibGUgKk91dFZhbHVlIHsKLQlQeU9iamVjdCAqbzsKLQlvID0gUHlGbG9hdF9Gcm9tRG91YmxlKCokc291cmNlKTsKLQlpZiAoKCEkdGFyZ2V0KSB8fCAoJHRhcmdldCA9PSBQeV9Ob25lKSkgewotCQkkdGFyZ2V0ID0gbzsKLQl9IGVsc2UgewotCQlpZiAoIVB5TGlzdF9DaGVjaygkdGFyZ2V0KSkgewotCQkJUHlPYmplY3QgKm8yID0gJHRhcmdldDsKLQkJCSR0YXJnZXQgPSBQeUxpc3RfTmV3KDApOwotCQkJUHlMaXN0X0FwcGVuZCgkdGFyZ2V0LG8yKTsKLQkJCVB5X1hERUNSRUYobzIpOwotCQl9Ci0JCVB5TGlzdF9BcHBlbmQoJHRhcmdldCxvKTsKLQkJUHlfWERFQ1JFRihvKTsKLQl9Ci19Ci1pbnQgc3BhbShkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqT3V0VmFsdWUsIGRvdWJsZSAqT3V0VmFsdWUpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaXRoIHRoaXMgdHlwZW1hcCwgd2UgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFueSByZXN1bHQgZXhpc3RzLiAgSWYgc28sIHdlIHR1cm4gaXQgaW50byBhIGxpc3QgYW5kIGFwcGVuZCBvdXIgbmV3IG91dHB1dCB2YWx1ZSB0byBpdC4gICBJZiB0aGlzIGlzIHRoZSBvbmx5IHJlc3VsdCwgd2Ugc2ltcGx5IHJldHVybiBpdCBub3JtYWxseS4gRm9yIG91ciBzYW1wbGUgZnVuY3Rpb24sIHRoZXJlIGFyZSB0aHJlZSBvdXRwdXQgdmFsdWVzIHNvIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhIGxpc3Qgb2YgMyBlbGVtZW50cy4gICBBcyB3cml0dGVuLCBvdXIgZnVuY3Rpb24gbmVlZHMgdG8gdGFrZSA0IGFyZ3VtZW50cywgdGhlIGxhc3QgdHdvIGJlaW5nIHBvaW50ZXJzIHRvIGRvdWJsZXMuICAgV2UgbWF5IG5vdCB3YW50IHRvIHBhc3MgYW55dGhpbmcgaW50byB0aGVzZSBhcmd1bWVudHMgaWYgdGhleSBhcmUgb25seSB1c2VkIHRvIGhvbGQgb3V0cHV0IHZhbHVlcyBzbyB3ZSBjb3VsZCBjaGFuZ2UgdGhpcyBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0ldHlwZW1hcChweXRob24saWdub3JlKSBkb3VibGUgKk91dFZhbHVlKGRvdWJsZSB0ZW1wKSB7Ci0JJHRhcmdldCA9ICZhbXA7dGVtcDsgICAgICAgLyogQXNzaWduIHRoZSBwb2ludGVyIHRvIGEgbG9jYWwgdmFyaWFibGUgKi8KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCBpbiBhIFB5dGhvbiBzY3JpcHQsICB3ZSBjb3VsZCBkbyB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgYSA9IHNwYW0oNCw1KQotJmd0OyZndDsmZ3Q7IHByaW50IGEKLVswLCAyLjQ1LCA1LjBdCi0mZ3Q7Jmd0OyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MSI+PC9hPjxoMz4gTWFwcGluZyBQeXRob24gdHVwbGVzIGludG8gc21hbGwgYXJyYXlzPC9oMz4KLUluIHNvbWUgYXBwbGljYXRpb25zLCBpdCBpcyBzb21ldGltZXMgZGVzaXJhYmxlIHRvIHBhc3Mgc21hbGwgYXJyYXlzIG9mIG51bWJlcnMgYXMgYXJndW1lbnRzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZXh0ZXJuIHZvaWQgc2V0X2RpcmVjdGlvbihkb3VibGUgYVs0XSk7ICAgICAgIC8vIFNldCBkaXJlY3Rpb24gdmVjdG9yCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgdG9vLCBjYW4gYmUgaGFuZGxlZCB1c2VkIHR5cGVtYXBzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEdyYWIgYSA0IGVsZW1lbnQgYXJyYXkgYXMgYSBQeXRob24gNC10dXBsZQotJXR5cGVtYXAocHl0aG9uLGluKSBkb3VibGVbNF0oZG91YmxlIHRlbXBbNF0pIHsgICAvLyB0ZW1wWzRdIGJlY29tZXMgYSBsb2NhbCB2YXJpYWJsZQotICBpbnQgaTsKLSAgaWYgKFB5VHVwbGVfQ2hlY2soJHNvdXJjZSkpIHsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoJHNvdXJjZSwiZGRkZCIsdGVtcCx0ZW1wKzEsdGVtcCsyLHRlbXArMykpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsInR1cGxlIG11c3QgaGF2ZSA0IGVsZW1lbnRzIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgJHRhcmdldCA9ICZhbXA7dGVtcFswXTsKLSAgfSBlbHNlIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCJleHBlY3RlZCBhIHR1cGxlLiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgYWxsb3dzIG91ciA8dHQ+c2V0X2RpcmVjdGlvbjwvdHQ+IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgc2V0X2RpcmVjdGlvbigoMC41LDAuMCwxLjAsLTAuMjUpKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TaW5jZSBvdXIgbWFwcGluZyBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGEgUHl0aG9uIHR1cGxlIGludG8gYSBDIGFycmF5LCBzdWNoIGFuIGFwcHJvYWNoIHdvdWxkIG5vdCBiZSByZWNvbW1lbmRlZCBmb3IgaHVnZSBhcnJheXMsIGJ1dCBmb3Igc21hbGwgc3RydWN0dXJlcywgdGhpcyBraW5kIG9mIHNjaGVtZSB3b3JrcyBmaW5lLjxwPgotPGEgbmFtZT0ibjYyIj48L2E+PGgzPiBBY2Nlc3NpbmcgYXJyYXkgc3RydWN0dXJlIG1lbWJlcnM8L2gzPgotQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2RlZmluZSBOQU1FTEVOICAgMzIKLXR5cGVkZWYgc3RydWN0IHsKLQljaGFyICAgbmFtZVtOQU1FTEVOXTsKLQkuLi4KLX0gUGVyc29uOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1CeSBkZWZhdWx0LCBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gdGhlIGhhbmRsZSB0aGUgbmFtZSBzdHJ1Y3R1cmUgc2luY2UgaXQncyBhbiBhcnJheSwgbm90IGEgcG9pbnRlci4gIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG1ha2UgdGhlIGFycmF5IG1lbWJlciByZWFkb25seS4gICAgSG93ZXZlciwgbWVtYmVyIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhpcyBtZW1iZXIgd3JpdGFibGUgZnJvbSBQeXRob24gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAobWVtYmVyaW4pIGNoYXJbTkFNRUxFTl0gewotCS8qIENvcHkgYXQgbW9zdCBOQU1FTEVOIGNoYXJhY3RlcnMgaW50byAkdGFyZ2V0ICovCi0Jc3RybmNweSgkdGFyZ2V0LCRzb3VyY2UsTkFNRUxFTik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW5ldmVyIGEgPHR0PmNoYXJbTkFNRUxFTl08L3R0PiB0eXBlIGlzIGVuY291bnRlcmVkIGluIGEgc3RydWN0dXJlIG9yIGNsYXNzLCB0aGlzIHR5cGVtYXAgcHJvdmlkZXMgYSBzYWZlIG1lY2hhbmlzbSBmb3Igc2V0dGluZyBpdHMgdmFsdWUuICAgQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gbWlnaHQgY2hvb3NlIHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIG5hbWUgd2FzIHRvbyBsb25nIHRvIGZpdCBpbnRvIHRoZSBmaWVsZC48cD4KLTxwPgotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIDx0dD5bTkFNRUxFTl08L3R0PiBhcnJheSBzaXplIGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwLiBBIGRhdGF0eXBlIGludm9sdmluZyBzb21lIG90aGVyIGtpbmQgb2YgYXJyYXkgd291bGQgbm90IGJlIGFmZmVjdGVkLiAgIEhvd2V2ZXIsIHlvdSBjYW4gd3JpdGUgYSB0eXBlbWFwIHRvIG1hdGNoIGFueSBzaXplZCBhcnJheSB1c2luZyB0aGUgPHR0PkFOWTwvdHQ+IGtleXdvcmQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAobWVtYmVyaW4pIGNoYXIgW0FOWV0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLCRkaW0wKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiwgPHR0PiRkaW0wPC90dD4gd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBhcnJheSBkaW1lbnNpb24uICA8cD4KLTxhIG5hbWU9Im42MyI+PC9hPjxoMz4gVXNlZnVsIEZ1bmN0aW9uczwvaDM+Ci1XaGVuIHdyaXRpbmcgdHlwZW1hcHMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byB3b3JrIGRpcmVjdGx5IHdpdGggUHl0aG9uIG9iamVjdHMgaW5zdGVhZCBvZiB1c2luZyB0aGUgY29udmVudGlvbmFsIDx0dD5QeUFyZ19QYXJzZVR1cGxlKCk8L3R0PiBmdW5jdGlvbiB0aGF0IGlzIHVzdWFsbHkgdXNlZCB3aGVuIHdyaXRpbmcgUHl0aG9uIGV4dGVuc2lvbnMuICAgSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHVzZWZ1bCBQeXRob24gZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3IgeW91IHRvIHVzZS48cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjIucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjMucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjQucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjUucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjYucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjcucG5nIj48YnI+Ci08L2NlbnRlcj48cD4KLTxwPgotPGEgbmFtZT0ibjY0Ij48L2E+PGgzPiBTdGFuZGFyZCAgdHlwZW1hcHM8L2gzPgotVGhlIGZvbGxvd2luZyB0eXBlbWFwcyBzaG93IGhvdyB0byBjb252ZXJ0IGEgZmV3IGNvbW1vbiBraW5kcyBvZiBvYmplY3RzIGJldHdlZW4gUHl0aG9uIGFuZCBDIChhbmQgdG8gZ2l2ZSBhIGJldHRlciBpZGVhIG9mIGhvdyB0eXBlbWFwcyB3b3JrKTxwPgotPGNlbnRlcj4KLTxpbWcgc3JjPSJjaDkudGFibGUuOC5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDkudGFibGUuOS5wbmciPjxicj4KLTwvY2VudGVyPjxwPgotPHA+Ci08YSBuYW1lPSJuNjUiPjwvYT48aDM+IFBvaW50ZXIgaGFuZGxpbmc8L2gzPgotU1dJRyBwb2ludGVycyBhcmUgbWFwcGVkIGludG8gUHl0aG9uIHN0cmluZ3MgY29udGFpbmluZyB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgYW5kIHR5cGUuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlYWQgcG9pbnRlciB2YWx1ZXMuPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoOS50YWJsZS4xMC5wbmciPgotPC9jZW50ZXI+PHA+Ci08cD4KLVRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHlwZW1hcCBtYWtlcyBhbiBhcmd1bWVudCBvZiAiPHR0PmNoYXIgKmJ1ZmZlcjwvdHQ+IiBhY2NlcHQgYSBwb2ludGVyIGluc3RlYWQgb2YgYSBOVUxMLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixpbikgY2hhciAqYnVmZmVyIHsKLQlQeU9iamVjdCAqbzsKLQljaGFyICAgICAqc3RyOwotCWlmICghUHlTdHJpbmdfQ2hlY2sobykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwibm90IGEgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvKTsKLQlpZiAoU1dJR19HZXRQdHIoc3RyLCAodm9pZCAqKikgJmFtcDskdGFyZ2V0LCAiJG1hbmdsZSIpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIm5vdCBhIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3RlIHRoYXQgdGhlIDx0dD4kbWFuZ2xlPC90dD4gdmFyaWFibGUgZ2VuZXJhdGVzIHRoZSB0eXBlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGF0eXBlIHVzZWQgaW4gdGhlIHR5cGVtYXAuPHA+Ci08cD4KLUJ5IG5vdyB5b3UgaG9wZWZ1bGx5IGhhdmUgdGhlIGlkZWEgdGhhdCB0eXBlbWFwcyBhcmUgYSBwb3dlcmZ1bCBtZWNoYW5pc20gZm9yIGJ1aWxkaW5nIG1vcmUgc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgV2hpbGUgd3JpdGluZyB0eXBlbWFwcyBjYW4gYmUgdGVjaG5pY2FsLCBtYW55IGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gZm9yIHlvdS4gIFNlZSB0aGUgVHlwZW1hcHMgY2hhcHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyBsaWJyYXJ5IGZpbGVzLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBJbXBsZW1lbnRpbmcgQyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gUHl0aG9uPC9oMj4KLU5vdyB0aGF0IHlvdSdyZSBhbiBleHBlcnQsICB3ZSB3aWxsIGltcGxlbWVudCAgc2ltcGxlIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGluIFB5dGhvbiBhbmQgdXNlIHRoZW0gaW4gYSBDKysgY29kZS48cD4KLTxwPgotTGV0J3Mgc2F5IHRoYXQgd2Ugd2FudGVkIHRvIHdyaXRlIGEgc2ltcGxlIEMrKyAyRCBwbG90dGluZyB3aWRnZXQgbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIGdkLTEuMiBsaWJyYXJ5LiAgIEEgY2xhc3MgZGVmaW5pdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENyZWF0ZSBhIEMrKyBwbG90dGluZyAid2lkZ2V0IiB1c2luZyB0aGUgZ2QtMS4yIGxpYnJhcnkgYnkgVGhvbWFzIEJvdXRlbGwKLS8vICAKLS8vIFRoaXMgZXhhbXBsZSBwcmltYXJpbHkgaWxsdXN0cmF0ZXMgaG93IGNhbGxiYWNrIGZ1bmN0aW9ucyBjYW4gYmUKLS8vIGltcGxlbWVudGVkIGluIFB5dGhvbi4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiZ2QuaCIKLX0KLQotdHlwZWRlZiBkb3VibGUgKCpQTE9URlVOQykoZG91YmxlLCB2b2lkICopOwotCi1jbGFzcyBQbG90V2lkZ2V0IHsKLXByaXZhdGU6Ci0gIGRvdWJsZSAgICAgIHhtaW4seW1pbix4bWF4LHltYXg7ICAgICAgICAgLy8gUGxvdHRpbmcgcmFuZ2UKLSAgUExPVEZVTkMgICAgY2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbgotICB2b2lkICAgICAgICpjbGllbnRkYXRhOyAgICAgICAgICAgICAgICAgIC8vIENsaWVudCBkYXRhIGZvciBjYWxsYmFjawotICBpbnQgICAgICAgICBucG9pbnRzOyAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBwb2ludHMgdG8gcGxvdAotICBpbnQgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgIC8vIEltYWdlIHdpZHRoCi0gIGludCAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgLy8gSW1hZ2UgaGVpZ2h0Ci0gIGludCAgICAgICAgIGJsYWNrLHdoaXRlOyAgICAgICAgICAgICAgICAgLy8gU29tZSBjb2xvcnMKLSAgZ2RJbWFnZVB0ciAgaW07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbWFnZSBwb2ludGVyCi0gIHZvaWQgICAgICAgIHRyYW5zZm9ybShkb3VibGUsZG91YmxlLGludCZhbXA7LGludCZhbXA7KTsKLXB1YmxpYzoKLSAgUGxvdFdpZGdldChpbnQgdywgaW50IGgsZG91YmxlLGRvdWJsZSxkb3VibGUsZG91YmxlKTsKLSAgflBsb3RXaWRnZXQoKTsKLSAgdm9pZCBzZXRfbWV0aG9kKFBMT1RGVU5DIGZ1bmMsIHZvaWQgKmNsaWVudGRhdGEpOyAgICAvLyBTZXQgY2FsbGJhY2sgbWV0aG9kCi0gIHZvaWQgc2V0X3JhbmdlKGRvdWJsZSxkb3VibGUsZG91YmxlLGRvdWJsZSk7ICAgICAgICAgLy8gU2V0IHBsb3QgcmFuZ2UKLSAgdm9pZCBzZXRfcG9pbnRzKGludCBucCkge25wb2ludHMgPSBucDt9ICAgICAgICAgICAgICAvLyBTZXQgbnVtYmVyIG9mIHBvaW50cwotICB2b2lkIHBsb3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBwbG90Ci0gIHZvaWQgc2F2ZShGSUxFICpmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSBhIHBsb3QgdG8gZGlzawotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHdpZGdldCBjbGFzcyBoaWRlcyBhbGwgb2YgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBzbyB0aGlzIGNvdWxkIGhhdmUganVzdCBhcyBlYXNpbHkgYmVlbiBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgT3BlbkdMLCBYMTEgb3Igc29tZSBvdGhlciBraW5kIG9mIGxpYnJhcnkuICAgV2hlbiB1c2VkIGluIEMrKywgdGhlIHdpZGdldCB3b3JrcyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNpbXBsZSBtYWluIHByb2dyYW0gdG8gdGVzdCBvdXQgb3VyIHdpZGdldAotI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0jaW5jbHVkZSAid2lkZ2V0LmgiCi0jaW5jbHVkZSAmbHQ7bWF0aC5oJmd0OwotCi0vLyBDYWxsYmFjayBmdW5jdGlvbgotZG91YmxlIG15X2Z1bmMoZG91YmxlIGEsIHZvaWQgKmNsaWVudGRhdGEpIHsKLSAgcmV0dXJuIHNpbihhKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIFBsb3RXaWRnZXQgKnc7Ci0gIEZJTEUgKmY7Ci0KLSAgdyA9IG5ldyBQbG90V2lkZ2V0KDUwMCw1MDAsLTYuMywtMS41LDYuMywxLjUpOwotICB3LSZndDtzZXRfbWV0aG9kKG15X2Z1bmMsMCk7ICAgICAgICAgICAgICAvLyBTZXQgY2FsbGJhY2sgZnVuY3Rpb24KLSAgdy0mZ3Q7cGxvdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBwbG90Ci0gIGYgPSBmb3BlbigicGxvdC5naWYiLCJ3Iik7Ci0gIHctJmd0O3NhdmUoZik7Ci0gIGZjbG9zZShmKTsKLSAgcHJpbnRmKCJ3cm90ZSBwbG90LmdpZlxuIik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdyBzdXBwb3NlIHRoYXQgd2Ugd2FudGVkIHRvIHVzZSBvdXIgd2lkZ2V0IGludGVyYWN0aXZlbHkgZnJvbSBQeXRob24uICBXaGlsZSBwb3NzaWJsZSwgaXQgaXMgZ29pbmcgdG8gYmUgZGlmZmljdWx0IGJlY2F1c2Ugd2Ugd291bGQgcmVhbGx5IGxpa2UgdG8gaW1wbGVtZW50IHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbiBQeXRob24sIG5vdCBDKysuICAgV2UgYWxzbyBkb24ndCB3YW50IHRvIGdvIGluIGFuZCBoYWNrIG9yIEMrKyBjb2RlIHRvIHN1cHBvcnQgdGhpcy4gICBGb3J0dW5hdGVseSwgeW91IGNhbiBkbyBpdCB3aXRoIFNXSUcgdXNpbmcgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gU1dJRyBpbnRlcmZhY2UgdG8gb3VyIFBsb3RXaWRnZXQgCi0lbW9kdWxlIHBsb3R3aWRnZXQKLSV7Ci0jaW5jbHVkZSAid2lkZ2V0LmgiCi0lfQotCi0vLyBHcmFiIGEgUHl0aG9uIGZ1bmN0aW9uIG9iamVjdCBhcyBhIFB5dGhvbiBvYmplY3QuCi0ldHlwZW1hcChweXRob24saW4pIFB5T2JqZWN0ICpweWZ1bmMgewotICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soJHNvdXJjZSkpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOZWVkIGEgY2FsbGFibGUgb2JqZWN0ISIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgJHRhcmdldCA9ICRzb3VyY2U7Ci19Ci0KLS8vIFR5cGUgbWFwcGluZyBmb3IgZ3JhYmJpbmcgYSBGSUxFICogZnJvbSBQeXRob24KLSV0eXBlbWFwKHB5dGhvbixpbikgRklMRSAqIHsKLSAgaWYgKCFQeUZpbGVfQ2hlY2soJHNvdXJjZSkpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOZWVkIGEgZmlsZSEiKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0gICR0YXJnZXQgPSBQeUZpbGVfQXNGaWxlKCRzb3VyY2UpOwotfQotCi0vLyBHcmFiIHRoZSBjbGFzcyBkZWZpbml0aW9uCi0laW5jbHVkZSB3aWRnZXQuaAotCi0lewotLyogVGhpcyBmdW5jdGlvbiBtYXRjaGVzIHRoZSBwcm90b3R5cGUgb2YgdGhlIG5vcm1hbCBDIGNhbGxiYWNrCi0gICBmdW5jdGlvbiBmb3Igb3VyIHdpZGdldC4gSG93ZXZlciwgd2UgdXNlIHRoZSBjbGllbnRkYXRhIHBvaW50ZXIKLSAgIGZvciBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGEgUHl0aG9uIGNhbGxhYmxlIG9iamVjdC4gKi8KLQotc3RhdGljIGRvdWJsZSBQeXRob25DYWxsQmFjayhkb3VibGUgYSwgdm9pZCAqY2xpZW50ZGF0YSkKLXsKLSAgIFB5T2JqZWN0ICpmdW5jLCAqYXJnbGlzdDsKLSAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICBkb3VibGUgICAgZHJlcyA9IDA7Ci0gICAKLSAgIGZ1bmMgPSAoUHlPYmplY3QgKikgY2xpZW50ZGF0YTsgICAgICAgICAgICAgICAvLyBHZXQgUHl0aG9uIGZ1bmN0aW9uCi0gICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiKGQpIixhKTsgICAgICAgICAgICAgLy8gQnVpbGQgYXJndW1lbnQgbGlzdAotICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYyxhcmdsaXN0KTsgICAgIC8vIENhbGwgUHl0aG9uCi0gICBQeV9ERUNSRUYoYXJnbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhc2ggYXJnbGlzdAotICAgaWYgKHJlc3VsdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIGVycm9ycywgcmV0dXJuIGRvdWJsZQotICAgICBkcmVzID0gUHlGbG9hdF9Bc0RvdWJsZShyZXN1bHQpOwotICAgfQotICAgUHlfWERFQ1JFRihyZXN1bHQpOwotICAgcmV0dXJuIGRyZXM7Ci19Ci0lfQotCi0vLyBBdHRhY2ggYSBuZXcgbWV0aG9kIHRvIG91ciBwbG90IHdpZGdldCBmb3IgYWRkaW5nIFB5dGhvbiBmdW5jdGlvbnMKLSVhZGRtZXRob2RzIFBsb3RXaWRnZXQgewotICAgLy8gU2V0IGEgUHl0aG9uIGZ1bmN0aW9uIG9iamVjdCBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAvLyBOb3RlIDogUHlPYmplY3QgKnB5ZnVuYyBpcyByZW1hcHBlZCB3aXRoIGEgdHlwZW1wYXAKLSAgIHZvaWQgc2V0X3B5bWV0aG9kKFB5T2JqZWN0ICpweWZ1bmMpIHsKLSAgICAgc2VsZi0mZ3Q7c2V0X21ldGhvZChQeXRob25DYWxsQmFjaywgKHZvaWQgKikgcHlmdW5jKTsKLSAgICAgUHlfSU5DUkVGKHB5ZnVuYyk7Ci0gICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIHRoaXMgaXMgY2VydGFpbmx5IG5vdCBhIHRyaXZpYWwgU1dJRyBpbnRlcmZhY2UgZmlsZSwgIHRoZSByZXN1bHRzIGFyZSBxdWl0ZSBjb29sLiAgTGV0J3MgdHJ5IG91dCBvdXIgbmV3IFB5dGhvbiBtb2R1bGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgTm93IHVzZSBvdXIgcGxvdHRpbmcgd2lkZ2V0IGluIHZhcmlldHkgb2Ygd2F5cwotCi1mcm9tIHBsb3R3aWRnZXQgaW1wb3J0ICoKLWZyb20gbWF0aCBpbXBvcnQgKgotCi0jIE1ha2UgYSBwbG90IHVzaW5nIGEgbm9ybWFsIFB5dGhvbiBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrCi1kZWYgZnVuYzEoeCk6Ci0JcmV0dXJuIDAuNSpzaW4oeCkrMC4yNSpzaW4oMip4KSswLjEyNSpjb3MoNCp4KQotCi1wcmludCAiTWFraW5nIHBsb3QxLmdpZi4uLiIKLSMgTWFrZSBhIHdpZGdldCBhbmQgc2V0IGNhbGxiYWNrCi13ID0gUGxvdFdpZGdldCg1MDAsNTAwLC0xMCwtMiwxMCwyKQotdy5zZXRfcHltZXRob2QoZnVuYzEpICAgICAgICAgICAgICAgICAgICAgIyBSZWdpc3RlciBvdXIgUHl0aG9uIGZ1bmN0aW9uCi13LnBsb3QoKQotZiA9IG9wZW4oInBsb3QxLmdpZiIsInciKQotdy5zYXZlKGYpCi1mLmNsb3NlKCkKLQotIyBNYWtlIGEgcGxvdCB1c2luZyBhbiBhbm9ueW1vdXMgZnVuY3Rpb24KLQotcHJpbnQgIk1ha2luZyBwbG90Mi5naWYuLi4iCi13MSA9IFBsb3RXaWRnZXQoNTAwLDUwMCwtNCwtMSw0LDE2KQotdzEuc2V0X3B5bWV0aG9kKGxhbWJkYSB4OiB4KngpICAgICAgICAgICAgIyBSZWdpc3RlciB4XjIgYXMgYSBjYWxsYmFjawotdzEucGxvdCgpCi1mID0gb3BlbigicGxvdDIuZ2lmIiwidyIpCi13MS5zYXZlKGYpCi1mLmNsb3NlKCkKLQotIyBNYWtlIGFub3RoZXIgcGxvdCB1c2luZyBhIGJ1aWx0LWluIGZ1bmN0aW9uCi0KLXByaW50ICJNYWtpbmcgcGxvdDMuZ2lmLi4uIgotdzIgPSBQbG90V2lkZ2V0KDUwMCw1MDAsLTcsLTEuNSw3LDEuNSkKLXcyLnNldF9weW1ldGhvZChzaW4pICAgICAgICAgICAgICAgICAgICAgICMgUmVnaXN0ZXIgc2luKHgpIGFzIGEgY2FsbGJhY2sKLXcyLnBsb3QoKQotZiA9IG9wZW4oInBsb3QzLmdpZiIsInciKQotdzIuc2F2ZShmKQotZi5jbG9zZSgpCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTxwPgotVGhlICJwbG90IiBtZXRob2QgZm9yIGVhY2ggd2lkZ2V0IGlzIHdyaXR0ZW4gZW50aXJlbHkgaW4gQysrIGFuZCBhc3N1bWVzIHRoYXQgaXQgaXMgY2FsbGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdyaXR0ZW4gaW4gQy9DKysuICAgTGl0dGxlIGRvZXMgaXQga25vdyB0aGF0IHdlIGhhdmUgYWN0dWFsbHkgaW1wbGVtZW50ZWQgdGhpcyBmdW5jdGlvbiBpbiBQeXRob24uICAgV2l0aCBhIGxpdHRsZSBtb3JlIHdvcmssIHdlIGNhbiBldmVuIHdyaXRlIGEgc2ltcGxlIGZ1bmN0aW9uIHBsb3R0aW5nIHRvb2wgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgUGxvdCBhIGZ1bmN0aW9uIGFuZCBzcGF3biB4dgotCi1pbXBvcnQgcG9zaXgKLWltcG9ydCBzeXMKLWltcG9ydCBzdHJpbmcKLWZyb20gcGxvdHdpZGdldCBpbXBvcnQgKgotZnJvbSBtYXRoIGltcG9ydCAqCi0KLWxpbmUgPSByYXdfaW5wdXQoIkVudGVyIGEgZnVuY3Rpb24gb2YgeCA6ICIpCi1yYW5nZXMgPSBzdHJpbmcuc3BsaXQocmF3X2lucHV0KCJFbnRlciB4bWluLHltaW4seG1heCx5bWF4IDoiKSwiLCIpCi0KLXByaW50ICJNYWtpbmcgYSBwbG90Li4uIgotdyA9IFBsb3RXaWRnZXQoNTAwLDUwMCxzdHJpbmcuYXRvZihyYW5nZXNbMF0pLHN0cmluZy5hdG9mKHJhbmdlc1sxXSksCi0gICAgICAgICAgICAgICBzdHJpbmcuYXRvZihyYW5nZXNbMl0pLHN0cmluZy5hdG9mKHJhbmdlc1szXSkpCi0KLSMgVHVybiB1c2VyIGlucHV0IGludG8gYSBQeXRob24gZnVuY3Rpb24KLWNvZGUgPSAiZGVmIGZ1bmMoeCk6IHJldHVybiAiICsgbGluZQotZXhlYyhjb2RlKQotCi13LnNldF9weW1ldGhvZChmdW5jKQotdy5wbG90KCkKLWYgPSBvcGVuKCJwbG90LmdpZiIsInciKQotdy5zYXZlKGYpCi1mLmNsb3NlKCkKLXBvc2l4LnN5c3RlbSgieHYgcGxvdC5naWYgJmFtcDsiKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDI+IE90aGVyIG9kZHMgYW5kIGVuZHM8L2gyPgotPGEgbmFtZT0ibjY2Ij48L2E+PGgzPiBBZGRpbmcgbmF0aXZlIFB5dGhvbiBmdW5jdGlvbnMgdG8gYSBTV0lHIG1vZHVsZTwvaDM+Ci1Tb21ldGltZXMgaXQgaXMgZGVzaXJhYmxlIHRvIGFkZCBhIG5hdGl2ZSBQeXRob24gbWV0aG9kIHRvIGEgU1dJRyB3cmFwcGVyIGZpbGUuICBTdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgUHl0aG9uL0MgZnVuY3Rpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlB5T2JqZWN0ICpzcGFtX3N5c3RlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLQljaGFyICpjb21tYW5kOwotCWludCBzdHM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsInMiLCZhbXA7Y29tbWFuZCkpCi0JCXJldHVybiBOVUxMOwotCXN0cyA9IHN5c3RlbShjb21tYW5kKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RzKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgYWRkZWQgdG8gYSBTV0lHIG1vZHVsZSB1c2luZyB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbmF0aXZlKHN5c3RlbSkgc3BhbV9zeXN0ZW07ICAgICAgICAvLyBDcmVhdGUgYSBjb21tYW5kIGNhbGxlZCBgc3lzdGVtJwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgZnVsbCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW5hdGl2ZShzeXN0ZW0pIFB5T2JqZWN0ICpzcGFtX3N5c3RlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1vcjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVuYXRpdmUoc3lzdGVtKSBleHRlcm4gUHlPYmplY3QgKnNwYW1fc3lzdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncyk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTMiPjwvYT48aDI+IFRoZSBnb3J5IGRldGFpbHMgb2Ygc2hhZG93IGNsYXNzZXM8L2gyPgotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgcHJvY2VzcyBieSB3aGljaCBTV0lHIGNyZWF0ZXMgc2hhZG93IGNsYXNzZXMgYW5kIHNvbWUgb2YgdGhlIG1vcmUgc3VidGxlIGFzcGVjdHMgb2YgdXNpbmcgdGhlbS48cD4KLTxhIG5hbWU9Im42NyI+PC9hPjxoMz4gQSBzaW1wbGUgc2hhZG93IGNsYXNzPC9oMz4KLUNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gZnJvbSBvdXIgcHJldmlvdXMgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBwZGUKLXN0cnVjdCBHcmlkMmQgewotICBHcmlkMmQoaW50IG5pLCBpbnQgbmopOwotICB+R3JpZDJkKCk7Ci0gIGRvdWJsZSAqKmRhdGE7Ci0gIGludCAgICAgIHhwb2ludHM7Ci0gIGludCAgICAgIHlwb2ludHM7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgU1dJRyBnZW5lcmF0ZWQgY2xhc3MgZm9yIHRoaXMgc3RydWN0dXJlIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBTV0lHLgotaW1wb3J0IHBkZWMKLWNsYXNzIEdyaWQyZFB0ciA6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsdGhpcyk6Ci0gICAgICAgIHNlbGYudGhpcyA9IHRoaXMKLSAgICAgICAgc2VsZi50aGlzb3duID0gMAotICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnRoaXNvd24gPT0gMSA6Ci0gICAgICAgICAgICBwZGVjLmRlbGV0ZV9HcmlkMmQoc2VsZi50aGlzKQotICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLG5hbWUsdmFsdWUpOgotICAgICAgICBpZiBuYW1lID09ICJkYXRhIiA6Ci0gICAgICAgICAgICBwZGVjLkdyaWQyZF9kYXRhX3NldChzZWxmLnRoaXMsdmFsdWUpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgbmFtZSA9PSAieHBvaW50cyIgOgotICAgICAgICAgICAgcGRlYy5HcmlkMmRfeHBvaW50c19zZXQoc2VsZi50aGlzLHZhbHVlKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIG5hbWUgPT0gInlwb2ludHMiIDoKLSAgICAgICAgICAgIHBkZWMuR3JpZDJkX3lwb2ludHNfc2V0KHNlbGYudGhpcyx2YWx1ZSkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLl9fZGljdF9fW25hbWVdID0gdmFsdWUKLSAgICBkZWYgX19nZXRhdHRyX18oc2VsZixuYW1lKToKLSAgICAgICAgaWYgbmFtZSA9PSAiZGF0YSIgOiAKLSAgICAgICAgICAgIHJldHVybiBwZGVjLkdyaWQyZF9kYXRhX2dldChzZWxmLnRoaXMpCi0gICAgICAgIGlmIG5hbWUgPT0gInhwb2ludHMiIDogCi0gICAgICAgICAgICByZXR1cm4gcGRlYy5HcmlkMmRfeHBvaW50c19nZXQoc2VsZi50aGlzKQotICAgICAgICBpZiBuYW1lID09ICJ5cG9pbnRzIiA6IAotICAgICAgICAgICAgcmV0dXJuIHBkZWMuR3JpZDJkX3lwb2ludHNfZ2V0KHNlbGYudGhpcykKLSAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bbmFtZV0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiJmx0O0MgR3JpZDJkIGluc3RhbmNlJmd0OyIKLWNsYXNzIEdyaWQyZChHcmlkMmRQdHIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZzAsYXJnMSkgOgotICAgICAgICBzZWxmLnRoaXMgPSBwZGVjLm5ld19HcmlkMmQoYXJnMCxhcmcxKQotICAgICAgICBzZWxmLnRoaXNvd24gPSAxCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42OCI+PC9hPjxoMz4gTW9kdWxlIG5hbWVzPC9oMz4KLVNoYWRvdyBjbGFzc2VzIGFyZSBidWlsdCB1c2luZyB0aGUgbG93LWxldmVsIFNXSUcgZ2VuZXJhdGVkIEMgaW50ZXJmYWNlLiAgVGhpcyBpbnRlcmZhY2UgaXMgbmFtZWQgIm1vZHVsZWMiIHdoZXJlICJtb2R1bGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIGEgU1dJRyBpbnRlcmZhY2UgZmlsZS4gICBUaGUgUHl0aG9uIGNvZGUgZm9yIHRoZSBzaGFkb3cgY2xhc3NlcyBpcyBjcmVhdGVkIGluIGEgZmlsZSAibW9kdWxlLnB5Ii4gIFRoaXMgaXMgdGhlIGZpbGUgdGhhdCBzaG91bGQgYmUgbG9hZGVkIHdoZW4gYSB1c2VyIHdhbnRzIHRvIHVzZSB0aGUgbW9kdWxlLjxwPgotPGEgbmFtZT0ibjY5Ij48L2E+PGgzPiBUd28gY2xhc3NlczwvaDM+Ci1Gb3IgZWFjaCBzdHJ1Y3R1cmUgb3IgY2xhc3MgZm91bmQgaW4gYW4gaW50ZXJmYWNlIGZpbGUsIFNXSUcgY3JlYXRlcyB0d28gUHl0aG9uIGNsYXNzZXMuICBJZiBhIGNsYXNzIGlzIG5hbWVkICI8dHQ+R3JpZDJkPC90dD4iLCBvbmUgb2YgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIG5hbWVkICI8dHQ+R3JpZDJkUHRyPC90dD4iIGFuZCB0aGUgb3RoZXIgbmFtZWQgIjx0dD5HcmlkMmQ8L3R0PiIuICBUaGUgPHR0PkdyaWQyZFB0cjwvdHQ+IGNsYXNzIGlzIHVzZWQgdG8gdHVybiB3cmFwIGEgUHl0aG9uIGNsYXNzIGFyb3VuZCBhbiBhbHJlYWR5IHByZWV4aXN0aW5nIDx0dD5HcmlkMmQ8L3R0PiBwb2ludGVyLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBncHRyID0gY3JlYXRlX2dyaWQyZCgpICAgICAgICAgIyBSZXR1cm5zIGEgR3JpZDJkIGZyb20gc29tZXdoZXJlCi0mZ3Q7Jmd0OyZndDsgZyA9IEdyaWQyZFB0cihncHRyKSAgICAgICAgICAgICMgVHVybiBpdCBpbnRvIGEgUHl0aG9uIGNsYXNzCi0mZ3Q7Jmd0OyZndDsgZy54cG9pbnRzCi01MAotJmd0OyZndDsmZ3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+R3JpZDJkPC90dD4gY2xhc3MsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyB1c2VkIHdoZW4geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IDx0dD5HcmlkMmQ8L3R0PiBvYmplY3QgZnJvbSBQeXRob24uICAgSW4gcmVhbGl0eSwgaXQgaW5oZXJpdHMgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgPHR0PkdyaWQyZFB0cjwvdHQ+LCBleGNlcHQgdGhhdCBpdHMgY29uc3RydWN0b3IgY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcgQysrIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3QuICAgIFRodXMsIGluIFB5dGhvbiwgdGhpcyB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBnID0gR3JpZDJkKDUwLDUwKSAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgR3JpZDJkCi0mZ3Q7Jmd0OyZndDsgZy54cG9pbnRzCi01MAotJmd0OyZndDsmZ3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgdHdvIGNsYXNzIG1vZGVsIGlzIGEgdHJhZGVvZmYuICBJbiBvcmRlciB0byBzdXBwb3J0IEMvQysrIHByb3Blcmx5LCBpdCBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0byBjcmVhdGUgUHl0aG9uIG9iamVjdHMgZnJvbSBib3RoIHByZS1leGlzdGluZyBDKysgb2JqZWN0cyBhbmQgdG8gY3JlYXRlIGVudGlyZWx5IG5ldyBDKysgb2JqZWN0cyBpbiBQeXRob24uICAgV2hpbGUgdGhpcyBtaWdodCBiZSBhY2NvbXBsaXNoZWQgdXNpbmcgYSBzaW5nbGUgY2xhc3MsIGl0IHdvdWxkIGNvbXBsaWNhdGUgdGhlIGhhbmRsaW5nIG9mIGNvbnN0cnVjdG9ycyBjb25zaWRlcmFibHkuICBUaGUgdHdvIGNsYXNzIG1vZGVsLCBvbiB0aGUgb3RoZXIgaGFuZCwgd29ya3MsIGlzIGNvbnNpc3RlbnQsIGFuZCBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gdXNlLiAgIEluIHByYWN0aWNlLCB5b3UgcHJvYmFibHkgd29uJ3QgZXZlbiBiZSBhd2FyZSB0aGF0IHRoZXJlIGFyZSB0d28gY2xhc3NlcyB3b3JraW5nIGJlaGluZCB0aGUgc2NlbmVzLjxwPgotPGEgbmFtZT0ibjcwIj48L2E+PGgzPiBUaGUgdGhpcyBwb2ludGVyPC9oMz4KLVdpdGhpbiBlYWNoIHNoYWRvdyBjbGFzcywgdGhlIG1lbWJlciAiPHR0PnRoaXM8L3R0PiIgY29udGFpbnMgdGhlIGFjdHVhbCBDL0MrKyBwb2ludGVyIHRvIHRoZSBvYmplY3QuICBZb3UgY2FuIGNoZWNrIHRoaXMgb3V0IHlvdXJzZWxmIGJ5IHR5cGluZyBzb21ldGhpbmcgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZyA9IEdyaWQyZCg1MCw1MCkKLSZndDsmZ3Q7Jmd0OyBwcmludCBnLnRoaXMKLV8xMDA4ZmU4X0dyaWQyZF9wCi0mZ3Q7Jmd0OyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRGlyZWN0IG1hbmlwdWxhdGlvbiBvZiB0aGUgIjx0dD50aGlzPC90dD4iIHBvaW50ZXIgaXMgZ2VuZXJhbGx5IGRpc2NvdXJhZ2VkLiBJbiBmYWN0IGZvcmdldCB0aGF0IHlvdSByZWFkIHRoaXMuPHA+Ci08YSBuYW1lPSJuNzEiPjwvYT48aDM+IE9iamVjdCBvd25lcnNoaXA8L2gzPgotT3duZXJzaGlwIGlzIGEgY3JpdGljYWwgaXNzdWUgd2hlbiBtaXhpbmcgQysrIGFuZCBQeXRob24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSBJIGNyZWF0ZSBhIG5ldyBvYmplY3QgaW4gQysrLCBidXQgbGF0ZXIgdXNlIGl0ICB0byBjcmVhdGUgYSBQeXRob24gb2JqZWN0LiAgSWYgdGhhdCBvYmplY3QgaXMgYmVpbmcgdXNlZCBlbHNld2hlcmUgaW4gdGhlIEMrKyBjb2RlLCB3ZSBjbGVhcmx5IGRvbid0IHdhbnQgUHl0aG9uIHRvIGRlbGV0ZSB0aGUgQysrIG9iamVjdCB3aGVuIHRoZSBQeXRob24gb2JqZWN0IGlzIGRlbGV0ZWQuICBTaW1pbGFybHksIHdoYXQgaWYgSSBjcmVhdGUgYSBuZXcgb2JqZWN0IGluIFB5dGhvbiwgYnV0IEMrKyBzYXZlcyBhIHBvaW50ZXIgdG8gaXQgYW5kIHN0YXJ0cyB1c2luZyBpdCByZXBlYXRlZGx5LiAgQ2xlYXJseSwgd2UgbmVlZCBzb21lIG5vdGlvbiBvZiB3aG8gb3ducyB3aGF0LiAgU2luY2Ugc29ydGluZyBvdXQgYWxsIG9mIHRoZSBwb3NzaWJpbGl0aWVzIGlzIHByb2JhYmx5IGltcG9zc2libGUsIFNXSUcgc2hhZG93IGNsYXNzZXMgYWx3YXlzIGhhdmUgYW4gYXR0cmlidXRlICI8dHQ+dGhpc293bjwvdHQ+IiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBQeXRob24gb3ducyBhbiBvYmplY3QuICBXaGVuZXZlciBhbiBvYmplY3QgaXMgY3JlYXRlZCBpbiBQeXRob24sIFB5dGhvbiB3aWxsIGJlIGdpdmVuIG93bmVyc2hpcCBieSBzZXR0aW5nIDx0dD50aGlzb3duIDwvdHQ+IHRvIDx0dD4gMTwvdHQ+LiAgV2hlbiBhIFB5dGhvbiBjbGFzcyBpcyBjcmVhdGVkIGZyb20gYSBwcmUtZXhpc3RpbmcgQy9DKysgcG9pbnRlciwgb3duZXJzaGlwIGlzIGFzc3VtZWQgdG8gYmVsb25nIHRvIHRoZSBDL0MrKyBjb2RlIGFuZCA8dHQ+dGhpc293bjwvdHQ+IHdpbGwgYmUgc2V0IHRvIDAuPHA+Ci08cD4KLU93bmVyc2hpcCBvZiBhbiBvYmplY3QgY2FuIGJlIGNoYW5nZWQgYXMgbmVjZXNzYXJ5IGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiA8dHQ+dGhpc293bjwvdHQ+LiAgV2hlbiBzZXQsIFB5dGhvbiB3aWxsIGNhbGwgdGhlIEMvQysrIGRlc3RydWN0b3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuICAgSWYgaXQgaXMgemVybywgUHl0aG9uIHdpbGwgbmV2ZXIgY2FsbCB0aGUgQy9DKysgZGVzdHJ1Y3Rvci48cD4KLTxhIG5hbWU9Im43MiI+PC9hPjxoMz4gQ29uc3RydWN0b3JzIGFuZCBEZXN0cnVjdG9yczwvaDM+Ci1DKysgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyB3aWxsIGJlIG1hcHBlZCBpbnRvIFB5dGhvbidzIDx0dD5fX2luaXRfXzwvdHQ+IGFuZCAgPHR0Pl9fZGVsX188L3R0PiBtZXRob2RzIHJlc3BlY3RpdmVseS4gIFNoYWRvdyBjbGFzc2VzIGFsd2F5cyBjb250YWluIHRoZXNlIG1ldGhvZHMgZXZlbiBpZiBubyBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMgd2VyZSBhdmFpbGFibGUgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUuICBUaGUgUHl0aG9uIGRlc3RydWN0b3Igd2lsbCBvbmx5IGNhbGwgYSBDL0MrKyBkZXN0cnVjdG9yIGlmIDx0dD5zZWxmLnRoaXNvd248L3R0PiBpcyBzZXQuPHA+Ci08YSBuYW1lPSJuNzMiPjwvYT48aDM+IE1lbWJlciBkYXRhPC9oMz4KLU1lbWJlciBkYXRhIG9mIGFuIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIFB5dGhvbidzIDx0dD5fX2dldGF0dHJfXzwvdHQ+IGFuZCA8dHQ+X19zZXRhdHRyX188L3R0PiBtZXRob2RzLjxwPgotPGEgbmFtZT0ibjc0Ij48L2E+PGgzPiBQcmludGluZzwvaDM+Ci1TV0lHIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIFB5dGhvbjx0dD4gX19yZXByX188L3R0PiBtZXRob2QgZm9yIGVhY2ggY2xhc3MuICBUaGlzIGZvcmNlcyB0aGUgY2xhc3MgdG8gYmUgcmVsYXRpdmVseSB3ZWxsLWJlaGF2ZWQgd2hlbiBwcmludGluZyBvciBiZWluZyB1c2VkIGludGVyYWN0aXZlbHkgaW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlci48cD4KLTxhIG5hbWU9Im43NSI+PC9hPjxoMz4gU2hhZG93IEZ1bmN0aW9uczwvaDM+Ci1TdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHZlY3Rvcgotc3RydWN0IFZlY3RvciB7Ci0JVmVjdG9yKCk7Ci0JflZlY3RvcigpOwotCWRvdWJsZSB4LHksejsKLX07Ci0KLVZlY3RvciBhZGR2KFZlY3RvciBhLCBWZWN0b3IgYik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUJ5IGRlZmF1bHQsIHRoZSBmdW5jdGlvbiA8dHQ+YWRkdjwvdHQ+IHdpbGwgb3BlcmF0ZSBvbiA8dHQ+VmVjdG9yPC90dD4gcG9pbnRlcnMsIG5vdCBQeXRob24gY2xhc3Nlcy4gIEhvd2V2ZXIsIHRoZSBTV0lHIFB5dGhvbiBtb2R1bGUgaXMgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCA8dHQ+VmVjdG9yPC90dD4gaGFzIGJlZW4gd3JhcHBlZCBpbnRvIGEgUHl0aG9uIGNsYXNzIHNvIGl0IHdpbGwgY3JlYXRlIHRoZSBmb2xsb3dpbmcgcmVwbGFjZW1lbnQgZm9yIHRoZSA8dHQ+YWRkdigpPC90dD4gZnVuY3Rpb24uPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZGVmIGFkZHYoYSxiKToKLQlyZXN1bHQgPSBWZWN0b3JQdHIodmVjdG9yYy5hZGR2KGEudGhpcyxiLnRoaXMpKQotCXJlc3VsdC50aGlzb3duID0gMQotCXJldHVybiByZXN1bHQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRnVuY3Rpb24gYXJndW1lbnRzIGFyZSBtb2RpZmllZCB0byB1c2UgdGhlICJ0aGlzIiBwb2ludGVyIG9mIGEgUHl0aG9uIFZlY3RvciBvYmplY3QuICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0IHdoaWNoIGhhcyBiZWVuIGFsbG9jYXRlZCBieSBtYWxsb2Mgb3IgbmV3ICh0aGlzIGJlaGF2aW9yIGlzIGRlc2NyaWJlZCBpbiB0aGUgY2hhcHRlciBvbiBTV0lHIGJhc2ljcyksIHNvIHdlIHNpbXBseSBjcmVhdGUgYSBuZXcgVmVjdG9yUHRyIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gIFNpbmNlIHRoZSByZXN1bHQgaW52b2x2ZWQgYW4gaW1wbGljaXQgbWFsbG9jLCB3ZSBzZXQgdGhlIG93bmVyc2hpcCB0byAxIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzdWx0IGlzIHRvIGJlIG93bmVkIGJ5IFB5dGhvbiBhbmQgdGhhdCBpdCBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIHRoZSBQeXRob24gb2JqZWN0IGlzIGRlbGV0ZWQuICBBcyBhIHJlc3VsdCwgb3BlcmF0aW9ucyBsaWtlIHRoaXMgIGFyZSBwZXJmZWN0bHkgbGVnYWwgYW5kIHJlc3VsdCBpbiBubyBtZW1vcnkgbGVha3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyB2ID0gYWRkKGFkZChhZGQoYWRkKGEsYiksYyksZCksZSkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU3Vic3RpdHV0aW9uIG9mIGNvbXBsZXggZGF0YXR5cGVzIG9jY3VycyBmb3IgYWxsIGZ1bmN0aW9ucyBhbmQgbWVtYmVyIGZ1bmN0aW9ucyBpbnZvbHZpbmcgc3RydWN0dXJlIG9yIGNsYXNzIGRlZmluaXRpb25zLiAgSXQgaXMgcmFyZWx5IG5lY2Vzc2FyeSB0byB1c2UgdGhlIGxvdy1sZXZlbCBDIGludGVyZmFjZSB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3Nlcy48cD4KLTxhIG5hbWU9Im43NiI+PC9hPjxoMz4gTmVzdGVkIG9iamVjdHM8L2gzPgotU1dJRyBzaGFkb3cgY2xhc3NlcyBzdXBwb3J0IG5lc3Rpbmcgb2YgY29tcGxleCBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCB0aGUgZm9sbG93aW5nIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHBhcnRpY2xlCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgVmVjdG9yKCk7Ci0gIGRvdWJsZSB4LHksejsKLX0gVmVjdG9yOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFBhcnRpY2xlKCk7Ci0gflBhcnRpY2xlKCk7Ci0gIFZlY3RvciByOwotICBWZWN0b3IgdjsKLSAgVmVjdG9yIGY7Ci0gIGludCAgICB0eXBlOwotfSBQYXJ0aWNsZTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiB0aGlzIGNhc2UgeW91IHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgbWVtYmVycyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgcCA9IFBhcnRpY2xlKCkKLSZndDsmZ3Q7Jmd0OyBwLnIueCA9IDAuMAotJmd0OyZndDsmZ3Q7IHAuci55ID0gLTEuNQotJmd0OyZndDsmZ3Q7IHAuci56ID0gMi4wCi0mZ3Q7Jmd0OyZndDsgcC52ID0gYWRkdih2MSx2MikKLSZndDsmZ3Q7Jmd0OyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTmVzdGluZyBvZiBvYmplY3RzIGlzIGltcGxlbWVudGVkIHVzaW5nIFB5dGhvbidzPHR0PiBfX3NldGF0dHJfXzwvdHQ+IGFuZCA8dHQ+X19nZXRhdHRyX188L3R0PiBmdW5jdGlvbnMuIEluIHRoaXMgY2FzZSwgdGhleSB3b3VsZCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgUGFydGljbGVQdHI6Ci0JLi4uCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsbmFtZSk6Ci0JCWlmIG5hbWUgPT0gInIiOgotCQkJcmV0dXJuIHBhcnRpY2xlYy5WZWN0b3JQdHIoUGFydGljbGVfcl9nZXQoc2VsZi50aGlzKSkKLQkJZWxpZiBuYW1lID09ICJ2IjoKLQkJCXJldHVybiBwYXJ0aWNsZWMuVmVjdG9yUHRyKFBhcnRpY2xlX3ZfZ2V0KHNlbGYudGhpcykpCi0JCS4uLgotCQotCWRlZiBfX3NldGF0dHJfXyhzZWxmLG5hbWUsdmFsdWUpOgotCQlpZiBuYW1lID09ICJyIjoKLQkJCXBhcnRpY2xlYy5QYXJ0aWNsZV9yX3NldChzZWxmLnRoaXMsdmFsdWUudGhpcykKLQkJZWxpZiBuYW1lID09ICJ2IjoKLQkJCXBhcnRpY2xlYy5QYXJ0aWNsZV92X3NldChzZWxmLnRoaXMsdmFsdWUudGhpcykKLQkJLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBhdHRyaWJ1dGVzIG9mIGFueSBnaXZlbiBvYmplY3QgYXJlIG9ubHkgY29udmVydGVkIGludG8gYSBQeXRob24gb2JqZWN0IHdoZW4gcmVmZXJlbmNlZC4gVGhpcyBhcHByb2FjaCBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIGZhc3RlciBpZiB5b3UgaGF2ZSBhIGxhcmdlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGFyZW4ndCBleGFtaW5lZCB2ZXJ5IG9mdGVuLCBhbmQgd29ya3Mgd2l0aCByZWN1cnNpdmUgc3RydWN0dXJlIGRlZmluaXRpb25zIHN1Y2ggYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBOb2RlIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBOb2RlICpuZXh0OwotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTmVzdGVkIHN0cnVjdHVyZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBhbHNvIHN1cHBvcnRlZCBieSBTV0lHLiBUaGVzZSB0eXBlcyBvZiBzdHJ1Y3R1cmVzIHRlbmQgdG8gYXJpc2UgZnJlcXVlbnRseSBpbiBkYXRhYmFzZSBhbmQgaW5mb3JtYXRpb24gcHJvY2Vzc2luZyBhcHBsaWNhdGlvbnMuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgeyAgCi0JdW5zaWduZWQgaW50IGRhdGFUeXBlOwotCXVuaW9uIHsKLQkJaW50ICAgICAgIGludHZhbDsKLQkJZG91YmxlICAgIGRvdWJsZXZhbDsKLQkJY2hhciAgICAgKmNoYXJ2YWw7Ci0JCXZvaWQgICAgICpwdHJ2YWx1ZTsKLQkJbG9uZyAgICAgIGxvbmd2YWw7Ci0JCXN0cnVjdCB7Ci0JCQlpbnQgICAgaTsKLQkJCWRvdWJsZSBmOwotCQkJdm9pZCAgICp2OwotCQkJY2hhciBuYW1lWzMyXTsKLSAgICAgICAgICAgICAgfSB2OwotCX0gdTsKLX0gVmFsdWVTdHJ1Y3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFjY2VzcyBpcyBwcm92aWRlZCBpbiBhbiBlbnRpcmVseSBuYXR1cmFsIG1hbm5lciw8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgdiA9IG5ld19WYWx1ZVN0cnVjdCgpICAgICAgICMgQ3JlYXRlIGEgVmFsdWVTdHJ1Y3Qgc29tZWhvdwotJmd0OyZndDsmZ3Q7IHYuZGF0YVR5cGUKLTEKLSZndDsmZ3Q7Jmd0OyB2LnUuaW50dmFsCi00NQotJmd0OyZndDsmZ3Q7IHYudS5sb25ndmFsCi00NQotJmd0OyZndDsmZ3Q7IHYudS52LnYgPSBfMF92b2lkX3AKLSZndDsmZ3Q7Jmd0OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBzdXBwb3J0IHRoZSBlbWJlZGRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMsIFNXSUcgaGFzIHRvIGV4dHJhY3QgdGhlIGludGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhbmQgdXNlIHRoZW0gdG8gY3JlYXRlIG5ldyBQeXRob24gY2xhc3Nlcy4gIEluIHRoaXMgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzaGFkb3cgY2xhc3NlcyBhcmUgY3JlYXRlZCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBDbGFzcyBjb3JyZXNwb25kaW5nIHRvIHVuaW9uIHUgbWVtYmVyCi1jbGFzcyBWYWx1ZVN0cnVjdF91IDoKLQkuLi4KLSMgQ2xhc3MgY29ycmVzcG9uZGluZyB0byBzdHJ1Y3QgdiBtZW1iZXIgb2YgdW5pb24gdQotY2xhc3MgVmFsdWVTdHJ1Y3RfdV92IDoKLQkuLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIG5hbWVzIG9mIHRoZSBuZXcgY2xhc3NlcyBhcmUgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgbWVtYmVyIG5hbWVzIG9mIGVhY2ggZW1iZWRkZWQgc3RydWN0dXJlLjxwPgotPGEgbmFtZT0ibjc3Ij48L2E+PGgzPiBJbmhlcml0YW5jZSBhbmQgc2hhZG93IGNsYXNzZXM8L2gzPgotU2luY2Ugc2hhZG93IGNsYXNzZXMgYXJlIGltcGxlbWVudGVkIGluIFB5dGhvbiwgeW91IGNhbiB1c2UgYW55IG9mIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBjbGFzc2VzIGFzIGEgYmFzZSBjbGFzcyBmb3IgbW9yZSBQeXRob24gY2xhc3Nlcy4gIEhvd2V2ZXIsIHlvdSBuZWVkIHRvIGJlIGV4dHJlbWVseSBjYXJlZnVsIHdoZW4gdXNpbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBXaGVuIG11bHRpcGxlIGluaGVyaXRhbmNlIGlzIHVzZWQsIGF0IG1vc3QgT05FIFNXSUcgZ2VuZXJhdGVkIHNoYWRvdyBjbGFzcyBjYW4gYmUgaW52b2x2ZWQuICBJZiBtdWx0aXBsZSBTV0lHIGdlbmVyYXRlZCBjbGFzc2VzIGFyZSB1c2VkIGluIGEgbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LCB5b3Ugd2lsbCBnZXQgbmFtZSBjbGFzaGVzIG9uIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIsIHRoZSA8dHQ+X19nZXRhdHRyX188L3R0PiBhbmQgPHR0Pl9fc2V0YXR0cl9fPC90dD4gZnVuY3Rpb25zIHdvbid0IHdvcmsgcHJvcGVybHkgYW5kIHRoZSB3aG9sZSB0aGluZyB3aWxsIHByb2JhYmx5IGNyYXNoIGFuZCBidXJuLiBQZXJoYXBzIGl0J3MgYmVzdCB0byB0aGluayBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSBhcyBhIGJpZyBoYW1tZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzb2x2ZSBhbG90IG9mIHByb2JsZW1zLCBidXQgaXQgaHVydHMgcXVpdGUgYWxvdCBpZiB5b3UgYWNjaWRlbnRseSBkcm9wIGl0IG9uIHlvdXIgZm9vdC4uLi4gPHA+Ci08YSBuYW1lPSJuNzgiPjwvYT48aDM+IE1ldGhvZHMgdGhhdCByZXR1cm4gbmV3IG9iamVjdHM8L2gzPgotQnkgZGVmYXVsdCBTV0lHIGFzc3VtZXMgdGhhdCBjb25zdHJ1Y3RvcnMgYXJlIHRoZSBvbmx5IGZ1bmN0aW9ucyByZXR1cm5pbmcgbmV3IG9iamVjdHMgdG8gUHl0aG9uLiAgSG93ZXZlciwgeW91IG1heSBoYXZlIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBhcyB3ZWxsLiAgRm9yIGV4YW1wbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLVZlY3RvciAqY3Jvc3NfcHJvZHVjdChWZWN0b3IgKnYxLCBWZWN0b3IgKnYyKSB7Ci0JVmVjdG9yICpyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JcmVzdWx0ID0gLi4uIGNvbXB1dGUgY3Jvc3MgcHJvZHVjdCAuLi4KLQlyZXR1cm4gcmVzdWx0OwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB0byBQeXRob24sIHdlIHdhbnQgUHl0aG9uIHRvIGFzc3VtZSBvd25lcnNoaXAuICBUaGUgYnJ1dGUgZm9yY2Ugd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2ltcGx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhpc293bi4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgdiA9IGNyb3NzX3Byb2R1Y3QoYSxiKQotJmd0OyZndDsmZ3Q7IHYudGhpc293biA9IDEgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdyBQeXRob24gb3ducyBpdAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1VbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIHVnbHkgYW5kIGl0IGRvZXNuJ3Qgd29yayBpZiB3ZSB1c2UgdGhlIHJlc3VsdCBhcyBhICB0ZW1wb3JhcnkgdmFsdWUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPncgPSB2ZWN0b3JfYWRkKGNyb3NzX3Byb2R1Y3QoYSxiKSxjKSAgICAgIyBSZXN1bHRzIGluIGEgbWVtb3J5IGxlYWsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSG93ZXZlciwgeW91IGNhbiBwcm92aWRlIGEgaGludCB0byBTV0lHIHdoZW4gd29ya2luZyB3aXRoIHN1Y2ggYSBmdW5jdGlvbiBhcyBzaG93biA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQyBGdW5jdGlvbiByZXR1cm5pbmcgYSBuZXcgb2JqZWN0Ci0lbmV3IFZlY3RvciAqY3Jvc3NfcHJvZHVjdChWZWN0b3IgKnYxLCBWZWN0b3IgKnYyKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4lbmV3PC90dD4gZGlyZWN0aXZlIG9ubHkgcHJvdmlkZXMgYSBoaW50IHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIG5ldyBvYmplY3QuICBUaGUgUHl0aG9uIG1vZHVsZSB3aWxsIGFzc2lnbiBwcm9wZXIgb3duZXJzaGlwIG9mIHRoZSBvYmplY3Qgd2hlbiB0aGlzIGlzIHVzZWQuPHA+Ci08YSBuYW1lPSJuNzkiPjwvYT48aDM+IFBlcmZvcm1hbmNlIGNvbmNlcm5zIGFuZCBoaW50czwvaDM+Ci1TaGFkb3cgY2xhc3NpbmcgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlIGEgY29udmVuaWVudCB3YXkgb2YgYWNjZXNzaW5nIEMvQysrIG9iamVjdHMgZnJvbSBQeXRob24uICAgSG93ZXZlciwgaWYgeW91J3JlIGRpcmVjdGx5IG1hbmlwdWxhdGluZyBodWdlIGFycmF5cyBvZiBjb21wbGV4IG9iamVjdHMgZnJvbSBQeXRob24sIHBlcmZvcm1hbmNlIG1heSBzdWZmZXIgZ3JlYXRseS4gIEluIHRoZXNlIGNhc2VzLCB5b3Ugc2hvdWxkIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGUgZnVuY3Rpb25zIGluIEMgb3IgdGhpbmtpbmcgb2Ygd2F5cyB0byBvcHRpbWl6ZSB0aGUgcHJvYmxlbS48cD4KLTxwPgotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHdheXMgdG8gb3B0aW1pemUgcHJvZ3JhbXMgdGhhdCB1c2Ugc2hhZG93IGNsYXNzZXMuICBDb25zaWRlciB0aGUgZm9sbG93aW5nICB0d28gY29kZSBmcmFnbWVudHMgaW52b2x2aW5nIHRoZSA8dHQ+UGFydGljbGU8L3R0PiBkYXRhIHN0cnVjdHVyZSBpbiBhIHByZXZpb3VzIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRlZiBmb3JjZTEocDEscDIpOgotCWR4ID0gcDIuci54IC0gcDEuci54Ci0JZHkgPSBwMi5yLnkgLSBwMS5yLnkKLQlkeiA9IHAyLnIueiAtIHAxLnIuegotCXIyID0gZHgqZHggKyBkeSpkeSArIGR6KmR6Ci0JZiA9IDEuMC8ocjIqbWF0aC5zcXJ0KHIyKSkKLQlwMS5mLnggPSBwMS5mLnggKyBmKmR4Ci0JcDIuZi54ID0gcDIuZi54IC0gZipkeAotCXAxLmYueSA9IHAxLmYueSArIGYqZHkKLQlwMi5mLnkgPSBwMi5mLnkgLSBmKmR5Ci0JcDEuZi56ID0gcDEuZi56ICsgZipkegotCXAyLmYueiA9IHAyLmYueiAtIGYqZHoKLQotZGVmIGZvcmNlMihwMSxwMik6Ci0JcjEgPSBwMS5yCi0JcjIgPSBwMi5yCi0JZHggPSByMi54IC0gcjEueAotCWR5ID0gcjIueSAtIHIxLnkKLQlkeiA9IHIyLnogLSByMS56Ci0JcjIgPSBkeCpkeCArIGR5KmR5ICsgZHoqZHoKLQlmID0gMS4wLyhyMiptYXRoLnNxcnQocjIpKQotCWYxID0gcDEuZgotCWYyID0gcDIuZgotCWYxLnggPSBmMS54ICsgZipkeAotCWYyLnggPSBmMi54IC0gZipkeAotCWYxLnkgPSBmMS55ICsgZipkeQotCWYyLnkgPSBmMi55IC0gZipkeQotCWYxLnogPSBmMS56ICsgZipkegotCWYyLnogPSBmMi56IC0gZipkegotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZmlyc3QgY2FsY3VsYXRpb24gc2ltcGx5IHdvcmtzIHdpdGggZWFjaCBQYXJ0aWNsZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuICBVbmZvcnR1bmF0ZWx5LCBpdCBwZXJmb3JtcyBhbG90IG9mIGRlcmVmZXJlbmNpbmcgb2Ygb2JqZWN0cy4gIElmIHRoZSBjYWxjdWxhdGlvbiBpcyByZXN0cnVjdHVyZWQgdG8gdXNlIHRlbXBvcmFyeSB2YXJpYWJsZXMgYXMgc2hvd24gaW4gZm9yY2UyLCBpdCB3aWxsIHJ1biBzaWduaWZpY2FudGx5IGZhc3Rlci0taW4gZmFjdCwgb24gbXkgbWFjaGluZSwgdGhlIHNlY29uZCBjb2RlIGZyYWdtZW50IHJ1bnMgbW9yZSB0aGFuIHR3aWNlIGFzIGZhc3QgYXMgdGhlIGZpcnN0IG9uZS48cD4KLTxwPgotSWYgcGVyZm9ybWFuY2UgaXMgZXZlbiBtb3JlIGNyaXRpY2FsIHlvdSBjYW4gdXNlIHRoZSBsb3ctbGV2ZWwgQyBpbnRlcmZhY2Ugd2hpY2ggZWxpbWluYXRlcyBhbGwgb2YgdGhlIG92ZXJoZWFkIG9mIGdvaW5nIHRocm91Z2ggUHl0aG9uJ3MgY2xhc3MgbWVjaGFuaXNtIChhdCB0aGUgZXhwZW5zZSBvZiBjb2Rpbmcgc2ltcGxpY2l0eSkuIFdoZW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIGFyZSB1c2VkLCB0aGUgbG93IGxldmVsIEMgaW50ZXJmYWNlIGNhbiBzdGlsbCBiZSB1c2VkIGJ5IGltcG9ydGluZyB0aGUgYG1vZHVsZWMnIG1vZHVsZSB3aGVyZSBgbW9kdWxlJyBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHlvdSB1c2VkIGluIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlLjxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDc6MDcgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvU1dJRy5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9TV0lHLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWI2ZGEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9TV0lHLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg2ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+U1dJRyBCYXNpY3M8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxhIG5hbWU9Im4wIj48L2E+PGgxPjMgU1dJRyBCYXNpY3M8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5SdW5uaW5nIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+U2ltcGxlIEMgZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMyI+UG9pbnRlcnMgYW5kIGNvbXBsZXggb2JqZWN0czwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5HZXR0aW5nIGRvd24gdG8gYnVzaW5lc3M8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+U3RydWN0dXJlcywgdW5pb25zLCBhbmQgb2JqZWN0IG9yaWVudGVkIEMgcHJvZ3JhbW1pbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNiI+QysrIHN1cHBvcnQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+T2JqZWN0aXZlLUM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+Q29uZGl0aW9uYWwgY29tcGlsYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuOSI+Q29kZSBJbnNlcnRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPkEgZ2VuZXJhbCBpbnRlcmZhY2UgYnVpbGRpbmcgc3RyYXRlZ3k8L2E+Ci08L3VsPgotCi08YSBuYW1lPSJuMSI+PC9hPjxoMj4gUnVubmluZyBTV0lHPC9oMj4KLVNXSUcgaXMgaW52b2tlZCBieSB0aGUgPHR0PnN3aWc8L3R0PiBjb21tYW5kLiBUaGlzIGNvbW1hbmQgaGFzIGEgbnVtYmVyIG9mIG9wdGlvbnMgaW5jbHVkaW5nOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN3aWcgJmx0O29wdGlvbnMmZ3Q7IGZpbGVuYW1lCi0KLS10Y2wgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBUY2wgd3JhcHBlcnMKLS10Y2w4ICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBUY2wgOC4wIHdyYXBwZXJzCi0tcGVybCAgICAgICAgICAgICAgICAgR2VuZXJhdGUgUGVybDUgd3JhcHBlcnMKLS1weXRob24gICAgICAgICAgICAgICBHZW5lcmF0ZSBQeXRob24gd3JhcHBlcnMKLS1wZXJsNCAgICAgICAgICAgICAgICBHZW5lcmF0ZSBQZXJsNCB3cmFwcGVycwotLWd1aWxlICAgICAgICAgICAgICAgIEdlbmVyYXRlIEd1aWxlIHdyYXBwZXJzCi0tZGFzY2lpICAgICAgICAgICAgICAgQVNDSUkgZG9jdW1lbnRhdGlvbgotLWRsYXRleCAgICAgICAgICAgICAgIExhVGVYIGRvY3VtZW50YXRpb24KLS1kaHRtbCAgICAgICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24KLS1kbm9uZSAgICAgICAgICAgICAgICBObyBkb2N1bWVudGF0aW9uCi0tYysrICAgICAgICAgICAgICAgICAgRW5hYmxlIEMrKyBoYW5kbGluZwotLW9iamMgICAgICAgICAgICAgICAgIEVuYWJsZSBPYmplY3RpdmUtQyBoYW5kbGluZy4KLS1JZGlyICAgICAgICAgICAgICAgICBTZXQgU1dJRyBpbmNsdWRlIGRpcmVjdG9yeQotLWxmaWxlICAgICAgICAgICAgICAgIEluY2x1ZGUgYSBTV0lHIGxpYnJhcnkgZmlsZS4KLS1jICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSByYXcgd3JhcHBlciBjb2RlIChvbWl0IHN1cHBvcnRpbmcgY29kZSkKLS12ICAgICAgICAgICAgICAgICAgICBWZXJib3NlIG1vZGUgKHBlcmhhcHMgb3Zlcmx5IHZlcmJvc2UpCi0tbyBvdXRmaWxlICAgICAgICAgICAgTmFtZSBvZiBvdXRwdXQgZmlsZQotLWQgZG9jZmlsZSAgICAgICAgICAgIFNldCBuYW1lIG9mIGRvY3VtZW50YXRpb24gZmlsZSAod2l0aG91dCBzdWZmaXgpCi0tbW9kdWxlIG5hbWUgICAgICAgICAgU2V0IG5hbWUgb2YgU1dJRyBtb2R1bGUKLS1Ec3ltYm9sICAgICAgICAgICAgICBEZWZpbmUgYSBzeW1ib2wKLS12ZXJzaW9uICAgICAgICAgICAgICBTaG93IFNXSUcncyB2ZXJzaW9uIG51bWJlcgotLWhlbHAgICAgICAgICAgICAgICAgIERpc3BsYXkgYWxsIG9wdGlvbnMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBpcyBvbmx5IGEgcGFydGlhbCBsaXN0IG9mIG9wdGlvbnMuIEEgZnVsbCBsaXN0aW5nIG9mIG9wdGlvbnMgY2FuIGJlIG9idGFpbmVkIGJ5IGludm9raW5nICI8dHQ+c3dpZyAtaGVscDwvdHQ+Ii4gRWFjaCB0YXJnZXQgbGFuZ3VhZ2UgbWF5IGhhdmUgYWRkaXRpb25hbCBvcHRpb25zIHdoaWNoIGNhbiBiZSBkaXNwbGF5ZWQgdXNpbmcgIjx0dD5zd2lnIC1sYW5nIC1oZWxwPC90dD4iIHdoZXJlIDx0dD4tbGFuZzwvdHQ+IGlzIG9uZSBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlcyBhYm92ZS48cD4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMz4gSW5wdXQgZm9ybWF0PC9oMz4KLUFzIGlucHV0LCBTV0lHIHRha2VzIGEgZmlsZSBjb250YWluaW5nIEFOU0kgQy9DKysgZGVjbGFyYXRpb25zLiBUaGlzIGZpbGUgbWF5IGJlIGEgc3BlY2lhbCAiaW50ZXJmYWNlIGZpbGUiICh1c3VhbGx5IGdpdmVuIGEgLmkgc3VmZml4KSwgYSBDIGhlYWRlciBmaWxlIG9yIGEgQyBzb3VyY2UgZmlsZS4gVGhlIG1vc3QgY29tbW9uIG1ldGhvZCBvZiB1c2luZyBTV0lHIGlzIHdpdGggYSBzcGVjaWFsIGludGVyZmFjZSBmaWxlLiBUaGVzZSBmaWxlcyBjb250YWluIEFOU0kgQyBkZWNsYXJhdGlvbnMgbGlrZSBhIGhlYWRlciBmaWxlLCBidXQgYWxzbyBjb250YWluIFNXSUcgZGlyZWN0aXZlcyBhbmQgZG9jdW1lbnRhdGlvbi4gSW50ZXJmYWNlIGZpbGVzIHVzdWFsbHkgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdCA6PHA+Ci08cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIG15bW9kdWxlIAotJXsKLSNpbmNsdWRlICJteWhlYWRlci5oIgotJX0KLS8vIE5vdyBsaXN0IEFOU0kgQyB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgKGlmIHN1cHBsaWVkKSBtdXN0IGFsd2F5cyBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCBDIGRlY2xhcmF0aW9uIG9yIGJlIHN1cHBsaWVkIG9uIHRoZSBTV0lHIGNvbW1hbmQgbGluZSB1c2luZyB0aGUgPHR0Pi1tb2R1bGU8L3R0PiBvcHRpb24gKFdoZW4gdGhlIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCB3aWxsIG92ZXJyaWRlIGFueSBtb2R1bGUgbmFtZSBwcmVzZW50IGluIGEgZmlsZSkuIEV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSA8dHQ+JXssJTwvdHQ+fSBibG9jayBpcyBjb3BpZWQgdmVyYmF0aW0gaW50byB0aGUgcmVzdWx0aW5nIG91dHB1dCBmaWxlLiBUaGUgPHR0PiV7LCV9PC90dD4gYmxvY2sgaXMgb3B0aW9uYWwsIGJ1dCBtb3N0IGludGVyZmFjZSBmaWxlcyB1c2Ugb25lIHRvIGluY2x1ZGUgdGhlIHByb3BlciBoZWFkZXIgZmlsZXMuPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDM+IFNXSUcgT3V0cHV0PC9oMz4KLUJ5IGRlZmF1bHQgYW4gaW50ZXJmYWNlIGZpbGUgd2l0aCB0aGUgbmFtZSA8dHQ+bXlmaWxlLmk8L3R0PiB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gYSBmaWxlIGNhbGxlZCA8dHQ+bXlmaWxlX3dyYXAuYzwvdHQ+LiBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIDx0dD4tbzwvdHQ+IG9wdGlvbi4gV2hlbiB3b3JraW5nIHdpdGggc29tZSBDKysgY29tcGlsZXJzLCB0aGUgPHR0Pi1vPC90dD4gb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIG91dHB1dCBmaWxlIGEgcHJvcGVyIEMrKyBzdWZmaXguIFRoZSBvdXRwdXQgZmlsZSB1c3VhbGx5IGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBpcyBuZWVkZWQgdG8gYnVpbGQgYSB3b3JraW5nIG1vZHVsZSBmb3IgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuIENvbXBpbGUgaXQgYWxvbmcgd2l0aCB5b3VyIEMgcHJvZ3JhbSwgbGluayBpdCwgYW5kIHlvdSBzaG91bGQgYmUgcmVhZHkgdG8gcnVuLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgzPiBDb21tZW50czwvaDM+Ci1DIGFuZCBDKysgc3R5bGUgY29tbWVudHMgbWF5IGJlIHBsYWNlZCBpbiBpbnRlcmZhY2UgZmlsZXMsIGJ1dCB0aGVzZSBhcmUgdXNlZCB0byBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gc2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMuIE90aGVyd2lzZSwgU1dJRyB0aHJvd3Mgb3V0IGFsbCBjb21tZW50cyBzbyB5b3UgY2FuIHVzZSBhIEMrKyBzdHlsZSBjb21tZW50IGV2ZW4gaWYgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGZpbGUgaXMgY29tcGlsZWQgd2l0aCB0aGUgQyBjb21waWxlci4gPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDM+IEMgUHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXM8L2gzPgotU1dJRyBkb2VzIG5vdCBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLiBJZiB5b3VyIGlucHV0IGZpbGUgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiB0aGUgQyBwcmVwcm9jZXNzb3IsIFNXSUcgd2lsbCBwcm9iYWJseSBoYXRlIGl0LiBIb3dldmVyLCBTV0lHIGRvZXMgcmVjb2duaXplIGEgZmV3IEMgcHJlcHJvY2Vzc29yIGNvbnN0cnVjdHMgdGhhdCBhcmUgcXVpdGUgY29tbW9uIGluIEMgY29kZSA6PHA+Ci08cD4KLTx1bD4KLTxsaT48dHQ+I2RlZmluZTwvdHQ+LiBVc2VkIHRvIGNyZWF0ZSBjb25zdGFudHMKLTxsaT48dHQ+I2lmZGVmLCNpZm5kZWYsI2Vsc2UsI2VuZGlmPC90dD4sIDx0dD4jaWYsICNlbGlmPC90dD4uIFVzZWQgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uCi08L3VsPgotPHA+Ci1BbGwgb3RoZXIgQyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBhcmUgaWdub3JlZCBieSBTV0lHIChpbmNsdWRpbmcgbWFjcm9zIGNyZWF0ZWQgdXNpbmcgPHR0PiNkZWZpbmU8L3R0PikuIDxwPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgzPiBTV0lHIERpcmVjdGl2ZXM8L2gzPgotU1dJRyBkaXJlY3RpdmVzIGFyZSBhbHdheXMgcHJlY2VkZWQgYnkgYSAiPHR0PiU8L3R0PiIgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIG5vcm1hbCBDIGRpcmVjdGl2ZXMgYW5kIGRlY2xhcmF0aW9ucy4gVGhlcmUgYXJlIGFib3V0IHR3byBkb3plbiBkaWZmZXJlbnQgZGlyZWN0aXZlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdpdmUgU1dJRyBoaW50cywgcHJvdmlkZSBhbm5vdGF0aW9uLCBhbmQgY2hhbmdlIFNXSUcncyBiZWhhdmlvciBpbiBzb21lIHdheSBvciBhbm90aGVyLiA8cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gTGltaXRhdGlvbnMgaW4gdGhlIFBhcnNlciAoYW5kIHZhcmlvdXMgdGhpbmdzIHRvIGtlZXAgaW4gbWluZCk8L2gzPgotSXQgd2FzIG5ldmVyIG15IGludGVudCB0byB3cml0ZSBhIGZ1bGwgQy9DKysgcGFyc2VyLiBUaGVyZWZvcmUgU1dJRyBoYXMgYSBudW1iZXIgb2YgbGltaXRhdGlvbnMgdG8ga2VlcCBpbiBtaW5kLjxwPgotPHA+Ci08dWw+Ci08bGk+RnVuY3Rpb25zIHdpdGggdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyAoaWUuICIuLi4iKSBhcmUgbm90IHN1cHBvcnRlZC4KLTxsaT5Db21wbGV4IGRlY2xhcmF0aW9ucyBzdWNoIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBhcnJheXMgYXJlIHByb2JsZW1hdGljLiBZb3UgbWF5IG5lZWQgdG8gcmVtb3ZlIHRoZXNlIGZyb20gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgb3IgaGlkZSB0aGVtIHdpdGggYSB0eXBlZGVmLgotPGxpPkMrKyBzb3VyY2UgY29kZSAod2hhdCB3b3VsZCBhcHBlYXIgaW4gYSAuQyBmaWxlKSBpcyBlc3BlY2lhbGx5IHByb2JsZW1hdGljLiBSdW5uaW5nIFNXSUcgb24gQysrIHNvdXJjZSBjb2RlIGlzIGhpZ2hseSBkaXNjb3VyYWdlZC4KLTxsaT5Nb3JlIHNvcGhpc3RpY2F0ZWQgZmVhdHVyZXMgb2YgQysrIHN1Y2ggYXMgdGVtcGxhdGVzIGFuZCBvcGVyYXRvciBvdmVybG9hZGluZyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHNlZSB0aGUgc2VjdGlvbiBvbiB1c2luZyBTV0lHIHdpdGggQysrIGZvciBtb3JlIGRldGFpbHMuIFdoZW4gZW5jb3VudGVyZWQsIFNXSUcgbWF5IGlzc3VlIGEgd2FybmluZyBtZXNzYWdlIG9yIGEgc3ludGF4IGVycm9yIGlmIGl0IGNhbid0IGZpZ3VyZSBvdXQgeW91IGFyZSB0cnlpbmcgdG8gZG8uCi08L3VsPgotPHA+Ci1NYW55IG9mIHRoZXNlIGxpbWl0YXRpb25zIG1heSBiZSBlbGltaW5hdGVkIGluIGZ1dHVyZSByZWxlYXNlcy4gSXQgaXMgd29ydGggbm90aW5nIHRoYXQgbWFueSBvZiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIGNvbXBsZXggZGVjbGFyYXRpb25zIGNhbiBzb21ldGltZXMgYmUgZml4ZWQgYnkgY2xldmVyIHVzZSBvZiA8dHQ+dHlwZWRlZjwvdHQ+LjxwPgotPHA+Ci1JZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgU1dJRyBjYW4gaGFuZGxlIGEgcGFydGljdWxhciBkZWNsYXJhdGlvbiwgdGhlIGJlc3QgdGhpbmcgdG8gZG8gaXMgdHJ5IGl0IGFuZCBzZWUuIFNXSUcgd2lsbCBjb21wbGFpbiBsb3VkbHkgaWYgaXQgY2FuJ3QgZmlndXJlIG91dCB3aGF0J3MgZ29pbmcgb24uIFdoZW4gZXJyb3JzIG9jY3VyLCB5b3UgY2FuIGVpdGhlciByZW1vdmUgdGhlIG9mZmVuZGluZyBkZWNsYXJhdGlvbiwgY29uZGl0aW9uYWxseSBjb21waWxlIGl0IG91dCAoU1dJRyBkZWZpbmVzIGEgc3ltYm9sIDx0dD5TV0lHPC90dD4gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhpcyksIG9yIHdyaXRlIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtLiA8cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBTaW1wbGUgQyBmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50czwvaDI+Ci1TV0lHIHN1cHBvcnRzIGp1c3QgYWJvdXQgYW55IEMgZnVuY3Rpb24sIHZhcmlhYmxlLCBvciBjb25zdGFudCBpbnZvbHZpbmcgYnVpbHQtaW4gQyBkYXRhdHlwZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLQotZXh0ZXJuIGRvdWJsZSBzaW4oZG91YmxlIHgpOwotZXh0ZXJuIGludCBzdHJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCBNeV92YXJpYWJsZTsKLSNkZWZpbmUgU1RBVFVTIDUwCi1jb25zdCBjaGFyICpWRVJTSU9OPSIxLjEiOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci13aWxsIGNyZWF0ZSB0d28gY29tbWFuZHMgY2FsbGVkICI8dHQ+c2luPC90dD4iIGFuZCAiPHR0PnN0cmNtcDwvdHQ+IiwgYSBnbG9iYWwgdmFyaWFibGUgIjx0dD5NeV92YXJpYWJsZTwvdHQ+IiwgYW5kIHR3byBjb25zdGFudHMgIjx0dD5TVEFUVVM8L3R0PiIgYW5kICI8dHQ+VkVSU0lPTjwvdHQ+Ii4gVGhpbmdzIHdvcmsgYWJvdXQgbGlrZSB5b3Ugd291bGQgZXhwZWN0LiBGb3IgZXhhbXBsZSwgaW4gVGNsIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNpbiAzCi01LjIzMzU5NTYKLSUgc3RyY21wIERhdmUgTWlrZQotLTEKLSUgcHV0cyAkTXlfdmFyaWFibGUKLTQyCi0lIHB1dHMgJFNUQVRVUwotNTAKLSUgcHV0cyAkVkVSU0lPTgotMS4xCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBtYWluIGNvbmNlcm4gd2hlbiB3b3JraW5nIHdpdGggc2ltcGxlIGZ1bmN0aW9ucyBpcyBTV0lHJ3MgdHJlYXRtZW50IG9mIGJhc2ljIGRhdGF0eXBlcy4gVGhpcyBpcyBkZXNjcmliZWQgbmV4dC48cD4KLTxhIG5hbWU9Im4xNyI+PC9hPjxoMz4gSW50ZWdlcnM8L2gzPgotU1dJRyBtYXBzIHRoZSBmb2xsb3dpbmcgQyBkYXRhdHlwZXMgaW50byBpbnRlZ2VycyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50Ci1zaG9ydAotbG9uZwotdW5zaWduZWQKLXNpZ25lZAotdW5zaWduZWQgc2hvcnQKLXVuc2lnbmVkIGxvbmcKLXVuc2lnbmVkIGNoYXIKLXNpZ25lZCBjaGFyCi1ib29sCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNjcmlwdGluZyBsYW5ndWFnZXMgdXN1YWxseSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgaW50ZWdlciB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gZWl0aGVyIHRoZSA8dHQ+aW50PC90dD4gb3IgPHR0Pmxvbmc8L3R0PiBkYXRhdHlwZSBpbiBDLiBXaGVuIGNvbnZlcnRpbmcgZnJvbSBDLCBhbGwgb2YgdGhlIGFib3ZlIGRhdGF0eXBlcyBhcmUgY2FzdCBpbnRvIHRoZSByZXByZXNlbnRhdGlvbiB1c2VkIGJ5IHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiBUaHVzLCBhIDE2IGJpdCBzaG9ydCBpbiBDIG1heSBiZSBjb252ZXJ0ZWQgdG8gYSAzMiBiaXQgaW50ZWdlci4gV2hlbiBpbnRlZ2VycyBhcmUgY29udmVydGVkIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBiYWNrIGludG8gQywgdGhlIHZhbHVlIHdpbGwgYmUgY2FzdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBUaGUgdmFsdWUgd2lsbCBiZSB0cnVuY2F0ZWQgaWYgaXQgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIEMgZGF0YXR5cGUuIFRoaXMgdHJ1bmNhdGlvbiBpcyBub3QgY3VycmVudGx5IGNoZWNrZWQuPHA+Ci08cD4KLVRoZSA8dHQ+dW5zaWduZWQgY2hhcjwvdHQ+IGFuZCA8dHQ+c2lnbmVkIGNoYXI8L3R0PiBkYXRhdHlwZXMgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgdHJlYXRlZCBhcyBpbnRlZ2VycyBieSBTV0lHLiBOb3JtYWxseSwgdGhlIDx0dD5jaGFyPC90dD4gZGF0YXR5cGUgaXMgbWFwcGVkIGFzIGFuIEFTQ0lJIHN0cmluZy4gPHA+Ci08cD4KLVRoZSA8dHQ+Ym9vbDwvdHQ+IGRhdGF0eXBlIGlzIGNhc3QgdG8gYW5kIGZyb20gYW4gaW50ZWdlciB2YWx1ZSBvZiAwIGFuZCAxLjxwPgotPHA+Ci1Tb21lIGNhcmUgaXMgaW4gb3JkZXIgZm9yIGxhcmdlIGludGVnZXIgdmFsdWVzLiBNb3N0IHNjcmlwdGluZyBsYW5ndWFnZSB1c2UgMzIgYml0IGludGVnZXJzIHNvIG1hcHBpbmcgYSA2NCBiaXQgbG9uZyBpbnRlZ2VyIG1heSBsZWFkIHRvIHRydW5jYXRpb24gZXJyb3JzLiBTaW1pbGFyIHByb2JsZW1zIG1heSBhcmlzZSB3aXRoIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VycyB0aGF0IG1heSBzaG93IHVwIGFzIG5lZ2F0aXZlIG51bWJlcnMuIEFzIGEgcnVsZSBvZiB0aHVtYiwgdGhlIDx0dD5pbnQ8L3R0PiBkYXRhdHlwZSBhbmQgYWxsIHZhcmlhdGlvbnMgb2YgPHR0PmNoYXI8L3R0PiBhbmQgPHR0PnNob3J0PC90dD4gZGF0YXR5cGVzIGFyZSBzYWZlIHRvIHVzZS4gRm9yIDx0dD51bnNpZ25lZCBpbnQ8L3R0PiBhbmQgPHR0Pmxvbmc8L3R0PiBkYXRhdHlwZXMsIHlvdSBzaG91bGQgdmVyaWZ5IHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBvZiB5b3VyIHByb2dyYW0gYWZ0ZXIgd3JhcHBpbmcgaXQgd2l0aCBTV0lHLjxwPgotPGEgbmFtZT0ibjE4Ij48L2E+PGgzPiBGbG9hdGluZyBQb2ludDwvaDM+Ci1TV0lHIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBmbG9hdGluZyBwb2ludCB0eXBlcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotZmxvYXQKLWRvdWJsZQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1GbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBtYXBwZWQgdG8gYW5kIGZyb20gdGhlIG5hdHVyYWwgcmVwcmVzZW50YXRpb24gb2YgZmxvYXRzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBhIDx0dD5kb3VibGU8L3R0PiBleGNlcHQgaW4gVGNsIDcueCB3aGljaCB1c2VzIGNoYXJhY3RlciBzdHJpbmdzLiBUaGUgcmFyZWx5IHVzZWQgZGF0YXR5cGUgb2YgImxvbmcgZG91YmxlIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNXSUcuPHA+Ci08YSBuYW1lPSJuMTkiPjwvYT48aDM+IENoYXJhY3RlciBTdHJpbmdzPC9oMz4KLVRoZSA8dHQ+Y2hhcjwvdHQ+IGRhdGF0eXBlIGlzIG1hcHBlZCBpbnRvIGEgTlVMTCB0ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZyB3aXRoIGEgc2luZ2xlIGNoYXJhY3Rlci4gV2hlbiB1c2VkIGluIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGl0IHdpbGwgc2hvdyB1cCBhcyBhIHRpbnkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciB2YWx1ZS4gV2hlbiBjb252ZXJ0aW5nIHRoZSB2YWx1ZSBiYWNrIGludG8gQywgU1dJRyB3aWxsIHRha2UgYSBjaGFyYWN0ZXIgc3RyaW5nIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgc3RyaXAgb2ZmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYXMgdGhlIGNoYXIgdmFsdWUuIFRodXMgaWYgeW91IHRyeSB0byBhc3NpZ25lZCB0aGUgdmFsdWUgImZvbyIgdG8gYSA8dHQ+Y2hhcjwvdHQ+IGRhdGF0eXBlLCBpdCB3aWxsIGdldCB0aGUgdmFsdWUgYGYnLjxwPgotPHA+Ci1UaGUgPHR0PmNoYXIgKjwvdHQ+IGRhdGF0eXBlIGlzIGFzc3VtZWQgdG8gYmUgYSBOVUxMLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nLiBTV0lHIG1hcHMgdGhpcyBpbnRvIGEgY2hhcmFjdGVyIHN0cmluZyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBTV0lHIGNvbnZlcnRzIGNoYXJhY3RlciBzdHJpbmdzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdG8gTlVMTCB0ZXJtaW5hdGVkIHN0cmluZ3MgYmVmb3JlIHBhc3NpbmcgdGhlbSBpbnRvIEMvQysrLiBJdCBpcyBpbGxlZ2FsIGZvciB0aGVzZSBzdHJpbmdzIHRvIGhhdmUgZW1iZWRkZWQgTlVMTCBieXRlcyBhbHRob3VnaCB0aGVyZSBhcmUgd2F5cyB0byB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uPHA+Ci08cD4KLVRoZSA8dHQ+c2lnbmVkIGNoYXI8L3R0PiBhbmQgPHR0PnVuc2lnbmVkIGNoYXI8L3R0PiBkYXRhdHlwZXMgYXJlIG1hcHBlZCBpbnRvIGludGVnZXIgdmFsdWVzLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIG1hcHBpbmcgb2YgPHR0PmNoYXI8L3R0PiBkYXRhdHlwZXMuPHA+Ci08dHQ+PC90dD48cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PiV7Ci0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICZsdDtjdHlwZS5oJmd0OwotI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0Owotc2lnbmVkIGNoYXIgc3VtKHNpZ25lZCBjaGFyIGEsIHNpZ25lZCBjaGFyIGIpIHsgcmV0dXJuIGErYjt9Ci0lfQotCi1pbnQgIHN0cmNtcChjaGFyICosIGNoYXIgKik7Ci1jaGFyIHRvdXBwZXIoY2hhcik7Ci1zaWduZWQgY2hhciBzdW0oc2lnbmVkIGNoYXIgYSwgc2lnbmVkIGNoYXIgYik7Ci08L3R0PjwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQSBUY2wgc2NyaXB0IHVzaW5nIHRoZXNlIGZ1bmN0aW9ucyAoYW5kIHRoZSByZXN1bHRpbmcgb3V0cHV0KSBtaWdodCBiZSBhcyBmb2xsb3dzLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnRjbHNoICZndDsgc3RyY21wIE1pa2UgSm9obgotMQotdGNsc2ggJmd0OyB0b3VwcGVyIGcKLUcKLXRjbHNoICZndDsgc3VtIDE3IC04Ci05Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IFZhcmlhYmxlczwvaDM+Ci1TV0lHIGF0dGVtcHRzIHRvIG1hcCBDL0MrKyBnbG9iYWwgdmFyaWFibGVzIGludG8gc2NyaXB0aW5nIGxhbmd1YWdlIHZhcmlhYmxlcy4gRm9yIGV4YW1wbGU6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0KLWRvdWJsZSBmb287Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdpbGwgcmVzdWx0IGluIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHVzZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBUY2wKLXNldCBmb28gWzMuNV0gCQkJOyMgU2V0IGZvbyB0byAzLjUKLXB1dHMgJGZvbwkJCTsjIFByaW50IHRoZSB2YWx1ZSBvZiBmb28KLQotIyBQeXRob24KLWN2YXIuZm9vID0gMy41CQkJOyMgU2V0IGZvbyB0byAzLjUKLXByaW50IGN2YXIuZm9vCQkJOyMgUHJpbnQgdmFsdWUgb2YgZm9vCi0KLSMgUGVybAotJGZvbyA9IDMuNTsJCQk7IyBTZXQgZm9vIHRvIDMuNQotcHJpbnQgJGZvbywiXG4iOwkJCTsjIFByaW50IHZhbHVlIG9mIGZvbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuZXZlciB0aGlzICJzcGVjaWFsIiB2YXJpYWJsZSBpcyB1c2VkLCB0aGUgdW5kZXJseWluZyBDIGdsb2JhbCB2YXJpYWJsZSB3aWxsIGJlIGFjY2Vzc2VkLiBBcyBpdCB0dXJucyBvdXQsIHdvcmtpbmcgd2l0aCBnbG9iYWwgdmFyaWFibGVzIGlzIG9uZSBvZiB0aGUgbW9zdCB0cmlja3kgYXNwZWN0cyBvZiBTV0lHLiBXaGVuZXZlciBwb3NzaWJsZSwgeW91IHNob3VsZCB0cnkgdG8gYXZvaWQgdGhlIHVzZSBvZiBnbG9iYWxzLiBGb3J0dW5hdGVseSwgbW9zdCBtb2R1bGFyIHByb2dyYW1zIG1ha2UgbGltaXRlZCAob3Igbm8pIHVzZSBvZiBnbG9iYWxzLjxwPgotPGEgbmFtZT0ibjIxIj48L2E+PGgzPiBDb25zdGFudHM8L2gzPgotQ29uc3RhbnRzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIDx0dD4jZGVmaW5lPC90dD4sIDx0dD5jb25zdDwvdHQ+LCBvciBlbnVtZXJhdGlvbnMuIENvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbHNvIGFsbG93ZWQuIFRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgc2hvd3MgYSBmZXcgdmFsaWQgY29uc3RhbnQgZGVjbGFyYXRpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jZGVmaW5lIElfQ09OU1QgICAgICAgNSAgICAgICAgICAgICAgIC8vIEFuIGludGVnZXIgY29uc3RhbnQKLSNkZWZpbmUgRl9DT05TVCAgICAgICAzLjE0MTU5ICAgICAgICAgLy8gQSBGbG9hdGluZyBwb2ludCBjb25zdGFudAotI2RlZmluZSBTX0NPTlNUICAgICAgICJoZWxsbyB3b3JsZCIgICAvLyBBIHN0cmluZyBjb25zdGFudAotI2RlZmluZSBORVdMSU5FICAgICAgICdcbicgICAgICAgICAgICAvLyBDaGFyYWN0ZXIgY29uc3RhbnQKLSNkZWZpbmUgTU9ERSAgICAgICAgICBERUJVRyAgICAgICAgICAgLy8gU2V0cyBNT0RFIHRvIERFQlVHLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBERUJVRyBpcyBhc3N1bWVkIHRvIGJlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludCB1bmxlc3MgZGVjbGFyZWQgZWFybGllcgotZW51bSBib29sZWFuIHtOTz0wLCBZRVM9MX07Ci1lbnVtIG1vbnRocyB7SkFOLCBGRUIsIE1BUiwgQVBSLCBNQVksIEpVTiwgSlVMLCBBVUcsCi0gICAgICAgICAgICAgU0VQLCBPQ1QsIE5PViwgREVDfTsKLWNvbnN0IGRvdWJsZSBQSSAzLjE0MTU5MjY1NDsKLSNkZWZpbmUgRl9DT05TVCAoZG91YmxlKSA1ICAgICAgICAgICAgLy8gQSBmbG9hdGluZyBwb2ludGVyIGNvbnN0YW50IHdpdGggY2FzdAotI2RlZmluZSBQSV80IFBJLzQKLSNkZWZpbmUgRkxBR1MgMHgwNCB8IDB4MDggfCAweDQwCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIDx0dD4jZGVmaW5lPC90dD4gZGVjbGFyYXRpb25zLCB0aGUgdHlwZSBvZiBhIGNvbnN0YW50IGlzIGluZmVycmVkIGJ5IHN5bnRheCBvciBjYW4gYmUgZXhwbGljaXRseSBzZXQgdXNpbmcgYSBjYXN0LiBGb3IgZXhhbXBsZSwgYSBudW1iZXIgd2l0aCBhIGRlY2ltYWwgcG9pbnQgaXMgYXNzdW1lZCB0byBiZSBmbG9hdGluZyBwb2ludC4gV2hlbiBubyBleHBsaWNpdCB2YWx1ZSBpcyBhdmFpbGFibGUgZm9yIGEgY29uc3RhbnQsIFNXSUcgd2lsbCB1c2UgdGhlIHZhbHVlIGFzc2lnbmVkIGJ5IHRoZSBDIGNvbXBpbGVyLiBGb3IgZXhhbXBsZSwgbm8gdmFsdWVzIGFyZSBnaXZlbiB0byB0aGUgPHR0Pm1vbnRoczwvdHQ+IGVudW1lcmF0aW9uLCBidXQgdGhpcyBpcyBubyBwcm9ibGVtLS0tU1dJRyB3aWxsIHVzZSB3aGF0ZXZlciB0aGUgQyBjb21waWxlciBwaWNrcy4gPHA+Ci08cD4KLVRoZSB1c2Ugb2YgY29uc3RhbnQgZXhwcmVzc2lvbnMgaXMgYWxsb3dlZCwgYnV0IFNXSUcgZG9lcyBub3QgZXZhbHVhdGUgdGhlbS4gUmF0aGVyLCBpdCBwYXNzZXMgdGhlbSB0aHJvdWdoIHRvIHRoZSBvdXRwdXQgZmlsZSBhbmQgbGV0cyB0aGUgQyBjb21waWxlciBwZXJmb3JtIHRoZSBmaW5hbCBldmFsdWF0aW9uIChTV0lHIGRvZXMgcGVyZm9ybSBhIGxpbWl0ZWQgZm9ybSBvZiB0eXBlLWNoZWNraW5nIGhvd2V2ZXIpLjxwPgotPHA+Ci1Gb3IgZW51bWVyYXRpb25zLCBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBvcmlnaW5hbCBlbnVtIGRlZmluaXRpb24gYmUgaW5jbHVkZWQgc29tZXdoZXJlIGluIHRoZSBpbnRlcmZhY2UgZmlsZSAoZWl0aGVyIGluIGEgaGVhZGVyIGZpbGUgb3IgaW4gdGhlIDx0dD4leywlfTwvdHQ+IGJsb2NrKS4gU1dJRyBvbmx5IHRyYW5zbGF0ZXMgdGhlIGVudW1lcmF0aW9uIGludG8gY29kZSBuZWVkZWQgdG8gYWRkIHRoZSBjb25zdGFudHMgdG8gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIEl0IG5lZWRzIHRoZSBvcmlnaW5hbCBlbnVtZXJhdGlvbiBkZWNsYXJhdGlvbiB0byByZXRyaWV2ZSB0aGUgY29ycmVjdCBlbnVtIHZhbHVlcy48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBQb2ludGVycyBhbmQgY29tcGxleCBvYmplY3RzPC9oMj4KLUFzIHdlIGFsbCBrbm93LCBtb3N0IEMgcHJvZ3JhbXMgaGF2ZSBtdWNoIG1vcmUgdGhhbiBqdXN0IGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmQgY2hhcmFjdGVyIHN0cmluZ3MuIFRoZXJlIG1heSBiZSBwb2ludGVycywgYXJyYXlzLCBzdHJ1Y3R1cmVzLCBhbmQgb3RoZXIgb2JqZWN0cyBmbG9hdGluZyBhcm91bmQuIEZvcnR1bmF0ZWx5LCB0aGlzIGlzIHVzdWFsbHkgbm90IGEgcHJvYmxlbSBmb3IgU1dJRy48cD4KLTxhIG5hbWU9Im4yMiI+PC9hPjxoMz4gU2ltcGxlIHBvaW50ZXJzPC9oMz4KLVBvaW50ZXJzIHRvIGJhc2ljIEMgZGF0YXR5cGVzIHN1Y2ggYXMgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50ICoKLWRvdWJsZSAqKioKLWNoYXIgKioKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotY2FuIGJlIHVzZWQgZnJlZWx5IGluIGFuIGludGVyZmFjZSBmaWxlLiBTV0lHIGVuY29kZXMgcG9pbnRlcnMgaW50byBhIHJlcHJlc2VudGF0aW9uIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgcG9pbnRlciBhbmQgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRhdHlwZS4gVGh1cywgdGhlIFNXSUcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFib3ZlIHBvaW50ZXJzIChpbiBUY2wpLCBtaWdodCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+XzEwMDgxMDEyX2ludF9wCi1fMTAwOGUxMjRfZG91YmxlX3BwcAotX2Y4YWNfY2hhcl9wcAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BIE5VTEwgcG9pbnRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nICJOVUxMIiBvciB0aGUgdmFsdWUgMCBlbmNvZGVkIHdpdGggdHlwZSBpbmZvcm1hdGlvbi48cD4KLTxwPgotQWxsIHBvaW50ZXJzIGFyZSB0cmVhdGVkIGFzIG9wYXF1ZSBvYmplY3RzIGJ5IFNXSUcuIEEgcG9pbnRlciBtYXkgYmUgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBhbmQgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBDIGZ1bmN0aW9ucyBhcyBuZWVkZWQuIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZSB3b3JrcyBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyB5b3Ugd291bGQgd3JpdGUgYSBDIHByb2dyYW0gKHdlbGwsIHdpdGggYSBmZXcgbGltaXRhdGlvbnMpLjxwPgotPHA+Ci1UaGUgc2NyaXB0aW5nIGxhbmd1YWdlIHJlcHJlc2VudGF0aW9uIG9mIGEgcG9pbnRlciBzaG91bGQgbmV2ZXIgYmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgKGFsdGhvdWdoIG5vdGhpbmcgcHJldmVudHMgdGhpcykuIFNXSUcgZG9lcyBub3Qgbm9ybWFsbHkgbWFwIHBvaW50ZXJzIGludG8gaGlnaC1sZXZlbCBvYmplY3RzIHN1Y2ggYXMgYXNzb2NpYXRpdmUgYXJyYXlzIG9yIGxpc3RzIChmb3IgZXhhbXBsZSwgaXQgbWlnaHQgYmUgZGVzaXJhYmxlIHRvIGNvbnZlcnQgYW4gPHR0PmludCAqPC90dD4gaW50byBhbiBsaXN0IG9mIGludGVnZXJzKS4gVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyBmb3IgdGhpcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5BZGRpbmcgc3BlY2lhbCBjYXNlcyB3b3VsZCBtYWtlIFNXSUcgbW9yZSBjb21wbGljYXRlZCBhbmQgZGlmZmljdWx0IHRvIG1haW50YWluLgotPGxpPlRoZXJlIGlzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gaW4gYSBDIGRlY2xhcmF0aW9uIHRvIHByb3Blcmx5IG1hcCBwb2ludGVycyBpbnRvIGhpZ2hlciBsZXZlbCBjb25zdHJ1Y3RzLiBGb3IgZXhhbXBsZSwgYW4gPHR0PmludCAqPC90dD4gbWF5IGluZGVlZCBiZSBhbiBhcnJheSBvZiBpbnRlZ2VycywgYnV0IGlmIGl0IGNvbnRhaW5zIG9uZSBtaWxsaW9uIGVsZW1lbnRzLCBjb252ZXJ0aW5nIGl0IGludG8gYSBUY2wsIFBlcmwsIG9yIFB5dGhvbiBsaXN0IHdvdWxkIHByb2JhYmx5IGJlIGFuIGV4dHJlbWVseSBiYWQgaWRlYS4KLTxsaT5CeSB0cmVhdGluZyBhbGwgcG9pbnRlcnMgZXF1YWxseSwgaXQgaXMgZWFzeSB0byBrbm93IHdoYXQgeW91J3JlIGdvaW5nIHRvIGdldCB3aGVuIHlvdSBjcmVhdGUgYW4gaW50ZXJmYWNlIChwb2ludGVycyBhcmUgdHJlYXRlZCBpbiBhIGNvbnNpc3RlbnQgbWFubmVyKS4KLTwvdWw+Ci08cD4KLUFzIGl0IHR1cm5zIG91dCwgeW91IGNhbiByZW1hcCBhbnkgQyBkYXRhdHlwZSB0byBiZWhhdmUgaW4gbmV3IHdheXMgc28gdGhlc2UgcnVsZXMgYXJlIG5vdCBzZXQgaW4gc3RvbmUuIEludGVyZXN0ZWQgcmVhZGVycyBzaG91bGQgbG9vayBhdCB0aGUgY2hhcHRlciBvbiB0eXBlbWFwcy48cD4KLTxhIG5hbWU9Im4yMyI+PC9hPjxoMz4gUnVuIHRpbWUgcG9pbnRlciB0eXBlIGNoZWNraW5nPC9oMz4KLUJ5IGFsbG93aW5nIHBvaW50ZXJzIHRvIGJlIG1hbmlwdWxhdGVkIGludGVyYWN0aXZlbHkgaW4gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHdlIGhhdmUgZWZmZWN0aXZlbHkgYnlwYXNzZWQgdGhlIHR5cGUtY2hlY2tlciBpbiB0aGUgQy9DKysgY29tcGlsZXIuIEJ5IGVuY29kaW5nIHBvaW50ZXIgdmFsdWVzIHdpdGggYSBkYXRhdHlwZSwgU1dJRyBpcyBhYmxlIHRvIHBlcmZvcm0gcnVuLXRpbWUgdHlwZS1jaGVja2luZyBpbiBvcmRlciB0byBwcmV2ZW50IG15c3RlcmlvdXMgc3lzdGVtIGNyYXNoZXMgYW5kIG90aGVyIGFub21hbGllcy4gQnkgZGVmYXVsdCwgU1dJRyB1c2VzIGEgc3RyaWN0LXR5cGUgY2hlY2tpbmcgbW9kZWwgdGhhdCBjaGVja3MgdGhlIGRhdGF0eXBlIG9mIGFsbCBwb2ludGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIEMvQysrLiBIb3dldmVyLCB5b3UgY2FuIGNoYW5nZSB0aGUgaGFuZGxpbmcgb2YgcG9pbnRlcnMgdXNpbmcgdGhlIDx0dD4tc3RyaWN0PC90dD4gb3B0aW9uOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi1zdHJpY3QgMAkJCU5vIHR5cGUtY2hlY2tpbmcgKGxpdmluZyBvbiB0aGUgZWRnZSkKLS1zdHJpY3QgMQkJCUdlbmVyYXRlIHdhcm5pbmcgbWVzc2FnZXMgKHNvbWV3aGF0IGFubm95aW5nKQotLXN0cmljdCAyCQkJU3RyaWN0IHR5cGUgY2hlY2tpbmcgKHRoZSBkZWZhdWx0KQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TdHJpY3QgdHlwZSBjaGVja2luZyBpcyB0aGUgcmVjb21tZW5kZWQgZGVmYXVsdCBzaW5jZSBpcyB0aGUgbW9zdCByZWxpYWJsZSBhbmQgbW9zdCBjbG9zZWx5IGZvbGxvd3MgdGhlIHR5cGUgY2hlY2tpbmcgcnVsZXMgb2YgQy4gSW4gZmFjdCwgYXQgdGhpcyB0aW1lLCB0aGUgb3RoZXIgdHdvIG1vZGVzIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIG91dGRhdGVkIFNXSUcgZmVhdHVyZXMgdGhhdCBhcmUgc3VwcG9ydGVkLCBidXQgbm8gbG9uZ2VyIG5lY2Vzc2FyeS48cD4KLTxwPgotQnkgZGVmYXVsdCwgU1dJRyBhbGxvd3MgIk5VTEwiIHBvaW50ZXJzIHRvIGJlIHBhc3NlZCB0byBDL0MrKy4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBjcmFzaCBjb2RlIGFuZCBjYXVzZSBvdGhlciBwcm9ibGVtcyBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsLiBDaGVja3MgY2FuIGJlIHBsYWNlZCBvbiBjZXJ0YWluIHZhbHVlcyB0byBwcmV2ZW50IHRoaXMgYnV0IHRoaXMgcmVxdWlyZXMgdGhlIHVzZSBvZiB0eXBlbWFwcyAoZGVzY3JpYmVkIGluIGxhdGVyIGNoYXB0ZXJzKS48cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1MaWtlIEMsIGl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgZnVuY3Rpb25zIGludm9sdmluZyA8dHQ+dm9pZDwvdHQ+IHBvaW50ZXJzIGNhbiBhY2NlcHQgYW55IGtpbmQgb2YgcG9pbnRlciBvYmplY3QuPHA+Ci08YSBuYW1lPSJuMjQiPjwvYT48aDM+IERlcml2ZWQgdHlwZXMsIHN0cnVjdHMsIGFuZCBjbGFzc2VzPC9oMz4KLUZvciBldmVyeXRoaW5nIGVsc2UgKHN0cnVjdHMsIGNsYXNzZXMsIGFycmF5cywgZXRjLi4uKSBTV0lHIGFwcGxpZXMgYSB2ZXJ5IHNpbXBsZSBydWxlIDo8cD4KLTxwPgotQWxsIGNvbXBsZXggZGF0YXR5cGVzIGFyZSBwb2ludGVyczxwPgotPHA+Ci1JbiBvdGhlciB3b3JkcywgU1dJRyBtYW5pcHVsYXRlcyBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlLiBUaGlzIG1vZGVsIG1ha2VzIHNlbnNlIGJlY2F1c2UgbW9zdCBDL0MrKyBwcm9ncmFtcyBtYWtlIGhlYXZ5IHVzZSBvZiBwb2ludGVycyBhbmQgd2UgY2FuIHVzZSB0aGUgdHlwZS1jaGVja2VkIHBvaW50ZXIgbWVjaGFuaXNtIGFscmVhZHkgcHJlc2VudCBmb3IgaGFuZGxpbmcgcG9pbnRlcnMgdG8gYmFzaWMgZGF0YXR5cGVzLjxwPgotPHA+Ci1XaGlsZSBhbGwgb2YgdGhpcyBwcm9iYWJseSBzb3VuZHMgY29tcGxpY2F0ZWQsIGl0J3MgcmVhbGx5IHF1aXRlIHNpbXBsZS4gU3VwcG9zZSB5b3UgaGF2ZSBhbiBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZmlsZWlvCi1GSUxFICpmb3BlbihjaGFyICosIGNoYXIgKik7Ci1pbnQgZmNsb3NlKEZJTEUgKik7Ci11bnNpZ25lZCBmcmVhZCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIG5vYmosIEZJTEUgKik7Ci11bnNpZ25lZCBmd3JpdGUodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBub2JqLCBGSUxFICopOwotdm9pZCAqbWFsbG9jKGludCBuYnl0ZXMpOwotdm9pZCBmcmVlKHZvaWQgKik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgZmlsZSwgU1dJRyBkb2Vzbid0IGtub3cgd2hhdCBhIDx0dD5GSUxFPC90dD4gaXMsIGJ1dCBpdCdzIHVzZWQgYXMgYSBwb2ludGVyLCBzbyBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCBpdCBpcy4gSWYgeW91IHdyYXBwZWQgdGhpcyBtb2R1bGUgaW50byBQeXRob24sIHlvdSBjb3VsZCB1c2UgdGhlIGZ1bmN0aW9ucyBqdXN0IGxpa2UgeW91IHdvdWxkIGV4cGVjdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBDb3B5IGEgZmlsZSAKLWRlZiBmaWxlY29weShzb3VyY2UsdGFyZ2V0KToKLQlmMSA9IGZvcGVuKHNvdXJjZSwiciIpCi0JZjIgPSBmb3Blbih0YXJnZXQsInciKQotCWJ1ZmZlciA9IG1hbGxvYyg4MTkyKQotCW5ieXRlcyA9IGZyZWFkKGJ1ZmZlciw4MTkyLDEsZjEpCi0Jd2hpbGUgKG5ieXRlcyAmZ3Q7IDApOgotCQlmd3JpdGUoYnVmZmVyLDgxOTIsMSxmMikKLQkJbmJ5dGVzID0gZnJlYWQoYnVmZmVyLDgxOTIsMSxmMSkKLQlmcmVlKGJ1ZmZlcikKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBjYXNlIDx0dD5mMTwvdHQ+LDx0dD4gZjI8L3R0PiwgYW5kIDx0dD5idWZmZXI8L3R0PiBhcmUgYWxsIG9wYXF1ZSBvYmplY3RzIGNvbnRhaW5pbmcgQyBwb2ludGVycy4gSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSB0aGV5IGNvbnRhaW4tLW91ciBwcm9ncmFtIHdvcmtzIGp1c3QgZmluZSB3aXRob3V0IHRoaXMga25vd2xlZGdlLjxwPgotPGEgbmFtZT0ibjI1Ij48L2E+PGgzPiBXaGF0IGhhcHBlbnMgd2hlbiBTV0lHIGVuY291bnRlcnMgYW4gdW5rbm93biBkYXRhdHlwZT88L2gzPgotV2hlbiBTV0lHIGVuY291bnRlcnMgYW4gdW5rbm93biBkYXRhdHlwZSwgaXQgYXV0b21hdGljYWxseSBhc3N1bWVzIHRoYXQgaXQgaXMgc29tZSBzb3J0IG9mIGNvbXBsZXggZGF0YXR5cGUuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYXBwZWFyZWQgaW4gYSBTV0lHIGlucHV0IGZpbGU6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBtYXRyaXhfbXVsdGlwbHkoTWF0cml4ICphLCBNYXRyaXggKmIsIE1hdHJpeCAqYyk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNXSUcgaGFzIG5vIGlkZWEgd2hhdCBhICI8dHQ+TWF0cml4PC90dD4iIGlzIHNvIGl0IHdpbGwgYXNzdW1lIHRoYXQgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGFuZCBtYXAgaXQgaW50byBhIHBvaW50ZXIuIFRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZSBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIEMgZnVuY3Rpb24gaXMgdXNpbmcgcG9pbnRlcnMgaW4gdGhlIGZpcnN0IHBsYWNlLiBVbmxpa2UgQyBvciBDKyssIFNXSUcgZG9lcyBub3QgYWN0dWFsbHkgY2FyZSB3aGV0aGVyIDx0dD5NYXRyaXg8L3R0PiBoYXMgYmVlbiBwcmV2aW91c2x5IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlIG9yIG5vdC4gV2hpbGUgdGhpcyBtYXkgc291bmQgc3RyYW5nZSwgaXQgbWFrZXMgaXQgcG9zc2libGUgZm9yIFNXSUcgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcyBmcm9tIG9ubHkgcGFydGlhbCBpbmZvcm1hdGlvbi4gSW4gbWFueSBjYXNlcywgeW91IG1heSBub3QgY2FyZSB3aGF0IGEgPHR0Pk1hdHJpeDwvdHQ+IHJlYWxseSBpcyBhcyBsb25nIGFzIHlvdSBjYW4gcGFzcyByZWZlcmVuY2VzIHRvIG9uZSBhcm91bmQgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFRoZSBkb3duc2lkZSB0byB0aGlzIHJlbGF4ZWQgYXBwcm9hY2ggaXMgdGhhdCB0eXBvcyBtYXkgZ28gY29tcGxldGVseSB1bmRldGVjdGVkIGJ5IFNXSUcuIFlvdSBjYW4gYWxzbyBlbmQgdXAgc2hvb3RpbmcgeW91cnNlbGYgaW4gdGhlIGZvb3QsIGJ1dCBwcmVzdW1hYmx5IHlvdSd2ZSBwYXNzZWQgeW91ciBwcm9ncmFtbWluZyBzYWZldHkgY291cnNlIGlmIHlvdSd2ZSBtYWRlIGl0IHRoaXMgZmFyLjxwPgotPHA+Ci1BcyBhIGRlYnVnZ2luZyB0b29sLCBTV0lHIHdpbGwgcmVwb3J0IGEgbGlzdCBvZiB1c2VkLCBidXQgdW5kZWZpbmVkIGRhdGF0eXBlcywgaWYgeW91IHJ1biBpdCB3aXRoIHRoZSA8dHQ+LXN0YXQ8L3R0PiBvcHRpb24uPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+W2JlYXpsZXlAZ3Vpbm5lc3MgU1dJRzEuMWI2XSQgc3dpZyAtc3RhdCBtYXRyaXguaQotTWFraW5nIHdyYXBwZXJzIGZvciBUY2wKLVdyYXBwZWQgMSBmdW5jdGlvbnMKLVdyYXBwZWQgMCB2YXJpYWJsZXMKLVdyYXBwZWQgMCBjb25zdGFudHMKLVRoZSBmb2xsb3dpbmcgZGF0YXR5cGVzIHdlcmUgdXNlZCwgYnV0IHVuZGVmaW5lZC4KLSAgICAgTWF0cml4Ci1bYmVhemxleUBndWlubmVzcyBTV0lHMS4xYjZdJAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjI2Ij48L2E+PGgzPiBUeXBlZGVmPC9oMz4KLTx0dD50eXBlZGVmPC90dD4gY2FuIGJlIHVzZWQgdG8gcmVtYXAgZGF0YXR5cGVzIHdpdGhpbiBTV0lHLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIG1ha2VzIFNXSUcgdHJlYXQgPHR0PnNpemVfdDwvdHQ+IGxpa2UgYW4gdW5zaWduZWQgaW50LiBVc2Ugb2YgPHR0PnR5cGVkZWY8L3R0PiBpcyBmYWlybHkgY3JpdGljYWwgaW4gbW9zdCBhcHBsaWNhdGlvbnMuIFdpdGhvdXQgaXQsIFNXSUcgd291bGQgY29uc2lkZXIgPHR0PnNpemVfdDwvdHQ+IHRvIGJlIGEgY29tcGxleCBvYmplY3QgKHdoaWNoIHdvdWxkIGJlIGluY29ycmVjdGx5IGNvbnZlcnRlZCBpbnRvIGEgcG9pbnRlcikuPHA+Ci08YSBuYW1lPSJuNCI+PC9hPjxoMj4gR2V0dGluZyBkb3duIHRvIGJ1c2luZXNzPC9oMj4KLVNvIGZhciwgeW91IGtub3cganVzdCBhYm91dCBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIGtub3cgdG8gdXNlIFNXSUcgdG8gYnVpbGQgaW50ZXJmYWNlcy4gSW4gZmFjdCwgdXNpbmcgbm90aGluZyBidXQgYmFzaWMgZGF0YXR5cGVzIGFuZCBvcGFxdWUgcG9pbnRlcnMgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMgdG8gbW9zdCBraW5kcyBvZiBDL0MrKyBwYWNrYWdlcy4gSG93ZXZlciwgYXMgdGhlIG5vdmVsdHkgd2VhcnMgb2ZmLCB5b3Ugd2lsbCB3YW50IHRvIGRvIG1vcmUuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgU1dJRydzIHRyZWF0bWVudCBvZiBtb3JlIHNvcGhzdGljYXRlZCBpc3N1ZXMuPHA+Ci08YSBuYW1lPSJuMjciPjwvYT48aDM+IFBhc3NpbmcgY29tcGxleCBkYXRhdHlwZXMgYnkgdmFsdWU8L2gzPgotVW5mb3J0dW5hdGVseSwgbm90IGFsbCBDIHByb2dyYW1zIG1hbmlwdWxhdGUgY29tcGxleCBvYmplY3RzIGJ5IHJlZmVyZW5jZS4gV2hlbiBlbmNvdW50ZXJlZCwgU1dJRyB3aWxsIHRyYW5zZm9ybSB0aGUgY29ycmVzcG9uZGluZyBDL0MrKyBkZWNsYXJhdGlvbiB0byB1c2UgcmVmZXJlbmNlcyBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TV0lHIHdpbGwgdHJhbnNmb3JtIHRoaXMgZnVuY3Rpb24gY2FsbCBpbnRvIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7Ci0JcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZTx0dD4sIGRvdF9wcm9kdWN0PC90dD4gd2lsbCBub3cgdGFrZSByZWZlcmVuY2VzIHRvIFZlY3RvcnMgaW5zdGVhZCBvZiBWZWN0b3JzLCBhbHRob3VnaCB5b3UgbWF5IG5vdCBub3RpY2UgdGhlIGNoYW5nZS4gPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IFJldHVybiBieSB2YWx1ZTwvaDM+Ci1DIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjb21wbGV4IGRhdGF0eXBlcyBieSB2YWx1ZSBhcmUgbW9yZSBkaWZmaWN1bHQgdG8gaGFuZGxlLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlZlY3RvciBjcm9zcyhWZWN0b3IgdjEsIFZlY3RvciB2Mik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgY29tcGxleCBvYmplY3QsIHlldCBTV0lHIG9ubHkgbGlrZXMgdG8gd29yayB3aXRoIHJlZmVyZW5jZXMuIENsZWFybHksIHNvbWV0aGluZyBtdXN0IGJlIGRvbmUgd2l0aCB0aGUgcmV0dXJuIHJlc3VsdCwgb3IgaXQgd2lsbCBiZSBsb3N0IGZvcmV2ZXIuIEFzIGEgcmVzdWx0LCBTV0lHIHRyYW5zZm9ybXMgdGhpcyBmdW5jdGlvbiBpbnRvIHRoZSBmb2xsb3dpbmcgY29kZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VmVjdG9yICp3cmFwX2Nyb3NzKFZlY3RvciAqdjEsIFZlY3RvciAqdjIpIHsKLQlWZWN0b3IgKnJlc3VsdDsKLQlyZXN1bHQgPSAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci0JKihyZXN1bHQpID0gY3Jvc3MoKnYxLCp2Mik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotb3IgaWYgdXNpbmcgQysrIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5WZWN0b3IgKndyYXBfY3Jvc3MoVmVjdG9yICp2MSwgVmVjdG9yICp2MikgewotCVZlY3RvciAqcmVzdWx0ID0gbmV3IFZlY3Rvcihjcm9zcygqdjEsKnYyKSk7IC8vIFVzZXMgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yCi0JcmV0dXJuIHJlc3VsdDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyBpcyBmb3JjZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGl0LiBJdCBpcyB1cCB0byB0aGUgdXNlciB0byBkZWxldGUgdGhlIHJldHVybmVkIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciBpbiB1c2UuIFdoZW4gdXNlZCBpbXByb3Blcmx5LCB0aGlzIGNhbiBsZWFkIHRvIG1lbW9yeSBsZWFrcyBhbmQgb3RoZXIgcHJvYmxlbXMuIFBlcnNvbmFsbHksIEknZCByYXRoZXIgbGl2ZSB3aXRoIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrIHRoYW4gZm9yYmlkIHRoZSB1c2Ugb2Ygc3VjaCBhIGZ1bmN0aW9uLiBOZWVkbGVzcyB0byBzYXksIHNvbWUgY2FyZSBpcyBwcm9iYWJseSBpbiBvcmRlciAoeW91IG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyBiZWhhdmlvciBpbiBhbnkgY2FzZSkuIDxwPgotPGEgbmFtZT0ibjI5Ij48L2E+PGgzPiBMaW5raW5nIHRvIGNvbXBsZXggdmFyaWFibGVzPC9oMz4KLVdoZW4gZ2xvYmFsIHZhcmlhYmxlcyBvciBjbGFzcyBtZW1iZXJzIGludm9sdmluZyBjb21wbGV4IGRhdGF0eXBlcyBhcmUgZW5jb3VudGVyZWQsIFNXSUcgY29udmVydHMgdGhlbSBpbnRvIHJlZmVyZW5jZXMuIEZvciBleGFtcGxlLCBhIGdsb2JhbCB2YXJpYWJsZSBsaWtlIHRoaXMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLVZlY3RvciB1bml0X2k7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLWdldHMgbWFwcGVkIHRvIGEgcGFpciBvZiBzZXQvZ2V0IGZ1bmN0aW9ucyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlZlY3RvciAqdW5pdF9pX2dldCgpIHsKLQlyZXR1cm4gJmFtcDt1bml0X2k7Ci19Ci1WZWN0b3IgKnVuaXRfaV9zZXQoVmVjdG9yICp2YWx1ZSkgewotCXVuaXRfaSA9ICp2YWx1ZTsKLQlyZXR1cm4gJmFtcDt1bml0X2k7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVJldHVybmluZyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgbWFrZXMgaXQgYWNjZXNzaWJsZSBsaWtlIGFueSBvdGhlciBvYmplY3Qgb2YgdGhpcyB0eXBlLiBXaGVuIHNldHRpbmcgdGhlIHZhbHVlLCB3ZSBzaW1wbHkgbWFrZSBhIGNvcHkgb2Ygc29tZSBvdGhlciBWZWN0b3IgcmVmZXJlbmNlLiBBZ2FpbiBzb21lIGNhdXRpb24gaXMgaW4gb3JkZXIuIEEgZ2xvYmFsIHZhcmlhYmxlIGNyZWF0ZWQgaW4gdGhpcyBtYW5uZXIgd2lsbCBzaG93IHVwIGFzIGEgcmVmZXJlbmNlIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiBJdCB3b3VsZCBiZSBhbiBleHRyZW1lbHkgYmFkIGlkZWEgdG8gZnJlZSBvciBkZXN0cm95IHN1Y2ggYSByZWZlcmVuY2UuIFNpbWlsYXJseSwgb25lIGNhbiBydW4gaW50byBwcm9ibGVtcyB3aGVuIGNvcHlpbmcgY29tcGxleCBDKysgb2JqZWN0cyBpbiB0aGlzIG1hbm5lci4gRm9ydHVuYXRlbHksIGluIHdlbGwtd3JpdHRlbiBtb2R1bGFyIGNvZGUsIGV4Y2Vzc2l2ZSB1c2UgKG9yIGFidXNlKSBvZiBnbG9iYWwgdmFyaWFibGVzIGlzIHJhcmUuPHA+Ci08YSBuYW1lPSJuMzAiPjwvYT48aDM+IEFycmF5czwvaDM+Ci1UaGUgdXNlIG9mIGFycmF5cyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFNXSUcgaXMgc3VwcG9ydGVkLCBidXQgd2l0aCBjYXV0aW9uLiBJZiBzaW1wbGUgYXJyYXlzIGFwcGVhciwgdGhleSB3aWxsIGJlIG1hcHBlZCBpbnRvIGEgcG9pbnRlciByZXByZXNlbnRhdGlvbi4gVGh1cywgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBmb29iYXIoaW50IGFbNDBdKTsKLXZvaWQgZ3JvayhjaGFyICphcmd2W10pOwotdm9pZCB0cmFuc3Bvc2UoZG91YmxlIGFbMjBdWzIwXSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXdpbGwgYmUgcHJvY2Vzc2VkIGFzIGlmIHRoZXkgd2VyZSBkZWNsYXJlZCBsaWtlIHRoaXM6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50IGZvb2JhcihpbnQgKmEpOwotdm9pZCBncm9rKGNoYXIgKiphcmd2KTsKLXZvaWQgdHJhbnNwb3NlKGRvdWJsZSAoKmEpWzIwXSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgdHJhbnNmb3JtZWQgaW50byBhIHNpbmdsZSBwb2ludGVyIHNpbmNlIDx0dD5hW11bXTwvdHQ+IGFuZCA8dHQ+KiphPC90dD4gYXJlIG5vdCB0aGUgc2FtZSB0aGluZyAoZXZlbiB0aG91Z2ggdGhleSBjYW4gYmUgdXNlZCBpbiBzaW1pbGFyIHdheXMpLiBSYXRoZXIsIDx0dD5hW11bXTwvdHQ+IGlzIG1hcHBlZCB0byAqYSwgd2hlcmUgPHR0PiphPC90dD4gaXMgdGhlIGVxdWl2YWxlbnQgb2YgPHR0PiZhbXA7YVswXVswXTwvdHQ+LiBUaGUgcmVhZGVyIGlzIGVuY291cmFnZWQgdG8gZHVzdCBvZmYgdGhlaXIgQyBib29rIGFuZCBsb29rIGF0IHRoZSBzZWN0aW9uIG9uIGFycmF5cyBiZWZvcmUgdXNpbmcgdGhlbSB3aXRoIFNXSUcuPHA+Ci08cD4KLUJlIGF3YXJlIHRoYXQgdXNlIG9mIGFycmF5cyBtYXkgY2F1c2UgY29tcGlsZXIgd2FybmluZ3Mgb3IgZXJyb3JzIHdoZW4gY29tcGlsaW5nIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMuIFdoaWxlIGV2ZXJ5IGF0dGVtcHQgaGFzIGJlZW4gbWFkZSB0byBlbGltaW5hdGUgdGhlc2UgcHJvYmxlbXMsIGhhbmRsaW5nIG9mIGFycmF5cyBjYW4gYmUgc29tZXdoYXQgcHJvYmxlbWF0aWMgZHVlIHRvIHRoZSBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhbiBhcnJheSBhbmQgYSBwb2ludGVyLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBDcmVhdGluZyByZWFkLW9ubHkgdmFyaWFibGVzPC9oMz4KLUEgcmVhZC1vbmx5IHZhcmlhYmxlIGNhbiBiZSBjcmVhdGVkIGJ5IHVzaW5nIHRoZSA8dHQ+JXJlYWRvbmx5PC90dD4gZGlyZWN0aXZlIGFzIHNob3duIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBGaWxlIDogaW50ZXJmYWNlLmkKLQotaW50IAlhOyAJCQkvLyBDYW4gcmVhZC93cml0ZQotJXJlYWRvbmx5Ci1pbnQJYixjLGQJCQkvLyBSZWFkIG9ubHkgdmFyaWFibGVzCi0lcmVhZHdyaXRlCi1kb3VibGUJeCx5CQkJLy8gcmVhZC93cml0ZQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgPHR0PiVyZWFkb25seTwvdHQ+IGRpcmVjdGl2ZSBlbmFibGVzIHJlYWQtb25seSBtb2RlIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQgdXNpbmcgdGhlIDx0dD4lcmVhZHdyaXRlPC90dD4gZGlyZWN0aXZlLjxwPgotPGEgbmFtZT0ibjMyIj48L2E+PGgzPiBSZW5hbWluZyBkZWNsYXJhdGlvbnM8L2gzPgotTm9ybWFsbHksIHRoZSBuYW1lIG9mIGEgQyBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGFkZGVkIHRvIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG5hbWUgbWF5IGNvbmZsaWN0IHdpdGggYSBrZXl3b3JkIG9yIGFscmVhZHkgZXhpc3RpbmcgZnVuY3Rpb24gaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZS4gTmFtaW5nIGNvbmZsaWN0cyBjYW4gYmUgcmVzb2x2ZWQgdXNpbmcgdGhlIDx0dD4lbmFtZTwvdHQ+IGRpcmVjdGl2ZSBhcyBzaG93biA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gaW50ZXJmYWNlLmkKLQotJW5hbWUobXlfcHJpbnQpIGV4dGVybiB2b2lkIHByaW50KGNoYXIgKik7Ci0lbmFtZShmb28pIGV4dGVybiBpbnQgYV9yZWFsbHlfbG9uZ19hbmRfYW5ub3lpbmdfbmFtZTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBzdGlsbCBjYWxscyB0aGUgY29ycmVjdCBDIGZ1bmN0aW9ucywgYnV0IGluIHRoaXMgY2FzZSB0aGUgZnVuY3Rpb24gPHR0PnByaW50KCk8L3R0PiB3aWxsIHJlYWxseSBiZSBjYWxsZWQgIjx0dD5teV9wcmludCgpPC90dD4iIGluIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIDxwPgotPHA+Ci1BIG1vcmUgcG93ZXJmdWwgcmVuYW1pbmcgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgd2l0aCB0aGU8dHQ+ICVyZW5hbTwvdHQ+ZSBkaXJlY3RpdmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXJlbmFtZSBvbGRuYW1lIG5ld25hbWU7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0dD4lcmVuYW1lIDwvdHQ+YXBwbGllcyBhIHJlbmFtaW5nIG9wZXJhdGlvbiB0byBhbGwgZnV0dXJlIG9jY3VycmVuY2VzIG9mIGEgbmFtZS4gVGhlIHJlbmFtaW5nIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIGFuZCBzdHJ1Y3R1cmUgbmFtZXMsIG1lbWJlciBmdW5jdGlvbnMsIGFuZCBtZW1iZXIgZGF0YS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQgdHdvLWRvemVuIEMrKyBjbGFzc2VzLCBhbGwgd2l0aCBhIG1lbWJlciBmdW5jdGlvbiBuYW1lZCBgcHJpbnQnICh3aGljaCBpcyBhIGtleXdvcmQgaW4gUHl0aG9uKSwgeW91IGNvdWxkIHJlbmFtZSB0aGVtIGFsbCB0byBgb3V0cHV0JyBieSBzcGVjaWZ5aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lcmVuYW1lIHByaW50IG91dHB1dDsgLy8gUmVuYW1lIGFsbCBgcHJpbnQnIGZ1bmN0aW9ucyB0byBgb3V0cHV0JwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TV0lHIGRvZXMgbm90IHBlcmZvcm0gYW55IGNoZWNrcyB0byBzZWUgaWYgdGhlIGZ1bmN0aW9ucyBpdCBhZGRzIGFyZSBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2VzIGFuZCB5b3VyIHVzZSBvZiBtb2R1bGVzLCB5b3UgY2FuIHVzdWFsbHkgYXZvaWQgdGhlc2UgcHJvYmxlbXMuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IE92ZXJyaWRpbmcgY2FsbCBieSByZWZlcmVuY2U8L2gzPgotU1dJRyBpcyBxdWl0ZSBsaXRlcmFsIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBkYXRhdHlwZXMuIElmIHlvdSBnaXZlIGl0IGEgcG9pbnRlciwgaXQgd2lsbCB1c2UgcG9pbnRlcnMuIEZvciBleGFtcGxlLCBpZiB5b3UncmUgdHJ5aW5nIHRvIGNhbGwgYSBmdW5jdGlvbiBpbiBhIEZvcnRyYW4gbGlicmFyeSAodGhyb3VnaCBpdHMgQyBpbnRlcmZhY2UpIGFsbCBmdW5jdGlvbiBwYXJhbWV0ZXJzIHdpbGwgaGF2ZSB0byBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW1pbGFybHksIHNvbWUgQyBmdW5jdGlvbnMgbWF5IHVzZSBwb2ludGVycyBpbiB1bnVzdWFsIHdheXMuIFRoZSA8dHQ+JXZhbDwvdHQ+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGNhbGxpbmcgbWVjaGFuaXNtIGZvciBhIEMgZnVuY3Rpb24uIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBpbnRlcmZhY2UuaQotJXsKLSNpbmNsdWRlICZsdDt0aW1lLmgmZ3Q7Ci0lfQotCi10eXBlZGVmIGxvbmcgdGltZV90OwotdGltZV90IHRpbWUodGltZV90ICp0KTsKLXN0cnVjdCB0bSAqbG9jYWx0aW1lKCV2YWwgdGltZV90ICp0KTsKLWNoYXIgKmFzY3RpbWUoc3RydWN0IHRtICopOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmxvY2FsdGltZSgpPC90dD4gZnVuY3Rpb24gdGFrZXMgYSBwb2ludGVyIHRvIGEgPHR0PnRpbWVfdDwvdHQ+IHZhbHVlLCBidXQgd2UgaGF2ZSBmb3JjZWQgaXQgdG8gdGFrZSBhIHZhbHVlIGluc3RlYWQgaW4gb3JkZXIgdG8gbWF0Y2ggdXAgbmljZWx5IHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgPHR0PnRpbWUoKTwvdHQ+IGZ1bmN0aW9uLiBXaGVuIHVzZWQgaW4gUGVybCwgdGhpcyBhbGxvd3MgdXMgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJHQgPSB0aW1lKDApOwotJHRtID0gbG9jYWx0aW1lKCR0KTsgIyBOb3RlIHBhc3NpbmcgJHQgYnkgdmFsdWUgaGVyZQotcHJpbnQgJGFzY3RpbWUoJHRtKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW50ZXJuYWxseSwgdGhlIDx0dD4ldmFsPC90dD4gZGlyZWN0aXZlIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUuIFRoZSBhcmd1bWVudCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhpcyB2YXJpYWJsZSBhbmQgYSBmdW5jdGlvbiBjYWxsIGlzIG1hZGUgdXNpbmcgYSBwb2ludGVyIHRvIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUuIE9mIGNvdXJzZSwgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBpbiB0aGlzIHRlbXBvcmFyeSB2YXJpYWJsZSwgaXQgd2lsbCBiZSBsb3N0IGZvcmV2ZXIuIDxwPgotPGEgbmFtZT0ibjM0Ij48L2E+PGgzPiBEZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50czwvaDM+Ci1TV0lHIGFsbG93cyBkZWZhdWx0IGFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGJvdGggQy9DKysgY29kZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQgcGxvdChkb3VibGUgeCwgZG91YmxlIHksIGludCBjb2xvcj1XSElURSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHNwZWNpZnkgYSBkZWZhdWx0IGFyZ3VtZW50LCBzaW1wbHkgc3BlY2lmeSBpdCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIGFzIHNob3duLiBTV0lHIHdpbGwgZ2VuZXJhdGUgd3JhcHBlciBjb2RlIGluIHdoaWNoIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuIEZvciBleGFtcGxlLCB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgaW4gVGNsIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgcGxvdCAtMy40IDcuNSAJCQkJIyBVc2UgZGVmYXVsdCB2YWx1ZQotJSBwbG90IC0zLjQgNy41IDEwCQkJCSMgc2V0IGNvbG9yIHRvIDEwIGluc3RlYWQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hpbGUgdGhlIEFOU0kgQyBzdGFuZGFyZCBkb2VzIG5vdCBzcGVjaWZ5IGRlZmF1bHQgYXJndW1lbnRzLCBkZWZhdWx0IGFyZ3VtZW50cyB1c2VkIGluIGEgU1dJRyBnZW5lcmF0ZWQgaW50ZXJmYWNlIHdvcmsgd2l0aCBib3RoIEMgYW5kIEMrKy48cD4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gUG9pbnRlcnMgdG8gZnVuY3Rpb25zPC9oMz4KLUF0IHRoZSBtb21lbnQsIHRoZSBTV0lHIHBhcnNlciBoYXMgZGlmZmljdWx0eSBoYW5kbGluZyBwb2ludGVycyB0byBmdW5jdGlvbnMgKGEgZGVmaWNpZW5jeSB0aGF0IGlzIGJlaW5nIGNvcnJlY3RlZCkuIEhvd2V2ZXIsIGhhdmluZyBmdW5jdGlvbiBwb2ludGVycyBpcyB1c2VmdWwgZm9yIG1hbmFnaW5nIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGFuZCBvdGhlciB0aGluZ3MuIFRvIHByb3Blcmx5IGhhbmRsZSBmdW5jdGlvbiBwb2ludGVycywgaXQgaXMgY3VycmVudGx5IG5lY2Vzc2FyeSB0byB1c2UgPHR0PnR5cGVkZWYuPC90dD4gRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci12b2lkIGRvX29wZXJhdGlvbihkb3VibGUgKCpvcCkoZG91YmxlLGRvdWJsZSksIGRvdWJsZSBhLCBkb3VibGUgYik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXNob3VsZCBiZSBoYW5kbGVkIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXR5cGVkZWYgZG91YmxlICgqT1BfRlVOQykoZG91YmxlLGRvdWJsZSk7Ci12b2lkIGRvX29wZXJhdGlvbihPUF9GVU5DIG9wLCBkb3VibGUgYSwgZG91YmxlIGIpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIHVuZGVyc3RhbmRzIGJvdGggdGhlIHR5cGVkZWYgZGVjbGFyYXRpb24gYW5kIHRoZSBsYXRlciBmdW5jdGlvbiBjYWxsLiBJdCB3aWxsIHRyZWF0IDx0dD5PUF9GVU5DPC90dD4ganVzdCBsaWtlIGFueSBvdGhlciBjb21wbGV4IGRhdGF0eXBlLiBJbiBvcmRlciBmb3IgdGhpcyBhcHByb2FjaCB0byB3b3JrLCBpdCBpcyBuZWNlc3NhcnkgdGhhdCB0aGUgdHlwZWRlZiBkZWNsYXJhdGlvbiBiZSBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCBDIGNvZGUtLW90aGVyd2lzZSwgdGhlIEMgY29tcGlsZXIgd2lsbCBjb21wbGFpbi4gSWYgeW91IGFyZSBidWlsZGluZyBhIHNlcGFyYXRlIGludGVyZmFjZSBmaWxlIHRvIGFuIGV4aXN0aW5nIEMgcHJvZ3JhbSBhbmQgZG8gbm90IHdhbnQgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBDIHNvdXJjZSwgeW91IGNhbiBhbHNvIGRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIEZpbGUgOiBpbnRlcmZhY2UuaQotJXR5cGVkZWYgZG91YmxlICgqT1BfRlVOQykoZG91YmxlLGRvdWJsZSk7Ci1kb3VibGUgZG9fb3BlcmF0aW9uKE9QX0ZVTkMgb3AsIGRvdWJsZSBhLCBkb3VibGUgYik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTx0dD4ldHlwZWRlZjwvdHQ+IGZvcmNlcyBTV0lHIHRvIGdlbmVyYXRlIGEgPHR0PnR5cGVkZWY8L3R0PiBpbiB0aGUgQyBvdXRwdXQgY29kZSBmb3IgeW91LiBUaGlzIHdvdWxkIGFsbG93IHRoZSBpbnRlcmZhY2UgZmlsZSBzaG93biB0byB3b3JrIHdpdGggdGhlIG9yaWdpbmFsIHVubW9kaWZpZWQgQyBmdW5jdGlvbiBkZWNsYXJhdGlvbi48cD4KLTxwPgotQ29uc3RhbnRzIGNvbnRhaW5pbmcgdGhlIGFkZHJlc3NlcyBvZiBDIGZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBjcmVhdGVkLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZXh0ZXJuIGRvdWJsZSBvcF9hZGQoZG91YmxlIGEsIGRvdWJsZSBiKTsKLWV4dGVybiBkb3VibGUgb3Bfc3ViKGRvdWJsZSBhLCBkb3VibGUgYik7Ci1leHRlcm4gZG91YmxlIG9wX211bChkb3VibGUgYSwgZG91YmxlIGIpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgYWRkcmVzc2VzIG9mIHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSBpbnN0YWxsZWQgYXMgc2NyaXB0aW5nIGxhbmd1YWdlIGNvbnN0YW50cyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBpbnRlcmZhY2UuaQotdHlwZWRlZiBkb3VibGUgKCpPUF9GVU5DKShkb3VibGUsZG91YmxlKTsKLS4uLgotY29uc3QgT1BfRlVOQyBBREQgPSBvcF9hZGQ7Ci1jb25zdCBPUF9GVU5DIFNVQiA9IG9wX3N1YjsKLWNvbnN0IE9QX0ZVTkMgTVVMID0gb3BfbXVsOwotLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gd3JhcHBlZCwgdGhpcyB3b3VsZCBjcmVhdGUgdGhlIGNvbnN0YW50cyA8dHQ+QUREPC90dD4sPHR0PlNVQjwvdHQ+LCBhbmQgPHR0Pk1VTDwvdHQ+IGNvbnRhaW5pbmcgdGhlIGFkZHJlc3NlcyBvZiBDIGNhbGxiYWNrIGZ1bmN0aW9ucy4gV2UgY291bGQgdGhlbiBwYXNzIHRoZXNlIHRvIG90aGVyIEMgZnVuY3Rpb25zIGV4cGVjdGluZyBzdWNoIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIGFyZ3VtZW50cyBhcyBzaG93biAoZm9yIFRjbCkgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVkb19vcGVyYXRpb24gJEFERCAzIDQKLTcKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBTdHJ1Y3R1cmVzLCB1bmlvbnMsIGFuZCBvYmplY3Qgb3JpZW50ZWQgQyBwcm9ncmFtbWluZzwvaDI+Ci1JZiBTV0lHIGVuY291bnRlcnMgdGhlIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3R1cmUgb3IgdW5pb24sIGl0IHdpbGwgY3JlYXRlIGEgc2V0IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgeW91LiBXaGlsZSBTV0lHIGRvZXMgbm90IG5lZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIHRvIGJ1aWxkIGFuIGludGVyZmFjZSwgcHJvdmlkaW5nIGRlZmluaXRpb25zIG1ha2UgaXQgcG9zc2libGUgdG8gYWNjZXNzIHN0cnVjdHVyZSBtZW1iZXJzLiBUaGUgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBieSBTV0lHIHNpbXBseSB0YWtlIGEgcG9pbnRlciB0byBhbiBvYmplY3QgYW5kIGFsbG93IGFjY2VzcyB0byBhbiBpbmRpdmlkdWFsIG1lbWJlci4gRm9yIGV4YW1wbGUsIHRoZSBkZWNsYXJhdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFZlY3RvciB7Ci0JZG91YmxlIHgseSx6OwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1nZXRzIG1hcHBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIFZlY3Rvcl94X2dldChWZWN0b3IgKm9iaikgewotCXJldHVybiBvYmotJmd0O3g7Ci19Ci1kb3VibGUgVmVjdG9yX3lfZ2V0KFZlY3RvciAqb2JqKSB7IAotCXJldHVybiBvYmotJmd0O3k7Ci19Ci1kb3VibGUgVmVjdG9yX3pfZ2V0KFZlY3RvciAqb2JqKSB7IAotCXJldHVybiBvYmotJmd0O3o7Ci19Ci1kb3VibGUgVmVjdG9yX3hfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgdmFsdWUpIHsKLQlvYmotJmd0O3ggPSB2YWx1ZTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci1kb3VibGUgVmVjdG9yX3lfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgdmFsdWUpIHsKLQlvYmotJmd0O3kgPSB2YWx1ZTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci1kb3VibGUgVmVjdG9yX3pfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgdmFsdWUpIHsKLQlvYmotJmd0O3ogPSB2YWx1ZTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzYiPjwvYT48aDM+IFR5cGVkZWYgYW5kIHN0cnVjdHVyZXM8L2gzPgotU1dJRyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdCB3aGljaCBpcyBxdWl0ZSBjb21tb24gaW4gQyBwcm9ncmFtcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgewotCWRvdWJsZSB4LHksejsKLX0gVmVjdG9yOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIGVuY291bnRlcmVkLCBTV0lHIHdpbGwgYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBpcyBgVmVjdG9yJyBhbmQgY3JlYXRlIGFjY2Vzc29yIGZ1bmN0aW9ucyBsaWtlIGJlZm9yZS4gSWYgdHdvIGRpZmZlcmVudCBuYW1lcyBhcmUgdXNlZCBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGVkZWYgc3RydWN0IHZlY3Rvcl9zdHJ1Y3QgewotCWRvdWJsZSB4LHksejsKLX0gVmVjdG9yOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci10aGUgbmFtZSBgVmVjdG9yJyB3aWxsIHN0aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiAidmVjdG9yX3N0cnVjdCIuPHA+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IENoYXJhY3RlciBzdHJpbmdzIGFuZCBzdHJ1Y3R1cmVzPC9oMz4KLVN0cnVjdHVyZXMgaW52b2x2aW5nIGNoYXJhY3RlciBzdHJpbmdzIHJlcXVpcmUgc29tZSBjYXJlLiBTV0lHIGFzc3VtZXMgdGhhdCBhbGwgbWVtYmVycyBvZiB0eXBlIDx0dD5jaGFyICo8L3R0PiBoYXZlIGJlZW4gZHluYW1pY2FsbHkgYWxsb2NhdGVkIHVzaW5nIDx0dD5tYWxsb2MoKTwvdHQ+IGFuZCB0aGF0IHRoZXkgYXJlIE5VTEwtdGVybWluYXRlZCBBU0NJSSBzdHJpbmdzLiBXaGVuIHN1Y2ggYSBtZW1iZXIgaXMgbW9kaWZpZWQsIHRoZSBwcmV2aW91c2x5IGNvbnRlbnRzIHdpbGwgYmUgcmVsZWFzZWQsIGFuZCB0aGUgbmV3IGNvbnRlbnRzIGFsbG9jYXRlZC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLS4uLgotc3RydWN0IEZvbyB7Ci0JY2hhciAqbmFtZTsKLQkuLi4KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgYWNjZXNzb3IgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jaGFyICpGb29fbmFtZV9nZXQoRm9vICpvYmopIHsKLQlyZXR1cm4gRm9vLSZndDtuYW1lOwotfQotCi1jaGFyICpGb29fbmFtZV9zZXQoRm9vICpvYmosIGNoYXIgKmMpIHsKLQlpZiAob2JqLSZndDtuYW1lKSBmcmVlKG9iai0mZ3Q7bmFtZSk7Ci0Jb2JqLSZndDtuYW1lID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjKSsxKTsKLQlzdHJjcHkob2JqLSZndDtuYW1lLGMpOwotCXJldHVybiBvYmotJmd0O25hbWU7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgc2VlbXMgdG8gd29yayBtb3N0IG9mIHRoZSB0aW1lLCBidXQgb2NjYXNpb25hbGx5IGl0J3Mgbm90IGFsd2F5cyB3aGF0IHlvdSB3YW50LiBUeXBlbWFwcyBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvciBpZiBuZWNlc3NhcnkuPHA+Ci08YSBuYW1lPSJuMzgiPjwvYT48aDM+IEFycmF5IG1lbWJlcnM8L2gzPgotQXJyYXlzIG1heSBhcHBlYXIgYXMgdGhlIG1lbWJlcnMgb2Ygc3RydWN0dXJlcywgYnV0IHRoZXkgd2lsbCBiZSByZWFkLW9ubHkuIFNXSUcgd2lsbCB3cml0ZSBhbiBhY2Nlc3NvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5LCBidXQgd2lsbCBub3Qgd3JpdGUgYSBmdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGFycmF5IGl0c2VsZi4gVGhpcyByZXN0cmljdGlvbiBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBDIHdvbid0IGxldCB1cyBjaGFuZ2UgdGhlICJ2YWx1ZSIgb2YgYW4gYXJyYXkuIFdoZW4gdGhpcyBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQsIFNXSUcgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50ZXJmYWNlLmkgOiBMaW5lIDExNi4gV2FybmluZy4gQXJyYXkgbWVtYmVyIHdpbGwgYmUgcmVhZC1vbmx5Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGVsaW1pbmF0ZSB0aGUgd2FybmluZyBtZXNzYWdlLCB0eXBlbWFwcyBjYW4gYmUgdXNlZCwgYnV0IHRoaXMgaXMgZGlzY3Vzc2VkIGluIGEgbGF0ZXIgY2hhcHRlciAoYW5kIGJlc3QgcmVzZXJ2ZWQgZm9yIGV4cGVyaWVuY2VkIHVzZXJzKS4gT3RoZXJ3aXNlLCBpZiB5b3UgZ2V0IHRoaXMgd2FybmluZywgaXQgbWF5IGJlIGhhcm1sZXNzLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBDIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgPC9oMz4KLVdoaWxlIG5vdCBwYXJ0IG9mIHRoZSBDIGxhbmd1YWdlLCBpdCBpcyB1c3VhbGx5IHVzZWZ1bCB0byBoYXZlIHNvbWUgbWVjaGFuaXNtIGZvciBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBhbiBvYmplY3QuIFlvdSBjYW4sIG9mIGNvdXJzZSwgZG8gdGhpcyB5b3Vyc2VsZiBieSBtYWtpbmcgYW4gYXBwcm9wcmlhdGUgY2FsbCB0byA8dHQ+bWFsbG9jKCk8L3R0PiwgYnV0IFNXSUcgY2FuIG1ha2Ugc3VjaCBmdW5jdGlvbnMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGlmIHlvdSB1c2UgQysrIHN5bnRheCBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLS4uLgotc3RydWN0IFZlY3RvciB7Ci0JVmVjdG9yKCk7IAkJCS8vIFRlbGwgU1dJRyB0byBjcmVhdGUgYSBDIGNvbnN0cnVjdG9yCi0JflZlY3RvcigpOwkJCS8vIFRlbGwgU1dJRyB0byBjcmVhdGUgYSBDIGRlc3RydWN0b3IKLQlkb3VibGUgeCx5LHo7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdXNlZCB3aXRoIEMgY29kZSwgU1dJRyB3aWxsIGNyZWF0ZSB0d28gYWRkaXRpb25hbCBmdW5jdGlvbnMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5WZWN0b3IgKm5ld19WZWN0b3IoKSB7Ci0JcmV0dXJuIChWZWN0b3IgKikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLX0KLQotdm9pZCBkZWxldGVfVmVjdG9yKFZlY3RvciAqdikgewotCWZyZWUodik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIEMga25vd3Mgbm90aGluZyBhYm91dCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLCBTV0lHIGRvZXMtLS1hbmQgaXQgY2FuIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHNvbWUgZm9yIHlvdSBpZiB5b3Ugd2FudC4gVGhpcyBvbmx5IGFwcGxpZXMgdG8gQyBjb2RlLS1oYW5kbGluZyBvZiBDKysgaXMgaGFuZGxlZCBkaWZmZXJlbnRseS48cD4KLTxwPgotQXMgYW4gYWx0ZXJuYXRpdmUgdG8gZXhwbGljaXRseSBkZWZpbmluZyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLCBTV0lHIGNhbiBhbHNvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlbSB1c2luZyBlaXRoZXIgYSBjb21tYW5kIGxpbmUgb3B0aW9uIG9yIGEgcHJhZ21hLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtbWFrZV9kZWZhdWx0IGV4YW1wbGUuaSAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3I8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGZvbwotLi4uCi0lcHJhZ21hIG1ha2VfZGVmYXVsdCAJCQkJCS8vIE1ha2UgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0lcHJhZ21hIG5vX2RlZmF1bHQJCQkJCS8vIERpc2FibGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3b3JrcyB3aXRoIGJvdGggQyBhbmQgQysrLjxwPgotPGEgbmFtZT0ibjQwIj48L2E+PGgzPiBBZGRpbmcgbWVtYmVyIGZ1bmN0aW9ucyB0byBDIHN0cnVjdHVyZXM8L2gzPgotTWFueSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGNsYXNzZXMgYW5kIHN1cHBvcnRpbmcgb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nLiBGcm9tIGEgQyBzdGFuZHBvaW50LCBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcgcmVhbGx5IGp1c3QgYm9pbHMgZG93biB0byB0aGUgcHJvY2VzcyBvZiBhdHRhY2hpbmcgZnVuY3Rpb25zIHRvIHN0cnVjdHVyZXMuIFRoZXNlIGZ1bmN0aW9ucyB0eXBpY2FsbHkgb3BlcmF0ZSBvbiB0aGUgc3RydWN0dXJlIChvciBvYmplY3QpIGluIHNvbWUgd2F5IG9yIGFub3RoZXIuIFdoaWxlIHRoZXJlIGlzIGEgbmF0dXJhbCBtYXBwaW5nIG9mIEMrKyB0byBzdWNoIGEgc2NoZW1lLCB0aGVyZSBpcyBubyBkaXJlY3QgbWVjaGFuaXNtIGZvciB1dGlsaXppbmcgaXQgd2l0aCBDIGNvZGUuIEhvd2V2ZXIsIFNXSUcgcHJvdmlkZXMgYSBzcGVjaWFsIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGF0dGFjaCBtZXRob2RzIHRvIEMgc3RydWN0dXJlcyBmb3IgcHVycG9zZXMgb2YgYnVpbGRpbmcgYW4gb2JqZWN0IG9yaWVudGVkIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFN1cHBvc2UgeW91IGhhdmUgYSBDIGhlYWRlciBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogZmlsZSA6IHZlY3Rvci5oICovCi0uLi4KLXR5cGVkZWYgc3RydWN0IHsKLQlkb3VibGUgeCx5LHo7Ci19IFZlY3RvcjsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotWW91IGNhbiBtYWtlIGEgVmVjdG9yIGxvb2sgYWxvdCBsaWtlIGEgY2xhc3MgYnkgZG9pbmcgdGhlIGZvbGxvd2luZyBpbiBhbiBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gZmlsZSA6IHZlY3Rvci5pCi0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgInZlY3Rvci5oIgotJX0KLQotJWluY2x1ZGUgdmVjdG9yLmggCQkJCS8vIEp1c3QgZ3JhYiBvcmlnaW5hbCBDIGhlYWRlciBmaWxlCi0lYWRkbWV0aG9kcyBWZWN0b3IgeyAJCQkJLy8gQXR0YWNoIHRoZXNlIGZ1bmN0aW9ucyB0byBzdHJ1Y3QgVmVjdG9yCi0JVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsKLQkJVmVjdG9yICp2OwotCQl2ID0gKFZlY3RvciAqdikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLQkJdi0mZ3Q7eCA9IHg7Ci0JCXYtJmd0O3kgPSB5OwotCQl2LSZndDt6ID0gejsKLQkJcmV0dXJuIHY7Ci0JfQotCX5WZWN0b3IoKSB7Ci0JCWZyZWUoc2VsZik7Ci0JfQotCWRvdWJsZSBtYWduaXR1ZGUoKSB7Ci0JCXJldHVybiBzcXJ0KHNlbGYtJmd0O3gqc2VsZi0mZ3Q7eCtzZWxmLSZndDt5KnNlbGYtJmd0O3krc2VsZi0mZ3Q7eipzZWxmLSZndDt6KTsKLQl9Ci0Jdm9pZCBwcmludCgpIHsKLQkJcHJpbnRmKCJWZWN0b3IgWyVnLCAlZywgJWddXG4iLCBzZWxmLSZndDt4LHNlbGYtJmd0O3ksc2VsZi0mZ3Q7eik7Ci0JfQotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCB3aGVuIHVzZWQgd2l0aCBzaGFkb3cgY2xhc3NlcyBpbiBQeXRob24sIHlvdSBjYW4gZG8gdGhpbmdzIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyZndDsmZ3Q7IHYgPSBWZWN0b3IoMyw0LDApIAkJCQkJIyBDcmVhdGUgYSBuZXcgdmVjdG9yCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgdi5tYWduaXR1ZGUoKQkJCQkJIyBQcmludCBtYWduaXR1ZGUKLTUuMAotJmd0OyZndDsmZ3Q7IHYucHJpbnQoKQkJCQkJIyBQcmludCBpdCBvdXQKLVsgMywgNCwgMCBdCi0mZ3Q7Jmd0OyZndDsgZGVsIHYJCQkJCSMgRGVzdHJveSBpdAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlIGNhbiBhbHNvIGJlIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIFZlY3RvciBzdHJ1Y3R1cmUuIEZvciBleGFtcGxlOjxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBmaWxlIDogdmVjdG9yLmkKLSVtb2R1bGUgbXltb2R1bGUKLSV7Ci0jaW5jbHVkZSAidmVjdG9yLmgiCi0lfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZG91YmxlIHgseSx6OwotCSVhZGRtZXRob2RzIHsKLQkJVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsgLi4uIH0KLQkJflZlY3RvcigpIHsgLi4uIH0KLQkJLi4uCi0JfQotfSBWZWN0b3I7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUZpbmFsbHksIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBleHRlcm5hbGx5IHdyaXR0ZW4gZnVuY3Rpb25zIHByb3ZpZGVkIHRoZXkgZm9sbG93IHRoZSBuYW1pbmcgY29udmVudGlvbiB1c2VkIGluIHRoaXMgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IHZlY3Rvci5jICovCi0vKiBWZWN0b3IgbWV0aG9kcyAqLwotI2luY2x1ZGUgInZlY3Rvci5oIgotVmVjdG9yICpuZXdfVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsKLQlWZWN0b3IgKnY7Ci0JdiA9IChWZWN0b3IgKikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLQl2LSZndDt4ID0geDsKLQl2LSZndDt5ID0geTsKLQl2LSZndDt6ID0gejsKLQlyZXR1cm4gdjsKLX0KLXZvaWQgZGVsZXRlX1ZlY3RvcihWZWN0b3IgKnYpIHsKLQlmcmVlKHYpOwotfQotCi1kb3VibGUgVmVjdG9yX21hZ25pdHVkZShWZWN0b3IgKnYpIHsKLQlyZXR1cm4gc3FydCh2LSZndDt4KnYtJmd0O3grdi0mZ3Q7eSp2LSZndDt5K3YtJmd0O3oqdi0mZ3Q7eik7Ci19Ci0KLS8vIEZpbGUgOiB2ZWN0b3IuaQotLy8gSW50ZXJmYWNlIGZpbGUKLSVtb2R1bGUgbXltb2R1bGUKLSV7Ci0jaW5jbHVkZSAidmVjdG9yLmgiCi0lfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZG91YmxlIHgseSx6OwotCSVhZGRtZXRob2RzIHsKLQkJZG91YmxlIG1hZ25pdHVkZSgpOyAJCQkvLyBUaGlzIHdpbGwgY2FsbCBWZWN0b3JfbWFnbml0dWRlCi0JCS4uLgotCX0KLX0gVmVjdG9yOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TbyB3aHkgYm90aGVyIHdpdGggYWxsIG9mIHRoaXMgPHR0PiVhZGRtZXRob2RzPC90dD4gYnVzaW5lc3M/IEluIHNob3J0LCB5b3UgY2FuIHVzZSBpdCB0byBtYWtlIHNvbWUgcHJldHR5IGNvb2wgYG9iamVjdCBvcmllbnRlZCcgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMgdG8gQyBwcm9ncmFtcyB3aXRob3V0IGhhdmluZyB0byByZXdyaXRlIGFueXRoaW5nIGluIEMrKy4gPHA+Ci08YSBuYW1lPSJuNDEiPjwvYT48aDM+IE5lc3RlZCBzdHJ1Y3R1cmVzPC9oMz4KLU9jY2FzaW9uYWxseSwgYSBDIHByb2dyYW0gd2lsbCBpbnZvbHZlIHN0cnVjdHVyZXMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT50eXBlZGVmIHN0cnVjdCBPYmplY3QgewotCWludCBvYmp0eXBlOwotCXVuaW9uIHsKLQkJaW50IAlpdmFsdWU7Ci0JCWRvdWJsZQlkdmFsdWU7Ci0JCWNoYXIJKnN0cnZhbHVlOwotCQl2b2lkCSpwdHJ2YWx1ZTsKLQl9IGludFJlcDsKLX0gT2JqZWN0OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIFNXSUcgZW5jb3VudGVycyB0aGlzLCBpdCBwZXJmb3JtcyBhIHN0cnVjdHVyZSBzcGxpdHRpbmcgb3BlcmF0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgZGVjbGFyYXRpb24gaW50byB0aGUgZXF1aXZhbGVudCBvZiB0aGUgZm9sbG93aW5nOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGVkZWYgdW5pb24gewotCWludCAJCWl2YWx1ZTsKLQlkb3VibGUJCWR2YWx1ZTsKLQljaGFyCQkqc3RydmFsdWU7Ci0Jdm9pZAkJKnB0cnZhbHVlOwotfSBPYmplY3RfaW50UmVwOwotCi10eXBlZGVmIHN0cnVjdCBPYmplY3QgewotCWludCBvYmpUeXBlOwotCU9iamVjdF9pbnRSZXAgaW50UmVwOwotfSBPYmplY3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNXSUcgd2lsbCBjcmVhdGUgYW4gPHR0Pk9iamVjdF9pbnRSZXA8L3R0PiBzdHJ1Y3R1cmUgZm9yIHVzZSBpbnNpZGUgdGhlIGludGVyZmFjZSBmaWxlLiBBY2Nlc3NvciBmdW5jdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGZvciBib3RoIHN0cnVjdHVyZXMuIEluIHRoaXMgY2FzZSwgZnVuY3Rpb25zIGxpa2UgdGhpcyB3b3VsZCBiZSBjcmVhdGVkIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5PYmplY3RfaW50UmVwICpPYmplY3RfaW50UmVwX2dldChPYmplY3QgKm8pIHsKLQlyZXR1cm4gKE9iamVjdF9pbnRSZXAgKikgJmFtcDtvLSZndDtpbnRSZXA7Ci19Ci1pbnQgT2JqZWN0X2ludFJlcF9pdmFsdWVfZ2V0KE9iamVjdF9pbnRSZXAgKm8pIHsKLQlyZXR1cm4gby0mZ3Q7aXZhbHVlOwotfQotaW50IE9iamVjdF9pbnRSZXBfaXZhbHVlX3NldChPYmplY3RfaW50UmVwICpvLCBpbnQgdmFsdWUpIHsKLQlyZXR1cm4gKG8tJmd0O2l2YWx1ZSA9IHZhbHVlKTsKLX0KLWRvdWJsZSBPYmplY3RfaW50UmVwX2R2YWx1ZV9nZXQoT2JqZWN0X2ludFJlcCAqbykgewotCXJldHVybiBvLSZndDtkdmFsdWU7Ci19Ci0uLi4gZXRjIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JcyBpdCBoYWlyeT8gWW91IGJldC4gRG9lcyBpdCB3b3JrPyBXZWxsLCBzdXJwcmlzaW5nbHkgeWVzLiBXaGVuIHVzZWQgd2l0aCBQeXRob24gYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLCBpdCdzIGV2ZW4gcG9zc2libGUgdG8gYWNjZXNzIHRoZSBuZXN0ZWQgbWVtYmVycyBqdXN0IGxpa2UgeW91IGV4cGVjdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQZXJsNSBzY3JpcHQgZm9yIGFjY2Vzc2luZyBuZXN0ZWQgbWVtYmVyCi0kbyA9IENyZWF0ZU9iamVjdCgpOyAJCQkJIyBDcmVhdGUgYW4gb2JqZWN0IHNvbWVob3cKLSRvLSZndDt7aW50UmVwfS0mZ3Q7e2l2YWx1ZX0gPSA3IAkJCQkjIENoYW5nZSB2YWx1ZSBvZiBvLmludFJlcC5pdmFsdWUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSWYgeW91J3ZlIGdvdCBhIGJ1bmNoIG9mIG5lc3RlZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zLCBpdCBpcyBjZXJ0YWlubHkgYWR2aXNhYmxlIHRvIGNoZWNrIHRoZW0gb3V0IGFmdGVyIHJ1bm5pbmcgU1dJRy4gSG93ZXZlciwgdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHRoZXkgd2lsbCB3b3JrLiBJZiBub3QsIHlvdSBjYW4gYWx3YXlzIHJlbW92ZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbiBhbmQgd3JpdGUgeW91ciBvd24gc2V0IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucy48cD4KLTxhIG5hbWU9Im40MiI+PC9hPjxoMz4gT3RoZXIgdGhpbmdzIHRvIG5vdGUgYWJvdXQgc3RydWN0dXJlczwvaDM+Ci1TV0lHIGRvZXNuJ3QgY2FyZSBpZiB0aGUgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdHVyZSBleGFjdGx5IG1hdGNoZXMgdGhhdCB1c2VkIGluIHRoZSB1bmRlcmx5aW5nIEMgY29kZSAoZXhjZXB0IGluIHRoZSBjYXNlIG9mIG5lc3RlZCBzdHJ1Y3R1cmVzKS4gRm9yIHRoaXMgcmVhc29uLCB0aGVyZSBhcmUgbm8gcHJvYmxlbXMgb21pdHRpbmcgcHJvYmxlbWF0aWMgbWVtYmVycyBvciBzaW1wbHkgb21pdHRpbmcgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGFsdG9nZXRoZXIuIElmIHlvdSBhcmUgaGFwcHkgc2ltcGx5IHBhc3NpbmcgcG9pbnRlcnMgYXJvdW5kLCB0aGlzIGNhbiBiZSBkb25lIHdpdGhvdXQgZXZlciBnaXZpbmcgU1dJRyBhIHN0cnVjdHVyZSBkZWZpbml0aW9uLjxwPgotPHA+Ci1JdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgbW9zdCBsYW5ndWFnZSBtb2R1bGVzIG1heSBjaG9vc2UgdG8gYnVpbGQgYSBtb3JlIGFkdmFuY2VkIGludGVyZmFjZS4gWW91IG1heSBuZXZlciB1c2UgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UgZGVzY3JpYmVkIGhlcmUsIGFsdGhvdWdoIG1vc3Qgb2YgU1dJRydzIGxhbmd1YWdlIG1vZHVsZXMgdXNlIGl0IGluIHNvbWUgd2F5IG9yIGFub3RoZXIuPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gQysrIHN1cHBvcnQ8L2gyPgotU1dJRydzIHN1cHBvcnQgZm9yIEMrKyBpcyBhbiBleHRlbnNpb24gb2YgdGhlIHN1cHBvcnQgZm9yIEMgZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBzdHJ1Y3R1cmVzLiBIb3dldmVyLCBTV0lHIG9ubHkgc3VwcG9ydHMgYSBzdWJzZXQgb2YgdGhlIEMrKyBsYW5ndWFnZS4gSXQgaGFzIG5ldmVyIGJlZW4gbXkgZ29hbCB0byB3cml0ZSBhIGZ1bGwgQysrIGNvbXBpbGVyIG9yIHRvIHR1cm4gc2NyaXB0aW5nIGxhbmd1YWdlcyBpbnRvIHNvbWUgc29ydCBvZiB3ZWlyZCBwc2V1ZG8gQysrIGludGVycHJldGVyIChjb25zaWRlcmluZyBob3cgaGFyZCBpdCBpcyB0byB3cml0ZSBhIEMrKyBjb21waWxlciwgSSdtIG5vdCBzdXJlIHRoaXMgd291bGQgZXZlbiBiZSBmZWFzaWJsZSBhbnl3YXlzKS4gPHA+Ci08cD4KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgU1dJRydzIGxvdy1sZXZlbCBhY2Nlc3MgdG8gQysrIGRlY2xhcmF0aW9ucy4gSW4gbWFueSBpbnN0YW5jZXMsIHRoaXMgbG93LWxldmVsIGludGVyZmFjZSBtYXkgYmUgaGlkZGVuIGJ5IHNoYWRvdyBjbGFzc2VzIG9yIGFuIGFsdGVybmF0aXZlIGNhbGxpbmcgbWVjaGFuaXNtICh0aGlzIGlzIHVzdWFsbHkgbGFuZ3VhZ2UgZGVwZW5kZW50IGFuZCBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIGxhdGVyIGNoYXB0ZXJzKS48cD4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gU3VwcG9ydGVkIEMrKyBmZWF0dXJlczwvaDM+Ci1TV0lHIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQysrIGZlYXR1cmVzIDo8cD4KLTxwPgotPHVsPgotPGxpPlNpbXBsZSBjbGFzcyBkZWZpbml0aW9ucwotPGxpPkNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMKLTxsaT5WaXJ0dWFsIGZ1bmN0aW9ucwotPGxpPlB1YmxpYyBpbmhlcml0YW5jZSAoaW5jbHVkaW5nIG11bHRpcGxlIGluaGVyaXRhbmNlKQotPGxpPlN0YXRpYyBmdW5jdGlvbnMKLTxsaT5SZWZlcmVuY2VzCi08L3VsPgotPHA+Ci1UaGUgZm9sbG93aW5nIEMrKyBmZWF0dXJlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgOjxwPgotPHA+Ci08dWw+Ci08bGk+T3BlcmF0b3Igb3ZlcmxvYWRpbmcKLTxsaT5GdW5jdGlvbiBvdmVybG9hZGluZyAod2l0aG91dCByZW5hbWluZykKLTxsaT5UZW1wbGF0ZXMgKGFueXRoaW5nIHRoYXQgd291bGQgYmUgZGVmaW5lZCB1c2luZyB0aGUgYDx0dD50ZW1wbGF0ZTwvdHQ+JyBrZXl3b3JkKS4KLTxsaT5GcmllbmRzCi08bGk+TmVzdGVkIGNsYXNzZXMKLTxsaT5OYW1lc3BhY2VzCi08bGk+UG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KLTwvdWw+Ci08cD4KLVNpbmNlIFNXSUcncyBDKysgc3VwcG9ydCBpcyBhICJ3b3JrIGluIHByb2dyZXNzIiwgbWFueSBvZiB0aGVzZSBsaW1pdGF0aW9ucyBtYXkgYmUgbGlmdGVkIGluIGZ1dHVyZSByZWxlYXNlcy4gSW4gcGFydGljdWxhciwgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgYW5kIG5lc3RlZCBjbGFzc2VzLCBtYXkgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIE9wZXJhdG9yIG92ZXJsb2FkaW5nIGFuZCB0ZW1wbGF0ZXMgYXJlIHVubGlrZWx5IHRvIGJlIHN1cHBvcnRlZCBhbnl0aW1lIGluIHRoZSBuZWFyIGZ1dHVyZSwgYnV0IEknbSBub3QgZ29pbmcgdG8gcnVsZSBvdXQgdGhlIHBvc3NpYmlsaXR5IGluIGxhdGVyIHJlbGVhc2VzLjxwPgotPGEgbmFtZT0ibjQ0Ij48L2E+PGgzPiBDKysgZXhhbXBsZTwvaDM+Ci1UaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYSBTV0lHIGludGVyZmFjZSBmaWxlIGZvciBhIHNpbXBsZSBDKysgY2xhc3MuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBsaXN0Ci0lewotI2luY2x1ZGUgImxpc3QuaCIKLSV9Ci0KLS8vIFZlcnkgc2ltcGxlIEMrKyBleGFtcGxlIGZvciBsaW5rZWQgbGlzdAotCi1jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLSAgTGlzdCgpOwotICB+TGlzdCgpOwotICBpbnQgIHNlYXJjaChjaGFyICp2YWx1ZSk7Ci0gIHZvaWQgaW5zZXJ0KGNoYXIgKik7Ci0gIHZvaWQgcmVtb3ZlKGNoYXIgKik7Ci0gIGNoYXIgKmdldChpbnQgbik7Ci0gIGludCAgbGVuZ3RoOwotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIGNvbXBpbGluZyBDKysgY29kZSwgaXQgaXMgY3JpdGljYWwgdGhhdCBTV0lHIGJlIGNhbGxlZCB3aXRoIHRoZSBgPHR0Pi1jKys8L3R0Picgb3B0aW9uLiBUaGlzIGNoYW5nZXMgdGhlIHdheSBhIG51bWJlciBvZiBjcml0aWNhbCBmZWF0dXJlcyBhcmUgaGFuZGxlZCB3aXRoIHJlc3BlY3QgdG8gZGlmZmVyZW5jZXMgYmV0d2VlbiBDIGFuZCBDKysuIEl0IGFsc28gZW5hYmxlcyB0aGUgZGV0ZWN0aW9uIG9mIEMrKyBrZXl3b3Jkcy4gV2l0aG91dCB0aGUgPHR0Pi1jKys8L3R0PiBmbGFnLCBTV0lHIHdpbGwgZWl0aGVyIGlzc3VlIGEgd2FybmluZyBvciBhIGxhcmdlIG51bWJlciBvZiBzeW50YXggZXJyb3JzIGlmIGl0IGVuY291bnRlcnMgYW55IEMrKyBjb2RlIGluIGFuIGludGVyZmFjZSBmaWxlLjxwPgotPGEgbmFtZT0ibjQ1Ij48L2E+PGgzPiBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzPC9oMz4KLUMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFyZSB0cmFuc2xhdGVkIGludG8gYWNjZXNzb3IgZnVuY3Rpb25zIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCAqIG5ld19MaXN0KHZvaWQpIHsKLQlyZXR1cm4gbmV3IExpc3Q7Ci19Ci12b2lkIGRlbGV0ZV9MaXN0KExpc3QgKmwpIHsKLQlkZWxldGUgbDsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSWYgdGhlIG9yaWdpbmFsIEMrKyBjbGFzcyBkb2VzIG5vdCBoYXZlIGFueSBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMsIHB1dHRpbmcgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBpbiB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSB3aWxsIGNhdXNlIFNXSUcgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgZm9yIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG9mIGFuIG9iamVjdC48cD4KLTxhIG5hbWU9Im40NiI+PC9hPjxoMz4gTWVtYmVyIGZ1bmN0aW9uczwvaDM+Ci1NZW1iZXIgZnVuY3Rpb25zIGFyZSB0cmFuc2xhdGVkIGludG8gYWNjZXNzb3IgZnVuY3Rpb25zIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50IExpc3Rfc2VhcmNoKExpc3QgKm9iaiwgY2hhciAqdmFsdWUpIHsKLQlyZXR1cm4gb2JqLSZndDtzZWFyY2godmFsdWUpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1WaXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMgYXJlIHRyZWF0ZWQgaW4gYW4gaWRlbnRpY2FsIG1hbm5lciBzaW5jZSB0aGUgQysrIGNvbXBpbGVyIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IgdXMgYXV0b21hdGljYWxseS48cD4KLTxhIG5hbWU9Im40NyI+PC9hPjxoMz4gU3RhdGljIG1lbWJlcnM8L2gzPgotU3RhdGljIG1lbWJlciBmdW5jdGlvbnMgYXJlIGNhbGxlZCBkaXJlY3RseSB3aXRob3V0IG1ha2luZyBhbnkgYWRkaXRpb25hbCBDIHdyYXBwZXJzLiBGb3IgZXhhbXBsZSwgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gPHR0PnByaW50KExpc3QgKmwpPC90dD4gd2lsbCBzaW1wbHkgYmUgY2FsbGVkIGFzIDx0dD5MaXN0OjpwcmludChMaXN0ICpsKTwvdHQ+IGluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLjxwPgotPGEgbmFtZT0ibjQ4Ij48L2E+PGgzPiBNZW1iZXIgZGF0YTwvaDM+Ci1NZW1iZXIgZGF0YSBpcyBoYW5kbGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGFzIHVzZWQgZm9yIEMgc3RydWN0dXJlcy4gQSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB3aWxsIGJlIGNyZWF0ZWQuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQgTGlzdF9sZW5ndGhfZ2V0KExpc3QgKm9iaikgewotCXJldHVybiBvYmotJmd0O2xlbmd0aDsKLX0KLWludCBMaXN0X2xlbmd0aF9zZXQoTGlzdCAqb2JqLCBpbnQgdmFsdWUpIHsKLQlvYmotJmd0O2xlbmd0aCA9IHZhbHVlOwotCXJldHVybiB2YWx1ZTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSByZWFkLW9ubHkgbWVtYmVyIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSA8dHQ+JXJlYWRvbmx5PC90dD4gYW5kIDx0dD4lcmVhZHdyaXRlPC90dD4gZGlyZWN0aXZlcy4gRm9yIGV4YW1wbGUsIHdlIHByb2JhYmx5IHdvdWxkbid0IHdhbnQgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBsZW5ndGggb2YgYSBsaXN0IHNvIHdlIGNvdWxkIGRvIHRoZSBmb2xsb3dpbmcgdG8gbWFrZSB0aGUgdmFsdWUgYXZhaWxhYmxlLCBidXQgcmVhZC1vbmx5LjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3QgewotcHVibGljOgotLi4uCi0lcmVhZG9ubHkKLQlpbnQgbGVuZ3RoOwotJXJlYWR3cml0ZQotLi4uCi19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQ5Ij48L2E+PGgzPiBQcm90ZWN0aW9uPC9oMz4KLVNXSUcgY2FuIG9ubHkgd3JhcCBjbGFzcyBtZW1iZXJzIHRoYXQgYXJlIGRlY2xhcmVkIHB1YmxpYy4gQW55dGhpbmcgc3BlY2lmaWVkIGluIGEgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc2VjdGlvbiB3aWxsIHNpbXBseSBiZSBpZ25vcmVkLiBUbyBzaW1wbGlmeSB5b3VyIGludGVyZmFjZSBmaWxlLCB5b3UgbWF5IHdhbnQgdG8gY29uc2lkZXIgZWxpbWluYXRpbmcgYWxsIHByaXZhdGUgYW5kIHByb3RlY3RlZCBkZWNsYXJhdGlvbnMgKGlmIHlvdSd2ZSBjb3BpZWQgYSBDKysgaGVhZGVyIGZpbGUgZm9yIGV4YW1wbGUpLjxwPgotPHA+Ci1CeSBkZWZhdWx0LCBtZW1iZXJzIG9mIGEgY2xhc3MgZGVmaW5pdGlvbiBhcmUgYXNzdW1lZCB0byBiZSBwcml2YXRlIHVudGlsIHlvdSBleHBsaWNpdGx5IGdpdmUgYSBgPHR0PnB1YmxpYzo8L3R0PicgZGVjbGFyYXRpb24gKFRoaXMgaXMgdGhlIHNhbWUgY29udmVudGlvbiB1c2VkIGJ5IEMrKykuPHA+Ci08YSBuYW1lPSJuNTAiPjwvYT48aDM+IEVudW1zIGFuZCBjb25zdGFudHM8L2gzPgotRW51bWVyYXRpb25zIGFuZCBjb25zdGFudHMgcGxhY2VkIGluIGEgY2xhc3MgZGVmaW5pdGlvbiBhcmUgbWFwcGVkIGludG8gY29uc3RhbnRzIHdpdGggdGhlIGNsYXNzbmFtZSBhcyBhIHByZWZpeC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIFN3aWcgewotcHVibGljOgotCWVudW0ge0FMRSwgTEFHRVIsIFBPUlRFUiwgU1RPVVR9OwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotR2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGNvbnN0YW50cyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+U3dpZ19BTEUgPSBTd2lnOjpBTEUKLVN3aWdfTEFHRVIgPSBTd2lnOjpMQUdFUgotU3dpZ19QT1JURVIgPSBTd2lnOjpQT1JURVIKLVN3aWdfU1RPVVQgPSBTd2lnOjpTVE9VVAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1NZW1iZXJzIGRlY2xhcmVkIGFzIDx0dD5jb25zdDwvdHQ+IGFyZSB3cmFwcGVkIGluIGEgc2ltaWxhciBtYW5uZXIuPHA+Ci08YSBuYW1lPSJuNTEiPjwvYT48aDM+IFJlZmVyZW5jZXM8L2gzPgotQysrIHJlZmVyZW5jZXMgYXJlIHN1cHBvcnRlZCwgYnV0IFNXSUcgd2lsbCB0cmVhdCB0aGVtIGFzIHBvaW50ZXJzLiBGb3IgZXhhbXBsZSwgYSBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIEZvbyB7Ci1wdWJsaWM6Ci0JZG91YmxlIGJhcihkb3VibGUgJmFtcDthKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotd2lsbCBiZSBhY2Nlc3NlZCB1c2luZyBhIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIEZvb19iYXIoRm9vICpvYmosIGRvdWJsZSAqYSkgewotCW9iai0mZ3Q7YmFyKCphKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRnVuY3Rpb25zIHJldHVybmluZyBhIHJlZmVyZW5jZSB3aWxsIGJlIG1hcHBlZCBpbnRvIGZ1bmN0aW9ucyByZXR1cm5pbmcgcG9pbnRlcnMuPHA+Ci08YSBuYW1lPSJuNTIiPjwvYT48aDM+IEluaGVyaXRhbmNlPC9oMz4KLVNXSUcgc3VwcG9ydHMgYmFzaWMgQysrIHB1YmxpYyBpbmhlcml0YW5jZSBvZiBjbGFzc2VzIGFuZCBhbGxvd3MgYm90aCBzaW5nbGUgYW5kIG11bHRpcGxlIGluaGVyaXRhbmNlLiBUaGUgU1dJRyB0eXBlLWNoZWNrZXIga25vd3MgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJhc2UgYW5kIGRlcml2ZWQgY2xhc3NlcyBhbmQgd2lsbCBhbGxvdyBwb2ludGVycyB0byBhbnkgb2JqZWN0IG9mIGEgZGVyaXZlZCBjbGFzcyB0byBiZSB1c2VkIGluIGZ1bmN0aW9ucyBvZiBhIGJhc2UgY2xhc3MuIFRoZSB0eXBlLWNoZWNrZXIgcHJvcGVybHkgY2FzdHMgcG9pbnRlciB2YWx1ZXMgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuPHA+Ci1TV0lHIGRvZXMgbm90IHN1cHBvcnQgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgaW5oZXJpdGFuY2UgKGl0IHdpbGwgYmUgcGFyc2VkLCBidXQgaWdub3JlZCkuPHA+Ci08cD4KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgU1dJRyBoYW5kbGVzIGluaGVyaXRhbmNlLiBGb3IgY2xhcml0eSwgdGhlIGZ1bGwgQysrIGNvZGUgaGFzIGJlZW4gb21pdHRlZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBzaGFwZXMuaQotJW1vZHVsZSBzaGFwZXMKLSV7Ci0jaW5jbHVkZSAic2hhcGVzLmgiCi0lfQotCi1jbGFzcyBTaGFwZSB7Ci1wdWJsaWM6Ci0JdmlydHVhbCBkb3VibGUgYXJlYSgpID0gMDsKLQl2aXJ0dWFsIGRvdWJsZSBwZXJpbWV0ZXIoKSA9IDA7Ci0Jdm9pZCAgICBzZXRfbG9jYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KTsKLX07Ci1jbGFzcyBDaXJjbGUgOiBwdWJsaWMgU2hhcGUgewotcHVibGljOgotCUNpcmNsZShkb3VibGUgcmFkaXVzKTsKLQl+Q2lyY2xlKCk7Ci0JZG91YmxlIGFyZWEoKTsKLQlkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotY2xhc3MgU3F1YXJlIDogcHVibGljIFNoYXBlIHsKLXB1YmxpYzoKLQlTcXVhcmUoZG91YmxlIHNpemUpOwotCX5TcXVhcmUoKTsKLQlkb3VibGUgYXJlYSgpOwotCWRvdWJsZSBwZXJpbWV0ZXIoKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB3cmFwcGVkIGludG8gUGVybDUsIHdlIGNhbiBub3cgcGVyZm9ybSB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmJlYXpsZXlAc2xhY2slIHBlcmw1LjAwMwotdXNlIHNoYXBlczsKLSRjaXJjbGUgPSBzaGFwZXM6Om5ld19DaXJjbGUoNyk7Ci0kc3F1YXJlID0gc2hhcGVzOjpuZXdfU3F1YXJlKDEwKTsKLXByaW50IHNoYXBlczo6Q2lyY2xlX2FyZWEoJGNpcmNsZSksIlxuIjsKLSMgTm90aWNlIHVzZSBvZiBiYXNlIGNsYXNzIGJlbG93Ci1wcmludCBzaGFwZXM6OlNoYXBlX2FyZWEoJGNpcmNsZSksIlxuIjsKLXByaW50IHNoYXBlczo6U2hhcGVfYXJlYSgkc3F1YXJlKSwiXG4iOwotc2hhcGVzOjpTaGFwZV9zZXRfbG9jYXRpb24oJHNxdWFyZSwyLC0zKTsKLXByaW50IHNoYXBlczo6U2hhcGVfcGVyaW1ldGVyKCRzcXVhcmUpLCJcbiI7Ci0mbHQ7Y3RybC1kJmd0OwotMTUzLjkzODA0MDA0NTk5OTk5NzU3Ci0xNTMuOTM4MDQwMDQ1OTk5OTk3NTcKLTEwMC4wMDAwMDAwMDAwMDAwMDAwMAotNDAuMDAwMDAwMDAwMDAwMDAwMDAKLSAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIG91ciBleGFtcGxlLCB3ZSBoYXZlIGNyZWF0ZWQgQ2lyY2xlIGFuZCBTcXVhcmUgb2JqZWN0cy4gV2UgY2FuIGNhbGwgbWVtYmVyIGZ1bmN0aW9ucyBvbiBlYWNoIG9iamVjdCBieSBtYWtpbmcgY2FsbHMgdG8gPHR0PkNpcmNsZV9hcmVhPC90dD4sIDx0dD5TcXVhcmVfYXJlYTwvdHQ+LCBhbmQgc28gb24uIEhvd2V2ZXIsIHdlIGNhbiBjYW4gYWNjb21wbGlzaCB0aGUgc2FtZSB0aGluZyBieSBzaW1wbHkgdXNpbmcgdGhlIDx0dD5TaGFwZV9hcmVhPC90dD4gZnVuY3Rpb24gb24gZWl0aGVyIG9iamVjdC48cD4KLTxhIG5hbWU9Im41MyI+PC9hPjxoMz4gVGVtcGxhdGVzPC9oMz4KLVNXSUcgZG9lcyBub3Qgc3VwcG9ydCB0ZW1wbGF0ZSBkZWZpbml0aW9ucy0tdGhhdCBpcywgaXQgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyB0aGF0IHdvdWxkIGJlIGRlY2xhcmVkIGluIEMrKyB1c2luZyB0aGUgYDx0dD50ZW1wbGF0ZTwvdHQ+JyBrZXl3b3JkLiBJZiBhIHRlbXBsYXRlIGRlZmluaXRpb24gaXMgZm91bmQsIFNXSUcgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgYXR0ZW1wdCB0byBpZ25vcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRpcmUgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCBhIHRlbXBsYXRlIGNsYXNzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSBpZ25vcmVkIGJ5IFNXSUcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGUgOiBsaXN0LmgKLSNkZWZpbmUgTUFYSVRFTVMgMTAwCi10ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyBjbGFzcyBMaXN0IHsgCQkJCQkJLy8gRW50aXJlIGNsYXNzIGlzIGlnbm9yZWQgYnkgU1dJRwotcHJpdmF0ZToKLSAgICBUICpkYXRhOwotICAgIGludCBuaXRlbXM7Ci1wdWJsaWM6Ci0gICAgTGlzdCgpIHsKLSAgICAgIGRhdGEgPSBuZXcgVCBbTUFYSVRFTVNdOwotICAgICAgbml0ZW1zID0gMDsKLSAgICB9Ci0gICAgfkxpc3QoKSB7Ci0gICAgICBkZWxldGUgW10gZGF0YTsKLSAgICB9OwotICAgIHZvaWQgYXBwZW5kKFQgb2JqKSB7Ci0gICAgICBpZiAobml0ZW1zICZsdDsgTUFYSVRFTVMpIHsKLSAgICAgICAgZGF0YVtuaXRlbXMrK10gPSBvYmo7Ci0gICAgICB9Ci0gICAgfQotICAgIGludCBsZW5ndGgoKSB7Ci0gICAgICByZXR1cm4gbml0ZW1zOwotICAgIH0KLSAgICBUIGdldChpbnQgbikgewotICAgICAgcmV0dXJuIGRhdGFbbl07Ci0gICAgfQotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSG93ZXZlciwgU1dJRyBjYW4gc3VwcG9ydCBpbnN0YW50aWF0aW9ucyBvZiBhIHRlbXBsYXRlIGFuZCB0eXBlcyBpbnZvbHZpbmcgdGVtcGxhdGVzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSB3b3VsZCBiZSBsZWdhbCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gU1dJRyBpbnRlcmZhY2UgaW52b2x2aW5nIGEgdGVtcGxhdGUKLSVtb2R1bGUgZXhhbXBsZQotJXsKLSNpbmNsdWRlICJsaXN0LmgiCQkJCS8vIEdldCBUZW1wbGF0ZSBkZWZpbml0aW9uIAotJX0KLQotLy8gTm93IGEgZnVuY3Rpb24gaW52b2x2aW5nIHRlbXBsYXRlcwotZXh0ZXJuIHZvaWQgUHJpbnREYXRhKExpc3QmbHQ7ZG91YmxlJmd0OyAmYW1wO2wpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgdHlwZSAiPHR0Pkxpc3QmbHQ7ZG91YmxlPC90dD4mZ3Q7IiBiZWNvbWVzIHRoZSBkYXRhdHlwZSBmb3IgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlci4gSW4sIFB5dGhvbiBpdCBtaWdodCBhcHBlYXIgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgcHJpbnQgY2wKLV84MGEyZGY4X0xpc3QmbHQ7ZG91YmxlJmd0O19wCi0mZ3Q7Jmd0OyZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gY3JlYXRlIHNwZWNpZmljIG9iamVjdHMsIHlvdSBtYXkgbmVlZCB0byBzdXBwbHkgaGVscGVyIGZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVpbmxpbmUgJXsKLS8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBMaXN0Jmx0O2RvdWJsZSZndDsKLUxpc3QmbHQ7ZG91YmxlJmd0OyAqbmV3X0RvdWJsZUxpc3QoKSB7Ci0JcmV0dXJuIG5ldyBMaXN0Jmx0O2RvdWJsZSZndDs7Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TcGVjaWZpYyB0ZW1wbGF0ZXMgY2FuIGFsc28gYmUgd3JhcHBlZCBpbiBhIGNsZXZlciB3YXkgdXNpbmcgPHR0PnR5cGVkZWYuPC90dD4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd291bGQgYWxzbyB3b3JrIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW5jbHVkZSAibGlzdC5oIgotdHlwZWRlZiBMaXN0Jmx0O2RvdWJsZSZndDsgRG91YmxlTGlzdDsKLSV9Ci0KLWNsYXNzIERvdWJsZUxpc3QgewotcHVibGljOgotCURvdWJsZUxpc3QoKTsKLQl+RG91YmxlTGlzdCgpOwotCXZvaWQgYXBwZW5kKGRvdWJsZSk7Ci0JaW50IGxlbmd0aCgpOwotCWRvdWJsZSBnZXQoaW50IG4pOwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBjYXNlLCBTV0lHIHRoaW5rcyB0aGF0IHRoZXJlIGlzIGEgY2xhc3MgIjx0dD5Eb3VibGVMaXN0PC90dD4iIHdpdGggdGhlIG1ldGhvZHMgc3VwcGxpZWQuIEl0IGdlbmVyYXRlcyB0aGUgYXBwcm9wcmlhdGUgY29kZSBhbmQgZXZlcnl0aGluZyB3b3JrcyBsaWtlIHlvdSB3b3VsZCBleHBlY3QgKG9mIGNvdXJzZSwgaW4gcmVhbGl0eSB0aGVyZSBpcyBubyBzdWNoIGNsYXNzKS4gV2hlbiB0aGUgU1dJRyBtb2R1bGUgaXMgY29tcGlsZWQsIGFsbCBvZiB0aGUgbWV0aG9kcyBnZXQgc3VwcGxpZWQgYnkgdGhlIG9yaWdpbmFsIHRlbXBsYXRlIGNsYXNzLiBBIGtleSB0aGluZyB0byBrZWVwIGluIG1pbmQgd2hlbiB3b3JraW5nIHdpdGggdGVtcGxhdGVzIGlzIHRoYXQgU1dJRyBjYW4gb25seSBoYW5kbGUgcGFydGljdWxhciBpbnN0YW50aWF0aW9ucyBvZiBhIHRlbXBsYXRlIChzdWNoIGFzIGEgbGlzdCBvZiBkb3VibGUpLiBNb3JlIGdlbmVyYWwgc3VwcG9ydCBpcyBub3QgeWV0IHByb3ZpZGVkIChidXQgbWF5IGJlIGFkZGVkIHNvbWVkYXkpLjxwPgotPGEgbmFtZT0ibjU0Ij48L2E+PGgzPiBSZW5hbWluZzwvaDM+Ci1DKysgbWVtYmVyIGZ1bmN0aW9ucyBhbmQgZGF0YSBjYW4gYmUgcmVuYW1lZCB3aXRoIHRoZSA8dHQ+JW5hbWU8L3R0PiBkaXJlY3RpdmUuIFRoZSA8dHQ+JW5hbWU8L3R0PiBkaXJlY3RpdmUgb25seSByZXBsYWNlcyB0aGUgbWVtYmVyIGZ1bmN0aW9uIG5hbWUuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLSAgTGlzdCgpOwotJW5hbWUoTGlzdFNpemUpIExpc3QoaW50IG1heHNpemUpOwotICB+TGlzdCgpOwotICBpbnQgIHNlYXJjaChjaGFyICp2YWx1ZSk7IAotJW5hbWUoZmluZCkgICAgdm9pZCBpbnNlcnQoY2hhciAqKTsgCi0lbmFtZShkZWxldGUpICB2b2lkIHJlbW92ZShjaGFyICopOyAKLSAgY2hhciAqZ2V0KGludCBuKTsKLSAgaW50ICBsZW5ndGg7Ci1zdGF0aWMgdm9pZCBwcmludChMaXN0ICpsKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgd2lsbCBjcmVhdGUgdGhlIGZ1bmN0aW9ucyA8dHQ+TGlzdF9maW5kPC90dD4sIDx0dD5MaXN0X2RlbGV0ZTwvdHQ+LCBhbmQgYSBmdW5jdGlvbiBuYW1lZCA8dHQ+bmV3X0xpc3RTaXplPC90dD4gZm9yIHRoZSBvdmVybG9hZGVkIGNvbnN0cnVjdG9yLjxwPgotPHA+Ci1UaGUgPHR0PiVuYW1lIDwvdHQ+ZGlyZWN0aXZlIGNhbiBiZSBhcHBsaWVkIHRvIGFsbCBtZW1iZXJzIGluY2x1ZGluZyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBzdGF0aWMgZnVuY3Rpb25zLCBkYXRhIG1lbWJlcnMsIGFuZCBlbnVtZXJhdGlvbiB2YWx1ZXMuPHA+Ci08cD4KLVRoZSBjbGFzcyBuYW1lIHByZWZpeCBjYW4gYmUgY2hhbmdlZCBieSBzcGVjaWZ5aW5nIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVuYW1lKG5ld25hbWUpIGNsYXNzIExpc3QgewotLi4uCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTUiPjwvYT48aDM+IEFkZGluZyBuZXcgbWV0aG9kczwvaDM+Ci1OZXcgbWV0aG9kcyBjYW4gYmUgYWRkZWQgdG8gYSBjbGFzcyB1c2luZyB0aGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlLiBUaGlzIGRpcmVjdGl2ZSBpcyBwcmltYXJpbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHNoYWRvdyBjbGFzc2VzIHRvIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gYW4gZXhpc3RpbmcgY2xhc3MuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHZlY3RvcgotJXsKLSNpbmNsdWRlICJ2ZWN0b3IuaCIKLSV9Ci0KLWNsYXNzIFZlY3RvciB7Ci1wdWJsaWM6Ci0JZG91YmxlIHgseSx6OwotCVZlY3RvcigpOwotCX5WZWN0b3IoKTsKLQkuLi4gYnVuY2ggb2YgQysrIG1ldGhvZHMgLi4uCi0JJWFkZG1ldGhvZHMgewotCQljaGFyICpfX3N0cl9fKCkgewotCQkJc3RhdGljIGNoYXIgdGVtcFsyNTZdOwotCQkJc3ByaW50Zih0ZW1wLCJbICVnLCAlZywgJWcgXSIsIHYtJmd0O3gsdi0mZ3Q7eSx2LSZndDt6KTsKLQkJCXJldHVybiAmYW1wO3RlbXBbMF07Ci0JCX0KLQl9Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIGNvZGUgYWRkcyBhPHR0PiBfX3N0cl9fPC90dD4gbWV0aG9kIHRvIG91ciBjbGFzcyBmb3IgcHJvZHVjaW5nIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuIEluIFB5dGhvbiwgc3VjaCBhIG1ldGhvZCB3b3VsZCBhbGxvdyB1cyB0byBwcmludCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHVzaW5nIHRoZSA8dHQ+cHJpbnQ8L3R0PiBjb21tYW5kLiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsKLSZndDsmZ3Q7Jmd0OyB2ID0gVmVjdG9yKCk7Ci0mZ3Q7Jmd0OyZndDsgdi54ID0gMwotJmd0OyZndDsmZ3Q7IHYueSA9IDQKLSZndDsmZ3Q7Jmd0OyB2LnogPSAwCi0mZ3Q7Jmd0OyZndDsgcHJpbnQodikKLVsgMy4wLCA0LjAsIDAuMCBdCi0mZ3Q7Jmd0OyZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlPHR0PiAlYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBmb2xsb3dzIGFsbCBvZiB0aGUgc2FtZSBjb252ZW50aW9ucyBhcyBpdHMgdXNlIHdpdGggQyBzdHJ1Y3R1cmVzLjxwPgotPGEgbmFtZT0ibjU2Ij48L2E+PGgzPiBQYXJ0aWFsIGNsYXNzIGRlZmluaXRpb25zPC9oMz4KLVNpbmNlIFNXSUcgaXMgc3RpbGwgc29tZXdoYXQgbGltaXRlZCBpbiBpdHMgc3VwcG9ydCBvZiBDKyssIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gb25seSB1c2UgcGFydGlhbCBjbGFzcyBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZS4gVGhpcyBzaG91bGQgbm90IHByZXNlbnQgYSBwcm9ibGVtIGFzIFNXSUcgZG9lcyBub3QgbmVlZCB0aGUgZXhhY3QgQysrIHNwZWNpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB5b3Ugc2hvdWxkIHN0cmlwIGFsbCBjbGFzc2VzIG9mIG9wZXJhdG9yIG92ZXJsb2FkaW5nLCBmcmllbmRzLCBhbmQgb3RoZXIgZGVjbGFyYXRpb25zIGJlZm9yZSBnaXZpbmcgdGhlbSB0byBTV0lHIChhbHRob3VnaCBTV0lHIHdpbGwgZ2VuZXJhdGUgb25seSB3YXJuaW5ncyBmb3IgbW9zdCBvZiB0aGVzZSB0aGluZ3MpLjxwPgotPHA+Ci1BcyBhIHJ1bGUgb2YgdGh1bWIsIHJ1bm5pbmcgU1dJRyBvbiByYXcgQysrIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgaXMgY3VycmVudGx5IGRpc2NvdXJhZ2VkLiBHaXZlbiB0aGUgY29tcGxleGl0eSBvZiBDKysgcGFyc2luZyBhbmQgbGltaXRhdGlvbnMgaW4gU1dJRydzIHBhcnNlciBpdCB3aWxsIHN0aWxsIHRha2Ugc29tZSB0aW1lIGZvciBTV0lHJ3MgcGFyc2VyIHRvIGV2b2x2ZSB0byBhIHBvaW50IG9mIGJlaW5nIGFibGUgdG8gc2FmZWx5IGhhbmRsZSBtb3N0IHJhdyBDKysgZmlsZXMuPHA+Ci08YSBuYW1lPSJuNTciPjwvYT48aDM+IFNXSUcsIEMrKywgYW5kIHRoZSBMZWdpc2xhdGlvbiBvZiBNb3JhbGl0eTwvaDM+Ci1BcyBsYW5ndWFnZXMgZ28sIEMrKyBpcyBxdWl0ZSBwb3NzaWJseSBvbmUgb2YgdGhlIG1vc3QgaW1tZW5zZSBhbmQgY29tcGxpY2F0ZWQgbGFuZ3VhZ2VzIGV2ZXIgZGV2aXNlZC4gSXQgaXMgY2VydGFpbmx5IGEgZmFyIGNyeSBmcm9tIHRoZSBzb21ld2hhdCBtaW5pbWFsaXN0aWMgbmF0dXJlIG9mIEMuIE1hbnkgcGFydHMgb2YgQysrIGFyZSBkZXNpZ25lZCB0byBidWlsZCBsYXJnZSBwcm9ncmFtcyB0aGF0IGFyZSAic2FmZSIgYW5kICJyZWxpYWJsZS4iIEhvd2V2ZXIsIGFzIGEgcmVzdWx0LCBpdCBpcyBwb3NzaWJsZSBmb3IgZGV2ZWxvcGVycyB0byBvdmVybG9hZCBvcGVyYXRvcnMsIGltcGxlbWVudCBzbWFydCBwb2ludGVycywgYW5kIGRvIGFsbCBzb3J0cyBvZiBvdGhlciBpbnNhbmUgdGhpbmdzIChsaWtlIGV4cHJlc3Npb24gdGVtcGxhdGVzKS4gQXMgZmFyIGFzIFNXSUcgaXMgY29uY2VybmVkLCB0aGUgcHJpbWFyeSBnb2FsIGlzIGF0dGFjaGluZyB0byBzdWNoIHN5c3RlbXMgYW5kIHByb3ZpZGluZyBhIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFRoZXJlIGFyZSBtYW55IGZlYXR1cmVzIG9mIEMrKyB0aGF0IEkgd291bGQgbm90IGhhdmUgdGhlIHNsaWdodGVzdCBpZGVhIGhvdyB0byBzdXBwb3J0IGluIFNXSUcgKG1vc3Qga2luZHMgb2YgdGVtcGxhdGVzIGZvciBleGFtcGxlKS4gVGhlcmUgYXJlIG90aGVyIEMrKyBpZGlvbXMgdGhhdCBtYXkgYmUgdW5zYWZlIHRvIHVzZSB3aXRoIFNXSUcuIEZvciBleGFtcGxlLCBpZiBvbmUgaW1wbGVtZW50cyAic21hcnQiIHBvaW50ZXJzLCBob3cgd291bGQgdGhleSBhY3R1YWxseSBpbnRlcmFjdCB3aXRoIHRoZSBwb2ludGVyIG1lY2hhbmlzbSB1c2VkIGJ5IFNXSUc/IDxwPgotPHA+Ci1OZWVkbGVzcyB0byBzYXksIGhhbmRsaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgY2FzZXMgaXMgcHJvYmFibHkgaW1wb3NzaWJsZS4gU1dJRyBpcyBjZXJ0YWlubHkgbm90IGd1YXJhbnRlZWQgdG8gd29yayB3aXRoIGV2ZXJ5IGNvbmNlaXZhYmxlIHR5cGUgb2YgQysrIHByb2dyYW0gKGVzcGVjaWFsbHkgdGhvc2UgdGhhdCB1c2UgQysrIGluIGEgbWF4aW1hbCBtYW5uZXIpLiBOb3IgaXMgU1dJRyBjbGFpbWluZyB0byBidWlsZCBDKysgaW50ZXJmYWNlcyBpbiBhIGNvbXBsZXRlbHkgInNhZmUiIG1hbm5lci4gVGhlIGJvdHRvbSBsaW5lIGlzIHRoYXQgZWZmZWN0aXZlIHVzZSBvZiBDKysgd2l0aCBTV0lHIHJlcXVpcmVzIHRoYXQgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgYW5kIHRoYXQgeW91IGhhdmUgYSBjZXJ0YWluIGxldmVsIG9mICJtb3JhbCBmbGV4aWJpbGl0eSIgd2hlbiBpdCBjb21lcyB0byB0aGUgaXNzdWUgb2YgYnVpbGRpbmcgYSB1c2VmdWwgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZS48cD4KLTxhIG5hbWU9Im41OCI+PC9hPjxoMz4gVGhlIGZ1dHVyZSBvZiBDKysgYW5kIFNXSUc8L2gzPgotU1dJRydzIHN1cHBvcnQgb2YgQysrIGlzIGJlc3QgZGVzY3JpYmVkIGFzIGFuIG9uZ29pbmcgcHJvamVjdC4gSXQgd2lsbCBwcm9iYWJseSByZW1haW4gZXZvbHV0aW9uYXJ5IGluIG5hdHVyZSBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4gSW4gdGhlIHNob3J0IHRlcm0sIHdvcmsgaXMgYWxyZWFkeSB1bmRlcndheSBmb3Igc3VwcG9ydGluZyBuZXN0ZWQgY2xhc3NlcyBhbmQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcuIEFzIGFsd2F5cywgdGhlc2UgZGV2ZWxvcG1lbnRzIHdpbGwgdGFrZSB0aW1lLiBGZWVkYmFjayBhbmQgY29udHJpYnV0aW9ucyBhcmUgYWx3YXlzIHdlbGNvbWUuPHA+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gT2JqZWN0aXZlLUM8L2gyPgotT25lIG9mIFNXSUcncyBtb3N0IHJlY2VudCBhZGRpdGlvbnMgaXMgc3VwcG9ydCBmb3IgT2JqZWN0aXZlLUMgcGFyc2luZy4gVGhpcyBpcyBjdXJyZW50bHkgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtYXkgYmUgaW1wcm92ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLiA8cD4KLTxwPgotT2JqZWN0aXZlLUMgc3VwcG9ydCBpcyBidWlsdCB1c2luZyB0aGUgc2FtZSBhcHByb2FjaCBhcyB1c2VkIGZvciBDKysgcGFyc2luZy4gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIGRlZmluaXRpb25zIGFyZSBjb252ZXJ0ZWQgaW50byBhIGNvbGxlY3Rpb24gb2YgQU5TSSBDIGFjY2Vzc29yIGZ1bmN0aW9ucy4gVGhlc2UgYWNjZXNzb3IgZnVuY3Rpb25zIGFyZSB0aGVuIHdyYXBwZWQgYnkgU1dJRyBhbmQgdHVybmVkIGludG8gYW4gaW50ZXJmYWNlLjxwPgotPHA+Ci1UbyBlbmFibGUgT2JqZWN0aXZlLUMgcGFyc2luZywgU1dJRyBzaG91bGQgYmUgZ2l2ZW4gdGhlIDx0dD4tb2JqYzwvdHQ+IG9wdGlvbiAodGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgPHR0Pi1jKys8L3R0PiBvcHRpb24gaWYgdXNpbmcgT2JqZWN0aXZlLUMrKykuIEl0IG1heSBhbHNvIGJlIGhlbHBmdWwgdG8gdXNlIHRoZSAtbyBvcHRpb24gdG8gZ2l2ZSB0aGUgb3V0cHV0IGZpbGUgdGhlIC5tIHN1ZmZpeCBuZWVkZWQgYnkgbWFueSBPYmplY3RpdmUtQyBjb21waWxlcnMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLW9iamMgLW8gZXhhbXBsZV93cmFwLm0gZXhhbXBsZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU9iamVjdGl2ZS1DIGludGVyZmFjZXMgc2hvdWxkIGFsc28gaW5jbHVkZSB0aGUgZmlsZSBgPHR0Pm9iamMuaTwvdHQ+JyBhcyB0aGlzIGNvbnRhaW5zIGltcG9ydGFudCBkZWZpbml0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gbW9zdCBPYmplY3RpdmUtQyBwcm9ncmFtcy4gPHA+Ci08YSBuYW1lPSJuNTkiPjwvYT48aDM+IE9iamVjdGl2ZS1DIEV4YW1wbGU8L2gzPgotVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGEgU1dJRyBpbnRlcmZhY2UgZmlsZSBmb3IgYSBzaW1wbGUgT2JqZWN0aXZlLUMgY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbGlzdAotJXsKLSNpbXBvcnQgImxpc3QuaCIKLSV9Ci0laW5jbHVkZSBvYmpjLmkKLS8vIFZlcnkgc2ltcGxlIGxpc3QgY2xhc3MKLUBpbnRlcmZhY2UgTGlzdCA6IE9iamVjdCB7Ci0gICAgIGludCAgIG5pdGVtczsgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QKLSAgICAgaW50ICAgbWF4aXRlbXM7ICAgICAgICAgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zCi0gICAgIGlkICAgKml0ZW1zOyAgICAgICAgICAgICAgICAgICAvLyBBcnJheSBob2xkaW5nIHRoZSBpdGVtcwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBMaXN0IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQ3JlYXRlIGEgbmV3IGxpc3QKLSsgbmV3OwotCi0vLyBEZXN0cm95IHRoZSBsaXN0Ci0tIGZyZWU7Ci0KLS8vIENvcHkgYSBsaXN0Ci0tIGNvcHk7Ci0KLS8vIEFwcGVuZCBhIG5ldyBpdGVtIHRvIHRoZSBsaXN0Ci0tICh2b2lkKSBhcHBlbmQ6IChpZCkgaXRlbTsKLQotLy8gSW5zZXJ0IGFuIGl0ZW0gaW4gdGhlIGxpc3QKLS0gKHZvaWQpIGluc2VydDogKGlkKSBpdGVtIDogKGludCkgcG9zOwotCi0vLyBEZWxldGUgYW4gaXRlbSBmcm9tIHRoZSBsaXN0Ci0tICByZW1vdmU6IChpbnQpIHBvczsKLQotLy8gR2V0IGFuIGl0ZW0gZnJvbSB0aGUgbGlzdAotLSBnZXQ6IChpbnQpIGk7Ci0KLS8vIEZpbmQgYW4gaXRlbSBpbiB0aGUgbGlzdCBhbmQgcmV0dXJuIGl0cyBpbmRleAotLSAoaW50KSBpbmRleDogb2JqOwotCi0vLyBHZXQgbGVuZ3RoIG9mIHRoZSBsaXN0Ci0tIChpbnQpIGxlbjsKLQotLy8gUHJpbnQgb3V0IGEgbGlzdCAoQ2xhc3MgbWV0aG9kKQotKyAodm9pZCkgcHJpbnQ6IChMaXN0ICopIGw7Ci0KLUBlbmQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjYwIj48L2E+PGgzPiBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzPC9oMz4KLUJ5IGRlZmF1bHQsIFNXSUcgYXNzdW1lcyB0aGF0IHRoZSBtZXRob2RzICJuZXciIGFuZCAiZnJlZSIgY29ycmVzcG9uZCB0byBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBUaGVzZSBmdW5jdGlvbnMgYXJlIHRyYW5zbGF0ZWQgaW50byB0aGUgZm9sbG93aW5nIGFjY2Vzc29yIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCAqbmV3X0xpc3Qodm9pZCkgewotCXJldHVybiAoTGlzdCAqKSBbTGlzdCBuZXddOwotfQotdm9pZCBkZWxldGVfTGlzdChMaXN0ICpsKSB7Ci0JW2wgZnJlZV07Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUlmIHRoZSBvcmlnaW5hbCBPYmplY3RpdmUtQyBjbGFzcyBkb2VzIG5vdCBoYXZlIGFueSBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMsIHB1dHRpbmcgdGhlbSBpbiB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCBjYXVzZSBTV0lHIHRvIGdlbmVyYXRlIHdyYXBwZXJzIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgKGFzc3VtZWQgdG8gYmUgZGVmaW5lZCBpbiB0aGUgb2JqZWN0J3MgYmFzZS1jbGFzcykuPHA+Ci08cD4KLUlmIHlvdXIgT2JqZWN0aXZlLUMgcHJvZ3JhbSB1c2VzIGEgZGlmZmVyZW50IG5hbWluZyBzY2hlbWUgZm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsIHlvdSBjYW4gdGVsbCBTV0lHIGFib3V0IGl0IHVzaW5nIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lcHJhZ21hIG9iamNfbmV3ID0gImNyZWF0ZSIgCQkJCQkvLyBDaGFuZ2UgY29uc3RydWN0b3IgdG8gYGNyZWF0ZScKLSVwcmFnbWEgb2JqY19kZWxldGUgPSAiZGVzdHJveSIgCQkJCQkvLyBDaGFuZ2UgZGVzdHJ1Y3RvciB0byBgZGVzdHJveScKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MSI+PC9hPjxoMz4gSW5zdGFuY2UgbWV0aG9kczwvaDM+Ci1JbnN0YW5jZSBtZXRob2RzIGFyZSBjb252ZXJ0ZWQgaW50byBhY2Nlc3NvciBmdW5jdGlvbnMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIExpc3RfYXBwZW5kKExpc3QgKmwsIGlkIGl0ZW0pIHsKLQlbbCBhcHBlbmQgOiBpdGVtXTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MiI+PC9hPjxoMz4gQ2xhc3MgbWV0aG9kczwvaDM+Ci1DbGFzcyBtZXRob2RzIGFyZSB0cmFuc2xhdGVkIGludG8gdGhlIGZvbGxvd2luZyBhY2Nlc3MgZnVuY3Rpb24gOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQgTGlzdF9wcmludChMaXN0ICpsKSB7Ci0JW0xpc3QgcHJpbnQgOiBsXTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MyI+PC9hPjxoMz4gTWVtYmVyIGRhdGE8L2gzPgotTWVtYmVyIGRhdGEgaXMgaGFuZGxlZCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgZm9yIEMrKyB3aXRoIGFjY2Vzc29yIGZ1bmN0aW9ucyBiZWluZyBwcm9kdWNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgdmFsdWUuIEJ5IGRlZmF1bHQsIGFsbCBkYXRhIG1lbWJlcnMgb2YgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IGFyZSBwcml2YXRlIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkIDx0dD5AcHVibGljPC90dD4uIDxwPgotPGEgbmFtZT0ibjY0Ij48L2E+PGgzPiBQcm90ZWN0aW9uPC9oMz4KLVNXSUcgY2FuIG9ubHkgd3JhcCBkYXRhIG1lbWJlcnMgdGhhdCBhcmUgZGVjbGFyZWQgQHB1YmxpYy4gT3RoZXIgcHJvdGVjdGlvbiBsZXZlbHMgYXJlIGlnbm9yZWQuPHA+Ci08YSBuYW1lPSJuNjUiPjwvYT48aDM+IFRoZSB1c2Ugb2YgaWQ8L2gzPgotVGhlIGRhdGF0eXBlIGA8dHQ+aWQ8L3R0PicgYXNzdW1lcyB0aGUgc2FtZSByb2xlIGluIFNXSUcgYXMgaXQgZG9lcyB3aXRoIE9iamVjdGl2ZS1DLiBBIGZ1bmN0aW9uIG9wZXJhdGluZyBvbiBhbiBgaWQnIHdpbGwgYWNjZXB0IGFueSBPYmplY3QgdHlwZSAod29ya3Mga2luZCBvZiBsaWtlIDx0dD52b2lkICo8L3R0PikuIEFsbCBtZXRob2RzIHdpdGggbm8gZXhwbGljaXQgcmV0dXJuIHZhbHVlIGFyZSBhbHNvIGFzc3VtZWQgdG8gcmV0dXJuIGFuIGBpZCcuIDxwPgotPGEgbmFtZT0ibjY2Ij48L2E+PGgzPiBJbmhlcml0YW5jZTwvaDM+Ci1Fc3NlbnRpYWxseSBhbGwgT2JqZWN0aXZlLUMgY2xhc3NlcyB3aWxsIGluaGVyaXQgZnJvbSBhIGJhc2VjbGFzcyA8dHQ+T2JqZWN0PC90dD4uIElmIHVuZGVmaW5lZCwgU1dJRyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZywgYnV0IG90aGVyIGZ1bmN0aW9uIHByb3Blcmx5LiBBIG1pc3NpbmcgYmFzZWNsYXNzIGhhcyBubyBlZmZlY3Qgb24gdGhlIHdyYXBwZXIgY29kZSBvciB0aGUgb3BlcmF0aW9uIG9mIHRoZSByZXN1bHRpbmcgbW9kdWxlLiBSZWFsbHksIHRoZSBvbmx5IHNpZGUgZWZmZWN0IG9mIGEgbWlzc2luZyBiYXNlIGNsYXNzIGlzIHRoYXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gZXhlY3V0ZSBiYXNlLWNsYXNzIG1ldGhvZHMgZnJvbSB0aGUgc2NyaXB0aW5nIGludGVyZmFjZS4gT2JqZWN0aXZlLUMgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS48cD4KLTxhIG5hbWU9Im42NyI+PC9hPjxoMz4gUmVmZXJyaW5nIHRvIG90aGVyIGNsYXNzZXM8L2gzPgotVGhlPHR0PiBAY2xhc3M8L3R0PiBkZWNsYXJhdGlvbiBjYW4gYmUgdXNlZCB0byByZWZlciB0byBvdGhlciBjbGFzc2VzLiBTV0lHIHVzZXMgdGhpcyBpbiBjZXJ0YWluIGluc3RhbmNlcyB0byBtYWtlIHN1cmUgd3JhcHBlciBjb2RlIGlzIGdlbmVyYXRlZCBjb3JyZWN0bHkuPHA+Ci08YSBuYW1lPSJuNjgiPjwvYT48aDM+IENhdGVnb3JpZXM8L2gzPgotQ2F0ZWdvcmllcyBwcm92aWRlIGEgbWVjaGFuaXNtIGZvciBhZGRpbmcgbmV3IG1ldGhvZHMgdG8gZXhpc3RpbmcgT2JqZWN0aXZlLUMgY2xhc3Nlcy4gU1dJRyBjb3JyZWN0bHkgcGFyc2VzIGNhdGVnb3JpZXMgYW5kIGF0dGFjaGVzIHRoZSBtZXRob2RzIHRvIHRoZSB3cmFwcGVycyBjcmVhdGVkIGZvciB0aGUgb3JpZ2luYWwgY2xhc3MuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW1wb3J0ICJmb28uaCIKLSV9Ci0KLS8vIFNhbXBsZSB1c2Ugb2YgYSBjYXRlZ29yeSBpbiBhbiBpbnRlcmZhY2UKLUBpbnRlcmZhY2UgRm9vIChDYXRlZ29yeU5hbWUpCi0vLyBNZXRob2QgZGVjbGFyYXRpb25zCi0tYmFyIDogKGlkKSBpOwotQGVuZAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNjkiPjwvYT48aDM+IEltcGxlbWVudGF0aW9ucyBhbmQgUHJvdG9jb2xzPC9oMz4KLVNXSUcgY3VycmVudGx5IGlnbm9yZXMgYWxsIGRlY2xhcmF0aW9ucyBmb3VuZCBpbnNpZGUgYW4gPHR0PkBpbXBsZW1lbnRhdGlvbjwvdHQ+IG9yIDx0dD5AcHJvdG9jb2w8L3R0PiBzZWN0aW9uLiBTdXBwb3J0IGZvciB0aGlzIG1heSBiZSBhZGRlZCBpbiBmdXR1cmUgcmVsZWFzZXMuPHA+Ci08cD4KLUFsdGhvdWdoIFNXSUcgaWdub3JlcyBwcm90b2NvbHMsIHByb3RvY29sIHR5cGUtc3BlY2lmaWVycyBtYXkgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHRoZXNlIGFyZSBsZWdhbCBkZWNsYXJhdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi0laW50ZXJmYWNlIEZvbyA6IE9iamVjdCAmbHQ7cHJvdG8xLCBwcm90bzImZ3Q7IHsKLQotfQotLy8gTWV0aG9kcwotLSBCYXIgOiAoaWQgJmx0O3Byb3RvMSxwcm90bzImZ3Q7KSBpOwotQGVuZAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIHdpbGwgY2FycnkgdGhlIHByb3RvY29sIGxpc3RzIHRocm91Z2ggdGhlIGNvZGUgZ2VuZXJhdGlvbiBwcm9jZXNzIHNvIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIGNvbXBpbGVzIHdpdGhvdXQgd2FybmluZ3MuPHA+Ci08YSBuYW1lPSJuNzAiPjwvYT48aDM+IFJlbmFtaW5nPC9oMz4KLU9iamVjdGl2ZS1DIG1lbWJlcnMgY2FuIGJlIHJlbmFtZWQgdXNpbmcgdGhlIDx0dD4lbmFtZSgpPC90dD4gZGlyZWN0aXZlIGFzIGluIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5AaW50ZXJmYWNlIExpc3QgOiBPYmplY3QgewotQHB1YmxpYwotJW5hbWUoc2l6ZSkgaW50IGxlbmd0aDsgCQkJCQkJLy8gUmVuYW1lIGxlbmd0aCB0byBzaXplCi19Ci0KLSsgbmV3OwotLSBmcmVlOwotJW5hbWUoYWRkKSAtKHZvaWQpIGFwcGVuZDogKGlkKSBpdGVtOwkJCQkJCS8vIFJlbmFtZSBhcHBlbmQgdG8gYWRkCi1AZW5kCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im43MSI+PC9hPjxoMz4gQWRkaW5nIG5ldyBtZXRob2RzPC9oMz4KLU5ldyBtZXRob2RzIGNhbiBiZSBhZGRlZCB0byBhIGNsYXNzIHVzaW5nIHRoZSA8dHQ+JWFkZG1ldGhvZHM8L3R0PiBkaXJlY3RpdmUuIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgd2l0aCBzaGFkb3cgY2xhc3NlcyB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIGEgY2xhc3MuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5AaW50ZXJmYWNlIExpc3QgOiBPYmplY3QgewotfQotLi4uIGJ1bmNoIG9mIE9iamVjdGl2ZS1DIG1ldGhvZHMgLi4uCi0lYWRkbWV0aG9kcyB7Ci0JLSAodm9pZCkgb3V0cHV0IHsKLQkJLi4uIGNvZGUgdG8gb3V0cHV0IGEgbGlzdCAuLi4KLQl9Ci19Ci1AZW5kCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTx0dD4lYWRkbWV0aG9kcyA8L3R0PndvcmtzIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGFzIGl0IGRvZXMgZm9yIEMgYW5kIEMrKyAoZXhjZXB0IHRoYXQgT2JqZWN0aXZlLUMgc3ludGF4IGlzIGFsbG93ZWQpLiBDb25zdWx0IHRob3NlIHNlY3Rpb25zIGZvciBtb3JlIGRldGFpbHMuPHA+Ci08YSBuYW1lPSJuNzIiPjwvYT48aDM+IE90aGVyIGlzc3VlczwvaDM+Ci1PYmplY3RpdmUtQyBpcyBkeW5hbWljYWxseSB0eXBlZCB3aGlsZSBTV0lHIHRlbmRzIHRvIGVuZm9yY2UgYSB0eXBlLWNoZWNraW5nIG1vZGVsIG9uIGFsbCBvZiBpdHMgcG9pbnRlciB2YWx1ZXMuIFRoaXMgbWlzbWF0Y2ggY291bGQgY3JlYXRlIG9wZXJhdGlvbmFsIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMgY29kZSBpbiB0aGUgZm9ybSBvZiBTV0lHIHR5cGUgZXJyb3JzLiBPbmUgc29sdXRpb24gdG8gdGhpcyAoYWx0aG91Z2ggcGVyaGFwcyBub3QgYSBnb29kIG9uZSkgaXMgdG8gdXNlIHRoZSBTV0lHIHBvaW50ZXIgbGlicmFyeSBpbiBjb25qdW5jdGlvbiB3aXRoIE9iamVjdGl2ZS1DLiBUaGUgcG9pbnRlciBsaWJyYXJ5IHByb3ZpZGVzIHNpbXBsZSBmdW5jdGlvbnMgZm9yIGNhc3RpbmcgcG9pbnRlciB0eXBlcyBhbmQgbWFuaXB1bGF0aW5nIHZhbHVlcy4gPHA+Ci08cD4KLUNlcnRhaW4gYXNwZWN0cyBvZiBPYmplY3RpdmUtQyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKHByb3RvY29scyBmb3IgaW5zdGFuY2UpLiBUaGVzZSBsaW1pdGF0aW9ucyBtYXkgYmUgbGlmdGVkIGluIGZ1dHVyZSByZWxlYXNlcy48cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBDb25kaXRpb25hbCBjb21waWxhdGlvbjwvaDI+Ci1TV0lHIGRvZXMgbm90IHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IsIGJ1dCBpdCBkb2VzIHN1cHBvcnQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gb2YgaW50ZXJmYWNlIGZpbGVzIGluIGEgbWFubmVyIHNpbWlsYXIgdG8gdGhlIEMgcHJlcHJvY2Vzc29yLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHBsYWNlZCA8dHQ+I2lmZGVmPC90dD4sIDx0dD4jaWZuZGVmPC90dD4sIDx0dD4jaWY8L3R0PiwgPHR0PiNlbHNlPC90dD4sIDx0dD4jZWxpZjwvdHQ+LCBhbmQgPHR0PiNlbmRpZjwvdHQ+IGRpcmVjdGl2ZXMgaW4geW91ciBpbnRlcmZhY2UgZmlsZS4gVGhlc2UgZGlyZWN0aXZlcyBjYW4gYmUgc2FmZWx5IG5lc3RlZC4gVGhpcyBhbGxvd3Mgb25lIHRvIGNvbmRpdGlvbmFsbHkgY29tcGlsZSBvdXQgdHJvdWJsZXNvbWUgQy9DKysgY29kZSBpZiBuZWNlc3NhcnkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGZpbGUgY2FuIHNlcnZlIGFzIGJvdGggYSBDIGhlYWRlciBmaWxlIGFuZCBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiNpZmRlZiBTV0lHCi0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgImhlYWRlci5oIgotJX0KLQotJWluY2x1ZGUgd2lzaC5pCi0jZW5kaWYKLQotLi4uIG5vcm1hbCBDIGRlY2xhcmF0aW9ucyBoZXJlIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpbWlsYXJseSwgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIGFuIGludGVyZmFjZS4gVGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSBjYW4gYmUgdXNlZCB0byBidWlsZCBhIFBlcmw1IG1vZHVsZSB0aGF0IHdvcmtzIHdpdGggZWl0aGVyIHN0YXRpYyBvciBkeW5hbWljIGxpbmtpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBteW1vZHVsZQotJXsKLSNpbmNsdWRlICJoZWFkZXIuaCIKLSV9Ci0KLS4uLiBEZWNsYXJhdGlvbnMgLi4uCi0KLSNpZmRlZiBTVEFUSUMKLSVpbmNsdWRlIHBlcmxtYWluLmkgCQkJCS8vIEluY2x1ZGUgY29kZSBmb3Igc3RhdGljIGxpbmtpbmcKLSNlbmRpZgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ib3dldmVyLCBpdCBpcyBub3Qgc2FmZSB0byB1c2UgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaW4gdGhlIG1pZGRsZSBvZiBhIGRlY2xhcmF0aW9uLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIGZvbygKLSNpZmRlZiBBTlNJX0FSR1MKLWRvdWJsZSBhLCBkb3VibGUgYgotI2VuZGlmCi0pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGZhaWxzIGJlY2F1c2UgdGhlIFNXSUcgcGFyc2VyIGlzIG5vdCBlcXVpcHBlZCB0byBoYW5kbGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBpbiBhbiBhcmJpdHJhcnkgbG9jYXRpb24gKGxpa2UgdGhlIEMgcHJlcHJvY2Vzc29yKS4gRm9yIGZpbGVzIHRoYXQgbWFrZSBoZWF2eSB1c2Ugb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGxpa2UgdGhpcywgaXQgbWF5IGJlIGJldHRlciB0byBydW4gdGhlIGhlYWRlciBmaWxlIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIGFuZCB1c2UgdGhlIG91dHB1dCBhcyB0aGUgaW5wdXQgdG8gU1dJRy48cD4KLTxhIG5hbWU9Im43MyI+PC9hPjxoMz4gRGVmaW5pbmcgc3ltYm9sczwvaDM+Ci1UbyBkZWZpbmUgc3ltYm9scywgeW91IGNhbiB1c2UgdGhlIDx0dD4tRDwvdHQ+IG9wdGlvbiBhcyBpbiA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotc3dpZyAtcGVybDUgLXN0YXRpYyAtRFNUQVRJQyBpbnRlcmZhY2UuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TeW1ib2xzIGNhbiBhbHNvIGJlIGRlZmluZWQgdXNpbmcgPHR0PiNkZWZpbmU8L3R0PiB3aXRoIG5vIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLSNkZWZpbmUgU1RBVElDIAotCi0uLi4gZXRjIC4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Gb3IgdGhlIHB1cnBvc2VzIG9mIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLCBvbmUgc2hvdWxkIG5vdCBhc3NpZ24gdmFsdWVzIHRvIHN5bWJvbHMuIElmIHRoaXMgaXMgZG9uZSwgU1dJRyBpbnRlcnByZXRzIHRoZSAjZGVmaW5lIGFzIHByb3ZpZGluZyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNjcmlwdGluZyBsYW5ndWFnZSBjb25zdGFudC4gPHA+Ci08YSBuYW1lPSJuNzQiPjwvYT48aDM+IFRoZSAjaWYgZGlyZWN0aXZlPC9oMz4KLVRoZSA8dHQ+I2lmPC90dD4gZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBjb250ZXh0IDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0jaWYgZGVmaW5lZChTWU1CT0wpCi0uLi4KLSNlbGlmICFkZWZpbmVkKE9USEVSU1lNQk9MKQotLi4uCi0jZW5kaWYKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIEMgcHJlcHJvY2Vzc29yIHZlcnNpb24gc3VwcG9ydHMgYW55IGNvbnN0YW50IGludGVncmFsIGV4cHJlc3Npb24gYXMgYW4gYXJndW1lbnQgdG8gPHR0PiNpZjwvdHQ+LCBidXQgU1dJRyBkb2VzIG5vdCB5ZXQgY29udGFpbiBhbiBleHByZXNzaW9uIGV2YWx1YXRvciBzbyB0aGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBBcyBhIHJlc3VsdCwgZGVjbGFyYXRpb25zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBkb24ndCB5ZXQgd29yayA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2lmIChkZWZpbmVkKGZvbykgfHwgZGVmaW5lZChiYXIpKQotLi4uCi0jZW5kaWYKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjc1Ij48L2E+PGgzPiBQcmVkZWZpbmVkIFN5bWJvbHM8L2gzPgotT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBzeW1ib2xzIHdpbGwgYmUgZGVmaW5lZCBieSBTV0lHIHdoZW4gaXQgaXMgcHJvY2Vzc2luZyBhbiBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+U1dJRwkJCQlBbHdheXMgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcHJvY2Vzc2luZyBhIGZpbGUKLVNXSUdUQ0wJCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFRjbAotU1dJR1RDTDgJCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFRjbDguMAotU1dJR1BFUkwJCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFBlcmwKLVNXSUdQRVJMNAkJCQlEZWZpbmVkIHdoZW4gdXNpbmcgUGVybDQKLVNXSUdQRVJMNQkJCQlEZWZpbmVkIHdoZW4gdXNpbmcgUGVybDUKLVNXSUdQWVRIT04JCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFB5dGhvbgotU1dJR0dVSUxFCQkJCURlZmluZWQgd2hlbiB1c2luZyBHdWlsZQotU1dJR1dJTgkJCQlEZWZpbmVkIHdoZW4gcnVubmluZyBTV0lHIHVuZGVyIFdpbmRvd3MKLVNXSUdNQUMJCQkJRGVmaW5lZCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiB0aGUgTWFjaW50b3NoCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUludGVyZmFjZSBmaWxlcyBjYW4gbG9vayBhdCB0aGVzZSBzeW1ib2xzIGFzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIHdheSBpbiB3aGljaCBhbiBpbnRlcmZhY2UgaXMgZ2VuZXJhdGVkIG9yIHRvIG1peCBTV0lHIGRpcmVjdGl2ZXMgd2l0aCBDIGNvZGUuIFRoZXNlIHN5bWJvbHMgYXJlIGFsc28gZGVmaW5lZCB3aXRoaW4gdGhlIEMgY29kZSBnZW5lcmF0ZWQgYnkgU1dJRyAoZXhjZXB0IGZvciB0aGUgc3ltYm9sIGA8dHQ+U1dJRzwvdHQ+JyB3aGljaCBpcyBvbmx5IGRlZmluZWQgd2l0aGluIHRoZSBTV0lHIGNvbXBpbGVyKS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBDb2RlIEluc2VydGlvbjwvaDI+Ci1Tb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGluc2VydCBzcGVjaWFsIGNvZGUgaW50byB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgZmlsZSBnZW5lcmF0ZWQgYnkgU1dJRy4gICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvIGluY2x1ZGUgYWRkaXRpb25hbCBDIGNvZGUgdG8gcGVyZm9ybSBpbml0aWFsaXphdGlvbiBvciBvdGhlciBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIGZvdXIgd2F5cyB0byBpbnNlcnQgY29kZSwgYnV0IGl0J3MgdXNlZnVsIHRvIGtub3cgaG93IHRoZSBvdXRwdXQgb2YgU1dJRyBpcyBzdHJ1Y3R1cmVkIGZpcnN0LjxwPgotPGEgbmFtZT0ibjc2Ij48L2E+PGgzPiBUaGUgb3V0cHV0IG9mIFNXSUc8L2gzPgotU1dJRyBjcmVhdGVzIGEgc2luZ2xlIEMgc291cmNlIGZpbGUgY29udGFpbmluZyB3cmFwcGVyIGZ1bmN0aW9ucywgaW5pdGlhbGl6YXRpb24gY29kZSwgYW5kIHN1cHBvcnQgY29kZS4gVGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUgaXMgYXMgZm9sbG93cyA6PHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDMuMS5wbmciPjwvY2VudGVyPgotCi08cD4KLTxwPgotVGhlIGhlYWRlcnMgcG9ydGlvbiB0eXBpY2FsbHkgY29udGFpbnMgaGVhZGVyIGZpbGVzLCBzdXBwb3J0aW5nIGNvZGUsIGhlbHBlciBmdW5jdGlvbnMsIGFuZCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4gSWYgeW91IGxvb2sgYXQgaXQsIHlvdSdsbCB1c3VhbGx5IGZpbmQgYSBoaWRlb3VzIG1lc3Mgc2luY2UgdGhpcyBhbHNvIGNvbnRhaW5zIHRoZSBTV0lHIHJ1bi10aW1lIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCBpbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgd3JhcHBlciBmdW5jdGlvbnMuIFRoZSAid3JhcHBlciIgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IGNvbnRhaW5zIGFsbCBvZiB0aGUgd3JhcHBlciBmdW5jdGlvbnMuIEZpbmFsbHksIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBhIHNpbmdsZSBDIGZ1bmN0aW9uIHRoYXQgaXMgY3JlYXRlZCB0byBpbml0aWFsaXplIHlvdXIgbW9kdWxlIHdoZW4gaXQgaXMgbG9hZGVkLjxwPgotPGEgbmFtZT0ibjc3Ij48L2E+PGgzPiBDb2RlIGJsb2NrczwvaDM+Ci1BIGNvZGUgYmxvY2sgaXMgZW5jbG9zZWQgYnkgYSA8dHQ+JXssICV9PC90dD4gYW5kIGlzIHVzZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgaGVhZGVyIHBvcnRpb24gb2YgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGZpbGUuIEV2ZXJ5dGhpbmcgaW4gdGhlIGJsb2NrIGlzIGNvcGllZCB2ZXJiYXRpbSBpbnRvIHRoZSBvdXRwdXQgZmlsZSBhbmQgd2lsbCBhcHBlYXIgYmVmb3JlIGFueSBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuICAgTW9zdCBTV0lHIGlucHV0IGZpbGVzIGhhdmUgYXQgbGVhc3Qgb25lIGNvZGUgYmxvY2sgdGhhdCBpcyBub3JtYWxseSB1c2VkIHRvIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGFuZCBzdXBwb3J0aW5nIEMgY29kZS4gICAgICBBZGRpdGlvbmFsIGNvZGUgYmxvY2tzIG1heSBiZSBwbGFjZWQgYW55d2hlcmUgaW4gYSBTV0lHIGZpbGUgYXMgbmVlZGVkLiA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgIm15X2hlYWRlci5oIgotJX0KLQotLi4uIERlY2xhcmUgZnVuY3Rpb25zIGhlcmUKLSV7Ci0KLS4uLiBJbmNsdWRlIFRjbF9BcHBJbml0KCkgZnVuY3Rpb24gaGVyZSAuLi4KLQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQ29kZSBibG9ja3MgYXJlIGFsc28gdHlwaWNhbGx5IHVzZWQgdG8gd3JpdGUgImhlbHBlciIgZnVuY3Rpb25zLiBUaGVzZSBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBhbiBpbnRlcmZhY2UgYW5kIGFyZSBnZW5lcmFsbHkgbm90IHZpc2libGUgdG8gdGhlIG5vcm1hbCBDIHByb2dyYW0uIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lewotCi0vKiBDcmVhdGUgYSBuZXcgdmVjdG9yICovCi1zdGF0aWMgVmVjdG9yICpuZXdfVmVjdG9yKCkgewotCXJldHVybiAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci19Ci0KLSV9Ci0KLS8vIE5vdyB3cmFwIGl0IAotVmVjdG9yICpuZXdfVmVjdG9yKCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im43OCI+PC9hPjxoMz4gSW5saW5lZCBjb2RlIGJsb2NrczwvaDM+Ci1CZWNhdXNlIHRoZSBwcm9jZXNzIG9mIHdyaXRpbmcgaGVscGVyIGZ1bmN0aW9ucyBpcyBmYWlybHkgY29tbW9uLCB0aGVyZSBpcyBhIHNwZWNpYWwgaW5saW5lZCBmb3JtIG9mIGNvZGUgYmxvY2sgdGhhdCBpcyB1c2VkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVpbmxpbmUgJXsKLS8qIENyZWF0ZSBhIG5ldyB2ZWN0b3IgKi8KLVZlY3RvciAqbmV3X1ZlY3RvcigpIHsKLQlyZXR1cm4gKFZlY3RvciAqKSBtYWxsb2Moc2l6ZW9mKFZlY3RvcikpOwotfQotJX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4laW5saW5lPC90dD4gZGlyZWN0aXZlIGluc2VydHMgYWxsIG9mIHRoZSBjb2RlIHRoYXQgZm9sbG93cyB2ZXJiYXRpbSBpbnRvIHRoZSBoZWFkZXIgcG9ydGlvbiBvZiBhbiBpbnRlcmZhY2UgZmlsZS4gVGhlIGNvZGUgaXMgdGhlbiBmZWQgaW50byB0aGUgU1dJRyBwYXJzZXIgYW5kIHR1cm5lZCBpbnRvIGFuIGludGVyZmFjZS4gVGh1cywgdGhlIGFib3ZlIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyBjb21tYW5kIDx0dD5uZXdfVmVjdG9yPC90dD4gdXNpbmcgb25seSBvbmUgZGVjbGFyYXRpb24uIFNpbmNlIHRoZSBjb2RlIGluc2lkZSBhbiA8dHQ+JWlubGluZSAleyAuLi4gJX08L3R0PiBibG9jayBpcyBnaXZlbiB0byBib3RoIHRoZSBDIGNvbXBpbGVyIGFuZCBTV0lHLCBpdCBpcyBpbGxlZ2FsIHRvIGluY2x1ZGUgYW55IFNXSUcgZGlyZWN0aXZlcyBpbnNpZGUgdGhlIDx0dD4leyAuLi4gJX08L3R0PiBibG9jay48cD4KLTxhIG5hbWU9Im43OSI+PC9hPjxoMz4gSW5pdGlhbGl6YXRpb24gYmxvY2tzPC9oMz4KLUNvZGUgbWF5IGFsc28gYmUgaW5zZXJ0ZWQgdXNpbmcgYW4gaW5pdGlhbGl6YXRpb24gYmxvY2ssIGFzIHNob3duIGJlbG93IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5pdCAlewotCi0JaW5pdF92YXJpYWJsZXMoKTsKLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgY29kZSBpcyBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIFNXSUcncyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gICAgWW91IGNhbiB1c2UgaXQgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGFuZCBvcGVyYXRpb25zLiAgIFNpbmNlIHRoaXMgY29kZSBpcyBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIGFub3RoZXIgZnVuY3Rpb24sIGl0IHNob3VsZCBub3QgZGVjbGFyZSBmdW5jdGlvbnMgb3IgaW5jbHVkZSBoZWFkZXIgZmlsZXMuICAgUHJpbWFyaWx5IHRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGNhbGxvdXRzIHRvIHdpZGdldHMgYW5kIG90aGVyIHBhY2thZ2VzIHRoYXQgbWlnaHQgYWxzbyBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHdoZW4geW91ciBleHRlbnNpb24gaXMgbG9hZGVkLjxwPgotPGEgbmFtZT0ibjgwIj48L2E+PGgzPiBXcmFwcGVyIGNvZGUgYmxvY2tzPC9oMz4KLUNvZGUgbWF5IGJlIGluc2VydGVkIGluIHRoZSB3cmFwcGVyIGNvZGUgc2VjdGlvbiBvZiBhbiBvdXRwdXQgZmlsZSB1c2luZyB0aGUgPHR0PiV3cmFwcGVyPC90dD4gZGlyZWN0aXZlIGFzIHNob3duIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ld3JhcHBlciAlewotCS4uLiBhIGJ1bmNoIG9mIGNvZGUgLi4uCi0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGRpcmVjdGl2ZSwgZm9yIGFsbW9zdCBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCBpcyBpZGVudGljYWwgdG8ganVzdCB1c2luZyBhIDx0dD4leywlfTwvdHQ+IGJsb2NrLCBidXQgbWF5IGJlIHJlcXVpcmVkIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgYXBwbGljYXRpb25zLiBJdCBpcyBtYWlubHkgb25seSB1c2VkIGZvciBhZHZhbmNlZCBmZWF0dXJlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiBBcyBhIGdlbmVyYWwgcnVsZSwgeW91IHNob3VsZCBhdm9pZCB1c2luZyB0aGlzIGRpcmVjdGl2ZSB1bmxlc3MgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPHA+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IEEgZ2VuZXJhbCBpbnRlcmZhY2UgYnVpbGRpbmcgc3RyYXRlZ3k8L2gyPgotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZ2VuZXJhbCBhcHByb2FjaCBmb3IgYnVpbGRpbmcgaW50ZXJmYWNlIHdpdGggU1dJRy4gVGhlIHNwZWNpZmljcyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBzY3JpcHRpbmcgbGFuZ3VhZ2UgYXJlIGZvdW5kIGluIGxhdGVyIGNoYXB0ZXJzLjxwPgotPGEgbmFtZT0ibjgxIj48L2E+PGgzPiBQcmVwYXJpbmcgYSBDIHByb2dyYW0gZm9yIFNXSUc8L2gzPgotU1dJRyBkb2Vzbid0IHJlcXVpcmUgbW9kaWZpY2F0aW9ucyB0byB5b3VyIEMgY29kZSwgYnV0IGlmIHlvdSBmZWVkIGl0IGEgY29sbGVjdGlvbiBvZiByYXcgQyBoZWFkZXIgZmlsZXMgb3Igc291cmNlIGNvZGUsIHRoZSByZXN1bHRzIG1pZ2h0IG5vdCBiZSB3aGF0IHlvdSBleHBlY3QtLS1pbiBmYWN0LCB0aGV5IG1pZ2h0IGJlIGF3ZnVsLiBIZXJlJ3MgYSBzZXJpZXMgb2Ygc3RlcHMgeW91IGNhbiBmb2xsb3cgdG8gbWFrZSBhbiBpbnRlcmZhY2UgZm9yIGEgQyBwcm9ncmFtIDo8cD4KLTxwPgotPHVsPgotPGxpPklkZW50aWZ5IHRoZSBmdW5jdGlvbnMgdGhhdCB5b3Ugd2FudCB0byB3cmFwLiBJdCdzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkgdG8gYWNjZXNzIGV2ZXJ5IHNpbmdsZSBmdW5jdGlvbiBpbiBhIEMgcHJvZ3JhbS0tdGh1cywgYSBsaXR0bGUgZm9yZXRob3VnaHQgY2FuIGRyYW1hdGljYWxseSBzaW1wbGlmeSB0aGUgcmVzdWx0aW5nIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIEMgaGVhZGVyIGZpbGVzIGFyZSBwYXJ0aWN1bGFybHkgZ29vZCBzb3VyY2UgZm9yIGZpbmRpbmcgdGhpbmdzIHRvIHdyYXAuCi08bGk+Q3JlYXRlIGEgbmV3IGludGVyZmFjZSBmaWxlIHRvIGRlc2NyaWJlIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlIHRvIHlvdXIgcHJvZ3JhbS4KLTxsaT5Db3B5IHRoZSBhcHByb3ByaWF0ZSBkZWNsYXJhdGlvbnMgaW50byB0aGUgaW50ZXJmYWNlIGZpbGUgb3IgdXNlIFNXSUcncyA8dHQ+JWluY2x1ZGU8L3R0PiBkaXJlY3RpdmUgdG8gcHJvY2VzcyBhbiBlbnRpcmUgQyBzb3VyY2UvaGVhZGVyIGZpbGUuIEVpdGhlciB3YXksIHRoaXMgc3RlcCBpcyBmYWlybHkgZWFzeS4KLTxsaT5NYWtlIHN1cmUgZXZlcnl0aGluZyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUgdXNlcyBBTlNJIEMvQysrc3ludGF4LgotPGxpPkNoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmVuJ3QgYW55IGZ1bmN0aW9ucyBpbnZvbHZpbmcgZnVuY3Rpb24gcG9pbnRlcnMsIG9yIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgc2luY2UgU1dJRyBkb2Vzbid0IGxpa2UgdGhlc2UgdmVyeSBtdWNoLgotPGxpPkVsaW1pbmF0ZSB1bm5lY2Vzc2FyeSBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLiBTV0lHIHdpbGwgcHJvYmFibHkgcmVtb3ZlIG1vc3Qgb2YgdGhlbSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkuIFJlbWVtYmVyLCBTV0lHIGRvZXMgbm90IHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuCi08bGk+TWFrZSBzdXJlIGFsbCBuZWNlc3NhcnkgYDx0dD50eXBlZGVmPC90dD4nIGRlY2xhcmF0aW9ucyBhbmQgdHlwZS1pbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGludGVyZmFjZSBmaWxlLgotPGxpPklmIHlvdXIgcHJvZ3JhbSBoYXMgYSBtYWluKCkgZnVuY3Rpb24sIHlvdSBtYXkgbmVlZCB0byByZW5hbWUgaXQgKHJlYWQgb24pLgotPGxpPlJ1biBTV0lHIGFuZCBjb21waWxlLgotPC91bD4KLTxwPgotV2hpbGUgdGhpcyBtYXkgc291bmQgY29tcGxpY2F0ZWQsIHRoZSBwcm9jZXNzIHR1cm5zIG91dCB0byBiZSByZWxhdGl2ZWx5IGVhc3kgaW4gcHJhY3RpY2UtLWZvciBleGFtcGxlLCBtYWtpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBlbnRpcmUgT3BlbkdMIGxpYnJhcnkgb25seSB0YWtlcyBhYm91dCA1LTEwIG1pbnV0ZXMuPHA+Ci08cD4KLUluIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIGFuIGludGVyZmFjZSwgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBTV0lHIHRvIGZpbmQgcHJvYmxlbWF0aWMgZGVjbGFyYXRpb25zIGFuZCBzcGVjaWZpY2F0aW9ucy4gU1dJRyB3aWxsIHJlcG9ydCBzeW50YXggZXJyb3JzIGFuZCBvdGhlciBwcm9ibGVtcyBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIGZpbGUgYW5kIGxpbmUgbnVtYmVyLiA8cD4KLTxhIG5hbWU9Im44MiI+PC9hPjxoMz4gVGhlIFNXSUcgaW50ZXJmYWNlIGZpbGU8L2gzPgotVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgdXNpbmcgU1dJRyBpcyB0byBnZW5lcmF0ZSBzZXBhcmF0ZSBpbnRlcmZhY2UgZmlsZS4gU3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIEMgaGVhZGVyIGZpbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEZpbGUgOiBoZWFkZXIuaCAqLwotCi0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICZsdDttYXRoLmgmZ3Q7Ci0KLWV4dGVybiBpbnQgZm9vKGRvdWJsZSk7Ci1leHRlcm4gZG91YmxlIGJhcihpbnQsIGludCk7Ci1leHRlcm4gdm9pZCBkdW1wKEZJTEUgKmYpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BIHR5cGljYWwgU1dJRyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhpcyBoZWFkZXIgZmlsZSB3b3VsZCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotLyogRmlsZSA6IGludGVyZmFjZS5pICovCi0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgImhlYWRlci5oIgotJX0KLWV4dGVybiBpbnQgZm9vKGRvdWJsZSk7Ci1leHRlcm4gZG91YmxlIGJhcihpbnQsIGludCk7Ci1leHRlcm4gdm9pZCBkdW1wKEZJTEUgKmYpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PZiBjb3Vyc2UsIGluIHRoaXMgY2FzZSwgb3VyIGhlYWRlciBmaWxlIGlzIHByZXR0eSBzaW1wbGUgc28gd2UgY291bGQgaGF2ZSBtYWRlIGFuIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyBhcyB3ZWxsOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBpbnRlcmZhY2UuaSAqLwotJW1vZHVsZSBteW1vZHVsZQotJWluY2x1ZGUgaGVhZGVyLmgKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTmF0dXJhbGx5LCB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuPHA+Ci08YSBuYW1lPSJuODMiPjwvYT48aDM+IFdoeSB1c2Ugc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGVzPzwvaDM+Ci1XaGlsZSBTV0lHIGNhbiBwYXJzZSBtYW55IGhlYWRlciBmaWxlcywgaXQgaXMgbW9yZSBjb21tb24gdG8gd3JpdGUgYSBzcGVjaWFsIDx0dD4uaTwvdHQ+IGZpbGUgZGVmaW5pbmcgdGhlIGludGVyZmFjZSB0byBhIHBhY2thZ2UuIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgZm9yIGRvaW5nIHRoaXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+SXQgaXMgcmFyZWx5IG5lY2Vzc2FyeSB0byBhY2Nlc3MgZXZlcnkgc2luZ2xlIGZ1bmN0aW9uIGluIGEgbGFyZ2UgcGFja2FnZS4gTWFueSBDIGZ1bmN0aW9ucyBtaWdodCBoYXZlIGxpdHRsZSBvciBubyB1c2UgaW4gYSBzY3JpcHRlZCBlbnZpcm9ubWVudC4gVGhlcmZvcmUsIHdoeSB3cmFwIHRoZW0/Ci08bGk+U2VwYXJhdGUgaW50ZXJmYWNlIGZpbGVzIHByb3ZpZGUgYW4gb3Bwb3J0dW5pdHkgdG8gcHJvdmlkZSBtb3JlIHByZWNpc2UgcnVsZXMgYWJvdXQgaG93IGFuIGludGVyZmFjZSBpcyB0byBiZSBjb25zdHJ1Y3RlZC4KLTxsaT5JbnRlcmZhY2UgZmlsZXMgY2FuIHByb3ZpZGUgc3RydWN0dXJlIGFuZCBvcmdhbml6YXRpb24uIEZvciBleGFtcGxlICwgeW91IGNhbiBicmVhayB0aGUgaW50ZXJmYWNlIHVwIGludG8gc2VjdGlvbnMsIHByb3ZpZGUgZG9jdW1lbnRhdGlvbiwgYW5kIGRvIG90aGVyIHRoaW5ncyB0aGF0IHlvdSBtaWdodCBub3Qgbm9ybWFsbHkgZG8gd2l0aCBhbiBvcmRpbmFyeSAuaCBmaWxlLgotPGxpPlNXSUcgY2FuJ3QgcGFyc2UgY2VydGFpbiBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiBoZWFkZXIgZmlsZXMuIEhhdmluZyBhIHNlcGFyYXRlIGZpbGUgYWxsb3dzIHlvdSB0byBlbGltaW5hdGUgb3Igd29yayBhcm91bmQgdGhlc2UgcHJvYmxlbXMuCi08bGk+SW50ZXJmYWNlIGZpbGVzIHByb3ZpZGUgYSBwcmVjaXNlIGRlZmluaXRpb24gb2Ygd2hhdCB0aGUgaW50ZXJmYWNlIGlzLiBVc2VycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgc3lzdGVtIGNhbiBnbyB0byB0aGUgaW50ZXJmYWNlIGZpbGUgYW5kIGltbWVkaWF0ZWx5IHNlZSB3aGF0IGlzIGF2YWlsYWJsZSB3aXRob3V0IGhhdmluZyB0byBkaWcgaXQgb3V0IG9mIGhlYWRlciBmaWxlcy4KLTwvdWw+Ci08YSBuYW1lPSJuODQiPjwvYT48aDM+IEdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvaDM+Ci1Tb21ldGltZXMsIGl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgY2VydGFpbiBoZWFkZXIgZmlsZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBTV0lHIHRvIGNvbXBpbGUgcHJvcGVybHkuIFlvdSBjYW4gaGF2ZSBTV0lHIGluY2x1ZGUgY2VydGFpbiBoZWFkZXIgZmlsZXMgYnkgdXNpbmcgYSA8dHQ+JXssJX08L3R0PiBibG9jayBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlIGdyYXBoaWNzCi0lewotI2luY2x1ZGUgJmx0O0dML2dsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7R0wvZ2x1LmgmZ3Q7Ci0lfQotCi0vLyBQdXQgcmVzdCBvZiBkZWNsYXJhdGlvbnMgaGVyZQotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuODUiPjwvYT48aDM+IFdoYXQgdG8gZG8gd2l0aCBtYWluKCk8L2gzPgotSWYgeW91ciBwcm9ncmFtIGRlZmluZXMgYSA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24sIHlvdSBtYXkgbmVlZCB0byBnZXQgcmlkIG9mIGl0IG9yIHJlbmFtZSBpdCBpbiBvcmRlciB0byB1c2UgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIE1vc3Qgc2NyaXB0aW5nIGxhbmd1YWdlcyBkZWZpbmUgdGhlaXIgb3duIDx0dD5tYWluKCk8L3R0PiBwcm9jZWR1cmUgdGhhdCBtdXN0IGJlIGNhbGxlZCBpbnN0ZWFkLiA8dHQ+bWFpbigpPC90dD4gYWxzbyBtYWtlcyBubyBzZW5zZSB3aGVuIHdvcmtpbmcgd2l0aCBkeW5hbWljIGxvYWRpbmcuIFRoZXJlIGFyZSBhIGZldyBhcHByb2FjaGVzIHRvIHNvbHZpbmcgdGhlIDx0dD5tYWluKCk8L3R0PiBjb25mbGljdCA6PHA+Ci08cD4KLTx1bD4KLTxsaT5HZXQgcmlkIG9mIDx0dD5tYWluKCk8L3R0PiBlbnRpcmVseS4gVGhpcyBpcyB0aGUgYnJ1dGUgZm9yY2UgYXBwcm9hY2guCi08bGk+UmVuYW1lIDx0dD5tYWluKCk8L3R0PiB0byBzb21ldGhpbmcgZWxzZS4gWW91IGNhbiBkbyB0aGlzIGJ5IGNvbXBpbGluZyB5b3VyIEMgcHJvZ3JhbSB3aXRoIGFuIG9wdGlvbiBsaWtlIDx0dD4tRG1haW49b2xkbWFpbjwvdHQ+LgotPGxpPlVzZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBvbmx5IGluY2x1ZGUgPHR0Pm1haW4oKTwvdHQ+IHdoZW4gbm90IHVzaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlLgotPC91bD4KLTxwPgotR2V0dGluZyByaWQgb2YgPHR0Pm1haW4oKTwvdHQ+IG1heSBjYXVzZSBwb3RlbnRpYWwgaW5pdGlhbGl6YXRpb24gcHJvYmxlbXMgb2YgYSBwcm9ncmFtLiBUbyBoYW5kbGUgdGhpcyBwcm9ibGVtLCB5b3UgbWF5IGNvbnNpZGVyIHdyaXRpbmcgYSBzcGVjaWFsIGZ1bmN0aW9uIGNhbGxlZCA8dHQ+cHJvZ3JhbV9pbml0KCk8L3R0PiB0aGF0IGluaXRpYWxpemVzIHlvdXIgcHJvZ3JhbSB1cG9uIHN0YXJ0dXAuIFRoaXMgZnVuY3Rpb24gY291bGQgdGhlbiBiZSBjYWxsZWQgZWl0aGVyIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBhcyB0aGUgZmlyc3Qgb3BlcmF0aW9uLCBvciB3aGVuIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUgaXMgbG9hZGVkLjxwPgotPHA+Ci1BcyBhIGdlbmVyYWwgbm90ZSwgbWFueSBDIHByb2dyYW1zIG9ubHkgdXNlIHRoZSA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gdG8gcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRvIHNldCBwYXJhbWV0ZXJzLiBIb3dldmVyLCBieSB1c2luZyBhIHNjcmlwdGluZyBsYW5ndWFnZSwgeW91IGFyZSBwcm9iYWJseSB0cnlpbmcgdG8gY3JlYXRlIGEgcHJvZ3JhbSB0aGF0IGlzIG1vcmUgaW50ZXJhY3RpdmUuIEluIG1hbnkgY2FzZXMsIHRoZSBvbGQgPHR0Pm1haW4oKTwvdHQ+IHByb2dyYW0gY2FuIGJlIGNvbXBsZXRlbHkgcmVwbGFjZWQgYnkgYSBQZXJsLCBQeXRob24sIG9yIFRjbCBzY3JpcHQuPHA+Ci08YSBuYW1lPSJuODYiPjwvYT48aDM+IFdvcmtpbmcgd2l0aCB0aGUgQyBwcmVwcm9jZXNzb3I8L2gzPgotSWYgeW91IGhhdmUgYSBoZWFkZXIgZmlsZSB0aGF0IG1ha2VzIGhlYXZ5IHVzZSBvZiBtYWNyb3MgYW5kIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMsIGl0IG1heSBiZSB1c2VmdWwgdG8gcnVuIGl0IHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIGZpcnN0LiBUaGlzIGNhbiB1c3VhbGx5IGJlIGRvbmUgYnkgcnVubmluZyB0aGUgQyBjb21waWxlciB3aXRoIHRoZSAtRSBvcHRpb24uIFRoZSBvdXRwdXQgd2lsbCBiZSBjb21wbGV0ZWx5IGhpZGVvdXMsIGJ1dCBtYWNyb3MgYW5kIG90aGVyIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHNob3VsZCBub3cgYmUgZXhwYW5kZWQgYXMgbmVlZGVkLiBJZiB5b3Ugd2FudCB0byB3cmFwIGEgQyBwcmVwcm9jZXNzb3IgbWFjcm8gd2l0aCBTV0lHLCB0aGlzIGNhbiBiZSBkb25lIGJ5IGdpdmluZyBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdXNhZ2UgYXMgdGhlIG1hY3JvLiBXaGVuIHdyaXRpbmcgdGhlIG1hY3JvIGFzIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIHlvdSBhcmUgcHJvdmlkaW5nIFNXSUcgd2l0aCB0eXBlLWluZm9ybWF0aW9uLS13aXRob3V0IHRoYXQsIFNXSUcgd291bGQgYmUgdW5hYmxlIHRvIHByb2R1Y2UgYW55IHNvcnQgb2Ygd3JhcHBlciBjb2RlLiA8cD4KLTxhIG5hbWU9Im44NyI+PC9hPjxoMz4gSG93IHRvIGNvcGUgd2l0aCBDKys8L2gzPgotR2l2ZW4gdGhlIGNvbXBsZXhpdHkgb2YgQysrLCBpdCB3aWxsIGFsbW9zdCBhbHdheXMgYmUgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEgc3BlY2lhbCBpbnRlcmZhY2UgZmlsZSBjb250YWluaW5nIHN1aXRhYmx5IGVkaXRlZCBDKysgZGVjbGFyYXRpb25zLiBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhIHN5c3RlbSBpbnZvbHZpbmcgNDAwIGhlYWRlciBmaWxlcywgdGhpcyBwcm9jZXNzIHdpbGwgbm90IGJlIHRyaXZpYWwuIFBlcmhhcHMgdGhlIGJlc3Qgd29yZCBvZiBhZHZpY2UgaXMgdG8gdGhpbmsgaGFyZCBhYm91dCB3aGF0IHlvdSB3YW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlLiBBbHNvLCBpcyBpdCBhYnNvbHV0ZWx5IGNyaXRpY2FsIHRvIHdyYXAgZXZlcnkgc2luZ2xlIGZ1bmN0aW9uIGluIGEgQysrIHByb2dyYW0/IFNXSUcncyBzdXBwb3J0IG9mIEMrKyB3aWxsIGltcHJvdmUgd2l0aCB0aW1lLCBidXQgSSdsbCBiZSB0aGUgZmlyc3QgdG8gYWRtaXQgdGhhdCBTV0lHIHdvcmtzIG11Y2ggYmV0dGVyIHdpdGggcHVyZSBBTlNJIEMgY29kZSB3aGVuIGl0IGNvbWVzIHRvIGxhcmdlIHBhY2thZ2VzLjxwPgotPGEgbmFtZT0ibjg4Ij48L2E+PGgzPiBIb3cgdG8gYXZvaWQgY3JlYXRpbmcgdGhlIGludGVyZmFjZSBmcm9tIGhlbGw8L2gzPgotU1dJRyBtYWtlcyBpdCBwcmV0dHkgZWFzeSB0byBidWlsZCBhIGJpZyBpbnRlcmZhY2UgcmVhbGx5IGZhc3QuIEluIGZhY3QsIGlmIHlvdSBhcHBseSBpdCB0byBhIGxhcmdlIGVub3VnaCBwYWNrYWdlLCB5b3UnbGwgZmluZCB5b3Vyc2VsZiB3aXRoIGEgcmF0aGVyIGxhcmdlIGNodW5rIG9mIGNvZGUgYmVpbmcgcHJvZHVjZWQgaW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGZpbGUuIFRvIGdpdmUgeW91IGFuIGlkZWEsIHdyYXBwaW5nIGEgMTAwMCBsaW5lIEMgaGVhZGVyIGZpbGUgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIG1heSByZXN1bHQgaW4gYSB3cmFwcGVyIGZpbGUgY29udGFpbmluZyAyMCwwMDAtMzAsMDAwIGxpbmVzIG9mIGNvZGUuIEkgY2FuIG9ubHkgaW1hZ2luZSB3aGF0IHdyYXBwaW5nIGEgaHVnZSBDKysgY2xhc3MgaGllcmFyY2h5IHdvdWxkIGdlbmVyYXRlLiBIZXJlJ3MgYSBmZXcgcnVsZXMgb2YgdGh1bWIgZm9yIG1ha2luZyBzbWFsbGVyIGludGVyZmFjZXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+QXNrIHlvdXJzZWxmIGlmIHlvdSByZWFsbHkgbmVlZCB0byBhY2Nlc3MgcGFydGljdWxhciBmdW5jdGlvbnMuIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byB3cmFwIGV2ZXJ5IHNpbmdsZSBmdW5jdGlvbiBpbiBhIHBhY2thZ2UuIEluIGZhY3QsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgYSByZWxhdGl2ZWx5IHNtYWxsIHN1YnNldC4KLTxsaT5TV0lHIGRvZXMgbm90IHJlcXVpcmUgc3RydWN0dXJlIGRlZmluaXRpb25zIHRvIG9wZXJhdGUuIElmIHlvdSBhcmUgbmV2ZXIgZ29pbmcgdG8gYWNjZXNzIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0dXJlLCBkb24ndCB3cmFwIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gCi08bGk+RWxpbWluYXRlIHVubmVlZGVkIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuCi08bGk+VGhpbmsgYWJvdXQgdGhlIHByb2JsZW0gYXQgaGFuZC4gSWYgeW91IGFyZSBvbmx5IHVzaW5nIGEgc3Vic2V0IG9mIHNvbWUgbGlicmFyeSwgdGhlcmUgaXMgbm8gbmVlZCB0byB3cmFwIHRoZSB3aG9sZSB0aGluZy4KLTxsaT5Xcml0ZSBzdXBwb3J0IG9yIGhlbHBlciBmdW5jdGlvbnMgdG8gc2ltcGxpZnkgY29tbW9uIG9wZXJhdGlvbnMuIFNvbWUgQyBmdW5jdGlvbnMgbWF5IG5vdCBiZSBlYXN5IHRvIHVzZSBpbiBhIHNjcmlwdGluZyBsYW5ndWFnZSBlbnZpcm9ubWVudC4gWW91IG1pZ2h0IGNvbnNpZGVyIHdyaXRpbmcgYW4gYWx0ZXJuYXRpdmUgdmVyc2lvbiBhbmQgd3JhcHBpbmcgdGhhdCBpbnN0ZWFkLgotPC91bD4KLTxwPgotV3JpdGluZyBhIG5pY2UgaW50ZXJmYWNlIHRvIGEgcGFja2FnZSByZXF1aXJlcyB3b3JrLiBKdXN0IGJlY2F1c2UgeW91IHVzZSBTV0lHIGl0IGRvZXNuJ3QgbWVhbiB0aGF0IHlvdSdyZSBnb2luZyB0byBlbmQgdXAgd2l0aCBhIGdvb2QgaW50ZXJmYWNlLiBTV0lHIGlzIHByaW1hcmlseSBkZXNpZ25lZCB0byBlbGltaW5hdGUgdGhlIHRlZGlvdXMgdGFzayBvZiB3cml0aW5nIHdyYXBwZXIgZnVuY3Rpb25zLiBJdCBkb2VzIG5vdCBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHByb3BlciBwbGFubmluZyBhbmQgZGVzaWduIHdoZW4gaXQgY29tZXMgdG8gYnVpbGRpbmcgYSB1c2VmdWwgYXBwbGljYXRpb24uIEluIHNob3J0LCBhIGxpdHRsZSBmb3JldGhvdWdodCBjYW4gZ28gYSBsb25nIHdheS48cD4KLTxwPgotT2YgY291cnNlLGlmIHlvdSdyZSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiBqdXN0IHNsYXBwaW5nIHNvbWV0aGluZyB0b2dldGhlciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVidWdnaW5nLCByYXBpZCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgYW5kIHByb3RvdHlwaW5nLCBTV0lHIHdpbGwgZ2xhZGx5IGRvIGl0IGZvciB5b3UgKGluIGZhY3QsIEkgdXNlIFNXSUcgYWxvdCBmb3IgdGhpcyB3aGVuIGRldmVsb3Bpbmcgb3RoZXIgQy9DKysgYXBwbGljYXRpb25zKS48cD4KLTxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDY6NTMgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvU2NyaXB0aW5nLmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML1NjcmlwdGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc4ODEyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvU2NyaXB0aW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPCEtLSBQdWJsaXNoZWQgYnkgUXVhZHJhbGF5IFdlYldvcmtzIEhUTUwgTGl0ZSAxLjUuMSAtLT4KLTwhLS0gQW5kIG11bmdlZCBieSBEYXZlJ3Mgc3BlY2lhbCBQeXRob24gc2NyaXB0IC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5TY3JpcHRpbmcgTGFuZ3VhZ2VzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4yIFNjcmlwdGluZyBMYW5ndWFnZXM8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5UaGUgdHdvIGxhbmd1YWdlIHZpZXcgb2YgdGhlIHdvcmxkPC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPkhvdyBkb2VzIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRhbGsgdG8gQz88L2E+Ci08bGk+IDxhIGhyZWY9IiNuMyI+QnVpbGRpbmcgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+U2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pYyBsb2FkaW5nPC9hPgotPC91bD4KLQotU1dJRyBpcyBhbGwgYWJvdXQgdXNpbmcgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aXRoIEMvQysrIHRvIG1ha2UgZmxleGlibGUgYXBwbGljYXRpb25zLiBUaGlzIGNoYXB0ZXIgcHJvdmlkZXMgYSBicmllZiBvdmVydmlldyBvZiBzZXZlcmFsIGNvbmNlcHRzIGFuZCBpbXBvcnRhbnQgYXNwZWN0cyBvZiB0aGlzIGludGVyZmFjZS4gTWFueSBvZiBTV0lHJ3MgcG90ZW50aWFsIHVzZXJzIG1heSBub3QgaGF2ZSBjb25zaWRlcmVkIHVzaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGJlZm9yZSwgc28gSSBob3BlIHRoYXQgdGhpcyBjaGFwdGVyIGNhbiBwcm92aWRlIGEgbGl0dGxlIG1vdGl2YXRpb24uPHA+Ci08YSBuYW1lPSJuMSI+PC9hPjxoMj4gVGhlIHR3byBsYW5ndWFnZSB2aWV3IG9mIHRoZSB3b3JsZDwvaDI+Ci1CeSBkZXZlbG9waW5nIFNXSUcsIEkgYW0gdHJ5aW5nIHRvIGJ1aWxkIHN5c3RlbXMgdGhhdCBhcmUgbG9vc2VseSBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3MgOjxwPgotPHA+PGNlbnRlcj48aW1nIHNyYz0iY2gyLjEucG5nIj48L2NlbnRlcj48cD4KLTxwPgotPHA+Ci1BIHJlYWwgYXBwbGljYXRpb24gbWlnaHQgbG9vayBtb3JlIGxpa2UgdGhpcyA6PHA+Ci08cD48Y2VudGVyPjxpbWcgc3JjPSJjaDIuMi5wbmciPjwvY2VudGVyPjxwPgotPHA+Ci1JbiBlaXRoZXIgY2FzZSwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY29udHJvbGxpbmcgYSBDL0MrKyBwcm9ncmFtIHdpdGggYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlLiBPdXIgaW50ZXJmYWNlIG1heSBiZSBmb3IgYSBzbWFsbCBncm91cCBvZiBmdW5jdGlvbnMgb3IgYSBsYXJnZSBjb2xsZWN0aW9uIG9mIEMgbGlicmFyaWVzIGZvciBwZXJmb3JtaW5nIGEgdmFyaWV0eSBvZiB0YXNrcy4gSW4gdGhpcyBtb2RlbCwgQyBmdW5jdGlvbnMgYXJlIHR1cm5lZCBpbnRvIGNvbW1hbmRzLiBUbyBjb250cm9sIHRoZSBwcm9ncmFtLCB0aGUgdXNlciBub3cgdHlwZXMgdGhlc2UgY29tbWFuZHMgb3Igd3JpdGVzIHNjcmlwdHMgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uLiBJZiB5b3UgaGF2ZSB1c2VkIGNvbW1lcmNpYWwgcGFja2FnZXMgc3VjaCBhcyBNQVRMQUIgb3IgSURMLCBpdCBpcyBhIHZlcnkgc2ltaWxhciBtb2RlbC0teW91IGV4ZWN1dGUgY29tbWFuZHMgYW5kIHdyaXRlIHNjcmlwdHMsIHlldCBtb3N0IG9mIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgd3JpdHRlbiBpbiBDIG9yIEZvcnRyYW4gZm9yIHBlcmZvcm1hbmNlLjxwPgotPHA+Ci1UaGUgdHdvLWxhbmd1YWdlIG1vZGVsIG9mIGNvbXB1dGluZyBpcyBleHRyZW1lbHkgcG93ZXJmdWwgYmVjYXVzZSBpdCBleHBsb2l0cyB0aGUgc3RyZW5ndGhzIG9mIGVhY2ggbGFuZ3VhZ2UuIEMvQysrIGNhbiBiZSB1c2VkIGZvciBtYXhpbWFsIHBlcmZvcm1hbmNlIGFuZCBjb21wbGljYXRlZCBzeXN0ZW1zIHByb2dyYW1taW5nIHRhc2tzLiBTY3JpcHRpbmcgbGFuZ3VhZ2VzIGNhbiBiZSB1c2VkIGZvciByYXBpZCBwcm90b3R5cGluZywgaW50ZXJhY3RpdmUgZGVidWdnaW5nLCBzY3JpcHRpbmcsIGFuZCBhY2Nlc3MgdG8gaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMgc3VjaCBhcyBsaXN0cywgYXJyYXlzLCBhbmQgaGFzaCB0YWJsZXMuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMz4gV2lsbCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIG1ha2UgbXkgQyBwcm9ncmFtIGluZWZmaWNpZW50PzwvaDM+Ci1PbmUgb2YgdGhlIGNyaXRpY2lzbXMgb2Ygc2NyaXB0aW5nIGxhbmd1YWdlcyBpcyB0aGF0IHRoZXkgYXJlIGludGVycHJldGVkIGFuZCBzbG93LiBObyBkb3VidCBhYm91dCBpdCwgYSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2lsbCBhbHdheXMgcnVuIG11Y2ggc2xvd2VyIHRoYW4gQy4gSG93ZXZlciwgaWYgeW91IGFyZSB1c2luZyBhIHNjcmlwdGluZyBsYW5ndWFnZSB0byBjb250cm9sIGEgYmlnIEMgcHJvZ3JhbSwgbW9zdCBvZiB5b3VyIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgd3JpdHRlbiBpbiBDIGFuZCBzdGlsbCBmYXN0LiBUaHVzLCB0aGVyZSBpcyByZWFsbHkgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHdyaXRpbmcgdGhlIGZvbGxvd2luZyBpbiBDIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmZvciAoaSA9IDA7IGkgJmx0OyAxMDAwOyBpKyspIHsKLQljYWxsIGEgYnVuY2ggb2YgQyBmdW5jdGlvbnMgdG8gZG8gc29tZXRoaW5nCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLW9yIHdyaXRpbmcgdGhlIHNhbWUgdGhpbmcgaW4gUHl0aG9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5mb3IgaSBpbiByYW5nZSgwLDEwMDApOgotCWNhbGwgYSBidW5jaCBvZiBDIGZ1bmN0aW9ucyB0byBkbyBzb21ldGhpbmcKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTW9zdCBvZiB0aGUgdGltZSBpcyBzdGlsbCBzcGVudCBpbiB0aGUgdW5kZXJseWluZyBDIGZ1bmN0aW9ucy4gT2YgY291cnNlLCB5b3Ugd291bGRuJ3Qgd2FudCB0byB3cml0ZSB0aGUgaW5uZXIgbG9vcCBvZiBhIG1hdHJpeCBtdWx0aXBseSBpbiBhIHNjcmlwdGluZyBsYW5ndWFnZSwgYnV0IHlvdSBhbHJlYWR5IGtuZXcgdGhpcy4gSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCByZWltcGxlbWVudGluZyBjZXJ0YWluIG9wZXJhdGlvbnMgaW4gQyBtaWdodCBub3QgbGVhZCB0byBiZXR0ZXIgcGVyZm9ybWFuY2UuIEZvciBleGFtcGxlLCBQZXJsIGlzIGhpZ2hseSBvcHRpbWl6ZWQgZm9yIHRleHQtcHJvY2Vzc2luZyBvcGVyYXRpb25zLiBNb3N0IG9mIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gQyAodW5kZXJuZWF0aCB0aGUgaG9vZCkgc28gaW4gY2VydGFpbiBjYXNlcywgdXNpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbWF5IGFjdHVhbGx5IGJlIGZhc3RlciB0aGFuIGFuIGVxdWl2YWxlbnQgaW1wbGVtZW50YXRpb24gaW4gQy4gPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMz4gV2lsbCBhZGRpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdG8gbXkgQyBwcm9ncmFtIG1ha2UgaXQgdW5tYW5hZ2FibGU/PC9oMz4KLUEgZmVhciBhbW9uZyBzb21lIHVzZXJzIGlzIHRoYXQgYnkgYWRkaW5nIGEgc2Vjb25kIGxhbmd1YWdlLCB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIHBhY2thZ2UgdGhhdCBpcyBoYXJkIHRvIG1haW50YWluIGFuZCB1c2UuIEkgYmVsaWV2ZSB0aGF0IHRoZXJlIGFyZSB0d28gYW5zd2VycyB0byB0aGlzIHF1ZXN0aW9uLiBJZiB5b3UgZmluZCB5b3Vyc2VsZiBtb2RpZnlpbmcgdGhlIEMgY29kZSB0byBmaXQgaXQgaW50byBhIHNwZWNpZmljIHNjcmlwdGluZyBsYW5ndWFnZSwgdGhlbiBpdCB3aWxsIGJlIGRpZmZpY3VsdCB0byBtYWludGFpbi4gQnkgZG9pbmcgdGhpcywgeW91IHdpbGwgbG9jayB5b3Vyc2VsZiBpbnRvIGEgcGFydGljdWxhciBsYW5ndWFnZS4gSWYgdGhhdCBsYW5ndWFnZSBjaGFuZ2VzIG9yIGRpc2FwcGVhcnMgb2ZmIHRoZSBmYWNlIG9mIHRoZSBlYXJ0aCwgdGhlbiB5b3Ugd2lsbCBiZSBsZWZ0IHdpdGggc2VyaW91cyBtYWludGVuYW5jZSBwcm9ibGVtcy4gT24gdGhlIGZsaXAgc2lkZSBvZiB0aGUgY29pbiwgYSBub24taW52YXNpdmUgdG9vbCBsaWtlIFNXSUcgY2FuIGJ1aWxkIGludGVyZmFjZXMgd2l0aG91dCByZXF1aXJpbmcgbGFuZ3VhZ2Utc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDIGNvZGUuIElmIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgY2hhbmdlcywgaXQgaXMgZWFzeSB0byB1cGRhdGUgdGhlIHJlc3VsdGluZyBpbnRlcmZhY2UuIElmIHlvdSBkZWNpZGUgdGhhdCB5b3Ugd2FudCB0byBzY3JhcCB0aGUgd2hvbGUgaW50ZXJmYWNlIHNjaGVtZSBhbmQgdHJ5IHNvbWV0aGluZyBlbHNlLCB5b3Ugc3RpbGwgaGF2ZSBhIGNsZWFuIHNldCBvZiBDIGxpYnJhcmllczxwPgotPHA+Ci1NeSBwZXJzb25hbCBleHBlcmllbmNlIGhhcyBiZWVuIHRoYXQgYWRkaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRvIGEgQyBwcm9ncmFtIG1ha2VzIHRoZSBDIHByb2dyYW0gbW9yZSBtYW5hZ2FibGUhIFlvdSBhcmUgZW5jb3VyYWdlZCB0byB0aGluayBhYm91dCBob3cgeW91ciBDIHByb2dyYW0gaXMgc3RydWN0dXJlZCBhbmQgaG93IHlvdSB3YW50IHRoaW5ncyB0byB3b3JrLiBJbiBldmVyeSBwcm9ncmFtIGluIHdoaWNoIEkgaGF2ZSBhZGRlZCBhIHNjcmlwdGluZyBpbnRlcmZhY2UsIHRoZSBDIGNvZGUgaGFzIGFjdHVhbGx5IGRlY3JlYXNlZCBpbiBzaXplLCBpbXByb3ZlZCBpbiByZWxpYWJpbGl0eSwgYmVjb21lIGVhc2llciB0byBtYWludGFpbiwgd2hpbGUgYmVjb21pbmcgbW9yZSBmdW5jdGlvbmFsIGFuZCBmbGV4aWJsZSB0aGFuIGJlZm9yZS48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBIb3cgZG9lcyBhIHNjcmlwdGluZyBsYW5ndWFnZSB0YWxrIHRvIEM/PC9oMj4KLVNjcmlwdGluZyBsYW5ndWFnZXMgYXJlIGJ1aWx0IGFyb3VuZCBhIHNtYWxsIHBhcnNlciB0aGF0IHJlYWRzIGFuZCBleGVjdXRlcyBzdGF0ZW1lbnRzIG9uIHRoZSBmbHkgYXMgeW91ciBwcm9ncmFtIHJ1bnMuIFdpdGhpbiB0aGUgcGFyc2VyLCB0aGVyZSBpcyBhIG1lY2hhbmlzbSBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzIG9yIGFjY2Vzc2luZyB2YXJpYWJsZXMuIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGFjY2VzcyBDIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLCBpdCBpcyBuZWNlc3NhcnkgdG8gdGVsbCB0aGUgcGFyc2VyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIHdoYXQga2luZCBvZiBhcmd1bWVudHMgZG9lcyBpdCB0YWtlLCBhbmQgd2hhdCB0byBkbyB3aGVuIGl0IGlzIGNhbGxlZC4gVW5mb3J0dW5hdGVseSwgdGhpcyBwcm9jZXNzIGNhbiBiZSBleHRyZW1lbHkgdGVkaW91cyBhbmQgdGVjaG5pY2FsLiBTV0lHIGF1dG9tYXRlcyB0aGUgcHJvY2VzcyBhbmQgYWxsb3dzIHlvdSB0byBmb3JnZXQgYWJvdXQgaXQuIEluIGFueSBjYXNlLCBpdCdzIHByb2JhYmx5IGEgZ29vZCBpZGVhIHRvIGtub3cgd2hhdCdzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDM+IFdyYXBwZXIgZnVuY3Rpb25zPC9oMz4KLVN1cHBvc2UgeW91IGhhdmUgYW4gb3JkaW5hcnkgQyBmdW5jdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBmYWN0KGludCBuKSB7Ci0JaWYgKG4gJmx0Oz0gMSkgcmV0dXJuIDE7Ci0JZWxzZSByZXR1cm4gbipmYWN0KG4tMSk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIG9yZGVyIHRvIGFjY2VzcyB0aGlzIGZ1bmN0aW9uIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UsIGl0IGlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNwZWNpYWwgIndyYXBwZXIiIGZ1bmN0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBnbHVlIGJldHdlZW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgdGhlIHVuZGVybHlpbmcgQyBmdW5jdGlvbi4gQSB3cmFwcGVyIGZ1bmN0aW9uIG11c3QgZG8gdGhyZWUgdGhpbmdzIDo8cD4KLTxwPgotPHVsPgotPGxpPkdhdGhlciBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSB2YWxpZC4KLTxsaT5DYWxsIHRoZSBDIGZ1bmN0aW9uLgotPGxpPkNvbnZlcnQgdGhlIHJldHVybiB2YWx1ZSBpbnRvIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UuCi08L3VsPgotPHA+Ci1BcyBhbiBleGFtcGxlLCB0aGUgVGNsIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoZSA8dHQ+ZmFjdCgpPC90dD4gZnVuY3Rpb24gYWJvdmUgZXhhbXBsZSBtaWdodCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6IDxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWludCB3cmFwX2ZhY3QoQ2xpZW50RGF0YSBjbGllbnREYXRhLCBUY2xfSW50ZXJwICppbnRlcnAsCi0JCWludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLQlpbnQgX3Jlc3VsdDsKLQlpbnQgX2FyZzA7Ci0JaWYgKGFyZ2MgIT0gMikgewotCQlpbnRlcnAtJmd0O3Jlc3VsdCA9ICJ3cm9uZyAjIGFyZ3MiOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KLQlfYXJnMCA9IGF0b2koYXJndlsxXSk7Ci0JX3Jlc3VsdCA9IGZhY3QoX2FyZzApOwotCXNwcmludGYoaW50ZXJwLSZndDtyZXN1bHQsIiVkIiwgX3Jlc3VsdCk7Ci0JcmV0dXJuIFRDTF9PSzsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT25jZSB3ZSBoYXZlIGNyZWF0ZWQgYSB3cmFwcGVyIGZ1bmN0aW9uLCB0aGUgZmluYWwgc3RlcCBpcyB0byB0ZWxsIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYWJvdXQgb3VyIG5ldyBmdW5jdGlvbi4gVGhpcyBpcyB1c3VhbGx5IGRvbmUgaW4gYW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBsYW5ndWFnZSB3aGVuIG91ciBtb2R1bGUgaXMgbG9hZGVkLiBGb3IgZXhhbXBsZSwgYWRkaW5nIHRoZSBhYm92ZSBmdW5jdGlvbiB0byB0aGUgVGNsIGludGVycHJldGVyIHdvdWxkIHJlcXVpcmUgY29kZSBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBXcmFwX0luaXQoVGNsX0ludGVycCAqaW50ZXJwKSB7Ci0JVGNsX0NyZWF0ZUNvbW1hbmQoaW50ZXJwLCAiZmFjdCIsIHdyYXBfZmFjdCwgKENsaWVudERhdGEpIE5VTEwsCi0JCQkJKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpOwotCXJldHVybiBUQ0xfT0s7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gZXhlY3V0ZWQsIFRjbCB3aWxsIG5vdyBoYXZlIGEgbmV3IGNvbW1hbmQgY2FsbGVkICI8dHQ+ZmFjdDwvdHQ+IiB0aGF0IHlvdSBjYW4gdXNlIGxpa2UgYW55IG90aGVyIFRjbCBjb21tYW5kLjxwPgotPHA+Ci1XaGlsZSB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSBuZXcgZnVuY3Rpb24gdG8gVGNsIGhhcyBiZWVuIGlsbHVzdHJhdGVkLCB0aGUgcHJvY2VkdXJlIGlzIGFsbW9zdCBpZGVudGljYWwgZm9yIFBlcmwgYW5kIFB5dGhvbi4gQm90aCByZXF1aXJlIHNwZWNpYWwgd3JhcHBlcnMgdG8gYmUgd3JpdHRlbiBhbmQgYm90aCBuZWVkIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gY29kZS4gT25seSB0aGUgc3BlY2lmaWMgZGV0YWlscyBhcmUgZGlmZmVyZW50LjxwPgotPGEgbmFtZT0ibjgiPjwvYT48aDM+IFZhcmlhYmxlIGxpbmtpbmc8L2gzPgotVmFyaWFibGUgbGlua2luZyBpcyBhIHNsaWdodGx5IG1vcmUgZGlmZmljdWx0IHByb2JsZW0uIFRoZSBpZGVhIGhlcmUgaXMgdG8gbWFwIGEgQy9DKysgZ2xvYmFsIHZhcmlhYmxlIGludG8gYSB2YXJpYWJsZSBpbiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlICh3ZSBhcmUgImxpbmtpbmciIGEgdmFyaWFibGUgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSB0byBhIEMgdmFyaWFibGUpLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZTo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5kb3VibGUgTXlfdmFyaWFibGUgPSAzLjU7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQgZnJvbSBhIHNjcmlwdCBhcyBmb2xsb3dzIChzaG93biBmb3IgUGVybCk6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JGEgPSAkTXlfdmFyaWFibGUgKiAyLjM7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVVuZm9ydHVuYXRlbHksIHRoZSBwcm9jZXNzIG9mIGxpbmtpbmcgdmFyaWFibGVzIGlzIHNvbWV3aGF0IHByb2JsZW1hdGljIGFuZCBub3Qgc3VwcG9ydGVkIGVxdWFsbHkgaW4gYWxsIHNjcmlwdGluZyBsYW5ndWFnZXMuIFRoZXJlIGFyZSB0d28gcHJpbWFyeSBtZXRob2RzIGZvciBhcHByb2FjaGluZyB0aGlzIHByb2JsZW06PHA+Ci08cD4KLTx1bD4KLTxsaT5EaXJlY3QgYWNjZXNzLiBUY2wgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGRpcmVjdGx5IGFjY2Vzc2luZyBDIDx0dD5pbnQ8L3R0PiwgPHR0PmRvdWJsZTwvdHQ+LCBhbmQgPHR0PmNoYXI8L3R0PiAqIGRhdGF0eXBlcyBhcyBUY2wgdmFyaWFibGVzLiBXaGVuZXZlciB0aGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgaW4gYSBUY2wgc2NyaXB0LCB0aGUgaW50ZXJwcmV0ZXIgd2lsbCBkaXJlY3RseSBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgQyB2YXJpYWJsZS4gSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yaywgb25lIG11c3QgZmlyc3QgInJlZ2lzdGVyIiB0aGUgQyB2YXJpYWJsZXMgd2l0aCB0aGUgVGNsIGludGVycHJldGVyLiBXaGlsZSB0aGlzIGFwcHJvYWNoIGlzIGVhc3kgdG8gc3VwcG9ydCBpdCBpcyBhbHNvIHNvbWV3aGF0IHByb2JsZW1hdGljLiBOb3QgYWxsIEMgZGF0YXR5cGVzIGFyZSBzdXBwb3J0ZWQsIGFuZCBoYXZpbmcgVGNsIGRpcmVjdGx5IG1hbmlwdWxhdGUgeW91ciB2YXJpYWJsZXMgaW4gaXRzIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBjb3VsZCBiZSBwb3RlbnRpYWxseSBkYW5nZXJvdXMuIAotPGxpPkFjY2VzcyB0aHJvdWdoIGZ1bmN0aW9uIGNhbGxzLiBMYW5ndWFnZXMgc3VjaCBhcyBQZXJsIGFuZCBQeXRob24gY2FuIGFjY2VzcyBnbG9iYWwgdmFyaWFibGVzIHVzaW5nIGEgZnVuY3Rpb24gY2FsbCBtZWNoYW5pc20uIFJhdGhlciB0aGFuIGFsbG93aW5nIGRpcmVjdCBhY2Nlc3MsIHRoZSBpZGVhIGlzIHRvIHByb3ZpZGUgYSBwYWlyIG9mIHNldC9nZXQgZnVuY3Rpb25zIHRoYXQgc2V0IG9yIGdldCB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHZhcmlhYmxlLiBJbiBtYW55IGNhc2VzLCB0aGlzIG1lY2hhbmlzbSBtYXkgYmUgY29tcGxldGVseSBoaWRkZW4uIEZvciBleGFtcGxlLCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgYSBtYWdpY2FsIFBlcmwgdmFyaWFibGUgdGhhdCBsb29rcyBhbmQgZmVlbHMganVzdCBsaWtlIGEgbm9ybWFsIFBlcmwgdmFyaWFibGUsIGJ1dCBpcyByZWFsbHkgbWFwcGVkIGludG8gYSBDIHZhcmlhYmxlIHZpYSBhIHBhaXIgb2Ygc2V0L2dldCBmdW5jdGlvbnMuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHN1cHBvcnQgYWxtb3N0IGFsbCBDIGRhdGF0eXBlcy4gVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IGl0IGludHJvZHVjZXMgYWxvdCBvZiBjb21wbGV4aXR5IHRvIHRoZSB3cmFwcGVyIGNvZGUgYXMgaXQgaXMgbm93IG5lY2Vzc2FyeSB0byB3cml0ZSBhIHBhaXIgb2YgQyBmdW5jdGlvbnMgZm9yIGV2ZXJ5IHNpbmdsZSBnbG9iYWwgdmFyaWFibGUuCi08L3VsPgotPHA+Ci1TV0lHIHN1cHBvcnRzIGJvdGggc3R5bGVzIG9mIHZhcmlhYmxlIGxpbmtpbmcgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBtb3JlIGNvbW1vbi4gSW4gc29tZSBjYXNlcywgYSBoeWJyaWQgYXBwcm9hY2ggaXMgdGFrZW4gKGZvciBleGFtcGxlLCB0aGUgVGNsIG1vZHVsZSB3aWxsIGNyZWF0ZSBhIHBhaXIgb2Ygc2V0L2dldCBmdW5jdGlvbnMgaWYgaXQgZW5jb3VudGVycyBhIGRhdGF0eXBlIHRoYXQgVGNsIGNhbid0IHN1cHBvcnQpLiBGb3J0dW5hdGVseSwgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgcmVsYXRpdmVseSByYXJlIHdoZW4gd29ya2luZyB3aXRoIG1vZHVsYXIgY29kZS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgzPiBDb25zdGFudHM8L2gzPgotQ29uc3RhbnRzIGNhbiBlYXNpbHkgYmUgY3JlYXRlZCBieSBzaW1wbHkgY3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4gVW5mb3J0dW5hdGVseSwgdGhpcyBjYW4gaGF2ZSB0aGUgdW5kZXNpcmFibGUgc2lkZS1lZmZlY3Qgb2YgbWFraW5nIHRoZSBjb25zdGFudCBub24tY29uc3RhbnQuIEFzIGEgcmVzdWx0LCBhIHNvbWV3aGF0IGJldHRlciAoYWx0aG91Z2ggcGVyaGFwcyBpbmVmZmljaWVudCkgbWV0aG9kIG9mIGNyZWF0aW5nIGNvbnN0YW50cyBpcyB0byBpbnN0YWxsIHRoZW0gYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gU1dJRyB0ZW5kcyB0byBwcmVmZXIgdGhpcyBhcHByb2FjaC48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMz4gU3RydWN0dXJlcyBhbmQgY2xhc3NlczwvaDM+Ci1Nb3N0IHNjcmlwdGluZyBsYW5ndWFnZXMgaGF2ZSB0cm91YmxlIGRpcmVjdGx5IGRlYWxpbmcgd2l0aCBDIHN0cnVjdHVyZXMgYW5kIEMrKyBjbGFzc2VzLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHVzZSBvZiBzdHJ1Y3R1cmVzIGlzIGluaGVyZW50bHkgQyBkZXBlbmRlbnQgYW5kIGl0IGRvZXNuJ3QgYWx3YXlzIG1hcCB3ZWxsIGludG8gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZW52aXJvbm1lbnQuIE1hbnkgb2YgdGhlc2UgcHJvYmxlbXMgYXJlIHNpbXBseSBkdWUgdG8gZGF0YSByZXByZXNlbnRhdGlvbiBpc3N1ZXMgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSB3YXkgQyBhbmQgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbWlnaHQgcmVwcmVzZW50IGludGVnZXJzLCBmbG9hdHMsIHN0cmluZ3MsIGFuZCBzbyBvbi4gT3RoZXIgdGltZXMsIHRoZSBwcm9ibGVtIGlzIGRlZXBlciB0aGFuIHRoYXQtLWZvciBleGFtcGxlLCB3aGF0IGRvZXMgaXQgbWVhbiAoaWYgYW55dGhpbmcpIHRvIHRyeSBhbmQgdXNlIEMrKyBpbmhlcml0YW5jZSBmcm9tIFBlcmw/PHA+Ci08cD4KLURlYWxpbmcgd2l0aCBvYmplY3RzIGlzIGEgdG91Z2ggcHJvYmxlbSB0aGF0IG1hbnkgcGVvcGxlIGFyZSBsb29raW5nIGF0LiBQYWNrYWdlcyBzdWNoIGFzIENPUkJBIGFuZCBJTFUgYXJlIHByaW1hcmlseSBjb25jZXJuZWQgd2l0aCB0aGUgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0cyBpbiBhIHBvcnRhYmxlIG1hbm5lci4gVGhpcyBhbGxvd3Mgb2JqZWN0cyB0byBiZSB1c2VkIGluIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIHVzZWQgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzIGFuZCBzbyBvbi4gU1dJRyBpcyBub3QgY29uY2VybmVkIHdpdGggdGhlIHJlcHJlc2VudGF0aW9uIHByb2JsZW0sIGJ1dCByYXRoZXIgdGhlIHByb2JsZW0gb2YgYWNjZXNzaW5nIGFuZCB1c2luZyBDL0MrKyBvYmplY3RzIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGluIGZhY3QgU1dJRyBoYXMgZXZlbiBiZWVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBDT1JCQS1iYXNlZCBzeXN0ZW1zKS48cD4KLTxwPgotVG8gcHJvdmlkZSBhY2Nlc3MsIHRoZSBzaW1wbGlzdCBhcHByb2FjaCBpcyB0byB0cmFuc2Zvcm0gYSBzdHJ1Y3R1cmUgaW50byBhIGNvbGxlY3Rpb24gb2YgYWNjZXNzb3IgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFZlY3RvciB7Ci0JVmVjdG9yKCk7Ci0JflZlY3RvcigpOwotCWRvdWJsZSB4LHksejsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWNhbiBiZSB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VmVjdG9yICpuZXdfVmVjdG9yKCk7Ci12b2lkIGRlbGV0ZV9WZWN0b3IoVmVjdG9yICp2KTsKLWRvdWJsZSBWZWN0b3JfeF9nZXQoVmVjdG9yICp2KTsKLWRvdWJsZSBWZWN0b3JfeV9nZXQoVmVjdG9yICp2KTsKLWRvdWJsZSBWZWN0b3JfeV9nZXQoVmVjdG9yICp2KTsKLXZvaWQgVmVjdG9yX3hfc2V0KFZlY3RvciAqdiwgZG91YmxlIHgpOwotdm9pZCBWZWN0b3JfeV9zZXQoVmVjdG9yICp2LCBkb3VibGUgeSk7Ci12b2lkIFZlY3Rvcl96X3NldChWZWN0b3IgKnYsIGRvdWJsZSB6KTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBhY2Nlc3NlZCBpbiBUY2wsIHRoZSBmdW5jdGlvbnMgY291bGQgYmUgdXNlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCB2IFtuZXdfVmVjdG9yXQotJSBWZWN0b3JfeF9zZXQgJHYgMy41Ci0lIFZlY3Rvcl95X2dldCAkdgotJSBkZWxldGVfVmVjdG9yICR2Ci0lIC4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgYWNjZXNzb3IgZnVuY3Rpb25zIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGFjY2Vzc2luZyBhIHJlYWwgQy9DKysgb2JqZWN0LiBTaW5jZSBhbGwgYWNjZXNzIG9jY3VycyB0aG91Z2ggdGhlc2UgZnVuY3Rpb24gY2FsbHMsIFRjbCBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBvZiBhIDx0dD5WZWN0b3I8L3R0Pi4gVGhpcyBzaW1wbGlmaWVzIG1hdHRlcnMgY29uc2lkZXJhYmx5IGFuZCBzdGVwcyBhcm91bmQgbWFueSBvZiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIG9iamVjdHMtLWluIGZhY3QsIGl0IGxldHMgdGhlIEMvQysrIGNvbXBpbGVyIGRvIG1vc3Qgb2YgdGhlIHdvcmsuPHA+Ci08YSBuYW1lPSJuMTEiPjwvYT48aDM+IFNoYWRvdyBjbGFzc2VzPC9oMz4KLUFzIGl0IHR1cm5zIG91dCwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBsb3ctbGV2ZWwgYWNjZXNzb3IgZnVuY3Rpb25zIGFib3ZlIHRvIGNyZWF0ZSBzb21ldGhpbmcga25vd24gYXMgYSAic2hhZG93IiBjbGFzcy4gSW4gYSBudXRzaGVsbCwgYSAic2hhZG93IGNsYXNzIiBpcyBhIGZ1bm55IGtpbmQgb2Ygb2JqZWN0IHRoYXQgZ2V0cyBjcmVhdGVkIGluIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRvIGFjY2VzcyBhIEMvQysrIGNsYXNzIChvciBzdHJ1Y3QpIGluIGEgd2F5IHRoYXQgbG9va3MgbGlrZSB0aGUgb3JpZ2luYWwgc3RydWN0dXJlICh0aGF0IGlzLCBpdCAic2hhZG93cyIgdGhlIHJlYWwgQysrIGNsYXNzKS4gT2YgY291cnNlLCBpbiByZWFsaXR5LCBpdCdzIGp1c3QgYSBzbGljayB3YXkgb2YgYWNjZXNzaW5nIG9iamVjdHMgdGhhdCBpcyBtb3JlIG5hdHVyYWwgdG8gbW9zdCBwcm9ncmFtbWVycy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgQyBkZWZpbml0aW9uIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1jbGFzcyBWZWN0b3IgewotcHVibGljOgotCVZlY3RvcigpOwotCX5WZWN0b3IoKTsKLQlkb3VibGUgeCx5LHo7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BIHNoYWRvdyBjbGFzc2luZyBtZWNoYW5pc20gd291bGQgYWxsb3cgeW91IHRvIGFjY2VzcyB0aGUgc3RydWN0dXJlIGluIGEgbmF0dXJhbCBtYW5uZXIuIEZvciBleGFtcGxlLCBpbiBQeXRob24sIHlvdSBtaWdodCBkbyB0aGUgZm9sbG93aW5nLDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyB2ID0gVmVjdG9yKCkKLSZndDsmZ3Q7Jmd0OyB2LnggPSAzCi0mZ3Q7Jmd0OyZndDsgdi55ID0gNAotJmd0OyZndDsmZ3Q7IHYueiA9IC0xMwotJmd0OyZndDsmZ3Q7IC4uLgotJmd0OyZndDsmZ3Q7IGRlbCB2Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXdoaWxlIGluIFBlcmw1LCBpdCBtaWdodCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJHYgPSBuZXcgVmVjdG9yOwotJHYtJmd0O3t4fSA9IDM7Ci0kdi0mZ3Q7e3l9ID0gNDsKLSR2LSZndDt7en0gPSAtMTM7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWFuZCBpbiBUY2wgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLVZlY3RvciB2Ci12IGNvbmZpZ3VyZSAteCAzIC15IDQgLXogMTMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdHdvIG9iamVjdHMgYXJlIGF0IHJlYWxseSB3b3JrLS1vbmUgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSwgYW5kIGFuIHVuZGVybHlpbmcgQy9DKysgb2JqZWN0LiBPcGVyYXRpb25zIGFmZmVjdCBib3RoIG9iamVjdHMgZXF1YWxseSBhbmQgZm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIGl0IGFwcGVhcnMgYXMgaWYgeW91IGFyZSBzaW1wbHkgbWFuaXB1bGF0aW5nIGEgQy9DKysgb2JqZWN0LiBIb3dldmVyLCB0aGUgaW50cm9kdWN0aW9uIG9mIGFkZGl0aW9uYWwgIm9iamVjdHMiIGNhbiBhbHNvIHByb2R1Y2UgZXhjZXNzaXZlIG92ZXJoZWFkIGlmIHdvcmtpbmcgd2l0aCBodWdlIG51bWJlcnMgb2Ygb2JqZWN0cyBpbiB0aGlzIG1hbm5lci4gRGVzcGl0ZSB0aGlzLCBzaGFkb3cgY2xhc3NlcyB0dXJuIG91dCB0byBiZSBleHRyZW1lbHkgdXNlZnVsLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGlzIGNvdmVyZWQgbGF0ZXIuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gQnVpbGRpbmcgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2gyPgotVGhlIGZpbmFsIHN0ZXAgaW4gdXNpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2l0aCB5b3VyIEMvQysrIGFwcGxpY2F0aW9uIGlzIGFkZGluZyB5b3VyIGV4dGVuc2lvbnMgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpdHNlbGYuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxtb3N0IGFsd2F5cyBzZWVtcyB0byBiZSB0aGUgbW9zdCBkaWZmaWN1bHQgcGFydC4gVGhlcmUgYXJlIHR3byBmdW5kYW1lbnRhbCBhcHByb2FjaGVzIGZvciBkb2luZyB0aGlzLiBGaXJzdCwgeW91IGNhbiBidWlsZCBhbiBlbnRpcmVseSBuZXcgdmVyc2lvbiBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVycHJldGVyIHdpdGggeW91ciBleHRlbnNpb25zIGJ1aWx0IGludG8gaXQuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSBhbmQgZHluYW1pY2FsbHkgbG9hZCBpdCBpbnRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYXMgbmVlZGVkLiBCb3RoIGFwcHJvYWNocyBhcmUgZGVzY3JpYmVkIGJlbG93IDo8cD4KLTxhIG5hbWU9Im4xMiI+PC9hPjxoMz4gU3RhdGljIGxpbmtpbmc8L2gzPgotV2l0aCBzdGF0aWMgbGlua2luZyB5b3UgcmVidWlsZCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVycHJldGVyIHdpdGggZXh0ZW5zaW9ucy4gVGhlIHByb2Nlc3MgdXN1YWxseSBpbnZvbHZlcyBjb21waWxpbmcgYSBzaG9ydCBtYWluIHByb2dyYW0gdGhhdCBhZGRzIHlvdXIgY3VzdG9taXplZCBjb21tYW5kcyB0byB0aGUgbGFuZ3VhZ2UgYW5kIHN0YXJ0cyB0aGUgaW50ZXJwcmV0ZXIuIFlvdSB0aGVuIGxpbmsgeW91ciBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5IHRvIHByb2R1Y2UgYSBuZXcgZXhlY3V0YWJsZS4gV2hlbiB1c2luZyBzdGF0aWMgbGlua2luZywgU1dJRyB3aWxsIHByb3ZpZGUgYSA8dHQ+bWFpbigpPC90dD4gcHJvZ3JhbSBmb3IgeW91IHNvIHlvdSB1c3VhbGx5IGp1c3QgaGF2ZSB0byBjb21waWxlIGFzIGZvbGxvd3MgKHNob3duIGZvciBUY2wpIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtdGNsIC1sdGNsc2guaSBleGFtcGxlLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFRjbC4KLXVuaXggJmd0OyBnY2MgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlIFwKLQktTC91c3IvbG9jYWwvbGliIC1sdGNsIC1sbSAtbyBteV90Y2xzaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dHQ+bXlfdGNsc2g8L3R0PiBpcyBhIG5ldyBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIFRjbCBpbnRlcHJldGVyLiA8dHQ+bXlfdGNsc2g8L3R0PiB3aWxsIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGNsc2ggZXhjZXB0IHdpdGggeW91ciBuZXcgY29tbWFuZHMgYWRkZWQgdG8gaXQuIFdoZW4gaW52b2tpbmcgU1dJRywgdGhlIDx0dD4tbHRjbHNoLmk8L3R0PiBvcHRpb24gaW5jbHVkZXMgc3VwcG9ydCBjb2RlIG5lZWRlZCB0byByZWJ1aWxkIHRoZSA8dHQ+dGNsc2g8L3R0PiBhcHBsaWNhdGlvbi4gPHA+Ci08cD4KLVZpcnR1YWxseSBhbGwgbWFjaGluZXMgc3VwcG9ydCBzdGF0aWMgbGlua2luZyBhbmQgaW4gc29tZSBjYXNlcywgaXQgbWF5IGJlIHRoZSBvbmx5IHdheSB0byBidWlsZCBhbiBleHRlbnNpb24uIFRoZSBkb3duc2lkZSB0byBzdGF0aWMgbGlua2luZyBpcyB0aGF0IHlvdSBjYW4gZW5kIHVwIHdpdGggYSBsYXJnZSBleGVjdXRhYmxlLiBJbiBhIHZlcnkgbGFyZ2Ugc3lzdGVtLCB0aGUgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBtYXkgYmUgcHJvaGliaXRpdmVseSBsYXJnZS48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBTaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljIGxvYWRpbmc8L2gyPgotQW4gYWx0ZXJuYXRpdmUgdG8gc3RhdGljIGxpbmtpbmcgaXMgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeS4gV2l0aCB0aGlzIGFwcHJvYWNoLCB5b3UgYnVpbGQgYSBzaGFyZWQgb2JqZWN0IGZpbGUgY29udGFpbmluZyBvbmx5IHRoZSBjb2RlIHJlbGF0ZWQgdG8geW91ciBtb2R1bGUgKG9uIFdpbmRvd3MsIHRoaXMgaXMgdGhlIHNhbWUgYXMgYnVpbGRpbmcgYSBETEwpLiBVbmZvcnR1bmF0ZWx5IHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIHRoZXNlIG1vZHVsZXMgdmFyaWVzIG9uIGV2ZXJ5IHNpbmdsZSBtYWNoaW5lLCBidXQgdGhlIHByb2NlZHVyZSBmb3IgYSBmZXcgY29tbW9uIG1hY2hpbmVzIGlzIHNob3cgYmVsb3cgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgQnVpbGQgYSBzaGFyZWQgbGlicmFyeSBmb3IgU29sYXJpcwotZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZQotbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28KLQotIyBCdWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGZvciBJcml4Ci1nY2MgLWMgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi1sZCAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvCi0KLSMgQnVpbGQgYSBzaGFyZWQgbGlicmFyeSBmb3IgTGludXgKLWdjYyAtZnBpYyAtYyBleGFtcGxlLmMgZXhhbXBsZV93cmFwLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUKLWdjYyAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHVzZSB5b3VyIHNoYXJlZCBsaWJyYXJ5LCB5b3Ugc2ltcGx5IHVzZSB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kIGluIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGxvYWQsIGltcG9ydCwgdXNlLCBldGMuLi4pLiBUaGlzIHdpbGwgaW1wb3J0IHlvdXIgbW9kdWxlIGFuZCBhbGxvdyB5b3UgdG8gc3RhcnQgdXNpbmcgaXQuIDxwPgotPHA+Ci1XaGVuIHdvcmtpbmcgd2l0aCBDKysgY29kZXMsIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMgaXMgbW9yZSBkaWZmaWN1bHQtLXByaW1hcmlseSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBDKysgbW9kdWxlcyBtYXkgbmVlZCBhZGRpdGlvbmFsIGNvZGUgaW4gb3JkZXIgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuIE9uIG1vc3QgbWFjaGluZXMsIHlvdSBjYW4gYnVpbGQgYSBzaGFyZWQgQysrIG1vZHVsZSBieSBmb2xsb3dpbmcgdGhlIGFib3ZlIHByb2NlZHVyZXMsIGJ1dCBjaGFuZ2luZyB0aGUgbGluayBsaW5lIHRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmMrKyAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBhZHZhbnRhZ2VzIHRvIGR5bmFtaWMgbG9hZGluZyBpcyB0aGF0IHlvdSBjYW4gdXNlIG1vZHVsZXMgYXMgdGhleSBhcmUgbmVlZGVkIGFuZCB0aGV5IGNhbiBiZSBsb2FkZWQgb24gdGhlIGZseS4gVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IGR5bmFtaWMgbG9hZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcyAoYWx0aG91Z2ggc3VwcG9ydCBpcyBpbXByb3ZpbmcpLiBUaGUgY29tcGlsYXRpb24gcHJvY2VzcyBhbHNvIHRlbmRzIHRvIGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB3aGF0IG1pZ2h0IGJlIHVzZWQgZm9yIGEgdHlwaWNhbCBDL0MrKyBwcm9ncmFtLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgzPiBMaW5raW5nIHdpdGggc2hhcmVkIGxpYnJhcmllczwvaDM+Ci1XaGVuIGJ1aWxkaW5nIGV4dGVuc2lvbnMgYXMgc2hhcmVkIGxpYnJhcmllcywgaXQgaXMgbm90IHVuY29tbW9uIGZvciB5b3VyIGV4dGVuc2lvbiB0byByZWx5IHVwb24gb3RoZXIgc2hhcmVkIGxpYnJhcmllcyBvbiB5b3VyIG1hY2hpbmUuIEluIG9yZGVyIGZvciB0aGUgZXh0ZW5zaW9uIHRvIHdvcmssIGl0IG5lZWRzIHRvIGJlIGFibGUgdG8gZmluZCBhbGwgb2YgdGhlc2UgbGlicmFyaWVzIGF0IHJ1bi10aW1lLiBPdGhlcndpc2UsIHlvdSBtYXkgZ2V0IGFuIGVycm9yIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyZndDsmZ3Q7IGltcG9ydCBncmFwaAotVHJhY2ViYWNrIChpbm5lcm1vc3QgbGFzdCk6Ci0gIEZpbGUgIiZsdDtzdGRpbiZndDsiLCBsaW5lIDEsIGluID8KLSAgRmlsZSAiL2hvbWUvc2NpL2RhdGExL2JlYXpsZXkvZ3JhcGgvZ3JhcGgucHkiLCBsaW5lIDIsIGluID8KLSAgICBpbXBvcnQgZ3JhcGhjCi1JbXBvcnRFcnJvcjogIDExMDE6L2hvbWUvc2NpL2RhdGExL2JlYXpsZXkvYmluL3B5dGhvbjogcmxkOiBGYXRhbCBFcnJvcjogY2Fubm90IAotc3VjY2Vzc2Z1bGx5IG1hcCBzb25hbWUgJ2xpYmdyYXBoLnNvJyB1bmRlciBhbnkgb2YgdGhlIGZpbGVuYW1lcyAvdXNyL2xpYi9saWJncmFwaC5zbzovCi1saWIvbGliZ3JhcGguc286L2xpYi9jbXBscnMvY2MvbGliZ3JhcGguc286L3Vzci9saWIvY21wbHJzL2NjL2xpYmdyYXBoLnNvOgotJmd0OyZndDsmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoYXQgdGhpcyBlcnJvciBtZWFucyBpcyB0aGF0IHRoZSBleHRlbnNpb24gbW9kdWxlIGNyZWF0ZWQgYnkgU1dJRyBkZXBlbmRzIHVwb24gYSBzaGFyZWQgbGlicmFyeSBjYWxsZWQgIjx0dD5saWJncmFwaC5zbzwvdHQ+IiB0aGF0IHRoZSBzeXN0ZW0gd2FzIHVuYWJsZSB0byBsb2NhdGUuIFRvIGZpeCB0aGlzIHByb2JsZW0sIHRoZXJlIGFyZSBhIGZldyBhcHByb2FjaGVzIHlvdSBjYW4gdGFrZS48cD4KLTxwPgotPHVsPgotPGxpPlNldCB0aGUgVU5JWCBlbnZpcm9ubWVudCB2YXJpYWJsZSA8dHQ+TERfTElCUkFSWV9QQVRIPC90dD4gdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2NhdGVkIGJlZm9yZSBydW5uaW5nIFB5dGhvbi4gCi08bGk+TGluayB5b3VyIGV4dGVuc2lvbiBhbmQgZXhwbGljaXRseSB0ZWxsIHRoZSBsaW5rZXIgd2hlcmUgdGhlIHJlcXVpcmVkIGxpYnJhcmllcyBhcmUgbG9jYXRlZC4gT2Z0ZW4gdGltZXMsIHRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIHNwZWNpYWwgbGlua2VyIGZsYWcgc3VjaCBhcyA8dHQ+LVI8L3R0PiwgPHR0Pi1ycGF0aDwvdHQ+LCBldGMuLi4gVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgaW4gYSBzdGFuZGFyZCBtYW5uZXIgc28gcmVhZCB0aGUgbWFuIHBhZ2VzIGZvciB5b3VyIGxpbmtlciB0byBmaW5kIG91dCBtb3JlIGFib3V0IGhvdyB0byBzZXQgdGhlIHNlYXJjaCBwYXRoIGZvciBzaGFyZWQgbGlicmFyaWVzLgotPGxpPlB1dCBzaGFyZWQgbGlicmFyaWVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZXhlY3V0YWJsZS4gVGhpcyB0ZWNobmlxdWUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvciBjb3JyZWN0IG9wZXJhdGlvbiBvbiBub24tVW5peCBwbGF0Zm9ybXMuCi08L3VsPgotPHA+Ci1XaXRoIGEgbGl0dGxlIHBhdGllbmNlIGFuZCBhZnRlciBzb21lIHBsYXlpbmcgYXJvdW5kLCB5b3UgY2FuIHVzdWFsbHkgZ2V0IHRoaW5ncyB0byB3b3JrLiBBZnRlcndhcmRzLCBidWlsZGluZyBleHRlbnNpb25zIGJlY29tZXMgYWxvdCBlYXNpZXIuPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjUwIDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1RjbC5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9UY2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljMzE3My4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1RjbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA0OCArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlNXSUcgYW5kIFRjbDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotPGEgbmFtZT0ibjAiPjwvYT48aDE+MTAgU1dJRyBhbmQgVGNsPC9oMT48cD48dWw+Ci08bGk+IDxhIGhyZWY9IiNuMSI+UHJlbGltaW5hcmllczwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5CdWlsZGluZyBUY2wvVGsgRXh0ZW5zaW9ucyB1bmRlciBXaW5kb3dzIDk1L05UPC9hPgotPGxpPiA8YSBocmVmPSIjbjMiPkJhc2ljIFRjbCBJbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+VGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QWJvdXQgdGhlIGV4YW1wbGVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPkJpbmFyeSB0cmVlcyBpbiBUY2w8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+QnVpbGRpbmcgQy9DKysgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggVGs8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+QWNjZXNzaW5nIGFycmF5czwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5CdWlsZGluZyBhIHNpbXBsZSBPcGVuR0wgbW9kdWxlPC9hPgotPGxpPiA8YSBocmVmPSIjbjEwIj5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPlR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSIjbjEyIj5Db25maWd1cmF0aW9uIG1hbmFnZW1lbnQgd2l0aCBTV0lHPC9hPgotPGxpPiA8YSBocmVmPSIjbjEzIj5CdWlsZGluZyBuZXcga2luZHMgb2YgVGNsIGludGVyZmFjZXMgKGluIFRjbCk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTQiPkV4dGVuZGluZyB0aGUgVGNsIE5ldHNjYXBlIFBsdWdpbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24xNSI+VGNsOC4wIGZlYXR1cmVzPC9hPgotPC91bD4KLQotVGhpcyBjaGFwdGVyIGRpc2N1c3NlcyBTV0lHJ3Mgc3VwcG9ydCBvZiBUY2wuIFNXSUcgc3VwcG9ydHMgVGNsIHZlcnNpb25zIDcuMyBhbmQgbmV3ZXIsIGluY2x1ZGluZyBUY2wgOC4wLiBUayAzLjYgYW5kIG5ld2VyIGNhbiBhbHNvIGJlIHVzZWQuIEhvd2V2ZXIsIGZvciB0aGUgYmVzdCByZXN1bHRzIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgVGNsIDcuNS9UazQuMSBvciBsYXRlci48cD4KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBQcmVsaW1pbmFyaWVzPC9oMj4KLVlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCBUY2wvVGsgb24geW91ciBzeXN0ZW0gaWYgeW91IGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiBJZiB5b3UgYXJlIHVzaW5nIFRjbCA3LjUgb3IgbmV3ZXIsIHlvdSBzaG91bGQgYWxzbyBkZXRlcm1pbmUgaWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgZHluYW1pYyBsb2FkaW5nIGFuZCBzaGFyZWQgbGlicmFyaWVzLiBTV0lHIHdpbGwgd29yayB3aXRoIG9yIHdpdGhvdXQgdGhpcywgYnV0IHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIHZhcmllcy48cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gUnVubmluZyBTV0lHPC9oMz4KLVRvIGJ1aWxkIGEgVGNsIG1vZHVsZSwgcnVuIHN3aWcgdXNpbmcgdGhlIDx0dD4tdGNsPC90dD4gb3B0aW9uIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN3aWcgLXRjbCBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIHByb2R1Y2UgMiBmaWxlcy4gVGhlIGZpcnN0IGZpbGUsIDx0dD5leGFtcGxlX3dyYXAuYywgPC90dD5jb250YWlucyBhbGwgb2YgdGhlIEMgY29kZSBuZWVkZWQgdG8gYnVpbGQgeW91ciBUY2wgbW9kdWxlLiBUaGUgc2Vjb25kIGZpbGUgY29udGFpbnMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIGFuZCBtYXkgYmUgbmFtZWQgPHR0PmV4YW1wbGVfd3JhcC5kb2M8L3R0PiwgPHR0PmV4YW1wbGVfd3JhcC5odG1sPC90dD4sIDx0dD5leGFtcGxlX3dyYXAudGV4PC90dD4sIGV0Yy4uLiBUbyBidWlsZCBhIFRjbCBleHRlbnNpb24geW91IHdpbGwgbmVlZCB0byBjb21waWxlIHRoZSA8dHQ+ZXhhbXBsZV93cmFwLmM8L3R0PiBmaWxlIGFuZCBsaW5rIGl0IHdpdGggdGhlIHJlc3Qgb2YgeW91ciBwcm9ncmFtIChhbmQgcG9zc2libHkgVGNsIGl0c2VsZikuPHA+Ci08YSBuYW1lPSJuMTciPjwvYT48aDM+IEFkZGl0aW9uYWwgU1dJRyBvcHRpb25zPC9oMz4KLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYWxzbyBhdmFpbGFibGUgd2l0aCB0aGUgVGNsIG1vZHVsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LXRjbDggICAgICAgICBQcm9kdWNlIFRjbDguMCBuYXRpdmUgd3JhcHBlcnMgKHVzZSBpbiBwbGFjZSBvZiAtdGNsKS4KLS1tb2R1bGUgICAgICAgU2V0IHRoZSBtb2R1bGUgbmFtZS4KLS1uYW1lc3BhY2UgICAgVXNlIFtpbmNyIFRjbF0gbmFtZXNwYWNlcy4KLS1wcmVmaXggcGtnICAgU2V0IGEgcGFja2FnZSBwcmVmaXggb2YgYHBrZycuIFRoaXMgcHJlZml4IHdpbGwgYmUKLSAgICAgICAgICAgICAgYXR0YWNoZWQgdG8gZWFjaCBmdW5jdGlvbi4KLS1odGNsIHRjbC5oICAgU2V0IG5hbWUgb2YgVGNsIGhlYWRlciBmaWxlLgotLWh0ayB0ay5oICAgICBTZXQgbmFtZSBvZiBUayBoZWFkZXIgZmlsZS4KLS1wbHVnaW4gICAgICAgR2VuZXJhdGUgYWRkaXRpb25hbCBjb2RlIGZvciB0aGUgbmV0c2NhcGUgcGx1Z2luLgotLW5vb2JqZWN0ICAgICBPbWl0IG9iamVjdCBvcmllbnRlZCBleHRlbnNpb25zIChjb21wYXRpYmlsaXR5IHdpdGggU1dJRyAxLjApCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU1hbnkgb2YgdGhlc2Ugb3B0aW9ucyB3aWxsIGJlIGRlc2NyaWJlZCBsYXRlci48cD4KLTxhIG5hbWU9Im4xOCI+PC9hPjxoMz4gR2V0dGluZyB0aGUgcmlnaHQgaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXM8L2gzPgotSW4gb3JkZXIgdG8gY29tcGlsZSBUY2wvVGsgZXh0ZW5zaW9ucywgeW91IHdpbGwgbmVlZCB0byBsb2NhdGUgdGhlICI8dHQ+dGNsLmg8L3R0PiIgYW5kICI8dHQ+dGsuaDwvdHQ+IiBoZWFkZXIgZmlsZXMuIFRoZXNlIGFyZSB1c3VhbGx5IGxvY2F0ZWQgaW4gPHR0Pi91c3IvbG9jYWwvaW5jbHVkZTwvdHQ+LiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gbG9jYXRlIHRoZSBUY2wvVGsgbGlicmFyaWVzIDx0dD5saWJ0Y2wuYTwvdHQ+IGFuZCA8dHQ+bGlidGsuYTwvdHQ+LiBUaGVzZSBhcmUgdXN1YWxseSBsb2NhdGVkIGluIDx0dD4vdXNyL2xvY2FsL2xpYjwvdHQ+LjxwPgotV2hlbiBsb2NhdGluZyB0aGUgcmlnaHQgaGVhZGVyIGFuZCBsaWJyYXJpZXMgZmlsZXMsIGRvdWJsZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGZpbGVzIGFyZSB0aGUgY29ycmVjdCB2ZXJzaW9uIGFuZCBmb3JtIGEgbWF0Y2hpbmcgcGFpci4gU1dJRyB3b3JrcyB3aXRoIHRoZSBmb2xsb3dpbmcgVGNsL1RrIHJlbGVhc2VzLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlRjbCA3LjMsIFRrIDMuNgotVGNsIDcuNCwgVGsgNC4wCi1UY2wgNy41LCBUayA0LjEKLVRjbCA3LjYsIFRrIDQuMgotVGNsIDguMGEyLCBUayA4LjBhMgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1EbyBub3QgbWl4IHZlcnNpb25zLiBBbHRob3VnaCB0aGUgY29kZSBtaWdodCBjb21waWxlIGlmIHlvdSBkbywgaXQgd2lsbCB1c3VhbGx5IGNvcmUgZHVtcCBteXN0ZXJpb3VzbHkuIEJ5IGRlZmF1bHQsIFNXSUcgbG9va3MgZm9yIHRoZSBoZWFkZXIgZmlsZXMgIjx0dD50Y2wuaDwvdHQ+IiBhbmQgIjx0dD50ay5oPC90dD4iLCBidXQgeW91ciBpbnN0YWxsZWQgdmVyc2lvbiBvZiBUY2wvVGsgbWF5IHVzZSBzbGlnaHRseSBkaWZmZXJlbnQgbmFtZXMgc3VjaCBhcyAiPHR0PnRjbDcuNS5oPC90dD4iIGFuZCAiPHR0PnRrNC4xLmg8L3R0PiIuIElmIHlvdSBuZWVkIHRvIHVzZSBkaWZmZXJlbnQgaGVhZGVyIGZpbGVzLCB5b3UgY2FuIHVzZSB0aGUgPHR0Pi1odGNsPC90dD4gYW5kIDx0dD4taHRrPC90dD4gb3B0aW9ucyBhcyBpbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtdGNsIC1odGNsIHRjbDcuNS5oIC1odGsgdGs0LjEuaCBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSWYgeW91IGFyZSBpbnN0YWxsaW5nIFRjbC9UayB5b3Vyc2VsZiwgaXQgaXMgb2Z0ZW4gZWFzaWVyIHRvIHNldCB1cCBhIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gPHR0PnRjbC5oPC90dD4gYW5kIHRoZSBoZWFkZXIgZmlsZXMgZm9yIHRoZSBsYXRlc3QgaW5zdGFsbGVkIHZlcnNpb24uICBZb3UgbWlnaHQgYWxzbyBiZSBhYmxlIHRvIG1ha2Ugc3ltYm9saWMgbGlua3MgdG8gdGhlIGNvcnJlY3QgZmlsZXMgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeS48cD4KLTxhIG5hbWU9Im4xOSI+PC9hPjxoMz4gQ29tcGlsaW5nIGEgZHluYW1pYyBtb2R1bGUgKFVuaXgpPC9oMz4KLVRvIGNvbXBpbGUgYSBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gY29tcGlsZSB5b3VyIFNXSUcgZXh0ZW5zaW9uIGludG8gYSBzaGFyZWQgbGlicmFyeS4gVGhpcyB1c3VhbGx5IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgKHNob3duIGZvciBMaW51eCkuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLXRjbCBleGFtcGxlLmkKLXVuaXggJmd0OyBnY2MgLWZwaWMgZXhhbXBsZV93cmFwLmMgZXhhbXBsZS5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi11bml4ICZndDsgZ2NjIC1zaGFyZWQgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28gCQkJCQkJCQkJIyBMaW51eAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1VbmZvcnR1bmF0ZWx5LCB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyBvZiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzIHZhcmllcyBvbiBldmVyeSBzaW5nbGUgbWFjaGluZS4gU1dJRyB3aWxsIHRyeSB0byBndWVzcyB3aGVuIHlvdSBydW4gY29uZmlndXJlLCBidXQgaXQgaXNuJ3QgYWx3YXlzIHN1Y2Nlc3NmdWwuIEl0J3MgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIHJlYWQgdGhlIG1hbiBwYWdlcyBvbiB0aGUgY29tcGlsZXIvbGlua2VyIHRvIGZpbmQgb3V0IG1vcmUgaW5mb3JtYXRpb24uPHA+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IFVzaW5nIGEgZHluYW1pYyBtb2R1bGU8L2gzPgotVG8gdXNlIGEgZHluYW1pYyBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gbG9hZCBpdCB1c2luZyB0aGUgVGNsIGxvYWQgY29tbWFuZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vZXhhbXBsZS5zbyBleGFtcGxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hpbGUgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlICh0aGUgc2FtZSBhcyB3aGF0IHlvdSBzcGVjaWZpZWQgd2l0aCB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUpLiBBcyBhbHRlcm5hdGl2ZSwgeW91IGNhbiB0dXJuIHlvdXIgbW9kdWxlIGludG8gYSBUY2wgcGFja2FnZS4gICBTZWUgdGhlIHNlY3Rpb24gb24gY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IGF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyIGZvciBkZXRhaWxzLjxwPgotPGEgbmFtZT0ibjIxIj48L2E+PGgzPiBTdGF0aWMgbGlua2luZzwvaDM+Ci1JZiB5b3VyIG1hY2hpbmUgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGxvYWRpbmcgb3IgeW91J3ZlIHRyaWVkIHRvIHVzZSBpdCB3aXRob3V0IHN1Y2Nlc3MsIHlvdSBjYW4gYnVpbGQgbmV3IHZlcnNpb25zIG9mIDx0dD50Y2xzaDwvdHQ+ICh0aGUgVGNsIHNoZWxsKSBvciA8dHQ+d2lzaDwvdHQ+IChUY2wvVGsgc2hlbGwpIHdpdGggeW91ciBleHRlbnNpb25zIGFkZGVkLiBUbyBkbyB0aGlzLCB1c2UgU1dJRydzIDx0dD4laW5jbHVkZTwvdHQ+IGRpcmVjdGl2ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIG15bW9kdWxlCi0uLi4gZGVjbGFyYXRpb25zIC4uLgotCi0laW5jbHVkZSB0Y2xzaC5pICAgICAvLyBTdXBwb3J0IGNvZGUgZm9yIHJlYnVpbGRpbmcgdGNsc2gKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVG8gcmVidWlsZCB0Y2xzaCwgeW91IHdpbGwgbmVlZCB0byBjb21waWxlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgZXhhbXBsZS5pCi11bml4ICZndDsgZ2NjIGV4YW1wbGVfd3JhcC5jIGV4YW1wbGUuYyAtSS91c3IvbG9jYWwvaW5jbHVkZSAtTC91c3IvbG9jYWwvbGliIC1sdGNsIC1sZGwgXAotCS1sbSAtbyBteV90Y2xzaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBTV0lHJ3MgPHR0Pi1sPC90dD4gb3B0aW9uIHRvIGFkZCB0aGUgdGNsc2guaSBsaWJyYXJ5IGZpbGUgd2l0aG91dCBtb2RpZnlpbmcgdGhlIGludGVyZmFjZSBmaWxlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgLWx0Y2xzaC5pIGV4YW1wbGUuaQotdW5peCAmZ3Q7IGdjYyBleGFtcGxlX3dyYXAuYyBleGFtcGxlLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbHRjbCAtbGRsIFwKLQktbG0gLW8gbXlfdGNsc2gKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4tbGRsPC90dD4gb3B0aW9uIHdpbGwgYmUgcmVxdWlyZWQgaWYgeW91ciBUY2wvVGsgc3VwcG9ydHMgZHluYW1pYyBsb2FkaW5nLiBPbiBzb21lIG1hY2hpbmVzIChtb3N0IG5vdGFibHkgU29sYXJpcyksaXQgd2lsbCBhbHNvIGJlIG5lY2Vzc2FyeSB0byBhZGQgPHR0Pi1sc29ja2V0IC1sbnNsPC90dD4gdG8gdGhlIGNvbXBpbGUgbGluZS4gVGhpcyB3aWxsIHByb2R1Y2UgYSBuZXcgdmVyc2lvbiBvZiA8dHQ+dGNsc2g8L3R0PiB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgb2xkIG9uZSwgYnV0IHdpdGggeW91ciBleHRlbnNpb25zIGFkZGVkLjxwPgotPHA+Ci1JZiB5b3UgYXJlIHVzaW5nIFRrLCB5b3Ugd2lsbCB3YW50IHRvIHJlYnVpbGQgdGhlIDx0dD53aXNoPC90dD4gZXhlY3V0YWJsZSBpbnN0ZWFkLiBUaGlzIGNhbiBiZSBkb25lIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0KLSVpbmNsdWRlIHdpc2guaSAgICAgICAvLyBTdXBwb3J0IGNvZGUgZm9yIHJlYnVpbGRpbmcgd2lzaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgY29tcGlsYXRpb24gcHJvY2VzcyBpcyBzaW1pbGFyIGFzIGJlZm9yZSwgYnV0IG5vdyBsb29rcyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgZXhhbXBsZS5pCi11bml4ICZndDsgZ2NjIGV4YW1wbGVfd3JhcC5jIGV4YW1wbGUuYyAtSS91c3IvbG9jYWwvaW5jbHVkZSAtTC91c3IvbG9jYWwvbGliIC1sdGsgLWx0Y2wgXAotCS1sWDExIC1sZGwgLWxtIC1vIG15X3dpc2gKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBjYXNlIHlvdSB3aWxsIGVuZCB1cCB3aXRoIGEgbmV3IHZlcnNpb24gb2YgdGhlIDx0dD53aXNoPC90dD4gZXhlY3V0YWJsZSB3aXRoIHlvdXIgZXh0ZW5zaW9ucyBhZGRlZC4gTWFrZSBzdXJlIHlvdSBpbmNsdWRlIDx0dD4tbHRrPC90dD4sIDx0dD4tbHRjbDwvdHQ+LCBhbmQgPHR0Pi1sWDExPC90dD4gaW4gdGhlIG9yZGVyIHNob3duLjxwPgotPGEgbmFtZT0ibjIyIj48L2E+PGgzPiBDb21waWxhdGlvbiBwcm9ibGVtczwvaDM+Ci1UY2wgaXMgb25lIG9mIHRoZSBlYXNpZXN0IGxhbmd1YWdlcyB0byBjb21waWxlIGV4dGVuc2lvbnMgZm9yLiBUaGUgVGNsIGhlYWRlciBmaWxlcyBzaG91bGQgd29yayB3aXRob3V0IHByb2JsZW1zIHVuZGVyIEMgYW5kIEMrKy4gUGVyaGFwcyB0aGUgb25seSB0cmlja3kgdGFzayBpcyB0aGF0IG9mIGNvbXBpbGluZyBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGVzIGZvciBDKysuIElmIHlvdXIgQysrIGNvZGUgaGFzIHN0YXRpYyBjb25zdHJ1Y3RvcnMsIGl0IGlzIHVubGlrZWx5IHRvIHdvcmsgYXQgYWxsLiBJbiB0aGlzIGNhc2UsIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgbmV3IHZlcnNpb25zIG9mIHRoZSA8dHQ+dGNsc2g8L3R0PiBvciA8dHQ+d2lzaDwvdHQ+IGV4ZWN1dGFibGVzIGluc3RlYWQuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGxpbmsgYWdhaW5zdCB0aGUgPHR0PmxpYmdjYy5hPC90dD4sIDx0dD5saWJnKysuYTwvdHQ+LCBhbmQgbDx0dD5pYnN0ZGMrKy5hPC90dD4gbGlicmFyaWVzIChhc3N1bWluZyBnKyspLjxwPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBTZXR0aW5nIGEgcGFja2FnZSBwcmVmaXg8L2gzPgotVG8gYXZvaWQgbmFtZXNwYWNlIHByb2JsZW1zLCB5b3UgY2FuIGluc3RydWN0IFNXSUcgdG8gYXBwZW5kIGEgcGFja2FnZSBwcmVmaXggdG8gYWxsIG9mIHlvdXIgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgLXByZWZpeCBvcHRpb24gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtdGNsIC1wcmVmaXggRm9vIGV4YW1wbGUuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uICI8dHQ+YmFyPC90dD4iIGluIHRoZSBTV0lHIGZpbGUsIHRoZSBwcmVmaXggb3B0aW9uIHdpbGwgYXBwZW5kIHRoZSBwcmVmaXggdG8gdGhlIG5hbWUgd2hlbiBjcmVhdGluZyBhIGNvbW1hbmQgYW5kIGNhbGwgaXQgIjx0dD5Gb29fYmFyPC90dD4iLiA8cD4KLTxhIG5hbWU9Im4yNCI+PC9hPjxoMz4gVXNpbmcgW2luY3IgVGNsXSBuYW1lc3BhY2VzPC9oMz4KLUFsdGVybmF0aXZlbHksIHlvdSBjYW4gaGF2ZSBTV0lHIGluc3RhbGwgeW91ciBtb2R1bGUgaW50byBhbiBbaW5jciBUY2xdIG5hbWVzcGFjZSBieSBzcGVjaWZ5aW5nIHRoZSA8dHQ+LW5hbWVzcGFjZTwvdHQ+IG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtdGNsIC1uYW1lc3BhY2UgZXhhbXBsZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUJ5IGRlZmF1bHQsIHRoZSBuYW1lIG9mIHRoZSBuYW1lc3BhY2Ugd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgbW9kdWxlIG5hbWUsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHVzaW5nIHRoZSA8dHQ+LXByZWZpeDwvdHQ+IG9wdGlvbi48cD4KLTxwPgotV2hlbiB0aGU8dHQ+IC1uYW1lc3BhY2U8L3R0PiBvcHRpb24gaXMgdXNlZCwgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgY2FuIGJlIGNvbXBpbGVkIHVuZGVyIGJvdGggVGNsIGFuZCBbaW5jciBUY2xdLiBXaGVuIGNvbXBpbGluZyB1bmRlciBUY2wsIHRoZSBuYW1lc3BhY2Ugd2lsbCB0dXJuIGludG8gYSBwYWNrYWdlIHByZWZpeCBzdWNoIGFzIGluIDx0dD5Gb29fYmFyPC90dD4uIFdoZW4gcnVubmluZyB1bmRlciBbaW5jciBUY2xdLCBpdCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlIDx0dD5Gb286OmJhci48L3R0PjxwPgotPGEgbmFtZT0ibjIiPjwvYT48aDI+IEJ1aWxkaW5nIFRjbC9UayBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2gyPgotQnVpbGRpbmcgYSBTV0lHIGV4dGVuc2lvbiB0byBUY2wvVGsgdW5kZXIgV2luZG93cyA5NS9OVCBpcyByb3VnaGx5IHNpbWlsYXIgdG8gdGhlIHByb2Nlc3MgdXNlZCB3aXRoIFVuaXguICAgTm9ybWFsbHksIHlvdSB3aWxsIHdhbnQgdG8gcHJvZHVjZSBhIERMTCB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byB0Y2xzaCBvciB3aXNoLiAgICBUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBwcm9jZXNzIG9mIHVzaW5nIFNXSUcgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0LnggYWx0aG91Z2ggdGhlIHByb2NlZHVyZSBtYXkgYmUgc2ltaWxhciB3aXRoIG90aGVyIGNvbXBpbGVycy48cD4KLTxhIG5hbWU9Im4yNSI+PC9hPjxoMz4gUnVubmluZyBTV0lHIGZyb20gRGV2ZWxvcGVyIFN0dWRpbzwvaDM+Ci1JZiB5b3UgYXJlIGRldmVsb3BpbmcgeW91ciBhcHBsaWNhdGlvbiB3aXRoaW4gTWljcm9zb2Z0IGRldmVsb3BlciBzdHVkaW8sIFNXSUcgY2FuIGJlIGludm9rZWQgYXMgYSBjdXN0b20gYnVpbGQgb3B0aW9uLiAgICAgIFRoZSBwcm9jZXNzIHJvdWdobHkgZm9sbG93cyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5PcGVuIHVwIGEgbmV3IHdvcmtzcGFjZSBhbmQgdXNlIHRoZSBBcHBXaXphcmQgdG8gc2VsZWN0IGEgRExMIHByb2plY3QuCi08bGk+QWRkIGJvdGggdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgKHRoZSAuaSBmaWxlKSwgYW55IHN1cHBvcnRpbmcgQyBmaWxlcywgYW5kIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZpbGUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgU1dJRyAoaWUuIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+KS4gICBOb3RlIDogSWYgdXNpbmcgQysrLCBjaG9vc2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciB0aGUgd3JhcHBlciBmaWxlIHN1Y2ggYXMgPHR0PmV4YW1wbGVfd3JhcC5jeHg8L3R0Pi4gRG9uJ3Qgd29ycnkgaWYgdGhlIHdyYXBwZXIgZmlsZSBkb2Vzbid0IGV4aXN0IHlldC0tRGV2ZWxvcGVyIHN0dWRpbyB3aWxsIGtlZXAgYSByZWZlcmVuY2UgdG8gaXQgYXJvdW5kLgotPGxpPlNlbGVjdCB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSBhbmQgZ28gdG8gdGhlIHNldHRpbmdzIG1lbnUuICAgVW5kZXIgc2V0dGluZ3MsIHNlbGVjdCB0aGUgIkN1c3RvbSBCdWlsZCIgb3B0aW9uLgotPGxpPkVudGVyICJTV0lHIiBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQuCi08bGk+RW50ZXIgIjx0dD5zd2lnIC10Y2wgLW8gJChQcm9qRGlyKVwkKElucHV0TmFtZSlfd3JhcC5jICQoSW5wdXRQYXRoKTwvdHQ+IiBpbiB0aGUgIkJ1aWxkIGNvbW1hbmQocykgZmllbGQiCi08bGk+RW50ZXIgIjx0dD4kKFByb2pEaXIpXCQoSW5wdXROYW1lKV93cmFwLmM8L3R0PiIgaW4gdGhlICJPdXRwdXQgZmlsZXMocykgZmllbGQiLgotPGxpPk5leHQsIHNlbGVjdCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBlbnRpcmUgcHJvamVjdCBhbmQgZ28gdG8gIkMrKzpQcmVwcm9jZXNzb3IiLiBBZGQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIHlvdXIgVGNsIGluc3RhbGxhdGlvbiB1bmRlciAiQWRkaXRpb25hbCBpbmNsdWRlIGRpcmVjdG9yaWVzIi4KLTxsaT5GaW5hbGx5LCBzZWxlY3QgdGhlIHNldHRpbmdzIGZvciB0aGUgZW50aXJlIHByb2plY3QgYW5kIGdvIHRvICJMaW5rIE9wdGlvbnMiLiAgQWRkIHRoZSBUY2wgbGlicmFyeSAgZmlsZSB0byB5b3VyIGxpbmsgbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUgIjx0dD50Y2w4MC5saWI8L3R0PiIuICBBbHNvLCBzZXQgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHlvdXIgVGNsIG1vZHVsZSAoaWUuIGV4YW1wbGUuZGxsKS4KLTxsaT5CdWlsZCB5b3VyIHByb2plY3QuCi08L3VsPgotPHA+Ci1Ob3csIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwsIFNXSUcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGludm9rZWQgd2hlbiB5b3UgYnVpbGQgeW91ciBwcm9qZWN0LiAgQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCByZXN1bHQgaW4gU1dJRyBiZWluZyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIGZpbGUuICBUbyBydW4geW91ciBuZXcgVGNsIGV4dGVuc2lvbiwgc2ltcGx5IHJ1biA8dHQ+dGNsc2g8L3R0PiBvciA8dHQ+d2lzaDwvdHQ+ICBhbmQgdXNlIHRoZSA8dHQ+bG9hZDwvdHQ+IGNvbW1hbmQuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0KLU1TRE9TICZndDsgdGNsc2g4MAotJSBsb2FkIGV4YW1wbGUuZGxsCi0lIGZhY3QgNAotMjQKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4yNiI+PC9hPjxoMz4gVXNpbmcgTk1BS0U8L2gzPgotQWx0ZXJuYXRpdmVseSwgU1dJRyBleHRlbnNpb25zIGNhbiBiZSBidWlsdCBieSB3cml0aW5nIGEgTWFrZWZpbGUgZm9yIE5NQUtFLiAgIFRvIGRvIHRoaXMsIG1ha2Ugc3VyZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBNU1ZDKysgYXJlIGF2YWlsYWJsZSBhbmQgdGhlIE1TVkMrKyB0b29scyBhcmUgaW4geW91ciBwYXRoLiAgIE5vdywganVzdCB3cml0ZSBhIHNob3J0IE1ha2VmaWxlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgdmFyaW91cyBTV0lHIGdlbmVyYXRlZCBleHRlbnNpb25zCi0KLVNSQ1MgICAgICAgICAgPSBleGFtcGxlLmMKLUlGSUxFICAgICAgICAgPSBleGFtcGxlCi1JTlRFUkZBQ0UgICAgID0gJChJRklMRSkuaQotV1JBUEZJTEUgICAgICA9ICQoSUZJTEUpX3dyYXAuYwotCi0jIExvY2F0aW9uIG9mIHRoZSBWaXN1YWwgQysrIHRvb2xzICgzMiBiaXQgYXNzdW1lZCkKLQotVE9PTFMgICAgICAgICA9IGM6XG1zZGV2Ci1UQVJHRVQgICAgICAgID0gZXhhbXBsZS5kbGwKLUNDICAgICAgICAgICAgPSAkKFRPT0xTKVxiaW5cY2wuZXhlCi1MSU5LICAgICAgICAgID0gJChUT09MUylcYmluXGxpbmsuZXhlCi1JTkNMVURFMzIgICAgID0gLUkkKFRPT0xTKVxpbmNsdWRlCi1NQUNISU5FICAgICAgID0gSVg4NgotCi0jIEMgTGlicmFyeSBuZWVkZWQgdG8gYnVpbGQgYSBETEwKLQotRExMSUJDICAgICAgICA9IG1zdmNydC5saWIgb2xkbmFtZXMubGliICAKLQotIyBXaW5kb3dzIGxpYnJhcmllcyB0aGF0IGFyZSBhcHBhcmVudGx5IG5lZWRlZAotV0lOTElCICAgICAgICA9IGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgY29tZGxnMzIubGliIAotd2luc3Bvb2wubGliCi0KLSMgTGlicmFyaWVzIGNvbW1vbiB0byBhbGwgRExMcwotTElCUyAgICAgICAgICA9ICQoRExMSUJDKSAkKFdJTkxJQikgCi0KLSMgTGlua2VyIG9wdGlvbnMKLUxPUFQgICAgICA9IC1kZWJ1ZzpmdWxsIC1kZWJ1Z3R5cGU6Y3YgL05PREVGQVVMVExJQiAvUkVMRUFTRSAvTk9MT0dPIC8KLU1BQ0hJTkU6JChNQUNISU5FKSAtZW50cnk6X0RsbE1haW5DUlRTdGFydHVwQDEyIC1kbGwKLQotIyBDIGNvbXBpbGVyIGZsYWdzCi0KLUNGTEFHUyAgICA9IC9aNyAvT2QgL2MgL25vbG9nbwotVENMX0lOQ0xVREVTICA9IC1JZDpcdGNsOC4wYTJcZ2VuZXJpYyAtSWQ6XHRjbDguMGEyXHdpbgotVENMTElCICAgICAgICA9IGQ6XHRjbDguMGEyXHdpblx0Y2w4MC5saWIKLQotdGNsOjoKLQkuLlwuLlxzd2lnIC10Y2wgLW8gJChXUkFQRklMRSkgJChJTlRFUkZBQ0UpCi0JJChDQykgJChDRkxBR1MpICQoVENMX0lOQ0xVREVTKSAkKFNSQ1MpICQoV1JBUEZJTEUpCi0Jc2V0IExJQj0kKFRPT0xTKVxsaWIKLQkkKExJTkspICQoTE9QVCkgLW91dDpleGFtcGxlLmRsbCAkKExJQlMpICQoVENMTElCKSBleGFtcGxlLm9iaiBleGFtcGxlX3dyYXAub2JqCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGJ1aWxkIHRoZSBleHRlbnNpb24sIHJ1biBOTUFLRSAoeW91IG1heSBuZWVkIHRvIHJ1biB2Y3ZhcnMzMiBmaXJzdCkuICAgVGhpcyBpcyBhIHByZXR0eSBtaW5pbWFsIE1ha2VmaWxlLCBidXQgaG9wZWZ1bGx5IGl0cyBlbm91Z2ggdG8gZ2V0IHlvdSBzdGFydGVkLiAgIFdpdGggYSBsaXR0bGUgcHJhY3RpY2UsIHlvdSdsbCBiZSBtYWtpbmcgbG90cyBvZiBUY2wgZXh0ZW5zaW9ucy48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBCYXNpYyBUY2wgSW50ZXJmYWNlPC9oMj4KLTxhIG5hbWU9Im4yNyI+PC9hPjxoMz4gRnVuY3Rpb25zPC9oMz4KLUMgZnVuY3Rpb25zIGFyZSB0dXJuZWQgaW50byBuZXcgVGNsIGNvbW1hbmRzIHdpdGggdGhlIHNhbWUgdXNhZ2UgYXMgdGhlIEMgZnVuY3Rpb24uIERlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHNvIGFsbG93ZWQuIEFuIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi1pbnQgZm9vKGludCBhKTsKLWRvdWJsZSBiYXIgKGRvdWJsZSwgZG91YmxlIGIgPSAzLjApOwotLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpbGwgYmUgdXNlZCBpbiBUY2wgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zZXQgYSBbZm9vIDJdCi1zZXQgYiBbYmFyIDMuNSAtMS41XQotc2V0IGIgW2JhciAzLjVdICAgICAgICAgICAgICAjIE5vdGUgOiBkZWZhdWx0IGFyZ3VtZW50IGlzIHVzZWQgCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXJlIGlzbid0IG11Y2ggbW9yZSB0byBzYXkuLi50aGlzIGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IEdsb2JhbCB2YXJpYWJsZXM8L2gzPgotRm9yIGdsb2JhbCB2YXJpYWJsZXMsIHRoaW5ncyBhcmUgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZC4gRm9yIHRoZSBmb2xsb3dpbmcgQyBkYXRhdHlwZXMsIFNXSUcgd2lsbCB1c2UgVGNsJ3MgdmFyaWFibGUgbGlua2luZyBtZWNoYW5pc20gdG8gcHJvdmlkZSBkaXJlY3QgYWNjZXNzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQsIHVuc2lnbmVkIGludCwKLWRvdWJsZSwKLWNoYXIgKiwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiB1c2VkIGluIGFuIGludGVyZmFjZSBmaWxlIGFuZCBzY3JpcHQsIGl0IHdpbGwgb3BlcmF0ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBleGFtcGxlLmkKLSVtb2R1bGUgZXhhbXBsZQotLi4uCi1kb3VibGUgTXlfdmFyaWFibGU7Ci0uLi4KLQotIyBUY2wgc2NyaXB0Ci1wdXRzICRNeV92YXJpYWJsZSAgICAgICAgICAgICMgT3V0cHV0IHZhbHVlIG9mIEMgZ2xvYmFsIHZhcmlhYmxlCi1zZXQgTXlfdmFyaWFibGUgNS41ICAgICAgICAgICMgQ2hhbmdlIHRoZSB2YWx1ZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Gb3IgYWxsIG90aGVyIEMgZGF0YXR5cGVzLCBTV0lHIHdpbGwgZ2VuZXJhdGUgYSBwYWlyIG9mIHNldC9nZXQgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gZXhhbXBsZS5pCi1zaG9ydCBNeV9zaG9ydDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotd2lsbCBiZSBhY2Nlc3NlZCBpbiBUY2wgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHV0cyBbTXlfc2hvcnRfZ2V0XSAgICAgICAgICAjIEdldCB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGUKLU15X3Nob3J0X3NldCA1LjUgICAgICAgICAgICAgIyBTZXQgdmFsdWUgb2YgZ2xvYmFsIHZhcmlhYmxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIG5vdCB0aGUgbW9zdCBlbGVnYW50IHNvbHV0aW9uLCB0aGlzIGlzIHRoZSBvbmx5IHNvbHV0aW9uIGZvciBub3cuIFRjbCdzIG5vcm1hbCB2YXJpYWJsZSBsaW5raW5nIG1lY2hhbmlzbSBvcGVyYXRlcyBkaXJlY3RseSBvbiBhIHZhcmlhYmxlcyBhbmQgd291bGQgbm90IHdvcmsgY29ycmVjdGx5IG9uIGRhdGF0eXBlcyBvdGhlciB0aGFuIHRoZSAzIGJhc2ljIGRhdGF0eXBlcyBzdXBwb3J0ZWQgYnkgVGNsICg8dHQ+aW50PC90dD4sIDx0dD5kb3VibGU8L3R0PiwgYW5kIDx0dD5jaGFyICo8L3R0PikuPHA+Ci08YSBuYW1lPSJuMjkiPjwvYT48aDM+IENvbnN0YW50czwvaDM+Ci1Db25zdGFudHMgYXJlIGNyZWF0ZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gRm9yIG9kZCBkYXRhdHlwZXMgKG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZhcmlhYmxlIGxpbmtpbmcgbWVjaGFuaXNtKSwgU1dJRyBnZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnN0YW50IGFuZCB1c2UgaXQgaW5zdGVhZCAoeW91IHNob3VsZG4ndCBub3RpY2UgdGhpcyBob3dldmVyIHNpbmNlIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBhIHN0cmluZyBpbiBUY2wpLiBJdCBpcyBuZXZlciBuZWNlc3NhcnkgdG8gdXNlIGEgc3BlY2lhbCAiZ2V0IiBmdW5jdGlvbiB3aXRoIGNvbnN0YW50cy4gVW5saWtlIFRjbCB2YXJpYWJsZXMsIGNvbnN0YW50cyBjYW4gY29udGFpbiBwb2ludGVycywgc3RydWN0dXJlIGFkZHJlc3NlcywgZnVuY3Rpb24gcG9pbnRlcnMsIGV0Yy4uLjxwPgotPGEgbmFtZT0ibjMwIj48L2E+PGgzPiBQb2ludGVyczwvaDM+Ci1Qb2ludGVycyB0byBDL0MrKyBvYmplY3RzIGFyZSByZXByZXNlbnRlZCBhcyBjaGFyYWN0ZXIgc3RyaW5ncyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8xMDBmOGUyX1ZlY3Rvcl9wCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgTlVMTCBwb2ludGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgIk5VTEwiLiBOVUxMIHBvaW50ZXJzIGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgY3JlYXRlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5fMF9WZWN0b3JfcAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBUY2wgOC4wLCBwb2ludGVycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgYSBuZXcgdHlwZSBvZiBUY2wgb2JqZWN0LCBidXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyB0aGUgc2FtZSAoYW5kIGlzIGludGVyY2hhbmdhYmxlKS4gQXMgYSBnZW5lcmFsLCBkaXJlY3QgbWFuaXB1bGF0aW9uIG9mIHBvaW50ZXIgdmFsdWVzIGlzIGRpc2NvdXJhZ2VkLiA8cD4KLTxhIG5hbWU9Im4zMSI+PC9hPjxoMz4gU3RydWN0dXJlcyA8L2gzPgotU1dJRyBnZW5lcmF0ZXMgYSBiYXNpYyBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIEMgc3RydWN0dXJlcy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBWZWN0b3IgewotCWRvdWJsZSB4LHksejsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWdldHMgbWFwcGVkIGludG8gdGhlIGZvbGxvd2luZyBjb2xsZWN0aW9uIG9mIEMgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5kb3VibGUgVmVjdG9yX3hfZ2V0KFZlY3RvciAqb2JqKQotZG91YmxlIFZlY3Rvcl94X3NldChWZWN0b3IgKm9iaiwgZG91YmxlIHgpCi1kb3VibGUgVmVjdG9yX3lfZ2V0KFZlY3RvciAqb2JqKQotZG91YmxlIFZlY3Rvcl95X3NldChWZWN0b3IgKm9iaiwgZG91YmxlIHkpCi1kb3VibGUgVmVjdG9yX3pfZ2V0KFZlY3RvciAqb2JqKQotZG91YmxlIFZlY3Rvcl96X3NldChWZWN0b3IgKm9iaiwgZG91YmxlIHopCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlbiB1c2VkIGluIHRoZSByZXN1bHRpbmcgVGNsIGludGVyZmFjZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgdiBpcyBhIFZlY3RvciB0aGF0IGdvdCBjcmVhdGVkIHNvbWVob3cKLSUgVmVjdG9yX3hfZ2V0ICR2Ci0zLjUKLSUgVmVjdG9yX3hfc2V0ICR2IDcuOCAgICAgICAgICAgICMgQ2hhbmdlIHggY29tcG9uZW50Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpbWlsYXIgYWNjZXNzIGlzIHByb3ZpZGVkIGZvciB1bmlvbnMgYW5kIHRoZSBkYXRhIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuPHA+Ci08YSBuYW1lPSJuMzIiPjwvYT48aDM+IEMrKyBDbGFzc2VzPC9oMz4KLUMrKyBjbGFzc2VzIGFyZSBoYW5kbGVkIGJ5IGJ1aWxkaW5nIGEgc2V0IG9mIGxvdyBsZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgTGlzdCB7Ci1wdWJsaWM6Ci0gIExpc3QoKTsKLSAgfkxpc3QoKTsKLSAgaW50ICBzZWFyY2goY2hhciAqaXRlbSk7Ci0gIHZvaWQgaW5zZXJ0KGNoYXIgKml0ZW0pOwotICB2b2lkIHJlbW92ZShjaGFyICppdGVtKTsKLSAgY2hhciAqZ2V0KGludCBuKTsKLSAgaW50ICBsZW5ndGg7Ci1zdGF0aWMgdm9pZCBwcmludChMaXN0ICpsKTsKLX07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gd3JhcHBlZCBieSBTV0lHLCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY3JlYXRlZCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCAgICAqbmV3X0xpc3QoKTsKLXZvaWQgICAgIGRlbGV0ZV9MaXN0KExpc3QgKmwpOwotaW50ICAgICAgTGlzdF9zZWFyY2goTGlzdCAqbCwgY2hhciAqaXRlbSk7Ci12b2lkICAgICBMaXN0X2luc2VydChMaXN0ICpsLCBjaGFyICppdGVtKTsKLXZvaWQgICAgIExpc3RfcmVtb3ZlKExpc3QgKmwsIGNoYXIgKml0ZW0pOwotY2hhciAgICAqTGlzdF9nZXQoTGlzdCAqbCwgaW50IG4pOwotaW50ICAgICAgTGlzdF9sZW5ndGhfZ2V0KExpc3QgKmwpOwotaW50ICAgICAgTGlzdF9sZW5ndGhfc2V0KExpc3QgKmwsIGludCBuKTsKLXZvaWQgICAgIExpc3RfcHJpbnQoTGlzdCAqbCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpdGhpbiBUY2wsIHdlIGNhbiB1c2UgdGhlIGZ1bmN0aW9ucyBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lIHNldCBsIFtuZXdfTGlzdF0KLSUgTGlzdF9pbnNlcnQgJGwgQWxlCi0lIExpc3RfaW5zZXJ0ICRsIFN0b3V0Ci0lIExpc3RfaW5zZXJ0ICRsIExhZ2VyCi0lIExpc3RfcHJpbnQgJGwKLUxhZ2VyCi1TdG91dAotQWxlCi0lIHB1dHMgW0xpc3RfbGVuZ3RoX2dldCAkbF0KLTMKLSUgcHV0cyAkbAotXzEwMDg1NjBfTGlzdF9wCi0lIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1DKysgb2JqZWN0cyBhcmUgcmVhbGx5IGp1c3QgcG9pbnRlcnMgKHdoaWNoIGFyZSByZXByZXNlbnRlZCBhcyBzdHJpbmdzKS4gTWVtYmVyIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgYWNjZXNzZWQgYnkgc2ltcGx5IHBhc3NpbmcgYSBwb2ludGVyIGludG8gYSBjb2xsZWN0aW9uIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IHRha2UgdGhlIHBvaW50ZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LjxwPgotPHA+Ci1XaGlsZSBzb21ld2hhdCBwcmltaXRpdmUsIHRoZSBsb3ctbGV2ZWwgU1dJRyBpbnRlcmZhY2UgcHJvdmlkZXMgZGlyZWN0IGFuZCBmbGV4aWJsZSBhY2Nlc3MgdG8gYWxtb3N0IGFueSBDKysgb2JqZWN0LiBBcyBpdCB0dXJucyBvdXQsIGl0IGlzIHBvc3NpYmxlIHRvIGRvIHNvbWUgcmF0aGVyIGFtYXppbmcgdGhpbmdzIHdpdGggdGhpcyBpbnRlcmZhY2UgYXMgd2lsbCBiZSBzaG93biBpbiBzb21lIG9mIHRoZSBsYXRlciBleGFtcGxlcy4gU1dJRyAxLjEgYWxzbyBnZW5lcmF0ZXMgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIHRoZSBiYXNpYyBpbnRlcmZhY2UganVzdCBkZXNjcmliZWQgaGVyZS48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBUaGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZTwvaDI+Ci1XaXRoIFNXSUcgMS4xLCBhIG5ldyBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHRvIEMgc3RydWN0dXJlcyBhbmQgQysrIGNsYXNzZXMgaXMgc3VwcG9ydGVkLiBUaGlzIGludGVyZmFjZSBzdXBwbGVtZW50cyB0aGUgbG93LWxldmVsIFNXSUcgaW50ZXJmYWNlIGFscmVhZHkgZGVmaW5lZC0taW4gZmFjdCwgYm90aCBjYW4gYmUgdXNlZCBzaW11bHRhbmVvdXNseS4gVG8gaWxsdXN0cmF0ZSB0aGlzIGludGVyZmFjZSwgY29uc2lkZXIgb3VyIHByZXZpb3VzIDx0dD5MaXN0PC90dD4gY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3QgewotcHVibGljOgotICBMaXN0KCk7Ci0gIH5MaXN0KCk7Ci0gIGludCAgc2VhcmNoKGNoYXIgKml0ZW0pOwotICB2b2lkIGluc2VydChjaGFyICppdGVtKTsKLSAgdm9pZCByZW1vdmUoY2hhciAqaXRlbSk7Ci0gIGNoYXIgKmdldChpbnQgbik7Ci0gIGludCAgbGVuZ3RoOwotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Vc2luZyB0aGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSByZXF1aXJlcyBubyBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgb3IgcmVjb21waWxhdGlvbiBvZiB0aGUgU1dJRyBtb2R1bGUgKHRoZSBmdW5jdGlvbnMgYXJlIGp1c3QgdXNlZCBkaWZmZXJlbnRseSkuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IENyZWF0aW5nIG5ldyBvYmplY3RzPC9oMz4KLVRoZSBuYW1lIG9mIHRoZSBjbGFzcyBiZWNvbWVzIGEgbmV3IGNvbW1hbmQgZm9yIGNyZWF0aW5nIGFuIG9iamVjdC4gVGhlcmUgYXJlIDUgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW4gb2JqZWN0ICg8dHQ+TXlPYmplY3QgPC90dD5pcyB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBDKysgY2xhc3MpIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPk15T2JqZWN0IG8gICAgICAgICAgICAgICAgICAgIyBDcmVhdGVzIGEgbmV3IG9iamVjdCBgbycgCi0KLU15T2JqZWN0IG8gLXRoaXMgJG9ianB0ciAgICAgIyBUdXJuIGEgcG9pbnRlciB0byBhbiBleGlzdGluZyBDKysgb2JqZWN0IGludG8gYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUY2wgb2JqZWN0IGBvJwotCi1NeU9iamVjdCAtdGhpcyAkb2JqcHRyICAgICAgICMgVHVybiB0aGUgcG9pbnRlciAkb2JqcHRyIGludG8gYSBUY2wgIm9iamVjdCIKLQotTXlPYmplY3QgLWFyZ3MgYXJncyAgICAgICAgICAjIENyZWF0ZSBhIG5ldyBvYmplY3QgYW5kIHBpY2sgYSBuYW1lIGZvciBpdC4gQSBoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aWxsIGJlIHJldHVybmVkIGFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgcG9pbnRlciB2YWx1ZS4KLQotTXlPYmplY3QgICAgICAgICAgICAgICAgICAgICAjIFRoZSBzYW1lIGFzIE15T2JqZWN0IC1hcmdzLCBidXQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFrZSBubyBhcmd1bWVudHMuCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRodXMsIGZvciBvdXIgTGlzdCBjbGFzcywgd2UgY2FuIGNyZWF0ZSBuZXcgTGlzdCBvYmplY3RzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPkxpc3QgbCAgICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgbGlzdCBsCi0KLXNldCBsaXN0cHRyIFtuZXdfTGlzdF0gICAgICAgIyBDcmVhdGUgYSBuZXcgTGlzdCB1c2luZyBsb3cgbGV2ZWwgaW50ZXJmYWNlCi1MaXN0IGwyIC10aGlzICRsaXN0cHRyICAgICAgICMgVHVybiBpdCBpbnRvIGEgTGlzdCBvYmplY3QgbmFtZWQgYGwyJwotCi1zZXQgbDMgW0xpc3RdICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbmV3IGxpc3QuIFRoZSBuYW1lIG9mIHRoZSBsaXN0IGlzIGluICRsMwotCi1MaXN0IC10aGlzICRsaXN0cHRyICAgICAgICAgICMgVHVybiAkbGlzdHB0ciBpbnRvIGEgVGNsIG9iamVjdCBvZiB0aGUgc2FtZSBuYW1lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU5vdyBhc3N1bWluZyB5b3UncmUgbm90IGNvbXBsZXRlbHkgY29uZnVzZWQgYXQgdGhpcyBwb2ludCwgdGhlIGJlc3Qgd2F5IHRvIHRoaW5rIG9mIHRoaXMgaXMgdGhhdCB0aGVyZSBhcmUgcmVhbGx5IHR3byBkaWZmZXJlbnQgd2F5cyBvZiByZXByZXNlbnRpbmcgYW4gb2JqZWN0LiAgIE9uZSBhcHByb2FjaCBpcyB0byBzaW1wbHkgdXNlIHRoZSBwb2ludGVyIHZhbHVlIGFzIHRoZSBuYW1lIG9mIGFuIG9iamVjdC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8xMDBlOGY4X0xpc3RfcAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgc2Vjb25kIGFwcHJvYWNoIGlzIHRvIGFsbG93IHlvdSB0byBwaWNrIGEgbmFtZSBmb3IgYW4gb2JqZWN0IHN1Y2ggYXMgImZvbyIuICAgVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBjb25zdHJ1Y3RvcnMgYXJlIHJlYWxseSBqdXN0IG1lY2hhbmlzbSBmb3IgdXNpbmcgZWl0aGVyIGFwcHJvYWNoLjxwPgotPGEgbmFtZT0ibjM0Ij48L2E+PGgzPiBJbnZva2luZyBtZW1iZXIgZnVuY3Rpb25zPC9oMz4KLU1lbWJlciBmdW5jdGlvbnMgYXJlIGludm9rZWQgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUgYW5kIGFueSBhcmd1bWVudHMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIExpc3QgbAotJSBsIGluc2VydCAiQm9iIgotJSBsIGluc2VydCAiTWFyeSIKLSUgbCBzZWFyY2ggIkRhdmUiCi0wCi0lIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PciBpZiB5b3UgbGV0IFNXSUcgZ2VuZXJhdGUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdC4uLiAodGhpcyBpcyB0aGUgcG9pbnRlciBtb2RlbCk8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCBsIFtMaXN0XQotJSAkbCBpbnNlcnQgIkJvYiIgICAgICAgICAgICAjIE5vdGUgJGwgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIG9iamVjdAotJSAkbCBpbnNlcnQgIk1hcnkiCi0lICRsIHNlYXJjaCAiRGF2ZSIKLTAKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gRGVsZXRpbmcgb2JqZWN0czwvaDM+Ci1TaW5jZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGFkZGluZyBuZXcgVGNsIGNvbW1hbmRzLCB0aGV5IGNhbiBiZSBkZWxldGVkIGJ5IHNpbXBseSByZW5hbWluZyB0aGVtLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSByZW5hbWUgbCAiIiAgICAgICAgICAgICAgICAjIERlc3Ryb3kgbGlzdCBvYmplY3QgYGwnCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNXSUcgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgQy9DKysgZGVzdHJ1Y3Rvciwgd2l0aCBvbmUgY2F2ZWF0LS1TV0lHIHdpbGwgbm90IGRlc3Ryb3kgYW4gb2JqZWN0IGlmIHlvdSBjcmVhdGVkIGl0IGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyBwb2ludGVyIChpZiB5b3UgY2FsbGVkIHRoZSBjb25zdHJ1Y3RvciB1c2luZyB0aGUgLXRoaXMgb3B0aW9uKS4gU2luY2UgdGhlIHBvaW50ZXIgYWxyZWFkeSBleGlzdGVkIHdoZW4geW91IGNyZWF0ZWQgdGhlIFRjbCBvYmplY3QsIFRjbCBkb2Vzbid0IG93biB0aGUgb2JqZWN0IHNvIGl0IHdvdWxkIHByb2JhYmx5IGJlIGEgYmFkIGlkZWEgdG8gZGVzdHJveSBpdC48cD4KLTxhIG5hbWU9Im4zNiI+PC9hPjxoMz4gQWNjZXNzaW5nIG1lbWJlciBkYXRhPC9oMz4KLU1lbWJlciBkYXRhIG9mIGFuIG9iamVjdCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgdGhlIDx0dD5jZ2V0PC90dD4gbWV0aG9kLiBUaGUgYXBwcm9hY2ggaXMgcXVpdGUgc2ltaWxhciB0byB0aGF0IHVzZWQgaW4gW2luY3IgVGNsXSBhbmQgb3RoZXIgVGNsIGV4dGVuc2lvbnMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIGwgY2dldCAtbGVuZ3RoICAgICAgICAgICAgICMgR2V0IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QKLTEzCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+Y2dldDwvdHQ+IG1ldGhvZCBjdXJyZW50bHkgb25seSBhbGxvd3MgcmV0cmlldmFsIG9mIG9uZSBtZW1iZXIgYXQgYSB0aW1lLiBFeHRyYWN0aW5nIG11bHRpcGxlIG1lbWJlcnMgd2lsbCByZXF1aXJlIHJlcGVhdGVkIGNhbGxzLjxwPgotPHA+Ci1UaGUgbWVtYmVyIDx0dD4tdGhpczwvdHQ+IGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgU1dJRyBmdW5jdGlvbnMuIFRodXMsIHRoZSBmb2xsb3dpbmcgY2FsbCB3b3VsZCBiZSBsZWdhbDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBMaXN0IGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgbGlzdCBvYmplY3QKLSUgbCBpbnNlcnQgTWlrZQotJSBMaXN0X3ByaW50IFtsIGNnZXQgLXRoaXNdICAgICAgICAgIyBQcmludCBpdCBvdXQgdXNpbmcgbG93LWxldmVsIGZ1bmN0aW9uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IENoYW5naW5nIG1lbWJlciBkYXRhPC9oMz4KLVRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgbWVtYmVyIGRhdGEsIHRoZSA8dHQ+Y29uZmlndXJlPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBsIGNvbmZpZ3VyZSAtbGVuZ3RoIDEwICAgICAjIENoYW5nZSBsZW5ndGggdG8gMTAgKHByb2JhYmx5IG5vdCBhIGdvb2QgaWRlYSwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zc2libGUpLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBhIHN0cnVjdHVyZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXN0cnVjdCBWZWN0b3IgewotCWRvdWJsZSB4LCB5LCB6OwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgoteW91IGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFsbCBvciBzb21lIG9mIHRoZSBtZW1iZXJzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgdiBjb25maWd1cmUgLXggMy41IC15IDIgLXogLTEuMAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBkb2VzIG5vdCBtYXR0ZXIuICA8cD4KLTxhIG5hbWU9Im4zOCI+PC9hPjxoMz4gUmVsYXRpb25zaGlwIHdpdGggcG9pbnRlcnM8L2gzPgotVGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgaXMgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBwb2ludGVyIHZhbHVlcyBhcyBhcmd1bWVudHMuIEhlcmUgYXJlIGEgY291cGxlIG9mIHRoaW5ncyB0byBrZWVwIGluIG1pbmQgOjxwPgotPHA+Ci08dWw+Ci08bGk+SWYgeW91IGV4cGxpY2l0bHkgZ2F2ZSBhIG5hbWUgdG8gYW4gb2JqZWN0LCB0aGUgcG9pbnRlciB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZSBgPHR0PmNnZXQgLXRoaXM8L3R0PicgbWV0aG9kLiBUaGUgcG9pbnRlciB2YWx1ZSBpcyB3aGF0IHlvdSBzaG91bGQgZ2l2ZSB0byBvdGhlciBTV0lHIGdlbmVyYXRlZCBmdW5jdGlvbnMgaWYgbmVjZXNzYXJ5LgotPGxpPklmIHlvdSBsZXQgU1dJRyBnZW5lcmF0ZSB0aGUgbmFtZSBvZiBhbiBvYmplY3QgZm9yIHlvdSwgdGhlbiB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludGVyIHZhbHVlLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgYXBwcm9hY2guCi08bGk+SWYgeW91IGhhdmUgYSBwb2ludGVyIHZhbHVlIGJ1dCBpdCdzIG5vdCBhIFRjbCBvYmplY3QsIHlvdSBjYW4gdHVybiBpdCBpbnRvIG9uZSBieSBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBgPHR0Pi10aGlzPC90dD4nIG9wdGlvbi4KLTwvdWw+Ci08cD4KLUhlcmUgaXMgYSBzY3JpcHQgdGhhdCBpbGx1c3RyYXRlcyBob3cgdGhlc2UgdGhpbmdzIHdvcmsgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgRXhhbXBsZSAxIDogVXNpbmcgYSBuYW1lZCBvYmplY3QKLQotTGlzdCBsICAgICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIG5ldyBsaXN0Ci1sIGluc2VydCBEYXZlICAgICAgICAgICAgICAgICMgQ2FsbCBzb21lIG1ldGhvZHMKLWwgaW5zZXJ0IEphbmUJCi1sIGluc2VydCBQYXQKLUxpc3RfcHJpbnQgW2wgY2dldCAtdGhpc10gICAgIyBDYWxsIGEgc3RhdGljIG1ldGhvZCAod2hpY2ggcmVxdWlyZXMgdGhlIHBvaW50ZXIgdmFsdWUpCi0KLSMgRXhhbXBsZSAyOiBMZXQgU1dJRyBwaWNrIGEgbmFtZQotCi1zZXQgbCBbTGlzdF0gICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbmV3IGxpc3QKLSRsIGluc2VydCBEYXZlICAgICAgICAgICAgICAgIyBDYWxsIHNvbWUgbWV0aG9kcwotJGwgaW5zZXJ0IEphbmUKLSRsIGluc2VydCBQYXQKLUxpc3RfcHJpbnQgJGwgICAgICAgICAgICAgICAgIyBDYWxsIHN0YXRpYyBtZXRob2QgKG5hbWUgb2Ygb2JqZWN0IGlzIHNhbWUgYXMgcG9pbnRlcikKLQotIyBFeGFtcGxlIDM6IEFscmVhZHkgZXhpc3Rpbmcgb2JqZWN0Ci1zZXQgbCBbbmV3X0xpc3RdICAgICAgICAgICAgICMgQ3JlYXRlIGEgcmF3IG9iamVjdCB1c2luZyBsb3ctbGV2ZWwgaW50ZXJmYWNlCi1MaXN0X2luc2VydCAkbCBEYXZlICAgICAgICAgICMgQ2FsbCBzb21lIG1ldGhvZHMgKHVzaW5nIGxvdy1sZXZlbCBmdW5jdGlvbnMpCi1MaXN0IC10aGlzICRsICAgICAgICAgICAgICAgICMgVHVybiBpdCBpbnRvIGEgVGNsIG9iamVjdCBpbnN0ZWFkCi0kbCBpbnNlcnQgSmFuZQotJGwgaW5zZXJ0IFBhcnQKLUxpc3RfcHJpbnQgJGwgICAgICAgICAgICAgICAgIyBDYWxsIHN0YXRpYyBtZXRob2QgKHVzZXMgcG9pbnRlciB2YWx1ZSBhcyBiZWZvcmUpLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci08YSBuYW1lPSJuMzkiPjwvYT48aDM+IFBlcmZvcm1hbmNlIGNvbmNlcm5zIGFuZCBkaXNhYmxpbmcgdGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2U8L2gzPgotVGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgaXMgbWFpbmx5IHByb3ZpZGVkIGZvciBlYXNlIG9mIHByb2dyYW1taW5nIGF0IHRoZSBleHBlbnNlIG9mIGludHJvZHVjaW5nIG1vcmUgb3ZlcmhlYWQgYW5kIGluY3JlYXNlZCBjb2RlIHNpemUgKEMgY29kZSB0aGF0IGlzKS4gSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgdGhlc2UgaXNzdWVzIHVzZSB0aGUgYmFzaWMgU1dJRyBpbnRlcmZhY2UgaW5zdGVhZC4gSXQgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyBhbmQgaXMgbXVjaCBmYXN0ZXIuIEFzIGl0IHR1cm5zIG91dCwgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSBkaXJlY3RseSBpbiBUY2wgYXMgd2VsbC0tYW4gZXhhbXBsZSB3ZSdsbCByZXR1cm4gdG8gYSBsaXR0bGUgbGF0ZXIuPHA+Ci08cD4KLVRvIGRpc2FibGUgdGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UsIHJ1biBTV0lHIHdpdGggdGhlIDx0dD4tbm9vYmplY3Q8L3R0PiBvcHRpb24uIFRoaXMgd2lsbCBzdHJpcCBvdXQgYWxsIG9mIHRoZSBleHRyYSBjb2RlIGFuZCBwcm9kdWNlIG9ubHkgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQWJvdXQgdGhlIGV4YW1wbGVzPC9oMj4KLVRoZSBuZXh0IGZldyBzZWN0aW9ucyBjb3ZlciBUY2wgZXhhbXBsZXMgb2YgdmFyeWluZyBjb21wbGV4aXR5LiBUaGVzZSBhcmUgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIGlsbHVzdHJhdGUgaG93IFNXSUcgY2FuIGJlIHVzZWQgdG8gaW50ZWdyYXRlIEMvQysrIGFuZCBUY2wgaW4gYSB2YXJpZXR5IG9mIHdheXMuIFNvbWUgb2YgdGhlIHRoaW5ncyB0aGF0IHdpbGwgYmUgY292ZXJlZCBhcmUgOjxwPgotPHA+Ci08dWw+Ci08bGk+Q29udHJvbGxpbmcgQyBwcm9ncmFtcyB3aXRoIFRjbAotPGxpPkJ1aWxkaW5nIEMgZGF0YSBzdHJ1Y3R1cmVzIGluIFRjbC4KLTxsaT5Vc2Ugb2YgQyBvYmplY3RzIHdpdGggVGsKLTxsaT5XcmFwcGluZyBhIEMgbGlicmFyeSAoT3BlbkdMIGluIHRoaXMgY2FzZSkKLTxsaT5BY2Nlc3NpbmcgYXJyYXlzIGFuZCBvdGhlciBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzCi08bGk+VXNpbmcgVGNsIHRvIGJ1aWxkIG5ldyBUY2wgaW50ZXJmYWNlcyB0byBDIHByb2dyYW1zLgotPGxpPk1vZGlmeWluZyBTV0lHJ3MgaGFuZGxpbmcgb2YgZGF0YXR5cGVzLgotPGxpPkFuZCBhIGJ1bmNoIG9mIG90aGVyIGNvb2wgc3R1ZmYuCi08L3VsPgotPGEgbmFtZT0ibjYiPjwvYT48aDI+IEJpbmFyeSB0cmVlcyBpbiBUY2w8L2gyPgotSW4gdGhpcyBleGFtcGxlLCB3ZSBzaG93IFRjbCBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIGJpbmFyeSB0cmVlcyBpbXBsZW1lbnRlZCBpbiBDLiBUaGlzIHdpbGwgaW52b2x2ZSBhY2Nlc3NpbmcgQyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy48cD4KLTxhIG5hbWU9Im40MCI+PC9hPjxoMz4gQyBmaWxlczwvaDM+Ci1XZSB3aWxsIGJ1aWxkIHRyZWVzIHVzaW5nIHRoZSBmb2xsb3dpbmcgQyBoZWFkZXIgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogdHJlZS5oICovCi10eXBlZGVmIHN0cnVjdCBOb2RlIE5vZGU7Ci1zdHJ1Y3QgTm9kZSB7Ci0JY2hhciAgICprZXk7Ci0JY2hhciAgICp2YWx1ZTsKLQlOb2RlICAgKmxlZnQ7Ci0JTm9kZSAgICpyaWdodDsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IFRyZWUgewotCU5vZGUgICAqaGVhZDsgIC8qICBTdGFydGluZyBub2RlICovCi0JTm9kZSAgICp6OyAgICAgLyogRW5kaW5nIG5vZGUgKGF0IGxlYXZlcykgKi8KLX0gVHJlZTsKLQotZXh0ZXJuIE5vZGUgKm5ld19Ob2RlKGNoYXIgKmtleSwgY2hhciAqdmFsdWUpOwotZXh0ZXJuIFRyZWUgKm5ld19UcmVlKCk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBDIGZ1bmN0aW9ucyB0byBjcmVhdGUgbmV3IG5vZGVzIGFuZCB0cmVlcyBhcmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IHRyZWUuYyAqLwotI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwotI2luY2x1ZGUgInRyZWUuaCIKLU5vZGUgKm5ld19Ob2RlKGNoYXIgKmtleSwgY2hhciAqdmFsdWUpIHsKLQlOb2RlICpuOwotCW4gPSAoTm9kZSAqKSBtYWxsb2Moc2l6ZW9mKE5vZGUpKTsKLQluLSZndDtrZXkgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGtleSkrMSk7Ci0Jbi0mZ3Q7dmFsdWUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHZhbHVlKSsxKTsKLQlzdHJjcHkobi0mZ3Q7a2V5LGtleSk7Ci0Jc3RyY3B5KG4tJmd0O3ZhbHVlLHZhbHVlKTsKLQluLSZndDtsZWZ0ID0gMDsKLQluLSZndDtyaWdodCA9IDA7Ci0JcmV0dXJuIG47Ci19OwotVHJlZSAqbmV3X1RyZWUoKSB7Ci0JVHJlZSAqdDsKLQl0ID0gKFRyZWUgKikgbWFsbG9jKHNpemVvZihUcmVlKSk7Ci0JdC0mZ3Q7aGVhZCA9IG5ld19Ob2RlKCIiLCJfX2hlYWRfXyIpOwotCXQtJmd0O3ogPSBuZXdfTm9kZSgiX19lbmRfXyIsIl9fZW5kX18iKTsKLQl0LSZndDtoZWFkLSZndDtyaWdodCA9IHQtJmd0O3o7Ci0JdC0mZ3Q7ei0mZ3Q7bGVmdCA9IHQtJmd0O3o7Ci0JdC0mZ3Q7ei0mZ3Q7cmlnaHQgPSB0LSZndDt6OwotCXJldHVybiB0OwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQxIj48L2E+PGgzPiBNYWtpbmcgYSBxdWljayBhIGRpcnR5IFRjbCBtb2R1bGU8L2gzPgotVG8gbWFrZSBhIHF1aWNrIFRjbCBtb2R1bGUgd2l0aCB0aGVzZSBmdW5jdGlvbnMsIHdlIGNhbiBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBmaWxlIDogdHJlZS5pCi0lbW9kdWxlIHRyZWUKLSV7Ci0jaW5jbHVkZSAidHJlZS5oIgotJX0KLSVpbmNsdWRlIHRyZWUuaCAgICAgICAvLyBKdXN0IGdyYWIgaGVhZGVyIGZpbGUgc2luY2UgaXQncyBmYWlybHkgc2ltcGxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGJ1aWxkIHRoZSBtb2R1bGUsIHJ1biBTV0lHIGFzIGZvbGxvd3MgYW5kIGNvbXBpbGUgdGhlIHJlc3VsdGluZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtdGNsIC1sdGNsc2guaSB0cmVlLmkKLSUgZ2NjIHRyZWUuYyB0cmVlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZSAtTC91c3IvbG9jYWwvbGliIC1sdGNsIC1sbSAtbyBteV90Y2xzaAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XZSBjYW4gbm93IHRyeSBvdXQgdGhlIG1vZHVsZSBpbnRlcmFjdGl2ZWx5IGJ5IGp1c3QgcnVubmluZyB0aGUgbmV3IGA8dHQ+bXlfdGNsc2g8L3R0PicgZXhlY3V0YWJsZS48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgbXlfdGNsc2gKLSUgc2V0IHQgW25ld19UcmVlXSAgICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbmV3IHRyZWUKLV84MDUzMTk4X1RyZWVfcAotJSBzZXQgbiBbVHJlZV9oZWFkX2dldCAkdF0gICAgICAgICAgIyBHZXQgZmlyc3Qgbm9kZQotXzgwNTMxYThfTm9kZV9wCi0lIHB1dHMgW05vZGVfdmFsdWVfZ2V0ICRuXSAgICAgICAgICAjIEdldCBpdHMgdmFsdWUKLV9faGVhZF9fCi0lIE5vZGUgLXRoaXMgJG4KLSUgJG4gY2dldCAtdmFsdWUgICAgICAgICAgICAgICAgICAgIyBBbHRlbmF0aXZlIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWx1ZQotX19oZWFkX18KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40MiI+PC9hPjxoMz4gQnVpbGRpbmcgYSBDIGRhdGEgc3RydWN0dXJlIGluIFRjbDwvaDM+Ci1HaXZlbiBvdXIgc2ltcGxlIFRjbCBpbnRlcmZhY2UsIGl0IGlzIGVhc3kgdG8gd3JpdGUgVGNsIGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcgdXAgYSBDIGJpbmFyeSB0cmVlLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBJbnNlcnQgYW4gaXRlbSBpbnRvIGEgdHJlZQotcHJvYyBpbnNlcnRfdHJlZSB7dHJlZSBrZXkgdmFsdWV9IHsKLSAgICBzZXQgdHJlZV9oZWFkIFtUcmVlX2hlYWRfZ2V0ICR0cmVlXQotICAgIHNldCB0cmVlX3ogW1RyZWVfel9nZXQgJHRyZWVdCi0gICAgc2V0IHAgJHRyZWVfaGVhZAotICAgIHNldCB4IFtOb2RlX3JpZ2h0X2dldCAkdHJlZV9oZWFkXQotICAgIHdoaWxlIHtbTm9kZV9rZXlfZ2V0ICR4XSAhPSAiX19lbmRfXyJ9IHsKLSAgICAgICAgc2V0IHAgJHgKLSAgICAgICAgaWYgeyRrZXkgJmx0OyBbTm9kZV9rZXlfZ2V0ICR4XX0gewotCQlzZXQgeCBbTm9kZV9sZWZ0X2dldCAkeF0KLQkgfSB7Ci0JICAgICAgIHNldCB4IFtOb2RlX3JpZ2h0X2dldCAkeF0KLSAgICAgICAgfQotICAgIH0KLSAgICBzZXQgeCBbbmV3X05vZGUgJGtleSAkdmFsdWVdCi0gICAgaWYgeyRrZXkgJmx0OyBbTm9kZV9rZXlfZ2V0ICRwXX0gewotICAgICAgICBOb2RlX2xlZnRfc2V0ICRwICR4Ci0gICAgfSB7Ci0gICAgICAgIE5vZGVfcmlnaHRfc2V0ICRwICR4Ci0gICAgfQotICAgIE5vZGVfbGVmdF9zZXQgJHggJHRyZWVfegotICAgIE5vZGVfcmlnaHRfc2V0ICR4ICR0cmVlX3oKLX0KLQotIyBTZWFyY2ggdHJlZSBhbmQgcmV0dXJuIGFsbCBtYXRjaGVzCi1wcm9jIHNlYXJjaF90cmVlIHt0cmVlIGtleX0gewotICAgIHNldCB0cmVlX2hlYWQgW1RyZWVfaGVhZF9nZXQgJHRyZWVdCi0gICAgc2V0IHRyZWVfeiBbVHJlZV96X2dldCAkdHJlZV0KLSAgICBzZXQgZm91bmQge30KLSAgICBzZXQgeCBbTm9kZV9yaWdodF9nZXQgJHRyZWVfaGVhZF0KLSAgICB3aGlsZSB7W05vZGVfa2V5X2dldCAkeF0gIT0gIl9fZW5kX18ifSB7Ci0gICAgICAgIGlmIHtbTm9kZV9rZXlfZ2V0ICR4XSA9PSAka2V5fSB7Ci0gICAgICAgICAgICBsYXBwZW5kIGZvdW5kIFtOb2RlX3ZhbHVlX2dldCAkeF0KLSAgICAgICAgfQotICAgICAgICBpZiB7JGtleSAmbHQ7IFtOb2RlX2tleV9nZXQgJHhdfSB7Ci0gICAgICAgICAgICBzZXQgeCBbTm9kZV9sZWZ0X2dldCAkeF0KLSAgICAgICAgfSB7Ci0gICAgICAgICAgICBzZXQgeCBbTm9kZV9yaWdodF9nZXQgJHhdCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICRmb3VuZAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSB3cml0dGVuIGluIFRjbCwgdGhlc2UgZnVuY3Rpb25zIGFyZSBidWlsZGluZyB1cCBhIHJlYWwgQyBiaW5hcnkgdHJlZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvdWxkIGJlIHBhc3NlZCBpbnRvIG90aGVyIEMgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgd2UgY291bGQgd3JpdGUgYSBmdW5jdGlvbiB0aGF0IGdsb2JzIGFuIGVudGlyZSBkaXJlY3RvcnkgYW5kIGJ1aWxkcyBhIHRyZWUgc3RydWN0dXJlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgSW5zZXJ0IGFsbCBvZiB0aGUgZmlsZXMgaW4gcGF0aG5hbWUgaW50byBhIGJpbmFyeSB0cmVlCi0KLXByb2MgYnVpbGRfZGlyX3RyZWUge3RyZWUgcGF0aG5hbWV9IHsKLSAgICBzZXQgZXJyb3IgW2NhdGNoIHtzZXQgZmlsZWxpc3QgW2dsb2IgLW5vY29tcGxhaW4gJHBhdGhuYW1lLypdfV0KLSAgICBpZiB7JGVycm9yID09IDB9IHsKLSAgICAgICAgZm9yZWFjaCBmICRmaWxlbGlzdCB7Ci0gICAgICAgICAgICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJGZdID09IDF9IHsKLSAgICAgICAgICAgICAgICBpbnNlcnRfdHJlZSAkdHJlZSBbZmlsZSB0YWlsICRmXSAkZgotICAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0eXBlICRmXSAhPSAibGluayJ9IHtidWlsZF9kaXJfdHJlZSAkdHJlZSAkZn0KLSAgICAgICAgICAgIH0gewotICAgICAgICAgICAgICAgIGluc2VydF90cmVlICR0cmVlIFtmaWxlIHRhaWwgJGZdICRmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdlIGNhbiB0ZXN0IG91dCBvdXIgZnVuY3Rpb24gaW50ZXJhY3RpdmVseSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNvdXJjZSB0cmVlLnRjbAotJSBzZXQgdCBbbmV3X1RyZWVdICAgICAgICMgQ3JlYXRlIGEgbmV3IHRyZWUKLV84MDUzM2M4X1RyZWVfcAotJSBidWlsZF9kaXJfdHJlZSAkdCAvaG9tZS9iZWF6bGV5L1NXSUcvU1dJRzEuMQotJSBzZWFyY2hfdHJlZSAkdCB0Y2wKLS9ob21lL2JlYXpsZXkvU1dJRy9TV0lHMS4xL0V4YW1wbGVzL3RjbCAvaG9tZS9iZWF6bGV5L1NXSUcvU1dJRzEuMS9zd2lnX2xpYi90Y2wKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gSW1wbGVtZW50aW5nIG1ldGhvZHMgaW4gQzwvaDM+Ci1XaGlsZSBvdXIgVGNsIG1ldGhvZHMgbWF5IGJlIGZpbmUgZm9yIHNtYWxsIHByb2JsZW1zLCBpdCBtYXkgYmUgZmFzdGVyIHRvIHJlaW1wbGVtZW50IHRoZSBpbnNlcnQgYW5kIHNlYXJjaCBtZXRob2RzIGluIEMgIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGluc2VydF90cmVlKFRyZWUgKnQsIGNoYXIgKmtleSwgY2hhciAqdmFsdWUpIHsKLQlOb2RlICpwOwotCU5vZGUgKng7Ci0JCi0JcCA9IHQtJmd0O2hlYWQ7Ci0JeCA9IHQtJmd0O2hlYWQtJmd0O3JpZ2h0OwotCXdoaWxlICh4ICE9IHQtJmd0O3opIHsKLQkJcCA9IHg7Ci0JCWlmIChzdHJjbXAoa2V5LHgtJmd0O2tleSkgJmx0OyAwKQotCQkJeCA9IHgtJmd0O2xlZnQ7Ci0JCWVsc2UKLQkJCXggPSB4LSZndDtyaWdodDsKLQl9Ci0JeCA9IG5ld19Ob2RlKGtleSx2YWx1ZSk7Ci0JaWYgKHN0cmNtcChrZXkscC0mZ3Q7a2V5KSAmbHQ7IDApIAotCQlwLSZndDtsZWZ0ID0geDsKLQllbHNlCi0JCXAtJmd0O3JpZ2h0ID0geDsKLQl4LSZndDtsZWZ0ID0gdC0mZ3Q7ejsKLQl4LSZndDtyaWdodCA9IHQtJmd0O3o7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uIGluIFRjbCwgc2ltcGx5IHB1dCBhIGRlY2xhcmF0aW9uIGludG8gdGhlIGZpbGUgPHR0PnRyZWUuaDwvdHQ+IG9yIDx0dD50cmVlLmk8L3R0Pi48cD4KLTxwPgotV2hlbiByZWltcGxlbWVudGVkIGluIEMsIHRoZSB1bmRlcmx5aW5nIFRjbCBzY3JpcHQgbWF5IG5vdCBub3RpY2UgdGhlIGRpZmZlcmVuY2UuICBGb3IgZXhhbXBsZSwgb3VyIGRpcmVjdG9yeSBzdWJyb3V0aW5lIHdvdWxkIG5vdCBjYXJlIGlmIDx0dD5pbnNlcnRfdHJlZTwvdHQ+IGhhZCBiZWVuIHdyaXR0ZW4gaW4gVGNsIG9yIEMuICAgT2YgY291cnNlLCBieSB3cml0aW5nIHRoaXMgZnVuY3Rpb24gQywgd2Ugd2lsbCBnZXQgc2lnbmlmaWNhbnRseSBiZXR0ZXIgcGVyZm9ybWFuY2UuIDxwPgotPGEgbmFtZT0ibjQ0Ij48L2E+PGgzPiBCdWlsZGluZyBhbiBvYmplY3Qgb3JpZW50ZWQgQyBpbnRlcmZhY2U8L2gzPgotU28gZmFyIG91ciB0cmVlIGV4YW1wbGUgaGFzIGJlZW4gdXNpbmcgdGhlIGJhc2ljIFNXSUcgaW50ZXJmYWNlLiAgV2l0aCBhIGxpdHRsZSB3b3JrIGluIHRoZSBpbnRlcmZhY2UgZmlsZSwgd2UgY2FuIGltcHJvdmUgdGhlIGludGVyZmFjZSBhIGxpdHRsZSBiaXQuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSB0cmVlCi0lewotI2luY2x1ZGUgInRyZWUuaCIKLSV9Ci0KLSVpbmNsdWRlIHRyZWUuaAotJXsKLQotICAvKiBGdW5jdGlvbiB0byBjb3VudCB1cCBOb2RlcyAqLwotICBzdGF0aWMgIGludCBjb3VudF9ub2RlcyhOb2RlICpuLCBOb2RlICplbmQpIHsKLSAgICBpZiAobiA9PSBlbmQpIHJldHVybiAwOwotICAgIHJldHVybiAxK2NvdW50X25vZGVzKG4tJmd0O2xlZnQsZW5kKStjb3VudF9ub2RlcyhuLSZndDtyaWdodCxlbmQpOwotICB9Ci0KLSV9Ci0KLS8vIEF0dGFjaCBzb21lIG5ldyBtZXRob2RzIHRvIHRoZSBUcmVlIHN0cnVjdHVyZQotCi0lYWRkbWV0aG9kcyBUcmVlIHsKLSAgIHZvaWQgaW5zZXJ0KGNoYXIgKmtleSwgY2hhciAqdmFsdWUpIHsKLSAgICAgICAgaW5zZXJ0X3RyZWUoc2VsZixrZXksdmFsdWUpOwotICAgfQotICAgY2hhciAqc2VhcmNoKGNoYXIgKmtleSkgewotICAgICAgICByZXR1cm4gc2VhcmNoX3RyZWUoc2VsZixrZXkpOwotICAgfQotICAgY2hhciAqZmluZG5leHQoY2hhciAqa2V5KSB7Ci0gICAgIHJldHVybiBmaW5kX25leHQoc2VsZixrZXkpOwotICAgfQotICAgaW50IGNvdW50KCkgewotICAgICByZXR1cm4gY291bnRfbm9kZXMoc2VsZi0mZ3Q7aGVhZC0mZ3Q7cmlnaHQsc2VsZi0mZ3Q7eik7Ci0gICB9Ci0gICBUcmVlKCk7ICAgICAgICAvLyBUaGlzIGlzIGp1c3QgYW5vdGhlciBuYW1lIGZvciBuZXdfVHJlZQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBtZXRob2RzIHRvIGV4aXN0aW5nIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMuICBJbiB0aGlzIGNhc2UsIHdlIGFyZSBhdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSA8dHQ+VHJlZTwvdHQ+IHN0cnVjdHVyZS4gICBFYWNoIG9mIHRoZSBtZXRob2RzIGFyZSBzaW1wbHkgdmFyaW91cyBDIGZ1bmN0aW9ucyB3ZSBoYXZlIHdyaXR0ZW4gZm9yIGFjY2Vzc2luZyB0cmVlcy4gICBUaGlzIHR5cGUgb2YgaW50ZXJmYWNlIGZpbGUgY29tZXMgaW4gcGFydGljdWxhcmx5IGhhbmR5IHdoZW4gdXNpbmcgdGhlIFRjbCBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlLiBGb3IgZXhhbXBsZSwgd2UgY2FuIHJld3JpdGUgb3VyIGRpcmVjdG9yeSBnbG9iYmVyIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnByb2MgYnVpbGRfZGlyX3RyZWUge3RyZWUgcGF0aG5hbWV9IHsKLSAgICBzZXQgZXJyb3IgW2NhdGNoIHtzZXQgZmlsZWxpc3QgW2dsb2IgLW5vY29tcGxhaW4gJHBhdGhuYW1lLypdfV0KLSAgICBpZiB7JGVycm9yID09IDB9IHsKLSAgICAgICAgZm9yZWFjaCBmICRmaWxlbGlzdCB7Ci0gICAgICAgICAgICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJGZdID09IDF9IHsKLSAgICAgICAgICAgICAgICAkdHJlZSBpbnNlcnQgW2ZpbGUgdGFpbCAkZl0gJGYgICAgICAjIE5vdGUgbmV3IGNhbGxpbmcgbWV0aG9kCi0gICAgICAgICAgICAgICAgaWYge1tmaWxlIHR5cGUgJGZdICE9ICJsaW5rIn0ge2J1aWxkX2Rpcl90cmVlICR0cmVlICRmfQotICAgICAgICAgICAgfSB7Ci0gICAgICAgICAgICAgICAgJHRyZWUgaW5zZXJ0IFtmaWxlIHRhaWwgJGZdICRmIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3cgdXNpbmcgaXQgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNvdXJjZSB0cmVlLnRjbAotJSBUcmVlIHQgICAgICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIG5ldyBUcmVlIG9iamVjdAotXzgwNTQ2MTBfVHJlZV9wCi0lIGJ1aWxkX2Rpcl90cmVlIHQgL2hvbWUvYmVhemxleS9TV0lHL1NXSUcxLjEKLSUgdCBjb3VudAotMTc3MAotJSB0IHNlYXJjaCBnbGF1eC5pCi0vaG9tZS9iZWF6bGV5L1NXSUcvU1dJRzEuMS9FeGFtcGxlcy9PcGVuR0wvZ2xhdXguaQotJSB0IHNlYXJjaCB0eXBlbWFwcwotL2hvbWUvYmVhemxleS9TV0lHL1NXSUcxLjEvRXhhbXBsZXMvcGVybDUvdHlwZW1hcHMKLSUgdCBmaW5kbmV4dCB0eXBlbWFwcwotL2hvbWUvYmVhemxleS9TV0lHL1NXSUcxLjEvRXhhbXBsZXMvcHl0aG9uL3R5cGVtYXBzCi0lIHQgZmluZG5leHQgdHlwZW1hcHMKLS9ob21lL2JlYXpsZXkvU1dJRy9TV0lHMS4xL0V4YW1wbGVzL3RjbC90eXBlbWFwcwotJSB0IGZpbmRuZXh0IHR5cGVtYXBzCi1Ob25lCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdpdGggYSBsaXR0bGUgZXh0cmEgd29yaywgd2UndmUgbWFuYWdlZCB0byB0dXJuIGFuIG9yZGluYXJ5IEMgc3RydWN0dXJlIGludG8gYSBjbGFzcy1saWtlIG9iamVjdCBpbiBUY2wuIDxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IEJ1aWxkaW5nIEMvQysrIGRhdGEgc3RydWN0dXJlcyB3aXRoIFRrPC9oMj4KLUdpdmVuIHRoZSBkaXJlY3QgYWNjZXNzIHRvIEMvQysrIG9iamVjdHMgcHJvdmlkZWQgYnkgU1dJRywgaXQgY2FuIGJlIHBvc3NpYmxlIHRvIHVzZSBUayB0byBpbnRlcmFjdGl2ZWx5IGJ1aWxkIGEgdmFyaWV0eSBvZiBpbnRlcmVzdGluZyBkYXRhIHN0cnVjdHVyZXMuICAgIFRvIGRvIHRoaXMsIGl0IGlzIHVzdWFsbHkgdXNlZnVsIHRvIG1haW50YWluIGEgbWFwcGluZyBiZXR3ZWVuIGNhbnZhcyBpdGVtcyBhbmQgYW4gdW5kZXJseWluZyAgQyBkYXRhIHN0cnVjdHVyZS4gIFRoaXMgaXMgZG9uZSB1c2luZyBhc3NvY2lhdGl2ZSBhcnJheXMgdG8gbWFwIEMgcG9pbnRlcnMgdG8gY2FudmFzIGl0ZW1zIGFuZCBjYW52YXMgaXRlbXMgYmFjayB0byBwb2ludGVycy48cD4KLTxwPgotU3VwcG9zZSB0aGF0IHdlIGhhdmUgYSBDIHByb2dyYW0gZm9yIG1hbmlwdWxhdGluZyBkaXJlY3RlZCBncmFwaHMgYW5kIHRoYXQgd2Ugd2FudGVkIHRvIHByb3ZpZGUgYSBUayBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIGdyYXBocyB1c2luZyBhIGJhbGwtYW5kLXN0aWNrIG1vZGVsIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD48Y2VudGVyPjxpbWcgc3JjPSJjaDEwLjEucG5nIj48L2NlbnRlcj48cD4KLTxwPgotPHA+Ci1UaGUgU1dJRyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhpcyBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZ3JhcGgKLSV7Ci0jaW5jbHVkZSAiZ3JhcGguaCIKLSV9Ci0KLS8qIEdldCBhIG5vZGUncyBudW1iZXIgKi8KLWludCAgICAgIEdldE51bShOb2RlICpuKTsgICAgICAgICAgICAgICAvKiBHZXQgYSBub2RlJ3MgbnVtYmVyICAgICAgICAgKi8KLUFkakxpc3QgKkdldEFkaihOb2RlICpuKTsgICAgICAgICAgICAgICAvKiBHZXQgYSBub2RlJ3MgYWRqYWNlbmN5IGxpc3QgKi8KLUFkakxpc3QgKkdldE5leHQoQWRqTGlzdCAqbCk7ICAgICAgICAgICAvKiBHZXQgbmV4dCBub2RlIGluIGFkai4gbGlzdCAgKi8KLU5vZGUgICAgKkdldE5vZGUoQWRqTGlzdCAqbCk7ICAgICAgICAgICAvKiBHZXQgbm9kZSBmcm9tIGFkai4gbGlzdCAgICAgKi8KLU5vZGUgICAgKm5ld19ub2RlKCk7ICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIGEgbmV3IG5vZGUgICAgICAgICAgICAgKi8KLXZvaWQgICAgIEFkZExpbmsoTm9kZSAqdjEsIE5vZGUgKnYyKTsgICAvKiBBZGQgYW4gZWRnZSAgICAgICAgICAgICAgICAgKi8KLS4uLiBldGMgLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBpbnRlcmZhY2UgZmlsZSBtYW5pcHVsYXRlcyA8dHQ+Tm9kZTwvdHQ+IGFuZCA8dHQ+QWRqTGlzdDwvdHQ+IHN0cnVjdHVyZXMuICBUaGUgcHJlY2lzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBkb2Vzbid0IG1hdHRlciBoZXJlLS1pbiBmYWN0IFNXSUcgZG9lc24ndCBldmVuIG5lZWQgaXQuICBXaXRoaW4gYSBUY2wvVGsgc2NyaXB0IGhvd2V2ZXIsIHdlIGNhbiBrZWVwIHRyYWNrIG9mIHRoZXNlIG9iamVjdHMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBNYWtlIGEgbmV3IG5vZGUgYW5kIHB1dCBpdCBvbiB0aGUgY2FudmFzCi1wcm9jIG1rTm9kZSB7eCB5fSB7Ci0gICAgZ2xvYmFsIG5vZGVYIG5vZGVZIG5vZGVQIG5vZGVNYXAgbm9kZUxpc3QgZWRnZUZpcnN0IGVkZ2VTZWNvbmQKLSAgICBzZXQgbmV3IFsuYyBjcmVhdGUgb3ZhbCBbZXhwciAkeC0xNV0gW2V4cHIgJHktMTVdIFwKLQkJIFtleHByICR4KzE1XSBbZXhwciAkeSsxNV0gLW91dGxpbmUgYmxhY2sgXAotCQkgLWZpbGwgd2hpdGUgLXRhZ3Mgbm9kZV0KLSAgICBzZXQgbmV3bm9kZSBbbmV3X25vZGVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgTWFrZSBhIG5ldyBDIE5vZGUKLSAgICBzZXQgbm51bSBbR2V0TnVtICRuZXdub2RlXSAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgR2V0IG91ciBub2RlJ3MgbnVtYmVyCi0gICAgc2V0IGlkIFsuYyBjcmVhdGUgdGV4dCBbZXhwciAkeC00XSBbZXhwciAkeSsxMF0gXAotCSAgICAgLXRleHQgJG5udW0gLWFuY2hvciBzdyAtdGFncyBub2RlaWRdCi0gICAgc2V0IG5vZGVYKCRuZXcpICR4CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNhdmUgY29vcmRzIG9mIGNhbnZhcyBpdGVtCi0gICAgc2V0IG5vZGVZKCRuZXcpICR5Ci0gICAgc2V0IG5vZGVQKCRuZXcpICRuZXdub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNhdmUgQyBwb2ludGVyCi0gICAgc2V0IG5vZGVNYXAoJG5ld25vZGUpICRuZXcgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIE1hcCBwb2ludGVyIHRvIFRrIHdpZGdldAotICAgIHNldCBlZGdlRmlyc3QoJG5ldykge30KLSAgICBzZXQgZWRnZVNlY29uZCgkbmV3KSB7fQotICAgIGxhcHBlbmQgbm9kZUxpc3QgJG5ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IyBLZWVwIGEgbGlzdCBvZiBhbGwgQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IyBQb2ludGVycyB3ZSd2ZSBtYWRlCi19Ci0KLSMgTWFrZSBhIG5ldyBlZGdlIGJldHdlZW4gdHdvIG5vZGVzIGFuZCBwdXQgYW4gYXJyb3cgb24gdGhlIGNhbnZhcwotcHJvYyBta0VkZ2Uge2ZpcnN0IHNlY29uZCBuZXd9IHsKLSAgICBnbG9iYWwgbm9kZVAgZWRnZUZpcnN0IGVkZ2VTZWNvbmQKLSAgICBzZXQgZWRnZSBbbWtBcnJvdyAkZmlyc3QgJHNlY29uZF0gICAgICAgICAgICAgICAgICAgOyMgTWFrZSBhbiBhcnJvdwotICAgIGxhcHBlbmQgZWRnZUZpcnN0KCRmaXJzdCkgJGVkZ2UgICAgICAgICAgICAgICAgICAgICA7IyBTYXZlIGluZm9ybWF0aW9uIAotICAgIGxhcHBlbmQgZWRnZVNlY29uZCgkc2Vjb25kKSAkZWRnZQotICAgIGlmIHskbmV3ID09IDF9IHsKLSMgTm93IGFkZCBhbiBlZGdlIHdpdGhpbiBvdXIgQyBkYXRhIHN0cnVjdHVyZQotCUFkZExpbmsgJG5vZGVQKCRmaXJzdCkgJG5vZGVQKCRzZWNvbmQpICAgICAgICAgICA7IyBBZGQgbGluayB0byBDIHN0cnVjdHVyZQotICAgIH0KLX0gCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoZXNlIGZ1bmN0aW9ucywgdGhlIGFycmF5IDx0dD5ub2RlUCgpPC90dD4gYWxsb3dzIHVzIHRvIGFzc29jaWF0ZSBhIHBhcnRpY3VsYXIgY2FudmFzIGl0ZW0gd2l0aCBhIEMgb2JqZWN0LiAgIFdoZW4gbWFuaXB1bGF0aW5nIHRoZSBncmFwaCwgdGhpcyBtYWtlcyBpdCBlYXN5IHRvIG1vdmUgZnJvbSB0aGUgVGNsIHdvcmxkIHRvIEMuICBBIHNlY29uZCBhcnJheSwgPHR0Pm5vZGVNYXAoKTwvdHQ+IGFsbG93cyB1cyB0byBnbyB0aGUgb3RoZXIgd2F5LS1tYXBwaW5nIEMgcG9pbnRlcnMgdG8gY2FudmFzIGl0ZW1zLiAgQSAgbGlzdCA8dHQ+bm9kZUxpc3Q8L3R0PiBrZWVwcyB0cmFjayBvZiBhbGwgb2YgdGhlIG5vZGVzIHdlJ3ZlIGNyZWF0ZWQganVzdCBpbiBjYXNlIHdlIHdhbnQgdG8gZXhhbWluZSBhbGwgb2YgdGhlIG5vZGVzLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBDIGZ1bmN0aW9uIGFkZGVkIG1vcmUgZWRnZXMgdG8gdGhlIGdyYXBoLiAgVG8gcmVmbGVjdCB0aGUgbmV3IHN0YXRlIG9mIHRoZSBncmFwaCwgd2Ugd291bGQgd2FudCB0byBhZGQgbW9yZSBlZGdlcyB0byB0aGUgVGsgY2FudmFzLiAgVGhpcyBtaWdodCBiZSBhY2NvbXBsaXNoZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBMb29rIGF0IHRoZSBDIGRhdGEgc3RydWN0dXJlIGFuZCB1cGRhdGUgdGhlIGNhbnZhcwotcHJvYyBta0VkZ2VzIHt9IHsKLSAgICBnbG9iYWwgbm9kZVggbm9kZVkgbm9kZVAgbm9kZU1hcCBub2RlTGlzdCBlZGdlRmlyc3QgZWRnZVNlY29uZAotICAgIHVuc2V0IGVkZ2VGaXJzdCAKLSAgICB1bnNldCBlZGdlU2Vjb25kIAotICAgIC5jIGRlbGV0ZSBhcmMgICAgICAgICAgICAgICMgRWRnZXMgaGF2ZSBiZWVuIHRhZ2dlZCB3aXRoIGFyYyAobm90IHNob3duKQotCi0gICAgZm9yZWFjaCBub2RlICRub2RlTGlzdCB7ICAgOyMgY2xlYXIgb2xkIGxpc3RzCi0Jc2V0IGVkZ2VGaXJzdCgkbm9kZSkge30KLQlzZXQgZWRnZVNlY29uZCgkbm9kZSkge30KLSAgICB9Ci0gICAgZm9yZWFjaCBub2RlICRub2RlTGlzdCB7ICAgICAgICAgICAgICAgICAgICA7IyBHbyB0aHJvdWdoIGFsbCBvZiB0aGUgbm9kZXMKLQlzZXQgdiAkbm9kZVAoJG5vZGUpICAgICAgICAgICAgICAgICAgICAgIDsjIEdldCB0aGUgbm9kZSBwb2ludGVyIAotCXNldCB2MSBbR2V0QWRqICR2XSAgICAgICAgICAgICAgICAgICAgICAgOyMgR2V0IGl0cyBhZGphY2VuY3kgbGlzdAotCXdoaWxlIHskdjEgIT0gIk5VTEwifSB7ICAgICAgICAgICAKLQkgICAgc2V0IHYyIFtHZXROb2RlICR2MV0gICAgICAgICAgICAgICAgIDsjIEdldCBub2RlIHBvaW50ZXIKLQkgICAgc2V0IHcgJG5vZGVNYXAoJHYyKSAgICAgICAgICAgICAgICAgIDsjIEdldCBjYW52YXMgaXRlbQotCSAgICBta0VkZ2UgJG5vZGUgJHcgMCAgICAgICAgICAgICAgICAgICAgOyMgTWFrZSBhbiBlZGdlIGJldHdlZW4gdGhlbQotCSAgICBzZXQgdjEgW0dldE5leHQgJHYxXSAgICAgICAgICAgICAgICAgOyMgR2V0IG5leHQgbm9kZQotCX0KLSAgICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmdW5jdGlvbiBtZXJlbHkgc2NhbnMgdGhyb3VnaCBhbGwgb2YgdGhlIG5vZGVzIGFuZCB3YWxrcyBkb3duIHRoZSBhZGphY2VuY3kgbGlzdCBvZiBlYWNoIG9uZS4gICBUaGUgPHR0Pm5vZGVNYXAoKTwvdHQ+IGFycmF5IG1hcHMgQyBwb2ludGVycyBvbnRvIHRoZSBjb3JyZXNwb25kaW5nIGNhbnZhcyBpdGVtcy4gIFdlIHVzZSB0aGlzIHRvIGNvbnN0cnVjdCBlZGdlcyBvbiB0aGUgY2FudmFzIHVzaW5nIHRoZSA8dHQ+bWtFZGdlPC90dD4gZnVuY3Rpb24uPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gQWNjZXNzaW5nIGFycmF5czwvaDI+Ci1JbiBzb21lIGNhc2VzLCBDIGZ1bmN0aW9ucyBtYXkgaW52b2x2ZSBhcnJheXMgYW5kIG90aGVyIG9iamVjdHMuICBJbiB0aGVzZSBpbnN0YW5jZXMsIHlvdSBtYXkgaGF2ZSB0byB3cml0ZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYWNjZXNzLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYSBDIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQWRkIHZlY3RvciBhK2IgLSZndDsgYwotdm9pZCB2ZWN0b3JfYWRkKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKmMsIGludCBzaXplKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBpcyBxdWl0ZSBsaXRlcmFsIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiA8dHQ+ZG91YmxlICo8L3R0Pi0taXQgaXMgYSBwb2ludGVyIHRvIGEgPHR0PmRvdWJsZTwvdHQ+LiBUbyBwcm92aWRlIGFjY2VzcywgYSBmZXcgaGVscGVyIGZ1bmN0aW9ucyBjYW4gYmUgd3JpdHRlbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNXSUcgaGVscGVyIGZ1bmN0aW9ucyBmb3IgZG91YmxlIGFycmF5cwotJWlubGluZSAlewotZG91YmxlICpuZXdfZG91YmxlKGludCBzaXplKSB7Ci0JcmV0dXJuIChkb3VibGUgKikgbWFsbG9jKHNpemUqc2l6ZW9mKGRvdWJsZSkpOwotfQotdm9pZCBkZWxldGVfZG91YmxlKGRvdWJsZSAqYSkgewotCWZyZWUgYTsKLX0KLWRvdWJsZSBnZXRfZG91YmxlKGRvdWJsZSAqYSwgaW50IGluZGV4KSB7Ci0JcmV0dXJuIGFbaW5kZXhdOwotfQotdm9pZCBzZXRfZG91YmxlKGRvdWJsZSAqYSwgaW50IGluZGV4LCBkb3VibGUgdmFsKSB7Ci0JYVtpbmRleF0gPSB2YWw7Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Vc2luZyBvdXIgQyBmdW5jdGlvbnMgbWlnaHQgd29yayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgVGNsIGNvZGUgdG8gY3JlYXRlIHNvbWUgYXJyYXlzIGFuZCBhZGQgdGhlbQotCi1zZXQgYSBbbmV3X2RvdWJsZSAyMDBdCi1zZXQgYiBbbmV3X2RvdWJsZSAyMDBdCi1zZXQgYyBbbmV3X2RvdWJsZSAyMDBdCi0KLSMgRmlsbCBhIGFuZCBiIHdpdGggc29tZSB2YWx1ZXMKLWZvciB7c2V0IGkgMH0geyRpICZsdDsgMjAwfSB7aW5jciBpIDF9IHsKLQlzZXRfZG91YmxlICRhICRpIDAuMAotCXNldF9kb3VibGUgJGIgJGkgJGkKLX0KLQotIyBBZGQgdGhlbSBhbmQgc3RvcmUgcmVzdWx0IGluIGMKLXZlY3Rvcl9hZGQgJGEgJGIgJGMgMjAwCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBmdW5jdGlvbnMgPHR0PmdldF9kb3VibGU8L3R0PiBhbmQgPHR0PnNldF9kb3VibGU8L3R0PiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheS4gICBUbyBjb252ZXJ0IGZyb20gVGNsIGxpc3RzIHRvIEMgYXJyYXlzLCBvbmUgY291bGQgd3JpdGUgYSBmZXcgZnVuY3Rpb25zIGluIFRjbCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgVGNsIFByb2NlZHVyZSB0byB0dXJuIGEgbGlzdCBpbnRvIGEgQyBhcnJheQotcHJvYyBUY2wyQXJyYXkge2x9IHsKLQlzZXQgbGVuIFtsbGVuZ3RoICRsXQotCXNldCBhIFtuZXdfZG91YmxlICRsZW5dCi0Jc2V0IGkgMAotCWZvcmVhY2ggaXRlbSAkbCB7Ci0JCXNldF9kb3VibGUgJGEgJGkgJGl0ZW0KLQkJaW5jciBpIDEKLQl9Ci0JcmV0dXJuICRhCi19Ci0KLSMgVGNsIFByb2NlZHVyZSB0byB0dXJuIGEgQyBhcnJheSBpbnRvIGEgVGNsIExpc3QKLXByb2MgQXJyYXkyVGNsIHthIHNpemV9IHsKLQlzZXQgbCB7fQotCWZvciB7c2V0IGkgMH0geyRpICZsdDsgc2l6ZX0ge2luY3IgaSAxfSB7Ci0JCWxhcHBlbmQgJGwgW2dldF9kb3VibGUgJGEgJGldCi0JfQotCXJldHVybiAkbAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSBub3Qgb3B0aW1hbCwgb25lIGNvdWxkIHVzZSB0aGVzZSB0byB0dXJuIGEgVGNsIGxpc3QgaW50byBhIEMgcmVwcmVzZW50YXRpb24uICAgVGhlIEMgcmVwcmVzZW50YXRpb24gY291bGQgYmUgdXNlZCByZXBlYXRlZGx5IGluIGEgdmFyaWV0eSBvZiAgQyBmdW5jdGlvbnMgd2l0aG91dCBoYXZpbmcgdG8gcmVwZWF0ZWRseSBjb252ZXJ0IGZyb20gc3RyaW5ncyAoT2YgY291cnNlLCBpZiB0aGUgVGNsIGxpc3QgY2hhbmdlZCBvbmUgd291bGQgd2FudCB0byB1cGRhdGUgdGhlIEMgdmVyc2lvbikuICBMaWtld2lzZSwgaXQgaXMgcmVsYXRpdmVseSBzaW1wbGUgdG8gZ28gYmFjayBmcm9tIEMgaW50byBUY2wuICAgVGhpcyBpcyBub3QgdGhlIG9ubHkgd2F5IHRvIG1hbmFnZSBhcnJheXMtLXR5cGVtYXBzIGNhbiBiZSB1c2VkIGFzIHdlbGwuICAgVGhlIFNXSUcgbGlicmFyeSBmaWxlIGA8dHQ+YXJyYXkuaTwvdHQ+JyBhbHNvIGNvbnRhaW5zIGEgdmFyaWV0eSBvZiBwcmUtd3JpdHRlbiBoZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBkaWZmZXJlbnQga2luZHMgb2YgYXJyYXlzLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDI+IEJ1aWxkaW5nIGEgc2ltcGxlIE9wZW5HTCBtb2R1bGU8L2gyPgotSW4gdGhpcyBleGFtcGxlLCB3ZSBjb25zaWRlciBidWlsZGluZyBhIFNXSUcgbW9kdWxlIG91dCBvZiB0aGUgT3BlbkdMIGdyYXBoaWNzIGxpYnJhcnkuICBUaGUgT3BlbkdMIGxpYnJhcnkgY29uc2lzdHMgb2Ygc2V2ZXJhbCBodW5kcmVkIGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcgY29tcGxleCAzRCBpbWFnZXMuICAgQnkgd3JhcHBpbmcgdGhpcyBsaWJyYXJ5LCB3ZSB3aWxsIGJlIGFibGUgdG8gcGxheSB3aXRoIGl0IGludGVyYWN0aXZlbHkgZnJvbSBhIFRjbCBpbnRlcnByZXRlci48cD4KLTxhIG5hbWU9Im40NSI+PC9hPjxoMz4gUmVxdWlyZWQgZmlsZXM8L2gzPgotVG8gYnVpbGQgYW4gT3BlbkdMIG1vZHVsZSwgeW91IHdpbGwgbmVlZCB0byBoYXZlIHNvbWUgdmFyaWFudCBvZiBPcGVuR0wgaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZS4gIElmIHVuYXZhaWxhYmxlLCB0aGUgTWVzYSBncmFwaGljcyBsaWJyYXJ5IGlzIGFuIE9wZW5HTCBjbG9uZSB0aGF0IHJ1bnMgb24gbW9zdCBtYWNoaW5lcyB0aGF0IHN1cHBvcnQgWDExLiAgIFdlIHdpbGwgdXNlIHRoZSAiR0wvZ2wuaCIsICJHTC9nbHUuaCIsIGFuZCB0aGUgR0wgQXV4aWxsaWFyeSBsaWJyYXJpZXMuPHA+Ci08YSBuYW1lPSJuNDYiPjwvYT48aDM+IFdyYXBwaW5nIGdsLmg8L2gzPgotVGhlIGZpcnN0IHN0ZXAgaXMgdG8gYnVpbGQgYW4gaW50ZXJmYWNlIGZyb20gdGhlIGdsLmggZmlsZS4gIFRvIGRvIHRoaXMsIGZvbGxvdyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5Db3B5IHRoZSBmaWxlIDx0dD5nbC5oPC90dD4gdG8gYSBmaWxlIDx0dD5nbC5pPC90dD4gd2hpY2ggd2lsbCBiZWNvbWUgdGhlIGludGVyZmFjZS4KLTxsaT5FZGl0IHRoZSA8dHQ+Z2wuaTwvdHQ+IGZpbGUgYnkgdGFraW5nIG91dCB1bm5lZWRlZCBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFuZCBhbnkgb3RoZXIgY2x1dHRlciB0aGF0IHlvdSBmaW5kLgotPGxpPlB1dCB0aGUgZm9sbG93aW5nIGNvZGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGU8dHQ+IGdsLmk8L3R0PiBmaWxlCi08YmxvY2txdW90ZT48cHJlPgotLy8gZ2wuaSA6IFNXSUcgZmlsZSBmb3IgT3BlbkdMCi0lbW9kdWxlIGdsCi0lewotI2luY2x1ZGUgJmx0O0dML2dsLmgmZ3Q7Ci0lfQotCi0uLi4gUmVzdCBvZiBlZGl0ZWQgZ2wuaCBmaWxlIGhlcmUgLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTwvdWw+Ci08cD4KLUEgY3JpdGljYWwgcGFydCBvZiB0aGlzIGZpcnN0IHN0ZXAgaXMgbWFraW5nIHN1cmUgeW91IGhhdmUgdGhlIHByb3BlciBzZXQgb2YgdHlwZWRlZnMgaW4gdGhlIDx0dD5nbC5pPC90dD4gZmlsZS4gIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIHNob3VsZCBpbmNsdWRlIGRlZmluaXRpb25zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xlbnVtOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMYm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Ci10eXBlZGVmIHNpZ25lZCBjaGFyIEdMYnl0ZTsKLXR5cGVkZWYgc2hvcnQgR0xzaG9ydDsKLXR5cGVkZWYgaW50IEdMaW50OwotdHlwZWRlZiBpbnQgR0xzaXplaTsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBHTHVieXRlOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKLXR5cGVkZWYgZmxvYXQgR0xmbG9hdDsKLXR5cGVkZWYgZmxvYXQgR0xjbGFtcGY7Ci10eXBlZGVmIGRvdWJsZSBHTGRvdWJsZTsKLXR5cGVkZWYgZG91YmxlIEdMY2xhbXBkOwotdHlwZWRlZiB2b2lkIEdMdm9pZDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40NyI+PC9hPjxoMz4gV3JhcHBpbmcgZ2x1Lmg8L2gzPgotTmV4dCB3ZSB3cml0ZSBhIG1vZHVsZSBmb3IgdGhlIGdsdSBsaWJyYXJ5LiAgIFRoZSBwcm9jZWR1cmUgaXMgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIDx0dD5nbC5oPC90dD4tLXRoYXQgaXMsIHdlJ2xsIGNvcHkgdGhlIGhlYWRlciBmaWxlIGFuZCBlZGl0IGl0IHNsaWdodGx5LiAgICBJbiB0aGlzIGNhc2UsIDx0dD5nbHUuaDwvdHQ+IGNvbnRhaW5zIGEgZmV3IGZ1bmN0aW9ucyBpbnZvbHZpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGFycmF5cy4gICBUaGVzZSBtYXkgZ2VuZXJhdGUgZXJyb3JzIG9yIHdhcm5pbmdzLiAgQXMgYSByZXN1bHQsIHdlIGNhbiBzaW1wbHkgZWRpdCB0aG9zZSBkZWNsYXJhdGlvbnMgb3V0LiAgRm9ydHVuYXRlbHksIHRoZXJlIGFyZW4ndCBtYW55IGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMuICAgSWYgYWNjZXNzIGlzIHJlcXVpcmVkIGxhdGVyLCB0aGUgcHJvYmxlbSBjYW4gb2Z0ZW4gYmUgZml4ZWQgd2l0aCB0eXBlbWFwcyBhbmQgaGVscGVyIGZ1bmN0aW9ucy4gVGhlIGZpbmFsIDx0dD5nbHUuaTwvdHQ+IGZpbGUgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZ2x1Ci0lewotI2luY2x1ZGUgJmx0O0dML2dsdS5oJmd0OwotJX0KLQotLi4uIHJlc3Qgb2YgZWRpdGVkIGdsdS5oIGZpbGUgaGVyZSAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotR2l2ZW4gdGhlc2UgdHdvIGZpbGVzLCB3ZSBoYXZlIGEgZmFpcmx5IGNvbXBsZXRlIE9wZW5HTCBwYWNrYWdlLiBVbmZvcnR1bmF0ZWx5LCB3ZSBzdGlsbCBkb24ndCBoYXZlIGFueSBtZWNoYW5pc20gZm9yIG9wZW5pbmcgYSBHTCB3aW5kb3cgYW5kIGNyZWF0aW5nIGltYWdlcy4gICBUbyB0byB0aGlzLCB3ZSBjYW4gd3JhcCB0aGUgT3BlbkdMIGF1eGlsbGlhcnkgbGlicmFyeSB3aGljaCBjb250YWlucyBmdW5jdGlvbnMgdG8gb3BlbiB3aW5kb3dzIGFuZCBkcmF3IHZhcmlvdXMga2luZHMgb2Ygb2JqZWN0cyAod2hpbGUgbm90IHRoZSBtb3N0IHBvd2VyZnVsIGFwcHJvYWNoLCBpdCBpcyB0aGUgc2ltcGxlc3QgdG8gaW1wbGVtZW50IGFuZCB3b3JrcyBvbiBtb3N0IG1hY2hpbmVzKS48cD4KLTxhIG5hbWU9Im40OCI+PC9hPjxoMz4gV3JhcHBpbmcgdGhlIGF1eCBsaWJyYXJ5PC9oMz4KLVdyYXBwaW5nIHRoZSBhdXggbGlicmFyeSBmb2xsb3dzIGV4YWN0bHkgdGhlIHNhbWUgcHJvY2VkdXJlIGFzIGJlZm9yZS4gICBZb3Ugd2lsbCBjcmVhdGUgYSBmaWxlIDx0dD5nbGF1eC5pPC90dD4gc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBGaWxlIDpnbGF1eC5pCi0lbW9kdWxlIGdsYXV4Ci0lewotI2luY2x1ZGUgImdsYXV4LmgiCi0lfQotCi0uLi4gUmVzdCBvZiBlZGl0ZWQgZ2xhdXguaCBmaWxlIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNDkiPjwvYT48aDM+IEEgZmV3IGhlbHBlciBmdW5jdGlvbnM8L2gzPgotRmluYWxseSwgdG8gbWFrZSBvdXIgbGlicmFyeSBhIGxpdHRsZSBlYXNpZXIgdG8gdXNlLCB3ZSBuZWVkIHRvIGhhdmUgYSBmZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBhcnJheXMgc2luY2UgcXVpdGUgYSBmZXcgT3BlbkdMIGNhbGxzIHVzZSB0aGVtIGFzIGFyZ3VtZW50cy4gIFNtYWxsIDQgZWxlbWVudCBhcnJheXMgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgc28gd2UnbGwgY3JlYXRlIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMgaW4gYSBmaWxlIGNhbGxlZCA8dHQ+aGVscC5pLjwvdHQ+PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gaGVscC5pIDogT3BlbkdMIGhlbHBlciBmdW5jdGlvbnMKLQotJWlubGluZSAlewotR0xmbG9hdCAqbmV3ZnY0KEdMZmxvYXQgYSxHTGZsb2F0IGIsR0xmbG9hdCBjLEdMZmxvYXQgZCkgewotICBHTGZsb2F0ICpmOwotICBmID0gKEdMZmxvYXQgKikgbWFsbG9jKDQqc2l6ZW9mKEdMZmxvYXQpKTsKLSAgZlswXSA9IGE7IGZbMV0gPSBiOyBmWzJdID0gYzsgZlszXSA9IGQ7Ci0gIHJldHVybiBmOwotfQotdm9pZCBzZXRmdjQoR0xmbG9hdCAqZnYsIEdMZmxvYXQgYSwgR0xmbG9hdCBiLCBHTGZsb2F0IGMsIEdMZmxvYXQgZCkgewotICBmdlswXSA9IGE7IGZ2WzFdID0gYjsgZnZbMl0gPSBjOyBmdlszXSA9IGQ7Ci19Ci0lfQotJW5hbWUoZGVsZnY0KSB2b2lkIGZyZWUodm9pZCAqKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41MCI+PC9hPjxoMz4gQW4gT3BlbkdMIHBhY2thZ2U8L2gzPgotV2hldywgd2UncmUgYWxtb3N0IGRvbmUgbm93LiAgIFRoZSBsYXN0IHRoaW5nIHRvIGRvIGlzIHRvIHBhY2thZ2UgdXAgYWxsIG9mIG91ciBpbnRlcmZhY2UgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlIGNhbGxlZCA8dHQ+b3BlbmdsLmk8L3R0Pi4gIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8KLS8vIG9wZW5nbC5pLiAgICBTV0lHIEludGVyZmFjZSBmaWxlIGZvciBPcGVuR0wKLSVtb2R1bGUgb3BlbmdsCi0KLSVpbmNsdWRlIGdsLmkgICAgICAgICAvLyBUaGUgbWFpbiBHTCBmdW5jdGlvbnMKLSVpbmNsdWRlIGdsdS5pICAgICAgICAvLyBUaGUgR0xVIGxpYnJhcnkKLSVpbmNsdWRlIGdsYXV4LmkgICAgICAvLyBUaGUgYXV4IGxpYnJhcnkKLSVpbmNsdWRlIGhlbHAuaSAgICAgICAvLyBPdXIgaGVscGVyIGZ1bmN0aW9ucwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBidWlsZCB0aGUgbW9kdWxlLCB3ZSBjYW4gc2ltcGx5IHJ1biBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBzd2lnIC10Y2wgb3BlbmdsLmkgICAgICAgICAgICMgIEJ1aWxkIGEgZHluYW1pY2x5IGxvYWRlZCBleHRlbnNpb24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3I8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtdGNsIC1sd2lzaC5pIG9wZW5nbC5pICAjIEJ1aWxkIGEgc3RhdGljYWxseSBsaW5rZWQgd2lzaCBleGVjdXRhYmxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUNvbXBpbGUgdGhlIGZpbGUgPHR0Pm9wZW5nbF93cmFwLmM8L3R0PiB3aXRoIHlvdXIgQyBjb21waWxlciBhbmQgbGluayB3aXRoIFRjbCwgVGssIGFuZCBPcGVuR0wgdG8gY3JlYXRlIHRoZSBmaW5hbCBtb2R1bGUuPHA+Ci08YSBuYW1lPSJuNTEiPjwvYT48aDM+IFVzaW5nIHRoZSBPcGVuR0wgbW9kdWxlPC9oMz4KLVRoZSBtb2R1bGUgaXMgbm93IHVzZWQgYnkgd3JpdGluZyBhIFRjbCBzY3JpcHQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vb3BlbmdsLnNvCi1hdXhJbml0RGlzcGxheU1vZGUgW2V4cHIgeyRBVVhfU0lOR0xFIHwgJEFVWF9SR0JBIHwgJEFVWF9ERVBUSH1dCi1hdXhJbml0UG9zaXRpb24gMCAwIDUwMCA1MDAKLWF1eEluaXRXaW5kb3cgIkxpdC1TcGhlcmUiCi0KLSMgc2V0IHVwIG1hdGVyaWFsIHByb3BlcnRpZXMKLXNldCBtYXRfc3BlY3VsYXIgW25ld2Z2NCAxLjAgMS4wIDEuMCAxLjBdCi1zZXQgbWF0X3NoaW5pbmVzcyBbbmV3ZnY0IDUwLjAgMCAwIDBdCi1zZXQgbGlnaHRfcG9zaXRpb24gW25ld2Z2NCAxLjAgMS4wIDEuMCAwLjBdCi0KLWdsTWF0ZXJpYWxmdiAkR0xfRlJPTlQgJEdMX1NQRUNVTEFSICRtYXRfc3BlY3VsYXIKLWdsTWF0ZXJpYWxmdiAkR0xfRlJPTlQgJEdMX1NISU5JTkVTUyAkbWF0X3NoaW5pbmVzcwotZ2xMaWdodGZ2ICRHTF9MSUdIVDAgJEdMX1BPU0lUSU9OICRsaWdodF9wb3NpdGlvbgotZ2xFbmFibGUgJEdMX0xJR0hUSU5HCi1nbEVuYWJsZSAkR0xfTElHSFQwCi1nbERlcHRoRnVuYyAkR0xfTEVRVUFMCi1nbEVuYWJsZSAkR0xfREVQVEhfVEVTVAotCi0jIFNldCB1cCB2aWV3Ci1nbENsZWFyQ29sb3IgMCAwIDAgMAotZ2xDb2xvcjNmIDEuMCAxLjAgMS4wCi1nbE1hdHJpeE1vZGUgJEdMX1BST0pFQ1RJT04KLWdsTG9hZElkZW50aXR5Ci1nbE9ydGhvIC0xIDEgLTEgMSAtMSAxCi1nbE1hdHJpeE1vZGUgJEdMX01PREVMVklFVwotZ2xMb2FkSWRlbnRpdHkKLQotIyBEcmF3IGl0Ci1nbENsZWFyICRHTF9DT0xPUl9CVUZGRVJfQklUCi1nbENsZWFyICRHTF9ERVBUSF9CVUZGRVJfQklUCi1hdXhTb2xpZFNwaGVyZSAwLjUKLQotIyBDbGVhbiB1cAotZGVsZnY0ICRtYXRfc3BlY3VsYXIKLWRlbGZ2NCAkbWF0X3NoaW5pbmVzcwotZGVsZnY0ICRsaWdodF9wb3NpdGlvbgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiBvdXIgaW50ZXJwcmV0ZWQgaW50ZXJmYWNlLCBpdCBpcyBwb3NzaWJsZSB0byBpbnRlcmFjdGl2ZWx5IGNoYW5nZSBwYXJhbWV0ZXJzIGFuZCBzZWUgdGhlIGVmZmVjdHMgb2YgdmFyaW91cyBPcGVuR0wgZnVuY3Rpb25zLiAgVGhpcyBhIGdyZWF0IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdmFyaW91cyBmdW5jdGlvbnMgZG8gYW5kIHRvIHRyeSBkaWZmZXJlbnQgdGhpbmdzIHdpdGhvdXQgaGF2aW5nIHRvIHJlY29tcGlsZSBhbmQgcnVuIGFmdGVyIGVhY2ggY2hhbmdlLjxwPgotPGEgbmFtZT0ibjUyIj48L2E+PGgzPiBQcm9ibGVtcyB3aXRoIHRoZSBPcGVuR0wgaW50ZXJmYWNlPC9oMz4KLVdoaWxlIHRoZSBPcGVuR0wgaW50ZXJmYWNlIHdlIGhhdmUgZ2VuZXJhdGVkIGlzIGZ1bGx5IHVzYWJsZSwgaXQgaXMgbm90IHdpdGhvdXQgcHJvYmxlbXMuPHA+Ci08cD4KLTx1bD4KLTxsaT5PcGVuR0wgY29uc3RhbnRzIGFyZSBpbnN0YWxsZWQgYXMgZ2xvYmFsIHZhcmlhYmxlcy4gIEFzIGEgcmVzdWx0LCBpdCBpcyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBnbG9iYWwga2V5d29yZCB3aGVuIHdyaXRpbmcgVGNsIHN1YnJvdXRpbmVzLiAgRm9yIGV4YW1wbGUgOgotPGJsb2NrcXVvdGU+PHByZT4KLXByb2MgY2xlYXJfc2NyZWFuIHsgfSB7Ci0JZ2xvYmFsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0RFUFRIX0JVRkZFUl9CSVQKLQlnbENsZWFyICRHTF9DT0xPUl9CVUZGRVJfQklUCi0JZ2xDbGVhciAkR0xfREVQVEhfQlVGRkVSX0JJVAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08bGk+QXJyYXlzIG5lZWQgdG8gYmUgYWNjZXNzZWQgdmlhIGhlbHBlciBmdW5jdGlvbnMgc3VjaCBhcyBvdXIgPHR0Pm5ld2Z2NDwvdHQ+KCkgZnVuY3Rpb24uICAgVGhpcyBhcHByb2FjaCBjZXJ0YWlubHkgd29ya3MgYW5kIGl0cyBlYXN5IGVub3VnaCB0byBpbXBsZW1lbnQsIGJ1dCBpdCBtYXkgYmUgcHJlZmVyYWJsZSB0byBjYWxsIGNlcnRhaW4gT3BlbkdMIGZ1bmN0aW9ucyB3aXRoIGEgVGNsIGxpc3QgaW5zdGVhZC4gIEZvciBleGFtcGxlIDoKLTxibG9ja3F1b3RlPjxwcmU+Ci1nbE1hdGVyaWFsZnYgJEdMX0ZST05UICRHTF9TUEVDVUxBUiB7MS4wIDEuMCAxLjAgMS4wfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPC91bD4KLTxwPgotV2hpbGUgdGhlc2UgYXJlIG9ubHkgbWlub3IgYW5ub3lhbmNlcywgaXQgdHVybnMgb3V0IHRoYXQgeW91IGNhbiBhZGRyZXNzIGJvdGggcHJvYmxlbXMgdXNpbmcgU1dJRyB0eXBlbWFwcyAod2hpY2ggYXJlIGRpc2N1c3NlZCBzaG9ydGx5KS48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gRXhjZXB0aW9uIGhhbmRsaW5nIDwvaDI+Ci1UaGUgPHR0PiVleGNlcHQ8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgdXNlci1kZWZpbmFibGUgZXhjZXB0aW9uIGhhbmRsZXIgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgZXhjZXB0aW9ucyBpbiB5b3VyIEMvQysrIHByb2dyYW0gaW50byBUY2wgZXhjZXB0aW9ucy4gIFRoZSBjaGFwdGVyIG9uIGV4Y2VwdGlvbiBoYW5kbGluZyBjb250YWlucyBtb3JlIGRldGFpbHMsIGJ1dCBzdXBwb3NlIHlvdSBleHRlbmRlZCB0aGUgYXJyYXkgZXhhbXBsZSBpbnRvIGEgQysrIGNsYXNzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgUmFuZ2VFcnJvciB7fTsgICAvLyBVc2VkIGZvciBhbiBleGNlcHRpb24KLQotY2xhc3MgRG91YmxlQXJyYXkgewotICBwcml2YXRlOgotICAgIGludCBuOwotICAgIGRvdWJsZSAqcHRyOwotICBwdWJsaWM6Ci0gICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IG9mIGZpeGVkIHNpemUKLSAgICBEb3VibGVBcnJheShpbnQgc2l6ZSkgewotICAgICAgcHRyID0gbmV3IGRvdWJsZVtzaXplXTsKLSAgICAgIG4gPSBzaXplOwotICAgIH0KLSAgICAvLyBEZXN0cm95IGFuIGFycmF5Ci0gICAgfkRvdWJsZUFycmF5KCkgewotICAgICAgIGRlbGV0ZSBwdHI7Ci0gICAgfQotICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheQotICAgIGludCAgIGxlbmd0aCgpIHsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIC8vIEdldCBhbiBpdGVtIGZyb20gdGhlIGFycmF5IGFuZCBwZXJmb3JtIGJvdW5kcyBjaGVja2luZy4KLSAgICBkb3VibGUgZ2V0aXRlbShpbnQgaSkgewotICAgICAgaWYgKChpICZndDs9IDApICZhbXA7JmFtcDsgKGkgJmx0OyBuKSkKLSAgICAgICAgcmV0dXJuIHB0cltpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgIH0KLQotICAgIC8vIFNldCBhbiBpdGVtIGluIHRoZSBhcnJheSBhbmQgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcuCi0gICAgdm9pZCBzZXRpdGVtKGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICBpZiAoKGkgJmd0Oz0gMCkgJmFtcDsmYW1wOyAoaSAmbHQ7IG4pKQotICAgICAgICBwdHJbaV0gPSB2YWw7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgICAgfQotICAgIH0KLSAgfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBjYW4gdGhyb3cgYSBDKysgcmFuZ2UgZXhjZXB0aW9uIGZvciBhbiBvdXQtb2YtYm91bmRzIGFycmF5IGFjY2Vzcy4gICBXZSBjYW4gY2F0Y2ggdGhpcyBpbiBvdXIgVGNsIGV4dGVuc2lvbiBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQodGNsKSB7Ci0gIHRyeSB7Ci0gICAgJGZ1bmN0aW9uICAgICAgICAgICAgICAgIC8vIEdldHMgc3Vic3RpdHV0ZWQgYnkgYWN0dWFsIGZ1bmN0aW9uIGNhbGwKLSAgfQotICBjYXRjaCAoUmFuZ2VFcnJvcikgewotICAgIGludGVycC0mZ3Q7cmVzdWx0ID0gIkFycmF5IGluZGV4IG91dC1vZi1ib3VuZHMiOwotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0gIH0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3IgaW4gVGNsIDguMDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQodGNsOCkgewotICB0cnkgewotICAgICRmdW5jdGlvbiAgICAgICAgICAgICAgICAvLyBHZXRzIHN1YnN0aXR1dGVkIGJ5IGFjdHVhbCBmdW5jdGlvbiBjYWxsCi0gIH0KLSAgY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLSAgICBUY2xfU2V0U3RyaW5nT2JqKHRjbF9yZXN1bHQsIkFycmF5IGluZGV4IG91dC1vZi1ib3VuZHMiKTsKLSAgICByZXR1cm4gVENMX0VSUk9SOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdGhlIEMrKyBjbGFzcyB0aHJvd3MgYSA8dHQ+UmFuZ2VFcnJvcjwvdHQ+IGV4Y2VwdGlvbiwgb3VyIHdyYXBwZXIgZnVuY3Rpb25zIHdpbGwgY2F0Y2ggaXQsIHR1cm4gaXQgaW50byBhIFRjbCBleGNlcHRpb24sIGFuZCBhbGxvdyBhIGdyYWNlZnVsIGRlYXRoIGFzIG9wcG9zZWQgdG8ganVzdCBoYXZpbmcgc29tZSBzb3J0IG9mIG15c3RlcmlvdXMgcHJvZ3JhbSBjcmFzaC4gICAgIFdlIGFyZSBub3QgbGltaXRlZCB0byBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLiAgIFBsZWFzZSBzZWUgdGhlIGNoYXB0ZXIgb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBtb3JlIGRldGFpbHMgb24gb3RoZXIgcG9zc2liaWxpdGllcywgaW5jbHVkaW5nIGEgbWV0aG9kIGZvciBsYW5ndWFnZS1pbmRlcGVuZGVudCBleGNlcHRpb24gaGFuZGxpbmcuLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBUeXBlbWFwczwvaDI+Ci1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyBTV0lHJ3MgdHJlYXRtZW50IG9mIHZhcmlvdXMgQy9DKysgZGF0YXR5cGVzIGNhbiBiZSByZW1hcHBlZCB1c2luZyB0aGUgPHR0PiV0eXBlbWFwPC90dD4gZGlyZWN0aXZlLiAgIFdoaWxlIG5vdCByZXF1aXJlZCwgdGhpcyBzZWN0aW9uIGFzc3VtZXMgc29tZSBmYW1pbGlhcml0eSB3aXRoICBUY2wncyBDIEFQSS4gICBUaGUgcmVhZGVyIGlzIGFkdmlzZWQgdG8gY29uc3VsdCAgYSBUY2wgYm9vay4gIEEgZ2xhbmNlIGF0IHRoZSBjaGFwdGVyIG9uIFNXSUcgdHlwZW1hcHMgd2lsbCBhbHNvIGJlIHVzZWZ1bC4gIDxwPgotPGEgbmFtZT0ibjUzIj48L2E+PGgzPiBXaGF0IGlzIGEgdHlwZW1hcD88L2gzPgotQSB0eXBlbWFwIGlzIG1lY2hhbmlzbSBieSB3aGljaCBTV0lHJ3MgcHJvY2Vzc2luZyBvZiBhIHBhcnRpY3VsYXIgQyBkYXRhdHlwZSBjYW4gYmUgY2hhbmdlZC4gICBBIHNpbXBsZSB0eXBlbWFwIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLQotJXR5cGVtYXAodGNsLGluKSBpbnQgewotCSR0YXJnZXQgPSAoaW50KSBhdG9pKCRzb3VyY2UpOwotCXByaW50ZigiUmVjZWl2ZWQgYW4gaW50ZWdlciA6ICVkXG4iLCR0YXJnZXQpOwotfQotLi4uCi1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UeXBlbWFwcyByZXF1aXJlIGEgbGFuZ3VhZ2UgIG5hbWUsICBtZXRob2QgbmFtZSwgZGF0YXR5cGUsIGFuZCBjb252ZXJzaW9uIGNvZGUuICBGb3IgVGNsLCAidGNsIiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgbGFuZ3VhZ2UgbmFtZS4gIEZvciBUY2wgOC4wLCAidGNsOCIgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSB1c2luZyB0aGUgbmF0aXZlIG9iamVjdCBpbnRlcmZhY2UuIFRoZSAiaW4iIG1ldGhvZCBpbiB0aGlzIGV4YW1wbGUgcmVmZXJzIHRvIGFuIGlucHV0IGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24uIFRoZSBkYXRhdHlwZSBgaW50JyB0ZWxscyBTV0lHIHRoYXQgd2UgYXJlIHJlbWFwcGluZyBpbnRlZ2Vycy4gIFRoZSBzdXBwbGllZCBjb2RlIGlzIHVzZWQgdG8gY29udmVydCBmcm9tIGEgVGNsIHN0cmluZyB0byB0aGUgY29ycmVzcG9uZGluZyBDIGRhdGF0eXBlLiAgV2l0aGluIHRoZSBzdXBwb3J0aW5nIEMgY29kZSwgdGhlIHZhcmlhYmxlIDx0dD4kc291cmNlPC90dD4gY29udGFpbnMgdGhlIHNvdXJjZSBkYXRhIChhIHN0cmluZyBpbiB0aGlzIGNhc2UpIGFuZCA8dHQ+JHRhcmdldDwvdHQ+IGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGNvbnZlcnNpb24gKGEgQyBsb2NhbCB2YXJpYWJsZSkuICA8cD4KLTxwPgotV2hlbiB0aGUgZXhhbXBsZSBpcyBjb21waWxlZCBpbnRvIGEgVGNsIG1vZHVsZSwgaXQgd2lsbCBvcGVyYXRlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgZmFjdCA2Ci1SZWNlaXZlZCBhbiBpbnRlZ2VyIDogNgotNzIwCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUEgZnVsbCBkaXNjdXNzaW9uIG9mIHR5cGVtYXBzIGNhbiBiZSBmb3VuZCBpbiB0aGUgbWFpbiBTV0lHIHVzZXJzIHJlZmVyZW5jZS4gIFdlIHdpbGwgcHJpbWFyaWx5IGJlIGNvbmNlcm5lZCB3aXRoIFRjbCB0eXBlbWFwcyBoZXJlLjxwPgotPGEgbmFtZT0ibjU0Ij48L2E+PGgzPiBUY2wgdHlwZW1hcHM8L2gzPgotVGhlIGZvbGxvd2luZyB0eXBlbWFwIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBUY2wgbW9kdWxlcyA6PHA+Ci08cD4KLTx0dD4ldHlwZW1hcCh0Y2wsaW4pPC90dD4JQ29udmVydHMgYSBzdHJpbmcgdG8gaW5wdXQgZnVuY3Rpb24gYXJndW1lbnRzPHA+Ci08dHQ+JXR5cGVtYXAodGNsLG91dCk8L3R0PglDb252ZXJ0cyByZXR1cm4gdmFsdWUgb2YgYSBDIGZ1bmN0aW9uIHRvIGEgc3RyaW5nPHA+Ci08dHQ+JXR5cGVtYXAodGNsLGZyZWVhcmcpPC90dD4JQ2xlYW5zIHVwIGEgZnVuY3Rpb24gYXJndW1lbnQgKGlmIG5lY2Vzc2FyeSk8cD4KLTx0dD4ldHlwZW1hcCh0Y2wsYXJnb3V0KTwvdHQ+CU91dHB1dCBhcmd1bWVudCBwcm9jZXNzaW5nPHA+Ci08dHQ+JXR5cGVtYXAodGNsLHJldCk8L3R0PglDbGVhbnVwIG9mIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXM8cD4KLTx0dD4ldHlwZW1hcCh0Y2wsY29uc3QpPC90dD4JQ3JlYXRpb24gb2YgVGNsIGNvbnN0YW50czxwPgotPHR0PiV0eXBlbWFwKG1lbWJlcmluKTwvdHQ+CVNldHRpbmcgb2YgQysrIG1lbWJlciBkYXRhPHA+Ci08dHQ+JXR5cGVtYXAobWVtYmVyb3V0KTwvdHQ+CVJldHVybiBvZiBDKysgbWVtYmVyIGRhdGE8cD4KLTx0dD4ldHlwZW1hcCh0Y2wsIGNoZWNrKTwvdHQ+CUNoZWNrIHZhbHVlIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy48cD4KLTxhIG5hbWU9Im41NSI+PC9hPjxoMz4gVHlwZW1hcCB2YXJpYWJsZXM8L2gzPgotVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHVzZWQgd2l0aGluIHRoZSBDIGNvZGUgdXNlZCBpbiBhIHR5cGVtYXA6PHA+Ci08cD4KLTx0dD4kc291cmNlPC90dD4JU291cmNlIHZhbHVlIG9mIGEgY29udmVyc2lvbjxwPgotPHR0PiR0YXJnZXQ8L3R0PglUYXJnZXQgb2YgY29udmVyc2lvbiAod2hlcmUgdGhlIHJlc3VsdCBzaG91bGQgYmUgc3RvcmVkKTxwPgotPHR0PiR0eXBlPC90dD4JQyBkYXRhdHlwZSBiZWluZyByZW1hcHBlZDxwPgotPHR0PiRtYW5nbGU8L3R0PglNYW5nbGVkIHZlcnNpb24gb2YgZGF0YSAodXNlZCBmb3IgcG9pbnRlciB0eXBlLWNoZWNraW5nKTxwPgotPHR0PiR2YWx1ZTwvdHQ+CVZhbHVlIG9mIGEgY29uc3RhbnQgKGNvbnN0IHR5cGVtYXAgb25seSk8cD4KLTx0dD4kYXJnPC90dD4JT3JpZ2luYWwgZnVuY3Rpb24gYXJndW1lbnQgKHVzdWFsbHkgYSBzdHJpbmcpPHA+Ci08YSBuYW1lPSJuNTYiPjwvYT48aDM+IE5hbWUgYmFzZWQgdHlwZSBjb252ZXJzaW9uPC9oMz4KLVR5cGVtYXBzIGFyZSBiYXNlZCBib3RoIG9uIHRoZSBkYXRhdHlwZSBhbmQgYW4gb3B0aW9uYWwgbmFtZSBhdHRhY2hlZCB0byBhIGRhdGF0eXBlLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGZvbwotCi0vLyBUaGlzIHR5cGVtYXAgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBjaGFyICoqIGZ1bmN0aW9uIGFyZ3VtZW50cwotJXR5cGVtYXAodGNsLGluKSBjaGFyICoqIHsgLi4uIH0KLQotLy8gVGhpcyB0eXBlbWFwIGlzIGFwcGxpZWQgb25seSB0byBjaGFyICoqIGFyZ3VtZW50cyBuYW1lZCBgYXJndicKLSV0eXBlbWFwKHRjbCxpbikgY2hhciAqKmFyZ3YgeyAuLi4gfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGV4YW1wbGUsIHR3byB0eXBlbWFwcyBhcmUgYXBwbGllZCB0byB0aGUgPHR0PmNoYXIgKio8L3R0PiBkYXRhdHlwZS4gIEhvd2V2ZXIsIHRoZSBzZWNvbmQgdHlwZW1hcCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBhcmd1bWVudHMgbmFtZWQgYDx0dD5hcmd2PC90dD4nLiAgQSBuYW1lZCB0eXBlbWFwIHdpbGwgYWx3YXlzIG92ZXJyaWRlIGFuIHVubmFtZWQgdHlwZW1hcC48cD4KLTxwPgotRHVlIHRvIHRoZSBuYW1lLWJhc2VkIG5hdHVyZSBvZiB0eXBlbWFwcywgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0eXBlbWFwcyBhcmUgaW5kZXBlbmRlbnQgb2YgdHlwZWRlZiBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAodGNsLCBpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotdm9pZCBmb28oZG91YmxlKTsgICAgICAgICAgICAvLyBVc2VzIHRoZSBhYm92ZSB0eXBlbWFwCi10eXBlZGVmIGRvdWJsZSBSZWFsOwotdm9pZCBiYXIoUmVhbCk7ICAgICAgICAgICAgICAvLyBEb2VzIG5vdCB1c2UgdGhlIGFib3ZlIHR5cGVtYXAgKGRvdWJsZSAhPSBSZWFsKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBnZXQgYXJvdW5kIHRoaXMgcHJvYmxlbSwgdGhlIDx0dD4lYXBwbHk8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewotCS4uLiBnZXQgYSBkb3VibGUgLi4uCi19Ci12b2lkIGZvbyhkb3VibGUpOwotCi10eXBlZGVmIGRvdWJsZSBSZWFsOyAgICAgICAgIC8vIFVzZXMgdHlwZW1hcAotJWFwcGx5IGRvdWJsZSB7IFJlYWwgfTsgICAgICAvLyBBcHBsaWVzIGFsbCAiZG91YmxlIiB0eXBlbWFwcyB0byBSZWFsLgotdm9pZCBiYXIoUmVhbCk7ICAgICAgICAgICAgICAvLyBOb3cgdXNlcyB0aGUgc2FtZSB0eXBlbWFwLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjU3Ij48L2E+PGgzPiBDb252ZXJ0aW5nICBhIFRjbCBsaXN0IHRvIGEgY2hhciAqKiA8L2gzPgotQSBjb21tb24gcHJvYmxlbSBpbiBtYW55IEMgcHJvZ3JhbXMgaXMgdGhlIHByb2Nlc3Npbmcgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgd2hpY2ggYXJlIHVzdWFsbHkgcGFzc2VkIGluIGFuIGFycmF5IG9mIE5VTEwgdGVybWluYXRlZCBzdHJpbmdzLiAgIFRoZSBmb2xsb3dpbmcgU1dJRyBpbnRlcmZhY2UgZmlsZSBhbGxvd3MgYSBUY2wgbGlzdCB0byBiZSB1c2VkIGFzIGEgPHR0PmNoYXIgKio8L3R0PiBvYmplY3QuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBhcmd2Ci0KLS8vIFRoaXMgdGVsbHMgU1dJRyB0byB0cmVhdCBjaGFyICoqIGFzIGEgc3BlY2lhbCBjYXNlCi0ldHlwZW1hcCh0Y2wsaW4pIGNoYXIgKiogewotICAgICAgICBpbnQgdGVtcGM7Ci0gICAgICAgIGlmIChUY2xfU3BsaXRMaXN0KGludGVycCwkc291cmNlLCZhbXA7dGVtcGMsJmFtcDskdGFyZ2V0KSA9PSBUQ0xfRVJST1IpIAotCQlyZXR1cm4gVENMX0VSUk9SOwotfQotCi0vLyBUaGlzIGdpdmVzIFNXSUcgc29tZSBjbGVhbnVwIGNvZGUgdGhhdCB3aWxsIGdldCBjYWxsZWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwKLSV0eXBlbWFwKHRjbCxmcmVlYXJnKSBjaGFyICoqIHsKLSAgICAgICAgZnJlZSgoY2hhciAqKSAkc291cmNlKTsKLX0KLQotLy8gUmV0dXJuIGEgY2hhciAqKiBhcyBhIFRjbCBsaXN0Ci0ldHlwZW1hcCh0Y2wsb3V0KSBjaGFyICoqIHsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoJHNvdXJjZVtpXSkgewotICAgICAgICAgICAgIFRjbF9BcHBlbmRFbGVtZW50KGludGVycCwkc291cmNlW2ldKTsKLSAgICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLX0KLQotLy8gTm93IGEgZmV3IHRlc3QgZnVuY3Rpb25zCi0laW5saW5lICV7Ci1pbnQgcHJpbnRfYXJncyhjaGFyICoqYXJndikgewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoYXJndltpXSkgewotICAgICAgICAgcHJpbnRmKCJhcmd2WyVkXSA9ICVzXG4iLCBpLGFyZ3ZbaV0pOwotICAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotCi0vLyBSZXR1cm5zIGEgY2hhciAqKiBsaXN0Ci1jaGFyICoqZ2V0X2FyZ3MoKSB7Ci0gICAgc3RhdGljIGNoYXIgKnZhbHVlc1tdID0geyAiRGF2ZSIsICJNaWtlIiwgIlN1c2FuIiwgIkpvaG4iLCAiTWljaGVsbGUiLCAwfTsKLSAgICByZXR1cm4gJmFtcDt2YWx1ZXNbMF07Ci19Ci0KLS8vIEEgZ2xvYmFsIHZhcmlhYmxlCi1jaGFyICphcmdzW10gPSB7ICIxMjMiLCAiNTQiLCAiLTIiLCAiMCIsICJOVUxMIiwgMCB9OwotCi0lfQotJWluY2x1ZGUgdGNsc2guaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIGNvbXBpbGVkLCB3ZSBjYW4gdXNlIG91ciBmdW5jdGlvbnMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBwcmludF9hcmdzIHtKb2huIEd1aWRvIExhcnJ5fQotYXJndlswXSA9IEpvaG4KLWFyZ3ZbMV0gPSBHdWlkbwotYXJndlsyXSA9IExhcnJ5Ci0zCi0lIHB1dHMgW2dldF9hcmdzXQotRGF2ZSBNaWtlIFN1c2FuIEpvaG4gTWljaGVsbGUKLSUgcHV0cyBbYXJnc19nZXRdCi0xMjMgNTQgLTIgMCBOVUxMCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVBlcmhhcHMgdGhlIG9ubHkgdHJpY2t5IHBhcnQgb2YgdGhpcyBleGFtcGxlIGlzIHRoZSBpbXBsaWNpdCBtZW1vcnkgYWxsb2NhdGlvbiB0aGF0IGlzIHBlcmZvcm1lZCBieSB0aGUgPHR0PlRjbF9TcGxpdExpc3Q8L3R0PiBmdW5jdGlvbi4gIFRvIHByZXZlbnQgYSBtZW1vcnkgbGVhaywgd2UgY2FuIHVzZSB0aGUgU1dJRyAiZnJlZWFyZyIgdHlwZW1hcCB0byBjbGVhbiB1cCB0aGUgYXJndW1lbnQgdmFsdWUgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgaXMgbWFkZS4gSW4gdGhpcyBjYXNlLCB3ZSBzaW1wbHkgZnJlZSB1cCB0aGUgbWVtb3J5IHRoYXQgPHR0PlRjbF9TcGxpdExpc3Q8L3R0PiBhbGxvY2F0ZWQgZm9yIHVzLjxwPgotPGEgbmFtZT0ibjU4Ij48L2E+PGgzPiBSZW1hcHBpbmcgY29uc3RhbnRzPC9oMz4KLUJ5IGRlZmF1bHQsIFNXSUcgaW5zdGFsbHMgQyBjb25zdGFudHMgYXMgVGNsIHJlYWQtb25seSB2YXJpYWJsZXMuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGhhcyB0aGUgdW5kZXNpcmFibGUgc2lkZSBlZmZlY3QgdGhhdCBjb25zdGFudHMgbmVlZCB0byBiZSBkZWNsYXJlZCBhcyAiZ2xvYmFsIiB3aGVuIHVzZWQgaW4gc3Vicm91dGluZXMuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBjbGVhcnNjcmVlbiB7IH0gewotCWdsb2JhbCBHTF9DT0xPUl9CVUZGRVJfQklUCi0JZ2xDbGVhciAkR0xfQ09MT1JfQlVGRkVSX0JJVAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JZiB5b3UgaGF2ZSBodW5kcmVkcyBvZiBmdW5jdGlvbnMgaG93ZXZlciwgdGhpcyBxdWlja2x5IGdldHMgYW5ub3lpbmcuICAgSGVyZSdzIGEgZml4IHVzaW5nIGhhc2ggdGFibGVzIGFuZCBTV0lHIHR5cGVtYXBzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBEZWNsYXJlIHNvbWUgVGNsIGhhc2ggdGFibGUgdmFyaWFibGVzCi0lewotc3RhdGljIFRjbF9IYXNoVGFibGUgIGNvbnN0VGFibGU7ICAgICAgLyogSGFzaCB0YWJsZSAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgICAgICAgKnN3aWdjb25zdDsgICAgICAgLyogVGVtcG9yYXJ5IHZhcmlhYmxlICAqLwotc3RhdGljIFRjbF9IYXNoRW50cnkgKmVudHJ5UHRyOyAgICAgICAgLyogSGFzaCBlbnRyeSAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgICAgICAgIGR1bW15OyAgICAgICAgICAgLyogZHVtbXkgdmFsdWUgICAgICAgICAqLwotJX0KLQotLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZSAoVGhpcyBnb2VzIGluIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbikKLQotJWluaXQgJXsKLSAgVGNsX0luaXRIYXNoVGFibGUoJmFtcDtjb25zdFRhYmxlLFRDTF9TVFJJTkdfS0VZUyk7Ci0lfQotCi0vLyBBIFR5cGVtYXAgZm9yIGNyZWF0aW5nIGNvbnN0YW50IHZhbHVlcwotLy8gJHNvdXJjZSA9IHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQKLS8vICR0YXJnZXQgPSB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQKLQotJXR5cGVtYXAodGNsLGNvbnN0KSBpbnQsIHVuc2lnbmVkIGludCwgbG9uZywgdW5zaWduZWQgbG9uZyB7Ci0gIGVudHJ5UHRyID0gVGNsX0NyZWF0ZUhhc2hFbnRyeSgmYW1wO2NvbnN0VGFibGUsIiR0YXJnZXQiLCZhbXA7ZHVtbXkpOwotICBzd2lnY29uc3QgPSAoaW50ICopIG1hbGxvYyhzaXplb2YoaW50KSk7Ci0gICpzd2lnY29uc3QgPSAkc291cmNlOwotICBUY2xfU2V0SGFzaFZhbHVlKGVudHJ5UHRyLCBzd2lnY29uc3QpOwotICAvKiBNYWtlIGl0IHNvIGNvbnN0YW50cyBjYW4gYWxzbyBiZSB1c2VkIGFzIHZhcmlhYmxlcyAqLwotICBUY2xfTGlua1ZhcihpbnRlcnAsIiR0YXJnZXQiLCAoY2hhciAqKSBzd2lnY29uc3QsIFRDTF9MSU5LX0lOVCB8IFRDTF9MSU5LX1JFQURfT05MWSk7Ci19OwotCi0vLyBOb3cgY2hhbmdlIGludGVnZXIgaGFuZGxpbmcgdG8gbG9vayBmb3IgbmFtZXMgaW4gYWRkaXRpb24gdG8gdmFsdWVzCi0ldHlwZW1hcCh0Y2wsaW4pIGludCwgdW5zaWduZWQgaW50LCBsb25nLCB1bnNpZ25lZCBsb25nIHsKLSAgVGNsX0hhc2hFbnRyeSAqZW50cnlQdHI7Ci0gIGVudHJ5UHRyID0gVGNsX0ZpbmRIYXNoRW50cnkoJmFtcDtjb25zdFRhYmxlLCRzb3VyY2UpOwotICBpZiAoZW50cnlQdHIpIHsKLSAgICAkdGFyZ2V0ID0gKCR0eXBlKSAoKigoaW50ICopIFRjbF9HZXRIYXNoVmFsdWUoZW50cnlQdHIpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgJHRhcmdldCA9ICgkdHlwZSkgYXRvaSgkc291cmNlKTsKLSAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBvdXIgVGNsIGNvZGUsIHdlIGNhbiBub3cgYWNjZXNzIGNvbnN0YW50cyBieSBuYW1lIHdpdGhvdXQgdXNpbmcgdGhlICJnbG9iYWwiIGtleXdvcmQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBjbGVhcnNjcmVlbiB7IH0gewotCWdsQ2xlYXIgR0xfQ09MT1JfQlVGRkVSX0JJVAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTkiPjwvYT48aDM+IFJldHVybmluZyB2YWx1ZXMgaW4gYXJndW1lbnRzPC9oMz4KLVRoZSAiYXJnb3V0IiB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIHZhbHVlIG9yaWdpbmF0aW5nIGZyb20gYSBmdW5jdGlvbiBhcmd1bWVudC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEEgdHlwZW1hcCBkZWZpbmluZyBob3cgdG8gcmV0dXJuIGFuIGFyZ3VtZW50IGJ5IGFwcGVuZGluZyBpdCB0byB0aGUgcmVzdWx0Ci0ldHlwZW1hcCh0Y2wsYXJnb3V0KSBkb3VibGUgKm91dHZhbHVlIHsKLSAgICAgICAgY2hhciBkdGVtcFtUQ0xfRE9VQkxFX1NQQUNFXTsKLSAgICAgICAgVGNsX1ByaW50RG91YmxlKGludGVycCwqKCRzb3VyY2UpLGR0ZW1wKTsKLSAgICAgICAgVGNsX0FwcGVuZEVsZW1lbnQoaW50ZXJwLCBkdGVtcCk7Ci19Ci0KLS8vIEEgdHlwZW1hcCB0ZWxsaW5nIFNXSUcgdG8gaWdub3JlIGFuIGFyZ3VtZW50IGZvciBpbnB1dAotLy8gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBwYXNzIGEgcG9pbnRlciB0byB0aGUgQyBmdW5jdGlvbgotJXR5cGVtYXAodGNsLGlnbm9yZSkgZG91YmxlICpvdXR2YWx1ZSB7Ci0Jc3RhdGljIGRvdWJsZSB0ZW1wOyAgICAgICAgIC8qIEEgdGVtcG9yYXJ5IGhvbGRpbmcgcGxhY2UgKi8KLQkkdGFyZ2V0ID0gJmFtcDt0ZW1wOwotfQotCi0vLyBOb3cgYSBmdW5jdGlvbiByZXR1cm5pbmcgdHdvIHZhbHVlcwotaW50IG15cG93KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpvdXR2YWx1ZSkgewotICAgICAgICBpZiAoKGEgJmx0OyAwKSB8fCAoYiAmbHQ7IDApKSByZXR1cm4gLTE7Ci0gICAgICAgICpvdXR2YWx1ZSA9IHBvdyhhLGIpOwotICAgICAgICByZXR1cm4gMDsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gd3JhcHBlZCwgU1dJRyBtYXRjaGVzIHRoZSA8dHQ+YXJnb3V0PC90dD4gdHlwZW1hcCB0byB0aGUgIjx0dD5kb3VibGUgKm91dHZhbHVlPC90dD4iIGFyZ3VtZW50LiBUaGUgImlnbm9yZSIgdHlwZW1hcCB0ZWxscyBTV0lHIHRvIHNpbXBseSBpZ25vcmUgdGhpcyBhcmd1bWVudCB3aGVuIGdlbmVyYXRpbmcgd3JhcHBlciBjb2RlLiAgQXMgYSByZXN1bHQsIGEgVGNsIGZ1bmN0aW9uIHVzaW5nIHRoZXNlIHR5cGVtYXBzIHdpbGwgd29yayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgbXlwb3cgMiAzICAgICAjIFJldHVybnMgdHdvIHZhbHVlcywgYSBzdGF0dXMgdmFsdWUgYW5kIHRoZSByZXN1bHQKLTAgOAotJQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byB0aGlzIGlzIHRvIHJldHVybiB2YWx1ZXMgaW4gYSBUY2wgdmFyaWFibGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAodGNsLGFyZ291dCkgZG91YmxlICpvdXR2YWx1ZSB7Ci0JY2hhciB0ZW1wW1RDTF9ET1VCTEVfU1BBQ0VdOwotCVRjbF9QcmludERvdWJsZShpbnRlcnAsKigkc291cmNlKSxkdGVtcCk7Ci0JVGNsX1NldFZhcihpbnRlcnAsJGFyZyx0ZW1wLDApOwotfQotJXR5cGVtYXAodGNsLGluKSBkb3VibGUgKm91dHZhbHVlIHsKLQlzdGF0aWMgZG91YmxlIHRlbXA7Ci0JJHRhcmdldCA9ICZhbXA7dGVtcDsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT3VyIFRjbCBzY3JpcHQgY2FuIG5vdyBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCBzdGF0dXMgW215cG93IDIgMyBhXQotJSBwdXRzICRzdGF0dXMKLTAKLSUgcHV0cyAkYQotOC4wCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1IZXJlLCB3ZSBoYXZlIHBhc3NlZCB0aGUgbmFtZSBvZiBhIFRjbCAgdmFyaWFibGUgdG8gb3VyIEMgd3JhcHBlciBmdW5jdGlvbiB3aGljaCB0aGVuIHBsYWNlcyB0aGUgcmV0dXJuIHZhbHVlIGluIHRoYXQgdmFyaWFibGUuICAgVGhpcyBpcyBub3cgdmVyeSBjbG9zZSB0byB0aGUgd2F5IGluIHdoaWNoIGEgQyBmdW5jdGlvbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd291bGQgd29yay48cD4KLTxhIG5hbWU9Im42MCI+PC9hPjxoMz4gTWFwcGluZyBDIHN0cnVjdHVyZXMgaW50byBUY2wgTGlzdHM8L2gzPgotU3VwcG9zZSB5b3UgaGF2ZSBhIEMgc3RydWN0dXJlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICBsb2dpblsxNl07ICAgICAgICAgICAgLyogTG9naW4gSUQgICovCi0gIGludCAgIHVpZDsgICAgICAgICAgICAgICAgICAvKiBVc2VyIElEICAgKi8KLSAgaW50ICAgZ2lkOyAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIElEICAqLwotICBjaGFyICBuYW1lWzMyXTsgICAgICAgICAgICAgLyogVXNlciBuYW1lICovCi0gIGNoYXIgIGhvbWVbMjU2XTsgICAgICAgICAgICAvKiBIb21lIGRpcmVjdG9yeSAqLwotfSBVc2VyOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1CeSBkZWZhdWx0LCBTV0lHIHdpbGwgc2ltcGx5IHRyZWF0IGFsbCBvY2N1cnJlbmNlcyBvZiAiPHR0PlVzZXI8L3R0PiIgYXMgYSBwb2ludGVyLiAgIFRodXMsIGZ1bmN0aW9ucyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmV4dGVybiB2b2lkIGFkZF91c2VyKFVzZXIgdSk7Ci1leHRlcm4gVXNlciAqbG9va3VwX3VzZXIoY2hhciAqbmFtZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdpbGwgd29yaywgYnV0IHRoZXkgd2lsbCBiZSB3ZWlyZC4gICBJbiBmYWN0LCB0aGV5IG1heSBub3Qgd29yayBhdCBhbGwgdW5sZXNzIHlvdSB3cml0ZSBoZWxwZXIgZnVuY3Rpb25zIHRvIGNyZWF0ZSB1c2VycyBhbmQgZXh0cmFjdCBkYXRhLiAgICBBIHR5cGVtYXAgY2FuIGJlIHVzZWQgdG8gZml4IHRoaXMgcHJvYmxlbSBob3dldmVyLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFRoaXMgd29ya3MgZm9yIGJvdGggIlVzZXIiIGFuZCAiVXNlciAqIgotJXR5cGVtYXAodGNsLGluKSBVc2VyICogewotCWludCB0ZW1wYzsKLQljaGFyICoqdGVtcGE7Ci0Jc3RhdGljIFVzZXIgdGVtcDsKLQlpZiAoVGNsX1NwbGl0TGlzdChpbnRlcnAsJHNvdXJjZSwmYW1wO3RlbXBjLCZhbXA7dGVtcGEpID09IFRDTF9FUlJPUikgcmV0dXJuIFRDTF9FUlJPUjsKLQlpZiAodGVtcGMgIT0gNSkgewotCQlmcmVlKChjaGFyICopIHRlbXBhKTsKLQkJaW50ZXJwLSZndDtyZXN1bHQgPSAiTm90IGEgdmFsaWQgVXNlciByZWNvcmQiOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KLQkvKiBTcGxpdCBvdXQgdGhlIGRpZmZlcmVudCBmaWVsZHMgKi8KLQlzdHJuY3B5KHRlbXAubG9naW4sdGVtcGFbMF0sMTYpOwotCXRlbXAudWlkID0gYXRvaSh0ZW1wYVsxXSk7Ci0JdGVtcC5naWQgPSBhdG9pKHRlbXBhWzJdKTsKLQlzdHJuY3B5KHRlbXAubmFtZSx0ZW1wYVszXSwzMik7Ci0Jc3RybmNweSh0ZW1wLmhvbWUsdGVtcGFbNF0sMjU2KTsKLQkkdGFyZ2V0ID0gJmFtcDt0ZW1wOwotCWZyZWUoKGNoYXIgKikgdGVtcGEpOwotfQotCi0vLyBEZXNjcmliZSBob3cgd2Ugd2FudCB0byByZXR1cm4gYSB1c2VyIHJlY29yZAotJXR5cGVtYXAodGNsLG91dCkgVXNlciAqIHsKLQljaGFyIHRlbXBbMjBdOwotCWlmICgkc291cmNlKSB7Ci0JVGNsX0FwcGVuZEVsZW1lbnQoaW50ZXJwLCRzb3VyY2UtJmd0O2xvZ2luKTsKLQlzcHJpbnRmKHRlbXAsIiVkIiwkc291cmNlLSZndDt1aWQpOwotCVRjbF9BcHBlbmRFbGVtZW50KGludGVycCx0ZW1wKTsKLQlzcHJpbnRmKHRlbXAsIiVkIiwkc291cmNlLSZndDtnaWQpOwotCVRjbF9BcHBlbmRFbGVtZW50KGludGVycCx0ZW1wKTsKLQlUY2xfQXBwZW5kRWxlbWVudChpbnRlcnAsJHNvdXJjZS0mZ3Q7bmFtZSk7Ci0JVGNsX0FwcGVuZEVsZW1lbnQoaW50ZXJwLCRzb3VyY2UtJmd0O2hvbWUpOwotCX0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlc2UgZnVuY3Rpb24gbWFyc2hhbGwgVGNsIGxpc3RzIHRvIGFuZCBmcm9tIG91ciA8dHQ+VXNlcjwvdHQ+IGRhdGEgc3RydWN0dXJlLiBUaGlzIGFsbG93cyBhIG1vcmUgbmF0dXJhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IHdlIGNhbiB1c2UgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBhZGRfdXNlciB7YmVhemxleSA1MDAgNTAwICJEYXZlIEJlYXpsZXkiICIvaG9tZS9iZWF6bGV5In0KLSUgbG9va3VwX3VzZXIgYmVhemxleQotYmVhemxleSA1MDAgNTAwIHtEYXZlIEJlYXpsZXl9IC9ob21lL2JlYXpsZXkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBpcyBhIG11Y2ggY2xlYW5lciBpbnRlcmZhY2UgKGFsdGhvdWdoIGF0IHRoZSBjb3N0IG9mIHNvbWUgcGVyZm9ybWFuY2UpLiBUaGUgb25seSBjYXV0aW9uIEkgb2ZmZXIgaXMgdGhhdCB0aGUgcG9pbnRlciB2aWV3IG9mIHRoZSB3b3JsZCBpcyBwZXJ2YXNpdmUgdGhyb3VnaG91dCBTV0lHLiBSZW1hcHBpbmcgY29tcGxleCBkYXRhdHlwZXMgbGlrZSB0aGlzIHdpbGwgdXN1YWxseSB3b3JrLCBidXQgZXZlcnkgbm93IGFuZCB0aGVuIHlvdSBtaWdodCBmaW5kIHRoYXQgaXQgYnJlYWtzLiBGb3IgZXhhbXBsZSwgaWYgd2UgbmVlZGVkIHRvIG1hbmlwdWxhdGUgYXJyYXlzIG9mIFVzZXJzIChhbHNvIG1hcHBlZCBhcyBhICI8dHQ+VXNlciAqPC90dD4iKSwgdGhlIHR5cGVtYXBzIGRlZmluZWQgaGVyZSB3b3VsZCBicmVhayBkb3duIGFuZCBzb21ldGhpbmcgZWxzZSB3b3VsZCBiZSBuZWVkZWQuICBDaGFuZ2luZyB0aGUgcmVwcmVzZW50YXRpb24gaW4gdGhpcyBtYW5uZXIgbWF5IGFsc28gYnJlYWsgdGhlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UuIDxwPgotPGEgbmFtZT0ibjYxIj48L2E+PGgzPiBVc2VmdWwgZnVuY3Rpb25zPC9oMz4KLVRoZSBmb2xsb3dpbmcgdGFibGVzIHByb3ZpZGUgc29tZSBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgdXNlZnVsIGluIHdyaXRpbmcgVGNsIHR5cGVtYXBzLiBCb3RoIFRjbCA3LnggYW5kIFRjbCA4LnggYXJlIGNvdmVyZWQuICBGb3IgVGNsIDcueCwgZXZlcnl0aGluZyBpcyBhIHN0cmluZyBzbyB0aGUgaW50ZXJmYWNlIGlzIHJlbGF0aXZlbHkgc2ltcGxlLiBGb3IgVGNsIDgsIGV2ZXJ5dGhpbmcgaXMgbm93IGEgVGNsIG9iamVjdCBzbyBhIG1vcmUgcHJlY2lzZSBzZXQgb2YgZnVuY3Rpb25zIGlzIHJlcXVpcmVkLiBHaXZlbiB0aGUgYWxwaGEtcmVsZWFzZSBzdGF0dXMgb2YgVGNsIDgsIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGhlcmUgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoMTAudGFibGUuMS5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDEwLnRhYmxlLjIucG5nIj48YnI+Ci08aW1nIHNyYz0iY2gxMC50YWJsZS4zLnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuNC5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDEwLnRhYmxlLjUucG5nIj48YnI+Ci08aW1nIHNyYz0iY2gxMC50YWJsZS42LnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuNy5wbmciPgotPC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im42MiI+PC9hPjxoMz4gU3RhbmRhcmQgIHR5cGVtYXBzPC9oMz4KLVRoZSBmb2xsb3dpbmcgdHlwZW1hcHMgc2hvdyBob3cgdG8gY29udmVydCBhIGZldyBjb21tb24ga2luZHMgb2Ygb2JqZWN0cyBiZXR3ZWVuIFRjbCBhbmQgQyAoYW5kIHRvIGdpdmUgYSBiZXR0ZXIgaWRlYSBvZiBob3cgdHlwZW1hcHMgd29yayk8cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2gxMC50YWJsZS44LnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuOS5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDEwLnRhYmxlLjEwLnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuMTEucG5nIj4KLTwvY2VudGVyPjxwPgotPHA+Ci08YSBuYW1lPSJuNjMiPjwvYT48aDM+IFBvaW50ZXIgaGFuZGxpbmc8L2gzPgotU1dJRyBwb2ludGVycyBhcmUgbWFwcGVkIGludG8gUHl0aG9uIHN0cmluZ3MgY29udGFpbmluZyB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgYW5kIHR5cGUuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlYWQgcG9pbnRlciB2YWx1ZXMuPHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDEwLnRhYmxlLjEyLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLVRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcyBhcyB3ZWxsLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0eXBlbWFwIG1ha2VzIGFuIGFyZ3VtZW50IG9mICI8dHQ+Y2hhciAqYnVmZmVyPC90dD4iIGFjY2VwdCBhIHBvaW50ZXIgaW5zdGVhZCBvZiBhIE5VTEwtdGVybWluYXRlZCBBU0NJSSBzdHJpbmcuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAodGNsLGluKSBjaGFyICpidWZmZXIgewotCWlmIChTV0lHX0dldFB0cigkc291cmNlLCAodm9pZCAqKikgJmFtcDskdGFyZ2V0LCAiJG1hbmdsZSIpKSB7Ci0JCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCJUeXBlIGVycm9yLiBOb3QgYSBwb2ludGVyIiwgVENMX1NUQVRJQyk7Ci0JCXJldHVybiBUQ0xfRVJST1I7Ci0JfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3RlIHRoYXQgdGhlIDx0dD4kbWFuZ2xlPC90dD4gdmFyaWFibGUgZ2VuZXJhdGVzIHRoZSB0eXBlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGF0eXBlIHVzZWQgaW4gdGhlIHR5cGVtYXAuPHA+Ci08cD4KLUJ5IG5vdyB5b3UgaG9wZWZ1bGx5IGhhdmUgdGhlIGlkZWEgdGhhdCB0eXBlbWFwcyBhcmUgYSBwb3dlcmZ1bCBtZWNoYW5pc20gZm9yIGJ1aWxkaW5nIG1vcmUgc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgV2hpbGUgd3JpdGluZyB0eXBlbWFwcyBjYW4gYmUgdGVjaG5pY2FsLCBtYW55IGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gZm9yIHlvdS4gIFNlZSB0aGUgU1dJRyBsaWJyYXJ5IHJlZmVyZW5jZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48cD4KLTxhIG5hbWU9Im4xMiI+PC9hPjxoMj4gQ29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHdpdGggU1dJRzwvaDI+Ci1BZnRlciB5b3Ugc3RhcnQgdG8gd29yayB3aXRoIFRjbCBmb3IgYXdoaWxlLCB5b3Ugc3VkZGVubHkgcmVhbGl6ZSB0aGF0IHRoZXJlIGFyZSBhbiB1bmltYWdpbmFibGUgbnVtYmVyIG9mIGV4dGVuc2lvbnMsIHRvb2xzLCBhbmQgb3RoZXIgcGFja2FnZXMuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHRoZXJlIGFyZSBhYm91dCAyMCBiaWxsaW9uIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBUY2wsIG5vdCBhbGwgb2Ygd2hpY2ggYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIGV4dGVuc2lvbiAodGhpcyBpcyB0byBtYWtlIGxpZmUgaW50ZXJlc3Rpbmcgb2YgY291cnNlKS48cD4KLTxwPgotV2hpbGUgU1dJRyBpcyBjZXJ0YWlubHkgbm90IGEgbWFnaWNhbCBzb2x1dGlvbiB0byB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHByb2JsZW0sIGl0IGNhbiBoZWxwIG91dCBhbG90IGluIGEgbnVtYmVyIG9mIGtleSBhcmVhcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5TV0lHIGdlbmVyYXRlZCBjb2RlIGNhbiBiZSB1c2VkIHdpdGggYWxsIHZlcnNpb25zIG9mIFRjbC9UayBuZXdlciB0aGFuIDcuMy8zLjYuIFRoaXMgaW5jbHVkZXMgdGhlIFRjbCBOZXRzY2FwZSBQbHVnaW4gYW5kIFRjbCA4LjBhMi4KLTxsaT5UaGUgU1dJRyBsaWJyYXJ5IG1lY2hhbmlzbSBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgdmFyaW91cyBjb2RlIGZyYWdtZW50cyBhbmQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgotPGxpPlNXSUcgZ2VuZXJhdGVkIGNvZGUgdXN1YWxseSByZXF1aXJlcyBubyBtb2RpZmljYXRpb24gc28gaXQgaXMgcmVsYXRpdmVseSBlYXN5IHRvIHN3aXRjaCBiZXR3ZWVuIGRpZmZlcmVudCBUY2wgdmVyc2lvbnMgYXMgbmVjZXNzYXJ5IG9yIHVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIHdoZW4gdGhlIHRpbWUgY29tZXMgKG9mIGNvdXJzZSwgdGhlIFN1biBUY2wvVGsgdGVhbSBtaWdodCBoYXZlIGNoYW5nZWQgb3RoZXIgdGhpbmdzIHRvIGtlZXAgeW91IG9jY3VwaWVkKQotPC91bD4KLTxhIG5hbWU9Im42NCI+PC9hPjxoMz4gV3JpdGluZyBhIG1haW4gcHJvZ3JhbSBhbmQgVGNsX0FwcEluaXQoKTwvaDM+Ci1UaGUgdHJhZGl0aW9uYWwgbWV0aG9kIG9mIGNyZWF0aW5nIGEgbmV3IFRjbCBleHRlbnNpb24gcmVxdWlyZWQgYSBwcm9ncmFtbWVyIHRvIHdyaXRlIGEgc3BlY2lhbCBmdW5jdGlvbiBjYWxsZWQgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiB0aGF0IHdvdWxkIGluaXRpYWxpemUgeW91ciBleHRlbnNpb24gYW5kIHN0YXJ0IHRoZSBUY2wgaW50ZXJwcmV0ZXIuICBBIHR5cGljYWwgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiBmdW5jdGlvbiBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIG1haW4uYyAqLwotI2luY2x1ZGUgJmx0O3RjbC5oJmd0OwotCi1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLQlUY2xfTWFpbihhcmdjLGFyZ3YpOwotCWV4aXQoMCk7Ci19Ci0KLWludCBUY2xfQXBwSW5pdChUY2xfSW50ZXJwICppbnRlcnApIHsKLQlpZiAoVGNsX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0JCi0JLyogSW5pdGlhbGl6ZSB5b3VyIGV4dGVuc2lvbiAqLwotCWlmIChZb3VyX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0KLQl0Y2xfUmNGaWxlTmFtZSA9ICJ+Ly5teWFwcC50Y2wiOwotCXJldHVybiBUQ0xfT0s7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIHJlbGF0aXZlbHkgc2ltcGxlIHRvIHdyaXRlLCB0aGVyZSBhcmUgdG9ucyBvZiBwcm9ibGVtcyB3aXRoIGRvaW5nIHRoaXMuICBGaXJzdCwgZWFjaCBleHRlbnNpb24gdGhhdCB5b3UgdXNlIHR5cGljYWxseSBoYXMgdGhlaXIgb3duIDx0dD5UY2xfQXBwSW5pdCgpPC90dD4gZnVuY3Rpb24uICAgVGhpcyBmb3JjZXMgeW91IHRvIHdyaXRlIGEgc3BlY2lhbCBvbmUgdG8gaW5pdGlhbGl6ZSBldmVyeXRoaW5nIGJ5IGhhbmQuICAgU2Vjb25kbHksIHRoZSBwcm9jZXNzIG9mIHdyaXRpbmcgYSBtYWluIHByb2dyYW0gYW5kIGluaXRpYWxpemluZyB0aGUgaW50ZXJwcmV0ZXIgdmFyaWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIFRjbCBhbmQgZGlmZmVyZW50IHBsYXRmb3Jtcy4gIEZvciBleGFtcGxlLCBpbiBUY2wgNy40LCB0aGUgdmFyaWFibGUgIjx0dD50Y2xfUmNGaWxlTmFtZTwvdHQ+IiBpcyBhIEMgdmFyaWFibGUgd2hpbGUgaW4gVGNsNy41IGFuZCBuZXdlciB2ZXJzaW9ucyBpdHMgYSBUY2wgdmFyaWFibGUgaW5zdGVhZC4gICBTaW1pbGFybHksIHRoZSA8dHQ+VGNsX0FwcEluaXQ8L3R0PiBmdW5jdGlvbiB3cml0dGVuIGZvciBhIFVuaXggbWFjaGluZSBtaWdodCBub3QgY29tcGlsZSBjb3JyZWN0bHkgb24gYSBNYWMgb3IgV2luZG93cyBtYWNoaW5lLjxwPgotPHA+Ci1JbiBTV0lHLCBpdCBpcyBhbG1vc3QgbmV2ZXIgbmVjZXNzYXJ5IHRvIHdyaXRlIGEgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiBmdW5jdGlvbiBiZWNhdXNlIHRoaXMgaXMgbm93IGRvbmUgYnkgIFNXSUcgbGlicmFyeSAgZmlsZXMgc3VjaCBhcyA8dHQ+dGNsc2guaTwvdHQ+IG9yIDx0dD53aXNoLmk8L3R0Pi4gICAgVG8gZ2l2ZSBhIGJldHRlciBpZGVhIG9mIHdoYXQgdGhlc2UgZmlsZXMgZG8sIGhlcmUncyB0aGUgY29kZSBmcm9tIHRoZSBTV0lHIDx0dD50Y2xzaC5pPC90dD4gZmlsZSB3aGljaCBpcyByb3VnaGx5IGNvbXBhcmFibGUgdG8gdGhlIGFib3ZlIGNvZGU8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyB0Y2xzaC5pIDogU1dJRyBsaWJyYXJ5IGZpbGUgZm9yIHJlYnVpbGRpbmcgdGNsc2gKLSV7Ci0KLS8qIEEgVENMX0FwcEluaXQoKSBmdW5jdGlvbiB0aGF0IGxldHMgeW91IGJ1aWxkIGEgbmV3IGNvcHkKLSAqIG9mIHRjbHNoLgotICoKLSAqIFRoZSBtYWNybyBTV0lHX2luaXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uCi0gKiBmdW5jdGlvbiBpbiB0aGUgd3JhcHBlciBmaWxlLgotICovCi0KLSNpZm5kZWYgU1dJR19SY0ZpbGVOYW1lCi1jaGFyICpTV0lHX1JjRmlsZU5hbWUgPSAifi8ubXlhcHByYyI7Ci0jZW5kaWYKLQotaW50IFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCl7Ci0KLSAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKQotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSAgLyogTm93IGluaXRpYWxpemUgb3VyIGZ1bmN0aW9ucyAqLwotICBpZiAoU1dJR19pbml0KGludGVycCkgPT0gVENMX0VSUk9SKQotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSNpZiBUQ0xfTUFKT1JfVkVSU0lPTiAmZ3Q7IDcgfHwgVENMX01BSk9SX1ZFUlNJT04gPT0gNyAmYW1wOyZhbXA7IFRDTF9NSU5PUl9WRVJTSU9OICZndDs9IDUKLSAgIFRjbF9TZXRWYXIoaW50ZXJwLCJ0Y2xfcmNGaWxlTmFtZSIsU1dJR19SY0ZpbGVOYW1lLFRDTF9HTE9CQUxfT05MWSk7Ci0jZWxzZQotICAgdGNsX1JjRmlsZU5hbWUgPSBTV0lHX1JjRmlsZU5hbWU7Ci0jZW5kaWYKLSAgcmV0dXJuIFRDTF9PSzsKLX0KLQotI2lmIFRDTF9NQUpPUl9WRVJTSU9OICZndDsgNyB8fCBUQ0xfTUFKT1JfVkVSU0lPTiA9PSA3ICZhbXA7JmFtcDsgVENMX01JTk9SX1ZFUlNJT04gJmd0Oz0gNAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIFRjbF9NYWluKGFyZ2MsIGFyZ3YsIFRjbF9BcHBJbml0KTsKLSAgcmV0dXJuKDApOwotCi19Ci0jZWxzZQotZXh0ZXJuIGludCBtYWluKCk7Ci0jZW5kaWYKLQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmaWxlIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIGEgbm9ybWFsIDx0dD5UY2xfQXBwSW5pdCgpPC90dD4gZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgYSB2YXJpZXR5IG9mIFRjbCB2ZXJzaW9ucy4gIFdoZW4gaW5jbHVkZWQgaW50byBhbiBpbnRlcmZhY2UgZmlsZSwgdGhlIHN5bWJvbCA8dHQ+U1dJR19pbml0PC90dD4gY29udGFpbnMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAoVGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBieSBTV0lHIHdoZW4gaXQgY3JlYXRlcyB0aGUgd3JhcHBlciBjb2RlKS4gICBTaW1pbGFybHksIGEgc3RhcnR1cCBmaWxlIGNhbiBiZSBkZWZpbmVkIGJ5IHNpbXBseSBkZWZpbmluZyB0aGUgc3ltYm9sIDx0dD5TV0lHX1JjRmlsZU5hbWU8L3R0Pi4gICBUaHVzLCBhIHR5cGljYWwgaW50ZXJmYWNlIGZpbGUgbWlnaHQgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZ3JhcGgKLSV7Ci0jaW5jbHVkZSAiZ3JhcGguaCIKLSNkZWZpbmUgU1dJR19SY0ZpbGVOYW1lICJncmFwaC50Y2wiCi0lfQotCi0laW5jbHVkZSB0Y2xzaC5pCi0KLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQnkgIGluY2x1ZGluZyB0aGUgPHR0PnRjbHNoLmk8L3R0PiwgeW91IGF1dG9tYXRpY2FsbHkgZ2V0IGEgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiBmdW5jdGlvbi4gICBBIHZhcmlldHkgb2YgbGlicmFyeSBmaWxlcyBhcmUgYWxzbyBhdmFpbGFibGUuICA8dHQ+d2lzaC5pPC90dD4gY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBuZXcgd2lzaCBleGVjdXRhYmxlLCA8dHQ+ZXhwZWN0Lmk8L3R0PiBjb250YWlucyB0aGUgbWFpbiBwcm9ncmFtIGZvciBFeHBlY3QsIGFuZCA8dHQ+aXNoLmk8L3R0PiwgPHR0Pml0Y2xzaC5pPC90dD4sIDx0dD5pd2lzaC5pPC90dD4sIGFuZCA8dHQ+aXRrd2lzaC5pPC90dD4gY29udGFpbiBpbml0aWFsaXphdGlvbnMgZm9yIHZhcmlvdXMgaW5jYXJuYXRpb25zIG9mIFtpbmNyIFRjbF0uPHA+Ci08YSBuYW1lPSJuNjUiPjwvYT48aDM+IENyZWF0aW5nIGEgbmV3IHBhY2thZ2UgaW5pdGlhbGl6YXRpb24gbGlicmFyeTwvaDM+Ci1JZiBhIHBhcnRpY3VsYXIgVGNsIGV4dGVuc2lvbiByZXF1aXJlcyBzcGVjaWFsIGluaXRpYWxpemF0aW9uLCB5b3UgY2FuIGNyZWF0ZSBhIHNwZWNpYWwgU1dJRyBsaWJyYXJ5IGZpbGUgdG8gaW5pdGlhbGl6ZSBpdC4gIEZvciBleGFtcGxlLCBhIGxpYnJhcnkgZmlsZSB0byBleHRlbmQgRXhwZWN0IGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBleHBlY3QuaSA6IFNXSUcgTGlicmFyeSBmaWxlIGZvciBFeHBlY3QKLSV7Ci0KLS8qIG1haW4uYyAtIG1haW4oKSBhbmQgc29tZSBsb2dnaW5nIHJvdXRpbmVzIGZvciBleHBlY3QKLQotV3JpdHRlbiBieTogRG9uIExpYmVzLCBOSVNULCAyLzYvOTAKLQotRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHByb2dyYW0gd2FzIHBhaWQgZm9yIGJ5IFUuUy4gdGF4Ci1kb2xsYXJzLiAgVGhlcmVmb3JlIGl0IGlzIHB1YmxpYyBkb21haW4uICBIb3dldmVyLCB0aGUgYXV0aG9yIGFuZCBOSVNUCi13b3VsZCBhcHByZWNpYXRlIGNyZWRpdCBpZiB0aGlzIHByb2dyYW0gb3IgcGFydHMgb2YgaXQgYXJlIHVzZWQuCi0qLwotCi0jaW5jbHVkZSAiZXhwZWN0X2NmLmgiCi0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlIElOQ0xVREVfVENMCi0jaW5jbHVkZSAiZXhwZWN0X3RjbC5oIgotCi12b2lkCi1tYWluKGFyZ2MsIGFyZ3YpCi1pbnQgYXJnYzsKLWNoYXIgKmFyZ3ZbXTsKLXsKLSAgICAgICAgaW50IHJjID0gMDsKLSAgICAgICAgVGNsX0ludGVycCAqaW50ZXJwID0gVGNsX0NyZWF0ZUludGVycCgpOwotICAgICAgICBpbnQgU1dJR19pbml0KFRjbF9JbnRlcnAgKik7Ci0KLSAgICAgICAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlRjbF9Jbml0IGZhaWxlZDogJXNcbiIsaW50ZXJwLSZndDtyZXN1bHQpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEV4cF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkV4cF9Jbml0IGZhaWxlZDogJXNcbiIsaW50ZXJwLSZndDtyZXN1bHQpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTV0lHIGluaXRpYWxpemF0aW9uLiAtLS0gMi8xMS85NiAgKi8KLSAgICAgICAgaWYgKFNXSUdfaW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJTV0lHIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJXNcbiIsIGludGVycC0mZ3Q7cmVzdWx0KTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhwX3BhcnNlX2FyZ3YoaW50ZXJwLGFyZ2MsYXJndik7Ci0gICAgICAgIC8qIGJlY29tZSBpbnRlcmFjdGl2ZSBpZiByZXF1ZXN0ZWQgb3IgIm5vdGhpbmcgdG8gZG8iICovCi0gICAgICAgIGlmIChleHBfaW50ZXJhY3RpdmUpCi0gICAgICAgICAgICAgICAgKHZvaWQpIGV4cF9pbnRlcnByZXRlcihpbnRlcnApOwotICAgICAgICBlbHNlIGlmIChleHBfY21kZmlsZSkKLSAgICAgICAgICAgICAgICByYyA9IGV4cF9pbnRlcnByZXRfY21kZmlsZShpbnRlcnAsZXhwX2NtZGZpbGUpOwotICAgICAgICBlbHNlIGlmIChleHBfY21kZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgcmMgPSBleHBfaW50ZXJwcmV0X2NtZGZpbGVuYW1lKGludGVycCxleHBfY21kZmlsZW5hbWUpOwotCi0gICAgICAgIC8qIGFzc2VydChleHBfY21kbGluZWNtZHMgIT0gMCkgKi8KLSAgICAgICAgZXhwX2V4aXQoaW50ZXJwLHJjKTsKLSAgICAgICAgLypOT1RSRUFDSEVEKi8KLX0KLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoZSBldmVudCB0aGF0IHlvdSBuZWVkIHRvIHdyaXRlIGEgbmV3IGxpYnJhcnkgZmlsZSBzdWNoIGFzIHRoaXMsIHRoZSBwcm9jZXNzIHVzdWFsbHkgaXNuJ3QgdG9vIGRpZmZpY3VsdC4gIFN0YXJ0IGJ5IGdyYWJiaW5nIHRoZSBvcmlnaW5hbCA8dHQ+VGNsX0FwcEluaXQoKTwvdHQ+IGZ1bmN0aW9uIGZvciB0aGUgcGFja2FnZS4gIEVuY2xvc2UgaXQgaW4gYSA8dHQ+JXssJX08L3R0PiBibG9jay4gICBOb3cgYWRkIGEgbGluZSB0aGF0IG1ha2VzIGEgY2FsbCB0byA8dHQ+U1dJR19pbml0KCk8L3R0Pi4gICAgVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0byB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGVuIGNvbXBpbGVkLjxwPgotPGEgbmFtZT0ibjY2Ij48L2E+PGgzPiBDb21iaW5pbmcgVGNsL1RrIEV4dGVuc2lvbnM8L2gzPgotQSBzbGlnaHRseSBkaWZmZXJlbnQgcHJvYmxlbSBjb25jZXJucyB0aGUgbWl4aW5nIG9mIHZhcmlvdXMgZXh0ZW5zaW9ucy4gIE1vc3QgZXh0ZW5zaW9ucyBkb24ndCByZXF1aXJlIGFueSBzcGVjaWFsIGluaXRpYWxpemF0aW9uIG90aGVyIHRoYW4gY2FsbGluZyB0aGVpciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gIFRvIGRvIHRoaXMsIHdlIGFsc28gdXNlIFNXSUcgbGlicmFyeSBtZWNoYW5pc20uICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gYmx0LmkgOiBTV0lHIGxpYnJhcnkgZmlsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBCTFQgZXh0ZW5zaW9uCi0lewotI2lmZGVmIF9fY3BsdXNwbHVzIAotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWV4dGVybiBpbnQgQmx0X0luaXQoVGNsX0ludGVycCAqKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0lfQotJWluaXQgJXsKLQlpZiAoQmx0X0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0lfQotCi0KLS8vIHRpeC5pIDogU1dJRyBsaWJyYXJ5IGZpbGUgZm9yIGluaXRpYWxpemluZyB0aGUgVGl4IGV4dGVuc2lvbgotJXsKLSNpZmRlZiBfX2NwbHVzcGx1cyAKLWV4dGVybiAiQyIgewotI2VuZGlmCi1leHRlcm4gaW50IFRpeF9Jbml0KFRjbF9JbnRlcnAgKik7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotJX0KLSVpbml0ICV7Ci0JaWYgKFRpeF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0JCXJldHVybiBUQ0xfRVJST1I7Ci0JfQotJX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQm90aCBmaWxlcyBkZWNsYXJlIHRoZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKHRvIGJlIEMrKyBmcmllbmRseSwgdGhpcyBzaG91bGQgYmUgZG9uZSB1c2luZyA8dHQ+ZXh0ZXJuICJDIjwvdHQ+KS4gICAgQSBjYWxsIHRvIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbnNpZGUgYSA8dHQ+JWluaXQgJXsgLi4uICV9PC90dD4gYmxvY2suICA8cD4KLTxwPgotVG8gdXNlIG91ciBsaWJyYXJ5IGZpbGVzIGFuZCBidWlsZCBhIG5ldyB2ZXJzaW9uIG9mIHdpc2gsIHdlIG1pZ2h0IG5vdyBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBteXdpc2guaSA6IHdpc2ggd2l0aCBhIGJ1bmNoIG9mIHN0dWZmIGFkZGVkIHRvIGl0Ci0laW5jbHVkZSB3aXNoLmkKLSVpbmNsdWRlIGJsdC5pCi0laW5jbHVkZSB0aXguaQotCi0uLi4gYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU9mIGNvdXJzZSwgdGhlIHJlYWxseSBjb29sIHBhcnQgYWJvdXQgYWxsIG9mIHRoaXMgaXMgdGhhdCB0aGUgZmlsZSBgPHR0Pm15d2lzaC5pPC90dD4nIGNhbiBpdHNlbGYsIHNlcnZlIGFzIGEgbGlicmFyeSBmaWxlLiAgIFRodXMsIHdoZW4gYnVpbGRpbmcgdmFyaW91cyB2ZXJzaW9ucyBvZiBUY2wsIHdlIGNhbiBwbGFjZSBldmVyeXRoaW5nIHdlIHdhbnQgdG8gdXNlIGEgc3BlY2lhbCBmaWxlIGFuZCB1c2UgaXQgaW4gYWxsIG9mIG91ciBvdGhlciBpbnRlcmZhY2UgZmlsZXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIGludGVyZmFjZS5pCi0lbW9kdWxlIG15bW9kdWxlCi0KLSVpbmNsdWRlIG15d2lzaC5pICAgICAgICAgICAgICAvLyBCdWlsZCBvdXIgdmVyc2lvbiBvZiBUY2wgd2l0aCBleHRlbnNpb25zCi0KLS4uLiBDIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3Igd2UgY2FuIGdyYWIgaXQgb24gdGhlIGNvbW1hbmQgbGluZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLXRjbCAtbG15d2lzaC5pIGludGVyZmFjZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42NyI+PC9hPjxoMz4gTGltaXRhdGlvbnMgdG8gdGhpcyBhcHByb2FjaDwvaDM+Ci1UaGlzIGludGVyZmFjZSBnZW5lcmF0aW9uIGFwcHJvYWNoIGlzIGxpbWl0ZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgb2YgZWFjaCBleHRlbnNpb24geW91IHVzZS4gIElmIGFueSBvbmUgZXh0ZW5zaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIG9mIFRjbCB5b3UgYXJlIHVzaW5nLCB5b3UgbWF5IGJlIG91dCBvZiBsdWNrLiAgSXQgaXMgYWxzbyBjcml0aWNhbCB0byBwYXkgY2FyZWZ1bCBhdHRlbnRpb24gdG8gbGlicmFyaWVzIGFuZCBpbmNsdWRlIGZpbGVzLiAgQW4gZXh0ZW5zaW9uIGxpYnJhcnkgY29tcGlsZWQgYWdhaW5zdCBhbiBvbGRlciB2ZXJzaW9uIG9mIFRjbCBtYXkgZmFpbCB3aGVuIGxpbmtlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbi4gIDxwPgotPGEgbmFtZT0ibjY4Ij48L2E+PGgzPiBEeW5hbWljIGxvYWRpbmcgPC9oMz4KLU5ld2VyIHZlcnNpb25zIG9mIFRjbCBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZy4gICBXaXRoIGR5bmFtaWMgbG9hZGluZywgeW91IGNvbXBpbGUgZWFjaCBleHRlbnNpb24gaW50byBhIHNlcGFyYXRlIG1vZHVsZSB0aGF0IGNhbiBiZSBsb2FkZWQgYXQgcnVuIHRpbWUuICAgVGhpcyBzaW1wbGlmaWVzIGEgbnVtYmVyIG9mIGNvbXBpbGF0aW9uIGFuZCBleHRlbnNpb24gYnVpbGRpbmcgcHJvYmxlbXMgYXQgdGhlIGV4cGVuc2Ugb2YgY3JlYXRpbmcgbmV3IG9uZXMuICBNb3N0IG5vdGFibHksIHRoZSBkeW5hbWljIGxvYWRpbmcgcHJvY2VzcyB2YXJpZXMgd2lkZWx5IGJldHdlZW4gbWFjaGluZXMgYW5kIGlzIG5vdCBldmVuIHN1cHBvcnRlZCBpbiBzb21lIGNhc2VzLiAgIEl0IGFsc28gZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggQysrIHByb2dyYW1zIHRoYXQgdXNlIHN0YXRpYyBjb25zdHJ1Y3RvcnMuICAgTW9kdWxlcyBsaW5rZWQgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBUY2wgbWF5IG5vdCB3b3JrIHdpdGggbmV3ZXIgdmVyc2lvbnMgYXMgd2VsbCAoYWx0aG91Z2ggU1dJRyBvbmx5IHJlYWxseSB1c2VzIHRoZSBiYXNpYyBUY2wgQyBpbnRlcmZhY2UpLiAgQXMgYSByZXN1bHQsIEkgdXN1YWxseSBmaW5kIG15c2VsZiB1c2luZyBib3RoIGR5bmFtaWMgYW5kIHN0YXRpYyBsaW5raW5nIGFzIGFwcHJvcHJpYXRlLiA8cD4KLTxhIG5hbWU9Im42OSI+PC9hPjxoMz4gVHVybmluZyBhIFNXSUcgbW9kdWxlIGludG8gYSBUY2wgUGFja2FnZS48L2gzPgotVGNsIDcuNCBpbnRyb2R1Y2VkIHRoZSBpZGVhIG9mIGFuIGV4dGVuc2lvbiBwYWNrYWdlLiAgIEJ5IGRlZmF1bHQsIFNXSUcgZG9lcyBub3QgY3JlYXRlICJwYWNrYWdlcyIsIGJ1dCBpdCBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gZG8uICAgVG8gbWFrZSBhIEMgZXh0ZW5zaW9uIGludG8gYSBUY2wgcGFja2FnZSwgeW91IG5lZWQgdG8gcHJvdmlkZSBhIGNhbGwgdG8gPHR0PlRjbF9Qa2dQcm92aWRlKCkgPC90dD5pbiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uPHR0Pi48L3R0PiAgIFRoaXMgY2FuIGJlIGRvbmUgaW4gYW4gaW50ZXJmYWNlIGZpbGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWluaXQgJXsKLSAgICAgICAgVGNsX1BrZ1Byb3ZpZGUoaW50ZXJwLCJleGFtcGxlIiwiMC4wIik7Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVyZSAiZXhhbXBsZSIgaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgYW5kICIwLjAiIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLiAgPHA+Ci08cD4KLU5leHQsIGFmdGVyIGJ1aWxkaW5nIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUsIHlvdSBuZWVkIHRvIGV4ZWN1dGUgdGhlICI8dHQ+cGtnX21rSW5kZXg8L3R0PiIgY29tbWFuZCBpbnNpZGUgdGNsc2guICAgRm9yIGV4YW1wbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyB0Y2xzaAotJSBwa2dfbWtJbmRleCAuIGV4YW1wbGUuc28KLSUgZXhpdAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGNyZWF0ZXMgYSBmaWxlICI8dHQ+cGtnSW5kZXgudGNsPC90dD4iIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2thZ2UuICAgIFRvIHVzZSB5b3VyPHA+Ci1wYWNrYWdlLCB5b3Ugbm93IG5lZWQgdG8gbW92ZSBpdCB0byBpdHMgb3duIHN1YmRpcmVjdG9yeSB3aGljaCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcGFja2FnZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi4vZXhhbXBsZS8KLQkgICBwa2dJbmRleC50Y2wgICAgICAgICAgICMgVGhlIGZpbGUgY3JlYXRlZCBieSBwa2dfbWtJbmRleAotCSAgIGV4YW1wbGUuc28gICAgICAgICAgICAgIyBUaGUgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRmluYWxseSwgYXNzdW1pbmcgdGhhdCB5b3UncmUgbm90IGVudGlyZWx5IGNvbmZ1c2VkIGF0IHRoaXMgcG9pbnQsIG1ha2Ugc3VyZSB0aGF0IHRoZSBleGFtcGxlIHN1YmRpcmVjdG9yeSBpcyB2aXNpYmxlIGZyb20gdGhlIGRpcmVjdG9yaWVzIGNvbnRhaW5lZCBpbiBlaXRoZXIgdGhlIDx0dD50Y2xfbGlicmFyeTwvdHQ+IG9yIDx0dD5hdXRvX3BhdGg8L3R0PiB2YXJpYWJsZXMuICBBdCB0aGlzIHBvaW50IHlvdSdyZSByZWFkeSB0byB1c2UgdGhlIHBhY2thZ2UgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdW5peCAmZ3Q7IHRjbHNoCi0lIHBhY2thZ2UgcmVxdWlyZSBleGFtcGxlCi0lIGZhY3QgNAotMjQKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSWYgIHlvdSdyZSB3b3JraW5nIHdpdGggYW4gZXhhbXBsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoaXMgZG9lc24ndCB3b3JrLCBkbyB0aGlzIGluc3RlYWQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyB0Y2xzaAotJSBsYXBwZW5kIGF1dG9fcGF0aCAuCi0lIHBhY2thZ2UgcmVxdWlyZSBleGFtcGxlCi0lIGZhY3QgNAotMjQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BcyBhIGZpbmFsIG5vdGUsIG1vc3QgU1dJRyBleGFtcGxlcyBkbyBub3QgeWV0IHVzZSB0aGUgPHR0PnBhY2thZ2U8L3R0PiBjb21tYW5kcy4gRm9yIHNpbXBsZSBleHRlbnNpb25zIGl0IG1heSBiZSBlYXNpZXIganVzdCB0byB1c2UgdGhlIDx0dD5sb2FkPC90dD4gY29tbWFuZCBpbnN0ZWFkLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgyPiBCdWlsZGluZyBuZXcga2luZHMgb2YgVGNsIGludGVyZmFjZXMgKGluIFRjbCk8L2gyPgotT25lIG9mIHRoZSBtb3N0IGludGVyZXN0aW5nIGFzcGVjdHMgb2YgVGNsIGFuZCBTV0lHIGlzIHRoYXQgeW91IGNhbiBjcmVhdGUgZW50aXJlbHkgbmV3IGtpbmRzIG9mIFRjbCBpbnRlcmZhY2VzIGluIFRjbCB1c2luZyB0aGUgbG93LWxldmVsIFNXSUcgYWNjZXNzb3IgZnVuY3Rpb25zLiAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSAgaGFkIGEgbGlicmFyeSBvZiBoZWxwZXIgZnVuY3Rpb25zIHRvIGFjY2VzcyBhcnJheXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBhcnJheS5pICovCi0lbW9kdWxlIGFycmF5Ci0KLSVpbmxpbmUgJXsKLWRvdWJsZSAqbmV3X2RvdWJsZShpbnQgc2l6ZSkgewotICAgICAgICByZXR1cm4gKGRvdWJsZSAqKSBtYWxsb2Moc2l6ZSpzaXplb2YoZG91YmxlKSk7Ci19Ci12b2lkIGRlbGV0ZV9kb3VibGUoZG91YmxlICphKSB7Ci0gICAgICAgIGZyZWUoYSk7Ci19Ci1kb3VibGUgZ2V0X2RvdWJsZShkb3VibGUgKmEsIGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gYVtpbmRleF07Ci19Ci12b2lkIHNldF9kb3VibGUoZG91YmxlICphLCBpbnQgaW5kZXgsIGRvdWJsZSB2YWwpIHsKLSAgICAgICAgYVtpbmRleF0gPSB2YWw7Ci19Ci1pbnQgKm5ld19pbnQoaW50IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIChpbnQgKikgbWFsbG9jKHNpemUqc2l6ZW9mKGludCkpOwotfQotdm9pZCBkZWxldGVfaW50KGludCAqYSkgewotICAgICAgICBmcmVlKGEpOwotfQotaW50IGdldF9pbnQoaW50ICphLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGFbaW5kZXhdOwotfQotaW50IHNldF9pbnQoaW50ICphLCBpbnQgaW5kZXgsIGludCB2YWwpIHsKLSAgICAgICAgYVtpbmRleF0gPSB2YWw7Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSB0aGVzZSBjb3VsZCBiZSBjYWxsZWQgZGlyZWN0bHksIHdlIGNvdWxkIGFsc28gd3JpdGUgYSBUY2wgc2NyaXB0IGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBBcnJheSB7dHlwZSBzaXplfSB7Ci0gICAgc2V0IHB0ciBbbmV3XyR0eXBlICRzaXplXQotICAgIHNldCBjb2RlIHsKLSAgICAgICAgc2V0IG1ldGhvZCBbbGluZGV4ICRhcmdzIDBdCi0gICAgICAgIHNldCBwYXJtcyBbY29uY2F0ICRwdHIgW2xyYW5nZSAkYXJncyAxIGVuZF1dCi0gICAgICAgIHN3aXRjaCAkbWV0aG9kIHsKLSAgICAgICAgICAgIGdldCB7cmV0dXJuIFtldmFsICJnZXRfJHR5cGUgJHBhcm1zIl19Ci0gICAgICAgICAgICBzZXQge3JldHVybiBbZXZhbCAic2V0XyR0eXBlICRwYXJtcyJdfQotICAgICAgICAgICAgZGVsZXRlIHtldmFsICJkZWxldGVfJHR5cGUgJHB0cjsgcmVuYW1lICRwdHIge30ifQotICAgICAgICB9Ci0gICAgfQotICAgICMgQ3JlYXRlIGEgcHJvY2VkdXJlCi0gICAgdXBsZXZlbCAicHJvYyAkcHRyIGFyZ3Mge3NldCBwdHIgJHB0cjsgc2V0IHR5cGUgJHR5cGU7JGNvZGV9IgotICAgIHJldHVybiAkcHRyCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU91ciBzY3JpcHQgYWxsb3dzIGVhc3kgYXJyYXkgYWNjZXNzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnNldCBhIFtBcnJheSBkb3VibGUgMTAwXSAgICAgICAgICAgICAgICAgICA7IyBDcmVhdGUgYSBkb3VibGUgWzEwMF0KLWZvciB7c2V0IGkgMH0geyRpICZsdDsgMTAwfSB7aW5jciBpIDF9IHsgICAgICA7IyBDbGVhciB0aGUgYXJyYXkKLQkkYSBzZXQgJGkgMC4wCi19Ci0kYSBzZXQgMyAzLjE0NTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgU2V0IGFuIGluZGl2aWR1YWwgZWxlbWVudAotc2V0IGIgWyRhIGdldCAxMF0gICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFJldHJpZXZlIGFuIGVsZW1lbnQKLQotc2V0IGlhIFtBcnJheSBpbnQgNTBdICAgICAgICAgICAgICAgICAgICAgIDsjIENyZWF0ZSBhbiBpbnRbNTBdCi1mb3Ige3NldCBpIDB9IHskaSAmbHQ7IDUwfSB7aW5jciBpIDF9IHsgICAgICAgOyMgQ2xlYXIgaXQKLQkkaWEgc2V0ICRpIDAKLX0KLSRpYSBzZXQgMyA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IyBTZXQgYW4gaW5kaXZpZHVhbCBlbGVtZW50Ci1zZXQgaWIgWyRpYSBnZXQgMTBdICAgICAgICAgICAgICAgICAgICAgICAgOyMgR2V0IGFuIGluZGl2aWR1YWwgZWxlbWVudAotCi0kYSBkZWxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgRGVzdHJveSBhCi0kaWEgZGVsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgRGVzdHJveSBpYQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgY29vbCB0aGluZyBhYm91dCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgbWFrZXMgYSBjb21tb24gaW50ZXJmYWNlIGZvciB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGFycmF5cy4gICBJbiBmYWN0LCBpZiB3ZSB3ZXJlIHRvIGFkZCBtb3JlIEMgZGF0YXR5cGVzIHRvIG91ciB3cmFwcGVyIGZpbGUsIHRoZSBUY2wgY29kZSB3b3VsZCB3b3JrIHdpdGggdGhvc2UgYXMgd2VsbC0td2l0aG91dCBtb2RpZmljYXRpb24uICAgIElmIGFuIHVuc3VwcG9ydGVkIGRhdGF0eXBlIHdhcyByZXF1ZXN0ZWQsIHRoZSBUY2wgY29kZSB3b3VsZCBzaW1wbHkgcmV0dXJuIHdpdGggYW4gZXJyb3Igc28gdGhlcmUgaXMgdmVyeSBsaXR0bGUgZGFuZ2VyIG9mIGJsb3dpbmcgc29tZXRoaW5nIHVwICAoYWx0aG91Z2ggaXQgaXMgZWFzaWx5IGFjY29tcGxpc2hlZCB3aXRoIGFuIG91dCBvZiBib3VuZHMgYXJyYXkgYWNjZXNzKS48cD4KLTxhIG5hbWU9Im43MCI+PC9hPjxoMz4gU2hhZG93IGNsYXNzZXM8L2gzPgotQSBzaW1pbGFyIGFwcHJvYWNoIGNhbiBiZSBhcHBsaWVkIHRvIHNoYWRvdyBjbGFzc2VzLiAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBwcm92aWRlZCBieSBFcmlrIEJpZXJ3YWdlbiBhbmQgUGF1bCBTYXhlLiAgIFRvIHVzZSBpdCwgcnVuIFNXSUcgd2l0aCB0aGUgPHR0Pi1ub29iamVjdDwvdHQ+IG9wdGlvbiAod2hpY2ggZGlzYWJsZXMgdGhlIGJ1aWx0aW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSkuICAgV2hlbiBydW5uaW5nIFRjbCwgc2ltcGx5IHNvdXJjZSB0aGlzIGZpbGUuICAgTm93LCBvYmplY3RzIGNhbiBiZSB1c2VkIGluIGEgbW9yZSBvciBsZXNzIG5hdHVyYWwgZmFzaGlvbi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIHN3aWdfYysrLnRjbAotIyBQcm92aWRlcyBhIHNpbXBsZSBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHVzaW5nCi0jIFNXSUcncyBsb3cgbGV2ZWwgaW50ZXJmYWNlLgotIwotCi1wcm9jIG5ldyB7b2JqZWN0VHlwZSBoYW5kbGVfciBhcmdzfSB7Ci0gICAgIyBDcmVhdGVzIGEgbmV3IFNXSUcgb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlLAotICAgICMgcmV0dXJuaW5nIGEgaGFuZGxlIGluIHRoZSB2YXJpYWJsZSAiaGFuZGxlX3IiLgotICAgICMKLSAgICAjIEFsc28gY3JlYXRlcyBhIHByb2NlZHVyZSBmb3IgdGhlIG9iamVjdCBhbmQgYSB0cmFjZSBvbgotICAgICMgdGhlIGhhbmRsZSB2YXJpYWJsZSB0aGF0IGRlbGV0ZXMgdGhlIG9iamVjdCB3aGVuIHRoZQotICAgICMgaGFuZGxlIHZhcmliYWxlIGlzIG92ZXJ3cml0dGVuIG9yIHVuc2V0Ci0gICAgdXB2YXIgJGhhbmRsZV9yIGhhbmRsZQotICAgICMKLSAgICAjIENyZWF0ZSB0aGUgbmV3IG9iamVjdAotICAgICMKLSAgICBldmFsIHNldCBoYW5kbGUgXFtuZXdfJG9iamVjdFR5cGUgJGFyZ3NcXQotICAgICMKLSAgICAjIFNldCB1cCB0aGUgb2JqZWN0IHByb2NlZHVyZQotICAgICMKLSAgICBwcm9jICRoYW5kbGUge2NtZCBhcmdzfSAiZXZhbCAke29iamVjdFR5cGV9X1wkY21kICRoYW5kbGUgXCRhcmdzIgotICAgICMKLSAgICAjIEFuZCB0aGUgdHJhY2UgLi4uCi0gICAgIwotICAgIHVwbGV2ZWwgdHJhY2UgdmFyaWFibGUgJGhhbmRsZV9yIHV3ICJ7ZGVsZXRlT2JqZWN0ICRvYmplY3RUeXBlICRoYW5kbGV9IgotICAgICMKLSAgICAjIFJldHVybiB0aGUgaGFuZGxlIHNvIHRoYXQgJ25ldycgY2FuIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gYSBwcm9jZWR1cmUKLSAgICAjCi0gICAgcmV0dXJuICRoYW5kbGUKLX0KLQotcHJvYyBkZWxldGVPYmplY3Qge29iamVjdFR5cGUgaGFuZGxlIG5hbWUgZWxlbWVudCBvcH0gewotICAgICMKLSAgICAjIENoZWNrIHRoYXQgdGhlIG9iamVjdCBoYW5kbGUgaGFzIGEgcmVhc29uYWJsZSBmb3JtCi0gICAgIwotICAgIGlmIHshW3JlZ2V4cCB7X1swLTlhLWZdKl8oLispX3B9ICRoYW5kbGVdfSB7Ci0gICAgICAgIGVycm9yICJkZWxldGVPYmplY3Q6IG5vdCBhIHZhbGlkIG9iamVjdCBoYW5kbGU6ICRoYW5kbGUiCi0gICAgfQotICAgICMKLSAgICAjIFJlbW92ZSB0aGUgb2JqZWN0IHByb2NlZHVyZQotICAgICMKLSAgICBjYXRjaCB7cmVuYW1lICRoYW5kbGUge319Ci0gICAgIwotICAgICMgRGVsZXRlIHRoZSBvYmplY3QKLSAgICAjCi0gICAgZGVsZXRlXyRvYmplY3RUeXBlICRoYW5kbGUKLX0KLQotcHJvYyBkZWxldGUge2hhbmRsZV9yfSB7Ci0gICAgIwotICAgICMgQSBzeW5vbnltIGZvciB1bnNldCB0aGF0IGlzIG1vcmUgZmFtaWxpYXIgdG8gQysrIHByb2dyYW1tZXJzCi0gICAgIwotICAgIHVwbGV2ZWwgdW5zZXQgJGhhbmRsZV9yCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRvIHVzZSB0aGlzIGZpbGUsIHdlIHNpbXBseSBzb3VyY2UgaXQgYW5kIGV4ZWN1dGUgY29tbWFuZHMgc3VjaCBhcyAibmV3IiBhbmQgImRlbGV0ZSIgdG8gbWFuaXB1bGF0ZSBvYmplY3RzLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIGxpc3QuaQotJW1vZHVsZSBMaXN0Ci0lewotI2luY2x1ZGUgImxpc3QuaCIKLSV9Ci0KLS8vIFZlcnkgc2ltcGxlIEMrKyBleGFtcGxlCi0KLWNsYXNzIExpc3QgewotcHVibGljOgotICBMaXN0KCk7ICAvLyBDcmVhdGUgYSBuZXcgbGlzdAotICB+TGlzdCgpOyAvLyBEZXN0cm95IGEgbGlzdAotICBpbnQgIHNlYXJjaChjaGFyICp2YWx1ZSk7Ci0gIHZvaWQgaW5zZXJ0KGNoYXIgKik7ICAvLyBJbnNlcnQgYSBuZXcgaXRlbSBpbnRvIHRoZSBsaXN0Ci0gIHZvaWQgcmVtb3ZlKGNoYXIgKik7ICAvLyBSZW1vdmUgaXRlbSBmcm9tIGxpc3QKLSAgY2hhciAqZ2V0KGludCBuKTsgICAgIC8vIEdldCB0aGUgbnRoIGl0ZW0gaW4gdGhlIGxpc3QKLSAgaW50ICBsZW5ndGg7ICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgbGlzdAotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7ICAvLyBQcmludCBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3cgYSBUY2wgc2NyaXB0IHVzaW5nIHRoZSBpbnRlcmZhY2UuLi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vbGlzdC5zbyBsaXN0ICAgICAgIDsgIyBMb2FkIHRoZSBtb2R1bGUKLXNvdXJjZSBzd2lnX2MrKy50Y2wgICAgICAgOyAjIFNvdXJjZSB0aGUgb2JqZWN0IGZpbGUKLQotbmV3IExpc3QgbAotJGwgaW5zZXJ0IERhdmUKLSRsIGluc2VydCBKb2huCi0kbCBpbnNlcnQgR3VpZG8KLSRsIHJlbW92ZSBEYXZlCi1wdXRzICRsIGxlbmd0aF9nZXQKLQotZGVsZXRlIGwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGNvb2wgdGhpbmcgYWJvdXQgdGhpcyBleGFtcGxlIGlzIHRoYXQgaXQgd29ya3Mgd2l0aCBhbnkgQysrIG9iamVjdCB3cmFwcGVkIGJ5IFNXSUcgYW5kIHJlcXVpcmVzIG5vIHNwZWNpYWwgY29tcGlsYXRpb24uICAgIFByb29mIHRoYXQgYSBzaG9ydCwgYnV0IGNsZXZlciBUY2wgc2NyaXB0IGNhbiBiZSBjb21iaW5lZCB3aXRoIFNXSUcgdG8gZG8gbWFueSBpbnRlcmVzdGluZyB0aGluZ3MuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDI+IEV4dGVuZGluZyB0aGUgVGNsIE5ldHNjYXBlIFBsdWdpbjwvaDI+Ci1TV0lHIGNhbiBiZSB1c2VkIHRvIGV4dGVuZCB0aGUgVGNsIE5ldHNjYXBlIHBsdWdpbiB3aXRoIEMgZnVuY3Rpb25zLiBBcyBvZiB0aGlzIHdyaXRpbmcgaXQgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgd2l0aCB2ZXJzaW9uIDEuMCBvZiB0aGUgcGx1Z2luIG9uIFNvbGFyaXMgYW5kIElyaXggNi4yLiAgSXQgbWF5IHdvcmsgb24gb3RoZXIgbWFjaGluZXMgYXMgd2VsbC4gSG93ZXZlciwgZmlyc3QgYSB3b3JkIG9mIGNhdXRpb24gLS0tIGRvaW5nIHRoaXMgbWlnaHQgcmVzdWx0IGluIHNlcmlvdXMgaW5qdXJ5IGFzIHlvdSBjYW4gYWRkIGp1c3QgYWJvdXQgYW55IEMgZnVuY3Rpb24geW91IHdhbnQuICAgRnVydGhlcm1vcmUsIGl0J3Mgbm90IHBvcnRhYmxlIChoZXksIHdlJ3JlIHRhbGtpbmcgQyBjb2RlIGhlcmUpLiAgICBJdCBzZWVtcyBsaWtlIHRoZSBiZXN0IGFwcGxpY2F0aW9uIG9mIHRoaXMgd291bGQgYmUgY3JlYXRpbmcgYSBicm93c2VyIGludGVyZmFjZSB0byBhIGhpZ2hseSBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbi4gIEFueSBzY3JpcHRzIHRoYXQgeW91IHdvdWxkIHdyaXRlIHdvdWxkIG5vdCB3b3JrIG9uIG90aGVyIG1hY2hpbmVzIHVubGVzcyB0aGV5IGFsc28gaW5zdGFsbGVkIHRoZSBDIGV4dGVuc2lvbiBjb2RlIGFzIHdlbGwuICBQZXJoYXBzIHdlIHNob3VsZCBjYWxsIHRoaXMgYSBwbHVnaW4tcGx1Z2luLi4uPHA+Ci08cD4KLVRvIHVzZSB0aGUgcGx1Z2luLCB1c2UgdGhlIDx0dD4tcGx1Z2luPC90dD4gb3B0aW9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zd2lnIC10Y2wgLXBsdWdpbiBpbnRlcmZhY2UuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGFkZHMgYSAic2FmZSIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gY29tcGF0aWJsZSB3aXRoIHRoZSBwbHVnaW4gKGluIHJlYWxpdHksIGl0IGp1c3QgY2FsbHMgdGhlIGZ1bmN0aW9uIFNXSUcgYWxyZWFkeSBjcmVhdGVzKS4gICAgWW91IGFsc28gbmVlZCB0byBwdXQgdGhlIGZvbGxvd2luZyBzeW1ib2wgaW4geW91ciBpbnRlcmZhY2UgZmlsZSBmb3IgaXQgdG8gd29yayA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXsKLSNkZWZpbmUgU0FGRV9TV0lHCi0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZm9sa3MgYXQgU3VuIGFyZSBxdWl0ZSBjb25jZXJuZWQgYWJvdXQgdGhlIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBvZiB0aGlzIHNvcnQgb2YgZXh0ZW5zaW9uIGFuZCBvcmlnaW5hbGx5IHdhbnRlZCB0aGUgdXNlciB0byBtb2RpZnkgdGhlIHdyYXBwZXIgY29kZSBieSBoYW5kIHRvICJyZW1pbmQiIHRoZW0gdGhhdCB0aGV5IHdlcmUgaW5zdGFsbGluZyBmdW5jdGlvbnMgaW50byBhIHNhZmUgaW50ZXJwcmV0ZXIuICAgSG93ZXZlciwgaGF2aW5nIHNlZW4gYWxvdCBvZiBTV0lHIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUsIEkgaGF0ZWQgdGhhdCBpZGVhIChva2F5LCBzbyB0aGUgb3V0cHV0IG9mIFNXSUcgaXMganVzdCBhIGxpdHRsZSBtZXNzeSkuICAgIFRoaXMgaXMgY29tcHJvbWlzZS0teW91IG5lZWQgdG8gcHV0IHRoYXQgPHR0PiNkZWZpbmU8L3R0PiBpbnRvIHlvdXIgQyBmaWxlIHNvbWVwbGFjZS4gIFlvdSBjYW4gYWxzbyBqdXN0IG1ha2UgaXQgYSBjb21waWxlciBvcHRpb24gaWYgeW91IHdvdWxkIGxpa2UuPHA+Ci08YSBuYW1lPSJuNzEiPjwvYT48aDM+IFRoZSBzdGVwLWJ5LXN0ZXAgcHJvY2VzcyBmb3IgbWFraW5nIGEgcGx1Z2luIGV4dGVuc2lvbi48L2gzPgotTWFraW5nIGEgcGx1Z2luIGV4dGVuc2lvbiBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCBidXQgeW91IG5lZWQgdG8gZm9sbG93IHRoZXNlIHN0ZXBzIDo8cD4KLTxwPgotPHVsPgotPGxpPk1ha2Ugc3VyZSB5b3UgaGF2ZSBUY2w3LjYvVGs0LjIgaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZS4gICBXZSdyZSBnb2luZyB0byBuZWVkIHRoZSBoZWFkZXIgZmlsZXMgaW50byBvcmRlciB0byBjb21waWxlIHRoZSBleHRlbnNpb24uCi08bGk+TWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBOZXRzY2FwZSBwbHVnaW4gcHJvcGVybHkgaW5zdGFsbGVkLgotPGxpPlJ1biBTV0lHIHVzaW5nIHRoZSBgPHR0Pi10Y2wgLXBsdWdpbjwvdHQ+JyBvcHRpb25zLiAKLTxsaT5Db21waWxlIHRoZSBleHRlbnNpb24gdXNpbmcgdGhlIFRjbCA3LjYvVGs0LjIgaGVhZGVyIGZpbGVzLCBidXQgbGlua2luZyBhZ2FpbnN0IHRoZSBwbHVnaW4gaXRzZWxmLiAgRm9yIGV4YW1wbGUgOgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBnY2MgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLWMgZXhhbXBsZS5vIGludGVyZmFjZV93cmFwLmMgCi11bml4ICZndDsgbGQgLXNoYXJlZCBleGFtcGxlLm8gaW50ZXJmYWNlX3dyYXAubyBcCi0gICAgICAgLUwvaG9tZS9iZWF6bGV5Ly5uZXRzY2FwZS9wbHVnaW5zL2xpYnRjbHBsdWdpbi5zbyAtbyBleGFtcGxlLnNvIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08bGk+Q29weSB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHRvIHRoZSA8dHQ+fi8udGNscGx1Zy90Y2w3Ljc8L3R0PiBkaXJlY3RvcnkuCi08L3VsPgotPGEgbmFtZT0ibjcyIj48L2E+PGgzPiBVc2luZyB0aGUgcGx1Z2luPC9oMz4KLVRvIHVzZSB0aGUgcGx1Z2luLCBwbGFjZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBUY2wgc2NyaXB0cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+bG9hZCAkdGNsX2xpYnJhcnkvZXhhbXBsZS5zbyBleGFtcGxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpdGggbHVjaywgeW91IHdpbGwgbm93IGJlIHJlYWR5IHRvIHJ1biAoYXQgbGVhc3QgdGhhdCdzIHRoZSB0aGVvcnkpLjxwPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgyPiBUY2w4LjAgZmVhdHVyZXM8L2gyPgotU1dJRyAxLjEgbm93IHN1cHBvcnRzIFRjbCA4LjAuICBIb3dldmVyLCBjb25zaWRlcmluZyB0aGUgYmV0YSByZWxlYXNlIG5hdHVyZSBvZiBUY2wgOC4wLCBhbnl0aGluZyBwcmVzZW50ZWQgaGVyZSBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gIEN1cnJlbnRseSBvbmx5IFRjbCA4LjBiMSBpcyBzdXBwb3J0ZWQuICBOb25lIG9mIHRoZSBhbHBoYSByZWxlYXNlcyBhcmUgc3VwcG9ydGVkIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgQyBBUEkuIDxwPgotPHA+Ci1UaGUgVGNsIDguMCBtb2R1bGUgdXNlcyB0aGUgbmV3IFRjbCA4LjAgb2JqZWN0IGludGVyZmFjZSB3aGVuZXZlciBwb3NzaWJsZS4gIEluc3RlYWQgb2YgdXNpbmcgc3RyaW5ncywgdGhlIG9iamVjdCBpbnRlcmZhY2UgcHJvdmlkZXMgbW9yZSBkaXJlY3QgYWNjZXNzIHRvIG9iamVjdHMgaW4gdGhlaXIgbmF0aXZlIHJlcHJlc2VudGF0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIHBlcmZvcm1hbmNlIGlzIHNpZ25pZmljYW50bHkgYmV0dGVyLiAgICAgVGhlIG9sZGVyIFRjbCBTV0lHIG1vZHVsZSBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBUY2wgOC4wLCBidXQgc2luY2UgaXQgdXNlcyBzdHJpbmdzIGl0IHdpbGwgYmUgbXVjaCBzbG93ZXIgdGhhbiB0aGUgbmV3IHZlcnNpb24uPHA+Ci08cD4KLUluIGFkZGl0aW9uIHRvIHVzaW5nIG5hdGl2ZSBUY2wgb2JqZWN0cywgdGhlIFRjbDguMCBtYW5pcHVsYXRlcyBwb2ludGVycyBkaXJlY3RseSBpbiBpbiBhIHNwZWNpYWwgVGNsIG9iamVjdC4gICBPbiB0aGUgc3VyZmFjZSBpdCBzdGlsbCBsb29rcyBsaWtlIGEgc3RyaW5nLCBidXQgaW50ZXJuYWxseSBpdHMgcmVwcmVzZW50ZWQgYSAodmFsdWUsdHlwZSkgcGFpci4gICBUaGlzIHRvbywgc2hvdWxkIG9mZmVyIHNvbWV3aGF0IGJldHRlciBwZXJmb3JtYW5jZS48cD4KLTxwPgotPHA+Ci0KLTxwPjxocj4KLQotPGFkZHJlc3M+U1dJRyAxLjEgLSBMYXN0IE1vZGlmaWVkIDogTW9uIEF1ZyAgNCAxMDo0NzoxMiAxOTk3PC9hZGRyZXNzPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9UeXBlbWFwcy5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9UeXBlbWFwcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVhMmNiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvVHlwZW1hcHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT42IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzPC9oMT48cD48dWw+Ci08bGk+IDxhIGhyZWY9IiNuMSI+SW50cm9kdWN0aW9uPC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPlRoZSBTV0lHIFBvaW50ZXIgTGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5JbnRyb2R1Y3Rpb24gdG8gdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+TWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzPC9hPgotPGxpPiA8YSBocmVmPSIjbjUiPkFwcGx5aW5nIGNvbnN0cmFpbnRzIHRvIGlucHV0IHZhbHVlczwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5Xcml0aW5nIG5ldyB0eXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5Db21tb24gdHlwZW1hcCBtZXRob2RzPC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPldyaXRpbmcgdHlwZW1hcCBjb2RlPC9hPgotPGxpPiA8YSBocmVmPSIjbjkiPlR5cGVtYXBzIGZvciBoYW5kbGluZyBhcnJheXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPlR5cGVtYXBzIGFuZCB0aGUgU1dJRyBMaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSIjbjExIj5JbXBsZW1lbnRpbmcgY29uc3RyYWludHMgd2l0aCB0eXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMiI+VHlwZW1hcCBleGFtcGxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMyI+SG93IHRvIGJyZWFrIGV2ZXJ5dGhpbmcgd2l0aCBhIHR5cGVtYXA8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTQiPlR5cGVtYXBzIGFuZCB0aGUgZnV0dXJlPC9hPgotPC91bD4KLQotPGEgbmFtZT0ibjEiPjwvYT48aDI+IEludHJvZHVjdGlvbjwvaDI+Ci1Gb3IgbW9zdCBhcHBsaWNhdGlvbnMsIFNXSUcncyB0cmVhdG1lbnQgb2YgYmFzaWMgZGF0YXR5cGVzIGFuZCBwb2ludGVycyBpcyBlbm91Z2ggdG8gYnVpbGQgYW4gaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBjZXJ0YWluIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgdG8gY2hhbmdlIFNXSUcncyB0cmVhdG1lbnQgb2YgcGFydGljdWxhciBkYXRhdHlwZXMuIEZvciBleGFtcGxlLCB3ZSBtYXkgd2FudCBhIDx0dD5jaGFyICoqIDwvdHQ+dG8gYWN0IGxpa2UgYSBsaXN0IG9mIHN0cmluZ3MgaW5zdGVhZCBvZiBhIHBvaW50ZXIuIEluIGFub3RoZXIgaW5zdGFuY2UsIHdlIG1heSB3YW50IHRvIHRlbGwgU1dJRyB0aGF0IDx0dD5kb3VibGUgKnJlc3VsdDwvdHQ+IGlzIHRoZSBvdXRwdXQgdmFsdWUgb2YgYSBmdW5jdGlvbi4gU2ltaWxhcmx5LCB3ZSBtaWdodCB3YW50IHRvIG1hcCBhIGRhdGF0eXBlIG9mIDx0dD5mbG9hdFs0XTwvdHQ+IGludG8gYSA0IGVsZW1lbnQgdHVwbGUuIFRoaXMgY2hhcHRlciBkZXNjcmliZXMgYWR2YW5jZWQgbWV0aG9kcyBmb3IgbWFuYWdpbmcgcG9pbnRlcnMsIGFycmF5cywgYW5kIGNvbXBsZXggZGF0YXR5cGVzLiBJdCBhbHNvIGRlc2NyaWJlcyBob3cgeW91IGNhbiBjdXN0b21pemUgU1dJRyB0byBoYW5kbGUgbmV3IGtpbmRzIG9mIG9iamVjdHMgYW5kIGRhdGF0eXBlcy48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBUaGUgU1dJRyBQb2ludGVyIExpYnJhcnk8L2gyPgotSWYgeW91ciBpbnRlcmZhY2UgaW52b2x2ZXMgQyBwb2ludGVycywgY2hhbmNlcyBhcmUgeW91IHdpbGwgbmVlZCB0byB3b3JrIHdpdGggdGhlc2UgcG9pbnRlcnMgaW4gc29tZSB3YXkgb3IgYW5vdGhlci4gVGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5IHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiB1c2VmdWwgbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIHBvaW50ZXJzLiBUbyB1c2UgdGhlIGxpYnJhcnksIHNpbXBseSBwdXQgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBpbiB5b3VyIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5jbHVkZSBwb2ludGVyLmkgCQkJCS8vIEdyYWIgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLW9yIHJ1biBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN3aWcgLXBlcmw1IC1scG9pbnRlci5pIGludGVyZmFjZS5pIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Eb2luZyBzbyBhZGRzIGEgY29sbGVjdGlvbiBvZiBwb2ludGVyIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgdGhhdCBhcmUgZGVzY3JpYmVkIGJlbG93LiBUaGUgZnVuY3Rpb25zIGFyZSBtYWlubHkgZGVzaWduZWQgdG8gd29yayB3aXRoIGJhc2ljIEMgZGF0YXR5cGVzLCBidXQgY2FuIG9mdGVuIGJlIHVzZWQgd2l0aCBtb3JlIGNvbXBsaWNhdGVkIHN0cnVjdHVyZXMuPHA+Ci08YSBuYW1lPSJuMTUiPjwvYT48aDM+IFBvaW50ZXIgTGlicmFyeSBGdW5jdGlvbnM8L2gzPgotPGI+cHRyY3JlYXRlKHR5cGUsP3ZhbHVlPyw/bml0ZW1zPyk8L2I+PHA+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5DcmVhdGVzIGEgbmV3IG9iamVjdCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuIDx0dD50eXBlPC90dD4gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgQyBkYXRhdHlwZSBhbmQgbWF5IGJlIG9uZSBvZiAiPHR0PmludDwvdHQ+IiwiPHR0PnNob3J0PC90dD4iLCI8dHQ+bG9uZzwvdHQ+IiwiPHR0PmZsb2F0PC90dD4iLCI8dHQ+ZG91YmxlPC90dD4iLCI8dHQ+Y2hhcjwvdHQ+IiwiPHR0PmNoYXIgKjwvdHQ+Iiwgb3IgIjx0dD52b2lkPC90dD4iLiA8dHQ+dmFsdWU8L3R0PiBpcyB0aGUgb3B0aW9uYWwgaW5pdGlhbCB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LiA8dHQ+bml0ZW1zPC90dD4gaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGNyZWF0ZS4gQnkgZGVmYXVsdCBpdCBpcyAxLCBidXQgc3BlY2lmeWluZyBhbm90aGVyIHZhbHVlIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuIGFycmF5IG9mIHZhbHVlcy4gVGhpcyBmdW5jdGlvbiBpcyByZWFsbHkganVzdCBhIHdyYXBwZXIgYXJvdW5kIHRoZSBDIDx0dD5tYWxsb2MoKTwvdHQ+IGZ1bmN0aW9uLgotPC9kbD4KLTxiPjwvYj48cD4KLTxiPnB0cmZyZWUocHRyKTwvYj48cD4KLTxkbD4KLTxkdD48ZGQ+RGVzdHJveXMgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgPHR0PnB0cmNyZWF0ZTwvdHQ+LiBJdCBpcyBnZW5lcmFsbHkgdW5zYWZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIG9uIG9iamVjdHMgbm90IGNyZWF0ZWQgYnkgPHR0PnB0cmNyZWF0ZTwvdHQ+LiBDYWxscyB0aGUgQyA8dHQ+ZnJlZSgpPC90dD4gZnVuY3Rpb24uCi08L2RsPgotPHA+Ci08Yj5wdHJ2YWx1ZShwdHIsP2luZGV4Pyw/dHlwZT8pPC9iPjxwPgotPGRsPgotPGR0PjxkZD5UaGlzIGRlcmVmZXJlbmNlcyBhIHBvaW50ZXIgYW5kIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgaXQgaXMgcG9pbnRpbmcgdG8uIDx0dD5pbmRleDwvdHQ+IGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGFsbG93cyBhcnJheSBhY2Nlc3MgYnkgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiA8dHQ+cHRyW2luZGV4XTwvdHQ+LiA8dHQ+dHlwZTwvdHQ+IGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBkYXRhdHlwZS4gU2luY2UgU1dJRyBwb2ludGVycyBhcmUgZW5jb2RlZCB3aXRoIHR5cGUgaW5mb3JtYXRpb24sIHRoZSB0eXBlIGlzIHVzdWFsbHkgdW5uZWNlc3NhcnkuIFRoZSA8dHQ+dHlwZTwvdHQ+IHBhcmFtZXRlciBwcm92aWRlcyBzb21ld2hhdCBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIGFsbG93cyB5b3UgdG8gZGVyZWZlcmVuY2UgYSBwb2ludGVyIG9mIGRpZmZlcmVudCB0eXBlIGhvd2V2ZXIuCi08ZHQ+PGRkPgotPC9kbD4KLTxiPnB0cnNldChwdHIsIHZhbHVlLCA/aW5kZXg/LCA/dHlwZT8pPC9iPjxwPgotPGRsPgotPGR0PjxkZD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0IGEgcG9pbnRlciBpcyBwb2ludGluZyB0by4gPHR0PnZhbHVlPC90dD4gaXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgb2JqZWN0LiA8dHQ+aW5kZXggPC90dD5pcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgYWxsb3dpbmcgYXJyYXkgYWNjZXNzIGJ5IHNldHRpbmcgPHR0PnB0cltpbmRleF0gPSB2YWx1ZTwvdHQ+LiA8dHQ+dHlwZSA8L3R0PmlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBkYXRhdHlwZSBhcyBkZXNjcmliZWQgYWJvdmUuCi08ZHQ+PGRkPgotPC9kbD4KLTxiPnB0cmNhc3QocHRyLCBuZXd0eXBlKTwvYj48cD4KLTxkbD4KLTxkdD48ZGQ+Q2FzdHMgYSBwb2ludGVyIHRvIGEgbmV3IGRhdGF0eXBlIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUuIDx0dD5uZXd0eXBlPC90dD4gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmV3IGRhdGF0eXBlIGFuZCBtYXkgZWl0aGVyIGJlIHRoZSAibWFuZ2xlZCIgdmVyc2lvbiB1c2VkIGJ5IFNXSUcgKHN1Y2ggYXMgIjx0dD5fVmVjdG9yX3A8L3R0PiIpIG9yIHRoZSBDIHZlcnNpb24gKHN1Y2ggYXMgIjx0dD5WZWN0b3IgKjwvdHQ+IikuIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBhbnkga2luZCBvZiBwb2ludGVyIHZhbHVlLiBJbiBhZGRpdGlvbmFsIHRvIHBvaW50ZXJzLCA8dHQ+cHRyPC90dD4gbWF5IGFsc28gaG9sZCBhbiBpbnRlZ2VyIHZhbHVlIGluIHdoaWNoIGNhc2UgdGhlIGludGVnZXIgaXMgdHVybmVkIGludG8gYSBwb2ludGVyIG9mIGdpdmVuIHR5cGUuCi08ZHQ+PGRkPgotPC9kbD4KLTxiPnB0cmFkZChwdHIsIG9mZnNldCk8L2I+PHA+Ci08ZGw+Ci08ZHQ+PGRkPkFkZHMgYW4gb2Zmc2V0IHRvIGEgcG9pbnRlciBhbmQgcmV0dXJucyBhIG5ldyBwb2ludGVyLiA8dHQ+b2Zmc2V0PC90dD4gaXMgc3BlY2lmaWVkIGFzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBleGNlcHQgZm9yIHVua25vd24gY29tcGxleCBkYXRhdHlwZXMgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLiBGb3IgZXhhbXBsZSwgaXMgPHR0PnB0cjwvdHQ+IGlzIGEgIjx0dD5kb3VibGUgKjwvdHQ+IiwgPHR0PnB0cmFkZChwdHIsMSk8L3R0PiB3aWxsIHJldHVybiB0aGUgbmV4dCBkb3VibGUuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBpZiA8dHQ+cHRyPC90dD4gaXMgIjx0dD5WZWN0b3IgKjwvdHQ+IiwgdGhlbiA8dHQ+cHRyYWRkKHB0ciwxKTwvdHQ+IHdpbGwgdXBkYXRlIHRoZSBwb2ludGVyIGJ5IDEgYnl0ZS4KLTxkdD48ZGQ+Ci08L2RsPgotPGI+cHRybWFwKHR5cGUxLHR5cGUyKTwvYj48cD4KLTxkbD4KLTxkdD48ZGQ+VGhpcyBwZXJmb3JtcyBhICJydW50aW1lIHR5cGVkZWYiIGFuZCBtYWtlcyBTV0lHIHJlY29nbml6ZSBwb2ludGVycyBvZiA8dHQ+dHlwZTE8L3R0PiBhbmQgPHR0PnR5cGUyPC90dD4gYXMgZXF1aXZhbGVudC4gPHR0PnR5cGUxPC90dD4gYW5kIDx0dD50eXBlMjwvdHQ+IGFyZSBzcGVjaWZpZWQgYXMgc3RyaW5ncy4gTm90IGdlbmVyYWxseSBuZWVkZWQsIGJ1dCBzb21ldGltZXMgdXNlZnVsLgotPC9kbD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gQSBzaW1wbGUgZXhhbXBsZTwvaDM+Ci1TdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgQyBmdW5jdGlvbiA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkgewotCSpyZXN1bHQgPSBhICsgYjsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gbWFuYWdlIHRoZSByZXN1bHQgb3V0cHV0LCB3ZSBjYW4gd3JpdGUgYW4gaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIHBvaW50ZXIuaQotCi1leHRlcm4gdm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgbGV0J3MgdXNlIHRoZSBwb2ludGVyIGxpYnJhcnkgKHNob3duIGZvciBhIGZldyBsYW5ndWFnZXMpIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIFRjbCAKLXNldCByZXN1bHQgW3B0cmNyZWF0ZSBkb3VibGVdICAgICAgICAgIDsjIENyZWF0ZSBhIGRvdWJsZQotYWRkIDQuNSAzICRyZXN1bHQgICAgICAgICAgICAgICAgICAgICAgOyMgQ2FsbCBvdXIgQyBmdW5jdGlvbgotcHV0cyBbcHRydmFsdWUgJHJlc3VsdF0gICAgICAgICAgICAgICAgOyMgUHJpbnQgb3V0IHRoZSByZXN1bHQKLXB0cmZyZWUgJHJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgIDsjIERlc3Ryb3kgdGhlIGRvdWJsZQotCi0jIFBlcmw1Ci11c2UgZXhhbXBsZTsKLXBhY2thZ2UgZXhhbXBsZTsgICAgICAgICAgICAgICAgICAgICAgICAjIEZ1bmN0aW9ucyBhcmUgaW4gZXhhbXBsZSBwYWNrYWdlCi0kcmVzdWx0ID0gcHRyY3JlYXRlKCJkb3VibGUiKTsgICAgICAgICAgIyBDcmVhdGUgYSBkb3VibGUKLWFkZCg0LjUsMywkcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAjIENhbGwgQyBmdW5jdGlvbgotcHJpbnQgcHRydmFsdWUoJHJlc3VsdCksIlxuIjsgICAgICAgICAgICMgUHJpbnQgdGhlIHJlc3VsdAotcHRyZnJlZSgkcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICMgRGVzdHJveSB0aGUgZG91YmxlCi0KLSMgUHl0aG9uCi1pbXBvcnQgZXhhbXBsZQotcmVzdWx0ID0gZXhhbXBsZS5wdHJjcmVhdGUoImRvdWJsZSIpICAgICMgQ3JlYXRlIGEgZG91YmxlCi1leGFtcGxlLmFkZCg0LjUsMyxyZXN1bHQpICAgICAgICAgICAgICAgIyBDYWxsIEMgZnVuY3Rpb24KLXByaW50IGV4YW1wbGUucHRydmFsdWUocmVzdWx0KSAgICAgICAgICAjIFByaW50IHRoZSByZXN1bHQKLWV4YW1wbGUucHRyZnJlZShyZXN1bHQpICAgICAgICAgICAgICAgICAjIERlc3Ryb3kgdGhlIGRvdWJsZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBpZGVhIGlzIHNpbXBsZS0td2UgY3JlYXRlIGEgcG9pbnRlciwgcGFzcyBpdCB0byBvdXIgQyBmdW5jdGlvbiwgYW5kIGRlcmVmZXJlbmNlIGl0IHRvIGdldCB0aGUgcmVzdWx0LiBJdCdzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBob3cgd2Ugd291bGQgaGF2ZSBkb25lIGl0IGluIEMgKHdlbGwsIG1pbnVzIHRoZSBmdW5jdGlvbiBjYWxsIHRvIGRlcmVmZXJlbmNlIHRoZSB2YWx1ZSkuPHA+Ci08YSBuYW1lPSJuMTciPjwvYT48aDM+IENyZWF0aW5nIGFycmF5czwvaDM+Ci1Ob3cgc3VwcG9zZSB5b3UgaGF2ZSBhIEMgZnVuY3Rpb24gaW52b2x2aW5nIGFycmF5cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBhZGR2KGRvdWJsZSBhW10sIGRvdWJsZSBiW10sIGRvdWJsZSBjW10sIGludCBuaXRlbXMpIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpICZsdDsgbml0ZW1zOyBpKyspIHsKLQkJY1tpXSA9IGFbaV0rYltpXTsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgaXMgYWxzbyBlYXNpbHkgaGFuZGxlZCBieSBvdXIgcG9pbnRlciBsaWJyYXJ5LiBGb3IgZXhhbXBsZSAoaW4gUHl0aG9uKSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQeXRob24gZnVuY3Rpb24gdG8gdHVybiBhIGxpc3QgaW50byBhbiAiYXJyYXkiCi1kZWYgYnVpbGRfYXJyYXkobCk6Ci0Jbml0ZW1zID0gbGVuKGwpCi0JYSA9IHB0cmNyZWF0ZSgiZG91YmxlIiwwLG5pdGVtcykKLQlpID0gMAotCWZvciBpdGVtIGluIGw6Ci0JCXB0cnNldChhLGl0ZW0saSkKLQkJaSA9IGkgKyAxCi0JcmV0dXJuIGEKLQotIyBQeXRob24gZnVuY3Rpb24gdG8gdHVybiBhbiBhcnJheSBpbnRvIGxpc3QKLWRlZiBidWlsZF9saXN0KGEsbml0ZW1zKToKLQlsID0gW10KLQlmb3IgaSBpbiByYW5nZSgwLG5pdGVtcyk6Ci0JCWwuYXBwZW5kKHB0cnZhbHVlKGEsaSkpCi0JcmV0dXJuIGwKLQotIyBOb3cgdXNlIG91ciBmdW5jdGlvbnMKLWEgPSBsaXN0dG9hcnJheShbMC4wLC0yLjAsMy4wLDkuMF0pCi1iID0gYnVpbGRfYXJyYXkoWy0yLjAsMy41LDEwLjAsMjIuMF0pCi1jID0gcHRyY3JlYXRlKCJkb3VibGUiLDAsNCkgICAgICAgICAgICAjIEZvciByZXR1cm4gcmVzdWx0Ci1hZGQoYSxiLGMsNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgb3VyIEMgZnVuY3Rpb24KLXJlc3VsdCA9IGJ1aWxkX2xpc3QoYykgICAgICAgICAgICAgICAgICMgQnVpbGQgYSBweXRob24gbGlzdCBmcm9tIHRoZSByZXN1bHQKLXByaW50IHJlc3VsdAotcHRyZnJlZShhKQotcHRyZnJlZShiKQotcHRyZnJlZShjKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGV4YW1wbGUgbWF5IGxvb2sgcXVpdGUgaW5lZmZpY2llbnQgb24gdGhlIHN1cmZhY2UgKGR1ZSB0byB0aGUgdHJhbnNsYXRpb24gb2YgUHl0aG9uIGxpc3RzIHRvIGFuZCBmcm9tIEMgYXJyYXlzKS4gSG93ZXZlciwgaWYgeW91J3JlIHdvcmtpbmcgd2l0aCBsb3RzIG9mIEMgZnVuY3Rpb25zLCBpdCdzIHBvc3NpYmxlIHRvIHNpbXBseSBwYXNzIEMgcG9pbnRlcnMgYXJvdW5kIGJldHdlZW4gdGhlbSB3aXRob3V0IGFueSB0cmFuc2xhdGlvbi4gQXMgYSByZXN1bHQsIGFwcGxpY2F0aW9ucyBjYW4gcnVuIGZhc3QtLWV2ZW4gd2hlbiBjb250cm9sbGVkIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIEl0J3MgYWxzbyB3b3J0aCBlbXBoYXNpemluZyB0aGF0IHRoZSA8dHQ+cHRyY3JlYXRlKCk8L3R0PiBmdW5jdGlvbiBjcmVhdGVkIGEgcmVhbCBDIGFycmF5IHRoYXQgY2FuIGJlIGludGVyY2hhbmdlZCB3aXRoIG90aGVyIGFycmF5cy4gVGhlIDx0dD5wdHJ2YWx1ZSgpPC90dD4gZnVuY3Rpb24gY2FuIGFsc28gZGVyZWZlcmVuY2UgYSBDIHBvaW50ZXIgZXZlbiBpZiBpdCB3YXNuJ3QgY3JlYXRlZCBmcm9tIFB5dGhvbi4gPHA+Ci08YSBuYW1lPSJuMTgiPjwvYT48aDM+IFBhY2tpbmcgYSBkYXRhIHN0cnVjdHVyZTwvaDM+Ci1UaGUgcG9pbnRlciBsaWJyYXJ5IGNhbiBldmVuIGJlIHVzZWQgdG8gcGFjayBzaW1wbGUga2luZHMgb2YgZGF0YS1zdHJ1Y3R1cmVzLCBwZXJoYXBzIGZvciBzZW5kaW5nIGFjcm9zcyBhIG5ldHdvcmssIG9yIHNpbXBseSBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIHRoaXMgZGF0YSBzdHJ1Y3R1cmU6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFBvaW50IHsKLQlkb3VibGUgeCx5OwotCWludCBjb2xvcjsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotWW91IGNvdWxkIHdyaXRlIGEgVGNsIGZ1bmN0aW9uIHRvIHNldCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBzZXRfcG9pbnQgeyBwdHIgeCB5IGMgfSB7Ci0Jc2V0IHAgW3B0cmNhc3QgJHB0ciAiZG91YmxlICoiXSAgICAgICA7IyBNYWtlIGEgZG91YmxlICoKLQlwdHJzZXQgJHAgJHggICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNldCB4IGNvbXBvbmVudAotCXNldCBwIFtwdHJhZGQgJHAgMV0gICAgICAgICAgICAgICAgICAgOyMgVXBkYXRlIHBvaW50ZXIKLQlwdHJzZXQgJHAgJHkgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNldCB5IGNvbXBvbmVudAotCXNldCBwIFtwdHJjYXN0IFtwdHJhZGQgJHAgMV0gImludCAqIl0gOyMgVXBkYXRlIHBvaW50ZXIgYW5kIGNhc3QKLQlwdHJzZXQgJHAgJGMgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNldCBjb2xvciBjb21wb25lbnQKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIGV2ZW4gaWYgeW91IGRpZG4ndCB0ZWxsIFNXSUcgYW55dGhpbmcgYWJvdXQgdGhlICJQb2ludCIgc3RydWN0dXJlIGFib3ZlLiA8cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb24gdG8gdHlwZW1hcHM8L2gyPgotU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGNoYW5nZSBTV0lHIGJlaGF2aW9yIGluIHNvbWUgbWFubmVyLiBGb3IgZXhhbXBsZSwgbWF5YmUgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSB0cmFuc2xhdGUgQyBhcnJheXMgdG8gYW5kIGZyb20gUGVybCBsaXN0cy4gT3IgcGVyaGFwcyB5b3Ugd291bGQgbGlrZSBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gYXJndW1lbnQgdG8gYmVoYXZlIGFzIGFuIG91dHB1dCBwYXJhbWV0ZXIuIFR5cGVtYXBzIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGRvaW5nIGp1c3QgdGhpcyBieSBtb2RpZnlpbmcgU1dJRydzIGNvZGUgZ2VuZXJhdG9yLiBUeXBlbWFwcyBhcmUgbmV3IHRvIFNXSUcgMS4xLCBidXQgaXQgc2hvdWxkIGJlIGVtcGhhc2l6ZWQgdGhhdCB0aGV5IGFyZSBub3QgcmVxdWlyZWQgdG8gYnVpbGQgYW4gaW50ZXJmYWNlLiA8cD4KLTxhIG5hbWU9Im4xOSI+PC9hPjxoMz4gVGhlIGlkZWEgKGluIGEgbnV0c2hlbGwpPC9oMz4KLVRoZSBpZGVhIGJlaGluZCB0eXBlbWFwcyBpcyByZWxhdGl2ZWx5IHNpbXBsZS0tZ2l2ZW4gdGhlIG9jY3VycmVuY2Ugb2YgYSBwYXJ0aWN1bGFyIEMgZGF0YXR5cGUsIHdlIHdhbnQgdG8gYXBwbHkgcnVsZXMgZm9yIHNwZWNpYWwgcHJvY2Vzc2luZy4gRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBhIEMgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KSB7Ci0JKnJlc3VsdCA9IGEgKyBiOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JdCBpcyBjbGVhciB0byB1cyB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIHJldHVybmVkIGluIHRoZSA8dHQ+cmVzdWx0PC90dD4gcGFyYW1ldGVyLiBVbmZvcnR1bmF0ZWx5LCBTV0lHIGlzbid0IHRoaXMgc21hcnQtLWFmdGVyIGFsbCAicmVzdWx0IiBpcyBqdXN0IGxpa2UgYW55IG90aGVyIHBvaW50ZXIuIEhvd2V2ZXIsIHdpdGggYSB0eXBlbWFwLCB3ZSBjYW4gbWFrZSBTV0lHIHJlY29nbml6ZSAiPHR0PmRvdWJsZSAqcmVzdWx0PC90dD4iIGFzIGEgc3BlY2lhbCBkYXRhdHlwZSBhbmQgY2hhbmdlIHRoZSBoYW5kbGluZyB0byBkbyBleGFjdGx5IHdoYXQgd2Ugd2FudC48cD4KLTxwPgotU28sIGRlc3BpdGUgYmVpbmcgYSBjb21tb24gdG9waWMgb2YgZGlzY3Vzc2lvbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QsIGEgdHlwZW1hcCBpcyByZWFsbHkganVzdCBhIHNwZWNpYWwgcHJvY2Vzc2luZyBydWxlIHRoYXQgaXMgYXBwbGllZCB0byBhIHBhcnRpY3VsYXIgZGF0YXR5cGUuIEVhY2ggdHlwZW1hcCByZWxpZXMgb24gdHdvIGVzc2VudGlhbCBhdHRyaWJ1dGVzLS1hIGRhdGF0eXBlIGFuZCBhIG5hbWUgKHdoaWNoIGlzIG9wdGlvbmFsKS4gV2hlbiB0cnlpbmcgdG8gbWF0Y2ggcGFyYW1ldGVycywgU1dJRyBsb29rcyBhdCBib3RoIGF0dHJpYnV0ZXMuIFRodXMsIHNwZWNpYWwgcHJvY2Vzc2luZyBhcHBsaWVkIHRvIGEgcGFyYW1ldGVyIG9mICI8dHQ+ZG91YmxlICpyZXN1bHQ8L3R0PiIgd2lsbCBub3QgYmUgYXBwbGllZCB0byAiPHR0PmRvdWJsZSAqaW5wdXQ8L3R0PiIuIE9uIHRoZSBvdGhlciBoYW5kLCBzcGVjaWFsIHByb2Nlc3NpbmcgZGVmaW5lZCBmb3IgYSBkYXRhdHlwZSBvZiAiPHR0PmRvdWJsZSAqPC90dD4iIGNvdWxkIGJlIGFwcGxpZWQgdG8gYm90aCAoc2luY2UgaXQgaXMgbW9yZSBnZW5lcmFsKS4gPHA+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IFVzaW5nIHNvbWUgdHlwZW1hcHM8L2gzPgotSXQgaXMgZWFzeSB0byBzdGFydCB1c2luZyBzb21lIHR5cGVtYXBzIHJpZ2h0IGF3YXkuIFRvIHdyYXAgdGhlIGFib3ZlIGZ1bmN0aW9uLCBzaW1wbHkgdXNlIHRoZSA8dHQ+dHlwZW1hcHMuaTwvdHQ+IGxpYnJhcnkgZmlsZSAod2hpY2ggaXMgcGFydCBvZiB0aGUgU1dJRyBsaWJyYXJ5KSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBTaW1wbGUgZXhhbXBsZSB1c2luZyB0eXBlbWFwcwotJW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSB0eXBlbWFwcy5pIAkJCQkJLy8gR3JhYiB0aGUgc3RhbmRhcmQgdHlwZW1hcCBsaWJyYXJ5Ci0KLSVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqcmVzdWx0IH07Ci1leHRlcm4gdm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+JWFwcGx5PC90dD4gZGlyZWN0aXZlIHRlbGxzIFNXSUcgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gYXBwbHkgc3BlY2lhbCBwcm9jZXNzaW5nIHRvIGEgZGF0YXR5cGUuIFRoZSAiPHR0PmRvdWJsZSAqT1VUUFVUPC90dD4iIGlzIHRoZSBuYW1lIG9mIGEgcnVsZSBkZXNjcmliaW5nIGhvdyB0byByZXR1cm4gYW4gb3V0cHV0IHZhbHVlIGZyb20gYSAiPHR0PmRvdWJsZSAqPC90dD4iICh0aGlzIHJ1bGUgaXMgZGVmaW5lZCBpbiB0aGUgZmlsZSA8dHQ+dHlwZW1hcHMuaTwvdHQ+KS4gVGhlIHJ1bGUgZ2V0cyBhcHBsaWVkIHRvIGFsbCBvZiB0aGUgZGF0YXR5cGVzIGxpc3RlZCBpbiBjdXJseSBicmFjZXMtLSBpbiB0aGlzIGNhc2UgIjx0dD5kb3VibGUgKnJlc3VsdDwvdHQ+Ii48cD4KLTxwPgotV2hpbGUgaXQgbWF5IHNvdW5kIGNvbXBsaWNhdGVkLCB3aGVuIHlvdSBjb21waWxlIHRoZSBtb2R1bGUgYW5kIHVzZSBpdCwgeW91IGdldCBhIGZ1bmN0aW9uIHRoYXQgd29ya3MgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQZXJsIGNvZGUgdG8gY2FsbCBvdXIgYWRkIGZ1bmN0aW9uCi0KLSRhID0gYWRkKDMsNCk7IAkJCi1wcmludCAkYSwiXG4iOwotNwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PdXIgZnVuY3Rpb24gaXMgbXVjaCBlYXNpZXIgdG8gdXNlIGFuZCBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIHNwZWNpYWwgZG91YmxlICogb2JqZWN0IGFuZCBwYXNzIGl0IHRvIHRoZSBmdW5jdGlvbi4gVHlwZW1hcHMgdG9vayBjYXJlIG9mIHRoaXMgYXV0b21hdGljYWxseS48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBNYW5hZ2luZyBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcnM8L2gyPgotQnkgZGVmYXVsdCwgd2hlbiBTV0lHIGVuY291bnRlcnMgYSBwb2ludGVyLCBpdCBtYWtlcyBubyBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IGl0IGlzICh3ZWxsLCBvdGhlciB0aGFuIHRoZSBmYWN0IHRoYXQgaXQncyBhIHBvaW50ZXIpLiBUaGUgPHR0PnR5cGVtYXBzLmk8L3R0PiBsaWJyYXJ5IGZpbGUgY29udGFpbnMgYSB2YXJpZXR5IG9mIG1ldGhvZHMgZm9yIGNoYW5naW5nIHRoaXMgYmVoYXZpb3IuIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgZmlsZSA6PHA+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IElucHV0IE1ldGhvZHM8L2gzPgotVGhlc2UgbWV0aG9kcyB0ZWxsIFNXSUcgdGhhdCBhIHBvaW50ZXIgaXMgYSBzaW5nbGUgaW5wdXQgdmFsdWUuIFdoZW4gdXNlZCwgZnVuY3Rpb25zIHdpbGwgZXhwZWN0IHZhbHVlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzLjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWludCAqSU5QVVQJCQotc2hvcnQgKklOUFVUCi1sb25nICpJTlBVVAotdW5zaWduZWQgaW50ICpJTlBVVAotdW5zaWduZWQgc2hvcnQgKklOUFVUCi11bnNpZ25lZCBsb25nICpJTlBVVAotZG91YmxlICpJTlBVVAotZmxvYXQgKklOUFVUCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVN1cHBvc2UgeW91IGhhZCBhIEMgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1kb3VibGUgYWRkKGRvdWJsZSAqYSwgZG91YmxlICpiKSB7Ci0JcmV0dXJuICphKypiOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Zb3UgY291bGQgd3JhcCBpdCB3aXRoIFNXSUcgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSB0eXBlbWFwcy5pCi0uLi4KLWV4dGVybiBkb3VibGUgYWRkKGRvdWJsZSAqSU5QVVQsIGRvdWJsZSAqSU5QVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIHdoZW4geW91IHVzZSB5b3VyIGZ1bmN0aW9uICxpdCB3aWxsIHdvcmsgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCByZXN1bHQgW2FkZCAzIDRdCi0lIHB1dHMgJHJlc3VsdAotNwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjIyIj48L2E+PGgzPiBPdXRwdXQgTWV0aG9kczwvaDM+Ci1UaGVzZSBtZXRob2RzIHRlbGwgU1dJRyB0aGF0IHBvaW50ZXIgaXMgdGhlIG91dHB1dCB2YWx1ZSBvZiBhIGZ1bmN0aW9uLiBXaGVuIHVzZWQsIHlvdSBkbyBub3QgbmVlZCB0byBzdXBwbHkgdGhlIGFyZ3VtZW50IHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGJ1dCBtdWx0aXBsZSByZXR1cm4gdmFsdWVzIGNhbiBiZSByZXR1cm5lZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQgKk9VVFBVVAotc2hvcnQgKk9VVFBVVAotbG9uZyAqT1VUUFVUCi11bnNpZ25lZCBpbnQgKk9VVFBVVAotdW5zaWduZWQgc2hvcnQgKk9VVFBVVAotdW5zaWduZWQgbG9uZyAqT1VUUFVUCi1kb3VibGUgKk9VVFBVVAotZmxvYXQgKk9VVFBVVAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGVzZSBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIHNob3duIGluIGFuIGVhcmxpZXIgZXhhbXBsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXMgQyBmdW5jdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpIHsKLQkqYyA9IGErYjsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQSBTV0lHIGludGVyZmFjZSBmaWxlIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIHR5cGVtYXBzLmkKLS4uLgotZXh0ZXJuIHZvaWQgYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpPVVRQVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIG9ubHkgYSBzaW5nbGUgb3V0cHV0IHZhbHVlIGlzIHJldHVybmVkLCBidXQgdGhpcyBpcyBub3QgYSByZXN0cmljdGlvbi4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gUmV0dXJucyBhIHN0YXR1cyBjb2RlIGFuZCBkb3VibGUKLWludCBnZXRfZG91YmxlKGNoYXIgKnN0ciwgZG91YmxlICpyZXN1bHQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIGRlY2xhcmVkIGluIFNXSUcgYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBnZXRfZG91YmxlKGNoYXIgKnN0ciwgZG91YmxlICpPVVRQVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZnVuY3Rpb24gd291bGQgcmV0dXJuIGEgbGlzdCBvZiBvdXRwdXQgdmFsdWVzIGFzIHNob3duIGZvciBQeXRob24gYmVsb3cgOmFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBnZXRfZG91YmxlKCIzLjE0MTU5MjYiKQkJCQkJIyBSZXR1cm5zIGJvdGggYSBzdGF0dXMgYW5kIHZhbHVlCi1bMCwgMy4xNDE1OTI2XSAKLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBJbnB1dC9PdXRwdXQgTWV0aG9kczwvaDM+Ci1XaGVuIGEgcG9pbnRlciBzZXJ2ZXMgYXMgYm90aCBhbiBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotaW50ICpCT1RICi1zaG9ydCAqQk9USAotbG9uZyAqQk9USAotdW5zaWduZWQgaW50ICpCT1RICi11bnNpZ25lZCBzaG9ydCAqQk9USAotdW5zaWduZWQgbG9uZyAqQk9USAotZG91YmxlICpCT1RICi1mbG9hdCAqQk9USAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BIHR5cGljYWwgQyBmdW5jdGlvbiB3b3VsZCBiZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIG5lZ2F0ZShkb3VibGUgKngpIHsKLQkqeCA9IC0oKngpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBtYWtlIHggZnVuY3Rpb24gYXMgYm90aCBhbmQgaW5wdXQgYW5kIG91dHB1dCB2YWx1ZSwgZGVjbGFyZSB0aGUgZnVuY3Rpb24gbGlrZSB0aGlzIGluIGFuIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIHR5cGVtYXBzLmkKLS4uLgotZXh0ZXJuIHZvaWQgbmVnYXRlKGRvdWJsZSAqQk9USCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdyB3aXRoaW4gYSBzY3JpcHQsIHlvdSBjYW4gc2ltcGx5IGNhbGwgdGhlIGZ1bmN0aW9uIG5vcm1hbGx5IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4kYSA9IG5lZ2F0ZSgzKTsgCQkJCSMgYSA9IC0zIGFmdGVyIGNhbGxpbmcgdGhpcwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjQiPjwvYT48aDM+IFVzaW5nIGRpZmZlcmVudCBuYW1lczwvaDM+Ci1CeSBleHBsaWNpdGx5IHVzaW5nIHRoZSBwYXJhbWV0ZXIgbmFtZXMgb2YgSU5QVVQsIE9VVFBVVCwgYW5kIEJPVEggaW4geW91ciBkZWNsYXJhdGlvbnMsIFNXSUcgcGVyZm9ybXMgZGlmZmVyZW50IG9wZXJhdGlvbnMuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBkaWZmZXJlbnQgbmFtZXMsIHlvdSBjYW4gc2ltcGx5IHVzZSB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIE1ha2UgZG91YmxlICpyZXN1bHQgYW4gb3V0cHV0IHZhbHVlCi0lYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKnJlc3VsdCB9OwotCi0vLyBNYWtlIEludDMyICppbiBhbiBpbnB1dCB2YWx1ZQotJWFwcGx5IGludCAqSU5QVVQgeyBJbnQzMiAqaW4gfTsKLQotLy8gTWFrZSBsb25nICp4IGJvdGgKLSVhcHBseSBsb25nICpCT1RIIHtsb25nICp4fTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHR0PiVhcHBseTwvdHQ+IG9ubHkgcmVuYW1lcyB0aGUgZGlmZmVyZW50IHR5cGUgaGFuZGxpbmcgcnVsZXMuIFlvdSBjYW4gdXNlIGl0IHRvIG1hdGNoIHVwIHdpdGggdGhlIG5hbWluZyBzY2hlbWUgdXNlZCBpbiBhIGhlYWRlciBmaWxlIGFuZCBzbyBmb3J0aC4gVG8gbGF0ZXIgY2xlYXIgYSBuYW1pbmcgcnVsZSwgdGhlIDx0dD4lY2xlYXI8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVjbGVhciBkb3VibGUgKnJlc3VsdDsKLSVjbGVhciBJbnQzMiAqaW4sIGxvbmcgKng7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQXBwbHlpbmcgY29uc3RyYWludHMgdG8gaW5wdXQgdmFsdWVzPC9oMj4KLUluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRoZSBoYW5kbGluZyBvZiB2YXJpb3VzIGlucHV0IHZhbHVlcywgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhcHBseSBjb25zdHJhaW50cy4gRm9yIGV4YW1wbGUsIG1heWJlIHlvdSB3YW50IHRvIGluc3VyZSB0aGF0IGEgdmFsdWUgaXMgcG9zaXRpdmUsIG9yIHRoYXQgYSBwb2ludGVyIGlzIG5vbi1OVUxMLiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgaW5jbHVkaW5nIHRoZSA8dHQ+Y29uc3RyYWludHMuaTwvdHQ+IGxpYnJhcnkgZmlsZSAod2hpY2ggaXMgYWxzbyBiYXNlZCBvbiB0eXBlbWFwcykuPHA+Ci08YSBuYW1lPSJuMjUiPjwvYT48aDM+IFNpbXBsZSBjb25zdHJhaW50IGV4YW1wbGU8L2gzPgotVGhlIGNvbnN0cmFpbnRzIGxpYnJhcnkgaXMgYmVzdCBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBJbnRlcmZhY2UgZmlsZSB3aXRoIGNvbnN0cmFpbnRzCi0lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIGNvbnN0cmFpbnRzLmkKLQotZG91YmxlIGV4cChkb3VibGUgeCk7Ci1kb3VibGUgbG9nKGRvdWJsZSBQT1NJVElWRSk7ICAgICAgICAgLy8gQWxsb3cgb25seSBwb3NpdGl2ZSB2YWx1ZXMKLWRvdWJsZSBzcXJ0KGRvdWJsZSBOT05ORUdBVElWRSk7ICAgICAvLyBOb24tbmVnYXRpdmUgdmFsdWVzIG9ubHkKLWRvdWJsZSBpbnYoZG91YmxlIE5PTlpFUk8pOyAgICAgICAgICAvLyBOb24temVybyB2YWx1ZXMKLQotdm9pZCBmcmVlKHZvaWQgKk5PTk5VTEwpOyAgICAgICAgICAgIC8vIE5vbi1OVUxMIHBvaW50ZXJzIG9ubHkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGJlaGF2aW9yIG9mIHRoaXMgZmlsZSBpcyBleGFjdGx5IGFzIHlvdSB3b3VsZCBleHBlY3QuIElmIGFueSBvZiB0aGUgYXJndW1lbnRzIHZpb2xhdGUgdGhlIGNvbnN0cmFpbnQgY29uZGl0aW9uLCBhIHNjcmlwdGluZyBsYW5ndWFnZSBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuIEFzIGEgcmVzdWx0LCBpdCBpcyBwb3NzaWJsZSB0byBjYXRjaCBiYWQgdmFsdWVzLCBwcmV2ZW50IG15c3RlcmlvdXMgcHJvZ3JhbSBjcmFzaGVzIGFuZCBzbyBvbi48cD4KLTxhIG5hbWU9Im4yNiI+PC9hPjxoMz4gQ29uc3RyYWludCBtZXRob2RzPC9oMz4KLVRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGU8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1QT1NJVElWRSAgICAgICAgICAgICAgICAgICAgIEFueSBudW1iZXIgJmd0OyAwIChub3QgemVybykKLU5FR0FUSVZFICAgICAgICAgICAgICAgICAgICAgQW55IG51bWJlciAmbHQ7IDAgKG5vdCB6ZXJvKQotTk9OTkVHQVRJVkUgICAgICAgICAgICAgICAgICBBbnkgbnVtYmVyICZndDs9IDAKLU5PTlBPU0lUSVZFICAgICAgICAgICAgICAgICAgQW55IG51bWJlciAmbHQ7PSAwCi1OT05aRVJPICAgICAgICAgICAgICAgICAgICAgIE5vbnplcm8gbnVtYmVyCi1OT05OVUxMICAgICAgICAgICAgICAgICAgICAgIE5vbi1OVUxMIHBvaW50ZXIgKHBvaW50ZXJzIG9ubHkpLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjI3Ij48L2E+PGgzPiBBcHBseWluZyBjb25zdHJhaW50cyB0byBuZXcgZGF0YXR5cGVzPC9oMz4KLVRoZSBjb25zdHJhaW50cyBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgdGhlIGJ1aWx0LWluIEMgZGF0YXR5cGVzLCBidXQgaXQgaXMgZWFzeSB0byBhcHBseSBpdCB0byBuZXcgZGF0YXR5cGVzIHVzaW5nIDx0dD4lYXBwbHk8L3R0Pi4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEFwcGx5IGEgY29uc3RyYWludCB0byBhIFJlYWwgdmFyaWFibGUKLSVhcHBseSBOdW1iZXIgUE9TSVRJVkUgeyBSZWFsIGluIH07Ci0KLS8vIEFwcGx5IGEgY29uc3RyYWludCB0byBhIHBvaW50ZXIgdHlwZQotJWFwcGx5IFBvaW50ZXIgTk9OTlVMTCB7IFZlY3RvciAqIH07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBzcGVjaWFsIHR5cGVzIG9mICJOdW1iZXIiIGFuZCAiUG9pbnRlciIgY2FuIGJlIGFwcGxpZWQgdG8gYW55IG51bWVyaWMgYW5kIHBvaW50ZXIgdmFyaWFibGUgdHlwZSByZXNwZWN0aXZlbHkuIFRvIGxhdGVyIHJlbW92ZSBhIGNvbnN0cmFpbnQsIHRoZSAlY2xlYXIgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lY2xlYXIgUmVhbCBpbjsKLSVjbGVhciBWZWN0b3IgKjsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBXcml0aW5nIG5ldyB0eXBlbWFwczwvaDI+Ci1TbyBmYXIsIHdlIGhhdmUgb25seSBzZWVuIGEgaGlnaC1sZXZlbCBwaWN0dXJlIG9mIHR5cGVtYXBzIGFuZCBoYXZlIHV0aWxpemVkIHByZS1leGlzdGluZyB0eXBlbWFwcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBkbyBtb3JlIGlmIHlvdSdyZSB3aWxsaW5nIHRvIGdldCB5b3VyIGhhbmRzIGRpcnR5IGFuZCBkaWcgaW50byB0aGUgaW50ZXJuYWxzIG9mIFNXSUcgYW5kIHlvdXIgZmF2b3JpdGUgc2NyaXB0aW5nIGxhbmd1YWdlLjxwPgotPHA+Ci1CZWZvcmUgZGl2aW5nIGluLCBmaXJzdCBhc2sgeW91cnNlbGYgZG8gSSByZWFsbHkgbmVlZCB0byBjaGFuZ2UgU1dJRydzIGRlZmF1bHQgYmVoYXZpb3I/IFRoZSBiYXNpYyBwb2ludGVyIG1vZGVsIHdvcmtzIHByZXR0eSB3ZWxsIG1vc3Qgb2YgdGhlIHRpbWUgYW5kIEkgZW5jb3VyYWdlIHlvdSB0byB1c2UgaXQtLWFmdGVyIGFsbCwgSSB3YW50ZWQgU1dJRyB0byBiZSBlYXN5IGVub3VnaCB0byB1c2Ugc28gdGhhdCB5b3UgZGlkbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG93IGxldmVsIGRldGFpbHMuIElmLCBhZnRlciBjb250ZW1wbGF0aW5nIHRoaXMgZm9yIGF3aGlsZSwgeW91J3ZlIGRlY2lkZWQgdGhhdCB5b3UgcmVhbGx5IHdhbnQgdG8gY2hhbmdlIHNvbWV0aGluZywgYSB3b3JkIG9mIGNhdXRpb24gaXMgaW4gb3JkZXIuIFdyaXRpbmcgYSB0eXBlbWFwIGZyb20gc2NyYXRjaCB1c3VhbGx5IHJlcXVpcmVzIGEgZGV0YWlsZWQga25vd2xlZGdlIG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBhIHBhcnRpY3VsYXIgc2NyaXB0aW5nIGxhbmd1YWdlLiBJdCBpcyBhbHNvIHF1aXRlIGVhc3kgdG8gYnJlYWsgYWxsIG9mIHRoZSBvdXRwdXQgY29kZSBnZW5lcmF0ZWQgYnkgU1dJRyBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdSdyZSBkb2luZy4gT24gdGhlIHBsdXMgc2lkZSwgb25jZSBhIHR5cGVtYXAgaGFzIGJlZW4gd3JpdHRlbiBpdCBjYW4gYmUgcmV1c2VkIG92ZXIgYW5kIG92ZXIgYWdhaW4gYnkgcHV0dGluZyBpdCBpbiB0aGUgU1dJRyBsaWJyYXJ5IChhcyBoYXMgYWxyZWFkeSBiZWVuIGRlbW9uc3RyYXRlZCkuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGJhc2ljcyBvZiB0eXBlbWFwcy4gTGFuZ3VhZ2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gKHdoaWNoIGNhbiBiZSBxdWl0ZSB0ZWNobmljYWwpIGlzIGNvbnRhaW5lZCBpbiB0aGUgbGF0ZXIgY2hhcHRlcnMuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IE1vdGl2YXRpb25zIGZvciB1c2luZyB0eXBlbWFwczwvaDM+Ci1TdXBwb3NlIHlvdSBoYXZlIGEgZmV3IEMgZnVuY3Rpb25zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBnbExpZ2h0ZnYoR0xlbnVtIGxpZ2h0LCBHbGVudW0gcG5hbWUsIEdMZmxvYXQgcGFybXNbNF0pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSB0aGlyZCBhcmd1bWVudCB0YWtlcyBhIDQgZWxlbWVudCBhcnJheS4gSWYgeW91IGRvIG5vdGhpbmcsIFNXSUcgd2lsbCBjb252ZXJ0IHRoZSBsYXN0IGFyZ3VtZW50IGludG8gYSBwb2ludGVyLiBXaGVuIHVzZWQgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSwgeW91IHdpbGwgbmVlZCB0byBwYXNzIGEgIjx0dD5HTGZsb2F0ICo8L3R0PiIgb2JqZWN0IHRvIHRoZSBmdW5jdGlvbiB0byBtYWtlIGl0IHdvcmsuIDxwPgotPGEgbmFtZT0ibjI5Ij48L2E+PGgzPiBNYW5hZ2luZyBzcGVjaWFsIGRhdGEtdHlwZXMgd2l0aCBoZWxwZXIgZnVuY3Rpb25zPC9oMz4KLUhlbHBlciBmdW5jdGlvbnMgcHJvdmlkZSBvbmUgbWVjaGFuaXNtIGZvciBkZWFsaW5nIHdpdGggb2RkIGRhdGF0eXBlcy4gV2l0aCBhIGhlbHBlciBmdW5jdGlvbiwgeW91IHByb3ZpZGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGZvciBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBvYmplY3RzIG9yIGNvbnZlcnRpbmcgdmFsdWVzIGludG8gYSB1c2VmdWwgZm9ybS4gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c3VhbGx5IGp1c3QgcGxhY2VkIGludG8geW91ciBpbnRlcmZhY2UgZmlsZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbnMuIEZvciBleGFtcGxlLCBhIGZldyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCA0IGVsZW1lbnQgYXJyYXlzIGZvciB0aGUgYWJvdmUgZnVuY3Rpb24sIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5saW5lICV7Ci0vKiBDcmVhdGUgYSBuZXcgR0xmbG9hdCBbNF0gb2JqZWN0ICovCi1HTGZsb2F0ICpuZXdmdjQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpIHsKLQlHTGZsb2F0ICpmID0gKEdMZmxvYXQgKikgbWFsbG9jKDQqc2l6ZW9mKEdMZmxvYXQpKTsKLQlmWzBdID0geDsKLQlmWzFdID0geTsKLQlmWzJdID0gejsKLQlmWzNdID0gdzsKLQlyZXR1cm4gZjsKLX0KLQotLyogRGVzdHJveSBhIEdMZmxvYXQgWzRdIG9iamVjdCAqLwotdm9pZCBkZWxldGVfZnY0KEdMZmxvYXQgKmQpIHsKLQlmcmVlKGQpOwotfQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB3cmFwcGVkLCBvdXIgaGVscGVyIGZ1bmN0aW9ucyB3aWxsIHNob3cgdXAgdGhlIGludGVyZmFjZSBhbmQgY2FuIGJlIHVzZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXQgbGlnaHQgW25ld2Z2NCAwLjAgMC4wIDAuMCAxLjBdICAgICAgICAjIENyZWF0ZXMgYSBHTGZsb2F0ICoKLSUgZ2xMaWdodGZ2IEdMX0xJR0hUMCBHTF9BTUJJRU5UICRsaWdodCAgICAgIyBQYXNzIGl0IHRvIHRoZSBmdW5jdGlvbgotLi4uCi0lIGRlbGV0ZV9mdjQgJGxpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVzdHJveSBpdCAoV2hlbiBkb25lKSAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotPHA+Ci1XaGlsZSBub3QgdGhlIG1vc3QgZWxlZ2FudCBhcHByb2FjaCwgaGVscGVyIGZ1bmN0aW9ucyBwcm92aWRlIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3Igd29ya2luZyB3aXRoIG1vcmUgY29tcGxleCBkYXRhdHlwZXMuIEluIG1vc3QgY2FzZXMsIHRoZXkgY2FuIGJlIHdyaXR0ZW4gd2l0aG91dCBkaXZpbmcgaW50byBTV0lHJ3MgaW50ZXJuYWxzLiBCZWZvcmUgdHlwZW1hcCBzdXBwb3J0IHdhcyBhZGRlZCB0byBTV0lHLCBoZWxwZXIgZnVuY3Rpb25zIHdlcmUgdGhlIG9ubHkgbWV0aG9kIGZvciBoYW5kbGluZyB0aGVzZSBraW5kcyBvZiBwcm9ibGVtcy4gVGhlIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUgZGVzY3JpYmVkIGVhcmxpZXIgaXMgYW4gZXhhbXBsZSBvZiBqdXN0IHRoaXMgc29ydCBvZiBhcHByb2FjaC4gQXMgYSBydWxlIG9mIHRodW1iLCBJIHJlY29tbWVuZCB0aGF0IHlvdSB0cnkgdG8gdXNlIHRoaXMgYXBwcm9hY2ggYmVmb3JlIGp1bXBpbmcgaW50byB0eXBlbWFwcy4gPHA+Ci08YSBuYW1lPSJuMzAiPjwvYT48aDM+IEEgVHlwZW1hcCBJbXBsZW1lbnRhdGlvbjwvaDM+Ci1BcyB3ZSBoYXZlIHNlZW4sIGEgdHlwZW1hcCBjYW4gb2Z0ZW4gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBoZWxwZXIgZnVuY3Rpb25zLiBXaXRob3V0IGRpdmluZyBpbnRvIHRoZSBkZXRhaWxzLCBhIG1vcmUgc29waGlzdGljYXRlZCB0eXBlbWFwIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBleGFtcGxlIGNhbiBwZXJtaXQgeW91IHRvIHBhc3MgYW4gYXJyYXkgb3IgbGlzdCBvZiB2YWx1ZXMgZGlyZWN0bHkgaW50byB0aGUgQyBmdW5jdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgZ2xMaWdodGZ2IEdMX0xJR0hUMCBHTF9BTUJJRU5UIHswLjAgMC4wIDAuMCAxLjB9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgaXMgYSBtb3JlIG5hdHVyYWwgaW1wbGVtZW50YXRpb24gdGhhdCByZXBsYWNlcyB0aGUgbG93LWxldmVsIHBvaW50ZXIgbWV0aG9kLiBOb3cgd2Ugd2lsbCBsb29rIGludG8gaG93IG9uZSBhY3R1YWxseSBzcGVjaWZpZXMgYSB0eXBlbWFwLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBXaGF0IGlzIGEgdHlwZW1hcD88L2gzPgotQSB0eXBlbWFwIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgPHR0PiV0eXBlbWFwPC90dD4gZGlyZWN0aXZlIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuIEEgc2ltcGxlIHR5cGVtYXAgbWlnaHQgbG9vayBsaWtzIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotJXR5cGVtYXAodGNsLGluKSBpbnQgewotCSR0YXJnZXQgPSBhdG9pKCRzb3VyY2UpOwotCXByaW50ZigiUmVjZWl2ZWQgYW4gaW50ZWdlciA6ICVkXG4iLCAkdGFyZ2V0KTsKLX0KLQotaW50IGFkZChpbnQgYSwgaW50IGIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiB0aGlzIGNhc2UsIHdlIGNoYW5nZWQgdGhlIHByb2Nlc3Npbmcgb2YgaW50ZWdlcnMgYXMgaW5wdXQgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4gV2hlbiB1c2VkIGluIGEgVGNsIHNjcmlwdCwgd2Ugd291bGQgZ2V0IHRoZSBmb2xsb3dpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IGEgW2FkZCA3IDEzXQotUmVjZWl2ZWQgYW4gaW50ZWdlciA6IDcKLVJlY2VpdmVkIGFuIGludGVnZXIgOiAxMwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGUgdHlwZW1hcCBzcGVjaWZpY2F0aW9uLCB0aGUgc3ltYm9scyA8dHQ+JHNvdXJjZTwvdHQ+IGFuZCA8dHQ+JHRhcmdldDwvdHQ+IGFyZSBob2xkaW5nIHBsYWNlcyBmb3IgQyB2YXJpYWJsZSBuYW1lcyB0aGF0IFNXSUcgaXMgZ29pbmcgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyB3cmFwcGVyIGNvZGUuIEluIHRoaXMgZXhhbXBsZSwgPHR0PiRzb3VyY2U8L3R0PiB3b3VsZCBjb250YWluIGEgVGNsIHN0cmluZyBjb250YWluaW5nIHRoZSBpbnB1dCB2YWx1ZSBhbmQgPHR0PiR0YXJnZXQ8L3R0PiB3b3VsZCBiZSB0aGUgQyBpbnRlZ2VyIHZhbHVlIHRoYXQgaXMgZ29pbmcgdG8gYmUgcGFzc2VkIGludG8gdGhlICJhZGQiIGZ1bmN0aW9uLjxwPgotPGEgbmFtZT0ibjMyIj48L2E+PGgzPiBDcmVhdGluZyBhIG5ldyB0eXBlbWFwPC9oMz4KLUEgbmV3IHR5cGVtYXAgY2FuIGJlIGNyZWF0ZWQgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAobGFuZyxtZXRob2QpIERhdGF0eXBlIHsKLQkuLi4gQ29udmVyc2lvbiBjb2RlIC4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dHQ+bGFuZzwvdHQ+IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGxhbmd1YWdlLCA8dHQ+bWV0aG9kPC90dD4gZGVmaW5lcyBhIHBhcnRpY3VsYXIgY29udmVyc2lvbiBtZXRob2QsIGFuZCA8dHQ+RGF0YXR5cGU8L3R0PiBnaXZlcyB0aGUgY29ycmVzcG9uZGluZyBDIGRhdGF0eXBlLiBUaGUgY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlbWFwIGlzIGVuY2xvc2VkIGluIGJyYWNlcyBhZnRlciB0aGUgZGVjbGFyYXRpb24uIFRoZXJlIGFyZSBhYm91dCBhIGRvemVuIGRpZmZlcmVudCBraW5kcyBvZiB0eXBlbWFwcyB0aGF0IGFyZSB1c2VkIHdpdGhpbiBTV0lHLCBidXQgd2Ugd2lsbCBnZXQgdG8gdGhhdCBzaG9ydGx5LjxwPgotPHA+Ci1BIHNpbmdsZSBjb252ZXJzaW9uIGNhbiBiZSBhcHBsaWVkIHRvIG11bHRpcGxlIGRhdGF0eXBlcyBieSBnaXZpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkYXRhdHlwZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcCh0Y2wsaW4pIGludCwgc2hvcnQsIGxvbmcsIHNpZ25lZCBjaGFyIHsKLQkkdGFyZ2V0ID0gKCR0eXBlKSBhdG9sKCRzb3VyY2UpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1IZXJlLCA8dHQ+JHR5cGU8L3R0PiB3aWxsIGJlIGV4cGFuZGVkIGludG8gdGhlIHJlYWwgZGF0YXR5cGUgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4gRGF0YXR5cGVzIG1heSBhbHNvIGNhcnJ5IG5hbWVzIGFzIGluPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAocGVybDUsaW4pIGNoYXIgKiphcmd2IHsKLQkuLi4gVHVybiBhIHBlcmwgYXJyYXkgaW50byBhIGNoYXIgKiogLi4uCi19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgIm5hbWVkInR5cGVtYXAgd2lsbCBvbmx5IGFwcGx5IHRvIGFuIG9iamVjdCB0aGF0IG1hdGNoZXMgYm90aCB0aGUgQyBkYXRhdHlwZSBhbmQgdGhlIG5hbWUuIFRodXMgdGhlIDx0dD5jaGFyICoqYXJndjwvdHQ+IHR5cGVtYXAgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgZXhhY3RseSBtYXRjaCAiPHR0PmNoYXIgKiphcmd2PC90dD4iLiBJbiBzb21lIGNhc2VzLCB0aGUgbmFtZSBtYXkgY29ycmVzcG9uZCB0byBhIGZ1bmN0aW9uIG5hbWUgKGFzIGlzIHRoZSBjYXNlIGZvciByZXR1cm4gdmFsdWVzKS48cD4KLTxwPgotRmluYWxseSwgdGhlcmUgaXMgYSBzaG9ydGVuZWQgZm9ybSBvZiB0aGUgdHlwZW1hcCBkaXJlY3RpdmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKG1ldGhvZCkgRGF0YXR5cGUgewotCS4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoZSBsYW5ndWFnZSBuYW1lIGlzIG9tbWl0dGVkLCB0aGUgdHlwZW1hcCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgdGFyZ2V0IGxhbmd1YWdlLiBUaGlzIGZvcm0gaXMgb25seSByZWNvbW1lbmRlZCBmb3IgdHlwZW1hcCBtZXRob2RzIHRoYXQgYXJlIGxhbmd1YWdlIGluZGVwZW5kZW50ICh0aGVyZSBhcmUgYSBmZXcpLiBJdCBpcyBub3QgcmVjb21tZW5kZWQgaWYgeW91IGFyZSBidWlsZGluZyBpbnRlcmZhY2VzIGZvciBtdWx0aXBsZSBsYW5ndWFnZXMuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IERlbGV0aW5nIGEgdHlwZW1hcDwvaDM+Ci1BIHR5cGVtYXAgY2FuIGJlIGRlbGV0ZWQgYnkgcHJvdmlkaW5nIG5vIGNvbnZlcnNpb24gY29kZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKGxhbmcsbWV0aG9kKSBEYXRhdHlwZTsgICAgICAgICAgICAgIC8vIERlbGV0ZXMgdGhpcyB0eXBlbWFwCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzQiPjwvYT48aDM+IENvcHlpbmcgYSB0eXBlbWFwPC9oMz4KLUEgdHlwZW1hcCBjYW4gYmUgY29waWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixvdXQpIHVuc2lnbmVkIGludCA9IGludDsgICAgIC8vIENvcGllcyBhIHR5cGVtYXAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBzcGVjaWZpZXMgdGhhdCB0aGUgdHlwZW1hcCBmb3IgIjx0dD51bnNpZ25lZCBpbnQ8L3R0PiIgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSAiPHR0PmludDwvdHQ+IiB0eXBlbWFwLjxwPgotVGhpcyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgd2hlbiB3b3JraW5nIHdpdGggbGlicmFyeSBmaWxlcy48cD4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gVHlwZW1hcCBtYXRjaGluZyBydWxlczwvaDM+Ci1XaGVuIHlvdSBzcGVjaWZ5IGEgdHlwZW1hcCwgU1dJRyBpcyBnb2luZyB0byB0cnkgYW5kIG1hdGNoIGl0IHdpdGggYWxsIGZ1dHVyZSBvY2N1cnJlbmNlcyBvZiB0aGUgZGF0YXR5cGUgeW91IHNwZWNpZnkuIFRoZSBtYXRjaGluZyBwcm9jZXNzIGlzIGJhc2VkIHVwb24gdGhlIHRhcmdldCBsYW5ndWFnZSwgdHlwZW1hcCBtZXRob2QsIGRhdGF0eXBlLCBhbmQgb3B0aW9uYWwgbmFtZS4gQmVjYXVzZSBvZiB0aGlzLCBpdCBpcyBwZXJmZWN0bHkgbGVnYWwgZm9yIG11bHRpcGxlIHR5cGVtYXBzIHRvIGV4aXN0IGZvciBhIHNpbmdsZSBkYXRhdHlwZSBhdCBhbnkgZ2l2ZW4gdGltZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHRjbCxpbikgaW50ICogewotCS4uLiBDb252ZXJ0IGFuIGludCAqIC4uLgotfQotJXR5cGVtYXAodGNsLGluKSBpbnQgWzRdIHsKLQkuLi4gQ29udmVydCBhbiBpbnRbNF0gLi4uCi19Ci0ldHlwZW1hcCh0Y2wsaW4pIGludCBvdXRbNF0gewotCS4uLiBDb252ZXJ0IGFuIG91dFs0XSAuLi4KLX0KLSV0eXBlbWFwKHRjbCxpbikgaW50ICpzdGF0dXMgewotCS4uLiBDb252ZXJ0IGFuIGludCAqc3RhdHVzIC4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGVzZSB0eXBlbWFwcyBhbGwgaW52b2x2ZSB0aGUgIjx0dD5pbnQgKjwvdHQ+IiBkYXRhdHlwZSBpbiBvbmUgd2F5IG9yIGFub3RoZXIsIGJ1dCBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgZGlzdGluY3QuIFRoZXJlIGlzIGFuIGV4dHJhIHR3aXN0IHRvIHR5cGVtYXBzIHJlZ2FyZGluZyB0aGUgc2ltaWxhcml0eSBiZXR3ZWVuIEMgcG9pbnRlcnMgYW5kIGFycmF5cy4gQSB0eXBlbWFwIGFwcGxpZWQgdG8gYSBwb2ludGVyIHdpbGwgYWxzbyB3b3JrIGZvciBhbnkgYXJyYXkgb2YgdGhlIHNhbWUgdHlwZS4gT24gdGhlIG90aGVyIGhhbmQsIGEgdHlwZW1hcCBhcHBsaWVkIHRvIGFuIGFycmF5IHdpbGwgb25seSB3b3JrIGZvciBhcnJheXMsIG5vdCBwb2ludGVycy4gQXNzdW1pbmcgdGhhdCB5b3UncmUgbm90IGNvbXBsZXRlbHkgY29uZnVzZWQgYXQgdGhpcyBwb2ludCwgdGhlIGZvbGxvd2luZyBydWxlcyBhcmUgYXBwbGllZCBpbiBvcmRlciB0byBtYXRjaCBwb2ludGVycyBhbmQgYXJyYXlzIDo8cD4KLTxwPgotPHVsPgotPGxpPk5hbWVkIGFycmF5cwotPGxpPlVubmFtZWQgYXJyYXlzCi08bGk+TmFtZWQgZGF0YXR5cGVzCi08bGk+VW5uYW1lZCBkYXRhdHlwZXMKLTwvdWw+Ci08cD4KLVRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgc2hvd3MgaG93IHRoZXNlIHJ1bGVzIGFyZSBhcHBsaWVkLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZm9vMShpbnQgKik7IAkJCQkvLyBBcHBseSBpbnQgKiB0eXBlbWFwCi12b2lkIGZvbzIoaW50IGFbNF0pOyAgICAgICAgIC8vIEFwcGx5IGludFs0XSB0eXBlbWFwCi12b2lkIGZvbzMoaW50IG91dFs0XSk7ICAgICAgIC8vIEFwcGx5IGludCBvdXRbNF0gdHlwZW1hcAotdm9pZCBmb280KGludCAqc3RhdHVzKTsgICAgICAvLyBBcHBseSBpbnQgKnN0YXR1cyB0eXBlbWFwCi12b2lkIGZvbzUoaW50IGFbMjBdKTsgICAgICAgIC8vIEFwcGx5IGludCAqIHR5cGVtYXAgKGJlY2F1c2UgaW50IFsyMF0gaXMgYW4gaW50ICopCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUJlY2F1c2UgU1dJRyB1c2VzIGEgbmFtZS1iYXNlZCBhcHByb2FjaCwgaXQgaXMgcG9zc2libGUgdG8gYXR0YWNoIHNwZWNpYWwgcHJvcGVydGllcyB0byBuYW1lZCBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZSwgd2UgY2FuIG1ha2UgYW4gYXJndW1lbnQgb2YgIjx0dD5pbnQgKk9VVFBVVDwvdHQ+IiBhbHdheXMgYmUgdHJlYXRlZCBhcyBhbiBvdXRwdXQgdmFsdWUgb2YgYSBmdW5jdGlvbiBvciBtYWtlIGEgIjx0dD5jaGFyICoqYXJndjwvdHQ+IiBhbHdheXMgYWNjZXB0IGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IENvbW1vbiB0eXBlbWFwIG1ldGhvZHM8L2gyPgotVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgYnkgbW9zdCBTV0lHIGxhbmd1YWdlIG1vZHVsZXMuIEluZGl2aWR1YWwgbGFuZ3VhZ2UgbWF5IHByb3ZpZGUgYW55IG51bWJlciBvZiBvdGhlciBtZXRob2RzIG5vdCBsaXN0ZWQgaGVyZS48cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2g2LnRhYmxlLjEucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g2LnRhYmxlLjIucG5nIj48YnI+Ci08L2NlbnRlcj4KLTxwPgotVW5kZXJzdGFuZGluZyBob3cgc29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBhcHBsaWVkIHRha2VzIGEgbGl0dGxlIHByYWN0aWNlIGFuZCBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB3aGF0IFNXSUcgZG9lcyB3aGVuIGl0IGNyZWF0ZXMgYSB3cmFwcGVyIGZ1bmN0aW9uLiBUaGUgbmV4dCBmZXcgZGlhZ3JhbXMgc2hvdyB0aGUgYW5hdG9teSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24gYW5kIGhvdyB0aGUgdHlwZW1hcHMgZ2V0IGFwcGxpZWQuIE1vcmUgZGV0YWlsZWQgZXhhbXBsZXMgb2YgdHlwZW1hcHMgY2FuIGJlIGZvdW5kIG9uIHRoZSBjaGFwdGVycyBmb3IgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UuPHA+Ci08cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoNi4xLnBuZyI+Ci08cD48L2NlbnRlcj4KLTxwPgotPGNlbnRlcj48aW1nIHNyYz0iY2g2LjIucG5nIj4KLTxwPjwvY2VudGVyPgotPGEgbmFtZT0ibjgiPjwvYT48aDI+IFdyaXRpbmcgdHlwZW1hcCBjb2RlPC9oMj4KLVRoZSBjb252ZXJzaW9uIGNvZGUgc3VwcGxpZWQgdG8gYSB0eXBlbWFwIG5lZWRzIHRvIGZvbGxvdyBhIGZldyBjb252ZW50aW9ucyBkZXNjcmliZWQgaGVyZS48cD4KLTxhIG5hbWU9Im4zNiI+PC9hPjxoMz4gU2NvcGU8L2gzPgotVHlwZW1hcCBjb2RlIGlzIGVuY2xvc2VkIGluIGJyYWNlcyB3aGVuIGl0IGlzIGluc2VydGVkIGludG8gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgKHVzaW5nIEMncyBibG9jay1zY29wZSkuIEl0IGlzIHBlcmZlY3RseSBsZWdhbCB0byBkZWNsYXJlIGxvY2FsIGFuZCBzdGF0aWMgdmFyaWFibGVzIGluIGEgdHlwZW1hcC4gSG93ZXZlciwgbG9jYWwgdmFyaWFibGVzIHdpbGwgb25seSBleGlzdCBpbiB0aGUgdGlueSBwb3J0aW9uIG9mIGNvZGUgeW91IHN1cHBseS4gSW4gb3RoZXIgd29yZHMsIGFueSBsb2NhbCB2YXJpYWJsZXMgdGhhdCB5b3UgY3JlYXRlIGluIGEgdHlwZW1hcCB3aWxsIGRpc2FwcGVhciB3aGVuIHRoZSB0eXBlbWFwIGhhcyBjb21wbGV0ZWQgaXRzIGV4ZWN1dGlvbi48cD4KLTxhIG5hbWU9Im4zNyI+PC9hPjxoMz4gQ3JlYXRpbmcgbG9jYWwgdmFyaWFibGVzPC9oMz4KLVNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gZGVjbGFyZSBhIG5ldyBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVudGlyZSB3cmFwcGVyIGZ1bmN0aW9uLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHNwZWNpZnlpbmcgYSB0eXBlbWFwIHdpdGggcGFyYW1ldGVycyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcCh0Y2wsaW4pIGludCAqSU5QVVQoaW50IHRlbXApIHsKLQl0ZW1wID0gYXRvaSgkc291cmNlKTsKLQkkdGFyZ2V0ID0gJmFtcDt0ZW1wOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGF0IGhhcHBlbnMgaGVyZSBpcyB0aGF0IDx0dD50ZW1wPC90dD4gYmVjb21lcyBhIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBzY29wZSBvZiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24uIFdoZW4gd2Ugc2V0IGl0IHRvIGEgdmFsdWUsIHRoYXQgdmFsdWVzIHBlcnNpc3RzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb24gYW5kIGdldHMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IG9uIGV4aXQuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHdvcmtpbmcgd2l0aCBwb2ludGVycyBhbmQgdGVtcG9yYXJ5IHZhbHVlcy48cD4KLTxwPgotSXQgaXMgcGVyZmVjdGx5IHNhZmUgdG8gdXNlIG11bHRpcGxlIHR5cGVtYXBzIGludm9sdmluZyBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uIEZvciBleGFtcGxlLCB3ZSBjb3VsZCBkZWNsYXJlIGEgZnVuY3Rpb24gYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZm9vKGludCAqSU5QVVQsIGludCAqSU5QVVQsIGludCAqSU5QVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoaXMgb2NjdXJzLCBTV0lHIHdpbGwgY3JlYXRlIHRocmVlIGRpZmZlcmVudCBsb2NhbCB2YXJpYWJsZXMgbmFtZWQgYHRlbXAnLiBPZiBjb3Vyc2UsIHRoZXkgZG9uJ3QgYWxsIGVuZCB1cCBoYXZpbmcgdGhlIHNhbWUgbmFtZS0tLVNXSUcgYXV0b21hdGljYWxseSBwZXJmb3JtcyBhIHZhcmlhYmxlIHJlbmFtaW5nIG9wZXJhdGlvbiBpZiBpdCBkZXRlY3RzIGEgbmFtZS1jbGFzaCBsaWtlIHRoaXMuPHA+Ci08cD4KLVNvbWUgdHlwZW1hcHMgZG8gbm90IHJlY29nbml6ZSBsb2NhbCB2YXJpYWJsZXMgKG9yIHRoZXkgbWF5IHNpbXBseSBub3QgYXBwbHkpLiBBdCB0aGlzIHRpbWUsIG9ubHkgdGhlICJpbiIsICJhcmdvdXQiLCAiZGVmYXVsdCIsIGFuZCAiaWdub3JlIiB0eXBlbWFwcyB1c2UgbG9jYWwgdmFyaWFibGVzLjxwPgotPGEgbmFtZT0ibjM4Ij48L2E+PGgzPiBTcGVjaWFsIHZhcmlhYmxlczwvaDM+Ci1UaGUgZm9sbG93aW5nIHNwZWNpYWwgdmFyaWFibGVzIG1heSBiZSB1c2VkIHdpdGhpbiBhIHR5cGVtYXAgY29udmVyc2lvbiBjb2RlIDo8cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoNi50YWJsZS4zLnBuZyI+PC9jZW50ZXI+Ci08cD4KLVdoZW4gZm91bmQgaW4gdGhlIGNvbnZlcnNpb24gY29kZSwgdGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMuIE5vdCBhbGwgdmFsdWVzIGFyZSB1c2VkIGluIGFsbCB0eXBlbWFwcy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBTV0lHIHJlZmVyZW5jZSBtYW51YWwgZm9yIHRoZSBwcmVjaXNlIHVzYWdlLiA8cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBUeXBlbWFwcyBmb3IgaGFuZGxpbmcgYXJyYXlzPC9oMj4KLU9uZSBvZiB0aGUgbW9zdCBjb21tb24gdXNlcyBvZiB0eXBlbWFwcyBpcyBwcm92aWRpbmcgc29tZSBzdXBwb3J0IGZvciBhcnJheXMuIER1ZSB0byB0aGUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcG9pbnRlcnMgYW5kIGFycmF5cyBpbiBDLCBhcnJheSBzdXBwb3J0IGlzIHNvbWV3aGF0IGxpbWl0ZWQgdW5sZXNzIHlvdSBwcm92aWRlIGFkZGl0aW9uYWwgc3VwcG9ydC4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFwcGVhcnMgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBQZXJzb24gewotCWNoYXIgbmFtZVszMl07Ci0JY2hhciBhZGRyZXNzWzY0XTsKLQlpbnQgaWQ7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIFNXSUcgaXMgcnVuLCB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyB3YXJuaW5ncyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcHl0aG9uICBleGFtcGxlLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFB5dGhvbgotZXhhbXBsZS5pIDogTGluZSAyLiBXYXJuaW5nLiBBcnJheSBtZW1iZXIgd2lsbCBiZSByZWFkLW9ubHkuCi1leGFtcGxlLmkgOiBMaW5lIDMuIFdhcm5pbmcuIEFycmF5IG1lbWJlciB3aWxsIGJlIHJlYWQtb25seS4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlc2Ugd2FybmluZyBtZXNzYWdlcyBpbmRpY2F0ZSB0aGF0IFNXSUcgZG9lcyBub3Qga25vdyBob3cgeW91IHdhbnQgdG8gc2V0IHRoZSBuYW1lIGFuZCBhZGRyZXNzIGZpZWxkcy4gQXMgYSByZXN1bHQsIHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byBxdWVyeSB0aGVpciB2YWx1ZS48cD4KLTxwPgotVG8gZml4IHRoaXMsIHdlIGNvdWxkIHN1cHBseSB0d28gdHlwZW1hcHMgaW4gdGhlIGZpbGUgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0KLSV0eXBlbWFwKG1lbWJlcmluKSBjaGFyIFszMl0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLDMyKTsKLX0KLSV0eXBlbWFwKG1lbWJlcmluKSBjaGFyIFs2NF0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLDY0KTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlICJtZW1iZXJpbiIgdHlwZW1hcCBpcyB1c2VkIHRvIHNldCBtZW1iZXJzIG9mIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMuIFdoZW4geW91IHJ1biB0aGUgbmV3IHZlcnNpb24gdGhyb3VnaCBTV0lHLCB0aGUgd2FybmluZ3Mgd2lsbCBnbyBhd2F5IGFuZCB5b3UgY2FuIG5vdyBzZXQgZWFjaCBtZW1iZXIuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgPHR0PmNoYXJbMzJdPC90dD4gYW5kIDx0dD5jaGFyWzY0XTwvdHQ+IGFyZSBkaWZmZXJlbnQgZGF0YXR5cGVzIGFzIGZhciBhcyBTV0lHIHR5cGVtYXBzIGFyZSBjb25jZXJuZWQuIEhvd2V2ZXIsIGJvdGggdHlwZW1hcHMgY2FuIGJlIGNvbWJpbmVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEEgYmV0dGVyIHR5cGVtYXAgZm9yIGNoYXIgYXJyYXlzCi0ldHlwZW1hcChtZW1iZXJpbikgY2hhciBbQU5ZXSB7Ci0Jc3RybmNweSgkdGFyZ2V0LCRzb3VyY2UsJGRpbTApOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PkFOWTwvdHQ+IGtleXdvcmQgY2FuIGJlIHVzZWQgaW4gYSB0eXBlbWFwIHRvIG1hdGNoIGFueSBhcnJheSBkaW1lbnNpb24uIFdoZW4gdXNlZCwgdGhlIHNwZWNpYWwgdmFyaWFibGUgPHR0PiRkaW0wPC90dD4gd2lsbCBjb250YWluIHRoZSByZWFsIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgYW5kIGNhbiBiZSB1c2VkIGFzIHNob3duIGFib3ZlLjxwPgotPHA+Ci1NdWx0aWRpbWVuc2lvbmFsIGFycmF5cyBjYW4gYWxzbyBiZSBoYW5kbGVkIGJ5IHR5cGVtYXBzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQSB0eXBlbWFwIGZvciBoYW5kbGluZyBhbnkgaW50IFtdW10gYXJyYXkKLSV0eXBlbWFwKG1lbWJlcmluKSBpbnQgW0FOWV1bQU5ZXSB7Ci0JaW50IGksajsKLQlmb3IgKGkgPSAwOyBpICZsdDsgJGRpbTA7IGkrKykKLQkJZm9yIChqID0gMDsgaiAmbHQ7ICRkaW0xOyBqKyspIHsKLQkJCSR0YXJnZXRbaV1bal0gPSAqKCRzb3VyY2UrJGRpbTEqaStqKTsKLQkJfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgdXNlZCwgdGhlIHN5bWJvbHMgPHR0PiRkaW0wLDwvdHQ+IDx0dD4kZGltMTwvdHQ+LDx0dD4gJGRpbTI8L3R0PiwgZXRjLi4uIGdldCByZXBsYWNlZCBieSB0aGUgYWN0dWFsIGFycmF5IGRpbWVuc2lvbnMgYmVpbmcgdXNlZC4gPHA+Ci08cD4KLVRoZSBBTlkga2V5d29yZCBjYW4gYmUgY29tYmluZWQgd2l0aCBhbnkgc3BlY2lmaWMgZGltZW5zaW9uLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAocHl0aG9uLGluKSBpbnQgW0FOWV1bNF0gewotCS4uLgotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSB0eXBlbWFwIHVzaW5nIGEgc3BlY2lmaWMgZGltZW5zaW9uIGFsd2F5cyBoYXMgcHJlY2VkZW5jZSBvdmVyIGEgbW9yZSBnZW5lcmFsIHZlcnNpb24uIEZvciBleGFtcGxlLCA8dHQ+W0FOWV1bNF08L3R0PiB3aWxsIGJlIHVzZWQgYmVmb3JlPHR0PltBTlldW0FOWV08L3R0Pi48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gVHlwZW1hcHMgYW5kIHRoZSBTV0lHIExpYnJhcnk8L2gyPgotV3JpdGluZyB0eXBlbWFwcyBpcyBhIHRyaWNreSBidXNpbmVzcy4gRm9yIHRoaXMgcmVhc29uLCBtYW55IGNvbW1vbiB0eXBlbWFwcyBjYW4gYmUgcGxhY2VkIGludG8gYSBTV0lHIGxpYnJhcnkgZmlsZSBhbmQgcmV1c2VkIGluIG90aGVyIG1vZHVsZXMgd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgbmFzdHkgdW5kZXJseWluZyBkZXRhaWxzLiBUbyBkbyB0aGlzLCB5b3UgZmlyc3Qgd3JpdGUgYSBmaWxlIGNvbnRhaW5pbmcgdHlwZW1hcHMgc3VjaCBhcyB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBmaWxlIDogc3RkbWFwLmkKLS8vIEEgZmlsZSBjb250YWluaW5nIGEgdmFyaWV0eSBvZiB1c2VmdWwgdHlwZW1hcHMKLQotJXR5cGVtYXAodGNsLGluKSBpbnQgSU5URUdFUiB7Ci0JLi4uCi19Ci0ldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBET1VCTEUgewotCS4uLgotfQotJXR5cGVtYXAodGNsLG91dCkgaW50IElOVCB7Ci0JLi4uCi19Ci0ldHlwZW1hcCh0Y2wsb3V0KSBkb3VibGUgRE9VQkxFIHsKLQkuLi4KLX0KLSV0eXBlbWFwKHRjbCxhcmdvdXQpIGRvdWJsZSBET1VCTEUgewotCS4uLgotfQotLy8gYW5kIHNvIG9uLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZmlsZSBtYXkgY29udGFpbiBkb3plbnMgb3IgZXZlbiBodW5kcmVkcyBvZiBwb3NzaWJsZSBtYXBwaW5ncy4gTm93LCB0byB1c2UgdGhpcyBmaWxlIHdpdGggb3RoZXIgbW9kdWxlcywgc2ltcGx5IGluY2x1ZGUgaXQgaW4gb3RoZXIgZmlsZXMgYW5kIHVzZSB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gaW50ZXJmYWNlLmkKLS8vIE15IGludGVyZmFjZSBmaWxlCi0KLSVpbmNsdWRlIHN0ZG1hcC5pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgdGhlIHR5cGVtYXAgbGlicmFyeQotCi0vLyBOb3cgZ3JhYiB0aGUgdHlwZW1hcHMgd2Ugd2FudCB0byB1c2UKLSVhcHBseSBkb3VibGUgRE9VQkxFIHtkb3VibGV9OwotCi0vLyBSZXN0IG9mIHlvdXIgZGVjbGFyYXRpb25zCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoaXMgY2FzZSwgPHR0PnN0ZG1hcC5pPC90dD4gY29udGFpbnMgYSB2YXJpZXR5IG9mIHN0YW5kYXJkIG1hcHBpbmdzLiBUaGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZSBsZXRzIHVzIGFwcGx5IHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZXNlIHRvIG5ldyBkYXRhdHlwZXMgd2l0aG91dCBrbm93aW5nIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMuPHA+Ci08cD4KLVRvIGNsZWFyIGEgdHlwZW1hcCB0aGF0IGhhcyBiZWVuIGFwcGxpZWQsIHlvdSBjYW4gdXNlIHRoZSA8dHQ+JWNsZWFyPC90dD4gZGlyZWN0aXZlLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWNsZWFyIGRvdWJsZSB4OyAJCQkvLyBDbGVhcnMgYW55IHR5cGVtYXBzIGJlaW5nIGFwcGxpZWQgdG8gZG91YmxlIHgKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMj4gSW1wbGVtZW50aW5nIGNvbnN0cmFpbnRzIHdpdGggdHlwZW1hcHM8L2gyPgotT25lIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbiBvZiB0eXBlbWFwcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYXJndW1lbnQgY29uc3RyYWludHMuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgImNoZWNrIiB0eXBlbWFwLiBXaGVuIHVzZWQsIHRoaXMgYWxsb3dzIHlvdSB0byBwcm92aWRlIGNvZGUgZm9yIGNoZWNraW5nIHRoZSB2YWx1ZXMgb2YgZnVuY3Rpb24gYXJndW1lbnRzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBtYXRoCi0KLSV0eXBlbWFwKHBlcmw1LGNoZWNrKSBkb3VibGUgKnBvc2RvdWJsZSB7Ci0JaWYgKCR0YXJnZXQgJmx0OyAwKSB7Ci0JCWNyb2FrKCJFeHBlY3RpbmcgYSBwb3NpdGl2ZSBudW1iZXIiKTsKLQl9Ci19Ci0KLS4uLgotZG91YmxlIHNxcnQoZG91YmxlIHBvc2RvdWJsZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgcHJvdmlkZXMgYSBzYW5pdHkgY2hlY2sgdG8geW91ciB3cmFwcGVyIGZ1bmN0aW9uLiBJZiBhIG5lZ2F0aXZlIG51bWJlciBpcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiwgYSBQZXJsIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBhbmQgeW91ciBwcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBhbiBlcnJvciBtZXNzYWdlLjxwPgotPHA+Ci1UaGlzIGtpbmQgb2YgY2hlY2tpbmcgY2FuIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGggcG9pbnRlcnMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcChweXRob24sY2hlY2spIFZlY3RvciAqIHsKLQlpZiAoJHRhcmdldCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIk5VTEwgUG9pbnRlciBub3QgYWxsb3dlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdpbGwgcHJldmVudCBhbnkgZnVuY3Rpb24gaW52b2x2aW5nIGEgPHR0PlZlY3RvciAqPC90dD4gZnJvbSBhY2NlcHRpbmcgYSBOVUxMIHBvaW50ZXIuIEFzIGEgcmVzdWx0LCBTV0lHIGNhbiBvZnRlbiBwcmV2ZW50IGEgcG90ZW50aWFsIHNlZ21lbnRhdGlvbiBmYXVsdHMgb3Igb3RoZXIgcnVuLXRpbWUgcHJvYmxlbXMgYnkgcmFpc2luZyBhbiBleGNlcHRpb24gcmF0aGVyIHRoYW4gYmxpbmRseSBwYXNzaW5nIHZhbHVlcyB0byB0aGUgdW5kZXJseWluZyBDL0MrKyBwcm9ncmFtLjxwPgotPGEgbmFtZT0ibjEyIj48L2E+PGgyPiBUeXBlbWFwIGV4YW1wbGVzPC9oMj4KLVR5cGVtYXBzIGFyZSBpbmhlcmVudGx5IGxhbmd1YWdlIGRlcGVuZGVudCBzbyBtb3JlIGV4YW1wbGVzIGFwcGVhciBpbiBsYXRlciBjaGFwdGVycy4gVGhlIFNXSUc8dHQ+IEV4YW1wbGVzIDwvdHQ+ZGlyZWN0b3J5IGFsc28gaW5jbHVkZXMgYSB2YXJpZXR5IG9mIGV4YW1wbGVzLiBTb3BoaXN0aWNhdGVkIHVzZXJzIG1heSBnYWluIG1vcmUgYnkgZXhhbWluaW5nIHRoZSA8dHQ+dHlwZW1hcHMuaTwvdHQ+IGFuZCA8dHQ+Y29uc3RyYWludHMuaSA8L3R0PlNXSUcgbGlicmFyeSBmaWxlcy48cD4KLTxhIG5hbWU9Im4xMyI+PC9hPjxoMj4gSG93IHRvIGJyZWFrIGV2ZXJ5dGhpbmcgd2l0aCBhIHR5cGVtYXA8L2gyPgotSXQgc2hvdWxkIGJlIGVtcGhhc2l6ZWQgdGhhdCB0eXBlbWFwcyBwcm92aWRlIGEgZGlyZWN0IG1lY2hhbmlzbSBmb3IgbW9kaWZ5aW5nIFNXSUcncyBvdXRwdXQuIEFzIGEgcmVzdWx0LCBpdCBjYW4gYmUgdmVyeSBlYXN5IHRvIGJyZWFrIGFsbW9zdCBldmVyeXRoaW5nIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiBGb3IgdGhpcyByZWFzb24sIGl0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IHR5cGVtYXBzIGFyZSBub3QgcmVxdWlyZWQgaW4gb3JkZXIgdG8gdXNlIFNXSUcgd2l0aCBtb3N0IGtpbmRzIG9mIGFwcGxpY2F0aW9ucy4gUG93ZXIgdXNlcnMsIGhvd2V2ZXIsIHdpbGwgcHJvYmFibHkgZmluZCB0eXBlbWFwcyB0byBiZSBhIHVzZWZ1bCB0b29sIGZvciBjcmVhdGluZyBleHRyZW1lbHkgcG93ZXJmdWwgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnMuIDxwPgotPGEgbmFtZT0ibjE0Ij48L2E+PGgyPiBUeXBlbWFwcyBhbmQgdGhlIGZ1dHVyZTwvaDI+Ci1UaGUgY3VycmVudCB0eXBlbWFwIG1lY2hhbmlzbSwgd2hpbGUgbmV3LCB3aWxsIHByb2JhYmx5IGZvcm0gdGhlIGJhc2lzIG9mIFNXSUcgMi4wLiBSYXRoZXIgdGhhbiBoYXZpbmcgY29kZSBidXJpZWQgYXdheSBpbnNpZGUgYSBDKysgbW9kdWxlLCBpdCBtYXkgc29vbiBiZSBwb3NzaWJsZSB0byByZWRlZmluZSBhbG1vc3QgYWxsIG9mIFNXSUcncyBjb2RlIGdlbmVyYXRpb24gb24gdGhlIGZseS4gRnV0dXJlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCByZWx5IHVwb24gdHlwZW1hcHMgYWxtb3N0IGV4Y2x1c2l2ZWx5LiA8cD4KLTxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDY6NTYgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzA1YzguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMS4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxLjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk3Mjk5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZkZTA5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC4xLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NWZkZi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMTAucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxMjgwMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjExLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDlkOGUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDgwMjkwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNmI5MDQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFjNzVkLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS40LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS40LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1MzdlNC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNS5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODNmYmEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjYucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFjMTgyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS42LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS43LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS43LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlOTNkMS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuOC5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTg0NWQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjkucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjgyNTU2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMS4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjMmJlYy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTEuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTEuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTEuMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDFiNTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDExLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDExLjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDExLjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGVlNzI0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMi4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMi4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MmYwNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTIuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMi4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gyLjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU4MDBlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gyLjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDIuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMi4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzNDBkZi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMi4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gzLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDMuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMDhkNmEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDMuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g1LjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjIzM2NiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g1LjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDUuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNS4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5NWFhOS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNS4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g1LjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDUuMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWFhNTkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDUuMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGIwZmFlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMjdkNy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LnRhYmxlLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYudGFibGUuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODkwNWYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYudGFibGUuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi50YWJsZS4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LnRhYmxlLjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRlMDAyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LnRhYmxlLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYudGFibGUuMy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi50YWJsZS4zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwODNjMy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi50YWJsZS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDguMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMmY4ZTcuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDguMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJjZjU1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDguMy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC4zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlYWMzZS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTM1MDQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGYxZmM4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuMy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS4zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5NDk4My4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjQucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmUzZDkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS41LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2NiODBmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS42LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyMzUwMy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS42LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjcucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4N2VmZTguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNjY2EyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1YjdkOS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkuMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MDAyOTMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkuMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2UyZDg3Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMTAucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU3NzczLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjIucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjY0N2UuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS4zLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkyYzZlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNC5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS40LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmOTEwYS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS40LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjUucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTZlNTMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS42LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYwMzdjLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS43LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzZWE2OS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS43LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjgucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OTRmYTYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS45LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWIwZTUwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0FkdmFuY2VkLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9BZHZhbmNlZC5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWIwOTkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0FkdmFuY2VkLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9Db250ZW50cy5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvQ29udGVudHMucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdiYzI4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9Db250ZW50cy5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvRG9jdW1lbnRhdGlvbi5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvRG9jdW1lbnRhdGlvbi5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTVhZDYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0RvY3VtZW50YXRpb24ucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4Y2VwdGlvbnMucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4Y2VwdGlvbnMucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ2NjY1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9FeGNlcHRpb25zLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9FeHRlbmRpbmcucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4dGVuZGluZy5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzNiMDUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4dGVuZGluZy5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvSW5kZXgucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL0luZGV4LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxMjQzNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvSW5kZXgucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0ludHJvZHVjdGlvbi5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvSW50cm9kdWN0aW9uLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0YTczZC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvSW50cm9kdWN0aW9uLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9MaWJyYXJ5LnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9MaWJyYXJ5LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0MzBlOC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvTGlicmFyeS5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvUGVybDUucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1Blcmw1LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NjY1OC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvUGVybDUucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1ByZWZhY2UucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1ByZWZhY2UucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY2OWQwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9QcmVmYWNlLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9QeXRob24ucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1B5dGhvbi5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMGZhNjIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1B5dGhvbi5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvUmVmZXJlbmNlLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9SZWZlcmVuY2UucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhkZjc0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9SZWZlcmVuY2UucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1NXSUcucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1NXSUcucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY5OWIyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9TV0lHLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9TV0lHTWFudWFsLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9TV0lHTWFudWFsLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzZTc3OC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvU1dJR01hbnVhbC5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvU2NyaXB0aW5nLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9TY3JpcHRpbmcucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVhNjZlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9TY3JpcHRpbmcucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1RjbC5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvVGNsLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MzkwNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvVGNsLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9UaXRsZS5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvVGl0bGUucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjMzNDczLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9UaXRsZS5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvVHlwZW1hcHMucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1R5cGVtYXBzLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmYzI4NS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvVHlwZW1hcHMucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9JTlNUQUxMIGIvc3dpZ3dlYi9JTlNUQUxMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc4OTEzLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi1JbnN0YWxsYXRpb246ICAgU1dJRyAxLjEKLUp1bmUgMjQsIDE5OTcKLQotSW5zdGFsbGF0aW9uIChVbml4KQotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UbyBjb21waWxlIGFuZCB1c2UgU1dJRywgeW91IHdpbGwgbmVlZCB0aGUgZm9sbG93aW5nIG9uIHlvdXIgbWFjaGluZToKLQotICAgICAgICBBIEMrKyBjb21waWxlciAgKGllLiBnKyspCi0gICAgICAgIEFuIEFOU0kgQyBjb21waWxlciAoaWUuIGdjYykKLSAgICAgICAgeWFjYyBvciBiaXNvbiAgKG9ubHkgbmVlZGVkIHRvIHJlYnVpbGQgdGhlIFNXSUcgcGFyc2VyKS4KLQotVG8gY29tcGlsZSBhbmQgaW5zdGFsbCBTV0lHLCB0eXBlIHRoZSBmb2xsb3dpbmcgOgotCi0gICAgICAgIC4vY29uZmlndXJlCi0gICAgICAgIG1ha2UKLSAgICAgICAgbWFrZSBpbnN0YWxsCi0KLVRoZSBjb25maWd1cmF0aW9uIHNjcmlwdCB3aWxsIGF0dGVtcHQgdG8gbG9jYXRlIHZhcmlvdXMgcGFja2FnZXMgb24KLXlvdXIgbWFjaGluZSwgaW5jbHVkaW5nIFRjbCwgUGVybDUsIGFuZCBQeXRob24uICAgRG9uJ3QgcGFuaWMgaWYKLXlvdSBnZXQgJ25vdCBmb3VuZCcgbWVzc2FnZXMtLVNXSUcgZG9lcyBub3QgbmVlZCB0aGVzZSBwYWNrYWdlcwotdG8gY29tcGlsZSBvciBydW4uICAgVGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgYWN0dWFsbHkgbG9va2luZyBmb3IgCi10aGVzZSBwYWNrYWdlcyBzbyB0aGF0IHlvdSBjYW4gdHJ5IG91dCB0aGUgU1dJRyBleGFtcGxlcyBjb250YWluZWQKLWluIHRoZSAnRXhhbXBsZXMnIGRpcmVjdG9yeS4gIFNlZSB0aGUgRXhhbXBsZXMgc2VjdGlvbiBiZWxvdyBmb3IKLW1vcmUgZGV0YWlscy4gCi0KLVRoZSAnbWFrZSBydW50aW1lJyBvcHRpb24gaXMgYW4gb3B0aW9uYWwgc3RlcCB0aGF0IGNhbiBiZSB1c2VkIHRvCi1idWlsZCB0aGUgU1dJRyBydW50aW1lIGxpYnJhcmllcy4gIFRoZXNlIGxpYnJhcmllcyBhcmUgb25seSB1c2VkIHdpdGgKLWxhcmdlciBwYWNrYWdlcyBhbmQgYXJlIG5vdCBuZWNlc3NhcnkgZm9yIGxlYXJuaW5nIFNXSUcgb3IgdHJ5aW5nCi10aGUgZXhhbXBsZXMgKHBsZWFzZSByZWZlciB0byB0aGUgIkFkdmFuY2VkIHRvcGljcyIgc2VjdGlvbiBvZiB0aGUKLVNXSUcgVXNlcnMgbWFudWFsIGZvciBtb3JlIGRldGFpbHMpLgotCi1UeXBpbmcgJ21ha2UgdGVzdCcgd2lsbCBydW4gYSByYXRoZXIgZXh0ZW5zaXZlIHNlcmllcyBvZiB0ZXN0cwotYW5kIGNhbiBiZSBydW4gYmVmb3JlIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcgKGlmIHlvdSBhcmUgcGFyYW5vaWQpLgotCi1UaGVyZSBhcmUgYSBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgeW91IGNhbiBnaXZlIHRvCi0nY29uZmlndXJlJyA6Ci0KLSAgICAgICAgLS1wcmVmaXg9L3Vzci9sb2NhbCAgICAgCi0KLSAgICAgICAgICBTZXQgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXguICBTV0lHIGluc3RhbGxzIGludG8KLSAgICAgICAgICAvdXNyL2xvY2FsIGJ5IGRlZmF1bHQuCi0KLSAgICAgICAgLS1leGVjX3ByZWZpeD0vdXNyL2xvY2FsCi0KLSAgICAgICAgICBTZXQgdGhlIHByZWZpeCB1c2VkIHRvIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMKLSAgICAgICAgICBmaWxlcyAoYmluYXJpZXMgYW5kIGxpYnJhcmllcykuICBVc2UgdGhpcyBpZiB0aGUKLSAgICAgICAgICBsb2NhdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiB0aGF0IGdpdmVuIHdpdGggLS1wcmVmaXguCi0KLSAgICAgICAgLS13aXRoLWxhbmc9e1RDTCxUQ0w4LFBZVEhPTixQRVJMNSxQRVJMNCxHVUlMRX0KLQotICAgICAgICAgIFRoaXMgbGV0cyB5b3UgY2hvb3NlIHRoZSBkZWZhdWx0IFNXSUcgdGFyZ2V0IGxhbmd1YWdlLgotICAgICAgICAgIEJ5IGRlZmF1bHQsIFNXSUcgY2hvb3NlcyBUQ0wsIGJ1dCB5b3UgY2FuIHNlbGVjdAotICAgICAgICAgIGFub3RoZXIgYXMgc2hvd24gOgotCi0gICAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLWxhbmc9UFlUSE9OCi0KLSAgICAgICAgLS13aXRoLWRvYz17QVNDSUksTEFURVgsSFRNTCxOT0RPQ30KLQotICAgICAgICAgIFRoaXMgbGV0cyB5b3UgY2hvb3NlIHRoZSBkZWZhdWx0IFNXSUcgZG9jdW1lbnRhdGlvbgotICAgICAgICAgIG1ldGhvZC4gIEJ5IGRlZmF1bHQsIFNXSUcgY2hvb3NlcyBBU0NJSS4KLQotVG8gdGVzdCB0aGUgU1dJRyBwYXJzZXIgYWZ0ZXIgY29tcGlsYXRpb24sIHR5cGUgJ21ha2UgdGVzdCcuICAKLQotU2l0ZSBzcGVjaWZpYyBpbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoaWxlIG5vdCByZXF1aXJlZCBmb3IgY29tcGlsaW5nIFNXSUcsIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdCBsb29rcwotZm9yIHZhcmlvdXMgcGFja2FnZXMgaW4gb3JkZXIgdG8gY3JlYXRlIGEgbWFrZWZpbGUgZm9yIGNvbXBpbGluZyB0aGUKLWV4YW1wbGVzLiAgVGhpcyBtYWtlZmlsZSBpcyBhbHNvIGluc3RhbGxlZCB3aXRoIHRoZSBTV0lHIHBhY2thZ2UuCi1UaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGxvY2F0aW9uCi1vZiB2YXJpb3VzIHBhY2thZ2VzLgotCi0tLXdpdGgtdGNsPXBhdGhuYW1lICAgICAgICAgIC0gU2V0IHJvb3QgZGlyZWN0b3J5IG9mIFRjbCBpbnN0YWxsYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dJRyB3aWxsIHVzZSAkcGF0aG5hbWUvaW5jbHVkZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGF0aG5hbWUvbGliLgotCi0tLXdpdGgtdGNsaW5jbD1wYXRobmFtZSAgICAgIC0gU2V0IGV4YWN0IGxvY2F0aW9uIG9mIFRjbCBpbmNsdWRlIGZpbGVzCi0KLS0td2l0aC10Y2xsaWI9cGF0aG5hbWUgICAgICAgLSBTZXQgZXhhY3QgbG9jYXRpb24gb2YgVGNsIGxpYnJhcnkgZmlsZXMKLQotLS13aXRoLWl0Y2w9cGF0aG5hbWUgICAgICAgICAtIFNhbWUgYXMgYWJvdmUgYnV0IGZvciBbaW5jciBUY2xdCi0KLS0td2l0aC1pdGNsaW5jbD1wYXRobmFtZSAgICAgLSBMb2NhdGlvbiBvZiBbaW5jciBUY2xdIGluY2x1ZGUgZmlsZXMKLQotLS13aXRoLWl0Y2xsaWI9cGF0aG5hbWUgICAgICAtIExvY2F0aW9uIG9mIFtpbmNyIFRjbF0gbGlicmFyaWVzCi0KLS0td2l0aC1weT1wYXRobmFtZSAgICAgICAgICAgLSBTZXQgcGFja2FnZSBsb2NhdGlvbiBvZiBQeXRob24uIFRoaXMgaXMgdXN1YWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyBsaWtlIC91c3IvbG9jYWwuICBjb25maWd1cmUgd2lsbCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzLgotCi0tLXdpdGgtcHlpbmNsPXBhdGhuYW1lICAgICAgIC0gU2V0IGxvY2F0aW9uIG9mIFB5dGhvbiBpbmNsdWRlIGZpbGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgZXhhbXBsZSwgL3Vzci9sb2NhbC9pbmNsdWRlKQotCi0tLXdpdGgtcHlsaWI9cGF0aG5hbWUgICAgICAgIC0gU2V0IGxvY2F0aW9uIG9mIFB5dGhvbiBsaWJyYXJ5IGZpbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBleGFtcGxlLCAvdXNyL2xvY2FsL2xpYikKLQotLS13aXRoLXBlcmw1PWV4ZWN1dGFibGUgICAgICAtIFNwZWNpZnkgeW91ciBwZXJsNSBleGVjdXRhYmxlLiAgU1dJRyB3aWxsIGZpZ3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCB3aGVyZSBmaWxlcyBhcmUgYnkgcnVubmluZyB0aGlzIHZlcnNpb24gb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybCBhbmQgZ3JhYmJpbmcgaXRzIGNvbmZpZ3VyYXRpb24gZGF0YS4KLQotCi1PdGhlciBvcHRpb25zIDoKLQotLS13aXRob3V0LXlhY2MgICAgICAgICAgICAgICAtIFRyeSB0byBjb21waWxlIFNXSUcgdXNpbmcgYSBwcmVnZW5lcmF0ZWQgWUFDQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgZ2VuZXJhdGVkIGJ5IEJlcmtlbGV5IFlBQ0MgKGJ5YWNjKS4gT25seSByZWNvbW1lbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBnZXQgY29tcGlsZXIgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgcGFyc2VyLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwYXJzZXIuY3h4LgotCi0KLUhvdyB0byB1c2UgYSBkaWZmZXJlbnQgQysrIGNvbXBpbGVyICAoSU1QT1JUQU5UKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Ob3JtYWxseSwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBwcm9iYWJseSB1c2UgZysrIGFzIHRoZQotQysrIGNvbXBpbGVyLiAgICBJZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgY29tcGlsZXIsIGRvCi10aGUgZm9sbG93aW5nIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZS4KLQotCXNldGVudiBDWFggQ0MgICAgICAgICAgIyBTZXQgQ1hYIHRvIHlvdXIgQysrIGNvbXBpbGVyCi0JLi9jb25maWd1cmUgCi0JbWFrZQotCi1DaGFuZ2luZyB0aGUgTWFrZWZpbGVzIHRvIHVzZSBhIGRpZmZlcmVudCBDKysgY29tcGlsZXIgYWZ0ZXIKLWNvbmZpZ3VyYXRpb24gaXMgbm90IHJlY29tbWVuZGVkISAgIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsCi1kbyB0aGlzIDoKLQotICAgICAgICBybSBjb25maWcuY2FjaGUKLQlzZXRlbnYgQ1hYIENDCi0JLi9jb25maWd1cmUKLQltYWtlCi0KLVRvIGNoYW5nZSB0aGUgQyBjb21waWxlciAoZm9yIGNvbXBpbGluZyBleGFtcGxlcyksIGZvbGxvdyB0aGUKLXNhbWUgcHJvY2VkdXJlIGFib3ZlLCBjaGFuZ2UgdGhlIHN5bWJvbCAnQ0MnIGluc3RlYWQgb2YgJ0NYWCcuCi0KLVRlc3RpbmcgOgotLS0tLS0tLS0tCi0KLVRoZXJlIGFyZSBzZXZlcmFsIHRlc3RzIHRoYXQgY2FuIGJlIGRvbmUgYWZ0ZXIgY29tcGlsYXRpb24gOgotCi1tYWtlIHRlc3QgICAgICAgLSBUZXN0cyB0aGUgU1dJRyBwYXJzZXIgYW5kIHBlcmZvcm1zIHJlZ3Jlc3Npb24gdGVzdHMKLW1ha2UgdGVzdGJ1aWxkICAtIFRlc3RzIFNXSUcgYWJpbGl0eSB0byBidWlsZCB2YXJpb3VzIG1vZHVsZXMKLSAgICAgICAgICAgICAgICAgIChzZWUgYmVsb3cpCi0KLW1ha2UgdGVzdGFsbCAgICAtIFRlc3QgYm90aCBvZiB0aGUgYWJvdmUKLQotVGhlIHRlc3RpbmcgcHJvY2VzcyByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSAnYmFzaCcgc2hlbGwgYW5kIFBlcmwuCi1JZiB5b3UgZG9uJ3QgaGF2ZSB0aGVzZSwgZG9uJ3QgZXhwZWN0IHRoZSB0ZXN0cyB0byB3b3JrLgotCi0qKiogV2FybmluZyA6ICBGdWxsIHRlc3RpbmcgcmVxdWlyZXMgYWJvdXQgMjAgTWJ5dGVzIG9mIGRpc2sgc3BhY2UgCi1hbmQgY3JlYXRlcyBhIGNvbGxlY3Rpb24gb2YgcmVncmVzc2lvbiB0ZXN0aW5nIGZpbGVzLiAgIEFmdGVyIAotcGVyZm9ybWluZyB0aGUgdGVzdHMsIHlvdSBjYW4gZG8gYSAnbWFrZSB0ZXN0Y2xlYW4nIHRvIGNsZWFuIHVwIAotdGhlIHRlc3QgZGlyZWN0b3JpZXMgdG8gdGhlaXIgaW5pdGlhbCBkaXN0cmlidXRpb24gc3RhdGUuCi0KLVRoZSBTV0lHIE1ha2VmaWxlcwotLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNXSUcgY3JlYXRlcyBhIE1ha2VmaWxlIHdpdGggcnVsZXMgb24gaG93IHRvIGJ1aWxkIGFsbCBraW5kcyBvZgotbW9kdWxlcyBmb3IgZGlmZmVyZW50IGxhbmd1YWdlcy4gIFRoaXMgbWFrZWZpbGUgaXMgY2FsbGVkCi0nTWFrZWZpbGUudGVtcGxhdGUnIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGFuZCBpcyBpbnN0YWxsZWQgd2l0aAotdGhlIFNXSUcgbGlicmFyeSBhcyAnc3dpZ19saWIvTWFrZWZpbGUnLgotCi1QcmlvciB0byBpbnN0YWxsYXRpb24sIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBydW4gYQotJ21ha2UgdGVzdGJ1aWxkJyB0byB0ZXN0IHRoaXMgTWFrZWZpbGUuICAgVGhpcyB0ZXN0IHdpbGwgcmVwb3J0Ci13aGljaCBraW5kcyBvZiBleHRlbnNpb25zIGNhbiBiZSBidWlsdC4gICBJdCBpcyBub3JtYWwgdGhhdAotc29tZSB0ZXN0cyB3aWxsIGZhaWwgKGRlcGVuZGluZyBvbiB5b3VyIHN5c3RlbSBhbmQgaW5zdGFsbGF0aW9uKSwKLWJ1dCBpZiB0aGUgdGVzdHMgZmFpbCBmb3IgYSBsYW5ndWFnZSB5b3Ugd2FudCB0byB1c2UsIHlvdSB3aWxsCi13YW50IHRvIGVkaXQgdGhlIGZpbGUgJ01ha2VmaWxlLnRlbXBsYXRlJyBieSBoYW5kLiAgSW4gdGhpcwotcHJvY2VzcywgeW91IGNhbiByZXBlYXRlZGx5IHRyeSAnbWFrZSB0ZXN0YnVpbGQnIHVudGlsIHlvdQotYXJlIHNhdGlzZmllZC4KLQotSW4gYWRkaXRpb24gdG8gdGhlICdNYWtlZmlsZS50ZW1wbGF0ZScgU1dJRyAxLjEgYXR0ZW1wdHMgdG8gY29uZmlndXJlCi1tb3JlIGFkdmFuY2VkIG1ha2VmaWxlcyBmb3IgZWFjaCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICBUaGVzZSBhcmUKLWxvY2F0ZWQgaW4gJ3N3aWdfbGliL3RjbC9NYWtlZmlsZScsICdzd2lnX2xpYi9wZXJsNS9NYWtlZmlsZScsIGFuZAotJ3N3aWdfbGliL3B5dGhvbi9NYWtlZmlsZScuICBQcmlvciB0byBpbnN0YWxsYXRpb24sIHlvdSBtYXkgd2FudAotdG8gZXhhbWluZSB0aGVzZSBNYWtlZmlsZXMgdG8gbWFrZSBzdXJlIHRoZXkgYWNjdXJhdGVseSByZWZsZWN0Ci15b3VyIGxvY2FsIHNldHVwLiAgIAotCi1JZiB5b3UncmUgaGFwcHkgd2l0aCB0aGUgc2V0dXAsIHByb2NlZWQgdG8gaW5zdGFsbGF0aW9uLgotCi1JbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLQotCi1UeXBlICdtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgU1dJRy4gIFRoaXMgd2lsbCBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgOgotCi0gICAtICBUaGUgU1dJRyBMaWJyYXJ5ICAoY29udGFpbmluZyBpbnRlcmZhY2UgZmlsZXMpCi0gICAtICBzd2lnLmggICAgICAgICAgICAoSGVhZGVycyBmb3IgYnVpbGRpbmcgU1dJRyBleHRlbnNpb25zKSAgICAgICAgICAKLSAgIC0gIGxpYnN3aWcuYSAgICAgICAgIChTV0lHIGxpYnJhcnkgZm9yIGJ1aWxkaW5nIFNXSUcgZXh0ZW5zaW9ucykKLSAgIC0gIHN3aWcuMSAgICAgICAgICAgIChtYW4gcGFnZSkKLSAgIC0gIHN3aWdfbGliL01ha2VmaWxlICBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgZXh0ZW5zaW9ucwotICAgLSAgUnVudGltZSBsaWJyYXJpZXMgKGlmIGJ1aWx0IGVhcmxpZXIpLgotCi1Ucm91Ymxlc2hvb3RpbmcKLS0tLS0tLS0tLS0tLS0tCi0KLVNlZSB0aGUgZmlsZSBUUk9VQkxFU0hPT1RJTkcgZm9yIHNvbHV0aW9ucyB0byBzZXZlcmFsIHByb2JsZW1zLgotCi1XaGlsZSBJIGhhdmUgYWNjZXNzIHRvIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY2hpbmVzLCBpdCdzIGltcG9zc2libGUgZm9yCi1tZSB0byB0ZXN0IGV2ZXJ5dGhpbmcuICBJZiB5b3UgY2FuJ3QgZ2V0IFNXSUcgdG8gYnVpbGQgc3VjY2Vzc2Z1bGx5LAotcGxlYXNlIHNlbmQgbWUgZW1haWwgYXQgYmVhemxleUBjcy51dGFoLmVkdS4KLQotCi1JbnN0YWxsYXRpb24gZm9yIFdpbmRvd3MgOTUgYW5kIE5UCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBXaW4gZGlyZWN0b3J5IGNvbnRhaW5zIG1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgNC54LgotU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgV2luIGRpcmVjdG9yeSBmb3Igc3BlY2lmaWMgYnVpbGQKLWluc3RydWN0aW9ucy4KLQotSW5zdGFsbGF0aW9uIGZvciBNYWNpbnRvc2gKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBNYWMgZGlyZWN0b3J5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIFNXSUcgb24KLXRoZSBNYWNpbnRvc2guICBBdCB0aGlzIHRpbWUsIHRoZSBNYWNpbnRvc2ggdmVyc2lvbiBpcwotZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBhcyBhIGJpbmFyeSByZWxlYXNlLiAgU291cmNlIGlzIGFsc28KLWF2YWlsYWJsZSwgYnV0IGlzIG5vbi10cml2aWFsIHRvIGJ1aWxkIGR1ZSB0byBkZXBlbmRlbmNpZXMKLW9uIG90aGVyIHBhY2thZ2VzLgotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9NYWtlZmlsZSBiL3N3aWd3ZWIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNmQzYjguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgU2ltcGxlIG1ha2VmaWxlIHRvIGNyZWF0ZSB0aGUgd2ViIHBhZ2VzIGFuZCB1cGRhdGUvc3luY2hyb25pc2UgdG8gdGhlIHJlYWwgd2ViIHNlcnZlcgotCi1VU0VSTkFNRT13c2Z1bHRvbgotCi1hbGw6IG1ha2V3ZWIgcnN5bmMKLQotbWFrZXdlYjoKLQlweXRob24gbWFrZXdlYi5weQotCi1yc3luYzoKLQlyc3luYyAtciAtLWN2cy1leGNsdWRlIC0tcnNoPSJzc2giIC4gJChVU0VSTkFNRSlAc2hlbGwuc2YubmV0Oi9ob21lL2dyb3Vwcy9zL3N3L3N3aWcvc3dpZ3dlYgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2FydGljbGVfY3BwLmh0IGIvc3dpZ3dlYi9hcnRpY2xlX2NwcC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmZjM0Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2FydGljbGVfY3BwLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLVRob3VnaHRzIG9uIHRoZSBJbnNhbml0eSBDKysgUGFyc2luZwotCi08aDI+VGhvdWdodHMgb24gdGhlIEluc2FuaXR5IG9mIEMrKyBQYXJzaW5nPC9oMj4KLQotPGNlbnRlcj4KLTxlbT4KLSJQYXJzaW5nIEMrKyBpcyBzaW1wbHkgdG9vIGNvbXBsZXggdG8gZG8gY29ycmVjdGx5LiIgLS0gQW5vbnltb3VzCi08L2VtPgotPC9jZW50ZXI+Ci08cD4KLUF1dGhvcjogRGF2aWQgQmVhemxleSAoYmVhemxleUBjcy51Y2hpY2Fnby5lZHUpCi0KLTxwPgotQXVndXN0IDEyLCAyMDAyCi0KLTxwPgotQSBjZW50cmFsIGdvYWwgb2YgdGhlIFNXSUcgcHJvamVjdCBpcyB0byBnZW5lcmF0ZSBleHRlbnNpb24gbW9kdWxlcyBieQotcGFyc2luZyB0aGUgY29udGVudHMgb2YgQysrIGhlYWRlciBmaWxlcy4gIEl0J3Mgbm90IHRvbyBoYXJkIHRvIGNvbWUgdXAKLXdpdGggcmVhc29ucyB3aHkgdGhpcyBtaWdodCBiZSB1c2VmdWwtLS1hZnRlciBhbGwsIGlmIHlvdSd2ZSBnb3QKLXNldmVyYWwgaHVuZHJlZCBjbGFzcyBkZWZpbml0aW9ucywgZG8geW91IHJlYWxseSB3YW50IHRvIGdvIG9mZiBhbmQKLXdyaXRlIGEgYnVuY2ggb2YgaGFuZC1jcmFmdGVkIHdyYXBwZXJzPyAgTm8sIG9mIGNvdXJzZSBub3QtLS15b3UncmUKLWJ1c3kgYW5kIGxpa2UgZXZlcnlvbmUgZWxzZSwgeW91J3ZlIGdvdCBiZXR0ZXIgdGhpbmdzIHRvIGRvIHdpdGgKLXlvdXIgdGltZS4gIAotCi08cD4KLU9rYXksIHNvIHRoZXJlIGFyZSBtYW55IHJlYXNvbnMgd2h5IHBhcnNpbmcgQysrIHdvdWxkIGJlIG5pY2UuCi1Ib3dldmVyLCBwYXJzaW5nIEMrKyBpcyBhbHNvIGEgbmlnaHRtYXJlLiAgSW4gZmFjdCwgQysrIHdvdWxkCi1wcm9iYWJseSB0aGUgbGFzdCBsYW5ndWFnZSB0aGF0IGFueSBub3JtYWwgcGVyc29uIHdvdWxkIGNob29zZSB0bwotc2VydmUgYXMgYW4gaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gbGFuZ3VhZ2UuICBJdCdzIGhhcmQgdG8gcGFyc2UsCi1oYXJkIHRvIGFuYWx5emUsIGFuZCBpdCBpbnZvbHZlcyBhbGwgc29ydHMKLW9mIG5hc3R5IGxpdHRsZSBwcm9ibGVtcyByZWxhdGVkIHRvIHNjb3BpbmcsIHR5cGVuYW1lcywgdGVtcGxhdGVzLAotYWNjZXNzLCBhbmQgc28gZm9ydGguICBCZWNhdXNlIG9mIHRoaXMsIG1vc3Qgb2YgdGhlIHRvb2xzIHRoYXQgY2xhaW0KLXRvICJwYXJzZSIgQysrIGRvbid0LiAgSW5zdGVhZCwgdGhleSBwYXJzZSBhIHN1YnNldCBvZiB0aGUgbGFuZ3VhZ2UKLXRoYXQgaGFwcGVucyB0byBtYXRjaCB0aGUgQysrIHByb2dyYW1taW5nIHN0eWxlIHVzZWQgYnkgdGhlIHRvb2wncwotY3JlYXRvciAoYmVsaWV2ZSBtZSwgSSBrbm93LS0tdGhpcyBpcyBob3cgU1dJRyBzdGFydGVkKS4gIE5vdAotc3VycHJpc2luZ2x5LCB0aGVzZSB0b29scyB0ZW5kIHRvIGJyZWFrIGRvd24gd2hlbiBwcmVzZW50ZWQgd2l0aCBjb2RlCi10aGF0IHN0YXJ0cyB0byBjaGFsbGVuZ2UgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgQysrIGNvbXBpbGVyLgotTmVlZGxlc3MgdG8gc2F5LCBjcml0aWNzIHNlZSB0aGlzIGFzIG9wcG9ydHVuaXR5IHRvIG1ha2UgYm9sZCBjbGFpbXMKLXN1Y2ggYXMgIndyaXRpbmcgYSBDKysgcGFyc2VyIGlzIGZvbGx5IiBvciAidGhpcyB3aG9sZSBhcHByb2FjaCBpcyB0b28KLWhhcmQgdG8gZXZlciB3b3JrIGNvcnJlY3RseS4iCi0KLTxwPgotV2VsbCwgb25lIGRvZXMgaGF2ZSB0byBnaXZlIHRoZSBjcml0aWNzIGEgbGl0dGxlIGNyZWRpdC0tLXdyaXRpbmcgYQotQysrIHBhcnNlciBjZXJ0YWlubHkgPGVtPmlzPC9lbT4gaGFyZCBhbmQgd3JpdGluZyBhIHBhcnNlciB0aGF0Ci1hY3R1YWxseSB3b3JrcyBjb3JyZWN0bHkgaXMgZXZlbiBoYXJkZXIuICBIb3dldmVyLCB0aGVzZSB0YXNrcyBhcmUKLWNlcnRhaW5seSBub3QgImltcG9zc2libGUuIiAgQWZ0ZXIgYWxsLCB0aGVyZSB3b3VsZCBiZSBubyB3b3JraW5nIEMrKwotY29tcGlsZXIgaWYgc3VjaCBjbGFpbXMgd2VyZSB0cnVlISAgVGhlcmVmb3JlLCB0aGUgcXVlc3Rpb24gb2Ygd2hldGhlcgotb3Igbm90IGEgd3JhcHBlciBnZW5lcmF0b3IgY2FuIHBhcnNlIEMrKyBpcyBjbGVhcmx5IHRoZSB3cm9uZyBxdWVzdGlvbgotdG8gYXNrLiAgSW5zdGVhZCwgdGhlIHJlYWwgcXVlc3Rpb24gaXMgd2hldGhlciBvciBub3QgYSB3cmFwcGVyCi1nZW5lcmF0aW9uIHRvb2wgdGhhdCBwYXJzZXMgQysrIGNhbiBhY3R1YWxseSBkbyBhbnl0aGluZyB1c2VmdWwuCi0KLTxoMz5UaGUgcHJvYmxlbSB3aXRoIHVzaW5nIEMrKyBhcyBhbiBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZTwvaDM+Ci0KLUlmIHlvdSBjdXQgdGhyb3VnaCBhbGwgb2YgdGhlIGxvdy1sZXZlbCBkZXRhaWxzIG9mIHBhcnNpbmcsIHRoZSBwcmltYXJ5Ci1wcm9ibGVtIG9mIHVzaW5nIEMrKyBhcyBhbiBtb2R1bGUgc3BlY2lmaWNhdGlvbiBsYW5ndWFnZSBpcyB0aGF0IG9mCi1hbWJpZ3VpdHkuIENvbnNpZGVyIGEgZGVjbGFyYXRpb24gbGlrZSB0aGlzOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci12b2lkIGZvbyhkb3VibGUgKngsIGludCBuKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1JZiB5b3UgbG9vayBhdCB0aGlzIGRlY2xhcmF0aW9uLCB5b3UgY2FuIGFzayB5b3Vyc2VsZiB0aGUgcXVlc3Rpb24sCi13aGF0IGlzICJ4Ij8gIElzIGl0IGEgc2luZ2xlIGlucHV0IHZhbHVlPyAgSXMgaXQgYW4gb3V0cHV0IHZhbHVlCi0obW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uKT8gIElzIGl0IGFuIGFycmF5PyAgSXMgIm4iIHNvbWVob3cgcmVsYXRlZD8KLVBlcmhhcHMgdGhlIHJlYWwgcHJvYmxlbSBpbiB0aGlzIGV4YW1wbGUgaXMgdGhhdCBvZiBleHByZXNzaW5nIHRoZQotcHJvZ3JhbW1lcidzIGludGVudC4gIFllcywgdGhlIGZ1bmN0aW9uIGNsZWFybHkgYWNjZXB0cyBhIHBvaW50ZXIgdG8KLXNvbWUgb2JqZWN0IGFuZCBhbiBpbnRlZ2VyLCBidXQgdGhlIGRlY2xhcmF0aW9uIGRvZXMgbm90IGNvbnRhaW4KLWVub3VnaCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgcHVycG9zZSBvZiB0aGVzZQotcGFyYW1ldGVycy0taW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSB1c2VmdWwgaW4gZ2VuZXJhdGluZyBhIHN1aXRhYmxlCi1zZXQgb2YgYSB3cmFwcGVycy4KLQotPHA+Ci1JREwgY29tcGlsZXJzIGFzc29jaWF0ZWQgd2l0aCBwb3B1bGFyIGNvbXBvbmVudCBmcmFtZXdvcmtzIChlLmcuLAotQ09SQkEsIENPTSwgZXRjLikgIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IHJlcXVpcmluZyBpbnRlcmZhY2VzIHRvCi1iZSBwcmVjaXNlbHkgc3BlY2lmaWVkLS1pbnB1dCBhbmQgb3V0cHV0IHZhbHVlcyBhcmUgY2xlYXJseSBpbmRpY2F0ZWQKLWFzIHN1Y2guICBUaHVzLCBvbmUgbWlnaHQgYWRvcHQgYSBzaW1pbGFyIGFwcHJvYWNoIGFuZCBleHRlbmQgQysrCi1zeW50YXggd2l0aCBzb21lIHNwZWNpYWwgbW9kaWZpZXJzIG9yIHF1YWxpZmllcnMuICBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotdm9pZCBmb28oJW91dHB1dCBkb3VibGUgKngsIGludCBuKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UaGUgcHJvYmxlbSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBpdCBicmVha3MgZnJvbSBDKysgc3ludGF4IGFuZAotaXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gYW5ub3RhdGUgdGhlaXIgaW5wdXQgZmlsZXMgKGEgdGFzayB0aGF0IEMrKwotd3JhcHBlciBnZW5lcmF0b3JzIGFyZSBzdXBwb3NlZCB0byBlbGltaW5hdGUpLiAgTWVhbndoaWxlLCBjcml0aWNzIHNpdAotYmFjayBhbmQgc2F5ICJIYSEgSSB0b2xkIHlvdSBDKysgcGFyc2luZyB3b3VsZCBuZXZlciB3b3JrLiIKLQotPHA+Ci1Bbm90aGVyIHByb2JsZW0gd2l0aCB1c2luZyBDKysgYXMgYW4gaW5wdXQgbGFuZ3VhZ2UgaXMgdGhhdCBpbnRlcmZhY2UKLWJ1aWxkaW5nIG9mdGVuIGludm9sdmVzIG1vcmUgdGhhbiBqdXN0IGJsaW5kbHkgd3JhcHBpbmcgZGVjbGFyYXRpb25zLiAgRm9yIGluc3RhbmNlLAotdXNlcnMgbWlnaHQgd2FudCB0byByZW5hbWUgZGVjbGFyYXRpb25zLCBzcGVjaWZ5IGV4Y2VwdGlvbiBoYW5kbGluZyBwcm9jZWR1cmVzLAotYWRkIGN1c3RvbWl6ZWQgY29kZSwgYW5kIHNvIGZvcnRoLiAgVGhpcyBzdWdnZXN0cyB0aGF0IGEgCi13cmFwcGVyIGdlbmVyYXRvciByZWFsbHkgbmVlZHMgdG8gZG8KLW1vcmUgdGhhbiBqdXN0IHBhcnNlIEMrKy0tLWl0IG11c3QgZ2l2ZSB1c2VycyB0aGUgZnJlZWRvbSB0byBjdXN0b21pemUKLXZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgd3JhcHBlciBnZW5lcmF0aW9uIHByb2Nlc3MuICBBZ2FpbiwgdGhpbmdzIGFyZW4ndAotbG9va2luZyB0b28gZ29vZCBmb3IgQysrLgotCi08aDM+VGhlIFNXSUcgYXBwcm9hY2g6IHBhdHRlcm4gbWF0Y2hpbmc8L2gzPgotCi1TV0lHIHRha2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoIHRvIHRoZSBDKysgd3JhcHBpbmcgcHJvYmxlbS4KLUluc3RlYWQgb2YgdHJ5aW5nIHRvIG1vZGlmeSBDKysgd2l0aCBhbGwgc29ydHMgb2YgbGl0dGxlIG1vZGlmaWVycyBhbmQKLWFkZC1vbnMsIHdyYXBwaW5nIGlzIGxhcmdlbHkgY29udHJvbGxlZCBieSBhIHBhdHRlcm4gbWF0Y2hpbmcgbWVjaGFuaXNtIHRoYXQgaXMKLWJ1aWx0IGludG8gdGhlIHVuZGVybHlpbmcgQysrIHR5cGUgc3lzdGVtLgotCi08cD4KLU9uZSBwYXJ0IG9mIHRoZSBwYXR0ZXJuIG1hdGNoZXIgaXMgcHJvZ3JhbW1lZCB0byBsb29rIGZvciBzcGVjaWZpYyBzZXF1ZW5jZXMgb2YKLWRhdGF0eXBlcyBhbmQgYXJndW1lbnQgbmFtZXMuICAgVGhlc2UgcGF0dGVybnMsIGtub3duIGFzIHR5cGVtYXBzLCBhcmUKLXJlc3BvbnNpYmxlIGZvciBhbGwgYXNwZWN0cyBvZiBkYXRhIGNvbnZlcnNpb24uICBUaGV5IHdvcmsgYnkgc2ltcGx5IGF0dGFjaGluZwotYml0cyBvZiBDIGNvbnZlcnNpb24gY29kZSB0byBzcGVjaWZpYyBkYXRhdHlwZXMgYW5kIGFyZ3VtZW50IG5hbWVzIGluIHRoZQotaW5wdXQgZmlsZS4gIEZvciBleGFtcGxlLCBhIHR5cGVtYXAgbWlnaHQgYmUgdXNlZCBsaWtlIHRoaXM6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSV0eXBlbWFwKGluKSA8Yj5kb3VibGUgKml0ZW1zPC9iPiB7Ci0gICAvLyBHZXQgYW4gYXJyYXkgZnJvbSB0aGUgaW5wdXQKLSAgIC4uLgotfQotLi4uIAotdm9pZCBmb28oPGI+ZG91YmxlICppdGVtczwvYj4sIGludCBuKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1XaXRoIHRoaXMgYXBwcm9hY2gsIHR5cGUgYW5kIGFyZ3VtZW50IG5hbWVzIGFyZSB1c2VkIGFzCi1hIGJhc2lzIGZvciBzcGVjaWZ5aW5nIGN1c3RvbWl6ZWQgd3JhcHBpbmcgYmVoYXZpb3IuICBGb3IgZXhhbXBsZSwgaWYgYSBwcm9ncmFtCi1hbHdheXMgdXNlZCBhbiBhcmd1bWVudCBvZiA8dHQ+ZG91YmxlICppdGVtczwvdHQ+IHRvIHJlZmVyIHRvIGFuCi1hcnJheSwgU1dJRyBjYW4gbGF0Y2ggb250byB0aGF0IGFuZCB1c2UgaXQgdG8gcHJvdmlkZSBjdXN0b21pemVkCi1wcm9jZXNzaW5nLiAgSXQgaXMgZXZlbiBwb3NzaWJsZSB0byB3cml0ZSBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzIGZvcgotc2VxdWVuY2VzIG9mIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCB5b3UgY291bGQgd3JpdGUgdGhlIGZvbGxvd2luZzoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJXR5cGVtYXAoaW4pICg8Yj5kb3VibGUgKml0ZW1zLCBpbnQgbjwvYj4pIHsKLSAgIC8vIEdldCBhbiBhcnJheSBvZiBpdGVtcy4gU2V0IG4gdG8gbnVtYmVyIG9mIGl0ZW1zCi0gICAuLi4KLX0KLS4uLgotdm9pZCBmb28oPGI+ZG91YmxlICppdGVtcywgaW50IG48L2I+KTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UaGUgcHJlY2lzZSBkZXRhaWxzIG9mIHR5cGVtYXBzIGFyZSBub3Qgc28gaW1wb3J0YW50IChpbiBmYWN0LCBtb3N0IG9mCi10aGlzIHBhdHRlcm4gbWF0Y2hpbmcgaXMgaGlkZGVuIGZyb20gU1dJRyB1c2VycykuICBXaGF0IGlzIGltcG9ydGFudAotaXMgdGhhdCBwYXR0ZXJuIG1hdGNoaW5nIGFsbG93cyBjdXN0b21pemVkIGRhdGEgaGFuZGxpbmcgdG8gYmUKLXNwZWNpZmllZCB3aXRob3V0IGJyZWFraW5nIEMrKyBzeW50YXgtLWluc3RlYWQsIGEgdXNlciBtZXJlbHkgaGFzIHRvCi1kZWZpbmUgYSBmZXcgcGF0dGVybnMgdGhhdCBnZXQgYXBwbGllZCBhY3Jvc3MgdGhlIGRlY2xhcmF0aW9ucyB0aGF0Ci1hcHBlYXIgaW4gQysrIGhlYWRlciBmaWxlcy4gIEluIHNvbWUgc2Vuc2UsIHlvdSBtaWdodCB2aWV3IHRoaXMKLWFwcHJvYWNoIGFzIHByb3ZpZGluZyBjdXN0b21pemF0aW9uIHRocm91Z2ggbmFtaW5nIGNvbnZlbnRpb25zIHJhdGhlciB0aGFuCi1oYXZpbmcgdG8gYW5ub3RhdGUgYXJndW1lbnRzIHdpdGggZXh0cmEgcXVhbGlmaWVycy4KLQotPHA+Ci1UaGUgb3RoZXIgcGF0dGVybiBtYXRjaGluZyBtZWNoYW5pc20gdXNlZCBieSBTV0lHIGlzIGEgZGVjbGFyYXRpb24gYW5ub3RhdG9yCi10aGF0IGlzIHVzZWQgdG8gYXR0YWNoIHByb3BlcnRpZXMgdG8gc3BlY2lmaWMgZGVjbGFyYXRpb25zLiAgQSBzaW1wbGUgZXhhbXBsZSBvZiBkZWNsYXJhdGlvbgotYW5ub3RhdGlvbiBtaWdodCBiZSByZW5hbWluZy4gIEZvciBleGFtcGxlOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci0lcmVuYW1lKGNwcmludCkgcHJpbnQ7ICAvLyBSZW5hbWUgYWxsIG9jY3VycmVuY2VzIG9mICdwcmludCcgdG8gJ2NwcmludCcKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1BIG1vcmUgYWR2YW5jZWQgZm9ybSBvZiBkZWNsYXJhdGlvbiBtYXRjaGluZyB3b3VsZCBiZSBleGNlcHRpb24gaGFuZGxpbmcuCi1Gb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJWV4Y2VwdGlvbiBGb286OmdldGl0ZW0oaW50KSB7Ci0gICAgdHJ5IHsKLSAgICAgICAgJGFjdGlvbgotICAgIH0gY2F0Y2ggKHN0ZDo6b3V0X29mX3JhbmdlJmFtcDsgZSkgewotICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsY29uc3RfY2FzdCZsdDtjaGFyKiZndDsoZS53aGF0KCkpKTsKLSAgICB9Ci19Ci0KLS4uLgotdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgY2xhc3MgRm9vIHsKLXB1YmxpYzoKLSAgICAgLi4uCi0gICAgIFQgJmFtcDtnZXRpdGVtKGludCBpbmRleCk7ICAgIC8vIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGF0dGFjaGVkCi0gICAgIC4uLgotfTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1MaWtlIHR5cGVtYXBzLCBkZWNsYXJhdGlvbiBtYXRjaGluZyBkb2VzIG5vdCBicmVhayBmcm9tIEMrKyBzeW50YXguCi1JbnN0ZWFkLCBhIHVzZXIgbWVyZWx5IHNwZWNpZmllcyBzcGVjaWFsIHByb2Nlc3NpbmcgcnVsZXMgaW4gYWR2YW5jZS4KLVRoZXNlIHJ1bGVzIGFyZSB0aGVuIGF0dGFjaGVkIHRvIGFueSBtYXRjaGluZyBDKysKLWRlY2xhcmF0aW9uIHRoYXQgYXBwZWFycyBsYXRlciBpbiB0aGUgaW5wdXQuICBUaGlzIG1lYW5zIHRoYXQgcmF3IEMrKwotaGVhZGVyIGZpbGVzIGNhbiBvZnRlbiBiZSBwYXJzZWQgYW5kIGN1c3RvbWl6ZWQgd2l0aCBmZXcsIGlmIGFueSwKLW1vZGlmaWNhdGlvbnMuCi0KLTxoMz5UaGUgU1dJRyBkaWZmZXJlbmNlPC9oMz4KLQotUGF0dGVybiBiYXNlZCBhcHByb2FjaGVzIHRvIHdyYXBwZXIgY29kZSBnZW5lcmF0aW9uIGFyZSBub3QgdW5pcXVlIHRvIFNXSUcuCi1Ib3dldmVyLCBtb3N0IHByaW9yIGVmZm9ydHMgaGF2ZSBiYXNlZCB0aGVpciBwYXR0ZXJuIG1hdGNoaW5nIGVuZ2luZXMgb24gc2ltcGxlCi1yZWd1bGFyLWV4cHJlc3Npb24gbWF0Y2hpbmcuIFRoZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIFNXSUcgYW5kIHRoZXNlIHN5c3RlbXMgCi1pcyB0aGF0IFNXSUcncyBjdXN0b21pemF0aW9uIGZlYXR1cmVzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlCi11bmRlcmx5aW5nIEMrKyB0eXBlIHN5c3RlbS4gIFRoaXMgbWVhbnMgdGhhdCBTV0lHIGlzIGFibGUgdG8gZGVhbCB3aXRoIHZlcnkgCi1jb21wbGljYXRlZCB0eXBlcyBvZiBDL0MrKyBjb2RlLS0tZXNwZWNpYWxseSBjb2RlIHRoYXQgbWFrZXMgaGVhdnkgdXNlIG9mCi08dHQ+dHlwZWRlZjwvdHQ+LCBuYW1lc3BhY2VzLCBhbGlhc2VzLCBjbGFzcyBoaWVyYXJjaGllcywgYW5kIG1vcmUuICBUbwotaWxsdXN0cmF0ZSwgY29uc2lkZXIgc29tZSBjb2RlIGxpa2UgdGhpczoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotLy8gQSBzaW1wbGUgU1dJRyB0eXBlbWFwIAotJXR5cGVtYXAoaW4pIGludCB7Ci0gICAgJDEgPSBQeUludF9Bc0xvbmcoJGlucHV0KTsKLX0KLQotLi4uCi0vLyBTb21lIHJhdyBDKysgY29kZSAoaW5jbHVkZWQgbGF0ZXIpCi1uYW1lc3BhY2UgWCB7Ci0gIHR5cGVkZWYgaW50IEludGVnZXI7Ci0KLSAgY2xhc3MgX0Zvb0ltcGwgewotICBwdWJsaWM6Ci0gICAgICB0eXBlZGVmIEludGVnZXIgdmFsdWVfdHlwZTsKLSAgfTsKLSAgdHlwZWRlZiBfRm9vSW1wbCBGb287Ci19Ci0KLW5hbWVzcGFjZSBZID0gWDsKLXVzaW5nIFk6OkZvbzsKLQotY2xhc3MgQmFyIDogcHVibGljIEZvbyB7Ci19OwotCi12b2lkIHNwYW0oQmFyOjp2YWx1ZV90eXBlIHgpOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLUlmIHlvdSB0cmFjZSB5b3VyIHdheSB0aHJvdWdoIHRoaXMgZXhhbXBsZSwgeW91IHdpbGwgZmluZCB0aGF0IHRoZQotPHR0PkJhcjo6dmFsdWVfdHlwZTwvdHQ+IGFyZ3VtZW50IHRvIGZ1bmN0aW9uIDx0dD5zcGFtKCk8L3R0PiBpcwotcmVhbGx5IGFuIGludGVnZXIuICBXaGF0J3MgbW9yZSwgaWYgeW91IHRha2UgYSBjbG9zZSBsb29rIGF0IHRoZSBTV0lHCi1nZW5lcmF0ZWQgd3JhcHBlcnMsIHlvdSB3aWxsIGZpbmQgdGhhdCB0aGUgdHlwZW1hcCBwYXR0ZXJuIGRlZmluZWQgZm9yCi08dHQ+aW50PC90dD4gaXMgYXBwbGllZCB0byBpdC0taW4gb3RoZXIgd29yZHMsIFNXSUcgZG9lcyBleGFjdGx5IHRoZSByaWdodCB0aGluZyBkZXNwaXRlCi1vdXIgZWZmb3J0cyB0byBtYWtlIHRoZSBjb2RlIGNvbmZ1c2luZy4KLQotPHA+Ci1TaW1pbGFybHksIGRlY2xhcmF0aW9uIGFubm90YXRpb24gaXMgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlIHN5c3RlbQotYW5kIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBwcm9wZXJ0aWVzIHRoYXQgc3BhbiBpbmhlcml0YW5jZSBoaWVyYXJjaGllcwotYW5kIG1vcmUgKGluIGZhY3QsIHRoZXJlIGFyZSBtYW55IHNpbWlsYXJpdGllcyBiZXR3ZWVuIHRoZSBvcGVyYXRpb24gb2YKLVNXSUcgYW5kIHRvb2xzIGRldmVsb3BlZCBmb3IgQXNwZWN0IE9yaWVudGVkIFByb2dyYW1taW5nKS4KLQotPGgzPldoYXQgZG9lcyB0aGlzIG1lYW4/PC9oMz4KLQotUGF0dGVybi1iYXNlZCBhcHByb2FjaGVzIGFsbG93IHdyYXBwZXIgZ2VuZXJhdGlvbiB0b29scyB0byBwYXJzZSBDKysKLWRlY2xhcmF0aW9ucyBhbmQgdG8gcHJvdmlkZSBhIHdpZGUgdmFyaWV0eSBvZiBoaWdoLWxldmVsIGN1c3RvbWl6YXRpb24KLWZlYXR1cmVzLiAgQWx0aG91Z2ggdGhpcyBhcHByb2FjaCBpcyBxdWl0ZSBkaWZmZXJlbnQgdGhhbiB0aGF0IGZvdW5kCi1pbiBhIHR5cGljYWwgSURMLCB0aGUgdXNlIG9mIHBhdHRlcm5zIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHdvcmsgZnJvbQotZXhpc3RpbmcgaGVhZGVyIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRvIG1ha2UgbWFueSAoaWYgYW55KSBjaGFuZ2VzIHRvCi10aG9zZSBmaWxlcy4gIE1vcmVvdmVyLCB3aGVuIHRoZSB1bmRlcmx5aW5nIHBhdHRlcm4gbWF0Y2hpbmcgbWVjaGFuaXNtCi1pcyBpbnRlZ3JhdGVkIHdpdGggdGhlIEMrKyB0eXBlIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQKLXJlbGlhYmxlIHdyYXBwZXJzIHRvIHJlYWwgc29mdHdhcmUtLS1ldmVuIGlmIHRoYXQgc29mdHdhcmUgaXMgZmlsbGVkCi13aXRoIG5hbWVzcGFjZXMsIHRlbXBsYXRlcywgY2xhc3NlcywgPHR0PnR5cGVkZWY8L3R0PiBkZWNsYXJhdGlvbnMsCi1wb2ludGVycywgYW5kIG90aGVyIGJpdHMgb2YgbmFzdGluZXNzLgotCi08aDM+VGhlIGJvdHRvbSBsaW5lPC9oMz4KLQotTm90IG9ubHkgaXMgaXQgcG9zc2libGUgdG8gZ2VuZXJhdGUgZXh0ZW5zaW9uIG1vZHVsZXMgYnkgcGFyc2luZyBDKyssCi1pdCBpcyBwb3NzaWJsZSB0byBkbyBzbyB3aXRoIHJlYWwgc29mdHdhcmUgYW5kIHdpdGggYSBoaWdoIGRlZ3JlZSBvZgotcmVsaWFiaWxpdHkuICBEb24ndCBiZWxpZXZlIG1lPyAgRG93bmxvYWQgU1dJRy0xLjMuMTQgYW5kIHRyeSBpdCBmb3IKLXlvdXJzZWxmLgotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9ibGFuay5qcGcgYi9zd2lnd2ViL2JsYW5rLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NGM5Zi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2JsYW5rLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvYnVncy5odCBiL3N3aWd3ZWIvYnVncy5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhZjRmNC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2J1Z3MuaHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1TV0lHIEJ1ZyBUcmFja2luZwotCi08cD48aW1nIHNyYz0iaW1hZ2VzL2J1Z3MucG5nIiBhbHQ9IkJ1Z3MiPgotCi08cD5BIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvYnVncy8/Z3JvdXBfaWQ9MTY0NSI+YnVnLXRyYWNraW5nIHN5c3RlbTwvYT4gZm9yIFNXSUcKLWlzIGxvY2F0ZWQgb24gPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldCI+U291cmNlRm9yZ2U8L2E+LiAKLVBsZWFzZSBsb2cgb24gdG8gU291cmNlRm9yZ2UgYmVmb3JlIHN1Ym1pdHRpbmcgYSBidWcuCi1Bbm9ueW1vdXMgYnVnIHN1Ym1pdHRlcnMgd29uJ3QgYmUgYWJsZSB0byByZWNlaXZlIGVtYWlscyBvbiB0aGUgYnVnIHByb2dyZXNzLiAKLVRoaXMgbWlnaHQgYmUgYSBwcm9ibGVtIHNob3VsZCB3ZSByZXF1aXJlIGZ1cnRoZXIgZmVlZGJhY2sgb24gdGhlIGJ1Zy4KLQotPHA+Ci1Vc2VycyB3aG8gaGF2ZSBmb3VuZCBhIGJ1ZyBhbmQgZml4ZWQgaXQgdGhlbXNlbHZlcyBjYW4gc3VibWl0IGEKLTxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcGF0Y2gvP2dyb3VwX2lkPTE2NDUiPnBhdGNoPC9hPi4KLVBsZWFzZSBnaXZlIHRoZSBTV0lHIHZlcnNpb24gb3IgQ1ZTIHNuYXBzaG90IGRhdGUgdGhhdCB0aGUgcGF0Y2ggaXMgYWdhaW5zdC4KLUFnYWluLCBwbGVhc2UgbG9nIG9uIHRvIFNvdXJjZUZvcmdlIGJlZm9yZSBzdWJtaXR0aW5nIHBhdGNoZXMuCi0KLTxwPgotUGxlYXNlIG5vdGUgdGhhdCBkdWUgdG8gdGltZSBjb25zdHJhaW50cywgYnVnIHJlcG9ydHMgbWF5IG5vdCAKLXJlY2VpdmUgYW4gaW1tZWRpYXRlIHJlc3BvbnNlLgotSWYgeW91IGhhdmUgYW4gdXJnZW50IHByb2JsZW0sIHlvdSBtYXkgd2FudCB0bwotcG9zdCBhIG1lc3NhZ2UgdG8gdGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+c3dpZzwvYT4gbWFpbGluZyBsaXN0Ci1pbnN0ZWFkLiAKLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9jZ2ktYmluL3N1cnZleXJlc3BvbnNlLnBsIGIvc3dpZ3dlYi9jZ2ktYmluL3N1cnZleXJlc3BvbnNlLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGYxMTZkLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvY2dpLWJpbi9zdXJ2ZXlyZXNwb25zZS5wbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLQotIyBUaGlzIGlzIGEgQ0dJIHNjcmlwdCB3aGljaCB0YWtlcyB0aGUgaW5wdXQgZnJvbSB0aGUgc2ltcGxlIHN1cnZleSBzdWJtaXR0ZWQgaW4gCi0jIHN1cnZleS5odG1sLiBUaGUgdXNlcidzIGludGVuZGVkIGxhbmd1YWdlcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIHN0b3JlZCBpbiAKLSMgc2ltcGxlIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBmaWxlcy4KLQotdXNlIENHSTsKLSRxID0gbmV3IENHSTsKLQotIyBTdGFydCB0aGUgcmVzcG9uc2Ugd2ViIHBhZ2UKLXByaW50ICJDb250ZW50LXR5cGU6dGV4dC9odG1sXG5cbiI7Ci1wcmludCA8PEVuZEhUTUw7Ci08aHRtbD48aGVhZD48dGl0bGU+U1dJRyBTdXJ2ZXkgU3VibWlzc2lvbjwvdGl0bGU+PC9oZWFkPgotPGJvZHk+Ci08cC8+Ci08dGFibGU+IDx0cj4KLTx0ZCBiZ2NvbG9yPSIjMDAwMDAwIiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPjxiPlNXSUcgU3VydmV5IFN1Ym1pc3Npb248L2I+PC9mb250PjwvdGQ+Ci08L3RyPiA8L3RhYmxlPgotCi1FbmRIVE1MCi0KLQotIyBFeHRyYWN0IGFsbCB0aGUgdmFyaWFibGVzIG91dCBvZiB0aGUgcmVzcG9uc2UKLSRyZW1vdGVIb3N0ID0gJEVOVnsnUkVNT1RFX0hPU1QnfTsKLSRyZW1vdGVBZGRyID0gJEVOVnsnUkVNT1RFX0FERFInfTsKLSRpcEFkZHJlc3MgPSAoJHJlbW90ZUhvc3QgPT0gJycpID8gJHJlbW90ZUFkZHIgOiAkcmVtb3RlSG9zdDsKLQotJGxhbmdDaGlja2VuICAgID0gJHEtPnBhcmFtKCdsYW5nQ2hpY2tlbicpOwotJGxhbmdDU2hhcnAgICAgID0gJHEtPnBhcmFtKCdsYW5nQ1NoYXJwJyk7Ci0kbGFuZ0d1aWxlICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdHdWlsZScpOwotJGxhbmdKYXZhICAgICAgID0gJHEtPnBhcmFtKCdsYW5nSmF2YScpOwotJGxhbmdNenNjaGVtZSAgID0gJHEtPnBhcmFtKCdsYW5nTXpzY2hlbWUnKTsKLSRsYW5nT2NhbWwgICAgICA9ICRxLT5wYXJhbSgnbGFuZ09jYW1sJyk7Ci0kbGFuZ1BlcmwgICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdQZXJsJyk7Ci0kbGFuZ1BocCAgICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdQaHAnKTsKLSRsYW5nUGlrZSAgICAgICA9ICRxLT5wYXJhbSgnbGFuZ1Bpa2UnKTsKLSRsYW5nUHl0aG9uICAgICA9ICRxLT5wYXJhbSgnbGFuZ1B5dGhvbicpOwotJGxhbmdSdWJ5ICAgICAgID0gJHEtPnBhcmFtKCdsYW5nUnVieScpOwotJGxhbmdTZXhwICAgICAgID0gJHEtPnBhcmFtKCdsYW5nU2V4cCcpOwotJGxhbmdUY2wgICAgICAgID0gJHEtPnBhcmFtKCdsYW5nVGNsJyk7Ci0kbGFuZ1htbCAgICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdYbWwnKTsKLSRsYW5nU3BhcmVMYW5nMSA9ICRxLT5wYXJhbSgnbGFuZ1NwYXJlTGFuZzEnKTsKLSRsYW5nU3BhcmVMYW5nMiA9ICRxLT5wYXJhbSgnbGFuZ1NwYXJlTGFuZzInKTsKLSRsYW5nU3BhcmVMYW5nMyA9ICRxLT5wYXJhbSgnbGFuZ1NwYXJlTGFuZzMnKTsKLSRsYW5nT3RoZXJMYW5nICA9ICRxLT5wYXJhbSgnbGFuZ090aGVyTGFuZycpOwotCi0kbmFtZWRMYW5ndWFnZSAgPSAkcS0+cGFyYW0oJ25hbWVkTGFuZ3VhZ2UnKTsKLQotJG9zQlNEICAgICAgICAgID0gJHEtPnBhcmFtKCdvc0JTRCcpOwotJG9zSFBVWCAgICAgICAgID0gJHEtPnBhcmFtKCdvc0hQVVgnKTsKLSRvc0xpbnV4ICAgICAgICA9ICRxLT5wYXJhbSgnb3NMaW51eCcpOwotJG9zTWFjT1NYICAgICAgID0gJHEtPnBhcmFtKCdvc01hY09TWCcpOwotJG9zU29sYXJpcyAgICAgID0gJHEtPnBhcmFtKCdvc1NvbGFyaXMnKTsKLSRvc1dpbmRvd3MgICAgICA9ICRxLT5wYXJhbSgnb3NXaW5kb3dzJyk7Ci0kb3NPdGhlck9TICAgICAgPSAkcS0+cGFyYW0oJ29zT3RoZXJPUycpOwotCi0kbmFtZWRPUyAgICAgICAgPSAkcS0+cGFyYW0oJ25hbWVkT1MnKTsKLQotIyBHZXQgbG9nIGRhdGUKLSgkc2Vjb25kcywgJG1pbnV0ZXMsICRob3VycywgJGRheV9vZl9tb250aCwgJG1vbnRoLCAkeWVhciwgJHdkYXksICR5ZGF5LCAkaXNkc3QpID0gZ210aW1lOwotJGxvZ0RhdGUgPSBzcHJpbnRmKCIlMDRkLyUwMmQvJTAyZCAlMDJkOiUwMmQiLCAkeWVhcisxOTAwLCAkbW9udGgrMSwgJGRheV9vZl9tb250aCwgJGhvdXJzLCAkbWludXRlcyk7Ci0KLSMgQ3JlYXRlIG5ldyBmaWxlIGVhY2ggbW9udGgKLSRmaWxlTmFtZSA9IHNwcmludGYoIi4uL3N1cnZleS9zd2lnc3VydmV5LSUwNGQtJTAyZC5jc3YiLCAkeWVhcisxOTAwLCAkbW9udGgrMSk7Ci0KLWlmICghLWUgJGZpbGVOYW1lKSB7Ci0gICAgY3JlYXRlX2ZpbGUoJGZpbGVOYW1lKTsKLX0KLQotIyBPcGVuIGZpbGUgZm9yIGFwcGVuZGluZyBhbmQgbG9jayBpdCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzCi1vcGVuKGZpbGVPVVQsICI+PiRmaWxlTmFtZSIpIG9yIGNvbnN0cnVjdF90aGFua3lvdV9wYWdlX2FuZF9leGl0KCk7ICMgV2UgY2FuJ3QgbG9nIHRoZSBpbmZvIGlmIHdlIGNhbid0IG9wZW4gdGhlIGZpbGUsIHF1aWV0bHkgZ2l2ZSB1cC4KLWZsb2NrKGZpbGVPVVQsIDIpOwotc2VlayhmaWxlT1VULCAwLCAyKTsKLQotIyBEdW1wIGFsbCB0aGUgc3VydmV5ZWQgZGF0YSB0byBmaWxlIGluIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSAoQ1NWKSBmb3JtYXQKLXByaW50IGZpbGVPVVQgIiRsb2dEYXRlLCRpcEFkZHJlc3MsIjsKLXByaW50IGZpbGVPVVQgIiRsYW5nQ2hpY2tlbiwkbGFuZ0NTaGFycCwkbGFuZ0d1aWxlLCRsYW5nSmF2YSwkbGFuZ016c2NoZW1lLCRsYW5nT2NhbWwsJGxhbmdQZXJsLCRsYW5nUGhwLCRsYW5nUGlrZSwkbGFuZ1B5dGhvbiwkbGFuZ1J1YnksJGxhbmdTZXhwLCRsYW5nVGNsLCRsYW5nWG1sLCRsYW5nU3BhcmVMYW5nMSwkbGFuZ1NwYXJlTGFuZzIsJGxhbmdTcGFyZUxhbmczLCRsYW5nT3RoZXJMYW5nLCRuYW1lZExhbmd1YWdlLCI7Ci1wcmludCBmaWxlT1VUICIkb3NCU0QsJG9zSFBVWCwkb3NMaW51eCwkb3NNYWNPU1gsJG9zU29sYXJpcywkb3NXaW5kb3dzLCRvc1NwYXJlT1MxLCRvc1NwYXJlT1MyLCRvc1NwYXJlT1MzLCRvc090aGVyT1MsJG5hbWVkT1MiOwotcHJpbnQgZmlsZU9VVCAiXG4iOwotY2xvc2UoZmlsZU9VVCk7Ci0KLSMgQ3JlYXRlIGh0bWwgcGFnZSByZXNwb25zZQotY29uc3RydWN0X3RoYW5reW91X3BhZ2VfYW5kX2V4aXQoKTsKLQotc3ViIGNyZWF0ZV9maWxlKCQpCi17Ci0gICAgbXkoJGZpbGVUb0NyZWF0ZSkgPSBAXzsKLQotICAgIG9wZW4oZmlsZU9VVCwgIj4kZmlsZVRvQ3JlYXRlIikgb3IgY29uc3RydWN0X3RoYW5reW91X3BhZ2VfYW5kX2V4aXQoKTsgIyBXZSBjYW4ndCBsb2cgdGhlIGluZm8gaWYgd2UgY2FuJ3QgY3JlYXRlIHRoZSBmaWxlLCBxdWlldGx5IGdpdmUgdXAuCi0KLSAgICAjIEdlbmVyYXRlIGZpZWxkIGhlYWRpbmcgbmFtZXMKLSAgICBwcmludCBmaWxlT1VUICJMb2dEYXRlLElQQWRkcmVzcywiOwotICAgIHByaW50IGZpbGVPVVQgIkNoaWNrZW4sQ1NoYXJwLEd1aWxlLEphdmEsTXpzY2hlbWUsT2NhbWwsUGVybCxQaHAsUGlrZSxQeXRob24sUnVieSxTZXhwLFRjbCxYbWwsU3BhcmVMYW5nMSxTcGFyZUxhbmcyLFNwYXJlTGFuZzMsT3RoZXJMYW5nLE5hbWVkTGFuZ3VhZ2UsIjsKLSAgICBwcmludCBmaWxlT1VUICJCU0QsSFBVWCxMaW51eCxNYWNPU1gsU29sYXJpcyxXaW5kb3dzLFNwYXJlT1MxLFNwYXJlT1MyLFNwYXJlT1MzLE90aGVyT1MsTmFtZWRPUyI7Ci0gICAgcHJpbnQgZmlsZU9VVCAiXG4iOwotfQotCi1zdWIgY29uc3RydWN0X3RoYW5reW91X3BhZ2VfYW5kX2V4aXQKLXsKLSAgICBwcmludCA8PEVuZEhUTUw7Ci0KLSAgICBUaGFuayB5b3UgZm9yIHRha2luZyB0aGUgdGltZSB0byBmaWxsIG91dCB0aGUgc3VydmV5LiBQbGVhc2UgY29udGludWUgdG8gdGhlIAotICAgIDxhIGhyZWY9Ii4uL2Rvd25sb2FkLmh0bWwiPkRvd25sb2FkIGFyZWE8L2E+IG9yIHJldHVybiB0byB0aGUgPGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+U1dJRyBob21lPC9hPiBwYWdlLgotICAgIDwvYm9keT48L2h0bWw+Ci0KLUVuZEhUTUwKLSAgICBleGl0OwotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2NvbXBhcmUuaHQgYi9zd2lnd2ViL2NvbXBhcmUuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzBhM2YuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9jb21wYXJlLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLVNXSUcgRmVhdHVyZXMKLQotPGgyPlNXSUcgRmVhdHVyZXM8L2gyPgotCi08cD4KLVRoaXMgaW5mb3JtYXRpb24gaXMgYmFzZWQgb24gdGhlIFNXSUctMS4zLjIyIHJlbGVhc2UuCi0KLTxoMz5Db2RlIEdlbmVyYXRpb248L2gzPgotCi1TV0lHIGN1cnJlbnQgZ2VuZXJhdGVzIHdyYXBwZXIgY29kZSBmb3IgdGhpcnRlZW4gZGlmZmVyZW50IHRhcmdldCBsYW5ndWFnZXM6Ci0KLTx1bD4KLTxsaT5BbGxlZ3JvIENMCi08bGk+QyMKLTxsaT5DaGlja2VuCi08bGk+R3VpbGUKLTxsaT5KYXZhCi08bGk+TW9kdWxhLTMKLTxsaT5NenNjaGVtZQotPGxpPk9DQU1MCi08bGk+UGVybAotPGxpPlBIUAotPGxpPlB5dGhvbgotPGxpPlJ1YnkKLTxsaT5UY2wKLTwvdWw+Ci0KLUluIGFkZGl0aW9uIHRvIHRoaXMsIGFuIFhNTCBvdXRwdXQgbW9kdWxlIGlzIGFsc28gYXZhaWxhYmxlIGFuZCB3b3JrCi1pcyBpbiBwcm9ncmVzcyBvbiBhIFBpa2UgbW9kdWxlLgotCi08aDM+QU5TSSBDPC9oMz4KLQotU1dJRyBpcyBjYXBhYmxlIG9mIHdyYXBwaW5nIGFsbCBvZiBBTlNJIEMuICAgRmVhdHVyZXMgaW5jbHVkZToKLQotPHVsPgotPGxpPkhhbmRsaW5nIG9mIDxlbT5hbGw8L2VtPiBBTlNJIEMgZGF0YXR5cGVzLgotPGxpPkdsb2JhbCBmdW5jdGlvbnMsIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHMuCi08TGk+U3RydWN0dXJlcyBhbmQgdW5pb25zLgotPGxpPlBvaW50ZXJzLgotPGxpPkFycmF5cyBhbmQgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuCi08bGk+UG9pbnRlcnMgdG8gZnVuY3Rpb25zLgotPGxpPlZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCi08bGk+VHlwZWRlZi4KLTxsaT5FbnVtcy4KLTwvdWw+Ci0KLTxoMz5BTlNJIEMrKzwvaDM+Ci0KLVNXSUcgcHJvdmlkZXMgd3JhcHBpbmcgc3VwcG9ydCBmb3IgYWxtb3N0IGFsbCBvZiBBTlNJIEMrKy4KLQotPHVsPgotPExpPkFsbCBDKysgZGF0YXR5cGVzLgotPExpPlJlZmVyZW5jZXMuCi08bGk+UG9pbnRlcnMgdG8gbWVtYmVycy4KLTxsaT5DbGFzc2VzLgotPGxpPkluaGVyaXRhbmNlIGFuZCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLTxsaT5PdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyAodXNpbmcgZHluYW1pYyBkaXNwYXRjaCkuCi08bGk+T3ZlcmxvYWRlZCBvcGVyYXRvcnMuCi08bGk+U3RhdGljIG1lbWJlcnMuCi08bGk+TmFtZXNwYWNlcyAoaW5jbHVkaW5nIHVzaW5nIGRlY2xhcmF0aW9ucywgYWxpYXNlcywgbmVzdGluZywgZXRjLikKLTxsaT5UZW1wbGF0ZXMKLTxsaT5NZW1iZXIgdGVtcGxhdGVzCi08bGk+VGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gYW5kIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCi08bGk+U21hcnQgcG9pbnRlcnMKLTxsaT5MaWJyYXJ5IHN1cHBvcnQgZm9yIHN0cmluZ3MsIFNUTCB2ZWN0b3JzLCBhbmQgbW9yZS4KLTwvdWw+Ci0KLVRoZSBvbmx5IG1ham9yIEMrKyBmZWF0dXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFNXSUcgaXMgdGhlCi13cmFwcGluZyBvZiBuZXN0ZWQgY2xhc3Nlcy0tYSBwcm9ibGVtIHdlJ3JlIHdvcmtpbmcgb24uIFNXSUcgYWxzbwotZG9lcyBub3QgYWxsb3cgQysrIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBpbiBjZXJ0YWluCi10YXJnZXQgbGFuZ3VhZ2VzIChhIHN1YnRsZSBmZWF0dXJlIHRoYXQgbWlnaHQgYmUgdXNlZnVsIGluIHByb2plY3RzIHRoYXQKLXJlbHkgaGVhdmlseSBvbiB0aGUgdXNlIG9mIGNhbGxiYWNrIGZ1bmN0aW9ucykuCi0KLTxwPgotQysrIHVzZXJzIHdobyByZWx5IG9uIGFkdmFuY2VkIHRlbXBsYXRlIHByb2dyYW1taW5nIHRlY2huaXF1ZXMgCi0oZS5nLiwgdGVtcGxhdGUgbWV0YS1wcm9ncmFtbWluZykgc2hvdWxkIGFsc28gYmUgYXdhcmUgdGhhdCBTV0lHCi1jdXJyZW50bHkgcmVxdWlyZXMgbWFudWFsIGluc3RhbnRpYXRpb24gb2YgYWxsIHRlbXBsYXRlIGNsYXNzZXMuCi1UaGVyZWZvcmUsIGlmIHlvdXIgYXBwbGljYXRpb24gc29tZWhvdyBpbnZvbHZlcyB0aGUgaW5zdGFudGlhdGlvbiBvZiA1MDAwMAotdGVtcGxhdGUgY2xhc3NlcywgeW91ciBtaWxlYWdlIG1pZ2h0IHZhcnkuCi0KLTxoMz5QcmVwcm9jZXNzaW5nPC9oMz4KLQotU1dJRyBwcm92aWRlcyBhIGZ1bGwgQyBwcmVwcm9jZXNzb3Igd2l0aCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgotCi08dWw+Ci08bGk+TWFjcm8gZXhwYW5zaW9uLgotPGxpPkF1dG9tYXRpYyB3cmFwcGluZyBvZiAjZGVmaW5lIHN0YXRlbWVudHMgYXMgY29uc3RhbnRzICh3aGVuIGFwcGxpY2FibGUpLgotPGxpPlN1cHBvcnQgZm9yIEM5OSAodmFyaWFkaWMgbWFjcm8gZXhwYW5zaW9uKS4KLQotPC91bD4KLQotPGgzPkN1c3RvbWl6YXRpb24gZmVhdHVyZXM8L2gzPgotCi1TV0lHIHByb3ZpZGVzIGNvbnRyb2wgb3ZlciBtb3N0IGFzcGVjdHMgb2Ygd3JhcHBlciBnZW5lcmF0aW9uLiAgTW9zdAotb2YgdGhlc2UgY3VzdG9taXphdGlvbiBvcHRpb25zIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIEMrKyB0eXBlCi1zeXN0ZW0tLW1ha2luZyBpdCBlYXN5IHRvIGFwcGx5IGN1c3RvbWl6YXRpb25zIGFjcm9zcyBpbmhlcml0YW5jZQotaGllcmFyY2hpZXMsIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLCBhbmQgbW9yZS4gIEZlYXR1cmVzIGluY2x1ZGU6Ci0KLTx1bD4KLTxsaT5DdXN0b21pemF0ZWQgdHlwZSBjb252ZXJzaW9uL21hcnNoYWxpbmcuCi08TGk+RXhjZXB0aW9uIGhhbmRsaW5nLgotPGxpPkNsYXNzL3N0cnVjdHVyZSBleHRlbnNpb24uCi08bGk+TWVtb3J5IG1hbmFnZW1lbnQuCi08bGk+QW1iaWd1aXR5IHJlc29sdXRpb24uCi08bGk+VGVtcGxhdGUgaW5zdGFudGlhdGlvbi4KLTxsaT5GaWxlIGltcG9ydCBhbmQgY3Jvc3MtbW9kdWxlIGxpbmtpbmcuCi08bGk+Q29kZSBpbmNsdXNpb24sIGhlbHBlciBmdW5jdGlvbiBzdXBwb3J0LgotPGxpPkV4dGVuc2l2ZSBkaWFnbm9zdGljcyAoZXJyb3Ivd2FybmluZyBtZXNzYWdlcykuCi08bGk+RXh0ZW5kZWQgU1dJRyBtYWNybyBoYW5kbGluZy4KLTwvdWw+Ci0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvY29tcGF0Lmh0IGIvc3dpZ3dlYi9jb21wYXQuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzM2QxMjMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9jb21wYXQuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1TV0lHIENvbXBhdGliaWxpdHkKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2NvbXBhdC5wbmciIGFsdD0iQ29tcGF0aWJpbGl0eSI+Ci0KLTxwPgotU1dJRyBpcyBrbm93biB0byB3b3JrIG9uIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zIDoKLQotPHVsPgotPGxpPiBVbml4IAotCi08YmxvY2txdW90ZT4KLVNXSUcgaXMgY29uZmlndXJlZCBhbmQgYnVpbHQgdXNpbmcgYW4gYXV0b2NvbmYgc2NyaXB0IHNvIGl0IGlzCi1yZWxhdGl2ZWx5IGVhc3kgdG8gaW5zdGFsbCBvbiBhbG1vc3QgYW55IGZsYXZvciBvZiBVbml4LiAgSG93ZXZlciwgbW9zdCBvZgotU1dJRydzIGRldmVsb3BtZW50IGhhcyB0YWtlbiBwbGFjZSB1bmRlciBMaW51eCBhbmQgU29sYXJpcy4KLVdoaWxlIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdCB0cmllcyB0byBkZXRlcm1pbmUgdGhlIHByb3BlciBzZXR0aW5ncwotZm9yIHlvdXIgbWFjaGluZSwgc29tZSB0d2Vha2luZyBtYXkgYmUgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGUKLWV4YW1wbGVzIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24gKGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBhIAotdmVyc2lvbiBvZiBVbml4IHN1Y2ggYXMgQUlYIG9yIEhQVVgpLgotPC9ibG9ja3F1b3RlPgotCi08bGk+IE1pY3Jvc29mdCBXaW5kb3dzCi0KLTxibG9ja3F1b3RlPgotU1dJRyB3b3JrcyBvbiAzMiBiaXQgdmVyc2lvbnMgb2YgV2luZG93cyBzdWNoIGFzIFdpbmRvd3MgOTUvOTgvTlQvMjAwMC9YUC4gCi1Ib3dldmVyLCBnaXZlbiB0aGF0IFNXSUcgaXMgcHJpbWFyaWx5IGRldmVsb3BlZCB1bmRlciBVbml4LCB0aGUgV2luZG93cwotdmVyc2lvbiBpcyBub3QgYXMgdGhvcm91Z2hseSB0ZXN0ZWQsIGJ1dCBpcyB1c2VkIHdpZGVseSBhbmQgc3VjY2Vzc2Z1bGx5IHVuZGVyIFdpbmRvd3MuCi1DdXJyZW50bHkgdGhlIFdpbmRvd3MgdmVyc2lvbiBvZiBTV0lHIDEuMyBpcyBjb21waWxlZCBhbmQgdGVzdGVkIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3lnd2luLmNvbSI+Q3lnd2luPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5taW5ndy5vcmciPk1pbmd3PC9hPiB1c2luZyBnY2MsIGJ1dCBzaG91bGQgYmUgY29tcGlsYWJsZSBieSBhbnkgb3RoZXIgV2luZG93cyBDKysgY29tcGlsZXIuIFNXSUcgMS4xIGNhbiBiZSBjb21waWxlZCB3aXRoIFZpc3VhbCBDKysgNC54LzUueC82Lnggb3Igd2l0aCB0aGUgQm9ybGFuZCBDKysgNS54Ci1jb21waWxlci4gICBIb3dldmVyLCBTV0lHIDEuMSBoYXMgb25seSBiZWVuIG9mZmljaWFsbHkgdGVzdGVkIHVzaW5nIHRoZQotVmlzdWFsIEMrKyBjb21waWxlci4gICBZb3UgbWF5IGFsc28gbmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggY29tcGlsZXIKLWhhcyBiZWVuIHVzZWQgdG8gY29tcGlsZSB0aGUgdmFyaW91cyBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHRoYXQgeW91IHdpbGwKLWJlIHVzaW5nLiAgIEluIGdlbmVyYWwsIHVzaW5nIFNXSUcgd2l0aCBhIGRpZmZlcmVudCBDKysgY29tcGlsZXIgdGhhbgotdGhlIG9uZSB0aGF0IHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UgbWF5Ci1ub3Qgd29yayAoZm9yIGV4YW1wbGUsIHRyeWluZyB0byBjcmVhdGUgYSBUY2wvVGsgbW9kdWxlIHVzaW5nIHRoZQotQm9ybGFuZCBjb21waWxlciB3aGVuIFRjbC9UayBoYXMgYmVlbiBjb21waWxlZCB3aXRoIFZpc3VhbCBDKyspLiAgCi0KLTwvYmxvY2txdW90ZT4KLQotPGxpPiBNYWNpbnRvc2gKLQotPGJsb2NrcXVvdGU+Ci1BIGhpZ2hseSBleHBlcmltZW50YWwgdmVyc2lvbiBvZiBTV0lHIGhhcyBiZWVuIGNvbXBpbGVkIHVzaW5nCi1NZXRyb3dlcmtzIENvZGUgV2FycmlvciAxMC4gIEdpdmVuIHRoZSBsaW1pdGVkIGF2YWlsYWJpbGl0eSBhbmQKLWV4cGVyaWVuY2Ugd2l0aCB0aGUgTWFjaW50b3NoLCB0aGlzIHZlcnNpb24gb2YgU1dJRyBzaG91bGQgb25seQotYmUgdXNlZCBieSBleGNlcHRpb25hbGx5IGJyYXZlIHVzZXJzLiBTV0lHIGhhcyBub3QgYmVlbiBmdWxseSB0ZXN0ZWQgd2l0aCBQeXRob24gb3IKLVBlcmwgb24gdGhlIE1hY2ludG9zaCBhbHRob3VnaCBzb21lIHVzZXJzIGhhdmUgcmVwb3J0ZWQgc3VjY2Vzcy4KLTxwPgotPGI+Tm90ZTo8L2I+U1dJRy0xLjMuMTIgZG9lcyBzdXBwb3J0IE9TLVgvRGFyd2luLiAgU2ltcGx5IGRvd25sb2FkIHRoZSBVbml4Ci1zb3VyY2VzLCBjb25maWd1cmUsIGFuZCBidWlsZCBmcm9tIHRoZSBjb21tYW5kIHRlcm1pbmFsLgotPC9ibG9ja3F1b3RlPgotPC91bD4KLQotPGgzPjxhIG5hbWU9IlN1cHBvcnRlZExhbmd1YWdlcyI+PC9hPiBTdXBwb3J0ZWQgTGFuZ3VhZ2VzIDwvaDM+Ci0KLVRoZSBmb2xsb3dpbmcgc2NyaXB0aW5nIGxhbmd1YWdlcyB3ZXJlIHN1cHBvcnRlZCBpbiB0aGUgZmluYWwgU1dJRyAxLjEgcmVsZWFzZS4KLQotPHVsPgotPGxpPiBUY2wgOC4wIGFuZCBuZXdlciB2ZXJzaW9ucy4KLTxsaT4gUHl0aG9uIDEuNSBhbmQgbmV3ZXIuCi08bGk+IFBlcmwgNS4wMDMgb3IgbmV3ZXIuCi08bGk+IEd1aWxlIDEuMy40IGFuZCBuZXdlci4KLTwvdWw+Ci0KLVRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzIGFyZSBhbHNvIHN1cHBvcnRlZCBpbiBTV0lHIDEuMy42IG9ud2FyZHMuCi0KLTx1bD4KLTxsaT4gSmF2YSBKREsgMS4xIGFuZCBuZXdlci4KLTxsaT4gUnVieS4KLTxsaT4gTXpzY2hlbWUuCi08L3VsPgotCi1QSFAgc3VwcG9ydCB3YXMgYWRkZWQgaW4gU1dJRyAxLjMuMTEuPGJyPgotT2JqZWN0aXZlIENhbWwgKE9jYW1sKSBhbmQgUGlrZSBzdXBwb3J0IHdhcyBhZGRlZCBpbiBTV0lHIDEuMy4xNC48YnI+Ci1TdXBwb3J0IGZvciBDIyBhbmQgdGhlIENoaWNrZW4gc2NoZW1lIGNvbXBpbGVyIHdhcyBhZGRlZCBpbiBTV0lHIDEuMy4xOC48YnI+Ci1TdXBwb3J0IGZvciBBbGxlZ3JvIENMIGFuZCBNb2R1bGEtMyB3YXMgYWRkZWQgaW4gU1dJRy0xLjMuMjIuPGJyPgotU3VwcG9ydCBmb3IgTHVhLCBDTElTUCBhbmQgQ29tbW9uIExpc3Agd2l0aCBVRkZJIHdhcyBhZGRlZCBpbiBTV0lHLTEuMy4yNi48YnI+Ci08cD4KLQotQW55IG5ld2VyIHZlcnNpb25zIG9mIHRoZXNlIGxhbmd1YWdlcyBzaG91bGQgYmUgYXNzdW1lZCB0byBiZQotc3VwcG9ydGVkIHVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLiAgIAotCi1UaGVyZSBpcyBhbHNvIDxhIGhyZWY9Imh0dHA6Ly93d3cudWx0cmF2aW9sZXRjb25zdWx0aW5nLmNvbS9wcm9qZWN0cy9zd2lnanMiPlN3aWdKUzwvYT4sIGEgSmF2YVNjcmlwdCBtb2R1bGUgZm9yIFNXSUcgCi1hbmQgPGEgaHJlZj0iaHR0cDovL2Vmc2Euc291cmNlZm9yZ2UubmV0L2FyY2hpdmUvY296emkvc3dpZ2VpZmZlbC5odG0iPlNXSUdFaWZmZWw8L2E+IGZvciBFaWZmZWwuCi0KLTxoMz4gQ29tcGlsYXRpb24gUmVxdWlyZW1lbnRzIDwvaDM+Ci0KLVNXSUcgaXMgaW1wbGVtZW50ZWQgaW4gQyBhbmQgQysrIGFuZCBpcyBkaXN0cmlidXRlZCBpbiBzb3VyY2UgZm9ybS4KLVlvdSB3aWxsIG5lZWQgYSB3b3JraW5nIEMrKyBjb21waWxlciAoZS5nLiBnKyspIHRvIGJ1aWxkIFNXSUcgYW5kIGF0Ci1sZWFzdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHRvIHVzZSBpdCAob3IgZWxzZSBpdAotaXNuJ3QgZ29pbmcgdG8gYmUgdmVyeSB1c2VmdWwpLiAgU1dJRyBkb2VzIG5vdCBkZXBlbmQgdXBvbiBhbnkgb2YgdGhlCi1zdXBwb3J0ZWQgc2NyaXB0aW5nIGxhbmd1YWdlcyBmb3IgaXRzIG93biBjb21waWxhdGlvbi4gIEZpbmFsbHksCi1hbHRob3VnaCBTV0lHIGlzIHBhcnRseSB3cml0dGVuIGluIEMrKywgYSBDKysgY29tcGlsZXIgaXMgbm90IHJlcXVpcmVkIHRvIHVzZQotU1dJRy0taXQgd29ya3MganVzdCBmaW5lIHdpdGggYm90aCBBTlNJIEMgYW5kIEMrKy4KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvY29weWZ1bi5odCBiL3N3aWd3ZWIvY29weWZ1bi5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZWViNC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2NvcHlmdW4uaHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1Qcm9wb3NlZCBTV0lHIENvcHlyaWdodAotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvY29weXJpZ2h0LnBuZyIgYWx0PSJDb3B5cmlnaHQiPgotCi08cHJlPgotU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yICAoU1dJRykKLQotQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMKLVRoZSBVbml2ZXJzaXR5IG9mIENoaWNhZ28KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotSXQncyBmcmVlLgotPC9wcmU+CmRpZmYgLS1naXQgYS9zd2lnd2ViL2NvcHlyaWdodC5odCBiL3N3aWd3ZWIvY29weXJpZ2h0Lmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzc5ZmViLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvY29weXJpZ2h0Lmh0CisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotU1dJRyBDb3B5cmlnaHQKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2NvcHlyaWdodC5wbmciIGFsdD0iQ29weXJpZ2h0Ij4KLQotPHByZT4KLVNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAgKFNXSUcpCi0KLVNXSUcgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSS4gCi0KLVRoaXMgc29mdHdhcmUgaW5jbHVkZXMgY29udHJpYnV0aW9ucyB0aGF0IGFyZSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMgotVW5pdmVyc2l0eSBvZiBDaGljYWdvLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0KLVJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLXRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICBSZWRpc3RyaWJ1dGlvbnMKLWluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKLWNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3IKLW90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uICBOZWl0aGVyIHRoZSBuYW1lIG9mCi10aGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKLXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgVU5JVkVSU0lUWSBPRiBDSElDQUdPIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQotUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPRgotQ0hJQ0FHTyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAotVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLUlJLiAgCi0KLUNvcHlyaWdodCAoYykgMTk5NS0xOTk4Ci1UaGUgVW5pdmVyc2l0eSBvZiBVdGFoIGFuZCB0aGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHdpdGhvdXQgd3JpdHRlbiBhZ3JlZW1lbnQgYW5kIHdpdGhvdXQKLWxpY2Vuc2Ugb3Igcm95YWx0eSBmZWVzLCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQgdGhhdCAKLSgxKSBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0d28gcGFyYWdyYXBocwotYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvdXJjZSBjb2RlIGFuZCAoMikgcmVkaXN0cmlidXRpb25zCi1pbmNsdWRpbmcgYmluYXJpZXMgcmVwcm9kdWNlcyB0aGVzZSBub3RpY2VzIGluIHRoZSBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLiAgIFN1YnN0YW50aWFsIG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBzb2Z0d2FyZSBtYXkgYmUKLWNvcHlyaWdodGVkIGJ5IHRoZWlyIGF1dGhvcnMgYW5kIG5lZWQgbm90IGZvbGxvdyB0aGUgbGljZW5zaW5nIHRlcm1zCi1kZXNjcmliZWQgaGVyZSwgcHJvdmlkZWQgdGhhdCB0aGUgbmV3IHRlcm1zIGFyZSBjbGVhcmx5IGluZGljYXRlZCBpbgotYWxsIGZpbGVzIHdoZXJlIHRoZXkgYXBwbHkuCi0KLUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IsIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEsIFRIRSAKLVVOSVZFUlNJVFkgT0YgVVRBSCBPUiBESVNUUklCVVRPUlMgT0YgVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgVE8gQU5ZCi1QQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLAotRVZFTiBJRiBUSEUgQVVUSE9SUyBPUiBBTlkgT0YgVEhFIEFCT1ZFIFBBUlRJRVMgSEFWRSBCRUVOIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotVEhFIEFVVEhPUiwgVEhFIFVOSVZFUlNJVFkgT0YgQ0FMSUZPUk5JQSwgQU5EIFRIRSBVTklWRVJTSVRZIE9GIFVUQUgKLVNQRUNJRklDQUxMWSBESVNDTEFJTSBBTlkgV0FSUkFOVElFUyxJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgCi1USEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCAKLVRIRSBBVVRIT1JTIEFORCBESVNUUklCVVRPUlMgSEFWRSBOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsCi1TVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCi0KLTwvcHJlPgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2NwcC5odCBiL3N3aWd3ZWIvY3BwLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTNiOWZjLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvY3BwLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLU5ldyBDKysgRmVhdHVyZXMKLQotPGgyPkRhdmUncyBNb3N0IERlc2lyZWQgQysrIEZlYXR1cmVzPC9oMj4KLQotSW4gd3JpdGluZyBTV0lHLCBJIGhhdmUgZGV2ZWxvcGVkIGEgd2hvbGUgbmV3IGFwcHJlY2lhdGlvbiBmb3IgdGhlCi1sYW5ndWFnZSB0aGF0IGlzIEMrKy4gIEhvd2V2ZXIsIEkgaGF2ZSBhbHNvIGNvbWUgdG8gZGlzY292ZXIgYSBudW1iZXIKLW9mIHNlcmlvdXMgbGltaXRhdGlvbnMgaW4gdGhlIGxhbmd1YWdlLiAgVGhlcmVmb3JlLCBpbiB0aGUgaW50ZXJlc3Qgb2YKLXB1YmxpYyBzZXJ2aWNlLCBJIG5vdyBwcmVzZW50IG15IHNlbWktb2ZmaWNpYWwgbGlzdCBvZiBDKysgZmVhdHVyZXMKLUkgd291bGQgbW9zdCBsaWtlIHRvIHNlZSBpbXBsZW1lbnRlZDoKLQotPHVsPgotPGxpPjxiPlRoZSBzbGlnaHRseSBhbWJpZ3VvdXMgcmVmZXJlbmNlLjwvYj4gVGhpcyB3b3VsZCBiZSBhIHZhcmlhdGlvbgotb24gdGhlIGV2ZXItc28tdXNlZnVsIEMrKyByZWZlcmVuY2UgKCZhbXA7KSB1c2VkIHRvIGRlbm90ZSBhIHF1YW50aXR5Ci10aGF0IHJlZmVycyB0byBlaXRoZXIgdGhlIG9iamVjdCBpdHNlbGYgKGJ5IHZhbHVlKSB0byBhIHJlZmVyZW5jZSB0bwotYW4gb2JqZWN0LiAgVGhlIHByZWZlcnJlZCBzeW50YXggZm9yIHRoaXMgaXMgdG8gZW5jbG9zZSB0aGUgdmFyaWFibGUKLW5hbWUgaW4gYnJhY2tldHMgYW5kIHVzZSB0aGUgYW1wZXJzYW5kIGxpa2UgdGhpcwotPHR0PiZsdDsmYW1wO2ZvbyZndDs8L3R0Pi4KLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotdm9pZCBmb28oQmFyIDwmYW1wO2I+KSB7Ci0gICAgYi5mcmFnKDMpOyAgICAgICAvLyBDYWxsIHNvbWUgbWV0aG9kICAKLSAgICAuLi4KLX0KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1JbiB0aGlzIGNhc2UsIDx0dD5mb288L3R0PiB3b3VsZCBlaXRoZXIgYmUgcGFzc2VkIGEgY29weSBvZiBhCi08dHQ+QmFyPC90dD4gdHlwZSAocGFzcyBieSB2YWx1ZSkgb3IgYSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcKLTx0dD5CYXI8L3R0Pi4gIFRoZSBwcmVjaXNlIGNob2ljZSwgb2YgY291cnNlLCB3b3VsZCBiZSB1cCB0byB0aGUKLWltcGxlbWVudGF0aW9uLiAgT2J2aW91c2x5LCB0aGUgY29tcGlsZXIgd291bGQgcGljayB0aGUgYmVzdAotb3B0aW9uLS1tYWtpbmcgaXQgYSBnb29kIGNob2ljZSBmb3IgcHJvZ3JhbW1lcnMgdG9vIHN0dXBpZCB0byBrbm93IHdoZXRoZXIKLXRoZXkgc2hvdWxkIHVzZSBhIHBvaW50ZXIgb3Igbm90LgotPHA+Ci1PYnZpb3VzbHksIHRoZXJlIGFyZSBhIGZldyBjb21wbGljYXRlZCBjYXNlcyBzdWNoIGFzOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci12b2lkIGZvbyhjb25zdCBCYXIgKmNvbnN0ICo8JmFtcDtiPik7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSB0byB0aGUgcmVhZGVyIChoZXksCi1pdCdzIGdvb2QgdG8gYmUgYSBwcm9mZXNzb3IpLgotCi08bGk+PHA+PGI+Q2lyY3VsYXIgc2hpZnQgb3BlcmF0b3JzLjwvYj4gU3VyZSwgb25lIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8KLWRvIGEgY2lyY3VsYXIgYml0IHNoaWZ0IHZlcnkgb2Z0ZW4sIGJ1dCB0aGV5IGFyZSBzb21ldGltZXMgdXNlZnVsIGluCi1jcnlwdG9ncmFwaGljIGFsZ29yaXRobXMgYW5kIGZvciBnZW5lcmFsLXB1cnBvc2UgYml0LXR3aWRkbGluZy4gIEkKLXByb3Bvc2UgdGhlIGluY2x1c2lvbiBvZiB0aGUgdHJpcGxlIGFuZ2xlIGJyYWNrZXQgb3BlcmF0b3JzCi0oPHR0PiZsdDsmbHQ7Jmx0OzwvdHQ+IGFuZCA8dHQ+Jmd0OyZndDsmZ3Q7PC90dD4pIGZvciB0aGlzIHB1cnBvc2UuICBPZgotY291cnNlLCB0aGVzZSBvcGVyYXRvcnMgY291bGQgYWxzbyBiZSBvdmVybG9hZGVkIGp1c3QgbGlrZSB0aGUgbm9ybWFsCi1zaGlmdCBvcGVyYXRvcnMuICBJdCdzIG5vdCB0aGF0IEkgcmVhbGx5IG5lZWQgdGhlc2Ugb3BlcmF0b3JzLCBidXQgaXQKLWlzIHlldCBhbm90aGVyIG9wcG9ydHVuaXR5IHRvIGluY2x1ZGUgbW9yZSBhbmdsZSBicmFja2V0cyBpbnRvIHRoZQotbGFuZ3VhZ2UuCi0KLTxsaT48cD48Yj5UaGUgc3Vydml2YWwgY2FzdC48L2I+ICBJJ20gbm90IHJlYWxseSBzdXJlIHdoZXJlIEkgZ290IHRoaXMgaWRlYSwKLWJ1dCBiYXNpY2FsbHkgaXQgd29ya3MgbGlrZSB0aGlzOiBnaXZlbiBhbiBvYmplY3QsIHlvdSBjYW4gY2FzdCBpdCB1c2luZwotYSA8dHQ+c3Vydml2YWxfY2FzdDwvdHQ+IGxpa2UgdGhpcyAgCi0KLTxibG9ja3F1b3RlPgotPHByZT4KLUJhciAqeCA9IHN1cnZpdmFsX2Nhc3QmbHQ7QmFyIComZ3Q7KHkpOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLUFmdGVyd2FyZHMsIHRoZSBvYmplY3QgdGhhdCA8dHQ+eDwvdHQ+IHBvaW50cyB0byBpcyBndWFyYW50ZWVkIHRvIGJlCi11bmRlbGV0YWJsZS0tZXZlbiBpZiBhIHByb2dyYW0gcmVwZWF0ZWRseSBjYWxscyA8dHQ+ZGVsZXRlPC90dD4gb3IKLTx0dD5mcmVlKCk8L3R0PiBvbiBpdC4gIFRoaXMgZWZmZWN0IGFwcGxpZXMgdG8gdGhlIG9iamVjdCBpdHNlbGYsIG5vdAotdGhlIHBvaW50ZXIgKHRodXMsIHRoZSBjYXN0IGltcGxpY2l0bHkgYXBwbGllcyB0byBhbGwgb3RoZXIgcG9pbnRlcnMgcmVmZXJyaW5nIHRvCi10aGUgc2FtZSBvYmplY3QpLiAgRnVydGhlcm1vcmUsIHRoZSBjYXN0IHJlbWFpbnMgaW4gZWZmZWN0IHVudGlsIHRoZQotcHJvZ3JhbSB0ZXJtaW5hdGVzLS1tYWtpbmcgdGhpcyBhIHBhcnRpY3VsYXJseSBnb29kIHdheSB0byBhdm9pZCB0aG9zZQotcGVza3kgbWVtb3J5IG1hbmFnZW1lbnQgcHJvYmxlbXMgc3VjaCBhcyBjYWxsaW5nIGRlbGV0ZSB0b28gbWFueSB0aW1lcwotYnkgYWNjaWRlbnQuCi0KLTxwPgotVGhlIHN1cnZpdmFsIGNhc3QgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudHMgb2YgYW4gYXJyYXkKLW9yIGNvbnRhaW5lci4gIEhvd2V2ZXIsIGluIHRoaXMgY2FzZSwgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgZW5zdXJlCi10aGF0IGRlbGV0aW9uIG9mIHRoZSBhcnJheSBvciBjb250YWluZXIgb25seSBkZWxldGVzIHRob3NlIG1lbWJlcnMgZm9yCi13aGljaCB0aGUgc3Vydml2YWwgY2FzdCBoYXMgbm90IGJlZW4gYXBwbGllZC4KLQotPHA+Ci1XaGVuIHRvbyBtYW55IG9iamVjdHMgaGF2ZSBiZWVuIGNhc3QgdXNpbmcgdGhlIHN1cnZpdmFsIGNhc3QsIHRoZXkgbWF5Ci1kZWNpZGUgdG8gc3BvbnRhbmVvdXNseSBkZWxldGUgdGhlbXNlbHZlcyBhbG9uZyB3aXRoIGFuIHVuc3BlY2lmaWVkCi1udW1iZXIgb2Ygbm9uLXN1cnZpdmFsIG9iamVjdHMuICBUaGlzIGlzIGEgZmVhdHVyZS4gIEhvd2V2ZXIsIHRoZQotcHJlY2lzZSBtZWNoYW5pc20gYW5kIHNjb3BlIG9mIGRlc3RydWN0aW9uIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCi1hbmQgbWF5IGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBvYmplY3RzIHRvIHdoaWNoIHRoZSBzdXJ2aXZhbCBjYXN0IGhhcwotYmVlbiBhcHBsaWVkLgotCi08bGk+PHA+PGI+VGhlIG5vbi1jYXN0YWJsZSBmdW5jdGlvbiBwb2ludGVyPC9iPi4gIFNpbmNlIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZQotdG9vIGNvbmZ1c2luZyBmb3IgZXZlcnlvbmUsIGl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIGNhc3QgdGhlbSBpbnRvIGFueQotb3RoZXIgdHlwZS4gIE9oIHdhaXQsIHRoaXMgaXMgYWxyZWFkeSBhIEMrKyBmZWF0dXJlLgotCi08bGk+PHA+PGI+VGhlIGlkZW50aWZpZXIgbGVuZ3RoIGNhc3Q8L2I+LiAgU2luY2Ugd2UncmUgb24gdGhlIHN1YmplY3Qgb2YgY2FzdGluZy4uLi4gIEkgd291bGQKLWFsc28gbGlrZSB0byBwcm9wb3NlIHRoZSBpZGVudGlmaWVyIGxlbmd0aCBjYXN0LiAgVGhpcyBpcyBhIGNhc3QgdGhhdCBvbmx5IHdvcmtzCi1pZiB0aGUgaWRlbnRpZmllciBuYW1lcyBvZiB0aGUgdHdvIHR5cGVzIGFyZSBleGFjdGx5IHRoZSBzYW1lIGxlbmd0aCBpbiAKLWNoYXJhY3RlcnMuICBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotQmFyICp4ID0gaWRlbnRpZmllcl9sZW5ndGhfY2FzdCZsdDtGb28gKiZndDsoeSk7ICAgICAvLyBPawotRm9vQmFyICp4ID0gaWRlbnRpZmllcl9sZW5ndGhfY2FzdCZsdDtGb28gKiZndDsoeSk7ICAvLyBFcnJvcgotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLUluIGFkZGl0aW9uLCB0aGVyZSBzaG91bGQgYmUgYW4gPHR0PmlkZW50aWZpZXJfY2FzZV9jYXN0PC90dD4gdGhhdCB3b3JrcyBzaW1pbGFybHksIGJ1dAotd2hpY2ggbG9va3MgYXQgdGhlIGNhc2Ugb2YgdGhlIHR5cGUgbmFtZXMuICAgSSdtIG5vdCByZWFsbHkgc3VyZSB3aGF0IHB1cnBvc2UgdGhlc2UgY2FzdHMKLXdvdWxkIHNlcnZlLCBidXQgdGhhdCBkb2Vzbid0IHJlYWxseSBkaXN0aW5ndWlzaCB0aGVtIGZyb20gYW55IG9mIHRoZSBvdGhlciBjYXN0cy4KLSAKLTxsaT48cD48Yj5UaGUgaW5zdGFuY2UgZ290bzwvYj4uICBJbiBhIG51dHNoZWxsLCBJIHJlYWxseSB3YW50IHRvIGJlIGFibGUgdG8gZG8KLXRoaXM6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLWNsYXNzIEZvbyB7Ci1wdWJsaWM6Ci0gICAuLi4KLSAgIGJhcjoKLSAgICAgIHByaW50ZigiSGVsbG8gd29ybGRcbiIpOwotICAgICAgLi4uIHNvbWUgY29kZSBoZXJlIC4uLgotICAgICAgYnJlYWs7Ci19OwotCi1pbnQgbWFpbigpIHsKLSAgICBGb28gKmYgPSBuZXcgRm9vOwotICAgIGdvdG8gZi5iYXI7Ci0gICAgLi4uCi19Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLU9idmlvdXNseSwgdGhlIGJlbmVmaXRzIG9mIHRoaXMgZmVhdHVyZSBhcmUgc2VsZi1ldmlkZW50LiAgSG93ZXZlciwKLXRoZXJlIGFyZSBzdGlsbCBhIGZldyB0cmlja3kgcG9pbnRzLiAgRmlyc3QsIHRoZSBnb3RvIHNob3VsZCB3b3JrIHdpdGgKLWluaGVyaXRhbmNlIHdoZW4gdGhlIGdvdG8gbGFiZWwgaGFwcGVucyB0byBhcHBlYXIgaW4gYSBiYXNlLWNsYXNzLiAgU2Vjb25kLAotdGhlIGdvdG8gc2hvdWxkIGNlcnRhaW5seSB0YWtlIGFkdmFudGFnZSBvZiBkeW5hbWljIGJpbmRpbmcgbXVjaCBsaWtlIHZpcnR1YWwKLW1lbWJlciBmdW5jdGlvbnMuICAgRmluYWxseSwgSSBiZWxpZXZlIHRoYXQgdGhlcmUgd291bGQgYmUgbWFueSBpbnRlcmVzdGluZwotcG9zc2liaWxpdGllcyBvZiBjb21iaW5pbmcgdGVtcGxhdGUgY2xhc3NlcyB3aXRoIGdvdG8uICBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotdGVtcGxhdGUgY2xhc3MgRm9vJmx0O3gmZ3Q7IHsKLXB1YmxpYzoKLSAgICB4OiAKLSAgICAgICAgLi4uIHNvbWUgY29kZSBoZXJlIC4uLgotICAgICAgICBicmVhazsKLSAgICAuLi4KLX07Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotQ2xlYXJseSwgdGhlIG51bWJlciBvZiBhcHBsaWNhdGlvbnMgaXMgZW5kbGVzcy4KLQotPGxpPjxwPjxiPk1QMyBwbGF5ZXI8L2I+LiAgIFNpbmNlIGNvbXBpbGluZyBhIEMrKyBhcHBsaWNhdGlvbiB0YWtlcyBzbyBsb25nLCBJIHRoaW5rCi1pdCB3b3VsZCBiZSB1c2VmdWwgdG8gbW9kaWZ5IHRoZSBDKysgY29tcGlsZXIgdG8gZ28gb3V0IGFuZCBzZWFyY2ggdGhlIG5ldCBmb3IgYW4KLWFwcHJvcHJpYXRlIHN5bXBob255IG9yIHNvbmF0YSB0byBkb3dubG9hZCBhbmQgcGxheSB3aGlsZSBpdCBpcyB3b3JraW5nLiBBaGhoaC4gWWVzLgotT2YgY291cnNlLCBpZiB5b3UgaGF2ZSBhIERWRCBwbGF5ZXIgaGFuZHksIEkgaGF2ZSBwZXJzb25hbGx5IGZvdW5kIHRoYXQgd2F0Y2hpbmcgIkFwb2NhbHlwc2UgTm93IgotaXMgYSByZWxheGluZyB3YXkgdG8gcGFzcyB0aGUgdGltZS4KLQotPC91bD4KLQotSGF2ZSBhIGZ1cnRoZXIgZmVhdHVyZSBzdWdnZXN0aW9uPyAgUGxlYXNlIGxldCBtZSBrbm93LgotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9jdnMuaHQgYi9zd2lnd2ViL2N2cy5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1YjZiOC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2N2cy5odAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi1TV0lHIENWUwotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvY3ZzLnBuZyIgYWx0PSJDVlMiPgotCi08cD4KLURldmVsb3BtZW50IHZlcnNpb25zIG9mIFNXSUcgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBDVlMgc2VydmVyIGxvY2F0ZWQgYXQgU291cmNlRm9yZ2UuCi0KLTxoMz4gRGlzY2xhaW1lciA8L2gzPgotCi1UaGUgQ1ZTIHJlbGVhc2UgcmVwcmVzZW50cyB3b3JrIGluIHByb2dyZXNzIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb21waWxlIG9uIHlvdXIgbWFjaGluZSBvciBiZSBmdW5jdGlvbmFsIGluIGFueQotbWFubmVyLiAKLQotPGgzPiBSZXF1aXJlZCBUb29scyA8L2gzPgotCi1UbyBjb21waWxlIFNXSUcgZnJvbSBpdHMgQ1ZTIHJlcG9zaXRvcnksIHlvdSB3aWxsIG5lZWQgdGhlIGZvbGxvd2luZyB0b29sczoKLQotPHVsPgotPGxpPiBBdXRvY29uZiAyLjU4IG9yIGhpZ2hlcgotPGxpPiBBdXRvbWFrZSAxLjcuMiBvciBoaWdoZXIKLTxsaT4gQSB3b3JraW5nIEMrKyBjb21waWxlci4KLTxsaT4geWFjYyBvciBiaXNvbiAodG8gY29tcGlsZSB0aGUgU1dJRyBwYXJzZXIpLiAgCi08L3VsPgotCi08cD4KLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIENWUyByZXBvc2l0b3J5IGRvZXMgbm90IGluY2x1ZGUgdGhlIEMrKyBjb2RlIAotZ2VuZXJhdGVkIGJ5IHlhY2Mgbm9yIHRoZSBmaWxlcyBwcm9kdWNlZCBieSBBdXRvY29uZiBvciBBdXRvbWFrZSAodGhlc2UKLWFyZSBob3dldmVyIGluY2x1ZGVkIGluIGEgbm9ybWFsIHJlbGVhc2UpLiBUaHVzLCB5b3Ugd2lsbCBoYXZlCi10byBpbnN0YWxsIHRoZXNlIHRvb2xzIG9uIHlvdXIgbWFjaGluZSBmb3IgZXZlcnl0aGluZyB0byB3b3JrLgotCi08aDM+VG8gY2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiA8L2gzPgotVGhlcmUgYXJlCi08YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L2N2cy8/Z3JvdXBfaWQ9MTY0NSI+Z2VuZXJpYyBDVlMgaW5zdHJ1Y3Rpb25zPC9hPgotYXZhaWxhYmxlIG9uIHRoZSBTb3VyY2VGb3JnZSBzaXRlLCBidXQgdGhlIHN0ZXBzIGJlbG93IHNob3VsZCBiZSBhbGwgeW91IG5lZWQuCi1UaGUgaW5zdHJ1Y3Rpb25zIGJlbG93IGFyZSBmb3IgdGhvc2Ugd2hvIGhhdmUgcmVhZCBvbmx5IGFjY2VzcyBmb3IgY3ZzLCBkZXZlbG9wZXJzIHNob3VsZAotY29uc3VsdCB0aGUgZ2VuZXJpYyBDVlMgaW5zdHJ1Y3Rpb25zIGFib3ZlLgotCi08b2w+Ci08bGk+PHA+IFNldCB0aGUgbG9jYXRpb24gb2YgQ1ZTUk9PVAotCi08cHJlPgotICUgc2V0ZW52IENWU1JPT1QgOnBzZXJ2ZXI6YW5vbnltb3VzQGN2cy5zb3VyY2Vmb3JnZS5uZXQ6L2N2c3Jvb3Qvc3dpZyA8L3ByZT4KLTxwPgotKEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSAtZCBvcHRpb24gdG8gQ1ZTKQotCi08bGk+PHA+IExvZyBpbnRvIHRoZSBjdnMgc2VydmVyIGJ5IGlzc3VpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi08cHJlPgotJSBjdnMgbG9naW4KLUNWUyBwYXNzd29yZDogJmx0O3ByZXNzIGVudGVyIGhlcmUmZ3Q7Ci08L3ByZT4KLQotPGxpPjxwPlRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBTV0lHIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcKLQotPHByZT4KLSUgY3ZzIGNoZWNrb3V0IFNXSUcKLTwvcHJlPgotCi08bGk+PHA+VG8gYnVpbGQgdGhlIHN5c3RlbSwgZm9sbG93IHRoZXNlIHN0ZXBzCi0KLTxwcmU+Ci0lIGNkIFNXSUcKLSUgLi9hdXRvZ2VuLnNoCi0lIC4vY29uZmlndXJlIC0tcHJlZml4PS9zb21lL2RpcmVjdG9yeQotJSBtYWtlCi0lIG1ha2UgaW5zdGFsbAotPC9wcmU+Ci0KLTxsaT48cD5UbyBjaGVjayB0aGUgYnVpbGQsIHJ1biB0aGUgdGVzdHM6Ci0KLTxwcmU+Ci0lIG1ha2UgLWsgY2hlY2sgPC9wcmU+Ci1UaGlzIGNvdWxkIHRha2UgdXAgdG8gYW4gaG91ciBvciBsb25nZXIuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UsCi1qdXN0IGNoZWNrIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGV4YW1wbGUsIHRoZSBQeXRob24gdGVzdHM6Ci08cHJlPgotJSBtYWtlIGNoZWNrLXB5dGhvbi1leGFtcGxlcwotJSBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCi08L3ByZT4KLQotPC9vbD4KLQotPGI+Tm90ZTo8L2I+IFRoZSBDVlMgcmVwb3NpdG9yeSBpcyByZWFkLW9ubHkgc28gdGhlIHN5c3RlbSB3aWxsIG5vdCAKLWFjY2VwdCBjb2RlIG1vZGlmaWNhdGlvbnMgdW5sZXNzIHlvdSBhcmUgYSBkZXZlbG9wZXIuCi0KLTxoMz4gQnVpbGQgSXNzdWVzIDwvaDM+Ci1IZXJlIGFyZSBzb21lIGd1aWRlbGluZXMgc2hvdWxkIHlvdSBiZSBleHBlcmllbmNpbmcgcHJvYmxlbXMgYnVpbGRpbmcgU1dJRyBmcm9tIENWUy4KLQotPG9sPgotCi08bGk+Q2hlY2sgdGhhdCB5b3UgaGF2ZSBhIGNvbXBsZXRlIHVwZGF0ZSBmcm9tIHRoZSBTV0lHIENWUyByZXBvc2l0b3J5LiAKLUEgZnJlc2ggY2hlY2tvdXQgZnJvbSBDVlMgb2Z0ZW4gc29sdmVzIGJ1aWxkIHByb2JsZW1zLgotPC9saT4KLQotPGxpPgotTWFrZSBzdXJlIHlvdSBoYXZlIHJ1biA8dHQ+Li9hdXRvZ2VuLnNoPC90dD4gYW5kIDx0dD4uL2NvbmZpZ3VyZTwvdHQ+LgotQm90aCB0aGVzZSBzdGVwcyB3aWxsIGJlIG5lY2Vzc2FyeSBpZiB5b3UgaGF2ZSBhIGZyZXNoIENWUyBjaGVja291dCBvciBpZiB0aGUgYnVpbGQgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgaGF2ZSBjaGFuZ2VkIHNpbmNlIGEgcHJldmlvdXMgdXBkYXRlLgotPC9saT4KLQotPGxpPgotQ2hlY2sgdGhhdCB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbnMgb2YgeW91ciBhdXRvdG9vbHMgKEF1dG9jb25mIGFuZCBBdXRvbWFrZSkgYXJlIGluc3RhbGxlZCBwcm9wZXJseS4gCi1UaGUgYXV0b3Rvb2xzIGFyZSBpbiBhIHN0YXRlIG9mIGZsdXggYW5kIHRoZXJlIGFyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aGljaCBhcmUgc29sdmVkIGluIGRpZmZlcmVudCB3YXlzIG9uIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtcy4KLTwvbGk+Ci0KLTxsaT4KLUNoZWNrIHRoYXQgYWxsIHRoZSBhdXRvdG9vbCBib290c3RyYXAgcHJvZ3JhbXMgd2hpY2ggYXJlIGV4ZWN1dGVkIHdoZW4gcnVubmluZyA8dHQ+Li9hdXRvZ2VuLnNoPC90dD4gYXJlIHVwIHRvIGRhdGUgYW5kIG1hdGNoIHlvdXIgaW5zdGFsbGVkIGF1dG90b29sIHZlcnNpb25zLgotRm9yIGV4YW1wbGUgPHR0PmFjbG9jYWwgLS12ZXJzaW9uPC90dD4gc2hvdWxkIHJlcG9ydCBhIG1hdGNoaW5nIHZlcnNpb24gb2YgQXV0b21ha2Ugb3IgQXV0b2NvbmYsIHNvbWV0aGluZyBsaWtlICJhY2xvY2FsIChHTlUgYXV0b21ha2UpIDEuNy42Ii4KLTwvbGk+Ci08L29sPgotCi1JZiB5b3UgYXJlIHN0aWxsIGhhdmluZyBwcm9ibGVtcywgc2VuZCBhbiBlbWFpbCB0byA8YSBocmVmPSJtYWlsLmh0bWwiPnN3aWctZGV2ZWw8L2E+IG1haWxpbmcgbGlzdC4KLQotPGgzPkRldmVsb3BlciBBY2Nlc3M8L2gzPgotCi1XZSBhcmUgYWx3YXlzIGxvb2tpbmcgZm9yIHBlb3BsZSB0byBoZWxwIG91dCB3aXRoIHZhcmlvdXMgcHJvamVjdHMuIAotCi08dWw+Ci08bGk+PHA+IFNlbmQgZW1haWwgdG8gdG8gdGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+c3dpZy1kZXZlbDwvYT4gbWFpbGluZyBsaXN0LgotaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGRvaW5nIGRldmVsb3BlciB3b3JrIGFuZCBnYWluaW5nIHdyaXRlIGFjY2VzcyB0byB0aGUgQ1ZTIHJlcG9zaXRvcnkuCi0KLTxsaT48cD4gVGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+c3dpZy1kZXZlbDwvYT4gbWFpbGluZyBsaXN0IGlzIHRoZSBkZXZlbG9wZXIgbWFpbGluZyBsaXN0Ci1hbmQgc2hvdWxkIGJlIHVzZWQgdG8gZGlzY3VzcyBjb2RpbmcgaXNzdWVzLCBidWdzLCBwYXRjaGVzLCBhbmQgc28gZm9ydGguICAKLVN1YnNjcmlwdGlvbiBpbmZvcm1hdGlvbiBhbmQgYXJjaGl2ZXMgb2YgcmVjZW50IGFjdGl2aXR5IGNhbiBiZSBmb3VuZCBvbiB0aGUgPGEgaHJlZj0ibWFpbC5odG1sIj5tYWlsaW5nIGxpc3RzPC9hPiBwYWdlLgotPC91bD4KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2RlZmF1bHQuY29ybmVyIGIvc3dpZ3dlYi9kZWZhdWx0LmNvcm5lcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxMmU4Mi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2RlZmF1bHQuY29ybmVyCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08Y2VudGVyPgotPGltZyBzcmM9ImltYWdlcy9zd2lnMTcucG5nIiBhbHQ9IlNXSUcgaW1hZ2UiPgotPC9jZW50ZXI+CmRpZmYgLS1naXQgYS9zd2lnd2ViL2RlZmF1bHQuZm9vdGVyIGIvc3dpZ3dlYi9kZWZhdWx0LmZvb3RlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0NDQ1OC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2RlZmF1bHQuZm9vdGVyCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08aHI+Ci1GZWVkYmFjayBhbmQgcXVlc3Rpb25zIGNvbmNlcm5pbmcgdGhpcyBzaXRlIHNob3VsZCBiZSBwb3N0ZWQgdG8gdGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+c3dpZy1kZXZlbDwvYT4gbWFpbGluZyBsaXN0LgotCi08cD4KLUxhc3QgbW9kaWZpZWQgOiAkbXRpbWUKLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9kZWZhdWx0Lmh0bWwgYi9zd2lnd2ViL2RlZmF1bHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyOWY2Ny4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2RlZmF1bHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08dGl0bGU+JHRpdGxlPC90aXRsZT4KLTxib2R5ICBiZ2NvbG9yPSIjZmZmZmZmIiBsaW5rPSIjMDAwMGZmIiB2bGluaz0iIzgwMDBmZiI+Ci0KLTx0YWJsZSB3aWR0aD03ODAgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIHN1bW1hcnk9Ik1haW4gd2ViIHBhZ2UiPgotPHRyPgotICA8dGQgdmFsaWduPW1pZGRsZSBiZ2NvbG9yPSIjMDAwMDAwIj4KLSAgICAgIDx0YWJsZSB3aWR0aD0xODAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIHN1bW1hcnk9IkNvcm5lciBzZWN0aW9uIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICA8dGQ+Ci0kY29ybmVyCi0gICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICA8L3RkPgotICAgPHRkIHZhbGlnbj1taWRkbGUgYmdjb2xvcj0iI2UwZTBlMCI+Ci0gICAgICAgPHRhYmxlIHdpZHRoPTYwMCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgc3VtbWFyeT0iVG9wIHNlY3Rpb24iPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICA8dGQgdmFsaWduPW1pZGRsZT4KLSR0b3AKLSAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgPC90YWJsZT4KLSAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0iI2UwZTBlMCI+Ci0gICAgICAgPHRhYmxlIHdpZHRoPTE4MCBzdW1tYXJ5PSJTaWRlIHNlY3Rpb24iPgotICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICA8dGQ+Ci0kc2lkZQotICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgPC90cj4KLSAgICAgICA8L3RhYmxlPgotICAgPC90ZD4KLSAgIDx0ZCB2YWxpZ249dG9wPgotICAgICAgIDx0YWJsZSB3aWR0aD02MDAgc3VtbWFyeT0iV2ViIHBhZ2UgYm9keSI+Ci0gICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotJGJvZHkKLQotJGZvb3RlcgotICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICA8L3RhYmxlPgotICAgPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08L2JvZHk+Ci08L2h0bWw+Ci0gCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2RlZmF1bHQuc2lkZSBiL3N3aWd3ZWIvZGVmYXVsdC5zaWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmY0Y2VmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvZGVmYXVsdC5zaWRlCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPHRhYmxlIHdpZHRoPSIxMDAlIiBzdW1tYXJ5PSJTaWRlIHNlY3Rpb24gbGlua3MiPgotPHRyPgotPHRkIGJnY29sb3I9IiMwMDAwMDAiIGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+PGI+SW5mb3JtYXRpb248L2I+PC9mb250PjwvdGQ+Ci08L3RyPgotPHRyPjx0ZD48YSBocmVmPSJleGVjLmh0bWwiPldoYXQgaXMgU1dJRz88L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJjb21wYXQuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9ImNvbXBhcmUuaHRtbCI+RmVhdHVyZXM8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJ0dXRvcmlhbC5odG1sIj5UdXRvcmlhbDwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9ImRvYy5odG1sIj5Eb2N1bWVudGF0aW9uPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iY3ZzLmh0bWwiPlRoZSBCbGVlZGluZyBFZGdlPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaGlzdG9yeS5odG1sIj5IaXN0b3J5PC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0ic3VidmVyc2lvbi5odG1sIj5TdWJ2ZXJzaW9uPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iZ3VpbHR5Lmh0bWwiPkd1aWx0eSBQYXJ0aWVzPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0icHJvamVjdHMuaHRtbCI+QWNjZXNzb3JpZXM8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJjb3B5cmlnaHQuaHRtbCI+TGVnYWwgRGVwYXJ0bWVudDwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9ImxpbmtzLmh0bWwiPkxpbmtzPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0ic3VydmV5Lmh0bWwiPkRvd25sb2FkPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5kYWJlYXouY29tL2NnaS1iaW4vd2lraS5wbCI+U3dpZ1dpa2k8L2E+PC90ZD48L3RyPgotCi08dHI+PHRkIGJnY29sb3I9IiMwMDAwMDAiIGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+PGI+RXhpdHM8L2I+PC9mb250PjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5mcmFuei5jb20vcHJvZHVjdHMvYWxsZWdyb2NsIj5BbGxlZ3JvQ0w8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm1vbm8tcHJvamVjdC5jb20vIj5DIyAtIE1vbm88L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL25ldGZyYW1ld29yayI+QyMgLSBNUyAuTkVUPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL2NvbW1vbi1saXNwLm5ldC9wcm9qZWN0L2NmZmkiPkNGRkk8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmNhbGwtd2l0aC1jdXJyZW50LWNvbnRpbnVhdGlvbi5vcmcvY2hpY2tlbi5odG1sIj5DSElDS0VOPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL2NsaXNwLmNvbnMub3JnIj5DTElTUDwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9ndWlsZS9ndWlsZS5odG1sIj5HdWlsZTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20iPkphdmE8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPkx1YTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cucGx0LXNjaGVtZS5vcmcvc29mdHdhcmUvbXpzY2hlbWUvIj5NelNjaGVtZTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub2NhbWwub3JnLyI+T2NhbWw8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnBlcmwuY29tIj5QZXJsPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5waHAubmV0Ij5QSFA8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmciPlB5dGhvbjwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cucnVieS1sYW5nLm9yZyI+UnVieTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudGNsLnRrIj5UY2wvVGs8L2E+PC90ZD48L3RyPgotCi0KLTx0cj48dGQgYmdjb2xvcj0iIzAwMDAwMCIgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPSIjZmZmZmZmIj48Yj5PdXIgR2VuZXJvdXMgSG9zdDwvYj48L2ZvbnQ+PC90ZD48L3RyPgotPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldCI+PGltZyBzcmM9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvaW1hZ2VzL3NmbG9nbzItc3RlZWwucG5nIiB2c3BhY2U9IjAiIGJvcmRlcj0wIGFsdD0iU291cmNlRm9yZ2UgbG9nbyI+PC9BPjwvdGQ+PC90cj4KLTwvdGFibGU+Ci0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9kZWZhdWx0LnRvcCBiL3N3aWd3ZWIvZGVmYXVsdC50b3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjM0ZTguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9kZWZhdWx0LnRvcAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0wIGJvcmRlcj0wIHN1bW1hcnk9IlRvcCBzZWN0aW9uIGxpbmtzIj4KLTx0cj4KLTx0ZD48YSBocmVmPSJpbmRleC5odG1sIj5Ib21lPC9hPjwvdGQ+Ci08dGQ+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0Lz9ncm91cF9pZD0xNjQ1Ij5EZXZlbG9wbWVudDwvYT48L3RkPgotPHRkPjxhIGhyZWY9Im1haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT48L3RkPgotPHRkPjxhIGhyZWY9ImJ1Z3MuaHRtbCI+QnVncyBhbmQgUGF0Y2hlczwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9zd2lnd2ViL2RvYy5odCBiL3N3aWd3ZWIvZG9jLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWUxOThiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvZG9jLmh0CisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotU1dJRyBEb2N1bWVudGF0aW9uLCBQcmVzZW50YXRpb25zLCBhbmQgUGFwZXJzCi0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvZG9jLnBuZyIgYWx0PSJEb2N1bWVudGF0aW9uIj4KLQotPEgzPlNXSUctMS4zPC9oMz4KLTx1bD4KLQotPGxpPiA8YSBocmVmPSJEb2MxLjMvaW5kZXguaHRtbCI+RGV2ZWxvcG1lbnQgRG9jdW1lbnRhdGlvbjwvYT4gZm9yIGxhdGVzdCByZWxlYXNlLgotPC91bD4KLQotPGgzPlNXSUctMS4xPC9oMz4KLTx1bD4KLTxsaT4gPGEgaHJlZj0iRG9jMS4xL0hUTUwvQ29udGVudHMuaHRtbCI+T25saW5lIFVzZXJzIE1hbnVhbDwvYT4uCi08bGk+IEFsc28gYXZhaWxhYmxlIGluIDxhIGhyZWY9IkRvYzEuMS9QREYvU1dJR01hbnVhbC5wZGYiPlBERjwvYT4gKDMxOCBwYWdlcykuCi08L3VsPgotCi08aDM+IE9ubGluZSBQYXBlcnMgYWJvdXQgU1dJRyA8L2gzPgotCi08dWw+Ci08bGk+IDxiPjxhIGhyZWY9InBhcGVycy9QZXJsOTgvc3dpZ3BlcmwuaHRtIj5QZXJsIEV4dGVuc2lvbiBCdWlsZGluZyB3aXRoIFNXSUc8L2E+PC9iPi4KLVRoaXMgcGFwZXIsIHByZXNlbnRlZCBhdCB0aGUgMTk5OCBPJ1JlaWxseSBQZXJsIENvbmZlcmVuY2UsIGRlc2NyaWJlcyB0aGUgdXNlCi1vZiBTV0lHIHdpdGggUGVybDUgYW5kIGNvdmVycyBtYW55IGFkdmFuY2VkIHRvcGljcy4KLVsgPGEgaHJlZj0icGFwZXJzL1Blcmw5OC9zd2lncGVybC5wZGYiPlBERjwvYT4gXS4gPGJyPgotCi08bGk+PHA+IDxiPjxhIGhyZWY9InBhcGVycy9UY2w5OC9UY2xDaGFwLmh0bWwiPlRjbCBhbmQgU1dJRyBhcyBhIEMvQysrIERldmVsb3BtZW50IFRvb2w8L2E+PC9iPi4KLU9yaWdpbmFsbHkgd3JpdHRlbiBhcyBhIGRyYWZ0IGZvciBhIGJvb2sgY2hhcHRlciwgdGhpcyBwYXBlciBwcm92aWRlcyBhbiBvdmVydmlldyBvZgotdXNpbmcgVGNsIGFuZCBTV0lHLiBJdCBhbHNvIGFwcGVhcnMgb24gdGhlIENELVJPTSBhY2NvbXBhbnlpbmcgIlRjbC9UayBmb3IgUmVhbCBQcm9ncmFtbWVycyIKLWJ5IENsaWYgRmx5bnQuPGJyPgotCi08bGk+PHA+IDxiPjxhIGhyZWY9InBhcGVycy9UY2w5Ni90Y2w5Ni5odG1sIj5TV0lHIDogQW4gRWFzeSB0byBVc2UgVG9vbCBmb3IgSW50ZWdyYXRpbmcgU2NyaXB0aW5nIExhbmd1YWdlcyB3aXRoIEMgYW5kIEMrKzwvYT48L2I+LgotV2hpbGUgYSBsaXR0bGUgZGF0ZWQsIHRoaXMgaXMgdGhlIGZpcnN0IFNXSUcgcGFwZXIuIFByZXNlbnRlZCBhdAotdGhlIDR0aCBUY2wvVGsgV29ya3Nob3AsIE1vbnRlcmV5LCBDYWxpZm9ybmlhLCBKdWx5IDYtMTAsIDE5OTYuICAgQWxzbyBhdmFpbGFibGUKLWZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy51c2VuaXgub3JnL3B1YmxpY2F0aW9ucy9saWJyYXJ5L3Byb2NlZWRpbmdzL3RjbDk2L2JlYXpsZXkuaHRtbCI+VVNFTklYPC9hPi4gPGJyPgotCi08bGk+PHA+IDxiPjxhIGhyZWY9InBhcGVycy9QeTk2L3B5dGhvbjk2Lmh0bWwiPlVzaW5nIFNXSUcgdG8gQ29udHJvbCwgUHJvdG90eXBlLCBhbmQgRGVidWcKLUMgUHJvZ3JhbXMgd2l0aCBQeXRob248L2E+PC9iPi4gIFByZXNlbnRlZCBhdCB0aGUgNHRoIEludGVybmF0aW9uYWwgUHl0aG9uIENvbmZlcmVuY2UsCi1MaXZlcm1vcmUsIENhbGlmb3JuaWEsIEp1bmUsIDE5OTYuICA8YnI+Ci0KLTxsaT4gPGI+PGEgaHJlZj0icGFwZXJzL1B5OTcvYmVhemxleS5odG1sIj5GZWVkaW5nIGEgTGFyZ2Utc2NhbGUgUGh5c2ljcyBBcHBsaWNhdGlvbiB0byBQeXRob248L2E+PC9iPi4gIFByZXNlbnRlZCBhdCB0aGUgNnRoIEludGVybmF0aW9uYWwgUHl0aG9uIENvbmZlcmVuY2UsIFNhbiBKb3NlLCBDYWxpZm9ybmlhLiAKLU9jdG9iZXIgMTQtMTcsIDE5OTcuICAgVGhpcyBwYXBlciBkZXNjcmliZXMgdGhlIHVzZSBvZiBQeXRob24vU1dJRyB3aXRoIGEgaGlnaC1wZXJmb3JtYW5jZQotcGh5c2ljcyBhcHBsaWNhdGlvbi4gIFRoaXMgYXBwbGljYXRpb24gd2FzIGEgcnVubmVyLXVwIGluIHRoZSAxOTk4Ci1Hb3Jkb24tQmVsbCBwcml6ZSBmb3IgYWNoaWV2aW5nIDEwIEdmbG9wcyBzdXN0YWluZWQgcGVyZm9ybWFuY2Ugb24gdGhlIAotPGEgaHJlZj0iaHR0cDovL2xva2ktd3d3LmxhbmwuZ292L3BhcGVycy9zYzk4LyI+QXZhbG9uPC9hPiBMaW51eAotQ2x1c3RlciBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkuIDxicj4KLQotPC91bD4KLQotPGgzPiBUdXRvcmlhbHMgYWJvdXQgU1dJRyA8L2gzPgotCi08dWw+Ci08bGk+IDxiPjxhIGhyZWY9InBhcGVycy9QeVR1dG9yaWFsOTgvUHlUdXRvcmlhbDk4LnBkZiI+SW50ZXJmYWNpbmcgQy9DKysgYW5kIFB5dGhvbiB3aXRoIFNXSUc8L2E+PC9iPiAoUERGKS4KLUhhbGYtZGF5IHR1dG9yaWFsIHByZXNlbnRlZCBhdCB0aGUgN3RoIEludGVybmF0aW9uYWwgUHl0aG9uIENvbmZlcmVuY2UsIE5vdmVtYmVyLCAxOTk4LiA8YnI+Ci0KLTxsaT48cD4gPGI+PGEgaHJlZj0icGFwZXJzL1B5VHV0b3JpYWw5Ny9QeVR1dG9yaWFsOTcucGRmIj5JbnRlcmZhY2luZyBDL0MrKyBhbmQgUHl0aG9uIHdpdGggU1dJRzwvYT48L2I+IChQREYpLgotSGFsZi1kYXkgdHV0b3JpYWwgcHJlc2VudGVkIGF0IHRoZSA2dGggSW50ZXJuYXRpb25hbCBQeXRob24gQ29uZmVyZW5jZSwgT2N0b2JlciwgMTk5Ny4gPGJyPgotCi08bGk+PHA+IDxiPjxhIGhyZWY9InBhcGVycy9UY2xUdXRvcmlhbDk4L1RjbFR1dG9yaWFsOTgucGRmIj5UY2wgRXh0ZW5zaW9uIEJ1aWxkaW5nIHdpdGggU1dJRzwvYT48L2I+IChQREYpLiAgIFR1dG9yaWFsIHByZXNlbnRlZCBhdCB0aGUgMTk5OCBUY2wvVGsgQ29uZmVyZW5jZS4gPGJyPgotPC91bD4KLQotPGgzPiBPdGhlciBSZXNvdXJjZXMgPC9oMz4KLQotPHVsPgotPGxpPiBQZXJsIHVzZXJzIGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgU1dJRyBpbiB0aGUgTydSZWlsbHkgYm9vayAKLTxhIGhyZWY9Imh0dHA6Ly93d3cub3JhLmNvbS9jYXRhbG9nL2FkdnBlcmwiPiJBZHZhbmNlZCBQZXJsIFByb2dyYW1taW5nIjwvYT4uIDxicj4KLQotPGxpPjxwPiBEYW5pZWwgQmxlemVrIHdyb3RlIGFuIGFydGljbGUgYWJvdXQgU1dJRyBpbiB0aGUgTm92ZW1iZXIsIDE5OTggaXNzdWUKLW9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmN1ai5jb20vYXJjaGl2ZS8xNjExL2luZGV4Lmh0bWwiPkMvQysrIFVzZXJzIEpvdXJuYWw8L2E+LgotCi08bGk+PHA+QW4gYXJ0aWNsZSBhYm91dCBTV0lHIGFwcGVhcmVkIGluIHRoZSBGZWJydWFyeSwgMTk5OCBpc3N1ZSAKLW9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGRqLmNvbS9kZGovMTk5OC8xOTk4XzAyL2luZGV4Lmh0bSI+RHIuIERvYmIncyBKb3VybmFsPC9hPiBvbgotU2NyaXB0aW5nIGFuZCBBbHRlcm5hdGl2ZSBMYW5ndWFnZXMuIDxicj4KLQotPGxpPjxwPlNjb3R0IEJvbHRlIHdyb3RlIGFuIGFydGljbGUgYWJvdXQgU1dJRyBpbiB0aGUgV2ludGVyLCAxOTk3IGlzc3VlIG9mIAotPGEgaHJlZj0iaHR0cDovL3d3dy50cGouY29tIj5UaGUgUGVybCBKb3VybmFsPC9hPi4gPGJyPgotCi0KLTxsaT48cD4gSm9obiBPdXN0ZXJob3V0J3MgPGEgaHJlZj0iaHR0cDovL2hvbWUucGFjYmVsbC5uZXQvb3VzdGVyL3NjcmlwdGluZy5odG1sIj4KLXBhcGVyIDwvYT4gb24gc2NyaXB0aW5nIGxhbmd1YWdlcyBwcm92aWRlcyBhIGdvb2QgIG92ZXJ2aWV3Ci1vZiB0aGUgdXNlIG9mIHNjcmlwdGluZyBsYW5ndWFnZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcCB0bwotc3lzdGVtcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBTV0lHIHdhcyBkZXZlbG9wZWQgd2l0aCBtYW55IG9mIHRoZXNlIGlzc3VlcwotaW4gbWluZCBzbyB0aGlzIHBhcGVyIG1pZ2h0IGJlIG9mIGludGVyZXN0IHRvIHVzZXJzIHdobyBhcmUgbmV3IHRvCi1TV0lHIGFuZCBpdHMgZ29hbHMuIDxicj4KLQotPGxpPjxwPiA8Yj48YSBocmVmPSJodHRwOi8vd3d3LnN1cGVyY29tcC5vcmcvc2M5Ni9wcm9jZWVkaW5ncy9TQzk2UFJPQy9CRUFaTEVZL0lOREVYLkhUTSI+IExpZ2h0d2VpZ2h0IENvbXB1dGF0aW9uYWwgU3RlZXJpbmcgb2YgVmVyeSBMYXJnZSBTY2FsZSBNb2xlY3VsYXIgRHluYW1pY3MgU2ltdWxhdGlvbnMgPC9hPjwvYj4uCi1QcmVzZW50ZWQgYXQgU3VwZXJjb21wdXRpbmcnOTYuICBUaGlzIHBhcGVyIGRlc2NyaWJlcyB0aGUgYXBwbGljYXRpb24gdGhhdCAKLW1vdGl2YXRlZCB0aGUgZGV2ZWxvcG1lbnQgb2YgU1dJRy4gKFNlZSB3aHkgU1dJRyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQpLiA8YnI+IAotCi08L3VsPgotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9kb3dubG9hZC5odCBiL3N3aWd3ZWIvZG93bmxvYWQuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjY1NDIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9kb3dubG9hZC5odAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLURvd25sb2FkIFNXSUcKLTxwPgotPGltZyBzcmM9ImltYWdlcy9kb3dubG9hZC5wbmciIGFsdD0iRG93bmxvYWQiPgotCi08cD4KLVNvdXJjZUZvcmdlIGlzIG5vdyB0aGUgcHJpbWFyeSBzaXRlIGZvciBTV0lHIGRpc3RyaWJ1dGlvbnMuCi0KLTx1bD4KLTxsaT48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD0xNjQ1Ij5BbGwgcmVsZWFzZXM8L2E+LgotPGxpPjxhIGhyZWY9ImZ0cDovL3N3aWcuc291cmNlZm9yZ2UubmV0L3B1Yi9zd2lnLyI+T2xkZXIgc3R1ZmY8L2E+LgotPC91bD4KLQotPHA+Ci1TV0lHIGhhcyBhbHNvIGJlZW4gZGlzdHJpYnV0ZWQgYXMgc291cmNlIGNvZGUgZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLQotPHVsPgotPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAubWNjLmFjLnVrL3B1Yi9tdmMvc3dpZyI+ZnRwLm1jYy5hYy51ay9wdWIvbXZjL3N3aWc8L2E+IChVSykKLTxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnJnZS5jb20vcHViL2xhbmd1YWdlcy9zd2lnLyI+ZnRwLnJnZS5jb20vcHViL2xhbmd1YWdlcy9zd2lnPC9hPiAoTmV3IFlvcmspLgotPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAucHl0aG9uLm9yZy9wdWIvcHl0aG9uL2NvbnRyaWIvU3lzdGVtLyI+ZnRwLnB5dGhvbi5vcmcvcHViL3B5dGhvbi9jb250cmliL1N5c3RlbTwvYT4gKFB5dGhvbiBjb250cmlidXRlZCBzb2Z0d2FyZSkuCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cucGVybC5jb20vQ1BBTi8vYXV0aG9ycy9EYXZlX0JlYXpsZXkiPkNQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspPC9hPgotPC91bD4KLQotWW91IGNhbiBhbHNvIGZpbmQgU1dJRyBpbiB0aGUgZm9sbG93aW5nIGxvY2F0aW9ucyA6Ci0KLTx1bD4KLTxsaT4gPGEgaHJlZj0iaHR0cDovL2NnaS5kZWJpYW4ub3JnL3d3dy1tYXN0ZXIvZGViaWFuLm9yZy9QYWNrYWdlcy9zdGFibGUvaW50ZXJwcmV0ZXJzL3N3aWcuaHRtbCI+RGViaWFuIEdOVS9MaW51eDwvYT4uCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvcG9ydHMvZGV2ZWwuaHRtbCI+RnJlZUJTRDwvYT4uCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cuY3lnd2luLmNvbSI+Q3lnd2luPC9hPi4KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5vcmVpbGx5LmNvbS9jYXRhbG9nL3B5dGhvbi9ub2ZyYW1lcy5odG1sIj5Qcm9ncmFtbWluZyBQeXRob248L2E+IChJbmNsdWRlZCBvbiBDRC1ST00pLgotPGxpPiA8YSBocmVmPSJodHRwOi8vd3d3Lm1rcC5jb20vYm9va3NfY2F0YWxvZy8wLTEyMjYxLTIwNS0xLmFzcCI+VGNsL1RrIGZvciBSZWFsIFByb2dyYW1tZXJzPC9hPiAoSW5jbHVkZWQgb24gQ0QtUk9NKS4KLTwvdWw+Ci0KLU5vdGUgOiBJZiB5b3UgcmVjZWl2ZWQgU1dJRyBvbiBDRC1ST00sIHlvdSBtYXkgd2FudCB0byB1cGdyYWRlIHRvIHRoZSBsYXRlc3QgcmVsZWFzZS4KLQotPGgzPiBUaGUgTGF0ZXN0IFJlbGVhc2UgPC9oMz4KLQotPHA+Ci08YSBocmVmPSJodHRwOi8vcHJkb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L3N3aWcvc3dpZy0xLjMuMjcudGFyLmd6Ij5TV0lHCi0xLjMuMjc8L2E+IGlzIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgcmVsZWFzZSAoMjAwNS8wNi8xMSkuIFZpZXcgdGhlCi08YSBocmVmPSJyZWxlYXNlLmh0bWwiPnJlbGVhc2Ugbm90ZXM8L2E+LiAgV2luZG93cyB1c2VycyBzaG91bGQgZG93bmxvYWQKLTxhIGhyZWY9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvc3dpZy9zd2lnd2luLTEuMy4yNy56aXAiPnN3aWd3aW4tMS4zLjI3PC9hPgotd2hpY2ggaW5jbHVkZXMgYSBwcmVidWlsdCBleGVjdXRhYmxlLiAKLQotPHA+Ci08Yj5Ob3RlOjwvYj4gVGhlIGZvbGxvd2luZyByZWxlYXNlcyBwZXJ0YWluIHRvIFNXSUctMS4xIHdoaWNoIHdhcyBhIHdpZGVseSBkaXN0cmlidXRlZCByZWxlYXNlCi1mcm9tIHNldmVyYWwgeWVhcnMgYWdvLiAgVW5sZXNzIHlvdSByZWFsbHkgbmVlZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgeW91IHNob3VsZCB1c2UKLVNXSUctMS4zLnggaW5zdGVhZCBvZiBTV0lHLTEuMSAoZXNwZWNpYWxseSBzaW5jZSAxLjMgaXMgbXVjaCBtb3JlIGNhcGFibGUpLgotCi08cD4KLTxhIGhyZWY9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvc3dpZy9zd2lnMS4xcDUudGFyLmd6Ij5TV0lHIDEuMXA1PC9hPgotaXMgdGhlIGxhdGVzdCBzdGFibGUgcmVsZWFzZSBvZiBTV0lHLTEuMSAoMTk5OC8wMi8wNSkuICAgCi0KLTxiPk5vdGUgKDIwMDAvMDEvMTgpIDwvYj5TV0lHLTEuMXA1IGhhcyBhIG51bWJlciBvZiBjb21waWxhdGlvbiBpc3N1ZXMKLXdpdGggQU5TSSBDKysgY29tcGlsZXJzIGFuZCB3aWxsIHByb2JhYmx5IGdlbmVyYXRlIGEgbG90IG9mIGNvbXBpbGVyCi13YXJuaW5ncy4gIFNvcnJ5LgotCi08cD4KLTxhIGhyZWY9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvc3dpZy9zd2lnMS4xLTg4My50YXIuZ3oiPlNXSUcxLjEtODgzPC9hPiBpcyB0aGUgbGFzdCBtYWludGVuYW5jZSB2ZXJzaW9uIG9mIFNXSUctMS4xIChEZWNlbWJlciAxOTk5KS4gIFRoaXMgaXNuJ3QgcmVhbGx5IGEKLSJyZWxlYXNlIiwgYnV0IHRoZSBsYXN0IG5pZ2h0bHkgYnVpbGQgdGhhdCB3YXMgY29tcGxldGVkIGJlZm9yZSAKLWRldmVsb3BtZW50IHdvcmsgc2hpZnRlZCB0byBTV0lHLTEuMy4gIEl0IGZpeGVzIGEgbnVtYmVyIG9mIGJ1Z3MgaW4KLVNXSUcxLjFwNS4KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9leGVjLmh0IGIvc3dpZ3dlYi9leGVjLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWE5OTg3Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvZXhlYy5odAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi1FeGVjdXRpdmUgU3VtbWFyeQotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvZXhlYy5wbmciIGFsdD0iRXhlY3V0aXZlIFN1bW1hcnkiPgotCi08cD4KLVNXSUcgaXMgYW4gaW50ZXJmYWNlIGNvbXBpbGVyIHRoYXQgY29ubmVjdHMgcHJvZ3JhbXMgd3JpdHRlbiBpbiBDIGFuZAotQysrIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlcyBzdWNoIGFzIFBlcmwsIFB5dGhvbiwgUnVieSwgYW5kIFRjbC4gIEl0Ci13b3JrcyBieSB0YWtpbmcgdGhlIGRlY2xhcmF0aW9ucyBmb3VuZCBpbiBDL0MrKyBoZWFkZXIgZmlsZXMgYW5kIHVzaW5nCi10aGVtIHRvIGdlbmVyYXRlIHRoZSB3cmFwcGVyIGNvZGUgdGhhdCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIG5lZWQgdG8KLWFjY2VzcyB0aGUgdW5kZXJseWluZyBDL0MrKyBjb2RlLiAgSW4gYWRkaXRpb24sIFNXSUcgcHJvdmlkZXMgYQotdmFyaWV0eSBvZiBjdXN0b21pemF0aW9uIGZlYXR1cmVzIHRoYXQgbGV0IHlvdSB0YWlsb3IgdGhlIHdyYXBwaW5nCi1wcm9jZXNzIHRvIHN1aXQgeW91ciBhcHBsaWNhdGlvbi4KLQotPHA+Ci1Kb2huIE91c3RlcmhvdXQgKGNyZWF0b3Igb2YgVGNsKSBoYXMgd3JpdHRlbiBhCi08YSBocmVmPSJodHRwOi8vaG9tZS5wYWNiZWxsLm5ldC9vdXN0ZXIvc2NyaXB0aW5nLmh0bWwiPnBhcGVyPC9hPgotdGhhdCBkZXNjcmliZXMgdGhlCi1iZW5lZml0cyBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgIFNXSUcgbWFrZXMgaXQgZmFpcmx5IGVhc3kgdG8gY29ubmVjdCBzY3JpcHRpbmcKLWxhbmd1YWdlcyB3aXRoIEMvQysrIGNvZGUuCi0KLTxwPlNXSUcgaXMgdXNlZCBpbiBhIG51bWJlciBvZiB3YXlzOgotCi08dWw+Ci08bGk+PHA+PGI+QnVpbGRpbmcgbW9yZSBwb3dlcmZ1bCBDL0MrKyBwcm9ncmFtczwvYj4uICBVc2luZyBTV0lHLCB5b3UgY2FuCi1yZXBsYWNlIHRoZSBtYWluKCkgZnVuY3Rpb24gb2YgYSBDIHByb2dyYW0gd2l0aCBhIHNjcmlwdGluZwotaW50ZXJwcmV0ZXIgZnJvbSB3aGljaCB5b3UgY2FuIGNvbnRyb2wgdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBhZGRzCi1xdWl0ZSBhIGxvdCBvZiBmbGV4aWJpbGl0eSBhbmQgbWFrZXMgdGhlIHByb2dyYW0gInByb2dyYW1tYWJsZS4iICBUaGF0Ci1pcywgdGhlIHNjcmlwdGluZyBpbnRlcmZhY2UgYWxsb3dzIHVzZXJzIGFuZCBkZXZlbG9wZXJzIHRvIGVhc2lseQotbW9kaWZpeSB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2dyYW0gd2l0aG91dCBoYXZpbmcgdG8gbW9kaWZ5IGxvdy1sZXZlbAotQy9DKysgY29kZS4gIFRoZSBiZW5lZml0cyBvZiB0aGlzIGFyZSBudW1lcm91cy4gSW4gZmFjdCB0aGluayBvZiBhbGwKLW9mIHRoZSBsYXJnZSBzb2Z0d2FyZSBwYWNrYWdlcyB0aGF0IHlvdSB1c2UgZXZlcnkgZGF5LS0tbmVhcmx5IGFsbCBvZgotdGhlbSBpbmNsdWRlIHNwZWNpYWwgYSBtYWNybyBsYW5ndWFnZSwgY29uZmlndXJhdGlvbiBsYW5ndWFnZSwgb3IgZXZlbgotYSBzY3JpcHRpbmcgZW5naW5lIHRoYXQgYWxsb3dzIHVzZXJzIHRvIG1ha2UgY3VzdG9taXphdGlvbnMuCi0KLTxsaT48cD48Yj5SYXBpZCBwcm90b3R5cGluZyBhbmQgZGVidWdnaW5nPC9iPi4gIFNXSUcgYWxsb3dzIEMvQysrIHByb2dyYW1zIHRvIGJlIHBsYWNlZCBpbgotYSBzY3JpcHRpbmcgZW52aXJvbm1lbnQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB0ZXN0IGEgbGlicmFyeSB3aXRoIGEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIG9yIHVzZSB0aGUgc2NyaXB0aW5nCi1pbnRlcnByZXRlciBhcyBhbiBpbnRlcmFjdGl2ZSBkZWJ1Z2dlci4gICBTaW5jZSBTV0lHIHJlcXVpcmVzIG5vIG1vZGlmaWNhdGlvbnMgdG8gdGhlCi11bmRlcmx5aW5nIEMvQysrIGNvZGUsIGl0IGNhbiBiZSB1c2VkIGV2ZW4gaWYgdGhlIGZpbmFsIHByb2R1Y3QgZG9lcyBub3QgcmVseSB1cG9uIHNjcmlwdGluZy4KLQotPGxpPjxwPjxiPlN5c3RlbXMgaW50ZWdyYXRpb248L2I+LiAgU2NyaXB0aW5nIGxhbmd1YWdlcyB3b3JrIGZhaXJseSB3ZWxsCi1mb3IgY29udHJvbGxpbmcgYW5kIGdsdWluZyBsb29zZWx5LWNvdXBsZWQgc29mdHdhcmUgY29tcG9uZW50cwotdG9nZXRoZXIuICBXaXRoIFNXSUcsIGRpZmZlcmVudCBDL0MrKyBwcm9ncmFtcyBjYW4gYmUgdHVybmVkIGludG8KLXNjcmlwdGluZyBsYW5ndWFnZSBleHRlbnNpb24gbW9kdWxlcy4gIFRoZXNlIG1vZHVsZXMgY2FuIHRoZW4gYmUKLWNvbWJpbmVkIHRvZ2V0aGVyIHRvIGNyZWF0ZSBuZXcgYW5kIGludGVyZXN0aW5nIGFwcGxpY2F0aW9ucy4KLQotPGxpPjxwPjxiPkNvbnN0cnVjdGlvbiBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9uIG1vZHVsZXM8L2I+LiAgU1dJRwotY2FuIGJlIHVzZWQgdG8gdHVybiBjb21tb24gQy9DKysgbGlicmFyaWVzIGludG8gY29tcG9uZW50cyBmb3IgdXNlIGluCi1wb3B1bGFyIHNjcmlwdGluZyBsYW5ndWFnZXMuICBPZiBjb3Vyc2UsIHlvdSB3aWxsIHN0aWxsIHdhbnQgdG8gbWFrZQotc3VyZSB0aGF0IG5vLW9uZSBlbHNlIGhhcyBhbHJlYWR5IGNyZWF0ZWQgYSBtb2R1bGUgYmVmb3JlIGRvaW5nIHRoaXMuCi08L3VsPgotCi1TV0lHIGlzIHNvbWV0aW1lcyBjb21wYXJlZCB0byBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSAoSURMKQotY29tcGlsZXJzIHN1Y2ggYXMgdGhvc2UgeW91IGZpbmQgd2l0aCBzeXN0ZW1zIHN1Y2ggYXMgQ09SQkEgYW5kIENPTS4KLUFsdGhvdWdoIHRoZXJlIGFyZSBhIGZldyBzaW1pbGFyaXRpZXMsIHRoZSB3aG9sZSBwb2ludCBvZiBTV0lHIGlzIHRvCi1tYWtlIGl0IHNvIHlvdSBkb24ndCBoYXZlIHRvIGFkZCBhbiBleHRyYSBsYXllciBvZiBJREwgc3BlY2lmaWNhdGlvbnMKLXRvIHlvdXIgYXBwbGljYXRpb24uICBJZiBhbnl0aGluZywgaXQncyBtdWNoIG1vcmUgb2YgYSByYXBpZAotYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgYW5kIHByb3RvdHlwaW5nIHRvb2wuICBTcGVjaWZpY2FsbHk6Ci0KLTx1bD4KLTxsaT48cD48Yj5BTlNJIEMvQysrIHN5bnRheDwvYj4uICBTV0lHIHBhcnNlcyBBTlNJIEMrKyB0aGF0IGhhcyBiZWVuCi1leHRlbmRlZCB3aXRoIGEgbnVtYmVyIG9mIHNwZWNpYWwgZGlyZWN0aXZlcy4gIEFzIGEgcmVzdWx0LCBpbnRlcmZhY2VzCi1hcmUgdXN1YWxseSBidWlsdCBieSBncmFiYmluZyBhIGhlYWRlciBmaWxlIGFuZCB0d2Vha2luZyBpdCBhIGxpdHRsZQotYml0LiAgVGhpcyBwYXJ0aWN1bGFyIGFwcHJvYWNoIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlCi11bmRlcmx5aW5nIEMvQysrIHByb2dyYW0gdW5kZXJnb2VzIGZyZXF1ZW50IG1vZGlmaWNhdGlvbi4KLQotPGxpPjxwPjxiPlNXSUcgaXMgbm90IGEgc3R1YiBnZW5lcmF0b3I8L2I+LiAgU1dJRyBwcm9kdWNlcyBjb2RlIHRoYXQgeW91Ci1zaW1wbHkgY29tcGlsZSBhbmQgcnVuLiAgWW91IGRvbid0IGhhdmUgdG8gZmlsbCBpbiBhbnkgc3R1YnMgb3Igd3JpdGUKLXNwZWNpYWwgY2xpZW50L3NlcnZlciBjb2RlIGFzIHlvdSBkbyB3aXRoIFJQQy1saWtlIHN5c3RlbXMuCi0KLTxsaT48cD48Yj5TV0lHIGRvZXMgbm90IGRlZmluZSBhIHByb3RvY29sIG5vciBpcyBpdCBhIGNvbXBvbmVudAotZnJhbWV3b3JrLjwvYj4gU1dJRyBkb2VzIG5vdCBkZWZpbmUgbWVjaGFuaXNtcyBvciBlbmZvcmNlIHJ1bGVzCi1yZWdhcmRpbmcgdGhlIHdheSBpbiB3aGljaCBzb2Z0d2FyZSBjb21wb25lbnRzIGFyZSBzdXBwb3NlZCB0bwotaW50ZXJhY3Qgd2l0aCBlYWNoIG90aGVyLiAgTm9yIGlzIGl0IGEgc3BlY2lhbGl6ZWQgcnVudGltZSBsaWJyYXJ5Ci1vciBhbHRlcm5hdGl2ZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgQVBJLiAgU1dJRyBpcyBtZXJlbHkgYSBjb2RlIGdlbmVyYXRvcgotdGhhdCBwcm92aWRlcyB0aGUgZ2x1ZSBuZWNlc3NhcnkgdG8gaG9vayBDL0MrKyB0byBvdGhlciBsYW5ndWFnZXMuCi0KLTxsaT48cD48Yj5EZXNpZ25lZCB0byB3b3JrIHdpdGggZXhpc3RpbmcgQy9DKysgY29kZTwvYj4uICBTV0lHCi1yZXF1aXJlcyBsaXR0bGUsIGlmIGFueSwgbW9kaWZpY2F0aW9ucyB0byBleGlzdGluZyBjb2RlLiAgRm9yIHRoZSBtb3N0Ci1wYXJ0LCBpdCBlbmNvdXJhZ2VzIHlvdSB0byBrZWVwIGEgY2xlYW4gc2VwYXJhdGlvbiBiZXR3ZWVuIEMvQysrIGFuZAotaXRzIHNjcmlwdGluZyBpbnRlcmZhY2UuCi0KLTxsaT48cD48Yj5FeHRlbnNpYmlsaXR5PC9iPi4gIFNXSUcgcHJvdmlkZXMgYSB2YXJpZXR5IG9mIGN1c3RvbWl6YXRpb24gb3B0aW9ucyB0aGF0Ci1hbGxvdyB5b3UgdG8gYmxvdyB5b3VyIHdob2xlIGxlZyBvZmYgaWYgdGhhdCdzIHdoYXQgeW91IHdhbnQgdG8gZG8uICAKLVNXSUcgaXMgbm90IGhlcmUgdG8gZW5mb3JjZSBwcm9ncmFtbWluZyBtb3JhbGl0eS4KLTwvdWw+Ci0KLUZpbmFsbHksIGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IGV2ZW4gdGhvdWdoIFNXSUcgaXMgb2NjYXNpb25hbGx5IGNvbXBhcmVkCi10byBvdGhlciBtb3JlIHNwZWNpYWxpemVkIHNjcmlwdGluZyBsYW5ndWFnZSBleHRlbnNpb24gYnVpbGRpbmcgdG9vbHMKLShlLmcuLCBQZXJsIFhTLCBQeXRob24gYmdlbiwgZXRjLiksIGl0cyBwcmltYXJ5IGF1ZGllbmNlIGlzIEMvQysrCi1wcm9ncmFtbWVycyB3aG8gd2FudCB0byBhZGQgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgY29tcG9uZW50IHRvIHRoZWlyCi1hcHBsaWNhdGlvbnMuICBCZWNhdXNlIG9mIHRoaXMsIFNXSUcgdGVuZHMgdG8gaGF2ZSBhIHNsaWdodGx5Ci1kaWZmZXJlbnQgZm9jdXMgdGhhbiB0b29scyBkZXNpZ25lZCB0byBidWlsZCBzbWFsbCBtb2R1bGVzIGZvcgotd2lkZXNwcmVhZCB1c2UgaW4gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZGlzdHJpYnV0aW9uLiBhcHBsaWNhdGlvbnMuCi0KLTxwPgotQSBudW1iZXIgb2YgPGEgaHJlZj0iZG9jLmh0bWwiPnBhcGVycyBhbmQgdHV0b3JpYWxzPC9hPiBkZXNjcmliaW5nIFNXSUcgYXJlIGF2YWlsYWJsZS4KLVlvdSBjYW4gYWxzbyB2aWV3IGEgc2ltcGxlIDxhIGhyZWY9InR1dG9yaWFsLmh0bWwiPnR1dG9yaWFsPC9hPiB0byBzZWUgYW4KLWV4YW1wbGUgb2YgU1dJRyBpbiBhY3Rpb24sIG9yIGNoZWNrIG91dCBob3cgb3RoZXIgcGVvcGxlIGFyZSB1c2luZyBTV0lHCi1pbiB0aGVpciA8YSBocmVmPSJwcm9qZWN0cy5odG1sIj5wcm9qZWN0czwvYT4uCi0KLTxwPgotU1dJRyBoYXMgYmVlbiBmcmVlbHkgYXZhaWxhYmxlIGluIHZhcmlvdXMgZm9ybXMgc2luY2UgRmVicnVhcnksIDE5OTYKLWFuZCBhIGxhcmdlIG51bWJlciBvZiBkZXZlbG9wZXJzIGhhdmUgbWFkZSBjb250cmlidXRpb25zLiAgVG9kYXksIFNXSUcKLXJlbWFpbnMgYW4gYWxsLXZvbHVudGVlciBlZmZvcnQuICBBcHByb3hpbWF0ZWx5IDg3NSBwZW9wbGUgc3Vic2NyaWJlCi10byB0aGUgPGEgaHJlZj0ibWFpbC5odG1sIj5zd2lnPC9hPiBtYWlsaW5nIGxpc3QgYW5kIGEgcHVibGljIENWUwotcmVwb3NpdG9yeSBpcyBhdmFpbGFibGUgYXQgU291cmNlRm9yZ2UuICBWZXJzaW9ucyBvZiAKLVNXSUcgY2FuIG5vdyBiZSBmb3VuZCBpbiBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgKGhvd2V2ZXIsIHlvdSdsbCBhbG1vc3QKLWNlcnRhaW5seSB3YW50IHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gaGVyZSkuCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9mYXEuaHQgYi9zd2lnd2ViL2ZhcS5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0YjgzZi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ZhcS5odAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVNXSUcgRkFRCi0KLTxwPgotPGltZyBzcmM9ImltYWdlcy9mYXEucG5nIiBhbHQ9IkZBUSI+Ci0KLTxwPgotVG8gZGF0ZSwgdGhlcmUgaGFzIGJlZW4gbm8gRkFRIGZvciBTV0lHLiAgIEFzIGEgcmVzdWx0LCB5b3UgbWF5IHdhbnQgdG8gCi1jaGVjayB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLQotPHVsPgotPGxpPlRoZSA8YSBocmVmPSJkb2MuaHRtbCI+b25saW5lIGRvY3VtZW50YXRpb248L2E+LgotPGxpPlRoZSA8YSBocmVmPSJidWdzLmh0bWwiPmJ1ZyB0cmFja2luZyBkYXRhYmFzZTwvYT4uCi08bGk+VGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+TWFpbGluZyBsaXN0IGFyY2hpdmU8L2E+LgotPC91bD4KLQotQXQgdGhpcyB0aW1lLCBJIGFtIGxvb2tpbmcgaW50byB0aGUgY3JlYXRpb24gb2YgYSBGQVEuICBIb3dldmVyLCB0aGlzIHdvdWxkIGJlCi1tdWNoIG11Y2ggZWFzaWVyIGlmIHRoZXJlIHdlcmUgYSB2b2x1bnRlZXIgdG8gaGVscC4gCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ZhcS5udCBiL3N3aWd3ZWIvZmFxLm50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U4ZWY4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvZmFxLm50CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotU1dJRyBGQVEKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2ZhcS5naWYiPgotCi08cD4KLVRvIGRhdGUsIHRoZXJlIGhhcyBiZWVuIG5vIEZBUSBmb3IgU1dJRy4gICBBcyBhIHJlc3VsdCwgeW91IG1heSB3YW50IHRvIAotY2hlY2sgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6Ci0KLTx1bD4KLTxsaT5UaGUgPGEgaHJlZj0iZG9jLmh0bWwiPm9ubGluZSBkb2N1bWVudGF0aW9uPC9hPi4KLTxsaT5UaGUgPGEgaHJlZj0iYnVncy5odG1sIj5idWcgdHJhY2tpbmcgZGF0YWJhc2U8L2E+LgotPGxpPlRoZSA8YSBocmVmPSJtYWlsLmh0bWwiPk1haWxpbmcgbGlzdCBhcmNoaXZlPC9hPi4KLTwvdWw+Ci0KLUF0IHRoaXMgdGltZSwgSSBhbSBsb29raW5nIGludG8gdGhlIGNyZWF0aW9uIG9mIGEgRkFRLiAgSG93ZXZlciwgdGhpcyB3b3VsZCBiZQotbXVjaCBtdWNoIGVhc2llciBpZiB0aGVyZSB3ZXJlIGEgdm9sdW50ZWVyIHRvIGhlbHAuIApkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9mdXR1cmUuaHQgYi9zd2lnd2ViL2Z1dHVyZS5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhZTVlYS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2Z1dHVyZS5odAorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi1TV0lHLTEuMy4xMiwgU1dJRy0yLjAgYW5kIEJleW9uZAotCi08aDI+U1dJRy0xLjMuMTIsIFNXSUcgMi4wLCBhbmQgQmV5b25kPC9oMj4KLQotPHA+Ci1BdXRob3I6IERhdmlkIEJlYXpsZXkgKGJlYXpsZXlAY3MudWNoaWNhZ28uZWR1KQotCi08cD4KLUp1bmUgMiwgMjAwMgotCi08cD4KLVdpdGggdGhlIHJlbGVhc2Ugb2YgU1dJRy0xLjMuMTIsIEkgdGhvdWdodCBJJ2QgdGFrZSBhIGZldyBtb21lbnRzIG9mCi1ldmVyeW9uZSdzIHRpbWUgdG8gdGFsayBhYm91dCB0aGUgcGFzdCwgdGhlIHByZXNlbnQsIGFuZCB0aGUgZnV0dXJlIG9mCi1TV0lHIGRldmVsb3BtZW50LiAgSSdtIHJlYWxseSBxdWl0ZSBleGNpdGVkIGFib3V0IHRoZSBjdXJyZW50IHJlbGVhc2UKLWJlY2F1c2UgSSB0aGluayBpdCByZXByZXNlbnRzIGEgaHVnZSB0dXJuaW5nIHBvaW50IGluIFNXSUcncwotZGV2ZWxvcG1lbnQuICBGdXJ0aGVybW9yZSwgaXQgaXMgb25seSB0aGUgYmVnaW5uaW5nIG9mIGJpZ2dlciBhbmQKLWJldHRlciB0aGluZ3MgdG8gY29tZS4gIEhvd2V2ZXIsIHdlIGRlZmluaXRlbHkgbmVlZCB5b3VyIGhlbHAuCi0KLTxwPgotVG8gcHV0IGEgbGl0dGxlIHBlcnNwZWN0aXZlIG9uIHRoZSBkaXNjdXNzaW9uLCBJJ2Qgc3RhcnQgd2l0aCBhIGZldwotZGV2ZWxvcG1lbnQgc3RhdGlzdGljcy4gIEluIHRoZSBsYXN0IDEyIG1vbnRocywgdGhlcmUgaGF2ZSBiZWVuIG92ZXIKLTMwMCBlbnRyaWVzIGFkZGVkIHRvIHRoZSBDSEFOR0VTIGxvZyBhbmQgb3ZlciA0MDAwIENWUyBjb21taXRzLgotQWx0aG91Z2ggdGhhdCBtYXkgbm90IHNvdW5kIGxpa2UgYSBsb3QgY29tcGFyZWQgdG8gYSBodWdlIHNvZnR3YXJlCi1wcm9qZWN0LCBpdCBpcyBzaWduaWZpY2FudCBpbiB0aGUgY29udGV4dCBvZiBTV0lHLiAgQXMgYSBwb2ludCBvZgotY29tcGFyaXNvbiwgdGhlcmUgaGFzIGJlZW4gbW9yZSBTV0lHIGRldmVsb3BtZW50IHRoaXMgeWVhciB0aGFuIGluIGFueQotb3RoZXIgeWVhciBvZiB0aGUgcHJvamVjdCBhbmQgbW9yZSB0aGFuIGluIHRoZSBwcmV2aW91cyB0aHJlZSB5ZWFycwotY29tYmluZWQuICBUaGlzIGV2ZW4gaW5jbHVkZXMgdGhlIGZpcnN0IGZldyB5ZWFycyBvZiBkZXZlbG9wbWVudCBpbgotd2hpY2ggdGhlcmUgd2FzIGFsc28gYSBsb3Qgb2YgYWN0aXZpdHkuICBGdXJ0aGVybW9yZSwgbWFueSBvZiB0aGUKLXJlY2VudCBjaGFuZ2VzIGhhdmUgYmVlbiBleHRyZW1lbHkgbm9uLXRyaXZpYWwgKGUuZy4sIHRlbXBsYXRlcywKLW5hbWVzcGFjZXMsIHR5cGUgc3lzdGVtLCBvcGVyYXRvcnMsIGV0Yy4pLiAgQXMgYSByZXN1bHQsIFNXSUcgaXMgbW9yZQotY2FwYWJsZSB0aGFuIEkgZXZlciBpbWFnaW5lZCBwb3NzaWJsZS4KLQotPHA+Ci1SZWdyZXR0YWJseSwgSSBtdXN0IGFkbWl0IHRoYXQgSSd2ZSBiZWVuIGEgbGl0dGxlIG5lZ2xpZ2VudCBpbgotZGlzY3Vzc2luZyB0aGUgcm9hZG1hcCBmb3Igd2hlcmUgSSB0aG91Z2h0IHRoaXMgZmx1cnJ5IG9mIFNXSUcKLWRldmVsb3BtZW50IHdhcyBhY3R1YWxseSBoZWFkZWQuICBJbiBwYXJ0LCB0aGlzIGlzIGJlY2F1c2UgSSd2ZSBiZWVuCi1idXJpZWQgaW4gd29yay4gIEhvd2V2ZXIsIHRoZSByZWFsIHJlYXNvbiBpcyB0aGF0IEkgZGlkbid0IHJlYWxseSBrbm93Ci13aGVyZSB3ZSB3ZXJlIGdvaW5nLS0tZXhjZXB0IHRoYXQgaW4gYSB0aW1lIGZhciBmYXIgZmFyIGF3YXkgaW4gdGhlCi1mdXR1cmUsIHdlIG1pZ2h0IGFycml2ZSBhdCBzb21lIGtpbmQgb2YgInN0YWJsZSIgcmVsZWFzZSB3aXRoIGEKLXZlcnNpb24gbnVtYmVyIG90aGVyIHRoYW4gIjEuMy54Ii4gIE5lZWRsZXNzIHRvIHNheSwgdGhhdCdzIG5vdCBhIHZlcnkKLWNvbXBlbGxpbmcgc3RvcnkuCi08cD4KLVRoYXQgc2FpZCwgSSd2ZSBzcGVudCBhIGxvdCBvZiB0aW1lIHRoaW5raW5nIGFib3V0IFNXSUcgYW5kIHRyeWluZyB0bwotd3JhcCBteSBicmFpbiBhcm91bmQgaXQuICBTcGVjaWZpY2FsbHksIGp1c3Qgd2hhdCBpcyAob3Igc2hvdWxkIGJlKQotdGhlIHByaW1hcnkgZm9jdXMgb2YgdGhpcyBwcm9qZWN0IGFuZCB3aGF0IGFyZSB3ZSByZWFsbHkgdHJ5aW5nIHRvIGRvPwotVGhhdCdzIHdoYXQgdGhlIHJlc3Qgb2YgdGhpcyBtZXNzYWdlIGlzIGFib3V0LgotCi08aDM+U1dJRyBQcmVoaXN0b3J5PC9oMz4gCi0KLTxwPgotVGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB3YXMgd3JpdHRlbiBpbiAxOTk1LiAgVGhlIG9yaWdpbmFsIHN5c3RlbQotd2FzIGRldmVsb3BlZCB0byBoZWxwIHdpdGggc29tZSBzb2Z0d2FyZSB3cmFwcGluZyBwcm9ibGVtcyBJCi1lbmNvdW50ZXJlZCB3aGlsZSB3cml0aW5nIG1vbGVjdWxhciBkeW5hbWljcyBzb2Z0d2FyZSBhdCBMb3MKLUFsYW1vcy4gTGF0ZXIgdGhhdCB5ZWFyLCBJIGJlY2FtZSBpbnRlcmVzdGVkIGluIGV4dGVuZGluZyB0aGUgd3JhcHBlcgotZ2VuZXJhdG9yIHRvIHN1cHBvcnQgb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcyBzbyBpdCB3YXMgcmV3cml0dGVuIGluCi1DKysgYW5kIG1vZGlmaWVkIHdpdGggbXVsdGlwbGUgYmFja2VuZHMgKFRjbCwgUGVybCwgYW5kIEd1aWxlKS4gIFRoaXMKLWxlZCB0byBhIGZpcnN0IHB1YmxpYyByZWxlYXNlIGluIEZlYnJ1YXJ5LCAxOTk2LiAgRmVlZGJhY2sgZnJvbSB0aGlzCi1yZWxlYXNlIGxlZCB0byBhIHNlcmllcyBvZiBlbmhhbmNlbWVudHMgYW5kIHRoZSByZWxlYXNlIG9mIFNXSUcgMS4wIGluCi1TZXB0ZW1iZXIgMTk5Ni4gIFRocm91Z2hvdXQgdGhpcyBwcm9jZXNzLCBteSBpbnRlbnQgd2FzIHRvIGNyZWF0ZSBhCi10b29sIHRoYXQgSSB3b3VsZCB3YW50IHRvIHVzZS0tLUkgbmV2ZXIgdmlld2VkIHRoZSBwcm9qZWN0IGFzIGFuCi1DUyBleHBlcmltZW50IGluIHByb2dyYW1taW5nIGxhbmd1YWdlcyBvciBzb2Z0d2FyZSBlbmdpbmVlcmluZy4KLQotPGgzPlNXSUcgMS4xPC9oMz4KLQotU1dJRy0xLjEgKEp1bmUsIDE5OTcpIHJlcHJlc2VudGVkIGEgc2VyaWVzIG9mIGVuaGFuY2VtZW50cyB0aGF0IHdlcmUKLWFkZGVkIGluIHJlc3BvbnNlIHRvIGZlZWRiYWNrIGF0IGNvbmZlcmVuY2VzIGFuZCBmcm9tIHVzZXJzLiAgU2hhZG93Ci1jbGFzc2VzLCBleGNlcHRpb24gaGFuZGxpbmcsIHR5cGVtYXBzLCBhbmQgYSBudW1iZXIgb2YgbW9yZSB1c2VmdWwKLWZlYXR1cmVzIHdlcmUgYWRkZWQuICBIb3dldmVyLCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgdGhlIHN5c3RlbSB3YXMKLXJlbGF0aXZlbHkgdW5jaGFuZ2VkIGZyb20gdGhlIGluaXRpYWwgdmVyc2lvbi4gIEZvbGxvd2luZyB0aGUgcmVsZWFzZQotb2YgMS4xLCBhIHNlcmllcyBvZiBtaW5vciBwYXRjaCByZWxlYXNlcyB3ZXJlIG1hZGUuICBUaGlzIHJlc3VsdGVkIGluCi10aGUgcmVsZWFzZSBvZiBTV0lHLTEuMXA1IGluIEZlYnJ1YXJ5LCAxOTk4LiAgVW5mb3J0dW5hdGVseSwgdGhpcwotcmVsZWFzZSB3b3VsZCByZW1haW4gdGhlIGxhc3QgInN0YWJsZSIgcmVsZWFzZSBmb3IgcXVpdGUgYSBsb25nCi10aW1lLS0taW4gZmFjdCwgaXQgaXMgc3RpbGwgbGlzdGVkIGFzIHRoZSBsYXN0ICJzdGFibGUiIHJlbGVhc2Ugb24gdGhlCi1TV0lHIHdlYiBwYWdlIQotCi08aDM+U1dJRyBIZWxsPC9oMz4KLQotRXZlbiBkdXJpbmcgdGhlIGRldmVsb3BtZW50IG9mIFNXSUctMS4xLCBpdCB3YXMgY2xlYXIgdGhhdCB0aGUgd2hvbGUKLWRlc2lnbiBvZiB0aGUgc3lzdGVtIHdhcyBkZWVwbHkgZmxhd2VkLiAgVGhlIGltcGxlbWVudGF0aW9uIHdhcyBhIG1lc3MKLWFuZCB0aGUgQy9DKysgc3VwcG9ydCB3YXMgZnVsbCBvZiBob2xlcyBhbmQgbmFzdHkgY29ybmVyIGNhc2VzLgotRnVydGhlcm1vcmUsIHRoZXJlIHdhcyBubyB1bmlmeWluZyBwcmluY2lwbGUgdGhhdCB0aWVkIGFsbCBvZiB0aGUKLWRpZmZlcmVudCBTV0lHIGRpcmVjdGl2ZXMgdG9nZXRoZXIuICBOb3Qgb25seSB0aGF0LCBmaXhpbmcgdGhlc2UKLXByb2JsZW1zIGFwcGVhcmVkIHRvIGJlIG5vdGhpbmcgc2hvcnQgb2YgaW1wb3NzaWJsZS0tLXJlcXVpcmluZyBhCi10b3RhbCBncm91bmQtdXAgcmV3cml0ZSBhdCBiZXN0LiAgVGhlIG9ubHkgcmVkZWVtaW5nIHF1YWxpdHkgd2FzIHRoYXQKLXRoZSBzeXN0ZW0gYmFzaWNhbGx5IHdvcmtlZCAid2VsbCBlbm91Z2gsIiBpdCB3YXMgZXh0ZW5zaXZlbHkKLWRvY3VtZW50ZWQsIGFuZCBpdHMgZmxhd3MgbW9zdGx5IGtub3duLiAgUGVvcGxlIGNvdWxkIHVzZSBpdCBhbmQgdGhlcmUKLXdlcmUgd29yay1hcm91bmRzIGZvciBtb3N0IGNvbW1vbiBwcm9ibGVtcy4KLQotPHA+Ci1UbyBkZWFsIHdpdGggdGhlIGRlc2lnbiBwcm9ibGVtLCB0aGVyZSB3ZXJlIGF0IGxlYXN0IGZvdXIgYXR0ZW1wdHMgdG8KLWNvbXBsZXRlbHkgcmV3cml0ZSBTV0lHLCBzb21lIG9mIHdoaWNoIHdlcmUgYXR0ZW1wdGVkIGluIHBhcmFsbGVsIHdpdGgKLXRoZSB3b3JrIG9uIFNXSUctMS4xLiAgVW5mb3J0dW5hdGVseSwgbm9uZSBvZiB0aGVzZSB3ZXJlIGV2ZXIKLWNvbXBsZXRlZC4gVGhlIHByaW1hcnkgcHJvYmxlbSB3YXMgYSBzdHJvbmcgInNlY29uZCBzeXN0ZW0iIGVmZmVjdCBhbmQKLWEgZGVzaXJlIHRvIG1ha2UgU1dJRyBkbyBldmVyeXRoaW5nIHRoYXQgb25lIG1pZ2h0IGNvbmNlaXZhYmx5IHdhbnQgdG8KLWRvIHdpdGggYSB3cmFwcGVyIGdlbmVyYXRvciAoc29tZWhvdykuICBDbGVhcmx5LCB0aGlzIHdhcyBhIHJlY2lwZSBmb3IKLWRpc2FzdGVyLiBJbiBmYWN0LCBhbGwgc3VjaCBhdHRlbXB0cyB0byByZXdyaXRlIFNXSUcgd2VyZSBldmVudHVhbGx5Ci1hYmFuZG9uZWQgc2V2ZXJhbCB5ZWFycyBhZ28uICBJbiBoaW5kc2lnaHQsIEkgdGhpbmsgdGhlIHJlYWwgcHJvYmxlbQotd2FzIHRoYXQgdGhlc2UgcmV3cml0ZSBlZmZvcnRzIGZvY3VzZWQgZmFyIHRvbyBtdWNoIGF0dGVudGlvbiBvbgotaW1wbGVtZW50YXRpb24gdGVjaG5pcXVlIHJhdGhlciB0aGFuIHByaW5jaXBsZXMuICBJbiBzaG9ydCwgdGhlCi1mYWlsdXJlIG9mIHRoZXNlIGVmZm9ydHMgd2FzIGR1ZSB0byBhIGxhY2sgb2YgY2xhcml0eSBpbiB1bmRlcnN0YW5kaW5nCi1ob3cgU1dJRyBvdWdodCB0byB3b3JrIChyZWdhcmRsZXNzIG9mIGhvdyBpdCB3YXMgYWN0dWFsbHkKLWltcGxlbWVudGVkKS4KLQotPGgzPlNXSUcgUmVzdGFydCAoMS4zYTEtMS4zYTUpPC9oMz4KLQotPHA+Ci1IYXZpbmcgbGFuZ3Vpc2hlZCBmb3Igc2V2ZXJhbCB5ZWFycywgdGhlIFNXSUcxLjFwNSByZWxlYXNlIGhhZCBhCi1ncm93aW5nIHBpbGUgb2YgbWFpbnRlbmFuY2UgaXNzdWVzLiBJdCBkaWRuJ3Qgd29yayBmb3IgbmV3ZXIgdmVyc2lvbnMKLW9mIGNlcnRhaW4gbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgYSBsb3Qgb2YgbWlub3IgYnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUKLXJlcXVlc3RzIGhhZCBiZWVuIGJ1aWxkaW5nIHVwLiAgV2l0aCBhIGxvdCBvZiBoZWxwIGZyb20gTG9pYyBEYWNoYXJ5IGFuZAotVGhpZW4tVGhpIE5ndXllbiwgd2UgcHV0IHRvZ2V0aGVyIHRoZSAxLjNhMSByZWxlYXNlIChGZWJydWFyeSwKLTIwMDApLiAgVGhpcyB3YXMgbW9zdGx5IGEgYnVnIGZpeCByZWxlYXNlIHRvIDEuMXA1IGV4Y2VwdCB0aGF0IHRoZQotcHJlcHJvY2Vzc29yIG1vZHVsZSBmcm9tIFNXSUcxLjIgd2FzIGFkZGVkIGFuZCBhIGxvdCBvZiBtaW5vcgotZW5oYW5jZW1lbnRzIHdlcmUgYWRkZWQuCi0KLTxwPgotRm9yIHRoZSBuZXh0IHNpeCBtb250aHMsIGEgbWFzc2l2ZSBlZmZvcnQgd2FzIG1hZGUgdG8gcmV3cml0ZSBhbGwgb2YKLVNXSUcncyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKHN0cmluZ3MsIGxpc3RzLCBoYXNoZXMsIGV0Yy4pLiAgVGhpcwotd29yayB3YXMgYWxsIGdvaW5nIG9uIHVuZGVybmVhdGggdGhlIGNvdmVycyB3aGlsZSB3ZSB0cmllZCB0byBrZWVwCi1TV0lHIGluIGFuIG9wZXJhdGlvbmFsIHN0YXRlLiBUaGUgcHJpbWFyeSBmb2N1cyBvZiB0aGlzIHdvcmsgd2FzCi1yZWFsbHkgb25lIG9mIGNsZWFudXAuICBIYXZpbmcgZ2l2ZW4gdXAgb24gYSB0b3RhbCByZXdyaXRlLCBwZXJoYXBzCi13ZSBjb3VsZCBzZXR0bGUgd2l0aCBtYWtpbmcgdGhlIGltcGxlbWVudGF0aW9uIGluY3JlbWVudGFsbHkgYmV0dGVyIAotdGhhbiBiZWZvcmUuICBJbiBhZGRpdGlvbiB0aGlzLCBNYXR0aGlhcyBLb3BwZSBqdW1wZWQgb24gYm9hcmQgdG8gCi1yZWltcGxlbWVudCB0aGUgR3VpbGUgbW9kdWxlIGFuZCB0byBtYWtlIG90aGVyIGltcHJvdmVtZW50cyB0byB0aGUgc3lzdGVtLgotCi08cD4KLUFuIGltcG9ydGFudCBhc3BlY3Qgb2YgdGhlc2UgcmVsZWFzZXMgd2FzIHRoYXQgbWFueSBwYXJ0cyBvZiB0aGUKLXN5c3RlbSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byB3cmFwcGVyIGNvZGUgZ2VuZXJhdGlvbiB3ZXJlIHJlbW92ZWQuCi1UaGlzIGluY2x1ZGVkIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBhbmQgT2JqZWN0aXZlLUMgc3VwcG9ydC4gIFRoZXNlCi13ZXJlIG5vdCByZW1vdmVkIGJlY2F1c2UgdGhleSB3ZXJlbid0IHVzZWZ1bC4gIEluc3RlYWQsIHRoZQotZG9jdW1lbnRhdGlvbiBzeXN0ZW0gd2FzIHJlbW92ZWQgYmVjYXVzZSBpdCBhY2NvdW50ZWQgZm9yIG5lYXJseSBoYWxmCi1vZiB0aGUgc3BlY2lhbCBTV0lHIGRpcmVjdGl2ZXMsIHlldCBoYWQgbm8gZGlyZWN0IGJlYXJpbmcgb24gd2hhdCBTV0lHCi1hY3R1YWxseSBkaWQuICBPYmVjdGl2ZS1DIHN1cHBvcnQgd2FzIHJlbW92ZWQgYmVjYXVzZSBpdCB3YXMgdGFuZ2xlZAotd2l0aCBDKysgc3VwcG9ydCBpbiBhIHdheSB0aGF0IHdhcyB2ZXJ5IGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIGFuZAotbWFpbnRhaW4uICBUaGUgcmVtb3ZhbCBvZiB0aGVzZSBmZWF0dXJlcyB3YXMgc2VlbiBhcyBhIHdheSB0byB2YXN0bHkKLXNpbXBsaWZ5IGNsZWFudXAtLWFuZCB0byBidXkgc29tZSB0aW1lIHdoZXJlIHdlIGNvdWxkIHJldGhpbmsgdGhlaXIKLXJvbGUgaW4gYSBmdXR1cmUgcmVsZWFzZS4KLQotPGgzPlNXSUcgUmVkdXggKDEuMy42LTEuMy4xMSk8L2gzPgotCi1UaGlzIHdvcmssIHN0YXJ0ZWQgaW4gRmVicnVhcnkgMjAwMSwgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudAotU1dJRyBpbXBsZW1lbnRhdGlvbi4gIFdpdGggdGhlIGhlbHAgb2YgV2lsbGlhbSBGdWx0b24sIE1hdHRoaWFzIEtvcHBlLAotTHlsZSBKb2huc29uLCBMdWlnaSBCYWxsYWJpbywgSmFzb24gU3Rld2FydCwgUmljaGFyZCBQYWxtZXIsIFNhbQotTGlkZGljb3QsIGFuZCBvdGhlcnMsIHRoaXMgd29yayBjYW4gYmVzdCBiZSBkZXNjcmliZWQgYXMgdGhlIHdob2xlc2FsZQotZGVzdHJ1Y3Rpb24gb2YgZXZlcnl0aGluZyByZW1haW5pbmcgZnJvbSBTV0lHLTEuMS4gIFRoZSBsYW5ndWFnZQotbW9kdWxlIEFQSSwgdHlwZSBzeXN0ZW0sIHRoZSBwYXJzZXIsIG51bWVyb3VzIFNXSUcgZGlyZWN0aXZlcywgYW5kCi1TV0lHIGxpYnJhcnkgZmlsZXMtLS1hbGwgZGVzdHJveWVkIG9yIHJld3JpdHRlbi4gIE5vdCBvbmx5IHRoYXQsIHdlCi1zdGFydGVkIGludHJvZHVjaW5nIHNpZ25pZmljYW50IGluY29tcGF0aWJpbGl0aWVzIHdpdGgKLVNXSUctMS4xLS0tbW9zdGx5IGluIGFuIGVmZm9ydCB0byBjb3JyZWN0IHBhc3Qgd3JvbmdzIGFuZCBnZXQKLW91cnNlbHZlcyBvdXQgb2YgdGhlIHRhbmdsZWQgbWVzcyBvZiBlYXJsaWVyIHZlcnNpb25zLiAgQSBodWdlIG51bWJlcgotb2YgbG9uZy1zdGFuZGluZyBidWdzIGFuZCBkaWZmaWN1bHQgZmVhdHVyZSByZXF1ZXN0cyBoYXZlIGFsc28gYmVlbgotcmVzb2x2ZWQuCi0KLTxwPgotVGhlIGdlbmVyYWwgZ29hbCBvZiB0aGlzIGRldmVsb3BtZW50IGNvdWxkIGJlc3QgYmUgZGVzY3JpYmVkIGFzIGFuCi1hdHRlbXB0IHRvIHJlZHVjZSBTV0lHIHRvIGFuIGVhc2lseSBkZXNjcmliZWQgc2V0IG9mIGdlbmVyYWwgImlkZWFzIgotYWJvdXQgaG93IGl0IHNob3VsZCBvcGVyYXRlLiAgU3BlY2lhbCBTV0lHIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuCi1lbGltaW5hdGVkIG9yIGNvbWJpbmVkIHdpdGggb3RoZXJzLiAgRGlmZmVyZW50IHBhcnRzIG9mIHRoZSBzeXN0ZW0gaGF2ZQotYmVlbiBiZXR0ZXIgaW50ZWdyYXRlZC4gIEZlYXR1cmVzIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIHdyYXBwZXIgY29kZQotZ2VuZXJhdGlvbiBoYXZlIGJlZW4gcmVtb3ZlZCBhbmQgdGhlIHN5c3RlbSBoYXMgYmVjb21lIG1vcmUKLWZvY3VzZWQuIENoYW5nZXMgaW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBBUElzIGhhdmUgYWxsb3dlZAotU1dJRyB0byBjYXB0dXJlIG1vcmUgaW5mb3JtYXRpb24gZnJvbSBpbnRlcmZhY2UgZmlsZXMgYW5kIHRvIHJlc29sdmUKLWhhcmQgY29ybmVyIGNhc2VzLiAgTW9yZSBvZnRlbiB0aGFuIG5vdCwgdGhlc2UgYXJlIHRoaW5ncyB0aGF0IHlvdQotbmV2ZXIgbm90aWNlIHVubGVzcyB5b3UgYXJlIGFuIG9sZCB1c2VyIGFuZCB5b3Ugc3VkZGVubHkgcmVhbGl6ZSB0aGF0Ci1hIHByb2JsZW0geW91IGhhZCBzZXZlcmFsIHllYXJzIGJhY2sgaGFzIGRpc2FwcGVhcmVkLgotCi08cD4KLUFsb25nIHdpdGggdGhlIGRlc3RydWN0aW9uIG9mIG9sZCBjb2RlLCB0aGlzIHdvcmsgaGFzIHF1aWV0bHkKLWludHJvZHVjZWQgYSBuZXcgY29yZS0tdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZmVhdHVyZXMgb2Ygd2hpY2ggYXJlIGEKLW5ldyBDKysgdHlwZSBzeXN0ZW0gYW5kIG11bHRpLXBhc3MgY29tcGlsYXRpb24uICBNb3JlIGltcG9ydGFudGx5LAotdGhpcyB3b3JrIGhhcyByZWFsbHkgdHJpZWQgdG8gcHJvdmlkZSBhIG1vcmUgcHJpbmNpcGxlZCBmb3VuZGF0aW9uIGZvcgotZnV0dXJlIFNXSUcgZGV2ZWxvcG1lbnQuICBIb3dldmVyLCBqdXN0IHdoYXQgaXMgdGhpcyAibW9yZSBwcmluY2lwbGVkCi1mb3VuZGF0aW9uPyIKLQotPGgzPkNvbnZlcmdlbmNlICgxLjMuMTIpPC9oMz4KLQotV2l0aCB0aGUgdXBjb21pbmcgMS4zLjEyIHJlbGVhc2UsIFNXSUcgaXMgYWJvdXQgdG8gdGFrZSBhIGJpZyBsZWFwCi1mb3J3YXJkLiBBbG1vc3QgYWxsIG9mIHRoaXMgaXMgZHVlIHRvIG9uZSByZWFsaXphdGlvbi0tLXRoYXQgYWxtb3N0Ci1ldmVyeSBoYXJkIHByb2JsZW0gaW4gcGFzdCBTV0lHIHJlbGVhc2VzIGhhcyBiZWVuIGRpcmVjdGx5IHJlbGF0ZWQgdG8KLWVycm9ycyBhbmQgbGltaXRhdGlvbnMgaW4gaXRzIHR5cGUgc3lzdGVtLiAgVHlwZXMgYXJlIHRoZSBrZXkgdG8KLXVuZGVyc3RhbmRpbmcgdGhlIHN0cnVjdHVyZSBvZiBDIGFuZCBDKysgY29kZS4gIFRoZXkgYXJlIGF0IHRoZSBoZWFydAotb2YgdW5kZXJzdGFuZGluZyBhZHZhbmNlZCBsYW5ndWFnZSBmZWF0dXJlcyBsaWtlIG5hbWVzcGFjZXMsIG5lc3RlZAotY2xhc3NlcywgYW5kIHRlbXBsYXRlcy4gIFRoZXkgYXJlIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGRhdGEKLW1hcnNoYWxsaW5nIHRoYXQgb2NjdXJzIGluIHdyYXBwZXJzLiAgTm90IG9ubHkgdGhhdCwgdGhleSBpbnRlcmFjdAotd2l0aCBuZWFybHkgZXZlcnkgU1dJRyBkaXJlY3RpdmUuICBBIHByb3BlciB0eXBlIHN5c3RlbSAqaXMqIHRoZQotbmVjZXNzYXJ5IGZvdW5kYXRpb24gZm9yIG1vdmluZyBTV0lHIGZvcndhcmQuCi0KLTxwPgotVG8gYmUgaG9uZXN0LCBJIGRvbid0IHRoaW5rIHRoYXQgdGhlIGVtcGhhc2lzIG9uIHR5cGVzIGlzIGVudGlyZWx5Ci1vYnZpb3VzLiAgSW4gZmFjdCwgYSBncmVhdCBkZWFsIG9mIHdvcmsgaW4gcGFzdCBTV0lHIHJld3JpdGVzIGhhcwotZm9jdXNlZCBvbiB0aGUgcHJvYmxlbSBvZiBDKysgcGFyc2luZy4gIEZvciBpbnN0YW5jZSwgbW9kaWZ5aW5nIHRoZQotcGFyc2VyIHRvIGhhbmRsZSBtb3JlIGFkdmFuY2VkIEMrKyBjb2RlIG9yIHJlcHJlc2VudGluZyBwYXJzZSB0cmVlcyBhcwotWE1MLiAgRnVydGhlcm1vcmUsIGlmIG9uZSBsb29rcyBhdCB0aGUgU1dJRyBtYWlsaW5nIGxpc3QsIHlvdSBjYW4gZmluZAotYSAqbG90KiBvZiBtZXNzYWdlcyByZWxhdGVkIHRvIGlzc3VlcyBvZiBDKysgcGFyc2luZyB3aGVyZWFzIGFsbW9zdCBubwotb25lIGV2ZXIgdGFsa3MgYWJvdXQgdHlwZXMgKHdlbGwsIG90aGVyIHRoYW4gdHlwZW1hcHMpLiAgRXZlbiBvdGhlcgotd3JhcHBlciBnZW5lcmF0aW9uIHRvb2xzIHNlZW1zIHRvIHNwZW5kIGEgbG90IG9mIHRpbWUgZGVhbGluZyB3aXRoIHRoZQotcGFyc2luZyBpc3N1ZS4gQWx0aG91Z2ggcGFyc2luZyBpcyBjbGVhcmx5IGltcG9ydGFudCwgSSBkb24ndCB0aGluayBpdAotaGFzIGV2ZXIgYmVlbiB0aGUgcmVhbCBwcm9ibGVtIGluIFNXSUcuICBUaGlzIGlzIGJlY2F1c2UgZXZlbiB0aG91Z2ggYQotcGFyc2VyIGNhbiB0ZWxsIHlvdSB3aGF0J3MgaW4gYSBoZWFkZXIgZmlsZSwgaXQgZG9lc24ndCB0ZWxsIHlvdQotYW55dGhpbmcgYWJvdXQgaG93IHRoZSBkaWZmZXJlbnQgcGllY2VzIG9mIHRoZSBzeXN0ZW0gYmVoYXZlIG9yIGhvdwotdGhleSBtaWdodCBpbnRlcmFjdC4gVG8gZG8gdGhhdCwgeW91IG5lZWQgdG8gZG8gYSBsb3QgbW9yZSB0aGFuIGp1c3QKLXBhcnNpbmctLWFuZCB0aGF0J3MgcmVhbGx5IHRoZSB3aG9sZSBwb2ludC4KLQotPHA+IAotQWx0aG91Z2ggZWFybGllciAxLjMgcmVsZWFzZXMgaGF2ZSBtYWRlIGJpZyBpbXByb3ZlbWVudHMgdG8gdGhlIHR5cGUKLXN5c3RlbSwgU1dJRy0xLjMuMTIgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCByZWFsbHkgdHJpZXMgdG8gdGFja2xlCi10aGUgdHlwZS1zeXN0ZW0gaXNzdWUgaW4gYSBtYWpvciB3YXkuICBXZSBoYXZlIHBhdGNoZWQgbmVhcmx5IGFsbAotcmVtYWluaW5nIGhvbGVzIGluIHRoZSB0eXBlIHN5c3RlbSBhbmQgd2UgaGF2ZSBhZGRlZCBmdWxsIHN1cHBvcnQgZm9yCi1DKysgbmFtZXNwYWNlcy4gTm90IG9ubHkgdGhhdCwgd2UgaGF2ZSBjb21wbGV0ZWx5IHJlaW1wbGVtZW50ZWQgQysrCi10ZW1wbGF0ZSBzdXBwb3J0IGluIGEgd2F5IHRoYXQgc3VwcG9ydHMgdGVtcGxhdGVzLCBtZW1iZXIgdGVtcGxhdGVzLAotYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLiAgTHVpZ2kgYW5kIEkgYXJlIGN1cnJlbnRseSB1c2luZyB0aGlzIHRvCi13b3JrIG9uIHByb3BlciBTV0lHIGxpYnJhcnkgc3VwcG9ydCBmb3IgcGFydHMgb2YgdGhlIEMrKyBzdGFuZGFyZAotbGlicmFyeSBhbmQgdGhlIFN0YW5kYXJkIFRlbXBsYXRlIExpYnJhcnkgKFNUTCkuICBBbHRob3VnaCBzb21lIGNydXN0eQotQyBwcm9ncmFtbWVycyAocHJlc2VudCBjb21wYW55IGV4Y2VwdGVkKSwgbWlnaHQgYmFsayBhdCBzdWNoIGFwcGFyZW50Ci1pbnNhbml0eSwgdGhpcyB3b3JrIGhhcyBpbXBhY3RlZCBhbGwgcGFydHMgb2YgU1dJRyBhdCBhbGwgbGV2ZWxzLgotRXZlbiBhIHZhcmlldHkgb2Ygc3VidGxlIGVycm9ycyBpbiBDIHN1cHBvcnQgaGF2ZSBiZWVuIGZpeGVkIGJ5IHRoaXMKLXdvcmsuCi0KLTxwPgotSW4gYWRkaXRpb24gdG8gdGhlIHR5cGUgc3lzdGVtIHdvcmssIFNXSUctMS4zLjEyIGNvbnRhaW5zIGNvbnRpbnVlZAotcmVkdWN0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4gRGlyZWN0aXZlcyBoYXZlIGJlZW4gcmVtb3ZlZCwKLXJlZmluZWQsIHJlbmFtZWQsIG9yIGNvbnNvbGlkYXRlZC4gIFdlJ3JlIHN0aWxsIG5hcnJvd2luZyB0aGUgZm9jdXMgb2YKLXRoZSBzeXN0ZW0gYW5kIHdvcmtpbmcgdG93YXJkcyBzb21lIGtpbmQgb2YgY29udmVyZ2VuY2UuICAiQ29udmVyZ2VuY2UKLXRvIHdoYXQ/IT8iLCB5b3UgYXNrLgotCi08aDM+U28sIHdoYXQgaXMgU1dJRz88L2gzPgotCi1JbiBhIG51dHNoZWxsLCBTV0lHIGlzIGEgQy9DKysgZGVjbGFyYXRpb24gY29tcGlsZXIgdGhhdCBnZW5lcmF0ZXMKLXdyYXBwZXIgY29kZSAob2theSwgc28geW91IGtuZXcgdGhhdCBtdWNoKS4gIEhvd2V2ZXIsIHRvIHJlYWxseQotdW5kZXJzdGFuZCB3aGF0IFNXSUcgaXMgZG9pbmcgYW5kIHdoZXJlIFNXSUctMS4zLnggaXMgaGVhZGVkLCBpdCBpcwotdXNlZnVsIHRvIGtub3cgdGhhdCB0aGUgd2hvbGUgc3lzdGVtIGlzIGVzc2VudGlhbGx5IGJlaW5nIGJ1aWx0IGFyb3VuZAotdGhyZWUgZXh0ZW5zaW9ucyB0byB0aGUgQysrIHR5cGUgc3lzdGVtOgotCi08dWw+Ci0KLTxsaT48cD48Yj5UeXBlbWFwcy48L2I+ICBUeXBlbWFwcyBhcmUgcnVsZXMgdGhhdCBkZWZpbmUgdGhlIHByb2Nlc3MgYnkgd2hpY2gKLSAgICAgIGRhdGEgaXMgY29udmVydGVkIGJldHdlZW4gbGFuZ3VhZ2VzLiAgIFRoZXkgYXJlIGZ1bGx5IGludGVncmF0ZWQKLSAgICAgIHdpdGggdGhlIEMrKyB0eXBlIHN5c3RlbSBhbmQgdGhleSBhcmUgYXBwbGllZCB1c2luZyBhIHR5cGUtYmFzZWQKLSAgICAgIHBhdHRlcm4gbWF0Y2hpbmcgbWVjaGFuaXNtLiAgQWxsIGRhdGEgY29udmVyc2lvbiBTV0lHIGlzCi0gICAgICBkZWZpbmVkIGJ5IHR5cGVtYXBzIGFuZCBpcyBmdWxseSByZWNvbmZpZ3VyYWJsZS4KLQotPGxpPjxwPjxiPkRlY2xhcmF0aW9uIGFubm90YXRpb24uPC9iPiBUaGVyZSBhcmUgc3BlY2lhbCBkaXJlY3RpdmVzIHRoYXQgbW9kaWZ5Ci0gICAgICB0aGUgd3JhcHBpbmcgYmVoYXZpb3Igb2YgaW5kaXZpZHVhbCBkZWNsYXJhdGlvbnMuIERlY2xhcmF0aW9ucwotICAgICAgY2FuIGJlIHNlbGVjdGl2ZWx5IGlkZW50aWZpZWQgYW5kIGRlY29yYXRlZCB3aXRoIGFyYml0cmFyeQotICAgICAgYXR0cmlidXRlcyB0aGF0IGFmZmVjdCB3cmFwcGVyIGdlbmVyYXRpb24uICBMaWtlIHR5cGVtYXBzLCAKLSAgICAgIGRlY2xhcmF0aW9uIG1hdGNoaW5nIGlzIGZ1bGx5IGludGVncmF0ZWQgd2l0aCB0aGUgQysrIHR5cGUgc3lzdGVtLiAKLSAgICAgIEFsbW9zdCBhbGwgU1dJRyBjdXN0b21pemF0aW9uIGRpcmVjdGl2ZXMgYXJlIGEgZm9ybSBvZiBkZWNsYXJhdGlvbiAKLSAgICAgIGFubm90YXRpb24uICAgCi0KLTxsaT48cD48Yj5DbGFzcyBleHRlbnNpb24uPC9iPiAgVGhlIGFiaWxpdHkgdG8gZXh0ZW5kIGNsYXNzZXMgYW5kIHN0cnVjdHVyZXMKLSAgICAgIHdpdGggbmV3IG1ldGhvZHMvYXR0cmlidXRlcyB3aGVuIGJ1aWxkaW5nIHdyYXBwZXJzLiAgQ2xhc3NlcwotICAgICAgYXJlIHBhcnQgb2YgdGhlIHR5cGUgc3lzdGVtIHNvIGNsYXNzIGV4dGVuc2lvbiBpcyBuYXR1cmFsbHkgCi0gICAgICBpbnRlZ3JhdGVkIHdpdGggdGhlIEMrKyB0eXBlIHN5c3RlbSBhcyB3ZWxsIChiaWcgc3VycHJpc2UpLgotCi08L3VsPgotPHA+Ci1BbmQgdGhhdCdzIGl0LS10aGlzIGlzIHRoZSBlbmQtZ2FtZSBvZiBTV0lHLTEuMy54IGRldmVsb3BtZW50LiAgV2hlbgotc3RhYmlsaXplZCBhbmQgZG9jdW1lbnRlZCBpdCB3aWxsIGJlY29tZSBTV0lHLTIuMC4KLQotPGgzPlRoZSBCaWdnZXIgUGljdHVyZTwvaDM+Ci0KLUkgcmVhbGx5IHdhbnQgdG8gZW1waGFzaXplIHRoYXQgYWxsIG9mIHRoaXMgd29yayBpcyBwYXJ0IG9mIGEgbXVjaAotYmlnZ2VyIHBpY3R1cmUuICBTV0lHIGlzIHVzZWQgYnkgYSBzdXJwcmlzaW5nIG51bWJlciBvZiBwZW9wbGUgaW4KLWluZHVzdHJ5LCBnb3Zlcm5tZW50LCBhbmQgYWNhZGVtaWEuICBJdCdzIHVzZWQgdG8gYnVpbGQgc3lzdGVtcyB1c2VkCi1ieSBtaWxsaW9ucyBvZiBwZW9wbGUgZXZlcnkgZGF5LiAgSXQgaGFzIGV2ZW4gc2hvd24gdXAgaW4gdmlkZW8gZ2FtZXMKLWFuZCBvdGhlciB1bmxpa2VseSBzZXR0aW5ncy4gIEFsdGhvdWdoIFNXSUcgZG9lc24ndCBoYXZlIHRoZSBzYW1lCi12aXNpYmlsaXR5IGFzIG1hbnkgbGFyZ2Ugc29mdHdhcmUgcHJvamVjdHMsIG92ZXIgMTIwMDAgcGVvcGxlIGhhdmUKLWRvd25sb2FkZWQgU1dJRy0xLjMuMTEgaW4gdGhlIGxhc3QgNCBtb250aHMuICBDbGVhcmx5IHNvbWVvbmUgaXMgdXNpbmcKLWl0IGZvciBzb21ldGhpbmchICBCZWNhdXNlIG9mIHRoaXMsIEkgdGhpbmsgaXQgaXMgaW1wb3J0YW50IGZvciB1cyB0bwotd29yayBvbiBtb3ZpbmcgU1dJRyB0b3dhcmRzIGEgbW9yZSBzb2xpZCBmb3VuZGF0aW9uLiAgRG9pbmcgc28gd2lsbAotZ2l2ZSB0aGUgc3lzdGVtIG1vcmUgY3JlZGliaWxpdHkgYW5kIGxvbmcgdGVybSB2aWFiaWxpdHktLS1hbmQgaXQgd2lsbAotYmUgYSBsb3QgbW9yZSBmdW4gdG8gdXNlIQotCi08cD4KLUl0J3MgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB0aGVyZSBhcmUgc29tZSByYXRoZXIgaW50ZXJlc3RpbmcgQ1MKLWNvbm5lY3Rpb25zIGF0IHdvcmsgaGVyZS4gIEV4dGVuc2lvbnMgdG8gdGhlIHR5cGUgc3lzdGVtIGFuZCB0eXBlbWFwcwotaGF2ZSBzb21lIGludGVyZXN0aW5nIHJlbGF0aW9ucyB0byB3b3JrIGluIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIFRoZQotU1dJRyBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIHN5c3RlbSBhbmQgY2xhc3MgZXh0ZW5zaW9uIGZlYXR1cmUgc2VlbQotb2RkbHkgc2ltaWxhciB0byB3b3JrIGluIHRoZSBlbWVyZ2luZyBhcmVhIG9mIEFzcGVjdCBPcmllbnRlZAotUHJvZ3JhbW1pbmcgKEFPUCkuICBUaGVyZSBhcmUgdW5kb3VidGVkbHkgY29ubmVjdGlvbnMgdG8gb3RoZXIgYXJlYXMKLW9mIHNvZnR3YXJlIGVuZ2luZWVyaW5nIGFuZCBhcmNoaXRlY3R1cmUuCi0KLTxwPgotVGhlIGtleSBwb2ludCBpcyB0aGF0IFNXSUcgaXNuJ3QgZ29pbmcgdG8gY29ubmVjdCB0byBhbnl0aGluZyBpZgotbm8tb25lIGNhbiBxdWl0ZSBkZXNjcmliZSB3aGF0IGl0IGlzIG9yIGhvdyBpdCB3b3Jrcy4KLQotPGgzPlNXSUctMi4wIGFuZCB0aGUgRnV0dXJlPC9oMz4KLQotU1dJRy0xLjMuMTIgc3RpbGwgcmVwcmVzZW50cyB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBhcmUgYnVncywgdGhlCi1kb2N1bWVudGF0aW9uIGlzIHN0aWxsIGluY29tcGxldGUsIGFuZCB0aGVyZSBhcmUgcGFydHMgb2YgdGhlCi1pbXBsZW1lbnRhdGlvbiB0aGF0IGFyZSByYXRoZXIgdWdseS4gIFdlIGFyZSBhbHNvIHN0aWxsIHdvcmtpbmcgb3V0IGEKLWZldyB2ZXJ5IGhhcmQgcHJvYmxlbXMgbGlrZSBuZXN0ZWQgY2xhc3NlcywgY2FsbGJhY2sgZnVuY3Rpb25zLCBhbmQKLW92ZXJsb2FkaW5nLiAgQSBmZXcgb2xkIGZlYXR1cmVzIGFyZSBzdGlsbCBtaXNzaW5nIChPYmplY3RpdmUtQywKLWRvY3VtZW50YXRpb24pLiAgSG93ZXZlciwgSSBiZWxpZXZlIHRoZSBlbmQgb2YgdGhlIDEuMy54IHNlcmllcyBpcwotbmVhciBhbmQgYWNoaWV2YWJsZS4KLQotPHA+Ci1PdmVyIHRoZSBzdW1tZXIsIGEgZmV3IG1vcmUgMS4zLnggcmVsZWFzZXMgbWF5IGFwcGVhciBidXQgdGhlIGN1cnJlbnQKLXBsYW4gaXMgdG8gYWltIGZvciBhIFNXSUctMi4wIHJlbGVhc2UgaW4gU2VwdGVtYmVyLiAgVGhpcyByZWxlYXNlIGlzCi1yZWFsbHkgbW92aW5nIHRvd2FyZHMgdGhlIGRlc2lnbiBwcmluY2lwbGVzIGRlc2NyaWJlZCBhYm92ZSBhbmQgd2lsbAotYmUgYSB2ZXJ5IG1ham9yIGVuaGFuY2VtZW50IG92ZXIgU1dJRy0xLjEuCi0KLTxwPgotQXMgZm9yIHRoZSBmdXR1cmUsIGEgbnVtYmVyIG9mIGludGVyZXN0aW5nIGlkZWFzIGFyZSBvbiB0aGUgdGFibGUuICBJCi13YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb250cmFjdHMvYXNzZXJ0aW9ucyBpbiBvcmRlciB0byBzb2x2ZSBzb21lCi1yZWxpYWJpbGl0eSBpc3N1ZXMgdGhhdCBhcmlzZSB3aGVuIHJldHJvZml0dGluZyBsZWdhY3kgY29kZXMgd2l0aCBhCi1zY3JpcHRpbmcgaW50ZXJmYWNlLiAgU3VwcG9ydCBmb3IgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlIGhhcyBiZWVuCi1wcm9tb3RlZCBieSBEYXZpZCBGbGV0Y2hlciBhbmQgd2FzIHN1Z2dlc3RlZCBieSBzb21lb25lIGVsc2Ugb24gdGhlCi1tYWlsaW5nIGxpc3QgcmF0aGVyIHJlY2VudGx5LiAgSSBoYXZlIGEgZ3JhZHVhdGUgc3R1ZGVudCB3b3JraW5nIG9uCi1TV0lHIHN1cHBvcnQgZm9yIHRoZSBNaWNyb3NvZnQgQ0xSIGFuZCAuTkVUIGxhbmd1YWdlcy4gIE90aGVyIHdvcmsKLW1pZ2h0IGluY2x1ZGUgc3VwcG9ydCBmb3IgYWx0ZXJuYXRpdmUgcGFyc2VycywgZHluYW1pY2FsbHkgbG9hZGFibGUKLWxhbmd1YWdlIG1vZHVsZXMsIGFuZCBzbyBmb3J0aC4gIEhvd2V2ZXIsIG5vbmUgb2YgdGhpcyBpcyByZWFsbHkgZ29pbmcKLXRvIG1hdGVyaWFsaXplIGlmIHdlIGNhbid0IGdldCB0aGUgMi4wIHJlbGVhc2Ugc3RhYmxpemVkLiAgSW4gZmFjdCwgSQotc2VlIFNXSUctMi4wIGFzIGEgbmVjZXNzYXJ5IHN0ZXAgZm9yIG1vdmluZyBmb3J3YXJkIHdpdGggdGhlc2UgaWRlYXMuCi0KLTxoMz5XZSBuZWVkIHlvdXIgaGVscCEgWWVzLCB5b3UuPC9oMz4KLQotTm9ib2R5IGdldHMgcGFpZCB0byB3b3JrIG9uIFNXSUcuICBUaGUgZGV2ZWxvcGVycyBhcmUgdm9sdW50ZWVycyB3aG8KLXdvcmsgaW4gdGhlaXIgc3BhcmUgdGltZS4gIEZ1cnRoZXJtb3JlLCBTV0lHIGlzIG5vdCBzdXBwb3J0ZWQgYnkKLWludmVzdG9ycywgYSBsYXJnZSBjb3Jwb3JhdGlvbiwgb3IgcmVzZWFyY2ggZ3JhbnRzLiAgSSB3b3JrIG9uIGl0Ci1iZWNhdXNlIGl0J3MgZnVuLCBjaGFsbGVuZ2luZywgYW5kIHVzZWZ1bC4gIEkgcHJlc3VtZSB0aGF0IG90aGVyCi1kZXZlbG9wZXJzIGRvIHRoZSBzYW1lLiAgSG93ZXZlciwgd2Ugb25seSBoYXZlIGxpbWl0ZWQgcmVzb3VyY2VzIGFuZAotd2UgbmVlZCB5b3VyIGhlbHAuCi0KLTx1bD4KLTxsaT48cD4KLUlmIHlvdSBsaWtlIFNXSUcgYW5kIGZpbmQgaXQgdXNlZnVsLCB3ZSBuZWVkIHlvdSB0byB0cnkgbmV3IHZlcnNpb25zLgotICAgV2Ugd2FudCB5b3UgdG8gdG9ydHVyZSB0ZXN0IHRoZSByZWxlYXNlcyBhbmQgdG8gYnJlYWsgdGhlbS4gIFdlIG5lZWQKLSAgIGJ1ZyByZXBvcnRzLiBObyBidWcgaXMgdG9vIG9ic2N1cmUgb3IgdW5pbXBvcnRhbnQtLS13ZSAqd2lsbCogZml4IGl0Ci0gICBpZiB3ZSBjYW4uICBXZSBhbHNvIG5lZWQgZmVlZGJhY2sgYWJvdXQgdGhpbmdzIHRoYXQgYXJlIGFubm95aW5nIG9yCi0gICBjb21wYXRpYmlsaXR5IGZlYXR1cmVzIHRoYXQgbWlnaHQgaGVscCBpbiBnb2luZyBmcm9tIDEuMSB0byAyLjAuCi0KLTxsaT48cD4gV2UgbmVlZCBoZWxwIHdpdGggZG9jdW1lbnRhdGlvbiwgZXhhbXBsZXMsIHRlc3RpbmcsIGxpYnJhcmllcywgYW5kIGFsbAotICAgc29ydHMgb2Ygb3RoZXIgYXNwZWN0cyBvZiB0aGUgcmVsZWFzZS4gIEV2ZW4gaWYgeW91IGhhdmUgbmV2ZXIKLSAgIHdyaXR0ZW4gYSBTV0lHIGxhbmd1YWdlIG1vZHVsZSBvciBkaXZlZCBpbnRvIGl0cyBpbXBsZW1lbnRhdGlvbiwKLSAgIHRoZXJlIGFyZSBtYW55IHdheXMgdGhhdCB5b3UgY2FuIGhlbHAuICBDb25zaWRlciB3cml0aW5nIGEgY2FzZSBzdHVkeQotICAgYWJvdXQgaG93IHlvdSB3cmFwcGVkIGEgYmlnIGxpYnJhcnkuICBDb250cmlidXRlIHRlc3RzIHRoYXQgYnJlYWsgdGhlCi0gICBpbXBsZW1lbnRhdGlvbiBpbiBob3JyaWJsZSB3YXlzLiAgSGVscCB3aXRoIHRoZSB3ZWIgcGFnZSBvciBGQVEuCi0KLTxsaT48cD4gTW9zdCBvZiB0aGUgU1dJRy0xLjMueCB3b3JrIGhhcyBmb2N1c2VkIG9uIHRoZSBTV0lHIGNvcmUuICBIb3dldmVyLCBhcwotICAgdGhlIDIuMCByZWxlYXNlIG5lYXJzLCB3ZSB3aWxsIGJlIHdvcmtpbmcgb24gYSB2YXJpZXR5IG9mIGVuaGFuY2VtZW50cwotICAgdG8gdGhlIGxhbmd1YWdlIG1vZHVsZXMuICBJZiB0aGVyZSBhcmUgdGhpbmdzIHlvdSB3b3VsZCBsaWtlIHRvIHNlZQotICAgaW4gYW55IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzLCB5b3UgbmVlZCB0byBsZXQgdXMga25vdy4KLQotPGxpPjxwPiBUaGVyZSBhcmUgU1dJRyBsYW5ndWFnZSBtb2R1bGVzIHRoYXQgaGF2ZSBub3QgbWFkZSBpdCBpbnRvIHRoZQotICAgZGlzdHJpYnV0aW9uLiAgRXhhbXBsZXMgdGhhdCBJIGtub3cgYWJvdXQgaW5jbHVkZSBJVENMLCBTd2lnLUVpZmZlbCwKLSAgIGFuZCBTd2lnLUx1YS4gIFdlIHdvdWxkIGdsYWRseSBtYWtlIHRoZXNlIHBhcnQgb2YgdGhlIHN0YW5kYXJkIFNXSUcKLSAgIGRpc3RyaWJ1dGlvbi4gIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCBoZWxwIHRvIGRvIGl0LiAgUG9ydGluZyBmcm9tCi0gICBTV0lHLTEuMSBpcyBubyBlYXN5IHRhc2ssIGJ1dCB3ZSdyZSBtb3JlIHRoYW4gd2lsbGluZyB0byBoZWxwLiAgSXQncwotICAgbm90IGFzIGJhZCBhcyBvbmUgbWlnaHQgaW1hZ2luZS4KLQotPGxpPjxwPiBXZSBhcmUgYWx3YXlzIGxvb2tpbmcgZm9yIGRldmVsb3BlcnMuICBTdWJzY3JpYmUgdG8KLSAgIHRvIHRoZSA8YSBocmVmPSJtYWlsLmh0bWwiPnN3aWctZGV2ZWw8L2E+IG1haWxpbmcgbGlzdAotICAgb3Igc2VuZCBtZSBlbWFpbCB0byBnZXQgaW52b2x2ZWQuCi08L3VsPgotCi08aDM+QWNrbm93bGVkZ2VtZW50czwvaDM+Ci0KLUknZCBqdXN0IGxpa2UgdG8gdGhhbmsgZXZlcnlvbmUgd2hvIGhhcyBzdWJtaXR0ZWQgZmVlZGJhY2ssIGJ1Z3MsIG1hZGUKLWNvbnRyaWJ1dGlvbnMsIGFuZCBwdXQgdXAgd2l0aCBteSBvY2Nhc2lvbmFsIHRocmFzaGluZyBvdmVyIHRoZSB5ZWFycy4gCi1JIHdlbGNvbWUgYW55IGNvbW1lbnRzIGFib3V0IHRoaXMgZG9jdW1lbnQgYW5kIGhvdyB3ZSBjYW4gbWFrZSBTV0lHIGV2ZW4KLWJldHRlci4KLQotPHA+Ci1EYXZlIEJlYXpsZXkgKGJlYXpsZXlAY3MudWNoaWNhZ28uZWR1KSA8YnI+Ci1KdW5lIDIsIDIwMDIKLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9ndWlsdHkuaHQgYi9zd2lnd2ViL2d1aWx0eS5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ZjI3MC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2d1aWx0eS5odAorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi1HdWlsdHkgUGFydGllcwotCi08cD48aW1nIHNyYz0iaW1hZ2VzL2d1aWx0eS5wbmciIGFsdD0iR3VpbHR5IFBhcnRpZXMiPgotCi08cD4KLTxiPkFjdGl2ZSBEZXZlbG9wZXJzPC9iPgotCi08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz04IHdpZHRoPSIxMDAlIiBib3JkZXI9MCBzdW1tYXJ5PSJEZXZlbG9wZXIgbXVnc2hvdHMiPgotPHRyPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9EYXZlMy5qcGciIGFsdD0iRGF2ZSBCZWF6bGV5Ij48YnI+Ci08Yj5EYXZlIEJlYXpsZXkgKENoaWNhZ28sIElsbGlub2lzKS48L2I+PGJyPgotU1dJRyBjb3JlLCB0eXBlIHN5c3RlbSwgUHl0aG9uLCBUY2wsIFBlcmwuCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9sdWlnaS5qcGciIGFsdD0iTHVpZ2kgQmFsbGFiaW8iPjxicj4KLTxiPkx1aWdpIEJhbGxhYmlvIChNaWxhbm8sIEl0YWx5KS48L2I+PGJyPgotU1RMIGxpYnJhcmllcyAoUHl0aG9uLCBSdWJ5LCAgTXpTY2hlbWUsIEd1aWxlKS4KLTwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQ+Ci08aW1nIHNyYz0iaW1hZ2VzL2Z1bHRvbjMuanBnIiBhbHQ9IldpbGxpYW0gRnVsdG9uIj48YnI+Ci08Yj5XaWxsaWFtIEZ1bHRvbiAoQmF0aCwgVUspLjwvYj4gPGJyPgotSmF2YSBhbmQgQyMgbW9kdWxlcy4gQ3lnd2luL1dpbmRvd3MuCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9seWxlLmpwZyIgYWx0PSJMeWxlIEpvaG5zb24iPjxicj4KLTxiPkx5bGUgSm9obnNvbiAoTWFkaXNvbiwgQWxhYmFtYSkuPC9iPjxicj4KLVJ1YnkgbW9kdWxlLgotPC90ZD4KLTwvdHI+Ci0KLTx0cj4KLTx0ZD4KLTxpbWcgc3JjPSJpbWFnZXMvbWtvZXBwZS5qcGciIGFsdD0iTWF0dGhpYXMgS/ZwcGUiPjxicj4KLTxiPk1hdHRoaWFzIEv2cHBlIChNYWdkZWJ1cmcsIEdlcm1hbnkpLjwvYj4gPGJyPgotR3VpbGUgbW9kdWxlLgotPC90ZD4KLTx0ZD4KLTxpbWcgc3JjPSJpbWFnZXMvbGVuei5qcGciIGFsdD0iSm9obiBMZW56IChNYWRpc29uLCBXaXNjb25zaW4pIj48YnI+Ci08Yj5Kb2huIExlbno8L2I+ICA8YnI+Ci1DaGlja2VuLCBHdWlsZSwgYW5kIE16U2NoZW1lIG1vZHVsZXMsIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9tYXJjZWxvLmpwZyIgYWx0PSJNYXJjZWxvIE1hdHVzIj48YnI+Ci08Yj5NYXJjZWxvIE1hdHVzIChBQ01TLCBUdXNjb24sIEFaKS48L2I+IDxicj4KLUV2aWwgQysrIHRlc3RpbmcsIFNXSUcgY29yZSwgdGVtcGxhdGUgc3VwcG9ydCwgU1RMLAotUHl0aG9uLCBhbmQgUnVieSBhbmQgVGNsIHdoZW4gbmVlZGVkCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImJsYW5rLmpwZyIgYWx0PSJCbGFuayI+PGJyPgotPGI+SmFzb24gU3Rld2FydCAoQWxidXF1ZXJxdWUsIE5ldyBNZXhpY28pLjwvYj4gPGJyPgotUGVybCBtb2R1bGUuCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9hcnR5LmpwZyIgYWx0PSJBcnQgWWVya2VzIj48YnI+Ci08Yj5BcnQgWWVya2VzIChDaGljYWdvLCBJbGxpbm9pcykuPC9iPiA8YnI+Ci1PQ0FNTCBtb2R1bGUuCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy95b3NoaWtpLmpwZyIgYWx0PSJTaGlidWthd2EgWW9zaGlraSI+PGJyPgotPGI+U2hpYnVrYXdhIFlvc2hpa2kgKFRva3lvLCBKYXBhbikuPC9iPiA8YnI+Ci1KYXBhbmVzZSB0cmFuc2xhdGlvbi4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPHA+Ci08Yj5TdHVkZW50czwvYj4KLTx1bD4KLTxsaT5Tb25neWFuIEZlbmcgKENoaWNhZ28pLgotPGxpPlhpbmdodWEgU2hpIChDaGljYWdvKS4gCi08bGk+SmluZyBDYW8gKENoaWNhZ28pLgotPGxpPkFxdWluYXMgSG9ib3IgKENoaWNhZ28pLgotPC91bD4KLQotPHA+Ci08Yj5NYWpvciBjb250cmlidXRvcnM8L2I+Ci0KLTx1bD4KLTxsaT5UaGllbi1UaGkgTmd1eWVuIAotPGxpPkxvaWMgRGFjaGFyeQotPGxpPk9sZWcgVG9sbWF0Y2V2Ci08bGk+TWFzYWtpIEZ1a3VzaGltYQotPGxpPkVkd2FyZCBaaW1tZXJtYW5uCi08bGk+RGF2aWQgQXNjaGVyCi08bGk+Sm9obiBCdWNrbWFuCi08bGk+S2V2aW4gQnV0bGVyCi08bGk+RG9taW5pcXVlIER1bW9udAotPGxpPlBpZXIgR2lvcmdpbyBFc3Bvc2l0bwotPGxpPkRhdmlkIEZsZXRjaGVyCi08bGk+R2FyeSBIb2x0Ci08bGk+SGFyY28gZGUgSGlsc3RlcgotPGxpPkR1c3RpbiBNaXRjaGVsbAotPGxpPklhbiBDb29rZQotPGxpPkhhc2FuIEJhcmFuIEtvdnVrCi08bGk+S2xhdXMgV2llZGVy5G5kZXJzCi08bGk+UmljaGFyZCBQYWxtZXIKLTxsaT5TYW0gTGlkZGljb3R0Ci08L3VsPgotCi08cD4KLTxiPkJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzPC9iPgotPGJsb2NrcXVvdGU+Ci1BZGFtIEh1cHAsCi1CcmFkIENsZW1lbnRzLAotQnJldHQgV2lsbGlhbXMsCi1CdWNrIEhvZGdlcywKLUJ1cmtoYXJkIEtsb3NzLAotQ2hpYS1MaWFuZyBLYW8sCi1DcmFpZyBGaWxlcywgCi1EZW5uaXMgTWFyc2EsCi1EaWV0ZXIgQmFyb24sCi1EcmFrZSBEaWVkcmljaCwKLUZsZXVyIERpYW5hIERyYWdhbiwKLUdhcnkgUGVubmluZ3RvbiwKLUdlb2ZmcmV5IEhvcnQsCi1HZXJhbGQgV2lsbGlhbXMsCi1HcmVnIEFuZGVyc29uLAotR3JlZyBLb2NoYW5za2ksCi1HcmVnIFRyb3hlbCwKLUhlbnJ5IFJvd2xleS4KLUlyaW5hIEtvdGxvdmEsCi1Jc3JhZWwgVGFsbGVyLAotSmFtZXMgQmFpbGV5LAotSmltIEZ1bHRvbiwKLUpvZWwgUmVlZCwKLUpvbiBUcmF2aXMsCi1KdW5pbyBIYW1hbm8sCi1LYXJsIEZvcm5lciwKLUtlaXRoIERhdmlkc29uLAotS3J6eXN6dG9mIEtvem1pbnNraSwKLUxhcnJ5IFZpcmRlbiwgCi1NYWdudXMgTGp1bmcsCi1NYXJjIFpvbnpvbiwKLU1hcmNpbyBMdWlzIFRlaXhlaXJhCi1NYXJrIEhvd3NvbiwKLU1pY2FoZWwgU2NoYXJmLAotTWljaGVsIFNhbm5lciwKLU1pa2UgUm9tYmVyZywKLU1pa2UgU2ltb25zLAotTWlrZSBXZWlibGVuLAotUGF1bCBCcmFubmFuLAotUmFtIEJoYW1pZGlwYXR5LAotUmVpbmhhcmQgRm9iYmUsCi1SaWNoIFdhbGVzLAotUmljaGFyZCBTYWx6LAotUm9iaW4gRHVubiwKLVJveSBMZWNhdGVzLAotUnVkeSBBbGJhY2h0ZW4sCi1TY290dCBEcnVtbW9uZHMKLVNjb3R0IE1pY2hlbCwgCi1TaGF1biBMb3dyeSwKLVN0ZXZlIEdhbHNlciwgCi1UYWwgU2hhbGlmLAotVGFybiBXZWlzbmVyIEJ1cnRvbiwKLVRvbnkgU2V3YXJkLAotVXdlIFN0ZWlubWFubiwKLVZhZGltIENodWd1bm92LAotV3lzcyBDbGVtZW5zLAotWmhvbmcgUmVuLiAKLTwvYmxvY2txdW90ZT4KLQotPHA+PGI+RnJpZW5kczwvYj4KLTx1bD4KLTxsaT5UaGUgRiBzdHJlZXQgY3JldwotPGxpPlBldGVyIExvbWRhaGwKLTxsaT5UaW0gR2VybWFubgotPGxpPkNocmlzIE15ZXJzCi08bGk+Sm9obiBTY2htaWR0Ci08bGk+UGF1bCBEdWJvaXMKLTxsaT5LdXJ0aXMgQmxlZWtlcgotPGxpPkxhcnJ5IFZpcmRlbgotPGxpPlBldGVyLVBpa2UgU2xvYW4KLTxsaT5QYXRyaWNrIFR1bGxtYW5uCi08L3VsPgotCi1BcG9sb2dpZXMgdG8gYW55b25lIG1pc3NlZC4uLi4KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaGlzdG9yeS5odCBiL3N3aWd3ZWIvaGlzdG9yeS5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4MTAzMC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2hpc3RvcnkuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1TV0lHIEhpc3RvcnkKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2hpc3RvcnkucG5nIiBhbHQ9Ikhpc3RvcnkiPgotCi08cD4KLUp1c3QgdGhlIGZhY3RzOgotCi08dWw+Ci08bGk+SnVseSwgMTk5NS4gRGF2ZSBkZXZlbG9wcyBTV0lHIHdoaWxlIHdvcmtpbmcgaW4gdGhlIFRoZW9yZXRpY2FsCi1QaHlzaWNzIERpdmlzaW9uIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4gIE9yaWdpbmFsbHksIGl0Ci13YXMgY29uY2VpdmVkIGFzIGFuIGV4dGVuc2lvbiBidWlsZGluZyB0b29sIGZvciBhIGN1c3RvbWl6ZWQgc2NyaXB0aW5nCi1sYW5ndWFnZSB0aGF0IGhhZCBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBDb25uZWN0aW9uIE1hY2hpbmUgNS4KLQotPGxpPkphbnVhcnksIDE5OTYuIFNXSUcgcmV3cml0dGVuIGluIEMrKyBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIGFuZCBleHBhbmRlZCB0byBjb3ZlciBUY2wsIFBlcmwsIGFuZCBHdWlsZS4KLQotPGxpPkZlYnJ1YXJ5LCAxOTk2LiBGaXJzdCBhbHBoYSByZWxlYXNlLgotCi08bGk+U2VwdGVtYmVyLCAxOTk2LiBWZXJzaW9uIDEuMCByZWxlYXNlZC4gIFN1cHBvcnQgZm9yIFB5dGhvbiBhZGRlZC4KLQotPGxpPlNlcHRlbWJlciwgMTk5Ny4gVmVyc2lvbiAxLjEgcmVsZWFzZWQgd2l0aCBhIHZhcmlldHkgb2YgaW1wcm92ZW1lbnRzIHN1Y2ggYXMgc2hhZG93IGNsYXNzZXMuCi0KLTxsaT5GZWJydWFyeSwgMTk5OC4gU1dJRzEuMXA1IHJlbGVhc2VkLgotCi08bGk+MTk5Ny0xOTk5LiAgVmFyaW91cyB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdHMgdG8gY3JlYXRlIFNXSUcyLjAuCi1Bc2lkZSBmcm9tIHZhcmlvdXMgc2Vjb25kIHN5c3RlbSBlZmZlY3RzLCB0aGVyZSB3ZXJlIG90aGVyCi1kaXN0cmFjdGlvbnMgc3VjaCBhcyBhIGRpc3NlcnRhdGlvbiBhbmQgc2VhcmNoaW5nIGZvciBhIGpvYi4gIEFsbAotb2YgdGhpcyB3b3JrIHdhcyBhYmFuZG9uZWQgYWx0aG91Z2ggcGFydHMgb2YgaXQgYXJlIGZvdW5kIGluCi1uZXdlciBTV0lHIHJlbGVhc2VzLgotCi08bGk+SnVseSwgMTk5OC4gU1dJRyBkZXZlbG9wbWVudCBtb3ZlcyB0byB0aGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvLgotCi08bGk+SmFudWFyeSAxLCAyMDAwLiAgRGF2ZSBzdXJ2aXZlcyBoaXMgbW9zdCBwbGVhc2FudCBZMksgZmxpZ2h0IHRvIENoaWNhZ28gTydIYXJlLgotCi08bGk+RmVicnVhcnkgMTEsIDIwMDAuIFNXSUcxLjMgYWxwaGEgcmVsZWFzZWQuICAgVGhpcyBpcyB0aGUgZmlyc3QgaW4KLWEgc2VyaWVzIG9mIHJlbGVhc2VzIHRoYXQgc2xvd2x5IG1pZ3JhdGUgbW9zdCBvZiBTV0lHJ3MgaW1wbGVtZW50YXRpb24KLWJhY2sgdG8gQU5TSSBDLgotCi08bGk+TWFyY2ggMSwgMjAwMC4gU1dJRzEuM2EyIHJlbGVhc2VkLgotPGxpPkp1bmUgMTgsIDIwMDAuIFNXSUcxLjNhMyByZWxlYXNlZC4KLTxsaT5TZXB0ZW1iZXIgNCwgMjAwMC4gU1dJRzEuM2E0IHJlbGVhc2VkLgotPGxpPlNlcHRlbWJlciAyMiwgMjAwMC4gU1dJRzEuM2E1IHJlbGVhc2VkLgotPGxpPkp1bHkgOSwgMjAwMS4gU1dJRy0xLjMuNiByZWxlYXNlZC4KLTxsaT5TZXB0ZW1iZXIgMywgMjAwMS4gU1dJRy0xLjMuNyByZWxlYXNlZC4gIFN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgYmV0dGVyCi1oYW5kbGluZyBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhZGRlZC4KLTxsaT5TZXB0ZW1iZXIgMjMsIDIwMDEuIFNXSUctMS4zLjggcmVsZWFzZWQuCi08bGk+U2VwdGVtYmVyIDI1LCAyMDAxLiBTV0lHLTEuMy45IHJlbGVhc2VkLgotPGxpPkRlY2VtYmVyIDEwLCAyMDAxLiBTV0lHLTEuMy4xMCByZWxlYXNlZC4KLTxsaT5KYW51YXJ5IDMxLCAyMDAyLiBTV0lHLTEuMy4xMSByZWxlYXNlZC4KLTxsaT5KdW5lIDIsIDIwMDIuIFNXSUctMS4zLjEyIHJlbGVhc2VkLgotPGxpPkp1bmUgMTcsIDIwMDIuIFNXSUctMS4zLjEzIHJlbGVhc2VkLgotPGxpPkF1Z3VzdCAxMiwgMjAwMi4gU1dJRy0xLjMuMTQgcmVsZWFzZWQuCi08bGk+U2VwdGVtYmVyIDksIDIwMDIuIFNXSUctMS4zLjE1IHJlbGVhc2VkLgotPGxpPk9jdG9iZXIgMTQsIDIwMDIuIFNXSUctMS4zLjE2IHJlbGVhc2VkLgotPGxpPk5vdmVtYmVyIDIyLCAyMDAyLiBTV0lHLTEuMy4xNyByZWxlYXNlZC4KLTxsaT5NYXJjaCAyMywgMjAwMy4gU1dJRy0xLjMuMTggcmVsZWFzZWQuCi08bGk+TWFyY2ggMjgsIDIwMDMuIFNXSUctMS4zLjE5IHJlbGVhc2VkLgotPGxpPkRlY2VtYmVyIDE3LCAyMDAzLiBTV0lHLTEuMy4yMCByZWxlYXNlZC4KLTxsaT5KYW51YXJ5IDE3LCAyMDA0LiBTV0lHLTEuMy4yMSByZWxlYXNlZC4KLTxsaT5TZXB0ZW1iZXIgNCwgMjAwNC4gU1dJRy0xLjMuMjIgcmVsZWFzZWQuCi08bGk+Tm92ZW1iZXIgMTEsIDIwMDQuIFNXSUctMS4zLjIzIHJlbGVhc2VkLgotPGxpPkRlY2VtYmVyIDE0LCAyMDA0LiBTV0lHLTEuMy4yNCByZWxlYXNlZC4KLTxsaT5KdW5lIDExLCAyMDA1LiBTV0lHLTEuMy4yNSByZWxlYXNlZC4KLTwvdWw+Ci0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvRGF2ZTIuanBnIGIvc3dpZ3dlYi9pbWFnZXMvRGF2ZTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODAwMzg2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL0RhdmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL0RhdmUzLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL0RhdmUzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0Y2E1NS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9EYXZlMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9hcnR5LmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2FydHkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2YzNTU0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2FydHkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvYmxlZWQucG5nIGIvc3dpZ3dlYi9pbWFnZXMvYmxlZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjJhMDE1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2JsZWVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2J1Z3MucG5nIGIvc3dpZ3dlYi9pbWFnZXMvYnVncy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmMwZmIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvYnVncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9idXJuZ2lmcy5wbmcgYi9zd2lnd2ViL2ltYWdlcy9idXJuZ2lmcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDYxNjcuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvYnVybmdpZnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvY29kZXJ1bnMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY29kZXJ1bnMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGE0ZDg0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2NvZGVydW5zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2NvZGV3b3Jrcy5wbmcgYi9zd2lnd2ViL2ltYWdlcy9jb2Rld29ya3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjllOWFiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2NvZGV3b3Jrcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9jb21wYXQucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY29tcGF0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzZDFmZC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9jb21wYXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvY29weXJpZ2h0LnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2NvcHlyaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDNmMWMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvY29weXJpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2N1cmUucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY3VyZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGYwYTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvY3VyZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9jdnMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY3ZzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyYjIxMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9jdnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvZG9jLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2RvYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMjczMTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvZG9jLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2Rvd25sb2FkLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2Rvd25sb2FkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3MmI0Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9kb3dubG9hZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9leGVjLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2V4ZWMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmUxNmRiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2V4ZWMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvZmFxLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2ZhcS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTJiMWYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvZmFxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2Z1bHRvbjMuanBnIGIvc3dpZ3dlYi9pbWFnZXMvZnVsdG9uMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTA3MzguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvZnVsdG9uMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9ndWlsdHkucG5nIGIvc3dpZ3dlYi9pbWFnZXMvZ3VpbHR5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhMWU1Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9ndWlsdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvaGlzdG9yeS5wbmcgYi9zd2lnd2ViL2ltYWdlcy9oaXN0b3J5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5ZjYxMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9oaXN0b3J5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2lzbC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9pc2wucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZiODI1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2lzbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9sZW56LmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2xlbnouanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjExOTViLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2xlbnouanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvbGlua3MucG5nIGIvc3dpZ3dlYi9pbWFnZXMvbGlua3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjViYzY5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2xpbmtzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2x1aWdpLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2x1aWdpLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5ZDM0My4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9sdWlnaS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9seWxlLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2x5bGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Q0YmU5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2x5bGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvbWFpbC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9tYWlsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliN2I5OS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9tYWlsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL21hcmNlbG8uanBnIGIvc3dpZ3dlYi9pbWFnZXMvbWFyY2Vsby5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNWMzNmIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvbWFyY2Vsby5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9ta29lcHBlLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL21rb2VwcGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTYyNDMyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL21rb2VwcGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvcHJvamVjdHMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvcHJvamVjdHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFhN2E5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3Byb2plY3RzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3Byb3BhZ2FuZGEucG5nIGIvc3dpZ3dlYi9pbWFnZXMvcHJvcGFnYW5kYS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MzEyOWQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvcHJvcGFnYW5kYS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9yYW50cy5wbmcgYi9zd2lnd2ViL2ltYWdlcy9yYW50cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZWJjYzQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvcmFudHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvcmF2ZXMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvcmF2ZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE2NDYxLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3JhdmVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3NhbS5qcGcgYi9zd2lnd2ViL2ltYWdlcy9zYW0uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQ0NTY3Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3NhbS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW4ucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc2NyZWVuLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjN2E3Mi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc2NyZWVuc2hvdC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zY3JlZW5zaG90LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlZTljNS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW5zaG90LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3NjcmVlbnNob3QyLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3NjcmVlbnNob3QyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhZjY3ZC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW5zaG90Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zdWJ2ZXJzaW9uLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N1YnZlcnNpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjI0MmNkLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3N1YnZlcnNpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEwLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmNiMmUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMS5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zd2lnMTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk4ZDM2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTIucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc3dpZzEyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5N2I3NC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEzLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDkwOTguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxNS5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zd2lnMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZhNDI1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTYucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc3dpZzE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmM2FkYy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzE3LnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMzg1YmYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzE3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWc3LnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWc3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhOTdiYi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zd2lnNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zd2lnOC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zd2lnOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTUwMjEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZ2ZpbGVzLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWdmaWxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmFhNWUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZ2ZpbGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWdvcmcucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc3dpZ29yZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Yjc5MzMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZ29yZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy90dXRvcmlhbC5wbmcgYi9zd2lnd2ViL2ltYWdlcy90dXRvcmlhbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzkxNTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvdHV0b3JpYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMveTJrLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3kyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzE1MjIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMveTJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3lvc2hpa2kuanBnIGIvc3dpZ3dlYi9pbWFnZXMveW9zaGlraS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTU4YTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMveW9zaGlraS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2luZGV4Lmh0IGIvc3dpZ3dlYi9pbmRleC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1OGM3Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2luZGV4Lmh0CisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLVNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvcgotCi08aDI+V2VsY29tZSB0byBTV0lHPC9oMj4KLQotWyA8YSBocmVmPSJodHRwOi8vc3dpZy1qcC5keW5kbnMub3JnIj5KYXBhbmVzZTwvYT4gXQotCi08cD4KLVNXSUcgaXMgYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCB0b29sIHRoYXQgY29ubmVjdHMgcHJvZ3JhbXMgd3JpdHRlbiBpbgotQyBhbmQgQysrIHdpdGggYSB2YXJpZXR5IG9mIGhpZ2gtbGV2ZWwgcHJvZ3JhbW1pbmcKLWxhbmd1YWdlcy4gIFNXSUcgaXMgdXNlZCB3aXRoIGRpZmZlcmVudCB0eXBlcyBvZiBsYW5ndWFnZXMgaW5jbHVkaW5nIGNvbW1vbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1Y2ggYXMKLVBlcmwsIFBIUCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIFBIUC4gVGhlIGxpc3Qgb2YgCi08YSBocmVmPSJjb21wYXQuaHRtbCNTdXBwb3J0ZWRMYW5ndWFnZXMiPnN1cHBvcnRlZCBsYW5ndWFnZXM8L2E+IGFsc28gaW5jbHVkZXMgCi1ub24tc2NyaXB0aW5nIGxhbmd1YWdlcyBzdWNoIGFzIEMjLCBDb21tb24gTGlzcCAoQ0xJU1AsIEFsbGVncm8gQ0wsIFVGRkkpLCBKYXZhLCBNb2R1bGEtMyBhbmQgT0NBTUwuIEFsc28gc2V2ZXJhbAotaW50ZXJwcmV0ZWQgYW5kIGNvbXBpbGVkIFNjaGVtZSBpbXBsZW1lbnRhdGlvbnMgKEd1aWxlLCBNelNjaGVtZSwgQ2hpY2tlbikKLWFyZSBzdXBwb3J0ZWQuIFNXSUcgaXMgbW9zdAotY29tbW9ubHkgdXNlZCB0byBjcmVhdGUgaGlnaC1sZXZlbCBpbnRlcnByZXRlZCBvciBjb21waWxlZCBwcm9ncmFtbWluZwotZW52aXJvbm1lbnRzLCB1c2VyIGludGVyZmFjZXMsIGFuZCBhcyBhIHRvb2wgZm9yIHRlc3RpbmcgYW5kIHByb3RvdHlwaW5nIEMvQysrCi1zb2Z0d2FyZS4gIFNXSUcgY2FuIGFsc28gZXhwb3J0IGl0cyBwYXJzZSB0cmVlIGluIHRoZSBmb3JtIG9mIFhNTCBhbmQKLUxpc3Agcy1leHByZXNzaW9ucy4gIFNXSUcgbWF5IGJlIGZyZWVseSB1c2VkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIGZvciBjb21tZXJjaWFsCi1hbmQgbm9uLWNvbW1lcmNpYWwgdXNlLgotCi08dWw+Ci08bGk+IDxhIGhyZWY9InN1cnZleS5odG1sIj5Eb3dubG9hZDwvYT4gdGhlIGxhdGVzdCB2ZXJzaW9uLgotPGxpPiA8YSBocmVmPSJkb2MuaHRtbCI+RG9jdW1lbnRhdGlvbiwgcGFwZXJzLCBhbmQgcHJlc2VudGF0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iY29tcGFyZS5odG1sIj5GZWF0dXJlczwvYT4uCi08bGk+IDxhIGhyZWY9Im1haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KLTxsaT4gPGEgaHJlZj0iYnVncy5odG1sIj5CdWcgdHJhY2tpbmc8L2E+Ci08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cuZGFiZWF6LmNvbS9jZ2ktYmluL3dpa2kucGwiPlN3aWdXaWtpITwvYT4KLTwvdWw+Ci0KLTxoMz5OZXdzPC9oMz4KLQotCi08cD4KLTxiPjIwMDYvMDEvMTI8L2I+Ci1TV0lHIGhhcyBtYWRlIGl0IGludG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1dJRyI+V2lraXBlZGlhPC9hPi4KLQotPHA+Ci08Yj4yMDA1LzEyLzEyPC9iPgotQ29kZUd1cnUgZmVhdHVyZXMgYW4gYXJ0aWNsZSBvbiBTV0lHLCA8YSBocmVmPSJodHRwOi8vY29kZWd1cnUuY29tL2NzaGFycC8ubmV0L25ldF9hc3Avc2NyaXB0aW5nL2FydGljbGUucGhwL2MxMTEwMyI+RXhwb3NlIFlvdXIgQy9DKysgUHJvZ3JhbSdzIEludGVybmFsIEFQSSB3aXRoIGEgUXVpY2sgU1dJRzwvYT4uCi0KLTxwPgotPGI+MjAwNS8xMC8yOTwvYj4KLVRoZSBzd2lnIGFuZCBzd2lnLWRldiBtYWlsaW5nIGxpc3RzIGhvc3RlZCBhdCB0aGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvIGFyZSBiZWluZyBzaHV0IGRvd24uIFBsZWFzZSB1c2UgdGhlIG5ldyBzd2lnLXVzZXIgYW5kIHN3aWctZGV2ZWwgbGlzdHMgYXQgU291cmNlRm9yZ2UsIGRldGFpbHMgb24gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3dpZy5vcmcvbWFpbC5odG1sIj5tYWlsaW5nIGxpc3QgcGFnZTwvYT4uCi0KLTxwPgotPGI+MjAwNS8xMC8xNTwvYj4KLVNXSUctMS4zLjI3IGhhcyBiZWVuIHJlbGVhc2VkIHRvIGZpeCBhIG1ham9yIGJ1ZyBpbiBwcmV2aW91cyByZWxlYXNlLgotCi08cD4KLTxiPjIwMDUvMTAvMDk8L2I+Ci1TV0lHLTEuMy4yNiBoYXMgYmVlbiByZWxlYXNlZC4gIEx1YSwgQ0xJU1AgYW5kIENvbW1vbiBMaXNwIHdpdGggVUZGSSBqb2luIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBsYW5ndWFnZXMuIFRoZSBQSFA0IG1vZHVsZSBoYXMgYmVlbiBnaXZlbiBhIGdvb2Qgd29yayBvdmVyIGFmdGVyIHNvbWUgYml0cm90LiBWYXJpb3VzIG90aGVyIG1pbm9yIGJ1ZyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIGFyZSBhbGwgYWxzbyBpbiB0aGlzIHJlbGVhc2UuCi0KLTxwPgotPGI+MjAwNS8wNi8xMTwvYj4KLVNXSUctMS4zLjI1IGhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyBsYXJnZWx5IGNvbnRhaW5zIGJ1ZyBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHRoZSBDIyBtb2R1bGUgYW5kIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLgotCi08cD4KLTxiPjIwMDUvMDMvMjU8L2I+Ci1HcmVnIFN0ZWluIGdpdmVzIGEgPGEgaHJlZj1odHRwOi8vd3d3LnNhdXJpYS5jb20vfnR3bC9jb25mZXJlbmNlcy9weWNvbjIwMDUvMjAwNTAzMjUvUHl0aG9uJTIwYXQlMjBHb29nbGUubm90ZXM+a2V5bm90ZSBzcGVlY2g8L2E+IGFib3V0IEdvb2dsZSdzIHVzZSBvZiBQeXRob24gYW5kIFNXSUcgYXQgdGhlIFB5Q29uIDIwMDUgY29uZmVyZW5jZS4KLQotPHA+Ci08Yj4yMDA0LzEyLzE0PC9iPgotU1dJRy0xLjMuMjQgaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIGlzIG1haW5seSBhIGJ1ZyBmaXggcmVsZWFzZS4KLQotPHA+Ci08Yj4yMDA0LzExLzExPC9iPgotU1dJRy0xLjMuMjMgaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIHJlbGVhc2UgY29udGFpbnMgYWRkaXRpb25hbCBDKysgc3VwcG9ydCBpbiB0aGUgYXJlYXMgb2YgdGVtcGxhdGVzIGFuZAotbmFtZXNwYWNlcy4gSmF2YSBhbmQgQyMgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGxhbmd1YWdlcyB0aGF0IGNhbiBjcmVhdGUgd3JhcHBlcnMgdGFraW5nIGFkdmFudGFnZSBvZgotQysrIGRlZmF1bHQgYXJndW1lbnRzLiAgTWFueSBvdGhlciBtaW5vciBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cyBhcmUgYWxzbyBpbmNsdWRlZC4KLQotPHA+Ci08Yj4yMDA0LzA5LzA0PC9iPgotU1dJRy0xLjMuMjIgaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIHJlbGVhc2UgY29udGludWVzIHRoZSBvbmdvaW5nIGltcHJvdmVtZW50cyBhbmQgYnVnIGZpeGVzIGluIFNXSUcuCi1UaGUgbWFqb3IgYXJlYXMgb2YgaW1wcm92ZW1lbnQgYXJlIGluIGV4Y2VwdGlvbiBoYW5kbGluZywgZW51bXMgYW5kIHRoZSBTVEwuIE5ldyBsYW5ndWFnZXMgd2l0aCB0aGlzCi1yZWxlYXNlIGFyZSBBbGxlZ3JvIENMIGFuZCBNb2R1bGEtMy4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gcmV2YW1wZWQgYW5kIGl0IGlzIG5vdwotYXZhaWxhYmxlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0czogc2luZ2xlIGh0bWwgcGFnZSwgbXVsdGlwbGUgaHRtbCBwYWdlcyBhbmQgYSBwZGYKLWRvY3VtZW50LgotCi08cD4KLTxiPjIwMDQvMDEvMTE8L2I+Ci1TV0lHLTEuMy4yMSBoYXMgYmVlbiByZWxlYXNlZC4gIFRoaXMgaXMgYSBtaW5vciBidWcgZml4IHJlbGVhc2UuCi0KLTxwPgotPGI+MjAwMy8xMi8xNzwvYj4KLVNXSUctMS4zLjIwIGhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyByZWxlYXNlIGluY2x1ZGVzIGEgbGFyZ2UgbnVtYmVyIG9mIGVuaGFuY2VtZW50cyBpbmNsdWRpbmcKLWltcHJvdmVkIEMrKyBzdXBwb3J0LCBkaXJlY3RvcnMsIGNvbnRyYWN0cywgYW5kIG1vcmUuCi0KLTxwPgotPGI+MjAwMy8xMi8xNzwvYj4KLUFuIGFydGljbGUgYnkgUGhpbCBUb21zb24gYWJvdXQgU1dJRyBhbmQgUnVieSBhcHBlYXJzIGluIHRoZSBKYW51YXJ5IDIwMDQgaXNzdWUgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5jdWouY29tIj5DL0MrKyBVc2VycyBKb3VybmFsLjwvYT4KLQotPHA+Ci08Yj4yMDAzLzEwLzI3PC9iPgotVGhlIENvZGUgR2VuZXJhdGlvbiBOZXR3b3JrIHVuZGVydGFrZXMgYW4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY29kZWdlbmVyYXRpb24ubmV0L3Rpa2ktcmVhZF9hcnRpY2xlLnBocD9hcnRpY2xlSWQ9MzMiPmludGVydmlldzwvYT4gdGFsa2luZyBhYm91dCBTV0lHLgotCi08cD4KLTxiPjIwMDMvMDMvMjg8L2I+Ci1TV0lHLTEuMy4xOSBoYXMgYmVlbgotcmVsZWFzZWQuICBUaGlzIHJlbGVhc2UgZml4ZXMgYSBzbWFsbCBudW1iZXIgb2YgY3JpdGljYWwgYnVncyBpbiAxLjMuMTguCi0KLTxwPgotPGI+MjAwMy8wMy8yMzwvYj4KLVNXSUctMS4zLjE4IGhhcyBiZWVuCi1yZWxlYXNlZC4gIFRoaXMgcmVsZWFzZSBpbmNsdWRlcyBhIG51bWJlciBvZiBuZXcgbGFuZ3VhZ2UgbW9kdWxlcyAoQyMgYW5kIENoaWNrZW4pLCBuZXcgZmVhdHVyZXMsIGFuIGltcHJvdmVkCi1idWlsZCBlbnZpcm9ubWVudCwgYW5kIGEgbG90IG9mIG1pbm9yIGJ1ZyBmaXhlcy4KLQotPHA+Ci08Yj4yMDAyLzExLzI3PC9iPgotQW4gYXJ0aWNsZSBhYm91dCBTV0lHIGFwcGVhcnMgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy5jbWFnYXppbmUuanAvY29udGVudHMvMjAwMjEyLmh0bWwiPkMgTWFnYXppbmU8L2E+IChKYXBhbmVzZSkuCi0KLTxwPgotPGI+MjAwMi8xMS8yNzwvYj4KLUJlcm5hcmQgRGVzZ3JhdXBlcyBoYXMgY3JlYXRlZCBhIE1hY2ludG9zaCB2ZXJzaW9uIG9mIFNXSUctMS4zLjE3LiBEb3dubG9hZCA8YSBocmVmPSJodHRwOi8vd2VicGVyc28uZWFzeWNvbm5lY3QuZnIvYmRlc2dyYXVwZXMvRG93bmxvYWRzL01hY1N3aWdfQ2FyYm9uXzEuMy4xNy5ocXgiPmhlcmU8L2E+LgotCi08cD4KLTxiPjIwMDIvMTEvMjI8L2I+Ci1TV0lHLTEuMy4xNyBoYXMgYmVlbgotcmVsZWFzZWQuICBUaGlzIGlzIG1vc3RseSBhIGJ1Zy1maXggcmVsZWFzZSBmb3IgMS4zLjE2LgotCi08cD4KLTxiPjIwMDIvMTAvMTQ8L2I+Ci1TV0lHLTEuMy4xNiBoYXMgYmVlbgotcmVsZWFzZWQuICBUaGlzIGlzIG1vc3RseSBhIGJ1Zy1maXggcmVsZWFzZSBmb3IgMS4zLjE1LgotCi08cD4KLTxiPjIwMDIvMTAvMDE8L2I+Ci1NaXRjaGVsbCBDaGFyaXR5IGhhcyBjcmVhdGVkIDxhIGhyZWY9Imh0dHA6Ly93d3cudmVuZGlhbi5vcmcvbW5jaGFyaXR5L2RpcjMvaW5saW5lL3N3aWcvIj5JbmxpbmU6OlNXSUc8L2E+IGZvciBQZXJsLiAgQ2hlY2sgaXQgb3V0LgotCi08cD4KLTxiPjIwMDIvMDkvMTA8L2I+Ci1TV0lHLTEuMy4xNSBoYXMgYmVlbgotcmVsZWFzZWQuICBUaGlzIGlzIG1vc3RseSBhIGJ1Zy1maXggcmVsZWFzZSBmb3IgMS4zLjE0IHRoYXQgcmVzb2x2ZXMgYSBudW1iZXIKLW9mIGlzc3VlcyB3aXRoIHRlbXBsYXRlIGFuZCBuYW1lc3BhY2Ugc3VwcG9ydC4gIEltcHJvdmVtZW50cyB0byBleGNlcHRpb24gaGFuZGxpbmcgYW5kIG92ZXJsb2FkaW5nIGFyZSBhbHNvIGluY2x1ZGVkLgotCi08cD4KLTxiPjIwMDIvMDgvMTI8L2I+Ci1TV0lHLTEuMy4xNCBoYXMgYmVlbgotcmVsZWFzZWQuICBTV0lHIGRldmVsb3BtZW50IGNvbnRpbnVlcyB0byBicmVhayBuZXcgZ3JvdW5kLS10aGlzIHJlbGVhc2UgZmVhdHVyZXMKLWZ1bGwgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBmdW5jdGlvbnMsIEMrKyBzbWFydCBwb2ludGVycywgYW5kIG1vcmUuICBJdCBhbHNvCi1pbmNsdWRlcyBuZXcgbGFuZ3VhZ2UgbW9kdWxlcyBmb3IgT2NhbWwgYW5kIFhNTCBhcyB3ZWxsIGFzIGEgdmFyaWV0eSBvZiBlbmhhbmNlbWVudHMgdG8KLWV4aXN0aW5nIG1vZHVsZXMuCi0KLQotPHA+Ci08Yj4yMDAyLzA3LzE5PC9iPgotU2hpYnVrYXdhIFlvc2hpa2kgaXMgd29ya2luZyBvbiBhIEphcGFuZXNlIHRyYW5zbGF0aW9uIG9mIHRoZSBTV0lHIGRvY3VtZW50YXRpb24uICBDaGVjayBvdXQKLTxhIGhyZWY9Imh0dHA6Ly9zd2lnLWpwLmR5bmRucy5vcmcvIj5zd2lnLWpwLmR5bmRucy5vcmc8L2E+LgotCi08cD4KLTxiPjIwMDIvMDYvMTc8L2I+Ci1TV0lHLTEuMy4xMwotaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIGlzIGEgbW9yZSBzdGFibGUgdmVyc2lvbiBvZiBTV0lHLTEuMy4xMi4gIElmIHlvdSBkb3dubG9hZGVkCi1TV0lHLTEuMy4xMiwgeW91IHNob3VsZCB1cGdyYWRlLgotCi08cD4KLTxiPjIwMDIvMDYvMDI8L2I+Ci08YSBocmVmPSJEb2MxLjMvaW5kZXguaHRtbCI+VXBkYXRlZCBkb2N1bWVudGF0aW9uPC9hPiBmb3IgU1dJRy0xLjMuMTIgaXMgb25saW5lLgotCi08cD4KLTxiPjIwMDIvMDYvMDI8L2I+Ci1TV0lHLTEuMy4xMgotaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIGlzIHRoZSBtb3N0IGNhcGFibGUgU1dJRyByZWxlYXNlIGV2ZXIhICBOZXcKLWZlYXR1cmVzIGluY2x1ZGUgc3VwcG9ydCBmb3IgQysrIG5hbWVzcGFjZXMsIGVuaGFuY2VkIHN1cHBvcnQgZm9yIEMrKwotdGVtcGxhdGVzLCBuZXcgbGlicmFyeSBmaWxlcywgdXBkYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgYSBodWdlIG51bWJlciBvZiBtaW5vciBlbmhhbmNlbWVudHMuCi1TZWUgdGhlIDxhIGhyZWY9InN1cnZleS5odG1sIj5kb3dubG9hZDwvYT4gcGFnZSBmb3IgcmVsZWFzZSBub3RlcwotYW5kIHZlcnNpb25zIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2guCi0KLTxwPgotPGI+MjAwMi8wNC8wMzwvYj4gUm9iZXJ0IFRvbGJlcnQgaGFzIGNvbnRyaWJ1dGVkIFBERiBhbmQgcG9zdHNjcmlwdCB2ZXJzaW9ucyBvZiB0aGUgU1dJRy0xLjMuMTEgZG9jdW1lbnRhdGlvbi4gIENoZWNrIGl0IG91dC4KLQotPHA+Ci08Yj4yMDAyLzAyLzAxPC9iPiBTV0lHLTEuMy4xMSBoYXMgYmVlbiByZWxlYXNlZC4gICBUaGlzIGlzIGEgYnVnLWZpeCByZWxlYXNlIGZvciBTV0lHLTEuMy4xMC4gIFRoZSByZWxlYXNlIGFsc28KLWluY2x1ZGVzIHN1YnN0YW50aWFsIGltcHJvdmVtZW50cyB0byB0aGUgSmF2YSBhbmQgUEhQIG1vZHVsZXMuCi1TZWUgdGhlIDxhIGhyZWY9InN1cnZleS5odG1sIj5kb3dubG9hZDwvYT4gcGFnZSBmb3IgcmVsZWFzZSBub3RlcyBhbmQgdmVyc2lvbnMgZm9yIFdpbmRvd3MgYW5kIE1hY2ludG9zaC4gIAotCi08cD4KLTxiPjIwMDEvMTIvMTA8L2I+IFNXSUctMS4zLjEwIGhhcyBiZWVuCi1yZWxlYXNlZC4gICBUaGlzIHJlbGVhc2UgZmVhdHVyZXMgc3Vic3RhbnRpYWwgY2hhbmdlcyB0byB0eXBlbWFwcywgZXhjZXB0aW9uCi1oYW5kbGluZywgYW5kIFNXSUcncyBpbnRlcm5hbHMuICAgTmV3IGZlYXR1cmVzIGFsc28gaW5jbHVkZSBzdXBwb3J0IGZvciBDKysgb3BlcmF0b3IKLW92ZXJsb2FkaW5nIGFuZCBhbiBleHBlcmltZW50YWwgUEhQIG1vZHVsZS4gICBTaW5jZSB0aGlzIGlzIGFuIHVuc3RhYmxlCi1yZWxlYXNlLCBmaXJzdCB0aW1lIHVzZXJzIG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgdXNpbmcgU1dJRy0xLjMuOSBvcgotU1dJRzEuMXA1IGluc3RlYWQuCi1TZWUgdGhlIDxhIGhyZWY9InN1cnZleS5odG1sIj5kb3dubG9hZDwvYT4gcGFnZSBmb3IgcmVsZWFzZSBub3RlcyBhbmQgdmVyc2lvbnMgZm9yIFdpbmRvd3MgYW5kIE1hY2ludG9zaC4gIAotCi0KLTxQPgotPGI+MjAwMS8xMi8xMDwvYj4gVGhlIDxhIGhyZWY9IkRvYzEuMyI+ZGV2ZWxvcG1lbnQgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIFNXSUctMS4zIGhhcyBiZWVuIGV4dGVuc2l2ZWx5IHVwZGF0ZWQuICBOb3QgeWV0IGZpbmlzaGVkLCBidXQgaW5jbHVkZXMgY292ZXJhZ2Ugb2YgbW9zdAotbmV3IFNXSUcgZmVhdHVyZXMgaW5jbHVkaW5nIHRoZSByZWRlc2lnbmVkIHR5cGVtYXAgc3lzdGVtIGFuZAotaW1wcm92ZWQgZXhjZXB0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAKLQotPHA+Ci08Yj4yMDAxLzEwLzMxPC9iPiBBbm5vdW5jaW5nIHRoZSBTd2lnV2lraS4gICAKLVByb2JsZW1zIHdpdGggU1dJRz8gIExvb2sgaGVyZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdG8gY29udHJpYnV0ZS4KLQotPHA+Ci08Yj4yMDAxLzA5LzI4PC9iPiA8YSBocmVmPSJEb2MxLjMiPkRldmVsb3BtZW50IGRvY3VtZW50YXRpb248L2E+IGZvciBTV0lHLTEuMyBpcyBub3cgb25saW5lLiAgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBtYW55IG5ldyBTV0lHIGZlYXR1cmVzCi1hcmUgZGVzY3JpYmVkLgotCi08cD4KLTxiPjIwMDEvMDkvMjM8L2I+IFNXSUctMS4zLjkgaGFzIGJlZW4KLXJlbGVhc2VkLiBUaGlzIGlzIGEgYnVnLWZpeCByZWxlYXNlIGZvciAxLjMuNyAoZGVzY3JpYmVkIGJlbG93KS4KLVNlZSB0aGUgPGEgaHJlZj0ic3VydmV5Lmh0bWwiPmRvd25sb2FkPC9hPiBwYWdlIGZvciByZWxlYXNlIG5vdGVzIGFuZCB2ZXJzaW9ucyBmb3IgV2luZG93cyBhbmQgTWFjaW50b3NoLiAgTm90ZTogU1dJRy0xLjMuOCBoYWQgYSBtYWpvciBwYXJzaW5nIHByb2JsZW0gdGhhdAotc251Y2sgaW4gYXQgdGhlIGxhc3QgbW9tZW50LS1kb24ndCB1c2UgdGhhdCB2ZXJzaW9uLgotCi08cD4KLTxiPjIwMDEvMDkvMDM8L2I+IFNXSUctMS4zLjcgaGFzIGJlZW4KLXJlbGVhc2VkLiBUaGlzIGlzIG9uZSBvZiB0aGUgbW9zdCBzdWJzdGFudGlhbCBlbmhhbmNlbWVudHMgdG8gU1dJRyBldmVyIHJlbGVhc2VkLiAgSW5jbHVkZXMgYSBtb3JlCi1wb3dlcmZ1bCBwYXJzZXIsIHN1cHBvcnQgZm9yIEMrKyB0ZW1wbGF0ZXMsIHNpbXBsaWZpZWQgd3JhcHBpbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBtb3JlIQotVGhpcyByZWxlYXNlIGFsc28gaW5jbHVkZXMgc29tZSB1cGRhdGVkIGRvY3VtZW50YXRpb24gb24gdGhlIG5ldyBmZWF0dXJlcy4gU2VlIHRoZSA8YSBocmVmPSJzdXJ2ZXkuaHRtbCI+ZG93bmxvYWQ8L2E+IHBhZ2UgZm9yIHJlbGVhc2Ugbm90ZXMgYW5kIHZlcnNpb25zIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2guCi0KLQotPHA+Ci08Yj4yMDAxLzA4LzMwPC9iPiBBIHByZWNvbXBpbGVkIGV4ZWN1dGFibGUgb2YgU1dJRy0xLjMuNiBmb3IgV2luZG93cyAoc3dpZ3dpbi0xLjMuNikgaXMgbm93IGF2YWlsYWJsZS4KLQotCi08cD4KLTxiPjIwMDEvMDcvMTY8L2I+IEEgTWFjaW50b3NoIHBvcnQgb2YgU1dJRy0xLjMuNiAobWFjc3dpZy0xLjMuNikKLWhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgotCi08cD4KLTxiPjIwMDEvMDcvMTA8L2I+IFNXSUctMS4zLjYgaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIHJlbGVhc2UgaW5jbHVkZXMgc3Vic3RhbnRpYWwgY2hhbmdlcwotdG8gdGhlIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGdyZWF0bHkgaW1wcm92ZWQgc3VwcG9ydCBmb3IgR3VpbGUsIEphdmEsIGFuZCAKLVJ1YnkuICBQbGVhc2Ugc2VlIHRoZSA8YSBocmVmPSJzdXJ2ZXkuaHRtbCI+ZG93bmxvYWQ8L2E+IHBhZ2UgZm9yIGZ1cnRoZXIgZGV0YWlscy4KLQotPHA+Ci08Yj4yMDAwLzEwLzE0PC9iPiBBIE1hY2ludG9zaCBwb3J0IG9mIFNXSUcxLjNhNSAobWFjc3dpZzEuM2E1KSBoYXMgYmVlbiBjb250cmlidXRlZCBieSBMdWlnaSBCYWxsYWJpby4KLQotCi08cD4KLTxiPjIwMDAvMDkvMjI8L2I+IFNXSUcxLjNhNQotaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIHJlbGVhc2UgaGFzIHRvbyBtYW55IGNoYW5nZXMgdG8gbGlzdCBoZXJlLAotYnV0IGl0IGZpeGVzIGEgbG90IG9mIGJ1Z3MgaW4gU1dJRzEuM2EzIGFuZCBTV0lHMS4zYTQsIGluY2x1ZGVzIG5ldyBsYW5ndWFnZSBtb2R1bGVzCi1mb3IgUnVieSBhbmQgTXpzY2hlbWUsIGFuZCBoYXMgc29tZSBuZXcgZXhhbXBsZXMuICBOb3RlOiB0aGlzIGlzIGEgc29tZXdoYXQKLXVuc3RhYmxlIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgc3VpdGFibGUgZm9yIGZpcnN0IHRpbWUgdXNlcnMuCi1Eb3dubG9hZCBTV0lHLTEuMSBpbnN0ZWFkLgotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvbGluay50eHQgYi9zd2lnd2ViL2xpbmsudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU5NTA2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvbGluay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jaW5kZXguaHQjOigzLzEvMDApIFNXSUcxLjNhMiBoYXMgYmVlbiByZWxlYXNlZCEgIERvd25sb2FkIG5vdyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9kb3dubG9hZC5zb3VyY2Vmb3JnZS5uZXQvc3dpZy9zd2lnMS4zYTIudGFyLmd6Ij5Tb3VyY2VGb3JnZTwvYT4uICBOb3RlOiB0aGlzIGlzIGFuIHVuc3RhYmxlIHJlbGVhc2UgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgZmlyc3QtdGltZSB1c2Vycy4gIERvd25sb2FkIDxhIGhyZWY9ImZ0cDovL3d3dy5zd2lnLm9yZy9wdWIvc3dpZzEuMXA1LnRhci5neiI+U1dJRzEuMXA1PC9hPiBpbnN0ZWFkLgotZG9jLmh0OjxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIiPkZUUDwvYT4gc2l0ZS4KLWRvYy5odG1sOiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViIj5GVFA8L2E+IHNpdGUuCi1kb3dubG9hZC5odDo8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIiPmZ0cC5zd2lnLm9yZy9wdWI8L2E+IChNYXN0ZXIgc2l0ZSkuIAotZG93bmxvYWQuaHQ6PGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5TV0lHIDEuMXA1PC9hPgotZG93bmxvYWQuaHQ6PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWcxLjFwNS50YXIuZ3oiPnN3aWcxLjFwNS50YXIuZ3o8L2E+LiBUaGUgZnVsbCBkaXN0cmlidXRpb24gaW5jbHVkaW5nIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLgotZG93bmxvYWQuaHQ6PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWdkb2MxLjFfcGRmLnRhci5neiI+c3dpZ2RvYzEuMV9wZGYudGFyLmd6PC9hPi4gUERGIGRvY3VtZW50YXRpb24gKGluY2x1ZGVkIGluIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbikuCi1kb3dubG9hZC5odDo8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZ2RvYzEuMV9wcy50YXIuZ3oiPnN3aWdkb2MxLjFfcHMudGFyLmd6PC9hPi4gUG9zdHNjcmlwdCBkb2N1bWVudGF0aW9uLgotZG93bmxvYWQuaHQ6PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL01hY1NXSUcxLjFwMi5zZWEuaHF4Ij5NYWNTV0lHMS4xcDIuc2VhLmhxeDwvYT4uIFNXSUcgZm9yIHRoZSBQb3dlciBNYWNpbnRvc2ggKGV4cGVyaW1lbnRhbCkuCi1kb3dubG9hZC5odG1sOiA8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIiPmZ0cC5zd2lnLm9yZy9wdWI8L2E+IChNYXN0ZXIgc2l0ZSkuIAotZG93bmxvYWQuaHRtbDogPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5TV0lHIDEuMXA1PC9hPgotZG93bmxvYWQuaHRtbDogPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWcxLjFwNS50YXIuZ3oiPnN3aWcxLjFwNS50YXIuZ3o8L2E+LiBUaGUgZnVsbCBkaXN0cmlidXRpb24gaW5jbHVkaW5nIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLgotZG93bmxvYWQuaHRtbDogPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWdkb2MxLjFfcGRmLnRhci5neiI+c3dpZ2RvYzEuMV9wZGYudGFyLmd6PC9hPi4gUERGIGRvY3VtZW50YXRpb24gKGluY2x1ZGVkIGluIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbikuCi1kb3dubG9hZC5odG1sOiA8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZ2RvYzEuMV9wcy50YXIuZ3oiPnN3aWdkb2MxLjFfcHMudGFyLmd6PC9hPi4gUG9zdHNjcmlwdCBkb2N1bWVudGF0aW9uLgotZG93bmxvYWQuaHRtbDogPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL01hY1NXSUcxLjFwMi5zZWEuaHF4Ij5NYWNTV0lHMS4xcDIuc2VhLmhxeDwvYT4uIFNXSUcgZm9yIHRoZSBQb3dlciBNYWNpbnRvc2ggKGV4cGVyaW1lbnRhbCkuCi1kb3dubG9hZC5odH46PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViIj5mdHAuc3dpZy5vcmcvcHViPC9hPiAoTWFzdGVyIHNpdGUpLiAKLWRvd25sb2FkLmh0fjo8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWcxLjFwNS50YXIuZ3oiPlNXSUcgMS4xcDU8L2E+Ci1kb3dubG9hZC5odH46PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWcxLjFwNS50YXIuZ3oiPnN3aWcxLjFwNS50YXIuZ3o8L2E+LiBUaGUgZnVsbCBkaXN0cmlidXRpb24gaW5jbHVkaW5nIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLgotZG93bmxvYWQuaHR+OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnZG9jMS4xX3BkZi50YXIuZ3oiPnN3aWdkb2MxLjFfcGRmLnRhci5nejwvYT4uIFBERiBkb2N1bWVudGF0aW9uIChpbmNsdWRlZCBpbiB0aGUgZnVsbCBkaXN0cmlidXRpb24pLgotZG93bmxvYWQuaHR+OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnZG9jMS4xX3BzLnRhci5neiI+c3dpZ2RvYzEuMV9wcy50YXIuZ3o8L2E+LiBQb3N0c2NyaXB0IGRvY3VtZW50YXRpb24uCi1kb3dubG9hZC5odH46PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL01hY1NXSUcxLjFwMi5zZWEuaHF4Ij5NYWNTV0lHMS4xcDIuc2VhLmhxeDwvYT4uIFNXSUcgZm9yIHRoZSBQb3dlciBNYWNpbnRvc2ggKGV4cGVyaW1lbnRhbCkuCi1mZWVkYmFjay5odG06PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9InJlY2lwaWVudCIgdmFsdWU9InN3aWdAc3dpZy5vcmciPgotZ3Vlc3Rib29rLmNnaTokZ3Vlc3Rib29rdXJsID0gImh0dHA6Ly9zd2lnLm9yZy9ndWVzdGJrLmh0bSI7Ci1ndWVzdGJvb2suY2dpOiRjZ2l1cmwgPSAiaHR0cDovL3N3aWcub3JnL2NnaS1iaW4vZ3Vlc3Rib29rLmNnaSI7Ci1pbmRleC5odH46KDMvMS8wMCkgU1dJRzEuM2EyIGhhcyBiZWVuIHJlbGVhc2VkISAgRG93bmxvYWQgbm93IGZyb20gPGEgaHJlZj0iaHR0cDovL2Rvd25sb2FkLnNvdXJjZWZvcmdlLm5ldC9zd2lnL3N3aWcxLjNhMi50YXIuZ3oiPlNvdXJjZUZvcmdlPC9hPi4gIE5vdGU6IHRoaXMgaXMgYW4gdW5zdGFibGUgcmVsZWFzZSBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciBmaXJzdC10aW1lIHVzZXJzLiAgRG93bmxvYWQgPGEgaHJlZj0iZnRwOi8vd3d3LnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5TV0lHMS4xcDU8L2E+IGluc3RlYWQuCi1pbmRleDEuaHRtbDo8Yj48YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWcxLjFwNS50YXIuZ3oiPkRvd25sb2FkPC9hPiBTV0lHMS4xcDUgbm93ITwvYj4KLWluZGV4MS5odG1sOjwhLS0gaG9zdCAtLT4gIHd3dy5zd2lnLm9yZyBpcyBnZW5lcm91c2x5IGhvc3RlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnBucy5jYyI+UHJvZmVzc2lvbmFsIE5ldCBTZXJ2aWNlPC9hPi4gCi1pbmRleDIuaHRtbDo8IS0tIGhvc3QgLS0+ICB3d3cuc3dpZy5vcmcgaXMgZ2VuZXJvdXNseSBob3N0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5wbnMuY2MiPlByb2Zlc3Npb25hbCBOZXQgU2VydmljZTwvYT4uIAotc2VhcmNoLmNnaTokYmFzZXVybCA9ICdodHRwOi8vc3dpZy5vcmcvJzsKLXNlYXJjaC5jZ2k6JHRpdGxlID0gInN3aWcub3JnIjsKLXNlYXJjaC5jZ2k6JHRpdGxlX3VybCA9ICdodHRwOi8vc3dpZy5vcmcvJzsKLXNlYXJjaC5jZ2k6JHNlYXJjaF91cmwgPSAnaHR0cDovL3N3aWcub3JnL3NlYXJjaC5odG0nOwotc291cmNlLmh0bWw6PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViIj5mdHAuc3dpZy5vcmcvcHViPC9hPiAoTWFzdGVyIHNpdGUpLiAKLXNvdXJjZS5odG1sOjxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZzEuMXA1LnRhci5neiI+U1dJRyAxLjFwNTwvYT4KLXNvdXJjZS5odG1sOjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5zd2lnMS4xcDUudGFyLmd6PC9hPi4gVGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KLXNvdXJjZS5odG1sOjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnZG9jMS4xX3BkZi50YXIuZ3oiPnN3aWdkb2MxLjFfcGRmLnRhci5nejwvYT4uIFBERiBkb2N1bWVudGF0aW9uIChpbmNsdWRlZCBpbiB0aGUgZnVsbCBkaXN0cmlidXRpb24pLgotc291cmNlLmh0bWw6PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWdkb2MxLjFfcHMudGFyLmd6Ij5zd2lnZG9jMS4xX3BzLnRhci5nejwvYT4uIFBvc3RzY3JpcHQgZG9jdW1lbnRhdGlvbi4KLXNvdXJjZS5odG1sOjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9NYWNTV0lHMS4xcDIuc2VhLmhxeCI+TWFjU1dJRzEuMXAyLnNlYS5ocXg8L2E+LiBTV0lHIGZvciB0aGUgUG93ZXIgTWFjaW50b3NoIChleHBlcmltZW50YWwpLgotc3dpZy5odDo8IS0tIGhvc3QgLS0+ICB3d3cuc3dpZy5vcmcgaXMgZ2VuZXJvdXNseSBob3N0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5wbnMuY2MiPlByb2Zlc3Npb25hbCBOZXQgU2VydmljZTwvYT4uIAotc3dpZy5odG1sOiA8IS0tIGhvc3QgLS0+ICB3d3cuc3dpZy5vcmcgaXMgZ2VuZXJvdXNseSBob3N0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5wbnMuY2MiPlByb2Zlc3Npb25hbCBOZXQgU2VydmljZTwvYT4uIApkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9saW5rcy5odCBiL3N3aWd3ZWIvbGlua3MuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzY0YTIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9saW5rcy5odAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi1TV0lHIFJlbGF0ZWQgTGlua3MKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2xpbmtzLnBuZyIgYWx0PSJMaW5rcyI+Ci0KLTxIMz4gUHJvamVjdHMgPC9IMz4KLQotTG90cyBvZiBwZW9wbGUgPGEgaHJlZj0icHJvamVjdHMuaHRtbCI+dXNlIFNXSUc8L2E+LgotCi0KLTxIMz4gTGFuZ3VhZ2UgcmVsYXRlZCBsaW5rcyA8L2gzPgotCi08YmxvY2txdW90ZT4KLQotVGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2NyaXB0aWNzLmNvbSI+IFRjbC9UayA8L2E+IGhvbWVwYWdlIGF0IFNjcmlwdGljcy4gPGJyPgotVGhlIDxhIGhyZWYgPSJodHRwOi8vd3d3LnB5dGhvbi5vcmciPiBQeXRob24gPC9hPiBob21lcGFnZS4gPGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5wZXJsLm9yZyI+IFRoZSBQZXJsIEluc3RpdHV0ZTwvYT4gPGJyPgotPGEgaHJlZj0iaHR0cDovL3JlcHVibGljLnBlcmwuY29tIj4gVGhlIFByb2dyYW1taW5nIFJlcHVibGljIG9mIFBlcmw8L2E+LiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnBlcmwuY29tL0NQQU4vQ1BBTi5odG1sIj4gQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yayk8L2E+IDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0Ij4gU3RhcnNoaXAgUHl0aG9uPC9hPiA8YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly93d3cubmVvc29mdC5jb20vdGNsL2RlZmF1bHQuaHRtbCI+IFRjbC9UayBDb250cmlidXRlZCBTb3VyY2VzIEFyY2hpdmUgPC9hPiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnNjby5jb20vVGVjaG5vbG9neS90Y2wvVGNsLmh0bWwiPiBUY2wvVGsgSW5mb3JtYXRpb24gPC9hPiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3VpbGUvZ3VpbGUuaHRtbCI+R3VpbGU8L2E+IGhvbWVwYWdlLiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmNzLnJpY2UuZWR1L0NTL1BMVC9wYWNrYWdlcy9tenNjaGVtZS8iPk16U2NoZW1lPC9hPiBob21lcGFnZS4gPGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5ydWJ5LWxhbmcub3JnLyI+UnVieTwvYT4gaG9tZXBhZ2UuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vIj5KYXZhPC9hPiBob21lcGFnZSBhdCBTdW4uIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cucGhwLm5ldC8iPlBIUDwvYT4gaG9tZXBhZ2UuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY2FsbC13aXRoLWN1cnJlbnQtY29udGludWF0aW9uLm9yZy9jaGlja2VuLmh0bWwiPkNISUNLRU48L2E+IGhvbWVwYWdlLiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnNjaGVtZXJzLm9yZy8iPiBzY2hlbWVycy5vcmcgPC9hPiAtIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgZm9yIHRoZSBTY2hlbWUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgPGJyPgotPGEgaHJlZj0iaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9uZXRmcmFtZXdvcmsiPk1TIC5ORVQ8L2E+LCAKLTxhIGhyZWY9Imh0dHA6Ly93d3cubW9uby1wcm9qZWN0LmNvbS8iPk1vbm88L2E+IGFuZCAKLTxhIGhyZWY9Imh0dHA6Ly93d3cuZG90Z251Lm9yZy9wbmV0Lmh0bWwiPlBvcnRhYmxlIC5ORVQ8L2E+IGZvciB0aGUgLk5FVCBmcmFtZXdvcmsgKEMjKS48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPkx1YTwvYT4gaG9tZXBhZ2UuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9jbGlzcC5jb25zLm9yZyI+Q0xJU1A8L2E+IGhvbWVwYWdlLiA8YnI+Ci08YSBocmVmPSJodHRwOi8vY29tbW9uLWxpc3AubmV0L3Byb2plY3QvY2ZmaSI+Q0ZGSTwvYT4gaG9tZXBhZ2UuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZnJhbnouY29tL3Byb2R1Y3RzL2FsbGVncm9jbCI+QWxsZWdyb0NMPC9hPiBob21lcGFnZS4gPGJyPgotPC9ibG9ja3F1b3RlPgotCi08aDM+IENvZGUgZ2VuZXJhdG9ycyBhbmQgb3RoZXIgaW50ZXJlc3RpbmcgcGFja2FnZXM8L2gzPgotCi08YmxvY2txdW90ZT4KLVRoZSA8YSBocmVmPSJmdHA6Ly9mdHAucGFyYy54ZXJveC5jb20vcHViL2lsdS9pbHUuaHRtbCI+IElMVSA8L2E+IGhvbWVwYWdlIChYZXJveCBQQVJDKSA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmZweC5kZS9mcC9Tb2Z0d2FyZS90Y2xvYmoiPiBUY2xPYmogPC9hPiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmFtYXRoLndhc2hpbmd0b24uZWR1L35sZi9zb2Z0d2FyZS90Y2wrKyI+TW9kdWxhciBUY2w8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL2xuYy51c2MuZWR1L35ob2x0L21hdHdyYXAvIj5NYXR3cmFwPC9hPi4gQSB3cmFwcGVyCi1nZW5lcmF0b3IgZm9yIG1hdHJpeCBsYW5ndWFnZXMuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NpcCI+U0lQPC9hPi4gQSB3cmFwcGVyIGdlbmVyYXRvcgotZm9yIGludGVncmF0aW5nIEMrKyBsaWJyYXJpZXMgd2l0aCBQeXRob24uIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9jeHguc291cmNlZm9yZ2UubmV0Ij5DWFg8L2E+LiBBIEMrKyBmcmllbmRseSBleHRlbnNpb24gQVBJIGZvciBQeXRob24uPGJyPgotPGEgaHJlZj0iaHR0cDovL3B5Zm9ydHJhbi5zb3VyY2Vmb3JnZS5uZXQiPnB5Zm9ydDwvYT4uIEEgd3JhcHBlciBnZW5lcmF0b3IgZm9yIGludGVyZmFjaW5nIEZvcnRyYW4gd2l0aCBQeXRob24uPGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5hY2wubGFubC5nb3Yvc2lsb29uIj5TSUxPT048L2E+LiBBIHdyYXBwZXIgZ2VuZXJhdGlvbiB0b29sIAotd2l0aCBzb21lIGFtYml0aW91cyBnb2FscyBmb3IgQysrLjxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3c5LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlL2VuZy9yZXNlYXJjaC9yZW5kZXJpbmcvdmlzaW9uL2l0Y2wvIj5JdGNsKys8L2E+LiAKLUEgd3JhcHBlciBnZW5lcmF0b3IgZm9yIGludGVyZmFjaW5nIEMrKyB3aXRoIFtpbmNyIFRjbF0uPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LmhsbGEuaXMudHN1a3ViYS5hYy5qcC9+Y2hpYmEvb3BlbmMrKy5odG1sIj5PcGVuQysrPC9hPi4gIEEgdmVyeSBjb29sIGNvbXBpbGVyIHByb2plY3QgdGhhdCBsZXRzIHlvdSBjcmF3bCBpbnNpZGUgQysrIHBhcnNlIHRyZWVzIGFuZCBtb3JlLiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4iPkRveHlnZW48L2E+LiBHZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGFuZCBtb3JlIGZvciBDL0MrKyBwcm9ncmFtcy48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmNzLmNtdS5lZHUvfmNocmlzbGVlL1NvZnR3YXJlL2ctd3JhcC8iPkctV3JhcDwvYT4uIEEgd3JhcHBlciBnZW5lcmF0b3IgZm9yIGludGVyZmFjaW5nIEMgYW5kIFNjaGVtZSAoaW5jbHVkaW5nIEd1aWxlKS48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly9jZW5zLmlvYy5lZS9wcm9qZWN0cy9mMnB5MmUiPmYycHk8L2E+LiBBbiBpbnRlcmZhY2UgZ2VuZXJhdG9yIGZvciBiaW5kaW5nIEZvcnRyYW4gYW5kIFB5dGhvbi48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvcHl0aG9uL2RvYy9pbmRleC5odG1sIj5Cb29zdCBQeXRob24gTGlicmFyeTwvYT4uICBBIHZlcnkgaW50ZXJlc3RpbmcgYXBwcm9hY2ggdG8KLUMrKyB3cmFwcGVyIGdlbmVyYXRpb24gdGhhdCB1c2VzIHRlbXBsYXRlIG1ldGFwcm9ncmFtbWluZy4gPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LmRlYXZlbi5uZXQvfmRlYXZlbi9Tb2Z0d2FyZS9jeHh3cmFwLyI+Y3h4d3JhcDwvYT4uIEphdmEgSk5JIHdyYXBwZXIgY29kZSBnZW5lcmF0b3IgZm9yIEMrKy48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmV4Y2Vsc2lvci11c2EuY29tL3hmdW5jdGlvbi5odG1sIj54RnVuY3Rpb248L2E+LiBKYXZhIG5hdGl2ZSBjb2RlIGFjY2VzcyBsaWJyYXJ5Ljxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nY2MvamF2YS9pbmRleC5odG1sIj5HQ0o8L2E+LiBHbnUgQ29tcGlsZXIgZm9yIEphdmEgLSBQYXJ0IG9mIEdDQyAzLjAgYW5kIGxhdGVyLiBDKysgYW5kIEphdmEgY2FuIGJlIGVhc2lseSBtaXhlZCB0b2dldGhlciAtIEphdmEgb2JqZWN0cyBhcmUgQysrIG9iamVjdHMgYW5kIGFsbCBKYXZhIGNsYXNzZXMgYXJlIEMrKyBjbGFzc2VzIHVzaW5nIENOSSwgdGhlIGFsdGVybmF0aXZlIHRvIEpOSS48YnI+Ci08YSBocmVmPSJodHRwOi8vaW5saW5lLnBlcmwub3JnIj5JbmxpbmU8L2E+LiAgUGVybCBwcm9ncmFtbWVycyB3aWxsIGRlZmluaXRlbHkgd2FudCB0byB0YWtlIGEgbG9vayBhdAotdGhpcyBtb2R1bGUtLWVzcGVjaWFsbHkgaWYgeW91J3JlIG1ha2luZyBzaW1wbGUgQy9DKysgZXh0ZW5zaW9ucy48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmtkLWRldi5jb20vfmVpYy8iPkVpQzwvYT4uIEVtYmVkZGFibGUsIGV4dGVuc2libGUgYW5kIHBvaW50ZXItc2FmZSBDIGludGVycHJldGVyIHdpdGggYW4gaW50ZXJmYWNlIHRvIGNvbXBpbGVkIEMgY29kZS48YnI+Ci08YSBocmVmPSJodHRwOi8vcm9vdC5jZXJuLmNoL3Jvb3QvQ2ludC5odG1sIj5DSU5UPC9hPi4gQy9DKysgaW50ZXJwcmV0ZXIgd2l0aCBhbiBpbnRlcmZhY2UgdG8gY29tcGlsZWQgQy9DKysgY29kZS48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly9wdWJsaWMua2l0d2FyZS5jb20vQ2FibGUiPkNBQkxFPC9hPi4gQSB3cmFwcGVyCi1nZW5lcmF0b3IgZm9yIEMrKyB0aGF0IHVzZXMgR0NDLVhNTCB0byBwcm92aWRlIFRjbCB3cmFwcGVycyBmb3IgYWxtb3N0Ci1hbGwgQysrIGZlYXR1cmVzLiAgVGhlcmUgYXJlIHBsYW5zIHRvIHN1cHBvcnQgbW9yZSBsYW5ndWFnZXMgc28gYmUKLXN1cmUgdG8gY2hlY2sgaXQgb3V0LgotPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LnNjaXB5Lm9yZy9zaXRlX2NvbnRlbnQvd2VhdmUiPldlYXZlPC9hPi4gQSB0b29sIGZvciBpbmxpbmluZyBDL0MrKyBjb2RlIGludG8gUHl0aG9uIHNjcmlwdHMuICBWZXJ5IGNvb2wuPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LnRlY2dyYWYucHVjLXJpby5ici9+Y2VsZXMvdG9sdWEiPlRvbHVhPC9hPi4gQ29ubmVjdCBDL0MrKyBwcm9ncmFtcyB0byB0aGUgTHVhIHByb2dhbW1pbmcgbGFuZ3VhZ2UuPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIj5nU09BUDwvYT4uICBBIGNvbXBpbGVyIGZvciBkZXBsb3lpbmcgQy9DKysgcHJvZ3JhbXMgYXMgU09BUCB3ZWIgc2VydmljZXMuIDxicj4KLQotPGEgaHJlZj0iaHR0cDovL3d3dy5zb2Z0aW50ZWdyYXRpb24uY29tIj5DaDwvYT4uIEFuIGVtYmVkZGFibGUgQy9DKysgaW50ZXJwcmV0ZXIgKGNvbW1lcmNpYWwpLiA8YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY29zYy5jYW50ZXJidXJ5LmFjLm56L35ncmVnL3B5dGhvbi9QeXJleC8iPlB5cmV4PC9hPi4gQSBsYW5ndWFnZSBmb3Igd3JpdGluZyBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZXMuPGJyPgotCi08YSBocmVmPSJodHRwOi8vZWxtZXIuc291cmNlZm9yZ2UubmV0Ij5FbG1lcjwvYT4uIEdsdWUgY29kZSBnZW5lcmF0b3Igc28gdGhhdCBQeXRob24gbW9kdWxlcyBjYW4gcnVuIGluIEMgYW5kIFRjbCBwcm9ncmFtcy48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3N3aWd4bWx0b2NvbSI+U3dpZ1htbFRvQ29tPC9hPi4gVG9vbCB0aGF0IHVzZXMgU1dJRyB0byBnZW5lcmF0ZSBDT00gd3JhcHBlcnMuPGJyPgotCi08YSBocmVmPSJodHRwOi8vY29kZXdvcmtlci5mcmVlLmZyLyI+Q29kZVdvcmtlcjwvYT4uIEEgdW5pdmVyc2FsIHBhcnNpbmcgdG9vbCBhbmQgc291cmNlIGNvZGUgZ2VuZXJhdG9yLgotSXQgbGV0cyB5b3UgZ2VuZXJhdGUgY29kZSBieSBwYXJzaW5nIGV4aXN0aW5nIGxhbmd1YWdlcyBvciBieSBjcmVhdGluZyBhbmQgcGFyc2luZyB5b3VyIG93biBsYW5ndWFnZS48YnI+Ci0KLTwvYmxvY2txdW90ZT4KLQotPGgzPiBPdGhlciBpbnRlcmVzdGluZyBsaW5rczwvaDM+Ci0KLTxibG9ja3F1b3RlPgotCi1Kb2huIE91c3RlcmhvdXQncyA8YSBocmVmPSJodHRwOi8vaG9tZS5wYWNiZWxsLm5ldC9vdXN0ZXIvc2NyaXB0aW5nLmh0bWwiPiBwYXBlciA8L2E+IG9uIHNjcmlwdGluZyBsYW5ndWFnZXMKLShhcHBlYXJlZCBpbiBJRUVFIENvbXB1dGVyKS4gPGJyPgotPEEgSFJFRj0iaHR0cDovL1NBTC5LYWNoaW5hVGVjaC5DT00vIj4gU0FMIC0gU2NpZW50aWZpYyBBcHBsaWNhdGlvbnMgb24gTGludXg8L2E+LiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnVzZW5peC5vcmciPlVTRU5JWDwvYT4gPGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5tYXRodG9vbHMubmV0Ij5NYXRodG9vbHMubmV0PC9hPiBBIHRlY2huaWNhbCBjb21wdXRpbmcgcG9ydGFsIGZvciBhbGwgc2NpZW50aWZpYyBhbmQgZW5naW5lZXJpbmcgbmVlZHMuIENvbnRhaW5zIHVzZWZ1bCBsaW5rcyB0byB0ZWNobmljYWwgY29tcHV0aW5nIHByb2dyYW1tZXJzLCBjb3ZlcmluZyBDL0MrKywgSmF2YSwgRXhjZWwsIE1BVExBQiwgRm9ydHJhbiBhbmQgb3RoZXJzLjxicj4KLTwvYmxvY2txdW90ZT4KLQotPGI+SSBhbSBhbHdheXMgb24gdGhlIGxvb2tvdXQgZm9yIHByb2plY3RzIHRoYXQgYXJlIGVpdGhlciByZWxhdGVkIHRvIFNXSUcgCi1vciB3aGljaCBwcm92aWRlIGFsdGVybmF0aXZlIHNvbHV0aW9ucyB0byB0aGUgcHJvYmxlbSBvZiB3cmFwcGluZyBDL0MrKyBjb2RlLgotUGxlYXNlIGRyb3AgbWUgYSBsaW5lIGlmIHRoZXJlIGFyZSBvdGhlciBwcm9qZWN0cyB0aGF0Ci1zaG91bGQgYmUgbGlua2VkIGhlcmUuIC0tIERhdmU8L2I+Ci0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL21haWwuaHQgYi9zd2lnd2ViL21haWwuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjRiODUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9tYWlsLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLVNXSUcgTWFpbGluZyBMaXN0cwotCi08cD48aW1nIHNyYz0iaW1hZ2VzL21haWwucG5nIiBhbHQ9Ik1haWwiPgotCi08cD4KLQotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG1haWxpbmcgbGlzdHMgYXZhaWxhYmxlLiBQbGVhc2UgdXNlIHRoZW0gZm9yIGFueSBxdWVyaWVzIHJlbGF0ZWQgdG8gdGhlIHVzZSBvciBkZXZlbG9wbWVudCBvZiBTV0lHLgotCi08cD4KLTxiPkltcG9ydGFudDwvYj4uIFRoZSBtYWlsaW5nIGxpc3RzIGFyZSBzZXQgd2l0aCBhIHZlcnkgaGlnaCBsZXZlbCBvZiBzcGFtIHJlamVjdGlvbiwgbWVhbmluZyBvY2Nhc2lvbmFsbHkgc29tZSBTV0lHIHVzZXIncyBlbWFpbCBwb3N0aW5ncyB3aWxsIGJlIGRpc2NhcmRlZC4gRW1haWxzIGNsYXNzaWZpZWQgYXMgc3BhbSBhcmUgcXVpZXRseSBkaXNjYXJkZWQsIHNvIHBsZWFzZSBjaGVjayB0aGUgYXJjaGl2ZXMgaWYgeW91IGFyZSB1bnN1cmUgYXMgdG8gd2hldGhlciBvciBub3QgeW91ciBlbWFpbCB3YXMgc3VjY2Vzc2Z1bGx5IHBvc3RlZC4gTm90ZSB0aGF0IG9ubHkgcGxhaW4gdGV4dCBlbWFpbHMgc2hvdWxkIGJlIHNlbnQsIHRoYXQgaXMgaHRtbCwgcnRmIGV0YyBmb3JtYXR0ZWQgZW1haWxzIHdpbGwgYmUgcXVpZXRseSBkaXNjYXJkZWQuIFRoZSBtYWlsaW5nIGxpc3RzIGFyZSBhbHNvIHN1YnNjcmliZXIgb25seSBsaXN0cywgc28geW91IG11c3Qgc3Vic2NyaWJlIHRvIHRoZSByZWxldmFudCBsaXN0IGluIG9yZGVyIHRvIHBvc3QgdG8gdGhhdCBsaXN0LiAKLQotPHA+Ci1Ob3RlIHRoYXQgaW4gTm92ZW1iZXIgMjAwNSBuZXcgbWFpbGluZyBsaXN0cyByZXBsYWNlZCB0aGUgb3JpZ2luYWwgbWFpbGluZyBsaXN0cy4KLURldGFpbHMgb2YgPGEgaHJlZj0iI3NlYXJjaF9saXN0cyI+c2VhcmNoaW5nIG9yIGJyb3dzaW5nPC9hPiBib3RoIHRoZSBuZXcgYW5kIG9sZCBsaXN0cyBhcmUgZ2l2ZW4gYmVsb3cuCi08L3A+Ci0KLTxwPgotVG8gc3Vic2NyaWJlIHRvIGFueSBvZiB0aGUgbWFpbGluZyBsaXN0cyBvciB2aWV3IHRoZSBhcmNoaXZlcywgdXNlIHRoZSBsaW5rcyBvbiB0aGUgbGVmdCBjb2x1bW4uCi08L3A+Ci0KLTx0YWJsZSBCT1JERVI9IjEiIHN1bW1hcnk9Ik1hbGluZyBsaXN0cyI+Ci08dHI+Ci08dGQ+PGZvbnQgc2l6ZT0iKzEiPkxpc3Q8L2ZvbnQ+PC90ZD4KLTx0ZD48Zm9udCBzaXplPSIrMSI+UHVycG9zZTwvZm9udD48L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGEgaHJlZj0iaHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zd2lnLXVzZXIiPnN3aWctdXNlcjwvYT4KLTwvdGQ+Ci08dGQ+Ci1HZW5lcmFsIGRpc2N1c3Npb24gYW5kIHF1ZXJpZXMgYWJvdXQgU1dJRyBmb3IgdXNlcnMuCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGEgaHJlZj0iaHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zd2lnLWRldmVsIj5zd2lnLWRldmVsPC9hPgotPC90ZD4KLTx0ZD4KLURpc2N1c3Npb24gbGlzdCBmb3IgU1dJRyBkZXZlbG9wZXJzIG9yIGFueW9uZSBpbnRlcmVzdGVkIGluIFNXSUcgZGV2ZWxvcG1lbnQuCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGEgaHJlZj0iaHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zd2lnLWN2cyI+c3dpZy1jdnM8L2E+Ci08L3RkPgotPHRkPgotU1dJRyBDVlMgbGlzdC4gQ1ZTIGNvbW1pdHMgYXJlIG1haWxlZCB0byB0aGlzIGxpc3QuCi08L3RkPgotPC90cj4KLQotPC90YWJsZT4KLQotPGgyPjxhIG5hbWU9InRvcF9ib3R0b21fcG9zdGluZyI+VG9wIHBvc3RpbmcgYW5kIGJvdHRvbSBwb3N0aW5nPC9oMj4KLTxwPgotUmVwbGllcyB0byBlbWFpbHMgY2FuIGJlIGVpdGhlciA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RvcC1wb3N0aW5nI0JvdHRvbS1wb3N0aW5nIj5ib3R0b20gb3IgdG9wIHBvc3RlZDwvYT4uCi1UaGUgU1dJRyBjb21tdW5pdHkgYnkgYW5kIGxhcmdlIHVzZXMgYm90dG9tIHBvc3RpbmdzIG9yIGlubGluZSByZXBsaWVzLgotVGhpcyBkb2Vzbid0IG1lYW4gdG9wIHBvc3RpbmdzIGFyZSBydWxlZCBvdXQsIGhvd2V2ZXIsIGFuIGVtYWlsIGNoYWluIHdpdGggYm90aCB0b3AgYW5kIGJvdHRvbSBwb3N0aW5ncyBpcyByYXRoZXIgZGlmZmljdWx0IHRvIGZvbGxvdyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuCi1QbGVhc2UgZG9uJ3QgbWl4IHRvcCBhbmQgYm90dG9tIHBvc3RzIGluIG9uZSB0aHJlYWQsIHN0aWNrIHdpdGggd2hpY2hldmVyIGFwcHJvYWNoIHRoZSBmaXJzdCByZXBseSB1c2VkLgotPC9wPgotCi08cD4KLUZvciB0aG9zZSB3aG8gYXJlIG5ldyB0byBtYWlsaW5nIGxpc3RzLCB0aGVyZSBhcmUgbWFueSBhcnRpY2xlcyBvbiB0aGUgc3ViamVjdCwgZm9yIGV4YW1wbGUsCi08YSBocmVmPSJodHRwOi8vd3d3LmNhbGlidXJuLm5sL3RvcHBvc3RpbmcuaHRtbCI+Qm90dG9tIHZzLiB0b3AgcG9zdGluZyBhbmQgcXVvdGF0aW9uIHN0eWxlIG9uIFVzZW5ldDwvYT4gYW5kCi08YSBocmVmPSJodHRwOi8vd3d3LmNzLnR1dC5maS9+amtvcnBlbGEvdXNlbmV0L2Jyb3guaHRtbCI+V2h5IGlzIEJvdHRvbS1wb3N0aW5nIGJldHRlciB0aGFuIFRvcC1wb3N0aW5nPC9hPi4KLQotPC9wPgotCi08aDI+PGEgbmFtZT0ic2VhcmNoX2xpc3RzIj5TZWFyY2hpbmcgYW5kIGJyb3dzaW5nIHRoZSBtYWlsaW5nIGxpc3RzPC9oMj4KLTxwPgotVGhlIG1haWxpbmcgbGlzdHMgY2FuIGJlIHNlYXJjaGVkIGluIHZhcmlvdXMgZGlmZmVyZW50IHdheXMuCi1UaGUgbGlua3MgYmVsb3cgYXJlIHNob3J0Y3V0cyB0byB0aGUgYXJjaGl2ZXMgZnJvbSB3aGVyZSB5b3UgY2FuIGVhc2lseSBzZWFyY2ggb3IgYnJvd3NlIG9sZCBwb3N0aW5ncy4KLTwvcD4KLQotPHA+Ci08YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L21haWxhcmNoaXZlL2ZvcnVtLnBocD9mb3J1bT1zd2lnLXVzZXIiPnN3aWctdXNlciBhcmNoaXZlczwvYT4KLTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvbWFpbGFyY2hpdmUvZm9ydW0ucGhwP2ZvcnVtPXN3aWctZGV2ZWwiPnN3aWctZGV2ZWwgYXJjaGl2ZXM8L2E+Ci08YnI+Ci08YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L21haWxhcmNoaXZlL2ZvcnVtLnBocD9mb3J1bT1zd2lnLWN2cyI+c3dpZy1jdnMgYXJjaGl2ZXM8L2E+Ci08L3A+Ci0KLTxwPgotVGhlIG9yaWdpbmFsIG1haWxpbmcgbGlzdHMgaW4gdXNlIHByaW9yIHRvIE5vdmVtYmVyIDIwMDUgYXJlIHN0aWxsIGFyY2hpdmVkIGFuZCBhdmFpbGFibGUgZm9yIGJyb3dzaW5nIGZyb20gdGhlIGxpbmtzIGJlbG93LgotPC9wPgotCi08cD4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudWNoaWNhZ28uZWR1L21haWxtYW4vcGlwZXJtYWlsL3N3aWciPnN3aWcgYXJjaGl2ZXM8L2E+IC0gc3dpZy11c2VyIGVxdWl2YWxlbnQKLTxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudWNoaWNhZ28uZWR1L21haWxtYW4vcGlwZXJtYWlsL3N3aWctZGV2Ij5zd2lnLWRldiBhcmNoaXZlczwvYT4gLSBzd2lnLWRldmVsIGVxdWl2YWxlbnQKLTxicj4KLTwvcD4KLQotVGhlc2UgbGlzdHMgY2FuIGJlIHNlYXJjaGVkIGluIHR3byBkaWZmZXJlbnQgd2F5cy4KLVRoZSBtb3N0IHRob3JvdWdoIGFwcHJvYWNoIGlzIHRvIHVzZSBHb29nbGUgdG8gc2VhcmNoIHRoZSB3ZWIgc2l0ZSB0aGF0IGhvc3RzIHRoZXNlIG9sZCBsaXN0IGFyY2hpdmVzLgotPC9wPgotCi08IS0tIFNpdGVTZWFyY2ggR29vZ2xlIC0tPgotPEZPUk0gbWV0aG9kPUdFVCBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giPgotPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9aWUgdmFsdWU9VVRGLTg+Ci08aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1vZSB2YWx1ZT1VVEYtOD4KLTxUQUJMRSBiZ2NvbG9yPSIjRkZGRkZGIj48dHI+PHRkPgotPEEgSFJFRj0iaHR0cDovL3d3dy5nb29nbGUuY29tLyI+Ci08SU1HIFNSQz0iaHR0cDovL3d3dy5nb29nbGUuY29tL2xvZ29zL0xvZ29fNDB3aHQuZ2lmIiAKLWJvcmRlcj0iMCIgQUxUPSJHb29nbGUiPjwvQT4KLTwvdGQ+Ci08dGQ+Ci08SU5QVVQgVFlQRT10ZXh0IG5hbWU9cSBzaXplPTMxIG1heGxlbmd0aD0yNTUgdmFsdWU9IiI+Ci08SU5QVVQgdHlwZT1zdWJtaXQgbmFtZT1idG5HIFZBTFVFPSJHb29nbGUgU2VhcmNoIj4KLTxmb250IHNpemU9LTE+Ci08aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kb21haW5zIHZhbHVlPSJtYWlsbWFuLmNzLnVjaGljYWdvLmVkdSI+PGJyPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9c2l0ZXNlYXJjaCB2YWx1ZT0iIj4gdGhlIHdlYiA8aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXNpdGVzZWFyY2ggdmFsdWU9Im1haWxtYW4uY3MudWNoaWNhZ28uZWR1IiBjaGVja2VkPiBtYWlsbWFuLmNzLnVjaGljYWdvLmVkdSAoc3dpZyBhbmQgc3dpZy1kZXYgbWFpbGluZyBsaXN0cykgPGJyPgotPC9mb250PgotPC90ZD48L3RyPjwvVEFCTEU+Ci08L0ZPUk0+Ci08IS0tIFNpdGVTZWFyY2ggR29vZ2xlIC0tPgotCi08cD4KLUFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIG1ha2UgdXNlIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ21hbmUub3JnIj5HbWFuZTwvYT4gd2hpY2ggYWxzbyBhcmNoaXZlZCB0aGVzZSBvbGQgbGlzdHMuCi1UaGUgPGEgaHJlZj0iaHR0cDovL2Rpci5nbWFuZS5vcmcvZ21hbmUuY29tcC5wcm9ncmFtbWluZy5zd2lnIj5vbGQgc3dpZyBtYWlsaW5nIGxpc3Q8L2E+Ci1jYW4gYmUgc2VhcmNoZWQgb3IgYnJvd3NlZCBvbmxpbmUgYXMgaWYgdGhlIGxpc3Qgd2FzIGEgbmV3c2dyb3VwLgotR21hbmUgYWxzbyBoYXMgYW4gPGI+aW5jb21wbGV0ZTwvYj4gYXJjaGl2ZSBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2Rpci5nbWFuZS5vcmcvZ21hbmUuY29tcC5wcm9ncmFtbWluZy5zd2lnLmRldmVsIj4gb2xkIHN3aWctZGV2IG1haWxpbmcgbGlzdDwvYT4uCi08L3A+Ci0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9tYWtld2ViLnB5IGIvc3dpZ3dlYi9tYWtld2ViLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGYxNjdiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvbWFrZXdlYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3B5dGhvbgotIyBNYWtlIHRoZSBTV0lHIHdlYi1wYWdlcwotIwotIyBPa2F5LiBZZXQgYW5vdGhlciBib2d1cyByZXdyaXRlIG9mIEJhcnJ5J3Mgd29yawotCi1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgZ2xvYgotaW1wb3J0IG9zCi1pbXBvcnQgdGltZQotaW1wb3J0IHN0YXQKLQotZGVmIG1ha2VwYWdlKGZpbGVuYW1lKToKLSAgICAgICAgbmFtZSwgc3VmZml4ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKLQlmID0gb3BlbigiZGVmYXVsdC5odG1sIikKLQlwYWdlID0gZi5yZWFkKCkKLSAgICAgICAgZi5jbG9zZSgpCi0KLQkjIFJlYWQgaW4gdGhlIGJvZHkgZmlsZQotICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKLQlib2R5ID0gZi5yZWFkbGluZXMoKQotCWYuY2xvc2UoKQotCXRpdGxlID0gYm9keVswXQotCWJvZHkgPSBzdHJpbmcuam9pbihib2R5WzE6XSkKLQlwYWdlID0gc3RyaW5nLnJlcGxhY2UocGFnZSwiJHRpdGxlIix0aXRsZSkJCi0JcGFnZSA9IHN0cmluZy5yZXBsYWNlKHBhZ2UsIiRib2R5Iixib2R5KQotCi0JIyBSZWFkIGluIHRoZSBjb3JuZXIgZmlsZQotCXRyeToKLQkJZiA9IG9wZW4obmFtZSsiLmNvcm5lciIpCi0JCWNvcm5lciA9IGYucmVhZCgpCi0JCWYuY2xvc2UoKQotCWV4Y2VwdCBJT0Vycm9yOgotCQl0cnk6Ci0JCQlmID0gb3BlbigiZGVmYXVsdC5jb3JuZXIiKQotCQkJY29ybmVyID0gZi5yZWFkKCkKLQkJCWYuY2xvc2UoKQotCQlleGNlcHQ6Ci0JCQljb3JuZXIgPSAiIgotCQotCXBhZ2UgPSBzdHJpbmcucmVwbGFjZShwYWdlLCIkY29ybmVyIixjb3JuZXIpCi0KLQkjIFJlYWQgaW4gdGhlIHRvcCBmaWxlCi0JdHJ5OgotCQlmID0gb3BlbihuYW1lKyIudG9wIikKLQkJdG9wID0gZi5yZWFkKCkKLQkJZi5jbG9zZSgpCi0JZXhjZXB0IElPRXJyb3I6Ci0JCXRyeToKLQkJCWYgPSBvcGVuKCJkZWZhdWx0LnRvcCIpCi0JCQl0b3AgPSBmLnJlYWQoKQotCQkJZi5jbG9zZSgpCi0JCWV4Y2VwdDoKLQkJCXRvcCA9ICIiCi0JCi0JcGFnZSA9IHN0cmluZy5yZXBsYWNlKHBhZ2UsIiR0b3AiLHRvcCkKLQotCSMgUmVhZCBpbiB0aGUgc2lkZSBmaWxlCi0JdHJ5OgotCQlmID0gb3BlbihuYW1lKyIuc2lkZSIpCi0JCXNpZGUgPSBmLnJlYWQoKQotCQlmLmNsb3NlKCkKLQlleGNlcHQgSU9FcnJvcjoKLQkJdHJ5OgotCQkJZiA9IG9wZW4oImRlZmF1bHQuc2lkZSIpCi0JCQlzaWRlID0gZi5yZWFkKCkKLQkJCWYuY2xvc2UoKQotCQlleGNlcHQ6Ci0JCQlzaWRlID0gIiIKLQkKLQlwYWdlID0gc3RyaW5nLnJlcGxhY2UocGFnZSwiJHNpZGUiLHNpZGUpCi0KLQkjIFJlYWQgaW4gdGhlIGZvb3RlciBmaWxlCi0JdHJ5OgotCQlmID0gb3BlbihuYW1lKyIuZm9vdGVyIikKLQkJZm9vdGVyID0gZi5yZWFkKCkKLQkJZi5jbG9zZSgpCi0JZXhjZXB0IElPRXJyb3I6Ci0JCXRyeToKLQkJCWYgPSBvcGVuKCJkZWZhdWx0LmZvb3RlciIpCi0JCQlmb290ZXIgPSBmLnJlYWQoKQotCQkJZi5jbG9zZSgpCi0JCWV4Y2VwdDoKLQkJCWZvb3RlciA9ICIiCi0KLQlwYWdlID0gc3RyaW5nLnJlcGxhY2UocGFnZSwiJGZvb3RlciIsZm9vdGVyKQotCi0JbXRpbWUgPSBvcy5zdGF0KGZpbGVuYW1lKVtzdGF0LlNUX01USU1FXQotCW1zdHIgPSB0aW1lLmN0aW1lKG10aW1lKQotCi0JcGFnZSA9IHN0cmluZy5yZXBsYWNlKHBhZ2UsIiRtdGltZSIsbXN0cik7Ci0KLQkjIFdyaXRlIG91dCB0aGUgcGFnZQotCWYgPSBvcGVuKG5hbWUrIi5odG1sIiwidyIpCi0JZi53cml0ZShwYWdlKQotCWYuY2xvc2UoKQotCXByaW50ICJXcm90ZSAiLCBuYW1lKyIuaHRtbCIKLQotZmlsZXMgPSBnbG9iLmdsb2IoIiouaHQiKQotCi1mb3IgZiBpbiBmaWxlczoKLQltYWtlcGFnZShmKQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL215dGhzLmh0IGIvc3dpZ3dlYi9teXRocy5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0YjZjNS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL215dGhzLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLVNXSUcgTXl0aHMKLQotPGgyPlNXSUcgTXl0aHM8L2gyPgotCi08cD4KLUhlcmUgYXJlIHNvbWUgY29tbW9uIG1pc2NvbmNlcHRpb25zIGFib3V0IFNXSUcgdGhhdCBoYXZlIG9jY2FzaW9uYWxseQotYXBwZWFyZWQgb24gb3RoZXIgd2ViIHBhZ2VzIGFuZCBpbiBhcnRpY2xlcy0tZXNwZWNpYWxseSB0aG9zZSB0aGF0Ci1kZXNjcmliZSBvbGRlciBTV0lHIHZlcnNpb25zLgotCi08aDQ+PGZvbnQgY29sb3I9IiNmZjAwMDAiPk15dGg6IFNXSUcgb25seSByZWFsbHkgd29ya3Mgd2l0aCBBTlNJIEM8L2ZvbnQ+PC9oND4KLQotPGg0PkZhY3Q6PC9oND4KLQotU1dJRyA8ZW0+ZG9lczwvZW0+IHByb3ZpZGUgd3JhcHBpbmcgc3VwcG9ydCBmb3IgYWxsIG9mIEFOU0kgQy4gIEhvd2V2ZXIsIFNXSUcgaGFzCi1hbHNvIGluY2x1ZGVkIEMrKyBzdXBwb3J0IHNpbmNlIGl0cyBpbml0aWFsIHJlbGVhc2UgaW4gMTk5Ni4gICBUbyBiZSBmYWlyLCBlYXJseQotU1dJRyByZWxlYXNlcyBoYWQgbGltaXRhdGlvbnMsIGJ1dCBDKysgc3VwcG9ydCBoYXMgY29udGludWFsbHkgaW1wcm92ZWQgd2l0aAotZWFjaCBTV0lHIHJlbGVhc2UuCi0KLTxwPgotQysrIHN1cHBvcnQgaW4gY3VycmVudCBTV0lHIHJlbGVhc2VzIGlzIHF1aXRlIGFkdmFuY2VkLS1wcm92aWRpbmcgc3VwcG9ydCBmb3IgbmVhcmx5Ci1ldmVyeSBDKysgZmVhdHVyZSBpbmNsdWRpbmcgdGVtcGxhdGVzLCBuYW1lc3BhY2VzLCBvcGVyYXRvcnMsIG92ZXJsb2FkZWQgbWV0aG9kcywKLWFuZCBtb3JlLiAgVGhlIG9ubHkgbWFqb3IgQysrIGZlYXR1cmUgbm90IHN1cHBvcnRlZCBpcyBuZXN0ZWQgY2xhc3Nlcy0tLWFuZCB3ZSdyZQotd29ya2luZyBvbiB0aGF0LiBTZWUgdGhlIDxhIGhyZWY9ImNvbXBhcmUuaHRtbCI+RmVhdHVyZXM8L2E+IHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLTxoND48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TXl0aDogU1dJRyB3cmFwcyBDKysgaW50byB0aGlzIHVudXNhYmxlCi1sb3ctbGV2ZWwgIkMtdHJhbiIgaW50ZXJmYWNlLjwvZm9udD48L2g0PgotCi08aDQ+RmFjdDo8L2g0PgotCi1XaGVuIHdyYXBwaW5nIEMrKywgU1dJRyA8ZW0+ZG9lczwvZW0+IGdlbmVyYXRlIGEgc2V0IG9mIGxvdy1sZXZlbCBwcm9jZWR1cmFsCi13cmFwcGVycy4gIEhvd2V2ZXIsIHRoZXNlIGFyZSBvbmx5IHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIGZvcgotY3JlYXRpbmcgYSBtb3JlIGFkdmFuY2VkIGhpZ2gtbGV2ZWwgd3JhcHBlcnMgKGluIGZhY3QsIHVzZXJzIHJhcmVseQotaW50ZXJhY3Qgd2l0aCB0aGlzIGxheWVyIGRpcmVjdGx5KS4gIEluIG5lYXJseSBhbGwgdGFyZ2V0IGxhbmd1YWdlcywKLVNXSUcgd3JhcHMgQysrIGNsYXNzZXMgaW50byBhIG5pY2Ugb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0aGF0Ci1taXJyb3JzIHRoZSB1bmRlcmx5aW5nIEMrKyBjb2RlLiAgSW4gUHl0aG9uLCBDKysgY2xhc3NlcwotYXJlIHdyYXBwZWQgYXMgUHl0aG9uIGNsYXNzZXMsIGluIFBlcmwsIEMrKyBjbGFzc2VzIGFyZSB3cmFwcGVkIGFzCi1QZXJsIGNsYXNzZXMsIGFuZCBzbyBmb3J0aC4gICBUaGUgZXhpc3RlbmNlIG9mIHByb2NlZHVyYWwgd3JhcHBlcnMgaXMKLW9ubHkgYW4gYXJ0aWZhY3Qgb2YgU1dJRydzIGxheWVyZWQgYXBwcm9hY2ggdG8gd3JhcHBlciBjb2RlIGdlbmVyYXRpb24uCi0KLTxoND48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TXl0aDogU1dJRyBkb2Vzbid0IHN1cHBvcnQgb3ZlcmxvYWRlZCBtZXRob2RzL2Z1bmN0aW9uczwvZm9udD48L2g0PgotCi08aDQ+RmFjdDo8L2g0PgotCi1TV0lHIHByb3ZpZGVzIGZ1bGwgc3VwcG9ydCBmb3IgQysrIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLgotRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLWNsYXNzIEZvbyB7Ci1wdWJsaWM6Ci0gICAgIEZvbygpOwotICAgICBGb28oY29uc3QgRm9vICZhbXA7KTsKLSAgICAgdm9pZCBzcGFtKGludCB4KTsKLSAgICAgdm9pZCBzcGFtKGRvdWJsZSB4KTsKLSAgICAgdm9pZCBzcGFtKGNoYXIgKngsIGludCBuKTsKLX07Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotVGhleSBjYW4gYmUgdXNlZCBpbiBhIGNvbXBsZXRlbHkgbmF0dXJhbCB3YXkgZnJvbSBtb3N0IFNXSUcgbGFuZ3VhZ2UgbW9kdWxlcy4gIEZvciBleGFtcGxlLAotaW4gUHl0aG9uOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci0+Pj4gZiA9IEZvbygpCi0+Pj4gZi5zcGFtKDMpCi0+Pj4gZi5zcGFtKDMuNSkKLT4+PiBmLnNwYW0oImhlbGxvIiw1KQotPj4+IGcgPSBGb28oZikgICAgICAgICAgICMgTWFrZSBhIGNvcHkKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1PciBpbiBUY2w6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSUgRm9vIGYKLSUgZiBzcGFtIDMKLSUgZiBzcGFtIDMuNQotJSBmIHNwYW0gImhlbGxvIiA1Ci0lIEZvbyBnIGYKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UaGUgU1dJRyBpbXBsZW1lbnRhdGlvbiBvZiBvdmVybG9hZGluZyB1dGlsaXplcyB0eXBlIGNhdGVnb3JpZXMgYW5kIGEKLXR5cGUgcHJlY2VkZW5jZSBzY2hlbWUgdGhhdCByZXN1bHRzIGluIHRoZSBnZW5lcmF0aW9uIG9mIGR5bmFtaWMKLWRpc3BhdGNoIGZ1bmN0aW9ucy4gICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVjbGFyYXRpb25zIGFwcGVhciBkb2VzIG5vdCBtYXR0ZXIgbm9yCi1kb2VzIFNXSUcgcmVseSBvbiB1bnJlbGlhYmxlIG1lY2hhbmlzbXMgbGlrZSB0cmlhbCBleGVjdXRpb24gKGkuZS4sIHRyeWluZyBtZXRob2RzCi1vbmUgYnkgb25lIHVudGlsIG9uZSBoYXBwZW5zIHRvIGV4ZWN1dGUgc3VjY2Vzc2Z1bGx5KS4gIE92ZXJsb2FkaW5nIHN1cHBvcnQgaW4gU1dJRwotaXMgbW9yZSBhZHZhbmNlZCB0aGFuIHRoYXQuCi0KLTxQPgotRHVlIHRvIHRoZSBkeW5hbWljIG5hdHVyZSBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCBpdCBpcyBub3QgcG9zc2libGUgdG8KLWZ1bGx5IGRpc2FtYmlndWF0ZSBvdmVybG9hZGVkIG1ldGhvZHMgdG8gdGhlIHNhbWUgZGVncmVlIGFzIGluIEMrKy4gIAotRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLWludCBmb28oaW50KTsKLWxvbmcgZm9vKGxvbmcpOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLUluIHRoaXMgY2FzZSwgU1dJRyBwcm92aWRlcyBhIG51bWJlciBvZiBkaXJlY3RpdmVzIHRvIGVpdGhlciByZW5hbWUgb3IgaWdub3JlCi1vbmUgb2YgdGhlIGRlY2xhcmF0aW9ucy4gRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSVpZ25vcmUgZm9vKGxvbmcpOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLW9yCi0KLTxibG9ja3F1b3RlPgotPHByZT4KLSVyZW5hbWUoZm9vX2xvbmcpIGZvbyhsb25nKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi08aDQ+PGZvbnQgY29sb3I9IiNmZjAwMDAiPk15dGg6IFNXSUcgZG9lc24ndCBzdXBwb3J0IGJhc2ljIGlkaW9tYXRpYyBDKysgY29uc3RydWN0cyBsaWtlIHRlbXBsYXRlcyBhbmQgc21hcnQgcG9pbnRlcnM8L2ZvbnQ+PC9oND4KLQotPGg0PkZhY3Q6PC9oND4KLQotU1dJRyBmdWxseSBzdXBwb3J0cyB0ZW1wbGF0ZXMuICBIb3dldmVyLCB0byB3cmFwIGEgdGVtcGxhdGUgY2xhc3MsIHlvdSBoYXZlIHRvCi10ZWxsIFNXSUcgYWJvdXQgYSBwYXJ0aWN1bGFyIGluc3RhbnRpYXRpb24uIFRoaXMgaXMgZWFzeSwganVzdCBtYWtlIHN1cmUgU1dJRwota25vd3MgYWJvdXQgdGhlIHRlbXBsYXRlIGRlZmluaXRpb24gYW5kIGluY2x1ZGUgYSBzcGVjaWFsIGRpcmVjdGl2ZSBsaWtlIHRoaXM6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSV0ZW1wbGF0ZShkZXF1ZV9pbnQpIHN0ZDo6ZGVxdWUmbHQ7aW50Jmd0OzsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1JbiB0aGlzIGNhc2UsICJkZXF1ZV9pbnQiIGJlY29tZXMgdGhlIHRhcmdldCBsYW5ndWFnZSBuYW1lIGZvciB0aGUgd3JhcHBlZCBvYmplY3QuCi1Zb3Ugd291bGQgdXNlIGl0IGp1c3QgbGlrZSBhIG5vcm1hbCBjbGFzcyBpbiB0aGUgZXh0ZW5zaW9uIG1vZHVsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotPj4+IGQgPSBkZXF1ZV9pbnQoMTAwKQotPj4+IGQuc2l6ZSgpCi0xMDAKLT4+PgotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLU9uIHRoZSBzdWJqZWN0IG9mIHNtYXJ0LXBvaW50ZXJzLCB0aG9zZSBhcmUgc3VwcG9ydGVkIHRvby4gIEZvciBleGFtcGxlLCBzdXBwb3NlCi15b3UgaGFkIHNvbWUgY29kZSBsaWtlIHRoaXM6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLWNsYXNzIEZvbyB7Ci1wdWJsaWM6Ci0gICAgICBpbnQgeDsKLSAgICAgIGludCBzcGFtKGludCB4KTsKLX07Ci0KLXRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7IGNsYXNzIFNtYXJ0UHRyIHsKLXB1YmxpYzoKLSAgIC4uLgotICAgVCAqb3BlcmF0b3ItJmd0OygpOwotICAgLi4uCi19OwotCi10eXBlZGVmIFNtYXJ0UHRyJmx0O0ZvbyZndDsgRm9vUHRyOwotCi1Gb29QdHIgbWFrZV9Gb28oKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UbyB3cmFwIHRoaXMgd2l0aCBTV0lHLCBqdXN0IHRlbGwgaXQgYWJvdXQgYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLiBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJXRlbXBsYXRlKEZvb1B0cikgU21hcnRQdHImbHQ7Rm9vJmd0OzsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1Ob3csIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIHRoZSB3cmFwcGVyIG9iamVjdCB3b3JrcyBqdXN0IGxpa2UgeW91IHdvdWxkIGV4cGVjdDoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotPj4+IGYgPSBtYWtlX0ZvbygpCi0+Pj4gZi54ID0gMwotPj4+IGYuc3BhbSg0MikKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi0KLTxoND48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TXl0aDogU1dJRyBpcyBqdXN0IHRvbyBjb25mdXNpbmcgdG8gdXNlPC9mb250PjwvaDQ+Ci0KLTxoND5GYWN0OjwvaDQ+Ci0KLU1vc3QgdXNlcnMgZmluZCBTV0lHIHRvIGJlIHJlbGF0aXZlbHkgZWFzeSB0byB1c2UuICBIb3dldmVyLCBjb25mdXNpb24gY2FuIGFyaXNlCi1mcm9tIHRoZSBmb2xsb3dpbmc6Ci0KLTx1bD4KLTxsaT48cD5DIHByb2dyYW1taW5nLiAgVG8gZWZmZWN0aXZlbHkgdXNlIFNXSUcsIHlvdSBzaG91bGQgaGF2ZSBhIGdvb2QgZ3Jhc3Agb2YKLWJhc2ljIEMgcHJvZ3JhbW1pbmcgY29uY2VwdHMgbGlrZSBwb2ludGVycywgYXJyYXlzLCBtZW1vcnkgbWFuYWdlbWVudCwgZGF0YSBzdHJ1Y3R1cmVzLAotZnVuY3Rpb25zLCBwYXJhbWV0ZXIgcGFzc2luZyBzZW1hbnRpY3MsIGFuZCBzbyBmb3J0aC4gIFNXSUcgdHJpZXMgdG8gbWFrZSBpdCBlYXN5IGZvcgotQyBwcm9ncmFtbWVycyB0byBidWlsZCBleHRlbnNpb24gbW9kdWxlcywgYnV0IGl0IGRvZXMgbm90IHRyeSB0byBtYWtlIEMgcHJvZ3JhbW1pbmcKLWVhc3kuCi0KLTxsaT48cD5DKysuIFRoaXMgbGFuZ3VhZ2UgaXMgc28gbGFyZ2UgYW5kIGNvbXBsaWNhdGVkIHRoYXQgY2VydGFpbiBwYXJ0cyBvZiBTV0lHCi1tYXkgbm90IG1ha2UgYW55IHNlbnNlIHVubGVzcyB5b3UgYXJlIGFsc28gZmFtaWxpYXIgd2l0aCB0aGUgdW5kZXJseWluZyBDKysgY29uY2VwdHMuCi0KLTxsaT48cD5EeW5hbWljIGxpbmtpbmcgYW5kIHNoYXJlZCBsaWJyYXJpZXMuICBUbyBidWlsZCBleHRlbnNpb24gbW9kdWxlcywgeW91IHVzdWFsbHkKLWhhdmUgdG8gY3JlYXRlIERMTHMuICBJZiB5b3UndmUgbmV2ZXIgZG9uZSB0aGlzIGJlZm9yZSwgdGhlcmUgaXMgYSBzbWFsbAotbGVhcm5pbmcgY3VydmUgYXNzb2NpYXRlZCB3aXRoIGZpbmRpbmcgdGhlIHJpZ2h0IGNvbXBpbGVyIGFuZCBsaW5rZXIgb3B0aW9ucy4KLQotPGxpPjxwPkN1c3RvbWl6YXRpb24gZmVhdHVyZXMuICBTV0lHIHByb3ZpZGVzIGEgbGFyZ2UgbnVtYmVyIG9mIGN1c3RvbWl6YXRpb24gZmVhdHVyZXMgYW5kCi1vcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBhbG1vc3QgYWxsIHBhcnRzIG9mIHRoZSB3cmFwcGVyIGdlbmVyYXRpb24KLXByb2Nlc3MuICBUaGVzZSBhcmUgcHJvdmlkZWQgdG8gYmV0dGVyIHN1cHBvcnQgcG93ZXIgdXNlcnMgYW5kIHRvIHByb3ZpZGUgdGhlCi1mbGV4aWJpbGl0eSBuZWVkZWQgdG8gc29sdmUgZGlmZmljdWx0IHJlYWwtd29ybGQgd3JhcHBpbmcgcHJvYmxlbXMuICBIb3dldmVyLAotbm9uZSBvZiB0aGlzIGlzIG5lZWRlZCB0byBnZXQgc3RhcnRlZC4KLQotPC91bD4KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvbnNmLmh0IGIvc3dpZ3dlYi9uc2YuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDFiZTYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9uc2YuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1TV0lHIGFuZCBUeXBlc3lzdGVtcwotCi08aDI+U1dJRyBhbmQgVHlwZXN5c3RlbXM8L2gyPgotCi08cD4KLUZvciB0aGUgcGFzdCBzZXZlbiB5ZWFycywgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGVmZm9ydCBoYXMgZ29uZQotaW50byB0aGUgZGV2ZWxvcG1lbnQgb2YgU1dJRyBhbmQgaXRzIHN1cHBvcnQgZm9yIHZhcmlvdXMgcHJvZ3JhbW1pbmcKLWxhbmd1YWdlcy4gIEN1cnJlbnRseSwgbW9yZSB0aGFuIGEgPGEgaHJlZj0iZ3VpbHR5Lmh0bWwiPmRvemVuIGRldmVsb3BlcnM8L2E+IHdvcmsgb24gdGhlIHN5c3RlbQotYW5kIHRoZXJlIGFyZSB0aG91c2FuZHMgb2YgdXNlcnMuICBIb3dldmVyLCBhbG1vc3QgYWxsIG9mIFNXSUcncyBkZXZlbG9wbWVudAotaGFzIGJlZW4gcmVsYXRpdmVseSBhZC1ob2MtLS1wcmltYXJpbHkgZHJpdmVuIGJ5IGZlYXR1cmUgcmVxdWVzdHMgZnJvbQotdXNlcnMuICBBcyBTV0lHJ3Mgb3JpZ2luYWwgYXV0aG9yLCBjb29yZGluYXRpbmcgYWxsIG9mIHRoaXMgY2hhb3MgaGFzCi1hbHdheXMgYmVlbiBhIGJpdCBvZiBjaGFsbGVuZ2UuICBJbiBmYWN0LCBpdCdzIGJlZW4gcmF0aGVyIGRpZmZpY3VsdCB0byBldmVuCi1kZXNjcmliZSB3aGF0IFNXSUcgImlzIiBhbmQgImhvdyBpdCB3b3JrcyIgd2l0aG91dCB1c2luZyB0ZXJtcyBsaWtlCi0ibWFnaWMiIGFuZCwgd2VsbCwgIm1vcmUgbWFnaWMuIiAgIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBpc24ndCB0aGUgbW9zdAotYWNhZGVtaWMgd2F5IHRvIGxvb2sgaXQgOy0pLgotCi08cD4KLUEgbGl0dGxlIG92ZXIgYSB5ZWFyIGFnbywgSSBiZWNhbWUgaW50ZXJlc3RlZCBpbiB0aGUgcmVsYXRpb25zaGlwCi1iZXR3ZWVuIFNXSUcgYW5kIHdvcmsgaW4gdGhlIGFyZWEgb2YgdHlwZSBzeXN0ZW1zLiAgSW4gb3JkZXIKLXRvIHN1cHBvcnQgYWR2YW5jZWQgQysrIGZlYXR1cmVzIGxpa2UgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGVzLCBhCi1zaWduaWZpY2FudCBhbW91bnQgb2YgdmVyeSBkaWZmaWN1bHQgZGV2ZWxvcG1lbnQgd29yayBmb2N1c2VkIG9uIHRoZQotU1dJRyB0eXBlIHN5c3RlbS4gIE1vcmVvdmVyLCB0aGlzIHdvcmsgcmVzdWx0ZWQgaW4gYSBsb3Qgb2Ygb2xkIFNXSUcKLWZlYXR1cmVzIGJlaW5nIGZvbGRlZCBpbnRvIHR5cGUgc3lzdGVtIGV4dGVuc2lvbnMuICBCZWNhdXNlIG9mIHRoaXMKLXdvcmssIEkgaGF2ZSBub3cgY29tZSB0byB2aWV3IFNXSUcgYXMgYmVpbmcgbW9zdGx5IGRyaXZlbiBhcyBhbgotZXh0ZW5zaW9uIG9mIHRoZSBDKysgdHlwZSBzeXN0ZW0gcmF0aGVyIHRoYW4gYW4gZXh0ZW5zaW9uIG9mIGEgQysrCi1wYXJzZXIuICBUaGlzIGRpZmZlcmVuY2UgaXMgc3VidGxlLCBidXQgaXQgaXMgdGhlIG9ubHkgd2F5IHRvIHJlYWxseQotdW5kZXJzdGFuZCBob3cgU1dJRyB3b3JrcyBhdCBhIGZ1bmRhbWVudGFsIGxldmVsLgotCi08cD4KLVRvIHRoZSBiZXN0IG9mIG15IGtub3dsZWRnZSwgbm8gb25lIHdvcmtpbmcgb24gYXV0b21hdGljIEMvQysrIHdyYXBwZXIKLWdlbmVyYXRvcnMgaGFzIHJlYWxseSBhcHByb2FjaGVkIHRoZSB3cmFwcGluZyBwcm9ibGVtIGZyb20gdGhlCi1zdGFuZHBvaW50IG9mIHR5cGUgc3lzdGVtcy4gIEluc3RlYWQsIGV2ZXJ5b25lIHNlZW1zIHRvIGZvY3VzIG9uIHRoZSBwcm9ibGVtCi1vZiA8ZW0+cGFyc2luZzwvZW0+IEMrKywgd2hpY2gsIGFsdGhvdWdoIGltcG9ydGFudCwgaXMgbm90IGVub3VnaCB0bwotcmVhbGx5IHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gIAotCi08cD4KLVN0YXJ0aW5nIGluIHRoZSBzdW1tZXIgb2YgMjAwMywgdGhlIE5TRiB3aWxsIGJlIGZ1bmRpbmcgYSAKLTxhIGhyZWY9Imh0dHA6Ly93d3cuZmFzdGxhbmUubnNmLmdvdi9zZXJ2bGV0L3Nob3dhd2FyZD9hd2FyZD0wMjM3ODM1Ij5yZXNlYXJjaAotcHJvamVjdDwvYT4gYXQgdGhlIFVuaXZlcnNpdHkgb2YgQ2hpY2FnbyB0byBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXAKLWJldHdlZW4gdHlwZS1zeXN0ZW1zIGFuZCB3cmFwcGVyIGdlbmVyYXRpb24gaW4gbW9yZSBkZXRhaWwuICBBIGxvdCBvZgotdGhpcyB3b3JrIHdpbGwgaW52b2x2ZSBTV0lHIGFuZCB0aGUgc2VtYW50aWNzIG9mIGl0cyB1bmRlcmx5aW5nIHR5cGUKLXN5c3RlbS4gIE1vcmVvdmVyLCB0aGlzIHdvcmsgd2lsbCBiZSBleHBsb3Jpbmcgc29tZSBleGNpdGluZyBuZXcKLWZlYXR1cmVzIHN1Y2ggYXMgc29mdHdhcmUgY29udHJhY3RzIGFuZCBpbXByb3ZlZCBtaXhlZC1sYW5ndWFnZQotZGVidWdnaW5nIHN1cHBvcnQuICBXZSdyZSBhbHNvIGdvaW5nIHRvIHRyeSBhbmQgbWFrZSBjb25uZWN0aW9ucwotYmV0d2VlbiBTV0lHIGFuZCByZWxhdGVkIHdvcmsgaW4gdGhlIGFyZWEgb2YgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgotCi08cD4KLVdoYXQgZG9lcyB0aGlzIG1lYW4gZm9yIHRoZSBmdXR1cmUgb2YgU1dJRz8gIFdlbGwsIG15IGhvcGUgaXMgdGhhdAotdGhpcyB3b3JrIHdpbGwgbWFrZSB0aGUgc3lzdGVtIG1vcmUgY2FwYWJsZSwgbW9yZSByZWxpYWJsZSwgYW5kIG1vcmUKLXVzZWZ1bCB0aGFuIGV2ZXIuICBJIHRoaW5rIGV2ZXJ5b25lIHdpbGwgYmUgcGxlYXNhbnRseSBzdXJwcmlzZWQgd2l0aAotc29tZSBvZiB0aGUgY2hhbmdlcy4KLQotPHA+Ci1BcyBhbHdheXMsIEknZCBsaWtlIHRvIGFja25vd2xlZGdlIGV2ZXJ5b25lIHdobyBoYXMgY29udHJpYnV0ZWQgdG8gU1dJRwotb3ZlciB0aGUgeWVhcnMtLS10aGFuayB5b3UgZm9yIHlvdXIgc3VwcG9ydCEKLQotPHA+Ci1DaGVlcnMsCi08cD4KLURhdmUgQmVhemxleSA8YnI+Ci1NYXJjaCAyMywgMjAwMwpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvUGVybDk4L3JlYWRtZSBiL3N3aWd3ZWIvcGFwZXJzL1Blcmw5OC9yZWFkbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyMmQ4ZjcuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvUGVybDk4L3JlYWRtZQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLVBlcmwgRXh0ZW5zaW9uIEJ1aWxkaW5nIHdpdGggU1dJRwotCi1BdXRob3JzIDogRGF2aWQgQmVhemxleQotICAgICAgICAgIERhdmlkIEZsZXRjaGVyCi0gICAgICAgICAgRG9taW5pcXVlIER1bW9udAotCi1Db250YWN0IDogRGF2ZSBCZWF6bGV5Ci0gICAgICAgICAgYmVhemxleUBjcy51dGFoLmVkdQotICAgICAgICAgICg4MDEpIDM1OS01NzA1Ci0KLVNlc3Npb24gOiBQZXJsIEludGVybmFscyBhbmQgTGlua2luZyB0byBDCi0gICAgICAgICAgVGh1cnNkYXksIEF1Z3VzdCAyMCwgMTozMCBwbS4KLQotCi1UaGUgcHJlc2VudGF0aW9uIGNvbnNpc3RzIG9mIGEgcGFwZXIgYWJvdXQgU1dJRwotYW5kIGl0cyB1c2Ugd2l0aCBQZXJsLiAgVGhyZWUgZmlsZXMgYXJlIGF2YWlsYWJsZSA6Ci0KLXN3aWdwZXJsLmh0bWwgICAgLSAgSFRNTCBWZXJzaW9uIG9mIHRoZSBwYXBlcgotc3dpZ3BlcmwucHMgICAgICAtICBQb3N0c2NyaXB0IHZlcnNpb24gKDIgY29sdW1uKQotc3dpZ3BlcmwucGRmICAgICAtICBQREYgVmVyc2lvbiBvZiB0aGUgcG9zdHNjcmlwdCBwYXBlcgotCi1UaGUgSFRNTCB2ZXJzaW9uIGNvbnRhaW5zIGxpbmtzIHRvIHRoZSBwb3N0c2NyaXB0IGFuZCBQREYKLXZlcnNpb25zLgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QZXJsOTgvc3dpZ3BlcmwuaHRtIGIvc3dpZ3dlYi9wYXBlcnMvUGVybDk4L3N3aWdwZXJsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNjOWNlOC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QZXJsOTgvc3dpZ3BlcmwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjE5OCArMCwwIEBACi08aHRtbD4KLTx0aXRsZT4gUGVybCBFeHRlbnNpb24gQnVpbGRpbmcgd2l0aCBTV0lHIDwvdGl0bGU+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxoMT4gUGVybCBFeHRlbnNpb24gQnVpbGRpbmcgd2l0aCBTV0lHPC9oMT4KLQotKFByZXNlbnRlZCBhdCB0aGUgTydSZWlsbHkgUGVybCBDb25mZXJlbmNlIDIuMCwgQXVndXN0IDE3LTIwLCAxOTk4LCBTYW4gSm9zZSwgQ2FsaWZvcm5pYS4pCi08cD4KLQotPGI+IERhdmlkIE0uIEJlYXpsZXkgPC9iPiA8YnI+Ci08ZW0+IERlcHQuIG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBDaGljYWdvIDxicj4KLUNoaWNhZ28sIElMICA2MDYzNyA8YnI+Ci08L2VtPiAKLQotPHA+Ci08Yj4gRGF2aWQgRmxldGNoZXIgPC9iPiA8YnI+Ci08ZW0+RnVzaW9uIE1pY3JvTWVkaWEsIENvcnAuIDxicj4KLUxvbmdtb250LCBDTyA4MDUwMSA8YnI+Ci08L2VtPgotCi08cD4KLTxiPkRvbWluaXF1ZSBEdW1vbnQ8L2I+IDxicj4KLTxlbT4gSGV3bGV0dCBQYWNrYXJkIDxicj4KLUxhYiBUSUQgPGJyPgotNSBBdmUgUmF5bW9uZCBDaGFuYXMgPGJyPgotMzgwNTMgR3Jlbm9ibGUgY2VkZXggPGJyPgotRnJhbmNlIDxicj4gPC9lbT4KLQotPHA+Ci1bIDxhIGhyZWY9InN3aWdwZXJsLnBkZiI+UERGIDwvYT4gXQotCi08aDI+IEFic3RyYWN0IDwvaDI+Ci0KLTxlbT4KLVNXSUcgKFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvcikgaXMgYSBmcmVlbHkgYXZhaWxhYmxlCi10b29sIHRoYXQgaW50ZWdyYXRlcyBQZXJsLCBQeXRob24sIFRjbCwgYW5kIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMKLXdpdGggcHJvZ3JhbXMgd3JpdHRlbiBpbiBDLCBDKyssIGFuZCBPYmplY3RpdmUtQy4gICBUaGlzIHBhcGVyCi1wcm92aWRlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gU1dJRyBhbmQgc2hvd3MgaG93IGl0IGNhbiBiZSB1c2VkIHRvCi1jb25zdHJ1Y3QgUGVybCBleHRlbnNpb24gbW9kdWxlcy4gIEluIGFkZGl0aW9uLCBhIG51bWJlciBvZiBhcHBsaWNhdGlvbnMKLWluIHdoaWNoIFNXSUcgaGFzIGJlZW4gdXRpbGl6ZWQgYXJlIGRlc2NyaWJlZC4gICBXaGlsZSBTV0lHIGlzIHNpbWlsYXIKLXRvIG90aGVyIFBlcmwgZXh0ZW5zaW9uIGJ1aWxkaW5nIHRvb2xzIHN1Y2ggYXMgeHN1YnBwIGFuZCBoMnhzLCBTV0lHCi1oYXMgYSBudW1iZXIgb2YgdW5pcXVlIGZlYXR1cmVzIHRoYXQgaGVscCBzaW1wbGlmeSB0aGUgdGFzayBvZiBjcmVhdGluZwotUGVybCBleHRlbnNpb24gbW9kdWxlcy4gIE1hbnkgb2YgdGhlc2UgZmVhdHVyZXMgYXJlIGRlc2NyaWJlZCBhcyB3ZWxsIGFzCi1saW1pdGF0aW9ucyBhbmQgZnV0dXJlIGRpcmVjdGlvbnMuCi1UaGlzIHBhcGVyIGlzCi1wcmltYXJpbHkgaW50ZW5kZWQgZm9yIGRldmVsb3BlcnMgd2hvIGFyZSBpbnRlcmVzdGVkIGluIGNvbWJpbmluZyBQZXJsCi13aXRoIGFwcGxpY2F0aW9ucyB3cml0dGVuIGluIEMgb3IgQysrIGFzIHdlbGwgYXMgY3VycmVudCBTV0lHIHVzZXJzCi13aG8gYXJlIGludGVyZXN0ZWQgaW4gbGVhcm5pbmcgbW9yZSBhYm91dCBzb21lIG9mIFNXSUcncyBhZHZhbmNlZCBmZWF0dXJlcy4KLTwvZW0+Ci0KLTxoMj4gMSBJbnRyb2R1Y3Rpb24gPC9oMj4KLQotT25lIG9mIFBlcmwncyBncmVhdGVzdCBzdHJlbmd0aHMgaXMgaXRzIGFiaWxpdHkgdG8gc2ltcGxpZnkgaGFyZAotcHJvZ3JhbW1pbmcgdGFza3MgYXMgd2VsbCBhcyBiZWluZyBhYmxlIHRvIHNvbHZlIHRoZSBvZGQgYW5kIHZhcmllZAotY29tcHV0aW5nIHByb2JsZW1zIHRoYXQgb2NjdXIgb24gYSBkYXktdG8tZGF5IGJhc2lzLiAgV2hpbGUgaXQgd291bGQKLWJlIG5pY2UgdG8gdXNlIFBlcmwgKG9yIG90aGVyIGhpZ2gtbGV2ZWwgbGFuZ3VhZ2VzKSBmb3IgZXZlcnl0aGluZywKLXRoaXMgaXMgc2ltcGx5IG5vdCBwcmFjdGljYWwgZm9yIG1hbnkgYXBwbGljYXRpb25zLiAgSW4gZmFjdCwKLXBlcmZvcm1hbmNlIGNyaXRpY2FsIHRhc2tzLCBsb3ctbGV2ZWwgc3lzdGVtcyBwcm9ncmFtbWluZywgYW5kIAotY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGxpa2VseSB0byBiZSBpbXBsZW1lbnRlZAotaW4gYSBjb21waWxlZCBsYW5ndWFnZSBzdWNoIGFzIEMgb3IgQysrIChhbmQgbWF5IGJlIGVhc2llciB0byBtYW5hZ2UKLWluIHN1Y2ggbGFuZ3VhZ2VzKS4gIEZ1cnRoZXJtb3JlLCBkZXZlbG9wZXJzIG9mdGVuIG5lZWQgdG8gd29yayB3aXRoIGEKLXdpZGUgdmFyaWV0eSBvZiBleGlzdGluZyBhcHBsaWNhdGlvbnMgYW5kIGBgbGVnYWN5Jycgc3lzdGVtcyB0aGF0Ci1hcmUgd3JpdHRlbiBpbiBzdWNoIGxhbmd1YWdlcy4KLQotPHA+Ci1UaGUgaW50ZWdyYXRpb24gb2YgUGVybCBhbmQgY29kZSB3cml0dGVuIGluIGNvbXBpbGVkIGxhbmd1YWdlcyBoYXMgYQotbnVtYmVyIG9mIHByYWN0aWNhbCBiZW5lZml0cy4gIEZpcnN0LCBpdCBhbGxvd3MgZXhpc3RpbmcgQy9DKysKLWFwcGxpY2F0aW9ucyB0byBiZSBpbmNvcnBvcmF0ZWQgaW50byBhIGhpZ2gtbGV2ZWwgaW50ZXJwcmV0ZWQKLWVudmlyb25tZW50LiAgVGhpcyBlbnZpcm9ubWVudCBwcm92aWRlcyBncmVhdGVyIGZsZXhpYmlsaXR5IGFuZCBvZnRlbgotc2ltcGxpZmllcyBkZXZlbG9wbWVudCBzaW5jZSBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcgY2FuIGJlIHBlcmZvcm1lZAotdXNpbmcgUGVybCBzY3JpcHRzLiAgU2Vjb25kLCBQZXJsIGNhbiBzZXJ2ZSBhcyBhIHBvd2VyZnVsIHVzZXIKLWludGVyZmFjZS4gIEluIG90aGVyIHdvcmRzLCByYXRoZXIgdGhhbiB3cml0aW5nIGEgdXNlciBpbnRlcmZhY2UKLWZyb20gc2NyYXRjaCwgaXQgaXMgcG9zc2libGUgdG8gdXNlIGEgUGVybCBpbnRlcnByZXRlciBpbnN0ZWFkLgotVGhpcyBhbHNvIGFsbG93cyBvdGhlciBmb3Igb3RoZXIgcG9zc2liaWxpdGllcyBzdWNoIGFzIGdyYXBoaWNhbAotdXNlciBpbnRlcmZhY2UgZGV2ZWxvcG1lbnQgd2l0aCBQZXJsL1RrLiAgRmluYWxseSwgUGVybAotcHJvdmlkZXMgZGV2ZWxvcGVycyB3aXRoIGEgbWVjaGFuaXNtIGZvciBhc3NlbWJsaW5nIGFuZCBjb250cm9sbGluZwotc29mdHdhcmUgY29tcG9uZW50cy4gIFJhdGhlciB0aGFuIGNyZWF0aW5nIGEgaHVnZSBtb25vbGl0aGljIHBhY2thZ2UsCi1DL0MrKyBwcm9ncmFtcyBjYW4gYmUgcGFja2FnZWQgYXMgY29sbGVjdGlvbnMgb2YgUGVybCBleHRlbnNpb24KLW1vZHVsZXMuICBBcyBhIHJlc3VsdCwgcHJvZ3JhbXMgYmVjb21lIG1vcmUgbW9kdWxhciBhbmQgZWFzaWVyIHRvCi1tYWludGFpbi4gIEZ1cnRoZXJtb3JlLCBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGNvbWJpbmUgZW50aXJlbHkKLWRpZmZlcmVudCBwcm9ncmFtcyB0b2dldGhlciB3aXRoaW4gYSBzaGFyZWQgUGVybCBpbnRlcnByZXRlci4KLQotCi08cD4KLVRoaXMgcGFwZXIgcHJvdmlkZXMgYW4gaW50cm9kdWN0aW9uIGFuZCBvdmVydmlldyBvZiBTV0lHLCBhIHRvb2wKLWRlc2lnbmVkIHRvIGludGVncmF0ZSBDIGNvZGUgd2l0aCBhIHZhcmlldHkgb2Ygc2NyaXB0aW5nCi1sYW5ndWFnZXMgaW5jbHVkaW5nIFBlcmwsIFB5dGhvbiwgYW5kIFRjbC4gIEN1cnJlbnRseSwgU1dJRyBjYW4KLWNvbnN0cnVjdCBQZXJsIGV4dGVuc2lvbiBtb2R1bGVzIG9uIFVuaXggYW5kIFdpbmRvd3MtTlQgc3lzdGVtcy4gSXQgYWxzbwotc3VwcG9ydHMgdGhlIEFjdGl2ZVN0YXRlIFBlcmwgZm9yIFdpbmRvd3MgYW5kIFBlcmw0LiAgU1dJRyBoYXMgYmVlbgotZnJlZWx5IGF2YWlsYWJsZSBzaW5jZSBGZWJydWFyeSwgMTk5NiBhbmQgaGFzIGJlZW4KLXByZXZpb3VzbHkgZGVzY3JpYmVkIGluIDxlbT5BZHZhbmNlZCBQZXJsIFByb2dyYW1taW5nPC9lbT4sIDxlbT5UaGUKLVBlcmwgSm91cm5hbDwvZW0+LCBhbmQgPGVtPkRyLiBEb2JiJ3MgSm91cm5hbDwvZW0+WzEsMiwzXS4KLUluIGFkZGl0aW9uLCBTV0lHIGlzIHBhY2thZ2VkIHdpdGggYSAzMDAgcGFnZSB1c2VyIG1hbnVhbCBkZXNjcmliaW5nIGl0cwotdXNlIFs0XS4gVGhlIGdvYWwgb2YgdGhpcyBwYXBlciBpcyBub3QgdG8gcmVwZWF0IGFsbCBvZiB0aGlzIGluZm9ybWF0aW9uLCBidXQgdG8gcHJvdmlkZSBhbiBvdmVydmlldyBvZgotU1dJRywgZGVtb25zdHJhdGUgdGhlIHVzZSBvZiBzb21lIG9mIGl0cyBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzLCBhbmQgZGVzY3JpYmUKLXNvbWUgb2YgdGhlIHdheXMgdGhhdCBpdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZC4gVGhlIGF1dGhvcnMgaW5jbHVkZSB0aGUgZGV2ZWxvcGVyCi1vZiBTV0lHIGFuZCB0d28gb2YgU1dJRydzIGZvcmVtb3N0IFBlcmwgZXhwZXJ0cyB3aG8gaGF2ZSBtYWRlIHN1YnN0YW50aWFsCi1jb250cmlidXRpb25zIHRvIFNXSUcncyBkZXZlbG9wbWVudC4KLQotPGgyPiAyIFBlcmwgRXh0ZW5zaW9uIEJ1aWxkaW5nIDwvaDI+Ci0KLVRvIGludGVyZmFjZSBQZXJsIHdpdGggY29kZSB3cml0dGVuIGluIEMgb3IgQysrLCBpdCBpcwotbmVjZXNzYXJ5IHRvIHdyaXRlIHdyYXBwZXJzIHRoYXQgc2VydmUgYXMgYSBnbHVlIGxheWVyIGJldHdlZW4KLXRoZSBQZXJsIGludGVycHJldGVyIGFuZCB0aGUgdW5kZXJseWluZyBDIGNvZGUuICBUaGVzZSB3cmFwcGVycwotYXJlIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGRhdGEgYmV0d2VlbiBQZXJsIGFuZCBDLCByZXBvcnRpbmcKLWVycm9ycywgYW5kIG90aGVyIHRhc2tzLiAgUGVybCBpcyBwYWNrYWdlZCB3aXRoIHNldmVyYWwgdG9vbHMKLWZvciBjcmVhdGluZyB0aGVzZSB3cmFwcGVycy4gIE9uZSBzdWNoIHRvb2wgaXMgPHR0PnhzdWJwcDwvdHQ+LCBhCi1jb21waWxlciB0aGF0IHRha2VzIGludGVyZmFjZSBkZWZpbml0aW9ucyB3cml0dGVuIGluIGEgc3BlY2lhbAotbGFuZ3VhZ2Uga25vd24gYXMgWFMgYW5kIGNvbnZlcnRzIHRoZW0gaW50byB3cmFwcGVycy4gICBGb3IgZXhhbXBsZSwKLXN1cHBvc2UgdGhhdCB5b3UgaGFkIHRoZSBmb2xsb3dpbmcgQyBmdW5jdGlvbjoKLQotPGJsb2NrcXVvdGU+PHByZT4KLWludCBmYWN0KGludCBuKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVG8gd3JhcCB0aGlzIGZ1bmN0aW9uIGludG8gYSBQZXJsIG1vZHVsZSB3aXRoIDx0dD54c3VicHA8L3R0PiwgeW91IHdvdWxkIHdyaXRlCi10aGUgZm9sbG93aW5nIFhTIGZpbGU6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBmaWxlIDogZXhhbXBsZS54cyAqLwotZXh0ZXJuIGludCBmYWN0KGludCBuKTsKLU1PRFVMRSA9IEV4YW1wbGUgICAgIFBBQ0tBR0UgPSBFeGFtcGxlCi1pbnQKLWZhY3QobikKLSAgICAgaW50ICAgIG4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotV2hlbiBwcm9jZXNzZWQgd2l0aCA8dHQ+eHN1YnBwPC90dD4sIHRoZSBmb2xsb3dpbmcgd3JhcHBlciBmaWxlIGlzIHByb2R1Y2VkCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jaW5jbHVkZSAiRVhURVJOLmgiCi0jaW5jbHVkZSAicGVybC5oIgotI2luY2x1ZGUgIlhTVUIuaCIKLWV4dGVybiBpbnQgZmFjdChpbnQgbik7Ci0KLVhTKFhTX0V4YW1wbGVfZmFjdCkKLXsKLSAgICBkWFNBUkdTOwotICAgIGlmIChpdGVtcyAhPSAxKQotICAgICAgICBjcm9haygiVXNhZ2U6IEV4YW1wbGU6OmZhY3QobikiKTsKLSAgICB7Ci0gICAgICAgIGludCAgICAgbiA9IChpbnQpU3ZJVihTVCgwKSk7Ci0gICAgICAgIGludCAgICAgUkVUVkFMOwotICAgICAgICBSRVRWQUwgPSBmYWN0KG4pOwotICAgICAgICBTVCgwKSA9IHN2X25ld21vcnRhbCgpOwotICAgICAgICBzdl9zZXRpdihTVCgwKSwgKElWKVJFVFZBTCk7Ci0gICAgfQotICAgIFhTUkVUVVJOKDEpOwotfQotCi1YUyhib290X0V4YW1wbGUpCi17Ci0gICAgZFhTQVJHUzsKLSAgICBjaGFyKiBmaWxlID0gX19GSUxFX187Ci0gICAgWFNfVkVSU0lPTl9CT09UQ0hFQ0sgOwotICAgIG5ld1hTKCJFeGFtcGxlOjpmYWN0IiwgCi0gICAgICAgICAgIFhTX0V4YW1wbGVfZmFjdCwgZmlsZSk7Ci0gICAgU1QoMCkgPSAmc3ZfeWVzOwotICAgIFhTUkVUVVJOKDEpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UbyB1c2UgdGhlIG1vZHVsZSwgdGhlIHdyYXBwZXIgY29kZSBtdXN0IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byBhCi1zaGFyZWQgbGlicmFyeSB0aGF0IGNhbiBiZSBkeW5hbWljYWxseSBsb2FkZWQgaW50byB0aGUgUGVybCBpbnRlcnByZXRlci4KLVRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHdpdGggdGhlIE1ha2VNYWtlciB1dGlsaXR5IGJ5IHdyaXRpbmcgYQotc2NyaXB0IGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIGZpbGUgOiBNYWtlZmlsZS5QTAotdXNlIEV4dFV0aWxzOjpNYWtlTWFrZXI7Ci1Xcml0ZU1ha2VmaWxlKAotICAgJ05BTUUnID0mZ3Q7ICdFeGFtcGxlJywKLSAgICdPQkpFQ1QnID0mZ3Q7ICdleGFtcGxlLm8gZmFjdC5vJwotKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotdGhpcyBzY3JpcHQgaXMgdGhlbiB1c2VkIHRvIGNyZWF0ZSBhIE1ha2VmaWxlIGFuZCBtb2R1bGUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggPiBwZXJsIE1ha2VmaWxlLlBMCi11bml4ID4gbWFrZQotdW5peCA+IG1ha2UgaW5zdGFsbAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1GaW5hbGx5LCBpbiBhZGRpdGlvbiB0byBjcmVhdGluZyB0aGUgQyBjb21wb25lbnQgb2YgdGhlIGV4dGVuc2lvbiBtb2R1bGUsCi1pdCBpcyBuZWNlc3NhcnkgdG8gd3JpdGUgYSA8dHQ+LnBtPC90dD4gZmlsZSB0aGF0IGlzIHVzZWQgdG8gbG9hZAotYW5kIGluaXRpYWxpemUgdGhlIG1vZHVsZS4gIEZvciBleGFtcGxlLAotCi08YmxvY2txdW90ZT48cHJlPgotIyBmaWxlIDogRXhhbXBsZS5wbQotcGFja2FnZSBFeGFtcGxlOwotcmVxdWlyZSBFeHBvcnRlcjsKLXJlcXVpcmUgRHluYUxvYWRlcjsKLUBJU0EgPSBxdyhFeHBvcnRlciBEeW5hTG9hZGVyKTsKLWJvb3RzdHJhcCBFeGFtcGxlOwotMTsKLTwvcHJlPjwvYmxvY2txdW90ZT4gCi0KLUF0IHRoaXMgcG9pbnQsIHlvdSBzaG91bGQgaGF2ZSBhIHdvcmtpbmcgUGVybCBleHRlbnNpb24gbW9kdWxlLiAgSW4KLXByaW5jaXBsZSwgYnVpbGRpbmcgYSBQZXJsIGV4dGVuc2lvbiByZXF1aXJlcyBhbiBYUyBzcGVjaWZpY2F0aW9uIGZvcgotZXZlcnkgQyBmdW5jdGlvbiB0aGF0IGlzIHRvIGJlIGFjY2Vzc2VkLiAgVG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YKLWNyZWF0aW5nIHRoZXNlIHNwZWNpZmljYXRpb25zLCBQZXJsIGluY2x1ZGVzIDx0dD5oMnhzPC90dD4sIGEgdG9vbCB0aGF0Ci1jb252ZXJ0cyBDIGhlYWRlciBmaWxlcyB0byBYUyBkZXNjcmlwdGlvbnMuICBXaGlsZSB1c2VmdWwsIDx0dD5oMnhzPC90dD4KLWlzIHNvbWV3aGF0IGxpbWl0ZWQgaW4gaXRzIGFiaWxpdHkgdG8gaGFuZGxlIGdsb2JhbCB2YXJpYWJsZXMsCi1zdHJ1Y3R1cmVzLCBjbGFzc2VzLCBhbmQgbW9yZSBhZHZhbmNlZCBDL0MrKyBmZWF0dXJlcy4gIEFzIGEgcmVzdWx0LAotPHR0PmgyeHM8L3R0PiBjYW4gYmUgc29tZXdoYXQgZGlmZmljdWx0IHRvIHVzZSB3aXRoIG1vcmUgY29tcGxleAotYXBwbGljYXRpb25zLgotCi08aDI+IDMgU1dJRyBPdmVydmlldyA8L2gyPgotCi1JbiBhIG51dHNoZWxsLCBTV0lHIGlzIGEgc3BlY2lhbGl6ZWQgY29tcGlsZXIgdGhhdCB0cmFuc2Zvcm1zIEFOU0kKLUMvQysrIGRlY2xhcmF0aW9ucyBpbnRvIHNjcmlwdGluZyBsYW5ndWFnZSBleHRlbnNpb24gd3JhcHBlcnMuICAKLVdoaWxlCi1zb21ld2hhdCBzaW1pbGFyIHRvIDx0dD5oMnhzPC90dD4sIFNXSUcgaGFzIGEgbnVtYmVyIG9mCi1ub3RhYmxlIGRpZmZlcmVuY2VzLiAgRmlyc3QsIFNXSUcgaXMgbXVjaCBsZXNzIGludGVybmFscyBvcmllbnRlZCB0aGFuCi1YUy4gIEluIG90aGVyIHdvcmRzLCBTV0lHIGludGVyZmFjZXMgY2FuIHVzdWFsbHkgYmUgY29uc3RydWN0ZWQKLXdpdGhvdXQgYW55IGtub3dsZWRnZSBvZiBQZXJsJ3MgaW50ZXJuYWwgb3BlcmF0aW9uLiAgU2Vjb25kLCBTV0lHIGlzIGRlc2lnbmVkIHRvCi1iZSBleHRlbnNpYmxlIGFuZCBnZW5lcmFsIHB1cnBvc2UuICBDdXJyZW50bHksIHdyYXBwZXJzIGNhbiBiZQotZ2VuZXJhdGVkIGZvciBQZXJsLCBQeXRob24sIFRjbCwgYW5kIEd1aWxlLiAgSW4gYWRkaXRpb24sIGV4cGVyaW1lbnRhbAotbW9kdWxlcyBmb3IgTUFUTEFCIGFuZCBKYXZhIGhhdmUgYmVlbiBkZXZlbG9wZWQuICBGaW5hbGx5LCBTV0lHCi1zdXBwb3J0cyBhIGxhcmdlciBzdWJzZXQgb2YgQyBhbmQgQysrIGluY2x1ZGluZyBzdHJ1Y3R1cmVzLAotY2xhc3NlcywgZ2xvYmFsIHZhcmlhYmxlcywgYW5kIGluaGVyaXRhbmNlLiAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGEgdG91ciBvZiBTV0lHIGFuZCBkZXNjcmliZXMgbWFueQotb2YgaXRzIGludGVyZXN0aW5nIGZlYXR1cmVzLiAKLQotPGgzPiAzLjEgQSBTbWFsbCBUYXN0ZTwvaDM+Ci0KLUFzIGEgZmlyc3QgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gYnVpbGQgYSBQZXJsCi1pbnRlcmZhY2UgdG8gVGhvbWFzIEJvdXRlbGwncyBnZCBncmFwaGljcyBsaWJyYXJ5IFtmb290bm90ZToKLVRoZSBnZCBsaWJyYXJ5IGlzIGEgZnJlZWx5IGF2YWlsYWJsZSBncmFwaGljcyBsaWJyYXJ5IGZvcgotcHJvZHVjaW5nIEdJRiBpbWFnZXMgYW5kIGNhbiBiZSBvYnRhaW5lZCBhdCA8dHQ+Ci08YSBocmVmPSJodHRwOi8vd3d3LmJvdXRlbGwuY29tL2dkL2dkLmh0bWwiPgotaHR0cDovL3d3dy5ib3V0ZWxsLmNvbS9nZC9nZC5odG1sPC9hPjwvdHQ+LiAgIEEgUGVybCBtb2R1bGUgdG8gZ2QsCi1kZXZlbG9wZWQgYnkgTGluY29sbiBTdGVpbiwgaXMgYWxzbyBhdmFpbGFibGUgb24gQ1BBTiBzbwotaW50ZXJlc3RlZCByZWFkZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgb2YKLXVzaW5nIFNXSUcgYWdhaW5zdCBhbiBleGlzdGluZyBQZXJsIGV4dGVuc2lvbi5dCi0KLTxwPgotU2luY2UgZ2QgaXMgYSBDIGxpYnJhcnksCi1pbWFnZXMgYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYnkgd3JpdGluZyBDIGNvZGUgc3VjaCBhcwotZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSNpbmNsdWRlICJnZC5oIgotaW50IG1haW4oKSB7Ci0gIGdkSW1hZ2VQdHIgIGltOwotICBGSUxFICAgICAgICpvdXQ7Ci0gIGludCAgICAgICAgIGJsayx3aHQ7Ci0KLSAgLyogQ3JlYXRlIGFuIGltYWdlICovCi0gIGltPWdkSW1hZ2VDcmVhdGUoMjAwLDIwMCk7Ci0gIAotICAvKiBBbGxvY2F0ZSBzb21lIGNvbG9ycyAqLwotICBibGs9Z2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMCwwLDApOwotICB3aHQ9Z2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMjU1LDI1NSwyNTUpOwotCi0gIC8qIERyYXcgYSBsaW5lICovCi0gIGdkSW1hZ2VMaW5lKGltLDIwLDUwLDE4MCwxNDAsd2h0KTsKLQotICAvKiBPdXRwdXQgdGhlIGltYWdlICovCi0gIG91dD1mb3BlbigidGVzdC5naWYiLCJ3YiIpOwotICBnZEltYWdlR2lmKGltLG91dCk7Ci0gIGZjbG9zZShvdXQpOwotCi0gIC8qIENsZWFuIHVwICovCi0gIGdkSW1hZ2VEZXN0cm95KGltKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotQnkgYnVpbGRpbmcgYSBQZXJsIGludGVyZmFjZSB0byBnZCwgb3VyIGdvYWwgaXMgdG8gd3JpdGUgc2ltaWxhciBjb2RlCi1pbiBQZXJsLiAgVGh1cywgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGdkIGxpYnJhcnkgbXVzdCBiZSBleHBvc2VkIHRvCi10aGUgUGVybCBpbnRlcnByZXRlci4gIFRvIGRvIHRoaXMsIGEgU1dJRyBpbnRlcmZhY2UKLWZpbGUgY2FuIGJlIHdyaXR0ZW4gYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8vIEZpbGUgOiBnZC5pCi0lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotCi10eXBlZGVmIGdkSW1hZ2UgKmdkSW1hZ2VQdHI7Ci0KLWdkSW1hZ2VQdHIgZ2RJbWFnZUNyZWF0ZShpbnQgc3gsIGludCBzeSk7Ci12b2lkICAgICAgIGdkSW1hZ2VEZXN0cm95KGdkSW1hZ2VQdHIgaW0pOwotdm9pZCAgICAgICBnZEltYWdlTGluZShnZEltYWdlUHRyIGltLCAKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgeDEsIGludCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgeDIsIGludCB5MiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IpOwotaW50ICAgZ2RJbWFnZUNvbG9yQWxsb2NhdGUoZ2RJbWFnZVB0ciBpbSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgciwgaW50IGcsIGludCBiKTsKLXZvaWQgIGdkSW1hZ2VHaWYoZ2RJbWFnZVB0ciBpbSwgRklMRSAqb3V0KTsKLQotLy8gRmlsZSBJL08gZnVuY3Rpb25zIChleHBsYWluZWQgc2hvcnRseSkKLUZJTEUgKmZvcGVuKGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUpOwotdm9pZCAgZmNsb3NlKEZJTEUgKik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUluIHRoaXMgZmlsZSwgdGhlIEFOU0kgQyBwcm90b3R5cGVzIGZvciBldmVyeSBmdW5jdGlvbiB0aGF0IHdlIHdvdWxkCi1saWtlIHRvIGFjY2VzcyBmcm9tIFBlcmwgYXJlIGxpc3RlZC4gCi1JbiBhZGRpdGlvbiwgYSBudW1iZXIgb2YgU1dJRwotZGlyZWN0aXZlcyAod2hpY2ggYXJlIGFsd2F5cyBwcmVjZWRlZCBieSBhIGBgJScnKSBhcHBlYXIuICBUaGUgPHR0PgotJW1vZHVsZTwvdHQ+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBtb2R1bGUuICBUaGUKLTx0dD4leywgJX08L3R0PiBibG9jayBpcyB1c2VkIHRvIGluc2VydCBsaXRlcmFsIGNvZGUgaW50byB0aGUgb3V0cHV0Ci13cmFwcGVyIGZpbGUgW2Zvb3Rub3RlIDogVGhpcyBzeW50YXggaXMgZGVyaXZlZCBmcm9tIGxleCBhbmQgeWFjY10uICBJbgotdGhpcyBjYXNlLCB3ZSBzaW1wbHkgaW5jbHVkZSB0aGUgYGA8dHQ+Z2QuaDwvdHQ+JycgaGVhZGVyIGZpbGUuIAotRmluYWxseSwgYSBmZXcgZmlsZQotSS9PIGZ1bmN0aW9ucyBhbHNvIGFwcGVhci4gIFdoaWxlIG5vdCBwYXJ0IG9mIGdkLCB0aGVzZSBmdW5jdGlvbnMKLWFyZSBuZWVkZWQgdG8gbWFudWZhY3R1cmUgZmlsZSBoYW5kbGVzIHVzZWQgYnkgc2V2ZXJhbCBnZCBmdW5jdGlvbnMuCi0KLTxwPgotVG8gcnVuIFNXSUcsIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpcyBleGVjdXRlZDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBzd2lnIC1wZXJsNSBnZC5pCi1HZW5lcmF0aW5nIHdyYXBwZXJzIGZvciBQZXJsIDUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1UaGlzIHByb2R1Y2VzIHR3byBmaWxlcywgPHR0PmdkX3dyYXAuYzwvdHQ+IGFuZAotPHR0PmdkLnBtPC90dD4uICBUaGUgZmlyc3QgZmlsZSBjb250YWlucyBDIHdyYXBwZXIKLWZ1bmN0aW9ucyB0aGF0IGFwcGVhciBzaW1pbGFyIHRvIHRoZSBvdXRwdXQgdGhhdAotd291bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSA8dHQ+eHN1YnBwPC90dD4uCi1UaGUKLTx0dD4ucG08L3R0PiBmaWxlIGNvbnRhaW5zIHN1cHBvcnRpbmcgUGVybCBjb2RlIG5lZWRlZCB0bwotbG9hZCBhbmQgdXNlIHRoZSBtb2R1bGUuIAotCi08cD4KLVRvIGJ1aWxkIHRoZSBtb2R1bGUsCi10aGUgd3JhcHBlciBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LgotVGhpcyBwcm9jZXNzIHZhcmllcyBvbiBldmVyeSBtYWNoaW5lIChjb25zdWx0IHRoZSBtYW4gcGFnZXMpLCBidXQgdGhlIGZvbGxvd2luZwotc3RlcHMgYXJlIHBlcmZvcm1lZCBvbiBMaW51eDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBnY2MgLWZwaWMgLWMgZ2Rfd3JhcC5jIFwKLSAgIC1EYm9vbD1jaGFyIFwKLSAgIC1JL3Vzci9saWIvcGVybDUvaTU4Ni1saW51eC81LjAwNC9DT1JFCi11bml4ICZndDsgZ2NjIC1zaGFyZWQgZ2Rfd3JhcC5vIC1sZ2QgLW8gZ2Quc28KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotQXQgdGhpcyBwb2ludCwgIHRoZSBtb2R1bGUgaXMgcmVhZHkgdG8gdXNlLiAgICBGb3IgZXhhbXBsZSwKLXRoZSBlYXJsaWVyIEMgcHJvZ3JhbSBjYW4gYmUgZGlyZWN0bHkgdHJhbnNsYXRlZCBpbnRvIHRoZQotZm9sbG93aW5nIFBlcmwgc2NyaXB0OgotCi08YmxvY2txdW90ZT48cHJlPgotIyEvdXNyL2Jpbi9wZXJsCi11c2UgZ2Q7Ci0KLSMgQ3JlYXRlIGFuIGltYWdlCi0kaW0gPSBnZDo6Z2RJbWFnZUNyZWF0ZSgyMDAsMjAwKTsKLQotIyBBbGxvY2F0ZSBzb21lIGNvbG9ycwotJGJsaz1nZDo6Z2RJbWFnZUNvbG9yQWxsb2NhdGUoJGltLDAsMCwwKTsKLSR3aHQ9Z2Q6OmdkSW1hZ2VDb2xvckFsbG9jYXRlKCRpbSwyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsMjU1KTsKLQotIyBEcmF3IGEgbGluZSAKLWdkOjpnZEltYWdlTGluZSgkaW0sMjAsNTAsMTgwLDE0MCwkd2h0KTsKLQotIyBPdXRwdXQgdGhlIGltYWdlCi0kb3V0PWdkOjpmb3BlbigidGVzdC5naWYiLCJ3YiIpOwotZ2Q6OmdkSW1hZ2VHaWYoJGltLCRvdXQpOwotZ2Q6OmZjbG9zZSgkb3V0KTsKLQotIyBDbGVhbiB1cCAKLWdkOjpnZEltYWdlRGVzdHJveSgkaW0pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08aDM+IDMuMiBJbnB1dCBGaWxlczwvaDM+Ci0KLUluIHRoZSBnZCBleGFtcGxlLCBTV0lHIHdhcyBnaXZlbiBhIHNwZWNpYWwgaW50ZXJmYWNlIGZpbGUKLWNvbnRhaW5pbmcgYSBsaXN0IG9mIHRoZSBDIGRlY2xhcmF0aW9ucyB0byBiZSBpbmNsdWRlZAotaW4gdGhlIFBlcmwgbW9kdWxlLiAgV2hlbiB3b3JraW5nIHdpdGggYSBsYXJnZSBDIGxpYnJhcnksIGludGVyZmFjZQotZmlsZXMgY2FuIG9mdGVuIGJlIGNvbnN0cnVjdGVkIGJ5IGNvcHlpbmcgYW4KLWV4aXN0aW5nIGhlYWRlciBmaWxlIGFuZCBtb2RpZnlpbmcgaXQgc2xpZ2h0bHkuICBIb3dldmVyLCBpbiBzb21lCi1jYXNlcywgaXQgaXMgcG9zc2libGUgdG8gaW5jbHVkZSBhIGhlYWRlciBmaWxlIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotCi0vLyBHcmFiIHRoZSBkZWNsYXJhdGlvbnMgZnJvbSBnZC5oCi0laW5jbHVkZSAiZ2QuaCIKLQotLy8gU29tZSBmaWxlIEkvTyBmdW5jdGlvbnMKLUZJTEUgKmZvcGVuKGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUpOwotdm9pZCAgZmNsb3NlKEZJTEUgKik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSA8dHQ+JWluY2x1ZGU8L3R0PiBkaXJlY3RpdmUgdGVsbHMgU1dJRyB0byBpbmNsdWRlIGEgZmlsZSBhbmQKLXBhcnNlIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGl0IGNvbnRhaW5zLiAgIEluIHRoaXMgY2FzZSwgdGhlCi1pbnRlcmZhY2Ugd291bGQgbm93IHdyYXAgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGdkIGxpYnJhcnkKLWFzIG9wcG9zZWQgdG8gdGhlIGhhbGYtZG96ZW4gZnVuY3Rpb25zIGxpc3RlZCBpbiB0aGUgZmlyc3QgZXhhbXBsZS4KLQotPHA+Ci1TV0lHIGFsc28gaW5jbHVkZXMgYSBDIHByZXByb2Nlc3NvciB0aGF0IGNhbiBiZSB1c2VkIGZvciBtYWNybwotZXhwYW5zaW9uIGFuZCBjb25kaXRpb25hbCBjb21waWxhdGlvbi4gICBJZiBhIG5ldyBhcHBsaWNhdGlvbiBpcwotYmVpbmcgd3JpdHRlbiB3aXRoIFNXSUcgaW4gbWluZCwgaGVhZGVyIGZpbGVzIGNhbiBiZSB3cml0dGVuIGFzCi1mb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotI2lmZGVmIFNXSUcKLSVtb2R1bGUgZ2QKLSV7Ci0jaW5jbHVkZSAiZ2QuaCIKLSV9Ci0jZW5kaWYKLQotLyogQyBkZWNsYXJhdGlvbnMgKi8KLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1XaXRoIHRoaXMgYXBwcm9hY2gsIHRoZSBmaWxlIGNhbiBzZXJ2ZSBhcyBib3RoIGEgdmFsaWQgQyBoZWFkZXIKLWZpbGUgYW5kIGFzIGFuIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLiAgIFRoZSA8dHQ+U1dJRzwvdHQ+IHN5bWJvbAotaXMgb25seSBkZWZpbmVkIHdoZW4gU1dJRyBpcyBwYXJzaW5nIHNvIHNwZWNpYWwgZGlyZWN0aXZlcyBjYW4gYmUKLWVhc2lseSBoaWRkZW4gZnJvbSB0aGUgQyBjb21waWxlciBhcyBuZWVkZWQuCi0KLTxwPgotRmluYWxseSwgZm9yIHRoZSB0cnVseSBsYXp5LCBTV0lHIGNhbiBzb21ldGltZXMgYmUgcnVuIGRpcmVjdGx5IG9uCi1DIGhlYWRlciBhbmQgc291cmNlIGZpbGVzLiAgRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lIHN3aWcgLXBlcmw1IC1tb2R1bGUgZ2QgZ2QuaAotJSBzd2lnIC1wZXJsNSAtbW9kdWxlIGV4YW1wbGUgZXhhbXBsZS5jCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLU1vc3QgdXNlcnMsIGhvd2V2ZXIsIHVzZSBhIG1peCBvZiBkZWRpY2F0ZWQgaW50ZXJmYWNlIGZpbGVzCi1hbmQgaGVhZGVyIGZpbGVzLgotCi08aDM+IDMuMyBEYXRhIE1vZGVsPC9oMz4KLQotVGhlIG1vc3QgY3JpdGljYWwgcGFydCBvZiBpbnRlcmZhY2luZyBQZXJsIHRvIEMgcHJvZ3JhbXMgaXMKLXRoZSBtYW5hZ2VtZW50IG9mIGRhdGEuICAgU2luY2UgUGVybCBhbmQgQyB1dGlsaXplIGEgZGlmZmVyZW50IHNldCBvZgotaW50ZXJuYWwgZGF0YXR5cGVzLCB3cmFwcGVyIGdlbmVyYXRvcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBwcm9kdWNpbmcKLWNvZGUgdGhhdCBtYXJzaGFscyBkYXRhIGFuZCBvYmplY3RzIGJldHdlZW4gbGFuZ3VhZ2VzLiAgIEZvciBmdW5kYW1lbnRhbCB0eXBlcwotc3VjaCBhcyA8dHQ+aW50PC90dD4gYW5kIDx0dD5kb3VibGU8L3R0PiB0aGUgY29udmVyc2lvbiBwcm9jZXNzIGlzIAotc3RyYWlnaHRmb3J3YXJkLiAgSG93ZXZlciwgcG9pbnRlcnMsIGFycmF5cywgc3RydWN0dXJlcywgYW5kIG9iamVjdHMKLWNvbXBsaWNhdGUgdGhlIHByb2Nlc3MuICAgRnVydGhlcm1vcmUsIHNpbmNlIG1vc3QgQy9DKysgcHJvZ3JhbXMKLW1ha2UgZXh0ZW5zaXZlIHVzZSBvZiB0aGVzZSBkYXRhdHlwZXMsIGl0IGlzIGltcG9ydGFudCBmb3Igd3JhcHBlciBnZW5lcmF0b3JzCi10byBzdXBwb3J0IGFzIG1hbnkgb2YgdGhlc2UgZGF0YXR5cGVzIGFzIHBvc3NpYmxlLgotCi08aDQ+IDMuMy4xIFBvaW50ZXJzPC9oND4KLQotU1dJRyBtYXBzIEMgcG9pbnRlcnMgYW5kIEMrKyByZWZlcmVuY2VzIGludG8gUGVybCBibGVzc2VkIHJlZmVyZW5jZXMuICBUaGVzZSByZWZlcmVuY2VzCi1jb250YWluIGJvdGggdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIGl0c2VsZiwgcGx1cyBhIHR5cGUtc2lnbmF0dXJlLgotSW4gdGhlIGdkIGV4YW1wbGUsIHBvaW50ZXJzIHdlcmUgdXNlZCB0byBtYW5hZ2UgYm90aCBpbWFnZXMKLWFuZCBmaWxlcy4gICBJZiBvbmUgd2VyZSB0byBwcmludCBvdXQgdGhlIHZhbHVlIGEgcG9pbnRlciwgaXQgd291bGQKLWFwcGVhciBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotZ2RJbWFnZVB0cj1TQ0FMQVIoMHg4MGI5OTE0KQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1TV0lHIHVzZXMgdGhlIHR5cGUtc2lnbmF0dXJlIHRvIHBlcmZvcm0gcnVuLXRpbWUgY2hlY2tpbmcgb2YgYWxsIHBvaW50ZXIgdmFsdWVzLiAgVGhlc2UgY2hlY2tzIGVtdWxhdGUKLW1hbnkgb2YgdGhlIGNoZWNrcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgYnkgYSBDIGNvbXBpbGVyLiAKLVdoZW4gYW4gaW52YWxpZCBQZXJsIGRhdGF0eXBlCi1vciBwb2ludGVyIG9mIGludmFsaWQgdHlwZSBpcyB1c2VkLCBhIHJ1bi10aW1lIGVycm9yIGlzIGdlbmVyYXRlZC4gIEZvciBleGFtcGxlLAotCi08YmxvY2txdW90ZT48cHJlPgotJSBwZXJsCi11c2UgZ2Q7Ci0kZiA9IGdkOjpmb3BlbigidGVzdC5naWYiLCJ3Iik7Ci1nZDo6Z2RJbWFnZUxpbmUoJGYsMjAsNTAsMTgwLDE0MCwwKTsKLVR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiBnZEltYWdlTGluZS4gCi1FeHBlY3RlZCBnZEltYWdlUHRyLiBhdCAtIGxpbmUgMy4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVHlwZS1jaGVja2luZyBpcyBiYXNlZCBvbiB0aGUgbmFtZSBvZiBlYWNoIGRhdGF0eXBlLiAgIEhvd2V2ZXIsCi10aGUgdHlwZS1jaGVja2VyIGFsc28ga2VlcHMgdHJhY2sgb2YgQysrIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGFuZAotPHR0PnR5cGVkZWY8L3R0PiBkZWZpbml0aW9ucy4gIFRodXMsIGFuIGFjY2VwdGFibGUgcG9pbnRlciB0eXBlIGluY2x1ZGVzIGFueQotYWx0ZXJuYXRlIG5hbWVzIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDx0dD50eXBlZGVmPC90dD4KLWRlY2xhcmF0aW9uIGFzIHdlbGwgYXMgYW55IGRlcml2ZWQgZGF0YXR5cGVzIGluIEMrKy4KLQotPHA+Ci1XaGVuIHBvaW50ZXJzIGFyZSBtYW5pcHVsYXRlZCBpbiBQZXJsLCB0aGV5IGFyZSBvcGFxdWUgdmFsdWVzLiAgVGhhdAotaXMsIHBvaW50ZXJzIGNhbiBiZSBjcmVhdGVkIGFuZCBwYXNzZWQgYXJvdW5kIHRvIG90aGVyIEMgZnVuY3Rpb25zLAotYnV0IHRoZXkgY2FuIG5vdCBiZSBkZXJlZmVyZW5jZWQgZGlyZWN0bHkuICBUaHVzLCBpbiB0aGUgZXhhbXBsZSwgaXQKLWlzIGRpZmZpY3VsdCAob3IgaW1wcmFjdGljYWwpIGZvciBhIHVzZXIgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZSB0aGUgaW50ZXJuYWwKLXJlcHJlc2VudGF0aW9uIG9mIGFuIGltYWdlIGZyb20gdGhlIFBlcmwgaW50ZXJwcmV0ZXIuICBGdXJ0aGVybW9yZSwKLVNXSUcsIGJ5IGRlZmF1bHQsIGhhbmRsZXMgYWxsIHBvaW50ZXJzIGluIGEgdW5pZm9ybSBtYW5uZXIuICBUaHVzLAotZGF0YXR5cGVzIHN1Y2ggYXMgPHR0PkZJTEUgKjwvdHQ+IGFyZSByZXByZXNlbnRlZCBhcyBibGVzc2VkIHJlZmVyZW5jZXMKLWV2ZW4gdGhvdWdoIHN1Y2ggdHlwZXMgbWF5IGFwcGVhciByZW1hcmthYmx5IHNpbWlsYXIgdG8gb3RoZXIgUGVybAotZGF0YXR5cGVzIHN1Y2ggYXMgZmlsZSBoYW5kbGVzLgotCi08aDQ+IDMuMy4yIEFycmF5czwvaDQ+Ci0KLVNXSUcgbWFwcyBhbGwgYXJyYXlzIGludG8gcG9pbnRlcnMgd2hlcmUgdGhlIGBgdmFsdWUnJyBvZiBhbiBhcnJheQotaXMgc2ltcGx5IGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuICBUaGlzIGlzCi10aGUgc2FtZSBtb2RlbCB1c2VkIGJ5IEMgY29tcGlsZXJzIGFuZCBsaWtlIEMsIFNXSUcgcGVyZm9ybXMgbm8KLWJvdW5kcyBvciBzaXplIGNoZWNraW5nLiAgIFRodXMsIGEgZnVuY3Rpb24gc3VjaCBhcyAKLQotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQgZm9vKGRvdWJsZSBhWzRdWzRdKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotd291bGQgYWNjZXB0IDxlbT5hbnk8L2VtPiBvYmplY3Qgb2YgdHlwZSA8dHQ+ZG91YmxlICo8L3R0Pi4gIEl0IGlzCi11cCB0byB0aGUgdXNlciB0byBlbnN1cmUgdGhhdCB0aGUgcG9pbnRlciBpcyB2YWxpZCBhbmQgdGhhdCBpdAotcG9pbnRzIHRvIG1lbW9yeSB0aGF0IGhhcyBiZWVuIHByb3Blcmx5IGFsbG9jYXRlZC4KLQotPGg0PiAzLjMuMyBTdHJ1Y3R1cmVzIGFuZCBPYmplY3RzPC9oND4KLQotRmluYWxseSwgYWxsIHN0cnVjdHVyZXMgYW5kIG9iamVjdHMgYXJlIHJlcHJlc2VudGVkIGFzCi1wb2ludGVycy4gIFRoaXMgaW5jbHVkZXMgY2FzZXMgd2hlcmUgb2JqZWN0cyBhcmUgbWFuaXB1bGF0ZWQKLWJ5IHZhbHVlLiAgRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbnMKLQotPGJsb2NrcXVvdGU+PHByZT4KLWRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwotVmVjdG9yIGNyb3NzX3Byb2R1Y3QoVmVjdG9yIGEsIFZlY3RvciBiKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1hcmUgdHJhbnNmb3JtZWQgYnkgU1dJRyBpbnRvIHRoZSBmb2xsb3dpbmcgd3JhcHBlcnMgW2Zvb3Rub3RlOiBXaGVuCi1DKysgaXMgdXNlZCwgIFNXSUcgdXNlcyB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQgb2YKLTx0dD5tYWxsb2M8L3R0Pl06Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1kb3VibGUKLXdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKLSAgcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKLX0KLVZlY3RvciAqCi13cmFwX2Nyb3NzX3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKLSAgVmVjdG9yICpyOwotICByID0gKFZlY3RvciAqKSBtYWxsb2Moc2l6ZW9mKFZlY3RvcikpOwotICAqciA9IGNyb3NzX3Byb2R1Y3QoKmEsKmIpOwotICByZXR1cm4gcjsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdHMgYnkgcmVmZXJlbmNlIGF2b2lkcwotdGhlIHByb2JsZW0gb2YgbWFyc2hhbGluZyBvYmplY3RzIGJldHdlZW4gYSBDIGFuZCBQZXJsIHJlcHJlc2VudGF0aW9uLS1hCi1wcm9jZXNzIHRoYXQgd291bGQgYmUgZXh0cmVtZWx5IGRpZmZpY3VsdCBmb3IKLXZlcnkgY29tcGxpY2F0ZWQgQyBkYXRhdHlwZXMuICBJdCBhbHNvIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZQotc2luY2UgbWFuaXB1bGF0aW5nIHJlZmVyZW5jZXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjb3B5aW5nIG9iamVjdAotZGF0YSBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIGxhbmd1YWdlcy4gIEZpbmFsbHksIHRoZSB1c2Ugb2YgcmVmZXJlbmNlcyAKLWNsb3NlbHkgbWF0Y2hlcyB0aGUgd2F5IGluIHdoaWNoIG1vc3QgQy9DKysgcHJvZ3JhbXMgYWxyZWFkeSBoYW5kbGUgCi1vYmplY3RzLiAgCi0KLTxwPgotVGhlIGRvd25zaWRlIHRvIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBvYmplY3RzIGFyZSBvcGFxdWUgaW4gUGVybC4KLVRoaXMgcHJldmVudHMgdXNlcnMgZnJvbSBleGFtaW5pbmcgdGhlaXIgY29udGVudHMgZGlyZWN0bHkuICBJbgotYWRkaXRpb24sIFNXSUcgd3JhcHBlcnMgb2NjYXNpb25hbGx5IG5lZWQgdG8gcGVyZm9ybSBpbXBsaWNpdCBtZW1vcnkKLWFsbG9jYXRpb25zIGFzIHNob3duIGFib3ZlLiAgSXQgaXMgdXAgdGhlIHVzZXIgdG8gZnJlZSB0aGUgcmVzb3VyY2VzCi11c2VkIGJ5IHN1Y2ggZnVuY3Rpb25zIChvciBsZWFybiB0byBsaXZlIHdpdGggYSBtZW1vcnkgbGVhaykuICBPZgotY291cnNlLCB0aGlzIG5hdHVyYWxseSBicmluZ3MgdXMgdG8gdGhlIG5leHQgdG9waWMuCi0KLTxoND4gMy4zLjQgTWVtb3J5IE1hbmFnZW1lbnQ8L2g0PgotCi1TV0lHIG1haW50YWlucyBhIHN0cmljdCBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIG1hbmFnZW1lbnQgb2YgUGVybCBhbmQgQyAKLW9iamVjdHMuICBXaGlsZSBQZXJsIHVzZXMgcmVmZXJlbmNlIGNvdW50aW5nIHRvIGtlZXAgdHJhY2sgb2YgaXRzCi1vd24gb2JqZWN0cywgdGhpcyBzY2hlbWUgaXMgbm90IGV4dGVuZGVkIHRvIEMvQysrCi1leHRlbnNpb25zIGNyZWF0ZWQgd2l0aCBTV0lHLiAgVGh1cywgd2hlbiBQZXJsIGRlc3Ryb3lzIGEgYmxlc3NlZAotcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIGEgQyBwb2ludGVyLCAgb25seSB0aGUgcG9pbnRlcgotdmFsdWUgZGlzYXBwZWFycywgbm90IHRoZSB1bmRlcmx5aW5nIEMgZGF0YSB0aGF0IGl0IHBvaW50cyB0by4KLQotPHA+Ci1Gcm9tIGEgdXNlciBzdGFuZHBvaW50LCBTV0lHIGdlbmVyYXRlZCBDL0MrKyBleHRlbnNpb25zIGZvbGxvdyB0aGUKLXNhbWUgbWVtb3J5IG1hbmFnZW1lbnQgcnVsZXMgYXMgdGhlIHVuZGVybHlpbmcgYXBwbGljYXRpb24uCi1UaHVzLCBpZiBhIHByb2dyYW0gcmVsaWVzIG9uIDx0dD5tYWxsb2M8L3R0PiBhbmQgPHR0PmZyZWU8L3R0PiB0byBhbGxvY2F0ZQotYW5kIGRlYWxsb2NhdGUgb2JqZWN0cywgdGhlc2Ugd2lsbCBhbHNvIGJlIHVzZWQgZnJvbSB0aGUgUGVybAotaW50ZXJwcmV0ZXIuICBMaWtld2lzZSwgYSBDKysgZXh0ZW5zaW9uIHR5cGljYWxseSByZXF1aXJlcwotZXhwbGljaXQgaW52b2NhdGlvbiBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiAgRnVydGhlcm1vcmUsIGZvcgotZnVuY3Rpb25zIHRoYXQgaW1wbGljaXRseSBhbGxvY2F0ZSBtZW1vcnkgYXMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sCi1pdCBpcyB1cCB0byB0aGUgdXNlciB0byBleHBsaWNpdGx5IGRlc3Ryb3kgdGhlIHJlc3VsdCB1c2luZyA8dHQ+Ci1mcmVlPC90dD4gb3IgYSBDKysgZGVzdHJ1Y3Rvci4gV2hpbGUgc3VjaCBhIHNjaGVtZSBtYXkgc2VlbSBwcm9ibGVtYXRpYywKLWl0IGlzIG5vIGxlc3MgcHJvYmxlbWF0aWMgdGhhbiBtZW1vcnkgbWFuYWdlbWVudCBpbiBDICh3aGljaCBtYXkgb3IKLW1heSBub3QgYmUgYSBnb29kIHRoaW5nIGRlcGVuZGluZyBvbiB5b3VyIHBvaW50IG9mIHZpZXcpLiAgRXZlbiBpZgotaXQgd2VyZSBwb3NzaWJsZSB0byBoYXZlIFBlcmwgYXV0b21hdGljYWxseSBtYW5hZ2UgQy9DKysgb2JqZWN0cywgdGhpcwotd291bGQgYmUgYW4gaW5oZXJlbnRseSBkYW5nZXJvdXMgYWZmYWlyLS1lc3BlY2lhbGx5IHNpbmNlIFBlcmwgaGFzIG5vCi13YXkgdG8ga25vdyBob3cgYW4gdW5kZXJseWluZyBDIGFwcGxpY2F0aW9uIHJlYWxseSBvcGVyYXRlcy4gRnVydGhlcm1vcmUsIGl0Ci13b3VsZCBiZSBhIGZhdGFsIGVycm9yIGZvciBQZXJsIHRvIGRlYWxsb2NhdGUgb2JqZWN0cyB0aGF0IHdlcmUgc3RpbGwKLWluIHVzZS4KLVRoZXJlZm9yZSwgU1dJRyBsZWF2ZXMgbWVtb3J5IG1hbmFnZW1lbnQgbGFyZ2VseSB1cCB0aGUgdXNlci4KLQotPGg0PiAzLjMuNSBQb2ludGVycywgQXJyYXlzLCBhbmQgUGVybDwvaDQ+Ci0KLUEgY29tbW9uIGNvbmZ1c2lvbiBhbW9uZyBzb21lIG5vdmljZSB1c2VycyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIAotQyBkYXRhdHlwZXMgYW5kIHNpbWlsYXIgUGVybCBkYXRhdHlwZXMuICAgCi1JbiBwYXJ0aWN1bGFyLCAgUGVybCByZWZlcmVuY2VzIGFyZSBub3QgdGhlCi1zYW1lIGFzIGEgQyBwb2ludGVycyBhbmQgUGVybCBhcnJheXMgYXJlIG5vdCB0aGUgc2FtZSBhcyBDIGFycmF5cy4gIERpZmZlcmVuY2VzCi1hbHNvIGFwcGx5IHRvIG90aGVyIGRhdGF0eXBlcyBzdWNoIGFzIGZpbGVzICh0aGlzIGlzIHRoZSByZWFzb24gdGhhdAotdGhlIHNpbXBsZSBleGFtcGxlIGluY2x1ZGVkIHByb3RvdHlwZXMgZm9yIDx0dD5mb3BlbjwvdHQ+IGFuZCA8dHQ+ZmNsb3NlPC90dD4pLgotVGhlIHByaW1hcnkgcmVhc29uIGZvcgotdGhlc2UgZGlmZmVyZW5jZXMgaXMgdGhhdCBvYmplY3RzIGluIFBlcmwgaGF2ZSBhIGRpZmZlcmVudCBpbnRlcm5hbAotcmVwcmVzZW50YXRpb24gdGhhbiBvYmplY3RzIGluIEMuICBGb3IgZXhhbXBsZSwgYSBQZXJsIGFycmF5IGlzCi1yZXByZXNlbnRlZCBhcyBhIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlcyB0byBQZXJsIG9iamVjdHMgd2hpY2ggbWF5IGJlIG9mIG1peGVkCi10eXBlcy4gIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFycmF5IGlzIGVudGlyZWx5Ci1kaWZmZXJlbnQgdGhhbiB3aGF0IHdvdWxkIGJlIHVzZWQgZm9yIGEgbm9ybWFsIEMgYXJyYXkuICBUaGVyZWZvcmUsIGl0Ci1pcyBpbXBvc3NpYmxlIHRvIHRha2UgYSBQZXJsIGFycmF5IGFuZCBwYXNzIGl0IGluIHVubW9kaWZpZWQgZm9ybSB0bwotYW4gYXJiaXRyYXJ5IEMgZnVuY3Rpb24uCi0KLTxwPgotVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBQZXJsIGFuZCBDIGRhdGF0eXBlcyBvZnRlbiBhcmlzZXMgd2l0aAotQyBmdW5jdGlvbnMgc3VjaCBhcyB0aGUgZm9sbG93aW5nOgotCi08YmxvY2txdW90ZT48cHJlPgotLyogUGxvdCBzb21lIHBvaW50cyAqLwotdm9pZAotcGxvdHB0cyhnZEltYWdlUHRyIGltLCBpbnQgeFtdLCBpbnQgeVtdLAotICAgICAgICBpbnQgbnB0cywgIGludCBjKQotewotICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBucHRzOyBpKyspIHsKLSAgICAgIGdkSW1hZ2VTZXRQaXhlbChpbSx4W2ldLHlbaV0sYyk7Ci0gICB9Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLQotSWRlYWxseSwgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gcGFzcyBQZXJsIGFycmF5cyBhcyBhcmd1bWVudHMgCi1hcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotQGEgPSAoMTAsMjAsMzAsNDApOwotQGIgPSAoNTAsNzAsNjAsMjAwKTsKLWdkOjpwbG90cHRzKCRpbSxcQGEsXEBiLDQsMSk7ICMgRXJyb3IhCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLQotSG93ZXZlciwgdGhpcyBzY3JpcHQgZ2VuZXJhdGVzIGEgdHlwZSBlcnJvciBpbnN0ZWFkIG9mIGFjdGluZwotYXMgb25lIG1pZ2h0IGV4cGVjdC4gICAgV2hpbGUgc3VjaCBiZWhhdmlvciBtYXkgc2VlbSByZXN0cmljdGl2ZQotb3IgYml6YXJyZSwgU1dJRyBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgZGVzaWduZWQgdG8gb3BlcmF0ZQotaW4gdGhpcyBtYW5uZXIuICAgSW4gZmFjdCwgdGhlcmUgYXJlIGV2ZW4gYmVuZWZpdHMgdG8gdGhpcyBhcHByb2FjaC4KLUlmIFBlcmwgYXJyYXlzIHdlcmUgdG8gYmUgdXNlZCBhcyBDIGFycmF5cywgYSAKLWNvcHkgd291bGQgYmUgbWFkZSwgdmVyaWZpZWQgZm9yIHR5cGUtY29ycmVjdG5lc3MsIGFuZCBkZWFsbG9jYXRlZCBldmVyeSAKLXRpbWUgYW4gYXJyYXkgd2FzIHBhc3NlZCB0byBhIEMgZnVuY3Rpb24uICBGb3IgbGFyZ2UgYXJyYXlzLCB0aGlzIHdvdWxkCi1pbnRyb2R1Y2UgYSBzdWJzdGFudGlhbCBwZXJmb3JtYW5jZSBvdmVyaGVhZC4gICBTcGFjZSByZXF1aXJlbWVudHMgYXJlCi1hbHNvIGEgY29uY2VybiBmb3Igc29tZSBDIHByb2dyYW1zLiAgRm9yIGV4YW1wbGUsIGEgbnVtZXJpY2FsIGFwcGxpY2F0aW9uCi1taWdodCBtYW5pcHVsYXRlIGFycmF5cyB3aXRoIG1pbGxpb25zIG9mIGVsZW1lbnRzLiAgIENvbnZlcnRpbmcgc3VjaAotYXJyYXlzIHRvIGFuZCBmcm9tIGEgUGVybCByZXByZXNlbnRhdGlvbiB3b3VsZCBjbGVhcmx5IGludHJvZHVjZSBzdWJzdGFudGlhbCBtZW1vcnkKLWFuZCBwZXJmb3JtYW5jZSBvdmVyaGVhZC4gIEluIGNvbnRyYXN0LCBtYW5pcHVsYXRpbmcgcG9pbnRlcnMgdG8gc3VjaCBhcnJheXMKLWlzIGVhc3kgYW5kIGVmZmljaWVudC4KLQotPHA+Ci1JdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IFNXSUcgcHJvdmlkZXMgYSB2YXJpZXR5IG9mIGN1c3RvbWl6YXRpb24gb3B0aW9ucwotdGhhdCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgaXRzIGJlaGF2aW9yLiAgSW4gZmFjdCwgb25lIGNhbiBldmVuIG1ha2UgU1dJRyBtYXAKLVBlcmwgYXJyYXlzIGludG8gQyBhcnJheXMgaWYgZGVzaXJlZC4gIFRoZXJlZm9yZSwgbW9zdCByZXN0cmljdGlvbnMKLWNhbiBiZSBlbGltaW5hdGVkIHdpdGggYSBsaXR0bGUgZXh0cmEgd29yay4gIFNvbWUgb2YgdGhlc2UgY3VzdG9taXphdGlvbiB0ZWNobmlxdWVzIGFyZQotZGVzY3JpYmVkIHNob3J0bHkuCi0KLTxoMz4gMy40IEhlbHBlciBGdW5jdGlvbnMgPC9oMz4KLQotU29tZXRpbWVzIHRoZSBQZXJsIGludGVyZmFjZSBjb25zdHJ1Y3RlZCBieSBTV0lHIGlzIGxhY2tpbmcgaW4KLWZ1bmN0aW9uYWxpdHkgb3IgaXMgZGlmZmljdWx0IHRvIHVzZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBwcmV2aW91cwotc2VjdGlvbiwgYSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gQyBhcnJheXMgd2FzIHByZXNlbnRlZC4gIFRvIGNvbnN0cnVjdAotQyBhcnJheXMgZnJvbSBQZXJsLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIHNvbWUgYWRkaXRpb25hbCAKLWZ1bmN0aW9ucyB0byB0aGUgU1dJRyBpbnRlcmZhY2UuICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZQotPHR0PiVpbmxpbmU8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8vIEFkZCBzb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIEMgYXJyYXlzCi0laW5saW5lICV7Ci1pbnQgKmludF9hcnJheShpbnQgc2l6ZSkgewotICAgcmV0dXJuIChpbnQgKikgbWFsbG9jKHNpemVvZihpbnQpKnNpemUpOwotfQotdm9pZCBpbnRfZGVzdHJveShpbnQgKmEpIHsKLSAgIGZyZWUoYSk7Ci19Ci12b2lkIGludF9zZXQoaW50ICphLCBpbnQgaSwgaW50IHZhbCkgewotICAgYVtpXSA9IHZhbDsKLX0KLWludCBpbnRfZ2V0KGludCAqYSwgaW50IGkpIHsKLSAgIHJldHVybiBhW2ldOwotfQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotV2hlbiBTV0lHIGJ1aWxkcyB0aGUgc2NyaXB0aW5nIGludGVyZmFjZSwgdGhlc2UgZnVuY3Rpb25zCi1iZWNvbWUgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIG1vZHVsZSBhbmQgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMgQ29udmVydCBhIFBlcmwgYXJyYXkgaW50byBhIEMgaW50IGFycmF5Ci1zdWIgY3JlYXRlX2FycmF5IHsKLSAkbGVuID0gc2NhbGFyKEBfKTsKLSAkaWEgPSBnZDo6aW50X2FycmF5KCRsZW4pOwotIGZvciAoJGkgPSAwOyAkaSAmbHQ7ICRsZW47ICRpKyspIHsKLSAgICB2YWwgPSBzaGlmdDsKLSAgICBnZDo6aW50X3NldCgkaWEsJGksJHZhbCk7Ci0gfQotIHJldHVybiAkaWE7Ci19Ci0gICAKLUBhID0gKDEwLDIwLDMwLDQwKTsKLUBiID0gKDUwLDcwLDYwLDIwMCk7Ci0kaWEgPSBjcmVhdGVfYXJyYXkoQGEpOyAgIyBDcmVhdGUgQyBhcnJheXMKLSRpYiA9IGNyZWF0ZV9hcnJheShAYik7Ci1nZDo6cGxvdHB0cygkaW0sJGlhLCRpYiw0LDEpOwotLi4uCi1nZDo6aW50X2Rlc3Ryb3koJGlhKTsKLWdkOjppbnRfZGVzdHJveSgkaWIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08aDM+IDMuNSBDbGFzc2VzIGFuZCBTdHJ1Y3R1cmVzPC9oMz4KLQotV2hpbGUgU1dJRyByZXByZXNlbnRzIGFsbCBvYmplY3RzIGFzIG9wYXF1ZSBwb2ludGVycywgdGhlCi1jb250ZW50cyBvZiBhbiBvYmplY3QgY2FuIGJlIGV4YW1pbmVkIGFuZCBtb2RpZmllZCB0aHJvdWdoCi10aGUgdXNlIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotLyogRXh0cmFjdCBkYXRhIGZyb20gYW4gb2JqZWN0ICovCi1kb3VibGUgUG9pbnRfeF9nZXQoUG9pbnQgKnApIHsKLSAgICByZXR1cm4gcC0mZ3Q7eDsKLX0KLS8qIEludm9rZSBhIEMrKyBtZW1iZXIgZnVuY3Rpb24gKi8KLWludCBGb29fYmFyKEZvbyAqZikgewotICAgIHJldHVybiBmLSZndDtiYXIoKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotRnJvbSBhIFBlcmwgc2NyaXB0LCBhIHVzZXIgc2ltcGx5IHBhc3NlcyBhbiBvYmplY3QgcG9pbnRlcgotdG8gYWNjZXNzb3IgZnVuY3Rpb25zIHRvIGV4dHJhY3QgaW50ZXJuYWwgaW5mb3JtYXRpb24KLW9yIGludm9rZSBtZW1iZXIgZnVuY3Rpb25zLgotCi08cD4KLVdoaWxlIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGFjY2Vzc29yIGZ1bmN0aW9ucwotbWFudWFsbHksIFNXSUcgYXV0b21hdGljYWxseSBjcmVhdGVzIHRoZW0gd2hlbiBpdCBpcwotZ2l2ZW4gc3RydWN0dXJlIGFuZCBjbGFzcyBkZWZpbml0aW9ucy4gRm9yIGV4YW1wbGUsIGluIHRoZSBnZCBsaWJyYXJ5LCB0aGUKLWZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBjb250YWluIGltYWdlIGluZm9ybWF0aW9uOgotCi08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiBzdHJ1Y3QgZ2RJbWFnZVN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKiogcGl4ZWxzOwotICAgICAgICBpbnQgc3g7Ci0gICAgICAgIGludCBzeTsKLSAgICAgICAgaW50IGNvbG9yc1RvdGFsOwotLi4uCi19IGdkSW1hZ2U7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUlmIHRoaXMgc3RydWN0dXJlIGRlZmluaXRpb24gd2VyZSBwbGFjZWQgaW4gdGhlIFNXSUcKLWludGVyZmFjZSBmaWxlLCBhY2Nlc3NvciBmdW5jdGlvbnMgd291bGQgYXV0b21hdGljYWxseSBiZQotY3JlYXRlZC4gIFRoZXNlIGNvdWxkIHRoZW4gYmUgdXNlZCB0byBleHRyYWN0IGluZm9ybWF0aW9uCi1hYm91dCBpbWFnZXMgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMhL3Vzci9iaW4vcGVybAotdXNlIGdkOwotJGltID0gZ2Q6OmdkSW1hZ2VDcmVhdGUoNDAwLDMwMCk7Ci0jIFByaW50IG91dCB0aGUgaW1hZ2Ugd2lkdGgKLXByaW50IGdkOjpnZEltYWdlX3N4X2dldCgkaW0pLCAiXG4iOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1BY2Nlc3NvciBmdW5jdGlvbnMgYXJlIGFsc28gY3JlYXRlZCBmb3IgQysrIGNsYXNzZXMgYW5kIE9iamVjdGl2ZS1DCi1pbnRlcmZhY2VzLiAgRm9yIGV4YW1wbGUsIHRoZSBjbGFzcyBkZWZpbml0aW9uCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci1jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLSAgIExpc3QoKTsKLSAgfkxpc3QoKTsKLSAgIHZvaWQgaW5zZXJ0KE9iamVjdCAqKTsKLSAgIE9iamVjdCAqZ2V0KGludCBpKTsKLSAgIGludCAgbGVuZ3RoKCk7Ci0gICAuLi4KLX07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLWlzIHRyYW5zbGF0ZWQgaW50byB0aGUgZm9sbG93aW5nIGFjY2Vzc29yIGZ1bmN0aW9uczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLUxpc3QgKm5ld19MaXN0KCkgewotICAgcmV0dXJuIG5ldyBMaXN0OwotfQotdm9pZCBkZWxldGVfTGlzdChMaXN0ICpsKSB7Ci0gICBkZWxldGUgbDsKLX0KLXZvaWQgTGlzdF9pbnNlcnQoTGlzdCAqbCwgT2JqZWN0ICpvKSB7Ci0gICBsLSZndDtpbnNlcnQobyk7Ci19IAotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gMy42IFNoYWRvdyBDbGFzc2VzIGFuZCBQZXJsIE9iamVjdHM8L2gzPgotCi1BcyBhbiBvcHRpb25hbCBmZWF0dXJlLCB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIGNyZWF0ZWQgYnkgU1dJRyBjYW4gYmUKLXVzZWQgdG8gd3JpdGUgUGVybCB3cmFwcGVyIGNsYXNzZXMgKHRoaXMgaXMgZW5hYmxlZCBieSBydW5uaW5nIFNXSUcKLXdpdGggdGhlIDx0dD4tc2hhZG93PC90dD4gb3B0aW9uKS4gIFdoaWxlIGFsbCB0aGUgZ29yeSBkZXRhaWxzIGNhbiBiZQotZm91bmQgaW4gdGhlIFNXSUcgVXNlcnMgTWFudWFsLCB0aGUgZ2VuZXJhbCBpZGVhIGlzIHRoYXQgdGhlIGFjY2Vzc29yCi1mdW5jdGlvbnMgY2FuIGJlIGVuY2Fwc3VsYXRlZCBpbgotYSBQZXJsIGNsYXNzIHRoYXQgbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgdW5kZXJseWluZyBvYmplY3QuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLQotcGFja2FnZSBMaXN0OwotQElTQSA9IHF3KCBleGFtcGxlICk7Ci1zdWIgbmV3IHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIG15IEBhcmdzID0gQF87Ci0gICAgJHNlbGYgPSBuZXdfTGlzdChAYXJncyk7Ci0gICAgcmV0dXJuIHVuZGVmIGlmICghZGVmaW5lZCgkc2VsZikpOwotICAgIGJsZXNzICRzZWxmLCAiTGlzdCI7Ci0gICAgbXkgJXJldHZhbDsKLSAgICB0aWUgJXJldHZhbCwgIkxpc3QiLCAkc2VsZjsKLSAgICByZXR1cm4gYmxlc3MgXCVyZXR2YWwsIkxpc3QiOwotfQotc3ViIERFU1RST1kgewotICAgIGRlbGV0ZV9MaXN0KEBfKTsKLX0KLXN1YiBpbnNlcnQgewotICAgIHJldHVybiAkcmVzdWx0ID0gTGlzdF9pbnNlcnQoQF8pOwotfQotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgdGhlIHVuZGVybHlpbmcgb2JqZWN0IGFuZAotaXMgc2FpZCB0byBgYHNoYWRvdycnIHRoZSBvcmlnaW5hbCBvYmplY3QuIAotU2hhZG93IGNsYXNzZXMgYWxsb3cgQyBhbmQgQysrIG9iamVjdHMgdG8gYmUgdXNlZCBmcm9tIFBlcmwKLWluIGEgbmF0dXJhbCBtYW5uZXIuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLSRsID0gbmV3IExpc3Q7Ci0kbC0mZ3Q7aW5zZXJ0KCRvKTsKLS4uLgotJGwtJmd0O0RFU1RST1koKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotRm9yIEMgc3RydWN0dXJlcywgYWNjZXNzIHRvIHZhcmlvdXMgYXR0cmlidXRlcyBhcmUgcHJvdmlkZWQgdGhyb3VnaAotdGllZCBoYXNoIHRhYmxlcy4gIEZvciB0aGUgZ2QgbGlicmFyeSwgbWVtYmVycyBvZiB0aGUKLWltYWdlIGRhdGEgc3RydWN0dXJlIGNvdWxkIGJlIGFjY2Vzc2VkIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0kaW0gPSBnZDo6Z2RJbWFnZUNyZWF0ZSg0MDAsNDAwKTsKLSR3aWR0aCA9ICRpbS0mZ3Q7e3N4fTsKLSRoZWlnaHQgPSAkaW0tJmd0O3tzeX07Ci0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIG90aGVyIHNpZ25pZmljYW50IGFzcGVjdCBvZiBzaGFkb3cgY2xhc3NlcyBpcyB0aGF0IHRoZXkgYWxsb3cgUGVybAotdG8gcGVyZm9ybSBhIGxpbWl0ZWQgZm9ybSBvZiBhdXRvbWF0aWMgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIEMvQysrCi1vYmplY3RzLiAgSWYgYW4gb2JqZWN0IGlzIGNyZWF0ZWQgZnJvbSBQZXJsIHVzaW5nIGEgc2hhZG93IGNsYXNzLCB0aGUKLTx0dD5ERVNUUk9ZPC90dD4gbWV0aG9kIG9mIHRoYXQgY2xhc3MgYXV0b21hdGljYWxseSBpbnZva2VzIHRoZSBDKysKLWRlc3RydWN0b3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gIEFzIGEgcmVzdWx0LCBDL0MrKyBvYmplY3RzCi13cmFwcGVkIGJ5IHNoYWRvdyBjbGFzc2VzIGNhbiBiZSBtYW5hZ2VkIHVzaW5nIHRoZSBzYW1lIHJlZmVyZW5jZSBjb3VudGluZwotc2NoZW1lIHV0aWxpemVkIGJ5IG90aGVyIFBlcmwgZGF0YXR5cGVzLgotCi08aDM+IDMuNyBDbGFzcyBFeHRlbnNpb248L2gzPgotCi1XaGVuIGJ1aWxkaW5nIG9iamVjdC1vcmllbnRlZCBQZXJsIGludGVyZmFjZXMsIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwKLXRvIG1vZGlmeSBvciBleHRlbmQgb2JqZWN0cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICAgRm9yIGV4YW1wbGUsCi10aGUgZ2QgbGlicmFyeSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmUgZm9yIGRlZmluaW5nIHBvaW50czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgeCx5OwotfSBnZFBvaW50OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KLVRvIG1ha2UgdGhpcyBzdHJ1Y3R1cmUgbW9yZSB1c2VmdWwsIHdlIGNhbiBhZGQgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywKLWFuZCB2YXJpb3VzIG1ldGhvZHMgdG8gaXQgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBpbXBsZW1lbnRlZCBpbiBDIG9yCi1DKyspLiAgVG8gZG8gdGhpcywgdGhlIFNXSUcgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBBZGQgc29tZSBtZXRob2RzIHRvIHBvaW50cyAqLwotJWFkZG1ldGhvZHMgZ2RQb2ludCB7Ci0vKiBDcmVhdGUgYSBwb2ludCBvciBhbiBhcnJheSBvZiBwb2ludHMgKi8KLWdkUG9pbnQoaW50IG5wdHMgPSAxKSB7Ci0gIHJldHVybiAoZ2RQb2ludCAqKSAKLSAgICAgIG1hbGxvYyhzaXplb2YoZ2RQb2ludCkqbnB0cyk7Ci19Ci0vKiBEZXN0cm95IGEgcG9pbnQgKi8KLX5nZFBvaW50KCkgewotICBmcmVlKHNlbGYpOwotfQotLyogQXJyYXkgaW5kZXhpbmcgKi8KLWdkUG9pbnQgKmdldChpbnQgaSkgewotICByZXR1cm4gc2VsZitpOwotfQotLyogQSBkZWJ1Z2dpbmcgZnVuY3Rpb24gKi8KLXZvaWQgb3V0cHV0KCkgewotICBwcmludGYoIiglZCwlZClcbiIsc2VsZi0mZ3Q7eCxzZWxmLSZndDt5KTsKLX0KLX07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLU5vdywgaW4gdGhlIFBlcmwgaW50ZXJmYWNlIDx0dD5nZFBvaW50PC90dD4gd2lsbCBhcHBlYXIganVzdCBsaWtlIGEgCi1jbGFzcyB3aXRoIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGFuZCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIENyZWF0ZSBhIHBvaW50Ci0kcHQgPSBuZXcgZ2RQb2ludDsKLSRwdC0mZ3Q7e3h9ID0gMjA7Ci0kcHQtJmd0O3t5fSA9IDUwOwotJHB0LSZndDtvdXRwdXQoKTsKLQotIyBDcmVhdGUgYW4gYXJyYXkgb2YgcG9pbnRzCi0kcHRzID0gbmV3IGdkUG9pbnQoMTApOwotZm9yICgkaSA9IDA7ICRpICZsdDsgMTA7ICRpKyspIHsKLSAgICRwID0gJHB0cy0mZ3Q7Z2V0KCRpKTsKLSAgICRwLSZndDt7eH0gPSAkaTsKLSAgICRwLSZndDt7eX0gPSAxMCokaTsKLX0KLQotIyBQYXNzIHRoZSBwb2ludHMgdG8gYSBmdW5jdGlvbgotZ2Q6OmdkSW1hZ2VQb2x5Z29uKCRpbSwkcHRzLDEwLDEpOwotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSBjbGFzcyBleHRlbnNpb24gbWVjaGFuaXNtIGlzIGFsc28gYSBwb3dlcmZ1bAotd2F5IHRvIHJlcGFja2FnZSBleGlzdGluZyBmdW5jdGlvbmFsaXR5LiAgRm9yIGV4YW1wbGUsIHRoZQotPHR0PmdkSW1hZ2U8L3R0PiBzdHJ1Y3R1cmUgYW5kIHZhcmlvdXMgZnVuY3Rpb25zIGluIHRoZSBnZCBsaWJyYXJ5Ci1jb3VsZCBiZSBjb21iaW5lZCBpbnRvIGEgUGVybCBjbGFzcyBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotJWFkZG1ldGhvZHMgZ2RJbWFnZSB7Ci1nZEltYWdlKGludCB3LCBpbnQgaCkgewotICByZXR1cm4gZ2RJbWFnZUNyZWF0ZSh3LGgpOwotfQotfmdkSW1hZ2UoKSB7Ci0gIGdkSW1hZ2VEZXN0cm95KHNlbGYpOwotfQotaW50Ci1jb2xvckFsbG9jYXRlKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgcmV0dXJuIGdkSW1hZ2VDb2xvckFsbG9jYXRlKHNlbGYscixnLGIpOwotfQotdm9pZAotbGluZShpbnQgeDEsaW50IHkxLGludCB4MixpbnQgeTIsaW50IGMpIHsKLSAgZ2RJbWFnZUxpbmUoc2VsZix4MSx5MSx4Mix5MixjKTsKLX0KLS4uLgotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVXNlcnMgY2FuIG5vdyB3cml0ZSBzY3JpcHRzIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIS91c3IvYmluL3BlcmwKLXVzZSBnZDsKLSRpbSA9IG5ldyBnZEltYWdlKDQwMCw0MDApOwotJGJsYWNrID0gJGltLSZndDtjb2xvckFsbG9jYXRlKDAsMCwwKTsKLSR3aGl0ZSA9ICRpbS0mZ3Q7Y29sb3JBbGxvY2F0ZSgyNTUsMjU1LDI1NSk7Ci0kaW0tJmd0O2xpbmUoMjAsNTAsMTgwLDE0MCwkd2hpdGUpOwotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVdpdGggdGhlc2Ugc2ltcGxlIG1vZGlmaWNhdGlvbnMsIG91ciBpbnRlcmZhY2UgaXMgYWxyZWFkeQotbG9va2luZyByZW1hcmthYmx5IHNpbWlsYXIgdG8gdGhhdCB1c2VkIGluIHRoZSBHRCBtb2R1bGUKLW9uIENQQU4uICBIb3dldmVyLCBtb3JlIGltcHJvdmVtZW50cyB3aWxsIGJlIGRlc2NyaWJlZCBzaG9ydGx5LgotCi08aDM+IDMuOCBBY2Nlc3MgQ29udHJvbCBhbmQgTmFtaW5nPC9oMz4KLQotSW4gY2VydGFpbiBpbnN0YW5jZXMsIGl0IG1heSBiZSB1c2VmdWwgdG8gcmVzdHJpY3QgYWNjZXNzIHRvCi1jZXJ0YWluIHZhcmlhYmxlcyBhbmQgY2xhc3MgbWVtYmVycy4gICBIaWRpbmcgb2JqZWN0cyBpcyBlYXN5LS1zaW1wbHkKLXJlbW92ZSB0aGVtIGZyb20gdGhlIGludGVyZmFjZSBmaWxlLiAgIFByb3ZpZGluZyByZWFkLW9ubHkgYWNjZXNzIGNhbgotYmUgYWNjb21wbGlzaGVkIHVzaW5nIHRoZSA8dHQ+JXJlYWRvbmx5PC90dD4gYW5kCi08dHQ+JXJlYWR3cml0ZTwvdHQ+IGRpcmVjdGl2ZXMuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8vIENyZWF0ZSByZWFkLW9ubHkgdmFyaWFibGVzCi0lcmVhZG9ubHkKLWludCBmb287ICAgICAgICAgLy8gUmVhZC1vbmx5Ci1kb3VibGUgYmFyOyAgICAgIC8vIFJlYWQtb25seQotJXJlYWR3cml0ZQotCi0vLyBDcmVhdGUgcmVhZC1vbmx5IGNsYXNzIG1lbWJlcnMKLWNsYXNzIExpc3QgewotLi4uCi0lcmVhZG9ubHkKLSAgICBpbnQgbGVuZ3RoOyAgLy8gUmVhZC1vbmx5IG1lbWJlcgotJXJlYWR3cml0ZQotLi4uCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLQotV2hlbiByZWFkLW9ubHkgbW9kZSBpcyB1c2VkLCBhdHRlbXB0cyB0byBtb2RpZnkgYSB2YWx1ZSBmcm9tCi1QZXJsIHJlc3VsdCBpbiBhIHJ1bi10aW1lIGVycm9yLgotCi08cD4KLUFub3RoZXIgY29tbW9uIHByb2JsZW0gaXMgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdmFyaW91cyBDIGRlY2xhcmF0aW9ucy4KLUZvciBleGFtcGxlLCBhIEMgZnVuY3Rpb24gbmFtZSBtYXkgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBQZXJsIGtleXdvcmQgb3Igc3Vicm91dGluZS4gIFRvCi1maXggdGhpcyBwcm9ibGVtLCB0aGUgPHR0PiVuYW1lPC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkLiAgRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbmFtZShjcGFjaykgdm9pZCBwYWNrKE9iamVjdCAqKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1jcmVhdGVzIGEgbmV3IGNvbW1hbmQgYGBjcGFjay4nJyAgIElmIG5hbWUgY29uZmxpY3RzIG9jY3VyIHJlcGVhdGVkbHksCi10aGUgPHR0PiVyZW5hbWU8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIGFsbCBmdXR1cmUgb2NjdXJyZW5jZXMKLW9mIGEgcGFydGljdWxhciBpZGVudGlmaWVyIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lcmVuYW1lIHBhY2sgY3BhY2s7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSByZW5hbWluZyBvcGVyYXRpb25zIGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gQy9DKysgY2xhc3MgYW5kIHN0cnVjdHVyZQotbmFtZXMgYXMgbmVlZGVkLiAgRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbmFtZShJbWFnZSkgY2xhc3MgZ2RJbWFnZSB7Ci0uLi4KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgzPiAzLjkgRXhjZXB0aW9uIEhhbmRsaW5nIDwvaDM+Ci0KLVRvIGNhdGNoIGVycm9ycywgU1dJRyBhbGxvd3MgdXNlcnMgdG8gY3JlYXRlIHVzZXItZGVmaW5lZCBleGNlcHRpb24KLWhhbmRsZXJzIHVzaW5nIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZS4gIFRoZXNlIGhhbmRsZXJzIGFyZQotcmVzcG9uc2libGUgZm9yIGNhdGNoaW5nIGFuZCBjb252ZXJ0aW5nIEMvQysrIHJ1bnRpbWUgZXJyb3JzIGludG8gUGVybAotZXJyb3JzLiAgQXMgYW4gZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBlcnJvciBoYW5kbGVyIGNhbiBiZSB1c2VkIHRvCi1jYXRjaCBlcnJvcnMgaW4gdGhlIHN0YW5kYXJkIEMgbGlicmFyeToKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVleGNlcHQocGVybDUpIHsKLSAgIGVycm5vID0gMDsKLSAgICRmdW5jdGlvbgotICAgaWYgKGVycm5vKSB7Ci0gICAgICBkaWUoc3RyZXJyb3IoZXJybm8pKTsKLSAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotV2hlbiBkZWZpbmVkLCB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgcGxhY2VkIGludG8gYWxsIG9mIHRoZQotd3JhcHBlciBmdW5jdGlvbnMuIEluIHRoZSBwcm9jZXNzLCB0aGUgPHR0PgotJGZ1bmN0aW9uPC90dD4gdG9rZW4gaXMgcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCBDIGZ1bmN0aW9uIGNhbGwuICBGb3IgdGhlCi1leGFtcGxlIHNob3duLCB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgcmVzZXRzIHRoZSA8dHQ+ZXJybm88L3R0PiB2YXJpYWJsZQotYW5kIGNhbGxzIHRoZSBDIGZ1bmN0aW9uLiAgSWYgdGhlIHZhbHVlIG9mIDx0dD5lcnJubzwvdHQ+IGlzIG1vZGlmaWVkIHRvCi1hIG5vbi16ZXJvIHZhbHVlLCBhbiBlcnJvciBtZXNzYWdlIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBDIGxpYnJhcnkKLWFuZCByZXBvcnRlZCBiYWNrIHRvIFBlcmwuICAgCi0KLTxwPgotV2hpbGUgY2F0Y2hpbmcKLWVycm9ycyBpbiB0aGUgQyBsaWJyYXJ5IGhhcyBiZWVuIGlsbHVzdHJhdGVkLCBleGNlcHRpb24gaGFuZGxlcnMKLWNhbiBhbHNvIGJlIHdyaXR0ZW4gdG8gY2F0Y2ggQysrIGV4Y2VwdGlvbnMgb3IgdG8gdXNlIGFueQotc3BlY2lhbCBwdXJwb3NlIGVycm9yIGhhbmRsaW5nIGNvZGUgdGhhdCBtaWdodCBiZSBwcmVzZW50IGluIGFuCi1hcHBsaWNhdGlvbi4KLQotPGgzPiAzLjEwIFR5cGVtYXBzPC9oMz4KLQotVHlwZW1hcHMgYXJlIG9uZSBvZiBTV0lHJ3MgbW9zdCBwb3dlcmZ1bCBmZWF0dXJlcyBhbmQgdGhlIHByaW1hcnkKLW1lYW5zIG9mIGN1c3RvbWl6YXRpb24uICBTaW1wbHkgc3RhdGVkLCBhCi10eXBlbWFwIGlzIGEgc21hbGwgYml0IG9mIEMgY29kZSB0aGF0IGNhbiBiZSBnaXZlbiB0byBTV0lHIHRvIG1vZGlmeQotdGhlIHdheSB0aGF0IGl0IHByb2Nlc3NlcyBzcGVjaWZpYyBkYXRhdHlwZXMuICAKLUZvciBpbnN0YW5jZSwgUGVybCBhcnJheXMgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIEMgYXJyYXlzLCBQZXJsCi1yZWZlcmVuY2VzIGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgcG9pbnRlcnMsIGFuZCBzbyBmb3J0aC4gIFRoaXMKLXNlY3Rpb24gYnJpZWZseSBpbnRyb2R1Y2VzIHR5cGVtYXBzIGFuZCB0aGVpciB1c2UuICBIb3dldmVyLCB0eXBlbWFwcwotYXJlIGEgY29tcGxpY2F0ZWQgdG9waWMgc28gaXQgaXMgaW1wb3NzaWJsZSB0byBjb3ZlciBhbGwgb2YgdGhlIGRldGFpbHMKLWhlcmUgYW5kIGludGVyZXN0ZWQgcmVhZGVycyBhcmUgc3Ryb25nbHkgYWR2aXNlZCB0byBjb25zdWx0IHRoZSBTV0lHIGRvY3VtZW50YXRpb24uCi0KLTxoND4gMy4xMC4xIEV4YW1wbGU6IE91dHB1dCBWYWx1ZXM8L2g0PgotCi1BcyBhIGZpcnN0IHR5cGVtYXAgZXhhbXBsZSwgY29uc2lkZXIgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdmFsdWVzIHRocm91Z2ggaXRzCi1wYXJhbWV0ZXJzIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci12b2lkCi1pbWFnZXNpemUoZ2RJbWFnZVB0ciBpbSwgaW50ICp3LCBpbnQgKmgpIHsKLSAgICAqdyA9IGdkSW1hZ2VTWChpbSk7Ci0gICAgKmggPSBnZEltYWdlU1koaW0pOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1BcyBpcywgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBkaWZmaWN1bHQgdG8gdXNlIGJlY2F1c2UgdGhlCi11c2VyIG11c3Qgd3JpdGUgaGVscGVyIGZ1bmN0aW9ucyB0byBtYW51ZmFjdHVyZSwgZGVyZWZlcmVuY2UsCi1hbmQgZGVzdHJveSBpbnRlZ2VyIHBvaW50ZXJzLiAgVGhlc2UgZnVuY3Rpb25zIG1pZ2h0IGJlIHVzZWQgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSR3cHRyID0gbmV3X2ludGVnZXIoKTsgICMgQ3JlYXRlIGFuICdpbnQgKicKLSRocHRyID0gbmV3X2ludGVnZXIoKTsKLWltYWdlc2l6ZSgkaW0sICR3cHRyLCAkaHB0cik7ICAKLSR3ID0gaW50ZWdlcl92YWx1ZSgkd3B0cik7ICMgRGVyZWZlcmVuY2UKLSRoID0gaW50ZWdlcl92YWx1ZSgkaHB0cik7Ci1kZWxldGVfaW50ZWdlcigkd3B0cik7ICAgICAjIENsZWFuIHVwCi1kZWxldGVfaW50ZWdlcigkaHB0cik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUEgbW9yZSBlbGVnYW50IHNvbHV0aW9uIGlzIHRvIHVzZSB0aGUgU1dJRyB0eXBlbWFwIGxpYnJhcnkKLWluIHRoZSBpbnRlcmZhY2UgZmlsZSBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotJWluY2x1ZGUgdHlwZW1hcHMuaQotdm9pZCBpbWFnZXNpemUoZ2RJbWFnZVB0ciBpbSwgaW50ICpPVVRQVVQsCi0gICAgICAgICAgICAgICBpbnQgKk9VVFBVVCk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLQotTm93LCBpbiB0aGUgUGVybCBzY3JpcHQsIGl0IGlzIHBvc3NpYmxlIHRvIGRvIHRoaXM6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0oJHcsJGgpID0gaW1hZ2VzaXplKCRpbSk7IAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1JbiBhIHNpbWlsYXIgc3Bpcml0LCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZQotUGVybCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0laW5jbHVkZSB0eXBlbWFwcy5pCi12b2lkCi1pbWFnZXNpemUoZ2RJbWFnZVB0ciBpbSwgaW50ICpSRUZFUkVOQ0UsCi0gICAgICAgICAgaW50ICpSRUZFUkVOQ0UpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KLU5vdyBpbiBQZXJsOgotCi08YmxvY2txdW90ZT48cHJlPgotIyBSZXR1cm4gdmFsdWVzIGluICR3IGFuZCAkaAotaW1hZ2VzaXplKCRpbSxcJHcsXCRoKTsgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRvIGltcGxlbWVudCB0aGlzIGJlaGF2aW9yLCB0aGUgZmlsZSA8dHQ+dHlwZW1hcHMuaTwvdHQ+IGRlZmluZXMKLWEgY29sbGVjdGlvbiBvZiB0eXBlbWFwIGBgcnVsZXMnJyB0aGF0IGFyZSBhdHRhY2hlZCB0byBzcGVjaWZpYwotZGF0YXR5cGVzIHN1Y2ggYXMgPHR0PmludCAqT1VUUFVUPC90dD4gYW5kIDx0dD5pbnQgKlJFRkVSRU5DRTwvdHQ+LgotVGhlIGNyZWF0aW9uIG9mIHRoZXNlIHJ1bGVzIGlzIG5vdyBkaXNjdXNzZWQuCi0KLTxoND4gMy4xMC4yIENyZWF0aW5nIE5ldyBUeXBlbWFwczwvaDQ+Ci0KLUFsbCB3cmFwcGVyIGZ1bmN0aW9ucyBwZXJmb3JtIGEgY29tbW9uIHNlcXVlbmNlIG9mIGludGVybmFsIGBgb3BlcmF0aW9ucy4nJwotRm9yIGV4YW1wbGUsIGFyZ3VtZW50cyBtdXN0IGJlIGNvbnZlcnRlZCBmcm9tIFBlcmwgaW50byBhCi1DIHJlcHJlc2VudGF0aW9uLCBhIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIG11c3QgYmUgY29udmVydGVkIGJhY2sgaW50byAKLVBlcmwsIGFyZ3VtZW50IHZhbHVlcyBtaWdodCBiZSBjaGVja2VkLCBhbmQgc28gZm9ydGguICBTV0lHIGdpdmVzIGVhY2ggb2YKLXRoZXNlIG9wZXJhdGlvbnMgYSB1bmlxdWUgbmFtZSBzdWNoIGFzIGBgaW4nJyBmb3IgaW5wdXQgcGFyYW1ldGVyIHByb2Nlc3NpbmcsCi1gYG91dCcnIGZvciByZXR1cm5pbmcgdmFsdWVzLCBgYGNoZWNrJycgZm9yIGNoZWNraW5nIHZhbHVlcywgYW5kIHNvIGZvcnRoLgotVHlwZW1hcHMgYWxsb3cgYSB1c2VyIHRvIHJlLWltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIGZvciBzcGVjaWZpYyBkYXRhdHlwZXMKLWJ5IHN1cHBseWluZyBzbWFsbCBmcmFnbWVudHMgb2YgQyBjb2RlIHRoYXQgU1dJRyBpbnNlcnRzIGludG8gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUuCi0KLTxwPgotVG8gaWxsdXN0cmF0ZSwgY29uc2lkZXIgdGhlIGdkIGV4YW1wbGUuICBJbiB0aGUgb3JpZ2luYWwgaW50ZXJmYWNlIGZpbGUsCi10d28gZnVuY3Rpb25zIHdlcmUgaW5jbHVkZWQgdG8gb3BlbiBhbmQgY2xvc2UgZmlsZXMuICAgVGhlc2Ugd2VyZSByZXF1aXJlZAotYmVjYXVzZSBTV0lHIG5vcm1hbGx5IG1hcHMgYWxsIHBvaW50ZXJzIChpbmNsdWRpbmcgZmlsZXMpIGludG8gYmxlc3NlZAotcmVmZXJlbmNlcy4gIFNpbmNlIGEgYmxlc3NlZCByZWZlcmVuY2UgaXMgbm90IHRoZSBzYW1lIGFzIGEgUGVybCBmaWxlIGhhbmRsZSwKLWl0IGlzIG5vdCBwb3NzaWJsZSB0byBwYXNzIFBlcmwgZmlsZXMgdG8gZnVuY3Rpb25zIGV4cGVjdGluZyBhIDx0dD5GSUxFICo8L3R0Pi4KLUhvd2V2ZXIsIHRoaXMgaXMgZWFzaWx5IGNoYW5nZWQgd2l0aCBhIHR5cGVtYXAgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSV0eXBlbWFwKHBlcmw1LGluKSBGSUxFICogewotICAgJHRhcmdldCA9IElvSUZQKHN2XzJpbygkc291cmNlKSk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoaXMgZGVjbGFyYXRpb24gdGVsbHMgU1dJRyB0aGF0IHdoZW5ldmVyIGEgPHR0PkZJTEUgKjwvdHQ+Ci1hcHBlYXJzIGFzIGEgZnVuY3Rpb24gcGFyYW1ldGVyLCBpdCBzaG91bGQgYmUgY29udmVydGVkIHVzaW5nIHRoZQotc3VwcGxpZWQgQyBjb2RlLiAgV2hlbiBnZW5lcmF0aW5nIHdyYXBwZXJzLCB0aGUgdHlwZW1hcCBjb2RlIGlzCi1pbnNlcnRlZCBpbnRvIGFsbCB3cmFwcGVyIGZ1bmN0aW9ucyB3aGVyZSBhIDx0dD5GSUxFICo8L3R0PiBpcyBpbnZvbHZlZC4KLUluIHRoZSBwcm9jZXNzIHRoZQotPHR0PiRzb3VyY2U8L3R0PiBhbmQgPHR0PiR0YXJnZXQ8L3R0PiB0b2tlbnMgYXJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lcyBvZgotQyBsb2NhbCB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgUGVybCBhbmQgQyByZXByZXNlbnRhdGlvbnMgb2YKLWFuIG9iamVjdCByZXNwZWN0aXZlbHkuICBBcyBhIHJlc3VsdCwgdGhpcyB0eXBlbWFwIGFsbG93cyBQZXJsIGZpbGVzCi10byBiZSB1c2VkIGluIGEgbmF0dXJhbCBtYW5uZXIuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLW9wZW4oT1VULCImZ3Q7dGVzdC5naWYiKSB8fCBkaWUgImVycm9yIVxuIjsKLQotIyBNdWNoIGJldHRlciB0aGFuIGJlZm9yZQotZ2Q6OmdkSW1hZ2VHaWYoJGltLCpPVVQpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1DZXJ0YWluIG9wZXJhdGlvbnMsIHN1Y2ggYXMgb3V0cHV0IHZhbHVlcywgYXJlIGltcGxlbWVudGVkIHVzaW5nIAotYSBjb21iaW5hdGlvbiBvZiB0eXBlbWFwcyBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAocGVybDUsaWdub3JlKQotaW50ICpPVVRQVVQoaW50IHRlbXApIHsKLSAgJHRhcmdldCA9ICZ0ZW1wOwotfQotJXR5cGVtYXAocGVybDUsYXJnb3V0KSBpbnQgKk9VVFBVVCB7Ci0gIGlmIChhcmd2aSAmZ3Q7PSBpdGVtcykgewotICAgICBFWFRFTkQoc3AsMSk7Ci0gIH0KLSAgJHRhcmdldCA9IHN2X25ld21vcnRhbCgpOwotICBzdl9zZXRpdigkdGFyZ2V0LChJVikgKigkc291cmNlKSk7Ci0gIGFyZ3ZpKys7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUluIHRoaXMgY2FzZSwgdGhlIGBgaWdub3JlJycgdHlwZW1hcCB0ZWxscyBTV0lHIHRoYXQgYSBwYXJhbWV0ZXIgaXMKLWdvaW5nIHRvIGJlIGlnbm9yZWQgYW5kIHRoYXQgdGhlIFBlcmwgaW50ZXJwcmV0ZXIgd2lsbCBub3QgYmUKLXN1cHBseWluZyBhIHZhbHVlLiAgU2luY2UgdGhlIHVuZGVybHlpbmcgQyBmdW5jdGlvbiBzdGlsbCBuZWVkcyBhCi12YWx1ZSwgdGhlIHR5cGVtYXAgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB0byBwb2ludAotdG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUgPHR0PnRlbXA8L3R0Pi4gVGhlIGBgYXJnb3V0JycgdHlwZW1hcCBpcyB1c2VkIHRvCi1yZXR1cm4gYSB2YWx1ZSBoZWxkIGluIG9uZSBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgSW4gdGhpcyBjYXNlLAotdGhlIHR5cGVtYXAgZXh0ZW5kcyB0aGUgUGVybCBzdGFjayAoaWYgbmVlZGVkKSwgYW5kIGNyZWF0ZXMgYSBuZXcKLXJldHVybiB2YWx1ZS4gIFRoZSA8dHQ+YXJndmk8L3R0PiB2YXJpYWJsZSBpcyBhIFNXSUctc3BlY2lmaWMgdmFyaWFibGUKLWNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB2YWx1ZXMgcmV0dXJuZWQgdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIgKHNvCi1pdCBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCByZXR1cm4gdmFsdWUpLgotCi08cD4KLVRoZSBDIGNvZGUgc3VwcGxpZWQgaW4gZWFjaCB0eXBlbWFwIGlzIHBsYWNlZCBpbiBhIHByaXZhdGUgc2NvcGUgdGhhdAotaXMgbm90IHZpc2libGUgdG8gYW55IG90aGVyIHR5cGVtYXBzIG9yIG90aGVyIHBhcnRzIG9mIGEgd3JhcHBlciBmdW5jdGlvbi4KLVRoaXMgYWxsb3dzIGRpZmZlcmVudCB0eXBlbWFwcyB0byBiZSB1c2VkIHNpbXVsdGFuZW91c2x5LS1ldmVuIGlmIHRoZXkKLWRlZmluZSB2YXJpYWJsZXMgd2l0aCB0aGUgc2FtZSBuYW1lcy4gIFRoaXMgYWxzbyBhbGxvd3MgdGhlIHNhbWUgdHlwZW1hcAotdG8gYmUgdXNlZCBtb3JlIG9uY2UgaW4gdGhlIHNhbWUgd3JhcHBlciBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBwcmV2aW91cwotc2VjdGlvbiB1c2VkIHRoZSA8dHQ+aW50ICpPVVRQVVQ8L3R0PiB0eXBlbWFwIHR3aWNlIGluIHRoZSBzYW1lIGZ1bmN0aW9uCi13aXRob3V0IGFueSBhZHZlcnNlIHNpZGUtZWZmZWN0cy4KLQotPGg0PiAzLjEwLjMgVHlwZW1hcCBMaWJyYXJpZXM8L2g0PgotCi1Xcml0aW5nIG5ldyB0eXBlbWFwcyBpcyBhIHNvbWV3aGF0IG1hZ2ljYWwgYXJ0IHRoYXQgcmVxdWlyZXMga25vd2xlZGdlIG9mCi1QZXJsJ3MgaW50ZXJuYWwgb3BlcmF0aW9uLCBTV0lHLCBhbmQgdGhlIHVuZGVybHlpbmcgYXBwbGljYXRpb24uIAotQm9va3Mgc3VjaCBhcyA8ZW0+QWR2YW5jZWQgUGVybCBQcm9ncmFtbWluZzwvZW0+IGFuZCB0aGUgbWFuIHBhZ2VzIG9uCi1leHRlbmRpbmcgYW5kIGVtYmVkZGluZyB0aGUgUGVybCBpbnRlcnByZXRlciB3aWxsIHByb3ZlIHRvIGJlIHF1aXRlIHVzZWZ1bC4KLUhvd2V2ZXIsIHNpbmNlIHdyaXRpbmcgdHlwZW1hcHMgZnJvbSBzY3JhdGNoIGlzIGRpZmZpY3VsdCwgU1dJRyBwcm92aWRlcyBhCi13YXkgZm9yIHR5cGVtYXBzIHRvIGJlIHBsYWNlZCBpbiBhIGxpYnJhcnkgYW5kIHV0aWxpemVkIHdpdGhvdXQKLWtub3dpbmcgdGhlaXIgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gICBUbyBpbGx1c3RyYXRlLCAKLXN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIHdyaXRlIHNvbWUgZ2VuZXJpYyB0eXBlbWFwcyBmb3IgY2hlY2tpbmcgdGhlCi12YWx1ZSBvZiB2YXJpb3VzIGlucHV0IHBhcmFtZXRlcnMuICBUaGlzIGNvdWxkIGJlIGRvbmUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8vIGNoZWNrLmkKLS8vIHR5cGVtYXBzIGZvciBjaGVja2luZyBhcmd1bWVudCB2YWx1ZXMKLSV0eXBlbWFwKHBlcmw1LGNoZWNrKSBOdW1iZXIgUE9TSVRJVkUgewotICAgIGlmICgkdGFyZ2V0ICZsdDs9IDApCi0gICAgICAgY3JvYWsoIkV4cGVjdGVkIGEgcG9zaXRpdmUgdmFsdWUiKTsKLX0KLQotJXR5cGVtYXAocGVybDUsY2hlY2spIFBvaW50ZXIgKk5PTk5VTEwgewotICAgIGlmICgkdGFyZ2V0ID09IE5VTEwpCi0gICAgICAgY3JvYWsoIlJlY2VpdmVkIGEgTlVMTCBwb2ludGVyISIpOwotfQotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRvIHVzZSB0aGVzZSB0eXBlbWFwcywgYSB1c2VyIGNvdWxkIGluY2x1ZGUgdGhlIGZpbGUgPHR0PmNoZWNrLmk8L3R0PgotYW5kIHVzZSB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZS4gIFRoZSA8dHQ+JWFwcGx5PC90dD4gZGlyZWN0aXZlIHNpbXBseQotdGFrZXMgZXhpc3RpbmcgdHlwZW1hcHMgYW5kIG1ha2VzIHRoZW0gd29yayB3aXRoIG5ldyBkYXRhdHlwZXMuICBGb3IKLWV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0laW5jbHVkZSBjaGVjay5pCi0KLS8vIEZvcmNlICdkb3VibGUgcHgnIHRvIGJlIHBvc2l0aXZlCi0lYXBwbHkgTnVtYmVyIFBvc2l0aXZlIHsgZG91YmxlIHB4IH07Ci0KLS8vIEZvcmNlIHRoZXNlIHBvaW50ZXJzIHRvIGJlIE5PTi1OVUxMCi0lYXBwbHkgUG9pbnRlciBOT05OVUxMIHsgRklMRSAqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXggKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZEltYWdlICogfTsKLQotLy8gTm93IHNvbWUgZnVuY3Rpb25zCi1kb3VibGUgbG9nKGRvdWJsZSBweCk7ICAgLy8gJ3B4JyBwb3NpdGl2ZQotZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciAqLCBWZWN0b3IgKik7Ci0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotSW4gdGhpcyBjYXNlLCB0aGUgdHlwZW1hcHMgd2UgZGVmaW5lZCBmb3IgY2hlY2tpbmcKLWRpZmZlcmVudCB2YWx1ZXMgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gYSB2YXJpZXR5IG9mIAotbmV3IGRhdGF0eXBlcy4gIFRoaXMgaGFzIGJlZW4gZG9uZSB3aXRob3V0IGhhdmluZyB0bwotZXhhbWluZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhvc2UgdHlwZW1hcHMgb3IgaGF2aW5nIAotdG8gbG9vayBhdCBhbnkgUGVybCBpbnRlcm5hbHMuICAgQ3VycmVudGx5LCBTV0lHIGluY2x1ZGVzCi1hIG51bWJlciBvZiBsaWJyYXJpZXMgdGhhdCBvcGVyYXRlIGluIHRoaXMgbWFubmVyLgotCi08aDM+IDMuMTEgT3RoZXIgU1dJRyBGZWF0dXJlczwvaDM+Ci0KLVNXSUcgaGFzIGEgbnVtYmVyIG9mIG90aGVyIGZlYXR1cmVzIHRoYXQgaGF2ZSBub3QgYmVlbiBkaXNjdXNzZWQuCi1JbiBhZGRpdGlvbiB0byBwcm9kdWNpbmcgd3JhcHBlciBjb2RlLCBTV0lHIGFsc28gcHJvZHVjZXMKLXNpbXBsZSBkb2N1bWVudGF0aW9uIGZpbGVzLiAgVGhlc2UgZGVzY3JpYmUgdGhlIGNvbnRlbnRzIG9mIGEKLW1vZHVsZS4gIEluIGFkZGl0aW9uLCBDIGNvbW1lbnRzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUKLXRleHQgaW4gdGhlIGRvY3VtZW50YXRpb24gZmlsZS4gICAgU1dJRyBpcyBhbHNvIHBhY2thZ2VkIHdpdGggYQotbGlicmFyeSBvZiB1c2VmdWwgbW9kdWxlcyB0aGF0IGluY2x1ZGUgdHlwZW1hcHMgYW5kIGludGVyZmFjZXMgdG8KLWNvbW1vbiBsaWJyYXJpZXMuICBUaGVzZSBsaWJyYXJpZXMgY2FuIHNpbXBsaWZ5IHRoZSBjb25zdHJ1Y3Rpb24KLW9mIHNjcmlwdGluZyBpbnRlcmZhY2VzLgotCi08aDM+IDMuMTIgUHV0dGluZyBpdCBBbGwgVG9nZXRoZXI8L2gzPgotCi1JbiB0aGUgZmlyc3QgcGFydCBvZiB0aGlzIHNlY3Rpb24sIGEgbWluaW1hbCBpbnRlcmZhY2UgdG8gdGhlCi1nZCBsaWJyYXJ5IHdhcyBwcmVzZW50ZWQuICBOb3csIGxldCdzIHRha2UgYSBsb29rIGF0IGEgbW9yZQotc3Vic3RhbnRpYWwgdmVyc2lvbiBvZiB0aGF0IGludGVyZmFjZS4KLQotPGJsb2NrcXVvdGU+PHByZT4KLS8vIGdkLmkKLSVtb2R1bGUgZ2QKLSV7Ci0jaW5jbHVkZSAiZ2QuaCIKLSV9Ci0KLS8vIE1ha2UgRklMRSAqIHdvcmsKLSV0eXBlbWFwKHBlcmw1LGluKSBGSUxFICogewotICAgJHRhcmdldCA9IElvSUZQKHN2XzJpbygkc291cmNlKSk7Ci19Ci0KLS8vIEdyYWIgdGhlIGdkLmggaGVhZGVyIGZpbGUKLSVpbmNsdWRlICJnZC5oIgotCi0vLyBFeHRlbmQgdGhlIGludGVyZmFjZSBhIGxpdHRsZSBiaXQKLSVhZGRtZXRob2RzIGdkSW1hZ2UgewotZ2RJbWFnZShpbnQgdywgaW50IGgpIHsKLSAgICByZXR1cm4gZ2RJbWFnZUNyZWF0ZSh3LGgpOwotfQotfmdkSW1hZ2UoKSB7Ci0gICAgZ2RJbWFnZURlc3Ryb3koc2VsZik7Ci19Ci0uLi4gZXRjIC4uLgotfTsKLQotJWFkZG1ldGhvZHMgZ2RQb2ludCB7Ci0uLi4gZXRjIC4uLgotfQotCi0vLyBXcmFwIHRoZSBmb250cyAocmVhZG9ubHkgdmFyaWFibGVzKQotJXJlYWRvbmx5Ci0laW5jbHVkZSAiZ2Rmb250dC5oIgotJWluY2x1ZGUgImdkZm9udHMuaCIKLSVpbmNsdWRlICJnZGZvbnRtYi5oIgotJWluY2x1ZGUgImdkZm9udGwuaCIKLSVpbmNsdWRlICJnZGZvbnRnLmgiCi0lcmVhZHdyaXRlCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUZpbmFsbHksIGhlcmUgaXMgYSBzaW1wbGUgc2NyaXB0IHRoYXQgdXNlcyB0aGUgbW9kdWxlLiAgIEFzaWRlIGZyb20KLWEgZmV3IG1pbm9yIGRpZmZlcmVuY2VzLCB0aGUgc2NyaXB0IGlzIHJlbWFya2FibHkgc2ltaWxhciB0byB0aGUgZmlyc3QKLWV4YW1wbGUgZ2l2ZW4gaW4gdGhlIHN0YW5kYXJkIEdEIG1vZHVsZSBkb2N1bWVudGF0aW9uLgotCi08YmxvY2txdW90ZT48cHJlPgotdXNlIGdkOwotCi0kaW0gPSBuZXcgZ2RJbWFnZSgxMDAsMTAwKTsKLSR3aGl0ZT0gJGltLSZndDtjb2xvckFsbG9jYXRlKDI1NSwyNTUsMjU1KTsKLSRibGFjaz0gJGltLSZndDtjb2xvckFsbG9jYXRlKDAsMCwwKTsKLSRyZWQ9ICRpbS0mZ3Q7Y29sb3JBbGxvY2F0ZSgyNTUsMCwwKTsKLSRibHVlPSAkaW0tJmd0O2NvbG9yQWxsb2NhdGUoMCwwLDI1NSk7Ci0kaW0tJmd0O3RyYW5zcGFyZW50Y29sb3IoJHdoaXRlKTsKLSRpbS0mZ3Q7aW50ZXJsYWNlZCgxKTsKLSRpbS0mZ3Q7cmVjdGFuZ2xlKDAsMCw5OSw5OSwkd2hpdGUpOwotJGltLSZndDthcmMoNTAsNTAsOTUsNzUsMCwzNjAsJGJsdWUpOwotJGltLSZndDtmaWxsKDUwLDUwLCRyZWQpOwotb3BlbihJTUcsICImZ3Q7dGVzdC5naWYiKTsKLSRpbS0mZ3Q7Z2lmKCpJTUcpOwotY2xvc2UoSU1HKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgyPiA0IEludGVyZmFjZSBCdWlsZGluZyBTdHJhdGVnaWVzPC9oMj4KLQotU1dJRyBzaW1wbGlmaWVzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgUGVybCBleHRlbnNpb25zIGJlY2F1c2UgaXQgaGlkZXMKLVBlcmwtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgYWxsb3dzIHByb2dyYW1tZXJzIHRvCi1pbmNvcnBvcmF0ZSBDL0MrKyBhcHBsaWNhdGlvbnMgaW50byBhIFBlcmwgZW52aXJvbm1lbnQgdXNpbmcgZmFtaWxpYXIKLUFOU0kgQy9DKysgc3ludGF4IHJ1bGVzLiAgSW4gYWRkaXRpb24sIFNXSUcgaW50ZXJmYWNlcyBhcmUgZ2VuZXJhbGx5Ci1zcGVjaWZpZWQgaW4gYSBsZXNzIGZvcm1hbCBtYW5uZXIgdGhhbiB0aGF0IGZvdW5kIGluIFhTIG9yIGNvbXBvbmVudAotYXJjaGl0ZWN0dXJlcyBzdWNoIGFzIENPUkJBIGFuZCBDT00uICAgQXMgYSByZXN1bHQsIG1hbnkgdXNlcnMgYXJlCi1zdXJwcmlzZWQgdG8gZmluZCBvdXQgaG93IHJhcGlkbHkgdGhleSBjYW4gY3JlYXRlIFBlcmwgaW50ZXJmYWNlcwotdG8gdGhlaXIgQy9DKysgYXBwbGljYXRpb25zLiAgIEhvd2V2ZXIsICBpdCBpcyBhIG1pc3BlcmNlcHRpb24gdG8gdGhpbmsKLXRoYXQgU1dJRyBjYW4gbWFnaWNhbGx5IHRha2UgYW4gYXJiaXRyYXJ5IEMvQysrIGhlYWRlciBmaWxlIGFuZCAKLWluc3RhbnRseSB0dXJuIGl0IGludG8gYSB1c2VmdWwgUGVybCBtb2R1bGUuICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcwotc29tZSBvZiB0aGUgaXNzdWVzIGFuZCBzb2x1dGlvbiBzdHJhdGVnaWVzIGZvciBlZmZlY3RpdmVseSB1c2luZyBTV0lHLgotCi08aDM+IDQuMSBXcmFwcGluZyBhbiBFeGlzdGluZyBQcm9ncmFtIDwvaDM+Ci0KLUJ1aWxkaW5nIGEgUGVybCBpbnRlcmZhY2UgdG8gYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gZ2VuZXJhbGx5IGludm9sdmVzCi10aGUgZm9sbG93aW5nIHN0ZXBzIDoKLQotPG9sPgotPGxpPiBMb2NhdGUgaGVhZGVyIGZpbGVzIGFuZCBvdGhlciBzb3VyY2VzIG9mIEMgZGVjbGFyYXRpb25zLgotPGxpPiBDb3B5IGhlYWRlciBmaWxlcyB0byBpbnRlcmZhY2UgZmlsZXMuCi08bGk+IEVkaXQgdGhlIGludGVyZmFjZSBmaWxlIGFuZCBhZGQgU1dJRyBkaXJlY3RpdmVzLgotPGxpPiBSZW1vdmUgb3IgcmV3cml0ZSB0aGUgYXBwbGljYXRpb24ncyA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gaWYgbmVjZXNzYXJ5LgotPGxpPiBSdW4gU1dJRywgY29tcGlsZSwgYW5kIGxpbmsgaW50byBhIFBlcmwgZXh0ZW5zaW9uIG1vZHVsZS4KLTwvb2w+Ci0KLVdoaWxlIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gcnVuIFNXSUcgZGlyZWN0bHkgb24gYSBDIGhlYWRlcgotZmlsZSwgdGhpcyByYXJlbHkgcmVzdWx0cyBpbiB0aGUgYmVzdCBzY3JpcHRpbmcgaW50ZXJmYWNlLiAgRmlyc3QsIGEKLXJhdyBoZWFkZXIgZmlsZSBtYXkgY29udGFpbiBwcm9ibGVtYXRpYyBkZWNsYXJhdGlvbnMgdGhhdCBTV0lHIGRvZXNuJ3QKLXVuZGVyc3RhbmQuICBTZWNvbmQsIGl0IGlzIHVzdWFsbHkgdW5uZWNlc3NhcnkgdG8gd3JhcCBldmVyeSBmdW5jdGlvbiBhbmQKLXZhcmlhYmxlIGluIGEgbGFyZ2UgbGlicmFyeS4gIE1vcmUgb2Z0ZW4gdGhhbiBub3QsIHRoZXJlIGFyZSBpbnRlcm5hbAotZnVuY3Rpb25zIHRoYXQgbWFrZSBsaXR0bGUgc2Vuc2UgdG8gdXNlIGZyb20gUGVybC4gIEJ5IGNvcHlpbmcgaGVhZGVyCi1maWxlcyB0byBhIHNlcGFyYXRlIGludGVyZmFjZSBmaWxlLCBpdCBpcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgdGhlc2UKLWZ1bmN0aW9ucyBhbmQgY2xlYW4gdGhpbmdzIHVwIHdpdGggYSBsaXR0bGUgZWRpdGluZyBbZm9vdG5vdGU6IEFuCi1hbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjb3B5aW5nIGhlYWRlciBmaWxlcyBpcyB0byBtb2RpZnkgdGhlIGhlYWRlcgotZmlsZXMgdXNpbmcgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gYWRkIFNXSUcgZGlyZWN0aXZlcyBvciB0bwotcmVtb3ZlIHVubmVjZXNzYXJ5IGZ1bmN0aW9uc10uICBGaW5hbGx5LCB0aGUgdW5kZXJseWluZyBhcHBsaWNhdGlvbgotbWF5IHJlcXVpcmUgYSBmZXcgc2xpZ2h0IG1vZGlmaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgUGVybCBzdXBwbGllcwotaXRzIG93biA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gc28gaWYgYW4gYXBwbGljYXRpb24gYWxzbyBjb250YWlucyA8dHQ+Ci1tYWluKCk8L3R0PiwgaXQgd2lsbCBoYXZlIHRvIGJlIHJlbW92ZWQsIHJld3JpdHRlbiwgb3Igbm90IGxpbmtlZCBpbnRvIHRoZQotZXh0ZW5zaW9uIG1vZHVsZS4gIAotCi08aDM+IDQuMiBFdm9sdXRpb25hcnkgSW50ZXJmYWNlIEJ1aWxkaW5nPC9oMz4KLQotQWZ0ZXIgYSBQZXJsIGludGVyZmFjZSBpcyBmaXJzdCBidWlsdCwgaXRzIHVzZSB3aWxsIAotZXhwb3NlIGFueSBwcm9ibGVtcyBhbmQgbGltaXRhdGlvbnMuICBUaGVzZSBwcm9ibGVtcyBpbmNsdWRlIGZ1bmN0aW9ucwotdGhhdCBhcmUgYXdrd2FyZCB0byB1c2UsIHBvb3IgaW50ZWdyYXRpb24gd2l0aCBQZXJsIGRhdGF0eXBlcywgbWlzc2luZwotZnVuY3Rpb25hbGl0eSwgYW5kIHNvIGZvcnRoLiAgVG8gZml4IHRoZXNlIHByb2JsZW1zLCAKLWludGVyZmFjZSBmaWxlcyBjYW4gYmUgZW5oYW5jZWQgd2l0aCBoZWxwZXIgZnVuY3Rpb25zLAotdHlwZW1hcHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgYW5kIG90aGVyIGRlY2xhcmF0aW9ucy4gICBTaW5jZSAKLWludGVyZmFjZXMgYXJlIGVhc2lseSByZWdlbmVyYXRlZCwgbWFraW5nIHN1Y2ggY2hhbmdlcyBpcyBhIHJlbGF0aXZlbHkKLXN0cmFpZ2h0Zm9yd2FyZCBwcm9jZXNzLiBIb3dldmVyLCBhcyBhIHJlc3VsdCwgIFNXSUcgaW50ZXJmYWNlcyB0ZW5kCi10byBiZSBidWlsdCBpbiBhbiBldm9sdXRpb25hcnkgYW5kIGl0ZXJhdGl2ZSBtYW5uZXIgcmF0aGVyIHRoYW4gYmVpbmcKLWZvcm1hbGx5IHNwZWNpZmllZCBpbiBhZHZhbmNlLgotCi08aDM+IDQuMyBUcmFwcyBhbmQgUGl0ZmFsbHM8L2gzPgotCi1GaW5hbGx5LCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHRoYXQgc29tZXRpbWVzIGFyaXNlCi13aGVuIHRyYW5zZm9ybWluZyBhIEMvQysrIHByb2dyYW0gaW50byBhIFBlcmwgZXh0ZW5zaW9uIG1vZHVsZS4gIE9uZQotb2YgdGhlc2UgcHJvYmxlbXMgaXMgdGhlIGlzc3VlIG9mIGltcGxpY2l0IGV4ZWN1dGlvbiBvcmRlcgotZGVwZW5kZW5jaWVzIGFuZCByZWVudHJhbnQgZnVuY3Rpb25zLiAgRnJvbSB0aGUgUGVybCBpbnRlcnByZXRlciwgdXNlcnMgd2lsbCBiZQotYWJsZSB0byBleGVjdXRlIGZ1bmN0aW9ucyBhdCBhbnkgdGltZSBhbmQgaW4gYW55IG9yZGVyLiAgSG93ZXZlciwgaW4KLW1hbnkgQyBwcm9ncmFtcywgZXhlY3V0aW9uIGlzIHByZWNpc2VseSBkZWZpbmVkLiAgRm9yCi1leGFtcGxlLCBhIHByZWNpc2Ugc2VxdWVuY2Ugb2YgZnVuY3Rpb24gY2FsbHMgbWlnaHQgYmUgcGVyZm9ybWVkIHRvCi1wcm9wZXJseSBpbml0aWFsaXplIHByb2dyYW0gZGF0YS4gIExpa2V3aXNlLCBpdCBtYXkgb25seSBiZSB2YWxpZCB0bwotY2FsbCBjZXJ0YWluIGZ1bmN0aW9ucyBvbmNlIGR1cmluZyBhIHNpbmdsZSBleGVjdXRpb24uICAgRnJvbSBQZXJsLAotaXQgaXMgZWFzeSBmb3IgYSB1c2VyIHRvIHZpb2xhdGUgdGhlc2UgY29uc3RyYWludHMtLXJlc3VsdGluZyBpbgotYSBwb3RlbnRpYWwgcHJvZ3JhbSBjcmFzaCBvciBpbmNvcnJlY3QgYmVoYXZpb3IuICAgIFRvIGZpeCB0aGVzZQotcHJvYmxlbXMsIGFwcGxpY2F0aW9ucyBjYW4gc29tZXRpbWVzIGJlIG1vZGlmaWVkIGJ5IGludHJvZHVjaW5nIGFkZGl0aW9uYWwKLXN0YXRlIHZhcmlhYmxlcy4gIEZvciBleGFtcGxlLCB0byBwcmV2ZW50IHJlcGVhdGVkIGV4ZWN1dGlvbiwgYSBmdW5jdGlvbgotY2FuIGJlIG1vZGlmaWVkIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci12b2lkIGZvbygpIHsKLSAgIHN0YXRpYyBpbnQgY2FsbGVkID0gMDsKLSAgIGlmIChjYWxsZWQpIHJldHVybjsKLSAgIC4uLgotICAgY2FsbGVkID0gMTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNhdGNoIHN1Y2ggYmVoYXZpb3IgdXNpbmcgZXhjZXB0aW9uIGhhbmRsZXJzLiAgRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lZXhjZXB0KHBlcmw1KSB7Ci0gICBzdGF0aWMgaW50IGNhbGxlZCA9IDA7Ci0gICBpZiAoY2FsbGVkKSAKLSAgICAgICAgIGNyb2FrKCJBbHJlYWR5IGV4ZWN1dGVkIVxuIik7Ci0gICAkZnVuY3Rpb24KLSAgIGNhbGxlZCA9IDE7Ci19Ci0vLyBMaXN0IGFsbCBub24tcmVlbnRyYW50IGZ1bmN0aW9ucwotdm9pZCBmb28oKTsKLS4uLgotLy8gQ2xlYXIgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyCi0lZXhjZXB0KHBlcmw1KTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotQW5vdGhlciBjb21tb24gcHJvYmxlbSBpcyB0aGF0IG9mIGltcHJvcGVyIG1lbW9yeSBtYW5hZ2VtZW50LiAgQXMgcHJldmlvdXNseSBtZW50aW9uZWQsCi1TV0lHIGV4dGVuc2lvbnMgdXNlIHRoZSBzYW1lIG1lbW9yeSBtYW5hZ2VtZW50IHRlY2huaXF1ZXMgYXMgQy4gIFRoZXJlZm9yZSwgY2FyZWxlc3MgdXNlCi1tYXkgcmVzdWx0IGluIG1lbW9yeSBsZWFrcywgZGFuZ2xpbmcgcG9pbnRlcnMsIGFuZCBzbyBmb3J0aC4gCi1BIHNvbWV3aGF0IG1vcmUgb2JzY3VyZSBtZW1vcnkgcmVsYXRlZCBwcm9ibGVtIGlzIGNhdXNlZCB3aGVuIGEgQyBwcm9ncmFtIAotb3ZlcndyaXRlcyBQZXJsIGRhdGEuICBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci12b2lkIGdldGVycm9yKGNoYXIgKm1zZykgewotICAgICBzdHJjcHkobXNnLHN0cmVycm9yKGVycm5vKSk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoaXMgZnVuY3Rpb24gY29waWVzIGEgc3RyaW5nIGludG8gbWVtb3J5IHBvaW50ZWQgdG8gYnkgPHR0Pm1zZzwvdHQ+LiAgSG93ZXZlciwgaW4gdGhlCi13cmFwcGVyIGZ1bmN0aW9uLCB0aGUgdmFsdWUgb2YgPHR0Pm1zZzwvdHQ+IGlzIHJlYWxseSBhIHBvaW50ZXIgdG8gZGF0YSBidXJpZWQgZGVlcAotaW5zaWRlIGEgUGVybCBzY2FsYXIgdmFsdWUuICAgV2hlbiB0aGUgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgdmFsdWUsIGl0IGNvcnJ1cHRzCi10aGUgdmFsdWUgb2YgdGhlIFBlcmwgc2NhbGFyIHZhbHVlIGFuZCBjYW4gY2F1c2UgdGhlIFBlcmwgaW50ZXJwcmV0ZXIgdG8gY3Jhc2gKLXdpdGggYSBtZW1vcnkgYWRkcmVzc2luZyBlcnJvciBvciBvYnNjdXJlIHJ1bi10aW1lIGVycm9yLiAgQWdhaW4sIHRoaXMgc29ydCBvZiBwcm9ibGVtCi1jYW4gdXN1YWxseSBiZSBmaXhlZCB3aXRoIHRoZSB1c2Ugb2YgdHlwZW1hcHMuICAgRm9yIGV4YW1wbGUsIGl0IGlzIHBvc3NpYmxlIHRvIHR1cm4gdGhlCi08dHQ+bXNnPC90dD4gcGFyYW1ldGVyIGludG8gYW4gb3V0cHV0IHZhbHVlIGFzIGZvbGxvd3MgOgotCi08YmxvY2txdW90ZT48cHJlPgotLy8gVXNlIGEgdGVtcG9yYXJ5IGFycmF5IGZvciB0aGUgcmVzdWx0Ci0ldHlwZW1hcChwZXJsNSxpZ25vcmUpCi1jaGFyICptc2cgKGNoYXIgdGVtcFs1MTJdKSB7Ci0gICAgJHRhcmdldCA9IHRlbXA7Ci19Ci0vLyBDb3B5IHRoZSBvdXRwdXQgaW50byBhIG5ldyBQZXJsIHNjYWxhcgotJXR5cGVtYXAocGVybDUsYXJnb3V0KSBjaGFyICptc2cgewotICBpZiAoYXJndmkgJmd0Oz0gaXRlbXMpIHsKLSAgICAgRVhURU5EKHNwLDEpOwotICB9Ci0gICR0YXJnZXQgPSBzdl9uZXdtb3J0YWwoKTsKLSAgc3Zfc2V0cHYoJHRhcmdldCwkc291cmNlKTsKLSAgYXJndmkrKzsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgyPiA1IEFwcGxpY2F0aW9ucyA8L2gyPgotCi1TV0lHIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkIGluIGFuIGluY3JlYXNpbmcgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMuICAKLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aGUgd2F5cyBpbiB3aGljaCBoYXMgYmVlbiB1c2VkLiAgQSBudW1iZXIKLW9mIGFkdmFuY2VkIFNXSUcvUGVybCBpbnRlcmZhY2luZyB0ZWNobmlxdWVzIHN1Y2ggYXMgdHlwZW1hcHMgYW5kCi1jYWxsYmFjayBmdW5jdGlvbnMgYXJlIGFsc28gZGVzY3JpYmVkLgotCi08aDM+IDUuMSBFbGVjdHJvbmljIENBRDwvaDM+Ci0KLVNXSUcgcGxheXMgYSBwaXZvdGFsIHJvbGUgaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3Mgb2YgQmFkZ2VyLCBhbgotZWxlY3Ryb25pYyBjb21wdXRlci1haWRlZCBkZXNpZ24gc3lzdGVtLCBiZWluZyBkZXZlbG9wZWQgYnkgRnVzaW9uCi1NaWNyb01lZGlhLCB1c2VkIGluIHRoZSBkZXNpZ24gb2YgaW50ZWdyYXRlZCBjaXJjdWl0cyBhbmQgb3RoZXIKLWVsZWN0cm9uaWMgY29tcG9uZW50cy4gIEJhZGdlciBpcyBhIGZ1bGx5IG9iamVjdC1vcmllbnRlZCwgbW9kdWxhciwKLWFuZCBoaWdobHkgZXh0ZW5zaWJsZSBzeXN0ZW0sIHJ1bm5pbmcgdW5kZXIgdmFyaW91cyBmbGF2b3JzIG9mIHRoZQotVU5JWCBvcGVyYXRpbmcgc3lzdGVtIGFzIHdlbGwgYXMKLVdpbmRvd3MtTlQuCi0KLTxwPgotVGhlIGNvcmUgY29tcG9uZW50cyBpbiBCYWRnZXIgYXJlIGNvbnN0cnVjdGVkIGluIEMrKyBhbmQgYXJlCi1kZWxpdmVyZWQgYXMgYSBzZXQgb2Ygc2hhcmVkIChkeW5hbWljYWxseSBsb2FkZWQpIGxpYnJhcmllcy4gIFRoZQotbGlicmFyaWVzIGFyZSA8ZW0+bm90PC9lbT4gZGlyZWN0bHkgbGlua2VkIGludG8gYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgotSW5zdGVhZCwgZWFjaCBsaWJyYXJ5IGNvbWVzIHdpdGggYW4gZXh0ZW5zaW9uIGxhbmd1YWdlIChFTCkKLWludGVyZmFjZSB0aGF0IGlzIGdlbmVyYXRlZCBieSBTV0lHLCBhbGxvd2luZyB0aGUgbGlicmFyeSB0byBiZSB1c2VkCi13aXRoaW4gYSBQZXJsIHByb2dyYW0gW2Zvb3Rub3RlOiBGb3Igbm93LCBQZXJsIGlzIHRoZSBvbmx5IHN1cHBvcnRlZAotZXh0ZW5zaW9uIGxhbmd1YWdlLiAgVGNsIGFuZCBKYXZhIHdpbGwgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmVdLgotVGhlIGNvbWJpbmF0aW9uIG9mIGEgcG93ZXJmdWwgRUwgYW5kIHdlbGwtdHVuZWQsIGFwcGxpY2F0aW9uLXNwZWNpZmljCi1zb2Z0d2FyZSByZXN1bHRzIGluIGEgc3lzdGVtIHRoYXQgaXMgcG90ZW50LCBmbGV4aWJsZSwgYW5kIGVhc3kgdG8KLXVzZS4KLQotPHA+Ci1Gb3IgdGhlIG1vc3QgcGFydCwgU1dJRyBpcyB1c2VkIGluIGEgYGBub3JtYWwnJyBmYXNoaW9uOiBhIGRlc2NyaXB0aW9uCi1vZiB0aGUgY2xhc3NlcyBjb250YWluZWQgd2l0aGluIGEgbGlicmFyeSBpcyBwcmVzZW50ZWQgdG8gU1dJRywgYW5kIGl0Ci1nZW5lcmF0ZXMgYW4gRUwgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHRoZSBjb2RlIHdpdGhpbiB0aGF0IGxpYnJhcnkgdG8KLWJlIGFjY2Vzc2VkIGZyb20gYW4gRUwuICBUaGVyZSBhcmUgdHdvIGludGVyZXN0aW5nIGZhY2V0cyB0byB0aGUgdXNlCi1vZiBTV0lHIHdpdGhpbiBCYWRnZXI6IHRoZSB1c2Ugb2YgYGBzbWFydCByZWZlcmVuY2VzLCcnIGFuZCB0aGUgdXNlCi1vZiBjYWxsYmFja3MgZnJvbSBDKysgdG8gdGhlIEVMLAotCi08aDQ+IDUuMS4xIFNtYXJ0IFJlZmVyZW5jZXM8L2g0PgotCi1TdXBwb3NlIGEgUGVybCBwcm9ncmFtIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBCYWRnZXIgKGFuZCB3cmFwcGVkCi13aXRoIFNXSUcpIGluIG9yZGVyIHRvIGNyZWF0ZSBhbmQgcmV0dXJuIHNvbWUgb2JqZWN0LiAgQW55IFBlcmwKLXZhcmlhYmxlIHVzZWQgdG8gcmVmZXIgdG8gdGhhdCBvYmplY3QgcmVhbGx5IGhvbGRzIGEgPGVtPmhhbmRsZTwvZW0+IHRvCi10aGUgb2JqZWN0LCBpbXBsZW1lbnRlZCBhcyBhIGJsZXNzZWQgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIG9iamVjdCdzIHR5cGUgYW5kCi1pdHMgbWVtb3J5IGFkZHJlc3MuICBBbHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgbW9yZQotaW52b2x2ZWQsIHRoZSBoYW5kbGUsIGluIGVmZmVjdCwgYWN0cyBsaWtlIGEgcG9pbnRlciBpbiBDLiAgTm93LAotc3VwcG9zZSBhbm90aGVyIGZ1bmN0aW9uIHdpdGhpbiBCYWRnZXIgaXMgY2FsbGVkIHRoYXQgY2F1c2VzIHRoZQotb3JpZ2luYWwgb2JqZWN0IHRvIGJlIGRlc3Ryb3llZC4gIFNldmVyZSBwcm9ibGVtcyB3aWxsIG9jY3VyIGlmIHRoZQotUGVybCB2YXJpYWJsZSBpcyBzdXBwbGllZCB0byBhbm90aGVyIEJhZGdlciBmdW5jdGlvbiwgYmVjYXVzZSB0aGUKLXZhcmlhYmxlIHJlZmVycyB0byBhIG5vbi1leGlzdGVudCBvYmplY3QuICBUaGUgcmVhc29uIGZvciB0aGUKLWRpZmZpY3VsdHkgaXMgdGhhdCB0aGUgZXh0ZW5zaW9uIGxhbmd1YWdlIGV4cGVjdHMgdG8gaGF2ZSBjb250cm9sIG92ZXIKLXRoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0LCBidXQgdGhlIGV4dGVybmFsIHN5c3RlbSAoQmFkZ2VyKSBjYW5ub3QKLW1lZXQgdGhpcyBleHBlY3RhdGlvbi4KLQotPHA+Ci1JdCBpcyBwb3NzaWJsZSB0byBkZXNpZ24gQmFkZ2VyIHNvIHRoYXQgdGhlIGV4dGVuc2lvbiBsYW5ndWFnZSAKLWhhcyBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIGxpZmV0aW1lIG9mIGFsbCB0aGUgb2JqZWN0cyB3aXRoaW4gdGhlCi1zeXN0ZW0uICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFwcHJvYWNoIHJlc3VsdHMgaW4gYSBzeXN0ZW0gdGhhdCBpcyB0b28KLWNsb3NlbHkgdGllZCB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLCBhbmQgYWRkaW5nCi1hIG5ldyBleHRlbnNpb24gbGFuZ3VhZ2UgdG8gdGhlIG1peCBpcyBkaWZmaWN1bHQuICBBbiBhbHRlcm5hdGUKLXNvbHV0aW9uIHRoYXQgaXMgc2ltcGxlIHRvIGltcGxlbWVudCBhbmQgaXMgcG9ydGFibGUsIGlzIHRvCi1pbnRyb2R1Y2UgYGBzbWFydCByZWZlcmVuY2VzJycgKGFsc28gY2FsbGVkIHByb3hpZXMpIGludG8gdGhlCi1kZXNpZ24gWzUsIHBnLiAyMDddLiAgSW4gZWZmZWN0LCBhIHNtYXJ0IHJlZmVyZW5jZSBpcyBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIHNhbWUKLXNldCBvZiBvcGVyYXRpb25zIGFzIGEgYGByZWFsJycgb2JqZWN0LCBidXQgdGhlIHNtYXJ0IHJlZmVyZW5jZSdzCi1pbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBzb2xlbHkgb2YgYSBzaW5nbGUgcG9pbnRlciB0byBhIGBgcmVhbCcnCi1vYmplY3Qgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi0KLTxwPgotVGhlIGV4dGVuc2lvbiBsYW5ndWFnZSBpbnRlcmZhY2VzIHdpdGhpbiBCYWRnZXIgIGhhdmUgYmVlbiBjcmFmdGVkIHNvCi10aGF0IHRoZSBleHRlbnNpb24gbGFuZ3VhZ2UgbWFuaXB1bGF0ZXMgc21hcnQgcmVmZXJlbmNlcyBhbmQgdGhhdCB0aGUgbGlmZXRpbWUKLW9mIGEgc21hcnQgcmVmZXJlbmNlIGlzIGNvbXBsZXRlbHkgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCi1leHRlbnNpb24gbGFuZ3VhZ2UuICBVbmRlciBtb3N0IGNpcmN1bXN0YW5jZXMsIHRoZSBleHRlbnNpb24gbGFuZ3VhZ2UKLXBlcmZvcm1zIGFuIG9wZXJhdGlvbiBvbiB0aGUgc21hcnQgcmVmZXJlbmNlLCBhbmQgdGhlIHNtYXJ0IHJlZmVyZW5jZQotdGhlbiBhdHRlbXB0cyB0byB0cmFuc2ZlciB0aGUgb3BlcmF0aW9uIHRvIHRoZSByZWFsIG9iamVjdC4gIElmIHRoZQotcmVhbCBvYmplY3QgaGFzIGJlZW4gZGVzdHJveWVkIHRoZW4gdGhlIHNtYXJ0IHJlZmVyZW5jZSB3aWxsIGhhdmUgYmVlbgotaW52YWxpZGF0ZWQgKGl0IHBvaW50cyB0byA8dHQ+bmlsPC90dD4pLiAgSW4gdGhpcyBjYXNlLCB0aGUgb3BlcmF0aW9uCi1pcyBhYm9ydGVkIGFuZCwgaWYgcG9zc2libGUsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW4gdGhlIGV4dGVuc2lvbgotbGFuZ3VhZ2UuICBCYWRnZXIgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBtYWNoaW5lcnkgdG8gaW52YWxpZGF0ZSBhbnkKLXNtYXJ0IHJlZmVyZW5jZXMgdGhhdCBwb2ludCB0byBhbiBvYmplY3QgYmVpbmcgZGVzdHJveWVkLgotCi08cD4KLU1vZGVybiBDKysgY29tcGlsZXJzLCB3aXRoIHRoZWlyIHN1cHBvcnQgZm9yIHRlbXBsYXRlcywgcnVuLXRpbWUgdHlwZQotaWRlbnRpZmljYXRpb24sIGFuZCBzbyBmb3J0aCwgcHJvdmlkZSB0aGUgbWVhbnMgdG8gYXV0b21hdGljYWxseQotY29uc3RydWN0IHNtYXJ0IHJlZmVyZW5jZSBjbGFzc2VzLiAgRm9yIGEgdmFyaWV0eSBvZiByZWFzb25zLCB3ZSBhcmUKLW5vdCBhYmxlIHRvIGFsd2F5cyB1dGlsaXplIG1vZGVybiBjb21waWxlcnMuICBIZW5jZSwgd2UgaGF2ZSBjcmVhdGVkCi10aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzbWFydCByZWZlcmVuY2VzIG1hbnVhbGx5LCB3aGljaCBpcyBhCi10ZWRpb3VzIHByb2Nlc3MuICBGb3J0dW5hdGVseSwgdGhpcyB0YXNrIGNhbiBiZSBtb3N0bHkgYXV0b21hdGVkIGJ5Ci1jcmVhdGluZyBvdXIgb3duIGNvZGUgZ2VuZXJhdG9yIGFzIHBhcnQgb2YgU1dJRy4gIFRoaXMgaXMgYSBzaW1wbGUKLW1hdHRlciwgYXMgU1dJRyBpcyBhIG1vZHVsYXIgc29mdHdhcmUgc3lzdGVtLgotCi08aDQ+IDUuMS4yIENhbGxiYWNrczwvaDQ+Ci0KLVRoZSBleHRlbnNpb24gbGFuZ3VhZ2UgaW50ZXJmYWNlIHByb2R1Y2VkIGJ5IFNXSUcgYWxsb3dzIGZ1bmN0aW9ucwotZGVmaW5lZCBpbiB0aGUgZXh0ZXJuYWwgc3lzdGVtIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBleHRlbnNpb24KLWxhbmd1YWdlLiAgVW5mb3J0dW5hdGVseSwgdGhlIGludGVyZmFjZSBwcm9kdWNlZCBieSBTV0lHIGRvZXMgbm90Ci1zdXBwb3J0IHRoZSBjYWxsaW5nIG9mIGV4dGVuc2lvbiBsYW5ndWFnZSBmdW5jdGlvbnMgd2l0aGluIEMsCi1DKyssIG9yIE9iamVjdGl2ZS1DLiAgVGhlIGFiaWxpdHkgdG8gaW52b2tlIGZ1bmN0aW9ucyBiaWRpcmVjdGlvbmFsbHkKLWlzIG5lZWRlZCBieSBCYWRnZXIsIHNvIHN1cHBvcnQgZm9yIGNhbGxiYWNrcyBmcm9tIEMrKyB0byBQZXJsIGhhcyBiZWVuCi1kZXZlbG9wZWQgW2Zvb3Rub3RlOiBGb3Igbm93LCBjYWxsYmFja3Mgb25seSB3b3JrIHdpdGggUGVybC4gIFN1cHBvcnQKLSAgZm9yIGNhbGxiYWNrcyB3aXRoIFRjbCBhbmQgSmF2YSB3aWxsIGJlIGFkZGVkIGxhdGVyXS4gIFRoZSBiYXNpYwotYXBwcm9hY2ggaXMgdGhpczoKLQotPHVsPgotPGxpPiBEZWZpbmUgYSBmdW5jdGlvbi4KLTxsaT4gUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uLgotPGxpPiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIHRoYXQgY2F1c2VzIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9uIHRvIGJlCi0gIGludm9rZWQuCi08L3VsPgotCi1UbyBtYWtlIHRoaXMgd29yaywgQmFkZ2VyIHByb3ZpZGVzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgaW4KLUMrKyBjYWxsZWQgPHR0PlRyaWdnZXI8L3R0Piwgc28gY2FsbGVkIGJlY2F1c2UgYSBmdW5jdGlvbiBhc3NvY2lhdGVkCi13aXRoIG9iamVjdHMgb2YgdGhpcyBjbGFzcyBpcyBpbnZva2VkIHdoZW4gYW4gZXZlbnQgb2Ygc29tZSBraW5kCi1vY2N1cnMuICBCYWRnZXIgYWxzbyBwcm92aWRlcyB0aGUgbWFjaGluZXJ5IHRvIGFzc29jaWF0ZSA8dHQ+VHJpZ2dlcjwvdHQ+Ci1vYmplY3RzIHdpdGggYW4gZXZlbnQgbmFtZSBhbmQgd2l0aCBvbmUgb3IgbW9yZSBvYmplY3RzIGludGVybmFsIHRvCi10aGUgc3lzdGVtLiAgV2hlbiBhbiBpbnRlcm5hbCBvYmplY3QgYGByZWNlaXZlcycnIGFuIGV2ZW50LCBpdAotZXhhbWluZXMgdGhlIHNldCBvZiByZWdpc3RlcmVkIGZ1bmN0aW9ucyBsb29raW5nIGZvciBhIG1hdGNoLiAgSWYgYQotbWF0Y2ggaXMgZm91bmQgdGhlbiB0aGUgPHR0PlRyaWdnZXI8L3R0PiBvYmplY3QgaXMgaW52b2tlZCwgYW5kIHRoZSBuYW1lIG9mIHRoZQotZXZlbnQgYW5kIHRoZSBvYmplY3QgdGhhdCByZWNlaXZlZCB0aGUgZXZlbnQgYXJlIHN1cHBsaWVkIGFzCi1hcmd1bWVudHMuCi0KLTxwPgotQmFkZ2VyIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGNsYXNzZXMgZGVyaXZlZCBmcm9tIDx0dD5UcmlnZ2VyPC90dD4gdGhhdAotc3BlY2lhbGl6ZSBpdHMgYmVoYXZpb3IgZm9yIGNlcnRhaW4gZXh0ZW5zaW9uIGxhbmd1YWdlcywgZm9yIEMrKywgb3IKLWZvciBhbiBvYmplY3QgcmVxdWVzdCBicm9rZXIuICBGb3IgZXhhbXBsZSwgdGhlIDx0dD5QZXJsNVRyaWdnZXI8L3R0PgotY2xhc3MgaXMgZGVyaXZlZCBmcm9tIDx0dD5UcmlnZ2VyPC90dD4gYW5kIGl0IHNwZWNpYWxpemVzIGl0cyBiYXNlIGNsYXNzIGJ5Ci1zdG9yaW5nIGEgcG9pbnRlciB0byBhIFBlcmwgZnVuY3Rpb24gcmVmZXJlbmNlIChhbiA8dHQ+U1YqPC90dD4pLCBhbmQKLWJ5IHByb3ZpZGluZyB0aGUgbWFjaGluZXJ5IG5lZWRlZCB0byBpbnZva2UgdGhhdCBQZXJsIGZ1bmN0aW9uLgotCi08cD4KLUZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIFBlcmwgZnJhZ21lbnQ6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1zdWIgTXlGY24gewotICBteSAkRXZlbnROYW1lID0gc2hpZnQ7Ci0gIG15ICRPYmplY3QgPSBzaGlmdDsKLSAgIyAuLi4gcmVzdCBvZiBmdW5jdGlvbiBoZXJlLgotfQotbXkgJE9iamVjdCA9IEJhZGdlckZ1bmN0aW9uKC4uLi4pOwotbXkgJE5hbWUgPSAiQ2FuJ3QgZmluZCBmaWxlIjsKLUJhZGdlcjo6UmVnaXN0ZXJCeU9iamVjdCgkTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LCBcJk15RmNuKTsKLSRPYmplY3QtJmd0O1JlYWRGaWxlKCJBIGJvZ3VzIGZpbGUgbmFtZSIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGUgPHR0Pk15RmNuKCk8L3R0PiBQZXJsIGZ1bmN0aW9uIGlzIHRoZSBjYWxsYmFjayAodHJpZ2dlcikgZnVuY3Rpb24sCi1hbmQgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIDx0dD4kT2JqZWN0PC90dD4gdXNpbmcgdGhlCi1ldmVudCBuYW1lIGNhbGxlZCBgYDx0dD5DYW4ndCBmaW5kIGZpbGU8L3R0PicnLiAgTm93LCBzdXBwb3NlIHRoYXQgdGhlCi08dHQ+JE9iamVjdC0mZ3Q7UmVhZEZpbGUoKTwvdHQ+IG9wZXJhdGlvbiBmYWlscy4gIEludGVybmFsbHksIEJhZGdlciB3aWxsCi1ub3RlIHRoZSBmYWlsdXJlLCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IG5hbWUsIGF0dGVtcHQgdG8KLWZpbmQgYSBUcmlnZ2VyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhhdCBldmVudCwgYW5kIGlmIGZvdW5kLCB3aWxsCi1gYGludm9rZSB0aGUgVHJpZ2dlcicnIGJ5IGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbWJlciBmdW5jdGlvbi4KLUZvciB0aGUgZXhhbXBsZSBhYm92ZSwgdGhpcyBtZWFucyB0aGF0IHRoZSA8dHQ+TXlGY24oKTwvdHQ+IGZ1bmN0aW9uCi13aWxsIGJlIGNhbGxlZCB3aXRoIDx0dD4kT2JqZWN0PC90dD4gYW5kIGBgPHR0PkNhbid0IGZpbmQgZmlsZTwvdHQ+JycKLXN1cHBsaWVkIGFzIGFyZ3VtZW50cy4gIFRoZSBmdW5jdGlvbiBtYXkgcmVxdWlyZSBtb3JlIGluZm9ybWF0aW9uIHN1Y2gKLWFzIHRoZSBmaWxlIG5hbWUgKHRoYXQgY291bGQgbm90IGJlIG9wZW5lZCksIGFuZCBpdCBtaWdodCBmaW5kIHRoaXMKLWluZm9ybWF0aW9uIGJ5IGBgcHVsbGluZycnIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgbGlicmFyeSB1c2luZyB0aGUKLWZ1bmN0aW9ucyB3cmFwcGVkIGJ5IFNXSUcuCi0KLTxwPgotVGhlIDx0dD5SZWdpc3RlckJ5T2JqZWN0KCk8L3R0PiBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcKLWFuIG9iamVjdCBvZiB0aGUgPHR0PlBlcmw1VHJpZ2dlcjwvdHQ+IGNsYXNzLCBhbmQgZm9yIGNyZWF0aW5nIHRoZSBhc3NvY2lhdGlvbgotYmV0d2VlbiB0aGUgPHR0PlBlcmw1VHJpZ2dlcjwvdHQ+LCB0aGUgZXZlbnQgbmFtZSwgYW5kIHRoZSBvYmplY3QgcmVjZWl2aW5nIHRoZQotZXZlbnQuICBUaGVyZSBpcyBhIGJpdCBvZiB0eXBlbWFwIHRyaWNrZXJ5IGludm9sdmVkIHdoZW4gaW50ZXJjZXB0aW5nCi10aGUgYXJndW1lbnRzIGZyb20gUGVybDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSV0eXBlbWFwKHBlcmw1LGluKSBTViogcEZjbiB7Ci0gIGlmICghU3ZST0soJHNvdXJjZSkpCi0gICAgY3JvYWsoIkV4cGVjdGVkIGEgcmVmZXJlbmNlLlxuIik7Ci0gICR0YXJnZXQgPSBTdlJWKCRzb3VyY2UpOwotfQotdm9pZAotUmVnaXN0ZXJCeU9iamVjdChjb25zdCBjaGFyKiBwY0V2ZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgUmVmKiBwUmVmLCBTViogcEZjbik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSBmaW5hbCBwb3J0aW9uIG9mIHRoZSBzeXN0ZW0gbGVmdCB0byBkZXNjcmliZSBpcyB0aGUgaW1wbGVtZW50YXRpb24KLW9mIHRoZSA8dHQ+UGVybDVUcmlnZ2VyOjpJbnZva2UoKTwvdHQ+IG1lbWJlciBmdW5jdGlvbiwgd2hpY2ggaXMKLXJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSBQZXJsIGZ1bmN0aW9uIGZyb20gdGhlIEMrKyBzaWRlIG9mIHRoZQotd29ybGQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcywgdGFrZW4gbmVhcmx5IHZlcmJhdGltIGZyb20gdGhlCi1BZHZhbmNlZCBQZXJsIFByb2dyYW1taW5nIGJvb2sgWzEsIHBnLiAzNTNdLCBsb29rcyBsaWtlCi10aGlzOgotCi08YmxvY2txdW90ZT48cHJlPgotYm9vbAotUGVybDVUcmlnZ2VyOjoKLUludm9rZShjb25zdCBjaGFyKiBwY0V2ZW50TmFtZSwKLSAgICAgICB2b2lkKiBwT2JqZWN0LAotICAgICAgIGNvbnN0IGNoYXIqIHBjVHlwZU5hbWUpIHsKLSAgZFNQOwotICBFTlRFUjsKLSAgU0FWRVRNUFM7Ci0gIFBVU0hNQVJLKHNwKTsKLSAgU1YqIHBTViA9IHN2X25ld21vcnRhbCgpOwotICBzdl9zZXRwdihwU1YsIChjaGFyKikgcGNFdmVudE5hbWUpOwotICBYUFVTSHMocFNWKTsKLSAgcFNWID0gc3ZfbmV3bW9ydGFsKCk7Ci0gIHN2X3NldHJlZl9wdihwU1YsIChjaGFyKikgcGNUeXBlTmFtZSwKLSAgICAgICAgICAgICAgIHBPYmplY3QpOwotICBYUFVTSHMocFNWKTsKLSAgcFNWID0gc3ZfbmV3bW9ydGFsKCk7Ci0gIHN2X3NldHB2KHBTViwgKGNoYXIqKSBwY1R5cGVOYW1lKTsKLSAgWFBVU0hzKHBTVik7Ci0gIFBVVEJBQ0s7Ci0gIGludCBuID0gcGVybF9jYWxsX3N2KHRoaXMtJmd0O3BQZXJsNUZjbiwgCi0gICAgICAgICAgICAgICBHX1NDQUxBUik7IAotICBTUEFHQUlOOwotICBpZiAobiA9PSAxKQotICAgIG4gPSBQT1BpOwotICBQVVRCQUNLOwotICBGUkVFVE1QUzsKLSAgTEVBVkU7Ci0gIHJldHVybiBuID09IDAgPyBmYWxzZSA6IHRydWU7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoND4gNS4xLjMgQmVuZWZpdHMgQW5kIExpbWl0YXRpb25zPC9oND4KLQotVGhlIGJlbmVmaXRzIHRoYXQgU1dJRyBwcm92aWRlcyB0byBCYWRnZXIgYXJlIGVub3Jtb3VzOgotCi08dWw+Ci08bGk+IE5vdCBjb3VudGluZyBjdXN0b20gY29kZSAoZS5nLiwgbGFuZ3VhZ2Utc3BlY2lmaWMKLSAgY2FsbGJhY2tzKSwgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlIGludGVyZmFjZSBjYW4gYmUgZGV2ZWxvcGVkIGluIGEKLSAgZGF5LCBjb21wYXJlZCB3aXRoIHdlZWtzIGZvciBhIGhhbmQtY3JhZnRlZCBhcHByb2FjaC4KLQotPGxpPiBTV0lHIHN1cHBvcnRzIHRoZSB1c2Ugb2YgbXVsdGlwbGUgZXh0ZW5zaW9uIGxhbmd1YWdlcyB3aXRoIGVhc2UuCi0KLTxsaT4gVGhlIHJlc3VsdGluZyBzb2x1dGlvbiBpcyBmbGV4aWJsZSwgYW5kIHRoZSByZXN1bHRzIGNhbiBiZQotICB0YWlsb3JlZCB0byBtZWV0IHRoZSBuZWVkcyBvZiBjb21wbGV4IGFwcGxpY2F0aW9ucyAoZS5nLiwKLSAgY2FsbGJhY2tzLCBzbWFydCByZWZlcmVuY2VzLCBhbmQgc28gb24pLgotPC91bD4KLQotU1dJRyBkb2VzIGhhdmUgbGltaXRhdGlvbnMsIGJ1dCBzbyBmYXIsIG5vbmUgb2YgdGhlc2UgbGltaXRhdGlvbnMgaGFzCi1wcm92ZW4gdG8gYmUgYSByZWFsIGltcGVkaW1lbnQuICBJdCBhbHNvIGFwcGVhcnMgdGhhdCBtb3N0IG9mIHRoZXNlCi1saW1pdGF0aW9ucyB3aWxsIGJlIGVyYWRpY2F0ZWQsIG9uY2UgU1dJRyBoYXMgaXRzIG93biBleHRlbnNpb24KLWxhbmd1YWdlIGludGVyZmFjZSAoc2VlIFNlY3Rpb24gNykuCi0KLQotPGgzPiA1LjIgVENBUCBhbmQgU0NDUCBmcm9tIEhQIE9wZW5DYWxsPC9oMz4KLQotT25lIG9mIHRoZSB3ZWxsIGtub3duIHBpdGZhbGxzIG9mIHN5c3RlbWF0aWMgbGlicmFyeSB0ZXN0aW5nIGlzIAotdGhlIGNyZWF0aW9uIG9mIGEgaHVnZSBudW1iZXIgb2Ygc21hbGwgQyBwcm9ncmFtcy0tZWFjaCBkZXNpZ25lZCB0byBwZXJmb3JtCi1hIHNpbmdsZSB0ZXN0LiAgTW9yZSBvZnRlbiB0aGFuIG5vdCwgdGhlc2UgQyBwcm9ncmFtcyBoYXZlIGEgbG90IG9mCi1jb21tb24gY29kZSB0aGF0IGlzIGNvcGllZCBmcm9tIG9uZSB0ZXN0IGNhc2UgdG8gdGhlCi1vdGhlci4gVGVzdGluZyBpcyBmdXJ0aGVyIGNvbXBsaWNhdGVkIGJ5IHRoZSB0ZWRpb3VzIHByb2Nlc3Mgb2YKLWVkaXRpbmcsIGNvbXBpbGluZywgYW5kIGV4ZWN1dGluZyBlYWNoIG9mIHRoZXNlIHByb2dyYW1zLgotCi08cD4KLVRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgU1dJRyBjYW4gYmUgdXNlZCB0byBpbmNvcnBvcmF0ZSBsaWJyYXJpZXMKLWludG8gUGVybCBleHRlbnNpb24gbW9kdWxlcyB3aGVyZSB0ZXN0IGNhc2VzIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBQZXJsIHNjcmlwdHMuCi1BcyBhIHJlc3VsdCwgdGhlIGNvbXBpbGUtZXhlY3V0ZSBjeWNsZSBpcyBubyBsb25nZXIgYSBwcm9ibGVtIGFuZAotUGVybCBzY3JpcHRzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBjb21tb24gcGFydHMgb2YgdmFyaW91cyB0ZXN0IGNhc2VzLgotCi08cD4KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGludGVncmF0aW9uIG9mIFBlcmwgd2l0aCBhbiBBUEkgdGhhdCBpcwotcGFydCBvZiBhIEhQIE9wZW5DYWxsIHRlbGVjb20gcHJvZHVjdCBkZXZlbG9wZWQgYXQgSFAgR3Jlbm9ibGUuICBUaGUKLUFQSSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFRDQVAgYW5kIFNDQ1AgbGF5ZXJzIG9mIHRoZSBTUzcgcHJvdG9jb2wKLWFuZCBjb25zaXN0cyBvZiBhYm91dCAyMCBmdW5jdGlvbiBhbmQgNjAgc3RydWN0dXJlIGRlY2xhcmF0aW9ucy4KLUZ1cnRoZXJtb3JlLCBtb3N0IGZ1bmN0aW9uIHBhcmFtZXRlcnMgYXJlIHBvaW50ZXJzIHRvIGRlZXBseSBuZXN0ZWQKLXN0cnVjdHVyZXMgc3VjaCBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiBlbnVtIHsKLSAgLi4uCi19IHRjX2FkZHJlc3NfbmF0dXJlOwotCi10eXBlZGVmIHN0cnVjdCAgewotICAuLi4KLSAgdGNfYWRkcmVzc19uYXR1cmUgIG5hdHVyZTsKLSAgLi4uCi19IHRjX2dsb2JhbF90aXRsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGNfYWRkcmVzc19zdHJ1Y3QgewotICAuLi4KLSAgdGNfZ2xvYmFsX3RpdGxlICAgIGd0OwotICAuLi4KLX0gdGNfYWRkcmVzczsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotRnJvbSBhIFBlcmwgdXNlcnMnIHBvaW50IG9mIHZpZXcsIHRoZSBmdW5jdGlvbmFsaXR5IG9mZmVyZWQKLWJ5IHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUgbXVzdCBiZSBub3QgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgdW5kZXJseWluZyBDIEFQSS4KLU90aGVyd2lzZSwgdGVzdCB3cml0ZXJzIG1heSBiZSBjb25mdXNlZCBieSB0aGUgUGVybCBBUEkgYW5kIHRlc3RpbmcKLXdpbGwgYmUgdW5uZWNlc3NhcmlseSBjb21wbGljYXRlZC4gIEZvcnR1bmF0ZWx5LCBTV0lHIGFkZHJlc3NlcyB0aGlzIHByb2JsZW0KLWJlY2F1c2UgUGVybCBpbnRlcmZhY2VzIAotYXJlIHNwZWNpZmllZCB1c2luZyBDIHN5bnRheCBhbmQgdGhlIHJlc3VsdGluZyBpbnRlcmZhY2UgY2xvc2VseQotcmVzZW1ibGVzIHRoZSBvcmlnaW5hbCBBUEkuCi0KLTxoND4gNS4yLjEgQ3JlYXRpbmcgdGhlIFNXSUcgSW50ZXJmYWNlPC9oMz4KLQotVG8gd3JhcCB0aGUgQyBBUEksIHRoZXJlIHdlcmUgdGhyZWUgY2hvaWNlczogY29weQotYW5kIG1vZGlmeSB0aGUgaGVhZGVyIGZpbGVzIGludG8gYSBTV0lHIGludGVyZmFjZSBmaWxlLCBmZWVkIHRoZQotaGVhZGVyIGZpbGVzIGRpcmVjdGx5IHRvIFNXSUcsIG9yIHdyaXRlIGFuIGludGVyZmFjZSBmaWxlIHRoYXQgaW5jbHVkZXMKLXNvbWUgcGFydHMgb2YgdGhlIGhlYWRlciBmaWxlcy4gVGhlIGZpcnN0IGNob2ljZSAKLXJlcXVpcmVzIHRoZSBkdXBsaWNhdGlvbiBvZiBDIGRlZmluaXRpb25zLS1hIHRhc2sgdGhhdCBpcwotZGlmZmljdWx0IHRvIG1hbmFnZSBhcyB0aGUgQVBJIGV2b2x2ZXMgKHNpbmNlIGl0IGlzIGhhcmQgdG8gbWFpbnRhaW4KLWNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIGludGVyZmFjZSBmaWxlIGFuZCBoZWFkZXIgZmlsZXMpLgotVGhlIHNlY29uZCBjaG9pY2UgbWF5IHdvcmsgaWYgdGhlIGhlYWRlciBmaWxlcyBhcmUgd3JpdHRlbiBpbiBhIHZlcnkKLWNsZWFuIHdheS4gIEhvd2V2ZXIsIGl0IGNhbiBicmVhayBkb3duIGlmIGhlYWRlciBmaWxlcyBhcmUgdG9vIGNvbXBsaWNhdGVkLgotVGhlcmVmb3JlLCBhIG1peCBvZiBoZWFkZXIgZmlsZXMgYW5kIGludGVyZmFjZXMgd2FzIHV0aWxpemVkLgotCi08cD4KLUFzIHBhcnQgb2YgdGhlIGludGVyZmFjZSBidWlsZGluZyBwcm9jZXNzLCBoZWFkZXIgZmlsZXMgd2VyZSB0bwotYmUgaW5jbHVkZWQgZGlyZWN0bHkgaW50byBpbnRlcmZhY2UgZmlsZXMuICBUaGlzIGlzIGVhc2lseSBkb25lCi11c2luZyB0aGUgPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlLCBidXQgYSBudW1iZXIgb2YgcHJvYmxlbWF0aWMKLW5lc3RlZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIGhhZCB0byBiZSBmaXhlZC4gRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci1zdHJ1Y3QgdGNTdGF0IHsKLSAgLi4uCi0gIHVuaW9uIHsKLSAgICAuLi4KLSAgICBzdHJ1Y3Qgc3RhdF9wX2Fib3J0IHsKLSAgICAgIGludCB2YWx1ZTsKLSAgICAgIHRjX3BfYWJvcnRfY2F1c2UgIHBfYWJvcnQ7Ci0gICAgfSBhYm9ydDsKLSAgICAuLi4KLSAgfSBwOwotfSB0Y19zdGF0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UbyBtYWtlIHRoaXMgc3RydWN0dXJlIG1vcmUgbWFuYWdlYWJsZSBpbiBTV0lHLCBpdCBjYW4gYmUgc3BsaXQgaW50bwotc21hbGxlciBwaWVjZXMgYW5kIHJld3JpdHRlbiBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgdmFsdWU7Ci0gIHRjX3BfYWJvcnRfY2F1c2UgIHBfYWJvcnQ7Ci19IHRjX3N0YXRfYWJvcnQ7Ci0KLXN0cnVjdCBUY1N0YXQgewotICAuLi4KLSAgdGNfc3RhdF9hYm9ydCAgYWJvcnQ7Ci0gIC4uLgotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLVN1Y2ggY2hhbmdlcyBoYXZlIG5vIGltcGFjdCBvbiB1c2VyIGNvZGUsIGJ1dCB0aGV5IHNpbXBsaWZ5IHRoZQotdXNlIG9mIFNXSUcuCi08cD4KLUluIGFkZGl0aW9uIHRvIHNwbGl0dGluZywgYSBudW1iZXIgb2Ygc3RydWN0dXJlcyBpbiB0aGUKLWhlYWRlciBmaWxlcyB3ZXJlIHRvIGJlIGhpZGRlbiBmcm9tIHRoZSBTV0lHIGNvbXBpbGVyLiAgV2hpbGUKLXRoaXMgY291bGQgYmUgZG9uZSB1c2luZyBhIHNpbXBsZSA8dHQ+I2lmbmRlZiBTV0lHPC90dD4gaW4gdGhlIGNvZGUsCi10aGlzIGNvdWxkIHBvdGVudGlhbGx5IHJlc3VsdCBpbiBhIGh1Z2UgY3VzdG9tZXIgcHJvYmxlbSBpZiB0aGV5IGFsc28gZGVmaW5lZAotYSA8dHQ+U1dJRzwvdHQ+IG1hY3JvIGluIHRoZWlyIGNvbXBpbGF0aW9uIHByb2Nlc3MuICAgVGhlcmVmb3JlLAotY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2FzIGltcGxlbWVudGVkIHVzaW5nIHNvbWUgY2xldmVyIEMKLWNvbW1lbnRzIHRoYXQgd2VyZSBwYXJzZWQgYnkgdnBwIChTZWUgdGhlIFRleHQ6OlZwcCBtb2R1bGUpIGR1cmluZwotdGhlIGJ1aWxkIG9mIHRoZSBTV0lHIGludGVyZmFjZS4gRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKgotSFAgcmVzZXJ2ZWQgY29tbWVudAotQGlmIG5vdCAkX2hwX3Jlc2VydmVkX3QKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCAgICAgICAgICAgbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyIGRhdGFzW01BWF9BQk9SVF9MRU5dOwotfSB0Y191X2Fib3J0OwotLyoKLUBlbmRpZgotICovCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoND4gNS4yLjIgU2hhZG93IENsYXNzZXM8L2g0PgotCi1CeSBkZWZhdWx0LCBTV0lHIGNvbnZlcnRzIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbnRvIGFjY2Vzc29yIGZ1bmN0aW9ucwotc3VjaCBhcwotCi08YmxvY2txdW90ZT48cHJlPgotdGNfZ2xvYmFsX3RpdGxlICoKLXRjX2FkZHJlc3NfZ3RfZ2V0KHRjX2FkZHJlc3MgKik7Ci0KLXRjX2FkZHJlc3NfbmF0dXJlCi10Y19nbG9iYWxfdGl0bGVfbmF0dXJlX3NldCgKLSAgIHRjX2dsb2JhbF90aXRsZSAqdCwKLSAgIHRjX2FkZHJlc3NfbmF0dXJlIHZhbCk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVVuZm9ydHVuYXRlbHksIHVzaW5nIHN1Y2ggZnVuY3Rpb25zIGlzIHNvbWV3aGF0IHVuZnJpZW5kbHkKLWZyb20gUGVybC4gIEZvciBleGFtcGxlLCB0byBzZXQgYSBzaW5nbGUgdmFsdWUsIGl0IHdvdWxkIGJlCi1uZWNlc3NhcnkgdG8gd3JpdGUgdGhlIGZvbGxvd2luZzoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSRwYXJhbSA9IG5ld190Y19hZGRyZXNzKCk7Ci10Y19nbG9iYWxfdGl0bGVfbmF0dXJlX3NldCgKLSAgICB0Y19hZGRyZXNzX2d0X2dldCgkcGFyYW0pLAotICAgICR2YWx1ZSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUZvcnR1bmF0ZWx5LCBzaGFkb3cgY2xhc3NlcyBzb2x2ZSB0aGlzIHByb2JsZW0gYnkgcHJvdmlkaW5nIG9iamVjdC1vcmllbnRlZAotYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIEMgc3RydWN0dXJlcy4gIEFzIGEgcmVzdWx0LCBpdCBpcyBwb3NzaWJsZQotdG8gcmV3cml0ZSB0aGUgYWJvdmUgUGVybCBjb2RlIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0kcGFybSA9IG5ldyB0Y19hZGRyZXNzOwotJHBhcmFtLSZndDt7Z3R9e25hdHVyZX0gPSAkdmFsdWU7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLU5lZWRsZXNzIHRvIHNheSwgdGhpcyBhcHByb2FjaCBpcyBtdWNoIGVhc2llciBmb3IgdXNlcnMgdG8gZ3Jhc3AuCi0KLTxoND4gNS4yLjMgQ3VzdG9taXphdGlvbiBXaXRoIFR5cGVtYXBzPC9oND4KLQotVG8gaW1wcm92ZSB0aGUgUGVybCBpbnRlcmZhY2UsIGEgbnVtYmVyIG9mIHR5cGVtYXBzIHdlcmUgZGVmaW5lZAotZm9yIHZhcmlvdXMgcGFydHMgb2YgdGhlIGludGVyZmFjZS4gICAKLU9uZSB1c2Ugb2YgdHlwZW1hcHMgd2FzIGluIHN0cnVjdHVyZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nOgotCi08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC4uLgotICAgIHRjX3VfYWJvcnQgIGFib3J0X3JlYXNvbjsKLSAgICAuLi4KLX0gdGNfZGlhbG9nX3BvcnRpb247Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVNpbmNlIDx0dD50Y191X2Fib3J0PC90dD4gaXMgZGVmaW5lZCBieSB0aGUgc3RydWN0dXJlIHNob3duIGVhcmxpZXIsCi1TV0lHIG5vcm1hbGx5IHRyaWVzIHRvIG1hbmlwdWxhdGUgaXQgdGhyb3VnaCBwb2ludGVycy4gIEhvd2V2ZXIsIGEgdHlwZW1hcAotY2FuIGJlIGRlZmluZWQgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3IuICBJbiBwYXJ0aWN1bGFyLCBpdCB3YXMKLWRlY2lkZWQgdGhhdCB0ZXN0ZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNldCBhbmQgZ2V0IHRoaXMgdmFsdWUgdXNpbmcKLUJDRCBlbmNvZGVkIHN0cmluZ3Mgc3VjaCBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotbXkgJGRpYWxvZyA9IG5ldyB0Y19kaWFsb2dfcG9ydGlvbjsKLSRkaWFsb2ctJmd0O3thYm9ydF9yZWFzb259ID0gJzBmNDU2QSc7Ci0KLSMgT3IKLXByaW50ICJVc2VyIGFib3J0IHJlYXNvbiBpcyBcCi0kZGlhbG9nLSZndDt7YWJvcnRfcmVhc29ufSBcbiI7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRvIGRvIHRoaXMsIGEgdHlwZW1hcCBmb3IgY29udmVydGluZyBCQ0QgUGVybCBzdHJpbmdzIGludG8gYW4gCi1hcHByb3ByaWF0ZSBieXRlIHNlcXVlbmNlIHdlcmUgZGV2ZWxvcGVkLiAgSW4gYWRkaXRpb24sIHRoZSB0eXBlbWFwCi1wZXJmb3JtcyBhIGZldyBzYW5pdHkgY2hlY2tzIHRvIHByZXZlbnQgaW52YWxpZCB2YWx1ZXMuIAotCi08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAgKHBlcmw1LGluKSB0Y191X2Fib3J0ICoKLSgkYmFzZXR5cGUgdGVtcCkKLXsKLSAgaW50IGk7Ci0gIFNUUkxFTiBsZW47Ci0gIHNob3J0IHRtcDsKLSAgY2hhciAqc3RyOwotICAkdGFyZ2V0ID0gJnRlbXA7Ci0KLSAgLyogY29udmVydCAgc2NhbGFyIHRvIGNoYXIqICovCi0gIHN0ciA9IFN2UFYoJHNvdXJjZSxsZW4pOwotICAvKiBjaGVjayBpZiAgZXZlbiAjIG9mIGNoYXIgKi8KLSAgaWYgKCAobGVuICUgMikgIT0gMCApIHsKLSAgICBjcm9haygiVW5ldmVuICMgb2YgY2hhciIpOwotICB9Ci0gIC8qIHNldCBsZW5ndGggZmllbGQgKi8KLSAgJHRhcmdldC0mZ3Q7bGVuZ3RoPShsZW4vMik7Ci0gIGlmICgobGVuLzIpJmd0OyhzaXplb2YoJGJhc2V0eXBlKS0xKSkKLSAgewotICAgIGNyb2FrKCJUb28gbWFueSBieXRlcyBpbiB2YWx1ZVxuIik7Ci0gIH0KLSAgZm9yIChpPTA7aSZsdDskdGFyZ2V0LSZndDtsZW5ndGg7aSsrKQotICB7Ci0gICAgaWYgKHNzY2FuZihzdHIsIiUyaHgiLCAmdG1wKSAhPSAxICkKLSAgICAgIGNyb2FrKCJzc2NhbmYgZmFpbGVkIG9uICVzLCBcCi0gICAgICAgICAgICAgaXMgaXQgaGV4YSA/XG4iLHN0cik7Ci0gICAgICAkdGFyZ2V0LSZndDtkYXRhc1tpXSA9IHRtcDsKLSAgICAgIHN0cis9MjsKLSAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UbyByZXR1cm4gdGhlIGJ5dGUgYnVmZmVyIGJhY2sgdG8gUGVybCBhcyBhIHN0cmluZywgYSBzb21ld2hhdCBzaW1wbGVyIHR5cGVtYXAKLWlzIHVzZWQ6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0ldHlwZW1hcCAocGVybDUsb3V0KSB0Y191X2Fib3J0ICoKLXsKLSAgaW50IGk7Ci0gICR0YXJnZXQ9bmV3U1ZwdmYoIiV4Iiwkc291cmNlLSZndDtkYXRhc1swXSk7Ci0KLSAgZm9yIChpPTE7IGkmbHQ7ICRzb3VyY2UtJmd0O2xlbmd0aDsgaSsrKSB7Ci0gICAgc3ZfY2F0cHZmKCR0YXJnZXQsIiV4IiwKLSAgICAgICAgICAgICAgJHNvdXJjZS0mZ3Q7ZGF0YXNbaV0pOwotICB9Ci0gIGFyZ3ZpICsrOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1TV0lHIHR5cGVtYXBzIHdlcmUgYWxzbyB1c2VkIHRvIGZpeCBhIGZldyBvdGhlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwKLXNvbWUgZnVuY3Rpb25zIHJlcXVpcmVkIGFuIGFkZHJlc3MgcGFyYW1ldGVyIGVuY29kZWQgYXMgYSB0d28tZWxlbWVudCBhcnJheS4KLUJ5IGRlZmF1bHQsIFNXSUcgd3JhcHMgdGhpcyBwYXJhbWV0ZXIgYXMgYSBwb2ludGVyLCBidXQgdGhpcyAKLWxlYXZlcyB0aGUgUGVybCB3cml0ZXIgd2l0aCB0aGUgcGFpbmZ1bCB0YXNrcyBvZiBjcmVhdGluZyBhbmQKLWZpbGxpbmcgYSBDIGFycmF5IHdpdGggc2Vuc2libGUgdmFsdWVzIHVzaW5nIHRoZSBTV0lHIHBvaW50ZXIgbGlicmFyeSBvcgotaGVscGVyIGZ1bmN0aW9ucy4gIEZvcnR1bmF0ZWx5LCB3aXRoIHR5cGVtYXBzLCBpdCB3YXMgcG9zc2libGUgdG8KLWNyZWF0ZSBhbmQgc2V0IHRoaXMgcGFyYW1ldGVyIHVzaW5nIFBlcmwgaGFzaGVzIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jICRhZGRyZXNzIGlzIGFuIG9yZGluYXJ5IHBlcmwgaGFzaAotIyAkYWRkcmVzcyB3aWxsIGJlIHVzZWQgYXMgYW4gYXJyYXkKLSRhZGRyZXNzLSZndDt7cGN9ID0gMTA7IAotJGFkZHJlc3MtJmd0O3tzc259PSAxMjsKLS4uLgotU0NDUF9vYW1jbWQoJGNueElkLCAkdGltZSwgdW5kZWYsICRhZGRyZXNzLAotICAgICAgICAgICAgJGNvbW1hbmQsICRjbWRfcGFybXMpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGUgdHlwZW1hcCBpbXBsZW1lbnRpbmcgdGhpcyBiZWhhdmlvciBpcyBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAgKHBlcmw1LGluKSBTY2NwT2FtQWRkcmVzcyogewotICBIViogcGFzc2VkSGFzaDsKLSAgU1YqKiB2YWx1ZVBQOwotICBTY2NwT2FtQWRkcmVzcyB0ZW1wQWRkcmVzczsKLSAgaWYgKCFTdk9LKCRzb3VyY2UpKSB7Ci0gICAgICAvKiB3ZSB3ZXJlIHBhc3NlZCB1bmRlZiAqLwotICAgICAgdGVtcEFkZHJlc3NbMF0gPSAwOwotICAgICAgdGVtcEFkZHJlc3NbMV0gPSAwOwotICB9IGVsc2UgewotICAgIGlmICghU3ZST0soJHNvdXJjZSkpCi0gICAgICBjcm9haygiTm90IGEgcmVmZXJlbmNlXG4iKTsKLSAgICBpZiAoU3ZUWVBFKFN2UlYoJHNvdXJjZSkpICE9IFNWdF9QVkhWKQotICAgICAgY3JvYWsoIk5vdCBhIGhhc2ggcmVmZXJlbmNlXG4iKTsKLQotICAgIHBhc3NlZEhhc2ggPSAoSFYqKSBTdlJWKCRzb3VyY2UpOwotICAgIHZhbHVlUFA9aHZfZmV0Y2gocGFzc2VkSGFzaCwic3NuIiwzLDApOwotCi0gICAgaWYgKCp2YWx1ZVBQID09IE5VTEwpCi0gICAgICBjcm9haygiTWlzc2luZyAnc3NuJyBrZXlcbiIpOwotICAgIHRlbXBBZGRyZXNzWzFdID0gU3ZJVigqdmFsdWVQUCk7Ci0gICAgdmFsdWVQUD1odl9mZXRjaChwYXNzZWRIYXNoLCJwYyIsMiwwKTsKLSAgICBpZiAoKnZhbHVlUFAgPT0gTlVMTCkKLSAgICAgIGNyb2FrKCJNaXNzaW5nICdwYycga2V5XG4iKTsKLSAgICB0ZW1wQWRkcmVzc1swXSA9IFN2SVYoKnZhbHVlUFApOwotICB9Ci0gICR0YXJnZXQgPSAmdGVtcEFkZHJlc3M7Ci19Ci0KLS8qIFNjY3BPYW1BZGRyZXNzIGlzIHJldHVybmVkIGFzIAotICAgeydzc24nPT5zc25fdmFsdWUsICdwYyc9PnBjX3ZhbHVlfSAqLwotJXR5cGVtYXAgKHBlcmw1LG91dCkgU2NjcE9hbUFkZHJlc3MqIHsKLSAgSFYqIHBhc3NlZEhhc2g7Ci0gIFNWKiB0aGVTc247Ci0gIFNWKiB0aGVQYzsKLQotICB0aGVQYyAgPSBuZXdTVml2KCgqJHNvdXJjZSlbMF0pOwotICB0aGVTc24gPSBuZXdTVml2KCgqJHNvdXJjZSlbMV0pOwotICBwYXNzZWRIYXNoID0gbmV3SFYoKTsKLSAgaHZfc3RvcmUocGFzc2VkSGFzaCwic3NuIiwzLHRoZVNzbiwwKTsKLSAgaHZfc3RvcmUocGFzc2VkSGFzaCwicGMiLDIsdGhlUGMsMCk7Ci0gICR0YXJnZXQgPSBuZXdSVl9ub2luYygoU1YqKSBwYXNzZWRIYXNoKTsKLSAgYXJndmkgKys7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoND4gNS4yLjQgU3RhdGlzdGljczwvaDQ+Ci0KLVRhYmxlIDEgc2hvd3MgdGhlIGFtb3VudCBvZiBjb2RlIGFzc29jaWF0ZWQgd2l0aCAuaSBmaWxlcyBhbmQKLWhlYWRlciBmaWxlcyBhcyB3ZWxsIGFzIHRoZSBhbW91bnQgb2YgY29kZSBnZW5lcmF0ZWQgYnkgU1dJRyAoLkMgYW5kIC5wbQotZmlsZXMpLiAgIFdoaWxlIGl0IHdhcyBuZWNlc3NhcnkgdG8gd3JpdGUgYSBmZXcgLmkgZmlsZXMsIHRoZSBzaXplIG9mCi10aGVzZSBmaWxlcyBpcyBzbWFsbCBpbiBjb21wYXJzaW9uIHRvIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGVzLgotCi08cD4KLTxjZW50ZXI+Ci08dGFibGUgYm9yZGVyIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9NT4KLTxjYXB0aW9uIGFsaWduPWJvdHRvbT4gVGFibGUgMTogVENBUCBhbmQgU0NQUCBNb2R1bGVzPC9jYXB0aW9uPgotPHRyPgotPHRoPiBNb2R1bGUgPC90aD4KLTx0aD4gLmkgZmlsZXMgPC90aD4KLTx0aD4gLmggZmlsZXMgPC90aD4KLTx0aD4gLkMgZmlsZXMgPC90aD4KLTx0aD4gLnBtIGZpbGVzIDwvdGg+Ci08L3RyPgotPHRyPgotPHRoPiBUQ0FQIDwvdGg+Ci08dGQ+IDQzNCA8L3RkPgotPHRkPiA5NzcgPC90ZD4KLTx0ZD4gMTYwOTggPC90ZD4KLTx0ZD4gMzU2MSA8L3RkPgotPC90cj4KLTx0cj4KLTx0aD4gU0NQUCA8L3RoPgotPHRkPiAzNjQgPC90ZD4KLTx0ZD4gNDk0IDwvdGQ+Ci08dGQ+IDEzMDYwIDwvdGQ+Ci08dGQ+IDIyNDYgPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9jZW50ZXI+Ci0KLTxoND4gNS4yLjUgUmVzdWx0cyA8L2g0PgotCi1PdmVyYWxsLCBTV0lHIHNhdmVkIHRpbWUgd2hlbiBwcm92aWRpbmcgUGVybCBhY2Nlc3MgdG8gdGhlIFRDQVAgYW5kIFNDQ1AKLWxpYnJhcmllcy4gICBXaGlsZSBpdCB0b29rIHNvbWUgdGltZSBhbmQgaGFyZCB3b3JrIHRvIHdyaXRlIHRoZSB0eXBlbWFwcywKLXRoZSBTV0lHIGFwcHJvYWNoIGhhcyBzZXZlcmFsIGFkdmFudGFnZXMgY29tcGFyZWQgdG8gWFMgb3IgdGhlCi1wdXJlIEMgYXBwcm9hY2g6Ci0KLTx1bD4KLQotPGxpPiBUaGUgaW50ZXJmYWNlIGZpbGVzIGFyZSBxdWl0ZSBzaG9ydCBzbyBpZiB0aGV5IGFyZSB3ZWxsIGRvY3VtZW50ZWQsIGEgbmV3IAotICBTV0lHIHVzZXIgc2hvdWxkIG5vdCBoYXZlIGFueSBtYWpvciBwcm9ibGVtcyBtYWludGFpbmluZyB0aGVtLgotPGxpPiBBIG5ldyB2ZXJzaW9uIG9mIHRoZSBBUEkgaXMgd3JhcHBlZCB3aXRoIGEgJ21ha2UnIGNvbW1hbmQsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZWRpdAotICBhbnkgZmlsZS4gSW4gbW9zdCBjYXNlcyB0aGUgaW50ZXJmYWNlIGZpbGVzIGNhbiByZW1haW4gdW5tb2RpZmllZCwgcHJvdmlkZWQKLSAgdGhlcmUgYXJlIG5vIHdlaXJkIGNvbnN0cnVjdHMgaW50cm9kdWNlZCBpbiB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIEFQSS4KLTxsaT4gTmV3IGNvbW1lbnRzIGFkZGVkIGluIHRoZSBoZWFkZXIgZmlsZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGluIHRoZQotICBkb2N1bWVudGF0aW9uIGZpbGVzIGdlbmVyYXRlZCBieSBTV0lHLgotPGxpPiBJZiBuZWNlc3NhcnksIG5ldyBoZWxwZXIgZnVuY3Rpb25zIG1heSBiZSBhZGRlZCBpbiB0aGUgLmkgZmlsZXMgd2l0aG91dCAKLSAgaW1wYWN0aW5nIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlIG9yIHR5cGVtYXBzLiAgVGhpcyBhbGxvd3MgYSBuZXcgdXNlciB0byBkbyBpdAotICB3aXRob3V0IHJlYWRpbmcgdGhlIHdob2xlIFNXSUcgbWFudWFsLgotPGxpPiBUeXBlbWFwcyB0aGF0IGRlYWwgd2l0aCBiYXNpYyB0eXBlcyBvciBzaW1wbGUgc3RydWN0dXJlcyBhcmUgcmV1c2FibGUKLSAgYW5kIGNhbiBiZSB1c2VkIHdpdGggb3RoZXIgQVBJcy4KLTwvdWw+Ci0KLUZvciB0aG9zZSB3aG8gYXJlIGNvbnNpZGVyaW5nIFNXSUcncyBhZHZhbmNlZCBmZWF0dXJlcywgdGhlIGxlYXJuaW5nCi1jdXJ2ZSBpcyBhIGxpdHRsZSBzdGVlcCBhdCBmaXJzdCwgYnV0IHRoZSByZXdhcmRzIGFyZSBncmVhdCBiZWNhdXNlCi1TV0lHIGFkdmFuY2VkIGZlYXR1cmVzIHdpbGwgZW5hYmxlIHlvdSB0byBwcm92aWRlIGFuIGltcHJvdmVkCi1pbnRlcmZhY2UgdG8gdGhlIFBlcmwgdXNlci4KLQotCi0KLQotCi0KLQotPGgyPiA2IExpbWl0YXRpb25zPC9oMj4KLQotQ3VycmVudGx5LCBTV0lHIGlzIGJlaW5nIHVzZWQgYnkgaHVuZHJlZHMgb2YgdXNlcnMgaW4gY29uanVuY3Rpb24KLXdpdGggYSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucy4gICBIb3dldmVyLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgotb2YgU1dJRyBoYXMgYSBudW1iZXIgb2YgbGltaXRhdGlvbnMuICAgIFNvbWUgb2YgdGhlc2UgbGltaXRhdGlvbnMgYXJlCi1kdWUgdG8gdGhlIGZhY3QgdGhhdCBTV0lHIGlzIG5vdCBhIGZ1bGwgQy9DKysgcGFyc2VyLiAgIEluIHBhcnRpY3VsYXIsCi10aGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZDoKLQotPHVsPgotPGxpPiBWYXJpYWJsZSBsZW5ndGggYXJndW1lbnRzICguLi4pCi08bGk+IFBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KLTxsaT4gVGVtcGxhdGVzLgotPGxpPiBPdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzLgotPGxpPiBDKysgTmFtZXNwYWNlcy4KLTxsaT4gTmVzdGVkIGNsYXNzIGRlZmluaXRpb25zLgotPC91bD4KLQotV2hlbiB0aGVzZSBmZWF0dXJlcyBhcHBlYXIgaW4gYSBTV0lHIGlucHV0IGZpbGUsIGEgc3ludGF4IGVycm9yIG9yCi13YXJuaW5nIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLiAgVG8gZWxpbWluYXRlIHRoZXNlIHdhcm5pbmdzLAotcHJvYmxlbWF0aWMgZGVjbGFyYXRpb25zIGNhbiBlaXRoZXIgYmUgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcmZhY2UsCi1oaWRkZW4gd2l0aCBjb25kaXRpb25hbCBjb21waWxhdGlvbiwgb3Igd3JhcHBlZCB1c2luZyBoZWxwZXIKLWZ1bmN0aW9ucyBhbmQgb3RoZXIgU1dJRyBkaXJlY3RpdmVzLgotCi08cD4KLUEgY2xvc2VseSByZWxhdGVkIHByb2JsZW0gaXMgdGhhdCBjZXJ0YWluIEMvQysrIHByb2dyYW1zIGFyZSBub3QgZWFzaWx5Ci1zY3JpcHRlZC4gIEZvciBleGFtcGxlLCBwcm9ncmFtcyB0aGF0IG1ha2UgZXh0ZW5zaXZlIHVzZSBvZgotYWR2YW5jZWQgQysrIGZlYXR1cmVzIHN1Y2ggYXMgdGVtcGxhdGVzLCBzbWFydCBwb2ludGVycywgYW5kIG92ZXJsb2FkZWQKLW9wZXJhdG9ycyBjYW4gYmUgZXh0cmVtZWx5IHRyb3VibGVzb21lIHRvIGluY29ycG9yYXRlCi1pbnRvIFBlcmwuICAgVGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlIGZvciBDKysgcHJvZ3JhbXMgdGhhdCBvdmVycmlkZQotdGhlIHN0YW5kYXJkIGJlaGF2aW9yIG9mIHBvaW50ZXJzIGFuZCBkZWZlcmVuY2luZyBvcGVyYXRpb25zLS0tb3BlcmF0aW9ucwotdGhhdCBhcmUgdXNlZCBleHRlbnNpdmVseSBieSBTV0lHIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUuCi0KLTxwPgotSW4gYWRkaXRpb24sIFNXSUcgZG9lcyBub3QgcHJvdmlkZSBxdWl0ZSBhcyBtdWNoIGZsZXhpYmlsaXR5IGFzIDx0dD54c3VicHA8L3R0PiBhbmQKLW90aGVyIFBlcmwgc3BlY2lmaWMgZXh0ZW5zaW9uIGJ1aWxkaW5nIHRvb2xzLiAgIEluIG9yZGVyIHRvIGJlIGdlbmVyYWwgcHVycG9zZSwKLVNXSUcgaGlkZXMgbWFueSBvZiB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBlYWNoIHNjcmlwdGluZwotbGFuZ3VhZ2UuICBBcyBhIHJlc3VsdCwgaXQgY2FuIGJlIGRpZmZpY3VsdCB0byBhY2NvbXBsaXNoIGNlcnRhaW4gdGFza3MuICBGb3IKLWV4YW1wbGUsIG9uZSBzdWNoIHNpdHVhdGlvbiBpcyB0aGUgaGFuZGxpbmcgb2YgZnVuY3Rpb25zIHdoZXJlIGFyZ3VtZW50cwotYXJlIGltcGxpY2l0bHkgcmVsYXRlZCB0byBlYWNoIG90aGVyIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci12b2lkIGZvbyhjaGFyICpzdHIsIGludCBsZW4pIHsKLSAgIC8vIHN0ciA9IHN0cmluZyBkYXRhCi0gICAvLyBsZW4gPSBsZW5ndGggb2Ygc3RyaW5nIGRhdGEgICAKLSAgIC4uLgotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1JZGVhbGx5LCBpdCBtaWdodCBiZSBkZXNpcmFibGUgdG8gcGFzcyBhIHNpbmdsZSBQZXJsIHN0cmluZyB0byBzdWNoIGEgZnVuY3Rpb24KLWFuZCBoYXZlIGl0IGV4cGFuZGVkIGludG8gYSBkYXRhIGFuZCBsZW5ndGggY29tcG9uZW50LiAgIFVuZm9ydHVuYXRlbHksIFNXSUcKLWhhcyBubyB3YXkgdG8ga25vdyB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIHJlbGF0ZWQgdG8gZWFjaCBvdGhlciBpbiB0aGlzIG1hbm5lci4KLUZ1cnRoZXJtb3JlLCB0aGUgY3VycmVudCB0eXBlbWFwIG1lY2hhbmlzbSBvbmx5IGFwcGxpZXMgdG8gc2luZ2xlIGFyZ3VtZW50cyAKLXNvIGl0IGNhbiBub3QgYmUgdXNlZCB0byBjb21iaW5lIGFyZ3VtZW50cyBpbiB0aGlzIG1hbm5lci4gICBYUywgb24gdGhlIG90aGVyIGhhbmQsIGlzIG1vcmUKLWNsb3NlbHkgdGllZCB0byB0aGUgUGVybCBpbnRlcnByZXRlciBhbmQgY29uc2VxdWVudGx5IHByb3ZpZGVzIG1vcmUKLXBvd2VyIGluIHRoZSB3YXkgdGhhdCBhcmd1bWVudHMgY2FuIGJlIGNvbnZlcnRlZCBhbmQgcGFzc2VkIHRvIEMgZnVuY3Rpb25zLgotCi08cD4KLUZpbmFsbHksIFNXSUcgaXMgc3RpbGwgc29tZXdoYXQgaW1tYXR1cmUgd2l0aCByZXNwZWN0IHRvIGl0cyBvdmVyYWxsCi1pbnRlZ3JhdGlvbiB3aXRoIFBlcmwuICBGb3IgZXhhbXBsZSwgU1dJRyBkb2VzIG5vdCBmdWxseSBzdXBwb3J0Ci1QZXJsJ3MgcGFja2FnZSBhbmQgbW9kdWxlIG5hbWluZyBzeXN0ZW0uICBJbiBvdGhlciB3b3JkcywgU1dJRyBjYW4gY3JlYXRlCi1hIG1vZHVsZSBgYEZvbycnLCBidXQgY2FuJ3QgY3JlYXRlIGEgbW9kdWxlIGBgRm9vOjpCYXIuJycgIExpa2V3aXNlLAotU1dJRyBkb2VzIG5vdCBjdXJyZW50bHkgdXRpbGl6ZSBNYWtlTWFrZXIgYW5kIG90aGVyIHV0aWxpdGllcwotKGFsdGhvdWdoIHVzZXJzIGhhdmUgc3VjY2Vzc2Z1bGx5IHVzZWQgU1dJRyB3aXRoIHN1Y2ggdG9vbHMpLiBJbgotYWRkaXRpb24sIHNvbWUgdXNlcnMgaGF2ZSByZXBvcnRlZCBvY2Nhc2lvbmFsIHByb2JsZW1zIHdoZW4gU1dJRwotbW9kdWxlcyBhcmUgdXNlZCB3aXRoIHRoZSBQZXJsIGRlYnVnZ2VyIGFuZCBvdGhlciB0b29scy4KLQotPGgyPiA3IEZ1dHVyZSBEaXJlY3Rpb25zIDwvaDI+Ci0KLUZ1dHVyZSBkZXZlbG9wbWVudCBvZiBTV0lHIGlzIGZvY3VzZWQgb24gdGhyZWUgcHJpbWFyeSBhcmVhcy4gIEZpcnN0LCBpbXByb3ZlZAotcGFyc2luZyBhbmQgc3VwcG9ydCBmb3IgbW9yZSBhZHZhbmNlZCBDKysgYXJlIGJlaW5nIGFkZGVkLiAgVGhlc2UgYWRkaXRpb25zCi1pbmNsdWRlIHN1cHBvcnQgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCBDKysgbmFtZXNwYWNlcy4gIExpbWl0ZWQgc3VwcG9ydCBmb3Igd3JhcHBpbmcKLUMrKyB0ZW1wbGF0ZXMgbWF5IGFsc28gYmUgYWRkZWQuICBTZWNvbmQsIFNXSUcncyBjb2RlIGdlbmVyYXRpb24gYWJpbGl0aWVzCi1hcmUgYmVpbmcgaW1wcm92ZWQuICAgQWRkaXRpb25zIGluY2x1ZGUgbW9yZSBmbGV4aWJsZSB0eXBlbWFwcyBhbmQgYmV0dGVyCi1hY2Nlc3MgdG8gc2NyaXB0aW5nLWxhbmd1YWdlIHNwZWNpZmljIGZlYXR1cmVzLiAgRmluYWxseSwgYW4gZXh0ZW5zaW9uIEFQSQotaXMgYmVpbmcgYWRkZWQgdG8gdGhlIFNXSUcgY29tcGlsZXIuICAgVGhpcyBBUEkgd2lsbCBhbGxvdyB2YXJpb3VzCi1wYXJ0cyBvZiB0aGUgU1dJRyBjb21waWxlciBzdWNoIGFzIHRoZSBwcmVwcm9jZXNzb3IsIHBhcnNlciwgYW5kIGNvZGUgZ2VuZXJhdG9ycwotdG8gYmUgYWNjZXNzZWQgdGhyb3VnaCBhIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuICBJbiBmYWN0LCB0aGlzIAotaW50ZXJmYWNlIHdpbGwgZXZlbiBhbGxvdyBuZXcgcGFyc2VycyBhbmQgY29kZSBnZW5lcmF0b3JzIHRvIGJlIGltcGxlbWVudGVkCi1lbnRpcmVseSBpbiBQZXJsLgotCi08aDI+IDggQWNrbm93bGVkZ21lbnRzPC9oMj4KLQotU1dJRyB3b3VsZCBub3QgYmUgcG9zc2libGUgd2l0aG91dCB0aGUgZmVlZGJhY2sgYW5kIGNvbnRyaWJ1dGlvbnMgb2YgaXRzIHVzZXJzLgotV2hpbGUgaXQgaXMgaW1wb3NzaWJsZSB0byBhY2tub3dsZWRnZSBldmVyeW9uZSBpbmRpdmlkdWFsbHksIGEgbnVtYmVyIG9mCi1wZW9wbGUgaGF2ZSBiZWVuIGluc3RydW1lbnRhbCBpbiBwcm9tb3RpbmcgYW5kIGltcHJvdmluZyBTV0lHJ3MgUGVybCBzdXBwb3J0LgotSW4gcGFydGljdWxhciwgR2FyeSBIb2x0IHByb3ZpZGVkIG1hbnkgb2YgdGhlIGlkZWFzIHVzZWQgaW4gdGhlIHNoYWRvdwotY2xhc3MgbWVjaGFuaXNtLiAgV2Ugd291bGQgYWxzbyBsaWtlIHRvIHRoYW5rIEpvaG4gQnVja21hbiwgU2NvdHQgQm9sdGUsIAotYW5kIFNyaXJhbSBTcmluaXZhc2FuLCBmb3IgdGhlaXIgc3VwcG9ydCBvZiBTV0lHLiAgV2UgYWxzbyB0aGFuayB0aGUgVW5pdmVyc2l0eQotb2YgVXRhaCBhbmQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciB0aGVpciBjb250aW51ZWQgc3VwcG9ydC4KLQotPGgyPiA5IEF2YWlsYWJpbGl0eSA8L2gyPgotCi1TV0lHIGlzIGZyZWVseSBhdmFpbGFibGUgb24gQ1BBTiBhdCA8YnI+Ci0KLTxwPgotPGEgaHJlZj0iaHR0cDovL3d3dy5wZXJsLmNvbS9DUEFOL2F1dGhvcnMvRGF2ZV9CZWF6bGV5Ij4KLTx0dD53d3cucGVybC5jb20vQ1BBTi9hdXRob3JzL0RhdmVfQmVhemxleTwvdHQ+LjwvYT48YnI+Ci0KLTxwPgotQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgU1dJRyBob21lcGFnZSBhdCAKLTxhIGhyZWY9Imh0dHA6Ly93d3cuc3dpZy5vcmciPjx0dD53d3cuc3dpZy5vcmc8L3R0PjwvYT4uIEFuCi1hY3RpdmUgbWFpbGluZyBsaXN0IG9mIHNldmVyYWwgaHVuZHJlZCBzdWJzY3JpYmVycyBpcyBhbHNvIGF2YWlsYWJsZS4KLQotPGgyPiBCaWJsaW9ncmFwaHkgPC9oMj4KLQotWzFdIFNyaXJhbSBTcmluaXZhc2FuLiA8ZW0+IEFkdmFuY2VkIFBlcmwgUHJvZ3JhbW1pbmc8L2VtPi4gTydSZWlsbHkKLWFuZCBBc3NvY2lhdGVzLCAxOTk3LgotCi08cD4KLVsyXSBTY290dCBCb2x0ZS4gU1dJRy4gPGVtPiBUaGUgUGVybCBKb3VybmFsPC9lbT4sIDIoNCk6MjYtMzEsIFdpbnRlciAxOTk3LgotCi08cD4KLVszXSBELk0uIEJlYXpsZXkuIFNXSUcgYW5kIEF1dG9tYXRlZCBDL0MrKyBTY3JpcHRpbmcgRXh0ZW5zaW9ucy4KLTxlbT4gRHIuIERvYmIncyBKb3VybmFsPC9lbT4sICgyODIpOjMwLTM2LCBGZWIgMTk5OC4KLQotPHA+Ci1bNF0gRC5NLiBCZWF6bGV5LCBTV0lHIFVzZXJzIE1hbnVhbC4gVGVjaG5pY2FsIFJlcG9ydCBVVUNTLTk4LTAxMiwKLVVuaXZlcnNpdHkgb2YgVXRhaCwgMTk5OC4KLQotPHA+Ci1bNV0gRS4gR2FtbWEsIFIuIEhlbG0sIFIuIEpvaG5zb24sIGFuZCBKLiBWbGlzc2lkZXMsIDxlbT5EZXNpZ24gUGF0dGVybnM8L2VtPi4KLUFkZGlzb24tV2VzbGV5LCAxOTk1LgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QZXJsOTgvc3dpZ3BlcmwucGRmIGIvc3dpZ3dlYi9wYXBlcnMvUGVybDk4L3N3aWdwZXJsLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg1ZGY4Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QZXJsOTgvc3dpZ3BlcmwucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ni9weXRob245Ni5odG1sIGIvc3dpZ3dlYi9wYXBlcnMvUHk5Ni9weXRob245Ni5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YmQ5ZTAzLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1B5OTYvcHl0aG9uOTYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi08aHRtbD4KLTx0aXRsZT4KLVVzaW5nIFNXSUcgdG8gQ29udHJvbCwgUHJvdG90eXBlLCBhbmQgRGVidWcgQyBQcm9ncmFtcyB3aXRoIFB5dGhvbgotPC90aXRsZT4KLTxib2R5IEJHQ09MT1I9ImZmZmZmZiI+Ci08aDE+IFVzaW5nIFNXSUcgdG8gQ29udHJvbCwgUHJvdG90eXBlLCBhbmQgRGVidWcgQyBQcm9ncmFtcyB3aXRoIFB5dGhvbiA8L2gxPgotPGI+IAotKFN1Ym1pdHRlZCB0byB0aGUgNHRoIEludGVybmF0aW9uYWwgUHl0aG9uIENvbmZlcmVuY2UpIDxicj4gPGJyPgotRGF2aWQgTS4gQmVhemxleSA8YnI+Ci1EZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBVdGFoIDxicj4KLVNhbHQgTGFrZSBDaXR5LCBVdGFoICA4NDExMiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmNzLnV0YWguZWR1L35iZWF6bGV5Ij4gYmVhemxleUBjcy51dGFoLmVkdSA8L2E+IDxicj4KLTwvYj4KLTxoMj4gQWJzdHJhY3QgPC9oMj4KLTxlbT4KLUkgZGlzY3VzcyBlYXJseSByZXN1bHRzIGluIHVzaW5nIFNXSUcgdG8gaW50ZXJhY3Qgd2l0aCBDIGFuZCBDKysgcHJvZ3JhbXMKLXVzaW5nIFB5dGhvbi4gICAgRXhhbXBsZXMgb2YgdXNpbmcgU1dJRyBhcmUgcHJvdmlkZWQgYWxvbmcgd2l0aCBhCi1kaXNjdXNzaW9uIG9mIHRoZSBiZW5lZml0cyBhbmQgbGltaXRhdGlvbnMgb2YgdGhpcyBhcHByb2FjaC4gIFRoaXMKLXBhcGVyIGRlc2NyaWJlcyB3b3JrIGluIHByb2dyZXNzIHdpdGggdGhlIGhvcGUgb2YgZ2V0dGluZyBmZWVkYmFjayBhbmQKLWlkZWFzIGZyb20gdGhlIFB5dGhvbiBjb21tdW5pdHkuCi08L2VtPiA8YnI+IDxicj4KLQotTm90ZSA6IFNXSUcgaXMgZnJlZWx5IGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmNzLnV0YWguZWR1L35iZWF6bGV5L1NXSUciPiBodHRwOi8vd3d3LmNzLnV0YWguZWR1L35iZWF6bGV5L1NXSUcgPC9hPgotCi08aDI+IEludHJvZHVjdGlvbiA8L2gyPgotCi1TV0lHIChTaW1wbGlmaWVkIFdyYXBwZXIgYW5kIEludGVyZmFjZSBHZW5lcmF0b3IpIGlzIGEgY29kZQotZGV2ZWxvcG1lbnQKLXRvb2wgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBzY2llbnRpc3RzIGFuZCBlbmdpbmVlcnMgdG8gYWRkIHNjcmlwdGluZwotbGFuZ3VhZ2UgaW50ZXJmYWNlcyB0byBwcm9ncmFtcyBhbmQgbGlicmFyaWVzIHdyaXR0ZW4gaW4gQyBhbmQgQysrLgotVGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB3YXMgZGV2ZWxvcGVkIGluIEp1bHkgMTk5NSAKLWZvciB1c2Ugd2l0aAotdmVyeSBsYXJnZSBzY2FsZSBzY2llbnRpZmljIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBDb25uZWN0aW9uIAotTWFjaGluZSA1IGFuZCBDcmF5IFQzRCBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkuIAotU2luY2UgdGhhdCB0aW1lLCB0aGUgc3lzdGVtIGhhcyBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgc2V2ZXJhbAotaW50ZXJmYWNlIGxhbmd1YWdlcyBpbmNsdWRpbmcgUHl0aG9uLCBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIFsxXS4KLQotSW4gdGhpcyBwYXBlciwgSSB3aWxsIGRlc2NyaWJlIGhvdyBTV0lHIGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGgKLUMgYW5kIEMrKyBjb2RlIGZyb20gUHl0aG9uLiAgSSdsbCBhbHNvIGRpc2N1c3Mgc29tZQotYXBwbGljYXRpb25zIGFuZCBsaW1pdGF0aW9ucyBvZiB0aGlzIGFwcHJvYWNoLiAgIEl0IGlzIGltcG9ydGFudCB0bwotZW1waGFzaXplIHRoYXQgU1dJRyB3YXMgcHJpbWFyaWx5IGRlc2lnbmVkIGZvciBzY2llbnRpc3RzIGFuZCBlbmdpbmVlcnMKLXdobyB3b3VsZCBsaWtlIHRvIGhhdmUgYSBuaWNlIGludGVyZmFjZSwgYnV0IHdobyB3b3VsZCByYXRoZXIKLXdvcmsgb24gbW9yZSBpbnRlcmVzdGluZyBwcm9ibGVtcyB0aGFuIGZpZ3VyaW5nIG91dCBob3cgdG8gYnVpbGQKLWEgdXNlciBpbnRlcmZhY2Ugb3IgdXNpbmcgYSBjb21wbGljYXRlZCBpbnRlcmZhY2UgZ2VuZXJhdGlvbiB0b29sLgotCi08aDI+IEludHJvZHVjaW5nIFNXSUcgPC9oMj4KLQotVGhlIGlkZWEgYmVoaW5kIFNXSUcgaXMgcmVhbGx5IHF1aXRlIHNpbXBsZS0tLW1vc3QgaW50ZXJmYWNlCi1sYW5ndWFnZXMgc3VjaCBhcyBQeXRob24gcHJvdmlkZSBzb21lIG1lY2hhbmlzbSBmb3IgbWFraW5nCi1jYWxscyB0byBmdW5jdGlvbnMgd3JpdHRlbiBpbiBDIG9yIEMrKy4gIEhvd2V2ZXIsIHRoaXMgYWxtb3N0Ci1hbHdheXMgcmVxdWlyZXMgdGhlIHVzZXIgdG8gd3JpdGUgc3BlY2lhbCAid3JhcHBlciIgZnVuY3Rpb25zCi10aGF0IHByb3ZpZGUgdGhlIGdsdWUgYmV0d2VlbiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGFuZCB0aGUKLUMgZnVuY3Rpb25zLiAgICBBcyBhbiBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFkZCB0aGUKLTx0dD4gZ2V0ZW52KCkgPC90dD4gZnVuY3Rpb24gdG8gUHl0aG9uLCB5b3Ugd291bGQgbmVlZCB0byB3cml0ZQotdGhlIGZvbGxvd2luZyB3cmFwcGVyIGNvZGUgWzRdIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotc3RhdGljIFB5T2JqZWN0ICp3cmFwX2dldGVudihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgIGNoYXIgKiByZXN1bHQ7Ci0gICAgICAgICBjaGFyICogYXJnMDsKLSAgICAgICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwmYXJnMCkpCi0gICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgcmVzdWx0ID0gZ2V0ZW52KGFyZzApOwotICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCByZXN1bHQpOwotfQotCi08L3ByZT4gPC90dD4KLTwvYmxvY2txdW90ZT4KLVdoaWxlIHdyaXRpbmcgYSBzaW5nbGUgd3JhcHBlciBmdW5jdGlvbiBpc24ndCB0b28gZGlmZmljdWx0LAotaXQgcXVpY2tseSBiZWNvbWVzIHRlZGlvdXMgYW5kIGVycm9yIHByb25lIGFzIHRoZSBudW1iZXIKLW9mIGZ1bmN0aW9ucyBpbmNyZWFzZXMuCi1TV0lHIGF1dG9tYXRlcyB0aGlzIHByb2Nlc3MgYnkgZ2VuZXJhdGluZwotd3JhcHBlciBjb2RlIGZyb20gYSBsaXN0IEFOU0kgQyBmdW5jdGlvbiBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgotQXMgYSByZXN1bHQsIGFkZGluZyBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHRvIEMgYXBwbGljYXRpb25zIGNhbiBiZWNvbWUKLWFuIGFsbW9zdCB0cml2aWFsIGV4ZXJjaXNlLiA8YnI+IDxicj4KLQotVGhlIGNvcmUgb2YgdGhlIFNXSUcgY29uc2lzdHMgb2YgYSBZQUNDIHBhcnNlciBhbmQgYSBjb2xsZWN0aW9uCi1vZiBnZW5lcmFsIHB1cnBvc2UgdXRpbGl0eSBmdW5jdGlvbnMuICAgVGhlIG91dHB1dCBvZiB0aGUgcGFyc2VyCi1pcyBzZW50IHRvIHR3byBkaWZmZXJlbnQgbW9kdWxlcy0tYSBsYW5ndWFnZSBtb2R1bGUgZm9yIHdyaXRpbmcKLXdyYXBwZXIgZnVuY3Rpb25zIGFuZCBhIGRvY3VtZW50YXRpb24gbW9kdWxlIGZvciBwcm9kdWNpbmcgYSBzaW1wbGUKLXJlZmVyZW5jZSBndWlkZS4gICBFYWNoIG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzIGFuZCBkb2N1bWVudGF0aW9uIG1ldGhvZHMgCi1pcyBpbXBsZW1lbnRlZCBhcyBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbiB0byB0aGUgc3lzdGVtLgotQ3VycmVudGx5LCBQeXRob24sIFRjbCwgUGVybDQsIFBlcmw1LCBhbmQgR3VpbGUgYXJlIHN1cHBvcnRlZCBhcwotdGFyZ2V0IGxhbmd1YWdlcyB3aGlsZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBwcm9kdWNlZCBpbiBBU0NJSSwgSFRNTCwKLWFuZCBMYVRlWC4gICBEaWZmZXJlbnQgdGFyZ2V0IGxhbmd1YWdlcyBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYSBuZXcKLUMrKyBjbGFzcyB0aGF0IGlzIGxpbmtlZCB3aXRoIGEgZ2VuZXJhbCBwdXJwb3NlIFNXSUcgbGlicmFyeSBmaWxlLgotCi08aDI+IFByZXZpb3VzIHdvcmsgPC9oMj4KLQotTW9zdCBQeXRob24gdXNlcnMgYXJlIHByb2JhYmx5IGF3YXJlIHRoYXQgYXV0b21hdGljIHdyYXBwZXIgZ2VuZXJhdGlvbiBpcyAKLW5vdCBhIG5ldyBpZGVhLiAgIEluIHBhcnRpY3VsYXIsIHBhY2thZ2VzIHN1Y2ggYXMgSUxVIGFyZSBjYXBhYmxlCi1vZiBwcm92aWRpbmcgYmluZGluZ3MgYmV0d2VlbiBDLCBDKyssIGFuZCBQeXRob24gdXNpbmcgc3BlY2lmaWNhdGlvbnMKLWdpdmVuIGluIElETCAoSW50ZXJmYWNlIERlZmluaXRpb24gTGFuZ3VhZ2UpIFszXS4gU1dJRyBpcyBub3QgcmVhbGx5IG1lYW50IHRvIGNvbXBldGUgd2l0aCB0aGlzCi1hcHByb2FjaCwgYnV0IGlzIGRlc2lnbmVkIHRvIGJlIGEgbm8tbm9uc2Vuc2UsIGVhc3kgdG8gdXNlIHRvb2wKLXRoYXQgc2NpZW50aXN0cyBhbmQgZW5naW5lZXJzIGNhbiB1c2UgdG8gYnVpbGQgaW50ZXJlc3RpbmcgaW50ZXJmYWNlcwotd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgZ3J1bmd5IHByb2dyYW1taW5nIGRldGFpbHMgb3IgbGVhcm5pbmcKLWEgY29tcGxpY2F0ZWQgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gbGFuZ3VhZ2UuCi1XaXRoIHRoYXQgc2FpZCwgU1dJRyBpcyBjZXJ0YWlubHkgbm90IGRlc2lnbmVkIHRvIHR1cm4gUHl0aG9uIGludG8KLWEgQyBvciBDKysgY2xvbmUgKEknbSBub3Qgc3VyZSB0aGF0IHR1cm5pbmcgUHl0aG9uIGludG8gaW50ZXJwcmV0ZWQKLUMvQysrIGNvbXBpbGVyIHdvdWxkIGJlIGEgZ29vZCBpZGVhIGFueXdheXMpLiAgSG93ZXZlciwgU1dJRyBjYW4gYWxsb3cKLVB5dGhvbiB0byBpbnRlcmZhY2Ugd2l0aCBhIHN1cnByaXNpbmdseSB3aWRlIHZhcmlldHkgb2YgQyBmdW5jdGlvbnMuCi0KLTwvYm9keT4KLTwvaHRtbD4KLQotPGgyPiBBIFNXSUcgZXhhbXBsZSA8L2gyPgotCi1XaGlsZSBpdCBpcyBub3QgbXkgaW50ZW50IHRvIHByb3ZpZGUgYSB0dXRvcmlhbCwgSSBob3BlIHRvCi1pbGx1c3RyYXRlIGhvdyBTV0lHIHdvcmtzIGJ5IGJ1aWxkaW5nIGEgbW9kdWxlIGZyb20gcGFydCBvZiB0aGUKLVVOSVggc29ja2V0IGxpYnJhcnkuCi1XaGlsZSB0aGVyZSBpcyBwcm9iYWJseSBubyBuZWVkIHRvIGRvIHRoaXMgaW4gcHJhY3RpY2UgKHNpbmNlIFB5dGhvbgotYWxyZWFkeSBoYXMgYSBzb2NrZXQgbW9kdWxlKSwgaXQgaWxsdXN0cmF0ZXMgbW9zdCBvZiBTV0lHJ3MgY2FwYWJpbGl0aWVzCi1vbiBhIG1vZGVyYXRlbHkgY29tcGxleCBleGFtcGxlIGFuZCBwcm92aWRlcyBhIGJhc2lzIGZvciAKLWNvbXBhcmlzb24gYmV0d2VlbiBhbiBleGlzdGluZyBtb2R1bGUgYW5kIG9uZSBjcmVhdGVkIGJ5IFNXSUcuIDxicj4gPGJyPgotCi1BcyBpbnB1dCwgU1dJRyB0YWtlcyBhbiBpbnB1dCBmaWxlIHJlZmVycmVkIHRvIGFzIGFuICJpbnRlcmZhY2UgZmlsZS4iCi1UaGUgZmlsZSBzdGFydHMgd2l0aCBhIHByZWFtYmxlIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlCi1tb2R1bGUgYW5kIGEgY29kZSBibG9jayB3aGVyZSBzcGVjaWFsIGhlYWRlciBmaWxlcywgYWRkaXRpb25hbCBDCi1jb2RlLCBhbmQgb3RoZXIgdGhpbmdzIGNhbiBiZSBhZGRlZC4gIEFmdGVyIHRoYXQsIEFOU0kgQyBmdW5jdGlvbgotYW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhcmUgbGlzdGVkIGluIGFueSBvcmRlci4gICBTaW5jZSBTV0lHCi11c2VzIEMgc3ludGF4LCBpdCdzIHVzdWFsbHkgZmFpcmx5IGVhc3kgdG8gYnVpbGQgYW4gaW50ZXJmYWNlIAotZnJvbSBzY3JhdGNoIG9yIHNpbXBseSBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGhlYWRlciBmaWxlLgotVGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIHdpbGwgYmUgdXNlZCBmb3Igb3VyIHNvY2tldCBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotLy8gc29ja2V0LmkKLS8vIFNXSUcgSW50ZXJmYWNlIGZpbGUgdG8gcGxheSB3aXRoIHNvbWUgc29ja2V0cwotJWluaXQgc29jayAgICAgICAgICAvLyBOYW1lIG9mIG91ciBtb2R1bGUKLSV7Ci0jaW5jbHVkZSAmbHQ7c3lzL3R5cGVzLmgmZ3QKLSNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3QKLSNpbmNsdWRlICZsdDtuZXRpbmV0L2luLmgmZ3QKLSNpbmNsdWRlICZsdDthcnBhL2luZXQuaCZndAotI2luY2x1ZGUgJmx0O25ldGRiLmgmZ3QKLQotLyogU2V0IHNvbWUgdmFsdWVzIGluIHRoZSBzb2NrYWRkcl9pbiBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBzb2NrYWRkciAqbmV3X3NvY2thZGRyX2luKHNob3J0IGZhbWlseSwgdW5zaWduZWQgbG9uZyBob3N0aWQsIGludCBwb3J0KSB7Ci0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKLSAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKLSAgICAgICAgYnplcm8oKGNoYXIgKikgYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotICAgICAgICBhZGRyLSZndDtzaW5fZmFtaWx5ID0gZmFtaWx5OwotICAgICAgICBhZGRyLSZndDtzaW5fYWRkci5zX2FkZHIgPSBob3N0aWQ7Ci0gICAgICAgIGFkZHItJmd0O3Npbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgICAgIHJldHVybiAoc3RydWN0IHNvY2thZGRyICopIGFkZHI7Ci19Ci0vKiBHZXQgaG9zdCBhZGRyZXNzLCBidXQgcmV0dXJuIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgaG9zdGVudCAqLwotY2hhciAqbXlfZ2V0aG9zdGJ5bmFtZShjaGFyICpob3N0bmFtZSkgewotICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaDsKLSAgICAgICAgaCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOwotICAgICAgICBpZiAoaCkgcmV0dXJuIGgtJmd0O2hfbmFtZTsKLSAgICAgICAgZWxzZSByZXR1cm4gIiI7Ci19Ci0lfQotCi0vLyBBZGQgdGhlc2UgY29uc3RhbnRzCi1lbnVtIHtBRl9VTklYLCBBRl9JTkVULCBTT0NLX1NUUkVBTSwgU09DS19ER1JBTSwgU09DS19SQVcsCi0gICAgICBJUFBST1RPX1VEUCwgSVBQUk9UT19UQ1AsIElOQUREUl9BTll9OwotCi0jZGVmaW5lICBTSVpFT0ZfU09DS0FERFIgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpCi0KLS8vIFdyYXAgdGhlc2UgZnVuY3Rpb25zIAotaW50IHNvY2tldChpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTsKLWludCBiaW5kKGludCBzb2NrZmQsIHN0cnVjdCBzb2NrYWRkciAqbXlhZGRyLCBpbnQgYWRkcmxlbik7Ci1pbnQgY29ubmVjdChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKnNlcnZhZGRyLCBpbnQgYWRkcmxlbik7Ci1pbnQgbGlzdGVuKGludCBzb2NrZmQsIGludCBiYWNrbG9nKTsKLWludCBhY2NlcHQoaW50IHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICpwZWVyLCAldmFsIGludCAqYWRkcmxlbik7Ci1pbnQgY2xvc2UoaW50IGZkKTsKLXN0cnVjdCBzb2NrYWRkciAqbmV3X3NvY2thZGRyX2luKHNob3J0IGZhbWlseSwgdW5zaWduZWQgbG9uZywgaW50IHBvcnQpOwotJW5hbWUgZ2V0aG9zdGJ5bmFtZSB7IGNoYXIgKm15X2dldGhvc3RieW5hbWUoY2hhciAqKTsgfQotdW5zaWduZWQgbG9uZyBpbmV0X2FkZHIoY29uc3QgY2hhciAqaXApOwotCi0laW5jbHVkZSB1bml4aW8uaQotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1UaGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgdG8gbm90aWNlIGFib3V0IHRoaXMgZmlsZQotCi08dWw+Ci08bGk+IFRoZSBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgPHR0PiAlaW5pdCA8L3R0PiBkaXJlY3RpdmUuCi08bGk+IEhlYWRlciBmaWxlcyBhbmQgc3VwcG9ydGluZyBDIGNvZGUgaXMgcGxhY2VkIGluIDx0dD4gJXssJX0gPC90dD4uCi08bGk+IFNwZWNpYWwgc3VwcG9ydCBmdW5jdGlvbnMgbWF5IGJlIG5lY2Vzc2FyeS4gRm9yIGV4YW1wbGUsIDx0dD4KLW5ld19zb2NrYWRkcl9pbigpIDwvdHQ+IGNyZWF0ZXMgYSBuZXcgPHR0PiBzdHJ1Y3Qgc29ja2FkZHJfaW4gPC90dD4gdHlwZQotYW5kIHNldHMgc29tZSBvZiBpdHMgdmFsdWVzLgotPGxpPiBDb25zdGFudHMgYXJlIGNyZWF0ZWQgd2l0aCA8dHQ+IGVudW0gPC90dD4gb3IgPHR0PiAjZGVmaW5lLiA8L3R0PgotPGxpPiBGdW5jdGlvbnMgY2FuIHRha2UgbW9zdCBDIGJhc2ljIGRhdGF0eXBlcyBhcyB3ZWxsIGFzIHBvaW50ZXJzCi10byBjb21wbGV4IHR5cGVzLgotPGxpPiBGdW5jdGlvbnMgY2FuIGJlIHJlbmFtZWQgd2l0aCB0aGUgPHR0PiAlbmFtZSA8L3R0PiBkaXJlY3RpdmUuCi08bGk+IFRoZSA8dHQ+ICV2YWwgPC90dD4gZGlyZWN0aXZlIGZvcmNlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGJlIGNhbGxlZCBieQotdmFsdWUuCi0KLTxsaT4gVGhlIDx0dD4gJWluY2x1ZGUgPC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgb3RoZXIKLVNXSUcgaW50ZXJmYWNlIGZpbGVzLiAgIEluIHRoaXMgY2FzZSwgdGhlIGZpbGUgPHR0PiB1bml4aW8uaSA8L3R0PgotbWlnaHQgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmcgOgotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci0vLyBGaWxlIDogdW5peGlvLmkgCi0vLyBTb21lIGZpbGUgSS9PIGFuZCBtZW1vcnkgZnVuY3Rpb25zCi0lewotJX0KLWludCByZWFkKGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgbik7Ci1pbnQgd3JpdGUoaW50IGZkLCB2b2lkICpidWZmZXIsIGludCBuKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKLXZvaWQgKm1hbGxvYyhzaXplX3QgbmJ5dGVzKTsKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLTxsaT4gU2luY2UgaW50ZXJmYWNlIGZpbGVzIGNhbiBpbmNsdWRlIG90aGVyIGludGVyZmFjZSBmaWxlcywgaXQgY2FuIGJlIHZlcnkKLWVhc3kgdG8gYnVpbGQgdXAgbGlicmFyaWVzIGFuZCBjb2xsZWN0aW9ucyBvZiB1c2VmdWwgZnVuY3Rpb25zLgotPGxpPiA8dHQ+IHR5cGVkZWYgPC90dD4gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBtYXBwaW5nIGJldHdlZW4gZGF0YXR5cGVzLgotPGxpPiBDIGFuZCBDKysgY29tbWVudHMgYXJlIGFsbG93ZWQgYW5kIGxpa2UgQywgU1dJRyBpZ25vcmVzIHdoaXRlc3BhY2UuCi08L3VsPgotCi1UaGUga2V5IHRoaW5nIHRvIG5vdGljZSBhYm91dCBTV0lHIGludGVyZmFjZSBmaWxlcyBpcyB0aGF0IHRoZXkgc3VwcG9ydAotcmVhbCBDIGZ1bmN0aW9ucywgY29uc3RhbnRzLCBhbmQgZGF0YXR5cGVzIGluY2x1ZGluZyBDIHBvaW50ZXJzLiAgIEFzCi1hIGdlbmVyYWwgcnVsZSB0aGVzZSBmaWxlcyBhcmUgYWxzbyBpbmRlcGVuZGVudCBvZiB0aGUgdGFyZ2V0IHNjcmlwdGluZwotbGFuZ3VhZ2UtLXRoZSBwcmltYXJ5IHJlYXNvbiB3aHkgaXQncyBlYXN5IHRvIHN1cHBvcnQgZGlmZmVyZW50Ci1sYW5ndWFnZXMuCi0KLTxoMj4gQnVpbGRpbmcgYSBQeXRob24gbW9kdWxlIDwvaDI+Ci0KLUJ1aWxkaW5nIGEgUHl0aG9uIG1vZHVsZSB3aXRoIFNXSUcgaXMgYSBzaW1wbGUgcHJvY2VzcyB0aGF0IHByb2NlZWRzIGFzCi1mb2xsb3dzIChhc3N1bWluZyB5b3UncmUgcnVubmluZyBTb2xhcmlzIDIueCkgOgotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci11bml4ID4gd3JhcCAtcHl0aG9uIHNvY2tldC5pCi11bml4ID4gZ2NjIC1jIHNvY2tldF93cmFwLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvUHkKLXVuaXggPiBsZCAtRyBzb2NrZXRfd3JhcC5vIC1sc29ja2V0IC1sbnNsIC1vIHNvY2ttb2R1bGUuc28KLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotVGhlIDx0dD4gd3JhcCA8L3R0PiBjb21tYW5kIHRha2VzIHRoZSBpbnRlcmZhY2UgZmlsZSBhbmQgcHJvZHVjZXMgYSBDIGZpbGUKLWNhbGxlZCA8dHQ+IHNvY2tldF93cmFwLmMgPC90dD4uICAgVGhpcyBmaWxlIGlzIHRoZW4gY29tcGlsZWQgYW5kIGJ1aWx0IGludG8KLWEgc2hhcmVkIG9iamVjdCBmaWxlLiAKLQotPGgyPiBBIHNhbXBsZSBQeXRob24gc2NyaXB0IDwvaDI+Ci0KLU91ciBuZXcgc29ja2V0IG1vZHVsZSBjYW4gYmUgdXNlZCBub3JtYWxseSB3aXRoaW4gYSBQeXRob24gc2NyaXB0LiAKLUZvciBleGFtcGxlLCB3ZSBjb3VsZCB3cml0ZSBhIHNpbXBsZSBzZXJ2ZXIgcHJvY2VzcyB0byBlY2hvIGFsbAotZGF0YSByZWNlaXZlZCBiYWNrIHRvIGEgY2xpZW50IDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotIyBFY2hvIHNlcnZlciBwcm9ncmFtIHVzaW5nIFNXSUcgbW9kdWxlCi1mcm9tIHNvY2sgaW1wb3J0ICoKLVBPUlQgPSA1MDAwCi1zb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApCi1pZiBzb2NrZmQgPCAwOgotICAgICAgICByYWlzZSBJT0Vycm9yLCAnc2VydmVyIDogdW5hYmxlIHRvIG9wZW4gc3RyZWFtIHNvY2tldCcKLWFkZHIgPSBuZXdfc29ja2FkZHJfaW4oQUZfSU5FVCxJTkFERFJfQU5ZLFBPUlQpCi1pZiAoYmluZChzb2NrZmQsIGFkZHIsIFNJWkVPRl9TT0NLQUREUikpIDwgMCA6Ci0gICAgICAgIHJhaXNlIElPRXJyb3IsICdzZXJ2ZXIgOiB1bmFibGUgdG8gYmluZCBsb2NhbCBhZGRyZXNzJwotbGlzdGVuKHNvY2tmZCw1KQotY2xpZW50X2FkZHIgPSBuZXdfc29ja2FkZHJfaW4oQUZfSU5FVCwgMCwgMCkKLW5ld3NvY2tmZCA9IGFjY2VwdChzb2NrZmQsIGNsaWVudF9hZGRyLCBTSVpFT0ZfU09DS0FERFIpCi1idWZmZXIgPSBtYWxsb2MoMTAyNCkKLXdoaWxlIDE6Ci0gICAgICAgIG5ieXRlcyA9IHJlYWQobmV3c29ja2ZkLCBidWZmZXIsIDEwMjQpCi0gICAgICAgIGlmIG5ieXRlcyA+IDAgOgotICAgICAgICAgICAgICAgIHdyaXRlKG5ld3NvY2tmZCxidWZmZXIsbmJ5dGVzKQotICAgICAgICBlbHNlIDogYnJlYWsKLWNsb3NlKG5ld3NvY2tmZCkKLWNsb3NlKHNvY2tmZCkKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotSW4gb3VyIFB5dGhvbiBtb2R1bGUsIHdlIGFyZSBtYW5pcHVsYXRpbmcgYSBzb2NrZXQsIGluIGFsbW9zdAotZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgd291bGQgYmUgZG9uZSBpbiBhIEMgcHJvZ3JhbS4gIFdlJ2xsIHRha2UKLWEgbG9vayBhdCBhIGNsaWVudCB3cml0dGVuIHVzaW5nIHRoZSBQeXRob24gc29ja2V0IGxpYnJhcnkgc2hvcnRseS4KLQotPGgyPiBQb2ludGVycyBhbmQgcnVuLXRpbWUgdHlwZSBjaGVja2luZyA8L2gyPgotCi1TV0lHIGltcG9ydHMgQyBwb2ludGVycyBhcyBBU0NJSSBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB0aGUKLWFkZHJlc3MgYW5kIHBvaW50ZXIgdHlwZS4gIFRodXMsIGEgdHlwaWNhbCBTV0lHIHBvaW50ZXIgbWlnaHQgbG9vawotbGlrZSB0aGUgZm9sbG93aW5nIDogPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08dHQ+IF9mZDJhMF9zdHJ1Y3Rfc29ja2FkZHJfcCA8L3R0PiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi1Tb21lIG1heSB2aWV3IHRoZSBpZGVhIG9mIGltcG9ydGluZyBDIHBvaW50ZXJzIGludG8gUHl0aG9uIGFzIHVuc2FmZSBvciBldmVuCi10cnVseSBpbnNhbmUuICBIb3dldmVyLCBoYW5kbGluZyBwb2ludGVycyBzZWVtcyB0byBiZSBuZWVkZWQgaW4gb3JkZXIKLWZvciBTV0lHIHRvIGhhbmRsZSBtb3N0IGludGVyZXN0aW5nIHR5cGVzIG9mIEMgY29kZS4gICBUbyBwcm92aWRlIHNvbWUgc2FmZXR5LAotdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGdlbmVyYXRlZCBieSBTV0lHIHBlcmZvcm0gcG9pbnRlci10eXBlIGNoZWNraW5nCi0oc2luY2UgaW1wb3J0aW5nIEMgcG9pbnRlcnMgaW50byAKLVB5dGhvbiBoYXMgaW4gZWZmZWN0LCBieXBhc3NlZCB0eXBlLWNoZWNraW5nIGluIHRoZSBDIGNvbXBpbGVyKS4KLVdoZW4gaW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgYXJlIHVzZWQsIHRoaXMgaXMgd2hhdCBoYXBwZW5zIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotdW5peCA+IHB5dGhvbgotUHl0aG9uIDEuMyAoQXByIDEyIDE5OTYpICBbR0NDIDIuNS44XQotQ29weXJpZ2h0IDE5OTEtMTk5NSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sIEFtc3RlcmRhbQotPj4+IGZyb20gc29jayBpbXBvcnQgKgotPj4+IHNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwwKTsKLT4+PiBidWZmZXIgPSBtYWxsb2MoODE5Mik7Ci0+Pj4gYmluZChzb2NrZmQsYnVmZmVyLFNJWkVPRl9TT0NLQUREUik7Ci1UcmFjZWJhY2sgKGlubmVybW9zdCBsYXN0KToKLSAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotVHlwZUVycm9yOiBUeXBlIGVycm9yIGluIGFyZ3VtZW50IDIgb2YgYmluZC4gRXhwZWN0ZWQgX3N0cnVjdF9zb2NrYWRkcl9wLgotPj4+IAotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi0KLVNXSUcncyBydW4tdGltZSB0eXBlIGNoZWNraW5nIHByb3ZpZGVzIGEgY2VydGFpbiBkZWdyZWUgb2Ygc2FmZXR5IGZyb20KLXVzaW5nIGludmFsaWQgcGFyYW1ldGVycyBhbmQgbWFraW5nIHNpbXBsZSBtaXN0YWtlcy4gIE9mIGNvdXJzZSwgYW55IHN5c3RlbSAKLXN1cHBvcnRpbmcgcG9pbnRlcnMgY2FuIGJlIGFidXNlZCwgYnV0IFNXSUcncyBpbXBsZW1lbnRhdGlvbiBoYXMgcHJvdmVuCi10byBiZSBxdWl0ZSByZWxpYWJsZSB1bmRlciBub3JtYWwgdXNlLiAgCi0KLTxoMj4gQ29tcGFyaXNvbiB3aXRoIGEgcmVhbCBQeXRob24gbW9kdWxlIDwvaDI+Ci0KLUFzIGEgcG9pbnQgb2YgY29tcGFyaXNvbiwgd2UgY2FuIG5vdyB3cml0ZSBhIGNsaWVudCBzY3JpcHQgdXNpbmcgdGhlCi1QeXRob24gc29ja2V0IG1vZHVsZSAodGhpcyBleGFtcGxlIGNvdXJ0ZXN5IG9mIHRoZSBQeXRob24gbGlicmFyeQotcmVmZXJlbmNlIG1hbnVhbCkgWzVdLiAKLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotIyBFY2hvIGNsaWVudCBwcm9ncmFtCi1mcm9tIHNvY2tldCBpbXBvcnQgKgotSE9TVCA9ICd0amF6ZS5sYW5sLmdvdicKLVBPUlQgPSA1MDAwCi1zID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNKQotcy5jb25uZWN0KEhPU1QsUE9SVCkKLXMuc2VuZCgnSGVsbG8gd29ybGQnKQotZGF0YSA9IHMucmVjdigxMDI0KQotcy5jbG9zZSgpCi1wcmludCAnUmVjZWl2ZWQnLCBgZGF0YWAKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotQXMgb25lIG1pZ2h0IGV4cGVjdCwgdGhlIHR3byBzY3JpcHRzIGxvb2sgZmFpcmx5IHNpbWlsYXIuIEhvd2V2ZXIKLXRoZXJlIGFyZSBjZXJ0YWluIG9idmlvdXMgZGlmZmVyZW5jZXMuICBGaXJzdCwgdGhlIFNXSUcgZ2VuZXJhdGVkCi1tb2R1bGUgaXMgY2xlYXJseSBhIHF1aWNrIGFuZCBkaXJ0eSBhcHByb2FjaC4gICBXZSBtdXN0IGV4cGxpY2l0bHkKLWNoZWNrIGZvciBlcnJvcnMgYW5kIGNyZWF0ZSBhIGZldyBDIGRhdGEgc3RydWN0dXJlcy4gIEZ1cnRoZXJtb3JlLAotd2hpbGUgUHl0aG9uIGZ1bmN0aW9ucyBzdWNoIGFzIDx0dD4gc29ja2V0KCkgPC90dD4gY2FuIHRha2Ugb3B0aW9uYWwKLWFyZ3VtZW50cywgU1dJRyBnZW5lcmF0ZWQgZnVuY3Rpb25zIGNhbiBub3QgKHNpbmNlIHRoZSB1bmRlcmx5aW5nCi1DIGZ1bmN0aW9uIGNhbid0KS4gICBPZiBjb3Vyc2UsIHRoZSBhcHBhcmVudCB1Z2xpbmVzcyAKLW9mIHRoZSBTV0lHIG1vZHVsZSBjb21wYXJlZCB0byB0aGUgUHl0aG9uIGVxdWl2YWxlbnQgaXMgbm90IHRoZQotcG9pbnQgaGVyZS4KLVRoZSByZWFsIGlkZWEgdG8gZW1waGFzaXplIGlzIHRoYXQgU1dJRwotY2FuIHRha2UgYSBzZXQgb2YgcmVhbCBDIGZ1bmN0aW9ucyB3aXRoIG1vZGVyYXRlIGNvbXBsZXhpdHkgYW5kIAotcHJvZHVjZSBhIGZ1bGx5IGZ1bmN0aW9uYWwgUHl0aG9uIG1vZHVsZSBpbiBhIHZlcnkgc2hvcnQgcGVyaW9kIG9mCi10aW1lLiAgSW4gdGhpcyBjYXNlLCBhYm91dCAxMCBtaW51dGVzIHdvcnRoIG9mIGVmZm9ydC4gIAotKEknbQotZ3Vlc3NpbmcgdGhhdCB0aGUgUHl0aG9uIHNvY2tldCBtb2R1bGUgcmVxdWlyZWQgbW9yZSB0aW1lIHRoYW4gdGhhdCkuCi1XaXRoIGEgYml0IG9mIHdvcmssIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUgY291bGQgcHJvYmFibHkgYmUKLXVzZWQgdG8gYnVpbGQgYSBtb3JlIHVzZXItZnJpZW5kbHkgdmVyc2lvbiB0aGF0IGhpZCBtYW55IG9mIHRoZSBkZXRhaWxzLgotCi08aDI+IENvbnRyb2xsaW5nIEMgcHJvZ3JhbXMgPC9oMj4KLQotT2YgY291cnNlLCB0aGUgcmVhbCBnb2FsIG9mIFNXSUcgaXMgbm90IHRvIHByb2R1Y2UgcXVpcmt5Ci1yZXBsYWNlbWVudHMgZm9yIG1vZHVsZXMgaW4gdGhlIFB5dGhvbiBsaWJyYXJ5LiAgIEluc3RlYWQsIGl0Ci1iZXR0ZXIgc3VpdGVkIGFzIGEgbWVjaGFuaXNtIGZvcgotY29udHJvbGxpbmcgYSB2YXJpZXR5IG9mIEMgcHJvZ3JhbXMuIDxicj4gPGJyPgotCi1JbiB0aGUgU1BhU00gbW9sZWN1bGFyIGR5bmFtaWNzIGNvZGUgdXNlZCBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsCi1MYWJvcmF0b3J5LCBTV0lHCi1pcyB1c2VkIHRvIGJ1aWxkIGFuIGludGVyZmFjZSBvdXQgb2YgYWJvdXQgMjAwIEMgZnVuY3Rpb25zIFsyXS4KLVRoaXMgaGFwcGVucyBhdCBjb21waWxlIHRpbWUgc28gbW9zdCB1c2VycyBkb24ndAotbm90aWNlIHRoYXQgaXQgaGFzIG9jY3VycmVkLiAgIEhvd2V2ZXIsIGFzIGEgcmVzdWx0LCBpdCBpcyBub3cKLWV4dHJlbWVseSBlYXN5IGZvciB0aGUgcGh5c2ljaXN0cyB1c2luZyB0aGUgY29kZSB0byAKLWV4dGVuZCBpdCB3aXRoIG5ldyBmdW5jdGlvbnMuIAotV2hlbmV2ZXIgbmV3IGZ1bmN0aW9uYWxpdHkgaXMgYWRkZWQsIHRoZSBuZXcKLWZ1bmN0aW9ucyBhcmUgcHV0IGludG8gYSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCB0aGUgZnVuY3Rpb25zCi1iZWNvbWUgYXZhaWxhYmxlIHdoZW4gdGhlIGNvZGUgaXMgcmVjb21waWxlZCAoYSBwcm9jZXNzCi13aGljaCB1c3VhbGx5IG9ubHkgaW52b2x2ZXMgdGhlIG5ldyBDIGZ1bmN0aW9ucyBhbmQgU1dJRyBnZW5lcmF0ZWQKLXdyYXBwZXIgZmlsZSkuICAgT2YgY291cnNlLCB3aGVuIHJ1bm5pbmcgdW5kZXIgUHl0aG9uLCBpdCBpcyBwb3NzaWJsZQotdG8gYnVpbGQgZXh0ZW5zaW9ucyBhbmQgZHluYW1pY2FsbHkgbG9hZCB0aGVtIGFzIG5lZWRlZC4gIDxicj4gPGJyPgotCi1Bbm90aGVyIHBvaW50LCBub3QgdG8gYmUgb3Zlcmxvb2tlZCwgaXMgdGhlIGZhY3QgdGhhdCBTV0lHIG1ha2VzIGl0Ci12ZXJ5IGVhc3kgZm9yIGEgdXNlciB0byBjb21iaW5lIGJpdHMgYW5kIHBpZWNlcyBvZiBjb21wbGV0ZWx5IGRpZmZlcmVudAotc29mdHdhcmUgcGFja2FnZXMgd2l0aG91dCB3YWl0aW5nIGZvciBzb21lb25lIHRvIHdyaXRlIGEgc3BlY2lhbAotcHVycG9zZSBtb2R1bGUuICAgRm9yIGV4YW1wbGUsIFNXSUcgY2FuIGJlIHVzZWQgdG8gaW1wb3J0IHRoZSBDIEFQSQotb2YgTWF0bGFiIDQuMiBpbnRvIFB5dGhvbi4gICAgVGhpcyBjb21iaW5lZCB3aXRoIGEgc2ltdWxhdGlvbiBtb2R1bGUKLWNhbiBhbGxvdyBhIHNjaWVudGlzdCB0byBwZXJmb3JtIGJvdGggc2ltdWxhdGlvbiBhbmQgZGF0YSBhbmFseXNpcyBpbgotaW50ZXJhY3RpdmVseSBvciBmcm9tIGEgc2NyaXB0LiAgIE9uZSBjb3VsZCBldmVuIGJ1aWxkIGEgVGtpbnRlciBpbnRlcmZhY2UgdG8gY29udHJvbAotdGhlIGVudGlyZSBzeXN0ZW0uICAgVGhlIGVhc2Ugb2YgdXNpbmcgU1dJRyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IKLXNjaWVudGlzdHMgdG8gYnVpbGQgYXBwbGljYXRpb25zIG91dCBvZiBjb21wb25lbnRzIHRoYXQKLW1pZ2h0IG5vdCBoYXZlIGJlZW4gY29uc2lkZXJlZCBlYXJsaWVyLiAgIAotCi08aDI+IFByb3RvdHlwaW5nIGFuZCBEZWJ1Z2dpbmcgPC9oMj4KLQotV2hlbiBkZWJ1Z2dpbmcgbmV3IG1vZHVsZXMgb3IgbGlicmFyaWVzLCBpdCB3b3VsZCBiZSBuaWNlIHRvIGJlIGFibGUKLXRvIHRlc3Qgb3V0IHRoZSBmdW5jdGlvbnMgd2l0aG91dCBoYXZpbmcgdG8gcmVwZWF0ZWRseSByZWNvbXBpbGUgdGhlCi1tb2R1bGUgd2l0aCB0aGUgcmVzdCBvZiBhIGxhcmdlIGFwcGxpY2F0aW9uLiAgV2l0aCBTV0lHLCBpdCBpcyBvZnRlbgotcG9zc2libGUgdG8gcHJvdG90eXBlIGFuZCBkZWJ1ZyBtb2R1bGVzIGluZGVwZW5kZW50bHkuICAgU1dJRyBjYW4gYmUKLXVzZWQgdG8gYnVpbGQgUHl0aG9uIHdyYXBwZXJzIGFyb3VuZCB0aGUgZnVuY3Rpb25zIGFuZCBzY3JpcHRzCi1jYW4gYmUgdXNlZCBmb3IgdGVzdGluZy4gICBJbiBtYW55IGNhc2VzLCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUKLXRoZSBDIGRhdGEgc3RydWN0dXJlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gdGhhdCB3b3VsZCBoYXZlIGJlZW4gZ2VuZXJhdGVkCi1ieSB0aGUgbGFyZ2VyIGFwcGxpY2F0aW9uIGFsbCBmcm9tIHdpdGhpbiBhIFB5dGhvbiBzY3JpcHQuICBTaW5jZQotU1dJRyByZXF1aXJlcyBubyBjaGFuZ2VzIHRvIHRoZSBDIGNvZGUsIGludGVncmF0aW5nIHRoZSBuZXcgQyBjb2RlIGludG8KLXRoZSBsYXJnZSBwYWNrYWdlIGlzIHVzdWFsbHkgcHJldHR5IGVhc3kuIDxicj4gPGJyPgotCi1BIHJlbGF0ZWQgYmVuZWZpdCBvZiB0aGUgU1dJRyBhcHByb2FjaCBpcyB0aGF0IGl0IGlzIG5vdyBwb3NzaWJsZQotdG8gZWFzaWx5IGV4cGVyaW1lbnQgd2l0aCBsYXJnZSBzb2Z0d2FyZSBsaWJyYXJpZXMgYW5kIHBhY2thZ2VzLgotUGV0ZXItUGlrZSBTbG9hbiBhdCB0aGUKLVVuaXZlcnNpdHkgb2YgVXRhaCwgdXNlZCBTV0lHIHRvIHdyYXAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgT3Blbi1HTAotbGlicmFyeSAoaW5jbHVkaW5nIG1vcmUgdGhhbiA1NjAgY29uc3RhbnRzIGFuZCAzNDAgQyBmdW5jdGlvbnMpLgotVGhpcyBgYGludGVycHJldGVkJycgT3Blbi1HTCBjb3VsZCB0aGVuIGJlIHVzZWQgaW50ZXJhY3RpdmVseSB0bwotZGV0ZXJtaW5lIHZhcmlvdXMgaW1hZ2UgcGFyYW1ldGVycyBhbmQgdG8gZHJhdyBzaW1wbGUgZmlndXJlcy4KLUlzIHRoaXMgY2FzZSwgaXQgcHJvdmVkIHRvIGJlIGEgcmVtYXJrYWJseSBlZmZlY3RpdmUgd2F5IG9mCi1maWd1cmluZyBvdXQgdGhlIGVmZmVjdHMgb2YgZGlmZmVyZW50IHBhcmFtZXRlcnMgYW5kIGZ1bmN0aW9ucyB3aXRob3V0Ci1oYXZpbmcgdG8gcmVjb21waWxlIGFmdGVyIGV2ZXJ5IG1vZGlmaWNhdGlvbi4KLQotPGgyPiBMaXZpbmcgZGFuZ2Vyb3VzbHkgd2l0aCBkYXRhdHlwZXMgPC9oMj4KLQotT25lIG9mIHRoZSByZWFzb25zIFNXSUcgaXMgZWFzeSB0byB1c2UgZm9yIHByb3RvdHlwaW5nIGFuZCBjb250cm9sCi1hcHBsaWNhdGlvbnMgaXMgaXRzIGV4dHJlbWVseSBmb3JnaXZpbmcgdHJlYXRtZW50IG9mIGRhdGF0eXBlcy4KLTx0dD4gdHlwZWRlZiA8L3R0PiBjYW4gYmUgdXNlZCB0byBtYXAgZGF0YXR5cGVzLCBidXQgd2hlbmV2ZXIKLVNXSUcgZW5jb3VudGVycyBhbiB1bmtub3duIGRhdGF0eXBlLCBpdCBzaW1wbHkgYXNzdW1lcyB0aGF0IGl0J3MKLXNvbWUgc29ydCBvZiBjb21wbGV4IGRhdGF0eXBlLiAgQXMgYSByZXN1bHQsIGl0J3MgcG9zc2libGUgdG8KLXdyYXAgc29tZSBmYWlybHkgY29tcGxleCBDIGNvZGUgd2l0aCBhbG1vc3Qgbm8gZWZmb3J0LiAgRm9yIGV4YW1wbGUsIAotb25lIGNvdWxkIGNyZWF0ZSBhIG1vZHVsZSBhbGxvd2luZyBQeXRob24gdG8gY3JlYXRlIGEgVGNsIGludGVycHJldGVyCi1hbmQgZXhlY3V0ZSBUY2wgY29tbWFuZHMgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PgotPHByZT4KLS8vIHRjbC5pCi0vLyBXcmFwIFRjbCdzIEMgaW50ZXJmYWNlCi0laW5pdCB0Y2wKLSV7Ci0jaW5jbHVkZSAmbHQ7dGNsLmgmZ3Q7Ci0lfQotCi1UY2xfSW50ZXJwICpUY2xfQ3JlYXRlSW50ZXJwKHZvaWQpOwotdm9pZCAgICAgICAgVGNsX0RlbGV0ZUludGVycChUY2xfSW50ZXJwICppbnRlcnApOwotaW50ICAgICAgICAgVGNsX0V2YWwoVGNsX0ludGVycCAqaW50ZXJwLCBjaGFyICpzY3JpcHQpOwotaW50ICAgICAgICAgVGNsX0V2YWxGaWxlKFRjbF9JbnRlcnAgKmludGVycCwgY2hhciAqZmlsZSk7Ci08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLVNXSUcgaGFzIG5vIGlkZWEgd2hhdCA8dHQ+IFRjbF9JbnRlcnAgPC90dD4gaXMsIGJ1dCBpdCBkb2Vzbid0Ci1yZWFsbHkgY2FyZSBhcyBsb25nIGFzIGl0J3MgdXNlZCBhcyBhIHBvaW50ZXIuICAgIFdoZW4gdXNlZCBpbiBhCi1QeXRob24gc2NyaXB0LCB0aGlzIG1vZHVsZSB3b3VsZCB3b3JrIGFzIGZvbGxvd3MgOgotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotdW5peCA+IHB5dGhvbgotUHl0aG9uIDEuMyAoTWFyIDI2IDE5OTYpICBbR0NDIDIuNy4wXQotQ29weXJpZ2h0IDE5OTEtMTk5NSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sIEFtc3RlcmRhbQotPj4+IGltcG9ydCB0Y2wKLT4+PiBpbnRlcnAgPSB0Y2wuVGNsX0NyZWF0ZUludGVycCgpOwotPj4+IHRjbC5UY2xfRXZhbChpbnRlcnAsImZvciB7c2V0IGkgMH0geyRpIDwgNX0ge2luY3IgaSAxfSB7cHV0cyAkaX0iKTsKLTAKLTEKLTIKLTMKLTQKLTAKLT4+PgotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi08aDI+IExpbWl0YXRpb25zIDwvaDI+Ci0KLVRoaXMgYXBwcm9hY2ggcmVwcmVzZW50cyBhIGJhbGFuY2Ugb2YgZmxleGliaWxpdHkgYW5kIGVhc2Ugb2YgdXNlLgotSSBoYXZlIGFsd2F5cyBmZWx0IHRoYXQgdGhlIHRvb2wgc2hvdWxkbid0IGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbgotdGhlIG9yaWdpbmFsIHByb2JsZW0uICAgIFRoZXJlZm9yZSwgU1dJRyBjZXJ0YWlubHkgd29uJ3QgZG8gZXZlcnl0aGluZy4KLVNvbWUgb2YgU1dJRydzIGxpbWl0YXRpb25zIGluY2x1ZGUgaXQncyBsaW1pdGVkIHVuZGVyc3RhbmRpbmcgb2YKLWNvbXBsZXggZGF0YXR5cGVzLiAgIE9mdGVuIHRoZSB1c2VyIG11c3Qgd3JpdGUgc3BlY2lhbCBmdW5jdGlvbnMKLXRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBzdHJ1Y3R1cmVzIGV2ZW4gdGhvdWdoIHBhc3NpbmcgY29tcGxleAotZGF0YXR5cGVzIGFyb3VuZCBieSByZWZlcmVuY2Ugd29ya3MgcmVtYXJrYWJseSB3ZWxsIGluIHByYWN0aWNlLgotU1dJRydzIHN1cHBvcnQgZm9yIEMrKyBpcyBhbHNvIHF1aXRlIGxpbWl0ZWQuICAgQXQgdGhlIG1vbWVudCBTV0lHCi1jYW4gYmUgdXNlZCB0byBwYXNzIHBvaW50ZXJzIHRvIEMrKyBvYmplY3RzIGFyb3VuZCwgYnV0IGFjdHVhbGx5Ci10cmFuc2Zvcm1pbmcgYSBDKysgb2JqZWN0IGludG8gc29tZSBzb3J0IG9mIFB5dGhvbiBvYmplY3QgaXMgZmFyCi1iZXlvbmQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4gIEZpbmFsbHksIFNXSUcKLWxhY2tzIGFuIGV4Y2VwdGlvbiBtb2RlbCB3aGljaCBtYXkgYmUgb2YgY29uY2VybiB0byBzb21lIHVzZXJzLgotCi08aDI+IExpbWl0YXRpb25zIGluIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gPC9oMj4KLQotU1dJRydzIHN1cHBvcnQgZm9yIFB5dGhvbiBpcyBpbiBtYW55IHdheXMsIGxpbWl0ZWQgYnkgdGhlIGZhY3QgdGhhdAotU1dJRyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIHVzZSB3aXRoIG90aGVyIGxhbmd1YWdlcy4gIEZvciBleGFtcGxlLAotcmVwcmVzZW50aW5nIEMgcG9pbnRlcnMgYXMgYSBjaGFyYWN0ZXIgc3RyaW5nIGNhbiBiZSBzZWVuIGFzIGEgY2Fycnktb3ZlcgotZnJvbSBhbiBlYXJsaWVyIFRjbCBpbXBsZW1lbnRhdGlvbi4gIFdpdGggYSBsaXR0bGUgd29yaywgSSBiZWxpZXZlIAotdGhhdCBvbmUgY291bGQgY3JlYXRlIGEgUHl0aG9uICJwb2ludGVyIiBkYXRhdHlwZSB3aGlsZSBzdGlsbCByZXRhaW5pbmcKLXR5cGUtY2hlY2tpbmcgYW5kIG90aGVyIGZlYXR1cmVzLiA8YnI+IDxicj4KLQotQW5vdGhlciBsaW1pdGF0aW9uIGluIHRoZSBjdXJyZW50IFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgYXBwYXJlbnQgbGFjawotb2YgdmFyaWFibGUgbGlua2luZyBzdXBwb3J0LiAgTWFueSBhcHBsaWNhdGlvbnMsIHBhcnRpY3VsYXJseSBzY2llbnRpZmljIG9uZXMsCi1oYXZlIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBhIHVzZXIgbWF5IHdhbnQgdG8gYWNjZXNzLiAgIFNXSUcgY3VycmVudGx5Ci1jcmVhdGVzIFB5dGhvbiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGVzZSB2YXJpYWJsZXMsIGJ1dCBvdGhlcgotc2NyaXB0aW5nIGxhbmd1YWdlcyBwcm92aWRlIGEgbW9yZSBuYXR1cmFsIG1lY2hhbmlzbS4gCi1Gb3IgZXhhbXBsZSwgaW4gUGVybCwgaXQgaXMKLXBvc3NpYmxlIHRvIGF0dGFjaCAic2V0IiBhbmQgImdldCIgZnVuY3Rpb25zIHRvIGEgUGVybCBvYmplY3QuICBUaGVzZQotYXJlIGV2YWx1YXRlZCB3aGVuZXZlciB0aGF0IHZhcmlhYmxlIGlzIGFjY2Vzc2VkIGluIGEgc2NyaXB0LiAgCi1Gb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcyB0aGlzIHNwZWNpYWwgdmFyaWFibGUgbG9va3MgbGlrZSBhbnkgb3RoZXIgUGVybAotdmFyaWFibGUsIGJ1dCBpcyByZWFsbHkgbGlua2VkIHRvIGFuIEMgZ2xvYmFsIHZhcmlhYmxlIChvZiBjb3Vyc2UsCi1tYXliZSB0aGVyZSBpcyBhIHJlYXNvbiB3aHkgUGVybCBjYWxscyB0aGVzZSAibWFnaWMiIHZhcmlhYmxlcykuIDxicj4gPGJyPgotCi1JZiBhbiBlcXVpdmFsZW50IHZhcmlhYmxlIGxpbmtpbmcgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSBpbiBQeXRob24sIEkKLWNvdWxkbid0IGZpbmQgaXQgWzRdLgotSWYgbm90LCBpdCBtaWdodCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgYSBuZXcga2luZCBvZiBQeXRob24gZGF0YXR5cGUKLXRoYXQgc3VwcG9ydHMgdmFyaWFibGUgbGlua2luZywgYnV0IHdoaWNoIGludGVyYWN0cyBzZWFtbGVzc2x5Ci13aXRoIGV4aXN0aW5nIFB5dGhvbiBpbnRlZ2VyLCBmbG9hdGluZyBwb2ludCwgYW5kIGNoYXJhY3RlciBzdHJpbmcgdHlwZXMuCi0KLTxoMj4gU3VtbWFyeSBhbmQgZnV0dXJlIHdvcmsgPC9oMj4gCi0KLVRoaXMgcGFwZXIgaGFzIGRlc2NyaWJlZCB3b3JrIGluIHByb2dyZXNzIHdpdGggdGhlIFNXSUcgc3lzdGVtIGFuZAotaXRzIHN1cHBvcnQgZm9yIFB5dGhvbi4gICBJIGJlbGlldmUgdGhhdCB0aGlzIGFwcHJvYWNoIHNob3dzIGdyZWF0Ci1wcm9taXNlIGZvciBmdXR1cmUgd29yay0tZXNwZWNpYWxseSB3aXRoaW4gdGhlIHNjaWVudGlmaWMgYW5kCi1lbmdpbmVlcmluZyBjb21tdW5pdHkuICBNb3N0IG9mIHRoZSBwZW9wbGUgaW50cm9kdWNlZCB0byBTV0lHIGFuZAotUHl0aG9uIGhhdmUKLWZvdW5kIGJvdGggc3lzdGVtcyBleHRyZW1lbHkgZWFzeSBhbmQgc3RyYWlnaHRmb3J3YXJkIHRvIHVzZS4gIAotSSBhbSBjdXJyZW50bHkKLXF1aXRlIGludGVyZXN0ZWQgaW4gaW1wcm92aW5nIFNXSUcncyBpbnRlcmZhY2UgdG8gUHl0aG9uIGFuZCBleHBsb3JpbmcKLWl0cyB1c2Ugd2l0aCBudW1lcmljYWwgUHl0aG9uIGluIG9yZGVyIHRvIGJ1aWxkIGludGVyZXN0aW5nCi1hbmQgZmxleGlibGUgc2NpZW50aWZpYyBhcHBsaWNhdGlvbnMgWzZdLgotCi08aDI+IEFja25vd2xlZGdtZW50cyA8L2gyPgotCi1UaGlzIHByb2plY3Qgd291bGQgbm90IGhhdmUgYmVlbiBwb3NzaWJsZSB3aXRob3V0IHRoZSBzdXBwb3J0IG9mIGEgbnVtYmVyCi1vZiBwZW9wbGUuICAgUGV0ZXIgTG9tZGFobCwgU2h1amlhIFpob3UsIEJyYWQgSG9saWFuLCBUaW0gR2VybWFubiwgYW5kIE5pZWxzCi1KZW5zZW4gYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IHdlcmUgdGhlIGZpcnN0IHVzZXJzIGFuZCB3ZXJlCi1pbnN0cnVtZW50YWwgaW4gdGVzdGluZyBvdXQgdGhlIGZpcnN0IGRlc2lnbnMuICAgUGF0cmljayBUdWxsbWFubiwKLUpvaG4gU2NobWlkdCxQZXRlci1QaWtlIFNsb2FuLCBhbmQgS3VydGlzIEJsZWVrZXIgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBoYXZlIGFsc28KLWJlZW4gaW5zdHJ1bWVudGFsIGluIHRlc3Rpbmcgb3V0IHNvbWUgb2YgdGhlIG5ld2VyIHZlcnNpb25zIGFuZCAKLXByb3ZpZGluZyBmZWVkYmFjay4KLUpvaG4gQnVja21hbiBoYXMgc3VnZ2VzdGVkIG1hbnkgaW50ZXJlc3RpbmcKLWltcHJvdmVtZW50cyBhbmQgaXMgY3VycmVudGx5IHdvcmtpbmcgb24gcG9ydGluZyBTV0lHIHRvIG5vbi1Vbml4Ci1wbGF0Zm9ybXMgaW5jbHVkaW5nIE5ULCBPUy8yIGFuZCBNYWNpbnRvc2guCi1GaW5hbGx5Ci1JJ2QgbGlrZSB0byB0aGFuayBDaHJpcyBKb2huc29uIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgU2NpZW50aWZpYwotQ29tcHV0aW5nIGFuZCBJbWFnaW5nIGdyb3VwIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggZm9yIHRoZWlyIGNvbnRpbnVlZAotc3VwcG9ydC4gIFNvbWUgb2YgdGhpcyB3b3JrIHdhcyBwZXJmb3JtZWQgdW5kZXIgdGhlIGF1c3BpY2VzIG9mIHRoZQotRGVwYXJ0bWVudCBvZiBFbmVyZ3kuCi0KLTxoMj4gUmVmZXJlbmNlcyA8L2gyPgotCi1bMV0gRC5NLiBCZWF6bGV5LiA8ZW0+IFNXSUcgOiBBbiBFYXN5IHRvIFVzZSBUb29sIGZvciBJbnRlZ3JhdGluZwotU2NyaXB0aW5nIExhbmd1YWdlcyB3aXRoIEMgYW5kIEMrKyA8L2VtPi4gIFByb2NlZWRpbmdzIG9mIHRoZSA0dGgKLVVTRU5JWCBUY2wvVGsgV29ya3Nob3AgKDE5OTYpICh0byBhcHBlYXIpLiA8YnI+IDxicj4KLQotWzJdIEQuTS4gQmVhemxleSBhbmQgUC5TLiBMb21kYWhsIDxlbT4gTWVzc2FnZS1QYXNzaW5nIE11bHRpLUNlbGwKLU1vbGVjdWxhciBEeW5hbWljcyBvbiB0aGUgQ29ubmVjdGlvbiBNYWNoaW5lIDUgPC9lbT4sIFBhcmFsbGVsCi1Db21wdXRpbmcgMjAgKDE5OTQpLCBwLiAxNzMtMTk1LiA8YnI+IDxicj4KLQotWzNdIEJpbGwgSmFuc3NlbiBhbmQgTWlrZSBTcHJlaXR6ZXIsIDxlbT4gSUxVIDogSW50ZXItTGFuZ3VhZ2UKLVVuaWZpY2F0aW9uIHZpYSBPYmplY3QgTW9kdWxlczwvZW0+LCBPT1BTTEEgOTQgV29ya3Nob3Agb24KLU11bHRpLUxhbmd1YWdlIE9iamVjdCBNb2RlbHMuCi08YnI+IDxicj4KLQotWzRdIEd1aWRvIHZhbiBSb3NzdW0sIDxlbT4gRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbiBJbnRlcnByZXRlciwKLTwvZW0+IE9jdG9iZXIgMTk5NS4gPGJyPiA8YnI+Ci0KLVs1XSBHdWlkbyB2YW4gUm9zc3VtLCA8ZW0+IFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSA8L2VtPiwgT2N0b2JlcgotMTk5NS4gPGJyPiA8YnI+Ci0KLVs2XSBQYXVsIEYuIER1Ym9pcywgS29ucmFkIEhpbnNlbiwgYW5kIEphbWVzIEh1Z3VuaW4sIDxlbT4gTnVtZXJpY2FsCi1QeXRob24sIDwvZW0+IENvbXB1dGVycyBpbiBQaHlzaWNzLCAoMTk5NikgKHRvIGFwcGVhcikKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ny8ufmJlYXpsZXkuaHRtbCBiL3N3aWd3ZWIvcGFwZXJzL1B5OTcvLn5iZWF6bGV5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4MWMxYmEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ny8ufmJlYXpsZXkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi08aHRtbD4KLTx0aXRsZT4gRmVlZGluZyBhIExhcmdlLXNjYWxlIFBoeXNpY3MgQXBwbGljYXRpb24gdG8gUHl0aG9uIDwvdGl0bGU+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLQotPGgxPiBGZWVkaW5nIGEgTGFyZ2Utc2NhbGUgUGh5c2ljcyBBcHBsaWNhdGlvbiB0byBQeXRob24gPC9oMT4KLQotRGF2aWQgTS4gQmVhemxleSA8YnI+Ci1EZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBVdGFoIDxicj4KLVNhbHQgTGFrZSBDaXR5LCBVdGFoICA4NDExMiA8YnI+Ci08dHQ+IGJlYXpsZXlAY3MudXRhaC5lZHUgPC90dD4gPGJyPgotPHA+Ci1QZXRlciBTLiBMb21kYWhsIDxicj4KLVRoZW9yZXRpY2FsIERpdmlzaW9uIDxicj4KLUxvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSA8YnI+Ci1Mb3MgQWxhbW9zLCBOZXcgTWV4aWNvICAgODc1NDUgPGJyPgotPHR0PiBweGxAbGFubC5nb3YgPC90dD4gPGJyPgotCi0KLQotPGgyPiBBYnN0cmFjdCA8L2gyPgotCi08ZW0+Ci1XZSBkZXNjcmliZSBvdXIgZXhwZXJpZW5jZXMgdXNpbmcgUHl0aG9uIHdpdGggdGhlIFNQYVNNIG1vbGVjdWxhcgotZHluYW1pY3MgY29kZSBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkuICBPcmlnaW5hbGx5IGRldmVsb3BlZAotYXMgYSBsYXJnZSBtb25vbGl0aGljIGFwcGxpY2F0aW9uIGZvciBtYXNzaXZlbHkgcGFyYWxsZWwgcHJvY2Vzc2luZwotc3lzdGVtcywgd2UgaGF2ZSB1c2VkIFB5dGhvbiB0byB0cmFuc2Zvcm0gb3VyIGFwcGxpY2F0aW9uIGludG8gYQotZmxleGlibGUsIGhpZ2hseSBtb2R1bGFyLCBhbmQgZXh0cmVtZWx5IHBvd2VyZnVsIHN5c3RlbSBmb3IgcGVyZm9ybWluZwotc2ltdWxhdGlvbiwgZGF0YSBhbmFseXNpcywgYW5kIHZpc3VhbGl6YXRpb24uICBJbiBhZGRpdGlvbiwgd2UKLWRlc2NyaWJlIGhvdyBQeXRob24gaGFzIHNvbHZlZCBhIG51bWJlciBvZiBpbXBvcnRhbnQgcHJvYmxlbXMgcmVsYXRlZAotdG8gdGhlIGRldmVsb3BtZW50LCBkZWJ1Z2dpbmcsIGRlcGxveW1lbnQsIGFuZCBtYWludGVuYW5jZSBvZgotc2NpZW50aWZpYyBzb2Z0d2FyZS4gPC9lbT4KLQotPGgyPiBCYWNrZ3JvdW5kIDwvaDI+Ci0KLUZvciB0aGUgcGFzdCA1IHllYXJzLCB3ZSBoYXZlIGJlZW4gZGV2ZWxvcGluZyBhIGxhcmdlLXNjYWxlIHBoeXNpY3MKLWNvZGUgZm9yIHBlcmZvcm1pbmcgbW9sZWN1bGFyLWR5bmFtaWNzIHNpbXVsYXRpb25zIG9mCi1tYXRlcmlhbHMuICBUaGlzIGNvZGUsIFNQYVNNIChTY2FsYWJsZSBQYXJhbGxlbCBTaG9ydC1yYW5nZQotTW9sZWN1bGFyLWR5bmFtaWNzKSwgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZvciB0aGUgQ29ubmVjdGlvbgotTWFjaGluZSA1IG1hc3NpdmVseSBwYXJhbGxlbCBzdXBlcmNvbXB1dGluZyBzeXN0ZW0gYW5kIGxhdGVyIG1vdmVkIHRvCi1hIG51bWJlciBvZiBvdGhlciBtYWNoaW5lcyBpbmNsdWRpbmcgdGhlIENyYXkgVDNELCBtdWx0aXByb2Nlc3NvciBTdW4KLWFuZCBTR0kgc3lzdGVtcywgYW5kIFVuaXggd29ya3N0YXRpb25zIFsxLDJdLiAgT3VyIGdvYWwgaGFzCi1iZWVuIHRvIGludmVzdGlnYXRlIG1hdGVyaWFsIHByb3BlcnRpZXMgc3VjaCBhcyBmcmFjdHVyZSwgY3JhY2sKLXByb3BhZ2F0aW9uLCBkaXNsb2NhdGlvbiBnZW5lcmF0aW9uLCBmcmljdGlvbiwgYW5kIGR1Y3RpbGUtYnJpdHRsZSB0cmFuc2l0aW9ucyBbM10uCi1UaGUgU1BhU00gY29kZQotaGVscHMgdXMgaW52ZXN0aWdhdGUgdGhlc2UgcHJvYmxlbXMgYnkgcGVyZm9ybWluZyBhdG9taXN0aWMKLXNpbXVsYXRpb25zLS10aGF0IGlzLCB3ZSBzaW11bGF0ZSB0aGUgZHluYW1pY3Mgb2YgZXZlcnkgYXRvbSBpbiBhCi1tYXRlcmlhbCBhbmQgaG9wZSB0byBtYWtlIHNlbnNlIG9mIHdoYXQgaGFwcGVucy4gIE9mIGNvdXJzZSwgdGhlCi11bmRlcmx5aW5nIHBoeXNpY3MgaXMgbm90IHNvIGltcG9ydGFudCBmb3IgdGhpcyBkaXNjdXNzaW9uLgotCi08cD4KLVdoaWxlIHRoZSBkZXZlbG9wbWVudCBvZiBTUGFTTSBpcyBhbiBvbmdvaW5nIGVmZm9ydCwgd2UKLWhhdmUgYmVlbiBoYW1wZXJlZCBieSBhIG51bWJlciBvZiBzZXJpb3VzIHByb2JsZW1zLgotRmlyc3QsIHR5cGljYWwKLXNpbXVsYXRpb25zIGdlbmVyYXRlIHRlbnMgdG8gaHVuZHJlZHMgb2YgZ2lnYWJ5dGVzIG9mIGRhdGEgdGhhdCBtdXN0Ci1iZSBhbmFseXplZC4gVGhpcyB0YXNrIGlzIG5vdCBlYXNpbHkgcGVyZm9ybWVkIG9uIGEgdXNlcidzCi13b3Jrc3RhdGlvbiwgbm9yIGlzIGl0IGVjb25vbWljYWxseSBmZWFzaWJsZSB0byBidXkgZXZlcnlvbmUgdGhlaXIgb3duCi1wZXJzb25hbCBkZXNrdG9wIHN1cGVyY29tcHV0ZXIuICBBIHNlY29uZCBwcm9ibGVtIGlzIHRoYXQgb2YKLWludGVyYWN0aXZpdHkgYW5kIGNvbnRyb2wuICBXZSBhcmUgY29uc3RhbnRseSBtYWtpbmcgY2hhbmdlcyB0bwotaW52ZXN0aWdhdGUgbmV3IHBoeXNpY2FsIG1vZGVscywgZGlmZmVyZW50IG1hdGVyaWFscywgYW5kIHNvIGZvcnRoLgotVGhpcyB3b3VsZCB1c3VhbGx5IHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBDCi1jb2RlLS1hIHByb2Nlc3MgdGhhdCB3YXMgdGVkaW91cyBhbmQgbm90IHZlcnkgdXNlciBmcmllbmRseS4gV2UKLXdhbnRlZCBhIG1vcmUgZmxleGlibGUgbWVjaGFuaXNtLgotRmluYWxseSwgdGhlcmUgd2VyZSBtYW55IGRpZmZpY3VsdGllcyBhc3NvY2lhdGVkIHdpdGggdGhlCi1kZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2Ugb2Ygb3VyIHNvZnR3YXJlLiAgIFdoaWxlIHdlIGFyZSBvbmx5IGEgc21hbGwKLWdyb3VwLCBpdCB3YXMgbm90IHVuY29tbW9uIGZvciBkaWZmZXJlbnQgdXNlcnMgdG8gaGF2ZSB0aGVpciAKLW93biBwcml2YXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgdGhhdCBoYWQgYmVlbiBtb2RpZmllZCBpbiBzb21lIG1hbm5lci4gCi1UaGlzLCBpbiB0dXJuLCBsZWQgdG8gYSBtYWludGVuYW5jZSBuaWdodG1hcmUgdGhhdCBtYWRlIGl0IGFsbW9zdCBpbXBvc3NpYmxlCi10byB1cGRhdGUgdGhlIHNvZnR3YXJlIG9yIGFwcGx5IGJ1Zy1maXhlcyBpbiBhIGNvbnNpc3RlbnQgbWFubmVyLgotCi08cD4KLVRvIGFkZHJlc3MgdGhlc2UgcHJvYmxlbXMsIHdlIHN0YXJ0ZWQgaW52ZXN0aWdhdGluZyB0aGUgdXNlIG9mIHNjcmlwdGluZwotbGFuZ3VhZ2VzLiAgSW4gMTk5NSwgd2Ugd3JvdGUgYSBzcGVjaWFsIHB1cnBvc2UgcGFyYWxsZWwtc2NyaXB0aW5nIGxhbmd1YWdlLAotYnV0IHJlcGxhY2VkIGl0IHdpdGggUHl0aG9uIGEgeWVhciBsYXRlciAoYWx0aG91Z2ggdGhlIGludGVyZmFjZQotZ2VuZXJhdGlvbiB0b29sIGZvciB0aGF0IHNjcmlwdGluZyBsYW5ndWFnZSBsaXZlcyBvbiBhcyBTV0lHKS4gIEluIHRoaXMKLXBhcGVyLCB3ZSBob3BlIHRvIGRlc2NyaWJlIHNvbWUgb2Ygb3VyIGV4cGVyaWVuY2VzIHdpdGggUHl0aG9uIGFuZCBob3cKLWl0IGhhcyBoZWxwZWQgdXMgc29sdmUgcHJhY3RpY2FsIHNjaWVudGlmaWMgY29tcHV0aW5nIHByb2JsZW1zLiAgIEluIHBhcnRpY3VsYXIsCi13ZSBkZXNjcmliZSB0aGUgb3JnYW5pemF0aW9uIG9mIG91ciBzeXN0ZW0sIG1vZHVsZSBidWlsZGluZyBwcm9jZXNzLAotaW50ZXJlc3RpbmcgdG9vbHMgdGhhdCBQeXRob24gaGFzIGhlbHBlZCB1cyBkZXZlbG9wLCBhbmQgd2h5IHdlIHRoaW5rIHRoaXMKLWFwcHJvYWNoIGlzIHBhcnRpY3VsYXJseSB3ZWxsLXN1aXRlZCBmb3Igc2NpZW50aWZpYyBjb21wdXRpbmcgcmVzZWFyY2guCi0KLTxoMj4gV2h5IFB5dGhvbj8gPC9oMj4KLQotQWx0aG91Z2ggb3VyIGNvZGUgb3JpZ2luYWxseSB1c2VkIGEgY3VzdG9tIHNjcmlwdGluZyBsYW5ndWFnZSwgd2UgZGVjaWRlZAotdG8gc3dpdGNoIHRvIFB5dGhvbiBmb3IgYSBudW1iZXIgb2YgcmVhc29ucyA6Ci0KLTxwPgotPHVsPgotPGxpPiBGZWF0dXJlcy4gIFB5dGhvbiBoYWQgYSByaWNoIHNldCBvZiBkYXRhdHlwZXMsIHN1cHBvcnQgZm9yCi1vYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcsIG5hbWVzcGFjZXMsIGV4Y2VwdGlvbnMsIGR5bmFtaWMgbG9hZGluZywKLWFuZCBhIGxhcmdlIG51bWJlciBvZiB1c2VmdWwgbW9kdWxlcy4KLTxsaT4gU3ludGF4LiAgT3VyIHN5c3RlbSBpcyBjb250cm9sbGVkIHRocm91Z2gKLXRleHQtYmFzZWQgY29tbWFuZHMgYW5kIHNjcmlwdHMuICBXZSBmZWx0IHRoYXQgUHl0aG9uIGhhZCBhIG5pY2UKLXN5bnRheCB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdXNlcnMgdG8KLXR5cGUgd2VpcmQgc3ltYm9scyAoJCwlLEAsIGV0Yy4uLikgb3IgdXNlIHN5bnRheCB0aGF0IGlzIHJhZGljYWxseQotZGlmZmVyZW50IHRoYW4gQy4KLTxsaT4gQSBzbWFsbCBjb3JlLiAgVGhlIG1vZHVsYXIgc3RydWN0dXJlIG9mIFB5dGhvbiBtYWtlcyBpdCBlYXN5IGZvciB1cwotdG8gcmVtb3ZlIG9yIGFkZCBtb2R1bGVzIGFzIG5lZWRlZC4gICBHaXZlbiB0aGUgZGlmZmljdWx0IHRhc2sgb2YgcnVubmluZwotb24gcGFyYWxsZWwgbWFjaGluZXMgYW5kIHN1cGVyY29tcHV0ZXJzLCB3ZSBmZWx0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUKLXdvdWxkIG1ha2UgaXQgZWFzaWVyIGZvciB1cyB0byBwb3J0IFB5dGhvbiB0byBhIHZhcmlldHkgb2Ygc3BlY2lhbC1wdXJwb3NlCi1tYWNoaW5lcyAoc2luY2Ugd2UgY291bGQganVzdCByZW1vdmUgcHJvYmxlbWF0aWMgbW9kdWxlcykuCi08bGk+IEF2YWlsYWJpbGl0eSBvZiBkb2N1bWVudGF0aW9uLiAgIFVzZXJzIGNvdWxkIGdvIHRvIHRoZSBib29rc3RvcmUgCi10byBmaW5kIG91dCBtb3JlIGFib3V0IFB5dGhvbi4KLTxsaT4gU3VwcG9ydCBhbmQgc3RhYmlsaXR5LiAgUHl0aG9uIGFwcGVhcmVkIHRvIGJlIGhpZ2hseSBzdGFibGUgYW5kCi13ZWxsIHN1cHBvcnRlZCB0aHJvdWdoIG5ld3Nncm91cHMsIHNwZWNpYWwgaW50ZXJlc3QgZ3JvdXBzLCBhbmQgdGhlIFBTQS4KLTxsaT4gRnJlZWx5IGF2YWlsYWJsZS4gIFdlIGhhdmUgYmVlbiBhYmxlIHRvCi11c2UgYW5kIG1vZGlmeSBQeXRob24gYXMgbmVlZGVkIGZvciBvdXIgYXBwbGljYXRpb24uICBUaGlzIHdvdWxkIGhhdmUKLWJlZW4gaW1wb3NzaWJsZSB3aXRob3V0IGFjY2VzcyB0byB0aGUgUHl0aG9uIHNvdXJjZS4KLTwvdWw+Ci0KLTxwPgotQW5vdGhlciBmYWN0b3IsIG5vdCB0byBiZSBvdmVybG9va2VkLCBpcyB0aGUgaW5jcmVhc2luZyBhY2NlcHRhbmNlIG9mCi1QeXRob24gZWxzZXdoZXJlIGluIHRoZSBjb21wdXRhdGlvbmFsIHNjaWVuY2UgY29tbXVuaXR5LiAgRWZmb3J0cyBhdAotTGF3cmVuY2UgTGl2ZXJtb3JlIE5hdGlvbmFsIExhYm9yYXRvcnkgYW5kIGVsc2V3aGVyZSB3ZXJlCi1hdHRyYWN0aXZlLS1pbiBwYXJ0aWN1bGFyLCB3ZSBzYXcgUHl0aG9uIGFzIGJlaW5nIGEgcG90ZW50aWFsIHZlaGljbGUKLWZvciBzaGFyaW5nIG1vZHVsZXMgYW5kIHV0aWxpemluZyB0aGlyZC1wYXJ0eSB0b29scyBbNCw5LDEwXS4KLQotPGgyPiBTeXN0ZW0gT3JnYW5pemF0aW9uIDwvaDI+Ci0KLU91ciBnb2FsIHdhcyB0byBidWlsZCBhIGhpZ2hseSBtb2R1bGFyIHN5c3RlbSB0aGF0IGNvdWxkIHBlcmZvcm0KLXNpbXVsYXRpb24sIGRhdGEgYW5hbHlzaXMsIGFuZCB2aXN1YWxpemF0aW9uLS1vZnRlbiBwZXJmb3JtaW5nCi1hbGwgb2YgdGhlc2UgdGFza3Mgc2ltdWx0YW5lb3VzbHkuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBhIHRlbmRlbmN5Ci10byBkbyB0aGlzIGJ5IGJ1aWxkaW5nIGEgdGlnaHRseSBpbnRlZ3JhdGVkCi1tb25vbGl0aGljIHBhY2thZ2UgKHBlcmhhcHMgdXNpbmcgYSB3ZWxsLXN0cnVjdHVyZWQgQysrIGNsYXNzCi1oaWVyYXJjaHkgZm9yIGV4YW1wbGUpLiAgSW4gb3VyIHZpZXcsIHRoaXMgaXMgdG9vCi1mb3JtYWwgYW5kIHJlc3RyaWN0aXZlLiAgV2Ugd2FudGVkIHRvIHN1cHBvcnQgbW9kdWxlcyB0aGF0IG1pZ2h0IG9ubHkKLWJlIGxvb3NlbHkgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEKLWdyYXBoaWNzIGxpYnJhcnkgdG8gZGVwZW5kIG9uIHRoZSBzYW1lIHN0cnVjdHVyZXMgYXMgYSBzaW11bGF0aW9uIGNvZGUKLW9yIHRvIGV2ZW4gYmUgd3JpdHRlbiBpbiB0aGUgc2FtZSBsYW5ndWFnZSBmb3IgdGhhdCBtYXR0ZXIuICBMaWtld2lzZSwKLXdlIHdhbnRlZCB0byBleHBsb2l0IHRoaXJkLXBhcnR5IG1vZHVsZXMgd2hlcmUgbm8gYXNzdW1wdGlvbnMgCi1jb3VsZCBiZSBtYWRlIGFib3V0IHRoZWlyIGludGVybmFsIHN0cnVjdHVyZS4KLQotPHA+Ci1UaGUgbWFqb3IgY29tcG9uZW50cyBvZiBvdXIgc3lzdGVtIHRha2UgdGhlIGZvcm0gb2YgQyBsaWJyYXJpZXMuICBXaGVuCi1QeXRob24gaXMgdXNlZCwgdGhlIGxpYnJhcmllcyBhcmUgY29tcGlsZWQgaW50byBzaGFyZWQgbGlicmFyaWVzIGFuZAotZHluYW1pY2FsbHkgbG9hZGVkIGludG8gUHl0aG9uIGFzIGV4dGVuc2lvbiBtb2R1bGVzLiAgVGhlCi1mdW5jdGlvbmFsaXR5IG9mIGVhY2ggbGlicmFyeSBpcyBleHBvc2VkIGFzIGEgY29sbGVjdGlvbiBvZiBQeXRob24KLSJjb21tYW5kcy4iICBCZWNhdXNlIG9mIHRoaXMsIHRoZSBDIGFuZCBQeXRob24gcHJvZ3JhbW1pbmcKLWVudmlyb25tZW50cyBhcmUgY2xvc2VseSByZWxhdGVkLiAgSW4gbWFueSBjYXNlcywgaXQgaXMgcG9zc2libGUgdG8KLWltcGxlbWVudCB0aGUgc2FtZSBjb2RlIGluIGJvdGggQyBvciBQeXRob24uIEZvciBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+PHByZT4KLS8qIEEgc2ltcGxlIGZ1bmN0aW9uIHdyaXR0ZW4gaW4gQyAqLwotI2luY2x1ZGUgIlNQYVNNLmgiCi12b2lkIHJ1bihpbnQgbnN0ZXBzLCBkb3VibGUgRHQsIGludCBmcmVxKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhciBmaWxlbmFtZVs2NF07Ci0gICAgZm9yIChpID0gMDsgaSA8IG5zdGVwczsgaSsrKSB7Ci0gICAgICAgICBpbnRlZ3JhdGVfYWR2X2Nvb3JkKER0KTsKLSAgICAgICAgIGJvdW5kYXJ5X3BlcmlvZGljKCk7Ci0gICAgICAgICByZWRpc3RyaWJ1dGUoKTsKLSAgICAgICAgIGZvcmNlX2VhbSgpOwotICAgICAgICAgaW50ZWdyYXRlX2Fkdl92ZWxvY2l0eShEdCk7Ci0gICAgICAgICBpZiAoKGkgJSBmcmVxKSA9PSAwKSB7Ci0gICAgICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCJEYXQlZCIsaSk7Ci0gICAgICAgICAgICBvdXRwdXRfcGFydGljbGVzKGZpbGVuYW1lKTsKLSAgICAgICAgIH0KLSAgICB9Ci19PC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotICAgICAgICAKLU5vdywgaW4gUHl0aG9uIDoKLQotPGJsb2NrcXVvdGU+PHR0PjxwcmU+Ci0jIEEgZnVuY3Rpb24gd3JpdHRlbiBpbiBQeXRob24KLWZyb20gU1BhU00gaW1wb3J0ICoKLWRlZiBydW4obnN0ZXBzLCBEdCwgZnJlcSk6Ci0gICAgZm9yIGkgaW4geHJhbmdlKDAsIG5zdGVwcyk6Ci0gICAgICAgICBpbnRlZ3JhdGVfYWR2X2Nvb3JkKER0KQotICAgICAgICAgYm91bmRhcnlfcGVyaW9kaWMoKQotICAgICAgICAgcmVkaXN0cmlidXRlKCkKLSAgICAgICAgIGZvcmNlX2VhbSgpCi0gICAgICAgICBpbnRlZ3JhdGVfYWR2X3ZlbG9jaXR5KER0KQotICAgICAgICAgaWYgKGkgJSBmcmVxKSA9PSAwKSA6Ci0gICAgICAgICAgICBvdXRwdXRfcGFydGljbGVzKCdEYXQnK3N0cihpKSkKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotV2hpbGUgQyBsaWJyYXJpZXMgcHJvdmlkZSBtdWNoIG9mIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHksIHRoZSByZWFsIHBvd2VyCi1vZiB0aGUgc3lzdGVtIGNvbWVzIGluIHRoZSBmb3JtIG9mIG1vZHVsZXMgYW5kIHNjcmlwdHMgd3JpdHRlbiBlbnRpcmVseSBpbiBQeXRob24uCi1Vc2VycyB3cml0ZSBzY3JpcHRzIHRvIHNldCB1cCBhbmQgY29udHJvbCBzaW11bGF0aW9ucy4gIFNldmVyYWwgbWFqb3IKLWNvbXBvbmVudHMgc3VjaCBhcyB0aGUgdmlzdWFsaXphdGlvbiBhbmQgZGF0YS1hbmFseXNpcyBzeXN0ZW0gbWFrZSBoZWF2eQotdXNlIG9mIFB5dGhvbi4gIFdlIGFsc28gdXRpbGl6ZSBhIHZhcmlldHkgb2YgbW9kdWxlcyBpbiB0aGUgUHl0aG9uCi1saWJyYXJ5IGFuZCBoYXZlIGR5bmFtaWNhbGx5IGxvYWRhYmxlIHZlcnNpb25zIG9mIFRraW50ZXIgYW5kIHRoZQotUHl0aG9uIEltYWdpbmcgTGlicmFyeSBbMTFdLgotCi08aDI+IEVtYmVkZGluZyBQeXRob24gYW5kIEhpZGluZyBTeXN0ZW0gRGVwZW5kZW5jaWVzIDwvaDI+Ci0KLU9uZSBvZiB0aGUgYmlnZ2VzdCBpbXBsZW1lbnRhdGlvbiBwcm9ibGVtcyB3ZSBoYXZlIGVuY291bnRlcmVkIGlzIHRoZQotZmFjdCB0aGF0IHRoZSBTUGFTTSBjb2RlIGlzIGEgcGFyYWxsZWwgYXBwbGljYXRpb24gdGhhdCByZWxpZXMgaGVhdmlseQotdXBvbiB0aGUgcHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIGxvdy1sZXZlbCBzeXN0ZW0gc2VydmljZXMgc3VjaCBhcwotSS9PIGFuZCBwcm9jZXNzIG1hbmFnZW1lbnQuIEN1cnJlbnRseSwgaXQgaXMgcG9zc2libGUgdG8gcnVuIHRoZSBjb2RlCi1pbiB0d28gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLS1vbmUgdGhhdCB1c2VzIG1lc3NhZ2UgcGFzc2luZyB2aWEgdGhlCi1NUEkgbGlicmFyeSBhbmQgYW5vdGhlciB1c2luZyBTb2xhcmlzIHRocmVhZHMuICBVc2luZyBQeXRob24gd2l0aAotYm90aCB2ZXJzaW9ucyBvZiBjb2RlIHJlcXVpcmVzIGEgZGVncmVlIG9mIGNhcmUtLWluIHBhcnRpY3VsYXIsIHdlCi1oYXZlIGZvdW5kIGl0IHRvIGJlIG5lY2Vzc2FyeSB0byBwcm92aWRlIFB5dGhvbiB3aXRoIGVuaGFuY2VkIEkvTwotc3VwcG9ydCB0byBydW4gcHJvcGVybHkgaW4gcGFyYWxsZWwuICBUaGlzIHdvcmsgaGFzIGJlZW4gZGVzY3JpYmVkCi1lbHNld2hlcmUgWzUsNl0uCi0KLTxwPgotSGFuZGxpbmcgdHdvIG9wZXJhdGlvbmFsIG1vZGVzIGludHJvZHVjZXMgYSBudW1iZXIgb2YgcHJvYmxlbXMgcmVsYXRlZAotdG8gY29kZSBtYWludGVuYW5jZSBhbmQgaW5zdGFsbGF0aW9uLiAgVHJhZGl0aW9uYWxseSwgd2Ugd291bGQKLXJlY29tcGlsZSB0aGUgZW50aXJlIHN5c3RlbSBhbmQgYWxsIG9mIGl0cyBtb2R1bGVzIGZvciBlYWNoCi1jb25maWd1cmF0aW9uIChwbGFjaW5nIHRoZSBmaWxlcyBpbiBhbiBhcmNoaXRlY3R1cmUgZGVwZW5kZW50Ci1zdWJkaXJlY3RvcnkpLiAgVXNlcnMgd291bGQgaGF2ZSB0byBkZWNpZGUgd2hpY2ggc3lzdGVtIHRoZXkgd2FudGVkIHRvCi11c2UgYW5kIGNvbXBpbGUgYWxsIG9mIHRoZWlyIG1vZHVsZXMgYnkgbGlua2luZyBhZ2FpbnN0IHRoZQotYXBwcm9wcmlhdGUgbGlicmFyaWVzIGFuZCBzZXR0aW5nIHRoZSByaWdodCBjb21waWxlLXRpbWUgb3B0aW9ucy4KLUNoYW5naW5nIGNvbmZpZ3VyYXRpb25zIHdvdWxkIHR5cGljYWxseSByZXF1aXJlIGEgY29tcGxldGUgcmVjb21waWxlLgotCi08cD4KLVdpdGggZHluYW1pYyBsb2FkaW5nIGFuZCBzaGFyZWQgbGlicmFyaWVzIGhvd2V2ZXIsIHdlIGhhdmUgYmVlbiBhYmxlCi10byBkZXZpc2UgYSBkaWZmZXJlbnQgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtLiAgUmF0aGVyCi10aGFuIHJlY29tcGlsaW5nIGV2ZXJ5dGhpbmcgZm9yIGVhY2ggY29uZmlndXJhdGlvbiwgd2UgdXNlIGFuCi1pbXBsZW1lbnRhdGlvbiBpbmRlcGVuZGVudCBsYXllciBvZiBzeXN0ZW0gd3JhcHBlcnMuICBUaGVzZSB3cmFwcGVycwotcHJvdmlkZSBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgbWVzc2FnZSBwYXNzaW5nLCBwYXJhbGxlbCBJL08sIGFuZAotdGhyZWFkIG1hbmFnZW1lbnQuICBBbGwgb2YgdGhlIGNvcmUgbW9kdWxlcyBhcmUgdGhlbiBjb21waWxlZAotdXNpbmcgdGhlc2UgZ2VuZXJpYyB3cmFwcGVycy4gICBUaGlzIG1ha2VzIHRoZSBtb2R1bGVzIGluZGVwZW5kZW50Ci1vZiB0aGUgdW5kZXJseWluZyBvcGVyYXRpb25hbCBtb2RlLS0tdG8gdXNlIE1QSSBvciB0aHJlYWRzLCAgd2Ugc2ltcGx5Ci1uZWVkIHRvIHN1cHBseSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgIHN5c3RlbSB3cmFwcGVyIGxpYnJhcmllcy4KLVRoaXMgaXMgZWFzaWx5IGFjY29tcGxpc2hlZCBieSBidWlsZGluZyB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mCi1QeXRob24gdGhhdCBhcmUgbGlua2VkIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIHN5c3RlbSBsaWJyYXJpZXMuIAotVG8gcnVuIGluIGEgcGFydGljdWxhciBtb2RlLCB3ZSBub3cganVzdCBydW4gdGhlIGFwcHJvcHJpYXRlCi12ZXJzaW9uIG9mIFB5dGhvbiAoaS5lLiAncHl0aG9uJyBvciAncHl0aG9ubXBpJykuICBUaGUgbmVhdCAKLXBhcnQgYWJvdXQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGFsbCBvZiB0aGUgbW9kdWxlcyB3b3JrIHdpdGggYm90aAotb3BlcmF0aW9uYWwgbW9kZXMgd2l0aG91dCBhbnkgcmVjb21waWxhdGlvbiBvciByZWNvbmZpZ3VyYXRpb24uICBJZiBhCi11c2VyIGlzIHVzaW5nIHRocmVhZHMsIGJ1dCB3YW50cyB0byBzd2l0Y2ggdG8gTVBJLCB0aGV5IHNpbXBseSBydW4KLWEgZGlmZmVyZW50IHZlcnNpb24gb2YgUHl0aG9uLS1ubyByZWNvbXBpbGF0aW9uIG9mIG1vZHVsZXMgaXMgbmVjZXNzYXJ5LgotCi08cD4KLUEgZnVsbCBkaXNjdXNzaW9uIG9mIHdyaXRpbmcgc3lzdGVtLXdyYXBwZXJzIGNhbiBiZSBmb3VuZCBlbHNld2hlcmUuCi1JbiBwYXJ0aWN1bGFyLCBhIGRpc2N1c3Npb24gb2Ygd3JpdGluZyBwYXJhbGxlbCBJL08gd3JhcHBlcnMgZm9yCi1QeXRob24gY2FuIGJlIGZvdW5kIGluIFs1XS4gIEFuIGVhcmxpZXIgZGlzY3Vzc2lvbiBvZiB0aGUgdGVjaG5pcXVlIHdlCi1oYXZlIHVzZWQgZm9yIHdyaXRpbmcgbWVzc2FnZSBwYXNzaW5nIGFuZCBJL08gd3JhcHBlcnMgY2FuIGFsc28gYmUKLWZvdW5kIGluIFs3XS4KLQotPGgyPiBNb2R1bGUgQnVpbGRpbmcgd2l0aCBTV0lHIDwvaDI+Ci0KLVRvIGJ1aWxkIG1vZHVsZXMsIHdlIGhhdmUgYmVlbiB1c2luZyBTV0lHIFs4XS4KLUVhY2ggbW9kdWxlIGlzIGRlc2NyaWJlZCBieSBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgY29udGFpbmluZyB0aGUgQU5TSQotQyBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzLCBhbmQgdmFyaWFibGVzIGluIHRoYXQgbW9kdWxlLgotRm9yIGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT48cHJlPgotLy8gU1dJRyBpbnRlcmZhY2UgZmlsZQotJW1vZHVsZSBTUGFTTQotJXsKLSNpbmNsdWRlICJTUGFTTS5oIgotJX0KLXZvaWQgaW50ZWdyYXRlX2Fkdl9jb29yZChkb3VibGUgRHQpOwotdm9pZCBib3VuZGFyeV9wZXJpb2RpYygpOwotdm9pZCByZWRpc3RyaWJ1dGUoKTsKLXZvaWQgZm9yY2VfZWFtKCk7Ci12b2lkIGludGVncmF0ZV9hZHZfdmVsb2NpdHkoZG91YmxlIER0KTsKLWludCAgb3V0cHV0X3BhcnRpY2xlcyhjaGFyICpmaWxlbmFtZSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVNXSUcgcHJvdmlkZXMgYSBsb2dpY2FsIG1hcHBpbmcgb2YgdGhlIHVuZGVybHlpbmcgQyBpbXBsZW1lbnRhdGlvbiBpbnRvCi1QeXRob24uICAgRHVyaW5nIGNvbXBpbGF0aW9uLCBpbnRlcmZhY2UgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkKLWNvbnZlcnRlZCBpbnRvIHdyYXBwZXIgY29kZSBhbmQgY29tcGlsZWQgaW50byBQeXRob24gbW9kdWxlcy4gIFRoaXMgCi1wcm9jZXNzIGlzIGVudGlyZWx5IHRyYW5zcGFyZW50LS1jaGFuZ2VzIG1hZGUgdG8gdGhlIGludGVyZmFjZQotYXJlIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlZCB0byBQeXRob24gd2hlbmV2ZXIgYSBtb2R1bGUgaXMgcmVjb21waWxlZC4KLUdpdmVuIHRoZSBjb25zdGFudGx5IGV2b2x2aW5nIG5hdHVyZSBvZiByZXNlYXJjaCBhcHBsaWNhdGlvbnMsIHRoaXMgbWFrZXMKLWl0IGVhc3kgdG8gZXh0ZW5kIGFuZCBtYWludGFpbiB0aGUgc3lzdGVtLiAgCi0KLTxoMz4gU2VwYXJhdGlvbiBvZiBJbXBsZW1lbnRhdGlvbiBhbmQgSW50ZXJmYWNlIDwvaDM+Ci0KLUFuIGltcG9ydGFudCBhc3BlY3Qgb2YgU1dJRyBpcyB0aGF0IGl0IGlzIHJlcXVpcmVzIG5vIG1vZGlmaWNhdGlvbnMgdG8KLWV4aXN0aW5nIEMgY29kZSB3aGljaCBhbGxvd3MgdXMgdG8gbWFpbnRhaW4gYSBzdHJpY3QKLXNlcGFyYXRpb24gYmV0d2VlbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgQyBtb2R1bGVzIGFuZCB0aGVpcgotUHl0aG9uIGludGVyZmFjZS4gIFdlIGJlbGlldmUgdGhhdCB0aGlzIHJlc3VsdHMgaW4gY29kZSB0aGF0Ci1pcyBtb3JlIG9yZ2FuaXplZCBhbmQgZ2VuZXJhbGx5IHJldXNhYmxlLiAgVGhlcmUgaXMgbm8gcGFydGljdWxhcgotcmVhc29uIHdoeSBhIEMgbW9kdWxlIHNob3VsZCBkZXBlbmQgb24gUHl0aG9uIChvbmUgbWlnaHQKLXdhbnQgdG8gdXNlIGl0IGFzIGEgc3RhbmQtYWxvbmUgcGFja2FnZSBvciBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbikuCi1EZXNwaXRlIHVzaW5nIFB5dGhvbiBleHRlbnNpdmVseSwgdGhlIFNQYVNNIGNvZGUgY2FuIHN0aWxsIGJlCi1jb21waWxlZCB3aXRoIG5vIFB5dGhvbiBpbnRlcmZhY2UgKG9mIGNvdXJzZSwgeW91IGxvc2UgYWxsIG9mCi10aGUgYmVuZWZpdHMgZ2FpbmVkIGJ5IGhhdmluZyBQeXRob24pLiAgCi1XZSBmZWVsIHRoYXQgbW9zdCBwaHlzaWNzIGNvZGVzIHRlbmQKLXRvIGhhdmUgYSByYXRoZXIgbG9uZyBsaWZlLXNwYW4uICBNYWludGFpbmluZyBhIHNlcGFyYXRpb24gb2YKLWltcGxlbWVudGF0aW9uIGFuZCBpbnRlcmZhY2UgaGVscHMgaW5zdXJlIHRoYXQgb3VyIHBoeXNpY3MgY29kZSB3aWxsCi1iZSB1c2FibGUgaW4gdGhlIGZ1dHVyZS0tZXZlbiBpZiB0aGVyZSBhcmUgZHJhc3RpYyBjaGFuZ2VzIGluIHRoZQotaW50ZXJmYWNlIGFsb25nIHRoZSB3YXkuCi0KLTxoMz4gUHJvdmlkaW5nIEFjY2VzcyB0byBEYXRhIFN0cnVjdHVyZXMgPC9oMz4KLQotRm9yIHRoZSBwdXJwb3NlcyBvZiBkZWJ1Z2dpbmcgYW5kIGRhdGEgZXhwbG9yYXRpb24sIHdlIGhhdmUgCi11c2VkIFNXSUcgdG8gcHJvdmlkZSB3cmFwcGVycyBhcm91bmQgQyBkYXRhIHN0cnVjdHVyZXMuICAgRm9yIGV4YW1wbGUsCi1hIGNvbGxlY3Rpb24gb2YgQyBzdHJ1Y3R1cmVzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZwotCi08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiBzdHJ1Y3QgewotICAgICBkb3VibGUgeCx5LHo7Ci19IFZlY3RvcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICBpbnQgICAgdHlwZTsKLSAgICAgVmVjdG9yIHI7Ci0gICAgIFZlY3RvciB2OwotICAgICBWZWN0b3IgZjsKLX0gUGFydGljbGU7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLWNhbiBiZSB0dXJuZWQgaW50byBQeXRob24gd3JhcHBlciBjbGFzc2VzLiAgSW4gYWRkaXRpb24sIFNXSUcgY2FuIGV4dGVuZCBzdHJ1Y3R1cmVzIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+IDxwcmU+Ci0vLyBTV0lHIGludGVyZmFjZSBmb3IgdmVjdG9yIGFuZCBwYXJ0aWNsZSBzdHJ1Y3R1cmVzCi0laW5jbHVkZSBkYXRhdHlwZXMuaAotCi0vLyBFeHRlbmQgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggYSBmZXcgdXNlZnVsIG1ldGhvZHMKLSVhZGRtZXRob2RzIFZlY3RvciB7Ci0gICAgIGNoYXIgKl9fc3RyX18oKSB7Ci0gICAgICAgICBzdGF0aWMgY2hhciBhWzEwMjRdOwotICAgICAgICAgc3ByaW50ZihhLCJbICUwLjEwZiwgJTAuMTBmLCAlMC4xMGYgXSIsIHNlbGYtPngsIHNlbGYtPnksIHNlbGYtPnopOwotICAgICAgICAgcmV0dXJuIGE7Ci0gICAgIH0KLX0KLSVhZGRtZXRob2RzIFBhcnRpY2xlIHsKLSAgICAgUGFydGljbGUgKl9fZ2V0aXRlbV9fKGludCBpbmRleCkgewotICAgICAgICAgIHJldHVybiBzZWxmK2luZGV4OwotICAgICB9Ci0gICAgIGNoYXIgKl9fc3RyX18oKSB7Ci0gICAgICAgICAgLy8gcHJpbnQgb3V0IGEgcGFydGljbGUKLSAgICAgICAgICAuLi4KLSAgICAgfQotfQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gdGhlIFB5dGhvbiBpbnRlcmZhY2UgaXMgYnVpbHQsIEMgc3RydWN0dXJlcyBub3cgYXBwZWFyIGxpa2UKLVB5dGhvbiBvYmplY3RzLiAgQnkgcHJvdmlkaW5nIFB5dGhvbi1zcGVjaWZpYyBtZXRob2RzIChzdWNoIGFzCi08dHQ+X19nZXRpdGVtX188L3R0Pikgd2UgY2FuIGV2ZW4gcHJvdmlkZSBhcnJheSBhY2Nlc3MuCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBQeXRob24gY29kZSB3b3VsZCBwcmludCBvdXQKLWFsbCBvZiB0aGUgY29vcmRpbmF0ZXMgb2Ygc3RvcmVkIHBhcnRpY2xlcyA6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSMgUHJpbnQgb3V0IGFsbCBjb29yZGluYXRlcyB0byBhIGZpbGUKLWYgPSBvcGVuKCJwYXJ0LmRhdGEiLCJ3IikKLXAgPSBTUGFTTV9maXJzdF9wYXJ0aWNsZSgpICAgICAgICAgICMgR2V0IGZpcnN0IHBhcnRpY2xlIHBvaW50ZXIKLWZvciBpIGluIHhyYW5nZSgwLFNQYVNNX2NvdW50X3BhcnRpY2xlcygpKToKLSAgICBmLndyaXRlKCIlZiwgJWYsICVmXG4iICUgKHBbaV0uci54LCBwW2ldLnIueSwgcFtpXS5yLnopKQotZi5jbG9zZSgpCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotV2hpbGUgb25seSBhIHNpbXBsZSBleGFtcGxlLCBoYXZpbmcgZGlyZWN0IGFjY2VzcyB0byB1bmRlcmx5aW5nIGRhdGEgaGFzCi1wcm92ZW4gdG8gYmUgcXVpdGUgdmFsdWFibGUgc2luY2Ugd2UgdmlldyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gCi1vZiBkYXRhLCBjaGVjayB2YWx1ZXMsIGFuZCBwZXJmb3JtIGRpYWdub3N0aWNzLiAKLQotPGgzPiBJbXByb3ZpbmcgdGhlIFJlbGlhYmlsaXR5IG9mIE1vZHVsZXMgPC9oMz4KLQotV2hlbiBpbnN0cnVtZW50aW5nIG91ciBvcmlnaW5hbCBwaHlzaWNzIGFwcGxpY2F0aW9uIHRvIHVzZSBzY3JpcHRpbmcsCi13ZSBmb3VuZCB0aGF0IG1hbnkgcGFydHMgb2YgdGhlIGNvZGUgd2VyZSBub3Qgd3JpdHRlbiBpbiBhbiBlbnRpcmVseQotInJlbGlhYmxlIiBtYW5uZXIuICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29kZSBoYWQgbmV2ZXIgYmVlbiBvcGVyYXRlZCBpbgotYW4gZXZlbnQtZHJpdmVuIG1hbm5lci4gIEZ1bmN0aW9ucyBvZnRlbiBtYWRlIGFzc3VtcHRpb25zIGFib3V0Ci1pbml0aWFsaXphdGlvbnMgYW5kIHJhcmVseSBjaGVja2VkIHRoZSB2YWxpZGl0eSBvZiBpbnB1dCBwYXJhbWV0ZXJzLgotVG8gYWRkcmVzcyB0aGVzZSBpc3N1ZXMsIG1vc3Qgc2VjdGlvbnMgb2YgY29kZSB3ZXJlIGdyYWR1YWxseSBjaGFuZ2VkCi10byBwcm92aWRlIHNvbWUga2luZCBvZiB2YWxpZGF0aW9uIG9mIGlucHV0IHZhbHVlcyBhbmQgZXJyb3IgcmVjb3ZlcnkuCi1UaGUgU1dJRyBjb21waWxlciBoYXMgYWxzbyBiZWVuIGV4dGVuZGVkIHRvIHByb3ZpZGUgc29tZSBvZiB0aGVzZQotY2FwYWJpbGl0aWVzIGFzIHdlbGwuCi08cD4KLU9uZSBvZiBQeXRob24ncyBtb3N0IHBvd2VyZnVsIGZlYXR1cmVzIGlzIGl0cyBleGNlcHRpb24gaGFuZGxpbmcgbWVjaGFuaXNtLgotRXhjZXB0aW9ucyBhcmUgZWFzaWx5IHJhaXNlZCBhbmQgaGFuZGxlZCBpbiBQeXRob24gc2NyaXB0cyBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMgQSBQeXRob24gZnVuY3Rpb24gdGhhdCB0aHJvd3MgYW4gZXhjZXB0aW9uCi1kZWYgYWxsb2NhdGUobmJ5dGVzKToKLQlwdHIgPSBTUGFTTV9tYWxsb2MobmJ5dGVzKQotICAgICAgICBpZiBwdHIgPT0gIk5VTEwiOiByYWlzZSBNZW1vcnlFcnJvciwiT3V0IG9mIG1lbW9yeSEiCi0KLSMgQSBQeXRob24gZnVuY3Rpb24gdGhhdCBjYXRjaGVzIGFuIGV4Y2VwdGlvbgotZGVmIGZvbygpOgotCXRyeToKLQkJYWxsb2NhdGUoTkJZVEVTKQotCWV4Y2VwdDoKLQkJcmV0dXJuICAgICMgQmFpbGluZyBvdXQKLQotPC9ibG9ja3F1b3RlPjwvcHJlPgotCi1XZSBoYXZlIGJvcnJvd2VkIHRoaXMgaWRlYSBhbmQgaW1wbGVtZW50ZWQgYSBzaW1pbGFyIGV4Y2VwdGlvbiBoYW5kbGluZwotbWVjaGFuaXNtIGZvciBvdXIgQyBjb2RlLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgZnVuY3Rpb25zIGluIHRoZQotPHR0PiZsdDtzZXRqbXAuaCZndDs8L3R0PiBsaWJyYXJ5IGFuZCBkZWZpbmluZyBhIGZldyBDIG1hY3JvcyBmb3IgIjx0dD5Ucnk8L3R0PiIsICI8dHQ+RXhjZXB0PC90dD4iLAotIjx0dD5UaHJvdzwvdHQ+IiwgZXRjLi4uIFVzaW5nIHRoZXNlIG1hY3JvcywgbWFueSBvZiBvdXIgbGlicmFyeSBmdW5jdGlvbnMgbm93IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEEgQyBmdW5jdGlvbiB0aGF0IHRocm93cyBhbiBleGNlcHRpb24gKi8KLXZvaWQgKlNQYVNNX21hbGxvYyhzaXplX3QgbmJ5dGVzKSB7Ci0gICAgdm9pZCAqcHRyID0gKHZvaWQgKikgbWFsbG9jKG5ieXRlcyk7Ci0gICAgaWYgKCFwdHIpIFRocm93KCJTUGFTTV9tYWxsb2MgOiBPdXQgb2YgbWVtb3J5ISIpOwotICAgIHJldHVybiBwdHI7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUxpa2UgUHl0aG9uLCB3ZSBhbGxvdyBDIGZ1bmN0aW9ucyB0bwotY2F0Y2ggZXhjZXB0aW9ucyBhbmQgcHJvdmlkZSB0aGVpciBvd24gcmVjb3ZlcnkgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPiA8cHJlPgotLyogQSBDIGZ1bmN0aW9uIGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiAqLwotaW50IGZvbygpIHsKLSAgICB2b2lkICpwOwotICAgIFRyeSB7Ci0gICAgICAgIHAgPSBTUGFTTV9tYWxsb2MoTkJZVEVTKTsKLSAgICB9IEV4Y2VwdCB7Ci0gICAgICAgIHByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS4gUmV0dXJuaW5nIVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUluIHRoZSBjYXNlIG9mIGEgc3RhbmQtYWxvbmUgQyBhcHBsaWNhdGlvbiwgZXhjZXB0aW9ucyBjYW4KLWJlIGNhdWdodCBhbmQgaGFuZGxlZCBpbnRlcm5hbGx5LiAgU2hvdWxkIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbgotb2NjdXIsIHRoZSBjb2RlIHByaW50cyBhbiBlcnJvciBtZXNzYWdlIGFuZCB0ZXJtaW5hdGVzLiBIb3dldmVyLAotd2hlbiBQeXRob24gaXMgdXNlZCwgd2UgY2FuIAotZ2VuZXJhdGUgUHl0aG9uIGV4Y2VwdGlvbnMgdXNpbmcgYSBTV0lHIHVzZXItZGVmaW5lZAotZXhjZXB0aW9uIGhhbmRsZXIgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDoKLQotPGJsb2NrcXVvdGU+IDxwcmU+Ci0lbW9kdWxlIFNQYVNNCi0vLyBBIFNXSUcgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbiBoYW5kbGVyCi0lZXhjZXB0KHB5dGhvbikgewotICAgICBUcnkgewotICAgICAgICAgICRmdW5jdGlvbgotICAgICB9IEV4Y2VwdCB7Ci0gICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvcixTUGFTTV9lcnJvcl9tc2coKSk7Ci0gICAgIH0KLX0KLS8vIEMgZGVjbGFyYXRpb25zIAotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSBoYW5kbGVyIGNvZGUgZ2V0cyBwbGFjZWQgaW50byBhbGwgb2YgdGhlIFB5dGhvbgotIndyYXBwZXIiIGZ1bmN0aW9ucyBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHRyYW5zbGF0aW5nIEMgZXhjZXB0aW9ucwotaW50byBQeXRob24gZXhjZXB0aW9ucy4gIERvaW5nIHRoaXMgbWFrZXMgb3VyIHBoeXNpY3MgY29kZSBvcGVyYXRlCi1pbiBhIG1vcmUgc2VhbWxlc3MgbWFubmVyIGFuZCBnaXZlcyBpdCBhIHByZWNpc2VseSBkZWZpbmVkIGVycm9yIHJlY292ZXJ5Ci1wcm9jZWR1cmUgKGkuZS4gIGludGVybmFsIGVycm9ycyBhbHdheXMgcmVzdWx0IFB5dGhvbiBleGNlcHRpb25zKS4gRm9yIGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT48cHJlPgotPj4+IFNQYVNNX21hbGxvYygxMDAwMDAwMDAwKQotUnVudGltZUVycm9yOiBTUGFTTV9tYWxsb2MoMTAwMDAwMDAwMCkuIE91dCBvZiBtZW1vcnkhCi0oTGluZSA1MiBpbiBtZW1vcnkuYykKLT4+PgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1XZSBoYXZlIGZvdW5kIGVycm9yIHJlY292ZXJ5IHRvIGJlIGNyaXRpY2FsLiAgV2l0aG91dCBpdCwgc2ltdWxhdGlvbnMgbWF5IAotY29udGludWUgdG8gcnVuLCBvbmx5IHRvIGdlbmVyYXRlIHdyb25nIGFuc3dlcnMgb3IgYSBteXN0ZXJpb3VzCi1zeXN0ZW0gY3Jhc2guICAKLQotPGgyPiBNb3JlIFRoYW4gU2NyaXB0aW5nIDwvaDI+Ci0KLVdoZW4gd2Ugb3JpZ2luYWxseSBzdGFydGVkIHVzaW5nIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdlIHRob3VnaHQgCi10aGV5IHdvdWxkIG1haW5seSBiZSBhIGNvbnZlbmllbnQgbWVjaGFuaXNtIGZvciBnbHVpbmcgQyBsaWJyYXJpZXMKLXRvZ2V0aGVyIGFuZCBjb250cm9sbGluZyB0aGVtIGluIGFuIGludGVyYWN0aXZlIG1hbm5lci4gIEhvd2V2ZXIsIAotd2UgaGF2ZSBjb21lIHRvIHJlYWxpemUgdGhhdCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGFyZQotbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhpcy4gIE5vdywgd2UgZmluZCBvdXJzZWx2ZXMKLWltcGxlbWVudGluZyBzaWduaWZpY2FudCBmdW5jdGlvbmFsaXR5IGVudGlyZWx5IGluIFB5dGhvbi0tYnlwYXNzaW5nCi1DIGFsdG9nZXRoZXIuICAgVGhlIG1vc3Qgc3VycHJpc2luZyAod2VsbCwgbm90IHJlYWxseSB0aGF0IHN1cnByaXNpbmcpCi1mYWN0IGlzIHRoYXQgUHl0aG9uIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIHZlcnkgcG93ZXJmdWwgdG9vbHMgd2l0aAotb25seSBhIHNtYWxsIGFtb3VudCBvZiBleHRyYSBwcm9ncmFtbWluZy4gICBJbiB0aGlzIHNlY3Rpb24sIHdlIHByZXNlbnQKLWEgYnJpZWYgb3ZlcnZpZXcgb2Ygc29tZSBvZiB0aGUgdG9vbHMgd2UgaGF2ZSBkZXZlbG9wZWQtLW1vc3Qgb2YKLXdoaWNoIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBsYXJnZWx5IGluIFB5dGhvbi4KLQotPGgzPiBPYmplY3QtT3JpZW50ZWQgVmlzdWFsaXphdGlvbiBhbmQgRGF0YSBBbmFseXNpcyA8L2gzPgotCi1PdXIgb3JpZ2luYWwgZ29hbCB3YXMgdG8gYWRkIGEgcG93ZXJmdWwgZGF0YSBhbmFseXNpcyBhbmQKLXZpc3VhbGl6YXRpb24gY29tcG9uZW50IHRvIG91ciBhcHBsaWNhdGlvbi4gIFRvIHRoaXMgZW5kLCB3ZSBkZXZlbG9wZWQKLWEgbGlnaHR3ZWlnaHQgaGlnaC1wZXJmb3JtYW5jZSBncmFwaGljcyBsaWJyYXJ5IGltcGxlbWVudGVkIGluIEMuCi1UaGlzIGxpYnJhcnkgc3VwcG9ydHMgYm90aCAyRCBhbmQgM0QgcGxvdHRpbmcgYW5kIHByb2R1Y2VzIG91dHB1dCBpbgotdGhlIGZvcm0gb2YgR0lGIGltYWdlcy4gIFRvIG1ha2UgcGxvdHMsIGEgdXNlciB3cml0ZXMgc2ltcGxlIEMKLWZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOgotCi08YmxvY2txdW90ZT48cHJlPgotdm9pZCBwbG90X3NwaGVyZXMoUGxvdDNEICpwMywgRGF0YUZ1bmN0aW9uIGZ1bmMsIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgcmFkaXVzKSB7Ci0gICAgUGFydGljbGUgKnAgPSBQYXJ0aWNsZXM7Ci0gICAgaW50ICAgICAgIGksIG5wYXJ0LCBjb2xvcjsKLSAgICBucGFydCA9IFNQYVNNX2NvdW50X3BhcnRpY2xlcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBucGFydDsgaSsrLCBwKyspIHsKLSAgICAgICAgLyogQ29tcHV0ZSBjb2xvciB2YWx1ZSAqLwotICAgICAgICB2YWx1ZSA9ICgqZnVuYykocCk7Ci0gICAgICAgIGNvbG9yID0gKHZhbHVlLW1pbikvKG1heC1taW4pKjI1NTsKLSAgICAgICAgLyogUGxvdCBpdCAqLwotICAgICAgICBQbG90M0Rfc3BoZXJlKHAzLHAtPnIueCxwLT5yLnkscC0+ci56LHJhZGl1cyxjb2xvcik7Ci0gICAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBleGVjdXRlZCwgdGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHJhdyBpbWFnZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcKLXNob3dpbmcgc3RhY2tpbmctZmF1bHRzIGdlbmVyYXRlZCBieSBhIHBhc3Npbmcgc2hvY2sgd2F2ZSBpbiBhbiBmY2MgY3J5c3RhbAotb2YgMTAgbWlsbGlvbiBhdG9tcyA6Ci08cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iYmlnc2hvY2tyYXcuZ2lmIj4KLTwvY2VudGVyPgotPHA+Ci1XaGlsZSBzaW1wbGUsIHdlIG9mdGVuIHdhbnQgb3VyIGltYWdlcyB0byBjb250YWluIG1vcmUgaW5mb3JtYXRpb24KLWluY2x1ZGluZyB0aXRsZXMsIGF4aXMgbGFiZWxzLCBjb2xvcmJhcnMsIHRpbWUtc3RhbXBzLCBhbmQgYm91bmRpbmcKLWJveGVzLiAgIFRvIGRvIHRoaXMsIHdlIGhhdmUgYnVpbHQgYW4gb2JqZWN0LW9yaWVudGVkIHZpc3VhbGl6YXRpb24KLWZyYW1ld29yayBpbiBQeXRob24uICAgUHl0aG9uIGNsYXNzZXMgcHJvdmlkZSBtZXRob2RzIGZvciBncmFwaCBhbm5vdGF0aW9uCi1hbmQgY29tbW9uIGdyYXBoIG9wZXJhdGlvbnMuICAgSWYgYSB1c2VyIHdhbnRzIHRvIG1ha2UgYSBuZXcga2luZCBvZiBwbG90LAotdGhleSBzaW1wbHkgaW5oZXJpdCBmcm9tIGFuIGFwcHJvcHJpYXRlIGJhc2UgY2xhc3MgYW5kIHByb3ZpZGUgYSBmdW5jdGlvbgotdG8gcGxvdCB0aGUgZGVzaXJlZCBkYXRhLiBGb3IgZXhhbXBsZSwgYSAiU3BoZXJlIiBwbG90IHVzaW5nIHRoZSBhYm92ZSBDCi1mdW5jdGlvbiB3b3VsZCBsb29rIGxpa2UgdGhpcyA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1jbGFzcyBTcGhlcmVzKEltYWdlM0QpOgotICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMsIG1pbiwgbWF4LCByYWRpdXM9MC41KToKLSAgICAgICAgICAgICBJbWFnZTNELl9faW5pdF9fKHNlbGYsIC4uLiAKLSAgICAgICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCi0gICAgICAgICAgICAgc2VsZi5taW4gID0gbWluCi0gICAgICAgICAgICAgc2VsZi5tYXggID0gbWF4Ci0gICAgICAgICAgICAgc2VsZi5yYWRpdXMgPSByYWRpdXMKLSAgICAgIGRlZiBkcmF3KHNlbGYpOgotICAgICAgICAgICAgIHNlbGYubmV3cGxvdCgpCi0gICAgICAgICAgICAgcGxvdF9zcGhlcmVzKHNlbGYucDMsc2VsZi5mdW5jLHNlbGYubWluLHNlbGYubWF4LHNlbGYucmFkaXVzKQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UbyB1c2UgdGhlIG5ldyBpbWFnZSwgb25lIHNpbXBseSBjcmVhdGVzIGFuIG9iamVjdCBvZiB0aGF0IHR5cGUgYW5kCi1tYW5pcHVsYXRlcyBpdC4gIEZvciBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLT4+PiBzID0gU3BoZXJlcyhQRSwtOCwtMy41KSAgICMgQ3JlYXRlIGEgbmV3IGltYWdlCi0+Pj4gcy5yb3RkKDQ1KSAgICAgICAgICAgICAgICAjIFJvdGF0ZSBpdCBkb3duCi0+Pj4gcy56b29tKDIwMCkgICAgICAgICAgICAgICAjIFpvb20gaW4KLT4+PiBzLnNob3coKSAgICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgSW1hZ2UgYW5kIGRpc3BsYXkgaXQKLT4+PiAuLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGNlbnRlcj4KLTxpbWcgc3JjPSJiaWdzaG9jay5naWYiPgotPC9jZW50ZXI+Ci0KLTxwPgotVGh1cywgd2l0aCBhIHNpbXBsZSBDIGZ1bmN0aW9uIGFuZCBhIHNpbXBsZSBQeXRob24gY2xhc3MsIHdlIGdldCBhIGxvdAotb2YgZnVuY3Rpb25hbGl0eSBmb3IgZnJlZSwgaW5jbHVkaW5nIG1ldGhvZHMgZm9yIGltYWdlIG1hbmlwdWxhdGlvbiwKLWdyYXBoIGFubm90YXRpb24sIGFuZCBkaXNwbGF5LiAgSW4gdGhlIGN1cnJlbnQgc3lzdGVtLCB0aGVyZSBhcmUgYWJvdXQKLWEgZG96ZW4gZGlmZmVyZW50IHR5cGVzIG9mIGltYWdlcyBmb3IgMkQgYW5kIDNEIHBsb3R0aW5nLiAgSXQgaXMgYWxzbwotcG9zc2libGUgdG8gcGVyZm9ybSBmaWx0ZXJpbmcsIGFwcGx5IGNsaXBwaW5nIHBsYW5lcywgYW5kIG90aGVyCi1hZHZhbmNlZCBvcGVyYXRpb25zLiAgICBNb3N0IG9mIHRoaXMgaXMgc3VwcG9ydGVkIGJ5IGFib3V0IDIwMDAgbGluZXMgb2YKLVB5dGhvbiBjb2RlIGFuZCBhIHJlbGF0aXZlbHkgc21hbGwgQyBsaWJyYXJ5IGNvbnRhaW5pbmcgcGVyZm9ybWFuY2UKLWNyaXRpY2FsIG9wZXJhdGlvbnMuCi0KLTxoMz4gV2ViLUJhc2VkIFNpbXVsYXRpb24gTW9uaXRvcmluZyA8L2gzPgotCi1PbmUgZmVhdHVyZSBvZiBtYW55IHBoeXNpY3MgY29kZXMgaXMgdGhhdCB0aGV5IHRlbmQgdG8gcnVuIGZvciBhIGxvbmcKLXRpbWUuICBJbiBvdXIgY2FzZSwgYSBzaW11bGF0aW9uIG1heSBydW4gZm9yIHRlbnMgdG8gaHVuZHJlZHMgb2YKLWhvdXJzLiAgRHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSBzaW11bGF0aW9uLCBpdCBpcyBkZXNpcmFibGUgdG8gY2hlY2sgb24KLWl0cyBzdGF0dXMgYW5kIHNlZSBob3cgaXQgaXMgcHJvZ3Jlc3NpbmcuICBHaXZlbiB0aGUgc3Ryb25nIEludGVybmV0Ci1zdXBwb3J0IGFscmVhZHkgYnVuZGxlZCB3aXRoIFB5dGhvbiwgd2UgZGVjaWRlZCB0byB3cml0ZSBhIHNpbXBsZQotcGh5c2ljcyB3ZWItc2VydmVyIHRoYXQgY291bGQgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiAgVW5saWtlIGEKLW1vcmUgdHJhZGl0aW9uYWwgc2VydmVyLCBvdXIgc2VydmVyIGlzIHVzZWQgYnkgInJlZ2lzdGVyaW5nIiB2YXJpb3VzCi1vYmplY3RzIHRoYXQgb25lIHdhbnRzIHRvIGxvb2sgYXQgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSBzaW11bGF0aW9uLgotVGhlIHNpbXVsYXRpb24gY29kZSB0aGVuIHBlcmlvZGljYWxseSBwb2xscyBhIG5ldHdvcmsgc29ja2V0IHRvIHNlZSBpZgotYW55b25lIGhhcyByZXF1ZXN0ZWQgYW55dGhpbmcuICBJZiBzbywgdGhlIHNpbXVsYXRpb24gd2lsbCBzdG9wIGZvciBhCi1tb21lbnQsIGdlbmVyYXRlIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24sIHNlbmQgaXQgdG8gdGhlIHVzZXIsIGFuZAotdGhlbiBjb250aW51ZSBvbiB3aXRoIHRoZSBjYWxjdWxhdGlvbi4gIEEgc2ltcGxpZmllZCBleGFtcGxlIG9mIHVzaW5nCi10aGUgc2VydmVyIGlzIGFzIGZvbGxvd3MgOgotCi08YmxvY2txdW90ZT4gPHByZT4KLSMgU2ltcGxpZmllZCBzY3JpcHQgdXNpbmcgYSB3ZWItc2VydmVyCi1mcm9tIHZpcyBpbXBvcnQgKgotZnJvbSB3ZWIgaW1wb3J0ICoKLQotd2ViID0gU1BhU01XZWIoKQotd2ViLmFkZChXZWJNYWluKCIiKSkKLXdlYi5hZGQoV2ViRmlsZVRleHQoIk1zZyIrYHJ1bl9ub2ApKQotCi0jIENyZWF0ZSBhbiBpbWFnZSBvYmplY3QKLQotc2V0X2dyYXBoaWNzX21vZGUoSFRUUCkKLWtlID0gU3BoZXJlcyhLRSwwLDIwKQota2UudGl0bGUgPSAiS2luZXRpYyBFbmVyZ3kiCi13ZWIuYWRkKFdlYkltYWdlKCJrZS5naWYiLGtlKSkKLQotZGVmIHJ1bihuc3RlcHMpOgotCWZvciBpIGluIHhyYW5nZSgwLG5zdGVwcyk6Ci0JCWludGVncmF0ZSgxKSAgICAgICAgICAgIyBJbnRlZ3JhdGUgMSB0aW1lc3RlcAotICAgICAgICAgICAgICAgIHdlYi5wb2xsKCkgICAgICAgICAgICAgIyBBbnlvbmUgbG9va2luZyBmb3IgbWU/Ci0KLSMgUnVuIGl0Ci1ydW4oMTAwMDApCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVdoaWxlIHNpbXBsZSwgdGhpcyBleGFtcGxlIGdpdmVzIHRoZSBiYXNpYyBpZGVhLiBXZSBjcmVhdGUgYQotc2VydmVyIG9iamVjdCBhbmQgcmVnaXN0ZXIgYSBmZXcgImxpbmtzLiIgIFdoZW4gYSB1c2VyIGNvbm5lY3RzIHdpdGgKLXRoZSBzZXJ2ZXIsIHRoZXkgd2lsbCBiZSBwcmVzZW50ZWQgd2l0aCBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbiBhbmQgYQotbGlzdCBvZiBhdmFpbGFibGUgbGlua3MuICBXaGVuIHRoZSBsaW5rcyBhcmUgYWNjZXNzZWQsIHRoZSBzZXJ2ZXIKLWZlZWRzIHJlYWwtdGltZSBkYXRhIGJhY2sgdG8gdGhlIHVzZXIuICBJbiB0aGUgY2FzZSBvZgotaW1hZ2VzLCB0aGV5IGFyZSBnZW5lcmF0ZWQgaW1tZWRpYXRlbHkgYW5kIHNlbnQgYmFjayBpbiBHSUYgZm9ybWF0LiBEdXJpbmcKLXRoaXMgcHJvY2Vzcywgbm8gdGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkLCBub3IgaXMgdGhlIHNlcnZlcgotdHJhbnNtaXR0aW5nIHByZXZpb3VzbHkgc3RvcmVkIGluZm9ybWF0aW9uIChpLmUuIGV2ZXJ5dGhpbmcgaXMgCi1jcmVhdGVkIG9uLXRoZS1mbHkpLiAKLQotPHA+Ci1XaGlsZSB3ZSBhcmUgc3RpbGwgcmVmaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uLCB0aGlzIGFwcHJvYWNoIGhhcyB0dXJuZWQKLW91dCB0byBiZSB1c2VmdWwtLW5vdCBvbmx5IGNhbiB3ZSBwZXJpb2RpY2FsbHkgY2hlY2sgdXAKLW9uIGEgcnVubmluZyBzaW11bGF0aW9uLCB0aGlzIGNhbiBjYW4gYmUgZG9uZSBmcm9tIGFueSBtYWNoaW5lIHRoYXQKLWhhcyBhIFdlYi1icm93c2VyLCBpbmNsdWRpbmcgUENzIGFuZCBNYWNzIHJ1bm5pbmcgb3ZlciBhIG1vZGVtIGxpbmUKLShhbGxvd2luZyBhIGJvcmVkIHBoeXNpY2lzdCB0byBjaGVjayBvbiBsb25nLXJ1bm5pbmcgam9icyBmcm9tIGhvbWUKLW9yIHdoaWxlIG9uIHRyYXZlbCkuICBPZiBjb3Vyc2UsIHRoZSBtb3N0IGFtYXppbmcgZmFjdCBvZiBhbGwgaXMgdGhhdAotdGhpcyB3YXMgaW1wbGVtZW50ZWQgYnkgb25lIHBlcnNvbiBpbiBhbiBhZnRlcm5vb24gYW5kIG9ubHkgaW52b2x2ZWQKLWFib3V0IDE1MCBsaW5lcyBvZiBQeXRob24gY29kZSAod2l0aCBnZW5lcm91cyBoZWxwIGZyb20gdGhlIFB5dGhvbiBsaWJyYXJ5KS4KLQotPGgzPiBEZXZlbG9wbWVudCBTdXBwb3J0IDwvaDM+Ci0KLUZpbmFsbHksIHdlIGhhdmUgZm91bmQgUHl0aG9uIHRvIGJlIHF1aXRlIHVzZWZ1bCBmb3Igc3VwcG9ydGluZwotdGhlIGZ1dHVyZSBkZXZlbG9wbWVudCBvZiBvdXIgY29kZS4gIFNvbWUgb2YgdGhpcyBjb21lcyBpbiB0aGUgZm9ybSBvZgotc29waGlzdGljYXRlZCBkZWJ1Z2dpbmctLVB5dGhvbiBjYW4gYmUgdXNlZCB0byBhbmFseXplIGludGVybmFsIGRhdGEKLXN0cnVjdHVyZXMgYW5kIHRyYWNrIGRvd24gcHJvYmxlbXMuICBTaW5jZSBQeXRob24gY2FuIHJlYWQKLWFuZCBtb2RpZnkgbW9zdCBvZiB0aGUgY29yZSBDIGRhdGEgc3RydWN0dXJlcywgaXQgaXMgcG9zc2libGUgdG8KLXByb3RvdHlwZSBuZXcgZnVuY3Rpb25zIG9yIHRvIHBlcmZvcm0gb25lLXRpbWUgb3BlcmF0aW9ucyB3aXRob3V0IGV2ZXIKLWxvYWRpbmcgdXAgdGhlIEMgY29tcGlsZXIuCi0KLTxwPgotV2UgaGF2ZSBhbHNvIHVzZWQgUHl0aG9uIGluIGNvbmp1bmN0aW9uIHdpdGggY29kZQotbWFuYWdlbWVudC4gT25lIG9mIHRoZSBuZXdlciBwcm9ibGVtcyB3ZSBoYXZlIGZhY2VkIGlzIHRoZSB0YXNrIG9mCi1maW5kaW5nIHRoZSBkZWZpbml0aW9ucyBvZiBDIGZ1bmN0aW9ucyAoZm9yIGV4YW1wbGUsIAotd2UgbWlnaHQgd2FudCB0byBrbm93IGhvdyBhIHBhcnRpY3VsYXIgY29tbWFuZCBoYXMgYmVlbgotaW1wbGVtZW50ZWQgaW4gQykuICBUbyBzdXBwb3J0IHRoaXMsIHdlIGhhdmUgd3JpdHRlbiB0b29scyBmb3IKLWJyb3dzaW5nIHNvdXJjZSBkaXJlY3RvcmllcywgZGlzcGxheWluZyBkZWZpbml0aW9ucywgYW5kIHNwYXduaW5nCi1lZGl0b3JzLiAgQWxsIG9mIHRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gUHl0aG9uIGFuZCBjYW4gYmUgcGVyZm9ybWVkCi1kaXJlY3RseSBmcm9tIHRoZSBQaHlzaWNzIGFwcGxpY2F0aW9uLiAgUHl0aG9uIGhhcyBtYWRlIHRoZXNlIGtpbmRzCi1vZiB0b29scyB2ZXJ5IGVhc3kgdG8gd3JpdGUtLW9mdGVuIG9ubHkgcmVxdWlyaW5nIGEgZmV3IGhvdXJzIG9mCi1lZmZvcnQuCi0KLTxoMj4gUHl0aG9uIGFuZCB0aGUgRGV2ZWxvcG1lbnQgb2YgU2NpZW50aWZpYyBTb2Z0d2FyZSA8L2gyPgotCi1UaGUgYWRvcHRpb24gb2YgUHl0aG9uIGhhcyBoYWQgYSBwcm9mb3VuZCBlZmZlY3Qgb24gdGhlIG92ZXJhbGwKLXN0cnVjdHVyZSBvZiBvdXIgYXBwbGljYXRpb24uICBXaXRoIHRpbWUsIHRoZSBjb2RlIGJlY2FtZSBtb3JlCi1tb2R1bGFyLCBtb3JlIHJlbGlhYmxlLCBhbmQgYmV0dGVyIG9yZ2FuaXplZC4gICAKLUZ1cnRoZXJtb3JlLCB0aGVzZSBnYWlucyBoYXZlIGJlZW4gYWNoaWV2ZWQKLXdpdGhvdXQgc2lnbmlmaWNhbnQgbG9zc2VzIGluIHBlcmZvcm1hbmNlLCBpbmNyZWFzZWQgY29kaW5nIGNvbXBsZXhpdHksCi1vciBzdWJzdGFudGlhbGx5IGluY3JlYXNlZCBkZXZlbG9wbWVudCBjb3N0LiAgIEl0IHNob3VsZCBhbHNvIGJlIHN0cmVzc2VkCi10aGF0IGF1dG9tYXRlZCB0b29scyBzdWNoIGFzIFNXSUcgaGF2ZSBwbGF5ZWQgYSBjcml0aWNhbCByb2xlIGluIHRoaXMKLWVmZm9ydCBieSBoaWRpbmcgdGhlIFB5dGhvbi1DIGludGVyZmFjZSBhbmQgYWxsb3dpbmcgdXMgdG8gY29uY2VudHJhdGUKLW9uIHRoZSByZWFsIHByb2JsZW1zIGF0IGhhbmQgKGkuZS4gcGh5c2ljcykuICAKLQotPHA+Ci1PbmUgcG9pbnQsIHRoYXQgd2Ugd291bGQgbGlrZSB0byBzdHJvbmdseSBlbXBoYXNpemUsIGlzIHRoZSBkeW5hbWljCi1uYXR1cmUgb2YgbWFueSBzY2llbnRpZmljIGFwcGxpY2F0aW9ucy4gIE91ciBhcHBsaWNhdGlvbiBpcyBub3QgYSBodWdlCi1tb25vbGl0aGljIHBhY2thZ2UgdGhhdCBuZXZlciBjaGFuZ2VzIGFuZCB3aGljaCBubyBvbmUgaXMgc3VwcG9zZWQgdG8KLW1vZGlmeS4gIFJhdGhlciwgdGhlIGNvZGUgaXMgPGVtPmNvbnN0YW50bHk8L2VtPiBjaGFuZ2luZyB0byBleHBsb3JlCi1uZXcgcHJvYmxlbXMsIHRyeSBuZXcgbnVtZXJpY2FsIG1ldGhvZHMsIG9yIHRvIHByb3ZpZGUgYmV0dGVyCi1wZXJmb3JtYW5jZS4gIFRoZSBoaWdobHkgbW9kdWxhciBuYXR1cmUgb2YgUHl0aG9uIHdvcmtzIGdyZWF0IGluCi10aGlzIGVudmlyb25tZW50LiAgV2UgcHJvdmlkZSBhIGNvbW1vbiByZXBvc2l0b3J5IG9mIG1vZHVsZXMgdGhhdCBhcmUgc2hhcmVkIGJ5IGFsbAotb2YgdGhlIHVzZXJzIG9mIHRoZSBzeXN0ZW0uICBEaWZmZXJlbnQgdXNlcnMgYXJlIHR5cGljYWxseSByZXNwb25zaWJsZQotZm9yIGRpZmZlcmVudCBtb2R1bGVzIGFuZCBhbGwgdXNlcnMgbWF5IGJlIHdvcmtpbmcgb24gZGlmZmVyZW50IG1vZHVsZXMKLWF0IHRoZSBzYW1lIHRpbWUuIAotV2hlbmV2ZXIgY2hhbmdlcyB0byBhIG1vZHVsZSBhcmUgbWFkZSwgdGhleSBhcmUgaW1tZWRpYXRlbHkgcHJvcGFnYXRlZAotdG8gZXZlcnlvbmUgZWxzZS4gIEluIHRoZSBjYXNlIG9mIGJ1Zy1maXhlcywgdGhpcyBtZWFucyB0aGF0IHBhdGNoZWQKLXZlcnNpb25zIG9mIGNvZGUgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4gIExpa2V3aXNlLCBuZXcKLWZlYXR1cmVzIHNob3cgdXAgYXV0b21hdGljYWxseSBhbmQgY2FuIGJlIGVhc2lseSB0ZXN0ZWQgYnkgZXZlcnlvbmUuCi1BbmQgb2YgY291cnNlLCBpZiBzb21ldGhpbmcgYnJlYWtzLS1vdGhlcnMgdGVuZCB0byBub3RpY2UgYWxtb3N0IGltbWVkaWF0ZWx5Ci0od2hpY2ggd2UgZmVlbCBpcyBhIGdvb2QgdGhpbmcpLgotCi08aDI+IExpbWl0YXRpb25zIG9mIFB5dGhvbiA8L2gyPgotCi1XaGlsZSB3ZSBjb25zaWRlciBvdXIgUHl0aG9uICJleHBlcmltZW50IiB0byBiZSBoaWdobHkgc3VjY2Vzc2Z1bCwgd2UKLWhhdmUgZXhwZXJpZW5jZWQgYSBudW1iZXIgb2YgcHJvYmxlbXMgYWxvbmcgdGhlIHdheS4gIFRoZSBmaXJzdCBpcwotbWVyZWx5IGEgdGVjaG5pY2FsIGlzc3VlLS1pdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBtZWNoYW5pc20gZm9yCi1idWlsZGluZyBzdGF0aWMgZXh0ZW5zaW9ucyB0byBQeXRob24gd2VyZSBtYWRlIGVhc2llci4gIFdoaWxlIHdlIGFyZQotY3VycmVudGx5IHVzaW5nIGR5bmFtaWMgbG9hZGluZywgbWFueSBtYWNoaW5lcywgZXNwZWNpYWxseQotc3VwZXJjb21wdXRpbmcgc3lzdGVtcywgZG8gbm90IHN1cHBvcnQgaXQuICBPbiB0aGVzZSBtYWNoaW5lcyBpdCBpcwotbmVjZXNzYXJ5IHRvIHN0YXRpY2x5IGxpbmsgZXZlcnl0aGluZy4gIExpYnJhcmllcyBoZWxwIHNpbXBsaWZ5IHRoZQotdGFzaywgYnV0IGNvbWJpbmluZyBkaWZmZXJlbnQgc3RhdGljYWxseSBsaW5rZWQgbW9kdWxlcyB0b2dldGhlciBpbnRvCi1hIHNpbmdsZSBQeXRob24gaW50ZXJwcmV0ZXIgc3RpbGwgcmVtYWlucyBtYWdpY2FsIGFuZCBzb21ld2hhdAotcHJvYmxlbWF0aWMgKGVzcGVjaWFsbHkgc2luY2Ugd2UgYXJlIGNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQKLWNoYW5nZXMgYSBsb3QtLW5vdCBtZXJlbHkgdHJ5aW5nIHRvIHBhdGNoIHRoZSBQeXRob24gY29yZSB3aXRoIGEgbmV3Ci1leHRlbnNpb24gbW9kdWxlKS4KLQotPHA+Ci1BIHNlY29uZCBwcm9ibGVtIGlzIHRoYXQgb2YgZWR1Y2F0aW9uLS13ZSBoYXZlIGZvdW5kIHRoYXQgc29tZSB1c2VycwotaGF2ZSBhIHZlcnkgZGlmZmljdWx0IHRpbWUgbWFraW5nIHNlbnNlIG9mIHRoZSBzeXN0ZW0gKGV2ZW4gd2UncmUKLXNvbWV3aGF0IGFtYXplZCB0aGF0IGl0IHJlYWxseSB3b3JrcykuCi1JbnRlcmVzdGluZ2x5IGVub3VnaCwgdGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlCi11c2Ugb2YgQyBjb2RlIG9yIFB5dGhvbiBmb3IgdGhhdCBtYXR0ZXIsIGJ1dCB0byBpc3N1ZXMgcmVsYXRlZCB0byB0aGUKLWNvbmZpZ3VyYXRpb24sIGNvbXBpbGF0aW9uLCBkZWJ1Z2dpbmcsIGFuZCBpbnN0YWxsYXRpb24gb2YgbW9kdWxlcy4gIFdoaWxlIG1vc3QKLXVzZXJzIGhhdmUgd3JpdHRlbiBwcm9ncmFtcyBiZWZvcmUsIHRoZXkgaGF2ZSBuZXZlciBkZWFsdCB3aXRoIHNoYXJlZAotbGlicmFyaWVzLCBhdXRvbWF0ZWQgY29kZSBnZW5lcmF0b3JzLCBoaWdoLWxldmVsIGxhbmd1YWdlcywgYW5kIHRoaXJkLXBhcnR5IHBhY2thZ2VzCi1zdWNoIGFzIFB5dGhvbi4gIEluIG90aGVyIGNhc2VzLCB0aGVyZSBzZWVtcyB0byBiZSBhCi0iZmVhciBvZiBhdXRvY29uZiItLWlmIGEgcHJvZ3JhbSByZXF1aXJlcyBhIGNvbmZpZ3VyZSBzY3JpcHQsIGl0IG11c3QKLWJlIHRvbyBjb21wbGljYXRlZCB0byB1bmRlcnN0YW5kICh3aGljaCBpcyBub3QgdGhlIGNhc2UKLWhlcmUpLiAgVGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlCi1mYWN0b3JzIGhhcyBsZWQgc29tZSB1c2VycyB0byBiZWxpZXZlIHRoYXQgdGhlIHN5c3RlbSBpcyBmYXIgbW9yZQotY29tcGxpY2F0ZWQgYW5kIGZyYWdpbGUgdGhhbiBpdCByZWFsbHkgaXMuICBXZSdyZSBub3Qgc3VyZSBob3cgdG8gY29tYmF0Ci10aGlzIHByb2JsZW0gb3RoZXIgdGhhbiB0byB0cnkgYW5kIGVkdWNhdGUgdGhlIHVzZXJzCi0oaS5lLiBpdCdzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGNvZGUgYXMgYmVmb3JlLCBidXQgd2l0aCBhIHJlYWxseSBjb29sCi1oYWNrKS4KLQotPGgyPiBDb25jbHVzaW9ucyBhbmQgRnV0dXJlIFdvcmsgPC9oMj4KLQotUHl0aG9uIGlzIGNvb2wgYW5kIHdlIHBsYW4gdG8ga2VlcCB1c2luZyBpdC4gSG93ZXZlciBtdWNoIHdvcmsKLXJlbWFpbnMuICBPbmUgb2YgdGhlIG1vcmUgZXhjaXRpbmcgYXNwZWN0cyBvZiBQeXRob24gaXMgaXRzIHNvbGlkCi1zdXBwb3J0IGZvciBtb2R1bGFyIHByb2dyYW1taW5nIGFuZCB0aGUgY3VsdHVyZSBvZiBjb29wZXJhdGlvbiBpbiB0aGUKLVB5dGhvbiBjb21tdW5pdHkuIFRoZXJlIGFyZSBhbHJlYWR5IG1hbnkgUHl0aG9uLXJlbGF0ZWQgc2NpZW50aWZpYwotY29tcHV0aW5nIHByb2plY3RzIHVuZGVyd2F5LiAgSWYgdGhlc2UgZWZmb3J0cyB3ZXJlIGNvb3JkaW5hdGVkIAotaW4gc29tZSBtYW5uZXIsIHdlIGZlZWwgdGhhdCB0aGUgcmVzdWx0cyBjb3VsZCBiZSBzcGVjdGFjdWxhci4KLQotPGgyPiBBY2tub3dsZWRnbWVudHMgPC9oMj4KLQotV2Ugd291bGQgbGlrZSBhY2tub3dsZWRnZSBvdXIgY29sbGFib3JhdG9ycyBCcmFkIEhvbGlhbiwgVGltIEdlcm1hbm4sIFNodWppYSBaaG91LCBhbmQgV2Fuc2h1IEh1YW5nIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4gIFdlIHdvdWxkIGFsc28gbGlrZQotdG8gYWNrbm93bGVkZ2UgUGF1bCBEdWJvaXMgYW5kIEJyaWFuIFlhbmcgYXQgTGF3cmVuY2UgTGl2ZXJtb3JlCi1OYXRpb25hbCBMYWJvcmF0b3J5IGZvciBtYW55IGludGVyZXN0aW5nIGNvbnZlcnNhdGlvbnMgY29uY2VybmluZyBQeXRob24KLWFuZCBpdHMgdXNlIGluIHBoeXNpY3MgYXBwbGljYXRpb25zLiAgV2Ugd291bGQgYWxzbyBsaWtlIHRvCi1hY2tub3dsZWRnZSB0aGUgU2NpZW50aWZpYyBDb21wdXRpbmcgYW5kIEltYWdpbmcgR3JvdXAgYXQgdGhlCi1Vbml2ZXJzaXR5IG9mIFV0YWggZm9yIHRoZWlyIGNvbnRpbnVlZCBzdXBwb3J0LiAgRmluYWxseSwgd2UnZCBsaWtlIHRvCi10aGFuayB0aGUgZW50aXJlIFB5dGhvbiBkZXZlbG9wbWVudCBjb21tdW5pdHkgZm9yIG1ha2luZyBhIHRydWx5Ci1hd2Vzb21lIHRvb2wgZm9yIHNvbHZpbmcgcmVhbCBwcm9ibGVtcy4gIERldmVsb3BtZW50IG9mIHRoZSBTUGFTTSBjb2RlCi1oYXMgYmVlbiBwZXJmb3JtZWQgdW5kZXIgdGhlIGF1c3BpY2VzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIERlcGFydG1lbnQKLW9mIEVuZXJneS4KLQotPGgyPiBSZWZlcmVuY2VzIDwvaDI+Ci0KLTxwPgotWzFdIEQuTS5CZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwsICJNZXNzYWdlCi1QYXNzaW5nIE11bHRpLUNlbGwgTW9sZWN1bGFyIER5bmFtaWNzIG9uIHRoZSBDb25uZWN0aW9uIE1hY2hpbmUgNSwiCi1QYXJhbGxlbCBDb21wdXRpbmcgMjAgKDE5OTQpLCBwLiAxNzMtMTk1LiA8cD4KLQotPHA+Ci1bMl0gUC5TLkxvbWRhaGwsIFAuVGFtYXlvLCBOLkdyb25iZWNoLUplbnNlbiwKLWFuZCBELk0uQmVhemxleSwgIjUwIEdmbG9wcyBNb2xlY3VsYXIgRHluYW1pY3Mgb24gdGhlIENNLTUsIiBQcm9jZWVkaW5ncwotb2YgU3VwZXJjb21wdXRpbmcgOTMsIElFRUUgQ29tcHV0ZXIgU29jaWV0eSAoMTk5MyksIHAuNTIwLTUyNy4gPHA+Ci0KLTxwPgotWzNdIFMuSi5aaG91LCBELk0uIEJlYXpsZXksIFAuUy4gTG9tZGFobCwgQi5MLiBIb2xpYW4sIFBoeXNpY2FsIFJldmlldwotTGV0dGVycy4gNzgsIDQ3OSAoMTk5NykuCi0KLTxwPgotWzRdIFAuIER1Ym9pcywgSy4gSGluc2VuLCBhbmQgSi4gSHVndW5pbiwgQ29tcHV0ZXJzIGluIFBoeXNpY3MgKDEwKSwgKDE5OTYpCi1wLiAyNjItMjY3LgotCi08cD4KLVs1XSBELiBNLiBCZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwsICJFeHRlbnNpYmxlIE1lc3NhZ2UgUGFzc2luZyBBcHBsaWNhdGlvbgotRGV2ZWxvcG1lbnQgYW5kIERlYnVnZ2luZyB3aXRoIFB5dGhvbiIsIFByb2NlZWRpbmdzIG9mIElQUFMnOTcsIEdlbmV2YQotU3dpdHplcmxhbmQsIElFRUUgQ29tcHV0ZXIgU29jaWV0eSAoMTk5NykuCi0KLTxwPgotWzZdIFQuLVkuQi4gWWFuZywgRC5NLiBCZWF6bGV5LCBQLiBGLiBEdWJvaXMsIEcuIEZ1cm5pc2gsICJTdGVlcmluZyBPYmplY3Qtb3JpZW50ZWQgQ29tcHV0YXRpb25zIHdpdGgKLVB5dGhvbiIsIFB5dGhvbiBXb3Jrc2hvcCA1LCBXYXNoaW5ndG9uIEQuQy4sIE5vdi4gNC01LCAxOTk2LgotCi08cD4KLVs3XSBELk0uIEJlYXpsZXkgYW5kIFAuUy4gTG9tZGFobCwgIkhpZ2gKLVBlcmZvcm1hbmNlIE1vbGVjdWxhciBEeW5hbWljcyBNb2RlbGluZyB3aXRoIFNQYVNNIDogUGVyZm9ybWFuY2UgYW5kCi1Qb3J0YWJpbGl0eSBJc3N1ZXMsIiBQcm9jZWVkaW5ncyBvZiB0aGUgV29ya3Nob3Agb24gRGVidWdnaW5nIGFuZAotVHVuaW5nIGZvciBQYXJhbGxlbCBDb21wdXRlciBTeXN0ZW1zLCBDaGF0aGFtLCBNQSwgMTk5NCAoSUVFRSBDb21wdXRlcgotU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQSwgMTk5NiksIHBwLiAzMzctMzUxLgotCi08cD4KLVs4XSBELk0uIEJlYXpsZXksICJVc2luZyBTV0lHIHRvIENvbnRyb2wsIFByb3RvdHlwZSwgYW5kIERlYnVnIEMgUHJvZ3JhbXMgd2l0aCBQeXRob24iLAotUHJvY2VlZGluZ3Mgb2YgdGhlIDR0aCBJbnRlcm5hdGlvbmFsIFB5dGhvbiBDb25mZXJlbmNlLCBMYXdyZW5jZSBMaXZlcm1vcmUgCi1OYXRpb25hbCBMYWJvcmF0b3J5LCBKdW5lIDMtNiwgMTk5Ni4gCi0KLTxwPgotWzldIEsuIEhpbnNlbiwgVGhlIE1vbGVjdWxhciBNb2RlbGluZyBUb29sa2l0LCA8dHQ+aHR0cDovL3N0YXJzaGlwLnNreXBvcnQubmV0L2NyZXcvaGluc2VuL21tdGsuaHRtbDwvdHQ+Ci0KLTxwPgotWzEwXSBKaW0gSHVndW5pbiwgTnVtZXJpYyBQeXRob24sIDx0dD5odHRwOi8vd3d3LnNscy5sY3MubWl0LmVkdS9qamgvbnVtcHk8L3R0PgotCi08cD4KLVsxMV0gRnJlZHJpayBMdW5kaCwgUHl0aG9uIEltYWdpbmcgTGlicmFyeSwgPHR0Pmh0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2ltYWdlLXNpZy9JbWFnaW5nLmh0bWw8L3R0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ny9iZWF6bGV5Lmh0bWwgYi9zd2lnd2ViL3BhcGVycy9QeTk3L2JlYXpsZXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIzMjJjNC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QeTk3L2JlYXpsZXkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2MyArMCwwIEBACi08aHRtbD4KLTx0aXRsZT4gRmVlZGluZyBhIExhcmdlLXNjYWxlIFBoeXNpY3MgQXBwbGljYXRpb24gdG8gUHl0aG9uIDwvdGl0bGU+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLQotPGgxPiBGZWVkaW5nIGEgTGFyZ2Utc2NhbGUgUGh5c2ljcyBBcHBsaWNhdGlvbiB0byBQeXRob24gPC9oMT4KLQotRGF2aWQgTS4gQmVhemxleSA8YnI+Ci1EZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBVdGFoIDxicj4KLVNhbHQgTGFrZSBDaXR5LCBVdGFoICA4NDExMiA8YnI+Ci08dHQ+IGJlYXpsZXlAY3MudXRhaC5lZHUgPC90dD4gPGJyPgotPHA+Ci1QZXRlciBTLiBMb21kYWhsIDxicj4KLVRoZW9yZXRpY2FsIERpdmlzaW9uIDxicj4KLUxvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSA8YnI+Ci1Mb3MgQWxhbW9zLCBOZXcgTWV4aWNvICAgODc1NDUgPGJyPgotPHR0PiBweGxAbGFubC5nb3YgPC90dD4gPGJyPgotCi08cD4KLShQcmVzZW50ZWQgYXQgdGhlIDZ0aCBJbnRlcm5hdGlvbmFsIFB5dGhvbiBDb25mZXJlbmNlLCBTYW4gSm9zZSwgQ2FsaWZvcm5pYS4gT2N0b2JlciAxNC0xNywgMTk5NykuCi0KLTxoMj4gQWJzdHJhY3QgPC9oMj4KLQotPGVtPgotV2UgZGVzY3JpYmUgb3VyIGV4cGVyaWVuY2VzIHVzaW5nIFB5dGhvbiB3aXRoIHRoZSBTUGFTTSBtb2xlY3VsYXIKLWR5bmFtaWNzIGNvZGUgYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LiAgT3JpZ2luYWxseSBkZXZlbG9wZWQKLWFzIGEgbGFyZ2UgbW9ub2xpdGhpYyBhcHBsaWNhdGlvbiBmb3IgbWFzc2l2ZWx5IHBhcmFsbGVsIHByb2Nlc3NpbmcKLXN5c3RlbXMsIHdlIGhhdmUgdXNlZCBQeXRob24gdG8gdHJhbnNmb3JtIG91ciBhcHBsaWNhdGlvbiBpbnRvIGEKLWZsZXhpYmxlLCBoaWdobHkgbW9kdWxhciwgYW5kIGV4dHJlbWVseSBwb3dlcmZ1bCBzeXN0ZW0gZm9yIHBlcmZvcm1pbmcKLXNpbXVsYXRpb24sIGRhdGEgYW5hbHlzaXMsIGFuZCB2aXN1YWxpemF0aW9uLiAgSW4gYWRkaXRpb24sIHdlCi1kZXNjcmliZSBob3cgUHl0aG9uIGhhcyBzb2x2ZWQgYSBudW1iZXIgb2YgaW1wb3J0YW50IHByb2JsZW1zIHJlbGF0ZWQKLXRvIHRoZSBkZXZlbG9wbWVudCwgZGVidWdnaW5nLCBkZXBsb3ltZW50LCBhbmQgbWFpbnRlbmFuY2Ugb2YKLXNjaWVudGlmaWMgc29mdHdhcmUuIDwvZW0+Ci0KLTxoMj4gQmFja2dyb3VuZCA8L2gyPgotCi1Gb3IgdGhlIHBhc3QgNSB5ZWFycywgd2UgaGF2ZSBiZWVuIGRldmVsb3BpbmcgYSBsYXJnZS1zY2FsZSBwaHlzaWNzCi1jb2RlIGZvciBwZXJmb3JtaW5nIG1vbGVjdWxhci1keW5hbWljcyBzaW11bGF0aW9ucyBvZgotbWF0ZXJpYWxzLiAgVGhpcyBjb2RlLCBTUGFTTSAoU2NhbGFibGUgUGFyYWxsZWwgU2hvcnQtcmFuZ2UKLU1vbGVjdWxhci1keW5hbWljcyksIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBmb3IgdGhlIENvbm5lY3Rpb24KLU1hY2hpbmUgNSBtYXNzaXZlbHkgcGFyYWxsZWwgc3VwZXJjb21wdXRpbmcgc3lzdGVtIGFuZCBsYXRlciBtb3ZlZCB0bwotYSBudW1iZXIgb2Ygb3RoZXIgbWFjaGluZXMgaW5jbHVkaW5nIHRoZSBDcmF5IFQzRCwgbXVsdGlwcm9jZXNzb3IgU3VuCi1hbmQgU0dJIHN5c3RlbXMsIGFuZCBVbml4IHdvcmtzdGF0aW9ucyBbMSwyXS4gIE91ciBnb2FsIGhhcwotYmVlbiB0byBpbnZlc3RpZ2F0ZSBtYXRlcmlhbCBwcm9wZXJ0aWVzIHN1Y2ggYXMgZnJhY3R1cmUsIGNyYWNrCi1wcm9wYWdhdGlvbiwgZGlzbG9jYXRpb24gZ2VuZXJhdGlvbiwgZnJpY3Rpb24sIGFuZCBkdWN0aWxlLWJyaXR0bGUgdHJhbnNpdGlvbnMgWzNdLgotVGhlIFNQYVNNIGNvZGUKLWhlbHBzIHVzIGludmVzdGlnYXRlIHRoZXNlIHByb2JsZW1zIGJ5IHBlcmZvcm1pbmcgYXRvbWlzdGljCi1zaW11bGF0aW9ucy0tdGhhdCBpcywgd2Ugc2ltdWxhdGUgdGhlIGR5bmFtaWNzIG9mIGV2ZXJ5IGF0b20gaW4gYQotbWF0ZXJpYWwgYW5kIGhvcGUgdG8gbWFrZSBzZW5zZSBvZiB3aGF0IGhhcHBlbnMuICBPZiBjb3Vyc2UsIHRoZQotdW5kZXJseWluZyBwaHlzaWNzIGlzIG5vdCBzbyBpbXBvcnRhbnQgZm9yIHRoaXMgZGlzY3Vzc2lvbi4KLQotPHA+Ci1XaGlsZSB0aGUgZGV2ZWxvcG1lbnQgb2YgU1BhU00gaXMgYW4gb25nb2luZyBlZmZvcnQsIHdlCi1oYXZlIGJlZW4gaGFtcGVyZWQgYnkgYSBudW1iZXIgb2Ygc2VyaW91cyBwcm9ibGVtcy4KLUZpcnN0LCB0eXBpY2FsCi1zaW11bGF0aW9ucyBnZW5lcmF0ZSB0ZW5zIHRvIGh1bmRyZWRzIG9mIGdpZ2FieXRlcyBvZiBkYXRhIHRoYXQgbXVzdAotYmUgYW5hbHl6ZWQuIFRoaXMgdGFzayBpcyBub3QgZWFzaWx5IHBlcmZvcm1lZCBvbiBhIHVzZXIncwotd29ya3N0YXRpb24sIG5vciBpcyBpdCBlY29ub21pY2FsbHkgZmVhc2libGUgdG8gYnV5IGV2ZXJ5b25lIHRoZWlyIG93bgotcGVyc29uYWwgZGVza3RvcCBzdXBlcmNvbXB1dGVyLiAgQSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IG9mCi1pbnRlcmFjdGl2aXR5IGFuZCBjb250cm9sLiAgV2UgYXJlIGNvbnN0YW50bHkgbWFraW5nIGNoYW5nZXMgdG8KLWludmVzdGlnYXRlIG5ldyBwaHlzaWNhbCBtb2RlbHMsIGRpZmZlcmVudCBtYXRlcmlhbHMsIGFuZCBzbyBmb3J0aC4KLVRoaXMgd291bGQgdXN1YWxseSByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgQwotY29kZS0tYSBwcm9jZXNzIHRoYXQgd2FzIHRlZGlvdXMgYW5kIG5vdCB2ZXJ5IHVzZXIgZnJpZW5kbHkuIFdlCi13YW50ZWQgYSBtb3JlIGZsZXhpYmxlIG1lY2hhbmlzbS4KLUZpbmFsbHksIHRoZXJlIHdlcmUgbWFueSBkaWZmaWN1bHRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIG9mIG91ciBzb2Z0d2FyZS4gICBXaGlsZSB3ZSBhcmUgb25seSBhIHNtYWxsCi1ncm91cCwgaXQgd2FzIG5vdCB1bmNvbW1vbiBmb3IgZGlmZmVyZW50IHVzZXJzIHRvIGhhdmUgdGhlaXIgCi1vd24gcHJpdmF0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIHRoYXQgaGFkIGJlZW4gbW9kaWZpZWQgaW4gc29tZSBtYW5uZXIuIAotVGhpcywgaW4gdHVybiwgbGVkIHRvIGEgbWFpbnRlbmFuY2UgbmlnaHRtYXJlIHRoYXQgbWFkZSBpdCBhbG1vc3QgaW1wb3NzaWJsZQotdG8gdXBkYXRlIHRoZSBzb2Z0d2FyZSBvciBhcHBseSBidWctZml4ZXMgaW4gYSBjb25zaXN0ZW50IG1hbm5lci4KLQotPHA+Ci1UbyBhZGRyZXNzIHRoZXNlIHByb2JsZW1zLCB3ZSBzdGFydGVkIGludmVzdGlnYXRpbmcgdGhlIHVzZSBvZiBzY3JpcHRpbmcKLWxhbmd1YWdlcy4gIEluIDE5OTUsIHdlIHdyb3RlIGEgc3BlY2lhbCBwdXJwb3NlIHBhcmFsbGVsLXNjcmlwdGluZyBsYW5ndWFnZSwKLWJ1dCByZXBsYWNlZCBpdCB3aXRoIFB5dGhvbiBhIHllYXIgbGF0ZXIgKGFsdGhvdWdoIHRoZSBpbnRlcmZhY2UKLWdlbmVyYXRpb24gdG9vbCBmb3IgdGhhdCBzY3JpcHRpbmcgbGFuZ3VhZ2UgbGl2ZXMgb24gYXMgU1dJRykuICBJbiB0aGlzCi1wYXBlciwgd2UgaG9wZSB0byBkZXNjcmliZSBzb21lIG9mIG91ciBleHBlcmllbmNlcyB3aXRoIFB5dGhvbiBhbmQgaG93Ci1pdCBoYXMgaGVscGVkIHVzIHNvbHZlIHByYWN0aWNhbCBzY2llbnRpZmljIGNvbXB1dGluZyBwcm9ibGVtcy4gICBJbiBwYXJ0aWN1bGFyLAotd2UgZGVzY3JpYmUgdGhlIG9yZ2FuaXphdGlvbiBvZiBvdXIgc3lzdGVtLCBtb2R1bGUgYnVpbGRpbmcgcHJvY2VzcywKLWludGVyZXN0aW5nIHRvb2xzIHRoYXQgUHl0aG9uIGhhcyBoZWxwZWQgdXMgZGV2ZWxvcCwgYW5kIHdoeSB3ZSB0aGluayB0aGlzCi1hcHByb2FjaCBpcyBwYXJ0aWN1bGFybHkgd2VsbC1zdWl0ZWQgZm9yIHNjaWVudGlmaWMgY29tcHV0aW5nIHJlc2VhcmNoLgotCi08aDI+IFdoeSBQeXRob24/IDwvaDI+Ci0KLUFsdGhvdWdoIG91ciBjb2RlIG9yaWdpbmFsbHkgdXNlZCBhIGN1c3RvbSBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHdlIGRlY2lkZWQKLXRvIHN3aXRjaCB0byBQeXRob24gZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMgOgotCi08cD4KLTx1bD4KLTxsaT4gRmVhdHVyZXMuICBQeXRob24gaGFkIGEgcmljaCBzZXQgb2YgZGF0YXR5cGVzLCBzdXBwb3J0IGZvcgotb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nLCBuYW1lc3BhY2VzLCBleGNlcHRpb25zLCBkeW5hbWljIGxvYWRpbmcsCi1hbmQgYSBsYXJnZSBudW1iZXIgb2YgdXNlZnVsIG1vZHVsZXMuCi08bGk+IFN5bnRheC4gIE91ciBzeXN0ZW0gaXMgY29udHJvbGxlZCB0aHJvdWdoCi10ZXh0LWJhc2VkIGNvbW1hbmRzIGFuZCBzY3JpcHRzLiAgV2UgZmVsdCB0aGF0IFB5dGhvbiBoYWQgYSBuaWNlCi1zeW50YXggdGhhdCBkb2VzIG5vdCByZXF1aXJlIHVzZXJzIHRvCi10eXBlIHdlaXJkIHN5bWJvbHMgKCQsJSxALCBldGMuLi4pIG9yIHVzZSBzeW50YXggdGhhdCBpcyByYWRpY2FsbHkKLWRpZmZlcmVudCB0aGFuIEMuCi08bGk+IEEgc21hbGwgY29yZS4gIFRoZSBtb2R1bGFyIHN0cnVjdHVyZSBvZiBQeXRob24gbWFrZXMgaXQgZWFzeSBmb3IgdXMKLXRvIHJlbW92ZSBvciBhZGQgbW9kdWxlcyBhcyBuZWVkZWQuICAgR2l2ZW4gdGhlIGRpZmZpY3VsdCB0YXNrIG9mIHJ1bm5pbmcKLW9uIHBhcmFsbGVsIG1hY2hpbmVzIGFuZCBzdXBlcmNvbXB1dGVycywgd2UgZmVsdCB0aGF0IHRoaXMgc3RydWN0dXJlCi13b3VsZCBtYWtlIGl0IGVhc2llciBmb3IgdXMgdG8gcG9ydCBQeXRob24gdG8gYSB2YXJpZXR5IG9mIHNwZWNpYWwtcHVycG9zZQotbWFjaGluZXMgKHNpbmNlIHdlIGNvdWxkIGp1c3QgcmVtb3ZlIHByb2JsZW1hdGljIG1vZHVsZXMpLgotPGxpPiBBdmFpbGFiaWxpdHkgb2YgZG9jdW1lbnRhdGlvbi4gICBVc2VycyBjb3VsZCBnbyB0byB0aGUgYm9va3N0b3JlIAotdG8gZmluZCBvdXQgbW9yZSBhYm91dCBQeXRob24uCi08bGk+IFN1cHBvcnQgYW5kIHN0YWJpbGl0eS4gIFB5dGhvbiBhcHBlYXJlZCB0byBiZSBoaWdobHkgc3RhYmxlIGFuZAotd2VsbCBzdXBwb3J0ZWQgdGhyb3VnaCBuZXdzZ3JvdXBzLCBzcGVjaWFsIGludGVyZXN0IGdyb3VwcywgYW5kIHRoZSBQU0EuCi08bGk+IEZyZWVseSBhdmFpbGFibGUuICBXZSBoYXZlIGJlZW4gYWJsZSB0bwotdXNlIGFuZCBtb2RpZnkgUHl0aG9uIGFzIG5lZWRlZCBmb3Igb3VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3b3VsZCBoYXZlCi1iZWVuIGltcG9zc2libGUgd2l0aG91dCBhY2Nlc3MgdG8gdGhlIFB5dGhvbiBzb3VyY2UuCi08L3VsPgotCi08cD4KLUFub3RoZXIgZmFjdG9yLCBub3QgdG8gYmUgb3Zlcmxvb2tlZCwgaXMgdGhlIGluY3JlYXNpbmcgYWNjZXB0YW5jZSBvZgotUHl0aG9uIGVsc2V3aGVyZSBpbiB0aGUgY29tcHV0YXRpb25hbCBzY2llbmNlIGNvbW11bml0eS4gIEVmZm9ydHMgYXQKLUxhd3JlbmNlIExpdmVybW9yZSBOYXRpb25hbCBMYWJvcmF0b3J5IGFuZCBlbHNld2hlcmUgd2VyZQotYXR0cmFjdGl2ZS0taW4gcGFydGljdWxhciwgd2Ugc2F3IFB5dGhvbiBhcyBiZWluZyBhIHBvdGVudGlhbCB2ZWhpY2xlCi1mb3Igc2hhcmluZyBtb2R1bGVzIGFuZCB1dGlsaXppbmcgdGhpcmQtcGFydHkgdG9vbHMgWzQsOSwxMF0uCi0KLTxoMj4gU3lzdGVtIE9yZ2FuaXphdGlvbiA8L2gyPgotCi1PdXIgZ29hbCB3YXMgdG8gYnVpbGQgYSBoaWdobHkgbW9kdWxhciBzeXN0ZW0gdGhhdCBjb3VsZCBwZXJmb3JtCi1zaW11bGF0aW9uLCBkYXRhIGFuYWx5c2lzLCBhbmQgdmlzdWFsaXphdGlvbi0tb2Z0ZW4gcGVyZm9ybWluZwotYWxsIG9mIHRoZXNlIHRhc2tzIHNpbXVsdGFuZW91c2x5LiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgYSB0ZW5kZW5jeQotdG8gZG8gdGhpcyBieSBidWlsZGluZyBhIHRpZ2h0bHkgaW50ZWdyYXRlZAotbW9ub2xpdGhpYyBwYWNrYWdlIChwZXJoYXBzIHVzaW5nIGEgd2VsbC1zdHJ1Y3R1cmVkIEMrKyBjbGFzcwotaGllcmFyY2h5IGZvciBleGFtcGxlKS4gIEluIG91ciB2aWV3LCB0aGlzIGlzIHRvbwotZm9ybWFsIGFuZCByZXN0cmljdGl2ZS4gIFdlIHdhbnRlZCB0byBzdXBwb3J0IG1vZHVsZXMgdGhhdCBtaWdodCBvbmx5Ci1iZSBsb29zZWx5IHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEZvciBleGFtcGxlLCB0aGVyZSBpcyBubyBuZWVkIGZvciBhCi1ncmFwaGljcyBsaWJyYXJ5IHRvIGRlcGVuZCBvbiB0aGUgc2FtZSBzdHJ1Y3R1cmVzIGFzIGEgc2ltdWxhdGlvbiBjb2RlCi1vciB0byBldmVuIGJlIHdyaXR0ZW4gaW4gdGhlIHNhbWUgbGFuZ3VhZ2UgZm9yIHRoYXQgbWF0dGVyLiAgTGlrZXdpc2UsCi13ZSB3YW50ZWQgdG8gZXhwbG9pdCB0aGlyZC1wYXJ0eSBtb2R1bGVzIHdoZXJlIG5vIGFzc3VtcHRpb25zIAotY291bGQgYmUgbWFkZSBhYm91dCB0aGVpciBpbnRlcm5hbCBzdHJ1Y3R1cmUuCi0KLTxwPgotVGhlIG1ham9yIGNvbXBvbmVudHMgb2Ygb3VyIHN5c3RlbSB0YWtlIHRoZSBmb3JtIG9mIEMgbGlicmFyaWVzLiAgV2hlbgotUHl0aG9uIGlzIHVzZWQsIHRoZSBsaWJyYXJpZXMgYXJlIGNvbXBpbGVkIGludG8gc2hhcmVkIGxpYnJhcmllcyBhbmQKLWR5bmFtaWNhbGx5IGxvYWRlZCBpbnRvIFB5dGhvbiBhcyBleHRlbnNpb24gbW9kdWxlcy4gIFRoZQotZnVuY3Rpb25hbGl0eSBvZiBlYWNoIGxpYnJhcnkgaXMgZXhwb3NlZCBhcyBhIGNvbGxlY3Rpb24gb2YgUHl0aG9uCi0iY29tbWFuZHMuIiAgQmVjYXVzZSBvZiB0aGlzLCB0aGUgQyBhbmQgUHl0aG9uIHByb2dyYW1taW5nCi1lbnZpcm9ubWVudHMgYXJlIGNsb3NlbHkgcmVsYXRlZC4gIEluIG1hbnkgY2FzZXMsIGl0IGlzIHBvc3NpYmxlIHRvCi1pbXBsZW1lbnQgdGhlIHNhbWUgY29kZSBpbiBib3RoIEMgb3IgUHl0aG9uLiBGb3IgZXhhbXBsZSA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PjxwcmU+Ci0vKiBBIHNpbXBsZSBmdW5jdGlvbiB3cml0dGVuIGluIEMgKi8KLSNpbmNsdWRlICJTUGFTTS5oIgotdm9pZCBydW4oaW50IG5zdGVwcywgZG91YmxlIER0LCBpbnQgZnJlcSkgewotICAgIGludCBpOwotICAgIGNoYXIgZmlsZW5hbWVbNjRdOwotICAgIGZvciAoaSA9IDA7IGkgPCBuc3RlcHM7IGkrKykgewotICAgICAgICAgaW50ZWdyYXRlX2Fkdl9jb29yZChEdCk7Ci0gICAgICAgICBib3VuZGFyeV9wZXJpb2RpYygpOwotICAgICAgICAgcmVkaXN0cmlidXRlKCk7Ci0gICAgICAgICBmb3JjZV9lYW0oKTsKLSAgICAgICAgIGludGVncmF0ZV9hZHZfdmVsb2NpdHkoRHQpOwotICAgICAgICAgaWYgKChpICUgZnJlcSkgPT0gMCkgewotICAgICAgICAgICAgc3ByaW50ZihmaWxlbmFtZSwiRGF0JWQiLGkpOwotICAgICAgICAgICAgb3V0cHV0X3BhcnRpY2xlcyhmaWxlbmFtZSk7Ci0gICAgICAgICB9Ci0gICAgfQotfTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLSAgICAgICAgCi1Ob3csIGluIFB5dGhvbiA6Ci0KLTxibG9ja3F1b3RlPjx0dD48cHJlPgotIyBBIGZ1bmN0aW9uIHdyaXR0ZW4gaW4gUHl0aG9uCi1mcm9tIFNQYVNNIGltcG9ydCAqCi1kZWYgcnVuKG5zdGVwcywgRHQsIGZyZXEpOgotICAgIGZvciBpIGluIHhyYW5nZSgwLCBuc3RlcHMpOgotICAgICAgICAgaW50ZWdyYXRlX2Fkdl9jb29yZChEdCkKLSAgICAgICAgIGJvdW5kYXJ5X3BlcmlvZGljKCkKLSAgICAgICAgIHJlZGlzdHJpYnV0ZSgpCi0gICAgICAgICBmb3JjZV9lYW0oKQotICAgICAgICAgaW50ZWdyYXRlX2Fkdl92ZWxvY2l0eShEdCkKLSAgICAgICAgIGlmIChpICUgZnJlcSkgPT0gMCkgOgotICAgICAgICAgICAgb3V0cHV0X3BhcnRpY2xlcygnRGF0JytzdHIoaSkpCi08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLVdoaWxlIEMgbGlicmFyaWVzIHByb3ZpZGUgbXVjaCBvZiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbmFsaXR5LCB0aGUgcmVhbCBwb3dlcgotb2YgdGhlIHN5c3RlbSBjb21lcyBpbiB0aGUgZm9ybSBvZiBtb2R1bGVzIGFuZCBzY3JpcHRzIHdyaXR0ZW4gZW50aXJlbHkgaW4gUHl0aG9uLgotVXNlcnMgd3JpdGUgc2NyaXB0cyB0byBzZXQgdXAgYW5kIGNvbnRyb2wgc2ltdWxhdGlvbnMuICBTZXZlcmFsIG1ham9yCi1jb21wb25lbnRzIHN1Y2ggYXMgdGhlIHZpc3VhbGl6YXRpb24gYW5kIGRhdGEtYW5hbHlzaXMgc3lzdGVtIG1ha2UgaGVhdnkKLXVzZSBvZiBQeXRob24uICBXZSBhbHNvIHV0aWxpemUgYSB2YXJpZXR5IG9mIG1vZHVsZXMgaW4gdGhlIFB5dGhvbgotbGlicmFyeSBhbmQgaGF2ZSBkeW5hbWljYWxseSBsb2FkYWJsZSB2ZXJzaW9ucyBvZiBUa2ludGVyIGFuZCB0aGUKLVB5dGhvbiBJbWFnaW5nIExpYnJhcnkgWzExXS4KLQotPGgyPiBFbWJlZGRpbmcgUHl0aG9uIGFuZCBIaWRpbmcgU3lzdGVtIERlcGVuZGVuY2llcyA8L2gyPgotCi1PbmUgb2YgdGhlIGJpZ2dlc3QgaW1wbGVtZW50YXRpb24gcHJvYmxlbXMgd2UgaGF2ZSBlbmNvdW50ZXJlZCBpcyB0aGUKLWZhY3QgdGhhdCB0aGUgU1BhU00gY29kZSBpcyBhIHBhcmFsbGVsIGFwcGxpY2F0aW9uIHRoYXQgcmVsaWVzIGhlYXZpbHkKLXVwb24gdGhlIHByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiBsb3ctbGV2ZWwgc3lzdGVtIHNlcnZpY2VzIHN1Y2ggYXMKLUkvTyBhbmQgcHJvY2VzcyBtYW5hZ2VtZW50LiBDdXJyZW50bHksIGl0IGlzIHBvc3NpYmxlIHRvIHJ1biB0aGUgY29kZQotaW4gdHdvIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy0tb25lIHRoYXQgdXNlcyBtZXNzYWdlIHBhc3NpbmcgdmlhIHRoZQotTVBJIGxpYnJhcnkgYW5kIGFub3RoZXIgdXNpbmcgU29sYXJpcyB0aHJlYWRzLiAgVXNpbmcgUHl0aG9uIHdpdGgKLWJvdGggdmVyc2lvbnMgb2YgY29kZSByZXF1aXJlcyBhIGRlZ3JlZSBvZiBjYXJlLS1pbiBwYXJ0aWN1bGFyLCB3ZQotaGF2ZSBmb3VuZCBpdCB0byBiZSBuZWNlc3NhcnkgdG8gcHJvdmlkZSBQeXRob24gd2l0aCBlbmhhbmNlZCBJL08KLXN1cHBvcnQgdG8gcnVuIHByb3Blcmx5IGluIHBhcmFsbGVsLiAgVGhpcyB3b3JrIGhhcyBiZWVuIGRlc2NyaWJlZAotZWxzZXdoZXJlIFs1LDZdLgotCi08cD4KLUhhbmRsaW5nIHR3byBvcGVyYXRpb25hbCBtb2RlcyBpbnRyb2R1Y2VzIGEgbnVtYmVyIG9mIHByb2JsZW1zIHJlbGF0ZWQKLXRvIGNvZGUgbWFpbnRlbmFuY2UgYW5kIGluc3RhbGxhdGlvbi4gIFRyYWRpdGlvbmFsbHksIHdlIHdvdWxkCi1yZWNvbXBpbGUgdGhlIGVudGlyZSBzeXN0ZW0gYW5kIGFsbCBvZiBpdHMgbW9kdWxlcyBmb3IgZWFjaAotY29uZmlndXJhdGlvbiAocGxhY2luZyB0aGUgZmlsZXMgaW4gYW4gYXJjaGl0ZWN0dXJlIGRlcGVuZGVudAotc3ViZGlyZWN0b3J5KS4gIFVzZXJzIHdvdWxkIGhhdmUgdG8gZGVjaWRlIHdoaWNoIHN5c3RlbSB0aGV5IHdhbnRlZCB0bwotdXNlIGFuZCBjb21waWxlIGFsbCBvZiB0aGVpciBtb2R1bGVzIGJ5IGxpbmtpbmcgYWdhaW5zdCB0aGUKLWFwcHJvcHJpYXRlIGxpYnJhcmllcyBhbmQgc2V0dGluZyB0aGUgcmlnaHQgY29tcGlsZS10aW1lIG9wdGlvbnMuCi1DaGFuZ2luZyBjb25maWd1cmF0aW9ucyB3b3VsZCB0eXBpY2FsbHkgcmVxdWlyZSBhIGNvbXBsZXRlIHJlY29tcGlsZS4KLQotPHA+Ci1XaXRoIGR5bmFtaWMgbG9hZGluZyBhbmQgc2hhcmVkIGxpYnJhcmllcyBob3dldmVyLCB3ZSBoYXZlIGJlZW4gYWJsZQotdG8gZGV2aXNlIGEgZGlmZmVyZW50IGFwcHJvYWNoIHRvIHRoaXMgcHJvYmxlbS4gIFJhdGhlcgotdGhhbiByZWNvbXBpbGluZyBldmVyeXRoaW5nIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIHdlIHVzZSBhbgotaW1wbGVtZW50YXRpb24gaW5kZXBlbmRlbnQgbGF5ZXIgb2Ygc3lzdGVtIHdyYXBwZXJzLiAgVGhlc2Ugd3JhcHBlcnMKLXByb3ZpZGUgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIG1lc3NhZ2UgcGFzc2luZywgcGFyYWxsZWwgSS9PLCBhbmQKLXRocmVhZCBtYW5hZ2VtZW50LiAgQWxsIG9mIHRoZSBjb3JlIG1vZHVsZXMgYXJlIHRoZW4gY29tcGlsZWQKLXVzaW5nIHRoZXNlIGdlbmVyaWMgd3JhcHBlcnMuICAgVGhpcyBtYWtlcyB0aGUgbW9kdWxlcyBpbmRlcGVuZGVudAotb2YgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uYWwgbW9kZS0tLXRvIHVzZSBNUEkgb3IgdGhyZWFkcywgIHdlIHNpbXBseQotbmVlZCB0byBzdXBwbHkgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlICBzeXN0ZW0gd3JhcHBlciBsaWJyYXJpZXMuCi1UaGlzIGlzIGVhc2lseSBhY2NvbXBsaXNoZWQgYnkgYnVpbGRpbmcgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZgotUHl0aG9uIHRoYXQgYXJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0gbGlicmFyaWVzLiAKLVRvIHJ1biBpbiBhIHBhcnRpY3VsYXIgbW9kZSwgd2Ugbm93IGp1c3QgcnVuIHRoZSBhcHByb3ByaWF0ZQotdmVyc2lvbiBvZiBQeXRob24gKGkuZS4gJ3B5dGhvbicgb3IgJ3B5dGhvbm1waScpLiAgVGhlIG5lYXQgCi1wYXJ0IGFib3V0IHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBhbGwgb2YgdGhlIG1vZHVsZXMgd29yayB3aXRoIGJvdGgKLW9wZXJhdGlvbmFsIG1vZGVzIHdpdGhvdXQgYW55IHJlY29tcGlsYXRpb24gb3IgcmVjb25maWd1cmF0aW9uLiAgSWYgYQotdXNlciBpcyB1c2luZyB0aHJlYWRzLCBidXQgd2FudHMgdG8gc3dpdGNoIHRvIE1QSSwgdGhleSBzaW1wbHkgcnVuCi1hIGRpZmZlcmVudCB2ZXJzaW9uIG9mIFB5dGhvbi0tbm8gcmVjb21waWxhdGlvbiBvZiBtb2R1bGVzIGlzIG5lY2Vzc2FyeS4KLQotPHA+Ci1BIGZ1bGwgZGlzY3Vzc2lvbiBvZiB3cml0aW5nIHN5c3RlbS13cmFwcGVycyBjYW4gYmUgZm91bmQgZWxzZXdoZXJlLgotSW4gcGFydGljdWxhciwgYSBkaXNjdXNzaW9uIG9mIHdyaXRpbmcgcGFyYWxsZWwgSS9PIHdyYXBwZXJzIGZvcgotUHl0aG9uIGNhbiBiZSBmb3VuZCBpbiBbNV0uICBBbiBlYXJsaWVyIGRpc2N1c3Npb24gb2YgdGhlIHRlY2huaXF1ZSB3ZQotaGF2ZSB1c2VkIGZvciB3cml0aW5nIG1lc3NhZ2UgcGFzc2luZyBhbmQgSS9PIHdyYXBwZXJzIGNhbiBhbHNvIGJlCi1mb3VuZCBpbiBbN10uCi0KLTxoMj4gTW9kdWxlIEJ1aWxkaW5nIHdpdGggU1dJRyA8L2gyPgotCi1UbyBidWlsZCBtb2R1bGVzLCB3ZSBoYXZlIGJlZW4gdXNpbmcgU1dJRyBbOF0uCi1FYWNoIG1vZHVsZSBpcyBkZXNjcmliZWQgYnkgYSBTV0lHIGludGVyZmFjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIEFOU0kKLUMgZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucywgc3RydWN0dXJlcywgYW5kIHZhcmlhYmxlcyBpbiB0aGF0IG1vZHVsZS4KLUZvciBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8vIFNXSUcgaW50ZXJmYWNlIGZpbGUKLSVtb2R1bGUgU1BhU00KLSV7Ci0jaW5jbHVkZSAiU1BhU00uaCIKLSV9Ci12b2lkIGludGVncmF0ZV9hZHZfY29vcmQoZG91YmxlIER0KTsKLXZvaWQgYm91bmRhcnlfcGVyaW9kaWMoKTsKLXZvaWQgcmVkaXN0cmlidXRlKCk7Ci12b2lkIGZvcmNlX2VhbSgpOwotdm9pZCBpbnRlZ3JhdGVfYWR2X3ZlbG9jaXR5KGRvdWJsZSBEdCk7Ci1pbnQgIG91dHB1dF9wYXJ0aWNsZXMoY2hhciAqZmlsZW5hbWUpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1TV0lHIHByb3ZpZGVzIGEgbG9naWNhbCBtYXBwaW5nIG9mIHRoZSB1bmRlcmx5aW5nIEMgaW1wbGVtZW50YXRpb24gaW50bwotUHl0aG9uLiAgIER1cmluZyBjb21waWxhdGlvbiwgaW50ZXJmYWNlIGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5Ci1jb252ZXJ0ZWQgaW50byB3cmFwcGVyIGNvZGUgYW5kIGNvbXBpbGVkIGludG8gUHl0aG9uIG1vZHVsZXMuICBUaGlzIAotcHJvY2VzcyBpcyBlbnRpcmVseSB0cmFuc3BhcmVudC0tY2hhbmdlcyBtYWRlIHRvIHRoZSBpbnRlcmZhY2UKLWFyZSBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZWQgdG8gUHl0aG9uIHdoZW5ldmVyIGEgbW9kdWxlIGlzIHJlY29tcGlsZWQuCi1HaXZlbiB0aGUgY29uc3RhbnRseSBldm9sdmluZyBuYXR1cmUgb2YgcmVzZWFyY2ggYXBwbGljYXRpb25zLCB0aGlzIG1ha2VzCi1pdCBlYXN5IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4gdGhlIHN5c3RlbS4gIAotCi08aDM+IFNlcGFyYXRpb24gb2YgSW1wbGVtZW50YXRpb24gYW5kIEludGVyZmFjZSA8L2gzPgotCi1BbiBpbXBvcnRhbnQgYXNwZWN0IG9mIFNXSUcgaXMgdGhhdCBpdCBpcyByZXF1aXJlcyBubyBtb2RpZmljYXRpb25zIHRvCi1leGlzdGluZyBDIGNvZGUgd2hpY2ggYWxsb3dzIHVzIHRvIG1haW50YWluIGEgc3RyaWN0Ci1zZXBhcmF0aW9uIGJldHdlZW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIEMgbW9kdWxlcyBhbmQgdGhlaXIKLVB5dGhvbiBpbnRlcmZhY2UuICBXZSBiZWxpZXZlIHRoYXQgdGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdAotaXMgbW9yZSBvcmdhbml6ZWQgYW5kIGdlbmVyYWxseSByZXVzYWJsZS4gIFRoZXJlIGlzIG5vIHBhcnRpY3VsYXIKLXJlYXNvbiB3aHkgYSBDIG1vZHVsZSBzaG91bGQgZGVwZW5kIG9uIFB5dGhvbiAob25lIG1pZ2h0Ci13YW50IHRvIHVzZSBpdCBhcyBhIHN0YW5kLWFsb25lIHBhY2thZ2Ugb3IgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24pLgotRGVzcGl0ZSB1c2luZyBQeXRob24gZXh0ZW5zaXZlbHksIHRoZSBTUGFTTSBjb2RlIGNhbiBzdGlsbCBiZQotY29tcGlsZWQgd2l0aCBubyBQeXRob24gaW50ZXJmYWNlIChvZiBjb3Vyc2UsIHlvdSBsb3NlIGFsbCBvZgotdGhlIGJlbmVmaXRzIGdhaW5lZCBieSBoYXZpbmcgUHl0aG9uKS4gIAotV2UgZmVlbCB0aGF0IG1vc3QgcGh5c2ljcyBjb2RlcyB0ZW5kCi10byBoYXZlIGEgcmF0aGVyIGxvbmcgbGlmZS1zcGFuLiAgTWFpbnRhaW5pbmcgYSBzZXBhcmF0aW9uIG9mCi1pbXBsZW1lbnRhdGlvbiBhbmQgaW50ZXJmYWNlIGhlbHBzIGluc3VyZSB0aGF0IG91ciBwaHlzaWNzIGNvZGUgd2lsbAotYmUgdXNhYmxlIGluIHRoZSBmdXR1cmUtLWV2ZW4gaWYgdGhlcmUgYXJlIGRyYXN0aWMgY2hhbmdlcyBpbiB0aGUKLWludGVyZmFjZSBhbG9uZyB0aGUgd2F5LgotCi08aDM+IFByb3ZpZGluZyBBY2Nlc3MgdG8gRGF0YSBTdHJ1Y3R1cmVzIDwvaDM+Ci0KLUZvciB0aGUgcHVycG9zZXMgb2YgZGVidWdnaW5nIGFuZCBkYXRhIGV4cGxvcmF0aW9uLCB3ZSBoYXZlIAotdXNlZCBTV0lHIHRvIHByb3ZpZGUgd3JhcHBlcnMgYXJvdW5kIEMgZGF0YSBzdHJ1Y3R1cmVzLiAgIEZvciBleGFtcGxlLAotYSBjb2xsZWN0aW9uIG9mIEMgc3RydWN0dXJlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcKLQotPGJsb2NrcXVvdGU+PHByZT4KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgZG91YmxlIHgseSx6OwotfSBWZWN0b3I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgaW50ICAgIHR5cGU7Ci0gICAgIFZlY3RvciByOwotICAgICBWZWN0b3IgdjsKLSAgICAgVmVjdG9yIGY7Ci19IFBhcnRpY2xlOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1jYW4gYmUgdHVybmVkIGludG8gUHl0aG9uIHdyYXBwZXIgY2xhc3Nlcy4gIEluIGFkZGl0aW9uLCBTV0lHIGNhbiBleHRlbmQgc3RydWN0dXJlcyB3aXRoIG1lbWJlciBmdW5jdGlvbnMgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPiA8cHJlPgotLy8gU1dJRyBpbnRlcmZhY2UgZm9yIHZlY3RvciBhbmQgcGFydGljbGUgc3RydWN0dXJlcwotJWluY2x1ZGUgZGF0YXR5cGVzLmgKLQotLy8gRXh0ZW5kIGRhdGEgc3RydWN0dXJlcyB3aXRoIGEgZmV3IHVzZWZ1bCBtZXRob2RzCi0lYWRkbWV0aG9kcyBWZWN0b3IgewotICAgICBjaGFyICpfX3N0cl9fKCkgewotICAgICAgICAgc3RhdGljIGNoYXIgYVsxMDI0XTsKLSAgICAgICAgIHNwcmludGYoYSwiWyAlMC4xMGYsICUwLjEwZiwgJTAuMTBmIF0iLCBzZWxmLT54LCBzZWxmLT55LCBzZWxmLT56KTsKLSAgICAgICAgIHJldHVybiBhOwotICAgICB9Ci19Ci0lYWRkbWV0aG9kcyBQYXJ0aWNsZSB7Ci0gICAgIFBhcnRpY2xlICpfX2dldGl0ZW1fXyhpbnQgaW5kZXgpIHsKLSAgICAgICAgICByZXR1cm4gc2VsZitpbmRleDsKLSAgICAgfQotICAgICBjaGFyICpfX3N0cl9fKCkgewotICAgICAgICAgIC8vIHByaW50IG91dCBhIHBhcnRpY2xlCi0gICAgICAgICAgLi4uCi0gICAgIH0KLX0KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1XaGVuIHRoZSBQeXRob24gaW50ZXJmYWNlIGlzIGJ1aWx0LCBDIHN0cnVjdHVyZXMgbm93IGFwcGVhciBsaWtlCi1QeXRob24gb2JqZWN0cy4gIEJ5IHByb3ZpZGluZyBQeXRob24tc3BlY2lmaWMgbWV0aG9kcyAoc3VjaCBhcwotPHR0Pl9fZ2V0aXRlbV9fPC90dD4pIHdlIGNhbiBldmVuIHByb3ZpZGUgYXJyYXkgYWNjZXNzLgotRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgUHl0aG9uIGNvZGUgd291bGQgcHJpbnQgb3V0Ci1hbGwgb2YgdGhlIGNvb3JkaW5hdGVzIG9mIHN0b3JlZCBwYXJ0aWNsZXMgOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci0jIFByaW50IG91dCBhbGwgY29vcmRpbmF0ZXMgdG8gYSBmaWxlCi1mID0gb3BlbigicGFydC5kYXRhIiwidyIpCi1wID0gU1BhU01fZmlyc3RfcGFydGljbGUoKSAgICAgICAgICAjIEdldCBmaXJzdCBwYXJ0aWNsZSBwb2ludGVyCi1mb3IgaSBpbiB4cmFuZ2UoMCxTUGFTTV9jb3VudF9wYXJ0aWNsZXMoKSk6Ci0gICAgZi53cml0ZSgiJWYsICVmLCAlZlxuIiAlIChwW2ldLnIueCwgcFtpXS5yLnksIHBbaV0uci56KSkKLWYuY2xvc2UoKQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLVdoaWxlIG9ubHkgYSBzaW1wbGUgZXhhbXBsZSwgaGF2aW5nIGRpcmVjdCBhY2Nlc3MgdG8gdW5kZXJseWluZyBkYXRhIGhhcwotcHJvdmVuIHRvIGJlIHF1aXRlIHZhbHVhYmxlIHNpbmNlIHdlIHZpZXcgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIAotb2YgZGF0YSwgY2hlY2sgdmFsdWVzLCBhbmQgcGVyZm9ybSBkaWFnbm9zdGljcy4gCi0KLTxoMz4gSW1wcm92aW5nIHRoZSBSZWxpYWJpbGl0eSBvZiBNb2R1bGVzIDwvaDM+Ci0KLVdoZW4gaW5zdHJ1bWVudGluZyBvdXIgb3JpZ2luYWwgcGh5c2ljcyBhcHBsaWNhdGlvbiB0byB1c2Ugc2NyaXB0aW5nLAotd2UgZm91bmQgdGhhdCBtYW55IHBhcnRzIG9mIHRoZSBjb2RlIHdlcmUgbm90IHdyaXR0ZW4gaW4gYW4gZW50aXJlbHkKLSJyZWxpYWJsZSIgbWFubmVyLiAgSW4gcGFydGljdWxhciwgdGhlIGNvZGUgaGFkIG5ldmVyIGJlZW4gb3BlcmF0ZWQgaW4KLWFuIGV2ZW50LWRyaXZlbiBtYW5uZXIuICBGdW5jdGlvbnMgb2Z0ZW4gbWFkZSBhc3N1bXB0aW9ucyBhYm91dAotaW5pdGlhbGl6YXRpb25zIGFuZCByYXJlbHkgY2hlY2tlZCB0aGUgdmFsaWRpdHkgb2YgaW5wdXQgcGFyYW1ldGVycy4KLVRvIGFkZHJlc3MgdGhlc2UgaXNzdWVzLCBtb3N0IHNlY3Rpb25zIG9mIGNvZGUgd2VyZSBncmFkdWFsbHkgY2hhbmdlZAotdG8gcHJvdmlkZSBzb21lIGtpbmQgb2YgdmFsaWRhdGlvbiBvZiBpbnB1dCB2YWx1ZXMgYW5kIGVycm9yIHJlY292ZXJ5LgotVGhlIFNXSUcgY29tcGlsZXIgaGFzIGFsc28gYmVlbiBleHRlbmRlZCB0byBwcm92aWRlIHNvbWUgb2YgdGhlc2UKLWNhcGFiaWxpdGllcyBhcyB3ZWxsLgotPHA+Ci1PbmUgb2YgUHl0aG9uJ3MgbW9zdCBwb3dlcmZ1bCBmZWF0dXJlcyBpcyBpdHMgZXhjZXB0aW9uIGhhbmRsaW5nIG1lY2hhbmlzbS4KLUV4Y2VwdGlvbnMgYXJlIGVhc2lseSByYWlzZWQgYW5kIGhhbmRsZWQgaW4gUHl0aG9uIHNjcmlwdHMgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIEEgUHl0aG9uIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgotZGVmIGFsbG9jYXRlKG5ieXRlcyk6Ci0JcHRyID0gU1BhU01fbWFsbG9jKG5ieXRlcykKLSAgICAgICAgaWYgcHRyID09ICJOVUxMIjogcmFpc2UgTWVtb3J5RXJyb3IsIk91dCBvZiBtZW1vcnkhIgotCi0jIEEgUHl0aG9uIGZ1bmN0aW9uIHRoYXQgY2F0Y2hlcyBhbiBleGNlcHRpb24KLWRlZiBmb28oKToKLQl0cnk6Ci0JCWFsbG9jYXRlKE5CWVRFUykKLQlleGNlcHQ6Ci0JCXJldHVybiAgICAjIEJhaWxpbmcgb3V0Ci0KLTwvYmxvY2txdW90ZT48L3ByZT4KLQotV2UgaGF2ZSBib3Jyb3dlZCB0aGlzIGlkZWEgYW5kIGltcGxlbWVudGVkIGEgc2ltaWxhciBleGNlcHRpb24gaGFuZGxpbmcKLW1lY2hhbmlzbSBmb3Igb3VyIEMgY29kZS4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIHVzaW5nIGZ1bmN0aW9ucyBpbiB0aGUKLTx0dD4mbHQ7c2V0am1wLmgmZ3Q7PC90dD4gbGlicmFyeSBhbmQgZGVmaW5pbmcgYSBmZXcgQyBtYWNyb3MgZm9yICI8dHQ+VHJ5PC90dD4iLCAiPHR0PkV4Y2VwdDwvdHQ+IiwKLSI8dHQ+VGhyb3c8L3R0PiIsIGV0Yy4uLiBVc2luZyB0aGVzZSBtYWNyb3MsIG1hbnkgb2Ygb3VyIGxpYnJhcnkgZnVuY3Rpb25zIG5vdyBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBBIEMgZnVuY3Rpb24gdGhhdCB0aHJvd3MgYW4gZXhjZXB0aW9uICovCi12b2lkICpTUGFTTV9tYWxsb2Moc2l6ZV90IG5ieXRlcykgewotICAgIHZvaWQgKnB0ciA9ICh2b2lkICopIG1hbGxvYyhuYnl0ZXMpOwotICAgIGlmICghcHRyKSBUaHJvdygiU1BhU01fbWFsbG9jIDogT3V0IG9mIG1lbW9yeSEiKTsKLSAgICByZXR1cm4gcHRyOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1MaWtlIFB5dGhvbiwgd2UgYWxsb3cgQyBmdW5jdGlvbnMgdG8KLWNhdGNoIGV4Y2VwdGlvbnMgYW5kIHByb3ZpZGUgdGhlaXIgb3duIHJlY292ZXJ5IGFzIGZvbGxvd3MgOgotCi08YmxvY2txdW90ZT4gPHByZT4KLS8qIEEgQyBmdW5jdGlvbiBjYXRjaGluZyBhbiBleGNlcHRpb24gKi8KLWludCBmb28oKSB7Ci0gICAgdm9pZCAqcDsKLSAgICBUcnkgewotICAgICAgICBwID0gU1BhU01fbWFsbG9jKE5CWVRFUyk7Ci0gICAgfSBFeGNlcHQgewotICAgICAgICBwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuIFJldHVybmluZyFcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1JbiB0aGUgY2FzZSBvZiBhIHN0YW5kLWFsb25lIEMgYXBwbGljYXRpb24sIGV4Y2VwdGlvbnMgY2FuCi1iZSBjYXVnaHQgYW5kIGhhbmRsZWQgaW50ZXJuYWxseS4gIFNob3VsZCBhbiB1bmNhdWdodCBleGNlcHRpb24KLW9jY3VyLCB0aGUgY29kZSBwcmludHMgYW4gZXJyb3IgbWVzc2FnZSBhbmQgdGVybWluYXRlcy4gSG93ZXZlciwKLXdoZW4gUHl0aG9uIGlzIHVzZWQsIHdlIGNhbiAKLWdlbmVyYXRlIFB5dGhvbiBleGNlcHRpb25zIHVzaW5nIGEgU1dJRyB1c2VyLWRlZmluZWQKLWV4Y2VwdGlvbiBoYW5kbGVyIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPiA8cHJlPgotJW1vZHVsZSBTUGFTTQotLy8gQSBTV0lHIHVzZXIgZGVmaW5lZCBleGNlcHRpb24gaGFuZGxlcgotJWV4Y2VwdChweXRob24pIHsKLSAgICAgVHJ5IHsKLSAgICAgICAgICAkZnVuY3Rpb24KLSAgICAgfSBFeGNlcHQgewotICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsU1BhU01fZXJyb3JfbXNnKCkpOwotICAgICB9Ci19Ci0vLyBDIGRlY2xhcmF0aW9ucyAKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGUgaGFuZGxlciBjb2RlIGdldHMgcGxhY2VkIGludG8gYWxsIG9mIHRoZSBQeXRob24KLSJ3cmFwcGVyIiBmdW5jdGlvbnMgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciB0cmFuc2xhdGluZyBDIGV4Y2VwdGlvbnMKLWludG8gUHl0aG9uIGV4Y2VwdGlvbnMuICBEb2luZyB0aGlzIG1ha2VzIG91ciBwaHlzaWNzIGNvZGUgb3BlcmF0ZQotaW4gYSBtb3JlIHNlYW1sZXNzIG1hbm5lciBhbmQgZ2l2ZXMgaXQgYSBwcmVjaXNlbHkgZGVmaW5lZCBlcnJvciByZWNvdmVyeQotcHJvY2VkdXJlIChpLmUuICBpbnRlcm5hbCBlcnJvcnMgYWx3YXlzIHJlc3VsdCBQeXRob24gZXhjZXB0aW9ucykuIEZvciBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLT4+PiBTUGFTTV9tYWxsb2MoMTAwMDAwMDAwMCkKLVJ1bnRpbWVFcnJvcjogU1BhU01fbWFsbG9jKDEwMDAwMDAwMDApLiBPdXQgb2YgbWVtb3J5IQotKExpbmUgNTIgaW4gbWVtb3J5LmMpCi0+Pj4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotV2UgaGF2ZSBmb3VuZCBlcnJvciByZWNvdmVyeSB0byBiZSBjcml0aWNhbC4gIFdpdGhvdXQgaXQsIHNpbXVsYXRpb25zIG1heSAKLWNvbnRpbnVlIHRvIHJ1biwgb25seSB0byBnZW5lcmF0ZSB3cm9uZyBhbnN3ZXJzIG9yIGEgbXlzdGVyaW91cwotc3lzdGVtIGNyYXNoLiAgCi0KLTxoMj4gTW9yZSBUaGFuIFNjcmlwdGluZyA8L2gyPgotCi1XaGVuIHdlIG9yaWdpbmFsbHkgc3RhcnRlZCB1c2luZyBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB3ZSB0aG91Z2h0IAotdGhleSB3b3VsZCBtYWlubHkgYmUgYSBjb252ZW5pZW50IG1lY2hhbmlzbSBmb3IgZ2x1aW5nIEMgbGlicmFyaWVzCi10b2dldGhlciBhbmQgY29udHJvbGxpbmcgdGhlbSBpbiBhbiBpbnRlcmFjdGl2ZSBtYW5uZXIuICBIb3dldmVyLCAKLXdlIGhhdmUgY29tZSB0byByZWFsaXplIHRoYXQgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcmUKLW11Y2ggbW9yZSBwb3dlcmZ1bCB0aGFuIHRoaXMuICBOb3csIHdlIGZpbmQgb3Vyc2VsdmVzCi1pbXBsZW1lbnRpbmcgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbGl0eSBlbnRpcmVseSBpbiBQeXRob24tLWJ5cGFzc2luZwotQyBhbHRvZ2V0aGVyLiAgIFRoZSBtb3N0IHN1cnByaXNpbmcgKHdlbGwsIG5vdCByZWFsbHkgdGhhdCBzdXJwcmlzaW5nKQotZmFjdCBpcyB0aGF0IFB5dGhvbiBtYWtlcyBpdCBwb3NzaWJsZSB0byBidWlsZCB2ZXJ5IHBvd2VyZnVsIHRvb2xzIHdpdGgKLW9ubHkgYSBzbWFsbCBhbW91bnQgb2YgZXh0cmEgcHJvZ3JhbW1pbmcuICAgSW4gdGhpcyBzZWN0aW9uLCB3ZSBwcmVzZW50Ci1hIGJyaWVmIG92ZXJ2aWV3IG9mIHNvbWUgb2YgdGhlIHRvb2xzIHdlIGhhdmUgZGV2ZWxvcGVkLS1tb3N0IG9mCi13aGljaCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgbGFyZ2VseSBpbiBQeXRob24uCi0KLTxoMz4gT2JqZWN0LU9yaWVudGVkIFZpc3VhbGl6YXRpb24gYW5kIERhdGEgQW5hbHlzaXMgPC9oMz4KLQotT3VyIG9yaWdpbmFsIGdvYWwgd2FzIHRvIGFkZCBhIHBvd2VyZnVsIGRhdGEgYW5hbHlzaXMgYW5kCi12aXN1YWxpemF0aW9uIGNvbXBvbmVudCB0byBvdXIgYXBwbGljYXRpb24uICBUbyB0aGlzIGVuZCwgd2UgZGV2ZWxvcGVkCi1hIGxpZ2h0d2VpZ2h0IGhpZ2gtcGVyZm9ybWFuY2UgZ3JhcGhpY3MgbGlicmFyeSBpbXBsZW1lbnRlZCBpbiBDLgotVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIGJvdGggMkQgYW5kIDNEIHBsb3R0aW5nIGFuZCBwcm9kdWNlcyBvdXRwdXQgaW4KLXRoZSBmb3JtIG9mIEdJRiBpbWFnZXMuICBUbyBtYWtlIHBsb3RzLCBhIHVzZXIgd3JpdGVzIHNpbXBsZSBDCi1mdW5jdGlvbnMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQgcGxvdF9zcGhlcmVzKFBsb3QzRCAqcDMsIERhdGFGdW5jdGlvbiBmdW5jLCBkb3VibGUgbWluLCBkb3VibGUgbWF4LAotICAgICAgICAgICAgICAgICAgZG91YmxlIHJhZGl1cykgewotICAgIFBhcnRpY2xlICpwID0gUGFydGljbGVzOwotICAgIGludCAgICAgICBpLCBucGFydCwgY29sb3I7Ci0gICAgbnBhcnQgPSBTUGFTTV9jb3VudF9wYXJ0aWNsZXMoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnBhcnQ7IGkrKywgcCsrKSB7Ci0gICAgICAgIC8qIENvbXB1dGUgY29sb3IgdmFsdWUgKi8KLSAgICAgICAgdmFsdWUgPSAoKmZ1bmMpKHApOwotICAgICAgICBjb2xvciA9ICh2YWx1ZS1taW4pLyhtYXgtbWluKSoyNTU7Ci0gICAgICAgIC8qIFBsb3QgaXQgKi8KLSAgICAgICAgUGxvdDNEX3NwaGVyZShwMyxwLT5yLngscC0+ci55LHAtPnIueixyYWRpdXMsY29sb3IpOwotICAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gZXhlY3V0ZWQsIHRoaXMgZnVuY3Rpb24gcHJvZHVjZXMgYSByYXcgaW1hZ2Ugc3VjaCBhcyB0aGUgZm9sbG93aW5nCi1zaG93aW5nIHN0YWNraW5nLWZhdWx0cyBnZW5lcmF0ZWQgYnkgYSBwYXNzaW5nIHNob2NrIHdhdmUgaW4gYW4gZmNjIGNyeXN0YWwKLW9mIDEwIG1pbGxpb24gYXRvbXMgOgotPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImJpZ3Nob2NrcmF3LmdpZiI+Ci08L2NlbnRlcj4KLTxwPgotV2hpbGUgc2ltcGxlLCB3ZSBvZnRlbiB3YW50IG91ciBpbWFnZXMgdG8gY29udGFpbiBtb3JlIGluZm9ybWF0aW9uCi1pbmNsdWRpbmcgdGl0bGVzLCBheGlzIGxhYmVscywgY29sb3JiYXJzLCB0aW1lLXN0YW1wcywgYW5kIGJvdW5kaW5nCi1ib3hlcy4gICBUbyBkbyB0aGlzLCB3ZSBoYXZlIGJ1aWx0IGFuIG9iamVjdC1vcmllbnRlZCB2aXN1YWxpemF0aW9uCi1mcmFtZXdvcmsgaW4gUHl0aG9uLiAgIFB5dGhvbiBjbGFzc2VzIHByb3ZpZGUgbWV0aG9kcyBmb3IgZ3JhcGggYW5ub3RhdGlvbgotYW5kIGNvbW1vbiBncmFwaCBvcGVyYXRpb25zLiAgIElmIGEgdXNlciB3YW50cyB0byBtYWtlIGEgbmV3IGtpbmQgb2YgcGxvdCwKLXRoZXkgc2ltcGx5IGluaGVyaXQgZnJvbSBhbiBhcHByb3ByaWF0ZSBiYXNlIGNsYXNzIGFuZCBwcm92aWRlIGEgZnVuY3Rpb24KLXRvIHBsb3QgdGhlIGRlc2lyZWQgZGF0YS4gRm9yIGV4YW1wbGUsIGEgIlNwaGVyZSIgcGxvdCB1c2luZyB0aGUgYWJvdmUgQwotZnVuY3Rpb24gd291bGQgbG9vayBsaWtlIHRoaXMgOgotCi08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgU3BoZXJlcyhJbWFnZTNEKToKLSAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBtaW4sIG1heCwgcmFkaXVzPTAuNSk6Ci0gICAgICAgICAgICAgSW1hZ2UzRC5fX2luaXRfXyhzZWxmLCAuLi4gCi0gICAgICAgICAgICAgc2VsZi5mdW5jID0gZnVuYwotICAgICAgICAgICAgIHNlbGYubWluICA9IG1pbgotICAgICAgICAgICAgIHNlbGYubWF4ICA9IG1heAotICAgICAgICAgICAgIHNlbGYucmFkaXVzID0gcmFkaXVzCi0gICAgICBkZWYgZHJhdyhzZWxmKToKLSAgICAgICAgICAgICBzZWxmLm5ld3Bsb3QoKQotICAgICAgICAgICAgIHBsb3Rfc3BoZXJlcyhzZWxmLnAzLHNlbGYuZnVuYyxzZWxmLm1pbixzZWxmLm1heCxzZWxmLnJhZGl1cykKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVG8gdXNlIHRoZSBuZXcgaW1hZ2UsIG9uZSBzaW1wbHkgY3JlYXRlcyBhbiBvYmplY3Qgb2YgdGhhdCB0eXBlIGFuZAotbWFuaXB1bGF0ZXMgaXQuICBGb3IgZXhhbXBsZSA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0+Pj4gcyA9IFNwaGVyZXMoUEUsLTgsLTMuNSkgICAjIENyZWF0ZSBhIG5ldyBpbWFnZQotPj4+IHMucm90ZCg0NSkgICAgICAgICAgICAgICAgIyBSb3RhdGUgaXQgZG93bgotPj4+IHMuem9vbSgyMDApICAgICAgICAgICAgICAgIyBab29tIGluCi0+Pj4gcy5zaG93KCkgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIEltYWdlIGFuZCBkaXNwbGF5IGl0Ci0+Pj4gLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxjZW50ZXI+Ci08aW1nIHNyYz0iYmlnc2hvY2suZ2lmIj4KLTwvY2VudGVyPgotCi08cD4KLVRodXMsIHdpdGggYSBzaW1wbGUgQyBmdW5jdGlvbiBhbmQgYSBzaW1wbGUgUHl0aG9uIGNsYXNzLCB3ZSBnZXQgYSBsb3QKLW9mIGZ1bmN0aW9uYWxpdHkgZm9yIGZyZWUsIGluY2x1ZGluZyBtZXRob2RzIGZvciBpbWFnZSBtYW5pcHVsYXRpb24sCi1ncmFwaCBhbm5vdGF0aW9uLCBhbmQgZGlzcGxheS4gIEluIHRoZSBjdXJyZW50IHN5c3RlbSwgdGhlcmUgYXJlIGFib3V0Ci1hIGRvemVuIGRpZmZlcmVudCB0eXBlcyBvZiBpbWFnZXMgZm9yIDJEIGFuZCAzRCBwbG90dGluZy4gIEl0IGlzIGFsc28KLXBvc3NpYmxlIHRvIHBlcmZvcm0gZmlsdGVyaW5nLCBhcHBseSBjbGlwcGluZyBwbGFuZXMsIGFuZCBvdGhlcgotYWR2YW5jZWQgb3BlcmF0aW9ucy4gICAgTW9zdCBvZiB0aGlzIGlzIHN1cHBvcnRlZCBieSBhYm91dCAyMDAwIGxpbmVzIG9mCi1QeXRob24gY29kZSBhbmQgYSByZWxhdGl2ZWx5IHNtYWxsIEMgbGlicmFyeSBjb250YWluaW5nIHBlcmZvcm1hbmNlCi1jcml0aWNhbCBvcGVyYXRpb25zLgotCi08aDM+IFdlYi1CYXNlZCBTaW11bGF0aW9uIE1vbml0b3JpbmcgPC9oMz4KLQotT25lIGZlYXR1cmUgb2YgbWFueSBwaHlzaWNzIGNvZGVzIGlzIHRoYXQgdGhleSB0ZW5kIHRvIHJ1biBmb3IgYSBsb25nCi10aW1lLiAgSW4gb3VyIGNhc2UsIGEgc2ltdWxhdGlvbiBtYXkgcnVuIGZvciB0ZW5zIHRvIGh1bmRyZWRzIG9mCi1ob3Vycy4gIER1cmluZyB0aGUgY291cnNlIG9mIGEgc2ltdWxhdGlvbiwgaXQgaXMgZGVzaXJhYmxlIHRvIGNoZWNrIG9uCi1pdHMgc3RhdHVzIGFuZCBzZWUgaG93IGl0IGlzIHByb2dyZXNzaW5nLiAgR2l2ZW4gdGhlIHN0cm9uZyBJbnRlcm5ldAotc3VwcG9ydCBhbHJlYWR5IGJ1bmRsZWQgd2l0aCBQeXRob24sIHdlIGRlY2lkZWQgdG8gd3JpdGUgYSBzaW1wbGUKLXBoeXNpY3Mgd2ViLXNlcnZlciB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4gIFVubGlrZSBhCi1tb3JlIHRyYWRpdGlvbmFsIHNlcnZlciwgb3VyIHNlcnZlciBpcyB1c2VkIGJ5ICJyZWdpc3RlcmluZyIgdmFyaW91cwotb2JqZWN0cyB0aGF0IG9uZSB3YW50cyB0byBsb29rIGF0IGR1cmluZyB0aGUgY291cnNlIG9mIGEgc2ltdWxhdGlvbi4KLVRoZSBzaW11bGF0aW9uIGNvZGUgdGhlbiBwZXJpb2RpY2FsbHkgcG9sbHMgYSBuZXR3b3JrIHNvY2tldCB0byBzZWUgaWYKLWFueW9uZSBoYXMgcmVxdWVzdGVkIGFueXRoaW5nLiAgSWYgc28sIHRoZSBzaW11bGF0aW9uIHdpbGwgc3RvcCBmb3IgYQotbW9tZW50LCBnZW5lcmF0ZSB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLCBzZW5kIGl0IHRvIHRoZSB1c2VyLCBhbmQKLXRoZW4gY29udGludWUgb24gd2l0aCB0aGUgY2FsY3VsYXRpb24uICBBIHNpbXBsaWZpZWQgZXhhbXBsZSBvZiB1c2luZwotdGhlIHNlcnZlciBpcyBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+IDxwcmU+Ci0jIFNpbXBsaWZpZWQgc2NyaXB0IHVzaW5nIGEgd2ViLXNlcnZlcgotZnJvbSB2aXMgaW1wb3J0ICoKLWZyb20gd2ViIGltcG9ydCAqCi0KLXdlYiA9IFNQYVNNV2ViKCkKLXdlYi5hZGQoV2ViTWFpbigiIikpCi13ZWIuYWRkKFdlYkZpbGVUZXh0KCJNc2ciK2BydW5fbm9gKSkKLQotIyBDcmVhdGUgYW4gaW1hZ2Ugb2JqZWN0Ci0KLXNldF9ncmFwaGljc19tb2RlKEhUVFApCi1rZSA9IFNwaGVyZXMoS0UsMCwyMCkKLWtlLnRpdGxlID0gIktpbmV0aWMgRW5lcmd5Igotd2ViLmFkZChXZWJJbWFnZSgia2UuZ2lmIixrZSkpCi0KLWRlZiBydW4obnN0ZXBzKToKLQlmb3IgaSBpbiB4cmFuZ2UoMCxuc3RlcHMpOgotCQlpbnRlZ3JhdGUoMSkgICAgICAgICAgICMgSW50ZWdyYXRlIDEgdGltZXN0ZXAKLSAgICAgICAgICAgICAgICB3ZWIucG9sbCgpICAgICAgICAgICAgICMgQW55b25lIGxvb2tpbmcgZm9yIG1lPwotCi0jIFJ1biBpdAotcnVuKDEwMDAwKQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1XaGlsZSBzaW1wbGUsIHRoaXMgZXhhbXBsZSBnaXZlcyB0aGUgYmFzaWMgaWRlYS4gV2UgY3JlYXRlIGEKLXNlcnZlciBvYmplY3QgYW5kIHJlZ2lzdGVyIGEgZmV3ICJsaW5rcy4iICBXaGVuIGEgdXNlciBjb25uZWN0cyB3aXRoCi10aGUgc2VydmVyLCB0aGV5IHdpbGwgYmUgcHJlc2VudGVkIHdpdGggc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gYW5kIGEKLWxpc3Qgb2YgYXZhaWxhYmxlIGxpbmtzLiAgV2hlbiB0aGUgbGlua3MgYXJlIGFjY2Vzc2VkLCB0aGUgc2VydmVyCi1mZWVkcyByZWFsLXRpbWUgZGF0YSBiYWNrIHRvIHRoZSB1c2VyLiAgSW4gdGhlIGNhc2Ugb2YKLWltYWdlcywgdGhleSBhcmUgZ2VuZXJhdGVkIGltbWVkaWF0ZWx5IGFuZCBzZW50IGJhY2sgaW4gR0lGIGZvcm1hdC4gRHVyaW5nCi10aGlzIHByb2Nlc3MsIG5vIHRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCwgbm9yIGlzIHRoZSBzZXJ2ZXIKLXRyYW5zbWl0dGluZyBwcmV2aW91c2x5IHN0b3JlZCBpbmZvcm1hdGlvbiAoaS5lLiBldmVyeXRoaW5nIGlzIAotY3JlYXRlZCBvbi10aGUtZmx5KS4gCi0KLTxwPgotV2hpbGUgd2UgYXJlIHN0aWxsIHJlZmluaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiwgdGhpcyBhcHByb2FjaCBoYXMgdHVybmVkCi1vdXQgdG8gYmUgdXNlZnVsLS1ub3Qgb25seSBjYW4gd2UgcGVyaW9kaWNhbGx5IGNoZWNrIHVwCi1vbiBhIHJ1bm5pbmcgc2ltdWxhdGlvbiwgdGhpcyBjYW4gY2FuIGJlIGRvbmUgZnJvbSBhbnkgbWFjaGluZSB0aGF0Ci1oYXMgYSBXZWItYnJvd3NlciwgaW5jbHVkaW5nIFBDcyBhbmQgTWFjcyBydW5uaW5nIG92ZXIgYSBtb2RlbSBsaW5lCi0oYWxsb3dpbmcgYSBib3JlZCBwaHlzaWNpc3QgdG8gY2hlY2sgb24gbG9uZy1ydW5uaW5nIGpvYnMgZnJvbSBob21lCi1vciB3aGlsZSBvbiB0cmF2ZWwpLiAgT2YgY291cnNlLCB0aGUgbW9zdCBhbWF6aW5nIGZhY3Qgb2YgYWxsIGlzIHRoYXQKLXRoaXMgd2FzIGltcGxlbWVudGVkIGJ5IG9uZSBwZXJzb24gaW4gYW4gYWZ0ZXJub29uIGFuZCBvbmx5IGludm9sdmVkCi1hYm91dCAxNTAgbGluZXMgb2YgUHl0aG9uIGNvZGUgKHdpdGggZ2VuZXJvdXMgaGVscCBmcm9tIHRoZSBQeXRob24gbGlicmFyeSkuCi0KLTxoMz4gRGV2ZWxvcG1lbnQgU3VwcG9ydCA8L2gzPgotCi1GaW5hbGx5LCB3ZSBoYXZlIGZvdW5kIFB5dGhvbiB0byBiZSBxdWl0ZSB1c2VmdWwgZm9yIHN1cHBvcnRpbmcKLXRoZSBmdXR1cmUgZGV2ZWxvcG1lbnQgb2Ygb3VyIGNvZGUuICBTb21lIG9mIHRoaXMgY29tZXMgaW4gdGhlIGZvcm0gb2YKLXNvcGhpc3RpY2F0ZWQgZGVidWdnaW5nLS1QeXRob24gY2FuIGJlIHVzZWQgdG8gYW5hbHl6ZSBpbnRlcm5hbCBkYXRhCi1zdHJ1Y3R1cmVzIGFuZCB0cmFjayBkb3duIHByb2JsZW1zLiAgU2luY2UgUHl0aG9uIGNhbiByZWFkCi1hbmQgbW9kaWZ5IG1vc3Qgb2YgdGhlIGNvcmUgQyBkYXRhIHN0cnVjdHVyZXMsIGl0IGlzIHBvc3NpYmxlIHRvCi1wcm90b3R5cGUgbmV3IGZ1bmN0aW9ucyBvciB0byBwZXJmb3JtIG9uZS10aW1lIG9wZXJhdGlvbnMgd2l0aG91dCBldmVyCi1sb2FkaW5nIHVwIHRoZSBDIGNvbXBpbGVyLgotCi08cD4KLVdlIGhhdmUgYWxzbyB1c2VkIFB5dGhvbiBpbiBjb25qdW5jdGlvbiB3aXRoIGNvZGUKLW1hbmFnZW1lbnQuIE9uZSBvZiB0aGUgbmV3ZXIgcHJvYmxlbXMgd2UgaGF2ZSBmYWNlZCBpcyB0aGUgdGFzayBvZgotZmluZGluZyB0aGUgZGVmaW5pdGlvbnMgb2YgQyBmdW5jdGlvbnMgKGZvciBleGFtcGxlLCAKLXdlIG1pZ2h0IHdhbnQgdG8ga25vdyBob3cgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgaGFzIGJlZW4KLWltcGxlbWVudGVkIGluIEMpLiAgVG8gc3VwcG9ydCB0aGlzLCB3ZSBoYXZlIHdyaXR0ZW4gdG9vbHMgZm9yCi1icm93c2luZyBzb3VyY2UgZGlyZWN0b3JpZXMsIGRpc3BsYXlpbmcgZGVmaW5pdGlvbnMsIGFuZCBzcGF3bmluZwotZWRpdG9ycy4gIEFsbCBvZiB0aGlzIGlzIGltcGxlbWVudGVkIGluIFB5dGhvbiBhbmQgY2FuIGJlIHBlcmZvcm1lZAotZGlyZWN0bHkgZnJvbSB0aGUgUGh5c2ljcyBhcHBsaWNhdGlvbi4gIFB5dGhvbiBoYXMgbWFkZSB0aGVzZSBraW5kcwotb2YgdG9vbHMgdmVyeSBlYXN5IHRvIHdyaXRlLS1vZnRlbiBvbmx5IHJlcXVpcmluZyBhIGZldyBob3VycyBvZgotZWZmb3J0LgotCi08aDI+IFB5dGhvbiBhbmQgdGhlIERldmVsb3BtZW50IG9mIFNjaWVudGlmaWMgU29mdHdhcmUgPC9oMj4KLQotVGhlIGFkb3B0aW9uIG9mIFB5dGhvbiBoYXMgaGFkIGEgcHJvZm91bmQgZWZmZWN0IG9uIHRoZSBvdmVyYWxsCi1zdHJ1Y3R1cmUgb2Ygb3VyIGFwcGxpY2F0aW9uLiAgV2l0aCB0aW1lLCB0aGUgY29kZSBiZWNhbWUgbW9yZQotbW9kdWxhciwgbW9yZSByZWxpYWJsZSwgYW5kIGJldHRlciBvcmdhbml6ZWQuICAgCi1GdXJ0aGVybW9yZSwgdGhlc2UgZ2FpbnMgaGF2ZSBiZWVuIGFjaGlldmVkCi13aXRob3V0IHNpZ25pZmljYW50IGxvc3NlcyBpbiBwZXJmb3JtYW5jZSwgaW5jcmVhc2VkIGNvZGluZyBjb21wbGV4aXR5LAotb3Igc3Vic3RhbnRpYWxseSBpbmNyZWFzZWQgZGV2ZWxvcG1lbnQgY29zdC4gICBJdCBzaG91bGQgYWxzbyBiZSBzdHJlc3NlZAotdGhhdCBhdXRvbWF0ZWQgdG9vbHMgc3VjaCBhcyBTV0lHIGhhdmUgcGxheWVkIGEgY3JpdGljYWwgcm9sZSBpbiB0aGlzCi1lZmZvcnQgYnkgaGlkaW5nIHRoZSBQeXRob24tQyBpbnRlcmZhY2UgYW5kIGFsbG93aW5nIHVzIHRvIGNvbmNlbnRyYXRlCi1vbiB0aGUgcmVhbCBwcm9ibGVtcyBhdCBoYW5kIChpLmUuIHBoeXNpY3MpLiAgCi0KLTxwPgotT25lIHBvaW50LCB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gc3Ryb25nbHkgZW1waGFzaXplLCBpcyB0aGUgZHluYW1pYwotbmF0dXJlIG9mIG1hbnkgc2NpZW50aWZpYyBhcHBsaWNhdGlvbnMuICBPdXIgYXBwbGljYXRpb24gaXMgbm90IGEgaHVnZQotbW9ub2xpdGhpYyBwYWNrYWdlIHRoYXQgbmV2ZXIgY2hhbmdlcyBhbmQgd2hpY2ggbm8gb25lIGlzIHN1cHBvc2VkIHRvCi1tb2RpZnkuICBSYXRoZXIsIHRoZSBjb2RlIGlzIDxlbT5jb25zdGFudGx5PC9lbT4gY2hhbmdpbmcgdG8gZXhwbG9yZQotbmV3IHByb2JsZW1zLCB0cnkgbmV3IG51bWVyaWNhbCBtZXRob2RzLCBvciB0byBwcm92aWRlIGJldHRlcgotcGVyZm9ybWFuY2UuICBUaGUgaGlnaGx5IG1vZHVsYXIgbmF0dXJlIG9mIFB5dGhvbiB3b3JrcyBncmVhdCBpbgotdGhpcyBlbnZpcm9ubWVudC4gIFdlIHByb3ZpZGUgYSBjb21tb24gcmVwb3NpdG9yeSBvZiBtb2R1bGVzIHRoYXQgYXJlIHNoYXJlZCBieSBhbGwKLW9mIHRoZSB1c2VycyBvZiB0aGUgc3lzdGVtLiAgRGlmZmVyZW50IHVzZXJzIGFyZSB0eXBpY2FsbHkgcmVzcG9uc2libGUKLWZvciBkaWZmZXJlbnQgbW9kdWxlcyBhbmQgYWxsIHVzZXJzIG1heSBiZSB3b3JraW5nIG9uIGRpZmZlcmVudCBtb2R1bGVzCi1hdCB0aGUgc2FtZSB0aW1lLiAKLVdoZW5ldmVyIGNoYW5nZXMgdG8gYSBtb2R1bGUgYXJlIG1hZGUsIHRoZXkgYXJlIGltbWVkaWF0ZWx5IHByb3BhZ2F0ZWQKLXRvIGV2ZXJ5b25lIGVsc2UuICBJbiB0aGUgY2FzZSBvZiBidWctZml4ZXMsIHRoaXMgbWVhbnMgdGhhdCBwYXRjaGVkCi12ZXJzaW9ucyBvZiBjb2RlIGFyZSBhdmFpbGFibGUgaW1tZWRpYXRlbHkuICBMaWtld2lzZSwgbmV3Ci1mZWF0dXJlcyBzaG93IHVwIGF1dG9tYXRpY2FsbHkgYW5kIGNhbiBiZSBlYXNpbHkgdGVzdGVkIGJ5IGV2ZXJ5b25lLgotQW5kIG9mIGNvdXJzZSwgaWYgc29tZXRoaW5nIGJyZWFrcy0tb3RoZXJzIHRlbmQgdG8gbm90aWNlIGFsbW9zdCBpbW1lZGlhdGVseQotKHdoaWNoIHdlIGZlZWwgaXMgYSBnb29kIHRoaW5nKS4KLQotPGgyPiBMaW1pdGF0aW9ucyBvZiBQeXRob24gPC9oMj4KLQotV2hpbGUgd2UgY29uc2lkZXIgb3VyIFB5dGhvbiAiZXhwZXJpbWVudCIgdG8gYmUgaGlnaGx5IHN1Y2Nlc3NmdWwsIHdlCi1oYXZlIGV4cGVyaWVuY2VkIGEgbnVtYmVyIG9mIHByb2JsZW1zIGFsb25nIHRoZSB3YXkuICBUaGUgZmlyc3QgaXMKLW1lcmVseSBhIHRlY2huaWNhbCBpc3N1ZS0taXQgd291bGQgYmUgbmljZSBpZiB0aGUgbWVjaGFuaXNtIGZvcgotYnVpbGRpbmcgc3RhdGljIGV4dGVuc2lvbnMgdG8gUHl0aG9uIHdlcmUgbWFkZSBlYXNpZXIuICBXaGlsZSB3ZSBhcmUKLWN1cnJlbnRseSB1c2luZyBkeW5hbWljIGxvYWRpbmcsIG1hbnkgbWFjaGluZXMsIGVzcGVjaWFsbHkKLXN1cGVyY29tcHV0aW5nIHN5c3RlbXMsIGRvIG5vdCBzdXBwb3J0IGl0LiAgT24gdGhlc2UgbWFjaGluZXMgaXQgaXMKLW5lY2Vzc2FyeSB0byBzdGF0aWNseSBsaW5rIGV2ZXJ5dGhpbmcuICBMaWJyYXJpZXMgaGVscCBzaW1wbGlmeSB0aGUKLXRhc2ssIGJ1dCBjb21iaW5pbmcgZGlmZmVyZW50IHN0YXRpY2FsbHkgbGlua2VkIG1vZHVsZXMgdG9nZXRoZXIgaW50bwotYSBzaW5nbGUgUHl0aG9uIGludGVycHJldGVyIHN0aWxsIHJlbWFpbnMgbWFnaWNhbCBhbmQgc29tZXdoYXQKLXByb2JsZW1hdGljIChlc3BlY2lhbGx5IHNpbmNlIHdlIGFyZSBjcmVhdGluZyBhbiBhcHBsaWNhdGlvbiB0aGF0Ci1jaGFuZ2VzIGEgbG90LS1ub3QgbWVyZWx5IHRyeWluZyB0byBwYXRjaCB0aGUgUHl0aG9uIGNvcmUgd2l0aCBhIG5ldwotZXh0ZW5zaW9uIG1vZHVsZSkuCi0KLTxwPgotQSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IG9mIGVkdWNhdGlvbi0td2UgaGF2ZSBmb3VuZCB0aGF0IHNvbWUgdXNlcnMKLWhhdmUgYSB2ZXJ5IGRpZmZpY3VsdCB0aW1lIG1ha2luZyBzZW5zZSBvZiB0aGUgc3lzdGVtIChldmVuIHdlJ3JlCi1zb21ld2hhdCBhbWF6ZWQgdGhhdCBpdCByZWFsbHkgd29ya3MpLgotSW50ZXJlc3RpbmdseSBlbm91Z2gsIHRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZQotdXNlIG9mIEMgY29kZSBvciBQeXRob24gZm9yIHRoYXQgbWF0dGVyLCBidXQgdG8gaXNzdWVzIHJlbGF0ZWQgdG8gdGhlCi1jb25maWd1cmF0aW9uLCBjb21waWxhdGlvbiwgZGVidWdnaW5nLCBhbmQgaW5zdGFsbGF0aW9uIG9mIG1vZHVsZXMuICBXaGlsZSBtb3N0Ci11c2VycyBoYXZlIHdyaXR0ZW4gcHJvZ3JhbXMgYmVmb3JlLCB0aGV5IGhhdmUgbmV2ZXIgZGVhbHQgd2l0aCBzaGFyZWQKLWxpYnJhcmllcywgYXV0b21hdGVkIGNvZGUgZ2VuZXJhdG9ycywgaGlnaC1sZXZlbCBsYW5ndWFnZXMsIGFuZCB0aGlyZC1wYXJ0eSBwYWNrYWdlcwotc3VjaCBhcyBQeXRob24uICBJbiBvdGhlciBjYXNlcywgdGhlcmUgc2VlbXMgdG8gYmUgYQotImZlYXIgb2YgYXV0b2NvbmYiLS1pZiBhIHByb2dyYW0gcmVxdWlyZXMgYSBjb25maWd1cmUgc2NyaXB0LCBpdCBtdXN0Ci1iZSB0b28gY29tcGxpY2F0ZWQgdG8gdW5kZXJzdGFuZCAod2hpY2ggaXMgbm90IHRoZSBjYXNlCi1oZXJlKS4gIFRoZSBjb21iaW5hdGlvbiBvZiB0aGVzZQotZmFjdG9ycyBoYXMgbGVkIHNvbWUgdXNlcnMgdG8gYmVsaWV2ZSB0aGF0IHRoZSBzeXN0ZW0gaXMgZmFyIG1vcmUKLWNvbXBsaWNhdGVkIGFuZCBmcmFnaWxlIHRoYW4gaXQgcmVhbGx5IGlzLiAgV2UncmUgbm90IHN1cmUgaG93IHRvIGNvbWJhdAotdGhpcyBwcm9ibGVtIG90aGVyIHRoYW4gdG8gdHJ5IGFuZCBlZHVjYXRlIHRoZSB1c2VycwotKGkuZS4gaXQncyBlc3NlbnRpYWxseSB0aGUgc2FtZSBjb2RlIGFzIGJlZm9yZSwgYnV0IHdpdGggYSByZWFsbHkgY29vbAotaGFjaykuCi0KLTxoMj4gQ29uY2x1c2lvbnMgYW5kIEZ1dHVyZSBXb3JrIDwvaDI+Ci0KLVB5dGhvbiBpcyBjb29sIGFuZCB3ZSBwbGFuIHRvIGtlZXAgdXNpbmcgaXQuIEhvd2V2ZXIgbXVjaCB3b3JrCi1yZW1haW5zLiAgT25lIG9mIHRoZSBtb3JlIGV4Y2l0aW5nIGFzcGVjdHMgb2YgUHl0aG9uIGlzIGl0cyBzb2xpZAotc3VwcG9ydCBmb3IgbW9kdWxhciBwcm9ncmFtbWluZyBhbmQgdGhlIGN1bHR1cmUgb2YgY29vcGVyYXRpb24gaW4gdGhlCi1QeXRob24gY29tbXVuaXR5LiBUaGVyZSBhcmUgYWxyZWFkeSBtYW55IFB5dGhvbi1yZWxhdGVkIHNjaWVudGlmaWMKLWNvbXB1dGluZyBwcm9qZWN0cyB1bmRlcndheS4gIElmIHRoZXNlIGVmZm9ydHMgd2VyZSBjb29yZGluYXRlZCAKLWluIHNvbWUgbWFubmVyLCB3ZSBmZWVsIHRoYXQgdGhlIHJlc3VsdHMgY291bGQgYmUgc3BlY3RhY3VsYXIuCi0KLTxoMj4gQWNrbm93bGVkZ21lbnRzIDwvaDI+Ci0KLVdlIHdvdWxkIGxpa2UgYWNrbm93bGVkZ2Ugb3VyIGNvbGxhYm9yYXRvcnMgQnJhZCBIb2xpYW4sIFRpbSBHZXJtYW5uLCBTaHVqaWEgWmhvdSwgYW5kIFdhbnNodSBIdWFuZyBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkuICBXZSB3b3VsZCBhbHNvIGxpa2UKLXRvIGFja25vd2xlZGdlIFBhdWwgRHVib2lzIGFuZCBCcmlhbiBZYW5nIGF0IExhd3JlbmNlIExpdmVybW9yZQotTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgbWFueSBpbnRlcmVzdGluZyBjb252ZXJzYXRpb25zIGNvbmNlcm5pbmcgUHl0aG9uCi1hbmQgaXRzIHVzZSBpbiBwaHlzaWNzIGFwcGxpY2F0aW9ucy4gIFdlIHdvdWxkIGFsc28gbGlrZSB0bwotYWNrbm93bGVkZ2UgdGhlIFNjaWVudGlmaWMgQ29tcHV0aW5nIGFuZCBJbWFnaW5nIEdyb3VwIGF0IHRoZQotVW5pdmVyc2l0eSBvZiBVdGFoIGZvciB0aGVpciBjb250aW51ZWQgc3VwcG9ydC4gIEZpbmFsbHksIHdlJ2QgbGlrZSB0bwotdGhhbmsgdGhlIGVudGlyZSBQeXRob24gZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGZvciBtYWtpbmcgYSB0cnVseQotYXdlc29tZSB0b29sIGZvciBzb2x2aW5nIHJlYWwgcHJvYmxlbXMuICBEZXZlbG9wbWVudCBvZiB0aGUgU1BhU00gY29kZQotaGFzIGJlZW4gcGVyZm9ybWVkIHVuZGVyIHRoZSBhdXNwaWNlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBEZXBhcnRtZW50Ci1vZiBFbmVyZ3kuCi0KLTxoMj4gUmVmZXJlbmNlcyA8L2gyPgotCi08cD4KLVsxXSBELk0uQmVhemxleSBhbmQgUC5TLiBMb21kYWhsLCAiTWVzc2FnZQotUGFzc2luZyBNdWx0aS1DZWxsIE1vbGVjdWxhciBEeW5hbWljcyBvbiB0aGUgQ29ubmVjdGlvbiBNYWNoaW5lIDUsIgotUGFyYWxsZWwgQ29tcHV0aW5nIDIwICgxOTk0KSwgcC4gMTczLTE5NS4gPHA+Ci0KLTxwPgotWzJdIFAuUy5Mb21kYWhsLCBQLlRhbWF5bywgTi5Hcm9uYmVjaC1KZW5zZW4sCi1hbmQgRC5NLkJlYXpsZXksICI1MCBHZmxvcHMgTW9sZWN1bGFyIER5bmFtaWNzIG9uIHRoZSBDTS01LCIgUHJvY2VlZGluZ3MKLW9mIFN1cGVyY29tcHV0aW5nIDkzLCBJRUVFIENvbXB1dGVyIFNvY2lldHkgKDE5OTMpLCBwLjUyMC01MjcuIDxwPgotCi08cD4KLVszXSBTLkouWmhvdSwgRC5NLiBCZWF6bGV5LCBQLlMuIExvbWRhaGwsIEIuTC4gSG9saWFuLCBQaHlzaWNhbCBSZXZpZXcKLUxldHRlcnMuIDc4LCA0NzkgKDE5OTcpLgotCi08cD4KLVs0XSBQLiBEdWJvaXMsIEsuIEhpbnNlbiwgYW5kIEouIEh1Z3VuaW4sIENvbXB1dGVycyBpbiBQaHlzaWNzICgxMCksICgxOTk2KQotcC4gMjYyLTI2Ny4KLQotPHA+Ci1bNV0gRC4gTS4gQmVhemxleSBhbmQgUC5TLiBMb21kYWhsLCAiRXh0ZW5zaWJsZSBNZXNzYWdlIFBhc3NpbmcgQXBwbGljYXRpb24KLURldmVsb3BtZW50IGFuZCBEZWJ1Z2dpbmcgd2l0aCBQeXRob24iLCBQcm9jZWVkaW5ncyBvZiBJUFBTJzk3LCBHZW5ldmEKLVN3aXR6ZXJsYW5kLCBJRUVFIENvbXB1dGVyIFNvY2lldHkgKDE5OTcpLgotCi08cD4KLVs2XSBULi1ZLkIuIFlhbmcsIEQuTS4gQmVhemxleSwgUC4gRi4gRHVib2lzLCBHLiBGdXJuaXNoLCAiU3RlZXJpbmcgT2JqZWN0LW9yaWVudGVkIENvbXB1dGF0aW9ucyB3aXRoCi1QeXRob24iLCBQeXRob24gV29ya3Nob3AgNSwgV2FzaGluZ3RvbiBELkMuLCBOb3YuIDQtNSwgMTk5Ni4KLQotPHA+Ci1bN10gRC5NLiBCZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwsICJIaWdoCi1QZXJmb3JtYW5jZSBNb2xlY3VsYXIgRHluYW1pY3MgTW9kZWxpbmcgd2l0aCBTUGFTTSA6IFBlcmZvcm1hbmNlIGFuZAotUG9ydGFiaWxpdHkgSXNzdWVzLCIgUHJvY2VlZGluZ3Mgb2YgdGhlIFdvcmtzaG9wIG9uIERlYnVnZ2luZyBhbmQKLVR1bmluZyBmb3IgUGFyYWxsZWwgQ29tcHV0ZXIgU3lzdGVtcywgQ2hhdGhhbSwgTUEsIDE5OTQgKElFRUUgQ29tcHV0ZXIKLVNvY2lldHkgUHJlc3MsIExvcyBBbGFtaXRvcywgQ0EsIDE5OTYpLCBwcC4gMzM3LTM1MS4KLQotPHA+Ci1bOF0gRC5NLiBCZWF6bGV5LCAiVXNpbmcgU1dJRyB0byBDb250cm9sLCBQcm90b3R5cGUsIGFuZCBEZWJ1ZyBDIFByb2dyYW1zIHdpdGggUHl0aG9uIiwKLVByb2NlZWRpbmdzIG9mIHRoZSA0dGggSW50ZXJuYXRpb25hbCBQeXRob24gQ29uZmVyZW5jZSwgTGF3cmVuY2UgTGl2ZXJtb3JlIAotTmF0aW9uYWwgTGFib3JhdG9yeSwgSnVuZSAzLTYsIDE5OTYuIAotCi08cD4KLVs5XSBLLiBIaW5zZW4sIFRoZSBNb2xlY3VsYXIgTW9kZWxpbmcgVG9vbGtpdCwgPHR0Pmh0dHA6Ly9zdGFyc2hpcC5za3lwb3J0Lm5ldC9jcmV3L2hpbnNlbi9tbXRrLmh0bWw8L3R0PgotCi08cD4KLVsxMF0gSmltIEh1Z3VuaW4sIE51bWVyaWMgUHl0aG9uLCA8dHQ+aHR0cDovL3d3dy5zbHMubGNzLm1pdC5lZHUvampoL251bXB5PC90dD4KLQotPHA+Ci1bMTFdIEZyZWRyaWsgTHVuZGgsIFB5dGhvbiBJbWFnaW5nIExpYnJhcnksIDx0dD5odHRwOi8vd3d3LnB5dGhvbi5vcmcvc2lncy9pbWFnZS1zaWcvSW1hZ2luZy5odG1sPC90dD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1B5OTcvYmlnc2hvY2suZ2lmIGIvc3dpZ3dlYi9wYXBlcnMvUHk5Ny9iaWdzaG9jay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MGRlNDQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ny9iaWdzaG9jay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QeTk3L2JpZ3Nob2NrcmF3LmdpZiBiL3N3aWd3ZWIvcGFwZXJzL1B5OTcvYmlnc2hvY2tyYXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmJmYjk5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1B5OTcvYmlnc2hvY2tyYXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvUHlUdXRvcmlhbDk3L1B5VHV0b3JpYWw5Ny5wZGYgYi9zd2lnd2ViL3BhcGVycy9QeVR1dG9yaWFsOTcvUHlUdXRvcmlhbDk3LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhYzQwMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QeVR1dG9yaWFsOTcvUHlUdXRvcmlhbDk3LnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1B5VHV0b3JpYWw5OC9QeVR1dG9yaWFsOTgucGRmIGIvc3dpZ3dlYi9wYXBlcnMvUHlUdXRvcmlhbDk4L1B5VHV0b3JpYWw5OC5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZmEzMDUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvUHlUdXRvcmlhbDk4L1B5VHV0b3JpYWw5OC5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni8ufm5ld3RjbC5odG1sIGIvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvLn5uZXd0Y2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYyNjU1MS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni8ufm5ld3RjbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NCArMCwwIEBACi08aHRtbD4KLTx0aXRsZT4gU1dJRyA6IEFuIEVhc3kgdG8gVXNlIFRvb2wgRm9yIEludGVncmF0aW5nIFNjcmlwdGludCBMYW5ndWFnZXMgCi13aXRoIEMgYW5kIEMrKyA8L3RpdGxlPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08aDE+Ci1TV0lHIDogQW4gRWFzeSB0byBVc2UgVG9vbCBmb3IgSW50ZWdyYXRpbmcgU2NyaXB0aW5nIExhbmd1YWdlcyAgd2l0aCBDIGFuZCBDKysKLTwvaDE+Ci0KLTxiPiBEYXZpZCBNLiBCZWF6bGV5IDwvYj4gPGJyPgotPGVtPiBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBVdGFoIDxicj4KLVNhbHQgTGFrZSBDaXR5LCBVdGFoIDg0MTEyIDxicj4KLWJlYXpsZXlAY3MudXRhaC5lZHUgPGJyPiA8L2VtPgotCi08YnI+IDxicj4KLShUbyBiZSBwcmVzZW50ZWQgYXQgdGhlIDR0aCBBbm51YWwgVGNsL1RrIFdvcmtzaG9wLCBNb250ZXJleSwgQ0EuIEp1bHkgNi0xMCwgMTk5Ni4gKQotCi08aDI+IEFic3RyYWN0IDwvaDI+Ci0KLTxlbT4KLUkgcHJlc2VudCBTV0lHIChTaW1wbGlmaWVkIFdyYXBwZXIgYW5kIEludGVyZmFjZSBHZW5lcmF0b3IpLCBhCi1wcm9ncmFtIGRldmVsb3BtZW50IHRvb2wgdGhhdCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyB0aGUgYmluZGluZ3MKLWJldHdlZW4gQy9DKysgY29kZSBhbmQgY29tbW9uIHNjcmlwdGluZyBsYW5ndWFnZXMgaW5jbHVkaW5nCi1UY2wsIFB5dGhvbiwgUGVybCBhbmQgR3VpbGUuICBTV0lHIHN1cHBvcnRzIG1vc3QgQy9DKysgZGF0YXR5cGVzCi1pbmNsdWRpbmcgcG9pbnRlcnMsIHN0cnVjdHVyZXMsIGFuZCBjbGFzc2VzLgotVW5saWtlIG1hbnkgb3RoZXIgYXBwcm9hY2hlcywgU1dJRwotdXNlcyBBTlNJIEMvQysrIGRlY2xhcmF0aW9ucyBhbmQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gbWFrZSB2aXJ0dWFsbHkKLW5vIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgQyBjb2RlLgotSW4gYWRkaXRpb24sIFNXSUcgYXV0b21hdGljYWxseQotcHJvZHVjZXMgZG9jdW1lbnRhdGlvbiBpbiBIVE1MLCBMYVRlWCwgb3IgQVNDSUkgZm9ybWF0LgotU1dJRyBoYXMgYmVlbiBwcmltYXJpbHkgZGVzaWduZWQgZm9yIHNjaWVudGlzdHMsIGVuZ2luZWVycywgYW5kIGFwcGxpY2F0aW9uCi1kZXZlbG9wZXJzIHdobyB3b3VsZCBsaWtlIHRvIHVzZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpdGggdGhlaXIgQy9DKysgcHJvZ3JhbXMKLXdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscwotb2YgZWFjaCBsYW5ndWFnZSBvciB1c2luZyBhIGNvbXBsaWNhdGVkIHNvZnR3YXJlIGRldmVsb3BtZW50IHRvb2wuCi1UaGlzIHBhcGVyIGNvbmNlbnRyYXRlcyBvbiBTV0lHJ3MgdXNlIHdpdGggVGNsL1RrLgotPC9lbT4KLQotPGgyPiAxLiBJbnRyb2R1Y3Rpb24gPC9oMj4KLVNXSUcgKFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvcikKLWlzIGEgc29mdHdhcmUKLWRldmVsb3BtZW50IHRvb2wgdGhhdCBJIG5ldmVyIGludGVuZGVkIHRvIGRldmVsb3AuICAgQXQgdGhlIHRpbWUsCi1JIHdhcyB0cnlpbmcgdG8gYWRkIGEgZGF0YSBhbmFseXNpcyBhbmQgdmlzdWFsaXphdGlvbiBjYXBhYmlsaXR5IHRvCi1hIG1vbGVjdWxhciBkeW5hbWljcyAoTUQpIGNvZGUgSSBoYWQgaGVscGVkIGRldmVsb3AgZm9yIG1hc3NpdmVseQotcGFyYWxsZWwgc3VwZXJjb21wdXRlcnMgYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IFtCZWF6bGV5LExvbWRhaGxdLiAgSSB3YW50ZWQKLXRvIHByb3ZpZGUgYSBzaW1wbGUsIHlldCBmbGV4aWJsZSB1c2VyIGludGVyZmFjZSB0aGF0IGNvdWxkIGJlIHVzZWQKLXRvIGdsdWUgdmFyaW91cyBjb2RlIG1vZHVsZXMgdG9nZXRoZXIgYW5kIGFuIGV4dGVuc2libGUgc2NyaXB0aW5nCi1sYW5ndWFnZSBzZWVtZWQgbGlrZSBhbiBpZGVhbCBzb2x1dGlvbi4gVW5mb3J0dW5hdGVseSB0aGVyZSB3ZXJlIGNvbnN0cmFpbnRzLgotRmlyc3QsIEkgZGlkbid0IHdhbnQgdG8gaGFjayB1cCA0LXllYXJzIG9mIGNvZGUgZGV2ZWxvcG1lbnQgdHJ5aW5nIHRvCi1maXQgb3VyIE1EIGNvZGUgaW50byB5ZXQgYW5vdGhlciBpbnRlcmZhY2Ugc2NoZW1lIChoYXZpbmcgZG9uZSBzbyBzZXZlcmFsCi10aW1lcyBhbHJlYWR5KS4gIFNlY29uZGx5LCB0aGlzIGNvZGUKLXdhcyByb3V0aW5lbHkgcnVuIG9uIHN5c3RlbXMgcmFuZ2luZyBmcm9tIENvbm5lY3Rpb24gTWFjaGluZXMgYW5kIENyYXlzIHRvCi13b3Jrc3RhdGlvbnMgYW5kIEkgZGlkbid0IHdhbnQgdG8gZGVwZW5kIG9uIGFueSBvbmUKLWludGVyZmFjZSBsYW5ndWFnZS0tLW91dCBvZiBmZWFyIHRoYXQgaXQgbWlnaHQgbm90IGJlIHN1cHBvcnRlZCBvbgotYWxsIG9mIHRoZXNlIHBsYXRmb3Jtcy4gIEZpbmFsbHksIHRoZSB1c2VycyB3ZXJlIGNvbnN0YW50bHkgYWRkaW5nCi1uZXcgY29kZSBhbmQgbWFraW5nIG1vZGlmaWNhdGlvbnMuICBJIG5lZWRlZCBhIGZsZXhpYmxlLCB5ZXQgZWFzeSB0byB1c2UKLXN5c3RlbSB0aGF0IGRpZCBub3QgZ2V0IGluIHRoZSB3YXkgb2YgdGhlIHBoeXNpY2lzdHMuIDxicj4gPGJyPgotCi1TV0lHIGlzIG15IHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbS4gIFNpbXBseSBzdGF0ZWQsIFNXSUcgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgYWxsCi1vZiB0aGUgY29kZQotbmVlZGVkIHRvIGJpbmQgQy9DKysgZnVuY3Rpb25zIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlcyB1c2luZyBvbmx5Ci1hIHNpbXBsZSBpbnB1dCBmaWxlIGNvbnRhaW5pbmcgQyBmdW5jdGlvbiBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgotQXQgZmlyc3QsIEkgc3VwcG9ydGVkCi1hIHNjcmlwdGluZyBsYW5ndWFnZSBJIGhhZCBkZXZlbG9wZWQgc3BlY2lmaWNhbGx5IGZvciB1c2UKLW9uIG1hc3NpdmVseSBwYXJhbGxlbCBzeXN0ZW1zLiAgTGF0ZXIgSSBkZWNpZGVkIHRvIHJld3JpdGUgU1dJRyBpbiBDKysgYW5kIGV4dGVuZCBpdCB0byBzdXBwb3J0Ci1UY2wsIFB5dGhvbiwgUGVybCwgR3VpbGUgYW5kIG90aGVyIGxhbmd1YWdlcyB0aGF0IGludGVyZXN0ZWQgbWUuICAgSSBhbHNvCi1hZGRlZCBtb3JlIGRhdGEtdHlwZXMsIHN1cHBvcnQgZm9yIHBvaW50ZXJzLCBDKysgY2xhc3NlcywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLCBhbmQKLWEgZmV3IG90aGVyIGZlYXR1cmVzLiA8YnI+IDxicj4KLQotVGhpcyBwYXBlciBwcm92aWRlcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIFNXSUcgCi13aXRoIGEgcGFydGljdWxhciBlbXBoYXNpcyBvbiBUY2wvVGsuIEhvd2V2ZXIsIHRoZSByZWFkZXIgc2hvdWxkCi1yZW1haW4gYXdhcmUgdGhhdCBTV0lHIHdvcmtzIGVxdWFsbHkgd2VsbCB3aXRoCi1QZXJsIGFuZCBvdGhlciBsYW5ndWFnZXMuIEl0IGlzIG5vdCBteSBpbnRlbnQgdG8gcHJvdmlkZQotYSB0dXRvcmlhbCBvciBhIHVzZXIncyBndWlkZSwgYnV0IHJhdGhlciB0byBzaG93Ci1ob3cgU1dJRyBjYW4gYmUgdXNlZCB0byBkbyBpbnRlcmVzdGluZyB0aGluZ3Mgc3VjaCBhcyAKLWFkZGluZyBUY2wvVGsgaW50ZXJmYWNlcyB0byBleGlzdGluZyBDIGFwcGxpY2F0aW9ucywgCi1xdWlja2x5IGRlYnVnZ2luZyBhbmQgcHJvdG90eXBpbmcgQyBjb2RlLAotYW5kIGJ1aWxkaW5nIGludGVyZmFjZS1sYW5ndWFnZS1pbmRlcGVuZGVudCBDIGFwcGxpY2F0aW9ucy4gICAKLQotPGgyPiAyLiBUY2wgYW5kIFdyYXBwZXIgRnVuY3Rpb25zIDwvaDI+Ci0KLUluIG9yZGVyIHRvIGFkZCBhIG5ldyBDIG9yIEMrKyBmdW5jdGlvbiB0byBUY2wsIGl0IGlzIG5lY2Vzc2FyeSB0bwotd3JpdGUgYSBzcGVjaWFsIGBgd3JhcHBlcicnIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLXByZXNlbnRlZCBhcyBBU0NJSSBzdHJpbmdzIGJ5IHRoZSBUY2wgaW50ZXJwcmV0ZXIgaW50byBhIHJlcHJlc2VudGF0aW9uCi10aGF0IGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIEMgZnVuY3Rpb24uICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkCi10byBhZGQgdGhlIGZhY3RvcmlhbCBmdW5jdGlvbiB0byBUY2wsIGEgd3JhcHBlciBmdW5jdGlvbiBtaWdodAotbG9vayBsaWtlIHRoZSBmb2xsb3dpbmcgOiA8YnI+Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotaW50IHdyYXBfZmFjdChDbGllbnREYXRhIGNsaWVudERhdGEsCi0gICAgICAgICAgICAgIFRjbF9JbnRlcnAgKmludGVycCwKLSAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotICAgIGludCByZXN1bHQ7Ci0gICAgaW50IGFyZzA7Ci0gICAgaWYgKGFyZ2MgIT0gMikgewotICAgICAgICBpbnRlcnAtPnJlc3VsdCA9ICJ3cm9uZyAjIGFyZ3MiOwotICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgIH0KLSAgICBhcmcwID0gYXRvaShhcmd2WzFdKTsKLSAgICByZXN1bHQgPSBmYWN0KGFyZzApOwotICAgIHNwcmludGYoaW50ZXJwLT5yZXN1bHQsIiVkIixyZXN1bHQpOwotICAgIHJldHVybiBUQ0xfT0s7Ci19Ci08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLUluIGFkZGl0aW9uIHRvIHdyaXRpbmcgdGhlIHdyYXBwZXIgZnVuY3Rpb24sIGEgdXNlciB3aWxsIGFsc28gbmVlZCB0byAKLXdyaXRlIGNvZGUgdG8gYWRkIHRoaXMgZnVuY3Rpb24gdG8gdGhlIFRjbCBpbnRlcnByZXRlci4gIEluIHRoZSBjYXNlIG9mCi1UY2wgNy41LCB0aGlzIGNvdWxkIGJlIGRvbmUgYnkgd3JpdGluZyBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0bwotYmUgY2FsbGVkIHdoZW4gdGhlIGV4dGVuc2lvbiBpcyBsb2FkZWQgZHluYW1pY2FsbHkuICAgV2hpbGUgd3JpdGluZwotYSB3cmFwcGVyIGZ1bmN0aW9uIHVzdWFsbHkgaXMgbm90IHRvbyBkaWZmaWN1bHQsIHRoZSBwcm9jZXNzIHF1aWNrbHkKLWJlY29tZXMgdGVkaW91cyBhbmQgZXJyb3IgcHJvbmUgYXMgdGhlIG51bWJlciBvZiBmdW5jdGlvbnMgaW5jcmVhc2VzLgotVGhlcmVmb3JlLCBhdXRvbWF0ZWQgYXBwcm9hY2hlcyBmb3IgcHJvZHVjaW5nIHdyYXBwZXIgZnVuY3Rpb25zIGFyZQotYXBwZWFsaW5nLS1lc3BlY2lhbGx5IHdoZW4gd29ya2luZyB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEMgZnVuY3Rpb25zCi1vciB3aXRoIEMrKyAoaW4gd2hpY2ggY2FzZSB0aGUgd3JhcHBlciBjb2RlIHRlbmRzIHRvIGdldCBtb3JlIGNvbXBsaWNhdGVkKS4KLQotPGgyPiAzLiBQcmlvciBXb3JrIDwvaDI+Ci0KLVRoZSBpZGVhIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGluZyB3cmFwcGVyIGNvZGUgaXMgY2VydGFpbmx5IG5vdCBuZXcuCi1Tb21lIGVmZm9ydHMgc3VjaCBhcwotSXRjbCsrLCBPYmplY3QgVGNsLCBvciB0aGUgWFMgbGFuZ3VhZ2UgaW5jbHVkZWQgd2l0aCBQZXJsNSwgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IKLWdlbmVyYXRpbmcgd3JhcHBlciBjb2RlLCBidXQgcmVxdWlyZSB0aGUgdXNlciB0byBwcm92aWRlIGRldGFpbGVkCi1zcGVjaWZpY2F0aW9ucywgdHlwZSBjb252ZXJzaW9uIHJ1bGVzLCBvciB1c2UgYSBzcGVjaWFsaXplZAotc3ludGF4IFtoZWlkcmljaCxXZXRoZXJhbGwscGVybDVdLiAgTGFyZ2UgcGFja2FnZXMKLXN1Y2ggYXMgdGhlIFZpc3VhbGl6YXRpb24gVG9vbGtpdCAodnRrKSBtYXkgdXNlIHRoZWlyIG93biBDL0MrKyB0cmFuc2xhdG9ycywKLWJ1dCB0aGVzZSBhbG1vc3QgYWx3YXlzIHRlbmQgdG8gYmUgc29tZXdoYXQgc3BlY2lhbCBwdXJwb3NlIChpbiBmYWN0LCBTV0lHIHN0YXJ0ZWQKLW91dCBpbiB0aGlzIG1hbm5lcikgW3Z0a10uCi1JZiBzdXBwb3J0aW5nIG11bHRpcGxlIGxhbmd1YWdlcyBpcyB0aGUgdWx0aW1hdGUgZ29hbCwgYSBwcm9ncmFtbWVyIG1pZ2h0Ci1jb25zaWRlciBhIHBhY2thZ2Ugc3VjaCBhcyBJTFUgW0phbnNzZW5dLiAKLVVuZm9ydHVuYXRlbHksCi10aGlzIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHByb3ZpZGUgc3BlY2lmaWNhdGlvbnMgaW4gSURMLS1hIHByb2Nlc3Mgd2hpY2gKLWlzIHVuYXBwZWFsaW5nIHRvIG1hbnkgdXNlcnMuCi1TV0lHIGlzIG5vdCBuZWNlc3NhcmlseSBpbnRlbmRlZCB0byBjb21wZXRlIHdpdGggCi10aGVzZSBhcHByb2FjaGVzLCBidXQgcmF0aGVyIGlzIGRlc2lnbmVkIHRvIGJlIGEgbm8tbm9uc2Vuc2UgdG9vbCB0aGF0Ci1zY2llbnRpc3RzIGFuZCBlbmdpbmVlcnMgY2FuIHVzZSB0byBlYXNpbHkgYWRkIFRjbCBhbmQgb3RoZXIgc2NyaXB0aW5nCi1sYW5ndWFnZXMgdG8gdGhlaXIgb3duIGFwcGxpY2F0aW9ucy4gICBTV0lHIGlzIGFsc28gCi12ZXJ5IGRpZmZlcmVudCB0aGFuIEVtYmVkZGVkIFRrIChFVCkgd2hpY2ggYWxzbyBhaW1zIHRvCi1zaW1wbGlmeSBjb2RlIGRldmVsb3BtZW50IFtFVF0uIFVubGlrZSBFVCwgU1dJRyBpcyBkZXNpZ25lZCB0byAKLWludGVncmF0ZSBDIGZ1bmN0aW9ucyBpbnRvIFRjbC9UayBhcyBvcHBvc2VkIHRvIGludGVncmF0aW5nIFRjbC9UayBpbnRvCi1DIHByb2dyYW1zLgotCi08aDI+IDQuIEEgUXVpY2sgVG91ciBvZiBTV0lHIDwvaDI+Ci0KLTxoMz4gNC4xIE9yZ2FuaXphdGlvbiA8L2gzPgotCi08Y2VudGVyPgotPGltZyBhbHQgPSAiU1dJRyBPcmdhbml6YXRpb24iIHNyYz0iZmlnMS5naWYiPiAgPGJyPgotRmlndXJlIDEgOiBTV0lHIE9yZ2FuaXphdGlvbiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi1GaWd1cmUgMSBzaG93cyB0aGUgc3RydWN0dXJlIG9mIFNXSUcuICBBdCB0aGUgY29yZSBpcyBhIFlBQ0MgcGFyc2VyCi1mb3IgcmVhZGluZyBpbnB1dCBmaWxlcyBhbG9uZyB3aXRoIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMuIAotVG8gZ2VuZXJhdGUgY29kZSwKLXRoZSBwYXJzZXIgY2FsbHMgYWJvdXQgYSBkb3plbiBmdW5jdGlvbnMgZnJvbSBhIGdlbmVyaWMgbGFuZ3VhZ2UKLWNsYXNzIHRvIGRvIHRoaW5ncyBsaWtlIHdyaXRlIGEgd3JhcHBlciBmdW5jdGlvbiwgbGluayBhCi12YXJpYWJsZSwgd3JhcCBhIEMrKyBtZW1iZXIgZnVuY3Rpb24sIGV0Yy4uLiAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UgaXMKLWltcGxlbWVudGVkIGFzIGEgQysrIGNsYXNzIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IGVtaXQKLXRoZSByZXN1bHRpbmcgQyBjb2RlLiAgIElmIGFuIGBgZW1wdHknJyBsYW5ndWFnZSBkZWZpbml0aW9uIGlzIGdpdmVuCi10byBTV0lHLCBpdCB3aWxsIHByb2R1Y2Ugbm8gb3V0cHV0LiAgIFRodXMsIGVhY2ggbGFuZ3VhZ2UgY2xhc3MgY2FuCi1iZSBpbXBsZW1lbnRlZCBpbiBhbG1vc3QgYW55IG1hbm5lci4KLVRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpcyBpbXBsZW1lbnRlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFuZCBjYW4KLWN1cnJlbnRseSBwcm9kdWNlIEFTQ0lJLCBMYVRlWCwgb3IgSFRNTCBvdXRwdXQuICBBcyBvdXRwdXQsCi1TV0lHIHByb2R1Y2VzIGEgQyBmaWxlIHRoYXQgc2hvdWxkIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgd2l0aCB0aGUgcmVzdCAKLW9mIHRoZSBjb2RlIGFuZCBhIGRvY3VtZW50YXRpb24gZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsYXRlciByZWZlcmVuY2UuCi0KLTxoMz4gNC4yLiBJbnRlcmZhY2UgRmlsZXMgPC9oMz4KLQotQXMgaW5wdXQsIFNXSUcgdGFrZXMgYSBzaW5nbGUgaW5wdXQgZmlsZSByZWZlcnJlZCB0byBhcyBhbiBgYGludGVyZmFjZSBmaWxlLicnCi1UaGlzIGZpbGUgY29udGFpbnMgYSBmZXcgU1dJRyBzcGVjaWZpYyBkaXJlY3RpdmVzLCBidXQgb3RoZXJ3aXNlIGNvbnRhaW5zCi1BTlNJIEMgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gICBVbmxpa2UgdGhlIGFwcHJvYWNoIGluIFtIZWlkcmljaF0sIG5vIHR5cGUgY29udmVyc2lvbiBydWxlcyBhcmUgbmVlZGVkIGFuZCBhbGwgZGVjbGFyYXRpb25zIGFyZSBtYWRlCi11c2luZyBmYW1pbGlhciBBTlNJIEMvQysrIHByb3RvdHlwZXMuICAgIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbgotaW50ZXJmYWNlIGZpbGUgZm9yIHdyYXBwaW5nIGEgZmV3IEMgZmlsZSBJL08gYW5kIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0vKiBGaWxlIDogZmlsZS5pICovCi0lbW9kdWxlIGZpbGVpbwotJXsKLSNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotJX0KLQotRklMRQkqZm9wZW4oY2hhciAqZmlsZW5hbWUsIGNoYXIgKnR5cGUpOwotaW50CSBmY2xvc2UoRklMRSAqc3RyZWFtKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdAotc2l6ZV90CSBmcmVhZCh2b2lkICpwdHIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgc2l6ZV90IG5vYmosIEZJTEUgKnN0cmVhbSk7Ci1zaXplX3QJIGZ3cml0ZSh2b2lkICpwdHIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgIHNpemVfdCBub2JqLEZJTEUgKnN0cmVhbSk7Ci12b2lkCSptYWxsb2Moc2l6ZV90IG5ieXRlcyk7Ci12b2lkCSBmcmVlKHZvaWQgKik7Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1UaGUgPHR0PiAlbW9kdWxlIDwvdHQ+IGRpcmVjdGl2ZQotc2V0cyB0aGUgbmFtZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICBUaGlzIGlzIG9wdGlvbmFsLCBidXQgaXMKLXJlY29tbWVuZGVkIGlmIGJ1aWxkaW5nIGEgVGNsIDcuNSBtb2R1bGUuCi1FdmVyeXRoaW5nIGluc2lkZSB0aGUgPHR0PiAleywgJX0gPC90dD4KLWJsb2NrIGlzIGNvcGllZCBkaXJlY3RseSBpbnRvIHRoZSBvdXRwdXQsIGFsbG93aW5nIHRoZSBpbmNsdXNpb24gb2YKLWhlYWRlciBmaWxlcyBhbmQgYWRkaXRpb25hbCBDIGNvZGUuCi1BZnRlcndhcmRzLCBDL0MrKyBmdW5jdGlvbiBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFyZSBsaXN0ZWQgaW4gYW55Ci1vcmRlci4KLUJ1aWxkaW5nIGEgbmV3IFRjbCBtb2R1bGUgaXMgdXN1YWxseSBhcyAKLWVhc3kgYXMgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotdW5peCA+IHN3aWcgLXRjbCBmaWxlLmkKLXVuaXggPiBnY2MgZmlsZV93cmFwLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUKLXVuaXggPiBsZCAtc2hhcmVkIGZpbGVfd3JhcC5vIC1vIEZpbGVpby5zbwotPC9wcmU+IDwvdHQ+IAotPC9ibG9ja3F1b3RlPgotCi0KLTxoMz4gNC4zLiBBIFRjbCBFeGFtcGxlIDwvaDM+Ci0KLU5ld2x5IGFkZGVkIGZ1bmN0aW9ucyB3b3JrIGxpa2Ugb3JkaW5hcnkgVGNsIHByb2NlZHVyZXMuICBGb3IKLWV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgVGNsIHNjcmlwdCBjb3BpZXMgYSBmaWxlIHVzaW5nIHRoZSBiaW5hcnkKLWZpbGUgSS9PIGZ1bmN0aW9ucyBhZGRlZCBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotcHJvYyBmaWxlY29weSB7bmFtZTEgbmFtZTJ9IHsKLSAgICBzZXQgYnVmZmVyIFttYWxsb2MgODE5Ml07Ci0gICAgc2V0IGYxIFtmb3BlbiAkbmFtZTEgcl07Ci0gICAgc2V0IGYyIFtmb3BlbiAkbmFtZTIgd107Ci0gICAgc2V0IG5ieXRlcyBbZnJlYWQgJGJ1ZmZlciAxIDgxOTIgJGYxXTsKLSAgICB3aGlsZSB7JG5ieXRlcyA+IDB9IHsKLSAgICAgICAgZndyaXRlICRidWZmZXIgMSAkbmJ5dGVzICRmMjsKLSAgICAgICAgc2V0IG5ieXRlcyBbZnJlYWQgJGJ1ZmZlciAxIDgxOTIgJGYxXTsKLSAgICB9Ci0gICAgZmNsb3NlICRmMTsKLSAgICBmY2xvc2UgJGYyOwotICAgIGZyZWUgJGJ1ZmZlcgotfQotPC9wcmU+IDwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gNC40LiBEYXRhdHlwZXMgYW5kIFBvaW50ZXJzIDwvaDM+Ci0KLVNXSUcgc3VwcG9ydHMgdGhlIGJhc2ljIGRhdGF0eXBlcyBvZiA8dHQ+IGludCwgc2hvcnQsCi1sb25nLCBmbG9hdCwgZG91YmxlLCBjaGFyLCA8L3R0PiBhbmQgPHR0PiB2b2lkIDwvdHQ+Ci1hcyB3ZWxsIGFzIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlcnMuICBTV0lHCi1hbHNvIGFsbG93cyBkZXJpdmVkIHR5cGVzIHN1Y2ggYXMgcG9pbnRlcnMsIHN0cnVjdHVyZXMsIGFuZCBjbGFzc2VzLAotYnV0IHRoZXNlIGFyZSBhbGwgZW5jb2RlZCBhcyBwb2ludGVycy4gICAgCi1JZiBhbiB1bmtub3duIHR5cGUgaXMgZW5jb3VudGVyZWQsIFNXSUcgYXNzdW1lcwotdGhhdCBpdCBpcyBhIGNvbXBsZXggZGF0YXR5cGUgdGhhdCBoYXMgYmVlbiBkZWZpbmVkIGVhcmxpZXIuCi1ObyBhdHRlbXB0IGlzIG1hZGUgdG8gZmlndXJlIG91dCB3aGF0IGRhdGEgdGhhdCBkYXRhdHlwZSBhY3R1YWxseSBjb250YWlucwotb3IgaG93IGl0IHNob3VsZCBiZSB1c2VkLiAgT2YgY291cnNlLCB0aGlzIHRoaXMgaXMgb25seSBwb3NzaWJsZQotc2luY2UgU1dJRydzIG1hcHBpbmcgb2YgY29tcGxleCB0eXBlcyBpbnRvIHBvaW50ZXJzIGFsbG93cyB0aGVtCi10byBiZSBoYW5kbGVkIGluIGEgdW5pZm9ybSBtYW5uZXIuIAotQXMgYSByZXN1bHQsIFNXSUcgZG9lcyBub3Qgbm9ybWFsbHkgbmVlZCBhbnkgc29ydAotb2YgdHlwZS1tYXBwaW5nLCBidXQgPHR0PiB0eXBlZGVmIDwvdHQ+IGNhbiBiZSB1c2VkIHRvIG1hcCBhbnkgb2YgdGhlIGJ1aWx0LWluCi1kYXRhdHlwZXMgdG8gbmV3IHR5cGVzIGlmIGRlc2lyZWQuIDxicj4gPGJyPgotCi1TV0lHIGVuY29kZXMgcG9pbnRlcnMgYXMgaGV4YWRlY2ltYWwgc3RyaW5ncyB3aXRoIHR5cGUtaW5mb3JtYXRpb24uICBUaGlzCi10eXBlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSBhIHJ1bi10aW1lIHR5cGUgY2hlY2tpbmcgbWVjaGFuaXNtLgotVGh1cywgYSB0eXBpY2FsIFNXSUcgcG9pbnRlciBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIDogPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08dHQ+IF8xMDA4ZTYxNF9WZWN0b3JfcCA8L3R0PiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi1JZiB0aGlzIHBvaW50ZXIgaXMgcGFzc2VkIGludG8gYSBmdW5jdGlvbiByZXF1aXJpbmcgc29tZSBvdGhlciBraW5kIG9mCi1wb2ludGVyLCBTV0lHIHdpbGwgZ2VuZXJhdGUgYSBUY2wgZXJyb3IgYW5kIHJldHVybiBhbiBlcnJvciBtZXNzYWdlLgotVGhlIE5VTEwgcG9pbnRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nICJOVUxMIi4gICBUaGUgU1dJRyBydW4tdGltZQotdHlwZSBjaGVja2VyIGlzIHNhYXZ5IHRvIHR5cGVkZWZzIGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYmFzZSBjbGFzc2VzCi1hbmQgZGVyaXZlZCBjbGFzc2VzIGluIEMrKy4gVGh1cyBpZiBhCi11c2VyIHNwZWNpZmllcyA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTx0dD4gdHlwZWRlZiBkb3VibGUgUmVhbDsgPC90dD4gPGJyPiA8YnI+Ci08L2NlbnRlcj4KLQotdGhlIHR5cGUgY2hlY2tlciBrbm93cyB0aGF0IDx0dD4gUmVhbCAqIDwvdHQ+ICBhbmQgPHR0PiBkb3VibGUgKiA8L3R0PgotYXJlIGVxdWl2YWxlbnQgKG1vcmUgb24gQysrIGluIGEgbWludXRlKS4KLUZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2Ygb3RoZXIgVGNsIGV4dGVuc2lvbnMsCi1TV0lHIHBvaW50ZXJzIHNob3VsZCBiZSBzZWVuIGFzIHNwZWNpYWwgImhhbmRsZXMiIGV4Y2VwdCB0aGF0IHRoZXkgCi1oYXBwZW4gdG8gY29udGFpbiB0aGUgcG9pbnRlciB2YWx1ZSBhbmQgaXRzIHR5cGUuIDxicj4gPGJyPgotCi1UbyBzb21lLCB0aGlzIGFwcHJvYWNoIG1heSBzZWVtIGhvcnJpYmx5IHJlc3RyaWN0aXZlIChvciBlcnJvciBwcm9uZSksCi1idXQga2VlcCBpbiBtaW5kIHRoYXQgU1dJRyB3YXMgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIHdvcmsgd2l0aAotZXhpc3RpbmcgQyBhcHBsaWNhdGlvbnMuICBTaW5jZSBtb3N0IEMgcHJvZ3JhbXMgcGFzcyBjb21wbGV4IGRhdGF0eXBlcwotYXJvdW5kIGJ5IHJlZmVyZW5jZSB0aGlzIHRlY2huaXF1ZSB3b3JrcyByZW1hcmthYmx5IHdlbGwgaW4gcHJhY3RpY2UuCi1SdW4gdGltZSB0eXBlLWNoZWNraW5nIGFsc28gZWxpbWluYXRlcyBtb3N0IGNvbW1vbiBjcmFzaGVzIGJ5IGNhdGNoaW5nCi1zdHVwaWQgbWlzdGFrZXMgc3VjaCBhcyB1c2luZyBhIHdyb25nIHZhcmlhYmxlIG5hbWUgb3IgZm9yZ2V0dGluZyB0aGUKLSIkIiBjaGFyYWN0ZXIgaW4gYSBUY2wgc2NyaXB0LiAgICBXaGlsZSBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBjcmFzaCBUY2wgYnkgZm9yZ2luZyBhCi1TV0lHIHBvaW50ZXIgdmFsdWUgKG9yIG1ha2luZyBhIGNhbGwgdG8gYnVnZ3kgQyBjb2RlKSwgaXQgaXMgd29ydGgKLWVtcGhhc2l6aW5nIHRoYXQgZXhpc3RpbmcgVGNsIGV4dGVuc2lvbnMKLW1heSBhbHNvIGNyYXNoIGlmIGdpdmVuIGFuIGludmFsaWQgaGFuZGxlLgotCi08aDM+IDQuNS4gR2xvYmFsIFZhcmlhYmxlcyBhbmQgQ29uc3RhbnRzIDwvaDM+Ci0KLVNXSUcgY2FuIGluc3RhbGwgZ2xvYmFsIEMgdmFyaWFibGVzIGFuZCBjb25zdGFudHMgdXNpbmcgVGNsJ3MgdmFyaWFibGUgbGlua2FnZQotbWVjaGFuaXNtLgotVmFyaWFibGVzIG1heSBhbHNvIGJlIGRlY2xhcmVkIGFzIGBgcmVhZCBvbmx5JycgCi13aXRoaW4gdGhlIFRjbCBpbnRlcnByZXRlci4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cwotaG93IHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzIGNhbiBiZSBhZGRlZCB0byBUY2wgOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLS8vIFNXSUcgZmlsZSB3aXRoIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzCi0lewotJX0KLQotLy8gU29tZSBnbG9iYWwgdmFyaWFibGVzCi1leHRlcm4gIGludCBNeV92YXJpYWJsZTsgICAgIAotZXh0ZXJuICBjaGFyICpkZWZhdWx0X3BhdGg7Ci1leHRlcm4gIGRvdWJsZSBNeV9kb3VibGU7Ci0KLS8vIFNvbWUgY29uc3RhbnRzCi0jZGVmaW5lICBQSSAgICAgMy4xNDE1OTI2NTM1OQotI2RlZmluZSAgUElfNCAgIFBJLzQuMAotZW51bSBjb2xvcnMge3JlZCxibHVlLGdyZWVufTsKLWNvbnN0IGludCBTSVpFT0ZfVkVDVE9SID0gc2l6ZW9mKFZlY3Rvcik7Ci0KLS8vIEEgcmVhZCBvbmx5IHZhcmlhYmxlCi0lcmVhZG9ubHkKLWV4dGVybiBpbnQgU3RhdHVzOwotJXJlYWR3cml0ZQotCi08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gNC42LiBDKysgU3VwcG9ydCA8L2gzPgotCi1UaGUgU1dJRyBwYXJzZXIgY2FuIGhhbmRsZSBzaW1wbGUgQysrIGNsYXNzIGRlZmluaXRpb25zIGFuZCBzdXBwb3J0cyBwdWJsaWMKLWluaGVyaXRhbmNlLCB2aXJ0dWFsIGZ1bmN0aW9ucywgc3RhdGljIGZ1bmN0aW9ucywgY29uc3RydWN0b3JzIGFuZAotZGVzdHJ1Y3RvcnMuICAgIEN1cnJlbnRseSwgQysrIHRyYW5zbGF0aW9uIGlzIHBlcmZvcm1lZAotYnkgcG9saXRlbHkgdHJhbmZvcm1pbmcgQysrIGNvZGUgaW50byBDIGNvZGUgYW5kIGdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIHRoZQotQyBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlCi1jb250YWluaW5nIGEgQysrIGNsYXNzIGRlZmluaXRpb246Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotJW1vZHVsZSB0cmVlCi0lewotI2luY2x1ZGUgInRyZWUuaCIKLSV9Ci0KLWNsYXNzIFRyZWUgewotcHVibGljOgotICAgVHJlZSgpOwotICB+VHJlZSgpOwotICAgdm9pZCAgaW5zZXJ0KGNoYXIgKml0ZW0pOwotICAgaW50ICAgc2VhcmNoKGNoYXIgKml0ZW0pOwotICAgaW50ICAgcmVtb3ZlKGNoYXIgKml0ZW0pOwotc3RhdGljIHZvaWQgcHJpbnQoVHJlZSAqdCk7ICAgCi19OwotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1XaGVuIHRyYW5zbGF0ZWQsIHRoZSBjbGFzcyB3aWxsIGJlIGFjY2VzcyB1c2VkIHRoZSBmb2xsb3dpbmcgc2V0IG9mCi1mdW5jdGlvbnMgKGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBTV0lHKS4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotVHJlZSAqbmV3X1RyZWUoKTsKLXZvaWQgZGVsZXRlX1RyZWUoVHJlZSAqdGhpcyk7Ci12b2lkIFRyZWVfaW5zZXJ0KFRyZWUgKnRoaXMsIGNoYXIgKml0ZW0pOwotaW50ICBUcmVlX3NlYXJjaChUcmVlICp0aGlzLCBjaGFyICppdGVtKTsKLWludCAgVHJlZV9yZW1vdmUoVHJlZSAqdGhpcywgY2hhciAqaXRlbSk7Ci12b2lkIFRyZWVfcHJpbnQoVHJlZSAqdCk7Ci08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLQotQWxsIEMrKyBmdW5jdGlvbnMgd3JhcHBlZCBieSBTV0lHIGV4cGxpY2l0bHkgcmVxdWlyZSB0aGUgPHR0PiB0aGlzIDwvdHQ+IHBvaW50ZXIKLWFzIHNob3duLiAgVGhpcyBhcHByb2FjaCBoYXMgdGhlIGFkdmFudGFnZSBvZiB3b3JraW5nIGZvciBhbGwgb2YgdGhlIHRhcmdldAotbGFuZ3VhZ2VzLiAgSXQgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gcGFzcyBvYmplY3RzIGJldHdlZW4KLW90aGVyIEMrKyBmdW5jdGlvbnMgc2luY2UgZXZlcnkgQysrIG9iamVjdCBpcyBzaW1wbHkgcmVwcmVzZW50ZWQgYXMgYSBTV0lHIHBvaW50ZXIuICAgU1dJRyBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCBidXQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKLWNhbiBiZSByZXNvbHZlZCBieSByZW5hbWluZyB0aGVtIHdpdGggdGhlIFNXSUcgPHR0PiAlbmFtZSA8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci1jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgIExpc3QoKTsKLSVuYW1lKExpc3RNYXgpIExpc3QoaW50IG1heHNpemUpOwotLi4uCi19OwotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotVGhlIGFwcHJvYWNoIHVzZWQgYnkgU1dJRyBpcwotcXVpdGUgZGlmZmVyZW50IHRoYW4gdGhhdCB1c2VkIGluIHN5c3RlbXMgc3VjaCBhcwotT2JqZWN0IFRjbCBvciB2dGsgW3Z0ayxXZXRoZXJhbGxdLiAgQXMgYSByZXN1bHQsIHVzZXJzIG9mIHRob3NlIHN5c3RlbXMKLW1heSBmaW5kIGl0IHRvIGJlIGNvbmZ1c2luZy4gIEhvd2V2ZXIsCi1JdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBtb2R1bGFyIGRlc2lnbiBvZgotU1dJRyBhbGxvd3MgdGhlIHVzZXIgdG8gY29tcGxldGVseSByZWRlZmluZSB0aGUgb3V0cHV0IGJlaGF2aW9yIG9mCi10aGUgc3lzdGVtLiAgVGh1cywgd2hpbGUgdGhlIGN1cnJlbnQgQysrIGltcGxlbWVudGF0aW9uIGlzIHF1aXRlIGRpZmZlcmVudAotdGhhbiBvdGhlciBzeXN0ZW1zIHN1cHBvcnRpbmcgQysrLCBpdCB3b3VsZCBiZSBlbnRpcmVseSBwb3NzaWJsZQotd3JpdGUgYSBuZXcgU1dJRyBtb2R1bGUgdGhhdCB3cmFwcGVkIEMrKyBjbGFzc2VzIGludG8gYSByZXByZXNlbnRhdGlvbgotc2ltaWxhciB0byB0aGF0IHVzZWQgYnkgT2JqZWN0IFRjbCAoaW4gZmFjdCwgaW4gbWlnaHQgZXZlbiBiZSBwb3NzaWJsZQotdG8gdXNlIFNXSUcgdG8gcHJvZHVjZSB0aGUgaW5wdXQgZmlsZXMgdXNlZCBmb3IgT2JqZWN0IFRjbCkuCi0KLTxoMz4gNC43LiBNdWx0aXBsZSBGaWxlcyBhbmQgQ29kZSBSZXVzZSA8L2gzPgotCi1BbiBlc3NlbnRpYWwgZmVhdHVyZSBvZiBTV0lHIGlzIGl0cyBzdXBwb3J0IGZvciBtdWx0aXBsZSBmaWxlcwotYW5kIG1vZHVsZXMuICAgQSBTV0lHIGludGVyZmFjZSBmaWxlIG1heSBpbmNsdWRlIGFub3RoZXIgaW50ZXJmYWNlCi1maWxlIHVzaW5nIHRoZSAiPHR0PiAlaW5jbHVkZSA8L3R0PiIgZGlyZWN0aXZlLiAgICBUaHVzLCBhbiBpbnRlcmZhY2UKLWZvciBhIGxhcmdlIHN5c3RlbSBtaWdodCBiZSBicm9rZW4gdXAgaW50byBhIGNvbGxlY3Rpb24gb2Ygc21hbGxlcgotbW9kdWxlcyBhcyBzaG93biAKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0lbW9kdWxlIHBhY2thZ2UKLSV7Ci0jaW5jbHVkZSAicGFja2FnZS5oIgotJX0KLQotJWluY2x1ZGUgZ2VvbWV0cnkuaQotJWluY2x1ZGUgbWVtb3J5LmkKLSVpbmNsdWRlIG5ldHdvcmsuaQotJWluY2x1ZGUgZ3JhcGhpY3MuaQotJWluY2x1ZGUgcGh5c2ljcy5pCi0KLSVpbmNsdWRlIHdpc2guaQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotQ29tbW9uIG9wZXJhdGlvbnMgY2FuIGJlIHBsYWNlZCBpbnRvIGEgU1dJRyBsaWJyYXJ5IGZvciB1c2UgaW4KLWFsbCBhcHBsaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlIDx0dD4gJWluY2x1ZGUgd2lzaC5pIDwvdHQ+IGRpcmVjdGl2ZQotdGVsbHMgU1dJRyB0byBpbmNsdWRlIGNvZGUgZm9yIHRoZSA8dHQ+IFRjbF9BcHBJbml0KCkgPC90dD4gZnVuY3Rpb24KLW5lZWRlZCB0byByZWJ1aWxkIHRoZSA8dHQ+IHdpc2ggPC90dD4gcHJvZ3JhbS4gIFRoZSBsaWJyYXJ5IGNhbiBhbHNvIGJlCi11c2VkIHRvIGJ1aWxkIG1vZHVsZXMKLWFsbG93aW5nIFNXSUcgdG8gYmUgdXNlZCB3aXRoIGNvbW1vbiBUY2wgZXh0ZW5zaW9ucyBzdWNoCi1hcyBFeHBlY3QgW0V4cGVjdF0uIE9mIGNvdXJzZSwgdGhlIHByaW1hcnkgdXNlIG9mIHRoZSBsaWJyYXJ5IGlzIHdpdGgKLWxhcmdlIGFwcGxpY2F0aW9ucyBzdWNoIGFzIE9wZW4tSW52ZW50b3Igd2hpY2ggY29udGFpbiBodW5kcmVkcyBvZgotbW9kdWxlcyBhbmQgYSBzdWJzdGFudGlhbCBjbGFzcyBoaWVyYXJjaHkgW0ludmVudF0uICAgSW4gdGhpcyBjYXNlIGEgdXNlcgotY291bGQgdXNlIFNXSUcncyBpbmNsdWRlIG1lY2hhbmlzbSB0byBzZWxlY3RpdmVseSBwaWNrIHdoaWNoIG1vZHVsZXMKLXRoZXkgd2FudGVkIHRvIHVzZSBmb3IgYSBwYXJ0aWN1bGFyIHByb2JsZW0uCi0KLTxoMz4gNC44LiBUaGUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0gPC9oMz4KLQotU1dJRyBwcm9kdWNlcyBkb2N1bWVudGF0aW9uIGluIEFTQ0lJLCBMYVRlWCwgb3IgSFRNTAotZm9ybWF0IGRlc2NyaWJpbmcgZXZlcnl0aGluZyB0aGF0IHdhcyB3cmFwcGVkLiAgVGhlIGRvY3VtZW50YXRpb24KLWZvbGxvd3MgdGhlIHN5bnRheCBydWxlcyBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGFuZCBjYW4KLWNhbiBiZSBmdXJ0aGVyIGVuaGFuY2VkIGJ5IGFkZGluZyBkZXNjcmlwdGlvbnMgaW4gYSBDL0MrKyBjb21tZW50Ci1pbW1lZGlhdGVseSBmb2xsb3dpbmcgYSBkZWNsYXJhdGlvbi4gIFRoZXNlIGNvbW1lbnRzIG1heSBhbHNvIGNvbnRhaW4KLWVtYmVkZGVkIExhVGVYIG9yIEhUTUwgY29tbWFuZHMuICBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci1leHRlcm4gc2l6ZV90IGZyZWFkKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgc2l6ZV90IG5vYmosIEZJTEUgKnN0cmVhbSk7Ci0vKiB7XHR0IGZyZWFkfSByZWFkcyBmcm9tIHtcdHQgc3RyZWFtfSBpbnRvCi10aGUgYXJyYXkge1x0dCBwdHJ9IGF0IG1vc3Qge1x0dCBub2JqfSBvYmplY3RzCi1vZiBzaXplIHtcdHQgc2l6ZX0uICAge1x0dCBmcmVhZH0gcmV0dXJucwotdGhlIG51bWJlciBvZiBvYmplY3RzIHJlYWQuICovCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1XaGVuIG91dHB1dCBieSBTV0lHIGFuZCBwcm9jZXNzZWQgYnkgTGFUZVgsIHRoaXMgYXBwZWFycyBhcyBmb2xsb3dzIDoKLQotPHVsPgotPHR0PiBzaXplX3QgOiBmcmVhZCBwdHIgc2l6ZSBub2JqIHN0cmVhbSA8L3R0PiA8YnI+Ci08dWw+Ci0gICAgIDx0dD4gZnJlYWQgPC90dD4gcmVhZHMgZnJvbSA8dHQ+IHN0cmVhbSA8L3R0PiBpbnRvIHRoZSBhcnJheSA8dHQ+IHB0ciA8L3R0PiBhdAotICAgICBtb3N0IDx0dD4gbm9iaiA8L3R0PiBvYmplY3RzIG9mIHNpemUgPHR0PiBzaXplIDwvdHQ+LiAgPHR0PiBmcmVhZCA8L3R0PiAKLSAgICByZXR1cm5zCi0gICAgIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZWFkLiAKLTwvdWw+Ci08L3VsPgotCi08aDM+IDQuOS4gRXh0ZW5kaW5nIHRoZSBTV0lHIFN5c3RlbSA8L2gzPgotCi1GaW5hbGx5LCBTV0lHIGl0c2VsZiBjYW4gYmUgZXh0ZW5kZWQgYnkgdGhlIHVzZXIgdG8gcHJvdmlkZSBuZXcKLWZ1bmN0aW9uYWxpdHkuICAgIFRoaXMgaXMgZG9uZSBieSBtb2RpZnlpbmcgYW4gZXhpc3Rpbmcgb3IgY3JlYXRpbmcgYQotbmV3IGxhbmd1YWdlIGNsYXNzLiAgIEEgdHlwaWNhbCBjbGFzcyBtdXN0IHNwZWNpZnkgdGhlIGZvbGxvd2luZwotZnVuY3Rpb25zIHRoYXQgZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgcGFyc2VyIG91dHB1dCA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotLy8gRmlsZSA6IHN3aWd0Y2wuaAotY2xhc3MgVENMIDogcHVibGljIExhbmd1YWdlIHsKLXByaXZhdGU6Ci0gIC8vIFB1dCBwcml2YXRlIHN0dWZmIGhlcmUKLXB1YmxpYyA6Ci0gIFRDTCgpOwotICBpbnQgbWFpbihpbnQsIGNoYXIgKmFyZ3ZbXSk7Ci0gIHZvaWQgY3JlYXRlX2Z1bmN0aW9uKGNoYXIgKixjaGFyICosRGF0YVR5cGUqLAotICAgICAgICAgICAgICAgICAgICAgICBQYXJtTGlzdCAqKTsKLSAgdm9pZCBsaW5rX3ZhcmlhYmxlKGNoYXIgKixjaGFyICosRGF0YVR5cGUgKik7Ci0gIHZvaWQgZGVjbGFyZV9jb25zdChjaGFyICosaW50LGNoYXIgKik7Ci0gIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsKLSAgdm9pZCBoZWFkZXJzKHZvaWQpOwotICB2b2lkIGNsb3NlKHZvaWQpOwotICB2b2lkIHVzYWdlX3ZhcihjaGFyICosRGF0YVR5cGUqLGNoYXIgKiopOwotICB2b2lkIHVzYWdlX2Z1bmMoY2hhciAqLERhdGFUeXBlKixQYXJtTGlzdCosCi0gICAgICAgICAgICAgICAgICBjaGFyICoqKTsKLSAgdm9pZCB1c2FnZV9jb25zdChjaGFyICosaW50LGNoYXIqLGNoYXIqKik7Ci0gIHZvaWQgc2V0X21vZHVsZShjaGFyICopOwotICB2b2lkIHNldF9pbml0KGNoYXIgKik7Ci19OwotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotRGVzY3JpcHRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4gdGhlIFNXSUcKLXVzZXJzIG1hbnVhbC4gICBUbyBidWlsZCBhIG5ldyB2ZXJzaW9uIG9mIFNXSUcsIHRoZSB1c2VyCi1vbmx5IG5lZWRzIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBhIG1haW4KLXByb2dyYW0gd2hpY2ggbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotCi0vLyBTV0lHIG1haW4gcHJvZ3JhbQotCi0jaW5jbHVkZSAic3dpZy5oIgotI2luY2x1ZGUgInN3aWd0Y2wuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLSAgTGFuZ3VhZ2UgKmxhbmc7Ci0KLSAgbGFuZyA9IG5ldyBUQ0w7Ci0gIFNXSUdfbWFpbihhcmdjLGFyZ3YsbGFuZywoRG9jdW1lbnRhdGlvbiAqKSAwKTsKLQotfQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2hlbiBsaW5rZWQgd2l0aCBhIGxpYnJhcnkgZmlsZSwgYW55IGV4dGVuc2lvbnMgYW5kCi1tb2RpZmljYXRpb25zIGNhbiBub3cgYmUgdXNlZCB3aXRoIHRoZSBTV0lHIHBhcnNlci4gIFdoaWxlCi13cml0aW5nIGEgbmV3IGxhbmd1YWdlIGRlZmluaXRpb24gaXMgbm90IGVudGlyZWx5IHRyaXZpYWwsCi1pdCBjYW4gdXN1YWxseSBiZSBkb25lIGJ5IGp1c3QgY29weWluZyBvbmUgb2YgdGhlIGV4aXN0aW5nCi1tb2R1bGVzIGFuZCBtb2RpZnlpbmcgaXQgYXBwcm9wcmlhdGVseS4gICAKLQotPGgyPiA1LiBFeGFtcGxlcyA8L2gyPgotCi08aDM+IDUuMS4gQSBDLVRjbCBMaW5rZWQgTGlzdCA8L2gzPgotCi1TV0lHIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHNpbXBsZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhcmUgdXN1YWJsZSBpbiAKLWJvdGggQyBhbmQgVGNsLiAgIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgZm9yCi1idWlsZGluZyBhIHNpbXBsZSBsaW5rZWQgbGlzdC4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0vKiBGaWxlIDogbGlzdC5pICovCi0lewotc3RydWN0IE5vZGUgewotICBOb2RlKGNoYXIgKm4pIHsKLSAgICBuYW1lID0gbmV3IGNoYXJbc3RybGVuKG4pKzFdOwotICAgIHN0cmNweShuYW1lLG4pOwotICAgIG5leHQgPSAwOwotICB9OwotICBjaGFyICAqbmFtZTsKLSAgTm9kZSAqbmV4dDsKLX07Ci0lfQotCi0vLyBKdXN0IGFkZCBzdHJ1Y3QgZGVmaW5pdGlvbiB0bwotLy8gdGhlIGludGVyZmFjZSBmaWxlLgotCi1zdHJ1Y3QgTm9kZSB7Ci0gIE5vZGUoY2hhciAqKTsKLSAgY2hhciAqbmFtZTsKLSAgTm9kZSAqbmV4dDsKLX07Ci0KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gdXNlZCBpbiBhIFRjbCBzY3JpcHQsIHdlIGNhbiBub3cgY3JlYXRlIG5ldyBub2RlcyBhbmQgYWNjZXNzCi1pbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIDx0dD4gTm9kZSA8L3R0PiBzdHJ1Y3R1cmUuICAgSW4gZmFjdCwgd2UgY2FuCi13cml0ZSBjb2RlIHRvIGNvbnZlcnQgYmV0d2VlbiBUY2wgbGlzdHMgYW5kIGxpbmtlZCBsaXN0cyBlbnRpcmVseQotaW4gVGNsIGFzIHNob3duIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0jIEJ1aWxkcyBsaW5rZWQgbGlzdCBmcm9tIGEgVGNsIGxpc3QKLXByb2MgYnVpbGRsaXN0IHtsaXN0IGhlYWR9IHsKLSAgICBzZXQgbml0ZW1zIFtsbGVuZ3RoICRsaXN0XTsKLSAgICBmb3Ige3NldCBpIDB9IHskaSAmbHQ7ICRuaXRlbXN9IHtpbmNyIGkgLTF9IHsKLSAgICAgICAgc2V0IGl0ZW0gW2xyYW5nZSAkbGlzdCAkaSAkaV0gCi0gICAgICAgIHNldCBuIFtuZXdfTm9kZSAkaXRlbV0gICAgICAgIAotICAgICAgICBOb2RlX3NldF9uZXh0ICRuICRoZWFkICAgICAgICAKLSAgICAgICAgc2V0IGhlYWQgJG4gICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIHJldHVybiAkaGVhZAotfQotIyBCdWlsZHMgYSBUY2wgbGlzdCBmcm9tIGEgbGlua2VkIGxpc3QKLXByb2MgZ2V0X2xpc3Qge2xsaXN0fSB7Ci0gICAgc2V0IGxpc3Qge30gCi0gICAgd2hpbGUgeyRsbGlzdCAhPSAiTlVMTCJ9IHsKLSAgICAgICAgbGFwcGVuZCBsaXN0IFtOb2RlX25hbWVfZ2V0ICRsbGlzdF0KLSAgICAgICAgc2V0IGxsaXN0IFtOb2RlX2dldF9uZXh0ICRsbGlzdF0gICAKLSAgICB9Ci0gICAgcmV0dXJuICRsaXN0ICAgICAgICAgICAgICAgICAgICAgIAotfQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2hlbiBydW4gaW50ZXJhY3RpdmVseSwgd2UgY291bGQgbm93IHVzZSBvdXIgVGNsIGZ1bmN0aW9ucyBhcwotZm9sbG93cy4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0lIHNldCBsIHtKb2huIEFubmUgTWFyeSBKaW19Ci1Kb2huIEFubmUgTWFyeSBKaW0KLSUgc2V0IGxsIFtidWlsZGxpc3QgJGwgXzBfTm9kZV9wXSAgICAgICAgICAgCi1fMTAwMGNhYjhfTm9kZV9wCi0lIGdldF9saXN0ICRsbAotSmltIE1hcnkgQW5uZSBKb2huCi0lIHNldCBsbCBbYnVpbGRsaXN0IHtNaWtlIFBldGVyIERhdmV9ICRsbF0KLV8xMDAwY2MzOF9Ob2RlX3AKLSUgZ2V0X2xpc3QgJGxsCi1EYXZlIFBldGVyIE1pa2UgSmltIE1hcnkgQW5uZSBKb2huCi0lIAotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLUFzaWRlIGZyb20gdGhlIHBvaW50ZXIgdmFsdWVzLCBvdXIgc2NyaXB0IGFjdHMgbGlrZSBhbnkgb3RoZXIKLVRjbCBzY3JpcHQuICAgSG93ZXZlciwgd2UgaGF2ZSBidWlsdCB1cCBhIHJlYWwKLUMgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb3VsZCBiZSBlYXNpbHkgcGFzc2VkIHRvIG90aGVyIEMgZnVuY3Rpb25zCi1pZiBuZWVkZWQuCi0KLTxoMz4gNS4yLiBVc2luZyBDIERhdGEtU3RydWN0dXJlcyB3aXRoIFRrIDwvaDM+Ci0KLUluIG1hbm5lciBzaW1pbGFyIHRvIHRoZSBsaW5rZWQgbGlzdCBleGFtcGxlLCBUY2wvVGsgY2FuIGJlIHVzZWQKLXRvIGJ1aWxkIGNvbXBsZXggQy9DKysgZGF0YSBzdHJ1Y3R1cmVzLiAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHdlCi13YW50ZWQgdG8gaW50ZXJhY3RpdmVseSBidWlsZCBhIGdyYXBoIG9mIGBgTm9kZXMnJyBmb3IgdXNlIGluIGEgQwotYXBwbGljYXRpb24uCi1BIHR5cGljYWwgaW50ZXJmYWNlIGZpbGUgbWlnaHQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLSV7Ci0jaW5jbHVkZSAibm9kZXMuaCIKLSV9Ci0KLSVpbmNsdWRlIHdpc2gKLWV4dGVybiBOb2RlICpuZXdfbm9kZSgpOyAgICAgICAgICAgICAgICAgCi1leHRlcm4gdm9pZCBBZGRFZGdlKE5vZGUgKm4xLCBOb2RlICpuMik7IAotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2l0aGluIGEgVGNsL1RrIHNjcmlwdCwgbG9vc2VseSBiYXNlZCBvbiBvbmUgdG8gbWFrZSBiYWxsIGFuZCBzdGljayBncmFwaHMKLWluIFtPdXN0ZXJob3V0XSwgYSBncmFwaCBjb3VsZCBiZSBidWlsdCBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotcHJvYyBtYWtlTm9kZSB7eCB5fSB7Ci0gICBnbG9iYWwgbm9kZVggbm9kZVkgbm9kZVAgZWRnZUZpcnN0IGVkZ2VTZWNvbmQKLSAgIHNldCBuZXcgWy5jcmVhdGUgb3ZhbCBbZXhwciAkeC0xNV0gXAotICAgICAgICAgICBbZXhwciAkeS0xNV0gW2V4cHIgJHgrMTVdIFwKLSAgICAgICAgICAgW2V4cHIgJHkrMTVdIC1vdXRsaW5lIGJsYWNrIFwKLSAgICAgICAgICAgLWZpbGwgd2hpdGUgLXRhZ3Mgbm9kZV0KLSAgIHNldCBuZXdub2RlIFtuZXdfbm9kZV0gICAgICAgICAgIAotICAgc2V0IG5vZGVYKCRuZXcpICR4Ci0gICBzZXQgbm9kZVkoJG5ldykgJHkKLSAgIHNldCBub2RlUCgkbmV3KSAkbmV3bm9kZSAgICAgICAgIAotICAgc2V0IGVkZ2VGaXJzdCgkbmV3KSB7fQotICAgc2V0IGVkZ2VTZWNvbmQoJG5ldykge30KLX0KLXByb2MgbWFrZUVkZ2Uge2ZpcnN0IHNlY29uZH0gewotICAgZ2xvYmFsIG5vZGVYIG5vZGVZIG5vZGVQIGVkZ2VGaXJzdCBlZGdlU2Vjb25kCi0gICBzZXQgeDEgJG5vZGVYKCRmaXJzdCk7ICBzZXQgeTEgJG5vZGVZKCRmaXJzdCkKLSAgIHNldCB4MiAkbm9kZVgoJHNlY29uZCk7IHNldCB5MiAkbm9kZVkoJHNlY29uZCkKLSAgIHNldCBlZGdlIFsuYyBjcmVhdGUgbGluZSAkeDEgJHkxICR4MiAkeTIgXAotICAgICAgICAgICAgICAtdGFncyBlZGdlfQotICAgLmMgbG93ZXIgZWRnZQotICAgbGFwcGVuZCBlZGdlRmlyc3QoJGZpcnN0KSAkZWRnZQotICAgbGFwcGVuZCBlZGdlU2Vjb25kKCRmaXJzdCkgJGVkZ2UKLSAgIEFkZEVkZ2UgJG5vZGVQKCRmaXJzdCkgJG5vZGVQKCRzZWNvbmQpCi19Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1UaGVzZSBmdW5jdGlvbnMgY3JlYXRlCi1UayBjYW52YXMgaXRlbXMsIGJ1dCBhbHNvIGF0dGFjaCBhIHBvaW50ZXIgdG8gYSBDIGRhdGEgc3RydWN0dXJlIHRvIGVhY2ggb25lLgotVGhpcyBpcyBkb25lIGJ5IG1haW50YWluaW5nIGFuIGFzc29jaWF0aXZlIGFycmF5IG1hcHBpbmcgCi1pdGVtIGlkZW50aWZpZXJzIHRvIHBvaW50ZXJzICh3aXRoIHRoZSA8dHQ+IG5vZGVQKCkgPC90dD4gYXJyYXkpLiAKLVdoZW4gYQotcGFydGljdWxhciBgYG5vZGUnJyBpcyByZWZlcmVuY2VkIGxhdGVyLCB3ZSBjYW4gdXNlIHRoaXMgdG8KLWdldCBpdHMgcG9pbnRlciB1c2UgaXQgaW4gY2FsbHMgdG8gQyBmdW5jdGlvbnMuCi0KLTxoMz4gNS4zLiBQYXJzaW5nIGEgQysrIFNpbXBsZSBDbGFzcyBIaWVyYXJjaHkgPC9oMz4KLQotQXMgbWVudGlvbmVkIGVhcmxpZXIsIFNXSUcgY2FuIGhhbmRsZSBDKysgY2xhc3NlcyBhbmQgcHVibGljCi1pbmhlcml0YW5jZS4gICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcHJvdmlkZXMgYSBmZXcgY2xhc3NlcwotYW5kIGlsbHVzdHJhdGVzIGhvdyB0aGlzIGlzIGFjY29tcGxpc2hlZCAoc29tZSBjb2RlIGhhcyBiZWVuCi1vbW1pdHRlZCBmb3IgcmVhZGFiaWxpdHkpLgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotLy8gQSBTV0lHIGluaGVyaXRhbmNlIGV4YW1wbGUKLSVtb2R1bGUgc2hhcGVzCi0lewotI2luY2x1ZGUgInNoYXBlcy5oIgotJX0KLQotY2xhc3MgU2hhcGUgewotcHJpdmF0ZToKLSAgZG91YmxlIHhjLCB5YzsKLXB1YmxpYzoKLSAgdmlydHVhbCBkb3VibGUgYXJlYSgpID0gMDsKLSAgdmlydHVhbCBkb3VibGUgcGVyaW1ldGVyKCkgPSAwOwotICB2b2lkICAgIHNldF9wb3NpdGlvbihkb3VibGUgeCwgZG91YmxlIHkpOwotICB2b2lkICAgIHByaW50X3Bvc2l0aW9uKCk7Ci19OwotCi1jbGFzcyBDaXJjbGU6IHB1YmxpYyBTaGFwZSB7Ci0gcHJpdmF0ZToKLSAgZG91YmxlIHJhZGl1czsKLSBwdWJsaWM6Ci0gIENpcmNsZShkb3VibGUgcik7Ci0gIGRvdWJsZSBhcmVhKCk7Ci0gIGRvdWJsZSBwZXJpbWV0ZXIoKTsKLX07Ci0KLWNsYXNzIFNxdWFyZSA6IHB1YmxpYyBTaGFwZSB7Ci1wcml2YXRlOgotICBkb3VibGUgd2lkdGg7Ci1wdWJsaWM6Ci0gIFNxdWFyZShkb3VibGUgdyk7Ci0gIGRvdWJsZSBhcmVhKCk7Ci0gIGRvdWJsZSBwZXJpbWV0ZXIoKTsKLX07Ci0KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLU5vdywgd2hlbiB3cmFwcGVkIGJ5IFNXSUcgKG5vdGUgOgotV2hlbiBwYXJzaW5nIEMrKyBjbGFzc2VzLCBTV0lHIHRocm93cyBhd2F5IGV2ZXJ5dGhpbmcgZGVjbGFyZWQgYXMgcHJpdmF0ZSwKLWlubGluZSBjb2RlLCBhbmQgYWxvdCBvZiB0aGUgb3RoZXIgY2x1dHRlciBmb3VuZCBpbiBDKysgaGVhZGVyIGZpbGVzLiAgCi1QcmltYXJpbHkgdGhpcyBpcyBwcm92aWRlZCBvbmx5IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIGludGVyZmFjZXMgZnJvbQotZXhpc3RpbmcgQysrIGhlYWRlciBmaWxlcy4pLCB3ZSBjYW4gdXNlIG91ciBjbGFzcyBzdHJ1Y3R1cmUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLSUgc2V0IGMgW25ld19DaXJjbGUgNF0KLV8xMDAwYWQ3MF9DaXJjbGVfcAotJSBzZXQgcyBbbmV3X1NxdWFyZSAxMF0KLV8xMDAwYWRjMF9TcXVhcmVfcAotJSBTaGFwZV9hcmVhICRjCi01MC4yNjU0ODI0NjQwMDAwMDIwMAotJSBTaGFwZV9hcmVhICRzCi0xMDAuMDAwMDAwMDAwMDAwMDAwMDAKLSUgU2hhcGVfc2V0X3Bvc2l0aW9uICRjIC01IDEwCi0lIENpcmNsZV9wcmludF9wb3NpdGlvbiAkYwoteGMgPSAtNSwgeWMgPSAxMAotJSAKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLUluIG91ciBleGFtcGxlLCB3ZSBoYXZlIGNyZWF0ZWQgbmV3IDx0dD4gQ2lyY2xlIDwvdHQ+IGFuZCA8dHQ+IFNxdWFyZSA8L3R0PiBvYmplY3RzLAotYnV0IHRoZXNlIGNhbiBiZSB1c2VkIGludGVyY2hhbmdhYmx5IGluIGFueSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgPHR0PiBTaGFwZSA8L3R0PgotYmFzZSBjbGFzcy4gIFRoZSBTV0lHIHR5cGUgY2hlY2tlciBpcyBlbmNvZGVkIHdpdGggdGhlIGNsYXNzIGhpZXJhcmNoeSBhbmQKLWtub3dzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZGlmZmVyZW50IGNsYXNzZXMuICAgVGh1cywgd2hpbGUgYW4KLW9iamVjdCBvZiB0eXBlIDx0dD4gQ2lyY2xlIDwvdHQ+IGlzIHBlcmZlY3RseSBhY2NlcHRhYmxlIHRvIGEgZnVuY3Rpb24gb3BlcmF0aW5nCi1vbiBzaGFwZXMsIGl0IHdvdWxkIGJlIHVuYWNjZXB0YWJsZSB0byBhIGZ1bmN0aW9uIG9wZXJhdGluZyBvbmx5IG9uIHRoZQotPHR0PiBTcXVhcmUgPC90dD4gdHlwZS4gICAgQXMgaW4gQysrLCBhbnkgZnVuY3Rpb25zIGluIHRoZSBiYXNlIGNsYXNzIGNhbiBiZQotY2FsbGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIGFzIHNob3duIGJ5IHRoZSA8dHQ+IENpcmNsZV9wcmludF9wb3NpdGlvbiA8L3R0PgotZnVuY3Rpb24gYWJvdmUuCi0KLTxoMj4gNi4gVXNpbmcgU1dJRyBpbiBSZWFsIEFwcGxpY2F0aW9ucyA8L2gyPgotCi1TbyBmYXIgb25seSBhIGZldyBzaW1wbGUgdG95IGV4YW1wbGVzIGhhdmUgYmVlbiBwcmVzZW50ZWQgdG8gaWxsdXN0cmF0ZQotdGhlIG9wZXJhdGlvbiBvZiBTV0lHIGluIGdlbmVyYWwuCi1UaGlzIHNlY3Rpb24gd2lsbCBkZXNjcmliZSBob3cgU1dJRyBjYW4gYmUgdXNlZAotd2l0aCBsYXJnZXIgYXBwbGljYXRpb25zLgotCi08aDM+IDYuMS4gVXNlIGluIFNjaWVudGlmaWMgQXBwbGljYXRpb25zIDwvaDM+Ci0gCi1NYW55IHVzZXJzLCBlc3BlY2lhbGx5IHdpdGhpbiB0aGUgc2NpZW50aWZpYyBhbmQgZW5naW5lZXJpbmcgCi1jb21tdW5pdHksIGhhdmUgc3BlbnQgeWVhcnMgZGV2ZWxvcGluZyBzaW11bGF0aW9uIGNvZGVzLgotV2hpbGUgbWFueSBvZiB0aGVzZSB1c2VycyBhcHByZWNpYXRlIHRoZQotcG93ZXIgdGhhdCBhIHNjcmlwdGluZyBsYW5ndWFnZSBjYW4gcHJvdmlkZSwgdGhleSBkb24ndCB3YW50IHRvIAotY29tcGxldGVseSByZXdyaXRlIHRoZWlyIGFwcGxpY2F0aW9ucyBvciBzcGVuZCBhbGwgb2YgdGhlaXIgdGltZQotdHJ5aW5nIHRvIGJ1aWxkIGEgdXNlci1pbnRlcmZhY2UgKG1vc3QgdXNlcnMgd291bGQgcmF0aGVyIGJlIHdvcmtpbmcKLW9uIHRoZSBzY2llbnRpZmljIHByb2JsZW0gYXQgaGFuZCkuICBXaGlsZSBTV0lHIGNlcnRhaW5seSB3b24ndCBkbyBldmVyeXRoaW5nLAotaXQgY2FuIGRyYW1hdGljYWxseSBzaW1wbGlmeSB0aGlzIHByb2Nlc3MuICAgPGJyPiA8YnI+Ci0KLUFzIGFuIGV4YW1wbGUsIHRoZSBmaXJzdCBTV0lHIGFwcGxpY2F0aW9uIHdhcyB0aGUgU1BhU00gbW9sZWN1bGFyCi1keW5hbWljcyBjb2RlIGRldmVsb3BlZCBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkKLVtCZWF6bGV5LExvbWRhaGxdLiAgIFRoaXMgY29kZSBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBmb3IgbWF0ZXJpYWxzCi1zY2llbmNlIHByb2JsZW1zIGFuZCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gMjAwIEMgZnVuY3Rpb25zIGFuZCBhYm91dCAyMDAwMCBsaW5lcwotb2YgY29kZS4KLUluIG9yZGVyIHRvIHVzZSBTV0lHLCBvbmx5IHRoZSA8dHQ+IG1haW4oKSA8L3R0PiBmdW5jdGlvbiBoYWQgdG8gYmUKLXJld3JpdHRlbiBhbG9uZyB3aXRoIGEgZmV3IG90aGVyIG1pbm9yIG1vZGlmaWNhdGlvbnMuCi1UaGUgZnVsbCB1c2VyIGludGVyZmFjZSBpcyBidWlsdCB1c2luZyBhIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBmb3IKLXNpbXVsYXRpb24sIGdyYXBoaWNzLCBtZW1vcnkgbWFuYWdlbWVudCwgZXRjLi4uIAotQSB1c2VyIG1heSBhbHNvIHN1cHBseSB0aGVpciBvd24gaW50ZXJmYWNlIG1vZHVsZXMtLWFsbG93aW5nIHRoZSBjb2RlIHRvCi1iZSBlYXNpbHkgZXh0ZW5kZWQgd2l0aCBuZXcgZnVuY3Rpb25hbGl0eSBjYXBhYmlsaXRpZXMgYXMgbmVlZGVkLgotQWxsIG9mIHRoZSBpbnRlcmZhY2UgZmlsZXMsIGNvbnRhaW5pbmcgYSBmZXcgaHVuZHJlZCBsaW5lcyBvZgotZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBhcmUgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIGludG8gbW9yZSB0aGFuCi0yMDAwIGxpbmVzIG9mIHdyYXBwZXIgY29kZSBhdCBjb21waWxlIHRpbWUuICAgQXMgYSByZXN1bHQsIG1hbnkgdXNlcnMgCi1vZiB0aGUgc3lzdGVtIGtub3cgaG93IHRvIGV4dGVuZCBpdCwgYnV0IGFyZSB1bmF3YXJlIG9mIHRoZSBhY3R1YWwKLXdyYXBwaW5nIHByb2NlZHVyZS4gICA8YnI+IDxicj4KLQotQWZ0ZXIgbW9kaWZ5aW5nIHRoZSBTUGFTTSBjb2RlIHRvIHVzZSBTV0lHLCBtb3N0IG9mIHRoZSBDIGNvZGUgcmVtYWluZWQKLXVuY2hhbmdlZC4gIEluIGZhY3QsIGluIHN1YnNlcXVlbnQgd29yaywgd2Ugd2VyZSBhYmxlIHRvIGVsaW1pbmF0ZQotbW9yZSB0aGFuIDI1JSBvZiB0aGUgc291cmNlIGNvZGUtLWFsbW9zdCBhbGwgb2Ygd2hpY2ggd2FzIHJlbGF0ZWQgdG8gdGhlCi1ub3cgb2Jzb2xldGUgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IHdlIHJlcGxhY2VkLiAgIE1vcmUgaW1wb3J0YW50bHksIHdlCi13ZXJlIGFibGUgdG8gdHVybiBhIGNvZGUgdGhhdCB3YXMgZGlmZmljdWx0IHRvIHVzZSBhbmQgbW9kaWZ5IGludG8gYSAKLWZsZXhpYmxlIHBhY2thZ2UgdGhhdCB3YXMgZWFzeSB0byB1c2UgYW5kIGV4dGVuZC4gICBUaGlzIGhhcyBoYWQgYQotaHVnZSBpbXBhY3QsIHdoaWNoIGNhbiBub3QgYmUgdW5kZXJzdGF0ZWQsIG9uIHRoZSB1c2Ugb2YgdGhlIFNQYVNNCi1jb2RlIHRvIHNvbHZlIHJlYWwgcHJvYmxlbXMuCi0KLTxoMz4gNi4yLiBPcGVuLUdMIGFuZCBJbnZlbnRvciA8L2gzPgotCi1XaGlsZSBTV0lHIHdhcyBwcmltYXJpbHkgZGVzaWduZWQgdG8gd29yayB3aXRoIGFwcGxpY2F0aW9uIGNvZGVzLCBpdAotY2FuIGFsc28gYmUgdXNlZCB0byB3cmFwIGxhcmdlIGxpYnJhcmllcy4gICBBdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLAotUGV0ZXItUGlrZSBTbG9hbiB1c2VkIFNXSUcgdG8gd3JhcCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBPcGVuLUdMCi1saWJyYXJ5IGludG8gVGNsIGZvciB1c2Ugd2l0aCBhbiBPcGVuLUdMIFRrIHdpZGdldC4gICBUaGUgcHJvY2VzcyBvZgotd3JhcHBpbmcgT3Blbi1HTCB3aXRoIFNXSUcgd2FzIGFzIHNpbXBsZSBhcyB0aGUgZm9sbG93aW5nIDoKLQotPHVsPgotPGxpPiAgTWFrZSBhIGNvcHkgb2YgdGhlIDx0dD4gZ2wuaCA8L3R0PiBoZWFkZXIgZmlsZS4KLTxsaT4gIENsZWFuIGl0IHVwIGJ5IHRha2luZyBhIGZldyBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIG91dCAKLSAgICAgIG9mIGl0LiAgIEZpeCBhIGZldyB0eXBlZGVmcy4KLTxsaT4gSW5zZXJ0IHRoZSBmb2xsb3dpbmcgY29kZSBpbnRvIHRoZSBiZWdpbm5pbmcgCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotJW1vZHVsZSBvcGVuZ2wKLSV7Ci0jaW5jbHVkZSAmbHQ7R0wvZ2wuaCZndDsKLSV9Ci0uLi4gQ29weSBlZGl0ZWQgZ2wuaCBoZXJlIC4uLgotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotPGxpPiBNb2RpZnkgdGhlIE9wZW4tR0wgd2lkZ2V0IHRvIGNhbGwgPHR0PiBPcGVuZ2xfSW5pdCA8L3R0Pi4KLTxsaT4gUmVjb21waWxlCi08L3VsPgotCi1UaGUgZW50aXJlIHByb2Nlc3MgcmVxdWlyZWQgb25seSBhYm91dCAxMCBtaW51dGVzIG9mIHdvcmssIGJ1dCByZXN1bHRlZAotaW4gbW9yZSB0aGFuIDUwMCBjb25zdGFudHMgYW5kIDM2MCBmdW5jdGlvbnMgYmVpbmcgYWRkZWQgdG8gVGNsLiAgRnVydGhlcm1vcmUsCi10aGlzIGV4dGVuc2lvbiBhbGxvd3MgT3Blbi1HTCBjb21tYW5kcyB0byBiZSBpc3N1ZWQgZGlyZWN0bHkgZnJvbSBUY2wncwotaW50ZXJwcmV0ZWQgZW52aXJvbm1lbnQgYXMgc2hvd24gaW4gdGhpcyBleGFtcGxlCi0oZnJvbSB0aGUgT3Blbi1HTCBtYW51YWwgW09wZW5HTF0pLgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotJSAuLi4gb3BlbiBHTCB3aWRnZXQgaGVyZSAuLi4KLSUgZ2xDbGVhckNvbG9yIDAuMCAwLjAgMC4wIDAuMAotJSBnbENsZWFyICRHTF9DT0xPUl9CVUZGRVJfQklUCi0lIGdsQ29sb3IzZiAxLjAgMS4wIDEuMAotJSBnbE9ydGhvIC0xLjAgMS4wIC0xLjAgMS4wIC0xLjAgMS4wCi0lIGdsQmVnaW4gJEdMX1BPTFlHT04KLSUgICAgZ2xWZXJ0ZXgyZiAtMC41IC0wLjUKLSUgICAgZ2xWZXJ0ZXgyZiAtMC41IDAuNQotJSAgICBnbFZlcnRleDJmIDAuNSAwLjUKLSUgICAgZ2xWZXJ0ZXgyZiAwLjUgLTAuNQotJSBnbEVuZAotJSBnbEZsdXNoCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1FYXJseSB3b3JrIGhhcyBhbHNvIGJlZW4gcGVyZm9ybWVkIG9uIHVzaW5nIFNXSUcgdG8gd3JhcCBwb3J0aW9ucyAKLW9mIHRoZSBPcGVuLUludmVudG9yIHBhY2thZ2UgW0ludmVudF0uICAgVGhpcyBpcyBhIG1vcmUgYW1iaXRpb3VzIHByb2plY3QKLXNpbmNlIE9wZW4tSW52ZW50b3IgY29uc2lzdHMgb2YgYSB2ZXJ5IGxhcmdlIGNvbGxlY3Rpb24gb2YgaGVhZGVyCi1maWxlcyBhbmQgQysrIGNsYXNzZXMuICAgIEhvd2V2ZXIsICB0aGUgU1dJRyBsaWJyYXJ5IG1lY2hhbmlzbSBjYW4gYmUKLXVzZWQgZWZmZWN0aXZlIGluIHRoaXMgY2FzZS4gICBGb3IgZWFjaCBJbnZlbnRvciBoZWFkZXIsIHdlIGNhbiBjcmVhdGUKLWEgc2FuaXRpemVkIFNXSUcgaW50ZXJmYWNlIGZpbGUgKHJlbW92aW5nIGFsb3Qgb2YgdGhlIGNsdXR0ZXIgZm91bmQgaW4KLXRoZSBoZWFkZXIgZmlsZXMpLiAgIFRoZXNlIGludGVyZmFjZSBmaWxlcyBjYW4gdGhlbiBiZSBvcmdhbml6ZWQgdG8gbWlycm9yIHRoZQotc3RydWN0dXJlIG9mIHRoZSBJbnZlbnRvciBzeXN0ZW0uICAgIFRvIGJ1aWxkIGEgbW9kdWxlIGZvciBUY2wsIGEgdXNlcgotY291bGQgc2ltcGx5IHNwZWNpZnkgd2hpY2ggbW9kdWxlcyB0aGV5IHdhbnRlZCB0byB1c2UgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci0lbW9kdWxlIGludmVudAotJXsKLS4uLiBwdXQgaGVhZGVycyBoZXJlIC4uLgotJX0KLQotJWluY2x1ZGUgIkludmVudG9yL1h0L1NvWHQuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9YdC9Tb1h0UmVuZGVyQXJlYS5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvQ29uZS5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvRGlyZWN0aW9uYWxMaWdodC5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvTWF0ZXJpYWwuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9ub2Rlcy9Tb1BlcnNwZWN0aXZlQ2FtZXJhLmkiCi0laW5jbHVkZSAiSW52ZW50b3Ivbm9kZXMvU29TZXBhcmF0b3IuaSIKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdoaWxlIHdyYXBwaW5nIHRoZSBJbnZlbnRvciBsaWJyYXJ5IHdpbGwgcmVxdWlyZSBzaWduaWZpY2FudGx5Ci1tb3JlIHdvcmsgdGhhbiBPcGVuLUdMLCBTV0lHIGNhbiBiZSB1c2VkIGVmZmVjdGl2ZWx5IHdpdGggc3VjaAotc3lzdGVtcy4gICAKLQotPGgzPiA2LjMuIEJ1aWxkaW5nIEludGVyZXN0aW5nIEFwcGxpY2F0aW9ucyBieSBDdXQgYW5kIFBhc3RlIDwvaDM+Ci0KLVNXSUcgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IHRvb2xzIG91dCBvZiBkaXNzaW1pbGlhciAKLXBhY2thZ2VzIGFuZCBsaWJyYXJpZXMuICAgCi1JbiBjb250cmFzdCB0byBjb21iaW5pbmcgcGFja2FnZXMgYXQgYW4gaW5wdXQgbGV2ZWwgYXMgb25lIG1pZ2h0Ci1kbyB3aXRoIHdpdGggRXhwZWN0LCBTV0lHIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyBhdCBhCi1mdW5jdGlvbiBsZXZlbCBbRXhwZWN0XS4KLUZvciBleGFtcGxlLCB1c2luZwotYSBzaW1wbGUgaW50ZXJmYWNlIGZpbGUsIHlvdSBjYW4gd3JhcCB0aGUKLUMgQVBJIG9mIE1BVExBQiA0LjIgW01BVExBQl0uCi1UaGlzIGluIHR1cm4gbGV0cyB5b3UgYnVpbGQgYSBUY2wvVGsgaW50ZXJmYWNlIGZvciBjb250cm9sbGluZwotTUFUTEFCIHByb2dyYW1zLiAgU2VwYXJhdGVseSwgeW91IGNvdWxkIHdyYXAgYSBudW1lcmljYWwgc2ltdWxhdGlvbgotY29kZS4gICBOb3csIGEgZmV3IHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBjb3VsZCBiZSB3cml0dGVuIGFuZCBib3RoCi1wYWNrYWdlcyBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIFRjbC9UayBhcHBsaWNhdGlvbi4gICBZb3UgaGF2ZQotbm93IGJ1aWx0IGEgc2ltcGxlIGBgY29tcHV0YXRpb25hbCBzdGVlcmluZycnIHN5c3RlbSB0aGF0IGFsbG93cyB5b3UKLXRvIHJ1biBhIHNpbXVsYXRpb24gY29kZSwgdmlzdWFsaXplIGRhdGEgaW4gTUFUTEFCLCBhbmQgY29udHJvbCB0aGUKLWVudGlyZSBzeXN0ZW0gd2l0aCBhIFRjbC9UayBiYXNlZCBpbnRlcmZhY2UuICAgIEZpZ3VyZSAyIHNob3dzCi1hIHNjcmVlbiBzbmFwc2hvdCBmcm9tIHN1Y2ggYSBzaW11bGF0aW9uIGluIHdoaWNoIHRoZSBTUGFTTSBtb2xlY3VsYXIKLWR5bmFtaWNzIGNvZGUsIGEgdmlzdWFsaXphdGlvbiBtb2R1bGUgbGlicmFyeSwgaW1hZ2Ugc2VydmVyICh1c2luZyB4diksCi1hbmQgTUFUTEFCIGhhdmUgYmVlbgotY29tYmluZWQuICAgVW5kZXIgdGhpcyBzeXN0ZW0sIHRoZSB1c2VyIGNhbiBpbnRlcmFjdGl2ZWx5IHNldCB1cAotYW5kIHJ1biBzaW11bGF0aW9ucyB3aGlsZSB3YXRjaGluZyB0aGUgcmVzdWx0cyBldm9sdmUgaW4gcmVhbC10aW1lLgotPGJyPiA8YnI+Ci08Y2VudGVyPgotPGltZyBhbHQgPSAiVGNsL1RrL01BVExBQi9TUEFTTSBGaWd1cmUiIHNyYz0ic3RlZXIyLmdpZiI+IDxicj4KLUZpZ3VyZSAyOiBTaW1wbGUgVGNsL1RrIFN0ZWVyaW5nIEFwcGxpY2F0aW9uIEJ1aWx0IHdpdGggU1dJRyA8YnI+Ci08L2NlbnRlcj4KLQotPGgzPiA2LjQuIExhbmd1YWdlIEluZGVwZW5kZW50IEFwcGxpY2F0aW9ucyA8L2gzPgotCi0KLUVhY2ggc2NyaXB0aW5nIGxhbmd1YWdlIGhhcyBpdCdzIG93biBzdHJlbmd0aHMgYW5kIHdlYWtuZXNzZXMuICAKLVJhdGhlcgotdGhhbiB0cnlpbmcgdG8gY2hvb3NlIHRoZSBsYW5ndWFnZSB0aGF0IGlzIHRoZSBiZXN0IGF0IGV2ZXJ5dGhpbmcgKHdoaWNoCi1pcyBwcm9iYWJseSBpbXBvc3NpYmxlKSwKLVNXSUcgYWxsb3dzIGEgdXNlciB0byB1c2UgdGhlIGJlc3QgbGFuZ3VhZ2UgZm9yIHRoZSBqb2IgYXQgaGFuZC4gIEknbQotYWx3YXlzIGZpbmRpbmcgbXlzZWxmIHdyaXRpbmcgbGl0dGxlIHV0aWxpdGllcyBhbmQgcHJvZ3JhbXMgdG8gc3VwcG9ydAotbXkgc2NpZW50aWZpYyBjb21wdXRpbmcgd29yay4gIFdoeSBzaG91bGQgSSBiZSBmb3JjZWQgdG8gdXNlIG9ubHkgb25lCi1sYW5ndWFnZSBmb3IgZXZlcnl0aGluZz8gIFdpdGggU1dJRywgSSBjYW4gcHV0IGEgUGVybCBpbnRlcmZhY2Ugb24gYQotdG9vbCBhbmQgc3dpdGNoIG92ZXIgdG8gVGNsL1RrIGF0IGFueXRpbWUgYnkganVzdCBjaGFuZ2luZyBhIGZldwotTWFrZWZpbGUgb3B0aW9ucy4gPGJyPiA8YnI+Ci0KLVNpbmNlIFNXSUcgcHJvdmlkZXMgYSBsYW5ndWFnZS1pbmRlcGVuZGVudCBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiwKLWl0IGlzIHJlbGF0aXZlbHkgZWFzeSB0byB1c2UgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyBpbiBhIHZhcmlldHkgb2YKLWludGVyZXN0aW5nIGFwcGxpY2F0aW9ucy4gIEZvciBleGFtcGxlLCB0aGUgaWRlbnRpY2FsIE1BVExBQgotbW9kdWxlIHVzZWQgaW4gdGhlIGxhc3QgVGNsIGV4YW1wbGUgY291bGQgYmUgaW1wb3J0ZWQgYXMgUGVybDUgbW9kdWxlCi1hbmQgY29tYmluZWQgd2l0aCBhIFBlcmwgc2NyaXB0IHRvIHByb2R1Y2UgZ3JhcGhpY2FsIGRpc3BsYXlzIGZyb20KLVdlYi1zZXJ2ZXIgbG9ncyBhcyBzaG93biBpbiBGaWd1cmUgMy4gPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08aW1nIGFsdD0iUGVybDUgd2ViIHN0YXRzIGV4YW1wbGUiIHNyYz0iaGl0cy5naWYiPiA8YnI+Ci1GaWd1cmUgMzpXZWItc2VydmVyIGFjdGl2aXR5IGdyYXBoLiAgR2VuZXJhdGVkIGZyb20gYSBQZXJsIHNjcmlwdCwgYnV0Ci11c2VzIGFuIHVubW9kaWZpZWQgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlIGZvciBpbnRlZ3JhdGluZyBNQVRMQUIgd2l0aCBUY2wvVGsuIDxicj4gPGJyPgotPC9jZW50ZXI+Ci0KLVNvbWUgaGF2ZSBwcm9tb3RlZCB0aGUgaWRlYSBvZiBlbmNhcHN1bGF0aW5nIHNldmVyYWwgbGFuZ3VhZ2VzIGludG8KLWEgaGlnaGVyIGxldmVsIGxhbmd1YWdlIGFzIGhhcyBiZWVuIHByb3Bvc2VkIHdpdGggR3VpbGUgW0xvcmRdLgotVGhpcyBtYXkgYmUgZmluZSBpZiBvbmUgd2FudHMgdG8gd3JpdGUgY29kZSB0aGF0IHVzZXMgZGlmZmVyZW50IGxhbmd1YWdlcwotYWxsIGF0IG9uY2UsIGJ1dCB3aGVuIEkgd2FudCB0byB1c2Ugb25seSBUY2wgb3IgUGVybCBmb3IgYW4gYXBwbGljYXRpb24sCi1JIGFsbW9zdCBhbHdheXMgcHJlZmVyIHVzaW5nIHRoZSByZWFsIHZlcnNpb25zIGluc3RlYWQgb2YgYW4gZW5jYXBzdWxhdGVkCi12YXJpYW50LiAgICAgU1dJRyBtYWtlcyB0aGlzIHBvc3NpYmxlIHdpdGhvdXQgbXVjaCBlZmZvcnQuCi0KLTxoMz4gNi41LiBVc2luZyBUY2wgYXMgYSBkZWJ1Z2dlciA8L2gzPgotCi1TaW5jZSBTV0lHIGNhbiB3b3JrIHdpdGggZXhpc3RpbmcgQyBjb2RlLCBpdCBjYW4gYmUgdXNlZCBxdWl0ZSBlZmZlY3RpdmVseQotYXMgYSBkZWJ1Z2dlci4KLVlvdSBjYW4gd3JhcCBDIGZ1bmN0aW9ucyBhbmQgaW50ZXJhY3QKLXdpdGggdGhlbSBmcm9tIDx0dD4gdGNsc2ggPC90dD4gb3IgPHR0PiB3aXNoIDwvdHQ+LgotVW5saWtlIG1vc3QgdHJhZGl0aW9uYWwgZGVidWdnZXJzLCB5b3UKLWNhbiBjcmVhdGUgb2JqZWN0cywgYnVmZmVycywgYXJyYXlzLCBhbmQgb3RoZXIgdGhpbmdzIG9uIHRoZSBmbHkKLWJ5IHB1dHRpbmcgYXBwcm9wcmlhdGUgZGVmaW5pdGlvbnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgotU2luY2UgPHR0PiB0Y2xzaCA8L3R0PiBvciA8dHQ+IHdpc2ggPC90dD4gcHJvdmlkZXMgYSA8dHQ+IG1haW4oKSA8L3R0PiBmdW5jdGlvbiwgeW91Ci1jYW4gZXZlbiByaXAgc21hbGwgcGllY2VzIG91dCBvZiBhIGxhcmdlciBwYWNrYWdlIHdpdGhvdXQgaW5jbHVkaW5nCi10aGF0IHBhY2thZ2UncyBtYWluIHByb2dyYW0uCi1TY3JpcHRzIGNhbiBiZSB3cml0dGVuIHRvIHRlc3Qgb3V0IGRpZmZlcmVudCBwYXJ0cyBvZiB5b3VyCi1jb2RlIGFzIGl0IGlzIGRldmVsb3BlZC4gICAgV2hlbiB5b3UgYXJlIHNhdGlzZmllZCB3aXRoIHRoZSBtb2R1bGUsCi1yZW1vdmluZyB0aGUgaW50ZXJmYWNlIGlzIGFzIGVhc3kgYXMgZGlzY2FyZGluZyB0aGUgU1dJRyBpbnRlcmZhY2UKLWZpbGUuICAgSSBoYXZlIHVzZWQgU1dJRyBhcyBhIGRlYnVnZ2VyIGZvciBkZXZlbG9waW5nIGdyYXBoaWNzIGxpYnJhcmllcywKLW5ldHdvcmsgc2VydmVycywgc2ltdWxhdGlvbiBjb2RlcywgYW5kIGEgd2lkZSByYW5nZSBvZiBvdGhlciBwcm9qZWN0cy0tc29tZQotb2Ygd2hpY2ggZGlkbid0IGV2ZW4gdXNlIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHdoZW4gY29tcGxldGVkLgotCi08aDI+IDcuIExpbWl0YXRpb25zIDwvaDI+Ci0KLVNXSUcgcmVwcmVzZW50cyBhIGJhbGFuY2Ugb2YgZmxleGliaWxpdHkgYW5kIGVhc2Ugb2YgdXNlLgotSSBoYXZlIGFsd2F5cyBmZWx0IHRoYXQgdGhlIHRvb2wgc2hvdWxkbid0IGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbgotdGhlIG9yaWdpbmFsIHByb2JsZW0uICAgIFRoZXJlZm9yZSwgU1dJRyBjZXJ0YWlubHkgd29uJ3QgZG8gZXZlcnl0aGluZy4KLVdoaWxlIEkgYmVsaWV2ZSB0aGUgcG9pbnRlciByZXByZXNlbnRhdGlvbiBvZiBjb21wbGV4IGRhdGF0eXBlcyB3b3Jrcwotd2VsbCBpbiBwcmFjdGljZSwgc29tZSB1c2VycyBoYXZlIGZvdW5kIHRoaXMgdG8gYmUgdG9vIGdlbmVyYWwgb3IKLWNvbmZ1c2luZy4gICAgU1dJRydzCi1zdXBwb3J0IGZvciBDKysgaXMgYWxzbyBsaW1pdGVkIGJ5IHRoZSBmYWN0IHRoYXQgU1dJRyBkb2VzIG5vdCBzdXBwb3J0Ci1vcGVyYXRvciBvdmVybG9hZGluZywgbXVsdGlwbGUgaW5oZXJpdGFuY2UsIHRlbXBsYXRlcywgYW5kIGEgbnVtYmVyCi1vZiBvdGhlciBtb3JlIGFkdmFuY2VkIEMrKyBmZWF0dXJlcy4gICAgU1dJRyBhbHNvIGxhY2tzIHN1cHBvcnQgZm9yCi1kZWZhdWx0IG9yIHZhcmlhYmxlIGxlbmd0aCBmdW5jdGlvbiBhcmd1bWVudHMsIGFycmF5IG5vdGF0aW9uLAotcG9pbnRlcnMgdG8gZnVuY3Rpb25zICh1bmxlc3MgaGlkZGVuIGJ5IGEgdHlwZWRlZikgYW5kIGFuIGV4Y2VwdGlvbgotbWVjaGFuaXNtLiAKLUZpbmFsbHksIFNXSUcKLWRvZXMKLW5vdCBzdXBwb3J0IGFsbCBvZiB0aGUgZmVhdHVyZXMgb2YgVGNsIHN1Y2ggYXMgYXNzb2NpYXRpdmUgYXJyYXlzLgotVGhlc2UgYXJlbid0IGFuIGluaGVyZW50IHBhcnQgb2YgdGhlIEMgbGFuZ3VhZ2Ugc28gaXQgaXMgZGlmZmljdWx0Ci10byBnZW5lcmFsaXplIGhvdyB0aGV5IHNob3VsZCBiZSBoYW5kbGVkIG9yIGdlbmVyYXRlZC4gSSBwcmVmZXIgdG8KLWtlZXAgdGhlIHRvb2wgc2ltcGxlIHdoaWxlIGxlYXZpbmcgdGhlc2UgaXNzdWVzIHVwIHRvIHRoZSBpbmRpdmlkdWFsCi1wcm9ncmFtbWVyLiAgPGJyPiA8YnI+Ci0KLQotRm9ydHVuYXRlbHksIGl0IGlzIGFsbW9zdCBhbHdheXMgcG9zc2libGUgdG8gd29yayBhcm91bmQKLW1hbnkgcHJvYmxlbXMgYnkgd3JpdGluZyBzcGVjaWFsIGxpYnJhcnkgZnVuY3Rpb25zIG9yIG1ha2luZwotbW9kaWZpY2F0aW9ucyB0byB0aGUgU1dJRyBsYW5ndWFnZSBtb2R1bGVzIHRvIHByb2R1Y2UgdGhlIGRlc2lyZWQgZWZmZWN0LgotRm9yIGV4YW1wbGUsIHdoZW4gd3JhcHBpbmcgT3Blbi1HTCwgU1dJRyBpbnN0YWxsZWQgYWxsIG9mIHRoZSBPcGVuLUdMCi1jb25zdGFudHMgYXMgVGNsIGdsb2JhbCB2YXJpYWJsZXMuICAgVW5mb3J0dW5hdGVseSwgbm9uZSBvZiB0aGVzZQotdmFyaWFibGVzIHdlcmUgYWNjZXNzaWJsZSBpbnNpZGUgVGNsIHByb2NlZHVyZXMgdW5sZXNzIHRoZXkgd2VyZSBleHBsaWNpdGx5Ci1kZWNsYXJlZCBnbG9iYWwuICAgQnkgbWFraW5nIGEgbW9kaWZpY2F0aW9uIHRvIHRoZSBUY2wgbGFuZ3VhZ2UgbW9kdWxlLAotaXQgd2FzIHBvc3NpYmxlIHRvIHB1dCB0aGUgR0wgY29uc3RhbnRzIGludG8gaGFzaCB0YWJsZSBhbmQgcGVyZm9ybQotYSBoaWRkZW4gYGBsb29rdXAnJyBpbnNpZGUgYWxsIG9mIHRoZSBHTC1yZWxhdGVkIGZ1bmN0aW9ucy4gIFNpbWlsYXJseSwKLW11Y2ggb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgU1dJRyBjYW4gYmUgcGxhY2VkIGludG8gbGlicmFyeQotZmlsZXMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzLgotCi08aDI+IDguIENvbmNsdXNpb25zIDwvaDI+Ci0KLVNXSUcgaGFzIGJlZW4gaW4gdXNlIGZvciBhcHByb3hpbWF0ZWx5IG9uZSB5ZWFyLiAgQXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCBpdHMgdXNlIHdpdGggdGhlIFNQYVNNIGNvZGUgaGFzCi1wcm92ZW4gdG8KLWJlIGEgcmVtYXJrYWJseSBzaW1wbGUsIHN0YWJsZSwgYW5kIGJ1Zy1mcmVlIHdheSB0byBidWlsZCBhbmQgbW9kaWZ5IHVzZXIKLWludGVyZmFjZXMuICAgQXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCwgU1dJRyBpcyBiZWluZyB1c2VkIGluIGEgdmFyaWV0eQotb2Ygb3RoZXIgYXBwbGljYXRpb25zIHdoZXJlIHRoZSB1c2VycyBoYXZlIHF1aWNrbHkgY29tZSB0byBhcHByZWNpYXRlIGl0cwotZWFzZSBvZiB1c2UgYW5kIGZsZXhpYmlsaXR5LiA8YnI+IDxicj4KLQotV2hpbGUgU1dJRyBtYXkgYmUgaW5hcHByb3ByaWF0ZSBmb3IgY2VydGFpbiBhcHBsaWNhdGlvbnMsIEkgZmVlbCB0aGF0IGl0Ci1vcGVucyB1cCBUY2wvVGssIFB5dGhvbiwgUGVybCwgR3VpbGUsIGFuZCBvdGhlciBsYW5ndWFnZXMgIHRvIAotdXNlcnMgd2hvIHdvdWxkIGxpa2UgdG8gZGV2ZWxvcCBpbnRlcmVzdGluZyB1c2VyIGludGVyZmFjZXMgZm9yIHRoZWlyIGNvZGVzLAotYnV0IHdobyBkb24ndCB3YW50IHRvIHdvcnJ5IGFib3V0IHRoZSBsb3ctbGV2ZWwgZGV0YWlscyBvciBmaWd1cmluZwotb3V0IGhvdyB0byB1c2UgYSBjb21wbGljYXRlZCB0b29sLiAgPGJyPiA8YnI+Ci0gIAotRnV0dXJlIGRpcmVjdGlvbnMgZm9yIFNXSUcgaW5jbHVkZSBzdXBwb3J0IGZvciBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLAotYW5kIGEgbGlicmFyeSBvZiBleHRlbnNpb25zLiAgU1dJRyBtYXkgYWxzbyBiZSBleHRlbmRlZCB0byBzdXBwb3J0IHBhY2thZ2VzCi1zdWNoIGFzIGluY3JlbWVudGFsIFRjbC4gV29yayBpcyBhbHNvIHVuZGVyd2F5IHRvIHBvcnQgU1dJRyB0byBub24tdW5peAotcGxhdGZvcm1zLgotCi08aDI+IEFja25vd2xlZGdtZW50cyA8L2gyPgotCi1UaGlzIHByb2plY3Qgd291bGQgbm90IGhhdmUgYmVlbiBwb3NzaWJsZSB3aXRob3V0IHRoZSBzdXBwb3J0IG9mIGEgbnVtYmVyCi1vZiBwZW9wbGUuICAgUGV0ZXIgTG9tZGFobCwgU2h1amlhIFpob3UsIEJyYWQgSG9saWFuLCBUaW0gR2VybWFubiwgYW5kIE5pZWxzCi1KZW5zZW4gYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IHdlcmUgdGhlIGZpcnN0IHVzZXJzIGFuZCB3ZXJlCi1pbnN0cnVtZW50YWwgaW4gdGVzdGluZyBvdXQgdGhlIGZpcnN0IGRlc2lnbnMuICAgUGF0cmljayBUdWxsbWFubiBhdAotdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBzdWdnZXN0ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIGRvY3VtZW50YXRpb24KLWdlbmVyYXRpb24uICBKb2huIFNjaG1pZHQsIEt1cnRpcwotQmxlZWtlciwgUGV0ZXItUGlrZSBTbG9hbiwgYW5kIFN0ZXZlIFBhcmtlciBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIHRlc3RlZCBvdXQgc29tZSBvZiB0aGUgbmV3ZXIgdmVyc2lvbnMgYW5kCi1wcm92aWRlZCB2YWx1YWJsZSBmZWVkYmFjay4gICBKb2huIEJ1Y2ttYW4gc3VnZ2VzdGVkIG1hbnkgaW50ZXJlc3RpbmcKLWltcHJvdmVtZW50cyBhbmQgaGFzIGJlZW4gaW5zdHJ1bWVudGFsIHRoZSByZWNlbnQgZGV2ZWxvcG1lbnQgb2YgU1dJRy4KLUZpbmFsbHkKLUknZCBsaWtlIHRvIHRoYW5rIENocmlzIEpvaG5zb24gYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBTY2llbnRpZmljCi1Db21wdXRpbmcgYW5kIEltYWdpbmcgZ3JvdXAgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBmb3IgdGhlaXIgY29udGludWVkCi1zdXBwb3J0IGFuZCBmb3IgcHV0dGluZyB1cCB3aXRoIG15IHdyYXBwaW5nIGV2ZXJ5IHNvZnR3YXJlIHBhY2thZ2UKLUkgY291bGQgZ2V0IG15IGhhbmRzIG9uLiAgICBTV0lHIHdhcyBkZXZlbG9wZWQgaW4gcGFydCB1bmRlciB0aGUKLWF1c3BpY2VzIG9mIHRoZSBVUyBEZXBhcnRtZW50IG9mIEVuZXJneSwgdGhlIE5hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiwgCi1hbmQgTmF0aW9uYWwgSW5zdGl0dXRlcyBvZiBIZWFsdGguCi0KLTxoMj4gQXZhaWxhYmlsaXR5IDwvaDI+Ci0KLVNXSUcgaXMgZnJlZSBzb2Z0d2FyZSBhbmQgYXZhaWxhYmxlIHZpYSBhbm9ueW1vdXMgRlRQIGF0ICA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTx0dD4gZnRwLmNzLnV0YWguZWR1L3B1Yi9iZWF6bGV5L1NXSUcgPC90dD4gPGJyPiA8YnI+Ci08L2NlbnRlcj4KLQotTW9yZSBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgU1dJRyBob21lcGFnZSBhdCAgPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmNzLnV0YWguZWR1L35iZWF6bGV5L1NXSUciPiA8dHQ+IGh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkvU1dJRyA8L3R0PiA8L2E+Ci08L2NlbnRlcj4gPGJyPiA8YnI+Ci0KLTxoMj4gUmVmZXJlbmNlcyA8L2gyPgotCi1bQmVhemxleV0gRC5NLiBCZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwsIAotPGVtPiBNZXNzYWdlLVBhc3NpbmcgTXVsdGktQ2VsbCBNb2xlY3VsYXIgRHluYW1pY3Mgb24gdGhlIENvbm5lY3Rpb24KLU1hY2hpbmUgNSA8L2VtPiwgUGFyYWxsZWwgQ29tcHV0aW5nIDIwICgxOTk0KSBwLiAxNzMtMTk1LiA8YnI+IDxicj4KLQotW0VUXSBFbWJlZGRlZCBUaywgPGJyPgotPHR0PiBmdHA6Ly9mdHAudm5ldC5uZXQvcHViL3VzZXJzL2RyaC9FVC5odG1sIDwvdHQ+IDxicj4gPGJyPgotCi1bRXhwZWN0XSBEb24gTGliZXMsIDxlbT4gRXhwbG9yaW5nIEV4cGVjdCA8L2VtPiwgTydSZWlsbHkgJmFtcDsgQXNzb2NpYXRlcywgSW5jLiAoMTk5NSkuIDxicj4gPGJyPgotCi1bSGVpZHJpY2hdIFdvbGZnYW5nIEhlaWRyaWNoIGFuZCBQaGlsaXBwIFNsdXNhbGxlaywgPGVtPgotQXV0b21hdGljIEdlbmVyYXRpb24gb2YgVGNsIEJpbmRpbmdzIGZvciBDIGFuZCBDKysgTGlicmFyaWVzLjwvZW0+LAotVVNFTklYIDNyZCBBbm51YWwgVGNsL1RrIFdvcmtzaG9wICgxOTk1KS4gPGJyPiA8YnI+Ci0KLVtKYW5zc2VuXSBCaWxsIEphbnNzZW4sIE1pa2UgU3ByZWl0emVyLCA8ZW0+IElMVSA6IEludGVyLUxhbmd1YWdlIFVuaWZpY2F0aW9uIHZpYSBPYmplY3QgTW9kdWxlcyA8L2VtPiwgT09QU0xBIDk0IFdvcmtzaG9wIG9uIE11bHRpLUxhbmd1YWdlCi1PYmplY3QgTW9kZWxzLiA8YnI+IDxicj4KLQotW0xvbWRhaGxdIFAuUy4gTG9tZGFobCwgUC4gVGFtYXlvLCAKLU4uR3JvbmJlY2gtSmVuc2VuLCBhbmQgRC5NLiBCZWF6bGV5LCAKLTxlbT4gUHJvYy4gb2YgU3VwZXJjb21wdXRpbmcgOTMgPC9lbT4sIElFRUUgQ29tcHV0ZXIgU29jaWV0eSAoMTk5MyksIHAuIDUyMC01MjcuCi08YnI+IDxicj4KLQotW0xvcmRdIFRob21hcyBMb3JkLCA8ZW0+IEFuIEFuYXRvbXkgb2YgR3VpbGUsIFRoZSBJbnRlcmZhY2UgdG8gCi1UY2wvVGsgPC9lbT4sIFByb2NlZWRpbmdzIG9mIHRoZSBVU0VOSVggM3JkIEFubnVhbCBUY2wvVGsgV29ya3Nob3AgKDE5OTUpLiA8YnI+IDxicj4KLQotW01BVExBQl0gPGVtPiBNQVRMQUIgRXh0ZXJuYWwgSW50ZXJmYWNlIEd1aWRlIDwvZW0+LCBUaGUgTWF0aCBXb3JrcywgSW5jLiAgKDE5OTMpLgotPGJyPiA8YnI+Ci0KLVtPdXN0ZXJob3V0XSBKb2huIEsuIE91c3RlcmhvdXQsIDxlbT4gVGNsIGFuZCB0aGUgVGsgVG9vbGtpdCA8L2VtPiwgQWRkaXNvbi1XZXNsZXkgUHVibGlzaGVycyAoMTk5NCkuIDxicj4gPGJyPgotCi1bUGVybDVdIFBlcmw1IFByb2dyYW1tZXJzIHJlZmVyZW5jZSwgPGJyPgotPHR0PiBodHRwOi8vd3d3Lm1ldHJvbmV0LmNvbS9wZXJsaW5mby9kb2MgPC90dD4sICgxOTk2KS4gPGJyPiA8YnI+Ci0KLVt2dGtdIFcuIFNjaHJvZWRlciwgSy4gTWFydGluLCBhbmQgQi4gTG9yZW5zZW4sIDxlbT4gVGhlCi1WaXN1YWxpemF0aW9uIFRvb2xraXQgPC9lbT4sIFByZW50aWNlIEhhbGwgICgxOTk1KS4gPGJyPiA8YnI+Ci0KLVtJbnZlbnRdIEouIFdlcm5lY2tlLDxlbT4gVGhlIEludmVudG9yIE1lbnRvciA8L2VtPiwgQWRkaXNvbi1XZXNsZXkgUHVibGlzaGluZyAoMTk5NCkuIDxicj4gPGJyPgotCi1bV2V0aGVyYWxsXSBELiBXZXRoZXJhbGwsIEMuIEouIExpbmRibGFkLCA8ZW0+IEV4dGVuZGluZyBUY2wgZm9yCi1EeW5hbWljIE9iamVjdC1PcmllbnRlZCBQcm9ncmFtbWluZyA8L2VtPiwgUHJvY2VlZGluZ3Mgb2YgdGhlIFVTRU5JWCAzcmQgQW5udWFsIFRjbC9UayBXb3Jrc2hvcCAoMTk5NSkuIDxicj4gPGJyPgotCi1bT3BlbkdMXSBKLiBOZWlkZXIsIFQuIERhdmlzLCBNLiBXb28sIDxlbT4gT3BlbkdMIFByb2dyYW1taW5nIEd1aWRlIDwvZW0+LCBBZGRpc29uLVdlc2xleSBQdWJsaXNoaW5nICgxOTkzKS4gPGJyPiA8YnI+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni9UY2xfVGFsay5wZGYgYi9zd2lnd2ViL3BhcGVycy9UY2w5Ni9UY2xfVGFsay5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNmQyN2YuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvVGNsX1RhbGsucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvZmlnMS5naWYgYi9zd2lnd2ViL3BhcGVycy9UY2w5Ni9maWcxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgwYzg3MC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni9maWcxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L2hpdHMuZ2lmIGIvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvaGl0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhZWE5NjguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvaGl0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni9zdGVlcjIuZ2lmIGIvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvc3RlZXIyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDJiMDE4Ny4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni9zdGVlcjIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvdGNsOTYuaHRtbCBiL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L3RjbDk2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYmRiZGMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvdGNsOTYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwODQgKzAsMCBAQAotPGh0bWw+Ci08dGl0bGU+IFNXSUcgOiBBbiBFYXN5IHRvIFVzZSBUb29sIEZvciBJbnRlZ3JhdGluZyBTY3JpcHRpbnQgTGFuZ3VhZ2VzIAotd2l0aCBDIGFuZCBDKysgPC90aXRsZT4KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotPGgxPgotU1dJRyA6IEFuIEVhc3kgdG8gVXNlIFRvb2wgZm9yIEludGVncmF0aW5nIFNjcmlwdGluZyBMYW5ndWFnZXMgIHdpdGggQyBhbmQgQysrCi08L2gxPgotCi08Yj4gRGF2aWQgTS4gQmVhemxleSA8L2I+IDxicj4KLTxlbT4gRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlIDxicj4KLVVuaXZlcnNpdHkgb2YgVXRhaCA8YnI+Ci1TYWx0IExha2UgQ2l0eSwgVXRhaCA4NDExMiA8YnI+Ci1iZWF6bGV5QGNzLnV0YWguZWR1IDxicj4gPC9lbT4KLQotPGJyPiA8YnI+Ci0oUHJlc2VudGVkIGF0IHRoZSA0dGggQW5udWFsIFRjbC9UayBXb3Jrc2hvcCwgTW9udGVyZXksIENBLiBKdWx5IDYtMTAsIDE5OTYuICkKLQotPGgyPiBBYnN0cmFjdCA8L2gyPgotCi08ZW0+Ci1JIHByZXNlbnQgU1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKSwgYQotcHJvZ3JhbSBkZXZlbG9wbWVudCB0b29sIHRoYXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgdGhlIGJpbmRpbmdzCi1iZXR3ZWVuIEMvQysrIGNvZGUgYW5kIGNvbW1vbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGluY2x1ZGluZwotVGNsLCBQeXRob24sIFBlcmwgYW5kIEd1aWxlLiAgU1dJRyBzdXBwb3J0cyBtb3N0IEMvQysrIGRhdGF0eXBlcwotaW5jbHVkaW5nIHBvaW50ZXJzLCBzdHJ1Y3R1cmVzLCBhbmQgY2xhc3Nlcy4KLVVubGlrZSBtYW55IG90aGVyIGFwcHJvYWNoZXMsIFNXSUcKLXVzZXMgQU5TSSBDL0MrKyBkZWNsYXJhdGlvbnMgYW5kIHJlcXVpcmVzIHRoZSB1c2VyIHRvIG1ha2UgdmlydHVhbGx5Ci1ubyBtb2RpZmljYXRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIEMgY29kZS4KLUluIGFkZGl0aW9uLCBTV0lHIGF1dG9tYXRpY2FsbHkKLXByb2R1Y2VzIGRvY3VtZW50YXRpb24gaW4gSFRNTCwgTGFUZVgsIG9yIEFTQ0lJIGZvcm1hdC4KLVNXSUcgaGFzIGJlZW4gcHJpbWFyaWx5IGRlc2lnbmVkIGZvciBzY2llbnRpc3RzLCBlbmdpbmVlcnMsIGFuZCBhcHBsaWNhdGlvbgotZGV2ZWxvcGVycyB3aG8gd291bGQgbGlrZSB0byB1c2Ugc2NyaXB0aW5nIGxhbmd1YWdlcyB3aXRoIHRoZWlyIEMvQysrIHByb2dyYW1zCi13aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMKLW9mIGVhY2ggbGFuZ3VhZ2Ugb3IgdXNpbmcgYSBjb21wbGljYXRlZCBzb2Z0d2FyZSBkZXZlbG9wbWVudCB0b29sLgotVGhpcyBwYXBlciBjb25jZW50cmF0ZXMgb24gU1dJRydzIHVzZSB3aXRoIFRjbC9Uay4KLTwvZW0+Ci0KLTxoMj4gMS4gSW50cm9kdWN0aW9uIDwvaDI+Ci1TV0lHIChTaW1wbGlmaWVkIFdyYXBwZXIgYW5kIEludGVyZmFjZSBHZW5lcmF0b3IpCi1pcyBhIHNvZnR3YXJlCi1kZXZlbG9wbWVudCB0b29sIHRoYXQgSSBuZXZlciBpbnRlbmRlZCB0byBkZXZlbG9wLiAgIEF0IHRoZSB0aW1lLAotSSB3YXMgdHJ5aW5nIHRvIGFkZCBhIGRhdGEgYW5hbHlzaXMgYW5kIHZpc3VhbGl6YXRpb24gY2FwYWJpbGl0eSB0bwotYSBtb2xlY3VsYXIgZHluYW1pY3MgKE1EKSBjb2RlIEkgaGFkIGhlbHBlZCBkZXZlbG9wIGZvciBtYXNzaXZlbHkKLXBhcmFsbGVsIHN1cGVyY29tcHV0ZXJzIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSBbQmVhemxleSxMb21kYWhsXS4gIEkgd2FudGVkCi10byBwcm92aWRlIGEgc2ltcGxlLCB5ZXQgZmxleGlibGUgdXNlciBpbnRlcmZhY2UgdGhhdCBjb3VsZCBiZSB1c2VkCi10byBnbHVlIHZhcmlvdXMgY29kZSBtb2R1bGVzIHRvZ2V0aGVyIGFuZCBhbiBleHRlbnNpYmxlIHNjcmlwdGluZwotbGFuZ3VhZ2Ugc2VlbWVkIGxpa2UgYW4gaWRlYWwgc29sdXRpb24uIFVuZm9ydHVuYXRlbHkgdGhlcmUgd2VyZSBjb25zdHJhaW50cy4KLUZpcnN0LCBJIGRpZG4ndCB3YW50IHRvIGhhY2sgdXAgNC15ZWFycyBvZiBjb2RlIGRldmVsb3BtZW50IHRyeWluZyB0bwotZml0IG91ciBNRCBjb2RlIGludG8geWV0IGFub3RoZXIgaW50ZXJmYWNlIHNjaGVtZSAoaGF2aW5nIGRvbmUgc28gc2V2ZXJhbAotdGltZXMgYWxyZWFkeSkuICBTZWNvbmRseSwgdGhpcyBjb2RlCi13YXMgcm91dGluZWx5IHJ1biBvbiBzeXN0ZW1zIHJhbmdpbmcgZnJvbSBDb25uZWN0aW9uIE1hY2hpbmVzIGFuZCBDcmF5cyB0bwotd29ya3N0YXRpb25zIGFuZCBJIGRpZG4ndCB3YW50IHRvIGRlcGVuZCBvbiBhbnkgb25lCi1pbnRlcmZhY2UgbGFuZ3VhZ2UtLS1vdXQgb2YgZmVhciB0aGF0IGl0IG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQgb24KLWFsbCBvZiB0aGVzZSBwbGF0Zm9ybXMuICBGaW5hbGx5LCB0aGUgdXNlcnMgd2VyZSBjb25zdGFudGx5IGFkZGluZwotbmV3IGNvZGUgYW5kIG1ha2luZyBtb2RpZmljYXRpb25zLiAgSSBuZWVkZWQgYSBmbGV4aWJsZSwgeWV0IGVhc3kgdG8gdXNlCi1zeXN0ZW0gdGhhdCBkaWQgbm90IGdldCBpbiB0aGUgd2F5IG9mIHRoZSBwaHlzaWNpc3RzLiA8YnI+IDxicj4KLQotU1dJRyBpcyBteSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0uICBTaW1wbHkgc3RhdGVkLCBTV0lHIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGFsbAotb2YgdGhlIGNvZGUKLW5lZWRlZCB0byBiaW5kIEMvQysrIGZ1bmN0aW9ucyB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZXMgdXNpbmcgb25seQotYSBzaW1wbGUgaW5wdXQgZmlsZSBjb250YWluaW5nIEMgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KLUF0IGZpcnN0LCBJIHN1cHBvcnRlZAotYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgSSBoYWQgZGV2ZWxvcGVkIHNwZWNpZmljYWxseSBmb3IgdXNlCi1vbiBtYXNzaXZlbHkgcGFyYWxsZWwgc3lzdGVtcy4gIExhdGVyIEkgZGVjaWRlZCB0byByZXdyaXRlIFNXSUcgaW4gQysrIGFuZCBleHRlbmQgaXQgdG8gc3VwcG9ydAotVGNsLCBQeXRob24sIFBlcmwsIEd1aWxlIGFuZCBvdGhlciBsYW5ndWFnZXMgdGhhdCBpbnRlcmVzdGVkIG1lLiAgIEkgYWxzbwotYWRkZWQgbW9yZSBkYXRhLXR5cGVzLCBzdXBwb3J0IGZvciBwb2ludGVycywgQysrIGNsYXNzZXMsIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiwgYW5kCi1hIGZldyBvdGhlciBmZWF0dXJlcy4gPGJyPiA8YnI+Ci0KLVRoaXMgcGFwZXIgcHJvdmlkZXMgYSBicmllZiBvdmVydmlldyBvZiBTV0lHIAotd2l0aCBhIHBhcnRpY3VsYXIgZW1waGFzaXMgb24gVGNsL1RrLiBIb3dldmVyLCB0aGUgcmVhZGVyIHNob3VsZAotcmVtYWluIGF3YXJlIHRoYXQgU1dJRyB3b3JrcyBlcXVhbGx5IHdlbGwgd2l0aAotUGVybCBhbmQgb3RoZXIgbGFuZ3VhZ2VzLiBJdCBpcyBub3QgbXkgaW50ZW50IHRvIHByb3ZpZGUKLWEgdHV0b3JpYWwgb3IgYSB1c2VyJ3MgZ3VpZGUsIGJ1dCByYXRoZXIgdG8gc2hvdwotaG93IFNXSUcgY2FuIGJlIHVzZWQgdG8gZG8gaW50ZXJlc3RpbmcgdGhpbmdzIHN1Y2ggYXMgCi1hZGRpbmcgVGNsL1RrIGludGVyZmFjZXMgdG8gZXhpc3RpbmcgQyBhcHBsaWNhdGlvbnMsIAotcXVpY2tseSBkZWJ1Z2dpbmcgYW5kIHByb3RvdHlwaW5nIEMgY29kZSwKLWFuZCBidWlsZGluZyBpbnRlcmZhY2UtbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgQyBhcHBsaWNhdGlvbnMuICAgCi0KLTxoMj4gMi4gVGNsIGFuZCBXcmFwcGVyIEZ1bmN0aW9ucyA8L2gyPgotCi1JbiBvcmRlciB0byBhZGQgYSBuZXcgQyBvciBDKysgZnVuY3Rpb24gdG8gVGNsLCBpdCBpcyBuZWNlc3NhcnkgdG8KLXdyaXRlIGEgc3BlY2lhbCBgYHdyYXBwZXInJyBmdW5jdGlvbiB0aGF0IHBhcnNlcyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi1wcmVzZW50ZWQgYXMgQVNDSUkgc3RyaW5ncyBieSB0aGUgVGNsIGludGVycHJldGVyIGludG8gYSByZXByZXNlbnRhdGlvbgotdGhhdCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoZSBDIGZ1bmN0aW9uLiAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZAotdG8gYWRkIHRoZSBmYWN0b3JpYWwgZnVuY3Rpb24gdG8gVGNsLCBhIHdyYXBwZXIgZnVuY3Rpb24gbWlnaHQKLWxvb2sgbGlrZSB0aGUgZm9sbG93aW5nIDogPGJyPgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLWludCB3cmFwX2ZhY3QoQ2xpZW50RGF0YSBjbGllbnREYXRhLAotICAgICAgICAgICAgICBUY2xfSW50ZXJwICppbnRlcnAsCi0gICAgICAgICAgICAgIGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgICBpbnQgcmVzdWx0OwotICAgIGludCBhcmcwOwotICAgIGlmIChhcmdjICE9IDIpIHsKLSAgICAgICAgaW50ZXJwLT5yZXN1bHQgPSAid3JvbmcgIyBhcmdzIjsKLSAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgICB9Ci0gICAgYXJnMCA9IGF0b2koYXJndlsxXSk7Ci0gICAgcmVzdWx0ID0gZmFjdChhcmcwKTsKLSAgICBzcHJpbnRmKGludGVycC0+cmVzdWx0LCIlZCIscmVzdWx0KTsKLSAgICByZXR1cm4gVENMX09LOwotfQotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1JbiBhZGRpdGlvbiB0byB3cml0aW5nIHRoZSB3cmFwcGVyIGZ1bmN0aW9uLCBhIHVzZXIgd2lsbCBhbHNvIG5lZWQgdG8gCi13cml0ZSBjb2RlIHRvIGFkZCB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBUY2wgaW50ZXJwcmV0ZXIuICBJbiB0aGUgY2FzZSBvZgotVGNsIDcuNSwgdGhpcyBjb3VsZCBiZSBkb25lIGJ5IHdyaXRpbmcgYW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gdG8KLWJlIGNhbGxlZCB3aGVuIHRoZSBleHRlbnNpb24gaXMgbG9hZGVkIGR5bmFtaWNhbGx5LiAgIFdoaWxlIHdyaXRpbmcKLWEgd3JhcHBlciBmdW5jdGlvbiB1c3VhbGx5IGlzIG5vdCB0b28gZGlmZmljdWx0LCB0aGUgcHJvY2VzcyBxdWlja2x5Ci1iZWNvbWVzIHRlZGlvdXMgYW5kIGVycm9yIHByb25lIGFzIHRoZSBudW1iZXIgb2YgZnVuY3Rpb25zIGluY3JlYXNlcy4KLVRoZXJlZm9yZSwgYXV0b21hdGVkIGFwcHJvYWNoZXMgZm9yIHByb2R1Y2luZyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUKLWFwcGVhbGluZy0tZXNwZWNpYWxseSB3aGVuIHdvcmtpbmcgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBDIGZ1bmN0aW9ucwotb3Igd2l0aCBDKysgKGluIHdoaWNoIGNhc2UgdGhlIHdyYXBwZXIgY29kZSB0ZW5kcyB0byBnZXQgbW9yZSBjb21wbGljYXRlZCkuCi0KLTxoMj4gMy4gUHJpb3IgV29yayA8L2gyPgotCi1UaGUgaWRlYSBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgd3JhcHBlciBjb2RlIGlzIGNlcnRhaW5seSBub3QgbmV3LgotU29tZSBlZmZvcnRzIHN1Y2ggYXMKLUl0Y2wrKywgT2JqZWN0IFRjbCwgb3IgdGhlIFhTIGxhbmd1YWdlIGluY2x1ZGVkIHdpdGggUGVybDUsIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yCi1nZW5lcmF0aW5nIHdyYXBwZXIgY29kZSwgYnV0IHJlcXVpcmUgdGhlIHVzZXIgdG8gcHJvdmlkZSBkZXRhaWxlZAotc3BlY2lmaWNhdGlvbnMsIHR5cGUgY29udmVyc2lvbiBydWxlcywgb3IgdXNlIGEgc3BlY2lhbGl6ZWQKLXN5bnRheCBbaGVpZHJpY2gsV2V0aGVyYWxsLHBlcmw1XS4gIExhcmdlIHBhY2thZ2VzCi1zdWNoIGFzIHRoZSBWaXN1YWxpemF0aW9uIFRvb2xraXQgKHZ0aykgbWF5IHVzZSB0aGVpciBvd24gQy9DKysgdHJhbnNsYXRvcnMsCi1idXQgdGhlc2UgYWxtb3N0IGFsd2F5cyB0ZW5kIHRvIGJlIHNvbWV3aGF0IHNwZWNpYWwgcHVycG9zZSAoaW4gZmFjdCwgU1dJRyBzdGFydGVkCi1vdXQgaW4gdGhpcyBtYW5uZXIpIFt2dGtdLgotSWYgc3VwcG9ydGluZyBtdWx0aXBsZSBsYW5ndWFnZXMgaXMgdGhlIHVsdGltYXRlIGdvYWwsIGEgcHJvZ3JhbW1lciBtaWdodAotY29uc2lkZXIgYSBwYWNrYWdlIHN1Y2ggYXMgSUxVIFtKYW5zc2VuXS4gCi1VbmZvcnR1bmF0ZWx5LAotdGhpcyByZXF1aXJlcyB0aGUgdXNlciB0byBwcm92aWRlIHNwZWNpZmljYXRpb25zIGluIElETC0tYSBwcm9jZXNzIHdoaWNoCi1pcyB1bmFwcGVhbGluZyB0byBtYW55IHVzZXJzLgotU1dJRyBpcyBub3QgbmVjZXNzYXJpbHkgaW50ZW5kZWQgdG8gY29tcGV0ZSB3aXRoIAotdGhlc2UgYXBwcm9hY2hlcywgYnV0IHJhdGhlciBpcyBkZXNpZ25lZCB0byBiZSBhIG5vLW5vbnNlbnNlIHRvb2wgdGhhdAotc2NpZW50aXN0cyBhbmQgZW5naW5lZXJzIGNhbiB1c2UgdG8gZWFzaWx5IGFkZCBUY2wgYW5kIG90aGVyIHNjcmlwdGluZwotbGFuZ3VhZ2VzIHRvIHRoZWlyIG93biBhcHBsaWNhdGlvbnMuICAgU1dJRyBpcyBhbHNvIAotdmVyeSBkaWZmZXJlbnQgdGhhbiBFbWJlZGRlZCBUayAoRVQpIHdoaWNoIGFsc28gYWltcyB0bwotc2ltcGxpZnkgY29kZSBkZXZlbG9wbWVudCBbRVRdLiBVbmxpa2UgRVQsIFNXSUcgaXMgZGVzaWduZWQgdG8gCi1pbnRlZ3JhdGUgQyBmdW5jdGlvbnMgaW50byBUY2wvVGsgYXMgb3Bwb3NlZCB0byBpbnRlZ3JhdGluZyBUY2wvVGsgaW50bwotQyBwcm9ncmFtcy4KLQotPGgyPiA0LiBBIFF1aWNrIFRvdXIgb2YgU1dJRyA8L2gyPgotCi08aDM+IDQuMSBPcmdhbml6YXRpb24gPC9oMz4KLQotPGNlbnRlcj4KLTxpbWcgYWx0ID0gIlNXSUcgT3JnYW5pemF0aW9uIiBzcmM9ImZpZzEuZ2lmIj4gIDxicj4KLUZpZ3VyZSAxIDogU1dJRyBPcmdhbml6YXRpb24gPGJyPiA8YnI+Ci08L2NlbnRlcj4KLQotRmlndXJlIDEgc2hvd3MgdGhlIHN0cnVjdHVyZSBvZiBTV0lHLiAgQXQgdGhlIGNvcmUgaXMgYSBZQUNDIHBhcnNlcgotZm9yIHJlYWRpbmcgaW5wdXQgZmlsZXMgYWxvbmcgd2l0aCBzb21lIHV0aWxpdHkgZnVuY3Rpb25zLiAKLVRvIGdlbmVyYXRlIGNvZGUsCi10aGUgcGFyc2VyIGNhbGxzIGFib3V0IGEgZG96ZW4gZnVuY3Rpb25zIGZyb20gYSBnZW5lcmljIGxhbmd1YWdlCi1jbGFzcyB0byBkbyB0aGluZ3MgbGlrZSB3cml0ZSBhIHdyYXBwZXIgZnVuY3Rpb24sIGxpbmsgYQotdmFyaWFibGUsIHdyYXAgYSBDKysgbWVtYmVyIGZ1bmN0aW9uLCBldGMuLi4gIEVhY2ggdGFyZ2V0IGxhbmd1YWdlIGlzCi1pbXBsZW1lbnRlZCBhcyBhIEMrKyBjbGFzcyBjb250YWluaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBlbWl0Ci10aGUgcmVzdWx0aW5nIEMgY29kZS4gICBJZiBhbiBgYGVtcHR5JycgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBpcyBnaXZlbgotdG8gU1dJRywgaXQgd2lsbCBwcm9kdWNlIG5vIG91dHB1dC4gICBUaHVzLCBlYWNoIGxhbmd1YWdlIGNsYXNzIGNhbgotYmUgaW1wbGVtZW50ZWQgaW4gYWxtb3N0IGFueSBtYW5uZXIuCi1UaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaXMgaW1wbGVtZW50ZWQgaW4gYSBzaW1pbGFyIG1hbm5lciBhbmQgY2FuCi1jdXJyZW50bHkgcHJvZHVjZSBBU0NJSSwgTGFUZVgsIG9yIEhUTUwgb3V0cHV0LiAgQXMgb3V0cHV0LAotU1dJRyBwcm9kdWNlcyBhIEMgZmlsZSB0aGF0IHNob3VsZCBiZSBjb21waWxlZCBhbmQgbGlua2VkIHdpdGggdGhlIHJlc3QgCi1vZiB0aGUgY29kZSBhbmQgYSBkb2N1bWVudGF0aW9uIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbGF0ZXIgcmVmZXJlbmNlLgotCi08aDM+IDQuMi4gSW50ZXJmYWNlIEZpbGVzIDwvaDM+Ci0KLUFzIGlucHV0LCBTV0lHIHRha2VzIGEgc2luZ2xlIGlucHV0IGZpbGUgcmVmZXJyZWQgdG8gYXMgYW4gYGBpbnRlcmZhY2UgZmlsZS4nJwotVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmV3IFNXSUcgc3BlY2lmaWMgZGlyZWN0aXZlcywgYnV0IG90aGVyd2lzZSBjb250YWlucwotQU5TSSBDIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICAgVW5saWtlIHRoZSBhcHByb2FjaCBpbiBbSGVpZHJpY2hdLCBubyB0eXBlIGNvbnZlcnNpb24gcnVsZXMgYXJlIG5lZWRlZCBhbmQgYWxsIGRlY2xhcmF0aW9ucyBhcmUgbWFkZQotdXNpbmcgZmFtaWxpYXIgQU5TSSBDL0MrKyBwcm90b3R5cGVzLiAgICBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4KLWludGVyZmFjZSBmaWxlIGZvciB3cmFwcGluZyBhIGZldyBDIGZpbGUgSS9PIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuCi0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotLyogRmlsZSA6IGZpbGUuaSAqLwotJW1vZHVsZSBmaWxlaW8KLSV7Ci0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSV9Ci0KLUZJTEUJKmZvcGVuKGNoYXIgKmZpbGVuYW1lLCBjaGFyICp0eXBlKTsKLWludAkgZmNsb3NlKEZJTEUgKnN0cmVhbSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3QKLXNpemVfdAkgZnJlYWQodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgIHNpemVfdCBub2JqLCBGSUxFICpzdHJlYW0pOwotc2l6ZV90CSBmd3JpdGUodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICBzaXplX3Qgbm9iaixGSUxFICpzdHJlYW0pOwotdm9pZAkqbWFsbG9jKHNpemVfdCBuYnl0ZXMpOwotdm9pZAkgZnJlZSh2b2lkICopOwotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotVGhlIDx0dD4gJW1vZHVsZSA8L3R0PiBkaXJlY3RpdmUKLXNldHMgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyBvcHRpb25hbCwgYnV0IGlzCi1yZWNvbW1lbmRlZCBpZiBidWlsZGluZyBhIFRjbCA3LjUgbW9kdWxlLgotRXZlcnl0aGluZyBpbnNpZGUgdGhlIDx0dD4gJXssICV9IDwvdHQ+Ci1ibG9jayBpcyBjb3BpZWQgZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0LCBhbGxvd2luZyB0aGUgaW5jbHVzaW9uIG9mCi1oZWFkZXIgZmlsZXMgYW5kIGFkZGl0aW9uYWwgQyBjb2RlLgotQWZ0ZXJ3YXJkcywgQy9DKysgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhcmUgbGlzdGVkIGluIGFueQotb3JkZXIuCi1CdWlsZGluZyBhIG5ldyBUY2wgbW9kdWxlIGlzIHVzdWFsbHkgYXMgCi1lYXN5IGFzIHRoZSBmb2xsb3dpbmcgOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLXVuaXggPiBzd2lnIC10Y2wgZmlsZS5pCi11bml4ID4gZ2NjIGZpbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi11bml4ID4gbGQgLXNoYXJlZCBmaWxlX3dyYXAubyAtbyBGaWxlaW8uc28KLTwvcHJlPiA8L3R0PiAKLTwvYmxvY2txdW90ZT4KLQotCi08aDM+IDQuMy4gQSBUY2wgRXhhbXBsZSA8L2gzPgotCi1OZXdseSBhZGRlZCBmdW5jdGlvbnMgd29yayBsaWtlIG9yZGluYXJ5IFRjbCBwcm9jZWR1cmVzLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIFRjbCBzY3JpcHQgY29waWVzIGEgZmlsZSB1c2luZyB0aGUgYmluYXJ5Ci1maWxlIEkvTyBmdW5jdGlvbnMgYWRkZWQgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLXByb2MgZmlsZWNvcHkge25hbWUxIG5hbWUyfSB7Ci0gICAgc2V0IGJ1ZmZlciBbbWFsbG9jIDgxOTJdOwotICAgIHNldCBmMSBbZm9wZW4gJG5hbWUxIHJdOwotICAgIHNldCBmMiBbZm9wZW4gJG5hbWUyIHddOwotICAgIHNldCBuYnl0ZXMgW2ZyZWFkICRidWZmZXIgMSA4MTkyICRmMV07Ci0gICAgd2hpbGUgeyRuYnl0ZXMgPiAwfSB7Ci0gICAgICAgIGZ3cml0ZSAkYnVmZmVyIDEgJG5ieXRlcyAkZjI7Ci0gICAgICAgIHNldCBuYnl0ZXMgW2ZyZWFkICRidWZmZXIgMSA4MTkyICRmMV07Ci0gICAgfQotICAgIGZjbG9zZSAkZjE7Ci0gICAgZmNsb3NlICRmMjsKLSAgICBmcmVlICRidWZmZXIKLX0KLTwvcHJlPiA8L3R0PgotPC9ibG9ja3F1b3RlPgotCi08aDM+IDQuNC4gRGF0YXR5cGVzIGFuZCBQb2ludGVycyA8L2gzPgotCi1TV0lHIHN1cHBvcnRzIHRoZSBiYXNpYyBkYXRhdHlwZXMgb2YgPHR0PiBpbnQsIHNob3J0LAotbG9uZywgZmxvYXQsIGRvdWJsZSwgY2hhciwgPC90dD4gYW5kIDx0dD4gdm9pZCA8L3R0PgotYXMgd2VsbCBhcyBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXJzLiAgU1dJRwotYWxzbyBhbGxvd3MgZGVyaXZlZCB0eXBlcyBzdWNoIGFzIHBvaW50ZXJzLCBzdHJ1Y3R1cmVzLCBhbmQgY2xhc3NlcywKLWJ1dCB0aGVzZSBhcmUgYWxsIGVuY29kZWQgYXMgcG9pbnRlcnMuICAgIAotSWYgYW4gdW5rbm93biB0eXBlIGlzIGVuY291bnRlcmVkLCBTV0lHIGFzc3VtZXMKLXRoYXQgaXQgaXMgYSBjb21wbGV4IGRhdGF0eXBlIHRoYXQgaGFzIGJlZW4gZGVmaW5lZCBlYXJsaWVyLgotTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGZpZ3VyZSBvdXQgd2hhdCBkYXRhIHRoYXQgZGF0YXR5cGUgYWN0dWFsbHkgY29udGFpbnMKLW9yIGhvdyBpdCBzaG91bGQgYmUgdXNlZC4gIE9mIGNvdXJzZSwgdGhpcyB0aGlzIGlzIG9ubHkgcG9zc2libGUKLXNpbmNlIFNXSUcncyBtYXBwaW5nIG9mIGNvbXBsZXggdHlwZXMgaW50byBwb2ludGVycyBhbGxvd3MgdGhlbQotdG8gYmUgaGFuZGxlZCBpbiBhIHVuaWZvcm0gbWFubmVyLiAKLUFzIGEgcmVzdWx0LCBTV0lHIGRvZXMgbm90IG5vcm1hbGx5IG5lZWQgYW55IHNvcnQKLW9mIHR5cGUtbWFwcGluZywgYnV0IDx0dD4gdHlwZWRlZiA8L3R0PiBjYW4gYmUgdXNlZCB0byBtYXAgYW55IG9mIHRoZSBidWlsdC1pbgotZGF0YXR5cGVzIHRvIG5ldyB0eXBlcyBpZiBkZXNpcmVkLiA8YnI+IDxicj4KLQotU1dJRyBlbmNvZGVzIHBvaW50ZXJzIGFzIGhleGFkZWNpbWFsIHN0cmluZ3Mgd2l0aCB0eXBlLWluZm9ybWF0aW9uLiAgVGhpcwotdHlwZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgYSBydW4tdGltZSB0eXBlIGNoZWNraW5nIG1lY2hhbmlzbS4KLVRodXMsIGEgdHlwaWNhbCBTV0lHIHBvaW50ZXIgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyA6IDxicj4gPGJyPgotCi08Y2VudGVyPgotPHR0PiBfMTAwOGU2MTRfVmVjdG9yX3AgPC90dD4gPGJyPiA8YnI+Ci08L2NlbnRlcj4KLQotSWYgdGhpcyBwb2ludGVyIGlzIHBhc3NlZCBpbnRvIGEgZnVuY3Rpb24gcmVxdWlyaW5nIHNvbWUgb3RoZXIga2luZCBvZgotcG9pbnRlciwgU1dJRyB3aWxsIGdlbmVyYXRlIGEgVGNsIGVycm9yIGFuZCByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZS4KLVRoZSBOVUxMIHBvaW50ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyAiTlVMTCIuICAgVGhlIFNXSUcgcnVuLXRpbWUKLXR5cGUgY2hlY2tlciBpcyBzYWF2eSB0byB0eXBlZGVmcyBhbmQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJhc2UgY2xhc3NlcwotYW5kIGRlcml2ZWQgY2xhc3NlcyBpbiBDKysuIFRodXMgaWYgYQotdXNlciBzcGVjaWZpZXMgPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08dHQ+IHR5cGVkZWYgZG91YmxlIFJlYWw7IDwvdHQ+IDxicj4gPGJyPgotPC9jZW50ZXI+Ci0KLXRoZSB0eXBlIGNoZWNrZXIga25vd3MgdGhhdCA8dHQ+IFJlYWwgKiA8L3R0PiAgYW5kIDx0dD4gZG91YmxlICogPC90dD4KLWFyZSBlcXVpdmFsZW50IChtb3JlIG9uIEMrKyBpbiBhIG1pbnV0ZSkuCi1Gcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIG90aGVyIFRjbCBleHRlbnNpb25zLAotU1dJRyBwb2ludGVycyBzaG91bGQgYmUgc2VlbiBhcyBzcGVjaWFsICJoYW5kbGVzIiBleGNlcHQgdGhhdCB0aGV5IAotaGFwcGVuIHRvIGNvbnRhaW4gdGhlIHBvaW50ZXIgdmFsdWUgYW5kIGl0cyB0eXBlLiA8YnI+IDxicj4KLQotVG8gc29tZSwgdGhpcyBhcHByb2FjaCBtYXkgc2VlbSBob3JyaWJseSByZXN0cmljdGl2ZSAob3IgZXJyb3IgcHJvbmUpLAotYnV0IGtlZXAgaW4gbWluZCB0aGF0IFNXSUcgd2FzIHByaW1hcmlseSBkZXNpZ25lZCB0byB3b3JrIHdpdGgKLWV4aXN0aW5nIEMgYXBwbGljYXRpb25zLiAgU2luY2UgbW9zdCBDIHByb2dyYW1zIHBhc3MgY29tcGxleCBkYXRhdHlwZXMKLWFyb3VuZCBieSByZWZlcmVuY2UgdGhpcyB0ZWNobmlxdWUgd29ya3MgcmVtYXJrYWJseSB3ZWxsIGluIHByYWN0aWNlLgotUnVuIHRpbWUgdHlwZS1jaGVja2luZyBhbHNvIGVsaW1pbmF0ZXMgbW9zdCBjb21tb24gY3Jhc2hlcyBieSBjYXRjaGluZwotc3R1cGlkIG1pc3Rha2VzIHN1Y2ggYXMgdXNpbmcgYSB3cm9uZyB2YXJpYWJsZSBuYW1lIG9yIGZvcmdldHRpbmcgdGhlCi0iJCIgY2hhcmFjdGVyIGluIGEgVGNsIHNjcmlwdC4gICAgV2hpbGUgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gY3Jhc2ggVGNsIGJ5IGZvcmdpbmcgYQotU1dJRyBwb2ludGVyIHZhbHVlIChvciBtYWtpbmcgYSBjYWxsIHRvIGJ1Z2d5IEMgY29kZSksIGl0IGlzIHdvcnRoCi1lbXBoYXNpemluZyB0aGF0IGV4aXN0aW5nIFRjbCBleHRlbnNpb25zCi1tYXkgYWxzbyBjcmFzaCBpZiBnaXZlbiBhbiBpbnZhbGlkIGhhbmRsZS4KLQotPGgzPiA0LjUuIEdsb2JhbCBWYXJpYWJsZXMgYW5kIENvbnN0YW50cyA8L2gzPgotCi1TV0lHIGNhbiBpbnN0YWxsIGdsb2JhbCBDIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzIHVzaW5nIFRjbCdzIHZhcmlhYmxlIGxpbmthZ2UKLW1lY2hhbmlzbS4KLVZhcmlhYmxlcyBtYXkgYWxzbyBiZSBkZWNsYXJlZCBhcyBgYHJlYWQgb25seScnIAotd2l0aGluIHRoZSBUY2wgaW50ZXJwcmV0ZXIuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MKLWhvdyB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cyBjYW4gYmUgYWRkZWQgdG8gVGNsIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0vLyBTV0lHIGZpbGUgd2l0aCB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cwotJXsKLSV9Ci0KLS8vIFNvbWUgZ2xvYmFsIHZhcmlhYmxlcwotZXh0ZXJuICBpbnQgTXlfdmFyaWFibGU7ICAgICAKLWV4dGVybiAgY2hhciAqZGVmYXVsdF9wYXRoOwotZXh0ZXJuICBkb3VibGUgTXlfZG91YmxlOwotCi0vLyBTb21lIGNvbnN0YW50cwotI2RlZmluZSAgUEkgICAgIDMuMTQxNTkyNjUzNTkKLSNkZWZpbmUgIFBJXzQgICBQSS80LjAKLWVudW0gY29sb3JzIHtyZWQsYmx1ZSxncmVlbn07Ci1jb25zdCBpbnQgU0laRU9GX1ZFQ1RPUiA9IHNpemVvZihWZWN0b3IpOwotCi0vLyBBIHJlYWQgb25seSB2YXJpYWJsZQotJXJlYWRvbmx5Ci1leHRlcm4gaW50IFN0YXR1czsKLSVyZWFkd3JpdGUKLQotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi08aDM+IDQuNi4gQysrIFN1cHBvcnQgPC9oMz4KLQotVGhlIFNXSUcgcGFyc2VyIGNhbiBoYW5kbGUgc2ltcGxlIEMrKyBjbGFzcyBkZWZpbml0aW9ucyBhbmQgc3VwcG9ydHMgcHVibGljCi1pbmhlcml0YW5jZSwgdmlydHVhbCBmdW5jdGlvbnMsIHN0YXRpYyBmdW5jdGlvbnMsIGNvbnN0cnVjdG9ycyBhbmQKLWRlc3RydWN0b3JzLiAgICBDdXJyZW50bHksIEMrKyB0cmFuc2xhdGlvbiBpcyBwZXJmb3JtZWQKLWJ5IHBvbGl0ZWx5IHRyYW5mb3JtaW5nIEMrKyBjb2RlIGludG8gQyBjb2RlIGFuZCBnZW5lcmF0aW5nIHdyYXBwZXJzIGZvciB0aGUKLUMgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgU1dJRyBpbnRlcmZhY2UgZmlsZQotY29udGFpbmluZyBhIEMrKyBjbGFzcyBkZWZpbml0aW9uOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLSVtb2R1bGUgdHJlZQotJXsKLSNpbmNsdWRlICJ0cmVlLmgiCi0lfQotCi1jbGFzcyBUcmVlIHsKLXB1YmxpYzoKLSAgIFRyZWUoKTsKLSAgflRyZWUoKTsKLSAgIHZvaWQgIGluc2VydChjaGFyICppdGVtKTsKLSAgIGludCAgIHNlYXJjaChjaGFyICppdGVtKTsKLSAgIGludCAgIHJlbW92ZShjaGFyICppdGVtKTsKLXN0YXRpYyB2b2lkIHByaW50KFRyZWUgKnQpOyAgIAotfTsKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotV2hlbiB0cmFuc2xhdGVkLCB0aGUgY2xhc3Mgd2lsbCBiZSBhY2Nlc3MgdXNlZCB0aGUgZm9sbG93aW5nIHNldCBvZgotZnVuY3Rpb25zIChjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgU1dJRykuCi0KLTxibG9ja3F1b3RlPgotPHR0PgotPHByZT4KLVRyZWUgKm5ld19UcmVlKCk7Ci12b2lkIGRlbGV0ZV9UcmVlKFRyZWUgKnRoaXMpOwotdm9pZCBUcmVlX2luc2VydChUcmVlICp0aGlzLCBjaGFyICppdGVtKTsKLWludCAgVHJlZV9zZWFyY2goVHJlZSAqdGhpcywgY2hhciAqaXRlbSk7Ci1pbnQgIFRyZWVfcmVtb3ZlKFRyZWUgKnRoaXMsIGNoYXIgKml0ZW0pOwotdm9pZCBUcmVlX3ByaW50KFRyZWUgKnQpOwotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi0KLUFsbCBDKysgZnVuY3Rpb25zIHdyYXBwZWQgYnkgU1dJRyBleHBsaWNpdGx5IHJlcXVpcmUgdGhlIDx0dD4gdGhpcyA8L3R0PiBwb2ludGVyCi1hcyBzaG93bi4gIFRoaXMgYXBwcm9hY2ggaGFzIHRoZSBhZHZhbnRhZ2Ugb2Ygd29ya2luZyBmb3IgYWxsIG9mIHRoZSB0YXJnZXQKLWxhbmd1YWdlcy4gIEl0IGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIHBhc3Mgb2JqZWN0cyBiZXR3ZWVuCi1vdGhlciBDKysgZnVuY3Rpb25zIHNpbmNlIGV2ZXJ5IEMrKyBvYmplY3QgaXMgc2ltcGx5IHJlcHJlc2VudGVkIGFzIGEgU1dJRyBwb2ludGVyLiAgIFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbiBvdmVybG9hZGluZywgYnV0IG92ZXJsb2FkZWQgZnVuY3Rpb25zCi1jYW4gYmUgcmVzb2x2ZWQgYnkgcmVuYW1pbmcgdGhlbSB3aXRoIHRoZSBTV0lHIDx0dD4gJW5hbWUgPC90dD4gZGlyZWN0aXZlIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotY2xhc3MgTGlzdCB7Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICBMaXN0KCk7Ci0lbmFtZShMaXN0TWF4KSBMaXN0KGludCBtYXhzaXplKTsKLS4uLgotfTsKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVRoZSBhcHByb2FjaCB1c2VkIGJ5IFNXSUcgaXMKLXF1aXRlIGRpZmZlcmVudCB0aGFuIHRoYXQgdXNlZCBpbiBzeXN0ZW1zIHN1Y2ggYXMKLU9iamVjdCBUY2wgb3IgdnRrIFt2dGssV2V0aGVyYWxsXS4gIEFzIGEgcmVzdWx0LCB1c2VycyBvZiB0aG9zZSBzeXN0ZW1zCi1tYXkgZmluZCBpdCB0byBiZSBjb25mdXNpbmcuICBIb3dldmVyLAotSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgbW9kdWxhciBkZXNpZ24gb2YKLVNXSUcgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbXBsZXRlbHkgcmVkZWZpbmUgdGhlIG91dHB1dCBiZWhhdmlvciBvZgotdGhlIHN5c3RlbS4gIFRodXMsIHdoaWxlIHRoZSBjdXJyZW50IEMrKyBpbXBsZW1lbnRhdGlvbiBpcyBxdWl0ZSBkaWZmZXJlbnQKLXRoYW4gb3RoZXIgc3lzdGVtcyBzdXBwb3J0aW5nIEMrKywgaXQgd291bGQgYmUgZW50aXJlbHkgcG9zc2libGUKLXdyaXRlIGEgbmV3IFNXSUcgbW9kdWxlIHRoYXQgd3JhcHBlZCBDKysgY2xhc3NlcyBpbnRvIGEgcmVwcmVzZW50YXRpb24KLXNpbWlsYXIgdG8gdGhhdCB1c2VkIGJ5IE9iamVjdCBUY2wgKGluIGZhY3QsIGluIG1pZ2h0IGV2ZW4gYmUgcG9zc2libGUKLXRvIHVzZSBTV0lHIHRvIHByb2R1Y2UgdGhlIGlucHV0IGZpbGVzIHVzZWQgZm9yIE9iamVjdCBUY2wpLgotCi08aDM+IDQuNy4gTXVsdGlwbGUgRmlsZXMgYW5kIENvZGUgUmV1c2UgPC9oMz4KLQotQW4gZXNzZW50aWFsIGZlYXR1cmUgb2YgU1dJRyBpcyBpdHMgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZmlsZXMKLWFuZCBtb2R1bGVzLiAgIEEgU1dJRyBpbnRlcmZhY2UgZmlsZSBtYXkgaW5jbHVkZSBhbm90aGVyIGludGVyZmFjZQotZmlsZSB1c2luZyB0aGUgIjx0dD4gJWluY2x1ZGUgPC90dD4iIGRpcmVjdGl2ZS4gICAgVGh1cywgYW4gaW50ZXJmYWNlCi1mb3IgYSBsYXJnZSBzeXN0ZW0gbWlnaHQgYmUgYnJva2VuIHVwIGludG8gYSBjb2xsZWN0aW9uIG9mIHNtYWxsZXIKLW1vZHVsZXMgYXMgc2hvd24gCi0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotJW1vZHVsZSBwYWNrYWdlCi0lewotI2luY2x1ZGUgInBhY2thZ2UuaCIKLSV9Ci0KLSVpbmNsdWRlIGdlb21ldHJ5LmkKLSVpbmNsdWRlIG1lbW9yeS5pCi0laW5jbHVkZSBuZXR3b3JrLmkKLSVpbmNsdWRlIGdyYXBoaWNzLmkKLSVpbmNsdWRlIHBoeXNpY3MuaQotCi0laW5jbHVkZSB3aXNoLmkKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLUNvbW1vbiBvcGVyYXRpb25zIGNhbiBiZSBwbGFjZWQgaW50byBhIFNXSUcgbGlicmFyeSBmb3IgdXNlIGluCi1hbGwgYXBwbGljYXRpb25zLiAgRm9yIGV4YW1wbGUsIHRoZSA8dHQ+ICVpbmNsdWRlIHdpc2guaSA8L3R0PiBkaXJlY3RpdmUKLXRlbGxzIFNXSUcgdG8gaW5jbHVkZSBjb2RlIGZvciB0aGUgPHR0PiBUY2xfQXBwSW5pdCgpIDwvdHQ+IGZ1bmN0aW9uCi1uZWVkZWQgdG8gcmVidWlsZCB0aGUgPHR0PiB3aXNoIDwvdHQ+IHByb2dyYW0uICBUaGUgbGlicmFyeSBjYW4gYWxzbyBiZQotdXNlZCB0byBidWlsZCBtb2R1bGVzCi1hbGxvd2luZyBTV0lHIHRvIGJlIHVzZWQgd2l0aCBjb21tb24gVGNsIGV4dGVuc2lvbnMgc3VjaAotYXMgRXhwZWN0IFtFeHBlY3RdLiBPZiBjb3Vyc2UsIHRoZSBwcmltYXJ5IHVzZSBvZiB0aGUgbGlicmFyeSBpcyB3aXRoCi1sYXJnZSBhcHBsaWNhdGlvbnMgc3VjaCBhcyBPcGVuLUludmVudG9yIHdoaWNoIGNvbnRhaW4gaHVuZHJlZHMgb2YKLW1vZHVsZXMgYW5kIGEgc3Vic3RhbnRpYWwgY2xhc3MgaGllcmFyY2h5IFtJbnZlbnRdLiAgIEluIHRoaXMgY2FzZSBhIHVzZXIKLWNvdWxkIHVzZSBTV0lHJ3MgaW5jbHVkZSBtZWNoYW5pc20gdG8gc2VsZWN0aXZlbHkgcGljayB3aGljaCBtb2R1bGVzCi10aGV5IHdhbnRlZCB0byB1c2UgZm9yIGEgcGFydGljdWxhciBwcm9ibGVtLgotCi08aDM+IDQuOC4gVGhlIERvY3VtZW50YXRpb24gU3lzdGVtIDwvaDM+Ci0KLVNXSUcgcHJvZHVjZXMgZG9jdW1lbnRhdGlvbiBpbiBBU0NJSSwgTGFUZVgsIG9yIEhUTUwKLWZvcm1hdCBkZXNjcmliaW5nIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgd3JhcHBlZC4gIFRoZSBkb2N1bWVudGF0aW9uCi1mb2xsb3dzIHRoZSBzeW50YXggcnVsZXMgb2YgdGhlIHRhcmdldCBsYW5ndWFnZSBhbmQgY2FuCi1jYW4gYmUgZnVydGhlciBlbmhhbmNlZCBieSBhZGRpbmcgZGVzY3JpcHRpb25zIGluIGEgQy9DKysgY29tbWVudAotaW1tZWRpYXRlbHkgZm9sbG93aW5nIGEgZGVjbGFyYXRpb24uICBUaGVzZSBjb21tZW50cyBtYXkgYWxzbyBjb250YWluCi1lbWJlZGRlZCBMYVRlWCBvciBIVE1MIGNvbW1hbmRzLiAgRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotZXh0ZXJuIHNpemVfdCBmcmVhZCh2b2lkICpwdHIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgIHNpemVfdCBub2JqLCBGSUxFICpzdHJlYW0pOwotLyoge1x0dCBmcmVhZH0gcmVhZHMgZnJvbSB7XHR0IHN0cmVhbX0gaW50bwotdGhlIGFycmF5IHtcdHQgcHRyfSBhdCBtb3N0IHtcdHQgbm9ian0gb2JqZWN0cwotb2Ygc2l6ZSB7XHR0IHNpemV9LiAgIHtcdHQgZnJlYWR9IHJldHVybnMKLXRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZWFkLiAqLwotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2hlbiBvdXRwdXQgYnkgU1dJRyBhbmQgcHJvY2Vzc2VkIGJ5IExhVGVYLCB0aGlzIGFwcGVhcnMgYXMgZm9sbG93cyA6Ci0KLTx1bD4KLTx0dD4gc2l6ZV90IDogZnJlYWQgcHRyIHNpemUgbm9iaiBzdHJlYW0gPC90dD4gPGJyPgotPHVsPgotICAgICA8dHQ+IGZyZWFkIDwvdHQ+IHJlYWRzIGZyb20gPHR0PiBzdHJlYW0gPC90dD4gaW50byB0aGUgYXJyYXkgPHR0PiBwdHIgPC90dD4gYXQKLSAgICAgbW9zdCA8dHQ+IG5vYmogPC90dD4gb2JqZWN0cyBvZiBzaXplIDx0dD4gc2l6ZSA8L3R0Pi4gIDx0dD4gZnJlYWQgPC90dD4gCi0gICAgcmV0dXJucwotICAgICB0aGUgbnVtYmVyIG9mIG9iamVjdHMgcmVhZC4gCi08L3VsPgotPC91bD4KLQotPGgzPiA0LjkuIEV4dGVuZGluZyB0aGUgU1dJRyBTeXN0ZW0gPC9oMz4KLQotRmluYWxseSwgU1dJRyBpdHNlbGYgY2FuIGJlIGV4dGVuZGVkIGJ5IHRoZSB1c2VyIHRvIHByb3ZpZGUgbmV3Ci1mdW5jdGlvbmFsaXR5LiAgICBUaGlzIGlzIGRvbmUgYnkgbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIG9yIGNyZWF0aW5nIGEKLW5ldyBsYW5ndWFnZSBjbGFzcy4gICBBIHR5cGljYWwgY2xhc3MgbXVzdCBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcKLWZ1bmN0aW9ucyB0aGF0IGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHBhcnNlciBvdXRwdXQgOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLS8vIEZpbGUgOiBzd2lndGNsLmgKLWNsYXNzIFRDTCA6IHB1YmxpYyBMYW5ndWFnZSB7Ci1wcml2YXRlOgotICAvLyBQdXQgcHJpdmF0ZSBzdHVmZiBoZXJlCi1wdWJsaWMgOgotICBUQ0woKTsKLSAgaW50IG1haW4oaW50LCBjaGFyICphcmd2W10pOwotICB2b2lkIGNyZWF0ZV9mdW5jdGlvbihjaGFyICosY2hhciAqLERhdGFUeXBlKiwKLSAgICAgICAgICAgICAgICAgICAgICAgUGFybUxpc3QgKik7Ci0gIHZvaWQgbGlua192YXJpYWJsZShjaGFyICosY2hhciAqLERhdGFUeXBlICopOwotICB2b2lkIGRlY2xhcmVfY29uc3QoY2hhciAqLGludCxjaGFyICopOwotICB2b2lkIGluaXRpYWxpemUodm9pZCk7Ci0gIHZvaWQgaGVhZGVycyh2b2lkKTsKLSAgdm9pZCBjbG9zZSh2b2lkKTsKLSAgdm9pZCB1c2FnZV92YXIoY2hhciAqLERhdGFUeXBlKixjaGFyICoqKTsKLSAgdm9pZCB1c2FnZV9mdW5jKGNoYXIgKixEYXRhVHlwZSosUGFybUxpc3QqLAotICAgICAgICAgICAgICAgICAgY2hhciAqKik7Ci0gIHZvaWQgdXNhZ2VfY29uc3QoY2hhciAqLGludCxjaGFyKixjaGFyKiopOwotICB2b2lkIHNldF9tb2R1bGUoY2hhciAqKTsKLSAgdm9pZCBzZXRfaW5pdChjaGFyICopOwotfTsKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLURlc2NyaXB0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIGZvdW5kIGluIHRoZSBTV0lHCi11c2VycyBtYW51YWwuICAgVG8gYnVpbGQgYSBuZXcgdmVyc2lvbiBvZiBTV0lHLCB0aGUgdXNlcgotb25seSBuZWVkcyB0byBwcm92aWRlIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBhbmQgYSBtYWluCi1wcm9ncmFtIHdoaWNoIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLQotLy8gU1dJRyBtYWluIHByb2dyYW0KLQotI2luY2x1ZGUgInN3aWcuaCIKLSNpbmNsdWRlICJzd2lndGNsLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCi0gIExhbmd1YWdlICpsYW5nOwotCi0gIGxhbmcgPSBuZXcgVENMOwotICBTV0lHX21haW4oYXJnYyxhcmd2LGxhbmcsKERvY3VtZW50YXRpb24gKikgMCk7Ci0KLX0KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gbGlua2VkIHdpdGggYSBsaWJyYXJ5IGZpbGUsIGFueSBleHRlbnNpb25zIGFuZAotbW9kaWZpY2F0aW9ucyBjYW4gbm93IGJlIHVzZWQgd2l0aCB0aGUgU1dJRyBwYXJzZXIuICBXaGlsZQotd3JpdGluZyBhIG5ldyBsYW5ndWFnZSBkZWZpbml0aW9uIGlzIG5vdCBlbnRpcmVseSB0cml2aWFsLAotaXQgY2FuIHVzdWFsbHkgYmUgZG9uZSBieSBqdXN0IGNvcHlpbmcgb25lIG9mIHRoZSBleGlzdGluZwotbW9kdWxlcyBhbmQgbW9kaWZ5aW5nIGl0IGFwcHJvcHJpYXRlbHkuICAgCi0KLTxoMj4gNS4gRXhhbXBsZXMgPC9oMj4KLQotPGgzPiA1LjEuIEEgQy1UY2wgTGlua2VkIExpc3QgPC9oMz4KLQotU1dJRyBjYW4gYmUgdXNlZCB0byBidWlsZCBzaW1wbGUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHVzdWFibGUgaW4gCi1ib3RoIEMgYW5kIFRjbC4gICBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYSBTV0lHIGludGVyZmFjZSBmaWxlIGZvcgotYnVpbGRpbmcgYSBzaW1wbGUgbGlua2VkIGxpc3QuCi0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotLyogRmlsZSA6IGxpc3QuaSAqLwotJXsKLXN0cnVjdCBOb2RlIHsKLSAgTm9kZShjaGFyICpuKSB7Ci0gICAgbmFtZSA9IG5ldyBjaGFyW3N0cmxlbihuKSsxXTsKLSAgICBzdHJjcHkobmFtZSxuKTsKLSAgICBuZXh0ID0gMDsKLSAgfTsKLSAgY2hhciAgKm5hbWU7Ci0gIE5vZGUgKm5leHQ7Ci19OwotJX0KLQotLy8gSnVzdCBhZGQgc3RydWN0IGRlZmluaXRpb24gdG8KLS8vIHRoZSBpbnRlcmZhY2UgZmlsZS4KLQotc3RydWN0IE5vZGUgewotICBOb2RlKGNoYXIgKik7Ci0gIGNoYXIgKm5hbWU7Ci0gIE5vZGUgKm5leHQ7Ci19OwotCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1XaGVuIHVzZWQgaW4gYSBUY2wgc2NyaXB0LCB3ZSBjYW4gbm93IGNyZWF0ZSBuZXcgbm9kZXMgYW5kIGFjY2VzcwotaW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSA8dHQ+IE5vZGUgPC90dD4gc3RydWN0dXJlLiAgIEluIGZhY3QsIHdlIGNhbgotd3JpdGUgY29kZSB0byBjb252ZXJ0IGJldHdlZW4gVGNsIGxpc3RzIGFuZCBsaW5rZWQgbGlzdHMgZW50aXJlbHkKLWluIFRjbCBhcyBzaG93biA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotIyBCdWlsZHMgbGlua2VkIGxpc3QgZnJvbSBhIFRjbCBsaXN0Ci1wcm9jIGJ1aWxkbGlzdCB7bGlzdCBoZWFkfSB7Ci0gICAgc2V0IG5pdGVtcyBbbGxlbmd0aCAkbGlzdF07Ci0gICAgZm9yIHtzZXQgaSAwfSB7JGkgJmx0OyAkbml0ZW1zfSB7aW5jciBpIC0xfSB7Ci0gICAgICAgIHNldCBpdGVtIFtscmFuZ2UgJGxpc3QgJGkgJGldIAotICAgICAgICBzZXQgbiBbbmV3X05vZGUgJGl0ZW1dICAgICAgICAKLSAgICAgICAgTm9kZV9zZXRfbmV4dCAkbiAkaGVhZCAgICAgICAgCi0gICAgICAgIHNldCBoZWFkICRuICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gJGhlYWQKLX0KLSMgQnVpbGRzIGEgVGNsIGxpc3QgZnJvbSBhIGxpbmtlZCBsaXN0Ci1wcm9jIGdldF9saXN0IHtsbGlzdH0gewotICAgIHNldCBsaXN0IHt9IAotICAgIHdoaWxlIHskbGxpc3QgIT0gIk5VTEwifSB7Ci0gICAgICAgIGxhcHBlbmQgbGlzdCBbTm9kZV9uYW1lX2dldCAkbGxpc3RdCi0gICAgICAgIHNldCBsbGlzdCBbTm9kZV9nZXRfbmV4dCAkbGxpc3RdICAgCi0gICAgfQotICAgIHJldHVybiAkbGlzdCAgICAgICAgICAgICAgICAgICAgICAKLX0KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gcnVuIGludGVyYWN0aXZlbHksIHdlIGNvdWxkIG5vdyB1c2Ugb3VyIFRjbCBmdW5jdGlvbnMgYXMKLWZvbGxvd3MuCi0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotJSBzZXQgbCB7Sm9obiBBbm5lIE1hcnkgSmltfQotSm9obiBBbm5lIE1hcnkgSmltCi0lIHNldCBsbCBbYnVpbGRsaXN0ICRsIF8wX05vZGVfcF0gICAgICAgICAgIAotXzEwMDBjYWI4X05vZGVfcAotJSBnZXRfbGlzdCAkbGwKLUppbSBNYXJ5IEFubmUgSm9obgotJSBzZXQgbGwgW2J1aWxkbGlzdCB7TWlrZSBQZXRlciBEYXZlfSAkbGxdCi1fMTAwMGNjMzhfTm9kZV9wCi0lIGdldF9saXN0ICRsbAotRGF2ZSBQZXRlciBNaWtlIEppbSBNYXJ5IEFubmUgSm9obgotJSAKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci1Bc2lkZSBmcm9tIHRoZSBwb2ludGVyIHZhbHVlcywgb3VyIHNjcmlwdCBhY3RzIGxpa2UgYW55IG90aGVyCi1UY2wgc2NyaXB0LiAgIEhvd2V2ZXIsIHdlIGhhdmUgYnVpbHQgdXAgYSByZWFsCi1DIGRhdGEgc3RydWN0dXJlIHRoYXQgY291bGQgYmUgZWFzaWx5IHBhc3NlZCB0byBvdGhlciBDIGZ1bmN0aW9ucwotaWYgbmVlZGVkLgotCi08aDM+IDUuMi4gVXNpbmcgQyBEYXRhLVN0cnVjdHVyZXMgd2l0aCBUayA8L2gzPgotCi1JbiBtYW5uZXIgc2ltaWxhciB0byB0aGUgbGlua2VkIGxpc3QgZXhhbXBsZSwgVGNsL1RrIGNhbiBiZSB1c2VkCi10byBidWlsZCBjb21wbGV4IEMvQysrIGRhdGEgc3RydWN0dXJlcy4gICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZQotd2FudGVkIHRvIGludGVyYWN0aXZlbHkgYnVpbGQgYSBncmFwaCBvZiBgYE5vZGVzJycgZm9yIHVzZSBpbiBhIEMKLWFwcGxpY2F0aW9uLgotQSB0eXBpY2FsIGludGVyZmFjZSBmaWxlIG1pZ2h0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci0lewotI2luY2x1ZGUgIm5vZGVzLmgiCi0lfQotCi0laW5jbHVkZSB3aXNoCi1leHRlcm4gTm9kZSAqbmV3X25vZGUoKTsgICAgICAgICAgICAgICAgIAotZXh0ZXJuIHZvaWQgQWRkRWRnZShOb2RlICpuMSwgTm9kZSAqbjIpOyAKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdpdGhpbiBhIFRjbC9UayBzY3JpcHQsIGxvb3NlbHkgYmFzZWQgb24gb25lIHRvIG1ha2UgYmFsbCBhbmQgc3RpY2sgZ3JhcGhzCi1pbiBbT3VzdGVyaG91dF0sIGEgZ3JhcGggY291bGQgYmUgYnVpbHQgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLXByb2MgbWFrZU5vZGUge3ggeX0gewotICAgZ2xvYmFsIG5vZGVYIG5vZGVZIG5vZGVQIGVkZ2VGaXJzdCBlZGdlU2Vjb25kCi0gICBzZXQgbmV3IFsuY3JlYXRlIG92YWwgW2V4cHIgJHgtMTVdIFwKLSAgICAgICAgICAgW2V4cHIgJHktMTVdIFtleHByICR4KzE1XSBcCi0gICAgICAgICAgIFtleHByICR5KzE1XSAtb3V0bGluZSBibGFjayBcCi0gICAgICAgICAgIC1maWxsIHdoaXRlIC10YWdzIG5vZGVdCi0gICBzZXQgbmV3bm9kZSBbbmV3X25vZGVdICAgICAgICAgICAKLSAgIHNldCBub2RlWCgkbmV3KSAkeAotICAgc2V0IG5vZGVZKCRuZXcpICR5Ci0gICBzZXQgbm9kZVAoJG5ldykgJG5ld25vZGUgICAgICAgICAKLSAgIHNldCBlZGdlRmlyc3QoJG5ldykge30KLSAgIHNldCBlZGdlU2Vjb25kKCRuZXcpIHt9Ci19Ci1wcm9jIG1ha2VFZGdlIHtmaXJzdCBzZWNvbmR9IHsKLSAgIGdsb2JhbCBub2RlWCBub2RlWSBub2RlUCBlZGdlRmlyc3QgZWRnZVNlY29uZAotICAgc2V0IHgxICRub2RlWCgkZmlyc3QpOyAgc2V0IHkxICRub2RlWSgkZmlyc3QpCi0gICBzZXQgeDIgJG5vZGVYKCRzZWNvbmQpOyBzZXQgeTIgJG5vZGVZKCRzZWNvbmQpCi0gICBzZXQgZWRnZSBbLmMgY3JlYXRlIGxpbmUgJHgxICR5MSAkeDIgJHkyIFwKLSAgICAgICAgICAgICAgLXRhZ3MgZWRnZX0KLSAgIC5jIGxvd2VyIGVkZ2UKLSAgIGxhcHBlbmQgZWRnZUZpcnN0KCRmaXJzdCkgJGVkZ2UKLSAgIGxhcHBlbmQgZWRnZVNlY29uZCgkZmlyc3QpICRlZGdlCi0gICBBZGRFZGdlICRub2RlUCgkZmlyc3QpICRub2RlUCgkc2Vjb25kKQotfQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotVGhlc2UgZnVuY3Rpb25zIGNyZWF0ZQotVGsgY2FudmFzIGl0ZW1zLCBidXQgYWxzbyBhdHRhY2ggYSBwb2ludGVyIHRvIGEgQyBkYXRhIHN0cnVjdHVyZSB0byBlYWNoIG9uZS4KLVRoaXMgaXMgZG9uZSBieSBtYWludGFpbmluZyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBtYXBwaW5nIAotaXRlbSBpZGVudGlmaWVycyB0byBwb2ludGVycyAod2l0aCB0aGUgPHR0PiBub2RlUCgpIDwvdHQ+IGFycmF5KS4gCi1XaGVuIGEKLXBhcnRpY3VsYXIgYGBub2RlJycgaXMgcmVmZXJlbmNlZCBsYXRlciwgd2UgY2FuIHVzZSB0aGlzIHRvCi1nZXQgaXRzIHBvaW50ZXIgdXNlIGl0IGluIGNhbGxzIHRvIEMgZnVuY3Rpb25zLgotCi08aDM+IDUuMy4gUGFyc2luZyBhIEMrKyBTaW1wbGUgQ2xhc3MgSGllcmFyY2h5IDwvaDM+Ci0KLUFzIG1lbnRpb25lZCBlYXJsaWVyLCBTV0lHIGNhbiBoYW5kbGUgQysrIGNsYXNzZXMgYW5kIHB1YmxpYwotaW5oZXJpdGFuY2UuICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHByb3ZpZGVzIGEgZmV3IGNsYXNzZXMKLWFuZCBpbGx1c3RyYXRlcyBob3cgdGhpcyBpcyBhY2NvbXBsaXNoZWQgKHNvbWUgY29kZSBoYXMgYmVlbgotb21taXR0ZWQgZm9yIHJlYWRhYmlsaXR5KS4KLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLS8vIEEgU1dJRyBpbmhlcml0YW5jZSBleGFtcGxlCi0lbW9kdWxlIHNoYXBlcwotJXsKLSNpbmNsdWRlICJzaGFwZXMuaCIKLSV9Ci0KLWNsYXNzIFNoYXBlIHsKLXByaXZhdGU6Ci0gIGRvdWJsZSB4YywgeWM7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgZG91YmxlIGFyZWEoKSA9IDA7Ci0gIHZpcnR1YWwgZG91YmxlIHBlcmltZXRlcigpID0gMDsKLSAgdm9pZCAgICBzZXRfcG9zaXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KTsKLSAgdm9pZCAgICBwcmludF9wb3NpdGlvbigpOwotfTsKLQotY2xhc3MgQ2lyY2xlOiBwdWJsaWMgU2hhcGUgewotIHByaXZhdGU6Ci0gIGRvdWJsZSByYWRpdXM7Ci0gcHVibGljOgotICBDaXJjbGUoZG91YmxlIHIpOwotICBkb3VibGUgYXJlYSgpOwotICBkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotCi1jbGFzcyBTcXVhcmUgOiBwdWJsaWMgU2hhcGUgewotcHJpdmF0ZToKLSAgZG91YmxlIHdpZHRoOwotcHVibGljOgotICBTcXVhcmUoZG91YmxlIHcpOwotICBkb3VibGUgYXJlYSgpOwotICBkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1Ob3csIHdoZW4gd3JhcHBlZCBieSBTV0lHIChub3RlIDoKLVdoZW4gcGFyc2luZyBDKysgY2xhc3NlcywgU1dJRyB0aHJvd3MgYXdheSBldmVyeXRoaW5nIGRlY2xhcmVkIGFzIHByaXZhdGUsCi1pbmxpbmUgY29kZSwgYW5kIGFsb3Qgb2YgdGhlIG90aGVyIGNsdXR0ZXIgZm91bmQgaW4gQysrIGhlYWRlciBmaWxlcy4gIAotUHJpbWFyaWx5IHRoaXMgaXMgcHJvdmlkZWQgb25seSB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBpbnRlcmZhY2VzIGZyb20KLWV4aXN0aW5nIEMrKyBoZWFkZXIgZmlsZXMuKSwgd2UgY2FuIHVzZSBvdXIgY2xhc3Mgc3RydWN0dXJlIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci0lIHNldCBjIFtuZXdfQ2lyY2xlIDRdCi1fMTAwMGFkNzBfQ2lyY2xlX3AKLSUgc2V0IHMgW25ld19TcXVhcmUgMTBdCi1fMTAwMGFkYzBfU3F1YXJlX3AKLSUgU2hhcGVfYXJlYSAkYwotNTAuMjY1NDgyNDY0MDAwMDAyMDAKLSUgU2hhcGVfYXJlYSAkcwotMTAwLjAwMDAwMDAwMDAwMDAwMDAwCi0lIFNoYXBlX3NldF9wb3NpdGlvbiAkYyAtNSAxMAotJSBDaXJjbGVfcHJpbnRfcG9zaXRpb24gJGMKLXhjID0gLTUsIHljID0gMTAKLSUgCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1JbiBvdXIgZXhhbXBsZSwgd2UgaGF2ZSBjcmVhdGVkIG5ldyA8dHQ+IENpcmNsZSA8L3R0PiBhbmQgPHR0PiBTcXVhcmUgPC90dD4gb2JqZWN0cywKLWJ1dCB0aGVzZSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSBpbiBhbnkgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIDx0dD4gU2hhcGUgPC90dD4KLWJhc2UgY2xhc3MuICBUaGUgU1dJRyB0eXBlIGNoZWNrZXIgaXMgZW5jb2RlZCB3aXRoIHRoZSBjbGFzcyBoaWVyYXJjaHkgYW5kCi1rbm93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGRpZmZlcmVudCBjbGFzc2VzLiAgIFRodXMsIHdoaWxlIGFuCi1vYmplY3Qgb2YgdHlwZSA8dHQ+IENpcmNsZSA8L3R0PiBpcyBwZXJmZWN0bHkgYWNjZXB0YWJsZSB0byBhIGZ1bmN0aW9uIG9wZXJhdGluZwotb24gc2hhcGVzLCBpdCB3b3VsZCBiZSB1bmFjY2VwdGFibGUgdG8gYSBmdW5jdGlvbiBvcGVyYXRpbmcgb25seSBvbiB0aGUKLTx0dD4gU3F1YXJlIDwvdHQ+IHR5cGUuICAgIEFzIGluIEMrKywgYW55IGZ1bmN0aW9ucyBpbiB0aGUgYmFzZSBjbGFzcyBjYW4gYmUKLWNhbGxlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyBhcyBzaG93biBieSB0aGUgPHR0PiBDaXJjbGVfcHJpbnRfcG9zaXRpb24gPC90dD4KLWZ1bmN0aW9uIGFib3ZlLgotCi08aDI+IDYuIFVzaW5nIFNXSUcgaW4gUmVhbCBBcHBsaWNhdGlvbnMgPC9oMj4KLQotU28gZmFyIG9ubHkgYSBmZXcgc2ltcGxlIHRveSBleGFtcGxlcyBoYXZlIGJlZW4gcHJlc2VudGVkIHRvIGlsbHVzdHJhdGUKLXRoZSBvcGVyYXRpb24gb2YgU1dJRyBpbiBnZW5lcmFsLgotVGhpcyBzZWN0aW9uIHdpbGwgZGVzY3JpYmUgaG93IFNXSUcgY2FuIGJlIHVzZWQKLXdpdGggbGFyZ2VyIGFwcGxpY2F0aW9ucy4KLQotPGgzPiA2LjEuIFVzZSBpbiBTY2llbnRpZmljIEFwcGxpY2F0aW9ucyA8L2gzPgotIAotTWFueSB1c2VycywgZXNwZWNpYWxseSB3aXRoaW4gdGhlIHNjaWVudGlmaWMgYW5kIGVuZ2luZWVyaW5nIAotY29tbXVuaXR5LCBoYXZlIHNwZW50IHllYXJzIGRldmVsb3Bpbmcgc2ltdWxhdGlvbiBjb2Rlcy4KLVdoaWxlIG1hbnkgb2YgdGhlc2UgdXNlcnMgYXBwcmVjaWF0ZSB0aGUKLXBvd2VyIHRoYXQgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgY2FuIHByb3ZpZGUsIHRoZXkgZG9uJ3Qgd2FudCB0byAKLWNvbXBsZXRlbHkgcmV3cml0ZSB0aGVpciBhcHBsaWNhdGlvbnMgb3Igc3BlbmQgYWxsIG9mIHRoZWlyIHRpbWUKLXRyeWluZyB0byBidWlsZCBhIHVzZXItaW50ZXJmYWNlIChtb3N0IHVzZXJzIHdvdWxkIHJhdGhlciBiZSB3b3JraW5nCi1vbiB0aGUgc2NpZW50aWZpYyBwcm9ibGVtIGF0IGhhbmQpLiAgV2hpbGUgU1dJRyBjZXJ0YWlubHkgd29uJ3QgZG8gZXZlcnl0aGluZywKLWl0IGNhbiBkcmFtYXRpY2FsbHkgc2ltcGxpZnkgdGhpcyBwcm9jZXNzLiAgIDxicj4gPGJyPgotCi1BcyBhbiBleGFtcGxlLCB0aGUgZmlyc3QgU1dJRyBhcHBsaWNhdGlvbiB3YXMgdGhlIFNQYVNNIG1vbGVjdWxhcgotZHluYW1pY3MgY29kZSBkZXZlbG9wZWQgYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5Ci1bQmVhemxleSxMb21kYWhsXS4gICBUaGlzIGNvZGUgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgZm9yIG1hdGVyaWFscwotc2NpZW5jZSBwcm9ibGVtcyBhbmQgY29uc2lzdHMgb2YgbW9yZSB0aGFuIDIwMCBDIGZ1bmN0aW9ucyBhbmQgYWJvdXQgMjAwMDAgbGluZXMKLW9mIGNvZGUuCi1JbiBvcmRlciB0byB1c2UgU1dJRywgb25seSB0aGUgPHR0PiBtYWluKCkgPC90dD4gZnVuY3Rpb24gaGFkIHRvIGJlCi1yZXdyaXR0ZW4gYWxvbmcgd2l0aCBhIGZldyBvdGhlciBtaW5vciBtb2RpZmljYXRpb25zLgotVGhlIGZ1bGwgdXNlciBpbnRlcmZhY2UgaXMgYnVpbHQgdXNpbmcgYSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgZm9yCi1zaW11bGF0aW9uLCBncmFwaGljcywgbWVtb3J5IG1hbmFnZW1lbnQsIGV0Yy4uLiAKLUEgdXNlciBtYXkgYWxzbyBzdXBwbHkgdGhlaXIgb3duIGludGVyZmFjZSBtb2R1bGVzLS1hbGxvd2luZyB0aGUgY29kZSB0bwotYmUgZWFzaWx5IGV4dGVuZGVkIHdpdGggbmV3IGZ1bmN0aW9uYWxpdHkgY2FwYWJpbGl0aWVzIGFzIG5lZWRlZC4KLUFsbCBvZiB0aGUgaW50ZXJmYWNlIGZpbGVzLCBjb250YWluaW5nIGEgZmV3IGh1bmRyZWQgbGluZXMgb2YKLWZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgYXJlIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCBpbnRvIG1vcmUgdGhhbgotMjAwMCBsaW5lcyBvZiB3cmFwcGVyIGNvZGUgYXQgY29tcGlsZSB0aW1lLiAgIEFzIGEgcmVzdWx0LCBtYW55IHVzZXJzIAotb2YgdGhlIHN5c3RlbSBrbm93IGhvdyB0byBleHRlbmQgaXQsIGJ1dCBhcmUgdW5hd2FyZSBvZiB0aGUgYWN0dWFsCi13cmFwcGluZyBwcm9jZWR1cmUuICAgPGJyPiA8YnI+Ci0KLUFmdGVyIG1vZGlmeWluZyB0aGUgU1BhU00gY29kZSB0byB1c2UgU1dJRywgbW9zdCBvZiB0aGUgQyBjb2RlIHJlbWFpbmVkCi11bmNoYW5nZWQuICBJbiBmYWN0LCBpbiBzdWJzZXF1ZW50IHdvcmssIHdlIHdlcmUgYWJsZSB0byBlbGltaW5hdGUKLW1vcmUgdGhhbiAyNSUgb2YgdGhlIHNvdXJjZSBjb2RlLS1hbG1vc3QgYWxsIG9mIHdoaWNoIHdhcyByZWxhdGVkIHRvIHRoZQotbm93IG9ic29sZXRlIGludGVyZmFjZSBtZXRob2QgdGhhdCB3ZSByZXBsYWNlZC4gICBNb3JlIGltcG9ydGFudGx5LCB3ZQotd2VyZSBhYmxlIHRvIHR1cm4gYSBjb2RlIHRoYXQgd2FzIGRpZmZpY3VsdCB0byB1c2UgYW5kIG1vZGlmeSBpbnRvIGEgCi1mbGV4aWJsZSBwYWNrYWdlIHRoYXQgd2FzIGVhc3kgdG8gdXNlIGFuZCBleHRlbmQuICAgVGhpcyBoYXMgaGFkIGEKLWh1Z2UgaW1wYWN0LCB3aGljaCBjYW4gbm90IGJlIHVuZGVyc3RhdGVkLCBvbiB0aGUgdXNlIG9mIHRoZSBTUGFTTQotY29kZSB0byBzb2x2ZSByZWFsIHByb2JsZW1zLgotCi08aDM+IDYuMi4gT3Blbi1HTCBhbmQgSW52ZW50b3IgPC9oMz4KLQotV2hpbGUgU1dJRyB3YXMgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBhcHBsaWNhdGlvbiBjb2RlcywgaXQKLWNhbiBhbHNvIGJlIHVzZWQgdG8gd3JhcCBsYXJnZSBsaWJyYXJpZXMuICAgQXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCwKLVBldGVyLVBpa2UgU2xvYW4gdXNlZCBTV0lHIHRvIHdyYXAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgT3Blbi1HTAotbGlicmFyeSBpbnRvIFRjbCBmb3IgdXNlIHdpdGggYW4gT3Blbi1HTCBUayB3aWRnZXQuICAgVGhlIHByb2Nlc3Mgb2YKLXdyYXBwaW5nIE9wZW4tR0wgd2l0aCBTV0lHIHdhcyBhcyBzaW1wbGUgYXMgdGhlIGZvbGxvd2luZyA6Ci0KLTx1bD4KLTxsaT4gIE1ha2UgYSBjb3B5IG9mIHRoZSA8dHQ+IGdsLmggPC90dD4gaGVhZGVyIGZpbGUuCi08bGk+ICBDbGVhbiBpdCB1cCBieSB0YWtpbmcgYSBmZXcgQyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBvdXQgCi0gICAgICBvZiBpdC4gICBGaXggYSBmZXcgdHlwZWRlZnMuCi08bGk+IEluc2VydCB0aGUgZm9sbG93aW5nIGNvZGUgaW50byB0aGUgYmVnaW5uaW5nIAotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLSVtb2R1bGUgb3BlbmdsCi0lewotI2luY2x1ZGUgJmx0O0dML2dsLmgmZ3Q7Ci0lfQotLi4uIENvcHkgZWRpdGVkIGdsLmggaGVyZSAuLi4KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLTxsaT4gTW9kaWZ5IHRoZSBPcGVuLUdMIHdpZGdldCB0byBjYWxsIDx0dD4gT3BlbmdsX0luaXQgPC90dD4uCi08bGk+IFJlY29tcGlsZQotPC91bD4KLQotVGhlIGVudGlyZSBwcm9jZXNzIHJlcXVpcmVkIG9ubHkgYWJvdXQgMTAgbWludXRlcyBvZiB3b3JrLCBidXQgcmVzdWx0ZWQKLWluIG1vcmUgdGhhbiA1MDAgY29uc3RhbnRzIGFuZCAzNjAgZnVuY3Rpb25zIGJlaW5nIGFkZGVkIHRvIFRjbC4gIEZ1cnRoZXJtb3JlLAotdGhpcyBleHRlbnNpb24gYWxsb3dzIE9wZW4tR0wgY29tbWFuZHMgdG8gYmUgaXNzdWVkIGRpcmVjdGx5IGZyb20gVGNsJ3MKLWludGVycHJldGVkIGVudmlyb25tZW50IGFzIHNob3duIGluIHRoaXMgZXhhbXBsZQotKGZyb20gdGhlIE9wZW4tR0wgbWFudWFsIFtPcGVuR0xdKS4KLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLSUgLi4uIG9wZW4gR0wgd2lkZ2V0IGhlcmUgLi4uCi0lIGdsQ2xlYXJDb2xvciAwLjAgMC4wIDAuMCAwLjAKLSUgZ2xDbGVhciAkR0xfQ09MT1JfQlVGRkVSX0JJVAotJSBnbENvbG9yM2YgMS4wIDEuMCAxLjAKLSUgZ2xPcnRobyAtMS4wIDEuMCAtMS4wIDEuMCAtMS4wIDEuMAotJSBnbEJlZ2luICRHTF9QT0xZR09OCi0lICAgIGdsVmVydGV4MmYgLTAuNSAtMC41Ci0lICAgIGdsVmVydGV4MmYgLTAuNSAwLjUKLSUgICAgZ2xWZXJ0ZXgyZiAwLjUgMC41Ci0lICAgIGdsVmVydGV4MmYgMC41IC0wLjUKLSUgZ2xFbmQKLSUgZ2xGbHVzaAotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotRWFybHkgd29yayBoYXMgYWxzbyBiZWVuIHBlcmZvcm1lZCBvbiB1c2luZyBTV0lHIHRvIHdyYXAgcG9ydGlvbnMgCi1vZiB0aGUgT3Blbi1JbnZlbnRvciBwYWNrYWdlIFtJbnZlbnRdLiAgIFRoaXMgaXMgYSBtb3JlIGFtYml0aW91cyBwcm9qZWN0Ci1zaW5jZSBPcGVuLUludmVudG9yIGNvbnNpc3RzIG9mIGEgdmVyeSBsYXJnZSBjb2xsZWN0aW9uIG9mIGhlYWRlcgotZmlsZXMgYW5kIEMrKyBjbGFzc2VzLiAgICBIb3dldmVyLCAgdGhlIFNXSUcgbGlicmFyeSBtZWNoYW5pc20gY2FuIGJlCi11c2VkIGVmZmVjdGl2ZSBpbiB0aGlzIGNhc2UuICAgRm9yIGVhY2ggSW52ZW50b3IgaGVhZGVyLCB3ZSBjYW4gY3JlYXRlCi1hIHNhbml0aXplZCBTV0lHIGludGVyZmFjZSBmaWxlIChyZW1vdmluZyBhbG90IG9mIHRoZSBjbHV0dGVyIGZvdW5kIGluCi10aGUgaGVhZGVyIGZpbGVzKS4gICBUaGVzZSBpbnRlcmZhY2UgZmlsZXMgY2FuIHRoZW4gYmUgb3JnYW5pemVkIHRvIG1pcnJvciB0aGUKLXN0cnVjdHVyZSBvZiB0aGUgSW52ZW50b3Igc3lzdGVtLiAgICBUbyBidWlsZCBhIG1vZHVsZSBmb3IgVGNsLCBhIHVzZXIKLWNvdWxkIHNpbXBseSBzcGVjaWZ5IHdoaWNoIG1vZHVsZXMgdGhleSB3YW50ZWQgdG8gdXNlIGFzIGZvbGxvd3MgOgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotJW1vZHVsZSBpbnZlbnQKLSV7Ci0uLi4gcHV0IGhlYWRlcnMgaGVyZSAuLi4KLSV9Ci0KLSVpbmNsdWRlICJJbnZlbnRvci9YdC9Tb1h0LmkiCi0laW5jbHVkZSAiSW52ZW50b3IvWHQvU29YdFJlbmRlckFyZWEuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9ub2Rlcy9Tb0NvbmUuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9ub2Rlcy9Tb0RpcmVjdGlvbmFsTGlnaHQuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9ub2Rlcy9Tb01hdGVyaWFsLmkiCi0laW5jbHVkZSAiSW52ZW50b3Ivbm9kZXMvU29QZXJzcGVjdGl2ZUNhbWVyYS5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvU2VwYXJhdG9yLmkiCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1XaGlsZSB3cmFwcGluZyB0aGUgSW52ZW50b3IgbGlicmFyeSB3aWxsIHJlcXVpcmUgc2lnbmlmaWNhbnRseQotbW9yZSB3b3JrIHRoYW4gT3Blbi1HTCwgU1dJRyBjYW4gYmUgdXNlZCBlZmZlY3RpdmVseSB3aXRoIHN1Y2gKLXN5c3RlbXMuICAgCi0KLTxoMz4gNi4zLiBCdWlsZGluZyBJbnRlcmVzdGluZyBBcHBsaWNhdGlvbnMgYnkgQ3V0IGFuZCBQYXN0ZSA8L2gzPgotCi1TV0lHIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0b29scyBvdXQgb2YgZGlzc2ltaWxpYXIgCi1wYWNrYWdlcyBhbmQgbGlicmFyaWVzLiAgIAotSW4gY29udHJhc3QgdG8gY29tYmluaW5nIHBhY2thZ2VzIGF0IGFuIGlucHV0IGxldmVsIGFzIG9uZSBtaWdodAotZG8gd2l0aCB3aXRoIEV4cGVjdCwgU1dJRyBjYW4gYmUgdXNlZCB0byBidWlsZCBhcHBsaWNhdGlvbnMgYXQgYQotZnVuY3Rpb24gbGV2ZWwgW0V4cGVjdF0uCi1Gb3IgZXhhbXBsZSwgdXNpbmcKLWEgc2ltcGxlIGludGVyZmFjZSBmaWxlLCB5b3UgY2FuIHdyYXAgdGhlCi1DIEFQSSBvZiBNQVRMQUIgNC4yIFtNQVRMQUJdLgotVGhpcyBpbiB0dXJuIGxldHMgeW91IGJ1aWxkIGEgVGNsL1RrIGludGVyZmFjZSBmb3IgY29udHJvbGxpbmcKLU1BVExBQiBwcm9ncmFtcy4gIFNlcGFyYXRlbHksIHlvdSBjb3VsZCB3cmFwIGEgbnVtZXJpY2FsIHNpbXVsYXRpb24KLWNvZGUuICAgTm93LCBhIGZldyB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgY291bGQgYmUgd3JpdHRlbiBhbmQgYm90aAotcGFja2FnZXMgY29tYmluZWQgaW50byBhIHNpbmdsZSBUY2wvVGsgYXBwbGljYXRpb24uICAgWW91IGhhdmUKLW5vdyBidWlsdCBhIHNpbXBsZSBgYGNvbXB1dGF0aW9uYWwgc3RlZXJpbmcnJyBzeXN0ZW0gdGhhdCBhbGxvd3MgeW91Ci10byBydW4gYSBzaW11bGF0aW9uIGNvZGUsIHZpc3VhbGl6ZSBkYXRhIGluIE1BVExBQiwgYW5kIGNvbnRyb2wgdGhlCi1lbnRpcmUgc3lzdGVtIHdpdGggYSBUY2wvVGsgYmFzZWQgaW50ZXJmYWNlLiAgICBGaWd1cmUgMiBzaG93cwotYSBzY3JlZW4gc25hcHNob3QgZnJvbSBzdWNoIGEgc2ltdWxhdGlvbiBpbiB3aGljaCB0aGUgU1BhU00gbW9sZWN1bGFyCi1keW5hbWljcyBjb2RlLCBhIHZpc3VhbGl6YXRpb24gbW9kdWxlIGxpYnJhcnksIGltYWdlIHNlcnZlciAodXNpbmcgeHYpLAotYW5kIE1BVExBQiBoYXZlIGJlZW4KLWNvbWJpbmVkLiAgIFVuZGVyIHRoaXMgc3lzdGVtLCB0aGUgdXNlciBjYW4gaW50ZXJhY3RpdmVseSBzZXQgdXAKLWFuZCBydW4gc2ltdWxhdGlvbnMgd2hpbGUgd2F0Y2hpbmcgdGhlIHJlc3VsdHMgZXZvbHZlIGluIHJlYWwtdGltZS4KLTxicj4gPGJyPgotPGNlbnRlcj4KLTxpbWcgYWx0ID0gIlRjbC9Uay9NQVRMQUIvU1BBU00gRmlndXJlIiBzcmM9InN0ZWVyMi5naWYiPiA8YnI+Ci1GaWd1cmUgMjogU2ltcGxlIFRjbC9UayBTdGVlcmluZyBBcHBsaWNhdGlvbiBCdWlsdCB3aXRoIFNXSUcgPGJyPgotPC9jZW50ZXI+Ci0KLTxoMz4gNi40LiBMYW5ndWFnZSBJbmRlcGVuZGVudCBBcHBsaWNhdGlvbnMgPC9oMz4KLQotCi1FYWNoIHNjcmlwdGluZyBsYW5ndWFnZSBoYXMgaXQncyBvd24gc3RyZW5ndGhzIGFuZCB3ZWFrbmVzc2VzLiAgCi1SYXRoZXIKLXRoYW4gdHJ5aW5nIHRvIGNob29zZSB0aGUgbGFuZ3VhZ2UgdGhhdCBpcyB0aGUgYmVzdCBhdCBldmVyeXRoaW5nICh3aGljaAotaXMgcHJvYmFibHkgaW1wb3NzaWJsZSksCi1TV0lHIGFsbG93cyBhIHVzZXIgdG8gdXNlIHRoZSBiZXN0IGxhbmd1YWdlIGZvciB0aGUgam9iIGF0IGhhbmQuICBJJ20KLWFsd2F5cyBmaW5kaW5nIG15c2VsZiB3cml0aW5nIGxpdHRsZSB1dGlsaXRpZXMgYW5kIHByb2dyYW1zIHRvIHN1cHBvcnQKLW15IHNjaWVudGlmaWMgY29tcHV0aW5nIHdvcmsuICBXaHkgc2hvdWxkIEkgYmUgZm9yY2VkIHRvIHVzZSBvbmx5IG9uZQotbGFuZ3VhZ2UgZm9yIGV2ZXJ5dGhpbmc/ICBXaXRoIFNXSUcsIEkgY2FuIHB1dCBhIFBlcmwgaW50ZXJmYWNlIG9uIGEKLXRvb2wgYW5kIHN3aXRjaCBvdmVyIHRvIFRjbC9UayBhdCBhbnl0aW1lIGJ5IGp1c3QgY2hhbmdpbmcgYSBmZXcKLU1ha2VmaWxlIG9wdGlvbnMuIDxicj4gPGJyPgotCi1TaW5jZSBTV0lHIHByb3ZpZGVzIGEgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24sCi1pdCBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gdXNlIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgaW4gYSB2YXJpZXR5IG9mCi1pbnRlcmVzdGluZyBhcHBsaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlIGlkZW50aWNhbCBNQVRMQUIKLW1vZHVsZSB1c2VkIGluIHRoZSBsYXN0IFRjbCBleGFtcGxlIGNvdWxkIGJlIGltcG9ydGVkIGFzIFBlcmw1IG1vZHVsZQotYW5kIGNvbWJpbmVkIHdpdGggYSBQZXJsIHNjcmlwdCB0byBwcm9kdWNlIGdyYXBoaWNhbCBkaXNwbGF5cyBmcm9tCi1XZWItc2VydmVyIGxvZ3MgYXMgc2hvd24gaW4gRmlndXJlIDMuIDxicj4gPGJyPgotCi08Y2VudGVyPgotPGltZyBhbHQ9IlBlcmw1IHdlYiBzdGF0cyBleGFtcGxlIiBzcmM9ImhpdHMuZ2lmIj4gPGJyPgotRmlndXJlIDM6V2ViLXNlcnZlciBhY3Rpdml0eSBncmFwaC4gIEdlbmVyYXRlZCBmcm9tIGEgUGVybCBzY3JpcHQsIGJ1dAotdXNlcyBhbiB1bm1vZGlmaWVkIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZSBmb3IgaW50ZWdyYXRpbmcgTUFUTEFCIHdpdGggVGNsL1RrLiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi1Tb21lIGhhdmUgcHJvbW90ZWQgdGhlIGlkZWEgb2YgZW5jYXBzdWxhdGluZyBzZXZlcmFsIGxhbmd1YWdlcyBpbnRvCi1hIGhpZ2hlciBsZXZlbCBsYW5ndWFnZSBhcyBoYXMgYmVlbiBwcm9wb3NlZCB3aXRoIEd1aWxlIFtMb3JkXS4KLVRoaXMgbWF5IGJlIGZpbmUgaWYgb25lIHdhbnRzIHRvIHdyaXRlIGNvZGUgdGhhdCB1c2VzIGRpZmZlcmVudCBsYW5ndWFnZXMKLWFsbCBhdCBvbmNlLCBidXQgd2hlbiBJIHdhbnQgdG8gdXNlIG9ubHkgVGNsIG9yIFBlcmwgZm9yIGFuIGFwcGxpY2F0aW9uLAotSSBhbG1vc3QgYWx3YXlzIHByZWZlciB1c2luZyB0aGUgcmVhbCB2ZXJzaW9ucyBpbnN0ZWFkIG9mIGFuIGVuY2Fwc3VsYXRlZAotdmFyaWFudC4gICAgIFNXSUcgbWFrZXMgdGhpcyBwb3NzaWJsZSB3aXRob3V0IG11Y2ggZWZmb3J0LgotCi08aDM+IDYuNS4gVXNpbmcgVGNsIGFzIGEgZGVidWdnZXIgPC9oMz4KLQotU2luY2UgU1dJRyBjYW4gd29yayB3aXRoIGV4aXN0aW5nIEMgY29kZSwgaXQgY2FuIGJlIHVzZWQgcXVpdGUgZWZmZWN0aXZlbHkKLWFzIGEgZGVidWdnZXIuCi1Zb3UgY2FuIHdyYXAgQyBmdW5jdGlvbnMgYW5kIGludGVyYWN0Ci13aXRoIHRoZW0gZnJvbSA8dHQ+IHRjbHNoIDwvdHQ+IG9yIDx0dD4gd2lzaCA8L3R0Pi4KLVVubGlrZSBtb3N0IHRyYWRpdGlvbmFsIGRlYnVnZ2VycywgeW91Ci1jYW4gY3JlYXRlIG9iamVjdHMsIGJ1ZmZlcnMsIGFycmF5cywgYW5kIG90aGVyIHRoaW5ncyBvbiB0aGUgZmx5Ci1ieSBwdXR0aW5nIGFwcHJvcHJpYXRlIGRlZmluaXRpb25zIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KLVNpbmNlIDx0dD4gdGNsc2ggPC90dD4gb3IgPHR0PiB3aXNoIDwvdHQ+IHByb3ZpZGVzIGEgPHR0PiBtYWluKCkgPC90dD4gZnVuY3Rpb24sIHlvdQotY2FuIGV2ZW4gcmlwIHNtYWxsIHBpZWNlcyBvdXQgb2YgYSBsYXJnZXIgcGFja2FnZSB3aXRob3V0IGluY2x1ZGluZwotdGhhdCBwYWNrYWdlJ3MgbWFpbiBwcm9ncmFtLgotU2NyaXB0cyBjYW4gYmUgd3JpdHRlbiB0byB0ZXN0IG91dCBkaWZmZXJlbnQgcGFydHMgb2YgeW91cgotY29kZSBhcyBpdCBpcyBkZXZlbG9wZWQuICAgIFdoZW4geW91IGFyZSBzYXRpc2ZpZWQgd2l0aCB0aGUgbW9kdWxlLAotcmVtb3ZpbmcgdGhlIGludGVyZmFjZSBpcyBhcyBlYXN5IGFzIGRpc2NhcmRpbmcgdGhlIFNXSUcgaW50ZXJmYWNlCi1maWxlLiAgIEkgaGF2ZSB1c2VkIFNXSUcgYXMgYSBkZWJ1Z2dlciBmb3IgZGV2ZWxvcGluZyBncmFwaGljcyBsaWJyYXJpZXMsCi1uZXR3b3JrIHNlcnZlcnMsIHNpbXVsYXRpb24gY29kZXMsIGFuZCBhIHdpZGUgcmFuZ2Ugb2Ygb3RoZXIgcHJvamVjdHMtLXNvbWUKLW9mIHdoaWNoIGRpZG4ndCBldmVuIHVzZSBhIHNjcmlwdGluZyBsYW5ndWFnZSB3aGVuIGNvbXBsZXRlZC4KLQotPGgyPiA3LiBMaW1pdGF0aW9ucyA8L2gyPgotCi1TV0lHIHJlcHJlc2VudHMgYSBiYWxhbmNlIG9mIGZsZXhpYmlsaXR5IGFuZCBlYXNlIG9mIHVzZS4KLUkgaGF2ZSBhbHdheXMgZmVsdCB0aGF0IHRoZSB0b29sIHNob3VsZG4ndCBiZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4KLXRoZSBvcmlnaW5hbCBwcm9ibGVtLiAgICBUaGVyZWZvcmUsIFNXSUcgY2VydGFpbmx5IHdvbid0IGRvIGV2ZXJ5dGhpbmcuCi1XaGlsZSBJIGJlbGlldmUgdGhlIHBvaW50ZXIgcmVwcmVzZW50YXRpb24gb2YgY29tcGxleCBkYXRhdHlwZXMgd29ya3MKLXdlbGwgaW4gcHJhY3RpY2UsIHNvbWUgdXNlcnMgaGF2ZSBmb3VuZCB0aGlzIHRvIGJlIHRvbyBnZW5lcmFsIG9yCi1jb25mdXNpbmcuICAgIFNXSUcncwotc3VwcG9ydCBmb3IgQysrIGlzIGFsc28gbGltaXRlZCBieSB0aGUgZmFjdCB0aGF0IFNXSUcgZG9lcyBub3Qgc3VwcG9ydAotb3BlcmF0b3Igb3ZlcmxvYWRpbmcsIG11bHRpcGxlIGluaGVyaXRhbmNlLCB0ZW1wbGF0ZXMsIGFuZCBhIG51bWJlcgotb2Ygb3RoZXIgbW9yZSBhZHZhbmNlZCBDKysgZmVhdHVyZXMuICAgIFNXSUcgYWxzbyBsYWNrcyBzdXBwb3J0IGZvcgotZGVmYXVsdCBvciB2YXJpYWJsZSBsZW5ndGggZnVuY3Rpb24gYXJndW1lbnRzLCBhcnJheSBub3RhdGlvbiwKLXBvaW50ZXJzIHRvIGZ1bmN0aW9ucyAodW5sZXNzIGhpZGRlbiBieSBhIHR5cGVkZWYpIGFuZCBhbiBleGNlcHRpb24KLW1lY2hhbmlzbS4gCi1GaW5hbGx5LCBTV0lHCi1kb2VzCi1ub3Qgc3VwcG9ydCBhbGwgb2YgdGhlIGZlYXR1cmVzIG9mIFRjbCBzdWNoIGFzIGFzc29jaWF0aXZlIGFycmF5cy4KLVRoZXNlIGFyZW4ndCBhbiBpbmhlcmVudCBwYXJ0IG9mIHRoZSBDIGxhbmd1YWdlIHNvIGl0IGlzIGRpZmZpY3VsdAotdG8gZ2VuZXJhbGl6ZSBob3cgdGhleSBzaG91bGQgYmUgaGFuZGxlZCBvciBnZW5lcmF0ZWQuIEkgcHJlZmVyIHRvCi1rZWVwIHRoZSB0b29sIHNpbXBsZSB3aGlsZSBsZWF2aW5nIHRoZXNlIGlzc3VlcyB1cCB0byB0aGUgaW5kaXZpZHVhbAotcHJvZ3JhbW1lci4gIDxicj4gPGJyPgotCi0KLUZvcnR1bmF0ZWx5LCBpdCBpcyBhbG1vc3QgYWx3YXlzIHBvc3NpYmxlIHRvIHdvcmsgYXJvdW5kCi1tYW55IHByb2JsZW1zIGJ5IHdyaXRpbmcgc3BlY2lhbCBsaWJyYXJ5IGZ1bmN0aW9ucyBvciBtYWtpbmcKLW1vZGlmaWNhdGlvbnMgdG8gdGhlIFNXSUcgbGFuZ3VhZ2UgbW9kdWxlcyB0byBwcm9kdWNlIHRoZSBkZXNpcmVkIGVmZmVjdC4KLUZvciBleGFtcGxlLCB3aGVuIHdyYXBwaW5nIE9wZW4tR0wsIFNXSUcgaW5zdGFsbGVkIGFsbCBvZiB0aGUgT3Blbi1HTAotY29uc3RhbnRzIGFzIFRjbCBnbG9iYWwgdmFyaWFibGVzLiAgIFVuZm9ydHVuYXRlbHksIG5vbmUgb2YgdGhlc2UKLXZhcmlhYmxlcyB3ZXJlIGFjY2Vzc2libGUgaW5zaWRlIFRjbCBwcm9jZWR1cmVzIHVubGVzcyB0aGV5IHdlcmUgZXhwbGljaXRseQotZGVjbGFyZWQgZ2xvYmFsLiAgIEJ5IG1ha2luZyBhIG1vZGlmaWNhdGlvbiB0byB0aGUgVGNsIGxhbmd1YWdlIG1vZHVsZSwKLWl0IHdhcyBwb3NzaWJsZSB0byBwdXQgdGhlIEdMIGNvbnN0YW50cyBpbnRvIGhhc2ggdGFibGUgYW5kIHBlcmZvcm0KLWEgaGlkZGVuIGBgbG9va3VwJycgaW5zaWRlIGFsbCBvZiB0aGUgR0wtcmVsYXRlZCBmdW5jdGlvbnMuICBTaW1pbGFybHksCi1tdWNoIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFNXSUcgY2FuIGJlIHBsYWNlZCBpbnRvIGxpYnJhcnkKLWZpbGVzIGZvciB1c2UgaW4gb3RoZXIgbW9kdWxlcy4KLQotPGgyPiA4LiBDb25jbHVzaW9ucyA8L2gyPgotCi1TV0lHIGhhcyBiZWVuIGluIHVzZSBmb3IgYXBwcm94aW1hdGVseSBvbmUgeWVhci4gIEF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgaXRzIHVzZSB3aXRoIHRoZSBTUGFTTSBjb2RlIGhhcwotcHJvdmVuIHRvCi1iZSBhIHJlbWFya2FibHkgc2ltcGxlLCBzdGFibGUsIGFuZCBidWctZnJlZSB3YXkgdG8gYnVpbGQgYW5kIG1vZGlmeSB1c2VyCi1pbnRlcmZhY2VzLiAgIEF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgsIFNXSUcgaXMgYmVpbmcgdXNlZCBpbiBhIHZhcmlldHkKLW9mIG90aGVyIGFwcGxpY2F0aW9ucyB3aGVyZSB0aGUgdXNlcnMgaGF2ZSBxdWlja2x5IGNvbWUgdG8gYXBwcmVjaWF0ZSBpdHMKLWVhc2Ugb2YgdXNlIGFuZCBmbGV4aWJpbGl0eS4gPGJyPiA8YnI+Ci0KLVdoaWxlIFNXSUcgbWF5IGJlIGluYXBwcm9wcmlhdGUgZm9yIGNlcnRhaW4gYXBwbGljYXRpb25zLCBJIGZlZWwgdGhhdCBpdAotb3BlbnMgdXAgVGNsL1RrLCBQeXRob24sIFBlcmwsIEd1aWxlLCBhbmQgb3RoZXIgbGFuZ3VhZ2VzICB0byAKLXVzZXJzIHdobyB3b3VsZCBsaWtlIHRvIGRldmVsb3AgaW50ZXJlc3RpbmcgdXNlciBpbnRlcmZhY2VzIGZvciB0aGVpciBjb2RlcywKLWJ1dCB3aG8gZG9uJ3Qgd2FudCB0byB3b3JyeSBhYm91dCB0aGUgbG93LWxldmVsIGRldGFpbHMgb3IgZmlndXJpbmcKLW91dCBob3cgdG8gdXNlIGEgY29tcGxpY2F0ZWQgdG9vbC4gIDxicj4gPGJyPgotICAKLUZ1dHVyZSBkaXJlY3Rpb25zIGZvciBTV0lHIGluY2x1ZGUgc3VwcG9ydCBmb3Igb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcywKLWFuZCBhIGxpYnJhcnkgb2YgZXh0ZW5zaW9ucy4gIFNXSUcgbWF5IGFsc28gYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCBwYWNrYWdlcwotc3VjaCBhcyBpbmNyZW1lbnRhbCBUY2wuIFdvcmsgaXMgYWxzbyB1bmRlcndheSB0byBwb3J0IFNXSUcgdG8gbm9uLXVuaXgKLXBsYXRmb3Jtcy4KLQotPGgyPiBBY2tub3dsZWRnbWVudHMgPC9oMj4KLQotVGhpcyBwcm9qZWN0IHdvdWxkIG5vdCBoYXZlIGJlZW4gcG9zc2libGUgd2l0aG91dCB0aGUgc3VwcG9ydCBvZiBhIG51bWJlcgotb2YgcGVvcGxlLiAgIFBldGVyIExvbWRhaGwsIFNodWppYSBaaG91LCBCcmFkIEhvbGlhbiwgVGltIEdlcm1hbm4sIGFuZCBOaWVscwotSmVuc2VuIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSB3ZXJlIHRoZSBmaXJzdCB1c2VycyBhbmQgd2VyZQotaW5zdHJ1bWVudGFsIGluIHRlc3Rpbmcgb3V0IHRoZSBmaXJzdCBkZXNpZ25zLiAgIFBhdHJpY2sgVHVsbG1hbm4gYXQKLXRoZSBVbml2ZXJzaXR5IG9mIFV0YWggc3VnZ2VzdGVkIHRoZSBpZGVhIG9mIGF1dG9tYXRpYyBkb2N1bWVudGF0aW9uCi1nZW5lcmF0aW9uLiAgSm9obiBTY2htaWR0LCBLdXJ0aXMKLUJsZWVrZXIsIFBldGVyLVBpa2UgU2xvYW4sIGFuZCBTdGV2ZSBQYXJrZXIgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCB0ZXN0ZWQgb3V0IHNvbWUgb2YgdGhlIG5ld2VyIHZlcnNpb25zIGFuZAotcHJvdmlkZWQgdmFsdWFibGUgZmVlZGJhY2suICAgSm9obiBCdWNrbWFuIHN1Z2dlc3RlZCBtYW55IGludGVyZXN0aW5nCi1pbXByb3ZlbWVudHMgYW5kIGhhcyBiZWVuIGluc3RydW1lbnRhbCB0aGUgcmVjZW50IGRldmVsb3BtZW50IG9mIFNXSUcuCi1GaW5hbGx5Ci1JJ2QgbGlrZSB0byB0aGFuayBDaHJpcyBKb2huc29uIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgU2NpZW50aWZpYwotQ29tcHV0aW5nIGFuZCBJbWFnaW5nIGdyb3VwIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggZm9yIHRoZWlyIGNvbnRpbnVlZAotc3VwcG9ydCBhbmQgZm9yIHB1dHRpbmcgdXAgd2l0aCBteSB3cmFwcGluZyBldmVyeSBzb2Z0d2FyZSBwYWNrYWdlCi1JIGNvdWxkIGdldCBteSBoYW5kcyBvbi4gICAgU1dJRyB3YXMgZGV2ZWxvcGVkIGluIHBhcnQgdW5kZXIgdGhlCi1hdXNwaWNlcyBvZiB0aGUgVVMgRGVwYXJ0bWVudCBvZiBFbmVyZ3ksIHRoZSBOYXRpb25hbCBTY2llbmNlIEZvdW5kYXRpb24sIAotYW5kIE5hdGlvbmFsIEluc3RpdHV0ZXMgb2YgSGVhbHRoLgotCi08aDI+IEF2YWlsYWJpbGl0eSA8L2gyPgotCi1TV0lHIGlzIGZyZWUgc29mdHdhcmUgYW5kIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIEZUUCBhdCAgPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08dHQ+IGZ0cC5jcy51dGFoLmVkdS9wdWIvYmVhemxleS9TV0lHIDwvdHQ+IDxicj4gPGJyPgotPC9jZW50ZXI+Ci0KLU1vcmUgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgb24gdGhlIFNXSUcgaG9tZXBhZ2UgYXQgIDxicj4gPGJyPgotCi08Y2VudGVyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5jcy51dGFoLmVkdS9+YmVhemxleS9TV0lHIj4gPHR0PiBodHRwOi8vd3d3LmNzLnV0YWguZWR1L35iZWF6bGV5L1NXSUcgPC90dD4gPC9hPgotPC9jZW50ZXI+IDxicj4gPGJyPgotCi08aDI+IFJlZmVyZW5jZXMgPC9oMj4KLQotW0JlYXpsZXldIEQuTS4gQmVhemxleSBhbmQgUC5TLiBMb21kYWhsLCAKLTxlbT4gTWVzc2FnZS1QYXNzaW5nIE11bHRpLUNlbGwgTW9sZWN1bGFyIER5bmFtaWNzIG9uIHRoZSBDb25uZWN0aW9uCi1NYWNoaW5lIDUgPC9lbT4sIFBhcmFsbGVsIENvbXB1dGluZyAyMCAoMTk5NCkgcC4gMTczLTE5NS4gPGJyPiA8YnI+Ci0KLVtFVF0gRW1iZWRkZWQgVGssIDxicj4KLTx0dD4gZnRwOi8vZnRwLnZuZXQubmV0L3B1Yi91c2Vycy9kcmgvRVQuaHRtbCA8L3R0PiA8YnI+IDxicj4KLQotW0V4cGVjdF0gRG9uIExpYmVzLCA8ZW0+IEV4cGxvcmluZyBFeHBlY3QgPC9lbT4sIE8nUmVpbGx5ICZhbXA7IEFzc29jaWF0ZXMsIEluYy4gKDE5OTUpLiA8YnI+IDxicj4KLQotW0hlaWRyaWNoXSBXb2xmZ2FuZyBIZWlkcmljaCBhbmQgUGhpbGlwcCBTbHVzYWxsZWssIDxlbT4KLUF1dG9tYXRpYyBHZW5lcmF0aW9uIG9mIFRjbCBCaW5kaW5ncyBmb3IgQyBhbmQgQysrIExpYnJhcmllcy48L2VtPiwKLVVTRU5JWCAzcmQgQW5udWFsIFRjbC9UayBXb3Jrc2hvcCAoMTk5NSkuIDxicj4gPGJyPgotCi1bSmFuc3Nlbl0gQmlsbCBKYW5zc2VuLCBNaWtlIFNwcmVpdHplciwgPGVtPiBJTFUgOiBJbnRlci1MYW5ndWFnZSBVbmlmaWNhdGlvbiB2aWEgT2JqZWN0IE1vZHVsZXMgPC9lbT4sIE9PUFNMQSA5NCBXb3Jrc2hvcCBvbiBNdWx0aS1MYW5ndWFnZQotT2JqZWN0IE1vZGVscy4gPGJyPiA8YnI+Ci0KLVtMb21kYWhsXSBQLlMuIExvbWRhaGwsIFAuIFRhbWF5bywgCi1OLkdyb25iZWNoLUplbnNlbiwgYW5kIEQuTS4gQmVhemxleSwgCi08ZW0+IFByb2MuIG9mIFN1cGVyY29tcHV0aW5nIDkzIDwvZW0+LCBJRUVFIENvbXB1dGVyIFNvY2lldHkgKDE5OTMpLCBwLiA1MjAtNTI3LgotPGJyPiA8YnI+Ci0KLVtMb3JkXSBUaG9tYXMgTG9yZCwgPGVtPiBBbiBBbmF0b215IG9mIEd1aWxlLCBUaGUgSW50ZXJmYWNlIHRvIAotVGNsL1RrIDwvZW0+LCBQcm9jZWVkaW5ncyBvZiB0aGUgVVNFTklYIDNyZCBBbm51YWwgVGNsL1RrIFdvcmtzaG9wICgxOTk1KS4gPGJyPiA8YnI+Ci0KLVtNQVRMQUJdIDxlbT4gTUFUTEFCIEV4dGVybmFsIEludGVyZmFjZSBHdWlkZSA8L2VtPiwgVGhlIE1hdGggV29ya3MsIEluYy4gICgxOTkzKS4KLTxicj4gPGJyPgotCi1bT3VzdGVyaG91dF0gSm9obiBLLiBPdXN0ZXJob3V0LCA8ZW0+IFRjbCBhbmQgdGhlIFRrIFRvb2xraXQgPC9lbT4sIEFkZGlzb24tV2VzbGV5IFB1Ymxpc2hlcnMgKDE5OTQpLiA8YnI+IDxicj4KLQotW1Blcmw1XSBQZXJsNSBQcm9ncmFtbWVycyByZWZlcmVuY2UsIDxicj4KLTx0dD4gaHR0cDovL3d3dy5tZXRyb25ldC5jb20vcGVybGluZm8vZG9jIDwvdHQ+LCAoMTk5NikuIDxicj4gPGJyPgotCi1bdnRrXSBXLiBTY2hyb2VkZXIsIEsuIE1hcnRpbiwgYW5kIEIuIExvcmVuc2VuLCA8ZW0+IFRoZQotVmlzdWFsaXphdGlvbiBUb29sa2l0IDwvZW0+LCBQcmVudGljZSBIYWxsICAoMTk5NSkuIDxicj4gPGJyPgotCi1bSW52ZW50XSBKLiBXZXJuZWNrZSw8ZW0+IFRoZSBJbnZlbnRvciBNZW50b3IgPC9lbT4sIEFkZGlzb24tV2VzbGV5IFB1Ymxpc2hpbmcgKDE5OTQpLiA8YnI+IDxicj4KLQotW1dldGhlcmFsbF0gRC4gV2V0aGVyYWxsLCBDLiBKLiBMaW5kYmxhZCwgPGVtPiBFeHRlbmRpbmcgVGNsIGZvcgotRHluYW1pYyBPYmplY3QtT3JpZW50ZWQgUHJvZ3JhbW1pbmcgPC9lbT4sIFByb2NlZWRpbmdzIG9mIHRoZSBVU0VOSVggM3JkIEFubnVhbCBUY2wvVGsgV29ya3Nob3AgKDE5OTUpLiA8YnI+IDxicj4KLQotW09wZW5HTF0gSi4gTmVpZGVyLCBULiBEYXZpcywgTS4gV29vLCA8ZW0+IE9wZW5HTCBQcm9ncmFtbWluZyBHdWlkZSA8L2VtPiwgQWRkaXNvbi1XZXNsZXkgUHVibGlzaGluZyAoMTk5MykuIDxicj4gPGJyPgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTgvVGNsQ2hhcC5odG1sIGIvc3dpZ3dlYi9wYXBlcnMvVGNsOTgvVGNsQ2hhcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFlYTg1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk4L1RjbENoYXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OTggKzAsMCBAQAotPCEtLSBQdWJsaXNoZWQgYnkgUXVhZHJhbGF5IFdlYldvcmtzIEhUTUwgTGl0ZSAxLjUuMSAtLT4KLTwhLS0gQW5kIG11bmdlZCBieSBEYXZlJ3Mgc3BlY2lhbCBQeXRob24gc2NyaXB0IC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5UY2wgYW5kIFNXSUcgYXMgYSBDL0MrKyBEZXZlbG9wbWVudCBUb29sPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4gVGNsIGFuZCBTV0lHIGFzIGEgQy9DKysgRGV2ZWxvcG1lbnQgVG9vbDwvaDE+Ci0KLURhdmlkIE0uIEJlYXpsZXkgPGJyPgotRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlIDxicj4KLVVuaXZlcnNpdHkgb2YgQ2hpY2Fnbzxicj4KLUNoaWNhZ28sIElsbGlub2lzICAgNjA2MzcgPGJyPgotPGFkZHJlc3M+IDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudWNoaWNhZ28uZWR1L35iZWF6bGV5Ij5iZWF6bGV5QGNzLnVjaGljYWdvLmVkdTwvYT48L2FkZHJlc3M+IDxicj4KLTxwPgotCi1Db3B5cmlnaHQgKEMpIDE5OTggPGJyPgotQWxsIFJpZ2h0cyBSZXNlcnZlZCA8YnI+Ci0KLTxoMj4gQWJvdXQgVGhpcyBEb2N1bWVudCA8L2gyPgotCi1UaGlzIHBhcGVyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYXMgYSBjaGFwdGVyIGZvciBhIFRjbCBib29rIHByb2plY3QuCi1Ib3dldmVyLCB0aGF0IHByb2plY3QgcmFuIGludG8gc29tZSBkaWZmaWN1bHRpZXMgc28gdGhlIGNoYXB0ZXIgKGFuZAotdGhlIGJvb2sgaXRzZWxmKSBuZXZlciBhcHBlYXJlZC4gIFNpbmNlIHRoZSBjaGFwdGVyIG1heSBiZSBvZiB1c2UgdG8KLVNXSUcgYW5kIFRjbCB1c2VycywgaXQgaGFzIGJlZW4gc2xpZ2h0bHkgcmV2YW1wZWQgYW5kIHJlcHVibGlzaGVkIGluCi1lbGVjdHJvbmljIGZvcm0gaGVyZS4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGlzCi1kb2N1bWVudCBpbiBlbGVjdHJvbmljIGZvcm0gd2l0aG91dCByb3lhbHRpZXMgb3IgZmVlcyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotY29weXJpZ2h0IGFuZCB0aGlzIG5vdGljZSBhcHBlYXIgaW4gYWxsIHJlcHJvZHVjdGlvbnMuICAKLUhhcmQtY29weSAocGFwZXIpIHJlcHJvZHVjdGlvbnMgb2YgdGhpcyBhcnRpY2xlIGFyZSBzdHJpY3RseQotcHJvaGliaXRlZCB3aXRob3V0IHRoZSB3cml0dGVuIGNvbnNlbnQgb2YgdGhlIGF1dGhvci4KLQotPGEgbmFtZT0ibjEiPjwvYT48aDI+IEludHJvZHVjdGlvbjwvaDI+Ci1PbmUgb2YgdGhlIGdyZWF0ZXN0IHN0cmVuZ3RocyBvZiBUY2wgaXMgaXRzIGFiaWxpdHkgdG8gYmUgZWFzaWx5IGV4dGVuZGVkIHdpdGggY29kZSB3cml0dGVuIGluIEMgb3IgQysrLiAgTW9yZSBvZnRlbiB0aGFuIG5vdCwgY29tcGlsZWQgZXh0ZW5zaW9ucyB0byBUY2wgdGFrZSB0aGUgZm9ybSBvZiBUayB3aWRnZXRzIGFuZCBnZW5lcmFsIHB1cnBvc2UgbGlicmFyaWVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gZGF0YWJhc2VzLCBzb2NrZXRzLCBhbmQgb3RoZXIgc3lzdGVtIHNlcnZpY2VzLiAgIEFwcGxpY2F0aW9uIGRldmVsb3BlcnMgbWlnaHQgYWxzbyBleHRlbmQgVGNsIGluIG9yZGVyIHRvIGJ1aWxkIGEgdXNlci1pbnRlcmZhY2UgdG8gYSBsYXJnZSBwYWNrYWdlIHdyaXR0ZW4gaW4gYSBjb21waWxlZCBsYW5ndWFnZS4gIEhvd2V2ZXIsIG1hbnkgQy9DKysgZGV2ZWxvcGVycyBtaWdodCBiZSBzdXJwcmlzZWQgdG8gbGVhcm4gdGhhdCBUY2wgY2FuIGFsc28gYmUgdXNlZCBhcyBhIGdlbmVyYWwgcHVycG9zZSBDL0MrKyBkZXZlbG9wbWVudCB0b29sLS1ldmVuIGluIHNpdHVhdGlvbnMgd2hlcmUgVGNsIGlzIG5vdCBwYXJ0IG9mIHRoZSBmaW5hbCBwcm9kdWN0IG9yIGRlc2lnbi48cD4KLTxwPgotVG8gYW5zd2VyIHRoZSBxdWVzdGlvbiBvZiB3aHkgb25lIG1pZ2h0IHdhbnQgdG8gdXNlIFRjbCBmb3IgdGhpcyBwdXJwb3NlLCBjb25zaWRlciB0aGUgZmVhdHVyZXMgdGhhdCBUY2wgcHJvdmlkZXMuICBGaXJzdCwgVGNsIHByb3ZpZGVzIGFuIGludGVycHJldGVkIGVudmlyb25tZW50IHRoYXQgYWxsb3dzIHlvdSBpbnRlcmFjdGl2ZWx5IGNvbnRyb2wgYW5kIG1hbmlwdWxhdGUgdGhlIHVuZGVybHlpbmcgQyBwcm9ncmFtLiAgIEluIG90aGVyIHdvcmRzLCBhIFRjbCBpbnRlcmZhY2UgYWxsb3dzIHlvdSB0byBjYWxsIEMgZnVuY3Rpb25zLCBleGFtaW5lIHZhcmlhYmxlcywgYW5kIHBlcmZvcm0gdGFza3MgdGhhdCBtaWdodCBvdGhlcndpc2UgYmUgZm91bmQgaW4gYSBkZWJ1Z2dlci4gICBTZWNvbmQsIFRjbCBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSBwcm9ncmFtcywgcmFwaWRseSBwcm90b3R5cGUgbmV3IGZlYXR1cmVzLCBkZXZlbG9wIHRlc3Rpbmcgc2NyaXB0cywgYW5kIGludGVyYWN0IHdpdGggQyBjb2RlIGluIGEgaGlnaGx5IGZsZXhpYmxlIG1hbm5lci4gICAgQW5kIGZpbmFsbHksIG9uZSBzaG91bGRuJ3QgZm9yZ2V0IHRoYXQgVGNsIGFsbG93cyB5b3UgdG8gdXRpbGl6ZSBvdGhlciBleHRlbnNpb25zIGFuZCBtb2R1bGVzIHBlb3BsZSBoYXZlIGRldmVsb3BlZCAoZm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBsYXRlciB3cml0ZSBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBpbiBUaywgYWNjZXNzIGRhdGFiYXNlIHN5c3RlbXMgd2l0aCBPcmFUY2wsIGFuZCBzbyBmb3J0aCkuICBJbiBzaG9ydCwgVGNsIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGF0dHJhY3RpdmUgZmVhdHVyZXMgdGhhdCBzaW1wbHkgYXJlbid0IGZvdW5kIGluIGEgdHlwaWNhbCBDL0MrKyBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gICA8cD4KLTxwPgotSW4gdGhpcyBjaGFwdGVyLCBJIGRlc2NyaWJlIFNXSUcgKFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciksIGEgZGV2ZWxvcG1lbnQgdG9vbCB0aGF0IGludGVncmF0ZXMgQy9DKysgY29kZSB3aXRoIFRjbCBhbmQgb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcy4gICBTV0lHIGlzIGEgY29tcGlsZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIFRjbCBleHRlbnNpb25zIHRvIGV4aXN0aW5nIEMgY29kZS4gICBJdCByZXF1aXJlcyBubyBtb2RpZmljYXRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIGNvZGUgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byBtb3N0IEMgcHJvZ3JhbW1pbmcgZmVhdHVyZXMgaW5jbHVkaW5nIHBvaW50ZXJzLCBhcnJheXMsIHN0cnVjdHVyZXMsIGNsYXNzZXMsIGFuZCBzbyBmb3J0aC4gICAgVW5saWtlIHRyYWRpdGlvbmFsIFRjbCBleHRlbnNpb24gcHJvZ3JhbW1pbmcsIFNXSUcgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgZXh0ZW5zaW9ucyBhbmQgaGlkZXMgYWxtb3N0IGFsbCBvZiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiAgIEFzIGEgcmVzdWx0LCBTV0lHIG1ha2VzIGl0IGVhc3kgdG8gdXNlIFRjbCBpbiBhIHJhcGlkbHkgY2hhbmdpbmcgQy9DKysgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQtLWV2ZW4gaWYgdGhlIHVuZGVybHlpbmcgQy9DKysgY29kZSBkb2VzIG5vdCBpbnZvbHZlIFRjbC4gICA8cD4KLTxwPgotU1dJRyBpcyBmcmVlbHkgYXZhaWxhYmxlIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5zd2lnLm9yZyI+d3d3LnN3aWcub3JnPC9hPiBhbmQgc3VwcG9ydHMgVGNsIG9uIFVuaXgsIFdpbmRvd3MtTlQsIGFuZCBNYWNpbnRvc2ggcGxhdGZvcm1zLiAgU1dJRyBhbHNvIGdlbmVyYXRlcyBQZXJsIGFuZCBQeXRob24gZXh0ZW5zaW9ucyBhbmQgbWFueSBvZiB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkIGluIHRoaXMgY2hhcHRlciBhbHNvIGFwcGx5IHRvIHRob3NlIGxhbmd1YWdlcy4gICBGaW5hbGx5LCBTV0lHIGlzIHBhY2thZ2VkIHdpdGggbW9yZSB0aGFuIDMwMCBwYWdlcyBvZiB0dXRvcmlhbC1zdHlsZSBkb2N1bWVudGF0aW9uLiAgIEl0IGlzIG5vdCBteSBpbnRlbnQgdG8gcmVwZWF0IHRoYXQgZG9jdW1lbnRhdGlvbiBoZXJlIGFsdGhvdWdoIHRoZXJlIHdpbGwgYmUgc29tZSB1bmF2b2lkYWJsZSBvdmVybGFwLiAgIFJhdGhlciwgdGhlIGdvYWwgaXMgdG8gZGVzY3JpYmUgaG93IFNXSUcgd29ya3MsIHdoYXQgaXQgZG9lcywgYW5kIGhvdyBpdCBjYW4gYmUgdXNlZCBhcyBhIEMvQysrIGRldmVsb3BtZW50IHRvb2wuPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMz4gVGNsIEV4dGVuc2lvbiBCdWlsZGluZzwvaDM+Ci1UY2wgcHJvdmlkZXMgYW4gZXh0ZW5zaXZlIEMgQVBJIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGNvbXBpbGVkIGV4dGVuc2lvbnMgaW4gQyBvciBDKysuICAgIFRvIGludGVncmF0ZSBUY2wgYW5kIEMvQysrLCBpdCBpcyBuZWNlc3NhcnkgdG8gd3JpdGUgIndyYXBwZXIgZnVuY3Rpb25zIiB0aGF0IHByb3ZpZGUgdGhlIGdsdWUgYmV0d2VlbiAgQyBhbmQgdGhlIFRjbCBpbnRlcnByZXRlci4gICBUbyBpbGx1c3RyYXRlLCBzdXBwb3NlIHRoYXQgeW91IHdhbnRlZCB0byBhY2Nlc3MgdGhlIHBvdyh4LHkpIGZ1bmN0aW9uIGluIHRoZSBDIG1hdGggbGlicmFyeSBmcm9tIFRjbC4gICAgVG8gZG8gdGhpcywgeW91ICB3b3VsZCB3cml0ZSBhIHdyYXBwZXIgZnVuY3Rpb24gc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vKiBQb3dPYmpDbWQgCi0gKgotICogVGNsIDgueCB3cmFwcGVyIGZvciB0aGUgcG93KHgseSkgZnVuY3Rpb24uCi0gKi8KLQotI2luY2x1ZGUgJmx0O21hdGguaCZndDsKLWludCAKLVBvd09iakNtZChDbGllbnREYXRhIGNsaWVudERhdGEsIFRjbF9JbnRlcnAgKmludGVycCwKLSAgICAgICAgICBpbnQgb2JqYywgVGNsX09iaiAqQ09OU1Qgb2JqdltdKQotewotCQlUY2xfT2JqICAqcmVzdWx0cHRyOwotCQlkb3VibGUgICAgeCx5LHJlc3VsdDsKLQkJaW50ICAgICAgIGVycm9yOwotCi0JCWlmIChvYmpjICE9IDMpIHsKLQkJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLDIsb2JqdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2FnZSA6IHBvdyB4IHkiKTsKLQkJCXJldHVybiBUQ0xfRVJST1I7Ci0JCX0KLQkJZXJyb3IgPSBUY2xfR2V0RG91YmxlRnJvbU9iaihpbnRlcnAsIG9ianZbMV0sICZhbXA7eCk7Ci0JCWlmIChlcnJvciAhPSBUQ0xfT0spIHJldHVybiBlcnJvcjsKLQkJZXJyb3IgPSBUY2xfR2V0RG91YmxlRnJvbU9iaihpbnRlcnAsIG9ianZbMl0sICZhbXA7eSk7Ci0JCWlmIChlcnJvciAhPSBUQ0xfT0spIHJldHVybiBlcnJvcjsKLQotCQlyZXN1bHQgPSBwb3coeCx5KTsKLQkJcmVzdWx0cHRyID0gVGNsX0dldE9ialJlc3VsdChpbnRlcnApOwotCQlUY2xfU2V0RG91YmxlT2JqKHJlc3VsdHB0cixyZXN1bHQpOwotCQlyZXR1cm4gVENMX09LOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBtYWtlIHRoaXMgbmV3IGNvbW1hbmQgYXZhaWxhYmxlIHRvIFRjbCwgeW91IGFsc28gbmVlZCB0byB3cml0ZSBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzdWNoIGFzIGZvbGxvd3M6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50IAotRXhhbXBsZV9Jbml0KFRjbF9JbnRlcnAgKmludGVycCkgewotCQlUY2xfQ3JlYXRlT2JqQ29tbWFuZChpbnRlcnAsICJwb3ciLCBQb3dPYmpDbWQsCi0JCSAgICAgICAgKENsaWVudERhdGEpIE5VTEwsIChUY2xfQ21kRGVsZXRlUHJvYyAqKSBOVUxMKTsKLQkJcmV0dXJuIFRDTF9PSzsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRmluYWxseSwgdG8gYnVpbGQgdGhlIFRjbCBleHRlbnNpb24sIHRoZXNlIGZ1bmN0aW9ucyAoYW5kIHRoZSBvcmlnaW5hbCBDIGZ1bmN0aW9ucykgYXJlIGNvbXBpbGVkIGludG8gYW4gZXh0ZW5zaW9uIG1vZHVsZS4gICAgSW4gbmV3ZXIgdmVyc2lvbnMgb2YgVGNsLCB0aGlzIGlzIHVzdWFsbHkgZG9uZSBieSBjb21waWxpbmcgdGhlIGV4dGVuc2lvbiBtb2R1bGUgaW50byBhIHNoYXJlZCBsaWJyYXJ5IG9yIERMTCB0aGF0IGNhbiBiZSBkeW5hbWljYWxseSBsb2FkZWQgaW50byB0aGUgVGNsIGludGVycHJldGVyLiAgICBJbiB0aGlzIGNhc2UsIHVzaW5nIHRoZSBtb2R1bGUgZnJvbSBUY2wgbWlnaHQgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnRjbHNoCi0lIGxvYWQgLi9leGFtcGxlLnNvIEV4YW1wbGUKLSUgcG93IDIgMwotOC4wCi0lCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIGNhc2VzIHdoZXJlIGR5bmFtaWMgbG9hZGluZyBpcyBub3Qgc3VwcG9ydGVkLCBleHRlbnNpb24gbW9kdWxlcyBjYW4gYmUgY29tcGlsZWQgaW50byB0aGUgdGNsc2ggb3Igd2lzaCBleGVjdXRhYmxlIGRpcmVjdGx5IChhbHNvIGtub3duIGFzIHN0YXRpYyBsaW5raW5nKS4gICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB3cml0aW5nIGEgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiBmdW5jdGlvbiBhbmQgYSA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24uPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogbWFpbi5jICovCi0jaW5jbHVkZSAmbHQ7dGNsLmgmZ3Q7Ci1pbnQgVGNsX0FwcEluaXQoVGNsX0ludGVycCAqaW50ZXJwKTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotICAgIFRjbF9NYWluKGFyZ2MsIGFyZ3YsIFRjbF9BcHBJbml0KTsKLX0KLWludCBUY2xfQXBwSW5pdChUY2xfSW50ZXJwICppbnRlcnApIHsKLSAgICAgIC8qIEluaXRpYWxpemUgVGNsICovCi0gICAgICBpZiAoVGNsX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLSAgICAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgICAgIH0KLSAgICAgIC8qIEluaXRpYWxpemUgb3VyIGV4dGVuc2lvbiAqLwotICAgICAgaWYgKEV4YW1wbGVfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewotICAgICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgICAgfQotICAgICAgcmV0dXJuIFRDTF9PSzsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQWx0aG91Z2ggd3JpdGluZyBhIHNpbXBsZSBUY2wgZXh0ZW5zaW9uIG1heSBiZSBlYXN5IGVub3VnaCwgY29uc2lkZXIgdGhlIHByb2JsZW0gb2YgcHJvdmlkaW5nIGEgVGNsIGludGVyZmFjZSB0byBhIGxhcmdlIEMvQysrIGxpYnJhcnkgY29udGFpbmluZyBodW5kcmVkcyBvZiBmdW5jdGlvbnMsIGNsYXNzZXMsICBvYmplY3RzLCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHMuICAgSW4gdGhpcyBjYXNlLCBpdCB3b3VsZCBiZSBuZWNlc3NhcnkgdG8gd3JpdGUgaHVuZHJlZHMgb2YgY29tcGxpY2F0ZWQgd3JhcHBlciBmdW5jdGlvbnMtLS1hIHRpbWUgY29uc3VtaW5nIHRhc2sgdG8gYmUgY2VydGFpbi4gIE5vdCBvbmx5IHRoYXQsIHByb3ZpZGluZyBhIG1hcHBpbmcgYmV0d2VlbiBDIGFuZCBUY2wgaXMgZnVydGhlciBjb21wbGljYXRlZCBieSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzc3VlcyBhbmQgb2JqZWN0IG1hbmFnZW1lbnQgKGkuZS4gaG93IGRvIHlvdSBtYW5hZ2UgQy9DKysgb2JqZWN0cywgcG9pbnRlcnMsIGFycmF5cywgZXRjLi4uKS4gIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgY29uc2lkZXIgdGhlIHVzZSBvZiBUY2wgaW4gYSByYXBpZGx5IGNoYW5naW5nIEMvQysrIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGVudmlyb25tZW50IHdoZXJlIEFQSXMgYXJlIGV2b2x2aW5nLCBwYWNrYWdlcyBtaWdodCBvbmx5IGJlIHBhcnRpYWxseSBpbXBsZW1lbnRlZCwgYW5kIGRlc2lnbnMgYXJlIGJlaW5nIHJldmlzZWQuICAgTmVlZGxlc3MgdG8gc2F5LCBpdCBpcyBkaWZmaWN1bHQgdG8gd3JpdGUgYW5kIG1haW50YWluIFRjbCB3cmFwcGVycyBpbiB0aGlzIHNldHRpbmcuIEdpdmVuIHRoZSBjaG9pY2UsIG1vc3QgZGV2ZWxvcGVycyB3b3VsZCByYXRoZXIgY29uY2VudHJhdGUgb24gdGhlIGpvYiBhdCBoYW5kLS1ub3QgdGhlIHRhc2sgb2Ygd3JpdGluZyBUY2wgd3JhcHBlciBjb2RlLiAgIEFzIGEgcmVzdWx0LCB0aGUgdXNlIG9mIFRjbCBtaWdodCBiZSBpZ25vcmVkIGVudGlyZWx5IG9yIG9ubHkgY29uc2lkZXJlZCBtdWNoIGxhdGVyIGluIGEgcHJvamVjdCAoYWZ0ZXIgdGhlIGNvZGUgaGFzIHN0YWJpbGl6ZWQpLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDM+IEEgMzAgU2Vjb25kIEludHJvZHVjdGlvbiB0byBTV0lHPC9oMz4KLVNXSUcgaXMgYSBkZXZlbG9wbWVudCB0b29sIHRoYXQgYXV0b21hdGVzIHRoZSBUY2wgZXh0ZW5zaW9uIGJ1aWxkaW5nIHByb2Nlc3MuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGVhcmxpZXIgZXhhbXBsZSBvZiB0aGUgcG93KHgseSkgZnVuY3Rpb24uICAgV2l0aCBTV0lHLCB0aGUgVGNsIGV4dGVuc2lvbiBjYW4gYmUgZGVmaW5lZCBlbnRpcmVseSBieSB0aGUgZm9sbG93aW5nIGZpbGUgKGJ5IGNvbnZlbnRpb24gdGhlc2UgYXJlIGNhbGxlZCAiaW50ZXJmYWNlIGZpbGVzIiBhbmQgYXJlIHVzdWFsbHkgZ2l2ZW4gYSA8dHQ+Lmk8L3R0PiBzdWZmaXgpIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIGV4YW1wbGUuaSA6IEEgU2ltcGxlIFNXSUcgaW50ZXJmYWNlCi0lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW5jbHVkZSAmbHQ7bWF0aC5oJmd0OwotJX0KLQotLy8gQU5TSSBDL0MrKyBwcm90b3R5cGVzCi1kb3VibGUgcG93KGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgZmlsZSwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIFRjbCBtb2R1bGUgaXMgZGVmaW5lZCBlbnRpcmVseSB3aXRoIEFOU0kgQyBwcm90b3R5cGVzLiBJbnN0ZWFkIG9mIHdyaXRpbmcgd3JhcHBlciBjb2RlLCB5b3Ugb25seSBuZWVkIHRvIGxpc3QgdGhlIGZ1bmN0aW9ucyB0aGF0IHlvdSB3YW50IHRvIGFjY2Vzcy4gICBJbiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZmlsZSwgdGhlIDx0dD4lbW9kdWxlPC90dD4gZGlyZWN0aXZlIG5hbWVzIHRoZSBleHRlbnNpb24gbW9kdWxlLiBUaGUgPHR0PiV7LCAlfTwvdHQ+IHNlY3Rpb24gaXMgdXNlZCB0byBlbmNsb3NlIGNvZGUgdGhhdCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIG91dHB1dCB3cmFwcGVyIGNvZGUgKHVzdWFsbHkgdGhpcyBpcyB1c2VkIHRvIGdyYWIgdGhlIHJpZ2h0IGhlYWRlciBmaWxlcyBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIHN1cHBvcnQgY29kZSB3aGVuIG5lZWRlZCkuPHA+Ci08cD4KLVRvIGJ1aWxkIHRoZSBleHRlbnNpb24sIHlvdSBzaW1wbHkgcnVuIFNXSUcgb24gdGhpcyBmaWxlIHRvIGdlbmVyYXRlIHRoZSBUY2wgd3JhcHBlciBjb2RlIChpbiB0aGlzIGNhc2UgU1dJRyBjcmVhdGVzIGEgZmlsZSBjYWxsZWQgZXhhbXBsZV93cmFwLmMpLiAgIFRoaXMgZmlsZSBpcyB0aGVuIGNvbXBpbGVkIGludG8gYSBUY2wgZXh0ZW5zaW9uIG1vZHVsZSBleGFjdGx5IGFzIGJlZm9yZS4gRm9yIGV4YW1wbGUgKHNob3duIGZvciBMaW51eCkgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsgc3dpZyAtdGNsOCBleGFtcGxlLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFRjbCA4LngKLSZndDsgZ2NjIC1mcGljIC1jIGV4YW1wbGVfd3JhcC5jIAotJmd0OyBnY2MgLXNoYXJlZCBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvIC1sbSAKLSZndDsgdGNsc2gKLSUgbG9hZCAuL2V4YW1wbGUuc28gZXhhbXBsZQotJSBwb3cgMiAzCi04LjAKLSUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2l0aCBTV0lHLCB0aGUgZXh0ZW5zaW9uIG1vZHVsZSB3b3JrcyBleGFjdGx5IGFzIGV4cGVjdGVkLS1ob3dldmVyLCB5b3UgZGlkbid0IGhhdmUgdG8ga25vdyBhbnl0aGluZyBhYm91dCBUY2wgb3RoZXIgdGhhbiBrbm93aW5nIGhvdyB0byBjb21waWxlIGFuZCBsaW5rIHRoZSBmaW5hbCBleHRlbnNpb24gbW9kdWxlLiA8cD4KLTxwPgotVW5saWtlIG5vcm1hbCBUY2wgZXh0ZW5zaW9uIGJ1aWxkaW5nLCBTV0lHIGV4dGVuc2lvbnMgY2FuIGJlIHZlcnkgZWFzeSB0byBnZW5lcmF0ZS4gIEluIHRoZSBleGFtcGxlLCB5b3UgY291bGQgZWFzaWx5IG1ha2UgYW4gaW50ZXJmYWNlIHRvIHRoZSBlbnRpcmUgJmx0O21hdGguaCZndDsgbGlicmFyeSBieSBzaW1wbHkgY29weWluZyBhbGwgb2YgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgb3V0IG9mIHRoZSBoZWFkZXIgZmlsZSBhbmQgcGxhY2luZyB0aGVtIGluIHRoZSBpbnRlcmZhY2UuICAgSWYgeW91IGxhdGVyIHdhbnRlZCB0byBjaGFuZ2UgdGhlIFRjbCBpbnRlcmZhY2UsIHlvdSB3b3VsZCBzaW1wbHkgbWFrZSB0aGVzZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcmZhY2UgZmlsZS4gIFRoZSByZXN1bHRpbmcgVGNsIGludGVyZmFjZSB3b3VsZCB0aGVuIGJlIHVwZGF0ZWQgd2hlbiB0aGUgZXh0ZW5zaW9uIG1vZHVsZSB3YXMgcmVjb21waWxlZC48cD4KLTxwPgotQXQgdGhpcyBwb2ludCwgeW91IGtub3cgYWJvdXQgOTAlIG9mIHdoYXQgeW91IG5lZWQgdG8ga25vdyB0byBzdGFydCB1c2luZyBTV0lHIChhbmQgdGhlIHNpbXBsZSBleGFtcGxlIGdpdmVuIGhlcmUgY2FuIGV2ZW4gYmUgdXNlZCBhcyBhIHN0YXJ0aW5nIHBvaW50IGZvciB5b3VyIG93biBhcHBsaWNhdGlvbnMpLiAgIFRoZSBrZXkgdGhpbmcgdG8ga2VlcCBpbiBtaW5kIGlzIHRoYXQgU1dJRyBpcyBlbnRpcmVseSBhdXRvbWF0aWMgYW5kIGl0IHVzZXMgYW4gZXh0ZW5kZWQgc3Vic2V0IG9mIEFOU0kgQyBzeW50YXguIE1vZHVsZXMgY2FuIHVzdWFsbHkgYmUgY3JlYXRlZCBieSBzaW1wbHkgbWFzc2FnaW5nIGV4aXN0aW5nIGhlYWRlciBmaWxlcyBhbmQgb3RoZXIgc291cmNlcyBvZiBBTlNJIEMgcHJvdG90eXBlcy4gICAgSW4gZmFjdCwgbWFueSB1c2VycyBhcmUgc3VycHJpc2VkIHRvIGZpbmQgb3V0IGhvdyBlYXN5IGl0IGNhbiBiZSB0byBidWlsZCBUY2wgZXh0ZW5zaW9ucyBpbiB0aGlzIG1hbm5lciAoaW4gZmFjdCwgIG9uZSBlYXJseSBTV0lHIHVzZXIgd2FzIGFibGUgdG8gd3JhcCB0aGUgZW50aXJlIE9wZW5HTCBsaWJyYXJ5IGludG8gYSBUY2wgbW9kdWxlIHdpdGggbGVzcyB0aGFuIHRlbiBtaW51dGVzIG9mIGVmZm9ydCEpLjxwPgotPGEgbmFtZT0ibjIiPjwvYT48aDI+IEEgVG91ciBvZiBTV0lHPC9oMj4KLUluIHRoaXMgc2VjdGlvbiwgSSBwcm92aWRlIGEgaGlnaC1sZXZlbCB0b3VyIG9mIFNXSUcuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGEgcXVpY2sgb3ZlcnZpZXcgYW5kIG5vdCBhIHJlcGxhY2VtZW50IGZvciB0aGUgU1dJRyB1c2VycyBtYW51YWwgKHdoaWNoIGNvbnRhaW5zIGFsbCBvZiB0aGUgZ29yeSBkZXRhaWxzKS4gIDxwPgotPGEgbmFtZT0ibjgiPjwvYT48aDM+IFRoZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIFNXSUc8L2gzPgotSW4gYSBudXRzaGVsbCwgU1dJRyBpcyBhIHNwZWNpYWwgcHVycG9zZSBDL0MrKyBjb21waWxlci4gICAgQXMgaW5wdXQsIFNXSUcgYWNjZXB0cyBBTlNJIEMvQysrIGRlZmluaXRpb25zIGFuZCB0cmFuc2xhdGVzIHRoZW0gaW50byB0aGUgQyB3cmFwcGVyIGNvZGUgbmVlZGVkIHRvIGFjY2VzcyB0aGF0IGZ1bmN0aW9uYWxpdHkgZnJvbSBhIHZhcmlldHkgb2Ygc2NyaXB0aW5nIGxhbmd1YWdlcy4gIFNXSUcgYWxzbyB1bmRlcnN0YW5kcyBhIG51bWJlciBvZiBkaXJlY3RpdmVzIHRoYXQgYXJlIHByZWNlZGVkIGJ5IGEgYCUnLiAgIFRoZXNlIGRpcmVjdGl2ZXMgYXVnbWVudCB0aGUgQU5TSSBDIGRlZmluaXRpb25zIGFuZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBTV0lHIHVzZXMgd2hlbiBnZW5lcmF0aW5nIHRoZSB3cmFwcGVyIGNvZGUuICAgICBGaW5hbGx5LCBpbiBhZGRpdGlvbiB0byBwcm9kdWNpbmcgd3JhcHBlciBjb2RlLCBTV0lHIGFsc28gZ2VuZXJhdGVzIGRvY3VtZW50YXRpb24gZmlsZXMgKGluIEFTQ0lJLCBIVE1MLCBvciBMYVRlWCkuICAgPHA+Ci08cD4KLQotU1dJRyBpcyBkZXNpZ25lZCB0byBiZSBleHRlbnNpYmxlIHdpdGggbmV3IGxhbmd1YWdlIG1vZHVsZXMgYW5kIGRvY3VtZW50YXRpb24gbWV0aG9kcy4gICBJbiBhZGRpdGlvbiB0byBwcm9kdWNpbmcgd3JhcHBlcnMgZm9yIFRjbCwgU1dJRyBjYW4gYmUgdXNlZCBmb3IgaW50ZXJmYWNpbmcgd2l0aCBhIHZhcmlldHkgb2Ygb3RoZXIgbGFuZ3VhZ2VzIGluY2x1ZGluZyBQZXJsLCBQeXRob24sIGFuZCBHdWlsZSAoaW4gZmFjdCwgdXNlcnMgaGF2ZSBldmVuIGRldmVsb3BlZCBtb2R1bGVzIGZvciBKYXZhIGFuZCBjb21tZXJjaWFsIHBhY2thZ2VzIHN1Y2ggYXMgTUFUTEFCKS48cD4KLTxwPgotU1dJRyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IGFzIGEgZGV2ZWxvcG1lbnQgdG9vbCBmb3IgaW50ZWdyYXRpbmcgcGh5c2ljcyBhcHBsaWNhdGlvbnMgd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgICBXaXRoIHRoaXMgaW4gbWluZCwgdGhlcmUgd2VyZSBhIG51bWJlciBvZiBkZXNpZ24gZ29hbHMgOjxwPgotPHA+Ci08dWw+Ci08bGk+Q29tcGxldGUgYXV0b21hdGlvbi4gIE1vZHVsZXMgc2hvdWxkIGJlIGNvbXBsZXRlbHkgZGVmaW5lZCBieSB0aGUgaW5wdXQgdG8gU1dJRyBhbmQgZnVsbHkgZnVuY3Rpb25hbC4gICBJbiBvdGhlciB3b3JkcywgYSB1c2VyIHNob3VsZCBuZXZlciBoYXZlIHRvIG1vZGlmeSBTV0lHJ3Mgb3V0cHV0LgotPGxpPlVzZSBBTlNJIEMvQysrIHN5bnRheC4gIFRoaXMgbWFrZXMgU1dJRyBlYXN5IHRvIGFwcGx5IHRvIGV4aXN0aW5nIHNvZnR3YXJlIHBhY2thZ2VzIGJlY2F1c2UgaW50ZXJmYWNlcyBjYW4gYmUgYnVpbHQgZnJvbSBoZWFkZXIgZmlsZXMuICBUaGUgb3RoZXIgYmVuZWZpdCBpcyB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGxlYXJuIGEgc3BlY2lhbCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSB0byB1c2UgU1dJRy0taWYgeW91IGtub3cgQywgdGhlbiB5b3UgYWxyZWFkeSBrbm93IG1vc3Qgb2YgU1dJRy4KLTxsaT5Ob24taW52YXNpdmUgaW50ZXJmYWNlIGJ1aWxkaW5nLiAgU1dJRyBhdHRlbXB0cyB0byBtYWtlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2VzIHdpdGhvdXQgcmVxdWlyaW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgQy9DKysgY29kZS4gICAKLTxsaT5MYW5ndWFnZSBpbmRlcGVuZGVuY2UuICAgVXNpbmcgYSBjb21tb24gaW50ZXJmYWNlIHNwZWNpZmljYXRpb24sIFNXSUcgY2FuIGdlbmVyYXRlIG1vZHVsZXMgZm9yIFBlcmwsIFB5dGhvbiwgR3VpbGUsIGFuZCBhIHZhcmlldHkgb3RoZXIgc3lzdGVtcy4gICBEaWZmZXJlbnQgbGFuZ3VhZ2VzIGFyZSBiZXR0ZXIgYXQgZGlmZmVyZW50IHRhc2tzIChhbmQgZXZlcnlvbmUgc2VlbXMgdG8gaGF2ZSBhIHBlcnNvbmFsIHByZWZlcmVuY2UpLiAgU1dJRyBhbGxvd3MgeW91IHRvIGtlZXAgeW91ciBvcHRpb25zIG9wZW4uCi08bGk+QWRhcHRhYmlsaXR5LiAgIEdpdmVuIHRoZSBodWdlIHZhcmlldHkgb2YgQy9DKysgY29kaW5nIHN0eWxlcyBhbmQgdGVjaG5pcXVlcywgU1dJRyBuZWVkcyB0byBiZSBhYmxlIHRvIGFkYXB0IGl0c2VsZiB0byBhbnkgbnVtYmVyIG9mIHNpdHVhdGlvbnMuICAgQXMgYSByZXN1bHQsIFNXSUcgcHJvdmlkZXMgYSB2YXJpZXR5IG9mIGN1c3RvbWl6YXRpb24gb3B0aW9ucyBhcyB3ZWxsIGFzIHRoZSBhYmlsaXR5IHRvIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290IGlmIG5lY2Vzc2FyeS4gICBMb29raW5nIGF0IGl0IGFub3RoZXIgd2F5LCBTV0lHIGlzIGRlc2lnbmVkIHRvIGJ1aWxkIHNjcmlwdGluZyBpbnRlcmZhY2VzLCBub3QgbGVnaXNsYXRlIG1vcmFsaXR5LgotPGxpPkV4dGVuc2liaWxpdHkuICAgIFRoZSBTV0lHIGNvbXBpbGVyIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIHdpdGggbmV3IGxhbmd1YWdlIG1vZHVsZXMgYW5kIGNhcGFiaWxpdGllcy4gIEluIGFkZGl0aW9uLCBTV0lHIGluY2x1ZGVzIGEgc3RhbmRhcmQgbGlicmFyeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGhlbHAgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiBpbnRlcmZhY2VzIGFuZCB0byBwcm92aWRlIG1vcmUgZnVuY3Rpb25hbGl0eS4KLTwvdWw+Ci08cD4KLVRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIGludGVyZmFjZSBkZXNjcmlwdGlvbiBhbmQgd3JhcHBlciBjb2RlIGlzIG9uZSBvZiBTV0lHJ3MgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMuICAgIEZpcnN0LCBpdCBhbGxvd3MgVGNsIHRvIGJlIHVzZWQgd2l0aCBvcmRpbmFyeSBDL0MrKyBjb2RlLS1pbiBmYWN0LCB0aGlzIGNvZGUgZG9lc24ndCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIFRjbCBpbnRlcmZhY2UuICAgIFNlY29uZCwgIHRoaXMgYWxsb3dzIGZvciByYXBpZCBjaGFuZ2UgYW5kIGRldmVsb3BtZW50LiAgIElmIHRoZSBDIGNvZGUgY2hhbmdlcyBpbiBzb21lIG1hbm5lciwgdGhlIFRjbCBpbnRlcmZhY2UgY2FuIGJlIGVhc2lseSByZWdlbmVyYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgaW1wbGVtZW50YXRpb24uICAgSXQgaXMgYWxzbyBlYXN5IHRvIGJ1aWxkIGEgc3RhbmQtYWxvbmUgQyBhcHBsaWNhdGlvbiwgc3dpdGNoIHNjcmlwdGluZyBsYW5ndWFnZXMsIG9yIGV2ZW4gdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBvZiBUY2wgKGZvciBleGFtcGxlLCBzd2l0Y2hpbmcgZnJvbSBUY2wgNy42IHRvIFRjbCA4LjApLiAgIEZpbmFsbHksIFNXSUcgc2hpZnRzIHRoZSBmb2N1cyBmcm9tIHRoZSBkZXZlbG9wbWVudCBvZiBUY2wgd3JhcHBlciBmdW5jdGlvbnMgdG8gdGhlICBwcm9ibGVtIGF0IGhhbmQuICBBcyBhIHJlc3VsdCwgaXQgYmVjb21lcyBwb3NzaWJsZSB0byB1c2UgVGNsIGluIHNpdHVhdGlvbnMgd2hlcmUgaXQgbWlnaHQgb3RoZXJ3aXNlIGhhdmUgbm90IGJlZW4gY29uc2lkZXJlZC48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgzPiBSdW5uaW5nIFNXSUc8L2gzPgotU1dJRyBpcyBpbnZva2VkIHVzaW5nIHRoZSA8dHQ+c3dpZzwvdHQ+IGNvbW1hbmQuICBTV0lHIG9wZXJhdGVzIGxpa2UgYSBDIGNvbXBpbGVyIGFuZCBhY2NlcHRzIGEgbnVtYmVyIG9mIG9wdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN3aWcgJmx0O29wdGlvbnMmZ3Q7IGZpbGVuYW1lCi0KLS10Y2wgICAgICAgICAgICAgICBHZW5lcmF0ZSBUY2wgNy54IHdyYXBwZXJzCi0tdGNsOCAgICAgICAgICAgICAgR2VuZXJhdGUgVGNsIDgueCB3cmFwcGVycwotLXBlcmw1ICAgICAgICAgICAgIEdlbmVyYXRlIFBlcmw1IHdyYXBwZXJzCi0tcHl0aG9uICAgICAgICAgICAgR2VuZXJhdGUgUHl0aG9uIHdyYXBwZXJzCi0tZGFzY2lpICAgICAgICAgICAgUHJvZHVjZSBBU0NJSSBkb2N1bWVudGF0aW9uCi0tZGh0bWwgICAgICAgICAgICAgUHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24KLS1kbGF0ZXggICAgICAgICAgICBQcm9kdWNlIExhVGVYIGRvY3VtZW50YXRpb24KLS1jKysgICAgICAgICAgICAgICBFbmFibGUgQysrIG1vZGUKLS1vYmpjICAgICAgICAgICAgICBFbmFibGUgT2JqZWN0aXZlLUMgbW9kZQotLUlkaXIgICAgICAgICAgICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgU1dJRyBzZWFyY2ggcGF0aAotLWxmaWxlICAgICAgICAgICAgIEluY2x1ZGUgYSBTV0lHIGxpYnJhcnkgZmlsZQotLW8gb3V0ZmlsZSAgICAgICAgIFNldCB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUKLS1tb2R1bGUgbmFtZSAgICAgICBTZXQgdGhlIG1vZHVsZSBuYW1lCi0tRHN5bWJvbCAgICAgICAgICAgRGVmaW5lIGEgc3ltYm9sCi0tdmVyc2lvbiAgICAgICAgICAgRGlzcGxheSBTV0lHJ3MgdmVyc2lvbiBudW1iZXIKLS1oZWxwICAgICAgICAgICAgICBEaXNwbGF5IGFsbCBvcHRpb25zCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgaXMgb25seSBhIHBhcnRpYWwgbGlzdCBvZiBvcHRpb25zLiAgIEEgZnVsbCBsaXN0aW5nIG9mIG9wdGlvbnMgY2FuIGJlIG9idGFpbmVkIGJ5IGludm9raW5nICJzd2lnIC1oZWxwIi48cD4KLTxwPgotV2hlbiBnaXZlbiBhbiBpbnB1dCBmaWxlIG9mIGA8dHQ+bXlmaWxlLmk8L3R0PicsIFNXSUcgd2lsbCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIG9mIGA8dHQ+bXlmaWxlX3dyYXAuYzwvdHQ+JyBhcyB3ZWxsIGFzIGEgZG9jdW1lbnRhdGlvbiBmaWxlLiAgSWYgbmVjZXNzYXJ5LCB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIDx0dD4tbzwvdHQ+IG9wdGlvbiAodGhpcyBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHdoZW4gd29ya2luZyB3aXRoIEMrKyBjb21waWxlcnMgdGhhdCBleHBlY3QgdG8gc2VlIGEgQysrIHN1ZmZpeCBvbiBzb3VyY2UgZmlsZXMpLjxwPgotPHA+Ci1BbHRob3VnaCBTV0lHIGNhbiBiZSBpbnZva2VkIGRpcmVjdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUsIG1vc3QgdXNlcnMgZmluZCBpdCBlYXNpZXIgdG8gaW52b2tlIFNXSUcgd2l0aGluIGEgTWFrZWZpbGUuICBBIHR5cGljYWwgVGNsIE1ha2VmaWxlIG1pZ2h0IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFNhbXBsZSBNYWtlZmlsZSBmb3IgYSBUY2wgZXh0ZW5zaW9uCi1TUkNTICAgICAgICAgID0gZXhhbXBsZS5jICAgICAgICAgIyBTb3VyY2UgZmlsZXMKLU9CSlMgICAgICAgICAgPSAgICAgICAgICAgICAgICAgICAjIE9iamVjdCBmaWxlcyAoYWxyZWFkeSBjcmVhdGVkKQotSU5URVJGQUNFICAgICA9IGV4YW1wbGUuaSAgICAgICAgICMgU1dJRyBJbnRlcmZhY2UgZmlsZQotV1JBUEZJTEUgICAgICA9ICQoSU5URVJGQUNFOi5pPV93cmFwLmMpCi1XUkFQT0JKICAgICAgID0gJChJTlRFUkZBQ0U6Lmk9X3dyYXAubykKLVRBUkdFVCAgICAgICAgPSBleGFtcGxlLnNvICAgICAgICAjIE91dHB1dCBmaWxlCi0KLQotIyBDb21waWxlciBvcHRpb25zCi1DQyAgICAgICAgICAgID0gZ2NjCi1DRkxBR1MgICAgICAgID0KLUlOQ0xVREUgICAgICAgPQotCi0jIFNXSUcgT3B0aW9ucwotU1dJRyAgICAgICAgICA9IC91c3IvbG9jYWwvYmluL3N3aWcKLVNXSUdPUFQgICAgICAgPSAtdGNsICMgdXNlIC10Y2w4IGZvciBUY2wgOC4wCi1TV0lHQ0MgICAgICAgID0gJChDQykKLQotIyBSdWxlcyBmb3IgY3JlYXRpbmcgLm8gZmlsZXMgZnJvbSBzb3VyY2UuCi1DT0JKUyAgICAgICAgID0gJChTUkNTOi5jPS5vKQotQUxMT0JKUyAgICAgICA9ICQoQ09CSlMpICQoT0JKUykKLQotIyBTaGFyZWQgbGlicmFyeSBvcHRpb25zIChTaG93biBmb3IgTGludXgpCi1DQ1NIQVJFRCAgICAgID0gLWZwaWMKLUJVSUxEICAgICAgICAgPSAkKENDKSAtc2hhcmVkCi0KLSMgVGNsIGluc3RhbGxhdGlvbiAod2hlcmUgaXMgVGNsL1RrIGxvY2F0ZWQpCi1UQ0xfSU5DTFVERSAgID0gLUkvdXNyL2xvY2FsL2luY2x1ZGUKLVRDTF9MSUIgICAgICAgPSAtTC91c3IvbG9jYWwvbGliCi0KLSMgQWRkaXRpb25hbCBsaW5rIGxpYnJhcmllcwotTElCUyAgICAgICAgICA9IAotCi0uU1VGRklYRVM6IC5jCi0KLS5jLm86Ci0gICAgICAgICQoQ0MpICQoQ0NTSEFSRUQpICQoQ0ZMQUdTKSAkKElOQ0xVREUpIC1jICQmbHQ7Ci0KLWFsbDogJChUQVJHRVQpCi0KLSMgQ29udmVydCB0aGUgU1dJRyB3cmFwcGVyIGZpbGUgaW50byBhbiBvYmplY3QgZmlsZQotJChXUkFQT0JKKSA6ICQoV1JBUEZJTEUpCi0gICAgICAgICQoU1dJR0NDKSAtYyAkKENDU0hBUkVEKSAkKENGTEFHUykgJChXUkFQRklMRSkgJChJTkNMVURFKSBcIAotICAgICAgICAgICAgICQoVENMX0lOQ0xVREUpCi0KLSMgUnVuIFNXSUcKLSQoV1JBUEZJTEUpIDogJChJTlRFUkZBQ0UpCi0gICAgICAgICQoU1dJRykgJChTV0lHT1BUKSAtbyAkKFdSQVBGSUxFKSAkKElOVEVSRkFDRSkKLQotIyBCdWlsZCB0aGUgZmluYWwgZXh0ZW5zaW9uIG1vZHVsZQotJChUQVJHRVQpOiAkKFdSQVBPQkopICQoQUxMT0JKUykKLSAgICAgICAgJChCVUlMRCkgJChXUkFQT0JKKSAkKEFMTE9CSlMpICQoTElCUykgLW8gJChUQVJHRVQpCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2luZG93cy1OVCB1c2VycyBjYW4gaW52b2tlIFNXSUcgZGlyZWN0bHkgZnJvbSB0aGUgTVMtRE9TIGNvbW1hbmQgc2hlbGwsIGZyb20gTWFrZWZpbGVzLCBvciBhcyBhIHNwZWNpYWwgcHJvY2Vzc2luZyBvcHRpb24gaW4gd2hhdGV2ZXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCB0aGV5IGFyZSB1c2luZy4gICBGb3IgZXhhbXBsZSwgaW4gVmlzdWFsIEMrKywgeW91IGNhbiBpbnZva2UgU1dJRyBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgeW91IHdvdWxkIGludm9rZSBvdGhlciBjb2RlIGdlbmVyYXRpb24gdG9vbHMgc3VjaCBhcyBMZXggYW5kIFlhY2MuICAgQ29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgeW91ciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgbW9yZSBkZXRhaWxzLjxwPgotPGEgbmFtZT0ibjEwIj48L2E+PGgzPiBUaGUgSW5wdXQgdG8gU1dJRzwvaDM+Ci1Nb3N0IGludGVyZmFjZSBmaWxlcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0IDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLSV7Ci0vKiBJbmNsdWRlIGhlYWRlciBmaWxlcyBoZXJlICovCi0jaW5jbHVkZSAibXloZWFkZXIuaCIKLSV9Ci0vLyBOb3cgbGlzdCBBTlNJIEMgZGVjbGFyYXRpb25zCi1leHRlcm4gZG91YmxlIGZvbyhkb3VibGUpOwotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNXSUcgYWxzbyBpbmNsdWRlcyBhIHByZXByb2Nlc3NvciB0aGF0IGNhbiBiZSB1c2VkIGZvciBjb25kaXRpb25hbCBjb21waWxhdGlvbiBhbmQgbWFjcm8gZXhwYW5zaW9uLiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBtaXhlZCBpbnRlcmZhY2UvaGVhZGVyIGZpbGVzIHRoYXQgYXJlIGFjY2VwdGFibGUgdG8gYm90aCBTV0lHIGFuZCB0aGUgQyBjb21waWxlci4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vKiBleGFtcGxlLmggOiBBIE1peGVkIFNXSUcvQyBmaWxlICovCi0KLSNpZmRlZiBTV0lHCi0lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW5jbHVkZSAiZXhhbXBsZS5oIgotJX0KLSNlbmRpZgotCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgX0FOU0lfQVJHUyhhKSAgICBhCi0jZWxzZQotI2RlZmluZSBfQU5TSV9BUkdTKGEpICAgICgpCi0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBFWFRFUk4gICBleHRlcm4gIkMiCi0jZWxzZQotI2RlZmluZSBFWFRFUk4gICBleHRlcm4KLSNlbmRpZgotCi0vKiBOb3cgZGVjbGFyZSBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1FWFRFUk4gZG91YmxlIGZvbyBfQU5TSV9BUkdTKChkb3VibGUpKTsKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiBzeXN0ZW1zIHRoYXQgY2hhbmdlIGFsb3QsIHRoaXMgYXBwcm9hY2ggbWFrZXMgaXQgZWFzaWVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IGJldHdlZW4gaGVhZGVyIGZpbGVzIGFuZCBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKGV2ZW4gaWYgaGVhZGVyIGZpbGVzIHBsYXkgcHJlcHJvY2Vzc29yIHRyaWNrcyB0byBhZGRyZXNzIHN5c3RlbSBhbmQgY29tcGlsZXIgZGVwZW5kZW5jaWVzKS48cD4KLTxwPgotRm9yIHRoZSBtb3N0IHBhcnQsIGFueXRoaW5nIHRoYXQgY2FuIGJlIGdpdmVuIHRvIGEgQyBjb21waWxlciBjYW4gYWxzbyBiZSBnaXZlbiB0byBTV0lHLiAgIEhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoYXQgU1dJRyBpcyBub3QgYSBmdWxsIEMvQysrIGNvbXBpbGVyLiAgSW4gc29tZSBjYXNlcywgaXQgbWF5IGdldCBjb25mdXNlZCBieSBleHRyZW1lbHkgY29tcGxpY2F0ZWQgZGVjbGFyYXRpb25zLiAgIE90aGVyIGZlYXR1cmVzIHNpbXBseSBhcmVuJ3Qgc3VwcG9ydGVkLS1mb3IgZXhhbXBsZSwgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cywgb3BlcmF0b3Igb3ZlcmxvYWRpbmcsIHRlbXBsYXRlcywgZXRjLi4uICBXaGVuIGluIGRvdWJ0LCB0aGUgYmVzdCB0aGluZyB0byBkbyBpcyB0cnkgaXQgYW5kIHNlZS4gIElmIFNXSUcgY29tcGxhaW5zLCB5b3UgY2FuIGVpdGhlciByZW1vdmUgdGhlIG9mZmVuZGluZyBkZWNsYXJhdGlvbiwgY29tbWVudCBpdCBvdXQsIG9yIHVzZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBoaWRlIGl0LiAgICBIb3dldmVyLCB0aGUgU1dJRyBjb21waWxlciBpcyBhbHdheXMgaW1wcm92aW5nIHNvIGN1cnJlbnQgbGltaXRhdGlvbnMgbWF5IGJlIGVsaW1pbmF0ZWQgaW4gdGhlIGZ1dHVyZS48cD4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMz4gVGhlIEJhc2ljIFRjbCBJbnRlcmZhY2U8L2gzPgotU1dJRyBhdHRlbXB0cyB0byBwcm92aWRlIGEgZGlyZWN0IG1hcHBpbmcgYmV0d2VlbiBDIGFuZCBUY2wuICAgQyBmdW5jdGlvbnMgYXJlIHR1cm5lZCBpbnRvIG5ldyBUY2wgY29tbWFuZHMuICBHbG9iYWwgdmFyaWFibGVzIGFyZSB0dXJuZWQgaW50byBUY2wgdmFyaWFibGVzIHVzaW5nIHRoZSB2YXJpYWJsZSBsaW5raW5nIG1lY2hhbmlzbSBpZiBwb3NzaWJsZS4gICBDb25zdGFudHMgYXJlIHNpbXBseSB0dXJuZWQgaW50byByZWFkLW9ubHkgVGNsIHZhcmlhYmxlcy4gICAgVGh1cywgaWYgeW91IGdpdmUgU1dJRyB0aGUgZm9sbG93aW5nIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlCi1leGFtcGxlCi0KLWludCBmYWN0b3JpYWwoaW50IG4pOwotZXh0ZXJuIGRvdWJsZSBNeV92YXJpYWJsZTsKLSNkZWZpbmUgUEkgMy4xNDE1OTI2Ci1jb25zdCBpbnQgU1BBTSA9IDQyOwotLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgYWNjZXNzaWJsZSBpbiBUY2wgYXMgZm9sbG93czxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgcHV0cyBbZmFjdG9yaWFsIDRdICAgICAgICAgICA7IyBDYWxsIGEgQyBmdW5jdGlvbgotMjQKLSUgc2V0IE15X3ZhcmlhYmxlIDMuNCAgICAgICAgICA7IyBDaGFuZ2UgYSBDIGdsb2JhbCB2YXJpYWJsZQotJSBwdXRzICRNeV92YXJpYWJsZSAgICAgICAgICAgIDsjIFJlYWQgYSBDIGdsb2JhbCB2YXJpYWJsZQotMy40Ci0lIHB1dHMgJFBJICAgICAgICAgICAgICAgICAgICAgOyMgT3V0cHV0IHRoZSB2YWx1ZSBvZiBhIEMgY29uc3RhbnQKLTMuMTQxNTkyNgotJSBwdXRzICRTUEFNCi00MgotJQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Gb3IgQyBnbG9iYWwgdmFyaWFibGVzLCB0aGUgVGNsIGludGVycHJldGVyIG9ubHkgc3VwcG9ydHMgYSBzbWFsbCBzdWJzZXQgb2YgQyBkYXRhdHlwZXMgKGludCwgZG91YmxlLCBhbmQgY2hhciAqKS4gICAgV2hlbiBvdGhlciBkYXRhdHlwZXMgYXJlIHVzZWQgc3VjaCBhcyB0aGUgZm9sbG93aW5nLDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnNob3J0IE15X3Nob3J0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TV0lHIGNyZWF0ZXMgYSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5wdXRzIFtNeV9zaG9ydF9nZXRdICAgICAgICAgIDsjIEdldCB2YWx1ZSBvZiBhIGdsb2JhbCB2YXJpYWJsZQotTXlfc2hvcnRfc2V0IDUuNSAgICAgICAgICAgICA7IyBTZXQgdmFsdWUgb2YgYSBnbG9iYWwgdmFyaWFibGUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjEyIj48L2E+PGgzPiBQb2ludGVyczwvaDM+Ci1TV0lHIHN1cHBvcnRzIEMvQysrIHBvaW50ZXJzIGJ5IG1hcHBpbmcgdGhlbSBpbnRvIGNoYXJhY3RlciBzdHJpbmdzIHRoYXQgZW5jb2RlIHRoZSB2YWx1ZSBhbmQgdHlwZS4gICBGb3IgZXhhbXBsZSwgYSBwb2ludGVyIG9mIHR5cGUgIjx0dD5WZWN0b3IgKjwvdHQ+IiB3b3VsZCBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBpbiBUY2wgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8xMDBmOGUyX1ZlY3Rvcl9wCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVBvaW50ZXJzIG1heSBhcHBlYXIgdGhyb3VnaG91dCBhIFNXSUcgaW50ZXJmYWNlIGZpbGUuICBGdXJ0aGVybW9yZSwgdHlwZSBkZWZpbml0aW9ucyBhcmUgbm90IGdlbmVyYWxseSByZXF1aXJlZC4gIEZvciBleGFtcGxlIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlIHZlY3RvcgotJXsKLSNpbmNsdWRlICJ2ZWN0b3IuaCIKLSV9Ci0KLVZlY3RvciAqbmV3X3ZlY3Rvcihkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KTsKLWRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYik7Ci0uLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gVGNsLCBwb2ludGVycyBhcmUgb3BhcXVlIG9iamVjdHMgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBiZXR3ZWVuIGRpZmZlcmVudCBDIGZ1bmN0aW9ucyBhbmQgb3BlcmF0ZSBsaWtlIHlvdSB3b3VsZCBleHBlY3QuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXQgdjEgW25ld19WZWN0b3IgMiAzIDRdICAgICAgICAjIENyZWF0ZSB0d28gdmVjdG9ycwotJSBzZXQgdjIgW25ld19WZWN0b3IgNSA2IDddCi0lIHB1dHMgJHYxIAotXzEwMGY4ZTJfVmVjdG9yX3AKLSUgZG90X3Byb2R1Y3QgJHYxICR2MgotNTYKLSUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRm9yIHRoZSBtb3N0IHBhcnQsIHBvaW50ZXJzIGluIFRjbCB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyB0aGV5IGRvIGluIEMuICBIb3dldmVyLCAgdGhlIHByaW1hcnkgZGlmZmVyZW5jZSBpcyB0aGF0IHBvaW50ZXJzIGNhbid0IGJlIGRlcmVmZXJlbmNlZCBpbiBUY2wuICAgSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4ndCBwZWVyIGluc2lkZSBvYmplY3RzIGFuZCBtYW5pcHVsYXRlIHRoZW0gKHdlbGwsIGF0IGxlYXN0IG5vdCB3aXRob3V0IGEgbGl0dGxlIGhlbHApLjxwPgotPHA+Ci1JbnRlcmVzdGluZ2x5IGVub3VnaCwgdGhpcyBhcHByb2FjaCBhdm9pZHMgYSBudW1iZXIgb2YgZGlmZmljdWx0IHByb2JsZW1zIHJlbGF0ZWQgdG8gZGF0YSByZXByZXNlbnRhdGlvbiBhbmQgd29ya2luZyB3aXRoIG11bHRpcGxlIGxhbmd1YWdlcy4gICBCeSBzdXBwb3J0aW5nIHBvaW50ZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBTV0lHIG9yIFRjbCB0byB1bmRlcnN0YW5kIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIEMvQysrIG9iamVjdHMuICBJbiBmYWN0LCBTV0lHIGRvZXMgbm90IG5lZWQgdGhlIGRlZmluaXRpb24gb2YgY29tcGxleCBvYmplY3RzIGluIG9yZGVyIHRvIHVzZSB0aGVtLiAgRm9yIGV4YW1wbGUsIHRoZSBWZWN0b3IgdHlwZSB3YXMgdXNlZCBhYm92ZSwgYnV0IHRoZSBkZWZpbml0aW9uIG9mIFZlY3RvcnMgd2FzIG5ldmVyIHNwZWNpZmllZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuPHA+Ci08cD4KLUZpbmFsbHksIFNXSUcgdXNlcyB0aGUgcG9pbnRlciB0eXBlLXNpZ25hdHVyZSB0byBwZXJmb3JtIHR5cGUtY2hlY2tpbmcuICAgV2hlbmV2ZXIgYSBwb2ludGVyIGlzIHBhc3NlZCB0byBhIEMgZnVuY3Rpb24sIGl0cyB0eXBlIGlzIGNoZWNrZWQgYWdhaW5zdCBhbiBleHBlY3RlZCB2YWx1ZS4gIElmIGEgbWlzbWF0Y2ggb2NjdXJzLCB0aGUgcG9pbnRlciB3aWxsIGJlIHJlamVjdGVkIGFuZCBhIFRjbCBlcnJvciByYWlzZWQuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXQgdjEgW25ld192ZWN0b3IgMiAzIDRdCi0lIHNldCBtIFtuZXdfbWF0cml4IDEwIDEwXQotJSBkb3RfcHJvZHVjdCAkdjEgJG0KLVR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMiBvZiBkb3RfcHJvZHVjdC4gRXhwZWN0ZWQgX1ZlY3Rvcl9wLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaXRoIHR5cGUgY2hlY2tpbmcsIGl0IGlzIHNhZmUgdG8gcGFzcyBwb2ludGVycyBhcm91bmQgaW4gVGNsIG11Y2ggaW4gdGhlIHNhbWUgd2F5IGFzIHdvdWxkIGJlIGRvbmUgaW4gQy9DKysgKHdoaWNoIG1heSBiZSBhIGdvb2Qgb3IgYmFkIHRoaW5nIGRlcGVuZGluZyBvbiB5b3VyIHBvaW50IG9mIHZpZXctLW9yIGFsbCBiYWQgaWYgeW91J3JlIGEgbGFuZ3VhZ2UgcHVyaXN0KS4gICA8cD4KLTxhIG5hbWU9Im4xMyI+PC9hPjxoMz4gU3RydWN0dXJlcyBhbmQgQ2xhc3NlczwvaDM+Ci1UaGUgU1dJRyBwb2ludGVyIG1lY2hhbmlzbSBpcyBhIHBvd2VyZnVsIHdheSB0byBtYW5pcHVsYXRlIEMgb2JqZWN0cyBmcm9tIFRjbC4gIEhvd2V2ZXIsIHlvdSBtYXkgYWxzbyB3YW50IHRvIGFjY2VzcyB0aGUgaW50ZXJuYWxzIG9mIGFuIG9iamVjdC4gICBUbyBzdXBwb3J0IHRoaXMsIFNXSUcgY2FuIHBhcnNlIEMgc3RydWN0dXJlIGRlZmluaXRpb25zIGFuZCB0dXJuIHRoZW0gaW50byAiYWNjZXNzb3IiIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBWZWN0b3IgewotICAgICAgZG91YmxlIHgseSx6OwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotaXMgdHJhbnNsYXRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY29sbGVjdGlvbiBvZiBDIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIFZlY3Rvcl94X2dldChzdHJ1Y3QgVmVjdG9yICpvYmopIHsKLQkJcmV0dXJuIG9iai0mZ3Q7eDsKLX0KLWRvdWJsZSBWZWN0b3JfeF9zZXQoc3RydWN0IFZlY3RvciAqb2JqLCBkb3VibGUgeCkgewotCQlyZXR1cm4gKG9iai0mZ3Q7eCA9IHgpOwotfQotZG91YmxlIFZlY3Rvcl95X2dldChzdHJ1Y3QgVmVjdG9yICpvYmopIHsKLQkJcmV0dXJuIG9iai0mZ3Q7eTsKLX0KLWRvdWJsZSBWZWN0b3JfeV9zZXQoc3RydWN0IFZlY3RvciAqb2JqLCBkb3VibGUgeSkgewotCQlyZXR1cm4gKG9iai0mZ3Q7eSA9IHkpOwotfQotZG91YmxlIFZlY3Rvcl96X2dldChzdHJ1Y3QgVmVjdG9yICpvYmopIHsKLQkJcmV0dXJuIG9iai0mZ3Q7ejsKLX0KLWRvdWJsZSBWZWN0b3Jfel9zZXQoc3RydWN0IFZlY3RvciAqb2JqLCBkb3VibGUgeikgewotCQlyZXR1cm4gKG9iai0mZ3Q7eiA9IHopOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BY2Nlc3NvciBmdW5jdGlvbnMgc2ltcGx5IHRha2UgYW4gb2JqZWN0IGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgcHJvdmlkZSBhIHdheSB0byBtYW5pcHVsYXRlIGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBmcm9tIFRjbC4gIEZvciBleGFtcGxlPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyB2IGlzIGEgVmVjdG9yIHRoYXQgZ290IGNyZWF0ZWQgc29tZWhvdwotJSBWZWN0b3JfeF9nZXQgJHYKLTMuNQotJSBWZWN0b3JfeF9zZXQgJHYgNy44ICAgICAgICAgICAgOyMgQ2hhbmdlIHggY29tcG9uZW50Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNpbWlsYXIgYWNjZXNzIGlzIHByb3ZpZGVkIGZvciB1bmlvbnMgYW5kIHRoZSBkYXRhIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuICAgPHA+Ci08cD4KLUZvciBDKysgY2xhc3MgZGVmaW5pdGlvbnMsIHRoZSBzYW1lIHRlY2huaXF1ZSBpcyB1c2VkIHRvIHByb3ZpZGUgYWNjZXNzIHRvIG1lbWJlciBmdW5jdGlvbnMsIGNvbnN0cnVjdG9ycywgYW5kIGRlc3RydWN0b3JzLiAgIEZvciBleGFtcGxlLDxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWNsYXNzIExpc3QgewotcHVibGljOgotICBMaXN0KCk7Ci0gIH5MaXN0KCk7Ci0gIGludCAgc2VhcmNoKGNoYXIgKml0ZW0pOwotICB2b2lkIGluc2VydChjaGFyICppdGVtKTsKLSAgdm9pZCByZW1vdmUoY2hhciAqaXRlbSk7Ci0gIGNoYXIgKmdldChpbnQgbik7Ci0gIGludCAgbGVuZ3RoOwotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1pcyB0cmFuc2xhdGVkIGludG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPkxpc3QgICAgKm5ld19MaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3Q7Ci19Owotdm9pZCAgICAgZGVsZXRlX0xpc3QoTGlzdCAqbCkgewotCQlkZWxldGUgbDsKLX0KLWludCAgICAgIExpc3Rfc2VhcmNoKExpc3QgKmwsIGNoYXIgKml0ZW0pIHsKLQkJcmV0dXJuIGwtJmd0O3NlYXJjaChpdGVtKTsKLX0KLXZvaWQgICAgIExpc3RfaW5zZXJ0KExpc3QgKmwsIGNoYXIgKml0ZW0pIHsKLQkJbC0mZ3Q7aW5zZXJ0KGl0ZW0pOwotfQotdm9pZCAgICAgTGlzdF9yZW1vdmUoTGlzdCAqbCwgY2hhciAqaXRlbSkgewotCQlsLSZndDtyZW1vdmUoaXRlbSk7Ci19Ci1jaGFyICAgICpMaXN0X2dldChMaXN0ICpsLCBpbnQgbikgewotCQlyZXR1cm4gbC0mZ3Q7Z2V0KG4pOwotfQotaW50ICAgICAgTGlzdF9sZW5ndGhfZ2V0KExpc3QgKmwpIHsKLQkJcmV0dXJuIGwtJmd0O2xlbmd0aDsKLX0KLWludCAgICAgIExpc3RfbGVuZ3RoX3NldChMaXN0ICpsLCBpbnQgbikgewotCQlyZXR1cm4gKGwtJmd0O2xlbmd0aCA9IG4pOwotfQotdm9pZCAgICAgTGlzdF9wcmludChMaXN0ICpsKSB7Ci0JCUxpc3Q6OnByaW50KGwpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaXRoaW4gVGNsLCB5b3UgY2FuIHVzZSB0aGUgZnVuY3Rpb25zIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSUgc2V0IGwgW25ld19MaXN0XQotJSBMaXN0X2luc2VydCAkbCBBbGUKLSUgTGlzdF9pbnNlcnQgJGwgU3RvdXQKLSUgTGlzdF9pbnNlcnQgJGwgTGFnZXIKLSUgTGlzdF9wcmludCAkbAotTGFnZXIKLVN0b3V0Ci1BbGUKLSUgcHV0cyBbTGlzdF9sZW5ndGhfZ2V0ICRsXQotMwotJSBwdXRzICRsCi1fMTAwODU2MF9MaXN0X3AKLSUgCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hpbGUgc29tZXdoYXQgcHJpbWl0aXZlLCB0aGUgbG93LWxldmVsIFNXSUcgaW50ZXJmYWNlIHByb3ZpZGVzIGRpcmVjdCBhbmQgZmxleGlibGUgYWNjZXNzIHRvIGFsbW9zdCBhbnkgQysrIG9iamVjdC4gICAgQXMgaXQgdHVybnMgb3V0LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgU1dJRyB3aXRoIHRoZSBjb21wbGV0ZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0dXJlIG9yIGNsYXNzLiAgIEFjY2VzcyBjYW4gYmUgcmVzdHJpY3RlZCBieSBvbmx5IHByb3ZpZGluZyBhIGxpbWl0ZWQgZGVmaW5pdGlvbiAob3Igbm8gZGVmaW5pdGlvbiBhdCBhbGwpLiAgPHA+Ci08cD4KLUZvciBDKyssIFNXSUcgYWxzbyBzdXBwb3J0cyBpbmhlcml0YW5jZSAoaW5jbHVkaW5nIG11bHRpcGxlIGluaGVyaXRhbmNlKS4gICAgSW5oZXJpdGFuY2UgaGllcmFyY2hpZXMgYXJlIGVuY29kZWQgaW50byB0aGUgcnVuLXRpbWUgcG9pbnRlciB0eXBlLWNoZWNrZXIgYW5kIHdvcmsgYXMgeW91IHdvdWxkIGV4cGVjdC4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgdGhlIGZvbGxvd2luZyBjbGFzc2VzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBTaGFwZSB7Ci1wdWJsaWM6Ci0JCXZpcnR1YWwgZG91YmxlIGFyZWEoKSA9IDA7Ci0JCXZpcnR1YWwgZG91YmxlIHBlcmltZXRlcigpID0gMDsKLX07Ci0KLWNsYXNzIENpcmNsZSA6IHB1YmxpYyBTaGFwZSB7Ci1wdWJsaWM6Ci0JCUNpcmNsZShkb3VibGUgcmFkaXVzKTsKLQkJfkNpcmNsZSgpOwotCQlkb3VibGUgYXJlYSgpOwotCQlkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotCi1jbGFzcyBTcXVhcmUgOiBwdWJsaWMgU2hhcGUgewotcHVibGljOgotCQlTcXVhcmUoZG91YmxlIHdpZHRoKTsKLQkJflNxdWFyZSgpOwotCQlkb3VibGUgYXJlYSgpOwotCQlkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGUgVGNsIGludGVyZmFjZSwgIkNpcmNsZSIgYW5kICJTcXVhcmUiIG9iamVjdHMgd291bGQgYmUgYWNjZXB0ZWQgYW55IHBsYWNlIGEgIlNoYXBlIiBpcyBleHBlY3RlZC4gIEhvd2V2ZXIsIHRoZSB0eXBlIHN5c3RlbSBkb2VzIG5vdCBhbGxvdyBzaXR1YXRpb25zIHRoYXQgYXJlIGlsbGVnYWwgKG9yIHByb2JsZW1hdGljKSBpbiBDKysuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT50Y2xzaAotJSBzZXQgYyBbbmV3X0NpcmNsZSA0XSAgICAgICAgICAgIDsjIENyZWF0ZSBhIGNpcmNsZQotJSBzZXQgcyBbbmV3X1NxdWFyZSAxMF0gICAgICAgICAgIDsjIENyZWF0ZSBhIHNxdWFyZQotJSBTcXVhcmVfYXJlYSAkYSAgICAgICAgICAgICAgICAgIDsjIFVzZSBkZXJpdmVkIGNsYXNzCi0xMDAuMAotJSBTaGFwZV9hcmVhICRzICAgICAgICAgICAgICAgICAgIDsjIFVzZSBiYXNlIGNsYXNzCi0xMDAuMAotJSBTaGFwZV9wZXJpbWV0ZXIgJGMKLTI1LjEzMjc0MTIyODcKLSUgU3F1YXJlX2FyZWEgJGMgICAgICAgICAgICAgICAgICMgVHJ5IHRvIHZpb2xhdGUgdGhlIHR5cGUgc3lzdGVtCi1UeXBlIGVycm9yIGluIGFyZ3VtZW50IDEgb2YgU3F1YXJlX2FyZWEuIEV4cGVjdGVkIF9TcXVhcmVfcC4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjE0Ij48L2E+PGgzPiBUaGUgT2JqZWN0IEludGVyZmFjZTwvaDM+Ci1BbHRob3VnaCBTV0lHIHR1cm5zIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMgaW50byBhY2Nlc3NvciBmdW5jdGlvbnMsIGFuIG9wdGlvbmFsIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgaXMgYWxzbyBhdmFpbGFibGUuICAgVGhpcyBpbnRlcmZhY2UgYWxsb3dzIEMvQysrIG9iamVjdHMgdG8gYXBwZWFyIGxpa2UgVGNsIG9iamVjdHMgKG9yIFRrIHdpZGdldHMpLiAgICAgICBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgTGlzdCBjbGFzcyBtZW50aW9uZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uICAgVXNpbmcgdGhlIG9wdGlvbmFsIG9iamVjdCBpbnRlcmZhY2UsIHlvdSBjb3VsZCB3cml0ZSB0aGUgZm9sbG93aW5nIFRjbCBjb2RlPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBMaXN0IGwgICAgICAgICAgICAgICAgICA7IyBDcmVhdGUgYSBuZXcgbGlzdAotJSBsIGluc2VydCBBbGUgICAgICAgICAgICA7IyBJbnZva2Ugc29tZSBtZW1iZXIgZnVuY3Rpb25zCi0lIGwgaW5zZXJ0IFN0b3V0Ci0lIGwgaW5zZXJ0IExhZ2VyCi0lIExpc3RfcHJpbnQgW2wgY2dldCAtdGhpc10KLUxhZ2VyCi1TdG91dAotQWxlCi0lIHB1dHMgW2wgY2dldCAtbGVuZ3RoXSAgIDsjIEdldCB0aGUgbGVuZ3RoCi0zCi0lIHB1dHMgW2wgY2dldCAtdGhpc10gICAgIDsjIEdldCB0aGUgYHRoaXMnIHBvaW50ZXIKLV8xMDA4NTYwX0xpc3RfcAotJSByZW5hbWUgbCAiIiAgICAgICAgICAgICA7IyBEZWxldGUgbAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Gb3IgbWFueSB1c2VycywgdGhpcyBwcm92aWRlcyBhIG11Y2ggbW9yZSBuYXR1cmFsIGludGVyZmFjZSB0byBDL0MrKyBvYmplY3RzLiAgIEl0IGFsc28gbG9va3MgcmF0aGVyIGZhbWlsaWFyIHRvIHdoYXQgaXMgZG9uZSBpbiBUY2wgZXh0ZW5zaW9ucyBzdWNoIGFzIFtpbmNyIFRjbF0uICAgIEV2ZW4gdGhvdWdoIHRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgb2JqZWN0cywgaXQgaXMgc3RpbGwgY2xvc2VseSByZWxhdGVkIHRvIHRoZSBwb2ludGVyIGhhbmRsaW5nIG1lY2hhbmlzbSBhbHJlYWR5IGRlc2NyaWJlZC4gICBJbiBwYXJ0aWN1bGFyLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGV4dHJhY3QgYSBwb2ludGVyIHZhbHVlIGZyb20gYSBUY2wgb2JqZWN0LiAgIFRoaXMgY2FuIGJlIGRvbmUgYnkgZXh0cmFjdGluZyB0aGUgYHRoaXMnIHZhbHVlIGZyb20gYW4gb2JqZWN0IGFzIGZvbGxvd3M6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c2V0IHQgW2wgY2dldCAtdGhpc10gICAgICAjIEV4dHJhY3QgdGhlIHBvaW50ZXIgdmFsdWUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gb3RoZXIgY2FzZXMsIGl0IG1heSBiZSB1c2VmdWwgdG8gdHVybiBhbiBleGlzdGluZyBwb2ludGVyIGludG8gYSBUY2wgb2JqZWN0LiAgIFRoaXMgY2FuIGJlIGRvbmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCBsIC10aGlzICR0ICAgICAgICAgICAjIFR1cm4gYSBwb2ludGVyIGludG8gYW4gb2JqZWN0Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQWx0aG91Z2ggdGhlIG9iamVjdCBpbnRlcmZhY2UgcHJvdmlkZXMgYSAibmF0dXJhbCIgaW50ZXJmYWNlIHRvIG9iamVjdHMsIGl0IGFsc28gaGFzIGEgbnVtYmVyIG9mIGxpbWl0YXRpb25zLiAgRmlyc3QsIGl0IGNhbiByZXN1bHQgaW4gYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgYWRkaXRpb25hbCB3cmFwcGVyIGNvZGUuICBJZiB3cmFwcGluZyBodW5kcmVkcyBvZiBzdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzLCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGNyZWF0ZWQgYnkgU1dJRyBjYW4gYmUgcXVpdGUgbGFyZ2UuICBJZiB0aGlzIGlzIGEgY29uY2VybiwgdGhlIG9iamVjdCBpbnRlcmZhY2UgY2FuIGJlIGRpc2FibGVkIGJ5IHJ1bm5pbmcgU1dJRyB3aXRoIHRoZSBgPHR0Pi1ub29iamVjdDwvdHQ+JyBvcHRpb24uICBTZWNvbmQsIFNXSUcgZG9lcyBub3QgbWFrZSBUY2wgb2JqZWN0LW9yaWVudGVkIGluIHRoZSBzYW1lIHNlbnNlIGFzIGV4dGVuc2lvbnMgc3VjaCBhcyBbaW5jciBUY2xdLiAgRm9yIGV4YW1wbGUsIHlvdSB3b3VsZCBub3QgYmUgYWJsZSB0byBpbmhlcml0IGZyb20gb2JqZWN0cyB3cmFwcGVkIGJ5IFNXSUcuICBGaW5hbGx5LCB0aGUgb2JqZWN0IGludGVyZmFjZSBjYW4gYmUgYXdrd2FyZCB0byB1c2UgaW4gY29tYmluYXRpb24gd2l0aCBmdW5jdGlvbnMgZXhwZWN0aW5nIHBvaW50ZXJzIHNpbmNlIHlvdSB3aWxsIG5lZWQgdG8gY29udmVydCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIG9iamVjdCBtb2RlbCBhbmQgdGhlIHBvaW50ZXIgbW9kZWwuICBBbHRob3VnaCB0aGlzIGludGVyZmFjZSB3b24ndCBiZSBkZXNjcmliZWQgbXVjaCBmdXJ0aGVyLCBhbGwgb2YgdGhlIGdvcnkgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gdGhlIFNXSUcgVXNlcnMgTWFudWFsLjxwPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgzPiBSZW5hbWluZzwvaDM+Ci1Tb21ldGltZXMgdGhlIGNvbnRlbnRzIG9mIGEgQy9DKysgbGlicmFyeSB3aWxsIGdlbmVyYXRlIGEgbmFtZXNwYWNlIGNsYXNoIHdpdGggZXhpc3RpbmcgVGNsIGtleXdvcmRzIGFuZCBjb21tYW5kcy4gICBUbyByZXNvbHZlIHRoZXNlIGNvbmZsaWN0cywgU1dJRyBwcm92aWRlcyB0aGUgPHR0PiVuYW1lPC90dD4gZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotLi4uCi0lbmFtZShteWxpbmRleCkgaW50IGxpbmRleCgpOwotLi4uCi0lbmFtZShjbGlzdCkgY2xhc3MgbGlzdCB7Ci1wdWJsaWM6Ci0gICAgLi4uCi19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dHQ+JW5hbWU8L3R0PiBzaW1wbHkgY2hhbmdlcyB0aGUgbmFtZSBvZiBhIGNvbW1hbmQsIGNsYXNzLCBvciBtZW1iZXIgZnVuY3Rpb24gd2hlbiB1c2VkIGluIFRjbCAoaXQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBDIGNvZGUpLjxwPgotPGEgbmFtZT0ibjE2Ij48L2E+PGgzPiBSZWFkLW9ubHkgdmFyaWFibGVzPC9oMz4KLVRvIHJlc3RyaWN0IGFjY2VzcyB0byBnbG9iYWwgdmFyaWFibGVzIGFuZCBkYXRhIG1lbWJlcnMgb2Ygc3RydWN0dXJlcywgU1dJRyBwcm92aWRlcyB0aGUgPHR0PiVyZWFkb25seTwvdHQ+IGFuZCA8dHQ+JXJlYWR3cml0ZTwvdHQ+IGRpcmVjdGl2ZXMuICAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lcmVhZG9ubHkKLWRvdWJsZSBmb287ICAgICAgICAgLy8gZm9vIHdpbGwgYmUgcmVhZC1vbmx5Ci1pbnQgICAgYmFyOyAgICAgICAgIC8vIGJhciB3aWxsIGJlIHJlYWQtb25seQotJXJlYWR3cml0ZQotaW50IHNwYW0gPSA0MjsgICAgICAvLyBzcGFtIGlzIHJlYWQtd3JpdGUKLQotY2xhc3MgTGlzdCB7Ci1wdWJsaWM6Ci0uLi4KLSVyZWFkb25seQotICAgICBpbnQgbGVuZ3RoOyAgICAgICAgLy8gbGVuZ3RoIHdpbGwgYmUgcmVhZG9ubHkKLSVyZWFkd3JpdGUKLS4uLgotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotUmVhZC1vbmx5IG1vZGUgc3RheXMgaW4gZWZmZWN0IHVudGlsIGl0IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQgd2l0aCB0aGUgPHR0PiVyZWFkd3JpdGU8L3R0PiBkaXJlY3RpdmUuPHA+Ci08YSBuYW1lPSJuMTciPjwvYT48aDM+IEZpbGUgSW5jbHVzaW9uIGFuZCB0aGUgU1dJRyBMaWJyYXJ5PC9oMz4KLVNXSUcgcHJvdmlkZXMgYW4gPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnJlYWsgdXAgaW50ZXJmYWNlcyBpbnRvIG11bHRpcGxlIGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3ZXJlIGNyZWF0aW5nIGFuIGludGVyZmFjZSB0byBhIGxhcmdlIHBhY2thZ2UsIHlvdSBtaWdodCB3cml0ZSBhbiBpbnRlcmZhY2UgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBJbnRlcmZhY2UgdG8gT3BlbkdMCi0lbW9kdWxlIG9wZW5nbAotCi0vLyBJbmNsdWRlIGEgdmFyaWV0eSBvZiBwaWVjZXMKLSVpbmNsdWRlIGdsLmkKLSVpbmNsdWRlIGdsdS5pCi0laW5jbHVkZSAiR0wvZ2x1YXV4LmgiCi0laW5jbHVkZSAidGVzdC5jIgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgb3RoZXIgdXNlIG9mIDx0dD4laW5jbHVkZTwvdHQ+IGlzIHRvIHJldHJpZXZlIGZpbGVzIGZyb20gdGhlIFNXSUcgbGlicmFyeS0tYSByZXBvc2l0b3J5IG9mIGNvbW1vbiBtb2R1bGVzIGFuZCBleHRlbnNpb25zIHRoYXQgaXMgcGFja2FnZWQgd2l0aCB0aGUgU1dJRyBkaXN0cmlidXRpb24uICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIHJlbGluayB0aGUgPHR0PnRjbHNoPC90dD4gaW50ZXJwcmV0ZXIgd2l0aCBhIFNXSUcgZXh0ZW5zaW9uIGFkZGVkIHRvIGl0LCB5b3UgY2FuIGRvIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotJXsKLSNpbmNsdWRlICJteWhlYWRlci5oIgotJX0KLSVpbmNsdWRlIHRjbHNoLmkgICAgICAgICAgICAgIC8vIEluY2x1ZGUgVGNsX0FwcEluaXQoKSBjb2RlIGZvciB0Y2xzaAotCi0vLyBDIGRlY2xhcmF0aW9ucwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBsaWJyYXJ5IGZpbGUgcHJvdmlkZXMgYWxsIG9mIHRoZSBhZGRpdGlvbmFsIHN1cHBvcnQgY29kZSAoPHR0PlRjbF9BcHBJbml0KCksIG1haW4oKTwvdHQ+LCBldGMuLi4pIG5lZWRlZCB0byBidWlsZCBhIG5ldyB2ZXJzaW9uIG9mIDx0dD50Y2xzaDwvdHQ+LjxwPgotPHA+Ci1MaWJyYXJ5IGZpbGVzIGNhbiBhbHNvIGJlIGluY2x1ZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgdXNpbmcgdGhlIDx0dD4tbDwvdHQ+IG9wdGlvbi4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLXRjbDggLWx3aXNoLmkgZXhhbXBsZS5pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gZmlsZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgbWFubmVyLCB0aGV5IGFyZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBTV0lHIGlucHV0IGZpbGUgKGkuZS4gZmlsZXMgaW5jbHVkZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcmUgcGFyc2VkIGxhc3QpLjxwPgotPGEgbmFtZT0ibjE4Ij48L2E+PGgzPiBDb2RlIEluc2VydGlvbjwvaDM+Ci1Tb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIGluc2VydCBzdXBwb3J0IGNvZGUgaW50byB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgZmlsZSBnZW5lcmF0ZWQgYnkgU1dJRy4gICBUaGUgd3JhcHBlciBmaWxlIHByb2R1Y2VkIGJ5IFNXSUcgY29uc2lzdHMgb2YgdGhyZWUgc2VjdGlvbnMtLS1hIGhlYWRlciBzZWN0aW9uIGNvbnRhaW5pbmcgZGVjbGFyYXRpb25zIHRoYXQgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSB3cmFwcGVyIGZ1bmN0aW9ucywgYSB3cmFwcGVyIGNvZGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBhY3R1YWwgVGNsIHdyYXBwZXIgZnVuY3Rpb25zLCBhbmQgYW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gdGhhdCByZWdpc3RlcnMgdGhlIG1vZHVsZSdzIGZ1bmN0aW9uYWxpdHkgd2l0aCBUY2wuPHA+Ci08cD4KLTxwPgotQ29kZSBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgaGVhZGVyIHNlY3Rpb24gYnkgZW5jbG9zaW5nIGl0IHdpdGggJXssICV9ICh0aGVzZSBhcmUgYWxzbyBrbm93biBhcyBjb2RlIGJsb2NrcykuICAgV2UgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyB1c2VkIHRvIGluY2x1ZGUgdGhlIHJpZ2h0IGhlYWRlciBmaWxlcy4gIEhvd2V2ZXIsIHlvdSBjYW4gYWxzbyBpbmNsdWRlIHN1cHBvcnRpbmcgQyBmdW5jdGlvbnMuICAgRm9yIGV4YW1wbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUgbXltb2R1bGUKLSV7Ci0jaW5jbHVkZSAibXlfaGVhZGVyLmgiCi0lfQotCi0uLi4gRGVjbGFyZSBDIGZ1bmN0aW9ucyBoZXJlCi0KLS8vIE5vdyBpbmNsdWRlIGEgVGNsX0FwcEluaXQgZnVuY3Rpb24gKG5vdGU6IHRoZSB0Y2xzaC5pIGxpYnJhcnkgZmlsZQotLy8gZG9lcyB0aGUgc2FtZSB0aGluZykuCi0lewotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIFRjbF9NYWluKGFyZ2MsIGFyZ3YsIFRjbF9BcHBJbml0KTsKLSAgcmV0dXJuKDApOwotfQotCi1pbnQgVGNsX0FwcEluaXQoVGNsX0ludGVycCAqaW50ZXJwKXsKLSAgaW50IE15bW9kdWxlX0luaXQoVGNsX0ludGVycCAqKTsgCi0KLSAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSAKLSAgICByZXR1cm4gVENMX0VSUk9SOwotCi0gIC8qIE5vdyBpbml0aWFsaXplIG91ciBmdW5jdGlvbnMgKi8KLSAgaWYgKE15bW9kdWxlX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpCi0gICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgcmV0dXJuIFRDTF9PSzsKLX0KLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUNvZGUgYmxvY2tzIGFyZSBhbHNvIHNvbWV0aW1lcyB1c2VkIHRvIHdyaXRlIGhlbHBlciBmdW5jdGlvbnMuICAgVGhlc2UgYXJlIEMgZnVuY3Rpb25zIHRoYXQgeW91IHdhbnQgdG8gaW5jbHVkZSBpbiB0aGUgVGNsIGludGVyZmFjZSwgYnV0IG1pZ2h0IG5vdCBiZSBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBDIGxpYnJhcnkgb3IgcGFja2FnZS4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBJbmNsdWRlIGEgc3VwcG9ydCBmdW5jdGlvbiBpbiBvdXIgbW9kdWxlCi0lewotLyogQ3JlYXRlIGEgbmV3IHZlY3RvciAqLwotc3RhdGljIFZlY3RvciAqbmV3X1ZlY3RvcigpIHsKLSAgICByZXR1cm4gKFZlY3RvciAqKSBtYWxsb2Moc2l6ZW9mKFZlY3RvcikpOwotfQotJX0KLQotLy8gTm93IHRlbGwgU1dJRyBhYm91dCBpdC4KLVZlY3RvciAqbmV3X1ZlY3RvcigpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TaW5jZSB3cml0aW5nIGhlbHBlciBmdW5jdGlvbnMgaXMgcmVsYXRpdmVseSBjb21tb24sIGEgc2hvcnRoYW5kIGZvcm0gb2YgdGhlIGFib3ZlIGlzIGF2YWlsYWJsZSB1c2luZyB0aGUgPHR0PiVpbmxpbmU8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWlubGluZSAlewotLyogQ3JlYXRlIGEgbmV3IHZlY3RvciAqLwotVmVjdG9yICpuZXdfVmVjdG9yKCkgewotICAgIHJldHVybiAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGU8dHQ+ICVpbmxpbmU8L3R0PiBkaXJlY3RpdmUgaXMgcmVhbGx5IGp1c3QgYSBjb252ZW5pZW50IHdheSB0byB3cml0ZSBuZXcgQy9DKysgZnVuY3Rpb25zIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBpbiB5b3VyIFRjbCBpbnRlcmZhY2UuPHA+Ci08cD4KLUlmIHlvdSB3YW50IHRvIGluc2VydCBjb2RlIGludG8gdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5pdCAlewotICAgIGluaXRfbW9kdWxlKCk7ICAgICAgIC8vIFBlcmZvcm0gbW9kdWxlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCi0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIGNvZGUgd2lsbCBiZSBleGVjdXRlZCB3aGVuIFRjbCBsb2FkcyBvciBpbml0aWFsaXplcyB5b3VyIGV4dGVuc2lvbiBtb2R1bGUgYW5kIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgeW91ciBhcHBsaWNhdGlvbi48cD4KLTxwPgotRmluYWxseSwgdGhlcmUgaXMgYSA8dHQ+JXdyYXBwZXI8L3R0PiBkaXJlY3RpdmUgZm9yIGluY2x1ZGluZyBjb2RlIGludG8gdGhlIHdyYXBwZXIgc2VjdGlvbiBvZiBTV0lHJ3Mgb3V0cHV0LiAgIFRoaXMgaXMgcmFyZWx5IHVzZWQgKG9yIG5lY2Vzc2FyeSkgYnV0IGlzIGF2YWlsYWJsZSBmb3Igc3BlY2lhbCBjYXNlcy48cD4KLTxhIG5hbWU9Im4xOSI+PC9hPjxoMz4gU3RydWN0dXJlIGFuZCBDbGFzcyBFeHRlbnNpb248L2gzPgotVGhlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgcHJvdmlkZXMgYSBuaWNlIHdheSB0byBtYW5pcHVsYXRlIEMgc3RydWN0dXJlcyBhbmQgQysrIGNsYXNzZXMuICBIb3dldmVyLCAgaW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGV4dGVuZCBzdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2FudGVkIHRvIG1hbmlwdWxhdGUgdGhlIGZvbGxvd2luZyBDIHN0cnVjdHVyZSBmcm9tIFRjbCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFZlY3RvciB7Ci0gICAgIGRvdWJsZSB4LCB5LCB6OwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQXMgaXMsIHRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUsIGRlc3Ryb3ksIG9yIGxvb2sgYXQgVmVjdG9ycyBpbiBhIGNvbnZlbmllbnQgbWFubmVyLiAgSG93ZXZlciwgd2l0aCBTV0lHLCB5b3UgY2FuIGV4dGVuZCB0aGUgVmVjdG9yIGNsYXNzIHdpdGggc29tZSBuZXcgbWV0aG9kcyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHZlY3RvcgotJXsKLSNpbmNsdWRlICJ2ZWN0b3IuaCIKLSV9Ci0KLXN0cnVjdCBWZWN0b3IgewotICAgICBkb3VibGUgeCx5LHo7Ci19OwotCi0vLyBOb3cgZXh0ZW5kIHRoZSBWZWN0b3Igc3RydWN0dXJlIHdpdGggc29tZSBtZXRob2RzCi0lYWRkbWV0aG9kcyBWZWN0b3IgewotICAgICAgLy8gQ3JlYXRlIGEgbmV3IHZlY3RvcgotICAgICAgVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsKLSAgICAgICAgICBWZWN0b3IgKnYgPSAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci0gICAgICAgICAgdi0mZ3Q7eCA9IHg7Ci0gICAgICAgICAgdi0mZ3Q7eSA9IHk7Ci0gICAgICAgICAgdi0mZ3Q7eiA9IHo7Ci0gICAgICAgICAgcmV0dXJuIHo7Ci0gICAgICB9Ci0gICAgICAvLyBEZXN0cm95IGEgdmVjdG9yCi0gICAgICB+VmVjdG9yKCkgewotICAgICAgICAgIGZyZWUoc2VsZik7Ci0gICAgICAgfQotICAgICAgIC8vIFByaW50IG91dCBhIHZlY3RvciBmb3IgZGVidWdnaW5nCi0gICAgICAgdm9pZCBvdXRwdXQoKSB7Ci0gICAgICAgICAgcHJpbnRmKCJbICVnLCAlZywgJWcgXVxuIiwgc2VsZi0mZ3Q7eCwgc2VsZi0mZ3Q7eSwgc2VsZi0mZ3Q7eik7Ci0gICAgICAgfQotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCBpbiBUY2wsIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBWZWN0b3IgdiAyIDUuNSAtOSAgICAgICAgICA7ICMgQ3JlYXRlIGEgbmV3IHZlY3RvcgotJSB2IG91dHB1dCAgICAgICAgICAgICAgICAgICA7ICMgT3V0cHV0IGl0J3MgdmFsdWUKLVsgMiwgNS41LCAtOSBdCi0lIHJlbmFtZSB2ICIiICAgICAgICAgICAgICAgIDsgIyBEZXN0cm95IHYgKGNhbGxzIHRoZSBkZXN0cnVjdG9yKQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaHVzLCB3aXRoIGp1c3QgYSBsaXR0bGUgd29yaywgeW91IGNhbiB0dXJuIGEgQyBzdHJ1Y3R1cmUgaW50byBzb21ldGhpbmcgdGhhdCBsb29rcyBhbG90IGxpa2UgYSBDKysgb2JqZWN0IHdpdGggY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgYW5kIG1ldGhvZHMuICAgSG93ZXZlciwgdGhpcyBpcyBkb25lIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBDIHN0cnVjdHVyZSBvciByZXF1aXJpbmcgYSBDKysgY29tcGlsZXIuPHA+Ci08cD4KLUp1c3QgYXMgQyBzdHJ1Y3R1cmVzIGNhbiBiZSBleHRlbmRlZCwgQysrIGNsYXNzZXMgY2FuIGFsc28gYmUgZXh0ZW5kZWQgd2l0aCBuZXcgbWV0aG9kcy4gIFRoZSBleHRlbnNpb24gcHJvY2VzcyBkb2VzIG5vdCBtb2RpZnkgdGhlIG9yaWdpbmFsIGNsYXNzIG5vciBkb2VzIGl0IHJlbHkgdXBvbiBDKysgaW5oZXJpdGFuY2UuICA8cD4KLTxhIG5hbWU9Im4yMCI+PC9hPjxoMz4gRXhjZXB0aW9uIEhhbmRsaW5nPC9oMz4KLUluIHNvbWUgQy9DKysgYXBwbGljYXRpb25zIGl0IG1heSBiZSB1c2VmdWwgdG8gY2F0Y2ggZXJyb3JzIGFuZCB0cmFuc2xhdGUgdGhlbSBpbnRvIFRjbCBlcnJvcnMuICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZS4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQ29kZSBmb3IgY2F0Y2hpbmcgYSBDKysgZXhjZXB0aW9uCi0lZXhjZXB0KHRjbCkgewotICAgIHRyeSB7Ci0gICAgICAgICAkZnVuY3Rpb24gICAgICAgLy8gVGhlIHJlYWwgZnVuY3Rpb24gY2FsbCBpcyBwbGFjZWQgaGVyZQotICAgIH0gY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLSAgICAgICAgIGludGVycC0mZ3Q7cmVzdWx0ID0gIk91dCBvZiBib3VuZHMuIjsKLSAgICAgICAgIHJldHVybiBUQ0xfRVJST1I7Ci0gICAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgY29kZSB5b3Ugc3VwcGx5IGlzIGluc2VydGVkIGRpcmVjdGx5IGludG8gdGhlIHdyYXBwZXIgY29kZSBjcmVhdGVkIGJ5IFNXSUcuICBUaGUgYCRmdW5jdGlvbicgdG9rZW4gaXMgc2ltcGx5IGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBhY3R1YWwgQy9DKysgZnVuY3Rpb24gY2FsbC4gICBUaGUgZXhjZXB0aW9uIGhhbmRsZXIgcmVtYWlucyBpbiBlZmZlY3QgdW5kZXIgaXQgaXMgcmVkZWZpbmVkIG9yIGRpc2FibGVkLiAgIEV4Y2VwdGlvbnMgY2FuIGJlIGRpc2FibGVkIGJ5IHNpbXBseSBvbWl0dGluZyB0aGUgY29kZS4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4gJWV4Y2VwdCh0Y2wpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUV4Y2VwdGlvbiBoYW5kbGluZyBpcyBub3QgbGltaXRlZCB0byBDKysgZXhjZXB0aW9ucyBvciBhbnkgcGFydGljdWxhciBlcnJvciBoYW5kbGluZyBtZWNoYW5pc20uICAgRXNzZW50aWFsbHkgYW55IHZhbGlkIEMvQysrIGNvZGUgZm9yIGNoZWNraW5nIGVycm9ycyBjYW4gYmUgdXNlZCB3aXRoIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZS48cD4KLTxwPgotU1dJRyBhbHNvIHByb3ZpZGVzIGFuIGV4Y2VwdGlvbiBoYW5kbGluZyBsaWJyYXJ5LCA8dHQ+ZXhjZXB0aW9uLmk8L3R0PiwgIHRoYXQgY2FuIGJlIHVzZWQgdG8gaGFuZGxlIGV4Y2VwdGlvbnMgaW4gYSBsYW5ndWFnZS1uZXV0cmFsIG1hbm5lci4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gSW5jbHVkZSB0aGUgU1dJRyBleGNlcHRpb24gaGFuZGxpbmcgbGlicmFyeQotJWluY2x1ZGUgZXhjZXB0aW9uLmkKLS8vIFNwZWNpZnkgYSBnZW5lcmljIGV4Y2VwdGlvbiBoYW5kbGVyICh3b3JrcyB3aXRoIGFsbCB0YXJnZXQgbGFuZ3VhZ2VzKQotJWV4Y2VwdCB7Ci0gICAgIHRyeSB7Ci0gICAgICAgICRmdW5jdGlvbgotICAgICB9IGNhdGNoIChSYW5nZUVycm9yKSB7Ci0gICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCAiUmFuZ2UgRXJyb3IiKTsKLSAgICAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgYmVuZWZpdCBvZiB1c2luZyB0aGUgZXhjZXB0aW9uIGxpYnJhcnkgaXMgdGhhdCBleGNlcHRpb24gaGFuZGxlcnMgY2FuIGJlIGVhc2lseSB3cml0dGVuIG9uY2UgYW5kIHVzZWQgYnkgYWxsIG9mIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlcyBzdXBwb3J0ZWQgYnkgU1dJRy48cD4KLTxhIG5hbWU9Im4yMSI+PC9hPjxoMz4gVHlwZW1hcHM8L2gzPgotTW9zdCBvZiBTV0lHJ3MgaW50ZXJuYWwgcHJvY2Vzc2luZyBpcyBkcml2ZW4gYnkgdGhlIGhhbmRsaW5nIG9mIEMgZGF0YXR5cGVzLS1pbiBwYXJ0aWN1bGFyLCBydWxlcyBmb3IgY29udmVydGluZyBDIGRhdGF0eXBlcyB0byBhbmQgZnJvbSBUY2wgKGFuZCBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzKS4gICAgIEZvciBleGFtcGxlLCB3aGVuIFNXSUcgZW5jb3VudGVycyBhbiAiaW50IiwgaXQgbmVlZHMgdG8ga25vdyBob3cgdG8gY29udmVydCBhbiBpbnRlZ2VyIGZyb20gVGNsIHRvIEMsIHJldHVybiBhbiBpbnRlZ2VyIHJlc3VsdCB0byBUY2wsIGxpbmsgdG8gaW50ZWdlciB2YXJpYWJsZXMsIGFuZCBzbyBmb3J0aC4gICAgQnkgZGVmYXVsdCwgU1dJRyBhbHJlYWR5IGtub3dzIGhvdyB0byBwZXJmb3JtIHRoZXNlIHNpbXBsZSBjb252ZXJzaW9ucyBhcyB3ZWxsIGFzIG1hcHBpbmcgY29tcGxleCBvYmplY3RzIGludG8gcG9pbnRlcnMuPHA+Ci08cD4KLUZvciBtb3N0IHVzZXJzLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBlbm91Z2ggdG8gZ2V0IHN0YXJ0ZWQuICAgSG93ZXZlciwgaW4gc29tZSBjYXNlcywgaXQgbWF5IGJlIHVzZWZ1bCB0byBjaGFuZ2UgU1dJRydzIGhhbmRsaW5nIG9mIGEgcGFydGljdWxhciBkYXRhdHlwZSAoYnkgYWRkaW5nIHNwZWNpYWwgcHJvY2Vzc2luZyBvciBtYXBwaW5nIGEgZGF0YXR5cGUgaW50byBUY2wgaW4gYSBkaWZmZXJlbnQgbWFubmVyKS4gICAgIFRvIHN1cHBvcnQgdGhpcywgU1dJRyBwcm92aWRlcyBhIGN1c3RvbWl6YXRpb24gbWVjaGFuaXNtIGtub3duIGFzICJ0eXBlbWFwcy4iICAgIEluIGEgbnV0c2hlbGwsIGEgdHlwZW1hcCBpcyBhIHNwZWNpYWwgcHJvY2Vzc2luZyBydWxlIHRoYXQgaXMgYXR0YWNoZWQgdG8gcGFydGljdWxhciBDL0MrKyBkYXRhdHlwZXMuICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgdmVyeSBzaW1wbGUgdHlwZW1hcCBpbiBhY3Rpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi0vLyBUeXBlbWFwIGZvciBjb252ZXJ0aW5nIFRjbDggaW50ZWdlcnMgdG8gQyBpbnRlZ2VycwotLy8gICAgICAgJHNvdXJjZSBpcyB0aGUgVGNsIGlucHV0IG9iamVjdCAKLS8vICAgICAgICR0YXJnZXQgaXMgdGhlIEMgdmFyaWFibGUgKGFuIGludCkuCi0ldHlwZW1hcCh0Y2w4LGluKSBpbnQgewotICAgICAgaW50IGVycm9yID0gVGNsX0dldERvdWJsZUZyb21PYmooaW50ZXJwLCAkc291cmNlLCAmYW1wOyR0YXJnZXQpOwotICAgICAgaWYgKGVycm9yICE9IFRDTF9PSykgcmV0dXJuIGVycm9yOwotCQlwcmludGYoIlJlY2VpdmVkIDogJWRcbiIsICR0YXJnZXQpOwotfQotLi4uCi1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoaXMgZXhhbXBsZSBpcyBjb21waWxlZCBpbnRvIGEgVGNsIDggbW9kdWxlLCBpdCB3aWxsIG9wZXJhdGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBmYWN0IDYKLVJlY2VpdmVkIDogNgotNzIwCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoaXMgY2FzZSwgdGhlIEMgY29kZSB1c2VkIGZvciBjb252ZXJ0aW5nIGludGVnZXJzIGZyb20gVGNsIHRvIEMgaGFzIGJlZW4gY2hhbmdlZC4gICA8cD4KLTxwPgotVHlwZW1hcHMgY2FuIGFsc28gYmUgYXBwbGllZCB0byBuYW1lZCBkYXRhdHlwZXMgc3VjaCBhcyBmdW5jdGlvbiBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSBleGNlcHRpb24uaQotLy8gVHlwZW1hcCBmb3IgY2hlY2tpbmcgdGhlIHZhbHVlIG9mIGFuIGlucHV0IGFyZ3VtZW50Ci0vLyAodGhpcyBpcyBkb25lIGFmdGVyIGl0IGhhcyBiZWVuIGNvbnZlcnRlZCBmcm9tIFRjbCB0byBDKQotJXR5cGVtYXAodGNsOCxjaGVjaykgZG91YmxlIHBvc2l0aXZlIHsKLSAgICBpZiAoJHNvdXJjZSAmbHQ7PSAwKSB7Ci0gICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19WYWx1ZUVycm9yLCAiRXhwZWN0ZWQgYSBwb3NpdGl2ZSB2YWx1ZSIpOwotICAgIH0KLX0KLQotZG91YmxlIGxvZzEwKGRvdWJsZSBwb3NpdGl2ZSk7Ci1kb3VibGUgZXhwKGRvdWJsZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgY2FzZSwgdGhlIHR5cGVtYXAgaXMgb25seSBhcHBsaWVkIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGV4YWN0bHkgbWF0Y2ggImRvdWJsZSBwb3NpdGl2ZSIuICAgVGh1cywgZnJvbSBUY2wsIHRoZXNlIGZ1bmN0aW9ucyB3b3VsZCBvcGVyYXRlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgbG9nMTAgMgotMC4zMDEwMjk5OTY1NTQKLSUgZXhwIC0xCi0wLjM2Nzg3OTQ0MTE3MQotJSBsb2cgLTEKLUV4cGVjdGVkIGEgcG9zaXRpdmUgdmFsdWUhCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVR5cGVtYXBzIGFyZSBhcHBsaWVkIHVzaW5nIGEgc2ltcGxlIG5hbWUtYmFzZWQgcGF0dGVybiBtYXRjaGluZyBydWxlLiAgIFdoZW4gYSB0eXBlbWFwIGZvciBgPHR0PmludDwvdHQ+JyBpcyBnaXZlbiwgaXQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBmdXR1cmUgb2NjdXJyZW5jZXMgb2YgYDx0dD5pbnQ8L3R0PicuICAgV2hlbiBhIHR5cGVtYXAgZm9yIGA8dHQ+ZG91YmxlIHBvc2l0aXZlPC90dD4nIGlzIGdpdmVuLCBpdCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBhcmd1bWVudHMgdGhhdCBtYXRjaCBgPHR0PmRvdWJsZSBwb3NpdGl2ZTwvdHQ+JyAoaXQgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gb3RoZXIgdXNlcyBvZiBgPHR0PmRvdWJsZTwvdHQ+JykuICAgICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBhcHBseSBleGlzdGluZyB0eXBlbWFwIHJ1bGVzIHRvIG90aGVyIGRhdGF0eXBlcyB1c2luZyB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIGV4Y2VwdGlvbi5pCi0vLyBUeXBlbWFwIGZvciBjaGVja2luZyB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgYXJndW1lbnQKLS8vICh0aGlzIGlzIGRvbmUgYWZ0ZXIgaXQgaGFzIGJlZW4gY29udmVydGVkIGZyb20gVGNsIHRvIEMpCi0ldHlwZW1hcCh0Y2w4LGNoZWNrKSBkb3VibGUgcG9zaXRpdmUgewotICAgIGlmICgkc291cmNlICZsdDs9IDApIHsKLSAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX1ZhbHVlRXJyb3IsIkV4cGVjdGVkIGEgcG9zaXRpdmUgdmFsdWUiKTsKLSAgICB9Ci19Ci0KLS8vIE5vdyBhcHBseSB0aGlzIHR5cGVtYXAgdG8gc29tZSBvdGhlciBkYXRhdHlwZXMKLSVhcHBseSBkb3VibGUgcG9zaXRpdmUgeyBkb3VibGUgcHgsIFJlYWwgcG9zaXRpdmUgfTsKLQotZG91YmxlIGxvZzEwKGRvdWJsZSBweCk7ICAgICAgICAgLy8gT25seSBhY2NlcHRzIHBvc2l0aXZlIHZhbHVlcwotCi10eXBlZGVmIGRvdWJsZSBSZWFsOwotUmVhbCBsb2coUmVhbCBwb3NpdGl2ZSk7ICAgICAgICAvLyBPbmx5IGFjY2VwdHMgcG9zaXRpdmUgdmFsdWVzCi0uLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQXQgZmlyc3QgZ2xhbmNlLCB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHR5cGVtYXAgbWF5IGxvb2sgbGlrZSBhIGhvcnJpZCBtZXNzICh3aGljaCBpcyBwcm9iYWJseSB0cnVlKSwgYnV0IHRoZXJlIGlzIGEgbWV0aG9kIGJlaGluZCB0aGUgbWFkbmVzcy4gIFR5cGVtYXBzIGhhdmUgZm91ciBlc3NlbnRpYWwgcGllY2VzIHRoYXQgYXJlIHNwZWNpZmllZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcChsYW5nLCBtZXRob2QpIHR5cGUgW25hbWVdIFssdHlwZTIgW25hbWVdLHR5cGUzIFtuYW1lXSwuLi5dIHsKLSAgICAgICBDb252ZXJzaW9uIENvZGUKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0dD5sYW5nPC90dD4gZXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICAgVHlwZW1hcHMgZm9yIGFueSBvZiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZXMgY2FuIGFwcGVhciBhdCBhbnkgdGltZSBpbiBTV0lHJ3MgaW5wdXQuICBIb3dldmVyLCBvbmx5IHRob3NlIG1hdGNoaW5nIHRoZSBjdXJyZW50IHRhcmdldCBsYW5ndWFnZSB3aWxsIGV2ZXIgYmUgdXNlZC4gIDx0dD5tZXRob2Q8L3R0PiBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgY29udmVyc2lvbi4gICBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgY29udmVyc2lvbnMsIGJ1dCBzb21lIG9mIHRoZSBtb3JlIGNvbW1vbiBvbmVzIGFyZSBhcyBmb2xsb3dzPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW4gICAgICAgLSBDb252ZXJ0IGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIFRjbCB0byBDLgotb3V0ICAgICAgLSBDb252ZXJ0IGZ1bmN0aW9uIHJlc3VsdCBmcm9tIEMgdG8gVGNsLgotYXJnb3V0ICAgLSBDb252ZXJ0IGEgcmVzdWx0IHJldHVybmVkIGluIGFuIGFyZ3VtZW50IGZyb20gQyB0byBUY2wuCi1kZWZhdWx0ICAtIERlZmF1bHQgYXJndW1lbnQgdmFsdWUKLWNoZWNrICAgIC0gQ2hlY2tzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBhcmd1bWVudC4KLXJldCAgICAgIC0gQ2xlYW4gdXAgdGhlIHJldHVybiByZXN1bHQgb2YgYSBmdW5jdGlvbgotaWdub3JlICAgLSBUZWxsIFNXSUcgdG8gaWdub3JlIGEgZnVuY3Rpb24gYXJndW1lbnQuCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0dD50eXBlPC90dD4gYW5kIDx0dD5uYW1lPC90dD4gc3BlY2lmeSB0aGUgQy9DKysgZGF0YXR5cGUgdGhhdCB0aGUgdHlwZW1hcCBjb252ZXJzaW9uIGlzIGJlaW5nIGdpdmVuIGZvci4gQWRkaXRpb25hbCBkYXRhdHlwZXMgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdC4gICBGaW5hbGx5LCB0aGUgQy9DKysgY29udmVyc2lvbiBjb2RlIGlzIGdpdmVuIGluIGJyYWNlcy4gIFdpdGhpbiB0aGUgY29udmVyc2lvbiBjb2RlLCBhIG51bWJlciBvZiBzcGVjaWFsIHBsYWNlaG9sZGVycyBjYW4gYmUgaW5jbHVkZWQgKHRoaXMgaXMgb25seSBhIHBhcnRpYWwgbGlzdCkgIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4kc291cmNlICAtIFRoZSBvcmlnaW5hbCB2YWx1ZSAoYmVmb3JlIGNvbnZlcnNpb24pCi0kdGFyZ2V0ICAtIFRoZSByZXN1bHQgb2YgYSBkYXRhIGNvbnZlcnNpb24KLSR0eXBlICAgIC0gVGhlIEMgZGF0YXR5cGUgdXNlZCBpbiB0aGUgdHlwZW1hcAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgcGxhY2Vob2xkZXJzIGdldCBmaWxsZWQgaW4gYnkgYXBwcm9wcmlhdGUgdmFsdWVzIHdoZW4gU1dJRyBnZW5lcmF0ZXMgd3JhcHBlciBjb2RlLlRodXMsIGEgbW9yZSBjb21wbGljYXRlZCB0eXBlbWFwIHNwZWNpZmljYXRpb24gbWlnaHQgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIENvbnZlcnQgYSB2YXJpZXR5IG9mIGludGVnZXIgdHlwZXMgZnJvbSBUY2wgdG8gQwotJXR5cGVtYXAodGNsOCxpbikgaW50LAotICAgICAgICAgICAgICAgICAgc2hvcnQsCi0gICAgICAgICAgICAgICAgICBsb25nLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgCi17Ci0gICAgICBpbnQgdGVtcDsKLSAgICAgIGlmIChUY2xfR2V0SW50RnJvbU9iaihpbnRlcnAsICRzb3VyY2UsICZhbXA7dGVtcCkgPT0gVENMX0VSUk9SKSB7Ci0gICAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgICAgICR0YXJnZXQgPSAoJHR5cGUpIHRlbXA7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUF0IHRoaXMgcG9pbnQsICBhc3N1bWluZyB0aGF0IHlvdSdyZSBub3QgY29tcGxldGVseSBjb25mdXNlZCwgeW91IG1heSBiZSB3b25kZXJpbmcgaG93IHRoZSB0eXBlbWFwIHN5c3RlbSBpcyByZWFsbHkgaW50ZW5kZWQgdG8gd29yay4gICAgQWx0aG91Z2ggbWFueSBvZiB0aGUgZGV0YWlscyBhYm91dCB0eXBlbWFwcyBoYXZlIGJlZW4gb21pdHRlZCBoZXJlLCB0aGUgdW5kZXJseWluZyBpZGVhIGJlaGluZCB0eXBlbWFwcyBpcyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBzcGVjaWFsIHByb2Nlc3NpbmcgcnVsZXMgaW4gYWR2YW5jZSBhbmQgdXNlIHRoZW0gaW4gYW4gaW50ZXJmYWNlIGJ5IHNpbXBseSBmb2xsb3dpbmcgYSBuYW1pbmcgY29udmVudGlvbi4gICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byB3cmFwIHRoZSBDIG1hdGggbGlicmFyeSB3aXRoIHNvbWUgYWRkZWQgZXJyb3IgY2hlY2tpbmcsIGl0IG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIG1hdGgKLSV7Ci0jaW5jbHVkZSAmbHQ7bWF0aC5oJmd0OwotJX0KLQotdHlwZW1hcCh0Y2w4LGNoZWNrKSBkb3VibGUgcG9zaXRpdmUgeyAuLi4gfQotdHlwZW1hcCh0Y2w4LGNoZWNrKSBkb3VibGUgbm9ubmVnYXRpdmUgeyAuLi4gfQotdHlwZW1hcCh0Y2w4LGNoZWNrKSBkb3VibGUgbm9uemVybyB7IC4uLiB9Ci0KLS4uLgotLy8gTm93IGxpc3QgQU5TSSBDIGRlY2xhcmF0aW9ucwotZG91YmxlIHNpbihkb3VibGUpOwotZG91YmxlIGNvcyhkb3VibGUpOwotZG91YmxlIGxvZyhkb3VibGUgcG9zaXRpdmUpOwotZG91YmxlIGxvZzEwKGRvdWJsZSBwb3NpdGl2ZSk7Ci1kb3VibGUgc3FydChkb3VibGUgbm9ubmVnYXRpdmUpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHdvcmtpbmcgd2l0aCBtaXhlZCBTV0lHL0MgaGVhZGVyIGZpbGVzLCB0aGlzIGFycmFuZ2VtZW50IGFsbG93cyBhIGZpbGUgdG8gYmUgYWNjZXB0YWJsZSB0byBib3RoIFNXSUcgYW5kIHRoZSBDIGNvbXBpbGVyIChwcm92aWRlZCB0aGF0IHRoZSBTV0lHIGRpcmVjdGl2ZXMgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgb2YgY291cnNlKS4gICBJdCBhbHNvIGVuY291cmFnZXMgaGVhZGVyIGZpbGVzIGFuZCBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgdG8gdXNlIGEgY29uc2lzdGVudCBuYW1pbmcgc2NoZW1lIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgZnVuY3Rpb24gYXJndW1lbnRzLjxwPgotPGEgbmFtZT0ibjIyIj48L2E+PGgzPiBFeHRlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQgdHlwZW1hcHMgaXMgcHJvdmlkZWQgaW4gdGhlIFNXSUcgVXNlcnMgTWFudWFsLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNoYXB0ZXIsIHlvdSBzaG91bGQga25vdyB0aGF0IHR5cGVtYXBzIGV4aXN0IGFuZCB0aGF0IHRoZXkgYXJlIG9mdGVuIHVzZWQgYmVoaW5kIHRoZSBzY2VuZXMgdG8gcGVyZm9ybSBtYW55IG1hZ2ljYWwgdGFza3MuICAgQXMgaXQgdHVybnMgb3V0LCBhIG51bWJlciBvZiB1c2VmdWwgdHlwZW1hcHMgYXJlIGluY2x1ZGVkIGluIHRoZSBTV0lHIGxpYnJhcnktLS1zcGFyaW5nIHlvdSB0aGUgdHJvdWJsZSBvZiB3cml0aW5nIHRoZW0gYnkgaGFuZCAoYnV0LCBtb3JlIGFib3V0IHRoYXQgaW4gYSBsaXR0bGUgYml0KS48L2gzPgotPGEgbmFtZT0ibjMiPjwvYT48aDI+IFVzaW5nIFNXSUc8L2gyPgotTm93IHRoYXQgeW91J3ZlIGhhZCBhIHF1aWNrIHRvdXIgb2YgdGhlIFNXSUcgY29tcGlsZXIsIGl0J3MgdGltZSB0byBzdGFydCB1c2luZyBpdC4gICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgb2YgdGhlIHRlY2huaXF1ZXMgKGFuZCB0cmlja3MpICB0aGF0IGFyZSBjb21tb25seSB1c2VkIHRvIGJ1aWxkIFRjbCBpbnRlcmZhY2VzIHRvIEMvQysrIGNvZGUuICAgIFJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gY292ZXIgZXZlcnkgcG9zc2libGUgc2l0dWF0aW9uLCB0aGlzIHNlY3Rpb24gY292ZXJzIG1hbnkgb2YgdGhlIG1vc3QgY29tbW9uIHByb2JsZW1zIGFuZCBzb2x1dGlvbnMuICAgIEhvd2V2ZXIsIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSB0aGF0IFNXSUcgcHJvdmlkZXMsIHRoZXJlIGlzIHVzdWFsbHkgbW9yZSB0aGFuIG9uZSB3YXkgdG8gZG8gaXQgKGp1c3Qgc29tZXRoaW5nIHRvIGtlZXAgaW4gbWluZCk8cD4KLTxhIG5hbWU9Im4yMyI+PC9hPjxoMz4gUHJlcGFyaW5nIHRvIFNXSUc8L2gzPgotVXNpbmcgU1dJRyBnZW5lcmFsbHkgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBzdGVwczo8cD4KLTxwPgotPHVsPgotPGxpPkdyYWIgYSBoZWFkZXIgZmlsZS4KLTxsaT5UdXJuIHRoZSBoZWFkZXIgZmlsZSBpbnRvIGEgU1dJRyBpbnRlcmZhY2UgZmlsZSBhbmQgdHdlYWsgaXQgaWYgbmVjZXNzYXJ5LgotPGxpPlJ1biBTV0lHIGFuZCBtYWtlIGEgVGNsIGludGVyZmFjZS4KLTwvdWw+Ci08cD4KLTxwPgotSW4gYWRkaXRpb24gdG8gcHJlcGFyaW5nIGFuIGlucHV0IGZpbGUsIHlvdSBtYXkgbmVlZCB0byBlbGltaW5hdGUgdGhlIDx0dD5tYWluKCk8L3R0PiBmdW5jdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBDL0MrKyBhcHBsaWNhdGlvbi4gICAgU2NyaXB0aW5nIGxhbmd1YWdlcyBwcm92aWRlIHRoZWlyIG93biBtYWluKCkgdGhhdCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gICAgVG8gZWxpbWluYXRlIDx0dD5tYWluKCk8L3R0PiwgeW91IGNhbiBlaXRoZXIgb21pdCBpdCB3aGVuIHlvdSBjb21waWxlIHRoZSBDIGNvZGUgb3Igc2ltcGx5IHJlZGVmaW5lIHRoZSBzeW1ib2wgc3VjaCBhcyA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIGNjIC1jIC1EbWFpbj1teW1haW4gbWFpbi5jCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUZpbmFsbHksIFNXSUcgaXMgbm90IGEgZnVsbCBDL0MrKyBjb21waWxlciBhbmQgbWF5IG5vdCBzdXBwb3J0IGNlcnRhaW4gZmVhdHVyZXMuICAgU1dJRyB3aWxsIHJlcG9ydCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbiB0aGVzZSBjYXNlcy4gICBUbyBlbGltaW5hdGUgdGhlIHByb2JsZW1zLCB5b3UgbWF5IGhhdmUgdG8gdHdlYWsgIHRoZSBTV0lHIGlucHV0IGZpbGUgc29tZXdoYXQuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2lmbmRlZiBTV0lHCi1pbnQgcHJpbnRmKGNoYXIgKmZtdCwgLi4uKTsgICAgICAgLy8gdmFyYWdzIG5vdCBzdXBwb3J0ZWQgYnkgU1dJRwotI2Vsc2UKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjI0Ij48L2E+PGgzPiBJbnRlcmZhY2UgQnVpbGRpbmcgQ29uc2lkZXJhdGlvbnM8L2gzPgotTWFueSB1c2VycyBhcmUgc3VycHJpc2VkIHRvIGZpbmQgb3V0IGhvdyBlYXN5IGl0IGlzIHRvIHVzZSBTV0lHLiAgSG93ZXZlciwgdGhpcyBkb2Vzbid0IG1lYW4gdGhhdCB5b3Ugd2lsbCBnZXQgYSBnb29kIFRjbCBpbnRlcmZhY2Ugb24gdGhlIGZpcnN0IHRyeS4gICBJbiBmYWN0LCB0aGVyZSBhcmUgYSBmZXcgdGhpbmdzIHRvIGtlZXAgaW4gbWluZDxwPgotPHA+Ci08dWw+Ci08bGk+U1dJRyBtYXkgZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIHRoYXQgaXMgYXdrd2FyZCBvciB1bnVzYWJsZS4gICBUaGlzIGNhbiBiZSBhdm9pZGVkLCBidXQgaXQgbWF5IHJlcXVpcmUgYSBsaXR0bGUgbW9yZSB3b3JrIChzdGF5IHR1bmVkKS4KLTxsaT5JdCBpcyBvZnRlbiB1bm5lY2Vzc2FyeSB0byB3cmFwIGV2ZXJ5dGhpbmcgaW4gYSBodWdlIGxpYnJhcnkuICBJZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIHNtYWxsIHN1YnNldCBvZiBhIGxpYnJhcnksIGl0IG1heSBtYWtlIG1vcmUgc2Vuc2UgdG8gc2ltcGx5IHdyYXAgdGhvc2UgcGllY2VzLiAKLTxsaT5Ob3QgYWxsIEMgZGVjbGFyYXRpb25zIGNhbiBiZSBlZmZlY3RpdmVseSB0cmFuc2xhdGVkIGludG8gYSBzY3JpcHRpbmcgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBwb2ludGVycyB0byBmdW5jdGlvbnMgYW5kIEMrKyB0ZW1wbGF0ZXMgbWF5IG5vdCBtYWtlIG11Y2ggc2Vuc2Ugd2hlbiB3b3JraW5nIHdpdGggVGNsLiAgQWx0aG91Z2ggaXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIHRvIGhhbmRsZSBzdWNoIHNpdHVhdGlvbnMsIGl0IG1heSByZXF1aXJlIGEgbGl0dGxlIG1vcmUgd29yay4KLTxsaT5TV0lHIGlzIG5vdCBhIHN1YnN0aXR1dGUgZm9yIGRlc2lnbi4gICBHZW5lcmFsbHkgc3BlYWtpbmcsIHlvdSB3aWxsIGdldCBiZXR0ZXIgcmVzdWx0cyBieSB0aGlua2luZyBhYm91dCB0aGUgVGNsIHVzZXIgaW50ZXJmYWNlIHRvIHlvdXIgQy9DKysgbGlicmFyaWVzIGluIGFkdmFuY2UuICAgSG93ZXZlciwgb25lIG9mIFNXSUcncyBtb3N0IHBvd2VyZnVsIGZlYXR1cmVzIGlzIGl0cyBhYmlsaXR5IHRvIGF0dGFjaCB0byBleGlzdGluZyBjb2RlLS1yZWdhcmRsZXNzIG9mIHRoZSBleGlzdGluZyBkZXNpZ24gKGZvciBiZXR0ZXIgb3IgZm9yIHdvcnNlKS4KLTxsaT5TV0lHIG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIGV2ZXJ5IFRjbC9UayBwcm9qZWN0LiAgIEZvciBleGFtcGxlLCB5b3UgcHJvYmFibHkgd291bGRuJ3Qgd3JpdGUgYSBUayB3aWRnZXQgdXNpbmcgU1dJRy4gICBJZiBjYWxsaW5nIFRjbC9UayBmcm9tIEMgaXMgeW91ciBnYW1lLCB5b3UgbWlnaHQgaGF2ZSBiZXR0ZXIgbHVjayB1c2luZyBhIHRvb2wgc3VjaCBhcyBFVC4gICBMaWtld2lzZSwgYSB2YXJpZXR5IG9mIG9iamVjdC1vcmllbnRlZCBUY2wgZXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlIHRoYXQgbWF5IGJlIGJldHRlciBzdWl0ZWQgdG8gY2VydGFpbiBhcHBsaWNhdGlvbnMuICBJbiBvdGhlciB3b3JkcywgeW91ciBtaWxlYWdlIHdpbGwgdmFyeS4KLTwvdWw+Ci08YSBuYW1lPSJuMjUiPjwvYT48aDM+IENyZWF0aW5nIGFuZCBEZXN0cm95aW5nIFNpbXBsZSBPYmplY3RzPC9oMz4KLVNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gbWFudWZhY3R1cmUgdmFyaW91cyBDL0MrKyBvYmplY3RzIGZyb20gYSBUY2wgaW50ZXJmYWNlLiAgSW4gQywgb2JqZWN0cyBhcmUgZWFzaWx5IGNvbnN0cnVjdGVkIHVzaW5nIG1hbGxvYygpIG9yIG5ldywgYnV0IFRjbCBuZWVkcyBhIGxpdHRsZSBleHRyYSBoZWxwLiAgIFRodXMsIG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gb2Z0ZW4gcmVxdWlyZXMgdGhlIHVzZSBvZiBoZWxwZXIgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0lewotI2luY2x1ZGUgInZlY3Rvci5oIgotJX0KLQotLy8gTm93IGRlZmluZSBzb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nL2Rlc3Ryb3lpbmcgdmVjdG9ycwotJWlubGluZSAlewotVmVjdG9yICpuZXdfVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsKLSAgICAgVmVjdG9yICp2ID0gKFZlY3RvciAqKSBtYWxsb2Moc2l6ZW9mKFZlY3RvcikpOwotICAgICB2LSZndDt4ID0geDsKLSAgICAgdi0mZ3Q7eSA9IHk7Ci0gICAgIHYtJmd0O3ogPSB6OwotICAgICByZXR1cm4gdjsKLX0KLQotdm9pZCBkZWxldGVfVmVjdG9yKFZlY3RvciAqdikgewotICAgICBmcmVlKHYpOwotfQotJX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gd3JpdGluZyBoZWxwZXIgZnVuY3Rpb25zIGlzIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSBDKysgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZQotJXsKLSNpbmNsdWRlICJ2ZWN0b3IuaCIKLSV9Ci0KLXN0cnVjdCBWZWN0b3IgewotICAgIFZlY3RvcigpOwotICAgflZlY3RvcigpOwotICAgIGRvdWJsZSB4LHksejsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgYXBwcm9hY2ggd29ya3MgZnJvbSBib3RoIEMgYW5kIEMrKy4gIEluIHRoZSBjYXNlIG9mIEFOU0kgQywgU1dJRyB3aWxsIHNpbXBseSBjcmVhdGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgYXJlIG1hcHBlZCBvbnRvIDx0dD5tYWxsb2MoKTwvdHQ+IGFuZCA8dHQ+ZnJlZSgpPC90dD4uPHA+Ci08YSBuYW1lPSJuMjYiPjwvYT48aDM+IEFycmF5czwvaDM+Ci1NYW5pcHVsYXRpbmcgYXJyYXlzIGlzIGNvbW1vbiBwcmFjdGljZSBpbiBtYW55IEMgYXBwbGljYXRpb25zLiAgQyBhcnJheXMgY2FuIGFsc28gYmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB1c2Ugb2YgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBTV0lHIGhlbHBlciBmdW5jdGlvbnMgZm9yIGFycmF5cwotJWlubGluZSAlewotLyogQ3JlYXRlIGFuIGFycmF5ICovCi1kb3VibGUgKmRvdWJsZV9hcnJheShpbnQgc2l6ZSkgewotICAgIHJldHVybiAoZG91YmxlICopIG1hbGxvYyhzaXplKnNpemVvZihkb3VibGUpKTsKLX0KLQotLyogR2V0IGEgdmFsdWUgZnJvbSBhbiBhcnJheSAqLwotZG91YmxlIGRvdWJsZV9nZXQoZG91YmxlICphLCBpbnQgaW5kZXgpIHsKLSAgICAgcmV0dXJuIGFbaW5kZXhdOwotfQotLyogU2V0IGEgdmFsdWUgaW4gdGhlIGFycmF5ICovCi1kb3VibGUgZG91YmxlX3NldChkb3VibGUgKmEsIGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgIHJldHVybiAoYVtpbmRleF0gPSB2YWx1ZSk7Ci19Ci0lfQotJW5hbWUoZG91YmxlX2Rlc3Ryb3kpIHZvaWQgZnJlZSh2b2lkICopOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Gcm9tIFRjbCwgdGhlc2UgZnVuY3Rpb25zIHdvdWxkIGJlIGNhbGxlZCBleHBsaWNpdGx5IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCBkIFthcnJheV9kb3VibGUgMTAwXSAgICAgICAgICAgICA7IyBDcmVhdGUgMTAwIGRvdWJsZXMKLSUgcHV0cyAkZAotXzEwMDQ1ZjhfZG91YmxlX3AKLSUgZm9yIHtzZXQgaSAwfSB7JGkgJmx0OyAxMDB9IHtpbmNyIGl9IHsgIAotICAgICAgZG91YmxlX3NldCAkZCAkaSAkaSAgICAgICAgICAgICAgOyMgU2V0IGEgdmFsdWUKLX0KLSUgcHV0cyBbZG91YmxlX2dldCAkZCA1MF0gICAgICAgICAgICAgIDsjIEdldCBhIHZhbHVlCi01MC4wCi0lIGRvdWJsZV9kZXN0cm95ICRkICAgICAgICAgICAgICAgICAgICA7IyBEZXN0cm95IHRoZSBhcnJheQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBhcnJheSBpcyBzaW1wbHkgbWFuYWdlZCBhcyBhIHBvaW50ZXIgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCB0byBhbnkgQyBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBkb3VibGUgKi4gICAgR2VuZXJhbGx5IHNwZWFraW5nLCB0aGlzIGlzIGEgZ29vZCBhcHByb2FjaCBpZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCB2ZXJ5IGxhcmdlIEMgYXJyYXlzIHNpbmNlIHRoZXkgY2FuIGJlIGNyZWF0ZWQgYW5kIHBhc3NlZCBhcm91bmQgd2l0aG91dCBhbnkgZGF0YSBjb3B5aW5nLjxwPgotPHA+Ci1TV0lHIHByb3ZpZGVzIGEgbGlicmFyeSBmaWxlIDx0dD5hcnJheS5pPC90dD4gdGhhdCBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIGZvciA8dHQ+aW50PC90dD4sIDx0dD5mbG9hdDwvdHQ+LCA8dHQ+ZG91YmxlPC90dD4sIGFuZCA8dHQ+Y2hhciAqPC90dD4gZGF0YXR5cGVzLiAgICBUbyB1c2UgdGhpcyBsaWJyYXJ5LCBzaW1wbHkgcGxhY2UgdGhlIGA8dHQ+JWluY2x1ZGUgYXJyYXkuaTwvdHQ+JyBkaXJlY3RpdmUgaW50byB5b3VyIGludGVyZmFjZSBmaWxlLjxwPgotPHA+Ci1BIGNvbW1vbiBxdWVzdGlvbiB0aGF0IGFyaXNlcyB3aXRoIGFycmF5cyBpcyAiY2FuIEkgY29udmVydCBhIFRjbCBsaXN0IGludG8gYSBDIGFycmF5PyIgIEFsdGhvdWdoIHRoZSBwb2ludGVyIG1vZGVsIGlzIGFkZXF1YXRlIGZvciBtYW55ICBzaXR1YXRpb25zLCBpdCBtYXkgbWFrZSBtb3JlIHNlbnNlIHRvIHdvcmsgd2l0aCBUY2wgbGlzdHMgaW4gY2VydGFpbiBjYXNlcy4gIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB3YXlzIHRvIGhhbmRsZSB0aGlzLiAgRmlyc3QsIHlvdSBjYW4gd3JpdGUgZnVuY3Rpb25zIGluIFRjbCB0byBjb252ZXJ0IGEgbGlzdCB0byBhIHBvaW50ZXIuICAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgVGNsIGZ1bmN0aW9ucyBmb3IgY29udmVydGluZyBhIFRjbCBsaXN0IHRvIGEgQyBhcnJheQotcHJvYyBEb3VibGVMaXN0VG9BcnJheSB7bH0gewotICAgIHNldCBsZW5ndGggW2xsZW5ndGggJGxdCi0gICAgc2V0IGEgW2RvdWJsZV9hcnJheSAkbGVuZ3RoXQotICAgIHNldCBpIDAKLSAgICBmb3JlYWNoIGl0ZW0gJGwgewotICAgICAgICBkb3VibGVfc2V0ICRhICRpICRpdGVtCi0gICAgICAgIGluY3IgaSAxCi0gICAgfQotICAgIHJldHVybiBhCi19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpdGhpbiBhIFRjbCBzY3JpcHQsIHlvdSB3b3VsZCBub3cgZG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c2V0IGEgW0RvdWJsZUxpc3RUb0FycmF5IHsyLjMgNC41IDAuNSAtMTMuMH1dICAgIDsjIENyZWF0ZSBhbiBhcnJheQotZm9vICRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIENhbGwgYSBDIGZ1bmN0aW9uCi1kb3VibGVfZGVzdHJveSAkYQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRlcm5hdGl2ZWx5LCAgaXQgaXMgcG9zc2libGUgdG8gdXNlIHR5cGVtYXBzIGFzIGEgY29udmVyc2lvbiBtZWNoYW5pc20uICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewotICAgICAgY2hhciAqKml0ZW1zOwotICAgICAgaW50ICBpdGVtYyxpOwotICAgICAgaWYgKFRjbF9TcGxpdExpc3QoaW50ZXJwLCRzb3VyY2UsJmFtcDtpdGVtYywmYW1wO2l0ZW1zKSA9PSBUQ0xfRVJST1IpIHsKLSAgICAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgICAgIH0KLSAgICAgIGlmIChpdGVtYyAhPSAkZGltMCkgewotICAgICAgICAgICBpbnRlcnAtJmd0O3Jlc3VsdCA9ICJBcnJheSBzaXplIG1pc21hdGNoISI7Ci0gICAgICAgICAgIGZyZWUoaXRlbXMpOwotICAgICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgICAgfQotICAgICAgZm9yIChpID0gMDsgaSAmbHQ7IGl0ZW1jOyBpKyspIHsKLSAgICAgICAgICB0ZW1wW2ldID0gYXRvZihpdGVtc1tpXSk7Ci0gICAgICB9Ci0gICAgICAkdGFyZ2V0ID0gdGVtcDsKLSAgICAgIGZyZWUoaXRlbXMpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRob3VnaCB0aGlzIG1pZ2h0IHRha2UgYSBsaXR0bGUgdGltZSB0byBkaWdlc3QgKGNvbnNpZGVyaW5nIG91ciBsaW1pdGVkIGRpc2N1c3Npb24gb2YgdHlwZW1hcHMpLCB3aGVuIGdpdmVuIGEgQyBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcsPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBmb28gKGRvdWJsZSBhWzRdKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotdGhlIHR5cGVtYXAgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZnJvbSBUY2wgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Zm9vIHsgMi4zIDQuNSAwLjUgLTEuMzAgfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JZiB0aGUgbGlzdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGRvZXMgbm90IG1hdGNoIHRoZSBDIGFycmF5IHNpemUsIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLiAgTmVlZGxlc3MgdG8gc2F5LCB0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIHdheXMgdG8gbWFuYWdlIGFycmF5cyBkZXBlbmRpbmcgb24gdGhlIHByb2JsZW0gYXQgaGFuZCBhbmQgeW91ciBwZXJzb25hbCBwcmVmZXJlbmNlLjxwPgotPGEgbmFtZT0ibjI3Ij48L2E+PGgzPiBPdXRwdXQgQXJndW1lbnRzPC9oMz4KLVNvbWV0aW1lcyBDIGZ1bmN0aW9ucyByZXR1cm4gcmVzdWx0cyBpbiBvbmUgb2YgdGhlaXIgYXJndW1lbnRzIHN1Y2ggYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkgewotICAgICAgKmMgPSBhK2I7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBvdXRwdXQgYXJndW1lbnQgbWFrZXMgdGhpcyBhIGxpdHRsZSB0cmlja3kgdG8gaGFuZGxlIGZyb20gVGNsLCBidXQgdGhlcmUgYXJlIHNldmVyYWwgdGVjaG5pcXVlcy4gIFRoYXQgY2FuIGJlIHVzZWQuICAgT25lIGFwcHJvYWNoIGlzIHRvIHdyaXRlIGZ1bmN0aW9ucyB0aGF0IG1hbnVmYWN0dXJlIGEgYGRvdWJsZScgYW5kIHBhc3MgaXQgdG8gdGhlIEMgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWlubGluZSAlewotZG91YmxlICpjcmVhdGVfZG91YmxlKGRvdWJsZSB2YWwpIHsKLSAgICAgZG91YmxlICpkID0gKGRvdWJsZSAqKSBtYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgICAqZCA9IHZhbDsKLSAgICAgIHJldHVybiBkOwotfQotZG91YmxlIGdldF9kb3VibGUoZG91YmxlICpkKSB7Ci0gICAgIHJldHVybiAqZDsKLX0KLWRvdWJsZSBzZXRfZG91YmxlKGRvdWJsZSAqZCwgZG91YmxlIHZhbCkgewotICAgICByZXR1cm4gKCpkID0gdmFsKTsKLX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgZnJvbSBUY2wsIHlvdSB3b3VsZCBkbyB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCByZXN1bHQgW2NyZWF0ZV9kb3VibGUgMC4wXQotJSBhZGQgNC41IDkgJHJlc3VsdCAgICAgICAgICAgICAgICAgICAgICA7IENhbGwgb3VyIEMgZnVuY3Rpb24KLSUgcHV0cyBbZ2V0X2RvdWJsZSAkcmVzdWx0XQotMTMuNQotJQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JZiB3b3JraW5nIHdpdGggQyBidWlsdC1pbiBkYXRhdHlwZXMsIGl0IG1heSBiZSBlYXNpZXIgdG8gdXNlIHRoZSBTV0lHIHBvaW50ZXIgbGlicmFyeSBieSBpbmNsdWRpbmcgdGhlIGZpbGUgYDx0dD5wb2ludGVyLmk8L3R0PicgaW4geW91ciBpbnRlcmZhY2UuICAgVGhlIHBvaW50ZXIgbGlicmFyeSBhZGRzIHNldmVyYWwgbmV3IGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHBvaW50ZXJzIHRvIHZhcmlvdXMgYnVpbHQtaW4gZGF0YXR5cGVzIGFuZCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCByZXN1bHQgW3B0cmNyZWF0ZSBkb3VibGVdICAgICAgOyAjIENyZWF0ZSBhIGRvdWJsZQotJSBhZGQgNC41IDkgJHJlc3VsdCAgICAgICAgICAgICAgICAgIAotJSBwdXRzIFtwdHJ2YWx1ZSAkcmVzdWx0XSAgICAgICAgICAgIDsgIyBEZXJlZmVyZW5jZSB0aGUgcmVzdWx0Ci0xMy41Ci0lIHB0cmZyZWUgJHJlc3VsdAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1GaW5hbGx5LCBzaW1wbGUgb3V0cHV0IGFyZ3VtZW50cyBjYW4gYmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB1c2Ugb2YgdHlwZW1hcHMuICAgVGhpcyBjYW4gYmUgZG9uZSBieSBpbmNsdWRpbmcgdGhlIGZpbGUgYDx0dD50eXBlbWFwcy5pPC90dD4nIGluIHlvdXIgaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotJWluY2x1ZGUgdHlwZW1hcHMuaQotCi0vLyBBcHBseSBhbiBvdXRwdXQgcnVsZSB0byB0aGUgb3V0cHV0IGFyZ3VtZW50Ci0lYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKnJlc3VsdCB9OwotCi0vLyBOb3cgZGVjbGFyZSB0aGUgZnVuY3Rpb24KLXZvaWQgYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCByZXN1bHQgW2FkZCA0LjUgOV0KLSUgcHV0cyAkcmVzdWx0Ci0xMy41Ci0lCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4yOCI+PC9hPjxoMz4gV3JhcHBpbmcgUHJlcHJvY2Vzc29yIE1hY3JvczwvaDM+Ci1NYW55IEMgcHJvZ3JhbXMgdXNlIG1hY3JvcyBpbnN0ZWFkIG9mIGZ1bmN0aW9uIGNhbGxzIHRvIHBlcmZvcm0gc29tZSBvcGVyYXRpb24uICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2RlZmluZSBJbWFnZV93aWR0aChpbSkgIChpbS0mZ3Q7eHBpeGVscykKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBpcyB1bmFibGUgdG8gY3JlYXRlIFRjbCB3cmFwcGVycyBmb3IgbWFjcm9zIGJlY2F1c2UgdGhlcmUgaXMgbm8gdHlwZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUuICBIb3dldmVyLCB5b3UgY2FuIGNyZWF0ZSBhIHdyYXBwZXIgYnkgc2ltcGx5IGdpdmluZyBTV0lHIGEgZnVuY3Rpb24gcHJvdG90eXBlLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotJXsKLSNpbmNsdWRlICJoZWFkZXIuaCIKLSV9Ci0vLyBBIHdyYXBwZXIgZm9yIGEgQyBtYWNybwotdW5zaWduZWQgSW1hZ2Vfd2lkdGgoSW1hZ2UgKmltKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHByb3RvdHlwZSBnaXZlcyBTV0lHIHRoZSB0eXBlIGluZm9ybWF0aW9uIGl0IG5lZWRzIHRvIGdlbmVyYXRlIGEgd3JhcHBlci4gIE90aGVyd2lzZSwgdGhlIGZhY3QgdGhhdCB0aGUgImZ1bmN0aW9uIiBpcyByZWFsbHkgYSBtYWNybyBkb2Vzbid0IG1hdHRlci48cD4KLTxhIG5hbWU9Im4yOSI+PC9hPjxoMz4gT3ZlcmxvYWRpbmc8L2gzPgotQXMgb2YgdGhpcyB3cml0aW5nLCBTV0lHIGRvZXMgbm90IHN1cHBvcnQgQysrIG92ZXJsb2FkaW5nIG9mIGZ1bmN0aW9ucyBvciBvcGVyYXRvcnMuICBUbyByZXNvbHZlIG92ZXJsb2FkZWQgZnVuY3Rpb25zLCB0aGUgPHR0PiVuYW1lKCk8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgZm9vIHsKLXB1YmxpYzoKLSAgICAgIGZvbygpOwotJW5hbWUoY29weV9mb28pIGZvbyhmb28gJmFtcDtmKTsKLSAgICAgIC4uLgotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotT3ZlcmxvYWRlZCBvcGVyYXRvcnMgY2FuIGJlIGhhbmRsZWQgYnkgd3JpdGluZyBoZWxwZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVpbmxpbmUgJXsKLVZlY3RvciB2ZWN0b3JfYWRkKFZlY3RvciAmYW1wO2EsIFZlY3RvciAmYW1wO2IpIHsKLSAgICAgICByZXR1cm4gYStiOwotfQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSG93ZXZlciwgdGhlIHVzZSBvZiBvcGVyYXRvcnMgZnJvbSBUY2wgbWF5IHJlc3VsdCAgaW4gbWVtb3J5IGxlYWtzIGFuZCBvdGhlciBwcm9ibGVtcyB3aXRob3V0IHNvbWUgc3BlY2lhbCBjYXJlLiAgSW4gdGhlIGFib3ZlIGNhc2UsIFNXSUcgd291bGQgYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlIHRoZSByZXN1bHQgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gVGNsLiAgSXQgd291bGQgYmUgdXAgdG8geW91IHRvIGV4cGxpY2l0bHkgZnJlZSB0aGlzIG1lbW9yeSB3aGVuIHlvdSB3ZXJlIGRvbmUgd2l0aCBpdC4gIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnNldCByIFt2ZWN0b3JfYWRkICR2MSAkdjJdICAgICAgICA7IyBDcmVhdGVzIGEgbmV3IHZlY3RvcgotLi4uIHVzZSBpdCAuLi4KLWRlbGV0ZV9WZWN0b3IgJHIgICAgICAgICAgICAgICAgICA7IyBGcmVlIHRoZSByZXN1bHQKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotPGEgbmFtZT0ibjMwIj48L2E+PGgzPiBXb3JraW5nIHdpdGggb3RoZXIgVGNsIEV4dGVuc2lvbnM8L2gzPgotQWx0aG91Z2ggU1dJRyBnZW5lcmF0ZXMgZXZlcnl0aGluZyB5b3UgbmVlZCB0byBidWlsZCBhbiBpbnRlcmZhY2UsIGl0IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBvdGhlciBUY2wgZXh0ZW5zaW9ucy4gICAgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluaXRpYWxpemUgYW5vdGhlciBUY2wgbW9kdWxlIHdoZW4geW91ciBtb2R1bGUgaXMgbG9hZGVkLCB5b3UgY2FuIHdyaXRlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEluaXRpYWxpemUgQkxUIHdoZW4gbG9hZGVkCi0laW5pdCAlewotICAgICBpZiAoQmx0X0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLSAgICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgICB9Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JZiB5b3UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gc29tZSBUY2wgd3JhcHBlciBmdW5jdGlvbnMsIHRoZXNlIGNhbiBiZSBhZGRlZCB0byBhIFNXSUcgaW50ZXJmYWNlIHVzaW5nIHRoZSA8dHQ+JW5hdGl2ZTwvdHQ+IGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbmF0aXZlKGZvbykgaW50IGZvb193cmFwKFRjbF9JbnRlcnAgKiwgQ2xpZW50RGF0YSwgaW50LCBjaGFyICoqKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3Igc2ltcGx5PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW5hdGl2ZShmb28pIGZvb193cmFwOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGVzZSBkZWNsYXJhdGlvbnMgY3JlYXRlIGEgbmV3IFRjbCBjb21tYW5kIGBmb28nICB0aGF0IGlzIG1hcHBlZCBvbnRvIHRoZSBUY2wgd3JhcHBlciBmdW5jdGlvbiA8dHQ+Zm9vX3dyYXA8L3R0Pi48cD4KLTxhIG5hbWU9Im4zMSI+PC9hPjxoMz4gU1dJRyBQcmVwcm9jZXNzb3IgTWFnaWM8L2gzPgotVGhlIFNXSUcgY29tcGlsZXIgaW5jbHVkZXMgYSBmdWxsIEMgcHJlcHJvY2Vzc29yIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSB2YXJpZXR5IG9mIHVudXN1YWwgd2F5cy4gIEluIGZhY3QsIHRoZSBwcmVwcm9jZXNzb3IgY2FuIGJlIGFuIGV4dHJlbWVseSB1c2VmdWwgdG9vbCBmb3IgcXVpY2tseSBnZW5lcmF0aW5nIGhlbHBlciBmdW5jdGlvbnMgYW5kIG90aGVyIGFzcGVjdHMgb2YgYSBUY2wgaW50ZXJmYWNlLiAgICBPbmUgb2YgdGhlIG1vcmUgdXNlZnVsIGNhcGFiaWxpdGllcyBvZiB0aGUgcHJlcHJvY2Vzc29yIGlzIHRoZSA8dHQ+JWRlZmluZTwvdHQ+IGRpcmVjdGl2ZSB0aGF0IGxldHMgeW91IGRlZmluZSBjb21wbGljYXRlZCBtYWNyb3MuICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgY291bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHZhcmlldHkgb2YgYXJyYXkgaGVscGVyIGZ1bmN0aW9uczxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8gQXJyYXkgYWNjZXNzIGhlbHBlciBmdW5jdGlvbnMKLSVtb2R1bGUgYXJyYXkKLQotLy8gRGVmaW5lIGEgbWFjcm8gZm9yIGNyZWF0aW5nIGhlbHBlciBmdW5jdGlvbnMKLSVkZWZpbmUgQVJSQVkoVHlwZSxOYW1lKQotJWlubGluZSAlewotLyogQ3JlYXRlIGFuIGFycmF5ICovCi1UeXBlICogTmFtZSAjIyBfYXJyYXkgKGludCBzaXplKSB7Ci0gICAgIHJldHVybiAoVHlwZSAqKSBtYWxsb2Moc2l6ZW9mKCBUeXBlICkpOwotfQotLyogR2V0IGFuIGl0ZW0gKi8KLVR5cGUgTmFtZSAjIyBfZ2V0IChUeXBlICphLCBpbnQgaW5kZXgpIHsKLSAgICAgcmV0dXJuIGFbaW5kZXhdOwotfQotLyogU2V0IGFuIGl0ZW0gKi8KLVR5cGUgTmFtZSAjIyBfc2V0IChUeXBlICphLCBpbnQgaW5kZXgsIFR5cGUgdmFsdWUpIHsKLSAgICAgcmV0dXJuIChhW2luZGV4XSA9IHZhbHVlKTsKLX0KLS8qIERlbGV0ZSB0aGUgYXJyYXkgKi8KLXZvaWQgTmFtZSAjIyBfZGVzdHJveSAoVHlwZSAqYSkgewotICAgICBmcmVlKGEpOwotfQotJX0KLSVlbmRkZWYKLQotLy8gTm93IGNyZWF0ZSBhIGJ1bmNoIG9mIGhlbHBlciBmdW5jdGlvbnMKLUFSUkFZKGRvdWJsZSxkb3VibGUpCi1BUlJBWShmbG9hdCxmbG9hdCkKLUFSUkFZKGludCxpbnQpCi1BUlJBWShzaG9ydCxzaG9ydCkKLUFSUkFZKHVuc2lnbmVkIGludCwgdW5zaWduZWQpCi1BUlJBWShsb25nLCBsb25nKQotQVJSQVkoc3RydWN0IG5vZGUsIG5vZGUpCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNpbWlsYXIgdGVjaG5pcXVlcyBjYW4gYmUgdXNlZCB0byB3cmFwIEMrKyB0ZW1wbGF0ZXMgYW5kIHdvcmsgd2l0aCBvdGhlciBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMuICAgT2YgY291cnNlLCBpdCdzIGFsc28gcG9zc2libGUgdG8gY29uZnVzZSB5b3Vyc2VsZi48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBQdXR0aW5nIGl0IEFsbCBUb2dldGhlcjwvaDI+Ci1TbyBmYXIsIHlvdSBoYXZlIGJlZW4gZ2l2ZW4gYSBjcmFzaCBjb3Vyc2UgaW4gU1dJRyBhbmQgc29tZSBpbnRlcmZhY2UgYnVpbGRpbmcgdGVjaG5pcXVlcy4gIEluIHRoaXMgc2VjdGlvbiwgd2Ugd2lsbCBidWlsZCBhIFRjbCBpbnRlcmZhY2UgdG8gYSBDIGxpYnJhcnksIHdyaXRlIHNvbWUgc2NyaXB0cywgYW5kIHNob3cgaG93IHlvdSBjYW4gdXNlIFRjbCB0byBpbnRlcmFjdCB3aXRoIHRoZSBsaWJyYXJ5LiAgICAgSW4gdGhpcyBleGFtcGxlLCB3ZSB3aWxsIHVzZSB0aGUgZ2QtMS4yIGxpYnJhcnkgd3JpdHRlbiBieSBUaG9tYXMgQm91dGVsbCBhbmQgYXZhaWxhYmxlIGF0IHd3dy5ib3V0ZWxsLmNvbS4gICBnZCBpcyByZWxhdGl2ZWx5IHNpbXBsZSBhbmQgY2FuIGJlIHVzZWQgb24gYm90aCBVbml4IGFuZCBXaW5kb3dzIHBsYXRmb3JtcyAobWFraW5nIGl0IGEgZ29vZCBleGFtcGxlKS4gICBGdXJ0aGVybW9yZSwgdGhlcmUgYXJlIGFscmVhZHkgVGNsIGludGVyZmFjZXMgdG8gZ2QsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBjb21wYXJlIHRvIG90aGVyIGFwcHJvYWNoZXMgaWYgeW91IGFyZSBzbyBpbmNsaW5lZC48cD4KLTxhIG5hbWU9Im4zMiI+PC9hPjxoMz4gQSBCcmllZiBJbnRyb2R1Y3Rpb24gdG8gZ2Q8L2gzPgotZ2QgaXMgYSBDIGxpYnJhcnkgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBHSUYgaW1hZ2VzLiAgQSB2ZXJ5IHNpbXBsZSBleGFtcGxlIGluIEMgaXMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0jaW5jbHVkZSAmbHQ7Z2QuaCZndDsKLSNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotCi1pbnQgbWFpbigpIHsKLSAgICAgZ2RJbWFnZVB0ciBpbTsKLSAgICAgRklMRSAqb3V0OwotICAgICBpbnQgIGJsYWNrLCB3aGl0ZTsKLQotICAgICAvKiBDcmVhdGUgYW4gaW1hZ2UgKi8KLSAgICAgaW0gPSBnZEltYWdlQ3JlYXRlKDIwMCwyMDApOwotICAgICAKLSAgICAgLyogQWxsb2NhdGUgc29tZSBjb2xvcnMgKi8KLSAgICAgYmxhY2sgPSBnZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwwLDAsMCk7Ci0gICAgIHdoaXRlID0gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMjU1LDI1NSwyNTUpOwotICAKLSAgICAgLyogRHJhdyBhIGxpbmUgKi8KLSAgICAgZ2RJbWFnZUxpbmUoaW0sMjAsNTAsMTgwLDE0MCx3aGl0ZSk7Ci0KLSAgICAgLyogT3V0cHV0IHRoZSBpbWFnZSAqLwotICAgICBvdXQgPSBmb3BlbigidGVzdC5naWYiLCJ3YiIpOwotICAgICBnZEltYWdlR2lmKGltLG91dCk7Ci0gICAgIGZjbG9zZShvdXQpOwotCi0gICAgIC8qIENsZWFuIHVwICovCi0gICAgIGdkSW1hZ2VEZXN0cm95KGltKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSB2YXJpZXR5IG9mIHBsb3R0aW5nIHByaW1pdGl2ZXMgc3VjaCBhcyBsaW5lcywgY2lyY2xlcywgYm94ZXMsIGFuZCBmb250cyBhcmUgYWxzbyBhdmFpbGFibGUgdG8gbWFrZSBtb3JlIGNvbXBsaWNhdGVkIGltYWdlcy48cD4KLTxhIG5hbWU9Im4zMyI+PC9hPjxoMz4gQSBTaW1wbGUgU1dJRyBpbnRlcmZhY2U8L2gzPgotVG8gYnVpbGQgYSBUY2wgaW50ZXJmYWNlIHRvIGdkLCB3ZSBjYW4gc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIGludGVyZmFjZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBnZAotJXsKLSNpbmNsdWRlICZsdDtnZC5oJmd0OwotJX0KLQotLy8gSnVzdCBncmFiIHRoZSBnZC5oIGhlYWRlciBmaWxlCi0laW5jbHVkZSBnZC5oCi0KLS8vIFBsdXMgYSBmZXcgZmlsZSBJL08gZnVuY3Rpb25zICh0byBiZSBleHBsYWluZWQgc2hvcnRseSkKLUZJTEUgKmZvcGVuKGNoYXIgKmZpbGVuYW1lLCBjaGFyICptb2RlKTsKLXZvaWQgZmNsb3NlKEZJTEUgKmYpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3csIHlvdSBjYW4gY29tcGlsZSBhIG1vZHVsZSAoc2hvd24gZm9yIExpbnV4KTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSUgc3dpZyAtdGNsIGdkLmkKLU1ha2luZyB3cmFwcGVycyBmb3IgVGNsCi1nZC5oIDogTGluZSAzMS4gV2FybmluZy4gQXJyYXkgbWVtYmVyIHdpbGwgYmUgcmVhZC1vbmx5LgotZ2QuaCA6IExpbmUgMzIuIFdhcm5pbmcuIEFycmF5IG1lbWJlciB3aWxsIGJlIHJlYWQtb25seS4KLWdkLmggOiBMaW5lIDMzLiBXYXJuaW5nLiBBcnJheSBtZW1iZXIgd2lsbCBiZSByZWFkLW9ubHkuCi1nZC5oIDogTGluZSAzNC4gV2FybmluZy4gQXJyYXkgbWVtYmVyIHdpbGwgYmUgcmVhZC1vbmx5LgotZ2QuaCA6IExpbmUgNDAuIFdhcm5pbmcuIEFycmF5IG1lbWJlciB3aWxsIGJlIHJlYWQtb25seS4KLWdkLmggOiBMaW5lIDQxLiBXYXJuaW5nLiBBcnJheSBtZW1iZXIgd2lsbCBiZSByZWFkLW9ubHkuCi0lIGdjYyAtYyAtZnBpYyBnZF93cmFwLmMKLSUgZ2NjIC1zaGFyZWQgZ2Rfd3JhcC5vIC1vIGdkLnNvIC1sZ2QKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIHdhcm5pbmcgbWVzc2FnZXMgd2lsbCBiZSBleHBsYWluZWQgc2hvcnRseSBhbmQgY2FuIGJlIGlnbm9yZWQuICAgIE5vdywgeW91IGNhbiB3cml0ZSBhIHNpbXBsZSBUY2wgc2NyaXB0PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+bG9hZCAuL2dkLnNvIGdkCi0KLSMgQ3JlYXRlIGFuIGltYWdlCi1zZXQgaW0gW2dkSW1hZ2VDcmVhdGUgMjAwIDIwMF0KLQotIyBBbGxvY2F0ZSBjb2xvcnMKLXNldCBibGFjayBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDAgMCAwXQotc2V0IHdoaXRlIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMjU1IDI1NSAyNTVdCi0KLSMgRHJhdyBhIGxpbmUKLWdkSW1hZ2VMaW5lICRpbSAyMCA1MCAxODAgMTQwICR3aGl0ZQotCi0jIFdyaXRlIHRoZSBpbWFnZQotc2V0IG91dCBbZm9wZW4gdGVzdC5naWYgd2JdCi1nZEltYWdlR2lmICRpbSAkb3V0Ci1mY2xvc2UgJG91dAotCi0jIENsZWFuIHVwCi1nZEltYWdlRGVzdHJveSAkaW0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gYSBtYW5uZXIgb2Ygb25seSBhIGZldyBtaW51dGVzLCB3ZSBoYXZlIGJ1aWx0IGEgVGNsIGludGVyZmFjZSB0aGF0IHNlZW1zIHRvIHdvcmsuPHA+Ci08YSBuYW1lPSJuMzQiPjwvYT48aDM+IFVuZGVyc3RhbmRpbmcgdGhlIFdhcm5pbmcgTWVzc2FnZXM8L2gzPgotVGhlIHdhcm5pbmcgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IFNXSUcgd2VyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT50eXBlZGVmIHN0cnVjdCBnZEltYWdlU3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqKiBwaXhlbHM7Ci0gICAgICAgIGludCBzeDsKLSAgICAgICAgaW50IHN5OwotICAgICAgICBpbnQgY29sb3JzVG90YWw7Ci0gICAgICAgIGludCByZWRbZ2RNYXhDb2xvcnNdOyAgICAgICAgICAgICAgICAhIFdhcm5pbmcKLSAgICAgICAgaW50IGdyZWVuW2dkTWF4Q29sb3JzXTsgICAgICAgICAgICAgICEgV2FybmluZwotICAgICAgICBpbnQgYmx1ZVtnZE1heENvbG9yc107ICAgICAgICAgICAgICAgISBXYXJuaW5nCi0gICAgICAgIGludCBvcGVuW2dkTWF4Q29sb3JzXTsgICAgICAgICAgICAgICAhIFdhcm5pbmcKLSAgICAgICAgaW50IHRyYW5zcGFyZW50OwotICAgICAgICBpbnQgKnBvbHlJbnRzOwotICAgICAgICBpbnQgcG9seUFsbG9jYXRlZDsKLSAgICAgICAgc3RydWN0IGdkSW1hZ2VTdHJ1Y3QgKmJydXNoOwotICAgICAgICBzdHJ1Y3QgZ2RJbWFnZVN0cnVjdCAqdGlsZTsKLSAgICAgICAgaW50IGJydXNoQ29sb3JNYXBbZ2RNYXhDb2xvcnNdOyAgICAgICEgV2FybmluZwotICAgICAgICBpbnQgdGlsZUNvbG9yTWFwW2dkTWF4Q29sb3JzXTsgICAgICAgISBXYXJuaW5nCi0gICAgICAgIGludCBzdHlsZUxlbmd0aDsKLSAgICAgICAgaW50IHN0eWxlUG9zOwotICAgICAgICBpbnQgKnN0eWxlOwotICAgICAgICBpbnQgaW50ZXJsYWNlOwotfSBnZEltYWdlOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgbWVzc2FnZSAiQXJyYXkgbWVtYmVyIHdpbGwgYmUgcmVhZC1vbmx5IiBtZWFucyB0aGF0IFNXSUcga25vd3MgaG93IHRvIHJldHVybiB0aGUgdmFsdWUgb2YgYW4gYXJyYXkgZGF0YSBtZW1iZXIgKHRoZSB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQpLCBidXQgZG9lcyBub3Qga25vdyBob3cgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXJyYXkuICAgIEZyb20gVGNsLCB5b3Ugd2lsbCBzZWUgdGhlIGZvbGxvd2luZyBiZWhhdmlvcjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IGltIFtnZEltYWdlQ3JlYXRlIDIwMCAyMDBdCi1fODBiNTFlOF9nZEltYWdlUHRyCi0lIGdkSW1hZ2VfcmVkX2dldCAkaW0gICAgICAgICAgICAgOyAjIEdldCBhbiBhcnJheSBtZW1iZXIKLV84MGI1MWY4X2ludF9wCi0lIGdkSW1hZ2VfcmVkX3NldCAkaW0gMCAgICAgICAgICAgOyAjIFRyeSB0byBjaGFuZ2UgYSByZWFkLW9ubHkgbWVtYmVyCi1pbnZhbGlkIGNvbW1hbmQgbmFtZSAiZ2RJbWFnZV9yZWRfc2V0IgotJQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRob3VnaCBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IGFycmF5IHN0cnVjdHVyZSBtZW1iZXJzIGFzIHNob3duLCB5b3UgY291bGQgZG8gc28gdXNpbmcgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5IG9yIGhlbHBlciBmdW5jdGlvbnMuICAgRm9yIGV4YW1wbGUsPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC10Y2wgLWxwb2ludGVyLmkgZ2QuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIGluIFRjbDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IGltIFtnZEltYWdlQ3JlYXRlIDIwMCAyMDBdCi0lIGdkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSA1MCAyMDAgMTAwCi0lIGdkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAzNSAyMTAgNzUKLSUgc2V0IHIgW2dkSW1hZ2VfcmVkX2dldCAkaW1dCi1fODBiNTFmOF9pbnRfcAotJSBwdHJ2YWx1ZSAkciAwICAgICAgICAgICAgICAgICAgIDsjIEdldCByWzBdCi01MAotJSBwdHJ2YWx1ZSAkciAxICAgICAgICAgICAgICAgICAgIDsjIEdldCByWzFdCi0zNQotJSBwdHJzZXQgJHIgNzAgMSAgICAgICAgICAgICAgICAgIDsjIGNoYW5nZSByWzFdCi0lIHB0cnZhbHVlICRyIDEKLTcwCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PZiBjb3Vyc2UsIHlvdSBjb3VsZCBhbHNvIGVuZCB1cCBzaG9vdGluZyB5b3Vyc2VsZiBpbiB0aGUgZm9vdCBieSBtYW5pcHVsYXRpbmcgdGhpbmdzIGluIGJpemFycmUgd2F5cyAoU1dJRyBjZXJ0YWlubHkgd29uJ3Qgc3RvcCB5b3UgZnJvbSBkb2luZyB0aGlzKS48cD4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gV29ya2luZyB3aXRoIEZpbGVzPC9oMz4KLUluIG91ciBzaW1wbGUgaW50ZXJmYWNlIHdlIGluY2x1ZGVkIHR3byBmdW5jdGlvbnMgdG8gb3BlbiBhbmQgY2xvc2UgZmlsZXMuICAgIEEgdmFyaWV0eSBvZiBmdW5jdGlvbnMgaW4gdGhlIGdkIGxpYnJhcnkgcmVxdWlyZSB0aGUgdXNlIG9mIGEgPHR0PkZJTEUgKjwvdHQ+IGFyZ3VtZW50IHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Z2RJbWFnZVB0ciBnZEltYWdlQ3JlYXRlRnJvbUdpZihGSUxFICpmZCk7Ci1nZEltYWdlUHRyIGdkSW1hZ2VDcmVhdGVGcm9tR2QoRklMRSAqaW4pOwotZ2RJbWFnZVB0ciBnZEltYWdlQ3JlYXRlRnJvbVhibShGSUxFICpmZCk7Ci12b2lkIGdkSW1hZ2VHaWYoZ2RJbWFnZVB0ciBpbSwgRklMRSAqb3V0KTsKLXZvaWQgZ2RJbWFnZUdkKGdkSW1hZ2VQdHIgaW0sIEZJTEUgKm91dCk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUFuIGlkZWFsIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBUY2wgZmlsZSBoYW5kbGVzIGFzIDx0dD5GSUxFICo8L3R0PiBhcmd1bWVudHMuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIHJlcXVpcmVzIHlvdSB0byB1bnJhdmVsIGZpbGUgaGFuZGxlcyBhbmQgY29udmVydCB0aGVtIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgPHR0PkZJTEUgKjwvdHQ+IHN0cnVjdHVyZS0tYSB0YXNrIHRoYXQgaXMgbm90IGVhc2lseSBhY2NvbXBsaXNoZWQuICAgRm9yIHRoZSBwdXJwb3NlcyBvZiBxdWlja2x5IG1ha2luZyBhbiBpbnRlcmZhY2UsIGl0IGlzIG9mdGVuIGVhc2llciB0byBzaW1wbHkgaW5jbHVkZSBhIGZldyBzdXBwb3J0aW5nIGZ1bmN0aW9ucyBzdWNoIGFzIGZvcGVuKCkgYW5kIGZjbG9zZSgpLiAgVGhlc2UgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgdG8gY3JlYXRlIGZpbGVzIGZvciB1c2Ugd2l0aCB0aGUgbGlicmFyeS4gICBBbHRob3VnaCBmaWxlcyBjcmVhdGVkIHdpdGggdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgdGhlIHNhbWUgYXMgVGNsIGZpbGUgaGFuZGxlcywgdGhleSBhcmUgc3RpbGwgZWFzeSB0byB1c2UuPHA+Ci08YSBuYW1lPSJuMzYiPjwvYT48aDM+IFdyYXBwaW5nIE1hY3JvczwvaDM+Ci1UaGUgZ2QgbGlicmFyeSBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgbWFjcm9zIGZvciBhY2Nlc3NpbmcgdmFyaW91cyBpbWFnZSBhdHRyaWJ1dGVzLiAgUmF0aGVyIHRoYW4gbWFuaXB1bGF0aW5nIHRoZSBDIGRhdGEgc3RydWN0dXJlIGRpcmVjdGx5LCAgdXNlcnMgYXJlIGFkdmlzZWQgdG8gdXNlIHRoZXNlIG1hY3Jvcy48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jZGVmaW5lIGdkSW1hZ2VTWChpbSkgKChpbSktJmd0O3N4KQotI2RlZmluZSBnZEltYWdlU1koaW0pICgoaW0pLSZndDtzeSkKLSNkZWZpbmUgZ2RJbWFnZUNvbG9yc1RvdGFsKGltKSAoKGltKS0mZ3Q7Y29sb3JzVG90YWwpCi0jZGVmaW5lIGdkSW1hZ2VSZWQoaW0sIGMpICgoaW0pLSZndDtyZWRbKGMpXSkKLSNkZWZpbmUgZ2RJbWFnZUdyZWVuKGltLCBjKSAoKGltKS0mZ3Q7Z3JlZW5bKGMpXSkKLSNkZWZpbmUgZ2RJbWFnZUJsdWUoaW0sIGMpICgoaW0pLSZndDtibHVlWyhjKV0pCi0jZGVmaW5lIGdkSW1hZ2VHZXRUcmFuc3BhcmVudChpbSkgKChpbSktJmd0O3RyYW5zcGFyZW50KQotI2RlZmluZSBnZEltYWdlR2V0SW50ZXJsYWNlZChpbSkgKChpbSktJmd0O2ludGVybGFjZSkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyB3b24ndCB3cmFwIHRoZXNlIG1hY3JvcyBkaXJlY3RseSwgYnV0IHlvdSBjYW4gd3JpdGUgc29tZSBmdW5jdGlvbiBwcm90b3R5cGVzIHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcuIDxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUgZ2QKLSV7Ci0jaW5jbHVkZSAmbHQ7Z2QuaCZndDsKLSV9Ci0KLS8vIEp1c3QgZ3JhYiB0aGUgZ2QuaCBoZWFkZXIgZmlsZQotJWluY2x1ZGUgZ2QuaAotCi0vLyBDbGVhciB0aGUgcHJldmlvdXMgbWFjcm8gZGVmaW5pdGlvbnMgaW5jbHVkZWQgaW4gZ2QuaAotI3VuZGVmIGdkSW1hZ2VTWAotI3VuZGVmIGdkSW1hZ2VTWQotI3VuZGVmIGdkSW1hZ2VDb2xvcnNUb3RhbAotI3VuZGVmIGdkSW1hZ2VSZWQKLSN1bmRlZiBnZEltYWdlR3JlZW4KLSN1bmRlZiBnZEJsdWUKLSN1bmRlZiBnZEltYWdlR2V0VHJhbnNwYXJlbnQKLSN1bmRlZiBnZEltYWdlR2V0SW50ZXJsYWNlZAotCi0vLyBQcm92aWRlIFNXSUcgd2l0aCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUgbWFjcm9zCi1pbnQgZ2RJbWFnZVNYKGdkSW1hZ2VQdHIgaW0pOwotaW50IGdkSW1hZ2VTWShnZEltYWdlUHRyIGltKTsKLWludCBnZEltYWdlQ29sb3JzVG90YWwoZ2RJbWFnZVB0ciBpbSk7Ci1pbnQgZ2RJbWFnZVJlZChnZEltYWdlUHRyIGltLCBpbnQgYyk7Ci1pbnQgZ2RJbWFnZUdyZWVuKGdkSW1hZ2VQdHIgaW0sIGludCBjKTsKLWludCBnZEltYWdlQmx1ZShnZEltYWdlUHRyIGltLCBpbnQgYyk7Ci1pbnQgZ2RJbWFnZUdldFRyYW5zcGFyZW50KGdkSW1hZ2VQdHIgaW0pOwotaW50IGdkSW1hZ2VHZXRJbnRlcmxhY2VkKGdkSW1hZ2VQdHIgaW0pOwotCi0vLyBQbHVzIGEgZmV3IGZpbGUgSS9PIGZ1bmN0aW9ucwotRklMRSAqZm9wZW4oY2hhciAqZmlsZW5hbWUsIGNoYXIgKm1vZGUpOwotdm9pZCBmY2xvc2UoRklMRSAqZik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpdGhpbiBUY2wsIHRoZXNlIG1hY3JvcyBjYW4gbm93IGJlIHVzZWQganVzdCBsaWtlIG9yZGluYXJ5IGZ1bmN0aW9uczxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IGltIFtnZEltYWdlQ3JlYXRlIDIwMCAyMDBdCi0lIGdkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyMzMgNTAgNDAKLSUgZ2RJbWFnZVNYICRpbQotMjAwCi0lIGdkSW1hZ2VDb2xvcnNUb3RhbCAkaW0KLTEKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zNyI+PC9hPjxoMz4gV3JhcHBpbmcgdGhlIEZvbnRzPC9oMz4KLWdkIGlzIHBhY2thZ2VkIHdpdGggZml2ZSBkaWZmZXJlbnQgZm9udHMgdGhhdCBhcmUgdXNlZCB3aXRoIGZ1bmN0aW9ucyBzdWNoIGFzPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZAotZ2RJbWFnZUNoYXIoZ2RJbWFnZVB0ciBpbSwgZ2RGb250UHRyIGYsIGludCB4LCBpbnQgeSwgaW50IGMsIGludCBjb2xvcik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXdoZXJlIGdkRm9udFB0ciBpcyBhIHBvaW50ZXIgdG8gYSBmb250IHN0cnVjdHVyZS4gICAgIEVhY2ggZm9udCBpcyBkZWZpbmVkIGJ5IGEgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZGVmaW5lZCBpbiBhIHNlcGFyYXRlIGhlYWRlciBmaWxlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2lmbmRlZiBHREZPTlRTX0gKLSNkZWZpbmUgR0RGT05UU19IIDEKLQotLyogZ2Rmb250cy5oOiBicmluZ3MgaW4gdGhlIHNtYWxsZXIgb2YgdGhlIHR3byBwcm92aWRlZCBmb250cy4KLSAgICAgICAgQWxzbyBsaW5rIHdpdGggZ2Rmb250cy5jLiAqLwotCi0jaW5jbHVkZSAiZ2QuaCIKLQotLyogNngxMiBmb250IGRlcml2ZWQgZnJvbSBhIHB1YmxpYyBkb21haW4gZm9udCBpbiB0aGUgWAotICAgICAgICBkaXN0cmlidXRpb24uIE9ubHkgY29udGFpbnMgdGhlIDk2IHN0YW5kYXJkIGFzY2lpIGNoYXJhY3RlcnMsCi0gICAgICAgIHNvcnJ5LiBGZWVsIGZyZWUgdG8gaW1wcm92ZSBvbiB0aGlzLiAqLwotCi1leHRlcm4gZ2RGb250UHRyIGdkRm9udFNtYWxsOwotCi0jZW5kaWYKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVG8gbWFrZSB0aGUgYnVpbHQtaW4gZm9udHMgYXZhaWxhYmxlIHRvIG91ciBUY2wgaW50ZXJmYWNlLCB5b3UgbmVlZCB0byBtYWtlIHRoZSBmb250IHBvaW50ZXJzIGF2YWlsYWJsZS4gIFNpbmNlIHRoZSBmb250IGhlYWRlciBmaWxlcyBhcmUgZmFpcmx5IHNpbXBsZSwgdGhpcyBjYW4gYmUgZG9uZSBieSBzaW1wbHkgaW5jbHVkaW5nIHRoZSBoZWFkZXIgZmlsZXMgaW4gb3VyIFNXSUcgaW50ZXJmYWNlIHN1Y2ggYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gTWFrZSB0aGUgZ2QgZm9udHMgYXZhaWxhYmxlIGFzIHJlYWQtb25seSB2YXJpYWJsZXMKLSVyZWFkb25seQotJWluY2x1ZGUgImdkZm9udHQuaCIKLSVpbmNsdWRlICJnZGZvbnRzLmgiCi0laW5jbHVkZSAiZ2Rmb250bWIuaCIKLSVpbmNsdWRlICJnZGZvbnRsLmgiCi0laW5jbHVkZSAiZ2Rmb250Zy5oIgotJXJlYWR3cml0ZQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgZmFjdCB0aGF0IHRoZSBmb250cyBhcmUgZ2xvYmFsIHZhcmlhYmxlcyBwcmVzZW50cyB1cyB3aXRoIGEgc2xpZ2h0IGNvbXBsaWNhdGlvbi4gICBTV0lHIG5vcm1hbGx5IHRyaWVzIHRvIHVzZSB0aGUgVGNsIHZhcmlhYmxlIGxpbmtpbmcgbWVjaGFuaXNtLCBidXQgdGhpcyBvbmx5IHN1cHBvcnRzIHRoZSBiYXNpYyBkYXRhdHlwZXMgb2YgPHR0PmRvdWJsZTwvdHQ+LCA8dHQ+aW50PC90dD4sIGFuZCA8dHQ+Y2hhciAqPC90dD4uICBUbyBhY2Nlc3Mgb3RoZXIgdHlwZXMgKGluY2x1ZGluZyBwb2ludGVycyksIFNXSUcgZ2VuZXJhdGVzIGFjY2Vzc29yIGZ1bmN0aW9ucy4gIFRodXMsIGluIFRjbCwgdGhlc2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIGdkRm9udFRpbnlfZ2V0Ci1fNDAwZjY5NWNfZ2RGb250UHRyCi0lIGdkSW1hZ2VDaGFyICRpbSBbZ2RGb250VGlueV9nZXRdIDIwIDIwIEEgJHdoaXRlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNpbmNlIHRoaXMgY2FuIGJlIGEgbGl0dGxlIGF3a3dhcmQsIGl0IG1heSBtYWtlIG1vcmUgc2Vuc2UgdG8gd3JpdGUgYSBzaW1wbGUgVGNsIHNjcmlwdCB0byBmaXggdGhlIHByb2JsZW08cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGdkZm9udHMudGNsIDogRXh0cmFjdCB0aGUgZm9udHMgaW50byBUY2wgdmFyaWFibGVzCi1zZXQgZ2RGb250VGlueSAgICAgICBbZ2RGb250VGlueV9nZXRdCi1zZXQgZ2RGb250U21hbGwgICAgICBbZ2RGb250U21hbGxfZ2V0XQotc2V0IGdkRm9udE1lZGl1bUJvbGQgW2dkRm9udE1lZGl1bUJvbGRfZ2V0XQotc2V0IGdkRm9udExhcmdlICAgICAgW2dkRm9udExhcmdlX2dldF0KLXNldCBnZEZvbnRHaWFudCAgICAgIFtnZEZvbnRHaWFudF9nZXRdCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgeW91IHdvdWxkIGp1c3Qgd3JpdGUgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBTaW1wbGUgZ2Qgc2NyaXB0Ci1sb2FkIC4vZ2Quc28KLXNvdXJjZSBnZGZvbnRzLnRjbAotCi1zZXQgaW0gW2dkSW1hZ2VDcmVhdGUgMjAwIDIwMF0KLXNldCBibGFjayBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDAgMCAwXQotc2V0IHdoaXRlIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMjU1IDI1NSAyNTVdCi0KLSMgRHJhdyBzb21lIHRleHQKLWdkSW1hZ2VTdHJpbmcgJGltICRnZEZvbnRMYXJnZSAxMCA1MCAiSGVsbG8gV29ybGQiICR3aGl0ZQotCi0jIFdyaXRlIHRoZSBpbWFnZQotc2V0IG91dCBbZm9wZW4gdGVzdC5naWYgd2JdCi1nZEltYWdlR2lmICRpbSAkb3V0Ci1mY2xvc2UgJG91dAotCi0jIENsZWFuIHVwCi1nZEltYWdlRGVzdHJveSAkaW0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSWYgd3JpdGluZyBhIGxpdHRsZSBUY2wgc2NyaXB0IHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtIGlzbid0IHlvdXIgcHJlZmVyZW5jZSwgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSB0aGUgdmFyaWFibGVzIHdpdGhpbiB0aGUgU1dJRyBtb2R1bGUuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQ3JlYXRlIHNvbWUgVGNsIHZhcmlhYmxlcyBmb3IgdGhlIGZvbnRzc3RhcnR1cAotI2lmZGVmIFNXSUdUQ0wKLSVpbml0ICV7Ci17Ci0gICAgY2hhciB0ZW1wWzY0XTsKLSAgICBTV0lHX01ha2VQdHIodGVtcCwgZ2RGb250VGlueSwgIl9nZEZvbnRQdHIiKTsKLSAgICBUY2xfU2V0VmFyKGludGVycCwiZ2RGb250VGlueSIsdGVtcCwwKTsKLSAgICBTV0lHX01ha2VQdHIodGVtcCwgZ2RGb250U21hbGwsICJfZ2RGb250UHRyIik7Ci0gICAgVGNsX1NldFZhcihpbnRlcnAsImdkRm9udFNtYWxsIix0ZW1wLDApOwotICAgIFNXSUdfTWFrZVB0cih0ZW1wLCBnZEZvbnRNZWRpdW1Cb2xkLCAiX2dkRm9udFB0ciIpOwotICAgIFRjbF9TZXRWYXIoaW50ZXJwLCJnZEZvbnRNZWRpdW1Cb2xkIix0ZW1wLDApOwotICAgIFNXSUdfTWFrZVB0cih0ZW1wLCBnZEZvbnRMYXJnZSwgIl9nZEZvbnRQdHIiKTsKLSAgICBUY2xfU2V0VmFyKGludGVycCwiZ2RGb250TGFyZ2UiLHRlbXAsMCk7Ci0gICAgU1dJR19NYWtlUHRyKHRlbXAsIGdkRm9udEdpYW50LCAiX2dkRm9udFB0ciIpOwotICAgIFRjbF9TZXRWYXIoaW50ZXJwLCJnZEZvbnRHaWFudCIsdGVtcCwwKTsKLX0KLSV9Ci0jZW5kaWYKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHR0PlNXSUdfTWFrZVB0cigpPC90dD4gaXMgYSBmdW5jdGlvbiBTV0lHIHVzZXMgdG8gY3JlYXRlIHBvaW50ZXIgdmFyaWFibGVzLiAgIFNpbmNlIHRoaXMgYXBwcm9hY2ggd291bGQgb25seSB3b3JrIHdpdGggVGNsLCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGlzIGNvZGUgaXNuJ3QgaW5jbHVkZWQgd2hlbiBwcm9kdWNpbmcgaW50ZXJmYWNlcyBmb3Igb3RoZXIgbGFuZ3VhZ2VzICg8dHQ+U1dJR1RDTDwvdHQ+IGlzIGEgc3ltYm9sIGRlZmluZWQgYnkgU1dJRyB3aGVuIGl0IGlzIHJ1bm5pbmcgaW4gVGNsIG1vZGUpLiA8cD4KLTxhIG5hbWU9Im4zOCI+PC9hPjxoMz4gQ3JlYXRpbmcgUG9pbnRzPC9oMz4KLUZpbmFsbHksIHRoZSBnZCBsaWJyYXJ5IGNvbnRhaW5zIGEgZmV3IGZ1bmN0aW9ucyBmb3IgZHJhd2luZyBwb2x5Z29ucyBzdWNoIGFzIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZ2RJbWFnZVBvbHlnb24oZ2RJbWFnZVB0ciBpbSwgZ2RQb2ludFB0ciBwLCBpbnQgbiwgaW50IGMpOwotdm9pZCBnZEltYWdlRmlsbGVkUG9seWdvbihnZEltYWdlUHRyIGltLCBnZFBvaW50UHRyIHAsIGludCBuLCBpbnQgYyk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXNlIGZ1bmN0aW9ucyByZXF1aXJlIGFuIGFycmF5IG9mIHBvaW50cyB0byBiZSBwYXNzZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gICBQb2ludHMgYXJlIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgaW50IHgsIHk7Ci19IGdkUG9pbnQsICpnZFBvaW50UHRyOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BcyBpcywgb3VyIFRjbCBpbnRlcmZhY2UgaGFzIG5vIG1lY2hhbmlzbSBmb3IgY3JlYXRpbmcgYXJyYXlzIG9mIHBvaW50cyBzbyB3ZSB3aWxsIG5lZWQgdG8gcHJvdmlkZSBzb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoaXMuICAgSGVyZSdzIG9uZSB3YXkgdG8gZG8gaXQ8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBwb2ludHMKLSVpbmxpbmUgJXsKLSAgIGdkUG9pbnQgKm5ld19wb2ludHMoaW50IG5wb2ludHMpIHsKLSAgICAgICAgcmV0dXJuIChnZFBvaW50ICopIG1hbGxvYyhucG9pbnRzKnNpemVvZihnZFBvaW50KSk7Ci0gICB9Ci0gICB2b2lkIGRlbGV0ZV9wb2ludHMoZ2RQb2ludCAqcCkgewotICAgICAgICBmcmVlKHApOwotICAgfQotICAgdm9pZCBzZXRfcG9pbnQoZ2RQb2ludCAqcCwgaW50IG4sIGludCB4LCBpbnQgeSkgewotICAgICAgICBwW25dLnggPSB4OwotICAgICAgICBwW25dLnkgPSB5OwotICAgfQotJX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRnJvbSBUY2wsIHBvaW50cyBjYW4gbm93IGJlIGNyZWF0ZWQgYW5kIG1hbmlwdWxhdGVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgQ3JlYXRlIGFuIGFycmF5IG9mIHBvaW50cwotc2V0IHAgW25ld19wb2ludHMgNF0KLXNldF9wb2ludCAkcCAwIDEwIDIwCi1zZXRfcG9pbnQgJHAgMSAxNTAgMzAKLXNldF9wb2ludCAkcCAyIDk1IDE1MAotc2V0X3BvaW50ICRwIDMgMjAgNzAKLQotIyBEcmF3IGEgcG9seWdvbgotZ2RJbWFnZVBvbHlnb24gJGltICRwIDQgJHdoaXRlCi0KLSMgRGVsZXRlIHRoZSBwb2ludHMKLWRlbGV0ZV9wb2ludHMgJHAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBVc2luZyB0aGUgTW9kdWxlPC9oMz4KLVdpdGggYSBqdXN0IGEgbGl0dGxlIHdvcmssIHRoZSBnZCBtb2R1bGUgaXMgbm93IGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHJlYWR5IHRvIGJlIHVzZWQuICAgRnJvbSBUY2wsICB5b3UgY2FuIGludGVyYWN0aXZlbHkgcGxheSB3aXRoIGxpYnJhcnkgYW5kIHRlc3Qgb3V0IGl0cyB2YXJpb3VzIGZ1bmN0aW9ucy4gIEluIGZhY3QgeW91IGNhbiBldmVuIHdyaXRlIGEgc2ltcGxlIFRrIHNjcmlwdCB0byB3YXRjaCB0aGUgb3V0cHV0IGZpbGUgYW5kIGRpc3BsYXkgaW1hZ2VzIGluIGEgY2FudmFzLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgd2F0Y2hnaWYudGNsIDogUGVyaW9kaWNhbGx5IHBvbGwgYSBmaWxlIGFuZCBkaXNwbGF5IGluIHRoZSBjYW52YXMKLXNldCBhdGltZSAiIgotc2V0IGNhbnZhc2luaXQgMAotc2V0IGN1cnJlbnRfaW1nICIiCi0KLXByb2Mgd2F0Y2hnaWYge2ZuYW1lfSB7Ci0gICAgZ2xvYmFsIGF0aW1lIGZpbGVuYW1lCi0gICAgc2V0IGZpbGVuYW1lICRmbmFtZQotICAgIHNldCBuZXdhdGltZSAiIgotICAgIGNhdGNoIHtzZXQgbmV3YXRpbWUgW2ZpbGUgbXRpbWUgJGZpbGVuYW1lXX0KLSAgICBpZiB7ICRuZXdhdGltZSAhPSAkYXRpbWUgfSB7Ci0gICAgICAgIHNldCBhdGltZSAkbmV3YXRpbWUKLSAgICAgICAgdXBkYXRlX2ltYWdlCi0gICAgfQotICAgIGFmdGVyIDEwMDAgIndhdGNoZ2lmICRmaWxlbmFtZSIKLX0KLQotcHJvYyB1cGRhdGVfaW1hZ2Uge30gewotICAgIGdsb2JhbCBjYW52YXNpbml0IGNhbnZhcyBjdXJyZW50X2ltZyBmaWxlbmFtZQotICAgIHNldCBpbWcgW2ltYWdlIGNyZWF0ZSBwaG90byAtZmlsZSAkZmlsZW5hbWVdCi0gICAgaWYgeyRjYW52YXNpbml0ID09IDAgfSB7Ci0gICAgICAgIGNhbnZhcyAuaW1nCi0gICAgICAgIHBhY2sgLmltZwotICAgICAgICBzZXQgY2FudmFzaW5pdCAxCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaW1hZ2UgZGVsZXRlICRjdXJyZW50X2ltZwotICAgIH0KLSAgICAuaW1nIGRlbGV0ZSBpbWFnZWRhdGEKLSAgICBzZXQgd2lkdGggW2ltYWdlIHdpZHRoICRpbWddCi0gICAgc2V0IGhlaWdodCBbaW1hZ2UgaGVpZ2h0ICRpbWddCi0gICAgLmltZyBjb25maWd1cmUgLXdpZHRoICR3aWR0aCAtaGVpZ2h0ICRoZWlnaHQKLSAgICAuaW1nIGNyZWF0ZSBpbWFnZSAwIDAgLWltYWdlICRpbWcgLWFuY2hvciBudyAtdGFnIGltYWdlZGF0YQotICAgIHNldCBjdXJyZW50X2ltZyAkaW1nCi19Ci0KLXByb2Mgd3JpdGUge2ltfSB7Ci0gICAgZ2xvYmFsIGZpbGVuYW1lCi0gICAgc2V0IG91dCBbZm9wZW4gJGZpbGVuYW1lIHdiXQotICAgIGdkSW1hZ2VHaWYgJGltICRvdXQKLSAgICBmY2xvc2UgJG91dAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3cgYW4gaW50ZXJhY3RpdmUgZ2Qgc2Vzc2lvbjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsgd2lzaAotJSBsb2FkIC4vZ2Quc28KLSUgc291cmNlIGdkZm9udHMudGNsCi0lIHNvdXJjZSB3YXRjaGdpZi50Y2wKLSUgd2F0Y2hnaWYgdGVzdC5naWYgICAgICAgICAgICAgICAgOyMgV2F0Y2ggYSBmaWxlIGZvciBjaGFuZ2VzIGFuZCBkaXNwbGF5Ci0lIHNldCBpbSBbZ2RJbWFnZUNyZWF0ZSAzMDAgMzAwXQotXzgxN2QxMDhfZ2RJbWFnZVB0cgotJSBzZXQgYmxhY2sgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAwIDAgMF0KLTAKLSUgc2V0IHdoaXRlIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMjU1IDI1NSAyNTVdCi0xCi0lIGdkSW1hZ2VMaW5lICRpbSAyMCAyMCAyNTAgNzAgJHdoaXRlCi0lIGdkSW1hZ2VTdHJpbmcgJGltICRnZEZvbnRMYXJnZSAyMCA3MCAiSGVsbG8gV29ybGQiICR3aGl0ZQotJSB3cml0ZSAkaW0gICAgICAgCi0lIGdkSW1hZ2VBcmMgJGltIDEwMCAxMDAgNTAgMjAgMCAyNzAgJHdoaXRlCi0lIHdyaXRlICRpbSAgICAgICAgICAgICAgICAgICAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSXMgdGhpcyBleGFtcGxlLCB2YXJpb3VzIGdkIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBpc3N1ZWQgaW50ZXJhY3RpdmVseS4gIFdoZW5ldmVyIHlvdSB3YW50IHRvIHNlZSB0aGUgY3VycmVudCBpbWFnZSwgc2ltcGx5IHR5cGUgYDx0dD53cml0ZSAkaW08L3R0PicgYW5kIHRoZSBpbWFnZSBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSBjYW52YXMgd2lsbCBiZSB1cGRhdGVkLiAgIFRoZSBpbnRlcmZhY2UgaXMgbWluaW1hbCwgYnV0IHlvdSBjYW4gdXNlIGl0IHRvIHBsYXkgd2l0aCB0aGUgbGlicmFyeSwgc2VlIGhvdyBpdCB3b3JrcywgYW5kIGV2ZW4gd3JpdGUgbGl0dGxlIFRjbCBzY3JpcHRzIHRvIHRyeSB0aGluZ3Mgb3V0LjxwPgotPGEgbmFtZT0ibjQwIj48L2E+PGgzPiBXcml0aW5nIFRlc3QgU2NyaXB0czwvaDM+Ci1XaGVyZSB0aGlzIGFwcHJvYWNoIHJlYWxseSBzaGluZXMgaXMgdGhlIGFiaWxpdHkgdG8gd3JpdGUgZmxleGlibGUgdGVzdCBzY3JpcHRzLiAgV2hlbiBkZXZlbG9waW5nIEMgbGlicmFyaWVzLCBJIGFsd2F5cyBzZWVtIHRvIGZpbmQgbXlzZWxmIHNwZW5kaW5nIGEgaHVnZSBhbW91bnQgb2YgdGltZSB3cml0aW5nIHRlc3QgcHJvZ3JhbXMgdG8gZXhlcmNpc2UgdmFyaW91cyBwYXJ0cyBvZiB0aGUgbGlicmFyeS4gICBBbHRob3VnaCBJIGNvdWxkIHdyaXRlIGEgY29sbGVjdGlvbiBvZiBDIHByb2dyYW1zIHRvIGRvIHRoaXMsIHVzaW5nIFRjbCBpcyBvZnRlbiBtdWNoIG1vcmUgZmxleGlibGUuICAgU3VwcG9zZSB5b3Ugd2FudGVkIHRvIHRlc3QgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBnZCBsaWJyYXJ5LiAgVG8gZG8gdGhpcywgeW91IG1pZ2h0IHdyaXRlIGEgZ2VuZXJpYyB0ZXN0IHNjcmlwdCBzdWNoIGFzIHRoZSBmb2xsb3dpbmc8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGdkdGVzdC50Y2wgOiBHZW5lcmljIGdkIHRlc3Qgc2NyaXB0Ci0jCi0jIFRoaXMgc2NyaXB0cyBzZXRzIHVwIHNvbWUgZGVmYXVsdCB2YWx1ZXMsIGNyZWF0ZXMgYW4gaW1hZ2UKLSMgYW5kIGV4ZWN1dGVzIGEgdGVzdCBzY3JpcHQuCi0jCi0jIHVzYWdlIDogdGNsc2ggZ2R0ZXN0LnRjbCBzY3JpcHQudGNsCi0KLWxvYWQgLi9nZC5zbwotc291cmNlIGdkZm9udHMudGNsCi0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zCi0KLXNldCB3aWR0aCA0MDAKLXNldCBoZWlnaHQgNDAwCi0KLSMgQ3JlYXRlIGFuIGltYWdlCi1zZXQgaW0gW2dkSW1hZ2VDcmVhdGUgJHdpZHRoICRoZWlnaHRdCi0KLSMgQ3JlYXRlIHNvbWUgY29sb3JzCi1zZXQgYmxhY2sgICBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDAgMCAwXQotc2V0IHdoaXRlICAgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyNTUgMjU1IDI1NV0KLXNldCByZWQgICAgIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMjU1IDAgMCBdCi1zZXQgZ3JlZW4gICBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDAgMjU1IDAgXQotc2V0IGJsdWUgICAgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAwIDAgMjU1XQotc2V0IHllbGxvdyAgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyNTUgMjU1IDBdCi1zZXQgY3lhbiAgICBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDAgMjU1IDI1NV0KLXNldCBtYWdlbnRhIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMjU1IDAgMjU1XQotCi0jIEdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIHRlc3Qgc2NyaXB0Ci1zZXQgZmlsZW5hbWUgW2xpbmRleCAkYXJndiAwXQotCi0jIFJ1biB0aGUgdGVzdCBzY3JpcHQKLXNvdXJjZSAkZmlsZW5hbWUKLQotIyBPdXRwdXQgdGhlIGltYWdlCi1hcHBlbmQgZmlsZW5hbWUgIi5naWYiCi1zZXQgb3V0IFtmb3BlbiAkZmlsZW5hbWUgd2JdCi1nZEltYWdlR2lmICRpbSAkb3V0Ci1mY2xvc2UgJG91dAotCi1wdXRzICJJbWFnZSB3cml0dGVuIHRvICRmaWxlbmFtZSIKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIHNjcmlwdCBzaW1wbHkgc2V0cyB1cCBhbiBpbWFnZSBhbmQgc29tZSBkZWZhdWx0IHZhbHVlcy4gIFRvIHVzZSBpdCwgIHlvdSB3b3VsZCB3cml0ZSBhIHNob3J0IHRlc3Qgc2NyaXB0IHN1Y2ggYXM8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGxpbmVzLnRjbCA6IERyYXcgc29tZSBsaW5lcwotZ2RJbWFnZUxpbmUgJGltIDEwIDEwIDMwMCA1MCAkd2hpdGUKLWdkSW1hZ2VMaW5lICRpbSA1MCAyMDAgMjkwIDEwICRyZWQKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1hbmQgcnVuIGl0IGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgdGNsc2ggZ2R0ZXN0LnRjbCBsaW5lcy50Y2wKLUltYWdlIHdyaXR0ZW4gdG8gbGluZXMudGNsLmdpZgotJSAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRmluYWxseSwgaWYgeW91IHdhbnRlZCB0byBkZXZlbG9wIGFuIGVudGlyZSB0ZXN0aW5nIHN1aXRlLCB5b3UgY2FuIHdyaXRlIGEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIHRvIGV4ZXJjaXNlIHZhcmlvdXMgZmVhdHVyZXMgYWxvbmcgd2l0aCBhIHNpbXBsZSB0ZXN0aW5nIHByb2dyYW0uPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBnZCB0ZXN0aW5nIHNjcmlwdAotCi1zZXQgZmlsZXMgeyBsaW5lcy50Y2wgYXJjcy50Y2wgZm9udHMudGNsIGZpbGwudGNsIHBvbHlnb25zLnRjbCAuLi4gfQotCi1mb3JlYWNoIGYgJGZpbGVzIHsKLSAgICBwdXRzIC1ub25ld2xpbmUgIlRlc3RpbmcgJGYgLi4uICIKLSAgICBpZiBbY2F0Y2gge3NldCBtc2cgW2V4ZWMgdGNsc2ggZ2R0ZXN0LnRjbCAkZiBdfV0gewotICAgICBzZXQgbXNnICJGYWlsZWQhIgotICAgIH0KLSAgICBwdXRzICRtc2cKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhlIHRlc3QgcHJvZ3JhbSwgZWFjaCB0ZXN0IGlzIHJ1biBhcyBhIHNlcGFyYXRlIHByb2Nlc3MgdXNpbmcgYGV4ZWMnLiAgICBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgaWYgYSB0ZXN0IGZhaWxzIHdpdGggYW4gaW50ZXJuYWwgZXJyb3IgKHN1Y2ggYXMgYSBzZWdtZW50YXRpb24gZmF1bHQpLCBpdCB3b24ndCBhZmZlY3QgYW55IG9mIHRoZSBvdGhlciB0ZXN0cyAoaW4gb3RoZXIgd29yZHMsIHRlc3RpbmcgY2FuIHByb2NlZWQgZXZlbiBpZiBpbmRpdmlkdWFsIHBhcnRzIGZhaWwpLiAgIFdoZW4gcnVubmluZyB0aGUgdGVzdCwgeW91IHdpbGwgbm93IGdldCBvdXRwdXQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHRjbHNoIHRlc3QudGNsCi1UZXN0aW5nIGxpbmVzLnRjbCAuLi4gSW1hZ2Ugd3JpdHRlbiB0byBsaW5lcy50Y2wuZ2lmCi1UZXN0aW5nIGFyY3MudGNsIC4uLiBJbWFnZSB3cml0dGVuIHRvIGFyYy50Y2wuZ2lmCi1UZXN0aW5nIGZvbnRzLnRjbCAuLi4gSW1hZ2Ugd3JpdHRlbiB0byBmb250cy50Y2wuZ2lmCi1UZXN0aW5nIGZpbGwudGNsIC4uLiBGYWlsZWQhCi1UZXN0aW5nIHBvbHlnb25zLnRjbCAuLi4gSW1hZ2Ugd3JpdHRlbiB0byBwb2x5Z29ucy50Y2wuZ2lmCi0lIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSBzaW1wbGUsIHlvdSBjYW4gaW1hZ2luZSB3cml0aW5nIGEgbGFyZ2UgY29sbGVjdGlvbiBvZiB0ZXN0IHNjcmlwdHMgdG8gZXhlcmNpc2UgdmFyaW91cyBmZWF0dXJlcyBvZiBhIGxpYnJhcnkuICAgIEJ5IHdyaXRpbmcgdGhlIHRlc3Qgc2NyaXB0cyBpbiBUY2wsIHRoZXkgYXJlIGVhc3kgdG8gd3JpdGUgYW5kIGVhc3kgdG8gbW9kaWZ5LiAgIEluIGZhY3QsIGEgcG93ZXJmdWwgdGVzdGluZyBzdWl0ZSBjYW4gYmUgZGV2ZWxvcGVkIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlIGFkZGl0aW9uYWwgcHJvZ3JhbXMgaW4gQy9DKysuPHA+Ci08YSBuYW1lPSJuNDEiPjwvYT48aDM+IEJ1aWxkaW5nIGFuIE9iamVjdCBPcmllbnRlZCBJbnRlcmZhY2UgPC9oMz4KLU9uZSBvZiB0aGUgaW50ZXJlc3RpbmcgcGFydHMgb2YgdXNpbmcgU1dJRyBpcyB0aGF0IHRoZXJlIGlzIGFsbW9zdCBhbHdheXMgbW9yZSB0aGFuIG9uZSB3YXkgdG8gZG8gdGhpbmdzLiAgSW4gdGhlIGdkIGV4YW1wbGUsIGEgc3RyYWlnaHRmb3J3YXJkIFRjbCBpbnRlcmZhY2UgaGFzIGJlZW4gYnVpbHQgdG8gQyBsaWJyYXJ5LiAgRnJvbSBUY2wsIHRoZSBsaWJyYXJ5IHdvcmtzIGluIGVzc2VudGlhbGx5IHRoZSBzYW1lIG1hbm5lciBhcyBpdCBkb2VzIGluIEMuICAgIEhvd2V2ZXIsIGl0J3MgYWxzbyBwb3NzaWJsZSB0byBwYWNrYWdlIGxpYnJhcmllcyBpbiBhbiBlbnRpcmVseSBkaWZmZXJlbnQgbWFubmVyLiAgICBVc2luZyB0aGUgU1dJRyBjbGFzcyBleHRlbnNpb24gbWVjaGFuaXNtLCAgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSBhZGRlZCB0byB0aGUgU1dJRyBpbnRlcmZhY2U6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBnZAotJXsKLSNpbmNsdWRlICJnZC5oIgotJX0KLSVpbmNsdWRlIGdkLmgKLS4uLgotJWFkZG1ldGhvZHMgZ2RJbWFnZSB7Ci0gICAgZ2RJbWFnZShpbnQgdywgaW50IGgpIHsKLSAgICAgICByZXR1cm4gZ2RJbWFnZUNyZWF0ZSh3LGgpOwotICAgIH0KLSAgICB+Z2RJbWFnZSgpIHsKLSAgICAgICBnZEltYWdlRGVzdHJveShzZWxmKTsKLSAgICB9Ci0gICAgaW50IGNvbG9yKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgICAgICByZXR1cm4gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZixyLGcsYik7Ci0gICAgfQotICAgIHZvaWQgcGxvdChpbnQgeCwgaW50IHksIGludCBjKSB7Ci0gICAgICAgZ2RJbWFnZVNldFBpeGVsKHNlbGYsIHgsIHksIGMpOwotICAgIH0KLSAgICB2b2lkIGxpbmUoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgYykgewotICAgICAgIGdkSW1hZ2VMaW5lKHNlbGYseDEseTEseDIseTIsYyk7Ci0gICAgfQotICAgIHZvaWQgcG9seShnZFBvaW50UHRyIHB0cywgaW50IG5wb2ludHMsIGludCBjKSB7Ci0gICAgICAgZ2RJbWFnZVBvbHlnb24oc2VsZixwdHMsIG5wb2ludHMsIGMpOwotICAgIH0KLSAgICB2b2lkIHJlY3QoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgYykgewotICAgICAgIGdkSW1hZ2VSZWN0YW5nbGUoc2VsZix4MSx5MSx4Mix5MixjKTsKLSAgICB9Ci0gICAgdm9pZCBzdHJpbmcoZ2RGb250UHRyIGZvbnQsIGludCB4LCBpbnQgeSwgY2hhciAqc3RyLCBpbnQgYykgewotICAgICAgIGdkSW1hZ2VTdHJpbmcoc2VsZixmb250LHgseSxzdHIsYyk7Ci0gICAgfQotICAgIHZvaWQgd3JpdGUoY2hhciAqZmlsZW5hbWUpIHsKLSAgICAgICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsIndiIik7Ci0gICAgICAgaWYgKGYgPT0gTlVMTCkgcmV0dXJuOwotICAgICAgIGdkSW1hZ2VHaWYoc2VsZixmKTsKLSAgICAgICBmY2xvc2UoZik7Ci0gICAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIGltYWdlcyBjYW4gYmUgbWFuaXB1bGF0ZWQgYWxtb3N0IGxpa2UgYSBUayB3aWRnZXQ8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vZ2Quc28KLWdkSW1hZ2UgaW1nIDQwMCA0MDAgICAgICAgICAgICAgICAgICAgIDsjIENyZWF0ZSBhbiBpbWFnZQotc2V0IGJsYWNrIFtpbWcgY29sb3IgMCAwIDBdICAgICAgICAgICAgOyMgQWxsb2NhdGUgc29tZSBjb2xvcnMKLXNldCB3aGl0ZSBbaW1nIGNvbG9yIDI1NSAyNTUgMjU1XSAgICAgCi1pbWcgbGluZSAyMCAyMCAzMDAgMzAwICR3aGl0ZSAgICAgICAgICA7IyBEcmF3IHNvbWUgb2JqZWN0cwotaW1nIHJlY3QgNDAgNDAgMjUwIDI1MCAkd2hpdGUKLWltZyBzdHJpbmcgJGdkRm9udExhcmdlIDEwIDEwMCAiSGVsbG8gV29ybGQiICR3aGl0ZQotaW1nIHdyaXRlICJ0ZXN0LmdpZiIgICAgICAgICAgICAgICAgICAgOyMgT3V0cHV0IHRoZSBpbWFnZQotcmVuYW1lIGltZyAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgRGVzdHJveSB0aGUgaW1hZ2UKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQyIj48L2E+PGgzPiBQb3J0aW5nIHRvIE90aGVyIExhbmd1YWdlczwvaDM+Ci1BbHRob3VnaCB0aGlzIGNoYXB0ZXIgaGFzIGZvY3VzZWQgZXhjbHVzaXZlbHkgb24gdGhlIHVzZSBvZiBTV0lHIGFuZCBUY2wsIG5vdGhpbmcgcHJldmVudHMgdXMgZnJvbSB1c2luZyBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgSW4gZmFjdCwgbG9va2luZyBhdCB0aGUgZXhhbXBsZSwgbm8gVGNsIHNwZWNpZmljIGNvZGUgaXMgaW52b2x2ZWQgaW4gY3JlYXRpbmcgdGhlIHNjcmlwdGluZyBpbnRlcmZhY2UgKHVubGVzcyB5b3Ugd2VudCBvdmVyYm9hcmQgd2l0aCB0eXBlbWFwcyBvciBUY2wgc3BlY2lmaWMgaGVscGVyIGZ1bmN0aW9ucykuICAgQmVjYXVzZSBvZiB0aGlzLCBpdCBpcyB0cml2aWFsIHRvIHJldGFyZ2V0IHRoZSBpbnRlcmZhY2UgdG8gb3RoZXIgZW52aXJvbm1lbnRzIGJ5IHNpbXBseSBydW5uaW5nIFNXSUcgd2l0aCBkaWZmZXJlbnQgY29tbWFuZCBsaW5lIG9wdGlvbnM8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1zd2lnIC1wZXJsNSBnZC5pICAgICAgICAgICAgICAgICAjIENyZWF0ZSBQZXJsNSBtb2R1bGUKLXN3aWcgLXB5dGhvbiBnZC5pICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgUHl0aG9uIG1vZHVsZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0byB3cml0ZSBzY3JpcHRzIGluIG90aGVyIGxhbmd1YWdlcy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgQSBQZXJsNSBTY3JpcHQKLXVzZSBnZDsKLSMgQ3JlYXRlIGFuIGltYWdlCi0kaW0gPSBnZDo6Z2RJbWFnZUNyZWF0ZSgyMDAsMjAwKTsKLQotIyBBbGxvY2F0ZSBjb2xvcnMKLSRibGFjayA9IGdkOjpnZEltYWdlQ29sb3JBbGxvY2F0ZSgkaW0sMCwwLDApOwotJHdoaXRlID0gZ2Q6OmdkSW1hZ2VDb2xvckFsbG9jYXRlKCRpbSwyNTUsMjU1LDI1NSk7Ci0KLSMgRHJhdyBhIGxpbmUKLWdkOjpnZEltYWdlTGluZSgkaW0sMjAsNTAsMTgwLDE0MCwkd2hpdGUpOwotCi0jIFdyaXRlIHRoZSBpbWFnZQotJG91dCA9IGdkOjpmb3BlbigidGVzdC5naWYiLHdiKTsKLWdkOjpnZEltYWdlR2lmKCRpbSwkb3V0KTsKLWdkOjpmY2xvc2UoJG91dCk7Ci0KLSMgQ2xlYW4gdXAKLWdkOjpnZEltYWdlRGVzdHJveSgkaW0pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1vcjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgQSBQeXRob24gc2NyaXB0Ci1pbXBvcnQgZ2QKLWltID0gZ2QuZ2RJbWFnZUNyZWF0ZSgyMDAsMjAwKQotCi0jIEFsbG9jYXRlIGNvbG9ycwotYmxhY2sgPSBnZC5nZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwwLDAsMCkKLXdoaXRlID0gZ2QuZ2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMjU1LDI1NSwyNTUpCi0KLSMgRHJhdyBhIGxpbmUKLWdkLmdkSW1hZ2VMaW5lKGltLDIwLDUwLDE4MCwxNDAsd2hpdGUpCi0KLSMgV3JpdGUgdGhlIGltYWdlCi1vdXQgPSBnZC5mb3BlbigidGVzdC5naWYiLHdiKQotZ2QuZ2RJbWFnZUdpZihpbSxvdXQpCi1nZC5mY2xvc2Uob3V0KQotCi0jIENsZWFuIHVwCi1nZC5nZEltYWdlRGVzdHJveShpbSkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQWx0aG91Z2ggeW91IG1pZ2h0IG5vdCBjb25zaWRlciB0aGUgdXNlIG9mIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMgdG8gYmUgc28gaW1wb3J0YW50LCAgY29uc2lkZXIgdGhlIHByb2Nlc3Mgb2YgdXBncmFkaW5nIHRvIG5ld2VyIHZlcnNpb24gb2YgVGNsLiAgVGNsIDcgd2FzIGJhc2VkIGVudGlyZWx5IG9uIHN0cmluZ3MgKHRoZSAiZXZlcnl0aGluZyBpcyBhIHN0cmluZyIgbW9kZWwpIHdoaWxlIFRjbCA4IHVzZXMgZHVhbC1wb3J0ZWQgb2JqZWN0cy4gICBVc2luZyBvYmplY3RzIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgdXBncmFkaW5nIGEgU1dJRyBtb2R1bGUgZnJvbSBUY2wgNyB0byBUY2wgOCBpcyB1c3VhbGx5IHRyaXZpYWwgLS0ganVzdCByZWJ1aWxkIGFsbCBvZiB5b3VyIGludGVyZmFjZXMgYnkgcnVubmluZyBTV0lHIHdpdGggdGhlIDx0dD4tdGNsODwvdHQ+IG9wdGlvbi48cD4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBTdW1tYXJ5PC9oMj4KLUkgaG9wZSB0byBoYXZlIGdpdmVuIHlvdSBhIHNtYWxsIHRhc3RlIG9mIFNXSUcgYW5kIGhvdyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMvQysrIGFwcGxpY2F0aW9ucy4gICBGcm9tIGEgcGVyc29uYWwgcGVyc3BlY3RpdmUsIEkgaGF2ZSBmb3VuZCB0aGUgY29tYmluYXRpb24gb2YgU1dJRyBhbmQgVGNsIHRvIGJlIGEgcG93ZXJmdWwgZGV2ZWxvcG1lbnQgdG9vbC4gICBGaXJzdCwgU1dJRyBtYWtlcyBpdCByZWxhdGl2ZWx5IGVhc3kgdG8gYnVpbGQgVGNsIGludGVyZmFjZXMgdG8gZXhpc3RpbmcgQyBjb2RlLS1pbiBmYWN0LCBJIHJhcmVseSBoYXZlIHRvIGRpZyBvdXQgbXkgVGNsIGJvb2tzIGZvciB0aGlzLiAgIFNlY29uZCwgVGNsIGlzIGEgZ3JlYXQgd2F5IHRvIGludGVyYWN0IHdpdGggQyBsaWJyYXJpZXMuICBOb3Qgb25seSBjYW4gSSBpbnRlcmFjdGl2ZWx5IHR3ZWFrIHBhcmFtZXRlcnMsIGNhbGwgZnVuY3Rpb25zLCBhbmQgdHJ5IHRoaW5ncywgSSBjYW4gd3JpdGUgdGVzdGluZyBzY3JpcHRzIGFuZCBzaG9ydCBwcm9ncmFtcyB3aXRob3V0IGhhdmluZyB0byB3cml0ZSBhZGRpdGlvbmFsIEMgY29kZS4gIEZpbmFsbHksICB0aGlzIGFwcHJvYWNoIGhhcyBoYWQgYSBub3RpY2VhYmxlIGltcGFjdCBvbiB0aGUgcXVhbGl0eSBvZiB0aGUgc29mdHdhcmUgSSBoYXZlIGRldmVsb3BlZC4gICBCZWZvcmUgaGF2aW5nIHRoZSBUY2wgaW50ZXJmYWNlLCBpdCB3YXMgYWx3YXlzIGEgc3RydWdnbGUgdG8gdXNlIHRoZSBjb2RlIEkgaGFkIGRldmVsb3BlZC4gIE1vcmUgb2Z0ZW4gdGhhbiBub3QsIEkgd291bGQgc3BlbmQgaW5vcmRpbmF0ZSBhbW91bnRzIG9mIHRpbWUgd3JpdGluZyBiYWQgdXNlciBpbnRlcmZhY2VzIGFuZCB0ZXN0IHByb2dyYW1zLiAgSG93ZXZlciwgYnkgaGF2aW5nIGEgVGNsIGludGVyZmFjZSwgIEkgd2FzIGdpdmVuIGFuIGVudmlyb25tZW50IHRoYXQgbGV0cyBtZSBwbGF5IHdpdGggbGlicmFyaWVzLCB0ZXN0IGNvbXBvbmVudHMsIGFuZCBjb25jZW50cmF0ZSBvbiB0aGUgcHJvYmxlbSBhdCBoYW5kLiAgSW4gbWFueSBjYXNlcywgdGhpcyBoYXMgYWxsb3dlZCBtZSB0byBmaW5kIGRlc2lnbiBmbGF3cyBhbmQgY29ycmVjdCByZWxpYWJpbGl0eSBwcm9ibGVtcyBtdWNoIGVhcmxpZXIgdGhhbiBiZWZvcmUuPHA+Ci08cD4KLVRoaXMgY2hhcHRlciBoYXMgb25seSBzY3JhdGNoZWQgdGhlIHN1cmZhY2Ugb2YgU1dJRyBhbmQgaXRzIHVzZSB3aXRoIFRjbC4gICAgSW4gYWRkaXRpb24gdG8gaXRzIHVzZSBpbiBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgU1dJRyBjYW4gYWxzbyBiZSB1c2VkIHRvIGJ1aWxkIGdlbmVyYWwgcHVycG9zZSBUY2wgZXh0ZW5zaW9uIG1vZHVsZXMgYW5kIGFzIGEgdG9vbCBmb3IgYnVpbGRpbmcgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlcyB0byBDL0MrKyBhcHBsaWNhdGlvbnMgKHVzaW5nIFRrKS4gICBSZWFkZXJzIGludGVyZXN0ZWQgaW4gb3RoZXIgU1dJRyBhcHBsaWNhdGlvbnMgc2hvdWxkIHRha2UgYSBsb29rIGF0IHRoZSB3ZWItcGFnZSAod3d3LnN3aWcub3JnKSBhbmQgdGhlIFNXSUcgVXNlcnMgTWFudWFsLjxwPgotPHA+Ci1TV0lHIHdvdWxkIG5vdCBiZSBwb3NzaWJsZSB3aXRob3V0IHRoZSB2YWx1YWJsZSBjb250cmlidXRpb25zIG9mIGl0cyB1c2Vycy4gIEFsdGhvdWdoIHRoZXJlIGFyZSBmYXIgdG9vIG1hbnkgcGVvcGxlIHRvIHRoYW5rIGluZGl2aWR1YWxseSBhdCB0aGlzIHBvaW50LCB5b3Uga25vdyB3aG8geW91IGFyZS4gIFNXSUcgd291bGQgY2VydGFpbmx5IG5vdCBiZSBpbiBpdHMgY3VycmVudCBzdGF0ZSB3aXRob3V0IHRoZWlyIGZlZWRiYWNrLjxwPgotPHA+Ci0KLTxwPjxocj4KLQotPGFkZHJlc3M+YmVhemxleUBjcy51Y2hpY2Fnby5lZHUgIEZyaSBBdWcgMTQgMTA6MjU6MTkgMTk5ODwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1RjbFR1dG9yaWFsOTgvVGNsVHV0b3JpYWw5OC5wZGYgYi9zd2lnd2ViL3BhcGVycy9UY2xUdXRvcmlhbDk4L1RjbFR1dG9yaWFsOTgucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGExNTVjLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1RjbFR1dG9yaWFsOTgvVGNsVHV0b3JpYWw5OC5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3Byb2plY3RzLmh0IGIvc3dpZ3dlYi9wcm9qZWN0cy5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMjUyMy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3Byb2plY3RzLmh0CisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLVRoZSBTV0lHIEZpbGVzCi0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvcHJvamVjdHMucG5nIiBhbHQ9IlByb2plY3RzIj4KLQotPHA+Ci1TV0lHIGlzIGJlaW5nIHVzZWQgaW4gYW4gaW5jcmVhc2luZyBudW1iZXIgb2YgYXBwbGljYXRpb25zLCBtb3N0IG9mCi13aGljaCBhcmUgcmVsYXRlZCB0byByZXNlYXJjaCBhbmQgZGV2ZWxvcG1lbnQsIHByb3RvdHlwaW5nLCBzb2Z0d2FyZSB0ZXN0aW5nLAotYW5kIGNvbnN0cnVjdGlvbiBvZiBzcGVjaWFsaXplZCBzeXN0ZW1zLiAgVGhpcyBwYWdlIGRlc2NyaWJlcwotc29tZSBvZiB0aGUgd2F5cyBpbiB3aGljaCBTV0lHIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkLiAKLQotPHA+Ci0oTm90ZSA6IHRoZQotb3BpbmlvbnMgZXhwcmVzc2VkIGhlcmUgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhvc2Ugb2YgYW55Ci1naXZlbiBlbXBsb3llciBvciBvcmdhbml6YXRpb24pLgotCi08aHI+Ci08cD4KLURhdmlkIEJlYXpsZXkgKGRtYkB2aWtpbmcubGFubC5nb3YpIGFuZCBQZXRlciBMb21kYWhsIChweGxAdmlraW5nLmxhbmwuZ292KTxicj4KLQotPHA+Ci1TV0lHIGlzIGJlaW5nIHVzZWQgdG8gY29uc3RydWN0IGEgUHl0aG9uIGludGVyZmFjZSB0byB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9iaWZyb3N0LmxhbmwuZ292L01EL01ELmh0bWwiPlNQYVNNPC9hPiBtb2xlY3VsYXIgZHluYW1pY3MKLWNvZGUgYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LiAgQ3VycmVudGx5IHRoaXMgY29kZSBpcyBiZWluZwotdXNlZCB0byBwZXJmb3JtIGxhcmdlLXNjYWxlIHNpbXVsYXRpb25zIG9mIGZyYWN0dXJlLCBzaG9jayB3YXZlcywgYW5kCi1kaXNsb2NhdGlvbiBkeW5hbWljcy4gVGhlIHN5c3RlbSBydW5zIGluIHBhcmFsbGVsIG9uIGEgMTIgcHJvY2Vzc29yCi1TdW4gRW50ZXJwcmlzZSA0MDAwIHNlcnZlciBhbmQgaXMgaW1wbGVtZW50ZWQgd2l0aCBNUEkgYW5kIFNvbGFyaXMKLW11bHRpdGhyZWFkaW5nLiAgVGhlIFB5dGhvbiBpbnRlcmZhY2UgaXMgdXNlZCB0byBwcm92aWRlIHVzZXJzIHdpdGggYW4KLWludGVyYWN0aXZlIGRhdGEgYW5hbHlzaXMsIHZpc3VhbGl6YXRpb24sIGFuZCBwcm90b3R5cGluZyBlbnZpcm9ubWVudC4KLVVzZXJzIGNhbiBhbHNvIGludGVyYWN0IHdpdGggdW5kZXJseWluZyBDIGRhdGEgc3RydWN0dXJlcyBhbmQgInN0ZWVyIgotY29tcHV0YXRpb25zIGFzIG5lZWRlZC4gIE9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBTV0lHIGlzIHRoYXQgaXQKLWFsbG93cyBpbnRlcmZhY2VzIHRvIGJlIGVhc2lseSBjb25zdHJ1Y3RlZCBmcm9tIGV4aXN0aW5nIGNvZGUuICBUaGUKLVNQYVNNIHN5c3RlbSBjb25zaXN0cyBvZiBuZWFybHkgMzAwIEMgZnVuY3Rpb25zIGFuZCB0aGUgUHl0aG9uCi1pbnRlcmZhY2UgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGNvbXBpbGF0aW9uLiAgVGhpcyB3b3JrCi13YXMgcmVjZW50bHkgZmVhdHVyZWQgb24gdGhlIGNvdmVyIG9mICJDb21wdXRlcnMgaW4gUGh5c2ljcyIgKEp1bmUsCi0xOTk3KS4KLQotPGhyPgotPHA+Ci1Kb2huIFNjaG1pZHQgKGphc0Bjcy51dGFoLmVkdSkgPGJyPgotCi08cD4KLUkgYW0gdXNpbmcgU1dJRyB0byBpbnRlZ3JhdGUgZm91ciBzdGFuZCBhbG9uZSBzb2Z0d2FyZSBwYWNrYWdlcyBpbnRvIGEKLXVuaWZpZWQgc3lzdGVtIGNvbnRyb2xsZWQgYnkgVGNsL1RrIHNjcmlwdHMuICBUaGUgdW5pZmllZCBzb2Z0d2FyZQotc3lzdGVtIGlzIHVzZWQgdG8gZGVzaWduIGFuZCB0ZXN0IGRlZmlicmlsbGF0aW9uIGVsZWN0cm9kZXMgdmlhCi1jb21wdXRlciBzaW11bGF0aW9ucyBvZiBhIGh1bWFuIHN1YmplY3QuICBUaGUgaW5kaXZpZHVhbCBzb2Z0d2FyZQotcGllY2VzIGluY2x1ZGU6IGEgdmlzdWFsaXphdGlvbiBwYWNrYWdlIHdyaXR0ZW4gaW4gQysrIHVzaW5nCi1PcGVuSW52ZW50b3IgYW5kIE1vdGlmLCBhbiB1bnN0cnVjdHVyZWQgbWVzaCBnZW5lcmF0b3Igd3JpdHRlbiBpbiBDLCBhCi1GaW5pdGUgRWxlbWVudCBTb2x2ZXIgd3JpdHRlbiBpbiBDLCBhbmQgYSBzZWdtZW50YXRpb24gc29mdHdhcmUKLXdyaXR0ZW4gaW4gQysrIHVzaW5nIE9wZW5HTCBhbmQgTW90aWYuICBTV0lHIGhhcyBiZWVuIGNydWNpYWwgdG8gdGhlCi1kZXZlbG9wbWVudCBvZiB0aGlzIHByb2plY3QuICBXaXRoIFNXSUcsIHRoZSBpbnRlZ3JhdGlvbiBvZiB0aGUKLWluZGl2aWR1YWwgcGllY2VzIHdhcyB0cml2aWFsLgotCi08aHI+Ci08cD4KLURhdmlkIEJyeWRvbiAoYnJ5ZG9uQGxhbmwuZ292KSA8YnI+Ci0KLTxwPgotV2UgYXJlIHVzaW5nIHN3aWcgd2l0aCBweXRob24gdG8gcmV0cmlldmUsIGFuYWx5emUsIGFuZCB2aXN1YWxpemUgdmVyeQotbGFyZ2UgZGF0YSBzZXRzIGZyb20gb2NlYW4gbW9kZWwgc2ltdWxhdGlvbnMgb24gcGFyYWxsZWwgY29tcHV0ZXJzLgotV2UgaGF2ZSB3cml0dGVuIEMgcm91dGluZXMgdGhhdCBhY2Nlc3Mgb3VyIGRhdGEuICBHcmFwaGljcyBsaWJyYXJpZXMKLWFuZCBNYXRsYWIgYXJlIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBkYXRhLiAgV2UgYXJlIHZlcnkgaGFwcHkgd2l0aCB0aGUKLWZsZXhpYmxlLCBwcm9ncmFtbWFibGUsIHBvd2VyZnVsIHRvb2wgdGhhdCByZXN1bHRzLgotCi08aHI+IAkKLTxwPgotTWlrZSBXZWlibGVuIChtZXdAcGFyYWRpZ21zaW0uY29tKSA8YnI+Ci0KLTxwPgotUGFyYWRpZ20gc2VsbHMgbW9kdWxhciBDIHRvb2xraXRzIGZvciBkZXZlbG9waW5nIHZpc3VhbAotc2ltdWxhdGlvbi92aXJ0dWFsIHJlYWxpdHkgZ3JhcGhpY3MgYXBwbGljYXRpb25zIGNhbGxlZCBWZWdhIGFuZCBhbm90aGVyCi1mb3Igc3BhdGlhbCBhdWRpbyBzaW11bGF0aW9uIGNhbGxlZCBBdWRpb1dvcmtzLiAgSSd2ZSB1c2VkIFNXSUcgdG8gd3JhcAotVmVnYSdzIGFuZCBBVydzIEFQSXMgd2l0aCBTaWxpY29uIEdyYXBoaWNzJyAic2dpdGNsIiB0byBjcmVhdGUgInZnVGNsIgotYW5kICJhd1RjbCIuICBFeHBsb2l0aW5nIHRoZSBwb3dlciBvZiBpbnRlcmFjdGl2ZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzLAotdGhleSBwcm92aWRlIHRoZSBmdWxsIHBvd2VyIG9mIHRoZSBBUElzIGF0IHJ1bnRpbWUsIHdpdGhvdXQgYW4KLWFwcGxpY2F0aW9uIGRldmVsb3BlciBoYXZpbmcgdG8gYW50aWNpcGF0ZSBmbGV4aWJpbGl0eSBhIHByaW9yaS4gIFNXSUcKLWhhcyBlbmFibGVkIG91ciBjdXN0b21lcnMgdG8gaW50ZXJhY3Qgd2l0aCBvdXIgdG9vbGtpdHMgaW4gZnVuZGFtZW50YWxseQotbmV3IHdheXMuCi08cD4KLVNldmVyYWwgeWVhcnMgYWdvIChJIGJlbGlldmUgd2UgZGlzY3Vzc2VkIHRoaXMgc3R1ZmYgd2F5IGJhY2sgaW4gMTk5NAotOy0pLCBJIGNyZWF0ZWQgYSBzZXQgb2YgQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHRoYXQgZGlkIFNXSUctbGlrZQotdGhpbmdzLiAgSXQgd2FzIGEgdmVyeSB0ZWRpb3VzIHByb2Nlc3MsIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gZm9sbG93Ci1jaGFuZ2VzIHRvIGFuIGV2b2x2aW5nIEFQSSwgYnV0IGl0IHdhcyB1c2VmdWwgZm9yIHByb29mLW9mLWNvbmNlcHQuIAotV2hlbiBTV0lHIDEuMUIxIGNhbWUgb3V0IGluIE9jdG9iZXIsIEkgd2FzIGdlbmVyb3VzbHkgZ2l2ZW4gYSBSJmFtcDtEIGJ1ZGdldAotdG8gcmVpbXBsZW1lbnQgbXkgcHJvamVjdCBpbiBTV0lHLiAgVGhlIHByb2plY3QgaGFzIGJlZW4gYSByZXNvdW5kaW5nCi1zdWNjZXNzISAgCi0KLTxocj4KLTxwPgotSm9uYWggTGVlIChqb25haEBtZWxhYi51YWZzb2UuYWxhc2thLmVkdSkKLQotPHA+Ci1bV2UncmUgdXNpbmcgU1dJRyBmb3JdIHdyYXBwaW5nIHVwIGVuZ2luZWVyaW5nIGFwcGxpY2F0aW9ucyB1c2luZwotZmluaXRlIGVsZW1lbnQgbWV0aG9kIGluY2x1ZGluZyBwcmUtIGFuZCBwb3N0LXByb2Nlc3NpbmcuIE15IHByb2dyYW0KLWlzIHNvbWV3aGF0IGdlbmVyYWwgYW5kIGlzIHVzZWQgdG8gc29sdmUgcHJvYmxlbXMgZm9yIGVuZ2luZWVyaW5nCi1tYXRlcmlhbHMtLW1ldGFscywgcG9seW1lcnMgYW5kIGljZS0tIHVuZGVyZ29pbmcgcGxhc3RpYyAocGVybWFuZW50KQotZGVmb3JtYXRpb25zLiBJdCdzIG1haW5seSB1c2VkIGZvciByYXBpZCBwcm90b3R5cGluZywgZGV2ZWxvcG1lbnQgYW5kCi10ZXN0aW5nLiBUaGUgY29kZSBydW5zIG9uIHdvcmtzdGF0aW9ucywgQ3JheSBZLU1QcyBhbmQgQ3JheSBUM0UgKHdoZW4KLUkgZ2V0IHRoZXJlLi4uICB0aGF0IGlzKS4KLQotPGhyPgotPHA+Sm9keSBXaW5zdG9uIChqb2R5QHNjY3NpLmNvbSkgCi0KLTxwPgotCi1JIGhhdmUgdXNlZCBTV0lHIHRvIHdyYXAgYW4gQVBJIHRoYXQgY29udHJvbGxlZCB0d28gc3RlcHBlciBtb3RvcnMgYW5kCi1hIENDRCBjYW1lcmEgb24gYSBMaW51eCBzeXN0ZW0gdGhhdCBnYXRoZXJlZCByZWFsIHRpbWUgaW1hZ2UgZGF0YS4gIEluCi1XaW5kb3dzLCBJIHdyYXBwZWQgYW4gYXBwbGljYXRpb24ncyBDKysgQVBJIGFuZCB1c2VkIFNXSUcgdG8gZW1iZWQgYQotUHl0aG9uIChweXdpbikgaW50ZXJwcmV0ZXIgaW50byB0aGUgQysrIGFwcGxpY2F0aW9uLiAgSSBhbHNvIHVzZWQgU1dJRwotdG8gd3JhcCBhIEZPUlRSQU4gQVBJIHRoYXQgd2FzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgZGF0YSBpbnRvIGEKLWN1c3RvbSBkYXRhIGJhc2UuICAKLTxwPgotU1dJRyBoYXMgYWxsb3dlZCBtZSB0byBtb3ZlIHRoZSB0aW1lIGNyaXRpY2FsIGNvZGUgaW50byBDLCBDKyssIG9yCi1GT1JUUkFOIHdoaWxlIGhhdmluZyB0aGUgYXBwbGljYXRpb24gYmVpbmcgY29udHJvbGxlZCBieSBQeXRob24uICBJCi1jYW4gcXVpY2tseSBlbWJlZCBhbiBpbnRlcnByZXRlciBpbnRvIGFuIGFwcGxpY2F0aW9uLgotCi08aHI+Ci08cD4KLVBldGVyIExpc3RlciAocC5saXN0ZXJAY3JhbmZpZWxkLmFjLnVrKTxicj4KLQotPHA+Ci1JJ20gdXNpbmcgW1NXSUddIGZvciBhIFBlcmwgc2NyaXB0YWJsZSB2ZXJzaW9uIG9mIFZhbiBKYWNvYnNvbidzIGxpYnBjYXAKLXBhY2tldCBjYXB0dXJlIGxpYnJhcnkuIEkgY2FuIG5vdyB1c2UgUGVybCByZWd1bGFyIGV4cHJlc3Npb25zIHRvCi1wcm9jZXNzIHBhY2tldHMgb24gdGhlIGZseS4gTXkgbWFpbiByZWFzb24gaXMgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbgotZnJvbSBBUlAgcGFja2V0cyBhbmQgYXV0b21hdGljYWxseSBtYWludGFpbiBvdXIgZGF0YWJhc2Ugb2YgSVAvTUFDCi1hZGRyZXNzIG1hcHBpbmdzIGRpcmVjdGx5IGZyb20gcGVybCByYXRoZXIgdGhhbiBoYWNraW5nIHRoZSBvdXRwdXQgb2YKLWFycHdhdGNoIG9yIHRjcGR1bXAuCi0KLTxocj4KLTxwPgotSGFyYWxkIFNpbmdlciAoc2luZ2VyQGl0bC5hdHIuY28uanApCi0KLTxwPgotW1dlIGFyZSB1c2luZyBTV0lHIGZvcl0gd3JhcHBpbmcgQyBsaWJyYXJpZXMgIHRvIFB5dGhvbiBmb3Igc3BlZWNoIHJlY29nbml0aW9uIHJlc2VhcmNoCi1hdCBBVFIgSW50ZXJwcmV0aW5nIFRlbGVjb21tdW5pY2F0aW9ucyBMYWJvcmF0b3JpZXMuCi08cD4KLVdlIGFyZSB3b3JraW5nIGluIGEgbXVsdGktdmVuZG9yIGVudmlyb25tZW50IChIUC1VWCwgT1NGMSwgTGludXgsCi1TdW5PUywgU29sYXJpcykgYW5kIHdyaXRpbmcgbmV3IGFwcGxpY2F0aW9ucyBoYXMgYmVjb21lIHZlcnkgdGVkaW91cy4KLVRoZXJlZm9yZSwgd2UgZGVjaWRlZCB0byBlbXBsb3kgcHl0aG9uLCBidXQgYXQgdGhlIHNhbWUgdGltZSB3ZSB3b3VsZAotbGlrZSB0byBoYXZlIGFjY2VzcyB0byBvdXIgc2lnbmFsIHByb2Nlc3NpbmcgbGlicmFyaWVzIGV0Yy4gdGhhdCB3ZXJlCi1hbmQgYXJlIHN0aWxsIHdyaXR0ZW4gaW4gQy4KLTxwPgotVGhlIGFkdmFudGFnZXMgb2YgdXNpbmcgUHl0aG9uIGJlY29tZSBtb3JlIGV2aWRlbnQgZXZlcnkgZGF5LiBGb3IKLWV4YW1wbGUsIGl0IHdhcyBmYWlybHkgZWFzeSB0byB3cml0ZSBhIEdVSSB1c2luZyBweXRob24vdGsuIFdlIGFyZQotdXNpbmcgdGhpcyBub3cgZm9yIGludGVyYWN0aXZlIGVycm9yIGFuYWx5c2lzLiBBIHR5cGljYWwgc2NlbmFyaW8gaXMKLWxpa2UgdGhpczoKLQotPHVsPgotPGxpPiBhdWRpbyBkYXRhIGlzIGNvbGxlY3RlZCB2aWEgbWljcm9waG9uZS9BRCAoaW4gUHl0aG9uKSBhbmQgc2VudCB0byB0aGUKLXJlY29nbml6ZXIgZnJhbWUgYnkgZnJhbWUuIAotCi08bGk+IHRoZSByZWNvZ25pemVyIChDIGNvZGUpIG1ha2VzIGEgZGVjaXNpb24gYWJvdXQgc3BlZWNoIGVuZHBvaW50aW5nIGFuZAotb25jZSBpdCBoYXMgZGlzY292ZXJlZCBlbmQgb2YgdXR0ZXJhbmNlIGRvZXMgYSBjYWxsYmFjayB0byB0aGUKLWFwcGxpY2F0aW9uIChweXRob24vdGspIHdpdGggYSB3b3JkIGxhdHRpY2UgYXMgcmVzdWx0LgotCi08bGk+IHRoaXMgd29yZCBsYXR0aWNlIGlzIG5vdyBkaXNwbGF5ZWQgZm9yIHRoZSB1c2VyIGluIHB5dGhvbi90ay4gCi0KLTxsaT4gdGhlIHVzZXIgY2FuIG5vdyBpbnRlcmFjdGl2ZWx5IHJlc2NvcmUgcGFydCBvZiB0aGUgbGF0dGljZXMsIGxvb2sgYXQKLXRoZSBkZXRhaWxlZCBhY291c3RpYyBhbmQgbGFuZ3VhZ2UgbW9kZWwgc2NvcmVzLCBsaXN0ZW4gdG8gcGFydHMgb2YKLXRoZSB1dHRlcmFuY2UsIGV0Yy4KLTwvdWw+Ci08cD4KLVNXSUcgaGVscHMgdXMgaW4gdGFraW5nIGF3YXkgcGFydCBvZiB0aGUgZXJyb3ItcHJvbmUgdGFzayBvZiBtYWtpbmcKLXRoZSBDIHJvdXRpbmVzIGFjY2Vzc2libGUgZnJvbSBweXRob24gYW5kIGhhcyBjb25zaWRlcmFibHkgaW1wcm92ZWQKLW91ciBlZmZpY2llbmN5LgotCi08aHI+Ci08cD4KLURvbWluaXF1ZSBEdW1vbnQgKGRvbWlAc3M3c2Vydi5ncmVub2JsZS5ocC5jb20pCi08cD4KLUknbSB1c2luZyBTV0lHIHRvIGdlbmVyYXRlIGEgcGVybDUgQVBJIG9uIHRvcCBvZiBIUCdzIE9wZW5DYWxsIFRDQVAKLUFQSS4gVENBUCBpcyB0aGUgdG9wIHByb3RvY29sIGxheWVyIG9mIEhQJ3MgU1M3IHN0YWNrIG9mIHRlbGVjb20gCi1wcm90b2NvbC4gVGhlIHBlcmw1IEFQSSBkZXZlbG9wZW1udCBlZmZvcnQgaXMgYSBwYXJ0IG9mIHRoZSBzeXN0ZW1hdGljCi10ZXN0aW5nIGFwcHJvYWNoIHdlJ3JlIGltcGxlbWVudGluZyBpbiB0aGUgZGl2aXNpb24uIAotPHA+Ci1UaGUgdXN1YWwgd2F5IHdhcyB0byB3cml0ZSB0ZXN0IHByb2dyYW1zCi1pbiBDLiBUaGUgbWFpbiBkcmF3YmFjayBiZWluZyB0aGF0IGRldmVsb3BpbmcgYW5kIHJ1bm5pbmcgdGhlIHRlc3RzCi1jb25zdW1lcyBhIGxvdCBvZiB0aW1lLiAKLTxwPgotTm93IHRoZSBnb2FsIGlzIHRvIHdyaXRlIGFsbCAob3IgYXQgbGVhc3QgbW9zdCBvZikgdGhlIHRlc3QgaW4gcGVybAotYWxsb3dpbmcgYSBmYXN0ZXIgY3ljbGUgdGltZSBiZXR3ZWVuIG1vZGlmeWluZyB0aGUgQVBJIGFuZCB0ZXN0aW5nCi1pdC4gKFdlJ2xsIGFsc28gYmUgYWJsZSB0byBkZWJ1ZyBmYXN0ZXIgdGhlIHRlc3QgcHJvZ3JhbXMpLgotPHA+Ci1QZXJsJ3MgcG93ZXIgYWxzbyBlbmFibGVzIHVzIHRvIHdyaXRlIHRlc3QgdXNpbmcgb28gbWV0aG9kb2xvZ3kKLShhbHRob3VnaCB0aGUgQVBJIGlzIHN0cmljdGx5IHByb2NlZHVyYWwpLCB0aHVzIHdlIGNhbiBlYXNpbHkgZGV2ZWxvcCAKLWNvbXBsZXggdGVzdCBzY2VuYXJpb3MuCi08cD4KLUhvcGVmdWxseSAoaS5lLiBpZiB3ZSBoYXZlIHNvbWUgc3BhcmUgdGltZSksIHRoZSBuZXh0IHN0ZXAgd2lsbCBiZSB0bwotY29tYmluZSBUayB3aXRoIFBlcmwgYW5kIFNXSUcgc28gd2UnbGwgYmUgYWJsZSB0byBtb25pdG9yIHdpdGggYSB1c2VyCi1mcmllbmRseSBpbnRlcmZhY2UgdGhlIHByb2dyZXNzIG9mIHRoZSB0ZXN0IHN1aXRlLgotCi08aHI+Ci08cD5EYW5pZWwgTWljaGVsc29uIChEYW5pZWwuTWljaGVsc29uQHNtaGkuc2UpCi0KLTxwPgotQSBjb2xsZWd1ZSBhbmQgSSBhcmUgdXNpbmcgU1dJRyBmb3IgdHdvIHB1cnBvc2VzLCBib3RoIG9mIHdoaWNoCi1jZW50cmUgYXJvdW5kIHRoZSBjcmVhdGlvbiBvZiBhIFB5dGhvbi1iYXNlZCBlbnZpcm9ubWVudCBmb3IgYW5hbHlzaXMKLWFuZCB2aXN1YWxpemF0aW9uIG9mIGRhdGEgZnJvbSB0aGUgU3dlZGlzaCBuYXRpb25hbCB3ZWF0aGVyIHJhZGFyCi1uZXR3b3JrOgotPHVsPgotPGxpPiBpbnRlcmZhY2luZyBvbGQgY29kZQotPGxpPiBpbnRlcmZhY2luZyBuZXcsIHBlcmZvcm1hbmNlIGNyaXRpY2FsLCBjb2RlLgotPC91bD4KLTxwPgotV2UgaGF2ZSBhIGNvdXBsZSBvZiBvdGhlciBjb2xsZWd1ZXMsIGFsc28gYXQgU01ISSBSJmFtcDtELCB3aG8gYXJlIHdvcmtpbmcKLWluIHNhdGVsbGl0ZS1iYXNlZCByZW1vdGUgc2Vuc2luZyBhY3Rpdml0aWVzIGFuZCB3aG8gd2lsbCBiZSBzdGFydGluZyB0bwotdXNlIFNXSUcgaW4gdGhlIG5lYXIgZnV0dXJlIGZvciB0aGVpciBwdXJwb3Nlcy4KLQotPGhyPgotPHA+Um9nZXIgQnVybmhhbSAocmJ1cm5oYW1AY3JpLWluYy5jb20pCi0KLTxwPgotVGhhbmtzIGFnYWluIGZvciBTV0lHLi4uIEl0cyBmdW4sIGFsbG93cyBncmVhdCBwcm9kdWN0aXZpdHkgd2hpbGUgCi1hdm9pZGluZyBtdWNoIHRlZGl1bS4uLgotPHA+Ci1UaGUgY3VycmVudCBhcHBsaWNhdGlvbiAodGhlcmUgd2lsbCBiZSBtYW55IHNwaW4tb2Zmcy92YXJpYXRpb25zKSBpcyAKLWluIHBvbGFyaXphdGlvbiBtaWNyb3Njb3B5LiAgV2UgbWFudWZhY3R1cmUgZWxlY3Ryb25pY2FsbHkgCi1jb250cm9sbGFibGUgcmV0YXJkZXIgcGxhdGVzLCBhbmQgYWxvbmcgd2l0aCBhIHNjaWVudGlzdCBhdCB0aGUgCi1NYXJpbmUgQmlvbG9naWNhbCBMYWIgaW4gV29vZHMgSG9sZSBoYXZlIGRldmVsb3BlZCBhbiBhbGdvL21ldGhvZCAKLXRoYXQgYWxsb3dzIHVzIHRvIHZpc3VhbGl6ZSBhIHNhbXBsZSdzIHJldGFyZGFuY2UgKGRpcmVjdGlvbiBhbmQgCi1tYWduaXR1ZGUpIG92ZXIgdGhlIHdob2xlIGltYWdlLiAgQ29udmVudGlvbmFsIG1ldGhvZHMgYWxsb3cgeW91IHRvIAotc2VlIHRoaXMgc3RydWN0dXJlIG9ubHkgYWxvbmcgb25lIGF4aXMgYXQgYSB0aW1lLi4uICBUaGUgbWFpbiB0b29scyAKLUknbSB1c2luZyBhcmUgUHl0aG9uL1RraW50ZXIvUElML051bVB5L1NXSUcuCi08cD4KLVNvLCBJJ3ZlIHVzZSBTV0lHIHRvOgotPHVsPgotPGxpPiBXcmFwIGEgY29tbWVyY2lhbCBzZXJpYWwgY29tbXVuaWNhdGlvbnMgRExMLgotPGxpPiBXcmFwIGEgY29tbWVyY2lhbCBmcmFtZSBncmFiYmVyIGludGVyZmFjZQotPGxpPiBBZnRlciBwcm90b3R5cGluZyBpbiBQeXRob24sIEkgbW92ZSBjb21wdXRlIGludGVuc2l2ZSByb3V0aW5lcyAKLSAgICAgaW50byBETEwncy4KLTwvdWw+Ci1PdXIgYXBwcyBhcmUgcnVubmluZyB1bmRlciBXaW45NS4gIEkgdGhvdWdodCBpdCB3YXMgcHJldHR5IGNvb2wgdG8gYmUgCi1hYmxlIHRvIGNvbnRyb2wgYSBmcmFtZSBncmFiYmVyLCBkaXNwbGF5IGxpdmUvYWNxdWlyZWQgaW1hZ2VzLCBhbGwgCi1mcm9tIHdpdGhpbiBQeXRob24sIHdpdGhpbiB0aGUgc2FtZSBkYXkgSSByZWNlaXZlZCB0aGUgZnJhbWUgZ3JhYmJlciAKLVNESywgbmV2ZXIgaGF2aW5nIGRlYWx0IHdpdGggc3VjaCBoYXJkd2FyZSBiZWZvcmUhCi0KLTxocj4KLTxwPgotU2ltb24gR2lic29uIChnaWJzb25AZHN0Yy5xdXQuZWR1LmF1KQotPHA+Ci0KLUkgaGF2ZSBiZWVuIHVzaW5nIFNXSUcgdG8gY3JlYXRlIGEgUHl0aG9uIGludGVyZmFjZSBmb3Igb3VyCi1wcm90b3R5cGUgaW1wbGVtZW50YXRpb24gb2YgR1NTQVBJLiBUaGlzIGlzIGJlaW5nIGRvbmUgc28KLXRoYXQgd2UgY2FuIGluY29ycG9yYXRlIHNlY3VyaXR5IGludG8gdGhlIEhlY3RvciBwcm9qZWN0IGhlcmUKLWF0IERTVEMuIEl0IGFsc28gbWVhbnMgdGhhdCBJIGNhbiB3cml0ZSBQeXRob24gYXBwbGljYXRpb24KLXByb2dyYW1tZXMuIEFsc28gbm93IHdlIGhhdmUgYSBzdGFuZGFyZCBpbnRlcmZhY2UgdG8gR1NTQVBJCi1hbmQgYW55IGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBhYmxlIHRvIGJlIHBsdWdnZWQgaW4uCi08cD4KLUhlY3RvciBpcyBkZXNjcmliZWQgaW4gYW4gYXJ0aWNsZSBpbiB0aGUgSmFudWFyeS9GZWJydWFyeQotMTk5NyAtIERpc3RyaWJ1dGVkIE9iamVjdHMgPGEgaHJlZj0iaHR0cDovL3d3dy5kZGouY29tL2Rkc2JrLzE5OTcvMTk5Ny4wMS9pbmRleC5odG0iPkRyLiBEb2JiJ3MgU291cmNlYm9vazwvYT4uCi0KLTxocj4KLTxwPgotTWFyayBIYW1tb25kIChNSGFtbW9uZEBza2lwcGluZXQuY29tLmF1KQotCi08cD4KLQotSSdtIHVzaW5nIFtTV0lHXSB0byB3cml0ZSBhIGNvbW1lcmljaWFsIGFwcGxpY2F0aW9uLCB3aGljaCBydW5zIGFzIGFuIE5UCi1zZXJ2aWNlLiAgSXQgdXNlcyB0aGUgQ09NIGV4dGVuc2lvbnMgdG8gdGFsayBuYXRpdmUgTUFQSSB0byBleGNoYW5nZQotc2VydmVyLCB0aGUgc2VydmljZSBleHRlbnNpb25zIHRvIHJ1biB1bmF0dGVuZGVkIG9uIE5ULCBhbmQgdGhlIHBpcGUsIGZpbGUKLWFuZCBldmVudCBtb2R1bGVzIHRvIG1hbmFnZSB0aGUgc2VydmljZSBjb250cm9sIG1lc3NhZ2VzIGFuZCBuYW1lZCBwaXBlCi1jb25uZWN0aW9ucyBmcm9tIGNsaWVudHMuICBBbGwgbW9kdWxlcyBuYW1lZCBhYm92ZSB3ZXJlIGdlbmVyYXRlZCBieSBTV0lHLiAKLVRoZSBDT00gZXh0ZW5zaW9ucyB3aWxsIGFsbG93IChvbmNlIHRoZSAuaSBmaWxlIGlzIHVwIHRvIGl0IDotKSBhbnkgbmF0aXZlCi1DT00gaW50ZXJmYWNlIChpZSwgbm90IElEaXNwYXRjaCAoZWcsIFZCL1dvcmQvRXhjZWwpIGJhc2VkKSB0byBiZSBzdXBwb3J0ZWQKLWJ5IFB5dGhvbi4KLQotPGhyPgotPHA+IE1pY2hhZWwgQmVsbCAobWljaGFlbGJAZ29sZC5uZXQuYXUpCi0KLTxwPgotSSd2ZSB1c2VkIFNXSUcgb24gYSBMaW51eCBwbGF0Zm9ybSB0byBjcmVhdGUgUHl0aG9uIG1vZHVsZXMgZm9yCi1ncmFwaGluZyBhbmQgZGF0YWJhc2UgYWNjZXNzLgotPHA+Ci1UaGUgUEdQTE9UIEdyYXBoaWNzIFN1YnJvdXRpbmUgTGlicmFyeSBpcyBhIEZvcnRyYW4gbGlicmFyeSBieSBUaW0KLVBlYXJzb24gKHRqcEBhc3Ryby5jYWx0ZWNoLmVkdSkuIEkgdW5kZXJzdGFuZCBpdCBpcyBvZnRlbiB1c2VkIGJ5Ci1hc3Ryb25vbWVycy4gIEl0IG1heSBhbHNvIGJlIGJ1aWx0IGludG8gYSBDIGxpYnJhcnkuCi08cD4KLUkgdXNlZCBTV0lHIHRvIHdyYXAgdGhlIEMgbGlicmFyeSB3cmFwcGluZyB0aGUgRm9ydHJhbiBsaWJyYXJ5ICghKQotaW50byBhIFB5dGhvbiBtb2R1bGUsIHVzaW5nIHNvbWUgc3RyYWlnaHRmb3J3YXJkIHR5cGVtYXBzIHRvIGNvbnZlcnQKLW9uZSBhbmQgdHdvIGRpbWVuc2lvbmFsIFB5dGhvbiBOdW1lcmljIGFycmF5cyBpbnRvIHRoZSBhcHByb3ByaWF0ZQotcG9pbnRlcnMuICBJIGhhdmVuJ3QgbWV0aG9kaWNhbGx5IHRlc3RlZCB0aGUgZnVsbCBmdW5jdGlvbmFsaXR5LCBidXQKLWV2ZXJ5dGhpbmcgSSB0cmllZCB3b3JrcyBqdXN0IGZpbmUuCi08cD4KLUkndmUgYWxzbyB1c2VkIFNXSUcgdG8gd3JhcCB1cCBhIGxpYnJhcnkgb2YgRm9ydHJhbiBzdWJyb3V0aW5lcwotZGV2ZWxvcGVkIHdpdGhpbiB0aGUgV2VzdGVybiBBdXN0cmFsaWFuIERlcGFydG1lbnQgb2YgRW52aXJvbm1lbnRhbAotUHJvdGVjdGlvbiB0byBtYW5hZ2UgZGF0YWJhc2VzIG9mIHRpbWUgc2VyaWVzIG1ldGVvcm9sb2dpY2FsIGFuZCBhaXIKLXF1YWxpdHkgZGF0YS4gIEkgdXNlZCBTV0lHIHRvIGdlbmVyYXRlIGEgc2ltcGxlIHNoYWRvdyBjbGFzcyB3aGljaCBJCi10aGVuIGV4dGVuZGVkIGZ1cnRoZXIgdG8gbWFrZSB0aGUgaW50ZXJmYWNlIG5pY2VyLgotPHA+Ci1UaGUgb3JpZ2luYWwgbGlicmFyeSBwcm92aWRlZCwgZm9yIGluc3RhbmNlLCBzdWJyb3V0aW5lcyBvcGVuZGIoKSwKLXdyaXRkYigpLCByZWFkZGIoKSBhbmQgY2xvc2RiKCkuICBNeSBtb2R1bGUsIGVwYWRiLnB5LCBwcm92aWRlcyBhCi1kYXRhYmFzZSBjbGFzcywgZXBhZGIuREIsIHdoaWNoIGlzIGluc3RhbnRpYXRlZCwgZD1lcGFkYi5EQigpLiAgVGhlCi1kYXRhYmFzZSBpbnN0YW5jZSB0aGVuIHByb3ZpZGVzIG1ldGhvZHMgZC5vcGVuKCksIGQucmVhZCgpLCBkLndyaXRlKCkKLWFuZCBkLmNsb3NlKCksIHJldHVybmluZyBkYXRhIGFzIFB5dGhvbiBsaXN0cyBhbmQgYXJyYXlzLgotPHA+Ci1JJ20gcGFydGljdWxhcmx5IHBsZWFzZWQgdGhhdCBJIG1hbmFnZWQgdG8gZG8gdGhlc2UgdGhpbmdzIHdpdGggbXkKLXJlYWRpbmcgb25seSBrbm93bGVkZ2Ugb2YgQywgYW5kIGxvdHMgb2YgY3V0dGluZyBhbmQgcGFzdGluZy4KLQotPGhyPgotPHA+Ci1Tb2VyZW4gSGVua2VsIChzb2VyZW5AaG5pLnVuaS1wYWRlcmJvcm4uZGUpCi08cD4KLVdlIGFyZSBjdXJyZW50bHkgaW4gdGhlIHByb2Nlc3Mgb2YgcmVkZXZlbG9waW5nIE9PUFVTLCBhIHN5c3RlbSBmb3IKLW1vZGVsaW5nIHBsYW50IHN5c3RlbXMgYW5kIGdlbmVyYXRlIHBsYW50IGNvbnRyb2wgc29mdHdhcmUgZnJvbSBhIG1vZGVsLgotKERvbid0IGFzayB3aGF0IE9PUFVTIHN0YW5kcyBmb3IgLWl0J3MgYSBHZXJtYW4gYWNyb255bS4pIFdlIGRlY2lkZWQgdG8gCi1yZWltcGxlbWVudCBpdHMgdXNlciBpbnRlZmFjZSB1c2luZyBUY2wvVGsuIE9PUFVTIHB1dHMgaXRzIG1vZGVscwotaW50byBhbiBPT0RCTVMsIG5hbWVseSBQT0VULiBTbyB3ZSBuZWVkZWQgYW4gaW50ZWdyYXRpb24gb2YgUE9FVAotKHdoaWNoIGlzIHRpZ2h0bHkgY291cGxlZCB0byBDKyspIHdpdGggVGNsL1RrLCBhbmQgd2UndmUgc3VjY2Vzc2Z1bGx5Ci1kb25lIHRoYXQgd2l0aCBTV0lHLgotCi08aHI+Ci08cD4KLVBldGVyIEEuIFRpbmtlciAocGF0aW5rZXJAbXNtYWlsNC5oYWMuY29tKQotPHA+Ci1XZSdyZSB1c2luZyBTV0lHIHRvICJnbHVlIiBUY2wvVGsgdG8gY3VzdG9tIGFuZCB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMuIEluCi1wYXJ0aWN1bGFyLCBTV0lHIHByb3ZpZGVzIGFuIGVsZWdhbnQgbWVhbnMgZm9yIGNvbnRyb2xsaW5nIFNlbnNlOAotQ29ycG9yYXRpb24ncyBXb3JsZFRvb2xLaXQgKFdUSykgdmlydHVhbCBlbnZpcm9ubWVudCBkZXZlbG9wbWVudCBzeXN0ZW0gZnJvbSBhCi1UayBHVUkuIFRoZSByZXN1bHQgaXMgaGlnaGx5IHBvcnRhYmxlIGNvZGUgdGhhdCBpcwotaW5kZXBlbmRlbnQgb2YgV1RLJ3MgcHJvcHJpZXRhcnkgR1VJIHlldCBhbGxvd3MgYWNjZXNzIHRvIHZpcnR1YWxseSBhbGwgV1RLCi1mdW5jdGlvbnMgZnJvbSBhIFRjbCBzY3JpcHQgYW5kL29yIGEgVGsgR1VJLiBUaGlzIGFwcHJvYWNoIGlzCi1iZWluZyB1c2VkIGluIGEgdmFyaWV0eSBvZiBwcm9qZWN0cyBpbnZvbHZpbmcgYWR2YW5jZWQgM0QgdmlzdWFsaXphdGlvbgotb24gYSB2YXJpZXR5IG9mIGltY29tcGF0aWJsZSBzeXN0ZW1zLgotCi08aHI+Ci08cD4KLVBldGVyLVBpa2UgU2xvYW4gKHBwc2xvYW5AY3MudXRhaC5lZHUpCi08cD4KLUkgaGF2ZSBiZWVuIHVzaW5nIFNXSUcgZm9yIHNldmVyYWwgcHJvamVjdHMsIG1vc3RseSB0byBzdHJlYW1saW5lCi13b3JraW5nIHdpdGggT3BlbkdMIHVuZGVyIFRjbC9Uay4gIEV4YW1wbGVzIGFyZSBhIHRpbWUtY3JpdGljYWwKLWZyYW1ld29yayBmb3Igdmlld2luZyBMdW1pZ3JhcGhzIChiYXNpY2FsbHkgYSBkaWdpdGFsIGhvbG9ncmFtKSBhbmQgYQotcHJvb2Ygb2YgY29uY2VwdCBhcHBsaWNhdGlvbiBmb3Igb3B0aW1pemluZyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGJhc2VkCi1vbiByZWxhdGl2ZSBpbXBvcnRhbmNlIChkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyB0aGUgZXhpc3RpbmcgdGV4dHVyZQotYW5kIHVzZXIgc3BlY2lmaWNhdGlvbi4pICBVc2luZyBTV0lHIGhhcyBkcmFtYXRpY2FsbHkgcmVkdWNlZCBteQotZGV2ZWxvcG1lbnQgdGltZSBhbGxvd2luZyBtZSB0byBkZXZlbG9wIGNvZGUgYW5kIGRlYnVnIHN0YXRlIGluIGFuCi1pbnRlcnByZXRlZCBlbnZpcm9ubWVudCAoY3VycmVudGx5IFRjbCwgYnV0IEkgdGhpbmsgSSBhbSBnb2luZyB0byBtb3ZlCi10byBQeXRob24pLgotCi08aHI+Ci08cD4KLUNocmlzIE15ZXJzIChteWVyc0BiZWFtdGVjaC5jb20pCi08cD4KLVdlIGF0IEJlYW0gVGVjaG5vbG9naWVzLCBJbmMuIGhhdmUgdXNlZCBTV0lHIHRvIGJlZ2luIGRldmVsb3BpbmcgYW4KLWludGVycHJldGVkIFB5dGhvbiBpbnRlcmZhY2UgdG8gb3VyIFBERVNvbHZlIGxpYnJhcnkuICBQREVTb2x2ZSBpcyBhCi1DKysgY2xhc3MgbGlicmFyeSBmb3IgZm9ybXVsYXRpbmcgYW5kIHNvbHZpbmcgcGFydGlhbCBkaWZmZXJlbnRpYWwKLWVxdWF0aW9ucyAodXNpbmcgZWl0aGVyIGZpbml0ZSBkaWZmZXJlbmNlIG1ldGhvZHMgb3IgZmluaXRlIGVsZW1lbnQKLW1ldGhvZHMpLCBhbmQgbWFrZXMgdXNlIG9mIE9PIHRlY2hub2xvZ3kgdG8gcHJlc2VudCBhIGhpZ2gtbGV2ZWwKLXN5bWJvbGljIGludGVyZmFjZSB0byB0aGUgcHJvZ3JhbW1lci4gIFRoaXMgbWFrZXMgdGhlIGRlc2NyaXB0aW9uIG9mCi1QREUtYmFzZWQgcHJvYmxlbXMgY29uY2lzZSwgYW5kIGVuYWJsZXMgdGhlIGVtYmVkZGluZyBvZiBQREUtYmFzZWQKLW1vZGVscyBpbiBsYXJnZXIgY29tcHV0YXRpb25hbCBmcmFtZXdvcmtzIChlLmcuLCB0byBkbyBQREUtYmFzZWQKLWRlc2lnbiBvcHRpbWl6YXRpb24gb3IgY291cGxlZCBQREUtYmFzZWQgc3lzdGVtcykuICBTV0lHIGhhcyBhbGxvd2VkCi11cyB2ZXJ5IHF1aWNrbHkgdG8gZGV2ZWxvcCBhIHByb3RvdHlwZSBQeXRob24gaW50ZXJmYWNlIHRvIHRoYXQKLWxpYnJhcnkuICBTdWNoIGFuIGludGVyZmFjZSBob2xkcyB0aGUgcHJvbWlzZSBvZjogKDEpIGFsbG93aW5nIGV2ZW4KLW1vcmUgcmFwaWQgcHJvdG90eXBpbmcgb2YgbW9kZWxzLCAoMikgZHluYW1pYyBmb3JtdWxhdGlvbiBvZiBtb2RlbHMKLWFuZCBzb2x1dGlvbiBtZXRob2RzLCBhbmQgKDMpIGEgbWV0aG9kIGZvciBjb252ZW5pZW50bHkgaW50ZWdyYXRpbmcKLVBERVNvbHZlIHdpdGggb3RoZXIgcGFja2FnZXMgKGkuZS4sIHRocm91Z2ggdGhlIFB5dGhvbiBzdWJzdHJhdGUpLgotTXkgaG9wZSBpcyB0byBtYWtlIGEgUHl0aG9uLWVuYWJsZWQgUERFU29sdmUgYSB0b29sIGZvciBQREVzIHNvbWV0aGluZwotbGlrZSB3aGF0IE1hdGxhYiBwcm92aWRlcyBmb3IgbGluZWFyIGFsZ2VicmEsIGkuZS4sIGEgaGlnaC1sZXZlbCwKLWludGVycHJldGVkIGVudmlyb25tZW50IGZvciByYXBpZCBwcm90b3R5cGluZyBhbmQgaW50ZXJhY3RpdmUKLWV4cGxvcmF0aW9uLCB3aXRoIGFuIGVtYmVkZGVkIHByb2dyYW1taW5nIGxhbmd1YWdlIGZvciBzY3JpcHRpbmcKLWNvbXBsZXggY29kZXMuCi0KLTxwPgotQW5kIHdoaWxlIEkgaGF2ZSBiZWVuIGxvb2tpbmcgZm9yIGEgd2hpbGUgZm9yIGEgcG93ZXJmdWwgYW5kCi1leHRlbnNpYmxlIGludGVycHJldGVkIGxhbmd1YWdlIGZvciB1c2UgYXMgYSBmcm9udC1lbmQgdG8gY29tcGlsZSBjb2RlcwotKHdoaWNoIFB5dGhvbiBpcyksIFNXSUcgaGFzIG1hZGUgdGhlIGludGVyZmFjaW5nIG9mIHRoYXQgY29kZSB2YXN0bHkKLWVhc2llciB0aGFuIGl0IHdvdWxkIGhhdmUgYmVlbiBvdGhlcndpc2UuICBXaGlsZSB3ZSBhcmUgc3RpbGwgaW4gdGhlCi1wcm90b3R5cGluZyBzdGFnZXMgb2YgdGhpcyBvdmVyYWxsIGFwcHJvYWNoLCBTV0lHIGVuYWJsZWQgdXMgdG8gZ2V0IHVwCi1hbmQgcnVubmluZyBxdWlja2x5IHdpdGggYSBQeXRob24gaW50ZXJmYWNlIHRvIFBERVNvbHZlLCBhbmQKLWRlbW9uc3RyYXRlIHRoZSB1dGlsaXR5IG9mIHN1Y2ggYW4gYXBwcm9hY2ggZm9yIGEgY29tcGxleCBDKysgbGlicmFyeQotKHNvbWV0aGluZyB0aGF0IFNXSUcgd2FzIG5vdCBvcmlnaW5hbGx5IGRlc2lnbmVkIHRvIHJlYWxseSB0YWNrbGUpLgotCi08aHI+Ci08cD4KLVZsYWRpbWlyIEkuVWxvZ292IChnYW5kYWxmQHN0YXJzaGlwLnNreXBvcnQubmV0KQotPHA+Ci0KLVNXSUcgaXMgYmVpbmcgdXNlZCB0byBjcmVhdGUgYSBQeXRob24gaW50ZXJmYWNlIHRvIENMSVBTIGV4cGVydCBzeXN0ZW0gc2hlbGwKLWluc2lkZSBteSBnZW5lcmFsIHJlc2VhcmNoIGpvYiB1bmRlciBPT0RCTVMgRE5FVC4gVGhpcyBleHRlbnRpb24gbW9kdWxlCi1wcm92aWRlIGZ1bGwgY29udHJvbCBmcm9tIFB5dGhvbiBlbnZpcm9ubWVudCB0byBleHBlcnQgc3lzdGVtOiBDaGFuZ2UgYQotZ2xvYmFsIHZhbGlhYmxlcywgcmVnaXN0ZXIgYSBmYWN0LCBtYW5pcHVsYXRpb24gd2l0aCBhZ2VuZGEsIGZhY3QgbGlzdHMsCi1tb2R1bGVzLCBmdW5jdGlvbnMsIGNsYXNzZXMgYW5kIGluc3RhbmNlcy4gWW91IGNhbiBkeW5hbWljYWx5IGNyZWF0ZSBhbmQKLWV4ZWN1dGUgQ0xJUFMgY29tbWFuZHMgdXNpbmcgY2xpcHMuUm91dGVDb21tYW5kIGZ1bmN0aW9uIGNhbGwuIE1vZHVsZQotaW50ZXJmYWNlIGFyZSBzaW1pbGFyIHRvIENMSVBTIEFkdmFuY2VkIEFQSSwgd2hvIGRlc2NyaWJlZCBpbnRvIENMSVBTCi1kb2N1bWVudGF0aW9uLiBBbGwgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uLCBQeXRob24gY2xhc3NlcyBhcmUgZGlzdHJpYnV0ZWQKLXRvby4gTW9kdWxlIHdhcyBiZSB0ZXN0ZWQgb24gV2luZG93cy9OVCBhbmQgU1VOIFNvbGFyaXMgMi40IGhvc3QgcGxhdGZvcm1zLAotQ0xJUFMgdmVyc2lvbjogNi4wNCwgUHl0aG9uIHZlcnNpb24gMS40LiBUaGlzIG1vZHVsZSBjb25zaXN0IGFib3V0IDI3MAotZnVuY3Rpb25zLiBUaGlzIGpvYiB0b29rIDMgZGF5cyBvZiBteSBqb2IgYXQgb2N0b2JlciAxOTk3LgotCi08aHI+Ci08cD4KLVBpbmhvbmcgQ2hlbiAocGhjaGVuYkB0c21jLmNvbSkKLTxwPgotSSBnb3QgYSBwYWdlIGZvcgotPGEgaHJlZj0iaHR0cDovL3d3dy1jYWQuZWVjcy5iZXJrZWxleS5lZHUvfnBpbmhvbmcvc2NyaXB0RURBIgotPkVEQSBhcHBsaWNhdGlvbnM8L2E+Ci11c2luZyBTV0lHLgotCi08aHI+Ci08aDM+IFRvb2xzIGFuZCBNb2R1bGVzIDwvaDM+Ci1UaGUgZm9sbG93aW5nIHRvb2xzIGFuZCBtb2R1bGVzIGhhdmUgYmVlbiBwcm9kdWNlZCB1c2luZyBTV0lHCi1vciBhcmUgcmVsYXRlZCB0byBTV0lHLgotCi08dWw+Ci08bGk+PHA+PGEgaHJlZj0iaHR0cDovL3d3dy50aGVzdHVmZi5uZXQvYm9iL3Byb2plY3RzL2JsYWRlIj5CTEFERTwvYT4uIEEgd2ViIHB1Ymxpc2hpbmcgZW52aXJvbm1lbnQuCi0KLTxsaT48cD48YSBocmVmPSJodHRwOi8vc3R1ZGVudHMuY3MuYnl1LmVkdS9+YnV0bGVyL2puaS9QeUphdmEuaHRtbCI+UHlKYXZhPC9hPi4gUHJvdmlkZXMKLVB5dGhvbiBhY2Nlc3MgdG8gSmF2YSBtZXRob2RzIChLZXZpbiBCdXRsZXIpLiAKLQotPGxpPjxwPjxhIGhyZWY9Imh0dHA6Ly9wbGF5Z3JvdW5kLnN1bi5jb20vfmJoYXJhdC9waWxvdG1nci5odG1sIj5QaWxvdCBNYW5hZ2VyPC9hPi4gSG9vawoteW91ciBVUyBSb2JvdGljcyBQYWxtUGlsb3QgdXAgdG8geW91ciBTdW4gd29ya3N0YXRpb24gKEJoYXJhdCBNZWRpcmF0dGEpLgotCi08bGk+PHA+IDxhIGhyZWY9Imh0dHA6Ly93d3cubWljLmF0ci5jby5qcC9+Z3VsbGl2ZXIvV1RLL3d3dyI+UHlXVEs8L2E+LiAgQSBQeXRob24KLWludGVyZmFjZSB0byB0aGUgV29ybGRUb29sS2l0IChhIHZpcnR1YWwgcmVhbGl0eSBtb2RlbGluZyB0b29sa2l0KS4gKFJvYmVydG8gTG9wZXogR3VsbGl2ZXIpCi0KLTxsaT48cD4gQSBQeXRob24gaW50ZXJmYWNlIHRvCi08YSBocmVmPSJodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9jcmV3L3JvYmluZC9pbmRleC5odG1sIj5CU0QgREIgMi43Lng8L2E+IChSb2JpbiBEdW5uKS4KLQotPGxpPjxwPjxhIGhyZWY9Imh0dHA6Ly9hbGxkdW5uLmNvbS93eFB5dGhvbi9pbmRleC5odG1sIj53eFB5dGhvbjwvYT4uIEEgUHl0aG9uIGV4dGVuc2lvbgotbW9kdWxlIHRoYXQgZW5jYXBzdWxhdGVzIHRoZSB3eFdpbmRvd3MgR1VJIGNsYXNzZXMuCi0KLTxsaT48cD4gTmV0LVBjYXAuICBBIFBlcmwgaW50ZXJmYWNlIHRvIHRoZSBsaWJwY2FwIGxpYnJhcnkgKFBldGVyIExpc3RlcikuCi0KLTxsaT48cD4gWDExOjpXY2wuIEEgUGVybCBpbnRlcmZhY2UgdG8gdGhlIFdpZGdldCBDcmVhdGlvbiBMaWJyYXJ5IChKb2UgQnVlaGxlcikuCi0KLTwvdWw+Ci0KLTxocj4KLTxoMz4gT3RoZXIgQXBwbGljYXRpb24gQXJlYXMgPC9oMz4KLQotVGhlc2UgYXJlIHNvbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGFyZWFzIHRoYXQgSSd2ZSBoZWFyZCBhYm91dCBTV0lHIGJlaW5nCi11c2VkIChidXQgZG9uJ3QgaGF2ZSBtYW55IGRldGFpbHMpLgotCi08dWw+Ci08bGk+IFNlbWljb25kdWN0b3IgQ0FELgotPGxpPiBEYXRhYmFzZXMuCi08bGk+IFJlbW90ZSBzZW5zaW5nLgotPGxpPiBTY2llbnRpZmljIHZpc3VhbGl6YXRpb24gYW5kIHNpbXVsYXRpb24uCi08bGk+IEZpbmFuY2lhbCBNb2RlbGluZy4KLTxsaT4gRGlzdHJpYnV0ZWQgYW5kIHBhcmFsbGVsIGNvbXB1dGluZy4KLTxsaT4gRGlzdHJpYnV0ZWQgb2JqZWN0cyAodXNlIHdpdGggQ09SQkEpLgotPGxpPiBTb2Z0d2FyZSB0ZXN0aW5nLgotPC91bD4KLQotPGhyPgotPGgzPiBIb3cgYXJlIHlvdSB1c2luZyBTV0lHPyA8L2gzPgotCi1JZiB5b3Ugd291bGQgbGlrZSB0byBsaXN0IHlvdXIgcHJvamVjdCBoZXJlLCBwbGVhc2UKLXNlbmQgZS1tYWlsIHRvIGJlYXpsZXlAY3MudWNoaWNhZ28uZWR1LgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wcm9wYWdhbmRhLmh0IGIvc3dpZ3dlYi9wcm9wYWdhbmRhLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWFiYjM1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcHJvcGFnYW5kYS5odAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi1TV0lHIFByb3BhZ2FuZGEKLQotPHA+PGltZyBzcmM9ImltYWdlcy9wcm9wYWdhbmRhLnBuZyIgYWx0PSJQcm9wYWdhbmRhIj4KLQotPHA+Ci1UaGUgZm9sbG93aW5nIGNvbW1lbnRzIGFib3V0IFNXSUcgd2VyZSBjb2xsZWN0ZWQgYnkgYSB1c2VyIHN1cnZleSBjb25kdWN0ZWQKLWluIE1hcmNoLCAxOTk4LiAgICAKLQotPHVsPgotCi08bGk+PHA+IlNXSUcgaGFzIGhlbHBlZCB1cyBtaW5pbWl6ZSB0aGUgaGFzc2xlIG9mIHdyaXRpbmcgbWFudWFsIHdyYXBwZXJzLgotU2luY2UgU1dJRyBoYXMgcHJvdmVuIHRvIGJlIHJhdGhlciBlYXN5IHRvIHVzZSwgSSBmaW5kIEkgY2FuIGNhcnJ5IG91dCB0aGUgdHlwZXMgb2Ygd3JhcHBpbmcKLWFjdGl2aXRpZXMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGhhdmUgYmVlbiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYQotY29tcHV0ZXIgc2NpZW50aXN0LiIKLQotPGxpPjxwPiJJIHJlYWxseSBsb3ZlIHRoZSBmYWN0IHRoYXQgdGhlIGxlYXJuaW5nIGN1cnZlIGlzIHNob3J0Ci1hbmQgZmxhdC4gIEkgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcyBmYWNpbGl0eSB2ZXJ5IG9mdGVuLAotYnV0IHdoZW4gSSBhYnNvbHV0ZWx5IGhhdmUgdG8gbGluayBpbiBleHRlcm5hbCBDIHJvdXRpbmVzLAotb3Igd2hlbiBJIGhhdmUgdG8gZ2V0IHRoZSBsYXN0IGRyb3Agb2Ygc3BlZWQgZnJvbSBzb21ldGhpbmcKLXByZXZpb3VzbHkgd3JpdHRlbiBpbiBQZXJsLCBJIGNhbiBjb3VudCBvbiBTV0lHIHRvIGJlIHRoZXJlLgotV2hlbiBJIGRvIHVzZSBTV0lHLCBJIGRvbid0IG5lZWQgdG8gc3BlbmQgaG91cnMgbGVhcm5pbmcKLWFuZCBkZWJ1Z2dpbmcgdGhlIHN5c3RlbS4gIFRoaXMgaXMgdGhlIGNsb3Nlc3QgdGhpbmcgdG8KLWN1dC1hbmQtcGFzdGUgSSd2ZSBldmVyIHNlZW4gaW4gaW50ZXItbGFuZ3VhZ2UgbGlicmFyeQotY3JlYXRpb24uIgotCi08bGk+PHA+IldlIGFyZSBhIHJlc2VhcmNoIGdyb3VwIHRoYXQgZGV2ZWxvcHMgbWVkaWNhbCBpbWFnaW5nIHNvZnR3YXJlLgotV2UgYXJlIGludGVyZXN0ZWQgaW4gaW1hZ2UgcHJvY2Vzc2luZy92aXN1YWxpemF0aW9uIHJlc2VhcmNoLAotYW5kIGZvciBvdXIgc29mdHdhcmUsIHdlIHdhbnQgYSBzaW1wbGUgYW5kIHBvcnRhYmxlIHRvb2wgdG8KLWdlbmVyYXRlIHVzZXIgaW50ZXJmYWNlcy4gRm9yIHRoaXMsIHdlIGN1cnJlbnRseSB1c2UKLVRjbC9UaywgYW5kIFNXSUcgd2hpY2ggcHJvdmlkZXMgYSBuaWNlIHdheSB0byBjb25uZWN0IG91cgotc29mdHdhcmUgKGluIEMrKykgdG8gdGhlIHRjbC1zY3JpcHRzLiIKLQotPGxpPjxwPiJWZXJ5IHF1aWNrIGZpcnN0IHJlc3VsdHMuIgotCi08bGk+PHA+IkVhc3kgdG8gdXNlLCBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGxhbmd1YWdlIGludGVybmFscy4gSXQgaXMgYSBib29uIGZvciBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzLCBsaWtlIG1lLiIKLQotPGxpPjxwPiJJIGxpa2UgdGhlIGZhY3QgdGhhdCBpdCBhdXRvbWF0ZXMgbXVjaCBvZiB0aGUgdGVkaW91cyB3b3JrCi1pbiBidWlsZGluZyBhbiBpbnRlcmZhY2UgQy9DKysgZnVuY3Rpb25zLiAgVGhpcyBtYWtlcyBkZXZlbG9wbWVudCBlYXNpZXIuIgotCi08bGk+PHA+IlNXSUcgaXMgYnkgZmFyIHRoZSBlYXNpZXN0IHdheSBJIGhhdmUgZm91bmQgdG8gZ2VuZXJhdGUgCi1zY3JpcHRpbmcgaW50ZXJmYWNlcyBmb3Igc2NpZW50aWZpYyBzb2Z0d2FyZS4gU1dJRyBtYWtlcyBpdCAKLXByYWN0aWNhbCB0byB1c2UgYSBzaW5nbGUsIHBvd2VyZnVsIHNjcmlwdGluZyBsYW5ndWFnZSBmb3IgCi1hbGwgcHJvamVjdHMgcmF0aGVyIHRoYW4gd3JpdGluZyBhIGN1c3RvbSBpbnRlcmZhY2UgdG8gZWFjaC4gCi1JdCBhbHNvIGVuY291cmFnZXMgYSBjb25zaXN0ZW50IGFuZCBtb2R1bGFyIGZvcm0gZm9yIGEgcHJvZ3JhbSwKLWFuZCBtYWtlcyBpdCBlYXNpZXIgdG8gYWRkIGNvbnRyaWJ1dGlvbnMgdG8gbXkgcHJvZ3JhbXMgZnJvbSAKLW90aGVyIHVzZXJzL3Byb2dyYW1tZXJzLiIKLQotPGxpPjxwPiJJIGxpa2UgdGhlIGVhc2Ugd2l0aCB3aGljaCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGNhbiBiZSBleHRlbmRlZC4KLVRoZSBmYWN0IHRoYXQgd2UgY291bGQgc28gZWFzaWx5IGludGVyZmFjZSB3aXRoIExvdHVzIE5vdGVzIG9uIE5UIHVzaW5nIFB5dGhvbiB3YXMganVzdCBhbWF6aW5nLiIKLQotPGxpPjxwPiJTV0lHIG1ha2VzIGxpbmtpbmcKLW15IGFwcGxpY2F0aW9uIHRvIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGVhc3kgZW5vdWdoCi10aGF0IGl0IGlzIHdvcnRod2hpbGUuIgotCi08bGk+PHA+IkkgY2FtZSwgSSBzYXcsIEkgd3JhcHBlZC4gIEFuZCBpdCByYW4uICBXb28gaG9vISIKLQotPGxpPjxwPiJXaXRob3V0IFNXSUcgaXQgd291bGQgaGF2ZSB0YWtlbiBtdWNoLCBtdWNoIGxvbmdlciBmb3IKLW91ciBncm91cCB0byB1c2UgUHl0aG9uIGFzIGFuIGV4dGVuc2lvbiBsYW5ndWFnZS4gIE91ciB3aG9sZQotYXBwbGljYXRpb24gd2FzIHdyaXR0ZW4gbW9zdGx5IGluIEMrKy4gIFdlIHdhbnRlZCB0byBsb29rCi1pbnRvIHVzaW5nIFB5dGhvbiBmb3IgcG9ydGlvbnMgb2YgaXQgaW4gb3JkZXIgdG8gbWFrZSBpdAotZWFzaWVyIHRvIGV4dGVuZC4gIFB5dGhvbiBoYXMgYSBmYWlybHkgbmljZSBpbnRlcmZhY2UgZm9yCi1kb2luZyB0aGlzIHNvcnQgb2YgdGhpbmcuICBUaGUgdHJvdWJsZSB3YXMgdGhhdCB3ZSBuZWVkZWQgdG8KLW1ha2UgaHVuZHJlZHMgb2YgQysrIGNsYXNzZXMgYXZhaWxhYmxlIHRvIFB5dGhvbi4gIFRoaXMKLXdvdWxkIGhhdmUgdGFrZW4gYSB2ZXJ5IGxvbmcgdGltZSAodG8gd3JpdGUgdGhlIHdyYXBwZXIgY29kZSkuCi1TV0lHIGFsbG93ZWQgdXMgdG8gc3BlbmQgYSBtaW5pbWFsIGFtb3VudCBvZiB0aW1lIHdpdGgKLXRoZSB3cmFwcGVyIGNvZGUgYW5kIG1vc3Qgb2Ygb3VyIHRpbWUgbW92aW5nIHN0dWZmIHRvIFB5dGhvbgotKHdoaWNoIHdhcyB0aGUgYmlnIHBvaW50IGluIHRoZSBmaXJzdCBwbGFjZSkuIgotCi08bGk+PHA+IlNXSUcgaXMgYSBodWdlIHRpbWUtc2F2ZXIuICBJIGhhdmUgYXBwcm94aW1hdGVseSAzMCwwMDAgCi1saW5lcyBvZiBDIGFuZCBQeXRob24gY29kZSB0aGF0IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgCi1TV0lHIHRoYXQgSSBkaWRuJ3QgaGF2ZSB0byB3cml0ZSBieSBoYW5kLCBkb24ndAotaGF2ZSB0byBmaXggc3ludGF4IGFuZCBmdW1ibGUtZmluZ2VyIGVycm9ycyBpbiwgYW5kIAotZG9uJ3QgaGF2ZSB0byBhZ2dyZXNzaXZlbHkgdGVzdC4iCi0KLTxsaT48cD4iU1dJRyBoZWxwcyB1cyBpbiB0YWtpbmcgYXdheSBwYXJ0IG9mIHRoZSBlcnJvci1wcm9uZSB0YXNrIG9mIG1ha2luZwotdGhlIEMgcm91dGluZXMgYWNjZXNzaWJsZSBmcm9tIFB5dGhvbiBhbmQgaGFzIGNvbnNpZGVyYWJseSBpbXByb3ZlZAotb3VyIGVmZmljaWVuY3kuIgotCi08bGk+PHA+IkkgbGlrZSBhbGwgdGhlIHRpbWUgSSBoYXZlIHNhdmVkIGJ5IG5vdCB3cml0aW5nIHRoZSBpbnRlcmZhY2VzIG15c2VsZi4iCi0KLTxsaT48cD4iU1dJRyBzYXZlcyBhIGxvdCBvZiBteSBlbmVyZ3kgaW4gaW50ZXJmYWNpbmcgd2l0aCBtYW55IGZyZWUKLUMvQysrIGxpYnJhcmllcyBpbiBteSBwcm9qZWN0LiIKLQotPGxpPjxwPiJTV0lHIGhhbmRsZXMgdGhlIGdvcnkgZGV0YWlscyBhbmQgYWxsb3dzIG1lIHRvIGNvbmNlbnRyYXRlIG9uIHRoZSBpbXBvcnRhbnQgdGhpbmdzLiIKLQotPGxpPjxwPiJVc2luZyBTV0lHIGlzIHJlYWxseSBmdW4sIGJlY2F1c2UgaXQgc2F2ZXMgeW91IGZyb20gCi1hIGxvdCBvZiBtZWNoYW5pY2FsIHdvcmsgYW5kIGl0IHRha2VzIGNhcmUgb2YgYWxsIHRoZSAKLWRldGFpbHMgeW91IGRvbid0IHdhbnQgdG8gYm90aGVyIHdpdGggbGV0dGluZyB5b3UgCi1jb25jZW50cmF0ZSBvbiB0aGUgcmVhbCBwcm9ibGVtLiIKLQotPGxpPjxwPiJUaGFua3MgYWdhaW4gZm9yIFNXSUcuLi4gSXQncyBmdW4gYW5kIGFsbG93cyBncmVhdCBwcm9kdWN0aXZpdHkgd2hpbGUKLWF2b2lkaW5nIG11Y2ggdGVkaXVtLiIKLQotPGxpPjxwPiJbSSBsaWtlXSB0aGUgYWJpbGl0eSB0byB3cml0ZSBleHRlbnNpb25zIGJhc2ljYWxseSB3aXRob3V0IGhhdmluZyB0byB0aGluayB0b28KLWhhcmQgYWJvdXQgd2hhdCBJJ20gZG9pbmcuIgotCi08bGk+PHA+IlNXSUcgYWxsb3dzIG1lIHRvIGdldCBvbiB3aXRoIHNjcmlwdGluZwotYW5kIHdyaXRpbmcgQysrIGNvZGUgd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgdGhlIAotKHVzdWFsbHkgY29uc2lkZXJhYmxlKSBpc3N1ZXMgaW52b2x2ZWQgaW4gZXh0ZW5kaW5nIHRoZQotc2NyaXB0aW5nIGxhbmd1YWdlIHdpdGggbXkgY3VzdG9tIGNvbXBvbmVudHMuIgotCi08bGk+PHA+IlVzaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGFzIGdsdWUgYmV0d2VlbiBDKysgY29tcG9uZW50cwotaXMgYSBwb3dlcmZ1bCBwYXJhZGlnbSBmb3IgY29tYmluaW5nIGZsZXhpYmlsaXR5IHdpdGggCi1yb2J1c3RuZXNzIGFuZCBlZmZpY2llbmN5LiAgU1dJRyBlbmFibGVzIHRoaXMgbW9kZWwgYnkKLXByb3ZpZGluZyBhIHNvbGlkIGJyaWRnZSBiZXR3ZWVuIHRoZSBDKysgY29tcG9uZW50IGFuZCAKLXRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIgotCi08bGk+PHA+IlRoZSBhYmlsaXR5IHRvIGBgZm9sbG93JycgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBjb3JlCi1hcHBsaWNhdGlvbiB3aXRob3V0IGNvbnN0YW50bHkgcmVidWlsZGluZyB0aGUgaW50ZXJmYWNlCi1pcyB2ZXJ5IGVmZmVjdGl2ZS4gVGhlIGRldmVsb3BtZW50cyBvZiB0aGUga2VybmVsIGFuZCBpdHMgaW50ZXJmYWNlIGFyZSAKLW11dHVhbGx5IHByb3RlY3RlZCB0byBhIGxhcmdlIGRlZ3JlZS4iCi0KLTxsaT48cD4iU1dJRyBhbGxvd3MgdXMgdG8gcmVjeWNsZSBhIGxvdCBvZiB1Z2x5IG9sZCBDIGNvZGUgYW5kIHB1dAotaXQgaW50byBhIHJlYXNvbmFibGUgbW9kdWxlIHN0cnVjdHVyZSBhbmQgc25henp5IG5ldyB1c2VyCi1pbnRlcmZhY2VzLiIKLQotPGxpPjxwPiJJdCBhbGxvd3MgdXMgdG8gbGV2ZXJhZ2UgdGhlIGFkdmFudGFnZXMgb2YgdGhlIHNjcmlwdGluZwotbGFuZ3VhZ2UsIGVzcGVjaWFsbHkgd2hlbiBzbyBtYW55IG90aGVyIHNjcmlwdHMgYXJlIGFscmVhZHkKLWJlaW5nIHdyaXR0ZW4gdG8gZ2x1ZSBwcm9ncmFtcyB0b2dldGhlciBhbmQgc29tZSBvZiBvdXIKLW90aGVyIHRvb2xzIGhhdmUgdGhlaXIgb3duIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuCi1Vc2luZyBTV0lHIHdpbGwgYWxsb3cgdXMgdG8gcHJvcGVybHkgaW50ZWdyYXRlIGVhY2ggb2YgdGhlCi1wYXJ0cyBkaXJlY3RseSBpbnRvIHRoZSBsYW5ndWFnZSBpbnN0ZWFkIG9mIGEgY29sbGVjdGlvbgotb2Ygc3lzdGVtKCkgY2FsbHMuIgotCi08bGk+PHA+IkJlZm9yZSBJIGhhZCB0byB1c2UgQysrIGZvciBteSBgYHJhcGlkJycgcHJvdG90eXBpbmcuCi1Ob3cgSSBjYW4gc2NyaXB0IGl0ISIKLQotPGxpPjxwPiJNeSBjb2RlIGlzIGNsZWFuZXIgYW5kIG1vcmUgY29tcGFjdCB3aGljaCBtYWtlcyBpdCBlYXNpZXIgdG8KLXJlYWQgYW5kIHVuZGVyc3RhbmQuICBTV0lHIGFsc28gZW5jb3VyYWdlcyBtb2R1bGFyaXplIGNvZGUtLWFsbG93aW5nCi1vbmUgdG8gdGVzdC9kZWJ1ZyBtb2R1bGVzIGluZGVwZW5kZW50bHkuICBUaGlzIG1ha2VzIGNvbm5lY3RpbmcKLWV2ZXJ5dGhpbmcgdG9nZXRoZXIgYSBicmVlemUuIgotCi08bGk+PHA+IlRoZSB2ZXJ5IGlkZWEgb2Ygc2NyaXB0aW5nIHByb2dyYW1taW5nIG9uIHRoZSBvbmUgaGFuZCBhbmQKLXN5c3RlbXMgcHJvZ3JhbW1pbmcgb24gdGhlIG90aGVyIGlzIHF1aXRlIG5pY2UsIHRoZSBtb3N0Ci1pbXBvcnRhbnQgZmVhdHVyZSBvZiBTV0lHIGlzIHRvIG1ha2UgdGhpcyBhcHByb2FjaAotcHJhY3RpY2FsIG9uIGEgZGF5LWJ5LWRheSBiYXNpcy4iCi0KLTxsaT48cD4iT24gdGhlIHdob2xlLCBTV0lHIGlzIG15IG1vc3QgaW1wb3J0YW50IGRldmVsb3BtZW50IHRvb2wgCi1hZnRlciBnY2MhIgotCi08bGk+PHA+IlNXSUcgaGFzIGVuYWJsZWQgb3VyIGN1c3RvbWVycyB0byBpbnRlcmFjdCB3aXRoIG91ciB0b29sa2l0cyBpbiBmdW5kYW1lbnRhbGx5Ci1uZXcgd2F5cy4iCi0KLTxsaT48cD4iV2UgYXJlIHVzaW5nIFRjbCBzY3JpcHRzIGFzIHRoZSBkYXRhIGZpbGVzIGRyaXZpbmcgb3VyIAotc2ltdWxhdGlvbnMuICBPbmNlIHRoZSBkYXRhIGlzIGRlZmluZWQgdXNpbmcgYSBwcm9ncmFtCi0od2hpY2ggaXMgcHJldHR5IGNvb2wgaW4gaXRzZWxmKSwgd2UgY2FuIGFjdHVhbGx5IHJ1biB0aGUKLXNpbXVsYXRpb24gZnJvbSBzY3JpcHQgY29tbWFuZHMuICBJbiBvdXIgZXhwZXJpbWVudGFsIAotZW52aXJvbm1lbnQsIHRoYXQgc2F2ZXMgcmV3cml0aW5nIGEgbG90IG9mICJtYWluIiBwcm9ncmFtcwotdGhhdCBleGVyY2lzZSB0aGUgc2FtZSBiYXNpYyBvYmplY3RzLiBUaGlzIGlzbid0IGV4YWN0bHkgY29tcHV0YXRpb25hbCBzdGVlcmluZywgYnV0IGl0IGRvZXMgZ2l2ZQotb3VyIGVuZ2luZWVycyBhIGxvdCBvZiBmbGV4aWJpbGl0eS4iCi0KLTxsaT48cD4iQWxsICh3ZWxsIG1vc3QpIG9mIG15IEMrKyBjb2RlIChNQyBzaW11bGF0aW9ucyBvZgotcHJvdGVpbnMgYW5kIHNlcXVlbmNlIGFuYWx5c2lzKSBpcyBub3cgZHJpdmVuIGJ5Ci1hIFB5dGhvbiBpbnRlcmZhY2UgdGhhbmtzIHRvIFNXSUcuICBPbmNlIEkgaGF2ZSBkZWNpZGVkIG9uIGFuIGludGVyZmFjZSwgdGhlCi1wcm9jZXNzIG9mICBidWlsZGluZyBpdCBpcyB1c3VhbGx5IHRyaXZpYWwuIgotCi08bGk+PHA+IlNXSUcgaXMgYW4gaW50ZWdyYWwgcGFydCBvZiBhIHVzZXIgZW52aXJvbm1lbnQgSSBhbSBjcmVhdGluZyBmb3IgYSBNb2xlY3VsYXIgRHluYW1pY3MgY29tcGFueS4KLVRoZXkgaGF2ZSBGT1JUUkFOIG1vZHVsZXMgdGhhdCByZXF1aXJlIGEgc3RlZXJpbmcgbGFuZ3VhZ2UgKFB5dGhvbikgdG8gZW5hYmxlIGZsZXhpYmxlIGNvbXB1dGF0aW9uYWwKLXJlc2VhcmNoLiIKLQotPGxpPjxwPiJTV0lHIHBsYXlzIGEgY3JpdGljYWwgcm9sZSB0byBhdXRvbWF0ZSB0aGUgZ2VuZXJhdGlvbiBvZgotUGVybCBjbGllbnQgaW50ZXJmYWNlcyBmcm9tIHRoZSBPTUcgSURMcyBmb3IgYSBDT1JCQSBPUkIuCi1UaGUgUGVybCBjbGllbnQgaW50ZXJmYWNlIGlzIGVzc2VudGlhbCBpbiBzY3JpcHQgZHJpdmVuCi10ZXN0aW5nLiIKLQotPGxpPjxwPiJJIGFtIGVuam95aW5nIHJhcGlkbHkgZGV2ZWxvcGluZyBjb21wbGV4IHByb2plY3RzIHVzaW5nIE9PCi1hbmQgUHl0aG9uLCBidXQgY29taW5nIGZyb20gYSBudW1lcmljYWwgYmFja2dyb3VuZCwgSSBsaWtlCi10aGF0IEkgY2FuIGdldCBmYXN0IG51bWJlciBjcnVuY2hpbmcgcGVyZm9ybWFuY2Ugd2hlbiBJIAotbmVlZCBpdCBmcm9tIEMgbW9kdWxlcyB3cmFwcGVkIHVwIGJ5IFNXSUcuICIKLTwvdWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL3JhbnRzLmh0IGIvc3dpZ3dlYi9yYW50cy5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3ZWM5Yy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3JhbnRzLmh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TV0lHIFJhbnRzCi0KLTxwPgotPGltZyBzcmM9ImltYWdlcy9yYW50cy5wbmciIGFsdD0iUmFudHMiPgotCi08cD4KLVdlbGwsIHRoZXJlJ3Mgbm90aGluZyBoZXJlIHlldCwgYnV0IHJlc3QgYXNzdXJlZCwgdGhlcmUgYXJlIHBsZW50eSBvZiB0aGluZ3MgdG8gcmFudAotYWJvdXQuCmRpZmYgLS1naXQgYS9zd2lnd2ViL3JlbGVhc2UuaHQgYi9zd2lnd2ViL3JlbGVhc2UuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTQ4ZDIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9yZWxlYXNlLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotUmVsZWFzZSBOb3RlcwotCi08aDI+UmVsZWFzZSBOb3RlczwvaDI+Ci0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBTV0lHIENWUyByZXBvc2l0b3J5LgotCi08dWw+Ci08bGk+PGEgaHJlZj0iUmVsZWFzZS9SRUFETUUiPlJFQURNRTwvYT4KLTxsaT48YSBocmVmPSJSZWxlYXNlL0NIQU5HRVMiPkNIQU5HRVM8L2E+Ci08bGk+PGEgaHJlZj0iUmVsZWFzZS9DSEFOR0VTLmN1cnJlbnQiPkNIQU5HRVMuY3VycmVudDwvYT4KLTxsaT48YSBocmVmPSJSZWxlYXNlL05FVyI+TkVXPC9hPgotPGxpPjxhIGhyZWY9IlJlbGVhc2UvTElDRU5TRSI+TElDRU5TRTwvYT4KLTwvdWw+Ci0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9zY3JlZW5zaG90Lmh0IGIvc3dpZ3dlYi9zY3JlZW5zaG90Lmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI4ZjI0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvc2NyZWVuc2hvdC5odAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU1dJRyBTY3JlZW5zaG90Ci0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuLnBuZyIgYWx0PSJTY3JlZW5zaG90Ij4KLQotPHA+PGltZyBzcmM9ImltYWdlcy9zY3JlZW5zaG90LnBuZyIgYWx0PSJTY3JlZW5zaG90IGltYWdlIj4KLQotPHA+Ci1JdCBpcyBsb3ZlbHksIGlzbid0IGl0PwpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9zY3JlZW5zaG90Mi5odCBiL3N3aWd3ZWIvc2NyZWVuc2hvdDIuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGExN2UuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9zY3JlZW5zaG90Mi5odAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU1dJRyBTY3JlZW5zaG90Ci0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuLnBuZyIgYWx0PSJTY3JlZW5zaG90Ij4KLQotPHA+PGltZyBzcmM9ImltYWdlcy9zY3JlZW5zaG90Mi5wbmciIGFsdD0iU2NyZWVuc2hvdCBpbWFnZSI+Ci0KLTxwPgotTXVjaCBiZXR0ZXIgdGhhbiBiZWZvcmUsIGRvbid0IHlvdSB0aGluaz8KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9zdWJ2ZXJzaW9uLmh0IGIvc3dpZ3dlYi9zdWJ2ZXJzaW9uLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDBhMDkwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvc3VidmVyc2lvbi5odAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLVNXSUcgU3VidmVyc2lvbgotCi08cD48aW1nIHNyYz0iaW1hZ2VzL3N1YnZlcnNpb24ucG5nIiBhbHQ9IlN1YnZlcnNpb24iPgotCi08dWw+Ci08bGk+VGhlIG5ld2x5LXJldmlzZWQgU1dJRyBtaXNzaW9uIHN0YXRlbWVudDoKLQotPGNlbnRlcj4KLTxlbT4KLSJXZSBhcmUgYnVpbGRpbmcgYSB3cmFwcGVyIGdlbmVyYXRvciBvZiBleHRyYW9yZGluYXJ5IG1hZ25pdHVkZS4iCi08YnI+Ci08L2VtPgotPC9jZW50ZXI+Ci0KLTxsaT5BbHRlcm5hdGl2ZSBtaXNzaW9uIHN0YXRlbWVudDoKLQotPGNlbnRlcj4KLTxlbT4KLSJZb3Uga25vdywgZm9yIGtpZHMuIiA8YnI+Ci08L2VtPgotPC9jZW50ZXI+Ci0KLTxsaT5UaGUgZXZlci1zby1pbXByZXNzaXZlIFNXSUctMS4xIDxhIGhyZWY9InNjcmVlbnNob3QuaHRtbCI+c2NyZWVuc2hvdDwvYT4uCi08bGk+QW4gZXZlbiBtb3JlIGltcHJlc3NpdmUgPGEgaHJlZj0ic2NyZWVuc2hvdDIuaHRtbCI+c2NyZWVuc2hvdDwvYT4gc2hvd2luZyB0aGUgbmV3IHN0cmVhbWxpbmVkIGludGVyZmFjZSB0byBTV0lHLTEuMy4KLTxsaT48YSBocmVmPSJ2aXN1YWwuaHRtbCI+VmlzdWFsIFNXSUcgMjAwMisrIC5ORVQ8L2E+LS10aGUgdmVyc2lvbiBmb3IgbWFuYWdlcnMuCi08bGk+VGhlIGdyZWF0bHkgc2ltcGxpZmllZCA8YSBocmVmPSJjb3B5ZnVuLmh0bWwiPmNvcHlyaWdodDwvYT4uCi08L3VsPgotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3N1cnZleS5odCBiL3N3aWd3ZWIvc3VydmV5Lmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWRiYjlhLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvc3VydmV5Lmh0CisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotU3VydmV5Ci0KLTx0YWJsZSBzdW1tYXJ5PSJCZWZvcmUgZG93bmxvYWRpbmcuLi4iPiA8dHI+Ci08dGQgYmdjb2xvcj0iIzAwMDAwMCIgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPSIjZmZmZmZmIj48Yj5CZWZvcmUgZG93bmxvYWRpbmcuLi48L2I+PC9mb250PjwvdGQ+Ci08L3RyPiA8L3RhYmxlPgotIAotQmVmb3JlIGRvd25sb2FkaW5nLCBwbGVhc2UgaGVscCB1cyBieSBmaWxsaW5nIGluIHRoZSBzaW1wbGUgc3VydmV5IGJlbG93IGFib3V0IHlvdXIgaW50ZW5kZWQgU1dJRyB1c2FnZS4gCi08cD4KLUlmIHlvdSBsaWtlIHlvdSBjYW4gc2tpcCBpdCBhbmQgZ28gc3RyYWlnaHQgdG8gdGhlIDxhIGhyZWY9ImRvd25sb2FkLmh0bWwiPkRvd25sb2FkIGFyZWE8L2E+LgotCi08dGFibGUgc3VtbWFyeT0iVXNhZ2UgU3VydmV5Ij4gPHRyPgotPHRkIGJnY29sb3I9IiMwMDAwMDAiIGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+PGI+U1dJRyBVc2FnZSBTdXJ2ZXk8L2I+PC9mb250PjwvdGQ+Ci08L3RyPiA8L3RhYmxlPgotIAotPGZvcm0gbWV0aG9kPXBvc3QgYWN0aW9uPSJodHRwOi8vd3d3LnN3aWcub3JnL2NnaS1iaW4vc3VydmV5cmVzcG9uc2UucGwiPgotPGI+Ci1XaGljaCB0YXJnZXQgbGFuZ3VhZ2VzIHdpbGwgeW91IGJlIHVzaW5nIFNXSUcgZm9yPyBQbGVhc2Ugc2VsZWN0IGFsbCB0aGF0IGFwcGx5LgotPC9iPgotPGJsb2NrcXVvdGU+Ci0KLTxpbnB1dCBuYW1lPSJsYW5nQ2hpY2tlbiIgdHlwZT1jaGVja2JveCBhbGlnbj0ibGVmdCIgdmFsdWU9IjEiPiBDaGlja2VuIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nQ1NoYXJwIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gQyMgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdHdWlsZSIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IEd1aWxlIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nSmF2YSIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IEphdmEgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdNenNjaGVtZSIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IE16U2NoZW1lIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nT2NhbWwiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBPY2FtbCA8YnI+Ci08aW5wdXQgbmFtZT0ibGFuZ1BlcmwiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBQZXJsIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nUGhwIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gUGhwIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nUGlrZSIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IFBpa2UgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdQeXRob24iIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBQeXRob24gPGJyPgotPGlucHV0IG5hbWU9ImxhbmdSdWJ5IiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gUnVieSA8YnI+Ci08aW5wdXQgbmFtZT0ibGFuZ1NleHAiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBMaXNwIFMtZXhwIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nVGNsIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gVGNsIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nWG1sIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gWG1sIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nT3RoZXJMYW5nIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gT3RoZXIsIHBsZWFzZSBzcGVjaWZ5OiA8aW5wdXQgbmFtZT0ibmFtZWRMYW5ndWFnZSIgc2l6ZT0iMjAiPiA8YnI+Ci0KLTwvYmxvY2txdW90ZT4KLTxwPgotCi08Yj4KLVdoaWNoIG9wZXJhdGluZyBzeXN0ZW1zIHdpbGwgeW91IGJlIHJ1bm5pbmcgU1dJRyBvbj8gUGxlYXNlIHNlbGVjdCBhbGwgdGhhdCBhcHBseS4KLTwvYj4KLTxibG9ja3F1b3RlPgotCi08aW5wdXQgbmFtZT0ib3NCU0QiIHR5cGU9Y2hlY2tib3ggYWxpZ249ImxlZnQiIHZhbHVlPSIxIj4gRnJlZUJTRC9PcGVuQlNEL05ldEJTRCA8YnI+Ci08aW5wdXQgbmFtZT0ib3NIUFVYIiB0eXBlPWNoZWNrYm94IGFsaWduPSJsZWZ0IiB2YWx1ZT0iMSI+IEhQLVVYIDxicj4KLTxpbnB1dCBuYW1lPSJvc0xpbnV4IiB0eXBlPWNoZWNrYm94IGFsaWduPSJsZWZ0IiB2YWx1ZT0iMSI+IExpbnV4IDxicj4KLTxpbnB1dCBuYW1lPSJvc01hY09TWCIgdHlwZT1jaGVja2JveCBhbGlnbj0ibGVmdCIgdmFsdWU9IjEiPiBNYWMgT1MgWCA8YnI+Ci08aW5wdXQgbmFtZT0ib3NTb2xhcmlzIiB0eXBlPWNoZWNrYm94IGFsaWduPSJsZWZ0IiB2YWx1ZT0iMSI+IFNvbGFyaXMgPGJyPgotPGlucHV0IG5hbWU9Im9zV2luZG93cyIgdHlwZT1jaGVja2JveCBhbGlnbj0ibGVmdCIgdmFsdWU9IjEiPiBXaW5kb3dzIDxicj4KLTxpbnB1dCBuYW1lPSJvc090aGVyT1MiIHR5cGU9Y2hlY2tib3ggYWxpZ249ImxlZnQiIHZhbHVlPSIxIj4gT3RoZXIsIHBsZWFzZSBzcGVjaWZ5OiA8aW5wdXQgbmFtZT0ibmFtZWRPUyIgc2l6ZT0iMjAiPiA8YnI+Ci0KLTwvYmxvY2txdW90ZT4KLQotPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJTdWJtaXQiPiAKLQotPC9mb3JtPgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3R1dG9yaWFsLmh0IGIvc3dpZ3dlYi90dXRvcmlhbC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQyMmViNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3R1dG9yaWFsLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLVNXSUcgVHV0b3JpYWwKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL3R1dG9yaWFsLnBuZyIgYWx0PSJUdXRvcmlhbCI+Ci0KLTxwPgotU28geW91IHdhbnQgdG8gZ2V0IGdvaW5nIGluIGEgaHVycnk/ICBUbyBpbGx1c3RyYXRlIHRoZSB1c2Ugb2YgU1dJRywKLXN1cHBvc2UgeW91IGhhdmUgc29tZSBDIGZ1bmN0aW9ucyB5b3Ugd2FudCBhZGRlZCB0byBUY2wsIFBlcmwsIFB5dGhvbiwgSmF2YSBhbmQgQyMuCi1TcGVjaWZpY2FsbHksIGxldCdzIHNheSB5b3UgaGF2ZSB0aGVtIGluIGEgZmlsZSAnZXhhbXBsZS5jJwotCi08YmxvY2txdW90ZT48cHJlPgotLyogRmlsZSA6IGV4YW1wbGUuYyAqLwotCi0jaW5jbHVkZSAmbHQ7dGltZS5oJmd0OwotZG91YmxlIE15X3ZhcmlhYmxlID0gMy4wOwotCi1pbnQgZmFjdChpbnQgbikgewotICAgIGlmIChuICZsdDs9IDEpIHJldHVybiAxOwotICAgIGVsc2UgcmV0dXJuIG4qZmFjdChuLTEpOwotfQotCi1pbnQgbXlfbW9kKGludCB4LCBpbnQgeSkgewotICAgIHJldHVybiAoeCV5KTsKLX0KLQkKLWNoYXIgKmdldF90aW1lKCkKLXsKLSAgICB0aW1lX3QgbHRpbWU7Ci0gICAgdGltZSgmYW1wO2x0aW1lKTsKLSAgICByZXR1cm4gY3RpbWUoJmFtcDtsdGltZSk7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgzPkludGVyZmFjZSBmaWxlIDwvaDM+Ci0KLU5vdywgaW4gb3JkZXIgdG8gYWRkIHRoZXNlIGZpbGVzIHRvIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UsIHlvdSBuZWVkIHRvIHdyaXRlIGFuCi0iaW50ZXJmYWNlIGZpbGUiIHdoaWNoIGlzIHRoZSBpbnB1dCB0byBTV0lHLiAgQW4gaW50ZXJmYWNlIGZpbGUgZm9yIHRoZXNlCi1DIGZ1bmN0aW9ucyBtaWdodCBsb29rIGxpa2UgdGhpcyA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBleGFtcGxlLmkgKi8KLSVtb2R1bGUgZXhhbXBsZQotJXsKLS8qIFB1dCBoZWFkZXIgZmlsZXMgaGVyZSBvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgbGlrZSBiZWxvdyAqLwotZXh0ZXJuIGRvdWJsZSBNeV92YXJpYWJsZTsKLWV4dGVybiBpbnQgZmFjdChpbnQgbik7Ci1leHRlcm4gaW50IG15X21vZChpbnQgeCwgaW50IHkpOwotZXh0ZXJuIGNoYXIgKmdldF90aW1lKCk7Ci0lfQotCi1leHRlcm4gZG91YmxlIE15X3ZhcmlhYmxlOwotZXh0ZXJuIGludCBmYWN0KGludCBuKTsKLWV4dGVybiBpbnQgbXlfbW9kKGludCB4LCBpbnQgeSk7Ci1leHRlcm4gY2hhciAqZ2V0X3RpbWUoKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgzPiBCdWlsZGluZyBhIFRjbCBtb2R1bGUgPC9oMz4KLQotQXQgdGhlIFVOSVggcHJvbXB0LCB0eXBlIHRoZSBmb2xsb3dpbmcgKHNob3duIGZvciBMaW51eCwgc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmRhYmVhei5jb20vY2dpLWJpbi93aWtpLnBsP1N3aWdGYXEvU2hhcmVkTGlicmFyaWVzIj5TV0lHIFdpa2kgU2hhcmVkIExpYnJhcmllczwvYT4gcGFnZSBmb3IgaGVscCB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotdW5peCAlIHN3aWcgLXRjbCBleGFtcGxlLmkKLXVuaXggJSBnY2MgLWZwaWMgLWMgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIFwKLSAgICAgICAtSS91c3IvbG9jYWwvaW5jbHVkZSAKLXVuaXggJSBnY2MgLXNoYXJlZCBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8gLW8gZXhhbXBsZS5zbwotdW5peCAlIHRjbHNoCi0lIGxvYWQgLi9leGFtcGxlLnNvIGV4YW1wbGUKLSUgcHV0cyAkTXlfdmFyaWFibGUKLTMuMAotJSBmYWN0IDUKLTEyMAotJSBteV9tb2QgNyAzCi0xCi0lIGdldF90aW1lCi1TdW4gRmViIDExIDIzOjAxOjA3IDE5OTYKLQotJSAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIDx0dD4gc3dpZyA8L3R0PiBjb21tYW5kIHByb2R1Y2VzIGEgZmlsZSA8YSBocmVmID0gInR1dG9yaWFsL2V4YW1wbGVfd3JhcC5odG1sIj4KLTx0dD4gZXhhbXBsZV93cmFwLmMgPC90dD4gPC9hPiB0aGF0IHNob3VsZCBiZSBjb21waWxlZCBhbmQgbGlua2VkIHdpdGgKLXRoZSByZXN0IG9mIHRoZSBwcm9ncmFtLiAgSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIGJ1aWx0IGEgZHluYW1pY2FsbHkgCi1sb2FkYWJsZSBleHRlbnNpb24gdGhhdCBjYW4gYmUgbG9hZGVkIGludG8gdGhlIFRjbCBpbnRlcnByZXRlciB1c2luZwotdGhlICdsb2FkJyBjb21tYW5kLiAgIAotCi08aDM+IEJ1aWxkaW5nIGEgUHl0aG9uIG1vZHVsZSA8L2gzPgotCi1UdXJuaW5nIEMgY29kZSBpbnRvIGEgUHl0aG9uIG1vZHVsZSBpcyBhbHNvIGVhc3kuICBTaW1wbHkgZG8gdGhlIGZvbGxvd2luZyAoc2hvd24gZm9yIElyaXgsIHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5kYWJlYXouY29tL2NnaS1iaW4vd2lraS5wbD9Td2lnRmFxL1NoYXJlZExpYnJhcmllcyI+U1dJRyBXaWtpIFNoYXJlZCBMaWJyYXJpZXM8L2E+IHBhZ2UgZm9yIGhlbHAgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyk6Ci0KLTxibG9ja3F1b3RlPiA8cHJlPgotCi11bml4ICUgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaQotdW5peCAlIGdjYyAtYyBleGFtcGxlLmMgZXhhbXBsZV93cmFwLmMgXAotICAgICAgIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMQotdW5peCAlIGxkIC1zaGFyZWQgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIF9leGFtcGxlLnNvIAotPC9wcmU+IDwvYmxvY2txdW90ZT4KLQotV2UgY2FuIG5vdyB1c2UgdGhlIFB5dGhvbiBtb2R1bGUgYXMgZm9sbG93cyA6IAotPGJsb2NrcXVvdGU+IDxwcmU+Ci0mZ3Q7Jmd0OyZndDsgaW1wb3J0IGV4YW1wbGUKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmZhY3QoNSkKLTEyMAotJmd0OyZndDsmZ3Q7IGV4YW1wbGUubXlfbW9kKDcsMykKLTEKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmdldF90aW1lKCkKLSdTdW4gRmViIDExIDIzOjAxOjA3IDE5OTYnCi0mZ3Q7Jmd0OyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi08aDM+IEJ1aWxkaW5nIGEgUGVybCBtb2R1bGUgPC9oMz4KLVlvdSBjYW4gYWxzbyBidWlsZCBhIFBlcmw1IG1vZHVsZSBhcyBmb2xsb3dzIChzaG93biBmb3IgU29sYXJpcywgc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmRhYmVhei5jb20vY2dpLWJpbi93aWtpLnBsP1N3aWdGYXEvU2hhcmVkTGlicmFyaWVzIj5TV0lHIFdpa2kgU2hhcmVkIExpYnJhcmllczwvYT4gcGFnZSBmb3IgaGVscCB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKToKLQotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJSBzd2lnIC1wZXJsNSBleGFtcGxlLmkKLXVuaXggJSBnY2MgLWMgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIFwKLSAgICAgICBgcGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBjY29wdHNgCi11bml4ICUgbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28KLXVuaXggJSBwZXJsCi11c2UgZXhhbXBsZTsKLXByaW50ICRleGFtcGxlOjpNeV92YXJpYWJsZSwiXG4iOwotcHJpbnQgZXhhbXBsZTo6ZmFjdCg1KSwiXG4iOwotcHJpbnQgZXhhbXBsZTo6Z2V0X3RpbWUoKSwiXG4iOwotJmx0O2N0cmwtZCZndDsKLTMuMAotMTIwCi1TdW4gRmViIDExIDIzOjAxOjA3IDE5OTYKLXVuaXggJSAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgzPiBCdWlsZGluZyBhIEphdmEgbW9kdWxlIDwvaDM+Ci1TV0lHIHdpbGwgYWxzbyBnZW5lcmF0ZSBKTkkgY29kZSBmb3IgYWNjZXNzaW5nIEMvQysrIGNvZGUgZnJvbSBKYXZhLiBIZXJlIGlzIGFuIGV4YW1wbGUgYnVpbGRpbmcgYSBKYXZhIG1vZHVsZSAoc2hvd24gZm9yIEN5Z3dpbiwgc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmRhYmVhei5jb20vY2dpLWJpbi93aWtpLnBsP1N3aWdGYXEvU2hhcmVkTGlicmFyaWVzIj5TV0lHIFdpa2kgU2hhcmVkIExpYnJhcmllczwvYT4gcGFnZSBmb3IgaGVscCB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKToKLQotPGJsb2NrcXVvdGU+PHByZT4KLSQgc3dpZyAtamF2YSBleGFtcGxlLmkKLSQgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS9jL2pkazEuMy4xL2luY2x1ZGUgLUkvYy9qZGsxLjMuMS9pbmNsdWRlL3dpbjMyCi0kIGdjYyAtc2hhcmVkIGV4YW1wbGUubyAgZXhhbXBsZV93cmFwLm8gLW1uby1jeWd3aW4gLVdsLC0tYWRkLXN0ZGNhbGwtYWxpYXMgIC1vIGV4YW1wbGUuZGxsCi0kIGNhdCBtYWluLmphdmEKLXB1YmxpYyBjbGFzcyBtYWluIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZXhhbXBsZSIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGFtcGxlLmdldE15X3ZhcmlhYmxlKCkpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGFtcGxlLmZhY3QoNSkpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGFtcGxlLmdldF90aW1lKCkpOwotICB9Ci19Ci0kIGphdmFjIG1haW4uamF2YQotJCBqYXZhIG1haW4KLTMuMAotMTIwCi1Nb24gTWFyICA0IDE4OjIwOjMxICAyMDAyCi0kCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gQnVpbGRpbmcgYSBDIyBtb2R1bGUgPC9oMz4KLVNXSUcgd2lsbCBhbHNvIGdlbmVyYXRlIGNvZGUgZm9yIGFjY2Vzc2luZyBDL0MrKyBjb2RlIGZyb20gQyMgdXNpbmcgUEludm9rZS4gSGVyZSBpcyBhbiBleGFtcGxlIGJ1aWxkaW5nIGEgQyMgbW9kdWxlIChzaG93biBmb3IgTGludXgsIHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5kYWJlYXouY29tL2NnaS1iaW4vd2lraS5wbD9Td2lnRmFxL1NoYXJlZExpYnJhcmllcyI+U1dJRyBXaWtpIFNoYXJlZCBMaWJyYXJpZXM8L2E+IHBhZ2UgZm9yIGhlbHAgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcykuIEl0IHVzZXMgdGhlIG9wZW4gc291cmNlIDxhIGhyZWY9Imh0dHA6Ly93d3cuc291dGhlcm4tc3Rvcm0uY29tLmF1L3BvcnRhYmxlX25ldC5odG1sIj5Eb3RHTlUgUG9ydGFibGUuTkVUPC9hPiBDIyBjb21waWxlciB3aGljaCBydW5zIG9uIG1vc3QgVW5peCBzeXN0ZW1zLCBidXQgd29ya3MgZXF1YWxseSB3ZWxsIHVzaW5nIG90aGVyIEMjIGNvbXBpbGVyczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSQgc3dpZyAtY3NoYXJwICBleGFtcGxlLmkKLSQgZ2NjIC1jIC1mcGljICBleGFtcGxlLmMgZXhhbXBsZV93cmFwLmMKLSQgZ2NjIC1zaGFyZWQgZXhhbXBsZS5vICBleGFtcGxlX3dyYXAubyAgIC1vIGxpYmV4YW1wbGUuc28KLSQgY3NjYyAtbyBydW5tZSAqLmNzCi0kIGNhdCBydW5tZS5jcwotdXNpbmcgU3lzdGVtOwotcHVibGljIGNsYXNzIHJ1bm1lIHsKLSAgICBzdGF0aWMgdm9pZCBNYWluKCkgewotICAgICAgICBDb25zb2xlLldyaXRlTGluZShleGFtcGxlLk15X3ZhcmlhYmxlKTsKLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXhhbXBsZS5mYWN0KDUpKTsKLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXhhbXBsZS5nZXRfdGltZSgpKTsKLSAgICB9Ci19Ci0kIGlscnVuIHJ1bm1lCi0zCi0xMjAKLVR1ZSBNYXkgMTMgMTA6NDU6NDUgMjAwMwotCi0kCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gU1dJRyBmb3IgdGhlIHRydWx5IGxhenkgPC9oMz4KLQotQXMgaXQgdHVybnMgb3V0LCBpdCBpcyBub3QgYWx3YXlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNwZWNpYWwgaW50ZXJmYWNlCi1maWxlLiAgSWYgeW91IGhhdmUgYSBoZWFkZXIgZmlsZSwgeW91IGNhbiBvZnRlbiBqdXN0IGluY2x1ZGUgaXQgZGlyZWN0bHkgaW4gdGhlCi1TV0lHIGludGVyZmFjZS4gRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSVtb2R1bGUgZXhhbXBsZQotJXsKLS8qIEluY2x1ZGVzIHRoZSBoZWFkZXIgaW4gdGhlIHdyYXBwZXIgY29kZSAqLwotI2luY2x1ZGUgImhlYWRlci5oIgotJX0KLQotLyogUGFyc2UgdGhlIGhlYWRlciBmaWxlIHRvIGdlbmVyYXRlIHdyYXBwZXJzICovCi0laW5jbHVkZSAiaGVhZGVyLmgiCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotQWx0ZXJuYXRpdmVseSwgc29tZSBwZW9wbGUgbWlnaHQganVzdCBpbmNsdWRlIFNXSUcgZGlyZWN0aXZlcyBpbiBhIGhlYWRlcgotZmlsZSB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSNpZmRlZiBTV0lHCi0lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW5jbHVkZSAiaGVhZGVyLmgiCi0lfQotI2VuZGlmCi0KLWV4dGVybiBpbnQgZmFjdChpbnQgbik7Ci0uLi4KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi08aDM+IFJ1bm5pbmcgU1dJRyB1bmRlciBNaWNyb3NvZnQgV2luZG93cyA8L2gzPgotCi1TV0lHIGFsc28gd29ya3MgcGVyZmVjdGx5IHdlbGwgdW5kZXIgYWxsIGtub3duIDMyIGJpdCB2ZXJzaW9ucyBvZgotV2luZG93cyBpbmNsdWRpbmcgOTUvOTgvTlQvMjAwMC9YUC4gIFNXSUcgaXMgdHlwaWNhbGx5IGludm9rZWQgZnJvbQotdGhlIGNvbW1hbmQgcHJvbXB0IGFuZCBjYW4gYmUgdXNlZCB3aXRoIE5NQUtFLiAgTW9kdWxlcyBhcmUgdHlwaWNhbGx5Ci1jb21waWxlZCBpbiB0aGUgZm9ybSBvZiBhIERMTCB0aGF0IGNhbiBiZSBkeW5hbWljYWxseSBsb2FkZWQgaW50byBUY2wsCi1QeXRob24sIG9yIHdoYXRldmVyIGxhbmd1YWdlIHlvdSBhcmUgdXNpbmcuICBXaXRoIGEgbGl0dGxlIHdvcmssIFNXSUcKLWNhbiBhbHNvIGJlIHVzZWQgYXMgYSBjdXN0b20gYnVpbGQgb3B0aW9uIHdpdGhpbiBNUyBEZXZlbG9wZXIgU3R1ZGlvLgotCi08aDM+VGhhdCdzIGl0ICh3ZWxsLCBtb3JlIG9yIGxlc3MpPC9oMz4KLQotVGhhdCdzIGFib3V0IGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyB0byBnZXQgc3RhcnRlZC4gSGVyZSdzIHRoZSBzaG9ydCBjaGVja2xpc3QgOgotCi08dWw+Ci08bGk+IE1ha2Ugc3VyZSB5b3Ugc3BlY2lmeSBhIG1vZHVsZSBuYW1lLgotPGxpPiBVc2UgQU5TSSBDL0MrKyBzeW50YXgKLTxsaT4gRmlndXJlIG91dCBob3cgdG8gY29tcGlsZSBhIHNoYXJlZCBsaWJyYXJ5IG1vZHVsZSAvIGR5bmFtaWMgbGluayBsaWJyYXJ5IChtYXkgcmVxdWlyZSByZWFkaW5nIGEgZmV3IG1hbiAKLXBhZ2VzIGZvciB5b3VyIGNvbXBpbGVyKS4KLTxsaT4gUmVsYXguCi08L3VsPgotCi08aDM+U3VyZWx5IHRoZXJlJ3MgbW9yZSB0byBpdC4uLjwvaDM+Ci0KLVRoZSBhYm92ZSBleGFtcGxlIGlzIGludGVudGlvbmFsbHkgc2ltcGxlLCBidXQgdGhlIGdlbmVyYWwgaWRlYQotZXh0ZW5kcyB0byBtb3JlIGNvbXBsaWNhdGVkIEMvQysrIHByb2dyYW1taW5nIHRhc2tzLiAgSW4gZmFjdCwgaXQgaXMKLWltcG9ydGFudCB0byBrbm93IHRoYXQgU1dJRyBpcyBhIGZhaXJseSBjb21wbGV0ZSBDKysgY29tcGlsZXIgd2l0aAotc3VwcG9ydCBmb3IgbmVhcmx5IGV2ZXJ5IGxhbmd1YWdlIGZlYXR1cmUuICBUaGlzIGluY2x1ZGVzCi1wcmVwcm9jZXNzaW5nLCBwb2ludGVycywgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBldmVuIEMrKyB0ZW1wbGF0ZXMuCi1TV0lHIGNhbiBhbHNvIGJlIHVzZWQgdG8gcGFja2FnZSBzdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzIGludG8gcHJveHkKLWNsYXNzZXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS0tLWV4cG9zaW5nIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHkgaW4gYSB2ZXJ5Ci1uYXR1cmFsIG1hbm5lci4KLQotPHA+Ci1UbyBpbGx1c3RyYXRlLCBzdXBwb3NlIHlvdSB3YW50ZWQgdG8gd3JhcCB0aGUgZm9sbG93aW5nIEMrKyBkYXRhIHN0cnVjdHVyZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotLy8gcGFpci5oLiAgQSBwYWlyIGxpa2UgdGhlIFNUTAotbmFtZXNwYWNlIHN0ZCB7Ci0gICB0ZW1wbGF0ZSZsdDtjbGFzcyBUMSwgY2xhc3MgVDImZ3Q7IHN0cnVjdCBwYWlyIHsKLSAgICAgICBUMSBmaXJzdDsKLSAgICAgICBUMiBzZWNvbmQ7Ci0gICAgICAgcGFpcigpIDogZmlyc3QoVDEoKSksIHNlY29uZChUMigpKSB7IH07Ci0gICAgICAgcGFpcihjb25zdCBUMSAmYW1wO2YsIGNvbnN0IFQyICZhbXA7cykgOiBmaXJzdChmKSwgc2Vjb25kKHMpIHsgfQotICAgfTsKLX0KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UbyB3cmFwIHdpdGggU1dJRywgeW91IG1pZ2h0IHNwZWNpZnkgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLS8vIHBhaXIuaSAtIFNXSUcgaW50ZXJmYWNlCi0lbW9kdWxlIHBhaXIKLSV7Ci0jaW5jbHVkZSAicGFpci5oIgotJX0KLQotLy8gSWdub3JlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0laWdub3JlIHN0ZDo6cGFpcjo6cGFpcigpOyAgICAgIAotCi0vLyBQYXJzZSB0aGUgb3JpZ2luYWwgaGVhZGVyIGZpbGUKLSVpbmNsdWRlICJwYWlyLmgiCi0KLS8vIEluc3RhbnRpYXRlIHNvbWUgdGVtcGxhdGVzCi0KLSV0ZW1wbGF0ZShwYWlyaWkpIHN0ZDo6cGFpciZsdDtpbnQsaW50Jmd0OzsKLSV0ZW1wbGF0ZShwYWlyZGkpIHN0ZDo6cGFpciZsdDtkb3VibGUsaW50Jmd0OzsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1Ob3csIGNvbXBpbGluZyAoUHl0aG9uKToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJCBzd2lnIC1weXRob24gLWMrKyBwYWlyLmkKLSQgYysrIC1jIHBhaXJfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMQotJCBjKysgLXNoYXJlZCBwYWlyX3dyYXAubyAtbyBfcGFpci5zbwotJCBweXRob24KLVB5dGhvbiAyLjEgKCMzLCBBdWcgMjAgMjAwMSwgMTU6NDE6NDIpIAotW0dDQyAyLjk1LjIgMTk5OTEwMjQgKHJlbGVhc2UpXSBvbiBzdW5vczUKLVR5cGUgImNvcHlyaWdodCIsICJjcmVkaXRzIiBvciAibGljZW5zZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IHBhaXIKLSZndDsmZ3Q7Jmd0OyBhID0gcGFpci5wYWlyaWkoMyw0KQotJmd0OyZndDsmZ3Q7IGEuZmlyc3QKLTMKLSZndDsmZ3Q7Jmd0OyBhLnNlY29uZAotNAotJmd0OyZndDsmZ3Q7IGEuc2Vjb25kID0gMTYKLSZndDsmZ3Q7Jmd0OyBhLnNlY29uZAotMTYKLSZndDsmZ3Q7Jmd0OyBiID0gcGFpci5wYWlyZGkoMy41LDgpCi0mZ3Q7Jmd0OyZndDsgYi5maXJzdAotMy41Ci0mZ3Q7Jmd0OyZndDsgYi5zZWNvbmQKLTgKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3R1dG9yaWFsL2V4YW1wbGVfd3JhcC5odG1sIGIvc3dpZ3dlYi90dXRvcmlhbC9leGFtcGxlX3dyYXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTExMjAwMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3R1dG9yaWFsL2V4YW1wbGVfd3JhcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+IDwvaGVhZD4KLTxib2R5IEJHQ09MT1I9IiNGRkZGRkYiPgotPHR0PiA8cHJlPgotCi0vKgotICogRmlsZSA6IGV4YW1wbGVfd3JhcC5jCi0gKiBUaHUgQXByICA0IDEzOjExOjQ1IDE5OTYKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IDoKLSAqIFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAoU1dJRykKLSAqIAotICogQ29weXJpZ2h0IChjKSAxOTk1LDE5OTYKLSAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYW5kCi0gKiBUaGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gKgotICovCi0KLS8qIEltcGxlbWVudGF0aW9uIDogVENMICovCi0KLSNkZWZpbmUgSU5DTFVERV9UQ0wgICAgPHRjbC5oPgotI2RlZmluZSBJTkNMVURFX1RLICAgICA8dGsuaD4KLSNpbmNsdWRlIElOQ0xVREVfVENMCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1zdGF0aWMgdm9pZCBfc3dpZ19tYWtlX2hleChjaGFyICpfYywgdm9pZCAqX3B0ciwgY2hhciAqdHlwZSkgewotc3RhdGljIGNoYXIgX2hleFsxNl0gPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLQkJCSdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLSAgdW5zaWduZWQgbG9uZyBfcCxfczsKLSAgY2hhciAgICAgX3Jlc3VsdFsxMjhdLCAqX3I7Ci0gIF9yID0gX3Jlc3VsdDsKLSAgX3AgPSAodW5zaWduZWQgbG9uZykgX3B0cjsKLSAgaWYgKF9wID4gMCkgewotICAgICB3aGlsZSAoX3AgPiAwKSB7Ci0gICAgICAgIF9zID0gX3AgJiAweGY7Ci0gICAgICAgICooX3IrKykgPSBfaGV4W19zXTsKLSAgICAgICAgX3AgPSBfcCA+PiA0OwotICAgICB9IAotICAgICAqX3IgPSAnXyc7Ci0gICAgIHdoaWxlIChfciA+PSBfcmVzdWx0KSAqKF9jKyspID0gKihfci0tKTsKLSAgfSBlbHNlIHsKLSAgICAgc3RyY3B5KF9jLCJOVUxMIik7Ci0gIH0KLSAgaWYgKF9wdHIpIHN0cmNweShfYyx0eXBlKTsKLX0KLXN0YXRpYyBjaGFyICpfc3dpZ19nZXRfaGV4KGNoYXIgKl9jLCB2b2lkICoqcHRyLCBjaGFyICpfdCkgewotICB1bnNpZ25lZCBsb25nIF9wOwotICBjaGFyICpfdHQ7Ci0gIF9wID0gMDsKLSAgaWYgKCpfYyA9PSAnXycpIHsgCi0gICAgIF9jKys7Ci0gICAgIHdoaWxlICgqX2MpIHsKLSAgICAgICBpZiAoKCpfYyA+PSAnMCcpICYmICgqX2MgPD0gJzknKSkgX3AgPSAoX3AgPDwgNCkgKyAoKl9jIC0gJzAnKTsKLSAgICAgICBlbHNlIGlmICgoKl9jID49ICdhJykgJiYgKCpfYyA8PSAnZicpKSBfcCA9IChfcCA8PCA0KSArICgoKl9jIC0gJ2EnKSArIDEwKTsKLSAgICAgICBlbHNlIGJyZWFrOyAKLSAgICAgICBfYysrOwotICAgICB9Ci0gICAgIGlmIChfcCA9PSAwKSB7Ci0gICAgICAgICByZXR1cm4gKGNoYXIgKikgX2M7Ci0gICAgIH0KLSAgICAgX3R0ID0gX2M7Ci0gICAgIGlmIChfdCkgewotICAgICAgICBpZiAoc3RyY21wKF9jLF90KSkgcmV0dXJuIF90dDsKLSAgICAgfQotICAgICAqcHRyID0gKHZvaWQgKikgX3A7Ci0gICAgICByZXR1cm4gKGNoYXIgKikgMDsKLSAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyY21wKF9jLCJOVUxMIikgPT0gMCkgewotICAgICAgICAgKnB0ciA9ICh2b2lkICopIDA7Ci0gICAgICAgICByZXR1cm4gKGNoYXIgKikgMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBfYzsKLSAgfQotfQotCi0jZGVmaW5lIFNXSUdfaW5pdCAgICBXcmFwX0luaXQKLQotCi0KLQotLyogQSBUQ0xfQXBwSW5pdCgpIGZ1bmN0aW9uIHRoYXQgbGV0cyB5b3UgYnVpbGQgYSBuZXcgY29weQotICogb2YgdGNsc2guCi0gKgotICogVGhlIG1hY3JvIFdHX2luaXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uCi0gKiBmdW5jdGlvbiBpbiB0aGUgd3JhcHBlciBmaWxlLgotICovCi0KLSNpZm5kZWYgU1dJR19SY0ZpbGVOYW1lCi1jaGFyICpTV0lHX1JjRmlsZU5hbWUgPSAifi8ubXlhcHByYyI7Ci0jZW5kaWYKLQotI2lmIFRDTF9NQUpPUl9WRVJTSU9OID09IDcgJiYgVENMX01JTk9SX1ZFUlNJT04gPj0gNAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLSAgVGNsX01haW4oYXJnYywgYXJndiwgVGNsX0FwcEluaXQpOwotICByZXR1cm4oMCk7Ci0KLX0KLSNlbHNlCi1leHRlcm4gaW50IG1haW4oKTsKLSNlbmRpZgotCi1pbnQgVGNsX0FwcEluaXQoVGNsX0ludGVycCAqaW50ZXJwKXsKLSAgaW50IFNXSUdfaW5pdChUY2xfSW50ZXJwICopOyAgLyogRm9yd2FyZCByZWZlcmVuY2UgKi8KLQotICBpZiAoVGNsX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIAotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSAgLyogTm93IGluaXRpYWxpemUgb3VyIGZ1bmN0aW9ucyAqLwotCi0gIGlmIChTV0lHX2luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpCi0gICAgcmV0dXJuIFRDTF9FUlJPUjsKLQotICB0Y2xfUmNGaWxlTmFtZSA9IFNXSUdfUmNGaWxlTmFtZTsKLSAgcmV0dXJuIFRDTF9PSzsKLX0KLQotZXh0ZXJuIGRvdWJsZSAgIE15X3ZhcmlhYmxlOwotZXh0ZXJuIGludCAgZmFjdChpbnQgICk7Ci1leHRlcm4gaW50ICBtb2QoaW50ICAsaW50ICApOwotZXh0ZXJuIGNoYXIgKiBnZXRfdGltZSgpOwotaW50IF93cmFwX3RjbF9mYWN0KENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLCBpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JIGludCAgX3Jlc3VsdDsKLQkgaW50IF9hcmcwOwotCi0JIGlmIChhcmdjICE9IDIpIHsKLQkJIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCAiV3JvbmcgIyBhcmdzICBpbnQgIDogZmFjdCBuICIsVENMX1NUQVRJQyk7Ci0JCSByZXR1cm4gVENMX0VSUk9SOwotCX0KLQkgX2FyZzAgPSAoaW50ICkgYXRvbChhcmd2WzFdKTsKLQkgX3Jlc3VsdCA9IGZhY3QoX2FyZzApOwotCSBzcHJpbnRmKGludGVycC0+cmVzdWx0LCIlbGQiLCAobG9uZykgX3Jlc3VsdCk7Ci0JIHJldHVybiBUQ0xfT0s7Ci19Ci1pbnQgX3dyYXBfdGNsX21vZChDbGllbnREYXRhIGNsaWVudERhdGEsIFRjbF9JbnRlcnAgKmludGVycCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotCSBpbnQgIF9yZXN1bHQ7Ci0JIGludCBfYXJnMDsKLQkgaW50IF9hcmcxOwotCi0JIGlmIChhcmdjICE9IDMpIHsKLQkJIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCAiV3JvbmcgIyBhcmdzICBpbnQgIDogbW9kIHggeSAiLFRDTF9TVEFUSUMpOwotCQkgcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0JIF9hcmcwID0gKGludCApIGF0b2woYXJndlsxXSk7Ci0JIF9hcmcxID0gKGludCApIGF0b2woYXJndlsyXSk7Ci0JIF9yZXN1bHQgPSBtb2QoX2FyZzAsX2FyZzEpOwotCSBzcHJpbnRmKGludGVycC0+cmVzdWx0LCIlbGQiLCAobG9uZykgX3Jlc3VsdCk7Ci0JIHJldHVybiBUQ0xfT0s7Ci19Ci1pbnQgX3dyYXBfdGNsX2dldF90aW1lKENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLCBpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JIGNoYXIgKiBfcmVzdWx0OwotCi0JIGlmIChhcmdjICE9IDEpIHsKLQkJIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCAiV3JvbmcgIyBhcmdzICBjaGFyICogOiBnZXRfdGltZSAiLFRDTF9TVEFUSUMpOwotCQkgcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0JIF9yZXN1bHQgPSBnZXRfdGltZSgpOwotCSBUY2xfU2V0UmVzdWx0KGludGVycCwgX3Jlc3VsdCwgVENMX1ZPTEFUSUxFKTsKLQkgcmV0dXJuIFRDTF9PSzsKLX0KLWludCBXcmFwX0luaXQoVGNsX0ludGVycCAqaW50ZXJwKSB7Ci0JIGlmIChpbnRlcnAgPT0gMCkgCi0JCSByZXR1cm4gVENMX0VSUk9SOwotCSBUY2xfTGlua1ZhcihpbnRlcnAsICJNeV92YXJpYWJsZSIsIChjaGFyICopICZNeV92YXJpYWJsZSwgVENMX0xJTktfRE9VQkxFKTsKLQkgVGNsX0NyZWF0ZUNvbW1hbmQoaW50ZXJwLCAiZmFjdCIsIF93cmFwX3RjbF9mYWN0LCAoQ2xpZW50RGF0YSkgTlVMTCwgKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpOwotCSBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJtb2QiLCBfd3JhcF90Y2xfbW9kLCAoQ2xpZW50RGF0YSkgTlVMTCwgKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpOwotCSBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJnZXRfdGltZSIsIF93cmFwX3RjbF9nZXRfdGltZSwgKENsaWVudERhdGEpIE5VTEwsIChUY2xfQ21kRGVsZXRlUHJvYyAqKSBOVUxMKTsKLQkgcmV0dXJuIFRDTF9PSzsKLX0KLQotPC9wcmU+IDwvdHQ+IDwvYm9keT4KLTwvaHRtbD4KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvdHV0b3JpYWwvZXhhbXBsZV93cmFwX3Blcmw1Lmh0bWwgYi9zd2lnd2ViL3R1dG9yaWFsL2V4YW1wbGVfd3JhcF9wZXJsNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOTE0MWExLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvdHV0b3JpYWwvZXhhbXBsZV93cmFwX3Blcmw1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPFRJVExFPgotU2ltcGxlIEV4YW1wbGU8L1RJVExFPgotPEJPRFkgQkdDT0xPUj0iI2ZmZmZmZiI+Ci08SDE+U2ltcGxlIEV4YW1wbGU8L0gxPgotWyBNb2R1bGUgIDogc3dpZywgUGFja2FnZSA6IHN3aWcgXTxCUj4KLQotPEhSPjxIMT4gQ29udGVudHMgPC9IMT4KLTxVTD48TEk+IDxBIEhSRUY9IiNzMV8iPjEuIE15IENvbW1hbmRzPC9BPgotPC9VTD4KLQotPEEgbmFtZT0iczFfIj4KLTxIUj48SDI+MS4gTXkgQ29tbWFuZHM8L0gyPjwvQT4KLTxQPjxUVD48Qj4kTXlfdmFyaWFibGU8L0I+PC9UVD4KLTxCTE9DS1FVT1RFPlsgR2xvYmFsIDogZG91YmxlICBNeV92YXJpYWJsZSBdCi08QlI+ICAgVGhpcyBpcyBhbiBpbnRlcmVzdGluZyB2YXJpYWJsZQotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+ZmFjdChuKTs8L0I+PC9UVD4KLTxCTE9DS1FVT1RFPlsgcmV0dXJucyBpbnQgIF0KLTxCUj4gICBDb21wdXRlcyBuIGZhY3RvcmlhbAotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+bXlfbW9kKHgseSk7PC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgaW50ICBdCi08QlI+ICAgQ2FsY3VsYXRlcyB4ICUgeQotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+Z2V0X3RpbWUoKTs8L0I+PC9UVD4KLTxCTE9DS1FVT1RFPlsgcmV0dXJucyBjaGFyICogXQotPEJSPiAgIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBhcyBhIHN0cmluZyAgIAotPC9CTE9DS1FVT1RFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvdHV0b3JpYWwvZXhhbXBsZV93cmFwX3RjbC5odG1sIGIvc3dpZ3dlYi90dXRvcmlhbC9leGFtcGxlX3dyYXBfdGNsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkM2Y0Y2UuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi90dXRvcmlhbC9leGFtcGxlX3dyYXBfdGNsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPFRJVExFPgotU2ltcGxlIEV4YW1wbGU8L1RJVExFPgotPEJPRFkgQkdDT0xPUj0iI2ZmZmZmZiI+Ci08SDE+U2ltcGxlIEV4YW1wbGU8L0gxPgotCi08SFI+PEgxPiBDb250ZW50cyA8L0gxPgotPFVMPjxMST4gPEEgSFJFRj0iI3MxXyI+MS4gTXkgQ29tbWFuZHM8L0E+Ci08L1VMPgotCi08QSBuYW1lPSJzMV8iPgotPEhSPjxIMj4xLiBNeSBDb21tYW5kczwvSDI+PC9BPgotPFA+PFRUPjxCPiRNeV92YXJpYWJsZTwvQj48L1RUPgotPEJMT0NLUVVPVEU+WyBHbG9iYWwgOiBkb3VibGUgIE15X3ZhcmlhYmxlIF0KLTxCUj4gICBUaGlzIGlzIGFuIGludGVyZXN0aW5nIHZhcmlhYmxlCi08L0JMT0NLUVVPVEU+Ci0KLTxQPjxUVD48Qj5mYWN0IG4gPC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgaW50ICBdCi08QlI+ICAgQ29tcHV0ZXMgbiBmYWN0b3JpYWwKLTwvQkxPQ0tRVU9URT4KLQotPFA+PFRUPjxCPm15X21vZCB4IHkgPC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgaW50ICBdCi08QlI+ICAgQ2FsY3VsYXRlcyB4ICUgeQotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+Z2V0X3RpbWUgPC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgY2hhciAqIF0KLTxCUj4gICBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgYXMgYSBzdHJpbmcgICAKLTwvQkxPQ0tRVU9URT4KLQotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL3kyay5odCBiL3N3aWd3ZWIveTJrLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmE2ZDBlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIveTJrLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotU1dJRzJLCi0KLTxwPjxpbWcgc3JjPSJpbWFnZXMveTJrLnBuZyIgYWx0PSJZMksiPgotCi08cD4KLVNXSUcgZG9lcyBub3QgdXNlIHRoZSBkYXRlIGFuZCBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IFkySy4KLUhvd2V2ZXIsIGxpa2UgYW55IGRldmVsb3BtZW50IHRvb2wsIFNXSUcgd2lsbCBub3QgcHJldmVudCB5b3UgZnJvbQotY3JlYXRpbmcgYSBidWdneSBhcHBsaWNhdGlvbi4gIFNXSUcgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGZvbGxvd2luZwotdGVybXMgOgotCi08cHJlPgotCi1JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SLCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBLCBUSEUgCi1VTklWRVJTSVRZIE9GIFVUQUggT1IgRElTVFJJQlVUT1JTIE9GIFRISVMgU09GVFdBUkUgQkUgTElBQkxFIFRPIEFOWQotUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwKLUVWRU4gSUYgVEhFIEFVVEhPUlMgT1IgQU5ZIE9GIFRIRSBBQk9WRSBQQVJUSUVTIEhBVkUgQkVFTiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLVRIRSBBVVRIT1IsIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEsIEFORCBUSEUgVU5JVkVSU0lUWSBPRiBVVEFICi1TUEVDSUZJQ0FMTFkgRElTQ0xBSU0gQU5ZIFdBUlJBTlRJRVMsSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIAotVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUyBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgCi1USEUgQVVUSE9SUyBBTkQgRElTVFJJQlVUT1JTIEhBVkUgTk8gT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLAotU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgotPC9wcmU+Cg==