Q3JlZGl0cyBmb3IgdGhlIFNpbXBsZSBMaW51eCBVU0IgRHJpdmVyOgoKVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCB0byB0aGlzIGNvZGUgKGluIGFscGhhYmV0aWNhbApvcmRlciBieSBsYXN0IG5hbWUpLiAgSSdtIHN1cmUgdGhpcyBsaXN0IHNob3VsZCBiZSBsb25nZXIsIGl0cwpkaWZmaWN1bHQgdG8gbWFpbnRhaW4sIGFkZCB5b3Vyc2VsZiB3aXRoIGEgcGF0Y2ggaWYgZGVzaXJlZC4KCiAgR2VvcmcgQWNoZXIgPGFjaGVyQGluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGU+CiAgRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICBSYW5keSBEdW5sYXAgPHJhbmR5LmR1bmxhcEBpbnRlbC5jb20+CiAgSm9oYW5uZXMgRXJkZmVsdCA8am9oYW5uZXNAZXJkZmVsdC5jb20+CiAgRGV0aSBGbGllZ2wgPGRldGlAZmxpZWdsLmRlPgogIGhhbSA8aGFtQHVuc3VhdmUuY29tPgogIEJyYWRsZXkgTSBLZXJ5YW4gPGtlcnlhbkBhbmRyZXcuY211LmVkdT4KICBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgogIFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KICBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQGNzLmFudS5lZHUuYXU+CiAgUGV0a28gTWFubG9sb3YgPHBldGthbkBkY2UuYmc+CiAgRGF2aWQgRS4gTmVsc29uIDxkbmVsc29uQGp1bXAubmV0PgogIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CiAgQmlsbCBSeWRlciA8YnJ5ZGVyQHNnaS5jb20+CiAgVGhvbWFzIFNhaWxlciA8c2FpbGVyQGlmZS5lZS5ldGh6LmNoPgogIEdyZWdvcnkgUC4gU21pdGggPGdyZWdAZWxlY3RyaWNyYWluLmNvbT4KICBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CiAgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgogIDxLYXp1a2kuWWFzdW1hdHN1QGZ1aml4ZXJveC5jby5qcD4KClNwZWNpYWwgdGhhbmtzIHRvOgoKICBJbmFreSBQZXJleiBHb256YWxleiA8aW5ha3lAcGVsb25jaG8uZmlzLnVjbS5lcz4gZm9yIHN0YXJ0aW5nIHRoZQogIExpbnV4IFVTQiBkcml2ZXIgZWZmb3J0IGFuZCB3cml0aW5nIG11Y2ggb2YgdGhlIGxhcmdlciB1dXNiZCBkcml2ZXIuCiAgTXVjaCBoYXMgYmVlbiBsZWFybmVkIGZyb20gdGhhdCBlZmZvcnQuCgogIFRoZSBOZXRCU0QgJiBGcmVlQlNEIFVTQiBkZXZlbG9wZXJzLiAgRm9yIGJlaW5nIG9uIHRoZSBMaW51eCBVU0IgbGlzdAogIGFuZCBvZmZlcmluZyBzdWdnZXN0aW9ucyBhbmQgc2hhcmluZyBpbXBsZW1lbnRhdGlvbiBleHBlcmllbmNlcy4KCkFkZGl0aW9uYWwgdGhhbmtzIHRvIHRoZSBmb2xsb3dpbmcgY29tcGFuaWVzIGFuZCBwZW9wbGUgZm9yIGRvbmF0aW9ucwpvZiBoYXJkd2FyZSwgc3VwcG9ydCwgdGltZSBhbmQgZGV2ZWxvcG1lbnQgKHRoaXMgaXMgZnJvbSB0aGUgb3JpZ2luYWwKVEhBTktTIGZpbGUgaW4gSW5ha3kncyBkcml2ZXIpOgoKICAgICAgICBUaGUgZm9sbG93aW5nIGNvcnBvcmF0aW9ucyBoYXZlIGhlbHBlZCB1cyBpbiB0aGUgZGV2ZWxvcG1lbnQKICAgICAgICBvZiBMaW51eCBVU0IgLyBVVVNCRDoKCgktIDNDb20gR21iSCBmb3IgZG9uYXRpbmcgYSBJU0ROIFBybyBUQSBhbmQgc3VwcG9ydGluZyBtZQoJICBpbiB0ZWNobmljYWwgcXVlc3Rpb25zIGFuZCB3aXRoIHRlc3QgZXF1aXBtZW50LiBJJ2QgbmV2ZXIgCgkgIGV4cGVjdCBzdWNoIGEgZ3JlYXQgaGVscC4KCiAgICAgICAgLSBVU0FSIFN5c3RlbXMgcHJvdmlkZWQgdXMgd2l0aCBvbmUgb2YgdGhlaXIgZXhjZWxsZW50IFVTQgogICAgICAgICAgRXZhbHVhdGlvbiBLaXRzLiBJdCBhbGxvd3MgdXMgdG8gdGVzdCB0aGUgTGludXgtVVNCIGRyaXZlcgogICAgICAgICAgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGF0ZXN0IFVTQiBzcGVjaWZpY2F0aW9uLiBVU0FSCiAgICAgICAgICBTeXN0ZW1zIHJlY29nbml6ZWQgdGhlIGltcG9ydGFuY2Ugb2YgYW4gdXAtdG8tZGF0ZSBvcGVuCiAgICAgICAgICBPcGVyYXRpbmcgU3lzdGVtIGFuZCBzdXBwb3J0cyB0aGlzIHByb2plY3Qgd2l0aAogICAgICAgICAgSGFyZHdhcmUuIFRoYW5rcyEuCgogICAgICAgIC0gVGhhbmtzIHRvIEludGVsIENvcnBvcmF0aW9uIGZvciB0aGVpciBwcmVjaW91cyBoZWxwLgoKICAgICAgICAtIFdlIHRlYW1lZCB1cCB3aXRoIENoZXJyeSB0byBtYWtlIExpbnV4IHRoZSBmaXJzdCBPUyB3aXRoCiAgICAgICAgICBidWlsdC1pbiBVU0Igc3VwcG9ydC4gQ2hlcnJ5IGlzIG9uZSBvZiB0aGUgYmlnZ2VzdCBrZXlib2FyZAogICAgICAgICAgbWFrZXJzIGluIHRoZSB3b3JsZC4KCiAgICAgICAgLSBDTUQgVGVjaG5vbG9neSwgSW5jLiBzcG9uc29yZWQgdXMga2luZGx5IGRvbmF0aW5nIGEgQ1NBLTY3MDAKICAgICAgICAgIFBDSS10by1VU0IgQ29udHJvbGxlciBCb2FyZCB0byB0ZXN0IHRoZSBPSENJIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAtIER1ZSB0byB0aGVpciBzdXBwb3J0IHRvIHVzLCBLZXl0cm9uaWMgY2FuIGJlIHN1cmUgdGhhdCB0aGV5CiAgICAgICAgICB3aWxsIHNlbGwga2V5Ym9hcmRzIHRvIHNvbWUgb2YgdGhlIDMgbWlsbGlvbiAoYXQgbGVhc3QpCiAgICAgICAgICBMaW51eCB1c2Vycy4KCiAgICAgICAgLSBNYW55IHRoYW5rcyB0byBpbmcgYvxybyBoIGRvcmFuIFtodHRwOi8vd3d3LmliaGRvcmFuLmNvbV0hCiAgICAgICAgICBJdCB3YXMgYWxtb3N0IGltcG9zc2libGUgdG8gZ2V0IGEgUEMgYmFja3BsYXRlIFVTQiBjb25uZWN0b3IKICAgICAgICAgIGZvciB0aGUgbW90aGVyYm9hcmQgaGVyZSBhdCBFdXJvcGUgKG1pbmUsIGhvbWUtbWFkZSwgd2FzCiAgICAgICAgICBxdWl0ZSBsb3VzeSA6KS4gTm93IEkga25vdyB3aGVyZSB0byBhY3F1aXJlIG5pY2UgVVNCIHN0dWZmIQoKICAgICAgICAtIEdlbml1cyBHZXJtYW55IGRvbmF0ZWQgYSBVU0IgbW91c2UgdG8gdGVzdCB0aGUgbW91c2UgYm9vdAogICAgICAgICAgcHJvdG9jb2wuIFRoZXkndmUgYWxzbyBkb25hdGVkIGEgRi0yMyBkaWdpdGFsIGpveXN0aWNrIGFuZCBhCiAgICAgICAgICBOZXRNb3VzZSBQcm8uIFRoYW5rcyEgCgogICAgICAgIC0gQVZNIEdtYkggQmVybGluIGlzIHN1cHBvcnRpbmcgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBMaW51eAogICAgICAgICAgVVNCIGRyaXZlciBmb3IgdGhlIEFWTSBJU0ROIENvbnRyb2xsZXIgQjEgVVNCLiBBVk0gaXMgYQogICAgICAgICAgbGVhZGluZyBtYW51ZmFjdHVyZXIgZm9yIGFjdGl2ZSBhbmQgcGFzc2l2ZSBJU0ROIENvbnRyb2xsZXJzCiAgICAgICAgICBhbmQgQ0FQSSAyLjAtYmFzZWQgc29mdHdhcmUuIFRoZSBhY3RpdmUgZGVzaWduIG9mIHRoZSBBVk0gQjEKICAgICAgICAgIGlzIG9wZW4gZm9yIGFsbCBPUyBwbGF0Zm9ybXMsIGluY2x1ZGluZyBMaW51eC4KCiAgICAgICAgLSBUaGFua3MgdG8gWS1FIERhdGEsIEluYy4gZm9yIGRvbmF0aW5nIHRoZWlyIEZsYXNoQnVzdGVyLVUKICAgICAgICAgIFVTQiBGbG9wcHkgRGlzayBEcml2ZSwgc28gd2UgY291bGQgdGVzdCB0aGUgYnVsayB0cmFuc2ZlcgogICAgICAgICAgY29kZS4KCiAgICAgICAgLSBNYW55IHRoYW5rcyB0byBMb2dpdGVjaCBmb3IgY29udHJpYnV0aW5nIGEgdGhyZWUgYXhpcyBVU0IKICAgICAgICAgIG1vdXNlLiAKCiAgICAgICAgICBMb2dpdGVjaCBkZXNpZ25zLCBtYW51ZmFjdHVyZXMgYW5kIG1hcmtldHMKICAgICAgICAgIEh1bWFuIEludGVyZmFjZSBEZXZpY2VzLCBoYXZpbmcgYSBsb25nIGhpc3RvcnkgYW5kCiAgICAgICAgICBleHBlcmllbmNlIGluIG1ha2luZyBkZXZpY2VzIHN1Y2ggYXMga2V5Ym9hcmRzLCBtaWNlLAogICAgICAgICAgdHJhY2tiYWxscywgY2FtZXJhcywgbG91ZHNwZWFrZXJzIGFuZCBjb250cm9sIGRldmljZXMgZm9yCiAgICAgICAgICBnYW1pbmcgYW5kIHByb2Zlc3Npb25hbCB1c2UuCgogICAgICAgICAgQmVpbmcgYSByZWNvZ25pemVkIHZlbmRvciBhbmQgc2VsbGVyIGZvciBhbGwgdGhlc2UgZGV2aWNlcywKICAgICAgICAgIHRoZXkgaGF2ZSBkb25hdGVkIFVTQiBtaWNlLCBhIGpveXN0aWNrIGFuZCBhIHNjYW5uZXIsIGFzIGEKICAgICAgICAgIHdheSB0byBhY2tub3dsZWRnZSB0aGUgaW1wb3J0YW5jZSBvZiBMaW51eCBhbmQgdG8gYWxsb3cKICAgICAgICAgIExvZ2l0ZWNoIGN1c3RvbWVycyB0byBlbmpveSBzdXBwb3J0IGluIHRoZWlyIGZhdm9yaXRlCiAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtcyBhbmQgYWxsIExpbnV4IHVzZXJzIHRvIHVzZSBMb2dpdGVjaCBhbmQKICAgICAgICAgIG90aGVyIFVTQiBoYXJkd2FyZS4KCiAgICAgICAgICBMb2dpdGVjaCBpcyBvZmZpY2lhbCBzcG9uc29yIG9mIHRoZSBMaW51eCBDb25mZXJlbmNlIG9uCiAgICAgICAgICBGZWIuIDExdGggMTk5OSBpbiBWaWVubmEsIHdoZXJlIHdlJ2xsIHdpbGwgcHJlc2VudCB0aGUKICAgICAgICAgIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExpbnV4IFVTQiBlZmZvcnQuCgogICAgICAgIC0gQ0FUQyBoYXMgcHJvdmlkZWQgbWVhbnMgdG8gdW5jb3ZlciBkYXJrIGNvcm5lcnMgb2YgdGhlIFVIQ0kKICAgICAgICAgIGlubmVyIHdvcmtpbmdzIHdpdGggYSBVU0IgSW5zcGVjdG9yLgoKICAgICAgICAtIFRoYW5rcyB0byBFbnRyZWdhIGZvciBwcm92aWRpbmcgUENJIHRvIFVTQiBjYXJkcywgaHVicyBhbmQKICAgICAgICAgIGNvbnZlcnRlciBwcm9kdWN0cyBmb3IgZGV2ZWxvcG1lbnQuIAoKCS0gVGhhbmtzIHRvIENvbm5lY3RUZWNoIGZvciBwcm92aWRpbmcgYSBXaGl0ZUhFQVQgdXNiIHRvCgkgIHNlcmlhbCBjb252ZXJ0ZXIsIGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRldmljZSB0bwoJICBhbGxvdyBhIGRyaXZlciB0byBiZSB3cml0dGVuLgoKCS0gVGhhbmtzIHRvIEFETXRlayBmb3IgcHJvdmlkaW5nIFBlZ2FzdXMgYW5kIFBlZ2FzdXMgSUkKCSAgZXZhbHVhdGlvbiBib2FyZHMsIHNwZWNzIGFuZCB2YWx1YWJsZSBhZHZpY2VzIGR1cmluZwoJICB0aGUgZHJpdmVyIGRldmVsb3BtZW50LgoJCiAgICAgICAgQW5kIHRoYW5rcyBnbyB0byAoaGV5ISBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyIDopCgogICAgICAgIC0gT3JlbiBUaXJvc2ggPG9yZW50aUBoaXNob21lLm5ldD4sIGZvciBzdGFuZGluZyBzbyBwYXRpZW50bHkKICAgICAgICAgIGFsbCBteSBkb3VidHMnYm91dCBVU0IgYW5kIGdpdmluZyBsb3RzIG9mIGNvb2wgaWRlYXMuCgogICAgICAgIC0gSm9jaGVuIEthcnJlciA8a2FycmVyQHdwZmQyNS5waHlzaWsudW5pLXd1ZXJ6YnVyZy5kZT4sIGZvcgogICAgICAgICAgcG9pbnRpbmcgb3V0IG1vcnRhbCBidWdzIGFuZCBnaXZpbmcgYWR2aWNlLgoKICAgICAgICAtIEVkbXVuZCBIdW1lbWJlcmdlciA8ZWRAYXRuZXQuYXQ+LCBmb3IgaXQncyBncmVhdCB3b3JrIG9uCiAgICAgICAgICBwdWJsaWMgcmVsYXRpb25zaGlwcyBhbmQgZ2VuZXJhbCBtYW5hZ2VtZW50IHN0dWZmIGZvciB0aGUKICAgICAgICAgIExpbnV4LVVTQiBlZmZvcnQuCgogICAgICAgIC0gQWxiZXJ0byBNZW5lZ2F6emkgPGZsYXNoQGZsYXNoLmlvbC5pdD4gaXMgc3RhcnRpbmcgdGhlCiAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciB0aGUgVVVTQkQuIEdvIGZvciBpdCEKCiAgICAgICAgLSBSaWMgS2xhcmVuIDxpYV9yaWNAY3MudXR3ZW50ZS5ubD4gZm9yIGRvaW5nIG5pY2UKICAgICAgICAgIGludHJvZHVjdG9yeSBkb2N1bWVudHMgKGNvbXBldGluZyB3aXRoIEFsYmVydG8ncyA6KS4KCiAgICAgICAgLSBDaHJpc3RpYW4gR3JvZXNzbGVyIDxjcGdAYWxhZGRpbi5kZT4sIGZvciBpdCdzIGhlbHAgb24gdGhvc2UKICAgICAgICAgIGl0Y2h5IGJpdHMgLi4uIDopCgogICAgICAgIC0gUGF1bCBNYWNLZXJyYXMgZm9yIHBvbGlzaGluZyBPSENJIGFuZCBwdXNoaW5nIG1lIGhhcmRlciBmb3IKICAgICAgICAgIHRoZSBpTWFjIHN1cHBvcnQsIGdpdmluZyBpbXByb3ZlbWVudHMgYW5kIGVuaGFuY2VtZW50cy4KCiAgICAgICAgLSBGZXJuYW5kbyBIZXJyZXJhIDxmaGVycmVyYUBldXJpZWxlYy5ldHNpdC51cG0uZXM+IGhhcyB0YWtlbgogICAgICAgICAgY2hhcmdlIG9mIGNvbXBvc2luZywgbWFpbnRhaW5pbmcgYW5kIGZlZWRpbmcgdGhlCiAgICAgICAgICBsb25nLWF3YWl0ZWQsIHVuaXF1ZSBhbmQgbWFydmVsb3VzIFVVU0JEIEZBUSEgVGFkYWFhYSEhIQoKICAgICAgICAtIFJhc2NhIEdtZWxjaCA8dGhyb25AZ214LmRlPiBoYXMgcmV2aXZlZCB0aGUgcmF3IGRyaXZlciBhbmQKICAgICAgICAgIHBvaW50ZWQgYnVncywgYXMgd2VsbCBhcyBzdGFydGVkIHRoZSB1dXNiZC11dGlscyBwYWNrYWdlLgoKICAgICAgICAtIFBldGVyIERldHRvcmkgPGRldHRvcmlAb3p5LmRlYy5jb20+IGlzIHVuY292ZXJpbmcgYnVncyBsaWtlCiAgICAgICAgICBjcmF6eSwgYXMgd2VsbCBhcyBtYWtpbmcgY29vbCBzdWdnZXN0aW9ucywgZ3JlYXQgOikKCiAgICAgICAgLSBBbGwgdGhlIEZyZWUgU29mdHdhcmUgYW5kIExpbnV4IGNvbW11bml0eSwgdGhlIEZTRiAmIHRoZSBHTlUKICAgICAgICAgIHByb2plY3QsIHRoZSBNSVQgWCBjb25zb3J0aXVtLCB0aGUgVGVYIHBlb3BsZSAuLi4gZXZlcnlvbmUhCiAgICAgICAgICBZb3Uga25vdyB3aG8geW91IGFyZSEKCiAgICAgICAgLSBCaWcgdGhhbmtzIHRvIFJpY2hhcmQgU3RhbGxtYW4gZm9yIGNyZWF0aW5nIEVtYWNzIQoKICAgICAgICAtIFRoZSBwZW9wbGUgYXQgdGhlIGxpbnV4LXVzYiBtYWlsaW5nIGxpc3QsIGZvciByZWFkaW5nIHNvCiAgICAgICAgICBtYW55IG1lc3NhZ2VzIDopIE9rLCBubyBtb3JlIGtpZGRpbmc7IGZvciBhbGwgeW91ciBhZHZpc2VzIQoKICAgICAgICAtIEFsbCB0aGUgcGVvcGxlIGF0IHRoZSBVU0IgSW1wbGVtZW50b3JzIEZvcnVtIGZvciB0aGVpcgogICAgICAgICAgaGVscCBhbmQgYXNzaXN0YW5jZS4KCiAgICAgICAgLSBOYXRoYW4gTXllcnMgPG5jbUBjYW50cmlwLm9yZz4sIGZvciBoaXMgYWR2aWNlISAoaG9wZSB5b3UKICAgICAgICAgIGxpa2VkIENpYmVsZXMnIHBhcnR5KS4KCiAgICAgICAgLSBMaW51cyBUb3J2YWxkcywgZm9yIHN0YXJ0aW5nLCBkZXZlbG9waW5nIGFuZCBtYW5hZ2luZyBMaW51eC4KCiAgICAgICAgLSBNaWtlIFNtaXRoLCBDcmFpZyBLZWl0aGxleSwgVGhpZXJyeSBHaXJvbiBhbmQgSmFuZXQgU2NoYW5rCiAgICAgICAgICBmb3IgY29udmluY2luZyBtZSBVU0IgU3RhbmRhcmQgaHVicyBhcmUgbm90IHRoYXQgc3RhbmRhcmQKICAgICAgICAgIGFuZCB0aGF0J3MgZ29vZCB0byBhbGxvdyBmb3IgdmVuZG9yIHNwZWNpZmljIHF1aXJrcyBvbiB0aGUKICAgICAgICAgIHN0YW5kYXJkIGh1YiBkcml2ZXIuCg==