ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKClZlcnNpb24gNy4xNC4wICgxNiBNYXkgMjAwNSkKCkRhbmllbCAoMTMgTWF5IDIwMDUpCi0gR3JpZ29yeSBFbnRpbiByZXBvcnRlZCB0aGF0IGN1cmwncyBjb25maWd1cmUgZGV0ZWN0cyBhIGZpbmUgcG9sbCgpIGZvciBNYWMKICBPUyBYIDEwLjQgKHdoaWxlIDEwLjMgb3IgbGF0ZXIgZGV0ZWN0ZWQgYSAiYmFkIiBvbmUpLCBidXQgdGhlIGV4ZWN1dGFibGUKICBkb2Vzbid0IHdvcmsgYXMgZ29vZCBhcyBpZiBidWlsdCB3aXRob3V0IHBvbGwoKS4gSSd2ZSBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgdG8gYWx3YXlzIHNraXAgdGhlIGZpbmUtcG9sbCgpIHRlc3Qgb24gTWFjIE9TIFggKGRhcndpbikuCgpEYW5pZWwgKDEyIE1heSAyMDA1KQotIFdoZW4gZG9pbmcgYSBzZWNvbmQgcmVxdWVzdCAoYWZ0ZXIgYSBkaXNjb25uZWN0KSB1c2luZyB0aGUgc2FtZSBlYXN5IGhhbmRsZSwKICBvdmVyIGEgcHJveHkgdGhhdCB1c2VzIE5UTE0gYXV0aGVudGljYXRpb24sIGxpYmN1cmwgZmFpbGVkIHRvIHVzZSBOVExNIGFnYWluCiAgcHJvcGVybHkgKHRoZSBhdXRoIG1ldGhvZCB3YXMgYWNjaWRlbnRhbGx5IHJlc2V0IHRvIHRoZSBzYW1lIGFzIGhhZCBiZWVuIHNldAogIGZvciBob3N0IGF1dGgsIHdoaWNoIGRlZmF1bHRzIHRvIEJhc2ljKS4gQnVnIHJlcG9ydCAjMTIwMDY2MSBpZGVudGlmaWVkIHRoZQogIHRoZSBwcm9ibGVtIGFuZCB0aGUgZml4LgoKLSBJZiAtei8tLXRpbWUtY29uZCBpcyB1c2VkIHdpdGggYW4gaW52YWxpZCBkYXRlIHN5bnRheCwgdGhpcyBpcyBubyBsb25nZXIKICBzaWxlbnRseSBkaXNjYXJkZWQuIEluc3RlYWQgYSBwcm9wZXIgd2FybmluZyBtZXNzYWdlIGlzIGRpcGxheWVkIHRoYXQKICBpbmZvcm1zIGFib3V0IGl0LiBCdXQgaXQgc3RpbGwgY29udGludWVzIHdpdGhvdXQgdGhlIGNvbmRpdGlvbi4KClZlcnNpb24gNy4xNC4wLXByZTIgKDExIE1heSAyMDA1KQoKRGFuaWVsICgxMSBNYXkgMjAwNSkKLSBTdGFydGluZyBub3csIGxpYmN1cmwgc2VuZHMgYSBsaXR0bGUgZGlmZmVyZW50IHNldCBvZiBoZWFkZXJzIGluIGl0cyBkZWZhdWx0CiAgSFRUUCByZXF1ZXN0czoKICAKICBBKSBOb3JtYWwgbm9uLXByb3h5IEhUVFA6CiAgICAtIG5vIG1vcmUgIlByYWdtYTogbm8tY2FjaGUiICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgdG8gcHJveGllcykKCiAgQikgTm9uLUNPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJQcmFnbWE6IG5vLWNhY2hlIiBpcyB1c2VkIChsaWtlIGJlZm9yZSkKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiIChmb3Igb2xkZXIgc3R5bGUgMS4wLXByb3hpZXMpCgogIEMpIENPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJIb3N0OiBbbmFtZV06W3BvcnRdIgogICAgLSAiUHJveHktQ29ubmVjdGlvbjogS2VlcC1hbGl2ZSIKCiAgVGhlIEEpIGNhc2UgaXMgbW9zdGx5IHRvIHJlZHVjZSB0aGUgZGVmYXVsdCBoZWFkZXIgc2l6ZSBhbmQgcmVtb3ZlIGEKICBwb2ludGxlc3MgaGVhZGVyLgoKICBUaGUgQikgaXMgdG8gYWRkcmVzcyAocmFyZSkgcHJvYmxlbXMgd2l0aCBIVFRQIDEuMCBwcm94aWVzCgogIFRoZSBDKSBoZWFkZXJzIGFyZSBib3RoIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggc29tZSBwcm94aWVzLiBUaGUKICBjb2RlIGluIGxpYmN1cmwgdGhhdCBkZWFscyB3aXRoIENPTk5FQ1QgcmVxdWVzdHMgbmVlZCBhIHJld3JpdGUsIGJ1dCBpdAogIGZlZWxzIGxpa2UgYSB0b28gYmlnIGEgam9iIGZvciBtZSB0byBkbyBub3cuIERldGFpbHMgYXJlIGFkZGVkIGluIHRoZSBjb2RlCiAgY29tbWVudHMgZm9yIG5vdy4KCiAgVXBkYXRlZCBhIGxhcmdlIGFtb3VudCBvZiB0ZXN0IGNhc2VzIHRvIHJlZmxlY3QgdGhlIG5ld3MuCgpEYW5pZWwgKDEwIE1heSAyMDA1KQotIEhhbGYtYmFrZWQgYXR0ZW1wdCB0byBiYWlsIG91dCBpZiBzZWxlY3QoKSByZXR1cm5zIF9vbmx5XyBlcnJvcmZkcyB3aGVuIHRoZQogIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiBBbiBhdHRlbXB0IHRvIGZpeCBBbGxhbidzIHByb2JsZW0uIFNlZQogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wNS8wMDczLmh0bWwgYW5kIHRoZSByZXN0IG9mIHRoYXQgdGhyZWFkCiAgZm9yIGRldGFpbHMuCgogIEknbSBzdGlsbCBub3Qgc3VyZSB0aGlzIGlzIHRoZSByaWdodCBmaXgsIGJ1dC4uLgoKVmVyc2lvbiA3LjE0LjAtcHJlMSAoOSBNYXkgMjAwNSkKCkRhbmllbCAoMiBNYXkgMjAwNSkKLSBTb3J0IG9mICJmaXhlZCIgS05PV05fQlVHUyAjNDogY3VybCBub3cgYnVpbGRzIElQdjYgZW5hYmxlZCBvbiBBSVggNC4zLiBBdAogIGxlYXN0IGl0IHNob3VsZCBubyBsb25nZXIgY2F1c2UgYSBjb21waWxlciBlcnJvci4gSG93ZXZlciwgaXQgZG9lcyBub3QgaGF2ZQogIEFJX05VTUVSSUNIT1NUIHNvIHdlIGNhbm5vdCBnZXRhZGRyaW5mbygpIGFueSBudW1lcmljYWwgYWRkcmVzc2VzIHdpdGggaXQKICAod2UgdXNlIHRoYXQgZm9yIEZUUCBQT1JUL0VQUlQpISBTbywgSSBtb2RpZmllZCB0aGUgY29uZmlndXJlIGNoZWNrIHRoYXQKICBjaGVja3MgaWYgdGhlIGdldGFkZHJpbmZvKCkgaXMgd29ya2luZywgdG8gdXNlIEFJX05VTUVSSUNIT1NUIHNpbmNlIHRoZW4KICBpdCdsbCBmYWlsIG9uIEFJWCA0LjMgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBidWlsZCB3aXRoIElQdjYgc3VwcG9ydAogIGRpc2FibGVkLgoKLSBBZGRlZCAtLXRyYWNlLXRpbWUgdGhhdCB3aGVuIHVzZWQgYWRkcyBhIHRpbWUgc3RhbXAgdG8gZWFjaCB0cmFjZSBsaW5lIHRoYXQKICAtLXRyYWNlLCAtLXRyYWNlLWFzY2lpIGFuZCAtLXZlcmJvc2Ugb3V0cHV0LiBJIGFsc28gbWFkZSB0aGUgJz4nIGRpc3BsYXkKICBzZXBhcmF0ZSBlYWNoIGxpbmUgb24gdGhlIGxpbmVmZWVkIHNvIHRoYXQgSFRUUCByZXF1ZXN0cyBldGMgbG9vayBuaWNlciBpbgogIHRoZSAtdiBvdXRwdXQuCgotIE1hZGUgY3VybCByZWNvZ25pemUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBMeW54IChhbmQgb3RoZXJzPykgc3VwcG9ydCBmb3IKICBwb2ludGluZyBvdXQgdGhlIENBIGNlcnQgcGF0aC9maWxlOiBTU0xfQ0VSVF9ESVIgYW5kIFNTTF9DRVJUX0ZJTEUuIElmCiAgQ1VSTF9DQV9CVU5ETEUgaXMgbm90IHNldCwgdGhleSBhcmUgY2hlY2tlZCBhZnRlcndhcmRzLgoKICBMaWtlIGJlZm9yZTogb24gd2luZG93cyBpZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIGl0IGNoZWNrcyBmb3IgdGhlIGNhIGNlcnQKICBmaWxlIGxpa2UgdGhpczoKCiAgMS4gYXBwbGljYXRpb24ncyBkaXJlY3RvcnkKICAyLiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgMy4gV2luZG93cyBTeXN0ZW0gZGlyZWN0b3J5IChlLmcuIEM6XHdpbmRvd3Ncc3lzdGVtMzIpCiAgNC4gV2luZG93cyBEaXJlY3RvcnkgKGUuZy4gQzpcd2luZG93cykKICA1LiBhbGwgZGlyZWN0b3JpZXMgYWxvbmcgJVBBVEglCgpEYW5pZWwgKDEgTWF5IDIwMDUpCi0gVGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBub3cgc3RhcnRzIHRlc3Qgc2VydmVycyBieSBkb2luZyBmb3JrKCkgYW5kIGV4ZWMoKQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGFwcHJvYWNoLiBUaGlzIGlzIGxlc3MgY29tcGxpY2F0ZWQgYW5kIHNob3VsZAogIGhvcGVmdWxseSBsZWFkIHRvIGxlc3MgImxlYWtlZCIgc2VydmVycyAoc2VydmVycyB0aGF0IGFyZW4ndCBzdG9wcGVkCiAgcHJvcGVybHkgd2hlbiB0aGUgdGVzdHMgYXJlIHN0b3BwZWQpLgoKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIGEgY2FzZSB3aGVuIHlvdSBkaWQgImN1cmwgLUkgW1VSTF0iIGFuZCBpdAogIGNvbXBsYWluZWQgb24gdGhlIGNodW5rZWQgZW5jb2RpbmcsIGV2ZW4gdGhvdWdoIGEgSEVBRCBzaG91bGQgbmV2ZXIgcmV0dXJuIGEKICBib2R5IGFuZCB0aHVzIGl0IGNhbm5vdCBiZSBhIGNodW5rZWQtZW5jb2RpbmcgcHJvYmxlbSEKCkRhbmllbCAoMzAgQXByaWwgMjAwNSkKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIG91dCB0aGF0IChsaWIpY3VybCBTSUdTRUdWZWQgd2hlbiB1c2luZwogIC0taW50ZXJmYWNlIG9uIGFuIGFkZHJlc3MgdGhhdCBjYW4ndCBiZSBib3VuZC4KCkRhbmllbCAoMjggQXByaWwgMjAwNSkKLSBXb3JraW5nIG9uIGZpeGluZyB1cCB0ZXN0IGNhc2VzIHRvIG1hcmsgc2VjdGlvbnMgYXMgJ21vZGU9dGV4dCcgZm9yIHRoaW5ncwogIHRoYXQgY3VybCB3cml0ZXMgYXMgdGV4dCBmaWxlcywgc2luY2UgdGhlbiB0aGV5IGNhbiBnZXQgZGlmZmVyZW50IGxpbmUKICBlbmRpbmdzIGRlcGVuZGluZyBvbiBPUy4gQW5kculzIEdhcmPtYSBoZWxwcyBtZSB3b3JrIHRoaXMgb3V0LgoKICBEaWQgbG90cyBvZiBvdGhlciBtaW5vciB0d2Vha3Mgb24gdGhlIHRlc3Qgc2NyaXB0cyB0byB3b3JrIGJldHRlciBhbmQgbW9yZQogIHJlbGlhYmx5IGZpbmQgdGVzdCBzZXJ2ZXJzIGFuZCBhbHNvIGtpbGwgdGVzdCBzZXJ2ZXJzLgoKLSBEYW4gRmFuZHJpY2ggcG9pbnRlZCBvdXQgaG93IHRoZSBydW50ZXN0cy5wbCBzY3JpcHQga2lsbGVkIHRoZSBIVFRQIHNlcnZlcgogIGluc3RlYWQgb2YgdGhlIEhUVFBTIHNlcnZlciB3aGVuIGNsb3NpbmcgaXQgZG93bi4KCkRhbmllbCAoMjcgQXByaWwgMjAwNSkKLSBQYXVsIE1vb3JlIG1hZGUgY3VybCBjaGVjayBmb3IgdGhlIC5jdXJscmMgZmlsZSAoX2N1cmxyYyBvbiB3aW5kb3dzKSBvbiB0d28KICBtb3JlIHBsYWNlcy4gRmlyc3QsIENVUkxfSE9NRSBpcyBhIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGlzIHVzZWQKICBpbnN0ZWFkIG9mIEhPTUUgaWYgaXQgaXMgc2V0LCB0byBwb2ludCBvdXQgd2hlcmUgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUKICBsaXZlcy4gSWYgdGhlcmUncyBubyBjb25maWcgZmlsZSBpbiB0aGUgZGlyIHBvaW50ZWQgb3V0IGJ5IG9uZSBvZiB0aGUKICBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoZSBXaW5kb3dzIHZlcnNpb24gd2lsbCBpbnN0ZWFkIGNoZWNrIHRoZSBzYW1lCiAgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGN1cmwgaXMgbG9jYXRlZCBpbi4KCkRhbmllbCAoMjYgQXByaWwgMjAwNSkKLSBDb3J5IE5lbHNvbidzIHdvcmsgb24gbnVraW5nIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgb24geDY0IHdpdGgKICBWUzIwMDUuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDUpCi0gRnJlZCBOZXcgcmVwb3J0ZWQgYSBidWcgd2hlcmUgd2UgdXNlZCBCYXNpYyBhdXRoIGFuZCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCiAgaW4gLm5ldHJjLCBhbmQgd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjogdGhlIHN1YnNlcXVlbnQgcmVxdWVzdHMgZGlkbid0CiAgcHJvcGVybHkgdXNlIHRoZSBhdXRoIGFzIGZvdW5kIGluIHRoZSBuZXRyYyBmaWxlLiBBZGRlZCB0ZXN0IGNhc2UgMjU3IHRvCiAgdmVyaWZ5IG15IGZpeC4KCi0gQmFzZWQgb24gZmVlZGJhY2sgZnJvbSBDb3J5IE5lbHNvbiwgSSBhZGRlZCBzb21lIHByZXByb2Nlc3NvciBtYWdpYyBpbgogICovc2V0dXAuaCBhbmQgKi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIHdpdGggVlMyMDA1IG9uIHg2NC4KCkRhbmllbCAoMjMgQXByaWwgMjAwNSkKLSBBbGV4IFN1eWtvdiBtYWRlIHRoZSBjdXJsIHRvb2wgbm93IGFzc3VtZSB0aGF0IHVwbG9hZHMgdXNpbmcgSFRUUDovLyBvcgogIEhUVFBTOi8vIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgc2hvdyBvdXRwdXQgYW5kIHRodXMgbW90aXZhdGVzIGEgc3dpdGNoZWQKICBvZmYgcHJvZ3Jlc3MgbWV0ZXIgaWYgdGhlIG91dHB1dCBpcyBzZW50IHRvIHRoZSB0ZXJtaW5hbC4gVGhpcyBtYWtlcyBGVFAKICB1cGxvYWRzIHdpdGhvdXQgJz4nLCAtbyBvciAtTyBzaG93IHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjIgQXByaWwgMjAwNSkKLSBEYXZlIERyaWJpbidzIE1TVkMgbWFrZWZpbGUgZml4OiBzZXQgQ1VSTF9TVEFUSUNMSUIgd2hlbiBpdCBidWlsZHMgc3RhdGljCiAgbGlicmFyeSB2YXJpYW50cy4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCBjb25maWd1cmUgdG8gc2V0IHRoZSBwcm9wZXIgZGVmaW5lIHdoZW4gYnVpbGRpbmcgc3RhdGljCiAgbGliY3VybCBvbiB3aW5kb3dzLgoKLSAtLXJldHJ5LWRlbGF5IGRpZG4ndCB3b3JrLgoKRGFuaWVsICgxOCBBcHJpbCAyMDA1KQotIE9saXZpZXIgcmVwb3J0ZWQgdGhhdCBldmVuIHRob3VnaCBoZSB1c2VkIENVUkxPUFRfUE9SVCwgbGliY3VybCBjbGVhcmx5CiAgc3RpbGwgdXNlZCB0aGUgZGVmYXVsdCBwb3J0LiBIZSB3YXMgcmlnaHQuIEkgZml4ZWQgdGhlIHByb2JsZW0gYW5kIGFkZGVkIHRoZQogIHRlc3QgY2FzZXMgNTIxLCA1MjIgYW5kIDUyMyB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gVG9zaGl5dWtpIE1hZXphd2EgcmVwb3J0ZWQgdGhhdCB3aGVuIGRvaW5nIGEgUE9TVCB3aXRoIGEgcmVhZCBjYWxsYmFjaywKICBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBzZW5kIGFuIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlci4gSXQgZG9lcyBub3cuCgotIEkgY29tbWl0dGVkIGJ5IG1pZyBjaGFuZ2UgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgbW92ZXMgb3V0IGFsbAogIHNvY2tldC9UQ1AgY29kZSB0byBhIHNlcGFyYXRlIEMgcHJvZ3JhbSBuYW1lZCBzb2NrZmlsdC4gQW5kIGFkZGVkIDQgbmV3CiAgdGVzdCBjYXNlcyBmb3IgRlRQIG92ZXIgSVB2Ni4KCkRhbmllbCAoOCBBcHJpbCAyMDA1KQotIENvcnkgTmVsc29uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGEgSFRUUCBzZXJ2ZXIgdGhhdCByZXNwb25kZWQgd2l0aCBhIDMwNAogIHJlc3BvbnNlIGNvbnRhaW5pbmcgYW4gImlsbGVnYWwiIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIsIHdoaWNoIHdhcyBub3QKICBwcm9wZXJseSBpZ25vcmVkIGJ5IGxpYmN1cmwuIE5vdyBpdCBpcy4gVGVzdCBjYXNlIDI0OSB2ZXJpZmllcy4KCkRhbmllbCAoNyBBcHJpbCAyMDA1KQotIEFkZGVkIGFiaWxpdHkgdG8gYnVpbGQgYW5kIHJ1biB3aXRoIEdudVRMUyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBPcGVuU1NMIGZvcgogIHRoZSBzZWN1cmUgbGF5ZXIuIGNvbmZpZ3VyZSAtLXdpdGgtZ251dGxzIGVuYWJsZXMgd2l0aC4gTm90ZSB0aGF0IHRoZQogIHByZXZpb3VzIE9wZW5TU0wgY2hlY2sgc3RpbGwgaGFzIHByZWZlcmVuY2UgYW5kIGlmIGl0IGZpcnN0IGRldGVjdHMgT3BlblNTTCwKICBpdCB3aWxsIG5vdCBjaGVjayBmb3IgR251VExTLiBZb3UgbWF5IG5lZWQgdG8gZXhwbGljdGx5IGRpYWJsZSBPcGVuU1NMIHdpdGgKICAtLXdpdGhvdXQtc3NsLgoKICBUaGlzIHdvcmsgaGFzIGJlZW4gc3BvbnNvcmVkIGJ5IFRoZSBXcml0dGVuIFdvcmQuCgpEYW5pZWwgKDUgQXByaWwgMjAwNSkKLSBDaHJpc3RvcGhlIExlZ3J5IGZpeGVkIHRoZSBwb3N0LXVwbG9hZCBjaGVjayBmb3IgRlRQIHRvIG5vdCBjb21wbGFpbiBpZiB0aGUKICB1cGxvYWQgd2FzIHNraXBwZWQgZHVlIHRvIGEgdGltZS1jb25kaXRpb24gYXMgc2V0IHdpdGgKICBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEkgYWRkZWQgdGVzdCBjYXNlIDI0NyBhbmQgMjQ4IHRvIHZlcmlmeS4KClZlcnNpb24gNy4xMy4yICg1IEFwcmlsIDIwMDUpCgpEYW5pZWwgKDQgQXByaWwgMjAwNSkKLSBNYXJjZWxvIEp1Y2hlbSBmaXhlZCB0aGUgTVNWQyBtYWtlZmlsZSBmb3IgbGliY3VybAoKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGNyYXNoIGluIGxpYmN1cmwsIHRoYXQgY291bGQgaGFwcGVuIGlmIHRoZSBlYXN5IGhhbmRsZQogIHdhcyBraWxsZWQgYmVmb3JlIHRoZSB0aHJlYWRpbmcgcmVzb2x2ZXIgKHdpbmRvd3Mgb25seSkgc3RpbGwgaGFkbid0CiAgY29tcGxldGVkLgoKLSBIYXJkZWVwIFNpbmdoIHJlcG9ydGVkIGEgcHJvYmxlbSBkb2luZyBIVFRQIFBPU1Qgd2l0aCBEaWdlc3QuIChJdCB3YXMKICBhY3R1YWxseSBhbHNvIGFmZmVjdGluZyBOVExNIGFuZCBOZWdvdGlhdGUuKSBJdCB0dXJuZWQgb3V0IHRoYXQgaWYgdGhlCiAgc2VydmVyIHJlc3BvbmRlZCB3aXRoIDEwMCBDb250aW51ZSBiZWZvcmUgdGhlIGluaXRpYWwgNDAxIHJlc3BvbnNlLCBsaWJjdXJsCiAgZGlkbid0IHRha2UgY2FyZSBvZiB0aGUgcmVzcG9uc2UgcHJvcGVybHkuIFRlc3QgY2FzZSAyNDUgYW5kIDI0NiBhZGRlZCB0bwogIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA1KQotIEFuZHJlcyBHYXJjaWEgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGxpYmdkaTMyIGJlZm9yZQogIGxpYmNyeXB0bywgdG8gbWFrZSB0aGUgU1NMIGNoZWNrIHdvcmsgZmluZSBvbiBtc3lzL21pbmd3LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA1KQotIFRvbSBNb2VycyBpZGVudGlmaWVkIGEgZmxhdyB3aGVuIHlvdSBzZW50IGEgUE9TVCB3aXRoIERpZ2VzdCBhdXRoZW50aWNhdGlvbiwKICBhcyBpbiB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIGN1cmwgc2VuZHMgYSBQT1NUIHdpdGggQ29udGVudC1MZW5ndGg6IDAsIGl0CiAgc3RpbGwgZm9yY2libHkgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBkb2luZyB0aGUgbmV4dCBzdGVwIGluIHRoZSBhdXRoCiAgbmVnb3RpYXRpb24uCgotIEplc3BlciBKZW5zZW4gZm91bmQgb3V0IHRoYXQgRlRQLVNTTCBkaWRuJ3Qgd29yayBzaW5jZSBteSBGVFAKICByZXdyaXRlLiBGaXhpbmcgdGhhdCB3YXMgZWFzeSwgYnV0IGl0IGFsc28gcmV2ZWFsZWQgYSBtdWNoIHdvcnNlIHByb2JsZW06CiAgdGhlIEZUUCBzZXJ2ZXIgcmVzcG9uc2UgcmVhZGVyIGZ1bmN0aW9uIGRpZG4ndCBwcm9wZXJseSBkZWFsIHdpdGggcmVhZGluZwogIHJlc3BvbnNlcyBpbiBtdWx0aXBsZSB0aW55IGNodW5rcyBwcm9wZXJseSEgSSBtb2RpZmllZCB0aGUgRlRQIHNlcnZlciB0bwogIGFsbG93IGl0IHRvIHByb2R1Y2Ugc3VjaCBzcGxpdC11cCByZXNwb25zZXMgdG8gbWFrZSBzdXJlIGN1cmwgZGVhbHMgd2l0aAogIHRoZW0gYXMgaXQgc2hvdWxkLgoKLSBCYXNlZCBvbiBBdWd1c3R1cyBTYXVuZGVycycgY29tbWVudHMgYW5kIGZpbmRpbmdzLCB0aGUgSFRUUCBvdXRwdXQgYXV0aAogIGZ1bmN0aW9uIHdhcyBmaXhlZCB0byB1c2UgdGhlIHByb3BlciBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIG11bHRpcGxlIG9uZXMKICBhcmUgYWNjZXB0ZWQuIHRlc3QgMjM5IGFuZCB0ZXN0IDI0MyB3ZXJlIGFkZGVkIHRvIHJlcGVhdCB0aGUgcHJvYmxlbXMgYW5kCiAgdmVyaWZ5IHRoZSBmaXhlcy4KCiAgLS1wcm94eS1hbnlhdXRoIHdhcyBhZGRlZCB0byB0aGUgY3VybCB0b29sCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDUpCi0gVHJ1NjQgYW5kIHNvbWUgSVJJWCBib3hlcyBzZWVtIHRvIG5vdCBsaWtlIHRlc3QgMjM3IGFzIGl0IGlzLiBUaGVpcgogIGluZXRfYWRkcigpIGZ1bmN0aW9ucyBzZWVtcyB0byB1c2UgJjI1NSBvbiBhbGwgbnVtZXJpY2FscyBpbiBhIGlwdjQgZG90dGVkCiAgYWRkcmVzcyB3aGljaCBtYWtlcyBhIGRpZmZlcmVudCBmYWlsdXJlLi4uIE5vdyBJJ3ZlIG1vZGlmaWVkIHRoZSBpcHY0CiAgcmVzb2x2ZSBjb2RlIHRvIHVzZSBpbmV0X3B0b24oKSBpbnN0ZWFkIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGVzZSBzeXN0ZW1zCiAgYmV0dGVyIGRldGVjdCB0aGlzIGFzIGEgYmFkIElQIGFkZHJlc3MgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSB0b2FsbHkgYm9ndXMKICBhZGRyZXNzIHRoYXQgaXMgdGhlbiBwYXNzZWQgb24gYW5kIHVzZWQuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDUpCi0gRGFuIEZhbmRyaWNoIG1hZGUgdGhlIGNvZGUgcHJvcGVybHkgdXNlIHRoZSB1Q2xpYmMncyB2ZXJzaW9uIG9mCiAgaW5ldF9udG9hX3IoKSB3aGVuIGJ1aWx0IHdpdGggaXQuCgotIEFkZGVkIHRlc3QgMjM3IGFuZCAyMzg6IHRlc3QgRVBTViBhbmQgUEFTViByZXNwb25zZSBoYW5kbGluZyB3aGVuIHRoZXkgZ2V0CiAgd2VsbC0gZm9ybWF0ZWQgZGF0YSBiYWNrIGJ1dCB1c2luZyBpbGxlZ2FsIHZhbHVlcy4gSW4gMjM3IFBBU1YgZ2V0cyBhbiBJUAogIGFkZHJlc3MgdGhhdCBpcyB3YXkgYmFkLiBJbiAyMzggRVBTViBnZXRzIGEgcG9ydCB0aGF0IGlzIHdheSBvdXQgb2YgcmFuZ2UuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDUpCi0gQWRkZWQgYSBmZXcgbWlzc2luZyBmZWF0dXJlcyB0byB0aGUgY3VybC1jb25maWcgLS1mZWF0dXJlcyBsaXN0CgotIE1vZGlmaWVkIHRlc3RjdXJsLnBsIHRvIG5vdyBvZmZlcgogIDEgLSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgYWxsIGluZm8gaXQgcHJldmlvdXNseSBvbmx5IHJlYWQgZnJvbQogICAgICBmaWxlOiAtLW5hbWUsIC0tZW1haWwsIC0tZGVzYyBhbmQgLS1jb25maWd1cmUKICAyIC0gLS1ub2N2c3VwIG1ha2VzIGl0IG5vdCBhdHRlbXB0IHRvIGRvIGN2cyB1cGRhdGUKICAzIC0gLS1jcm9zc2NvbXBpbGUgaW5mb3JtcyBpdCBhbmQgbWFrZXMgaXQgbm90IGF0dGVtcHQgdGhpbmdzIGl0IGNhbid0IGRvCgotIEZpeGVkIG51bWVyb3VzIHdpbjMyIGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBSZW1vdmVkIHRoZSBsaWIvc2VjdXJpdHkuaCBmaWxlIHNpbmNlIGl0IHNoYWRvd2VkIHRoZSBtaW5ndy93aW4zMiBoZWFkZXIKICB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggaXMgbmVlZGVkIGZvciBTU1BJIGJ1aWxkcy4gVGhlIGNvbnRlbnRzIG9mIHRoZQogIGZvcm1lciBzZWN1cml0eS5oIGlzIG5vdyBpIGtyYjQuaAoKLSBjb25maWd1cmUgLS1lbmFibGUtc3NwaSBub3cgZW5hYmxlcyBTU1BJIGluIHRoZSBidWlsZC4gSXQgb25seSB3b3JrcyBmb3IKICB3aW5kb3dzIGJ1aWxkcyAoaW5jbHVkaW5nIGNyb3NzLWNvbXBpbGVzIGZvciB3aW5kb3dzKS4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNSkKLSBEYXZpZCBIb3VsZGVyIGFkZGVkIC0tZm9ybS1zdHJpbmcgdGhhdCBhZGRzIHRoYXQgc3RyaW5nIHRvIGEgbXVsdGlwYXJ0CiAgZm9ybXBvc3QgcGFydCwgd2l0aG91dCBzcGVjaWFsIGNoYXJhY3RlcnMgaGF2aW5nIHNwZWNpYWwgbWVhbmluZ3MgZXRjIGxpa2UKICAtLWZvcm0gZmVhdHVyZXMuCgpEYW5pZWwgKDExIE1hcmNoIDIwMDUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSByZXR1cm5zIHRoZSBmZWF0dXJlIGJpdCBDVVJMX1ZFUlNJT05fU1NQSSBpZiBpdCB3YXMKICBidWlsdCB3aXRoIFNTUEkgc3VwcG9ydC4KCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIG1hZGUgaXQgcG9zc2libGUgdG8gYnVpbGQgbGliY3VybCB3aXRoIHRoZQogIFVTRV9XSU5ET1dTX1NTUEkgb24gV2luZG93cywgYW5kIHRoZW4gbGliY3VybCB3aWxsIGJlIGJ1aWx0IHRvIHVzZSB0aGUKICBuYXRpdmUgd2F5IHRvIGRvIE5UTE0uIFNTUEkgYWxzbyBhbGxvd3MgbGliY3VybCB0byBwYXNzIG9uIHRoZSBjdXJyZW50IHVzZXIKICBhbmQgaXRzIHBhc3N3b3JkIGluIHRoZSByZXF1ZXN0LgoKRGFuaWVsICg5IE1hcmNoIDIwMDUpCi0gRGFuIEYgaW1wcm92ZWQgdGhlIFNTTCBsaWIgc2V0dXAgaW4gY29uZmlndXJlLgoKLSBOb2RhayBTb2RhayByZXBvcnRlZCBhIGNyYXNoIHdoZW4gdXNpbmcgYSBTT0NLUzQgcHJveHkuCgotIEplYW4tTWFyYyBSYW5nZXIgcG9pbnRlZCBvdXQgYW4gZW1iYXJhc3NpbmcgZGVidWcgcHJpbnRmKCkgbGVmdG92ZXIgaW4gdGhlCiAgbXVsdGkgaW50ZXJmYWNlIGNvZGUuCgotIEFkanVzdGVkIHRoZSBtYW4gcGFnZSBmb3IgdGhlIGN1cmxfZ2V0ZGF0ZSgpIHJldHVybiB2YWx1ZSBmb3IgZGF0ZXMgYWZ0ZXIKICB5ZWFyIDIwMzguIEZvciAzMiBiaXQgdGltZV90IGl0IHJldHVybnMgMHg3ZmZmZmZmZiBidXQgZm9yIDY0Yml0IHRpbWVfdCBpdAogIHJldHVybnMgZWl0aGVyIHRoZSBjb3JyZWN0IHZhbHVlIG9yIGV2ZW4gLTEgb24gc29tZSBzeXN0ZW1zIHRoYXQgc3RpbGwgc2VlbQogIHRvIG5vdCBkZWFsIHdpdGggdGhpcyBwcm9wZXJseS4gVG9yIEFybnRzZW4gZm91bmQgYSA2NGJpdCBBSVggc3lzdGVtIGZvciB1cwogIHRoYXQgZGlkIHRoZSBsYXR0ZXIuIEd3ZW5vbGUgQmVhdWNoZXNuZSdzIE1hbmRyYWtlIHBhdGNoIHB1dCB0aGUgbGlnaHRzIG9uCiAgdGhpcyBwcm9ibGVtIGluIHRoZSBmaXJzdCBwbGFjZS4KCkRhbmllbCAoOCBNYXJjaCAyMDA1KQotIERvbWluaWNrIE1lZ2xpbyByZXBvcnRlZCB0aGF0IHVzaW5nIENVUkxPUFRfRklMRVRJTUUgd2hlbiB0cmFuc2ZlcnJpbmcgYSBGVFAKICBmaWxlIGdvdCBhIExhc3QtTW9kaWZpZWQ6IGhlYWRlciB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSwgY29ycnVwdGluZyB0aGUKICBhY3R1YWwgZGF0YS4gVGhpcyB3YXMgYmVjYXVzZSBzb21lIGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJldmlvdXMgRlRQIGNvZGUgd2FzCiAgbm90IHByb3Blcmx5IGJyb3VnaHQgaW50byB0aGUgbmV3IEZUUCBjb2RlLiBJIGZpeGVkIGFuZCBJIGFkZGVkIHRlc3QgY2FzZQogIDUyMCB0byB2ZXJpZnkuIChUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiA3LjEzLjEpCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgY29uZmlndXJlIC0td2l0aC16bGliIG9wdGlvbiB0byBhbHdheXMgY29uc2lkZXIgdGhlCiAgZ2l2ZW4gcGF0aCBiZWZvcmUgYW55IHN0YW5kYXJkIHBhdGhzLgoKRGFuaWVsICg2IE1hcmNoIDIwMDUpCi0gUmFuZHkgTWNNdXJjaHkgd2FzIHRoZSBmaXJzdCB0byByZXBvcnQgdGhhdCB2YWxncmluZC5wbSB3YXMgbWlzc2luZyBmcm9tIHRoZQogIHJlbGVhc2UgYXJjaGl2ZSBhbmQgdGh1cyAnbWFrZSB0ZXN0JyBmYWlscy4KCkRhbmllbCAoNSBNYXJjaCAyMDA1KQotIERhbiBGYW5kcmljaCBhZGRlZCBIQVZFX0ZUUlVOQ0FURSB0byBzZXZlcmFsIGNvbmZpZy0qLmggZmlsZXMuCgotIEFkZGVkIHRlc3QgY2FzZSAyMzUgdGhhdCBtYWtlcyBhIHJlc3VtZWQgdXBsb2FkIG9mIGEgZmlsZSB0aGF0IGlzbid0IHByZXNlbnQKICBvbiB0aGUgcmVtb3RlIHNpZGUuIFRoaXMgdGhlbiBjb252ZXJ0cyB0aGUgb3BlcmF0aW9uIHRvIGFuIG9yZGluYXJ5IFNUT1IKICB1cGxvYWQuIFRoaXMgd2FzIHJlcXVlc3RlZC9wb2ludGVkIG91dCBieSBJZ25hY2lvIFZhenF1ZXotQWJyYW1zLgoKICBJdCBhbHNvIHByb3ZlZCAoYW5kIEkgZml4ZWQpIGEgYnVnIGluIHRoZSBuZXdseSByZXdyaXR0ZW4gZnRwIGNvZGUgKGFuZAogIHByZXNlbnQgaW4gdGhlIDcuMTMuMSByZWxlYXNlKSB3aGVuIHRyeWluZyB0byByZXN1bWUgYW4gdXBsb2FkIGFuZCB0aGUKICBzZXJ2ZXJzIHJldHVybnMgYW4gZXJyb3IgdG8gdGhlIFNJWkUgY29tbWFuZC4gbGliY3VybCB0aGVuIGxvb3BzIGFuZCBzZW5kcwogIFNJWkUgY29tbWFuZHMgaW5maW5pdGVseS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIGEgU1NMIHByb2JsZW0gaW50cm9kdWNlZCBvbiBGZWJydWFyeSA5dGggdGhhdCBtYWRlCiAgbGliY3VybCBhdHRlbXB0IHRvIGxvYWQgdGhlIHdob2xlIHJhbmRvbSBmaWxlIHRvIHNlZWQgdGhlIFBSTkcuIFRoaXMgaXMKICByZWFsbHkgYmFkIHNpbmNlIHRoaXMgdHVybnMgb3V0IHRvIGJlIHVzaW5nIC9kZXYvdXJhbmRvbSBhdCB0aW1lcy4uLgoKVmVyc2lvbiA3LjEzLjEgKDQgTWFyY2ggMjAwNSkKCkRhbmllbCAoNCBNYXJjaCAyMDA1KQotIERhdmUgRHJpYmluIG1hZGUgaXQgcG9zc2libGUgdG8gc2V0IENVUkxPUFRfQ09PS0lFRklMRSB0byAiIiB0byBhY3RpdmF0ZQogIHRoZSBjb29raWUgImVuZ2luZSIgd2l0aG91dCBoYXZpbmcgdG8gcHJvdmlkZSBhbiBlbXB0eSBvciBub24tZXhpc3RpbmcgZmlsZS4KCi0gUmVuZSBSZWJlIGZpeGVkIGEgLSMgY3Jhc2ggd2hlbiBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCB3YXMgcmV0cmlldmVkLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA1KQotIE5UTE0gYW5kIGZ0cC1rcmI0IGJ1ZmZlciBvdmVyZmxvdyBmaXhlZCwgYXMgcmVwb3J0ZWQgaGVyZToKICBodHRwOi8vd3d3LnNlY3VyaXR5Zm9jdXMuY29tL2FyY2hpdmUvMS8zOTEwNDIgYW5kIHRoZSBDQU4gcmVwb3J0IGhlcmU6CiAgaHR0cDovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVuYW1lLmNnaT9uYW1lPUNBTi0yMDA1LTA0OTAKCiAgSWYgdGhlc2Ugc2VjdXJpdHkgZ3V5cyB3ZXJlIHNlcmlvdXMsIHdlJ2QgYmVlbiBub3RpZmllZCBpbiBhZHZhbmNlIGFuZCB3ZQogIGNvdWxkJ3ZlIHNhdmVkIGEgZmV3IG9mIHlvdSBhIGxpdHRsZSBzdXJwcmlzZSwgYnV0IG5vdyB3ZSB3ZXJlbid0LgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA1KQotIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkIGEgZmxhdyB3aGVuIHlvdSB1c2VkIGEgcHJveHkgd2l0aCBhdXRoLCBhbmQgeW91CiAgcmVxdWVzdGVkIGRhdGEgZnJvbSBhIGhvc3QgYW5kIHRoZW4gZm9sbG93ZWQgYSByZWRpcmVjdCB0byBhbm90aGVyCiAgaG9zdC4gbGliY3VybCB0aGVuIGRpZG4ndCB1c2UgdGhlIHByb3h5LWF1dGggcHJvcGVybHkgaW4gdGhlIHNlY29uZCByZXF1ZXN0LAogIGR1ZSB0byB0aGUgaG9zdC1vbmx5IGNoZWNrIGZvciBvcmlnaW5hbCBob3N0IG5hbWUgd3JvbmdseSBiZWluZyBleHRlbmRlZCB0bwogIHRoZSBwcm94eSBhdXRoIGFzIHdlbGwuIEFkZGVkIHRlc3QgY2FzZSAyMzMgdG8gdmVyaWZ5IHRoZSBmbGF3IGFuZCB0aGF0IHRoZQogIGZpeCByZW1vdmVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA1KQotIE1pa2UgRG9iYnMgcmVwb3J0ZWQgYSBtaW5ndyBidWlsZCBmYWlsdXJlIGR1ZSB0byB0aGUgbGFjayBvZgogIEJVSUxESU5HX0xJQkNVUkwgYmVpbmcgZGVmaW5lZCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQuIE5vdyB0aGlzIGlzIGRlZmluZWQgYnkKICBjb25maWd1cmUgd2hlbiBtaW5ndyBpcyB1c2VkLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA1KQotIERhdmlkIGluIGJ1ZyByZXBvcnQgIzExMjQ1ODggZm91bmQgYW5kIGZpeGVkIGEgc29ja2V0IGxlYWsgd2hlbiBsaWJjdXJsCiAgZGlkbid0IGNsb3NlIHRoZSBzb2NrZXQgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgZXJyb3IgZHVlIHRvIGZhaWxpbmcKICBsb2NhbGJpbmQKCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggSFRUUC1QT1NUaW5nIHVzaW5nICJhbnlhdXRoIgogIHRoYXQgcGlja3MgTlRMTS4gVGhhbmtzIHRvIERhdmlkIEJ5cm9uIGxldHRpbmcgbWUgdGVzdCBOVExNIGFnYWluc3QgaGlzCiAgc2VydmVycywgSSBjb3VsZCBxdWlja2x5IHJlcGVhdCBhbmQgZml4IHRoZSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IHRvIGJlOgoKICBXaGVuIGxpYmN1cmwgUE9TVHMgd2l0aG91dCBrbm93aW5nL3VzaW5nIGFuIGF1dGhlbnRpY2F0aW9uIGFuZCBpdCBnZXRzIGJhY2sKICBhIGxpc3Qgb2YgdHlwZXMgZnJvbSB3aGljaCBpdCBwaWNrcyBOVExNLCBpdCBuZWVkcyB0byBlaXRoZXIgY29udGludWUKICBzZW5kaW5nIGl0cyBkYXRhIGlmIGl0IGtlZXBzIHRoZSBjb25uZWN0aW9uIGFsaXZlLCBvciBub3Qgc2VuZCB0aGUgZGF0YSBidXQKICBjbG9zZSB0aGUgY29ubmVjdGlvbi4gVGhlbiBkbyB0aGUgZmlyc3Qgc3RlcCBpbiB0aGUgTlRMTSBhdXRoLiBsaWJjdXJsCiAgZGlkbid0IHNlbmQgdGhlIGRhdGEgbm9yIGNsb3NlIHRoZSBjb25uZWN0aW9uIGJ1dCBzaW1wbHkgcmVhZCB0aGUKICByZXNwb25zZS1ib2R5IGFuZCB0aGVuIHNlbnQgdGhlIGZpcnN0IG5lZ290aWF0aW9uIHN0ZXAuIFdoaWNoIHRoZW4gZmFpbGVkCiAgbWlzZXJhYmx5IG9mIGNvdXJzZS4gVGhlIGZpeGVkIHZlcnNpb24gZm9yY2VzIGEgY29ubmVjdGlvbiBpZiB0aGVyZSBpcyBtb3JlCiAgdGhhbiAyMDAwIGJ5dGVzIGxlZnQgdG8gc2VuZC4KCkRhbmllbCAoMTQgRmVicnVhcnkgMjAwNSkKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpIHNvIGl0CiAgd2FzIG5ldmVyIHVzZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDUpCi0gUmVtb3ZlZCBhbGwgdXNlcyBvZiBzdHJmdGltZSgpIHNpbmNlIGl0IHVzZXMgdGhlIGxvY2FsaXNlZCB2ZXJzaW9uIG9mIHRoZQogIHdlZWsgZGF5IG5hbWVzIGFuZCBtb250aCBuYW1lcyBhbmQgc2VydmVycyBkb24ndCBsaWtlIHRoYXQuCgpEYW5pZWwgKDEwIEZlYnJ1YXJ5IDIwMDUpCi0gTm93IHRoZSB0ZXN0IHNjcmlwdCBkaXNhYmxlcyB2YWxncmluZC10ZXN0aW5nIHdoZW4gdGhlIHRlc3Qgc3VpdGUgcnVucyBpZgogIGxpYmN1cmwgaXMgYnVpbHQgc2hhcmVkLiBPdGhlcndpc2UgdmFsZ3JpbmQgb25seSB0ZXN0cyB0aGUgc2hlbGwgdGhhdCBydW5zCiAgdGhlIHdyYXBwZXItc2NyaXB0IG5hbWVkICdjdXJsJyB0aGF0IGlzIGEgZnJvbnQtZW5kIHRvIGN1cmwgaW4gdGhpcyBjYXNlLgogIFRoaXMgc2hvdWxkIGFsc28gZml4IHRoZSBodWdlIGFtb3VudCBvZiByZXBvcnRzIG9mIGZhbHNlIHBvc2l0aXZlcyB3aGVuCiAgdmFsZ3JpbmQgaGFzIGlkZW50aWZpZWQgbGVha3MgaW4gKGJhKXNoIGFuZCBub3QgaW4gY3VybCBhbmQgcGVvcGxlIHJlcG9ydAogIHRoYXQgYXMgY3VybCBidWdzLiBCdWcgcmVwb3J0ICMxMTE2NjcyIGlzIG9uZSBleGFtcGxlLgoKICBBbHNvLCB0aGUgdmFsZ3JpbmQgcmVwb3J0IHBhcnNlciBoYXMgYmVlbiBhZGFwdGVkIHRvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lCiAgb2YgdGhlIHNvdXJjZXMgaW4gYSBzdGFjayBzdHJhY2UgaXMgb25lIG9mIChsaWIpY3VybCdzIHNvdXJjZSBmaWxlcyBvcgogIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBjb25zaWRlciB0aGUgcHJvYmxlbSB0byBjb25jZXJuIChsaWIpY3VybC4KCi0gTWFydHkgS3VocnQgc3RyZWFtbGluZWQgdGhlIFZNUyBidWlsZC4KCkRhbmllbCAoOSBGZWJydWFyeSAyMDA1KQotIERhdmlkIEJ5cm9uIGZpeGVkIGhpcyBTU0wgcHJvYmxlbXMsIGluaXRpYWxseSBtZW50aW9uZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDEvMDI0MC5odG1sLiBJdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCB1c2UKICBTU0xfcGVuZGluZygpIGFzIHdlIHNob3VsZC4KCi0gQ29udmVydGVkIGxvdHMgb2YgRlRQIGNvZGUgdG8gYSBzdGF0ZW1hY2hpbmUsIHNvIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZQogIGRvZXNuJ3QgYmxvY2sgd2hpbGUgY29tbXVuaWNhdGluZyBjb21tYW5kcy1yZXNwb25zZXMgd2l0aCBhbiBGVFAgc2VydmVyLgoKICBJJ3ZlIGFkZGVkIGEgY29tbWVudCBsaWtlIEJMT0NLSU5HIGluIHRoZSBjb2RlIG9uIGFsbCBzcG90cyBJIGNvdWxkIGZpbmQKICB3aGVyZSB3ZSBzdGlsbCBoYXZlIGJsb2NraW5nIG9wZXJhdGlvbnMuIFdoZW4gd2UgY2hhbmdlIGN1cmxfZWFzeV9wZXJmb3JtKCkKICB0byB1c2UgdGhlIG11bHRpIGludGVyZmFjZSwgd2UnbGwgYWxzbyBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIHNpbmNlCiAgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSAiaW50ZXJuYWwgaW50ZXJmYWNlIi4KCiAgV2hpbGUgZG9pbmcgdGhpcywgSSd2ZSBub3cgbWFkZSBDVVJMRV9GVFBfQUNDRVNTX0RFTklFRCBzZXBhcmF0ZSBmcm9tIHRoZQogIG5ldyBDVVJMRV9MT0dJTl9ERU5JRUQuIFRoZSBmaXJzdCBvbmUgaXMgbm93IGFjY2VzcyBkZW5pZWQgdG8gYSBmdW5jdGlvbiwKICBsaWtlIGNoYW5naW5nIGRpcmVjdG9yeSBvciByZXRyaWV2aW5nIGEgZmlsZSwgd2hpbGUgdGhlIHNlY29uZCBtZWFucyB0aGF0IHdlCiAgd2VyZSBkZW5pZWQgbG9naW4uCgogIFRoZSBDVlMgdGFnICdiZWZvcmVfZnRwX3N0YXRlbWFjaGluZScgd2FzIHNldCBqdXN0IGJlZm9yZSB0aGlzIHdlbnQgaW4sIGluCiAgY2FzZSBvZiBmdXR1cmUgbmVlZC4KCi0gR2lzbGUgbWFkZSB0aGUgRElDVCBjb2RlIHNlbmQgQ1JMRiBhbmQgbm90IGp1c3QgTEYgYXMgdGhlIHNwZWMgc2F5cyBzby4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDA1KQotIEdpc2xlIGZpeGVkIHByb2JsZW1zIHdoZW4gbGliY3VybCBydW5zIG91dCBvZiBtZW1vcnksIGFuZCB3b3JrZWQgb24gbWFraW5nCiAgc3VyZSB0aGUgcHJvcGVyIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgZm9yIHRob3NlIG9jY2F0aW9ucy4KCkRhbmllbCAoNyBGZWJydWFyeSAyMDA1KQotIE1hcnVrbyBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBpbmZsYXRlIGRlY29tcHJlc3NpbmcgZXhhY3RseSA2NEsKICBjb250ZW50cy4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA1KQotIEVyaWMgVmVyZ25hdWQgZm91bmQgYSB1c2Ugb2YgYW4gdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiB0aGUgZnRwIHdoZW4gZG9pbmcKICBQT1JUIG9uIGlwdjYtZW5hYmxlZCBob3N0cy4KCi0gRGF2aWQgQnlyb24gcG9pbnRlZCBvdXQgd2UgY291bGQgdXNlIEJVRlNJWkUgdG8gcmVhZCBkYXRhIChpbgogIGxpYi90cmFuc2Zlci5jKSBpbnN0ZWFkIG9mIHVzaW5nIEJVRlNJWkUgLTEuCgpWZXJzaW9uIDcuMTMuMCAoMSBGZWJydWFyeSAyMDA1KQoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTGFycyBOaWxzc29uJ3MgaHRtbHRpdGxlLmNjIGV4YW1wbGUKCkRhbmllbCAoMzAgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCB0aGUgRE8gb3BlcmF0aW9uCiAgZmFpbGVkIChhcyBpbiB0ZXN0IGNhc2UgMjA1KS4KCi0gRml4ZWQgYSB2YWxncmluZCB3YXJuaW5nIGZvciBmaWxlOi8vIG9wZXJhdGlvbnMuCgotIEZpeGVkIGEgdmFsZ3JpbmQgcmVwb3J0IGluIHRoZSB1cmwgZ2xvYmJpbmcgY29kZSBmb3IgdGhlIGN1cmwgY29tbWFuZCBsaW5lCiAgdG9vbC4KCi0gQnVnZml4ZWQgdGhlIHBhcnNlciB0aGF0IHNjYW5zIHRoZSB2YWxncmluZCByZXBvcnQgb3V0cHV0cyAoaW4gcnVudGVzdHMucGwpLgogIEkgbm90aWNlZCB0aGF0IGl0IHByZXZpb3VzbHkgZGlkbid0IGRldGVjdCBhbmQgcmVwb3J0IHRoZSAiQ29uZGl0aW9uYWwganVtcAogIG9yIG1vdmUgZGVwZW5kcyBvbiB1bmluaXRpYWxpc2VkIHZhbHVlKHMpIiBlcnJvci4gV2hlbiBJIGZpeGVkIHRoaXMsIEkKICBjYXVnaHQgYSBmZXcgY3VybCBidWdzIHdpdGggaXQuIEFuZCB0aGVuIEkgaGFkIHRvIHNwZW5kIHRpbWUgdG8gbWFrZSB0aGUKICB0ZXN0IHN1aXRlIElHTk9SRSB0aGVzZSBlcnJvcnMgd2hlbiBPcGVuU1NMIGlzIHVzZWQgc2luY2UgaXQgcHJvZHVjZSBtYXNzaXZlCiAgYW1vdW50cyBvZiB2YWxncmluZCB3YXJuaW5ncyAoYnV0IG9ubHkgb2YgdGhlICJDb25kaXRpb25hbC4uLiIga2luZCBpdAogIHNlZW1zKS4gU28sIGlmIGEgdGVzdCB0aGF0IHJlcXVpcmVzIFNTTCBpcyBydW4sIGl0IGlnbm9yZXMgdGhlCiAgIkNvbmRpdGlvbmFsLi4uIiBlcnJvcnMsIGFuZCB5b3UnbGwgZ2V0IGEgInZhbGdyaW5kIFBBUlRJQUwiIG91dHB1dCBpbnN0ZWFkCiAgb2YgInZhbGdyaW5kIE9LIi4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA1KQotIFVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UsIGFuZCBkb2luZyBhIHJlcXVzdGVkIGEgcmUtdXNlZCBjb25uZWN0aW9uIHRoYXQKICBnZXRzIGNsb3NlZCBqdXN0IGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgZmFpbGVkIGFuZCBkaWQgbm90IHJlLWlzc3VlCiAgYSByZXF1ZXN0IG9uIGEgZnJlc2ggcmVjb25uZWN0IGxpa2UgdGhlIGVhc3kgaW50ZXJmYWNlIGRpZC4gTm93IGl0IGRvZXMhCgotIERlZmluZSBDVVJMX01VTFRJRUFTWSB3aGVuIGJ1aWxkaW5nIGxpYmN1cmwgKGxpYi9lYXN5LmMgdG8gYmUgZXhhY3QpLCB0byB1c2UKICBteSBuZXcgY3VybF9lYXN5X3BlcmZvcm0oKSB0aGF0IHVzZXMgdGhlIG11bHRpIGludGVyZmFjZSB0byBydW4gdGhlCiAgcmVxdWVzdC4gSXQgaXMgYSBncmVhdCB0ZXN0YmVkIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBJIGJlbGlldmUgd2UKICBzaGFsbCBkbyBpdCB0aGlzIHdheSBmb3IgcmVhbCBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgaGF2ZSBhIHN1Y2Nlc3NvciB0bwogIGN1cmxfbXVsdGlfZmRzZXQoKS4gSSd2ZSB1c2VkIHRoaXMgYXBwcm9hY2ggdG8gZGV0ZWN0IGFuZCBmaXggc2V2ZXJhbCBvZiB0aGUKICByZWNlbnQgbXVsdGktaW50ZXJmYWNlcyBpc3N1ZXMuCgotIEFkanVzdGVkIHRoZSBLTk9XTl9CVUdTICMxNyBmaXggYSBiaXQgbW9yZSBzaW5jZSB0aGUgRlRQIGNvZGUgYWxzbyBkaWQgc29tZQogIGJhZCBhc3N1bXB0aW9ucy4KCi0gbXVsdGkgaW50ZXJmYWNlOiB3aGVuIGEgcmVxdWVzdCBpcyBkZW5pZWQgZHVlIHRvICJNYXhpbXVtIHJlZGlyZWN0cwogIGZvbGxvd2VkIiBsaWJjdXJsIGxlYWtlZCB0aGUgbGFzdCBMb2NhdGlvbjogVVJMLgoKLSBDb25uZWN0IGZhaWx1cmVzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3YXMgb2Z0ZW4gcmV0dXJuZWQgYXMgImNvbm5lY3QoKQogIHRpbWVkIG91dCIgZXZlbiB0aG91Z2ggdGhlIHJlYXNvbiB3YXMgZGlmZmVyZW50LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDUpCi0gS05PV05fQlVHUyAjMTcgZml4ZWQuIEEgRE5TIGNhY2hlIGVudHJ5IG1heSBub3QgcmVtYWluIGxvY2tlZCBiZXR3ZWVuIHR3bwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgaW52b2tlcy4gSXQgd2FzIHByZXZpb3VzbHkgdW5sb2NrZWQgYXQgZGlzY29ubmVjdCwgd2hpY2gKICBjb3VsZCBtZWFuIHRoYXQgaXQgcmVtYWluZWQgbG9ja2VkIGJldHdlZW4gbXVsdGlwbGUgdHJhbnNmZXJzLiBUaGUgRE5TIGNhY2hlCiAgbWF5IG5vdCBsaXZlIGFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gY2FjaGUgZG9lcywgYXMgdGhleSBhcmUgc2VwYXJhdGUuCgogIFRvIGRlYWwgd2l0aCB0aGUgbGFjayBvZiBETlMgKGhvc3QgYWRkcmVzcykgZGF0YSBhdmFpbGFiaWxpdHkgaW4gcmUtdXNlZAogIGNvbm5lY3Rpb25zLCBsaWJjdXJsIG5vdyBrZWVwcyBhIGNvcHkgb2YgdGhlIElQIGFkcmVzcyBhcyBhIHN0cmluZywgdG8gYmUKICBhYmxlIHRvIHNob3cgaXQgZXZlbiBvbiBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uCgogIFRoZSBwcm9ibGVtIGNvdWxkIGJlIG1hZGUgdG8gYXBwZWFyIHdpdGggdGhpcyBzdHVudDoKCiAgMS4gY3JlYXRlIGEgbXVsdGkgaGFuZGxlCiAgMi4gYWRkIGFuIGVhc3kgaGFuZGxlCiAgMy4gZmV0Y2ggYSBVUkwgdGhhdCBpcyBwZXJzaXN0ZW50IChsZWF2ZXMgdGhlIGNvbm5lY3Rpb24gYWxpdmUpCiAgNC4gcmVtb3ZlIHRoZSBlYXN5IGhhbmRsZSBmcm9tIHRoZSBtdWx0aQogIDUuIGtpbGwgdGhlIG11bHRpIGhhbmRsZQogIDYuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDcuIGFkZCB0aGUgc2FtZSBlYXN5IGhhbmRsZSB0byB0aGUgbmV3IG11bHRpIGhhbmRsZQogIDguIGZldGNoIGEgVVJMIGZyb20gdGhlIHNhbWUgc2VydmVyIGFzIGJlZm9yZSAocmUtdXNpbmcgdGhlIGNvbm5lY3Rpb24pCgotIFN0ZXBoZW4gTW9yZSBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfRlRQUE9SVCBhbmQgdGhlIC1QIG9wdGlvbiBkaWRuJ3Qgd29yawogIHdoZW4gYnVpbHQgaXB2Ni1lbmFibGVkLiBJJ3ZlIG5vdyBtYWRlIGEgZml4IGZvciBpdC4gV3JpdGluZyB0ZXN0IGNhc2VzIGZvcgogIGN1c3RvbSBwb3J0IGhvc3RzIHR1cm5lZCB0b28gdHJpY2t5IHNvIHVuZm9ydHVuYXRlbHkgdGhlcmUncyBub25lLgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDUpCi0gSWFuIEZvcmQgYXNrZWQgYWJvdXQgc3VwcG9ydCBmb3IgdGhlIEZUUCBjb21tYW5kIEFDQ1QsIGFuZCBJIGRpc2NvdmVyZWQgaXQKICBpcyBwcmVzZW50IGluIFJGQzk1OS4uLiBzbyBub3cgKGxpYiljdXJsIHN1cHBvcnRzIGl0IGFzIHdlbGwuIC0tZnRwLWFjY291bnQKICBhbmQgQ1VSTE9QVF9GVFBfQUNDT1VOVCBzZXQgdGhlIGFjY291bnQgc3RyaW5nLiAoVGhlIHNlcnZlciBtYXkgYXNrIGZvciBhbgogIGFjY291bnQgc3RyaW5nIGFmdGVyIFBBU1MgaGF2ZSBiZWVuIHNlbnQgYXdheS4gVGhlIGNsaWVudCByZXNwb25kcwogIHdpdGggIkFDQ1QgW2FjY291bnQgc3RyaW5nXSIuKSBBZGRlZCB0ZXN0IGNhc2UgMjI4IGFuZCAyMjkgdG8gdmVyaWZ5IHRoZQogIGZ1bmN0aW9uYWxpdHkuIFVwZGF0ZWQgdGhlIHRlc3QgRlRQIHNlcnZlciB0byBzdXBwb3J0IEFDQ1Qgc29tZXdoYXQuCgotIERhdmlkIFNoYXcgY29udHJpYnV0ZWQgYSBmYWlybHkgY29tcGxldGUgYW5kIGRldGFpbGVkIGF1dG9jb25mIHRlc3QgeW91IGNhbgogIHVzZSB0byBkZXRlY3QgbGliY3VybCBhbmQgc2V0dXAgdmFyaWFibGVzIGZvciB0aGUgcHJvdG9jb2xzIHRoZSBpbnN0YWxsZWQKICBsaWJjdXJsIHN1cHBvcnRzOiBkb2NzL2xpYmN1cmwvbGliY3VybC5tNAoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDUpCi0gTWFqb3IgRlRQIHRoaXJkIHBhcnR5IHRyYW5zZmVyIG92ZXJoYXVsLgoKICBUaGVzZSBmb3VyIG9wdGlvbnMgYXJlIG5vdyBvYnNvbGV0ZTogQ1VSTE9QVF9TT1VSQ0VfSE9TVCwKICBDVVJMT1BUX1NPVVJDRV9QQVRILCBDVVJMT1BUX1NPVVJDRV9QT1JUICh0aGlzIG9wdGlvbiBkaWRuJ3Qgd29yayBiZWZvcmUpCiAgYW5kIENVUkxPUFRfUEFTVl9IT1NULgoKICBUaGVzZSB0d28gb3B0aW9ucyBhcmUgYWRkZWQ6IENVUkxPUFRfU09VUkNFX1VSTCBhbmQgQ1VSTE9QVF9TT1VSQ0VfUVVPVEUuCgogIFRoZSB0YXJnZXQtc2lkZSBkaWRuJ3QgdXNlIHRoZSBwcm9wZXIgcGF0aCB3aXRoIFJFVFIsIGFuZCB0aHVzIHRoaXMgb25seQogIHdvcmtlZCBjb3JyZWN0bHkgaW4gdGhlIGxvZ2luIHBhdGggKGkuZSB3aXRob3V0IGRvaW5nIGFueSBDV0QpLiBUaGUgc291cmNlLQogIHNpZGUgc3RpbGwgdXNlcyBhIHdyb25nIHBhdGgsIGJ1dCB0aGUgZml4IGZvciB0aGlzIHdpbGwgbmVlZCB0byB3YWl0LiBWZXJpZnkKICB0aGUgZmxhdyBieSB1c2luZyBhIHNvdXJjZSBVUkwgd2l0aCBpbmNsdWRlZCAlWFgtY29kZXMuCgogIE1hZGUgQ1VSTE9QVF9GVFBQT1JUIGNvbnRyb2wgd2VhdGhlciB0aGUgdGFyZ2V0IG9wZXJhdGlvbiBzaG91bGQgdXNlIFBPUlQKICAob3Igbm90KS4gVGhlIG90aGVyIHNpZGUgdGh1cyB1c2VzIHBhc3NpdmUgKFBBU1YpIG1vZGUuCgogIFVwZGF0ZWQgdGhlIGZ0cDNyZHBhcnR5LmMgZXhhbXBsZSBzb3VyY2UgdG8gdXNlIHRoZSB1cGRhdGVkIG9wdGlvbnMuCgogIEFkZGVkIHN1cHBvcnQgZm9yIGEgc2Vjb25kIEZUUCBzZXJ2ZXIgaW4gdGhlIHRlc3Qgc3VpdGUuIE5hbWVkLi4uIGZ0cDIuCiAgQWRkZWQgdGVzdCBjYXNlcyAyMzAsIDIzMSBhbmQgMjMyIGFzIGEgZmV3IGZpcnN0IGJhc2ljIHRlc3RzIG9mIHZlcnkgc2ltcGxlCiAgM3JkIHBhcnR5IHRyYW5zZmVycy4KCiAgQ2hhbmdlZCB0aGUgZGVidWcgb3V0cHV0IHRvIGluY2x1ZGUgJ3RhcmdldCcgYW5kICdzb3VyY2UnIHdoZW4gYSAzcmQgcGFydHkKICBpcyBiZWluZyBtYWRlLCB0byBtYWtlIGl0IGNsZWFyZXIgd2hhdCBjb21tYW5kcy9yZXNwb25zZXMgY2FtZSBvbiB3aGF0CiAgY29ubmVjdGlvbi4KCiAgQWRkZWQgdGhyZWUgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtLTNwLXVybCwgLS0zcC11c2VyIGFuZCAtLTNwLXF1b3RlLgoKICBEb2N1bWVudGVkIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgdGhlIGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyByZWxhdGVkCiAgdG8gdGhpcmQgcGFydHkgdHJhbnNmZXJzLgoKICAoVGVtcG9yYXJpbHkpIGRpc2FibGVkIHRoZSBhYmlsaXR5IHRvIHJlLXVzZSBhbiBleGlzdGluZyBjb25uZWN0aW9uIGZvciB0aGUKICBzb3VyY2UgY29ubmVjdGlvbi4gVGhpcyBpcyBiZWNhdXNlIGl0IG5lZWRzIHRvIGZvcmNlIGEgbmV3IGluIGNhc2UgdGhlCiAgc291cmNlIGFuZCB0YXJnZXQgaXMgdGhlIHNhbWUgaG9zdCwgYW5kIHRoZSBob3N0IG5hbWUgY2hlY2sgaXMgdHJpY2tpZXIgbm93CiAgd2hlbiB0aGUgc291cmNlIGlzIGlkZW50aWZpZWQgd2l0aCBhIGZ1bGwgVVJMIGluc3RlYWQgb2YgYSBwbGFpbiBob3N0IG5hbWUKICBsaWtlIGJlZm9yZS4KCiAgVE9ETyAoc2hvcnQtdGVybSkgZm9yIDNyZCBwYXJ0eSB0cmFuc2ZlcnM6IHF1b3RlIHN1cHBvcnQuIFRoZSBvcHRpb25zIGFyZQogIHRoZXJlLCB3ZSBuZWVkIHRvIGFkZCB0ZXN0IGNhc2VzIHRvIHZlcmlmeSB0aGVpciBmdW5jdGlvbmFsaXR5LgoKICBUT0RPIChsb25nLXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBJUHY2IHN1cHBvcnQgKEVQUlQgYW5kIEVQU1YgZXRjKQogIGFuZCBTU0wvVFNMIHN1cHBvcnQuCgpEYW5pZWwgKDIwIEphbnVhcnkgMjAwNSkKLSBQaGlsaXBwZSBIYW1lYXUgZm91bmQgb3V0IHRoYXQgLVEgIitbY29tbWFuZF0iIGRpZG4ndCB3b3JrLCBhbHRob3VnaCBzb21lCiAgY29kZSB3YXMgd3JpdHRlbiBmb3IgaXQuIEkgZml4ZWQgYW5kIGFkZGVkIHRlc3QgY2FzZSAyMjcgdG8gdmVyaWZ5IGl0LgogIFRoZSBjdXJsLjEgbWFuIHBhZ2UgZGlkbid0IG1lbnRpb24gdGhlICcrJyBzbyBJIGFkZGVkIGl0LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDUpCi0gU3RlcGhhbiBCZXJnbWFubiBtYWRlIGxpYmN1cmwgcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQgaWYgYW4gRlRQIFVSTAogIGNvbnRhaW5zICUwYSBvciAlMGQgaW4gdGhlIHVzZXIsIHBhc3N3b3JkIG9yIENXRCBwYXJ0cy4gKEEgZnV0dXJlIGZpeCB3b3VsZAogIGluY2x1ZGUgZG9pbmcgaXQgZm9yICUwMCBhcyB3ZWxsIC0gc2VlIEtOT1dOX0JVR1MgZm9yIGRldGFpbHMuKSBUZXN0IGNhc2UKICAyMjUgYW5kIDIyNiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGlzCgotIFN0ZXBoYW4gQmVyZ21hbm4gcG9pbnRlZCBvdXQgdHdvIGZsYXdzIGluIGxpYmN1cmwgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGVkOgoKICAxKSB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzdGlsbCByZWFkIGFuZCB1c2VkIHRvIHNldCBIVFRQIHByb3h5CgogIDIpIHlvdSBjb3VsZG4ndCBkaXNhYmxlIGh0dHAgcHJveHkgd2l0aCBDVVJMT1BUX1BST1hZIChzaW5jZSB0aGUgb3B0aW9uIHdhcwogICAgIGRpc2FibGVkKS4gVGhpcyBpcyBpbXBvcnRhbnQgc2luY2UgYXBwcyBtYXkgd2FudCB0byBkaXNhYmxlIEhUVFAgcHJveHkKICAgICB3aXRob3V0IGFjdHVhbGx5IGtub3dpbmcgaWYgbGliY3VybCB3YXMgYnVpbHQgdG8gZGlzYWJsZSBIVFRQIG9yIG5vdC4KCiAgQmFzZWQgb24gU3RlcGhhbidzIHBhdGNoLCBib3RoIHRoZXNlIGlzc3VlcyBzaG91bGQgbm93IGJlIGZpeGVkLgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDUpCi0gQ29keSBKb25lcycgZW5oYW5jZWQgdmVyc2lvbiBvZiBTYW11ZWwgRO1heiBHYXJj7WEncyBNU1ZDIG1ha2VmaWxlIHBhdGNoIHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNSkKLSBBbGV4IGFrYSBXaW5kRWFnbGUgcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGRvaW5nICJjdXJsIC12IGRpY3Rpb25hcnkuY29tIiwgY3VybAogIGFzc3VtZWQgdGhpcyB1c2VkIHRoZSBESUNUIHByb3RvY29sLiBXaGlsZSBndWVzc2luZyBwcm90b2NvbHMgd2lsbCByZW1haW4KICBmdXp6eSwgSSd2ZSBub3cgbWFkZSBzdXJlIHRoYXQgdGhlIGhvc3QgbmFtZXMgbXVzdCBzdGFydCB3aXRoICJbcHJvdG9jb2xdLiIKICBmb3IgdGhlbSB0byBiZSBhIHZhbGlkIGd1ZXNzYWJsZSBuYW1lLiBJIGFsc28gcmVtb3ZlZCAiaHR0cHMiIGFzIGEgcHJlZml4CiAgdGhhdCBpbmRpY2F0ZXMgSFRUUFMsIHNpbmNlIHdlIGhhcmRseSBldmVyIHNlZSBhbnkgaG9zdCBuYW1lcyB1c2luZyB0aGF0LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDUpCi0gSW5zcGlyZWQgYnkgTWFydGlqbiBLb3N0ZXIncyBwYXRjaCBhbmQgZXhhbXBsZSBzb3VyY2UgYXQKICBodHRwOi8vd3d3LmdyZWVuaGlsbHMuY28udWsvbWFrL2dlbnRvby9jdXJsLWVpbnRyLWJ1Zy5jLCBJIG5vdyBtYWRlIHRoZQogIHNlbGVjdCgpIGFuZCBwb2xsKCkgY2FsbHMgcHJvcGVybHkgbG9vcCBpZiB0aGV5IHJldHVybiAtMSBhbmQgZXJybm8gaXMKICBFSU5UUi4gZ2xpYmMgZG9jcyBmb3IgdGhpcyBpcyBmb3VuZCBoZXJlOgogIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJjL21hbnVhbC9odG1sX25vZGUvSW50ZXJydXB0ZWQtUHJpbWl0aXZlcy5odG1sCgogIFRoaXMgbGFzdCBsaW5rIHNheXMgQlNEIGRvZXNuJ3QgaGF2ZSB0aGlzICJlZmZlY3QiLiBXaWxsIHRoZXJlIGJlIGEgcHJvYmxlbQogIGlmIHdlIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5PwoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDUpCi0gRGFuIFRvcm9wIGNsZWFuZWQgdXAgYSBmZXcgbm8gbG9uZ2VyIHVzZWQgdmFyaWFibGVzIGZyb20gRGF2aWQgUGhpbGxpcHMnCiAgc2VsZWN0KCkgb3ZlcmhhdWwgZml4LgoKLSBDeXJpbGwgT3N0ZXJ3YWxkZXIgcG9zdGVkIGEgZGV0YWlsZWQgYW5hbHlzaXMgYWJvdXQgYSBidWcgdGhhdCBvY2N1cnMgd2hlbgogIHVzaW5nIGEgY3VzdG9tIEhvc3Q6IGhlYWRlciBhbmQgY3VybCBmYWlscyB0byBzZW5kIGEgcmVxdWVzdCBvbiBhIHJlLXVzZWQKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYW5kIHRodXMgY3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmRzIGl0LiBJdAogIHRoZW4gc2VudCB0d28gSG9zdDogaGVhZGVycy4gQ3lyaWxsJ3MgYW5hbHlzaXMgd2FzIHBvc3RlZCBoZXJlOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDUtMDEvMDAyMi5odG1sCgotIEJydWNlIE1pdGNoZW5lciBpZGVudGlmaWVkIChidWcgcmVwb3J0ICMxMDk5NjQwKSB0aGUgbmV2ZXItZW5kaW5nIFNPQ0tTNQogIHByb2JsZW0gd2l0aCB0aGUgdmVyc2lvbiBieXRlIGFuZCB0aGUgY2hlY2sgZm9yIGJhZCB2ZXJzaW9ucy4gQnJ1Y2UgaGFzIGxvdHMKICBvZiBjbHVlcyBvbiB0aGlzLCBhbmQgYmFzZWQgb24gaGlzIHN1Z2dlc3Rpb24gSSd2ZSBub3cgcmVtb3ZlZCB0aGUgY2hlY2sgb2YKICB0aGF0IGJ5dGUgc2luY2UgaXQgc2VlbXMgdG8gYmUgYWJsZSB0byBjb250YWluIDEgb3IgNS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDA1KQotIFBhdmVsIE9yZWhvdiByZXBvcnRlZCBtZW1vcnkgcHJvYmxlbXMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGluIGJ1ZyByZXBvcnQKICAjMTA5ODg0My4gSW4gc2hvcnQsIGEgc2hhcmVkIEROUyBjYWNoZSB3YXMgc2V0dXAgZm9yIGEgbXVsdGkgaGFuZGxlIGFuZCB3aGVuCiAgdGhlIHNoYXJlZCBjYWNoZSB3YXMgZGVsZXRlZCBiZWZvcmUgdGhlIGluZGl2aWR1YWwgZWFzeSBoYW5kbGVzLCB0aGUgbGF0dGVyCiAgY2xlYW51cHMgY2F1c2VkIHJlYWQvd3JpdGVzIHRvIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKLSBIemhpanVuIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSBjb2RlLCB0aGF0IGxlYWtlZCB0aGUKICByZW1vdGUgY2VydGlmaWNhdGUgbmFtZSB3aGVuIGl0IGRpZG4ndCBtYXRjaCB0aGUgdXNlZCBob3N0IG5hbWUuCgpHaXNsZSAoOCBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTWFrZWZpbGUuV2F0Y29tIGZpbGVzIChzcmMvbGliKS4gVXBkYXRlZCBNYWtlZmlsZS5kaXN0LgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNSkKLSBJbXByb3ZlZCB0aGUgdGVzdCBzY3JpcHQncyB2YWxncmluZCBsb2cgcGFyc2VyIHRvIGFjdHVhbGx5IHdvcmshIEFsc28gYWRkZWQKICB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoZSBsb2cgc2Nhbm5lciBmb3Igc3BlY2lmaWMgdGVzdCBjYXNlcy4gVGVzdCBjYXNlCiAgNTA5IHJlc3VsdHMgaW4gbnVtZXJvdXMgcHJvYmxlbXMgYW5kIGxlYWtzIGluIE9wZW5TU0wgYW5kIGhhcyB0byBnZXQgaXQKICBkaXNhYmxlZC4KCkRhbmllbCAoNiBKYW51YXJ5IDIwMDUpCi0gRml4ZWQgYSBzaW5nbGUtYnl0ZSByZWFkIG91dCBvZiBib3VuZHMgaW4gdGVzdCBjYXNlIDM5IGluIHRoZSBjdXJsIHRvb2wgY29kZQogIChpLmUgbm90IGluIHRoZSBsaWJyYXJ5KS4KCi0gQnVnIHJlcG9ydCAjMTA5NzAxOSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIGRvaW5nIC1kICJkYXRhIiB3aXRoIC1HIGFuZAogIHNlbmRpbmcgaXQgdG8gdHdvIFVSTHMgd2l0aCB7fS4gQWRkZWQgdGVzdCAxOTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA1KQotIE1hcnR5IEt1aHJ0IGFkanVzdGVkIGEgVk1TIGJ1aWxkIHNjcmlwdCBzbGlnaHRseQoKLSBLYWkgU29tbWVyZmVsZCBhbmQgR2lzbGUgVmFuZW0gZml4ZWQgbGliY3VybCB0byBidWlsZCB3aXRoIElQdjYgc3VwcG9ydCBvbgogIFdpbjIwMDAuCgpEYW5pZWwgKDIgSmFudWFyeSAyMDA1KQotIEFsZXggTmVibGV0dCB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcyBzbGlnaHRseS4K