Data License

Introduction

CycloneDX enables the declaration of data licenses at both the BOM and component levels, offering robust support for managing licensing requirements and restrictions. A BOM-level license can reflect overarching agreements, such as a Non-Disclosure Agreement (NDA) or proprietary licensing terms, that govern how the entire BOM and its data can be used. This ensures that sensitive data is handled in accordance with specific contractual obligations, including restrictions on sharing, redistribution, or unauthorized use.

By also allowing licenses to be specified for individual data components, CycloneDX provides a granular approach to license management. This flexibility ensures that organizations can align their BOM and data licensing practices with internal policies and external regulatory requirements, while also safeguarding sensitive or proprietary information.

This example illustrates how to declare and manage data licenses at both the BOM and component levels. At the BOM level, the metadata includes a custom license, "Acme Customer Data License," with restrictions encoded in base64 text, signaling compliance with proprietary agreements such as NDAs.

At the component level, the dataset component "Acme Datasets" references the Open Data Commons Open Database License (ODbL-1.0), providing transparency for open data licensing. Each dataset within the component ("Acme Dataset #1" and "Acme Dataset #2") includes URLs for specific data resources, offering a detailed inventory of the licensed contents.

Examples

{
  "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
  "version": 1,
  "metadata": {
    "supplier": {
      "name": "Acme Inc",
      "url": [ "https://example.com" ]
    },
    "licenses": [
      {
        "license": {
          "name": "Acme Customer Data License",
          "text": {
            "contentType": "text/plain",
            "encoding": "base64",
            "content": "VGhlIHRleHQgZm9yIHRoZSBsaWNlbnNlIGdvZXMgaGVyZS4="
          }
        }
      }  
    ]
  },
  "components": [
    {
      "type": "data",
      "name": "Acme Datasets",
      "version": "3.7.1",
      "licenses": [
        {
          "license": {
            "id": "ODbL-1.0",
            "acknowledgement": "declared",
            "text": {
              "contentType": "text/plain",
              "encoding": "base64",
              "content": "IyMgT0RDIE9wZW4gRGF0YWJhc2UgTGljZW5zZSAoT0RiTCkKCiMjIyBQcmVhbWJsZQoKVGhlIE9wZW4gRGF0YWJhc2UgTGljZW5zZSAoT0RiTCkgaXMgYSBsaWNlbnNlIGFncmVlbWVudCBpbnRlbmRlZCB0bwphbGxvdyB1c2VycyB0byBmcmVlbHkgc2hhcmUsIG1vZGlmeSwgYW5kIHVzZSB0aGlzIERhdGFiYXNlIHdoaWxlCm1haW50YWluaW5nIHRoaXMgc2FtZSBmcmVlZG9tIGZvciBvdGhlcnMuIE1hbnkgZGF0YWJhc2VzIGFyZSBjb3ZlcmVkIGJ5CmNvcHlyaWdodCwgYW5kIHRoZXJlZm9yZSB0aGlzIGRvY3VtZW50IGxpY2Vuc2VzIHRoZXNlIHJpZ2h0cy4gU29tZQpqdXJpc2RpY3Rpb25zLCBtYWlubHkgaW4gdGhlIEV1cm9wZWFuIFVuaW9uLCBoYXZlIHNwZWNpZmljIHJpZ2h0cyB0aGF0CmNvdmVyIGRhdGFiYXNlcywgYW5kIHNvIHRoZSBPRGJMIGFkZHJlc3NlcyB0aGVzZSByaWdodHMsIHRvby4gRmluYWxseSwKdGhlIE9EYkwgaXMgYWxzbyBhbiBhZ3JlZW1lbnQgaW4gY29udHJhY3QgZm9yIHVzZXJzIG9mIHRoaXMgRGF0YWJhc2UgdG8KYWN0IGluIGNlcnRhaW4gd2F5cyBpbiByZXR1cm4gZm9yIGFjY2Vzc2luZyB0aGlzIERhdGFiYXNlLgoKRGF0YWJhc2VzIGNhbiBjb250YWluIGEgd2lkZSB2YXJpZXR5IG9mIHR5cGVzIG9mIGNvbnRlbnQgKGltYWdlcywKYXVkaW92aXN1YWwgbWF0ZXJpYWwsIGFuZCBzb3VuZHMgYWxsIGluIHRoZSBzYW1lIGRhdGFiYXNlLCBmb3IgZXhhbXBsZSksCmFuZCBzbyB0aGUgT0RiTCBvbmx5IGdvdmVybnMgdGhlIHJpZ2h0cyBvdmVyIHRoZSBEYXRhYmFzZSwgYW5kIG5vdCB0aGUKY29udGVudHMgb2YgdGhlIERhdGFiYXNlIGluZGl2aWR1YWxseS4gTGljZW5zb3JzIHNob3VsZCB1c2UgdGhlIE9EYkwKdG9nZXRoZXIgd2l0aCBhbm90aGVyIGxpY2Vuc2UgZm9yIHRoZSBjb250ZW50cywgaWYgdGhlIGNvbnRlbnRzIGhhdmUgYQpzaW5nbGUgc2V0IG9mIHJpZ2h0cyB0aGF0IHVuaWZvcm1seSBjb3ZlcnMgYWxsIG9mIHRoZSBjb250ZW50cy4gSWYgdGhlCmNvbnRlbnRzIGhhdmUgbXVsdGlwbGUgc2V0cyBvZiBkaWZmZXJlbnQgcmlnaHRzLCBMaWNlbnNvcnMgc2hvdWxkCmRlc2NyaWJlIHdoYXQgcmlnaHRzIGdvdmVybiB3aGF0IGNvbnRlbnRzIHRvZ2V0aGVyIGluIHRoZSBpbmRpdmlkdWFsCnJlY29yZCBvciBpbiBzb21lIG90aGVyIHdheSB0aGF0IGNsYXJpZmllcyB3aGF0IHJpZ2h0cyBhcHBseS4gCgpTb21ldGltZXMgdGhlIGNvbnRlbnRzIG9mIGEgZGF0YWJhc2UsIG9yIHRoZSBkYXRhYmFzZSBpdHNlbGYsIGNhbiBiZQpjb3ZlcmVkIGJ5IG90aGVyIHJpZ2h0cyBub3QgYWRkcmVzc2VkIGhlcmUgKHN1Y2ggYXMgcHJpdmF0ZSBjb250cmFjdHMsCnRyYWRlIG1hcmsgb3ZlciB0aGUgbmFtZSwgb3IgcHJpdmFjeSByaWdodHMgLyBkYXRhIHByb3RlY3Rpb24gcmlnaHRzCm92ZXIgaW5mb3JtYXRpb24gaW4gdGhlIGNvbnRlbnRzKSwgYW5kIHNvIHlvdSBhcmUgYWR2aXNlZCB0aGF0IHlvdSBtYXkKaGF2ZSB0byBjb25zdWx0IG90aGVyIGRvY3VtZW50cyBvciBjbGVhciBvdGhlciByaWdodHMgYmVmb3JlIGRvaW5nCmFjdGl2aXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgoKLS0tLS0tCgpUaGUgTGljZW5zb3IgKGFzIGRlZmluZWQgYmVsb3cpIAoKYW5kIAoKWW91IChhcyBkZWZpbmVkIGJlbG93KSAKCmFncmVlIGFzIGZvbGxvd3M6IAoKIyMjIDEuMCBEZWZpbml0aW9ucyBvZiBDYXBpdGFsaXNlZCBXb3JkcwoKIkNvbGxlY3RpdmUgRGF0YWJhc2UiIC0gTWVhbnMgdGhpcyBEYXRhYmFzZSBpbiB1bm1vZGlmaWVkIGZvcm0gYXMgcGFydApvZiBhIGNvbGxlY3Rpb24gb2YgaW5kZXBlbmRlbnQgZGF0YWJhc2VzIGluIHRoZW1zZWx2ZXMgdGhhdCB0b2dldGhlciBhcmUKYXNzZW1ibGVkIGludG8gYSBjb2xsZWN0aXZlIHdob2xlLiBBIHdvcmsgdGhhdCBjb25zdGl0dXRlcyBhIENvbGxlY3RpdmUKRGF0YWJhc2Ugd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhIERlcml2YXRpdmUgRGF0YWJhc2UuCgoiQ29udmV5IiAtIEFzIGEgdmVyYiwgbWVhbnMgVXNpbmcgdGhlIERhdGFiYXNlLCBhIERlcml2YXRpdmUgRGF0YWJhc2UsCm9yIHRoZSBEYXRhYmFzZSBhcyBwYXJ0IG9mIGEgQ29sbGVjdGl2ZSBEYXRhYmFzZSBpbiBhbnkgd2F5IHRoYXQgZW5hYmxlcwphIFBlcnNvbiB0byBtYWtlIG9yIHJlY2VpdmUgY29waWVzIG9mIHRoZSBEYXRhYmFzZSBvciBhIERlcml2YXRpdmUKRGF0YWJhc2UuICBDb252ZXlpbmcgZG9lcyBub3QgaW5jbHVkZSBpbnRlcmFjdGlvbiB3aXRoIGEgdXNlciB0aHJvdWdoIGEKY29tcHV0ZXIgbmV0d29yaywgb3IgY3JlYXRpbmcgYW5kIFVzaW5nIGEgUHJvZHVjZWQgV29yaywgd2hlcmUgbm8KdHJhbnNmZXIgb2YgYSBjb3B5IG9mIHRoZSBEYXRhYmFzZSBvciBhIERlcml2YXRpdmUgRGF0YWJhc2Ugb2NjdXJzLgoiQ29udGVudHMiIC0gVGhlIGNvbnRlbnRzIG9mIHRoaXMgRGF0YWJhc2UsIHdoaWNoIGluY2x1ZGVzIHRoZQppbmZvcm1hdGlvbiwgaW5kZXBlbmRlbnQgd29ya3MsIG9yIG90aGVyIG1hdGVyaWFsIGNvbGxlY3RlZCBpbnRvIHRoZQpEYXRhYmFzZS4gRm9yIGV4YW1wbGUsIHRoZSBjb250ZW50cyBvZiB0aGUgRGF0YWJhc2UgY291bGQgYmUgZmFjdHVhbApkYXRhIG9yIHdvcmtzIHN1Y2ggYXMgaW1hZ2VzLCBhdWRpb3Zpc3VhbCBtYXRlcmlhbCwgdGV4dCwgb3Igc291bmRzLgoKIkRhdGFiYXNlIiAtIEEgY29sbGVjdGlvbiBvZiBtYXRlcmlhbCAodGhlIENvbnRlbnRzKSBhcnJhbmdlZCBpbiBhCnN5c3RlbWF0aWMgb3IgbWV0aG9kaWNhbCB3YXkgYW5kIGluZGl2aWR1YWxseSBhY2Nlc3NpYmxlIGJ5IGVsZWN0cm9uaWMKb3Igb3RoZXIgbWVhbnMgb2ZmZXJlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgoKIkRhdGFiYXNlIERpcmVjdGl2ZSIgLSBNZWFucyBEaXJlY3RpdmUgOTYvOS9FQyBvZiB0aGUgRXVyb3BlYW4KUGFybGlhbWVudCBhbmQgb2YgdGhlIENvdW5jaWwgb2YgMTEgTWFyY2ggMTk5NiBvbiB0aGUgbGVnYWwgcHJvdGVjdGlvbgpvZiBkYXRhYmFzZXMsIGFzIGFtZW5kZWQgb3Igc3VjY2VlZGVkLgoKIkRhdGFiYXNlIFJpZ2h0IiAtIE1lYW5zIHJpZ2h0cyByZXN1bHRpbmcgZnJvbSB0aGUgQ2hhcHRlciBJSUkgKCJzdWkKZ2VuZXJpcyIpIHJpZ2h0cyBpbiB0aGUgRGF0YWJhc2UgRGlyZWN0aXZlIChhcyBhbWVuZGVkIGFuZCBhcyB0cmFuc3Bvc2VkCmJ5IG1lbWJlciBzdGF0ZXMpLCB3aGljaCBpbmNsdWRlcyB0aGUgRXh0cmFjdGlvbiBhbmQgUmUtdXRpbGlzYXRpb24gb2YKdGhlIHdob2xlIG9yIGEgU3Vic3RhbnRpYWwgcGFydCBvZiB0aGUgQ29udGVudHMsIGFzIHdlbGwgYXMgYW55IHNpbWlsYXIKcmlnaHRzIGF2YWlsYWJsZSBpbiB0aGUgcmVsZXZhbnQganVyaXNkaWN0aW9uIHVuZGVyIFNlY3Rpb24gMTAuNC4gCgoiRGVyaXZhdGl2ZSBEYXRhYmFzZSIgLSBNZWFucyBhIGRhdGFiYXNlIGJhc2VkIHVwb24gdGhlIERhdGFiYXNlLCBhbmQKaW5jbHVkZXMgYW55IHRyYW5zbGF0aW9uLCBhZGFwdGF0aW9uLCBhcnJhbmdlbWVudCwgbW9kaWZpY2F0aW9uLCBvciBhbnkKb3RoZXIgYWx0ZXJhdGlvbiBvZiB0aGUgRGF0YWJhc2Ugb3Igb2YgYSBTdWJzdGFudGlhbCBwYXJ0IG9mIHRoZQpDb250ZW50cy4gVGhpcyBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBFeHRyYWN0aW5nIG9yClJlLXV0aWxpc2luZyB0aGUgd2hvbGUgb3IgYSBTdWJzdGFudGlhbCBwYXJ0IG9mIHRoZSBDb250ZW50cyBpbiBhIG5ldwpEYXRhYmFzZS4KCiJFeHRyYWN0aW9uIiAtIE1lYW5zIHRoZSBwZXJtYW5lbnQgb3IgdGVtcG9yYXJ5IHRyYW5zZmVyIG9mIGFsbCBvciBhClN1YnN0YW50aWFsIHBhcnQgb2YgdGhlIENvbnRlbnRzIHRvIGFub3RoZXIgbWVkaXVtIGJ5IGFueSBtZWFucyBvciBpbgphbnkgZm9ybS4KCiJMaWNlbnNlIiAtIE1lYW5zIHRoaXMgbGljZW5zZSBhZ3JlZW1lbnQgYW5kIGlzIGJvdGggYSBsaWNlbnNlIG9mIHJpZ2h0cwpzdWNoIGFzIGNvcHlyaWdodCBhbmQgRGF0YWJhc2UgUmlnaHRzIGFuZCBhbiBhZ3JlZW1lbnQgaW4gY29udHJhY3QuCgoiTGljZW5zb3IiIC0gTWVhbnMgdGhlIFBlcnNvbiB0aGF0IG9mZmVycyB0aGUgRGF0YWJhc2UgdW5kZXIgdGhlIHRlcm1zCm9mIHRoaXMgTGljZW5zZS4gCgoiUGVyc29uIiAtIE1lYW5zIGEgbmF0dXJhbCBvciBsZWdhbCBwZXJzb24gb3IgYSBib2R5IG9mIHBlcnNvbnMKY29ycG9yYXRlIG9yIGluY29ycG9yYXRlLgoKIlByb2R1Y2VkIFdvcmsiIC0gIGEgd29yayAoc3VjaCBhcyBhbiBpbWFnZSwgYXVkaW92aXN1YWwgbWF0ZXJpYWwsIHRleHQsCm9yIHNvdW5kcykgcmVzdWx0aW5nIGZyb20gdXNpbmcgdGhlIHdob2xlIG9yIGEgU3Vic3RhbnRpYWwgcGFydCBvZiB0aGUKQ29udGVudHMgKHZpYSBhIHNlYXJjaCBvciBvdGhlciBxdWVyeSkgZnJvbSB0aGlzIERhdGFiYXNlLCBhIERlcml2YXRpdmUKRGF0YWJhc2UsIG9yIHRoaXMgRGF0YWJhc2UgYXMgcGFydCBvZiBhIENvbGxlY3RpdmUgRGF0YWJhc2UuICAKCiJQdWJsaWNseSIgLSBtZWFucyB0byBQZXJzb25zIG90aGVyIHRoYW4gWW91IG9yIHVuZGVyIFlvdXIgY29udHJvbCBieQplaXRoZXIgbW9yZSB0aGFuIDUwJSBvd25lcnNoaXAgb3IgYnkgdGhlIHBvd2VyIHRvIGRpcmVjdCB0aGVpcgphY3Rpdml0aWVzIChzdWNoIGFzIGNvbnRyYWN0aW5nIHdpdGggYW4gaW5kZXBlbmRlbnQgY29uc3VsdGFudCkuIAoKIlJlLXV0aWxpc2F0aW9uIiAtIG1lYW5zIGFueSBmb3JtIG9mIG1ha2luZyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBhbGwKb3IgYSBTdWJzdGFudGlhbCBwYXJ0IG9mIHRoZSBDb250ZW50cyBieSB0aGUgZGlzdHJpYnV0aW9uIG9mIGNvcGllcywgYnkKcmVudGluZywgYnkgb25saW5lIG9yIG90aGVyIGZvcm1zIG9mIHRyYW5zbWlzc2lvbi4KCiJTdWJzdGFudGlhbCIgLSBNZWFucyBzdWJzdGFudGlhbCBpbiB0ZXJtcyBvZiBxdWFudGl0eSBvciBxdWFsaXR5IG9yIGEKY29tYmluYXRpb24gb2YgYm90aC4gVGhlIHJlcGVhdGVkIGFuZCBzeXN0ZW1hdGljIEV4dHJhY3Rpb24gb3IKUmUtdXRpbGlzYXRpb24gb2YgaW5zdWJzdGFudGlhbCBwYXJ0cyBvZiB0aGUgQ29udGVudHMgbWF5IGFtb3VudCB0byB0aGUKRXh0cmFjdGlvbiBvciBSZS11dGlsaXNhdGlvbiBvZiBhIFN1YnN0YW50aWFsIHBhcnQgb2YgdGhlIENvbnRlbnRzLgoKIlVzZSIgLSBBcyBhIHZlcmIsIG1lYW5zIGRvaW5nIGFueSBhY3QgdGhhdCBpcyByZXN0cmljdGVkIGJ5IGNvcHlyaWdodApvciBEYXRhYmFzZSBSaWdodHMgd2hldGhlciBpbiB0aGUgb3JpZ2luYWwgbWVkaXVtIG9yIGFueSBvdGhlcjsgYW5kCmluY2x1ZGVzIHdpdGhvdXQgbGltaXRhdGlvbiBkaXN0cmlidXRpbmcsIGNvcHlpbmcsIHB1YmxpY2x5IHBlcmZvcm1pbmcsCnB1YmxpY2x5IGRpc3BsYXlpbmcsIGFuZCBwcmVwYXJpbmcgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgRGF0YWJhc2UsIGFzCndlbGwgYXMgbW9kaWZ5aW5nIHRoZSBEYXRhYmFzZSBhcyBtYXkgYmUgdGVjaG5pY2FsbHkgbmVjZXNzYXJ5IHRvIHVzZSBpdAppbiBhIGRpZmZlcmVudCBtb2RlIG9yIGZvcm1hdC4gCgoiWW91IiAtIE1lYW5zIGEgUGVyc29uIGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aG8gaGFzIG5vdApwcmV2aW91c2x5IHZpb2xhdGVkIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHRoZQpEYXRhYmFzZSwgb3Igd2hvIGhhcyByZWNlaXZlZCBleHByZXNzIHBlcm1pc3Npb24gZnJvbSB0aGUgTGljZW5zb3IgdG8KZXhlcmNpc2UgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBkZXNwaXRlIGEgcHJldmlvdXMgdmlvbGF0aW9uLgoKV29yZHMgaW4gdGhlIHNpbmd1bGFyIGluY2x1ZGUgdGhlIHBsdXJhbCBhbmQgdmljZSB2ZXJzYS4KCiMjIyAyLjAgV2hhdCB0aGlzIExpY2Vuc2UgY292ZXJzCgoyLjEuIExlZ2FsIGVmZmVjdCBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIExpY2Vuc2UgaXM6CgogIGEuIEEgbGljZW5zZSBvZiBhcHBsaWNhYmxlIGNvcHlyaWdodCBhbmQgbmVpZ2hib3VyaW5nIHJpZ2h0czsKCiAgYi4gQSBsaWNlbnNlIG9mIHRoZSBEYXRhYmFzZSBSaWdodDsgYW5kCgogIGMuIEFuIGFncmVlbWVudCBpbiBjb250cmFjdCBiZXR3ZWVuIFlvdSBhbmQgdGhlIExpY2Vuc29yLgoKMi4yIExlZ2FsIHJpZ2h0cyBjb3ZlcmVkLiBUaGlzIExpY2Vuc2UgY292ZXJzIHRoZSBsZWdhbCByaWdodHMgaW4gdGhlCkRhdGFiYXNlLCBpbmNsdWRpbmc6CgogIGEuIENvcHlyaWdodC4gQW55IGNvcHlyaWdodCBvciBuZWlnaGJvdXJpbmcgcmlnaHRzIGluIHRoZSBEYXRhYmFzZS4KICBUaGUgY29weXJpZ2h0IGxpY2Vuc2VkIGluY2x1ZGVzIGFueSBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIHRoZQogIERhdGFiYXNlLCBidXQgZG9lcyBub3QgY292ZXIgdGhlIGNvcHlyaWdodCBvdmVyIHRoZSBDb250ZW50cwogIGluZGVwZW5kZW50IG9mIHRoaXMgRGF0YWJhc2UuIFNlZSBTZWN0aW9uIDIuNCBmb3IgZGV0YWlscy4gQ29weXJpZ2h0CiAgbGF3IHZhcmllcyBiZXR3ZWVuIGp1cmlzZGljdGlvbnMsIGJ1dCBpcyBsaWtlbHkgdG8gY292ZXI6IHRoZSBEYXRhYmFzZQogIG1vZGVsIG9yIHNjaGVtYSwgd2hpY2ggaXMgdGhlIHN0cnVjdHVyZSwgYXJyYW5nZW1lbnQsIGFuZCBvcmdhbmlzYXRpb24KICBvZiB0aGUgRGF0YWJhc2UsIGFuZCBjYW4gYWxzbyBpbmNsdWRlIHRoZSBEYXRhYmFzZSB0YWJsZXMgYW5kIHRhYmxlCiAgaW5kZXhlczsgdGhlIGRhdGEgZW50cnkgYW5kIG91dHB1dCBzaGVldHM7IGFuZCB0aGUgRmllbGQgbmFtZXMgb2YKICBDb250ZW50cyBzdG9yZWQgaW4gdGhlIERhdGFiYXNlOwoKICBiLiBEYXRhYmFzZSBSaWdodHMuIERhdGFiYXNlIFJpZ2h0cyBvbmx5IGV4dGVuZCB0byB0aGUgRXh0cmFjdGlvbiBhbmQKICBSZS11dGlsaXNhdGlvbiBvZiB0aGUgd2hvbGUgb3IgYSBTdWJzdGFudGlhbCBwYXJ0IG9mIHRoZSBDb250ZW50cy4KICBEYXRhYmFzZSBSaWdodHMgY2FuIGFwcGx5IGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBjb3B5cmlnaHQgb3ZlciB0aGUKICBEYXRhYmFzZS4gRGF0YWJhc2UgUmlnaHRzIGNhbiBhbHNvIGFwcGx5IHdoZW4gdGhlIENvbnRlbnRzIGFyZSByZW1vdmVkCiAgZnJvbSB0aGUgRGF0YWJhc2UgYW5kIGFyZSBzZWxlY3RlZCBhbmQgYXJyYW5nZWQgaW4gYSB3YXkgdGhhdCB3b3VsZAogIG5vdCBpbmZyaW5nZSBhbnkgYXBwbGljYWJsZSBjb3B5cmlnaHQ7IGFuZAoKICBjLiBDb250cmFjdC4gVGhpcyBpcyBhbiBhZ3JlZW1lbnQgYmV0d2VlbiBZb3UgYW5kIHRoZSBMaWNlbnNvciBmb3IKICBhY2Nlc3MgdG8gdGhlIERhdGFiYXNlLiBJbiByZXR1cm4geW91IGFncmVlIHRvIGNlcnRhaW4gY29uZGl0aW9ucyBvZgogIHVzZSBvbiB0aGlzIGFjY2VzcyBhcyBvdXRsaW5lZCBpbiB0aGlzIExpY2Vuc2UuIAoKMi4zIFJpZ2h0cyBub3QgY292ZXJlZC4gCgogIGEuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBjb21wdXRlciBwcm9ncmFtcyB1c2VkIGluIHRoZSBtYWtpbmcKICBvciBvcGVyYXRpb24gb2YgdGhlIERhdGFiYXNlOyAKCiAgYi4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGNvdmVyIGFueSBwYXRlbnRzIG92ZXIgdGhlIENvbnRlbnRzIG9yIHRoZQogIERhdGFiYXNlOyBhbmQKCiAgYy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGNvdmVyIGFueSB0cmFkZW1hcmtzIGFzc29jaWF0ZWQgd2l0aCB0aGUKICBEYXRhYmFzZS4gCgoyLjQgUmVsYXRpb25zaGlwIHRvIENvbnRlbnRzIGluIHRoZSBEYXRhYmFzZS4gVGhlIGluZGl2aWR1YWwgaXRlbXMgb2YKdGhlIENvbnRlbnRzIGNvbnRhaW5lZCBpbiB0aGlzIERhdGFiYXNlIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJpZ2h0cywKaW5jbHVkaW5nIGNvcHlyaWdodCwgcGF0ZW50LCBkYXRhIHByb3RlY3Rpb24sIHByaXZhY3ksIG9yIHBlcnNvbmFsaXR5CnJpZ2h0cywgYW5kIHRoaXMgTGljZW5zZSBkb2VzIG5vdCBjb3ZlciBhbnkgcmlnaHRzIChvdGhlciB0aGFuIERhdGFiYXNlClJpZ2h0cyBvciBpbiBjb250cmFjdCkgaW4gaW5kaXZpZHVhbCBDb250ZW50cyBjb250YWluZWQgaW4gdGhlIERhdGFiYXNlLgpGb3IgZXhhbXBsZSwgaWYgdXNlZCBvbiBhIERhdGFiYXNlIG9mIGltYWdlcyAodGhlIENvbnRlbnRzKSwgdGhpcwpMaWNlbnNlIHdvdWxkIG5vdCBhcHBseSB0byBjb3B5cmlnaHQgb3ZlciBpbmRpdmlkdWFsIGltYWdlcywgd2hpY2ggY291bGQKaGF2ZSB0aGVpciBvd24gc2VwYXJhdGUgbGljZW5zZXMsIG9yIG9uZSBzaW5nbGUgbGljZW5zZSBjb3ZlcmluZyBhbGwgb2YKdGhlIHJpZ2h0cyBvdmVyIHRoZSBpbWFnZXMuICAKCiMjIyAzLjAgUmlnaHRzIGdyYW50ZWQKCjMuMSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZSBMaWNlbnNvcgpncmFudHMgdG8gWW91IGEgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHRlcm1pbmFibGUgKGJ1dApvbmx5IHVuZGVyIFNlY3Rpb24gOSkgbGljZW5zZSB0byBVc2UgdGhlIERhdGFiYXNlIGZvciB0aGUgZHVyYXRpb24gb2YKYW55IGFwcGxpY2FibGUgY29weXJpZ2h0IGFuZCBEYXRhYmFzZSBSaWdodHMuIFRoZXNlIHJpZ2h0cyBleHBsaWNpdGx5CmluY2x1ZGUgY29tbWVyY2lhbCB1c2UsIGFuZCBkbyBub3QgZXhjbHVkZSBhbnkgZmllbGQgb2YgZW5kZWF2b3VyLiBUbwp0aGUgZXh0ZW50IHBvc3NpYmxlIGluIHRoZSByZWxldmFudCBqdXJpc2RpY3Rpb24sIHRoZXNlIHJpZ2h0cyBtYXkgYmUKZXhlcmNpc2VkIGluIGFsbCBtZWRpYSBhbmQgZm9ybWF0cyB3aGV0aGVyIG5vdyBrbm93biBvciBjcmVhdGVkIGluIHRoZQpmdXR1cmUuIAoKVGhlIHJpZ2h0cyBncmFudGVkIGNvdmVyLCBmb3IgZXhhbXBsZToKCiAgYS4gRXh0cmFjdGlvbiBhbmQgUmUtdXRpbGlzYXRpb24gb2YgdGhlIHdob2xlIG9yIGEgU3Vic3RhbnRpYWwgcGFydCBvZgogIHRoZSBDb250ZW50czsKCiAgYi4gQ3JlYXRpb24gb2YgRGVyaXZhdGl2ZSBEYXRhYmFzZXM7CgogIGMuIENyZWF0aW9uIG9mIENvbGxlY3RpdmUgRGF0YWJhc2VzOwoKICBkLiBDcmVhdGlvbiBvZiB0ZW1wb3Jhcnkgb3IgcGVybWFuZW50IHJlcHJvZHVjdGlvbnMgYnkgYW55IG1lYW5zIGFuZAogIGluIGFueSBmb3JtLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBpbmNsdWRpbmcgb2YgYW55IERlcml2YXRpdmUKICBEYXRhYmFzZXMgb3IgYXMgYSBwYXJ0IG9mIENvbGxlY3RpdmUgRGF0YWJhc2VzOyBhbmQKCiAgZS4gRGlzdHJpYnV0aW9uLCBjb21tdW5pY2F0aW9uLCBkaXNwbGF5LCBsZW5kaW5nLCBtYWtpbmcgYXZhaWxhYmxlLCBvcgogIHBlcmZvcm1hbmNlIHRvIHRoZSBwdWJsaWMgYnkgYW55IG1lYW5zIGFuZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4KICBwYXJ0LCBpbmNsdWRpbmcgb2YgYW55IERlcml2YXRpdmUgRGF0YWJhc2Ugb3IgYXMgYSBwYXJ0IG9mIENvbGxlY3RpdmUKICBEYXRhYmFzZXMuCgozLjIgQ29tcHVsc29yeSBsaWNlbnNlIHNjaGVtZXMuIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0OgoKICBhLiBOb24td2FpdmFibGUgY29tcHVsc29yeSBsaWNlbnNlIHNjaGVtZXMuIEluIHRob3NlIGp1cmlzZGljdGlvbnMgaW4KICB3aGljaCB0aGUgcmlnaHQgdG8gY29sbGVjdCByb3lhbHRpZXMgdGhyb3VnaCBhbnkgc3RhdHV0b3J5IG9yCiAgY29tcHVsc29yeSBsaWNlbnNpbmcgc2NoZW1lIGNhbm5vdCBiZSB3YWl2ZWQsIHRoZSBMaWNlbnNvciByZXNlcnZlcwogIHRoZSBleGNsdXNpdmUgcmlnaHQgdG8gY29sbGVjdCBzdWNoIHJveWFsdGllcyBmb3IgYW55IGV4ZXJjaXNlIGJ5IFlvdQogIG9mIHRoZSByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2U7CgogIGIuIFdhaXZhYmxlIGNvbXB1bHNvcnkgbGljZW5zZSBzY2hlbWVzLiBJbiB0aG9zZSBqdXJpc2RpY3Rpb25zIGluCiAgd2hpY2ggdGhlIHJpZ2h0IHRvIGNvbGxlY3Qgcm95YWx0aWVzIHRocm91Z2ggYW55IHN0YXR1dG9yeSBvcgogIGNvbXB1bHNvcnkgbGljZW5zaW5nIHNjaGVtZSBjYW4gYmUgd2FpdmVkLCB0aGUgTGljZW5zb3Igd2FpdmVzIHRoZQogIGV4Y2x1c2l2ZSByaWdodCB0byBjb2xsZWN0IHN1Y2ggcm95YWx0aWVzIGZvciBhbnkgZXhlcmNpc2UgYnkgWW91IG9mCiAgdGhlIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZTsgYW5kLAoKICBjLiBWb2x1bnRhcnkgbGljZW5zZSBzY2hlbWVzLiBUaGUgTGljZW5zb3Igd2FpdmVzIHRoZSByaWdodCB0byBjb2xsZWN0CiAgcm95YWx0aWVzLCB3aGV0aGVyIGluZGl2aWR1YWxseSBvciwgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIExpY2Vuc29yIGlzCiAgYSBtZW1iZXIgb2YgYSBjb2xsZWN0aW5nIHNvY2lldHkgdGhhdCBhZG1pbmlzdGVycyB2b2x1bnRhcnkgbGljZW5zaW5nCiAgc2NoZW1lcywgdmlhIHRoYXQgc29jaWV0eSwgZnJvbSBhbnkgZXhlcmNpc2UgYnkgWW91IG9mIHRoZSByaWdodHMKICBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4KCjMuMyBUaGUgcmlnaHQgdG8gcmVsZWFzZSB0aGUgRGF0YWJhc2UgdW5kZXIgZGlmZmVyZW50IHRlcm1zLCBvciB0byBzdG9wCmRpc3RyaWJ1dGluZyBvciBtYWtpbmcgYXZhaWxhYmxlIHRoZSBEYXRhYmFzZSwgaXMgcmVzZXJ2ZWQuIE5vdGUgdGhhdAp0aGlzIERhdGFiYXNlIG1heSBiZSBtdWx0aXBsZS1saWNlbnNlZCwgYW5kIHNvIFlvdSBtYXkgaGF2ZSB0aGUgY2hvaWNlCm9mIHVzaW5nIGFsdGVybmF0aXZlIGxpY2Vuc2VzIGZvciB0aGlzIERhdGFiYXNlLiBTdWJqZWN0IHRvIFNlY3Rpb24KMTAuNCwgYWxsIG90aGVyIHJpZ2h0cyBub3QgZXhwcmVzc2x5IGdyYW50ZWQgYnkgTGljZW5zb3IgYXJlIHJlc2VydmVkLgoKIyMjIDQuMCBDb25kaXRpb25zIG9mIFVzZQoKNC4xIFRoZSByaWdodHMgZ3JhbnRlZCBpbiBTZWN0aW9uIDMgYWJvdmUgYXJlIGV4cHJlc3NseSBtYWRlIHN1YmplY3QgdG8KWW91ciBjb21wbHlpbmcgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgb2YgdXNlLiBUaGVzZSBhcmUgaW1wb3J0YW50CmNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCBhbmQgaWYgWW91IGZhaWwgdG8gZm9sbG93IHRoZW0sIFlvdSB3aWxsIGJlCmluIG1hdGVyaWFsIGJyZWFjaCBvZiBpdHMgdGVybXMuCgo0LjIgTm90aWNlcy4gSWYgWW91IFB1YmxpY2x5IENvbnZleSB0aGlzIERhdGFiYXNlLCBhbnkgRGVyaXZhdGl2ZQpEYXRhYmFzZSwgb3IgdGhlIERhdGFiYXNlIGFzIHBhcnQgb2YgYSBDb2xsZWN0aXZlIERhdGFiYXNlLCB0aGVuIFlvdQptdXN0OiAKCiAgYS4gRG8gc28gb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIGFub3RoZXIgbGljZW5zZQogIHBlcm1pdHRlZCB1bmRlciBTZWN0aW9uIDQuNDsKCiAgYi4gSW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIChvciwgYXMgYXBwbGljYWJsZSwgYSBsaWNlbnNlCiAgcGVybWl0dGVkIHVuZGVyIFNlY3Rpb24gNC40KSBvciBpdHMgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpCiAgd2l0aCB0aGUgRGF0YWJhc2Ugb3IgRGVyaXZhdGl2ZSBEYXRhYmFzZSwgaW5jbHVkaW5nIGJvdGggaW4gdGhlCiAgRGF0YWJhc2Ugb3IgRGVyaXZhdGl2ZSBEYXRhYmFzZSBhbmQgaW4gYW55IHJlbGV2YW50IGRvY3VtZW50YXRpb247IGFuZAoKICBjLiBLZWVwIGludGFjdCBhbnkgY29weXJpZ2h0IG9yIERhdGFiYXNlIFJpZ2h0IG5vdGljZXMgYW5kIG5vdGljZXMKICB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZS4KCiAgZC4gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHB1dCB0aGUgcmVxdWlyZWQgbm90aWNlcyBpbiBhIHBhcnRpY3VsYXIKICBmaWxlIGR1ZSB0byBpdHMgc3RydWN0dXJlLCB0aGVuIFlvdSBtdXN0IGluY2x1ZGUgdGhlIG5vdGljZXMgaW4gYQogIGxvY2F0aW9uIChzdWNoIGFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSB1c2VycyB3b3VsZCBiZSBsaWtlbHkgdG8KICBsb29rIGZvciBpdC4KCjQuMyBOb3RpY2UgZm9yIHVzaW5nIG91dHB1dCAoQ29udGVudHMpLiBDcmVhdGluZyBhbmQgVXNpbmcgYSBQcm9kdWNlZApXb3JrIGRvZXMgbm90IHJlcXVpcmUgdGhlIG5vdGljZSBpbiBTZWN0aW9uIDQuMi4gSG93ZXZlciwgaWYgeW91ClB1YmxpY2x5IFVzZSBhIFByb2R1Y2VkIFdvcmssIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgYXNzb2NpYXRlZCB3aXRoCnRoZSBQcm9kdWNlZCBXb3JrIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBtYWtlIGFueSBQZXJzb24gdGhhdCB1c2VzLAp2aWV3cywgYWNjZXNzZXMsIGludGVyYWN0cyB3aXRoLCBvciBpcyBvdGhlcndpc2UgZXhwb3NlZCB0byB0aGUgUHJvZHVjZWQKV29yayBhd2FyZSB0aGF0IENvbnRlbnQgd2FzIG9idGFpbmVkIGZyb20gdGhlIERhdGFiYXNlLCBEZXJpdmF0aXZlCkRhdGFiYXNlLCBvciB0aGUgRGF0YWJhc2UgYXMgcGFydCBvZiBhIENvbGxlY3RpdmUgRGF0YWJhc2UsIGFuZCB0aGF0IGl0CmlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCgogIGEuIEV4YW1wbGUgbm90aWNlLiBUaGUgZm9sbG93aW5nIHRleHQgd2lsbCBzYXRpc2Z5IG5vdGljZSB1bmRlcgogIFNlY3Rpb24gNC4zOgoKICAgICAgICBDb250YWlucyBpbmZvcm1hdGlvbiBmcm9tIERBVEFCQVNFIE5BTUUsIHdoaWNoIGlzIG1hZGUgYXZhaWxhYmxlCiAgICAgICAgaGVyZSB1bmRlciB0aGUgT3BlbiBEYXRhYmFzZSBMaWNlbnNlIChPRGJMKS4KCkRBVEFCQVNFIE5BTUUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIERhdGFiYXNlIGFuZCBhCmh5cGVybGluayB0byB0aGUgVVJJIG9mIHRoZSBEYXRhYmFzZS4gIk9wZW4gRGF0YWJhc2UgTGljZW5zZSIgc2hvdWxkCmNvbnRhaW4gYSBoeXBlcmxpbmsgdG8gdGhlIFVSSSBvZiB0aGUgdGV4dCBvZiB0aGlzIExpY2Vuc2UuIElmCmh5cGVybGlua3MgYXJlIG5vdCBwb3NzaWJsZSwgWW91IHNob3VsZCBpbmNsdWRlIHRoZSBwbGFpbiB0ZXh0IG9mIHRoZQpyZXF1aXJlZCBVUkkncyB3aXRoIHRoZSBhYm92ZSBub3RpY2UuCiAKNC40IFNoYXJlIGFsaWtlLiAKCiAgYS4gQW55IERlcml2YXRpdmUgRGF0YWJhc2UgdGhhdCBZb3UgUHVibGljbHkgVXNlIG11c3QgYmUgb25seSB1bmRlcgogIHRoZSB0ZXJtcyBvZjogCgogICAgaS4gVGhpcyBMaWNlbnNlOwoKICAgIGlpLiBBIGxhdGVyIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoaXMKICAgICAgTGljZW5zZTsgb3IKCiAgICBpaWkuIEEgY29tcGF0aWJsZSBsaWNlbnNlLiAKCiAgSWYgWW91IGxpY2Vuc2UgdGhlIERlcml2YXRpdmUgRGF0YWJhc2UgdW5kZXIgb25lIG9mIHRoZSBsaWNlbnNlcwogIG1lbnRpb25lZCBpbiAoaWlpKSwgWW91IG11c3QgY29tcGx5IHdpdGggdGhlIHRlcm1zIG9mIHRoYXQgbGljZW5zZS4gCgogIGIuIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0LCBFeHRyYWN0aW9uIG9yIFJlLXV0aWxpc2F0aW9uIG9mIHRoZQogIHdob2xlIG9yIGEgU3Vic3RhbnRpYWwgcGFydCBvZiB0aGUgQ29udGVudHMgaW50byBhIG5ldyBkYXRhYmFzZSBpcyBhCiAgRGVyaXZhdGl2ZSBEYXRhYmFzZSBhbmQgbXVzdCBjb21wbHkgd2l0aCBTZWN0aW9uIDQuNC4gCgogIGMuIERlcml2YXRpdmUgRGF0YWJhc2VzIGFuZCBQcm9kdWNlZCBXb3Jrcy4gIEEgRGVyaXZhdGl2ZSBEYXRhYmFzZSBpcwogIFB1YmxpY2x5IFVzZWQgYW5kIHNvIG11c3QgY29tcGx5IHdpdGggU2VjdGlvbiA0LjQuIGlmIGEgUHJvZHVjZWQgV29yawogIGNyZWF0ZWQgZnJvbSB0aGUgRGVyaXZhdGl2ZSBEYXRhYmFzZSBpcyBQdWJsaWNseSBVc2VkLgoKICBkLiBTaGFyZSBBbGlrZSBhbmQgYWRkaXRpb25hbCBDb250ZW50cy4gRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsCiAgWW91IG11c3Qgbm90IGFkZCBDb250ZW50cyB0byBEZXJpdmF0aXZlIERhdGFiYXNlcyB1bmRlciBTZWN0aW9uIDQuNCBhCiAgdGhhdCBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gCgogIGUuIENvbXBhdGlibGUgbGljZW5zZXMuIExpY2Vuc29ycyBtYXkgYXV0aG9yaXNlIGEgcHJveHkgdG8gZGV0ZXJtaW5lCiAgY29tcGF0aWJsZSBsaWNlbnNlcyB1bmRlciBTZWN0aW9uIDQuNCBhIGlpaS4gSWYgdGhleSBkbyBzbywgdGhlCiAgYXV0aG9yaXNlZCBwcm94eSdzIHB1YmxpYyBzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhIGNvbXBhdGlibGUKICBsaWNlbnNlIGdyYW50cyBZb3UgcGVybWlzc2lvbiB0byB1c2UgdGhlIGNvbXBhdGlibGUgbGljZW5zZS4KCgo0LjUgTGltaXRzIG9mIFNoYXJlIEFsaWtlLiAgVGhlIHJlcXVpcmVtZW50cyBvZiBTZWN0aW9uIDQuNCBkbyBub3QgYXBwbHkKaW4gdGhlIGZvbGxvd2luZzoKCiAgYS4gRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGxpY2Vuc2UKICBDb2xsZWN0aXZlIERhdGFiYXNlcyB1bmRlciB0aGlzIExpY2Vuc2UgaWYgWW91IGluY29ycG9yYXRlIHRoaXMKICBEYXRhYmFzZSBvciBhIERlcml2YXRpdmUgRGF0YWJhc2UgaW4gdGhlIGNvbGxlY3Rpb24sIGJ1dCB0aGlzIExpY2Vuc2UKICBzdGlsbCBhcHBsaWVzIHRvIHRoaXMgRGF0YWJhc2Ugb3IgYSBEZXJpdmF0aXZlIERhdGFiYXNlIGFzIGEgcGFydCBvZgogIHRoZSBDb2xsZWN0aXZlIERhdGFiYXNlOyAKCiAgYi4gVXNpbmcgdGhpcyBEYXRhYmFzZSwgYSBEZXJpdmF0aXZlIERhdGFiYXNlLCBvciB0aGlzIERhdGFiYXNlIGFzCiAgcGFydCBvZiBhIENvbGxlY3RpdmUgRGF0YWJhc2UgdG8gY3JlYXRlIGEgUHJvZHVjZWQgV29yayBkb2VzIG5vdAogIGNyZWF0ZSBhIERlcml2YXRpdmUgRGF0YWJhc2UgZm9yIHB1cnBvc2VzIG9mICBTZWN0aW9uIDQuNDsgYW5kCgogIGMuIFVzZSBvZiBhIERlcml2YXRpdmUgRGF0YWJhc2UgaW50ZXJuYWxseSB3aXRoaW4gYW4gb3JnYW5pc2F0aW9uIGlzCiAgbm90IHRvIHRoZSBwdWJsaWMgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBmYWxsIHVuZGVyIHRoZSByZXF1aXJlbWVudHMKICBvZiBTZWN0aW9uIDQuNC4KCjQuNiBBY2Nlc3MgdG8gRGVyaXZhdGl2ZSBEYXRhYmFzZXMuIElmIFlvdSBQdWJsaWNseSBVc2UgYSBEZXJpdmF0aXZlCkRhdGFiYXNlIG9yIGEgUHJvZHVjZWQgV29yayBmcm9tIGEgRGVyaXZhdGl2ZSBEYXRhYmFzZSwgWW91IG11c3QgYWxzbwpvZmZlciB0byByZWNpcGllbnRzIG9mIHRoZSBEZXJpdmF0aXZlIERhdGFiYXNlIG9yIFByb2R1Y2VkIFdvcmsgYSBjb3B5CmluIGEgbWFjaGluZSByZWFkYWJsZSBmb3JtIG9mOgoKICBhLiBUaGUgZW50aXJlIERlcml2YXRpdmUgRGF0YWJhc2U7IG9yCgogIGIuIEEgZmlsZSBjb250YWluaW5nIGFsbCBvZiB0aGUgYWx0ZXJhdGlvbnMgbWFkZSB0byB0aGUgRGF0YWJhc2Ugb3IKICB0aGUgbWV0aG9kIG9mIG1ha2luZyB0aGUgYWx0ZXJhdGlvbnMgdG8gdGhlIERhdGFiYXNlIChzdWNoIGFzIGFuCiAgYWxnb3JpdGhtKSwgaW5jbHVkaW5nIGFueSBhZGRpdGlvbmFsIENvbnRlbnRzLCB0aGF0IG1ha2UgdXAgYWxsIHRoZQogIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIERhdGFiYXNlIGFuZCB0aGUgRGVyaXZhdGl2ZSBEYXRhYmFzZS4KClRoZSBEZXJpdmF0aXZlIERhdGFiYXNlICh1bmRlciBhLikgb3IgYWx0ZXJhdGlvbiBmaWxlICh1bmRlciBiLikgbXVzdCBiZQphdmFpbGFibGUgYXQgbm8gbW9yZSB0aGFuIGEgcmVhc29uYWJsZSBwcm9kdWN0aW9uIGNvc3QgZm9yIHBoeXNpY2FsCmRpc3RyaWJ1dGlvbnMgYW5kIGZyZWUgb2YgY2hhcmdlIGlmIGRpc3RyaWJ1dGVkIG92ZXIgdGhlIGludGVybmV0LgoKNC43IFRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgYW5kIGFkZGl0aW9uYWwgdGVybXMKCiAgYS4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGFsbG93IFlvdSB0byBpbXBvc2UgKGV4Y2VwdCBzdWJqZWN0IHRvCiAgU2VjdGlvbiA0LjcgYi4pICBhbnkgdGVybXMgb3IgYW55IHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgb24gdGhlCiAgRGF0YWJhc2UsIGEgRGVyaXZhdGl2ZSBEYXRhYmFzZSwgb3IgdGhlIHdob2xlIG9yIGEgU3Vic3RhbnRpYWwgcGFydCBvZgogIHRoZSBDb250ZW50cyB0aGF0IGFsdGVyIG9yIHJlc3RyaWN0IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIG9yIGFueQogIHJpZ2h0cyBncmFudGVkIHVuZGVyIGl0LCBvciBoYXZlIHRoZSBlZmZlY3Qgb3IgaW50ZW50IG9mIHJlc3RyaWN0aW5nCiAgdGhlIGFiaWxpdHkgb2YgYW55IHBlcnNvbiB0byBleGVyY2lzZSB0aG9zZSByaWdodHMuCgogIGIuIFBhcmFsbGVsIGRpc3RyaWJ1dGlvbi4gWW91IG1heSBpbXBvc2UgdGVybXMgb3IgdGVjaG5vbG9naWNhbAogIG1lYXN1cmVzIG9uIHRoZSBEYXRhYmFzZSwgYSBEZXJpdmF0aXZlIERhdGFiYXNlLCBvciB0aGUgd2hvbGUgb3IgYQogIFN1YnN0YW50aWFsIHBhcnQgb2YgdGhlIENvbnRlbnRzIChhICJSZXN0cmljdGVkIERhdGFiYXNlIikgaW4KICBjb250cmF2ZW50aW9uIG9mIFNlY3Rpb24gNC43NCBhLiBvbmx5IGlmIFlvdSBhbHNvIG1ha2UgYSBjb3B5IG9mIHRoZQogIERhdGFiYXNlIG9yIGEgRGVyaXZhdGl2ZSBEYXRhYmFzZSBhdmFpbGFibGUgdG8gdGhlIHJlY2lwaWVudCBvZiB0aGUKICBSZXN0cmljdGVkIERhdGFiYXNlOgoKICAgIGkuIFRoYXQgaXMgYXZhaWxhYmxlIHdpdGhvdXQgYWRkaXRpb25hbCBmZWU7CgogICAgaWkuIFRoYXQgaXMgYXZhaWxhYmxlIGluIGEgbWVkaXVtIHRoYXQgZG9lcyBub3QgYWx0ZXIgb3IgcmVzdHJpY3QKICAgIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIG9yIGFueSByaWdodHMgZ3JhbnRlZCB1bmRlciBpdCwgb3IgaGF2ZQogICAgdGhlIGVmZmVjdCBvciBpbnRlbnQgb2YgcmVzdHJpY3RpbmcgdGhlIGFiaWxpdHkgb2YgYW55IHBlcnNvbiB0bwogICAgZXhlcmNpc2UgdGhvc2UgcmlnaHRzIChhbiAiVW5yZXN0cmljdGVkIERhdGFiYXNlIik7IGFuZAoKICAgIGlpaS4gVGhlIFVucmVzdHJpY3RlZCBEYXRhYmFzZSBpcyBhdCBsZWFzdCBhcyBhY2Nlc3NpYmxlIHRvIHRoZQogICAgcmVjaXBpZW50IGFzIGEgcHJhY3RpY2FsIG1hdHRlciBhcyB0aGUgUmVzdHJpY3RlZCBEYXRhYmFzZS4KCiAgYy4gRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsIFlvdSBtYXkgcGxhY2UgdGhpcyBEYXRhYmFzZSBvciBhCiAgRGVyaXZhdGl2ZSBEYXRhYmFzZSBpbiBhbiBhdXRoZW50aWNhdGVkIGVudmlyb25tZW50LCBiZWhpbmQgYQogIHBhc3N3b3JkLCBvciB3aXRoaW4gYSBzaW1pbGFyIGFjY2VzcyBjb250cm9sIHNjaGVtZSBwcm92aWRlZCB0aGF0IFlvdQogIGRvIG5vdCBhbHRlciBvciByZXN0cmljdCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIGFueSByaWdodHMKICBncmFudGVkIHVuZGVyIGl0IG9yIGhhdmUgdGhlIGVmZmVjdCBvciBpbnRlbnQgb2YgcmVzdHJpY3RpbmcgdGhlCiAgYWJpbGl0eSBvZiBhbnkgcGVyc29uIHRvIGV4ZXJjaXNlIHRob3NlIHJpZ2h0cy4gCgo0LjggTGljZW5zaW5nIG9mIG90aGVycy4gWW91IG1heSBub3Qgc3VibGljZW5zZSB0aGUgRGF0YWJhc2UuIEVhY2ggdGltZQpZb3UgY29tbXVuaWNhdGUgdGhlIERhdGFiYXNlLCB0aGUgd2hvbGUgb3IgU3Vic3RhbnRpYWwgcGFydCBvZiB0aGUKQ29udGVudHMsIG9yIGFueSBEZXJpdmF0aXZlIERhdGFiYXNlIHRvIGFueW9uZSBlbHNlIGluIGFueSB3YXksIHRoZQpMaWNlbnNvciBvZmZlcnMgdG8gdGhlIHJlY2lwaWVudCBhIGxpY2Vuc2UgdG8gdGhlIERhdGFiYXNlIG9uIHRoZSBzYW1lCnRlcm1zIGFuZCBjb25kaXRpb25zIGFzIHRoaXMgTGljZW5zZS4gWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yCmVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aCB0aGlzIExpY2Vuc2UsIGJ1dCBZb3UgbWF5CmVuZm9yY2UgYW55IHJpZ2h0cyB0aGF0IFlvdSBoYXZlIG92ZXIgYSBEZXJpdmF0aXZlIERhdGFiYXNlLiBZb3UgYXJlCnNvbGVseSByZXNwb25zaWJsZSBmb3IgYW55IG1vZGlmaWNhdGlvbnMgb2YgYSBEZXJpdmF0aXZlIERhdGFiYXNlIG1hZGUKYnkgWW91IG9yIGFub3RoZXIgUGVyc29uIGF0IFlvdXIgZGlyZWN0aW9uLiBZb3UgbWF5IG5vdCBpbXBvc2UgYW55CmZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQKdW5kZXIgdGhpcyBMaWNlbnNlLgoKIyMjIDUuMCBNb3JhbCByaWdodHMKCjUuMSBNb3JhbCByaWdodHMuIFRoaXMgc2VjdGlvbiBjb3ZlcnMgbW9yYWwgcmlnaHRzLCBpbmNsdWRpbmcgYW55IHJpZ2h0cwp0byBiZSBpZGVudGlmaWVkIGFzIHRoZSBhdXRob3Igb2YgdGhlIERhdGFiYXNlIG9yIHRvIG9iamVjdCB0byB0cmVhdG1lbnQKdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJlanVkaWNlIHRoZSBhdXRob3IncyBob25vdXIgYW5kIHJlcHV0YXRpb24sIG9yCmFueSBvdGhlciBkZXJvZ2F0b3J5IHRyZWF0bWVudDoKCiAgYS4gRm9yIGp1cmlzZGljdGlvbnMgYWxsb3dpbmcgd2FpdmVyIG9mIG1vcmFsIHJpZ2h0cywgTGljZW5zb3Igd2FpdmVzCiAgYWxsIG1vcmFsIHJpZ2h0cyB0aGF0IExpY2Vuc29yIG1heSBoYXZlIGluIHRoZSBEYXRhYmFzZSB0byB0aGUgZnVsbGVzdAogIGV4dGVudCBwb3NzaWJsZSBieSB0aGUgbGF3IG9mIHRoZSByZWxldmFudCBqdXJpc2RpY3Rpb24gdW5kZXIgU2VjdGlvbgogIDEwLjQ7IAoKICBiLiBJZiB3YWl2ZXIgb2YgbW9yYWwgcmlnaHRzIHVuZGVyIFNlY3Rpb24gNS4xIGEgaW4gdGhlIHJlbGV2YW50CiAganVyaXNkaWN0aW9uIGlzIG5vdCBwb3NzaWJsZSwgTGljZW5zb3IgYWdyZWVzIG5vdCB0byBhc3NlcnQgYW55IG1vcmFsCiAgcmlnaHRzIG92ZXIgdGhlIERhdGFiYXNlIGFuZCB3YWl2ZXMgYWxsIGNsYWltcyBpbiBtb3JhbCByaWdodHMgdG8gdGhlCiAgZnVsbGVzdCBleHRlbnQgcG9zc2libGUgYnkgdGhlIGxhdyBvZiB0aGUgcmVsZXZhbnQganVyaXNkaWN0aW9uIHVuZGVyCiAgU2VjdGlvbiAxMC40OyBhbmQKCiAgYy4gRm9yIGp1cmlzZGljdGlvbnMgbm90IGFsbG93aW5nIHdhaXZlciBvciBhbiBhZ3JlZW1lbnQgbm90IHRvIGFzc2VydAogIG1vcmFsIHJpZ2h0cyB1bmRlciBTZWN0aW9uIDUuMSBhIGFuZCBiLCB0aGUgYXV0aG9yIG1heSByZXRhaW4gdGhlaXIKICBtb3JhbCByaWdodHMgb3ZlciBjZXJ0YWluIGFzcGVjdHMgb2YgdGhlIERhdGFiYXNlLgoKUGxlYXNlIG5vdGUgdGhhdCBzb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IGZvciB0aGUgd2FpdmVyIG9mIG1vcmFsCnJpZ2h0cywgYW5kIHNvIG1vcmFsIHJpZ2h0cyBtYXkgc3RpbGwgc3Vic2lzdCBvdmVyIHRoZSBEYXRhYmFzZSBpbiBzb21lCmp1cmlzZGljdGlvbnMuCgojIyMgNi4wIEZhaXIgZGVhbGluZywgRGF0YWJhc2UgZXhjZXB0aW9ucywgYW5kIG90aGVyIHJpZ2h0cyBub3QgYWZmZWN0ZWQgCgo2LjEgVGhpcyBMaWNlbnNlIGRvZXMgbm90IGFmZmVjdCBhbnkgcmlnaHRzIHRoYXQgWW91IG9yIGFueW9uZSBlbHNlIG1heQppbmRlcGVuZGVudGx5IGhhdmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IHRvIG1ha2UgYW55IHVzZSBvZiB0aGlzCkRhdGFiYXNlLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uOgoKICBhLiBFeGNlcHRpb25zIHRvIHRoZSBEYXRhYmFzZSBSaWdodCBpbmNsdWRpbmc6IEV4dHJhY3Rpb24gb2YgQ29udGVudHMKICBmcm9tIG5vbi1lbGVjdHJvbmljIERhdGFiYXNlcyBmb3IgcHJpdmF0ZSBwdXJwb3NlcywgRXh0cmFjdGlvbiBmb3IKICBwdXJwb3NlcyBvZiBpbGx1c3RyYXRpb24gZm9yIHRlYWNoaW5nIG9yIHNjaWVudGlmaWMgcmVzZWFyY2gsIGFuZAogIEV4dHJhY3Rpb24gb3IgUmUtdXRpbGlzYXRpb24gZm9yIHB1YmxpYyBzZWN1cml0eSBvciBhbiBhZG1pbmlzdHJhdGl2ZQogIG9yIGp1ZGljaWFsIHByb2NlZHVyZS4gCgogIGIuIEZhaXIgZGVhbGluZywgZmFpciB1c2UsIG9yIGFueSBvdGhlciBsZWdhbGx5IHJlY29nbmlzZWQgbGltaXRhdGlvbgogIG9yIGV4Y2VwdGlvbiB0byBpbmZyaW5nZW1lbnQgb2YgY29weXJpZ2h0IG9yIG90aGVyIGFwcGxpY2FibGUgbGF3cy4gCgo2LjIgVGhpcyBMaWNlbnNlIGRvZXMgbm90IGFmZmVjdCBhbnkgcmlnaHRzIG9mIGxhd2Z1bCB1c2VycyB0byBFeHRyYWN0CmFuZCBSZS11dGlsaXNlIGluc3Vic3RhbnRpYWwgcGFydHMgb2YgdGhlIENvbnRlbnRzLCBldmFsdWF0ZWQKcXVhbnRpdGF0aXZlbHkgb3IgcXVhbGl0YXRpdmVseSwgZm9yIGFueSBwdXJwb3NlcyB3aGF0c29ldmVyLCBpbmNsdWRpbmcKY3JlYXRpbmcgYSBEZXJpdmF0aXZlIERhdGFiYXNlIChzdWJqZWN0IHRvIG90aGVyIHJpZ2h0cyBvdmVyIHRoZQpDb250ZW50cywgc2VlIFNlY3Rpb24gMi40KS4gVGhlIHJlcGVhdGVkIGFuZCBzeXN0ZW1hdGljIEV4dHJhY3Rpb24gb3IKUmUtdXRpbGlzYXRpb24gb2YgaW5zdWJzdGFudGlhbCBwYXJ0cyBvZiB0aGUgQ29udGVudHMgbWF5IGhvd2V2ZXIgYW1vdW50CnRvIHRoZSBFeHRyYWN0aW9uIG9yIFJlLXV0aWxpc2F0aW9uIG9mIGEgU3Vic3RhbnRpYWwgcGFydCBvZiB0aGUKQ29udGVudHMuCgojIyMgNy4wIFdhcnJhbnRpZXMgYW5kIERpc2NsYWltZXIKCjcuMSBUaGUgRGF0YWJhc2UgaXMgbGljZW5zZWQgYnkgdGhlIExpY2Vuc29yICJhcyBpcyIgYW5kIHdpdGhvdXQgYW55CndhcnJhbnR5IG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzcywgaW1wbGllZCwgb3IgYXJpc2luZyBieSBzdGF0dXRlLApjdXN0b20sIGNvdXJzZSBvZiBkZWFsaW5nLCBvciB0cmFkZSB1c2FnZS4gTGljZW5zb3Igc3BlY2lmaWNhbGx5CmRpc2NsYWltcyBhbnkgYW5kIGFsbCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSwKbm9uLWluZnJpbmdlbWVudCwgYWNjdXJhY3kgb3IgY29tcGxldGVuZXNzLCB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZgplcnJvcnMsIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLCBtZXJjaGFudGFiaWxpdHksIG9yIG90aGVyd2lzZS4KU29tZSBqdXJpc2RpY3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9mIGltcGxpZWQgd2FycmFudGllcywgc28KdGhpcyBleGNsdXNpb24gbWF5IG5vdCBhcHBseSB0byBZb3UuCgojIyMgOC4wIExpbWl0YXRpb24gb2YgbGlhYmlsaXR5Cgo4LjEgU3ViamVjdCB0byBhbnkgbGlhYmlsaXR5IHRoYXQgbWF5IG5vdCBiZSBleGNsdWRlZCBvciBsaW1pdGVkIGJ5IGxhdywKdGhlIExpY2Vuc29yIGlzIG5vdCBsaWFibGUgZm9yLCBhbmQgZXhwcmVzc2x5IGV4Y2x1ZGVzLCBhbGwgbGlhYmlsaXR5CmZvciBsb3NzIG9yIGRhbWFnZSBob3dldmVyIGFuZCB3aGVuZXZlciBjYXVzZWQgdG8gYW55b25lIGJ5IGFueSB1c2UKdW5kZXIgdGhpcyBMaWNlbnNlLCB3aGV0aGVyIGJ5IFlvdSBvciBieSBhbnlvbmUgZWxzZSwgYW5kIHdoZXRoZXIgY2F1c2VkCmJ5IGFueSBmYXVsdCBvbiB0aGUgcGFydCBvZiB0aGUgTGljZW5zb3Igb3Igbm90LiBUaGlzIGV4Y2x1c2lvbiBvZgpsaWFiaWxpdHkgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgYW55IHNwZWNpYWwsIGluY2lkZW50YWwsCmNvbnNlcXVlbnRpYWwsIHB1bml0aXZlLCBvciBleGVtcGxhcnkgZGFtYWdlcyBzdWNoIGFzIGxvc3Mgb2YgcmV2ZW51ZSwKZGF0YSwgYW50aWNpcGF0ZWQgcHJvZml0cywgYW5kIGxvc3QgYnVzaW5lc3MuIFRoaXMgZXhjbHVzaW9uIGFwcGxpZXMKZXZlbiBpZiB0aGUgTGljZW5zb3IgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaApkYW1hZ2VzLgoKOC4yIElmIGxpYWJpbGl0eSBtYXkgbm90IGJlIGV4Y2x1ZGVkIGJ5IGxhdywgaXQgaXMgbGltaXRlZCB0byBhY3R1YWwgYW5kCmRpcmVjdCBmaW5hbmNpYWwgbG9zcyB0byB0aGUgZXh0ZW50IGl0IGlzIGNhdXNlZCBieSBwcm92ZWQgbmVnbGlnZW5jZSBvbgp0aGUgcGFydCBvZiB0aGUgTGljZW5zb3IuCgojIyMgOS4wIFRlcm1pbmF0aW9uIG9mIFlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZQoKOS4xIEFueSBicmVhY2ggYnkgWW91IG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UKYXV0b21hdGljYWxseSB0ZXJtaW5hdGVzIHRoaXMgTGljZW5zZSB3aXRoIGltbWVkaWF0ZSBlZmZlY3QgYW5kIHdpdGhvdXQKbm90aWNlIHRvIFlvdS4gRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsIFBlcnNvbnMgd2hvIGhhdmUgcmVjZWl2ZWQgdGhlCkRhdGFiYXNlLCB0aGUgd2hvbGUgb3IgYSBTdWJzdGFudGlhbCBwYXJ0IG9mIHRoZSBDb250ZW50cywgRGVyaXZhdGl2ZQpEYXRhYmFzZXMsIG9yIHRoZSBEYXRhYmFzZSBhcyBwYXJ0IG9mIGEgQ29sbGVjdGl2ZSBEYXRhYmFzZSBmcm9tIFlvdQp1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHByb3ZpZGVkCnRoZWlyIHVzZSBpcyBpbiBmdWxsIGNvbXBsaWFuY2Ugd2l0aCB0aGlzIExpY2Vuc2Ugb3IgYSBsaWNlbnNlIGdyYW50ZWQKdW5kZXIgU2VjdGlvbiA0Ljggb2YgdGhpcyBMaWNlbnNlLiAgU2VjdGlvbnMgMSwgMiwgNywgOCwgOSBhbmQgMTAgd2lsbApzdXJ2aXZlIGFueSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCgo5LjIgSWYgWW91IGFyZSBub3QgaW4gYnJlYWNoIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRoZSBMaWNlbnNvcgp3aWxsIG5vdCB0ZXJtaW5hdGUgWW91ciByaWdodHMgdW5kZXIgaXQuIAoKOS4zIFVubGVzcyB0ZXJtaW5hdGVkIHVuZGVyIFNlY3Rpb24gOS4xLCB0aGlzIExpY2Vuc2UgaXMgZ3JhbnRlZCB0byBZb3UKZm9yIHRoZSBkdXJhdGlvbiBvZiBhcHBsaWNhYmxlIHJpZ2h0cyBpbiB0aGUgRGF0YWJhc2UuIAoKOS40IFJlaW5zdGF0ZW1lbnQgb2YgcmlnaHRzLiBJZiB5b3UgY2Vhc2UgYW55IGJyZWFjaCBvZiB0aGUgdGVybXMgYW5kCmNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGVuIHlvdXIgZnVsbCByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlCndpbGwgYmUgcmVpbnN0YXRlZDoKCiAgYS4gUHJvdmlzaW9uYWxseSBhbmQgc3ViamVjdCB0byBwZXJtYW5lbnQgdGVybWluYXRpb24gdW50aWwgdGhlIDYwdGgKICBkYXkgYWZ0ZXIgY2Vzc2F0aW9uIG9mIGJyZWFjaDsgCgogIGIuIFBlcm1hbmVudGx5IG9uIHRoZSA2MHRoIGRheSBhZnRlciBjZXNzYXRpb24gb2YgYnJlYWNoIHVubGVzcwogIG90aGVyd2lzZSByZWFzb25hYmx5IG5vdGlmaWVkIGJ5IHRoZSBMaWNlbnNvcjsgb3IKCiAgYy4gIFBlcm1hbmVudGx5IGlmIHJlYXNvbmFibHkgbm90aWZpZWQgYnkgdGhlIExpY2Vuc29yIG9mIHRoZQogIHZpb2xhdGlvbiwgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBZb3UgaGF2ZSByZWNlaXZlZCBub3RpY2Ugb2YKICB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIGZyb20gIHRoZSBMaWNlbnNvciwgYW5kIFlvdSBjdXJlIHRoZQogIHZpb2xhdGlvbiBwcmlvciB0byAzMCBkYXlzIGFmdGVyIHlvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgoKUGVyc29ucyBzdWJqZWN0IHRvIHBlcm1hbmVudCB0ZXJtaW5hdGlvbiBvZiByaWdodHMgYXJlIG5vdCBlbGlnaWJsZSB0bwpiZSBhIHJlY2lwaWVudCBhbmQgcmVjZWl2ZSBhIGxpY2Vuc2UgdW5kZXIgU2VjdGlvbiA0LjguCgo5LjUgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgTGljZW5zb3IgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHJlbGVhc2UKdGhlIERhdGFiYXNlIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIG9yIHRvIHN0b3AgZGlzdHJpYnV0aW5nIG9yCm1ha2luZyBhdmFpbGFibGUgdGhlIERhdGFiYXNlLiBSZWxlYXNpbmcgdGhlIERhdGFiYXNlIHVuZGVyIGRpZmZlcmVudApsaWNlbnNlIHRlcm1zIG9yIHN0b3BwaW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIERhdGFiYXNlIHdpbGwgbm90CndpdGhkcmF3IHRoaXMgTGljZW5zZSAob3IgYW55IG90aGVyIGxpY2Vuc2UgdGhhdCBoYXMgYmVlbiwgb3IgaXMKcmVxdWlyZWQgdG8gYmUsIGdyYW50ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSksIGFuZCB0aGlzCkxpY2Vuc2Ugd2lsbCBjb250aW51ZSBpbiBmdWxsIGZvcmNlIGFuZCBlZmZlY3QgdW5sZXNzIHRlcm1pbmF0ZWQgYXMKc3RhdGVkIGFib3ZlLgoKIyMjIDEwLjAgR2VuZXJhbAoKMTAuMSBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIGludmFsaWQgb3IKdW5lbmZvcmNlYWJsZSwgdGhhdCBtdXN0IG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCnRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSBhbmQgZWFjaApyZW1haW5pbmcgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBiZSB2YWxpZCBhbmQgZW5mb3JjZWQgdG8gdGhlCmZ1bGxlc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuIAoKMTAuMiBUaGlzIExpY2Vuc2UgaXMgdGhlIGVudGlyZSBhZ3JlZW1lbnQgYmV0d2VlbiB0aGUgcGFydGllcyB3aXRoCnJlc3BlY3QgdG8gdGhlIHJpZ2h0cyBncmFudGVkIGhlcmUgb3ZlciB0aGUgRGF0YWJhc2UuIEl0IHJlcGxhY2VzIGFueQplYXJsaWVyIHVuZGVyc3RhbmRpbmdzLCBhZ3JlZW1lbnRzIG9yIHJlcHJlc2VudGF0aW9ucyB3aXRoIHJlc3BlY3QgdG8KdGhlIERhdGFiYXNlLiAKCjEwLjMgSWYgWW91IGFyZSBpbiBicmVhY2ggb2YgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgWW91IHdpbGwgbm90IGJlCmVudGl0bGVkIHRvIHJlbHkgb24gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB0byBjb21wbGFpbiBvZiBhbnkKYnJlYWNoIGJ5IHRoZSBMaWNlbnNvci4gCgoxMC40IENob2ljZSBvZiBsYXcuIFRoaXMgTGljZW5zZSB0YWtlcyBlZmZlY3QgaW4gYW5kIHdpbGwgYmUgZ292ZXJuZWQgYnkKdGhlIGxhd3Mgb2YgdGhlIHJlbGV2YW50IGp1cmlzZGljdGlvbiBpbiB3aGljaCB0aGUgTGljZW5zZSB0ZXJtcyBhcmUKc291Z2h0IHRvIGJlIGVuZm9yY2VkLiBJZiB0aGUgc3RhbmRhcmQgc3VpdGUgb2YgcmlnaHRzIGdyYW50ZWQgdW5kZXIKYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3IGFuZCBEYXRhYmFzZSBSaWdodHMgaW4gdGhlIHJlbGV2YW50Cmp1cmlzZGljdGlvbiBpbmNsdWRlcyBhZGRpdGlvbmFsIHJpZ2h0cyBub3QgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsCnRoZXNlIGFkZGl0aW9uYWwgcmlnaHRzIGFyZSBncmFudGVkIGluIHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byBtZWV0IHRoZQp0ZXJtcyBvZiB0aGlzIExpY2Vuc2Uu"
            },
            "url": "https://opendatacommons.org/licenses/odbl/odbl-10.txt"
          }
        }
      ],
      "data": [
        {
          "type": "dataset",
          "name": "Acme Dataset #1",
          "contents": {
            "url": "https://example.org/datasets/data-1.sql"
          }
        },
        {
          "type": "dataset",
          "name": "Acme Dataset #2",
          "contents": {
            "url": "https://example.org/datasets/data-2.sql"
          }
        }
      ]
    }
  ]
}