VGhpcyBpcyB0aGUgQlJMVFRZIGRyaXZlciBmb3IgVFNJIGJyYWlsbGUgZGlzcGxheXMsClZlcnNpb24gMi43NCBBcHJpbCAyMDA0CgpBdXRob3IgYW5kIG1haW50YWluZXI6CiAgICAgICAgU3TpcGhhbmUgRG95b24KRS1NYWlsOiBzLmRveW9uQHZpZGVvdHJvbi5jYQoKVGhpcyBkcml2ZXIgY29udGFpbnMgdGhlIGNvZGUgdG8gc3VwcG9ydCBtb3N0IG9mIFRlbGVzZW5zb3J5IFN5c3RlbXMnIGJyYWlsbGUKZGlzcGxheXMuIEl0IGlzIGEgcGFydCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIEJSTFRUWS4gVGhlIGluZm9ybWF0aW9uIGhlcmUKcGVydGFpbnMgb25seSB0byB0aGUgc3VwcG9ydCBvZiB0aGUgVFNJIGRpc3BsYXlzLiBZb3UgbXVzdCBhbHNvIHJlYWQgdGhlCmRvY3VtZW50YXRpb24gb2YgdGhlIG1haW4gbW9kdWxlIG9mIEJSTFRUWS4KClRoZXJlIGlzIG9ubHkgYSBoYW5kZnVsIG9mIEJSTFRUWSB1c2Vycy4gSWYgeW91IGFyZSB0cnlpbmcgb3V0IG15IGRyaXZlciwKcGxlYXNlIGxldCBtZSBrbm93ISBJIGFtIHdpbGxpbmcgdG8gaGVscCBhbmQgSSBhbSBvcGVuIHRvIHN1Z2dlc3Rpb25zLgoKU2VlIHRoZSBoZWFkZXJzIG9mIGJybC5jIGZvciBoaXN0b3J5IG5vdGVzLgoKU3VwcG9ydGVkIGJyYWlsbGUgZGlzcGxheXMKPT09PT09PT09PT09PT09PT09PT09PT09PT0KICBOYXZpZ2F0b3IgMjAgLyA0MCAvIDgwIChsYXRlc3QgZmlybXdhcmUgdmVyc2lvbiBvbmx5PykKICBQb3dlckJyYWlsbGUgNDAgLyA2NSAvIDgwCgpVbnN1cHBvcnRlZCBkaXNwbGF5czoKICBPbGRlciBmaXJtd2FyZSB2ZXJzaW9ucyBvZiB0aGUgbmF2aWdhdG9yIG1vZGVscyBtYXkgbm90IHdvcmsuCgpJIGhhdmUgdXNlZCBvbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlciBldmVyeSBkYXkgZm9yIG92ZXIgdHdvIHllYXJzIHdpdGggYQpOYXZpZ2F0b3IgNDAsIHNvIEkgY2FuIHNheSB0aGF0IEJSTFRUWSBhbmQgdGhpcyBkcml2ZXIgYXJlIHByZXR0eSBzdGFibGUuClNpbmNlIHZlcnNpb24gMi4wIG9mIHRoaXMgZHJpdmVyLCBJIGhhdmUgaW50ZWdyYXRlZCBzdXBwb3J0IGZvciBQQjgwCmRpc3BsYXlzLiBJIGhhdmUgdXNlZCBhIFBvd2VyQnJhaWxsZSA4MCBmb3IgbmVhcmx5IGEgeWVhciBub3csIGFuZCBhClBvd2VyQnJhaWxsZSA0MCBmb3IgYSBmZXcgbW9udGhzLiBJIGhhdmUgaGFkIHN1Y2Nlc3MgcmVwb3J0cyBmcm9tIGFib3V0IDEwCm90aGVyIHBlb3BsZSAobW9zdCBvZiB0aGVtIHVzZSBhIFBvd2VyQnJhaWxsZSA0MCkuIE5hdmlnYXRvciA0MCBoYXMgbm90IGJlZW4KdGVzdGVkIHNpbmNlIHZlcnNpb24gMi4xIG9mIHRoaXMgZHJpdmVyIChJIGNoYW5nZWQgbXkgTmF2aWdhdG9yIDQwIGZvciBhClBvd2VyQnJhaWxsZSA0MCkuIE5hdmlnYXRvciAyMCBhbmQgODAgc2hvdWxkIHdvcmsgYnV0IGhhcyBuZXZlciBiZWVuIHRlc3RlZC4KCkkgYW0gY3VycmVudGx5IHRyeWluZyB0byBkZWJ1ZyBzdXBwb3J0IGZvciB0d28gZW11bGF0b3JzIG9mIHRoZQpQb3dlckJyYWlsbGUgNDAuIAotIEJBVU0gZGlzcGxheXMgKFZhcmlvPyk6IFRoaXMgZGlzcGxheSBlbXVsYXRlcyBhIFBvd2VyQnJhaWxsZSA0MC4gSG93ZXZlciwKICAgIGl0IGNhbm5vdCBvcGVyYXRlIGF0IDE5MjAwYmF1ZCBhcyBQb3dlckJyYWlsbGUgbW9kZWxzIGNhbi4gVGhlIGRyaXZlcgogICAgbm93IGRldGVjdHMgdGhpcyBhbmQgZmFsbHMgYmFjayB0byA5NjAwYmF1ZC4gSSBkb24ndCBrbm93IG11Y2ggYWJvdXQKICAgIEJBVU0gZGlzcGxheSBtb2RlbHMuIEkgaGF2ZSBoYWQgdHdvIHN1Y2Nlc3MgcmVwb3J0cyBidXQgYWxzbyBvbmUgZmFpbHVyZQogICAgcmVwb3J0LgotIG1kdiBtYjQwOHM6IFRoaXMgZGlzcGxheSBhbHNvIGVtdWxhdGVzIGEgUG93ZXJCcmFpbGxlIDQwIGFuZCBpdCB0b28gaXMKICAgIGNhcGFibGUgb2Ygb3BlcmF0aW5nIG9ubHkgYXQgOTYwMGJhdWQuIEhvd2V2ZXIgaXQgYWxzbyBoYXMgYWRkaXRpb25hbAogICAgdGltaW5nIGNvbnN0cmFpbnRzLiBQbGVhc2UgdW5jb21tZW50IHRoZSBGT1JDRV9GVUxMX1NFTkRfREVMQVkgb3B0aW9uIAogICAgaW4gYnJhaWxsZS5oIGJlZm9yZSBjb21waWxpbmcuIFRoaXMgaGFzIGJlZW4gdGVzdGVkIGJ5IG9ubHkgb25lIHBlcnNvbi4KSG93ZXZlciB3aXRoIGJvdGggdGhlc2UgZW11bGF0b3JzLCB0aGVyZSBpcyBhbm90aGVyIGxpbWl0YXRpb246IHRoZSBrZXkKY29uZmlndXJhdGlvbnMgYXJlIG5vdCB0aGUgc2FtZSBhcyB0aGF0IG9mIGFueSBUU0kgbW9kZWwgYW5kIHNvbWUga2V5CmNvbWJpbmF0aW9ucyBmb3IgY2VydGFpbiBjb21tYW5kcyBtYXkgYmUgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8KcmVwcm9kdWNlLiBTcGVjaWZpYyBkcml2ZXJzIG5lZWQgdG8gYmUgd3JpdHRlbiBmb3IgdGhlc2UgbW9kZWxzLCBhbmQgZWZmb3J0cwphcmUgdW5kZXIgd2F5LiBVbnRpbCB0aGVuLCB0aGUgZHJpdmVyIHJlbWFpbnMgdXNlZnVsIGFuZCBhdCBsZWFzdCBwYXJ0bHkKZnVuY3Rpb25hbCBldmVuIHdpdGggdGhpcyBsaW1pdGF0aW9uLgoKRm9yIGltcGF0aWVudHMKPT09PT09PT09PT09PT0KCklmIHlvdSByZWFsbHkgd2FudCB0byBnbyBhaGVhZCByaWdodCBub3cgd2l0aG91dCBmdXJ0aGVyIHJlYWRpbmcsIHdlbGwgdGhlbgpnbyBmb3IgaXQ6IG5vIHNwZWNpYWwgY29uZmlndXJhdGlvbiBpcyByZWFsbHkgbmVjZXNzYXJ5LiBBbGwgeW91IGhhdmUgdG8ga25vdwppcyB0aGUga2V5IHRvIGJyaW5nIHVwIHRoZSBoZWxwIHNjcmVlbjoKICAtIEZvciBuYXZpZ2F0b3IgdXNlcnM6IHByZXNzIHRoZSAiY3Vyc29yIGxlZnQiIGFuZCAiY3Vyc29yIHJpZ2h0IiBrZXlzCiAgICB0b2dldGhlci4KICAtIEZvciBQQjQwIHVzZXJzOiBwcmVzcyB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGN1cnNvciByb3V0aW5nIGtleXMKICAgIHRvZ2V0aGVyIChjdXJzb3Igcm91dGluZyBrZXlzIDEgYW5kIDQwKS4KICAtIEZvciBQQjY1LzgwIHVzZXJzOiBQcmVzcyBjdXJzb3Igcm91dGluZyBrZXlzIDEgYW5kIDgwIHRvZ2V0aGVyLCBvciBwcmVzcwogICAgdGhlIHR3byBzbWFsbCBzcXVhcmUgYnV0dG9ucyBvbiB0b3AgYW5kIHRvIHRoZSBsZWZ0IG9mIHRoZSBkaXNwbGF5LgoKQ29ubmVjdGluZyB0aGUgZGlzcGxheQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5hdmlnYXRvciB1c2VycyBzaG91bGQgY29ubmVjdCB0aGVpciBkaXNwbGF5cyB0aGUgc2FtZSB3YXkgYXMgdGhleSBkbwpmb3IgdXNlIHVuZGVyIERPUy4gUG93ZXJCcmFpbGxlIHVzZXJzIGhvd2V2ZXIgbWlnaHQgcmVxdWlyZSBhZGRpdGlvbmFsCmluc3RydWN0aW9ucy4KClRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIHNlcmlhbCBpbnRlcmZhY2UgdG8gdGhlIFBvd2VyQnJhaWxsZTogeW91CmNhbm5vdCB1c2UgaXRzIHBhcmFsbGVsIHBvcnQuIFlvdSB3aWxsIHRoZXJlZm9yZSBuZWVkIGEgc2VyaWFsIGNhYmxlIHRvCmNvbm5lY3QgeW91ciBQb3dlckJyYWlsbGUgdG8geW91ciBjb21wdXRlci4gVGhlIGNhYmxlIG11c3QgYmUgInN0cmFpZ2h0CnRocm91Z2giIChub3QgIm51bGwtbW9kZW0iKS4gQ29ubmVjdCBvbmUgZW5kIHRvIG9uZSBvZiB0aGUgQ09NIHBvcnRzIG9mCnlvdXIgY29tcHV0ZXIgYW5kIHRoZSBvdGhlciB0byB0aGUgRENFIHBvcnQgKHRoZSA5LXBpbiBmZW1hbGUgY29ubmVjdG9yKQpvbiB0aGUgUG93ZXJCcmFpbGxlLgoKQ29uZmlndXJhdGlvbiBvZiB0aGUgZHJpdmVyCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGUgYnJhaWxsZS5oIGNvbnRhaW5zIHNvbWUgZmV3IHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gdGhpcyBkcml2ZXIKd2hpY2ggeW91IGNhbiBtb2RpZnksIGJ1dCB5b3UgcmVhbGx5IGRvbid0IGhhdmUgdG8uIE5vIGFkanVzdG1lbnRzIGFyZQpuZWNlc3Nhcnk6IGV2ZXJ5dGhpbmcgd2lsbCBiZSBhdXRvZGV0ZWN0ZWQgYnkgdGhlIGRyaXZlciB3aGVuIHlvdSBzdGFydCBCUkxUVFkuCgpQb3dlckJyYWlsbGUgZGlzcGxheXMgY2FuIG9wZXJhdGUgYXQgMTkyMDAgYmF1ZC4gSWYgeW91IGRvbid0IHRydXN0IHlvdXIgc2VyaWFsIApwb3J0IHRvIG9wZXJhdGUgYXQgdGhhdCBzcGVlZCAoZm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB1c2luZyBET1MpLCB5b3UgY2FuIApkaXNhYmxlIHRoaXMgZmVhdHVyZSB3aXRoIHRoZSBIaWdoQmF1ZD1ubyBkcml2ZXIgcGFyYW1ldGVyLCBhbmQgY3Jhd2wgYXQgOTYwMCAKYmF1ZC4KClRoZSBIaWdoQmF1ZD0gZHJpdmVyIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGRyaXZlciBpcyBwZXJtaXR0ZWQgCnRvIHVzZSAxOTIwMCBiYXVkLiBJdCBjYW4gYmUgc2V0IHRvIGVpdGhlciB5ZXMgKHRoZSBkZWZhdWx0KSBvciBuby4gTm90ZSB0aGF0IAppZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gbm8gYnV0IHRoZSBkaXNwbGF5IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSAKYXQgMTkyMDAgYmF1ZCB0aGVuIGl0IHdvbid0IGJlIGF1dG9kZXRlY3RlZC4KClRoZSBTZXRCYXVkPSBkcml2ZXIgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCBiYXVkIGlzIHRvIGJlIHVzZWQuIEl0IGNhbiBiZSBzZXQgCnRvIDQ4MDAsIDk2MDAsIG9yIDE5MjAwLiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgMTkyMDAgYmF1ZCBpZiB0aGUgZGlzcGxheSAKc3VwcG9ydHMgaXQgb3IgdG8gdXNlIHRoZSBiYXVkIGF0IHdoaWNoIHRoZSBkaXNwbGF5IHdhcyBhdXRvZGV0ZWN0ZWQgaWYgaXQgCmRvZXNuJ3QuCgpZb3UgdXN1YWxseSB3b24ndCBuZWVkIHRvIHNwZWNpZnkgYW55IG9mIHRoZXNlIGRyaXZlciBwYXJhbWV0ZXJzLiBBIGNhc2Ugd2hlcmUgCnlvdSB3b3VsZCwgdGhvdWdoLCBpcyBpZiB5b3UncmUgdXNpbmcgYSBQb3dlckJyYWlsbGUgb24gRE9TIGJlY2F1c2UgRE9TIApkb2Vzbid0IHN1cHBvcnQgaGlnaGVyIHRoYW4gOTYwMCBiYXVkLiBJbiB0aGlzIHNpdHVhdGlvbiwgeW91J2xsIHdhbnQgdG8gCnNwZWNpZnkgdGhlIEhpZ2hCYXVkPW5vIGRyaXZlciBwYXJhbWV0ZXIuIFlvdSdsbCBzdGlsbCBoYXZlIGEgcHJvYmxlbSwgdGhvdWdoLCAKaWYgdGhlIFBvd2VyQnJhaWxsZSBpcyBjdXJyZW50bHkgY29uZmlndXJlZCB0byB1c2UgMTkyMDAgYmF1ZC4gSWYgdGhpcyBpcyB0aGUgCmNhc2UsIGZpcnN0IGNvbm5lY3QgaXQgdG8gYSBzeXN0ZW0gdGhhdCBkb2VzIHN1cHBvcnQgMTkyMDAgYmF1ZCBhbmQgc3BlY2lmeSB0aGUgClNldEJhdWQ9OTYwMCBkcml2ZXIgcGFyYW1ldGVyLiBTbywgZm9yIGV4YW1wbGU6CgogICBvbiBMaW51eDogLUIgU2V0QmF1ZD05NjAwCiAgIG9uIERPUzogLUIgSGlnaEJhdWQ9bm8KCk5vdGUgdGhhdCBicmFpbGxlIGRyaXZlciBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIHZpYSB0aGUgLUIgCih1cHBlcmNhc2UpIGNvbW1hbmQgbGluZSBvcHRpb24gb3IgdmlhIHRoZSBicmFpbGxlLXBhcmFtZXRlcnMgYnJsdHR5LmNvbmYgCmRpcmVjdGl2ZS4gVGhlIGZvcm1hdCBpcyBuYW1lPXZhbHVlLiBTbywgZm9yIGV4YW1wbGU6CgogICBvbiB0aGUgY29tbWFuZCBsaW5lOiAtQiBIaWdoQmF1ZD1ubwogICBpbiBicmx0dHkuY29uZjogYnJhaWxsZS1wYXJhbWV0ZXJzIEhpZ2hCYXVkPW5vCgpJbml0aWFsaXphdGlvbiBhbmQgcmVzZXQKPT09PT09PT09PT09PT09PT09PT09PT09CgpXaGVuIEJSTFRUWSBpcyBzdGFydGVkLCBpdCB3aWxsIGNhbGwgYSBmdW5jdGlvbiB3aXRoaW4gdGhpcyBkcml2ZXIgdG8gZGV0ZWN0CmFuZCBpbml0aWFsaXplIGEgYnJhaWxsZSBkaXNwbGF5LiBJZiBub25lIGlzIGNvbm5lY3RlZCwgdGhlbiB0aGUgd2hvbGUKQlJMVFRZIHByb2Nlc3Mgd2lsbCBzbGVlcCB1bnRpbCBhIGJyYWlsbGUgZGlzcGxheSBpcyBjb25uZWN0ZWQgYW5kIHR1cm5lZCBvbi4KSW1tZWRpYXRseSwgaXQgd2lsbCBiZSBkZXRlY3RlZCwgaWRlbnRpZmllZCwgaW5pdGlhbGl6ZWQsIGFuZCB1cGRhdGVkIHdpdGgKYSB3ZWxjb21lIG1lc3NhZ2UsIGFuZCB0aGVuIHdpdGggc29tZSB0ZXh0IGZyb20gdGhlIHNjcmVlbi4gSXQgd2lsbCB0aGVuIGJlCnJlYWR5IGZvciB1c2UuCgpUaGlzIG1lYW5zIHRoYXQgeW91ciBicmFpbGxlIGRpc3BsYXkgbmVlZCBub3QgYmUgYWN0aXZlIHdoZW4geW91ciBtYWNoaW5lCmJvb3RzICh3aGVuIEJSTFRUWSBzdGFydHMgdXApLgoKRnVydGhlcm1vcmUsIHlvdSBtYXkgYWxzbyB0dXJuIG9mZiB5b3VyIGRpc3BsYXkgYXQgYW55IHRpbWUgd2hpbGUgQlJMVFRZIGlzCnJ1bm5pbmcsIHRha2UgaXQgYXdheSBmb3IgdGhlIGRheSB3aGlsZSB5b3VyIGNvbXB1dGVyIGlzIHN0aWxsIHJ1bm5pbmcsIGFuZApjb25uZWN0IGl0IGJhY2sgbGF0ZXIuIEFmdGVyIDIgb3IgMyBzZWNvbmRzLCBCUkxUVFkgd2lsbCByZWFsaXplIHRoYXQgdGhlCmRpc3BsYXkgaXMgb2ZmIG9yIGRpc2Nvbm5lY3RlZC4gSXQgd2lsbCB0aGVuIGdvIGJhY2sgdG8gd2FpdGluZyBmb3IgeW91IHRvCmNvbm5lY3QgaXQgYW5kIHR1cm4gaXQgb24sIGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgcmVpbml0aWFsaXplIGl0LgoKS2V5IGJpbmRpbmdzCj09PT09PT09PT09PQoKVGhlIG9ubGluZSBoZWxwIGRlc2NyaWJlcyB0aGUga2V5IGJpbmRpbmdzOiBmb3IgZWFjaCBhdmFpbGFibGUgZnVuY3Rpb24sIHRoZQpkaXNwbGF5IGtleSBvciBjb21iaW5hdGlvbiBvZiBrZXlzIHRoYXQgYWN0aXZhdGVzIGl0IGlzIGxpc3RlZC4gRm9yIGRldGFpbHMKb24gdGhlIGZ1bmN0aW9ucyB0aGVtc2VsdmVzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIG1haW4gbW9kdWxlIG9mCkJSTFRUWS4gSGVyZSBhZ2FpbiBpcyBob3cgdG8gYnJpbmcgdXAgdGhlIGhlbHAgc2NyZWVuOgogIC0gRm9yIG5hdmlnYXRvciB1c2VyczogcHJlc3MgdGhlICJjdXJzb3IgbGVmdCIgYW5kICJjdXJzb3IgcmlnaHQiIGtleXMKICAgIHRvZ2V0aGVyLgogIC0gRm9yIFBCNDAgdXNlcnM6IHByZXNzIHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgY3Vyc29yIHJvdXRpbmcga2V5cwogICAgdG9nZXRoZXIgKGN1cnNvciByb3V0aW5nIGtleXMgMSBhbmQgNDApLgogIC0gRm9yIFBCNjUvODAgdXNlcnM6IFByZXNzIGN1cnNvciByb3V0aW5nIGtleXMgMSBhbmQgODAgdG9nZXRoZXIsIG9yIHByZXNzCiAgICB0aGUgdHdvIHNtYWxsIHNxdWFyZSBidXR0b25zIG9uIHRvcCBhbmQgdG8gdGhlIGxlZnQgb2YgdGhlIGRpc3BsYXkuCgpJIGFtIG9wZW4gdG8gc3VnZ2VzdGlvbnMuIElmIHlvdSBkb24ndCBsaWtlIHRoZSBoZWxwIHNjcmVlbiwgaWYgeW91IGZpbmQgdGhlCm5hbWVzIG9mIHRoZSBrZXlzIGNvbmZ1c2luZywgaWYgeW91IGZpbmQgYW4gaW5jb25zaXN0ZW5jeSBvciBpZiB5b3UganVzdCBkb24ndApsaWtlIHRoZSBiaW5kaW5ncyBJIGhhdmUgY2hvc2VuLCBzZW5kIG1lIHlvdXIgY29tbWVudHMuIEl0IGlzIG5vdCB2ZXJ5IGhhcmQgdG8KY2hhbmdlIHdoaWNoIGtleXMgdHJpZ2dlciB3aGljaCBmdW5jdGlvbi4gSSBoYXZlIHRyeWVkIHRvIGNvbWUgdXAgd2l0aCB0aGUKYmVzdCBhcnJhbmdlbWVudCBidXQgeW91IG1pZ2h0IGhhdmUgYSBiZXR0ZXIgaWRlYS4KCklmIGFueSBvZiB0aGUga2V5cyBtZW50aW9uZWQgaW4gdGhlIGhlbHAgc2NyZWVuIGRvIG5vdCB3b3JrIG9yIGFyZSBzb21laG93CmluY29uc2lzdGFudCwgcGxlYXNlIGxldCBtZSBrbm93LgoKSW4gZ2VuZXJhbCB0aGUga2V5IGJpbmRpbmdzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHRoZSBkaXBsYXlzLCBOYXZpZ2F0b3IKYW5kIFBvd2VyQnJhaWxsZSBtb2RlbHMgYWxpa2UuIFRoZSBOYXZpZ2F0b3IgODAgYW5kIHRoZSBQb2V3ckJyYWlsbGUgNDAgc2ltcGx5CmhhdmUgc29tZSBhZGRlZCBrZXkgYmluZGluZ3MgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlaXIgcm91dGluZyBrZXlzLgpGdXJ0aGVybW9yZSwgY2VydGFpbiBrZXkgY29tYmluYXRpb25zIHRoYXQgY2FuIGNvbnZpbmllbnRseSBiZSBwcmVzc2VkIG9uCnRoZSBOYXZpZ2F0b3IgMjAvNDAgY2Fubm90IGJlIGVudGVyZWQgb24gYSBQb3dlckJyYWlsbGUgc2luY2UgaXQgZG9lcyBub3QKaGF2ZSB0aGUgY3Vyc29yIGxlZnQvcmlnaHQga2V5cyBhbmQgc2luY2UgaXQgdXNlcyByb2NrZXJzIGluc3RlYWQgb2YgYnV0dG9uCnBhaXJzLgoKQnV0IHlvdSBkbyBub3QgaGF2ZSB0byB3b3JyeSwgc2luY2UgdGhlIGhlbHAgc2NyZWVuIHRoYXQgaXMgcHJvdmlkZWQgd2lsbAp2YXJ5IGFjY29yZGluZyB0byB0aGUgbW9kZWwgb2YgdGhlIGRpc3BsYXkgdGhhdCBpcyBkZXRlY3RlZC4gSW4gZmFjdCwgdGhlCmZpcnN0IGxpbmUgb2YgdGhlIGhlbHAgc2NyZWVuIGlkZW50aWZpZXMgdGhlIGRpc3BsYXkgbW9kZWwgdGhhdCB3YXMgZGV0ZWN0ZWQuCklmIHRoaXMgaXMgaW5jb3JyZWN0LCB0aGVuIHlvdSdyZSBpbiB0cm91YmxlIGFuZCB5b3Ugc2hvdWxkIGNvbnRhY3QgbWUhCgpJJ3ZlIHRyeWVkIHRvIGtlZXAga2V5IGJpbmRpbmdzIHNpbWlsYXIgdG8gd2hhdCBpcyB1c2VkIHVuZGVyIERPUywgYnV0IHRoZXJlCmFyZSBzZXZlcmFsIGRpZmZlcmVuY2VzLiBCYXNpYyBtb3ZlbWVudCBvZiB0aGUgYnJhaWxsZSBkaXNwbGF5IGlzIHRoZQpzYW1lLCBidXQgc2V2ZXJhbCBiaW5kaW5ncyBoYXZlIGJlZW4gYWRkZWQgZm9yIG1vcmUgZWxhYm9yYXRlCmZ1bmN0aW9uYWxpdGllcy4gWW91IGFsc28gaGF2ZSB0aG9zZSBrZXlzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUga2V5Ym9hcmQKYXJyb3cga2V5cywgYnV0IEkgZGlkIG5vdCB0aGluayBpdCB3YXMgcmVhbGx5IHJlbGV2YW50IHRvIGhhdmUgYSBrZXkgYWN0IGFzIHRoZQpSRVRVUk4ga2V5LiBBbHNvIHRoZSBsaW5rL3VubGluayBidXR0b24gZG9lcyBub3QgZXhhY3RseSB3b3JrIHRoZSBzYW1lOiB0aGUKcmlnaHRtb3N0IG9mIHRoZSBmcm9udCBtaWRkbGUgYnV0dG9ucyBzaW1wbHkganVtcHMgdG8gdGhlIGN1cnNvcjsgaXQgaXMgbm90CmEgdG9nZ2xlLiBUaGUgbGVmdCBidXR0b24gdG9nZ2xlcyB0aGUgbGluay91bmxpbmsgKHdoZXRoZXIgb3Igbm90IHRoZSBicmFpbGxlCmRpc3BsYXkgc2hvdWxkIGZvbGxvdyB0aGUgY3Vyc29yIGlmIGl0IG1vdmVzKSwgYnV0IHVubGlua2luZyB0aGUgYnJhaWxsZQpkaXNwbGF5IGZyb20gdGhlIGN1cnNvciBjYW4gYmUgZG9uZSB3aXRob3V0IGJyaW5naW5nIHRoZSBicmFpbGxlIHdpbmRvdyBiYWNrCnRvIHRoZSBjdXJzb3IgYmVlZm9yZWhhbmQuCgpBbHNvIG5vdGUgdGhhdCB0aGVyZSBpcyBubyBmdW5jdGlvbiB0byBjb21iaW5lIGxpbmVzIGFuZCB3cmFwIHdvcmRzLi4uClRoZXJlIGlzIGhvd2V2ZXIgYSBmdW5jdGlvbiB0byBza2lwIGlkZW50aWNhbCBsaW5lcy4KCkZvciBOYXZpZ2F0b3IgMjAvNDAgdXNlcnM6CiAgICBZb3Ugd2lsbCBmaW5kIG9uZSBpbnRlcmVzdGluZyBhZGRpdGlvbiB0byBjdXJzb3Igcm91dGluZzogbm93IHlvdSBkbyBub3QKb25seSBoYXZlIGEgZnVuY3Rpb24gdGhhdCByb3V0ZXMgdGhlIGN1cnNvciB0byB0aGUgYmlnaW5uaW5nIG9mIHRoZSBkaXNwbGF5LAp5b3UgYWxzbyBoYXZlIGFub3RoZXIgZnVuY3Rpb24gdGhhdCBicmluZ3MgaXQgc29tZXdoZXJlIHRvd2FyZHMgdGhlIGVuZCBvZgp0aGUgZGlzcGxheS4gSSBmaW5kIGl0IHF1aXRlIHVzZWZ1bC4gQlJMVFRZIGFsc28gc3VwcG9ydHMgYSBjdXQtYW5kLXBhc3RlCmZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkIGZyb20gdGhlIGJyYWlsbGUgZGlzcGxheS4gVGhpcyBoYXMKZm9yY2VkIG1lIHRvIGFkZCBhIHZlcnkgc3RyYW5nZSB0d2lzdCB0byB0aGUgaW50ZXJmYWNlLiBVc2VycyBvZiBicmFpbGxlCmRpc3BsYXlzIHdpdGggY3Vyc29yIHJvdXRpbmcga2V5cyBub3JtYWxseSB3aWxsIG1hcmsgdGV4dCB0byBiZSBjdXQvY29waWVkCmJ5IHVzaW5nIHNvbWUgY29tYmluYXRpb24gb2YgdGhlc2Ugcm91dGluZyBrZXlzLiBTaW5jZSB3ZSBkb24ndCBoYXZlIHRoZW0sCkkndmUgYWRkZWQgYSBrZXkgYmluZGluZyB0aGF0IGJyaW5ncyB5b3UgaW50byBhIHNwZWNpYWwgbW9kZSBpbiB3aGljaCBhCiJ2aXJ0dWFsIiBjdXJzb3IgYXBwZWFycy4gQnkgbW92aW5nIHRoYXQgc3BlY2lhbCBjdXJzb3IgYXJvdW5kIHlvdSBjYW4gbWFyayB1cAp0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gY3V0LiBBcyBzb29uIGFzIHRoaXMgbWFyayBpcyBtYWRlLCB5b3UgYXJlIHJldHVybmVkCnRvIHRoZSBub3JtYWwgbW9kZSBvZiBvcGVyYXRpb24uIFlvdSBjYW4gdGhlbiBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhlCnRleHQgdG8gbWFyaywgcmVhY3RpdmF0ZSB0aGUgc3BlY2lhbCBjdXJzb3IgbW9kZSwgYW5kIG1hcmsgdGhlIGVuZCBvZiB0aGUKdGV4dC4gQXQgdGhhdCBwb2ludCB0aGUgdGV4dCB3aWxsIGJ5IGNvcGllZCBpbiBhIGJ1ZmZlciwgYW5kIHlvdSdsbCBiZSBhYmxlIHRvCnBhc3RlIGl0IHdoZXJldmVyIHlvdSB3YW50LiBOb3RlIHRoYXQgdGhlcmUgYWxzbyBhcmUgdHdvIHNob3J0Y3V0IGtleXMgdG8gZG8KY3V0ICYgcGFzdGU6IG9uZSBjb21iaW5hdGlvbiBzdGF0ZXMgdGhhdCB0aGUgYmxvY2sgb2YgdGV4dCB0byBiZSBjb3BpZWQgc3RhcnRzCmF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRpc3BsYXkgYW5kIHRoZSBvdGhlciBzdGF0ZXMgdGhhdCB0aGUgYmxvY2sgb2YgdGV4dAplbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGJyYWlsbGUgZGlzcGxheS4gSnVzdCBleHBlcmltZW50IHdpdGggaXQgaW4gYW4gZWRpdG9yLgp5b3UnbGwgc2VlIGl0J3MgZ3JlYXQhIE1haWwgbWUgaWYgeW91J3JlIG1peGVkIHVwLgoKRm9yIE5hdmlnYXRvciA4MCAvIFBvd2VyQnJhaWxlIHVzZXJzOgogICAgWW91IHdpbGwgZmluZCB0aGF0IHNldmVyYWwga2V5IGJpbmRpbmdzIHVzZSBjb21iaW5hdGlvbnMgb2YgY3Vyc29yCnJvdXRpbmcga2V5cy4gWW91IG1heSBub3QgYmUgdXNlZCB0byB0aGF0LiBJbiBwYXJ0aWN1bGFyIHRoZSBjdXQtYW5kLXBhc3RlCmZ1bmN0aW9ucywgdXNlZCB0byBtYXJrIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiBhIGJsb2NrIG9mIHRleHQgdG8gYmUKY29waWVkLCB1c2VzIGNvbWJpbmF0aW9ucyBvZiB0aHJlZSBrZXlzLiBPbmUgbW9yZSB0aGluZyBzbyB0aGF0IHlvdSBkb24ndCBnZXQKY29uZnVzZWQ6IGl0IGlzIGltcG9zc2libGUgdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgYmxvY2sgb2YgdGV4dCB0bwpjdXQvY29weSBpbiB0aGUgbGFzdCB0d28gY2VsbHMgb2YgdGhlIGJyYWlsbGUgZGlzcGxheSwgYW5kIGl0IGlzIGltcG9zc2libGUKdG8gbWFyayB0aGUgZW5kIG9mIGEgYmxvY2sgaW4gdGhlIGZpcnN0IHR3byBjZWxscy4gVGhlcmUgaXMgYSBmdW5jdGlvbiB0aGF0CmFsbG93cyBtb3ZlbWVudCBvZiB0aGUgYnJhaWxsZSB3aW5kb3cgYnkgb25seSBhIGZldyBjaGFyYWN0ZXJzIGxlZnQgb3IKcmlnaHQ6IHRoaXMgdXN1YWxseSBzdWZmaWNlcyB0byBnZXQgYXJvdW5kIHRoaXMgbGltaXRhdGlvbi4gQWdhaW4gaWYgeW91CmhhdmUgc3VnZ2VzdGlvbnMgYXMgdG8gd2hhdCB3b3VsZCBiZSBtb3N0IGNvbnZlbmllbnQsIGRvIG5vdCBoZXNpdGF0ZSB0bwpjb250YWN0IG1lLgoKQ3JlZGl0cwo9PT09PT09CgpUaGFua3MgdG8gSmFzb24gRmF5cmUgKEkgZG9uJ3QgaGF2ZSBoaXMgY3VycmVudCBhZGRyZXNzKSBmb3IgaGlzIHBhdGllbnQgaGVscAppbiBnZXR0aW5nIFBvd2VyQnJhaWxsZSA0MCBzdXBwb3J0IHdvcmtpbmc6IGhlIHRlc3RlZCBlYWNoIHZlcnNpb24gb2YgdGhlClBvd2VyQnJhaWxlIHN1cHBvcnQgdW50aWwgaXQgd29ya2VkLiBJIG15c2VsZiBkaWQgbm90IGhhdmUgYWNjZXNzIHRvIGEgUEI0MC4KV2Ugd29ya2VkIG92ZXIgRS1tYWlsLgoKVGhhbmtzIHRvIE5pY29sYXMgUGl0cmUgPG5pY29AZmx1eG5pYy5uZXQ+IGZvciBleHRlbnNpdmUgaGVscCB3cml0aW5nIHRoZSB2ZXJ5CmZpcnN0IHZlcnNpb24gb2YgdGhpcyBkcml2ZXIuIEluaXRpYWxseSwgdGhpcyBjb2RlIHdhcyBkZXJpdmVkIGZyb20gdGhhdCBvZgp0aGUgZHJpdmVyIGZvciB0aGUgQWx2YSBBQlQ0MC4gU3VycHJpc2luZyBob3cgbGl0dGxlIHRoZXkgaGF2ZSBpbiBjb21tb24gbm93LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpXZWxsIHRoYXQncyBhYm91dCBpdCEgVHJ5IGl0IG91dCBhbmQgZG8gbGV0IG1lIGtub3cgaG93IGl0IGdvZXMgUExFQVNFIQoKSG9wZSB0aGlzIGlzIG9mIHVzZSB0byB5b3UhCg==