CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFQQUNIRSBUVVNDQU5ZIFNDQSBTVUJDT01QT05FTlRTOgoKQXBhY2hlIFR1c2NhbnkgU0NBIGZvciBKYXZhIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aApzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlc2Ugc3ViY29tcG9uZW50cwppcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSB0dXNjYW55LWltcGxlbWVudGF0aW9uLXNjcmlwdCBqYXIgdGVtcG9yYXJpbHkgaW5jbHVkZXMgb25lIGZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBCU0QgbGljZW5zZToKCiBDb3B5cmlnaHQgKGMpIDIwMDYsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAKICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogCiAgLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgCiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIAogICAgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCAKIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgCiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSAKIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgCiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgCiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIAogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgCiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIAogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggCiBEQU1BR0UuIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSB0dXNjYW55LWFzc2VtYmx5LXhzZCBqYXIgaW5jbHVkZXMgWFNEIGZpbGVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgU0NBIENvbGxhYm9yYXRpb24gbGljZW5zZToKCihjKSBDb3B5cmlnaHQgU0NBIENvbGxhYm9yYXRpb24gMjAwNiwgMjAwNwoKTGljZW5zZSBmb3IgdGhlIFNlcnZpY2UgQ29tcG9uZW50IEFyY2hpdGVjdHVyZSBKYXZhRG9jLCBJbnRlcmZhY2UgCkRlZmluaXRpb24gZmlsZXMgYW5kIFhTRCBmaWxlcy4KClRoZSBTZXJ2aWNlIENvbXBvbmVudCBBcmNoaXRlY3R1cmUgSmF2YURvYywgSW50ZXJmYWNlIERlZmluaXRpb24gZmlsZXMsIAphbmQgWFNEIGZpbGVzIGFyZSBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIApmb2xsb3dpbmcgbGljZW5zZS4gQnkgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgYWdyZWUgdGhhdCAKeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCAKY29uZGl0aW9uczoKClBlcm1pc3Npb24gdG8gY29weSwgZGlzcGxheSwgbWFrZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBhbmQgZGlzdHJpYnV0ZSAKdGhlIFNlcnZpY2UgQ29tcG9uZW50IEFyY2hpdGVjdHVyZSBKYXZhRG9jLCBJbnRlcmZhY2UgRGVmaW5pdGlvbiBGaWxlcyAKYW5kIFhTRCBmaWxlcyAodGhlICJBcnRpZmFjdHMiKSBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgCmhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcyAKb2YgdGhlIEFydGlmYWN0cywgb3IgcG9ydGlvbnMgdGhlcmVvZiwgdGhhdCB5b3UgbWFrZTogCgoxLiBBIGxpbmsgb3IgVVJMIHRvIHRoZSBBcnRpZmFjdHMgYXQgdGhpcyBsb2NhdGlvbjoKaHR0cDovL3d3dy5vc29hLm9yZy9kaXNwbGF5L01haW4vU2VydmljZStDb21wb25lbnQrQXJjaGl0ZWN0dXJlK1NwZWNpZmljYXRpb25zIAoKMi4gVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIGNvcHlyaWdodCBub3RpY2UgYXMgc2hvd24gaW4gdGhlIEFydGlmYWN0cy4KClRIRSBBUlRJRkFDVFMgQVJFIFBST1ZJREVEICJBUyBJUywiIEFORCBUSEUgQVVUSE9SUyBNQUtFIE5PIApSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFIApBUlRJRkFDVFMgQU5EIFRIRSBJTVBMRU1FTlRBVElPTiBPRiBUSEVJUiBDT05URU5UUywgSU5DTFVESU5HLCBCVVQgTk9UIApMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIApQVVJQT1NFLCBOT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgCgpUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCAKSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgT1IgUkVMQVRJTkcgVE8gQU5ZIApVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBBUlRJRkFDVFMuCgpUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCmluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgU2VydmljZSBDb21wb25lbnQgCkFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uIG9yIGl0cyBjb250ZW50cyB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIApwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhlIFNlcnZpY2UgQ29tcG9uZW50IApBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiBhbmQgdGhlIEphdmFEb2MsIEludGVyZmFjZSBEZWZpbml0aW9uIEZpbGVzIAphbmQgWFNEIEZpbGVzIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIHRoZSBBdXRob3JzLgoKTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCgpSZXZpc2lvbiBsZXZlbCAxLjEsIGxhc3QgdXBkYXRlZCBvbiAyMDA3LzExLzE5Cgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIHR1c2NhbnktYXNzZW1ibHkteHNkIGphciBpbmNsdWRlcyBmaWxlcyB1bmRlciB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZToKCkNvcHlyaWdodCAoYykgMjAwNCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCAKRXVyb3BlYW4gUmVzZWFyY2ggQ29uc29ydGl1bSBmb3IgSW5mb3JtYXRpY3MgYW5kIE1hdGhlbWF0aWNzLCBLZWlvIFVuaXZlcnNpdHkpLiAKQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MocikgU29mdHdhcmUgTGljZW5zZSBbMV0gCmluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIAp3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCgogICAgWzFdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEKClczQ64gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFCmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEKClRoaXMgd29yayAoYW5kIGluY2x1ZGVkIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uIHN1Y2ggYXMgUkVBRE1Fcywgb3Igb3RoZXIgcmVsYXRlZCBpdGVtcykgCmlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UuIEJ5IG9idGFpbmluZywgCnVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgCmFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMuCgpQZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24sIHdpdGggb3IgCndpdGhvdXQgbW9kaWZpY2F0aW9uLCBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIAp0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgCnRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zOgoKICAgMS4gVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZSByZWRpc3RyaWJ1dGVkIG9yIAogICAgICBkZXJpdmF0aXZlIHdvcmsuCiAgIDIuIEFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gCiAgICAgIElmIG5vbmUgZXhpc3QsIHRoZSBXM0MgU29mdHdhcmUgU2hvcnQgTm90aWNlIHNob3VsZCBiZSBpbmNsdWRlZCAoaHlwZXJ0ZXh0IGlzIHByZWZlcnJlZCwKICAgICAgdGV4dCBpcyBwZXJtaXR0ZWQpIHdpdGhpbiB0aGUgYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGUuCiAgIDMuIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlIGNoYW5nZXMgd2VyZSAKICAgICAgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKQoKVEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgQ09QWVJJR0hUIEhPTERFUlMgTUFLRSBOTyAKUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyAKT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiAKRE9DVU1FTlRBVElPTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiAKUklHSFRTLgoKQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUiBDT05TRVFVRU5USUFMIApEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCgpUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IApwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCAKaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgCmhvbGRlcnMuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIHR1c2NhbnktaG9zdC13ZWJhcHAgYW5kIHR1c2Nhbnktc2NhLWFwaSBqYXJzIGluY2x1ZGUgZmlsZXMgdW5kZXIgdGhlIGZvbGxvd2luZwpjb3B5cmlnaHRzIGFuZCBsaWNlbnNlOgoKQ29weXJpZ2h0IE5vdGljZXMKCihDKSBDb3B5cmlnaHQgQkVBIFN5c3RlbXMsIEluYy4sIENhcGUgQ2xlYXIgU29mdHdhcmUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycCwgSW50ZXJmYWNlMjEsIElPTkEgVGVjaG5vbG9naWVzLApPcmFjbGUsIFByaW1ldG9uIFRlY2hub2xvZ2llcywgUHJvZ3Jlc3MgU29mdHdhcmUsIFJlZCBIYXQsIFJvZ3VlIFdhdmUgU29mdHdhcmUsIFNBUCBBRy4sIFNpZW1lbnMgQUcuLCBTb2Z0d2FyZSBBRy4sIFN5YmFzZQpJbmMuLCBUSUJDTyBTb2Z0d2FyZSBJbmMuLCAyMDA1LCAyMDA3LiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKKEMpIENvcHlyaWdodCBCRUEgU3lzdGVtcywgSW5jLiwgQ2FwZSBDbGVhciBTb2Z0d2FyZSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLCBJbnRlcmZhY2UyMSwgSU9OQQpUZWNobm9sb2dpZXMsIE9yYWNsZSwgUHJpbWV0b24gVGVjaG5vbG9naWVzLCBQcm9ncmVzcyBTb2Z0d2FyZSwgUmVkIEhhdCwgUm9ndWUgV2F2ZSBTb2Z0d2FyZSwgU0FQIEFHLiwgU2llbWVucwpBRy4sIFNvZnR3YXJlIEFHLiwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgU3liYXNlIEluYy4sIFRJQkNPIFNvZnR3YXJlIEluYy4sIDIwMDUsIDIwMDguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpMaWNlbnNlCgpQZXJtaXNzaW9uIHRvIGNvcHksIGRpc3BsYXkgYW5kIGRpc3RyaWJ1dGUgdGhlIFNlcnZpY2UgQ29tcG9uZW50IEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uIGFuZC9vcgpwb3J0aW9ucyB0aGVyZW9mLCB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAp0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcyBvZiB0aGUgU2VydmljZSBDb21wb25lbnQgQXJjaGl0ZWN0dXJlIFNwZWNpZmljYXRpb24sIG9yCnBvcnRpb25zIHRoZXJlb2YsIHRoYXQgeW91IG1ha2U6CgoxLiBBIGxpbmsgb3IgVVJMIHRvIHRoZSBTZXJ2aWNlIENvbXBvbmVudCBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiBhdCB0aGlzIGxvY2F0aW9uOgq3IGh0dHA6Ly93d3cub3NvYS5vcmcvZGlzcGxheS9NYWluL1NlcnZpY2UrQ29tcG9uZW50K0FyY2hpdGVjdHVyZStTcGVjaWZpY2F0aW9ucwoKMi4gVGhlIGZ1bGwgdGV4dCBvZiB0aGUgY29weXJpZ2h0IG5vdGljZSBhcyBzaG93biBpbiB0aGUgU2VydmljZSBDb21wb25lbnQgQXJjaGl0ZWN0dXJlIFNwZWNpZmljYXRpb24uCgpCRUEsIENhcGUgQ2xlYXIsIElCTSwgSW50ZXJmYWNlMjEsIElPTkEsIE9yYWNsZSwgUHJpbWV0b24sIFByb2dyZXNzIFNvZnR3YXJlLCBSZWQgSGF0LCBSb2d1ZSBXYXZlLApTQVAsIFNpZW1lbnMsIFNvZnR3YXJlIEFHLiwgU3VuLCBTeWJhc2UsIFRJQkNPIChjb2xsZWN0aXZlbHksIHRoZSAiQXV0aG9ycyIpIGFncmVlIHRvIGdyYW50IHlvdSBhCnJveWFsdHktZnJlZSBsaWNlbnNlLCB1bmRlciByZWFzb25hYmxlLCBub24tZGlzY3JpbWluYXRvcnkgdGVybXMgYW5kIGNvbmRpdGlvbnMgdG8gcGF0ZW50cyB0aGF0IHRoZXkgZGVlbQpuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoZSBTZXJ2aWNlIENvbXBvbmVudCBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbi4KClRIRSBTZXJ2aWNlIENvbXBvbmVudCBBcmNoaXRlY3R1cmUgU1BFQ0lGSUNBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgVEhFCkFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELApSRUdBUkRJTkcgVEhJUyBTUEVDSUZJQ0FUSU9OIEFORCBUSEUgSU1QTEVNRU5UQVRJT04gT0YgSVRTIENPTlRFTlRTLApJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKUEFSVElDVUxBUiBQVVJQT1NFLCBOT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLgoKVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTApPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgT1IgUkVMQVRJTkcgVE8gQU5ZIFVTRSBPUgpESVNUUklCVVRJT04gT0YgVEhFIFNlcnZpY2UgQ29tcG9uZW50cyBBcmNoaXRlY3R1cmUgU1BFQ0lGSUNBVElPTi4KClRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCBpbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IKcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIFNlcnZpY2UgQ29tcG9uZW50IEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uIG9yIGl0cyBjb250ZW50cyB3aXRob3V0IHNwZWNpZmljLAp3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGUgU2VydmljZSBDb21wb25lbnQgQXJjaGl0ZWN0dXJlIFNwZWNpZmljYXRpb24Kd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCgpObyBvdGhlciByaWdodHMgYXJlIGdyYW50ZWQgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSB0dXNjYW55LWJpbmRpbmctanNvbnJwYy1ydW50aW1lIGFuZCB0dXNjYW55LWltcGxlbWVudGF0aW9uLXdlYi1ydW50aW1lIGphcnMKaW5jbHVkZSB0aGUgZmlsZSBqc29ucnBjLmpzIHdoaWNoIGlzIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBsaWNlbnNlOgoKLyoKICogSlNPTi1SUEMgSmF2YVNjcmlwdCBjbGllbnQKICoKICogJElkOiBqc29ucnBjLmpzLHYgMS4zNi4yLjMgMjAwNi8wMy8wOCAxNTowOTozNyBtY2xhcmsgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgSmFuLUtsYWFzIEtvbGxob2YKICogQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgQ2xhcmssIE1ldGFwYXJhZGlnbSBQdGUgTHRkCiAqCiAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBKYW4tS2xhYXMnIEphdmFTY3JpcHQgbyBsYWl0IGxpYnJhcnkgKGpzb2xhaXQpLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqLwoKLyoKICogTW9kaWZpY2F0aW9ucyBmb3IgQXBhY2hlIFR1c2Nhbnk6CiAqIC0gSlNPTlJwY0NsaWVudF9jcmVhdGVNZXRob2QgY2hhbmdlZCBzbyBjYWxsYmFjayBpcyBsYXN0IGFyZwogKi8KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFQQUNIRSBUVVNDQU5ZIFNDQSBSRURJU1RSSUJVVEVEIEZJTEVTOiAKClRoZSBBcGFjaGUgVHVzY2FueSBTQ0EgYmluYXJ5IGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhIG51bWJlciBvZgpyZWRpc3RyaWJ1dGVkIGZpbGVzIHdpdGggc2VwYXJhdGUgY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuCllvdXIgdXNlIG9mIHRoZXNlIHJlZGlzdHJpYnV0ZWQgZmlsZXMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gdW5kZXIgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wOgogYWJkZXJhLWNsaWVudC0wLjQuMC1pbmN1YmF0aW5nLmphcgogYWJkZXJhLWNvcmUtMC40LjAtaW5jdWJhdGluZy5qYXIKIGFiZGVyYS1leHRlbnNpb25zLWh0bWwtMC40LjAtaW5jdWJhdGluZy5qYXIKIGFiZGVyYS1leHRlbnNpb25zLWpzb24tMC40LjAtaW5jdWJhdGluZy5qYXIKIGFiZGVyYS1leHRlbnNpb25zLW1haW4tMC40LjAtaW5jdWJhdGluZy5qYXIKIGFiZGVyYS1pMThuLTAuNC4wLWluY3ViYXRpbmcuamFyCiBhYmRlcmEtcGFyc2VyLTAuNC4wLWluY3ViYXRpbmcuamFyCiBhYmRlcmEtc2VydmVyLTAuNC4wLWluY3ViYXRpbmcuamFyCiBhY3RpdmVpby0yLjAtcjExOC5qYXIKIGFjdGl2ZW1xLWFsbC01LjIuMC5qYXIKIGFkZHJlc3NpbmctMS4zLm1hcgogYW5ub2dlbi0wLjEuMC5qYXIKIGFubm90YXRpb25zLWFwaS02LjAuMTQuamFyCiBhb3BhbGxpYW5jZS0xLjAuamFyCiBheGlvbS1hcGktMS4yLjcuamFyCiBheGlvbS1kb20tMS4yLjcuamFyCiBheGlvbS1pbXBsLTEuMi43LmphcgogYXhpczItYWRiLTEuNC4xLmphcgogYXhpcy1hbnQtMS40LmphcgogYXhpczItY29kZWdlbi0xLjQuMS5qYXIKIGF4aXMyLWphdmEyd3NkbC0xLjQuMS5qYXIKIGF4aXMyLWtlcm5lbC0xLjQuMS5qYXIKIGF4aXMyLW10b21wb2xpY3ktMS40LjEuamFyCiBic2YtYWxsLTMuMC1iZXRhMi5qYXIKIGNhdGFsaW5hLTYuMC4xNC5qYXIKIGNnbGliLW5vZGVwLTIuMi5qYXIKIGNvbW1vbnMtY29sbGVjdGlvbnMtMy4xLmphcgogY29tbW9ucy1jb2RlYy0xLjMuamFyCiBjb21tb25zLWZpbGV1cGxvYWQtMS4yLmphcgogY29tbW9ucy1odHRwY2xpZW50LTMuMS5qYXIKIGNvbW1vbnMtaW8tMS40LmphcgogY29tbW9ucy1qZXhsLTEuMS5qYXIKIGNvbW1vbnMtbGFuZy0yLjMuamFyCiBjb21tb25zLWxvZ2dpbmctMS4xLjEuamFyCiBjb3lvdGUtNi4wLjE0LmphcgogZGVyYnktMTAuMy4xLjQuamFyCiBnZGF0YS1jbGllbnQtMS4wLmphcgogZ2RhdGEtY2xpZW50LW1ldGEtMS4wLmphcgogZ2RhdGEtY29yZS0xLjAuamFyCiBnZGF0YS1tZWRpYS0xLjAuamFyCiBnZXJvbmltby1jb21tb24tMS4yLWJldGEuamFyCiBnZXJvbmltby1jb25uZWN0b3ItMS4yLWJldGEuamFyCiBnZXJvbmltby1jb3JlLTEuMi1iZXRhLmphcgogZ2Vyb25pbW8tZGVwbG95bWVudC0xLjItYmV0YS5qYXIKIGdlcm9uaW1vLWVqYl8zLjBfc3BlYy0xLjAuamFyCiBnZXJvbmltby1pbnRlcmNlcHRvci0xLjItYmV0YS5qYXIKIGdlcm9uaW1vLWoyZWUtMS4yLWJldGEuamFyCiBnZXJvbmltby1qMmVlLWNvbm5lY3Rvcl8xLjVfc3BlYy0xLjEuamFyCiBnZXJvbmltby1qMmVlLWphY2NfMS4wX3NwZWMtMS4xLmphcgogZ2Vyb25pbW8tajJlZS1tYW5hZ2VtZW50XzEuMF9zcGVjLTEuMS5qYXIKIGdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjLTEuMi5qYXIKIGdlcm9uaW1vLWptc18xLjFfc3BlYy0xLjEuamFyCiBnZXJvbmltby1qcGFfMy4wX3NwZWMtMS4wLmphcgogZ2Vyb25pbW8tanRhXzEuMC4xQl9zcGVjLTEuMC5qYXIKIGdlcm9uaW1vLWtlcm5lbC0xLjItYmV0YS5qYXIKIGdlcm9uaW1vLW1hbmFnZW1lbnQtMS4yLWJldGEuamFyCiBnZXJvbmltby1uYW1pbmctMS4yLWJldGEuamFyCiBnZXJvbmltby1zZWN1cml0eS0xLjItYmV0YS5qYXIKIGdlcm9uaW1vLXNwZWMtajJlZS1jb25uZWN0b3ItMS41LXJjNC5qYXIKIGdlcm9uaW1vLXNwZWMtanRhLTEuMC4xQi1yYzQuamFyCiBnZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYy0xLjAuMS5qYXIKIGdlcm9uaW1vLXN5c3RlbS0xLjItYmV0YS5qYXIKIGdlcm9uaW1vLXRyYW5zYWN0aW9uLTEuMi1iZXRhLmphcgogZ2Vyb25pbW8tdXRpbC0xLjItYmV0YS5qYXIKIGh0dHBjb3JlLTQuMC1iZXRhMS5qYXIKIGh0dHBjb3JlLW5pby00LjAtYmV0YTEuamFyCiBqZXR0aXNvbi0xLjAuMS5qYXIKIGpldHR5LTYuMS43LmphcgogamV0dHktdXRpbC02LjEuNy5qYXIKIGppbnRlcmZhY2UtMS41LjMuMS5qYXIKIGpzb24tcnBjLTEuMC5qYXIKIGp1bGktNi4wLjE0LmphcgogbG9nNGotMS4yLjEzLmphcgogbHVjZW5lLWNvcmUtMi40LTIwMDkwNTExLjAyMTI1OS0xLmphcgogbHVjZW5lLWhpZ2hsaWdodGVyLTIuNC0yMDA5MDUxMS4wMjEzMzktMS5qYXIKIGx1Y2VuZS1tZW1vcnktMi40LTIwMDkwNTExLjAyMTM0NC0xLmphcgogbWV4LTEuNDEtaW1wbC5qYXIKIG5lZXRoaS0yLjAuNC5qYXIKIG9kZS1icGVsLWFwaS0xLjEuMS5qYXIKIG9kZS1icGVsLWNvbXBpbGVyLTEuMS4xLmphcgogb2RlLWJwZWwtZGFvLTEuMS4xLmphcgogb2RlLWJwZWwtZXByLTEuMS4xLmphcgogb2RlLWJwZWwtb2JqLTEuMS4xLmphcgogb2RlLWJwZWwtcnVudGltZS0xLjEuMS5qYXIKIG9kZS1icGVsLXNjaGVtYXMtMS4xLjEuamFyCiBvZGUtYnBlbC1zdG9yZS0xLjEuMS5qYXIKIG9kZS1kYW8tanBhLTEuMS4xLmphcgogb2RlLWRhby1qcGEtb2pwYS1kZXJieS0xLjEuMS56aXAKIG9kZS1qYWNvYi0xLjEuMS5qYXIKIG9kZS1qYWNvYi1hcC0xLjEuMS5qYXIKIG9kZS1zY2hlZHVsZXItc2ltcGxlLTEuMS4xLmphcgogb2RlLXV0aWxzLTEuMS4xLmphcgogb3BlbmpwYS1hbGwtMC45LjctaW5jdWJhdGluZy5qYXIKIG9wZW5qcGEtcGVyc2lzdGVuY2UtMC45LjctaW5jdWJhdGluZy5qYXIKIG9wZW5zYW1sLTEuMS5qYXIKIG9yZy5hcGFjaGUuZmVsaXguYnVuZGxlcmVwb3NpdG9yeS0xLjAuMy5qYXIKIG9yZy5hcGFjaGUuZmVsaXguZnJhbWV3b3JrLTEuMC40Lmphcgogb3JnLmFwYWNoZS5mZWxpeC5tYWluLTEuMC40Lmphcgogb3JnLmFwYWNoZS5mZWxpeC5zaGVsbC0xLjAuMS5qYXIKIG9yZy5hcGFjaGUuZmVsaXguc2hlbGwudHVpLTEuMC4xLmphcgogcmFtcGFydC1jb3JlLTEuNC5qYXIKIHJhbXBhcnQtcG9saWN5LTEuNC5qYXIKIHJhbXBhcnQtdHJ1c3QtMS40LmphcgogcmVnZXhwLTEuMy5qYXIKIHNwcmluZy1iZWFucy0yLjUuNS5qYXIKIHNwcmluZy1jb250ZXh0LTIuNS41Lmphcgogc3ByaW5nLWNvcmUtMi41LjUuamFyCiB0cmFucWwtY29ubmVjdG9yLTEuMS5qYXIKIHR1c2Nhbnktc2RvLWFwaS1yMi4xLTEuMS4xLmphcgogdHVzY2FueS1zZG8taW1wbC0xLjEuMS5qYXIKIHR1c2Nhbnktc2RvLWxpYi0xLjEuMS5qYXIKIHR1c2Nhbnktc2RvLXRvb2xzLTEuMS4xLmphcgogd29kZW4tYXBpLTEuME04Lmphcgogd29kZW4taW1wbC1kb20tMS4wTTguamFyCiB3c3M0ai0xLjUuNC5qYXIKIHdzdHgtYXNsLTMuMi40LmphcgogeGFsYW4tMi43LjAuamFyCiB4YmVhbi1uYW1pbmctMi43LmphcgogeGVyY2VzSW1wbC0yLjguMS5qYXIKIHhtbC1hcGlzLTEuMy4wMy5qYXIKIHhtbGJlYW5zLTIuMy4wLmphcgogeG1sUGFyc2VyQVBJcy0yLjYuMC5qYXIKIHhtbC1yZXNvbHZlci0xLjEuamFyCiB4bWxzZWMtMS40LjIuamFyCiBYbWxTY2hlbWEtMS40LjIuamFyCmFuZCBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodHM6CiBYbWxTY2hlbWEtMS40LjIuamFyCiAgLSBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuCiBvZGUtYnBlbC1hcGktMS4xLjEuamFyCiAgLSBDb3B5cmlnaHQgMTk5OS0yMDA2IEludGFsaW8gLSBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEludGFsaW8gKGh0dHA6Ly93d3cuaW50YWxpby5jb20pCiAgLSBDb3B5cmlnaHQgMjAwNiBTeWJhc2UgLSBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFN5YmFzZS4oaHR0cDovL3d3dy5zeWJhc2UuY29tKQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGVzOgogY29tbW9ucy1kaXNjb3ZlcnktMC4yLmphcgogY29tbW9ucy1wcmltaXRpdmVzLTEuMC5qYXIKYXJlIHJlZGlzdHJpYnV0ZWQgaW4gZXhlY3V0YWJsZSBmb3JtIGFuZCBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAogKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgogKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KICoKICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KICoKICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCiAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CiAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgogKgogKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KICovCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZTogCiBheGlvbi0xLjAtTTMtZGV2LmphciAKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgpDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBBeGlvbiBEZXZlbG9wbWVudCBUZWFtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAphcmUgbWV0OgoKMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCiAgIGRpc2NsYWltZXIuIAogCjIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCiAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCiAgIGRpc3RyaWJ1dGlvbi4gCgozLiBUaGUgbmFtZXMgIlRpZ3JpcyIsICJBeGlvbiIsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgCiAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyAKICAgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAogCjQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBeGlvbiIsIG5vciAKICAgbWF5ICJUaWdyaXMiIG9yICJBeGlvbiIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKICAgd3JpdHRlbiBwZXJtaXNzaW9uLgogClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIApMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQpQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgCk9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAKTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIApEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgClRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSAKT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIApUaGUgIkF4aW9uIERldmVsb3BtZW50IFRlYW0iIGlzIGRlZmluZWQgdG8gYmU6CgogKiBDaHVjayBCdXJkaWNrCiAqIEphbWVzIEJ1cmtlCiAqIE1vcmdhbiBEZWxhZ3JhbmdlCiAqIEdlaXIgTWFnbnVzc29uIEpyLgogKiBNYXJ0aW4gUG9lc2NobAogKiBTdGV2ZSBQb2x5YWsKICogRGFuaWVsIFJhbGwKICogQWhpbWFuaWt5YSBTYXRhcGF0aHkKICogRG91ZyBTYWxlCiAqIEphbWVzIFN0cmFjaGFuCiAqIFJvZG5leSBXYWxkaG9mZgogKiBKYXNvbiB2YW4gWnlsCgpMaWNlbnNlIGNoYW5nZXMgYXJlIHRvIGJlIGRldGVybWluZWQgYnkgYSBzaW1wbGUgbWFqb3JpdHkgdm90ZSBvZiB0aGUgCkF4aW9uIERldmVsb3BtZW50IFRlYW0uCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZTogCiBkb200ai0xLjYuMS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgpDb3B5cmlnaHQgMjAwMS0yMDA1IChDKSBNZXRhU3R1ZmYsIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCigiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAp0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAogICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgogCjIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAozLiBUaGUgbmFtZSAiRE9NNEoiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogICBwZXJtaXNzaW9uIG9mIE1ldGFTdHVmZiwgTHRkLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKICAgcGxlYXNlIGNvbnRhY3QgZG9tNGotaW5mb0BtZXRhc3R1ZmYuY29tLgogCjQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJET000SiIKICAgbm9yIG1heSAiRE9NNEoiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KICAgcGVybWlzc2lvbiBvZiBNZXRhU3R1ZmYsIEx0ZC4gRE9NNEogaXMgYSByZWdpc3RlcmVkCiAgIHRyYWRlbWFyayBvZiBNZXRhU3R1ZmYsIEx0ZC4KIAo1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byB0aGUgRE9NNEogUHJvamVjdCAtIAogICBodHRwOi8vd3d3LmRvbTRqLm9yZwogClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTUVUQVNUVUZGLCBMVEQuIEFORCBDT05UUklCVVRPUlMKYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCk1FVEFTVFVGRiwgTFRELiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgpTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULApTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCkFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIEVNRiBmaWxlczogCiBjb2RlZ2VuLTIuMi4zLmphciAKIGNvZGVnZW4tZWNvcmUtMi4yLjMuamFyCiBjb21tb24tMi4yLjMuamFyCiBlY29yZS0yLjIuMy5qYXIKIGVjb3JlLWNoYW5nZS0yLjIuMy5qYXIKIGVjb3JlLXhtaS0yLjIuMy5qYXIKIHhzZC0yLjIuMy5qYXIKYW5kIEFzcGVjdEogZmlsZXM6CiBhc3BlY3RqbGliLTEuNi4yLmphcgogYXNwZWN0anJ0LTEuNi4yLmphcgphcmUgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0sIHdpdGggc291cmNlIGNvZGUgYXZhaWxhYmxlIGF0CiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL21vZGVsaW5nL2VtZi9kb3dubG9hZHMvCiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FzcGVjdGovZG93bmxvYWRzLnBocAphbmQgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgpFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAKClRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFClBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YKVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KCjEuIERFRklOSVRJT05TCgoiQ29udHJpYnV0aW9uIiBtZWFuczoKCmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZApkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgoKaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCgppaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOwoKd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kCmFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCidvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2gKQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4KQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUKc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQpQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCndvcmtzIG9mIHRoZSBQcm9ncmFtLgoKIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgoKIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yCndoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24KYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgoKIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIApBZ3JlZW1lbnQuCgoiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMKQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KCjIuIEdSQU5UIE9GIFJJR0hUUwoKYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CmdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCm9iamVjdCBjb2RlIGZvcm0uCgpiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudApsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAppbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmCmFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwKYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdAp0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbgpvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCkxpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCmNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwpsaWNlbnNlZCBoZXJldW5kZXIuCgpjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCnBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQphbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCm9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwpncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQp0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgpleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93ClJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eQp0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgoKZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudApjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodApsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KCjMuIFJFUVVJUkVNRU5UUwoKQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybQp1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgoKYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAoKYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgoKaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzCmFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvcgpjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCmNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKCmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5CmZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQKY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKCmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlCm9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCgppdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2gKQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZQptYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KCldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKCmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAoKYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIApQcm9ncmFtLgoKQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKd2l0aGluIHRoZSBQcm9ncmFtLgoKRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudApSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCgo0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgoKQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCnJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQpsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYQpjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90CmNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYQpDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywKc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZAphbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQphZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcKZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eQphZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cwpvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwpyZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4KSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkKbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpCmFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoCmNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KCkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCnByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbApDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQphbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCmRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgptdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgoKNS4gTk8gV0FSUkFOVFkKCkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwpQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCk9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCmRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwpleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCnRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlCmxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kCnVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgoKNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKCkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IKQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULApJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCldJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwpORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCkRJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECkhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCgo3LiBHRU5FUkFMCgpJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgphcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIKYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCm1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KCklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQooaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAp0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgpzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgp0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgpBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdApmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcwpBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YKdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwpyaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZQphbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4KSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcwpncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQKc3Vydml2ZS4KCkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQKbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZApyZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCnRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50ClN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24KaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbgp0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhCmRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpCm1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50CnVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlCkFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQpQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCmV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzCm5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvcgp1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgpvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KClRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vCnBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCml0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBTYXhvbiBmaWxlczogCiBzYXhvbi04LjcuamFyCiBzYXhvbi1kb20tOC43Lmphcgogc2F4b24teHBhdGgtOC43LmphcgphcmUgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgoKIE1PWklMTEEgUFVCTElDIExJQ0VOU0UKVmVyc2lvbiAxLjAKCjEuIERlZmluaXRpb25zLgoKICAgICAgMS4xLiBgYENvbnRyaWJ1dG9yJycgbWVhbnMgZWFjaCBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgoKICAgICAgMS4yLiBgYENvbnRyaWJ1dG9yIFZlcnNpb24nJyBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCgogICAgICAxLjMuIGBgQ292ZXJlZCBDb2RlJycgbWVhbnMgdGhlIE9yaWdpbmFsIENvZGUgb3IgTW9kaWZpY2F0aW9ucyBvciB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgYW5kIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KCiAgICAgIDEuNC4gYGBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20nJyBtZWFucyBhIG1lY2hhbmlzbSBnZW5lcmFsbHkgYWNjZXB0ZWQgaW4gdGhlIHNvZnR3YXJlIGRldmVsb3BtZW50IGNvbW11bml0eSBmb3IgdGhlIGVsZWN0cm9uaWMgdHJhbnNmZXIgb2YgZGF0YS4KCiAgICAgIDEuNS4gYGBFeGVjdXRhYmxlJycgbWVhbnMgQ292ZXJlZCBDb2RlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuCgogICAgICAxLjYuIGBgSW5pdGlhbCBEZXZlbG9wZXInJyBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgaWRlbnRpZmllZCBhcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0IEEuCgogICAgICAxLjcuIGBgTGFyZ2VyIFdvcmsnJyBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBDb2RlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgoKICAgICAgMS44LiBgYExpY2Vuc2UnJyBtZWFucyB0aGlzIGRvY3VtZW50LgoKICAgICAgMS45LiBgYE1vZGlmaWNhdGlvbnMnJyBtZWFucyBhbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUgc3Vic3RhbmNlIG9yIHN0cnVjdHVyZSBvZiBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW55IHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuIFdoZW4gQ292ZXJlZCBDb2RlIGlzIHJlbGVhc2VkIGFzIGEgc2VyaWVzIG9mIGZpbGVzLCBhIE1vZGlmaWNhdGlvbiBpczoKCiAgICAgICAgICAgIEEuIEFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBDb2RlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCgogICAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgQ29kZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zLiAKCiAgICAgIDEuMTAuIGBgT3JpZ2luYWwgQ29kZScnIG1lYW5zIFNvdXJjZSBDb2RlIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgd2hpY2ggaXMgZGVzY3JpYmVkIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdCBBIGFzIE9yaWdpbmFsIENvZGUsIGFuZCB3aGljaCwgYXQgdGhlIHRpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcyBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UuCgogICAgICAxLjExLiBgYFNvdXJjZSBDb2RlJycgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSBDb3ZlcmVkIENvZGUgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LCBpbmNsdWRpbmcgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgYW4gRXhlY3V0YWJsZSwgb3IgYSBsaXN0IG9mIHNvdXJjZSBjb2RlIGRpZmZlcmVudGlhbCBjb21wYXJpc29ucyBhZ2FpbnN0IGVpdGhlciB0aGUgT3JpZ2luYWwgQ29kZSBvciBhbm90aGVyIHdlbGwga25vd24sIGF2YWlsYWJsZSBDb3ZlcmVkIENvZGUgb2YgdGhlIENvbnRyaWJ1dG9yJ3MgY2hvaWNlLiBUaGUgU291cmNlIENvZGUgY2FuIGJlIGluIGEgY29tcHJlc3NlZCBvciBhcmNoaXZhbCBmb3JtLCBwcm92aWRlZCB0aGUgYXBwcm9wcmlhdGUgZGVjb21wcmVzc2lvbiBvciBkZS1hcmNoaXZpbmcgc29mdHdhcmUgaXMgd2lkZWx5IGF2YWlsYWJsZSBmb3Igbm8gY2hhcmdlLgoKICAgICAgMS4xMi4gYGBZb3UnJyBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlIG9yIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlzc3VlZCB1bmRlciBTZWN0aW9uIDYuMS4gRm9yIGxlZ2FsIGVudGl0aWVzLCBgYFlvdScnIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCBgYGNvbnRyb2wnJyBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuIAoKMi4gU291cmNlIENvZGUgTGljZW5zZS4KCiAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgogICAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zOgoKICAgICAgICAgICAgKGEpIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIENvZGUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBvciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAoKICAgICAgICAgICAgKGIpIHVuZGVyIHBhdGVudHMgbm93IG9yIGhlcmVhZnRlciBvd25lZCBvciBjb250cm9sbGVkIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSBhbmQgc2VsbCAoYGBVdGlsaXplJycpIHRoZSBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55IHN1Y2ggcGF0ZW50IGlzIHJlYXNvbmFibHkgbmVjZXNzYXJ5IHRvIGVuYWJsZSBZb3UgdG8gVXRpbGl6ZSB0aGUgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgYW5kIG5vdCB0byBhbnkgZ3JlYXRlciBleHRlbnQgdGhhdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIFV0aWxpemUgZnVydGhlciBNb2RpZmljYXRpb25zIG9yIGNvbWJpbmF0aW9ucy4gCgogICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgogICAgICBFYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltczoKCiAgICAgICAgICAgIChhKSB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZikgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBDb2RlIG9yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCgogICAgICAgICAgICAoYikgdW5kZXIgcGF0ZW50cyBub3cgb3IgaGVyZWFmdGVyIG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgQ29udHJpYnV0b3IsIHRvIFV0aWxpemUgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBidXQgc29sZWx5IHRvIHRoZSBleHRlbnQgdGhhdCBhbnkgc3VjaCBwYXRlbnQgaXMgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gZW5hYmxlIFlvdSB0byBVdGlsaXplIHRoZSBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgYW5kIG5vdCB0byBhbnkgZ3JlYXRlciBleHRlbnQgdGhhdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIFV0aWxpemUgZnVydGhlciBNb2RpZmljYXRpb25zIG9yIGNvbWJpbmF0aW9ucy4gCgozLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCgogICAgICAzLjEuIEFwcGxpY2F0aW9uIG9mIExpY2Vuc2UuCiAgICAgIFRoZSBNb2RpZmljYXRpb25zIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gU2VjdGlvbiAyLjIuIFRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mIENvdmVyZWQgQ29kZSBtYXkgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIHJlbGVhc2VkIHVuZGVyIFNlY3Rpb24gNi4xLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgWW91IGRpc3RyaWJ1dGUuIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IFNvdXJjZSBDb2RlIHZlcnNpb24gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBIb3dldmVyLCBZb3UgbWF5IGluY2x1ZGUgYW4gYWRkaXRpb25hbCBkb2N1bWVudCBvZmZlcmluZyB0aGUgYWRkaXRpb25hbCByaWdodHMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy41LgoKICAgICAgMy4yLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCiAgICAgIEFueSBNb2RpZmljYXRpb24gd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBlaXRoZXIgb24gdGhlIHNhbWUgbWVkaWEgYXMgYW4gRXhlY3V0YWJsZSB2ZXJzaW9uIG9yIHZpYSBhbiBhY2NlcHRlZCBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gdG8gYW55b25lIHRvIHdob20geW91IG1hZGUgYW4gRXhlY3V0YWJsZSB2ZXJzaW9uIGF2YWlsYWJsZTsgYW5kIGlmIG1hZGUgYXZhaWxhYmxlIHZpYSBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20sIG11c3QgcmVtYWluIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3QgdHdlbHZlICgxMikgbW9udGhzIGFmdGVyIHRoZSBkYXRlIGl0IGluaXRpYWxseSBiZWNhbWUgYXZhaWxhYmxlLCBvciBhdCBsZWFzdCBzaXggKDYpIG1vbnRocyBhZnRlciBhIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGF0IHBhcnRpY3VsYXIgTW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHN1Y2ggcmVjaXBpZW50cy4gWW91IGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiByZW1haW5zIGF2YWlsYWJsZSBldmVuIGlmIHRoZSBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gaXMgbWFpbnRhaW5lZCBieSBhIHRoaXJkIHBhcnR5LgoKICAgICAgMy4zLiBEZXNjcmlwdGlvbiBvZiBNb2RpZmljYXRpb25zLgogICAgICBZb3UgbXVzdCBjYXVzZSBhbGwgQ292ZXJlZCBDb2RlIHRvIHdoaWNoIHlvdSBjb250cmlidXRlIHRvIGNvbnRhaW4gYSBmaWxlIGRvY3VtZW50aW5nIHRoZSBjaGFuZ2VzIFlvdSBtYWRlIHRvIGNyZWF0ZSB0aGF0IENvdmVyZWQgQ29kZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gWW91IG11c3QgaW5jbHVkZSBhIHByb21pbmVudCBzdGF0ZW1lbnQgdGhhdCB0aGUgTW9kaWZpY2F0aW9uIGlzIGRlcml2ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gT3JpZ2luYWwgQ29kZSBwcm92aWRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gKGEpIHRoZSBTb3VyY2UgQ29kZSwgYW5kIChiKSBpbiBhbnkgbm90aWNlIGluIGFuIEV4ZWN1dGFibGUgdmVyc2lvbiBvciByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4gd2hpY2ggWW91IGRlc2NyaWJlIHRoZSBvcmlnaW4gb3Igb3duZXJzaGlwIG9mIHRoZSBDb3ZlcmVkIENvZGUuCgogICAgICAzLjQuIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBNYXR0ZXJzCgogICAgICAgICAgICAoYSkgVGhpcmQgUGFydHkgQ2xhaW1zLgogICAgICAgICAgICBJZiBZb3UgaGF2ZSBrbm93bGVkZ2UgdGhhdCBhIHBhcnR5IGNsYWltcyBhbiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHQgaW4gcGFydGljdWxhciBmdW5jdGlvbmFsaXR5IG9yIGNvZGUgKG9yIGl0cyB1dGlsaXphdGlvbiB1bmRlciB0aGlzIExpY2Vuc2UpLCB5b3UgbXVzdCBpbmNsdWRlIGEgdGV4dCBmaWxlIHdpdGggdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbiB0aXRsZWQgYGBMRUdBTCcnIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2xhaW0gYW5kIHRoZSBwYXJ0eSBtYWtpbmcgdGhlIGNsYWltIGluIHN1ZmZpY2llbnQgZGV0YWlsIHRoYXQgYSByZWNpcGllbnQgd2lsbCBrbm93IHdob20gdG8gY29udGFjdC4gSWYgeW91IG9idGFpbiBzdWNoIGtub3dsZWRnZSBhZnRlciBZb3UgbWFrZSBZb3VyIE1vZGlmaWNhdGlvbiBhdmFpbGFibGUgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLCBZb3Ugc2hhbGwgcHJvbXB0bHkgbW9kaWZ5IHRoZSBMRUdBTCBmaWxlIGluIGFsbCBjb3BpZXMgWW91IG1ha2UgYXZhaWxhYmxlIHRoZXJlYWZ0ZXIgYW5kIHNoYWxsIHRha2Ugb3RoZXIgc3RlcHMgKHN1Y2ggYXMgbm90aWZ5aW5nIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSB0aG9zZSB3aG8gcmVjZWl2ZWQgdGhlIENvdmVyZWQgQ29kZSB0aGF0IG5ldyBrbm93bGVkZ2UgaGFzIGJlZW4gb2J0YWluZWQuCgogICAgICAgICAgICAoYikgQ29udHJpYnV0b3IgQVBJcy4KICAgICAgICAgICAgSWYgWW91ciBNb2RpZmljYXRpb24gaXMgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIGFuZCBZb3Ugb3duIG9yIGNvbnRyb2wgcGF0ZW50cyB3aGljaCBhcmUgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoYXQgQVBJLCB5b3UgbXVzdCBhbHNvIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgTEVHQUwgZmlsZS4gCgogICAgICAzLjUuIFJlcXVpcmVkIE5vdGljZXMuCiAgICAgIFlvdSBtdXN0IGR1cGxpY2F0ZSB0aGUgbm90aWNlIGluIEV4aGliaXQgQSBpbiBlYWNoIGZpbGUgb2YgdGhlIFNvdXJjZSBDb2RlLCBhbmQgdGhpcyBMaWNlbnNlIGluIGFueSBkb2N1bWVudGF0aW9uIGZvciB0aGUgU291cmNlIENvZGUsIHdoZXJlIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gQ292ZXJlZCBDb2RlLiBJZiBZb3UgY3JlYXRlZCBvbmUgb3IgbW9yZSBNb2RpZmljYXRpb24ocyksIFlvdSBtYXkgYWRkIHlvdXIgbmFtZSBhcyBhIENvbnRyaWJ1dG9yIHRvIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQS4gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHB1dCBzdWNoIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIgU291cmNlIENvZGUgZmlsZSBkdWUgdG8gaXRzIHN0cnVjdHVyZSwgdGhlbiB5b3UgbXVzdCBpbmNsdWRlIHN1Y2ggbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSByZWxldmFudCBkaXJlY3RvcnkgZmlsZSkgd2hlcmUgYSB1c2VyIHdvdWxkIGJlIGxpa2VseSB0byBsb29rIGZvciBzdWNoIGEgbm90aWNlLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBDb2RlLiBIb3dldmVyLCBZb3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhbiBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCgogICAgICAzLjYuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgogICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgQ292ZXJlZCBDb2RlIGluIEV4ZWN1dGFibGUgZm9ybSBvbmx5IGlmIHRoZSByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLCBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mIHRoZSBDb3ZlcmVkIENvZGUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZSBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQgaW4gYW55IG5vdGljZSBpbiBhbiBFeGVjdXRhYmxlIHZlcnNpb24sIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBvciBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlIENvdmVyZWQgQ29kZS4gWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZCBDb2RlIHVuZGVyIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4KCiAgICAgIDMuNy4gTGFyZ2VyIFdvcmtzLgogICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIENvZGUgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIENvZGUuIAoKNC4gSW5hYmlsaXR5IHRvIENvbXBseSBEdWUgdG8gU3RhdHV0ZSBvciBSZWd1bGF0aW9uLgoKICAgICAgSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggcmVzcGVjdCB0byBzb21lIG9yIGFsbCBvZiB0aGUgQ292ZXJlZCBDb2RlIGR1ZSB0byBzdGF0dXRlIG9yIHJlZ3VsYXRpb24gdGhlbiBZb3UgbXVzdDogKGEpIGNvbXBseSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlOyBhbmQgKGIpIGRlc2NyaWJlIHRoZSBsaW1pdGF0aW9ucyBhbmQgdGhlIGNvZGUgdGhleSBhZmZlY3QuIFN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgTEVHQUwgZmlsZSBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjQgYW5kIG11c3QgYmUgaW5jbHVkZWQgd2l0aCBhbGwgZGlzdHJpYnV0aW9ucyBvZiB0aGUgU291cmNlIENvZGUuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHByb2hpYml0ZWQgYnkgc3RhdHV0ZSBvciByZWd1bGF0aW9uLCBzdWNoIGRlc2NyaXB0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGRldGFpbGVkIGZvciBhIHJlY2lwaWVudCBvZiBvcmRpbmFyeSBza2lsbCB0byBiZSBhYmxlIHRvIHVuZGVyc3RhbmQgaXQuIAoKNS4gQXBwbGljYXRpb24gb2YgdGhpcyBMaWNlbnNlLgoKICAgICAgVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gY29kZSB0byB3aGljaCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGFzIGF0dGFjaGVkIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBLCBhbmQgdG8gcmVsYXRlZCBDb3ZlcmVkIENvZGUuIAoKNi4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCgogICAgICA2LjEuIE5ldyBWZXJzaW9ucy4KICAgICAgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24gKGBgTmV0c2NhcGUnJykgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZSBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLgoKICAgICAgNi4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgogICAgICBPbmNlIENvdmVyZWQgQ29kZSBoYXMgYmVlbiBwdWJsaXNoZWQgdW5kZXIgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdCB2ZXJzaW9uLiBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSBzdWNoIENvdmVyZWQgQ29kZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgTmV0c2NhcGUuIE5vIG9uZSBvdGhlciB0aGFuIE5ldHNjYXBlIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSB0ZXJtcyBhcHBsaWNhYmxlIHRvIENvdmVyZWQgQ29kZSBjcmVhdGVkIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgICAgIDYuMy4gRGVyaXZhdGl2ZSBXb3Jrcy4KICAgICAgSWYgeW91IGNyZWF0ZSBvciB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSAod2hpY2ggeW91IG1heSBvbmx5IGRvIGluIG9yZGVyIHRvIGFwcGx5IGl0IHRvIGNvZGUgd2hpY2ggaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSksIHlvdSBtdXN0IChhKSByZW5hbWUgWW91ciBsaWNlbnNlIHNvIHRoYXQgdGhlIHBocmFzZXMgYGBNb3ppbGxhJycsIGBgTU9aSUxMQVBMJycsIGBgTU9aUEwnJywgYGBOZXRzY2FwZScnLCBgYE5QTCcnIG9yIGFueSBjb25mdXNpbmdseSBzaW1pbGFyIHBocmFzZSBkbyBub3QgYXBwZWFyIGFueXdoZXJlIGluIHlvdXIgbGljZW5zZSBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgeW91ciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIGFuZCBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gKEZpbGxpbmcgaW4gdGhlIG5hbWUgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLCBPcmlnaW5hbCBDb2RlIG9yIENvbnRyaWJ1dG9yIGluIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBzaGFsbCBub3Qgb2YgdGhlbXNlbHZlcyBiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZiB0aGlzIExpY2Vuc2UuKSAKCjcuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCgogICAgICBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIGBgQVMgSVMnJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLiAKCjguIFRFUk1JTkFUSU9OLgoKICAgICAgVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gQWxsIHN1YmxpY2Vuc2VzIHRvIHRoZSBDb3ZlcmVkIENvZGUgd2hpY2ggYXJlIHByb3Blcmx5IGdyYW50ZWQgc2hhbGwgc3Vydml2ZSBhbnkgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLiAKCjkuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgoKICAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgVEhFIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIENPREUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gWU9VIE9SIEFOWSBPVEhFUiBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWSdTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhBVCBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuIAoKMTAuIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCgogICAgICBUaGUgQ292ZXJlZCBDb2RlIGlzIGEgYGBjb21tZXJjaWFsIGl0ZW0sJycgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIGBgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZScnIGFuZCBgYGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiwnJyBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgQ29kZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uIAoKMTEuIE1JU0NFTExBTkVPVVMuCgogICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IENhbGlmb3JuaWEgbGF3IHByb3Zpc2lvbnMgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBpdHMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFdpdGggcmVzcGVjdCB0byBkaXNwdXRlcyBpbiB3aGljaCBhdCBsZWFzdCBvbmUgcGFydHkgaXMgYSBjaXRpemVuIG9mLCBvciBhbiBlbnRpdHkgY2hhcnRlcmVkIG9yIHJlZ2lzdGVyZWQgdG8gZG8gYnVzaW5lc3MgaW4sIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2E6IChhKSB1bmxlc3Mgb3RoZXJ3aXNlIGFncmVlZCBpbiB3cml0aW5nLCBhbGwgZGlzcHV0ZXMgcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIChleGNlcHRpbmcgYW55IGRpc3B1dGUgcmVsYXRpbmcgdG8gaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cykgc2hhbGwgYmUgc3ViamVjdCB0byBmaW5hbCBhbmQgYmluZGluZyBhcmJpdHJhdGlvbiwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHBheWluZyBhbGwgY29zdHMgb2YgYXJiaXRyYXRpb247IChiKSBhbnkgYXJiaXRyYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBBZ3JlZW1lbnQgc2hhbGwgYmUgaGVsZCBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEsIHVuZGVyIHRoZSBhdXNwaWNlcyBvZiBKQU1TL0VuZERpc3B1dGU7IGFuZCAoYykgYW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBBZ3JlZW1lbnQgc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIAoKMTIuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCgogICAgICBFeGNlcHQgaW4gY2FzZXMgd2hlcmUgYW5vdGhlciBDb250cmlidXRvciBoYXMgZmFpbGVkIHRvIGNvbXBseSB3aXRoIFNlY3Rpb24gMy40LCBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBZb3VyIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UsIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIENvdmVyZWQgQ29kZSB5b3UgbWFkZSBhdmFpbGFibGUsIHRoZSByZXZlbnVlcyB5b3UgcmVjZWl2ZWQgZnJvbSB1dGlsaXppbmcgc3VjaCByaWdodHMsIGFuZCBvdGhlciByZWxldmFudCBmYWN0b3JzLiBZb3UgYWdyZWUgdG8gd29yayB3aXRoIGFmZmVjdGVkIHBhcnRpZXMgdG8gZGlzdHJpYnV0ZSByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIAoKRVhISUJJVCBBLgoKICAgICAgYGBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCgogICAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgoKICAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fXy4gUG9ydGlvbnMgY3JlYXRlZCBieSBfX19fX19fX19fX19fX19fX19fX19fIGFyZSBDb3B5cmlnaHQgKEMpIF9fX19fXyBfX19fX19fX19fX19fX19fX19fX19fXy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICAgIENvbnRyaWJ1dG9yKHMpOiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4nJyAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBSaGlubyBKYXZhU2NyaXB0IGVuZ2luZSBmaWxlOgoganMtMS42UjcuamFyCmlzIHJlZGlzdHJpYnV0ZWQgaW4gZXhlY3V0YWJsZSBmb3JtIGFuZCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgoKICAgICAgICAgICAgICAgICAgICAgICAgICBNT1pJTExBIFBVQkxJQyBMSUNFTlNFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAxLjEKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLQoKMS4gRGVmaW5pdGlvbnMuCgogICAgIDEuMC4xLiAiQ29tbWVyY2lhbCBVc2UiIG1lYW5zIGRpc3RyaWJ1dGlvbiBvciBvdGhlcndpc2UgbWFraW5nIHRoZQogICAgIENvdmVyZWQgQ29kZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KCiAgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0bwogICAgIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgoKICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsCiAgICAgQ29kZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IsIGFuZCB0aGUgTW9kaWZpY2F0aW9ucwogICAgIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgoKICAgICAxLjMuICJDb3ZlcmVkIENvZGUiIG1lYW5zIHRoZSBPcmlnaW5hbCBDb2RlIG9yIE1vZGlmaWNhdGlvbnMgb3IgdGhlCiAgICAgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgYW5kIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZQogICAgIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgoKICAgICAxLjQuICJFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20iIG1lYW5zIGEgbWVjaGFuaXNtIGdlbmVyYWxseQogICAgIGFjY2VwdGVkIGluIHRoZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgZm9yIHRoZSBlbGVjdHJvbmljCiAgICAgdHJhbnNmZXIgb2YgZGF0YS4KCiAgICAgMS41LiAiRXhlY3V0YWJsZSIgbWVhbnMgQ292ZXJlZCBDb2RlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlCiAgICAgQ29kZS4KCiAgICAgMS42LiAiSW5pdGlhbCBEZXZlbG9wZXIiIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSBpZGVudGlmaWVkCiAgICAgYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdAogICAgIEEuCgogICAgIDEuNy4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBDb2RlIG9yCiAgICAgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCgogICAgIDEuOC4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCgogICAgIDEuOC4xLiAiTGljZW5zYWJsZSIgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0KICAgICBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3IKICAgICBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgoKICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyBhbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUKICAgICBzdWJzdGFuY2Ugb3Igc3RydWN0dXJlIG9mIGVpdGhlciB0aGUgT3JpZ2luYWwgQ29kZSBvciBhbnkgcHJldmlvdXMKICAgICBNb2RpZmljYXRpb25zLiBXaGVuIENvdmVyZWQgQ29kZSBpcyByZWxlYXNlZCBhcyBhIHNlcmllcyBvZiBmaWxlcywgYQogICAgIE1vZGlmaWNhdGlvbiBpczoKICAgICAgICAgIEEuIEFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIGZpbGUKICAgICAgICAgIGNvbnRhaW5pbmcgT3JpZ2luYWwgQ29kZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zLgoKICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yCiAgICAgICAgICBwcmV2aW91cyBNb2RpZmljYXRpb25zLgoKICAgICAxLjEwLiAiT3JpZ2luYWwgQ29kZSIgbWVhbnMgU291cmNlIENvZGUgb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZQogICAgIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgU291cmNlIENvZGUgbm90aWNlIHJlcXVpcmVkIGJ5IEV4aGliaXQgQSBhcwogICAgIE9yaWdpbmFsIENvZGUsIGFuZCB3aGljaCwgYXQgdGhlIHRpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcwogICAgIExpY2Vuc2UgaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgMS4xMC4xLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yCiAgICAgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCAgbWV0aG9kLCBwcm9jZXNzLAogICAgIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KCiAgICAgMS4xMS4gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIENvdmVyZWQgQ29kZSBmb3IKICAgICBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdCwgaW5jbHVkaW5nIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzCiAgICAgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHNjcmlwdHMgdXNlZCB0byBjb250cm9sCiAgICAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBhbiBFeGVjdXRhYmxlLCBvciBzb3VyY2UgY29kZQogICAgIGRpZmZlcmVudGlhbCBjb21wYXJpc29ucyBhZ2FpbnN0IGVpdGhlciB0aGUgT3JpZ2luYWwgQ29kZSBvciBhbm90aGVyCiAgICAgd2VsbCBrbm93biwgYXZhaWxhYmxlIENvdmVyZWQgQ29kZSBvZiB0aGUgQ29udHJpYnV0b3IncyBjaG9pY2UuIFRoZQogICAgIFNvdXJjZSBDb2RlIGNhbiBiZSBpbiBhIGNvbXByZXNzZWQgb3IgYXJjaGl2YWwgZm9ybSwgcHJvdmlkZWQgdGhlCiAgICAgYXBwcm9wcmlhdGUgZGVjb21wcmVzc2lvbiBvciBkZS1hcmNoaXZpbmcgc29mdHdhcmUgaXMgd2lkZWx5IGF2YWlsYWJsZQogICAgIGZvciBubyBjaGFyZ2UuCgogICAgIDEuMTIuICJZb3UiIChvciAiWW91ciIpICBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5CiAgICAgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzCiAgICAgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpc3N1ZWQgdW5kZXIgU2VjdGlvbiA2LjEuCiAgICAgRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcwogICAgIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YKICAgICB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsCiAgICAgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5CiAgICAgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50CiAgICAgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoCiAgICAgZW50aXR5LgoKMi4gU291cmNlIENvZGUgTGljZW5zZS4KCiAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCiAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLAogICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKICAgICBjbGFpbXM6CiAgICAgICAgICAoYSkgIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yCiAgICAgICAgICB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIgdG8gdXNlLCByZXByb2R1Y2UsCiAgICAgICAgICBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsCiAgICAgICAgICBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKSB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yCiAgICAgICAgICBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAoKICAgICAgICAgIChiKSB1bmRlciBQYXRlbnRzIENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3IKICAgICAgICAgIHNlbGxpbmcgb2YgT3JpZ2luYWwgQ29kZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLAogICAgICAgICAgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlCiAgICAgICAgICBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KCiAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gdGhpcyBTZWN0aW9uIDIuMShhKSBhbmQgKGIpIGFyZQogICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzCiAgICAgICAgICBPcmlnaW5hbCBDb2RlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCgogICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMKICAgICAgICAgIGdyYW50ZWQ6IDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBDb2RlOyAyKQogICAgICAgICAgc2VwYXJhdGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgIG9yIDMpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZAogICAgICAgICAgYnk6IGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgb3IgaWkpIHRoZQogICAgICAgICAgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgoKICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgogICAgIFN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvcgogICAgIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UKCiAgICAgICAgICAoYSkgIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yCiAgICAgICAgICB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksCiAgICAgICAgICBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zCiAgICAgICAgICBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGVpdGhlciBvbiBhbgogICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIENvZGUKICAgICAgICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAoKICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3IKICAgICAgICAgIHNlbGxpbmcgb2YgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZQogICAgICAgICAgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zCiAgICAgICAgICBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZQogICAgICAgICAgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAogICAgICAgICAgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgMikgdGhlIGNvbWJpbmF0aW9uIG9mCiAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvcgogICAgICAgICAgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuCgogICAgICAgICAgKGMpIHRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZQogICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IG1ha2VzIENvbW1lcmNpYWwgVXNlIG9mCiAgICAgICAgICB0aGUgQ292ZXJlZCBDb2RlLgoKICAgICAgICAgIChkKSAgICBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCiAgICAgICAgICBncmFudGVkOiAxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZQogICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbjsgMikgIHNlcGFyYXRlIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247CiAgICAgICAgICAzKSAgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiBpKSB0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mCiAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIG9yIGlpKSAgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZQogICAgICAgICAgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlICAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlCiAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciA0KSB1bmRlciBQYXRlbnQgQ2xhaW1zCiAgICAgICAgICBpbmZyaW5nZWQgYnkgQ292ZXJlZCBDb2RlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieQogICAgICAgICAgdGhhdCBDb250cmlidXRvci4KCjMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KCiAgICAgMy4xLiBBcHBsaWNhdGlvbiBvZiBMaWNlbnNlLgogICAgIFRoZSBNb2RpZmljYXRpb25zIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlCiAgICAgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgogICAgIFNlY3Rpb24gMi4yLiBUaGUgU291cmNlIENvZGUgdmVyc2lvbiBvZiBDb3ZlcmVkIENvZGUgbWF5IGJlCiAgICAgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIGEgZnV0dXJlIHZlcnNpb24KICAgICBvZiB0aGlzIExpY2Vuc2UgcmVsZWFzZWQgdW5kZXIgU2VjdGlvbiA2LjEsIGFuZCBZb3UgbXVzdCBpbmNsdWRlIGEKICAgICBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIFlvdQogICAgIGRpc3RyaWJ1dGUuIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IFNvdXJjZSBDb2RlCiAgICAgdmVyc2lvbiB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzCiAgICAgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGhlcmV1bmRlci4gSG93ZXZlciwgWW91IG1heSBpbmNsdWRlCiAgICAgYW4gYWRkaXRpb25hbCBkb2N1bWVudCBvZmZlcmluZyB0aGUgYWRkaXRpb25hbCByaWdodHMgZGVzY3JpYmVkIGluCiAgICAgU2VjdGlvbiAzLjUuCgogICAgIDMuMi4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgogICAgIEFueSBNb2RpZmljYXRpb24gd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBtdXN0IGJlCiAgICAgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCiAgICAgZWl0aGVyIG9uIHRoZSBzYW1lIG1lZGlhIGFzIGFuIEV4ZWN1dGFibGUgdmVyc2lvbiBvciB2aWEgYW4gYWNjZXB0ZWQKICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gdG8gYW55b25lIHRvIHdob20geW91IG1hZGUgYW4KICAgICBFeGVjdXRhYmxlIHZlcnNpb24gYXZhaWxhYmxlOyBhbmQgaWYgbWFkZSBhdmFpbGFibGUgdmlhIEVsZWN0cm9uaWMKICAgICBEaXN0cmlidXRpb24gTWVjaGFuaXNtLCBtdXN0IHJlbWFpbiBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IHR3ZWx2ZSAoMTIpCiAgICAgbW9udGhzIGFmdGVyIHRoZSBkYXRlIGl0IGluaXRpYWxseSBiZWNhbWUgYXZhaWxhYmxlLCBvciBhdCBsZWFzdCBzaXgKICAgICAoNikgbW9udGhzIGFmdGVyIGEgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoYXQgcGFydGljdWxhciBNb2RpZmljYXRpb24KICAgICBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byBzdWNoIHJlY2lwaWVudHMuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yCiAgICAgZW5zdXJpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiByZW1haW5zIGF2YWlsYWJsZSBldmVuIGlmIHRoZQogICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSBpcyBtYWludGFpbmVkIGJ5IGEgdGhpcmQgcGFydHkuCgogICAgIDMuMy4gRGVzY3JpcHRpb24gb2YgTW9kaWZpY2F0aW9ucy4KICAgICBZb3UgbXVzdCBjYXVzZSBhbGwgQ292ZXJlZCBDb2RlIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIHRvIGNvbnRhaW4gYQogICAgIGZpbGUgZG9jdW1lbnRpbmcgdGhlIGNoYW5nZXMgWW91IG1hZGUgdG8gY3JlYXRlIHRoYXQgQ292ZXJlZCBDb2RlIGFuZAogICAgIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBwcm9taW5lbnQgc3RhdGVtZW50IHRoYXQKICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIGRlcml2ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gT3JpZ2luYWwKICAgICBDb2RlIHByb3ZpZGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZQogICAgIEluaXRpYWwgRGV2ZWxvcGVyIGluIChhKSB0aGUgU291cmNlIENvZGUsIGFuZCAoYikgaW4gYW55IG5vdGljZSBpbiBhbgogICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBvciByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4gd2hpY2ggWW91IGRlc2NyaWJlIHRoZQogICAgIG9yaWdpbiBvciBvd25lcnNoaXAgb2YgdGhlIENvdmVyZWQgQ29kZS4KCiAgICAgMy40LiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTWF0dGVycwogICAgICAgICAgKGEpIFRoaXJkIFBhcnR5IENsYWltcy4KICAgICAgICAgIElmIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2UgdGhhdCBhIGxpY2Vuc2UgdW5kZXIgYSB0aGlyZCBwYXJ0eSdzCiAgICAgICAgICBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGlzIHJlcXVpcmVkIHRvIGV4ZXJjaXNlIHRoZSByaWdodHMKICAgICAgICAgIGdyYW50ZWQgYnkgc3VjaCBDb250cmlidXRvciB1bmRlciBTZWN0aW9ucyAyLjEgb3IgMi4yLAogICAgICAgICAgQ29udHJpYnV0b3IgbXVzdCBpbmNsdWRlIGEgdGV4dCBmaWxlIHdpdGggdGhlIFNvdXJjZSBDb2RlCiAgICAgICAgICBkaXN0cmlidXRpb24gdGl0bGVkICJMRUdBTCIgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbGFpbSBhbmQgdGhlCiAgICAgICAgICBwYXJ0eSBtYWtpbmcgdGhlIGNsYWltIGluIHN1ZmZpY2llbnQgZGV0YWlsIHRoYXQgYSByZWNpcGllbnQgd2lsbAogICAgICAgICAga25vdyB3aG9tIHRvIGNvbnRhY3QuIElmIENvbnRyaWJ1dG9yIG9idGFpbnMgc3VjaCBrbm93bGVkZ2UgYWZ0ZXIKICAgICAgICAgIHRoZSBNb2RpZmljYXRpb24gaXMgbWFkZSBhdmFpbGFibGUgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLAogICAgICAgICAgQ29udHJpYnV0b3Igc2hhbGwgcHJvbXB0bHkgbW9kaWZ5IHRoZSBMRUdBTCBmaWxlIGluIGFsbCBjb3BpZXMKICAgICAgICAgIENvbnRyaWJ1dG9yIG1ha2VzIGF2YWlsYWJsZSB0aGVyZWFmdGVyIGFuZCBzaGFsbCB0YWtlIG90aGVyIHN0ZXBzCiAgICAgICAgICAoc3VjaCBhcyBub3RpZnlpbmcgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0cyBvciBuZXdzZ3JvdXBzKQogICAgICAgICAgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSB0aG9zZSB3aG8gcmVjZWl2ZWQgdGhlIENvdmVyZWQKICAgICAgICAgIENvZGUgdGhhdCBuZXcga25vd2xlZGdlIGhhcyBiZWVuIG9idGFpbmVkLgoKICAgICAgICAgIChiKSBDb250cmlidXRvciBBUElzLgogICAgICAgICAgSWYgQ29udHJpYnV0b3IncyBNb2RpZmljYXRpb25zIGluY2x1ZGUgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcKICAgICAgICAgIGludGVyZmFjZSBhbmQgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSBvZiBwYXRlbnQgbGljZW5zZXMgd2hpY2gKICAgICAgICAgIGFyZSByZWFzb25hYmx5IG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgdGhhdCBBUEksIENvbnRyaWJ1dG9yIG11c3QKICAgICAgICAgIGFsc28gaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBMRUdBTCBmaWxlLgoKICAgICAgICAgICAgICAgKGMpICAgIFJlcHJlc2VudGF0aW9ucy4KICAgICAgICAgIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCwgZXhjZXB0IGFzIGRpc2Nsb3NlZCBwdXJzdWFudCB0bwogICAgICAgICAgU2VjdGlvbiAzLjQoYSkgYWJvdmUsIENvbnRyaWJ1dG9yIGJlbGlldmVzIHRoYXQgQ29udHJpYnV0b3IncwogICAgICAgICAgTW9kaWZpY2F0aW9ucyBhcmUgQ29udHJpYnV0b3IncyBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IKICAgICAgICAgIENvbnRyaWJ1dG9yIGhhcyBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5CiAgICAgICAgICB0aGlzIExpY2Vuc2UuCgogICAgIDMuNS4gUmVxdWlyZWQgTm90aWNlcy4KICAgICBZb3UgbXVzdCBkdXBsaWNhdGUgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEgaW4gZWFjaCBmaWxlIG9mIHRoZSBTb3VyY2UKICAgICBDb2RlLiAgSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHB1dCBzdWNoIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIgU291cmNlCiAgICAgQ29kZSBmaWxlIGR1ZSB0byBpdHMgc3RydWN0dXJlLCB0aGVuIFlvdSBtdXN0IGluY2x1ZGUgc3VjaCBub3RpY2UgaW4gYQogICAgIGxvY2F0aW9uIChzdWNoIGFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHVzZXIgd291bGQgYmUgbGlrZWx5CiAgICAgdG8gbG9vayBmb3Igc3VjaCBhIG5vdGljZS4gIElmIFlvdSBjcmVhdGVkIG9uZSBvciBtb3JlIE1vZGlmaWNhdGlvbihzKQogICAgIFlvdSBtYXkgYWRkIHlvdXIgbmFtZSBhcyBhIENvbnRyaWJ1dG9yIHRvIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCiAgICAgRXhoaWJpdCBBLiAgWW91IG11c3QgYWxzbyBkdXBsaWNhdGUgdGhpcyBMaWNlbnNlIGluIGFueSBkb2N1bWVudGF0aW9uCiAgICAgZm9yIHRoZSBTb3VyY2UgQ29kZSB3aGVyZSBZb3UgZGVzY3JpYmUgcmVjaXBpZW50cycgcmlnaHRzIG9yIG93bmVyc2hpcAogICAgIHJpZ2h0cyByZWxhdGluZyB0byBDb3ZlcmVkIENvZGUuICBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvCiAgICAgY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKICAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgQ29kZS4gSG93ZXZlciwgWW91CiAgICAgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbAogICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGFuCiAgICAgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcwogICAgIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwKICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZQogICAgIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksCiAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCgogICAgIDMuNi4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCiAgICAgWW91IG1heSBkaXN0cmlidXRlIENvdmVyZWQgQ29kZSBpbiBFeGVjdXRhYmxlIGZvcm0gb25seSBpZiB0aGUKICAgICByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLAogICAgIGFuZCBpZiBZb3UgaW5jbHVkZSBhIG5vdGljZSBzdGF0aW5nIHRoYXQgdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gb2YKICAgICB0aGUgQ292ZXJlZCBDb2RlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAogICAgIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZQogICAgIG9ibGlnYXRpb25zIG9mIFNlY3Rpb24gMy4yLiBUaGUgbm90aWNlIG11c3QgYmUgY29uc3BpY3VvdXNseSBpbmNsdWRlZAogICAgIGluIGFueSBub3RpY2UgaW4gYW4gRXhlY3V0YWJsZSB2ZXJzaW9uLCByZWxhdGVkIGRvY3VtZW50YXRpb24gb3IKICAgICBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlCiAgICAgQ292ZXJlZCBDb2RlLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgdmVyc2lvbiBvZiBDb3ZlcmVkCiAgICAgQ29kZSBvciBvd25lcnNoaXAgcmlnaHRzIHVuZGVyIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5CiAgICAgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbgogICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUKICAgICBFeGVjdXRhYmxlIHZlcnNpb24gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MKICAgICByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzCiAgICAgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgdmVyc2lvbiB1bmRlciBhIGRpZmZlcmVudAogICAgIGxpY2Vuc2UgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlcgogICAgIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsCiAgICAgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlCiAgICAgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5CiAgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2gKICAgICB0ZXJtcyBZb3Ugb2ZmZXIuCgogICAgIDMuNy4gTGFyZ2VyIFdvcmtzLgogICAgIFlvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgQ29kZSB3aXRoIG90aGVyIGNvZGUKICAgICBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyCiAgICAgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZQogICAgIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgQ29kZS4KCjQuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIFN0YXR1dGUgb3IgUmVndWxhdGlvbi4KCiAgICAgSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcwogICAgIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBDb3ZlcmVkIENvZGUgZHVlIHRvCiAgICAgc3RhdHV0ZSwganVkaWNpYWwgb3JkZXIsIG9yIHJlZ3VsYXRpb24gdGhlbiBZb3UgbXVzdDogKGEpIGNvbXBseSB3aXRoCiAgICAgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGU7IGFuZCAoYikKICAgICBkZXNjcmliZSB0aGUgbGltaXRhdGlvbnMgYW5kIHRoZSBjb2RlIHRoZXkgYWZmZWN0LiBTdWNoIGRlc2NyaXB0aW9uCiAgICAgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgTEVHQUwgZmlsZSBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjQgYW5kIG11c3QKICAgICBiZSBpbmNsdWRlZCB3aXRoIGFsbCBkaXN0cmlidXRpb25zIG9mIHRoZSBTb3VyY2UgQ29kZS4gRXhjZXB0IHRvIHRoZQogICAgIGV4dGVudCBwcm9oaWJpdGVkIGJ5IHN0YXR1dGUgb3IgcmVndWxhdGlvbiwgc3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlCiAgICAgc3VmZmljaWVudGx5IGRldGFpbGVkIGZvciBhIHJlY2lwaWVudCBvZiBvcmRpbmFyeSBza2lsbCB0byBiZSBhYmxlIHRvCiAgICAgdW5kZXJzdGFuZCBpdC4KCjUuIEFwcGxpY2F0aW9uIG9mIHRoaXMgTGljZW5zZS4KCiAgICAgVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gY29kZSB0byB3aGljaCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGFzCiAgICAgYXR0YWNoZWQgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEgYW5kIHRvIHJlbGF0ZWQgQ292ZXJlZCBDb2RlLgoKNi4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCgogICAgIDYuMS4gTmV3IFZlcnNpb25zLgogICAgIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uICgiTmV0c2NhcGUiKSBtYXkgcHVibGlzaCByZXZpc2VkCiAgICAgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGUgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uCiAgICAgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLgoKICAgICA2LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCiAgICAgT25jZSBDb3ZlcmVkIENvZGUgaGFzIGJlZW4gcHVibGlzaGVkIHVuZGVyIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZQogICAgIExpY2Vuc2UsIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdAogICAgIHZlcnNpb24uIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlIHN1Y2ggQ292ZXJlZCBDb2RlIHVuZGVyIHRoZSB0ZXJtcwogICAgIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IE5ldHNjYXBlLiBObyBvbmUKICAgICBvdGhlciB0aGFuIE5ldHNjYXBlIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSB0ZXJtcyBhcHBsaWNhYmxlIHRvCiAgICAgQ292ZXJlZCBDb2RlIGNyZWF0ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgoKICAgICA2LjMuIERlcml2YXRpdmUgV29ya3MuCiAgICAgSWYgWW91IGNyZWF0ZSBvciB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSAod2hpY2ggeW91IG1heQogICAgIG9ubHkgZG8gaW4gb3JkZXIgdG8gYXBwbHkgaXQgdG8gY29kZSB3aGljaCBpcyBub3QgYWxyZWFkeSBDb3ZlcmVkIENvZGUKICAgICBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UpLCBZb3UgbXVzdCAoYSkgcmVuYW1lIFlvdXIgbGljZW5zZSBzbyB0aGF0CiAgICAgdGhlIHBocmFzZXMgIk1vemlsbGEiLCAiTU9aSUxMQVBMIiwgIk1PWlBMIiwgIk5ldHNjYXBlIiwKICAgICAiTVBMIiwgIk5QTCIgb3IgYW55IGNvbmZ1c2luZ2x5IHNpbWlsYXIgcGhyYXNlIGRvIG5vdCBhcHBlYXIgaW4geW91cgogICAgIGxpY2Vuc2UgKGV4Y2VwdCB0byBub3RlIHRoYXQgeW91ciBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpCiAgICAgYW5kIChiKSBvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0IFlvdXIgdmVyc2lvbiBvZiB0aGUgbGljZW5zZQogICAgIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIGFuZAogICAgIE5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLiAoRmlsbGluZyBpbiB0aGUgbmFtZSBvZiB0aGUgSW5pdGlhbAogICAgIERldmVsb3BlciwgT3JpZ2luYWwgQ29kZSBvciBDb250cmlidXRvciBpbiB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbgogICAgIEV4aGliaXQgQSBzaGFsbCBub3Qgb2YgdGhlbXNlbHZlcyBiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZgogICAgIHRoaXMgTGljZW5zZS4pCgo3LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgoKICAgICBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCiAgICAgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsCiAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GCiAgICAgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLgogICAgIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgQ09ERQogICAgIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsCiAgICAgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRQogICAgIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIKICAgICBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgogICAgIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMgRElTQ0xBSU1FUi4KCjguIFRFUk1JTkFUSU9OLgoKICAgICA4LjEuICBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUKICAgICBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlCiAgICAgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gQWxsCiAgICAgc3VibGljZW5zZXMgdG8gdGhlIENvdmVyZWQgQ29kZSB3aGljaCBhcmUgcHJvcGVybHkgZ3JhbnRlZCBzaGFsbAogICAgIHN1cnZpdmUgYW55IHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIKICAgICBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZQogICAgIHNoYWxsIHN1cnZpdmUuCgogICAgIDguMi4gIElmIFlvdSBpbml0aWF0ZSBsaXRpZ2F0aW9uIGJ5IGFzc2VydGluZyBhIHBhdGVudCBpbmZyaW5nZW1lbnQKICAgICBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyCiAgICAgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbQogICAgIFlvdSBmaWxlIHN1Y2ggYWN0aW9uIGlzIHJlZmVycmVkIHRvIGFzICJQYXJ0aWNpcGFudCIpICBhbGxlZ2luZyB0aGF0OgoKICAgICAoYSkgIHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKICAgICBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBieSBzdWNoCiAgICAgUGFydGljaXBhbnQgdG8gWW91IHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZQogICAgIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHksCiAgICAgdW5sZXNzIGlmIHdpdGhpbiA2MCBkYXlzIGFmdGVyIHJlY2VpcHQgb2Ygbm90aWNlIFlvdSBlaXRoZXI6IChpKQogICAgIGFncmVlIGluIHdyaXRpbmcgdG8gcGF5IFBhcnRpY2lwYW50IGEgbXV0dWFsbHkgYWdyZWVhYmxlIHJlYXNvbmFibGUKICAgICByb3lhbHR5IGZvciBZb3VyIHBhc3QgYW5kIGZ1dHVyZSB1c2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHN1Y2gKICAgICBQYXJ0aWNpcGFudCwgb3IgKGlpKSB3aXRoZHJhdyBZb3VyIGxpdGlnYXRpb24gY2xhaW0gd2l0aCByZXNwZWN0IHRvCiAgICAgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50LiAgSWYgd2l0aGluIDYwIGRheXMKICAgICBvZiBub3RpY2UsIGEgcmVhc29uYWJsZSByb3lhbHR5IGFuZCBwYXltZW50IGFycmFuZ2VtZW50IGFyZSBub3QKICAgICBtdXR1YWxseSBhZ3JlZWQgdXBvbiBpbiB3cml0aW5nIGJ5IHRoZSBwYXJ0aWVzIG9yIHRoZSBsaXRpZ2F0aW9uIGNsYWltCiAgICAgaXMgbm90IHdpdGhkcmF3biwgdGhlIHJpZ2h0cyBncmFudGVkIGJ5IFBhcnRpY2lwYW50IHRvIFlvdSB1bmRlcgogICAgIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIGF0IHRoZSBleHBpcmF0aW9uIG9mCiAgICAgdGhlIDYwIGRheSBub3RpY2UgcGVyaW9kIHNwZWNpZmllZCBhYm92ZS4KCiAgICAgKGIpICBhbnkgc29mdHdhcmUsIGhhcmR3YXJlLCBvciBkZXZpY2UsIG90aGVyIHRoYW4gc3VjaCBQYXJ0aWNpcGFudCdzCiAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbgogICAgIGFueSByaWdodHMgZ3JhbnRlZCB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCB1bmRlciBTZWN0aW9ucyAyLjEoYikKICAgICBhbmQgMi4yKGIpIGFyZSByZXZva2VkIGVmZmVjdGl2ZSBhcyBvZiB0aGUgZGF0ZSBZb3UgZmlyc3QgbWFkZSwgdXNlZCwKICAgICBzb2xkLCBkaXN0cmlidXRlZCwgb3IgaGFkIG1hZGUsIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0CiAgICAgUGFydGljaXBhbnQuCgogICAgIDguMy4gIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIGFnYWluc3QgUGFydGljaXBhbnQKICAgICBhbGxlZ2luZyB0aGF0IHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yCiAgICAgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzCiAgICAgYnkgbGljZW5zZSBvciBzZXR0bGVtZW50KSBwcmlvciB0byB0aGUgaW5pdGlhdGlvbiBvZiBwYXRlbnQKICAgICBpbmZyaW5nZW1lbnQgbGl0aWdhdGlvbiwgdGhlbiB0aGUgcmVhc29uYWJsZSB2YWx1ZSBvZiB0aGUgbGljZW5zZXMKICAgICBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbgogICAgIGludG8gYWNjb3VudCBpbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9yIHZhbHVlIG9mIGFueSBwYXltZW50IG9yCiAgICAgbGljZW5zZS4KCiAgICAgOC40LiAgSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDguMSBvciA4LjIgYWJvdmUsCiAgICAgYWxsIGVuZCB1c2VyIGxpY2Vuc2UgYWdyZWVtZW50cyAoZXhjbHVkaW5nIGRpc3RyaWJ1dG9ycyBhbmQgcmVzZWxsZXJzKQogICAgIHdoaWNoIGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIKICAgICBwcmlvciB0byB0ZXJtaW5hdGlvbiBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgoKOS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCgogICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCiAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTAogICAgIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBDT0RFLAogICAgIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IKICAgICBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKICAgICBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YgR09PRFdJTEwsCiAgICAgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKICAgICBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOCiAgICAgSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GCiAgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWQogICAgIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcKICAgICBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRQogICAgIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTwogICAgIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgoKMTAuIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCgogICAgIFRoZSBDb3ZlcmVkIENvZGUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4KICAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKICAgICBzb2Z0d2FyZSIgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24sIiBhcyBzdWNoCiAgICAgdGVybXMgYXJlIHVzZWQgaW4gNDggQy5GLlIuIDEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OAogICAgIEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwKICAgICBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgQ29kZSB3aXRoIG9ubHkgdGhvc2UKICAgICByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KCjExLiBNSVNDRUxMQU5FT1VTLgoKICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAogICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUKICAgICB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQKICAgICBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5CiAgICAgQ2FsaWZvcm5pYSBsYXcgcHJvdmlzaW9ucyAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmCiAgICAgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgaXRzIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLgogICAgIFdpdGggcmVzcGVjdCB0byBkaXNwdXRlcyBpbiB3aGljaCBhdCBsZWFzdCBvbmUgcGFydHkgaXMgYSBjaXRpemVuIG9mLAogICAgIG9yIGFuIGVudGl0eSBjaGFydGVyZWQgb3IgcmVnaXN0ZXJlZCB0byBkbyBidXNpbmVzcyBpbiB0aGUgVW5pdGVkCiAgICAgU3RhdGVzIG9mIEFtZXJpY2EsIGFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZQogICAgIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuCiAgICAgRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksCiAgICAgQ2FsaWZvcm5pYSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nCiAgICAgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kCiAgICAgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbgogICAgIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuCiAgICAgQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3QKICAgICBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcwogICAgIExpY2Vuc2UuCgoxMi4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KCiAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcwogICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwKICAgICBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0bwogICAgIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaAogICAgIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3IKICAgICBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KCjEzLiBNVUxUSVBMRS1MSUNFTlNFRCBDT0RFLgoKICAgICBJbml0aWFsIERldmVsb3BlciBtYXkgZGVzaWduYXRlIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgYXMKICAgICAiTXVsdGlwbGUtTGljZW5zZWQiLiAgIk11bHRpcGxlLUxpY2Vuc2VkIiBtZWFucyB0aGF0IHRoZSBJbml0aWFsCiAgICAgRGV2ZWxvcGVyIHBlcm1pdHMgeW91IHRvIHV0aWxpemUgcG9ydGlvbnMgb2YgdGhlIENvdmVyZWQgQ29kZSB1bmRlcgogICAgIFlvdXIgY2hvaWNlIG9mIHRoZSBOUEwgb3IgdGhlIGFsdGVybmF0aXZlIGxpY2Vuc2VzLCBpZiBhbnksIHNwZWNpZmllZAogICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBpbiB0aGUgZmlsZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBLgoKRVhISUJJVCBBIC1Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlLgoKICAgICBgYFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKICAgICBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCiAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KCiAgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgogICAgIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCiAgICAgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCiAgICAgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgoKICAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgX19fX19fX19fX19fX19fX19fX19fX19fLgogICAgIFBvcnRpb25zIGNyZWF0ZWQgYnkgX19fX19fX19fX19fX19fX19fX19fXyBhcmUgQ29weXJpZ2h0IChDKSBfX19fX18KICAgICBfX19fX19fX19fX19fX19fX19fX19fXy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICAgQ29udHJpYnV0b3Iocyk6IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgoKICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcwogICAgIG9mIHRoZSBfX19fXyBsaWNlbnNlICh0aGUgICJbX19fXSBMaWNlbnNlIiksIGluIHdoaWNoIGNhc2UgdGhlCiAgICAgcHJvdmlzaW9ucyBvZiBbX19fX19fXSBMaWNlbnNlIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UKICAgICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFtfX19fXSBMaWNlbnNlIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQogICAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQogICAgIGRlbGV0aW5nICB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSAgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCiAgICAgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgW19fX10gTGljZW5zZS4gIElmIHlvdSBkbyBub3QgZGVsZXRlCiAgICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQogICAgIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBbX19fXSBMaWNlbnNlLiIKCiAgICAgW05PVEU6IFRoZSB0ZXh0IG9mIHRoaXMgRXhoaWJpdCBBIG1heSBkaWZmZXIgc2xpZ2h0bHkgZnJvbSB0aGUgdGV4dCBvZgogICAgIHRoZSBub3RpY2VzIGluIHRoZSBTb3VyY2UgQ29kZSBmaWxlcyBvZiB0aGUgT3JpZ2luYWwgQ29kZS4gWW91IHNob3VsZAogICAgIHVzZSB0aGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSByYXRoZXIgdGhhbiB0aGUgdGV4dCBmb3VuZCBpbiB0aGUKICAgICBPcmlnaW5hbCBDb2RlIFNvdXJjZSBDb2RlIGZvciBZb3VyIE1vZGlmaWNhdGlvbnMuXQoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBHcm9vdnkgZmlsZToKIGdyb292eS1hbGwtbWluaW1hbC0xLjUuNC5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgovKgogJElkOiBMSUNFTlNFLnR4dCAxNTYgMjAwMy0wOS0yNiAxNzozNjozN1oganN0cmFjaGFuICQKCiBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAogdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CiAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KCiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCiAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgogMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAogICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCgogNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAogICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KCiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQogICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCgogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCiAqLwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIEp5dGhvbiBmaWxlOgoganl0aG9uLTIuMi5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgpBLiBISVNUT1JZIE9GIFRIRSBTT0ZUV0FSRQo9PT09PT09PT09PT09PT09PT09PT09PQoKSlB5dGhvbiB3YXMgY3JlYXRlZCBpbiBsYXRlIDE5OTcgYnkgSmltIEh1Z3VuaW4uIEppbSB3YXMgYWxzbyB0aGUKcHJpbWFyeSBkZXZlbG9wZXIgd2hpbGUgaGUgd2FzIGF0IENOUkkuIEluIEZlYnJ1YXJ5IDE5OTkgQmFycnkgV2Fyc2F3CnRvb2sgb3ZlciBhcyBwcmltYXJ5IGRldmVsb3BlciBhbmQgcmVsZWFzZWQgSlB5dGhvbiB2ZXJzaW9uIDEuMS4KCkluIE9jdG9iZXIgMjAwMCBCYXJyeSBoZWxwZWQgbW92ZSB0aGUgc29mdHdhcmUgdG8gU291cmNlRm9yZ2UKd2hlcmUgaXQgd2FzIHJlbmFtZWQgdG8gSnl0aG9uLiAgSnl0aG9uIDIuMCBhbmQgb24gYXJlIGxpY2Vuc2VkIHVuZGVyCnRoZSBKeXRob24gc3BlY2lmaWMgbGljZW5zZSBiZWxvdy4gCgpUaGUgc3RhbmRhcmQgbGlicmFyeSBpcyBjb3ZlcmVkIGJ5IHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgpsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0VfQ1B5dGhvbi50eHQgZmlsZSBmb3IgZGV0YWlscy4KClRoZSB6eEpEQkMgcGFja2FnZSB3YXMgd3JpdHRlbiBieSBCcmlhbiBaaW1tZXIgYW5kIG9yaWdpbmFsbHkgbGljZW5zZWQKdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZS4gIFRoZSBwYWNrYWdlIGlzIG5vdyBjb3ZlcmVkIGJ5IHRoZSBKeXRob24KU29mdHdhcmUgTGljZW5zZS4KClRoZSBjb21tYW5kIGxpbmUgaW50ZXJwcmV0ZXIgaXMgY292ZXJlZCBieSB0aGUgQXBhY2hlIFNvZnR3YXJlCkxpY2Vuc2UuICBTZWUgdGhlIExJQ0VOU0VfQXBhY2hlLnR4dCBmaWxlIGZvciBkZXRhaWxzLgogCkIuIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBBQ0NFU1NJTkcgT1IgT1RIRVJXSVNFIFVTSU5HIEpZVEhPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEp5dGhvbiBEZXZlbG9wZXJzCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCmFyZSBtZXQ6CgogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBKeXRob24gRGV2ZWxvcGVycyBub3IgdGhlIG5hbWVzIG9mCiAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCiAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwpgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgpBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IKQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCkVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SClBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTClNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCgoKSlB5dGhvbiAxLjEueCBTb2Z0d2FyZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpJTVBPUlRBTlQ6IFBMRUFTRSBSRUFEIFRIRSBGT0xMT1dJTkcgQUdSRUVNRU5UIENBUkVGVUxMWS4KCkJZIENMSUNLSU5HIE9OIFRIRSAiQUNDRVBUIiBCVVRUT04gV0hFUkUgSU5ESUNBVEVELCBPUiBCWSBJTlNUQUxMSU5HLApDT1BZSU5HIE9SIE9USEVSV0lTRSBVU0lORyBUSEUgU09GVFdBUkUsIFlPVSBBUkUgREVFTUVEIFRPIEhBVkUgQUdSRUVEIFRPClRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVC4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkpQeXRob24gdmVyc2lvbiAxLjEueAoKICAxLiBUaGlzIExJQ0VOU0UgQUdSRUVNRU5UIGlzIGJldHdlZW4gdGhlIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaAogICAgIEluaXRpYXRpdmVzLCBoYXZpbmcgYW4gb2ZmaWNlIGF0IDE4OTUgUHJlc3RvbiBXaGl0ZSBEcml2ZSwgUmVzdG9uLCBWQQogICAgIDIwMTkxICgiQ05SSSIpLCBhbmQgdGhlIEluZGl2aWR1YWwgb3IgT3JnYW5pemF0aW9uICgiTGljZW5zZWUiKQogICAgIGFjY2Vzc2luZyBhbmQgdXNpbmcgSlB5dGhvbiB2ZXJzaW9uIDEuMS54IGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBhbmQKICAgICBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGFzIHByb3ZpZGVkIGhlcmVpbiAoIlNvZnR3YXJlIikuCgogIDIuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQsIENOUkkKICAgICBoZXJlYnkgZ3JhbnRzIExpY2Vuc2VlIGEgbm9uLWV4Y2x1c2l2ZSwgbm9uLXRyYW5zZmVyYWJsZSwgcm95YWx0eS1mcmVlLAogICAgIHdvcmxkLXdpZGUgbGljZW5zZSB0byByZXByb2R1Y2UsIGFuYWx5emUsIHRlc3QsIHBlcmZvcm0gYW5kL29yIGRpc3BsYXkKICAgICBwdWJsaWNseSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzLCBkaXN0cmlidXRlLCBhbmQgb3RoZXJ3aXNlIHVzZSB0aGUKICAgICBTb2Z0d2FyZSBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uLCBwcm92aWRlZCwgaG93ZXZlciwgdGhhdAogICAgIENOUkkncyBMaWNlbnNlIEFncmVlbWVudCBhbmQgQ05SSSdzIG5vdGljZSBvZiBjb3B5cmlnaHQsIGkuZS4sCiAgICAgIkNvcHlyaWdodCCpMTk5Ni0xOTk5IENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlczsKICAgICBBbGwgUmlnaHRzIFJlc2VydmVkIiBhcmUgYm90aCByZXRhaW5lZCBpbiB0aGUgU29mdHdhcmUsIGFsb25lIG9yIGluIGFueQogICAgIGRlcml2YXRpdmUgdmVyc2lvbiBwcmVwYXJlZCBieSBMaWNlbnNlZS4KCiAgICAgQWx0ZXJuYXRpdmVseSwgaW4gbGlldSBvZiBDTlJJJ3MgTGljZW5zZSBBZ3JlZW1lbnQsIExpY2Vuc2VlIG1heQogICAgIHN1YnN0aXR1dGUgdGhlIGZvbGxvd2luZyB0ZXh0IChvbWl0dGluZyB0aGUgcXVvdGVzKSwgcHJvdmlkZWQsIGhvd2V2ZXIsCiAgICAgdGhhdCBzdWNoIHRleHQgaXMgZGlzcGxheWVkIHByb21pbmVudGx5IGluIHRoZSBTb2Z0d2FyZSBhbG9uZSBvciBpbiBhbnkKICAgICBkZXJpdmF0aXZlIHZlcnNpb24gcHJlcGFyZWQgYnkgTGljZW5zZWU6ICJKUHl0aG9uIChWZXJzaW9uIDEuMS54KSBpcwogICAgIG1hZGUgYXZhaWxhYmxlIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGluIENOUkkncyBMaWNlbnNlCiAgICAgQWdyZWVtZW50LiBUaGlzIEFncmVlbWVudCBtYXkgYmUgbG9jYXRlZCBvbiB0aGUgSW50ZXJuZXQgdXNpbmcgdGhlCiAgICAgZm9sbG93aW5nIHVuaXF1ZSwgcGVyc2lzdGVudCBpZGVudGlmaWVyIChrbm93biBhcyBhIGhhbmRsZSk6CiAgICAgMTg5NS4yMi8xMDA2LiBUaGUgTGljZW5zZSBtYXkgYWxzbyBiZSBvYnRhaW5lZCBmcm9tIGEgcHJveHkgc2VydmVyIG9uCiAgICAgdGhlIFdlYiB1c2luZyB0aGUgZm9sbG93aW5nIFVSTDogaHR0cDovL2hkbC5oYW5kbGUubmV0LzE4OTUuMjIvMTAwNi4iCgogIDMuIEluIHRoZSBldmVudCBMaWNlbnNlZSBwcmVwYXJlcyBhIGRlcml2YXRpdmUgd29yayB0aGF0IGlzIGJhc2VkIG9uIG9yCiAgICAgaW5jb3Jwb3JhdGVzIHRoZSBTb2Z0d2FyZSBvciBhbnkgcGFydCB0aGVyZW9mLCBhbmQgd2FudHMgdG8gbWFrZSB0aGUKICAgICBkZXJpdmF0aXZlIHdvcmsgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgYXMgcHJvdmlkZWQgaGVyZWluLCB0aGVuCiAgICAgTGljZW5zZWUgaGVyZWJ5IGFncmVlcyB0byBpbmRpY2F0ZSBpbiBhbnkgc3VjaCB3b3JrLCBpbiBhIHByb21pbmVudGx5CiAgICAgdmlzaWJsZSB3YXksIHRoZSBuYXR1cmUgb2YgdGhlIG1vZGlmaWNhdGlvbnMgbWFkZSB0byBDTlJJJ3MgU29mdHdhcmUuCgogIDQuIExpY2Vuc2VlIG1heSBub3QgdXNlIENOUkkgdHJhZGVtYXJrcyBvciB0cmFkZSBuYW1lLCBpbmNsdWRpbmcgSlB5dGhvbgogICAgIG9yIENOUkksIGluIGEgdHJhZGVtYXJrIHNlbnNlIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBvcgogICAgIHNlcnZpY2VzIG9mIExpY2Vuc2VlLCBvciBhbnkgdGhpcmQgcGFydHkuIExpY2Vuc2VlIG1heSB1c2UgdGhlIG1hcmsKICAgICBKUHl0aG9uIGluIGNvbm5lY3Rpb24gd2l0aCBMaWNlbnNlZSdzIGRlcml2YXRpdmUgdmVyc2lvbnMgdGhhdCBhcmUKICAgICBiYXNlZCBvbiBvciBpbmNvcnBvcmF0ZSB0aGUgU29mdHdhcmUsIGJ1dCBvbmx5IGluIHRoZSBmb3JtCiAgICAgIkpQeXRob24tYmFzZWQgX19fX19fX19fX19fX19fX19fXywiIG9yIGVxdWl2YWxlbnQuCgogIDUuIENOUkkgaXMgbWFraW5nIHRoZSBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gTGljZW5zZWUgb24gYW4gIkFTIElTIiBiYXNpcy4KICAgICBDTlJJIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQuIEJZIFdBWQogICAgIE9GIEVYQU1QTEUsIEJVVCBOT1QgTElNSVRBVElPTiwgQ05SSSBNQUtFUyBOTyBBTkQgRElTQ0xBSU1TIEFOWQogICAgIFJFUFJFU0VOVEFUSU9OIE9SIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkKICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBXSUxMIE5PVCBJTkZSSU5HRQogICAgIEFOWSBUSElSRCBQQVJUWSBSSUdIVFMuCgogIDYuIENOUkkgU0hBTEwgTk9UIEJFIExJQUJMRSBUTyBMSUNFTlNFRSBPUiBPVEhFUiBVU0VSUyBPRiBUSEUgU09GVFdBUkUgRk9SCiAgICAgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIExPU1MgQVMgQSBSRVNVTFQgT0YKICAgICBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUsIE9SIEFOWSBERVJJVkFUSVZFCiAgICAgVEhFUkVPRiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBUSEVSRU9GLiBTT01FIFNUQVRFUyBETyBOT1QKICAgICBBTExPVyBUSEUgTElNSVRBVElPTiBPUiBFWENMVVNJT04gT0YgTElBQklMSVRZIFNPIFRIRSBBQk9WRSBESVNDTEFJTUVSCiAgICAgTUFZIE5PVCBBUFBMWSBUTyBMSUNFTlNFRS4KCiAgNy4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBtYXkgYmUgdGVybWluYXRlZCBieSBDTlJJIChpKSBpbW1lZGlhdGVseSB1cG9uCiAgICAgd3JpdHRlbiBub3RpY2UgZnJvbSBDTlJJIG9mIGFueSBtYXRlcmlhbCBicmVhY2ggYnkgdGhlIExpY2Vuc2VlLCBpZiB0aGUKICAgICBuYXR1cmUgb2YgdGhlIGJyZWFjaCBpcyBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIHByb21wdGx5IHJlbWVkaWVkOyBvcgogICAgIChpaSkgc2l4dHkgKDYwKSBkYXlzIGZvbGxvd2luZyBub3RpY2UgZnJvbSBDTlJJIHRvIExpY2Vuc2VlIG9mIGEKICAgICBtYXRlcmlhbCByZW1lZGlhYmxlIGJyZWFjaCwgaWYgTGljZW5zZWUgaGFzIG5vdCByZW1lZGllZCBzdWNoIGJyZWFjaAogICAgIHdpdGhpbiB0aGF0IHNpeHR5LWRheSBwZXJpb2QuCgogIDguIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgc2hhbGwgYmUgZ292ZXJuZWQgYnkgYW5kIGludGVycHJldGVkIGluIGFsbAogICAgIHJlc3BlY3RzIGJ5IHRoZSBsYXcgb2YgdGhlIFN0YXRlIG9mIFZpcmdpbmlhLCBleGNsdWRpbmcgY29uZmxpY3Qgb2YgbGF3CiAgICAgcHJvdmlzaW9ucy4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBzaGFsbCBiZSBkZWVtZWQgdG8gY3JlYXRlIGFueQogICAgIHJlbGF0aW9uc2hpcCBvZiBhZ2VuY3ksIHBhcnRuZXJzaGlwLCBvciBqb2ludCB2ZW50dXJlIGJldHdlZW4gQ05SSSBhbmQKICAgICBMaWNlbnNlZS4KCiAgOS4gQnkgY2xpY2tpbmcgb24gdGhlICJBQ0NFUFQiIGJ1dHRvbiB3aGVyZSBpbmRpY2F0ZWQsIG9yIGJ5IGluc3RhbGxpbmcsCiAgICAgY29weWluZyBvciBvdGhlcndpc2UgdXNpbmcgdGhlIFNvZnR3YXJlLCBMaWNlbnNlZSBhZ3JlZXMgdG8gYmUgYm91bmQgYnkKICAgICB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudC4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZXM6IAogYWN0aXZhdGlvbi0xLjEuamFyLCAKIGpheGItYXBpLTIuMS5qYXIsIAogamF4Yi1pbXBsLTIuMS43LmphciwgCiBqYXhiLXhqYy0yLjEuNy5qYXIsIAoganNyMTgxLWFwaS0xLjAtTVIxLmphciwgCiBqc3IyNTAtYXBpLTEuMC5qYXIsIAogamF4d3MtYXBpLTIuMS5qYXIsIAogc2VydmxldC1hcGktMi41LmphciwgCiBzdGF4LWFwaS0xLjAtMi5qYXIKYXJlIHJlZGlzdHJpYnV0ZWQgaW4gZXhlY3V0YWJsZSBmb3JtLCB3aXRoIHNvdXJjZSBjb2RlIGF2YWlsYWJsZSBhdAogaHR0cHM6Ly9qYXgtd3Mtc291cmNlcy5kZXYuamF2YS5uZXQvc291cmNlL2Jyb3dzZS9qYXgtd3Mtc291cmNlcy8KIGh0dHBzOi8vamF4YjItc291cmNlcy5kZXYuamF2YS5uZXQvCmFuZCBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZToKCiAgICBDb3B5cmlnaHQgKGMpIDIwMDYsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KCkNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCgoKICAgICAgMS4gRGVmaW5pdGlvbnMuCgogICAgICAgICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0CiAgICAgICAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCgogICAgICAgICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlCiAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQogICAgICAgICAgICBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAogICAgICAgICAgICBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgoKICAgICAgICAgICAgMS4zLiAiQ292ZXJlZCBTb2Z0d2FyZSIgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IKICAgICAgICAgICAgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMKICAgICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcKICAgICAgICAgICAgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgoKICAgICAgICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0KICAgICAgICAgICAgb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4gCgogICAgICAgICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5CiAgICAgICAgICAgIHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMKICAgICAgICAgICAgTGljZW5zZS4gCiAgICAgICAgICAgIAogICAgICAgICAgICAxLjYuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQKICAgICAgICAgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZQogICAgICAgICAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCgogICAgICAgICAgICAxLjcuICJMaWNlbnNlIiBtZWFucyB0aGlzIGRvY3VtZW50LgoKICAgICAgICAgICAgMS44LiAiTGljZW5zYWJsZSIgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlCiAgICAgICAgICAgIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsCiAgICAgICAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cwogICAgICAgICAgICBjb252ZXllZCBoZXJlaW4uCiAgICAgICAgICAgIAogICAgICAgICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUKICAgICAgICAgICAgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzogCgogICAgICAgICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywKICAgICAgICAgICAgICAgICAgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEKICAgICAgICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzCiAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IAoKICAgICAgICAgICAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlCiAgICAgICAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgCgogICAgICAgICAgICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZQogICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCiAgICAgICAgICAgIDEuMTAuICJPcmlnaW5hbCBTb2Z0d2FyZSIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZAogICAgICAgICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAKCiAgICAgICAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQKICAgICAgICAgICAgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLAogICAgICAgICAgICBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50CiAgICAgICAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gCgogICAgICAgICAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIKICAgICAgICAgICAgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikKICAgICAgICAgICAgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgoKICAgICAgICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsCiAgICAgICAgICAgIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZgogICAgICAgICAgICB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IgogICAgICAgICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcwogICAgICAgICAgICB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMKICAgICAgICAgICAgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdCBvcgogICAgICAgICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKICAgICAgICAgICAgZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcAogICAgICAgICAgICBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzCiAgICAgICAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgoKICAgICAgMi4gTGljZW5zZSBHcmFudHMuIAoKICAgICAgICAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCgogICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAogICAgICAgICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZQogICAgICAgICAgICBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCiAgICAgICAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiAKCiAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCiAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsCiAgICAgICAgICAgICAgICAgIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sCiAgICAgICAgICAgICAgICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcgogICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsCiAgICAgICAgICAgICAgICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZCAKCiAgICAgICAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLAogICAgICAgICAgICAgICAgICB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlCiAgICAgICAgICAgICAgICAgIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yCiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IKICAgICAgICAgICAgICAgICAgcG9ydGlvbnMgdGhlcmVvZikuIAoKICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpCiAgICAgICAgICAgICAgICAgIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QKICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQogICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcwogICAgICAgICAgICAgICAgICBMaWNlbnNlLiAKCiAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudAogICAgICAgICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbQogICAgICAgICAgICAgICAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cwogICAgICAgICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbAogICAgICAgICAgICAgICAgICBTb2Z0d2FyZSwgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsCiAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4gCgogICAgICAgICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgoKICAgICAgICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQKICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoCiAgICAgICAgICAgIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLAogICAgICAgICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6CgogICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbgogICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvCiAgICAgICAgICAgICAgICAgIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UKICAgICAgICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoCiAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuCiAgICAgICAgICAgICAgICAgIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMKICAgICAgICAgICAgICAgICAgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKICAgICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywKICAgICAgICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoCiAgICAgICAgICAgICAgICAgIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoCiAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwKICAgICAgICAgICAgICAgICAgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKQogICAgICAgICAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMKICAgICAgICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMKICAgICAgICAgICAgICAgICAgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24KICAgICAgICAgICAgICAgICAgKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLiAKCiAgICAgICAgICAgICAgICAgIChjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjIoYSkgYW5kCiAgICAgICAgICAgICAgICAgIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0CiAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucwogICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4gCgogICAgICAgICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQKICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IKICAgICAgICAgICAgICAgICAgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvcgogICAgICAgICAgICAgICAgICBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5CiAgICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKSB0aGUKICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IKICAgICAgICAgICAgICAgICAgd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlCiAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKSB1bmRlcgogICAgICAgICAgICAgICAgICBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZQogICAgICAgICAgICAgICAgICBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLiAKCiAgICAgIDMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KCiAgICAgICAgICAgIDMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgoKICAgICAgICAgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZQogICAgICAgICAgICBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbgogICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZQogICAgICAgICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0CiAgICAgICAgICAgIGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlCiAgICAgICAgICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3IKICAgICAgICAgICAgb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkKICAgICAgICAgICAgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4KICAgICAgICAgICAgb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEKICAgICAgICAgICAgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkCiAgICAgICAgICAgIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KCiAgICAgICAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4KCiAgICAgICAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UKICAgICAgICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91CiAgICAgICAgICAgIHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91cgogICAgICAgICAgICBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8KICAgICAgICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCgogICAgICAgICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuCgogICAgICAgICAgICBZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zCiAgICAgICAgICAgIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uCiAgICAgICAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IKICAgICAgICAgICAgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IKICAgICAgICAgICAgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZwogICAgICAgICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgoKICAgICAgICAgICAgMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLgoKICAgICAgICAgICAgWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZAogICAgICAgICAgICBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUKICAgICAgICAgICAgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycKICAgICAgICAgICAgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYQogICAgICAgICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQogICAgICAgICAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuCiAgICAgICAgICAgIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24KICAgICAgICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQogICAgICAgICAgICBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LAogICAgICAgICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieQogICAgICAgICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbAogICAgICAgICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkCiAgICAgICAgICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mCiAgICAgICAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KICAgICAgICAgIAoKICAgICAgICAgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KCiAgICAgICAgICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkCiAgICAgICAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zCiAgICAgICAgICAgIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMKICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4KICAgICAgICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlCiAgICAgICAgICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdAogICAgICAgICAgICBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtCiAgICAgICAgICAgIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UKICAgICAgICAgICAgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYQogICAgICAgICAgICBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQKICAgICAgICAgICAgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UKICAgICAgICAgICAgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdQogICAgICAgICAgICBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkKICAgICAgICAgICAgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwKICAgICAgICAgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMKICAgICAgICAgICAgWW91IG9mZmVyLgoKICAgICAgICAgICAgMy42LiBMYXJnZXIgV29ya3MuCgogICAgICAgICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlCiAgICAgICAgICAgIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQogICAgICAgICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaAogICAgICAgICAgICBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZQogICAgICAgICAgICBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gCiAgICAgICAgICAgIAogICAgICA0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4gCgogICAgICAgICAgICA0LjEuIE5ldyBWZXJzaW9ucy4KCiAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZAogICAgICAgICAgICBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlCiAgICAgICAgICAgIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhCiAgICAgICAgICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4KICAgICAgICAgICAgU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZQogICAgICAgICAgICByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLiAKCiAgICAgICAgICAgIDQuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KCiAgICAgICAgICAgIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UKICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQogICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkCiAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYQogICAgICAgICAgICBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcKICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueQogICAgICAgICAgICBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kCiAgICAgICAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAogICAgICAgICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvCiAgICAgICAgICAgIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZQogICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlCiAgICAgICAgICAgIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuIAoKICAgICAgICAgICAgNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KCiAgICAgICAgICAgIFdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEKICAgICAgICAgICAgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZAogICAgICAgICAgICB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUKICAgICAgICAgICAgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMKICAgICAgICAgICAgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQKICAgICAgICAgICAgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgogICAgICAgICAgICAKCiAgICAgIDUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCgogICAgICBDT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiCiAgICAgIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCiAgICAgIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQKICAgICAgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSCiAgICAgIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQKICAgICAgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkKICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRQogICAgICBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRgogICAgICBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRgogICAgICBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgogICAgICBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUwogICAgICBESVNDTEFJTUVSLiAKCiAgICAgIDYuIFRFUk1JTkFUSU9OLiAKCiAgICAgICAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwKICAgICAgICAgICAgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMKICAgICAgICAgICAgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YKICAgICAgICAgICAgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIKICAgICAgICAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZgogICAgICAgICAgICB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KCiAgICAgICAgICAgIDYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZwogICAgICAgICAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yCiAgICAgICAgICAgIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0CiAgICAgICAgICAgIHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzICJQYXJ0aWNpcGFudCIpCiAgICAgICAgICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZQogICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yCiAgICAgICAgICAgIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlCiAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkKICAgICAgICAgICAgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yCiAgICAgICAgICAgIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsCiAgICAgICAgICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpCiAgICAgICAgICAgIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMKICAgICAgICAgICAgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50CiAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uCiAgICAgICAgICAgIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkKICAgICAgICAgICAgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUKICAgICAgICAgICAgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlcgogICAgICAgICAgICB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoCiAgICAgICAgICAgIFBhcnRpY2lwYW50LgoKICAgICAgICAgICAgNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMgogICAgICAgICAgICBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZAogICAgICAgICAgICBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbgogICAgICAgICAgICAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikKICAgICAgICAgICAgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KCiAgICAgIDcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgoKICAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUKICAgICAgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GCiAgICAgIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRQogICAgICBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUgogICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQKICAgICAgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLCiAgICAgIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUgogICAgICBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOCiAgICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRgogICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwKICAgICAgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQKICAgICAgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPCiAgICAgIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUgogICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QKICAgICAgQVBQTFkgVE8gWU9VLgoKICAgICAgOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KCiAgICAgIFRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcwogICAgICBkZWZpbmVkIGluIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAiY29tbWVyY2lhbAogICAgICBjb21wdXRlciBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiAKICAgICAgMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUKICAgICAgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LgogICAgICAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xCiAgICAgIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMKICAgICAgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KICAgICAgVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywKICAgICAgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcwogICAgICBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCgogICAgICA5LiBNSVNDRUxMQU5FT1VTLgoKICAgICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QKICAgICAgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQogICAgICB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZQogICAgICBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZQogICAgICBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlCiAgICAgIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudAogICAgICBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaAogICAgICBqdXJpc2RpY3Rpb24ncyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24KICAgICAgcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZgogICAgICB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEKICAgICAgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcKICAgICAgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQKICAgICAgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlCiAgICAgIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlCiAgICAgIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IKICAgICAgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsCiAgICAgIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuCiAgICAgIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgICAgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0CiAgICAgIGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsCiAgICAgIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgoKICAgICAgMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCgogICAgICBBcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzCiAgICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IKICAgICAgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlCiAgICAgIGFuZCBZb3UgYWdyZWUgdG8gd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8KICAgICAgZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZwogICAgICBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbgogICAgICBvZiBsaWFiaWxpdHkuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgSlJ1YnkgZmlsZToKIGpydWJ5LWNvbXBsZXRlLTEuMS4zLmphcgphbmQgd3NkbDRqIGZpbGU6CiB3c2RsNGotMS42LjIuamFyCmFyZSByZWRpc3RyaWJ1dGVkIGluIGV4ZWN1dGFibGUgZm9ybSwgd2l0aCBzb3VyY2UgY29kZSBhdmFpbGFibGUgYXQKIGh0dHA6Ly9qcnVieS5vcmcvCiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dzZGw0ai8KYW5kIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgoKQ29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAKClRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgoKMS4gREVGSU5JVElPTlMKCiJDb250cmlidXRpb24iIG1lYW5zOgoKICAgICAgYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAogICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CgogICAgICBpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKCiAgICAgIGlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CgogICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uIAoKIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgoKIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgoKIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KCiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgoKMi4gR1JBTlQgT0YgUklHSFRTCgogICAgICBhKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4KCiAgICAgIGIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gCgogICAgICBjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgoKICAgICAgZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gCgozLiBSRVFVSVJFTUVOVFMKCkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKCiAgICAgIGEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKCiAgICAgIGIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKCiAgICAgIGkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IAoKICAgICAgaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyAKCiAgICAgIGlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCgogICAgICBpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4gCgpXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CgogICAgICBhKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgCgogICAgICBiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gCgpDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCgpFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KCjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCgpDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgoKRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCgo1LiBOTyBXQVJSQU5UWQoKRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KCjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCgpFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgoKNy4gR0VORVJBTAoKSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCgpJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgoKQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCgpFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgoKVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLiAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmaWxlOgogYmFja3BvcnQtdXRpbC1jb25jdXJyZW50LTMuMS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgpUaGUgc29mdHdhcmUgY29tcHJpc2luZyBiYWNrcG9ydC11dGlsLWNvbmN1cnJlbnQgaXMgYmFzZWQgaW4gbGFyZ2UKcGFydCBvbiB0aGUgY29kZSBmcm9tIEpTUjE2NiwgYW5kIHRoZSBwYWNrYWdlIGRsLnV0aWwuY29uY3VycmVudC4KVGhlIHNvZnR3YXJlIGhhcyBiZWVuIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQ6Cmh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbiwgZXhjZXB0aW5nIHBvcnRpb25zCm9mIHRoZSBjbGFzcwplZHUuZW1vcnkubWF0aGNzLmJhY2twb3J0LmphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0LAp3aGljaCB3ZXJlIGFkYXB0ZWQgZnJvbSBjbGFzcyBqYXZhLnV0aWwuQXJyYXlMaXN0LCB3cml0dGVuIGJ5IFN1bgpNaWNyb3N5c3RlbXMsIEluYywgd2hpY2ggYXJlIHVzZWQgd2l0aCBraW5kIHBlcm1pc3Npb24sIGFuZCBzdWJqZWN0CnRvIHRoZSBmb2xsb3dpbmc6CgpDb3B5cmlnaHQgMjAwMi0yMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzCnN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zLgoKICAiU3VuIGhlcmVieSBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCBub24tdHJhbnNmZXJyYWJsZQogIGxpY2Vuc2UgdG8gdXNlIGFuZCBkaXN0cmlidXRlIHRoZSBKYXZhIFNvZnR3YXJlIHRlY2hub2xvZ2llcyBhcyBwYXJ0CiAgb2YgYSBsYXJnZXIgd29yayBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKICAgLU5laXRoZXIgdGhlIG5hbWUgb2Ygb3IgdHJhZGVtYXJrcyBvZiBTdW4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvcgogICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlIEphdmEgU29mdHdhcmUgdGVjaG5vbG9neSB3aXRob3V0CiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgogICAtUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBvciBiaW5hcnkgY29kZSBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZQogICAgZm9sbG93aW5nIG5vdGljZSBhbmQgZGlzY2xhaW1lcnM6CgogICAgUG9ydGlvbnMgY29weXJpZ2h0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gVXNlZCB3aXRoIGtpbmQgcGVybWlzc2lvbi4KCiAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIEFTIElTLCB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuICBBTEwKICAgIEVYUFJFU1MgT1IgSU1QTElFRCBDT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5ECiAgICBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZIElNUExJRUQgV0FSUkFOVFkgT0YKICAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUE9TRSBPUgogICAgTk9OLUlORlJJTkdFTUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOCiAgICBNSUNST1NZU1RFTVMsIElOQy4gQU5EIElUUyBMSUNFTlNPUlMgU0hBTEwgTk9UIEJFIExJQUJMRQogICAgRk9SIEFOWSBEQU1BR0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GCiAgICBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgT1IgSVRTCiAgICBERVJJVkFUSVZFUy4gSU4gTk8gRVZFTlQgV0lMTCBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIE9SCiAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExPU1QgUkVWRU5VRSwgUFJPRklUIE9SCiAgICBEQVRBLCBPUiBGT1IgRElSRUNULCBJTkRJUkVDVCxDT05TUVVFTlRJQUwsIElOQ0lERU5UQUwKICAgIE9SIFBVTklUSVZFIERBTUFHRVMsIEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GCiAgICBUSEUgVEhFT1JZIE9SIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUgogICAgSU5BQklMSVRZIFRPIFVTRSBTT0ZUV0FSRSwgRVZFTiBJRiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgICBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCgogICAgWW91IGFja25vd2xlZGdlIHRoYXQgU29mdHdhcmUgaXMgbm90IGRlc2lnbmVkLCBsaWNlbnNlZCBvciBpbnRlbmRlZCBmb3IKICAgIHVzZSBpbiB0aGUgZGVzaWduLCBjb25zdHJ1Y3Rpb24sIG9wZXJhdGlvbiBvciBtYWludGVuYW5jZSBvZiBhbnkgbnVjbGVhcgogICAgZmFjaWxpdHkuIgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGU6CiByb21lLTAuOS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0OgoKQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGU6CiBqZG9tLTEuMC5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgokSWQ6IExJQ0VOU0UudHh0LHYgMS4xMSAyMDA0LzAyLzA2IDA5OjMyOjU3IGpodW50ZXIgRXhwICQKCiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgogQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKIGFyZSBtZXQ6CiAKIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cyAKICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCiAKIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCiAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgogICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KIAogSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgCiBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCiBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgogQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgoKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogU1VDSCBEQU1BR0UuCgogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCiBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAogQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCiBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZToKIGR3ci0yLjAuMy5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgovKgoqIENvcHlyaWdodCAyMDA1IEpvZSBXYWxrZXIKKgoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKgoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKgoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZToKIGRvam90b29sa2l0IFYxLjMuMAppcyByZWRpc3RyaWJ1dGVkIGluIGV4ZWN1dGFibGUgZm9ybSBhbmQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoKClRoZSAiTmV3IiBCU0QgTGljZW5zZToKKioqKioqKioqKioqKioqKioqKioqKgoKQ29weXJpZ2h0IChjKSAyMDA1LCBUaGUgRG9qbyBGb3VuZGF0aW9uCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCglsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKCXRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KCWFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRG9qbyBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwoJbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCgl3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQpESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCkZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCkRBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SClNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCk9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCk9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGU6CiBzZXJwLTEuMTIuMC5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIEJTRCBsaWNlbnNlIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQ6CgogQ29weXJpZ2h0IChjKSAyMDAyLCBBLiBBYnJhbSBXaGl0ZQogQWxsIHJpZ2h0cyByZXNlcnZlZC4KCkJTRCBsaWNlbnNlOgoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogCiAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KIAogIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAogIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBub3IgdGhlIG5hbWVzIG9mIAogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyAKICAgIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgCiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIAogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgCiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIAogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIAogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiAKIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIAogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSAKIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIAogREFNQUdFLiAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZToKIGphdmFjYy0zLjIuamFyCmlzIHJlZGlzdHJpYnV0ZWQgaW4gZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBCU0QgbGljZW5zZToKCkNvcHlyaWdodCAoYykgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCAgUmlnaHRzIFJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwphcmUgbWV0OgoKICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAKICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRApUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgpQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCkNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLApFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sClBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgpQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCk5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwpTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZToKIGhvd2wtMS4wLjEtMS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIEJTRCBsaWNlbnNlOgoKQ29weXJpZ2h0IChjKSAyMDA0LCBCdWxsIFMuQS4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAptb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKYXJlIG1ldDoKCiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgCiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgIApUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLApQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwpORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGU6CiB0dXNjYW55LXNkby1hcGktcjIuMS0xLjEuMS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgooYykgQ29weXJpZ2h0IEJFQSBTeXN0ZW1zLCBJbmMuLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAKT3JhY2xlIENvcnBvcmF0aW9uLCBQcmltZXRvbiBUZWNobm9sb2dpZXMgTHRkLiwgUm9ndWUgV2F2ZSBTb2Z0d2FyZSwgU0FQIEFHLiwgClNvZnR3YXJlIEFHLiwgU3VuIE1pY3Jvc3lzdGVtcywgU3liYXNlIEluYy4sIFhjYWxpYSwgWmVuZCBUZWNobm9sb2dpZXMsIAoyMDA1LCAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKTGljZW5zZSBmb3IgdGhlIFNlcnZpY2UgRGF0YSBPYmplY3RzIEphdmFEb2MgYW5kIEludGVyZmFjZSBEZWZpbml0aW9uIGZpbGVzLiAodHVzY2FueS1zZG8tYXBpLXIyLjEtMS4xLjEuamFyKQoKVGhlc2UgZmlsZXMgYmVpbmcgLi4uCmNvbW1vbmovc2RvL0NoYW5nZVN1bW1hcnkkU2V0dGluZy5jbGFzcwpjb21tb25qL3Nkby9DaGFuZ2VTdW1tYXJ5LmNsYXNzCmNvbW1vbmovc2RvL0RhdGFHcmFwaC5jbGFzcwpjb21tb25qL3Nkby9EYXRhT2JqZWN0LmNsYXNzCmNvbW1vbmovc2RvL2hlbHBlci9Db3B5SGVscGVyLmNsYXNzCmNvbW1vbmovc2RvL2hlbHBlci9EYXRhRmFjdG9yeS5jbGFzcwpjb21tb25qL3Nkby9oZWxwZXIvRGF0YUhlbHBlci5jbGFzcwpjb21tb25qL3Nkby9oZWxwZXIvRXF1YWxpdHlIZWxwZXIuY2xhc3MKY29tbW9uai9zZG8vaGVscGVyL0hlbHBlckNvbnRleHQuY2xhc3MKY29tbW9uai9zZG8vaGVscGVyL1R5cGVIZWxwZXIuY2xhc3MKY29tbW9uai9zZG8vaGVscGVyL1hNTERvY3VtZW50LmNsYXNzCmNvbW1vbmovc2RvL2hlbHBlci9YTUxIZWxwZXIuY2xhc3MKY29tbW9uai9zZG8vaGVscGVyL1hTREhlbHBlci5jbGFzcwpjb21tb25qL3Nkby9pbXBsL0V4dGVybmFsaXphYmxlRGVsZWdhdG9yJFJlc29sdmFibGUuY2xhc3MKY29tbW9uai9zZG8vaW1wbC9FeHRlcm5hbGl6YWJsZURlbGVnYXRvci5jbGFzcwpjb21tb25qL3Nkby9Qcm9wZXJ0eS5jbGFzcwpjb21tb25qL3Nkby9TZXF1ZW5jZS5jbGFzcwpjb21tb25qL3Nkby9UeXBlLmNsYXNzCnhtbC9kYXRhZ3JhcGgueHNkCnhtbC9zZG9KYXZhLnhtbAp4bWwvc2RvSmF2YS54c2QKeG1sL3Nkb01vZGVsLnhtbAp4bWwvc2RvTW9kZWwueHNkCnhtbC9zZG9YTUwueG1sCnhtbC9zZG9YTUwueHNkCgoKTGljZW5zZSBmb3IgdGhlIFNlcnZpY2UgRGF0YSBPYmplY3RzIEphdmFEb2MgYW5kIEludGVyZmFjZSBEZWZpbml0aW9uIGZpbGVzLgoKVGhlIFNlcnZpY2UgRGF0YSBPYmplY3RzIFNwZWNpZmljYXRpb24gaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcgCmxpY2Vuc2UuIEJ5IHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCBhbmQgd2lsbCBjb21wbHkgd2l0aCAKdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKClBlcm1pc3Npb24gdG8gY29weSwgZGlzcGxheSBhbmQgZGlzdHJpYnV0ZSB0aGUgU2VydmljZSBEYXRhIE9iamVjdHMgU3BlY2lmaWNhdGlvbiBhbmQvb3IgcG9ydGlvbnMgdGhlcmVvZiwgd2l0aG91dCAKbW9kaWZpY2F0aW9uLCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIApmb2xsb3dpbmcgb24gQUxMIGNvcGllcyBvZiB0aGUgU2VydmljZSBEYXRhIE9iamVjdHMgU3BlY2lmaWNhdGlvbiwgb3IgcG9ydGlvbnMgdGhlcmVvZiwgdGhhdCB5b3UgbWFrZToKCjEuIEEgbGluayBvciBVUkwgdG8gdGhlIFNlcnZpY2UgRGF0YSBPYmplY3RzIFNwZWNpZmljYXRpb24gYXQgdGhpcyBsb2NhdGlvbjoKaHR0cDovL3d3dy5vc29hLm9yZy9kaXNwbGF5L01haW4vU2VydmljZStEYXRhK09iamVjdHMrU3BlY2lmaWNhdGlvbnMKCjIuIFRoZSBmdWxsIHRleHQgb2YgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFzIHNob3duIGluIHRoZSBTZXJ2aWNlIERhdGEgT2JqZWN0cyBTcGVjaWZpY2F0aW9uLgoKQkVBLCBJQk0sIE9yYWNsZSwgUHJpbWV0b24gVGVjaG5vbG9naWVzLCBSb2d1ZSBXYXZlIFNvZnR3YXJlLCBTQVAsIFNvZnR3YXJlIEFHLCBTdW4gTWljcm9zeXN0ZW1zLCBYY2FsaWEsIApaZW5kIFRlY2hub2xvZ2llcyAoY29sbGVjdGl2ZWx5LCB0aGUgk0F1dGhvcnOUKSBhZ3JlZSB0byBncmFudCB5b3UgYSByb3lhbHR5LWZyZWUgbGljZW5zZSwgdW5kZXIgcmVhc29uYWJsZSwgCm5vbi1kaXNjcmltaW5hdG9yeSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0byBwYXRlbnRzIHRoYXQgdGhleSBkZWVtIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgdGhlIFNlcnZpY2UgRGF0YSAKT2JqZWN0cyBTcGVjaWZpY2F0aW9uLiAKClRIRSBTZXJ2aWNlIERhdGEgT2JqZWN0cyBTUEVDSUZJQ0FUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBUSEUgQVVUSE9SUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiAKV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhJUyBTUEVDSUZJQ0FUSU9OIEFORCBUSEUgSU1QTEVNRU5UQVRJT04gT0YgSVRTIENPTlRFTlRTLCAKSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCk5PTi1JTkZSSU5HRU1FTlQgT1IgVElUTEUuIFRIRSBBVVRIT1JTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgCk9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiBSRUxBVElORyBUTyBBTlkgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgU0VSVklDRSBEQVRBIE9CSkVDVFMgClNQRUNJRklDQVRJT04uCgpUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgaW5jbHVkaW5nIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSAKcGVydGFpbmluZyB0byB0aGUgU2VydmljZSBEYXRhIE9iamVjdHMgU3BlY2lmaWNhdGlvbiBvciBpdHMgY29udGVudHMgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciAKcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoZSBTZXJ2aWNlIERhdGEgT2JqZWN0cyBTcGVjaWZpY2F0aW9uIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIHRoZSAKQXV0aG9ycy4KCk5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmaWxlOgogYXNtLTMuMS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgpDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAptb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKYXJlIG1ldDoKCjEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCjIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCjMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQpJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQpBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgpDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgpTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgpUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGU6CiBqYXhlbi0xLjEuMS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0gYW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CgogJElkOiBMSUNFTlNFLnR4dCx2IDEuNSAyMDA2LzAyLzA1IDIxOjQ5OjA0IGVsaGFybyBFeHAgJAoKIENvcHlyaWdodCAyMDAzLTIwMDYgVGhlIFdlcmtlbiBDb21wYW55LiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKIG1ldDoKCiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEpheGVuIFByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMKICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCAKICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCklTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRApUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSCk9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLApFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sClBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgpQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCk5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwpTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZpbGU6CiBodG1scGFyc2VyLTEuMC41LmphcgppcyByZWRpc3RyaWJ1dGVkIGluIGV4ZWN1dGFibGUgZm9ybSBhbmQgaW5jbHVkZXMgZmlsZXMgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKClRoaXMgaXMgZm9yIHRoZSBIVE1MIHBhcnNlciBhcyBhIHdob2xlIGV4Y2VwdCB0aGUgcmV3aW5kYWJsZSBpbnB1dCBzdHJlYW0sCmFuZCB0aGUgTGl2ZSBET00gVmlld2VyLiAKRm9yIHRoZSBjb3B5cmlnaHQgbm90aWNlcyBmb3IgaW5kaXZpZHVhbCBmaWxlcywgcGxlYXNlIHNlZSBpbmRpdmlkdWFsIGZpbGVzLgoKLyoKICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IEhlbnJpIFNpdm9uZW4KICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTW96aWxsYSBGb3VuZGF0aW9uCiAqIFBvcnRpb25zIG9mIGNvbW1lbnRzIENvcHlyaWdodCAyMDA0LTIwMDcgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIE1vemlsbGEgCiAqIEZvdW5kYXRpb24sIGFuZCBPcGVyYSBTb2Z0d2FyZSBBU0EuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIAogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCAKICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiAKICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIAogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCAKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIAogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyAKICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiAKICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKi8KIApUaGUgZm9sbG93aW5nIGxpY2Vuc2UgaXMgZm9yIHRoZSByZXdpbmRhYmxlIGlucHV0IHN0cmVhbS4KCi8qCiAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKICogYXJlIG1ldDoKICoKICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCAKICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQgbm9yIAogKiAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCiAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgCiAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAKICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIAogKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSAKICogUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIAogKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAogKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIAogKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIAogKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KClRoZSBmb2xsb3dpbmcgbGljZW5zZSBhcHBsaWVzIHRvIHRoZSBMaXZlIERPTSBWaWV3ZXI6CgpDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYsIDIwMDggSWFuIEhpY2tzb24gYW5kIHZhcmlvdXMgY29udHJpYnV0b3JzCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZmlsZToKIGppbnRlcmZhY2UtMS41LjMuMS5qYXIKaXMgcmVkaXN0cmlidXRlZCBpbiBleGVjdXRhYmxlIGZvcm0sIHdpdGggc291cmNlIGNvZGUgYXZhaWxhYmxlIGF0CiBodHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMi9vcmcvZXJsYW5nL290cC9qaW50ZXJmYWNlLzEuNS4zLjEvCmFuZCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgoKRVJMQU5HIFBVQkxJQyBMSUNFTlNFClZlcnNpb24gMS4xCgoxLiBEZWZpbml0aW9ucy4KCjEuMS4gYGBDb250cmlidXRvcicnIG1lYW5zIGVhY2ggZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0bwp0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KCjEuMi4gYGBDb250cmlidXRvciBWZXJzaW9uJycgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbApDb2RlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciwgYW5kIHRoZSBNb2RpZmljYXRpb25zCm1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgoKMS4zLiBgYENvdmVyZWQgQ29kZScnIG1lYW5zIHRoZSBPcmlnaW5hbCBDb2RlIG9yIE1vZGlmaWNhdGlvbnMgb3IgdGhlCmNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGFuZCBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UKaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCgoxLjQuIGBgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtJycgbWVhbnMgYSBtZWNoYW5pc20gZ2VuZXJhbGx5CmFjY2VwdGVkIGluIHRoZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgZm9yIHRoZSBlbGVjdHJvbmljCnRyYW5zZmVyIG9mIGRhdGEuCgoxLjUuIGBgRXhlY3V0YWJsZScnIG1lYW5zIENvdmVyZWQgQ29kZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZQpDb2RlLgoKMS42LiBgYEluaXRpYWwgRGV2ZWxvcGVyJycgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IGlkZW50aWZpZWQKYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdApBLgoKMS43LiBgYExhcmdlciBXb3JrJycgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgQ29kZSBvcgpwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCjEuOC4gYGBMaWNlbnNlJycgbWVhbnMgdGhpcyBkb2N1bWVudC4KCjEuOS4gYGBNb2RpZmljYXRpb25zJycgbWVhbnMgYW55IGFkZGl0aW9uIHRvIG9yIGRlbGV0aW9uIGZyb20gdGhlCnN1YnN0YW5jZSBvciBzdHJ1Y3R1cmUgb2YgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGFueSBwcmV2aW91cwpNb2RpZmljYXRpb25zLiBXaGVuIENvdmVyZWQgQ29kZSBpcyByZWxlYXNlZCBhcyBhIHNlcmllcyBvZiBmaWxlcywgYQpNb2RpZmljYXRpb24gaXM6CgpBLiBBbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcKICAgT3JpZ2luYWwgQ29kZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zLiAKCkIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yCiAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuIAoKMS4xMC4gYGBPcmlnaW5hbCBDb2RlJycgbWVhbnMgU291cmNlIENvZGUgb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZQp3aGljaCBpcyBkZXNjcmliZWQgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0IEEgYXMKT3JpZ2luYWwgQ29kZSwgYW5kIHdoaWNoLCBhdCB0aGUgdGltZSBvZiBpdHMgcmVsZWFzZSB1bmRlciB0aGlzCkxpY2Vuc2UgaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZS4KCjEuMTEuIGBgU291cmNlIENvZGUnJyBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIENvdmVyZWQgQ29kZSBmb3IKbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQsIGluY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cwphbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBhbiBFeGVjdXRhYmxlLCBvciBhIGxpc3Qgb2Ygc291cmNlCmNvZGUgZGlmZmVyZW50aWFsIGNvbXBhcmlzb25zIGFnYWluc3QgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yCmFub3RoZXIgd2VsbCBrbm93biwgYXZhaWxhYmxlIENvdmVyZWQgQ29kZSBvZiB0aGUgQ29udHJpYnV0b3IncwpjaG9pY2UuIFRoZSBTb3VyY2UgQ29kZSBjYW4gYmUgaW4gYSBjb21wcmVzc2VkIG9yIGFyY2hpdmFsIGZvcm0sCnByb3ZpZGVkIHRoZSBhcHByb3ByaWF0ZSBkZWNvbXByZXNzaW9uIG9yIGRlLWFyY2hpdmluZyBzb2Z0d2FyZSBpcwp3aWRlbHkgYXZhaWxhYmxlIGZvciBubyBjaGFyZ2UuCgoxLjEyLiBgYFlvdScnIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMKdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbAplbnRpdGllcyxgYFlvdScnIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksCm9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLApgYGNvbnRyb2wnJyBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQpkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgpvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQpvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCgoyLiBTb3VyY2UgQ29kZSBMaWNlbnNlLgoKMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuClRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eQpjbGFpbXM6CgooYSkgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQKICAgIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIENvZGUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIHdpdGggb3Igd2l0aG91dAogICAgTW9kaWZpY2F0aW9ucywgb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgCgooYikgdW5kZXIgcGF0ZW50cyBub3cgb3IgaGVyZWFmdGVyIG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgSW5pdGlhbAogICAgRGV2ZWxvcGVyLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSBhbmQgc2VsbCAoYGBVdGlsaXplJycpIHRoZQogICAgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGJ1dCBzb2xlbHkgdG8gdGhlIGV4dGVudCB0aGF0CiAgICBhbnkgc3VjaCBwYXRlbnQgaXMgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gZW5hYmxlIFlvdSB0byBVdGlsaXplCiAgICB0aGUgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgYW5kIG5vdCB0byBhbnkgZ3JlYXRlcgogICAgZXh0ZW50IHRoYXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBVdGlsaXplIGZ1cnRoZXIgTW9kaWZpY2F0aW9ucyBvcgogICAgY29tYmluYXRpb25zLiAKCjIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCkVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsCm5vbi1leGNsdXNpdmUgbGljZW5zZSwgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKY2xhaW1zOgoKKGEpIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kCiAgICBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IKICAgIHBvcnRpb25zIHRoZXJlb2YpIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyCiAgICBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIENvZGUgb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgCgooYikgdW5kZXIgcGF0ZW50cyBub3cgb3IgaGVyZWFmdGVyIG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgQ29udHJpYnV0b3IsCiAgICB0byBVdGlsaXplIHRoZSBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgYnV0CiAgICBzb2xlbHkgdG8gdGhlIGV4dGVudCB0aGF0IGFueSBzdWNoIHBhdGVudCBpcyByZWFzb25hYmx5IG5lY2Vzc2FyeQogICAgdG8gZW5hYmxlIFlvdSB0byBVdGlsaXplIHRoZSBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucwogICAgdGhlcmVvZiksIGFuZCBub3QgdG8gYW55IGdyZWF0ZXIgZXh0ZW50IHRoYXQgbWF5IGJlIG5lY2Vzc2FyeSB0bwogICAgVXRpbGl6ZSBmdXJ0aGVyIE1vZGlmaWNhdGlvbnMgb3IgY29tYmluYXRpb25zLiAKCjMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KCjMuMS4gQXBwbGljYXRpb24gb2YgTGljZW5zZS4KVGhlIE1vZGlmaWNhdGlvbnMgd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZgp0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gU2VjdGlvbiAyLjIuIFRoZSBTb3VyY2UKQ29kZSB2ZXJzaW9uIG9mIENvdmVyZWQgQ29kZSBtYXkgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMKb2YgdGhpcyBMaWNlbnNlLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGgKZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgWW91IGRpc3RyaWJ1dGUuIFlvdSBtYXkgbm90IG9mZmVyIG9yCmltcG9zZSBhbnkgdGVybXMgb24gYW55IFNvdXJjZSBDb2RlIHZlcnNpb24gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzCnRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMKaGVyZXVuZGVyLiBIb3dldmVyLCBZb3UgbWF5IGluY2x1ZGUgYW4gYWRkaXRpb25hbCBkb2N1bWVudCBvZmZlcmluZwp0aGUgYWRkaXRpb25hbCByaWdodHMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy41LiAKCjMuMi4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgpBbnkgTW9kaWZpY2F0aW9uIHdoaWNoIFlvdSBjb250cmlidXRlIG11c3QgYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlCkNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGVpdGhlciBvbiB0aGUgc2FtZSBtZWRpYSBhcwphbiBFeGVjdXRhYmxlIHZlcnNpb24gb3IgdmlhIGFuIGFjY2VwdGVkIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uCk1lY2hhbmlzbSB0byBhbnlvbmUgdG8gd2hvbSB5b3UgbWFkZSBhbiBFeGVjdXRhYmxlIHZlcnNpb24gYXZhaWxhYmxlOwphbmQgaWYgbWFkZSBhdmFpbGFibGUgdmlhIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSwgbXVzdApyZW1haW4gYXZhaWxhYmxlIGZvciBhdCBsZWFzdCB0d2VsdmUgKDEyKSBtb250aHMgYWZ0ZXIgdGhlIGRhdGUgaXQKaW5pdGlhbGx5IGJlY2FtZSBhdmFpbGFibGUsIG9yIGF0IGxlYXN0IHNpeCAoNikgbW9udGhzIGFmdGVyIGEKc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoYXQgcGFydGljdWxhciBNb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZQphdmFpbGFibGUgdG8gc3VjaCByZWNpcGllbnRzLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0CnRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gaWYgdGhlIEVsZWN0cm9uaWMKRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSBpcyBtYWludGFpbmVkIGJ5IGEgdGhpcmQgcGFydHkuCgozLjMuIERlc2NyaXB0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCllvdSBtdXN0IGNhdXNlIGFsbCBDb3ZlcmVkIENvZGUgdG8gd2hpY2ggeW91IGNvbnRyaWJ1dGUgdG8gY29udGFpbiBhCmZpbGUgZG9jdW1lbnRpbmcgdGhlIGNoYW5nZXMgWW91IG1hZGUgdG8gY3JlYXRlIHRoYXQgQ292ZXJlZCBDb2RlIGFuZAp0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBZb3UgbXVzdCBpbmNsdWRlIGEgcHJvbWluZW50IHN0YXRlbWVudCB0aGF0CnRoZSBNb2RpZmljYXRpb24gaXMgZGVyaXZlZCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgZnJvbSBPcmlnaW5hbApDb2RlIHByb3ZpZGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZQpJbml0aWFsIERldmVsb3BlciBpbiAoYSkgdGhlIFNvdXJjZSBDb2RlLCBhbmQgKGIpIGluIGFueSBub3RpY2UgaW4gYW4KRXhlY3V0YWJsZSB2ZXJzaW9uIG9yIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBpbiB3aGljaCBZb3UgZGVzY3JpYmUgdGhlCm9yaWdpbiBvciBvd25lcnNoaXAgb2YgdGhlIENvdmVyZWQgQ29kZS4KCjMuNC4gSW50ZWxsZWN0dWFsIFByb3BlcnR5IE1hdHRlcnMKCihhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuCiAgICBJZiBZb3UgaGF2ZSBrbm93bGVkZ2UgdGhhdCBhIHBhcnR5IGNsYWltcyBhbiBpbnRlbGxlY3R1YWwgcHJvcGVydHkKICAgIHJpZ2h0IGluIHBhcnRpY3VsYXIgZnVuY3Rpb25hbGl0eSBvciBjb2RlIChvciBpdHMgdXRpbGl6YXRpb24KICAgIHVuZGVyIHRoaXMgTGljZW5zZSksIHlvdSBtdXN0IGluY2x1ZGUgYSB0ZXh0IGZpbGUgd2l0aCB0aGUgc291cmNlCiAgICBjb2RlIGRpc3RyaWJ1dGlvbiB0aXRsZWQgYGBMRUdBTCcnIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2xhaW0gYW5kCiAgICB0aGUgcGFydHkgbWFraW5nIHRoZSBjbGFpbSBpbiBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGEgcmVjaXBpZW50CiAgICB3aWxsIGtub3cgd2hvbSB0byBjb250YWN0LiBJZiB5b3Ugb2J0YWluIHN1Y2gga25vd2xlZGdlIGFmdGVyIFlvdQogICAgbWFrZSBZb3VyIE1vZGlmaWNhdGlvbiBhdmFpbGFibGUgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLCBZb3UKICAgIHNoYWxsIHByb21wdGx5IG1vZGlmeSB0aGUgTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzIFlvdSBtYWtlCiAgICBhdmFpbGFibGUgdGhlcmVhZnRlciBhbmQgc2hhbGwgdGFrZSBvdGhlciBzdGVwcyAoc3VjaCBhcyBub3RpZnlpbmcKICAgIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvCiAgICBpbmZvcm0gdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBDb3ZlcmVkIENvZGUgdGhhdCBuZXcga25vd2xlZGdlIGhhcwogICAgYmVlbiBvYnRhaW5lZC4gCgooYikgQ29udHJpYnV0b3IgQVBJcy4KICAgIElmIFlvdXIgTW9kaWZpY2F0aW9uIGlzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZSBhbmQKICAgIFlvdSBvd24gb3IgY29udHJvbCBwYXRlbnRzIHdoaWNoIGFyZSByZWFzb25hYmx5IG5lY2Vzc2FyeSB0bwogICAgaW1wbGVtZW50IHRoYXQgQVBJLCB5b3UgbXVzdCBhbHNvIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUKICAgIExFR0FMIGZpbGUuIAoKMy41LiBSZXF1aXJlZCBOb3RpY2VzLgpZb3UgbXVzdCBkdXBsaWNhdGUgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEgaW4gZWFjaCBmaWxlIG9mIHRoZSBTb3VyY2UKQ29kZSwgYW5kIHRoaXMgTGljZW5zZSBpbiBhbnkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFNvdXJjZSBDb2RlLCB3aGVyZQpZb3UgZGVzY3JpYmUgcmVjaXBpZW50cycgcmlnaHRzIHJlbGF0aW5nIHRvIENvdmVyZWQgQ29kZS4gSWYgWW91CmNyZWF0ZWQgb25lIG9yIG1vcmUgTW9kaWZpY2F0aW9uKHMpLCBZb3UgbWF5IGFkZCB5b3VyIG5hbWUgYXMgYQpDb250cmlidXRvciB0byB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbiBFeGhpYml0IEEuIElmIGl0IGlzIG5vdApwb3NzaWJsZSB0byBwdXQgc3VjaCBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIFNvdXJjZSBDb2RlIGZpbGUgZHVlIHRvCml0cyBzdHJ1Y3R1cmUsIHRoZW4geW91IG11c3QgaW5jbHVkZSBzdWNoIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoCmFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5IGZpbGUpIHdoZXJlIGEgdXNlciB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vayBmb3IKc3VjaCBhIG5vdGljZS4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYSBmZWUgZm9yLAp3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZQpyZWNpcGllbnRzIG9mIENvdmVyZWQgQ29kZS4gSG93ZXZlciwgWW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duCmJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueQpDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYW4gYW55IHN1Y2ggd2FycmFudHksCnN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwKYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkKQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yCnN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvcgpsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgoKMy42LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KWW91IG1heSBkaXN0cmlidXRlIENvdmVyZWQgQ29kZSBpbiBFeGVjdXRhYmxlIGZvcm0gb25seSBpZiB0aGUKcmVxdWlyZW1lbnRzIG9mIFNlY3Rpb24gMy4xLTMuNSBoYXZlIGJlZW4gbWV0IGZvciB0aGF0IENvdmVyZWQgQ29kZSwKYW5kIGlmIFlvdSBpbmNsdWRlIGEgbm90aWNlIHN0YXRpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiBvZgp0aGUgQ292ZXJlZCBDb2RlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAppbmNsdWRpbmcgYSBkZXNjcmlwdGlvbiBvZiBob3cgYW5kIHdoZXJlIFlvdSBoYXZlIGZ1bGZpbGxlZCB0aGUKb2JsaWdhdGlvbnMgb2YgU2VjdGlvbiAzLjIuIFRoZSBub3RpY2UgbXVzdCBiZSBjb25zcGljdW91c2x5IGluY2x1ZGVkCmluIGFueSBub3RpY2UgaW4gYW4gRXhlY3V0YWJsZSB2ZXJzaW9uLCByZWxhdGVkIGRvY3VtZW50YXRpb24gb3IKY29sbGF0ZXJhbCBpbiB3aGljaCBZb3UgZGVzY3JpYmUgcmVjaXBpZW50cycgcmlnaHRzIHJlbGF0aW5nIHRvIHRoZQpDb3ZlcmVkIENvZGUuIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIG9mIENvdmVyZWQKQ29kZSB1bmRlciBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudApmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMKb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIGRvZXMKbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudCdzIHJpZ2h0cyBpbiB0aGUgU291cmNlCkNvZGUgdmVyc2lvbiBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91CmRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgdmVyc2lvbiB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIFlvdSBtdXN0Cm1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UKYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueQpDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZApldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIKb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCgozLjcuIExhcmdlciBXb3Jrcy4KWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBDb2RlIHdpdGggb3RoZXIgY29kZQpub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyCldvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUKcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBDb2RlLgoKNC4gSW5hYmlsaXR5IHRvIENvbXBseSBEdWUgdG8gU3RhdHV0ZSBvciBSZWd1bGF0aW9uLgpJZiBpdCBpcyBpbXBvc3NpYmxlIGZvciBZb3UgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSB0ZXJtcyBvZiB0aGlzCkxpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBDb3ZlcmVkIENvZGUgZHVlIHRvIHN0YXR1dGUKb3IgcmVndWxhdGlvbiB0aGVuIFlvdSBtdXN0OiAoYSkgY29tcGx5IHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQp0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGU7IGFuZCAoYikgZGVzY3JpYmUgdGhlIGxpbWl0YXRpb25zIGFuZAp0aGUgY29kZSB0aGV5IGFmZmVjdC4gU3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBMRUdBTApmaWxlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuNCBhbmQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGFsbApkaXN0cmlidXRpb25zIG9mIHRoZSBTb3VyY2UgQ29kZS4gRXhjZXB0IHRvIHRoZSBleHRlbnQgcHJvaGliaXRlZCBieQpzdGF0dXRlIG9yIHJlZ3VsYXRpb24sIHN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZSBzdWZmaWNpZW50bHkgZGV0YWlsZWQKZm9yIGEgcmVjaXBpZW50IG9mIG9yZGluYXJ5IHNraWxsIHRvIGJlIGFibGUgdG8gdW5kZXJzdGFuZCBpdC4KCjUuIEFwcGxpY2F0aW9uIG9mIHRoaXMgTGljZW5zZS4KClRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGNvZGUgdG8gd2hpY2ggdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhhcwphdHRhY2hlZCB0aGUgbm90aWNlIGluIEV4aGliaXQgQSwgYW5kIHRvIHJlbGF0ZWQgQ292ZXJlZCBDb2RlLgoKNi4gQ09OTkVDVElPTiBUTyBNT1pJTExBIFBVQkxJQyBMSUNFTlNFCgpUaGlzIEVybGFuZyBMaWNlbnNlIGlzIGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBNb3ppbGxhIFB1YmxpYwpMaWNlbnNlLCBWZXJzaW9uIDEuMC4gSXQgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIE1vemlsbGEKUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wLgoKNy4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KCkNPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gYGBBUyBJUycnIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywKV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GCkRFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgpOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRgpUSEUgQ09WRVJFRCBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUKSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIKQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SCkNPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVApPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSCkVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCgo4LiBURVJNSU5BVElPTi4KVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlCmF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUKc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gQWxsCnN1YmxpY2Vuc2VzIHRvIHRoZSBDb3ZlcmVkIENvZGUgd2hpY2ggYXJlIHByb3Blcmx5IGdyYW50ZWQgc2hhbGwKc3Vydml2ZSBhbnkgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcgpuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZQpzaGFsbCBzdXJ2aXZlLgoKOS4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKQW55IHV0aWxpemF0aW9uIG9mIENvdmVyZWQgQ29kZSBzaGFsbCBub3QgY2F1c2UgdGhlIEluaXRpYWwgRGV2ZWxvcGVyCm9yIGFueSBDb250cmlidXRvciB0byBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIChuZWl0aGVyIGRpcmVjdCBub3IKaW5kaXJlY3QpLgoKMTAuIE1JU0NFTExBTkVPVVMKVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHRoZSBzdWJqZWN0Cm1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoCnByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQKZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBjb25zdHJ1ZWQgYnkgYW5kIGluIGFjY29yZGFuY2Ugd2l0aAp0aGUgc3Vic3RhbnRpdmUgbGF3cyBvZiBTd2VkZW4uIEFueSBkaXNwdXRlLCBjb250cm92ZXJzeSBvciBjbGFpbQphcmlzaW5nIG91dCBvZiBvciByZWxhdGluZyB0byB0aGlzIExpY2Vuc2UsIG9yIHRoZSBicmVhY2gsIHRlcm1pbmF0aW9uCm9yIGludmFsaWRpdHkgdGhlcmVvZiwgc2hhbGwgYmUgc3ViamVjdCB0byB0aGUgZXhjbHVzaXZlIGp1cmlzZGljdGlvbgpvZiBTd2VkaXNoIGNvdXJ0cywgd2l0aCB0aGUgU3RvY2tob2xtIENpdHkgQ291cnQgYXMgdGhlIGZpcnN0Cmluc3RhbmNlLgogICAgCkVYSElCSVQgQS4KCmBgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgRXJsYW5nIFB1YmxpYyBMaWNlbnNlLApWZXJzaW9uIDEuMSwgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgpjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlCkVybGFuZyBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmUuIElmIG5vdCwgaXQgY2FuIGJlCnJldHJpZXZlZCB2aWEgdGhlIHdvcmxkIHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZXJsYW5nLm9yZy8uCgpTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCmJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwp1bmRlciB0aGUgTGljZW5zZS4KClRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBFcmljc3NvbiBVdHZlY2tsaW5ncyBBQi4KUG9ydGlvbnMgY3JlYXRlZCBieSBFcmljc3NvbiBhcmUgQ29weXJpZ2h0IDE5OTksIEVyaWNzc29uIFV0dmVja2xpbmdzCkFCLiBBbGwgUmlnaHRzIFJlc2VydmVkLicnCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K