{
  "Event": {
    "analysis": "2",
    "date": "2025-12-13",
    "extends_uuid": "",
    "info": "BRICKSTORM Backdoor  - MAR-251165.c1.v1",
    "publish_timestamp": "1765618824",
    "published": true,
    "threat_level_id": "4",
    "timestamp": "1765616210",
    "uuid": "449f1f02-54d1-4af7-9bd8-beaba99e6d0c",
    "Orgc": {
      "name": "CIRCL",
      "uuid": "55f6ea5e-2c60-40e5-964f-47a8950d210f"
    },
    "Tag": [
      {
        "colour": "#cc06d1",
        "local": false,
        "name": "misp-galaxy:producer=\"GeminiProduction_CMA\"",
        "relationship_type": ""
      },
      {
        "colour": "#ffffff",
        "local": false,
        "name": "tlp:clear",
        "relationship_type": ""
      },
      {
        "colour": "#640600",
        "local": false,
        "name": "acs-marking:privilege_action=\"CISAUSES\"",
        "relationship_type": ""
      },
      {
        "colour": "#680600",
        "local": false,
        "name": "acs-marking:classification=\"U\"",
        "relationship_type": ""
      },
      {
        "colour": "#950900",
        "local": false,
        "name": "acs-marking:formal_determination=\"INFORMATION-DIRECTLY-RELATED-TO-CYBERSECURITY-THREAT\"",
        "relationship_type": ""
      },
      {
        "colour": "#f029a0",
        "local": false,
        "name": "misp-galaxy:stix-2.1-acs-marking=\"736f6810-1f28-5a7d-81b3-f7a498fb7cc8\"",
        "relationship_type": ""
      },
      {
        "colour": "#0088cc",
        "local": false,
        "name": "misp-galaxy:country=\"china\"",
        "relationship_type": "attributed-to"
      },
      {
        "colour": "#004646",
        "local": false,
        "name": "type:OSINT",
        "relationship_type": ""
      },
      {
        "colour": "#0071c3",
        "local": false,
        "name": "osint:lifetime=\"perpetual\"",
        "relationship_type": ""
      },
      {
        "colour": "#0087e8",
        "local": false,
        "name": "osint:certainty=\"50\"",
        "relationship_type": ""
      },
      {
        "colour": "#ffffff",
        "local": false,
        "name": "tlp:white",
        "relationship_type": ""
      },
      {
        "colour": "#0088cc",
        "local": false,
        "name": "misp-galaxy:threat-actor=\"UTA0178\"",
        "relationship_type": "attributed-to"
      }
    ],
    "Attribute": [
      {
        "category": "Payload installation",
        "comment": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\n[Redacted] ==> authentication key\r\nhttps://[redacted].com ==> HTTPS address constructed at runtime\r\nwss://[redacted].com/api ==> WebSocket address\r\n--End Elements--\r\n\r\nThe hard-coded domain has been redacted from this report. As of the release of this report, there has been no reuse of C2 domains across victims. Upon execution, the backdoor initiates the \"main_startNew\" function to configure environment variables. The backdoor then checks for the \"VMware\" environment variable to determine if it is running as a child process. If \"VMware\" is not set (indicating not a child process), the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/vmsrc\". If not running from the specified file path \"/etc/sysconfig/vmsrc\", the backdoor terminates its code execution. If the backdoor executes from the specified file path, the backdoor copies itself to \"/opt/vmware/sbin/vmware-sphere\". The backdoor then prepends \"/opt/vmware/sbin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"vmware-sphere\" due to the PATH modification and terminates its own execution. If \"VMware\" is set (indicating a child process), the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/opt/vmware/sbin/vmware-sphere\" is deleted.\r\n\r\nThe backdoor uses the \"main_selfWatcher function\" to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The \"main_selfWatcher\" function first checks for the \"Sphere\" environment variable and confirms the existence of a process named \"vmware-sphere\". If the checks return a \"false\" value (\"Sphere\" is not set ), indicating the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/vmsrc\" to a new location: \"/opt/vmware/sbin/vmware-sphere\". The backdoor then prepends \"/opt/vmware/sbin/\" to the PATH environment variable and the newly copied backdoor file \"vmware-sphere\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended (\"Sphere\" is set), the \"main_selfWatcher\" function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor configures its service by disabling its logger and setting two different sleep time parameters before applying these configurations using the \"main_setServiceCfg\" function. \r\n\r\nThe program contains a hard-coded list of public DoH servers to facilitate communications.\r\n\r\n---Begin DoH Addresses---\r\nhttps://1.0.0.1/dns-query  (Cloudflare)\r\nhttps://1.1.1.1/dns-query (Cloudflare)\r\nhttps://8.8.4.4/dns-query (Google)\r\nhttps://8.8.8.8/dns-query (Google)\r\nhttps://9.9.9.9/dns-query (Quad9)\r\n---End DoH Addresses---\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package \"wssoft2\" to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the C2 domain. The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare or Google or Quad9 to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform, then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/api\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the Cloudflare platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key, which has been redacted from this report. If authentication is successful, the backdoor proceeds to set up the multiplexing layer. The backdoor handles both Simple Multiplexing (smux)  and Yet Another Multiplexer (Yamux) libraries to create virtual streams over a single underlying TLS-secured connection based on client configuration or handshake data (Figure 6). This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system.\r\n\r\nDisplayed below are the three core handlers and their functions: \r\n\r\n--Begin Core Handlers--\r\na. \"wssoft2/core/handler/socks.HandleSocksRequest\" (socks.HandleSocksRequest) ==> This handler establishes a SOCKS relay, which facilitates lateral movement within a compromised network and routes C2 traffic (Figure 2). This handler is a SOCKS proxy handler that attempts to parse incoming requests as JSON-formatted SOCKS arguments. Depending on the success of this parsing, it either responds with an error or delegates the handling to a SOCKS handling mechanism \"wssoft2/core/handler/socks.SocksWithLocalAddr\" (socks.SocksWithLocalAddr). The handler \"socks.SocksWithLocalAddr\" performs SOCKS relaying and network tunneling over  Transmission Control Protocol (TCP), User Datagram Protocol (UDP), and Internet Control Message Protocol (ICMP).\r\n\r\nb. \"wssoft2/core/handler/web.WebService\" (web.WebService) ==> This handler establishes covert C2 communication by making the backdoor appear as a legitimate web server (Figure 3). The extension uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated Application Programming Interface (API) \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server (Figure 5). This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application. \r\n\r\nc. \"wssoft2/core/handler/command.HandleTTYRequest\" (command.HandleTTYRequest) ==> This handler is used to execute shell commands on the compromised system, granting the TA interactive command-line access (Figure 4). The handler initiates a request through its covert communication channels, parse a JSON payload into the a specific structure, extracts and executes an external command, specifically establishing a pseudo-terminal connection to it, enabling interactive control and data exchange with the running command.\r\n--End Core Handlers--\r\n\r\nDisplayed below are file management commands within the backdoor:\r\n\r\n--Begin File Management Commands--\r\n\"file-md5\": Calculates the MD5 checksum of a specified file to verify the integrity of the file.\r\n\"get-file\": Downloads a file from the compromised system to the TA's C2 server. \r\n\"list-dir\": Lists the contents of a directory on the compromised system (browse the file system).\r\n\"put-file\": Uploads a file from the TA's C2 server to the compromised system. \r\n\"slice-up\": To read and download specific, partial sections of a file. \r\n--End File Management Commands--",
        "deleted": false,
        "disable_correlation": false,
        "first_seen": "2025-12-02T16:07:23.663090+00:00",
        "timestamp": "1764090297",
        "to_ids": true,
        "type": "yara",
        "uuid": "642a0e43-0403-4d03-84ea-d2f29be4af53",
        "value": "'namespace'='CISA_Consolidated.yara' rule_name=CISA_251165_02 rule_content=rule CISA_251165_02 : BRICKSTORM backdoor installs_other_components communicates_with_c2 exfiltrates_data\n{\n   meta:\n       author = \"CISA Code & Media Analysis\"\n       incident = \"251165\"\n       date = \"2025-09-29\"\n       last_modified = \"202051001_1008\"\n       actor = \"n/a\"\n       family = \"BRICKSTORM\"\n       capabilities = \"installs-other-components communicates-with-c2 exfiltrates-data\"\n       malware_type = \"backdoor\"\n       tool_type = \"unknown\"\n       description = \"Detects Go-Based BRICKSTORM backdoor samples\"\n       sha256_1 = \"aaf5569c8e349c15028bc3fac09eb982efb06eabac955b705a6d447263658e38\"\n   strings:\n       $s0 = { 6D 61 69 6E 2E 73 74 61 72 74 4E 65 77 }\n       $s1 = { 6D 61 69 6E 2E 73 65 6C 66 57 61 74 63 68 65 72 }\n       $s2 = { 6D 61 69 6E 2E 73 65 74 53 65 72 76 69 63 65 43 66 67 }\n       $s3 = { 73 6F 63 6B 73 2E 48 61 6E 64 6C 65 53 6F 63 6B 73 52 65 71 75 65 73 74 }\n       $s4 = { 77 65 62 2E 57 65 62 53 65 72 76 69 63 65 }\n       $s5 = { 63 6F 6D 6D 61 6E 64 2E 48 61 6E 64 6C 65 54 54 59 52 65 71 75 65 73 74 }\n       $s6 = { 77 65 62 73 6F 63 6B 65 74 2E 28 2A 57 53 43 6F 6E 6E 65 63 74 6F 72 29 2E 43 6F 6E 6E 65 63 74 }\n       $s7 = { 66 73 2E 28 2A 57 65 62 53 65 72 76 65 72 29 2E 52 75 6E 53 65 72 76 65 72 }\n       $s8 = { 68 74 74 70 73 3A 2F 2F 31 2E 30 2E 30 2E 31 2F 64 6E 73 2D 71 75 65 72 79 }\n       $s9 = { 68 74 74 70 73 3A 2F 2F 31 2E 31 2E 31 2E 31 2F 64 6E 73 2D 71 75 65 72 79 }\n       $s10 = { 68 74 74 70 73 3A 2F 2F 38 2E 38 2E 34 2E 34 2F 64 6E 73 2D 71 75 65 72 79 }\n       $s11 = { 68 74 74 70 73 3A 2F 2F 38 2E 38 2E 38 2E 38 2F 64 6E 73 2D 71 75 65 72 79 }\n       $s12 = { 68 74 74 70 73 3A 2F 2F 39 2E 39 2E 39 2E 39 2F 64 6E 73 2D 71 75 65 72 79 }\n   condition:\n       8 of them\n}"
      },
      {
        "category": "Payload installation",
        "comment": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\nhkigbLKHR_Pby6t6P ==> authentication key\r\nhttps://[redacted].com ==> HTTPS address\r\nwss://[redacted].com/cls ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor uses XOR cipher encryption to hide key strings, such as its IPv4 addresses of public DoH servers and other strings within its code. Upon execution, the backdoor initiates the obfuscated function \"main_startNew\" to configure environment variables. The backdoor then checks for the \"[redacted]NET6\" environment variable to determine if it is running as a child process. If \"[redacted]NET6\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/viocli\". If not running from the specified file path \"/etc/sysconfig/viocli\", the backdoor terminates its code execution. If the backdoor executing from the specified file path, the backdoor copies itself to \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"updatemgr\" due to the PATH modification and terminates its own execution. If \"[redacted]NET6\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/usr/java/jre-vmware/bin/updatemgr\" is deleted.\r\n\r\nThe backdoor uses the obfuscated function \"main_selfWatcher\" to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The \"main_selfWatcher\" function first checks for the \"[redacted]NET5\" environment variable and confirms the existence of a process named \"updatemgr\". If the checks return a \"false\" value, indicating\"[redacted]NET5\" is not set, the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/viocli\" to a new location: \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable. The newly copied backdoor file \"updatemgr\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"[redacted]NET5\" is set, the \"main_selfWatcher\" function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor uses an XOR operation to decrypt the IPv4 addresses for the DoH servers below:\r\n\r\n--Begin DoH Addresses--\r\nhttps://8.8.8.8/dns-query (Google)\r\nhttps://8.8.4.4/dns-query (Google)\r\nhttps://9.9.9.9/dns-query (Quad9)\r\nhttps://45.90.28.160/dns-query (NextDNS)\r\nhttps://45.90.30.160/dns-query (NextDNS)\r\nhttps://149.112.112.112/dns-query (Quad9)\r\nhttps://9.9.9.11/dns-query (Quad9)\r\nhttps://1.1.1.1/dns-query (Cloudflare)\r\nhttps://1.0.0.1/dns-query (Cloudflare)\r\nhttps://149.112.112.11/dns-query (Quad9)\r\n--End DoH Addresses--\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the malicious C2 domain \"[redacted].com\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare, Google, Quad9 or NextDNS to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"https://[redacted].com\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/cls\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the cloud platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"hkigbLKHR_Pby6t6P\". An innermost TLS layer encrypts the actual C2 commands and data, securing them even if the outer layers are bypassed or decrypted. The backdoor uses the \"HashiCorp Yamux\" library to create multiple streams within a single innermost TLS-encrypted WebSocket tunnel. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nAfter establishing a secure and covert connection, the backdoor leverages its obfuscated core \"task.DoTask\" (/core/task.DoTask) function and four obfuscated extensions (modules) \"socks.Socks\", \"web.WebService\", \"command.Command\", and \"command.CommandNoContext\". These extensions define the malicious functionality that the backdoor should execute, allowing the TA to carry out various tasks on the compromised systems. These modules enable C2 communication, lateral movement, and command execution on the compromised system.\r\n\r\nDisplayed below are the four extensions and their functions:\r\n\r\n--Begin Extensions--\r\na. The Socks extension enables network tunneling through a SOCKS proxy, which facilitates lateral movement within a compromised network and routes C2 traffic.\r\n\r\nb. The WebService extension module establishes covert C2 communication by making the backdoor appear as a legitimate web server. The extension uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated API \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (HTML, CSS, JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command extension executes commands on the compromised system with a specific security context.\r\n\r\nd. The CommandNoContext extension executes commands on the compromised system without using an explicit security context.\r\n--End Extensions--\r\n\r\nThe backdoor maintains a persistent connection to the C2 server unless a specific termination command is received or the C2 server terminates the connection.",
        "deleted": false,
        "disable_correlation": false,
        "first_seen": "2025-12-02T16:07:23.699308+00:00",
        "timestamp": "1764090297",
        "to_ids": true,
        "type": "yara",
        "uuid": "25edb7ac-6790-46ff-9144-765748243681",
        "value": "'namespace'='CISA_Consolidated.yara' rule_name=CISA_251155_02 rule_content=rule CISA_251155_02 : BRICKSTORM backdoor installs_other_components communicates_with_c2 exfiltrates_data\n{\n   meta:\n       author = \"CISA Code & Media Analysis\"\n       incident = \"251155\"\n       date = \"2025-09-15\"\n       last_modified = \"20250916_1511\"\n       actor = \"n/a\"\n       family = \"BRICKSTORM\"\n       capabilities = \"installs-other-components communicates-with-c2 exfiltrates-data\"\n       malware_type = \"backdoor\"\n       tool_type = \"unknown\"\n       description = \"Detects Go-Based BRICKSTORM backdoor samples\"\n       sha256_1 = \"320a0b5d4900697e125cebb5ff03dee7368f8f087db1c1570b0b62f5a986d759\"\n       sha256_1 = \"dfac2542a0ee65c474b91d3b352540a24f4e223f1b808b741cfe680263f0ee44\"\n       sha256_1 = \"b91881cb1aa861138f2063ec130b2b01a8aaf0e3f04921e5cbfc61b09024bf12\"\n       sha256_1 = \"bfb3ffd46b21b2281374cd60bc756fe2dcc32486dcc156c9bd98f24101145454\"\n   strings:\n       $s0 = { 04 30 0F B6 54 04 2C 31 D1 88 4C 04 34 48 FF C0 }\n       $s1 = { 48 83 F8 04 7C E7 48 C7 04 24 }\n       $s2 = { 48 8D 44 24 34 48 89 44 24 08 48 C7 44 24 10 04 }\n       $s3 = { 48 89 44 24 48 48 89 4C 24 50 48 8B 6C 24 38 48 }\n       $s4 = { 48 83 EC 40 48 89 6C 24 38 48 8D 6C 24 38 C7 44 24 }\n       $s5 = { 83 EC 38 48 89 6C 24 30 48 8D 6C 24 30 C6 44 24 }\n       $s6 = { 4C 24 20 48 89 44 24 40 48 89 4C 24 48 48 8B 6C }\n       $s7 = { 64 48 8B 0C 25 F8 FF FF FF 48 3B 61 10 0F 86 81 }\n       $s8 = { 64 48 8B 0C 25 F8 FF FF FF 48 3B 61 10 0F 86 91 }\n   condition:\n      all of them\n}"
      },
      {
        "category": "Payload installation",
        "comment": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\n\"os235tfg_2ys872o.droso\" ==> authentication key\r\n\"hxxps[:]//[redacted].dev\" ==> HTTPS address generated\r\n\"wss://[redacted].dev/update\" ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor key strings, such as its IPv4 addresses of public DoH servers and other strings within its code are encrypted. The backdoor symbolic debugging information, such as function names and variable names, has been removed from the executable to evade detection and hinder analysis. \r\n\r\nUpon execution, the backdoor decrypts and sets the appropriate environment variables that are used to gain privileged access, hide its operations, and commands execution. The backdoor then checks for the \"CZePMeGj\" environment variable to determine if it is running as a child process. If \"CZePMeGj\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/network/if-up\". If not running from the specified file path \"/etc/sysconfig/network/if-up\", the backdoor terminates its code execution. If the backdoor executes from the specified file path, the backdoor copies itself to \"/etc/applmgmt/appliance/vami\". The backdoor then prepends \"/etc/applmgmt/appliance/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"vami\" due to the PATH modification and terminates its own execution. If \"CZePMeGj\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/etc/applmgmt/appliance/vami\" is deleted.\r\n\r\nThe backdoor uses a function to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The function first checks for the \"rcMJVF\" environment variable and confirms the existence of a process named \"vami\". If the checks return a \"false\" value (\"rcMJVF\" is not set ), indicating the backdoor is not running correctly, the backdoor reinstalls itself from \"/etc/sysconfig/network/if-up\" to a new location: \"/etc/applmgmt/appliance/vami\". The backdoor then prepends \"/etc/applmgmt/appliance/\" to the PATH environment variable and the newly copied backdoor file \"vami\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"rcMJVF\" is set, the function allows the code to continue its normal malicious operations. The backdoor configures its service by disabling its logger and setting two different sleep time parameters. The program utilizes public DoH servers to facilitate communications.\r\n\r\nDisplayed below are sample DoH servers utilized by the backdoor:\r\n\r\n---Begin DoH Addresses---\r\nhxxps[:]//1.0.0.1/dns-query (Cloudflare)\r\nhxxps[:]//1.1.1.1/dns-query (Cloudflare)\r\nhxxps[:]//8.8.4.4/dns-query (Google)\r\nhxxps[:]//8.8.8.8/dns-query (Google)\r\nhxxps[:]//9.9.9.9/dns-query (Quad9)\r\n---End DoH Addresses---\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the C2 domain \"[redacted].dev\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare, Google, or Quad9 to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"hxxps[:]//[redacted]dev\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].dev/update\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the Cloudflare platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"os235tfg_2ys872o.droso\". If authentication is successful, the backdoor proceeds to set up the multiplexing layer. The backdoor handles both Simple Multiplexing (smux) and Yet Another Multiplexer (Yamux) libraries to create virtual streams over a single underlying TLS-secured connection based on client configuration or handshake data. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system.\r\n\r\nDisplayed below are the four core handlers and their functions:\r\n\r\n--Begin Core Handlers--\r\na. The Socks handler establishes a SOCKS relay, which facilitates lateral movement within a compromised network and routes C2 traffic (Figure 2). This handler is a SOCKS proxy handler that attempts to parse incoming requests as JSON-formatted SOCKS arguments. Depending on the success of this parsing, it either responds with an error or delegates the handling to a SOCKS handling mechanism \"wssoft2/core/handler/\r\nsocks.SocksWithLocalAddr\" (socks.SocksWithLocalAddr). The handler \"socks.SocksWithLocalAddr\" performs SOCKS relaying and network tunneling over TCP, UDP, and ICMP.\r\n\r\nb. The WebService handler establishes covert C2 communication by making the backdoor appear as a legitimate web server (Figure 3). The handler uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated API \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server (Figure 5). This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files HTML, CSS, JavaScript from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command handler executes shell commands on the compromised system with a specific security context, granting the TA interactive command-line access. The handler initiates a request through its covert communication channels, parse a JSON payload into the a specific structure, extracts and executes an external command, specifically establishing a pseudo-terminal connection to it, enabling interactive control and data exchange with the running  command.\r\n\r\nd. The CommandNoContext handler executes shell commands on the compromised system without using an explicit security context. \r\n--End Core Handlers--",
        "deleted": false,
        "disable_correlation": false,
        "first_seen": "2025-12-02T16:07:23.728294+00:00",
        "timestamp": "1764090297",
        "to_ids": true,
        "type": "yara",
        "uuid": "4d2a4aea-d0c6-41e2-bc6a-cc8f57367ecf",
        "value": "'namespace'='CISA_Consolidated.yara' rule_name=CISA_251186_02 rule_content=rule CISA_251186_02 : BRICKSTORM backdoor installs_other_components communicates_with_c2 exfiltrates_data\n{\n   meta:\n       author = \"CISA Code & Media Analysis\"\n       incident = \"251186\"\n       date = \"2025-11-17\"\n       last_modified = \"n/a\"\n       actor = \"n/a\"\n       family = \"BRICKSTORM\"\n       capabilities = \"installs-other-components communicates-with-c2 exfiltrates-data\"\n       malware_type = \"backdoor\"\n       tool_type = \"unknown\"\n       description = \"Detects Go-Based BRICKSTORM backdoor samples\"\n       sha256_1 = \"57bd98dbb5a00e54f07ffacda1fea91451a0c0b532cd7d570e98ce2ff741c21d\"\n   strings:\n       $s0 = { 31 F7 40 88 7C 04 4C 48 FF C0 }\n       $s1 = { 44 01 C7 40 88 7C 14 30 48 FF C2 0F 1F 00 }\n       $s2 = { 41 89 F0 31 FE 01 D6 66 90 49 83 F8 11  }\n       $s3 = { 48 8B 44 24 08 48 8B 5C 24 10 48 8B 4C 24 18  }\n       $s4 = { 48 89 C1 48 89 DF 48 8D 05 0F 6F 15 00}\n       $s5 = { 48 8D 3D 9A 6D 15 00 4D 89 C1 49 89 F0 }\n       $s6 = { 81 39 49 43 4D 50 74 0C  }\n       $s7 = { E8 FB E6 FF FF E8 76 D0 FF FF E8 91 C0 FF FF 48 8B 05 EA BF 53}\n   condition:\n      all of them\n}"
      },
      {
        "category": "Payload installation",
        "comment": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor symbolic debugging information, such as function names and variable names, has been removed from the executable to evade detection and hinder analysis. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\n\"hkigbLKHR_Pby6t6P\" ==> authentication key\r\n\"hxxps[:]//[redacted].com\" ==> HTTPS address\r\n\"wss://[redacted].com/akamai\" ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor uses XOR cipher encryption to hide key strings, such as its Internet Protocol version 4 (IPv4) addresses of public DoH servers and other strings within its code. Upon execution, the backdoor initiates a function to configure environment variables. The backdoor then checks for the \"[redacted]NET4\" environment variable to determine if it is running as a child process. If \"[redacted]NET4\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/vnetd\". If not running from the specified file path \"/etc/sysconfig/vnetd\", the backdoor terminates its code execution. If the backdoor executing from the specified file path, the backdoor copies itself to \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"updatemgr\" due to the PATH modification and terminates its own execution. If \"[redacted]NET4\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/usr/java/jre-vmware/bin/updatemgr\" is deleted.\r\n\r\nThe backdoor uses a function\" to ensure its continued operation and maintain persistence on the compromised system. This self preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and reexecutes itself. The function first checks for the \"[redacted]NET3\" environment variable and confirms the existence of a process named \"vnetd\". If the checks return a \"false\" value, then \"[redacted]NET3\" is not set, indicating the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/vnetd\" to a new location: \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable. The newly copied backdoor file \"updatemgr\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"[redacted]NET3\" is set, the function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor uses an XOR operation to decrypt the IPv4 addresses for the DoH servers below:\r\n\r\n--Begin DoH Addresses--\r\nhxxps[:]//8.8.8.8/dns-query (Google)\r\nhxxps[:]//9.9.9.9/dns-query (Quad9)\r\nhxxps[:]//9.9.9.11/dns-query (Quad9)\r\nhxxps[:]//1.1.1.1/dns-query (Cloudflare)\r\nhxxps[:]//1.0.0.1/dns-query (Cloudflare)\r\nhxxps[:]//45.90.28.160/dns-query (NextDNS)\r\nhxxps[:]//45.90.30.160/dns-query (NextDNS)\r\nhxxps[:]//149.112.112.112/dns-query (Quad9)\r\nhxxps[:]//149.112.112.11/dns-query (Quad9)\r\n--End DoH Addresses--\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the malicious C2 domain \"[redacted].com\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare, Google, Quad9 or NextDNS to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"hxxps[:]//[redacted].com\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/akamai\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the Cloudflare platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"hkigbLKHR_Pby6t6P\". If authentication is successful, the backdoor proceeds to set up the multiplexing layer. The backdoor uses the \"HashiCorp Yamux\" library to create multiple streams within a single innermost TLS-encrypted WebSocket tunnel. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system.\r\n\r\nDisplayed below are the four core handlers and their functions:\r\n\r\n--Begin Core Handlers--\r\na. The Socks handler establishes a SOCKS relay, which facilitates lateral movement within a compromised network and routes C2 traffic.\r\n\r\nb. The WebService handler establishes covert C2 communication by making the backdoor appear as a legitimate web server. The handler uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated Application Programming Interface ( API) \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command handler executes shell commands on the compromised system with a specific security context, granting the TA interactive command-line access.\r\n\r\nd. The CommandNoContext handler executes shell commands on the compromised system without using an explicit security context.\r\n--End Core Handlers--",
        "deleted": false,
        "disable_correlation": false,
        "first_seen": "2025-12-02T16:07:23.823719+00:00",
        "timestamp": "1764090297",
        "to_ids": true,
        "type": "yara",
        "uuid": "6188c547-3fd0-44ea-a85d-f769c0e1fc39",
        "value": "'namespace'='CISA_Consolidated.yara' rule_name=CISA_251186_01 rule_content=rule CISA_251186_01 : BRICKSTORM backdoor installs_other_components communicates_with_c2 exfiltrates_data\n{\n   meta:\n       author = \"CISA Code & Media Analysis\"\n       incident = \"251186\"\n       date = \"2025-11-17\"\n       last_modified = \"n/a\"\n       actor = \"n/a\"\n       family = \"BRICKSTORM\"\n       capabilities = \"installs-other-components communicates-with-c2 exfiltrates-data\"\n       malware_type = \"backdoor\"\n       tool_type = \"unknown\"\n       description = \"Detects Go-Based BRICKSTORM backdoor samples\"\n       sha256_1 = \"013211c56caaa697914b5b5871e4998d0298902e336e373ebb27b7db30917eaf\"       \n   strings:\n       $s0 = { 41 89 F8 31 F7 8D 3C 39 8D 7F }\n       $s1 = { 41 31 FA 44 88 14 30 46 88 0C 00 48 83 C1 02 }\n       $s2 = { BA 61 6D 64 36 81 FA 61 6D 64 36 }\n       $s3 = { 41 89 F0 31 FE 01 CE 01 D6 49 83 F8 1F }\n       $s4 = { 4D 89 CA 49 83 F1 5B 41 29 F0 49 83 F9 44 }\n       $s5 = { 48 89 F7 48 83 F6 45 48 83 FE 48 }\n       $s6 = { B8 11 C6 F3 EB 48 BB 31 46 42 BB 0E DD CF F2 }\n       $s7 = { 41 89 F8 31 F7 01 CF 48 83 FE 11 }\n   condition:\n      all of them\n}"
      }
    ],
    "Object": [
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "f5354b16-a65c-4638-ac2e-0312216d47a7",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "f5354b16-a65c-4638-ac2e-0312216d47a7",
            "referenced_uuid": "82a0396b-2f7f-5a01-b4df-9fbb5c42a6f3",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "fc803138-acc3-41a0-a48c-d59494a90c71"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "57e2e215-d2b6-54c5-93a2-a45e7f4c1daf",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "b57361d9-3f25-5b75-baa6-cf50a964bc3d",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "fee61a47-fe61-56bd-8330-5de9ba2feefa",
            "value": "a variant of Linux/BrickStorm.A trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "82a0396b-2f7f-5a01-b4df-9fbb5c42a6f3",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "82a0396b-2f7f-5a01-b4df-9fbb5c42a6f3",
            "referenced_uuid": "ae83eb6c-e58d-4503-9723-425cb47a70a0",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "c4854d99-a036-47b7-80e4-b9b6f358253b"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "de9c4ca3-cc34-5b3e-af88-f632190bbb9a",
            "value": "8e4c88d00b6eb46229a1ed7001451320",
            "Tag": [
              {
                "colour": "#5ebf54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"45fc9eb2-d046-5bce-8c65-23e01721251a\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "257a2cc7-f66f-55bb-a950-2299c0476544",
            "value": "9bf4c786ebd68c0181cfe3eb85d2fd202ed12c54",
            "Tag": [
              {
                "colour": "#5ebf54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"45fc9eb2-d046-5bce-8c65-23e01721251a\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "1671b84b-efb3-5720-bf5a-423b647ddfc7",
            "value": "aaf5569c8e349c15028bc3fac09eb982efb06eabac955b705a6d447263658e38",
            "Tag": [
              {
                "colour": "#5ebf54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"45fc9eb2-d046-5bce-8c65-23e01721251a\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "d3c9aaea-d34e-5306-b9e7-821a012fef56",
            "value": "5e654776e9c419e11e6f93a452415a601bd9a2079710f1074608570e498a9af37b81bb57c98cb8bb626c5ee4b3e35757d3ae8c1c3717f28d9f3fe7a4cebe0608",
            "Tag": [
              {
                "colour": "#5ebf54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"45fc9eb2-d046-5bce-8c65-23e01721251a\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "c62ee219-4774-5455-99ba-c6721ef43d68",
            "value": "49152:9lDeYNeYunc1S3/U05q+CIKUbwgBfd1Vww/uUJSZina/TokDDko0n8oQhEoAgsUJ:O3lcE380sIDbdB11p3i/TokEIowlb/r",
            "Tag": [
              {
                "colour": "#5ebf54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"45fc9eb2-d046-5bce-8c65-23e01721251a\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "94f38166-1c79-5085-84d8-e86f013f67ab",
            "value": "vmsrc",
            "Tag": [
              {
                "colour": "#5ebf54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"45fc9eb2-d046-5bce-8c65-23e01721251a\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "61f1b992-4749-573f-8cbb-0fbf14c7405e",
            "value": "7692288"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "c77daba0-aba8-420c-b231-33b6b9452b2c",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "c77daba0-aba8-420c-b231-33b6b9452b2c",
            "referenced_uuid": "82a0396b-2f7f-5a01-b4df-9fbb5c42a6f3",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "4f69182d-b09b-4723-8622-5ded358a04e5"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "eb0d7ec1-6c5b-5b8a-82e7-098a4088c53c",
            "value": "sophos"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "18d4a21c-c455-5a20-84ed-63d9bdfff63f",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "d915f150-ce8b-5d8a-aa10-f5809b98dda1",
            "value": "Linux/Brick-B"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "ae83eb6c-e58d-4503-9723-425cb47a70a0",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "8a2a23be-8550-5c6b-bfb4-8d4e7b35c5f7",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\n[Redacted] ==> authentication key\r\nhttps://[redacted].com ==> HTTPS address constructed at runtime\r\nwss://[redacted].com/api ==> WebSocket address\r\n--End Elements--\r\n\r\nThe hard-coded domain has been redacted from this report. As of the release of this report, there has been no reuse of C2 domains across victims. Upon execution, the backdoor initiates the \"main_startNew\" function to configure environment variables. The backdoor then checks for the \"VMware\" environment variable to determine if it is running as a child process. If \"VMware\" is not set (indicating not a child process), the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/vmsrc\". If not running from the specified file path \"/etc/sysconfig/vmsrc\", the backdoor terminates its code execution. If the backdoor executes from the specified file path, the backdoor copies itself to \"/opt/vmware/sbin/vmware-sphere\". The backdoor then prepends \"/opt/vmware/sbin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"vmware-sphere\" due to the PATH modification and terminates its own execution. If \"VMware\" is set (indicating a child process), the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/opt/vmware/sbin/vmware-sphere\" is deleted.\r\n\r\nThe backdoor uses the \"main_selfWatcher function\" to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The \"main_selfWatcher\" function first checks for the \"Sphere\" environment variable and confirms the existence of a process named \"vmware-sphere\". If the checks return a \"false\" value (\"Sphere\" is not set ), indicating the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/vmsrc\" to a new location: \"/opt/vmware/sbin/vmware-sphere\". The backdoor then prepends \"/opt/vmware/sbin/\" to the PATH environment variable and the newly copied backdoor file \"vmware-sphere\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended (\"Sphere\" is set), the \"main_selfWatcher\" function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor configures its service by disabling its logger and setting two different sleep time parameters before applying these configurations using the \"main_setServiceCfg\" function. \r\n\r\nThe program contains a hard-coded list of public DoH servers to facilitate communications.\r\n\r\n---Begin DoH Addresses---\r\nhttps://1.0.0.1/dns-query  (Cloudflare)\r\nhttps://1.1.1.1/dns-query (Cloudflare)\r\nhttps://8.8.4.4/dns-query (Google)\r\nhttps://8.8.8.8/dns-query (Google)\r\nhttps://9.9.9.9/dns-query (Quad9)\r\n---End DoH Addresses---\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package \"wssoft2\" to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the C2 domain. The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare or Google or Quad9 to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform, then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/api\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the Cloudflare platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key, which has been redacted from this report. If authentication is successful, the backdoor proceeds to set up the multiplexing layer. The backdoor handles both Simple Multiplexing (smux)  and Yet Another Multiplexer (Yamux) libraries to create virtual streams over a single underlying TLS-secured connection based on client configuration or handshake data (Figure 6). This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system.\r\n\r\nDisplayed below are the three core handlers and their functions: \r\n\r\n--Begin Core Handlers--\r\na. \"wssoft2/core/handler/socks.HandleSocksRequest\" (socks.HandleSocksRequest) ==> This handler establishes a SOCKS relay, which facilitates lateral movement within a compromised network and routes C2 traffic (Figure 2). This handler is a SOCKS proxy handler that attempts to parse incoming requests as JSON-formatted SOCKS arguments. Depending on the success of this parsing, it either responds with an error or delegates the handling to a SOCKS handling mechanism \"wssoft2/core/handler/socks.SocksWithLocalAddr\" (socks.SocksWithLocalAddr). The handler \"socks.SocksWithLocalAddr\" performs SOCKS relaying and network tunneling over  Transmission Control Protocol (TCP), User Datagram Protocol (UDP), and Internet Control Message Protocol (ICMP).\r\n\r\nb. \"wssoft2/core/handler/web.WebService\" (web.WebService) ==> This handler establishes covert C2 communication by making the backdoor appear as a legitimate web server (Figure 3). The extension uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated Application Programming Interface (API) \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server (Figure 5). This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application. \r\n\r\nc. \"wssoft2/core/handler/command.HandleTTYRequest\" (command.HandleTTYRequest) ==> This handler is used to execute shell commands on the compromised system, granting the TA interactive command-line access (Figure 4). The handler initiates a request through its covert communication channels, parse a JSON payload into the a specific structure, extracts and executes an external command, specifically establishing a pseudo-terminal connection to it, enabling interactive control and data exchange with the running command.\r\n--End Core Handlers--\r\n\r\nDisplayed below are file management commands within the backdoor:\r\n\r\n--Begin File Management Commands--\r\n\"file-md5\": Calculates the MD5 checksum of a specified file to verify the integrity of the file.\r\n\"get-file\": Downloads a file from the compromised system to the TA's C2 server. \r\n\"list-dir\": Lists the contents of a directory on the compromised system (browse the file system).\r\n\"put-file\": Uploads a file from the TA's C2 server to the compromised system. \r\n\"slice-up\": To read and download specific, partial sections of a file. \r\n--End File Management Commands--"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "4a0458fa-d22c-5a52-98a1-42abaf43227f",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "bbfe3480-ef47-5330-b0f8-baecab85d337",
            "value": "backdoor"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "0cbe1860-ab35-5617-81d4-3d22688a8708",
            "value": "trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.669148+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "c36214cb-77db-48e0-9645-3a1160aa9daf",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "8aff7d54-d271-49bc-aee3-ef108165b82e",
            "value": "8e4c88d00b6eb46229a1ed7001451320"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "c5ed7e03-6353-4039-9c7c-c52ec1d27d46",
            "value": "9bf4c786ebd68c0181cfe3eb85d2fd202ed12c54"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "0beddb76-a14a-44c5-92fc-4becaffa9b44",
            "value": "aaf5569c8e349c15028bc3fac09eb982efb06eabac955b705a6d447263658e38"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "d4059e62-1eba-4a32-b79c-c3c532eecf21",
            "value": "5e654776e9c419e11e6f93a452415a601bd9a2079710f1074608570e498a9af37b81bb57c98cb8bb626c5ee4b3e35757d3ae8c1c3717f28d9f3fe7a4cebe0608"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "2a891aeb-4623-4b77-a794-5817b3f9f7b9",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "2a891aeb-4623-4b77-a794-5817b3f9f7b9",
            "referenced_uuid": "beedb4f5-d0b3-5822-82f3-e09e636bf0af",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "0b1bf5e9-ced2-4bc4-a617-958b3df8cfb7"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "d8a24650-2616-5ba0-be5e-cb42e0a56f8b",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "8e2ef68c-73a7-5362-8f5f-f6c19e06901c",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "f056d0be-55f2-5d5f-9de8-af7259dd26e7",
            "value": "a variant of Linux/BrickStorm.A trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "beedb4f5-d0b3-5822-82f3-e09e636bf0af",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "beedb4f5-d0b3-5822-82f3-e09e636bf0af",
            "referenced_uuid": "f8fa7b0f-ccba-4a6f-a9ba-9aef296885a6",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "5056d66b-a5ce-4d5c-b1b0-48e1dd32ceb8"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "fdd235ae-5138-5a1c-9073-8937e3c4eff2",
            "value": "0a4fa52803a389311a9ddc49b7b19138",
            "Tag": [
              {
                "colour": "#db42d9",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"8f3d3dea-dd75-5edf-ae79-a3b97056cb0e\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "e5fd8d32-683f-5ffa-ac43-ee67d4513f3d",
            "value": "97001baaa379bcd83677dca7bc5b8048fdfaaddc",
            "Tag": [
              {
                "colour": "#db42d9",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"8f3d3dea-dd75-5edf-ae79-a3b97056cb0e\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "f714be5c-a291-56c8-8a3c-2ead43205a1d",
            "value": "b3b6a992540da96375e4781afd3052118ad97cfe60ccf004d732f76678f6820a",
            "Tag": [
              {
                "colour": "#db42d9",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"8f3d3dea-dd75-5edf-ae79-a3b97056cb0e\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "e72e3c76-cdd2-52ee-876f-76228df26881",
            "value": "65ebf5dfafb8972ffead44271436ec842517cfaaf3d1f1f1237a32d66e1d280943bd3a69f1d539a1b7aca6152e96b29bc822e1047e2243f6aec8959595560147",
            "Tag": [
              {
                "colour": "#db42d9",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"8f3d3dea-dd75-5edf-ae79-a3b97056cb0e\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "1c54304a-2dbf-5825-809c-a0f887ceab18",
            "value": "49152:BgClz8/9cMSThwhWyh/zypzOzRzqm9hRp6FY+fAn/bkNqr+HfHF2xkdpb3gAiDli:W08/9I6WMzUcRz9zvn//Z5D",
            "Tag": [
              {
                "colour": "#db42d9",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"8f3d3dea-dd75-5edf-ae79-a3b97056cb0e\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "8a0fe2a2-55a3-5973-a2ab-f3a022b46cae",
            "value": "b3b6a992540da96375e4781afd3052118ad97cfe60ccf004d732f76678f6820a",
            "Tag": [
              {
                "colour": "#db42d9",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"8f3d3dea-dd75-5edf-ae79-a3b97056cb0e\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "3f8a4c49-4556-5bad-bd46-658d8e0d71b0",
            "value": "6311936"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "f8fa7b0f-ccba-4a6f-a9ba-9aef296885a6",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "57ee1aa7-8052-56e0-9afd-76171b0b2ce9",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\nhkigbLKHR_Pby6t6P ==> authentication key\r\nhttps://[redacted].com ==> HTTPS address\r\nwss://[redacted].com/cls ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor uses XOR cipher encryption to hide key strings, such as its IPv4 addresses of public DoH servers and other strings within its code. Upon execution, the backdoor initiates the obfuscated function \"main_startNew\" to configure environment variables. The backdoor then checks for the \"[redacted]NET6\" environment variable to determine if it is running as a child process. If \"[redacted]NET6\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/viocli\". If not running from the specified file path \"/etc/sysconfig/viocli\", the backdoor terminates its code execution. If the backdoor executing from the specified file path, the backdoor copies itself to \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"updatemgr\" due to the PATH modification and terminates its own execution. If \"[redacted]NET6\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/usr/java/jre-vmware/bin/updatemgr\" is deleted.\r\n\r\nThe backdoor uses the obfuscated function \"main_selfWatcher\" to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The \"main_selfWatcher\" function first checks for the \"[redacted]NET5\" environment variable and confirms the existence of a process named \"updatemgr\". If the checks return a \"false\" value, indicating\"[redacted]NET5\" is not set, the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/viocli\" to a new location: \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable. The newly copied backdoor file \"updatemgr\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"[redacted]NET5\" is set, the \"main_selfWatcher\" function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor uses an XOR operation to decrypt the IPv4 addresses for the DoH servers below:\r\n\r\n--Begin DoH Addresses--\r\nhttps://8.8.8.8/dns-query (Google)\r\nhttps://8.8.4.4/dns-query (Google)\r\nhttps://9.9.9.9/dns-query (Quad9)\r\nhttps://45.90.28.160/dns-query (NextDNS)\r\nhttps://45.90.30.160/dns-query (NextDNS)\r\nhttps://149.112.112.112/dns-query (Quad9)\r\nhttps://9.9.9.11/dns-query (Quad9)\r\nhttps://1.1.1.1/dns-query (Cloudflare)\r\nhttps://1.0.0.1/dns-query (Cloudflare)\r\nhttps://149.112.112.11/dns-query (Quad9)\r\n--End DoH Addresses--\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the malicious C2 domain \"[redacted].com\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare, Google, Quad9 or NextDNS to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"https://[redacted].com\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/cls\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the cloud platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"hkigbLKHR_Pby6t6P\". An innermost TLS layer encrypts the actual C2 commands and data, securing them even if the outer layers are bypassed or decrypted. The backdoor uses the \"HashiCorp Yamux\" library to create multiple streams within a single innermost TLS-encrypted WebSocket tunnel. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nAfter establishing a secure and covert connection, the backdoor leverages its obfuscated core \"task.DoTask\" (/core/task.DoTask) function and four obfuscated extensions (modules) \"socks.Socks\", \"web.WebService\", \"command.Command\", and \"command.CommandNoContext\". These extensions define the malicious functionality that the backdoor should execute, allowing the TA to carry out various tasks on the compromised systems. These modules enable C2 communication, lateral movement, and command execution on the compromised system.\r\n\r\nDisplayed below are the four extensions and their functions:\r\n\r\n--Begin Extensions--\r\na. The Socks extension enables network tunneling through a SOCKS proxy, which facilitates lateral movement within a compromised network and routes C2 traffic.\r\n\r\nb. The WebService extension module establishes covert C2 communication by making the backdoor appear as a legitimate web server. The extension uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated API \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (HTML, CSS, JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command extension executes commands on the compromised system with a specific security context.\r\n\r\nd. The CommandNoContext extension executes commands on the compromised system without using an explicit security context.\r\n--End Extensions--\r\n\r\nThe backdoor maintains a persistent connection to the C2 server unless a specific termination command is received or the C2 server terminates the connection."
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "225f1961-a6c7-5d1b-b7c8-fd475df1a2a3",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "7edbcc7c-5c92-56f4-8881-c7aaa2c1fe5d",
            "value": "trojan"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "8c6eea72-b583-5725-a05e-0a256b072b81",
            "value": "backdoor"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.703679+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "44bd627f-0a5a-42cf-a77c-c648b36aaed6",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "c8759e9e-9e0c-41a2-b0fc-20e88e997a98",
            "value": "0a4fa52803a389311a9ddc49b7b19138"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "8c2451ef-36e7-4e29-bcd3-696ed43fff35",
            "value": "97001baaa379bcd83677dca7bc5b8048fdfaaddc"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "17a634b0-2541-4e04-b52f-6adbfa8f76e6",
            "value": "b3b6a992540da96375e4781afd3052118ad97cfe60ccf004d732f76678f6820a"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "690a5856-0401-4f70-9850-d144fd56e59b",
            "value": "65ebf5dfafb8972ffead44271436ec842517cfaaf3d1f1f1237a32d66e1d280943bd3a69f1d539a1b7aca6152e96b29bc822e1047e2243f6aec8959595560147"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "8f04ffb7-d228-432f-b034-634a325c7353",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "8f04ffb7-d228-432f-b034-634a325c7353",
            "referenced_uuid": "ea36678c-0575-5968-991c-104d15a3155f",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "f5877b81-9e4b-4f39-939a-ccded5e259b4"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "6b310131-1c11-5f9a-9903-23df215a6cef",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "3637758b-8a90-5e21-8c69-425f552563fb",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "cf855744-25c9-58ac-8c18-69801e349555",
            "value": "a variant of Linux/Packed.Obfuscated.B suspicious application"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "ea36678c-0575-5968-991c-104d15a3155f",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "ea36678c-0575-5968-991c-104d15a3155f",
            "referenced_uuid": "40307a25-c650-432a-98c2-5e2162cc9d93",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "50600f11-2bfa-4102-a354-cd6de6c913ee"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "74ad0816-0f1f-5d1c-98bd-b0562c76c07f",
            "value": "dbca28ad420408850a94d5c325183b28",
            "Tag": [
              {
                "colour": "#2620bf",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"92a62f4a-d3d8-5f50-ada5-60ece3f14a72\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "56dcf6a8-9d9a-5155-86b4-081322faf6bf",
            "value": "fb11c6caa4ea844942fe97f46d7eb42bc76911ab",
            "Tag": [
              {
                "colour": "#2620bf",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"92a62f4a-d3d8-5f50-ada5-60ece3f14a72\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "e290c84e-c335-516e-abbb-05a361d11161",
            "value": "57bd98dbb5a00e54f07ffacda1fea91451a0c0b532cd7d570e98ce2ff741c21d",
            "Tag": [
              {
                "colour": "#2620bf",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"92a62f4a-d3d8-5f50-ada5-60ece3f14a72\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "a653ede9-81a1-5cf9-9be4-5ca813640713",
            "value": "659205fa2cfa85e484c091cc2e85a7ec4e332b196e423b1f39bafdc8fca33e3db712bbe07afcc091ff26d9b4f641fa9a73f2a66dce9a0ced54ebeb8c2be82a7f",
            "Tag": [
              {
                "colour": "#2620bf",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"92a62f4a-d3d8-5f50-ada5-60ece3f14a72\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "529d74bc-d2b3-5055-9a91-30b331662556",
            "value": "98304:dzB06b0KX4Mnb+sJf+AjBzH3MF4m1d4U2TuAJ5VGY3glknTSk2nH:dFQKIsJBBzXMum83RJ5VGY3gS2nH",
            "Tag": [
              {
                "colour": "#2620bf",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"92a62f4a-d3d8-5f50-ada5-60ece3f14a72\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "ba81d2af-ad00-5327-8cc9-c399d672da8e",
            "value": "57bd98dbb5a00e54f07ffacda1fea91451a0c0b532cd7d570e98ce2ff741c21d",
            "Tag": [
              {
                "colour": "#2620bf",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"92a62f4a-d3d8-5f50-ada5-60ece3f14a72\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "f0354eed-f3cb-5b9b-8270-3a4d81d0961e",
            "value": "15511700"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "40307a25-c650-432a-98c2-5e2162cc9d93",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "cf40bf09-0a8e-5064-934a-0bfdb55bd02e",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\n\"os235tfg_2ys872o.droso\" ==> authentication key\r\n\"hxxps[:]//[redacted].dev\" ==> HTTPS address generated\r\n\"wss://[redacted].dev/update\" ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor key strings, such as its IPv4 addresses of public DoH servers and other strings within its code are encrypted. The backdoor symbolic debugging information, such as function names and variable names, has been removed from the executable to evade detection and hinder analysis. \r\n\r\nUpon execution, the backdoor decrypts and sets the appropriate environment variables that are used to gain privileged access, hide its operations, and commands execution. The backdoor then checks for the \"CZePMeGj\" environment variable to determine if it is running as a child process. If \"CZePMeGj\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/network/if-up\". If not running from the specified file path \"/etc/sysconfig/network/if-up\", the backdoor terminates its code execution. If the backdoor executes from the specified file path, the backdoor copies itself to \"/etc/applmgmt/appliance/vami\". The backdoor then prepends \"/etc/applmgmt/appliance/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"vami\" due to the PATH modification and terminates its own execution. If \"CZePMeGj\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/etc/applmgmt/appliance/vami\" is deleted.\r\n\r\nThe backdoor uses a function to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The function first checks for the \"rcMJVF\" environment variable and confirms the existence of a process named \"vami\". If the checks return a \"false\" value (\"rcMJVF\" is not set ), indicating the backdoor is not running correctly, the backdoor reinstalls itself from \"/etc/sysconfig/network/if-up\" to a new location: \"/etc/applmgmt/appliance/vami\". The backdoor then prepends \"/etc/applmgmt/appliance/\" to the PATH environment variable and the newly copied backdoor file \"vami\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"rcMJVF\" is set, the function allows the code to continue its normal malicious operations. The backdoor configures its service by disabling its logger and setting two different sleep time parameters. The program utilizes public DoH servers to facilitate communications.\r\n\r\nDisplayed below are sample DoH servers utilized by the backdoor:\r\n\r\n---Begin DoH Addresses---\r\nhxxps[:]//1.0.0.1/dns-query (Cloudflare)\r\nhxxps[:]//1.1.1.1/dns-query (Cloudflare)\r\nhxxps[:]//8.8.4.4/dns-query (Google)\r\nhxxps[:]//8.8.8.8/dns-query (Google)\r\nhxxps[:]//9.9.9.9/dns-query (Quad9)\r\n---End DoH Addresses---\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the C2 domain \"[redacted].dev\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare, Google, or Quad9 to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"hxxps[:]//[redacted]dev\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].dev/update\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the Cloudflare platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"os235tfg_2ys872o.droso\". If authentication is successful, the backdoor proceeds to set up the multiplexing layer. The backdoor handles both Simple Multiplexing (smux) and Yet Another Multiplexer (Yamux) libraries to create virtual streams over a single underlying TLS-secured connection based on client configuration or handshake data. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system.\r\n\r\nDisplayed below are the four core handlers and their functions:\r\n\r\n--Begin Core Handlers--\r\na. The Socks handler establishes a SOCKS relay, which facilitates lateral movement within a compromised network and routes C2 traffic (Figure 2). This handler is a SOCKS proxy handler that attempts to parse incoming requests as JSON-formatted SOCKS arguments. Depending on the success of this parsing, it either responds with an error or delegates the handling to a SOCKS handling mechanism \"wssoft2/core/handler/\r\nsocks.SocksWithLocalAddr\" (socks.SocksWithLocalAddr). The handler \"socks.SocksWithLocalAddr\" performs SOCKS relaying and network tunneling over TCP, UDP, and ICMP.\r\n\r\nb. The WebService handler establishes covert C2 communication by making the backdoor appear as a legitimate web server (Figure 3). The handler uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated API \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server (Figure 5). This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files HTML, CSS, JavaScript from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command handler executes shell commands on the compromised system with a specific security context, granting the TA interactive command-line access. The handler initiates a request through its covert communication channels, parse a JSON payload into the a specific structure, extracts and executes an external command, specifically establishing a pseudo-terminal connection to it, enabling interactive control and data exchange with the running  command.\r\n\r\nd. The CommandNoContext handler executes shell commands on the compromised system without using an explicit security context. \r\n--End Core Handlers--"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "9e829d9a-b6af-5db1-acdd-35e4a5148429",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "a76fcaab-7d1d-5b23-b900-1c1666def8a8",
            "value": "backdoor"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "bb15242a-cfd9-5dd6-8696-804c7018a795",
            "value": "trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.733061+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "56fb6e2f-81de-40a6-b6ec-44f882c97f01",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "5ca5ed30-a769-4fcb-94d8-e52a7cc0fa14",
            "value": "dbca28ad420408850a94d5c325183b28"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "c6248231-57d3-420b-ac3e-72776a43f033",
            "value": "fb11c6caa4ea844942fe97f46d7eb42bc76911ab"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "f66ba7ce-4266-4a12-a8b4-c825f8b8144e",
            "value": "57bd98dbb5a00e54f07ffacda1fea91451a0c0b532cd7d570e98ce2ff741c21d"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "6b232d8e-b337-4e55-ad64-f8a74f189e28",
            "value": "659205fa2cfa85e484c091cc2e85a7ec4e332b196e423b1f39bafdc8fca33e3db712bbe07afcc091ff26d9b4f641fa9a73f2a66dce9a0ced54ebeb8c2be82a7f"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "e143b379-91af-4d97-9115-3bd1021d375d",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "e143b379-91af-4d97-9115-3bd1021d375d",
            "referenced_uuid": "7cfa9e0d-f4d5-522c-ac5a-0b50692005e0",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "abd12f38-ecba-4ca2-841e-c86805acb3a2"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "c1af8678-15fb-54ca-8e7c-edff4f402903",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "3cb1bf53-e2b9-5b7e-a57b-df30b2489bff",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "91aa48a6-4213-55e9-99c3-30eea7b3ceea",
            "value": "a variant of Linux/BrickStorm.A trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "7cfa9e0d-f4d5-522c-ac5a-0b50692005e0",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "7cfa9e0d-f4d5-522c-ac5a-0b50692005e0",
            "referenced_uuid": "5728db75-d25d-4cb6-8cad-cc8db838403f",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "1bf8cb64-3a99-409d-ab42-f72f30b5d36a"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "e190217e-59f3-5fc8-8beb-55e7ed3c3658",
            "value": "a02469742f7b0bc9a8ab5e26822b3fa8",
            "Tag": [
              {
                "colour": "#932b54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"1c5fa66c-9351-5f14-adb7-3ac30cac2668\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "377ef930-1f2e-5928-9f30-5676a241659a",
            "value": "10d811029f6e5f58cd06143d6353d3b05bc06d0f",
            "Tag": [
              {
                "colour": "#932b54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"1c5fa66c-9351-5f14-adb7-3ac30cac2668\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "b790b6cf-a79d-5b81-bcdc-47aa809a38b3",
            "value": "73fe8b8fb4bd7776362fd356fdc189c93cf5d9f6724f6237d829024c10263fe5",
            "Tag": [
              {
                "colour": "#932b54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"1c5fa66c-9351-5f14-adb7-3ac30cac2668\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "62336ad4-787a-5bfe-ac6d-5c065832cdb7",
            "value": "8e29aeb3603ffe307b2d60f7401bd9978bebe8883235eb88052ebf6b9e04ce6bf35667480cedea5712c1e13e8c6dcfb34d5fde0ddca6ca31328de0152509bf8f",
            "Tag": [
              {
                "colour": "#932b54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"1c5fa66c-9351-5f14-adb7-3ac30cac2668\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "a0903910-0e37-5348-bea4-ce75d4a37c3f",
            "value": "98304:78Se5lqfYMKDdopPx0E4j+dM/GLaCXNwqYL6wt/5APUnU:78Se54fYMUaiE4j+dM/GLaCXNmLP+",
            "Tag": [
              {
                "colour": "#932b54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"1c5fa66c-9351-5f14-adb7-3ac30cac2668\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "439839cc-06e7-5908-89fb-463cc66bc990",
            "value": "73fe8b8fb4bd7776362fd356fdc189c93cf5d9f6724f6237d829024c10263fe5",
            "Tag": [
              {
                "colour": "#932b54",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"1c5fa66c-9351-5f14-adb7-3ac30cac2668\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "459770f8-42b3-5249-bce2-96f1fccccce7",
            "value": "8332689"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "5728db75-d25d-4cb6-8cad-cc8db838403f",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "6a046317-cf32-5eab-9eb5-6f3f375642f9",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM, which is designed to handle environment variables for connection parameters, set up logging, configure a WebSocket connector, create service instances, and define request handlers for different request types. The backdoor uses the SOCKS proxying, VSOCK proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor uses XOR cipher encryption to hide key strings within its code. The backdoor variables, core functions, and extended arguments are obfuscated using a custom-built sophisticated tool-set to evade detection and hinder analysis. \r\n\r\nUpon execution, the backdoor retrieves three C2 connection parameters from environment variables below:\r\n\r\n--Begin Configuration Values--\r\nlistenAddr  ==> Listen address and port (default: \"127.0.0.1:8090\"). \r\n\r\nlistenPath ==> Listen path to route requests to a handler function (WSS connection).\r\n\r\npassword ==> Authentication key (AuthKey).\r\n--End Configuration Values--\r\n\r\nIf the environment variables for connection parameters are retrieved, the backdoor initiates a function \"main_startNew\" to configure environment variables. The backdoor checks the current working directory path and compares it with the value of the retrieved environment variable \"VARGS\" to determine if the backdoor is running as a child process. If they do not match, indicating a child process is not running, the backdoor copies itself to a new constructed path on the system. The backdoor then prepends the new constructed path to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor starts the new process and terminates its own execution. \r\n\r\nThe backdoor uses the function \"main_selfWatcher \" to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The \"main_selfWatcher\" function first checks the value of the retrieved environment variable \"VREG\"  and compares it with the current working directory path. If the checks return a \"false\" value, then \"VREG\" is not set, indicating the backdoor is not running correctly, the backdoor re-installs itself to a new constructed path on the system. The backdoor then prepends the new constructed path to the PATH environment variable. The newly copied backdoor file is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating that \"VREG\" is set, the \"main_selfWatcher\" function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor attempts to establish a WSS server with minimal external dependencies. This setup allows for encrypted communication without relying on a publicly trusted Certificate Authority or certificate files on disk. The backdoor dynamically generates a self-signed X.509 certificate and a corresponding 2048-bit private key in memory. The in-memory generated certificate and the private key are then loaded into a \"tls.Certificate\" struct, which is then assigned to the Certificates field of a \"tls.Config\" object. A standard \"net/http\" server is configured to use this custom \"tls.Config\" to handle HTTPS/WSS connections. \r\n\r\nThe backdoor utilizes a single, multiplexed connection over WSS to a specified C2 address (listenAddr) and path (listenPath). The backdoor implements a custom authentication check, involving the specific pre-shared AuthKey (password), during or before the WSS handshake, the connection upgrade process. Once the WSS connection is established, all communication is encrypted. This encryption leverages the in-memory self-signed certificates.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system. \r\n\r\nDisplayed below are the six core handlers and their functions: \r\n\r\n--Begin Core Handlers-- \r\n\r\na. The Socks handler (Figure 5) establishes a SOCKS relay, which facilitates lateral movement within a compromised network and routes C2 traffic. This handler is a SOCKS proxy handler that attempts to parse incoming requests as JSON-formatted SOCKS arguments. Depending on the success of this parsing, it either responds with an error or delegates the handling to a SOCKS handling mechanism. The handler performs SOCKS relaying and network tunneling over Transmission Control Protocol (TCP), User Datagram Protocol (UDP), and Internet Control Message Protocol (ICMP). \r\n\r\nb. The WebService handler (Figure 6) establishes covert C2 communication by making the backdoor appear as a legitimate web server. The handler uses the Go programming language, leveraging the \"net/http package\" to create a web server on the compromised system. A dedicated API \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. \r\n\r\nc. The CommandNoContext handler (Figure 7) executes commands on the compromised system without using an explicit security context. \r\n\r\nd. The Command handler (Figure 8) executes commands on the compromised system with a specific security context. The handler executes shell commands on the compromised system, granting the TA interactive command-line access. The handler initiates a request through its covert communication channels, parse a JSON payload into the a specific structure, extracts and executes an external command, specifically establishing a pseudo-terminal connection to it, enabling interactive control and data exchange with the running command.\r\n\r\ne. The VSOCK-proxy handler (Figure 9) implements a proxy that dynamically configures its outgoing connections based on a JSON payload received in the incoming request. The handler processes an incoming network request containing a JSON payload with specific configuration arguments to establish a tunneled connection. The handler unmarshals the JSON data and validates the extracted arguments below:\r\n\r\n--Begin Configuration Arguments--\r\nTunnelAddr:  The destination network address (IP address or hostname) where the proxy will forward data from the VSOCK connection.\r\nCID: A unique identifier for a virtual machine or the host within the VSOCK environment.\r\nPort: The port number used for the connection\r\nFamily ==> The address type specified as AF_VSOCK\r\n--End Configuration Arguments--\r\n\r\nUsing the validated arguments, the handler binds to a specific VSOCK address (defined by the CID and Port). It then establishes a connection to the destination specified by \"TunnelAddr\". The handler relays traffic between the client and the target server. This can be a direct tunnel or a relay via the proxy, depending on the configuration. The VSOCK-proxy can be used to maintain covert communication channels, evade detection, and pivot within virtualized environments. Upon completion or termination of the connection, the handler sends an appropriate success or error response back to the client.\r\n\r\nf. The VSOCK connection handler (Figure 10) processes an incoming network request containing a JSON payload with specific configuration arguments to connect to a VSOCK endpoint. The handler extracts the JSON payload from the request and uses a JSON parser to unmarshal the data into a structured object with fields for CID, Port, and Family. The handler checks the unmarshalled data for validity and if the configuration is valid, the handler creates or connects to a VSOCK endpoint using a specified CID and Port number. If the virtual socket creation is successful, the handler allocates a new runtime object to hold the CID and port information. If unmarshalling fails, validation fails, or the destination connection cannot be established, the handler returns an appropriate error to the client.\r\n\r\n--End Core Handlers--"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "19e94c78-f301-5a48-92da-bbb7087c8abe",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "b97a3423-16fc-514e-bdf8-a1884c536d2b",
            "value": "trojan"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "a28cf2be-c9a5-5b28-8089-9606b54d7c0c",
            "value": "backdoor"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.763618+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "c0694e87-bfbe-4a83-a6c7-04d7bee48ff3",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "c3f502d3-b201-4f85-9ff5-88d51f4d0949",
            "value": "a02469742f7b0bc9a8ab5e26822b3fa8"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "133751cb-acc4-449e-9c44-f0ab2d9fc6fb",
            "value": "10d811029f6e5f58cd06143d6353d3b05bc06d0f"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "3232c757-105a-400b-ae08-92274500296d",
            "value": "73fe8b8fb4bd7776362fd356fdc189c93cf5d9f6724f6237d829024c10263fe5"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "380ef9fa-4b2b-4c63-976a-b1d9f3dc33f8",
            "value": "8e29aeb3603ffe307b2d60f7401bd9978bebe8883235eb88052ebf6b9e04ce6bf35667480cedea5712c1e13e8c6dcfb34d5fde0ddca6ca31328de0152509bf8f"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "e3cf196a-ddd0-4b33-9b40-e95862d59d44",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "e3cf196a-ddd0-4b33-9b40-e95862d59d44",
            "referenced_uuid": "1ccb31a2-c105-5188-8560-2d48ea5a5179",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "c62018d4-5c76-47fe-9ee8-da3e1399f3d4"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "0a568e10-2178-557b-a856-3c76ab9c223d",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "2170b9f1-2bfd-5e8f-8bc1-e0c6ffdb6272",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "2259ebd6-8ee5-55fc-b9ee-5313b6ddbbc8",
            "value": "a variant of Linux/BrickStorm.A trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "1ccb31a2-c105-5188-8560-2d48ea5a5179",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "1ccb31a2-c105-5188-8560-2d48ea5a5179",
            "referenced_uuid": "d75aa0a4-452a-40cf-93a9-b2655f85fb4c",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "7a42cf6c-0a76-4c90-bd3b-28a5040d5f51"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "4a07f8d9-1839-58e9-92fc-8b1949eabe29",
            "value": "a52e36a70b5e0307cbcaa5fd7c97882c",
            "Tag": [
              {
                "colour": "#a7008b",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"81596b5d-fbde-50a8-ab2c-aa490939e21f\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "a9ac2d3f-6552-59c5-956f-1d4ef34eff6e",
            "value": "44a3d3f15ef75d9294345462e1b82272b0d11985",
            "Tag": [
              {
                "colour": "#a7008b",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"81596b5d-fbde-50a8-ab2c-aa490939e21f\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "aa90215c-f620-5f06-8b13-1ad98c5b92a0",
            "value": "39b3d8a8aedffc1b40820f205f6a4dc041cd37262880e5030b008175c45b0c46",
            "Tag": [
              {
                "colour": "#a7008b",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"81596b5d-fbde-50a8-ab2c-aa490939e21f\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "27eafc49-c681-5357-9d96-3d27c2a1bda6",
            "value": "bbe18d32bef66ccfa931468511e8ba55b32943e47a1df1e68bb5c8f8ae97a5bf991201858ae9632fa24df5f6c674b6cb260297a1c11889ca61bda68513f440ce",
            "Tag": [
              {
                "colour": "#a7008b",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"81596b5d-fbde-50a8-ab2c-aa490939e21f\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "bd90f51b-da24-5d05-9ecf-f8962e484a6b",
            "value": "98304:78Se5lqfYMKDdopPx0E4j+dM/GLaCXNwqYL6wt/5APUnb:78Se54fYMUaiE4j+dM/GLaCXNmLP+",
            "Tag": [
              {
                "colour": "#a7008b",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"81596b5d-fbde-50a8-ab2c-aa490939e21f\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "80cadad1-5f12-5b1a-a3e8-ff54187fd13d",
            "value": "39b3d8a8aedffc1b40820f205f6a4dc041cd37262880e5030b008175c45b0c46",
            "Tag": [
              {
                "colour": "#a7008b",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"81596b5d-fbde-50a8-ab2c-aa490939e21f\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "180a614c-f059-54e8-acc2-c82ee3c2ad27",
            "value": "8332689"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "d75aa0a4-452a-40cf-93a9-b2655f85fb4c",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "e6feff4c-4aaf-5cd9-b1d0-2493b646b85b",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM, which is designed to handle environment variables for connection parameters, set up logging, configure a WebSocket connector, create service instances, and define request handlers for different request types. The backdoor uses the VSOCK proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor uses Exclusive OR (XOR) cipher encryption to hide key strings within its code. The backdoor variables, core functions, and extended arguments are obfuscated using a custom-built sophisticated tool-set to evade detection and hinder analysis. \r\n\r\nUpon execution, the backdoor retrieves three C2 connection parameters from environment variables below:\r\n\r\n--Begin Configuration Values--\r\nlistenAddr  ==> Listen address and port (default: \"127.0.0.1:8090\") \r\n\r\nlistenPath ==> Listen path to route requests to a handler function (WebSocket Secure (WSS) connection).\r\n\r\npassword ==> Authentication key (AuthKey).\r\n--End Configuration Values--\r\n\r\nIf the environment variables for connection parameters are retrieved, the backdoor initiates a function to configure environment variables. The backdoor checks the current working directory path and compares it with the value of the retrieved environment variable \"VARGS\" to determine if the backdoor is running as a child process. If they do not match, indicating that a child process is not running, the backdoor copies itself to a new constructed path on the system. The backdoor will then prepend the new constructed path to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor starts the new process and terminates its own execution. \r\n\r\nThe backdoor uses a function to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The function first checks the value of the retrieved environment variable \"VREG\" and compares it with the current working directory path. If the checks return a \"false\" value, then the \"VREG\" is not set, indicating the backdoor is not running correctly, and the backdoor will re-install itself to a new constructed path on the system. The backdoor then prepends the new constructed path to the PATH environment variable. The newly copied backdoor file is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, then the \"VREG\" is set, and the function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor attempts to establish a WSS server with minimal external dependencies. This setup allows for encrypted communication without relying on a publicly trusted Certificate Authority or certificate files on disk. The backdoor dynamically generates a self-signed X.509 certificate and a corresponding 2048-bit private key in memory. The in-memory generated certificate and the private key are then loaded into a \"tls.Certificate\" struct, which is then assigned to the Certificates field of a \"tls.Config\" object. A standard \"net/http\" server is configured to use this custom \"tls.Config\" to handle HTTPS/WSS connections. \r\n\r\nThe backdoor utilizes a single, multiplexed connection over WSS to a specified C2 address (listenAddr) and path (listenPath). The backdoor implements a custom authentication check, involving the specific pre-shared AuthKey (password), during or before the WSS handshake, the connection upgrade process. Once the WSS connection is established, all communication is encrypted. This encryption leverages the in-memory self-signed certificates.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system. \r\n\r\nDisplayed below are the four core handlers and their functions: \r\n\r\n--Begin Core Handlers-- \r\n\r\na. The WebService handler (Figure 1) establishes covert C2 communication by making the backdoor appear as a legitimate web server. The handler uses the Go programming language, leveraging the \"net/http package\" to create a web server on the compromised system. A dedicated Application Programming Interface (API) \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. \r\n\r\nb. The Command handler (Figure 2) executes shell commands on the compromised system, granting the TA interactive command-line access. The handler initiates a request through its covert communication channels, parse a JSON payload into the a specific structure, extracts and executes an external command, specifically establishing a pseudo-terminal connection to it, enabling interactive control and data exchange with the running command.\r\n\r\nc. The VSOCK-proxy handler (Figure 3) implements a proxy that dynamically configures its outgoing connections based on a JSON payload received in the incoming request. The handler processes an incoming network request containing a JSON payload with specific configuration arguments to establish a tunneled connection. The handler unmarshals the JSON data and validates the extracted arguments below:\r\n\r\n--Begin Configuration Arguments--\r\nTunnelAddr:  The destination network address (IP address or hostname) where the proxy will forward data from the VSOCK connection.\r\nContext ID (CID): A unique identifier for a virtual machine or the host within the VSOCK environment.\r\nPort: The port number used for the connection\r\nFamily ==> The address type specified as AF_VSOCK\r\n--End Configuration Arguments--\r\n\r\nUsing the validated arguments, the handler binds to a specific VSOCK address (defined by the CID and Port). It then establishes a connection to the destination specified by \"TunnelAddr\". The handler relays traffic between the client and the target server. This can be a direct tunnel or a relay via the proxy, depending on the configuration. The VSOCK-proxy can be used to maintain covert communication channels, evade detection, and pivot within virtualized environments. Upon completion or termination of the connection, the handler sends an appropriate success or error response back to the client.\r\n\r\nd. The VSOCK connection handler (Figure 4) processes an incoming network request containing a JSON payload with specific configuration arguments to connect to a VSOCK endpoint. The handler extracts the JSON payload from the request and uses a JSON parser to unmarshal the data into a structured object with fields for CID, Port, and Family. The handler checks the unmarshalled data for validity and if the configuration is valid, the handler creates or connects to a VSOCK endpoint using a specified CID and Port number. If the virtual socket creation is successful, the handler allocates a new runtime object to hold the CID and port information. If unmarshalling fails, validation fails, or the destination connection cannot be established, the handler returns an appropriate error to the client.\r\n\r\n--End Core Handlers--"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "5654503d-adb3-5212-aee7-5960e8942657",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "909884aa-80df-55c0-855f-8121f232bab8",
            "value": "trojan"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "4cd6a252-78d1-5d8e-aebc-9ec55e6c66ae",
            "value": "backdoor"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.796430+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "71dacf5e-eca9-4231-864b-d1ea3fc1add8",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "6eed6207-1e96-49fa-943b-7f3862d16a77",
            "value": "a52e36a70b5e0307cbcaa5fd7c97882c"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "edea4060-0fd8-4465-8ec0-e8374f2d7058",
            "value": "44a3d3f15ef75d9294345462e1b82272b0d11985"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "a9db7137-7c46-42ff-afad-d8eac302aed7",
            "value": "39b3d8a8aedffc1b40820f205f6a4dc041cd37262880e5030b008175c45b0c46"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "c45cfee3-7192-4966-b4bd-a60a8659322d",
            "value": "bbe18d32bef66ccfa931468511e8ba55b32943e47a1df1e68bb5c8f8ae97a5bf991201858ae9632fa24df5f6c674b6cb260297a1c11889ca61bda68513f440ce"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "6718a605-b74b-4d10-b416-e73b61c60c36",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "6718a605-b74b-4d10-b416-e73b61c60c36",
            "referenced_uuid": "a6183d27-0008-5c4f-b8fc-d7b67ba57d27",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "bff58b4a-51c8-446a-8b44-3a79713351e1"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "81613e23-a021-5541-85f9-8758fb9b62c9",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "55e5bca0-6f27-5e0c-9e7c-5e4e9c7b5a57",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "5925e8ec-f0af-529f-95b5-d4caf9a26550",
            "value": "a variant of Linux/Packed.Obfuscated.B suspicious application"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "a6183d27-0008-5c4f-b8fc-d7b67ba57d27",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "a6183d27-0008-5c4f-b8fc-d7b67ba57d27",
            "referenced_uuid": "b822331a-9a4a-478c-82bb-791c70796ca7",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "5f915102-aa72-451d-ab90-2fe567af3be2"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "07af55cb-5dd3-5377-b8b1-58414b2e59a4",
            "value": "39111508bfde89ce6e0fe6abe0365552",
            "Tag": [
              {
                "colour": "#4b773a",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"e6b28fb3-3da3-5cff-849e-4e5f5383065d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "86aaab58-615d-5392-85be-cbb5899a38ff",
            "value": "f639d9404c03af86ce452db5c5e0c528b81dc0d7",
            "Tag": [
              {
                "colour": "#4b773a",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"e6b28fb3-3da3-5cff-849e-4e5f5383065d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "277c1010-9461-5dd9-8470-12e1904bdf41",
            "value": "013211c56caaa697914b5b5871e4998d0298902e336e373ebb27b7db30917eaf",
            "Tag": [
              {
                "colour": "#4b773a",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"e6b28fb3-3da3-5cff-849e-4e5f5383065d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "5abc5279-315a-5d80-8726-8d3116289458",
            "value": "74b4c6f7c7cae07c6f8edf3f2fb1e9206d4f1f9734e8e4784b15d192eec8cd8a4f59078fc0c56dc4ad0856cdd792337b5c92ffd3d2240c8a287a776df4363bba",
            "Tag": [
              {
                "colour": "#4b773a",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"e6b28fb3-3da3-5cff-849e-4e5f5383065d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "9631628b-e601-5792-8888-e58c03af65b0",
            "value": "196608:GbkKsdDjru3WUIOsW5SYVRk/Qvk1LzK3RMxy2wBW:GwKMjr3Os4k/QiLzERMMdW",
            "Tag": [
              {
                "colour": "#4b773a",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"e6b28fb3-3da3-5cff-849e-4e5f5383065d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "fed78cfe-a184-5ed1-91f7-dea98403dd23",
            "value": "013211c56caaa697914b5b5871e4998d0298902e336e373ebb27b7db30917eaf",
            "Tag": [
              {
                "colour": "#4b773a",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"e6b28fb3-3da3-5cff-849e-4e5f5383065d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "9002d3df-d1f5-5b0b-9737-6afe4d604856",
            "value": "26603668"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "b822331a-9a4a-478c-82bb-791c70796ca7",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "c4bb0c6d-578f-5290-b27b-ab7ddd232b1b",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor symbolic debugging information, such as function names and variable names, has been removed from the executable to evade detection and hinder analysis. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\n\"hkigbLKHR_Pby6t6P\" ==> authentication key\r\n\"hxxps[:]//[redacted].com\" ==> HTTPS address\r\n\"wss://[redacted].com/akamai\" ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor uses XOR cipher encryption to hide key strings, such as its Internet Protocol version 4 (IPv4) addresses of public DoH servers and other strings within its code. Upon execution, the backdoor initiates a function to configure environment variables. The backdoor then checks for the \"[redacted]NET4\" environment variable to determine if it is running as a child process. If \"[redacted]NET4\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/vnetd\". If not running from the specified file path \"/etc/sysconfig/vnetd\", the backdoor terminates its code execution. If the backdoor executing from the specified file path, the backdoor copies itself to \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"updatemgr\" due to the PATH modification and terminates its own execution. If \"[redacted]NET4\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/usr/java/jre-vmware/bin/updatemgr\" is deleted.\r\n\r\nThe backdoor uses a function\" to ensure its continued operation and maintain persistence on the compromised system. This self preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and reexecutes itself. The function first checks for the \"[redacted]NET3\" environment variable and confirms the existence of a process named \"vnetd\". If the checks return a \"false\" value, then \"[redacted]NET3\" is not set, indicating the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/vnetd\" to a new location: \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable. The newly copied backdoor file \"updatemgr\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"[redacted]NET3\" is set, the function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor uses an XOR operation to decrypt the IPv4 addresses for the DoH servers below:\r\n\r\n--Begin DoH Addresses--\r\nhxxps[:]//8.8.8.8/dns-query (Google)\r\nhxxps[:]//9.9.9.9/dns-query (Quad9)\r\nhxxps[:]//9.9.9.11/dns-query (Quad9)\r\nhxxps[:]//1.1.1.1/dns-query (Cloudflare)\r\nhxxps[:]//1.0.0.1/dns-query (Cloudflare)\r\nhxxps[:]//45.90.28.160/dns-query (NextDNS)\r\nhxxps[:]//45.90.30.160/dns-query (NextDNS)\r\nhxxps[:]//149.112.112.112/dns-query (Quad9)\r\nhxxps[:]//149.112.112.11/dns-query (Quad9)\r\n--End DoH Addresses--\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the malicious C2 domain \"[redacted].com\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare, Google, Quad9 or NextDNS to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"hxxps[:]//[redacted].com\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/akamai\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the Cloudflare platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"hkigbLKHR_Pby6t6P\". If authentication is successful, the backdoor proceeds to set up the multiplexing layer. The backdoor uses the \"HashiCorp Yamux\" library to create multiple streams within a single innermost TLS-encrypted WebSocket tunnel. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nOnce the connection is established with the C2 server via WebSockets, the backdoor receives commands that are directed to specific handlers to perform tasks on the compromised system.\r\n\r\nDisplayed below are the four core handlers and their functions:\r\n\r\n--Begin Core Handlers--\r\na. The Socks handler establishes a SOCKS relay, which facilitates lateral movement within a compromised network and routes C2 traffic.\r\n\r\nb. The WebService handler establishes covert C2 communication by making the backdoor appear as a legitimate web server. The handler uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated Application Programming Interface ( API) \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command handler executes shell commands on the compromised system with a specific security context, granting the TA interactive command-line access.\r\n\r\nd. The CommandNoContext handler executes shell commands on the compromised system without using an explicit security context.\r\n--End Core Handlers--"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "f5702b15-b620-5c19-b29b-64a1d13f2af8",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "81429218-b19f-580a-80b8-49ff5fafa4b6",
            "value": "backdoor"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "ad6e4392-ff65-5e52-aa4e-ebf5a63ea38b",
            "value": "trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.829421+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "2ab5e5f8-d3af-4214-a345-e44fbfd2fbe5",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "d3ae85ec-b2e7-45fb-8dbe-c9f0cb140699",
            "value": "39111508bfde89ce6e0fe6abe0365552"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "efea5a6a-72bf-4f90-bde3-537871ce4b65",
            "value": "f639d9404c03af86ce452db5c5e0c528b81dc0d7"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "136863c6-026a-42e7-b291-15315077a31a",
            "value": "013211c56caaa697914b5b5871e4998d0298902e336e373ebb27b7db30917eaf"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "37b1c801-fb30-4300-b46e-9a18bba8554c",
            "value": "74b4c6f7c7cae07c6f8edf3f2fb1e9206d4f1f9734e8e4784b15d192eec8cd8a4f59078fc0c56dc4ad0856cdd792337b5c92ffd3d2240c8a287a776df4363bba"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "8876c7cf-6998-47f4-8c78-adbf4e9de0ba",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "8876c7cf-6998-47f4-8c78-adbf4e9de0ba",
            "referenced_uuid": "5aec0c50-a1b8-59a2-b70d-f78e7f99f8e8",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "e8a42959-5d84-4942-9d25-835b504a2393"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "fc4a1d56-5c9f-57a8-8bd5-1fb00c5a1de0",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "191c2c72-f76b-559f-bd74-cd9255ccaeda",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "06432146-e843-53eb-850f-4dcc570affaa",
            "value": "a variant of Linux/BrickStorm.A trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "5aec0c50-a1b8-59a2-b70d-f78e7f99f8e8",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "5aec0c50-a1b8-59a2-b70d-f78e7f99f8e8",
            "referenced_uuid": "1f99d22d-4a85-43c3-be80-5251e73c3364",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "ac60e8da-a45e-4726-a175-539935964db3"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "9b0cd2c3-7f62-57ad-88e8-ac48e9e2656a",
            "value": "18f895e24fe1181bb559215ff9cf6ce3",
            "Tag": [
              {
                "colour": "#a882c5",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"201f9faa-ccea-510d-8de7-f6515c8646a6\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "1a611ba0-91b4-5dad-ae37-bd1cb16148ca",
            "value": "c3549d4e5e39a11f609fc6fbf5cc1f2c0ec272b4",
            "Tag": [
              {
                "colour": "#a882c5",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"201f9faa-ccea-510d-8de7-f6515c8646a6\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "3d341e08-59e0-5d2a-9c6d-4451c880957a",
            "value": "f7cda90174b806a34381d5043e89b23ba826abcc89f7abd520060a64475ed506",
            "Tag": [
              {
                "colour": "#a882c5",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"201f9faa-ccea-510d-8de7-f6515c8646a6\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "82f55a2f-133c-5d0b-908c-53654b412aaf",
            "value": "79276523a6a507e3fa1b12b96e09b10a01c783a53d58b9ae7f5780a379431639a80165e81154522649b8e2098e86d1a310efffebe32faafc7b3bc093eec60a64",
            "Tag": [
              {
                "colour": "#a882c5",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"201f9faa-ccea-510d-8de7-f6515c8646a6\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "73f05a54-ad4c-5777-a96d-679b876559ba",
            "value": "49152:6XUQ9anktEg7z/QbPB83A+FQGQzqufqCjt2F81jh+eS53OOwJylHJHuxkdqz3gHG:mVankxn2Pe3JQGQz57t2Y4f3TwrQHAz",
            "Tag": [
              {
                "colour": "#a882c5",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"201f9faa-ccea-510d-8de7-f6515c8646a6\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "cc458c7d-2dfe-5d93-bd32-091fa75ff464",
            "value": "f7cda90174b806a34381d5043e89b23ba826abcc89f7abd520060a64475ed506",
            "Tag": [
              {
                "colour": "#a882c5",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"201f9faa-ccea-510d-8de7-f6515c8646a6\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "6f8331be-bb89-5084-8f40-6475af0bc010",
            "value": "6311936"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "1f99d22d-4a85-43c3-be80-5251e73c3364",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "05975286-6c36-563b-a9d5-ebb2585173e1",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\nhkigbLKHR_Pby6t6P ==> authentication key\r\nhttps://[redacted].com ==> HTTPS address\r\nwss://[redacted].com/cloudapi ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor uses XOR cipher encryption to hide key strings, such as its IPv4 addresses of public DoH servers and other strings within its code. Upon execution, the backdoor initiates the obfuscated function \"main_startNew\" to configure environment variables. The backdoor then checks for the \"[redacted]NET4\" environment variable to determine if it is running as a child process. If \"[redacted]NET4\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/vmckd\". If not running from the specified file path \"/etc/sysconfig/vmckd\", the backdoor terminates its code execution. If the backdoor executing from the specified file path, the backdoor copies itself to \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"updatemgr\" due to the PATH modification and terminates its own execution. If \"[redacted]NET4\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/usr/java/jre-vmware/bin/updatemgr\" is deleted.\r\n\r\nThe backdoor uses the obfuscated function \"main_selfWatcher\" to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The \"main_selfWatcher\" function first checks for another environment variable \"[redacted]NET3\" and confirms the existence of the process named \"updatemgr\". If the checks return a \"false\" value, indicating \"[redacted]NET3\" is not set, the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/vmckd\" to a new location: \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable. The newly copied backdoor file \"updatemgr\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"[redacted]NET3\" is set, the \"main_selfWatcher\" function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor uses an XOR operation to decrypt the IPv4 addresses for the DoH servers below:\r\n\r\n--Begin DoH Addresses--\r\nhttps://8.8.8.8/dns-query (Google)\r\nhttps://8.8.4.4/dns-query (Google)\r\nhttps://9.9.9.9/dns-query (Quad9)\r\nhttps://45.90.28.160/dns-query (NextDNS)\r\nhttps://45.90.30.160/dns-query (NextDNS)\r\nhttps://149.112.112.112/dns-query (Quad9)\r\nhttps://9.9.9.11/dns-query (Quad9)\r\nhttps://1.1.1.1/dns-query (Cloudflare)\r\nhttps://1.0.0.1/dns-query (Cloudflare)\r\nhttps://149.112.112.11/dns-query (Quad9)\r\n--End DoH Addresses--\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the malicious C2 domain \"[redacted].com\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare, Google, Quad9 or NextDNS to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"https://[redacted].com\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/cloudapi\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the cloud platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"hkigbLKHR_Pby6t6P\". An innermost TLS layer encrypts the actual C2 commands and data, securing them even if the outer layers are bypassed or decrypted. The backdoor uses the \"HashiCorp Yamux\" library to create multiple streams within a single innermost TLS-encrypted WebSocket tunnel. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nAfter establishing a secure and covert connection, the backdoor leverages its obfuscated core \"task.DoTask\" (/core/task.DoTask) function and four obfuscated extensions (modules) \"socks.Socks\", \"web.WebService\", \"command.Command\", and \"command.CommandNoContext\". These extensions define the malicious functionality that the backdoor should execute, allowing the TA to carry out various tasks on the compromised systems. These modules enable C2 communication, lateral movement, and command execution on the compromised system.\r\n\r\nDisplayed below are the four extensions and their functions:\r\n\r\n--Begin Extensions--\r\na. The Socks extension enables network tunneling through a SOCKS proxy, which facilitates lateral movement within a compromised network and routes C2 traffic.\r\n\r\nb. The WebService extension module establishes covert C2 communication by making the backdoor appear as a legitimate web server. The extension uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated API \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (HTML, CSS, JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command extension executes commands on the compromised system with a specific security context.\r\n\r\nd. The CommandNoContext extension executes commands on the compromised system without using an explicit security context.\r\n--End Extensions --\r\n\r\nThe backdoor maintains a persistent connection to the C2 server unless a specific termination command is received or the C2 server terminates the connection."
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "84dc87b7-7cff-5d59-a763-8117e1f3c4a4",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "c07d17dd-8413-551b-8492-1aab129dac27",
            "value": "trojan"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "dcba717c-02aa-5d9f-9529-05db8e3d8244",
            "value": "backdoor"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.861859+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "62c6246c-0304-42b8-8cb2-76d85708860b",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "17ae52fa-eb9b-4b36-bae1-06e54a8fb5a2",
            "value": "18f895e24fe1181bb559215ff9cf6ce3"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "91d3c959-5baf-49af-86ae-2040fe593341",
            "value": "c3549d4e5e39a11f609fc6fbf5cc1f2c0ec272b4"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "e7000eb4-9c47-4262-ae4f-b2b838ff7173",
            "value": "f7cda90174b806a34381d5043e89b23ba826abcc89f7abd520060a64475ed506"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "e5407999-8cf2-4398-93de-d6a6e0313b77",
            "value": "79276523a6a507e3fa1b12b96e09b10a01c783a53d58b9ae7f5780a379431639a80165e81154522649b8e2098e86d1a310efffebe32faafc7b3bc093eec60a64"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family.",
        "meta-category": "misc",
        "name": "malware-analysis",
        "template_uuid": "8229ee82-7218-4ff5-9eac-57961a6f0288",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "7b003bb6-2fe9-4dae-8bf8-6e0751654cf5",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "7b003bb6-2fe9-4dae-8bf8-6e0751654cf5",
            "referenced_uuid": "5a409e0a-2141-556b-b195-44f5d8e6abb1",
            "relationship_type": "analyses",
            "timestamp": "1765615902",
            "uuid": "b4bb1bf1-9cb9-4837-9f5b-409fb10b834f"
          }
        ],
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "product",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "c5c8fcaf-0899-5638-9221-8885726300f8",
            "value": "eset"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "result",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "d4717791-e95a-54a6-ac46-94ea6c28532e",
            "value": "unknown"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "result_name",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "0280540f-71c8-5c3f-80eb-bc4788adf249",
            "value": "a variant of Linux/BrickStorm.A trojan"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "5a409e0a-2141-556b-b195-44f5d8e6abb1",
        "ObjectReference": [
          {
            "comment": "",
            "object_uuid": "5a409e0a-2141-556b-b195-44f5d8e6abb1",
            "referenced_uuid": "ea9f7133-c301-4f8d-920e-454fbe0848bb",
            "relationship_type": "associated-with",
            "timestamp": "1765615902",
            "uuid": "e6c48248-85a6-4c9f-b13a-857f2e9eef55"
          }
        ],
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "7e7870d5-71c9-5e0f-953a-a1f7a8f6fd32",
            "value": "82bf31e7d768e6d4d3bc7c8c8ef2b358",
            "Tag": [
              {
                "colour": "#43bd2d",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"86487b8c-c853-5364-95bf-c1c948203c8d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "ce3cd39e-08d9-5ed9-ba07-894ffa919604",
            "value": "de28546ec356c566cd8bca205101a733e9a4a22d",
            "Tag": [
              {
                "colour": "#43bd2d",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"86487b8c-c853-5364-95bf-c1c948203c8d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "be66f0af-9b2a-514f-aab1-263906e7c9f0",
            "value": "22c15a32b69116a46eb5d0f2b228cc37cd1b5915a91ec8f38df79d3eed1da26b",
            "Tag": [
              {
                "colour": "#43bd2d",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"86487b8c-c853-5364-95bf-c1c948203c8d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "df3467b5-8dae-5bef-b554-82b0098afa4d",
            "value": "4c52caf2e5f114103ed5f60c6add3aa26c741b07869bb66e3c25a1dc290d4a8bf87c42c336e8ac8ebf82d9a9b23eaa18c31f7051a5970a8fe1125a2da890340f",
            "Tag": [
              {
                "colour": "#43bd2d",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"86487b8c-c853-5364-95bf-c1c948203c8d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "ssdeep",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "ssdeep",
            "uuid": "0beb9be9-33cc-5a41-abba-6aa5daf066ae",
            "value": "49152:uP9kPWdmrJl+9zxKsSJ32ssUZGHZ9ECKDfvCb3XKRbaYJcRHMH9xkdgY3gqF2HxR:yqWdmd4x5SgssUZ0OCKDfvChYrRq",
            "Tag": [
              {
                "colour": "#43bd2d",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"86487b8c-c853-5364-95bf-c1c948203c8d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "filename",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "filename",
            "uuid": "f6e98a53-817d-5bad-98e9-e16b93c3c4e7",
            "value": "22c15a32b69116a46eb5d0f2b228cc37cd1b5915a91ec8f38df79d3eed1da26b",
            "Tag": [
              {
                "colour": "#43bd2d",
                "local": false,
                "name": "misp-galaxy:stix-2.1-malware=\"86487b8c-c853-5364-95bf-c1c948203c8d\"",
                "relationship_type": ""
              }
            ]
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "size-in-bytes",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "size-in-bytes",
            "uuid": "683ee24d-4de6-514a-a8f2-edaa4e46b436",
            "value": "6303744"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Malware is a type of TTP that represents malicious code.",
        "meta-category": "misc",
        "name": "malware",
        "template_uuid": "e5ad1d64-4b4e-44f5-9e00-88a705a67f9d",
        "template_version": "1",
        "timestamp": "1764090297",
        "uuid": "ea9f7133-c301-4f8d-920e-454fbe0848bb",
        "Attribute": [
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "description",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "4e900b12-2d3e-5c7f-ace7-681772407c80",
            "value": "This artifact is a malicious 64-bit ELF executable written in the Go programming language. The binary has been identified as a backdoor variant named BRICKSTORM that uses several advanced techniques to evade detection. The backdoor uses SOCKS proxying, multi-layered web service communication, and varied command execution to obscure its activities. The backdoor combines several sophisticated techniques, including DoH, nested TLS encryption, and the abuse of a legitimate cloud service to evade detection. The backdoor contains the authentication key, HTTPS and WebSocket addresses as part of its sophisticated, multi-layered C2 evasion technique.\r\n\r\n--Begin Elements--\r\nhkigbLKHR_Pby6t6P ==> authentication key\r\nhttps://[redacted].com ==> HTTPS address\r\nwss://[redacted].com/api ==> WebSocket address\r\n--End Elements--\r\n\r\nThe backdoor uses XOR cipher encryption to hide key strings, such as its IPv4 addresses of public DoH servers and other strings within its code. Upon execution, the backdoor initiates the obfuscated function \"main_startNew\" to configure environment variables. The backdoor then checks for the \"FIOON\" environment variable to determine if it is running as a child process. If \"FIOON\" is not set, indicating not a child process, the backdoor verifies its current execution path by attempting to load the file contents from \"/etc/sysconfig/vts\". If not running from the specified file path \"/etc/sysconfig/vts\", the backdoor terminates its code execution. If the backdoor executing from the specified file path, the backdoor copies itself to \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable, ensuring the newly copied backdoor takes precedence in execution. The backdoor executes the copied backdoor named \"updatemgr\" due to the PATH modification and terminates its own execution. If \"FIOON\" is set, indicating a child process, the backdoor continues its main code execution. As part of this continued execution, the temporary copy of the backdoor at \"/usr/java/jre-vmware/bin/updatemgr\" is deleted.\r\n\r\nThe backdoor uses the obfuscated function \"main_selfWatcher\" to ensure its continued operation and maintain persistence on the compromised system. This self-preservation mechanism checks if the backdoor is running as an intended process and, if not, the backdoor re-installs and re-executes itself. The \"main_selfWatcher\" function first checks for the \"DIGNN\" environment variable and confirms the existence of a process named \"updatemgr\". If the checks return a \"false\" value (\"DIGNN\" is not set ), indicating the backdoor is not running correctly, the backdoor re-installs itself from \"/etc/sysconfig/vts\" to a new location: \"/usr/java/jre-vmware/bin/updatemgr\". The backdoor then prepends \"/usr/java/jre-vmware/bin/\" to the PATH environment variable. The newly copied backdoor file \"updatemgr\" is executed. The parent backdoor then terminates its own execution, allowing the new process to continue running. If the initial checks confirm that the backdoor is running as intended, indicating \"DIGNN\" is set, the \"main_selfWatcher\" function allows the code to continue its normal malicious operations.\r\n\r\nThe backdoor uses an XOR operation to decrypt the IPv4 addresses for the DoH servers below:\r\n\r\n--Begin DoH Addresses--\r\nhttps://8.8.8.8/dns-query (Google)\r\nhttps://8.8.4.4/dns-query (Google)\r\nhttps://1.1.1.1/dns-query (Cloudflare)\r\nhttps://1.0.0.1/dns-query (Cloudflare)\r\n--End DoH Addresses--\r\n\r\nThe backdoor relies on internal, low-level function calls from a custom Go package to handle its network connections and command processing. The backdoor uses DoH to resolve the addresses of its C2 servers. The backdoor creates a DNS query for the malicious C2 domain \"[redacted].com\". The backdoor encrypts this query by encapsulating it within a standard HTTPS request. The backdoor sends the encrypted HTTPS request to a legitimate public DoH resolver operated by Cloudflare or Google to process the query. Analysis indicates that if the requested domain is not found in the public DoH resolver cache, the legitimate public DoH resolver forwards the request to the next server in the DNS hierarchy, ultimately reaching the TA's DNS server, which is the authoritative server for the malicious domain. The TA's DNS server will respond with the correct IP address for the C2 domain, and this response is sent back through the legitimate DoH resolver to the backdoor. The backdoor receives the encrypted response, decrypts it to get the C2 server's IP address, and establishes a connection.\r\n\r\nThe backdoor uses multiple layers of encryption for its C2 communications. The backdoor communicates over HTTPS to the cloud platform (\"https://[redacted].com\"), then upgrades these sessions to WebSockets with an additional layer of TLS encryption. The backdoor sends HTTP upgrade request to convert the initial encrypted HTTPS connection into a persistent WebSocket connection: \"wss://[redacted].com/api\". The backdoor nests additional layers of TLS encryption within the WebSocket session. The backdoor performs a series of nested TLS handshakes within the established WebSocket tunnel. The first TLS handshake is the standard TLS handshake for the initial HTTPS request to the cloud platform. A second TLS handshake occurs within the WebSocket tunnel. During this step, the backdoor authenticates itself to the C2 server using a static authentication key: \"hkigbLKHR_Pby6t6P\". An innermost TLS layer encrypts the actual C2 commands and data, securing them even if the outer layers are bypassed or decrypted. The backdoor uses the \"HashiCorp Yamux\" library to create multiple streams within a single innermost TLS-encrypted WebSocket tunnel. This method makes the TA's activities difficult to detect, as multiple commands and network tunnels are multiplexed and hidden within a single, encrypted network stream.\r\n\r\nAfter establishing a secure and covert connection, the backdoor leverages its obfuscated core \"task.DoTask\" (/core/task.DoTask) function and four obfuscated extensions (modules) \"socks.Socks\", \"web.WebService\", \"command.Command\", and \"command.CommandNoContext\". These extensions define the malicious functionality that the backdoor should execute, allowing the TA to carry out various tasks on the compromised systems. These modules enable C2 communication, lateral movement, and command execution on the compromised system.\r\n\r\nDisplayed below are the four extensions and their functions:\r\n\r\n--Begin Extensions--\r\na. The Socks extension enables network tunneling through a SOCKS proxy, which facilitates lateral movement within a compromised network and routes C2 traffic.\r\n\r\nb. The WebService extension module establishes covert C2 communication by making the backdoor appear as a legitimate web server. The extension uses the Go programming language, leveraging the \"net/http package\" and \"gorilla/mux\" library, to create a web server on the compromised system. A dedicated API \"/api/\" endpoint is created to receive and execute commands from the TA's C2 server. This provides the TA with extensive control over the victim's file system, allowing the TA to browse, view, create, delete, upload, and download files and folders. To blend in and evade detection, the backdoor serves static web files (HTML, CSS, JavaScript) from a designated directory. This makes the malicious web server appear to be a standard web application.\r\n\r\nc. The Command extension executes commands on the compromised system with a specific security context.\r\n\r\nd. The CommandNoContext extension executes commands on the compromised system without using an explicit security context.\r\n--End Extensions--\r\n\r\nThe backdoor maintains a persistent connection to the C2 server unless a specific termination command is received or the C2 server terminates the connection."
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "is_family",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "boolean",
            "uuid": "fa066acb-33cb-5e47-a254-9d762e73f9e9",
            "value": "0"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "f3cf3417-44e1-51b7-8211-543c66824128",
            "value": "trojan"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "malware_type",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "f4582a14-771a-54f2-a7d7-5db1a7dd9967",
            "value": "backdoor"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "File object describing a file with meta-information",
        "first_seen": "2025-12-02T16:07:23.941693+00:00",
        "meta-category": "file",
        "name": "file",
        "template_uuid": "688c46fb-5edb-40a3-8273-1af7923e2215",
        "template_version": "25",
        "timestamp": "1764090297",
        "uuid": "8d162603-4fcf-483e-a164-23db458feb2a",
        "Attribute": [
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "md5",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "md5",
            "uuid": "ecf6a93d-a161-404a-83c4-9ee8807c8aa9",
            "value": "82bf31e7d768e6d4d3bc7c8c8ef2b358"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha1",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha1",
            "uuid": "8b140da3-f14d-4a69-a72e-5ca2f22f6a6c",
            "value": "de28546ec356c566cd8bca205101a733e9a4a22d"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha256",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha256",
            "uuid": "676651e7-0052-463d-a83b-1d6e50b52043",
            "value": "22c15a32b69116a46eb5d0f2b228cc37cd1b5915a91ec8f38df79d3eed1da26b"
          },
          {
            "category": "Payload delivery",
            "comment": "",
            "deleted": false,
            "disable_correlation": false,
            "object_relation": "sha512",
            "timestamp": "1765615902",
            "to_ids": true,
            "type": "sha512",
            "uuid": "f36ca2e3-c286-4fde-900d-2d612efd0ba8",
            "value": "4c52caf2e5f114103ed5f60c6add3aa26c741b07869bb66e3c25a1dc290d4a8bf87c42c336e8ac8ebf82d9a9b23eaa18c31f7051a5970a8fe1125a2da890340f"
          }
        ]
      },
      {
        "comment": "",
        "deleted": false,
        "description": "Object describing the original file used to import data in MISP.",
        "meta-category": "file",
        "name": "original-imported-file",
        "template_uuid": "4cd560e9-2cfe-40a1-9964-7b2e797ecac5",
        "template_version": "2",
        "timestamp": "1765615902",
        "uuid": "add8847d-49ec-4ff1-a3de-c5b7c2e13aa8",
        "Attribute": [
          {
            "category": "External analysis",
            "comment": "",
            "data": "ewogICAgInR5cGUiOiAiYnVuZGxlIiwKICAgICJpZCI6ICJidW5kbGUtLTE0Mzk3NDgxLWJkODYtNGMxMi1hNzMzLWU3NDkyNTNkYzg5MiIsCiAgICAib2JqZWN0cyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hcmtpbmctZGVmaW5pdGlvbiIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyMy0wOC0xMVQxNTo0NjoxNS45ODNaIiwKICAgICAgICAgICAgImV4dGVuc2lvbnMiOiB7CiAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uLWRlZmluaXRpb24tLTNhNjU4ODRkLTAwNWEtNDI5MC04MzM1LWNiMmQ3NzhhODNjZSI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNjZXNzX3ByaXZpbGVnZSI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXZpbGVnZV9hY3Rpb24iOiAiQ0lTQVVTRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXZpbGVnZV9zY29wZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW50aXR5IjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxMIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcm1pdHRlZF9uYXRpb25hbGl0aWVzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxMIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcm1pdHRlZF9vcmdhbml6YXRpb25zIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxMIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoYXJlYWJpbGl0eSI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMTCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bGVfZWZmZWN0IjogInBlcm1pdCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgImF1dGhvcml0eV9yZWZlcmVuY2UiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICJ1cm46aXNhOmF1dGhvcml0eTphaXMiCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAiY29udHJvbF9zZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc2lmaWNhdGlvbiI6ICJVIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hbF9kZXRlcm1pbmF0aW9uIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIklORk9STUFUSU9OLURJUkVDVExZLVJFTEFURUQtVE8tQ1lCRVJTRUNVUklUWS1USFJFQVQiCiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjcmVhdGVfZGF0ZV90aW1lIjogIjIwMjMtMDgtMTFUMTU6NDY6MTUuOTgzWiIsCiAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvbl90eXBlIjogInByb3BlcnR5LWV4dGVuc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgImZ1cnRoZXJfc2hhcmluZyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoYXJpbmdfc2NvcGUiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTQS5VU0ciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bGVfZWZmZWN0IjogInBlcm1pdCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgImlkZW50aWZpZXIiOiAiaXNhOmd1aWRlLjE5MDAxLkdFTUlOSS1hOWJkYjYwMy03ZjRmLTQ0YzYtYWNiMC1kNDdmNjE0ZTY0YjIiLAogICAgICAgICAgICAgICAgICAgICJwb2xpY3lfcmVmZXJlbmNlIjogInVybjppc2E6cG9saWN5OmFjczpuczp2My4wP3ByaXZkZWZhdWx0PWRlbnkmc2hhcmVkZWZhdWx0PWRlbnkiLAogICAgICAgICAgICAgICAgICAgICJyZXNwb25zaWJsZV9lbnRpdHlfY3VzdG9kaWFuIjogIlVTQS5ESFMuQ0lTQS5DU0QuVEguQ01BIiwKICAgICAgICAgICAgICAgICAgICAicmVzcG9uc2libGVfZW50aXR5X29yaWdpbmF0b3IiOiAiVVNBLkRIUy5DSVNBLkNTRC5USC5DTUEiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaWRlbnRpdHkiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS00MmFjM2M5Mi02MGQyLTQxOGYtYmE4ZS04Mzg5NDRlNjExMGIiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDIzLTA0LTEyVDE3OjUzOjA5LjY0NloiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyMy0wNC0xMlQxNzo1MzowOS42NDZaIiwKICAgICAgICAgICAgIm5hbWUiOiAiR2VtaW5pUHJvZHVjdGlvbl9DTUEiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ3liZXJzZWN1cml0eSBhbmQgSW5mcmFzdHJ1Y3R1cmUgU2VjdXJpdHkgQWdlbmN5IFByb2R1Y3Rpb24gSWRlbnRpdHkuIENvZGUgYW5kIE1lZGlhIEFuYWx5c2lzLiIsCiAgICAgICAgICAgICJpZGVudGl0eV9jbGFzcyI6ICJzeXN0ZW0iLAogICAgICAgICAgICAiY29uZmlkZW5jZSI6IDEwMCwKICAgICAgICAgICAgImxhbmciOiAiZW4iLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWJhYjRhNjNjLWFlZDktNGNmNS1hNzY2LWRmY2E1YWJhYzJiYiIKICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiZmlsZS0tODJhMDM5NmItMmY3Zi01YTAxLWI0ZGYtOWZiYjVjNDJhNmYzIiwKICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICJNRDUiOiAiOGU0Yzg4ZDAwYjZlYjQ2MjI5YTFlZDcwMDE0NTEzMjAiLAogICAgICAgICAgICAgICAgIlNIQS0xIjogIjliZjRjNzg2ZWJkNjhjMDE4MWNmZTNlYjg1ZDJmZDIwMmVkMTJjNTQiLAogICAgICAgICAgICAgICAgIlNIQS0yNTYiOiAiYWFmNTU2OWM4ZTM0OWMxNTAyOGJjM2ZhYzA5ZWI5ODJlZmIwNmVhYmFjOTU1YjcwNWE2ZDQ0NzI2MzY1OGUzOCIsCiAgICAgICAgICAgICAgICAiU0hBLTUxMiI6ICI1ZTY1NDc3NmU5YzQxOWUxMWU2ZjkzYTQ1MjQxNWE2MDFiZDlhMjA3OTcxMGYxMDc0NjA4NTcwZTQ5OGE5YWYzN2I4MWJiNTdjOThjYjhiYjYyNmM1ZWU0YjNlMzU3NTdkM2FlOGMxYzM3MTdmMjhkOWYzZmU3YTRjZWJlMDYwOCIsCiAgICAgICAgICAgICAgICAiU1NERUVQIjogIjQ5MTUyOjlsRGVZTmVZdW5jMVMzL1UwNXErQ0lLVWJ3Z0JmZDFWd3cvdVVKU1ppbmEvVG9rRERrbzBuOG9RaEVvQWdzVUo6TzNsY0UzODBzSURiZEIxMXAzaS9Ub2tFSW93bGIvciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNpemUiOiA3NjkyMjg4LAogICAgICAgICAgICAibmFtZSI6ICJ2bXNyYyIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJpbmRpY2F0b3IiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJpbmRpY2F0b3ItLTY0MmEwZTQzLTA0MDMtNGQwMy04NGVhLWQyZjI5YmU0YWY1MyIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJuYW1lIjogInZtc3JjIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBhcnRpZmFjdCBpcyBhIG1hbGljaW91cyA2NC1iaXQgRUxGIGV4ZWN1dGFibGUgd3JpdHRlbiBpbiB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFRoZSBiaW5hcnkgaGFzIGJlZW4gaWRlbnRpZmllZCBhcyBhIGJhY2tkb29yIHZhcmlhbnQgbmFtZWQgQlJJQ0tTVE9STSB0aGF0IHVzZXMgc2V2ZXJhbCBhZHZhbmNlZCB0ZWNobmlxdWVzIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIHVzZXMgU09DS1MgcHJveHlpbmcsIG11bHRpLWxheWVyZWQgd2ViIHNlcnZpY2UgY29tbXVuaWNhdGlvbiwgYW5kIHZhcmllZCBjb21tYW5kIGV4ZWN1dGlvbiB0byBvYnNjdXJlIGl0cyBhY3Rpdml0aWVzLiBUaGUgYmFja2Rvb3IgY29tYmluZXMgc2V2ZXJhbCBzb3BoaXN0aWNhdGVkIHRlY2huaXF1ZXMsIGluY2x1ZGluZyBEb0gsIG5lc3RlZCBUTFMgZW5jcnlwdGlvbiwgYW5kIHRoZSBhYnVzZSBvZiBhIGxlZ2l0aW1hdGUgY2xvdWQgc2VydmljZSB0byBldmFkZSBkZXRlY3Rpb24uIFRoZSBiYWNrZG9vciBjb250YWlucyB0aGUgYXV0aGVudGljYXRpb24ga2V5LCBIVFRQUyBhbmQgV2ViU29ja2V0IGFkZHJlc3NlcyBhcyBwYXJ0IG9mIGl0cyBzb3BoaXN0aWNhdGVkLCBtdWx0aS1sYXllcmVkIEMyIGV2YXNpb24gdGVjaG5pcXVlLlxyXG5cclxuLS1CZWdpbiBFbGVtZW50cy0tXHJcbltSZWRhY3RlZF0gPT0+IGF1dGhlbnRpY2F0aW9uIGtleVxyXG5odHRwczovL1tyZWRhY3RlZF0uY29tID09PiBIVFRQUyBhZGRyZXNzIGNvbnN0cnVjdGVkIGF0IHJ1bnRpbWVcclxud3NzOi8vW3JlZGFjdGVkXS5jb20vYXBpID09PiBXZWJTb2NrZXQgYWRkcmVzc1xyXG4tLUVuZCBFbGVtZW50cy0tXHJcblxyXG5UaGUgaGFyZC1jb2RlZCBkb21haW4gaGFzIGJlZW4gcmVkYWN0ZWQgZnJvbSB0aGlzIHJlcG9ydC4gQXMgb2YgdGhlIHJlbGVhc2Ugb2YgdGhpcyByZXBvcnQsIHRoZXJlIGhhcyBiZWVuIG5vIHJldXNlIG9mIEMyIGRvbWFpbnMgYWNyb3NzIHZpY3RpbXMuIFVwb24gZXhlY3V0aW9uLCB0aGUgYmFja2Rvb3IgaW5pdGlhdGVzIHRoZSBcIm1haW5fc3RhcnROZXdcIiBmdW5jdGlvbiB0byBjb25maWd1cmUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGUgYmFja2Rvb3IgdGhlbiBjaGVja3MgZm9yIHRoZSBcIlZNd2FyZVwiIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSBpZiBpdCBpcyBydW5uaW5nIGFzIGEgY2hpbGQgcHJvY2Vzcy4gSWYgXCJWTXdhcmVcIiBpcyBub3Qgc2V0IChpbmRpY2F0aW5nIG5vdCBhIGNoaWxkIHByb2Nlc3MpLCB0aGUgYmFja2Rvb3IgdmVyaWZpZXMgaXRzIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGggYnkgYXR0ZW1wdGluZyB0byBsb2FkIHRoZSBmaWxlIGNvbnRlbnRzIGZyb20gXCIvZXRjL3N5c2NvbmZpZy92bXNyY1wiLiBJZiBub3QgcnVubmluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoIFwiL2V0Yy9zeXNjb25maWcvdm1zcmNcIiwgdGhlIGJhY2tkb29yIHRlcm1pbmF0ZXMgaXRzIGNvZGUgZXhlY3V0aW9uLiBJZiB0aGUgYmFja2Rvb3IgZXhlY3V0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgdGhlIGJhY2tkb29yIGNvcGllcyBpdHNlbGYgdG8gXCIvb3B0L3Ztd2FyZS9zYmluL3Ztd2FyZS1zcGhlcmVcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvb3B0L3Ztd2FyZS9zYmluL1wiIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBlbnN1cmluZyB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIHRha2VzIHByZWNlZGVuY2UgaW4gZXhlY3V0aW9uLiBUaGUgYmFja2Rvb3IgZXhlY3V0ZXMgdGhlIGNvcGllZCBiYWNrZG9vciBuYW1lZCBcInZtd2FyZS1zcGhlcmVcIiBkdWUgdG8gdGhlIFBBVEggbW9kaWZpY2F0aW9uIGFuZCB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLiBJZiBcIlZNd2FyZVwiIGlzIHNldCAoaW5kaWNhdGluZyBhIGNoaWxkIHByb2Nlc3MpLCB0aGUgYmFja2Rvb3IgY29udGludWVzIGl0cyBtYWluIGNvZGUgZXhlY3V0aW9uLiBBcyBwYXJ0IG9mIHRoaXMgY29udGludWVkIGV4ZWN1dGlvbiwgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBiYWNrZG9vciBhdCBcIi9vcHQvdm13YXJlL3NiaW4vdm13YXJlLXNwaGVyZVwiIGlzIGRlbGV0ZWQuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyB0aGUgXCJtYWluX3NlbGZXYXRjaGVyIGZ1bmN0aW9uXCIgdG8gZW5zdXJlIGl0cyBjb250aW51ZWQgb3BlcmF0aW9uIGFuZCBtYWludGFpbiBwZXJzaXN0ZW5jZSBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBUaGlzIHNlbGYtcHJlc2VydmF0aW9uIG1lY2hhbmlzbSBjaGVja3MgaWYgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgYW4gaW50ZW5kZWQgcHJvY2VzcyBhbmQsIGlmIG5vdCwgdGhlIGJhY2tkb29yIHJlLWluc3RhbGxzIGFuZCByZS1leGVjdXRlcyBpdHNlbGYuIFRoZSBcIm1haW5fc2VsZldhdGNoZXJcIiBmdW5jdGlvbiBmaXJzdCBjaGVja3MgZm9yIHRoZSBcIlNwaGVyZVwiIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBjb25maXJtcyB0aGUgZXhpc3RlbmNlIG9mIGEgcHJvY2VzcyBuYW1lZCBcInZtd2FyZS1zcGhlcmVcIi4gSWYgdGhlIGNoZWNrcyByZXR1cm4gYSBcImZhbHNlXCIgdmFsdWUgKFwiU3BoZXJlXCIgaXMgbm90IHNldCApLCBpbmRpY2F0aW5nIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBpdHNlbGYgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3Ztc3JjXCIgdG8gYSBuZXcgbG9jYXRpb246IFwiL29wdC92bXdhcmUvc2Jpbi92bXdhcmUtc3BoZXJlXCIuIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIFwiL29wdC92bXdhcmUvc2Jpbi9cIiB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciBmaWxlIFwidm13YXJlLXNwaGVyZVwiIGlzIGV4ZWN1dGVkLiBUaGUgcGFyZW50IGJhY2tkb29yIHRoZW4gdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbiwgYWxsb3dpbmcgdGhlIG5ldyBwcm9jZXNzIHRvIGNvbnRpbnVlIHJ1bm5pbmcuIElmIHRoZSBpbml0aWFsIGNoZWNrcyBjb25maXJtIHRoYXQgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgaW50ZW5kZWQgKFwiU3BoZXJlXCIgaXMgc2V0KSwgdGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLlxyXG5cclxuVGhlIGJhY2tkb29yIGNvbmZpZ3VyZXMgaXRzIHNlcnZpY2UgYnkgZGlzYWJsaW5nIGl0cyBsb2dnZXIgYW5kIHNldHRpbmcgdHdvIGRpZmZlcmVudCBzbGVlcCB0aW1lIHBhcmFtZXRlcnMgYmVmb3JlIGFwcGx5aW5nIHRoZXNlIGNvbmZpZ3VyYXRpb25zIHVzaW5nIHRoZSBcIm1haW5fc2V0U2VydmljZUNmZ1wiIGZ1bmN0aW9uLiBcclxuXHJcblRoZSBwcm9ncmFtIGNvbnRhaW5zIGEgaGFyZC1jb2RlZCBsaXN0IG9mIHB1YmxpYyBEb0ggc2VydmVycyB0byBmYWNpbGl0YXRlIGNvbW11bmljYXRpb25zLlxyXG5cclxuLS0tQmVnaW4gRG9IIEFkZHJlc3Nlcy0tLVxyXG5odHRwczovLzEuMC4wLjEvZG5zLXF1ZXJ5ICAoQ2xvdWRmbGFyZSlcclxuaHR0cHM6Ly8xLjEuMS4xL2Rucy1xdWVyeSAoQ2xvdWRmbGFyZSlcclxuaHR0cHM6Ly84LjguNC40L2Rucy1xdWVyeSAoR29vZ2xlKVxyXG5odHRwczovLzguOC44LjgvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh0dHBzOi8vOS45LjkuOS9kbnMtcXVlcnkgKFF1YWQ5KVxyXG4tLS1FbmQgRG9IIEFkZHJlc3Nlcy0tLVxyXG5cclxuVGhlIGJhY2tkb29yIHJlbGllcyBvbiBpbnRlcm5hbCwgbG93LWxldmVsIGZ1bmN0aW9uIGNhbGxzIGZyb20gYSBjdXN0b20gR28gcGFja2FnZSBcIndzc29mdDJcIiB0byBoYW5kbGUgaXRzIG5ldHdvcmsgY29ubmVjdGlvbnMgYW5kIGNvbW1hbmQgcHJvY2Vzc2luZy4gVGhlIGJhY2tkb29yIHVzZXMgRG9IIHRvIHJlc29sdmUgdGhlIGFkZHJlc3NlcyBvZiBpdHMgQzIgc2VydmVycy4gVGhlIGJhY2tkb29yIGNyZWF0ZXMgYSBETlMgcXVlcnkgZm9yIHRoZSBDMiBkb21haW4uIFRoZSBiYWNrZG9vciBlbmNyeXB0cyB0aGlzIHF1ZXJ5IGJ5IGVuY2Fwc3VsYXRpbmcgaXQgd2l0aGluIGEgc3RhbmRhcmQgSFRUUFMgcmVxdWVzdC4gVGhlIGJhY2tkb29yIHNlbmRzIHRoZSBlbmNyeXB0ZWQgSFRUUFMgcmVxdWVzdCB0byBhIGxlZ2l0aW1hdGUgcHVibGljIERvSCByZXNvbHZlciBvcGVyYXRlZCBieSBDbG91ZGZsYXJlIG9yIEdvb2dsZSBvciBRdWFkOSB0byBwcm9jZXNzIHRoZSBxdWVyeS4gQW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIHJlcXVlc3RlZCBkb21haW4gaXMgbm90IGZvdW5kIGluIHRoZSBwdWJsaWMgRG9IIHJlc29sdmVyIGNhY2hlLCB0aGUgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIGZvcndhcmRzIHRoZSByZXF1ZXN0IHRvIHRoZSBuZXh0IHNlcnZlciBpbiB0aGUgRE5TIGhpZXJhcmNoeSwgdWx0aW1hdGVseSByZWFjaGluZyB0aGUgVEEncyBETlMgc2VydmVyLCB3aGljaCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIgZm9yIHRoZSBtYWxpY2lvdXMgZG9tYWluLiBUaGUgVEEncyBETlMgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBjb3JyZWN0IElQIGFkZHJlc3MgZm9yIHRoZSBDMiBkb21haW4sIGFuZCB0aGlzIHJlc3BvbnNlIGlzIHNlbnQgYmFjayB0aHJvdWdoIHRoZSBsZWdpdGltYXRlIERvSCByZXNvbHZlciB0byB0aGUgYmFja2Rvb3IuIFRoZSBiYWNrZG9vciByZWNlaXZlcyB0aGUgZW5jcnlwdGVkIHJlc3BvbnNlLCBkZWNyeXB0cyBpdCB0byBnZXQgdGhlIEMyIHNlcnZlcidzIElQIGFkZHJlc3MsIGFuZCBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24uXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBtdWx0aXBsZSBsYXllcnMgb2YgZW5jcnlwdGlvbiBmb3IgaXRzIEMyIGNvbW11bmljYXRpb25zLiBUaGUgYmFja2Rvb3IgY29tbXVuaWNhdGVzIG92ZXIgSFRUUFMgdG8gdGhlIGNsb3VkIHBsYXRmb3JtLCB0aGVuIHVwZ3JhZGVzIHRoZXNlIHNlc3Npb25zIHRvIFdlYlNvY2tldHMgd2l0aCBhbiBhZGRpdGlvbmFsIGxheWVyIG9mIFRMUyBlbmNyeXB0aW9uLiBUaGUgYmFja2Rvb3Igc2VuZHMgSFRUUCB1cGdyYWRlIHJlcXVlc3QgdG8gY29udmVydCB0aGUgaW5pdGlhbCBlbmNyeXB0ZWQgSFRUUFMgY29ubmVjdGlvbiBpbnRvIGEgcGVyc2lzdGVudCBXZWJTb2NrZXQgY29ubmVjdGlvbjogXCJ3c3M6Ly9bcmVkYWN0ZWRdLmNvbS9hcGlcIi4gVGhlIGJhY2tkb29yIG5lc3RzIGFkZGl0aW9uYWwgbGF5ZXJzIG9mIFRMUyBlbmNyeXB0aW9uIHdpdGhpbiB0aGUgV2ViU29ja2V0IHNlc3Npb24uIFRoZSBiYWNrZG9vciBwZXJmb3JtcyBhIHNlcmllcyBvZiBuZXN0ZWQgVExTIGhhbmRzaGFrZXMgd2l0aGluIHRoZSBlc3RhYmxpc2hlZCBXZWJTb2NrZXQgdHVubmVsLiBUaGUgZmlyc3QgVExTIGhhbmRzaGFrZSBpcyB0aGUgc3RhbmRhcmQgVExTIGhhbmRzaGFrZSBmb3IgdGhlIGluaXRpYWwgSFRUUFMgcmVxdWVzdCB0byB0aGUgQ2xvdWRmbGFyZSBwbGF0Zm9ybS4gQSBzZWNvbmQgVExTIGhhbmRzaGFrZSBvY2N1cnMgd2l0aGluIHRoZSBXZWJTb2NrZXQgdHVubmVsLiBEdXJpbmcgdGhpcyBzdGVwLCB0aGUgYmFja2Rvb3IgYXV0aGVudGljYXRlcyBpdHNlbGYgdG8gdGhlIEMyIHNlcnZlciB1c2luZyBhIHN0YXRpYyBhdXRoZW50aWNhdGlvbiBrZXksIHdoaWNoIGhhcyBiZWVuIHJlZGFjdGVkIGZyb20gdGhpcyByZXBvcnQuIElmIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSBiYWNrZG9vciBwcm9jZWVkcyB0byBzZXQgdXAgdGhlIG11bHRpcGxleGluZyBsYXllci4gVGhlIGJhY2tkb29yIGhhbmRsZXMgYm90aCBTaW1wbGUgTXVsdGlwbGV4aW5nIChzbXV4KSAgYW5kIFlldCBBbm90aGVyIE11bHRpcGxleGVyIChZYW11eCkgbGlicmFyaWVzIHRvIGNyZWF0ZSB2aXJ0dWFsIHN0cmVhbXMgb3ZlciBhIHNpbmdsZSB1bmRlcmx5aW5nIFRMUy1zZWN1cmVkIGNvbm5lY3Rpb24gYmFzZWQgb24gY2xpZW50IGNvbmZpZ3VyYXRpb24gb3IgaGFuZHNoYWtlIGRhdGEgKEZpZ3VyZSA2KS4gVGhpcyBtZXRob2QgbWFrZXMgdGhlIFRBJ3MgYWN0aXZpdGllcyBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBhcyBtdWx0aXBsZSBjb21tYW5kcyBhbmQgbmV0d29yayB0dW5uZWxzIGFyZSBtdWx0aXBsZXhlZCBhbmQgaGlkZGVuIHdpdGhpbiBhIHNpbmdsZSwgZW5jcnlwdGVkIG5ldHdvcmsgc3RyZWFtLlxyXG5cclxuT25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBDMiBzZXJ2ZXIgdmlhIFdlYlNvY2tldHMsIHRoZSBiYWNrZG9vciByZWNlaXZlcyBjb21tYW5kcyB0aGF0IGFyZSBkaXJlY3RlZCB0byBzcGVjaWZpYyBoYW5kbGVycyB0byBwZXJmb3JtIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSB0aHJlZSBjb3JlIGhhbmRsZXJzIGFuZCB0aGVpciBmdW5jdGlvbnM6IFxyXG5cclxuLS1CZWdpbiBDb3JlIEhhbmRsZXJzLS1cclxuYS4gXCJ3c3NvZnQyL2NvcmUvaGFuZGxlci9zb2Nrcy5IYW5kbGVTb2Nrc1JlcXVlc3RcIiAoc29ja3MuSGFuZGxlU29ja3NSZXF1ZXN0KSA9PT4gVGhpcyBoYW5kbGVyIGVzdGFibGlzaGVzIGEgU09DS1MgcmVsYXksIHdoaWNoIGZhY2lsaXRhdGVzIGxhdGVyYWwgbW92ZW1lbnQgd2l0aGluIGEgY29tcHJvbWlzZWQgbmV0d29yayBhbmQgcm91dGVzIEMyIHRyYWZmaWMgKEZpZ3VyZSAyKS4gVGhpcyBoYW5kbGVyIGlzIGEgU09DS1MgcHJveHkgaGFuZGxlciB0aGF0IGF0dGVtcHRzIHRvIHBhcnNlIGluY29taW5nIHJlcXVlc3RzIGFzIEpTT04tZm9ybWF0dGVkIFNPQ0tTIGFyZ3VtZW50cy4gRGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9mIHRoaXMgcGFyc2luZywgaXQgZWl0aGVyIHJlc3BvbmRzIHdpdGggYW4gZXJyb3Igb3IgZGVsZWdhdGVzIHRoZSBoYW5kbGluZyB0byBhIFNPQ0tTIGhhbmRsaW5nIG1lY2hhbmlzbSBcIndzc29mdDIvY29yZS9oYW5kbGVyL3NvY2tzLlNvY2tzV2l0aExvY2FsQWRkclwiIChzb2Nrcy5Tb2Nrc1dpdGhMb2NhbEFkZHIpLiBUaGUgaGFuZGxlciBcInNvY2tzLlNvY2tzV2l0aExvY2FsQWRkclwiIHBlcmZvcm1zIFNPQ0tTIHJlbGF5aW5nIGFuZCBuZXR3b3JrIHR1bm5lbGluZyBvdmVyICBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbCAoVENQKSwgVXNlciBEYXRhZ3JhbSBQcm90b2NvbCAoVURQKSwgYW5kIEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCAoSUNNUCkuXHJcblxyXG5iLiBcIndzc29mdDIvY29yZS9oYW5kbGVyL3dlYi5XZWJTZXJ2aWNlXCIgKHdlYi5XZWJTZXJ2aWNlKSA9PT4gVGhpcyBoYW5kbGVyIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyIChGaWd1cmUgMykuIFRoZSBleHRlbnNpb24gdXNlcyB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGxldmVyYWdpbmcgdGhlIFwibmV0L2h0dHAgcGFja2FnZVwiIGFuZCBcImdvcmlsbGEvbXV4XCIgbGlicmFyeSwgdG8gY3JlYXRlIGEgd2ViIHNlcnZlciBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBBIGRlZGljYXRlZCBBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKEFQSSkgXCIvYXBpL1wiIGVuZHBvaW50IGlzIGNyZWF0ZWQgdG8gcmVjZWl2ZSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlciAoRmlndXJlIDUpLiBUaGlzIHByb3ZpZGVzIHRoZSBUQSB3aXRoIGV4dGVuc2l2ZSBjb250cm9sIG92ZXIgdGhlIHZpY3RpbSdzIGZpbGUgc3lzdGVtLCBhbGxvd2luZyB0aGUgVEEgdG8gYnJvd3NlLCB2aWV3LCBjcmVhdGUsIGRlbGV0ZSwgdXBsb2FkLCBhbmQgZG93bmxvYWQgZmlsZXMgYW5kIGZvbGRlcnMuIFRvIGJsZW5kIGluIGFuZCBldmFkZSBkZXRlY3Rpb24sIHRoZSBiYWNrZG9vciBzZXJ2ZXMgc3RhdGljIHdlYiBmaWxlcyAoSHlwZXJ0ZXh0IE1hcmt1cCBMYW5ndWFnZSAoSFRNTCksIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUyksIEphdmFTY3JpcHQpIGZyb20gYSBkZXNpZ25hdGVkIGRpcmVjdG9yeS4gVGhpcyBtYWtlcyB0aGUgbWFsaWNpb3VzIHdlYiBzZXJ2ZXIgYXBwZWFyIHRvIGJlIGEgc3RhbmRhcmQgd2ViIGFwcGxpY2F0aW9uLiBcclxuXHJcbmMuIFwid3Nzb2Z0Mi9jb3JlL2hhbmRsZXIvY29tbWFuZC5IYW5kbGVUVFlSZXF1ZXN0XCIgKGNvbW1hbmQuSGFuZGxlVFRZUmVxdWVzdCkgPT0+IFRoaXMgaGFuZGxlciBpcyB1c2VkIHRvIGV4ZWN1dGUgc2hlbGwgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSwgZ3JhbnRpbmcgdGhlIFRBIGludGVyYWN0aXZlIGNvbW1hbmQtbGluZSBhY2Nlc3MgKEZpZ3VyZSA0KS4gVGhlIGhhbmRsZXIgaW5pdGlhdGVzIGEgcmVxdWVzdCB0aHJvdWdoIGl0cyBjb3ZlcnQgY29tbXVuaWNhdGlvbiBjaGFubmVscywgcGFyc2UgYSBKU09OIHBheWxvYWQgaW50byB0aGUgYSBzcGVjaWZpYyBzdHJ1Y3R1cmUsIGV4dHJhY3RzIGFuZCBleGVjdXRlcyBhbiBleHRlcm5hbCBjb21tYW5kLCBzcGVjaWZpY2FsbHkgZXN0YWJsaXNoaW5nIGEgcHNldWRvLXRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gaXQsIGVuYWJsaW5nIGludGVyYWN0aXZlIGNvbnRyb2wgYW5kIGRhdGEgZXhjaGFuZ2Ugd2l0aCB0aGUgcnVubmluZyBjb21tYW5kLlxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS1cclxuXHJcbkRpc3BsYXllZCBiZWxvdyBhcmUgZmlsZSBtYW5hZ2VtZW50IGNvbW1hbmRzIHdpdGhpbiB0aGUgYmFja2Rvb3I6XHJcblxyXG4tLUJlZ2luIEZpbGUgTWFuYWdlbWVudCBDb21tYW5kcy0tXHJcblwiZmlsZS1tZDVcIjogQ2FsY3VsYXRlcyB0aGUgTUQ1IGNoZWNrc3VtIG9mIGEgc3BlY2lmaWVkIGZpbGUgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGUuXHJcblwiZ2V0LWZpbGVcIjogRG93bmxvYWRzIGEgZmlsZSBmcm9tIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gdG8gdGhlIFRBJ3MgQzIgc2VydmVyLiBcclxuXCJsaXN0LWRpclwiOiBMaXN0cyB0aGUgY29udGVudHMgb2YgYSBkaXJlY3Rvcnkgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSAoYnJvd3NlIHRoZSBmaWxlIHN5c3RlbSkuXHJcblwicHV0LWZpbGVcIjogVXBsb2FkcyBhIGZpbGUgZnJvbSB0aGUgVEEncyBDMiBzZXJ2ZXIgdG8gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gXHJcblwic2xpY2UtdXBcIjogVG8gcmVhZCBhbmQgZG93bmxvYWQgc3BlY2lmaWMsIHBhcnRpYWwgc2VjdGlvbnMgb2YgYSBmaWxlLiBcclxuLS1FbmQgRmlsZSBNYW5hZ2VtZW50IENvbW1hbmRzLS0iLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiICduYW1lc3BhY2UnPSdDSVNBX0NvbnNvbGlkYXRlZC55YXJhJyBydWxlX25hbWU9Q0lTQV8yNTExNjVfMDIgcnVsZV9jb250ZW50PXJ1bGUgQ0lTQV8yNTExNjVfMDIgOiBCUklDS1NUT1JNIGJhY2tkb29yIGluc3RhbGxzX290aGVyX2NvbXBvbmVudHMgY29tbXVuaWNhdGVzX3dpdGhfYzIgZXhmaWx0cmF0ZXNfZGF0YVxue1xuICAgbWV0YTpcbiAgICAgICBhdXRob3IgPSBcIkNJU0EgQ29kZSAmIE1lZGlhIEFuYWx5c2lzXCJcbiAgICAgICBpbmNpZGVudCA9IFwiMjUxMTY1XCJcbiAgICAgICBkYXRlID0gXCIyMDI1LTA5LTI5XCJcbiAgICAgICBsYXN0X21vZGlmaWVkID0gXCIyMDIwNTEwMDFfMTAwOFwiXG4gICAgICAgYWN0b3IgPSBcIm4vYVwiXG4gICAgICAgZmFtaWx5ID0gXCJCUklDS1NUT1JNXCJcbiAgICAgICBjYXBhYmlsaXRpZXMgPSBcImluc3RhbGxzLW90aGVyLWNvbXBvbmVudHMgY29tbXVuaWNhdGVzLXdpdGgtYzIgZXhmaWx0cmF0ZXMtZGF0YVwiXG4gICAgICAgbWFsd2FyZV90eXBlID0gXCJiYWNrZG9vclwiXG4gICAgICAgdG9vbF90eXBlID0gXCJ1bmtub3duXCJcbiAgICAgICBkZXNjcmlwdGlvbiA9IFwiRGV0ZWN0cyBHby1CYXNlZCBCUklDS1NUT1JNIGJhY2tkb29yIHNhbXBsZXNcIlxuICAgICAgIHNoYTI1Nl8xID0gXCJhYWY1NTY5YzhlMzQ5YzE1MDI4YmMzZmFjMDllYjk4MmVmYjA2ZWFiYWM5NTViNzA1YTZkNDQ3MjYzNjU4ZTM4XCJcbiAgIHN0cmluZ3M6XG4gICAgICAgJHMwID0geyA2RCA2MSA2OSA2RSAyRSA3MyA3NCA2MSA3MiA3NCA0RSA2NSA3NyB9XG4gICAgICAgJHMxID0geyA2RCA2MSA2OSA2RSAyRSA3MyA2NSA2QyA2NiA1NyA2MSA3NCA2MyA2OCA2NSA3MiB9XG4gICAgICAgJHMyID0geyA2RCA2MSA2OSA2RSAyRSA3MyA2NSA3NCA1MyA2NSA3MiA3NiA2OSA2MyA2NSA0MyA2NiA2NyB9XG4gICAgICAgJHMzID0geyA3MyA2RiA2MyA2QiA3MyAyRSA0OCA2MSA2RSA2NCA2QyA2NSA1MyA2RiA2MyA2QiA3MyA1MiA2NSA3MSA3NSA2NSA3MyA3NCB9XG4gICAgICAgJHM0ID0geyA3NyA2NSA2MiAyRSA1NyA2NSA2MiA1MyA2NSA3MiA3NiA2OSA2MyA2NSB9XG4gICAgICAgJHM1ID0geyA2MyA2RiA2RCA2RCA2MSA2RSA2NCAyRSA0OCA2MSA2RSA2NCA2QyA2NSA1NCA1NCA1OSA1MiA2NSA3MSA3NSA2NSA3MyA3NCB9XG4gICAgICAgJHM2ID0geyA3NyA2NSA2MiA3MyA2RiA2MyA2QiA2NSA3NCAyRSAyOCAyQSA1NyA1MyA0MyA2RiA2RSA2RSA2NSA2MyA3NCA2RiA3MiAyOSAyRSA0MyA2RiA2RSA2RSA2NSA2MyA3NCB9XG4gICAgICAgJHM3ID0geyA2NiA3MyAyRSAyOCAyQSA1NyA2NSA2MiA1MyA2NSA3MiA3NiA2NSA3MiAyOSAyRSA1MiA3NSA2RSA1MyA2NSA3MiA3NiA2NSA3MiB9XG4gICAgICAgJHM4ID0geyA2OCA3NCA3NCA3MCA3MyAzQSAyRiAyRiAzMSAyRSAzMCAyRSAzMCAyRSAzMSAyRiA2NCA2RSA3MyAyRCA3MSA3NSA2NSA3MiA3OSB9XG4gICAgICAgJHM5ID0geyA2OCA3NCA3NCA3MCA3MyAzQSAyRiAyRiAzMSAyRSAzMSAyRSAzMSAyRSAzMSAyRiA2NCA2RSA3MyAyRCA3MSA3NSA2NSA3MiA3OSB9XG4gICAgICAgJHMxMCA9IHsgNjggNzQgNzQgNzAgNzMgM0EgMkYgMkYgMzggMkUgMzggMkUgMzQgMkUgMzQgMkYgNjQgNkUgNzMgMkQgNzEgNzUgNjUgNzIgNzkgfVxuICAgICAgICRzMTEgPSB7IDY4IDc0IDc0IDcwIDczIDNBIDJGIDJGIDM4IDJFIDM4IDJFIDM4IDJFIDM4IDJGIDY0IDZFIDczIDJEIDcxIDc1IDY1IDcyIDc5IH1cbiAgICAgICAkczEyID0geyA2OCA3NCA3NCA3MCA3MyAzQSAyRiAyRiAzOSAyRSAzOSAyRSAzOSAyRSAzOSAyRiA2NCA2RSA3MyAyRCA3MSA3NSA2NSA3MiA3OSB9XG4gICBjb25kaXRpb246XG4gICAgICAgOCBvZiB0aGVtXG59XG4iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInlhcmEiLAogICAgICAgICAgICAidmFsaWRfZnJvbSI6ICIyMDI1LTEyLTAyVDE2OjA3OjIzLjY2MzA5WiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAibWFsd2FyZS1hbmFseXNpcyIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogIm1hbHdhcmUtYW5hbHlzaXMtLWY1MzU0YjE2LWE2NWMtNDYzOC1hYzJlLTAzMTIyMTZkNDdhNyIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJwcm9kdWN0IjogImVzZXQiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJyZXN1bHRfbmFtZSI6ICJhIHZhcmlhbnQgb2YgTGludXgvQnJpY2tTdG9ybS5BIHRyb2phbiIsCiAgICAgICAgICAgICJyZXN1bHQiOiAidW5rbm93biIsCiAgICAgICAgICAgICJzYW1wbGVfcmVmIjogImZpbGUtLTgyYTAzOTZiLTJmN2YtNWEwMS1iNGRmLTlmYmI1YzQyYTZmMyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAibWFsd2FyZS1hbmFseXNpcyIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogIm1hbHdhcmUtYW5hbHlzaXMtLWM3N2RhYmEwLWFiYTgtNDIwYy1iMjMxLTMzYjZiOTQ1MmIyYyIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJwcm9kdWN0IjogInNvcGhvcyIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInJlc3VsdF9uYW1lIjogIkxpbnV4L0JyaWNrLUIiLAogICAgICAgICAgICAicmVzdWx0IjogInVua25vd24iLAogICAgICAgICAgICAic2FtcGxlX3JlZiI6ICJmaWxlLS04MmEwMzk2Yi0yZjdmLTVhMDEtYjRkZi05ZmJiNWM0MmE2ZjMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLS1hZTgzZWI2Yy1lNThkLTQ1MDMtOTcyMy00MjVjYjQ3YTcwYTAiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNIHRoYXQgdXNlcyBzZXZlcmFsIGFkdmFuY2VkIHRlY2huaXF1ZXMgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgdXNlcyBTT0NLUyBwcm94eWluZywgbXVsdGktbGF5ZXJlZCB3ZWIgc2VydmljZSBjb21tdW5pY2F0aW9uLCBhbmQgdmFyaWVkIGNvbW1hbmQgZXhlY3V0aW9uIHRvIG9ic2N1cmUgaXRzIGFjdGl2aXRpZXMuIFRoZSBiYWNrZG9vciBjb21iaW5lcyBzZXZlcmFsIHNvcGhpc3RpY2F0ZWQgdGVjaG5pcXVlcywgaW5jbHVkaW5nIERvSCwgbmVzdGVkIFRMUyBlbmNyeXB0aW9uLCBhbmQgdGhlIGFidXNlIG9mIGEgbGVnaXRpbWF0ZSBjbG91ZCBzZXJ2aWNlIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIGNvbnRhaW5zIHRoZSBhdXRoZW50aWNhdGlvbiBrZXksIEhUVFBTIGFuZCBXZWJTb2NrZXQgYWRkcmVzc2VzIGFzIHBhcnQgb2YgaXRzIHNvcGhpc3RpY2F0ZWQsIG11bHRpLWxheWVyZWQgQzIgZXZhc2lvbiB0ZWNobmlxdWUuXHJcblxyXG4tLUJlZ2luIEVsZW1lbnRzLS1cclxuW1JlZGFjdGVkXSA9PT4gYXV0aGVudGljYXRpb24ga2V5XHJcbmh0dHBzOi8vW3JlZGFjdGVkXS5jb20gPT0+IEhUVFBTIGFkZHJlc3MgY29uc3RydWN0ZWQgYXQgcnVudGltZVxyXG53c3M6Ly9bcmVkYWN0ZWRdLmNvbS9hcGkgPT0+IFdlYlNvY2tldCBhZGRyZXNzXHJcbi0tRW5kIEVsZW1lbnRzLS1cclxuXHJcblRoZSBoYXJkLWNvZGVkIGRvbWFpbiBoYXMgYmVlbiByZWRhY3RlZCBmcm9tIHRoaXMgcmVwb3J0LiBBcyBvZiB0aGUgcmVsZWFzZSBvZiB0aGlzIHJlcG9ydCwgdGhlcmUgaGFzIGJlZW4gbm8gcmV1c2Ugb2YgQzIgZG9tYWlucyBhY3Jvc3MgdmljdGltcy4gVXBvbiBleGVjdXRpb24sIHRoZSBiYWNrZG9vciBpbml0aWF0ZXMgdGhlIFwibWFpbl9zdGFydE5ld1wiIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBiYWNrZG9vciB0aGVuIGNoZWNrcyBmb3IgdGhlIFwiVk13YXJlXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHJ1bm5pbmcgYXMgYSBjaGlsZCBwcm9jZXNzLiBJZiBcIlZNd2FyZVwiIGlzIG5vdCBzZXQgKGluZGljYXRpbmcgbm90IGEgY2hpbGQgcHJvY2VzcyksIHRoZSBiYWNrZG9vciB2ZXJpZmllcyBpdHMgY3VycmVudCBleGVjdXRpb24gcGF0aCBieSBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlIGZpbGUgY29udGVudHMgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3Ztc3JjXCIuIElmIG5vdCBydW5uaW5nIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGggXCIvZXRjL3N5c2NvbmZpZy92bXNyY1wiLCB0aGUgYmFja2Rvb3IgdGVybWluYXRlcyBpdHMgY29kZSBleGVjdXRpb24uIElmIHRoZSBiYWNrZG9vciBleGVjdXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoLCB0aGUgYmFja2Rvb3IgY29waWVzIGl0c2VsZiB0byBcIi9vcHQvdm13YXJlL3NiaW4vdm13YXJlLXNwaGVyZVwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi9vcHQvdm13YXJlL3NiaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGVuc3VyaW5nIHRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgdGFrZXMgcHJlY2VkZW5jZSBpbiBleGVjdXRpb24uIFRoZSBiYWNrZG9vciBleGVjdXRlcyB0aGUgY29waWVkIGJhY2tkb29yIG5hbWVkIFwidm13YXJlLXNwaGVyZVwiIGR1ZSB0byB0aGUgUEFUSCBtb2RpZmljYXRpb24gYW5kIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24uIElmIFwiVk13YXJlXCIgaXMgc2V0IChpbmRpY2F0aW5nIGEgY2hpbGQgcHJvY2VzcyksIHRoZSBiYWNrZG9vciBjb250aW51ZXMgaXRzIG1haW4gY29kZSBleGVjdXRpb24uIEFzIHBhcnQgb2YgdGhpcyBjb250aW51ZWQgZXhlY3V0aW9uLCB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGJhY2tkb29yIGF0IFwiL29wdC92bXdhcmUvc2Jpbi92bXdhcmUtc3BoZXJlXCIgaXMgZGVsZXRlZC5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIHRoZSBcIm1haW5fc2VsZldhdGNoZXIgZnVuY3Rpb25cIiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgdGhlIFwiU3BoZXJlXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGNvbmZpcm1zIHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9jZXNzIG5hbWVkIFwidm13YXJlLXNwaGVyZVwiLiBJZiB0aGUgY2hlY2tzIHJldHVybiBhIFwiZmFsc2VcIiB2YWx1ZSAoXCJTcGhlcmVcIiBpcyBub3Qgc2V0ICksIGluZGljYXRpbmcgdGhlIGJhY2tkb29yIGlzIG5vdCBydW5uaW5nIGNvcnJlY3RseSwgdGhlIGJhY2tkb29yIHJlLWluc3RhbGxzIGl0c2VsZiBmcm9tIFwiL2V0Yy9zeXNjb25maWcvdm1zcmNcIiB0byBhIG5ldyBsb2NhdGlvbjogXCIvb3B0L3Ztd2FyZS9zYmluL3Ztd2FyZS1zcGhlcmVcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvb3B0L3Ztd2FyZS9zYmluL1wiIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIGZpbGUgXCJ2bXdhcmUtc3BoZXJlXCIgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCAoXCJTcGhlcmVcIiBpcyBzZXQpLCB0aGUgXCJtYWluX3NlbGZXYXRjaGVyXCIgZnVuY3Rpb24gYWxsb3dzIHRoZSBjb2RlIHRvIGNvbnRpbnVlIGl0cyBub3JtYWwgbWFsaWNpb3VzIG9wZXJhdGlvbnMuXHJcblxyXG5UaGUgYmFja2Rvb3IgY29uZmlndXJlcyBpdHMgc2VydmljZSBieSBkaXNhYmxpbmcgaXRzIGxvZ2dlciBhbmQgc2V0dGluZyB0d28gZGlmZmVyZW50IHNsZWVwIHRpbWUgcGFyYW1ldGVycyBiZWZvcmUgYXBwbHlpbmcgdGhlc2UgY29uZmlndXJhdGlvbnMgdXNpbmcgdGhlIFwibWFpbl9zZXRTZXJ2aWNlQ2ZnXCIgZnVuY3Rpb24uIFxyXG5cclxuVGhlIHByb2dyYW0gY29udGFpbnMgYSBoYXJkLWNvZGVkIGxpc3Qgb2YgcHVibGljIERvSCBzZXJ2ZXJzIHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvbnMuXHJcblxyXG4tLS1CZWdpbiBEb0ggQWRkcmVzc2VzLS0tXHJcbmh0dHBzOi8vMS4wLjAuMS9kbnMtcXVlcnkgIChDbG91ZGZsYXJlKVxyXG5odHRwczovLzEuMS4xLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5odHRwczovLzguOC40LjQvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh0dHBzOi8vOC44LjguOC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHR0cHM6Ly85LjkuOS45L2Rucy1xdWVyeSAoUXVhZDkpXHJcbi0tLUVuZCBEb0ggQWRkcmVzc2VzLS0tXHJcblxyXG5UaGUgYmFja2Rvb3IgcmVsaWVzIG9uIGludGVybmFsLCBsb3ctbGV2ZWwgZnVuY3Rpb24gY2FsbHMgZnJvbSBhIGN1c3RvbSBHbyBwYWNrYWdlIFwid3Nzb2Z0MlwiIHRvIGhhbmRsZSBpdHMgbmV0d29yayBjb25uZWN0aW9ucyBhbmQgY29tbWFuZCBwcm9jZXNzaW5nLiBUaGUgYmFja2Rvb3IgdXNlcyBEb0ggdG8gcmVzb2x2ZSB0aGUgYWRkcmVzc2VzIG9mIGl0cyBDMiBzZXJ2ZXJzLiBUaGUgYmFja2Rvb3IgY3JlYXRlcyBhIEROUyBxdWVyeSBmb3IgdGhlIEMyIGRvbWFpbi4gVGhlIGJhY2tkb29yIGVuY3J5cHRzIHRoaXMgcXVlcnkgYnkgZW5jYXBzdWxhdGluZyBpdCB3aXRoaW4gYSBzdGFuZGFyZCBIVFRQUyByZXF1ZXN0LiBUaGUgYmFja2Rvb3Igc2VuZHMgdGhlIGVuY3J5cHRlZCBIVFRQUyByZXF1ZXN0IHRvIGEgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIG9wZXJhdGVkIGJ5IENsb3VkZmxhcmUgb3IgR29vZ2xlIG9yIFF1YWQ5IHRvIHByb2Nlc3MgdGhlIHF1ZXJ5LiBBbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBpZiB0aGUgcmVxdWVzdGVkIGRvbWFpbiBpcyBub3QgZm91bmQgaW4gdGhlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgY2FjaGUsIHRoZSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgZm9yd2FyZHMgdGhlIHJlcXVlc3QgdG8gdGhlIG5leHQgc2VydmVyIGluIHRoZSBETlMgaGllcmFyY2h5LCB1bHRpbWF0ZWx5IHJlYWNoaW5nIHRoZSBUQSdzIEROUyBzZXJ2ZXIsIHdoaWNoIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNlcnZlciBmb3IgdGhlIG1hbGljaW91cyBkb21haW4uIFRoZSBUQSdzIEROUyBzZXJ2ZXIgd2lsbCByZXNwb25kIHdpdGggdGhlIGNvcnJlY3QgSVAgYWRkcmVzcyBmb3IgdGhlIEMyIGRvbWFpbiwgYW5kIHRoaXMgcmVzcG9uc2UgaXMgc2VudCBiYWNrIHRocm91Z2ggdGhlIGxlZ2l0aW1hdGUgRG9IIHJlc29sdmVyIHRvIHRoZSBiYWNrZG9vci4gVGhlIGJhY2tkb29yIHJlY2VpdmVzIHRoZSBlbmNyeXB0ZWQgcmVzcG9uc2UsIGRlY3J5cHRzIGl0IHRvIGdldCB0aGUgQzIgc2VydmVyJ3MgSVAgYWRkcmVzcywgYW5kIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbi5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIG11bHRpcGxlIGxheWVycyBvZiBlbmNyeXB0aW9uIGZvciBpdHMgQzIgY29tbXVuaWNhdGlvbnMuIFRoZSBiYWNrZG9vciBjb21tdW5pY2F0ZXMgb3ZlciBIVFRQUyB0byB0aGUgY2xvdWQgcGxhdGZvcm0sIHRoZW4gdXBncmFkZXMgdGhlc2Ugc2Vzc2lvbnMgdG8gV2ViU29ja2V0cyB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgVExTIGVuY3J5cHRpb24uIFRoZSBiYWNrZG9vciBzZW5kcyBIVFRQIHVwZ3JhZGUgcmVxdWVzdCB0byBjb252ZXJ0IHRoZSBpbml0aWFsIGVuY3J5cHRlZCBIVFRQUyBjb25uZWN0aW9uIGludG8gYSBwZXJzaXN0ZW50IFdlYlNvY2tldCBjb25uZWN0aW9uOiBcIndzczovL1tyZWRhY3RlZF0uY29tL2FwaVwiLiBUaGUgYmFja2Rvb3IgbmVzdHMgYWRkaXRpb25hbCBsYXllcnMgb2YgVExTIGVuY3J5cHRpb24gd2l0aGluIHRoZSBXZWJTb2NrZXQgc2Vzc2lvbi4gVGhlIGJhY2tkb29yIHBlcmZvcm1zIGEgc2VyaWVzIG9mIG5lc3RlZCBUTFMgaGFuZHNoYWtlcyB3aXRoaW4gdGhlIGVzdGFibGlzaGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoZSBmaXJzdCBUTFMgaGFuZHNoYWtlIGlzIHRoZSBzdGFuZGFyZCBUTFMgaGFuZHNoYWtlIGZvciB0aGUgaW5pdGlhbCBIVFRQUyByZXF1ZXN0IHRvIHRoZSBDbG91ZGZsYXJlIHBsYXRmb3JtLiBBIHNlY29uZCBUTFMgaGFuZHNoYWtlIG9jY3VycyB3aXRoaW4gdGhlIFdlYlNvY2tldCB0dW5uZWwuIER1cmluZyB0aGlzIHN0ZXAsIHRoZSBiYWNrZG9vciBhdXRoZW50aWNhdGVzIGl0c2VsZiB0byB0aGUgQzIgc2VydmVyIHVzaW5nIGEgc3RhdGljIGF1dGhlbnRpY2F0aW9uIGtleSwgd2hpY2ggaGFzIGJlZW4gcmVkYWN0ZWQgZnJvbSB0aGlzIHJlcG9ydC4gSWYgYXV0aGVudGljYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIGJhY2tkb29yIHByb2NlZWRzIHRvIHNldCB1cCB0aGUgbXVsdGlwbGV4aW5nIGxheWVyLiBUaGUgYmFja2Rvb3IgaGFuZGxlcyBib3RoIFNpbXBsZSBNdWx0aXBsZXhpbmcgKHNtdXgpICBhbmQgWWV0IEFub3RoZXIgTXVsdGlwbGV4ZXIgKFlhbXV4KSBsaWJyYXJpZXMgdG8gY3JlYXRlIHZpcnR1YWwgc3RyZWFtcyBvdmVyIGEgc2luZ2xlIHVuZGVybHlpbmcgVExTLXNlY3VyZWQgY29ubmVjdGlvbiBiYXNlZCBvbiBjbGllbnQgY29uZmlndXJhdGlvbiBvciBoYW5kc2hha2UgZGF0YSAoRmlndXJlIDYpLiBUaGlzIG1ldGhvZCBtYWtlcyB0aGUgVEEncyBhY3Rpdml0aWVzIGRpZmZpY3VsdCB0byBkZXRlY3QsIGFzIG11bHRpcGxlIGNvbW1hbmRzIGFuZCBuZXR3b3JrIHR1bm5lbHMgYXJlIG11bHRpcGxleGVkIGFuZCBoaWRkZW4gd2l0aGluIGEgc2luZ2xlLCBlbmNyeXB0ZWQgbmV0d29yayBzdHJlYW0uXHJcblxyXG5PbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIEMyIHNlcnZlciB2aWEgV2ViU29ja2V0cywgdGhlIGJhY2tkb29yIHJlY2VpdmVzIGNvbW1hbmRzIHRoYXQgYXJlIGRpcmVjdGVkIHRvIHNwZWNpZmljIGhhbmRsZXJzIHRvIHBlcmZvcm0gdGFza3Mgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS5cclxuXHJcbkRpc3BsYXllZCBiZWxvdyBhcmUgdGhlIHRocmVlIGNvcmUgaGFuZGxlcnMgYW5kIHRoZWlyIGZ1bmN0aW9uczogXHJcblxyXG4tLUJlZ2luIENvcmUgSGFuZGxlcnMtLVxyXG5hLiBcIndzc29mdDIvY29yZS9oYW5kbGVyL3NvY2tzLkhhbmRsZVNvY2tzUmVxdWVzdFwiIChzb2Nrcy5IYW5kbGVTb2Nrc1JlcXVlc3QpID09PiBUaGlzIGhhbmRsZXIgZXN0YWJsaXNoZXMgYSBTT0NLUyByZWxheSwgd2hpY2ggZmFjaWxpdGF0ZXMgbGF0ZXJhbCBtb3ZlbWVudCB3aXRoaW4gYSBjb21wcm9taXNlZCBuZXR3b3JrIGFuZCByb3V0ZXMgQzIgdHJhZmZpYyAoRmlndXJlIDIpLiBUaGlzIGhhbmRsZXIgaXMgYSBTT0NLUyBwcm94eSBoYW5kbGVyIHRoYXQgYXR0ZW1wdHMgdG8gcGFyc2UgaW5jb21pbmcgcmVxdWVzdHMgYXMgSlNPTi1mb3JtYXR0ZWQgU09DS1MgYXJndW1lbnRzLiBEZXBlbmRpbmcgb24gdGhlIHN1Y2Nlc3Mgb2YgdGhpcyBwYXJzaW5nLCBpdCBlaXRoZXIgcmVzcG9uZHMgd2l0aCBhbiBlcnJvciBvciBkZWxlZ2F0ZXMgdGhlIGhhbmRsaW5nIHRvIGEgU09DS1MgaGFuZGxpbmcgbWVjaGFuaXNtIFwid3Nzb2Z0Mi9jb3JlL2hhbmRsZXIvc29ja3MuU29ja3NXaXRoTG9jYWxBZGRyXCIgKHNvY2tzLlNvY2tzV2l0aExvY2FsQWRkcikuIFRoZSBoYW5kbGVyIFwic29ja3MuU29ja3NXaXRoTG9jYWxBZGRyXCIgcGVyZm9ybXMgU09DS1MgcmVsYXlpbmcgYW5kIG5ldHdvcmsgdHVubmVsaW5nIG92ZXIgIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sIChUQ1ApLCBVc2VyIERhdGFncmFtIFByb3RvY29sIChVRFApLCBhbmQgSW50ZXJuZXQgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sIChJQ01QKS5cclxuXHJcbmIuIFwid3Nzb2Z0Mi9jb3JlL2hhbmRsZXIvd2ViLldlYlNlcnZpY2VcIiAod2ViLldlYlNlcnZpY2UpID09PiBUaGlzIGhhbmRsZXIgZXN0YWJsaXNoZXMgY292ZXJ0IEMyIGNvbW11bmljYXRpb24gYnkgbWFraW5nIHRoZSBiYWNrZG9vciBhcHBlYXIgYXMgYSBsZWdpdGltYXRlIHdlYiBzZXJ2ZXIgKEZpZ3VyZSAzKS4gVGhlIGV4dGVuc2lvbiB1c2VzIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZSwgbGV2ZXJhZ2luZyB0aGUgXCJuZXQvaHR0cCBwYWNrYWdlXCIgYW5kIFwiZ29yaWxsYS9tdXhcIiBsaWJyYXJ5LCB0byBjcmVhdGUgYSB3ZWIgc2VydmVyIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIEEgZGVkaWNhdGVkIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSAoQVBJKSBcIi9hcGkvXCIgZW5kcG9pbnQgaXMgY3JlYXRlZCB0byByZWNlaXZlIGFuZCBleGVjdXRlIGNvbW1hbmRzIGZyb20gdGhlIFRBJ3MgQzIgc2VydmVyIChGaWd1cmUgNSkuIFRoaXMgcHJvdmlkZXMgdGhlIFRBIHdpdGggZXh0ZW5zaXZlIGNvbnRyb2wgb3ZlciB0aGUgdmljdGltJ3MgZmlsZSBzeXN0ZW0sIGFsbG93aW5nIHRoZSBUQSB0byBicm93c2UsIHZpZXcsIGNyZWF0ZSwgZGVsZXRlLCB1cGxvYWQsIGFuZCBkb3dubG9hZCBmaWxlcyBhbmQgZm9sZGVycy4gVG8gYmxlbmQgaW4gYW5kIGV2YWRlIGRldGVjdGlvbiwgdGhlIGJhY2tkb29yIHNlcnZlcyBzdGF0aWMgd2ViIGZpbGVzIChIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIChIVE1MKSwgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSwgSmF2YVNjcmlwdCkgZnJvbSBhIGRlc2lnbmF0ZWQgZGlyZWN0b3J5LiBUaGlzIG1ha2VzIHRoZSBtYWxpY2lvdXMgd2ViIHNlcnZlciBhcHBlYXIgdG8gYmUgYSBzdGFuZGFyZCB3ZWIgYXBwbGljYXRpb24uIFxyXG5cclxuYy4gXCJ3c3NvZnQyL2NvcmUvaGFuZGxlci9jb21tYW5kLkhhbmRsZVRUWVJlcXVlc3RcIiAoY29tbWFuZC5IYW5kbGVUVFlSZXF1ZXN0KSA9PT4gVGhpcyBoYW5kbGVyIGlzIHVzZWQgdG8gZXhlY3V0ZSBzaGVsbCBjb21tYW5kcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLCBncmFudGluZyB0aGUgVEEgaW50ZXJhY3RpdmUgY29tbWFuZC1saW5lIGFjY2VzcyAoRmlndXJlIDQpLiBUaGUgaGFuZGxlciBpbml0aWF0ZXMgYSByZXF1ZXN0IHRocm91Z2ggaXRzIGNvdmVydCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCBwYXJzZSBhIEpTT04gcGF5bG9hZCBpbnRvIHRoZSBhIHNwZWNpZmljIHN0cnVjdHVyZSwgZXh0cmFjdHMgYW5kIGV4ZWN1dGVzIGFuIGV4dGVybmFsIGNvbW1hbmQsIHNwZWNpZmljYWxseSBlc3RhYmxpc2hpbmcgYSBwc2V1ZG8tdGVybWluYWwgY29ubmVjdGlvbiB0byBpdCwgZW5hYmxpbmcgaW50ZXJhY3RpdmUgY29udHJvbCBhbmQgZGF0YSBleGNoYW5nZSB3aXRoIHRoZSBydW5uaW5nIGNvbW1hbmQuXHJcbi0tRW5kIENvcmUgSGFuZGxlcnMtLVxyXG5cclxuRGlzcGxheWVkIGJlbG93IGFyZSBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMgd2l0aGluIHRoZSBiYWNrZG9vcjpcclxuXHJcbi0tQmVnaW4gRmlsZSBNYW5hZ2VtZW50IENvbW1hbmRzLS1cclxuXCJmaWxlLW1kNVwiOiBDYWxjdWxhdGVzIHRoZSBNRDUgY2hlY2tzdW0gb2YgYSBzcGVjaWZpZWQgZmlsZSB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZmlsZS5cclxuXCJnZXQtZmlsZVwiOiBEb3dubG9hZHMgYSBmaWxlIGZyb20gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB0byB0aGUgVEEncyBDMiBzZXJ2ZXIuIFxyXG5cImxpc3QtZGlyXCI6IExpc3RzIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeSBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtIChicm93c2UgdGhlIGZpbGUgc3lzdGVtKS5cclxuXCJwdXQtZmlsZVwiOiBVcGxvYWRzIGEgZmlsZSBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlciB0byB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBcclxuXCJzbGljZS11cFwiOiBUbyByZWFkIGFuZCBkb3dubG9hZCBzcGVjaWZpYywgcGFydGlhbCBzZWN0aW9ucyBvZiBhIGZpbGUuIFxyXG4tLUVuZCBGaWxlIE1hbmFnZW1lbnQgQ29tbWFuZHMtLSIsCiAgICAgICAgICAgICJtYWx3YXJlX3R5cGVzIjogWwogICAgICAgICAgICAgICAgImJhY2tkb29yIiwKICAgICAgICAgICAgICAgICJ0cm9qYW4iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpc19mYW1pbHkiOiBmYWxzZSwKICAgICAgICAgICAgInNhbXBsZV9yZWZzIjogWwogICAgICAgICAgICAgICAgImZpbGUtLTgyYTAzOTZiLTJmN2YtNWEwMS1iNGRmLTlmYmI1YzQyYTZmMyIKICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJpbmRpY2F0b3IiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJpbmRpY2F0b3ItLWMzNjIxNGNiLTc3ZGItNDhlMC05NjQ1LTNhMTE2MGFhOWRhZiIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJuYW1lIjogInZtc3JjIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiW2ZpbGU6aGFzaGVzLidNRDUnPSc4ZTRjODhkMDBiNmViNDYyMjlhMWVkNzAwMTQ1MTMyMCcgT1IgZmlsZTpoYXNoZXMuJ1NIQS0xJz0nOWJmNGM3ODZlYmQ2OGMwMTgxY2ZlM2ViODVkMmZkMjAyZWQxMmM1NCcgT1IgZmlsZTpoYXNoZXMuJ1NIQS0yNTYnPSdhYWY1NTY5YzhlMzQ5YzE1MDI4YmMzZmFjMDllYjk4MmVmYjA2ZWFiYWM5NTViNzA1YTZkNDQ3MjYzNjU4ZTM4JyBPUiBmaWxlOmhhc2hlcy4nU0hBLTUxMic9JzVlNjU0Nzc2ZTljNDE5ZTExZTZmOTNhNDUyNDE1YTYwMWJkOWEyMDc5NzEwZjEwNzQ2MDg1NzBlNDk4YTlhZjM3YjgxYmI1N2M5OGNiOGJiNjI2YzVlZTRiM2UzNTc1N2QzYWU4YzFjMzcxN2YyOGQ5ZjNmZTdhNGNlYmUwNjA4J10iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInN0aXgiLAogICAgICAgICAgICAicGF0dGVybl92ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJ2YWxpZF9mcm9tIjogIjIwMjUtMTItMDJUMTY6MDc6MjMuNjY5MTQ4WiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImZpbGUtLWJlZWRiNGY1LWQwYjMtNTgyMi04MmYzLWUwOWU2MzZiZjBhZiIsCiAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAiTUQ1IjogIjBhNGZhNTI4MDNhMzg5MzExYTlkZGM0OWI3YjE5MTM4IiwKICAgICAgICAgICAgICAgICJTSEEtMSI6ICI5NzAwMWJhYWEzNzliY2Q4MzY3N2RjYTdiYzViODA0OGZkZmFhZGRjIiwKICAgICAgICAgICAgICAgICJTSEEtMjU2IjogImIzYjZhOTkyNTQwZGE5NjM3NWU0NzgxYWZkMzA1MjExOGFkOTdjZmU2MGNjZjAwNGQ3MzJmNzY2NzhmNjgyMGEiLAogICAgICAgICAgICAgICAgIlNIQS01MTIiOiAiNjVlYmY1ZGZhZmI4OTcyZmZlYWQ0NDI3MTQzNmVjODQyNTE3Y2ZhYWYzZDFmMWYxMjM3YTMyZDY2ZTFkMjgwOTQzYmQzYTY5ZjFkNTM5YTFiN2FjYTYxNTJlOTZiMjliYzgyMmUxMDQ3ZTIyNDNmNmFlYzg5NTk1OTU1NjAxNDciLAogICAgICAgICAgICAgICAgIlNTREVFUCI6ICI0OTE1MjpCZ0NsejgvOWNNU1Rod2hXeWgvenlwek96UnpxbTloUnA2RlkrZkFuL2JrTnFyK0hmSEYyeGtkcGIzZ0FpRGxpOlcwOC85STZXTXpVY1J6OXp2bi8vWjVEIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic2l6ZSI6IDYzMTE5MzYsCiAgICAgICAgICAgICJuYW1lIjogImIzYjZhOTkyNTQwZGE5NjM3NWU0NzgxYWZkMzA1MjExOGFkOTdjZmU2MGNjZjAwNGQ3MzJmNzY2NzhmNjgyMGEiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaW5kaWNhdG9yIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiaW5kaWNhdG9yLS0yNWVkYjdhYy02NzkwLTQ2ZmYtOTE0NC03NjU3NDgyNDM2ODEiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibmFtZSI6ICJiM2I2YTk5MjU0MGRhOTYzNzVlNDc4MWFmZDMwNTIxMThhZDk3Y2ZlNjBjY2YwMDRkNzMyZjc2Njc4ZjY4MjBhIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBhcnRpZmFjdCBpcyBhIG1hbGljaW91cyA2NC1iaXQgRUxGIGV4ZWN1dGFibGUgd3JpdHRlbiBpbiB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFRoZSBiaW5hcnkgaGFzIGJlZW4gaWRlbnRpZmllZCBhcyBhIGJhY2tkb29yIHZhcmlhbnQgbmFtZWQgQlJJQ0tTVE9STSB0aGF0IHVzZXMgc2V2ZXJhbCBhZHZhbmNlZCB0ZWNobmlxdWVzIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIHVzZXMgU09DS1MgcHJveHlpbmcsIG11bHRpLWxheWVyZWQgd2ViIHNlcnZpY2UgY29tbXVuaWNhdGlvbiwgYW5kIHZhcmllZCBjb21tYW5kIGV4ZWN1dGlvbiB0byBvYnNjdXJlIGl0cyBhY3Rpdml0aWVzLiBUaGUgYmFja2Rvb3IgY29tYmluZXMgc2V2ZXJhbCBzb3BoaXN0aWNhdGVkIHRlY2huaXF1ZXMsIGluY2x1ZGluZyBEb0gsIG5lc3RlZCBUTFMgZW5jcnlwdGlvbiwgYW5kIHRoZSBhYnVzZSBvZiBhIGxlZ2l0aW1hdGUgY2xvdWQgc2VydmljZSB0byBldmFkZSBkZXRlY3Rpb24uIFRoZSBiYWNrZG9vciBjb250YWlucyB0aGUgYXV0aGVudGljYXRpb24ga2V5LCBIVFRQUyBhbmQgV2ViU29ja2V0IGFkZHJlc3NlcyBhcyBwYXJ0IG9mIGl0cyBzb3BoaXN0aWNhdGVkLCBtdWx0aS1sYXllcmVkIEMyIGV2YXNpb24gdGVjaG5pcXVlLlxyXG5cclxuLS1CZWdpbiBFbGVtZW50cy0tXHJcbmhraWdiTEtIUl9QYnk2dDZQID09PiBhdXRoZW50aWNhdGlvbiBrZXlcclxuaHR0cHM6Ly9bcmVkYWN0ZWRdLmNvbSA9PT4gSFRUUFMgYWRkcmVzc1xyXG53c3M6Ly9bcmVkYWN0ZWRdLmNvbS9jbHMgPT0+IFdlYlNvY2tldCBhZGRyZXNzXHJcbi0tRW5kIEVsZW1lbnRzLS1cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIFhPUiBjaXBoZXIgZW5jcnlwdGlvbiB0byBoaWRlIGtleSBzdHJpbmdzLCBzdWNoIGFzIGl0cyBJUHY0IGFkZHJlc3NlcyBvZiBwdWJsaWMgRG9IIHNlcnZlcnMgYW5kIG90aGVyIHN0cmluZ3Mgd2l0aGluIGl0cyBjb2RlLiBVcG9uIGV4ZWN1dGlvbiwgdGhlIGJhY2tkb29yIGluaXRpYXRlcyB0aGUgb2JmdXNjYXRlZCBmdW5jdGlvbiBcIm1haW5fc3RhcnROZXdcIiB0byBjb25maWd1cmUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGUgYmFja2Rvb3IgdGhlbiBjaGVja3MgZm9yIHRoZSBcIltyZWRhY3RlZF1ORVQ2XCIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHJ1bm5pbmcgYXMgYSBjaGlsZCBwcm9jZXNzLiBJZiBcIltyZWRhY3RlZF1ORVQ2XCIgaXMgbm90IHNldCwgaW5kaWNhdGluZyBub3QgYSBjaGlsZCBwcm9jZXNzLCB0aGUgYmFja2Rvb3IgdmVyaWZpZXMgaXRzIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGggYnkgYXR0ZW1wdGluZyB0byBsb2FkIHRoZSBmaWxlIGNvbnRlbnRzIGZyb20gXCIvZXRjL3N5c2NvbmZpZy92aW9jbGlcIi4gSWYgbm90IHJ1bm5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCBcIi9ldGMvc3lzY29uZmlnL3Zpb2NsaVwiLCB0aGUgYmFja2Rvb3IgdGVybWluYXRlcyBpdHMgY29kZSBleGVjdXRpb24uIElmIHRoZSBiYWNrZG9vciBleGVjdXRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgdGhlIGJhY2tkb29yIGNvcGllcyBpdHNlbGYgdG8gXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vdXBkYXRlbWdyXCIuIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL1wiIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBlbnN1cmluZyB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIHRha2VzIHByZWNlZGVuY2UgaW4gZXhlY3V0aW9uLiBUaGUgYmFja2Rvb3IgZXhlY3V0ZXMgdGhlIGNvcGllZCBiYWNrZG9vciBuYW1lZCBcInVwZGF0ZW1nclwiIGR1ZSB0byB0aGUgUEFUSCBtb2RpZmljYXRpb24gYW5kIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24uIElmIFwiW3JlZGFjdGVkXU5FVDZcIiBpcyBzZXQsIGluZGljYXRpbmcgYSBjaGlsZCBwcm9jZXNzLCB0aGUgYmFja2Rvb3IgY29udGludWVzIGl0cyBtYWluIGNvZGUgZXhlY3V0aW9uLiBBcyBwYXJ0IG9mIHRoaXMgY29udGludWVkIGV4ZWN1dGlvbiwgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBiYWNrZG9vciBhdCBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIiBpcyBkZWxldGVkLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgdGhlIG9iZnVzY2F0ZWQgZnVuY3Rpb24gXCJtYWluX3NlbGZXYXRjaGVyXCIgdG8gZW5zdXJlIGl0cyBjb250aW51ZWQgb3BlcmF0aW9uIGFuZCBtYWludGFpbiBwZXJzaXN0ZW5jZSBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBUaGlzIHNlbGYtcHJlc2VydmF0aW9uIG1lY2hhbmlzbSBjaGVja3MgaWYgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgYW4gaW50ZW5kZWQgcHJvY2VzcyBhbmQsIGlmIG5vdCwgdGhlIGJhY2tkb29yIHJlLWluc3RhbGxzIGFuZCByZS1leGVjdXRlcyBpdHNlbGYuIFRoZSBcIm1haW5fc2VsZldhdGNoZXJcIiBmdW5jdGlvbiBmaXJzdCBjaGVja3MgZm9yIHRoZSBcIltyZWRhY3RlZF1ORVQ1XCIgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGNvbmZpcm1zIHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9jZXNzIG5hbWVkIFwidXBkYXRlbWdyXCIuIElmIHRoZSBjaGVja3MgcmV0dXJuIGEgXCJmYWxzZVwiIHZhbHVlLCBpbmRpY2F0aW5nXCJbcmVkYWN0ZWRdTkVUNVwiIGlzIG5vdCBzZXQsIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBpdHNlbGYgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3Zpb2NsaVwiIHRvIGEgbmV3IGxvY2F0aW9uOiBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgZmlsZSBcInVwZGF0ZW1nclwiIGlzIGV4ZWN1dGVkLiBUaGUgcGFyZW50IGJhY2tkb29yIHRoZW4gdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbiwgYWxsb3dpbmcgdGhlIG5ldyBwcm9jZXNzIHRvIGNvbnRpbnVlIHJ1bm5pbmcuIElmIHRoZSBpbml0aWFsIGNoZWNrcyBjb25maXJtIHRoYXQgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgaW50ZW5kZWQsIGluZGljYXRpbmcgXCJbcmVkYWN0ZWRdTkVUNVwiIGlzIHNldCwgdGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgYW4gWE9SIG9wZXJhdGlvbiB0byBkZWNyeXB0IHRoZSBJUHY0IGFkZHJlc3NlcyBmb3IgdGhlIERvSCBzZXJ2ZXJzIGJlbG93OlxyXG5cclxuLS1CZWdpbiBEb0ggQWRkcmVzc2VzLS1cclxuaHR0cHM6Ly84LjguOC44L2Rucy1xdWVyeSAoR29vZ2xlKVxyXG5odHRwczovLzguOC40LjQvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh0dHBzOi8vOS45LjkuOS9kbnMtcXVlcnkgKFF1YWQ5KVxyXG5odHRwczovLzQ1LjkwLjI4LjE2MC9kbnMtcXVlcnkgKE5leHRETlMpXHJcbmh0dHBzOi8vNDUuOTAuMzAuMTYwL2Rucy1xdWVyeSAoTmV4dEROUylcclxuaHR0cHM6Ly8xNDkuMTEyLjExMi4xMTIvZG5zLXF1ZXJ5IChRdWFkOSlcclxuaHR0cHM6Ly85LjkuOS4xMS9kbnMtcXVlcnkgKFF1YWQ5KVxyXG5odHRwczovLzEuMS4xLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5odHRwczovLzEuMC4wLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5odHRwczovLzE0OS4xMTIuMTEyLjExL2Rucy1xdWVyeSAoUXVhZDkpXHJcbi0tRW5kIERvSCBBZGRyZXNzZXMtLVxyXG5cclxuVGhlIGJhY2tkb29yIHJlbGllcyBvbiBpbnRlcm5hbCwgbG93LWxldmVsIGZ1bmN0aW9uIGNhbGxzIGZyb20gYSBjdXN0b20gR28gcGFja2FnZSB0byBoYW5kbGUgaXRzIG5ldHdvcmsgY29ubmVjdGlvbnMgYW5kIGNvbW1hbmQgcHJvY2Vzc2luZy4gVGhlIGJhY2tkb29yIHVzZXMgRG9IIHRvIHJlc29sdmUgdGhlIGFkZHJlc3NlcyBvZiBpdHMgQzIgc2VydmVycy4gVGhlIGJhY2tkb29yIGNyZWF0ZXMgYSBETlMgcXVlcnkgZm9yIHRoZSBtYWxpY2lvdXMgQzIgZG9tYWluIFwiW3JlZGFjdGVkXS5jb21cIi4gVGhlIGJhY2tkb29yIGVuY3J5cHRzIHRoaXMgcXVlcnkgYnkgZW5jYXBzdWxhdGluZyBpdCB3aXRoaW4gYSBzdGFuZGFyZCBIVFRQUyByZXF1ZXN0LiBUaGUgYmFja2Rvb3Igc2VuZHMgdGhlIGVuY3J5cHRlZCBIVFRQUyByZXF1ZXN0IHRvIGEgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIG9wZXJhdGVkIGJ5IENsb3VkZmxhcmUsIEdvb2dsZSwgUXVhZDkgb3IgTmV4dEROUyB0byBwcm9jZXNzIHRoZSBxdWVyeS4gQW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIHJlcXVlc3RlZCBkb21haW4gaXMgbm90IGZvdW5kIGluIHRoZSBwdWJsaWMgRG9IIHJlc29sdmVyIGNhY2hlLCB0aGUgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIGZvcndhcmRzIHRoZSByZXF1ZXN0IHRvIHRoZSBuZXh0IHNlcnZlciBpbiB0aGUgRE5TIGhpZXJhcmNoeSwgdWx0aW1hdGVseSByZWFjaGluZyB0aGUgVEEncyBETlMgc2VydmVyLCB3aGljaCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIgZm9yIHRoZSBtYWxpY2lvdXMgZG9tYWluLiBUaGUgVEEncyBETlMgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBjb3JyZWN0IElQIGFkZHJlc3MgZm9yIHRoZSBDMiBkb21haW4sIGFuZCB0aGlzIHJlc3BvbnNlIGlzIHNlbnQgYmFjayB0aHJvdWdoIHRoZSBsZWdpdGltYXRlIERvSCByZXNvbHZlciB0byB0aGUgYmFja2Rvb3IuIFRoZSBiYWNrZG9vciByZWNlaXZlcyB0aGUgZW5jcnlwdGVkIHJlc3BvbnNlLCBkZWNyeXB0cyBpdCB0byBnZXQgdGhlIEMyIHNlcnZlcidzIElQIGFkZHJlc3MsIGFuZCBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24uXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBtdWx0aXBsZSBsYXllcnMgb2YgZW5jcnlwdGlvbiBmb3IgaXRzIEMyIGNvbW11bmljYXRpb25zLiBUaGUgYmFja2Rvb3IgY29tbXVuaWNhdGVzIG92ZXIgSFRUUFMgdG8gdGhlIGNsb3VkIHBsYXRmb3JtIChcImh0dHBzOi8vW3JlZGFjdGVkXS5jb21cIiksIHRoZW4gdXBncmFkZXMgdGhlc2Ugc2Vzc2lvbnMgdG8gV2ViU29ja2V0cyB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgVExTIGVuY3J5cHRpb24uIFRoZSBiYWNrZG9vciBzZW5kcyBIVFRQIHVwZ3JhZGUgcmVxdWVzdCB0byBjb252ZXJ0IHRoZSBpbml0aWFsIGVuY3J5cHRlZCBIVFRQUyBjb25uZWN0aW9uIGludG8gYSBwZXJzaXN0ZW50IFdlYlNvY2tldCBjb25uZWN0aW9uOiBcIndzczovL1tyZWRhY3RlZF0uY29tL2Nsc1wiLiBUaGUgYmFja2Rvb3IgbmVzdHMgYWRkaXRpb25hbCBsYXllcnMgb2YgVExTIGVuY3J5cHRpb24gd2l0aGluIHRoZSBXZWJTb2NrZXQgc2Vzc2lvbi4gVGhlIGJhY2tkb29yIHBlcmZvcm1zIGEgc2VyaWVzIG9mIG5lc3RlZCBUTFMgaGFuZHNoYWtlcyB3aXRoaW4gdGhlIGVzdGFibGlzaGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoZSBmaXJzdCBUTFMgaGFuZHNoYWtlIGlzIHRoZSBzdGFuZGFyZCBUTFMgaGFuZHNoYWtlIGZvciB0aGUgaW5pdGlhbCBIVFRQUyByZXF1ZXN0IHRvIHRoZSBjbG91ZCBwbGF0Zm9ybS4gQSBzZWNvbmQgVExTIGhhbmRzaGFrZSBvY2N1cnMgd2l0aGluIHRoZSBXZWJTb2NrZXQgdHVubmVsLiBEdXJpbmcgdGhpcyBzdGVwLCB0aGUgYmFja2Rvb3IgYXV0aGVudGljYXRlcyBpdHNlbGYgdG8gdGhlIEMyIHNlcnZlciB1c2luZyBhIHN0YXRpYyBhdXRoZW50aWNhdGlvbiBrZXk6IFwiaGtpZ2JMS0hSX1BieTZ0NlBcIi4gQW4gaW5uZXJtb3N0IFRMUyBsYXllciBlbmNyeXB0cyB0aGUgYWN0dWFsIEMyIGNvbW1hbmRzIGFuZCBkYXRhLCBzZWN1cmluZyB0aGVtIGV2ZW4gaWYgdGhlIG91dGVyIGxheWVycyBhcmUgYnlwYXNzZWQgb3IgZGVjcnlwdGVkLiBUaGUgYmFja2Rvb3IgdXNlcyB0aGUgXCJIYXNoaUNvcnAgWWFtdXhcIiBsaWJyYXJ5IHRvIGNyZWF0ZSBtdWx0aXBsZSBzdHJlYW1zIHdpdGhpbiBhIHNpbmdsZSBpbm5lcm1vc3QgVExTLWVuY3J5cHRlZCBXZWJTb2NrZXQgdHVubmVsLiBUaGlzIG1ldGhvZCBtYWtlcyB0aGUgVEEncyBhY3Rpdml0aWVzIGRpZmZpY3VsdCB0byBkZXRlY3QsIGFzIG11bHRpcGxlIGNvbW1hbmRzIGFuZCBuZXR3b3JrIHR1bm5lbHMgYXJlIG11bHRpcGxleGVkIGFuZCBoaWRkZW4gd2l0aGluIGEgc2luZ2xlLCBlbmNyeXB0ZWQgbmV0d29yayBzdHJlYW0uXHJcblxyXG5BZnRlciBlc3RhYmxpc2hpbmcgYSBzZWN1cmUgYW5kIGNvdmVydCBjb25uZWN0aW9uLCB0aGUgYmFja2Rvb3IgbGV2ZXJhZ2VzIGl0cyBvYmZ1c2NhdGVkIGNvcmUgXCJ0YXNrLkRvVGFza1wiICgvY29yZS90YXNrLkRvVGFzaykgZnVuY3Rpb24gYW5kIGZvdXIgb2JmdXNjYXRlZCBleHRlbnNpb25zIChtb2R1bGVzKSBcInNvY2tzLlNvY2tzXCIsIFwid2ViLldlYlNlcnZpY2VcIiwgXCJjb21tYW5kLkNvbW1hbmRcIiwgYW5kIFwiY29tbWFuZC5Db21tYW5kTm9Db250ZXh0XCIuIFRoZXNlIGV4dGVuc2lvbnMgZGVmaW5lIHRoZSBtYWxpY2lvdXMgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBiYWNrZG9vciBzaG91bGQgZXhlY3V0ZSwgYWxsb3dpbmcgdGhlIFRBIHRvIGNhcnJ5IG91dCB2YXJpb3VzIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW1zLiBUaGVzZSBtb2R1bGVzIGVuYWJsZSBDMiBjb21tdW5pY2F0aW9uLCBsYXRlcmFsIG1vdmVtZW50LCBhbmQgY29tbWFuZCBleGVjdXRpb24gb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS5cclxuXHJcbkRpc3BsYXllZCBiZWxvdyBhcmUgdGhlIGZvdXIgZXh0ZW5zaW9ucyBhbmQgdGhlaXIgZnVuY3Rpb25zOlxyXG5cclxuLS1CZWdpbiBFeHRlbnNpb25zLS1cclxuYS4gVGhlIFNvY2tzIGV4dGVuc2lvbiBlbmFibGVzIG5ldHdvcmsgdHVubmVsaW5nIHRocm91Z2ggYSBTT0NLUyBwcm94eSwgd2hpY2ggZmFjaWxpdGF0ZXMgbGF0ZXJhbCBtb3ZlbWVudCB3aXRoaW4gYSBjb21wcm9taXNlZCBuZXR3b3JrIGFuZCByb3V0ZXMgQzIgdHJhZmZpYy5cclxuXHJcbmIuIFRoZSBXZWJTZXJ2aWNlIGV4dGVuc2lvbiBtb2R1bGUgZXN0YWJsaXNoZXMgY292ZXJ0IEMyIGNvbW11bmljYXRpb24gYnkgbWFraW5nIHRoZSBiYWNrZG9vciBhcHBlYXIgYXMgYSBsZWdpdGltYXRlIHdlYiBzZXJ2ZXIuIFRoZSBleHRlbnNpb24gdXNlcyB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGxldmVyYWdpbmcgdGhlIFwibmV0L2h0dHAgcGFja2FnZVwiIGFuZCBcImdvcmlsbGEvbXV4XCIgbGlicmFyeSwgdG8gY3JlYXRlIGEgd2ViIHNlcnZlciBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBBIGRlZGljYXRlZCBBUEkgXCIvYXBpL1wiIGVuZHBvaW50IGlzIGNyZWF0ZWQgdG8gcmVjZWl2ZSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlci4gVGhpcyBwcm92aWRlcyB0aGUgVEEgd2l0aCBleHRlbnNpdmUgY29udHJvbCBvdmVyIHRoZSB2aWN0aW0ncyBmaWxlIHN5c3RlbSwgYWxsb3dpbmcgdGhlIFRBIHRvIGJyb3dzZSwgdmlldywgY3JlYXRlLCBkZWxldGUsIHVwbG9hZCwgYW5kIGRvd25sb2FkIGZpbGVzIGFuZCBmb2xkZXJzLiBUbyBibGVuZCBpbiBhbmQgZXZhZGUgZGV0ZWN0aW9uLCB0aGUgYmFja2Rvb3Igc2VydmVzIHN0YXRpYyB3ZWIgZmlsZXMgKEhUTUwsIENTUywgSmF2YVNjcmlwdCkgZnJvbSBhIGRlc2lnbmF0ZWQgZGlyZWN0b3J5LiBUaGlzIG1ha2VzIHRoZSBtYWxpY2lvdXMgd2ViIHNlcnZlciBhcHBlYXIgdG8gYmUgYSBzdGFuZGFyZCB3ZWIgYXBwbGljYXRpb24uXHJcblxyXG5jLiBUaGUgQ29tbWFuZCBleHRlbnNpb24gZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRoIGEgc3BlY2lmaWMgc2VjdXJpdHkgY29udGV4dC5cclxuXHJcbmQuIFRoZSBDb21tYW5kTm9Db250ZXh0IGV4dGVuc2lvbiBleGVjdXRlcyBjb21tYW5kcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtIHdpdGhvdXQgdXNpbmcgYW4gZXhwbGljaXQgc2VjdXJpdHkgY29udGV4dC5cclxuLS1FbmQgRXh0ZW5zaW9ucy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgbWFpbnRhaW5zIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIHRvIHRoZSBDMiBzZXJ2ZXIgdW5sZXNzIGEgc3BlY2lmaWMgdGVybWluYXRpb24gY29tbWFuZCBpcyByZWNlaXZlZCBvciB0aGUgQzIgc2VydmVyIHRlcm1pbmF0ZXMgdGhlIGNvbm5lY3Rpb24uIiwKICAgICAgICAgICAgImluZGljYXRvcl90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJtYWxpY2lvdXMtYWN0aXZpdHkiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJwYXR0ZXJuIjogIiAnbmFtZXNwYWNlJz0nQ0lTQV9Db25zb2xpZGF0ZWQueWFyYScgcnVsZV9uYW1lPUNJU0FfMjUxMTU1XzAyIHJ1bGVfY29udGVudD1ydWxlIENJU0FfMjUxMTU1XzAyIDogQlJJQ0tTVE9STSBiYWNrZG9vciBpbnN0YWxsc19vdGhlcl9jb21wb25lbnRzIGNvbW11bmljYXRlc193aXRoX2MyIGV4ZmlsdHJhdGVzX2RhdGFcbntcbiAgIG1ldGE6XG4gICAgICAgYXV0aG9yID0gXCJDSVNBIENvZGUgJiBNZWRpYSBBbmFseXNpc1wiXG4gICAgICAgaW5jaWRlbnQgPSBcIjI1MTE1NVwiXG4gICAgICAgZGF0ZSA9IFwiMjAyNS0wOS0xNVwiXG4gICAgICAgbGFzdF9tb2RpZmllZCA9IFwiMjAyNTA5MTZfMTUxMVwiXG4gICAgICAgYWN0b3IgPSBcIm4vYVwiXG4gICAgICAgZmFtaWx5ID0gXCJCUklDS1NUT1JNXCJcbiAgICAgICBjYXBhYmlsaXRpZXMgPSBcImluc3RhbGxzLW90aGVyLWNvbXBvbmVudHMgY29tbXVuaWNhdGVzLXdpdGgtYzIgZXhmaWx0cmF0ZXMtZGF0YVwiXG4gICAgICAgbWFsd2FyZV90eXBlID0gXCJiYWNrZG9vclwiXG4gICAgICAgdG9vbF90eXBlID0gXCJ1bmtub3duXCJcbiAgICAgICBkZXNjcmlwdGlvbiA9IFwiRGV0ZWN0cyBHby1CYXNlZCBCUklDS1NUT1JNIGJhY2tkb29yIHNhbXBsZXNcIlxuICAgICAgIHNoYTI1Nl8xID0gXCIzMjBhMGI1ZDQ5MDA2OTdlMTI1Y2ViYjVmZjAzZGVlNzM2OGY4ZjA4N2RiMWMxNTcwYjBiNjJmNWE5ODZkNzU5XCJcbiAgICAgICBzaGEyNTZfMSA9IFwiZGZhYzI1NDJhMGVlNjVjNDc0YjkxZDNiMzUyNTQwYTI0ZjRlMjIzZjFiODA4Yjc0MWNmZTY4MDI2M2YwZWU0NFwiXG4gICAgICAgc2hhMjU2XzEgPSBcImI5MTg4MWNiMWFhODYxMTM4ZjIwNjNlYzEzMGIyYjAxYThhYWYwZTNmMDQ5MjFlNWNiZmM2MWIwOTAyNGJmMTJcIlxuICAgICAgIHNoYTI1Nl8xID0gXCJiZmIzZmZkNDZiMjFiMjI4MTM3NGNkNjBiYzc1NmZlMmRjYzMyNDg2ZGNjMTU2YzliZDk4ZjI0MTAxMTQ1NDU0XCJcbiAgIHN0cmluZ3M6XG4gICAgICAgJHMwID0geyAwNCAzMCAwRiBCNiA1NCAwNCAyQyAzMSBEMSA4OCA0QyAwNCAzNCA0OCBGRiBDMCB9XG4gICAgICAgJHMxID0geyA0OCA4MyBGOCAwNCA3QyBFNyA0OCBDNyAwNCAyNCB9XG4gICAgICAgJHMyID0geyA0OCA4RCA0NCAyNCAzNCA0OCA4OSA0NCAyNCAwOCA0OCBDNyA0NCAyNCAxMCAwNCB9XG4gICAgICAgJHMzID0geyA0OCA4OSA0NCAyNCA0OCA0OCA4OSA0QyAyNCA1MCA0OCA4QiA2QyAyNCAzOCA0OCB9XG4gICAgICAgJHM0ID0geyA0OCA4MyBFQyA0MCA0OCA4OSA2QyAyNCAzOCA0OCA4RCA2QyAyNCAzOCBDNyA0NCAyNCB9XG4gICAgICAgJHM1ID0geyA4MyBFQyAzOCA0OCA4OSA2QyAyNCAzMCA0OCA4RCA2QyAyNCAzMCBDNiA0NCAyNCB9XG4gICAgICAgJHM2ID0geyA0QyAyNCAyMCA0OCA4OSA0NCAyNCA0MCA0OCA4OSA0QyAyNCA0OCA0OCA4QiA2QyB9XG4gICAgICAgJHM3ID0geyA2NCA0OCA4QiAwQyAyNSBGOCBGRiBGRiBGRiA0OCAzQiA2MSAxMCAwRiA4NiA4MSB9XG4gICAgICAgJHM4ID0geyA2NCA0OCA4QiAwQyAyNSBGOCBGRiBGRiBGRiA0OCAzQiA2MSAxMCAwRiA4NiA5MSB9XG4gICBjb25kaXRpb246XG4gICAgICBhbGwgb2YgdGhlbVxufVxuIiwKICAgICAgICAgICAgInBhdHRlcm5fdHlwZSI6ICJ5YXJhIiwKICAgICAgICAgICAgInZhbGlkX2Zyb20iOiAiMjAyNS0xMi0wMlQxNjowNzoyMy42OTkzMDhaIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJtYWx3YXJlLWFuYWx5c2lzIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAibWFsd2FyZS1hbmFseXNpcy0tMmE4OTFhZWItNDYyMy00Yjc3LWE3OTQtNTgxN2IzZjlmN2I5IiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS04ZTExMmU3Mi1hYThmLTQxOTAtYTM1OS0yOGE5YWJhZTI4OTYiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgInByb2R1Y3QiOiAiZXNldCIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInJlc3VsdF9uYW1lIjogImEgdmFyaWFudCBvZiBMaW51eC9Ccmlja1N0b3JtLkEgdHJvamFuIiwKICAgICAgICAgICAgInJlc3VsdCI6ICJ1bmtub3duIiwKICAgICAgICAgICAgInNhbXBsZV9yZWYiOiAiZmlsZS0tYmVlZGI0ZjUtZDBiMy01ODIyLTgyZjMtZTA5ZTYzNmJmMGFmIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJtYWx3YXJlIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAibWFsd2FyZS0tZjhmYTdiMGYtY2NiYS00YTZmLWE5YmEtOWFlZjI5Njg4NWE2IiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS04ZTExMmU3Mi1hYThmLTQxOTAtYTM1OS0yOGE5YWJhZTI4OTYiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBhcnRpZmFjdCBpcyBhIG1hbGljaW91cyA2NC1iaXQgRUxGIGV4ZWN1dGFibGUgd3JpdHRlbiBpbiB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFRoZSBiaW5hcnkgaGFzIGJlZW4gaWRlbnRpZmllZCBhcyBhIGJhY2tkb29yIHZhcmlhbnQgbmFtZWQgQlJJQ0tTVE9STSB0aGF0IHVzZXMgc2V2ZXJhbCBhZHZhbmNlZCB0ZWNobmlxdWVzIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIHVzZXMgU09DS1MgcHJveHlpbmcsIG11bHRpLWxheWVyZWQgd2ViIHNlcnZpY2UgY29tbXVuaWNhdGlvbiwgYW5kIHZhcmllZCBjb21tYW5kIGV4ZWN1dGlvbiB0byBvYnNjdXJlIGl0cyBhY3Rpdml0aWVzLiBUaGUgYmFja2Rvb3IgY29tYmluZXMgc2V2ZXJhbCBzb3BoaXN0aWNhdGVkIHRlY2huaXF1ZXMsIGluY2x1ZGluZyBEb0gsIG5lc3RlZCBUTFMgZW5jcnlwdGlvbiwgYW5kIHRoZSBhYnVzZSBvZiBhIGxlZ2l0aW1hdGUgY2xvdWQgc2VydmljZSB0byBldmFkZSBkZXRlY3Rpb24uIFRoZSBiYWNrZG9vciBjb250YWlucyB0aGUgYXV0aGVudGljYXRpb24ga2V5LCBIVFRQUyBhbmQgV2ViU29ja2V0IGFkZHJlc3NlcyBhcyBwYXJ0IG9mIGl0cyBzb3BoaXN0aWNhdGVkLCBtdWx0aS1sYXllcmVkIEMyIGV2YXNpb24gdGVjaG5pcXVlLlxyXG5cclxuLS1CZWdpbiBFbGVtZW50cy0tXHJcbmhraWdiTEtIUl9QYnk2dDZQID09PiBhdXRoZW50aWNhdGlvbiBrZXlcclxuaHR0cHM6Ly9bcmVkYWN0ZWRdLmNvbSA9PT4gSFRUUFMgYWRkcmVzc1xyXG53c3M6Ly9bcmVkYWN0ZWRdLmNvbS9jbHMgPT0+IFdlYlNvY2tldCBhZGRyZXNzXHJcbi0tRW5kIEVsZW1lbnRzLS1cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIFhPUiBjaXBoZXIgZW5jcnlwdGlvbiB0byBoaWRlIGtleSBzdHJpbmdzLCBzdWNoIGFzIGl0cyBJUHY0IGFkZHJlc3NlcyBvZiBwdWJsaWMgRG9IIHNlcnZlcnMgYW5kIG90aGVyIHN0cmluZ3Mgd2l0aGluIGl0cyBjb2RlLiBVcG9uIGV4ZWN1dGlvbiwgdGhlIGJhY2tkb29yIGluaXRpYXRlcyB0aGUgb2JmdXNjYXRlZCBmdW5jdGlvbiBcIm1haW5fc3RhcnROZXdcIiB0byBjb25maWd1cmUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGUgYmFja2Rvb3IgdGhlbiBjaGVja3MgZm9yIHRoZSBcIltyZWRhY3RlZF1ORVQ2XCIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHJ1bm5pbmcgYXMgYSBjaGlsZCBwcm9jZXNzLiBJZiBcIltyZWRhY3RlZF1ORVQ2XCIgaXMgbm90IHNldCwgaW5kaWNhdGluZyBub3QgYSBjaGlsZCBwcm9jZXNzLCB0aGUgYmFja2Rvb3IgdmVyaWZpZXMgaXRzIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGggYnkgYXR0ZW1wdGluZyB0byBsb2FkIHRoZSBmaWxlIGNvbnRlbnRzIGZyb20gXCIvZXRjL3N5c2NvbmZpZy92aW9jbGlcIi4gSWYgbm90IHJ1bm5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCBcIi9ldGMvc3lzY29uZmlnL3Zpb2NsaVwiLCB0aGUgYmFja2Rvb3IgdGVybWluYXRlcyBpdHMgY29kZSBleGVjdXRpb24uIElmIHRoZSBiYWNrZG9vciBleGVjdXRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgdGhlIGJhY2tkb29yIGNvcGllcyBpdHNlbGYgdG8gXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vdXBkYXRlbWdyXCIuIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL1wiIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBlbnN1cmluZyB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIHRha2VzIHByZWNlZGVuY2UgaW4gZXhlY3V0aW9uLiBUaGUgYmFja2Rvb3IgZXhlY3V0ZXMgdGhlIGNvcGllZCBiYWNrZG9vciBuYW1lZCBcInVwZGF0ZW1nclwiIGR1ZSB0byB0aGUgUEFUSCBtb2RpZmljYXRpb24gYW5kIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24uIElmIFwiW3JlZGFjdGVkXU5FVDZcIiBpcyBzZXQsIGluZGljYXRpbmcgYSBjaGlsZCBwcm9jZXNzLCB0aGUgYmFja2Rvb3IgY29udGludWVzIGl0cyBtYWluIGNvZGUgZXhlY3V0aW9uLiBBcyBwYXJ0IG9mIHRoaXMgY29udGludWVkIGV4ZWN1dGlvbiwgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBiYWNrZG9vciBhdCBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIiBpcyBkZWxldGVkLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgdGhlIG9iZnVzY2F0ZWQgZnVuY3Rpb24gXCJtYWluX3NlbGZXYXRjaGVyXCIgdG8gZW5zdXJlIGl0cyBjb250aW51ZWQgb3BlcmF0aW9uIGFuZCBtYWludGFpbiBwZXJzaXN0ZW5jZSBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBUaGlzIHNlbGYtcHJlc2VydmF0aW9uIG1lY2hhbmlzbSBjaGVja3MgaWYgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgYW4gaW50ZW5kZWQgcHJvY2VzcyBhbmQsIGlmIG5vdCwgdGhlIGJhY2tkb29yIHJlLWluc3RhbGxzIGFuZCByZS1leGVjdXRlcyBpdHNlbGYuIFRoZSBcIm1haW5fc2VsZldhdGNoZXJcIiBmdW5jdGlvbiBmaXJzdCBjaGVja3MgZm9yIHRoZSBcIltyZWRhY3RlZF1ORVQ1XCIgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGNvbmZpcm1zIHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9jZXNzIG5hbWVkIFwidXBkYXRlbWdyXCIuIElmIHRoZSBjaGVja3MgcmV0dXJuIGEgXCJmYWxzZVwiIHZhbHVlLCBpbmRpY2F0aW5nXCJbcmVkYWN0ZWRdTkVUNVwiIGlzIG5vdCBzZXQsIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBpdHNlbGYgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3Zpb2NsaVwiIHRvIGEgbmV3IGxvY2F0aW9uOiBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgZmlsZSBcInVwZGF0ZW1nclwiIGlzIGV4ZWN1dGVkLiBUaGUgcGFyZW50IGJhY2tkb29yIHRoZW4gdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbiwgYWxsb3dpbmcgdGhlIG5ldyBwcm9jZXNzIHRvIGNvbnRpbnVlIHJ1bm5pbmcuIElmIHRoZSBpbml0aWFsIGNoZWNrcyBjb25maXJtIHRoYXQgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgaW50ZW5kZWQsIGluZGljYXRpbmcgXCJbcmVkYWN0ZWRdTkVUNVwiIGlzIHNldCwgdGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgYW4gWE9SIG9wZXJhdGlvbiB0byBkZWNyeXB0IHRoZSBJUHY0IGFkZHJlc3NlcyBmb3IgdGhlIERvSCBzZXJ2ZXJzIGJlbG93OlxyXG5cclxuLS1CZWdpbiBEb0ggQWRkcmVzc2VzLS1cclxuaHR0cHM6Ly84LjguOC44L2Rucy1xdWVyeSAoR29vZ2xlKVxyXG5odHRwczovLzguOC40LjQvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh0dHBzOi8vOS45LjkuOS9kbnMtcXVlcnkgKFF1YWQ5KVxyXG5odHRwczovLzQ1LjkwLjI4LjE2MC9kbnMtcXVlcnkgKE5leHRETlMpXHJcbmh0dHBzOi8vNDUuOTAuMzAuMTYwL2Rucy1xdWVyeSAoTmV4dEROUylcclxuaHR0cHM6Ly8xNDkuMTEyLjExMi4xMTIvZG5zLXF1ZXJ5IChRdWFkOSlcclxuaHR0cHM6Ly85LjkuOS4xMS9kbnMtcXVlcnkgKFF1YWQ5KVxyXG5odHRwczovLzEuMS4xLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5odHRwczovLzEuMC4wLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5odHRwczovLzE0OS4xMTIuMTEyLjExL2Rucy1xdWVyeSAoUXVhZDkpXHJcbi0tRW5kIERvSCBBZGRyZXNzZXMtLVxyXG5cclxuVGhlIGJhY2tkb29yIHJlbGllcyBvbiBpbnRlcm5hbCwgbG93LWxldmVsIGZ1bmN0aW9uIGNhbGxzIGZyb20gYSBjdXN0b20gR28gcGFja2FnZSB0byBoYW5kbGUgaXRzIG5ldHdvcmsgY29ubmVjdGlvbnMgYW5kIGNvbW1hbmQgcHJvY2Vzc2luZy4gVGhlIGJhY2tkb29yIHVzZXMgRG9IIHRvIHJlc29sdmUgdGhlIGFkZHJlc3NlcyBvZiBpdHMgQzIgc2VydmVycy4gVGhlIGJhY2tkb29yIGNyZWF0ZXMgYSBETlMgcXVlcnkgZm9yIHRoZSBtYWxpY2lvdXMgQzIgZG9tYWluIFwiW3JlZGFjdGVkXS5jb21cIi4gVGhlIGJhY2tkb29yIGVuY3J5cHRzIHRoaXMgcXVlcnkgYnkgZW5jYXBzdWxhdGluZyBpdCB3aXRoaW4gYSBzdGFuZGFyZCBIVFRQUyByZXF1ZXN0LiBUaGUgYmFja2Rvb3Igc2VuZHMgdGhlIGVuY3J5cHRlZCBIVFRQUyByZXF1ZXN0IHRvIGEgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIG9wZXJhdGVkIGJ5IENsb3VkZmxhcmUsIEdvb2dsZSwgUXVhZDkgb3IgTmV4dEROUyB0byBwcm9jZXNzIHRoZSBxdWVyeS4gQW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIHJlcXVlc3RlZCBkb21haW4gaXMgbm90IGZvdW5kIGluIHRoZSBwdWJsaWMgRG9IIHJlc29sdmVyIGNhY2hlLCB0aGUgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIGZvcndhcmRzIHRoZSByZXF1ZXN0IHRvIHRoZSBuZXh0IHNlcnZlciBpbiB0aGUgRE5TIGhpZXJhcmNoeSwgdWx0aW1hdGVseSByZWFjaGluZyB0aGUgVEEncyBETlMgc2VydmVyLCB3aGljaCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIgZm9yIHRoZSBtYWxpY2lvdXMgZG9tYWluLiBUaGUgVEEncyBETlMgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBjb3JyZWN0IElQIGFkZHJlc3MgZm9yIHRoZSBDMiBkb21haW4sIGFuZCB0aGlzIHJlc3BvbnNlIGlzIHNlbnQgYmFjayB0aHJvdWdoIHRoZSBsZWdpdGltYXRlIERvSCByZXNvbHZlciB0byB0aGUgYmFja2Rvb3IuIFRoZSBiYWNrZG9vciByZWNlaXZlcyB0aGUgZW5jcnlwdGVkIHJlc3BvbnNlLCBkZWNyeXB0cyBpdCB0byBnZXQgdGhlIEMyIHNlcnZlcidzIElQIGFkZHJlc3MsIGFuZCBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24uXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBtdWx0aXBsZSBsYXllcnMgb2YgZW5jcnlwdGlvbiBmb3IgaXRzIEMyIGNvbW11bmljYXRpb25zLiBUaGUgYmFja2Rvb3IgY29tbXVuaWNhdGVzIG92ZXIgSFRUUFMgdG8gdGhlIGNsb3VkIHBsYXRmb3JtIChcImh0dHBzOi8vW3JlZGFjdGVkXS5jb21cIiksIHRoZW4gdXBncmFkZXMgdGhlc2Ugc2Vzc2lvbnMgdG8gV2ViU29ja2V0cyB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgVExTIGVuY3J5cHRpb24uIFRoZSBiYWNrZG9vciBzZW5kcyBIVFRQIHVwZ3JhZGUgcmVxdWVzdCB0byBjb252ZXJ0IHRoZSBpbml0aWFsIGVuY3J5cHRlZCBIVFRQUyBjb25uZWN0aW9uIGludG8gYSBwZXJzaXN0ZW50IFdlYlNvY2tldCBjb25uZWN0aW9uOiBcIndzczovL1tyZWRhY3RlZF0uY29tL2Nsc1wiLiBUaGUgYmFja2Rvb3IgbmVzdHMgYWRkaXRpb25hbCBsYXllcnMgb2YgVExTIGVuY3J5cHRpb24gd2l0aGluIHRoZSBXZWJTb2NrZXQgc2Vzc2lvbi4gVGhlIGJhY2tkb29yIHBlcmZvcm1zIGEgc2VyaWVzIG9mIG5lc3RlZCBUTFMgaGFuZHNoYWtlcyB3aXRoaW4gdGhlIGVzdGFibGlzaGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoZSBmaXJzdCBUTFMgaGFuZHNoYWtlIGlzIHRoZSBzdGFuZGFyZCBUTFMgaGFuZHNoYWtlIGZvciB0aGUgaW5pdGlhbCBIVFRQUyByZXF1ZXN0IHRvIHRoZSBjbG91ZCBwbGF0Zm9ybS4gQSBzZWNvbmQgVExTIGhhbmRzaGFrZSBvY2N1cnMgd2l0aGluIHRoZSBXZWJTb2NrZXQgdHVubmVsLiBEdXJpbmcgdGhpcyBzdGVwLCB0aGUgYmFja2Rvb3IgYXV0aGVudGljYXRlcyBpdHNlbGYgdG8gdGhlIEMyIHNlcnZlciB1c2luZyBhIHN0YXRpYyBhdXRoZW50aWNhdGlvbiBrZXk6IFwiaGtpZ2JMS0hSX1BieTZ0NlBcIi4gQW4gaW5uZXJtb3N0IFRMUyBsYXllciBlbmNyeXB0cyB0aGUgYWN0dWFsIEMyIGNvbW1hbmRzIGFuZCBkYXRhLCBzZWN1cmluZyB0aGVtIGV2ZW4gaWYgdGhlIG91dGVyIGxheWVycyBhcmUgYnlwYXNzZWQgb3IgZGVjcnlwdGVkLiBUaGUgYmFja2Rvb3IgdXNlcyB0aGUgXCJIYXNoaUNvcnAgWWFtdXhcIiBsaWJyYXJ5IHRvIGNyZWF0ZSBtdWx0aXBsZSBzdHJlYW1zIHdpdGhpbiBhIHNpbmdsZSBpbm5lcm1vc3QgVExTLWVuY3J5cHRlZCBXZWJTb2NrZXQgdHVubmVsLiBUaGlzIG1ldGhvZCBtYWtlcyB0aGUgVEEncyBhY3Rpdml0aWVzIGRpZmZpY3VsdCB0byBkZXRlY3QsIGFzIG11bHRpcGxlIGNvbW1hbmRzIGFuZCBuZXR3b3JrIHR1bm5lbHMgYXJlIG11bHRpcGxleGVkIGFuZCBoaWRkZW4gd2l0aGluIGEgc2luZ2xlLCBlbmNyeXB0ZWQgbmV0d29yayBzdHJlYW0uXHJcblxyXG5BZnRlciBlc3RhYmxpc2hpbmcgYSBzZWN1cmUgYW5kIGNvdmVydCBjb25uZWN0aW9uLCB0aGUgYmFja2Rvb3IgbGV2ZXJhZ2VzIGl0cyBvYmZ1c2NhdGVkIGNvcmUgXCJ0YXNrLkRvVGFza1wiICgvY29yZS90YXNrLkRvVGFzaykgZnVuY3Rpb24gYW5kIGZvdXIgb2JmdXNjYXRlZCBleHRlbnNpb25zIChtb2R1bGVzKSBcInNvY2tzLlNvY2tzXCIsIFwid2ViLldlYlNlcnZpY2VcIiwgXCJjb21tYW5kLkNvbW1hbmRcIiwgYW5kIFwiY29tbWFuZC5Db21tYW5kTm9Db250ZXh0XCIuIFRoZXNlIGV4dGVuc2lvbnMgZGVmaW5lIHRoZSBtYWxpY2lvdXMgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBiYWNrZG9vciBzaG91bGQgZXhlY3V0ZSwgYWxsb3dpbmcgdGhlIFRBIHRvIGNhcnJ5IG91dCB2YXJpb3VzIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW1zLiBUaGVzZSBtb2R1bGVzIGVuYWJsZSBDMiBjb21tdW5pY2F0aW9uLCBsYXRlcmFsIG1vdmVtZW50LCBhbmQgY29tbWFuZCBleGVjdXRpb24gb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS5cclxuXHJcbkRpc3BsYXllZCBiZWxvdyBhcmUgdGhlIGZvdXIgZXh0ZW5zaW9ucyBhbmQgdGhlaXIgZnVuY3Rpb25zOlxyXG5cclxuLS1CZWdpbiBFeHRlbnNpb25zLS1cclxuYS4gVGhlIFNvY2tzIGV4dGVuc2lvbiBlbmFibGVzIG5ldHdvcmsgdHVubmVsaW5nIHRocm91Z2ggYSBTT0NLUyBwcm94eSwgd2hpY2ggZmFjaWxpdGF0ZXMgbGF0ZXJhbCBtb3ZlbWVudCB3aXRoaW4gYSBjb21wcm9taXNlZCBuZXR3b3JrIGFuZCByb3V0ZXMgQzIgdHJhZmZpYy5cclxuXHJcbmIuIFRoZSBXZWJTZXJ2aWNlIGV4dGVuc2lvbiBtb2R1bGUgZXN0YWJsaXNoZXMgY292ZXJ0IEMyIGNvbW11bmljYXRpb24gYnkgbWFraW5nIHRoZSBiYWNrZG9vciBhcHBlYXIgYXMgYSBsZWdpdGltYXRlIHdlYiBzZXJ2ZXIuIFRoZSBleHRlbnNpb24gdXNlcyB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGxldmVyYWdpbmcgdGhlIFwibmV0L2h0dHAgcGFja2FnZVwiIGFuZCBcImdvcmlsbGEvbXV4XCIgbGlicmFyeSwgdG8gY3JlYXRlIGEgd2ViIHNlcnZlciBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBBIGRlZGljYXRlZCBBUEkgXCIvYXBpL1wiIGVuZHBvaW50IGlzIGNyZWF0ZWQgdG8gcmVjZWl2ZSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlci4gVGhpcyBwcm92aWRlcyB0aGUgVEEgd2l0aCBleHRlbnNpdmUgY29udHJvbCBvdmVyIHRoZSB2aWN0aW0ncyBmaWxlIHN5c3RlbSwgYWxsb3dpbmcgdGhlIFRBIHRvIGJyb3dzZSwgdmlldywgY3JlYXRlLCBkZWxldGUsIHVwbG9hZCwgYW5kIGRvd25sb2FkIGZpbGVzIGFuZCBmb2xkZXJzLiBUbyBibGVuZCBpbiBhbmQgZXZhZGUgZGV0ZWN0aW9uLCB0aGUgYmFja2Rvb3Igc2VydmVzIHN0YXRpYyB3ZWIgZmlsZXMgKEhUTUwsIENTUywgSmF2YVNjcmlwdCkgZnJvbSBhIGRlc2lnbmF0ZWQgZGlyZWN0b3J5LiBUaGlzIG1ha2VzIHRoZSBtYWxpY2lvdXMgd2ViIHNlcnZlciBhcHBlYXIgdG8gYmUgYSBzdGFuZGFyZCB3ZWIgYXBwbGljYXRpb24uXHJcblxyXG5jLiBUaGUgQ29tbWFuZCBleHRlbnNpb24gZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRoIGEgc3BlY2lmaWMgc2VjdXJpdHkgY29udGV4dC5cclxuXHJcbmQuIFRoZSBDb21tYW5kTm9Db250ZXh0IGV4dGVuc2lvbiBleGVjdXRlcyBjb21tYW5kcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtIHdpdGhvdXQgdXNpbmcgYW4gZXhwbGljaXQgc2VjdXJpdHkgY29udGV4dC5cclxuLS1FbmQgRXh0ZW5zaW9ucy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgbWFpbnRhaW5zIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIHRvIHRoZSBDMiBzZXJ2ZXIgdW5sZXNzIGEgc3BlY2lmaWMgdGVybWluYXRpb24gY29tbWFuZCBpcyByZWNlaXZlZCBvciB0aGUgQzIgc2VydmVyIHRlcm1pbmF0ZXMgdGhlIGNvbm5lY3Rpb24uIiwKICAgICAgICAgICAgIm1hbHdhcmVfdHlwZXMiOiBbCiAgICAgICAgICAgICAgICAidHJvamFuIiwKICAgICAgICAgICAgICAgICJiYWNrZG9vciIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImlzX2ZhbWlseSI6IGZhbHNlLAogICAgICAgICAgICAic2FtcGxlX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAiZmlsZS0tYmVlZGI0ZjUtZDBiMy01ODIyLTgyZjMtZTA5ZTYzNmJmMGFmIgogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogImluZGljYXRvciIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImluZGljYXRvci0tNDRiZDYyN2YtMGE1YS00MmNmLWE3N2MtYzY0OGIzNmFhZWQ2IiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS04ZTExMmU3Mi1hYThmLTQxOTAtYTM1OS0yOGE5YWJhZTI4OTYiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm5hbWUiOiAiYjNiNmE5OTI1NDBkYTk2Mzc1ZTQ3ODFhZmQzMDUyMTE4YWQ5N2NmZTYwY2NmMDA0ZDczMmY3NjY3OGY2ODIwYSIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluZGljYXRvcl90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJtYWxpY2lvdXMtYWN0aXZpdHkiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJwYXR0ZXJuIjogIltmaWxlOmhhc2hlcy4nTUQ1Jz0nMGE0ZmE1MjgwM2EzODkzMTFhOWRkYzQ5YjdiMTkxMzgnIE9SIGZpbGU6aGFzaGVzLidTSEEtMSc9Jzk3MDAxYmFhYTM3OWJjZDgzNjc3ZGNhN2JjNWI4MDQ4ZmRmYWFkZGMnIE9SIGZpbGU6aGFzaGVzLidTSEEtMjU2Jz0nYjNiNmE5OTI1NDBkYTk2Mzc1ZTQ3ODFhZmQzMDUyMTE4YWQ5N2NmZTYwY2NmMDA0ZDczMmY3NjY3OGY2ODIwYScgT1IgZmlsZTpoYXNoZXMuJ1NIQS01MTInPSc2NWViZjVkZmFmYjg5NzJmZmVhZDQ0MjcxNDM2ZWM4NDI1MTdjZmFhZjNkMWYxZjEyMzdhMzJkNjZlMWQyODA5NDNiZDNhNjlmMWQ1MzlhMWI3YWNhNjE1MmU5NmIyOWJjODIyZTEwNDdlMjI0M2Y2YWVjODk1OTU5NTU2MDE0NyddIiwKICAgICAgICAgICAgInBhdHRlcm5fdHlwZSI6ICJzdGl4IiwKICAgICAgICAgICAgInBhdHRlcm5fdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAidmFsaWRfZnJvbSI6ICIyMDI1LTEyLTAyVDE2OjA3OjIzLjcwMzY3OVoiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJmaWxlLS1lYTM2Njc4Yy0wNTc1LTU5NjgtOTkxYy0xMDRkMTVhMzE1NWYiLAogICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgIk1ENSI6ICJkYmNhMjhhZDQyMDQwODg1MGE5NGQ1YzMyNTE4M2IyOCIsCiAgICAgICAgICAgICAgICAiU0hBLTEiOiAiZmIxMWM2Y2FhNGVhODQ0OTQyZmU5N2Y0NmQ3ZWI0MmJjNzY5MTFhYiIsCiAgICAgICAgICAgICAgICAiU0hBLTI1NiI6ICI1N2JkOThkYmI1YTAwZTU0ZjA3ZmZhY2RhMWZlYTkxNDUxYTBjMGI1MzJjZDdkNTcwZTk4Y2UyZmY3NDFjMjFkIiwKICAgICAgICAgICAgICAgICJTSEEtNTEyIjogIjY1OTIwNWZhMmNmYTg1ZTQ4NGMwOTFjYzJlODVhN2VjNGUzMzJiMTk2ZTQyM2IxZjM5YmFmZGM4ZmNhMzNlM2RiNzEyYmJlMDdhZmNjMDkxZmYyNmQ5YjRmNjQxZmE5YTczZjJhNjZkY2U5YTBjZWQ1NGViZWI4YzJiZTgyYTdmIiwKICAgICAgICAgICAgICAgICJTU0RFRVAiOiAiOTgzMDQ6ZHpCMDZiMEtYNE1uYitzSmYrQWpCekgzTUY0bTFkNFUyVHVBSjVWR1kzZ2xrblRTazJuSDpkRlFLSXNKQkJ6WE11bTgzUko1VkdZM2dTMm5IIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic2l6ZSI6IDE1NTExNzAwLAogICAgICAgICAgICAibmFtZSI6ICI1N2JkOThkYmI1YTAwZTU0ZjA3ZmZhY2RhMWZlYTkxNDUxYTBjMGI1MzJjZDdkNTcwZTk4Y2UyZmY3NDFjMjFkIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogImluZGljYXRvciIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImluZGljYXRvci0tNGQyYTRhZWEtZDBjNi00MWUyLWJjNmEtY2M4ZjU3MzY3ZWNmIiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS04ZTExMmU3Mi1hYThmLTQxOTAtYTM1OS0yOGE5YWJhZTI4OTYiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm5hbWUiOiAiNTdiZDk4ZGJiNWEwMGU1NGYwN2ZmYWNkYTFmZWE5MTQ1MWEwYzBiNTMyY2Q3ZDU3MGU5OGNlMmZmNzQxYzIxZCIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgYXJ0aWZhY3QgaXMgYSBtYWxpY2lvdXMgNjQtYml0IEVMRiBleGVjdXRhYmxlIHdyaXR0ZW4gaW4gdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLiBUaGUgYmluYXJ5IGhhcyBiZWVuIGlkZW50aWZpZWQgYXMgYSBiYWNrZG9vciB2YXJpYW50IG5hbWVkIEJSSUNLU1RPUk0gdGhhdCB1c2VzIHNldmVyYWwgYWR2YW5jZWQgdGVjaG5pcXVlcyB0byBldmFkZSBkZXRlY3Rpb24uIFRoZSBiYWNrZG9vciB1c2VzIFNPQ0tTIHByb3h5aW5nLCBtdWx0aS1sYXllcmVkIHdlYiBzZXJ2aWNlIGNvbW11bmljYXRpb24sIGFuZCB2YXJpZWQgY29tbWFuZCBleGVjdXRpb24gdG8gb2JzY3VyZSBpdHMgYWN0aXZpdGllcy4gVGhlIGJhY2tkb29yIGNvbWJpbmVzIHNldmVyYWwgc29waGlzdGljYXRlZCB0ZWNobmlxdWVzLCBpbmNsdWRpbmcgRG9ILCBuZXN0ZWQgVExTIGVuY3J5cHRpb24sIGFuZCB0aGUgYWJ1c2Ugb2YgYSBsZWdpdGltYXRlIGNsb3VkIHNlcnZpY2UgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgY29udGFpbnMgdGhlIGF1dGhlbnRpY2F0aW9uIGtleSwgSFRUUFMgYW5kIFdlYlNvY2tldCBhZGRyZXNzZXMgYXMgcGFydCBvZiBpdHMgc29waGlzdGljYXRlZCwgbXVsdGktbGF5ZXJlZCBDMiBldmFzaW9uIHRlY2huaXF1ZS5cclxuXHJcbi0tQmVnaW4gRWxlbWVudHMtLVxyXG5cIm9zMjM1dGZnXzJ5czg3Mm8uZHJvc29cIiA9PT4gYXV0aGVudGljYXRpb24ga2V5XHJcblwiaHh4cHNbOl0vL1tyZWRhY3RlZF0uZGV2XCIgPT0+IEhUVFBTIGFkZHJlc3MgZ2VuZXJhdGVkXHJcblwid3NzOi8vW3JlZGFjdGVkXS5kZXYvdXBkYXRlXCIgPT0+IFdlYlNvY2tldCBhZGRyZXNzXHJcbi0tRW5kIEVsZW1lbnRzLS1cclxuXHJcblRoZSBiYWNrZG9vciBrZXkgc3RyaW5ncywgc3VjaCBhcyBpdHMgSVB2NCBhZGRyZXNzZXMgb2YgcHVibGljIERvSCBzZXJ2ZXJzIGFuZCBvdGhlciBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZSBhcmUgZW5jcnlwdGVkLiBUaGUgYmFja2Rvb3Igc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZ1bmN0aW9uIG5hbWVzIGFuZCB2YXJpYWJsZSBuYW1lcywgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBleGVjdXRhYmxlIHRvIGV2YWRlIGRldGVjdGlvbiBhbmQgaGluZGVyIGFuYWx5c2lzLiBcclxuXHJcblVwb24gZXhlY3V0aW9uLCB0aGUgYmFja2Rvb3IgZGVjcnlwdHMgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIHRvIGdhaW4gcHJpdmlsZWdlZCBhY2Nlc3MsIGhpZGUgaXRzIG9wZXJhdGlvbnMsIGFuZCBjb21tYW5kcyBleGVjdXRpb24uIFRoZSBiYWNrZG9vciB0aGVuIGNoZWNrcyBmb3IgdGhlIFwiQ1plUE1lR2pcIiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgcnVubmluZyBhcyBhIGNoaWxkIHByb2Nlc3MuIElmIFwiQ1plUE1lR2pcIiBpcyBub3Qgc2V0LCBpbmRpY2F0aW5nIG5vdCBhIGNoaWxkIHByb2Nlc3MsIHRoZSBiYWNrZG9vciB2ZXJpZmllcyBpdHMgY3VycmVudCBleGVjdXRpb24gcGF0aCBieSBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlIGZpbGUgY29udGVudHMgZnJvbSBcIi9ldGMvc3lzY29uZmlnL25ldHdvcmsvaWYtdXBcIi4gSWYgbm90IHJ1bm5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCBcIi9ldGMvc3lzY29uZmlnL25ldHdvcmsvaWYtdXBcIiwgdGhlIGJhY2tkb29yIHRlcm1pbmF0ZXMgaXRzIGNvZGUgZXhlY3V0aW9uLiBJZiB0aGUgYmFja2Rvb3IgZXhlY3V0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgdGhlIGJhY2tkb29yIGNvcGllcyBpdHNlbGYgdG8gXCIvZXRjL2FwcGxtZ210L2FwcGxpYW5jZS92YW1pXCIuIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIFwiL2V0Yy9hcHBsbWdtdC9hcHBsaWFuY2UvXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGVuc3VyaW5nIHRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgdGFrZXMgcHJlY2VkZW5jZSBpbiBleGVjdXRpb24uIFRoZSBiYWNrZG9vciBleGVjdXRlcyB0aGUgY29waWVkIGJhY2tkb29yIG5hbWVkIFwidmFtaVwiIGR1ZSB0byB0aGUgUEFUSCBtb2RpZmljYXRpb24gYW5kIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24uIElmIFwiQ1plUE1lR2pcIiBpcyBzZXQsIGluZGljYXRpbmcgYSBjaGlsZCBwcm9jZXNzLCB0aGUgYmFja2Rvb3IgY29udGludWVzIGl0cyBtYWluIGNvZGUgZXhlY3V0aW9uLiBBcyBwYXJ0IG9mIHRoaXMgY29udGludWVkIGV4ZWN1dGlvbiwgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBiYWNrZG9vciBhdCBcIi9ldGMvYXBwbG1nbXQvYXBwbGlhbmNlL3ZhbWlcIiBpcyBkZWxldGVkLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgYSBmdW5jdGlvbiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgdGhlIFwicmNNSlZGXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGNvbmZpcm1zIHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9jZXNzIG5hbWVkIFwidmFtaVwiLiBJZiB0aGUgY2hlY2tzIHJldHVybiBhIFwiZmFsc2VcIiB2YWx1ZSAoXCJyY01KVkZcIiBpcyBub3Qgc2V0ICksIGluZGljYXRpbmcgdGhlIGJhY2tkb29yIGlzIG5vdCBydW5uaW5nIGNvcnJlY3RseSwgdGhlIGJhY2tkb29yIHJlaW5zdGFsbHMgaXRzZWxmIGZyb20gXCIvZXRjL3N5c2NvbmZpZy9uZXR3b3JrL2lmLXVwXCIgdG8gYSBuZXcgbG9jYXRpb246IFwiL2V0Yy9hcHBsbWdtdC9hcHBsaWFuY2UvdmFtaVwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi9ldGMvYXBwbG1nbXQvYXBwbGlhbmNlL1wiIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIGZpbGUgXCJ2YW1pXCIgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyBcInJjTUpWRlwiIGlzIHNldCwgdGhlIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLiBUaGUgYmFja2Rvb3IgY29uZmlndXJlcyBpdHMgc2VydmljZSBieSBkaXNhYmxpbmcgaXRzIGxvZ2dlciBhbmQgc2V0dGluZyB0d28gZGlmZmVyZW50IHNsZWVwIHRpbWUgcGFyYW1ldGVycy4gVGhlIHByb2dyYW0gdXRpbGl6ZXMgcHVibGljIERvSCBzZXJ2ZXJzIHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvbnMuXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHNhbXBsZSBEb0ggc2VydmVycyB1dGlsaXplZCBieSB0aGUgYmFja2Rvb3I6XHJcblxyXG4tLS1CZWdpbiBEb0ggQWRkcmVzc2VzLS0tXHJcbmh4eHBzWzpdLy8xLjAuMC4xL2Rucy1xdWVyeSAoQ2xvdWRmbGFyZSlcclxuaHh4cHNbOl0vLzEuMS4xLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5oeHhwc1s6XS8vOC44LjQuNC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHh4cHNbOl0vLzguOC44LjgvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh4eHBzWzpdLy85LjkuOS45L2Rucy1xdWVyeSAoUXVhZDkpXHJcbi0tLUVuZCBEb0ggQWRkcmVzc2VzLS0tXHJcblxyXG5UaGUgYmFja2Rvb3IgcmVsaWVzIG9uIGludGVybmFsLCBsb3ctbGV2ZWwgZnVuY3Rpb24gY2FsbHMgZnJvbSBhIGN1c3RvbSBHbyBwYWNrYWdlIHRvIGhhbmRsZSBpdHMgbmV0d29yayBjb25uZWN0aW9ucyBhbmQgY29tbWFuZCBwcm9jZXNzaW5nLiBUaGUgYmFja2Rvb3IgdXNlcyBEb0ggdG8gcmVzb2x2ZSB0aGUgYWRkcmVzc2VzIG9mIGl0cyBDMiBzZXJ2ZXJzLiBUaGUgYmFja2Rvb3IgY3JlYXRlcyBhIEROUyBxdWVyeSBmb3IgdGhlIEMyIGRvbWFpbiBcIltyZWRhY3RlZF0uZGV2XCIuIFRoZSBiYWNrZG9vciBlbmNyeXB0cyB0aGlzIHF1ZXJ5IGJ5IGVuY2Fwc3VsYXRpbmcgaXQgd2l0aGluIGEgc3RhbmRhcmQgSFRUUFMgcmVxdWVzdC4gVGhlIGJhY2tkb29yIHNlbmRzIHRoZSBlbmNyeXB0ZWQgSFRUUFMgcmVxdWVzdCB0byBhIGxlZ2l0aW1hdGUgcHVibGljIERvSCByZXNvbHZlciBvcGVyYXRlZCBieSBDbG91ZGZsYXJlLCBHb29nbGUsIG9yIFF1YWQ5IHRvIHByb2Nlc3MgdGhlIHF1ZXJ5LiBBbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBpZiB0aGUgcmVxdWVzdGVkIGRvbWFpbiBpcyBub3QgZm91bmQgaW4gdGhlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgY2FjaGUsIHRoZSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgZm9yd2FyZHMgdGhlIHJlcXVlc3QgdG8gdGhlIG5leHQgc2VydmVyIGluIHRoZSBETlMgaGllcmFyY2h5LCB1bHRpbWF0ZWx5IHJlYWNoaW5nIHRoZSBUQSdzIEROUyBzZXJ2ZXIsIHdoaWNoIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNlcnZlciBmb3IgdGhlIG1hbGljaW91cyBkb21haW4uIFRoZSBUQSdzIEROUyBzZXJ2ZXIgd2lsbCByZXNwb25kIHdpdGggdGhlIGNvcnJlY3QgSVAgYWRkcmVzcyBmb3IgdGhlIEMyIGRvbWFpbiwgYW5kIHRoaXMgcmVzcG9uc2UgaXMgc2VudCBiYWNrIHRocm91Z2ggdGhlIGxlZ2l0aW1hdGUgRG9IIHJlc29sdmVyIHRvIHRoZSBiYWNrZG9vci4gVGhlIGJhY2tkb29yIHJlY2VpdmVzIHRoZSBlbmNyeXB0ZWQgcmVzcG9uc2UsIGRlY3J5cHRzIGl0IHRvIGdldCB0aGUgQzIgc2VydmVyJ3MgSVAgYWRkcmVzcywgYW5kIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbi5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIG11bHRpcGxlIGxheWVycyBvZiBlbmNyeXB0aW9uIGZvciBpdHMgQzIgY29tbXVuaWNhdGlvbnMuIFRoZSBiYWNrZG9vciBjb21tdW5pY2F0ZXMgb3ZlciBIVFRQUyB0byB0aGUgY2xvdWQgcGxhdGZvcm0gKFwiaHh4cHNbOl0vL1tyZWRhY3RlZF1kZXZcIiksIHRoZW4gdXBncmFkZXMgdGhlc2Ugc2Vzc2lvbnMgdG8gV2ViU29ja2V0cyB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgVExTIGVuY3J5cHRpb24uIFRoZSBiYWNrZG9vciBzZW5kcyBIVFRQIHVwZ3JhZGUgcmVxdWVzdCB0byBjb252ZXJ0IHRoZSBpbml0aWFsIGVuY3J5cHRlZCBIVFRQUyBjb25uZWN0aW9uIGludG8gYSBwZXJzaXN0ZW50IFdlYlNvY2tldCBjb25uZWN0aW9uOiBcIndzczovL1tyZWRhY3RlZF0uZGV2L3VwZGF0ZVwiLiBUaGUgYmFja2Rvb3IgbmVzdHMgYWRkaXRpb25hbCBsYXllcnMgb2YgVExTIGVuY3J5cHRpb24gd2l0aGluIHRoZSBXZWJTb2NrZXQgc2Vzc2lvbi4gVGhlIGJhY2tkb29yIHBlcmZvcm1zIGEgc2VyaWVzIG9mIG5lc3RlZCBUTFMgaGFuZHNoYWtlcyB3aXRoaW4gdGhlIGVzdGFibGlzaGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoZSBmaXJzdCBUTFMgaGFuZHNoYWtlIGlzIHRoZSBzdGFuZGFyZCBUTFMgaGFuZHNoYWtlIGZvciB0aGUgaW5pdGlhbCBIVFRQUyByZXF1ZXN0IHRvIHRoZSBDbG91ZGZsYXJlIHBsYXRmb3JtLiBBIHNlY29uZCBUTFMgaGFuZHNoYWtlIG9jY3VycyB3aXRoaW4gdGhlIFdlYlNvY2tldCB0dW5uZWwuIER1cmluZyB0aGlzIHN0ZXAsIHRoZSBiYWNrZG9vciBhdXRoZW50aWNhdGVzIGl0c2VsZiB0byB0aGUgQzIgc2VydmVyIHVzaW5nIGEgc3RhdGljIGF1dGhlbnRpY2F0aW9uIGtleTogXCJvczIzNXRmZ18yeXM4NzJvLmRyb3NvXCIuIElmIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSBiYWNrZG9vciBwcm9jZWVkcyB0byBzZXQgdXAgdGhlIG11bHRpcGxleGluZyBsYXllci4gVGhlIGJhY2tkb29yIGhhbmRsZXMgYm90aCBTaW1wbGUgTXVsdGlwbGV4aW5nIChzbXV4KSBhbmQgWWV0IEFub3RoZXIgTXVsdGlwbGV4ZXIgKFlhbXV4KSBsaWJyYXJpZXMgdG8gY3JlYXRlIHZpcnR1YWwgc3RyZWFtcyBvdmVyIGEgc2luZ2xlIHVuZGVybHlpbmcgVExTLXNlY3VyZWQgY29ubmVjdGlvbiBiYXNlZCBvbiBjbGllbnQgY29uZmlndXJhdGlvbiBvciBoYW5kc2hha2UgZGF0YS4gVGhpcyBtZXRob2QgbWFrZXMgdGhlIFRBJ3MgYWN0aXZpdGllcyBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBhcyBtdWx0aXBsZSBjb21tYW5kcyBhbmQgbmV0d29yayB0dW5uZWxzIGFyZSBtdWx0aXBsZXhlZCBhbmQgaGlkZGVuIHdpdGhpbiBhIHNpbmdsZSwgZW5jcnlwdGVkIG5ldHdvcmsgc3RyZWFtLlxyXG5cclxuT25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBDMiBzZXJ2ZXIgdmlhIFdlYlNvY2tldHMsIHRoZSBiYWNrZG9vciByZWNlaXZlcyBjb21tYW5kcyB0aGF0IGFyZSBkaXJlY3RlZCB0byBzcGVjaWZpYyBoYW5kbGVycyB0byBwZXJmb3JtIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBmb3VyIGNvcmUgaGFuZGxlcnMgYW5kIHRoZWlyIGZ1bmN0aW9uczpcclxuXHJcbi0tQmVnaW4gQ29yZSBIYW5kbGVycy0tXHJcbmEuIFRoZSBTb2NrcyBoYW5kbGVyIGVzdGFibGlzaGVzIGEgU09DS1MgcmVsYXksIHdoaWNoIGZhY2lsaXRhdGVzIGxhdGVyYWwgbW92ZW1lbnQgd2l0aGluIGEgY29tcHJvbWlzZWQgbmV0d29yayBhbmQgcm91dGVzIEMyIHRyYWZmaWMgKEZpZ3VyZSAyKS4gVGhpcyBoYW5kbGVyIGlzIGEgU09DS1MgcHJveHkgaGFuZGxlciB0aGF0IGF0dGVtcHRzIHRvIHBhcnNlIGluY29taW5nIHJlcXVlc3RzIGFzIEpTT04tZm9ybWF0dGVkIFNPQ0tTIGFyZ3VtZW50cy4gRGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9mIHRoaXMgcGFyc2luZywgaXQgZWl0aGVyIHJlc3BvbmRzIHdpdGggYW4gZXJyb3Igb3IgZGVsZWdhdGVzIHRoZSBoYW5kbGluZyB0byBhIFNPQ0tTIGhhbmRsaW5nIG1lY2hhbmlzbSBcIndzc29mdDIvY29yZS9oYW5kbGVyL1xyXG5zb2Nrcy5Tb2Nrc1dpdGhMb2NhbEFkZHJcIiAoc29ja3MuU29ja3NXaXRoTG9jYWxBZGRyKS4gVGhlIGhhbmRsZXIgXCJzb2Nrcy5Tb2Nrc1dpdGhMb2NhbEFkZHJcIiBwZXJmb3JtcyBTT0NLUyByZWxheWluZyBhbmQgbmV0d29yayB0dW5uZWxpbmcgb3ZlciBUQ1AsIFVEUCwgYW5kIElDTVAuXHJcblxyXG5iLiBUaGUgV2ViU2VydmljZSBoYW5kbGVyIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyIChGaWd1cmUgMykuIFRoZSBoYW5kbGVyIHVzZXMgdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLCBsZXZlcmFnaW5nIHRoZSBcIm5ldC9odHRwIHBhY2thZ2VcIiBhbmQgXCJnb3JpbGxhL211eFwiIGxpYnJhcnksIHRvIGNyZWF0ZSBhIHdlYiBzZXJ2ZXIgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gQSBkZWRpY2F0ZWQgQVBJIFwiL2FwaS9cIiBlbmRwb2ludCBpcyBjcmVhdGVkIHRvIHJlY2VpdmUgYW5kIGV4ZWN1dGUgY29tbWFuZHMgZnJvbSB0aGUgVEEncyBDMiBzZXJ2ZXIgKEZpZ3VyZSA1KS4gVGhpcyBwcm92aWRlcyB0aGUgVEEgd2l0aCBleHRlbnNpdmUgY29udHJvbCBvdmVyIHRoZSB2aWN0aW0ncyBmaWxlIHN5c3RlbSwgYWxsb3dpbmcgdGhlIFRBIHRvIGJyb3dzZSwgdmlldywgY3JlYXRlLCBkZWxldGUsIHVwbG9hZCwgYW5kIGRvd25sb2FkIGZpbGVzIGFuZCBmb2xkZXJzLiBUbyBibGVuZCBpbiBhbmQgZXZhZGUgZGV0ZWN0aW9uLCB0aGUgYmFja2Rvb3Igc2VydmVzIHN0YXRpYyB3ZWIgZmlsZXMgSFRNTCwgQ1NTLCBKYXZhU2NyaXB0IGZyb20gYSBkZXNpZ25hdGVkIGRpcmVjdG9yeS4gVGhpcyBtYWtlcyB0aGUgbWFsaWNpb3VzIHdlYiBzZXJ2ZXIgYXBwZWFyIHRvIGJlIGEgc3RhbmRhcmQgd2ViIGFwcGxpY2F0aW9uLlxyXG5cclxuYy4gVGhlIENvbW1hbmQgaGFuZGxlciBleGVjdXRlcyBzaGVsbCBjb21tYW5kcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtIHdpdGggYSBzcGVjaWZpYyBzZWN1cml0eSBjb250ZXh0LCBncmFudGluZyB0aGUgVEEgaW50ZXJhY3RpdmUgY29tbWFuZC1saW5lIGFjY2Vzcy4gVGhlIGhhbmRsZXIgaW5pdGlhdGVzIGEgcmVxdWVzdCB0aHJvdWdoIGl0cyBjb3ZlcnQgY29tbXVuaWNhdGlvbiBjaGFubmVscywgcGFyc2UgYSBKU09OIHBheWxvYWQgaW50byB0aGUgYSBzcGVjaWZpYyBzdHJ1Y3R1cmUsIGV4dHJhY3RzIGFuZCBleGVjdXRlcyBhbiBleHRlcm5hbCBjb21tYW5kLCBzcGVjaWZpY2FsbHkgZXN0YWJsaXNoaW5nIGEgcHNldWRvLXRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gaXQsIGVuYWJsaW5nIGludGVyYWN0aXZlIGNvbnRyb2wgYW5kIGRhdGEgZXhjaGFuZ2Ugd2l0aCB0aGUgcnVubmluZyAgY29tbWFuZC5cclxuXHJcbmQuIFRoZSBDb21tYW5kTm9Db250ZXh0IGhhbmRsZXIgZXhlY3V0ZXMgc2hlbGwgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRob3V0IHVzaW5nIGFuIGV4cGxpY2l0IHNlY3VyaXR5IGNvbnRleHQuIFxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS0iLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiICduYW1lc3BhY2UnPSdDSVNBX0NvbnNvbGlkYXRlZC55YXJhJyBydWxlX25hbWU9Q0lTQV8yNTExODZfMDIgcnVsZV9jb250ZW50PXJ1bGUgQ0lTQV8yNTExODZfMDIgOiBCUklDS1NUT1JNIGJhY2tkb29yIGluc3RhbGxzX290aGVyX2NvbXBvbmVudHMgY29tbXVuaWNhdGVzX3dpdGhfYzIgZXhmaWx0cmF0ZXNfZGF0YVxue1xuICAgbWV0YTpcbiAgICAgICBhdXRob3IgPSBcIkNJU0EgQ29kZSAmIE1lZGlhIEFuYWx5c2lzXCJcbiAgICAgICBpbmNpZGVudCA9IFwiMjUxMTg2XCJcbiAgICAgICBkYXRlID0gXCIyMDI1LTExLTE3XCJcbiAgICAgICBsYXN0X21vZGlmaWVkID0gXCJuL2FcIlxuICAgICAgIGFjdG9yID0gXCJuL2FcIlxuICAgICAgIGZhbWlseSA9IFwiQlJJQ0tTVE9STVwiXG4gICAgICAgY2FwYWJpbGl0aWVzID0gXCJpbnN0YWxscy1vdGhlci1jb21wb25lbnRzIGNvbW11bmljYXRlcy13aXRoLWMyIGV4ZmlsdHJhdGVzLWRhdGFcIlxuICAgICAgIG1hbHdhcmVfdHlwZSA9IFwiYmFja2Rvb3JcIlxuICAgICAgIHRvb2xfdHlwZSA9IFwidW5rbm93blwiXG4gICAgICAgZGVzY3JpcHRpb24gPSBcIkRldGVjdHMgR28tQmFzZWQgQlJJQ0tTVE9STSBiYWNrZG9vciBzYW1wbGVzXCJcbiAgICAgICBzaGEyNTZfMSA9IFwiNTdiZDk4ZGJiNWEwMGU1NGYwN2ZmYWNkYTFmZWE5MTQ1MWEwYzBiNTMyY2Q3ZDU3MGU5OGNlMmZmNzQxYzIxZFwiXG4gICBzdHJpbmdzOlxuICAgICAgICRzMCA9IHsgMzEgRjcgNDAgODggN0MgMDQgNEMgNDggRkYgQzAgfVxuICAgICAgICRzMSA9IHsgNDQgMDEgQzcgNDAgODggN0MgMTQgMzAgNDggRkYgQzIgMEYgMUYgMDAgfVxuICAgICAgICRzMiA9IHsgNDEgODkgRjAgMzEgRkUgMDEgRDYgNjYgOTAgNDkgODMgRjggMTEgIH1cbiAgICAgICAkczMgPSB7IDQ4IDhCIDQ0IDI0IDA4IDQ4IDhCIDVDIDI0IDEwIDQ4IDhCIDRDIDI0IDE4ICB9XG4gICAgICAgJHM0ID0geyA0OCA4OSBDMSA0OCA4OSBERiA0OCA4RCAwNSAwRiA2RiAxNSAwMH1cbiAgICAgICAkczUgPSB7IDQ4IDhEIDNEIDlBIDZEIDE1IDAwIDREIDg5IEMxIDQ5IDg5IEYwIH1cbiAgICAgICAkczYgPSB7IDgxIDM5IDQ5IDQzIDREIDUwIDc0IDBDICB9XG4gICAgICAgJHM3ID0geyBFOCBGQiBFNiBGRiBGRiBFOCA3NiBEMCBGRiBGRiBFOCA5MSBDMCBGRiBGRiA0OCA4QiAwNSBFQSBCRiA1M31cbiAgIGNvbmRpdGlvbjpcbiAgICAgIGFsbCBvZiB0aGVtXG59XG4iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInlhcmEiLAogICAgICAgICAgICAidmFsaWRfZnJvbSI6ICIyMDI1LTEyLTAyVDE2OjA3OjIzLjcyODI5NFoiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUtYW5hbHlzaXMiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLWFuYWx5c2lzLS04ZjA0ZmZiNy1kMjI4LTQzMmYtYjAzNC02MzRhMzI1YzczNTMiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAicHJvZHVjdCI6ICJlc2V0IiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicmVzdWx0X25hbWUiOiAiYSB2YXJpYW50IG9mIExpbnV4L1BhY2tlZC5PYmZ1c2NhdGVkLkIgc3VzcGljaW91cyBhcHBsaWNhdGlvbiIsCiAgICAgICAgICAgICJyZXN1bHQiOiAidW5rbm93biIsCiAgICAgICAgICAgICJzYW1wbGVfcmVmIjogImZpbGUtLWVhMzY2NzhjLTA1NzUtNTk2OC05OTFjLTEwNGQxNWEzMTU1ZiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAibWFsd2FyZSIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogIm1hbHdhcmUtLTQwMzA3YTI1LWM2NTAtNDMyYS05OGMyLTVlMjE2MmNjOWQ5MyIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgYXJ0aWZhY3QgaXMgYSBtYWxpY2lvdXMgNjQtYml0IEVMRiBleGVjdXRhYmxlIHdyaXR0ZW4gaW4gdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLiBUaGUgYmluYXJ5IGhhcyBiZWVuIGlkZW50aWZpZWQgYXMgYSBiYWNrZG9vciB2YXJpYW50IG5hbWVkIEJSSUNLU1RPUk0gdGhhdCB1c2VzIHNldmVyYWwgYWR2YW5jZWQgdGVjaG5pcXVlcyB0byBldmFkZSBkZXRlY3Rpb24uIFRoZSBiYWNrZG9vciB1c2VzIFNPQ0tTIHByb3h5aW5nLCBtdWx0aS1sYXllcmVkIHdlYiBzZXJ2aWNlIGNvbW11bmljYXRpb24sIGFuZCB2YXJpZWQgY29tbWFuZCBleGVjdXRpb24gdG8gb2JzY3VyZSBpdHMgYWN0aXZpdGllcy4gVGhlIGJhY2tkb29yIGNvbWJpbmVzIHNldmVyYWwgc29waGlzdGljYXRlZCB0ZWNobmlxdWVzLCBpbmNsdWRpbmcgRG9ILCBuZXN0ZWQgVExTIGVuY3J5cHRpb24sIGFuZCB0aGUgYWJ1c2Ugb2YgYSBsZWdpdGltYXRlIGNsb3VkIHNlcnZpY2UgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgY29udGFpbnMgdGhlIGF1dGhlbnRpY2F0aW9uIGtleSwgSFRUUFMgYW5kIFdlYlNvY2tldCBhZGRyZXNzZXMgYXMgcGFydCBvZiBpdHMgc29waGlzdGljYXRlZCwgbXVsdGktbGF5ZXJlZCBDMiBldmFzaW9uIHRlY2huaXF1ZS5cclxuXHJcbi0tQmVnaW4gRWxlbWVudHMtLVxyXG5cIm9zMjM1dGZnXzJ5czg3Mm8uZHJvc29cIiA9PT4gYXV0aGVudGljYXRpb24ga2V5XHJcblwiaHh4cHNbOl0vL1tyZWRhY3RlZF0uZGV2XCIgPT0+IEhUVFBTIGFkZHJlc3MgZ2VuZXJhdGVkXHJcblwid3NzOi8vW3JlZGFjdGVkXS5kZXYvdXBkYXRlXCIgPT0+IFdlYlNvY2tldCBhZGRyZXNzXHJcbi0tRW5kIEVsZW1lbnRzLS1cclxuXHJcblRoZSBiYWNrZG9vciBrZXkgc3RyaW5ncywgc3VjaCBhcyBpdHMgSVB2NCBhZGRyZXNzZXMgb2YgcHVibGljIERvSCBzZXJ2ZXJzIGFuZCBvdGhlciBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZSBhcmUgZW5jcnlwdGVkLiBUaGUgYmFja2Rvb3Igc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZ1bmN0aW9uIG5hbWVzIGFuZCB2YXJpYWJsZSBuYW1lcywgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBleGVjdXRhYmxlIHRvIGV2YWRlIGRldGVjdGlvbiBhbmQgaGluZGVyIGFuYWx5c2lzLiBcclxuXHJcblVwb24gZXhlY3V0aW9uLCB0aGUgYmFja2Rvb3IgZGVjcnlwdHMgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIHRvIGdhaW4gcHJpdmlsZWdlZCBhY2Nlc3MsIGhpZGUgaXRzIG9wZXJhdGlvbnMsIGFuZCBjb21tYW5kcyBleGVjdXRpb24uIFRoZSBiYWNrZG9vciB0aGVuIGNoZWNrcyBmb3IgdGhlIFwiQ1plUE1lR2pcIiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgcnVubmluZyBhcyBhIGNoaWxkIHByb2Nlc3MuIElmIFwiQ1plUE1lR2pcIiBpcyBub3Qgc2V0LCBpbmRpY2F0aW5nIG5vdCBhIGNoaWxkIHByb2Nlc3MsIHRoZSBiYWNrZG9vciB2ZXJpZmllcyBpdHMgY3VycmVudCBleGVjdXRpb24gcGF0aCBieSBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlIGZpbGUgY29udGVudHMgZnJvbSBcIi9ldGMvc3lzY29uZmlnL25ldHdvcmsvaWYtdXBcIi4gSWYgbm90IHJ1bm5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCBcIi9ldGMvc3lzY29uZmlnL25ldHdvcmsvaWYtdXBcIiwgdGhlIGJhY2tkb29yIHRlcm1pbmF0ZXMgaXRzIGNvZGUgZXhlY3V0aW9uLiBJZiB0aGUgYmFja2Rvb3IgZXhlY3V0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgdGhlIGJhY2tkb29yIGNvcGllcyBpdHNlbGYgdG8gXCIvZXRjL2FwcGxtZ210L2FwcGxpYW5jZS92YW1pXCIuIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIFwiL2V0Yy9hcHBsbWdtdC9hcHBsaWFuY2UvXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGVuc3VyaW5nIHRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgdGFrZXMgcHJlY2VkZW5jZSBpbiBleGVjdXRpb24uIFRoZSBiYWNrZG9vciBleGVjdXRlcyB0aGUgY29waWVkIGJhY2tkb29yIG5hbWVkIFwidmFtaVwiIGR1ZSB0byB0aGUgUEFUSCBtb2RpZmljYXRpb24gYW5kIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24uIElmIFwiQ1plUE1lR2pcIiBpcyBzZXQsIGluZGljYXRpbmcgYSBjaGlsZCBwcm9jZXNzLCB0aGUgYmFja2Rvb3IgY29udGludWVzIGl0cyBtYWluIGNvZGUgZXhlY3V0aW9uLiBBcyBwYXJ0IG9mIHRoaXMgY29udGludWVkIGV4ZWN1dGlvbiwgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBiYWNrZG9vciBhdCBcIi9ldGMvYXBwbG1nbXQvYXBwbGlhbmNlL3ZhbWlcIiBpcyBkZWxldGVkLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgYSBmdW5jdGlvbiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgdGhlIFwicmNNSlZGXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGNvbmZpcm1zIHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9jZXNzIG5hbWVkIFwidmFtaVwiLiBJZiB0aGUgY2hlY2tzIHJldHVybiBhIFwiZmFsc2VcIiB2YWx1ZSAoXCJyY01KVkZcIiBpcyBub3Qgc2V0ICksIGluZGljYXRpbmcgdGhlIGJhY2tkb29yIGlzIG5vdCBydW5uaW5nIGNvcnJlY3RseSwgdGhlIGJhY2tkb29yIHJlaW5zdGFsbHMgaXRzZWxmIGZyb20gXCIvZXRjL3N5c2NvbmZpZy9uZXR3b3JrL2lmLXVwXCIgdG8gYSBuZXcgbG9jYXRpb246IFwiL2V0Yy9hcHBsbWdtdC9hcHBsaWFuY2UvdmFtaVwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi9ldGMvYXBwbG1nbXQvYXBwbGlhbmNlL1wiIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIGZpbGUgXCJ2YW1pXCIgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyBcInJjTUpWRlwiIGlzIHNldCwgdGhlIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLiBUaGUgYmFja2Rvb3IgY29uZmlndXJlcyBpdHMgc2VydmljZSBieSBkaXNhYmxpbmcgaXRzIGxvZ2dlciBhbmQgc2V0dGluZyB0d28gZGlmZmVyZW50IHNsZWVwIHRpbWUgcGFyYW1ldGVycy4gVGhlIHByb2dyYW0gdXRpbGl6ZXMgcHVibGljIERvSCBzZXJ2ZXJzIHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvbnMuXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHNhbXBsZSBEb0ggc2VydmVycyB1dGlsaXplZCBieSB0aGUgYmFja2Rvb3I6XHJcblxyXG4tLS1CZWdpbiBEb0ggQWRkcmVzc2VzLS0tXHJcbmh4eHBzWzpdLy8xLjAuMC4xL2Rucy1xdWVyeSAoQ2xvdWRmbGFyZSlcclxuaHh4cHNbOl0vLzEuMS4xLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5oeHhwc1s6XS8vOC44LjQuNC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHh4cHNbOl0vLzguOC44LjgvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh4eHBzWzpdLy85LjkuOS45L2Rucy1xdWVyeSAoUXVhZDkpXHJcbi0tLUVuZCBEb0ggQWRkcmVzc2VzLS0tXHJcblxyXG5UaGUgYmFja2Rvb3IgcmVsaWVzIG9uIGludGVybmFsLCBsb3ctbGV2ZWwgZnVuY3Rpb24gY2FsbHMgZnJvbSBhIGN1c3RvbSBHbyBwYWNrYWdlIHRvIGhhbmRsZSBpdHMgbmV0d29yayBjb25uZWN0aW9ucyBhbmQgY29tbWFuZCBwcm9jZXNzaW5nLiBUaGUgYmFja2Rvb3IgdXNlcyBEb0ggdG8gcmVzb2x2ZSB0aGUgYWRkcmVzc2VzIG9mIGl0cyBDMiBzZXJ2ZXJzLiBUaGUgYmFja2Rvb3IgY3JlYXRlcyBhIEROUyBxdWVyeSBmb3IgdGhlIEMyIGRvbWFpbiBcIltyZWRhY3RlZF0uZGV2XCIuIFRoZSBiYWNrZG9vciBlbmNyeXB0cyB0aGlzIHF1ZXJ5IGJ5IGVuY2Fwc3VsYXRpbmcgaXQgd2l0aGluIGEgc3RhbmRhcmQgSFRUUFMgcmVxdWVzdC4gVGhlIGJhY2tkb29yIHNlbmRzIHRoZSBlbmNyeXB0ZWQgSFRUUFMgcmVxdWVzdCB0byBhIGxlZ2l0aW1hdGUgcHVibGljIERvSCByZXNvbHZlciBvcGVyYXRlZCBieSBDbG91ZGZsYXJlLCBHb29nbGUsIG9yIFF1YWQ5IHRvIHByb2Nlc3MgdGhlIHF1ZXJ5LiBBbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBpZiB0aGUgcmVxdWVzdGVkIGRvbWFpbiBpcyBub3QgZm91bmQgaW4gdGhlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgY2FjaGUsIHRoZSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgZm9yd2FyZHMgdGhlIHJlcXVlc3QgdG8gdGhlIG5leHQgc2VydmVyIGluIHRoZSBETlMgaGllcmFyY2h5LCB1bHRpbWF0ZWx5IHJlYWNoaW5nIHRoZSBUQSdzIEROUyBzZXJ2ZXIsIHdoaWNoIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNlcnZlciBmb3IgdGhlIG1hbGljaW91cyBkb21haW4uIFRoZSBUQSdzIEROUyBzZXJ2ZXIgd2lsbCByZXNwb25kIHdpdGggdGhlIGNvcnJlY3QgSVAgYWRkcmVzcyBmb3IgdGhlIEMyIGRvbWFpbiwgYW5kIHRoaXMgcmVzcG9uc2UgaXMgc2VudCBiYWNrIHRocm91Z2ggdGhlIGxlZ2l0aW1hdGUgRG9IIHJlc29sdmVyIHRvIHRoZSBiYWNrZG9vci4gVGhlIGJhY2tkb29yIHJlY2VpdmVzIHRoZSBlbmNyeXB0ZWQgcmVzcG9uc2UsIGRlY3J5cHRzIGl0IHRvIGdldCB0aGUgQzIgc2VydmVyJ3MgSVAgYWRkcmVzcywgYW5kIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbi5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIG11bHRpcGxlIGxheWVycyBvZiBlbmNyeXB0aW9uIGZvciBpdHMgQzIgY29tbXVuaWNhdGlvbnMuIFRoZSBiYWNrZG9vciBjb21tdW5pY2F0ZXMgb3ZlciBIVFRQUyB0byB0aGUgY2xvdWQgcGxhdGZvcm0gKFwiaHh4cHNbOl0vL1tyZWRhY3RlZF1kZXZcIiksIHRoZW4gdXBncmFkZXMgdGhlc2Ugc2Vzc2lvbnMgdG8gV2ViU29ja2V0cyB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgVExTIGVuY3J5cHRpb24uIFRoZSBiYWNrZG9vciBzZW5kcyBIVFRQIHVwZ3JhZGUgcmVxdWVzdCB0byBjb252ZXJ0IHRoZSBpbml0aWFsIGVuY3J5cHRlZCBIVFRQUyBjb25uZWN0aW9uIGludG8gYSBwZXJzaXN0ZW50IFdlYlNvY2tldCBjb25uZWN0aW9uOiBcIndzczovL1tyZWRhY3RlZF0uZGV2L3VwZGF0ZVwiLiBUaGUgYmFja2Rvb3IgbmVzdHMgYWRkaXRpb25hbCBsYXllcnMgb2YgVExTIGVuY3J5cHRpb24gd2l0aGluIHRoZSBXZWJTb2NrZXQgc2Vzc2lvbi4gVGhlIGJhY2tkb29yIHBlcmZvcm1zIGEgc2VyaWVzIG9mIG5lc3RlZCBUTFMgaGFuZHNoYWtlcyB3aXRoaW4gdGhlIGVzdGFibGlzaGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoZSBmaXJzdCBUTFMgaGFuZHNoYWtlIGlzIHRoZSBzdGFuZGFyZCBUTFMgaGFuZHNoYWtlIGZvciB0aGUgaW5pdGlhbCBIVFRQUyByZXF1ZXN0IHRvIHRoZSBDbG91ZGZsYXJlIHBsYXRmb3JtLiBBIHNlY29uZCBUTFMgaGFuZHNoYWtlIG9jY3VycyB3aXRoaW4gdGhlIFdlYlNvY2tldCB0dW5uZWwuIER1cmluZyB0aGlzIHN0ZXAsIHRoZSBiYWNrZG9vciBhdXRoZW50aWNhdGVzIGl0c2VsZiB0byB0aGUgQzIgc2VydmVyIHVzaW5nIGEgc3RhdGljIGF1dGhlbnRpY2F0aW9uIGtleTogXCJvczIzNXRmZ18yeXM4NzJvLmRyb3NvXCIuIElmIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSBiYWNrZG9vciBwcm9jZWVkcyB0byBzZXQgdXAgdGhlIG11bHRpcGxleGluZyBsYXllci4gVGhlIGJhY2tkb29yIGhhbmRsZXMgYm90aCBTaW1wbGUgTXVsdGlwbGV4aW5nIChzbXV4KSBhbmQgWWV0IEFub3RoZXIgTXVsdGlwbGV4ZXIgKFlhbXV4KSBsaWJyYXJpZXMgdG8gY3JlYXRlIHZpcnR1YWwgc3RyZWFtcyBvdmVyIGEgc2luZ2xlIHVuZGVybHlpbmcgVExTLXNlY3VyZWQgY29ubmVjdGlvbiBiYXNlZCBvbiBjbGllbnQgY29uZmlndXJhdGlvbiBvciBoYW5kc2hha2UgZGF0YS4gVGhpcyBtZXRob2QgbWFrZXMgdGhlIFRBJ3MgYWN0aXZpdGllcyBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBhcyBtdWx0aXBsZSBjb21tYW5kcyBhbmQgbmV0d29yayB0dW5uZWxzIGFyZSBtdWx0aXBsZXhlZCBhbmQgaGlkZGVuIHdpdGhpbiBhIHNpbmdsZSwgZW5jcnlwdGVkIG5ldHdvcmsgc3RyZWFtLlxyXG5cclxuT25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBDMiBzZXJ2ZXIgdmlhIFdlYlNvY2tldHMsIHRoZSBiYWNrZG9vciByZWNlaXZlcyBjb21tYW5kcyB0aGF0IGFyZSBkaXJlY3RlZCB0byBzcGVjaWZpYyBoYW5kbGVycyB0byBwZXJmb3JtIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBmb3VyIGNvcmUgaGFuZGxlcnMgYW5kIHRoZWlyIGZ1bmN0aW9uczpcclxuXHJcbi0tQmVnaW4gQ29yZSBIYW5kbGVycy0tXHJcbmEuIFRoZSBTb2NrcyBoYW5kbGVyIGVzdGFibGlzaGVzIGEgU09DS1MgcmVsYXksIHdoaWNoIGZhY2lsaXRhdGVzIGxhdGVyYWwgbW92ZW1lbnQgd2l0aGluIGEgY29tcHJvbWlzZWQgbmV0d29yayBhbmQgcm91dGVzIEMyIHRyYWZmaWMgKEZpZ3VyZSAyKS4gVGhpcyBoYW5kbGVyIGlzIGEgU09DS1MgcHJveHkgaGFuZGxlciB0aGF0IGF0dGVtcHRzIHRvIHBhcnNlIGluY29taW5nIHJlcXVlc3RzIGFzIEpTT04tZm9ybWF0dGVkIFNPQ0tTIGFyZ3VtZW50cy4gRGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9mIHRoaXMgcGFyc2luZywgaXQgZWl0aGVyIHJlc3BvbmRzIHdpdGggYW4gZXJyb3Igb3IgZGVsZWdhdGVzIHRoZSBoYW5kbGluZyB0byBhIFNPQ0tTIGhhbmRsaW5nIG1lY2hhbmlzbSBcIndzc29mdDIvY29yZS9oYW5kbGVyL1xyXG5zb2Nrcy5Tb2Nrc1dpdGhMb2NhbEFkZHJcIiAoc29ja3MuU29ja3NXaXRoTG9jYWxBZGRyKS4gVGhlIGhhbmRsZXIgXCJzb2Nrcy5Tb2Nrc1dpdGhMb2NhbEFkZHJcIiBwZXJmb3JtcyBTT0NLUyByZWxheWluZyBhbmQgbmV0d29yayB0dW5uZWxpbmcgb3ZlciBUQ1AsIFVEUCwgYW5kIElDTVAuXHJcblxyXG5iLiBUaGUgV2ViU2VydmljZSBoYW5kbGVyIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyIChGaWd1cmUgMykuIFRoZSBoYW5kbGVyIHVzZXMgdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLCBsZXZlcmFnaW5nIHRoZSBcIm5ldC9odHRwIHBhY2thZ2VcIiBhbmQgXCJnb3JpbGxhL211eFwiIGxpYnJhcnksIHRvIGNyZWF0ZSBhIHdlYiBzZXJ2ZXIgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gQSBkZWRpY2F0ZWQgQVBJIFwiL2FwaS9cIiBlbmRwb2ludCBpcyBjcmVhdGVkIHRvIHJlY2VpdmUgYW5kIGV4ZWN1dGUgY29tbWFuZHMgZnJvbSB0aGUgVEEncyBDMiBzZXJ2ZXIgKEZpZ3VyZSA1KS4gVGhpcyBwcm92aWRlcyB0aGUgVEEgd2l0aCBleHRlbnNpdmUgY29udHJvbCBvdmVyIHRoZSB2aWN0aW0ncyBmaWxlIHN5c3RlbSwgYWxsb3dpbmcgdGhlIFRBIHRvIGJyb3dzZSwgdmlldywgY3JlYXRlLCBkZWxldGUsIHVwbG9hZCwgYW5kIGRvd25sb2FkIGZpbGVzIGFuZCBmb2xkZXJzLiBUbyBibGVuZCBpbiBhbmQgZXZhZGUgZGV0ZWN0aW9uLCB0aGUgYmFja2Rvb3Igc2VydmVzIHN0YXRpYyB3ZWIgZmlsZXMgSFRNTCwgQ1NTLCBKYXZhU2NyaXB0IGZyb20gYSBkZXNpZ25hdGVkIGRpcmVjdG9yeS4gVGhpcyBtYWtlcyB0aGUgbWFsaWNpb3VzIHdlYiBzZXJ2ZXIgYXBwZWFyIHRvIGJlIGEgc3RhbmRhcmQgd2ViIGFwcGxpY2F0aW9uLlxyXG5cclxuYy4gVGhlIENvbW1hbmQgaGFuZGxlciBleGVjdXRlcyBzaGVsbCBjb21tYW5kcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtIHdpdGggYSBzcGVjaWZpYyBzZWN1cml0eSBjb250ZXh0LCBncmFudGluZyB0aGUgVEEgaW50ZXJhY3RpdmUgY29tbWFuZC1saW5lIGFjY2Vzcy4gVGhlIGhhbmRsZXIgaW5pdGlhdGVzIGEgcmVxdWVzdCB0aHJvdWdoIGl0cyBjb3ZlcnQgY29tbXVuaWNhdGlvbiBjaGFubmVscywgcGFyc2UgYSBKU09OIHBheWxvYWQgaW50byB0aGUgYSBzcGVjaWZpYyBzdHJ1Y3R1cmUsIGV4dHJhY3RzIGFuZCBleGVjdXRlcyBhbiBleHRlcm5hbCBjb21tYW5kLCBzcGVjaWZpY2FsbHkgZXN0YWJsaXNoaW5nIGEgcHNldWRvLXRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gaXQsIGVuYWJsaW5nIGludGVyYWN0aXZlIGNvbnRyb2wgYW5kIGRhdGEgZXhjaGFuZ2Ugd2l0aCB0aGUgcnVubmluZyAgY29tbWFuZC5cclxuXHJcbmQuIFRoZSBDb21tYW5kTm9Db250ZXh0IGhhbmRsZXIgZXhlY3V0ZXMgc2hlbGwgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRob3V0IHVzaW5nIGFuIGV4cGxpY2l0IHNlY3VyaXR5IGNvbnRleHQuIFxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS0iLAogICAgICAgICAgICAibWFsd2FyZV90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJiYWNrZG9vciIsCiAgICAgICAgICAgICAgICAidHJvamFuIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaXNfZmFtaWx5IjogZmFsc2UsCiAgICAgICAgICAgICJzYW1wbGVfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJmaWxlLS1lYTM2Njc4Yy0wNTc1LTU5NjgtOTkxYy0xMDRkMTVhMzE1NWYiCiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaW5kaWNhdG9yIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiaW5kaWNhdG9yLS01NmZiNmUyZi04MWRlLTQwYTYtYjZlYy00NGY4ODJjOTdmMDEiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibmFtZSI6ICI1N2JkOThkYmI1YTAwZTU0ZjA3ZmZhY2RhMWZlYTkxNDUxYTBjMGI1MzJjZDdkNTcwZTk4Y2UyZmY3NDFjMjFkIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiW2ZpbGU6aGFzaGVzLidNRDUnPSdkYmNhMjhhZDQyMDQwODg1MGE5NGQ1YzMyNTE4M2IyOCcgT1IgZmlsZTpoYXNoZXMuJ1NIQS0xJz0nZmIxMWM2Y2FhNGVhODQ0OTQyZmU5N2Y0NmQ3ZWI0MmJjNzY5MTFhYicgT1IgZmlsZTpoYXNoZXMuJ1NIQS0yNTYnPSc1N2JkOThkYmI1YTAwZTU0ZjA3ZmZhY2RhMWZlYTkxNDUxYTBjMGI1MzJjZDdkNTcwZTk4Y2UyZmY3NDFjMjFkJyBPUiBmaWxlOmhhc2hlcy4nU0hBLTUxMic9JzY1OTIwNWZhMmNmYTg1ZTQ4NGMwOTFjYzJlODVhN2VjNGUzMzJiMTk2ZTQyM2IxZjM5YmFmZGM4ZmNhMzNlM2RiNzEyYmJlMDdhZmNjMDkxZmYyNmQ5YjRmNjQxZmE5YTczZjJhNjZkY2U5YTBjZWQ1NGViZWI4YzJiZTgyYTdmJ10iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInN0aXgiLAogICAgICAgICAgICAicGF0dGVybl92ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJ2YWxpZF9mcm9tIjogIjIwMjUtMTItMDJUMTY6MDc6MjMuNzMzMDYxWiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImZpbGUtLTdjZmE5ZTBkLWY0ZDUtNTIyYy1hYzVhLTBiNTA2OTIwMDVlMCIsCiAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAiTUQ1IjogImEwMjQ2OTc0MmY3YjBiYzlhOGFiNWUyNjgyMmIzZmE4IiwKICAgICAgICAgICAgICAgICJTSEEtMSI6ICIxMGQ4MTEwMjlmNmU1ZjU4Y2QwNjE0M2Q2MzUzZDNiMDViYzA2ZDBmIiwKICAgICAgICAgICAgICAgICJTSEEtMjU2IjogIjczZmU4YjhmYjRiZDc3NzYzNjJmZDM1NmZkYzE4OWM5M2NmNWQ5ZjY3MjRmNjIzN2Q4MjkwMjRjMTAyNjNmZTUiLAogICAgICAgICAgICAgICAgIlNIQS01MTIiOiAiOGUyOWFlYjM2MDNmZmUzMDdiMmQ2MGY3NDAxYmQ5OTc4YmViZTg4ODMyMzVlYjg4MDUyZWJmNmI5ZTA0Y2U2YmYzNTY2NzQ4MGNlZGVhNTcxMmMxZTEzZThjNmRjZmIzNGQ1ZmRlMGRkY2E2Y2EzMTMyOGRlMDE1MjUwOWJmOGYiLAogICAgICAgICAgICAgICAgIlNTREVFUCI6ICI5ODMwNDo3OFNlNWxxZllNS0Rkb3BQeDBFNGorZE0vR0xhQ1hOd3FZTDZ3dC81QVBVblU6NzhTZTU0ZllNVWFpRTRqK2RNL0dMYUNYTm1MUCsiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzaXplIjogODMzMjY4OSwKICAgICAgICAgICAgIm5hbWUiOiAiNzNmZThiOGZiNGJkNzc3NjM2MmZkMzU2ZmRjMTg5YzkzY2Y1ZDlmNjcyNGY2MjM3ZDgyOTAyNGMxMDI2M2ZlNSIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJpbmRpY2F0b3IiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJpbmRpY2F0b3ItLTFlYTJhMDgzLWM0ZmEtNGJlYi04ZWVhLTA5NDA4NDcwMjJhOSIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJuYW1lIjogIjczZmU4YjhmYjRiZDc3NzYzNjJmZDM1NmZkYzE4OWM5M2NmNWQ5ZjY3MjRmNjIzN2Q4MjkwMjRjMTAyNjNmZTUiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNLCB3aGljaCBpcyBkZXNpZ25lZCB0byBoYW5kbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBjb25uZWN0aW9uIHBhcmFtZXRlcnMsIHNldCB1cCBsb2dnaW5nLCBjb25maWd1cmUgYSBXZWJTb2NrZXQgY29ubmVjdG9yLCBjcmVhdGUgc2VydmljZSBpbnN0YW5jZXMsIGFuZCBkZWZpbmUgcmVxdWVzdCBoYW5kbGVycyBmb3IgZGlmZmVyZW50IHJlcXVlc3QgdHlwZXMuIFRoZSBiYWNrZG9vciB1c2VzIHRoZSBTT0NLUyBwcm94eWluZywgVlNPQ0sgcHJveHlpbmcsIG11bHRpLWxheWVyZWQgd2ViIHNlcnZpY2UgY29tbXVuaWNhdGlvbiwgYW5kIHZhcmllZCBjb21tYW5kIGV4ZWN1dGlvbiB0byBvYnNjdXJlIGl0cyBhY3Rpdml0aWVzLiBUaGUgYmFja2Rvb3IgdXNlcyBYT1IgY2lwaGVyIGVuY3J5cHRpb24gdG8gaGlkZSBrZXkgc3RyaW5ncyB3aXRoaW4gaXRzIGNvZGUuIFRoZSBiYWNrZG9vciB2YXJpYWJsZXMsIGNvcmUgZnVuY3Rpb25zLCBhbmQgZXh0ZW5kZWQgYXJndW1lbnRzIGFyZSBvYmZ1c2NhdGVkIHVzaW5nIGEgY3VzdG9tLWJ1aWx0IHNvcGhpc3RpY2F0ZWQgdG9vbC1zZXQgdG8gZXZhZGUgZGV0ZWN0aW9uIGFuZCBoaW5kZXIgYW5hbHlzaXMuIFxyXG5cclxuVXBvbiBleGVjdXRpb24sIHRoZSBiYWNrZG9vciByZXRyaWV2ZXMgdGhyZWUgQzIgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlbG93OlxyXG5cclxuLS1CZWdpbiBDb25maWd1cmF0aW9uIFZhbHVlcy0tXHJcbmxpc3RlbkFkZHIgID09PiBMaXN0ZW4gYWRkcmVzcyBhbmQgcG9ydCAoZGVmYXVsdDogXCIxMjcuMC4wLjE6ODA5MFwiKS4gXHJcblxyXG5saXN0ZW5QYXRoID09PiBMaXN0ZW4gcGF0aCB0byByb3V0ZSByZXF1ZXN0cyB0byBhIGhhbmRsZXIgZnVuY3Rpb24gKFdTUyBjb25uZWN0aW9uKS5cclxuXHJcbnBhc3N3b3JkID09PiBBdXRoZW50aWNhdGlvbiBrZXkgKEF1dGhLZXkpLlxyXG4tLUVuZCBDb25maWd1cmF0aW9uIFZhbHVlcy0tXHJcblxyXG5JZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYXJlIHJldHJpZXZlZCwgdGhlIGJhY2tkb29yIGluaXRpYXRlcyBhIGZ1bmN0aW9uIFwibWFpbl9zdGFydE5ld1wiIHRvIGNvbmZpZ3VyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBiYWNrZG9vciBjaGVja3MgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcGF0aCBhbmQgY29tcGFyZXMgaXQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHJldHJpZXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIlZBUkdTXCIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBiYWNrZG9vciBpcyBydW5uaW5nIGFzIGEgY2hpbGQgcHJvY2Vzcy4gSWYgdGhleSBkbyBub3QgbWF0Y2gsIGluZGljYXRpbmcgYSBjaGlsZCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLCB0aGUgYmFja2Rvb3IgY29waWVzIGl0c2VsZiB0byBhIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIG9uIHRoZSBzeXN0ZW0uIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIHRoZSBuZXcgY29uc3RydWN0ZWQgcGF0aCB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZW5zdXJpbmcgdGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciB0YWtlcyBwcmVjZWRlbmNlIGluIGV4ZWN1dGlvbi4gVGhlIGJhY2tkb29yIHN0YXJ0cyB0aGUgbmV3IHByb2Nlc3MgYW5kIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24uIFxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgdGhlIGZ1bmN0aW9uIFwibWFpbl9zZWxmV2F0Y2hlciBcIiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyB0aGUgdmFsdWUgb2YgdGhlIHJldHJpZXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIlZSRUdcIiAgYW5kIGNvbXBhcmVzIGl0IHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcGF0aC4gSWYgdGhlIGNoZWNrcyByZXR1cm4gYSBcImZhbHNlXCIgdmFsdWUsIHRoZW4gXCJWUkVHXCIgaXMgbm90IHNldCwgaW5kaWNhdGluZyB0aGUgYmFja2Rvb3IgaXMgbm90IHJ1bm5pbmcgY29ycmVjdGx5LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgaXRzZWxmIHRvIGEgbmV3IGNvbnN0cnVjdGVkIHBhdGggb24gdGhlIHN5c3RlbS4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgdGhlIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGUgbmV3bHkgY29waWVkIGJhY2tkb29yIGZpbGUgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyB0aGF0IFwiVlJFR1wiIGlzIHNldCwgdGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLlxyXG5cclxuVGhlIGJhY2tkb29yIGF0dGVtcHRzIHRvIGVzdGFibGlzaCBhIFdTUyBzZXJ2ZXIgd2l0aCBtaW5pbWFsIGV4dGVybmFsIGRlcGVuZGVuY2llcy4gVGhpcyBzZXR1cCBhbGxvd3MgZm9yIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9uIHdpdGhvdXQgcmVseWluZyBvbiBhIHB1YmxpY2x5IHRydXN0ZWQgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IG9yIGNlcnRpZmljYXRlIGZpbGVzIG9uIGRpc2suIFRoZSBiYWNrZG9vciBkeW5hbWljYWxseSBnZW5lcmF0ZXMgYSBzZWxmLXNpZ25lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBhbmQgYSBjb3JyZXNwb25kaW5nIDIwNDgtYml0IHByaXZhdGUga2V5IGluIG1lbW9yeS4gVGhlIGluLW1lbW9yeSBnZW5lcmF0ZWQgY2VydGlmaWNhdGUgYW5kIHRoZSBwcml2YXRlIGtleSBhcmUgdGhlbiBsb2FkZWQgaW50byBhIFwidGxzLkNlcnRpZmljYXRlXCIgc3RydWN0LCB3aGljaCBpcyB0aGVuIGFzc2lnbmVkIHRvIHRoZSBDZXJ0aWZpY2F0ZXMgZmllbGQgb2YgYSBcInRscy5Db25maWdcIiBvYmplY3QuIEEgc3RhbmRhcmQgXCJuZXQvaHR0cFwiIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIHVzZSB0aGlzIGN1c3RvbSBcInRscy5Db25maWdcIiB0byBoYW5kbGUgSFRUUFMvV1NTIGNvbm5lY3Rpb25zLiBcclxuXHJcblRoZSBiYWNrZG9vciB1dGlsaXplcyBhIHNpbmdsZSwgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbiBvdmVyIFdTUyB0byBhIHNwZWNpZmllZCBDMiBhZGRyZXNzIChsaXN0ZW5BZGRyKSBhbmQgcGF0aCAobGlzdGVuUGF0aCkuIFRoZSBiYWNrZG9vciBpbXBsZW1lbnRzIGEgY3VzdG9tIGF1dGhlbnRpY2F0aW9uIGNoZWNrLCBpbnZvbHZpbmcgdGhlIHNwZWNpZmljIHByZS1zaGFyZWQgQXV0aEtleSAocGFzc3dvcmQpLCBkdXJpbmcgb3IgYmVmb3JlIHRoZSBXU1MgaGFuZHNoYWtlLCB0aGUgY29ubmVjdGlvbiB1cGdyYWRlIHByb2Nlc3MuIE9uY2UgdGhlIFdTUyBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbGwgY29tbXVuaWNhdGlvbiBpcyBlbmNyeXB0ZWQuIFRoaXMgZW5jcnlwdGlvbiBsZXZlcmFnZXMgdGhlIGluLW1lbW9yeSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMuXHJcblxyXG5PbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIEMyIHNlcnZlciB2aWEgV2ViU29ja2V0cywgdGhlIGJhY2tkb29yIHJlY2VpdmVzIGNvbW1hbmRzIHRoYXQgYXJlIGRpcmVjdGVkIHRvIHNwZWNpZmljIGhhbmRsZXJzIHRvIHBlcmZvcm0gdGFza3Mgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBzaXggY29yZSBoYW5kbGVycyBhbmQgdGhlaXIgZnVuY3Rpb25zOiBcclxuXHJcbi0tQmVnaW4gQ29yZSBIYW5kbGVycy0tIFxyXG5cclxuYS4gVGhlIFNvY2tzIGhhbmRsZXIgKEZpZ3VyZSA1KSBlc3RhYmxpc2hlcyBhIFNPQ0tTIHJlbGF5LCB3aGljaCBmYWNpbGl0YXRlcyBsYXRlcmFsIG1vdmVtZW50IHdpdGhpbiBhIGNvbXByb21pc2VkIG5ldHdvcmsgYW5kIHJvdXRlcyBDMiB0cmFmZmljLiBUaGlzIGhhbmRsZXIgaXMgYSBTT0NLUyBwcm94eSBoYW5kbGVyIHRoYXQgYXR0ZW1wdHMgdG8gcGFyc2UgaW5jb21pbmcgcmVxdWVzdHMgYXMgSlNPTi1mb3JtYXR0ZWQgU09DS1MgYXJndW1lbnRzLiBEZXBlbmRpbmcgb24gdGhlIHN1Y2Nlc3Mgb2YgdGhpcyBwYXJzaW5nLCBpdCBlaXRoZXIgcmVzcG9uZHMgd2l0aCBhbiBlcnJvciBvciBkZWxlZ2F0ZXMgdGhlIGhhbmRsaW5nIHRvIGEgU09DS1MgaGFuZGxpbmcgbWVjaGFuaXNtLiBUaGUgaGFuZGxlciBwZXJmb3JtcyBTT0NLUyByZWxheWluZyBhbmQgbmV0d29yayB0dW5uZWxpbmcgb3ZlciBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbCAoVENQKSwgVXNlciBEYXRhZ3JhbSBQcm90b2NvbCAoVURQKSwgYW5kIEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCAoSUNNUCkuIFxyXG5cclxuYi4gVGhlIFdlYlNlcnZpY2UgaGFuZGxlciAoRmlndXJlIDYpIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyLiBUaGUgaGFuZGxlciB1c2VzIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZSwgbGV2ZXJhZ2luZyB0aGUgXCJuZXQvaHR0cCBwYWNrYWdlXCIgdG8gY3JlYXRlIGEgd2ViIHNlcnZlciBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBBIGRlZGljYXRlZCBBUEkgXCIvYXBpL1wiIGVuZHBvaW50IGlzIGNyZWF0ZWQgdG8gcmVjZWl2ZSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlci4gXHJcblxyXG5jLiBUaGUgQ29tbWFuZE5vQ29udGV4dCBoYW5kbGVyIChGaWd1cmUgNykgZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRob3V0IHVzaW5nIGFuIGV4cGxpY2l0IHNlY3VyaXR5IGNvbnRleHQuIFxyXG5cclxuZC4gVGhlIENvbW1hbmQgaGFuZGxlciAoRmlndXJlIDgpIGV4ZWN1dGVzIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gd2l0aCBhIHNwZWNpZmljIHNlY3VyaXR5IGNvbnRleHQuIFRoZSBoYW5kbGVyIGV4ZWN1dGVzIHNoZWxsIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0sIGdyYW50aW5nIHRoZSBUQSBpbnRlcmFjdGl2ZSBjb21tYW5kLWxpbmUgYWNjZXNzLiBUaGUgaGFuZGxlciBpbml0aWF0ZXMgYSByZXF1ZXN0IHRocm91Z2ggaXRzIGNvdmVydCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCBwYXJzZSBhIEpTT04gcGF5bG9hZCBpbnRvIHRoZSBhIHNwZWNpZmljIHN0cnVjdHVyZSwgZXh0cmFjdHMgYW5kIGV4ZWN1dGVzIGFuIGV4dGVybmFsIGNvbW1hbmQsIHNwZWNpZmljYWxseSBlc3RhYmxpc2hpbmcgYSBwc2V1ZG8tdGVybWluYWwgY29ubmVjdGlvbiB0byBpdCwgZW5hYmxpbmcgaW50ZXJhY3RpdmUgY29udHJvbCBhbmQgZGF0YSBleGNoYW5nZSB3aXRoIHRoZSBydW5uaW5nIGNvbW1hbmQuXHJcblxyXG5lLiBUaGUgVlNPQ0stcHJveHkgaGFuZGxlciAoRmlndXJlIDkpIGltcGxlbWVudHMgYSBwcm94eSB0aGF0IGR5bmFtaWNhbGx5IGNvbmZpZ3VyZXMgaXRzIG91dGdvaW5nIGNvbm5lY3Rpb25zIGJhc2VkIG9uIGEgSlNPTiBwYXlsb2FkIHJlY2VpdmVkIGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LiBUaGUgaGFuZGxlciBwcm9jZXNzZXMgYW4gaW5jb21pbmcgbmV0d29yayByZXF1ZXN0IGNvbnRhaW5pbmcgYSBKU09OIHBheWxvYWQgd2l0aCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyB0byBlc3RhYmxpc2ggYSB0dW5uZWxlZCBjb25uZWN0aW9uLiBUaGUgaGFuZGxlciB1bm1hcnNoYWxzIHRoZSBKU09OIGRhdGEgYW5kIHZhbGlkYXRlcyB0aGUgZXh0cmFjdGVkIGFyZ3VtZW50cyBiZWxvdzpcclxuXHJcbi0tQmVnaW4gQ29uZmlndXJhdGlvbiBBcmd1bWVudHMtLVxyXG5UdW5uZWxBZGRyOiAgVGhlIGRlc3RpbmF0aW9uIG5ldHdvcmsgYWRkcmVzcyAoSVAgYWRkcmVzcyBvciBob3N0bmFtZSkgd2hlcmUgdGhlIHByb3h5IHdpbGwgZm9yd2FyZCBkYXRhIGZyb20gdGhlIFZTT0NLIGNvbm5lY3Rpb24uXHJcbkNJRDogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB2aXJ0dWFsIG1hY2hpbmUgb3IgdGhlIGhvc3Qgd2l0aGluIHRoZSBWU09DSyBlbnZpcm9ubWVudC5cclxuUG9ydDogVGhlIHBvcnQgbnVtYmVyIHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uXHJcbkZhbWlseSA9PT4gVGhlIGFkZHJlc3MgdHlwZSBzcGVjaWZpZWQgYXMgQUZfVlNPQ0tcclxuLS1FbmQgQ29uZmlndXJhdGlvbiBBcmd1bWVudHMtLVxyXG5cclxuVXNpbmcgdGhlIHZhbGlkYXRlZCBhcmd1bWVudHMsIHRoZSBoYW5kbGVyIGJpbmRzIHRvIGEgc3BlY2lmaWMgVlNPQ0sgYWRkcmVzcyAoZGVmaW5lZCBieSB0aGUgQ0lEIGFuZCBQb3J0KS4gSXQgdGhlbiBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRlc3RpbmF0aW9uIHNwZWNpZmllZCBieSBcIlR1bm5lbEFkZHJcIi4gVGhlIGhhbmRsZXIgcmVsYXlzIHRyYWZmaWMgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgdGFyZ2V0IHNlcnZlci4gVGhpcyBjYW4gYmUgYSBkaXJlY3QgdHVubmVsIG9yIGEgcmVsYXkgdmlhIHRoZSBwcm94eSwgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLiBUaGUgVlNPQ0stcHJveHkgY2FuIGJlIHVzZWQgdG8gbWFpbnRhaW4gY292ZXJ0IGNvbW11bmljYXRpb24gY2hhbm5lbHMsIGV2YWRlIGRldGVjdGlvbiwgYW5kIHBpdm90IHdpdGhpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIFVwb24gY29tcGxldGlvbiBvciB0ZXJtaW5hdGlvbiBvZiB0aGUgY29ubmVjdGlvbiwgdGhlIGhhbmRsZXIgc2VuZHMgYW4gYXBwcm9wcmlhdGUgc3VjY2VzcyBvciBlcnJvciByZXNwb25zZSBiYWNrIHRvIHRoZSBjbGllbnQuXHJcblxyXG5mLiBUaGUgVlNPQ0sgY29ubmVjdGlvbiBoYW5kbGVyIChGaWd1cmUgMTApIHByb2Nlc3NlcyBhbiBpbmNvbWluZyBuZXR3b3JrIHJlcXVlc3QgY29udGFpbmluZyBhIEpTT04gcGF5bG9hZCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYXJndW1lbnRzIHRvIGNvbm5lY3QgdG8gYSBWU09DSyBlbmRwb2ludC4gVGhlIGhhbmRsZXIgZXh0cmFjdHMgdGhlIEpTT04gcGF5bG9hZCBmcm9tIHRoZSByZXF1ZXN0IGFuZCB1c2VzIGEgSlNPTiBwYXJzZXIgdG8gdW5tYXJzaGFsIHRoZSBkYXRhIGludG8gYSBzdHJ1Y3R1cmVkIG9iamVjdCB3aXRoIGZpZWxkcyBmb3IgQ0lELCBQb3J0LCBhbmQgRmFtaWx5LiBUaGUgaGFuZGxlciBjaGVja3MgdGhlIHVubWFyc2hhbGxlZCBkYXRhIGZvciB2YWxpZGl0eSBhbmQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQsIHRoZSBoYW5kbGVyIGNyZWF0ZXMgb3IgY29ubmVjdHMgdG8gYSBWU09DSyBlbmRwb2ludCB1c2luZyBhIHNwZWNpZmllZCBDSUQgYW5kIFBvcnQgbnVtYmVyLiBJZiB0aGUgdmlydHVhbCBzb2NrZXQgY3JlYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIGhhbmRsZXIgYWxsb2NhdGVzIGEgbmV3IHJ1bnRpbWUgb2JqZWN0IHRvIGhvbGQgdGhlIENJRCBhbmQgcG9ydCBpbmZvcm1hdGlvbi4gSWYgdW5tYXJzaGFsbGluZyBmYWlscywgdmFsaWRhdGlvbiBmYWlscywgb3IgdGhlIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkLCB0aGUgaGFuZGxlciByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIHRvIHRoZSBjbGllbnQuXHJcblxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS0iLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiICduYW1lc3BhY2UnPSdDSVNBX0NvbnNvbGlkYXRlZC55YXJhJyBydWxlX25hbWU9Q0lTQV8yNTExNTVfMDIgcnVsZV9jb250ZW50PXJ1bGUgQ0lTQV8yNTExNTVfMDIgOiBCUklDS1NUT1JNIGJhY2tkb29yIGluc3RhbGxzX290aGVyX2NvbXBvbmVudHMgY29tbXVuaWNhdGVzX3dpdGhfYzIgZXhmaWx0cmF0ZXNfZGF0YVxue1xuICAgbWV0YTpcbiAgICAgICBhdXRob3IgPSBcIkNJU0EgQ29kZSAmIE1lZGlhIEFuYWx5c2lzXCJcbiAgICAgICBpbmNpZGVudCA9IFwiMjUxMTU1XCJcbiAgICAgICBkYXRlID0gXCIyMDI1LTA5LTE1XCJcbiAgICAgICBsYXN0X21vZGlmaWVkID0gXCIyMDI1MDkxNl8xNTExXCJcbiAgICAgICBhY3RvciA9IFwibi9hXCJcbiAgICAgICBmYW1pbHkgPSBcIkJSSUNLU1RPUk1cIlxuICAgICAgIGNhcGFiaWxpdGllcyA9IFwiaW5zdGFsbHMtb3RoZXItY29tcG9uZW50cyBjb21tdW5pY2F0ZXMtd2l0aC1jMiBleGZpbHRyYXRlcy1kYXRhXCJcbiAgICAgICBtYWx3YXJlX3R5cGUgPSBcImJhY2tkb29yXCJcbiAgICAgICB0b29sX3R5cGUgPSBcInVua25vd25cIlxuICAgICAgIGRlc2NyaXB0aW9uID0gXCJEZXRlY3RzIEdvLUJhc2VkIEJSSUNLU1RPUk0gYmFja2Rvb3Igc2FtcGxlc1wiXG4gICAgICAgc2hhMjU2XzEgPSBcIjMyMGEwYjVkNDkwMDY5N2UxMjVjZWJiNWZmMDNkZWU3MzY4ZjhmMDg3ZGIxYzE1NzBiMGI2MmY1YTk4NmQ3NTlcIlxuICAgICAgIHNoYTI1Nl8xID0gXCJkZmFjMjU0MmEwZWU2NWM0NzRiOTFkM2IzNTI1NDBhMjRmNGUyMjNmMWI4MDhiNzQxY2ZlNjgwMjYzZjBlZTQ0XCJcbiAgICAgICBzaGEyNTZfMSA9IFwiYjkxODgxY2IxYWE4NjExMzhmMjA2M2VjMTMwYjJiMDFhOGFhZjBlM2YwNDkyMWU1Y2JmYzYxYjA5MDI0YmYxMlwiXG4gICAgICAgc2hhMjU2XzEgPSBcImJmYjNmZmQ0NmIyMWIyMjgxMzc0Y2Q2MGJjNzU2ZmUyZGNjMzI0ODZkY2MxNTZjOWJkOThmMjQxMDExNDU0NTRcIlxuICAgc3RyaW5nczpcbiAgICAgICAkczAgPSB7IDA0IDMwIDBGIEI2IDU0IDA0IDJDIDMxIEQxIDg4IDRDIDA0IDM0IDQ4IEZGIEMwIH1cbiAgICAgICAkczEgPSB7IDQ4IDgzIEY4IDA0IDdDIEU3IDQ4IEM3IDA0IDI0IH1cbiAgICAgICAkczIgPSB7IDQ4IDhEIDQ0IDI0IDM0IDQ4IDg5IDQ0IDI0IDA4IDQ4IEM3IDQ0IDI0IDEwIDA0IH1cbiAgICAgICAkczMgPSB7IDQ4IDg5IDQ0IDI0IDQ4IDQ4IDg5IDRDIDI0IDUwIDQ4IDhCIDZDIDI0IDM4IDQ4IH1cbiAgICAgICAkczQgPSB7IDQ4IDgzIEVDIDQwIDQ4IDg5IDZDIDI0IDM4IDQ4IDhEIDZDIDI0IDM4IEM3IDQ0IDI0IH1cbiAgICAgICAkczUgPSB7IDgzIEVDIDM4IDQ4IDg5IDZDIDI0IDMwIDQ4IDhEIDZDIDI0IDMwIEM2IDQ0IDI0IH1cbiAgICAgICAkczYgPSB7IDRDIDI0IDIwIDQ4IDg5IDQ0IDI0IDQwIDQ4IDg5IDRDIDI0IDQ4IDQ4IDhCIDZDIH1cbiAgICAgICAkczcgPSB7IDY0IDQ4IDhCIDBDIDI1IEY4IEZGIEZGIEZGIDQ4IDNCIDYxIDEwIDBGIDg2IDgxIH1cbiAgICAgICAkczggPSB7IDY0IDQ4IDhCIDBDIDI1IEY4IEZGIEZGIEZGIDQ4IDNCIDYxIDEwIDBGIDg2IDkxIH1cbiAgIGNvbmRpdGlvbjpcbiAgICAgIGFsbCBvZiB0aGVtXG59XG4iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInlhcmEiLAogICAgICAgICAgICAidmFsaWRfZnJvbSI6ICIyMDI1LTEyLTAyVDE2OjA3OjIzLjc1ODUyOVoiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUtYW5hbHlzaXMiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLWFuYWx5c2lzLS1lMTQzYjM3OS05MWFmLTRkOTctOTExNS0zYmQxMDIxZDM3NWQiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAicHJvZHVjdCI6ICJlc2V0IiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicmVzdWx0X25hbWUiOiAiYSB2YXJpYW50IG9mIExpbnV4L0JyaWNrU3Rvcm0uQSB0cm9qYW4iLAogICAgICAgICAgICAicmVzdWx0IjogInVua25vd24iLAogICAgICAgICAgICAic2FtcGxlX3JlZiI6ICJmaWxlLS03Y2ZhOWUwZC1mNGQ1LTUyMmMtYWM1YS0wYjUwNjkyMDA1ZTAiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLS01NzI4ZGI3NS1kMjVkLTRjYjYtOGNhZC1jYzhkYjgzODQwM2YiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNLCB3aGljaCBpcyBkZXNpZ25lZCB0byBoYW5kbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBjb25uZWN0aW9uIHBhcmFtZXRlcnMsIHNldCB1cCBsb2dnaW5nLCBjb25maWd1cmUgYSBXZWJTb2NrZXQgY29ubmVjdG9yLCBjcmVhdGUgc2VydmljZSBpbnN0YW5jZXMsIGFuZCBkZWZpbmUgcmVxdWVzdCBoYW5kbGVycyBmb3IgZGlmZmVyZW50IHJlcXVlc3QgdHlwZXMuIFRoZSBiYWNrZG9vciB1c2VzIHRoZSBTT0NLUyBwcm94eWluZywgVlNPQ0sgcHJveHlpbmcsIG11bHRpLWxheWVyZWQgd2ViIHNlcnZpY2UgY29tbXVuaWNhdGlvbiwgYW5kIHZhcmllZCBjb21tYW5kIGV4ZWN1dGlvbiB0byBvYnNjdXJlIGl0cyBhY3Rpdml0aWVzLiBUaGUgYmFja2Rvb3IgdXNlcyBYT1IgY2lwaGVyIGVuY3J5cHRpb24gdG8gaGlkZSBrZXkgc3RyaW5ncyB3aXRoaW4gaXRzIGNvZGUuIFRoZSBiYWNrZG9vciB2YXJpYWJsZXMsIGNvcmUgZnVuY3Rpb25zLCBhbmQgZXh0ZW5kZWQgYXJndW1lbnRzIGFyZSBvYmZ1c2NhdGVkIHVzaW5nIGEgY3VzdG9tLWJ1aWx0IHNvcGhpc3RpY2F0ZWQgdG9vbC1zZXQgdG8gZXZhZGUgZGV0ZWN0aW9uIGFuZCBoaW5kZXIgYW5hbHlzaXMuIFxyXG5cclxuVXBvbiBleGVjdXRpb24sIHRoZSBiYWNrZG9vciByZXRyaWV2ZXMgdGhyZWUgQzIgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlbG93OlxyXG5cclxuLS1CZWdpbiBDb25maWd1cmF0aW9uIFZhbHVlcy0tXHJcbmxpc3RlbkFkZHIgID09PiBMaXN0ZW4gYWRkcmVzcyBhbmQgcG9ydCAoZGVmYXVsdDogXCIxMjcuMC4wLjE6ODA5MFwiKS4gXHJcblxyXG5saXN0ZW5QYXRoID09PiBMaXN0ZW4gcGF0aCB0byByb3V0ZSByZXF1ZXN0cyB0byBhIGhhbmRsZXIgZnVuY3Rpb24gKFdTUyBjb25uZWN0aW9uKS5cclxuXHJcbnBhc3N3b3JkID09PiBBdXRoZW50aWNhdGlvbiBrZXkgKEF1dGhLZXkpLlxyXG4tLUVuZCBDb25maWd1cmF0aW9uIFZhbHVlcy0tXHJcblxyXG5JZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYXJlIHJldHJpZXZlZCwgdGhlIGJhY2tkb29yIGluaXRpYXRlcyBhIGZ1bmN0aW9uIFwibWFpbl9zdGFydE5ld1wiIHRvIGNvbmZpZ3VyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBiYWNrZG9vciBjaGVja3MgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcGF0aCBhbmQgY29tcGFyZXMgaXQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHJldHJpZXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIlZBUkdTXCIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBiYWNrZG9vciBpcyBydW5uaW5nIGFzIGEgY2hpbGQgcHJvY2Vzcy4gSWYgdGhleSBkbyBub3QgbWF0Y2gsIGluZGljYXRpbmcgYSBjaGlsZCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLCB0aGUgYmFja2Rvb3IgY29waWVzIGl0c2VsZiB0byBhIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIG9uIHRoZSBzeXN0ZW0uIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIHRoZSBuZXcgY29uc3RydWN0ZWQgcGF0aCB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZW5zdXJpbmcgdGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciB0YWtlcyBwcmVjZWRlbmNlIGluIGV4ZWN1dGlvbi4gVGhlIGJhY2tkb29yIHN0YXJ0cyB0aGUgbmV3IHByb2Nlc3MgYW5kIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24uIFxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgdGhlIGZ1bmN0aW9uIFwibWFpbl9zZWxmV2F0Y2hlciBcIiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyB0aGUgdmFsdWUgb2YgdGhlIHJldHJpZXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIlZSRUdcIiAgYW5kIGNvbXBhcmVzIGl0IHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcGF0aC4gSWYgdGhlIGNoZWNrcyByZXR1cm4gYSBcImZhbHNlXCIgdmFsdWUsIHRoZW4gXCJWUkVHXCIgaXMgbm90IHNldCwgaW5kaWNhdGluZyB0aGUgYmFja2Rvb3IgaXMgbm90IHJ1bm5pbmcgY29ycmVjdGx5LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgaXRzZWxmIHRvIGEgbmV3IGNvbnN0cnVjdGVkIHBhdGggb24gdGhlIHN5c3RlbS4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgdGhlIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGUgbmV3bHkgY29waWVkIGJhY2tkb29yIGZpbGUgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyB0aGF0IFwiVlJFR1wiIGlzIHNldCwgdGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLlxyXG5cclxuVGhlIGJhY2tkb29yIGF0dGVtcHRzIHRvIGVzdGFibGlzaCBhIFdTUyBzZXJ2ZXIgd2l0aCBtaW5pbWFsIGV4dGVybmFsIGRlcGVuZGVuY2llcy4gVGhpcyBzZXR1cCBhbGxvd3MgZm9yIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9uIHdpdGhvdXQgcmVseWluZyBvbiBhIHB1YmxpY2x5IHRydXN0ZWQgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IG9yIGNlcnRpZmljYXRlIGZpbGVzIG9uIGRpc2suIFRoZSBiYWNrZG9vciBkeW5hbWljYWxseSBnZW5lcmF0ZXMgYSBzZWxmLXNpZ25lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBhbmQgYSBjb3JyZXNwb25kaW5nIDIwNDgtYml0IHByaXZhdGUga2V5IGluIG1lbW9yeS4gVGhlIGluLW1lbW9yeSBnZW5lcmF0ZWQgY2VydGlmaWNhdGUgYW5kIHRoZSBwcml2YXRlIGtleSBhcmUgdGhlbiBsb2FkZWQgaW50byBhIFwidGxzLkNlcnRpZmljYXRlXCIgc3RydWN0LCB3aGljaCBpcyB0aGVuIGFzc2lnbmVkIHRvIHRoZSBDZXJ0aWZpY2F0ZXMgZmllbGQgb2YgYSBcInRscy5Db25maWdcIiBvYmplY3QuIEEgc3RhbmRhcmQgXCJuZXQvaHR0cFwiIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIHVzZSB0aGlzIGN1c3RvbSBcInRscy5Db25maWdcIiB0byBoYW5kbGUgSFRUUFMvV1NTIGNvbm5lY3Rpb25zLiBcclxuXHJcblRoZSBiYWNrZG9vciB1dGlsaXplcyBhIHNpbmdsZSwgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbiBvdmVyIFdTUyB0byBhIHNwZWNpZmllZCBDMiBhZGRyZXNzIChsaXN0ZW5BZGRyKSBhbmQgcGF0aCAobGlzdGVuUGF0aCkuIFRoZSBiYWNrZG9vciBpbXBsZW1lbnRzIGEgY3VzdG9tIGF1dGhlbnRpY2F0aW9uIGNoZWNrLCBpbnZvbHZpbmcgdGhlIHNwZWNpZmljIHByZS1zaGFyZWQgQXV0aEtleSAocGFzc3dvcmQpLCBkdXJpbmcgb3IgYmVmb3JlIHRoZSBXU1MgaGFuZHNoYWtlLCB0aGUgY29ubmVjdGlvbiB1cGdyYWRlIHByb2Nlc3MuIE9uY2UgdGhlIFdTUyBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbGwgY29tbXVuaWNhdGlvbiBpcyBlbmNyeXB0ZWQuIFRoaXMgZW5jcnlwdGlvbiBsZXZlcmFnZXMgdGhlIGluLW1lbW9yeSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMuXHJcblxyXG5PbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIEMyIHNlcnZlciB2aWEgV2ViU29ja2V0cywgdGhlIGJhY2tkb29yIHJlY2VpdmVzIGNvbW1hbmRzIHRoYXQgYXJlIGRpcmVjdGVkIHRvIHNwZWNpZmljIGhhbmRsZXJzIHRvIHBlcmZvcm0gdGFza3Mgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBzaXggY29yZSBoYW5kbGVycyBhbmQgdGhlaXIgZnVuY3Rpb25zOiBcclxuXHJcbi0tQmVnaW4gQ29yZSBIYW5kbGVycy0tIFxyXG5cclxuYS4gVGhlIFNvY2tzIGhhbmRsZXIgKEZpZ3VyZSA1KSBlc3RhYmxpc2hlcyBhIFNPQ0tTIHJlbGF5LCB3aGljaCBmYWNpbGl0YXRlcyBsYXRlcmFsIG1vdmVtZW50IHdpdGhpbiBhIGNvbXByb21pc2VkIG5ldHdvcmsgYW5kIHJvdXRlcyBDMiB0cmFmZmljLiBUaGlzIGhhbmRsZXIgaXMgYSBTT0NLUyBwcm94eSBoYW5kbGVyIHRoYXQgYXR0ZW1wdHMgdG8gcGFyc2UgaW5jb21pbmcgcmVxdWVzdHMgYXMgSlNPTi1mb3JtYXR0ZWQgU09DS1MgYXJndW1lbnRzLiBEZXBlbmRpbmcgb24gdGhlIHN1Y2Nlc3Mgb2YgdGhpcyBwYXJzaW5nLCBpdCBlaXRoZXIgcmVzcG9uZHMgd2l0aCBhbiBlcnJvciBvciBkZWxlZ2F0ZXMgdGhlIGhhbmRsaW5nIHRvIGEgU09DS1MgaGFuZGxpbmcgbWVjaGFuaXNtLiBUaGUgaGFuZGxlciBwZXJmb3JtcyBTT0NLUyByZWxheWluZyBhbmQgbmV0d29yayB0dW5uZWxpbmcgb3ZlciBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbCAoVENQKSwgVXNlciBEYXRhZ3JhbSBQcm90b2NvbCAoVURQKSwgYW5kIEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCAoSUNNUCkuIFxyXG5cclxuYi4gVGhlIFdlYlNlcnZpY2UgaGFuZGxlciAoRmlndXJlIDYpIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyLiBUaGUgaGFuZGxlciB1c2VzIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZSwgbGV2ZXJhZ2luZyB0aGUgXCJuZXQvaHR0cCBwYWNrYWdlXCIgdG8gY3JlYXRlIGEgd2ViIHNlcnZlciBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBBIGRlZGljYXRlZCBBUEkgXCIvYXBpL1wiIGVuZHBvaW50IGlzIGNyZWF0ZWQgdG8gcmVjZWl2ZSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlci4gXHJcblxyXG5jLiBUaGUgQ29tbWFuZE5vQ29udGV4dCBoYW5kbGVyIChGaWd1cmUgNykgZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRob3V0IHVzaW5nIGFuIGV4cGxpY2l0IHNlY3VyaXR5IGNvbnRleHQuIFxyXG5cclxuZC4gVGhlIENvbW1hbmQgaGFuZGxlciAoRmlndXJlIDgpIGV4ZWN1dGVzIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gd2l0aCBhIHNwZWNpZmljIHNlY3VyaXR5IGNvbnRleHQuIFRoZSBoYW5kbGVyIGV4ZWN1dGVzIHNoZWxsIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0sIGdyYW50aW5nIHRoZSBUQSBpbnRlcmFjdGl2ZSBjb21tYW5kLWxpbmUgYWNjZXNzLiBUaGUgaGFuZGxlciBpbml0aWF0ZXMgYSByZXF1ZXN0IHRocm91Z2ggaXRzIGNvdmVydCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCBwYXJzZSBhIEpTT04gcGF5bG9hZCBpbnRvIHRoZSBhIHNwZWNpZmljIHN0cnVjdHVyZSwgZXh0cmFjdHMgYW5kIGV4ZWN1dGVzIGFuIGV4dGVybmFsIGNvbW1hbmQsIHNwZWNpZmljYWxseSBlc3RhYmxpc2hpbmcgYSBwc2V1ZG8tdGVybWluYWwgY29ubmVjdGlvbiB0byBpdCwgZW5hYmxpbmcgaW50ZXJhY3RpdmUgY29udHJvbCBhbmQgZGF0YSBleGNoYW5nZSB3aXRoIHRoZSBydW5uaW5nIGNvbW1hbmQuXHJcblxyXG5lLiBUaGUgVlNPQ0stcHJveHkgaGFuZGxlciAoRmlndXJlIDkpIGltcGxlbWVudHMgYSBwcm94eSB0aGF0IGR5bmFtaWNhbGx5IGNvbmZpZ3VyZXMgaXRzIG91dGdvaW5nIGNvbm5lY3Rpb25zIGJhc2VkIG9uIGEgSlNPTiBwYXlsb2FkIHJlY2VpdmVkIGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LiBUaGUgaGFuZGxlciBwcm9jZXNzZXMgYW4gaW5jb21pbmcgbmV0d29yayByZXF1ZXN0IGNvbnRhaW5pbmcgYSBKU09OIHBheWxvYWQgd2l0aCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyB0byBlc3RhYmxpc2ggYSB0dW5uZWxlZCBjb25uZWN0aW9uLiBUaGUgaGFuZGxlciB1bm1hcnNoYWxzIHRoZSBKU09OIGRhdGEgYW5kIHZhbGlkYXRlcyB0aGUgZXh0cmFjdGVkIGFyZ3VtZW50cyBiZWxvdzpcclxuXHJcbi0tQmVnaW4gQ29uZmlndXJhdGlvbiBBcmd1bWVudHMtLVxyXG5UdW5uZWxBZGRyOiAgVGhlIGRlc3RpbmF0aW9uIG5ldHdvcmsgYWRkcmVzcyAoSVAgYWRkcmVzcyBvciBob3N0bmFtZSkgd2hlcmUgdGhlIHByb3h5IHdpbGwgZm9yd2FyZCBkYXRhIGZyb20gdGhlIFZTT0NLIGNvbm5lY3Rpb24uXHJcbkNJRDogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB2aXJ0dWFsIG1hY2hpbmUgb3IgdGhlIGhvc3Qgd2l0aGluIHRoZSBWU09DSyBlbnZpcm9ubWVudC5cclxuUG9ydDogVGhlIHBvcnQgbnVtYmVyIHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uXHJcbkZhbWlseSA9PT4gVGhlIGFkZHJlc3MgdHlwZSBzcGVjaWZpZWQgYXMgQUZfVlNPQ0tcclxuLS1FbmQgQ29uZmlndXJhdGlvbiBBcmd1bWVudHMtLVxyXG5cclxuVXNpbmcgdGhlIHZhbGlkYXRlZCBhcmd1bWVudHMsIHRoZSBoYW5kbGVyIGJpbmRzIHRvIGEgc3BlY2lmaWMgVlNPQ0sgYWRkcmVzcyAoZGVmaW5lZCBieSB0aGUgQ0lEIGFuZCBQb3J0KS4gSXQgdGhlbiBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRlc3RpbmF0aW9uIHNwZWNpZmllZCBieSBcIlR1bm5lbEFkZHJcIi4gVGhlIGhhbmRsZXIgcmVsYXlzIHRyYWZmaWMgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgdGFyZ2V0IHNlcnZlci4gVGhpcyBjYW4gYmUgYSBkaXJlY3QgdHVubmVsIG9yIGEgcmVsYXkgdmlhIHRoZSBwcm94eSwgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLiBUaGUgVlNPQ0stcHJveHkgY2FuIGJlIHVzZWQgdG8gbWFpbnRhaW4gY292ZXJ0IGNvbW11bmljYXRpb24gY2hhbm5lbHMsIGV2YWRlIGRldGVjdGlvbiwgYW5kIHBpdm90IHdpdGhpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIFVwb24gY29tcGxldGlvbiBvciB0ZXJtaW5hdGlvbiBvZiB0aGUgY29ubmVjdGlvbiwgdGhlIGhhbmRsZXIgc2VuZHMgYW4gYXBwcm9wcmlhdGUgc3VjY2VzcyBvciBlcnJvciByZXNwb25zZSBiYWNrIHRvIHRoZSBjbGllbnQuXHJcblxyXG5mLiBUaGUgVlNPQ0sgY29ubmVjdGlvbiBoYW5kbGVyIChGaWd1cmUgMTApIHByb2Nlc3NlcyBhbiBpbmNvbWluZyBuZXR3b3JrIHJlcXVlc3QgY29udGFpbmluZyBhIEpTT04gcGF5bG9hZCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYXJndW1lbnRzIHRvIGNvbm5lY3QgdG8gYSBWU09DSyBlbmRwb2ludC4gVGhlIGhhbmRsZXIgZXh0cmFjdHMgdGhlIEpTT04gcGF5bG9hZCBmcm9tIHRoZSByZXF1ZXN0IGFuZCB1c2VzIGEgSlNPTiBwYXJzZXIgdG8gdW5tYXJzaGFsIHRoZSBkYXRhIGludG8gYSBzdHJ1Y3R1cmVkIG9iamVjdCB3aXRoIGZpZWxkcyBmb3IgQ0lELCBQb3J0LCBhbmQgRmFtaWx5LiBUaGUgaGFuZGxlciBjaGVja3MgdGhlIHVubWFyc2hhbGxlZCBkYXRhIGZvciB2YWxpZGl0eSBhbmQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQsIHRoZSBoYW5kbGVyIGNyZWF0ZXMgb3IgY29ubmVjdHMgdG8gYSBWU09DSyBlbmRwb2ludCB1c2luZyBhIHNwZWNpZmllZCBDSUQgYW5kIFBvcnQgbnVtYmVyLiBJZiB0aGUgdmlydHVhbCBzb2NrZXQgY3JlYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIGhhbmRsZXIgYWxsb2NhdGVzIGEgbmV3IHJ1bnRpbWUgb2JqZWN0IHRvIGhvbGQgdGhlIENJRCBhbmQgcG9ydCBpbmZvcm1hdGlvbi4gSWYgdW5tYXJzaGFsbGluZyBmYWlscywgdmFsaWRhdGlvbiBmYWlscywgb3IgdGhlIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkLCB0aGUgaGFuZGxlciByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIHRvIHRoZSBjbGllbnQuXHJcblxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS0iLAogICAgICAgICAgICAibWFsd2FyZV90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJ0cm9qYW4iLAogICAgICAgICAgICAgICAgImJhY2tkb29yIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaXNfZmFtaWx5IjogZmFsc2UsCiAgICAgICAgICAgICJzYW1wbGVfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJmaWxlLS03Y2ZhOWUwZC1mNGQ1LTUyMmMtYWM1YS0wYjUwNjkyMDA1ZTAiCiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaW5kaWNhdG9yIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiaW5kaWNhdG9yLS1jMDY5NGU4Ny1iZmJlLTRhODMtYTZjNy0wNGQ3YmVlNDhmZjMiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibmFtZSI6ICI3M2ZlOGI4ZmI0YmQ3Nzc2MzYyZmQzNTZmZGMxODljOTNjZjVkOWY2NzI0ZjYyMzdkODI5MDI0YzEwMjYzZmU1IiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiW2ZpbGU6aGFzaGVzLidNRDUnPSdhMDI0Njk3NDJmN2IwYmM5YThhYjVlMjY4MjJiM2ZhOCcgT1IgZmlsZTpoYXNoZXMuJ1NIQS0xJz0nMTBkODExMDI5ZjZlNWY1OGNkMDYxNDNkNjM1M2QzYjA1YmMwNmQwZicgT1IgZmlsZTpoYXNoZXMuJ1NIQS0yNTYnPSc3M2ZlOGI4ZmI0YmQ3Nzc2MzYyZmQzNTZmZGMxODljOTNjZjVkOWY2NzI0ZjYyMzdkODI5MDI0YzEwMjYzZmU1JyBPUiBmaWxlOmhhc2hlcy4nU0hBLTUxMic9JzhlMjlhZWIzNjAzZmZlMzA3YjJkNjBmNzQwMWJkOTk3OGJlYmU4ODgzMjM1ZWI4ODA1MmViZjZiOWUwNGNlNmJmMzU2Njc0ODBjZWRlYTU3MTJjMWUxM2U4YzZkY2ZiMzRkNWZkZTBkZGNhNmNhMzEzMjhkZTAxNTI1MDliZjhmJ10iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInN0aXgiLAogICAgICAgICAgICAicGF0dGVybl92ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJ2YWxpZF9mcm9tIjogIjIwMjUtMTItMDJUMTY6MDc6MjMuNzYzNjE4WiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImZpbGUtLTFjY2IzMWEyLWMxMDUtNTE4OC04NTYwLTJkNDhlYTVhNTE3OSIsCiAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAiTUQ1IjogImE1MmUzNmE3MGI1ZTAzMDdjYmNhYTVmZDdjOTc4ODJjIiwKICAgICAgICAgICAgICAgICJTSEEtMSI6ICI0NGEzZDNmMTVlZjc1ZDkyOTQzNDU0NjJlMWI4MjI3MmIwZDExOTg1IiwKICAgICAgICAgICAgICAgICJTSEEtMjU2IjogIjM5YjNkOGE4YWVkZmZjMWI0MDgyMGYyMDVmNmE0ZGMwNDFjZDM3MjYyODgwZTUwMzBiMDA4MTc1YzQ1YjBjNDYiLAogICAgICAgICAgICAgICAgIlNIQS01MTIiOiAiYmJlMThkMzJiZWY2NmNjZmE5MzE0Njg1MTFlOGJhNTViMzI5NDNlNDdhMWRmMWU2OGJiNWM4ZjhhZTk3YTViZjk5MTIwMTg1OGFlOTYzMmZhMjRkZjVmNmM2NzRiNmNiMjYwMjk3YTFjMTE4ODljYTYxYmRhNjg1MTNmNDQwY2UiLAogICAgICAgICAgICAgICAgIlNTREVFUCI6ICI5ODMwNDo3OFNlNWxxZllNS0Rkb3BQeDBFNGorZE0vR0xhQ1hOd3FZTDZ3dC81QVBVbmI6NzhTZTU0ZllNVWFpRTRqK2RNL0dMYUNYTm1MUCsiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzaXplIjogODMzMjY4OSwKICAgICAgICAgICAgIm5hbWUiOiAiMzliM2Q4YThhZWRmZmMxYjQwODIwZjIwNWY2YTRkYzA0MWNkMzcyNjI4ODBlNTAzMGIwMDgxNzVjNDViMGM0NiIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJpbmRpY2F0b3IiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJpbmRpY2F0b3ItLWZkZWNkYjU0LTBiMmUtNDc3OS1hOTBiLTUwYzc2MjlhYmZkNyIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJuYW1lIjogIjM5YjNkOGE4YWVkZmZjMWI0MDgyMGYyMDVmNmE0ZGMwNDFjZDM3MjYyODgwZTUwMzBiMDA4MTc1YzQ1YjBjNDYiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNLCB3aGljaCBpcyBkZXNpZ25lZCB0byBoYW5kbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBjb25uZWN0aW9uIHBhcmFtZXRlcnMsIHNldCB1cCBsb2dnaW5nLCBjb25maWd1cmUgYSBXZWJTb2NrZXQgY29ubmVjdG9yLCBjcmVhdGUgc2VydmljZSBpbnN0YW5jZXMsIGFuZCBkZWZpbmUgcmVxdWVzdCBoYW5kbGVycyBmb3IgZGlmZmVyZW50IHJlcXVlc3QgdHlwZXMuIFRoZSBiYWNrZG9vciB1c2VzIHRoZSBWU09DSyBwcm94eWluZywgbXVsdGktbGF5ZXJlZCB3ZWIgc2VydmljZSBjb21tdW5pY2F0aW9uLCBhbmQgdmFyaWVkIGNvbW1hbmQgZXhlY3V0aW9uIHRvIG9ic2N1cmUgaXRzIGFjdGl2aXRpZXMuIFRoZSBiYWNrZG9vciB1c2VzIEV4Y2x1c2l2ZSBPUiAoWE9SKSBjaXBoZXIgZW5jcnlwdGlvbiB0byBoaWRlIGtleSBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZS4gVGhlIGJhY2tkb29yIHZhcmlhYmxlcywgY29yZSBmdW5jdGlvbnMsIGFuZCBleHRlbmRlZCBhcmd1bWVudHMgYXJlIG9iZnVzY2F0ZWQgdXNpbmcgYSBjdXN0b20tYnVpbHQgc29waGlzdGljYXRlZCB0b29sLXNldCB0byBldmFkZSBkZXRlY3Rpb24gYW5kIGhpbmRlciBhbmFseXNpcy4gXHJcblxyXG5VcG9uIGV4ZWN1dGlvbiwgdGhlIGJhY2tkb29yIHJldHJpZXZlcyB0aHJlZSBDMiBjb25uZWN0aW9uIHBhcmFtZXRlcnMgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVsb3c6XHJcblxyXG4tLUJlZ2luIENvbmZpZ3VyYXRpb24gVmFsdWVzLS1cclxubGlzdGVuQWRkciAgPT0+IExpc3RlbiBhZGRyZXNzIGFuZCBwb3J0IChkZWZhdWx0OiBcIjEyNy4wLjAuMTo4MDkwXCIpIFxyXG5cclxubGlzdGVuUGF0aCA9PT4gTGlzdGVuIHBhdGggdG8gcm91dGUgcmVxdWVzdHMgdG8gYSBoYW5kbGVyIGZ1bmN0aW9uIChXZWJTb2NrZXQgU2VjdXJlIChXU1MpIGNvbm5lY3Rpb24pLlxyXG5cclxucGFzc3dvcmQgPT0+IEF1dGhlbnRpY2F0aW9uIGtleSAoQXV0aEtleSkuXHJcbi0tRW5kIENvbmZpZ3VyYXRpb24gVmFsdWVzLS1cclxuXHJcbklmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBhcmUgcmV0cmlldmVkLCB0aGUgYmFja2Rvb3IgaW5pdGlhdGVzIGEgZnVuY3Rpb24gdG8gY29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIGJhY2tkb29yIGNoZWNrcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBwYXRoIGFuZCBjb21wYXJlcyBpdCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgcmV0cmlldmVkIGVudmlyb25tZW50IHZhcmlhYmxlIFwiVkFSR1NcIiB0byBkZXRlcm1pbmUgaWYgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgYSBjaGlsZCBwcm9jZXNzLiBJZiB0aGV5IGRvIG5vdCBtYXRjaCwgaW5kaWNhdGluZyB0aGF0IGEgY2hpbGQgcHJvY2VzcyBpcyBub3QgcnVubmluZywgdGhlIGJhY2tkb29yIGNvcGllcyBpdHNlbGYgdG8gYSBuZXcgY29uc3RydWN0ZWQgcGF0aCBvbiB0aGUgc3lzdGVtLiBUaGUgYmFja2Rvb3Igd2lsbCB0aGVuIHByZXBlbmQgdGhlIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBlbnN1cmluZyB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIHRha2VzIHByZWNlZGVuY2UgaW4gZXhlY3V0aW9uLiBUaGUgYmFja2Rvb3Igc3RhcnRzIHRoZSBuZXcgcHJvY2VzcyBhbmQgdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbi4gXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBhIGZ1bmN0aW9uIHRvIGVuc3VyZSBpdHMgY29udGludWVkIG9wZXJhdGlvbiBhbmQgbWFpbnRhaW4gcGVyc2lzdGVuY2Ugb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gVGhpcyBzZWxmLXByZXNlcnZhdGlvbiBtZWNoYW5pc20gY2hlY2tzIGlmIHRoZSBiYWNrZG9vciBpcyBydW5uaW5nIGFzIGFuIGludGVuZGVkIHByb2Nlc3MgYW5kLCBpZiBub3QsIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBhbmQgcmUtZXhlY3V0ZXMgaXRzZWxmLiBUaGUgZnVuY3Rpb24gZmlyc3QgY2hlY2tzIHRoZSB2YWx1ZSBvZiB0aGUgcmV0cmlldmVkIGVudmlyb25tZW50IHZhcmlhYmxlIFwiVlJFR1wiIGFuZCBjb21wYXJlcyBpdCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHBhdGguIElmIHRoZSBjaGVja3MgcmV0dXJuIGEgXCJmYWxzZVwiIHZhbHVlLCB0aGVuIHRoZSBcIlZSRUdcIiBpcyBub3Qgc2V0LCBpbmRpY2F0aW5nIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIGFuZCB0aGUgYmFja2Rvb3Igd2lsbCByZS1pbnN0YWxsIGl0c2VsZiB0byBhIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIG9uIHRoZSBzeXN0ZW0uIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIHRoZSBuZXcgY29uc3RydWN0ZWQgcGF0aCB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciBmaWxlIGlzIGV4ZWN1dGVkLiBUaGUgcGFyZW50IGJhY2tkb29yIHRoZW4gdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbiwgYWxsb3dpbmcgdGhlIG5ldyBwcm9jZXNzIHRvIGNvbnRpbnVlIHJ1bm5pbmcuIElmIHRoZSBpbml0aWFsIGNoZWNrcyBjb25maXJtIHRoYXQgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgaW50ZW5kZWQsIHRoZW4gdGhlIFwiVlJFR1wiIGlzIHNldCwgYW5kIHRoZSBmdW5jdGlvbiBhbGxvd3MgdGhlIGNvZGUgdG8gY29udGludWUgaXRzIG5vcm1hbCBtYWxpY2lvdXMgb3BlcmF0aW9ucy5cclxuXHJcblRoZSBiYWNrZG9vciBhdHRlbXB0cyB0byBlc3RhYmxpc2ggYSBXU1Mgc2VydmVyIHdpdGggbWluaW1hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuIFRoaXMgc2V0dXAgYWxsb3dzIGZvciBlbmNyeXB0ZWQgY29tbXVuaWNhdGlvbiB3aXRob3V0IHJlbHlpbmcgb24gYSBwdWJsaWNseSB0cnVzdGVkIENlcnRpZmljYXRlIEF1dGhvcml0eSBvciBjZXJ0aWZpY2F0ZSBmaWxlcyBvbiBkaXNrLiBUaGUgYmFja2Rvb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVzIGEgc2VsZi1zaWduZWQgWC41MDkgY2VydGlmaWNhdGUgYW5kIGEgY29ycmVzcG9uZGluZyAyMDQ4LWJpdCBwcml2YXRlIGtleSBpbiBtZW1vcnkuIFRoZSBpbi1tZW1vcnkgZ2VuZXJhdGVkIGNlcnRpZmljYXRlIGFuZCB0aGUgcHJpdmF0ZSBrZXkgYXJlIHRoZW4gbG9hZGVkIGludG8gYSBcInRscy5DZXJ0aWZpY2F0ZVwiIHN0cnVjdCwgd2hpY2ggaXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgQ2VydGlmaWNhdGVzIGZpZWxkIG9mIGEgXCJ0bHMuQ29uZmlnXCIgb2JqZWN0LiBBIHN0YW5kYXJkIFwibmV0L2h0dHBcIiBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byB1c2UgdGhpcyBjdXN0b20gXCJ0bHMuQ29uZmlnXCIgdG8gaGFuZGxlIEhUVFBTL1dTUyBjb25uZWN0aW9ucy4gXHJcblxyXG5UaGUgYmFja2Rvb3IgdXRpbGl6ZXMgYSBzaW5nbGUsIG11bHRpcGxleGVkIGNvbm5lY3Rpb24gb3ZlciBXU1MgdG8gYSBzcGVjaWZpZWQgQzIgYWRkcmVzcyAobGlzdGVuQWRkcikgYW5kIHBhdGggKGxpc3RlblBhdGgpLiBUaGUgYmFja2Rvb3IgaW1wbGVtZW50cyBhIGN1c3RvbSBhdXRoZW50aWNhdGlvbiBjaGVjaywgaW52b2x2aW5nIHRoZSBzcGVjaWZpYyBwcmUtc2hhcmVkIEF1dGhLZXkgKHBhc3N3b3JkKSwgZHVyaW5nIG9yIGJlZm9yZSB0aGUgV1NTIGhhbmRzaGFrZSwgdGhlIGNvbm5lY3Rpb24gdXBncmFkZSBwcm9jZXNzLiBPbmNlIHRoZSBXU1MgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYWxsIGNvbW11bmljYXRpb24gaXMgZW5jcnlwdGVkLiBUaGlzIGVuY3J5cHRpb24gbGV2ZXJhZ2VzIHRoZSBpbi1tZW1vcnkgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzLlxyXG5cclxuT25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBDMiBzZXJ2ZXIgdmlhIFdlYlNvY2tldHMsIHRoZSBiYWNrZG9vciByZWNlaXZlcyBjb21tYW5kcyB0aGF0IGFyZSBkaXJlY3RlZCB0byBzcGVjaWZpYyBoYW5kbGVycyB0byBwZXJmb3JtIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFxyXG5cclxuRGlzcGxheWVkIGJlbG93IGFyZSB0aGUgZm91ciBjb3JlIGhhbmRsZXJzIGFuZCB0aGVpciBmdW5jdGlvbnM6IFxyXG5cclxuLS1CZWdpbiBDb3JlIEhhbmRsZXJzLS0gXHJcblxyXG5hLiBUaGUgV2ViU2VydmljZSBoYW5kbGVyIChGaWd1cmUgMSkgZXN0YWJsaXNoZXMgY292ZXJ0IEMyIGNvbW11bmljYXRpb24gYnkgbWFraW5nIHRoZSBiYWNrZG9vciBhcHBlYXIgYXMgYSBsZWdpdGltYXRlIHdlYiBzZXJ2ZXIuIFRoZSBoYW5kbGVyIHVzZXMgdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLCBsZXZlcmFnaW5nIHRoZSBcIm5ldC9odHRwIHBhY2thZ2VcIiB0byBjcmVhdGUgYSB3ZWIgc2VydmVyIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIEEgZGVkaWNhdGVkIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSAoQVBJKSBcIi9hcGkvXCIgZW5kcG9pbnQgaXMgY3JlYXRlZCB0byByZWNlaXZlIGFuZCBleGVjdXRlIGNvbW1hbmRzIGZyb20gdGhlIFRBJ3MgQzIgc2VydmVyLiBUaGlzIHByb3ZpZGVzIHRoZSBUQSB3aXRoIGV4dGVuc2l2ZSBjb250cm9sIG92ZXIgdGhlIHZpY3RpbSdzIGZpbGUgc3lzdGVtLCBhbGxvd2luZyB0aGUgVEEgdG8gYnJvd3NlLCB2aWV3LCBjcmVhdGUsIGRlbGV0ZSwgdXBsb2FkLCBhbmQgZG93bmxvYWQgZmlsZXMgYW5kIGZvbGRlcnMuIFxyXG5cclxuYi4gVGhlIENvbW1hbmQgaGFuZGxlciAoRmlndXJlIDIpIGV4ZWN1dGVzIHNoZWxsIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0sIGdyYW50aW5nIHRoZSBUQSBpbnRlcmFjdGl2ZSBjb21tYW5kLWxpbmUgYWNjZXNzLiBUaGUgaGFuZGxlciBpbml0aWF0ZXMgYSByZXF1ZXN0IHRocm91Z2ggaXRzIGNvdmVydCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCBwYXJzZSBhIEpTT04gcGF5bG9hZCBpbnRvIHRoZSBhIHNwZWNpZmljIHN0cnVjdHVyZSwgZXh0cmFjdHMgYW5kIGV4ZWN1dGVzIGFuIGV4dGVybmFsIGNvbW1hbmQsIHNwZWNpZmljYWxseSBlc3RhYmxpc2hpbmcgYSBwc2V1ZG8tdGVybWluYWwgY29ubmVjdGlvbiB0byBpdCwgZW5hYmxpbmcgaW50ZXJhY3RpdmUgY29udHJvbCBhbmQgZGF0YSBleGNoYW5nZSB3aXRoIHRoZSBydW5uaW5nIGNvbW1hbmQuXHJcblxyXG5jLiBUaGUgVlNPQ0stcHJveHkgaGFuZGxlciAoRmlndXJlIDMpIGltcGxlbWVudHMgYSBwcm94eSB0aGF0IGR5bmFtaWNhbGx5IGNvbmZpZ3VyZXMgaXRzIG91dGdvaW5nIGNvbm5lY3Rpb25zIGJhc2VkIG9uIGEgSlNPTiBwYXlsb2FkIHJlY2VpdmVkIGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LiBUaGUgaGFuZGxlciBwcm9jZXNzZXMgYW4gaW5jb21pbmcgbmV0d29yayByZXF1ZXN0IGNvbnRhaW5pbmcgYSBKU09OIHBheWxvYWQgd2l0aCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyB0byBlc3RhYmxpc2ggYSB0dW5uZWxlZCBjb25uZWN0aW9uLiBUaGUgaGFuZGxlciB1bm1hcnNoYWxzIHRoZSBKU09OIGRhdGEgYW5kIHZhbGlkYXRlcyB0aGUgZXh0cmFjdGVkIGFyZ3VtZW50cyBiZWxvdzpcclxuXHJcbi0tQmVnaW4gQ29uZmlndXJhdGlvbiBBcmd1bWVudHMtLVxyXG5UdW5uZWxBZGRyOiAgVGhlIGRlc3RpbmF0aW9uIG5ldHdvcmsgYWRkcmVzcyAoSVAgYWRkcmVzcyBvciBob3N0bmFtZSkgd2hlcmUgdGhlIHByb3h5IHdpbGwgZm9yd2FyZCBkYXRhIGZyb20gdGhlIFZTT0NLIGNvbm5lY3Rpb24uXHJcbkNvbnRleHQgSUQgKENJRCk6IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdmlydHVhbCBtYWNoaW5lIG9yIHRoZSBob3N0IHdpdGhpbiB0aGUgVlNPQ0sgZW52aXJvbm1lbnQuXHJcblBvcnQ6IFRoZSBwb3J0IG51bWJlciB1c2VkIGZvciB0aGUgY29ubmVjdGlvblxyXG5GYW1pbHkgPT0+IFRoZSBhZGRyZXNzIHR5cGUgc3BlY2lmaWVkIGFzIEFGX1ZTT0NLXHJcbi0tRW5kIENvbmZpZ3VyYXRpb24gQXJndW1lbnRzLS1cclxuXHJcblVzaW5nIHRoZSB2YWxpZGF0ZWQgYXJndW1lbnRzLCB0aGUgaGFuZGxlciBiaW5kcyB0byBhIHNwZWNpZmljIFZTT0NLIGFkZHJlc3MgKGRlZmluZWQgYnkgdGhlIENJRCBhbmQgUG9ydCkuIEl0IHRoZW4gZXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgYnkgXCJUdW5uZWxBZGRyXCIuIFRoZSBoYW5kbGVyIHJlbGF5cyB0cmFmZmljIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHRhcmdldCBzZXJ2ZXIuIFRoaXMgY2FuIGJlIGEgZGlyZWN0IHR1bm5lbCBvciBhIHJlbGF5IHZpYSB0aGUgcHJveHksIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbi4gVGhlIFZTT0NLLXByb3h5IGNhbiBiZSB1c2VkIHRvIG1haW50YWluIGNvdmVydCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCBldmFkZSBkZXRlY3Rpb24sIGFuZCBwaXZvdCB3aXRoaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiBVcG9uIGNvbXBsZXRpb24gb3IgdGVybWluYXRpb24gb2YgdGhlIGNvbm5lY3Rpb24sIHRoZSBoYW5kbGVyIHNlbmRzIGFuIGFwcHJvcHJpYXRlIHN1Y2Nlc3Mgb3IgZXJyb3IgcmVzcG9uc2UgYmFjayB0byB0aGUgY2xpZW50LlxyXG5cclxuZC4gVGhlIFZTT0NLIGNvbm5lY3Rpb24gaGFuZGxlciAoRmlndXJlIDQpIHByb2Nlc3NlcyBhbiBpbmNvbWluZyBuZXR3b3JrIHJlcXVlc3QgY29udGFpbmluZyBhIEpTT04gcGF5bG9hZCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYXJndW1lbnRzIHRvIGNvbm5lY3QgdG8gYSBWU09DSyBlbmRwb2ludC4gVGhlIGhhbmRsZXIgZXh0cmFjdHMgdGhlIEpTT04gcGF5bG9hZCBmcm9tIHRoZSByZXF1ZXN0IGFuZCB1c2VzIGEgSlNPTiBwYXJzZXIgdG8gdW5tYXJzaGFsIHRoZSBkYXRhIGludG8gYSBzdHJ1Y3R1cmVkIG9iamVjdCB3aXRoIGZpZWxkcyBmb3IgQ0lELCBQb3J0LCBhbmQgRmFtaWx5LiBUaGUgaGFuZGxlciBjaGVja3MgdGhlIHVubWFyc2hhbGxlZCBkYXRhIGZvciB2YWxpZGl0eSBhbmQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQsIHRoZSBoYW5kbGVyIGNyZWF0ZXMgb3IgY29ubmVjdHMgdG8gYSBWU09DSyBlbmRwb2ludCB1c2luZyBhIHNwZWNpZmllZCBDSUQgYW5kIFBvcnQgbnVtYmVyLiBJZiB0aGUgdmlydHVhbCBzb2NrZXQgY3JlYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIGhhbmRsZXIgYWxsb2NhdGVzIGEgbmV3IHJ1bnRpbWUgb2JqZWN0IHRvIGhvbGQgdGhlIENJRCBhbmQgcG9ydCBpbmZvcm1hdGlvbi4gSWYgdW5tYXJzaGFsbGluZyBmYWlscywgdmFsaWRhdGlvbiBmYWlscywgb3IgdGhlIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkLCB0aGUgaGFuZGxlciByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIHRvIHRoZSBjbGllbnQuXHJcblxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS0iLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiICduYW1lc3BhY2UnPSdDSVNBX0NvbnNvbGlkYXRlZC55YXJhJyBydWxlX25hbWU9Q0lTQV8yNTExNTVfMDIgcnVsZV9jb250ZW50PXJ1bGUgQ0lTQV8yNTExNTVfMDIgOiBCUklDS1NUT1JNIGJhY2tkb29yIGluc3RhbGxzX290aGVyX2NvbXBvbmVudHMgY29tbXVuaWNhdGVzX3dpdGhfYzIgZXhmaWx0cmF0ZXNfZGF0YVxue1xuICAgbWV0YTpcbiAgICAgICBhdXRob3IgPSBcIkNJU0EgQ29kZSAmIE1lZGlhIEFuYWx5c2lzXCJcbiAgICAgICBpbmNpZGVudCA9IFwiMjUxMTU1XCJcbiAgICAgICBkYXRlID0gXCIyMDI1LTA5LTE1XCJcbiAgICAgICBsYXN0X21vZGlmaWVkID0gXCIyMDI1MDkxNl8xNTExXCJcbiAgICAgICBhY3RvciA9IFwibi9hXCJcbiAgICAgICBmYW1pbHkgPSBcIkJSSUNLU1RPUk1cIlxuICAgICAgIGNhcGFiaWxpdGllcyA9IFwiaW5zdGFsbHMtb3RoZXItY29tcG9uZW50cyBjb21tdW5pY2F0ZXMtd2l0aC1jMiBleGZpbHRyYXRlcy1kYXRhXCJcbiAgICAgICBtYWx3YXJlX3R5cGUgPSBcImJhY2tkb29yXCJcbiAgICAgICB0b29sX3R5cGUgPSBcInVua25vd25cIlxuICAgICAgIGRlc2NyaXB0aW9uID0gXCJEZXRlY3RzIEdvLUJhc2VkIEJSSUNLU1RPUk0gYmFja2Rvb3Igc2FtcGxlc1wiXG4gICAgICAgc2hhMjU2XzEgPSBcIjMyMGEwYjVkNDkwMDY5N2UxMjVjZWJiNWZmMDNkZWU3MzY4ZjhmMDg3ZGIxYzE1NzBiMGI2MmY1YTk4NmQ3NTlcIlxuICAgICAgIHNoYTI1Nl8xID0gXCJkZmFjMjU0MmEwZWU2NWM0NzRiOTFkM2IzNTI1NDBhMjRmNGUyMjNmMWI4MDhiNzQxY2ZlNjgwMjYzZjBlZTQ0XCJcbiAgICAgICBzaGEyNTZfMSA9IFwiYjkxODgxY2IxYWE4NjExMzhmMjA2M2VjMTMwYjJiMDFhOGFhZjBlM2YwNDkyMWU1Y2JmYzYxYjA5MDI0YmYxMlwiXG4gICAgICAgc2hhMjU2XzEgPSBcImJmYjNmZmQ0NmIyMWIyMjgxMzc0Y2Q2MGJjNzU2ZmUyZGNjMzI0ODZkY2MxNTZjOWJkOThmMjQxMDExNDU0NTRcIlxuICAgc3RyaW5nczpcbiAgICAgICAkczAgPSB7IDA0IDMwIDBGIEI2IDU0IDA0IDJDIDMxIEQxIDg4IDRDIDA0IDM0IDQ4IEZGIEMwIH1cbiAgICAgICAkczEgPSB7IDQ4IDgzIEY4IDA0IDdDIEU3IDQ4IEM3IDA0IDI0IH1cbiAgICAgICAkczIgPSB7IDQ4IDhEIDQ0IDI0IDM0IDQ4IDg5IDQ0IDI0IDA4IDQ4IEM3IDQ0IDI0IDEwIDA0IH1cbiAgICAgICAkczMgPSB7IDQ4IDg5IDQ0IDI0IDQ4IDQ4IDg5IDRDIDI0IDUwIDQ4IDhCIDZDIDI0IDM4IDQ4IH1cbiAgICAgICAkczQgPSB7IDQ4IDgzIEVDIDQwIDQ4IDg5IDZDIDI0IDM4IDQ4IDhEIDZDIDI0IDM4IEM3IDQ0IDI0IH1cbiAgICAgICAkczUgPSB7IDgzIEVDIDM4IDQ4IDg5IDZDIDI0IDMwIDQ4IDhEIDZDIDI0IDMwIEM2IDQ0IDI0IH1cbiAgICAgICAkczYgPSB7IDRDIDI0IDIwIDQ4IDg5IDQ0IDI0IDQwIDQ4IDg5IDRDIDI0IDQ4IDQ4IDhCIDZDIH1cbiAgICAgICAkczcgPSB7IDY0IDQ4IDhCIDBDIDI1IEY4IEZGIEZGIEZGIDQ4IDNCIDYxIDEwIDBGIDg2IDgxIH1cbiAgICAgICAkczggPSB7IDY0IDQ4IDhCIDBDIDI1IEY4IEZGIEZGIEZGIDQ4IDNCIDYxIDEwIDBGIDg2IDkxIH1cbiAgIGNvbmRpdGlvbjpcbiAgICAgIGFsbCBvZiB0aGVtXG59XG4iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInlhcmEiLAogICAgICAgICAgICAidmFsaWRfZnJvbSI6ICIyMDI1LTEyLTAyVDE2OjA3OjIzLjc5MTIyMVoiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUtYW5hbHlzaXMiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLWFuYWx5c2lzLS1lM2NmMTk2YS1kZGQwLTRiMzMtOWI0MC1lOTU4NjJkNTlkNDQiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAicHJvZHVjdCI6ICJlc2V0IiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicmVzdWx0X25hbWUiOiAiYSB2YXJpYW50IG9mIExpbnV4L0JyaWNrU3Rvcm0uQSB0cm9qYW4iLAogICAgICAgICAgICAicmVzdWx0IjogInVua25vd24iLAogICAgICAgICAgICAic2FtcGxlX3JlZiI6ICJmaWxlLS0xY2NiMzFhMi1jMTA1LTUxODgtODU2MC0yZDQ4ZWE1YTUxNzkiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLS1kNzVhYTBhNC00NTJhLTQwY2YtOTNhOS1iMjY1NWY4NWZiNGMiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNLCB3aGljaCBpcyBkZXNpZ25lZCB0byBoYW5kbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBjb25uZWN0aW9uIHBhcmFtZXRlcnMsIHNldCB1cCBsb2dnaW5nLCBjb25maWd1cmUgYSBXZWJTb2NrZXQgY29ubmVjdG9yLCBjcmVhdGUgc2VydmljZSBpbnN0YW5jZXMsIGFuZCBkZWZpbmUgcmVxdWVzdCBoYW5kbGVycyBmb3IgZGlmZmVyZW50IHJlcXVlc3QgdHlwZXMuIFRoZSBiYWNrZG9vciB1c2VzIHRoZSBWU09DSyBwcm94eWluZywgbXVsdGktbGF5ZXJlZCB3ZWIgc2VydmljZSBjb21tdW5pY2F0aW9uLCBhbmQgdmFyaWVkIGNvbW1hbmQgZXhlY3V0aW9uIHRvIG9ic2N1cmUgaXRzIGFjdGl2aXRpZXMuIFRoZSBiYWNrZG9vciB1c2VzIEV4Y2x1c2l2ZSBPUiAoWE9SKSBjaXBoZXIgZW5jcnlwdGlvbiB0byBoaWRlIGtleSBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZS4gVGhlIGJhY2tkb29yIHZhcmlhYmxlcywgY29yZSBmdW5jdGlvbnMsIGFuZCBleHRlbmRlZCBhcmd1bWVudHMgYXJlIG9iZnVzY2F0ZWQgdXNpbmcgYSBjdXN0b20tYnVpbHQgc29waGlzdGljYXRlZCB0b29sLXNldCB0byBldmFkZSBkZXRlY3Rpb24gYW5kIGhpbmRlciBhbmFseXNpcy4gXHJcblxyXG5VcG9uIGV4ZWN1dGlvbiwgdGhlIGJhY2tkb29yIHJldHJpZXZlcyB0aHJlZSBDMiBjb25uZWN0aW9uIHBhcmFtZXRlcnMgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVsb3c6XHJcblxyXG4tLUJlZ2luIENvbmZpZ3VyYXRpb24gVmFsdWVzLS1cclxubGlzdGVuQWRkciAgPT0+IExpc3RlbiBhZGRyZXNzIGFuZCBwb3J0IChkZWZhdWx0OiBcIjEyNy4wLjAuMTo4MDkwXCIpIFxyXG5cclxubGlzdGVuUGF0aCA9PT4gTGlzdGVuIHBhdGggdG8gcm91dGUgcmVxdWVzdHMgdG8gYSBoYW5kbGVyIGZ1bmN0aW9uIChXZWJTb2NrZXQgU2VjdXJlIChXU1MpIGNvbm5lY3Rpb24pLlxyXG5cclxucGFzc3dvcmQgPT0+IEF1dGhlbnRpY2F0aW9uIGtleSAoQXV0aEtleSkuXHJcbi0tRW5kIENvbmZpZ3VyYXRpb24gVmFsdWVzLS1cclxuXHJcbklmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBhcmUgcmV0cmlldmVkLCB0aGUgYmFja2Rvb3IgaW5pdGlhdGVzIGEgZnVuY3Rpb24gdG8gY29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIGJhY2tkb29yIGNoZWNrcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBwYXRoIGFuZCBjb21wYXJlcyBpdCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgcmV0cmlldmVkIGVudmlyb25tZW50IHZhcmlhYmxlIFwiVkFSR1NcIiB0byBkZXRlcm1pbmUgaWYgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgYSBjaGlsZCBwcm9jZXNzLiBJZiB0aGV5IGRvIG5vdCBtYXRjaCwgaW5kaWNhdGluZyB0aGF0IGEgY2hpbGQgcHJvY2VzcyBpcyBub3QgcnVubmluZywgdGhlIGJhY2tkb29yIGNvcGllcyBpdHNlbGYgdG8gYSBuZXcgY29uc3RydWN0ZWQgcGF0aCBvbiB0aGUgc3lzdGVtLiBUaGUgYmFja2Rvb3Igd2lsbCB0aGVuIHByZXBlbmQgdGhlIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBlbnN1cmluZyB0aGUgbmV3bHkgY29waWVkIGJhY2tkb29yIHRha2VzIHByZWNlZGVuY2UgaW4gZXhlY3V0aW9uLiBUaGUgYmFja2Rvb3Igc3RhcnRzIHRoZSBuZXcgcHJvY2VzcyBhbmQgdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbi4gXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBhIGZ1bmN0aW9uIHRvIGVuc3VyZSBpdHMgY29udGludWVkIG9wZXJhdGlvbiBhbmQgbWFpbnRhaW4gcGVyc2lzdGVuY2Ugb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gVGhpcyBzZWxmLXByZXNlcnZhdGlvbiBtZWNoYW5pc20gY2hlY2tzIGlmIHRoZSBiYWNrZG9vciBpcyBydW5uaW5nIGFzIGFuIGludGVuZGVkIHByb2Nlc3MgYW5kLCBpZiBub3QsIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBhbmQgcmUtZXhlY3V0ZXMgaXRzZWxmLiBUaGUgZnVuY3Rpb24gZmlyc3QgY2hlY2tzIHRoZSB2YWx1ZSBvZiB0aGUgcmV0cmlldmVkIGVudmlyb25tZW50IHZhcmlhYmxlIFwiVlJFR1wiIGFuZCBjb21wYXJlcyBpdCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHBhdGguIElmIHRoZSBjaGVja3MgcmV0dXJuIGEgXCJmYWxzZVwiIHZhbHVlLCB0aGVuIHRoZSBcIlZSRUdcIiBpcyBub3Qgc2V0LCBpbmRpY2F0aW5nIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIGFuZCB0aGUgYmFja2Rvb3Igd2lsbCByZS1pbnN0YWxsIGl0c2VsZiB0byBhIG5ldyBjb25zdHJ1Y3RlZCBwYXRoIG9uIHRoZSBzeXN0ZW0uIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIHRoZSBuZXcgY29uc3RydWN0ZWQgcGF0aCB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciBmaWxlIGlzIGV4ZWN1dGVkLiBUaGUgcGFyZW50IGJhY2tkb29yIHRoZW4gdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbiwgYWxsb3dpbmcgdGhlIG5ldyBwcm9jZXNzIHRvIGNvbnRpbnVlIHJ1bm5pbmcuIElmIHRoZSBpbml0aWFsIGNoZWNrcyBjb25maXJtIHRoYXQgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgaW50ZW5kZWQsIHRoZW4gdGhlIFwiVlJFR1wiIGlzIHNldCwgYW5kIHRoZSBmdW5jdGlvbiBhbGxvd3MgdGhlIGNvZGUgdG8gY29udGludWUgaXRzIG5vcm1hbCBtYWxpY2lvdXMgb3BlcmF0aW9ucy5cclxuXHJcblRoZSBiYWNrZG9vciBhdHRlbXB0cyB0byBlc3RhYmxpc2ggYSBXU1Mgc2VydmVyIHdpdGggbWluaW1hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuIFRoaXMgc2V0dXAgYWxsb3dzIGZvciBlbmNyeXB0ZWQgY29tbXVuaWNhdGlvbiB3aXRob3V0IHJlbHlpbmcgb24gYSBwdWJsaWNseSB0cnVzdGVkIENlcnRpZmljYXRlIEF1dGhvcml0eSBvciBjZXJ0aWZpY2F0ZSBmaWxlcyBvbiBkaXNrLiBUaGUgYmFja2Rvb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVzIGEgc2VsZi1zaWduZWQgWC41MDkgY2VydGlmaWNhdGUgYW5kIGEgY29ycmVzcG9uZGluZyAyMDQ4LWJpdCBwcml2YXRlIGtleSBpbiBtZW1vcnkuIFRoZSBpbi1tZW1vcnkgZ2VuZXJhdGVkIGNlcnRpZmljYXRlIGFuZCB0aGUgcHJpdmF0ZSBrZXkgYXJlIHRoZW4gbG9hZGVkIGludG8gYSBcInRscy5DZXJ0aWZpY2F0ZVwiIHN0cnVjdCwgd2hpY2ggaXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgQ2VydGlmaWNhdGVzIGZpZWxkIG9mIGEgXCJ0bHMuQ29uZmlnXCIgb2JqZWN0LiBBIHN0YW5kYXJkIFwibmV0L2h0dHBcIiBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byB1c2UgdGhpcyBjdXN0b20gXCJ0bHMuQ29uZmlnXCIgdG8gaGFuZGxlIEhUVFBTL1dTUyBjb25uZWN0aW9ucy4gXHJcblxyXG5UaGUgYmFja2Rvb3IgdXRpbGl6ZXMgYSBzaW5nbGUsIG11bHRpcGxleGVkIGNvbm5lY3Rpb24gb3ZlciBXU1MgdG8gYSBzcGVjaWZpZWQgQzIgYWRkcmVzcyAobGlzdGVuQWRkcikgYW5kIHBhdGggKGxpc3RlblBhdGgpLiBUaGUgYmFja2Rvb3IgaW1wbGVtZW50cyBhIGN1c3RvbSBhdXRoZW50aWNhdGlvbiBjaGVjaywgaW52b2x2aW5nIHRoZSBzcGVjaWZpYyBwcmUtc2hhcmVkIEF1dGhLZXkgKHBhc3N3b3JkKSwgZHVyaW5nIG9yIGJlZm9yZSB0aGUgV1NTIGhhbmRzaGFrZSwgdGhlIGNvbm5lY3Rpb24gdXBncmFkZSBwcm9jZXNzLiBPbmNlIHRoZSBXU1MgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYWxsIGNvbW11bmljYXRpb24gaXMgZW5jcnlwdGVkLiBUaGlzIGVuY3J5cHRpb24gbGV2ZXJhZ2VzIHRoZSBpbi1tZW1vcnkgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzLlxyXG5cclxuT25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBDMiBzZXJ2ZXIgdmlhIFdlYlNvY2tldHMsIHRoZSBiYWNrZG9vciByZWNlaXZlcyBjb21tYW5kcyB0aGF0IGFyZSBkaXJlY3RlZCB0byBzcGVjaWZpYyBoYW5kbGVycyB0byBwZXJmb3JtIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFxyXG5cclxuRGlzcGxheWVkIGJlbG93IGFyZSB0aGUgZm91ciBjb3JlIGhhbmRsZXJzIGFuZCB0aGVpciBmdW5jdGlvbnM6IFxyXG5cclxuLS1CZWdpbiBDb3JlIEhhbmRsZXJzLS0gXHJcblxyXG5hLiBUaGUgV2ViU2VydmljZSBoYW5kbGVyIChGaWd1cmUgMSkgZXN0YWJsaXNoZXMgY292ZXJ0IEMyIGNvbW11bmljYXRpb24gYnkgbWFraW5nIHRoZSBiYWNrZG9vciBhcHBlYXIgYXMgYSBsZWdpdGltYXRlIHdlYiBzZXJ2ZXIuIFRoZSBoYW5kbGVyIHVzZXMgdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLCBsZXZlcmFnaW5nIHRoZSBcIm5ldC9odHRwIHBhY2thZ2VcIiB0byBjcmVhdGUgYSB3ZWIgc2VydmVyIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIEEgZGVkaWNhdGVkIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSAoQVBJKSBcIi9hcGkvXCIgZW5kcG9pbnQgaXMgY3JlYXRlZCB0byByZWNlaXZlIGFuZCBleGVjdXRlIGNvbW1hbmRzIGZyb20gdGhlIFRBJ3MgQzIgc2VydmVyLiBUaGlzIHByb3ZpZGVzIHRoZSBUQSB3aXRoIGV4dGVuc2l2ZSBjb250cm9sIG92ZXIgdGhlIHZpY3RpbSdzIGZpbGUgc3lzdGVtLCBhbGxvd2luZyB0aGUgVEEgdG8gYnJvd3NlLCB2aWV3LCBjcmVhdGUsIGRlbGV0ZSwgdXBsb2FkLCBhbmQgZG93bmxvYWQgZmlsZXMgYW5kIGZvbGRlcnMuIFxyXG5cclxuYi4gVGhlIENvbW1hbmQgaGFuZGxlciAoRmlndXJlIDIpIGV4ZWN1dGVzIHNoZWxsIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0sIGdyYW50aW5nIHRoZSBUQSBpbnRlcmFjdGl2ZSBjb21tYW5kLWxpbmUgYWNjZXNzLiBUaGUgaGFuZGxlciBpbml0aWF0ZXMgYSByZXF1ZXN0IHRocm91Z2ggaXRzIGNvdmVydCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCBwYXJzZSBhIEpTT04gcGF5bG9hZCBpbnRvIHRoZSBhIHNwZWNpZmljIHN0cnVjdHVyZSwgZXh0cmFjdHMgYW5kIGV4ZWN1dGVzIGFuIGV4dGVybmFsIGNvbW1hbmQsIHNwZWNpZmljYWxseSBlc3RhYmxpc2hpbmcgYSBwc2V1ZG8tdGVybWluYWwgY29ubmVjdGlvbiB0byBpdCwgZW5hYmxpbmcgaW50ZXJhY3RpdmUgY29udHJvbCBhbmQgZGF0YSBleGNoYW5nZSB3aXRoIHRoZSBydW5uaW5nIGNvbW1hbmQuXHJcblxyXG5jLiBUaGUgVlNPQ0stcHJveHkgaGFuZGxlciAoRmlndXJlIDMpIGltcGxlbWVudHMgYSBwcm94eSB0aGF0IGR5bmFtaWNhbGx5IGNvbmZpZ3VyZXMgaXRzIG91dGdvaW5nIGNvbm5lY3Rpb25zIGJhc2VkIG9uIGEgSlNPTiBwYXlsb2FkIHJlY2VpdmVkIGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LiBUaGUgaGFuZGxlciBwcm9jZXNzZXMgYW4gaW5jb21pbmcgbmV0d29yayByZXF1ZXN0IGNvbnRhaW5pbmcgYSBKU09OIHBheWxvYWQgd2l0aCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyB0byBlc3RhYmxpc2ggYSB0dW5uZWxlZCBjb25uZWN0aW9uLiBUaGUgaGFuZGxlciB1bm1hcnNoYWxzIHRoZSBKU09OIGRhdGEgYW5kIHZhbGlkYXRlcyB0aGUgZXh0cmFjdGVkIGFyZ3VtZW50cyBiZWxvdzpcclxuXHJcbi0tQmVnaW4gQ29uZmlndXJhdGlvbiBBcmd1bWVudHMtLVxyXG5UdW5uZWxBZGRyOiAgVGhlIGRlc3RpbmF0aW9uIG5ldHdvcmsgYWRkcmVzcyAoSVAgYWRkcmVzcyBvciBob3N0bmFtZSkgd2hlcmUgdGhlIHByb3h5IHdpbGwgZm9yd2FyZCBkYXRhIGZyb20gdGhlIFZTT0NLIGNvbm5lY3Rpb24uXHJcbkNvbnRleHQgSUQgKENJRCk6IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdmlydHVhbCBtYWNoaW5lIG9yIHRoZSBob3N0IHdpdGhpbiB0aGUgVlNPQ0sgZW52aXJvbm1lbnQuXHJcblBvcnQ6IFRoZSBwb3J0IG51bWJlciB1c2VkIGZvciB0aGUgY29ubmVjdGlvblxyXG5GYW1pbHkgPT0+IFRoZSBhZGRyZXNzIHR5cGUgc3BlY2lmaWVkIGFzIEFGX1ZTT0NLXHJcbi0tRW5kIENvbmZpZ3VyYXRpb24gQXJndW1lbnRzLS1cclxuXHJcblVzaW5nIHRoZSB2YWxpZGF0ZWQgYXJndW1lbnRzLCB0aGUgaGFuZGxlciBiaW5kcyB0byBhIHNwZWNpZmljIFZTT0NLIGFkZHJlc3MgKGRlZmluZWQgYnkgdGhlIENJRCBhbmQgUG9ydCkuIEl0IHRoZW4gZXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgYnkgXCJUdW5uZWxBZGRyXCIuIFRoZSBoYW5kbGVyIHJlbGF5cyB0cmFmZmljIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHRhcmdldCBzZXJ2ZXIuIFRoaXMgY2FuIGJlIGEgZGlyZWN0IHR1bm5lbCBvciBhIHJlbGF5IHZpYSB0aGUgcHJveHksIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbi4gVGhlIFZTT0NLLXByb3h5IGNhbiBiZSB1c2VkIHRvIG1haW50YWluIGNvdmVydCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCBldmFkZSBkZXRlY3Rpb24sIGFuZCBwaXZvdCB3aXRoaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiBVcG9uIGNvbXBsZXRpb24gb3IgdGVybWluYXRpb24gb2YgdGhlIGNvbm5lY3Rpb24sIHRoZSBoYW5kbGVyIHNlbmRzIGFuIGFwcHJvcHJpYXRlIHN1Y2Nlc3Mgb3IgZXJyb3IgcmVzcG9uc2UgYmFjayB0byB0aGUgY2xpZW50LlxyXG5cclxuZC4gVGhlIFZTT0NLIGNvbm5lY3Rpb24gaGFuZGxlciAoRmlndXJlIDQpIHByb2Nlc3NlcyBhbiBpbmNvbWluZyBuZXR3b3JrIHJlcXVlc3QgY29udGFpbmluZyBhIEpTT04gcGF5bG9hZCB3aXRoIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYXJndW1lbnRzIHRvIGNvbm5lY3QgdG8gYSBWU09DSyBlbmRwb2ludC4gVGhlIGhhbmRsZXIgZXh0cmFjdHMgdGhlIEpTT04gcGF5bG9hZCBmcm9tIHRoZSByZXF1ZXN0IGFuZCB1c2VzIGEgSlNPTiBwYXJzZXIgdG8gdW5tYXJzaGFsIHRoZSBkYXRhIGludG8gYSBzdHJ1Y3R1cmVkIG9iamVjdCB3aXRoIGZpZWxkcyBmb3IgQ0lELCBQb3J0LCBhbmQgRmFtaWx5LiBUaGUgaGFuZGxlciBjaGVja3MgdGhlIHVubWFyc2hhbGxlZCBkYXRhIGZvciB2YWxpZGl0eSBhbmQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQsIHRoZSBoYW5kbGVyIGNyZWF0ZXMgb3IgY29ubmVjdHMgdG8gYSBWU09DSyBlbmRwb2ludCB1c2luZyBhIHNwZWNpZmllZCBDSUQgYW5kIFBvcnQgbnVtYmVyLiBJZiB0aGUgdmlydHVhbCBzb2NrZXQgY3JlYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIGhhbmRsZXIgYWxsb2NhdGVzIGEgbmV3IHJ1bnRpbWUgb2JqZWN0IHRvIGhvbGQgdGhlIENJRCBhbmQgcG9ydCBpbmZvcm1hdGlvbi4gSWYgdW5tYXJzaGFsbGluZyBmYWlscywgdmFsaWRhdGlvbiBmYWlscywgb3IgdGhlIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkLCB0aGUgaGFuZGxlciByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIHRvIHRoZSBjbGllbnQuXHJcblxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS0iLAogICAgICAgICAgICAibWFsd2FyZV90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJ0cm9qYW4iLAogICAgICAgICAgICAgICAgImJhY2tkb29yIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaXNfZmFtaWx5IjogZmFsc2UsCiAgICAgICAgICAgICJzYW1wbGVfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJmaWxlLS0xY2NiMzFhMi1jMTA1LTUxODgtODU2MC0yZDQ4ZWE1YTUxNzkiCiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaW5kaWNhdG9yIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiaW5kaWNhdG9yLS03MWRhY2Y1ZS1lY2E5LTQyMzEtODY0Yi1kMWVhM2ZjMWFkZDgiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibmFtZSI6ICIzOWIzZDhhOGFlZGZmYzFiNDA4MjBmMjA1ZjZhNGRjMDQxY2QzNzI2Mjg4MGU1MDMwYjAwODE3NWM0NWIwYzQ2IiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiW2ZpbGU6aGFzaGVzLidNRDUnPSdhNTJlMzZhNzBiNWUwMzA3Y2JjYWE1ZmQ3Yzk3ODgyYycgT1IgZmlsZTpoYXNoZXMuJ1NIQS0xJz0nNDRhM2QzZjE1ZWY3NWQ5Mjk0MzQ1NDYyZTFiODIyNzJiMGQxMTk4NScgT1IgZmlsZTpoYXNoZXMuJ1NIQS0yNTYnPSczOWIzZDhhOGFlZGZmYzFiNDA4MjBmMjA1ZjZhNGRjMDQxY2QzNzI2Mjg4MGU1MDMwYjAwODE3NWM0NWIwYzQ2JyBPUiBmaWxlOmhhc2hlcy4nU0hBLTUxMic9J2JiZTE4ZDMyYmVmNjZjY2ZhOTMxNDY4NTExZThiYTU1YjMyOTQzZTQ3YTFkZjFlNjhiYjVjOGY4YWU5N2E1YmY5OTEyMDE4NThhZTk2MzJmYTI0ZGY1ZjZjNjc0YjZjYjI2MDI5N2ExYzExODg5Y2E2MWJkYTY4NTEzZjQ0MGNlJ10iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInN0aXgiLAogICAgICAgICAgICAicGF0dGVybl92ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJ2YWxpZF9mcm9tIjogIjIwMjUtMTItMDJUMTY6MDc6MjMuNzk2NDNaIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiZmlsZS0tYTYxODNkMjctMDAwOC01YzRmLWI4ZmMtZDdiNjdiYTU3ZDI3IiwKICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICJNRDUiOiAiMzkxMTE1MDhiZmRlODljZTZlMGZlNmFiZTAzNjU1NTIiLAogICAgICAgICAgICAgICAgIlNIQS0xIjogImY2MzlkOTQwNGMwM2FmODZjZTQ1MmRiNWM1ZTBjNTI4YjgxZGMwZDciLAogICAgICAgICAgICAgICAgIlNIQS0yNTYiOiAiMDEzMjExYzU2Y2FhYTY5NzkxNGI1YjU4NzFlNDk5OGQwMjk4OTAyZTMzNmUzNzNlYmIyN2I3ZGIzMDkxN2VhZiIsCiAgICAgICAgICAgICAgICAiU0hBLTUxMiI6ICI3NGI0YzZmN2M3Y2FlMDdjNmY4ZWRmM2YyZmIxZTkyMDZkNGYxZjk3MzRlOGU0Nzg0YjE1ZDE5MmVlYzhjZDhhNGY1OTA3OGZjMGM1NmRjNGFkMDg1NmNkZDc5MjMzN2I1YzkyZmZkM2QyMjQwYzhhMjg3YTc3NmRmNDM2M2JiYSIsCiAgICAgICAgICAgICAgICAiU1NERUVQIjogIjE5NjYwODpHYmtLc2REanJ1M1dVSU9zVzVTWVZSay9RdmsxTHpLM1JNeHkyd0JXOkd3S01qcjNPczRrL1FpTHpFUk1NZFciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzaXplIjogMjY2MDM2NjgsCiAgICAgICAgICAgICJuYW1lIjogIjAxMzIxMWM1NmNhYWE2OTc5MTRiNWI1ODcxZTQ5OThkMDI5ODkwMmUzMzZlMzczZWJiMjdiN2RiMzA5MTdlYWYiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaW5kaWNhdG9yIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiaW5kaWNhdG9yLS02MTg4YzU0Ny0zZmQwLTQ0ZWEtYTg1ZC1mNzY5YzBlMWZjMzkiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibmFtZSI6ICIwMTMyMTFjNTZjYWFhNjk3OTE0YjViNTg3MWU0OTk4ZDAyOTg5MDJlMzM2ZTM3M2ViYjI3YjdkYjMwOTE3ZWFmIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBhcnRpZmFjdCBpcyBhIG1hbGljaW91cyA2NC1iaXQgRUxGIGV4ZWN1dGFibGUgd3JpdHRlbiBpbiB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFRoZSBiaW5hcnkgaGFzIGJlZW4gaWRlbnRpZmllZCBhcyBhIGJhY2tkb29yIHZhcmlhbnQgbmFtZWQgQlJJQ0tTVE9STSB0aGF0IHVzZXMgc2V2ZXJhbCBhZHZhbmNlZCB0ZWNobmlxdWVzIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIHVzZXMgU09DS1MgcHJveHlpbmcsIG11bHRpLWxheWVyZWQgd2ViIHNlcnZpY2UgY29tbXVuaWNhdGlvbiwgYW5kIHZhcmllZCBjb21tYW5kIGV4ZWN1dGlvbiB0byBvYnNjdXJlIGl0cyBhY3Rpdml0aWVzLiBUaGUgYmFja2Rvb3IgY29tYmluZXMgc2V2ZXJhbCBzb3BoaXN0aWNhdGVkIHRlY2huaXF1ZXMsIGluY2x1ZGluZyBEb0gsIG5lc3RlZCBUTFMgZW5jcnlwdGlvbiwgYW5kIHRoZSBhYnVzZSBvZiBhIGxlZ2l0aW1hdGUgY2xvdWQgc2VydmljZSB0byBldmFkZSBkZXRlY3Rpb24uIFRoZSBiYWNrZG9vciBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHN1Y2ggYXMgZnVuY3Rpb24gbmFtZXMgYW5kIHZhcmlhYmxlIG5hbWVzLCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGV4ZWN1dGFibGUgdG8gZXZhZGUgZGV0ZWN0aW9uIGFuZCBoaW5kZXIgYW5hbHlzaXMuIFRoZSBiYWNrZG9vciBjb250YWlucyB0aGUgYXV0aGVudGljYXRpb24ga2V5LCBIVFRQUyBhbmQgV2ViU29ja2V0IGFkZHJlc3NlcyBhcyBwYXJ0IG9mIGl0cyBzb3BoaXN0aWNhdGVkLCBtdWx0aS1sYXllcmVkIEMyIGV2YXNpb24gdGVjaG5pcXVlLlxyXG5cclxuLS1CZWdpbiBFbGVtZW50cy0tXHJcblwiaGtpZ2JMS0hSX1BieTZ0NlBcIiA9PT4gYXV0aGVudGljYXRpb24ga2V5XHJcblwiaHh4cHNbOl0vL1tyZWRhY3RlZF0uY29tXCIgPT0+IEhUVFBTIGFkZHJlc3NcclxuXCJ3c3M6Ly9bcmVkYWN0ZWRdLmNvbS9ha2FtYWlcIiA9PT4gV2ViU29ja2V0IGFkZHJlc3NcclxuLS1FbmQgRWxlbWVudHMtLVxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgWE9SIGNpcGhlciBlbmNyeXB0aW9uIHRvIGhpZGUga2V5IHN0cmluZ3MsIHN1Y2ggYXMgaXRzIEludGVybmV0IFByb3RvY29sIHZlcnNpb24gNCAoSVB2NCkgYWRkcmVzc2VzIG9mIHB1YmxpYyBEb0ggc2VydmVycyBhbmQgb3RoZXIgc3RyaW5ncyB3aXRoaW4gaXRzIGNvZGUuIFVwb24gZXhlY3V0aW9uLCB0aGUgYmFja2Rvb3IgaW5pdGlhdGVzIGEgZnVuY3Rpb24gdG8gY29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIGJhY2tkb29yIHRoZW4gY2hlY2tzIGZvciB0aGUgXCJbcmVkYWN0ZWRdTkVUNFwiIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSBpZiBpdCBpcyBydW5uaW5nIGFzIGEgY2hpbGQgcHJvY2Vzcy4gSWYgXCJbcmVkYWN0ZWRdTkVUNFwiIGlzIG5vdCBzZXQsIGluZGljYXRpbmcgbm90IGEgY2hpbGQgcHJvY2VzcywgdGhlIGJhY2tkb29yIHZlcmlmaWVzIGl0cyBjdXJyZW50IGV4ZWN1dGlvbiBwYXRoIGJ5IGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUgZmlsZSBjb250ZW50cyBmcm9tIFwiL2V0Yy9zeXNjb25maWcvdm5ldGRcIi4gSWYgbm90IHJ1bm5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCBcIi9ldGMvc3lzY29uZmlnL3ZuZXRkXCIsIHRoZSBiYWNrZG9vciB0ZXJtaW5hdGVzIGl0cyBjb2RlIGV4ZWN1dGlvbi4gSWYgdGhlIGJhY2tkb29yIGV4ZWN1dGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoLCB0aGUgYmFja2Rvb3IgY29waWVzIGl0c2VsZiB0byBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGVuc3VyaW5nIHRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgdGFrZXMgcHJlY2VkZW5jZSBpbiBleGVjdXRpb24uIFRoZSBiYWNrZG9vciBleGVjdXRlcyB0aGUgY29waWVkIGJhY2tkb29yIG5hbWVkIFwidXBkYXRlbWdyXCIgZHVlIHRvIHRoZSBQQVRIIG1vZGlmaWNhdGlvbiBhbmQgdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbi4gSWYgXCJbcmVkYWN0ZWRdTkVUNFwiIGlzIHNldCwgaW5kaWNhdGluZyBhIGNoaWxkIHByb2Nlc3MsIHRoZSBiYWNrZG9vciBjb250aW51ZXMgaXRzIG1haW4gY29kZSBleGVjdXRpb24uIEFzIHBhcnQgb2YgdGhpcyBjb250aW51ZWQgZXhlY3V0aW9uLCB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGJhY2tkb29yIGF0IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiIGlzIGRlbGV0ZWQuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBhIGZ1bmN0aW9uXCIgdG8gZW5zdXJlIGl0cyBjb250aW51ZWQgb3BlcmF0aW9uIGFuZCBtYWludGFpbiBwZXJzaXN0ZW5jZSBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBUaGlzIHNlbGYgcHJlc2VydmF0aW9uIG1lY2hhbmlzbSBjaGVja3MgaWYgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgYW4gaW50ZW5kZWQgcHJvY2VzcyBhbmQsIGlmIG5vdCwgdGhlIGJhY2tkb29yIHJlLWluc3RhbGxzIGFuZCByZWV4ZWN1dGVzIGl0c2VsZi4gVGhlIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgdGhlIFwiW3JlZGFjdGVkXU5FVDNcIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgY29uZmlybXMgdGhlIGV4aXN0ZW5jZSBvZiBhIHByb2Nlc3MgbmFtZWQgXCJ2bmV0ZFwiLiBJZiB0aGUgY2hlY2tzIHJldHVybiBhIFwiZmFsc2VcIiB2YWx1ZSwgdGhlbiBcIltyZWRhY3RlZF1ORVQzXCIgaXMgbm90IHNldCwgaW5kaWNhdGluZyB0aGUgYmFja2Rvb3IgaXMgbm90IHJ1bm5pbmcgY29ycmVjdGx5LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgaXRzZWxmIGZyb20gXCIvZXRjL3N5c2NvbmZpZy92bmV0ZFwiIHRvIGEgbmV3IGxvY2F0aW9uOiBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgZmlsZSBcInVwZGF0ZW1nclwiIGlzIGV4ZWN1dGVkLiBUaGUgcGFyZW50IGJhY2tkb29yIHRoZW4gdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbiwgYWxsb3dpbmcgdGhlIG5ldyBwcm9jZXNzIHRvIGNvbnRpbnVlIHJ1bm5pbmcuIElmIHRoZSBpbml0aWFsIGNoZWNrcyBjb25maXJtIHRoYXQgdGhlIGJhY2tkb29yIGlzIHJ1bm5pbmcgYXMgaW50ZW5kZWQsIGluZGljYXRpbmcgXCJbcmVkYWN0ZWRdTkVUM1wiIGlzIHNldCwgdGhlIGZ1bmN0aW9uIGFsbG93cyB0aGUgY29kZSB0byBjb250aW51ZSBpdHMgbm9ybWFsIG1hbGljaW91cyBvcGVyYXRpb25zLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgYW4gWE9SIG9wZXJhdGlvbiB0byBkZWNyeXB0IHRoZSBJUHY0IGFkZHJlc3NlcyBmb3IgdGhlIERvSCBzZXJ2ZXJzIGJlbG93OlxyXG5cclxuLS1CZWdpbiBEb0ggQWRkcmVzc2VzLS1cclxuaHh4cHNbOl0vLzguOC44LjgvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh4eHBzWzpdLy85LjkuOS45L2Rucy1xdWVyeSAoUXVhZDkpXHJcbmh4eHBzWzpdLy85LjkuOS4xMS9kbnMtcXVlcnkgKFF1YWQ5KVxyXG5oeHhwc1s6XS8vMS4xLjEuMS9kbnMtcXVlcnkgKENsb3VkZmxhcmUpXHJcbmh4eHBzWzpdLy8xLjAuMC4xL2Rucy1xdWVyeSAoQ2xvdWRmbGFyZSlcclxuaHh4cHNbOl0vLzQ1LjkwLjI4LjE2MC9kbnMtcXVlcnkgKE5leHRETlMpXHJcbmh4eHBzWzpdLy80NS45MC4zMC4xNjAvZG5zLXF1ZXJ5IChOZXh0RE5TKVxyXG5oeHhwc1s6XS8vMTQ5LjExMi4xMTIuMTEyL2Rucy1xdWVyeSAoUXVhZDkpXHJcbmh4eHBzWzpdLy8xNDkuMTEyLjExMi4xMS9kbnMtcXVlcnkgKFF1YWQ5KVxyXG4tLUVuZCBEb0ggQWRkcmVzc2VzLS1cclxuXHJcblRoZSBiYWNrZG9vciByZWxpZXMgb24gaW50ZXJuYWwsIGxvdy1sZXZlbCBmdW5jdGlvbiBjYWxscyBmcm9tIGEgY3VzdG9tIEdvIHBhY2thZ2UgdG8gaGFuZGxlIGl0cyBuZXR3b3JrIGNvbm5lY3Rpb25zIGFuZCBjb21tYW5kIHByb2Nlc3NpbmcuIFRoZSBiYWNrZG9vciB1c2VzIERvSCB0byByZXNvbHZlIHRoZSBhZGRyZXNzZXMgb2YgaXRzIEMyIHNlcnZlcnMuIFRoZSBiYWNrZG9vciBjcmVhdGVzIGEgRE5TIHF1ZXJ5IGZvciB0aGUgbWFsaWNpb3VzIEMyIGRvbWFpbiBcIltyZWRhY3RlZF0uY29tXCIuIFRoZSBiYWNrZG9vciBlbmNyeXB0cyB0aGlzIHF1ZXJ5IGJ5IGVuY2Fwc3VsYXRpbmcgaXQgd2l0aGluIGEgc3RhbmRhcmQgSFRUUFMgcmVxdWVzdC4gVGhlIGJhY2tkb29yIHNlbmRzIHRoZSBlbmNyeXB0ZWQgSFRUUFMgcmVxdWVzdCB0byBhIGxlZ2l0aW1hdGUgcHVibGljIERvSCByZXNvbHZlciBvcGVyYXRlZCBieSBDbG91ZGZsYXJlLCBHb29nbGUsIFF1YWQ5IG9yIE5leHRETlMgdG8gcHJvY2VzcyB0aGUgcXVlcnkuIEFuYWx5c2lzIGluZGljYXRlcyB0aGF0IGlmIHRoZSByZXF1ZXN0ZWQgZG9tYWluIGlzIG5vdCBmb3VuZCBpbiB0aGUgcHVibGljIERvSCByZXNvbHZlciBjYWNoZSwgdGhlIGxlZ2l0aW1hdGUgcHVibGljIERvSCByZXNvbHZlciBmb3J3YXJkcyB0aGUgcmVxdWVzdCB0byB0aGUgbmV4dCBzZXJ2ZXIgaW4gdGhlIEROUyBoaWVyYXJjaHksIHVsdGltYXRlbHkgcmVhY2hpbmcgdGhlIFRBJ3MgRE5TIHNlcnZlciwgd2hpY2ggaXMgdGhlIGF1dGhvcml0YXRpdmUgc2VydmVyIGZvciB0aGUgbWFsaWNpb3VzIGRvbWFpbi4gVGhlIFRBJ3MgRE5TIHNlcnZlciB3aWxsIHJlc3BvbmQgd2l0aCB0aGUgY29ycmVjdCBJUCBhZGRyZXNzIGZvciB0aGUgQzIgZG9tYWluLCBhbmQgdGhpcyByZXNwb25zZSBpcyBzZW50IGJhY2sgdGhyb3VnaCB0aGUgbGVnaXRpbWF0ZSBEb0ggcmVzb2x2ZXIgdG8gdGhlIGJhY2tkb29yLiBUaGUgYmFja2Rvb3IgcmVjZWl2ZXMgdGhlIGVuY3J5cHRlZCByZXNwb25zZSwgZGVjcnlwdHMgaXQgdG8gZ2V0IHRoZSBDMiBzZXJ2ZXIncyBJUCBhZGRyZXNzLCBhbmQgZXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgbXVsdGlwbGUgbGF5ZXJzIG9mIGVuY3J5cHRpb24gZm9yIGl0cyBDMiBjb21tdW5pY2F0aW9ucy4gVGhlIGJhY2tkb29yIGNvbW11bmljYXRlcyBvdmVyIEhUVFBTIHRvIHRoZSBjbG91ZCBwbGF0Zm9ybSAoXCJoeHhwc1s6XS8vW3JlZGFjdGVkXS5jb21cIiksIHRoZW4gdXBncmFkZXMgdGhlc2Ugc2Vzc2lvbnMgdG8gV2ViU29ja2V0cyB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgVExTIGVuY3J5cHRpb24uIFRoZSBiYWNrZG9vciBzZW5kcyBIVFRQIHVwZ3JhZGUgcmVxdWVzdCB0byBjb252ZXJ0IHRoZSBpbml0aWFsIGVuY3J5cHRlZCBIVFRQUyBjb25uZWN0aW9uIGludG8gYSBwZXJzaXN0ZW50IFdlYlNvY2tldCBjb25uZWN0aW9uOiBcIndzczovL1tyZWRhY3RlZF0uY29tL2FrYW1haVwiLiBUaGUgYmFja2Rvb3IgbmVzdHMgYWRkaXRpb25hbCBsYXllcnMgb2YgVExTIGVuY3J5cHRpb24gd2l0aGluIHRoZSBXZWJTb2NrZXQgc2Vzc2lvbi4gVGhlIGJhY2tkb29yIHBlcmZvcm1zIGEgc2VyaWVzIG9mIG5lc3RlZCBUTFMgaGFuZHNoYWtlcyB3aXRoaW4gdGhlIGVzdGFibGlzaGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoZSBmaXJzdCBUTFMgaGFuZHNoYWtlIGlzIHRoZSBzdGFuZGFyZCBUTFMgaGFuZHNoYWtlIGZvciB0aGUgaW5pdGlhbCBIVFRQUyByZXF1ZXN0IHRvIHRoZSBDbG91ZGZsYXJlIHBsYXRmb3JtLiBBIHNlY29uZCBUTFMgaGFuZHNoYWtlIG9jY3VycyB3aXRoaW4gdGhlIFdlYlNvY2tldCB0dW5uZWwuIER1cmluZyB0aGlzIHN0ZXAsIHRoZSBiYWNrZG9vciBhdXRoZW50aWNhdGVzIGl0c2VsZiB0byB0aGUgQzIgc2VydmVyIHVzaW5nIGEgc3RhdGljIGF1dGhlbnRpY2F0aW9uIGtleTogXCJoa2lnYkxLSFJfUGJ5NnQ2UFwiLiBJZiBhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgYmFja2Rvb3IgcHJvY2VlZHMgdG8gc2V0IHVwIHRoZSBtdWx0aXBsZXhpbmcgbGF5ZXIuIFRoZSBiYWNrZG9vciB1c2VzIHRoZSBcIkhhc2hpQ29ycCBZYW11eFwiIGxpYnJhcnkgdG8gY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgd2l0aGluIGEgc2luZ2xlIGlubmVybW9zdCBUTFMtZW5jcnlwdGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoaXMgbWV0aG9kIG1ha2VzIHRoZSBUQSdzIGFjdGl2aXRpZXMgZGlmZmljdWx0IHRvIGRldGVjdCwgYXMgbXVsdGlwbGUgY29tbWFuZHMgYW5kIG5ldHdvcmsgdHVubmVscyBhcmUgbXVsdGlwbGV4ZWQgYW5kIGhpZGRlbiB3aXRoaW4gYSBzaW5nbGUsIGVuY3J5cHRlZCBuZXR3b3JrIHN0cmVhbS5cclxuXHJcbk9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgd2l0aCB0aGUgQzIgc2VydmVyIHZpYSBXZWJTb2NrZXRzLCB0aGUgYmFja2Rvb3IgcmVjZWl2ZXMgY29tbWFuZHMgdGhhdCBhcmUgZGlyZWN0ZWQgdG8gc3BlY2lmaWMgaGFuZGxlcnMgdG8gcGVyZm9ybSB0YXNrcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLlxyXG5cclxuRGlzcGxheWVkIGJlbG93IGFyZSB0aGUgZm91ciBjb3JlIGhhbmRsZXJzIGFuZCB0aGVpciBmdW5jdGlvbnM6XHJcblxyXG4tLUJlZ2luIENvcmUgSGFuZGxlcnMtLVxyXG5hLiBUaGUgU29ja3MgaGFuZGxlciBlc3RhYmxpc2hlcyBhIFNPQ0tTIHJlbGF5LCB3aGljaCBmYWNpbGl0YXRlcyBsYXRlcmFsIG1vdmVtZW50IHdpdGhpbiBhIGNvbXByb21pc2VkIG5ldHdvcmsgYW5kIHJvdXRlcyBDMiB0cmFmZmljLlxyXG5cclxuYi4gVGhlIFdlYlNlcnZpY2UgaGFuZGxlciBlc3RhYmxpc2hlcyBjb3ZlcnQgQzIgY29tbXVuaWNhdGlvbiBieSBtYWtpbmcgdGhlIGJhY2tkb29yIGFwcGVhciBhcyBhIGxlZ2l0aW1hdGUgd2ViIHNlcnZlci4gVGhlIGhhbmRsZXIgdXNlcyB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGxldmVyYWdpbmcgdGhlIFwibmV0L2h0dHAgcGFja2FnZVwiIGFuZCBcImdvcmlsbGEvbXV4XCIgbGlicmFyeSwgdG8gY3JlYXRlIGEgd2ViIHNlcnZlciBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBBIGRlZGljYXRlZCBBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKCBBUEkpIFwiL2FwaS9cIiBlbmRwb2ludCBpcyBjcmVhdGVkIHRvIHJlY2VpdmUgYW5kIGV4ZWN1dGUgY29tbWFuZHMgZnJvbSB0aGUgVEEncyBDMiBzZXJ2ZXIuIFRoaXMgcHJvdmlkZXMgdGhlIFRBIHdpdGggZXh0ZW5zaXZlIGNvbnRyb2wgb3ZlciB0aGUgdmljdGltJ3MgZmlsZSBzeXN0ZW0sIGFsbG93aW5nIHRoZSBUQSB0byBicm93c2UsIHZpZXcsIGNyZWF0ZSwgZGVsZXRlLCB1cGxvYWQsIGFuZCBkb3dubG9hZCBmaWxlcyBhbmQgZm9sZGVycy4gVG8gYmxlbmQgaW4gYW5kIGV2YWRlIGRldGVjdGlvbiwgdGhlIGJhY2tkb29yIHNlcnZlcyBzdGF0aWMgd2ViIGZpbGVzIChIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIChIVE1MKSwgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSwgSmF2YVNjcmlwdCkgZnJvbSBhIGRlc2lnbmF0ZWQgZGlyZWN0b3J5LiBUaGlzIG1ha2VzIHRoZSBtYWxpY2lvdXMgd2ViIHNlcnZlciBhcHBlYXIgdG8gYmUgYSBzdGFuZGFyZCB3ZWIgYXBwbGljYXRpb24uXHJcblxyXG5jLiBUaGUgQ29tbWFuZCBoYW5kbGVyIGV4ZWN1dGVzIHNoZWxsIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gd2l0aCBhIHNwZWNpZmljIHNlY3VyaXR5IGNvbnRleHQsIGdyYW50aW5nIHRoZSBUQSBpbnRlcmFjdGl2ZSBjb21tYW5kLWxpbmUgYWNjZXNzLlxyXG5cclxuZC4gVGhlIENvbW1hbmROb0NvbnRleHQgaGFuZGxlciBleGVjdXRlcyBzaGVsbCBjb21tYW5kcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtIHdpdGhvdXQgdXNpbmcgYW4gZXhwbGljaXQgc2VjdXJpdHkgY29udGV4dC5cclxuLS1FbmQgQ29yZSBIYW5kbGVycy0tIiwKICAgICAgICAgICAgImluZGljYXRvcl90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJtYWxpY2lvdXMtYWN0aXZpdHkiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJwYXR0ZXJuIjogIiAnbmFtZXNwYWNlJz0nQ0lTQV9Db25zb2xpZGF0ZWQueWFyYScgcnVsZV9uYW1lPUNJU0FfMjUxMTg2XzAxIHJ1bGVfY29udGVudD1ydWxlIENJU0FfMjUxMTg2XzAxIDogQlJJQ0tTVE9STSBiYWNrZG9vciBpbnN0YWxsc19vdGhlcl9jb21wb25lbnRzIGNvbW11bmljYXRlc193aXRoX2MyIGV4ZmlsdHJhdGVzX2RhdGFcbntcbiAgIG1ldGE6XG4gICAgICAgYXV0aG9yID0gXCJDSVNBIENvZGUgJiBNZWRpYSBBbmFseXNpc1wiXG4gICAgICAgaW5jaWRlbnQgPSBcIjI1MTE4NlwiXG4gICAgICAgZGF0ZSA9IFwiMjAyNS0xMS0xN1wiXG4gICAgICAgbGFzdF9tb2RpZmllZCA9IFwibi9hXCJcbiAgICAgICBhY3RvciA9IFwibi9hXCJcbiAgICAgICBmYW1pbHkgPSBcIkJSSUNLU1RPUk1cIlxuICAgICAgIGNhcGFiaWxpdGllcyA9IFwiaW5zdGFsbHMtb3RoZXItY29tcG9uZW50cyBjb21tdW5pY2F0ZXMtd2l0aC1jMiBleGZpbHRyYXRlcy1kYXRhXCJcbiAgICAgICBtYWx3YXJlX3R5cGUgPSBcImJhY2tkb29yXCJcbiAgICAgICB0b29sX3R5cGUgPSBcInVua25vd25cIlxuICAgICAgIGRlc2NyaXB0aW9uID0gXCJEZXRlY3RzIEdvLUJhc2VkIEJSSUNLU1RPUk0gYmFja2Rvb3Igc2FtcGxlc1wiXG4gICAgICAgc2hhMjU2XzEgPSBcIjAxMzIxMWM1NmNhYWE2OTc5MTRiNWI1ODcxZTQ5OThkMDI5ODkwMmUzMzZlMzczZWJiMjdiN2RiMzA5MTdlYWZcIiAgICAgICBcbiAgIHN0cmluZ3M6XG4gICAgICAgJHMwID0geyA0MSA4OSBGOCAzMSBGNyA4RCAzQyAzOSA4RCA3RiB9XG4gICAgICAgJHMxID0geyA0MSAzMSBGQSA0NCA4OCAxNCAzMCA0NiA4OCAwQyAwMCA0OCA4MyBDMSAwMiB9XG4gICAgICAgJHMyID0geyBCQSA2MSA2RCA2NCAzNiA4MSBGQSA2MSA2RCA2NCAzNiB9XG4gICAgICAgJHMzID0geyA0MSA4OSBGMCAzMSBGRSAwMSBDRSAwMSBENiA0OSA4MyBGOCAxRiB9XG4gICAgICAgJHM0ID0geyA0RCA4OSBDQSA0OSA4MyBGMSA1QiA0MSAyOSBGMCA0OSA4MyBGOSA0NCB9XG4gICAgICAgJHM1ID0geyA0OCA4OSBGNyA0OCA4MyBGNiA0NSA0OCA4MyBGRSA0OCB9XG4gICAgICAgJHM2ID0geyBCOCAxMSBDNiBGMyBFQiA0OCBCQiAzMSA0NiA0MiBCQiAwRSBERCBDRiBGMiB9XG4gICAgICAgJHM3ID0geyA0MSA4OSBGOCAzMSBGNyAwMSBDRiA0OCA4MyBGRSAxMSB9XG4gICBjb25kaXRpb246XG4gICAgICBhbGwgb2YgdGhlbVxufVxuIiwKICAgICAgICAgICAgInBhdHRlcm5fdHlwZSI6ICJ5YXJhIiwKICAgICAgICAgICAgInZhbGlkX2Zyb20iOiAiMjAyNS0xMi0wMlQxNjowNzoyMy44MjM3MTlaIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJtYWx3YXJlLWFuYWx5c2lzIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAibWFsd2FyZS1hbmFseXNpcy0tNjcxOGE2MDUtYjc0Yi00ZDEwLWI0MTYtZTczYjYxYzYwYzM2IiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS04ZTExMmU3Mi1hYThmLTQxOTAtYTM1OS0yOGE5YWJhZTI4OTYiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgInByb2R1Y3QiOiAiZXNldCIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInJlc3VsdF9uYW1lIjogImEgdmFyaWFudCBvZiBMaW51eC9QYWNrZWQuT2JmdXNjYXRlZC5CIHN1c3BpY2lvdXMgYXBwbGljYXRpb24iLAogICAgICAgICAgICAicmVzdWx0IjogInVua25vd24iLAogICAgICAgICAgICAic2FtcGxlX3JlZiI6ICJmaWxlLS1hNjE4M2QyNy0wMDA4LTVjNGYtYjhmYy1kN2I2N2JhNTdkMjciCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLS1iODIyMzMxYS05YTRhLTQ3OGMtODJiYi03OTFjNzA3OTZjYTciLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNIHRoYXQgdXNlcyBzZXZlcmFsIGFkdmFuY2VkIHRlY2huaXF1ZXMgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgdXNlcyBTT0NLUyBwcm94eWluZywgbXVsdGktbGF5ZXJlZCB3ZWIgc2VydmljZSBjb21tdW5pY2F0aW9uLCBhbmQgdmFyaWVkIGNvbW1hbmQgZXhlY3V0aW9uIHRvIG9ic2N1cmUgaXRzIGFjdGl2aXRpZXMuIFRoZSBiYWNrZG9vciBjb21iaW5lcyBzZXZlcmFsIHNvcGhpc3RpY2F0ZWQgdGVjaG5pcXVlcywgaW5jbHVkaW5nIERvSCwgbmVzdGVkIFRMUyBlbmNyeXB0aW9uLCBhbmQgdGhlIGFidXNlIG9mIGEgbGVnaXRpbWF0ZSBjbG91ZCBzZXJ2aWNlIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgc3VjaCBhcyBmdW5jdGlvbiBuYW1lcyBhbmQgdmFyaWFibGUgbmFtZXMsIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZXhlY3V0YWJsZSB0byBldmFkZSBkZXRlY3Rpb24gYW5kIGhpbmRlciBhbmFseXNpcy4gVGhlIGJhY2tkb29yIGNvbnRhaW5zIHRoZSBhdXRoZW50aWNhdGlvbiBrZXksIEhUVFBTIGFuZCBXZWJTb2NrZXQgYWRkcmVzc2VzIGFzIHBhcnQgb2YgaXRzIHNvcGhpc3RpY2F0ZWQsIG11bHRpLWxheWVyZWQgQzIgZXZhc2lvbiB0ZWNobmlxdWUuXHJcblxyXG4tLUJlZ2luIEVsZW1lbnRzLS1cclxuXCJoa2lnYkxLSFJfUGJ5NnQ2UFwiID09PiBhdXRoZW50aWNhdGlvbiBrZXlcclxuXCJoeHhwc1s6XS8vW3JlZGFjdGVkXS5jb21cIiA9PT4gSFRUUFMgYWRkcmVzc1xyXG5cIndzczovL1tyZWRhY3RlZF0uY29tL2FrYW1haVwiID09PiBXZWJTb2NrZXQgYWRkcmVzc1xyXG4tLUVuZCBFbGVtZW50cy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBYT1IgY2lwaGVyIGVuY3J5cHRpb24gdG8gaGlkZSBrZXkgc3RyaW5ncywgc3VjaCBhcyBpdHMgSW50ZXJuZXQgUHJvdG9jb2wgdmVyc2lvbiA0IChJUHY0KSBhZGRyZXNzZXMgb2YgcHVibGljIERvSCBzZXJ2ZXJzIGFuZCBvdGhlciBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZS4gVXBvbiBleGVjdXRpb24sIHRoZSBiYWNrZG9vciBpbml0aWF0ZXMgYSBmdW5jdGlvbiB0byBjb25maWd1cmUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGUgYmFja2Rvb3IgdGhlbiBjaGVja3MgZm9yIHRoZSBcIltyZWRhY3RlZF1ORVQ0XCIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHJ1bm5pbmcgYXMgYSBjaGlsZCBwcm9jZXNzLiBJZiBcIltyZWRhY3RlZF1ORVQ0XCIgaXMgbm90IHNldCwgaW5kaWNhdGluZyBub3QgYSBjaGlsZCBwcm9jZXNzLCB0aGUgYmFja2Rvb3IgdmVyaWZpZXMgaXRzIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGggYnkgYXR0ZW1wdGluZyB0byBsb2FkIHRoZSBmaWxlIGNvbnRlbnRzIGZyb20gXCIvZXRjL3N5c2NvbmZpZy92bmV0ZFwiLiBJZiBub3QgcnVubmluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoIFwiL2V0Yy9zeXNjb25maWcvdm5ldGRcIiwgdGhlIGJhY2tkb29yIHRlcm1pbmF0ZXMgaXRzIGNvZGUgZXhlY3V0aW9uLiBJZiB0aGUgYmFja2Rvb3IgZXhlY3V0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGgsIHRoZSBiYWNrZG9vciBjb3BpZXMgaXRzZWxmIHRvIFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi9cIiB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZW5zdXJpbmcgdGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciB0YWtlcyBwcmVjZWRlbmNlIGluIGV4ZWN1dGlvbi4gVGhlIGJhY2tkb29yIGV4ZWN1dGVzIHRoZSBjb3BpZWQgYmFja2Rvb3IgbmFtZWQgXCJ1cGRhdGVtZ3JcIiBkdWUgdG8gdGhlIFBBVEggbW9kaWZpY2F0aW9uIGFuZCB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLiBJZiBcIltyZWRhY3RlZF1ORVQ0XCIgaXMgc2V0LCBpbmRpY2F0aW5nIGEgY2hpbGQgcHJvY2VzcywgdGhlIGJhY2tkb29yIGNvbnRpbnVlcyBpdHMgbWFpbiBjb2RlIGV4ZWN1dGlvbi4gQXMgcGFydCBvZiB0aGlzIGNvbnRpbnVlZCBleGVjdXRpb24sIHRoZSB0ZW1wb3JhcnkgY29weSBvZiB0aGUgYmFja2Rvb3IgYXQgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vdXBkYXRlbWdyXCIgaXMgZGVsZXRlZC5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIGEgZnVuY3Rpb25cIiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZiBwcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlZXhlY3V0ZXMgaXRzZWxmLiBUaGUgZnVuY3Rpb24gZmlyc3QgY2hlY2tzIGZvciB0aGUgXCJbcmVkYWN0ZWRdTkVUM1wiIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBjb25maXJtcyB0aGUgZXhpc3RlbmNlIG9mIGEgcHJvY2VzcyBuYW1lZCBcInZuZXRkXCIuIElmIHRoZSBjaGVja3MgcmV0dXJuIGEgXCJmYWxzZVwiIHZhbHVlLCB0aGVuIFwiW3JlZGFjdGVkXU5FVDNcIiBpcyBub3Qgc2V0LCBpbmRpY2F0aW5nIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBpdHNlbGYgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3ZuZXRkXCIgdG8gYSBuZXcgbG9jYXRpb246IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi9cIiB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciBmaWxlIFwidXBkYXRlbWdyXCIgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyBcIltyZWRhY3RlZF1ORVQzXCIgaXMgc2V0LCB0aGUgZnVuY3Rpb24gYWxsb3dzIHRoZSBjb2RlIHRvIGNvbnRpbnVlIGl0cyBub3JtYWwgbWFsaWNpb3VzIG9wZXJhdGlvbnMuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBhbiBYT1Igb3BlcmF0aW9uIHRvIGRlY3J5cHQgdGhlIElQdjQgYWRkcmVzc2VzIGZvciB0aGUgRG9IIHNlcnZlcnMgYmVsb3c6XHJcblxyXG4tLUJlZ2luIERvSCBBZGRyZXNzZXMtLVxyXG5oeHhwc1s6XS8vOC44LjguOC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHh4cHNbOl0vLzkuOS45LjkvZG5zLXF1ZXJ5IChRdWFkOSlcclxuaHh4cHNbOl0vLzkuOS45LjExL2Rucy1xdWVyeSAoUXVhZDkpXHJcbmh4eHBzWzpdLy8xLjEuMS4xL2Rucy1xdWVyeSAoQ2xvdWRmbGFyZSlcclxuaHh4cHNbOl0vLzEuMC4wLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5oeHhwc1s6XS8vNDUuOTAuMjguMTYwL2Rucy1xdWVyeSAoTmV4dEROUylcclxuaHh4cHNbOl0vLzQ1LjkwLjMwLjE2MC9kbnMtcXVlcnkgKE5leHRETlMpXHJcbmh4eHBzWzpdLy8xNDkuMTEyLjExMi4xMTIvZG5zLXF1ZXJ5IChRdWFkOSlcclxuaHh4cHNbOl0vLzE0OS4xMTIuMTEyLjExL2Rucy1xdWVyeSAoUXVhZDkpXHJcbi0tRW5kIERvSCBBZGRyZXNzZXMtLVxyXG5cclxuVGhlIGJhY2tkb29yIHJlbGllcyBvbiBpbnRlcm5hbCwgbG93LWxldmVsIGZ1bmN0aW9uIGNhbGxzIGZyb20gYSBjdXN0b20gR28gcGFja2FnZSB0byBoYW5kbGUgaXRzIG5ldHdvcmsgY29ubmVjdGlvbnMgYW5kIGNvbW1hbmQgcHJvY2Vzc2luZy4gVGhlIGJhY2tkb29yIHVzZXMgRG9IIHRvIHJlc29sdmUgdGhlIGFkZHJlc3NlcyBvZiBpdHMgQzIgc2VydmVycy4gVGhlIGJhY2tkb29yIGNyZWF0ZXMgYSBETlMgcXVlcnkgZm9yIHRoZSBtYWxpY2lvdXMgQzIgZG9tYWluIFwiW3JlZGFjdGVkXS5jb21cIi4gVGhlIGJhY2tkb29yIGVuY3J5cHRzIHRoaXMgcXVlcnkgYnkgZW5jYXBzdWxhdGluZyBpdCB3aXRoaW4gYSBzdGFuZGFyZCBIVFRQUyByZXF1ZXN0LiBUaGUgYmFja2Rvb3Igc2VuZHMgdGhlIGVuY3J5cHRlZCBIVFRQUyByZXF1ZXN0IHRvIGEgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIG9wZXJhdGVkIGJ5IENsb3VkZmxhcmUsIEdvb2dsZSwgUXVhZDkgb3IgTmV4dEROUyB0byBwcm9jZXNzIHRoZSBxdWVyeS4gQW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIHJlcXVlc3RlZCBkb21haW4gaXMgbm90IGZvdW5kIGluIHRoZSBwdWJsaWMgRG9IIHJlc29sdmVyIGNhY2hlLCB0aGUgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIGZvcndhcmRzIHRoZSByZXF1ZXN0IHRvIHRoZSBuZXh0IHNlcnZlciBpbiB0aGUgRE5TIGhpZXJhcmNoeSwgdWx0aW1hdGVseSByZWFjaGluZyB0aGUgVEEncyBETlMgc2VydmVyLCB3aGljaCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIgZm9yIHRoZSBtYWxpY2lvdXMgZG9tYWluLiBUaGUgVEEncyBETlMgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBjb3JyZWN0IElQIGFkZHJlc3MgZm9yIHRoZSBDMiBkb21haW4sIGFuZCB0aGlzIHJlc3BvbnNlIGlzIHNlbnQgYmFjayB0aHJvdWdoIHRoZSBsZWdpdGltYXRlIERvSCByZXNvbHZlciB0byB0aGUgYmFja2Rvb3IuIFRoZSBiYWNrZG9vciByZWNlaXZlcyB0aGUgZW5jcnlwdGVkIHJlc3BvbnNlLCBkZWNyeXB0cyBpdCB0byBnZXQgdGhlIEMyIHNlcnZlcidzIElQIGFkZHJlc3MsIGFuZCBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24uXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBtdWx0aXBsZSBsYXllcnMgb2YgZW5jcnlwdGlvbiBmb3IgaXRzIEMyIGNvbW11bmljYXRpb25zLiBUaGUgYmFja2Rvb3IgY29tbXVuaWNhdGVzIG92ZXIgSFRUUFMgdG8gdGhlIGNsb3VkIHBsYXRmb3JtIChcImh4eHBzWzpdLy9bcmVkYWN0ZWRdLmNvbVwiKSwgdGhlbiB1cGdyYWRlcyB0aGVzZSBzZXNzaW9ucyB0byBXZWJTb2NrZXRzIHdpdGggYW4gYWRkaXRpb25hbCBsYXllciBvZiBUTFMgZW5jcnlwdGlvbi4gVGhlIGJhY2tkb29yIHNlbmRzIEhUVFAgdXBncmFkZSByZXF1ZXN0IHRvIGNvbnZlcnQgdGhlIGluaXRpYWwgZW5jcnlwdGVkIEhUVFBTIGNvbm5lY3Rpb24gaW50byBhIHBlcnNpc3RlbnQgV2ViU29ja2V0IGNvbm5lY3Rpb246IFwid3NzOi8vW3JlZGFjdGVkXS5jb20vYWthbWFpXCIuIFRoZSBiYWNrZG9vciBuZXN0cyBhZGRpdGlvbmFsIGxheWVycyBvZiBUTFMgZW5jcnlwdGlvbiB3aXRoaW4gdGhlIFdlYlNvY2tldCBzZXNzaW9uLiBUaGUgYmFja2Rvb3IgcGVyZm9ybXMgYSBzZXJpZXMgb2YgbmVzdGVkIFRMUyBoYW5kc2hha2VzIHdpdGhpbiB0aGUgZXN0YWJsaXNoZWQgV2ViU29ja2V0IHR1bm5lbC4gVGhlIGZpcnN0IFRMUyBoYW5kc2hha2UgaXMgdGhlIHN0YW5kYXJkIFRMUyBoYW5kc2hha2UgZm9yIHRoZSBpbml0aWFsIEhUVFBTIHJlcXVlc3QgdG8gdGhlIENsb3VkZmxhcmUgcGxhdGZvcm0uIEEgc2Vjb25kIFRMUyBoYW5kc2hha2Ugb2NjdXJzIHdpdGhpbiB0aGUgV2ViU29ja2V0IHR1bm5lbC4gRHVyaW5nIHRoaXMgc3RlcCwgdGhlIGJhY2tkb29yIGF1dGhlbnRpY2F0ZXMgaXRzZWxmIHRvIHRoZSBDMiBzZXJ2ZXIgdXNpbmcgYSBzdGF0aWMgYXV0aGVudGljYXRpb24ga2V5OiBcImhraWdiTEtIUl9QYnk2dDZQXCIuIElmIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSBiYWNrZG9vciBwcm9jZWVkcyB0byBzZXQgdXAgdGhlIG11bHRpcGxleGluZyBsYXllci4gVGhlIGJhY2tkb29yIHVzZXMgdGhlIFwiSGFzaGlDb3JwIFlhbXV4XCIgbGlicmFyeSB0byBjcmVhdGUgbXVsdGlwbGUgc3RyZWFtcyB3aXRoaW4gYSBzaW5nbGUgaW5uZXJtb3N0IFRMUy1lbmNyeXB0ZWQgV2ViU29ja2V0IHR1bm5lbC4gVGhpcyBtZXRob2QgbWFrZXMgdGhlIFRBJ3MgYWN0aXZpdGllcyBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBhcyBtdWx0aXBsZSBjb21tYW5kcyBhbmQgbmV0d29yayB0dW5uZWxzIGFyZSBtdWx0aXBsZXhlZCBhbmQgaGlkZGVuIHdpdGhpbiBhIHNpbmdsZSwgZW5jcnlwdGVkIG5ldHdvcmsgc3RyZWFtLlxyXG5cclxuT25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBDMiBzZXJ2ZXIgdmlhIFdlYlNvY2tldHMsIHRoZSBiYWNrZG9vciByZWNlaXZlcyBjb21tYW5kcyB0aGF0IGFyZSBkaXJlY3RlZCB0byBzcGVjaWZpYyBoYW5kbGVycyB0byBwZXJmb3JtIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBmb3VyIGNvcmUgaGFuZGxlcnMgYW5kIHRoZWlyIGZ1bmN0aW9uczpcclxuXHJcbi0tQmVnaW4gQ29yZSBIYW5kbGVycy0tXHJcbmEuIFRoZSBTb2NrcyBoYW5kbGVyIGVzdGFibGlzaGVzIGEgU09DS1MgcmVsYXksIHdoaWNoIGZhY2lsaXRhdGVzIGxhdGVyYWwgbW92ZW1lbnQgd2l0aGluIGEgY29tcHJvbWlzZWQgbmV0d29yayBhbmQgcm91dGVzIEMyIHRyYWZmaWMuXHJcblxyXG5iLiBUaGUgV2ViU2VydmljZSBoYW5kbGVyIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyLiBUaGUgaGFuZGxlciB1c2VzIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZSwgbGV2ZXJhZ2luZyB0aGUgXCJuZXQvaHR0cCBwYWNrYWdlXCIgYW5kIFwiZ29yaWxsYS9tdXhcIiBsaWJyYXJ5LCB0byBjcmVhdGUgYSB3ZWIgc2VydmVyIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIEEgZGVkaWNhdGVkIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSAoIEFQSSkgXCIvYXBpL1wiIGVuZHBvaW50IGlzIGNyZWF0ZWQgdG8gcmVjZWl2ZSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlci4gVGhpcyBwcm92aWRlcyB0aGUgVEEgd2l0aCBleHRlbnNpdmUgY29udHJvbCBvdmVyIHRoZSB2aWN0aW0ncyBmaWxlIHN5c3RlbSwgYWxsb3dpbmcgdGhlIFRBIHRvIGJyb3dzZSwgdmlldywgY3JlYXRlLCBkZWxldGUsIHVwbG9hZCwgYW5kIGRvd25sb2FkIGZpbGVzIGFuZCBmb2xkZXJzLiBUbyBibGVuZCBpbiBhbmQgZXZhZGUgZGV0ZWN0aW9uLCB0aGUgYmFja2Rvb3Igc2VydmVzIHN0YXRpYyB3ZWIgZmlsZXMgKEh5cGVydGV4dCBNYXJrdXAgTGFuZ3VhZ2UgKEhUTUwpLCBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpLCBKYXZhU2NyaXB0KSBmcm9tIGEgZGVzaWduYXRlZCBkaXJlY3RvcnkuIFRoaXMgbWFrZXMgdGhlIG1hbGljaW91cyB3ZWIgc2VydmVyIGFwcGVhciB0byBiZSBhIHN0YW5kYXJkIHdlYiBhcHBsaWNhdGlvbi5cclxuXHJcbmMuIFRoZSBDb21tYW5kIGhhbmRsZXIgZXhlY3V0ZXMgc2hlbGwgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRoIGEgc3BlY2lmaWMgc2VjdXJpdHkgY29udGV4dCwgZ3JhbnRpbmcgdGhlIFRBIGludGVyYWN0aXZlIGNvbW1hbmQtbGluZSBhY2Nlc3MuXHJcblxyXG5kLiBUaGUgQ29tbWFuZE5vQ29udGV4dCBoYW5kbGVyIGV4ZWN1dGVzIHNoZWxsIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gd2l0aG91dCB1c2luZyBhbiBleHBsaWNpdCBzZWN1cml0eSBjb250ZXh0LlxyXG4tLUVuZCBDb3JlIEhhbmRsZXJzLS0iLAogICAgICAgICAgICAibWFsd2FyZV90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJiYWNrZG9vciIsCiAgICAgICAgICAgICAgICAidHJvamFuIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaXNfZmFtaWx5IjogZmFsc2UsCiAgICAgICAgICAgICJzYW1wbGVfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJmaWxlLS1hNjE4M2QyNy0wMDA4LTVjNGYtYjhmYy1kN2I2N2JhNTdkMjciCiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaW5kaWNhdG9yIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiaW5kaWNhdG9yLS0yYWI1ZTVmOC1kM2FmLTQyMTQtYTM0NS1lNDRmYmZkMmZiZTUiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibmFtZSI6ICIwMTMyMTFjNTZjYWFhNjk3OTE0YjViNTg3MWU0OTk4ZDAyOTg5MDJlMzM2ZTM3M2ViYjI3YjdkYjMwOTE3ZWFmIiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiW2ZpbGU6aGFzaGVzLidNRDUnPSczOTExMTUwOGJmZGU4OWNlNmUwZmU2YWJlMDM2NTU1MicgT1IgZmlsZTpoYXNoZXMuJ1NIQS0xJz0nZjYzOWQ5NDA0YzAzYWY4NmNlNDUyZGI1YzVlMGM1MjhiODFkYzBkNycgT1IgZmlsZTpoYXNoZXMuJ1NIQS0yNTYnPScwMTMyMTFjNTZjYWFhNjk3OTE0YjViNTg3MWU0OTk4ZDAyOTg5MDJlMzM2ZTM3M2ViYjI3YjdkYjMwOTE3ZWFmJyBPUiBmaWxlOmhhc2hlcy4nU0hBLTUxMic9Jzc0YjRjNmY3YzdjYWUwN2M2ZjhlZGYzZjJmYjFlOTIwNmQ0ZjFmOTczNGU4ZTQ3ODRiMTVkMTkyZWVjOGNkOGE0ZjU5MDc4ZmMwYzU2ZGM0YWQwODU2Y2RkNzkyMzM3YjVjOTJmZmQzZDIyNDBjOGEyODdhNzc2ZGY0MzYzYmJhJ10iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInN0aXgiLAogICAgICAgICAgICAicGF0dGVybl92ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJ2YWxpZF9mcm9tIjogIjIwMjUtMTItMDJUMTY6MDc6MjMuODI5NDIxWiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImZpbGUtLTVhZWMwYzUwLWExYjgtNTlhMi1iNzBkLWY3OGU3Zjk5ZjhlOCIsCiAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAiTUQ1IjogIjE4Zjg5NWUyNGZlMTE4MWJiNTU5MjE1ZmY5Y2Y2Y2UzIiwKICAgICAgICAgICAgICAgICJTSEEtMSI6ICJjMzU0OWQ0ZTVlMzlhMTFmNjA5ZmM2ZmJmNWNjMWYyYzBlYzI3MmI0IiwKICAgICAgICAgICAgICAgICJTSEEtMjU2IjogImY3Y2RhOTAxNzRiODA2YTM0MzgxZDUwNDNlODliMjNiYTgyNmFiY2M4OWY3YWJkNTIwMDYwYTY0NDc1ZWQ1MDYiLAogICAgICAgICAgICAgICAgIlNIQS01MTIiOiAiNzkyNzY1MjNhNmE1MDdlM2ZhMWIxMmI5NmUwOWIxMGEwMWM3ODNhNTNkNThiOWFlN2Y1NzgwYTM3OTQzMTYzOWE4MDE2NWU4MTE1NDUyMjY0OWI4ZTIwOThlODZkMWEzMTBlZmZmZWJlMzJmYWFmYzdiM2JjMDkzZWVjNjBhNjQiLAogICAgICAgICAgICAgICAgIlNTREVFUCI6ICI0OTE1Mjo2WFVROWFua3RFZzd6L1FiUEI4M0ErRlFHUXpxdWZxQ2p0MkY4MWpoK2VTNTNPT3dKeWxISkh1eGtkcXozZ0hHOm1WYW5reG4yUGUzSlFHUXo1N3QyWTRmM1R3clFIQXoiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzaXplIjogNjMxMTkzNiwKICAgICAgICAgICAgIm5hbWUiOiAiZjdjZGE5MDE3NGI4MDZhMzQzODFkNTA0M2U4OWIyM2JhODI2YWJjYzg5ZjdhYmQ1MjAwNjBhNjQ0NzVlZDUwNiIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJpbmRpY2F0b3IiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJpbmRpY2F0b3ItLTlmNzU2MTMyLTE0MmEtNDIyNS04ZWYwLTc2YzIzYzdkZTAzZiIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJuYW1lIjogImY3Y2RhOTAxNzRiODA2YTM0MzgxZDUwNDNlODliMjNiYTgyNmFiY2M4OWY3YWJkNTIwMDYwYTY0NDc1ZWQ1MDYiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNIHRoYXQgdXNlcyBzZXZlcmFsIGFkdmFuY2VkIHRlY2huaXF1ZXMgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgdXNlcyBTT0NLUyBwcm94eWluZywgbXVsdGktbGF5ZXJlZCB3ZWIgc2VydmljZSBjb21tdW5pY2F0aW9uLCBhbmQgdmFyaWVkIGNvbW1hbmQgZXhlY3V0aW9uIHRvIG9ic2N1cmUgaXRzIGFjdGl2aXRpZXMuIFRoZSBiYWNrZG9vciBjb21iaW5lcyBzZXZlcmFsIHNvcGhpc3RpY2F0ZWQgdGVjaG5pcXVlcywgaW5jbHVkaW5nIERvSCwgbmVzdGVkIFRMUyBlbmNyeXB0aW9uLCBhbmQgdGhlIGFidXNlIG9mIGEgbGVnaXRpbWF0ZSBjbG91ZCBzZXJ2aWNlIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIGNvbnRhaW5zIHRoZSBhdXRoZW50aWNhdGlvbiBrZXksIEhUVFBTIGFuZCBXZWJTb2NrZXQgYWRkcmVzc2VzIGFzIHBhcnQgb2YgaXRzIHNvcGhpc3RpY2F0ZWQsIG11bHRpLWxheWVyZWQgQzIgZXZhc2lvbiB0ZWNobmlxdWUuXHJcblxyXG4tLUJlZ2luIEVsZW1lbnRzLS1cclxuaGtpZ2JMS0hSX1BieTZ0NlAgPT0+IGF1dGhlbnRpY2F0aW9uIGtleVxyXG5odHRwczovL1tyZWRhY3RlZF0uY29tID09PiBIVFRQUyBhZGRyZXNzXHJcbndzczovL1tyZWRhY3RlZF0uY29tL2Nsb3VkYXBpID09PiBXZWJTb2NrZXQgYWRkcmVzc1xyXG4tLUVuZCBFbGVtZW50cy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBYT1IgY2lwaGVyIGVuY3J5cHRpb24gdG8gaGlkZSBrZXkgc3RyaW5ncywgc3VjaCBhcyBpdHMgSVB2NCBhZGRyZXNzZXMgb2YgcHVibGljIERvSCBzZXJ2ZXJzIGFuZCBvdGhlciBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZS4gVXBvbiBleGVjdXRpb24sIHRoZSBiYWNrZG9vciBpbml0aWF0ZXMgdGhlIG9iZnVzY2F0ZWQgZnVuY3Rpb24gXCJtYWluX3N0YXJ0TmV3XCIgdG8gY29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIGJhY2tkb29yIHRoZW4gY2hlY2tzIGZvciB0aGUgXCJbcmVkYWN0ZWRdTkVUNFwiIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSBpZiBpdCBpcyBydW5uaW5nIGFzIGEgY2hpbGQgcHJvY2Vzcy4gSWYgXCJbcmVkYWN0ZWRdTkVUNFwiIGlzIG5vdCBzZXQsIGluZGljYXRpbmcgbm90IGEgY2hpbGQgcHJvY2VzcywgdGhlIGJhY2tkb29yIHZlcmlmaWVzIGl0cyBjdXJyZW50IGV4ZWN1dGlvbiBwYXRoIGJ5IGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUgZmlsZSBjb250ZW50cyBmcm9tIFwiL2V0Yy9zeXNjb25maWcvdm1ja2RcIi4gSWYgbm90IHJ1bm5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCBcIi9ldGMvc3lzY29uZmlnL3ZtY2tkXCIsIHRoZSBiYWNrZG9vciB0ZXJtaW5hdGVzIGl0cyBjb2RlIGV4ZWN1dGlvbi4gSWYgdGhlIGJhY2tkb29yIGV4ZWN1dGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoLCB0aGUgYmFja2Rvb3IgY29waWVzIGl0c2VsZiB0byBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGVuc3VyaW5nIHRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgdGFrZXMgcHJlY2VkZW5jZSBpbiBleGVjdXRpb24uIFRoZSBiYWNrZG9vciBleGVjdXRlcyB0aGUgY29waWVkIGJhY2tkb29yIG5hbWVkIFwidXBkYXRlbWdyXCIgZHVlIHRvIHRoZSBQQVRIIG1vZGlmaWNhdGlvbiBhbmQgdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbi4gSWYgXCJbcmVkYWN0ZWRdTkVUNFwiIGlzIHNldCwgaW5kaWNhdGluZyBhIGNoaWxkIHByb2Nlc3MsIHRoZSBiYWNrZG9vciBjb250aW51ZXMgaXRzIG1haW4gY29kZSBleGVjdXRpb24uIEFzIHBhcnQgb2YgdGhpcyBjb250aW51ZWQgZXhlY3V0aW9uLCB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGJhY2tkb29yIGF0IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiIGlzIGRlbGV0ZWQuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyB0aGUgb2JmdXNjYXRlZCBmdW5jdGlvbiBcIm1haW5fc2VsZldhdGNoZXJcIiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgYW5vdGhlciBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIltyZWRhY3RlZF1ORVQzXCIgYW5kIGNvbmZpcm1zIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHByb2Nlc3MgbmFtZWQgXCJ1cGRhdGVtZ3JcIi4gSWYgdGhlIGNoZWNrcyByZXR1cm4gYSBcImZhbHNlXCIgdmFsdWUsIGluZGljYXRpbmcgXCJbcmVkYWN0ZWRdTkVUM1wiIGlzIG5vdCBzZXQsIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBpdHNlbGYgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3ZtY2tkXCIgdG8gYSBuZXcgbG9jYXRpb246IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi9cIiB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciBmaWxlIFwidXBkYXRlbWdyXCIgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyBcIltyZWRhY3RlZF1ORVQzXCIgaXMgc2V0LCB0aGUgXCJtYWluX3NlbGZXYXRjaGVyXCIgZnVuY3Rpb24gYWxsb3dzIHRoZSBjb2RlIHRvIGNvbnRpbnVlIGl0cyBub3JtYWwgbWFsaWNpb3VzIG9wZXJhdGlvbnMuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBhbiBYT1Igb3BlcmF0aW9uIHRvIGRlY3J5cHQgdGhlIElQdjQgYWRkcmVzc2VzIGZvciB0aGUgRG9IIHNlcnZlcnMgYmVsb3c6XHJcblxyXG4tLUJlZ2luIERvSCBBZGRyZXNzZXMtLVxyXG5odHRwczovLzguOC44LjgvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh0dHBzOi8vOC44LjQuNC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHR0cHM6Ly85LjkuOS45L2Rucy1xdWVyeSAoUXVhZDkpXHJcbmh0dHBzOi8vNDUuOTAuMjguMTYwL2Rucy1xdWVyeSAoTmV4dEROUylcclxuaHR0cHM6Ly80NS45MC4zMC4xNjAvZG5zLXF1ZXJ5IChOZXh0RE5TKVxyXG5odHRwczovLzE0OS4xMTIuMTEyLjExMi9kbnMtcXVlcnkgKFF1YWQ5KVxyXG5odHRwczovLzkuOS45LjExL2Rucy1xdWVyeSAoUXVhZDkpXHJcbmh0dHBzOi8vMS4xLjEuMS9kbnMtcXVlcnkgKENsb3VkZmxhcmUpXHJcbmh0dHBzOi8vMS4wLjAuMS9kbnMtcXVlcnkgKENsb3VkZmxhcmUpXHJcbmh0dHBzOi8vMTQ5LjExMi4xMTIuMTEvZG5zLXF1ZXJ5IChRdWFkOSlcclxuLS1FbmQgRG9IIEFkZHJlc3Nlcy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgcmVsaWVzIG9uIGludGVybmFsLCBsb3ctbGV2ZWwgZnVuY3Rpb24gY2FsbHMgZnJvbSBhIGN1c3RvbSBHbyBwYWNrYWdlIHRvIGhhbmRsZSBpdHMgbmV0d29yayBjb25uZWN0aW9ucyBhbmQgY29tbWFuZCBwcm9jZXNzaW5nLiBUaGUgYmFja2Rvb3IgdXNlcyBEb0ggdG8gcmVzb2x2ZSB0aGUgYWRkcmVzc2VzIG9mIGl0cyBDMiBzZXJ2ZXJzLiBUaGUgYmFja2Rvb3IgY3JlYXRlcyBhIEROUyBxdWVyeSBmb3IgdGhlIG1hbGljaW91cyBDMiBkb21haW4gXCJbcmVkYWN0ZWRdLmNvbVwiLiBUaGUgYmFja2Rvb3IgZW5jcnlwdHMgdGhpcyBxdWVyeSBieSBlbmNhcHN1bGF0aW5nIGl0IHdpdGhpbiBhIHN0YW5kYXJkIEhUVFBTIHJlcXVlc3QuIFRoZSBiYWNrZG9vciBzZW5kcyB0aGUgZW5jcnlwdGVkIEhUVFBTIHJlcXVlc3QgdG8gYSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgb3BlcmF0ZWQgYnkgQ2xvdWRmbGFyZSwgR29vZ2xlLCBRdWFkOSBvciBOZXh0RE5TIHRvIHByb2Nlc3MgdGhlIHF1ZXJ5LiBBbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBpZiB0aGUgcmVxdWVzdGVkIGRvbWFpbiBpcyBub3QgZm91bmQgaW4gdGhlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgY2FjaGUsIHRoZSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgZm9yd2FyZHMgdGhlIHJlcXVlc3QgdG8gdGhlIG5leHQgc2VydmVyIGluIHRoZSBETlMgaGllcmFyY2h5LCB1bHRpbWF0ZWx5IHJlYWNoaW5nIHRoZSBUQSdzIEROUyBzZXJ2ZXIsIHdoaWNoIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNlcnZlciBmb3IgdGhlIG1hbGljaW91cyBkb21haW4uIFRoZSBUQSdzIEROUyBzZXJ2ZXIgd2lsbCByZXNwb25kIHdpdGggdGhlIGNvcnJlY3QgSVAgYWRkcmVzcyBmb3IgdGhlIEMyIGRvbWFpbiwgYW5kIHRoaXMgcmVzcG9uc2UgaXMgc2VudCBiYWNrIHRocm91Z2ggdGhlIGxlZ2l0aW1hdGUgRG9IIHJlc29sdmVyIHRvIHRoZSBiYWNrZG9vci4gVGhlIGJhY2tkb29yIHJlY2VpdmVzIHRoZSBlbmNyeXB0ZWQgcmVzcG9uc2UsIGRlY3J5cHRzIGl0IHRvIGdldCB0aGUgQzIgc2VydmVyJ3MgSVAgYWRkcmVzcywgYW5kIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbi5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIG11bHRpcGxlIGxheWVycyBvZiBlbmNyeXB0aW9uIGZvciBpdHMgQzIgY29tbXVuaWNhdGlvbnMuIFRoZSBiYWNrZG9vciBjb21tdW5pY2F0ZXMgb3ZlciBIVFRQUyB0byB0aGUgY2xvdWQgcGxhdGZvcm0gKFwiaHR0cHM6Ly9bcmVkYWN0ZWRdLmNvbVwiKSwgdGhlbiB1cGdyYWRlcyB0aGVzZSBzZXNzaW9ucyB0byBXZWJTb2NrZXRzIHdpdGggYW4gYWRkaXRpb25hbCBsYXllciBvZiBUTFMgZW5jcnlwdGlvbi4gVGhlIGJhY2tkb29yIHNlbmRzIEhUVFAgdXBncmFkZSByZXF1ZXN0IHRvIGNvbnZlcnQgdGhlIGluaXRpYWwgZW5jcnlwdGVkIEhUVFBTIGNvbm5lY3Rpb24gaW50byBhIHBlcnNpc3RlbnQgV2ViU29ja2V0IGNvbm5lY3Rpb246IFwid3NzOi8vW3JlZGFjdGVkXS5jb20vY2xvdWRhcGlcIi4gVGhlIGJhY2tkb29yIG5lc3RzIGFkZGl0aW9uYWwgbGF5ZXJzIG9mIFRMUyBlbmNyeXB0aW9uIHdpdGhpbiB0aGUgV2ViU29ja2V0IHNlc3Npb24uIFRoZSBiYWNrZG9vciBwZXJmb3JtcyBhIHNlcmllcyBvZiBuZXN0ZWQgVExTIGhhbmRzaGFrZXMgd2l0aGluIHRoZSBlc3RhYmxpc2hlZCBXZWJTb2NrZXQgdHVubmVsLiBUaGUgZmlyc3QgVExTIGhhbmRzaGFrZSBpcyB0aGUgc3RhbmRhcmQgVExTIGhhbmRzaGFrZSBmb3IgdGhlIGluaXRpYWwgSFRUUFMgcmVxdWVzdCB0byB0aGUgY2xvdWQgcGxhdGZvcm0uIEEgc2Vjb25kIFRMUyBoYW5kc2hha2Ugb2NjdXJzIHdpdGhpbiB0aGUgV2ViU29ja2V0IHR1bm5lbC4gRHVyaW5nIHRoaXMgc3RlcCwgdGhlIGJhY2tkb29yIGF1dGhlbnRpY2F0ZXMgaXRzZWxmIHRvIHRoZSBDMiBzZXJ2ZXIgdXNpbmcgYSBzdGF0aWMgYXV0aGVudGljYXRpb24ga2V5OiBcImhraWdiTEtIUl9QYnk2dDZQXCIuIEFuIGlubmVybW9zdCBUTFMgbGF5ZXIgZW5jcnlwdHMgdGhlIGFjdHVhbCBDMiBjb21tYW5kcyBhbmQgZGF0YSwgc2VjdXJpbmcgdGhlbSBldmVuIGlmIHRoZSBvdXRlciBsYXllcnMgYXJlIGJ5cGFzc2VkIG9yIGRlY3J5cHRlZC4gVGhlIGJhY2tkb29yIHVzZXMgdGhlIFwiSGFzaGlDb3JwIFlhbXV4XCIgbGlicmFyeSB0byBjcmVhdGUgbXVsdGlwbGUgc3RyZWFtcyB3aXRoaW4gYSBzaW5nbGUgaW5uZXJtb3N0IFRMUy1lbmNyeXB0ZWQgV2ViU29ja2V0IHR1bm5lbC4gVGhpcyBtZXRob2QgbWFrZXMgdGhlIFRBJ3MgYWN0aXZpdGllcyBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBhcyBtdWx0aXBsZSBjb21tYW5kcyBhbmQgbmV0d29yayB0dW5uZWxzIGFyZSBtdWx0aXBsZXhlZCBhbmQgaGlkZGVuIHdpdGhpbiBhIHNpbmdsZSwgZW5jcnlwdGVkIG5ldHdvcmsgc3RyZWFtLlxyXG5cclxuQWZ0ZXIgZXN0YWJsaXNoaW5nIGEgc2VjdXJlIGFuZCBjb3ZlcnQgY29ubmVjdGlvbiwgdGhlIGJhY2tkb29yIGxldmVyYWdlcyBpdHMgb2JmdXNjYXRlZCBjb3JlIFwidGFzay5Eb1Rhc2tcIiAoL2NvcmUvdGFzay5Eb1Rhc2spIGZ1bmN0aW9uIGFuZCBmb3VyIG9iZnVzY2F0ZWQgZXh0ZW5zaW9ucyAobW9kdWxlcykgXCJzb2Nrcy5Tb2Nrc1wiLCBcIndlYi5XZWJTZXJ2aWNlXCIsIFwiY29tbWFuZC5Db21tYW5kXCIsIGFuZCBcImNvbW1hbmQuQ29tbWFuZE5vQ29udGV4dFwiLiBUaGVzZSBleHRlbnNpb25zIGRlZmluZSB0aGUgbWFsaWNpb3VzIGZ1bmN0aW9uYWxpdHkgdGhhdCB0aGUgYmFja2Rvb3Igc2hvdWxkIGV4ZWN1dGUsIGFsbG93aW5nIHRoZSBUQSB0byBjYXJyeSBvdXQgdmFyaW91cyB0YXNrcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtcy4gVGhlc2UgbW9kdWxlcyBlbmFibGUgQzIgY29tbXVuaWNhdGlvbiwgbGF0ZXJhbCBtb3ZlbWVudCwgYW5kIGNvbW1hbmQgZXhlY3V0aW9uIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBmb3VyIGV4dGVuc2lvbnMgYW5kIHRoZWlyIGZ1bmN0aW9uczpcclxuXHJcbi0tQmVnaW4gRXh0ZW5zaW9ucy0tXHJcbmEuIFRoZSBTb2NrcyBleHRlbnNpb24gZW5hYmxlcyBuZXR3b3JrIHR1bm5lbGluZyB0aHJvdWdoIGEgU09DS1MgcHJveHksIHdoaWNoIGZhY2lsaXRhdGVzIGxhdGVyYWwgbW92ZW1lbnQgd2l0aGluIGEgY29tcHJvbWlzZWQgbmV0d29yayBhbmQgcm91dGVzIEMyIHRyYWZmaWMuXHJcblxyXG5iLiBUaGUgV2ViU2VydmljZSBleHRlbnNpb24gbW9kdWxlIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyLiBUaGUgZXh0ZW5zaW9uIHVzZXMgdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLCBsZXZlcmFnaW5nIHRoZSBcIm5ldC9odHRwIHBhY2thZ2VcIiBhbmQgXCJnb3JpbGxhL211eFwiIGxpYnJhcnksIHRvIGNyZWF0ZSBhIHdlYiBzZXJ2ZXIgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gQSBkZWRpY2F0ZWQgQVBJIFwiL2FwaS9cIiBlbmRwb2ludCBpcyBjcmVhdGVkIHRvIHJlY2VpdmUgYW5kIGV4ZWN1dGUgY29tbWFuZHMgZnJvbSB0aGUgVEEncyBDMiBzZXJ2ZXIuIFRoaXMgcHJvdmlkZXMgdGhlIFRBIHdpdGggZXh0ZW5zaXZlIGNvbnRyb2wgb3ZlciB0aGUgdmljdGltJ3MgZmlsZSBzeXN0ZW0sIGFsbG93aW5nIHRoZSBUQSB0byBicm93c2UsIHZpZXcsIGNyZWF0ZSwgZGVsZXRlLCB1cGxvYWQsIGFuZCBkb3dubG9hZCBmaWxlcyBhbmQgZm9sZGVycy4gVG8gYmxlbmQgaW4gYW5kIGV2YWRlIGRldGVjdGlvbiwgdGhlIGJhY2tkb29yIHNlcnZlcyBzdGF0aWMgd2ViIGZpbGVzIChIVE1MLCBDU1MsIEphdmFTY3JpcHQpIGZyb20gYSBkZXNpZ25hdGVkIGRpcmVjdG9yeS4gVGhpcyBtYWtlcyB0aGUgbWFsaWNpb3VzIHdlYiBzZXJ2ZXIgYXBwZWFyIHRvIGJlIGEgc3RhbmRhcmQgd2ViIGFwcGxpY2F0aW9uLlxyXG5cclxuYy4gVGhlIENvbW1hbmQgZXh0ZW5zaW9uIGV4ZWN1dGVzIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gd2l0aCBhIHNwZWNpZmljIHNlY3VyaXR5IGNvbnRleHQuXHJcblxyXG5kLiBUaGUgQ29tbWFuZE5vQ29udGV4dCBleHRlbnNpb24gZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRob3V0IHVzaW5nIGFuIGV4cGxpY2l0IHNlY3VyaXR5IGNvbnRleHQuXHJcbi0tRW5kIEV4dGVuc2lvbnMgLS1cclxuXHJcblRoZSBiYWNrZG9vciBtYWludGFpbnMgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gdG8gdGhlIEMyIHNlcnZlciB1bmxlc3MgYSBzcGVjaWZpYyB0ZXJtaW5hdGlvbiBjb21tYW5kIGlzIHJlY2VpdmVkIG9yIHRoZSBDMiBzZXJ2ZXIgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4iLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiICduYW1lc3BhY2UnPSdDSVNBX0NvbnNvbGlkYXRlZC55YXJhJyBydWxlX25hbWU9Q0lTQV8yNTExNTVfMDIgcnVsZV9jb250ZW50PXJ1bGUgQ0lTQV8yNTExNTVfMDIgOiBCUklDS1NUT1JNIGJhY2tkb29yIGluc3RhbGxzX290aGVyX2NvbXBvbmVudHMgY29tbXVuaWNhdGVzX3dpdGhfYzIgZXhmaWx0cmF0ZXNfZGF0YVxue1xuICAgbWV0YTpcbiAgICAgICBhdXRob3IgPSBcIkNJU0EgQ29kZSAmIE1lZGlhIEFuYWx5c2lzXCJcbiAgICAgICBpbmNpZGVudCA9IFwiMjUxMTU1XCJcbiAgICAgICBkYXRlID0gXCIyMDI1LTA5LTE1XCJcbiAgICAgICBsYXN0X21vZGlmaWVkID0gXCIyMDI1MDkxNl8xNTExXCJcbiAgICAgICBhY3RvciA9IFwibi9hXCJcbiAgICAgICBmYW1pbHkgPSBcIkJSSUNLU1RPUk1cIlxuICAgICAgIGNhcGFiaWxpdGllcyA9IFwiaW5zdGFsbHMtb3RoZXItY29tcG9uZW50cyBjb21tdW5pY2F0ZXMtd2l0aC1jMiBleGZpbHRyYXRlcy1kYXRhXCJcbiAgICAgICBtYWx3YXJlX3R5cGUgPSBcImJhY2tkb29yXCJcbiAgICAgICB0b29sX3R5cGUgPSBcInVua25vd25cIlxuICAgICAgIGRlc2NyaXB0aW9uID0gXCJEZXRlY3RzIEdvLUJhc2VkIEJSSUNLU1RPUk0gYmFja2Rvb3Igc2FtcGxlc1wiXG4gICAgICAgc2hhMjU2XzEgPSBcIjMyMGEwYjVkNDkwMDY5N2UxMjVjZWJiNWZmMDNkZWU3MzY4ZjhmMDg3ZGIxYzE1NzBiMGI2MmY1YTk4NmQ3NTlcIlxuICAgICAgIHNoYTI1Nl8xID0gXCJkZmFjMjU0MmEwZWU2NWM0NzRiOTFkM2IzNTI1NDBhMjRmNGUyMjNmMWI4MDhiNzQxY2ZlNjgwMjYzZjBlZTQ0XCJcbiAgICAgICBzaGEyNTZfMSA9IFwiYjkxODgxY2IxYWE4NjExMzhmMjA2M2VjMTMwYjJiMDFhOGFhZjBlM2YwNDkyMWU1Y2JmYzYxYjA5MDI0YmYxMlwiXG4gICAgICAgc2hhMjU2XzEgPSBcImJmYjNmZmQ0NmIyMWIyMjgxMzc0Y2Q2MGJjNzU2ZmUyZGNjMzI0ODZkY2MxNTZjOWJkOThmMjQxMDExNDU0NTRcIlxuICAgc3RyaW5nczpcbiAgICAgICAkczAgPSB7IDA0IDMwIDBGIEI2IDU0IDA0IDJDIDMxIEQxIDg4IDRDIDA0IDM0IDQ4IEZGIEMwIH1cbiAgICAgICAkczEgPSB7IDQ4IDgzIEY4IDA0IDdDIEU3IDQ4IEM3IDA0IDI0IH1cbiAgICAgICAkczIgPSB7IDQ4IDhEIDQ0IDI0IDM0IDQ4IDg5IDQ0IDI0IDA4IDQ4IEM3IDQ0IDI0IDEwIDA0IH1cbiAgICAgICAkczMgPSB7IDQ4IDg5IDQ0IDI0IDQ4IDQ4IDg5IDRDIDI0IDUwIDQ4IDhCIDZDIDI0IDM4IDQ4IH1cbiAgICAgICAkczQgPSB7IDQ4IDgzIEVDIDQwIDQ4IDg5IDZDIDI0IDM4IDQ4IDhEIDZDIDI0IDM4IEM3IDQ0IDI0IH1cbiAgICAgICAkczUgPSB7IDgzIEVDIDM4IDQ4IDg5IDZDIDI0IDMwIDQ4IDhEIDZDIDI0IDMwIEM2IDQ0IDI0IH1cbiAgICAgICAkczYgPSB7IDRDIDI0IDIwIDQ4IDg5IDQ0IDI0IDQwIDQ4IDg5IDRDIDI0IDQ4IDQ4IDhCIDZDIH1cbiAgICAgICAkczcgPSB7IDY0IDQ4IDhCIDBDIDI1IEY4IEZGIEZGIEZGIDQ4IDNCIDYxIDEwIDBGIDg2IDgxIH1cbiAgICAgICAkczggPSB7IDY0IDQ4IDhCIDBDIDI1IEY4IEZGIEZGIEZGIDQ4IDNCIDYxIDEwIDBGIDg2IDkxIH1cbiAgIGNvbmRpdGlvbjpcbiAgICAgIGFsbCBvZiB0aGVtXG59XG4iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInlhcmEiLAogICAgICAgICAgICAidmFsaWRfZnJvbSI6ICIyMDI1LTEyLTAyVDE2OjA3OjIzLjg1NjMyNloiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUtYW5hbHlzaXMiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLWFuYWx5c2lzLS04ODc2YzdjZi02OTk4LTQ3ZjQtOGM3OC1hZGJmNGU5ZGUwYmEiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAicHJvZHVjdCI6ICJlc2V0IiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicmVzdWx0X25hbWUiOiAiYSB2YXJpYW50IG9mIExpbnV4L0JyaWNrU3Rvcm0uQSB0cm9qYW4iLAogICAgICAgICAgICAicmVzdWx0IjogInVua25vd24iLAogICAgICAgICAgICAic2FtcGxlX3JlZiI6ICJmaWxlLS01YWVjMGM1MC1hMWI4LTU5YTItYjcwZC1mNzhlN2Y5OWY4ZTgiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogIm1hbHdhcmUiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJtYWx3YXJlLS0xZjk5ZDIyZC00YTg1LTQzYzMtYmU4MC01MjUxZTczYzMzNjQiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNIHRoYXQgdXNlcyBzZXZlcmFsIGFkdmFuY2VkIHRlY2huaXF1ZXMgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgdXNlcyBTT0NLUyBwcm94eWluZywgbXVsdGktbGF5ZXJlZCB3ZWIgc2VydmljZSBjb21tdW5pY2F0aW9uLCBhbmQgdmFyaWVkIGNvbW1hbmQgZXhlY3V0aW9uIHRvIG9ic2N1cmUgaXRzIGFjdGl2aXRpZXMuIFRoZSBiYWNrZG9vciBjb21iaW5lcyBzZXZlcmFsIHNvcGhpc3RpY2F0ZWQgdGVjaG5pcXVlcywgaW5jbHVkaW5nIERvSCwgbmVzdGVkIFRMUyBlbmNyeXB0aW9uLCBhbmQgdGhlIGFidXNlIG9mIGEgbGVnaXRpbWF0ZSBjbG91ZCBzZXJ2aWNlIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIGNvbnRhaW5zIHRoZSBhdXRoZW50aWNhdGlvbiBrZXksIEhUVFBTIGFuZCBXZWJTb2NrZXQgYWRkcmVzc2VzIGFzIHBhcnQgb2YgaXRzIHNvcGhpc3RpY2F0ZWQsIG11bHRpLWxheWVyZWQgQzIgZXZhc2lvbiB0ZWNobmlxdWUuXHJcblxyXG4tLUJlZ2luIEVsZW1lbnRzLS1cclxuaGtpZ2JMS0hSX1BieTZ0NlAgPT0+IGF1dGhlbnRpY2F0aW9uIGtleVxyXG5odHRwczovL1tyZWRhY3RlZF0uY29tID09PiBIVFRQUyBhZGRyZXNzXHJcbndzczovL1tyZWRhY3RlZF0uY29tL2Nsb3VkYXBpID09PiBXZWJTb2NrZXQgYWRkcmVzc1xyXG4tLUVuZCBFbGVtZW50cy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBYT1IgY2lwaGVyIGVuY3J5cHRpb24gdG8gaGlkZSBrZXkgc3RyaW5ncywgc3VjaCBhcyBpdHMgSVB2NCBhZGRyZXNzZXMgb2YgcHVibGljIERvSCBzZXJ2ZXJzIGFuZCBvdGhlciBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZS4gVXBvbiBleGVjdXRpb24sIHRoZSBiYWNrZG9vciBpbml0aWF0ZXMgdGhlIG9iZnVzY2F0ZWQgZnVuY3Rpb24gXCJtYWluX3N0YXJ0TmV3XCIgdG8gY29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIGJhY2tkb29yIHRoZW4gY2hlY2tzIGZvciB0aGUgXCJbcmVkYWN0ZWRdTkVUNFwiIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSBpZiBpdCBpcyBydW5uaW5nIGFzIGEgY2hpbGQgcHJvY2Vzcy4gSWYgXCJbcmVkYWN0ZWRdTkVUNFwiIGlzIG5vdCBzZXQsIGluZGljYXRpbmcgbm90IGEgY2hpbGQgcHJvY2VzcywgdGhlIGJhY2tkb29yIHZlcmlmaWVzIGl0cyBjdXJyZW50IGV4ZWN1dGlvbiBwYXRoIGJ5IGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUgZmlsZSBjb250ZW50cyBmcm9tIFwiL2V0Yy9zeXNjb25maWcvdm1ja2RcIi4gSWYgbm90IHJ1bm5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCBcIi9ldGMvc3lzY29uZmlnL3ZtY2tkXCIsIHRoZSBiYWNrZG9vciB0ZXJtaW5hdGVzIGl0cyBjb2RlIGV4ZWN1dGlvbi4gSWYgdGhlIGJhY2tkb29yIGV4ZWN1dGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoLCB0aGUgYmFja2Rvb3IgY29waWVzIGl0c2VsZiB0byBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGVuc3VyaW5nIHRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgdGFrZXMgcHJlY2VkZW5jZSBpbiBleGVjdXRpb24uIFRoZSBiYWNrZG9vciBleGVjdXRlcyB0aGUgY29waWVkIGJhY2tkb29yIG5hbWVkIFwidXBkYXRlbWdyXCIgZHVlIHRvIHRoZSBQQVRIIG1vZGlmaWNhdGlvbiBhbmQgdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbi4gSWYgXCJbcmVkYWN0ZWRdTkVUNFwiIGlzIHNldCwgaW5kaWNhdGluZyBhIGNoaWxkIHByb2Nlc3MsIHRoZSBiYWNrZG9vciBjb250aW51ZXMgaXRzIG1haW4gY29kZSBleGVjdXRpb24uIEFzIHBhcnQgb2YgdGhpcyBjb250aW51ZWQgZXhlY3V0aW9uLCB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGJhY2tkb29yIGF0IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiIGlzIGRlbGV0ZWQuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyB0aGUgb2JmdXNjYXRlZCBmdW5jdGlvbiBcIm1haW5fc2VsZldhdGNoZXJcIiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgYW5vdGhlciBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIltyZWRhY3RlZF1ORVQzXCIgYW5kIGNvbmZpcm1zIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHByb2Nlc3MgbmFtZWQgXCJ1cGRhdGVtZ3JcIi4gSWYgdGhlIGNoZWNrcyByZXR1cm4gYSBcImZhbHNlXCIgdmFsdWUsIGluZGljYXRpbmcgXCJbcmVkYWN0ZWRdTkVUM1wiIGlzIG5vdCBzZXQsIHRoZSBiYWNrZG9vciBpcyBub3QgcnVubmluZyBjb3JyZWN0bHksIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBpdHNlbGYgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3ZtY2tkXCIgdG8gYSBuZXcgbG9jYXRpb246IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi9cIiB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciBmaWxlIFwidXBkYXRlbWdyXCIgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyBcIltyZWRhY3RlZF1ORVQzXCIgaXMgc2V0LCB0aGUgXCJtYWluX3NlbGZXYXRjaGVyXCIgZnVuY3Rpb24gYWxsb3dzIHRoZSBjb2RlIHRvIGNvbnRpbnVlIGl0cyBub3JtYWwgbWFsaWNpb3VzIG9wZXJhdGlvbnMuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBhbiBYT1Igb3BlcmF0aW9uIHRvIGRlY3J5cHQgdGhlIElQdjQgYWRkcmVzc2VzIGZvciB0aGUgRG9IIHNlcnZlcnMgYmVsb3c6XHJcblxyXG4tLUJlZ2luIERvSCBBZGRyZXNzZXMtLVxyXG5odHRwczovLzguOC44LjgvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh0dHBzOi8vOC44LjQuNC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHR0cHM6Ly85LjkuOS45L2Rucy1xdWVyeSAoUXVhZDkpXHJcbmh0dHBzOi8vNDUuOTAuMjguMTYwL2Rucy1xdWVyeSAoTmV4dEROUylcclxuaHR0cHM6Ly80NS45MC4zMC4xNjAvZG5zLXF1ZXJ5IChOZXh0RE5TKVxyXG5odHRwczovLzE0OS4xMTIuMTEyLjExMi9kbnMtcXVlcnkgKFF1YWQ5KVxyXG5odHRwczovLzkuOS45LjExL2Rucy1xdWVyeSAoUXVhZDkpXHJcbmh0dHBzOi8vMS4xLjEuMS9kbnMtcXVlcnkgKENsb3VkZmxhcmUpXHJcbmh0dHBzOi8vMS4wLjAuMS9kbnMtcXVlcnkgKENsb3VkZmxhcmUpXHJcbmh0dHBzOi8vMTQ5LjExMi4xMTIuMTEvZG5zLXF1ZXJ5IChRdWFkOSlcclxuLS1FbmQgRG9IIEFkZHJlc3Nlcy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgcmVsaWVzIG9uIGludGVybmFsLCBsb3ctbGV2ZWwgZnVuY3Rpb24gY2FsbHMgZnJvbSBhIGN1c3RvbSBHbyBwYWNrYWdlIHRvIGhhbmRsZSBpdHMgbmV0d29yayBjb25uZWN0aW9ucyBhbmQgY29tbWFuZCBwcm9jZXNzaW5nLiBUaGUgYmFja2Rvb3IgdXNlcyBEb0ggdG8gcmVzb2x2ZSB0aGUgYWRkcmVzc2VzIG9mIGl0cyBDMiBzZXJ2ZXJzLiBUaGUgYmFja2Rvb3IgY3JlYXRlcyBhIEROUyBxdWVyeSBmb3IgdGhlIG1hbGljaW91cyBDMiBkb21haW4gXCJbcmVkYWN0ZWRdLmNvbVwiLiBUaGUgYmFja2Rvb3IgZW5jcnlwdHMgdGhpcyBxdWVyeSBieSBlbmNhcHN1bGF0aW5nIGl0IHdpdGhpbiBhIHN0YW5kYXJkIEhUVFBTIHJlcXVlc3QuIFRoZSBiYWNrZG9vciBzZW5kcyB0aGUgZW5jcnlwdGVkIEhUVFBTIHJlcXVlc3QgdG8gYSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgb3BlcmF0ZWQgYnkgQ2xvdWRmbGFyZSwgR29vZ2xlLCBRdWFkOSBvciBOZXh0RE5TIHRvIHByb2Nlc3MgdGhlIHF1ZXJ5LiBBbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBpZiB0aGUgcmVxdWVzdGVkIGRvbWFpbiBpcyBub3QgZm91bmQgaW4gdGhlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgY2FjaGUsIHRoZSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgZm9yd2FyZHMgdGhlIHJlcXVlc3QgdG8gdGhlIG5leHQgc2VydmVyIGluIHRoZSBETlMgaGllcmFyY2h5LCB1bHRpbWF0ZWx5IHJlYWNoaW5nIHRoZSBUQSdzIEROUyBzZXJ2ZXIsIHdoaWNoIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNlcnZlciBmb3IgdGhlIG1hbGljaW91cyBkb21haW4uIFRoZSBUQSdzIEROUyBzZXJ2ZXIgd2lsbCByZXNwb25kIHdpdGggdGhlIGNvcnJlY3QgSVAgYWRkcmVzcyBmb3IgdGhlIEMyIGRvbWFpbiwgYW5kIHRoaXMgcmVzcG9uc2UgaXMgc2VudCBiYWNrIHRocm91Z2ggdGhlIGxlZ2l0aW1hdGUgRG9IIHJlc29sdmVyIHRvIHRoZSBiYWNrZG9vci4gVGhlIGJhY2tkb29yIHJlY2VpdmVzIHRoZSBlbmNyeXB0ZWQgcmVzcG9uc2UsIGRlY3J5cHRzIGl0IHRvIGdldCB0aGUgQzIgc2VydmVyJ3MgSVAgYWRkcmVzcywgYW5kIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbi5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIG11bHRpcGxlIGxheWVycyBvZiBlbmNyeXB0aW9uIGZvciBpdHMgQzIgY29tbXVuaWNhdGlvbnMuIFRoZSBiYWNrZG9vciBjb21tdW5pY2F0ZXMgb3ZlciBIVFRQUyB0byB0aGUgY2xvdWQgcGxhdGZvcm0gKFwiaHR0cHM6Ly9bcmVkYWN0ZWRdLmNvbVwiKSwgdGhlbiB1cGdyYWRlcyB0aGVzZSBzZXNzaW9ucyB0byBXZWJTb2NrZXRzIHdpdGggYW4gYWRkaXRpb25hbCBsYXllciBvZiBUTFMgZW5jcnlwdGlvbi4gVGhlIGJhY2tkb29yIHNlbmRzIEhUVFAgdXBncmFkZSByZXF1ZXN0IHRvIGNvbnZlcnQgdGhlIGluaXRpYWwgZW5jcnlwdGVkIEhUVFBTIGNvbm5lY3Rpb24gaW50byBhIHBlcnNpc3RlbnQgV2ViU29ja2V0IGNvbm5lY3Rpb246IFwid3NzOi8vW3JlZGFjdGVkXS5jb20vY2xvdWRhcGlcIi4gVGhlIGJhY2tkb29yIG5lc3RzIGFkZGl0aW9uYWwgbGF5ZXJzIG9mIFRMUyBlbmNyeXB0aW9uIHdpdGhpbiB0aGUgV2ViU29ja2V0IHNlc3Npb24uIFRoZSBiYWNrZG9vciBwZXJmb3JtcyBhIHNlcmllcyBvZiBuZXN0ZWQgVExTIGhhbmRzaGFrZXMgd2l0aGluIHRoZSBlc3RhYmxpc2hlZCBXZWJTb2NrZXQgdHVubmVsLiBUaGUgZmlyc3QgVExTIGhhbmRzaGFrZSBpcyB0aGUgc3RhbmRhcmQgVExTIGhhbmRzaGFrZSBmb3IgdGhlIGluaXRpYWwgSFRUUFMgcmVxdWVzdCB0byB0aGUgY2xvdWQgcGxhdGZvcm0uIEEgc2Vjb25kIFRMUyBoYW5kc2hha2Ugb2NjdXJzIHdpdGhpbiB0aGUgV2ViU29ja2V0IHR1bm5lbC4gRHVyaW5nIHRoaXMgc3RlcCwgdGhlIGJhY2tkb29yIGF1dGhlbnRpY2F0ZXMgaXRzZWxmIHRvIHRoZSBDMiBzZXJ2ZXIgdXNpbmcgYSBzdGF0aWMgYXV0aGVudGljYXRpb24ga2V5OiBcImhraWdiTEtIUl9QYnk2dDZQXCIuIEFuIGlubmVybW9zdCBUTFMgbGF5ZXIgZW5jcnlwdHMgdGhlIGFjdHVhbCBDMiBjb21tYW5kcyBhbmQgZGF0YSwgc2VjdXJpbmcgdGhlbSBldmVuIGlmIHRoZSBvdXRlciBsYXllcnMgYXJlIGJ5cGFzc2VkIG9yIGRlY3J5cHRlZC4gVGhlIGJhY2tkb29yIHVzZXMgdGhlIFwiSGFzaGlDb3JwIFlhbXV4XCIgbGlicmFyeSB0byBjcmVhdGUgbXVsdGlwbGUgc3RyZWFtcyB3aXRoaW4gYSBzaW5nbGUgaW5uZXJtb3N0IFRMUy1lbmNyeXB0ZWQgV2ViU29ja2V0IHR1bm5lbC4gVGhpcyBtZXRob2QgbWFrZXMgdGhlIFRBJ3MgYWN0aXZpdGllcyBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBhcyBtdWx0aXBsZSBjb21tYW5kcyBhbmQgbmV0d29yayB0dW5uZWxzIGFyZSBtdWx0aXBsZXhlZCBhbmQgaGlkZGVuIHdpdGhpbiBhIHNpbmdsZSwgZW5jcnlwdGVkIG5ldHdvcmsgc3RyZWFtLlxyXG5cclxuQWZ0ZXIgZXN0YWJsaXNoaW5nIGEgc2VjdXJlIGFuZCBjb3ZlcnQgY29ubmVjdGlvbiwgdGhlIGJhY2tkb29yIGxldmVyYWdlcyBpdHMgb2JmdXNjYXRlZCBjb3JlIFwidGFzay5Eb1Rhc2tcIiAoL2NvcmUvdGFzay5Eb1Rhc2spIGZ1bmN0aW9uIGFuZCBmb3VyIG9iZnVzY2F0ZWQgZXh0ZW5zaW9ucyAobW9kdWxlcykgXCJzb2Nrcy5Tb2Nrc1wiLCBcIndlYi5XZWJTZXJ2aWNlXCIsIFwiY29tbWFuZC5Db21tYW5kXCIsIGFuZCBcImNvbW1hbmQuQ29tbWFuZE5vQ29udGV4dFwiLiBUaGVzZSBleHRlbnNpb25zIGRlZmluZSB0aGUgbWFsaWNpb3VzIGZ1bmN0aW9uYWxpdHkgdGhhdCB0aGUgYmFja2Rvb3Igc2hvdWxkIGV4ZWN1dGUsIGFsbG93aW5nIHRoZSBUQSB0byBjYXJyeSBvdXQgdmFyaW91cyB0YXNrcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtcy4gVGhlc2UgbW9kdWxlcyBlbmFibGUgQzIgY29tbXVuaWNhdGlvbiwgbGF0ZXJhbCBtb3ZlbWVudCwgYW5kIGNvbW1hbmQgZXhlY3V0aW9uIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBmb3VyIGV4dGVuc2lvbnMgYW5kIHRoZWlyIGZ1bmN0aW9uczpcclxuXHJcbi0tQmVnaW4gRXh0ZW5zaW9ucy0tXHJcbmEuIFRoZSBTb2NrcyBleHRlbnNpb24gZW5hYmxlcyBuZXR3b3JrIHR1bm5lbGluZyB0aHJvdWdoIGEgU09DS1MgcHJveHksIHdoaWNoIGZhY2lsaXRhdGVzIGxhdGVyYWwgbW92ZW1lbnQgd2l0aGluIGEgY29tcHJvbWlzZWQgbmV0d29yayBhbmQgcm91dGVzIEMyIHRyYWZmaWMuXHJcblxyXG5iLiBUaGUgV2ViU2VydmljZSBleHRlbnNpb24gbW9kdWxlIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyLiBUaGUgZXh0ZW5zaW9uIHVzZXMgdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLCBsZXZlcmFnaW5nIHRoZSBcIm5ldC9odHRwIHBhY2thZ2VcIiBhbmQgXCJnb3JpbGxhL211eFwiIGxpYnJhcnksIHRvIGNyZWF0ZSBhIHdlYiBzZXJ2ZXIgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gQSBkZWRpY2F0ZWQgQVBJIFwiL2FwaS9cIiBlbmRwb2ludCBpcyBjcmVhdGVkIHRvIHJlY2VpdmUgYW5kIGV4ZWN1dGUgY29tbWFuZHMgZnJvbSB0aGUgVEEncyBDMiBzZXJ2ZXIuIFRoaXMgcHJvdmlkZXMgdGhlIFRBIHdpdGggZXh0ZW5zaXZlIGNvbnRyb2wgb3ZlciB0aGUgdmljdGltJ3MgZmlsZSBzeXN0ZW0sIGFsbG93aW5nIHRoZSBUQSB0byBicm93c2UsIHZpZXcsIGNyZWF0ZSwgZGVsZXRlLCB1cGxvYWQsIGFuZCBkb3dubG9hZCBmaWxlcyBhbmQgZm9sZGVycy4gVG8gYmxlbmQgaW4gYW5kIGV2YWRlIGRldGVjdGlvbiwgdGhlIGJhY2tkb29yIHNlcnZlcyBzdGF0aWMgd2ViIGZpbGVzIChIVE1MLCBDU1MsIEphdmFTY3JpcHQpIGZyb20gYSBkZXNpZ25hdGVkIGRpcmVjdG9yeS4gVGhpcyBtYWtlcyB0aGUgbWFsaWNpb3VzIHdlYiBzZXJ2ZXIgYXBwZWFyIHRvIGJlIGEgc3RhbmRhcmQgd2ViIGFwcGxpY2F0aW9uLlxyXG5cclxuYy4gVGhlIENvbW1hbmQgZXh0ZW5zaW9uIGV4ZWN1dGVzIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gd2l0aCBhIHNwZWNpZmljIHNlY3VyaXR5IGNvbnRleHQuXHJcblxyXG5kLiBUaGUgQ29tbWFuZE5vQ29udGV4dCBleHRlbnNpb24gZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRob3V0IHVzaW5nIGFuIGV4cGxpY2l0IHNlY3VyaXR5IGNvbnRleHQuXHJcbi0tRW5kIEV4dGVuc2lvbnMgLS1cclxuXHJcblRoZSBiYWNrZG9vciBtYWludGFpbnMgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gdG8gdGhlIEMyIHNlcnZlciB1bmxlc3MgYSBzcGVjaWZpYyB0ZXJtaW5hdGlvbiBjb21tYW5kIGlzIHJlY2VpdmVkIG9yIHRoZSBDMiBzZXJ2ZXIgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4iLAogICAgICAgICAgICAibWFsd2FyZV90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJ0cm9qYW4iLAogICAgICAgICAgICAgICAgImJhY2tkb29yIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaXNfZmFtaWx5IjogZmFsc2UsCiAgICAgICAgICAgICJzYW1wbGVfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJmaWxlLS01YWVjMGM1MC1hMWI4LTU5YTItYjcwZC1mNzhlN2Y5OWY4ZTgiCiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiaW5kaWNhdG9yIiwKICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAiaWQiOiAiaW5kaWNhdG9yLS02MmM2MjQ2Yy0wMzA0LTQyYjgtOGNiMi03NmQ4NTcwODg2MGIiLAogICAgICAgICAgICAiY3JlYXRlZF9ieV9yZWYiOiAiaWRlbnRpdHktLThlMTEyZTcyLWFhOGYtNDE5MC1hMzU5LTI4YTlhYmFlMjg5NiIsCiAgICAgICAgICAgICJjcmVhdGVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJtb2RpZmllZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibmFtZSI6ICJmN2NkYTkwMTc0YjgwNmEzNDM4MWQ1MDQzZTg5YjIzYmE4MjZhYmNjODlmN2FiZDUyMDA2MGE2NDQ3NWVkNTA2IiwKICAgICAgICAgICAgIm9iamVjdF9tYXJraW5nX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS05NDg2OGM4OS04M2MyLTQ2NGItOTI5Yi1hMWE4YWEzYzg0ODciLAogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tYTlhM2FmNmYtNTVlOS00MWJkLThkOGItYjlmYTFkMzI1ZDViIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5kaWNhdG9yX3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm1hbGljaW91cy1hY3Rpdml0eSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInBhdHRlcm4iOiAiW2ZpbGU6aGFzaGVzLidNRDUnPScxOGY4OTVlMjRmZTExODFiYjU1OTIxNWZmOWNmNmNlMycgT1IgZmlsZTpoYXNoZXMuJ1NIQS0xJz0nYzM1NDlkNGU1ZTM5YTExZjYwOWZjNmZiZjVjYzFmMmMwZWMyNzJiNCcgT1IgZmlsZTpoYXNoZXMuJ1NIQS0yNTYnPSdmN2NkYTkwMTc0YjgwNmEzNDM4MWQ1MDQzZTg5YjIzYmE4MjZhYmNjODlmN2FiZDUyMDA2MGE2NDQ3NWVkNTA2JyBPUiBmaWxlOmhhc2hlcy4nU0hBLTUxMic9Jzc5Mjc2NTIzYTZhNTA3ZTNmYTFiMTJiOTZlMDliMTBhMDFjNzgzYTUzZDU4YjlhZTdmNTc4MGEzNzk0MzE2MzlhODAxNjVlODExNTQ1MjI2NDliOGUyMDk4ZTg2ZDFhMzEwZWZmZmViZTMyZmFhZmM3YjNiYzA5M2VlYzYwYTY0J10iLAogICAgICAgICAgICAicGF0dGVybl90eXBlIjogInN0aXgiLAogICAgICAgICAgICAicGF0dGVybl92ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJ2YWxpZF9mcm9tIjogIjIwMjUtMTItMDJUMTY6MDc6MjMuODYxODU5WiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImZpbGUtLTVhNDA5ZTBhLTIxNDEtNTU2Yi1iMTk1LTQ0ZjVkOGU2YWJiMSIsCiAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAiTUQ1IjogIjgyYmYzMWU3ZDc2OGU2ZDRkM2JjN2M4YzhlZjJiMzU4IiwKICAgICAgICAgICAgICAgICJTSEEtMSI6ICJkZTI4NTQ2ZWMzNTZjNTY2Y2Q4YmNhMjA1MTAxYTczM2U5YTRhMjJkIiwKICAgICAgICAgICAgICAgICJTSEEtMjU2IjogIjIyYzE1YTMyYjY5MTE2YTQ2ZWI1ZDBmMmIyMjhjYzM3Y2QxYjU5MTVhOTFlYzhmMzhkZjc5ZDNlZWQxZGEyNmIiLAogICAgICAgICAgICAgICAgIlNIQS01MTIiOiAiNGM1MmNhZjJlNWYxMTQxMDNlZDVmNjBjNmFkZDNhYTI2Yzc0MWIwNzg2OWJiNjZlM2MyNWExZGMyOTBkNGE4YmY4N2M0MmMzMzZlOGFjOGViZjgyZDlhOWIyM2VhYTE4YzMxZjcwNTFhNTk3MGE4ZmUxMTI1YTJkYTg5MDM0MGYiLAogICAgICAgICAgICAgICAgIlNTREVFUCI6ICI0OTE1Mjp1UDlrUFdkbXJKbCs5enhLc1NKMzJzc1VaR0haOUVDS0RmdkNiM1hLUmJhWUpjUkhNSDl4a2RnWTNncUYySHhSOnlxV2RtZDR4NVNnc3NVWjBPQ0tEZnZDaFlyUnEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzaXplIjogNjMwMzc0NCwKICAgICAgICAgICAgIm5hbWUiOiAiMjJjMTVhMzJiNjkxMTZhNDZlYjVkMGYyYjIyOGNjMzdjZDFiNTkxNWE5MWVjOGYzOGRmNzlkM2VlZDFkYTI2YiIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJpbmRpY2F0b3IiLAogICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIuMSIsCiAgICAgICAgICAgICJpZCI6ICJpbmRpY2F0b3ItLWYzNjdmNWE1LTQwZGYtNGVjZS1hMThkLTQxYzZmZjU5ZjBjYSIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJuYW1lIjogIjIyYzE1YTMyYjY5MTE2YTQ2ZWI1ZDBmMmIyMjhjYzM3Y2QxYjU5MTVhOTFlYzhmMzhkZjc5ZDNlZWQxZGEyNmIiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGFydGlmYWN0IGlzIGEgbWFsaWNpb3VzIDY0LWJpdCBFTEYgZXhlY3V0YWJsZSB3cml0dGVuIGluIHRoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhlIGJpbmFyeSBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgYmFja2Rvb3IgdmFyaWFudCBuYW1lZCBCUklDS1NUT1JNIHRoYXQgdXNlcyBzZXZlcmFsIGFkdmFuY2VkIHRlY2huaXF1ZXMgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgdXNlcyBTT0NLUyBwcm94eWluZywgbXVsdGktbGF5ZXJlZCB3ZWIgc2VydmljZSBjb21tdW5pY2F0aW9uLCBhbmQgdmFyaWVkIGNvbW1hbmQgZXhlY3V0aW9uIHRvIG9ic2N1cmUgaXRzIGFjdGl2aXRpZXMuIFRoZSBiYWNrZG9vciBjb21iaW5lcyBzZXZlcmFsIHNvcGhpc3RpY2F0ZWQgdGVjaG5pcXVlcywgaW5jbHVkaW5nIERvSCwgbmVzdGVkIFRMUyBlbmNyeXB0aW9uLCBhbmQgdGhlIGFidXNlIG9mIGEgbGVnaXRpbWF0ZSBjbG91ZCBzZXJ2aWNlIHRvIGV2YWRlIGRldGVjdGlvbi4gVGhlIGJhY2tkb29yIGNvbnRhaW5zIHRoZSBhdXRoZW50aWNhdGlvbiBrZXksIEhUVFBTIGFuZCBXZWJTb2NrZXQgYWRkcmVzc2VzIGFzIHBhcnQgb2YgaXRzIHNvcGhpc3RpY2F0ZWQsIG11bHRpLWxheWVyZWQgQzIgZXZhc2lvbiB0ZWNobmlxdWUuXHJcblxyXG4tLUJlZ2luIEVsZW1lbnRzLS1cclxuaGtpZ2JMS0hSX1BieTZ0NlAgPT0+IGF1dGhlbnRpY2F0aW9uIGtleVxyXG5odHRwczovL1tyZWRhY3RlZF0uY29tID09PiBIVFRQUyBhZGRyZXNzXHJcbndzczovL1tyZWRhY3RlZF0uY29tL2FwaSA9PT4gV2ViU29ja2V0IGFkZHJlc3NcclxuLS1FbmQgRWxlbWVudHMtLVxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgWE9SIGNpcGhlciBlbmNyeXB0aW9uIHRvIGhpZGUga2V5IHN0cmluZ3MsIHN1Y2ggYXMgaXRzIElQdjQgYWRkcmVzc2VzIG9mIHB1YmxpYyBEb0ggc2VydmVycyBhbmQgb3RoZXIgc3RyaW5ncyB3aXRoaW4gaXRzIGNvZGUuIFVwb24gZXhlY3V0aW9uLCB0aGUgYmFja2Rvb3IgaW5pdGlhdGVzIHRoZSBvYmZ1c2NhdGVkIGZ1bmN0aW9uIFwibWFpbl9zdGFydE5ld1wiIHRvIGNvbmZpZ3VyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBiYWNrZG9vciB0aGVuIGNoZWNrcyBmb3IgdGhlIFwiRklPT05cIiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgcnVubmluZyBhcyBhIGNoaWxkIHByb2Nlc3MuIElmIFwiRklPT05cIiBpcyBub3Qgc2V0LCBpbmRpY2F0aW5nIG5vdCBhIGNoaWxkIHByb2Nlc3MsIHRoZSBiYWNrZG9vciB2ZXJpZmllcyBpdHMgY3VycmVudCBleGVjdXRpb24gcGF0aCBieSBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlIGZpbGUgY29udGVudHMgZnJvbSBcIi9ldGMvc3lzY29uZmlnL3Z0c1wiLiBJZiBub3QgcnVubmluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoIFwiL2V0Yy9zeXNjb25maWcvdnRzXCIsIHRoZSBiYWNrZG9vciB0ZXJtaW5hdGVzIGl0cyBjb2RlIGV4ZWN1dGlvbi4gSWYgdGhlIGJhY2tkb29yIGV4ZWN1dGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoLCB0aGUgYmFja2Rvb3IgY29waWVzIGl0c2VsZiB0byBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi91cGRhdGVtZ3JcIi4gVGhlIGJhY2tkb29yIHRoZW4gcHJlcGVuZHMgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vXCIgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGVuc3VyaW5nIHRoZSBuZXdseSBjb3BpZWQgYmFja2Rvb3IgdGFrZXMgcHJlY2VkZW5jZSBpbiBleGVjdXRpb24uIFRoZSBiYWNrZG9vciBleGVjdXRlcyB0aGUgY29waWVkIGJhY2tkb29yIG5hbWVkIFwidXBkYXRlbWdyXCIgZHVlIHRvIHRoZSBQQVRIIG1vZGlmaWNhdGlvbiBhbmQgdGVybWluYXRlcyBpdHMgb3duIGV4ZWN1dGlvbi4gSWYgXCJGSU9PTlwiIGlzIHNldCwgaW5kaWNhdGluZyBhIGNoaWxkIHByb2Nlc3MsIHRoZSBiYWNrZG9vciBjb250aW51ZXMgaXRzIG1haW4gY29kZSBleGVjdXRpb24uIEFzIHBhcnQgb2YgdGhpcyBjb250aW51ZWQgZXhlY3V0aW9uLCB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGJhY2tkb29yIGF0IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiIGlzIGRlbGV0ZWQuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyB0aGUgb2JmdXNjYXRlZCBmdW5jdGlvbiBcIm1haW5fc2VsZldhdGNoZXJcIiB0byBlbnN1cmUgaXRzIGNvbnRpbnVlZCBvcGVyYXRpb24gYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uIFRoaXMgc2VsZi1wcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGNoZWNrcyBpZiB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBhbiBpbnRlbmRlZCBwcm9jZXNzIGFuZCwgaWYgbm90LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgYW5kIHJlLWV4ZWN1dGVzIGl0c2VsZi4gVGhlIFwibWFpbl9zZWxmV2F0Y2hlclwiIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgdGhlIFwiRElHTk5cIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgY29uZmlybXMgdGhlIGV4aXN0ZW5jZSBvZiBhIHByb2Nlc3MgbmFtZWQgXCJ1cGRhdGVtZ3JcIi4gSWYgdGhlIGNoZWNrcyByZXR1cm4gYSBcImZhbHNlXCIgdmFsdWUgKFwiRElHTk5cIiBpcyBub3Qgc2V0ICksIGluZGljYXRpbmcgdGhlIGJhY2tkb29yIGlzIG5vdCBydW5uaW5nIGNvcnJlY3RseSwgdGhlIGJhY2tkb29yIHJlLWluc3RhbGxzIGl0c2VsZiBmcm9tIFwiL2V0Yy9zeXNjb25maWcvdnRzXCIgdG8gYSBuZXcgbG9jYXRpb246IFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi9cIiB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciBmaWxlIFwidXBkYXRlbWdyXCIgaXMgZXhlY3V0ZWQuIFRoZSBwYXJlbnQgYmFja2Rvb3IgdGhlbiB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLCBhbGxvd2luZyB0aGUgbmV3IHByb2Nlc3MgdG8gY29udGludWUgcnVubmluZy4gSWYgdGhlIGluaXRpYWwgY2hlY2tzIGNvbmZpcm0gdGhhdCB0aGUgYmFja2Rvb3IgaXMgcnVubmluZyBhcyBpbnRlbmRlZCwgaW5kaWNhdGluZyBcIkRJR05OXCIgaXMgc2V0LCB0aGUgXCJtYWluX3NlbGZXYXRjaGVyXCIgZnVuY3Rpb24gYWxsb3dzIHRoZSBjb2RlIHRvIGNvbnRpbnVlIGl0cyBub3JtYWwgbWFsaWNpb3VzIG9wZXJhdGlvbnMuXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBhbiBYT1Igb3BlcmF0aW9uIHRvIGRlY3J5cHQgdGhlIElQdjQgYWRkcmVzc2VzIGZvciB0aGUgRG9IIHNlcnZlcnMgYmVsb3c6XHJcblxyXG4tLUJlZ2luIERvSCBBZGRyZXNzZXMtLVxyXG5odHRwczovLzguOC44LjgvZG5zLXF1ZXJ5IChHb29nbGUpXHJcbmh0dHBzOi8vOC44LjQuNC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHR0cHM6Ly8xLjEuMS4xL2Rucy1xdWVyeSAoQ2xvdWRmbGFyZSlcclxuaHR0cHM6Ly8xLjAuMC4xL2Rucy1xdWVyeSAoQ2xvdWRmbGFyZSlcclxuLS1FbmQgRG9IIEFkZHJlc3Nlcy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgcmVsaWVzIG9uIGludGVybmFsLCBsb3ctbGV2ZWwgZnVuY3Rpb24gY2FsbHMgZnJvbSBhIGN1c3RvbSBHbyBwYWNrYWdlIHRvIGhhbmRsZSBpdHMgbmV0d29yayBjb25uZWN0aW9ucyBhbmQgY29tbWFuZCBwcm9jZXNzaW5nLiBUaGUgYmFja2Rvb3IgdXNlcyBEb0ggdG8gcmVzb2x2ZSB0aGUgYWRkcmVzc2VzIG9mIGl0cyBDMiBzZXJ2ZXJzLiBUaGUgYmFja2Rvb3IgY3JlYXRlcyBhIEROUyBxdWVyeSBmb3IgdGhlIG1hbGljaW91cyBDMiBkb21haW4gXCJbcmVkYWN0ZWRdLmNvbVwiLiBUaGUgYmFja2Rvb3IgZW5jcnlwdHMgdGhpcyBxdWVyeSBieSBlbmNhcHN1bGF0aW5nIGl0IHdpdGhpbiBhIHN0YW5kYXJkIEhUVFBTIHJlcXVlc3QuIFRoZSBiYWNrZG9vciBzZW5kcyB0aGUgZW5jcnlwdGVkIEhUVFBTIHJlcXVlc3QgdG8gYSBsZWdpdGltYXRlIHB1YmxpYyBEb0ggcmVzb2x2ZXIgb3BlcmF0ZWQgYnkgQ2xvdWRmbGFyZSBvciBHb29nbGUgdG8gcHJvY2VzcyB0aGUgcXVlcnkuIEFuYWx5c2lzIGluZGljYXRlcyB0aGF0IGlmIHRoZSByZXF1ZXN0ZWQgZG9tYWluIGlzIG5vdCBmb3VuZCBpbiB0aGUgcHVibGljIERvSCByZXNvbHZlciBjYWNoZSwgdGhlIGxlZ2l0aW1hdGUgcHVibGljIERvSCByZXNvbHZlciBmb3J3YXJkcyB0aGUgcmVxdWVzdCB0byB0aGUgbmV4dCBzZXJ2ZXIgaW4gdGhlIEROUyBoaWVyYXJjaHksIHVsdGltYXRlbHkgcmVhY2hpbmcgdGhlIFRBJ3MgRE5TIHNlcnZlciwgd2hpY2ggaXMgdGhlIGF1dGhvcml0YXRpdmUgc2VydmVyIGZvciB0aGUgbWFsaWNpb3VzIGRvbWFpbi4gVGhlIFRBJ3MgRE5TIHNlcnZlciB3aWxsIHJlc3BvbmQgd2l0aCB0aGUgY29ycmVjdCBJUCBhZGRyZXNzIGZvciB0aGUgQzIgZG9tYWluLCBhbmQgdGhpcyByZXNwb25zZSBpcyBzZW50IGJhY2sgdGhyb3VnaCB0aGUgbGVnaXRpbWF0ZSBEb0ggcmVzb2x2ZXIgdG8gdGhlIGJhY2tkb29yLiBUaGUgYmFja2Rvb3IgcmVjZWl2ZXMgdGhlIGVuY3J5cHRlZCByZXNwb25zZSwgZGVjcnlwdHMgaXQgdG8gZ2V0IHRoZSBDMiBzZXJ2ZXIncyBJUCBhZGRyZXNzLCBhbmQgZXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uLlxyXG5cclxuVGhlIGJhY2tkb29yIHVzZXMgbXVsdGlwbGUgbGF5ZXJzIG9mIGVuY3J5cHRpb24gZm9yIGl0cyBDMiBjb21tdW5pY2F0aW9ucy4gVGhlIGJhY2tkb29yIGNvbW11bmljYXRlcyBvdmVyIEhUVFBTIHRvIHRoZSBjbG91ZCBwbGF0Zm9ybSAoXCJodHRwczovL1tyZWRhY3RlZF0uY29tXCIpLCB0aGVuIHVwZ3JhZGVzIHRoZXNlIHNlc3Npb25zIHRvIFdlYlNvY2tldHMgd2l0aCBhbiBhZGRpdGlvbmFsIGxheWVyIG9mIFRMUyBlbmNyeXB0aW9uLiBUaGUgYmFja2Rvb3Igc2VuZHMgSFRUUCB1cGdyYWRlIHJlcXVlc3QgdG8gY29udmVydCB0aGUgaW5pdGlhbCBlbmNyeXB0ZWQgSFRUUFMgY29ubmVjdGlvbiBpbnRvIGEgcGVyc2lzdGVudCBXZWJTb2NrZXQgY29ubmVjdGlvbjogXCJ3c3M6Ly9bcmVkYWN0ZWRdLmNvbS9hcGlcIi4gVGhlIGJhY2tkb29yIG5lc3RzIGFkZGl0aW9uYWwgbGF5ZXJzIG9mIFRMUyBlbmNyeXB0aW9uIHdpdGhpbiB0aGUgV2ViU29ja2V0IHNlc3Npb24uIFRoZSBiYWNrZG9vciBwZXJmb3JtcyBhIHNlcmllcyBvZiBuZXN0ZWQgVExTIGhhbmRzaGFrZXMgd2l0aGluIHRoZSBlc3RhYmxpc2hlZCBXZWJTb2NrZXQgdHVubmVsLiBUaGUgZmlyc3QgVExTIGhhbmRzaGFrZSBpcyB0aGUgc3RhbmRhcmQgVExTIGhhbmRzaGFrZSBmb3IgdGhlIGluaXRpYWwgSFRUUFMgcmVxdWVzdCB0byB0aGUgY2xvdWQgcGxhdGZvcm0uIEEgc2Vjb25kIFRMUyBoYW5kc2hha2Ugb2NjdXJzIHdpdGhpbiB0aGUgV2ViU29ja2V0IHR1bm5lbC4gRHVyaW5nIHRoaXMgc3RlcCwgdGhlIGJhY2tkb29yIGF1dGhlbnRpY2F0ZXMgaXRzZWxmIHRvIHRoZSBDMiBzZXJ2ZXIgdXNpbmcgYSBzdGF0aWMgYXV0aGVudGljYXRpb24ga2V5OiBcImhraWdiTEtIUl9QYnk2dDZQXCIuIEFuIGlubmVybW9zdCBUTFMgbGF5ZXIgZW5jcnlwdHMgdGhlIGFjdHVhbCBDMiBjb21tYW5kcyBhbmQgZGF0YSwgc2VjdXJpbmcgdGhlbSBldmVuIGlmIHRoZSBvdXRlciBsYXllcnMgYXJlIGJ5cGFzc2VkIG9yIGRlY3J5cHRlZC4gVGhlIGJhY2tkb29yIHVzZXMgdGhlIFwiSGFzaGlDb3JwIFlhbXV4XCIgbGlicmFyeSB0byBjcmVhdGUgbXVsdGlwbGUgc3RyZWFtcyB3aXRoaW4gYSBzaW5nbGUgaW5uZXJtb3N0IFRMUy1lbmNyeXB0ZWQgV2ViU29ja2V0IHR1bm5lbC4gVGhpcyBtZXRob2QgbWFrZXMgdGhlIFRBJ3MgYWN0aXZpdGllcyBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBhcyBtdWx0aXBsZSBjb21tYW5kcyBhbmQgbmV0d29yayB0dW5uZWxzIGFyZSBtdWx0aXBsZXhlZCBhbmQgaGlkZGVuIHdpdGhpbiBhIHNpbmdsZSwgZW5jcnlwdGVkIG5ldHdvcmsgc3RyZWFtLlxyXG5cclxuQWZ0ZXIgZXN0YWJsaXNoaW5nIGEgc2VjdXJlIGFuZCBjb3ZlcnQgY29ubmVjdGlvbiwgdGhlIGJhY2tkb29yIGxldmVyYWdlcyBpdHMgb2JmdXNjYXRlZCBjb3JlIFwidGFzay5Eb1Rhc2tcIiAoL2NvcmUvdGFzay5Eb1Rhc2spIGZ1bmN0aW9uIGFuZCBmb3VyIG9iZnVzY2F0ZWQgZXh0ZW5zaW9ucyAobW9kdWxlcykgXCJzb2Nrcy5Tb2Nrc1wiLCBcIndlYi5XZWJTZXJ2aWNlXCIsIFwiY29tbWFuZC5Db21tYW5kXCIsIGFuZCBcImNvbW1hbmQuQ29tbWFuZE5vQ29udGV4dFwiLiBUaGVzZSBleHRlbnNpb25zIGRlZmluZSB0aGUgbWFsaWNpb3VzIGZ1bmN0aW9uYWxpdHkgdGhhdCB0aGUgYmFja2Rvb3Igc2hvdWxkIGV4ZWN1dGUsIGFsbG93aW5nIHRoZSBUQSB0byBjYXJyeSBvdXQgdmFyaW91cyB0YXNrcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtcy4gVGhlc2UgbW9kdWxlcyBlbmFibGUgQzIgY29tbXVuaWNhdGlvbiwgbGF0ZXJhbCBtb3ZlbWVudCwgYW5kIGNvbW1hbmQgZXhlY3V0aW9uIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0uXHJcblxyXG5EaXNwbGF5ZWQgYmVsb3cgYXJlIHRoZSBmb3VyIGV4dGVuc2lvbnMgYW5kIHRoZWlyIGZ1bmN0aW9uczpcclxuXHJcbi0tQmVnaW4gRXh0ZW5zaW9ucy0tXHJcbmEuIFRoZSBTb2NrcyBleHRlbnNpb24gZW5hYmxlcyBuZXR3b3JrIHR1bm5lbGluZyB0aHJvdWdoIGEgU09DS1MgcHJveHksIHdoaWNoIGZhY2lsaXRhdGVzIGxhdGVyYWwgbW92ZW1lbnQgd2l0aGluIGEgY29tcHJvbWlzZWQgbmV0d29yayBhbmQgcm91dGVzIEMyIHRyYWZmaWMuXHJcblxyXG5iLiBUaGUgV2ViU2VydmljZSBleHRlbnNpb24gbW9kdWxlIGVzdGFibGlzaGVzIGNvdmVydCBDMiBjb21tdW5pY2F0aW9uIGJ5IG1ha2luZyB0aGUgYmFja2Rvb3IgYXBwZWFyIGFzIGEgbGVnaXRpbWF0ZSB3ZWIgc2VydmVyLiBUaGUgZXh0ZW5zaW9uIHVzZXMgdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLCBsZXZlcmFnaW5nIHRoZSBcIm5ldC9odHRwIHBhY2thZ2VcIiBhbmQgXCJnb3JpbGxhL211eFwiIGxpYnJhcnksIHRvIGNyZWF0ZSBhIHdlYiBzZXJ2ZXIgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gQSBkZWRpY2F0ZWQgQVBJIFwiL2FwaS9cIiBlbmRwb2ludCBpcyBjcmVhdGVkIHRvIHJlY2VpdmUgYW5kIGV4ZWN1dGUgY29tbWFuZHMgZnJvbSB0aGUgVEEncyBDMiBzZXJ2ZXIuIFRoaXMgcHJvdmlkZXMgdGhlIFRBIHdpdGggZXh0ZW5zaXZlIGNvbnRyb2wgb3ZlciB0aGUgdmljdGltJ3MgZmlsZSBzeXN0ZW0sIGFsbG93aW5nIHRoZSBUQSB0byBicm93c2UsIHZpZXcsIGNyZWF0ZSwgZGVsZXRlLCB1cGxvYWQsIGFuZCBkb3dubG9hZCBmaWxlcyBhbmQgZm9sZGVycy4gVG8gYmxlbmQgaW4gYW5kIGV2YWRlIGRldGVjdGlvbiwgdGhlIGJhY2tkb29yIHNlcnZlcyBzdGF0aWMgd2ViIGZpbGVzIChIVE1MLCBDU1MsIEphdmFTY3JpcHQpIGZyb20gYSBkZXNpZ25hdGVkIGRpcmVjdG9yeS4gVGhpcyBtYWtlcyB0aGUgbWFsaWNpb3VzIHdlYiBzZXJ2ZXIgYXBwZWFyIHRvIGJlIGEgc3RhbmRhcmQgd2ViIGFwcGxpY2F0aW9uLlxyXG5cclxuYy4gVGhlIENvbW1hbmQgZXh0ZW5zaW9uIGV4ZWN1dGVzIGNvbW1hbmRzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW0gd2l0aCBhIHNwZWNpZmljIHNlY3VyaXR5IGNvbnRleHQuXHJcblxyXG5kLiBUaGUgQ29tbWFuZE5vQ29udGV4dCBleHRlbnNpb24gZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRob3V0IHVzaW5nIGFuIGV4cGxpY2l0IHNlY3VyaXR5IGNvbnRleHQuXHJcbi0tRW5kIEV4dGVuc2lvbnMtLVxyXG5cclxuVGhlIGJhY2tkb29yIG1haW50YWlucyBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiB0byB0aGUgQzIgc2VydmVyIHVubGVzcyBhIHNwZWNpZmljIHRlcm1pbmF0aW9uIGNvbW1hbmQgaXMgcmVjZWl2ZWQgb3IgdGhlIEMyIHNlcnZlciB0ZXJtaW5hdGVzIHRoZSBjb25uZWN0aW9uLiIsCiAgICAgICAgICAgICJpbmRpY2F0b3JfdHlwZXMiOiBbCiAgICAgICAgICAgICAgICAibWFsaWNpb3VzLWFjdGl2aXR5IgogICAgICAgICAgICBdLAogICAgICAgICAgICAicGF0dGVybiI6ICIgJ25hbWVzcGFjZSc9J0NJU0FfQ29uc29saWRhdGVkLnlhcmEnIHJ1bGVfbmFtZT1DSVNBXzI1MTE1NV8wMiBydWxlX2NvbnRlbnQ9cnVsZSBDSVNBXzI1MTE1NV8wMiA6IEJSSUNLU1RPUk0gYmFja2Rvb3IgaW5zdGFsbHNfb3RoZXJfY29tcG9uZW50cyBjb21tdW5pY2F0ZXNfd2l0aF9jMiBleGZpbHRyYXRlc19kYXRhXG57XG4gICBtZXRhOlxuICAgICAgIGF1dGhvciA9IFwiQ0lTQSBDb2RlICYgTWVkaWEgQW5hbHlzaXNcIlxuICAgICAgIGluY2lkZW50ID0gXCIyNTExNTVcIlxuICAgICAgIGRhdGUgPSBcIjIwMjUtMDktMTVcIlxuICAgICAgIGxhc3RfbW9kaWZpZWQgPSBcIjIwMjUwOTE2XzE1MTFcIlxuICAgICAgIGFjdG9yID0gXCJuL2FcIlxuICAgICAgIGZhbWlseSA9IFwiQlJJQ0tTVE9STVwiXG4gICAgICAgY2FwYWJpbGl0aWVzID0gXCJpbnN0YWxscy1vdGhlci1jb21wb25lbnRzIGNvbW11bmljYXRlcy13aXRoLWMyIGV4ZmlsdHJhdGVzLWRhdGFcIlxuICAgICAgIG1hbHdhcmVfdHlwZSA9IFwiYmFja2Rvb3JcIlxuICAgICAgIHRvb2xfdHlwZSA9IFwidW5rbm93blwiXG4gICAgICAgZGVzY3JpcHRpb24gPSBcIkRldGVjdHMgR28tQmFzZWQgQlJJQ0tTVE9STSBiYWNrZG9vciBzYW1wbGVzXCJcbiAgICAgICBzaGEyNTZfMSA9IFwiMzIwYTBiNWQ0OTAwNjk3ZTEyNWNlYmI1ZmYwM2RlZTczNjhmOGYwODdkYjFjMTU3MGIwYjYyZjVhOTg2ZDc1OVwiXG4gICAgICAgc2hhMjU2XzEgPSBcImRmYWMyNTQyYTBlZTY1YzQ3NGI5MWQzYjM1MjU0MGEyNGY0ZTIyM2YxYjgwOGI3NDFjZmU2ODAyNjNmMGVlNDRcIlxuICAgICAgIHNoYTI1Nl8xID0gXCJiOTE4ODFjYjFhYTg2MTEzOGYyMDYzZWMxMzBiMmIwMWE4YWFmMGUzZjA0OTIxZTVjYmZjNjFiMDkwMjRiZjEyXCJcbiAgICAgICBzaGEyNTZfMSA9IFwiYmZiM2ZmZDQ2YjIxYjIyODEzNzRjZDYwYmM3NTZmZTJkY2MzMjQ4NmRjYzE1NmM5YmQ5OGYyNDEwMTE0NTQ1NFwiXG4gICBzdHJpbmdzOlxuICAgICAgICRzMCA9IHsgMDQgMzAgMEYgQjYgNTQgMDQgMkMgMzEgRDEgODggNEMgMDQgMzQgNDggRkYgQzAgfVxuICAgICAgICRzMSA9IHsgNDggODMgRjggMDQgN0MgRTcgNDggQzcgMDQgMjQgfVxuICAgICAgICRzMiA9IHsgNDggOEQgNDQgMjQgMzQgNDggODkgNDQgMjQgMDggNDggQzcgNDQgMjQgMTAgMDQgfVxuICAgICAgICRzMyA9IHsgNDggODkgNDQgMjQgNDggNDggODkgNEMgMjQgNTAgNDggOEIgNkMgMjQgMzggNDggfVxuICAgICAgICRzNCA9IHsgNDggODMgRUMgNDAgNDggODkgNkMgMjQgMzggNDggOEQgNkMgMjQgMzggQzcgNDQgMjQgfVxuICAgICAgICRzNSA9IHsgODMgRUMgMzggNDggODkgNkMgMjQgMzAgNDggOEQgNkMgMjQgMzAgQzYgNDQgMjQgfVxuICAgICAgICRzNiA9IHsgNEMgMjQgMjAgNDggODkgNDQgMjQgNDAgNDggODkgNEMgMjQgNDggNDggOEIgNkMgfVxuICAgICAgICRzNyA9IHsgNjQgNDggOEIgMEMgMjUgRjggRkYgRkYgRkYgNDggM0IgNjEgMTAgMEYgODYgODEgfVxuICAgICAgICRzOCA9IHsgNjQgNDggOEIgMEMgMjUgRjggRkYgRkYgRkYgNDggM0IgNjEgMTAgMEYgODYgOTEgfVxuICAgY29uZGl0aW9uOlxuICAgICAgYWxsIG9mIHRoZW1cbn1cbiIsCiAgICAgICAgICAgICJwYXR0ZXJuX3R5cGUiOiAieWFyYSIsCiAgICAgICAgICAgICJ2YWxpZF9mcm9tIjogIjIwMjUtMTItMDJUMTY6MDc6MjMuOTMzNTMxWiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAibWFsd2FyZS1hbmFseXNpcyIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogIm1hbHdhcmUtYW5hbHlzaXMtLTdiMDAzYmI2LTJmZTktNGRhZS04YmY4LTZlMDc1MTY1NGNmNSIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJwcm9kdWN0IjogImVzZXQiLAogICAgICAgICAgICAib2JqZWN0X21hcmtpbmdfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLTk0ODY4Yzg5LTgzYzItNDY0Yi05MjliLWExYThhYTNjODQ4NyIsCiAgICAgICAgICAgICAgICAibWFya2luZy1kZWZpbml0aW9uLS1hOWEzYWY2Zi01NWU5LTQxYmQtOGQ4Yi1iOWZhMWQzMjVkNWIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJyZXN1bHRfbmFtZSI6ICJhIHZhcmlhbnQgb2YgTGludXgvQnJpY2tTdG9ybS5BIHRyb2phbiIsCiAgICAgICAgICAgICJyZXN1bHQiOiAidW5rbm93biIsCiAgICAgICAgICAgICJzYW1wbGVfcmVmIjogImZpbGUtLTVhNDA5ZTBhLTIxNDEtNTU2Yi1iMTk1LTQ0ZjVkOGU2YWJiMSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAibWFsd2FyZSIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogIm1hbHdhcmUtLWVhOWY3MTMzLWMzMDEtNGY4ZC05MjBlLTQ1NGZiZTA4NDhiYiIsCiAgICAgICAgICAgICJjcmVhdGVkX2J5X3JlZiI6ICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgImNyZWF0ZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm1vZGlmaWVkIjogIjIwMjUtMTEtMjVUMTc6MDQ6NTcuMDAwWiIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgYXJ0aWZhY3QgaXMgYSBtYWxpY2lvdXMgNjQtYml0IEVMRiBleGVjdXRhYmxlIHdyaXR0ZW4gaW4gdGhlIEdvIHByb2dyYW1taW5nIGxhbmd1YWdlLiBUaGUgYmluYXJ5IGhhcyBiZWVuIGlkZW50aWZpZWQgYXMgYSBiYWNrZG9vciB2YXJpYW50IG5hbWVkIEJSSUNLU1RPUk0gdGhhdCB1c2VzIHNldmVyYWwgYWR2YW5jZWQgdGVjaG5pcXVlcyB0byBldmFkZSBkZXRlY3Rpb24uIFRoZSBiYWNrZG9vciB1c2VzIFNPQ0tTIHByb3h5aW5nLCBtdWx0aS1sYXllcmVkIHdlYiBzZXJ2aWNlIGNvbW11bmljYXRpb24sIGFuZCB2YXJpZWQgY29tbWFuZCBleGVjdXRpb24gdG8gb2JzY3VyZSBpdHMgYWN0aXZpdGllcy4gVGhlIGJhY2tkb29yIGNvbWJpbmVzIHNldmVyYWwgc29waGlzdGljYXRlZCB0ZWNobmlxdWVzLCBpbmNsdWRpbmcgRG9ILCBuZXN0ZWQgVExTIGVuY3J5cHRpb24sIGFuZCB0aGUgYWJ1c2Ugb2YgYSBsZWdpdGltYXRlIGNsb3VkIHNlcnZpY2UgdG8gZXZhZGUgZGV0ZWN0aW9uLiBUaGUgYmFja2Rvb3IgY29udGFpbnMgdGhlIGF1dGhlbnRpY2F0aW9uIGtleSwgSFRUUFMgYW5kIFdlYlNvY2tldCBhZGRyZXNzZXMgYXMgcGFydCBvZiBpdHMgc29waGlzdGljYXRlZCwgbXVsdGktbGF5ZXJlZCBDMiBldmFzaW9uIHRlY2huaXF1ZS5cclxuXHJcbi0tQmVnaW4gRWxlbWVudHMtLVxyXG5oa2lnYkxLSFJfUGJ5NnQ2UCA9PT4gYXV0aGVudGljYXRpb24ga2V5XHJcbmh0dHBzOi8vW3JlZGFjdGVkXS5jb20gPT0+IEhUVFBTIGFkZHJlc3Ncclxud3NzOi8vW3JlZGFjdGVkXS5jb20vYXBpID09PiBXZWJTb2NrZXQgYWRkcmVzc1xyXG4tLUVuZCBFbGVtZW50cy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBYT1IgY2lwaGVyIGVuY3J5cHRpb24gdG8gaGlkZSBrZXkgc3RyaW5ncywgc3VjaCBhcyBpdHMgSVB2NCBhZGRyZXNzZXMgb2YgcHVibGljIERvSCBzZXJ2ZXJzIGFuZCBvdGhlciBzdHJpbmdzIHdpdGhpbiBpdHMgY29kZS4gVXBvbiBleGVjdXRpb24sIHRoZSBiYWNrZG9vciBpbml0aWF0ZXMgdGhlIG9iZnVzY2F0ZWQgZnVuY3Rpb24gXCJtYWluX3N0YXJ0TmV3XCIgdG8gY29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIGJhY2tkb29yIHRoZW4gY2hlY2tzIGZvciB0aGUgXCJGSU9PTlwiIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSBpZiBpdCBpcyBydW5uaW5nIGFzIGEgY2hpbGQgcHJvY2Vzcy4gSWYgXCJGSU9PTlwiIGlzIG5vdCBzZXQsIGluZGljYXRpbmcgbm90IGEgY2hpbGQgcHJvY2VzcywgdGhlIGJhY2tkb29yIHZlcmlmaWVzIGl0cyBjdXJyZW50IGV4ZWN1dGlvbiBwYXRoIGJ5IGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUgZmlsZSBjb250ZW50cyBmcm9tIFwiL2V0Yy9zeXNjb25maWcvdnRzXCIuIElmIG5vdCBydW5uaW5nIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGggXCIvZXRjL3N5c2NvbmZpZy92dHNcIiwgdGhlIGJhY2tkb29yIHRlcm1pbmF0ZXMgaXRzIGNvZGUgZXhlY3V0aW9uLiBJZiB0aGUgYmFja2Rvb3IgZXhlY3V0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGgsIHRoZSBiYWNrZG9vciBjb3BpZXMgaXRzZWxmIHRvIFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL3VwZGF0ZW1nclwiLiBUaGUgYmFja2Rvb3IgdGhlbiBwcmVwZW5kcyBcIi91c3IvamF2YS9qcmUtdm13YXJlL2Jpbi9cIiB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZW5zdXJpbmcgdGhlIG5ld2x5IGNvcGllZCBiYWNrZG9vciB0YWtlcyBwcmVjZWRlbmNlIGluIGV4ZWN1dGlvbi4gVGhlIGJhY2tkb29yIGV4ZWN1dGVzIHRoZSBjb3BpZWQgYmFja2Rvb3IgbmFtZWQgXCJ1cGRhdGVtZ3JcIiBkdWUgdG8gdGhlIFBBVEggbW9kaWZpY2F0aW9uIGFuZCB0ZXJtaW5hdGVzIGl0cyBvd24gZXhlY3V0aW9uLiBJZiBcIkZJT09OXCIgaXMgc2V0LCBpbmRpY2F0aW5nIGEgY2hpbGQgcHJvY2VzcywgdGhlIGJhY2tkb29yIGNvbnRpbnVlcyBpdHMgbWFpbiBjb2RlIGV4ZWN1dGlvbi4gQXMgcGFydCBvZiB0aGlzIGNvbnRpbnVlZCBleGVjdXRpb24sIHRoZSB0ZW1wb3JhcnkgY29weSBvZiB0aGUgYmFja2Rvb3IgYXQgXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vdXBkYXRlbWdyXCIgaXMgZGVsZXRlZC5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIHRoZSBvYmZ1c2NhdGVkIGZ1bmN0aW9uIFwibWFpbl9zZWxmV2F0Y2hlclwiIHRvIGVuc3VyZSBpdHMgY29udGludWVkIG9wZXJhdGlvbiBhbmQgbWFpbnRhaW4gcGVyc2lzdGVuY2Ugb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS4gVGhpcyBzZWxmLXByZXNlcnZhdGlvbiBtZWNoYW5pc20gY2hlY2tzIGlmIHRoZSBiYWNrZG9vciBpcyBydW5uaW5nIGFzIGFuIGludGVuZGVkIHByb2Nlc3MgYW5kLCBpZiBub3QsIHRoZSBiYWNrZG9vciByZS1pbnN0YWxscyBhbmQgcmUtZXhlY3V0ZXMgaXRzZWxmLiBUaGUgXCJtYWluX3NlbGZXYXRjaGVyXCIgZnVuY3Rpb24gZmlyc3QgY2hlY2tzIGZvciB0aGUgXCJESUdOTlwiIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBjb25maXJtcyB0aGUgZXhpc3RlbmNlIG9mIGEgcHJvY2VzcyBuYW1lZCBcInVwZGF0ZW1nclwiLiBJZiB0aGUgY2hlY2tzIHJldHVybiBhIFwiZmFsc2VcIiB2YWx1ZSAoXCJESUdOTlwiIGlzIG5vdCBzZXQgKSwgaW5kaWNhdGluZyB0aGUgYmFja2Rvb3IgaXMgbm90IHJ1bm5pbmcgY29ycmVjdGx5LCB0aGUgYmFja2Rvb3IgcmUtaW5zdGFsbHMgaXRzZWxmIGZyb20gXCIvZXRjL3N5c2NvbmZpZy92dHNcIiB0byBhIG5ldyBsb2NhdGlvbjogXCIvdXNyL2phdmEvanJlLXZtd2FyZS9iaW4vdXBkYXRlbWdyXCIuIFRoZSBiYWNrZG9vciB0aGVuIHByZXBlbmRzIFwiL3Vzci9qYXZhL2pyZS12bXdhcmUvYmluL1wiIHRvIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGUgbmV3bHkgY29waWVkIGJhY2tkb29yIGZpbGUgXCJ1cGRhdGVtZ3JcIiBpcyBleGVjdXRlZC4gVGhlIHBhcmVudCBiYWNrZG9vciB0aGVuIHRlcm1pbmF0ZXMgaXRzIG93biBleGVjdXRpb24sIGFsbG93aW5nIHRoZSBuZXcgcHJvY2VzcyB0byBjb250aW51ZSBydW5uaW5nLiBJZiB0aGUgaW5pdGlhbCBjaGVja3MgY29uZmlybSB0aGF0IHRoZSBiYWNrZG9vciBpcyBydW5uaW5nIGFzIGludGVuZGVkLCBpbmRpY2F0aW5nIFwiRElHTk5cIiBpcyBzZXQsIHRoZSBcIm1haW5fc2VsZldhdGNoZXJcIiBmdW5jdGlvbiBhbGxvd3MgdGhlIGNvZGUgdG8gY29udGludWUgaXRzIG5vcm1hbCBtYWxpY2lvdXMgb3BlcmF0aW9ucy5cclxuXHJcblRoZSBiYWNrZG9vciB1c2VzIGFuIFhPUiBvcGVyYXRpb24gdG8gZGVjcnlwdCB0aGUgSVB2NCBhZGRyZXNzZXMgZm9yIHRoZSBEb0ggc2VydmVycyBiZWxvdzpcclxuXHJcbi0tQmVnaW4gRG9IIEFkZHJlc3Nlcy0tXHJcbmh0dHBzOi8vOC44LjguOC9kbnMtcXVlcnkgKEdvb2dsZSlcclxuaHR0cHM6Ly84LjguNC40L2Rucy1xdWVyeSAoR29vZ2xlKVxyXG5odHRwczovLzEuMS4xLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG5odHRwczovLzEuMC4wLjEvZG5zLXF1ZXJ5IChDbG91ZGZsYXJlKVxyXG4tLUVuZCBEb0ggQWRkcmVzc2VzLS1cclxuXHJcblRoZSBiYWNrZG9vciByZWxpZXMgb24gaW50ZXJuYWwsIGxvdy1sZXZlbCBmdW5jdGlvbiBjYWxscyBmcm9tIGEgY3VzdG9tIEdvIHBhY2thZ2UgdG8gaGFuZGxlIGl0cyBuZXR3b3JrIGNvbm5lY3Rpb25zIGFuZCBjb21tYW5kIHByb2Nlc3NpbmcuIFRoZSBiYWNrZG9vciB1c2VzIERvSCB0byByZXNvbHZlIHRoZSBhZGRyZXNzZXMgb2YgaXRzIEMyIHNlcnZlcnMuIFRoZSBiYWNrZG9vciBjcmVhdGVzIGEgRE5TIHF1ZXJ5IGZvciB0aGUgbWFsaWNpb3VzIEMyIGRvbWFpbiBcIltyZWRhY3RlZF0uY29tXCIuIFRoZSBiYWNrZG9vciBlbmNyeXB0cyB0aGlzIHF1ZXJ5IGJ5IGVuY2Fwc3VsYXRpbmcgaXQgd2l0aGluIGEgc3RhbmRhcmQgSFRUUFMgcmVxdWVzdC4gVGhlIGJhY2tkb29yIHNlbmRzIHRoZSBlbmNyeXB0ZWQgSFRUUFMgcmVxdWVzdCB0byBhIGxlZ2l0aW1hdGUgcHVibGljIERvSCByZXNvbHZlciBvcGVyYXRlZCBieSBDbG91ZGZsYXJlIG9yIEdvb2dsZSB0byBwcm9jZXNzIHRoZSBxdWVyeS4gQW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIHJlcXVlc3RlZCBkb21haW4gaXMgbm90IGZvdW5kIGluIHRoZSBwdWJsaWMgRG9IIHJlc29sdmVyIGNhY2hlLCB0aGUgbGVnaXRpbWF0ZSBwdWJsaWMgRG9IIHJlc29sdmVyIGZvcndhcmRzIHRoZSByZXF1ZXN0IHRvIHRoZSBuZXh0IHNlcnZlciBpbiB0aGUgRE5TIGhpZXJhcmNoeSwgdWx0aW1hdGVseSByZWFjaGluZyB0aGUgVEEncyBETlMgc2VydmVyLCB3aGljaCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIgZm9yIHRoZSBtYWxpY2lvdXMgZG9tYWluLiBUaGUgVEEncyBETlMgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBjb3JyZWN0IElQIGFkZHJlc3MgZm9yIHRoZSBDMiBkb21haW4sIGFuZCB0aGlzIHJlc3BvbnNlIGlzIHNlbnQgYmFjayB0aHJvdWdoIHRoZSBsZWdpdGltYXRlIERvSCByZXNvbHZlciB0byB0aGUgYmFja2Rvb3IuIFRoZSBiYWNrZG9vciByZWNlaXZlcyB0aGUgZW5jcnlwdGVkIHJlc3BvbnNlLCBkZWNyeXB0cyBpdCB0byBnZXQgdGhlIEMyIHNlcnZlcidzIElQIGFkZHJlc3MsIGFuZCBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24uXHJcblxyXG5UaGUgYmFja2Rvb3IgdXNlcyBtdWx0aXBsZSBsYXllcnMgb2YgZW5jcnlwdGlvbiBmb3IgaXRzIEMyIGNvbW11bmljYXRpb25zLiBUaGUgYmFja2Rvb3IgY29tbXVuaWNhdGVzIG92ZXIgSFRUUFMgdG8gdGhlIGNsb3VkIHBsYXRmb3JtIChcImh0dHBzOi8vW3JlZGFjdGVkXS5jb21cIiksIHRoZW4gdXBncmFkZXMgdGhlc2Ugc2Vzc2lvbnMgdG8gV2ViU29ja2V0cyB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgVExTIGVuY3J5cHRpb24uIFRoZSBiYWNrZG9vciBzZW5kcyBIVFRQIHVwZ3JhZGUgcmVxdWVzdCB0byBjb252ZXJ0IHRoZSBpbml0aWFsIGVuY3J5cHRlZCBIVFRQUyBjb25uZWN0aW9uIGludG8gYSBwZXJzaXN0ZW50IFdlYlNvY2tldCBjb25uZWN0aW9uOiBcIndzczovL1tyZWRhY3RlZF0uY29tL2FwaVwiLiBUaGUgYmFja2Rvb3IgbmVzdHMgYWRkaXRpb25hbCBsYXllcnMgb2YgVExTIGVuY3J5cHRpb24gd2l0aGluIHRoZSBXZWJTb2NrZXQgc2Vzc2lvbi4gVGhlIGJhY2tkb29yIHBlcmZvcm1zIGEgc2VyaWVzIG9mIG5lc3RlZCBUTFMgaGFuZHNoYWtlcyB3aXRoaW4gdGhlIGVzdGFibGlzaGVkIFdlYlNvY2tldCB0dW5uZWwuIFRoZSBmaXJzdCBUTFMgaGFuZHNoYWtlIGlzIHRoZSBzdGFuZGFyZCBUTFMgaGFuZHNoYWtlIGZvciB0aGUgaW5pdGlhbCBIVFRQUyByZXF1ZXN0IHRvIHRoZSBjbG91ZCBwbGF0Zm9ybS4gQSBzZWNvbmQgVExTIGhhbmRzaGFrZSBvY2N1cnMgd2l0aGluIHRoZSBXZWJTb2NrZXQgdHVubmVsLiBEdXJpbmcgdGhpcyBzdGVwLCB0aGUgYmFja2Rvb3IgYXV0aGVudGljYXRlcyBpdHNlbGYgdG8gdGhlIEMyIHNlcnZlciB1c2luZyBhIHN0YXRpYyBhdXRoZW50aWNhdGlvbiBrZXk6IFwiaGtpZ2JMS0hSX1BieTZ0NlBcIi4gQW4gaW5uZXJtb3N0IFRMUyBsYXllciBlbmNyeXB0cyB0aGUgYWN0dWFsIEMyIGNvbW1hbmRzIGFuZCBkYXRhLCBzZWN1cmluZyB0aGVtIGV2ZW4gaWYgdGhlIG91dGVyIGxheWVycyBhcmUgYnlwYXNzZWQgb3IgZGVjcnlwdGVkLiBUaGUgYmFja2Rvb3IgdXNlcyB0aGUgXCJIYXNoaUNvcnAgWWFtdXhcIiBsaWJyYXJ5IHRvIGNyZWF0ZSBtdWx0aXBsZSBzdHJlYW1zIHdpdGhpbiBhIHNpbmdsZSBpbm5lcm1vc3QgVExTLWVuY3J5cHRlZCBXZWJTb2NrZXQgdHVubmVsLiBUaGlzIG1ldGhvZCBtYWtlcyB0aGUgVEEncyBhY3Rpdml0aWVzIGRpZmZpY3VsdCB0byBkZXRlY3QsIGFzIG11bHRpcGxlIGNvbW1hbmRzIGFuZCBuZXR3b3JrIHR1bm5lbHMgYXJlIG11bHRpcGxleGVkIGFuZCBoaWRkZW4gd2l0aGluIGEgc2luZ2xlLCBlbmNyeXB0ZWQgbmV0d29yayBzdHJlYW0uXHJcblxyXG5BZnRlciBlc3RhYmxpc2hpbmcgYSBzZWN1cmUgYW5kIGNvdmVydCBjb25uZWN0aW9uLCB0aGUgYmFja2Rvb3IgbGV2ZXJhZ2VzIGl0cyBvYmZ1c2NhdGVkIGNvcmUgXCJ0YXNrLkRvVGFza1wiICgvY29yZS90YXNrLkRvVGFzaykgZnVuY3Rpb24gYW5kIGZvdXIgb2JmdXNjYXRlZCBleHRlbnNpb25zIChtb2R1bGVzKSBcInNvY2tzLlNvY2tzXCIsIFwid2ViLldlYlNlcnZpY2VcIiwgXCJjb21tYW5kLkNvbW1hbmRcIiwgYW5kIFwiY29tbWFuZC5Db21tYW5kTm9Db250ZXh0XCIuIFRoZXNlIGV4dGVuc2lvbnMgZGVmaW5lIHRoZSBtYWxpY2lvdXMgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBiYWNrZG9vciBzaG91bGQgZXhlY3V0ZSwgYWxsb3dpbmcgdGhlIFRBIHRvIGNhcnJ5IG91dCB2YXJpb3VzIHRhc2tzIG9uIHRoZSBjb21wcm9taXNlZCBzeXN0ZW1zLiBUaGVzZSBtb2R1bGVzIGVuYWJsZSBDMiBjb21tdW5pY2F0aW9uLCBsYXRlcmFsIG1vdmVtZW50LCBhbmQgY29tbWFuZCBleGVjdXRpb24gb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbS5cclxuXHJcbkRpc3BsYXllZCBiZWxvdyBhcmUgdGhlIGZvdXIgZXh0ZW5zaW9ucyBhbmQgdGhlaXIgZnVuY3Rpb25zOlxyXG5cclxuLS1CZWdpbiBFeHRlbnNpb25zLS1cclxuYS4gVGhlIFNvY2tzIGV4dGVuc2lvbiBlbmFibGVzIG5ldHdvcmsgdHVubmVsaW5nIHRocm91Z2ggYSBTT0NLUyBwcm94eSwgd2hpY2ggZmFjaWxpdGF0ZXMgbGF0ZXJhbCBtb3ZlbWVudCB3aXRoaW4gYSBjb21wcm9taXNlZCBuZXR3b3JrIGFuZCByb3V0ZXMgQzIgdHJhZmZpYy5cclxuXHJcbmIuIFRoZSBXZWJTZXJ2aWNlIGV4dGVuc2lvbiBtb2R1bGUgZXN0YWJsaXNoZXMgY292ZXJ0IEMyIGNvbW11bmljYXRpb24gYnkgbWFraW5nIHRoZSBiYWNrZG9vciBhcHBlYXIgYXMgYSBsZWdpdGltYXRlIHdlYiBzZXJ2ZXIuIFRoZSBleHRlbnNpb24gdXNlcyB0aGUgR28gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGxldmVyYWdpbmcgdGhlIFwibmV0L2h0dHAgcGFja2FnZVwiIGFuZCBcImdvcmlsbGEvbXV4XCIgbGlicmFyeSwgdG8gY3JlYXRlIGEgd2ViIHNlcnZlciBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtLiBBIGRlZGljYXRlZCBBUEkgXCIvYXBpL1wiIGVuZHBvaW50IGlzIGNyZWF0ZWQgdG8gcmVjZWl2ZSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBUQSdzIEMyIHNlcnZlci4gVGhpcyBwcm92aWRlcyB0aGUgVEEgd2l0aCBleHRlbnNpdmUgY29udHJvbCBvdmVyIHRoZSB2aWN0aW0ncyBmaWxlIHN5c3RlbSwgYWxsb3dpbmcgdGhlIFRBIHRvIGJyb3dzZSwgdmlldywgY3JlYXRlLCBkZWxldGUsIHVwbG9hZCwgYW5kIGRvd25sb2FkIGZpbGVzIGFuZCBmb2xkZXJzLiBUbyBibGVuZCBpbiBhbmQgZXZhZGUgZGV0ZWN0aW9uLCB0aGUgYmFja2Rvb3Igc2VydmVzIHN0YXRpYyB3ZWIgZmlsZXMgKEhUTUwsIENTUywgSmF2YVNjcmlwdCkgZnJvbSBhIGRlc2lnbmF0ZWQgZGlyZWN0b3J5LiBUaGlzIG1ha2VzIHRoZSBtYWxpY2lvdXMgd2ViIHNlcnZlciBhcHBlYXIgdG8gYmUgYSBzdGFuZGFyZCB3ZWIgYXBwbGljYXRpb24uXHJcblxyXG5jLiBUaGUgQ29tbWFuZCBleHRlbnNpb24gZXhlY3V0ZXMgY29tbWFuZHMgb24gdGhlIGNvbXByb21pc2VkIHN5c3RlbSB3aXRoIGEgc3BlY2lmaWMgc2VjdXJpdHkgY29udGV4dC5cclxuXHJcbmQuIFRoZSBDb21tYW5kTm9Db250ZXh0IGV4dGVuc2lvbiBleGVjdXRlcyBjb21tYW5kcyBvbiB0aGUgY29tcHJvbWlzZWQgc3lzdGVtIHdpdGhvdXQgdXNpbmcgYW4gZXhwbGljaXQgc2VjdXJpdHkgY29udGV4dC5cclxuLS1FbmQgRXh0ZW5zaW9ucy0tXHJcblxyXG5UaGUgYmFja2Rvb3IgbWFpbnRhaW5zIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIHRvIHRoZSBDMiBzZXJ2ZXIgdW5sZXNzIGEgc3BlY2lmaWMgdGVybWluYXRpb24gY29tbWFuZCBpcyByZWNlaXZlZCBvciB0aGUgQzIgc2VydmVyIHRlcm1pbmF0ZXMgdGhlIGNvbm5lY3Rpb24uIiwKICAgICAgICAgICAgIm1hbHdhcmVfdHlwZXMiOiBbCiAgICAgICAgICAgICAgICAidHJvamFuIiwKICAgICAgICAgICAgICAgICJiYWNrZG9vciIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImlzX2ZhbWlseSI6IGZhbHNlLAogICAgICAgICAgICAic2FtcGxlX3JlZnMiOiBbCiAgICAgICAgICAgICAgICAiZmlsZS0tNWE0MDllMGEtMjE0MS01NTZiLWIxOTUtNDRmNWQ4ZTZhYmIxIgogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogImluZGljYXRvciIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogImluZGljYXRvci0tOGQxNjI2MDMtNGZjZi00ODNlLWExNjQtMjNkYjQ1OGZlYjJhIiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS04ZTExMmU3Mi1hYThmLTQxOTAtYTM1OS0yOGE5YWJhZTI4OTYiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm5hbWUiOiAiMjJjMTVhMzJiNjkxMTZhNDZlYjVkMGYyYjIyOGNjMzdjZDFiNTkxNWE5MWVjOGYzOGRmNzlkM2VlZDFkYTI2YiIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluZGljYXRvcl90eXBlcyI6IFsKICAgICAgICAgICAgICAgICJtYWxpY2lvdXMtYWN0aXZpdHkiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJwYXR0ZXJuIjogIltmaWxlOmhhc2hlcy4nTUQ1Jz0nODJiZjMxZTdkNzY4ZTZkNGQzYmM3YzhjOGVmMmIzNTgnIE9SIGZpbGU6aGFzaGVzLidTSEEtMSc9J2RlMjg1NDZlYzM1NmM1NjZjZDhiY2EyMDUxMDFhNzMzZTlhNGEyMmQnIE9SIGZpbGU6aGFzaGVzLidTSEEtMjU2Jz0nMjJjMTVhMzJiNjkxMTZhNDZlYjVkMGYyYjIyOGNjMzdjZDFiNTkxNWE5MWVjOGYzOGRmNzlkM2VlZDFkYTI2YicgT1IgZmlsZTpoYXNoZXMuJ1NIQS01MTInPSc0YzUyY2FmMmU1ZjExNDEwM2VkNWY2MGM2YWRkM2FhMjZjNzQxYjA3ODY5YmI2NmUzYzI1YTFkYzI5MGQ0YThiZjg3YzQyYzMzNmU4YWM4ZWJmODJkOWE5YjIzZWFhMThjMzFmNzA1MWE1OTcwYThmZTExMjVhMmRhODkwMzQwZiddIiwKICAgICAgICAgICAgInBhdHRlcm5fdHlwZSI6ICJzdGl4IiwKICAgICAgICAgICAgInBhdHRlcm5fdmVyc2lvbiI6ICIyLjEiLAogICAgICAgICAgICAidmFsaWRfZnJvbSI6ICIyMDI1LTEyLTAyVDE2OjA3OjIzLjk0MTY5M1oiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogInJlcG9ydCIsCiAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMi4xIiwKICAgICAgICAgICAgImlkIjogInJlcG9ydC0tNDQ5ZjFmMDItNTRkMS00YWY3LTliZDgtYmVhYmE5OWU2ZDBjIiwKICAgICAgICAgICAgImNyZWF0ZWRfYnlfcmVmIjogImlkZW50aXR5LS04ZTExMmU3Mi1hYThmLTQxOTAtYTM1OS0yOGE5YWJhZTI4OTYiLAogICAgICAgICAgICAiY3JlYXRlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3LjAwMFoiLAogICAgICAgICAgICAibW9kaWZpZWQiOiAiMjAyNS0xMS0yNVQxNzowNDo1Ny4wMDBaIiwKICAgICAgICAgICAgIm5hbWUiOiAiTUFSLTI1MTE2NS5jMS52MSIsCiAgICAgICAgICAgICJvYmplY3RfbWFya2luZ19yZWZzIjogWwogICAgICAgICAgICAgICAgIm1hcmtpbmctZGVmaW5pdGlvbi0tOTQ4NjhjODktODNjMi00NjRiLTkyOWItYTFhOGFhM2M4NDg3IiwKICAgICAgICAgICAgICAgICJtYXJraW5nLWRlZmluaXRpb24tLWE5YTNhZjZmLTU1ZTktNDFiZC04ZDhiLWI5ZmExZDMyNWQ1YiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBDeWJlcnNlY3VyaXR5IGFuZCBJbmZyYXN0cnVjdHVyZSBTZWN1cml0eSBBZ2VuY3kgKENJU0EpIGFuYWx5emVkIGVpZ2h0IEJSSUNLU1RPUk0gc2FtcGxlcyBvYnRhaW5lZCBmcm9tIHZpY3RpbSBvcmdhbml6YXRpb25zLiBCUklDS1NUT1JNIGlzIGEgY3VzdG9tIEV4ZWN1dGFibGUgYW5kIExpbmthYmxlIEZvcm1hdCAoRUxGKSBHby1iYXNlZCBiYWNrZG9vci4gVGhlIEN5YmVyc2VjdXJpdHkgYW5kIEluZnJhc3RydWN0dXJlIFNlY3VyaXR5IEFnZW5jeSAoQ0lTQSksIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeSAoTlNBKSwgYW5kIENhbmFkaWFuIENlbnRyZSBmb3IgQ3liZXIgU2VjdXJpdHkgKEN5YmVyIENlbnRyZSkgYXNzZXNzIFBlb3BsZVx1MjAxOXMgUmVwdWJsaWMgb2YgQ2hpbmEgKFBSQykgc3RhdGUtc3BvbnNvcmVkIGN5YmVyIGFjdG9ycyBhcmUgdXNpbmcgQlJJQ0tTVE9STSBtYWx3YXJlIGZvciBsb25nLXRlcm0gcGVyc2lzdGVuY2Ugb24gdmljdGltIHN5c3RlbXMuXHJcblxyXG5CUklDS1NUT1JNIGVuYWJsZXMgY3liZXIgYWN0b3JzIHRvIG1haW50YWluIHN0ZWFsdGh5IGFjY2VzcyBhbmQgcHJvdmlkZSBjYXBhYmlsaXRpZXMgZm9yIGluaXRpYXRpb24sIHBlcnNpc3RlbmNlLCBhbmQgc2VjdXJlIGNvbW1hbmQgYW5kIGNvbnRyb2wgKEMyKS4gQlJJQ0tTVE9STSBpbml0aWF0ZXMgYnkgcnVubmluZyBjaGVja3MgYW5kIG1haW50YWlucyBwZXJzaXN0ZW5jZSBieSB1c2luZyBhIHNlbGYtd2F0Y2hpbmcgZnVuY3Rpb24gYW5kIGF1dG9tYXRpY2FsbHkgcmVpbnN0YWxscyBvciByZXN0YXJ0cyBpZiBkaXNydXB0ZWQuIFxyXG5cclxuRm9yIEMyLCBCUklDS1NUT1JNIHVzZXMgbXVsdGlwbGUgbGF5ZXJzIG9mIGVuY3J5cHRpb24gKEhUVFBTLCBXZWJTb2NrZXRzLCBuZXN0ZWQgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IFtUTFNdKSB0byBoaWRlIGl0cyBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBjeWJlciBhY3RvcnNcdTIwMTkgQzIgc2VydmVyLiBJdCBhbHNvIHVzZXMgRE5TLW92ZXItSFRUUFMgKERvSCkgYW5kIG1pbWljcyB3ZWIgc2VydmVyIGZ1bmN0aW9uYWxpdHkgdG8gYmxlbmQgaXRzIGNvbW11bmljYXRpb25zIHdpdGggbGVnaXRpbWF0ZSB0cmFmZmljLiBGb3IgcmVtb3RlIHN5c3RlbSBjb250cm9sLCBCUklDS1NUT1JNIGdpdmVzIGN5YmVyIGFjdG9ycyBpbnRlcmFjdGl2ZSBzaGVsbCBhY2Nlc3Mgb24gdGhlIHN5c3RlbSBhbmQgYWxsb3dzIHRoZW0gdG8gYnJvd3NlLCB1cGxvYWQsIGRvd25sb2FkLCBjcmVhdGUsIGRlbGV0ZSwgYW5kIG1hbmlwdWxhdGUgZmlsZXMuIFNvbWUgc2FtcGxlcyBhY3QgYXMgYSBTT0NLUyBwcm94eSwgZmFjaWxpdGF0aW5nIGxhdGVyYWwgbW92ZW1lbnQgYW5kIGFsbG93aW5nIGN5YmVyIGFjdG9ycyB0byBjb21wcm9taXNlIGFkZGl0aW9uYWwgc3lzdGVtcywgYW5kIHNvbWUgc2FtcGxlcyB1c2UgYSB2aXJ0dWFsIHNvY2tldCAoVlNPQ0spIGludGVyZmFjZSB0byBlbmFibGUgaW50ZXItdmlydHVhbCBtYWNoaW5lIChWTSkgY29tbXVuaWNhdGlvbiwgc3VwcG9ydCBkYXRhIGV4ZmlsdHJhdGlvbiwgYW5kIG1haW50YWluIHBlcnNpc3RlbmNlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4iLAogICAgICAgICAgICAicmVwb3J0X3R5cGVzIjogWwogICAgICAgICAgICAgICAgIm9ic2VydmVkLWRhdGEiLAogICAgICAgICAgICAgICAgIm1hbHdhcmUiLAogICAgICAgICAgICAgICAgImluZGljYXRvciIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInB1Ymxpc2hlZCI6ICIyMDI1LTExLTI1VDE3OjA0OjU3WiIsCiAgICAgICAgICAgICJvYmplY3RfcmVmcyI6IFsKICAgICAgICAgICAgICAgICJpZGVudGl0eS0tOGUxMTJlNzItYWE4Zi00MTkwLWEzNTktMjhhOWFiYWUyODk2IiwKICAgICAgICAgICAgICAgICJmaWxlLS04MmEwMzk2Yi0yZjdmLTVhMDEtYjRkZi05ZmJiNWM0MmE2ZjMiLAogICAgICAgICAgICAgICAgImluZGljYXRvci0tNjQyYTBlNDMtMDQwMy00ZDAzLTg0ZWEtZDJmMjliZTRhZjUzIiwKICAgICAgICAgICAgICAgICJtYWx3YXJlLWFuYWx5c2lzLS1mNTM1NGIxNi1hNjVjLTQ2MzgtYWMyZS0wMzEyMjE2ZDQ3YTciLAogICAgICAgICAgICAgICAgIm1hbHdhcmUtYW5hbHlzaXMtLWM3N2RhYmEwLWFiYTgtNDIwYy1iMjMxLTMzYjZiOTQ1MmIyYyIsCiAgICAgICAgICAgICAgICAibWFsd2FyZS0tYWU4M2ViNmMtZTU4ZC00NTAzLTk3MjMtNDI1Y2I0N2E3MGEwIiwKICAgICAgICAgICAgICAgICJpbmRpY2F0b3ItLWMzNjIxNGNiLTc3ZGItNDhlMC05NjQ1LTNhMTE2MGFhOWRhZiIsCiAgICAgICAgICAgICAgICAiZmlsZS0tYmVlZGI0ZjUtZDBiMy01ODIyLTgyZjMtZTA5ZTYzNmJmMGFmIiwKICAgICAgICAgICAgICAgICJpbmRpY2F0b3ItLTI1ZWRiN2FjLTY3OTAtNDZmZi05MTQ0LTc2NTc0ODI0MzY4MSIsCiAgICAgICAgICAgICAgICAibWFsd2FyZS1hbmFseXNpcy0tMmE4OTFhZWItNDYyMy00Yjc3LWE3OTQtNTgxN2IzZjlmN2I5IiwKICAgICAgICAgICAgICAgICJtYWx3YXJlLS1mOGZhN2IwZi1jY2JhLTRhNmYtYTliYS05YWVmMjk2ODg1YTYiLAogICAgICAgICAgICAgICAgImluZGljYXRvci0tNDRiZDYyN2YtMGE1YS00MmNmLWE3N2MtYzY0OGIzNmFhZWQ2IiwKICAgICAgICAgICAgICAgICJmaWxlLS1lYTM2Njc4Yy0wNTc1LTU5NjgtOTkxYy0xMDRkMTVhMzE1NWYiLAogICAgICAgICAgICAgICAgImluZGljYXRvci0tNGQyYTRhZWEtZDBjNi00MWUyLWJjNmEtY2M4ZjU3MzY3ZWNmIiwKICAgICAgICAgICAgICAgICJtYWx3YXJlLWFuYWx5c2lzLS04ZjA0ZmZiNy1kMjI4LTQzMmYtYjAzNC02MzRhMzI1YzczNTMiLAogICAgICAgICAgICAgICAgIm1hbHdhcmUtLTQwMzA3YTI1LWM2NTAtNDMyYS05OGMyLTVlMjE2MmNjOWQ5MyIsCiAgICAgICAgICAgICAgICAiaW5kaWNhdG9yLS01NmZiNmUyZi04MWRlLTQwYTYtYjZlYy00NGY4ODJjOTdmMDEiLAogICAgICAgICAgICAgICAgImZpbGUtLTdjZmE5ZTBkLWY0ZDUtNTIyYy1hYzVhLTBiNTA2OTIwMDVlMCIsCiAgICAgICAgICAgICAgICAiaW5kaWNhdG9yLS0xZWEyYTA4My1jNGZhLTRiZWItOGVlYS0wOTQwODQ3MDIyYTkiLAogICAgICAgICAgICAgICAgIm1hbHdhcmUtYW5hbHlzaXMtLWUxNDNiMzc5LTkxYWYtNGQ5Ny05MTE1LTNiZDEwMjFkMzc1ZCIsCiAgICAgICAgICAgICAgICAibWFsd2FyZS0tNTcyOGRiNzUtZDI1ZC00Y2I2LThjYWQtY2M4ZGI4Mzg0MDNmIiwKICAgICAgICAgICAgICAgICJpbmRpY2F0b3ItLWMwNjk0ZTg3LWJmYmUtNGE4My1hNmM3LTA0ZDdiZWU0OGZmMyIsCiAgICAgICAgICAgICAgICAiZmlsZS0tMWNjYjMxYTItYzEwNS01MTg4LTg1NjAtMmQ0OGVhNWE1MTc5IiwKICAgICAgICAgICAgICAgICJpbmRpY2F0b3ItLWZkZWNkYjU0LTBiMmUtNDc3OS1hOTBiLTUwYzc2MjlhYmZkNyIsCiAgICAgICAgICAgICAgICAibWFsd2FyZS1hbmFseXNpcy0tZTNjZjE5NmEtZGRkMC00YjMzLTliNDAtZTk1ODYyZDU5ZDQ0IiwKICAgICAgICAgICAgICAgICJtYWx3YXJlLS1kNzVhYTBhNC00NTJhLTQwY2YtOTNhOS1iMjY1NWY4NWZiNGMiLAogICAgICAgICAgICAgICAgImluZGljYXRvci0tNzFkYWNmNWUtZWNhOS00MjMxLTg2NGItZDFlYTNmYzFhZGQ4IiwKICAgICAgICAgICAgICAgICJmaWxlLS1hNjE4M2QyNy0wMDA4LTVjNGYtYjhmYy1kN2I2N2JhNTdkMjciLAogICAgICAgICAgICAgICAgImluZGljYXRvci0tNjE4OGM1NDctM2ZkMC00NGVhLWE4NWQtZjc2OWMwZTFmYzM5IiwKICAgICAgICAgICAgICAgICJtYWx3YXJlLWFuYWx5c2lzLS02NzE4YTYwNS1iNzRiLTRkMTAtYjQxNi1lNzNiNjFjNjBjMzYiLAogICAgICAgICAgICAgICAgIm1hbHdhcmUtLWI4MjIzMzFhLTlhNGEtNDc4Yy04MmJiLTc5MWM3MDc5NmNhNyIsCiAgICAgICAgICAgICAgICAiaW5kaWNhdG9yLS0yYWI1ZTVmOC1kM2FmLTQyMTQtYTM0NS1lNDRmYmZkMmZiZTUiLAogICAgICAgICAgICAgICAgImZpbGUtLTVhZWMwYzUwLWExYjgtNTlhMi1iNzBkLWY3OGU3Zjk5ZjhlOCIsCiAgICAgICAgICAgICAgICAiaW5kaWNhdG9yLS05Zjc1NjEzMi0xNDJhLTQyMjUtOGVmMC03NmMyM2M3ZGUwM2YiLAogICAgICAgICAgICAgICAgIm1hbHdhcmUtYW5hbHlzaXMtLTg4NzZjN2NmLTY5OTgtNDdmNC04Yzc4LWFkYmY0ZTlkZTBiYSIsCiAgICAgICAgICAgICAgICAibWFsd2FyZS0tMWY5OWQyMmQtNGE4NS00M2MzLWJlODAtNTI1MWU3M2MzMzY0IiwKICAgICAgICAgICAgICAgICJpbmRpY2F0b3ItLTYyYzYyNDZjLTAzMDQtNDJiOC04Y2IyLTc2ZDg1NzA4ODYwYiIsCiAgICAgICAgICAgICAgICAiZmlsZS0tNWE0MDllMGEtMjE0MS01NTZiLWIxOTUtNDRmNWQ4ZTZhYmIxIiwKICAgICAgICAgICAgICAgICJpbmRpY2F0b3ItLWYzNjdmNWE1LTQwZGYtNGVjZS1hMThkLTQxYzZmZjU5ZjBjYSIsCiAgICAgICAgICAgICAgICAibWFsd2FyZS1hbmFseXNpcy0tN2IwMDNiYjYtMmZlOS00ZGFlLThiZjgtNmUwNzUxNjU0Y2Y1IiwKICAgICAgICAgICAgICAgICJtYWx3YXJlLS1lYTlmNzEzMy1jMzAxLTRmOGQtOTIwZS00NTRmYmUwODQ4YmIiLAogICAgICAgICAgICAgICAgImluZGljYXRvci0tOGQxNjI2MDMtNGZjZi00ODNlLWExNjQtMjNkYjQ1OGZlYjJhIgogICAgICAgICAgICBdCiAgICAgICAgfQogICAgXQp9",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "imported-sample",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "attachment",
            "uuid": "78bcd02d-00a9-45c5-bb28-31d0456ca847",
            "value": "MAR-251165.c1.v1.CLEAR_stix2.json"
          },
          {
            "category": "Other",
            "comment": "",
            "deleted": false,
            "disable_correlation": true,
            "object_relation": "format",
            "timestamp": "1765615902",
            "to_ids": false,
            "type": "text",
            "uuid": "2c68dac6-c6d6-471b-a21c-f5514fd680e4",
            "value": "STIX 2.1"
          }
        ]
      }
    ],
    "EventReport": [
      {
        "name": "STIX 2.1 report description",
        "content": "The Cybersecurity and Infrastructure Security Agency (CISA) analyzed eight BRICKSTORM samples obtained from victim organizations. BRICKSTORM is a custom Executable and Linkable Format (ELF) Go-based backdoor. The Cybersecurity and Infrastructure Security Agency (CISA), National Security Agency (NSA), and Canadian Centre for Cyber Security (Cyber Centre) assess People\u2019s Republic of China (PRC) state-sponsored cyber actors are using BRICKSTORM malware for long-term persistence on victim systems.\r\n\r\nBRICKSTORM enables cyber actors to maintain stealthy access and provide capabilities for initiation, persistence, and secure command and control (C2). BRICKSTORM initiates by running checks and maintains persistence by using a self-watching function and automatically reinstalls or restarts if disrupted. \r\n\r\nFor C2, BRICKSTORM uses multiple layers of encryption (HTTPS, WebSockets, nested Transport Layer Security [TLS]) to hide its communications with the cyber actors\u2019 C2 server. It also uses DNS-over-HTTPS (DoH) and mimics web server functionality to blend its communications with legitimate traffic. For remote system control, BRICKSTORM gives cyber actors interactive shell access on the system and allows them to browse, upload, download, create, delete, and manipulate files. Some samples act as a SOCKS proxy, facilitating lateral movement and allowing cyber actors to compromise additional systems, and some samples use a virtual socket (VSOCK) interface to enable inter-virtual machine (VM) communication, support data exfiltration, and maintain persistence in virtualized environments.",
        "id": "2081",
        "event_id": "389662",
        "timestamp": "1764090297",
        "uuid": "304e24b5-f9ef-5f88-9c2e-8f7eb4900782",
        "deleted": false
      }
    ]
  }
}