diff --git a/CHANGELOG.md b/CHANGELOG.md index a32ade5..b8a8bf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,35 @@ Notable changes. Format loosely follows [Keep a Changelog](https://keepachangelo from the version it first shipped in), so a schema diff is evidence of a possible behavior change, not proof of one. +### Fixed + +- **`check` false-positived on every real layer rule with a `match` table** + — `HL.LayerRuleSpec.match` is typed `table` + (LuaLS's generic map syntax), which `_has_table_alternative` didn't + recognize as table-shaped at all (it only checked for `{` or `HL.` in the + type expression), so a perfectly valid `match = { namespace = "..." }` + was flagged as a type mismatch. Found by running `check` against two + independent real-world Hyprland Lua configs — Garuda Linux's + distribution-shipped settings + ([`garuda-hyprland-settings`](https://gitlab.com/garuda-linux/themes-and-settings/settings/garuda-hyprland-settings)) + and the [sea-shell](https://github.com/MiyukiVigil/sea-shell) project — + both of which hit this identically, since it's the only way to write a + layer rule at all. + + The same run surfaced a second, *upstream* gap, not a hyprvalidate bug: + both configs also use `hl.bind(..., { mouse = true })`, and `mouse` isn't + in `HL.BindOptions` at all. Traced directly into Hyprland's own source — + `mouse` is a real, implemented flag + ([`LuaKeybind.cpp`](https://github.com/hyprwm/Hyprland/blob/main/src/config/lua/objects/LuaKeybind.cpp), + parsed identically to `click`/`drag`, which *are* in the schema) that's + simply missing, along with `auto_consuming`, `device_inclusive`, and + `devices`, from a hand-written field list in Hyprland's own + `meta/generateLuaStubs.py` (lines ~658–677) — the exact "hand-maintained + table drifts from what's real" bug class this project exists to catch, + found one level further upstream than usual. Not something hyprvalidate + can fix on its own without hand-maintaining the same kind of table it + refuses to elsewhere; a candidate for an upstream report. + ## [0.3.0] — 2026-08-28 ### Added diff --git a/hyprvalidate/checker.py b/hyprvalidate/checker.py index a8637e2..e657c71 100644 --- a/hyprvalidate/checker.py +++ b/hyprvalidate/checker.py @@ -156,9 +156,16 @@ class Finding: # Type-expression tokens that indicate "this alternative is a table/class # shape, not a scalar" - used to decide whether to skip a mismatch rather -# than to model the shape. +# than to model the shape. Found missing "table" (bare, e.g. `integer|table`, +# and LuaLS's generic form `table`) by testing +# against two real, independent Hyprland Lua configs (Garuda Linux's +# distribution settings and the sea-shell project) - both use +# `hl.layer_rule({ match = { namespace = "..." } })`, which is exactly +# HL.LayerRuleSpec.match's real type, `table`; this +# helper didn't recognize that as table-shaped at all, so every layer rule +# with a match table in the wild was a false positive here. def _has_table_alternative(type_expr: str) -> bool: - return "{" in type_expr or "HL." in type_expr + return "{" in type_expr or "HL." in type_expr or "table" in type_expr _SCALAR_COMPAT = { diff --git a/site/bundle.js b/site/bundle.js index 05d3417..9b05c54 100644 --- a/site/bundle.js +++ b/site/bundle.js @@ -1,3 +1,3 @@ // Generated by site/build_bundle.py - do not edit by hand. -export const PY_FILES = {"hyprvalidate/schema/extractor.py": "IiIiRXh0cmFjdCBhIG1hY2hpbmUtcmVhZGFibGUgc2NoZW1hIGZyb20gSHlwcmxhbmQncyBMdWFMUyB0eXBlIHN0dWIuCgpUaGUgc3R1YiAoaW5zdGFsbGVkIGF0IC91c3Ivc2hhcmUvaHlwci9zdHVicy9obC5tZXRhLmx1YSwgYXV0b2dlbmVyYXRlZCBieQpIeXBybGFuZCdzIG93biBidWlsZCBmcm9tIG1ldGEvZ2VuZXJhdGVMdWFTdHVicy5weSkgaXMgfjkzJSBMdWFMUyBhbm5vdGF0aW9uCmNvbW1lbnRzIChgLS0tQGNsYXNzYCwgYC0tLUBmaWVsZGAsIGAtLS1AYWxpYXNgLCBgLS0tfCAibGl0ZXJhbCJgKS4gTm9uZSBvZgp0aGUgZm91ciBleGlzdGluZyBoeXBybGFuZy0+bHVhIGNvbnZlcnRlcnMgcmVhZCBpdCBjb3JyZWN0bHk6CiAgLSBoeXByY29uZjJsdWEsIGh5cHItbWlncmF0ZTogbmV2ZXIgYXR0ZW1wdCB0by4KICAtIGh5cHIybHVhOiBsb2FkcyBpdCwgYnV0IGl0cyBwYXJzZXIgc2tpcHMgZXZlcnkgbGluZSBzdGFydGluZyB3aXRoICItLSIKICAgIChwYXJzZXIuZ286MjkpIC0gd2hpY2ggaXMgZXZlcnkgTHVhTFMgYW5ub3RhdGlvbiAtIGFuZCBleHRyYWN0cyAwIGVudHJpZXMuCgpUaGlzIGlzIGEgc3RhdGUgbWFjaGluZSwgbm90IHRoYXQ6IGl0IHJlYWRzIE9OTFkgIi0tLSItcHJlZml4ZWQgbGluZXMgYW5kCnRyYWNrcyB3aGF0IGJsb2NrIGl0J3MgY3VycmVudGx5IGluc2lkZS4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQganNvbgppbXBvcnQgcmUKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZCwgYXNkaWN0CmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKCkBkYXRhY2xhc3MKY2xhc3MgQ2xhc3NJbmZvOgogICAgbmFtZTogc3RyCiAgICBmaWVsZHM6IGRpY3Rbc3RyLCBzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpICAjIGZpZWxkIG5hbWUgLT4gdHlwZSBleHByCgoKQGRhdGFjbGFzcwpjbGFzcyBBbGlhc0luZm86CiAgICBuYW1lOiBzdHIKICAgIGxpdGVyYWxzOiBsaXN0W3N0cl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkgICAgICAjIGZvciBzdHJpbmctdW5pb24gYWxpYXNlcwogICAgdHlwZV9leHByOiBzdHIgfCBOb25lID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBgLS0tQGFsaWFzIFggWWAgZm9ybQoKCkBkYXRhY2xhc3MKY2xhc3MgU2NoZW1hOgogICAgY2xhc3NlczogZGljdFtzdHIsIENsYXNzSW5mb10gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9ZGljdCkKICAgIGFsaWFzZXM6IGRpY3Rbc3RyLCBBbGlhc0luZm9dID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpCiAgICBjb25maWdfdmFsdWVfdHlwZXM6IGRpY3Rbc3RyLCBzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpICAjICdhLmIuYycgLT4gdHlwZQoKICAgIGRlZiB0b19qc29uKHNlbGYpIC0+IHN0cjoKICAgICAgICByZXR1cm4ganNvbi5kdW1wcygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImNsYXNzZXMiOiB7azogYXNkaWN0KHYpIGZvciBrLCB2IGluIHNlbGYuY2xhc3Nlcy5pdGVtcygpfSwKICAgICAgICAgICAgICAgICJhbGlhc2VzIjoge2s6IGFzZGljdCh2KSBmb3IgaywgdiBpbiBzZWxmLmFsaWFzZXMuaXRlbXMoKX0sCiAgICAgICAgICAgICAgICAiY29uZmlnX3ZhbHVlX3R5cGVzIjogc2VsZi5jb25maWdfdmFsdWVfdHlwZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGluZGVudD0yLAogICAgICAgICAgICBzb3J0X2tleXM9VHJ1ZSwKICAgICAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9qc29uKGNscywgdGV4dDogc3RyKSAtPiAiU2NoZW1hIjoKICAgICAgICAiIiJSZWNvbnN0cnVjdCBhIFNjaGVtYSBmcm9tIHRvX2pzb24oKSdzIG91dHB1dCAtIHRoZSBpbnZlcnNlLgogICAgICAgIEV4aXN0cyBmb3IgY29uc3VtZXJzIHRoYXQgY2FuJ3QgcmVhZCB0aGUgc3R1YiBkaXJlY3RseSAoZS5nLiBhCiAgICAgICAgYnJvd3NlciBlbnZpcm9ubWVudCB3aXRoIG5vIGZpbGVzeXN0ZW0gYWNjZXNzIHRvCiAgICAgICAgL3Vzci9zaGFyZS9oeXByL3N0dWJzKSwgc28gdGhleSBjYW4gbG9hZCBhIGZyb3plbiBzbmFwc2hvdCBpbnN0ZWFkCiAgICAgICAgb2YgcmUtcGFyc2luZyBobC5tZXRhLmx1YS4iIiIKICAgICAgICBkYXRhID0ganNvbi5sb2Fkcyh0ZXh0KQogICAgICAgIHJldHVybiBjbHMoCiAgICAgICAgICAgIGNsYXNzZXM9e2s6IENsYXNzSW5mbygqKnYpIGZvciBrLCB2IGluIGRhdGEuZ2V0KCJjbGFzc2VzIiwge30pLml0ZW1zKCl9LAogICAgICAgICAgICBhbGlhc2VzPXtrOiBBbGlhc0luZm8oKip2KSBmb3IgaywgdiBpbiBkYXRhLmdldCgiYWxpYXNlcyIsIHt9KS5pdGVtcygpfSwKICAgICAgICAgICAgY29uZmlnX3ZhbHVlX3R5cGVzPWRhdGEuZ2V0KCJjb25maWdfdmFsdWVfdHlwZXMiLCB7fSksCiAgICAgICAgKQoKCiMgLS0tQGNsYXNzIE5hbWVbOiBQYXJlbnRdCl9SRV9DTEFTUyA9IHJlLmNvbXBpbGUocideLS0tQGNsYXNzXHMrKFtcdy5dKyknKQoKIyAtLS1AZmllbGQgbmFtZSB0eXBlLi4uICAgICAgICAgIChiYXJlIGlkZW50aWZpZXIgZmllbGQgbmFtZSkKIyAtLS1AZmllbGQgWydkb3R0ZWQua2V5J10gdHlwZS4uLiAoYnJhY2tldGVkL3F1b3RlZCBmaWVsZCBuYW1lLCB1c2VkIGZvcgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnVmFsdWVUeXBlcy1zdHlsZSBtYXBzKQpfUkVfRklFTERfQkFSRSA9IHJlLmNvbXBpbGUociJeLS0tQGZpZWxkXHMrKFx3K1w/PylccysoLispJCIpCl9SRV9GSUVMRF9CUkFDS0VUID0gcmUuY29tcGlsZShyIl4tLS1AZmllbGRccytcWyhbJ1wiXSkoLis/KVwxXF1ccysoLispJCIpCgojIC0tLUBhbGlhcyBOYW1lIFtUeXBlRXhwcl0gICAoVHlwZUV4cHIgcHJlc2VudCA9PiBzaW1wbGUgYWxpYXMsIGFic2VudCA9PiBhCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHJ1biBvZiBgLS0tfCAibGl0ZXJhbCJgIGxpbmVzIGRlZmluZXMgaXQpCl9SRV9BTElBUyA9IHJlLmNvbXBpbGUocideLS0tQGFsaWFzXHMrKFtcdy5dKykoPzpccysoLispKT8kJykKCiMgLS0tfCAibGl0ZXJhbC12YWx1ZSIgICAoY29udGludWF0aW9uIGxpbmUgZm9yIGEgdW5pb24gYWxpYXMpCl9SRV9VTklPTl9NRU1CRVIgPSByZS5jb21waWxlKHInXi0tLVx8XHMqIihbXiJdKikiJykKCgpkZWYgZXh0cmFjdCh0ZXh0OiBzdHIpIC0+IFNjaGVtYToKICAgIHNjaGVtYSA9IFNjaGVtYSgpCgogICAgY3VycmVudF9jbGFzczogQ2xhc3NJbmZvIHwgTm9uZSA9IE5vbmUKICAgIGN1cnJlbnRfYWxpYXM6IEFsaWFzSW5mbyB8IE5vbmUgPSBOb25lCgogICAgZm9yIHJhd19saW5lIGluIHRleHQuc3BsaXRsaW5lcygpOgogICAgICAgIGxpbmUgPSByYXdfbGluZS5zdHJpcCgpCgogICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoIi0tLSIpIGFuZCBub3QgbGluZS5zdGFydHN3aXRoKCItLS18Iik6CiAgICAgICAgICAgICMgQW55IG5vbi1hbm5vdGF0aW9uIGxpbmUgKGJsYW5rLCBjb2RlLCBgbG9jYWwgX19ITF9YID0ge31gLCBgaGwgPSB7fWApCiAgICAgICAgICAgICMgZW5kcyB3aGF0ZXZlciBjbGFzcy9hbGlhcyBibG9jayB3ZSB3ZXJlIGFjY3VtdWxhdGluZy4KICAgICAgICAgICAgY3VycmVudF9jbGFzcyA9IE5vbmUKICAgICAgICAgICAgY3VycmVudF9hbGlhcyA9IE5vbmUKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbSA6PSBfUkVfQ0xBU1MubWF0Y2gobGluZSk6CiAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDEpCiAgICAgICAgICAgIGN1cnJlbnRfY2xhc3MgPSBzY2hlbWEuY2xhc3Nlcy5zZXRkZWZhdWx0KG5hbWUsIENsYXNzSW5mbyhuYW1lPW5hbWUpKQogICAgICAgICAgICBjdXJyZW50X2FsaWFzID0gTm9uZQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBtIDo9IF9SRV9BTElBUy5tYXRjaChsaW5lKToKICAgICAgICAgICAgbmFtZSwgdHlwZV9leHByID0gbS5ncm91cCgxKSwgbS5ncm91cCgyKQogICAgICAgICAgICBjdXJyZW50X2FsaWFzID0gc2NoZW1hLmFsaWFzZXMuc2V0ZGVmYXVsdChuYW1lLCBBbGlhc0luZm8obmFtZT1uYW1lKSkKICAgICAgICAgICAgaWYgdHlwZV9leHByOgogICAgICAgICAgICAgICAgY3VycmVudF9hbGlhcy50eXBlX2V4cHIgPSB0eXBlX2V4cHIuc3RyaXAoKQogICAgICAgICAgICBjdXJyZW50X2NsYXNzID0gTm9uZQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBjdXJyZW50X2NsYXNzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBtIDo9IF9SRV9GSUVMRF9CUkFDS0VULm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgICAga2V5LCB0eXBlX2V4cHIgPSBtLmdyb3VwKDIpLCBtLmdyb3VwKDMpLnN0cmlwKCkKICAgICAgICAgICAgICAgIGN1cnJlbnRfY2xhc3MuZmllbGRzW2tleV0gPSB0eXBlX2V4cHIKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfY2xhc3MubmFtZSA9PSAiSEwuQ29uZmlnVmFsdWVUeXBlcyI6CiAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmNvbmZpZ192YWx1ZV90eXBlc1trZXldID0gdHlwZV9leHByCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtIDo9IF9SRV9GSUVMRF9CQVJFLm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgICAgZm5hbWUsIHR5cGVfZXhwciA9IG0uZ3JvdXAoMSksIG0uZ3JvdXAoMikuc3RyaXAoKQogICAgICAgICAgICAgICAgY3VycmVudF9jbGFzcy5maWVsZHNbZm5hbWUucnN0cmlwKCI/IildID0gdHlwZV9leHByCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIEEgYC0tLWAgY29tbWVudCBsaW5lIGluc2lkZSBhIGNsYXNzIHRoYXQgaXNuJ3QgYSBAZmllbGQgKGUuZy4gYQogICAgICAgICAgICAjIHBsYWluIGRvYyBjb21tZW50KSAtIGlnbm9yZSwgc3RheSBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGN1cnJlbnRfYWxpYXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIG0gOj0gX1JFX1VOSU9OX01FTUJFUi5tYXRjaChsaW5lKToKICAgICAgICAgICAgICAgIGN1cnJlbnRfYWxpYXMubGl0ZXJhbHMuYXBwZW5kKG0uZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb250aW51ZQoKICAgIHJldHVybiBzY2hlbWEKCgpkZWYgZXh0cmFjdF9maWxlKHBhdGg6IHN0ciB8IFBhdGgpIC0+IFNjaGVtYToKICAgIHJldHVybiBleHRyYWN0KFBhdGgocGF0aCkucmVhZF90ZXh0KCkpCgoKZGVmIGxvYWRfc2NoZW1hKHBhdGg6IHN0ciB8IFBhdGgpIC0+IFNjaGVtYToKICAgICIiIkxvYWQgYSBzY2hlbWEgZnJvbSBlaXRoZXIgSHlwcmxhbmQncyBgLmx1YWAgc3R1YiBvciBhIGAuanNvbmAKICAgIHNuYXBzaG90IHByb2R1Y2VkIGJ5IGBTY2hlbWEudG9fanNvbigpYC4KCiAgICBUaGUgSlNPTiBwYXRoIGV4aXN0cyBzbyBhIGNvbmZpZyBjYW4gYmUgdmFsaWRhdGVkIG9uIGEgbWFjaGluZSB0aGF0CiAgICBkb2Vzbid0IGhhdmUgSHlwcmxhbmQgaW5zdGFsbGVkIGF0IGFsbCAtIENJIGZvciBhIGRvdGZpbGVzIHJlcG8sIGEKICAgIGNvbnRhaW5lciwgb3IgdGhlIGJyb3dzZXIgZGVtby4gRGlzcGF0Y2ggaXMgb24gdGhlIGZpbGUgZXh0ZW5zaW9uLAogICAgc2luY2UgdGhlIHR3byBmb3JtYXRzIGFyZSB1bmFtYmlndW91cy4KICAgICIiIgogICAgcCA9IFBhdGgocGF0aCkKICAgIGlmIHAuc3VmZml4ID09ICIuanNvbiI6CiAgICAgICAgcmV0dXJuIFNjaGVtYS5mcm9tX2pzb24ocC5yZWFkX3RleHQoKSkKICAgIHJldHVybiBleHRyYWN0X2ZpbGUocCkKCgpkZWYgbWFpbigpIC0+IE5vbmU6CiAgICBpbXBvcnQgYXJncGFyc2UKCiAgICBhcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCiAgICBhcC5hZGRfYXJndW1lbnQoCiAgICAgICAgInN0dWIiLCBuYXJncz0iPyIsIGRlZmF1bHQ9Ii91c3Ivc2hhcmUvaHlwci9zdHVicy9obC5tZXRhLmx1YSIsCiAgICAgICAgaGVscD0icGF0aCB0byBobC5tZXRhLmx1YSAoZGVmYXVsdDogdGhlIGluc3RhbGxlZCBzeXN0ZW0gc3R1YikiLAogICAgKQogICAgYXAuYWRkX2FyZ3VtZW50KCItbyIsICItLW91dCIsIGhlbHA9IndyaXRlIEpTT04gaGVyZSBpbnN0ZWFkIG9mIHN0ZG91dCIpCiAgICBhcmdzID0gYXAucGFyc2VfYXJncygpCgogICAgc3R1Yl9wYXRoID0gUGF0aChhcmdzLnN0dWIpCiAgICBpZiBub3Qgc3R1Yl9wYXRoLmlzX2ZpbGUoKToKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KAogICAgICAgICAgICBmImVycm9yOiBzdHViIGZpbGUgbm90IGZvdW5kIGF0IHtzdHViX3BhdGh9XG4iCiAgICAgICAgICAgICJUaGlzIHRvb2wgcmVhZHMgSHlwcmxhbmQncyBvd24gYXV0b2dlbmVyYXRlZCBMdWFMUyBzdHViLiAiCiAgICAgICAgICAgICJJZiB5b3VyIGRpc3RybyBkb2Vzbid0IHNoaXAgaXQgYXQgdGhlIGRlZmF1bHQgcGF0aCwgcGFzcyBpdCBleHBsaWNpdGx5LiIKICAgICAgICApCgogICAgc2NoZW1hID0gZXh0cmFjdF9maWxlKHN0dWJfcGF0aCkKCiAgICAjIEhhcmQgZmFpbHVyZSBvbiBlbXB0eSBleHRyYWN0aW9uIC0gdGhpcyBpcyB0aGUgZXhhY3QgYnVnIHRoYXQgbGV0CiAgICAjIGh5cHIybHVhIHNoaXAgYSBzY2hlbWEgbG9hZGVyIHRoYXQgc2lsZW50bHkgZXh0cmFjdHMgbm90aGluZy4KICAgIGlmIG5vdCBzY2hlbWEuY2xhc3NlcyBhbmQgbm90IHNjaGVtYS5hbGlhc2VzOgogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoCiAgICAgICAgICAgIGYiZXJyb3I6IGV4dHJhY3RlZCBaRVJPIGNsYXNzZXMvYWxpYXNlcyBmcm9tIHtzdHViX3BhdGh9IC0gIgogICAgICAgICAgICAidGhlIHN0dWIgZm9ybWF0IGhhcyBsaWtlbHkgY2hhbmdlZCBhbmQgdGhpcyBleHRyYWN0b3IgbmVlZHMgdXBkYXRpbmcuICIKICAgICAgICAgICAgIlJlZnVzaW5nIHRvIHByb2R1Y2UgYW4gZW1wdHkgc2NoZW1hIHNpbGVudGx5LiIKICAgICAgICApCgogICAgb3V0ID0gc2NoZW1hLnRvX2pzb24oKQogICAgaWYgYXJncy5vdXQ6CiAgICAgICAgUGF0aChhcmdzLm91dCkud3JpdGVfdGV4dChvdXQgKyAiXG4iKQogICAgICAgIHByaW50KGYid3JvdGUgc2NoZW1hICh7bGVuKHNjaGVtYS5jbGFzc2VzKX0gY2xhc3Nlcywge2xlbihzY2hlbWEuYWxpYXNlcyl9IGFsaWFzZXMpIHRvIHthcmdzLm91dH0iKQogICAgZWxzZToKICAgICAgICBwcmludChvdXQpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo=", "hyprvalidate/hyprlang/lexer.py": "IiIiTGV4ZXIgZm9yIHRoZSBvbGQgaHlwcmxhbmcgLmNvbmYgZm9ybWF0LgoKQWRhcHRlZCBmcm9tIGh5cHJjb25mMmx1YSdzIGxleGVyLnB5IChNSVQgTGljZW5zZSwgaHlwcmNvbmYybHVhIGNvbnRyaWJ1dG9ycywKaHR0cHM6Ly9naXRodWIuY29tL1ByYXRlZWstc3F1YWRyb24vaHlwcmNvbmYybHVhKSwgd2hpY2ggYWxyZWFkeSBoYW5kbGVzIHRoZQpmb3JtYXQncyBncmFtbWFyIHF1aXJrcyBjb3JyZWN0bHk6IGJhY2tzbGFzaCBsaW5lIGNvbnRpbnVhdGlvbiwgYCR7Li4ufWAKc2hlbGwgZXhwYW5zaW9uICh2cy4gYSBiYXJlIGAkYCBmb3IgdmFyaWFibGUgcmVmcyksIGFuZCBjb21tZW50IHN0cmlwcGluZy4KQWRhcHRlZCByYXRoZXIgdGhhbiByZWludmVudGVkLCByYXRoZXIgdGhhbiByZXdyaXRpbmcgYSBoeXBybGFuZyBsZXhlciBmcm9tCnNjcmF0Y2ggd2hlbiBhIGNvcnJlY3QgTUlULWxpY2Vuc2VkIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgcmUKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0CgpUT0tFTl9TUEVDUyA9IFsKICAgICgiQ09NTUVOVCIsIHIiI1teXG5dKiIpLAogICAgKCJCTE9DS19PUEVOIiwgciJceyIpLAogICAgKCJCTE9DS19DTE9TRSIsIHIiXH0iKSwKICAgICgiRVFVQUxTIiwgciI9IiksCiAgICAoIkNPTU1BIiwgciIsIiksCiAgICAoIkRPVCIsIHIiXC4iKSwKICAgICgiQ09MT04iLCByIjoiKSwKICAgICgiU0hFTExfRVhQIiwgciJcJFx7W159XG5dKlx9IiksCiAgICAoIkRPTExBUiIsIHIiXCQiKSwKICAgICgiU1RSSU5HIiwgciciKFteIlxcXXxcXC4pKiInKSwKICAgICgiQ09OVCIsIHIiXFxbIFx0XSpcbiIpLAogICAgKCJJREVOVCIsIHInW15ccyMiPXt9LDohXSsnKSwKICAgICgiTkVXTElORSIsIHIiXG4iKSwKICAgICgiU0tJUCIsIHIiWyBcdF0rIiksCiAgICAoIk1JU01BVENIIiwgciIuIiksCl0KClRPS0VOX1JFR0VYID0gcmUuY29tcGlsZSgifCIuam9pbihmIig/UDx7bmFtZX0+e3BhdHRlcm59KSIgZm9yIG5hbWUsIHBhdHRlcm4gaW4gVE9LRU5fU1BFQ1MpKQoKCkBkYXRhY2xhc3MKY2xhc3MgVG9rZW46CiAgICB0eXBlOiBzdHIKICAgIHZhbHVlOiBzdHIKICAgIGxpbmU6IGludAogICAgY29sOiBpbnQKCiAgICBkZWYgX19yZXByX18oc2VsZikgLT4gc3RyOgogICAgICAgIHJldHVybiBmIlRva2VuKHtzZWxmLnR5cGV9LCB7c2VsZi52YWx1ZSFyfSwgTHtzZWxmLmxpbmV9OntzZWxmLmNvbH0pIgoKCmNsYXNzIExleGVyRXJyb3IoRXhjZXB0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlOiBzdHIsIGxpbmU6IGludCwgY29sOiBpbnQpOgogICAgICAgIHNlbGYubGluZSA9IGxpbmUKICAgICAgICBzZWxmLmNvbCA9IGNvbAogICAgICAgIHN1cGVyKCkuX19pbml0X18oZiJMe2xpbmV9Ontjb2x9OiB7bWVzc2FnZX0iKQoKCmRlZiB0b2tlbml6ZShzb3VyY2U6IHN0cikgLT4gTGlzdFtUb2tlbl06CiAgICB0b2tlbnM6IExpc3RbVG9rZW5dID0gW10KICAgIGxpbmUgPSAxCiAgICBsYXN0X2xpbmVfc3RhcnQgPSAwCgogICAgZGVmIF9jb2wocG9zOiBpbnQpIC0+IGludDoKICAgICAgICByZXR1cm4gcG9zIC0gbGFzdF9saW5lX3N0YXJ0ICsgMQoKICAgIGZvciBtIGluIFRPS0VOX1JFR0VYLmZpbmRpdGVyKHNvdXJjZSk6CiAgICAgICAga2luZCA9IG0ubGFzdGdyb3VwCiAgICAgICAgdmFsdWUgPSBtLmdyb3VwKCkKICAgICAgICBwb3MgPSBtLnN0YXJ0KCkKCiAgICAgICAgaWYga2luZCA9PSAiTkVXTElORSI6CiAgICAgICAgICAgIGxpbmUgKz0gMQogICAgICAgICAgICBsYXN0X2xpbmVfc3RhcnQgPSBwb3MgKyAxCiAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoVG9rZW4oIk5FV0xJTkUiLCB2YWx1ZSwgbGluZSAtIDEsIF9jb2wocG9zKSkpCiAgICAgICAgZWxpZiBraW5kID09ICJDT05UIjoKICAgICAgICAgICAgbGluZSArPSAxCiAgICAgICAgICAgIGxhc3RfbGluZV9zdGFydCA9IG0uZW5kKCkKICAgICAgICBlbGlmIGtpbmQgPT0gIlNLSVAiOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBraW5kID09ICJDT01NRU5UIjoKICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChUb2tlbigiQ09NTUVOVCIsIHZhbHVlLCBsaW5lLCBfY29sKHBvcykpKQogICAgICAgIGVsaWYga2luZCA9PSAiTUlTTUFUQ0giOgogICAgICAgICAgICByYWlzZSBMZXhlckVycm9yKGYiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IHt2YWx1ZSFyfSIsIGxpbmUsIF9jb2wocG9zKSkKICAgICAgICBlbGlmIGtpbmQgPT0gIlNUUklORyI6CiAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoVG9rZW4oIlNUUklORyIsIHZhbHVlWzE6LTFdLCBsaW5lLCBfY29sKHBvcykpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoVG9rZW4oa2luZCwgdmFsdWUsIGxpbmUsIF9jb2wocG9zKSkpCgogICAgdG9rZW5zLmFwcGVuZChUb2tlbigiRU9GIiwgIiIsIGxpbmUsIDEpKQogICAgcmV0dXJuIHRva2Vucwo=", "hyprvalidate/hyprlang/parser.py": "IiIiUGFyc2VyL0FTVCBmb3IgdGhlIG9sZCBoeXBybGFuZyAuY29uZiBmb3JtYXQuCgpCdWlsZHMgYSBzbWFsbCBBU1QgZnJvbSB0aGUgbGV4ZXIncyB0b2tlbiBzdHJlYW06IGJsb2NrcywgZmxhdCBkaXJlY3RpdmVzLAokdmFyaWFibGUgYXNzaWdubWVudC9zdWJzdGl0dXRpb24sIGFuZCBhIHNpbmdsZSB1bmlmaWVkIFdpbmRvd1J1bGUgbm9kZSBmb3IKYm90aCBgd2luZG93cnVsZSB7IC4uLiB9YCAoYmxvY2sgZm9ybSkgYW5kIGB3aW5kb3dydWxlID0gcnVsZSwgc2VsZWN0b3JgCihvbmUtbGluZSBmb3JtKSAtIGh5cHIybHVhJ3MgZGVmZWN0IDMvNCB3YXMgcm91dGluZyB0aGVzZSB0byBkaWZmZXJlbnQKaGFuZGxlcnM7IGhlcmUgdGhleSBhbHdheXMgcHJvZHVjZSB0aGUgc2FtZSBub2RlIHR5cGUuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MsIGZpZWxkCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVW5pb24KCmZyb20gLmxleGVyIGltcG9ydCBUb2tlbiwgdG9rZW5pemUKCldJTkRPV19SVUxFX05BTUVTID0gKCJ3aW5kb3dydWxlIiwgIndpbmRvd3J1bGV2MiIpCgojIERpcmVjdGl2ZSBrZXlzIHdob3NlIHZhbHVlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcG9zaXRpb25hbCBhcmdzIGluCiMgcmVhbCBoeXBybGFuZyAtIGV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyBpdHMgd2hvbGUgcmVtYWluZGVyIGFzIG9uZSB2YWx1ZQojIChjb21tYXMgaW5jbHVkZWQpLCBzaW5jZSBhIHBsYWluIGBrZXkgPSB2YWx1ZWAgbGluZSBpcyBuZXZlciBzcGxpdC4KQ09NTUFfTElTVF9LRVlTID0gZnJvemVuc2V0KHsKICAgICJtb25pdG9yIiwgImFuaW1hdGlvbiIsICJiZXppZXIiLCAiZ2VzdHVyZSIsICJsYXllcnJ1bGUiLCAid29ya3NwYWNlIiwKICAgICJwZXJtaXNzaW9uIiwgImVudiIsCn0pCgoKZGVmIF9pc19jb21tYV9saXN0X2tleShrZXk6IHN0cikgLT4gYm9vbDoKICAgIHJldHVybiBrZXkgaW4gQ09NTUFfTElTVF9LRVlTIG9yIGtleS5zdGFydHN3aXRoKCJiaW5kIikKCgpAZGF0YWNsYXNzCmNsYXNzIERpcmVjdGl2ZToKICAgIGtleTogc3RyCiAgICBhcmdzOiBMaXN0W3N0cl0KICAgIGxpbmU6IGludAoKCkBkYXRhY2xhc3MKY2xhc3MgVmFyaWFibGVBc3NpZ246CiAgICBuYW1lOiBzdHIKICAgIHZhbHVlOiBzdHIKICAgIGxpbmU6IGludAoKCkBkYXRhY2xhc3MKY2xhc3MgQmxvY2s6CiAgICBuYW1lOiBzdHIKICAgIGRpcmVjdGl2ZXM6IExpc3RbRGlyZWN0aXZlXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgYmxvY2tzOiBMaXN0WyJCbG9jayJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBsaW5lOiBpbnQgPSAwCgoKQGRhdGFjbGFzcwpjbGFzcyBXaW5kb3dSdWxlOgogICAgbGluZTogaW50CiAgICBtYXRjaDogRGljdFtzdHIsIHN0cl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9ZGljdCkKICAgIHByb3BlcnRpZXM6IERpY3Rbc3RyLCBzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpCgoKU3RhdGVtZW50ID0gVW5pb25bRGlyZWN0aXZlLCBWYXJpYWJsZUFzc2lnbiwgQmxvY2ssIFdpbmRvd1J1bGVdCgoKQGRhdGFjbGFzcwpjbGFzcyBIeXBybGFuZ0ZpbGU6CiAgICB2YXJpYWJsZXM6IERpY3Rbc3RyLCBzdHJdCiAgICBzdGF0ZW1lbnRzOiBMaXN0W1N0YXRlbWVudF0KCgpjbGFzcyBQYXJzZUVycm9yKEV4Y2VwdGlvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZTogc3RyLCBsaW5lOiBpbnQpOgogICAgICAgIHNlbGYubGluZSA9IGxpbmUKICAgICAgICBzdXBlcigpLl9faW5pdF9fKGYiTHtsaW5lfToge21lc3NhZ2V9IikKCgpjbGFzcyBfUGFyc2VyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuczogTGlzdFtUb2tlbl0pOgogICAgICAgICMgQ29tbWVudHMgY2Fycnkgbm8gc3RydWN0dXJhbCBtZWFuaW5nIGhlcmUgLSBkcm9wIHRoZW0sIGtlZXAgTkVXTElORQogICAgICAgICMgYXMgdGhlIHN0YXRlbWVudCB0ZXJtaW5hdG9yIHRoYXQgd2FzIGFscmVhZHkgYWxvbmdzaWRlIHRoZW0uCiAgICAgICAgc2VsZi50b2tlbnMgPSBbdCBmb3IgdCBpbiB0b2tlbnMgaWYgdC50eXBlICE9ICJDT01NRU5UIl0KICAgICAgICBzZWxmLnBvcyA9IDAKICAgICAgICBzZWxmLnZhcmlhYmxlczogRGljdFtzdHIsIHN0cl0gPSB7fQoKICAgIGRlZiBfcGVlayhzZWxmLCBvZmZzZXQ6IGludCA9IDApIC0+IFRva2VuOgogICAgICAgIGlkeCA9IHNlbGYucG9zICsgb2Zmc2V0CiAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zW2lkeF0gaWYgaWR4IDwgbGVuKHNlbGYudG9rZW5zKSBlbHNlIHNlbGYudG9rZW5zWy0xXQoKICAgIGRlZiBfYWR2YW5jZShzZWxmKSAtPiBUb2tlbjoKICAgICAgICB0b2sgPSBzZWxmLnRva2Vuc1tzZWxmLnBvc10KICAgICAgICBpZiB0b2sudHlwZSAhPSAiRU9GIjoKICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQogICAgICAgIHJldHVybiB0b2sKCiAgICBkZWYgX3NraXBfbmV3bGluZXMoc2VsZikgLT4gTm9uZToKICAgICAgICB3aGlsZSBzZWxmLl9wZWVrKCkudHlwZSA9PSAiTkVXTElORSI6CiAgICAgICAgICAgIHNlbGYuX2FkdmFuY2UoKQoKICAgIGRlZiBfc3Vic3RpdHV0ZShzZWxmLCB0ZXh0OiBzdHIpIC0+IHN0cjoKICAgICAgICBpZiB0ZXh0LnN0YXJ0c3dpdGgoIiQiKSBhbmQgdGV4dFsxOl0gaW4gc2VsZi52YXJpYWJsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnZhcmlhYmxlc1t0ZXh0WzE6XV0KICAgICAgICByZXR1cm4gdGV4dAoKICAgIGRlZiBfcmVhZF92YWx1ZV90b2tlbnNfdW50aWxfbmV3bGluZShzZWxmKSAtPiBMaXN0W1Rva2VuXToKICAgICAgICB2YWx1ZV90b2tlbnM6IExpc3RbVG9rZW5dID0gW10KICAgICAgICB3aGlsZSBzZWxmLl9wZWVrKCkudHlwZSBub3QgaW4gKCJORVdMSU5FIiwgIkVPRiIpOgogICAgICAgICAgICB2YWx1ZV90b2tlbnMuYXBwZW5kKHNlbGYuX2FkdmFuY2UoKSkKICAgICAgICByZXR1cm4gdmFsdWVfdG9rZW5zCgogICAgZGVmIF90b2tlbnNfdG9fYXJncyhzZWxmLCB2YWx1ZV90b2tlbnM6IExpc3RbVG9rZW5dLCBzcGxpdF9jb21tYXM6IGJvb2wgPSBUcnVlKSAtPiBMaXN0W3N0cl06CiAgICAgICAgIiIiSm9pbiBhIHZhbHVlJ3MgdG9rZW5zIGludG8gJC1zdWJzdGl0dXRlZCBhcmcgc3RyaW5ncywgY29tbWEtc3BsaXQKICAgICAgICBvbmx5IHdoZW4gYHNwbGl0X2NvbW1hc2AgaXMgdHJ1ZS4gaHlwcmxhbmcgb25seSBjb21tYS1zcGxpdHMgZm9yCiAgICAgICAgc3BlY2lmaWMgbXVsdGktYXJnIGRpcmVjdGl2ZXMgKGJpbmQvbW9uaXRvci9hbmltYXRpb24vYmV6aWVyLwogICAgICAgIGdlc3R1cmUvbGF5ZXJydWxlL3dvcmtzcGFjZS9wZXJtaXNzaW9uL2Vudiwgc2VlIENPTU1BX0xJU1RfS0VZUykgLQogICAgICAgIGEgcGxhaW4gYGtleSA9IHZhbHVlYCBrZWVwcyBpdHMgd2hvbGUgcmVtYWluZGVyIGFzIG9uZSB2YWx1ZSwgY29tbWFzCiAgICAgICAgaW5jbHVkZWQuIEZvdW5kIHZpYSB0aGUgcmVhbCBjb25maWcncyBvd24gam9rZSB2YWx1ZQogICAgICAgIChgYW5pbWF0aW9ucyB7IGVuYWJsZWQgPSB5ZXMsIHBsZWFzZSA6KSB9YCksIHdoaWNoIGEgYmxhbmtldCBjb21tYQogICAgICAgIHNwbGl0IHdvdWxkIHdyb25nbHkgY3V0IGludG8gdHdvIGFyZ3MuCgogICAgICAgIEFkamFjZW5jeSAobm8gd2hpdGVzcGFjZSkgaXMgcHJlc2VydmVkIHdpdGhvdXQgYSBzcGFjZTsgYSBnYXAgaW4gdGhlCiAgICAgICAgc291cmNlICh3aGl0ZXNwYWNlIHRoZSBsZXhlcidzIFNLSVAgcnVsZSBkaXNjYXJkZWQpIGJlY29tZXMgZXhhY3RseQogICAgICAgIG9uZSBzcGFjZS4gcG9ueXRhaWw6IFNUUklORyB0b2tlbnMnIHN0cmlwcGVkIHF1b3RlcyB0aHJvdyB0aGlzIG9mZgogICAgICAgIGJ5IDIgY29sdW1ucyBpZiBzb21ldGhpbmcgaXMgZ2x1ZWQgZGlyZWN0bHkgb250byBhIHF1b3RlZCBzdHJpbmcKICAgICAgICB3aXRoIHplcm8gd2hpdGVzcGFjZSAtIG5vdCBhIHJlYWwgc2hhcGUgaW4gdGhpcyBwcm9qZWN0J3MgY29uZmlncywKICAgICAgICBub3Qgd29ydGggdHJhY2tpbmcgZXhhY3QgZW5kLWNvbHVtbnMgcGVyIHRva2VuIHR5cGUgZm9yLgogICAgICAgICIiIgogICAgICAgIHNlZ21lbnRzOiBMaXN0W0xpc3RbVG9rZW5dXSA9IFtbXV0KICAgICAgICBmb3IgdG9rIGluIHZhbHVlX3Rva2VuczoKICAgICAgICAgICAgaWYgc3BsaXRfY29tbWFzIGFuZCB0b2sudHlwZSA9PSAiQ09NTUEiOgogICAgICAgICAgICAgICAgc2VnbWVudHMuYXBwZW5kKFtdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VnbWVudHNbLTFdLmFwcGVuZCh0b2spCgogICAgICAgIGFyZ3M6IExpc3Rbc3RyXSA9IFtdCiAgICAgICAgZm9yIHNlZyBpbiBzZWdtZW50czoKICAgICAgICAgICAgcGllY2UgPSAiIgogICAgICAgICAgICBwcmV2X2VuZF9jb2w6IE9wdGlvbmFsW2ludF0gPSBOb25lCiAgICAgICAgICAgIHBlbmRpbmdfZG9sbGFyID0gRmFsc2UKICAgICAgICAgICAgZm9yIHRvayBpbiBzZWc6CiAgICAgICAgICAgICAgICBpZiB0b2sudHlwZSA9PSAiRE9MTEFSIjoKICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2RvbGxhciA9IFRydWUKICAgICAgICAgICAgICAgICAgICBwcmV2X2VuZF9jb2wgPSB0b2suY29sICsgMQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBnYXAgPSBwcmV2X2VuZF9jb2wgaXMgbm90IE5vbmUgYW5kIHRvay5jb2wgPiBwcmV2X2VuZF9jb2wKICAgICAgICAgICAgICAgIGlmIHBlbmRpbmdfZG9sbGFyOgogICAgICAgICAgICAgICAgICAgIHBpZWNlICs9IHNlbGYuX3N1YnN0aXR1dGUoIiQiICsgdG9rLnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfZG9sbGFyID0gRmFsc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgcGllY2UgYW5kIGdhcDoKICAgICAgICAgICAgICAgICAgICAgICAgcGllY2UgKz0gIiAiCiAgICAgICAgICAgICAgICAgICAgcGllY2UgKz0gdG9rLnZhbHVlCiAgICAgICAgICAgICAgICBwcmV2X2VuZF9jb2wgPSB0b2suY29sICsgbGVuKHRvay52YWx1ZSkKICAgICAgICAgICAgYXJncy5hcHBlbmQocGllY2Uuc3RyaXAoKSkKICAgICAgICByZXR1cm4gYXJncwoKICAgIGRlZiBwYXJzZShzZWxmKSAtPiBIeXBybGFuZ0ZpbGU6CiAgICAgICAgc3RhdGVtZW50cyA9IHNlbGYuX3BhcnNlX3N0YXRlbWVudHMoKQogICAgICAgIHJldHVybiBIeXBybGFuZ0ZpbGUodmFyaWFibGVzPXNlbGYudmFyaWFibGVzLCBzdGF0ZW1lbnRzPXN0YXRlbWVudHMpCgogICAgZGVmIF9wYXJzZV9zdGF0ZW1lbnRzKHNlbGYpIC0+IExpc3RbU3RhdGVtZW50XToKICAgICAgICBzdGF0ZW1lbnRzOiBMaXN0W1N0YXRlbWVudF0gPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHNlbGYuX3NraXBfbmV3bGluZXMoKQogICAgICAgICAgICB0b2sgPSBzZWxmLl9wZWVrKCkKICAgICAgICAgICAgaWYgdG9rLnR5cGUgaW4gKCJFT0YiLCAiQkxPQ0tfQ0xPU0UiKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHN0YXRlbWVudHMuYXBwZW5kKHNlbGYuX3BhcnNlX29uZV9zdGF0ZW1lbnQoKSkKICAgICAgICByZXR1cm4gc3RhdGVtZW50cwoKICAgIGRlZiBfcGFyc2Vfb25lX3N0YXRlbWVudChzZWxmKSAtPiBTdGF0ZW1lbnQ6CiAgICAgICAgdG9rID0gc2VsZi5fcGVlaygpCiAgICAgICAgbGluZSA9IHRvay5saW5lCgogICAgICAgIGlmIHRvay50eXBlID09ICJET0xMQVIiOgogICAgICAgICAgICBzZWxmLl9hZHZhbmNlKCkKICAgICAgICAgICAgbmFtZSA9IHNlbGYuX2FkdmFuY2UoKS52YWx1ZQogICAgICAgICAgICBzZWxmLl9leHBlY3QoIkVRVUFMUyIsIGxpbmUpCiAgICAgICAgICAgIHZhbHVlX3Rva2VucyA9IHNlbGYuX3JlYWRfdmFsdWVfdG9rZW5zX3VudGlsX25ld2xpbmUoKQogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3Rva2Vuc190b19hcmdzKHZhbHVlX3Rva2VucylbMF0gaWYgdmFsdWVfdG9rZW5zIGVsc2UgIiIKICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICByZXR1cm4gVmFyaWFibGVBc3NpZ24obmFtZT1uYW1lLCB2YWx1ZT12YWx1ZSwgbGluZT1saW5lKQoKICAgICAgICBpZiB0b2sudHlwZSAhPSAiSURFTlQiOgogICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKGYiZXhwZWN0ZWQgYSBkaXJlY3RpdmUsIGJsb2NrLCBvciB2YXJpYWJsZSwgZ290IHt0b2sudHlwZX0iLCBsaW5lKQoKICAgICAgICBrZXlfcGFydHMgPSBbc2VsZi5fYWR2YW5jZSgpLnZhbHVlXQogICAgICAgIHdoaWxlIHNlbGYuX3BlZWsoKS50eXBlIGluICgiQ09MT04iLCAiRE9UIik6CiAgICAgICAgICAgIGtleV9wYXJ0cy5hcHBlbmQoc2VsZi5fYWR2YW5jZSgpLnZhbHVlKQogICAgICAgICAgICBrZXlfcGFydHMuYXBwZW5kKHNlbGYuX2FkdmFuY2UoKS52YWx1ZSkKICAgICAgICBrZXkgPSAiIi5qb2luKGtleV9wYXJ0cykKCiAgICAgICAgbnh0ID0gc2VsZi5fcGVlaygpCiAgICAgICAgaWYgbnh0LnR5cGUgPT0gIkJMT0NLX09QRU4iOgogICAgICAgICAgICBzZWxmLl9hZHZhbmNlKCkKICAgICAgICAgICAgYmxvY2sgPSBzZWxmLl9wYXJzZV9ibG9jayhrZXksIGxpbmUpCiAgICAgICAgICAgIGlmIGtleSBpbiBXSU5ET1dfUlVMRV9OQU1FUzoKICAgICAgICAgICAgICAgIHJldHVybiBfYmxvY2tfdG9fd2luZG93X3J1bGUoYmxvY2spCiAgICAgICAgICAgIHJldHVybiBibG9jawoKICAgICAgICBpZiBueHQudHlwZSA9PSAiRVFVQUxTIjoKICAgICAgICAgICAgc2VsZi5fYWR2YW5jZSgpCiAgICAgICAgICAgIHZhbHVlX3Rva2VucyA9IHNlbGYuX3JlYWRfdmFsdWVfdG9rZW5zX3VudGlsX25ld2xpbmUoKQogICAgICAgICAgICBzcGxpdF9jb21tYXMgPSBrZXkgaW4gV0lORE9XX1JVTEVfTkFNRVMgb3IgX2lzX2NvbW1hX2xpc3Rfa2V5KGtleSkKICAgICAgICAgICAgYXJncyA9IHNlbGYuX3Rva2Vuc190b19hcmdzKHZhbHVlX3Rva2Vucywgc3BsaXRfY29tbWFzPXNwbGl0X2NvbW1hcykKICAgICAgICAgICAgaWYga2V5IGluIFdJTkRPV19SVUxFX05BTUVTOgogICAgICAgICAgICAgICAgcmV0dXJuIF9vbmVfbGluZV90b193aW5kb3dfcnVsZShhcmdzLCBsaW5lKQogICAgICAgICAgICByZXR1cm4gRGlyZWN0aXZlKGtleT1rZXksIGFyZ3M9YXJncywgbGluZT1saW5lKQoKICAgICAgICByYWlzZSBQYXJzZUVycm9yKGYiZXhwZWN0ZWQgJz0nIG9yICd7eycgYWZ0ZXIgJ3trZXl9JywgZ290IHtueHQudHlwZX0iLCBsaW5lKQoKICAgIGRlZiBfZXhwZWN0KHNlbGYsIHRva2VuX3R5cGU6IHN0ciwgbGluZTogaW50KSAtPiBUb2tlbjoKICAgICAgICB0b2sgPSBzZWxmLl9wZWVrKCkKICAgICAgICBpZiB0b2sudHlwZSAhPSB0b2tlbl90eXBlOgogICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKGYiZXhwZWN0ZWQge3Rva2VuX3R5cGV9LCBnb3Qge3Rvay50eXBlfSIsIGxpbmUpCiAgICAgICAgcmV0dXJuIHNlbGYuX2FkdmFuY2UoKQoKICAgIGRlZiBfcGFyc2VfYmxvY2soc2VsZiwgbmFtZTogc3RyLCBsaW5lOiBpbnQpIC0+IEJsb2NrOgogICAgICAgIGJsb2NrID0gQmxvY2sobmFtZT1uYW1lLCBsaW5lPWxpbmUpCiAgICAgICAgZm9yIHN0bXQgaW4gc2VsZi5fcGFyc2Vfc3RhdGVtZW50cygpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0bXQsIEJsb2NrKToKICAgICAgICAgICAgICAgIGJsb2NrLmJsb2Nrcy5hcHBlbmQoc3RtdCkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0bXQsIERpcmVjdGl2ZSk6CiAgICAgICAgICAgICAgICBibG9jay5kaXJlY3RpdmVzLmFwcGVuZChzdG10KQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3RtdCwgVmFyaWFibGVBc3NpZ24pOgogICAgICAgICAgICAgICAgIyBoeXBybGFuZyBhbGxvd3MgJHZhciA9IC4uLiBpbnNpZGUgYmxvY2tzIHRvbzsga2VlcCBpdCBpbgogICAgICAgICAgICAgICAgIyB0aGUgc2hhcmVkIGdsb2JhbCB2YXJpYWJsZSB0YWJsZSwgZG9uJ3QgYXR0YWNoIHRvIGEgbm9kZS4KICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoZiJ1bmV4cGVjdGVkIG5lc3RlZCB3aW5kb3cgcnVsZSBpbnNpZGUgJ3tuYW1lfSciLCBsaW5lKQogICAgICAgIHNlbGYuX2V4cGVjdCgiQkxPQ0tfQ0xPU0UiLCBsaW5lKQogICAgICAgIHJldHVybiBibG9jawoKICAgIGRlZiBfY3VycmVudF9saW5lKHNlbGYpIC0+IGludDoKICAgICAgICByZXR1cm4gc2VsZi5fcGVlaygpLmxpbmUKCgpkZWYgX2Jsb2NrX3RvX3dpbmRvd19ydWxlKGJsb2NrOiBCbG9jaykgLT4gV2luZG93UnVsZToKICAgIHJ1bGUgPSBXaW5kb3dSdWxlKGxpbmU9YmxvY2subGluZSkKICAgIGZvciBkIGluIGJsb2NrLmRpcmVjdGl2ZXM6CiAgICAgICAgdmFsdWUgPSBkLmFyZ3NbMF0gaWYgZC5hcmdzIGVsc2UgIiIKICAgICAgICBpZiBkLmtleS5zdGFydHN3aXRoKCJtYXRjaDoiKToKICAgICAgICAgICAgcnVsZS5tYXRjaFtkLmtleVtsZW4oIm1hdGNoOiIpOl1dID0gdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBydWxlLnByb3BlcnRpZXNbZC5rZXldID0gdmFsdWUKICAgIHJldHVybiBydWxlCgoKZGVmIF9vbmVfbGluZV90b193aW5kb3dfcnVsZShhcmdzOiBMaXN0W3N0cl0sIGxpbmU6IGludCkgLT4gV2luZG93UnVsZToKICAgIHJ1bGUgPSBXaW5kb3dSdWxlKGxpbmU9bGluZSkKICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHJldHVybiBydWxlCiAgICBydWxlX3NwZWMsICpzZWxlY3RvcnMgPSBhcmdzCiAgICBpZiAiICIgaW4gcnVsZV9zcGVjOgogICAgICAgIHByb3AsIHZhbCA9IHJ1bGVfc3BlYy5zcGxpdCgiICIsIDEpCiAgICAgICAgcnVsZS5wcm9wZXJ0aWVzW3Byb3BdID0gdmFsCiAgICBlbGlmIHJ1bGVfc3BlYzoKICAgICAgICBydWxlLnByb3BlcnRpZXNbcnVsZV9zcGVjXSA9ICJ0cnVlIgogICAgZm9yIHNlbCBpbiBzZWxlY3RvcnM6CiAgICAgICAgaWYgIjoiIGluIHNlbDoKICAgICAgICAgICAgaywgdiA9IHNlbC5zcGxpdCgiOiIsIDEpCiAgICAgICAgICAgIHJ1bGUubWF0Y2hba10gPSB2CiAgICByZXR1cm4gcnVsZQoKCmRlZiBwYXJzZShzb3VyY2U6IHN0cikgLT4gSHlwcmxhbmdGaWxlOgogICAgcmV0dXJuIF9QYXJzZXIodG9rZW5pemUoc291cmNlKSkucGFyc2UoKQoKCmRlZiBwYXJzZV9maWxlKHBhdGgpIC0+IEh5cHJsYW5nRmlsZToKICAgIHdpdGggb3BlbihwYXRoLCAiciIpIGFzIGY6CiAgICAgICAgcmV0dXJuIHBhcnNlKGYucmVhZCgpKQo=", "hyprvalidate/luaast/reader.py": "IiIiUGFyc2UgYW4gZXhpc3RpbmcgTHVhIGNvbmZpZyBmaWxlIGludG8gYW4gQVNULCBhbmQgcHJvdmlkZSB0aGUgdHdvCnNjaGVtYS1hZ25vc3RpYyB1dGlsaXRpZXMgdGhlIHNjaGVtYS1kcml2ZW4gY2hlY2tlciAoYSBzZXBhcmF0ZSBjb21wb25lbnQpCm5lZWRzIHRvIHdhbGsgaXQ6IHJlc29sdmluZyBhIGRvdHRlZC1tZW1iZXItYWNjZXNzIGNoYWluIHRvIGEgcGxhaW4gc3RyaW5nCihlLmcuIGBobC5kc3Aud2luZG93LmNsb3NlYCBmcm9tIGEgTmFtZS9JbmRleCBjaGFpbiksIGFuZCByZXNvbHZpbmcgYSBMdWEKbGl0ZXJhbCBleHByZXNzaW9uIHRvIGEgcGxhaW4gUHl0aG9uIHZhbHVlICsgdHlwZS1raW5kLgoKRGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGtub3cgYWJvdXQgdGhlIHNjaGVtYSwgYW5kIGRvZXMgbm90IGRlY2lkZSB3aGF0J3MKdmFsaWQg4oCUIHRoYXQncyB0aGUgY2hlY2tlcidzIGpvYi4gVGhpcyBtb2R1bGUgb25seSBhbnN3ZXJzICJ3aGF0IGRvZXMgdGhpcwpwaWVjZSBvZiBzeW50YXggc2F5Iiwgbm90ICJpcyB0aGF0IGFsbG93ZWQiLgoKQnVpbHQgb24gYGx1YXBhcnNlcmAgKE1JVCwgQU5UTFItZ2VuZXJhdGVkIEx1YSBncmFtbWFyKSByYXRoZXIgdGhhbiBhCmhhbmQtcm9sbGVkIHBhcnNlciAtIHZlcmlmaWVkIGFnYWluc3QgdGhpcyBwcm9qZWN0J3Mgb3duIHJlYWwgY29uZmlnCihoeXBybGFuZC1sdWEva2V5YmluZHMubHVhOiAxMDEgQ2FsbC9NZXRob2Qgbm9kZXMsIGxhbWJkYS1ib2RpZWQgYmluZHMsCmEgRm9ybnVtIGxvb3ApIGJlZm9yZSBhZG9wdGluZyBpdC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmZyb20gbHVhcGFyc2VyIGltcG9ydCBhc3QgYXMgX2x1YWFzdApmcm9tIGx1YXBhcnNlci5hc3Rub2RlcyBpbXBvcnQgKAogICAgQ2h1bmssCiAgICBOb2RlLAogICAgTmFtZSwKICAgIEluZGV4LAogICAgU3RyaW5nLAogICAgTnVtYmVyLAogICAgVHJ1ZUV4cHIsCiAgICBGYWxzZUV4cHIsCiAgICBOaWwsCikKCgpjbGFzcyBMdWFTeW50YXhFcnJvcihFeGNlcHRpb24pOgogICAgIiIiUmFpc2VkIHdoZW4gdGhlIGlucHV0IGlzbid0IHZhbGlkIEx1YSBhdCBhbGwuIiIiCgoKZGVmIHBhcnNlKHNvdXJjZTogc3RyKSAtPiBDaHVuazoKICAgIHRyeToKICAgICAgICByZXR1cm4gX2x1YWFzdC5wYXJzZShzb3VyY2UpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzogICMgbHVhcGFyc2VyIHJhaXNlcyBpdHMgb3duIEFOVExSLXdyYXBwZWQgZXJyb3JzCiAgICAgICAgcmFpc2UgTHVhU3ludGF4RXJyb3Ioc3RyKGV4YykpIGZyb20gZXhjCgoKZGVmIHBhcnNlX2ZpbGUocGF0aDogc3RyIHwgUGF0aCkgLT4gQ2h1bms6CiAgICByZXR1cm4gcGFyc2UoUGF0aChwYXRoKS5yZWFkX3RleHQoKSkKCgpkZWYgcmVzb2x2ZV9kb3R0ZWRfbmFtZShleHByOiBOb2RlIHwgTm9uZSkgLT4gc3RyIHwgTm9uZToKICAgICIiIlR1cm4gYSBOYW1lL0luZGV4IGNoYWluIGludG8gYSBkb3R0ZWQgc3RyaW5nLCBlLmcuIHRoZSBBU1QgZm9yCiAgICBgaGwuZHNwLndpbmRvdy5jbG9zZWAgLT4gImhsLmRzcC53aW5kb3cuY2xvc2UiLiBSZXR1cm5zIE5vbmUgZm9yCiAgICBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGxhaW4gZG90dGVkLWFjY2VzcyBjaGFpbiAoZS5nLiBgdFtpXWAgd2l0aCBhCiAgICBub24tTmFtZSBpbmRleCwgYSBjYWxsLCBhIGxpdGVyYWwpLgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIE5hbWUpOgogICAgICAgIHJldHVybiBleHByLmlkCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIEluZGV4KToKICAgICAgICBiYXNlID0gcmVzb2x2ZV9kb3R0ZWRfbmFtZShleHByLnZhbHVlKQogICAgICAgIGlmIGJhc2UgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBpc2luc3RhbmNlKGV4cHIuaWR4LCBOYW1lKToKICAgICAgICAgICAgcmV0dXJuIGYie2Jhc2V9LntleHByLmlkeC5pZH0iCiAgICAgICAgaWYgaXNpbnN0YW5jZShleHByLmlkeCwgU3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGYie2Jhc2V9LntleHByLmlkeC5zLmRlY29kZSgpIGlmIGlzaW5zdGFuY2UoZXhwci5pZHgucywgYnl0ZXMpIGVsc2UgZXhwci5pZHguc30iCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBOb25lCgoKQGRhdGFjbGFzcwpjbGFzcyBMaXRlcmFsVmFsdWU6CiAgICB2YWx1ZTogQW55CiAgICBraW5kOiBzdHIgICMgInN0cmluZyIgfCAibnVtYmVyIiB8ICJib29sZWFuIiB8ICJuaWwiCgoKZGVmIHJlc29sdmVfbGl0ZXJhbChleHByOiBOb2RlIHwgTm9uZSkgLT4gTGl0ZXJhbFZhbHVlIHwgTm9uZToKICAgICIiIlJlc29sdmUgYSBzY2FsYXIgTHVhIGxpdGVyYWwgZXhwcmVzc2lvbiB0byBhIHBsYWluIFB5dGhvbiB2YWx1ZS4KICAgIFJldHVybnMgTm9uZSBmb3IgYW55dGhpbmcgdGhhdCBpc24ndCBhIHNjYWxhciBsaXRlcmFsICh0YWJsZXMsIGNhbGxzLAogICAgdmFyaWFibGUgcmVmZXJlbmNlcywgY29uY2F0ZW5hdGlvbiBleHByZXNzaW9ucywgZXRjKSAtIHRob3NlIG5lZWQKICAgIHNjaGVtYS1hd2FyZSBoYW5kbGluZyB0aGUgY2hlY2tlciBkb2VzLCBub3QgdGhpcyBtb2R1bGUuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZXhwciwgU3RyaW5nKToKICAgICAgICBzID0gZXhwci5zCiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShzLmRlY29kZSgpIGlmIGlzaW5zdGFuY2UocywgYnl0ZXMpIGVsc2UgcywgInN0cmluZyIpCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIE51bWJlcik6CiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShleHByLm4sICJudW1iZXIiKQogICAgaWYgaXNpbnN0YW5jZShleHByLCBUcnVlRXhwcik6CiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShUcnVlLCAiYm9vbGVhbiIpCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIEZhbHNlRXhwcik6CiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShGYWxzZSwgImJvb2xlYW4iKQogICAgaWYgaXNpbnN0YW5jZShleHByLCBOaWwpOgogICAgICAgIHJldHVybiBMaXRlcmFsVmFsdWUoTm9uZSwgIm5pbCIpCiAgICByZXR1cm4gTm9uZQoKCmRlZiB3YWxrKHRyZWU6IE5vZGUpOgogICAgIiIiUmUtZXhwb3J0ZWQgZm9yIGNhbGxlcnMgdGhhdCBqdXN0IG5lZWQgdG8gaXRlcmF0ZSBldmVyeSBub2RlIC0KICAgIHRoaW4gcGFzc3Rocm91Z2ggc28gY2FsbGVycyBvbmx5IGltcG9ydCBmcm9tIHRoaXMgbW9kdWxlLCBub3QKICAgIGx1YXBhcnNlciBkaXJlY3RseS4iIiIKICAgIHJldHVybiBfbHVhYXN0LndhbGsodHJlZSkK", "hyprvalidate/luaast/writer.py": "IiIiTHVhIEFTVCBidWlsZGVyIGhlbHBlcnMuCgpgbHVhcGFyc2VyYCB3cml0ZXMgTHVhIHRvbyAoYGFzdC50b19sdWFfc291cmNlYCksIHNvIHRoaXMgZG9lc24ndCBuZWVkIGEKY3VzdG9tIEx1YSBBU1QgLSBpdCdzIGEgdGhpbiBsYXllciBvdmVyIGBsdWFwYXJzZXIuYXN0bm9kZXNgIHRoYXQgZ2V0cyBvbmUKZm9vdGd1biByaWdodCBpbiBvbmUgcGxhY2UgaW5zdGVhZCBvZiBhdCBldmVyeSBjYWxsIHNpdGU6IGBhc3Rub2Rlcy5TdHJpbmdgCnRha2VzIGJvdGggYSBgc3RyYCB2YWx1ZSBhbmQgYW4gYWxyZWFkeS1MdWEtcXVvdGVkIGByYXdgIGZpZWxkLCBhbmQgZ2V0dGluZwpgcmF3YCB3cm9uZyAoZS5nLiBwYXNzaW5nIHRoZSBiYXJlIFB5dGhvbiBzdHJpbmcpIG1ha2VzIHRoZSBvdXRwdXQKcm91bmQtdHJpcCBpbmNvcnJlY3RseS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCByZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBJdGVyYWJsZSwgTGlzdCwgVHVwbGUsIFVuaW9uCgpmcm9tIGx1YXBhcnNlciBpbXBvcnQgYXN0IGFzIGx1YWFzdApmcm9tIGx1YXBhcnNlci5hc3Rub2RlcyBpbXBvcnQgKAogICAgQW5vbnltb3VzRnVuY3Rpb24sCiAgICBDYWxsLAogICAgQ2h1bmssCiAgICBCbG9jaywKICAgIEZpZWxkLAogICAgRmFsc2VFeHByLAogICAgSW5kZXgsCiAgICBJbmRleE5vdGF0aW9uLAogICAgTmFtZSwKICAgIE5pbCwKICAgIE5vZGUsCiAgICBOdW1iZXIsCiAgICBTdHJpbmcsCiAgICBTdHJpbmdEZWxpbWl0ZXIsCiAgICBUYWJsZSwKICAgIFRydWVFeHByLAopCgoKZGVmIGx1YXN0cihzOiBzdHIpIC0+IFN0cmluZzoKICAgICIiImByYXdgIGlzIHRoZSBlc2NhcGVkICpjb250ZW50cyogb25seSAtIHRoZSBwcmludGVyIChMdWFPdXRwdXRWaXNpdG9yLAogICAgY29uZmlybWVkIGJ5IHJlYWRpbmcgbHVhcGFyc2VyL3ByaW50ZXJzLnB5KSB3cmFwcyBpdCBpbiB0aGUgZGVsaW1pdGVyJ3MKICAgIHF1b3RlIGNoYXJhY3RlcnMgaXRzZWxmLiBQYXNzaW5nIGFuIGFscmVhZHktcXVvdGVkIGByYXdgIGRvdWJsZS1xdW90ZXMKICAgIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiByb3VuZC10cmlwcGluZy4iIiIKICAgIGVzY2FwZWQgPSBzLnJlcGxhY2UoIlxcIiwgIlxcXFwiKS5yZXBsYWNlKCciJywgJ1xcIicpCiAgICByZXR1cm4gU3RyaW5nKHM9cy5lbmNvZGUoInV0Zi04IiksIHJhdz1lc2NhcGVkLCBkZWxpbWl0ZXI9U3RyaW5nRGVsaW1pdGVyLkRPVUJMRV9RVU9URSkKCgpkZWYgbHVhbnVtKG4pIC0+IE51bWJlcjoKICAgIHJldHVybiBOdW1iZXIobikKCgpkZWYgbHVhYm9vbChiOiBib29sKToKICAgIHJldHVybiBUcnVlRXhwcigpIGlmIGIgZWxzZSBGYWxzZUV4cHIoKQoKCmRlZiBsdWFuYW1lKG5hbWU6IHN0cikgLT4gTmFtZToKICAgIHJldHVybiBOYW1lKGlkZW50aWZpZXI9bmFtZSkKCgpkZWYgbWVtYmVyKCpwYXJ0czogc3RyKSAtPiBOb2RlOgogICAgIiIiQnVpbGQgYSBkb3R0ZWQgbWVtYmVyLWFjY2VzcyBjaGFpbjogbWVtYmVyKCJobCIsICJkc3AiLCAid2luZG93IiwgImNsb3NlIikKICAgIC0+IHRoZSBBU1QgZm9yIGBobC5kc3Aud2luZG93LmNsb3NlYC4iIiIKICAgIGlmIG5vdCBwYXJ0czoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtZW1iZXIoKSBuZWVkcyBhdCBsZWFzdCBvbmUgcGFydCIpCiAgICBub2RlOiBOb2RlID0gbHVhbmFtZShwYXJ0c1swXSkKICAgIGZvciBwYXJ0IGluIHBhcnRzWzE6XToKICAgICAgICBub2RlID0gSW5kZXgoaWR4PWx1YW5hbWUocGFydCksIHZhbHVlPW5vZGUsIG5vdGF0aW9uPUluZGV4Tm90YXRpb24uRE9UKQogICAgcmV0dXJuIG5vZGUKCgpkZWYgX3RvX2V4cHIodmFsdWU6IEFueSkgLT4gTm9kZToKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIE5vZGUpOgogICAgICAgIHJldHVybiB2YWx1ZQogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CiAgICAgICAgcmV0dXJuIGx1YWJvb2wodmFsdWUpCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgogICAgICAgIHJldHVybiBsdWFzdHIodmFsdWUpCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBmbG9hdCkpOgogICAgICAgIHJldHVybiBsdWFudW0odmFsdWUpCiAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOaWwoKQogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgcmV0dXJuIGx1YXRhYmxlKHZhbHVlKQogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgcmV0dXJuIGx1YXRhYmxlKHZhbHVlKQogICAgcmFpc2UgVHlwZUVycm9yKGYiZG9uJ3Qga25vdyBob3cgdG8gYnVpbGQgYSBMdWEgZXhwcmVzc2lvbiBmcm9tIHt0eXBlKHZhbHVlKSFyfSIpCgoKX1ZBTElEX0lERU5USUZJRVIgPSByZS5jb21waWxlKHIiXltBLVphLXpfXVtBLVphLXowLTlfXSokIikKCgpkZWYgX2ZpZWxkX2Zvcl9rZXkoa2V5OiBzdHIsIHZhbHVlOiBOb2RlKSAtPiBGaWVsZDoKICAgICIiIkEgTHVhIHRhYmxlIGtleSB0aGF0IGlzbid0IGEgdmFsaWQgYmFyZSBpZGVudGlmaWVyIChjb250YWlucyBhIGRvdCwKICAgIGh5cGhlbiwgZXRjIC0gcmVhbCBoeXBybGFuZyBrZXlzIGxpa2UgYGNvbC5hY3RpdmVfYm9yZGVyYCBkbykgbXVzdCBiZQogICAgd3JpdHRlbiBhcyBhIGJyYWNrZXRlZCBzdHJpbmcga2V5IChgWyJjb2wuYWN0aXZlX2JvcmRlciJdID0gLi4uYCksIG5vdAogICAgYSBiYXJlIE5hbWUgLSBmb3VuZCBieSBhY3R1YWxseSBydW5uaW5nIHRoZSBjb252ZXJ0ZXIgYWdhaW5zdCB0aGUgcmVhbAogICAgY29uZmlnLCBub3QgYW50aWNpcGF0ZWQgdXAgZnJvbnQuIiIiCiAgICBpZiBfVkFMSURfSURFTlRJRklFUi5tYXRjaChrZXkpOgogICAgICAgIHJldHVybiBGaWVsZChrZXk9bHVhbmFtZShrZXkpLCB2YWx1ZT12YWx1ZSkKICAgIHJldHVybiBGaWVsZChrZXk9bHVhc3RyKGtleSksIHZhbHVlPXZhbHVlLCBiZXR3ZWVuX2JyYWNrZXRzPVRydWUpCgoKZGVmIGx1YXRhYmxlKGl0ZW1zOiBVbmlvbltEaWN0W3N0ciwgQW55XSwgSXRlcmFibGVbQW55XSwgSXRlcmFibGVbVHVwbGVbc3RyLCBBbnldXV0pIC0+IFRhYmxlOgogICAgIiIiQnVpbGQgYSBMdWEgdGFibGUuIEEgZGljdCAob3IgYW4gaXRlcmFibGUgb2YgKGtleSwgdmFsdWUpIHBhaXJzKQogICAgYmVjb21lcyBhIHJlY29yZC1zdHlsZSB0YWJsZSBgeyBrZXkgPSB2YWx1ZSwgLi4uIH1gOyBhbnkgb3RoZXIKICAgIGl0ZXJhYmxlIGJlY29tZXMgYW4gYXJyYXktc3R5bGUgdGFibGUgYHsgdmFsdWUsIHZhbHVlLCAuLi4gfWAuIiIiCiAgICBmaWVsZHM6IExpc3RbRmllbGRdID0gW10KICAgIGlmIGlzaW5zdGFuY2UoaXRlbXMsIGRpY3QpOgogICAgICAgIHBhaXJzID0gaXRlbXMuaXRlbXMoKQogICAgZWxzZToKICAgICAgICBpdGVtcyA9IGxpc3QoaXRlbXMpCiAgICAgICAgaWYgaXRlbXMgYW5kIGlzaW5zdGFuY2UoaXRlbXNbMF0sIHR1cGxlKSBhbmQgbGVuKGl0ZW1zWzBdKSA9PSAyOgogICAgICAgICAgICBwYWlycyA9IGl0ZW1zCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFpcnMgPSBOb25lCgogICAgaWYgcGFpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gcGFpcnM6CiAgICAgICAgICAgIGZpZWxkcy5hcHBlbmQoX2ZpZWxkX2Zvcl9rZXkoa2V5LCBfdG9fZXhwcih2YWx1ZSkpKQogICAgZWxzZToKICAgICAgICBmb3IgdmFsdWUgaW4gaXRlbXM6CiAgICAgICAgICAgIGZpZWxkcy5hcHBlbmQoRmllbGQoa2V5PU5vbmUsIHZhbHVlPV90b19leHByKHZhbHVlKSkpCgogICAgcmV0dXJuIFRhYmxlKGZpZWxkcz1maWVsZHMpCgoKZGVmIGFub25fZnVuY3Rpb24oc3RhdGVtZW50czogTGlzdFtOb2RlXSkgLT4gQW5vbnltb3VzRnVuY3Rpb246CiAgICByZXR1cm4gQW5vbnltb3VzRnVuY3Rpb24oYXJncz1bXSwgYm9keT1CbG9jayhib2R5PXN0YXRlbWVudHMpKQoKCmRlZiBobGNhbGwoZG90dGVkX25hbWU6IHN0ciwgKmFyZ3M6IEFueSkgLT4gQ2FsbDoKICAgICIiIkJ1aWxkIGEgY2FsbCB0byBhIGRvdHRlZCBobC4qIGZ1bmN0aW9uOiBobGNhbGwoImhsLm1vbml0b3IiLCB7Li4ufSkuIiIiCiAgICBmdW5jID0gbWVtYmVyKCpkb3R0ZWRfbmFtZS5zcGxpdCgiLiIpKQogICAgcmV0dXJuIENhbGwoZnVuYz1mdW5jLCBhcmdzPVtfdG9fZXhwcihhKSBmb3IgYSBpbiBhcmdzXSkKCgpkZWYgY2h1bmsoc3RhdGVtZW50czogTGlzdFtOb2RlXSkgLT4gQ2h1bms6CiAgICByZXR1cm4gQ2h1bmsoYm9keT1CbG9jayhib2R5PXN0YXRlbWVudHMpKQoKCmRlZiB0b19zb3VyY2Uocm9vdDogTm9kZSkgLT4gc3RyOgogICAgcmV0dXJuIGx1YWFzdC50b19sdWFfc291cmNlKHJvb3QpCg==", "hyprvalidate/checker.py": "IiIiVGhlIGFjdHVhbCBWYWxpZGF0b3IgbG9naWMuIFdhbGtzIGEgcGFyc2VkIEx1YSBmaWxlICh2aWEKaHlwcnZhbGlkYXRlLmx1YWFzdC5yZWFkZXIpIGFuZCBjcm9zcy1yZWZlcmVuY2VzIGV2ZXJ5IGBobC4qYCBzeW1ib2wKcmVmZXJlbmNlIGFuZCBldmVyeSBgaGwuY29uZmlnKHsuLi59KWAga2V5L3ZhbHVlIGFnYWluc3QgdGhlIHNjaGVtYSAodmlhCmh5cHJ2YWxpZGF0ZS5zY2hlbWEuZXh0cmFjdG9yKSDigJQgdGhlIG9uZSB0aGluZyBub25lIG9mIHRoZSBmb3VyIGV4aXN0aW5nCmh5cHJsYW5nLT5sdWEgY29udmVydGVycyBkbyAoc2VlIGRvY3MvQ09NUEFSSVNPTi5tZCkuCgpTY29wZSwgc3RhdGVkIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gbGVmdCBpbXBsaWNpdDoKICAtIFN5bWJvbCByZXNvbHV0aW9uIHdhbGtzIEhMLkFQSSAtPiBuYW1lc3BhY2UgY2xhc3NlcyAtPiBsZWFmIGBmdW4oLi4uKWAKICAgIGZpZWxkcy4gQW55dGhpbmcgdW5kZXIgYGhsLnBsdWdpbi4qYCBiZXlvbmQgdGhlIG9uZSBkb2N1bWVudGVkIGBsb2FkYAogICAgZmllbGQgaXMgYWNjZXB0ZWQgdW5jb25kaXRpb25hbGx5IC0gSEwuUGx1Z2luTmFtZXNwYWNlIGhhcyBhIGR5bmFtaWMKICAgIGBbc3RyaW5nXSBhbnlgIGluZGV4IHNpZ25hdHVyZSBmb3IgcGx1Z2luLXJlZ2lzdGVyZWQgbWVtYmVycyAoZS5nLgogICAgYGhsLnBsdWdpbi5keW5hbWljX2N1cnNvcnNgKSB0aGF0IGlzbid0IGxpdGVyYWwgZGF0YSB0aGUgZXh0cmFjdG9yIGNhbgogICAgZW51bWVyYXRlLiBTZWUgZXh0cmFjdG9yLnB5J3MgYnJhY2tldC1maWVsZCByZWdleC4KICAtIENvbmZpZy1rZXkvdmFsdWUgY2hlY2tpbmcgb25seSB2YWxpZGF0ZXMgKnNjYWxhciogdmFsdWVzIChzdHJpbmcvCiAgICBudW1iZXIvYm9vbGVhbi9uaWwpIGFnYWluc3QgdGhlIHNjaGVtYSdzIHR5cGUgZXhwcmVzc2lvbi4gQSBrZXkgd2hvc2UKICAgIHNjaGVtYSB0eXBlIGluY2x1ZGVzIGEgdGFibGUtc2hhcGVkIGFsdGVybmF0aXZlIChjb250YWlucyAieyIgb3IgbmFtZXMKICAgIGFuICJITC4iIGNsYXNzLCBlLmcuIGBzdHJpbmd8SEwuR3JhZGllbnRgKSBpcyBhY2NlcHRlZCB3aXRob3V0CiAgICBzdHJ1Y3R1cmFsbHkgY2hlY2tpbmcgdGhlIHRhYmxlJ3Mgb3duIGZpZWxkcyAtIHRoYXQgd291bGQgcmVxdWlyZQogICAgbW9kZWxsaW5nIGV2ZXJ5IHN1Y2ggY2xhc3MncyBzaGFwZSwgd2hpY2ggaXMgcmVhbCB3b3JrIHNhdmVkIGZvciBhCiAgICBsYXRlciBwYXNzIGlmIGl0IHR1cm5zIG91dCB0byBtYXR0ZXIuIERvY3VtZW50ZWQsIG5vdCBzaWxlbnQuCiAgLSBBIGNvbmZpZyB2YWx1ZSB0aGF0J3MgYSB2YXJpYWJsZSByZWZlcmVuY2UsIGZ1bmN0aW9uIGNhbGwsIG9yIGFueXRoaW5nCiAgICBlbHNlIHRoYXQgaXNuJ3QgYSBsaXRlcmFsIG9yIGEgdGFibGUgY29uc3RydWN0b3IgaXMgYWNjZXB0ZWQgd2l0aG91dAogICAgY29tbWVudCAtIGl0IGNhbid0IGJlIGNoZWNrZWQgd2l0aG91dCBldmFsdWF0aW5nIHRoZSBzY3JpcHQuCiAgLSBDYWxsLXNoYXBlIChhcml0eSkgY2hlY2tpbmcgb25seSBhcHBsaWVzIHRvIHN5bWJvbHMgd2hvc2Ugc3R1YiB0eXBlIGlzCiAgICBhICpuYW1lZCogc2lnbmF0dXJlIChlLmcuIGBobC5tb25pdG9yYCBpcyBgZnVuKHNwZWM6IEhMLk1vbml0b3JTcGVjKToKICAgIG5pbGApIC0gYXJndW1lbnQgY291bnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHJlcXVpcmVkL29wdGlvbmFsIHBhcmFtcy4KICAgIE1hbnkgc3R1YiBmdW5jdGlvbnMgYXJlIHR5cGVkIGBmdW4oLi4uKTogWGAgd2l0aCBubyBuYW1lZCBwYXJhbXMgYXQKICAgIGFsbCAodGhlIGRzcC4qIGRpc3BhdGNoZXIgYnVpbGRlcnMsIGBlbnZgLCBgY3VydmVgLCBgYW5pbWF0aW9uYCwgZXRjKSAtCiAgICB0aG9zZSBhcmUgbmV2ZXIgYXJpdHktY2hlY2tlZCwgaG9uZXN0bHksIGJlY2F1c2UgdGhlcmUncyBub3RoaW5nIGluCiAgICB0aGUgc3R1YiB0byBjaGVjayB0aGVtIGFnYWluc3QuIEFyZ3VtZW50ICp0eXBlKiBjaGVja2luZyAoaXMgYXJnIDEKICAgIGFjdHVhbGx5IGEgc3RyaW5nKSBpcyBub3QgYXR0ZW1wdGVkIC0gY291bnQgb25seS4gRm91bmQgdmlhIGEgcmVhbAogICAgZXhhbXBsZTogYGhsLm1vbml0b3IobmlsLCB7Li4ufSlgIGluIGEgR1BULWZhYnJpY2F0ZWQgdGVzdCBjb25maWcKICAgIHJlc29sdmVzIGFzIGEgdmFsaWQgc3ltYm9sIChpdCBpcykgYnV0IGNhbGxzIGl0IHdpdGggMiBhcmdzIGFnYWluc3QgYQogICAgMS1yZXF1aXJlZC1wYXJhbSBzaWduYXR1cmUgLSBleGFjdGx5IHdoYXQgdGhpcyBjbG9zZXMuCiAgLSBTcGVjLXRhYmxlIGZpZWxkIGNoZWNraW5nOiBhbnkgY2FsbCB3aG9zZSBwYXJhbWV0ZXIgaXMgdHlwZWQgYXMgYQogICAgc3BlY2lmaWMgc2NoZW1hIGNsYXNzIChgaGwubW9uaXRvcmAncyBgc3BlYzogSEwuTW9uaXRvclNwZWNgLAogICAgYGhsLmRldmljZWAncyBgSEwuRGV2aWNlU3BlY2AsIGBobC5nZXN0dXJlYCdzIGBITC5HZXN0dXJlU3BlY2AsCiAgICBgaGwuYmluZGAncyBgb3B0cz86IEhMLkJpbmRPcHRpb25zYCwgYGhsLndpbmRvd19ydWxlYCdzCiAgICBgSEwuV2luZG93UnVsZVNwZWNgLCBgaGwucGVybWlzc2lvbmAncyBgSEwuUGVybWlzc2lvblNwZWNgKSBoYXMgdGhhdAogICAgdGFibGUncyBrZXlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgY2xhc3MncyBhY3R1YWwgZmllbGRzLCByZWN1cnNpbmcgd2hlbgogICAgYSBmaWVsZCdzIG93biB0eXBlIGlzIGl0c2VsZiBhIGNsYXNzLiBGb3VuZCB2aWEgcmUtZXhhbWluaW5nIHJlYWwgdGVzdAogICAgZXZpZGVuY2U6IGBobC5tb25pdG9yKHtyZXNvbHV0aW9uID0gInByZWZlcnJlZCIsIC4uLn0pYCBwYXNzZXMgd2l0aAogICAgemVybyBmaW5kaW5ncyBldmVuIGFmdGVyIGFyaXR5IGNoZWNraW5nLCBiZWNhdXNlIGByZXNvbHV0aW9uYCBpc24ndCBhCiAgICByZWFsIGBITC5Nb25pdG9yU3BlY2AgZmllbGQgKHRoZSByZWFsIG9uZSBpcyBgbW9kZWApIGFuZCBub3RoaW5nCiAgICBjaGVja2VkIHNwZWMtdGFibGUgKmNvbnRlbnRzKiBiZWZvcmUgdGhpcy4KICAgIERlbGliZXJhdGVseSBleGNsdWRlcyBgaGwuY29uZmlnYCAtIGl0cyBvd24gcGFyYW0gdHlwZSAoYEhMLkNvbmZpZ09wdGApCiAgICBpcyBhICpwYXJhbGxlbCosIGRpZmZlcmVudGx5LXNoYXBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtZSBkYXRhIChhCiAgICBuZXN0ZWQgY2xhc3MgaGllcmFyY2h5IHZzLiBgY29uZmlnX3ZhbHVlX3R5cGVzYCdzIGZsYXR0ZW5lZCBkb3R0ZWQKICAgIG1hcCAtIHZlcmlmaWVkIHRoZXkncmUgbm90IDE6MSwgZS5nLiBgZ2VuZXJhbC5jb2xgIG5lc3RzIGFzIGl0cyBvd24KICAgIHN1Yi1jbGFzcyBpbiBvbmUgYnV0IG5vdCB0aGUgb3RoZXIpIC0gdW5pZnlpbmcgdGhlbSB3b3VsZCBtZWFuCiAgICByZS12ZXJpZnlpbmcgZXZlcnkgY29uZmlnIHNlY3Rpb24gYWdhaW5zdCBhIGhpZXJhcmNoeSB0aGF0IGhhc24ndCBiZWVuCiAgICBjaGVja2VkIHlldCwgZm9yIG5vIGZvdW5kIGJlbmVmaXQuIGBobC5jb25maWdgIGtlZXBzIHVzaW5nIGl0cyBhbHJlYWR5CiAgICAtdGVzdGVkIHBhdGg7IHRoaXMgaXMgYSBzZWNvbmQsIG5hcnJvd2VyIG1lY2hhbmlzbSBmb3IgZXZlcnl0aGluZyBlbHNlLgogICAgQWxzbyBleGNsdWRlcyBgaGwud2luZG93X3J1bGVgIHNwZWNpZmljYWxseSAtIGZvdW5kIGJ5IHRoaXMgbW9kdWxlJ3Mgb3duCiAgICB0ZXN0IHN1aXRlIGZsb29kaW5nIGZhbHNlIHBvc2l0aXZlcyBhZ2FpbnN0IHRoZSByZWFsIGNvbmZpZzoKICAgIGBITC5XaW5kb3dSdWxlU3BlY2Agb25seSB0eXBlcyAzIHVuaXZlcnNhbCBmaWVsZHMgKGVuYWJsZWQvbWF0Y2gvbmFtZSksCiAgICB1bmxpa2UgaXRzIHNpYmxpbmdzIGBITC5MYXllclJ1bGVTcGVjYCAoMTMgZmllbGRzKSBhbmQKICAgIGBITC5Xb3Jrc3BhY2VSdWxlU3BlY2AgKDE3IGZpZWxkcykgd2hpY2ggYXJlIGZ1bGx5IHR5cGVkIGFuZCBETyBnZXQKICAgIGNoZWNrZWQuIFBlci1ydWxlLXR5cGUgd2luZG93IGZpZWxkcyAobW92ZS9mbG9hdC93b3Jrc3BhY2UvCiAgICBzdXBwcmVzc19ldmVudC9ub19mb2N1cykgYXJlIGR5bmFtaWNhbGx5IGRpc3BhdGNoZWQgYW5kIGRlbGliZXJhdGVseQogICAgYWJzZW50IGZyb20gdGhlIHN0dWIgLSB0aGUgc2FtZSBmYWN0IG5vdGVkIGFib3ZlIGFib3V0IGBobC5wbHVnaW4uKmAsCiAgICByZWRpc2NvdmVyZWQgaGVyZSBmb3Igd2luZG93IHJ1bGVzIHNwZWNpZmljYWxseS4KICAtIFVuY2FsbGVkLWRpc3BhdGNoZXItZmFjdG9yeSBjaGVja2luZzogYW55IGNhbGwgYXJndW1lbnQgd2hvc2UgZGVjbGFyZWQKICAgIHBhcmFtIHR5cGUgaW5jbHVkZXMgYEhMLkRpc3BhdGNoZXJgIChjdXJyZW50bHkgYGhsLmJpbmRgJ3MgYGRpc3BhdGNoZXJgCiAgICBwYXJhbSBhbmQgYGhsLmRpc3BhdGNoYCdzIHNpbmdsZSBwYXJhbSAtIGZvdW5kIGdlbmVyaWNhbGx5IGJ5IHNjYW5uaW5nCiAgICB0aGUgc2NoZW1hLCBub3QgaGFyZGNvZGVkIHRvIHRob3NlIHR3byBuYW1lcykgaXMgY2hlY2tlZCBmb3IgYmVpbmcgYQogICAgYmFyZSBgaGwuZHNwLipgLXN0eWxlIHN5bWJvbCByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYW4gYWN0dWFsIGNhbGwsIGUuZy4KICAgIGBobC5iaW5kKCJTVVBFUiArIFEiLCBobC5kc3Aud2luZG93LmNsb3NlKWAgKG1pc3NpbmcgdGhlIHRyYWlsaW5nCiAgICBgKClgKS4gVGhpcyBpcyBleGFjdGx5IHRoZSBjbGFzcyBvZiBidWcgSHlwcmxhbmQncyBvd24gaXNzdWUgIzE1ODcxCiAgICAoIkltcHJvdmUgbHVhIGVycm9yIHJlcG9ydGluZyIpIGNhbGxzIG91dCAtIGEgZmFjdG9yeSByZWZlcmVuY2UgcGFzc2VkCiAgICB3aGVyZSBpdHMgKnJlc3VsdCogd2FzIG1lYW50LCB3aGljaCB0eXBlLWNoZWNrcyB1bmRlciB0aGUgc3R1YidzCiAgICBgSEwuRGlzcGF0Y2hlcnxmdW5jdGlvbmAgdW5pb24gKGEgYmFyZSBmdW5jdGlvbiByZWZlcmVuY2UgSVMgYQogICAgYGZ1bmN0aW9uYCkgc28gbm90aGluZyBlbHNlIGhlcmUgY2F0Y2hlcyBpdC4gRGV0ZWN0ZWQgYnkgbm90aWNpbmcgdGhlCiAgICBhcmd1bWVudCByZXNvbHZlcyAodmlhIGByZXNvbHZlX3N5bWJvbGApIHRvIGEgZnVuY3Rpb24gaXRzZWxmLCByYXRoZXIKICAgIHRoYW4gdG8gYSBwbGFpbiB2YWx1ZSBvciBhIGdlbnVpbmUgY2FsbC9sYW1iZGEuCiAgLSBEdXBsaWNhdGUtYmluZCBjaGVja2luZzogZXZlcnkgYGhsLmJpbmQoa2V5cywgLi4uKWAgY2FsbCdzIGBrZXlzYAogICAgYXJndW1lbnQgaXMgcmVzb2x2ZWQgLSBpZiBpdCdzIGEgcGxhaW4gc3RyaW5nIGxpdGVyYWwsIG9yIGEKICAgIGNvbmNhdGVuYXRpb24gb2Ygb25seSBzdHJpbmcgbGl0ZXJhbHMgKGUuZy4gYCJTVVBFUiIgLi4gIiArIFEiYCkgLSBhbmQKICAgIGdyb3VwZWQ7IG1vcmUgdGhhbiBvbmUgYmluZCByZXNvbHZpbmcgdG8gdGhlIGlkZW50aWNhbCBrZXkgY29tYm8gaXMKICAgIGZsYWdnZWQuIEFsc28gZGlyZWN0bHkgZnJvbSAjMTU4NzEgKCJyZXBlYXRpbmcga2V5cyBpbiBhIGJpbmQiKS4KICAgIERlbGliZXJhdGVseSBuYXJyb3c6IGEgYGtleXNgIGV4cHJlc3Npb24gYnVpbHQgZnJvbSBhIHZhcmlhYmxlICh0aGUKICAgIG92ZXJ3aGVsbWluZ2x5IGNvbW1vbiByZWFsLXdvcmxkIHBhdHRlcm4sIGUuZy4gYG1haW5Nb2QgLi4gIiArIFEiYCkKICAgIGNhbid0IGJlIHJlc29sdmVkIHdpdGhvdXQgZXZhbHVhdGluZyB0aGUgc2NyaXB0LCBzbyB0aG9zZSBiaW5kcyBhcmUKICAgIHNpbGVudGx5IHNraXBwZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZCBhdCAtIHNhbWUgbGltaXRhdGlvbgogICAgYHJlc29sdmVfbGl0ZXJhbGAvYF93YWxrX2NvbmZpZ190YWJsZWAgYWxyZWFkeSBkb2N1bWVudCBmb3IgdmFsdWVzCiAgICB0aGF0IGFyZW4ndCBsaXRlcmFscy4KICAtIFBvc3NpYmxlLW1pc3NpbmctcXVvdGVzIGNoZWNraW5nOiBhIGNvbmZpZyBvciBzcGVjLXRhYmxlIHZhbHVlIHRoYXQncyBhCiAgICAqYmFyZSwgc2luZ2xlIGlkZW50aWZpZXIqIChgYWNjZWxfcHJvZmlsZSA9IGZsYXRgLCBub3QgYGFjY2VsX3Byb2ZpbGUgPQogICAgImZsYXQiYCkgaXMgZmxhZ2dlZCB3aGVuIHRoYXQgaWRlbnRpZmllciBpcyBuZXZlciBhc3NpZ25lZCBhbnl3aGVyZSBpbgogICAgdGhlIGZpbGUgKGFzIGEgbG9jYWwsIGEgZ2xvYmFsLCBhIGZvci1sb29wIHZhcmlhYmxlLCBvciBhIGZ1bmN0aW9uCiAgICBwYXJhbWV0ZXIpIGFuZCB0aGUgZmllbGQncyBzY2hlbWEgdHlwZSBpbmNsdWRlcyBgc3RyaW5nYC4gQW4KICAgIGlkZW50aWZpZXIgdGhhdCB3YXMgbmV2ZXIgYXNzaWduZWQgd291bGQgcmVzb2x2ZSB0byBMdWEncyBpbXBsaWNpdAogICAgYG5pbGAgZ2xvYmFsIGF0IHJ1bnRpbWUgLSBpLmUuIHRoaXMgaXNuJ3QgYSBndWVzcyBhYm91dCBpbnRlbnQsIGl0J3MKICAgICJ0aGlzIHNwZWNpZmljIHZhbHVlIGNhbm5vdCBkbyBhbnl0aGluZyBvdGhlciB0aGFuIHNpbGVudGx5IGJlY29tZQogICAgbmlsIi4gVGhpcyBpcyB0aGUgZXhhY3QgcmVhbC13b3JsZCBidWcgaW4KICAgIGdpdGh1Yi5jb20vaHlwcndtL0h5cHJsYW5kIzE1NzI3OiBhIHVzZXIncyBtaWdyYXRlZCBgYWNjZWxfcHJvZmlsZSA9CiAgICBmbGF0YCBzaWxlbnRseSBkaXNjYXJkZWQgdGhlIGFjY2VsIHByb2ZpbGUgYW5kIGNoYW5nZWQgdGhlaXIgbW91c2UKICAgIHNlbnNpdGl2aXR5LCBhbmQgd2FzIG9ubHkgZm91bmQgYnkgYSBzdHJhbmdlciByZWFkaW5nIHRoZWlyIGNvbmZpZy4KICAgIERlbGliZXJhdGVseSBkb2VzIE5PVCBmaXJlIGZvciBhbiBpZGVudGlmaWVyIHRoYXQgKmlzKiBhc3NpZ25lZAogICAgc29tZXdoZXJlIChlLmcuIGBsb2NhbCB0ZXJtaW5hbCA9ICJmb290IjsgLi4uID0gdGVybWluYWxgKSAtIHRoYXQncwogICAgdGhlIGxlZ2l0aW1hdGUgdmFyaWFibGUtcmVmZXJlbmNlIHBhdHRlcm4gYWxyZWFkeSBhY2NlcHRlZCBlbHNld2hlcmUKICAgIGluIHRoaXMgbW9kdWxlLCBhbmQgdGhpcyBjaGVjayByZXVzZXMgdGhhdCBzYW1lIGNvbnNlcnZhdGl2ZQogICAgImNhbid0IGRpc3Byb3ZlIGl0LCBkb24ndCBmbGFnIGl0IiBzdGFuY2UuIFNjb3BlIHRyYWNraW5nIGlzCiAgICBkZWxpYmVyYXRlbHkgZmxhdCAoZXZlcnkgYXNzaWdubWVudCBhbnl3aGVyZSBpbiB0aGUgZmlsZSBjb3VudHMgYXMKICAgICJkZWZpbmVkIiwgbm90IGp1c3Qgb25lcyBpbiBhbiBlbmNsb3Npbmcgc2NvcGUpIC0gYSBmYWxzZSBuZWdhdGl2ZQogICAgKG1pc3NpbmcgYSBnZW51aW5lbHktdW5kZWZpbmVkIHNoYWRvd2VkIGxvY2FsKSBpcyBhbiBhY2NlcHRhYmxlCiAgICB0cmFkZSBmb3IgbmV2ZXIgZmxhZ2dpbmcgYSBsZWdpdGltYXRlbHktc2NvcGVkIGxvY2FsIGFzIGlmIGl0CiAgICB3ZXJlbid0IGRlZmluZWQuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gZW51bSBpbXBvcnQgRW51bQoKZnJvbSBsdWFwYXJzZXIuYXN0bm9kZXMgaW1wb3J0ICgKICAgIENhbGwsIEludm9rZSwgTWV0aG9kLCBUYWJsZSwgRmllbGQgYXMgTHVhRmllbGQsIE5hbWUsCiAgICBMb2NhbEFzc2lnbiwgQXNzaWduLCBGb3JpbiwgRm9ybnVtLAogICAgRnVuY3Rpb24sIExvY2FsRnVuY3Rpb24sIEFub255bW91c0Z1bmN0aW9uLAopCgpmcm9tIGh5cHJ2YWxpZGF0ZS5sdWFhc3QgaW1wb3J0IHJlYWRlcgpmcm9tIGh5cHJ2YWxpZGF0ZS5zY2hlbWEuZXh0cmFjdG9yIGltcG9ydCBTY2hlbWEKCgpjbGFzcyBGaW5kaW5nS2luZChzdHIsIEVudW0pOgogICAgVU5LTk9XTl9TWU1CT0wgPSAidW5rbm93bl9zeW1ib2wiCiAgICBVTktOT1dOX0NPTkZJR19LRVkgPSAidW5rbm93bl9jb25maWdfa2V5IgogICAgVFlQRV9NSVNNQVRDSCA9ICJ0eXBlX21pc21hdGNoIgogICAgQVJJVFlfTUlTTUFUQ0ggPSAiYXJpdHlfbWlzbWF0Y2giCiAgICBVTktOT1dOX1NQRUNfRklFTEQgPSAidW5rbm93bl9zcGVjX2ZpZWxkIgogICAgVU5DQUxMRURfRElTUEFUQ0hFUiA9ICJ1bmNhbGxlZF9kaXNwYXRjaGVyIgogICAgRFVQTElDQVRFX0JJTkQgPSAiZHVwbGljYXRlX2JpbmQiCiAgICBQT1NTSUJMRV9NSVNTSU5HX1FVT1RFUyA9ICJwb3NzaWJsZV9taXNzaW5nX3F1b3RlcyIKCgpAZGF0YWNsYXNzCmNsYXNzIEZpeEVkaXQ6CiAgICAiIiJBIHNpbmdsZSwgdW5hbWJpZ3VvdXMgdGV4dHVhbCBjb3JyZWN0aW9uIGZvciBhIEZpbmRpbmc6IHJlcGxhY2UKICAgIGBzb3VyY2Vbc3RhcnQ6ZW5kXWAgKGNoYXJhY3RlciBvZmZzZXRzLCBgZW5kYCBleGNsdXNpdmUpIHdpdGgKICAgIGByZXBsYWNlbWVudGAuIE9ubHkgYXR0YWNoZWQgdG8gZmluZGluZ3MgdGhpcyBtb2R1bGUgY2FuIGNvcnJlY3Qgd2l0aAogICAgemVybyBhbWJpZ3VpdHkgYWJvdXQgaW50ZW50IChzZWUgYGZpeGVyLnB5YCkgLSBtb3N0IGZpbmRpbmcga2luZHMgbmV2ZXIKICAgIGdldCBvbmUsIGFuZCB0aGVpciBgRmluZGluZy5maXhgIHN0YXlzIE5vbmUuIiIiCiAgICBzdGFydDogaW50CiAgICBlbmQ6IGludAogICAgcmVwbGFjZW1lbnQ6IHN0cgoKCkBkYXRhY2xhc3MKY2xhc3MgRmluZGluZzoKICAgIGtpbmQ6IEZpbmRpbmdLaW5kCiAgICBsaW5lOiBpbnQgfCBOb25lCiAgICBtZXNzYWdlOiBzdHIKICAgIGZpeDogRml4RWRpdCB8IE5vbmUgPSBOb25lCgoKIyBUeXBlLWV4cHJlc3Npb24gdG9rZW5zIHRoYXQgaW5kaWNhdGUgInRoaXMgYWx0ZXJuYXRpdmUgaXMgYSB0YWJsZS9jbGFzcwojIHNoYXBlLCBub3QgYSBzY2FsYXIiIC0gdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBza2lwIGEgbWlzbWF0Y2ggcmF0aGVyCiMgdGhhbiB0byBtb2RlbCB0aGUgc2hhcGUuCmRlZiBfaGFzX3RhYmxlX2FsdGVybmF0aXZlKHR5cGVfZXhwcjogc3RyKSAtPiBib29sOgogICAgcmV0dXJuICJ7IiBpbiB0eXBlX2V4cHIgb3IgIkhMLiIgaW4gdHlwZV9leHByCgoKX1NDQUxBUl9DT01QQVQgPSB7CiAgICAiYm9vbGVhbiI6IHsiYm9vbGVhbiJ9LAogICAgInN0cmluZyI6IHsic3RyaW5nIn0sCiAgICAiaW50ZWdlciI6IHsibnVtYmVyIn0sCiAgICAibnVtYmVyIjogeyJudW1iZXIifSwKfQoKCmRlZiBfc2NhbGFyX2tpbmRfbWF0Y2hlcyhraW5kOiBzdHIsIHR5cGVfZXhwcjogc3RyKSAtPiBib29sOgogICAgIiIiVHJ1ZSBpZiBhIHJlc29sdmVkIHNjYWxhciBsaXRlcmFsJ3Mga2luZCBzYXRpc2ZpZXMgYSAocG9zc2libHkKICAgIHVuaW9uZWQpIHNjaGVtYSB0eXBlIGV4cHJlc3Npb24sIGNvbnNpZGVyaW5nIG9ubHkgdGhlIHNjYWxhcgogICAgYWx0ZXJuYXRpdmVzIGluIHRoYXQgZXhwcmVzc2lvbi4iIiIKICAgIGZvciBhbHQgaW4gKGEuc3RyaXAoKSBmb3IgYSBpbiB0eXBlX2V4cHIuc3BsaXQoInwiKSk6CiAgICAgICAgY29tcGF0ID0gX1NDQUxBUl9DT01QQVQuZ2V0KGFsdCkKICAgICAgICBpZiBjb21wYXQgYW5kIGtpbmQgaW4gY29tcGF0OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIF90eXBlX2V4cHJfYWNjZXB0c19zdHJpbmcodHlwZV9leHByOiBzdHIpIC0+IGJvb2w6CiAgICByZXR1cm4gInN0cmluZyIgaW4gKGEuc3RyaXAoKSBmb3IgYSBpbiB0eXBlX2V4cHIuc3BsaXQoInwiKSkKCgojIEdsb2JhbHMgcHJvdmlkZWQgYnkgdGhlIEh5cHJsYW5kIEx1YSBydW50aW1lIGl0c2VsZiwgbm90IGJ5IGFueXRoaW5nIGEKIyBjb25maWcgZmlsZSBhc3NpZ25zIC0gYSBiYXJlIHJlZmVyZW5jZSB0byBvbmUgb2YgdGhlc2UgaXMgbmV2ZXIgIm1pc3NpbmcKIyBxdW90ZXMiLCBpdCdzIGEgcmVhbCAoaWYgb2RkbHktdHlwZWQpIHZhbHVlLiBDdXJyZW50bHkganVzdCB0aGUgQVBJIHJvb3Q7CiMgZXh0ZW5kIGhlcmUgaWYgdGhlIHJ1bnRpbWUgZ3Jvd3MgbW9yZS4KX1JVTlRJTUVfR0xPQkFMUyA9IHsiaGwifQoKCmRlZiBfY29sbGVjdF9kZWZpbmVkX25hbWVzKHRyZWUpIC0+IHNldFtzdHJdOgogICAgIiIiRXZlcnkgaWRlbnRpZmllciBhc3NpZ25lZCBhbnl3aGVyZSBpbiB0aGUgZmlsZSAtIGFzIGEgbG9jYWwsIGEKICAgIGdsb2JhbCwgYSBmb3ItbG9vcCB2YXJpYWJsZSwgb3IgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgLSBmbGF0dGVuZWQgaW50bwogICAgb25lIHNldCB3aXRoIG5vIHNjb3BlIHN0cnVjdHVyZS4gVXNlZCBieSB0aGUgbWlzc2luZy1xdW90ZXMgY2hlY2s6IGFuCiAgICBpZGVudGlmaWVyIE5PVCBpbiB0aGlzIHNldCBjYW4gb25seSBldmVyIHJlc29sdmUgdG8gTHVhJ3MgaW1wbGljaXQKICAgIGBuaWxgIGdsb2JhbCBhdCBydW50aW1lLCBzbyBhIGJhcmUgcmVmZXJlbmNlIHRvIGl0IGluIGEgc3RyaW5nLXR5cGVkCiAgICBmaWVsZCBpcyBhIGRpcmVjdGx5IGRlbW9uc3RyYWJsZSBidWcsIG5vdCBhIGd1ZXNzLiBEZWxpYmVyYXRlbHkgZmxhdAogICAgKGlnbm9yZXMgYWN0dWFsIHNjb3BpbmcpIC0gc2VlIG1vZHVsZSBkb2NzdHJpbmcgZm9yIHdoeSB0aGF0J3MgdGhlCiAgICByaWdodCB0cmFkZS1vZmYgaGVyZS4iIiIKICAgIG5hbWVzOiBzZXRbc3RyXSA9IHNldChfUlVOVElNRV9HTE9CQUxTKQogICAgZm9yIG5vZGUgaW4gcmVhZGVyLndhbGsodHJlZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCAoTG9jYWxBc3NpZ24sIEFzc2lnbiwgRm9yaW4pKToKICAgICAgICAgICAgbmFtZXMudXBkYXRlKHQuaWQgZm9yIHQgaW4gbm9kZS50YXJnZXRzIGlmIGlzaW5zdGFuY2UodCwgTmFtZSkpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEZvcm51bSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS50YXJnZXQsIE5hbWUpOgogICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5vZGUudGFyZ2V0LmlkKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCAoRnVuY3Rpb24sIExvY2FsRnVuY3Rpb24sIEFub255bW91c0Z1bmN0aW9uLCBNZXRob2QpKToKICAgICAgICAgICAgbmFtZXMudXBkYXRlKGEuaWQgZm9yIGEgaW4gbm9kZS5hcmdzIGlmIGlzaW5zdGFuY2UoYSwgTmFtZSkpCiAgICAgICAgICAgIG5hbWVfbm9kZSA9IGdldGF0dHIobm9kZSwgIm5hbWUiLCBOb25lKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVfbm9kZSwgTmFtZSk6CiAgICAgICAgICAgICAgICBuYW1lcy5hZGQobmFtZV9ub2RlLmlkKQogICAgcmV0dXJuIG5hbWVzCgoKQGRhdGFjbGFzcwpjbGFzcyBQYXJhbToKICAgIG5hbWU6IHN0cgogICAgdHlwZV9leHByOiBzdHIKICAgIG9wdGlvbmFsOiBib29sCgoKQGRhdGFjbGFzcwpjbGFzcyBGdW5jdGlvblNpZ25hdHVyZToKICAgIHBhcmFtczogbGlzdFtQYXJhbV0KICAgIGhhc192YXJhcmc6IGJvb2wgICMgYSBiYXJlICIuLi4iIGVudHJ5IC0gdW5saW1pdGVkL3VuY2hlY2tlZCB0cmFpbGluZyBhcmdzCgoKZGVmIF9zcGxpdF90b3BfbGV2ZWwoczogc3RyLCBzZXA6IHN0cikgLT4gbGlzdFtzdHJdOgogICAgIiIiU3BsaXQgb24gYHNlcGAsIGJ1dCBvbmx5IGF0IGJyYWNrZXQgZGVwdGggMCAtIHNvIGEgcGFyYW0gdHlwZSBsaWtlCiAgICBgdGFibGU8c3RyaW5nLCBzdHJpbmd8bnVtYmVyPmAgZG9lc24ndCBnZXQgc3BsaXQgb24gaXRzIGlubmVyIGNvbW1hLiIiIgogICAgcGFydHM6IGxpc3Rbc3RyXSA9IFtdCiAgICBkZXB0aCA9IDAKICAgIGN1cnJlbnQ6IGxpc3Rbc3RyXSA9IFtdCiAgICBmb3IgY2ggaW4gczoKICAgICAgICBpZiBjaCBpbiAiKHs8IjoKICAgICAgICAgICAgZGVwdGggKz0gMQogICAgICAgIGVsaWYgY2ggaW4gIil9PiI6CiAgICAgICAgICAgIGRlcHRoIC09IDEKICAgICAgICBpZiBjaCA9PSBzZXAgYW5kIGRlcHRoID09IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiIi5qb2luKGN1cnJlbnQpKQogICAgICAgICAgICBjdXJyZW50ID0gW10KICAgICAgICBlbHNlOgogICAgICAgICAgICBjdXJyZW50LmFwcGVuZChjaCkKICAgIHBhcnRzLmFwcGVuZCgiIi5qb2luKGN1cnJlbnQpKQogICAgcmV0dXJuIHBhcnRzCgoKZGVmIHBhcnNlX2Z1bl9zaWduYXR1cmUodHlwZV9leHByOiBzdHIpIC0+IEZ1bmN0aW9uU2lnbmF0dXJlIHwgTm9uZToKICAgICIiIlBhcnNlIGEgTHVhTFMgYGZ1biguLi4pYCB0eXBlIGV4cHJlc3Npb24ncyBwYXJhbWV0ZXIgbGlzdC4gUmV0dXJucwogICAgTm9uZSBpZiBgdHlwZV9leHByYCBpc24ndCBhIGZ1bmN0aW9uIHR5cGUgYXQgYWxsLiBIYW5kbGVzIGEgcGFyYW0gdHlwZQogICAgdGhhdCdzIGl0c2VsZiBhIG5lc3RlZCBgZnVuKC4uLilgIChlLmcuIGBobC5vbmAncyBgY2I6IGZ1biguLi4pYCBhcmcpIGJ5CiAgICB0cmFja2luZyBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIHNwbGl0dGluZyBvbiB0aGUgZmlyc3QgY2xvc2UtcGFyZW4uIiIiCiAgICBvcGVuX2lkeCA9IHR5cGVfZXhwci5maW5kKCIoIikKICAgIGlmIG5vdCB0eXBlX2V4cHIuc3RhcnRzd2l0aCgiZnVuKCIpIG9yIG9wZW5faWR4ID09IC0xOgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVwdGggPSAwCiAgICBlbmQgPSBOb25lCiAgICBmb3IgaiBpbiByYW5nZShvcGVuX2lkeCwgbGVuKHR5cGVfZXhwcikpOgogICAgICAgIGMgPSB0eXBlX2V4cHJbal0KICAgICAgICBpZiBjIGluICIoezwiOgogICAgICAgICAgICBkZXB0aCArPSAxCiAgICAgICAgZWxpZiBjIGluICIpfT4iOgogICAgICAgICAgICBkZXB0aCAtPSAxCiAgICAgICAgICAgIGlmIGRlcHRoID09IDA6CiAgICAgICAgICAgICAgICBlbmQgPSBqCiAgICAgICAgICAgICAgICBicmVhawogICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBwYXJhbV9zdHIgPSB0eXBlX2V4cHJbb3Blbl9pZHggKyAxOmVuZF0uc3RyaXAoKQogICAgaWYgbm90IHBhcmFtX3N0cjoKICAgICAgICByZXR1cm4gRnVuY3Rpb25TaWduYXR1cmUocGFyYW1zPVtdLCBoYXNfdmFyYXJnPUZhbHNlKQoKICAgIHBhcmFtczogbGlzdFtQYXJhbV0gPSBbXQogICAgaGFzX3ZhcmFyZyA9IEZhbHNlCiAgICBmb3IgdG9rIGluICh0LnN0cmlwKCkgZm9yIHQgaW4gX3NwbGl0X3RvcF9sZXZlbChwYXJhbV9zdHIsICIsIikpOgogICAgICAgIGlmIG5vdCB0b2s6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgdG9rID09ICIuLi4iOgogICAgICAgICAgICBoYXNfdmFyYXJnID0gVHJ1ZQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmICI6IiBpbiB0b2s6CiAgICAgICAgICAgIG5hbWVfcGFydCwgdHlwZV9wYXJ0ID0gdG9rLnNwbGl0KCI6IiwgMSkKICAgICAgICAgICAgbmFtZV9wYXJ0LCB0eXBlX3BhcnQgPSBuYW1lX3BhcnQuc3RyaXAoKSwgdHlwZV9wYXJ0LnN0cmlwKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lX3BhcnQsIHR5cGVfcGFydCA9IHRvaywgImFueSIgICMgdW50eXBlZCBiYXJlIHBhcmFtLCBub3Qgc2VlbiBpbiBwcmFjdGljZQogICAgICAgIG9wdGlvbmFsID0gbmFtZV9wYXJ0LmVuZHN3aXRoKCI/IikKICAgICAgICBuYW1lID0gbmFtZV9wYXJ0WzotMV0gaWYgb3B0aW9uYWwgZWxzZSBuYW1lX3BhcnQKICAgICAgICBwYXJhbXMuYXBwZW5kKFBhcmFtKG5hbWU9bmFtZSwgdHlwZV9leHByPXR5cGVfcGFydCwgb3B0aW9uYWw9b3B0aW9uYWwpKQogICAgcmV0dXJuIEZ1bmN0aW9uU2lnbmF0dXJlKHBhcmFtcz1wYXJhbXMsIGhhc192YXJhcmc9aGFzX3ZhcmFyZykKCgpkZWYgcmVzb2x2ZV9zeW1ib2woc2NoZW1hOiBTY2hlbWEsIGRvdHRlZF9uYW1lOiBzdHIpIC0+IHR1cGxlW2Jvb2wsIHN0ciwgc3RyIHwgTm9uZV06CiAgICAiIiJDaGVjayBhIGRvdHRlZCBgaGwuKmAgc3ltYm9sIHBhdGggYWdhaW5zdCB0aGUgc2NoZW1hLiBSZXR1cm5zCiAgICAoaXNfdmFsaWQsIHJlYXNvbiwgc2lnbmF0dXJlX3R5cGVfZXhwcikuIGBzaWduYXR1cmVfdHlwZV9leHByYCBpcyB0aGUKICAgIHJlc29sdmVkIGZ1bmN0aW9uJ3MgcmF3IGBmdW4oLi4uKWAgdHlwZSBzdHJpbmcgd2hlbiB0aGlzIGlzIGEgdmFsaWQsCiAgICBmdWxseS1yZXNvbHZlZCBjYWxsIHRhcmdldCAtIE5vbmUgb3RoZXJ3aXNlIChub3QgYSBjYWxsIHRhcmdldCwgb3IKICAgIGludmFsaWQpLiBOYW1lcyBub3Qgc3RhcnRpbmcgd2l0aCAiaGwiIGFyZSBvdXQgb2Ygc2NvcGUgYW5kIGFsd2F5cwogICAgY29uc2lkZXJlZCB2YWxpZCAodGhleSdyZSB0aGUgdXNlcidzIG93biBsb2NhbHMsIG5vdCBBUEkpLiIiIgogICAgc2VnbWVudHMgPSBkb3R0ZWRfbmFtZS5zcGxpdCgiLiIpCiAgICBpZiBzZWdtZW50c1swXSAhPSAiaGwiOgogICAgICAgIHJldHVybiBUcnVlLCAibm90IGFuIGhsLiogc3ltYm9sLCBub3QgY2hlY2tlZCIsIE5vbmUKCiAgICBjdXJyZW50X2NsYXNzID0gIkhMLkFQSSIKICAgIGZvciBpLCBzZWcgaW4gZW51bWVyYXRlKHNlZ21lbnRzWzE6XSwgc3RhcnQ9MSk6CiAgICAgICAgY2xzID0gc2NoZW1hLmNsYXNzZXMuZ2V0KGN1cnJlbnRfY2xhc3MpCiAgICAgICAgaWYgY2xzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZSwgZiJpbnRlcm5hbDogdW5rbm93biBzY2hlbWEgY2xhc3Mge2N1cnJlbnRfY2xhc3Mhcn0iLCBOb25lCgogICAgICAgIHR5cGVfZXhwciA9IGNscy5maWVsZHMuZ2V0KHNlZykKICAgICAgICBpZiB0eXBlX2V4cHIgaXMgTm9uZToKICAgICAgICAgICAgaWYgY3VycmVudF9jbGFzcyA9PSAiSEwuUGx1Z2luTmFtZXNwYWNlIjoKICAgICAgICAgICAgICAgICMgRHluYW1pYyBpbmRleCBzaWduYXR1cmUgKGBbc3RyaW5nXSBhbnlgKSAtIHBsdWdpbnMKICAgICAgICAgICAgICAgICMgcmVnaXN0ZXIgdGhlaXIgb3duIG1lbWJlcnMgYXQgcnVudGltZS4gU2VlIG1vZHVsZQogICAgICAgICAgICAgICAgIyBkb2NzdHJpbmcuCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZSwgImhsLnBsdWdpbi4qIG1lbWJlciwgYWNjZXB0ZWQgKGR5bmFtaWMpIiwgTm9uZQogICAgICAgICAgICByZXR1cm4gRmFsc2UsICgKICAgICAgICAgICAgICAgIGYiJ3tzZWd9JyBpcyBub3QgYSBtZW1iZXIgb2Yge2N1cnJlbnRfY2xhc3N9ICIKICAgICAgICAgICAgICAgIGYiKHJlc29sdmluZyB7ZG90dGVkX25hbWV9KSIKICAgICAgICAgICAgKSwgTm9uZQoKICAgICAgICBpZiB0eXBlX2V4cHIuc3RhcnRzd2l0aCgiZnVuKCIpOgogICAgICAgICAgICByZW1haW5pbmcgPSBzZWdtZW50c1tpICsgMTpdCiAgICAgICAgICAgIGlmIHJlbWFpbmluZzoKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZSwgKAogICAgICAgICAgICAgICAgICAgIGYiJ3snLicuam9pbihzZWdtZW50c1s6aSsxXSl9JyBpcyBhIGZ1bmN0aW9uLCAiCiAgICAgICAgICAgICAgICAgICAgZiJidXQgJ3snLicuam9pbihyZW1haW5pbmcpfScgaXMgYWNjZXNzZWQgb24gaXQiCiAgICAgICAgICAgICAgICApLCBOb25lCiAgICAgICAgICAgIHJldHVybiBUcnVlLCAicmVzb2x2ZWQgdG8gYSBkb2N1bWVudGVkIGRpc3BhdGNoZXIvQVBJIGZ1bmN0aW9uIiwgdHlwZV9leHByCgogICAgICAgIGlmIHR5cGVfZXhwciBpbiBzY2hlbWEuY2xhc3NlczoKICAgICAgICAgICAgY3VycmVudF9jbGFzcyA9IHR5cGVfZXhwcgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIEEgcGxhaW4tdHlwZWQgZmllbGQgKG5vdCBhIG5hbWVzcGFjZSwgbm90IGEgZnVuY3Rpb24pIGJlaW5nCiAgICAgICAgIyBhY2Nlc3NlZCBmdXJ0aGVyLCBlLmcuIHRyZWF0aW5nIGEgYm9vbGVhbiBjb25maWcgZmllbGQgYXMgYQogICAgICAgICMgbmFtZXNwYWNlIC0gaW52YWxpZC4KICAgICAgICByZW1haW5pbmcgPSBzZWdtZW50c1tpICsgMTpdCiAgICAgICAgaWYgcmVtYWluaW5nOgogICAgICAgICAgICByZXR1cm4gRmFsc2UsICgKICAgICAgICAgICAgICAgIGYiJ3snLicuam9pbihzZWdtZW50c1s6aSsxXSl9JyBpcyB0eXBlIHt0eXBlX2V4cHIhcn0sICIKICAgICAgICAgICAgICAgIGYibm90IGEgbmFtZXNwYWNlIC0gY2FuJ3QgYWNjZXNzICd7Jy4nLmpvaW4ocmVtYWluaW5nKX0nIG9uIGl0IgogICAgICAgICAgICApLCBOb25lCiAgICAgICAgcmV0dXJuIFRydWUsIGYicmVzb2x2ZWQgdG8gYSBmaWVsZCBvZiB0eXBlIHt0eXBlX2V4cHIhcn0iLCBOb25lCgogICAgcmV0dXJuIFRydWUsICJyZXNvbHZlZCB0byBhIG5hbWVzcGFjZSAobm90IGNhbGxlZCBmdXJ0aGVyKSIsIE5vbmUKCgpkZWYgX21pc3NpbmdfcXVvdGVzX2ZpbmRpbmcoCiAgICBrZXlfb3JfZmllbGRfbmFtZTogc3RyLCB2YWx1ZTogb2JqZWN0LCB0eXBlX2V4cHI6IHN0ciwgbGluZTogaW50IHwgTm9uZSwKICAgIGRlZmluZWRfbmFtZXM6IHNldFtzdHJdLAopIC0+IEZpbmRpbmcgfCBOb25lOgogICAgaWYgbm90IChpc2luc3RhbmNlKHZhbHVlLCBOYW1lKSBhbmQgX3R5cGVfZXhwcl9hY2NlcHRzX3N0cmluZyh0eXBlX2V4cHIpKToKICAgICAgICByZXR1cm4gTm9uZQogICAgaWYgdmFsdWUuaWQgaW4gZGVmaW5lZF9uYW1lczoKICAgICAgICByZXR1cm4gTm9uZQogICAgZml4ID0gTm9uZQogICAgaWYgdmFsdWUuZmlyc3RfdG9rZW4gaXMgbm90IE5vbmU6CiAgICAgICAgIyBBIGJhcmUgTmFtZSBpcyBhbHdheXMgYSBzaW5nbGUgdG9rZW4gYW5kIGFsd2F5cyBhIHZhbGlkIEx1YQogICAgICAgICMgaWRlbnRpZmllciAodGhhdCdzIHdoYXQgbGV0IGl0IHBhcnNlIGFzIGEgTmFtZSBhdCBhbGwpIC0gbm8KICAgICAgICAjIGVzY2FwaW5nIG5lZWRlZCB0byB3cmFwIGl0IGluIHF1b3Rlcy4KICAgICAgICBmaXggPSBGaXhFZGl0KAogICAgICAgICAgICBzdGFydD12YWx1ZS5maXJzdF90b2tlbi5zdGFydCwKICAgICAgICAgICAgZW5kPXZhbHVlLmZpcnN0X3Rva2VuLnN0b3AgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudD1mJyJ7dmFsdWUuaWR9IicsCiAgICAgICAgKQogICAgcmV0dXJuIEZpbmRpbmcoCiAgICAgICAgRmluZGluZ0tpbmQuUE9TU0lCTEVfTUlTU0lOR19RVU9URVMsIGxpbmUsCiAgICAgICAgZiIne2tleV9vcl9maWVsZF9uYW1lfScgaXMgc2V0IHRvIHRoZSBiYXJlIGlkZW50aWZpZXIgJ3t2YWx1ZS5pZH0nLCAiCiAgICAgICAgZiJ3aGljaCBpc24ndCBkZWZpbmVkIGFueXdoZXJlIGluIHRoaXMgZmlsZSBhbmQgd291bGQgZXZhbHVhdGUgdG8gIgogICAgICAgIGYibmlsIC0gZGlkIHlvdSBtZWFuIHRoZSBzdHJpbmcgXCJ7dmFsdWUuaWR9XCI/IiwKICAgICAgICBmaXg9Zml4LAogICAgKQoKCmRlZiBfd2Fsa19jb25maWdfdGFibGUoCiAgICBzY2hlbWE6IFNjaGVtYSwgdGFibGU6IFRhYmxlLCBwcmVmaXg6IHN0ciwgbGluZTogaW50IHwgTm9uZSwKICAgIGRlZmluZWRfbmFtZXM6IHNldFtzdHJdLAopIC0+IGxpc3RbRmluZGluZ106CiAgICBmaW5kaW5nczogbGlzdFtGaW5kaW5nXSA9IFtdCiAgICBmb3IgZmllbGQgaW4gdGFibGUuZmllbGRzOgogICAgICAgIGlmIGZpZWxkLmtleSBpcyBOb25lOgogICAgICAgICAgICBjb250aW51ZSAgIyBhcnJheS1zdHlsZSBlbnRyeSwgbm90IGEgY29uZmlnIGtleSAtIG5vdCBvdXIgY29uY2VybgogICAgICAgIGtleV9uYW1lID0gX2ZpZWxkX2tleV9uYW1lKGZpZWxkLmtleSkKICAgICAgICBpZiBrZXlfbmFtZSBpcyBOb25lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGtleV9wYXRoID0gZiJ7cHJlZml4fS57a2V5X25hbWV9IiBpZiBwcmVmaXggZWxzZSBrZXlfbmFtZQogICAgICAgIGZpZWxkX2xpbmUgPSBmaWVsZC5maXJzdF90b2tlbi5saW5lIGlmIGZpZWxkLmZpcnN0X3Rva2VuIGVsc2UgbGluZQoKICAgICAgICBpZiBrZXlfcGF0aCA9PSAicGx1Z2luIiBvciBrZXlfcGF0aC5zdGFydHN3aXRoKCJwbHVnaW4uIik6CiAgICAgICAgICAgICMgUGx1Z2luIGNvbmZpZyBpcyBkeW5hbWljYWxseSByZWdpc3RlcmVkIHBlci1wbHVnaW4gYXQgcnVudGltZQogICAgICAgICAgICAjIGFuZCBzdHJ1Y3R1cmFsbHkgYWJzZW50IGZyb20gY29uZmlnX3ZhbHVlX3R5cGVzIC0gc2FtZSByb290CiAgICAgICAgICAgICMgY2F1c2UgYXMgSEwuUGx1Z2luTmFtZXNwYWNlJ3MgYFtzdHJpbmddIGFueWAgaW5kZXggc2lnbmF0dXJlCiAgICAgICAgICAgICMgZm9yIHN5bWJvbCByZXNvbHV0aW9uIChzZWUgbW9kdWxlIGRvY3N0cmluZykuIE5vdCBjaGVja2FibGUKICAgICAgICAgICAgIyBhZ2FpbnN0IHRoZSBjb3JlIHNjaGVtYTsgYWNjZXB0ZWQgd2l0aG91dCByZWN1cnNpbmcgZnVydGhlci4KICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaXNfbGVhZiA9IGtleV9wYXRoIGluIHNjaGVtYS5jb25maWdfdmFsdWVfdHlwZXMKICAgICAgICBpc19jb250YWluZXIgPSBhbnkoCiAgICAgICAgICAgIGsuc3RhcnRzd2l0aChrZXlfcGF0aCArICIuIikgZm9yIGsgaW4gc2NoZW1hLmNvbmZpZ192YWx1ZV90eXBlcwogICAgICAgICkKCiAgICAgICAgaWYgbm90IGlzX2xlYWYgYW5kIG5vdCBpc19jb250YWluZXI6CiAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZCgKICAgICAgICAgICAgICAgIEZpbmRpbmcoCiAgICAgICAgICAgICAgICAgICAgRmluZGluZ0tpbmQuVU5LTk9XTl9DT05GSUdfS0VZLAogICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpbmUsCiAgICAgICAgICAgICAgICAgICAgZiIne2tleV9wYXRofScgaXMgbm90IGEga25vd24gSHlwcmxhbmQgY29uZmlnIGtleSIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWVsZC52YWx1ZSwgVGFibGUpOgogICAgICAgICAgICBpZiBpc19sZWFmOgogICAgICAgICAgICAgICAgdHlwZV9leHByID0gc2NoZW1hLmNvbmZpZ192YWx1ZV90eXBlc1trZXlfcGF0aF0KICAgICAgICAgICAgICAgIGlmIG5vdCBfaGFzX3RhYmxlX2FsdGVybmF0aXZlKHR5cGVfZXhwcik6CiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICBGaW5kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZGluZ0tpbmQuVFlQRV9NSVNNQVRDSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIid7a2V5X3BhdGh9JyBleHBlY3RzIHt0eXBlX2V4cHJ9LCBnb3QgYSB0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAjIGVsc2U6IHRhYmxlLXNoYXBlZCBhbHRlcm5hdGl2ZSBhbGxvd2VkLCBlLmcuIEhMLkdyYWRpZW50IC0KICAgICAgICAgICAgICAgICMgbm90IGNoZWNrZWQgZnVydGhlciAoc2VlIG1vZHVsZSBkb2NzdHJpbmcpLgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmluZGluZ3MuZXh0ZW5kKAogICAgICAgICAgICAgICAgICAgIF93YWxrX2NvbmZpZ190YWJsZShzY2hlbWEsIGZpZWxkLnZhbHVlLCBrZXlfcGF0aCwgZmllbGRfbGluZSwgZGVmaW5lZF9uYW1lcykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgaXNfbGVhZjoKICAgICAgICAgICAgdHlwZV9leHByID0gc2NoZW1hLmNvbmZpZ192YWx1ZV90eXBlc1trZXlfcGF0aF0KICAgICAgICAgICAgbGl0ZXJhbCA9IHJlYWRlci5yZXNvbHZlX2xpdGVyYWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgIGlmIGxpdGVyYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3QgX3NjYWxhcl9raW5kX21hdGNoZXMobGl0ZXJhbC5raW5kLCB0eXBlX2V4cHIpIGFuZCBub3QgX2hhc190YWJsZV9hbHRlcm5hdGl2ZSh0eXBlX2V4cHIpOgogICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgRmluZGluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLlRZUEVfTUlTTUFUQ0gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiIne2tleV9wYXRofScgZXhwZWN0cyB7dHlwZV9leHByfSwgZ290IHtsaXRlcmFsLmtpbmR9ICh7bGl0ZXJhbC52YWx1ZSFyfSkiLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmluZGluZyA9IF9taXNzaW5nX3F1b3Rlc19maW5kaW5nKGtleV9wYXRoLCBmaWVsZC52YWx1ZSwgdHlwZV9leHByLCBmaWVsZF9saW5lLCBkZWZpbmVkX25hbWVzKQogICAgICAgICAgICAgICAgaWYgZmluZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBmaW5kaW5ncy5hcHBlbmQoZmluZGluZykKICAgICAgICAgICAgICAgICMgZWxzZTogbm90IGEgbGl0ZXJhbCBhbmQgbm90IGEgZmxhZ2dhYmxlIGJhcmUgaWRlbnRpZmllcgogICAgICAgICAgICAgICAgIyAodmFyaWFibGUvY2FsbC9kZWZpbmVkLW5hbWUpIC0gY2FuJ3QgY2hlY2ssIGFjY2VwdGVkLgogICAgICAgICMgZWxzZSAoaXNfY29udGFpbmVyIGJ1dCB2YWx1ZSBpc24ndCBhIFRhYmxlKTogbWFsZm9ybWVkIGJ1dCBub3QKICAgICAgICAjIHNvbWV0aGluZyB3ZSBjYW4gY2xhc3NpZnkgZnVydGhlcjsgc2tpcCByYXRoZXIgdGhhbiBndWVzcy4KCiAgICByZXR1cm4gZmluZGluZ3MKCgpkZWYgX3Jlc29sdmVfc3RhdGljX3N0cmluZyhleHByKSAtPiBzdHIgfCBOb25lOgogICAgIiIiUmVzb2x2ZSBhbiBleHByZXNzaW9uIHRvIGEgcGxhaW4gc3RyaW5nIGlmIGl0J3MgYSBzdHJpbmcgbGl0ZXJhbCwgb3IKICAgIGEgYENvbmNhdGAgKEx1YSBgLi5gKSBvZiBvbmx5IHN0cmluZyBsaXRlcmFscyAtIGUuZy4gYCJTVVBFUiIgLi4gIiArIFEiYC4KICAgIFJldHVybnMgTm9uZSBmb3IgYW55dGhpbmcgZWxzZSwgbm90YWJseSBhIGNvbmNhdCBpbnZvbHZpbmcgYSB2YXJpYWJsZQogICAgKGBtYWluTW9kIC4uICIgKyBRImApIC0gY2FuJ3QgYmUgcmVzb2x2ZWQgd2l0aG91dCBldmFsdWF0aW5nIHRoZSBzY3JpcHQsCiAgICB0aGUgc2FtZSBsaW1pdGF0aW9uIGByZWFkZXIucmVzb2x2ZV9saXRlcmFsYCBkb2N1bWVudHMgZm9yIHZhbHVlcyBpbgogICAgZ2VuZXJhbC4gTGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbiBgcmVhZGVyYCBiZWNhdXNlIGByZXNvbHZlX2xpdGVyYWxgJ3MKICAgIGNvbnRyYWN0IGlzIGV4cGxpY2l0bHkgc2NhbGFycy1vbmx5OyB0aGlzIGlzIGEgbmFycm93ZXIsIGNoZWNrZXItbG9jYWwKICAgIG5lZWQgKGR1cGxpY2F0ZS1iaW5kIGRldGVjdGlvbikuIiIiCiAgICBmcm9tIGx1YXBhcnNlci5hc3Rub2RlcyBpbXBvcnQgQ29uY2F0CgogICAgbGl0ZXJhbCA9IHJlYWRlci5yZXNvbHZlX2xpdGVyYWwoZXhwcikKICAgIGlmIGxpdGVyYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIGxpdGVyYWwudmFsdWUgaWYgbGl0ZXJhbC5raW5kID09ICJzdHJpbmciIGVsc2UgTm9uZQogICAgaWYgaXNpbnN0YW5jZShleHByLCBDb25jYXQpOgogICAgICAgIGxlZnQgPSBfcmVzb2x2ZV9zdGF0aWNfc3RyaW5nKGV4cHIubGVmdCkKICAgICAgICByaWdodCA9IF9yZXNvbHZlX3N0YXRpY19zdHJpbmcoZXhwci5yaWdodCkKICAgICAgICBpZiBsZWZ0IGlzIG5vdCBOb25lIGFuZCByaWdodCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyByaWdodAogICAgcmV0dXJuIE5vbmUKCgpkZWYgX2ZpZWxkX2tleV9uYW1lKGtleV9leHByKSAtPiBzdHIgfCBOb25lOgogICAgZnJvbSBsdWFwYXJzZXIuYXN0bm9kZXMgaW1wb3J0IE5hbWUsIFN0cmluZwoKICAgIGlmIGhhc2F0dHIoa2V5X2V4cHIsICJpZCIpOiAgIyBOYW1lCiAgICAgICAgcmV0dXJuIGtleV9leHByLmlkCiAgICBpZiBoYXNhdHRyKGtleV9leHByLCAicyIpOiAgIyBTdHJpbmcgKGJyYWNrZXRlZCBbImtleSJdID0gLi4uIGZvcm0pCiAgICAgICAgcyA9IGtleV9leHByLnMKICAgICAgICByZXR1cm4gcy5kZWNvZGUoKSBpZiBpc2luc3RhbmNlKHMsIGJ5dGVzKSBlbHNlIHMKICAgIHJldHVybiBOb25lCgoKZGVmIF9jaGVja19zcGVjX3RhYmxlKAogICAgc2NoZW1hOiBTY2hlbWEsIHRhYmxlOiBUYWJsZSwgY2xhc3NfbmFtZTogc3RyLCBsaW5lOiBpbnQgfCBOb25lLAogICAgZGVmaW5lZF9uYW1lczogc2V0W3N0cl0sCikgLT4gbGlzdFtGaW5kaW5nXToKICAgICIiIkNoZWNrIGEgdGFibGUncyBrZXlzL3ZhbHVlcyBhZ2FpbnN0IGEgc2NoZW1hIGNsYXNzJ3Mgb3duIGZpZWxkcwogICAgKGUuZy4gSEwuTW9uaXRvclNwZWMpIC0gdGhlIHNwZWMtdGFibGUgbWVjaGFuaXNtLCBkaXN0aW5jdCBmcm9tCiAgICBfd2Fsa19jb25maWdfdGFibGUncyBkb3R0ZWQtcGF0aCBjaGVjayAoaGwuY29uZmlnIG9ubHkpLiBTZWUgbW9kdWxlCiAgICBkb2NzdHJpbmcgZm9yIHdoeSB0aGVzZSBzdGF5IHNlcGFyYXRlIHJhdGhlciB0aGFuIHVuaWZpZWQuIiIiCiAgICBmaW5kaW5nczogbGlzdFtGaW5kaW5nXSA9IFtdCiAgICBjbHMgPSBzY2hlbWEuY2xhc3Nlcy5nZXQoY2xhc3NfbmFtZSkKICAgIGlmIGNscyBpcyBOb25lOgogICAgICAgIHJldHVybiBmaW5kaW5ncyAgIyBzaG91bGRuJ3QgaGFwcGVuIGlmIGNsYXNzX25hbWUgY2FtZSBmcm9tIHRoZSBzY2hlbWEgaXRzZWxmCgogICAgZm9yIGZpZWxkIGluIHRhYmxlLmZpZWxkczoKICAgICAgICBpZiBmaWVsZC5rZXkgaXMgTm9uZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBrZXlfbmFtZSA9IF9maWVsZF9rZXlfbmFtZShmaWVsZC5rZXkpCiAgICAgICAgaWYga2V5X25hbWUgaXMgTm9uZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBmaWVsZF9saW5lID0gZmllbGQuZmlyc3RfdG9rZW4ubGluZSBpZiBmaWVsZC5maXJzdF90b2tlbiBlbHNlIGxpbmUKCiAgICAgICAgdHlwZV9leHByID0gY2xzLmZpZWxkcy5nZXQoa2V5X25hbWUpCiAgICAgICAgaWYgdHlwZV9leHByIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKAogICAgICAgICAgICAgICAgRmluZGluZ0tpbmQuVU5LTk9XTl9TUEVDX0ZJRUxELCBmaWVsZF9saW5lLAogICAgICAgICAgICAgICAgZiIne2tleV9uYW1lfScgaXMgbm90IGEgZmllbGQgb2Yge2NsYXNzX25hbWV9IiwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWVsZC52YWx1ZSwgVGFibGUpOgogICAgICAgICAgICBpZiB0eXBlX2V4cHIgaW4gc2NoZW1hLmNsYXNzZXM6CiAgICAgICAgICAgICAgICBmaW5kaW5ncy5leHRlbmQoX2NoZWNrX3NwZWNfdGFibGUoc2NoZW1hLCBmaWVsZC52YWx1ZSwgdHlwZV9leHByLCBmaWVsZF9saW5lLCBkZWZpbmVkX25hbWVzKSkKICAgICAgICAgICAgZWxpZiBub3QgX2hhc190YWJsZV9hbHRlcm5hdGl2ZSh0eXBlX2V4cHIpOgogICAgICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKEZpbmRpbmcoCiAgICAgICAgICAgICAgICAgICAgRmluZGluZ0tpbmQuVFlQRV9NSVNNQVRDSCwgZmllbGRfbGluZSwKICAgICAgICAgICAgICAgICAgICBmIid7a2V5X25hbWV9JyBvbiB7Y2xhc3NfbmFtZX0gZXhwZWN0cyB7dHlwZV9leHByfSwgZ290IGEgdGFibGUiLAogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgbGl0ZXJhbCA9IHJlYWRlci5yZXNvbHZlX2xpdGVyYWwoZmllbGQudmFsdWUpCiAgICAgICAgaWYgbGl0ZXJhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgbm90IF9zY2FsYXJfa2luZF9tYXRjaGVzKGxpdGVyYWwua2luZCwgdHlwZV9leHByKSBhbmQgbm90IF9oYXNfdGFibGVfYWx0ZXJuYXRpdmUodHlwZV9leHByKToKICAgICAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKAogICAgICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLlRZUEVfTUlTTUFUQ0gsIGZpZWxkX2xpbmUsCiAgICAgICAgICAgICAgICAgICAgZiIne2tleV9uYW1lfScgb24ge2NsYXNzX25hbWV9IGV4cGVjdHMge3R5cGVfZXhwcn0sIGdvdCB7bGl0ZXJhbC5raW5kfSAoe2xpdGVyYWwudmFsdWUhcn0pIiwKICAgICAgICAgICAgICAgICkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBOb3QgYSBsaXRlcmFsIC0gZWl0aGVyIGEgZmxhZ2dhYmxlIGJhcmUgaWRlbnRpZmllciAoc2VlCiAgICAgICAgICAgICMgX21pc3NpbmdfcXVvdGVzX2ZpbmRpbmcpIG9yIGEgZ2VudWluZSB2YXJpYWJsZS9jYWxsLCB3aGljaAogICAgICAgICAgICAjIGNhbid0IGJlIGNoZWNrZWQgZnVydGhlciBhbmQgaXMgYWNjZXB0ZWQsIHNhbWUgYXMKICAgICAgICAgICAgIyBfd2Fsa19jb25maWdfdGFibGUncyBkb2N1bWVudGVkIGJlaGF2aW9yLgogICAgICAgICAgICBmaW5kaW5nID0gX21pc3NpbmdfcXVvdGVzX2ZpbmRpbmcoa2V5X25hbWUsIGZpZWxkLnZhbHVlLCB0eXBlX2V4cHIsIGZpZWxkX2xpbmUsIGRlZmluZWRfbmFtZXMpCiAgICAgICAgICAgIGlmIGZpbmRpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmaW5kaW5ncy5hcHBlbmQoZmluZGluZykKCiAgICByZXR1cm4gZmluZGluZ3MKCgpkZWYgY2hlY2soc2NoZW1hOiBTY2hlbWEsIHRyZWUpIC0+IGxpc3RbRmluZGluZ106CiAgICAiIiJSdW4gZXZlcnkgY2hlY2sgYWdhaW5zdCBhbiBhbHJlYWR5LXBhcnNlZCBMdWEgQVNUIChmcm9tCiAgICBoeXBydmFsaWRhdGUubHVhYXN0LnJlYWRlci5wYXJzZS9wYXJzZV9maWxlKS4iIiIKICAgIGZpbmRpbmdzOiBsaXN0W0ZpbmRpbmddID0gW10KICAgIGJpbmRfa2V5X2xpbmVzOiBkaWN0W3N0ciwgbGlzdFtpbnQgfCBOb25lXV0gPSB7fQogICAgZGVmaW5lZF9uYW1lcyA9IF9jb2xsZWN0X2RlZmluZWRfbmFtZXModHJlZSkKCiAgICBmb3Igbm9kZSBpbiByZWFkZXIud2Fsayh0cmVlKToKICAgICAgICAjIE5COiBgTWV0aG9kYCAoYSBgZnVuY3Rpb24gVDptZXRob2QoKSBlbmRgICpkZWZpbml0aW9uKikgaGFzIG5vCiAgICAgICAgIyBgLmZ1bmNgIC0gaXQncyBub3QgYSBjYWxsIGF0IGFsbC4gYEludm9rZWAgKGFuIGBvYmo6YmFyKClgICpjYWxsKikKICAgICAgICAjIGlzIHdoYXQgYmVsb25ncyBoZXJlOyBIeXBybGFuZCdzIG93biBBUEkgaXMgZXhjbHVzaXZlbHkgZG90LXN0eWxlCiAgICAgICAgIyAoYGhsLmJpbmQoLi4uKWApIHNvIGFuIEludm9rZSdzIGJhcmUgbWV0aG9kIG5hbWUgbmV2ZXIgcmVzb2x2ZXMKICAgICAgICAjIGFzIGBobC4qYCBhbmQgaXMgaGFybWxlc3NseSBza2lwcGVkIGJlbG93LCBzYW1lIGFzIGFueSBvdGhlcgogICAgICAgICMgZm9yZWlnbiBjYWxsIC0gdGhlIG9ubHkgdGhpbmcgdGhhdCBtYXR0ZXJzIGlzIG5vdCBjcmFzaGluZyBvbiBpdC4KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCAoQ2FsbCwgSW52b2tlKSk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZG90dGVkID0gcmVhZGVyLnJlc29sdmVfZG90dGVkX25hbWUobm9kZS5mdW5jKQogICAgICAgIGlmIGRvdHRlZCBpcyBOb25lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGxpbmUgPSBub2RlLmZpcnN0X3Rva2VuLmxpbmUgaWYgbm9kZS5maXJzdF90b2tlbiBlbHNlIE5vbmUKCiAgICAgICAgaWYgZG90dGVkID09ICJobC5iaW5kIiBhbmQgbm9kZS5hcmdzOgogICAgICAgICAgICBrZXlzID0gX3Jlc29sdmVfc3RhdGljX3N0cmluZyhub2RlLmFyZ3NbMF0pCiAgICAgICAgICAgIGlmIGtleXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBiaW5kX2tleV9saW5lcy5zZXRkZWZhdWx0KGtleXMsIFtdKS5hcHBlbmQobGluZSkKCiAgICAgICAgaXNfdmFsaWQsIHJlYXNvbiwgc2lnX3R5cGVfZXhwciA9IHJlc29sdmVfc3ltYm9sKHNjaGVtYSwgZG90dGVkKQogICAgICAgIGlmIG5vdCBpc192YWxpZDoKICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKEZpbmRpbmcoRmluZGluZ0tpbmQuVU5LTk9XTl9TWU1CT0wsIGxpbmUsIGYie2RvdHRlZH06IHtyZWFzb259IikpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHNpZ190eXBlX2V4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNpZyA9IHBhcnNlX2Z1bl9zaWduYXR1cmUoc2lnX3R5cGVfZXhwcikKICAgICAgICAgICAgaWYgc2lnIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZm9yIGlkeCwgcGFyYW0gaW4gZW51bWVyYXRlKHNpZy5wYXJhbXMpOgogICAgICAgICAgICAgICAgICAgIGlmICJITC5EaXNwYXRjaGVyIiBub3QgaW4gcGFyYW0udHlwZV9leHByIG9yIGlkeCA+PSBsZW4obm9kZS5hcmdzKToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBhcmdfZG90dGVkID0gcmVhZGVyLnJlc29sdmVfZG90dGVkX25hbWUobm9kZS5hcmdzW2lkeF0pCiAgICAgICAgICAgICAgICAgICAgaWYgYXJnX2RvdHRlZCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGFyZ192YWxpZCwgX3JlYXNvbiwgYXJnX3NpZyA9IHJlc29sdmVfc3ltYm9sKHNjaGVtYSwgYXJnX2RvdHRlZCkKICAgICAgICAgICAgICAgICAgICBpZiBhcmdfdmFsaWQgYW5kIGFyZ19zaWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpeCA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgYXJnX25vZGUgPSBub2RlLmFyZ3NbaWR4XQogICAgICAgICAgICAgICAgICAgICAgICBpZiBhcmdfbm9kZS5sYXN0X3Rva2VuIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbnNlcnQgKG5vdCByZXBsYWNlKSByaWdodCBhZnRlciB0aGUgcmVmZXJlbmNlJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGFzdCB0b2tlbiAtIGAoKWAgaXMgdGhlIG1pbmltYWwgY29ycmVjdGlvbiB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2VzIHRoaXMgYSBjYWxsIGF0IGFsbC4gSWYgdGhlIGRpc3BhdGNoZXIgYWxzbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZWVkcyBhcmd1bWVudHMsIHRoZSByZS1jaGVjayBhZnRlciBhcHBseWluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaXhlcyB3aWxsIHN1cmZhY2UgdGhhdCBhcyBhIGZyZXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFSSVRZX01JU01BVENIIC0gYSBkaWZmZXJlbnQsIGhvbmVzdCBwcm9ibGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3Qgc29tZXRoaW5nIHRvIGd1ZXNzIGF0IGhlcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfYXQgPSBhcmdfbm9kZS5sYXN0X3Rva2VuLnN0b3AgKyAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXggPSBGaXhFZGl0KHN0YXJ0PWluc2VydF9hdCwgZW5kPWluc2VydF9hdCwgcmVwbGFjZW1lbnQ9IigpIikKICAgICAgICAgICAgICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKEZpbmRpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kaW5nS2luZC5VTkNBTExFRF9ESVNQQVRDSEVSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiJ7ZG90dGVkfTogYXJndW1lbnQge2lkeCArIDF9ICgne2FyZ19kb3R0ZWR9JykgaXMgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmImRpc3BhdGNoZXIgZmFjdG9yeSByZWZlcmVuY2UsIG5vdCBhIGNhbGwgLSBkaWQgeW91ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYibWVhbiAne2FyZ19kb3R0ZWR9KC4uLiknPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXg9Zml4LAogICAgICAgICAgICAgICAgICAgICAgICApKQogICAgICAgICAgICBpZiBzaWcgaXMgbm90IE5vbmUgYW5kIG5vdCBzaWcuaGFzX3ZhcmFyZzoKICAgICAgICAgICAgICAgIG5fYXJncyA9IGxlbihub2RlLmFyZ3MpCiAgICAgICAgICAgICAgICBtaW5fYXJncyA9IHN1bSgxIGZvciBwIGluIHNpZy5wYXJhbXMgaWYgbm90IHAub3B0aW9uYWwpCiAgICAgICAgICAgICAgICBtYXhfYXJncyA9IGxlbihzaWcucGFyYW1zKQogICAgICAgICAgICAgICAgaWYgbl9hcmdzIDwgbWluX2FyZ3M6CiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKEZpbmRpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLkFSSVRZX01JU01BVENILCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBmIntkb3R0ZWR9OiBleHBlY3RzIGF0IGxlYXN0IHttaW5fYXJnc30gYXJndW1lbnQocyksIGdvdCB7bl9hcmdzfSIsCiAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgIGVsaWYgbl9hcmdzID4gbWF4X2FyZ3M6CiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKEZpbmRpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLkFSSVRZX01JU01BVENILCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBmIntkb3R0ZWR9OiBleHBlY3RzIGF0IG1vc3Qge21heF9hcmdzfSBhcmd1bWVudChzKSwgZ290IHtuX2FyZ3N9IiwKICAgICAgICAgICAgICAgICAgICApKQoKICAgICAgICAgICAgICAgICMgQ2hlY2sgc3BlYy10YWJsZSBhcmd1bWVudHMgYWdhaW5zdCB0aGVpciBvd24gc2NoZW1hCiAgICAgICAgICAgICAgICAjIGNsYXNzLCBmb3IgZXZlcnkgZnVuY3Rpb24gZXhjZXB0IGhsLmNvbmZpZyAoaXRzIG93bgogICAgICAgICAgICAgICAgIyBhbHJlYWR5LXRlc3RlZCBkb3R0ZWQtcGF0aCBtZWNoYW5pc20sIHNlZSBtb2R1bGUKICAgICAgICAgICAgICAgICMgZG9jc3RyaW5nKSBhbmQgaGwud2luZG93X3J1bGUgc3BlY2lmaWNhbGx5IC0gZm91bmQgYnkKICAgICAgICAgICAgICAgICMgdGhpcyBjaGVjaydzIG93biB0ZXN0IHN1aXRlIGZsb29kaW5nIGZhbHNlIHBvc2l0aXZlcyBvbgogICAgICAgICAgICAgICAgIyB0aGUgcmVhbCBjb25maWc6IEhMLldpbmRvd1J1bGVTcGVjIG9ubHkgdHlwZXMgMwogICAgICAgICAgICAgICAgIyB1bml2ZXJzYWwgZmllbGRzIChlbmFibGVkL21hdGNoL25hbWUpLCB1bmxpa2UgaXRzCiAgICAgICAgICAgICAgICAjIHNpYmxpbmdzIEhMLkxheWVyUnVsZVNwZWMgKDEzIGZpZWxkcykgYW5kCiAgICAgICAgICAgICAgICAjIEhMLldvcmtzcGFjZVJ1bGVTcGVjICgxNyBmaWVsZHMpIHdoaWNoIGFyZSBmdWxseSB0eXBlZC4KICAgICAgICAgICAgICAgICMgUGVyLXJ1bGUtdHlwZSBmaWVsZHMgKG1vdmUvZmxvYXQvd29ya3NwYWNlL3N1cHByZXNzX2V2ZW50LwogICAgICAgICAgICAgICAgIyBub19mb2N1cykgYXJlIGR5bmFtaWNhbGx5IGRpc3BhdGNoZWQgYW5kIGRlbGliZXJhdGVseSBub3QKICAgICAgICAgICAgICAgICMgaW4gdGhlIHN0dWIgYXQgYWxsIC0gdGhlIHNhbWUgZmFjdCBhbHJlYWR5IG5vdGVkIGFib3ZlCiAgICAgICAgICAgICAgICAjIGFib3V0IGhsLnBsdWdpbi4qLCByZS1kaXNjb3ZlcmVkIHRoZSBoYXJkIHdheSBoZXJlIHdoZW4KICAgICAgICAgICAgICAgICMgZ2VuZXJhbGl6aW5nLgogICAgICAgICAgICAgICAgaWYgZG90dGVkIG5vdCBpbiAoImhsLmNvbmZpZyIsICJobC53aW5kb3dfcnVsZSIpOgogICAgICAgICAgICAgICAgICAgIGZvciBpZHgsIHBhcmFtIGluIGVudW1lcmF0ZShzaWcucGFyYW1zKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGFyYW0udHlwZV9leHByIGluIHNjaGVtYS5jbGFzc2VzIGFuZCBpZHggPCBsZW4obm9kZS5hcmdzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IG5vZGUuYXJnc1tpZHhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgVGFibGUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzLmV4dGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrX3NwZWNfdGFibGUoc2NoZW1hLCBhcmcsIHBhcmFtLnR5cGVfZXhwciwgbGluZSwgZGVmaW5lZF9uYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgIGlmIGRvdHRlZCA9PSAiaGwuY29uZmlnIiBhbmQgbm9kZS5hcmdzIGFuZCBpc2luc3RhbmNlKG5vZGUuYXJnc1swXSwgVGFibGUpOgogICAgICAgICAgICBmaW5kaW5ncy5leHRlbmQoX3dhbGtfY29uZmlnX3RhYmxlKHNjaGVtYSwgbm9kZS5hcmdzWzBdLCAiIiwgbGluZSwgZGVmaW5lZF9uYW1lcykpCgogICAgZm9yIGtleXMsIGxpbmVzIGluIGJpbmRfa2V5X2xpbmVzLml0ZW1zKCk6CiAgICAgICAgaWYgbGVuKGxpbmVzKSA8IDI6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZm9yIHRoaXNfbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgb3RoZXJzID0gIiwgIi5qb2luKHN0cihsKSBmb3IgbCBpbiBsaW5lcyBpZiBsICE9IHRoaXNfbGluZSkKICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKEZpbmRpbmcoCiAgICAgICAgICAgICAgICBGaW5kaW5nS2luZC5EVVBMSUNBVEVfQklORCwgdGhpc19saW5lLAogICAgICAgICAgICAgICAgZiIne2tleXN9JyBpcyBib3VuZCBtb3JlIHRoYW4gb25jZSAoYWxzbyBhdCBsaW5lKHMpIHtvdGhlcnN9KSIsCiAgICAgICAgICAgICkpCgogICAgcmV0dXJuIGZpbmRpbmdzCgoKZGVmIGNoZWNrX3NvdXJjZShzY2hlbWE6IFNjaGVtYSwgc291cmNlOiBzdHIpIC0+IGxpc3RbRmluZGluZ106CiAgICB0cmVlID0gcmVhZGVyLnBhcnNlKHNvdXJjZSkKICAgIHJldHVybiBjaGVjayhzY2hlbWEsIHRyZWUpCg==", "hyprvalidate/converter/dispatch.py": "IiIiQmxvY2stdHlwZSBkaXNwYXRjaC4KCkdpdmVuIGEgaHlwcmxhbmcgYmxvY2sncyBuYW1lLCBkZWNpZGUgd2hldGhlciBpdCBiZWNvbWVzIGEgdG9wLWxldmVsCmBobC48bmFtZT4oc3BlYylgIGNhbGwgb3IgZmxhdHRlbnMgaW50byBgaGwuY29uZmlnKHsuLi59KWAncyBkb3R0ZWQta2V5CnNwYWNlLiBEZXJpdmVkIGxpdmUgZnJvbSB0aGUgc2NoZW1hIChgSEwuQVBJYCdzIG93biBmaWVsZHMpIHZpYSB0aGUgc2FtZQp3YWxrIGByZXNvbHZlX3N5bWJvbGAgYWxyZWFkeSB1c2VzIC0gbm90IGEgaGFuZC10eXBlZCB3aGl0ZWxpc3QuIGh5cHItbWlncmF0ZQpoYWQgdGhpcyBleGFjdCBpZGVhIChgS05PV05fU0VDVElPTlNgKSBhbmQgbmV2ZXIgd2lyZWQgaXQgaW47IGRlcml2aW5nIGl0CmxpdmUgbWVhbnMgaXQgY2FuJ3QgZ28gc3RhbGUgb3IgZ28gdW53aXJlZC4KCk9ubHkgZXhhY3QgbmFtZSBtYXRjaGVzIGFyZSByZXNvbHZlZCBoZXJlLiBBIGh5cHJsYW5nIGRpcmVjdGl2ZSB3aG9zZSBvbGQKbmFtZSBkb2Vzbid0IGxpdGVyYWxseSBtYXRjaCBpdHMgSEwuQVBJIGNvdW50ZXJwYXJ0IChlLmcuIGBsYXllcnJ1bGVgIHZzLgpgbGF5ZXJfcnVsZWApIGlzIGEgcmVuYW1lLCBub3QgYSBkaXNwYXRjaCBkZWNpc2lvbiAtIHRoYXQncyByZW5hbWUucHkncwpoYW5kLWN1cmF0ZWQsIHNjaGVtYS1jaGVja2VkIHRhYmxlLCBub3QgdGhpcyBtb2R1bGUncyBqb2IuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgpmcm9tIGh5cHJ2YWxpZGF0ZS5jaGVja2VyIGltcG9ydCBwYXJzZV9mdW5fc2lnbmF0dXJlCmZyb20gaHlwcnZhbGlkYXRlLnNjaGVtYS5leHRyYWN0b3IgaW1wb3J0IFNjaGVtYQoKCmRlZiBjbGFzc2lmeV9ibG9jayhzY2hlbWE6IFNjaGVtYSwgbmFtZTogc3RyKSAtPiBzdHIgfCBOb25lOgogICAgIiIiUmV0dXJucyB0aGUgZG90dGVkIHRhcmdldCAoImhsLjxuYW1lPiIpIGlmIGBuYW1lYCBtYXRjaGVzIGFuIEhMLkFQSQogICAgZmllbGQgdHlwZWQgYXMgYSBuYW1lZCBgZnVuKHNwZWM6IEhMLlNvbWVTcGVjKWAgc2lnbmF0dXJlIC0gaS5lLiB0aGlzCiAgICBoeXBybGFuZyBibG9jayBzaG91bGQgYmVjb21lIHRoYXQgdG9wLWxldmVsIGNhbGwuIFJldHVybnMgTm9uZSBpZiBpdAogICAgc2hvdWxkIGluc3RlYWQgZmxhdHRlbiBpbnRvIGhsLmNvbmZpZydzIGRvdHRlZC1rZXkgc3BhY2UgKGVpdGhlciBubwogICAgbWF0Y2hpbmcgZmllbGQgZXhpc3RzIGF0IGFsbCwgb3IgdGhlIGZpZWxkIGlzbid0IGEgc3BlYy1zaGFwZWQgY2FsbCkuIiIiCiAgICBhcGkgPSBzY2hlbWEuY2xhc3Nlcy5nZXQoIkhMLkFQSSIpCiAgICBpZiBhcGkgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHR5cGVfZXhwciA9IGFwaS5maWVsZHMuZ2V0KG5hbWUpCiAgICBpZiB0eXBlX2V4cHIgaXMgTm9uZSBvciBub3QgdHlwZV9leHByLnN0YXJ0c3dpdGgoImZ1bigiKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHNpZyA9IHBhcnNlX2Z1bl9zaWduYXR1cmUodHlwZV9leHByKQogICAgaWYgc2lnIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBoYXNfc3BlY19wYXJhbSA9IGFueShwLnR5cGVfZXhwciBpbiBzY2hlbWEuY2xhc3NlcyBmb3IgcCBpbiBzaWcucGFyYW1zKQogICAgcmV0dXJuIGYiaGwue25hbWV9IiBpZiBoYXNfc3BlY19wYXJhbSBlbHNlIE5vbmUK", "hyprvalidate/converter/coerce.py": "IiIiU2NoZW1hLXR5cGVkIHZhbHVlIGNvZXJjaW9uLgoKaHlwcmxhbmcgdmFsdWVzIGFyZSBhbHdheXMgcmF3IHN0cmluZ3M7IHRoZSB0YXJnZXQgc2NoZW1hIHNheXMgd2hhdCB0eXBlCnRoZXkgc2hvdWxkIGJlY29tZS4gVGhpcyBpcyB0aGUgZml4IGZvciB0aGUgZXhhY3QgYnVnIDMgb2YgNCBjb21wZXRpdG9yCnRvb2xzIG1hZGUgaW5kZXBlbmRlbnRseSAoYGFuaW1hdGlvbnMuZW5hYmxlZGAgZW1pdHRlZCBhcyB0aGUgKnN0cmluZyoKYCJ0cnVlImAgaW5zdGVhZCBvZiB0aGUgYm9vbGVhbiBgdHJ1ZWApIC0gY29lcmNlIGJ5IGxvb2tpbmcgdXAgdGhlIHRhcmdldApmaWVsZCdzIHJlYWwgdHlwZSwgbm90IGJ5IHN0cmluZy1zbmlmZmluZyB0aGUgdmFsdWUgaXRzZWxmLgoKT25seSByZWNvZ25pemVzIGh5cHJsYW5nJ3Mgb3duIGxpdGVyYWwgYm9vbGVhbiBzcGVsbGluZ3MgKCJ0cnVlIi8iZmFsc2UiLApjYXNlLWluc2Vuc2l0aXZlKSAtIG5vdCAieWVzIi8ib24iLyIxIiwgd2hpY2ggYXJlbid0IGNvbmZpcm1lZCBoeXBybGFuZwpsaXRlcmFscyBhbmQgd291bGQgYmUgYSBndWVzcy4gQSB2YWx1ZSB0aGF0IGRvZXNuJ3QgY29uZmlkZW50bHkgbWF0Y2ggYW55CnNjYWxhciBhbHRlcm5hdGl2ZSBpbiB0aGUgc2NoZW1hJ3MgdHlwZSBleHByZXNzaW9uIGlzIHBhc3NlZCB0aHJvdWdoIGFzIGEKc3RyaW5nIHVuY2hhbmdlZDsgdG9kby5weSBkZWNpZGVzIHdoYXQgdG8gZG8gd2l0aCBsb3ctY29uZmlkZW5jZSBjYXNlcywKdGhpcyBtb2R1bGUgbmV2ZXIgZ3Vlc3NlcyB0byBmb3JjZSBhIGNvZXJjaW9uLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSB0eXBpbmcgaW1wb3J0IEFueQoKCmRlZiBfdHJ5X2Jvb2wocmF3OiBzdHIpIC0+IGJvb2wgfCBOb25lOgogICAgbG93ZXJlZCA9IHJhdy5zdHJpcCgpLmxvd2VyKCkKICAgIGlmIGxvd2VyZWQgPT0gInRydWUiOgogICAgICAgIHJldHVybiBUcnVlCiAgICBpZiBsb3dlcmVkID09ICJmYWxzZSI6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfdHJ5X2ludChyYXc6IHN0cikgLT4gaW50IHwgTm9uZToKICAgIHRyeToKICAgICAgICByZXR1cm4gaW50KHJhdy5zdHJpcCgpKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgX3RyeV9udW1iZXIocmF3OiBzdHIpIC0+IGZsb2F0IHwgaW50IHwgTm9uZToKICAgIGFzX2ludCA9IF90cnlfaW50KHJhdykKICAgIGlmIGFzX2ludCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gYXNfaW50CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGZsb2F0KHJhdy5zdHJpcCgpKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpfQ09FUkNFUlMgPSB7CiAgICAiYm9vbGVhbiI6IF90cnlfYm9vbCwKICAgICJpbnRlZ2VyIjogX3RyeV9pbnQsCiAgICAibnVtYmVyIjogX3RyeV9udW1iZXIsCn0KCgpkZWYgY29lcmNlX3ZhbHVlKHR5cGVfZXhwcjogc3RyLCByYXc6IHN0cikgLT4gdHVwbGVbQW55LCBib29sXToKICAgICIiIlJldHVybnMgKHZhbHVlLCBtYXRjaGVkKS4gYG1hdGNoZWRgIGlzIFRydWUgd2hlbiBgcmF3YCBjb25maWRlbnRseQogICAgcGFyc2VkIGFzIG9uZSBvZiBgdHlwZV9leHByYCdzIHNjYWxhciBhbHRlcm5hdGl2ZXMgKGluIGRlY2xhcmVkIG9yZGVyIC0KICAgIHRoZSBmaXJzdCBhbHRlcm5hdGl2ZSB0aGF0IHBhcnNlcyB3aW5zKTsgRmFsc2UgbWVhbnMgbm8gc2NhbGFyCiAgICBhbHRlcm5hdGl2ZSBtYXRjaGVkIGFuZCBgcmF3YCB3YXMgcmV0dXJuZWQgdW5jaGFuZ2VkIGFzIGEgc3RyaW5nLiIiIgogICAgZm9yIGFsdCBpbiAoYS5zdHJpcCgpIGZvciBhIGluIHR5cGVfZXhwci5zcGxpdCgifCIpKToKICAgICAgICBjb2VyY2VyID0gX0NPRVJDRVJTLmdldChhbHQpCiAgICAgICAgaWYgY29lcmNlciBpcyBOb25lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHZhbHVlID0gY29lcmNlcihyYXcpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSwgVHJ1ZQogICAgcmV0dXJuIHJhdywgRmFsc2UK", "hyprvalidate/converter/rename.py": "IiIiRGlzcGF0Y2hlci9iaW5kLWZsYWcgcmVuYW1lIHRhYmxlcy4KCmh5cHJsYW5nJ3Mgb2xkIGRpc3BhdGNoZXIgbmFtZXMgYW5kIHNpbmdsZS1sZXR0ZXIgYmluZCBmbGFncyBkb24ndCBleGlzdCBpbgp0aGUgbmV3IEx1YSBzY2hlbWEgYXQgYWxsIC0gdGhlcmUncyBub3RoaW5nIHRvIGRlcml2ZSB0aGlzIGZyb20sIHVubGlrZSB0aGUKYmxvY2stZGlzcGF0Y2ggYW5kIHZhbHVlLWNvZXJjaW9uIGxvZ2ljIGVsc2V3aGVyZSBpbiB0aGlzIHBhY2thZ2UuIFRoZXNlCmFyZSBoYW5kLWN1cmF0ZWQgdGFibGVzLCB2ZXJpZmllZCBhZ2FpbnN0IHJlYWwgZXZpZGVuY2UgcmF0aGVyIHRoYW4gZ3Vlc3NlZDoKCiAgLSBESVNQQVRDSEVSX1JFTkFNRSB3YXMgYnVpbHQgYnkgcmVhZGluZyBIeXBybGFuZCdzIGFjdHVhbCBjdXJyZW50CiAgICBkaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uCiAgICAoc3JjL2NvbmZpZy9sdWEvYmluZGluZ3MvTHVhQmluZGluZ3NEaXNwYXRjaGVycy5jcHAsIGZ1bmN0aW9uIGJvZGllcyBmb3IKICAgIGhsV2luZG93TW92ZS9obEZvY3VzIGV0YywgZmV0Y2hlZCBhbmQgcmVhZCBkaXJlY3RseSkgdG8gY29uZmlybSBlYWNoIG9sZAogICAgZGlzcGF0Y2hlcidzIHJlYWwgbmV3IHRhcmdldCAtIG5vdCBjb3BpZWQgZnJvbSBhIGNvbXBldGl0b3IncyB0YWJsZS4KICAgIGh5cHJjb25mMmx1YSdzIG93biBESVNQQVRDSEVSX01BUCB3YXMgcmVhZCBmb3IgY29tcGFyaXNvbiBhbmQgaXMgTk9UIGEKICAgIHJlbGlhYmxlIHNvdXJjZTogY3Jvc3MtY2hlY2tpbmcgaXQgYWdhaW5zdCB0aGUgc2NoZW1hIGlzIGV4YWN0bHkgd2hhdAogICAgY2F1Z2h0IGl0cyBiaW5kLWZsYWcgdGFibGUncyBidWdzIGJlbG93LgogIC0gQklORF9GTEFHX1JFTkFNRSB3YXMgYnVpbHQgZnJvbSB0aGUgYXJjaGl2ZWQgSHlwcmxhbmQgMC41NC4wIHdpa2kncwogICAgIkJpbmQgZmxhZ3MiIHRhYmxlICh0aGUgbGFzdCB2ZXJzaW9uIGRvY3VtZW50aW5nIHRoZSBwcmUtTHVhIGh5cHJsYW5nCiAgICBmb3JtYXQsIGZldGNoZWQgZGlyZWN0bHkgLSB0aGUgY3VycmVudCB3aWtpIG9ubHkgZG9jdW1lbnRzIHRoZSBuZXcKICAgIGZvcm1hdCkgYW5kIGluZGVwZW5kZW50bHkgY3Jvc3MtY2hlY2tlZCBhZ2FpbnN0IGV2ZXJ5IGZpZWxkIEhMCiAgICAuQmluZE9wdGlvbnMgYWN0dWFsbHkgZGVjbGFyZXMgaW4gdGhlIGluc3RhbGxlZCBzdHViLgogICAgVGhpcyBjYXVnaHQgdHdvIGNvbmZpcm1lZCBtaXN0YWtlcyBvdGhlciB0b29scyBtYWRlIGZyb20gbWVtb3J5L2d1ZXNzaW5nOgogICAgICAtIGByYCBpcyAicmVsZWFzZSIsIG5vdCAicmVwZWF0IiAodGhhdCdzIGBlYCkgLSBoeXByY29uZjJsdWEncyBvd24KICAgICAgICBCSU5EX0ZMQUdTX1RPX09QVElPTlMgbWFwcyByIC0+ICJyZXBlYXRpbmciLCB3aGljaCBpcyB3cm9uZy4KICAgICAgLSBgbWAgKCJtb3VzZSIpIGhhcyBubyBjb3JyZXNwb25kaW5nIEhMLkJpbmRPcHRpb25zIGZpZWxkIGluIHRoZQogICAgICAgIGluc3RhbGxlZCBzdHViIGF0IGFsbCwgZGVzcGl0ZSB0aGUgKmN1cnJlbnQqIEx1YSB3aWtpJ3Mgb3duCiAgICAgICAgZXhhbXBsZXMgdXNpbmcgYHsgbW91c2UgPSB0cnVlIH1gIC0gYSByZWFsIGRvY3Mvc2NoZW1hCiAgICAgICAgZGlzY3JlcGFuY3ksIG5vdCBzb21ldGhpbmcgdG8gcGFwZXIgb3ZlciBieSBpbnZlbnRpbmcgYSBmaWVsZC4KICAgICAgICBUaGlzIHByb2plY3QgaGl0IHRoZSBzYW1lIHRyYXAgb25jZSBiZWZvcmUsIGluIGl0cyBvd24gZWFybGllcgogICAgICAgIGBtb3VzZWAtPmBkcmFnYCBidWcgLSBgZ2AgKCJkcmFnIikgaXMgdGhlIGZsYWcgdGhhdCBtYXBzIHRvCiAgICAgICAgdGhlIHJlYWwgYGRyYWdgIGZpZWxkOyBgbWAgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgb3V0IGhlcmUgcmF0aGVyCiAgICAgICAgdGhhbiBtYXBwZWQgdG8gYSBmaWVsZCB0aGF0IGRvZXNuJ3QgZXhpc3QuCgpUaHJlZSBvbGQgZmxhZ3MgYXJlIGRlbGliZXJhdGVseSBleGNsdWRlZCBmcm9tIEJJTkRfRkxBR19SRU5BTUUgYmVjYXVzZQp0aGV5IGNoYW5nZSB0aGUgKnNoYXBlKiBvZiB0aGUgYmluZCBjYWxsLCBub3QganVzdCBhIGJvb2xlYW4gb3B0aW9uLCBzbyBhCmxldHRlci0+ZmllbGQgdGFibGUgY2FuJ3QgcmVwcmVzZW50IHRoZW0gaG9uZXN0bHk6CiAgLSBgZGAgKCJoYXMgZGVzY3JpcHRpb24iKSAtIG9sZCBmb3JtYXQgaW5zZXJ0cyB0aGUgZGVzY3JpcHRpb24gYXMgYQogICAgcG9zaXRpb25hbCBhcmd1bWVudCAoYGJpbmRkID0gTU9ELCBLRVksIGRlc2NyaXB0aW9uLCBkaXNwYXRjaGVyLAogICAgcGFyYW1zYCksIGl0IGRvZXNuJ3QganVzdCB0b2dnbGUgYSBmbGFnLgogIC0gYHNgICgic2VwYXJhdGUiKSAtIGNoYW5nZXMgaG93IE1PRFMvS0VZIGNvbWJpbmUgaW50byBtdWx0aXBsZSBiaW5kcywKICAgIG5vdCBhIHBlci1iaW5kIG9wdGlvbiBmaWVsZCBhdCBhbGwgKG5vIG1hdGNoaW5nIEhMLkJpbmRPcHRpb25zIGZpZWxkCiAgICBleGlzdHMpLgogIC0gYG1gICgibW91c2UiKSAtIHNlZSBhYm92ZTsgdGhlIHJlYWwgcmVwbGFjZW1lbnQgaXMgdGhlIGBnYC9gZHJhZ2AKICAgIGZpZWxkIHBsdXMgdXNpbmcgYGhsLmRzcC53aW5kb3cuZHJhZygpYC9gcmVzaXplKClgIGFzIHRoZSBkaXNwYXRjaGVyLAogICAgbm90IGEgZmxhZyByZW5hbWUuClRoZXNlIHN1cmZhY2UgdGhyb3VnaCB0aGlzIHBhY2thZ2UncyBsb3ctY29uZmlkZW5jZSBUT0RPIGVtaXNzaW9uIChzZWUKdG9kby5weSkgaW5zdGVhZCBvZiBhIHNpbGVudCAoYW5kIHdyb25nKSBndWVzcy4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCiMgT2xkIGRpc3BhdGNoZXIgbmFtZSAtPiBuZXcgZG90dGVkIGhsLmRzcC4qIHRhcmdldC4gQXJndW1lbnQtc2hhcGUKIyB0cmFuc2xhdGlvbiAoZS5nLiBtb3ZldG93b3Jrc3BhY2UncyBwb3NpdGlvbmFsIHdvcmtzcGFjZSBhcmcgYmVjb21pbmcKIyBgeyB3b3Jrc3BhY2UgPSAuLi4sIGZvbGxvdyA9IGZhbHNlIH1gKSBpcyB0aGUgbWFwcGVyJ3Mgam9iIHdoZW4gaXQgYnVpbGRzCiMgdGhlIGNhbGwsIG5vdCB0aGlzIHRhYmxlJ3MgLSB0aGlzIG9ubHkgYW5zd2VycyAid2hpY2ggZnVuY3Rpb24iLgpESVNQQVRDSEVSX1JFTkFNRTogZGljdFtzdHIsIHN0cl0gPSB7CiAgICAia2lsbGFjdGl2ZSI6ICJobC5kc3Aud2luZG93LmNsb3NlIiwKICAgICJ0b2dnbGVmbG9hdGluZyI6ICJobC5kc3Aud2luZG93LmZsb2F0IiwKICAgICJmdWxsc2NyZWVuIjogImhsLmRzcC53aW5kb3cuZnVsbHNjcmVlbiIsCiAgICAicGluIjogImhsLmRzcC53aW5kb3cucGluIiwKICAgICJtb3ZlZm9jdXMiOiAiaGwuZHNwLmZvY3VzIiwKICAgICJ3b3Jrc3BhY2UiOiAiaGwuZHNwLmZvY3VzIiwKICAgICJtb3ZldG93b3Jrc3BhY2UiOiAiaGwuZHNwLndpbmRvdy5tb3ZlIiwKICAgICJtb3ZldG93b3Jrc3BhY2VzaWxlbnQiOiAiaGwuZHNwLndpbmRvdy5tb3ZlIiwKICAgICJ0b2dnbGVzcGVjaWFsd29ya3NwYWNlIjogImhsLmRzcC53b3Jrc3BhY2UudG9nZ2xlX3NwZWNpYWwiLAogICAgIm1vdmV3aW5kb3ciOiAiaGwuZHNwLndpbmRvdy5tb3ZlIiwKICAgICJyZXNpemV3aW5kb3ciOiAiaGwuZHNwLndpbmRvdy5yZXNpemUiLAogICAgImV4ZWMiOiAiaGwuZHNwLmV4ZWNfY21kIiwKICAgICJleGl0IjogImhsLmRzcC5leGl0IiwKICAgICJzdWJtYXAiOiAiaGwuZHNwLnN1Ym1hcCIsCiAgICAiZ2xvYmFsIjogImhsLmRzcC5nbG9iYWwiLAp9CgojIE9sZCBzaW5nbGUtbGV0dGVyIGJpbmQgZmxhZyAtPiByZWFsIEhMLkJpbmRPcHRpb25zIGZpZWxkIG5hbWUuCkJJTkRfRkxBR19SRU5BTUU6IGRpY3Rbc3RyLCBzdHJdID0gewogICAgImwiOiAibG9ja2VkIiwKICAgICJyIjogInJlbGVhc2UiLAogICAgImMiOiAiY2xpY2siLAogICAgImciOiAiZHJhZyIsCiAgICAibyI6ICJsb25nX3ByZXNzIiwKICAgICJlIjogInJlcGVhdGluZyIsCiAgICAibiI6ICJub25fY29uc3VtaW5nIiwKICAgICJ0IjogInRyYW5zcGFyZW50IiwKICAgICJpIjogImlnbm9yZV9tb2RzIiwKICAgICJwIjogImRvbnRfaW5oaWJpdCIsCiAgICAidSI6ICJzdWJtYXBfdW5pdmVyc2FsIiwKfQoKIyBPbGQgZmxhZ3MgdGhhdCBjaGFuZ2UgdGhlIGJpbmQgY2FsbCdzIHNoYXBlIHJhdGhlciB0aGFuIHRvZ2dsaW5nIGEgZmllbGQgLQojIHNlZSBtb2R1bGUgZG9jc3RyaW5nLiBLZXB0IGhlcmUgKG5vdCBqdXN0IGFic2VudCBmcm9tIHRoZSB0YWJsZSBhYm92ZSkgc28KIyB0b2RvLnB5IGNhbiByZWNvZ25pemUgInRoaXMgZmxhZyBpcyBrbm93biBidXQgdW5zdXBwb3J0ZWQiIGFuZCBzYXkgc28sCiMgaW5zdGVhZCBvZiBzaWxlbnRseSB0cmVhdGluZyBpdCBhcyAidW5rbm93biBmbGFnLCBndWVzcyBzb21ldGhpbmciLgpTSEFQRV9DSEFOR0lOR19CSU5EX0ZMQUdTOiBkaWN0W3N0ciwgc3RyXSA9IHsKICAgICJkIjogImhhcyBkZXNjcmlwdGlvbiAtIGluc2VydHMgZGVzY3JpcHRpb24gYXMgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBub3QgYSBmbGFnIiwKICAgICJzIjogInNlcGFyYXRlIC0gY29tYmluZXMgbW9kcy9rZXlzIGludG8gbXVsdGlwbGUgYmluZHMsIG5vdCBhIHBlci1iaW5kIG9wdGlvbiIsCiAgICAibSI6ICJtb3VzZSAtIG5vIG1hdGNoaW5nIEhMLkJpbmRPcHRpb25zIGZpZWxkOyB1c2UgdGhlICdnJy9kcmFnIGZpZWxkIGFuZCBhIG1vdXNlIGRpc3BhdGNoZXIgaW5zdGVhZCIsCn0K", "hyprvalidate/converter/todo.py": "IiIiTG93LWNvbmZpZGVuY2UgVE9ETyBlbWlzc2lvbi4KCkFueXRoaW5nIHRoZSBtYXBwZXIgY2FuJ3QgcmVzb2x2ZSB3aXRoIGZ1bGwgY29uZmlkZW5jZSAtIGFuIG9sZCBkaXNwYXRjaGVyCm5hbWUgbm90IGluIERJU1BBVENIRVJfUkVOQU1FLCBhIGJpbmQgZmxhZyB0aGF0IGNoYW5nZXMgdGhlIGJpbmQncyBzaGFwZQoob3IgaXNuJ3QgcmVjb2duaXplZCBhdCBhbGwpLCBhIGBzb3VyY2VgIGRpcmVjdGl2ZSAod2hpY2ggcmVmZXJlbmNlcwphbm90aGVyIGZpbGUgdGhlIGNvbnZlcnRlciBkb2Vzbid0IGlubGluZSkgLSBiZWNvbWVzIGEgY2xlYXJseS1tYXJrZWQKY29tbWVudCBpbiB0aGUgb3V0cHV0LiBOZXZlciBhIHNpbGVudCBndWVzczogdGhpcyBpcyB0aGUgc2luZ2xlIGJpZ2dlc3QKZGlmZmVyZW50aWF0b3IgZnJvbSB0aGUgZm91ciBleGlzdGluZyB0b29scyBmb3VuZCBieSByZWFkaW5nIHRoZWlyIGNvZGUKZWFybGllciBpbiB0aGlzIHByb2plY3QgKEVJb25UdXNrJ3MgZG9lcyB0aGlzIHJlYXNvbmFibHksIHRoZSBvdGhlciB0aHJlZQpkb24ndCkuCgpgbHVhcGFyc2VyYCdzIHByaW50ZXIgKGNvbmZpcm1lZCBieSByZWFkaW5nIHByaW50ZXJzLnB5KSBoYXMgbm8gdmlzaXRvcgpmb3IgYGFzdG5vZGVzLkNvbW1lbnRgIGF0IGFsbCAtIGl0IGNhbid0IHJvdW5kLXRyaXAgdGhyb3VnaCB0aGUgQVNUL3dyaXRlcgpwYXRoIHRoZSB3YXkgcmVhbCBzdGF0ZW1lbnRzIGRvLiBUT0RPIG5vdGVzIGFyZSB0aGVyZWZvcmUgcGxhaW4gdGV4dCwKam9pbmVkIHdpdGggcmVuZGVyZWQgc3RhdGVtZW50IHNvdXJjZSBieSBgcmVuZGVyX3Byb2dyYW1gLCBub3QgQVNUIG5vZGVzLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCgpmcm9tIC5yZW5hbWUgaW1wb3J0IEJJTkRfRkxBR19SRU5BTUUsIERJU1BBVENIRVJfUkVOQU1FLCBTSEFQRV9DSEFOR0lOR19CSU5EX0ZMQUdTCmZyb20gLi5sdWFhc3Qud3JpdGVyIGltcG9ydCBjaHVuaywgdG9fc291cmNlCgoKQGRhdGFjbGFzcwpjbGFzcyBUb2RvTm90ZToKICAgIHJlYXNvbjogc3RyCiAgICBkZXRhaWw6IHN0cgogICAgbGluZTogaW50IHwgTm9uZQoKCmRlZiBmb3JtYXRfdG9kbyhub3RlOiBUb2RvTm90ZSkgLT4gc3RyOgogICAgbG9jID0gZiIgKGh5cHJsYW5kLmNvbmYgbGluZSB7bm90ZS5saW5lfSkiIGlmIG5vdGUubGluZSBpcyBub3QgTm9uZSBlbHNlICIiCiAgICByZXR1cm4gZiItLSBUT0RPKGh5cHJ2YWxpZGF0ZSBjb252ZXJ0KToge25vdGUuZGV0YWlsfXtsb2N9IgoKCmRlZiBjaGVja19kaXNwYXRjaGVyKG5hbWU6IHN0ciwgbGluZTogaW50IHwgTm9uZSA9IE5vbmUpIC0+IFRvZG9Ob3RlIHwgTm9uZToKICAgIGlmIG5hbWUgaW4gRElTUEFUQ0hFUl9SRU5BTUU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBUb2RvTm90ZSgKICAgICAgICAidW5yZWNvZ25pemVkX2Rpc3BhdGNoZXIiLAogICAgICAgIGYidW5yZWNvZ25pemVkIG9sZCBkaXNwYXRjaGVyICd7bmFtZX0nIC0gbm8gY29uZmlkZW50IHJlbmFtZSwgY29udmVydCBtYW51YWxseSIsCiAgICAgICAgbGluZSwKICAgICkKCgpkZWYgY2hlY2tfYmluZF9mbGFnKGZsYWc6IHN0ciwgbGluZTogaW50IHwgTm9uZSA9IE5vbmUpIC0+IFRvZG9Ob3RlIHwgTm9uZToKICAgIGlmIGZsYWcgaW4gQklORF9GTEFHX1JFTkFNRToKICAgICAgICByZXR1cm4gTm9uZQogICAgaWYgZmxhZyBpbiBTSEFQRV9DSEFOR0lOR19CSU5EX0ZMQUdTOgogICAgICAgIHJldHVybiBUb2RvTm90ZSgKICAgICAgICAgICAgInVuc3VwcG9ydGVkX2JpbmRfZmxhZyIsCiAgICAgICAgICAgIGYiYmluZCBmbGFnICd7ZmxhZ30nICh7U0hBUEVfQ0hBTkdJTkdfQklORF9GTEFHU1tmbGFnXX0pIGNoYW5nZXMgdGhlICIKICAgICAgICAgICAgZiJiaW5kJ3Mgc2hhcGUgLSBub3QgYXV0by1jb252ZXJ0ZWQsIGNvbnZlcnQgbWFudWFsbHkiLAogICAgICAgICAgICBsaW5lLAogICAgICAgICkKICAgIHJldHVybiBUb2RvTm90ZSgKICAgICAgICAidW5rbm93bl9iaW5kX2ZsYWciLAogICAgICAgIGYidW5rbm93biBiaW5kIGZsYWcgJ3tmbGFnfScgLSBub3QgYSByZWNvZ25pemVkIGh5cHJsYW5nIGZsYWcsIGNvbnZlcnQgbWFudWFsbHkiLAogICAgICAgIGxpbmUsCiAgICApCgoKZGVmIGNoZWNrX3NvdXJjZV9kaXJlY3RpdmUocGF0aDogc3RyLCBsaW5lOiBpbnQgfCBOb25lID0gTm9uZSkgLT4gVG9kb05vdGU6CiAgICByZXR1cm4gVG9kb05vdGUoCiAgICAgICAgInNvdXJjZV9kaXJlY3RpdmUiLAogICAgICAgIGYic291cmNlID0ge3BhdGh9IC0gc291cmNlZCBmaWxlcyBhcmVuJ3QgaW5saW5lZCBieSB0aGUgY29udmVydGVyLCAiCiAgICAgICAgZiJjb252ZXJ0IGFuZCBpbmNsdWRlIHRoYXQgZmlsZSBzZXBhcmF0ZWx5IiwKICAgICAgICBsaW5lLAogICAgKQoKCmRlZiByZW5kZXJfcHJvZ3JhbShpdGVtcykgLT4gc3RyOgogICAgIiIiYGl0ZW1zYCBpcyBhbiBpdGVyYWJsZSBvZiAobm9kZV9vcl9ub25lLCBub3RlX29yX25vbmUpIHBhaXJzLiBBIG5vdGUKICAgIHJlbmRlcnMgYXMgYSBjb21tZW50IGxpbmU7IGEgbm9kZSByZW5kZXJzIGFzIGl0cyBvd24gc3RhdGVtZW50LiBCb3RoCiAgICBtYXkgYmUgcHJlc2VudCAoYSBiZXN0LWVmZm9ydCBzdGF0ZW1lbnQgc3RpbGwgZmxhZ2dlZCBmb3IgcmV2aWV3KSwgb3IKICAgIGp1c3Qgb25lLiIiIgogICAgbGluZXM6IGxpc3Rbc3RyXSA9IFtdCiAgICBmb3Igbm9kZSwgbm90ZSBpbiBpdGVtczoKICAgICAgICBpZiBub3RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZm9ybWF0X3RvZG8obm90ZSkpCiAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKHRvX3NvdXJjZShjaHVuayhbbm9kZV0pKSkKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpCg==", "hyprvalidate/converter/mapper.py": "IiIiU2NoZW1hLWRyaXZlbiBtYXBwZXI6IGh5cHJsYW5nIEFTVCAtPiBMdWEgc291cmNlLgoKVGllcyB0b2dldGhlciBkaXNwYXRjaC5weSwgY29lcmNlLnB5LCByZW5hbWUucHksIGFuZCB0b2RvLnB5IGludG8KYGNvbnZlcnQoc2NoZW1hLCBoeXBybGFuZ19maWxlKSAtPiBzdHJgLgoKU2NvcGUsIHN0YXRlZCBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGxlZnQgaW1wbGljaXQ6IHRoaXMgbWFwcyB0aGUKY29uc3RydWN0cyB0aGUgcHJvamVjdCdzIG93biByZWFsIGh5cHJsYW5kLmNvbmYgYWN0dWFsbHkgdXNlcyAoY29uZmlnCnNlY3Rpb25zLCBkZXZpY2UgYmxvY2tzLCBnZXN0dXJlL21vbml0b3IgZGlyZWN0aXZlcywgdGhlIGJpbmQgZmFtaWx5LCBleGVjLwpleGl0L3N1Ym1hcC9nbG9iYWwgZGlzcGF0Y2hlcnMsIHdpbmRvdyBydWxlcywgc291cmNlKS4gRGlzcGF0Y2hlciBhbmQKZGlyZWN0aXZlIHNoYXBlcyBub3QgZXhlcmNpc2VkIGJ5IHRoYXQgZmlsZSAoZS5nLiBgcGVybWlzc2lvbmAsIG1vc3QKYGxheWVycnVsZWAvYHdvcmtzcGFjZV9ydWxlYCBmb3JtcywgYGZ1bGxzY3JlZW5gIHdpdGggYW4gZXhwbGljaXQgbW9kZSkgYXJlCm5vdCBtb2RlbGVkIGhlcmUgLSBhbnl0aGluZyB0aGUgbWFwcGVyIGRvZXNuJ3QgcmVjb2duaXplIGJlY29tZXMgYQpsb3ctY29uZmlkZW5jZSBUT0RPIChzZWUgdG9kby5weSksIG5ldmVyIGEgZ3Vlc3MuCgpUd28gYXJndW1lbnQtc2hhcGUgZmFjdHMgY2FtZSBmcm9tIHJlYWRpbmcgSHlwcmxhbmQncyBhY3R1YWwgY3VycmVudApkaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5IChMdWFCaW5kaW5nc0Rpc3BhdGNoZXJzLmNwcCksIG5vdApndWVzc2VkOgogIC0gYGhsLmRzcC5mb2N1cyh7ZGlyZWN0aW9uID0gLi4ufSlgIHJlcGxhY2VzIGJvdGggb2xkIGBtb3ZlZm9jdXNgIChhCiAgICBkaXJlY3Rpb24gbGV0dGVyL3dvcmQpIGFuZCBvbGQgYHdvcmtzcGFjZWAgKGEgd29ya3NwYWNlIHNlbGVjdG9yLCB2aWEKICAgIGB7d29ya3NwYWNlID0gLi4ufWApIC0gYm90aCBnbyB0aHJvdWdoIHRoZSBzYW1lIGVudHJ5IHBvaW50LAogICAgZGlzdGluZ3Vpc2hlZCBvbmx5IGJ5IHdoaWNoIHRhYmxlIGtleSBpcyBzZXQuCiAgLSBvbGQgYG1vdmV3aW5kb3dgL2ByZXNpemV3aW5kb3dgIHVzZWQgdmlhIGBiaW5kbWAgKGEgbW91c2UgYmluZCB3aXRoIG5vCiAgICBkaXNwYXRjaGVyIHBhcmFtcykgbWFwIHRvIGBobC5kc3Aud2luZG93LmRyYWcoKWAvYHJlc2l6ZSgpYCBzcGVjaWZpY2FsbHkKICAgIC0gTk9UIGBobC5kc3Aud2luZG93Lm1vdmUoKWAgLSBiZWNhdXNlIGEgYmluZG0gbW91c2UtZHJhZyBiaW5kIGhhcyBhCiAgICAgIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHNoYXBlIGZyb20gYSBrZXlib2FyZCBkaXJlY3Rpb24gYmluZCwgZXZlbgogICAgICB0aG91Z2ggYm90aCBkaXNwYXRjaGVycyBzaGFyZSB0aGUgb2xkIG5hbWUgYG1vdmV3aW5kb3dgLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSAuLmh5cHJsYW5nLnBhcnNlciBpbXBvcnQgQmxvY2ssIERpcmVjdGl2ZSwgSHlwcmxhbmdGaWxlLCBWYXJpYWJsZUFzc2lnbiwgV2luZG93UnVsZQpmcm9tIC4ubHVhYXN0LndyaXRlciBpbXBvcnQgYW5vbl9mdW5jdGlvbiwgaGxjYWxsCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwoKZnJvbSAuLmNoZWNrZXIgaW1wb3J0IF9oYXNfdGFibGVfYWx0ZXJuYXRpdmUsIF9zY2FsYXJfa2luZF9tYXRjaGVzCmZyb20gLmNvZXJjZSBpbXBvcnQgY29lcmNlX3ZhbHVlCmZyb20gLmRpc3BhdGNoIGltcG9ydCBjbGFzc2lmeV9ibG9jawpmcm9tIC5yZW5hbWUgaW1wb3J0IEJJTkRfRkxBR19SRU5BTUUsIERJU1BBVENIRVJfUkVOQU1FCmZyb20gLnRvZG8gaW1wb3J0IFRvZG9Ob3RlLCBjaGVja19iaW5kX2ZsYWcsIGNoZWNrX2Rpc3BhdGNoZXIsIGNoZWNrX3NvdXJjZV9kaXJlY3RpdmUsIHJlbmRlcl9wcm9ncmFtCgojIE1vZHVsZSBuYW1lcyBmb3IgLS1zcGxpdCBvdXRwdXQuIENob3NlbiB0byBtYXRjaCB0aGUgaGFuZC1taWdyYXRpb24gdGhhdAojIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHByb2plY3QncyBvd24gY29uZmlnIChjb25maWdzL2h5cHJsYW5kLWx1YS8qLmx1YSksCiMgd2hpY2ggaXMgdGhlIG9ubHkgd29ya2VkIGV4YW1wbGUgb2YgImNvcnJlY3RseSBtb2R1bGFyaXplZCIgYXZhaWxhYmxlLgpNX0VOVFJZID0gImh5cHJsYW5kIiAgICAgICAgIyB0aGUgcmVxdWlyZSgpLWluZyBlbnRyeSBwb2ludApNX1BMVUdJTlMgPSAicGx1Z2lucyIKTV9NT05JVE9SUyA9ICJtb25pdG9ycyIKTV9ERVZJQ0VTID0gImRldmljZXMiCk1fQVVUT1NUQVJUID0gImF1dG9zdGFydCIKTV9FTlYgPSAiZW52IgpNX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zIgpNX0FQUEVBUkFOQ0UgPSAiYXBwZWFyYW5jZSIKTV9JTlBVVCA9ICJpbnB1dCIKTV9LRVlCSU5EUyA9ICJrZXliaW5kcyIKTV9XSU5ET1dSVUxFUyA9ICJ3aW5kb3dydWxlcyIKTV9PVEhFUiA9ICJvdGhlciIKCiMgaHlwcmxhbmcgZGlyZWN0aXZlIGtleSAtPiBtb2R1bGUuIGBiaW5kKmAgaXMgaGFuZGxlZCBieSBwcmVmaXgsIG5vdCBoZXJlLgpfRElSRUNUSVZFX01PRFVMRSA9IHsKICAgICJtb25pdG9yIjogTV9NT05JVE9SUywKICAgICJnZXN0dXJlIjogTV9JTlBVVCwKICAgICJleGVjLW9uY2UiOiBNX0FVVE9TVEFSVCwKICAgICJleGVjIjogTV9BVVRPU1RBUlQsCiAgICAiZW52IjogTV9FTlYsCiAgICAiZW52ZCI6IE1fRU5WLAogICAgInBlcm1pc3Npb24iOiBNX1BFUk1JU1NJT05TLAogICAgIndpbmRvd3J1bGUiOiBNX1dJTkRPV1JVTEVTLAogICAgIndpbmRvd3J1bGV2MiI6IE1fV0lORE9XUlVMRVMsCiAgICAibGF5ZXJydWxlIjogImxheWVycnVsZXMiLAogICAgIndvcmtzcGFjZSI6ICJ3b3Jrc3BhY2VydWxlcyIsCiAgICAic291cmNlIjogTV9FTlRSWSwKfQoKIyBoeXBybGFuZyBjb25maWctc2VjdGlvbiBuYW1lIC0+IG1vZHVsZSwgZm9yIHRoZSBzZWN0aW9ucyB3aGVyZSBncm91cGluZwojIHNldmVyYWwgdW5kZXIgb25lIGZpbGUgbWF0Y2hlcyBob3cgcGVvcGxlIGFjdHVhbGx5IHRoaW5rIGFib3V0IHRoZW0KIyAoZXZlcnl0aGluZyB2aXN1YWwgdG9nZXRoZXIsIGV0YykuIEFueSBzZWN0aW9uIE5PVCBsaXN0ZWQgaGVyZSBnZXRzIGl0cwojIG93biBmaWxlIG5hbWVkIGFmdGVyIHRoZSBzZWN0aW9uIC0gZGV0ZXJtaW5pc3RpYywgYW5kIGF2b2lkcyBpbnZlbnRpbmcgYQojIHRheG9ub215IGZvciBzZWN0aW9ucyB0aGlzIHByb2plY3QgaGFzIG5vIHdvcmtlZCBleGFtcGxlIG9mLgpfQ09ORklHX1NFQ1RJT05fTU9EVUxFID0gewogICAgImdlbmVyYWwiOiBNX0FQUEVBUkFOQ0UsCiAgICAiZGVjb3JhdGlvbiI6IE1fQVBQRUFSQU5DRSwKICAgICJhbmltYXRpb25zIjogTV9BUFBFQVJBTkNFLAogICAgIm1hc3RlciI6IE1fQVBQRUFSQU5DRSwKICAgICJkd2luZGxlIjogTV9BUFBFQVJBTkNFLAogICAgIm1pc2MiOiBNX0FQUEVBUkFOQ0UsCiAgICAiZ3JvdXAiOiBNX0FQUEVBUkFOQ0UsCiAgICAiY3Vyc29yIjogTV9BUFBFQVJBTkNFLAogICAgImlucHV0IjogTV9JTlBVVCwKICAgICJnZXN0dXJlcyI6IE1fSU5QVVQsCiAgICAiYmluZHMiOiBNX0tFWUJJTkRTLAogICAgImVjb3N5c3RlbSI6IE1fUEVSTUlTU0lPTlMsCiAgICAicGx1Z2luIjogTV9QTFVHSU5TLAp9CgojIEEgYmxvY2sgdGhhdCBiZWNvbWVzIGEgdG9wLWxldmVsIGhsLlgoc3BlYykgY2FsbCAocGVyIGRpc3BhdGNoLnB5KSAtPiBtb2R1bGUuCl9TUEVDX0JMT0NLX01PRFVMRSA9IHsKICAgICJkZXZpY2UiOiBNX0RFVklDRVMsCiAgICAibW9uaXRvciI6IE1fTU9OSVRPUlMsCiAgICAiZ2VzdHVyZSI6IE1fSU5QVVQsCiAgICAicGVybWlzc2lvbiI6IE1fUEVSTUlTU0lPTlMsCiAgICAid2luZG93X3J1bGUiOiBNX1dJTkRPV1JVTEVTLAogICAgImxheWVyX3J1bGUiOiAibGF5ZXJydWxlcyIsCiAgICAid29ya3NwYWNlX3J1bGUiOiAid29ya3NwYWNlcnVsZXMiLAp9CgoKQGRhdGFjbGFzcwpjbGFzcyBDb252ZXJ0ZWRJdGVtOgogICAgIiIiT25lIGVtaXR0ZWQgc3RhdGVtZW50LCB0YWdnZWQgZm9yIG1vZHVsZSBhc3NpZ25tZW50LiBgbGluZWAgaXMgdGhlCiAgICBvcmlnaW5hbCBoeXBybGFuZyBzb3VyY2UgbGluZSwgdXNlZCB0byBvcmRlciBtb2R1bGVzIGluIHRoZSBlbnRyeSBmaWxlCiAgICBzbyB0aGUgb3V0cHV0IHJlYWRzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBpbnB1dCBkaWQuIiIiCiAgICBub2RlOiBvYmplY3QgfCBOb25lCiAgICBub3RlOiBUb2RvTm90ZSB8IE5vbmUKICAgIG1vZHVsZTogc3RyCiAgICBsaW5lOiBpbnQgfCBOb25lCgoKZGVmIF9kaXJlY3RpdmVfbW9kdWxlKGtleTogc3RyKSAtPiBzdHI6CiAgICBpZiBrZXkuc3RhcnRzd2l0aCgiYmluZCIpOgogICAgICAgIHJldHVybiBNX0tFWUJJTkRTCiAgICByZXR1cm4gX0RJUkVDVElWRV9NT0RVTEUuZ2V0KGtleSwgTV9PVEhFUikKCgpkZWYgX2NvbmZpZ19zZWN0aW9uX21vZHVsZShzZWN0aW9uOiBzdHIpIC0+IHN0cjoKICAgIHJldHVybiBfQ09ORklHX1NFQ1RJT05fTU9EVUxFLmdldChzZWN0aW9uLCBzZWN0aW9uKQoKCmRlZiBfc3BlY19ibG9ja19tb2R1bGUoYmxvY2tfbmFtZTogc3RyKSAtPiBzdHI6CiAgICByZXR1cm4gX1NQRUNfQkxPQ0tfTU9EVUxFLmdldChibG9ja19uYW1lLCBibG9ja19uYW1lKQoKCmRlZiBfY29lcmNlX29yX25vdGUodHlwZV9leHByOiBzdHIsIHJhdzogc3RyLCBub3RlczogbGlzdFtUb2RvTm90ZV0sIGtleV9uYW1lOiBzdHIsIGxpbmU6IGludCB8IE5vbmUpOgogICAgIiIiV3JhcHMgY29lcmNlX3ZhbHVlIHdpdGggdGhlIHNhbWUgc2VsZi1jaGVjayB0aGUgQ0xJIHJlcXVpcmVzIG9mIHRoZQogICAgd2hvbGUgY29udmVydGVyOiBpZiB0aGUgcmF3IHZhbHVlIGNhbid0IGJlIGNvbmZpZGVudGx5IGNvZXJjZWQgQU5EIGEKICAgIHBsYWluIHN0cmluZyB3b3VsZG4ndCBzYXRpc2Z5IHRoZSBzY2hlbWEgdHlwZSBlaXRoZXIsIHRoYXQncyBhIHJlYWwKICAgIG1pc21hdGNoIChlLmcuIHRoZSByZWFsIGNvbmZpZydzIG93biBqb2tlIHZhbHVlLAogICAgYGFuaW1hdGlvbnMgeyBlbmFibGVkID0geWVzLCBwbGVhc2UgOikgfWAsIGlzbid0IGEgdmFsaWQgYm9vbGVhbikgLQogICAgZmxhZyBpdCBpbnN0ZWFkIG9mIHNpbGVudGx5IGVtaXR0aW5nIGEgdmFsdWUgdGhlIHZhbGlkYXRvciB3b3VsZCBmbGFnLiIiIgogICAgdmFsdWUsIG1hdGNoZWQgPSBjb2VyY2VfdmFsdWUodHlwZV9leHByLCByYXcpCiAgICBpZiBub3QgbWF0Y2hlZCBhbmQgbm90IF9zY2FsYXJfa2luZF9tYXRjaGVzKCJzdHJpbmciLCB0eXBlX2V4cHIpIGFuZCBub3QgX2hhc190YWJsZV9hbHRlcm5hdGl2ZSh0eXBlX2V4cHIpOgogICAgICAgIG5vdGVzLmFwcGVuZChUb2RvTm90ZSgKICAgICAgICAgICAgInZhbHVlX3R5cGVfbWlzbWF0Y2giLAogICAgICAgICAgICBmIid7a2V5X25hbWV9JyA9ICd7cmF3fScgZG9lc24ndCBjb25maWRlbnRseSBtYXRjaCBpdHMgZXhwZWN0ZWQgdHlwZSAoe3R5cGVfZXhwcn0pIiwKICAgICAgICAgICAgbGluZSwKICAgICAgICApKQogICAgcmV0dXJuIHZhbHVlCgoKZGVmIF9iZXN0X2VmZm9ydF9zY2FsYXIocmF3OiBzdHIpOgogICAgbG93ZXJlZCA9IHJhdy5zdHJpcCgpLmxvd2VyKCkKICAgIGlmIGxvd2VyZWQgPT0gInRydWUiOgogICAgICAgIHJldHVybiBUcnVlCiAgICBpZiBsb3dlcmVkID09ICJmYWxzZSI6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gcmF3CgoKZGVmIF9idWlsZF9rZXlzX3N0cmluZyhtb2RzOiBzdHIsIGtleXN5bTogc3RyKSAtPiBzdHI6CiAgICBwYXJ0cyA9IFttIGZvciBtIGluIG1vZHMuc3BsaXQoKSBpZiBtXSBpZiBtb2RzIGVsc2UgW10KICAgIHBhcnRzLmFwcGVuZChrZXlzeW0pCiAgICByZXR1cm4gIiArICIuam9pbihwYXJ0cykKCgpkZWYgX2J1aWxkX2Rpc3BhdGNoZXJfY2FsbChuYW1lOiBzdHIsIHJlc3Q6IGxpc3Rbc3RyXSwgbGluZTogaW50IHwgTm9uZSk6CiAgICAiIiJSZXR1cm5zIChub2RlX29yX25vbmUsIG5vdGVfb3Jfbm9uZSkgZm9yIGEgZGlzcGF0Y2hlciBjYWxsIGJ1aWx0IGZyb20KICAgIGl0cyBvbGQgbmFtZSBhbmQgcmVtYWluaW5nIChhbHJlYWR5IGNvbW1hLXNwbGl0KSBhcmdzLiIiIgogICAgaWYgbmFtZSBub3QgaW4gRElTUEFUQ0hFUl9SRU5BTUU6CiAgICAgICAgcmV0dXJuIE5vbmUsIGNoZWNrX2Rpc3BhdGNoZXIobmFtZSwgbGluZSkKCiAgICB0YXJnZXQgPSBESVNQQVRDSEVSX1JFTkFNRVtuYW1lXQoKICAgIGlmIG5hbWUgaW4gKCJraWxsYWN0aXZlIiwgInRvZ2dsZWZsb2F0aW5nIiwgInBpbiIsICJleGl0Iik6CiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQpLCBOb25lCgogICAgaWYgbmFtZSA9PSAiZXhlYyI6CiAgICAgICAgaWYgbm90IHJlc3Q6CiAgICAgICAgICAgIHJldHVybiBOb25lLCBUb2RvTm90ZSgibWFsZm9ybWVkX2V4ZWMiLCAiZXhlYyBkaXNwYXRjaGVyIHdpdGggbm8gY29tbWFuZCIsIGxpbmUpCiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsICIsICIuam9pbihyZXN0KSksIE5vbmUKCiAgICBpZiBuYW1lIGluICgic3VibWFwIiwgImdsb2JhbCIpOgogICAgICAgIGlmIG5vdCByZXN0OgogICAgICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoZiJtYWxmb3JtZWRfe25hbWV9IiwgZiJ7bmFtZX0gZGlzcGF0Y2hlciB3aXRoIG5vIGFyZ3VtZW50IiwgbGluZSkKICAgICAgICByZXR1cm4gaGxjYWxsKHRhcmdldCwgcmVzdFswXSksIE5vbmUKCiAgICBpZiBuYW1lID09ICJtb3ZlZm9jdXMiOgogICAgICAgIGlmIG5vdCByZXN0OgogICAgICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoIm1hbGZvcm1lZF9tb3ZlZm9jdXMiLCAibW92ZWZvY3VzIHdpdGggbm8gZGlyZWN0aW9uIiwgbGluZSkKICAgICAgICByZXR1cm4gaGxjYWxsKHRhcmdldCwgeyJkaXJlY3Rpb24iOiByZXN0WzBdfSksIE5vbmUKCiAgICBpZiBuYW1lID09ICJ3b3Jrc3BhY2UiOgogICAgICAgIGlmIG5vdCByZXN0OgogICAgICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoIm1hbGZvcm1lZF93b3Jrc3BhY2UiLCAid29ya3NwYWNlIGRpc3BhdGNoZXIgd2l0aCBubyBpZCIsIGxpbmUpCiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHsid29ya3NwYWNlIjogcmVzdFswXX0pLCBOb25lCgogICAgaWYgbmFtZSBpbiAoIm1vdmV0b3dvcmtzcGFjZSIsICJtb3ZldG93b3Jrc3BhY2VzaWxlbnQiKToKICAgICAgICBpZiBub3QgcmVzdDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUsIFRvZG9Ob3RlKGYibWFsZm9ybWVkX3tuYW1lfSIsIGYie25hbWV9IHdpdGggbm8gd29ya3NwYWNlIiwgbGluZSkKICAgICAgICBmb2xsb3cgPSBuYW1lID09ICJtb3ZldG93b3Jrc3BhY2UiCiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHsid29ya3NwYWNlIjogcmVzdFswXSwgImZvbGxvdyI6IGZvbGxvd30pLCBOb25lCgogICAgaWYgbmFtZSA9PSAidG9nZ2xlc3BlY2lhbHdvcmtzcGFjZSI6CiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHJlc3RbMF0gaWYgcmVzdCBlbHNlICIiKSwgTm9uZQoKICAgIGlmIG5hbWUgaW4gKCJtb3Zld2luZG93IiwgInJlc2l6ZXdpbmRvdyIpOgogICAgICAgICMgVGhlIGJpbmRtIChtb3VzZS1kcmFnKSB6ZXJvLWFyZyBjYXNlIGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlcgogICAgICAgICMgYmVmb3JlIHJlYWNoaW5nIGhlcmUgLSB0aGlzIGlzIHRoZSBrZXlib2FyZC1kaXJlY3Rpb24gZm9ybS4KICAgICAgICBpZiBsZW4ocmVzdCkgPT0gMToKICAgICAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHsiZGlyZWN0aW9uIjogcmVzdFswXX0pLCBOb25lCiAgICAgICAgcmV0dXJuIE5vbmUsIFRvZG9Ob3RlKAogICAgICAgICAgICBmInVubW9kZWxlZF97bmFtZX1fc2hhcGUiLAogICAgICAgICAgICBmIntuYW1lfSB3aXRoIGFyZ3Mge3Jlc3Qhcn0gaXNuJ3QgYSBtb2RlbGVkIHNoYXBlIChvbmx5IGJhcmUgYmluZG0gb3IgYSBzaW5nbGUgZGlyZWN0aW9uIGFyZSkiLAogICAgICAgICAgICBsaW5lLAogICAgICAgICkKCiAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoInVubW9kZWxlZF9kaXNwYXRjaGVyIiwgZiIne25hbWV9JyBoYXMgbm8gbW9kZWxlZCBhcmd1bWVudCBzaGFwZSB5ZXQiLCBsaW5lKQoKCmRlZiBfY29tYmluZV9ub3Rlcyhub3RlczogbGlzdFtUb2RvTm90ZV0pIC0+IFRvZG9Ob3RlIHwgTm9uZToKICAgIGlmIG5vdCBub3RlczoKICAgICAgICByZXR1cm4gTm9uZQogICAgcmV0dXJuIFRvZG9Ob3RlKG5vdGVzWzBdLnJlYXNvbiwgIjsgIi5qb2luKG4uZGV0YWlsIGZvciBuIGluIG5vdGVzKSwgbm90ZXNbMF0ubGluZSkKCgpkZWYgX2J1aWxkX2JpbmQoZGlyZWN0aXZlOiBEaXJlY3RpdmUpIC0+IHR1cGxlOgogICAgZmxhZ3MgPSBkaXJlY3RpdmUua2V5W2xlbigiYmluZCIpOl0KICAgIGFyZ3MgPSBkaXJlY3RpdmUuYXJncwogICAgbGluZSA9IGRpcmVjdGl2ZS5saW5lCgogICAgaWYgbGVuKGFyZ3MpIDwgMzoKICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoIm1hbGZvcm1lZF9iaW5kIiwgZiJiaW5kIGRpcmVjdGl2ZSBoYXMgZmV3ZXIgdGhhbiAzIGZpZWxkczoge2FyZ3Mhcn0iLCBsaW5lKQoKICAgIG1vZHMsIGtleXN5bSwgZGlzcGF0Y2hlcl9uYW1lLCAqcmVzdCA9IGFyZ3MKICAgIGtleXNfc3RyID0gX2J1aWxkX2tleXNfc3RyaW5nKG1vZHMsIGtleXN5bSkKCiAgICBtb3VzZV9kcmFnX3NwZWNpYWxfY2FzZSA9ICgKICAgICAgICBmbGFncyA9PSAibSIgYW5kIGRpc3BhdGNoZXJfbmFtZSBpbiAoIm1vdmV3aW5kb3ciLCAicmVzaXpld2luZG93IikgYW5kIG5vdCByZXN0CiAgICApCiAgICBpZiBtb3VzZV9kcmFnX3NwZWNpYWxfY2FzZToKICAgICAgICB0YXJnZXQgPSAiaGwuZHNwLndpbmRvdy5kcmFnIiBpZiBkaXNwYXRjaGVyX25hbWUgPT0gIm1vdmV3aW5kb3ciIGVsc2UgImhsLmRzcC53aW5kb3cucmVzaXplIgogICAgICAgIGRpc3BhdGNoZXJfbm9kZSwgZGlzcGF0Y2hlcl9ub3RlID0gaGxjYWxsKHRhcmdldCksIE5vbmUKICAgIGVsc2U6CiAgICAgICAgZGlzcGF0Y2hlcl9ub2RlLCBkaXNwYXRjaGVyX25vdGUgPSBfYnVpbGRfZGlzcGF0Y2hlcl9jYWxsKGRpc3BhdGNoZXJfbmFtZSwgcmVzdCwgbGluZSkKCiAgICBpZiBkaXNwYXRjaGVyX25vZGUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZSwgZGlzcGF0Y2hlcl9ub3RlCgogICAgbm90ZXMgPSBbZGlzcGF0Y2hlcl9ub3RlXSBpZiBkaXNwYXRjaGVyX25vdGUgZWxzZSBbXQogICAgYmluZF9vcHRzID0ge30KICAgIGlmIG5vdCBtb3VzZV9kcmFnX3NwZWNpYWxfY2FzZToKICAgICAgICBmb3IgZiBpbiBmbGFnczoKICAgICAgICAgICAgbm90ZSA9IGNoZWNrX2JpbmRfZmxhZyhmLCBsaW5lKQogICAgICAgICAgICBpZiBub3RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbm90ZXMuYXBwZW5kKG5vdGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiaW5kX29wdHNbQklORF9GTEFHX1JFTkFNRVtmXV0gPSBUcnVlCgogICAgY2FsbF9hcmdzID0gW2tleXNfc3RyLCBkaXNwYXRjaGVyX25vZGVdCiAgICBpZiBiaW5kX29wdHM6CiAgICAgICAgY2FsbF9hcmdzLmFwcGVuZChiaW5kX29wdHMpCiAgICBiaW5kX2NhbGwgPSBobGNhbGwoImhsLmJpbmQiLCAqY2FsbF9hcmdzKQoKICAgIHJldHVybiBiaW5kX2NhbGwsIF9jb21iaW5lX25vdGVzKG5vdGVzKQoKCmRlZiBfc2V0X25lc3RlZChyZXN1bHQ6IGRpY3QsIGRvdHRlZF9rZXk6IHN0ciwgdmFsdWUpIC0+IE5vbmU6CiAgICAiIiJBIGh5cHJsYW5nIGtleSBjYW4gaXRzZWxmIGNvbnRhaW4gZG90cyAoYGNvbC5hY3RpdmVfYm9yZGVyID0gLi4uYAogICAgaXMgb25lIHJlYWwgZGlyZWN0aXZlIHdpdGggYSBsaXRlcmFsIGRvdCBpbiBpdHMgbmFtZSkgLSB0aGUgTHVhIHNjaGVtYQogICAgcmVwcmVzZW50cyB0aGF0IGFzIGEgbmVzdGVkIHRhYmxlIChgY29sID0geyBhY3RpdmVfYm9yZGVyID0gLi4uIH1gKSwKICAgIG5vdCBhIGZsYXQga2V5IHdpdGggYSBkb3QgaW4gaXQgKHdoaWNoIGFsc28gaXNuJ3QgYSB2YWxpZCBiYXJlIEx1YQogICAgaWRlbnRpZmllcikuIEZvdW5kIHJ1bm5pbmcgdGhlIGNvbnZlcnRlciBhZ2FpbnN0IHRoZSByZWFsIGNvbmZpZy4iIiIKICAgIHBhcnRzID0gZG90dGVkX2tleS5zcGxpdCgiLiIpCiAgICBub2RlID0gcmVzdWx0CiAgICBmb3IgcGFydCBpbiBwYXJ0c1s6LTFdOgogICAgICAgIG5vZGUgPSBub2RlLnNldGRlZmF1bHQocGFydCwge30pCiAgICBub2RlW3BhcnRzWy0xXV0gPSB2YWx1ZQoKCmRlZiBfZmxhdHRlbl9jb25maWdfYmxvY2soc2NoZW1hLCBibG9jazogQmxvY2ssIHByZWZpeDogc3RyLCBub3RlczogbGlzdFtUb2RvTm90ZV0pIC0+IGRpY3Q6CiAgICByZXN1bHQgPSB7fQogICAgZm9yIGQgaW4gYmxvY2suZGlyZWN0aXZlczoKICAgICAgICBrZXlfcGF0aCA9IGYie3ByZWZpeH0ue2Qua2V5fSIgaWYgcHJlZml4IGVsc2UgZC5rZXkKICAgICAgICB0eXBlX2V4cHIgPSBzY2hlbWEuY29uZmlnX3ZhbHVlX3R5cGVzLmdldChrZXlfcGF0aCkKICAgICAgICBpZiB0eXBlX2V4cHIgaXMgTm9uZToKICAgICAgICAgICAgbm90ZXMuYXBwZW5kKFRvZG9Ob3RlKAogICAgICAgICAgICAgICAgInVua25vd25fY29uZmlnX2tleSIsCiAgICAgICAgICAgICAgICBmIid7a2V5X3BhdGh9JyBpcyBub3QgYSBrbm93biBIeXBybGFuZCBjb25maWcga2V5IiwKICAgICAgICAgICAgICAgIGQubGluZSwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgY29udGludWUKICAgICAgICByYXcgPSBkLmFyZ3NbMF0gaWYgZC5hcmdzIGVsc2UgIiIKICAgICAgICB2YWx1ZSA9IF9jb2VyY2Vfb3Jfbm90ZSh0eXBlX2V4cHIsIHJhdywgbm90ZXMsIGtleV9wYXRoLCBkLmxpbmUpCiAgICAgICAgX3NldF9uZXN0ZWQocmVzdWx0LCBkLmtleSwgdmFsdWUpCiAgICBmb3Igc3ViIGluIGJsb2NrLmJsb2NrczoKICAgICAgICBzdWJfcGF0aCA9IGYie3ByZWZpeH0ue3N1Yi5uYW1lfSIgaWYgcHJlZml4IGVsc2Ugc3ViLm5hbWUKICAgICAgICBzdWJfcmVzdWx0ID0gX2ZsYXR0ZW5fY29uZmlnX2Jsb2NrKHNjaGVtYSwgc3ViLCBzdWJfcGF0aCwgbm90ZXMpCiAgICAgICAgIyBBIHN1Yi1ibG9jayB3aG9zZSBldmVyeSBrZXkgd2FzIFRPRE8nZCBvdXQgY29udHJpYnV0ZXMgbm90aGluZyBidXQKICAgICAgICAjIGFuIGVtcHR5IHRhYmxlLiBUaGUgbm90ZSBhbHJlYWR5IHJlY29yZHMgd2hhdCBjb3VsZG4ndCBiZQogICAgICAgICMgY29udmVydGVkLCBzbyBkb24ndCBhbHNvIGVtaXQgYHRvdWNocGFkID0ge31gLgogICAgICAgIGlmIHN1Yl9yZXN1bHQ6CiAgICAgICAgICAgIHJlc3VsdFtzdWIubmFtZV0gPSBzdWJfcmVzdWx0CiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9idWlsZF9zcGVjX2NhbGwoc2NoZW1hLCB0YXJnZXQ6IHN0ciwgY2xhc3NfbmFtZTogc3RyLCBibG9jazogQmxvY2ssIG5vdGVzOiBsaXN0W1RvZG9Ob3RlXSkgLT4gdHVwbGU6CiAgICBjbHMgPSBzY2hlbWEuY2xhc3Nlcy5nZXQoY2xhc3NfbmFtZSkKICAgIHNwZWMgPSB7fQogICAgZm9yIGQgaW4gYmxvY2suZGlyZWN0aXZlczoKICAgICAgICB0eXBlX2V4cHIgPSBjbHMuZmllbGRzLmdldChkLmtleSkgaWYgY2xzIGVsc2UgTm9uZQogICAgICAgIHJhdyA9IGQuYXJnc1swXSBpZiBkLmFyZ3MgZWxzZSAiIgogICAgICAgIGlmIHR5cGVfZXhwciBpcyBOb25lOgogICAgICAgICAgICBub3Rlcy5hcHBlbmQoVG9kb05vdGUoCiAgICAgICAgICAgICAgICAidW5rbm93bl9zcGVjX2ZpZWxkIiwKICAgICAgICAgICAgICAgIGYiJ3tkLmtleX0nIGlzIG5vdCBhIGZpZWxkIG9mIHtjbGFzc19uYW1lfSIsCiAgICAgICAgICAgICAgICBkLmxpbmUsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIHNwZWNbZC5rZXldID0gcmF3CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdmFsdWUgPSBfY29lcmNlX29yX25vdGUodHlwZV9leHByLCByYXcsIG5vdGVzLCBkLmtleSwgZC5saW5lKQogICAgICAgIHNwZWNbZC5rZXldID0gdmFsdWUKICAgIHJldHVybiBobGNhbGwodGFyZ2V0LCBzcGVjKSwgbm90ZXMKCgpkZWYgX2J1aWxkX3dpbmRvd19ydWxlKHJ1bGU6IFdpbmRvd1J1bGUpOgogICAgcGF5bG9hZCA9IHt9CiAgICBpZiAibmFtZSIgaW4gcnVsZS5wcm9wZXJ0aWVzOgogICAgICAgIHBheWxvYWRbIm5hbWUiXSA9IHJ1bGUucHJvcGVydGllc1sibmFtZSJdCiAgICBpZiBydWxlLm1hdGNoOgogICAgICAgIHBheWxvYWRbIm1hdGNoIl0gPSB7azogX2Jlc3RfZWZmb3J0X3NjYWxhcih2KSBmb3IgaywgdiBpbiBydWxlLm1hdGNoLml0ZW1zKCl9CiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBydWxlLnByb3BlcnRpZXMuaXRlbXMoKToKICAgICAgICBpZiBrZXkgPT0gIm5hbWUiOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHBheWxvYWRba2V5XSA9IF9iZXN0X2VmZm9ydF9zY2FsYXIodmFsdWUpCiAgICByZXR1cm4gaGxjYWxsKCJobC53aW5kb3dfcnVsZSIsIHBheWxvYWQpCgoKZGVmIF9idWlsZF9tb25pdG9yKGRpcmVjdGl2ZTogRGlyZWN0aXZlKToKICAgIGZpZWxkcyA9ICgib3V0cHV0IiwgIm1vZGUiLCAicG9zaXRpb24iLCAic2NhbGUiKQogICAgaWYgbGVuKGRpcmVjdGl2ZS5hcmdzKSAhPSBsZW4oZmllbGRzKToKICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoCiAgICAgICAgICAgICJ1bm1vZGVsZWRfbW9uaXRvcl9zaGFwZSIsCiAgICAgICAgICAgIGYibW9uaXRvciBkaXJlY3RpdmUgd2l0aCB7bGVuKGRpcmVjdGl2ZS5hcmdzKX0gZmllbGRzIGlzbid0IHRoZSBtb2RlbGVkICIKICAgICAgICAgICAgZiJvdXRwdXQsbW9kZSxwb3NpdGlvbixzY2FsZSBzaGFwZSIsCiAgICAgICAgICAgIGRpcmVjdGl2ZS5saW5lLAogICAgICAgICkKICAgIHNwZWMgPSBkaWN0KHppcChmaWVsZHMsIGRpcmVjdGl2ZS5hcmdzKSkKICAgIHJldHVybiBobGNhbGwoImhsLm1vbml0b3IiLCBzcGVjKSwgTm9uZQoKCmRlZiBfYnVpbGRfZ2VzdHVyZShkaXJlY3RpdmU6IERpcmVjdGl2ZSk6CiAgICBmaWVsZHMgPSAoImZpbmdlcnMiLCAiZGlyZWN0aW9uIiwgImFjdGlvbiIpCiAgICBpZiBsZW4oZGlyZWN0aXZlLmFyZ3MpIDwgbGVuKGZpZWxkcyk6CiAgICAgICAgcmV0dXJuIE5vbmUsIFRvZG9Ob3RlKAogICAgICAgICAgICAidW5tb2RlbGVkX2dlc3R1cmVfc2hhcGUiLAogICAgICAgICAgICBmImdlc3R1cmUgZGlyZWN0aXZlIHdpdGgge2xlbihkaXJlY3RpdmUuYXJncyl9IGZpZWxkcyBpc24ndCB0aGUgbW9kZWxlZCAiCiAgICAgICAgICAgIGYiZmluZ2VycyxkaXJlY3Rpb24sYWN0aW9uIHNoYXBlIiwKICAgICAgICAgICAgZGlyZWN0aXZlLmxpbmUsCiAgICAgICAgKQogICAgZmluZ2VycywgZGlyZWN0aW9uLCBhY3Rpb24gPSBkaXJlY3RpdmUuYXJnc1s6M10KICAgIHRyeToKICAgICAgICBmaW5nZXJzX3ZhbCA9IGludChmaW5nZXJzKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgZmluZ2Vyc192YWwgPSBmaW5nZXJzCiAgICBzcGVjID0geyJmaW5nZXJzIjogZmluZ2Vyc192YWwsICJkaXJlY3Rpb24iOiBkaXJlY3Rpb24sICJhY3Rpb24iOiBhY3Rpb259CiAgICByZXR1cm4gaGxjYWxsKCJobC5nZXN0dXJlIiwgc3BlYyksIE5vbmUKCgpkZWYgX2NvbnZlcnRfaXRlbXMoc2NoZW1hLCBoZjogSHlwcmxhbmdGaWxlKSAtPiBsaXN0W0NvbnZlcnRlZEl0ZW1dOgogICAgIiIiU2hhcmVkIGNvbnZlcnNpb24gcGFzcyBiZWhpbmQgYm90aCBgY29udmVydGAgKGZsYXQpIGFuZAogICAgYGNvbnZlcnRfc3BsaXRgIChtb2R1bGFyKS4gWWllbGRzIG9uZSBDb252ZXJ0ZWRJdGVtIHBlciBlbWl0dGVkCiAgICBzdGF0ZW1lbnQsIHRhZ2dlZCB3aXRoIGl0cyB0YXJnZXQgbW9kdWxlIGFuZCBvcmlnaW5hbCBzb3VyY2UgbGluZSwgaW4KICAgIHNvdXJjZSBvcmRlci4iIiIKICAgIGl0ZW1zOiBsaXN0W0NvbnZlcnRlZEl0ZW1dID0gW10KCiAgICAjIGV4ZWMtb25jZSBoYXMgbm8gZGlyZWN0IGNhbGwtc2hhcGVkIGVxdWl2YWxlbnQgLSB0aGUgaGFuZC1taWdyYXRpb24KICAgICMgdGhpcyBwcm9qZWN0IGFscmVhZHkgZGlkIChzZWUgY29uZmlncy9oeXBybGFuZC1sdWEvYXV0b3N0YXJ0Lmx1YSkKICAgICMgY29uc29saWRhdGVzIGV2ZXJ5IGV4ZWMtb25jZSBpbnRvIG9uZSBobC5vbigiaHlwcmxhbmQuc3RhcnQiLCBmbikKICAgICMgcmVnaXN0cmF0aW9uIHJhdGhlciB0aGFuIG9uZSBjYWxsIHBlciBsaW5lLCBzbyB0aGUgY29udmVydGVyIG1hdGNoZXMKICAgICMgdGhhdCBpbnN0ZWFkIG9mIGVtaXR0aW5nIE4gZHVwbGljYXRlIHJlZ2lzdHJhdGlvbnMuCiAgICBleGVjX29uY2VfY21kcyA9IFsKICAgICAgICBkLmFyZ3NbMF0gZm9yIGQgaW4gaGYuc3RhdGVtZW50cwogICAgICAgIGlmIGlzaW5zdGFuY2UoZCwgRGlyZWN0aXZlKSBhbmQgZC5rZXkgPT0gImV4ZWMtb25jZSIgYW5kIGQuYXJncwogICAgXQogICAgZXhlY19vbmNlX2VtaXR0ZWQgPSBGYWxzZQoKICAgIGZvciBzdG10IGluIGhmLnN0YXRlbWVudHM6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCBWYXJpYWJsZUFzc2lnbik6CiAgICAgICAgICAgIGNvbnRpbnVlICAjIGFscmVhZHkgaW5saW5lZCBieSB0aGUgaHlwcmxhbmcgcGFyc2VyCgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgV2luZG93UnVsZSk6CiAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChDb252ZXJ0ZWRJdGVtKF9idWlsZF93aW5kb3dfcnVsZShzdG10KSwgTm9uZSwgTV9XSU5ET1dSVUxFUywgc3RtdC5saW5lKSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCBEaXJlY3RpdmUpOgogICAgICAgICAgICBtb2R1bGUgPSBfZGlyZWN0aXZlX21vZHVsZShzdG10LmtleSkKICAgICAgICAgICAgaWYgc3RtdC5rZXkgPT0gInNvdXJjZSI6CiAgICAgICAgICAgICAgICBub3RlID0gY2hlY2tfc291cmNlX2RpcmVjdGl2ZShzdG10LmFyZ3NbMF0gaWYgc3RtdC5hcmdzIGVsc2UgIiIsIHN0bXQubGluZSkKICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChDb252ZXJ0ZWRJdGVtKE5vbmUsIG5vdGUsIE1fRU5UUlksIHN0bXQubGluZSkpCiAgICAgICAgICAgIGVsaWYgc3RtdC5rZXkgPT0gImV4ZWMtb25jZSI6CiAgICAgICAgICAgICAgICBpZiBub3QgZXhlY19vbmNlX2VtaXR0ZWQ6CiAgICAgICAgICAgICAgICAgICAgZXhlY19vbmNlX2VtaXR0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZm4gPSBhbm9uX2Z1bmN0aW9uKFtobGNhbGwoImhsLmV4ZWNfY21kIiwgY21kKSBmb3IgY21kIGluIGV4ZWNfb25jZV9jbWRzXSkKICAgICAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udmVydGVkSXRlbSgKICAgICAgICAgICAgICAgICAgICAgICAgaGxjYWxsKCJobC5vbiIsICJoeXBybGFuZC5zdGFydCIsIGZuKSwgTm9uZSwgbW9kdWxlLCBzdG10LmxpbmUKICAgICAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgIyBzdWJzZXF1ZW50IGV4ZWMtb25jZSBkaXJlY3RpdmVzIGFyZSBhbHJlYWR5IGZvbGRlZCBpbiBhYm92ZQogICAgICAgICAgICBlbGlmIHN0bXQua2V5ID09ICJlbnYiIGFuZCBsZW4oc3RtdC5hcmdzKSA9PSAyOgogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0oCiAgICAgICAgICAgICAgICAgICAgaGxjYWxsKCJobC5lbnYiLCBzdG10LmFyZ3NbMF0sIHN0bXQuYXJnc1sxXSksIE5vbmUsIG1vZHVsZSwgc3RtdC5saW5lCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICBlbGlmIHN0bXQua2V5LnN0YXJ0c3dpdGgoImJpbmQiKToKICAgICAgICAgICAgICAgIG5vZGUsIG5vdGUgPSBfYnVpbGRfYmluZChzdG10KQogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0obm9kZSwgbm90ZSwgbW9kdWxlLCBzdG10LmxpbmUpKQogICAgICAgICAgICBlbGlmIHN0bXQua2V5ID09ICJtb25pdG9yIjoKICAgICAgICAgICAgICAgIG5vZGUsIG5vdGUgPSBfYnVpbGRfbW9uaXRvcihzdG10KQogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0obm9kZSwgbm90ZSwgbW9kdWxlLCBzdG10LmxpbmUpKQogICAgICAgICAgICBlbGlmIHN0bXQua2V5ID09ICJnZXN0dXJlIjoKICAgICAgICAgICAgICAgIG5vZGUsIG5vdGUgPSBfYnVpbGRfZ2VzdHVyZShzdG10KQogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0obm9kZSwgbm90ZSwgbW9kdWxlLCBzdG10LmxpbmUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0oTm9uZSwgVG9kb05vdGUoCiAgICAgICAgICAgICAgICAgICAgInVubW9kZWxlZF9kaXJlY3RpdmUiLAogICAgICAgICAgICAgICAgICAgIGYiJ3tzdG10LmtleX0nIGlzbid0IGEgbW9kZWxlZCB0b3AtbGV2ZWwgZGlyZWN0aXZlIiwKICAgICAgICAgICAgICAgICAgICBzdG10LmxpbmUsCiAgICAgICAgICAgICAgICApLCBtb2R1bGUsIHN0bXQubGluZSkpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgQmxvY2spOgogICAgICAgICAgICBpZiBzdG10Lm5hbWUgPT0gInBsdWdpbiI6CiAgICAgICAgICAgICAgICAjIFBsdWdpbiBjb25maWcgaXMgZHluYW1pY2FsbHkgcmVnaXN0ZXJlZCBwZXItcGx1Z2luIGF0CiAgICAgICAgICAgICAgICAjIHJ1bnRpbWUgLSBzdHJ1Y3R1cmFsbHkgYWJzZW50IGZyb20gdGhlIHNjaGVtYSAoc2FtZSByb290CiAgICAgICAgICAgICAgICAjIGNhdXNlIGFzIEhMLlBsdWdpbk5hbWVzcGFjZSdzIGR5bmFtaWMgaW5kZXggc2lnbmF0dXJlLAogICAgICAgICAgICAgICAgIyBzZWUgY2hlY2tlci5weSkuIFRoZXJlJ3Mgbm90aGluZyB0byBmbGF0dGVuIGl0IGFnYWluc3QsCiAgICAgICAgICAgICAgICAjIGFuZCBpdHMgc3ViLWJsb2NrIG5hbWVzIChlLmcuICJkeW5hbWljLWN1cnNvcnMiKSBvZnRlbgogICAgICAgICAgICAgICAgIyBhcmVuJ3QgZXZlbiB2YWxpZCBMdWEgaWRlbnRpZmllcnMuIEZsYWcgZm9yIG1hbnVhbAogICAgICAgICAgICAgICAgIyBjb252ZXJzaW9uIHJhdGhlciB0aGFuIGVtaXR0aW5nIGVtcHR5L2ludmFsaWQgdGFibGVzLgogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0oTm9uZSwgVG9kb05vdGUoCiAgICAgICAgICAgICAgICAgICAgInBsdWdpbl9jb25maWciLAogICAgICAgICAgICAgICAgICAgICJwbHVnaW4geyAuLi4gfSBjb25maWcgaXMgZHluYW1pY2FsbHkgcmVnaXN0ZXJlZCBwZXItcGx1Z2luIC0gIgogICAgICAgICAgICAgICAgICAgICJub3QgY29udmVydGVkIGF1dG9tYXRpY2FsbHksIGNvbnZlcnQgbWFudWFsbHkiLAogICAgICAgICAgICAgICAgICAgIHN0bXQubGluZSwKICAgICAgICAgICAgICAgICksIE1fUExVR0lOUywgc3RtdC5saW5lKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0YXJnZXQgPSBjbGFzc2lmeV9ibG9jayhzY2hlbWEsIHN0bXQubmFtZSkKICAgICAgICAgICAgbm90ZXM6IGxpc3RbVG9kb05vdGVdID0gW10KICAgICAgICAgICAgaWYgdGFyZ2V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY2xzX2ZpZWxkID0gc2NoZW1hLmNsYXNzZXNbIkhMLkFQSSJdLmZpZWxkc1tzdG10Lm5hbWVdCiAgICAgICAgICAgICAgICBmcm9tIC4uY2hlY2tlciBpbXBvcnQgcGFyc2VfZnVuX3NpZ25hdHVyZQogICAgICAgICAgICAgICAgc2lnID0gcGFyc2VfZnVuX3NpZ25hdHVyZShjbHNfZmllbGQpCiAgICAgICAgICAgICAgICBjbGFzc19uYW1lID0gbmV4dChwLnR5cGVfZXhwciBmb3IgcCBpbiBzaWcucGFyYW1zIGlmIHAudHlwZV9leHByIGluIHNjaGVtYS5jbGFzc2VzKQogICAgICAgICAgICAgICAgY2FsbCwgbm90ZXMgPSBfYnVpbGRfc3BlY19jYWxsKHNjaGVtYSwgdGFyZ2V0LCBjbGFzc19uYW1lLCBzdG10LCBub3RlcykKICAgICAgICAgICAgICAgIG1vZHVsZSA9IF9zcGVjX2Jsb2NrX21vZHVsZShzdG10Lm5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbm5lciA9IF9mbGF0dGVuX2NvbmZpZ19ibG9jayhzY2hlbWEsIHN0bXQsIHN0bXQubmFtZSwgbm90ZXMpCiAgICAgICAgICAgICAgICBtb2R1bGUgPSBfY29uZmlnX3NlY3Rpb25fbW9kdWxlKHN0bXQubmFtZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpbm5lcjoKICAgICAgICAgICAgICAgICAgICAjIE5vdGhpbmcgc3Vydml2ZWQgY29udmVyc2lvbiAtIGVpdGhlciB0aGUgc291cmNlIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgIyB3YXMgZW1wdHksIG9yIGV2ZXJ5IGtleSBpbiBpdCB3YXMgVE9ETydkIG91dC4gRW1pdHRpbmcKICAgICAgICAgICAgICAgICAgICAjIGBobC5jb25maWcoeyA8bmFtZT4gPSB7fSB9KWAgc2V0cyBub3RoaW5nLCBhbmQgd2hlbiB0aGUKICAgICAgICAgICAgICAgICAgICAjIGJsb2NrIG5hbWUgaXRzZWxmIGlzIHVucmVzb2x2YWJsZSAoZS5nLiBhIHBlci1kZXZpY2UKICAgICAgICAgICAgICAgICAgICAjIGBkZXZpY2U6Zm9vYCBibG9jaykgaXQncyBvdXRwdXQgdGhhdCBmYWlscyBvdXIgb3duCiAgICAgICAgICAgICAgICAgICAgIyBwb3N0LWNvbnZlcnQgY2hlY2tlci4gU2FtZSBjYWxsIGFzIHRoZSBwbHVnaW4gY2FzZQogICAgICAgICAgICAgICAgICAgICMgYWJvdmU6IGtlZXAgdGhlIG5vdGVzLCBkcm9wIHRoZSBkZWFkIHRhYmxlLgogICAgICAgICAgICAgICAgICAgIGlmIG5vdGVzOgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udmVydGVkSXRlbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIF9jb21iaW5lX25vdGVzKG5vdGVzKSwgbW9kdWxlLCBzdG10LmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgY2FsbCA9IGhsY2FsbCgiaGwuY29uZmlnIiwge3N0bXQubmFtZTogaW5uZXJ9KQogICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udmVydGVkSXRlbShjYWxsLCBfY29tYmluZV9ub3Rlcyhub3RlcyksIG1vZHVsZSwgc3RtdC5saW5lKSkKICAgICAgICAgICAgY29udGludWUKCiAgICByZXR1cm4gaXRlbXMKCgpkZWYgY29udmVydChzY2hlbWEsIGhmOiBIeXBybGFuZ0ZpbGUpIC0+IHN0cjoKICAgICIiIkNvbnZlcnRzIGEgcGFyc2VkIGh5cHJsYW5nIGZpbGUgKGh5cHJ2YWxpZGF0ZS5oeXBybGFuZy5wYXJzZXIgb3V0cHV0KQogICAgaW50byBMdWEgc291cmNlIHRleHQsIHVzaW5nIHRoZSBzY2hlbWEgdG8gZGVjaWRlIGRpc3BhdGNoL2NvZXJjaW9uLwogICAgdmFsaWRpdHkgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcuIEFueXRoaW5nIG5vdCBjb25maWRlbnRseSByZXNvbHZlZAogICAgYmVjb21lcyBhIGAtLSBUT0RPKGh5cHJ2YWxpZGF0ZSBjb252ZXJ0KTogLi4uYCBjb21tZW50IGluc3RlYWQgb2YKICAgIHNpbGVudGx5IHdyb25nIG91dHB1dC4iIiIKICAgIGl0ZW1zID0gX2NvbnZlcnRfaXRlbXMoc2NoZW1hLCBoZikKICAgIHJldHVybiByZW5kZXJfcHJvZ3JhbShbKGkubm9kZSwgaS5ub3RlKSBmb3IgaSBpbiBpdGVtc10pCgoKX0VOVFJZX0hFQURFUiA9ICIiIlwKLS0gR2VuZXJhdGVkIGJ5IGh5cHJ2YWxpZGF0ZSBjb252ZXJ0IC0tc3BsaXQuCi0tCi0tIERlcGxveW1lbnQgbm90ZTogcmVxdWlyZSgpIHJlc29sdmVzIG1vZHVsZXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeQotLSB0aGlzIGZpbGUgbGl2ZXMgaW4sIHNvIGNvcHkgZXZlcnkgLmx1YSBmaWxlIGhlcmUgZmxhdCBpbnRvCi0tIH4vLmNvbmZpZy9oeXByLyAodGhpcyBmaWxlIG11c3Qgc3RheSBuYW1lZCBoeXBybGFuZC5sdWEgdGhlcmUpLiBOZXN0aW5nCi0tIHRoZSBtb2R1bGVzIG9uZSBsZXZlbCBkZWVwZXIgbmVlZHMgZXh0cmEgcGFja2FnZS5wYXRoIHNldHVwLgotLQotLSBPcmRlciBiZWxvdyBmb2xsb3dzIHRoZSBvcmlnaW5hbCBjb25maWcncyBvd24gb3JkZXIuIEVhY2ggcmVxdWlyZSgpIHJ1bnMKLS0gaXRzIG1vZHVsZSBib2R5IGltbWVkaWF0ZWx5LCBzbyBzdGF0ZW1lbnRzIHRoYXQgZGVwZW5kIG9uIG9yZGVyIChyZXBlYXRlZAotLSBjb25maWcga2V5cywgZHVwbGljYXRlIGJpbmRzLCB3aW5kb3ctcnVsZSBwcmVjZWRlbmNlKSBrZWVwIHRoZSByZWxhdGl2ZQotLSBvcmRlciB0aGV5IGhhZCBpbiB0aGUgc291cmNlIGZpbGUuCiIiIgoKCmRlZiBjb252ZXJ0X3NwbGl0KHNjaGVtYSwgaGY6IEh5cHJsYW5nRmlsZSkgLT4gZGljdFtzdHIsIHN0cl06CiAgICAiIiJDb252ZXJ0IGludG8gYSBzZXQgb2YgbW9kdWxhciBmaWxlcyBpbnN0ZWFkIG9mIG9uZSBmbGF0IGZpbGUuCgogICAgUmV0dXJucyB7ZmlsZW5hbWU6IGx1YV9zb3VyY2V9LCBhbHdheXMgaW5jbHVkaW5nIHRoZSBgaHlwcmxhbmQubHVhYAogICAgZW50cnkgcG9pbnQgdGhhdCByZXF1aXJlKClzIHRoZSByZXN0LiBNb2R1bGVzIHdpdGggbm8gc3RhdGVtZW50cwogICAgcHJvZHVjZSBubyBmaWxlLgoKICAgIFdoeSBidWNrZXRpbmcgYnkgbW9kdWxlIGlzIHNhZmUgZGVzcGl0ZSByZW9yZGVyaW5nIHJlbGF0aXZlIHRvIHRoZQogICAgc291cmNlIGZpbGU6IHN0YXRlbWVudHMgYXJlIGdyb3VwZWQgYnkgc3Vic3lzdGVtLCBhbmQgd2l0aGluIGEgbW9kdWxlCiAgICBzb3VyY2Ugb3JkZXIgaXMgcHJlc2VydmVkIGV4YWN0bHkuIFRoZSB0aHJlZSB0aGluZ3MgaW4gaHlwcmxhbmcgd2hlcmUKICAgIG9yZGVyIGFjdHVhbGx5IGNhcnJpZXMgbWVhbmluZyAtIHJlcGVhdGVkIGNvbmZpZyBrZXlzIChsYXN0IHdyaXRlIHdpbnMsCiAgICBjb25maXJtZWQgYWdhaW5zdCBIeXBybGFuZCdzIG93biBobENvbmZpZyBpbXBsZW1lbnRhdGlvbiksIGR1cGxpY2F0ZQogICAgYmluZHMgb24gb25lIGtleSAoYWxsIGZpcmUsIGluIG9yZGVyKSwgYW5kIHdpbmRvdy1ydWxlIHByZWNlZGVuY2UgLSBhcmUKICAgIGVhY2ggY29uZmluZWQgdG8gYSBzaW5nbGUgbW9kdWxlIGJ5IHRoaXMgbWFwcGluZywgc28gdGhlaXIgcmVsYXRpdmUKICAgIG9yZGVyIHN1cnZpdmVzLiBDcm9zcy1tb2R1bGUgb3JkZXIgaXMgYmV0d2VlbiBpbmRlcGVuZGVudCBzdWJzeXN0ZW1zLgogICAgYHRlc3RzL3Rlc3RfY29udmVydGVyX3NwbGl0LnB5YCBhc3NlcnRzIGJvdGggaGFsdmVzIG9mIHRoYXQgY2xhaW0KICAgIG1lY2hhbmljYWxseSByYXRoZXIgdGhhbiB0cnVzdGluZyB0aGlzIGNvbW1lbnQuCiAgICAiIiIKICAgIGl0ZW1zID0gX2NvbnZlcnRfaXRlbXMoc2NoZW1hLCBoZikKCiAgICBidWNrZXRzOiBkaWN0W3N0ciwgbGlzdFtDb252ZXJ0ZWRJdGVtXV0gPSB7fQogICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgYnVja2V0cy5zZXRkZWZhdWx0KGl0ZW0ubW9kdWxlLCBbXSkuYXBwZW5kKGl0ZW0pCgogICAgZW50cnlfaXRlbXMgPSBidWNrZXRzLnBvcChNX0VOVFJZLCBbXSkKCiAgICAjIE1vZHVsZXMgYXBwZWFyIGluIHRoZSBlbnRyeSBmaWxlIGluIHRoZSBvcmRlciB0aGVpciBmaXJzdCBzdGF0ZW1lbnQKICAgICMgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGNvbmZpZywgc28gcmVhZGluZyB0b3AgdG8gYm90dG9tIG1hdGNoZXMgdGhlCiAgICAjIHNvdXJjZS4gVGllcyAoYW5kIG1pc3NpbmcgbGluZSBudW1iZXJzKSBmYWxsIGJhY2sgdG8gdGhlIG5hbWUgc28gdGhlCiAgICAjIG91dHB1dCBpcyBkZXRlcm1pbmlzdGljLgogICAgbW9kdWxlX29yZGVyID0gc29ydGVkKAogICAgICAgIGJ1Y2tldHMsIGtleT1sYW1iZGEgbTogKG1pbigoaS5saW5lIG9yIDApIGZvciBpIGluIGJ1Y2tldHNbbV0pLCBtKQogICAgKQoKICAgIGZpbGVzOiBkaWN0W3N0ciwgc3RyXSA9IHt9CiAgICBmb3IgbW9kdWxlIGluIG1vZHVsZV9vcmRlcjoKICAgICAgICBib2R5ID0gcmVuZGVyX3Byb2dyYW0oWyhpLm5vZGUsIGkubm90ZSkgZm9yIGkgaW4gYnVja2V0c1ttb2R1bGVdXSkKICAgICAgICBmaWxlc1tmInttb2R1bGV9Lmx1YSJdID0gYm9keS5yc3RyaXAoIlxuIikgKyAiXG4iCgogICAgZW50cnlfcGFydHMgPSBbX0VOVFJZX0hFQURFUl0KICAgIGlmIGVudHJ5X2l0ZW1zOgogICAgICAgIGVudHJ5X3BhcnRzLmFwcGVuZCgKICAgICAgICAgICAgcmVuZGVyX3Byb2dyYW0oWyhpLm5vZGUsIGkubm90ZSkgZm9yIGkgaW4gZW50cnlfaXRlbXNdKS5yc3RyaXAoIlxuIikgKyAiXG4iCiAgICAgICAgKQogICAgZW50cnlfcGFydHMuYXBwZW5kKAogICAgICAgICJcbiIuam9pbihmJ3JlcXVpcmUoInttfSIpJyBmb3IgbSBpbiBtb2R1bGVfb3JkZXIpICsgIlxuIiBpZiBtb2R1bGVfb3JkZXIgZWxzZSAiIgogICAgKQogICAgZmlsZXNbZiJ7TV9FTlRSWX0ubHVhIl0gPSAiXG4iLmpvaW4ocCBmb3IgcCBpbiBlbnRyeV9wYXJ0cyBpZiBwKQoKICAgIHJldHVybiBmaWxlcwo="}; +export const PY_FILES = {"hyprvalidate/schema/extractor.py": "IiIiRXh0cmFjdCBhIG1hY2hpbmUtcmVhZGFibGUgc2NoZW1hIGZyb20gSHlwcmxhbmQncyBMdWFMUyB0eXBlIHN0dWIuCgpUaGUgc3R1YiAoaW5zdGFsbGVkIGF0IC91c3Ivc2hhcmUvaHlwci9zdHVicy9obC5tZXRhLmx1YSwgYXV0b2dlbmVyYXRlZCBieQpIeXBybGFuZCdzIG93biBidWlsZCBmcm9tIG1ldGEvZ2VuZXJhdGVMdWFTdHVicy5weSkgaXMgfjkzJSBMdWFMUyBhbm5vdGF0aW9uCmNvbW1lbnRzIChgLS0tQGNsYXNzYCwgYC0tLUBmaWVsZGAsIGAtLS1AYWxpYXNgLCBgLS0tfCAibGl0ZXJhbCJgKS4gTm9uZSBvZgp0aGUgZm91ciBleGlzdGluZyBoeXBybGFuZy0+bHVhIGNvbnZlcnRlcnMgcmVhZCBpdCBjb3JyZWN0bHk6CiAgLSBoeXByY29uZjJsdWEsIGh5cHItbWlncmF0ZTogbmV2ZXIgYXR0ZW1wdCB0by4KICAtIGh5cHIybHVhOiBsb2FkcyBpdCwgYnV0IGl0cyBwYXJzZXIgc2tpcHMgZXZlcnkgbGluZSBzdGFydGluZyB3aXRoICItLSIKICAgIChwYXJzZXIuZ286MjkpIC0gd2hpY2ggaXMgZXZlcnkgTHVhTFMgYW5ub3RhdGlvbiAtIGFuZCBleHRyYWN0cyAwIGVudHJpZXMuCgpUaGlzIGlzIGEgc3RhdGUgbWFjaGluZSwgbm90IHRoYXQ6IGl0IHJlYWRzIE9OTFkgIi0tLSItcHJlZml4ZWQgbGluZXMgYW5kCnRyYWNrcyB3aGF0IGJsb2NrIGl0J3MgY3VycmVudGx5IGluc2lkZS4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQganNvbgppbXBvcnQgcmUKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZCwgYXNkaWN0CmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKCkBkYXRhY2xhc3MKY2xhc3MgQ2xhc3NJbmZvOgogICAgbmFtZTogc3RyCiAgICBmaWVsZHM6IGRpY3Rbc3RyLCBzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpICAjIGZpZWxkIG5hbWUgLT4gdHlwZSBleHByCgoKQGRhdGFjbGFzcwpjbGFzcyBBbGlhc0luZm86CiAgICBuYW1lOiBzdHIKICAgIGxpdGVyYWxzOiBsaXN0W3N0cl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkgICAgICAjIGZvciBzdHJpbmctdW5pb24gYWxpYXNlcwogICAgdHlwZV9leHByOiBzdHIgfCBOb25lID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBgLS0tQGFsaWFzIFggWWAgZm9ybQoKCkBkYXRhY2xhc3MKY2xhc3MgU2NoZW1hOgogICAgY2xhc3NlczogZGljdFtzdHIsIENsYXNzSW5mb10gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9ZGljdCkKICAgIGFsaWFzZXM6IGRpY3Rbc3RyLCBBbGlhc0luZm9dID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpCiAgICBjb25maWdfdmFsdWVfdHlwZXM6IGRpY3Rbc3RyLCBzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpICAjICdhLmIuYycgLT4gdHlwZQoKICAgIGRlZiB0b19qc29uKHNlbGYpIC0+IHN0cjoKICAgICAgICByZXR1cm4ganNvbi5kdW1wcygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImNsYXNzZXMiOiB7azogYXNkaWN0KHYpIGZvciBrLCB2IGluIHNlbGYuY2xhc3Nlcy5pdGVtcygpfSwKICAgICAgICAgICAgICAgICJhbGlhc2VzIjoge2s6IGFzZGljdCh2KSBmb3IgaywgdiBpbiBzZWxmLmFsaWFzZXMuaXRlbXMoKX0sCiAgICAgICAgICAgICAgICAiY29uZmlnX3ZhbHVlX3R5cGVzIjogc2VsZi5jb25maWdfdmFsdWVfdHlwZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGluZGVudD0yLAogICAgICAgICAgICBzb3J0X2tleXM9VHJ1ZSwKICAgICAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9qc29uKGNscywgdGV4dDogc3RyKSAtPiAiU2NoZW1hIjoKICAgICAgICAiIiJSZWNvbnN0cnVjdCBhIFNjaGVtYSBmcm9tIHRvX2pzb24oKSdzIG91dHB1dCAtIHRoZSBpbnZlcnNlLgogICAgICAgIEV4aXN0cyBmb3IgY29uc3VtZXJzIHRoYXQgY2FuJ3QgcmVhZCB0aGUgc3R1YiBkaXJlY3RseSAoZS5nLiBhCiAgICAgICAgYnJvd3NlciBlbnZpcm9ubWVudCB3aXRoIG5vIGZpbGVzeXN0ZW0gYWNjZXNzIHRvCiAgICAgICAgL3Vzci9zaGFyZS9oeXByL3N0dWJzKSwgc28gdGhleSBjYW4gbG9hZCBhIGZyb3plbiBzbmFwc2hvdCBpbnN0ZWFkCiAgICAgICAgb2YgcmUtcGFyc2luZyBobC5tZXRhLmx1YS4iIiIKICAgICAgICBkYXRhID0ganNvbi5sb2Fkcyh0ZXh0KQogICAgICAgIHJldHVybiBjbHMoCiAgICAgICAgICAgIGNsYXNzZXM9e2s6IENsYXNzSW5mbygqKnYpIGZvciBrLCB2IGluIGRhdGEuZ2V0KCJjbGFzc2VzIiwge30pLml0ZW1zKCl9LAogICAgICAgICAgICBhbGlhc2VzPXtrOiBBbGlhc0luZm8oKip2KSBmb3IgaywgdiBpbiBkYXRhLmdldCgiYWxpYXNlcyIsIHt9KS5pdGVtcygpfSwKICAgICAgICAgICAgY29uZmlnX3ZhbHVlX3R5cGVzPWRhdGEuZ2V0KCJjb25maWdfdmFsdWVfdHlwZXMiLCB7fSksCiAgICAgICAgKQoKCiMgLS0tQGNsYXNzIE5hbWVbOiBQYXJlbnRdCl9SRV9DTEFTUyA9IHJlLmNvbXBpbGUocideLS0tQGNsYXNzXHMrKFtcdy5dKyknKQoKIyAtLS1AZmllbGQgbmFtZSB0eXBlLi4uICAgICAgICAgIChiYXJlIGlkZW50aWZpZXIgZmllbGQgbmFtZSkKIyAtLS1AZmllbGQgWydkb3R0ZWQua2V5J10gdHlwZS4uLiAoYnJhY2tldGVkL3F1b3RlZCBmaWVsZCBuYW1lLCB1c2VkIGZvcgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnVmFsdWVUeXBlcy1zdHlsZSBtYXBzKQpfUkVfRklFTERfQkFSRSA9IHJlLmNvbXBpbGUociJeLS0tQGZpZWxkXHMrKFx3K1w/PylccysoLispJCIpCl9SRV9GSUVMRF9CUkFDS0VUID0gcmUuY29tcGlsZShyIl4tLS1AZmllbGRccytcWyhbJ1wiXSkoLis/KVwxXF1ccysoLispJCIpCgojIC0tLUBhbGlhcyBOYW1lIFtUeXBlRXhwcl0gICAoVHlwZUV4cHIgcHJlc2VudCA9PiBzaW1wbGUgYWxpYXMsIGFic2VudCA9PiBhCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHJ1biBvZiBgLS0tfCAibGl0ZXJhbCJgIGxpbmVzIGRlZmluZXMgaXQpCl9SRV9BTElBUyA9IHJlLmNvbXBpbGUocideLS0tQGFsaWFzXHMrKFtcdy5dKykoPzpccysoLispKT8kJykKCiMgLS0tfCAibGl0ZXJhbC12YWx1ZSIgICAoY29udGludWF0aW9uIGxpbmUgZm9yIGEgdW5pb24gYWxpYXMpCl9SRV9VTklPTl9NRU1CRVIgPSByZS5jb21waWxlKHInXi0tLVx8XHMqIihbXiJdKikiJykKCgpkZWYgZXh0cmFjdCh0ZXh0OiBzdHIpIC0+IFNjaGVtYToKICAgIHNjaGVtYSA9IFNjaGVtYSgpCgogICAgY3VycmVudF9jbGFzczogQ2xhc3NJbmZvIHwgTm9uZSA9IE5vbmUKICAgIGN1cnJlbnRfYWxpYXM6IEFsaWFzSW5mbyB8IE5vbmUgPSBOb25lCgogICAgZm9yIHJhd19saW5lIGluIHRleHQuc3BsaXRsaW5lcygpOgogICAgICAgIGxpbmUgPSByYXdfbGluZS5zdHJpcCgpCgogICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoIi0tLSIpIGFuZCBub3QgbGluZS5zdGFydHN3aXRoKCItLS18Iik6CiAgICAgICAgICAgICMgQW55IG5vbi1hbm5vdGF0aW9uIGxpbmUgKGJsYW5rLCBjb2RlLCBgbG9jYWwgX19ITF9YID0ge31gLCBgaGwgPSB7fWApCiAgICAgICAgICAgICMgZW5kcyB3aGF0ZXZlciBjbGFzcy9hbGlhcyBibG9jayB3ZSB3ZXJlIGFjY3VtdWxhdGluZy4KICAgICAgICAgICAgY3VycmVudF9jbGFzcyA9IE5vbmUKICAgICAgICAgICAgY3VycmVudF9hbGlhcyA9IE5vbmUKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbSA6PSBfUkVfQ0xBU1MubWF0Y2gobGluZSk6CiAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDEpCiAgICAgICAgICAgIGN1cnJlbnRfY2xhc3MgPSBzY2hlbWEuY2xhc3Nlcy5zZXRkZWZhdWx0KG5hbWUsIENsYXNzSW5mbyhuYW1lPW5hbWUpKQogICAgICAgICAgICBjdXJyZW50X2FsaWFzID0gTm9uZQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBtIDo9IF9SRV9BTElBUy5tYXRjaChsaW5lKToKICAgICAgICAgICAgbmFtZSwgdHlwZV9leHByID0gbS5ncm91cCgxKSwgbS5ncm91cCgyKQogICAgICAgICAgICBjdXJyZW50X2FsaWFzID0gc2NoZW1hLmFsaWFzZXMuc2V0ZGVmYXVsdChuYW1lLCBBbGlhc0luZm8obmFtZT1uYW1lKSkKICAgICAgICAgICAgaWYgdHlwZV9leHByOgogICAgICAgICAgICAgICAgY3VycmVudF9hbGlhcy50eXBlX2V4cHIgPSB0eXBlX2V4cHIuc3RyaXAoKQogICAgICAgICAgICBjdXJyZW50X2NsYXNzID0gTm9uZQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBjdXJyZW50X2NsYXNzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBtIDo9IF9SRV9GSUVMRF9CUkFDS0VULm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgICAga2V5LCB0eXBlX2V4cHIgPSBtLmdyb3VwKDIpLCBtLmdyb3VwKDMpLnN0cmlwKCkKICAgICAgICAgICAgICAgIGN1cnJlbnRfY2xhc3MuZmllbGRzW2tleV0gPSB0eXBlX2V4cHIKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfY2xhc3MubmFtZSA9PSAiSEwuQ29uZmlnVmFsdWVUeXBlcyI6CiAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmNvbmZpZ192YWx1ZV90eXBlc1trZXldID0gdHlwZV9leHByCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtIDo9IF9SRV9GSUVMRF9CQVJFLm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgICAgZm5hbWUsIHR5cGVfZXhwciA9IG0uZ3JvdXAoMSksIG0uZ3JvdXAoMikuc3RyaXAoKQogICAgICAgICAgICAgICAgY3VycmVudF9jbGFzcy5maWVsZHNbZm5hbWUucnN0cmlwKCI/IildID0gdHlwZV9leHByCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIEEgYC0tLWAgY29tbWVudCBsaW5lIGluc2lkZSBhIGNsYXNzIHRoYXQgaXNuJ3QgYSBAZmllbGQgKGUuZy4gYQogICAgICAgICAgICAjIHBsYWluIGRvYyBjb21tZW50KSAtIGlnbm9yZSwgc3RheSBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGN1cnJlbnRfYWxpYXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIG0gOj0gX1JFX1VOSU9OX01FTUJFUi5tYXRjaChsaW5lKToKICAgICAgICAgICAgICAgIGN1cnJlbnRfYWxpYXMubGl0ZXJhbHMuYXBwZW5kKG0uZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb250aW51ZQoKICAgIHJldHVybiBzY2hlbWEKCgpkZWYgZXh0cmFjdF9maWxlKHBhdGg6IHN0ciB8IFBhdGgpIC0+IFNjaGVtYToKICAgIHJldHVybiBleHRyYWN0KFBhdGgocGF0aCkucmVhZF90ZXh0KCkpCgoKZGVmIGxvYWRfc2NoZW1hKHBhdGg6IHN0ciB8IFBhdGgpIC0+IFNjaGVtYToKICAgICIiIkxvYWQgYSBzY2hlbWEgZnJvbSBlaXRoZXIgSHlwcmxhbmQncyBgLmx1YWAgc3R1YiBvciBhIGAuanNvbmAKICAgIHNuYXBzaG90IHByb2R1Y2VkIGJ5IGBTY2hlbWEudG9fanNvbigpYC4KCiAgICBUaGUgSlNPTiBwYXRoIGV4aXN0cyBzbyBhIGNvbmZpZyBjYW4gYmUgdmFsaWRhdGVkIG9uIGEgbWFjaGluZSB0aGF0CiAgICBkb2Vzbid0IGhhdmUgSHlwcmxhbmQgaW5zdGFsbGVkIGF0IGFsbCAtIENJIGZvciBhIGRvdGZpbGVzIHJlcG8sIGEKICAgIGNvbnRhaW5lciwgb3IgdGhlIGJyb3dzZXIgZGVtby4gRGlzcGF0Y2ggaXMgb24gdGhlIGZpbGUgZXh0ZW5zaW9uLAogICAgc2luY2UgdGhlIHR3byBmb3JtYXRzIGFyZSB1bmFtYmlndW91cy4KICAgICIiIgogICAgcCA9IFBhdGgocGF0aCkKICAgIGlmIHAuc3VmZml4ID09ICIuanNvbiI6CiAgICAgICAgcmV0dXJuIFNjaGVtYS5mcm9tX2pzb24ocC5yZWFkX3RleHQoKSkKICAgIHJldHVybiBleHRyYWN0X2ZpbGUocCkKCgpkZWYgbWFpbigpIC0+IE5vbmU6CiAgICBpbXBvcnQgYXJncGFyc2UKCiAgICBhcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCiAgICBhcC5hZGRfYXJndW1lbnQoCiAgICAgICAgInN0dWIiLCBuYXJncz0iPyIsIGRlZmF1bHQ9Ii91c3Ivc2hhcmUvaHlwci9zdHVicy9obC5tZXRhLmx1YSIsCiAgICAgICAgaGVscD0icGF0aCB0byBobC5tZXRhLmx1YSAoZGVmYXVsdDogdGhlIGluc3RhbGxlZCBzeXN0ZW0gc3R1YikiLAogICAgKQogICAgYXAuYWRkX2FyZ3VtZW50KCItbyIsICItLW91dCIsIGhlbHA9IndyaXRlIEpTT04gaGVyZSBpbnN0ZWFkIG9mIHN0ZG91dCIpCiAgICBhcmdzID0gYXAucGFyc2VfYXJncygpCgogICAgc3R1Yl9wYXRoID0gUGF0aChhcmdzLnN0dWIpCiAgICBpZiBub3Qgc3R1Yl9wYXRoLmlzX2ZpbGUoKToKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KAogICAgICAgICAgICBmImVycm9yOiBzdHViIGZpbGUgbm90IGZvdW5kIGF0IHtzdHViX3BhdGh9XG4iCiAgICAgICAgICAgICJUaGlzIHRvb2wgcmVhZHMgSHlwcmxhbmQncyBvd24gYXV0b2dlbmVyYXRlZCBMdWFMUyBzdHViLiAiCiAgICAgICAgICAgICJJZiB5b3VyIGRpc3RybyBkb2Vzbid0IHNoaXAgaXQgYXQgdGhlIGRlZmF1bHQgcGF0aCwgcGFzcyBpdCBleHBsaWNpdGx5LiIKICAgICAgICApCgogICAgc2NoZW1hID0gZXh0cmFjdF9maWxlKHN0dWJfcGF0aCkKCiAgICAjIEhhcmQgZmFpbHVyZSBvbiBlbXB0eSBleHRyYWN0aW9uIC0gdGhpcyBpcyB0aGUgZXhhY3QgYnVnIHRoYXQgbGV0CiAgICAjIGh5cHIybHVhIHNoaXAgYSBzY2hlbWEgbG9hZGVyIHRoYXQgc2lsZW50bHkgZXh0cmFjdHMgbm90aGluZy4KICAgIGlmIG5vdCBzY2hlbWEuY2xhc3NlcyBhbmQgbm90IHNjaGVtYS5hbGlhc2VzOgogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoCiAgICAgICAgICAgIGYiZXJyb3I6IGV4dHJhY3RlZCBaRVJPIGNsYXNzZXMvYWxpYXNlcyBmcm9tIHtzdHViX3BhdGh9IC0gIgogICAgICAgICAgICAidGhlIHN0dWIgZm9ybWF0IGhhcyBsaWtlbHkgY2hhbmdlZCBhbmQgdGhpcyBleHRyYWN0b3IgbmVlZHMgdXBkYXRpbmcuICIKICAgICAgICAgICAgIlJlZnVzaW5nIHRvIHByb2R1Y2UgYW4gZW1wdHkgc2NoZW1hIHNpbGVudGx5LiIKICAgICAgICApCgogICAgb3V0ID0gc2NoZW1hLnRvX2pzb24oKQogICAgaWYgYXJncy5vdXQ6CiAgICAgICAgUGF0aChhcmdzLm91dCkud3JpdGVfdGV4dChvdXQgKyAiXG4iKQogICAgICAgIHByaW50KGYid3JvdGUgc2NoZW1hICh7bGVuKHNjaGVtYS5jbGFzc2VzKX0gY2xhc3Nlcywge2xlbihzY2hlbWEuYWxpYXNlcyl9IGFsaWFzZXMpIHRvIHthcmdzLm91dH0iKQogICAgZWxzZToKICAgICAgICBwcmludChvdXQpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo=", "hyprvalidate/hyprlang/lexer.py": "IiIiTGV4ZXIgZm9yIHRoZSBvbGQgaHlwcmxhbmcgLmNvbmYgZm9ybWF0LgoKQWRhcHRlZCBmcm9tIGh5cHJjb25mMmx1YSdzIGxleGVyLnB5IChNSVQgTGljZW5zZSwgaHlwcmNvbmYybHVhIGNvbnRyaWJ1dG9ycywKaHR0cHM6Ly9naXRodWIuY29tL1ByYXRlZWstc3F1YWRyb24vaHlwcmNvbmYybHVhKSwgd2hpY2ggYWxyZWFkeSBoYW5kbGVzIHRoZQpmb3JtYXQncyBncmFtbWFyIHF1aXJrcyBjb3JyZWN0bHk6IGJhY2tzbGFzaCBsaW5lIGNvbnRpbnVhdGlvbiwgYCR7Li4ufWAKc2hlbGwgZXhwYW5zaW9uICh2cy4gYSBiYXJlIGAkYCBmb3IgdmFyaWFibGUgcmVmcyksIGFuZCBjb21tZW50IHN0cmlwcGluZy4KQWRhcHRlZCByYXRoZXIgdGhhbiByZWludmVudGVkLCByYXRoZXIgdGhhbiByZXdyaXRpbmcgYSBoeXBybGFuZyBsZXhlciBmcm9tCnNjcmF0Y2ggd2hlbiBhIGNvcnJlY3QgTUlULWxpY2Vuc2VkIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgcmUKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0CgpUT0tFTl9TUEVDUyA9IFsKICAgICgiQ09NTUVOVCIsIHIiI1teXG5dKiIpLAogICAgKCJCTE9DS19PUEVOIiwgciJceyIpLAogICAgKCJCTE9DS19DTE9TRSIsIHIiXH0iKSwKICAgICgiRVFVQUxTIiwgciI9IiksCiAgICAoIkNPTU1BIiwgciIsIiksCiAgICAoIkRPVCIsIHIiXC4iKSwKICAgICgiQ09MT04iLCByIjoiKSwKICAgICgiU0hFTExfRVhQIiwgciJcJFx7W159XG5dKlx9IiksCiAgICAoIkRPTExBUiIsIHIiXCQiKSwKICAgICgiU1RSSU5HIiwgciciKFteIlxcXXxcXC4pKiInKSwKICAgICgiQ09OVCIsIHIiXFxbIFx0XSpcbiIpLAogICAgKCJJREVOVCIsIHInW15ccyMiPXt9LDohXSsnKSwKICAgICgiTkVXTElORSIsIHIiXG4iKSwKICAgICgiU0tJUCIsIHIiWyBcdF0rIiksCiAgICAoIk1JU01BVENIIiwgciIuIiksCl0KClRPS0VOX1JFR0VYID0gcmUuY29tcGlsZSgifCIuam9pbihmIig/UDx7bmFtZX0+e3BhdHRlcm59KSIgZm9yIG5hbWUsIHBhdHRlcm4gaW4gVE9LRU5fU1BFQ1MpKQoKCkBkYXRhY2xhc3MKY2xhc3MgVG9rZW46CiAgICB0eXBlOiBzdHIKICAgIHZhbHVlOiBzdHIKICAgIGxpbmU6IGludAogICAgY29sOiBpbnQKCiAgICBkZWYgX19yZXByX18oc2VsZikgLT4gc3RyOgogICAgICAgIHJldHVybiBmIlRva2VuKHtzZWxmLnR5cGV9LCB7c2VsZi52YWx1ZSFyfSwgTHtzZWxmLmxpbmV9OntzZWxmLmNvbH0pIgoKCmNsYXNzIExleGVyRXJyb3IoRXhjZXB0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlOiBzdHIsIGxpbmU6IGludCwgY29sOiBpbnQpOgogICAgICAgIHNlbGYubGluZSA9IGxpbmUKICAgICAgICBzZWxmLmNvbCA9IGNvbAogICAgICAgIHN1cGVyKCkuX19pbml0X18oZiJMe2xpbmV9Ontjb2x9OiB7bWVzc2FnZX0iKQoKCmRlZiB0b2tlbml6ZShzb3VyY2U6IHN0cikgLT4gTGlzdFtUb2tlbl06CiAgICB0b2tlbnM6IExpc3RbVG9rZW5dID0gW10KICAgIGxpbmUgPSAxCiAgICBsYXN0X2xpbmVfc3RhcnQgPSAwCgogICAgZGVmIF9jb2wocG9zOiBpbnQpIC0+IGludDoKICAgICAgICByZXR1cm4gcG9zIC0gbGFzdF9saW5lX3N0YXJ0ICsgMQoKICAgIGZvciBtIGluIFRPS0VOX1JFR0VYLmZpbmRpdGVyKHNvdXJjZSk6CiAgICAgICAga2luZCA9IG0ubGFzdGdyb3VwCiAgICAgICAgdmFsdWUgPSBtLmdyb3VwKCkKICAgICAgICBwb3MgPSBtLnN0YXJ0KCkKCiAgICAgICAgaWYga2luZCA9PSAiTkVXTElORSI6CiAgICAgICAgICAgIGxpbmUgKz0gMQogICAgICAgICAgICBsYXN0X2xpbmVfc3RhcnQgPSBwb3MgKyAxCiAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoVG9rZW4oIk5FV0xJTkUiLCB2YWx1ZSwgbGluZSAtIDEsIF9jb2wocG9zKSkpCiAgICAgICAgZWxpZiBraW5kID09ICJDT05UIjoKICAgICAgICAgICAgbGluZSArPSAxCiAgICAgICAgICAgIGxhc3RfbGluZV9zdGFydCA9IG0uZW5kKCkKICAgICAgICBlbGlmIGtpbmQgPT0gIlNLSVAiOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBraW5kID09ICJDT01NRU5UIjoKICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChUb2tlbigiQ09NTUVOVCIsIHZhbHVlLCBsaW5lLCBfY29sKHBvcykpKQogICAgICAgIGVsaWYga2luZCA9PSAiTUlTTUFUQ0giOgogICAgICAgICAgICByYWlzZSBMZXhlckVycm9yKGYiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IHt2YWx1ZSFyfSIsIGxpbmUsIF9jb2wocG9zKSkKICAgICAgICBlbGlmIGtpbmQgPT0gIlNUUklORyI6CiAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoVG9rZW4oIlNUUklORyIsIHZhbHVlWzE6LTFdLCBsaW5lLCBfY29sKHBvcykpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoVG9rZW4oa2luZCwgdmFsdWUsIGxpbmUsIF9jb2wocG9zKSkpCgogICAgdG9rZW5zLmFwcGVuZChUb2tlbigiRU9GIiwgIiIsIGxpbmUsIDEpKQogICAgcmV0dXJuIHRva2Vucwo=", "hyprvalidate/hyprlang/parser.py": "IiIiUGFyc2VyL0FTVCBmb3IgdGhlIG9sZCBoeXBybGFuZyAuY29uZiBmb3JtYXQuCgpCdWlsZHMgYSBzbWFsbCBBU1QgZnJvbSB0aGUgbGV4ZXIncyB0b2tlbiBzdHJlYW06IGJsb2NrcywgZmxhdCBkaXJlY3RpdmVzLAokdmFyaWFibGUgYXNzaWdubWVudC9zdWJzdGl0dXRpb24sIGFuZCBhIHNpbmdsZSB1bmlmaWVkIFdpbmRvd1J1bGUgbm9kZSBmb3IKYm90aCBgd2luZG93cnVsZSB7IC4uLiB9YCAoYmxvY2sgZm9ybSkgYW5kIGB3aW5kb3dydWxlID0gcnVsZSwgc2VsZWN0b3JgCihvbmUtbGluZSBmb3JtKSAtIGh5cHIybHVhJ3MgZGVmZWN0IDMvNCB3YXMgcm91dGluZyB0aGVzZSB0byBkaWZmZXJlbnQKaGFuZGxlcnM7IGhlcmUgdGhleSBhbHdheXMgcHJvZHVjZSB0aGUgc2FtZSBub2RlIHR5cGUuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MsIGZpZWxkCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVW5pb24KCmZyb20gLmxleGVyIGltcG9ydCBUb2tlbiwgdG9rZW5pemUKCldJTkRPV19SVUxFX05BTUVTID0gKCJ3aW5kb3dydWxlIiwgIndpbmRvd3J1bGV2MiIpCgojIERpcmVjdGl2ZSBrZXlzIHdob3NlIHZhbHVlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcG9zaXRpb25hbCBhcmdzIGluCiMgcmVhbCBoeXBybGFuZyAtIGV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyBpdHMgd2hvbGUgcmVtYWluZGVyIGFzIG9uZSB2YWx1ZQojIChjb21tYXMgaW5jbHVkZWQpLCBzaW5jZSBhIHBsYWluIGBrZXkgPSB2YWx1ZWAgbGluZSBpcyBuZXZlciBzcGxpdC4KQ09NTUFfTElTVF9LRVlTID0gZnJvemVuc2V0KHsKICAgICJtb25pdG9yIiwgImFuaW1hdGlvbiIsICJiZXppZXIiLCAiZ2VzdHVyZSIsICJsYXllcnJ1bGUiLCAid29ya3NwYWNlIiwKICAgICJwZXJtaXNzaW9uIiwgImVudiIsCn0pCgoKZGVmIF9pc19jb21tYV9saXN0X2tleShrZXk6IHN0cikgLT4gYm9vbDoKICAgIHJldHVybiBrZXkgaW4gQ09NTUFfTElTVF9LRVlTIG9yIGtleS5zdGFydHN3aXRoKCJiaW5kIikKCgpAZGF0YWNsYXNzCmNsYXNzIERpcmVjdGl2ZToKICAgIGtleTogc3RyCiAgICBhcmdzOiBMaXN0W3N0cl0KICAgIGxpbmU6IGludAoKCkBkYXRhY2xhc3MKY2xhc3MgVmFyaWFibGVBc3NpZ246CiAgICBuYW1lOiBzdHIKICAgIHZhbHVlOiBzdHIKICAgIGxpbmU6IGludAoKCkBkYXRhY2xhc3MKY2xhc3MgQmxvY2s6CiAgICBuYW1lOiBzdHIKICAgIGRpcmVjdGl2ZXM6IExpc3RbRGlyZWN0aXZlXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgYmxvY2tzOiBMaXN0WyJCbG9jayJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBsaW5lOiBpbnQgPSAwCgoKQGRhdGFjbGFzcwpjbGFzcyBXaW5kb3dSdWxlOgogICAgbGluZTogaW50CiAgICBtYXRjaDogRGljdFtzdHIsIHN0cl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9ZGljdCkKICAgIHByb3BlcnRpZXM6IERpY3Rbc3RyLCBzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpCgoKU3RhdGVtZW50ID0gVW5pb25bRGlyZWN0aXZlLCBWYXJpYWJsZUFzc2lnbiwgQmxvY2ssIFdpbmRvd1J1bGVdCgoKQGRhdGFjbGFzcwpjbGFzcyBIeXBybGFuZ0ZpbGU6CiAgICB2YXJpYWJsZXM6IERpY3Rbc3RyLCBzdHJdCiAgICBzdGF0ZW1lbnRzOiBMaXN0W1N0YXRlbWVudF0KCgpjbGFzcyBQYXJzZUVycm9yKEV4Y2VwdGlvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZTogc3RyLCBsaW5lOiBpbnQpOgogICAgICAgIHNlbGYubGluZSA9IGxpbmUKICAgICAgICBzdXBlcigpLl9faW5pdF9fKGYiTHtsaW5lfToge21lc3NhZ2V9IikKCgpjbGFzcyBfUGFyc2VyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuczogTGlzdFtUb2tlbl0pOgogICAgICAgICMgQ29tbWVudHMgY2Fycnkgbm8gc3RydWN0dXJhbCBtZWFuaW5nIGhlcmUgLSBkcm9wIHRoZW0sIGtlZXAgTkVXTElORQogICAgICAgICMgYXMgdGhlIHN0YXRlbWVudCB0ZXJtaW5hdG9yIHRoYXQgd2FzIGFscmVhZHkgYWxvbmdzaWRlIHRoZW0uCiAgICAgICAgc2VsZi50b2tlbnMgPSBbdCBmb3IgdCBpbiB0b2tlbnMgaWYgdC50eXBlICE9ICJDT01NRU5UIl0KICAgICAgICBzZWxmLnBvcyA9IDAKICAgICAgICBzZWxmLnZhcmlhYmxlczogRGljdFtzdHIsIHN0cl0gPSB7fQoKICAgIGRlZiBfcGVlayhzZWxmLCBvZmZzZXQ6IGludCA9IDApIC0+IFRva2VuOgogICAgICAgIGlkeCA9IHNlbGYucG9zICsgb2Zmc2V0CiAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zW2lkeF0gaWYgaWR4IDwgbGVuKHNlbGYudG9rZW5zKSBlbHNlIHNlbGYudG9rZW5zWy0xXQoKICAgIGRlZiBfYWR2YW5jZShzZWxmKSAtPiBUb2tlbjoKICAgICAgICB0b2sgPSBzZWxmLnRva2Vuc1tzZWxmLnBvc10KICAgICAgICBpZiB0b2sudHlwZSAhPSAiRU9GIjoKICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQogICAgICAgIHJldHVybiB0b2sKCiAgICBkZWYgX3NraXBfbmV3bGluZXMoc2VsZikgLT4gTm9uZToKICAgICAgICB3aGlsZSBzZWxmLl9wZWVrKCkudHlwZSA9PSAiTkVXTElORSI6CiAgICAgICAgICAgIHNlbGYuX2FkdmFuY2UoKQoKICAgIGRlZiBfc3Vic3RpdHV0ZShzZWxmLCB0ZXh0OiBzdHIpIC0+IHN0cjoKICAgICAgICBpZiB0ZXh0LnN0YXJ0c3dpdGgoIiQiKSBhbmQgdGV4dFsxOl0gaW4gc2VsZi52YXJpYWJsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnZhcmlhYmxlc1t0ZXh0WzE6XV0KICAgICAgICByZXR1cm4gdGV4dAoKICAgIGRlZiBfcmVhZF92YWx1ZV90b2tlbnNfdW50aWxfbmV3bGluZShzZWxmKSAtPiBMaXN0W1Rva2VuXToKICAgICAgICB2YWx1ZV90b2tlbnM6IExpc3RbVG9rZW5dID0gW10KICAgICAgICB3aGlsZSBzZWxmLl9wZWVrKCkudHlwZSBub3QgaW4gKCJORVdMSU5FIiwgIkVPRiIpOgogICAgICAgICAgICB2YWx1ZV90b2tlbnMuYXBwZW5kKHNlbGYuX2FkdmFuY2UoKSkKICAgICAgICByZXR1cm4gdmFsdWVfdG9rZW5zCgogICAgZGVmIF90b2tlbnNfdG9fYXJncyhzZWxmLCB2YWx1ZV90b2tlbnM6IExpc3RbVG9rZW5dLCBzcGxpdF9jb21tYXM6IGJvb2wgPSBUcnVlKSAtPiBMaXN0W3N0cl06CiAgICAgICAgIiIiSm9pbiBhIHZhbHVlJ3MgdG9rZW5zIGludG8gJC1zdWJzdGl0dXRlZCBhcmcgc3RyaW5ncywgY29tbWEtc3BsaXQKICAgICAgICBvbmx5IHdoZW4gYHNwbGl0X2NvbW1hc2AgaXMgdHJ1ZS4gaHlwcmxhbmcgb25seSBjb21tYS1zcGxpdHMgZm9yCiAgICAgICAgc3BlY2lmaWMgbXVsdGktYXJnIGRpcmVjdGl2ZXMgKGJpbmQvbW9uaXRvci9hbmltYXRpb24vYmV6aWVyLwogICAgICAgIGdlc3R1cmUvbGF5ZXJydWxlL3dvcmtzcGFjZS9wZXJtaXNzaW9uL2Vudiwgc2VlIENPTU1BX0xJU1RfS0VZUykgLQogICAgICAgIGEgcGxhaW4gYGtleSA9IHZhbHVlYCBrZWVwcyBpdHMgd2hvbGUgcmVtYWluZGVyIGFzIG9uZSB2YWx1ZSwgY29tbWFzCiAgICAgICAgaW5jbHVkZWQuIEZvdW5kIHZpYSB0aGUgcmVhbCBjb25maWcncyBvd24gam9rZSB2YWx1ZQogICAgICAgIChgYW5pbWF0aW9ucyB7IGVuYWJsZWQgPSB5ZXMsIHBsZWFzZSA6KSB9YCksIHdoaWNoIGEgYmxhbmtldCBjb21tYQogICAgICAgIHNwbGl0IHdvdWxkIHdyb25nbHkgY3V0IGludG8gdHdvIGFyZ3MuCgogICAgICAgIEFkamFjZW5jeSAobm8gd2hpdGVzcGFjZSkgaXMgcHJlc2VydmVkIHdpdGhvdXQgYSBzcGFjZTsgYSBnYXAgaW4gdGhlCiAgICAgICAgc291cmNlICh3aGl0ZXNwYWNlIHRoZSBsZXhlcidzIFNLSVAgcnVsZSBkaXNjYXJkZWQpIGJlY29tZXMgZXhhY3RseQogICAgICAgIG9uZSBzcGFjZS4gcG9ueXRhaWw6IFNUUklORyB0b2tlbnMnIHN0cmlwcGVkIHF1b3RlcyB0aHJvdyB0aGlzIG9mZgogICAgICAgIGJ5IDIgY29sdW1ucyBpZiBzb21ldGhpbmcgaXMgZ2x1ZWQgZGlyZWN0bHkgb250byBhIHF1b3RlZCBzdHJpbmcKICAgICAgICB3aXRoIHplcm8gd2hpdGVzcGFjZSAtIG5vdCBhIHJlYWwgc2hhcGUgaW4gdGhpcyBwcm9qZWN0J3MgY29uZmlncywKICAgICAgICBub3Qgd29ydGggdHJhY2tpbmcgZXhhY3QgZW5kLWNvbHVtbnMgcGVyIHRva2VuIHR5cGUgZm9yLgogICAgICAgICIiIgogICAgICAgIHNlZ21lbnRzOiBMaXN0W0xpc3RbVG9rZW5dXSA9IFtbXV0KICAgICAgICBmb3IgdG9rIGluIHZhbHVlX3Rva2VuczoKICAgICAgICAgICAgaWYgc3BsaXRfY29tbWFzIGFuZCB0b2sudHlwZSA9PSAiQ09NTUEiOgogICAgICAgICAgICAgICAgc2VnbWVudHMuYXBwZW5kKFtdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VnbWVudHNbLTFdLmFwcGVuZCh0b2spCgogICAgICAgIGFyZ3M6IExpc3Rbc3RyXSA9IFtdCiAgICAgICAgZm9yIHNlZyBpbiBzZWdtZW50czoKICAgICAgICAgICAgcGllY2UgPSAiIgogICAgICAgICAgICBwcmV2X2VuZF9jb2w6IE9wdGlvbmFsW2ludF0gPSBOb25lCiAgICAgICAgICAgIHBlbmRpbmdfZG9sbGFyID0gRmFsc2UKICAgICAgICAgICAgZm9yIHRvayBpbiBzZWc6CiAgICAgICAgICAgICAgICBpZiB0b2sudHlwZSA9PSAiRE9MTEFSIjoKICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2RvbGxhciA9IFRydWUKICAgICAgICAgICAgICAgICAgICBwcmV2X2VuZF9jb2wgPSB0b2suY29sICsgMQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBnYXAgPSBwcmV2X2VuZF9jb2wgaXMgbm90IE5vbmUgYW5kIHRvay5jb2wgPiBwcmV2X2VuZF9jb2wKICAgICAgICAgICAgICAgIGlmIHBlbmRpbmdfZG9sbGFyOgogICAgICAgICAgICAgICAgICAgIHBpZWNlICs9IHNlbGYuX3N1YnN0aXR1dGUoIiQiICsgdG9rLnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfZG9sbGFyID0gRmFsc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgcGllY2UgYW5kIGdhcDoKICAgICAgICAgICAgICAgICAgICAgICAgcGllY2UgKz0gIiAiCiAgICAgICAgICAgICAgICAgICAgcGllY2UgKz0gdG9rLnZhbHVlCiAgICAgICAgICAgICAgICBwcmV2X2VuZF9jb2wgPSB0b2suY29sICsgbGVuKHRvay52YWx1ZSkKICAgICAgICAgICAgYXJncy5hcHBlbmQocGllY2Uuc3RyaXAoKSkKICAgICAgICByZXR1cm4gYXJncwoKICAgIGRlZiBwYXJzZShzZWxmKSAtPiBIeXBybGFuZ0ZpbGU6CiAgICAgICAgc3RhdGVtZW50cyA9IHNlbGYuX3BhcnNlX3N0YXRlbWVudHMoKQogICAgICAgIHJldHVybiBIeXBybGFuZ0ZpbGUodmFyaWFibGVzPXNlbGYudmFyaWFibGVzLCBzdGF0ZW1lbnRzPXN0YXRlbWVudHMpCgogICAgZGVmIF9wYXJzZV9zdGF0ZW1lbnRzKHNlbGYpIC0+IExpc3RbU3RhdGVtZW50XToKICAgICAgICBzdGF0ZW1lbnRzOiBMaXN0W1N0YXRlbWVudF0gPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHNlbGYuX3NraXBfbmV3bGluZXMoKQogICAgICAgICAgICB0b2sgPSBzZWxmLl9wZWVrKCkKICAgICAgICAgICAgaWYgdG9rLnR5cGUgaW4gKCJFT0YiLCAiQkxPQ0tfQ0xPU0UiKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHN0YXRlbWVudHMuYXBwZW5kKHNlbGYuX3BhcnNlX29uZV9zdGF0ZW1lbnQoKSkKICAgICAgICByZXR1cm4gc3RhdGVtZW50cwoKICAgIGRlZiBfcGFyc2Vfb25lX3N0YXRlbWVudChzZWxmKSAtPiBTdGF0ZW1lbnQ6CiAgICAgICAgdG9rID0gc2VsZi5fcGVlaygpCiAgICAgICAgbGluZSA9IHRvay5saW5lCgogICAgICAgIGlmIHRvay50eXBlID09ICJET0xMQVIiOgogICAgICAgICAgICBzZWxmLl9hZHZhbmNlKCkKICAgICAgICAgICAgbmFtZSA9IHNlbGYuX2FkdmFuY2UoKS52YWx1ZQogICAgICAgICAgICBzZWxmLl9leHBlY3QoIkVRVUFMUyIsIGxpbmUpCiAgICAgICAgICAgIHZhbHVlX3Rva2VucyA9IHNlbGYuX3JlYWRfdmFsdWVfdG9rZW5zX3VudGlsX25ld2xpbmUoKQogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3Rva2Vuc190b19hcmdzKHZhbHVlX3Rva2VucylbMF0gaWYgdmFsdWVfdG9rZW5zIGVsc2UgIiIKICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICByZXR1cm4gVmFyaWFibGVBc3NpZ24obmFtZT1uYW1lLCB2YWx1ZT12YWx1ZSwgbGluZT1saW5lKQoKICAgICAgICBpZiB0b2sudHlwZSAhPSAiSURFTlQiOgogICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKGYiZXhwZWN0ZWQgYSBkaXJlY3RpdmUsIGJsb2NrLCBvciB2YXJpYWJsZSwgZ290IHt0b2sudHlwZX0iLCBsaW5lKQoKICAgICAgICBrZXlfcGFydHMgPSBbc2VsZi5fYWR2YW5jZSgpLnZhbHVlXQogICAgICAgIHdoaWxlIHNlbGYuX3BlZWsoKS50eXBlIGluICgiQ09MT04iLCAiRE9UIik6CiAgICAgICAgICAgIGtleV9wYXJ0cy5hcHBlbmQoc2VsZi5fYWR2YW5jZSgpLnZhbHVlKQogICAgICAgICAgICBrZXlfcGFydHMuYXBwZW5kKHNlbGYuX2FkdmFuY2UoKS52YWx1ZSkKICAgICAgICBrZXkgPSAiIi5qb2luKGtleV9wYXJ0cykKCiAgICAgICAgbnh0ID0gc2VsZi5fcGVlaygpCiAgICAgICAgaWYgbnh0LnR5cGUgPT0gIkJMT0NLX09QRU4iOgogICAgICAgICAgICBzZWxmLl9hZHZhbmNlKCkKICAgICAgICAgICAgYmxvY2sgPSBzZWxmLl9wYXJzZV9ibG9jayhrZXksIGxpbmUpCiAgICAgICAgICAgIGlmIGtleSBpbiBXSU5ET1dfUlVMRV9OQU1FUzoKICAgICAgICAgICAgICAgIHJldHVybiBfYmxvY2tfdG9fd2luZG93X3J1bGUoYmxvY2spCiAgICAgICAgICAgIHJldHVybiBibG9jawoKICAgICAgICBpZiBueHQudHlwZSA9PSAiRVFVQUxTIjoKICAgICAgICAgICAgc2VsZi5fYWR2YW5jZSgpCiAgICAgICAgICAgIHZhbHVlX3Rva2VucyA9IHNlbGYuX3JlYWRfdmFsdWVfdG9rZW5zX3VudGlsX25ld2xpbmUoKQogICAgICAgICAgICBzcGxpdF9jb21tYXMgPSBrZXkgaW4gV0lORE9XX1JVTEVfTkFNRVMgb3IgX2lzX2NvbW1hX2xpc3Rfa2V5KGtleSkKICAgICAgICAgICAgYXJncyA9IHNlbGYuX3Rva2Vuc190b19hcmdzKHZhbHVlX3Rva2Vucywgc3BsaXRfY29tbWFzPXNwbGl0X2NvbW1hcykKICAgICAgICAgICAgaWYga2V5IGluIFdJTkRPV19SVUxFX05BTUVTOgogICAgICAgICAgICAgICAgcmV0dXJuIF9vbmVfbGluZV90b193aW5kb3dfcnVsZShhcmdzLCBsaW5lKQogICAgICAgICAgICByZXR1cm4gRGlyZWN0aXZlKGtleT1rZXksIGFyZ3M9YXJncywgbGluZT1saW5lKQoKICAgICAgICByYWlzZSBQYXJzZUVycm9yKGYiZXhwZWN0ZWQgJz0nIG9yICd7eycgYWZ0ZXIgJ3trZXl9JywgZ290IHtueHQudHlwZX0iLCBsaW5lKQoKICAgIGRlZiBfZXhwZWN0KHNlbGYsIHRva2VuX3R5cGU6IHN0ciwgbGluZTogaW50KSAtPiBUb2tlbjoKICAgICAgICB0b2sgPSBzZWxmLl9wZWVrKCkKICAgICAgICBpZiB0b2sudHlwZSAhPSB0b2tlbl90eXBlOgogICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKGYiZXhwZWN0ZWQge3Rva2VuX3R5cGV9LCBnb3Qge3Rvay50eXBlfSIsIGxpbmUpCiAgICAgICAgcmV0dXJuIHNlbGYuX2FkdmFuY2UoKQoKICAgIGRlZiBfcGFyc2VfYmxvY2soc2VsZiwgbmFtZTogc3RyLCBsaW5lOiBpbnQpIC0+IEJsb2NrOgogICAgICAgIGJsb2NrID0gQmxvY2sobmFtZT1uYW1lLCBsaW5lPWxpbmUpCiAgICAgICAgZm9yIHN0bXQgaW4gc2VsZi5fcGFyc2Vfc3RhdGVtZW50cygpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0bXQsIEJsb2NrKToKICAgICAgICAgICAgICAgIGJsb2NrLmJsb2Nrcy5hcHBlbmQoc3RtdCkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0bXQsIERpcmVjdGl2ZSk6CiAgICAgICAgICAgICAgICBibG9jay5kaXJlY3RpdmVzLmFwcGVuZChzdG10KQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3RtdCwgVmFyaWFibGVBc3NpZ24pOgogICAgICAgICAgICAgICAgIyBoeXBybGFuZyBhbGxvd3MgJHZhciA9IC4uLiBpbnNpZGUgYmxvY2tzIHRvbzsga2VlcCBpdCBpbgogICAgICAgICAgICAgICAgIyB0aGUgc2hhcmVkIGdsb2JhbCB2YXJpYWJsZSB0YWJsZSwgZG9uJ3QgYXR0YWNoIHRvIGEgbm9kZS4KICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoZiJ1bmV4cGVjdGVkIG5lc3RlZCB3aW5kb3cgcnVsZSBpbnNpZGUgJ3tuYW1lfSciLCBsaW5lKQogICAgICAgIHNlbGYuX2V4cGVjdCgiQkxPQ0tfQ0xPU0UiLCBsaW5lKQogICAgICAgIHJldHVybiBibG9jawoKICAgIGRlZiBfY3VycmVudF9saW5lKHNlbGYpIC0+IGludDoKICAgICAgICByZXR1cm4gc2VsZi5fcGVlaygpLmxpbmUKCgpkZWYgX2Jsb2NrX3RvX3dpbmRvd19ydWxlKGJsb2NrOiBCbG9jaykgLT4gV2luZG93UnVsZToKICAgIHJ1bGUgPSBXaW5kb3dSdWxlKGxpbmU9YmxvY2subGluZSkKICAgIGZvciBkIGluIGJsb2NrLmRpcmVjdGl2ZXM6CiAgICAgICAgdmFsdWUgPSBkLmFyZ3NbMF0gaWYgZC5hcmdzIGVsc2UgIiIKICAgICAgICBpZiBkLmtleS5zdGFydHN3aXRoKCJtYXRjaDoiKToKICAgICAgICAgICAgcnVsZS5tYXRjaFtkLmtleVtsZW4oIm1hdGNoOiIpOl1dID0gdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBydWxlLnByb3BlcnRpZXNbZC5rZXldID0gdmFsdWUKICAgIHJldHVybiBydWxlCgoKZGVmIF9vbmVfbGluZV90b193aW5kb3dfcnVsZShhcmdzOiBMaXN0W3N0cl0sIGxpbmU6IGludCkgLT4gV2luZG93UnVsZToKICAgIHJ1bGUgPSBXaW5kb3dSdWxlKGxpbmU9bGluZSkKICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHJldHVybiBydWxlCiAgICBydWxlX3NwZWMsICpzZWxlY3RvcnMgPSBhcmdzCiAgICBpZiAiICIgaW4gcnVsZV9zcGVjOgogICAgICAgIHByb3AsIHZhbCA9IHJ1bGVfc3BlYy5zcGxpdCgiICIsIDEpCiAgICAgICAgcnVsZS5wcm9wZXJ0aWVzW3Byb3BdID0gdmFsCiAgICBlbGlmIHJ1bGVfc3BlYzoKICAgICAgICBydWxlLnByb3BlcnRpZXNbcnVsZV9zcGVjXSA9ICJ0cnVlIgogICAgZm9yIHNlbCBpbiBzZWxlY3RvcnM6CiAgICAgICAgaWYgIjoiIGluIHNlbDoKICAgICAgICAgICAgaywgdiA9IHNlbC5zcGxpdCgiOiIsIDEpCiAgICAgICAgICAgIHJ1bGUubWF0Y2hba10gPSB2CiAgICByZXR1cm4gcnVsZQoKCmRlZiBwYXJzZShzb3VyY2U6IHN0cikgLT4gSHlwcmxhbmdGaWxlOgogICAgcmV0dXJuIF9QYXJzZXIodG9rZW5pemUoc291cmNlKSkucGFyc2UoKQoKCmRlZiBwYXJzZV9maWxlKHBhdGgpIC0+IEh5cHJsYW5nRmlsZToKICAgIHdpdGggb3BlbihwYXRoLCAiciIpIGFzIGY6CiAgICAgICAgcmV0dXJuIHBhcnNlKGYucmVhZCgpKQo=", "hyprvalidate/luaast/reader.py": "IiIiUGFyc2UgYW4gZXhpc3RpbmcgTHVhIGNvbmZpZyBmaWxlIGludG8gYW4gQVNULCBhbmQgcHJvdmlkZSB0aGUgdHdvCnNjaGVtYS1hZ25vc3RpYyB1dGlsaXRpZXMgdGhlIHNjaGVtYS1kcml2ZW4gY2hlY2tlciAoYSBzZXBhcmF0ZSBjb21wb25lbnQpCm5lZWRzIHRvIHdhbGsgaXQ6IHJlc29sdmluZyBhIGRvdHRlZC1tZW1iZXItYWNjZXNzIGNoYWluIHRvIGEgcGxhaW4gc3RyaW5nCihlLmcuIGBobC5kc3Aud2luZG93LmNsb3NlYCBmcm9tIGEgTmFtZS9JbmRleCBjaGFpbiksIGFuZCByZXNvbHZpbmcgYSBMdWEKbGl0ZXJhbCBleHByZXNzaW9uIHRvIGEgcGxhaW4gUHl0aG9uIHZhbHVlICsgdHlwZS1raW5kLgoKRGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGtub3cgYWJvdXQgdGhlIHNjaGVtYSwgYW5kIGRvZXMgbm90IGRlY2lkZSB3aGF0J3MKdmFsaWQg4oCUIHRoYXQncyB0aGUgY2hlY2tlcidzIGpvYi4gVGhpcyBtb2R1bGUgb25seSBhbnN3ZXJzICJ3aGF0IGRvZXMgdGhpcwpwaWVjZSBvZiBzeW50YXggc2F5Iiwgbm90ICJpcyB0aGF0IGFsbG93ZWQiLgoKQnVpbHQgb24gYGx1YXBhcnNlcmAgKE1JVCwgQU5UTFItZ2VuZXJhdGVkIEx1YSBncmFtbWFyKSByYXRoZXIgdGhhbiBhCmhhbmQtcm9sbGVkIHBhcnNlciAtIHZlcmlmaWVkIGFnYWluc3QgdGhpcyBwcm9qZWN0J3Mgb3duIHJlYWwgY29uZmlnCihoeXBybGFuZC1sdWEva2V5YmluZHMubHVhOiAxMDEgQ2FsbC9NZXRob2Qgbm9kZXMsIGxhbWJkYS1ib2RpZWQgYmluZHMsCmEgRm9ybnVtIGxvb3ApIGJlZm9yZSBhZG9wdGluZyBpdC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmZyb20gbHVhcGFyc2VyIGltcG9ydCBhc3QgYXMgX2x1YWFzdApmcm9tIGx1YXBhcnNlci5hc3Rub2RlcyBpbXBvcnQgKAogICAgQ2h1bmssCiAgICBOb2RlLAogICAgTmFtZSwKICAgIEluZGV4LAogICAgU3RyaW5nLAogICAgTnVtYmVyLAogICAgVHJ1ZUV4cHIsCiAgICBGYWxzZUV4cHIsCiAgICBOaWwsCikKCgpjbGFzcyBMdWFTeW50YXhFcnJvcihFeGNlcHRpb24pOgogICAgIiIiUmFpc2VkIHdoZW4gdGhlIGlucHV0IGlzbid0IHZhbGlkIEx1YSBhdCBhbGwuIiIiCgoKZGVmIHBhcnNlKHNvdXJjZTogc3RyKSAtPiBDaHVuazoKICAgIHRyeToKICAgICAgICByZXR1cm4gX2x1YWFzdC5wYXJzZShzb3VyY2UpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzogICMgbHVhcGFyc2VyIHJhaXNlcyBpdHMgb3duIEFOVExSLXdyYXBwZWQgZXJyb3JzCiAgICAgICAgcmFpc2UgTHVhU3ludGF4RXJyb3Ioc3RyKGV4YykpIGZyb20gZXhjCgoKZGVmIHBhcnNlX2ZpbGUocGF0aDogc3RyIHwgUGF0aCkgLT4gQ2h1bms6CiAgICByZXR1cm4gcGFyc2UoUGF0aChwYXRoKS5yZWFkX3RleHQoKSkKCgpkZWYgcmVzb2x2ZV9kb3R0ZWRfbmFtZShleHByOiBOb2RlIHwgTm9uZSkgLT4gc3RyIHwgTm9uZToKICAgICIiIlR1cm4gYSBOYW1lL0luZGV4IGNoYWluIGludG8gYSBkb3R0ZWQgc3RyaW5nLCBlLmcuIHRoZSBBU1QgZm9yCiAgICBgaGwuZHNwLndpbmRvdy5jbG9zZWAgLT4gImhsLmRzcC53aW5kb3cuY2xvc2UiLiBSZXR1cm5zIE5vbmUgZm9yCiAgICBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGxhaW4gZG90dGVkLWFjY2VzcyBjaGFpbiAoZS5nLiBgdFtpXWAgd2l0aCBhCiAgICBub24tTmFtZSBpbmRleCwgYSBjYWxsLCBhIGxpdGVyYWwpLgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIE5hbWUpOgogICAgICAgIHJldHVybiBleHByLmlkCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIEluZGV4KToKICAgICAgICBiYXNlID0gcmVzb2x2ZV9kb3R0ZWRfbmFtZShleHByLnZhbHVlKQogICAgICAgIGlmIGJhc2UgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBpc2luc3RhbmNlKGV4cHIuaWR4LCBOYW1lKToKICAgICAgICAgICAgcmV0dXJuIGYie2Jhc2V9LntleHByLmlkeC5pZH0iCiAgICAgICAgaWYgaXNpbnN0YW5jZShleHByLmlkeCwgU3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGYie2Jhc2V9LntleHByLmlkeC5zLmRlY29kZSgpIGlmIGlzaW5zdGFuY2UoZXhwci5pZHgucywgYnl0ZXMpIGVsc2UgZXhwci5pZHguc30iCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBOb25lCgoKQGRhdGFjbGFzcwpjbGFzcyBMaXRlcmFsVmFsdWU6CiAgICB2YWx1ZTogQW55CiAgICBraW5kOiBzdHIgICMgInN0cmluZyIgfCAibnVtYmVyIiB8ICJib29sZWFuIiB8ICJuaWwiCgoKZGVmIHJlc29sdmVfbGl0ZXJhbChleHByOiBOb2RlIHwgTm9uZSkgLT4gTGl0ZXJhbFZhbHVlIHwgTm9uZToKICAgICIiIlJlc29sdmUgYSBzY2FsYXIgTHVhIGxpdGVyYWwgZXhwcmVzc2lvbiB0byBhIHBsYWluIFB5dGhvbiB2YWx1ZS4KICAgIFJldHVybnMgTm9uZSBmb3IgYW55dGhpbmcgdGhhdCBpc24ndCBhIHNjYWxhciBsaXRlcmFsICh0YWJsZXMsIGNhbGxzLAogICAgdmFyaWFibGUgcmVmZXJlbmNlcywgY29uY2F0ZW5hdGlvbiBleHByZXNzaW9ucywgZXRjKSAtIHRob3NlIG5lZWQKICAgIHNjaGVtYS1hd2FyZSBoYW5kbGluZyB0aGUgY2hlY2tlciBkb2VzLCBub3QgdGhpcyBtb2R1bGUuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZXhwciwgU3RyaW5nKToKICAgICAgICBzID0gZXhwci5zCiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShzLmRlY29kZSgpIGlmIGlzaW5zdGFuY2UocywgYnl0ZXMpIGVsc2UgcywgInN0cmluZyIpCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIE51bWJlcik6CiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShleHByLm4sICJudW1iZXIiKQogICAgaWYgaXNpbnN0YW5jZShleHByLCBUcnVlRXhwcik6CiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShUcnVlLCAiYm9vbGVhbiIpCiAgICBpZiBpc2luc3RhbmNlKGV4cHIsIEZhbHNlRXhwcik6CiAgICAgICAgcmV0dXJuIExpdGVyYWxWYWx1ZShGYWxzZSwgImJvb2xlYW4iKQogICAgaWYgaXNpbnN0YW5jZShleHByLCBOaWwpOgogICAgICAgIHJldHVybiBMaXRlcmFsVmFsdWUoTm9uZSwgIm5pbCIpCiAgICByZXR1cm4gTm9uZQoKCmRlZiB3YWxrKHRyZWU6IE5vZGUpOgogICAgIiIiUmUtZXhwb3J0ZWQgZm9yIGNhbGxlcnMgdGhhdCBqdXN0IG5lZWQgdG8gaXRlcmF0ZSBldmVyeSBub2RlIC0KICAgIHRoaW4gcGFzc3Rocm91Z2ggc28gY2FsbGVycyBvbmx5IGltcG9ydCBmcm9tIHRoaXMgbW9kdWxlLCBub3QKICAgIGx1YXBhcnNlciBkaXJlY3RseS4iIiIKICAgIHJldHVybiBfbHVhYXN0LndhbGsodHJlZSkK", "hyprvalidate/luaast/writer.py": "IiIiTHVhIEFTVCBidWlsZGVyIGhlbHBlcnMuCgpgbHVhcGFyc2VyYCB3cml0ZXMgTHVhIHRvbyAoYGFzdC50b19sdWFfc291cmNlYCksIHNvIHRoaXMgZG9lc24ndCBuZWVkIGEKY3VzdG9tIEx1YSBBU1QgLSBpdCdzIGEgdGhpbiBsYXllciBvdmVyIGBsdWFwYXJzZXIuYXN0bm9kZXNgIHRoYXQgZ2V0cyBvbmUKZm9vdGd1biByaWdodCBpbiBvbmUgcGxhY2UgaW5zdGVhZCBvZiBhdCBldmVyeSBjYWxsIHNpdGU6IGBhc3Rub2Rlcy5TdHJpbmdgCnRha2VzIGJvdGggYSBgc3RyYCB2YWx1ZSBhbmQgYW4gYWxyZWFkeS1MdWEtcXVvdGVkIGByYXdgIGZpZWxkLCBhbmQgZ2V0dGluZwpgcmF3YCB3cm9uZyAoZS5nLiBwYXNzaW5nIHRoZSBiYXJlIFB5dGhvbiBzdHJpbmcpIG1ha2VzIHRoZSBvdXRwdXQKcm91bmQtdHJpcCBpbmNvcnJlY3RseS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCByZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBJdGVyYWJsZSwgTGlzdCwgVHVwbGUsIFVuaW9uCgpmcm9tIGx1YXBhcnNlciBpbXBvcnQgYXN0IGFzIGx1YWFzdApmcm9tIGx1YXBhcnNlci5hc3Rub2RlcyBpbXBvcnQgKAogICAgQW5vbnltb3VzRnVuY3Rpb24sCiAgICBDYWxsLAogICAgQ2h1bmssCiAgICBCbG9jaywKICAgIEZpZWxkLAogICAgRmFsc2VFeHByLAogICAgSW5kZXgsCiAgICBJbmRleE5vdGF0aW9uLAogICAgTmFtZSwKICAgIE5pbCwKICAgIE5vZGUsCiAgICBOdW1iZXIsCiAgICBTdHJpbmcsCiAgICBTdHJpbmdEZWxpbWl0ZXIsCiAgICBUYWJsZSwKICAgIFRydWVFeHByLAopCgoKZGVmIGx1YXN0cihzOiBzdHIpIC0+IFN0cmluZzoKICAgICIiImByYXdgIGlzIHRoZSBlc2NhcGVkICpjb250ZW50cyogb25seSAtIHRoZSBwcmludGVyIChMdWFPdXRwdXRWaXNpdG9yLAogICAgY29uZmlybWVkIGJ5IHJlYWRpbmcgbHVhcGFyc2VyL3ByaW50ZXJzLnB5KSB3cmFwcyBpdCBpbiB0aGUgZGVsaW1pdGVyJ3MKICAgIHF1b3RlIGNoYXJhY3RlcnMgaXRzZWxmLiBQYXNzaW5nIGFuIGFscmVhZHktcXVvdGVkIGByYXdgIGRvdWJsZS1xdW90ZXMKICAgIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiByb3VuZC10cmlwcGluZy4iIiIKICAgIGVzY2FwZWQgPSBzLnJlcGxhY2UoIlxcIiwgIlxcXFwiKS5yZXBsYWNlKCciJywgJ1xcIicpCiAgICByZXR1cm4gU3RyaW5nKHM9cy5lbmNvZGUoInV0Zi04IiksIHJhdz1lc2NhcGVkLCBkZWxpbWl0ZXI9U3RyaW5nRGVsaW1pdGVyLkRPVUJMRV9RVU9URSkKCgpkZWYgbHVhbnVtKG4pIC0+IE51bWJlcjoKICAgIHJldHVybiBOdW1iZXIobikKCgpkZWYgbHVhYm9vbChiOiBib29sKToKICAgIHJldHVybiBUcnVlRXhwcigpIGlmIGIgZWxzZSBGYWxzZUV4cHIoKQoKCmRlZiBsdWFuYW1lKG5hbWU6IHN0cikgLT4gTmFtZToKICAgIHJldHVybiBOYW1lKGlkZW50aWZpZXI9bmFtZSkKCgpkZWYgbWVtYmVyKCpwYXJ0czogc3RyKSAtPiBOb2RlOgogICAgIiIiQnVpbGQgYSBkb3R0ZWQgbWVtYmVyLWFjY2VzcyBjaGFpbjogbWVtYmVyKCJobCIsICJkc3AiLCAid2luZG93IiwgImNsb3NlIikKICAgIC0+IHRoZSBBU1QgZm9yIGBobC5kc3Aud2luZG93LmNsb3NlYC4iIiIKICAgIGlmIG5vdCBwYXJ0czoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtZW1iZXIoKSBuZWVkcyBhdCBsZWFzdCBvbmUgcGFydCIpCiAgICBub2RlOiBOb2RlID0gbHVhbmFtZShwYXJ0c1swXSkKICAgIGZvciBwYXJ0IGluIHBhcnRzWzE6XToKICAgICAgICBub2RlID0gSW5kZXgoaWR4PWx1YW5hbWUocGFydCksIHZhbHVlPW5vZGUsIG5vdGF0aW9uPUluZGV4Tm90YXRpb24uRE9UKQogICAgcmV0dXJuIG5vZGUKCgpkZWYgX3RvX2V4cHIodmFsdWU6IEFueSkgLT4gTm9kZToKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIE5vZGUpOgogICAgICAgIHJldHVybiB2YWx1ZQogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CiAgICAgICAgcmV0dXJuIGx1YWJvb2wodmFsdWUpCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgogICAgICAgIHJldHVybiBsdWFzdHIodmFsdWUpCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBmbG9hdCkpOgogICAgICAgIHJldHVybiBsdWFudW0odmFsdWUpCiAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOaWwoKQogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgcmV0dXJuIGx1YXRhYmxlKHZhbHVlKQogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgcmV0dXJuIGx1YXRhYmxlKHZhbHVlKQogICAgcmFpc2UgVHlwZUVycm9yKGYiZG9uJ3Qga25vdyBob3cgdG8gYnVpbGQgYSBMdWEgZXhwcmVzc2lvbiBmcm9tIHt0eXBlKHZhbHVlKSFyfSIpCgoKX1ZBTElEX0lERU5USUZJRVIgPSByZS5jb21waWxlKHIiXltBLVphLXpfXVtBLVphLXowLTlfXSokIikKCgpkZWYgX2ZpZWxkX2Zvcl9rZXkoa2V5OiBzdHIsIHZhbHVlOiBOb2RlKSAtPiBGaWVsZDoKICAgICIiIkEgTHVhIHRhYmxlIGtleSB0aGF0IGlzbid0IGEgdmFsaWQgYmFyZSBpZGVudGlmaWVyIChjb250YWlucyBhIGRvdCwKICAgIGh5cGhlbiwgZXRjIC0gcmVhbCBoeXBybGFuZyBrZXlzIGxpa2UgYGNvbC5hY3RpdmVfYm9yZGVyYCBkbykgbXVzdCBiZQogICAgd3JpdHRlbiBhcyBhIGJyYWNrZXRlZCBzdHJpbmcga2V5IChgWyJjb2wuYWN0aXZlX2JvcmRlciJdID0gLi4uYCksIG5vdAogICAgYSBiYXJlIE5hbWUgLSBmb3VuZCBieSBhY3R1YWxseSBydW5uaW5nIHRoZSBjb252ZXJ0ZXIgYWdhaW5zdCB0aGUgcmVhbAogICAgY29uZmlnLCBub3QgYW50aWNpcGF0ZWQgdXAgZnJvbnQuIiIiCiAgICBpZiBfVkFMSURfSURFTlRJRklFUi5tYXRjaChrZXkpOgogICAgICAgIHJldHVybiBGaWVsZChrZXk9bHVhbmFtZShrZXkpLCB2YWx1ZT12YWx1ZSkKICAgIHJldHVybiBGaWVsZChrZXk9bHVhc3RyKGtleSksIHZhbHVlPXZhbHVlLCBiZXR3ZWVuX2JyYWNrZXRzPVRydWUpCgoKZGVmIGx1YXRhYmxlKGl0ZW1zOiBVbmlvbltEaWN0W3N0ciwgQW55XSwgSXRlcmFibGVbQW55XSwgSXRlcmFibGVbVHVwbGVbc3RyLCBBbnldXV0pIC0+IFRhYmxlOgogICAgIiIiQnVpbGQgYSBMdWEgdGFibGUuIEEgZGljdCAob3IgYW4gaXRlcmFibGUgb2YgKGtleSwgdmFsdWUpIHBhaXJzKQogICAgYmVjb21lcyBhIHJlY29yZC1zdHlsZSB0YWJsZSBgeyBrZXkgPSB2YWx1ZSwgLi4uIH1gOyBhbnkgb3RoZXIKICAgIGl0ZXJhYmxlIGJlY29tZXMgYW4gYXJyYXktc3R5bGUgdGFibGUgYHsgdmFsdWUsIHZhbHVlLCAuLi4gfWAuIiIiCiAgICBmaWVsZHM6IExpc3RbRmllbGRdID0gW10KICAgIGlmIGlzaW5zdGFuY2UoaXRlbXMsIGRpY3QpOgogICAgICAgIHBhaXJzID0gaXRlbXMuaXRlbXMoKQogICAgZWxzZToKICAgICAgICBpdGVtcyA9IGxpc3QoaXRlbXMpCiAgICAgICAgaWYgaXRlbXMgYW5kIGlzaW5zdGFuY2UoaXRlbXNbMF0sIHR1cGxlKSBhbmQgbGVuKGl0ZW1zWzBdKSA9PSAyOgogICAgICAgICAgICBwYWlycyA9IGl0ZW1zCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFpcnMgPSBOb25lCgogICAgaWYgcGFpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gcGFpcnM6CiAgICAgICAgICAgIGZpZWxkcy5hcHBlbmQoX2ZpZWxkX2Zvcl9rZXkoa2V5LCBfdG9fZXhwcih2YWx1ZSkpKQogICAgZWxzZToKICAgICAgICBmb3IgdmFsdWUgaW4gaXRlbXM6CiAgICAgICAgICAgIGZpZWxkcy5hcHBlbmQoRmllbGQoa2V5PU5vbmUsIHZhbHVlPV90b19leHByKHZhbHVlKSkpCgogICAgcmV0dXJuIFRhYmxlKGZpZWxkcz1maWVsZHMpCgoKZGVmIGFub25fZnVuY3Rpb24oc3RhdGVtZW50czogTGlzdFtOb2RlXSkgLT4gQW5vbnltb3VzRnVuY3Rpb246CiAgICByZXR1cm4gQW5vbnltb3VzRnVuY3Rpb24oYXJncz1bXSwgYm9keT1CbG9jayhib2R5PXN0YXRlbWVudHMpKQoKCmRlZiBobGNhbGwoZG90dGVkX25hbWU6IHN0ciwgKmFyZ3M6IEFueSkgLT4gQ2FsbDoKICAgICIiIkJ1aWxkIGEgY2FsbCB0byBhIGRvdHRlZCBobC4qIGZ1bmN0aW9uOiBobGNhbGwoImhsLm1vbml0b3IiLCB7Li4ufSkuIiIiCiAgICBmdW5jID0gbWVtYmVyKCpkb3R0ZWRfbmFtZS5zcGxpdCgiLiIpKQogICAgcmV0dXJuIENhbGwoZnVuYz1mdW5jLCBhcmdzPVtfdG9fZXhwcihhKSBmb3IgYSBpbiBhcmdzXSkKCgpkZWYgY2h1bmsoc3RhdGVtZW50czogTGlzdFtOb2RlXSkgLT4gQ2h1bms6CiAgICByZXR1cm4gQ2h1bmsoYm9keT1CbG9jayhib2R5PXN0YXRlbWVudHMpKQoKCmRlZiB0b19zb3VyY2Uocm9vdDogTm9kZSkgLT4gc3RyOgogICAgcmV0dXJuIGx1YWFzdC50b19sdWFfc291cmNlKHJvb3QpCg==", "hyprvalidate/checker.py": "IiIiVGhlIGFjdHVhbCBWYWxpZGF0b3IgbG9naWMuIFdhbGtzIGEgcGFyc2VkIEx1YSBmaWxlICh2aWEKaHlwcnZhbGlkYXRlLmx1YWFzdC5yZWFkZXIpIGFuZCBjcm9zcy1yZWZlcmVuY2VzIGV2ZXJ5IGBobC4qYCBzeW1ib2wKcmVmZXJlbmNlIGFuZCBldmVyeSBgaGwuY29uZmlnKHsuLi59KWAga2V5L3ZhbHVlIGFnYWluc3QgdGhlIHNjaGVtYSAodmlhCmh5cHJ2YWxpZGF0ZS5zY2hlbWEuZXh0cmFjdG9yKSDigJQgdGhlIG9uZSB0aGluZyBub25lIG9mIHRoZSBmb3VyIGV4aXN0aW5nCmh5cHJsYW5nLT5sdWEgY29udmVydGVycyBkbyAoc2VlIGRvY3MvQ09NUEFSSVNPTi5tZCkuCgpTY29wZSwgc3RhdGVkIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gbGVmdCBpbXBsaWNpdDoKICAtIFN5bWJvbCByZXNvbHV0aW9uIHdhbGtzIEhMLkFQSSAtPiBuYW1lc3BhY2UgY2xhc3NlcyAtPiBsZWFmIGBmdW4oLi4uKWAKICAgIGZpZWxkcy4gQW55dGhpbmcgdW5kZXIgYGhsLnBsdWdpbi4qYCBiZXlvbmQgdGhlIG9uZSBkb2N1bWVudGVkIGBsb2FkYAogICAgZmllbGQgaXMgYWNjZXB0ZWQgdW5jb25kaXRpb25hbGx5IC0gSEwuUGx1Z2luTmFtZXNwYWNlIGhhcyBhIGR5bmFtaWMKICAgIGBbc3RyaW5nXSBhbnlgIGluZGV4IHNpZ25hdHVyZSBmb3IgcGx1Z2luLXJlZ2lzdGVyZWQgbWVtYmVycyAoZS5nLgogICAgYGhsLnBsdWdpbi5keW5hbWljX2N1cnNvcnNgKSB0aGF0IGlzbid0IGxpdGVyYWwgZGF0YSB0aGUgZXh0cmFjdG9yIGNhbgogICAgZW51bWVyYXRlLiBTZWUgZXh0cmFjdG9yLnB5J3MgYnJhY2tldC1maWVsZCByZWdleC4KICAtIENvbmZpZy1rZXkvdmFsdWUgY2hlY2tpbmcgb25seSB2YWxpZGF0ZXMgKnNjYWxhciogdmFsdWVzIChzdHJpbmcvCiAgICBudW1iZXIvYm9vbGVhbi9uaWwpIGFnYWluc3QgdGhlIHNjaGVtYSdzIHR5cGUgZXhwcmVzc2lvbi4gQSBrZXkgd2hvc2UKICAgIHNjaGVtYSB0eXBlIGluY2x1ZGVzIGEgdGFibGUtc2hhcGVkIGFsdGVybmF0aXZlIChjb250YWlucyAieyIgb3IgbmFtZXMKICAgIGFuICJITC4iIGNsYXNzLCBlLmcuIGBzdHJpbmd8SEwuR3JhZGllbnRgKSBpcyBhY2NlcHRlZCB3aXRob3V0CiAgICBzdHJ1Y3R1cmFsbHkgY2hlY2tpbmcgdGhlIHRhYmxlJ3Mgb3duIGZpZWxkcyAtIHRoYXQgd291bGQgcmVxdWlyZQogICAgbW9kZWxsaW5nIGV2ZXJ5IHN1Y2ggY2xhc3MncyBzaGFwZSwgd2hpY2ggaXMgcmVhbCB3b3JrIHNhdmVkIGZvciBhCiAgICBsYXRlciBwYXNzIGlmIGl0IHR1cm5zIG91dCB0byBtYXR0ZXIuIERvY3VtZW50ZWQsIG5vdCBzaWxlbnQuCiAgLSBBIGNvbmZpZyB2YWx1ZSB0aGF0J3MgYSB2YXJpYWJsZSByZWZlcmVuY2UsIGZ1bmN0aW9uIGNhbGwsIG9yIGFueXRoaW5nCiAgICBlbHNlIHRoYXQgaXNuJ3QgYSBsaXRlcmFsIG9yIGEgdGFibGUgY29uc3RydWN0b3IgaXMgYWNjZXB0ZWQgd2l0aG91dAogICAgY29tbWVudCAtIGl0IGNhbid0IGJlIGNoZWNrZWQgd2l0aG91dCBldmFsdWF0aW5nIHRoZSBzY3JpcHQuCiAgLSBDYWxsLXNoYXBlIChhcml0eSkgY2hlY2tpbmcgb25seSBhcHBsaWVzIHRvIHN5bWJvbHMgd2hvc2Ugc3R1YiB0eXBlIGlzCiAgICBhICpuYW1lZCogc2lnbmF0dXJlIChlLmcuIGBobC5tb25pdG9yYCBpcyBgZnVuKHNwZWM6IEhMLk1vbml0b3JTcGVjKToKICAgIG5pbGApIC0gYXJndW1lbnQgY291bnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHJlcXVpcmVkL29wdGlvbmFsIHBhcmFtcy4KICAgIE1hbnkgc3R1YiBmdW5jdGlvbnMgYXJlIHR5cGVkIGBmdW4oLi4uKTogWGAgd2l0aCBubyBuYW1lZCBwYXJhbXMgYXQKICAgIGFsbCAodGhlIGRzcC4qIGRpc3BhdGNoZXIgYnVpbGRlcnMsIGBlbnZgLCBgY3VydmVgLCBgYW5pbWF0aW9uYCwgZXRjKSAtCiAgICB0aG9zZSBhcmUgbmV2ZXIgYXJpdHktY2hlY2tlZCwgaG9uZXN0bHksIGJlY2F1c2UgdGhlcmUncyBub3RoaW5nIGluCiAgICB0aGUgc3R1YiB0byBjaGVjayB0aGVtIGFnYWluc3QuIEFyZ3VtZW50ICp0eXBlKiBjaGVja2luZyAoaXMgYXJnIDEKICAgIGFjdHVhbGx5IGEgc3RyaW5nKSBpcyBub3QgYXR0ZW1wdGVkIC0gY291bnQgb25seS4gRm91bmQgdmlhIGEgcmVhbAogICAgZXhhbXBsZTogYGhsLm1vbml0b3IobmlsLCB7Li4ufSlgIGluIGEgR1BULWZhYnJpY2F0ZWQgdGVzdCBjb25maWcKICAgIHJlc29sdmVzIGFzIGEgdmFsaWQgc3ltYm9sIChpdCBpcykgYnV0IGNhbGxzIGl0IHdpdGggMiBhcmdzIGFnYWluc3QgYQogICAgMS1yZXF1aXJlZC1wYXJhbSBzaWduYXR1cmUgLSBleGFjdGx5IHdoYXQgdGhpcyBjbG9zZXMuCiAgLSBTcGVjLXRhYmxlIGZpZWxkIGNoZWNraW5nOiBhbnkgY2FsbCB3aG9zZSBwYXJhbWV0ZXIgaXMgdHlwZWQgYXMgYQogICAgc3BlY2lmaWMgc2NoZW1hIGNsYXNzIChgaGwubW9uaXRvcmAncyBgc3BlYzogSEwuTW9uaXRvclNwZWNgLAogICAgYGhsLmRldmljZWAncyBgSEwuRGV2aWNlU3BlY2AsIGBobC5nZXN0dXJlYCdzIGBITC5HZXN0dXJlU3BlY2AsCiAgICBgaGwuYmluZGAncyBgb3B0cz86IEhMLkJpbmRPcHRpb25zYCwgYGhsLndpbmRvd19ydWxlYCdzCiAgICBgSEwuV2luZG93UnVsZVNwZWNgLCBgaGwucGVybWlzc2lvbmAncyBgSEwuUGVybWlzc2lvblNwZWNgKSBoYXMgdGhhdAogICAgdGFibGUncyBrZXlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgY2xhc3MncyBhY3R1YWwgZmllbGRzLCByZWN1cnNpbmcgd2hlbgogICAgYSBmaWVsZCdzIG93biB0eXBlIGlzIGl0c2VsZiBhIGNsYXNzLiBGb3VuZCB2aWEgcmUtZXhhbWluaW5nIHJlYWwgdGVzdAogICAgZXZpZGVuY2U6IGBobC5tb25pdG9yKHtyZXNvbHV0aW9uID0gInByZWZlcnJlZCIsIC4uLn0pYCBwYXNzZXMgd2l0aAogICAgemVybyBmaW5kaW5ncyBldmVuIGFmdGVyIGFyaXR5IGNoZWNraW5nLCBiZWNhdXNlIGByZXNvbHV0aW9uYCBpc24ndCBhCiAgICByZWFsIGBITC5Nb25pdG9yU3BlY2AgZmllbGQgKHRoZSByZWFsIG9uZSBpcyBgbW9kZWApIGFuZCBub3RoaW5nCiAgICBjaGVja2VkIHNwZWMtdGFibGUgKmNvbnRlbnRzKiBiZWZvcmUgdGhpcy4KICAgIERlbGliZXJhdGVseSBleGNsdWRlcyBgaGwuY29uZmlnYCAtIGl0cyBvd24gcGFyYW0gdHlwZSAoYEhMLkNvbmZpZ09wdGApCiAgICBpcyBhICpwYXJhbGxlbCosIGRpZmZlcmVudGx5LXNoYXBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtZSBkYXRhIChhCiAgICBuZXN0ZWQgY2xhc3MgaGllcmFyY2h5IHZzLiBgY29uZmlnX3ZhbHVlX3R5cGVzYCdzIGZsYXR0ZW5lZCBkb3R0ZWQKICAgIG1hcCAtIHZlcmlmaWVkIHRoZXkncmUgbm90IDE6MSwgZS5nLiBgZ2VuZXJhbC5jb2xgIG5lc3RzIGFzIGl0cyBvd24KICAgIHN1Yi1jbGFzcyBpbiBvbmUgYnV0IG5vdCB0aGUgb3RoZXIpIC0gdW5pZnlpbmcgdGhlbSB3b3VsZCBtZWFuCiAgICByZS12ZXJpZnlpbmcgZXZlcnkgY29uZmlnIHNlY3Rpb24gYWdhaW5zdCBhIGhpZXJhcmNoeSB0aGF0IGhhc24ndCBiZWVuCiAgICBjaGVja2VkIHlldCwgZm9yIG5vIGZvdW5kIGJlbmVmaXQuIGBobC5jb25maWdgIGtlZXBzIHVzaW5nIGl0cyBhbHJlYWR5CiAgICAtdGVzdGVkIHBhdGg7IHRoaXMgaXMgYSBzZWNvbmQsIG5hcnJvd2VyIG1lY2hhbmlzbSBmb3IgZXZlcnl0aGluZyBlbHNlLgogICAgQWxzbyBleGNsdWRlcyBgaGwud2luZG93X3J1bGVgIHNwZWNpZmljYWxseSAtIGZvdW5kIGJ5IHRoaXMgbW9kdWxlJ3Mgb3duCiAgICB0ZXN0IHN1aXRlIGZsb29kaW5nIGZhbHNlIHBvc2l0aXZlcyBhZ2FpbnN0IHRoZSByZWFsIGNvbmZpZzoKICAgIGBITC5XaW5kb3dSdWxlU3BlY2Agb25seSB0eXBlcyAzIHVuaXZlcnNhbCBmaWVsZHMgKGVuYWJsZWQvbWF0Y2gvbmFtZSksCiAgICB1bmxpa2UgaXRzIHNpYmxpbmdzIGBITC5MYXllclJ1bGVTcGVjYCAoMTMgZmllbGRzKSBhbmQKICAgIGBITC5Xb3Jrc3BhY2VSdWxlU3BlY2AgKDE3IGZpZWxkcykgd2hpY2ggYXJlIGZ1bGx5IHR5cGVkIGFuZCBETyBnZXQKICAgIGNoZWNrZWQuIFBlci1ydWxlLXR5cGUgd2luZG93IGZpZWxkcyAobW92ZS9mbG9hdC93b3Jrc3BhY2UvCiAgICBzdXBwcmVzc19ldmVudC9ub19mb2N1cykgYXJlIGR5bmFtaWNhbGx5IGRpc3BhdGNoZWQgYW5kIGRlbGliZXJhdGVseQogICAgYWJzZW50IGZyb20gdGhlIHN0dWIgLSB0aGUgc2FtZSBmYWN0IG5vdGVkIGFib3ZlIGFib3V0IGBobC5wbHVnaW4uKmAsCiAgICByZWRpc2NvdmVyZWQgaGVyZSBmb3Igd2luZG93IHJ1bGVzIHNwZWNpZmljYWxseS4KICAtIFVuY2FsbGVkLWRpc3BhdGNoZXItZmFjdG9yeSBjaGVja2luZzogYW55IGNhbGwgYXJndW1lbnQgd2hvc2UgZGVjbGFyZWQKICAgIHBhcmFtIHR5cGUgaW5jbHVkZXMgYEhMLkRpc3BhdGNoZXJgIChjdXJyZW50bHkgYGhsLmJpbmRgJ3MgYGRpc3BhdGNoZXJgCiAgICBwYXJhbSBhbmQgYGhsLmRpc3BhdGNoYCdzIHNpbmdsZSBwYXJhbSAtIGZvdW5kIGdlbmVyaWNhbGx5IGJ5IHNjYW5uaW5nCiAgICB0aGUgc2NoZW1hLCBub3QgaGFyZGNvZGVkIHRvIHRob3NlIHR3byBuYW1lcykgaXMgY2hlY2tlZCBmb3IgYmVpbmcgYQogICAgYmFyZSBgaGwuZHNwLipgLXN0eWxlIHN5bWJvbCByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYW4gYWN0dWFsIGNhbGwsIGUuZy4KICAgIGBobC5iaW5kKCJTVVBFUiArIFEiLCBobC5kc3Aud2luZG93LmNsb3NlKWAgKG1pc3NpbmcgdGhlIHRyYWlsaW5nCiAgICBgKClgKS4gVGhpcyBpcyBleGFjdGx5IHRoZSBjbGFzcyBvZiBidWcgSHlwcmxhbmQncyBvd24gaXNzdWUgIzE1ODcxCiAgICAoIkltcHJvdmUgbHVhIGVycm9yIHJlcG9ydGluZyIpIGNhbGxzIG91dCAtIGEgZmFjdG9yeSByZWZlcmVuY2UgcGFzc2VkCiAgICB3aGVyZSBpdHMgKnJlc3VsdCogd2FzIG1lYW50LCB3aGljaCB0eXBlLWNoZWNrcyB1bmRlciB0aGUgc3R1YidzCiAgICBgSEwuRGlzcGF0Y2hlcnxmdW5jdGlvbmAgdW5pb24gKGEgYmFyZSBmdW5jdGlvbiByZWZlcmVuY2UgSVMgYQogICAgYGZ1bmN0aW9uYCkgc28gbm90aGluZyBlbHNlIGhlcmUgY2F0Y2hlcyBpdC4gRGV0ZWN0ZWQgYnkgbm90aWNpbmcgdGhlCiAgICBhcmd1bWVudCByZXNvbHZlcyAodmlhIGByZXNvbHZlX3N5bWJvbGApIHRvIGEgZnVuY3Rpb24gaXRzZWxmLCByYXRoZXIKICAgIHRoYW4gdG8gYSBwbGFpbiB2YWx1ZSBvciBhIGdlbnVpbmUgY2FsbC9sYW1iZGEuCiAgLSBEdXBsaWNhdGUtYmluZCBjaGVja2luZzogZXZlcnkgYGhsLmJpbmQoa2V5cywgLi4uKWAgY2FsbCdzIGBrZXlzYAogICAgYXJndW1lbnQgaXMgcmVzb2x2ZWQgLSBpZiBpdCdzIGEgcGxhaW4gc3RyaW5nIGxpdGVyYWwsIG9yIGEKICAgIGNvbmNhdGVuYXRpb24gb2Ygb25seSBzdHJpbmcgbGl0ZXJhbHMgKGUuZy4gYCJTVVBFUiIgLi4gIiArIFEiYCkgLSBhbmQKICAgIGdyb3VwZWQ7IG1vcmUgdGhhbiBvbmUgYmluZCByZXNvbHZpbmcgdG8gdGhlIGlkZW50aWNhbCBrZXkgY29tYm8gaXMKICAgIGZsYWdnZWQuIEFsc28gZGlyZWN0bHkgZnJvbSAjMTU4NzEgKCJyZXBlYXRpbmcga2V5cyBpbiBhIGJpbmQiKS4KICAgIERlbGliZXJhdGVseSBuYXJyb3c6IGEgYGtleXNgIGV4cHJlc3Npb24gYnVpbHQgZnJvbSBhIHZhcmlhYmxlICh0aGUKICAgIG92ZXJ3aGVsbWluZ2x5IGNvbW1vbiByZWFsLXdvcmxkIHBhdHRlcm4sIGUuZy4gYG1haW5Nb2QgLi4gIiArIFEiYCkKICAgIGNhbid0IGJlIHJlc29sdmVkIHdpdGhvdXQgZXZhbHVhdGluZyB0aGUgc2NyaXB0LCBzbyB0aG9zZSBiaW5kcyBhcmUKICAgIHNpbGVudGx5IHNraXBwZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZCBhdCAtIHNhbWUgbGltaXRhdGlvbgogICAgYHJlc29sdmVfbGl0ZXJhbGAvYF93YWxrX2NvbmZpZ190YWJsZWAgYWxyZWFkeSBkb2N1bWVudCBmb3IgdmFsdWVzCiAgICB0aGF0IGFyZW4ndCBsaXRlcmFscy4KICAtIFBvc3NpYmxlLW1pc3NpbmctcXVvdGVzIGNoZWNraW5nOiBhIGNvbmZpZyBvciBzcGVjLXRhYmxlIHZhbHVlIHRoYXQncyBhCiAgICAqYmFyZSwgc2luZ2xlIGlkZW50aWZpZXIqIChgYWNjZWxfcHJvZmlsZSA9IGZsYXRgLCBub3QgYGFjY2VsX3Byb2ZpbGUgPQogICAgImZsYXQiYCkgaXMgZmxhZ2dlZCB3aGVuIHRoYXQgaWRlbnRpZmllciBpcyBuZXZlciBhc3NpZ25lZCBhbnl3aGVyZSBpbgogICAgdGhlIGZpbGUgKGFzIGEgbG9jYWwsIGEgZ2xvYmFsLCBhIGZvci1sb29wIHZhcmlhYmxlLCBvciBhIGZ1bmN0aW9uCiAgICBwYXJhbWV0ZXIpIGFuZCB0aGUgZmllbGQncyBzY2hlbWEgdHlwZSBpbmNsdWRlcyBgc3RyaW5nYC4gQW4KICAgIGlkZW50aWZpZXIgdGhhdCB3YXMgbmV2ZXIgYXNzaWduZWQgd291bGQgcmVzb2x2ZSB0byBMdWEncyBpbXBsaWNpdAogICAgYG5pbGAgZ2xvYmFsIGF0IHJ1bnRpbWUgLSBpLmUuIHRoaXMgaXNuJ3QgYSBndWVzcyBhYm91dCBpbnRlbnQsIGl0J3MKICAgICJ0aGlzIHNwZWNpZmljIHZhbHVlIGNhbm5vdCBkbyBhbnl0aGluZyBvdGhlciB0aGFuIHNpbGVudGx5IGJlY29tZQogICAgbmlsIi4gVGhpcyBpcyB0aGUgZXhhY3QgcmVhbC13b3JsZCBidWcgaW4KICAgIGdpdGh1Yi5jb20vaHlwcndtL0h5cHJsYW5kIzE1NzI3OiBhIHVzZXIncyBtaWdyYXRlZCBgYWNjZWxfcHJvZmlsZSA9CiAgICBmbGF0YCBzaWxlbnRseSBkaXNjYXJkZWQgdGhlIGFjY2VsIHByb2ZpbGUgYW5kIGNoYW5nZWQgdGhlaXIgbW91c2UKICAgIHNlbnNpdGl2aXR5LCBhbmQgd2FzIG9ubHkgZm91bmQgYnkgYSBzdHJhbmdlciByZWFkaW5nIHRoZWlyIGNvbmZpZy4KICAgIERlbGliZXJhdGVseSBkb2VzIE5PVCBmaXJlIGZvciBhbiBpZGVudGlmaWVyIHRoYXQgKmlzKiBhc3NpZ25lZAogICAgc29tZXdoZXJlIChlLmcuIGBsb2NhbCB0ZXJtaW5hbCA9ICJmb290IjsgLi4uID0gdGVybWluYWxgKSAtIHRoYXQncwogICAgdGhlIGxlZ2l0aW1hdGUgdmFyaWFibGUtcmVmZXJlbmNlIHBhdHRlcm4gYWxyZWFkeSBhY2NlcHRlZCBlbHNld2hlcmUKICAgIGluIHRoaXMgbW9kdWxlLCBhbmQgdGhpcyBjaGVjayByZXVzZXMgdGhhdCBzYW1lIGNvbnNlcnZhdGl2ZQogICAgImNhbid0IGRpc3Byb3ZlIGl0LCBkb24ndCBmbGFnIGl0IiBzdGFuY2UuIFNjb3BlIHRyYWNraW5nIGlzCiAgICBkZWxpYmVyYXRlbHkgZmxhdCAoZXZlcnkgYXNzaWdubWVudCBhbnl3aGVyZSBpbiB0aGUgZmlsZSBjb3VudHMgYXMKICAgICJkZWZpbmVkIiwgbm90IGp1c3Qgb25lcyBpbiBhbiBlbmNsb3Npbmcgc2NvcGUpIC0gYSBmYWxzZSBuZWdhdGl2ZQogICAgKG1pc3NpbmcgYSBnZW51aW5lbHktdW5kZWZpbmVkIHNoYWRvd2VkIGxvY2FsKSBpcyBhbiBhY2NlcHRhYmxlCiAgICB0cmFkZSBmb3IgbmV2ZXIgZmxhZ2dpbmcgYSBsZWdpdGltYXRlbHktc2NvcGVkIGxvY2FsIGFzIGlmIGl0CiAgICB3ZXJlbid0IGRlZmluZWQuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gZW51bSBpbXBvcnQgRW51bQoKZnJvbSBsdWFwYXJzZXIuYXN0bm9kZXMgaW1wb3J0ICgKICAgIENhbGwsIEludm9rZSwgTWV0aG9kLCBUYWJsZSwgRmllbGQgYXMgTHVhRmllbGQsIE5hbWUsCiAgICBMb2NhbEFzc2lnbiwgQXNzaWduLCBGb3JpbiwgRm9ybnVtLAogICAgRnVuY3Rpb24sIExvY2FsRnVuY3Rpb24sIEFub255bW91c0Z1bmN0aW9uLAopCgpmcm9tIGh5cHJ2YWxpZGF0ZS5sdWFhc3QgaW1wb3J0IHJlYWRlcgpmcm9tIGh5cHJ2YWxpZGF0ZS5zY2hlbWEuZXh0cmFjdG9yIGltcG9ydCBTY2hlbWEKCgpjbGFzcyBGaW5kaW5nS2luZChzdHIsIEVudW0pOgogICAgVU5LTk9XTl9TWU1CT0wgPSAidW5rbm93bl9zeW1ib2wiCiAgICBVTktOT1dOX0NPTkZJR19LRVkgPSAidW5rbm93bl9jb25maWdfa2V5IgogICAgVFlQRV9NSVNNQVRDSCA9ICJ0eXBlX21pc21hdGNoIgogICAgQVJJVFlfTUlTTUFUQ0ggPSAiYXJpdHlfbWlzbWF0Y2giCiAgICBVTktOT1dOX1NQRUNfRklFTEQgPSAidW5rbm93bl9zcGVjX2ZpZWxkIgogICAgVU5DQUxMRURfRElTUEFUQ0hFUiA9ICJ1bmNhbGxlZF9kaXNwYXRjaGVyIgogICAgRFVQTElDQVRFX0JJTkQgPSAiZHVwbGljYXRlX2JpbmQiCiAgICBQT1NTSUJMRV9NSVNTSU5HX1FVT1RFUyA9ICJwb3NzaWJsZV9taXNzaW5nX3F1b3RlcyIKCgpAZGF0YWNsYXNzCmNsYXNzIEZpeEVkaXQ6CiAgICAiIiJBIHNpbmdsZSwgdW5hbWJpZ3VvdXMgdGV4dHVhbCBjb3JyZWN0aW9uIGZvciBhIEZpbmRpbmc6IHJlcGxhY2UKICAgIGBzb3VyY2Vbc3RhcnQ6ZW5kXWAgKGNoYXJhY3RlciBvZmZzZXRzLCBgZW5kYCBleGNsdXNpdmUpIHdpdGgKICAgIGByZXBsYWNlbWVudGAuIE9ubHkgYXR0YWNoZWQgdG8gZmluZGluZ3MgdGhpcyBtb2R1bGUgY2FuIGNvcnJlY3Qgd2l0aAogICAgemVybyBhbWJpZ3VpdHkgYWJvdXQgaW50ZW50IChzZWUgYGZpeGVyLnB5YCkgLSBtb3N0IGZpbmRpbmcga2luZHMgbmV2ZXIKICAgIGdldCBvbmUsIGFuZCB0aGVpciBgRmluZGluZy5maXhgIHN0YXlzIE5vbmUuIiIiCiAgICBzdGFydDogaW50CiAgICBlbmQ6IGludAogICAgcmVwbGFjZW1lbnQ6IHN0cgoKCkBkYXRhY2xhc3MKY2xhc3MgRmluZGluZzoKICAgIGtpbmQ6IEZpbmRpbmdLaW5kCiAgICBsaW5lOiBpbnQgfCBOb25lCiAgICBtZXNzYWdlOiBzdHIKICAgIGZpeDogRml4RWRpdCB8IE5vbmUgPSBOb25lCgoKIyBUeXBlLWV4cHJlc3Npb24gdG9rZW5zIHRoYXQgaW5kaWNhdGUgInRoaXMgYWx0ZXJuYXRpdmUgaXMgYSB0YWJsZS9jbGFzcwojIHNoYXBlLCBub3QgYSBzY2FsYXIiIC0gdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBza2lwIGEgbWlzbWF0Y2ggcmF0aGVyCiMgdGhhbiB0byBtb2RlbCB0aGUgc2hhcGUuIEZvdW5kIG1pc3NpbmcgInRhYmxlIiAoYmFyZSwgZS5nLiBgaW50ZWdlcnx0YWJsZWAsCiMgYW5kIEx1YUxTJ3MgZ2VuZXJpYyBmb3JtIGB0YWJsZTxzdHJpbmcsIHN0cmluZ3xib29sZWFuPmApIGJ5IHRlc3RpbmcKIyBhZ2FpbnN0IHR3byByZWFsLCBpbmRlcGVuZGVudCBIeXBybGFuZCBMdWEgY29uZmlncyAoR2FydWRhIExpbnV4J3MKIyBkaXN0cmlidXRpb24gc2V0dGluZ3MgYW5kIHRoZSBzZWEtc2hlbGwgcHJvamVjdCkgLSBib3RoIHVzZQojIGBobC5sYXllcl9ydWxlKHsgbWF0Y2ggPSB7IG5hbWVzcGFjZSA9ICIuLi4iIH0gfSlgLCB3aGljaCBpcyBleGFjdGx5CiMgSEwuTGF5ZXJSdWxlU3BlYy5tYXRjaCdzIHJlYWwgdHlwZSwgYHRhYmxlPHN0cmluZywgc3RyaW5nfGJvb2xlYW4+YDsgdGhpcwojIGhlbHBlciBkaWRuJ3QgcmVjb2duaXplIHRoYXQgYXMgdGFibGUtc2hhcGVkIGF0IGFsbCwgc28gZXZlcnkgbGF5ZXIgcnVsZQojIHdpdGggYSBtYXRjaCB0YWJsZSBpbiB0aGUgd2lsZCB3YXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlLgpkZWYgX2hhc190YWJsZV9hbHRlcm5hdGl2ZSh0eXBlX2V4cHI6IHN0cikgLT4gYm9vbDoKICAgIHJldHVybiAieyIgaW4gdHlwZV9leHByIG9yICJITC4iIGluIHR5cGVfZXhwciBvciAidGFibGUiIGluIHR5cGVfZXhwcgoKCl9TQ0FMQVJfQ09NUEFUID0gewogICAgImJvb2xlYW4iOiB7ImJvb2xlYW4ifSwKICAgICJzdHJpbmciOiB7InN0cmluZyJ9LAogICAgImludGVnZXIiOiB7Im51bWJlciJ9LAogICAgIm51bWJlciI6IHsibnVtYmVyIn0sCn0KCgpkZWYgX3NjYWxhcl9raW5kX21hdGNoZXMoa2luZDogc3RyLCB0eXBlX2V4cHI6IHN0cikgLT4gYm9vbDoKICAgICIiIlRydWUgaWYgYSByZXNvbHZlZCBzY2FsYXIgbGl0ZXJhbCdzIGtpbmQgc2F0aXNmaWVzIGEgKHBvc3NpYmx5CiAgICB1bmlvbmVkKSBzY2hlbWEgdHlwZSBleHByZXNzaW9uLCBjb25zaWRlcmluZyBvbmx5IHRoZSBzY2FsYXIKICAgIGFsdGVybmF0aXZlcyBpbiB0aGF0IGV4cHJlc3Npb24uIiIiCiAgICBmb3IgYWx0IGluIChhLnN0cmlwKCkgZm9yIGEgaW4gdHlwZV9leHByLnNwbGl0KCJ8IikpOgogICAgICAgIGNvbXBhdCA9IF9TQ0FMQVJfQ09NUEFULmdldChhbHQpCiAgICAgICAgaWYgY29tcGF0IGFuZCBraW5kIGluIGNvbXBhdDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBfdHlwZV9leHByX2FjY2VwdHNfc3RyaW5nKHR5cGVfZXhwcjogc3RyKSAtPiBib29sOgogICAgcmV0dXJuICJzdHJpbmciIGluIChhLnN0cmlwKCkgZm9yIGEgaW4gdHlwZV9leHByLnNwbGl0KCJ8IikpCgoKIyBHbG9iYWxzIHByb3ZpZGVkIGJ5IHRoZSBIeXBybGFuZCBMdWEgcnVudGltZSBpdHNlbGYsIG5vdCBieSBhbnl0aGluZyBhCiMgY29uZmlnIGZpbGUgYXNzaWducyAtIGEgYmFyZSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZXNlIGlzIG5ldmVyICJtaXNzaW5nCiMgcXVvdGVzIiwgaXQncyBhIHJlYWwgKGlmIG9kZGx5LXR5cGVkKSB2YWx1ZS4gQ3VycmVudGx5IGp1c3QgdGhlIEFQSSByb290OwojIGV4dGVuZCBoZXJlIGlmIHRoZSBydW50aW1lIGdyb3dzIG1vcmUuCl9SVU5USU1FX0dMT0JBTFMgPSB7ImhsIn0KCgpkZWYgX2NvbGxlY3RfZGVmaW5lZF9uYW1lcyh0cmVlKSAtPiBzZXRbc3RyXToKICAgICIiIkV2ZXJ5IGlkZW50aWZpZXIgYXNzaWduZWQgYW55d2hlcmUgaW4gdGhlIGZpbGUgLSBhcyBhIGxvY2FsLCBhCiAgICBnbG9iYWwsIGEgZm9yLWxvb3AgdmFyaWFibGUsIG9yIGEgZnVuY3Rpb24gcGFyYW1ldGVyIC0gZmxhdHRlbmVkIGludG8KICAgIG9uZSBzZXQgd2l0aCBubyBzY29wZSBzdHJ1Y3R1cmUuIFVzZWQgYnkgdGhlIG1pc3NpbmctcXVvdGVzIGNoZWNrOiBhbgogICAgaWRlbnRpZmllciBOT1QgaW4gdGhpcyBzZXQgY2FuIG9ubHkgZXZlciByZXNvbHZlIHRvIEx1YSdzIGltcGxpY2l0CiAgICBgbmlsYCBnbG9iYWwgYXQgcnVudGltZSwgc28gYSBiYXJlIHJlZmVyZW5jZSB0byBpdCBpbiBhIHN0cmluZy10eXBlZAogICAgZmllbGQgaXMgYSBkaXJlY3RseSBkZW1vbnN0cmFibGUgYnVnLCBub3QgYSBndWVzcy4gRGVsaWJlcmF0ZWx5IGZsYXQKICAgIChpZ25vcmVzIGFjdHVhbCBzY29waW5nKSAtIHNlZSBtb2R1bGUgZG9jc3RyaW5nIGZvciB3aHkgdGhhdCdzIHRoZQogICAgcmlnaHQgdHJhZGUtb2ZmIGhlcmUuIiIiCiAgICBuYW1lczogc2V0W3N0cl0gPSBzZXQoX1JVTlRJTUVfR0xPQkFMUykKICAgIGZvciBub2RlIGluIHJlYWRlci53YWxrKHRyZWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgKExvY2FsQXNzaWduLCBBc3NpZ24sIEZvcmluKSk6CiAgICAgICAgICAgIG5hbWVzLnVwZGF0ZSh0LmlkIGZvciB0IGluIG5vZGUudGFyZ2V0cyBpZiBpc2luc3RhbmNlKHQsIE5hbWUpKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBGb3JudW0pOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUudGFyZ2V0LCBOYW1lKToKICAgICAgICAgICAgICAgIG5hbWVzLmFkZChub2RlLnRhcmdldC5pZCkKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgKEZ1bmN0aW9uLCBMb2NhbEZ1bmN0aW9uLCBBbm9ueW1vdXNGdW5jdGlvbiwgTWV0aG9kKSk6CiAgICAgICAgICAgIG5hbWVzLnVwZGF0ZShhLmlkIGZvciBhIGluIG5vZGUuYXJncyBpZiBpc2luc3RhbmNlKGEsIE5hbWUpKQogICAgICAgICAgICBuYW1lX25vZGUgPSBnZXRhdHRyKG5vZGUsICJuYW1lIiwgTm9uZSkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lX25vZGUsIE5hbWUpOgogICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5hbWVfbm9kZS5pZCkKICAgIHJldHVybiBuYW1lcwoKCkBkYXRhY2xhc3MKY2xhc3MgUGFyYW06CiAgICBuYW1lOiBzdHIKICAgIHR5cGVfZXhwcjogc3RyCiAgICBvcHRpb25hbDogYm9vbAoKCkBkYXRhY2xhc3MKY2xhc3MgRnVuY3Rpb25TaWduYXR1cmU6CiAgICBwYXJhbXM6IGxpc3RbUGFyYW1dCiAgICBoYXNfdmFyYXJnOiBib29sICAjIGEgYmFyZSAiLi4uIiBlbnRyeSAtIHVubGltaXRlZC91bmNoZWNrZWQgdHJhaWxpbmcgYXJncwoKCmRlZiBfc3BsaXRfdG9wX2xldmVsKHM6IHN0ciwgc2VwOiBzdHIpIC0+IGxpc3Rbc3RyXToKICAgICIiIlNwbGl0IG9uIGBzZXBgLCBidXQgb25seSBhdCBicmFja2V0IGRlcHRoIDAgLSBzbyBhIHBhcmFtIHR5cGUgbGlrZQogICAgYHRhYmxlPHN0cmluZywgc3RyaW5nfG51bWJlcj5gIGRvZXNuJ3QgZ2V0IHNwbGl0IG9uIGl0cyBpbm5lciBjb21tYS4iIiIKICAgIHBhcnRzOiBsaXN0W3N0cl0gPSBbXQogICAgZGVwdGggPSAwCiAgICBjdXJyZW50OiBsaXN0W3N0cl0gPSBbXQogICAgZm9yIGNoIGluIHM6CiAgICAgICAgaWYgY2ggaW4gIih7PCI6CiAgICAgICAgICAgIGRlcHRoICs9IDEKICAgICAgICBlbGlmIGNoIGluICIpfT4iOgogICAgICAgICAgICBkZXB0aCAtPSAxCiAgICAgICAgaWYgY2ggPT0gc2VwIGFuZCBkZXB0aCA9PSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihjdXJyZW50KSkKICAgICAgICAgICAgY3VycmVudCA9IFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY3VycmVudC5hcHBlbmQoY2gpCiAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihjdXJyZW50KSkKICAgIHJldHVybiBwYXJ0cwoKCmRlZiBwYXJzZV9mdW5fc2lnbmF0dXJlKHR5cGVfZXhwcjogc3RyKSAtPiBGdW5jdGlvblNpZ25hdHVyZSB8IE5vbmU6CiAgICAiIiJQYXJzZSBhIEx1YUxTIGBmdW4oLi4uKWAgdHlwZSBleHByZXNzaW9uJ3MgcGFyYW1ldGVyIGxpc3QuIFJldHVybnMKICAgIE5vbmUgaWYgYHR5cGVfZXhwcmAgaXNuJ3QgYSBmdW5jdGlvbiB0eXBlIGF0IGFsbC4gSGFuZGxlcyBhIHBhcmFtIHR5cGUKICAgIHRoYXQncyBpdHNlbGYgYSBuZXN0ZWQgYGZ1biguLi4pYCAoZS5nLiBgaGwub25gJ3MgYGNiOiBmdW4oLi4uKWAgYXJnKSBieQogICAgdHJhY2tpbmcgYnJhY2tldCBkZXB0aCByYXRoZXIgdGhhbiBzcGxpdHRpbmcgb24gdGhlIGZpcnN0IGNsb3NlLXBhcmVuLiIiIgogICAgb3Blbl9pZHggPSB0eXBlX2V4cHIuZmluZCgiKCIpCiAgICBpZiBub3QgdHlwZV9leHByLnN0YXJ0c3dpdGgoImZ1bigiKSBvciBvcGVuX2lkeCA9PSAtMToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlcHRoID0gMAogICAgZW5kID0gTm9uZQogICAgZm9yIGogaW4gcmFuZ2Uob3Blbl9pZHgsIGxlbih0eXBlX2V4cHIpKToKICAgICAgICBjID0gdHlwZV9leHByW2pdCiAgICAgICAgaWYgYyBpbiAiKHs8IjoKICAgICAgICAgICAgZGVwdGggKz0gMQogICAgICAgIGVsaWYgYyBpbiAiKX0+IjoKICAgICAgICAgICAgZGVwdGggLT0gMQogICAgICAgICAgICBpZiBkZXB0aCA9PSAwOgogICAgICAgICAgICAgICAgZW5kID0gagogICAgICAgICAgICAgICAgYnJlYWsKICAgIGlmIGVuZCBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCgogICAgcGFyYW1fc3RyID0gdHlwZV9leHByW29wZW5faWR4ICsgMTplbmRdLnN0cmlwKCkKICAgIGlmIG5vdCBwYXJhbV9zdHI6CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uU2lnbmF0dXJlKHBhcmFtcz1bXSwgaGFzX3ZhcmFyZz1GYWxzZSkKCiAgICBwYXJhbXM6IGxpc3RbUGFyYW1dID0gW10KICAgIGhhc192YXJhcmcgPSBGYWxzZQogICAgZm9yIHRvayBpbiAodC5zdHJpcCgpIGZvciB0IGluIF9zcGxpdF90b3BfbGV2ZWwocGFyYW1fc3RyLCAiLCIpKToKICAgICAgICBpZiBub3QgdG9rOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIHRvayA9PSAiLi4uIjoKICAgICAgICAgICAgaGFzX3ZhcmFyZyA9IFRydWUKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiAiOiIgaW4gdG9rOgogICAgICAgICAgICBuYW1lX3BhcnQsIHR5cGVfcGFydCA9IHRvay5zcGxpdCgiOiIsIDEpCiAgICAgICAgICAgIG5hbWVfcGFydCwgdHlwZV9wYXJ0ID0gbmFtZV9wYXJ0LnN0cmlwKCksIHR5cGVfcGFydC5zdHJpcCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZV9wYXJ0LCB0eXBlX3BhcnQgPSB0b2ssICJhbnkiICAjIHVudHlwZWQgYmFyZSBwYXJhbSwgbm90IHNlZW4gaW4gcHJhY3RpY2UKICAgICAgICBvcHRpb25hbCA9IG5hbWVfcGFydC5lbmRzd2l0aCgiPyIpCiAgICAgICAgbmFtZSA9IG5hbWVfcGFydFs6LTFdIGlmIG9wdGlvbmFsIGVsc2UgbmFtZV9wYXJ0CiAgICAgICAgcGFyYW1zLmFwcGVuZChQYXJhbShuYW1lPW5hbWUsIHR5cGVfZXhwcj10eXBlX3BhcnQsIG9wdGlvbmFsPW9wdGlvbmFsKSkKICAgIHJldHVybiBGdW5jdGlvblNpZ25hdHVyZShwYXJhbXM9cGFyYW1zLCBoYXNfdmFyYXJnPWhhc192YXJhcmcpCgoKZGVmIHJlc29sdmVfc3ltYm9sKHNjaGVtYTogU2NoZW1hLCBkb3R0ZWRfbmFtZTogc3RyKSAtPiB0dXBsZVtib29sLCBzdHIsIHN0ciB8IE5vbmVdOgogICAgIiIiQ2hlY2sgYSBkb3R0ZWQgYGhsLipgIHN5bWJvbCBwYXRoIGFnYWluc3QgdGhlIHNjaGVtYS4gUmV0dXJucwogICAgKGlzX3ZhbGlkLCByZWFzb24sIHNpZ25hdHVyZV90eXBlX2V4cHIpLiBgc2lnbmF0dXJlX3R5cGVfZXhwcmAgaXMgdGhlCiAgICByZXNvbHZlZCBmdW5jdGlvbidzIHJhdyBgZnVuKC4uLilgIHR5cGUgc3RyaW5nIHdoZW4gdGhpcyBpcyBhIHZhbGlkLAogICAgZnVsbHktcmVzb2x2ZWQgY2FsbCB0YXJnZXQgLSBOb25lIG90aGVyd2lzZSAobm90IGEgY2FsbCB0YXJnZXQsIG9yCiAgICBpbnZhbGlkKS4gTmFtZXMgbm90IHN0YXJ0aW5nIHdpdGggImhsIiBhcmUgb3V0IG9mIHNjb3BlIGFuZCBhbHdheXMKICAgIGNvbnNpZGVyZWQgdmFsaWQgKHRoZXkncmUgdGhlIHVzZXIncyBvd24gbG9jYWxzLCBub3QgQVBJKS4iIiIKICAgIHNlZ21lbnRzID0gZG90dGVkX25hbWUuc3BsaXQoIi4iKQogICAgaWYgc2VnbWVudHNbMF0gIT0gImhsIjoKICAgICAgICByZXR1cm4gVHJ1ZSwgIm5vdCBhbiBobC4qIHN5bWJvbCwgbm90IGNoZWNrZWQiLCBOb25lCgogICAgY3VycmVudF9jbGFzcyA9ICJITC5BUEkiCiAgICBmb3IgaSwgc2VnIGluIGVudW1lcmF0ZShzZWdtZW50c1sxOl0sIHN0YXJ0PTEpOgogICAgICAgIGNscyA9IHNjaGVtYS5jbGFzc2VzLmdldChjdXJyZW50X2NsYXNzKQogICAgICAgIGlmIGNscyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UsIGYiaW50ZXJuYWw6IHVua25vd24gc2NoZW1hIGNsYXNzIHtjdXJyZW50X2NsYXNzIXJ9IiwgTm9uZQoKICAgICAgICB0eXBlX2V4cHIgPSBjbHMuZmllbGRzLmdldChzZWcpCiAgICAgICAgaWYgdHlwZV9leHByIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGN1cnJlbnRfY2xhc3MgPT0gIkhMLlBsdWdpbk5hbWVzcGFjZSI6CiAgICAgICAgICAgICAgICAjIER5bmFtaWMgaW5kZXggc2lnbmF0dXJlIChgW3N0cmluZ10gYW55YCkgLSBwbHVnaW5zCiAgICAgICAgICAgICAgICAjIHJlZ2lzdGVyIHRoZWlyIG93biBtZW1iZXJzIGF0IHJ1bnRpbWUuIFNlZSBtb2R1bGUKICAgICAgICAgICAgICAgICMgZG9jc3RyaW5nLgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUsICJobC5wbHVnaW4uKiBtZW1iZXIsIGFjY2VwdGVkIChkeW5hbWljKSIsIE5vbmUKICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCAoCiAgICAgICAgICAgICAgICBmIid7c2VnfScgaXMgbm90IGEgbWVtYmVyIG9mIHtjdXJyZW50X2NsYXNzfSAiCiAgICAgICAgICAgICAgICBmIihyZXNvbHZpbmcge2RvdHRlZF9uYW1lfSkiCiAgICAgICAgICAgICksIE5vbmUKCiAgICAgICAgaWYgdHlwZV9leHByLnN0YXJ0c3dpdGgoImZ1bigiKToKICAgICAgICAgICAgcmVtYWluaW5nID0gc2VnbWVudHNbaSArIDE6XQogICAgICAgICAgICBpZiByZW1haW5pbmc6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UsICgKICAgICAgICAgICAgICAgICAgICBmIid7Jy4nLmpvaW4oc2VnbWVudHNbOmkrMV0pfScgaXMgYSBmdW5jdGlvbiwgIgogICAgICAgICAgICAgICAgICAgIGYiYnV0ICd7Jy4nLmpvaW4ocmVtYWluaW5nKX0nIGlzIGFjY2Vzc2VkIG9uIGl0IgogICAgICAgICAgICAgICAgKSwgTm9uZQogICAgICAgICAgICByZXR1cm4gVHJ1ZSwgInJlc29sdmVkIHRvIGEgZG9jdW1lbnRlZCBkaXNwYXRjaGVyL0FQSSBmdW5jdGlvbiIsIHR5cGVfZXhwcgoKICAgICAgICBpZiB0eXBlX2V4cHIgaW4gc2NoZW1hLmNsYXNzZXM6CiAgICAgICAgICAgIGN1cnJlbnRfY2xhc3MgPSB0eXBlX2V4cHIKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBBIHBsYWluLXR5cGVkIGZpZWxkIChub3QgYSBuYW1lc3BhY2UsIG5vdCBhIGZ1bmN0aW9uKSBiZWluZwogICAgICAgICMgYWNjZXNzZWQgZnVydGhlciwgZS5nLiB0cmVhdGluZyBhIGJvb2xlYW4gY29uZmlnIGZpZWxkIGFzIGEKICAgICAgICAjIG5hbWVzcGFjZSAtIGludmFsaWQuCiAgICAgICAgcmVtYWluaW5nID0gc2VnbWVudHNbaSArIDE6XQogICAgICAgIGlmIHJlbWFpbmluZzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCAoCiAgICAgICAgICAgICAgICBmIid7Jy4nLmpvaW4oc2VnbWVudHNbOmkrMV0pfScgaXMgdHlwZSB7dHlwZV9leHByIXJ9LCAiCiAgICAgICAgICAgICAgICBmIm5vdCBhIG5hbWVzcGFjZSAtIGNhbid0IGFjY2VzcyAneycuJy5qb2luKHJlbWFpbmluZyl9JyBvbiBpdCIKICAgICAgICAgICAgKSwgTm9uZQogICAgICAgIHJldHVybiBUcnVlLCBmInJlc29sdmVkIHRvIGEgZmllbGQgb2YgdHlwZSB7dHlwZV9leHByIXJ9IiwgTm9uZQoKICAgIHJldHVybiBUcnVlLCAicmVzb2x2ZWQgdG8gYSBuYW1lc3BhY2UgKG5vdCBjYWxsZWQgZnVydGhlcikiLCBOb25lCgoKZGVmIF9taXNzaW5nX3F1b3Rlc19maW5kaW5nKAogICAga2V5X29yX2ZpZWxkX25hbWU6IHN0ciwgdmFsdWU6IG9iamVjdCwgdHlwZV9leHByOiBzdHIsIGxpbmU6IGludCB8IE5vbmUsCiAgICBkZWZpbmVkX25hbWVzOiBzZXRbc3RyXSwKKSAtPiBGaW5kaW5nIHwgTm9uZToKICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh2YWx1ZSwgTmFtZSkgYW5kIF90eXBlX2V4cHJfYWNjZXB0c19zdHJpbmcodHlwZV9leHByKSk6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGlmIHZhbHVlLmlkIGluIGRlZmluZWRfbmFtZXM6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGZpeCA9IE5vbmUKICAgIGlmIHZhbHVlLmZpcnN0X3Rva2VuIGlzIG5vdCBOb25lOgogICAgICAgICMgQSBiYXJlIE5hbWUgaXMgYWx3YXlzIGEgc2luZ2xlIHRva2VuIGFuZCBhbHdheXMgYSB2YWxpZCBMdWEKICAgICAgICAjIGlkZW50aWZpZXIgKHRoYXQncyB3aGF0IGxldCBpdCBwYXJzZSBhcyBhIE5hbWUgYXQgYWxsKSAtIG5vCiAgICAgICAgIyBlc2NhcGluZyBuZWVkZWQgdG8gd3JhcCBpdCBpbiBxdW90ZXMuCiAgICAgICAgZml4ID0gRml4RWRpdCgKICAgICAgICAgICAgc3RhcnQ9dmFsdWUuZmlyc3RfdG9rZW4uc3RhcnQsCiAgICAgICAgICAgIGVuZD12YWx1ZS5maXJzdF90b2tlbi5zdG9wICsgMSwKICAgICAgICAgICAgcmVwbGFjZW1lbnQ9Zicie3ZhbHVlLmlkfSInLAogICAgICAgICkKICAgIHJldHVybiBGaW5kaW5nKAogICAgICAgIEZpbmRpbmdLaW5kLlBPU1NJQkxFX01JU1NJTkdfUVVPVEVTLCBsaW5lLAogICAgICAgIGYiJ3trZXlfb3JfZmllbGRfbmFtZX0nIGlzIHNldCB0byB0aGUgYmFyZSBpZGVudGlmaWVyICd7dmFsdWUuaWR9JywgIgogICAgICAgIGYid2hpY2ggaXNuJ3QgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGlzIGZpbGUgYW5kIHdvdWxkIGV2YWx1YXRlIHRvICIKICAgICAgICBmIm5pbCAtIGRpZCB5b3UgbWVhbiB0aGUgc3RyaW5nIFwie3ZhbHVlLmlkfVwiPyIsCiAgICAgICAgZml4PWZpeCwKICAgICkKCgpkZWYgX3dhbGtfY29uZmlnX3RhYmxlKAogICAgc2NoZW1hOiBTY2hlbWEsIHRhYmxlOiBUYWJsZSwgcHJlZml4OiBzdHIsIGxpbmU6IGludCB8IE5vbmUsCiAgICBkZWZpbmVkX25hbWVzOiBzZXRbc3RyXSwKKSAtPiBsaXN0W0ZpbmRpbmddOgogICAgZmluZGluZ3M6IGxpc3RbRmluZGluZ10gPSBbXQogICAgZm9yIGZpZWxkIGluIHRhYmxlLmZpZWxkczoKICAgICAgICBpZiBmaWVsZC5rZXkgaXMgTm9uZToKICAgICAgICAgICAgY29udGludWUgICMgYXJyYXktc3R5bGUgZW50cnksIG5vdCBhIGNvbmZpZyBrZXkgLSBub3Qgb3VyIGNvbmNlcm4KICAgICAgICBrZXlfbmFtZSA9IF9maWVsZF9rZXlfbmFtZShmaWVsZC5rZXkpCiAgICAgICAgaWYga2V5X25hbWUgaXMgTm9uZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBrZXlfcGF0aCA9IGYie3ByZWZpeH0ue2tleV9uYW1lfSIgaWYgcHJlZml4IGVsc2Uga2V5X25hbWUKICAgICAgICBmaWVsZF9saW5lID0gZmllbGQuZmlyc3RfdG9rZW4ubGluZSBpZiBmaWVsZC5maXJzdF90b2tlbiBlbHNlIGxpbmUKCiAgICAgICAgaWYga2V5X3BhdGggPT0gInBsdWdpbiIgb3Iga2V5X3BhdGguc3RhcnRzd2l0aCgicGx1Z2luLiIpOgogICAgICAgICAgICAjIFBsdWdpbiBjb25maWcgaXMgZHluYW1pY2FsbHkgcmVnaXN0ZXJlZCBwZXItcGx1Z2luIGF0IHJ1bnRpbWUKICAgICAgICAgICAgIyBhbmQgc3RydWN0dXJhbGx5IGFic2VudCBmcm9tIGNvbmZpZ192YWx1ZV90eXBlcyAtIHNhbWUgcm9vdAogICAgICAgICAgICAjIGNhdXNlIGFzIEhMLlBsdWdpbk5hbWVzcGFjZSdzIGBbc3RyaW5nXSBhbnlgIGluZGV4IHNpZ25hdHVyZQogICAgICAgICAgICAjIGZvciBzeW1ib2wgcmVzb2x1dGlvbiAoc2VlIG1vZHVsZSBkb2NzdHJpbmcpLiBOb3QgY2hlY2thYmxlCiAgICAgICAgICAgICMgYWdhaW5zdCB0aGUgY29yZSBzY2hlbWE7IGFjY2VwdGVkIHdpdGhvdXQgcmVjdXJzaW5nIGZ1cnRoZXIuCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlzX2xlYWYgPSBrZXlfcGF0aCBpbiBzY2hlbWEuY29uZmlnX3ZhbHVlX3R5cGVzCiAgICAgICAgaXNfY29udGFpbmVyID0gYW55KAogICAgICAgICAgICBrLnN0YXJ0c3dpdGgoa2V5X3BhdGggKyAiLiIpIGZvciBrIGluIHNjaGVtYS5jb25maWdfdmFsdWVfdHlwZXMKICAgICAgICApCgogICAgICAgIGlmIG5vdCBpc19sZWFmIGFuZCBub3QgaXNfY29udGFpbmVyOgogICAgICAgICAgICBmaW5kaW5ncy5hcHBlbmQoCiAgICAgICAgICAgICAgICBGaW5kaW5nKAogICAgICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLlVOS05PV05fQ09ORklHX0tFWSwKICAgICAgICAgICAgICAgICAgICBmaWVsZF9saW5lLAogICAgICAgICAgICAgICAgICAgIGYiJ3trZXlfcGF0aH0nIGlzIG5vdCBhIGtub3duIEh5cHJsYW5kIGNvbmZpZyBrZXkiLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmllbGQudmFsdWUsIFRhYmxlKToKICAgICAgICAgICAgaWYgaXNfbGVhZjoKICAgICAgICAgICAgICAgIHR5cGVfZXhwciA9IHNjaGVtYS5jb25maWdfdmFsdWVfdHlwZXNba2V5X3BhdGhdCiAgICAgICAgICAgICAgICBpZiBub3QgX2hhc190YWJsZV9hbHRlcm5hdGl2ZSh0eXBlX2V4cHIpOgogICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgRmluZGluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLlRZUEVfTUlTTUFUQ0gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiIne2tleV9wYXRofScgZXhwZWN0cyB7dHlwZV9leHByfSwgZ290IGEgdGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIyBlbHNlOiB0YWJsZS1zaGFwZWQgYWx0ZXJuYXRpdmUgYWxsb3dlZCwgZS5nLiBITC5HcmFkaWVudCAtCiAgICAgICAgICAgICAgICAjIG5vdCBjaGVja2VkIGZ1cnRoZXIgKHNlZSBtb2R1bGUgZG9jc3RyaW5nKS4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbmRpbmdzLmV4dGVuZCgKICAgICAgICAgICAgICAgICAgICBfd2Fsa19jb25maWdfdGFibGUoc2NoZW1hLCBmaWVsZC52YWx1ZSwga2V5X3BhdGgsIGZpZWxkX2xpbmUsIGRlZmluZWRfbmFtZXMpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGlzX2xlYWY6CiAgICAgICAgICAgIHR5cGVfZXhwciA9IHNjaGVtYS5jb25maWdfdmFsdWVfdHlwZXNba2V5X3BhdGhdCiAgICAgICAgICAgIGxpdGVyYWwgPSByZWFkZXIucmVzb2x2ZV9saXRlcmFsKGZpZWxkLnZhbHVlKQogICAgICAgICAgICBpZiBsaXRlcmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IF9zY2FsYXJfa2luZF9tYXRjaGVzKGxpdGVyYWwua2luZCwgdHlwZV9leHByKSBhbmQgbm90IF9oYXNfdGFibGVfYWx0ZXJuYXRpdmUodHlwZV9leHByKToKICAgICAgICAgICAgICAgICAgICBmaW5kaW5ncy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kaW5nS2luZC5UWVBFX01JU01BVENILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYiJ3trZXlfcGF0aH0nIGV4cGVjdHMge3R5cGVfZXhwcn0sIGdvdCB7bGl0ZXJhbC5raW5kfSAoe2xpdGVyYWwudmFsdWUhcn0pIiwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbmRpbmcgPSBfbWlzc2luZ19xdW90ZXNfZmluZGluZyhrZXlfcGF0aCwgZmllbGQudmFsdWUsIHR5cGVfZXhwciwgZmllbGRfbGluZSwgZGVmaW5lZF9uYW1lcykKICAgICAgICAgICAgICAgIGlmIGZpbmRpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKGZpbmRpbmcpCiAgICAgICAgICAgICAgICAjIGVsc2U6IG5vdCBhIGxpdGVyYWwgYW5kIG5vdCBhIGZsYWdnYWJsZSBiYXJlIGlkZW50aWZpZXIKICAgICAgICAgICAgICAgICMgKHZhcmlhYmxlL2NhbGwvZGVmaW5lZC1uYW1lKSAtIGNhbid0IGNoZWNrLCBhY2NlcHRlZC4KICAgICAgICAjIGVsc2UgKGlzX2NvbnRhaW5lciBidXQgdmFsdWUgaXNuJ3QgYSBUYWJsZSk6IG1hbGZvcm1lZCBidXQgbm90CiAgICAgICAgIyBzb21ldGhpbmcgd2UgY2FuIGNsYXNzaWZ5IGZ1cnRoZXI7IHNraXAgcmF0aGVyIHRoYW4gZ3Vlc3MuCgogICAgcmV0dXJuIGZpbmRpbmdzCgoKZGVmIF9yZXNvbHZlX3N0YXRpY19zdHJpbmcoZXhwcikgLT4gc3RyIHwgTm9uZToKICAgICIiIlJlc29sdmUgYW4gZXhwcmVzc2lvbiB0byBhIHBsYWluIHN0cmluZyBpZiBpdCdzIGEgc3RyaW5nIGxpdGVyYWwsIG9yCiAgICBhIGBDb25jYXRgIChMdWEgYC4uYCkgb2Ygb25seSBzdHJpbmcgbGl0ZXJhbHMgLSBlLmcuIGAiU1VQRVIiIC4uICIgKyBRImAuCiAgICBSZXR1cm5zIE5vbmUgZm9yIGFueXRoaW5nIGVsc2UsIG5vdGFibHkgYSBjb25jYXQgaW52b2x2aW5nIGEgdmFyaWFibGUKICAgIChgbWFpbk1vZCAuLiAiICsgUSJgKSAtIGNhbid0IGJlIHJlc29sdmVkIHdpdGhvdXQgZXZhbHVhdGluZyB0aGUgc2NyaXB0LAogICAgdGhlIHNhbWUgbGltaXRhdGlvbiBgcmVhZGVyLnJlc29sdmVfbGl0ZXJhbGAgZG9jdW1lbnRzIGZvciB2YWx1ZXMgaW4KICAgIGdlbmVyYWwuIExpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gYHJlYWRlcmAgYmVjYXVzZSBgcmVzb2x2ZV9saXRlcmFsYCdzCiAgICBjb250cmFjdCBpcyBleHBsaWNpdGx5IHNjYWxhcnMtb25seTsgdGhpcyBpcyBhIG5hcnJvd2VyLCBjaGVja2VyLWxvY2FsCiAgICBuZWVkIChkdXBsaWNhdGUtYmluZCBkZXRlY3Rpb24pLiIiIgogICAgZnJvbSBsdWFwYXJzZXIuYXN0bm9kZXMgaW1wb3J0IENvbmNhdAoKICAgIGxpdGVyYWwgPSByZWFkZXIucmVzb2x2ZV9saXRlcmFsKGV4cHIpCiAgICBpZiBsaXRlcmFsIGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiBsaXRlcmFsLnZhbHVlIGlmIGxpdGVyYWwua2luZCA9PSAic3RyaW5nIiBlbHNlIE5vbmUKICAgIGlmIGlzaW5zdGFuY2UoZXhwciwgQ29uY2F0KToKICAgICAgICBsZWZ0ID0gX3Jlc29sdmVfc3RhdGljX3N0cmluZyhleHByLmxlZnQpCiAgICAgICAgcmlnaHQgPSBfcmVzb2x2ZV9zdGF0aWNfc3RyaW5nKGV4cHIucmlnaHQpCiAgICAgICAgaWYgbGVmdCBpcyBub3QgTm9uZSBhbmQgcmlnaHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQKICAgIHJldHVybiBOb25lCgoKZGVmIF9maWVsZF9rZXlfbmFtZShrZXlfZXhwcikgLT4gc3RyIHwgTm9uZToKICAgIGZyb20gbHVhcGFyc2VyLmFzdG5vZGVzIGltcG9ydCBOYW1lLCBTdHJpbmcKCiAgICBpZiBoYXNhdHRyKGtleV9leHByLCAiaWQiKTogICMgTmFtZQogICAgICAgIHJldHVybiBrZXlfZXhwci5pZAogICAgaWYgaGFzYXR0cihrZXlfZXhwciwgInMiKTogICMgU3RyaW5nIChicmFja2V0ZWQgWyJrZXkiXSA9IC4uLiBmb3JtKQogICAgICAgIHMgPSBrZXlfZXhwci5zCiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCkgaWYgaXNpbnN0YW5jZShzLCBieXRlcykgZWxzZSBzCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfY2hlY2tfc3BlY190YWJsZSgKICAgIHNjaGVtYTogU2NoZW1hLCB0YWJsZTogVGFibGUsIGNsYXNzX25hbWU6IHN0ciwgbGluZTogaW50IHwgTm9uZSwKICAgIGRlZmluZWRfbmFtZXM6IHNldFtzdHJdLAopIC0+IGxpc3RbRmluZGluZ106CiAgICAiIiJDaGVjayBhIHRhYmxlJ3Mga2V5cy92YWx1ZXMgYWdhaW5zdCBhIHNjaGVtYSBjbGFzcydzIG93biBmaWVsZHMKICAgIChlLmcuIEhMLk1vbml0b3JTcGVjKSAtIHRoZSBzcGVjLXRhYmxlIG1lY2hhbmlzbSwgZGlzdGluY3QgZnJvbQogICAgX3dhbGtfY29uZmlnX3RhYmxlJ3MgZG90dGVkLXBhdGggY2hlY2sgKGhsLmNvbmZpZyBvbmx5KS4gU2VlIG1vZHVsZQogICAgZG9jc3RyaW5nIGZvciB3aHkgdGhlc2Ugc3RheSBzZXBhcmF0ZSByYXRoZXIgdGhhbiB1bmlmaWVkLiIiIgogICAgZmluZGluZ3M6IGxpc3RbRmluZGluZ10gPSBbXQogICAgY2xzID0gc2NoZW1hLmNsYXNzZXMuZ2V0KGNsYXNzX25hbWUpCiAgICBpZiBjbHMgaXMgTm9uZToKICAgICAgICByZXR1cm4gZmluZGluZ3MgICMgc2hvdWxkbid0IGhhcHBlbiBpZiBjbGFzc19uYW1lIGNhbWUgZnJvbSB0aGUgc2NoZW1hIGl0c2VsZgoKICAgIGZvciBmaWVsZCBpbiB0YWJsZS5maWVsZHM6CiAgICAgICAgaWYgZmllbGQua2V5IGlzIE5vbmU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAga2V5X25hbWUgPSBfZmllbGRfa2V5X25hbWUoZmllbGQua2V5KQogICAgICAgIGlmIGtleV9uYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZmllbGRfbGluZSA9IGZpZWxkLmZpcnN0X3Rva2VuLmxpbmUgaWYgZmllbGQuZmlyc3RfdG9rZW4gZWxzZSBsaW5lCgogICAgICAgIHR5cGVfZXhwciA9IGNscy5maWVsZHMuZ2V0KGtleV9uYW1lKQogICAgICAgIGlmIHR5cGVfZXhwciBpcyBOb25lOgogICAgICAgICAgICBmaW5kaW5ncy5hcHBlbmQoRmluZGluZygKICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLlVOS05PV05fU1BFQ19GSUVMRCwgZmllbGRfbGluZSwKICAgICAgICAgICAgICAgIGYiJ3trZXlfbmFtZX0nIGlzIG5vdCBhIGZpZWxkIG9mIHtjbGFzc19uYW1lfSIsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmllbGQudmFsdWUsIFRhYmxlKToKICAgICAgICAgICAgaWYgdHlwZV9leHByIGluIHNjaGVtYS5jbGFzc2VzOgogICAgICAgICAgICAgICAgZmluZGluZ3MuZXh0ZW5kKF9jaGVja19zcGVjX3RhYmxlKHNjaGVtYSwgZmllbGQudmFsdWUsIHR5cGVfZXhwciwgZmllbGRfbGluZSwgZGVmaW5lZF9uYW1lcykpCiAgICAgICAgICAgIGVsaWYgbm90IF9oYXNfdGFibGVfYWx0ZXJuYXRpdmUodHlwZV9leHByKToKICAgICAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKAogICAgICAgICAgICAgICAgICAgIEZpbmRpbmdLaW5kLlRZUEVfTUlTTUFUQ0gsIGZpZWxkX2xpbmUsCiAgICAgICAgICAgICAgICAgICAgZiIne2tleV9uYW1lfScgb24ge2NsYXNzX25hbWV9IGV4cGVjdHMge3R5cGVfZXhwcn0sIGdvdCBhIHRhYmxlIiwKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGxpdGVyYWwgPSByZWFkZXIucmVzb2x2ZV9saXRlcmFsKGZpZWxkLnZhbHVlKQogICAgICAgIGlmIGxpdGVyYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIG5vdCBfc2NhbGFyX2tpbmRfbWF0Y2hlcyhsaXRlcmFsLmtpbmQsIHR5cGVfZXhwcikgYW5kIG5vdCBfaGFzX3RhYmxlX2FsdGVybmF0aXZlKHR5cGVfZXhwcik6CiAgICAgICAgICAgICAgICBmaW5kaW5ncy5hcHBlbmQoRmluZGluZygKICAgICAgICAgICAgICAgICAgICBGaW5kaW5nS2luZC5UWVBFX01JU01BVENILCBmaWVsZF9saW5lLAogICAgICAgICAgICAgICAgICAgIGYiJ3trZXlfbmFtZX0nIG9uIHtjbGFzc19uYW1lfSBleHBlY3RzIHt0eXBlX2V4cHJ9LCBnb3Qge2xpdGVyYWwua2luZH0gKHtsaXRlcmFsLnZhbHVlIXJ9KSIsCiAgICAgICAgICAgICAgICApKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTm90IGEgbGl0ZXJhbCAtIGVpdGhlciBhIGZsYWdnYWJsZSBiYXJlIGlkZW50aWZpZXIgKHNlZQogICAgICAgICAgICAjIF9taXNzaW5nX3F1b3Rlc19maW5kaW5nKSBvciBhIGdlbnVpbmUgdmFyaWFibGUvY2FsbCwgd2hpY2gKICAgICAgICAgICAgIyBjYW4ndCBiZSBjaGVja2VkIGZ1cnRoZXIgYW5kIGlzIGFjY2VwdGVkLCBzYW1lIGFzCiAgICAgICAgICAgICMgX3dhbGtfY29uZmlnX3RhYmxlJ3MgZG9jdW1lbnRlZCBiZWhhdmlvci4KICAgICAgICAgICAgZmluZGluZyA9IF9taXNzaW5nX3F1b3Rlc19maW5kaW5nKGtleV9uYW1lLCBmaWVsZC52YWx1ZSwgdHlwZV9leHByLCBmaWVsZF9saW5lLCBkZWZpbmVkX25hbWVzKQogICAgICAgICAgICBpZiBmaW5kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZmluZGluZ3MuYXBwZW5kKGZpbmRpbmcpCgogICAgcmV0dXJuIGZpbmRpbmdzCgoKZGVmIGNoZWNrKHNjaGVtYTogU2NoZW1hLCB0cmVlKSAtPiBsaXN0W0ZpbmRpbmddOgogICAgIiIiUnVuIGV2ZXJ5IGNoZWNrIGFnYWluc3QgYW4gYWxyZWFkeS1wYXJzZWQgTHVhIEFTVCAoZnJvbQogICAgaHlwcnZhbGlkYXRlLmx1YWFzdC5yZWFkZXIucGFyc2UvcGFyc2VfZmlsZSkuIiIiCiAgICBmaW5kaW5nczogbGlzdFtGaW5kaW5nXSA9IFtdCiAgICBiaW5kX2tleV9saW5lczogZGljdFtzdHIsIGxpc3RbaW50IHwgTm9uZV1dID0ge30KICAgIGRlZmluZWRfbmFtZXMgPSBfY29sbGVjdF9kZWZpbmVkX25hbWVzKHRyZWUpCgogICAgZm9yIG5vZGUgaW4gcmVhZGVyLndhbGsodHJlZSk6CiAgICAgICAgIyBOQjogYE1ldGhvZGAgKGEgYGZ1bmN0aW9uIFQ6bWV0aG9kKCkgZW5kYCAqZGVmaW5pdGlvbiopIGhhcyBubwogICAgICAgICMgYC5mdW5jYCAtIGl0J3Mgbm90IGEgY2FsbCBhdCBhbGwuIGBJbnZva2VgIChhbiBgb2JqOmJhcigpYCAqY2FsbCopCiAgICAgICAgIyBpcyB3aGF0IGJlbG9uZ3MgaGVyZTsgSHlwcmxhbmQncyBvd24gQVBJIGlzIGV4Y2x1c2l2ZWx5IGRvdC1zdHlsZQogICAgICAgICMgKGBobC5iaW5kKC4uLilgKSBzbyBhbiBJbnZva2UncyBiYXJlIG1ldGhvZCBuYW1lIG5ldmVyIHJlc29sdmVzCiAgICAgICAgIyBhcyBgaGwuKmAgYW5kIGlzIGhhcm1sZXNzbHkgc2tpcHBlZCBiZWxvdywgc2FtZSBhcyBhbnkgb3RoZXIKICAgICAgICAjIGZvcmVpZ24gY2FsbCAtIHRoZSBvbmx5IHRoaW5nIHRoYXQgbWF0dGVycyBpcyBub3QgY3Jhc2hpbmcgb24gaXQuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgKENhbGwsIEludm9rZSkpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGRvdHRlZCA9IHJlYWRlci5yZXNvbHZlX2RvdHRlZF9uYW1lKG5vZGUuZnVuYykKICAgICAgICBpZiBkb3R0ZWQgaXMgTm9uZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBsaW5lID0gbm9kZS5maXJzdF90b2tlbi5saW5lIGlmIG5vZGUuZmlyc3RfdG9rZW4gZWxzZSBOb25lCgogICAgICAgIGlmIGRvdHRlZCA9PSAiaGwuYmluZCIgYW5kIG5vZGUuYXJnczoKICAgICAgICAgICAga2V5cyA9IF9yZXNvbHZlX3N0YXRpY19zdHJpbmcobm9kZS5hcmdzWzBdKQogICAgICAgICAgICBpZiBrZXlzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgYmluZF9rZXlfbGluZXMuc2V0ZGVmYXVsdChrZXlzLCBbXSkuYXBwZW5kKGxpbmUpCgogICAgICAgIGlzX3ZhbGlkLCByZWFzb24sIHNpZ190eXBlX2V4cHIgPSByZXNvbHZlX3N5bWJvbChzY2hlbWEsIGRvdHRlZCkKICAgICAgICBpZiBub3QgaXNfdmFsaWQ6CiAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKEZpbmRpbmdLaW5kLlVOS05PV05fU1lNQk9MLCBsaW5lLCBmIntkb3R0ZWR9OiB7cmVhc29ufSIpKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBzaWdfdHlwZV9leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzaWcgPSBwYXJzZV9mdW5fc2lnbmF0dXJlKHNpZ190eXBlX2V4cHIpCiAgICAgICAgICAgIGlmIHNpZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZvciBpZHgsIHBhcmFtIGluIGVudW1lcmF0ZShzaWcucGFyYW1zKToKICAgICAgICAgICAgICAgICAgICBpZiAiSEwuRGlzcGF0Y2hlciIgbm90IGluIHBhcmFtLnR5cGVfZXhwciBvciBpZHggPj0gbGVuKG5vZGUuYXJncyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgYXJnX2RvdHRlZCA9IHJlYWRlci5yZXNvbHZlX2RvdHRlZF9uYW1lKG5vZGUuYXJnc1tpZHhdKQogICAgICAgICAgICAgICAgICAgIGlmIGFyZ19kb3R0ZWQgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBhcmdfdmFsaWQsIF9yZWFzb24sIGFyZ19zaWcgPSByZXNvbHZlX3N5bWJvbChzY2hlbWEsIGFyZ19kb3R0ZWQpCiAgICAgICAgICAgICAgICAgICAgaWYgYXJnX3ZhbGlkIGFuZCBhcmdfc2lnIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBmaXggPSBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19ub2RlID0gbm9kZS5hcmdzW2lkeF0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXJnX25vZGUubGFzdF90b2tlbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSW5zZXJ0IChub3QgcmVwbGFjZSkgcmlnaHQgYWZ0ZXIgdGhlIHJlZmVyZW5jZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxhc3QgdG9rZW4gLSBgKClgIGlzIHRoZSBtaW5pbWFsIGNvcnJlY3Rpb24gdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtYWtlcyB0aGlzIGEgY2FsbCBhdCBhbGwuIElmIHRoZSBkaXNwYXRjaGVyIGFsc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmVlZHMgYXJndW1lbnRzLCB0aGUgcmUtY2hlY2sgYWZ0ZXIgYXBwbHlpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZml4ZXMgd2lsbCBzdXJmYWNlIHRoYXQgYXMgYSBmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBUklUWV9NSVNNQVRDSCAtIGEgZGlmZmVyZW50LCBob25lc3QgcHJvYmxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm90IHNvbWV0aGluZyB0byBndWVzcyBhdCBoZXJlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0ID0gYXJnX25vZGUubGFzdF90b2tlbi5zdG9wICsgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ID0gRml4RWRpdChzdGFydD1pbnNlcnRfYXQsIGVuZD1pbnNlcnRfYXQsIHJlcGxhY2VtZW50PSIoKSIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZGluZ0tpbmQuVU5DQUxMRURfRElTUEFUQ0hFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYie2RvdHRlZH06IGFyZ3VtZW50IHtpZHggKyAxfSAoJ3thcmdfZG90dGVkfScpIGlzIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiJkaXNwYXRjaGVyIGZhY3RvcnkgcmVmZXJlbmNlLCBub3QgYSBjYWxsIC0gZGlkIHlvdSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIm1lYW4gJ3thcmdfZG90dGVkfSguLi4pJz8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4PWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgaWYgc2lnIGlzIG5vdCBOb25lIGFuZCBub3Qgc2lnLmhhc192YXJhcmc6CiAgICAgICAgICAgICAgICBuX2FyZ3MgPSBsZW4obm9kZS5hcmdzKQogICAgICAgICAgICAgICAgbWluX2FyZ3MgPSBzdW0oMSBmb3IgcCBpbiBzaWcucGFyYW1zIGlmIG5vdCBwLm9wdGlvbmFsKQogICAgICAgICAgICAgICAgbWF4X2FyZ3MgPSBsZW4oc2lnLnBhcmFtcykKICAgICAgICAgICAgICAgIGlmIG5fYXJncyA8IG1pbl9hcmdzOgogICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICBGaW5kaW5nS2luZC5BUklUWV9NSVNNQVRDSCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7ZG90dGVkfTogZXhwZWN0cyBhdCBsZWFzdCB7bWluX2FyZ3N9IGFyZ3VtZW50KHMpLCBnb3Qge25fYXJnc30iLAogICAgICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICBlbGlmIG5fYXJncyA+IG1heF9hcmdzOgogICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICBGaW5kaW5nS2luZC5BUklUWV9NSVNNQVRDSCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7ZG90dGVkfTogZXhwZWN0cyBhdCBtb3N0IHttYXhfYXJnc30gYXJndW1lbnQocyksIGdvdCB7bl9hcmdzfSIsCiAgICAgICAgICAgICAgICAgICAgKSkKCiAgICAgICAgICAgICAgICAjIENoZWNrIHNwZWMtdGFibGUgYXJndW1lbnRzIGFnYWluc3QgdGhlaXIgb3duIHNjaGVtYQogICAgICAgICAgICAgICAgIyBjbGFzcywgZm9yIGV2ZXJ5IGZ1bmN0aW9uIGV4Y2VwdCBobC5jb25maWcgKGl0cyBvd24KICAgICAgICAgICAgICAgICMgYWxyZWFkeS10ZXN0ZWQgZG90dGVkLXBhdGggbWVjaGFuaXNtLCBzZWUgbW9kdWxlCiAgICAgICAgICAgICAgICAjIGRvY3N0cmluZykgYW5kIGhsLndpbmRvd19ydWxlIHNwZWNpZmljYWxseSAtIGZvdW5kIGJ5CiAgICAgICAgICAgICAgICAjIHRoaXMgY2hlY2sncyBvd24gdGVzdCBzdWl0ZSBmbG9vZGluZyBmYWxzZSBwb3NpdGl2ZXMgb24KICAgICAgICAgICAgICAgICMgdGhlIHJlYWwgY29uZmlnOiBITC5XaW5kb3dSdWxlU3BlYyBvbmx5IHR5cGVzIDMKICAgICAgICAgICAgICAgICMgdW5pdmVyc2FsIGZpZWxkcyAoZW5hYmxlZC9tYXRjaC9uYW1lKSwgdW5saWtlIGl0cwogICAgICAgICAgICAgICAgIyBzaWJsaW5ncyBITC5MYXllclJ1bGVTcGVjICgxMyBmaWVsZHMpIGFuZAogICAgICAgICAgICAgICAgIyBITC5Xb3Jrc3BhY2VSdWxlU3BlYyAoMTcgZmllbGRzKSB3aGljaCBhcmUgZnVsbHkgdHlwZWQuCiAgICAgICAgICAgICAgICAjIFBlci1ydWxlLXR5cGUgZmllbGRzIChtb3ZlL2Zsb2F0L3dvcmtzcGFjZS9zdXBwcmVzc19ldmVudC8KICAgICAgICAgICAgICAgICMgbm9fZm9jdXMpIGFyZSBkeW5hbWljYWxseSBkaXNwYXRjaGVkIGFuZCBkZWxpYmVyYXRlbHkgbm90CiAgICAgICAgICAgICAgICAjIGluIHRoZSBzdHViIGF0IGFsbCAtIHRoZSBzYW1lIGZhY3QgYWxyZWFkeSBub3RlZCBhYm92ZQogICAgICAgICAgICAgICAgIyBhYm91dCBobC5wbHVnaW4uKiwgcmUtZGlzY292ZXJlZCB0aGUgaGFyZCB3YXkgaGVyZSB3aGVuCiAgICAgICAgICAgICAgICAjIGdlbmVyYWxpemluZy4KICAgICAgICAgICAgICAgIGlmIGRvdHRlZCBub3QgaW4gKCJobC5jb25maWciLCAiaGwud2luZG93X3J1bGUiKToKICAgICAgICAgICAgICAgICAgICBmb3IgaWR4LCBwYXJhbSBpbiBlbnVtZXJhdGUoc2lnLnBhcmFtcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhcmFtLnR5cGVfZXhwciBpbiBzY2hlbWEuY2xhc3NlcyBhbmQgaWR4IDwgbGVuKG5vZGUuYXJncyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBub2RlLmFyZ3NbaWR4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIFRhYmxlKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kaW5ncy5leHRlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja19zcGVjX3RhYmxlKHNjaGVtYSwgYXJnLCBwYXJhbS50eXBlX2V4cHIsIGxpbmUsIGRlZmluZWRfbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICBpZiBkb3R0ZWQgPT0gImhsLmNvbmZpZyIgYW5kIG5vZGUuYXJncyBhbmQgaXNpbnN0YW5jZShub2RlLmFyZ3NbMF0sIFRhYmxlKToKICAgICAgICAgICAgZmluZGluZ3MuZXh0ZW5kKF93YWxrX2NvbmZpZ190YWJsZShzY2hlbWEsIG5vZGUuYXJnc1swXSwgIiIsIGxpbmUsIGRlZmluZWRfbmFtZXMpKQoKICAgIGZvciBrZXlzLCBsaW5lcyBpbiBiaW5kX2tleV9saW5lcy5pdGVtcygpOgogICAgICAgIGlmIGxlbihsaW5lcykgPCAyOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGZvciB0aGlzX2xpbmUgaW4gbGluZXM6CiAgICAgICAgICAgIG90aGVycyA9ICIsICIuam9pbihzdHIobCkgZm9yIGwgaW4gbGluZXMgaWYgbCAhPSB0aGlzX2xpbmUpCiAgICAgICAgICAgIGZpbmRpbmdzLmFwcGVuZChGaW5kaW5nKAogICAgICAgICAgICAgICAgRmluZGluZ0tpbmQuRFVQTElDQVRFX0JJTkQsIHRoaXNfbGluZSwKICAgICAgICAgICAgICAgIGYiJ3trZXlzfScgaXMgYm91bmQgbW9yZSB0aGFuIG9uY2UgKGFsc28gYXQgbGluZShzKSB7b3RoZXJzfSkiLAogICAgICAgICAgICApKQoKICAgIHJldHVybiBmaW5kaW5ncwoKCmRlZiBjaGVja19zb3VyY2Uoc2NoZW1hOiBTY2hlbWEsIHNvdXJjZTogc3RyKSAtPiBsaXN0W0ZpbmRpbmddOgogICAgdHJlZSA9IHJlYWRlci5wYXJzZShzb3VyY2UpCiAgICByZXR1cm4gY2hlY2soc2NoZW1hLCB0cmVlKQo=", "hyprvalidate/converter/dispatch.py": "IiIiQmxvY2stdHlwZSBkaXNwYXRjaC4KCkdpdmVuIGEgaHlwcmxhbmcgYmxvY2sncyBuYW1lLCBkZWNpZGUgd2hldGhlciBpdCBiZWNvbWVzIGEgdG9wLWxldmVsCmBobC48bmFtZT4oc3BlYylgIGNhbGwgb3IgZmxhdHRlbnMgaW50byBgaGwuY29uZmlnKHsuLi59KWAncyBkb3R0ZWQta2V5CnNwYWNlLiBEZXJpdmVkIGxpdmUgZnJvbSB0aGUgc2NoZW1hIChgSEwuQVBJYCdzIG93biBmaWVsZHMpIHZpYSB0aGUgc2FtZQp3YWxrIGByZXNvbHZlX3N5bWJvbGAgYWxyZWFkeSB1c2VzIC0gbm90IGEgaGFuZC10eXBlZCB3aGl0ZWxpc3QuIGh5cHItbWlncmF0ZQpoYWQgdGhpcyBleGFjdCBpZGVhIChgS05PV05fU0VDVElPTlNgKSBhbmQgbmV2ZXIgd2lyZWQgaXQgaW47IGRlcml2aW5nIGl0CmxpdmUgbWVhbnMgaXQgY2FuJ3QgZ28gc3RhbGUgb3IgZ28gdW53aXJlZC4KCk9ubHkgZXhhY3QgbmFtZSBtYXRjaGVzIGFyZSByZXNvbHZlZCBoZXJlLiBBIGh5cHJsYW5nIGRpcmVjdGl2ZSB3aG9zZSBvbGQKbmFtZSBkb2Vzbid0IGxpdGVyYWxseSBtYXRjaCBpdHMgSEwuQVBJIGNvdW50ZXJwYXJ0IChlLmcuIGBsYXllcnJ1bGVgIHZzLgpgbGF5ZXJfcnVsZWApIGlzIGEgcmVuYW1lLCBub3QgYSBkaXNwYXRjaCBkZWNpc2lvbiAtIHRoYXQncyByZW5hbWUucHkncwpoYW5kLWN1cmF0ZWQsIHNjaGVtYS1jaGVja2VkIHRhYmxlLCBub3QgdGhpcyBtb2R1bGUncyBqb2IuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgpmcm9tIGh5cHJ2YWxpZGF0ZS5jaGVja2VyIGltcG9ydCBwYXJzZV9mdW5fc2lnbmF0dXJlCmZyb20gaHlwcnZhbGlkYXRlLnNjaGVtYS5leHRyYWN0b3IgaW1wb3J0IFNjaGVtYQoKCmRlZiBjbGFzc2lmeV9ibG9jayhzY2hlbWE6IFNjaGVtYSwgbmFtZTogc3RyKSAtPiBzdHIgfCBOb25lOgogICAgIiIiUmV0dXJucyB0aGUgZG90dGVkIHRhcmdldCAoImhsLjxuYW1lPiIpIGlmIGBuYW1lYCBtYXRjaGVzIGFuIEhMLkFQSQogICAgZmllbGQgdHlwZWQgYXMgYSBuYW1lZCBgZnVuKHNwZWM6IEhMLlNvbWVTcGVjKWAgc2lnbmF0dXJlIC0gaS5lLiB0aGlzCiAgICBoeXBybGFuZyBibG9jayBzaG91bGQgYmVjb21lIHRoYXQgdG9wLWxldmVsIGNhbGwuIFJldHVybnMgTm9uZSBpZiBpdAogICAgc2hvdWxkIGluc3RlYWQgZmxhdHRlbiBpbnRvIGhsLmNvbmZpZydzIGRvdHRlZC1rZXkgc3BhY2UgKGVpdGhlciBubwogICAgbWF0Y2hpbmcgZmllbGQgZXhpc3RzIGF0IGFsbCwgb3IgdGhlIGZpZWxkIGlzbid0IGEgc3BlYy1zaGFwZWQgY2FsbCkuIiIiCiAgICBhcGkgPSBzY2hlbWEuY2xhc3Nlcy5nZXQoIkhMLkFQSSIpCiAgICBpZiBhcGkgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHR5cGVfZXhwciA9IGFwaS5maWVsZHMuZ2V0KG5hbWUpCiAgICBpZiB0eXBlX2V4cHIgaXMgTm9uZSBvciBub3QgdHlwZV9leHByLnN0YXJ0c3dpdGgoImZ1bigiKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHNpZyA9IHBhcnNlX2Z1bl9zaWduYXR1cmUodHlwZV9leHByKQogICAgaWYgc2lnIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBoYXNfc3BlY19wYXJhbSA9IGFueShwLnR5cGVfZXhwciBpbiBzY2hlbWEuY2xhc3NlcyBmb3IgcCBpbiBzaWcucGFyYW1zKQogICAgcmV0dXJuIGYiaGwue25hbWV9IiBpZiBoYXNfc3BlY19wYXJhbSBlbHNlIE5vbmUK", "hyprvalidate/converter/coerce.py": "IiIiU2NoZW1hLXR5cGVkIHZhbHVlIGNvZXJjaW9uLgoKaHlwcmxhbmcgdmFsdWVzIGFyZSBhbHdheXMgcmF3IHN0cmluZ3M7IHRoZSB0YXJnZXQgc2NoZW1hIHNheXMgd2hhdCB0eXBlCnRoZXkgc2hvdWxkIGJlY29tZS4gVGhpcyBpcyB0aGUgZml4IGZvciB0aGUgZXhhY3QgYnVnIDMgb2YgNCBjb21wZXRpdG9yCnRvb2xzIG1hZGUgaW5kZXBlbmRlbnRseSAoYGFuaW1hdGlvbnMuZW5hYmxlZGAgZW1pdHRlZCBhcyB0aGUgKnN0cmluZyoKYCJ0cnVlImAgaW5zdGVhZCBvZiB0aGUgYm9vbGVhbiBgdHJ1ZWApIC0gY29lcmNlIGJ5IGxvb2tpbmcgdXAgdGhlIHRhcmdldApmaWVsZCdzIHJlYWwgdHlwZSwgbm90IGJ5IHN0cmluZy1zbmlmZmluZyB0aGUgdmFsdWUgaXRzZWxmLgoKT25seSByZWNvZ25pemVzIGh5cHJsYW5nJ3Mgb3duIGxpdGVyYWwgYm9vbGVhbiBzcGVsbGluZ3MgKCJ0cnVlIi8iZmFsc2UiLApjYXNlLWluc2Vuc2l0aXZlKSAtIG5vdCAieWVzIi8ib24iLyIxIiwgd2hpY2ggYXJlbid0IGNvbmZpcm1lZCBoeXBybGFuZwpsaXRlcmFscyBhbmQgd291bGQgYmUgYSBndWVzcy4gQSB2YWx1ZSB0aGF0IGRvZXNuJ3QgY29uZmlkZW50bHkgbWF0Y2ggYW55CnNjYWxhciBhbHRlcm5hdGl2ZSBpbiB0aGUgc2NoZW1hJ3MgdHlwZSBleHByZXNzaW9uIGlzIHBhc3NlZCB0aHJvdWdoIGFzIGEKc3RyaW5nIHVuY2hhbmdlZDsgdG9kby5weSBkZWNpZGVzIHdoYXQgdG8gZG8gd2l0aCBsb3ctY29uZmlkZW5jZSBjYXNlcywKdGhpcyBtb2R1bGUgbmV2ZXIgZ3Vlc3NlcyB0byBmb3JjZSBhIGNvZXJjaW9uLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSB0eXBpbmcgaW1wb3J0IEFueQoKCmRlZiBfdHJ5X2Jvb2wocmF3OiBzdHIpIC0+IGJvb2wgfCBOb25lOgogICAgbG93ZXJlZCA9IHJhdy5zdHJpcCgpLmxvd2VyKCkKICAgIGlmIGxvd2VyZWQgPT0gInRydWUiOgogICAgICAgIHJldHVybiBUcnVlCiAgICBpZiBsb3dlcmVkID09ICJmYWxzZSI6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfdHJ5X2ludChyYXc6IHN0cikgLT4gaW50IHwgTm9uZToKICAgIHRyeToKICAgICAgICByZXR1cm4gaW50KHJhdy5zdHJpcCgpKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgX3RyeV9udW1iZXIocmF3OiBzdHIpIC0+IGZsb2F0IHwgaW50IHwgTm9uZToKICAgIGFzX2ludCA9IF90cnlfaW50KHJhdykKICAgIGlmIGFzX2ludCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gYXNfaW50CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGZsb2F0KHJhdy5zdHJpcCgpKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpfQ09FUkNFUlMgPSB7CiAgICAiYm9vbGVhbiI6IF90cnlfYm9vbCwKICAgICJpbnRlZ2VyIjogX3RyeV9pbnQsCiAgICAibnVtYmVyIjogX3RyeV9udW1iZXIsCn0KCgpkZWYgY29lcmNlX3ZhbHVlKHR5cGVfZXhwcjogc3RyLCByYXc6IHN0cikgLT4gdHVwbGVbQW55LCBib29sXToKICAgICIiIlJldHVybnMgKHZhbHVlLCBtYXRjaGVkKS4gYG1hdGNoZWRgIGlzIFRydWUgd2hlbiBgcmF3YCBjb25maWRlbnRseQogICAgcGFyc2VkIGFzIG9uZSBvZiBgdHlwZV9leHByYCdzIHNjYWxhciBhbHRlcm5hdGl2ZXMgKGluIGRlY2xhcmVkIG9yZGVyIC0KICAgIHRoZSBmaXJzdCBhbHRlcm5hdGl2ZSB0aGF0IHBhcnNlcyB3aW5zKTsgRmFsc2UgbWVhbnMgbm8gc2NhbGFyCiAgICBhbHRlcm5hdGl2ZSBtYXRjaGVkIGFuZCBgcmF3YCB3YXMgcmV0dXJuZWQgdW5jaGFuZ2VkIGFzIGEgc3RyaW5nLiIiIgogICAgZm9yIGFsdCBpbiAoYS5zdHJpcCgpIGZvciBhIGluIHR5cGVfZXhwci5zcGxpdCgifCIpKToKICAgICAgICBjb2VyY2VyID0gX0NPRVJDRVJTLmdldChhbHQpCiAgICAgICAgaWYgY29lcmNlciBpcyBOb25lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHZhbHVlID0gY29lcmNlcihyYXcpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSwgVHJ1ZQogICAgcmV0dXJuIHJhdywgRmFsc2UK", "hyprvalidate/converter/rename.py": "IiIiRGlzcGF0Y2hlci9iaW5kLWZsYWcgcmVuYW1lIHRhYmxlcy4KCmh5cHJsYW5nJ3Mgb2xkIGRpc3BhdGNoZXIgbmFtZXMgYW5kIHNpbmdsZS1sZXR0ZXIgYmluZCBmbGFncyBkb24ndCBleGlzdCBpbgp0aGUgbmV3IEx1YSBzY2hlbWEgYXQgYWxsIC0gdGhlcmUncyBub3RoaW5nIHRvIGRlcml2ZSB0aGlzIGZyb20sIHVubGlrZSB0aGUKYmxvY2stZGlzcGF0Y2ggYW5kIHZhbHVlLWNvZXJjaW9uIGxvZ2ljIGVsc2V3aGVyZSBpbiB0aGlzIHBhY2thZ2UuIFRoZXNlCmFyZSBoYW5kLWN1cmF0ZWQgdGFibGVzLCB2ZXJpZmllZCBhZ2FpbnN0IHJlYWwgZXZpZGVuY2UgcmF0aGVyIHRoYW4gZ3Vlc3NlZDoKCiAgLSBESVNQQVRDSEVSX1JFTkFNRSB3YXMgYnVpbHQgYnkgcmVhZGluZyBIeXBybGFuZCdzIGFjdHVhbCBjdXJyZW50CiAgICBkaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uCiAgICAoc3JjL2NvbmZpZy9sdWEvYmluZGluZ3MvTHVhQmluZGluZ3NEaXNwYXRjaGVycy5jcHAsIGZ1bmN0aW9uIGJvZGllcyBmb3IKICAgIGhsV2luZG93TW92ZS9obEZvY3VzIGV0YywgZmV0Y2hlZCBhbmQgcmVhZCBkaXJlY3RseSkgdG8gY29uZmlybSBlYWNoIG9sZAogICAgZGlzcGF0Y2hlcidzIHJlYWwgbmV3IHRhcmdldCAtIG5vdCBjb3BpZWQgZnJvbSBhIGNvbXBldGl0b3IncyB0YWJsZS4KICAgIGh5cHJjb25mMmx1YSdzIG93biBESVNQQVRDSEVSX01BUCB3YXMgcmVhZCBmb3IgY29tcGFyaXNvbiBhbmQgaXMgTk9UIGEKICAgIHJlbGlhYmxlIHNvdXJjZTogY3Jvc3MtY2hlY2tpbmcgaXQgYWdhaW5zdCB0aGUgc2NoZW1hIGlzIGV4YWN0bHkgd2hhdAogICAgY2F1Z2h0IGl0cyBiaW5kLWZsYWcgdGFibGUncyBidWdzIGJlbG93LgogIC0gQklORF9GTEFHX1JFTkFNRSB3YXMgYnVpbHQgZnJvbSB0aGUgYXJjaGl2ZWQgSHlwcmxhbmQgMC41NC4wIHdpa2kncwogICAgIkJpbmQgZmxhZ3MiIHRhYmxlICh0aGUgbGFzdCB2ZXJzaW9uIGRvY3VtZW50aW5nIHRoZSBwcmUtTHVhIGh5cHJsYW5nCiAgICBmb3JtYXQsIGZldGNoZWQgZGlyZWN0bHkgLSB0aGUgY3VycmVudCB3aWtpIG9ubHkgZG9jdW1lbnRzIHRoZSBuZXcKICAgIGZvcm1hdCkgYW5kIGluZGVwZW5kZW50bHkgY3Jvc3MtY2hlY2tlZCBhZ2FpbnN0IGV2ZXJ5IGZpZWxkIEhMCiAgICAuQmluZE9wdGlvbnMgYWN0dWFsbHkgZGVjbGFyZXMgaW4gdGhlIGluc3RhbGxlZCBzdHViLgogICAgVGhpcyBjYXVnaHQgdHdvIGNvbmZpcm1lZCBtaXN0YWtlcyBvdGhlciB0b29scyBtYWRlIGZyb20gbWVtb3J5L2d1ZXNzaW5nOgogICAgICAtIGByYCBpcyAicmVsZWFzZSIsIG5vdCAicmVwZWF0IiAodGhhdCdzIGBlYCkgLSBoeXByY29uZjJsdWEncyBvd24KICAgICAgICBCSU5EX0ZMQUdTX1RPX09QVElPTlMgbWFwcyByIC0+ICJyZXBlYXRpbmciLCB3aGljaCBpcyB3cm9uZy4KICAgICAgLSBgbWAgKCJtb3VzZSIpIGhhcyBubyBjb3JyZXNwb25kaW5nIEhMLkJpbmRPcHRpb25zIGZpZWxkIGluIHRoZQogICAgICAgIGluc3RhbGxlZCBzdHViIGF0IGFsbCwgZGVzcGl0ZSB0aGUgKmN1cnJlbnQqIEx1YSB3aWtpJ3Mgb3duCiAgICAgICAgZXhhbXBsZXMgdXNpbmcgYHsgbW91c2UgPSB0cnVlIH1gIC0gYSByZWFsIGRvY3Mvc2NoZW1hCiAgICAgICAgZGlzY3JlcGFuY3ksIG5vdCBzb21ldGhpbmcgdG8gcGFwZXIgb3ZlciBieSBpbnZlbnRpbmcgYSBmaWVsZC4KICAgICAgICBUaGlzIHByb2plY3QgaGl0IHRoZSBzYW1lIHRyYXAgb25jZSBiZWZvcmUsIGluIGl0cyBvd24gZWFybGllcgogICAgICAgIGBtb3VzZWAtPmBkcmFnYCBidWcgLSBgZ2AgKCJkcmFnIikgaXMgdGhlIGZsYWcgdGhhdCBtYXBzIHRvCiAgICAgICAgdGhlIHJlYWwgYGRyYWdgIGZpZWxkOyBgbWAgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgb3V0IGhlcmUgcmF0aGVyCiAgICAgICAgdGhhbiBtYXBwZWQgdG8gYSBmaWVsZCB0aGF0IGRvZXNuJ3QgZXhpc3QuCgpUaHJlZSBvbGQgZmxhZ3MgYXJlIGRlbGliZXJhdGVseSBleGNsdWRlZCBmcm9tIEJJTkRfRkxBR19SRU5BTUUgYmVjYXVzZQp0aGV5IGNoYW5nZSB0aGUgKnNoYXBlKiBvZiB0aGUgYmluZCBjYWxsLCBub3QganVzdCBhIGJvb2xlYW4gb3B0aW9uLCBzbyBhCmxldHRlci0+ZmllbGQgdGFibGUgY2FuJ3QgcmVwcmVzZW50IHRoZW0gaG9uZXN0bHk6CiAgLSBgZGAgKCJoYXMgZGVzY3JpcHRpb24iKSAtIG9sZCBmb3JtYXQgaW5zZXJ0cyB0aGUgZGVzY3JpcHRpb24gYXMgYQogICAgcG9zaXRpb25hbCBhcmd1bWVudCAoYGJpbmRkID0gTU9ELCBLRVksIGRlc2NyaXB0aW9uLCBkaXNwYXRjaGVyLAogICAgcGFyYW1zYCksIGl0IGRvZXNuJ3QganVzdCB0b2dnbGUgYSBmbGFnLgogIC0gYHNgICgic2VwYXJhdGUiKSAtIGNoYW5nZXMgaG93IE1PRFMvS0VZIGNvbWJpbmUgaW50byBtdWx0aXBsZSBiaW5kcywKICAgIG5vdCBhIHBlci1iaW5kIG9wdGlvbiBmaWVsZCBhdCBhbGwgKG5vIG1hdGNoaW5nIEhMLkJpbmRPcHRpb25zIGZpZWxkCiAgICBleGlzdHMpLgogIC0gYG1gICgibW91c2UiKSAtIHNlZSBhYm92ZTsgdGhlIHJlYWwgcmVwbGFjZW1lbnQgaXMgdGhlIGBnYC9gZHJhZ2AKICAgIGZpZWxkIHBsdXMgdXNpbmcgYGhsLmRzcC53aW5kb3cuZHJhZygpYC9gcmVzaXplKClgIGFzIHRoZSBkaXNwYXRjaGVyLAogICAgbm90IGEgZmxhZyByZW5hbWUuClRoZXNlIHN1cmZhY2UgdGhyb3VnaCB0aGlzIHBhY2thZ2UncyBsb3ctY29uZmlkZW5jZSBUT0RPIGVtaXNzaW9uIChzZWUKdG9kby5weSkgaW5zdGVhZCBvZiBhIHNpbGVudCAoYW5kIHdyb25nKSBndWVzcy4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCiMgT2xkIGRpc3BhdGNoZXIgbmFtZSAtPiBuZXcgZG90dGVkIGhsLmRzcC4qIHRhcmdldC4gQXJndW1lbnQtc2hhcGUKIyB0cmFuc2xhdGlvbiAoZS5nLiBtb3ZldG93b3Jrc3BhY2UncyBwb3NpdGlvbmFsIHdvcmtzcGFjZSBhcmcgYmVjb21pbmcKIyBgeyB3b3Jrc3BhY2UgPSAuLi4sIGZvbGxvdyA9IGZhbHNlIH1gKSBpcyB0aGUgbWFwcGVyJ3Mgam9iIHdoZW4gaXQgYnVpbGRzCiMgdGhlIGNhbGwsIG5vdCB0aGlzIHRhYmxlJ3MgLSB0aGlzIG9ubHkgYW5zd2VycyAid2hpY2ggZnVuY3Rpb24iLgpESVNQQVRDSEVSX1JFTkFNRTogZGljdFtzdHIsIHN0cl0gPSB7CiAgICAia2lsbGFjdGl2ZSI6ICJobC5kc3Aud2luZG93LmNsb3NlIiwKICAgICJ0b2dnbGVmbG9hdGluZyI6ICJobC5kc3Aud2luZG93LmZsb2F0IiwKICAgICJmdWxsc2NyZWVuIjogImhsLmRzcC53aW5kb3cuZnVsbHNjcmVlbiIsCiAgICAicGluIjogImhsLmRzcC53aW5kb3cucGluIiwKICAgICJtb3ZlZm9jdXMiOiAiaGwuZHNwLmZvY3VzIiwKICAgICJ3b3Jrc3BhY2UiOiAiaGwuZHNwLmZvY3VzIiwKICAgICJtb3ZldG93b3Jrc3BhY2UiOiAiaGwuZHNwLndpbmRvdy5tb3ZlIiwKICAgICJtb3ZldG93b3Jrc3BhY2VzaWxlbnQiOiAiaGwuZHNwLndpbmRvdy5tb3ZlIiwKICAgICJ0b2dnbGVzcGVjaWFsd29ya3NwYWNlIjogImhsLmRzcC53b3Jrc3BhY2UudG9nZ2xlX3NwZWNpYWwiLAogICAgIm1vdmV3aW5kb3ciOiAiaGwuZHNwLndpbmRvdy5tb3ZlIiwKICAgICJyZXNpemV3aW5kb3ciOiAiaGwuZHNwLndpbmRvdy5yZXNpemUiLAogICAgImV4ZWMiOiAiaGwuZHNwLmV4ZWNfY21kIiwKICAgICJleGl0IjogImhsLmRzcC5leGl0IiwKICAgICJzdWJtYXAiOiAiaGwuZHNwLnN1Ym1hcCIsCiAgICAiZ2xvYmFsIjogImhsLmRzcC5nbG9iYWwiLAp9CgojIE9sZCBzaW5nbGUtbGV0dGVyIGJpbmQgZmxhZyAtPiByZWFsIEhMLkJpbmRPcHRpb25zIGZpZWxkIG5hbWUuCkJJTkRfRkxBR19SRU5BTUU6IGRpY3Rbc3RyLCBzdHJdID0gewogICAgImwiOiAibG9ja2VkIiwKICAgICJyIjogInJlbGVhc2UiLAogICAgImMiOiAiY2xpY2siLAogICAgImciOiAiZHJhZyIsCiAgICAibyI6ICJsb25nX3ByZXNzIiwKICAgICJlIjogInJlcGVhdGluZyIsCiAgICAibiI6ICJub25fY29uc3VtaW5nIiwKICAgICJ0IjogInRyYW5zcGFyZW50IiwKICAgICJpIjogImlnbm9yZV9tb2RzIiwKICAgICJwIjogImRvbnRfaW5oaWJpdCIsCiAgICAidSI6ICJzdWJtYXBfdW5pdmVyc2FsIiwKfQoKIyBPbGQgZmxhZ3MgdGhhdCBjaGFuZ2UgdGhlIGJpbmQgY2FsbCdzIHNoYXBlIHJhdGhlciB0aGFuIHRvZ2dsaW5nIGEgZmllbGQgLQojIHNlZSBtb2R1bGUgZG9jc3RyaW5nLiBLZXB0IGhlcmUgKG5vdCBqdXN0IGFic2VudCBmcm9tIHRoZSB0YWJsZSBhYm92ZSkgc28KIyB0b2RvLnB5IGNhbiByZWNvZ25pemUgInRoaXMgZmxhZyBpcyBrbm93biBidXQgdW5zdXBwb3J0ZWQiIGFuZCBzYXkgc28sCiMgaW5zdGVhZCBvZiBzaWxlbnRseSB0cmVhdGluZyBpdCBhcyAidW5rbm93biBmbGFnLCBndWVzcyBzb21ldGhpbmciLgpTSEFQRV9DSEFOR0lOR19CSU5EX0ZMQUdTOiBkaWN0W3N0ciwgc3RyXSA9IHsKICAgICJkIjogImhhcyBkZXNjcmlwdGlvbiAtIGluc2VydHMgZGVzY3JpcHRpb24gYXMgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBub3QgYSBmbGFnIiwKICAgICJzIjogInNlcGFyYXRlIC0gY29tYmluZXMgbW9kcy9rZXlzIGludG8gbXVsdGlwbGUgYmluZHMsIG5vdCBhIHBlci1iaW5kIG9wdGlvbiIsCiAgICAibSI6ICJtb3VzZSAtIG5vIG1hdGNoaW5nIEhMLkJpbmRPcHRpb25zIGZpZWxkOyB1c2UgdGhlICdnJy9kcmFnIGZpZWxkIGFuZCBhIG1vdXNlIGRpc3BhdGNoZXIgaW5zdGVhZCIsCn0K", "hyprvalidate/converter/todo.py": "IiIiTG93LWNvbmZpZGVuY2UgVE9ETyBlbWlzc2lvbi4KCkFueXRoaW5nIHRoZSBtYXBwZXIgY2FuJ3QgcmVzb2x2ZSB3aXRoIGZ1bGwgY29uZmlkZW5jZSAtIGFuIG9sZCBkaXNwYXRjaGVyCm5hbWUgbm90IGluIERJU1BBVENIRVJfUkVOQU1FLCBhIGJpbmQgZmxhZyB0aGF0IGNoYW5nZXMgdGhlIGJpbmQncyBzaGFwZQoob3IgaXNuJ3QgcmVjb2duaXplZCBhdCBhbGwpLCBhIGBzb3VyY2VgIGRpcmVjdGl2ZSAod2hpY2ggcmVmZXJlbmNlcwphbm90aGVyIGZpbGUgdGhlIGNvbnZlcnRlciBkb2Vzbid0IGlubGluZSkgLSBiZWNvbWVzIGEgY2xlYXJseS1tYXJrZWQKY29tbWVudCBpbiB0aGUgb3V0cHV0LiBOZXZlciBhIHNpbGVudCBndWVzczogdGhpcyBpcyB0aGUgc2luZ2xlIGJpZ2dlc3QKZGlmZmVyZW50aWF0b3IgZnJvbSB0aGUgZm91ciBleGlzdGluZyB0b29scyBmb3VuZCBieSByZWFkaW5nIHRoZWlyIGNvZGUKZWFybGllciBpbiB0aGlzIHByb2plY3QgKEVJb25UdXNrJ3MgZG9lcyB0aGlzIHJlYXNvbmFibHksIHRoZSBvdGhlciB0aHJlZQpkb24ndCkuCgpgbHVhcGFyc2VyYCdzIHByaW50ZXIgKGNvbmZpcm1lZCBieSByZWFkaW5nIHByaW50ZXJzLnB5KSBoYXMgbm8gdmlzaXRvcgpmb3IgYGFzdG5vZGVzLkNvbW1lbnRgIGF0IGFsbCAtIGl0IGNhbid0IHJvdW5kLXRyaXAgdGhyb3VnaCB0aGUgQVNUL3dyaXRlcgpwYXRoIHRoZSB3YXkgcmVhbCBzdGF0ZW1lbnRzIGRvLiBUT0RPIG5vdGVzIGFyZSB0aGVyZWZvcmUgcGxhaW4gdGV4dCwKam9pbmVkIHdpdGggcmVuZGVyZWQgc3RhdGVtZW50IHNvdXJjZSBieSBgcmVuZGVyX3Byb2dyYW1gLCBub3QgQVNUIG5vZGVzLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCgpmcm9tIC5yZW5hbWUgaW1wb3J0IEJJTkRfRkxBR19SRU5BTUUsIERJU1BBVENIRVJfUkVOQU1FLCBTSEFQRV9DSEFOR0lOR19CSU5EX0ZMQUdTCmZyb20gLi5sdWFhc3Qud3JpdGVyIGltcG9ydCBjaHVuaywgdG9fc291cmNlCgoKQGRhdGFjbGFzcwpjbGFzcyBUb2RvTm90ZToKICAgIHJlYXNvbjogc3RyCiAgICBkZXRhaWw6IHN0cgogICAgbGluZTogaW50IHwgTm9uZQoKCmRlZiBmb3JtYXRfdG9kbyhub3RlOiBUb2RvTm90ZSkgLT4gc3RyOgogICAgbG9jID0gZiIgKGh5cHJsYW5kLmNvbmYgbGluZSB7bm90ZS5saW5lfSkiIGlmIG5vdGUubGluZSBpcyBub3QgTm9uZSBlbHNlICIiCiAgICByZXR1cm4gZiItLSBUT0RPKGh5cHJ2YWxpZGF0ZSBjb252ZXJ0KToge25vdGUuZGV0YWlsfXtsb2N9IgoKCmRlZiBjaGVja19kaXNwYXRjaGVyKG5hbWU6IHN0ciwgbGluZTogaW50IHwgTm9uZSA9IE5vbmUpIC0+IFRvZG9Ob3RlIHwgTm9uZToKICAgIGlmIG5hbWUgaW4gRElTUEFUQ0hFUl9SRU5BTUU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBUb2RvTm90ZSgKICAgICAgICAidW5yZWNvZ25pemVkX2Rpc3BhdGNoZXIiLAogICAgICAgIGYidW5yZWNvZ25pemVkIG9sZCBkaXNwYXRjaGVyICd7bmFtZX0nIC0gbm8gY29uZmlkZW50IHJlbmFtZSwgY29udmVydCBtYW51YWxseSIsCiAgICAgICAgbGluZSwKICAgICkKCgpkZWYgY2hlY2tfYmluZF9mbGFnKGZsYWc6IHN0ciwgbGluZTogaW50IHwgTm9uZSA9IE5vbmUpIC0+IFRvZG9Ob3RlIHwgTm9uZToKICAgIGlmIGZsYWcgaW4gQklORF9GTEFHX1JFTkFNRToKICAgICAgICByZXR1cm4gTm9uZQogICAgaWYgZmxhZyBpbiBTSEFQRV9DSEFOR0lOR19CSU5EX0ZMQUdTOgogICAgICAgIHJldHVybiBUb2RvTm90ZSgKICAgICAgICAgICAgInVuc3VwcG9ydGVkX2JpbmRfZmxhZyIsCiAgICAgICAgICAgIGYiYmluZCBmbGFnICd7ZmxhZ30nICh7U0hBUEVfQ0hBTkdJTkdfQklORF9GTEFHU1tmbGFnXX0pIGNoYW5nZXMgdGhlICIKICAgICAgICAgICAgZiJiaW5kJ3Mgc2hhcGUgLSBub3QgYXV0by1jb252ZXJ0ZWQsIGNvbnZlcnQgbWFudWFsbHkiLAogICAgICAgICAgICBsaW5lLAogICAgICAgICkKICAgIHJldHVybiBUb2RvTm90ZSgKICAgICAgICAidW5rbm93bl9iaW5kX2ZsYWciLAogICAgICAgIGYidW5rbm93biBiaW5kIGZsYWcgJ3tmbGFnfScgLSBub3QgYSByZWNvZ25pemVkIGh5cHJsYW5nIGZsYWcsIGNvbnZlcnQgbWFudWFsbHkiLAogICAgICAgIGxpbmUsCiAgICApCgoKZGVmIGNoZWNrX3NvdXJjZV9kaXJlY3RpdmUocGF0aDogc3RyLCBsaW5lOiBpbnQgfCBOb25lID0gTm9uZSkgLT4gVG9kb05vdGU6CiAgICByZXR1cm4gVG9kb05vdGUoCiAgICAgICAgInNvdXJjZV9kaXJlY3RpdmUiLAogICAgICAgIGYic291cmNlID0ge3BhdGh9IC0gc291cmNlZCBmaWxlcyBhcmVuJ3QgaW5saW5lZCBieSB0aGUgY29udmVydGVyLCAiCiAgICAgICAgZiJjb252ZXJ0IGFuZCBpbmNsdWRlIHRoYXQgZmlsZSBzZXBhcmF0ZWx5IiwKICAgICAgICBsaW5lLAogICAgKQoKCmRlZiByZW5kZXJfcHJvZ3JhbShpdGVtcykgLT4gc3RyOgogICAgIiIiYGl0ZW1zYCBpcyBhbiBpdGVyYWJsZSBvZiAobm9kZV9vcl9ub25lLCBub3RlX29yX25vbmUpIHBhaXJzLiBBIG5vdGUKICAgIHJlbmRlcnMgYXMgYSBjb21tZW50IGxpbmU7IGEgbm9kZSByZW5kZXJzIGFzIGl0cyBvd24gc3RhdGVtZW50LiBCb3RoCiAgICBtYXkgYmUgcHJlc2VudCAoYSBiZXN0LWVmZm9ydCBzdGF0ZW1lbnQgc3RpbGwgZmxhZ2dlZCBmb3IgcmV2aWV3KSwgb3IKICAgIGp1c3Qgb25lLiIiIgogICAgbGluZXM6IGxpc3Rbc3RyXSA9IFtdCiAgICBmb3Igbm9kZSwgbm90ZSBpbiBpdGVtczoKICAgICAgICBpZiBub3RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZm9ybWF0X3RvZG8obm90ZSkpCiAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKHRvX3NvdXJjZShjaHVuayhbbm9kZV0pKSkKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpCg==", "hyprvalidate/converter/mapper.py": "IiIiU2NoZW1hLWRyaXZlbiBtYXBwZXI6IGh5cHJsYW5nIEFTVCAtPiBMdWEgc291cmNlLgoKVGllcyB0b2dldGhlciBkaXNwYXRjaC5weSwgY29lcmNlLnB5LCByZW5hbWUucHksIGFuZCB0b2RvLnB5IGludG8KYGNvbnZlcnQoc2NoZW1hLCBoeXBybGFuZ19maWxlKSAtPiBzdHJgLgoKU2NvcGUsIHN0YXRlZCBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGxlZnQgaW1wbGljaXQ6IHRoaXMgbWFwcyB0aGUKY29uc3RydWN0cyB0aGUgcHJvamVjdCdzIG93biByZWFsIGh5cHJsYW5kLmNvbmYgYWN0dWFsbHkgdXNlcyAoY29uZmlnCnNlY3Rpb25zLCBkZXZpY2UgYmxvY2tzLCBnZXN0dXJlL21vbml0b3IgZGlyZWN0aXZlcywgdGhlIGJpbmQgZmFtaWx5LCBleGVjLwpleGl0L3N1Ym1hcC9nbG9iYWwgZGlzcGF0Y2hlcnMsIHdpbmRvdyBydWxlcywgc291cmNlKS4gRGlzcGF0Y2hlciBhbmQKZGlyZWN0aXZlIHNoYXBlcyBub3QgZXhlcmNpc2VkIGJ5IHRoYXQgZmlsZSAoZS5nLiBgcGVybWlzc2lvbmAsIG1vc3QKYGxheWVycnVsZWAvYHdvcmtzcGFjZV9ydWxlYCBmb3JtcywgYGZ1bGxzY3JlZW5gIHdpdGggYW4gZXhwbGljaXQgbW9kZSkgYXJlCm5vdCBtb2RlbGVkIGhlcmUgLSBhbnl0aGluZyB0aGUgbWFwcGVyIGRvZXNuJ3QgcmVjb2duaXplIGJlY29tZXMgYQpsb3ctY29uZmlkZW5jZSBUT0RPIChzZWUgdG9kby5weSksIG5ldmVyIGEgZ3Vlc3MuCgpUd28gYXJndW1lbnQtc2hhcGUgZmFjdHMgY2FtZSBmcm9tIHJlYWRpbmcgSHlwcmxhbmQncyBhY3R1YWwgY3VycmVudApkaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5IChMdWFCaW5kaW5nc0Rpc3BhdGNoZXJzLmNwcCksIG5vdApndWVzc2VkOgogIC0gYGhsLmRzcC5mb2N1cyh7ZGlyZWN0aW9uID0gLi4ufSlgIHJlcGxhY2VzIGJvdGggb2xkIGBtb3ZlZm9jdXNgIChhCiAgICBkaXJlY3Rpb24gbGV0dGVyL3dvcmQpIGFuZCBvbGQgYHdvcmtzcGFjZWAgKGEgd29ya3NwYWNlIHNlbGVjdG9yLCB2aWEKICAgIGB7d29ya3NwYWNlID0gLi4ufWApIC0gYm90aCBnbyB0aHJvdWdoIHRoZSBzYW1lIGVudHJ5IHBvaW50LAogICAgZGlzdGluZ3Vpc2hlZCBvbmx5IGJ5IHdoaWNoIHRhYmxlIGtleSBpcyBzZXQuCiAgLSBvbGQgYG1vdmV3aW5kb3dgL2ByZXNpemV3aW5kb3dgIHVzZWQgdmlhIGBiaW5kbWAgKGEgbW91c2UgYmluZCB3aXRoIG5vCiAgICBkaXNwYXRjaGVyIHBhcmFtcykgbWFwIHRvIGBobC5kc3Aud2luZG93LmRyYWcoKWAvYHJlc2l6ZSgpYCBzcGVjaWZpY2FsbHkKICAgIC0gTk9UIGBobC5kc3Aud2luZG93Lm1vdmUoKWAgLSBiZWNhdXNlIGEgYmluZG0gbW91c2UtZHJhZyBiaW5kIGhhcyBhCiAgICAgIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHNoYXBlIGZyb20gYSBrZXlib2FyZCBkaXJlY3Rpb24gYmluZCwgZXZlbgogICAgICB0aG91Z2ggYm90aCBkaXNwYXRjaGVycyBzaGFyZSB0aGUgb2xkIG5hbWUgYG1vdmV3aW5kb3dgLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSAuLmh5cHJsYW5nLnBhcnNlciBpbXBvcnQgQmxvY2ssIERpcmVjdGl2ZSwgSHlwcmxhbmdGaWxlLCBWYXJpYWJsZUFzc2lnbiwgV2luZG93UnVsZQpmcm9tIC4ubHVhYXN0LndyaXRlciBpbXBvcnQgYW5vbl9mdW5jdGlvbiwgaGxjYWxsCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwoKZnJvbSAuLmNoZWNrZXIgaW1wb3J0IF9oYXNfdGFibGVfYWx0ZXJuYXRpdmUsIF9zY2FsYXJfa2luZF9tYXRjaGVzCmZyb20gLmNvZXJjZSBpbXBvcnQgY29lcmNlX3ZhbHVlCmZyb20gLmRpc3BhdGNoIGltcG9ydCBjbGFzc2lmeV9ibG9jawpmcm9tIC5yZW5hbWUgaW1wb3J0IEJJTkRfRkxBR19SRU5BTUUsIERJU1BBVENIRVJfUkVOQU1FCmZyb20gLnRvZG8gaW1wb3J0IFRvZG9Ob3RlLCBjaGVja19iaW5kX2ZsYWcsIGNoZWNrX2Rpc3BhdGNoZXIsIGNoZWNrX3NvdXJjZV9kaXJlY3RpdmUsIHJlbmRlcl9wcm9ncmFtCgojIE1vZHVsZSBuYW1lcyBmb3IgLS1zcGxpdCBvdXRwdXQuIENob3NlbiB0byBtYXRjaCB0aGUgaGFuZC1taWdyYXRpb24gdGhhdAojIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHByb2plY3QncyBvd24gY29uZmlnIChjb25maWdzL2h5cHJsYW5kLWx1YS8qLmx1YSksCiMgd2hpY2ggaXMgdGhlIG9ubHkgd29ya2VkIGV4YW1wbGUgb2YgImNvcnJlY3RseSBtb2R1bGFyaXplZCIgYXZhaWxhYmxlLgpNX0VOVFJZID0gImh5cHJsYW5kIiAgICAgICAgIyB0aGUgcmVxdWlyZSgpLWluZyBlbnRyeSBwb2ludApNX1BMVUdJTlMgPSAicGx1Z2lucyIKTV9NT05JVE9SUyA9ICJtb25pdG9ycyIKTV9ERVZJQ0VTID0gImRldmljZXMiCk1fQVVUT1NUQVJUID0gImF1dG9zdGFydCIKTV9FTlYgPSAiZW52IgpNX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zIgpNX0FQUEVBUkFOQ0UgPSAiYXBwZWFyYW5jZSIKTV9JTlBVVCA9ICJpbnB1dCIKTV9LRVlCSU5EUyA9ICJrZXliaW5kcyIKTV9XSU5ET1dSVUxFUyA9ICJ3aW5kb3dydWxlcyIKTV9PVEhFUiA9ICJvdGhlciIKCiMgaHlwcmxhbmcgZGlyZWN0aXZlIGtleSAtPiBtb2R1bGUuIGBiaW5kKmAgaXMgaGFuZGxlZCBieSBwcmVmaXgsIG5vdCBoZXJlLgpfRElSRUNUSVZFX01PRFVMRSA9IHsKICAgICJtb25pdG9yIjogTV9NT05JVE9SUywKICAgICJnZXN0dXJlIjogTV9JTlBVVCwKICAgICJleGVjLW9uY2UiOiBNX0FVVE9TVEFSVCwKICAgICJleGVjIjogTV9BVVRPU1RBUlQsCiAgICAiZW52IjogTV9FTlYsCiAgICAiZW52ZCI6IE1fRU5WLAogICAgInBlcm1pc3Npb24iOiBNX1BFUk1JU1NJT05TLAogICAgIndpbmRvd3J1bGUiOiBNX1dJTkRPV1JVTEVTLAogICAgIndpbmRvd3J1bGV2MiI6IE1fV0lORE9XUlVMRVMsCiAgICAibGF5ZXJydWxlIjogImxheWVycnVsZXMiLAogICAgIndvcmtzcGFjZSI6ICJ3b3Jrc3BhY2VydWxlcyIsCiAgICAic291cmNlIjogTV9FTlRSWSwKfQoKIyBoeXBybGFuZyBjb25maWctc2VjdGlvbiBuYW1lIC0+IG1vZHVsZSwgZm9yIHRoZSBzZWN0aW9ucyB3aGVyZSBncm91cGluZwojIHNldmVyYWwgdW5kZXIgb25lIGZpbGUgbWF0Y2hlcyBob3cgcGVvcGxlIGFjdHVhbGx5IHRoaW5rIGFib3V0IHRoZW0KIyAoZXZlcnl0aGluZyB2aXN1YWwgdG9nZXRoZXIsIGV0YykuIEFueSBzZWN0aW9uIE5PVCBsaXN0ZWQgaGVyZSBnZXRzIGl0cwojIG93biBmaWxlIG5hbWVkIGFmdGVyIHRoZSBzZWN0aW9uIC0gZGV0ZXJtaW5pc3RpYywgYW5kIGF2b2lkcyBpbnZlbnRpbmcgYQojIHRheG9ub215IGZvciBzZWN0aW9ucyB0aGlzIHByb2plY3QgaGFzIG5vIHdvcmtlZCBleGFtcGxlIG9mLgpfQ09ORklHX1NFQ1RJT05fTU9EVUxFID0gewogICAgImdlbmVyYWwiOiBNX0FQUEVBUkFOQ0UsCiAgICAiZGVjb3JhdGlvbiI6IE1fQVBQRUFSQU5DRSwKICAgICJhbmltYXRpb25zIjogTV9BUFBFQVJBTkNFLAogICAgIm1hc3RlciI6IE1fQVBQRUFSQU5DRSwKICAgICJkd2luZGxlIjogTV9BUFBFQVJBTkNFLAogICAgIm1pc2MiOiBNX0FQUEVBUkFOQ0UsCiAgICAiZ3JvdXAiOiBNX0FQUEVBUkFOQ0UsCiAgICAiY3Vyc29yIjogTV9BUFBFQVJBTkNFLAogICAgImlucHV0IjogTV9JTlBVVCwKICAgICJnZXN0dXJlcyI6IE1fSU5QVVQsCiAgICAiYmluZHMiOiBNX0tFWUJJTkRTLAogICAgImVjb3N5c3RlbSI6IE1fUEVSTUlTU0lPTlMsCiAgICAicGx1Z2luIjogTV9QTFVHSU5TLAp9CgojIEEgYmxvY2sgdGhhdCBiZWNvbWVzIGEgdG9wLWxldmVsIGhsLlgoc3BlYykgY2FsbCAocGVyIGRpc3BhdGNoLnB5KSAtPiBtb2R1bGUuCl9TUEVDX0JMT0NLX01PRFVMRSA9IHsKICAgICJkZXZpY2UiOiBNX0RFVklDRVMsCiAgICAibW9uaXRvciI6IE1fTU9OSVRPUlMsCiAgICAiZ2VzdHVyZSI6IE1fSU5QVVQsCiAgICAicGVybWlzc2lvbiI6IE1fUEVSTUlTU0lPTlMsCiAgICAid2luZG93X3J1bGUiOiBNX1dJTkRPV1JVTEVTLAogICAgImxheWVyX3J1bGUiOiAibGF5ZXJydWxlcyIsCiAgICAid29ya3NwYWNlX3J1bGUiOiAid29ya3NwYWNlcnVsZXMiLAp9CgoKQGRhdGFjbGFzcwpjbGFzcyBDb252ZXJ0ZWRJdGVtOgogICAgIiIiT25lIGVtaXR0ZWQgc3RhdGVtZW50LCB0YWdnZWQgZm9yIG1vZHVsZSBhc3NpZ25tZW50LiBgbGluZWAgaXMgdGhlCiAgICBvcmlnaW5hbCBoeXBybGFuZyBzb3VyY2UgbGluZSwgdXNlZCB0byBvcmRlciBtb2R1bGVzIGluIHRoZSBlbnRyeSBmaWxlCiAgICBzbyB0aGUgb3V0cHV0IHJlYWRzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBpbnB1dCBkaWQuIiIiCiAgICBub2RlOiBvYmplY3QgfCBOb25lCiAgICBub3RlOiBUb2RvTm90ZSB8IE5vbmUKICAgIG1vZHVsZTogc3RyCiAgICBsaW5lOiBpbnQgfCBOb25lCgoKZGVmIF9kaXJlY3RpdmVfbW9kdWxlKGtleTogc3RyKSAtPiBzdHI6CiAgICBpZiBrZXkuc3RhcnRzd2l0aCgiYmluZCIpOgogICAgICAgIHJldHVybiBNX0tFWUJJTkRTCiAgICByZXR1cm4gX0RJUkVDVElWRV9NT0RVTEUuZ2V0KGtleSwgTV9PVEhFUikKCgpkZWYgX2NvbmZpZ19zZWN0aW9uX21vZHVsZShzZWN0aW9uOiBzdHIpIC0+IHN0cjoKICAgIHJldHVybiBfQ09ORklHX1NFQ1RJT05fTU9EVUxFLmdldChzZWN0aW9uLCBzZWN0aW9uKQoKCmRlZiBfc3BlY19ibG9ja19tb2R1bGUoYmxvY2tfbmFtZTogc3RyKSAtPiBzdHI6CiAgICByZXR1cm4gX1NQRUNfQkxPQ0tfTU9EVUxFLmdldChibG9ja19uYW1lLCBibG9ja19uYW1lKQoKCmRlZiBfY29lcmNlX29yX25vdGUodHlwZV9leHByOiBzdHIsIHJhdzogc3RyLCBub3RlczogbGlzdFtUb2RvTm90ZV0sIGtleV9uYW1lOiBzdHIsIGxpbmU6IGludCB8IE5vbmUpOgogICAgIiIiV3JhcHMgY29lcmNlX3ZhbHVlIHdpdGggdGhlIHNhbWUgc2VsZi1jaGVjayB0aGUgQ0xJIHJlcXVpcmVzIG9mIHRoZQogICAgd2hvbGUgY29udmVydGVyOiBpZiB0aGUgcmF3IHZhbHVlIGNhbid0IGJlIGNvbmZpZGVudGx5IGNvZXJjZWQgQU5EIGEKICAgIHBsYWluIHN0cmluZyB3b3VsZG4ndCBzYXRpc2Z5IHRoZSBzY2hlbWEgdHlwZSBlaXRoZXIsIHRoYXQncyBhIHJlYWwKICAgIG1pc21hdGNoIChlLmcuIHRoZSByZWFsIGNvbmZpZydzIG93biBqb2tlIHZhbHVlLAogICAgYGFuaW1hdGlvbnMgeyBlbmFibGVkID0geWVzLCBwbGVhc2UgOikgfWAsIGlzbid0IGEgdmFsaWQgYm9vbGVhbikgLQogICAgZmxhZyBpdCBpbnN0ZWFkIG9mIHNpbGVudGx5IGVtaXR0aW5nIGEgdmFsdWUgdGhlIHZhbGlkYXRvciB3b3VsZCBmbGFnLiIiIgogICAgdmFsdWUsIG1hdGNoZWQgPSBjb2VyY2VfdmFsdWUodHlwZV9leHByLCByYXcpCiAgICBpZiBub3QgbWF0Y2hlZCBhbmQgbm90IF9zY2FsYXJfa2luZF9tYXRjaGVzKCJzdHJpbmciLCB0eXBlX2V4cHIpIGFuZCBub3QgX2hhc190YWJsZV9hbHRlcm5hdGl2ZSh0eXBlX2V4cHIpOgogICAgICAgIG5vdGVzLmFwcGVuZChUb2RvTm90ZSgKICAgICAgICAgICAgInZhbHVlX3R5cGVfbWlzbWF0Y2giLAogICAgICAgICAgICBmIid7a2V5X25hbWV9JyA9ICd7cmF3fScgZG9lc24ndCBjb25maWRlbnRseSBtYXRjaCBpdHMgZXhwZWN0ZWQgdHlwZSAoe3R5cGVfZXhwcn0pIiwKICAgICAgICAgICAgbGluZSwKICAgICAgICApKQogICAgcmV0dXJuIHZhbHVlCgoKZGVmIF9iZXN0X2VmZm9ydF9zY2FsYXIocmF3OiBzdHIpOgogICAgbG93ZXJlZCA9IHJhdy5zdHJpcCgpLmxvd2VyKCkKICAgIGlmIGxvd2VyZWQgPT0gInRydWUiOgogICAgICAgIHJldHVybiBUcnVlCiAgICBpZiBsb3dlcmVkID09ICJmYWxzZSI6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gcmF3CgoKZGVmIF9idWlsZF9rZXlzX3N0cmluZyhtb2RzOiBzdHIsIGtleXN5bTogc3RyKSAtPiBzdHI6CiAgICBwYXJ0cyA9IFttIGZvciBtIGluIG1vZHMuc3BsaXQoKSBpZiBtXSBpZiBtb2RzIGVsc2UgW10KICAgIHBhcnRzLmFwcGVuZChrZXlzeW0pCiAgICByZXR1cm4gIiArICIuam9pbihwYXJ0cykKCgpkZWYgX2J1aWxkX2Rpc3BhdGNoZXJfY2FsbChuYW1lOiBzdHIsIHJlc3Q6IGxpc3Rbc3RyXSwgbGluZTogaW50IHwgTm9uZSk6CiAgICAiIiJSZXR1cm5zIChub2RlX29yX25vbmUsIG5vdGVfb3Jfbm9uZSkgZm9yIGEgZGlzcGF0Y2hlciBjYWxsIGJ1aWx0IGZyb20KICAgIGl0cyBvbGQgbmFtZSBhbmQgcmVtYWluaW5nIChhbHJlYWR5IGNvbW1hLXNwbGl0KSBhcmdzLiIiIgogICAgaWYgbmFtZSBub3QgaW4gRElTUEFUQ0hFUl9SRU5BTUU6CiAgICAgICAgcmV0dXJuIE5vbmUsIGNoZWNrX2Rpc3BhdGNoZXIobmFtZSwgbGluZSkKCiAgICB0YXJnZXQgPSBESVNQQVRDSEVSX1JFTkFNRVtuYW1lXQoKICAgIGlmIG5hbWUgaW4gKCJraWxsYWN0aXZlIiwgInRvZ2dsZWZsb2F0aW5nIiwgInBpbiIsICJleGl0Iik6CiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQpLCBOb25lCgogICAgaWYgbmFtZSA9PSAiZXhlYyI6CiAgICAgICAgaWYgbm90IHJlc3Q6CiAgICAgICAgICAgIHJldHVybiBOb25lLCBUb2RvTm90ZSgibWFsZm9ybWVkX2V4ZWMiLCAiZXhlYyBkaXNwYXRjaGVyIHdpdGggbm8gY29tbWFuZCIsIGxpbmUpCiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsICIsICIuam9pbihyZXN0KSksIE5vbmUKCiAgICBpZiBuYW1lIGluICgic3VibWFwIiwgImdsb2JhbCIpOgogICAgICAgIGlmIG5vdCByZXN0OgogICAgICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoZiJtYWxmb3JtZWRfe25hbWV9IiwgZiJ7bmFtZX0gZGlzcGF0Y2hlciB3aXRoIG5vIGFyZ3VtZW50IiwgbGluZSkKICAgICAgICByZXR1cm4gaGxjYWxsKHRhcmdldCwgcmVzdFswXSksIE5vbmUKCiAgICBpZiBuYW1lID09ICJtb3ZlZm9jdXMiOgogICAgICAgIGlmIG5vdCByZXN0OgogICAgICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoIm1hbGZvcm1lZF9tb3ZlZm9jdXMiLCAibW92ZWZvY3VzIHdpdGggbm8gZGlyZWN0aW9uIiwgbGluZSkKICAgICAgICByZXR1cm4gaGxjYWxsKHRhcmdldCwgeyJkaXJlY3Rpb24iOiByZXN0WzBdfSksIE5vbmUKCiAgICBpZiBuYW1lID09ICJ3b3Jrc3BhY2UiOgogICAgICAgIGlmIG5vdCByZXN0OgogICAgICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoIm1hbGZvcm1lZF93b3Jrc3BhY2UiLCAid29ya3NwYWNlIGRpc3BhdGNoZXIgd2l0aCBubyBpZCIsIGxpbmUpCiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHsid29ya3NwYWNlIjogcmVzdFswXX0pLCBOb25lCgogICAgaWYgbmFtZSBpbiAoIm1vdmV0b3dvcmtzcGFjZSIsICJtb3ZldG93b3Jrc3BhY2VzaWxlbnQiKToKICAgICAgICBpZiBub3QgcmVzdDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUsIFRvZG9Ob3RlKGYibWFsZm9ybWVkX3tuYW1lfSIsIGYie25hbWV9IHdpdGggbm8gd29ya3NwYWNlIiwgbGluZSkKICAgICAgICBmb2xsb3cgPSBuYW1lID09ICJtb3ZldG93b3Jrc3BhY2UiCiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHsid29ya3NwYWNlIjogcmVzdFswXSwgImZvbGxvdyI6IGZvbGxvd30pLCBOb25lCgogICAgaWYgbmFtZSA9PSAidG9nZ2xlc3BlY2lhbHdvcmtzcGFjZSI6CiAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHJlc3RbMF0gaWYgcmVzdCBlbHNlICIiKSwgTm9uZQoKICAgIGlmIG5hbWUgaW4gKCJtb3Zld2luZG93IiwgInJlc2l6ZXdpbmRvdyIpOgogICAgICAgICMgVGhlIGJpbmRtIChtb3VzZS1kcmFnKSB6ZXJvLWFyZyBjYXNlIGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlcgogICAgICAgICMgYmVmb3JlIHJlYWNoaW5nIGhlcmUgLSB0aGlzIGlzIHRoZSBrZXlib2FyZC1kaXJlY3Rpb24gZm9ybS4KICAgICAgICBpZiBsZW4ocmVzdCkgPT0gMToKICAgICAgICAgICAgcmV0dXJuIGhsY2FsbCh0YXJnZXQsIHsiZGlyZWN0aW9uIjogcmVzdFswXX0pLCBOb25lCiAgICAgICAgcmV0dXJuIE5vbmUsIFRvZG9Ob3RlKAogICAgICAgICAgICBmInVubW9kZWxlZF97bmFtZX1fc2hhcGUiLAogICAgICAgICAgICBmIntuYW1lfSB3aXRoIGFyZ3Mge3Jlc3Qhcn0gaXNuJ3QgYSBtb2RlbGVkIHNoYXBlIChvbmx5IGJhcmUgYmluZG0gb3IgYSBzaW5nbGUgZGlyZWN0aW9uIGFyZSkiLAogICAgICAgICAgICBsaW5lLAogICAgICAgICkKCiAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoInVubW9kZWxlZF9kaXNwYXRjaGVyIiwgZiIne25hbWV9JyBoYXMgbm8gbW9kZWxlZCBhcmd1bWVudCBzaGFwZSB5ZXQiLCBsaW5lKQoKCmRlZiBfY29tYmluZV9ub3Rlcyhub3RlczogbGlzdFtUb2RvTm90ZV0pIC0+IFRvZG9Ob3RlIHwgTm9uZToKICAgIGlmIG5vdCBub3RlczoKICAgICAgICByZXR1cm4gTm9uZQogICAgcmV0dXJuIFRvZG9Ob3RlKG5vdGVzWzBdLnJlYXNvbiwgIjsgIi5qb2luKG4uZGV0YWlsIGZvciBuIGluIG5vdGVzKSwgbm90ZXNbMF0ubGluZSkKCgpkZWYgX2J1aWxkX2JpbmQoZGlyZWN0aXZlOiBEaXJlY3RpdmUpIC0+IHR1cGxlOgogICAgZmxhZ3MgPSBkaXJlY3RpdmUua2V5W2xlbigiYmluZCIpOl0KICAgIGFyZ3MgPSBkaXJlY3RpdmUuYXJncwogICAgbGluZSA9IGRpcmVjdGl2ZS5saW5lCgogICAgaWYgbGVuKGFyZ3MpIDwgMzoKICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoIm1hbGZvcm1lZF9iaW5kIiwgZiJiaW5kIGRpcmVjdGl2ZSBoYXMgZmV3ZXIgdGhhbiAzIGZpZWxkczoge2FyZ3Mhcn0iLCBsaW5lKQoKICAgIG1vZHMsIGtleXN5bSwgZGlzcGF0Y2hlcl9uYW1lLCAqcmVzdCA9IGFyZ3MKICAgIGtleXNfc3RyID0gX2J1aWxkX2tleXNfc3RyaW5nKG1vZHMsIGtleXN5bSkKCiAgICBtb3VzZV9kcmFnX3NwZWNpYWxfY2FzZSA9ICgKICAgICAgICBmbGFncyA9PSAibSIgYW5kIGRpc3BhdGNoZXJfbmFtZSBpbiAoIm1vdmV3aW5kb3ciLCAicmVzaXpld2luZG93IikgYW5kIG5vdCByZXN0CiAgICApCiAgICBpZiBtb3VzZV9kcmFnX3NwZWNpYWxfY2FzZToKICAgICAgICB0YXJnZXQgPSAiaGwuZHNwLndpbmRvdy5kcmFnIiBpZiBkaXNwYXRjaGVyX25hbWUgPT0gIm1vdmV3aW5kb3ciIGVsc2UgImhsLmRzcC53aW5kb3cucmVzaXplIgogICAgICAgIGRpc3BhdGNoZXJfbm9kZSwgZGlzcGF0Y2hlcl9ub3RlID0gaGxjYWxsKHRhcmdldCksIE5vbmUKICAgIGVsc2U6CiAgICAgICAgZGlzcGF0Y2hlcl9ub2RlLCBkaXNwYXRjaGVyX25vdGUgPSBfYnVpbGRfZGlzcGF0Y2hlcl9jYWxsKGRpc3BhdGNoZXJfbmFtZSwgcmVzdCwgbGluZSkKCiAgICBpZiBkaXNwYXRjaGVyX25vZGUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZSwgZGlzcGF0Y2hlcl9ub3RlCgogICAgbm90ZXMgPSBbZGlzcGF0Y2hlcl9ub3RlXSBpZiBkaXNwYXRjaGVyX25vdGUgZWxzZSBbXQogICAgYmluZF9vcHRzID0ge30KICAgIGlmIG5vdCBtb3VzZV9kcmFnX3NwZWNpYWxfY2FzZToKICAgICAgICBmb3IgZiBpbiBmbGFnczoKICAgICAgICAgICAgbm90ZSA9IGNoZWNrX2JpbmRfZmxhZyhmLCBsaW5lKQogICAgICAgICAgICBpZiBub3RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbm90ZXMuYXBwZW5kKG5vdGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiaW5kX29wdHNbQklORF9GTEFHX1JFTkFNRVtmXV0gPSBUcnVlCgogICAgY2FsbF9hcmdzID0gW2tleXNfc3RyLCBkaXNwYXRjaGVyX25vZGVdCiAgICBpZiBiaW5kX29wdHM6CiAgICAgICAgY2FsbF9hcmdzLmFwcGVuZChiaW5kX29wdHMpCiAgICBiaW5kX2NhbGwgPSBobGNhbGwoImhsLmJpbmQiLCAqY2FsbF9hcmdzKQoKICAgIHJldHVybiBiaW5kX2NhbGwsIF9jb21iaW5lX25vdGVzKG5vdGVzKQoKCmRlZiBfc2V0X25lc3RlZChyZXN1bHQ6IGRpY3QsIGRvdHRlZF9rZXk6IHN0ciwgdmFsdWUpIC0+IE5vbmU6CiAgICAiIiJBIGh5cHJsYW5nIGtleSBjYW4gaXRzZWxmIGNvbnRhaW4gZG90cyAoYGNvbC5hY3RpdmVfYm9yZGVyID0gLi4uYAogICAgaXMgb25lIHJlYWwgZGlyZWN0aXZlIHdpdGggYSBsaXRlcmFsIGRvdCBpbiBpdHMgbmFtZSkgLSB0aGUgTHVhIHNjaGVtYQogICAgcmVwcmVzZW50cyB0aGF0IGFzIGEgbmVzdGVkIHRhYmxlIChgY29sID0geyBhY3RpdmVfYm9yZGVyID0gLi4uIH1gKSwKICAgIG5vdCBhIGZsYXQga2V5IHdpdGggYSBkb3QgaW4gaXQgKHdoaWNoIGFsc28gaXNuJ3QgYSB2YWxpZCBiYXJlIEx1YQogICAgaWRlbnRpZmllcikuIEZvdW5kIHJ1bm5pbmcgdGhlIGNvbnZlcnRlciBhZ2FpbnN0IHRoZSByZWFsIGNvbmZpZy4iIiIKICAgIHBhcnRzID0gZG90dGVkX2tleS5zcGxpdCgiLiIpCiAgICBub2RlID0gcmVzdWx0CiAgICBmb3IgcGFydCBpbiBwYXJ0c1s6LTFdOgogICAgICAgIG5vZGUgPSBub2RlLnNldGRlZmF1bHQocGFydCwge30pCiAgICBub2RlW3BhcnRzWy0xXV0gPSB2YWx1ZQoKCmRlZiBfZmxhdHRlbl9jb25maWdfYmxvY2soc2NoZW1hLCBibG9jazogQmxvY2ssIHByZWZpeDogc3RyLCBub3RlczogbGlzdFtUb2RvTm90ZV0pIC0+IGRpY3Q6CiAgICByZXN1bHQgPSB7fQogICAgZm9yIGQgaW4gYmxvY2suZGlyZWN0aXZlczoKICAgICAgICBrZXlfcGF0aCA9IGYie3ByZWZpeH0ue2Qua2V5fSIgaWYgcHJlZml4IGVsc2UgZC5rZXkKICAgICAgICB0eXBlX2V4cHIgPSBzY2hlbWEuY29uZmlnX3ZhbHVlX3R5cGVzLmdldChrZXlfcGF0aCkKICAgICAgICBpZiB0eXBlX2V4cHIgaXMgTm9uZToKICAgICAgICAgICAgbm90ZXMuYXBwZW5kKFRvZG9Ob3RlKAogICAgICAgICAgICAgICAgInVua25vd25fY29uZmlnX2tleSIsCiAgICAgICAgICAgICAgICBmIid7a2V5X3BhdGh9JyBpcyBub3QgYSBrbm93biBIeXBybGFuZCBjb25maWcga2V5IiwKICAgICAgICAgICAgICAgIGQubGluZSwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgY29udGludWUKICAgICAgICByYXcgPSBkLmFyZ3NbMF0gaWYgZC5hcmdzIGVsc2UgIiIKICAgICAgICB2YWx1ZSA9IF9jb2VyY2Vfb3Jfbm90ZSh0eXBlX2V4cHIsIHJhdywgbm90ZXMsIGtleV9wYXRoLCBkLmxpbmUpCiAgICAgICAgX3NldF9uZXN0ZWQocmVzdWx0LCBkLmtleSwgdmFsdWUpCiAgICBmb3Igc3ViIGluIGJsb2NrLmJsb2NrczoKICAgICAgICBzdWJfcGF0aCA9IGYie3ByZWZpeH0ue3N1Yi5uYW1lfSIgaWYgcHJlZml4IGVsc2Ugc3ViLm5hbWUKICAgICAgICBzdWJfcmVzdWx0ID0gX2ZsYXR0ZW5fY29uZmlnX2Jsb2NrKHNjaGVtYSwgc3ViLCBzdWJfcGF0aCwgbm90ZXMpCiAgICAgICAgIyBBIHN1Yi1ibG9jayB3aG9zZSBldmVyeSBrZXkgd2FzIFRPRE8nZCBvdXQgY29udHJpYnV0ZXMgbm90aGluZyBidXQKICAgICAgICAjIGFuIGVtcHR5IHRhYmxlLiBUaGUgbm90ZSBhbHJlYWR5IHJlY29yZHMgd2hhdCBjb3VsZG4ndCBiZQogICAgICAgICMgY29udmVydGVkLCBzbyBkb24ndCBhbHNvIGVtaXQgYHRvdWNocGFkID0ge31gLgogICAgICAgIGlmIHN1Yl9yZXN1bHQ6CiAgICAgICAgICAgIHJlc3VsdFtzdWIubmFtZV0gPSBzdWJfcmVzdWx0CiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9idWlsZF9zcGVjX2NhbGwoc2NoZW1hLCB0YXJnZXQ6IHN0ciwgY2xhc3NfbmFtZTogc3RyLCBibG9jazogQmxvY2ssIG5vdGVzOiBsaXN0W1RvZG9Ob3RlXSkgLT4gdHVwbGU6CiAgICBjbHMgPSBzY2hlbWEuY2xhc3Nlcy5nZXQoY2xhc3NfbmFtZSkKICAgIHNwZWMgPSB7fQogICAgZm9yIGQgaW4gYmxvY2suZGlyZWN0aXZlczoKICAgICAgICB0eXBlX2V4cHIgPSBjbHMuZmllbGRzLmdldChkLmtleSkgaWYgY2xzIGVsc2UgTm9uZQogICAgICAgIHJhdyA9IGQuYXJnc1swXSBpZiBkLmFyZ3MgZWxzZSAiIgogICAgICAgIGlmIHR5cGVfZXhwciBpcyBOb25lOgogICAgICAgICAgICBub3Rlcy5hcHBlbmQoVG9kb05vdGUoCiAgICAgICAgICAgICAgICAidW5rbm93bl9zcGVjX2ZpZWxkIiwKICAgICAgICAgICAgICAgIGYiJ3tkLmtleX0nIGlzIG5vdCBhIGZpZWxkIG9mIHtjbGFzc19uYW1lfSIsCiAgICAgICAgICAgICAgICBkLmxpbmUsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIHNwZWNbZC5rZXldID0gcmF3CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdmFsdWUgPSBfY29lcmNlX29yX25vdGUodHlwZV9leHByLCByYXcsIG5vdGVzLCBkLmtleSwgZC5saW5lKQogICAgICAgIHNwZWNbZC5rZXldID0gdmFsdWUKICAgIHJldHVybiBobGNhbGwodGFyZ2V0LCBzcGVjKSwgbm90ZXMKCgpkZWYgX2J1aWxkX3dpbmRvd19ydWxlKHJ1bGU6IFdpbmRvd1J1bGUpOgogICAgcGF5bG9hZCA9IHt9CiAgICBpZiAibmFtZSIgaW4gcnVsZS5wcm9wZXJ0aWVzOgogICAgICAgIHBheWxvYWRbIm5hbWUiXSA9IHJ1bGUucHJvcGVydGllc1sibmFtZSJdCiAgICBpZiBydWxlLm1hdGNoOgogICAgICAgIHBheWxvYWRbIm1hdGNoIl0gPSB7azogX2Jlc3RfZWZmb3J0X3NjYWxhcih2KSBmb3IgaywgdiBpbiBydWxlLm1hdGNoLml0ZW1zKCl9CiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBydWxlLnByb3BlcnRpZXMuaXRlbXMoKToKICAgICAgICBpZiBrZXkgPT0gIm5hbWUiOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHBheWxvYWRba2V5XSA9IF9iZXN0X2VmZm9ydF9zY2FsYXIodmFsdWUpCiAgICByZXR1cm4gaGxjYWxsKCJobC53aW5kb3dfcnVsZSIsIHBheWxvYWQpCgoKZGVmIF9idWlsZF9tb25pdG9yKGRpcmVjdGl2ZTogRGlyZWN0aXZlKToKICAgIGZpZWxkcyA9ICgib3V0cHV0IiwgIm1vZGUiLCAicG9zaXRpb24iLCAic2NhbGUiKQogICAgaWYgbGVuKGRpcmVjdGl2ZS5hcmdzKSAhPSBsZW4oZmllbGRzKToKICAgICAgICByZXR1cm4gTm9uZSwgVG9kb05vdGUoCiAgICAgICAgICAgICJ1bm1vZGVsZWRfbW9uaXRvcl9zaGFwZSIsCiAgICAgICAgICAgIGYibW9uaXRvciBkaXJlY3RpdmUgd2l0aCB7bGVuKGRpcmVjdGl2ZS5hcmdzKX0gZmllbGRzIGlzbid0IHRoZSBtb2RlbGVkICIKICAgICAgICAgICAgZiJvdXRwdXQsbW9kZSxwb3NpdGlvbixzY2FsZSBzaGFwZSIsCiAgICAgICAgICAgIGRpcmVjdGl2ZS5saW5lLAogICAgICAgICkKICAgIHNwZWMgPSBkaWN0KHppcChmaWVsZHMsIGRpcmVjdGl2ZS5hcmdzKSkKICAgIHJldHVybiBobGNhbGwoImhsLm1vbml0b3IiLCBzcGVjKSwgTm9uZQoKCmRlZiBfYnVpbGRfZ2VzdHVyZShkaXJlY3RpdmU6IERpcmVjdGl2ZSk6CiAgICBmaWVsZHMgPSAoImZpbmdlcnMiLCAiZGlyZWN0aW9uIiwgImFjdGlvbiIpCiAgICBpZiBsZW4oZGlyZWN0aXZlLmFyZ3MpIDwgbGVuKGZpZWxkcyk6CiAgICAgICAgcmV0dXJuIE5vbmUsIFRvZG9Ob3RlKAogICAgICAgICAgICAidW5tb2RlbGVkX2dlc3R1cmVfc2hhcGUiLAogICAgICAgICAgICBmImdlc3R1cmUgZGlyZWN0aXZlIHdpdGgge2xlbihkaXJlY3RpdmUuYXJncyl9IGZpZWxkcyBpc24ndCB0aGUgbW9kZWxlZCAiCiAgICAgICAgICAgIGYiZmluZ2VycyxkaXJlY3Rpb24sYWN0aW9uIHNoYXBlIiwKICAgICAgICAgICAgZGlyZWN0aXZlLmxpbmUsCiAgICAgICAgKQogICAgZmluZ2VycywgZGlyZWN0aW9uLCBhY3Rpb24gPSBkaXJlY3RpdmUuYXJnc1s6M10KICAgIHRyeToKICAgICAgICBmaW5nZXJzX3ZhbCA9IGludChmaW5nZXJzKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgZmluZ2Vyc192YWwgPSBmaW5nZXJzCiAgICBzcGVjID0geyJmaW5nZXJzIjogZmluZ2Vyc192YWwsICJkaXJlY3Rpb24iOiBkaXJlY3Rpb24sICJhY3Rpb24iOiBhY3Rpb259CiAgICByZXR1cm4gaGxjYWxsKCJobC5nZXN0dXJlIiwgc3BlYyksIE5vbmUKCgpkZWYgX2NvbnZlcnRfaXRlbXMoc2NoZW1hLCBoZjogSHlwcmxhbmdGaWxlKSAtPiBsaXN0W0NvbnZlcnRlZEl0ZW1dOgogICAgIiIiU2hhcmVkIGNvbnZlcnNpb24gcGFzcyBiZWhpbmQgYm90aCBgY29udmVydGAgKGZsYXQpIGFuZAogICAgYGNvbnZlcnRfc3BsaXRgIChtb2R1bGFyKS4gWWllbGRzIG9uZSBDb252ZXJ0ZWRJdGVtIHBlciBlbWl0dGVkCiAgICBzdGF0ZW1lbnQsIHRhZ2dlZCB3aXRoIGl0cyB0YXJnZXQgbW9kdWxlIGFuZCBvcmlnaW5hbCBzb3VyY2UgbGluZSwgaW4KICAgIHNvdXJjZSBvcmRlci4iIiIKICAgIGl0ZW1zOiBsaXN0W0NvbnZlcnRlZEl0ZW1dID0gW10KCiAgICAjIGV4ZWMtb25jZSBoYXMgbm8gZGlyZWN0IGNhbGwtc2hhcGVkIGVxdWl2YWxlbnQgLSB0aGUgaGFuZC1taWdyYXRpb24KICAgICMgdGhpcyBwcm9qZWN0IGFscmVhZHkgZGlkIChzZWUgY29uZmlncy9oeXBybGFuZC1sdWEvYXV0b3N0YXJ0Lmx1YSkKICAgICMgY29uc29saWRhdGVzIGV2ZXJ5IGV4ZWMtb25jZSBpbnRvIG9uZSBobC5vbigiaHlwcmxhbmQuc3RhcnQiLCBmbikKICAgICMgcmVnaXN0cmF0aW9uIHJhdGhlciB0aGFuIG9uZSBjYWxsIHBlciBsaW5lLCBzbyB0aGUgY29udmVydGVyIG1hdGNoZXMKICAgICMgdGhhdCBpbnN0ZWFkIG9mIGVtaXR0aW5nIE4gZHVwbGljYXRlIHJlZ2lzdHJhdGlvbnMuCiAgICBleGVjX29uY2VfY21kcyA9IFsKICAgICAgICBkLmFyZ3NbMF0gZm9yIGQgaW4gaGYuc3RhdGVtZW50cwogICAgICAgIGlmIGlzaW5zdGFuY2UoZCwgRGlyZWN0aXZlKSBhbmQgZC5rZXkgPT0gImV4ZWMtb25jZSIgYW5kIGQuYXJncwogICAgXQogICAgZXhlY19vbmNlX2VtaXR0ZWQgPSBGYWxzZQoKICAgIGZvciBzdG10IGluIGhmLnN0YXRlbWVudHM6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCBWYXJpYWJsZUFzc2lnbik6CiAgICAgICAgICAgIGNvbnRpbnVlICAjIGFscmVhZHkgaW5saW5lZCBieSB0aGUgaHlwcmxhbmcgcGFyc2VyCgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgV2luZG93UnVsZSk6CiAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChDb252ZXJ0ZWRJdGVtKF9idWlsZF93aW5kb3dfcnVsZShzdG10KSwgTm9uZSwgTV9XSU5ET1dSVUxFUywgc3RtdC5saW5lKSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCBEaXJlY3RpdmUpOgogICAgICAgICAgICBtb2R1bGUgPSBfZGlyZWN0aXZlX21vZHVsZShzdG10LmtleSkKICAgICAgICAgICAgaWYgc3RtdC5rZXkgPT0gInNvdXJjZSI6CiAgICAgICAgICAgICAgICBub3RlID0gY2hlY2tfc291cmNlX2RpcmVjdGl2ZShzdG10LmFyZ3NbMF0gaWYgc3RtdC5hcmdzIGVsc2UgIiIsIHN0bXQubGluZSkKICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChDb252ZXJ0ZWRJdGVtKE5vbmUsIG5vdGUsIE1fRU5UUlksIHN0bXQubGluZSkpCiAgICAgICAgICAgIGVsaWYgc3RtdC5rZXkgPT0gImV4ZWMtb25jZSI6CiAgICAgICAgICAgICAgICBpZiBub3QgZXhlY19vbmNlX2VtaXR0ZWQ6CiAgICAgICAgICAgICAgICAgICAgZXhlY19vbmNlX2VtaXR0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZm4gPSBhbm9uX2Z1bmN0aW9uKFtobGNhbGwoImhsLmV4ZWNfY21kIiwgY21kKSBmb3IgY21kIGluIGV4ZWNfb25jZV9jbWRzXSkKICAgICAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udmVydGVkSXRlbSgKICAgICAgICAgICAgICAgICAgICAgICAgaGxjYWxsKCJobC5vbiIsICJoeXBybGFuZC5zdGFydCIsIGZuKSwgTm9uZSwgbW9kdWxlLCBzdG10LmxpbmUKICAgICAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgIyBzdWJzZXF1ZW50IGV4ZWMtb25jZSBkaXJlY3RpdmVzIGFyZSBhbHJlYWR5IGZvbGRlZCBpbiBhYm92ZQogICAgICAgICAgICBlbGlmIHN0bXQua2V5ID09ICJlbnYiIGFuZCBsZW4oc3RtdC5hcmdzKSA9PSAyOgogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0oCiAgICAgICAgICAgICAgICAgICAgaGxjYWxsKCJobC5lbnYiLCBzdG10LmFyZ3NbMF0sIHN0bXQuYXJnc1sxXSksIE5vbmUsIG1vZHVsZSwgc3RtdC5saW5lCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICBlbGlmIHN0bXQua2V5LnN0YXJ0c3dpdGgoImJpbmQiKToKICAgICAgICAgICAgICAgIG5vZGUsIG5vdGUgPSBfYnVpbGRfYmluZChzdG10KQogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0obm9kZSwgbm90ZSwgbW9kdWxlLCBzdG10LmxpbmUpKQogICAgICAgICAgICBlbGlmIHN0bXQua2V5ID09ICJtb25pdG9yIjoKICAgICAgICAgICAgICAgIG5vZGUsIG5vdGUgPSBfYnVpbGRfbW9uaXRvcihzdG10KQogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0obm9kZSwgbm90ZSwgbW9kdWxlLCBzdG10LmxpbmUpKQogICAgICAgICAgICBlbGlmIHN0bXQua2V5ID09ICJnZXN0dXJlIjoKICAgICAgICAgICAgICAgIG5vZGUsIG5vdGUgPSBfYnVpbGRfZ2VzdHVyZShzdG10KQogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0obm9kZSwgbm90ZSwgbW9kdWxlLCBzdG10LmxpbmUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0oTm9uZSwgVG9kb05vdGUoCiAgICAgICAgICAgICAgICAgICAgInVubW9kZWxlZF9kaXJlY3RpdmUiLAogICAgICAgICAgICAgICAgICAgIGYiJ3tzdG10LmtleX0nIGlzbid0IGEgbW9kZWxlZCB0b3AtbGV2ZWwgZGlyZWN0aXZlIiwKICAgICAgICAgICAgICAgICAgICBzdG10LmxpbmUsCiAgICAgICAgICAgICAgICApLCBtb2R1bGUsIHN0bXQubGluZSkpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgQmxvY2spOgogICAgICAgICAgICBpZiBzdG10Lm5hbWUgPT0gInBsdWdpbiI6CiAgICAgICAgICAgICAgICAjIFBsdWdpbiBjb25maWcgaXMgZHluYW1pY2FsbHkgcmVnaXN0ZXJlZCBwZXItcGx1Z2luIGF0CiAgICAgICAgICAgICAgICAjIHJ1bnRpbWUgLSBzdHJ1Y3R1cmFsbHkgYWJzZW50IGZyb20gdGhlIHNjaGVtYSAoc2FtZSByb290CiAgICAgICAgICAgICAgICAjIGNhdXNlIGFzIEhMLlBsdWdpbk5hbWVzcGFjZSdzIGR5bmFtaWMgaW5kZXggc2lnbmF0dXJlLAogICAgICAgICAgICAgICAgIyBzZWUgY2hlY2tlci5weSkuIFRoZXJlJ3Mgbm90aGluZyB0byBmbGF0dGVuIGl0IGFnYWluc3QsCiAgICAgICAgICAgICAgICAjIGFuZCBpdHMgc3ViLWJsb2NrIG5hbWVzIChlLmcuICJkeW5hbWljLWN1cnNvcnMiKSBvZnRlbgogICAgICAgICAgICAgICAgIyBhcmVuJ3QgZXZlbiB2YWxpZCBMdWEgaWRlbnRpZmllcnMuIEZsYWcgZm9yIG1hbnVhbAogICAgICAgICAgICAgICAgIyBjb252ZXJzaW9uIHJhdGhlciB0aGFuIGVtaXR0aW5nIGVtcHR5L2ludmFsaWQgdGFibGVzLgogICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnZlcnRlZEl0ZW0oTm9uZSwgVG9kb05vdGUoCiAgICAgICAgICAgICAgICAgICAgInBsdWdpbl9jb25maWciLAogICAgICAgICAgICAgICAgICAgICJwbHVnaW4geyAuLi4gfSBjb25maWcgaXMgZHluYW1pY2FsbHkgcmVnaXN0ZXJlZCBwZXItcGx1Z2luIC0gIgogICAgICAgICAgICAgICAgICAgICJub3QgY29udmVydGVkIGF1dG9tYXRpY2FsbHksIGNvbnZlcnQgbWFudWFsbHkiLAogICAgICAgICAgICAgICAgICAgIHN0bXQubGluZSwKICAgICAgICAgICAgICAgICksIE1fUExVR0lOUywgc3RtdC5saW5lKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0YXJnZXQgPSBjbGFzc2lmeV9ibG9jayhzY2hlbWEsIHN0bXQubmFtZSkKICAgICAgICAgICAgbm90ZXM6IGxpc3RbVG9kb05vdGVdID0gW10KICAgICAgICAgICAgaWYgdGFyZ2V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY2xzX2ZpZWxkID0gc2NoZW1hLmNsYXNzZXNbIkhMLkFQSSJdLmZpZWxkc1tzdG10Lm5hbWVdCiAgICAgICAgICAgICAgICBmcm9tIC4uY2hlY2tlciBpbXBvcnQgcGFyc2VfZnVuX3NpZ25hdHVyZQogICAgICAgICAgICAgICAgc2lnID0gcGFyc2VfZnVuX3NpZ25hdHVyZShjbHNfZmllbGQpCiAgICAgICAgICAgICAgICBjbGFzc19uYW1lID0gbmV4dChwLnR5cGVfZXhwciBmb3IgcCBpbiBzaWcucGFyYW1zIGlmIHAudHlwZV9leHByIGluIHNjaGVtYS5jbGFzc2VzKQogICAgICAgICAgICAgICAgY2FsbCwgbm90ZXMgPSBfYnVpbGRfc3BlY19jYWxsKHNjaGVtYSwgdGFyZ2V0LCBjbGFzc19uYW1lLCBzdG10LCBub3RlcykKICAgICAgICAgICAgICAgIG1vZHVsZSA9IF9zcGVjX2Jsb2NrX21vZHVsZShzdG10Lm5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbm5lciA9IF9mbGF0dGVuX2NvbmZpZ19ibG9jayhzY2hlbWEsIHN0bXQsIHN0bXQubmFtZSwgbm90ZXMpCiAgICAgICAgICAgICAgICBtb2R1bGUgPSBfY29uZmlnX3NlY3Rpb25fbW9kdWxlKHN0bXQubmFtZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpbm5lcjoKICAgICAgICAgICAgICAgICAgICAjIE5vdGhpbmcgc3Vydml2ZWQgY29udmVyc2lvbiAtIGVpdGhlciB0aGUgc291cmNlIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgIyB3YXMgZW1wdHksIG9yIGV2ZXJ5IGtleSBpbiBpdCB3YXMgVE9ETydkIG91dC4gRW1pdHRpbmcKICAgICAgICAgICAgICAgICAgICAjIGBobC5jb25maWcoeyA8bmFtZT4gPSB7fSB9KWAgc2V0cyBub3RoaW5nLCBhbmQgd2hlbiB0aGUKICAgICAgICAgICAgICAgICAgICAjIGJsb2NrIG5hbWUgaXRzZWxmIGlzIHVucmVzb2x2YWJsZSAoZS5nLiBhIHBlci1kZXZpY2UKICAgICAgICAgICAgICAgICAgICAjIGBkZXZpY2U6Zm9vYCBibG9jaykgaXQncyBvdXRwdXQgdGhhdCBmYWlscyBvdXIgb3duCiAgICAgICAgICAgICAgICAgICAgIyBwb3N0LWNvbnZlcnQgY2hlY2tlci4gU2FtZSBjYWxsIGFzIHRoZSBwbHVnaW4gY2FzZQogICAgICAgICAgICAgICAgICAgICMgYWJvdmU6IGtlZXAgdGhlIG5vdGVzLCBkcm9wIHRoZSBkZWFkIHRhYmxlLgogICAgICAgICAgICAgICAgICAgIGlmIG5vdGVzOgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udmVydGVkSXRlbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIF9jb21iaW5lX25vdGVzKG5vdGVzKSwgbW9kdWxlLCBzdG10LmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgY2FsbCA9IGhsY2FsbCgiaGwuY29uZmlnIiwge3N0bXQubmFtZTogaW5uZXJ9KQogICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udmVydGVkSXRlbShjYWxsLCBfY29tYmluZV9ub3Rlcyhub3RlcyksIG1vZHVsZSwgc3RtdC5saW5lKSkKICAgICAgICAgICAgY29udGludWUKCiAgICByZXR1cm4gaXRlbXMKCgpkZWYgY29udmVydChzY2hlbWEsIGhmOiBIeXBybGFuZ0ZpbGUpIC0+IHN0cjoKICAgICIiIkNvbnZlcnRzIGEgcGFyc2VkIGh5cHJsYW5nIGZpbGUgKGh5cHJ2YWxpZGF0ZS5oeXBybGFuZy5wYXJzZXIgb3V0cHV0KQogICAgaW50byBMdWEgc291cmNlIHRleHQsIHVzaW5nIHRoZSBzY2hlbWEgdG8gZGVjaWRlIGRpc3BhdGNoL2NvZXJjaW9uLwogICAgdmFsaWRpdHkgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcuIEFueXRoaW5nIG5vdCBjb25maWRlbnRseSByZXNvbHZlZAogICAgYmVjb21lcyBhIGAtLSBUT0RPKGh5cHJ2YWxpZGF0ZSBjb252ZXJ0KTogLi4uYCBjb21tZW50IGluc3RlYWQgb2YKICAgIHNpbGVudGx5IHdyb25nIG91dHB1dC4iIiIKICAgIGl0ZW1zID0gX2NvbnZlcnRfaXRlbXMoc2NoZW1hLCBoZikKICAgIHJldHVybiByZW5kZXJfcHJvZ3JhbShbKGkubm9kZSwgaS5ub3RlKSBmb3IgaSBpbiBpdGVtc10pCgoKX0VOVFJZX0hFQURFUiA9ICIiIlwKLS0gR2VuZXJhdGVkIGJ5IGh5cHJ2YWxpZGF0ZSBjb252ZXJ0IC0tc3BsaXQuCi0tCi0tIERlcGxveW1lbnQgbm90ZTogcmVxdWlyZSgpIHJlc29sdmVzIG1vZHVsZXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeQotLSB0aGlzIGZpbGUgbGl2ZXMgaW4sIHNvIGNvcHkgZXZlcnkgLmx1YSBmaWxlIGhlcmUgZmxhdCBpbnRvCi0tIH4vLmNvbmZpZy9oeXByLyAodGhpcyBmaWxlIG11c3Qgc3RheSBuYW1lZCBoeXBybGFuZC5sdWEgdGhlcmUpLiBOZXN0aW5nCi0tIHRoZSBtb2R1bGVzIG9uZSBsZXZlbCBkZWVwZXIgbmVlZHMgZXh0cmEgcGFja2FnZS5wYXRoIHNldHVwLgotLQotLSBPcmRlciBiZWxvdyBmb2xsb3dzIHRoZSBvcmlnaW5hbCBjb25maWcncyBvd24gb3JkZXIuIEVhY2ggcmVxdWlyZSgpIHJ1bnMKLS0gaXRzIG1vZHVsZSBib2R5IGltbWVkaWF0ZWx5LCBzbyBzdGF0ZW1lbnRzIHRoYXQgZGVwZW5kIG9uIG9yZGVyIChyZXBlYXRlZAotLSBjb25maWcga2V5cywgZHVwbGljYXRlIGJpbmRzLCB3aW5kb3ctcnVsZSBwcmVjZWRlbmNlKSBrZWVwIHRoZSByZWxhdGl2ZQotLSBvcmRlciB0aGV5IGhhZCBpbiB0aGUgc291cmNlIGZpbGUuCiIiIgoKCmRlZiBjb252ZXJ0X3NwbGl0KHNjaGVtYSwgaGY6IEh5cHJsYW5nRmlsZSkgLT4gZGljdFtzdHIsIHN0cl06CiAgICAiIiJDb252ZXJ0IGludG8gYSBzZXQgb2YgbW9kdWxhciBmaWxlcyBpbnN0ZWFkIG9mIG9uZSBmbGF0IGZpbGUuCgogICAgUmV0dXJucyB7ZmlsZW5hbWU6IGx1YV9zb3VyY2V9LCBhbHdheXMgaW5jbHVkaW5nIHRoZSBgaHlwcmxhbmQubHVhYAogICAgZW50cnkgcG9pbnQgdGhhdCByZXF1aXJlKClzIHRoZSByZXN0LiBNb2R1bGVzIHdpdGggbm8gc3RhdGVtZW50cwogICAgcHJvZHVjZSBubyBmaWxlLgoKICAgIFdoeSBidWNrZXRpbmcgYnkgbW9kdWxlIGlzIHNhZmUgZGVzcGl0ZSByZW9yZGVyaW5nIHJlbGF0aXZlIHRvIHRoZQogICAgc291cmNlIGZpbGU6IHN0YXRlbWVudHMgYXJlIGdyb3VwZWQgYnkgc3Vic3lzdGVtLCBhbmQgd2l0aGluIGEgbW9kdWxlCiAgICBzb3VyY2Ugb3JkZXIgaXMgcHJlc2VydmVkIGV4YWN0bHkuIFRoZSB0aHJlZSB0aGluZ3MgaW4gaHlwcmxhbmcgd2hlcmUKICAgIG9yZGVyIGFjdHVhbGx5IGNhcnJpZXMgbWVhbmluZyAtIHJlcGVhdGVkIGNvbmZpZyBrZXlzIChsYXN0IHdyaXRlIHdpbnMsCiAgICBjb25maXJtZWQgYWdhaW5zdCBIeXBybGFuZCdzIG93biBobENvbmZpZyBpbXBsZW1lbnRhdGlvbiksIGR1cGxpY2F0ZQogICAgYmluZHMgb24gb25lIGtleSAoYWxsIGZpcmUsIGluIG9yZGVyKSwgYW5kIHdpbmRvdy1ydWxlIHByZWNlZGVuY2UgLSBhcmUKICAgIGVhY2ggY29uZmluZWQgdG8gYSBzaW5nbGUgbW9kdWxlIGJ5IHRoaXMgbWFwcGluZywgc28gdGhlaXIgcmVsYXRpdmUKICAgIG9yZGVyIHN1cnZpdmVzLiBDcm9zcy1tb2R1bGUgb3JkZXIgaXMgYmV0d2VlbiBpbmRlcGVuZGVudCBzdWJzeXN0ZW1zLgogICAgYHRlc3RzL3Rlc3RfY29udmVydGVyX3NwbGl0LnB5YCBhc3NlcnRzIGJvdGggaGFsdmVzIG9mIHRoYXQgY2xhaW0KICAgIG1lY2hhbmljYWxseSByYXRoZXIgdGhhbiB0cnVzdGluZyB0aGlzIGNvbW1lbnQuCiAgICAiIiIKICAgIGl0ZW1zID0gX2NvbnZlcnRfaXRlbXMoc2NoZW1hLCBoZikKCiAgICBidWNrZXRzOiBkaWN0W3N0ciwgbGlzdFtDb252ZXJ0ZWRJdGVtXV0gPSB7fQogICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgYnVja2V0cy5zZXRkZWZhdWx0KGl0ZW0ubW9kdWxlLCBbXSkuYXBwZW5kKGl0ZW0pCgogICAgZW50cnlfaXRlbXMgPSBidWNrZXRzLnBvcChNX0VOVFJZLCBbXSkKCiAgICAjIE1vZHVsZXMgYXBwZWFyIGluIHRoZSBlbnRyeSBmaWxlIGluIHRoZSBvcmRlciB0aGVpciBmaXJzdCBzdGF0ZW1lbnQKICAgICMgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGNvbmZpZywgc28gcmVhZGluZyB0b3AgdG8gYm90dG9tIG1hdGNoZXMgdGhlCiAgICAjIHNvdXJjZS4gVGllcyAoYW5kIG1pc3NpbmcgbGluZSBudW1iZXJzKSBmYWxsIGJhY2sgdG8gdGhlIG5hbWUgc28gdGhlCiAgICAjIG91dHB1dCBpcyBkZXRlcm1pbmlzdGljLgogICAgbW9kdWxlX29yZGVyID0gc29ydGVkKAogICAgICAgIGJ1Y2tldHMsIGtleT1sYW1iZGEgbTogKG1pbigoaS5saW5lIG9yIDApIGZvciBpIGluIGJ1Y2tldHNbbV0pLCBtKQogICAgKQoKICAgIGZpbGVzOiBkaWN0W3N0ciwgc3RyXSA9IHt9CiAgICBmb3IgbW9kdWxlIGluIG1vZHVsZV9vcmRlcjoKICAgICAgICBib2R5ID0gcmVuZGVyX3Byb2dyYW0oWyhpLm5vZGUsIGkubm90ZSkgZm9yIGkgaW4gYnVja2V0c1ttb2R1bGVdXSkKICAgICAgICBmaWxlc1tmInttb2R1bGV9Lmx1YSJdID0gYm9keS5yc3RyaXAoIlxuIikgKyAiXG4iCgogICAgZW50cnlfcGFydHMgPSBbX0VOVFJZX0hFQURFUl0KICAgIGlmIGVudHJ5X2l0ZW1zOgogICAgICAgIGVudHJ5X3BhcnRzLmFwcGVuZCgKICAgICAgICAgICAgcmVuZGVyX3Byb2dyYW0oWyhpLm5vZGUsIGkubm90ZSkgZm9yIGkgaW4gZW50cnlfaXRlbXNdKS5yc3RyaXAoIlxuIikgKyAiXG4iCiAgICAgICAgKQogICAgZW50cnlfcGFydHMuYXBwZW5kKAogICAgICAgICJcbiIuam9pbihmJ3JlcXVpcmUoInttfSIpJyBmb3IgbSBpbiBtb2R1bGVfb3JkZXIpICsgIlxuIiBpZiBtb2R1bGVfb3JkZXIgZWxzZSAiIgogICAgKQogICAgZmlsZXNbZiJ7TV9FTlRSWX0ubHVhIl0gPSAiXG4iLmpvaW4ocCBmb3IgcCBpbiBlbnRyeV9wYXJ0cyBpZiBwKQoKICAgIHJldHVybiBmaWxlcwo="}; export const SCHEMA_JSON_B64 = "ewogICJhbGlhc2VzIjogewogICAgIkhMLkNvbmZpZ0tleSI6IHsKICAgICAgImxpdGVyYWxzIjogWwogICAgICAgICJhbmltYXRpb25zLmVuYWJsZWQiLAogICAgICAgICJhbmltYXRpb25zLndvcmtzcGFjZV93cmFwYXJvdW5kIiwKICAgICAgICAiYmluZHMuYWxsb3dfcGluX2Z1bGxzY3JlZW4iLAogICAgICAgICJiaW5kcy5hbGxvd193b3Jrc3BhY2VfY3ljbGVzIiwKICAgICAgICAiYmluZHMuZGlzYWJsZV9rZXliaW5kX2dyYWJiaW5nIiwKICAgICAgICAiYmluZHMuZHJhZ190aHJlc2hvbGQiLAogICAgICAgICJiaW5kcy5mb2N1c19wcmVmZXJyZWRfbWV0aG9kIiwKICAgICAgICAiYmluZHMuaGlkZV9zcGVjaWFsX29uX3dvcmtzcGFjZV9jaGFuZ2UiLAogICAgICAgICJiaW5kcy5pZ25vcmVfZ3JvdXBfbG9jayIsCiAgICAgICAgImJpbmRzLm1vdmVmb2N1c19jeWNsZXNfZnVsbHNjcmVlbiIsCiAgICAgICAgImJpbmRzLm1vdmVmb2N1c19jeWNsZXNfZ3JvdXBmaXJzdCIsCiAgICAgICAgImJpbmRzLnBhc3NfbW91c2Vfd2hlbl9ib3VuZCIsCiAgICAgICAgImJpbmRzLnNjcm9sbF9ldmVudF9kZWxheSIsCiAgICAgICAgImJpbmRzLndpbmRvd19kaXJlY3Rpb25fbW9uaXRvcl9mYWxsYmFjayIsCiAgICAgICAgImJpbmRzLndvcmtzcGFjZV9iYWNrX2FuZF9mb3J0aCIsCiAgICAgICAgImJpbmRzLndvcmtzcGFjZV9jZW50ZXJfb24iLAogICAgICAgICJjdXJzb3IuZGVmYXVsdF9tb25pdG9yIiwKICAgICAgICAiY3Vyc29yLmVuYWJsZV9oeXByY3Vyc29yIiwKICAgICAgICAiY3Vyc29yLmhpZGVfb25fa2V5X3ByZXNzIiwKICAgICAgICAiY3Vyc29yLmhpZGVfb25fdGFibGV0IiwKICAgICAgICAiY3Vyc29yLmhpZGVfb25fdG91Y2giLAogICAgICAgICJjdXJzb3IuaG90c3BvdF9wYWRkaW5nIiwKICAgICAgICAiY3Vyc29yLmluYWN0aXZlX3RpbWVvdXQiLAogICAgICAgICJjdXJzb3IuaW52aXNpYmxlIiwKICAgICAgICAiY3Vyc29yLm1pbl9yZWZyZXNoX3JhdGUiLAogICAgICAgICJjdXJzb3Iubm9fYnJlYWtfZnNfdnJyIiwKICAgICAgICAiY3Vyc29yLm5vX2hhcmR3YXJlX2N1cnNvcnMiLAogICAgICAgICJjdXJzb3Iubm9fd2FycHMiLAogICAgICAgICJjdXJzb3IucGVyc2lzdGVudF93YXJwcyIsCiAgICAgICAgImN1cnNvci5zeW5jX2dzZXR0aW5nc190aGVtZSIsCiAgICAgICAgImN1cnNvci51c2VfY3B1X2J1ZmZlciIsCiAgICAgICAgImN1cnNvci53YXJwX2JhY2tfYWZ0ZXJfbm9uX21vdXNlX2lucHV0IiwKICAgICAgICAiY3Vyc29yLndhcnBfb25fY2hhbmdlX3dvcmtzcGFjZSIsCiAgICAgICAgImN1cnNvci53YXJwX29uX3RvZ2dsZV9zcGVjaWFsIiwKICAgICAgICAiY3Vyc29yLnpvb21fZGV0YWNoZWRfY2FtZXJhIiwKICAgICAgICAiY3Vyc29yLnpvb21fZGlzYWJsZV9hYSIsCiAgICAgICAgImN1cnNvci56b29tX2ZhY3RvciIsCiAgICAgICAgImN1cnNvci56b29tX3JpZ2lkIiwKICAgICAgICAiZGVidWcuY29sb3JlZF9zdGRvdXRfbG9ncyIsCiAgICAgICAgImRlYnVnLmRhbWFnZV9ibGluayIsCiAgICAgICAgImRlYnVnLmRhbWFnZV90cmFja2luZyIsCiAgICAgICAgImRlYnVnLmRpc2FibGVfbG9ncyIsCiAgICAgICAgImRlYnVnLmRpc2FibGVfc2NhbGVfY2hlY2tzIiwKICAgICAgICAiZGVidWcuZGlzYWJsZV90aW1lIiwKICAgICAgICAiZGVidWcuZHNfaGFuZGxlX3NhbWVfYnVmZmVyIiwKICAgICAgICAiZGVidWcuZHNfaGFuZGxlX3NhbWVfYnVmZmVyX2ZpZm8iLAogICAgICAgICJkZWJ1Zy5lbmFibGVfc3Rkb3V0X2xvZ3MiLAogICAgICAgICJkZWJ1Zy5lcnJvcl9saW1pdCIsCiAgICAgICAgImRlYnVnLmVycm9yX3Bvc2l0aW9uIiwKICAgICAgICAiZGVidWcuZmlmb19wZW5kaW5nX3dvcmthcm91bmQiLAogICAgICAgICJkZWJ1Zy5mdWxsX2NtX3Byb3RvIiwKICAgICAgICAiZGVidWcuZ2xfZGVidWdnaW5nIiwKICAgICAgICAiZGVidWcuaW52YWxpZGF0ZV9mcDE2IiwKICAgICAgICAiZGVidWcubG9nX2RhbWFnZSIsCiAgICAgICAgImRlYnVnLm1hbnVhbF9jcmFzaCIsCiAgICAgICAgImRlYnVnLm92ZXJsYXkiLAogICAgICAgICJkZWJ1Zy5wYXNzIiwKICAgICAgICAiZGVidWcucmVuZGVyX3NvbGl0YXJ5X3dvX2RhbWFnZSIsCiAgICAgICAgImRlYnVnLnN1cHByZXNzX2Vycm9ycyIsCiAgICAgICAgImRlYnVnLnZmciIsCiAgICAgICAgImRlY29yYXRpb24uYWN0aXZlX29wYWNpdHkiLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIuYnJpZ2h0bmVzcyIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5jb250cmFzdCIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5lbmFibGVkIiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLmlnbm9yZV9vcGFjaXR5IiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLmlucHV0X21ldGhvZHMiLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIuaW5wdXRfbWV0aG9kc19pZ25vcmVhbHBoYSIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5uZXdfb3B0aW1pemF0aW9ucyIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5ub2lzZSIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5wYXNzZXMiLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIucG9wdXBzIiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLnBvcHVwc19pZ25vcmVhbHBoYSIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5zaXplIiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLnNwZWNpYWwiLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIudmlicmFuY3kiLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIudmlicmFuY3lfZGFya25lc3MiLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIueHJheSIsCiAgICAgICAgImRlY29yYXRpb24uYm9yZGVyX3BhcnRfb2Zfd2luZG93IiwKICAgICAgICAiZGVjb3JhdGlvbi5kaW1fYXJvdW5kIiwKICAgICAgICAiZGVjb3JhdGlvbi5kaW1faW5hY3RpdmUiLAogICAgICAgICJkZWNvcmF0aW9uLmRpbV9tb2RhbCIsCiAgICAgICAgImRlY29yYXRpb24uZGltX3NwZWNpYWwiLAogICAgICAgICJkZWNvcmF0aW9uLmRpbV9zdHJlbmd0aCIsCiAgICAgICAgImRlY29yYXRpb24uZnVsbHNjcmVlbl9vcGFjaXR5IiwKICAgICAgICAiZGVjb3JhdGlvbi5nbG93LmNvbG9yIiwKICAgICAgICAiZGVjb3JhdGlvbi5nbG93LmNvbG9yX2luYWN0aXZlIiwKICAgICAgICAiZGVjb3JhdGlvbi5nbG93LmVuYWJsZWQiLAogICAgICAgICJkZWNvcmF0aW9uLmdsb3cucmFuZ2UiLAogICAgICAgICJkZWNvcmF0aW9uLmdsb3cucmVuZGVyX3Bvd2VyIiwKICAgICAgICAiZGVjb3JhdGlvbi5pbmFjdGl2ZV9vcGFjaXR5IiwKICAgICAgICAiZGVjb3JhdGlvbi5tb3Rpb25fYmx1ci5lbmFibGVkIiwKICAgICAgICAiZGVjb3JhdGlvbi5tb3Rpb25fYmx1ci5zYW1wbGVzIiwKICAgICAgICAiZGVjb3JhdGlvbi5yb3VuZGluZyIsCiAgICAgICAgImRlY29yYXRpb24ucm91bmRpbmdfcG93ZXIiLAogICAgICAgICJkZWNvcmF0aW9uLnNjcmVlbl9zaGFkZXIiLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5jb2xvciIsCiAgICAgICAgImRlY29yYXRpb24uc2hhZG93LmNvbG9yX2luYWN0aXZlIiwKICAgICAgICAiZGVjb3JhdGlvbi5zaGFkb3cuZW5hYmxlZCIsCiAgICAgICAgImRlY29yYXRpb24uc2hhZG93Lm9mZnNldCIsCiAgICAgICAgImRlY29yYXRpb24uc2hhZG93LnJhbmdlIiwKICAgICAgICAiZGVjb3JhdGlvbi5zaGFkb3cucmVuZGVyX3Bvd2VyIiwKICAgICAgICAiZGVjb3JhdGlvbi5zaGFkb3cuc2NhbGUiLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5zaGFycCIsCiAgICAgICAgImR3aW5kbGUuZGVmYXVsdF9zcGxpdF9yYXRpbyIsCiAgICAgICAgImR3aW5kbGUuZm9yY2Vfc3BsaXQiLAogICAgICAgICJkd2luZGxlLnBlcm1hbmVudF9kaXJlY3Rpb25fb3ZlcnJpZGUiLAogICAgICAgICJkd2luZGxlLnByZWNpc2VfbW91c2VfbW92ZSIsCiAgICAgICAgImR3aW5kbGUucHJlc2VydmVfc3BsaXQiLAogICAgICAgICJkd2luZGxlLnNtYXJ0X3Jlc2l6aW5nIiwKICAgICAgICAiZHdpbmRsZS5zbWFydF9zcGxpdCIsCiAgICAgICAgImR3aW5kbGUuc3BlY2lhbF9zY2FsZV9mYWN0b3IiLAogICAgICAgICJkd2luZGxlLnNwbGl0X2JpYXMiLAogICAgICAgICJkd2luZGxlLnNwbGl0X3dpZHRoX211bHRpcGxpZXIiLAogICAgICAgICJkd2luZGxlLnVzZV9hY3RpdmVfZm9yX3NwbGl0cyIsCiAgICAgICAgImVjb3N5c3RlbS5lbmZvcmNlX3Blcm1pc3Npb25zIiwKICAgICAgICAiZWNvc3lzdGVtLm5vX2RvbmF0aW9uX25hZyIsCiAgICAgICAgImVjb3N5c3RlbS5ub191cGRhdGVfbmV3cyIsCiAgICAgICAgImV4cGVyaW1lbnRhbC53cF9jbV8xXzIiLAogICAgICAgICJnZW5lcmFsLmFsbG93X3RlYXJpbmciLAogICAgICAgICJnZW5lcmFsLmJvcmRlcl9zaXplIiwKICAgICAgICAiZ2VuZXJhbC5jb2wuYWN0aXZlX2JvcmRlciIsCiAgICAgICAgImdlbmVyYWwuY29sLmluYWN0aXZlX2JvcmRlciIsCiAgICAgICAgImdlbmVyYWwuY29sLm5vZ3JvdXBfYm9yZGVyIiwKICAgICAgICAiZ2VuZXJhbC5jb2wubm9ncm91cF9ib3JkZXJfYWN0aXZlIiwKICAgICAgICAiZ2VuZXJhbC5leHRlbmRfYm9yZGVyX2dyYWJfYXJlYSIsCiAgICAgICAgImdlbmVyYWwuZmxvYXRfZ2FwcyIsCiAgICAgICAgImdlbmVyYWwuZ2Fwc19pbiIsCiAgICAgICAgImdlbmVyYWwuZ2Fwc19vdXQiLAogICAgICAgICJnZW5lcmFsLmdhcHNfd29ya3NwYWNlcyIsCiAgICAgICAgImdlbmVyYWwuaG92ZXJfaWNvbl9vbl9ib3JkZXIiLAogICAgICAgICJnZW5lcmFsLmxheW91dCIsCiAgICAgICAgImdlbmVyYWwubG9jYWxlIiwKICAgICAgICAiZ2VuZXJhbC5tb2RhbF9wYXJlbnRfYmxvY2tpbmciLAogICAgICAgICJnZW5lcmFsLm5vX2ZvY3VzX2ZhbGxiYWNrIiwKICAgICAgICAiZ2VuZXJhbC5yZXNpemVfY29ybmVyIiwKICAgICAgICAiZ2VuZXJhbC5yZXNpemVfb25fYm9yZGVyIiwKICAgICAgICAiZ2VuZXJhbC5zbmFwLmJvcmRlcl9vdmVybGFwIiwKICAgICAgICAiZ2VuZXJhbC5zbmFwLmVuYWJsZWQiLAogICAgICAgICJnZW5lcmFsLnNuYXAubW9uaXRvcl9nYXAiLAogICAgICAgICJnZW5lcmFsLnNuYXAucmVzcGVjdF9nYXBzIiwKICAgICAgICAiZ2VuZXJhbC5zbmFwLndpbmRvd19nYXAiLAogICAgICAgICJnZXN0dXJlcy5jbG9zZV9tYXhfdGltZW91dCIsCiAgICAgICAgImdlc3R1cmVzLnNjcm9sbGluZy5tb3ZlX3NuYXBfY3Vyc29yIiwKICAgICAgICAiZ2VzdHVyZXMuc2Nyb2xsaW5nLm1vdmVfc25hcF90b19ncmlkIiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2NhbmNlbF9yYXRpbyIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9jcmVhdGVfbmV3IiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2RpcmVjdGlvbl9sb2NrIiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2RpcmVjdGlvbl9sb2NrX3RocmVzaG9sZCIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9kaXN0YW5jZSIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9mb3JldmVyIiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2ludmVydCIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9taW5fc3BlZWRfdG9fZm9yY2UiLAogICAgICAgICJnZXN0dXJlcy53b3Jrc3BhY2Vfc3dpcGVfdG91Y2giLAogICAgICAgICJnZXN0dXJlcy53b3Jrc3BhY2Vfc3dpcGVfdG91Y2hfaW52ZXJ0IiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX3VzZV9yIiwKICAgICAgICAiZ3JvdXAuYXV0b19ncm91cCIsCiAgICAgICAgImdyb3VwLmNvbC5ib3JkZXJfYWN0aXZlIiwKICAgICAgICAiZ3JvdXAuY29sLmJvcmRlcl9pbmFjdGl2ZSIsCiAgICAgICAgImdyb3VwLmNvbC5ib3JkZXJfbG9ja2VkX2FjdGl2ZSIsCiAgICAgICAgImdyb3VwLmNvbC5ib3JkZXJfbG9ja2VkX2luYWN0aXZlIiwKICAgICAgICAiZ3JvdXAuZHJhZ19pbnRvX2dyb3VwIiwKICAgICAgICAiZ3JvdXAuZm9jdXNfcmVtb3ZlZF93aW5kb3ciLAogICAgICAgICJncm91cC5ncm91cF9vbl9tb3ZldG93b3Jrc3BhY2UiLAogICAgICAgICJncm91cC5ncm91cGJhci5ibHVyIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuY29sLmFjdGl2ZSIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmNvbC5pbmFjdGl2ZSIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmNvbC5sb2NrZWRfYWN0aXZlIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuY29sLmxvY2tlZF9pbmFjdGl2ZSIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmRpc2FibGVfd2hlbl9vbmx5IiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZW5hYmxlZCIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmZvbnRfZmFtaWx5IiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZm9udF9zaXplIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZm9udF93ZWlnaHRfYWN0aXZlIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZm9udF93ZWlnaHRfaW5hY3RpdmUiLAogICAgICAgICJncm91cC5ncm91cGJhci5nYXBzX2luIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZ2Fwc19vdXQiLAogICAgICAgICJncm91cC5ncm91cGJhci5ncmFkaWVudF9yb3VuZF9vbmx5X2VkZ2VzIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZ3JhZGllbnRfcm91bmRpbmciLAogICAgICAgICJncm91cC5ncm91cGJhci5ncmFkaWVudF9yb3VuZGluZ19wb3dlciIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmdyYWRpZW50cyIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmhlaWdodCIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmluZGljYXRvcl9nYXAiLAogICAgICAgICJncm91cC5ncm91cGJhci5pbmRpY2F0b3JfaGVpZ2h0IiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIua2VlcF91cHBlcl9nYXAiLAogICAgICAgICJncm91cC5ncm91cGJhci5taWRkbGVfY2xpY2tfY2xvc2UiLAogICAgICAgICJncm91cC5ncm91cGJhci5wcmlvcml0eSIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLnJlbmRlcl90aXRsZXMiLAogICAgICAgICJncm91cC5ncm91cGJhci5yb3VuZF9vbmx5X2VkZ2VzIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIucm91bmRpbmciLAogICAgICAgICJncm91cC5ncm91cGJhci5yb3VuZGluZ19wb3dlciIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLnNjcm9sbGluZyIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLnN0YWNrZWQiLAogICAgICAgICJncm91cC5ncm91cGJhci50ZXh0X2NvbG9yIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIudGV4dF9jb2xvcl9pbmFjdGl2ZSIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLnRleHRfY29sb3JfbG9ja2VkX2FjdGl2ZSIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLnRleHRfY29sb3JfbG9ja2VkX2luYWN0aXZlIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIudGV4dF9vZmZzZXQiLAogICAgICAgICJncm91cC5ncm91cGJhci50ZXh0X3BhZGRpbmciLAogICAgICAgICJncm91cC5pbnNlcnRfYWZ0ZXJfY3VycmVudCIsCiAgICAgICAgImdyb3VwLm1lcmdlX2Zsb2F0ZWRfaW50b190aWxlZF9vbl9ncm91cGJhciIsCiAgICAgICAgImdyb3VwLm1lcmdlX2dyb3Vwc19vbl9kcmFnIiwKICAgICAgICAiZ3JvdXAubWVyZ2VfZ3JvdXBzX29uX2dyb3VwYmFyIiwKICAgICAgICAiaW5wdXQuYWNjZWxfcHJvZmlsZSIsCiAgICAgICAgImlucHV0LmVtdWxhdGVfZGlzY3JldGVfc2Nyb2xsIiwKICAgICAgICAiaW5wdXQuZmxvYXRfc3dpdGNoX292ZXJyaWRlX2ZvY3VzIiwKICAgICAgICAiaW5wdXQuZm9jdXNfb25fY2xvc2UiLAogICAgICAgICJpbnB1dC5mb2xsb3dfbW91c2UiLAogICAgICAgICJpbnB1dC5mb2xsb3dfbW91c2Vfc2hyaW5rIiwKICAgICAgICAiaW5wdXQuZm9sbG93X21vdXNlX3RocmVzaG9sZCIsCiAgICAgICAgImlucHV0LmZvcmNlX25vX2FjY2VsIiwKICAgICAgICAiaW5wdXQua2JfZmlsZSIsCiAgICAgICAgImlucHV0LmtiX2xheW91dCIsCiAgICAgICAgImlucHV0LmtiX21vZGVsIiwKICAgICAgICAiaW5wdXQua2Jfb3B0aW9ucyIsCiAgICAgICAgImlucHV0LmtiX3J1bGVzIiwKICAgICAgICAiaW5wdXQua2JfdmFyaWFudCIsCiAgICAgICAgImlucHV0LmxlZnRfaGFuZGVkIiwKICAgICAgICAiaW5wdXQubW91c2VfcmVmb2N1cyIsCiAgICAgICAgImlucHV0Lm5hdHVyYWxfc2Nyb2xsIiwKICAgICAgICAiaW5wdXQubnVtbG9ja19ieV9kZWZhdWx0IiwKICAgICAgICAiaW5wdXQub2ZmX3dpbmRvd19heGlzX2V2ZW50cyIsCiAgICAgICAgImlucHV0LnJlcGVhdF9kZWxheSIsCiAgICAgICAgImlucHV0LnJlcGVhdF9yYXRlIiwKICAgICAgICAiaW5wdXQucmVzb2x2ZV9iaW5kc19ieV9zeW0iLAogICAgICAgICJpbnB1dC5yb3RhdGlvbiIsCiAgICAgICAgImlucHV0LnNjcm9sbF9idXR0b24iLAogICAgICAgICJpbnB1dC5zY3JvbGxfYnV0dG9uX2xvY2siLAogICAgICAgICJpbnB1dC5zY3JvbGxfZmFjdG9yIiwKICAgICAgICAiaW5wdXQuc2Nyb2xsX21ldGhvZCIsCiAgICAgICAgImlucHV0LnNjcm9sbF9wb2ludHMiLAogICAgICAgICJpbnB1dC5zZW5zaXRpdml0eSIsCiAgICAgICAgImlucHV0LnNwZWNpYWxfZmFsbHRocm91Z2giLAogICAgICAgICJpbnB1dC50YWJsZXQuYWJzb2x1dGVfcmVnaW9uX3Bvc2l0aW9uIiwKICAgICAgICAiaW5wdXQudGFibGV0LmFjdGl2ZV9hcmVhX3Bvc2l0aW9uIiwKICAgICAgICAiaW5wdXQudGFibGV0LmFjdGl2ZV9hcmVhX3NpemUiLAogICAgICAgICJpbnB1dC50YWJsZXQubGVmdF9oYW5kZWQiLAogICAgICAgICJpbnB1dC50YWJsZXQub3V0cHV0IiwKICAgICAgICAiaW5wdXQudGFibGV0LnJlZ2lvbl9wb3NpdGlvbiIsCiAgICAgICAgImlucHV0LnRhYmxldC5yZWdpb25fc2l6ZSIsCiAgICAgICAgImlucHV0LnRhYmxldC5yZWxhdGl2ZV9pbnB1dCIsCiAgICAgICAgImlucHV0LnRhYmxldC50cmFuc2Zvcm0iLAogICAgICAgICJpbnB1dC50YWJsZXR0b29sLmVyYXNlcl9idXR0b25fbW9kZSIsCiAgICAgICAgImlucHV0LnRhYmxldHRvb2wuZXJhc2VyX2J1dHRvbl9vdmVycmlkZSIsCiAgICAgICAgImlucHV0LnRhYmxldHRvb2wucHJlc3N1cmVfcmFuZ2VfbWF4IiwKICAgICAgICAiaW5wdXQudGFibGV0dG9vbC5wcmVzc3VyZV9yYW5nZV9taW4iLAogICAgICAgICJpbnB1dC50b3VjaGRldmljZS5lbmFibGVkIiwKICAgICAgICAiaW5wdXQudG91Y2hkZXZpY2Uub3V0cHV0IiwKICAgICAgICAiaW5wdXQudG91Y2hkZXZpY2UudHJhbnNmb3JtIiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQuY2xpY2tmaW5nZXJfYmVoYXZpb3IiLAogICAgICAgICJpbnB1dC50b3VjaHBhZC5kaXNhYmxlX3doaWxlX3R5cGluZyIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLmRyYWdfM2ZnIiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQuZHJhZ19sb2NrIiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQuZmxpcF94IiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQuZmxpcF95IiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQubWlkZGxlX2J1dHRvbl9lbXVsYXRpb24iLAogICAgICAgICJpbnB1dC50b3VjaHBhZC5uYXR1cmFsX3Njcm9sbCIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLnNjcm9sbF9mYWN0b3IiLAogICAgICAgICJpbnB1dC50b3VjaHBhZC50YXBfYW5kX2RyYWciLAogICAgICAgICJpbnB1dC50b3VjaHBhZC50YXBfYnV0dG9uX21hcCIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLnRhcF90b19jbGljayIsCiAgICAgICAgImlucHV0LnZpcnR1YWxrZXlib2FyZC5yZWxlYXNlX3ByZXNzZWRfb25fY2xvc2UiLAogICAgICAgICJpbnB1dC52aXJ0dWFsa2V5Ym9hcmQuc2hhcmVfc3RhdGVzIiwKICAgICAgICAiaW5wdXRfY2FwdHVyZS5jYXB0dXJlX21vZGlmaWVycyIsCiAgICAgICAgImlucHV0X2NhcHR1cmUuZW5mb3JjZV9iYXJyaWVycyIsCiAgICAgICAgImxheW91dC5zaW5nbGVfd2luZG93X2FzcGVjdF9yYXRpbyIsCiAgICAgICAgImxheW91dC5zaW5nbGVfd2luZG93X2FzcGVjdF9yYXRpb190b2xlcmFuY2UiLAogICAgICAgICJtYXN0ZXIuYWxsb3dfc21hbGxfc3BsaXQiLAogICAgICAgICJtYXN0ZXIuYWx3YXlzX2tlZXBfcG9zaXRpb24iLAogICAgICAgICJtYXN0ZXIuY2VudGVyX2lnbm9yZXNfcmVzZXJ2ZWQiLAogICAgICAgICJtYXN0ZXIuY2VudGVyX21hc3Rlcl9mYWxsYmFjayIsCiAgICAgICAgIm1hc3Rlci5kcm9wX2F0X2N1cnNvciIsCiAgICAgICAgIm1hc3Rlci5mb2N1c19tYXN0ZXJfb25fY2xvc2UiLAogICAgICAgICJtYXN0ZXIubWZhY3QiLAogICAgICAgICJtYXN0ZXIubmV3X29uX2FjdGl2ZSIsCiAgICAgICAgIm1hc3Rlci5uZXdfb25fdG9wIiwKICAgICAgICAibWFzdGVyLm5ld19zdGF0dXMiLAogICAgICAgICJtYXN0ZXIub3JpZW50YXRpb24iLAogICAgICAgICJtYXN0ZXIuc2xhdmVfY291bnRfZm9yX2NlbnRlcl9tYXN0ZXIiLAogICAgICAgICJtYXN0ZXIuc21hcnRfcmVzaXppbmciLAogICAgICAgICJtYXN0ZXIuc3BlY2lhbF9zY2FsZV9mYWN0b3IiLAogICAgICAgICJtaXNjLmFsbG93X3Nlc3Npb25fbG9ja19yZXN0b3JlIiwKICAgICAgICAibWlzYy5hbHdheXNfZm9sbG93X29uX2RuZCIsCiAgICAgICAgIm1pc2MuYW5pbWF0ZV9tYW51YWxfcmVzaXplcyIsCiAgICAgICAgIm1pc2MuYW5pbWF0ZV9tb3VzZV93aW5kb3dkcmFnZ2luZyIsCiAgICAgICAgIm1pc2MuYW5yX21pc3NlZF9waW5ncyIsCiAgICAgICAgIm1pc2MuYmFja2dyb3VuZF9jb2xvciIsCiAgICAgICAgIm1pc2MuY2xvc2Vfc3BlY2lhbF9vbl9lbXB0eSIsCiAgICAgICAgIm1pc2MuY29sLnNwbGFzaCIsCiAgICAgICAgIm1pc2MuZGlzYWJsZV9hdXRvcmVsb2FkIiwKICAgICAgICAibWlzYy5kaXNhYmxlX2h5cHJsYW5kX2d1aXV0aWxzX2NoZWNrIiwKICAgICAgICAibWlzYy5kaXNhYmxlX2h5cHJsYW5kX2xvZ28iLAogICAgICAgICJtaXNjLmRpc2FibGVfc2NhbGVfbm90aWZpY2F0aW9uIiwKICAgICAgICAibWlzYy5kaXNhYmxlX3NwbGFzaF9yZW5kZXJpbmciLAogICAgICAgICJtaXNjLmRpc2FibGVfd2F0Y2hkb2dfd2FybmluZyIsCiAgICAgICAgIm1pc2MuZGlzYWJsZV94ZGdfZW52X2NoZWNrcyIsCiAgICAgICAgIm1pc2MuZW5hYmxlX2Fucl9kaWFsb2ciLAogICAgICAgICJtaXNjLmVuYWJsZV9zd2FsbG93IiwKICAgICAgICAibWlzYy5leGl0X3dpbmRvd19yZXRhaW5zX2Z1bGxzY3JlZW4iLAogICAgICAgICJtaXNjLmZvY3VzX29uX2FjdGl2YXRlIiwKICAgICAgICAibWlzYy5mb250X2ZhbWlseSIsCiAgICAgICAgIm1pc2MuZm9yY2VfZGVmYXVsdF93YWxscGFwZXIiLAogICAgICAgICJtaXNjLmluaXRpYWxfd29ya3NwYWNlX3Rva2VuX3RpbWVvdXQiLAogICAgICAgICJtaXNjLmluaXRpYWxfd29ya3NwYWNlX3RyYWNraW5nIiwKICAgICAgICAibWlzYy5rZXlfcHJlc3NfZW5hYmxlc19kcG1zIiwKICAgICAgICAibWlzYy5sYXllcnNfaG9nX2tleWJvYXJkX2ZvY3VzIiwKICAgICAgICAibWlzYy5sb2NrZGVhZF9zY3JlZW5fZGVsYXkiLAogICAgICAgICJtaXNjLm1pZGRsZV9jbGlja19wYXN0ZSIsCiAgICAgICAgIm1pc2MubW91c2VfbW92ZV9lbmFibGVzX2RwbXMiLAogICAgICAgICJtaXNjLm1vdXNlX21vdmVfZm9jdXNlc19tb25pdG9yIiwKICAgICAgICAibWlzYy5uYW1lX3ZrX2FmdGVyX3Byb2MiLAogICAgICAgICJtaXNjLm9uX2ZvY3VzX3VuZGVyX2Z1bGxzY3JlZW4iLAogICAgICAgICJtaXNjLnJlbmRlcl91bmZvY3VzZWRfZnBzIiwKICAgICAgICAibWlzYy5zY3JlZW5jb3B5X2ZvcmNlXzhiIiwKICAgICAgICAibWlzYy5zZXNzaW9uX2xvY2tfYmx1ciIsCiAgICAgICAgIm1pc2Muc2Vzc2lvbl9sb2NrX3hyYXkiLAogICAgICAgICJtaXNjLnNpemVfbGltaXRzX3RpbGVkIiwKICAgICAgICAibWlzYy5zcGxhc2hfZm9udF9mYW1pbHkiLAogICAgICAgICJtaXNjLnN3YWxsb3dfZXhjZXB0aW9uX3JlZ2V4IiwKICAgICAgICAibWlzYy5zd2FsbG93X3JlZ2V4IiwKICAgICAgICAibWlzYy52cnIiLAogICAgICAgICJvcGVuZ2wubnZpZGlhX2FudGlfZmxpY2tlciIsCiAgICAgICAgInF1aXJrcy5wcmVmZXJfaGRyIiwKICAgICAgICAicXVpcmtzLnNraXBfbm9uX2ttc19kbWFidWZfZm9ybWF0cyIsCiAgICAgICAgInJlbmRlci5jbV9hdXRvX2hkciIsCiAgICAgICAgInJlbmRlci5jbV9lbmFibGVkIiwKICAgICAgICAicmVuZGVyLmNtX3Nkcl9lb3RmIiwKICAgICAgICAicmVuZGVyLmNvbW1pdF90aW1pbmdfZW5hYmxlZCIsCiAgICAgICAgInJlbmRlci5jdG1fYW5pbWF0aW9uIiwKICAgICAgICAicmVuZGVyLmRpcmVjdF9zY2Fub3V0IiwKICAgICAgICAicmVuZGVyLmV4cGFuZF91bmRlcnNpemVkX3RleHR1cmVzIiwKICAgICAgICAicmVuZGVyLmZwMTZfc2RyX3RmIiwKICAgICAgICAicmVuZGVyLmljY192Y2d0X2VuYWJsZWQiLAogICAgICAgICJyZW5kZXIua2VlcF91bm1vZGlmaWVkX2NvcHkiLAogICAgICAgICJyZW5kZXIubmV3X3JlbmRlcl9zY2hlZHVsaW5nIiwKICAgICAgICAicmVuZGVyLm5vbl9zaGFkZXJfY20iLAogICAgICAgICJyZW5kZXIubm9uX3NoYWRlcl9jbV9pbnRlcm9wIiwKICAgICAgICAicmVuZGVyLnNlbmRfY29udGVudF90eXBlIiwKICAgICAgICAicmVuZGVyLnVzZV9mcDE2IiwKICAgICAgICAicmVuZGVyLnVzZV9zaGFkZXJfYmx1cl9ibGVuZCIsCiAgICAgICAgInJlbmRlci54cF9tb2RlIiwKICAgICAgICAic2Nyb2xsaW5nLmNvbHVtbl93aWR0aCIsCiAgICAgICAgInNjcm9sbGluZy5kaXJlY3Rpb24iLAogICAgICAgICJzY3JvbGxpbmcuZXhwbGljaXRfY29sdW1uX3dpZHRocyIsCiAgICAgICAgInNjcm9sbGluZy5mb2N1c19maXRfbWV0aG9kIiwKICAgICAgICAic2Nyb2xsaW5nLmZvbGxvd19mb2N1cyIsCiAgICAgICAgInNjcm9sbGluZy5mb2xsb3dfbWluX3Zpc2libGUiLAogICAgICAgICJzY3JvbGxpbmcuZnVsbHNjcmVlbl9vbl9vbmVfY29sdW1uIiwKICAgICAgICAic2Nyb2xsaW5nLndyYXBfZm9jdXMiLAogICAgICAgICJzY3JvbGxpbmcud3JhcF9zd2FwY29sIiwKICAgICAgICAieHdheWxhbmQuY3JlYXRlX2Fic3RyYWN0X3NvY2tldCIsCiAgICAgICAgInh3YXlsYW5kLmVuYWJsZWQiLAogICAgICAgICJ4d2F5bGFuZC5mb3JjZV96ZXJvX3NjYWxpbmciLAogICAgICAgICJ4d2F5bGFuZC51c2VfbmVhcmVzdF9uZWlnaGJvciIKICAgICAgXSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnS2V5IiwKICAgICAgInR5cGVfZXhwciI6IG51bGwKICAgIH0sCiAgICAiSEwuQ3NzR2FwIjogewogICAgICAibGl0ZXJhbHMiOiBbXSwKICAgICAgIm5hbWUiOiAiSEwuQ3NzR2FwIiwKICAgICAgInR5cGVfZXhwciI6ICJpbnRlZ2VyfHt0b3A/OmludGVnZXIsIHJpZ2h0PzppbnRlZ2VyLCBib3R0b20/OmludGVnZXIsIGxlZnQ/OmludGVnZXJ9IgogICAgfSwKICAgICJITC5FdmVudE5hbWUiOiB7CiAgICAgICJsaXRlcmFscyI6IFsKICAgICAgICAiY29uZmlnLnByb3BzX3JlZnJlc2hlZCIsCiAgICAgICAgImNvbmZpZy5yZWxvYWRlZCIsCiAgICAgICAgImh5cHJsYW5kLnNodXRkb3duIiwKICAgICAgICAiaHlwcmxhbmQuc3RhcnQiLAogICAgICAgICJpbnB1dC5rZXlib2FyZC5rZXkiLAogICAgICAgICJrZXliaW5kcy5zdWJtYXAiLAogICAgICAgICJsYXllci5jbG9zZWQiLAogICAgICAgICJsYXllci5vcGVuZWQiLAogICAgICAgICJtb25pdG9yLmFkZGVkIiwKICAgICAgICAibW9uaXRvci5mb2N1c2VkIiwKICAgICAgICAibW9uaXRvci5sYXlvdXRfY2hhbmdlZCIsCiAgICAgICAgIm1vbml0b3IucmVtb3ZlZCIsCiAgICAgICAgInNjcmVlbnNoYXJlLnN0YXRlIiwKICAgICAgICAid2luZG93LmFjdGl2ZSIsCiAgICAgICAgIndpbmRvdy5jbGFzcyIsCiAgICAgICAgIndpbmRvdy5jbG9zZSIsCiAgICAgICAgIndpbmRvdy5kZXN0cm95IiwKICAgICAgICAid2luZG93LmZ1bGxzY3JlZW4iLAogICAgICAgICJ3aW5kb3cua2lsbCIsCiAgICAgICAgIndpbmRvdy5tb3ZlX3RvX3dvcmtzcGFjZSIsCiAgICAgICAgIndpbmRvdy5vcGVuIiwKICAgICAgICAid2luZG93Lm9wZW5fZWFybHkiLAogICAgICAgICJ3aW5kb3cucGluIiwKICAgICAgICAid2luZG93LnRpdGxlIiwKICAgICAgICAid2luZG93LnVwZGF0ZV9ydWxlcyIsCiAgICAgICAgIndpbmRvdy51cmdlbnQiLAogICAgICAgICJ3b3Jrc3BhY2UuYWN0aXZlIiwKICAgICAgICAid29ya3NwYWNlLmNyZWF0ZWQiLAogICAgICAgICJ3b3Jrc3BhY2UubW92ZV90b19tb25pdG9yIiwKICAgICAgICAid29ya3NwYWNlLnJlbW92ZWQiLAogICAgICAgICJ3b3Jrc3BhY2Uuc3BlY2lhbF9hY3RpdmUiCiAgICAgIF0sCiAgICAgICJuYW1lIjogIkhMLkV2ZW50TmFtZSIsCiAgICAgICJ0eXBlX2V4cHIiOiBudWxsCiAgICB9LAogICAgIkhMLkdyYWRpZW50IjogewogICAgICAibGl0ZXJhbHMiOiBbXSwKICAgICAgIm5hbWUiOiAiSEwuR3JhZGllbnQiLAogICAgICAidHlwZV9leHByIjogInN0cmluZ3x7Y29sb3JzOnN0cmluZ1tdLCBhbmdsZT86bnVtYmVyfSIKICAgIH0sCiAgICAiSEwuTW9uaXRvclNlbGVjdG9yIjogewogICAgICAibGl0ZXJhbHMiOiBbXSwKICAgICAgIm5hbWUiOiAiSEwuTW9uaXRvclNlbGVjdG9yIiwKICAgICAgInR5cGVfZXhwciI6ICJzdHJpbmd8aW50ZWdlcnxITC5Nb25pdG9yIgogICAgfSwKICAgICJITC5WZWMyTGlrZSI6IHsKICAgICAgImxpdGVyYWxzIjogW10sCiAgICAgICJuYW1lIjogIkhMLlZlYzJMaWtlIiwKICAgICAgInR5cGVfZXhwciI6ICJITC5WZWMyfHt4Om51bWJlciwgeTpudW1iZXJ9fHtudW1iZXIsIG51bWJlcn18c3RyaW5nIgogICAgfSwKICAgICJITC5XaW5kb3dTZWxlY3RvciI6IHsKICAgICAgImxpdGVyYWxzIjogW10sCiAgICAgICJuYW1lIjogIkhMLldpbmRvd1NlbGVjdG9yIiwKICAgICAgInR5cGVfZXhwciI6ICJzdHJpbmd8aW50ZWdlcnxITC5XaW5kb3ciCiAgICB9LAogICAgIkhMLldvcmtzcGFjZVNlbGVjdG9yIjogewogICAgICAibGl0ZXJhbHMiOiBbXSwKICAgICAgIm5hbWUiOiAiSEwuV29ya3NwYWNlU2VsZWN0b3IiLAogICAgICAidHlwZV9leHByIjogInN0cmluZ3xpbnRlZ2VyfEhMLldvcmtzcGFjZSIKICAgIH0KICB9LAogICJjbGFzc2VzIjogewogICAgIkhMLkFQSSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYW5pbWF0aW9uIjogImZ1biguLi4pOiBhbnkiLAogICAgICAgICJiaW5kIjogImZ1bihrZXlzOiBzdHJpbmcsIGRpc3BhdGNoZXI6IEhMLkRpc3BhdGNoZXJ8ZnVuY3Rpb24sIG9wdHM/OiBITC5CaW5kT3B0aW9ucyk6IEhMLktleWJpbmQiLAogICAgICAgICJjbGVhcl9jcmFzaGVkX2xvY2tzY3JlZW4iOiAiZnVuKCk6IG5pbCIsCiAgICAgICAgImNvbmZpZyI6ICJmdW4oY29uZmlnOiBITC5Db25maWdPcHQpOiBuaWwiLAogICAgICAgICJjdXJ2ZSI6ICJmdW4oLi4uKTogYW55IiwKICAgICAgICAiZGVmaW5lX3N1Ym1hcCI6ICJmdW4obmFtZTogc3RyaW5nLCByZXNldF9vcl9mbjogc3RyaW5nfGZ1bmN0aW9uLCBmbj86IGZ1bmN0aW9uKTogbmlsIiwKICAgICAgICAiZGV2aWNlIjogImZ1bihzcGVjOiBITC5EZXZpY2VTcGVjKTogbmlsIiwKICAgICAgICAiZGlzcGF0Y2giOiAiZnVuKGRpc3BhdGNoZXI6IEhMLkRpc3BhdGNoZXJ8ZnVuY3Rpb24pOiBhbnkiLAogICAgICAgICJkc3AiOiAiSEwuRHNwTmFtZXNwYWNlIiwKICAgICAgICAiZW52IjogImZ1biguLi4pOiBhbnkiLAogICAgICAgICJleGVjX2NtZCI6ICJmdW4oY21kOiBzdHJpbmcsIHJ1bGVzPzogdGFibGU8c3RyaW5nLCBzdHJpbmd8bnVtYmVyfGJvb2xlYW4+KTogbmlsIiwKICAgICAgICAiZXhlY19zY2hlZHVsZWRfcHJvcF9yZWZyZXNoX2ltbWVkaWF0ZWx5IjogImZ1bigpOiBuaWwiLAogICAgICAgICJnZXN0dXJlIjogImZ1bihzcGVjOiBITC5HZXN0dXJlU3BlYyk6IG5pbCIsCiAgICAgICAgImdldF9hY3RpdmVfbW9uaXRvciI6ICJmdW4oKTogSEwuTW9uaXRvcnxuaWwiLAogICAgICAgICJnZXRfYWN0aXZlX3NwZWNpYWxfd29ya3NwYWNlIjogImZ1bihtb25pdG9yPzogSEwuTW9uaXRvclNlbGVjdG9yKTogSEwuV29ya3NwYWNlfG5pbCIsCiAgICAgICAgImdldF9hY3RpdmVfd2luZG93IjogImZ1bigpOiBITC5XaW5kb3d8bmlsIiwKICAgICAgICAiZ2V0X2FjdGl2ZV93b3Jrc3BhY2UiOiAiZnVuKG1vbml0b3I/OiBITC5Nb25pdG9yU2VsZWN0b3IpOiBITC5Xb3Jrc3BhY2V8bmlsIiwKICAgICAgICAiZ2V0X2NvbmZpZyI6ICJmdW4oa2V5OiBITC5Db25maWdLZXl8c3RyaW5nKTogYW55LCBzdHJpbmc/IiwKICAgICAgICAiZ2V0X2N1cnJlbnRfc3VibWFwIjogImZ1bigpOiBzdHJpbmciLAogICAgICAgICJnZXRfY3Vyc29yX3BvcyI6ICJmdW4oKTogSEwuVmVjMnxuaWwiLAogICAgICAgICJnZXRfbGFzdF93aW5kb3ciOiAiZnVuKCk6IEhMLldpbmRvd3xuaWwiLAogICAgICAgICJnZXRfbGFzdF93b3Jrc3BhY2UiOiAiZnVuKG1vbml0b3I/OiBITC5Nb25pdG9yU2VsZWN0b3IpOiBITC5Xb3Jrc3BhY2V8bmlsIiwKICAgICAgICAiZ2V0X2xheWVycyI6ICJmdW4oZmlsdGVycz86IEhMLkxheWVyUXVlcnlGaWx0ZXIpOiBITC5MYXllclN1cmZhY2VbXSIsCiAgICAgICAgImdldF9sb2FkZWRfcGx1Z2lucyI6ICJmdW4oKTogSEwuUGx1Z2luW10iLAogICAgICAgICJnZXRfbW9uaXRvciI6ICJmdW4oc2VsZWN0b3I6IEhMLk1vbml0b3JTZWxlY3Rvcik6IEhMLk1vbml0b3J8bmlsIiwKICAgICAgICAiZ2V0X21vbml0b3JfYXQiOiAiZnVuKHg6IG51bWJlcnxITC5WZWMyLCB5PzogbnVtYmVyKTogSEwuTW9uaXRvcnxuaWwiLAogICAgICAgICJnZXRfbW9uaXRvcl9hdF9jdXJzb3IiOiAiZnVuKCk6IEhMLk1vbml0b3J8bmlsIiwKICAgICAgICAiZ2V0X21vbml0b3JzIjogImZ1bigpOiBITC5Nb25pdG9yW10iLAogICAgICAgICJnZXRfdXJnZW50X3dpbmRvdyI6ICJmdW4oKTogSEwuV2luZG93fG5pbCIsCiAgICAgICAgImdldF93aW5kb3ciOiAiZnVuKHNlbGVjdG9yOiBITC5XaW5kb3dTZWxlY3Rvcik6IEhMLldpbmRvd3xuaWwiLAogICAgICAgICJnZXRfd2luZG93cyI6ICJmdW4oZmlsdGVycz86IEhMLldpbmRvd1F1ZXJ5RmlsdGVyKTogSEwuV2luZG93W10iLAogICAgICAgICJnZXRfd29ya3NwYWNlIjogImZ1bihzZWxlY3RvcjogSEwuV29ya3NwYWNlU2VsZWN0b3IpOiBITC5Xb3Jrc3BhY2V8bmlsIiwKICAgICAgICAiZ2V0X3dvcmtzcGFjZV93aW5kb3dzIjogImZ1bih3b3Jrc3BhY2U6IEhMLldvcmtzcGFjZVNlbGVjdG9yKTogSEwuV2luZG93W10iLAogICAgICAgICJnZXRfd29ya3NwYWNlcyI6ICJmdW4oKTogSEwuV29ya3NwYWNlW10iLAogICAgICAgICJpc19rZXlfZG93biI6ICJmdW4oa2V5OiBudW1iZXJ8c3RyaW5nKTogYm9vbGVhbiIsCiAgICAgICAgImxheWVyX3J1bGUiOiAiZnVuKHNwZWM6IEhMLkxheWVyUnVsZVNwZWMpOiBITC5MYXllclJ1bGUiLAogICAgICAgICJsYXlvdXQiOiAiSEwuTGF5b3V0TmFtZXNwYWNlIiwKICAgICAgICAibW9uaXRvciI6ICJmdW4oc3BlYzogSEwuTW9uaXRvclNwZWMpOiBuaWwiLAogICAgICAgICJub3RpZmljYXRpb24iOiAiSEwuTm90aWZpY2F0aW9uTmFtZXNwYWNlIiwKICAgICAgICAib24iOiAiZnVuKGV2ZW50OiBITC5FdmVudE5hbWUsIGNiOiBmdW4oLi4uKSk6IEhMLkV2ZW50U3Vic2NyaXB0aW9uIiwKICAgICAgICAicGVybWlzc2lvbiI6ICJmdW4oc3BlYzogSEwuUGVybWlzc2lvblNwZWMpOiBuaWwiLAogICAgICAgICJwbHVnaW4iOiAiSEwuUGx1Z2luTmFtZXNwYWNlIiwKICAgICAgICAidGltZXIiOiAiZnVuKGNhbGxiYWNrOiBmdW5jdGlvbiwgb3B0czogSEwuVGltZXJPcHRpb25zKTogSEwuVGltZXIiLAogICAgICAgICJ1bmJpbmQiOiAiZnVuKGtleTogc3RyaW5nKTogbmlsIiwKICAgICAgICAidmVyc2lvbiI6ICJmdW4oKTogc3RyaW5nIiwKICAgICAgICAid2luZG93X3J1bGUiOiAiZnVuKHNwZWM6IEhMLldpbmRvd1J1bGVTcGVjKTogSEwuV2luZG93UnVsZSIsCiAgICAgICAgIndvcmtzcGFjZV9ydWxlIjogImZ1bihzcGVjOiBITC5Xb3Jrc3BhY2VSdWxlU3BlYyk6IEhMLldvcmtzcGFjZVJ1bGUiCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkFQSSIKICAgIH0sCiAgICAiSEwuQmluZE9wdGlvbnMiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFsbG93X2lucHV0X2NhcHR1cmUiOiAiYm9vbGVhbiIsCiAgICAgICAgImNsaWNrIjogImJvb2xlYW4iLAogICAgICAgICJkZXNjIjogInN0cmluZyIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogInN0cmluZyIsCiAgICAgICAgImRldmljZSI6ICJ7aW5jbHVzaXZlPzogYm9vbGVhbiwgbGlzdD86IHN0cmluZ1tdfSIsCiAgICAgICAgImRvbnRfaW5oaWJpdCI6ICJib29sZWFuIiwKICAgICAgICAiZHJhZyI6ICJib29sZWFuIiwKICAgICAgICAiaWdub3JlX21vZHMiOiAiYm9vbGVhbiIsCiAgICAgICAgImxvY2tlZCI6ICJib29sZWFuIiwKICAgICAgICAibG9uZ19wcmVzcyI6ICJib29sZWFuIiwKICAgICAgICAibm9uX2NvbnN1bWluZyI6ICJib29sZWFuIiwKICAgICAgICAicmVsZWFzZSI6ICJib29sZWFuIiwKICAgICAgICAicmVwZWF0aW5nIjogImJvb2xlYW4iLAogICAgICAgICJzdWJtYXBfdW5pdmVyc2FsIjogImJvb2xlYW4iLAogICAgICAgICJ0cmFuc3BhcmVudCI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5CaW5kT3B0aW9ucyIKICAgIH0sCiAgICAiSEwuQm94IjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJoIjogIm51bWJlciIsCiAgICAgICAgInciOiAibnVtYmVyIiwKICAgICAgICAieCI6ICJudW1iZXIiLAogICAgICAgICJ5IjogIm51bWJlciIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQm94IgogICAgfSwKICAgICJITC5Db25maWdPcHQiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFuaW1hdGlvbnMiOiAiSEwuQ29uZmlnT3B0LkFuaW1hdGlvbnMiLAogICAgICAgICJiaW5kcyI6ICJITC5Db25maWdPcHQuQmluZHMiLAogICAgICAgICJjdXJzb3IiOiAiSEwuQ29uZmlnT3B0LkN1cnNvciIsCiAgICAgICAgImRlYnVnIjogIkhMLkNvbmZpZ09wdC5EZWJ1ZyIsCiAgICAgICAgImRlY29yYXRpb24iOiAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24iLAogICAgICAgICJkd2luZGxlIjogIkhMLkNvbmZpZ09wdC5Ed2luZGxlIiwKICAgICAgICAiZWNvc3lzdGVtIjogIkhMLkNvbmZpZ09wdC5FY29zeXN0ZW0iLAogICAgICAgICJleHBlcmltZW50YWwiOiAiSEwuQ29uZmlnT3B0LkV4cGVyaW1lbnRhbCIsCiAgICAgICAgImdlbmVyYWwiOiAiSEwuQ29uZmlnT3B0LkdlbmVyYWwiLAogICAgICAgICJnZXN0dXJlcyI6ICJITC5Db25maWdPcHQuR2VzdHVyZXMiLAogICAgICAgICJncm91cCI6ICJITC5Db25maWdPcHQuR3JvdXAiLAogICAgICAgICJpbnB1dCI6ICJITC5Db25maWdPcHQuSW5wdXQiLAogICAgICAgICJpbnB1dF9jYXB0dXJlIjogIkhMLkNvbmZpZ09wdC5JbnB1dENhcHR1cmUiLAogICAgICAgICJsYXlvdXQiOiAiSEwuQ29uZmlnT3B0LkxheW91dCIsCiAgICAgICAgIm1hc3RlciI6ICJITC5Db25maWdPcHQuTWFzdGVyIiwKICAgICAgICAibWlzYyI6ICJITC5Db25maWdPcHQuTWlzYyIsCiAgICAgICAgIm9wZW5nbCI6ICJITC5Db25maWdPcHQuT3BlbkdMIiwKICAgICAgICAicXVpcmtzIjogIkhMLkNvbmZpZ09wdC5RdWlya3MiLAogICAgICAgICJyZW5kZXIiOiAiSEwuQ29uZmlnT3B0LlJlbmRlciIsCiAgICAgICAgInNjcm9sbGluZyI6ICJITC5Db25maWdPcHQuU2Nyb2xsaW5nIiwKICAgICAgICAieHdheWxhbmQiOiAiSEwuQ29uZmlnT3B0Llh3YXlsYW5kIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5BbmltYXRpb25zIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJlbmFibGVkIjogImJvb2xlYW4iLAogICAgICAgICJ3b3Jrc3BhY2Vfd3JhcGFyb3VuZCI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuQW5pbWF0aW9ucyIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0LkJpbmRzIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhbGxvd19waW5fZnVsbHNjcmVlbiI6ICJib29sZWFuIiwKICAgICAgICAiYWxsb3dfd29ya3NwYWNlX2N5Y2xlcyI6ICJib29sZWFuIiwKICAgICAgICAiZGlzYWJsZV9rZXliaW5kX2dyYWJiaW5nIjogImJvb2xlYW4iLAogICAgICAgICJkcmFnX3RocmVzaG9sZCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJmb2N1c19wcmVmZXJyZWRfbWV0aG9kIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImhpZGVfc3BlY2lhbF9vbl93b3Jrc3BhY2VfY2hhbmdlIjogImJvb2xlYW4iLAogICAgICAgICJpZ25vcmVfZ3JvdXBfbG9jayI6ICJib29sZWFuIiwKICAgICAgICAibW92ZWZvY3VzX2N5Y2xlc19mdWxsc2NyZWVuIjogImJvb2xlYW4iLAogICAgICAgICJtb3ZlZm9jdXNfY3ljbGVzX2dyb3VwZmlyc3QiOiAiYm9vbGVhbiIsCiAgICAgICAgInBhc3NfbW91c2Vfd2hlbl9ib3VuZCI6ICJib29sZWFuIiwKICAgICAgICAic2Nyb2xsX2V2ZW50X2RlbGF5IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIndpbmRvd19kaXJlY3Rpb25fbW9uaXRvcl9mYWxsYmFjayI6ICJib29sZWFuIiwKICAgICAgICAid29ya3NwYWNlX2JhY2tfYW5kX2ZvcnRoIjogImJvb2xlYW4iLAogICAgICAgICJ3b3Jrc3BhY2VfY2VudGVyX29uIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkJpbmRzIgogICAgfSwKICAgICJITC5Db25maWdPcHQuQ3Vyc29yIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJkZWZhdWx0X21vbml0b3IiOiAic3RyaW5nIiwKICAgICAgICAiZW5hYmxlX2h5cHJjdXJzb3IiOiAiYm9vbGVhbiIsCiAgICAgICAgImhpZGVfb25fa2V5X3ByZXNzIjogImJvb2xlYW4iLAogICAgICAgICJoaWRlX29uX3RhYmxldCI6ICJib29sZWFuIiwKICAgICAgICAiaGlkZV9vbl90b3VjaCI6ICJib29sZWFuIiwKICAgICAgICAiaG90c3BvdF9wYWRkaW5nIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImluYWN0aXZlX3RpbWVvdXQiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJpbnZpc2libGUiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pbl9yZWZyZXNoX3JhdGUiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAibm9fYnJlYWtfZnNfdnJyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm5vX2hhcmR3YXJlX2N1cnNvcnMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAibm9fd2FycHMiOiAiYm9vbGVhbiIsCiAgICAgICAgInBlcnNpc3RlbnRfd2FycHMiOiAiYm9vbGVhbiIsCiAgICAgICAgInN5bmNfZ3NldHRpbmdzX3RoZW1lIjogImJvb2xlYW4iLAogICAgICAgICJ1c2VfY3B1X2J1ZmZlciI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJ3YXJwX2JhY2tfYWZ0ZXJfbm9uX21vdXNlX2lucHV0IjogImJvb2xlYW4iLAogICAgICAgICJ3YXJwX29uX2NoYW5nZV93b3Jrc3BhY2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAid2FycF9vbl90b2dnbGVfc3BlY2lhbCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJ6b29tX2RldGFjaGVkX2NhbWVyYSI6ICJib29sZWFuIiwKICAgICAgICAiem9vbV9kaXNhYmxlX2FhIjogImJvb2xlYW4iLAogICAgICAgICJ6b29tX2ZhY3RvciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgInpvb21fcmlnaWQiOiAiYm9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkN1cnNvciIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0LkRlYnVnIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJjb2xvcmVkX3N0ZG91dF9sb2dzIjogImJvb2xlYW4iLAogICAgICAgICJkYW1hZ2VfYmxpbmsiOiAiYm9vbGVhbiIsCiAgICAgICAgImRhbWFnZV90cmFja2luZyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkaXNhYmxlX2xvZ3MiOiAiYm9vbGVhbiIsCiAgICAgICAgImRpc2FibGVfc2NhbGVfY2hlY2tzIjogImJvb2xlYW4iLAogICAgICAgICJkaXNhYmxlX3RpbWUiOiAiYm9vbGVhbiIsCiAgICAgICAgImRzX2hhbmRsZV9zYW1lX2J1ZmZlciI6ICJib29sZWFuIiwKICAgICAgICAiZHNfaGFuZGxlX3NhbWVfYnVmZmVyX2ZpZm8iOiAiYm9vbGVhbiIsCiAgICAgICAgImVuYWJsZV9zdGRvdXRfbG9ncyI6ICJib29sZWFuIiwKICAgICAgICAiZXJyb3JfbGltaXQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZXJyb3JfcG9zaXRpb24iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZmlmb19wZW5kaW5nX3dvcmthcm91bmQiOiAiYm9vbGVhbiIsCiAgICAgICAgImZ1bGxfY21fcHJvdG8iOiAiYm9vbGVhbiIsCiAgICAgICAgImdsX2RlYnVnZ2luZyI6ICJib29sZWFuIiwKICAgICAgICAiaW52YWxpZGF0ZV9mcDE2IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImxvZ19kYW1hZ2UiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1hbnVhbF9jcmFzaCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJvdmVybGF5IjogImJvb2xlYW4iLAogICAgICAgICJwYXNzIjogImJvb2xlYW4iLAogICAgICAgICJyZW5kZXJfc29saXRhcnlfd29fZGFtYWdlIjogImJvb2xlYW4iLAogICAgICAgICJzdXBwcmVzc19lcnJvcnMiOiAiYm9vbGVhbiIsCiAgICAgICAgInZmciI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuRGVidWciCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5EZWNvcmF0aW9uIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhY3RpdmVfb3BhY2l0eSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImJsdXIiOiAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24uQmx1ciIsCiAgICAgICAgImJvcmRlcl9wYXJ0X29mX3dpbmRvdyI6ICJib29sZWFuIiwKICAgICAgICAiZGltX2Fyb3VuZCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRpbV9pbmFjdGl2ZSI6ICJib29sZWFuIiwKICAgICAgICAiZGltX21vZGFsIjogImJvb2xlYW4iLAogICAgICAgICJkaW1fc3BlY2lhbCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRpbV9zdHJlbmd0aCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImZ1bGxzY3JlZW5fb3BhY2l0eSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdsb3ciOiAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24uR2xvdyIsCiAgICAgICAgImluYWN0aXZlX29wYWNpdHkiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJtb3Rpb25fYmx1ciI6ICJITC5Db25maWdPcHQuRGVjb3JhdGlvbi5Nb3Rpb25CbHVyIiwKICAgICAgICAicm91bmRpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicm91bmRpbmdfcG93ZXIiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzY3JlZW5fc2hhZGVyIjogInN0cmluZyIsCiAgICAgICAgInNoYWRvdyI6ICJITC5Db25maWdPcHQuRGVjb3JhdGlvbi5TaGFkb3ciCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5EZWNvcmF0aW9uIgogICAgfSwKICAgICJITC5Db25maWdPcHQuRGVjb3JhdGlvbi5CbHVyIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJicmlnaHRuZXNzIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiY29udHJhc3QiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJlbmFibGVkIjogImJvb2xlYW4iLAogICAgICAgICJpZ25vcmVfb3BhY2l0eSI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXRfbWV0aG9kcyI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXRfbWV0aG9kc19pZ25vcmVhbHBoYSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm5ld19vcHRpbWl6YXRpb25zIjogImJvb2xlYW4iLAogICAgICAgICJub2lzZSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgInBhc3NlcyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJwb3B1cHMiOiAiYm9vbGVhbiIsCiAgICAgICAgInBvcHVwc19pZ25vcmVhbHBoYSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgInNpemUiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAic3BlY2lhbCI6ICJib29sZWFuIiwKICAgICAgICAidmlicmFuY3kiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJ2aWJyYW5jeV9kYXJrbmVzcyI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgInhyYXkiOiAiYm9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24uQmx1ciIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24uR2xvdyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiY29sb3IiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiY29sb3JfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAicmFuZ2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicmVuZGVyX3Bvd2VyIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24uR2xvdyIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24uTW90aW9uQmx1ciI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAic2FtcGxlcyI6ICJpbnRlZ2VyfGJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5EZWNvcmF0aW9uLk1vdGlvbkJsdXIiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5EZWNvcmF0aW9uLlNoYWRvdyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiY29sb3IiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiY29sb3JfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAib2Zmc2V0IjogIkhMLlZlYzJMaWtlIiwKICAgICAgICAicmFuZ2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicmVuZGVyX3Bvd2VyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInNjYWxlIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAic2hhcnAiOiAiYm9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkRlY29yYXRpb24uU2hhZG93IgogICAgfSwKICAgICJITC5Db25maWdPcHQuRHdpbmRsZSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiZGVmYXVsdF9zcGxpdF9yYXRpbyI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImZvcmNlX3NwbGl0IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInBlcm1hbmVudF9kaXJlY3Rpb25fb3ZlcnJpZGUiOiAiYm9vbGVhbiIsCiAgICAgICAgInByZWNpc2VfbW91c2VfbW92ZSI6ICJib29sZWFuIiwKICAgICAgICAicHJlc2VydmVfc3BsaXQiOiAiYm9vbGVhbiIsCiAgICAgICAgInNtYXJ0X3Jlc2l6aW5nIjogImJvb2xlYW4iLAogICAgICAgICJzbWFydF9zcGxpdCI6ICJib29sZWFuIiwKICAgICAgICAic3BlY2lhbF9zY2FsZV9mYWN0b3IiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzcGxpdF9iaWFzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInNwbGl0X3dpZHRoX211bHRpcGxpZXIiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJ1c2VfYWN0aXZlX2Zvcl9zcGxpdHMiOiAiYm9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkR3aW5kbGUiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5FY29zeXN0ZW0iOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImVuZm9yY2VfcGVybWlzc2lvbnMiOiAiYm9vbGVhbiIsCiAgICAgICAgIm5vX2RvbmF0aW9uX25hZyI6ICJib29sZWFuIiwKICAgICAgICAibm9fdXBkYXRlX25ld3MiOiAiYm9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkVjb3N5c3RlbSIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0LkV4cGVyaW1lbnRhbCI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAid3BfY21fMV8yIjogImJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5FeHBlcmltZW50YWwiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5HZW5lcmFsIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhbGxvd190ZWFyaW5nIjogImJvb2xlYW4iLAogICAgICAgICJib3JkZXJfc2l6ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJjb2wiOiAiSEwuQ29uZmlnT3B0LkdlbmVyYWwuQ29sIiwKICAgICAgICAiZXh0ZW5kX2JvcmRlcl9ncmFiX2FyZWEiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZmxvYXRfZ2FwcyI6ICJpbnRlZ2VyfEhMLkNzc0dhcCIsCiAgICAgICAgImdhcHNfaW4iOiAiaW50ZWdlcnxITC5Dc3NHYXAiLAogICAgICAgICJnYXBzX291dCI6ICJpbnRlZ2VyfEhMLkNzc0dhcCIsCiAgICAgICAgImdhcHNfd29ya3NwYWNlcyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJob3Zlcl9pY29uX29uX2JvcmRlciI6ICJib29sZWFuIiwKICAgICAgICAibGF5b3V0IjogInN0cmluZyIsCiAgICAgICAgImxvY2FsZSI6ICJzdHJpbmciLAogICAgICAgICJtb2RhbF9wYXJlbnRfYmxvY2tpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgIm5vX2ZvY3VzX2ZhbGxiYWNrIjogImJvb2xlYW4iLAogICAgICAgICJyZXNpemVfY29ybmVyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInJlc2l6ZV9vbl9ib3JkZXIiOiAiYm9vbGVhbiIsCiAgICAgICAgInNuYXAiOiAiSEwuQ29uZmlnT3B0LkdlbmVyYWwuU25hcCIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkdlbmVyYWwiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5HZW5lcmFsLkNvbCI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYWN0aXZlX2JvcmRlciI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJpbmFjdGl2ZV9ib3JkZXIiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAibm9ncm91cF9ib3JkZXIiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAibm9ncm91cF9ib3JkZXJfYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkdlbmVyYWwuQ29sIgogICAgfSwKICAgICJITC5Db25maWdPcHQuR2VuZXJhbC5TbmFwIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJib3JkZXJfb3ZlcmxhcCI6ICJib29sZWFuIiwKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAibW9uaXRvcl9nYXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicmVzcGVjdF9nYXBzIjogImJvb2xlYW4iLAogICAgICAgICJ3aW5kb3dfZ2FwIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LkdlbmVyYWwuU25hcCIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0Lkdlc3R1cmVzIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJjbG9zZV9tYXhfdGltZW91dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxpbmciOiAiSEwuQ29uZmlnT3B0Lkdlc3R1cmVzLlNjcm9sbGluZyIsCiAgICAgICAgIndvcmtzcGFjZV9zd2lwZV9jYW5jZWxfcmF0aW8iOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJ3b3Jrc3BhY2Vfc3dpcGVfY3JlYXRlX25ldyI6ICJib29sZWFuIiwKICAgICAgICAid29ya3NwYWNlX3N3aXBlX2RpcmVjdGlvbl9sb2NrIjogImJvb2xlYW4iLAogICAgICAgICJ3b3Jrc3BhY2Vfc3dpcGVfZGlyZWN0aW9uX2xvY2tfdGhyZXNob2xkIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIndvcmtzcGFjZV9zd2lwZV9kaXN0YW5jZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJ3b3Jrc3BhY2Vfc3dpcGVfZm9yZXZlciI6ICJib29sZWFuIiwKICAgICAgICAid29ya3NwYWNlX3N3aXBlX2ludmVydCI6ICJib29sZWFuIiwKICAgICAgICAid29ya3NwYWNlX3N3aXBlX21pbl9zcGVlZF90b19mb3JjZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJ3b3Jrc3BhY2Vfc3dpcGVfdG91Y2giOiAiYm9vbGVhbiIsCiAgICAgICAgIndvcmtzcGFjZV9zd2lwZV90b3VjaF9pbnZlcnQiOiAiYm9vbGVhbiIsCiAgICAgICAgIndvcmtzcGFjZV9zd2lwZV91c2VfciI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuR2VzdHVyZXMiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5HZXN0dXJlcy5TY3JvbGxpbmciOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgIm1vdmVfc25hcF9jdXJzb3IiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1vdmVfc25hcF90b19ncmlkIjogImJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5HZXN0dXJlcy5TY3JvbGxpbmciCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5Hcm91cCI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYXV0b19ncm91cCI6ICJib29sZWFuIiwKICAgICAgICAiY29sIjogIkhMLkNvbmZpZ09wdC5Hcm91cC5Db2wiLAogICAgICAgICJkcmFnX2ludG9fZ3JvdXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZm9jdXNfcmVtb3ZlZF93aW5kb3ciOiAiYm9vbGVhbiIsCiAgICAgICAgImdyb3VwX29uX21vdmV0b3dvcmtzcGFjZSI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXBiYXIiOiAiSEwuQ29uZmlnT3B0Lkdyb3VwLkdyb3VwYmFyIiwKICAgICAgICAiaW5zZXJ0X2FmdGVyX2N1cnJlbnQiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1lcmdlX2Zsb2F0ZWRfaW50b190aWxlZF9vbl9ncm91cGJhciI6ICJib29sZWFuIiwKICAgICAgICAibWVyZ2VfZ3JvdXBzX29uX2RyYWciOiAiYm9vbGVhbiIsCiAgICAgICAgIm1lcmdlX2dyb3Vwc19vbl9ncm91cGJhciI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuR3JvdXAiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5Hcm91cC5Db2wiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImJvcmRlcl9hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiYm9yZGVyX2luYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAgICAgImJvcmRlcl9sb2NrZWRfYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAgICAgImJvcmRlcl9sb2NrZWRfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuR3JvdXAuQ29sIgogICAgfSwKICAgICJITC5Db25maWdPcHQuR3JvdXAuR3JvdXBiYXIiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImJsdXIiOiAiYm9vbGVhbiIsCiAgICAgICAgImNvbCI6ICJITC5Db25maWdPcHQuR3JvdXAuR3JvdXBiYXIuQ29sIiwKICAgICAgICAiZGlzYWJsZV93aGVuX29ubHkiOiAiYm9vbGVhbiIsCiAgICAgICAgImVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImZvbnRfZmFtaWx5IjogInN0cmluZyIsCiAgICAgICAgImZvbnRfc2l6ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJmb250X3dlaWdodF9hY3RpdmUiOiAiaW50ZWdlcnxzdHJpbmciLAogICAgICAgICJmb250X3dlaWdodF9pbmFjdGl2ZSI6ICJpbnRlZ2VyfHN0cmluZyIsCiAgICAgICAgImdhcHNfaW4iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2Fwc19vdXQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ3JhZGllbnRfcm91bmRfb25seV9lZGdlcyI6ICJib29sZWFuIiwKICAgICAgICAiZ3JhZGllbnRfcm91bmRpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ3JhZGllbnRfcm91bmRpbmdfcG93ZXIiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJncmFkaWVudHMiOiAiYm9vbGVhbiIsCiAgICAgICAgImhlaWdodCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJpbmRpY2F0b3JfZ2FwIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImluZGljYXRvcl9oZWlnaHQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAia2VlcF91cHBlcl9nYXAiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pZGRsZV9jbGlja19jbG9zZSI6ICJib29sZWFuIiwKICAgICAgICAicHJpb3JpdHkiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicmVuZGVyX3RpdGxlcyI6ICJib29sZWFuIiwKICAgICAgICAicm91bmRfb25seV9lZGdlcyI6ICJib29sZWFuIiwKICAgICAgICAicm91bmRpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicm91bmRpbmdfcG93ZXIiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgInN0YWNrZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgInRleHRfY29sb3IiOiAic3RyaW5nIiwKICAgICAgICAidGV4dF9jb2xvcl9pbmFjdGl2ZSI6ICJzdHJpbmciLAogICAgICAgICJ0ZXh0X2NvbG9yX2xvY2tlZF9hY3RpdmUiOiAic3RyaW5nIiwKICAgICAgICAidGV4dF9jb2xvcl9sb2NrZWRfaW5hY3RpdmUiOiAic3RyaW5nIiwKICAgICAgICAidGV4dF9vZmZzZXQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAidGV4dF9wYWRkaW5nIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0Lkdyb3VwLkdyb3VwYmFyIgogICAgfSwKICAgICJITC5Db25maWdPcHQuR3JvdXAuR3JvdXBiYXIuQ29sIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAibG9ja2VkX2FjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJsb2NrZWRfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuR3JvdXAuR3JvdXBiYXIuQ29sIgogICAgfSwKICAgICJITC5Db25maWdPcHQuSW5wdXQiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFjY2VsX3Byb2ZpbGUiOiAic3RyaW5nIiwKICAgICAgICAiZW11bGF0ZV9kaXNjcmV0ZV9zY3JvbGwiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZmxvYXRfc3dpdGNoX292ZXJyaWRlX2ZvY3VzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImZvY3VzX29uX2Nsb3NlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImZvbGxvd19tb3VzZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJmb2xsb3dfbW91c2Vfc2hyaW5rIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImZvbGxvd19tb3VzZV90aHJlc2hvbGQiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJmb3JjZV9ub19hY2NlbCI6ICJib29sZWFuIiwKICAgICAgICAia2JfZmlsZSI6ICJzdHJpbmciLAogICAgICAgICJrYl9sYXlvdXQiOiAic3RyaW5nIiwKICAgICAgICAia2JfbW9kZWwiOiAic3RyaW5nIiwKICAgICAgICAia2Jfb3B0aW9ucyI6ICJzdHJpbmciLAogICAgICAgICJrYl9ydWxlcyI6ICJzdHJpbmciLAogICAgICAgICJrYl92YXJpYW50IjogInN0cmluZyIsCiAgICAgICAgImxlZnRfaGFuZGVkIjogImJvb2xlYW4iLAogICAgICAgICJtb3VzZV9yZWZvY3VzIjogImJvb2xlYW4iLAogICAgICAgICJuYXR1cmFsX3Njcm9sbCI6ICJib29sZWFuIiwKICAgICAgICAibnVtbG9ja19ieV9kZWZhdWx0IjogImJvb2xlYW4iLAogICAgICAgICJvZmZfd2luZG93X2F4aXNfZXZlbnRzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInJlcGVhdF9kZWxheSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJyZXBlYXRfcmF0ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJyZXNvbHZlX2JpbmRzX2J5X3N5bSI6ICJib29sZWFuIiwKICAgICAgICAicm90YXRpb24iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAic2Nyb2xsX2J1dHRvbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxfYnV0dG9uX2xvY2siOiAiYm9vbGVhbiIsCiAgICAgICAgInNjcm9sbF9mYWN0b3IiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxfbWV0aG9kIjogInN0cmluZyIsCiAgICAgICAgInNjcm9sbF9wb2ludHMiOiAic3RyaW5nIiwKICAgICAgICAic2Vuc2l0aXZpdHkiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzcGVjaWFsX2ZhbGx0aHJvdWdoIjogImJvb2xlYW4iLAogICAgICAgICJ0YWJsZXQiOiAiSEwuQ29uZmlnT3B0LklucHV0LlRhYmxldCIsCiAgICAgICAgInRhYmxldHRvb2wiOiAiSEwuQ29uZmlnT3B0LklucHV0LlRhYmxldHRvb2wiLAogICAgICAgICJ0b3VjaGRldmljZSI6ICJITC5Db25maWdPcHQuSW5wdXQuVG91Y2hkZXZpY2UiLAogICAgICAgICJ0b3VjaHBhZCI6ICJITC5Db25maWdPcHQuSW5wdXQuVG91Y2hwYWQiLAogICAgICAgICJ2aXJ0dWFsa2V5Ym9hcmQiOiAiSEwuQ29uZmlnT3B0LklucHV0LlZpcnR1YWxrZXlib2FyZCIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LklucHV0IgogICAgfSwKICAgICJITC5Db25maWdPcHQuSW5wdXQuVGFibGV0IjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhYnNvbHV0ZV9yZWdpb25fcG9zaXRpb24iOiAiYm9vbGVhbiIsCiAgICAgICAgImFjdGl2ZV9hcmVhX3Bvc2l0aW9uIjogIkhMLlZlYzJMaWtlIiwKICAgICAgICAiYWN0aXZlX2FyZWFfc2l6ZSI6ICJITC5WZWMyTGlrZSIsCiAgICAgICAgImxlZnRfaGFuZGVkIjogImJvb2xlYW4iLAogICAgICAgICJvdXRwdXQiOiAic3RyaW5nIiwKICAgICAgICAicmVnaW9uX3Bvc2l0aW9uIjogIkhMLlZlYzJMaWtlIiwKICAgICAgICAicmVnaW9uX3NpemUiOiAiSEwuVmVjMkxpa2UiLAogICAgICAgICJyZWxhdGl2ZV9pbnB1dCI6ICJib29sZWFuIiwKICAgICAgICAidHJhbnNmb3JtIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LklucHV0LlRhYmxldCIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0LklucHV0LlRhYmxldHRvb2wiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImVyYXNlcl9idXR0b25fbW9kZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJlcmFzZXJfYnV0dG9uX292ZXJyaWRlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInByZXNzdXJlX3JhbmdlX21heCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgInByZXNzdXJlX3JhbmdlX21pbiI6ICJudW1iZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LklucHV0LlRhYmxldHRvb2wiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5JbnB1dC5Ub3VjaGRldmljZSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAib3V0cHV0IjogInN0cmluZyIsCiAgICAgICAgInRyYW5zZm9ybSI6ICJpbnRlZ2VyfGJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5JbnB1dC5Ub3VjaGRldmljZSIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0LklucHV0LlRvdWNocGFkIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJjbGlja2Zpbmdlcl9iZWhhdmlvciI6ICJib29sZWFuIiwKICAgICAgICAiZGlzYWJsZV93aGlsZV90eXBpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgImRyYWdfM2ZnIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRyYWdfbG9jayI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJmbGlwX3giOiAiYm9vbGVhbiIsCiAgICAgICAgImZsaXBfeSI6ICJib29sZWFuIiwKICAgICAgICAibWlkZGxlX2J1dHRvbl9lbXVsYXRpb24iOiAiYm9vbGVhbiIsCiAgICAgICAgIm5hdHVyYWxfc2Nyb2xsIjogImJvb2xlYW4iLAogICAgICAgICJzY3JvbGxfZmFjdG9yIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAidGFwX2FuZF9kcmFnIjogImJvb2xlYW4iLAogICAgICAgICJ0YXBfYnV0dG9uX21hcCI6ICJzdHJpbmciLAogICAgICAgICJ0YXBfdG9fY2xpY2siOiAiYm9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0LklucHV0LlRvdWNocGFkIgogICAgfSwKICAgICJITC5Db25maWdPcHQuSW5wdXQuVmlydHVhbGtleWJvYXJkIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJyZWxlYXNlX3ByZXNzZWRfb25fY2xvc2UiOiAiYm9vbGVhbiIsCiAgICAgICAgInNoYXJlX3N0YXRlcyI6ICJpbnRlZ2VyfGJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5JbnB1dC5WaXJ0dWFsa2V5Ym9hcmQiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5JbnB1dENhcHR1cmUiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImNhcHR1cmVfbW9kaWZpZXJzIjogImJvb2xlYW4iLAogICAgICAgICJlbmZvcmNlX2JhcnJpZXJzIjogImJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5JbnB1dENhcHR1cmUiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5MYXlvdXQiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgInNpbmdsZV93aW5kb3dfYXNwZWN0X3JhdGlvIjogIkhMLlZlYzJMaWtlIiwKICAgICAgICAic2luZ2xlX3dpbmRvd19hc3BlY3RfcmF0aW9fdG9sZXJhbmNlIjogIm51bWJlcnxib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuTGF5b3V0IgogICAgfSwKICAgICJITC5Db25maWdPcHQuTWFzdGVyIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhbGxvd19zbWFsbF9zcGxpdCI6ICJib29sZWFuIiwKICAgICAgICAiYWx3YXlzX2tlZXBfcG9zaXRpb24iOiAiYm9vbGVhbiIsCiAgICAgICAgImNlbnRlcl9pZ25vcmVzX3Jlc2VydmVkIjogImJvb2xlYW4iLAogICAgICAgICJjZW50ZXJfbWFzdGVyX2ZhbGxiYWNrIjogInN0cmluZyIsCiAgICAgICAgImRyb3BfYXRfY3Vyc29yIjogImJvb2xlYW4iLAogICAgICAgICJmb2N1c19tYXN0ZXJfb25fY2xvc2UiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1mYWN0IjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAibmV3X29uX2FjdGl2ZSI6ICJzdHJpbmciLAogICAgICAgICJuZXdfb25fdG9wIjogImJvb2xlYW4iLAogICAgICAgICJuZXdfc3RhdHVzIjogInN0cmluZyIsCiAgICAgICAgIm9yaWVudGF0aW9uIjogInN0cmluZyIsCiAgICAgICAgInNsYXZlX2NvdW50X2Zvcl9jZW50ZXJfbWFzdGVyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInNtYXJ0X3Jlc2l6aW5nIjogImJvb2xlYW4iLAogICAgICAgICJzcGVjaWFsX3NjYWxlX2ZhY3RvciI6ICJudW1iZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0Lk1hc3RlciIKICAgIH0sCiAgICAiSEwuQ29uZmlnT3B0Lk1pc2MiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFsbG93X3Nlc3Npb25fbG9ja19yZXN0b3JlIjogImJvb2xlYW4iLAogICAgICAgICJhbHdheXNfZm9sbG93X29uX2RuZCI6ICJib29sZWFuIiwKICAgICAgICAiYW5pbWF0ZV9tYW51YWxfcmVzaXplcyI6ICJib29sZWFuIiwKICAgICAgICAiYW5pbWF0ZV9tb3VzZV93aW5kb3dkcmFnZ2luZyI6ICJib29sZWFuIiwKICAgICAgICAiYW5yX21pc3NlZF9waW5ncyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJiYWNrZ3JvdW5kX2NvbG9yIjogInN0cmluZyIsCiAgICAgICAgImNsb3NlX3NwZWNpYWxfb25fZW1wdHkiOiAiYm9vbGVhbiIsCiAgICAgICAgImNvbCI6ICJITC5Db25maWdPcHQuTWlzYy5Db2wiLAogICAgICAgICJkaXNhYmxlX2F1dG9yZWxvYWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImRpc2FibGVfaHlwcmxhbmRfZ3VpdXRpbHNfY2hlY2siOiAiYm9vbGVhbiIsCiAgICAgICAgImRpc2FibGVfaHlwcmxhbmRfbG9nbyI6ICJib29sZWFuIiwKICAgICAgICAiZGlzYWJsZV9zY2FsZV9ub3RpZmljYXRpb24iOiAiYm9vbGVhbiIsCiAgICAgICAgImRpc2FibGVfc3BsYXNoX3JlbmRlcmluZyI6ICJib29sZWFuIiwKICAgICAgICAiZGlzYWJsZV93YXRjaGRvZ193YXJuaW5nIjogImJvb2xlYW4iLAogICAgICAgICJkaXNhYmxlX3hkZ19lbnZfY2hlY2tzIjogImJvb2xlYW4iLAogICAgICAgICJlbmFibGVfYW5yX2RpYWxvZyI6ICJib29sZWFuIiwKICAgICAgICAiZW5hYmxlX3N3YWxsb3ciOiAiYm9vbGVhbiIsCiAgICAgICAgImV4aXRfd2luZG93X3JldGFpbnNfZnVsbHNjcmVlbiI6ICJib29sZWFuIiwKICAgICAgICAiZm9jdXNfb25fYWN0aXZhdGUiOiAiYm9vbGVhbiIsCiAgICAgICAgImZvbnRfZmFtaWx5IjogInN0cmluZyIsCiAgICAgICAgImZvcmNlX2RlZmF1bHRfd2FsbHBhcGVyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImluaXRpYWxfd29ya3NwYWNlX3Rva2VuX3RpbWVvdXQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5pdGlhbF93b3Jrc3BhY2VfdHJhY2tpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAia2V5X3ByZXNzX2VuYWJsZXNfZHBtcyI6ICJib29sZWFuIiwKICAgICAgICAibGF5ZXJzX2hvZ19rZXlib2FyZF9mb2N1cyI6ICJib29sZWFuIiwKICAgICAgICAibG9ja2RlYWRfc2NyZWVuX2RlbGF5IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm1pZGRsZV9jbGlja19wYXN0ZSI6ICJib29sZWFuIiwKICAgICAgICAibW91c2VfbW92ZV9lbmFibGVzX2RwbXMiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1vdXNlX21vdmVfZm9jdXNlc19tb25pdG9yIjogImJvb2xlYW4iLAogICAgICAgICJuYW1lX3ZrX2FmdGVyX3Byb2MiOiAiYm9vbGVhbiIsCiAgICAgICAgIm9uX2ZvY3VzX3VuZGVyX2Z1bGxzY3JlZW4iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicmVuZGVyX3VuZm9jdXNlZF9mcHMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAic2NyZWVuY29weV9mb3JjZV84YiI6ICJib29sZWFuIiwKICAgICAgICAic2Vzc2lvbl9sb2NrX2JsdXIiOiAiYm9vbGVhbiIsCiAgICAgICAgInNlc3Npb25fbG9ja194cmF5IjogImJvb2xlYW4iLAogICAgICAgICJzaXplX2xpbWl0c190aWxlZCI6ICJib29sZWFuIiwKICAgICAgICAic3BsYXNoX2ZvbnRfZmFtaWx5IjogInN0cmluZyIsCiAgICAgICAgInN3YWxsb3dfZXhjZXB0aW9uX3JlZ2V4IjogInN0cmluZyIsCiAgICAgICAgInN3YWxsb3dfcmVnZXgiOiAic3RyaW5nIiwKICAgICAgICAidnJyIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0Lk1pc2MiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5NaXNjLkNvbCI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAic3BsYXNoIjogInN0cmluZyIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0Lk1pc2MuQ29sIgogICAgfSwKICAgICJITC5Db25maWdPcHQuT3BlbkdMIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJudmlkaWFfYW50aV9mbGlja2VyIjogImJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5PcGVuR0wiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5RdWlya3MiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgInByZWZlcl9oZHIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAic2tpcF9ub25fa21zX2RtYWJ1Zl9mb3JtYXRzIjogImJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5RdWlya3MiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5SZW5kZXIiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImNtX2F1dG9faGRyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImNtX2VuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImNtX3Nkcl9lb3RmIjogInN0cmluZyIsCiAgICAgICAgImNvbW1pdF90aW1pbmdfZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAiY3RtX2FuaW1hdGlvbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkaXJlY3Rfc2Nhbm91dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJleHBhbmRfdW5kZXJzaXplZF90ZXh0dXJlcyI6ICJib29sZWFuIiwKICAgICAgICAiZnAxNl9zZHJfdGYiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaWNjX3ZjZ3RfZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAia2VlcF91bm1vZGlmaWVkX2NvcHkiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAibmV3X3JlbmRlcl9zY2hlZHVsaW5nIjogImJvb2xlYW4iLAogICAgICAgICJub25fc2hhZGVyX2NtIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm5vbl9zaGFkZXJfY21faW50ZXJvcCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJzZW5kX2NvbnRlbnRfdHlwZSI6ICJib29sZWFuIiwKICAgICAgICAidXNlX2ZwMTYiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAidXNlX3NoYWRlcl9ibHVyX2JsZW5kIjogImJvb2xlYW4iLAogICAgICAgICJ4cF9tb2RlIjogImJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkNvbmZpZ09wdC5SZW5kZXIiCiAgICB9LAogICAgIkhMLkNvbmZpZ09wdC5TY3JvbGxpbmciOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImNvbHVtbl93aWR0aCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRpcmVjdGlvbiI6ICJzdHJpbmciLAogICAgICAgICJleHBsaWNpdF9jb2x1bW5fd2lkdGhzIjogInN0cmluZyIsCiAgICAgICAgImZvY3VzX2ZpdF9tZXRob2QiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZm9sbG93X2ZvY3VzIjogImJvb2xlYW4iLAogICAgICAgICJmb2xsb3dfbWluX3Zpc2libGUiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJmdWxsc2NyZWVuX29uX29uZV9jb2x1bW4iOiAiYm9vbGVhbiIsCiAgICAgICAgIndyYXBfZm9jdXMiOiAiYm9vbGVhbiIsCiAgICAgICAgIndyYXBfc3dhcGNvbCI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdPcHQuU2Nyb2xsaW5nIgogICAgfSwKICAgICJITC5Db25maWdPcHQuWHdheWxhbmQiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImNyZWF0ZV9hYnN0cmFjdF9zb2NrZXQiOiAiYm9vbGVhbiIsCiAgICAgICAgImVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImZvcmNlX3plcm9fc2NhbGluZyI6ICJib29sZWFuIiwKICAgICAgICAidXNlX25lYXJlc3RfbmVpZ2hib3IiOiAiYm9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuQ29uZmlnT3B0Llh3YXlsYW5kIgogICAgfSwKICAgICJITC5Db25maWdWYWx1ZVR5cGVzIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhbmltYXRpb25zLmVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImFuaW1hdGlvbnMud29ya3NwYWNlX3dyYXBhcm91bmQiOiAiYm9vbGVhbiIsCiAgICAgICAgImJpbmRzLmFsbG93X3Bpbl9mdWxsc2NyZWVuIjogImJvb2xlYW4iLAogICAgICAgICJiaW5kcy5hbGxvd193b3Jrc3BhY2VfY3ljbGVzIjogImJvb2xlYW4iLAogICAgICAgICJiaW5kcy5kaXNhYmxlX2tleWJpbmRfZ3JhYmJpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgImJpbmRzLmRyYWdfdGhyZXNob2xkIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImJpbmRzLmZvY3VzX3ByZWZlcnJlZF9tZXRob2QiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiYmluZHMuaGlkZV9zcGVjaWFsX29uX3dvcmtzcGFjZV9jaGFuZ2UiOiAiYm9vbGVhbiIsCiAgICAgICAgImJpbmRzLmlnbm9yZV9ncm91cF9sb2NrIjogImJvb2xlYW4iLAogICAgICAgICJiaW5kcy5tb3ZlZm9jdXNfY3ljbGVzX2Z1bGxzY3JlZW4iOiAiYm9vbGVhbiIsCiAgICAgICAgImJpbmRzLm1vdmVmb2N1c19jeWNsZXNfZ3JvdXBmaXJzdCI6ICJib29sZWFuIiwKICAgICAgICAiYmluZHMucGFzc19tb3VzZV93aGVuX2JvdW5kIjogImJvb2xlYW4iLAogICAgICAgICJiaW5kcy5zY3JvbGxfZXZlbnRfZGVsYXkiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiYmluZHMud2luZG93X2RpcmVjdGlvbl9tb25pdG9yX2ZhbGxiYWNrIjogImJvb2xlYW4iLAogICAgICAgICJiaW5kcy53b3Jrc3BhY2VfYmFja19hbmRfZm9ydGgiOiAiYm9vbGVhbiIsCiAgICAgICAgImJpbmRzLndvcmtzcGFjZV9jZW50ZXJfb24iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiY3Vyc29yLmRlZmF1bHRfbW9uaXRvciI6ICJzdHJpbmciLAogICAgICAgICJjdXJzb3IuZW5hYmxlX2h5cHJjdXJzb3IiOiAiYm9vbGVhbiIsCiAgICAgICAgImN1cnNvci5oaWRlX29uX2tleV9wcmVzcyI6ICJib29sZWFuIiwKICAgICAgICAiY3Vyc29yLmhpZGVfb25fdGFibGV0IjogImJvb2xlYW4iLAogICAgICAgICJjdXJzb3IuaGlkZV9vbl90b3VjaCI6ICJib29sZWFuIiwKICAgICAgICAiY3Vyc29yLmhvdHNwb3RfcGFkZGluZyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJjdXJzb3IuaW5hY3RpdmVfdGltZW91dCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImN1cnNvci5pbnZpc2libGUiOiAiYm9vbGVhbiIsCiAgICAgICAgImN1cnNvci5taW5fcmVmcmVzaF9yYXRlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImN1cnNvci5ub19icmVha19mc192cnIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiY3Vyc29yLm5vX2hhcmR3YXJlX2N1cnNvcnMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiY3Vyc29yLm5vX3dhcnBzIjogImJvb2xlYW4iLAogICAgICAgICJjdXJzb3IucGVyc2lzdGVudF93YXJwcyI6ICJib29sZWFuIiwKICAgICAgICAiY3Vyc29yLnN5bmNfZ3NldHRpbmdzX3RoZW1lIjogImJvb2xlYW4iLAogICAgICAgICJjdXJzb3IudXNlX2NwdV9idWZmZXIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiY3Vyc29yLndhcnBfYmFja19hZnRlcl9ub25fbW91c2VfaW5wdXQiOiAiYm9vbGVhbiIsCiAgICAgICAgImN1cnNvci53YXJwX29uX2NoYW5nZV93b3Jrc3BhY2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiY3Vyc29yLndhcnBfb25fdG9nZ2xlX3NwZWNpYWwiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiY3Vyc29yLnpvb21fZGV0YWNoZWRfY2FtZXJhIjogImJvb2xlYW4iLAogICAgICAgICJjdXJzb3Iuem9vbV9kaXNhYmxlX2FhIjogImJvb2xlYW4iLAogICAgICAgICJjdXJzb3Iuem9vbV9mYWN0b3IiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJjdXJzb3Iuem9vbV9yaWdpZCI6ICJib29sZWFuIiwKICAgICAgICAiZGVidWcuY29sb3JlZF9zdGRvdXRfbG9ncyI6ICJib29sZWFuIiwKICAgICAgICAiZGVidWcuZGFtYWdlX2JsaW5rIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5kYW1hZ2VfdHJhY2tpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZGVidWcuZGlzYWJsZV9sb2dzIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5kaXNhYmxlX3NjYWxlX2NoZWNrcyI6ICJib29sZWFuIiwKICAgICAgICAiZGVidWcuZGlzYWJsZV90aW1lIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5kc19oYW5kbGVfc2FtZV9idWZmZXIiOiAiYm9vbGVhbiIsCiAgICAgICAgImRlYnVnLmRzX2hhbmRsZV9zYW1lX2J1ZmZlcl9maWZvIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5lbmFibGVfc3Rkb3V0X2xvZ3MiOiAiYm9vbGVhbiIsCiAgICAgICAgImRlYnVnLmVycm9yX2xpbWl0IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlYnVnLmVycm9yX3Bvc2l0aW9uIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlYnVnLmZpZm9fcGVuZGluZ193b3JrYXJvdW5kIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5mdWxsX2NtX3Byb3RvIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5nbF9kZWJ1Z2dpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgImRlYnVnLmludmFsaWRhdGVfZnAxNiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5sb2dfZGFtYWdlIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy5tYW51YWxfY3Jhc2giOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZGVidWcub3ZlcmxheSI6ICJib29sZWFuIiwKICAgICAgICAiZGVidWcucGFzcyI6ICJib29sZWFuIiwKICAgICAgICAiZGVidWcucmVuZGVyX3NvbGl0YXJ5X3dvX2RhbWFnZSI6ICJib29sZWFuIiwKICAgICAgICAiZGVidWcuc3VwcHJlc3NfZXJyb3JzIjogImJvb2xlYW4iLAogICAgICAgICJkZWJ1Zy52ZnIiOiAiYm9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYWN0aXZlX29wYWNpdHkiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIuYnJpZ2h0bmVzcyI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5jb250cmFzdCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5lbmFibGVkIjogImJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIuaWdub3JlX29wYWNpdHkiOiAiYm9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5pbnB1dF9tZXRob2RzIjogImJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIuaW5wdXRfbWV0aG9kc19pZ25vcmVhbHBoYSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci5uZXdfb3B0aW1pemF0aW9ucyI6ICJib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLm5vaXNlIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLnBhc3NlcyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIucG9wdXBzIjogImJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmJsdXIucG9wdXBzX2lnbm9yZWFscGhhIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLnNpemUiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5ibHVyLnNwZWNpYWwiOiAiYm9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci52aWJyYW5jeSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci52aWJyYW5jeV9kYXJrbmVzcyI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uYmx1ci54cmF5IjogImJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmJvcmRlcl9wYXJ0X29mX3dpbmRvdyI6ICJib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5kaW1fYXJvdW5kIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5kaW1faW5hY3RpdmUiOiAiYm9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uZGltX21vZGFsIjogImJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmRpbV9zcGVjaWFsIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5kaW1fc3RyZW5ndGgiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmZ1bGxzY3JlZW5fb3BhY2l0eSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uZ2xvdy5jb2xvciI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJkZWNvcmF0aW9uLmdsb3cuY29sb3JfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiZGVjb3JhdGlvbi5nbG93LmVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uZ2xvdy5yYW5nZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLmdsb3cucmVuZGVyX3Bvd2VyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uaW5hY3RpdmVfb3BhY2l0eSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24ubW90aW9uX2JsdXIuZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5tb3Rpb25fYmx1ci5zYW1wbGVzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24ucm91bmRpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5yb3VuZGluZ19wb3dlciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRpb24uc2NyZWVuX3NoYWRlciI6ICJzdHJpbmciLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5jb2xvciI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5jb2xvcl9pbmFjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5lbmFibGVkIjogImJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5vZmZzZXQiOiAiSEwuVmVjMkxpa2UiLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5yYW5nZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5yZW5kZXJfcG93ZXIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZGVjb3JhdGlvbi5zaGFkb3cuc2NhbGUiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJkZWNvcmF0aW9uLnNoYWRvdy5zaGFycCI6ICJib29sZWFuIiwKICAgICAgICAiZHdpbmRsZS5kZWZhdWx0X3NwbGl0X3JhdGlvIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiZHdpbmRsZS5mb3JjZV9zcGxpdCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkd2luZGxlLnBlcm1hbmVudF9kaXJlY3Rpb25fb3ZlcnJpZGUiOiAiYm9vbGVhbiIsCiAgICAgICAgImR3aW5kbGUucHJlY2lzZV9tb3VzZV9tb3ZlIjogImJvb2xlYW4iLAogICAgICAgICJkd2luZGxlLnByZXNlcnZlX3NwbGl0IjogImJvb2xlYW4iLAogICAgICAgICJkd2luZGxlLnNtYXJ0X3Jlc2l6aW5nIjogImJvb2xlYW4iLAogICAgICAgICJkd2luZGxlLnNtYXJ0X3NwbGl0IjogImJvb2xlYW4iLAogICAgICAgICJkd2luZGxlLnNwZWNpYWxfc2NhbGVfZmFjdG9yIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiZHdpbmRsZS5zcGxpdF9iaWFzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImR3aW5kbGUuc3BsaXRfd2lkdGhfbXVsdGlwbGllciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImR3aW5kbGUudXNlX2FjdGl2ZV9mb3Jfc3BsaXRzIjogImJvb2xlYW4iLAogICAgICAgICJlY29zeXN0ZW0uZW5mb3JjZV9wZXJtaXNzaW9ucyI6ICJib29sZWFuIiwKICAgICAgICAiZWNvc3lzdGVtLm5vX2RvbmF0aW9uX25hZyI6ICJib29sZWFuIiwKICAgICAgICAiZWNvc3lzdGVtLm5vX3VwZGF0ZV9uZXdzIjogImJvb2xlYW4iLAogICAgICAgICJleHBlcmltZW50YWwud3BfY21fMV8yIjogImJvb2xlYW4iLAogICAgICAgICJnZW5lcmFsLmFsbG93X3RlYXJpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgImdlbmVyYWwuYm9yZGVyX3NpemUiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2VuZXJhbC5jb2wuYWN0aXZlX2JvcmRlciI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJnZW5lcmFsLmNvbC5pbmFjdGl2ZV9ib3JkZXIiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiZ2VuZXJhbC5jb2wubm9ncm91cF9ib3JkZXIiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiZ2VuZXJhbC5jb2wubm9ncm91cF9ib3JkZXJfYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAgICAgImdlbmVyYWwuZXh0ZW5kX2JvcmRlcl9ncmFiX2FyZWEiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2VuZXJhbC5mbG9hdF9nYXBzIjogImludGVnZXJ8SEwuQ3NzR2FwIiwKICAgICAgICAiZ2VuZXJhbC5nYXBzX2luIjogImludGVnZXJ8SEwuQ3NzR2FwIiwKICAgICAgICAiZ2VuZXJhbC5nYXBzX291dCI6ICJpbnRlZ2VyfEhMLkNzc0dhcCIsCiAgICAgICAgImdlbmVyYWwuZ2Fwc193b3Jrc3BhY2VzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdlbmVyYWwuaG92ZXJfaWNvbl9vbl9ib3JkZXIiOiAiYm9vbGVhbiIsCiAgICAgICAgImdlbmVyYWwubGF5b3V0IjogInN0cmluZyIsCiAgICAgICAgImdlbmVyYWwubG9jYWxlIjogInN0cmluZyIsCiAgICAgICAgImdlbmVyYWwubW9kYWxfcGFyZW50X2Jsb2NraW5nIjogImJvb2xlYW4iLAogICAgICAgICJnZW5lcmFsLm5vX2ZvY3VzX2ZhbGxiYWNrIjogImJvb2xlYW4iLAogICAgICAgICJnZW5lcmFsLnJlc2l6ZV9jb3JuZXIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2VuZXJhbC5yZXNpemVfb25fYm9yZGVyIjogImJvb2xlYW4iLAogICAgICAgICJnZW5lcmFsLnNuYXAuYm9yZGVyX292ZXJsYXAiOiAiYm9vbGVhbiIsCiAgICAgICAgImdlbmVyYWwuc25hcC5lbmFibGVkIjogImJvb2xlYW4iLAogICAgICAgICJnZW5lcmFsLnNuYXAubW9uaXRvcl9nYXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2VuZXJhbC5zbmFwLnJlc3BlY3RfZ2FwcyI6ICJib29sZWFuIiwKICAgICAgICAiZ2VuZXJhbC5zbmFwLndpbmRvd19nYXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2VzdHVyZXMuY2xvc2VfbWF4X3RpbWVvdXQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2VzdHVyZXMuc2Nyb2xsaW5nLm1vdmVfc25hcF9jdXJzb3IiOiAiYm9vbGVhbiIsCiAgICAgICAgImdlc3R1cmVzLnNjcm9sbGluZy5tb3ZlX3NuYXBfdG9fZ3JpZCI6ICJib29sZWFuIiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2NhbmNlbF9yYXRpbyI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9jcmVhdGVfbmV3IjogImJvb2xlYW4iLAogICAgICAgICJnZXN0dXJlcy53b3Jrc3BhY2Vfc3dpcGVfZGlyZWN0aW9uX2xvY2siOiAiYm9vbGVhbiIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9kaXJlY3Rpb25fbG9ja190aHJlc2hvbGQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2Rpc3RhbmNlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9mb3JldmVyIjogImJvb2xlYW4iLAogICAgICAgICJnZXN0dXJlcy53b3Jrc3BhY2Vfc3dpcGVfaW52ZXJ0IjogImJvb2xlYW4iLAogICAgICAgICJnZXN0dXJlcy53b3Jrc3BhY2Vfc3dpcGVfbWluX3NwZWVkX3RvX2ZvcmNlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV90b3VjaCI6ICJib29sZWFuIiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX3RvdWNoX2ludmVydCI6ICJib29sZWFuIiwKICAgICAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX3VzZV9yIjogImJvb2xlYW4iLAogICAgICAgICJncm91cC5hdXRvX2dyb3VwIjogImJvb2xlYW4iLAogICAgICAgICJncm91cC5jb2wuYm9yZGVyX2FjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJncm91cC5jb2wuYm9yZGVyX2luYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAgICAgImdyb3VwLmNvbC5ib3JkZXJfbG9ja2VkX2FjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJncm91cC5jb2wuYm9yZGVyX2xvY2tlZF9pbmFjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJncm91cC5kcmFnX2ludG9fZ3JvdXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZm9jdXNfcmVtb3ZlZF93aW5kb3ciOiAiYm9vbGVhbiIsCiAgICAgICAgImdyb3VwLmdyb3VwX29uX21vdmV0b3dvcmtzcGFjZSI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuYmx1ciI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuY29sLmFjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJncm91cC5ncm91cGJhci5jb2wuaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuY29sLmxvY2tlZF9hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuY29sLmxvY2tlZF9pbmFjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgICAgICJncm91cC5ncm91cGJhci5kaXNhYmxlX3doZW5fb25seSI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZm9udF9mYW1pbHkiOiAic3RyaW5nIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZm9udF9zaXplIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmZvbnRfd2VpZ2h0X2FjdGl2ZSI6ICJpbnRlZ2VyfHN0cmluZyIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmZvbnRfd2VpZ2h0X2luYWN0aXZlIjogImludGVnZXJ8c3RyaW5nIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuZ2Fwc19pbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5nYXBzX291dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5ncmFkaWVudF9yb3VuZF9vbmx5X2VkZ2VzIjogImJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5ncmFkaWVudF9yb3VuZGluZyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5ncmFkaWVudF9yb3VuZGluZ19wb3dlciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmdyYWRpZW50cyI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuaGVpZ2h0IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLmluZGljYXRvcl9nYXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuaW5kaWNhdG9yX2hlaWdodCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5rZWVwX3VwcGVyX2dhcCI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIubWlkZGxlX2NsaWNrX2Nsb3NlIjogImJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5wcmlvcml0eSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5yZW5kZXJfdGl0bGVzIjogImJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5yb3VuZF9vbmx5X2VkZ2VzIjogImJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5yb3VuZGluZyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci5yb3VuZGluZ19wb3dlciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLnNjcm9sbGluZyI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIuc3RhY2tlZCI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAuZ3JvdXBiYXIudGV4dF9jb2xvciI6ICJzdHJpbmciLAogICAgICAgICJncm91cC5ncm91cGJhci50ZXh0X2NvbG9yX2luYWN0aXZlIjogInN0cmluZyIsCiAgICAgICAgImdyb3VwLmdyb3VwYmFyLnRleHRfY29sb3JfbG9ja2VkX2FjdGl2ZSI6ICJzdHJpbmciLAogICAgICAgICJncm91cC5ncm91cGJhci50ZXh0X2NvbG9yX2xvY2tlZF9pbmFjdGl2ZSI6ICJzdHJpbmciLAogICAgICAgICJncm91cC5ncm91cGJhci50ZXh0X29mZnNldCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJncm91cC5ncm91cGJhci50ZXh0X3BhZGRpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZ3JvdXAuaW5zZXJ0X2FmdGVyX2N1cnJlbnQiOiAiYm9vbGVhbiIsCiAgICAgICAgImdyb3VwLm1lcmdlX2Zsb2F0ZWRfaW50b190aWxlZF9vbl9ncm91cGJhciI6ICJib29sZWFuIiwKICAgICAgICAiZ3JvdXAubWVyZ2VfZ3JvdXBzX29uX2RyYWciOiAiYm9vbGVhbiIsCiAgICAgICAgImdyb3VwLm1lcmdlX2dyb3Vwc19vbl9ncm91cGJhciI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXQuYWNjZWxfcHJvZmlsZSI6ICJzdHJpbmciLAogICAgICAgICJpbnB1dC5lbXVsYXRlX2Rpc2NyZXRlX3Njcm9sbCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJpbnB1dC5mbG9hdF9zd2l0Y2hfb3ZlcnJpZGVfZm9jdXMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQuZm9jdXNfb25fY2xvc2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQuZm9sbG93X21vdXNlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LmZvbGxvd19tb3VzZV9zaHJpbmsiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQuZm9sbG93X21vdXNlX3RocmVzaG9sZCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LmZvcmNlX25vX2FjY2VsIjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dC5rYl9maWxlIjogInN0cmluZyIsCiAgICAgICAgImlucHV0LmtiX2xheW91dCI6ICJzdHJpbmciLAogICAgICAgICJpbnB1dC5rYl9tb2RlbCI6ICJzdHJpbmciLAogICAgICAgICJpbnB1dC5rYl9vcHRpb25zIjogInN0cmluZyIsCiAgICAgICAgImlucHV0LmtiX3J1bGVzIjogInN0cmluZyIsCiAgICAgICAgImlucHV0LmtiX3ZhcmlhbnQiOiAic3RyaW5nIiwKICAgICAgICAiaW5wdXQubGVmdF9oYW5kZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0Lm1vdXNlX3JlZm9jdXMiOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0Lm5hdHVyYWxfc2Nyb2xsIjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dC5udW1sb2NrX2J5X2RlZmF1bHQiOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0Lm9mZl93aW5kb3dfYXhpc19ldmVudHMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQucmVwZWF0X2RlbGF5IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnJlcGVhdF9yYXRlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnJlc29sdmVfYmluZHNfYnlfc3ltIjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dC5yb3RhdGlvbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJpbnB1dC5zY3JvbGxfYnV0dG9uIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnNjcm9sbF9idXR0b25fbG9jayI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXQuc2Nyb2xsX2ZhY3RvciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnNjcm9sbF9tZXRob2QiOiAic3RyaW5nIiwKICAgICAgICAiaW5wdXQuc2Nyb2xsX3BvaW50cyI6ICJzdHJpbmciLAogICAgICAgICJpbnB1dC5zZW5zaXRpdml0eSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnNwZWNpYWxfZmFsbHRocm91Z2giOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0LnRhYmxldC5hYnNvbHV0ZV9yZWdpb25fcG9zaXRpb24iOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0LnRhYmxldC5hY3RpdmVfYXJlYV9wb3NpdGlvbiI6ICJITC5WZWMyTGlrZSIsCiAgICAgICAgImlucHV0LnRhYmxldC5hY3RpdmVfYXJlYV9zaXplIjogIkhMLlZlYzJMaWtlIiwKICAgICAgICAiaW5wdXQudGFibGV0LmxlZnRfaGFuZGVkIjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dC50YWJsZXQub3V0cHV0IjogInN0cmluZyIsCiAgICAgICAgImlucHV0LnRhYmxldC5yZWdpb25fcG9zaXRpb24iOiAiSEwuVmVjMkxpa2UiLAogICAgICAgICJpbnB1dC50YWJsZXQucmVnaW9uX3NpemUiOiAiSEwuVmVjMkxpa2UiLAogICAgICAgICJpbnB1dC50YWJsZXQucmVsYXRpdmVfaW5wdXQiOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0LnRhYmxldC50cmFuc2Zvcm0iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQudGFibGV0dG9vbC5lcmFzZXJfYnV0dG9uX21vZGUiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQudGFibGV0dG9vbC5lcmFzZXJfYnV0dG9uX292ZXJyaWRlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnRhYmxldHRvb2wucHJlc3N1cmVfcmFuZ2VfbWF4IjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQudGFibGV0dG9vbC5wcmVzc3VyZV9yYW5nZV9taW4iOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJpbnB1dC50b3VjaGRldmljZS5lbmFibGVkIjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dC50b3VjaGRldmljZS5vdXRwdXQiOiAic3RyaW5nIiwKICAgICAgICAiaW5wdXQudG91Y2hkZXZpY2UudHJhbnNmb3JtIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLmNsaWNrZmluZ2VyX2JlaGF2aW9yIjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dC50b3VjaHBhZC5kaXNhYmxlX3doaWxlX3R5cGluZyI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQuZHJhZ18zZmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQuZHJhZ19sb2NrIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLmZsaXBfeCI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQuZmxpcF95IjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dC50b3VjaHBhZC5taWRkbGVfYnV0dG9uX2VtdWxhdGlvbiI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXQudG91Y2hwYWQubmF0dXJhbF9zY3JvbGwiOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLnNjcm9sbF9mYWN0b3IiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJpbnB1dC50b3VjaHBhZC50YXBfYW5kX2RyYWciOiAiYm9vbGVhbiIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLnRhcF9idXR0b25fbWFwIjogInN0cmluZyIsCiAgICAgICAgImlucHV0LnRvdWNocGFkLnRhcF90b19jbGljayI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXQudmlydHVhbGtleWJvYXJkLnJlbGVhc2VfcHJlc3NlZF9vbl9jbG9zZSI6ICJib29sZWFuIiwKICAgICAgICAiaW5wdXQudmlydHVhbGtleWJvYXJkLnNoYXJlX3N0YXRlcyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJpbnB1dF9jYXB0dXJlLmNhcHR1cmVfbW9kaWZpZXJzIjogImJvb2xlYW4iLAogICAgICAgICJpbnB1dF9jYXB0dXJlLmVuZm9yY2VfYmFycmllcnMiOiAiYm9vbGVhbiIsCiAgICAgICAgImxheW91dC5zaW5nbGVfd2luZG93X2FzcGVjdF9yYXRpbyI6ICJITC5WZWMyTGlrZSIsCiAgICAgICAgImxheW91dC5zaW5nbGVfd2luZG93X2FzcGVjdF9yYXRpb190b2xlcmFuY2UiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJtYXN0ZXIuYWxsb3dfc21hbGxfc3BsaXQiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1hc3Rlci5hbHdheXNfa2VlcF9wb3NpdGlvbiI6ICJib29sZWFuIiwKICAgICAgICAibWFzdGVyLmNlbnRlcl9pZ25vcmVzX3Jlc2VydmVkIjogImJvb2xlYW4iLAogICAgICAgICJtYXN0ZXIuY2VudGVyX21hc3Rlcl9mYWxsYmFjayI6ICJzdHJpbmciLAogICAgICAgICJtYXN0ZXIuZHJvcF9hdF9jdXJzb3IiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1hc3Rlci5mb2N1c19tYXN0ZXJfb25fY2xvc2UiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1hc3Rlci5tZmFjdCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm1hc3Rlci5uZXdfb25fYWN0aXZlIjogInN0cmluZyIsCiAgICAgICAgIm1hc3Rlci5uZXdfb25fdG9wIjogImJvb2xlYW4iLAogICAgICAgICJtYXN0ZXIubmV3X3N0YXR1cyI6ICJzdHJpbmciLAogICAgICAgICJtYXN0ZXIub3JpZW50YXRpb24iOiAic3RyaW5nIiwKICAgICAgICAibWFzdGVyLnNsYXZlX2NvdW50X2Zvcl9jZW50ZXJfbWFzdGVyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm1hc3Rlci5zbWFydF9yZXNpemluZyI6ICJib29sZWFuIiwKICAgICAgICAibWFzdGVyLnNwZWNpYWxfc2NhbGVfZmFjdG9yIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAibWlzYy5hbGxvd19zZXNzaW9uX2xvY2tfcmVzdG9yZSI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5hbHdheXNfZm9sbG93X29uX2RuZCI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5hbmltYXRlX21hbnVhbF9yZXNpemVzIjogImJvb2xlYW4iLAogICAgICAgICJtaXNjLmFuaW1hdGVfbW91c2Vfd2luZG93ZHJhZ2dpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pc2MuYW5yX21pc3NlZF9waW5ncyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJtaXNjLmJhY2tncm91bmRfY29sb3IiOiAic3RyaW5nIiwKICAgICAgICAibWlzYy5jbG9zZV9zcGVjaWFsX29uX2VtcHR5IjogImJvb2xlYW4iLAogICAgICAgICJtaXNjLmNvbC5zcGxhc2giOiAic3RyaW5nIiwKICAgICAgICAibWlzYy5kaXNhYmxlX2F1dG9yZWxvYWQiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pc2MuZGlzYWJsZV9oeXBybGFuZF9ndWl1dGlsc19jaGVjayI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5kaXNhYmxlX2h5cHJsYW5kX2xvZ28iOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pc2MuZGlzYWJsZV9zY2FsZV9ub3RpZmljYXRpb24iOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pc2MuZGlzYWJsZV9zcGxhc2hfcmVuZGVyaW5nIjogImJvb2xlYW4iLAogICAgICAgICJtaXNjLmRpc2FibGVfd2F0Y2hkb2dfd2FybmluZyI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5kaXNhYmxlX3hkZ19lbnZfY2hlY2tzIjogImJvb2xlYW4iLAogICAgICAgICJtaXNjLmVuYWJsZV9hbnJfZGlhbG9nIjogImJvb2xlYW4iLAogICAgICAgICJtaXNjLmVuYWJsZV9zd2FsbG93IjogImJvb2xlYW4iLAogICAgICAgICJtaXNjLmV4aXRfd2luZG93X3JldGFpbnNfZnVsbHNjcmVlbiI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5mb2N1c19vbl9hY3RpdmF0ZSI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5mb250X2ZhbWlseSI6ICJzdHJpbmciLAogICAgICAgICJtaXNjLmZvcmNlX2RlZmF1bHRfd2FsbHBhcGVyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm1pc2MuaW5pdGlhbF93b3Jrc3BhY2VfdG9rZW5fdGltZW91dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJtaXNjLmluaXRpYWxfd29ya3NwYWNlX3RyYWNraW5nIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm1pc2Mua2V5X3ByZXNzX2VuYWJsZXNfZHBtcyI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5sYXllcnNfaG9nX2tleWJvYXJkX2ZvY3VzIjogImJvb2xlYW4iLAogICAgICAgICJtaXNjLmxvY2tkZWFkX3NjcmVlbl9kZWxheSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJtaXNjLm1pZGRsZV9jbGlja19wYXN0ZSI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5tb3VzZV9tb3ZlX2VuYWJsZXNfZHBtcyI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5tb3VzZV9tb3ZlX2ZvY3VzZXNfbW9uaXRvciI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5uYW1lX3ZrX2FmdGVyX3Byb2MiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pc2Mub25fZm9jdXNfdW5kZXJfZnVsbHNjcmVlbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJtaXNjLnJlbmRlcl91bmZvY3VzZWRfZnBzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm1pc2Muc2NyZWVuY29weV9mb3JjZV84YiI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5zZXNzaW9uX2xvY2tfYmx1ciI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5zZXNzaW9uX2xvY2tfeHJheSI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5zaXplX2xpbWl0c190aWxlZCI6ICJib29sZWFuIiwKICAgICAgICAibWlzYy5zcGxhc2hfZm9udF9mYW1pbHkiOiAic3RyaW5nIiwKICAgICAgICAibWlzYy5zd2FsbG93X2V4Y2VwdGlvbl9yZWdleCI6ICJzdHJpbmciLAogICAgICAgICJtaXNjLnN3YWxsb3dfcmVnZXgiOiAic3RyaW5nIiwKICAgICAgICAibWlzYy52cnIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAib3BlbmdsLm52aWRpYV9hbnRpX2ZsaWNrZXIiOiAiYm9vbGVhbiIsCiAgICAgICAgInF1aXJrcy5wcmVmZXJfaGRyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInF1aXJrcy5za2lwX25vbl9rbXNfZG1hYnVmX2Zvcm1hdHMiOiAiYm9vbGVhbiIsCiAgICAgICAgInJlbmRlci5jbV9hdXRvX2hkciI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJyZW5kZXIuY21fZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAicmVuZGVyLmNtX3Nkcl9lb3RmIjogInN0cmluZyIsCiAgICAgICAgInJlbmRlci5jb21taXRfdGltaW5nX2VuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgInJlbmRlci5jdG1fYW5pbWF0aW9uIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInJlbmRlci5kaXJlY3Rfc2Nhbm91dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJyZW5kZXIuZXhwYW5kX3VuZGVyc2l6ZWRfdGV4dHVyZXMiOiAiYm9vbGVhbiIsCiAgICAgICAgInJlbmRlci5mcDE2X3Nkcl90ZiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJyZW5kZXIuaWNjX3ZjZ3RfZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAicmVuZGVyLmtlZXBfdW5tb2RpZmllZF9jb3B5IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInJlbmRlci5uZXdfcmVuZGVyX3NjaGVkdWxpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgInJlbmRlci5ub25fc2hhZGVyX2NtIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInJlbmRlci5ub25fc2hhZGVyX2NtX2ludGVyb3AiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicmVuZGVyLnNlbmRfY29udGVudF90eXBlIjogImJvb2xlYW4iLAogICAgICAgICJyZW5kZXIudXNlX2ZwMTYiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAicmVuZGVyLnVzZV9zaGFkZXJfYmx1cl9ibGVuZCI6ICJib29sZWFuIiwKICAgICAgICAicmVuZGVyLnhwX21vZGUiOiAiYm9vbGVhbiIsCiAgICAgICAgInNjcm9sbGluZy5jb2x1bW5fd2lkdGgiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxpbmcuZGlyZWN0aW9uIjogInN0cmluZyIsCiAgICAgICAgInNjcm9sbGluZy5leHBsaWNpdF9jb2x1bW5fd2lkdGhzIjogInN0cmluZyIsCiAgICAgICAgInNjcm9sbGluZy5mb2N1c19maXRfbWV0aG9kIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInNjcm9sbGluZy5mb2xsb3dfZm9jdXMiOiAiYm9vbGVhbiIsCiAgICAgICAgInNjcm9sbGluZy5mb2xsb3dfbWluX3Zpc2libGUiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxpbmcuZnVsbHNjcmVlbl9vbl9vbmVfY29sdW1uIjogImJvb2xlYW4iLAogICAgICAgICJzY3JvbGxpbmcud3JhcF9mb2N1cyI6ICJib29sZWFuIiwKICAgICAgICAic2Nyb2xsaW5nLndyYXBfc3dhcGNvbCI6ICJib29sZWFuIiwKICAgICAgICAieHdheWxhbmQuY3JlYXRlX2Fic3RyYWN0X3NvY2tldCI6ICJib29sZWFuIiwKICAgICAgICAieHdheWxhbmQuZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAieHdheWxhbmQuZm9yY2VfemVyb19zY2FsaW5nIjogImJvb2xlYW4iLAogICAgICAgICJ4d2F5bGFuZC51c2VfbmVhcmVzdF9uZWlnaGJvciI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Db25maWdWYWx1ZVR5cGVzIgogICAgfSwKICAgICJITC5EZXZpY2VTcGVjIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhYnNvbHV0ZV9yZWdpb25fcG9zaXRpb24iOiAiYm9vbGVhbiIsCiAgICAgICAgImFjY2VsX3Byb2ZpbGUiOiAic3RyaW5nIiwKICAgICAgICAiYWN0aXZlX2FyZWFfcG9zaXRpb24iOiAiSEwuVmVjMkxpa2UiLAogICAgICAgICJhY3RpdmVfYXJlYV9zaXplIjogIkhMLlZlYzJMaWtlIiwKICAgICAgICAiY2xpY2tmaW5nZXJfYmVoYXZpb3IiOiAiYm9vbGVhbiIsCiAgICAgICAgImRpc2FibGVfd2hpbGVfdHlwaW5nIjogImJvb2xlYW4iLAogICAgICAgICJkcmFnXzNmZyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJkcmFnX2xvY2siOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAiZmxpcF94IjogImJvb2xlYW4iLAogICAgICAgICJmbGlwX3kiOiAiYm9vbGVhbiIsCiAgICAgICAgImtiX2ZpbGUiOiAic3RyaW5nIiwKICAgICAgICAia2JfbGF5b3V0IjogInN0cmluZyIsCiAgICAgICAgImtiX21vZGVsIjogInN0cmluZyIsCiAgICAgICAgImtiX29wdGlvbnMiOiAic3RyaW5nIiwKICAgICAgICAia2JfcnVsZXMiOiAic3RyaW5nIiwKICAgICAgICAia2JfdmFyaWFudCI6ICJzdHJpbmciLAogICAgICAgICJrZXliaW5kcyI6ICJib29sZWFuIiwKICAgICAgICAibGVmdF9oYW5kZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1pZGRsZV9idXR0b25fZW11bGF0aW9uIjogImJvb2xlYW4iLAogICAgICAgICJuYW1lIjogInN0cmluZyIsCiAgICAgICAgIm5hdHVyYWxfc2Nyb2xsIjogImJvb2xlYW4iLAogICAgICAgICJudW1sb2NrX2J5X2RlZmF1bHQiOiAiYm9vbGVhbiIsCiAgICAgICAgIm91dHB1dCI6ICJzdHJpbmciLAogICAgICAgICJyZWdpb25fcG9zaXRpb24iOiAiSEwuVmVjMkxpa2UiLAogICAgICAgICJyZWdpb25fc2l6ZSI6ICJITC5WZWMyTGlrZSIsCiAgICAgICAgInJlbGF0aXZlX2lucHV0IjogImJvb2xlYW4iLAogICAgICAgICJyZWxlYXNlX3ByZXNzZWRfb25fY2xvc2UiOiAiYm9vbGVhbiIsCiAgICAgICAgInJlcGVhdF9kZWxheSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJyZXBlYXRfcmF0ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJyZXNvbHZlX2JpbmRzX2J5X3N5bSI6ICJib29sZWFuIiwKICAgICAgICAicm90YXRpb24iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAic2Nyb2xsX2J1dHRvbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxfYnV0dG9uX2xvY2siOiAiYm9vbGVhbiIsCiAgICAgICAgInNjcm9sbF9mYWN0b3IiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzY3JvbGxfbWV0aG9kIjogInN0cmluZyIsCiAgICAgICAgInNjcm9sbF9wb2ludHMiOiAic3RyaW5nIiwKICAgICAgICAic2Vuc2l0aXZpdHkiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzaGFyZV9zdGF0ZXMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAidGFncyI6ICJzdHJpbmciLAogICAgICAgICJ0YXBfYW5kX2RyYWciOiAiYm9vbGVhbiIsCiAgICAgICAgInRhcF9idXR0b25fbWFwIjogInN0cmluZyIsCiAgICAgICAgInRhcF90b19jbGljayI6ICJib29sZWFuIiwKICAgICAgICAidHJhbnNmb3JtIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuRGV2aWNlU3BlYyIKICAgIH0sCiAgICAiSEwuRGlzcGF0Y2hlciI6IHsKICAgICAgImZpZWxkcyI6IHt9LAogICAgICAibmFtZSI6ICJITC5EaXNwYXRjaGVyIgogICAgfSwKICAgICJITC5Ec3BDdXJzb3JOYW1lc3BhY2UiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgIm1vdmUiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJtb3ZlX3RvX2Nvcm5lciI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuRHNwQ3Vyc29yTmFtZXNwYWNlIgogICAgfSwKICAgICJITC5Ec3BHcm91cE5hbWVzcGFjZSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYWN0aXZlIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAibG9jayI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgImxvY2tfYWN0aXZlIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAibW92ZV93aW5kb3ciOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJuZXh0IjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAicHJldiI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgInRvZ2dsZSI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuRHNwR3JvdXBOYW1lc3BhY2UiCiAgICB9LAogICAgIkhMLkRzcE5hbWVzcGFjZSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiY3Vyc29yIjogIkhMLkRzcEN1cnNvck5hbWVzcGFjZSIsCiAgICAgICAgImRwbXMiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJldmVudCI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgImV4ZWNfY21kIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAiZXhlY19yYXciOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJleGl0IjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAiZm9jdXMiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJmb3JjZV9pZGxlIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAiZm9yY2VfcmVuZGVyZXJfcmVsb2FkIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAiZ2xvYmFsIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAiZ3JvdXAiOiAiSEwuRHNwR3JvdXBOYW1lc3BhY2UiLAogICAgICAgICJsYXlvdXQiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJub19vcCI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgInBhc3MiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJyZWxlYXNlX2lucHV0X2NhcHR1cmUiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJzZW5kX2tleV9zdGF0ZSI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgInNlbmRfc2hvcnRjdXQiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJzdWJtYXAiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJ3aW5kb3ciOiAiSEwuRHNwV2luZG93TmFtZXNwYWNlIiwKICAgICAgICAid29ya3NwYWNlIjogIkhMLkRzcFdvcmtzcGFjZU5hbWVzcGFjZSIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuRHNwTmFtZXNwYWNlIgogICAgfSwKICAgICJITC5Ec3BXaW5kb3dOYW1lc3BhY2UiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFsdGVyX3pvcmRlciI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgImJyaW5nX3RvX3RvcCI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgImNlbnRlciI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgImNsZWFyX3RhZ3MiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJjbG9zZSI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgImN5Y2xlX25leHQiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJkZW55X2Zyb21fZ3JvdXAiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJkcmFnIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAiZmxvYXQiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJmdWxsc2NyZWVuIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAiZnVsbHNjcmVlbl9zdGF0ZSI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgImtpbGwiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJtb3ZlIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAicGluIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAicHNldWRvIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAicmVzaXplIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAic2V0X3Byb3AiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJzaWduYWwiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJzd2FwIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAidGFnIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAidG9nZ2xlX3N3YWxsb3ciOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkRzcFdpbmRvd05hbWVzcGFjZSIKICAgIH0sCiAgICAiSEwuRHNwV29ya3NwYWNlTmFtZXNwYWNlIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJjaGFuZ2VfaWQiOiAiZnVuKC4uLik6IEhMLkRpc3BhdGNoZXIiLAogICAgICAgICJtb3ZlIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAicmVuYW1lIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIiwKICAgICAgICAic3dhcF9tb25pdG9ycyI6ICJmdW4oLi4uKTogSEwuRGlzcGF0Y2hlciIsCiAgICAgICAgInRvZ2dsZV9zcGVjaWFsIjogImZ1biguLi4pOiBITC5EaXNwYXRjaGVyIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Ec3BXb3Jrc3BhY2VOYW1lc3BhY2UiCiAgICB9LAogICAgIkhMLkV2ZW50U3Vic2NyaXB0aW9uIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJpc19hY3RpdmUiOiAiZnVuKHNlbGY6IEhMLkV2ZW50U3Vic2NyaXB0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJyZW1vdmUiOiAiZnVuKHNlbGY6IEhMLkV2ZW50U3Vic2NyaXB0aW9uLCAuLi4pOiBhbnkiCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkV2ZW50U3Vic2NyaXB0aW9uIgogICAgfSwKICAgICJITC5HZXN0dXJlU3BlYyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYWN0aW9uIjogInN0cmluZ3xmdW5jdGlvbiIsCiAgICAgICAgImRpcmVjdGlvbiI6ICJzdHJpbmciLAogICAgICAgICJkaXNhYmxlX2luaGliaXQiOiAiYm9vbGVhbiIsCiAgICAgICAgImZpbmdlcnMiOiAiaW50ZWdlciIsCiAgICAgICAgIm1vZGUiOiAic3RyaW5nIiwKICAgICAgICAibW9kcyI6ICJzdHJpbmciLAogICAgICAgICJzY2FsZSI6ICJudW1iZXIiLAogICAgICAgICJ3b3Jrc3BhY2VfbmFtZSI6ICJzdHJpbmciLAogICAgICAgICJ6b29tX2xldmVsIjogIm51bWJlciIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuR2VzdHVyZVNwZWMiCiAgICB9LAogICAgIkhMLkdyb3VwIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhZGQiOiAiZnVuKHNlbGY6IEhMLkdyb3VwLCB3aW5kb3c6IEhMLldpbmRvdywgaW5kZXg/OiBpbnRlZ2VyKSIsCiAgICAgICAgImN1cnJlbnQiOiAiSEwuV2luZG93fG5pbCIsCiAgICAgICAgImN1cnJlbnRfaW5kZXgiOiAiaW50ZWdlciIsCiAgICAgICAgImRlbmllZCI6ICJib29sZWFuIiwKICAgICAgICAibG9ja2VkIjogImJvb2xlYW4iLAogICAgICAgICJtZW1iZXJzIjogIkhMLldpbmRvd3x0YWJsZXxuaWwiLAogICAgICAgICJyZW1vdmUiOiAiZnVuKHNlbGY6IEhMLkdyb3VwLCB3aW5kb3dfb3JfaW5kZXg6IEhMLldpbmRvd3xpbnRlZ2VyKSIsCiAgICAgICAgInNpemUiOiAiaW50ZWdlciIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuR3JvdXAiCiAgICB9LAogICAgIkhMLktleWJpbmQiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFsbG93X2lucHV0X2NhcHR1cmUiOiAiYm9vbGVhbnxuaWwiLAogICAgICAgICJhcmciOiAic3RyaW5nIiwKICAgICAgICAiYXV0b19jb25zdW1pbmciOiAiYm9vbGVhbiIsCiAgICAgICAgImNhdGNoYWxsIjogImJvb2xlYW4iLAogICAgICAgICJjbGljayI6ICJib29sZWFuIiwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiYW55IiwKICAgICAgICAiZGV2aWNlX2luY2x1c2l2ZSI6ICJib29sZWFuIiwKICAgICAgICAiZGV2aWNlcyI6ICJhbnkiLAogICAgICAgICJkaXNwbGF5X2tleSI6ICJzdHJpbmciLAogICAgICAgICJkb250X2luaGliaXQiOiAiYm9vbGVhbiIsCiAgICAgICAgImRyYWciOiAiYm9vbGVhbiIsCiAgICAgICAgImVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImhhbmRsZXIiOiAic3RyaW5nIiwKICAgICAgICAiaGFzX2Rlc2NyaXB0aW9uIjogImJvb2xlYW4iLAogICAgICAgICJpZ25vcmVfbW9kcyI6ICJib29sZWFuIiwKICAgICAgICAiaXNfZW5hYmxlZCI6ICJmdW4oc2VsZjogSEwuS2V5YmluZCwgLi4uKTogYW55IiwKICAgICAgICAia2V5IjogInN0cmluZyIsCiAgICAgICAgImtleWNvZGUiOiAiaW50ZWdlciIsCiAgICAgICAgImxvY2tlZCI6ICJib29sZWFuIiwKICAgICAgICAibG9uZ19wcmVzcyI6ICJib29sZWFuIiwKICAgICAgICAibW9kbWFzayI6ICJpbnRlZ2VyIiwKICAgICAgICAibW91c2UiOiAiYm9vbGVhbiIsCiAgICAgICAgIm5vbl9jb25zdW1pbmciOiAiYm9vbGVhbiIsCiAgICAgICAgInJlbGVhc2UiOiAiYm9vbGVhbiIsCiAgICAgICAgInJlbW92ZSI6ICJmdW4oc2VsZjogSEwuS2V5YmluZCwgLi4uKTogYW55IiwKICAgICAgICAicmVwZWF0aW5nIjogImJvb2xlYW4iLAogICAgICAgICJzZXRfZW5hYmxlZCI6ICJmdW4oc2VsZjogSEwuS2V5YmluZCwgLi4uKTogYW55IiwKICAgICAgICAic3VibWFwIjogInN0cmluZyIsCiAgICAgICAgInN1Ym1hcF91bml2ZXJzYWwiOiAiYm9vbGVhbiIsCiAgICAgICAgInRyYW5zcGFyZW50IjogImJvb2xlYW4iLAogICAgICAgICJ1bmJpbmQiOiAiZnVuKHNlbGY6IEhMLktleWJpbmQsIC4uLik6IGFueSIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuS2V5YmluZCIKICAgIH0sCiAgICAiSEwuTGF5ZXJRdWVyeUZpbHRlciI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAibW9uaXRvciI6ICJITC5Nb25pdG9yU2VsZWN0b3IiLAogICAgICAgICJuYW1lc3BhY2UiOiAic3RyaW5nIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5MYXllclF1ZXJ5RmlsdGVyIgogICAgfSwKICAgICJITC5MYXllclJ1bGUiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImlzX2VuYWJsZWQiOiAiZnVuKHNlbGY6IEhMLkxheWVyUnVsZSwgLi4uKTogYW55IiwKICAgICAgICAic2V0X2VuYWJsZWQiOiAiZnVuKHNlbGY6IEhMLkxheWVyUnVsZSwgLi4uKTogYW55IgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5MYXllclJ1bGUiCiAgICB9LAogICAgIkhMLkxheWVyUnVsZVNwZWMiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFib3ZlX2xvY2siOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiYW5pbWF0aW9uIjogInN0cmluZyIsCiAgICAgICAgImJsdXIiOiAiYm9vbGVhbiIsCiAgICAgICAgImJsdXJfcG9wdXBzIjogImJvb2xlYW4iLAogICAgICAgICJkaW1fYXJvdW5kIjogImJvb2xlYW4iLAogICAgICAgICJlbmFibGVkIjogImJvb2xlYW4iLAogICAgICAgICJpZ25vcmVfYWxwaGEiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJtYXRjaCI6ICJ0YWJsZTxzdHJpbmcsIHN0cmluZ3xib29sZWFuPiIsCiAgICAgICAgIm5hbWUiOiAic3RyaW5nIiwKICAgICAgICAibm9fYW5pbSI6ICJib29sZWFuIiwKICAgICAgICAibm9fc2NyZWVuX3NoYXJlIjogImJvb2xlYW4iLAogICAgICAgICJvcmRlciI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJ4cmF5IjogImJvb2xlYW4iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkxheWVyUnVsZVNwZWMiCiAgICB9LAogICAgIkhMLkxheWVyU3VyZmFjZSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYWJvdmVfZnVsbHNjcmVlbiI6ICJib29sZWFufG5pbCIsCiAgICAgICAgImFkZHJlc3MiOiAic3RyaW5nIiwKICAgICAgICAiaCI6ICJpbnRlZ2VyIiwKICAgICAgICAiaW50ZXJhY3Rpdml0eSI6ICJpbnRlZ2VyIiwKICAgICAgICAibGF5ZXIiOiAiaW50ZWdlciIsCiAgICAgICAgIm1hcHBlZCI6ICJib29sZWFuIiwKICAgICAgICAibW9uaXRvciI6ICJITC5Nb25pdG9yfG5pbCIsCiAgICAgICAgIm5hbWVzcGFjZSI6ICJzdHJpbmciLAogICAgICAgICJwaWQiOiAiaW50ZWdlciIsCiAgICAgICAgInciOiAiaW50ZWdlciIsCiAgICAgICAgIngiOiAiaW50ZWdlciIsCiAgICAgICAgInkiOiAiaW50ZWdlciIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuTGF5ZXJTdXJmYWNlIgogICAgfSwKICAgICJITC5MYXlvdXRDb250ZXh0IjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJhcmVhIjogIkhMLkJveCIsCiAgICAgICAgImNvbHVtbiI6ICJmdW4oc2VsZjogSEwuTGF5b3V0Q29udGV4dCwgaTogaW50ZWdlciwgbjogaW50ZWdlcik6IEhMLkJveCIsCiAgICAgICAgImdyaWRfY2VsbCI6ICJmdW4oc2VsZjogSEwuTGF5b3V0Q29udGV4dCwgaTogaW50ZWdlciwgY29sczogaW50ZWdlciwgcm93cz86IGludGVnZXIpOiBITC5Cb3giLAogICAgICAgICJyb3ciOiAiZnVuKHNlbGY6IEhMLkxheW91dENvbnRleHQsIGk6IGludGVnZXIsIG46IGludGVnZXIpOiBITC5Cb3giLAogICAgICAgICJzcGxpdCI6ICJmdW4oc2VsZjogSEwuTGF5b3V0Q29udGV4dCwgYm94OiBITC5Cb3gsIHNpZGU6ICdsZWZ0J3wncmlnaHQnfCd0b3AnfCdib3R0b20nfCd1cCd8J2Rvd24nLCByYXRpbzogbnVtYmVyKTogSEwuQm94IiwKICAgICAgICAidGFyZ2V0cyI6ICJITC5MYXlvdXRUYXJnZXRbXSIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuTGF5b3V0Q29udGV4dCIKICAgIH0sCiAgICAiSEwuTGF5b3V0TmFtZXNwYWNlIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJyZWdpc3RlciI6ICJmdW4obmFtZTogc3RyaW5nLCBwcm92aWRlcjogSEwuTGF5b3V0UHJvdmlkZXIpOiBuaWwiCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLkxheW91dE5hbWVzcGFjZSIKICAgIH0sCiAgICAiSEwuTGF5b3V0UHJvdmlkZXIiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImxheW91dF9tc2ciOiAiZnVuKGN0eDogSEwuTGF5b3V0Q29udGV4dCwgbXNnOiBzdHJpbmcpOiBib29sZWFufHN0cmluZ3xuaWwiLAogICAgICAgICJyZWNhbGN1bGF0ZSI6ICJmdW4oY3R4OiBITC5MYXlvdXRDb250ZXh0KTogbmlsIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5MYXlvdXRQcm92aWRlciIKICAgIH0sCiAgICAiSEwuTGF5b3V0VGFyZ2V0IjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJib3giOiAiSEwuQm94IiwKICAgICAgICAiaW5kZXgiOiAiaW50ZWdlciIsCiAgICAgICAgInBsYWNlIjogImZ1bihzZWxmOiBITC5MYXlvdXRUYXJnZXQsIGJveDogSEwuQm94KTogbmlsIiwKICAgICAgICAic2V0X2JveCI6ICJmdW4oc2VsZjogSEwuTGF5b3V0VGFyZ2V0LCBib3g6IEhMLkJveCk6IG5pbCIsCiAgICAgICAgIndpbmRvdyI6ICJITC5XaW5kb3d8bmlsIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5MYXlvdXRUYXJnZXQiCiAgICB9LAogICAgIkhMLk1vbml0b3IiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFjdGl2ZV9zcGVjaWFsX3dvcmtzcGFjZSI6ICJITC5Xb3Jrc3BhY2V8bmlsIiwKICAgICAgICAiYWN0aXZlX3dvcmtzcGFjZSI6ICJITC5Xb3Jrc3BhY2V8bmlsIiwKICAgICAgICAiYXZhaWxhYmxlX21vZGVzIjogImJvb2xlYW58aW50ZWdlcnxudW1iZXJ8dGFibGUiLAogICAgICAgICJjbSI6ICJzdHJpbmciLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJzdHJpbmciLAogICAgICAgICJkcG1zX3N0YXR1cyI6ICJib29sZWFuIiwKICAgICAgICAiZm9jdXNlZCI6ICJib29sZWFuIiwKICAgICAgICAiaGVpZ2h0IjogImludGVnZXIiLAogICAgICAgICJpZCI6ICJpbnRlZ2VyIiwKICAgICAgICAiaXNfbWlycm9yIjogImJvb2xlYW4iLAogICAgICAgICJtaXJyb3JzIjogIkhMLk1vbml0b3J8dGFibGUiLAogICAgICAgICJuYW1lIjogInN0cmluZyIsCiAgICAgICAgInBoeXNpY2FsX2hlaWdodCI6ICJpbnRlZ2VyIiwKICAgICAgICAicGh5c2ljYWxfd2lkdGgiOiAiaW50ZWdlciIsCiAgICAgICAgInBvc2l0aW9uIjogImludGVnZXJ8dGFibGUiLAogICAgICAgICJyZWZyZXNoX3JhdGUiOiAibnVtYmVyIiwKICAgICAgICAicmVzZXJ2ZWQiOiAibnVtYmVyfHRhYmxlIiwKICAgICAgICAic2NhbGUiOiAibnVtYmVyIiwKICAgICAgICAic2VyaWFsIjogInN0cmluZyIsCiAgICAgICAgInNldF9zcGVjaWFsX3dvcmtzcGFjZSI6ICJmdW4oc2VsZjogSEwuTW9uaXRvciwgLi4uKTogYW55IiwKICAgICAgICAic2V0X3dvcmtzcGFjZSI6ICJmdW4oc2VsZjogSEwuTW9uaXRvciwgLi4uKTogYW55IiwKICAgICAgICAic2l6ZSI6ICJpbnRlZ2VyfHRhYmxlIiwKICAgICAgICAidHJhbnNmb3JtIjogImludGVnZXIiLAogICAgICAgICJ2cnJfYWN0aXZlIjogImJvb2xlYW4iLAogICAgICAgICJ3aWR0aCI6ICJpbnRlZ2VyIiwKICAgICAgICAieCI6ICJpbnRlZ2VyIiwKICAgICAgICAieSI6ICJpbnRlZ2VyIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Nb25pdG9yIgogICAgfSwKICAgICJITC5Nb25pdG9yU3BlYyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYml0ZGVwdGgiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAiY20iOiAic3RyaW5nIiwKICAgICAgICAiZGlzYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgImljYyI6ICJzdHJpbmciLAogICAgICAgICJtYXhfYXZnX2x1bWluYW5jZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJtYXhfbHVtaW5hbmNlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgIm1pbl9sdW1pbmFuY2UiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJtaXJyb3IiOiAic3RyaW5nIiwKICAgICAgICAibW9kZSI6ICJzdHJpbmciLAogICAgICAgICJvdXRwdXQiOiAic3RyaW5nIiwKICAgICAgICAicG9zaXRpb24iOiAic3RyaW5nIiwKICAgICAgICAicmVzZXJ2ZWQiOiAiaW50ZWdlcnxITC5Dc3NHYXAiLAogICAgICAgICJyZXNlcnZlZF9hcmVhIjogImludGVnZXJ8SEwuQ3NzR2FwIiwKICAgICAgICAic2NhbGUiOiAic3RyaW5nfG51bWJlciIsCiAgICAgICAgInNkcl9lb3RmIjogInN0cmluZyIsCiAgICAgICAgInNkcl9tYXhfbHVtaW5hbmNlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgInNkcl9taW5fbHVtaW5hbmNlIjogIm51bWJlcnxib29sZWFuIiwKICAgICAgICAic2RyYnJpZ2h0bmVzcyI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAgICAgInNkcnNhdHVyYXRpb24iOiAibnVtYmVyfGJvb2xlYW4iLAogICAgICAgICJzdXBwb3J0c19oZHIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAic3VwcG9ydHNfd2lkZV9jb2xvciI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgICAgICJ0cmFuc2Zvcm0iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICAgICAidnJyIjogImludGVnZXJ8Ym9vbGVhbiIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuTW9uaXRvclNwZWMiCiAgICB9LAogICAgIkhMLk5vdGlmaWNhdGlvbiI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiZGlzbWlzcyI6ICJmdW4oc2VsZjogSEwuTm90aWZpY2F0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJnZXRfY29sb3IiOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IiwKICAgICAgICAiZ2V0X2VsYXBzZWQiOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IiwKICAgICAgICAiZ2V0X2VsYXBzZWRfc2luY2VfY3JlYXRpb24iOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IiwKICAgICAgICAiZ2V0X2ZvbnRfc2l6ZSI6ICJmdW4oc2VsZjogSEwuTm90aWZpY2F0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJnZXRfaWNvbiI6ICJmdW4oc2VsZjogSEwuTm90aWZpY2F0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJnZXRfdGV4dCI6ICJmdW4oc2VsZjogSEwuTm90aWZpY2F0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJnZXRfdGltZW91dCI6ICJmdW4oc2VsZjogSEwuTm90aWZpY2F0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJpc19hbGl2ZSI6ICJmdW4oc2VsZjogSEwuTm90aWZpY2F0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJpc19wYXVzZWQiOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IiwKICAgICAgICAicGF1c2UiOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IiwKICAgICAgICAicmVzdW1lIjogImZ1bihzZWxmOiBITC5Ob3RpZmljYXRpb24sIC4uLik6IGFueSIsCiAgICAgICAgInNldF9jb2xvciI6ICJmdW4oc2VsZjogSEwuTm90aWZpY2F0aW9uLCAuLi4pOiBhbnkiLAogICAgICAgICJzZXRfZm9udF9zaXplIjogImZ1bihzZWxmOiBITC5Ob3RpZmljYXRpb24sIC4uLik6IGFueSIsCiAgICAgICAgInNldF9pY29uIjogImZ1bihzZWxmOiBITC5Ob3RpZmljYXRpb24sIC4uLik6IGFueSIsCiAgICAgICAgInNldF9wYXVzZWQiOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IiwKICAgICAgICAic2V0X3RleHQiOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IiwKICAgICAgICAic2V0X3RpbWVvdXQiOiAiZnVuKHNlbGY6IEhMLk5vdGlmaWNhdGlvbiwgLi4uKTogYW55IgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Ob3RpZmljYXRpb24iCiAgICB9LAogICAgIkhMLk5vdGlmaWNhdGlvbk5hbWVzcGFjZSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiY3JlYXRlIjogImZ1bihvcHRzPzogSEwuTm90aWZpY2F0aW9uT3B0aW9ucyk6IEhMLk5vdGlmaWNhdGlvbiIsCiAgICAgICAgImdldCI6ICJmdW4oKTogSEwuTm90aWZpY2F0aW9uW10iCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLk5vdGlmaWNhdGlvbk5hbWVzcGFjZSIKICAgIH0sCiAgICAiSEwuTm90aWZpY2F0aW9uT3B0aW9ucyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiY29sb3IiOiAic3RyaW5nIiwKICAgICAgICAiZm9udF9zaXplIjogIm51bWJlciIsCiAgICAgICAgImljb24iOiAiaW50ZWdlcnxzdHJpbmciLAogICAgICAgICJ0ZXh0IjogInN0cmluZyIsCiAgICAgICAgInRpbWVvdXQiOiAibnVtYmVyIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Ob3RpZmljYXRpb25PcHRpb25zIgogICAgfSwKICAgICJITC5QZXJtaXNzaW9uU3BlYyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYmluYXJ5IjogInN0cmluZyIsCiAgICAgICAgIm1vZGUiOiAic3RyaW5nIiwKICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLlBlcm1pc3Npb25TcGVjIgogICAgfSwKICAgICJITC5QbHVnaW4iOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImF1dGhvciI6ICJzdHJpbmciLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJzdHJpbmciLAogICAgICAgICJuYW1lIjogInN0cmluZyIsCiAgICAgICAgInZlcnNpb24iOiAic3RyaW5nIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5QbHVnaW4iCiAgICB9LAogICAgIkhMLlBsdWdpbk5hbWVzcGFjZSI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAibG9hZCI6ICJmdW4oLi4uKTogYW55IgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5QbHVnaW5OYW1lc3BhY2UiCiAgICB9LAogICAgIkhMLlRpbWVyIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJpc19lbmFibGVkIjogImZ1bihzZWxmOiBITC5UaW1lciwgLi4uKTogYW55IiwKICAgICAgICAic2V0X2VuYWJsZWQiOiAiZnVuKHNlbGY6IEhMLlRpbWVyLCAuLi4pOiBhbnkiLAogICAgICAgICJzZXRfdGltZW91dCI6ICJmdW4oc2VsZjogSEwuVGltZXIsIC4uLik6IGFueSIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuVGltZXIiCiAgICB9LAogICAgIkhMLlRpbWVyT3B0aW9ucyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAidGltZW91dCI6ICJpbnRlZ2VyIiwKICAgICAgICAidHlwZSI6ICJcInJlcGVhdFwifFwib25lc2hvdFwiIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5UaW1lck9wdGlvbnMiCiAgICB9LAogICAgIkhMLlZlYzIiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgIngiOiAibnVtYmVyIiwKICAgICAgICAieSI6ICJudW1iZXIiCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLlZlYzIiCiAgICB9LAogICAgIkhMLldpbmRvdyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYWNjZXB0c19pbnB1dCI6ICJib29sZWFuIiwKICAgICAgICAiYWN0aXZlIjogImJvb2xlYW4iLAogICAgICAgICJhZGRyZXNzIjogInN0cmluZyIsCiAgICAgICAgImFsbG93ZWRfb3Zlcl9mdWxsc2NyZWVuIjogImJvb2xlYW4iLAogICAgICAgICJhdCI6ICJpbnRlZ2VyfHRhYmxlIiwKICAgICAgICAiY2xhc3MiOiAic3RyaW5nIiwKICAgICAgICAiY29udGVudF90eXBlIjogInN0cmluZyIsCiAgICAgICAgImZsb2F0aW5nIjogImJvb2xlYW4iLAogICAgICAgICJmb2N1c19oaXN0b3J5X2lkIjogImludGVnZXIiLAogICAgICAgICJmdWxsc2NyZWVuIjogImludGVnZXIiLAogICAgICAgICJmdWxsc2NyZWVuX2NsaWVudCI6ICJpbnRlZ2VyIiwKICAgICAgICAiZnVsbHNjcmVlbl9oYW5kbGVyIjogInN0cmluZyIsCiAgICAgICAgImdyb3VwIjogIkhMLkdyb3VwfG5pbCIsCiAgICAgICAgImhpZGRlbiI6ICJib29sZWFuIiwKICAgICAgICAiaW5oaWJpdGluZ19pZGxlIjogImJvb2xlYW4iLAogICAgICAgICJpbml0aWFsX2NsYXNzIjogInN0cmluZyIsCiAgICAgICAgImluaXRpYWxfdGl0bGUiOiAic3RyaW5nIiwKICAgICAgICAibGF5b3V0IjogIkhMLldpbmRvd3xib29sZWFufGludGVnZXJ8bnVtYmVyfHN0cmluZ3x0YWJsZXxuaWwiLAogICAgICAgICJtYXBwZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgIm1vbml0b3IiOiAiSEwuTW9uaXRvcnxuaWwiLAogICAgICAgICJwaWQiOiAiaW50ZWdlciIsCiAgICAgICAgInBpbl9mdWxsc2NyZWVuZWQiOiAiYm9vbGVhbiIsCiAgICAgICAgInBpbm5lZCI6ICJib29sZWFuIiwKICAgICAgICAic2l6ZSI6ICJpbnRlZ2VyfHRhYmxlIiwKICAgICAgICAic3RhYmxlX2lkIjogImludGVnZXIiLAogICAgICAgICJzd2FsbG93aW5nIjogIkhMLldpbmRvd3xuaWwiLAogICAgICAgICJ0YWdzIjogInN0cmluZ3x0YWJsZSIsCiAgICAgICAgInRlYXJpbmdfaGludCI6ICJib29sZWFufG5pbCIsCiAgICAgICAgInRpdGxlIjogInN0cmluZyIsCiAgICAgICAgInZpc2libGUiOiAiYm9vbGVhbiIsCiAgICAgICAgIndvcmtzcGFjZSI6ICJITC5Xb3Jrc3BhY2V8bmlsIiwKICAgICAgICAieGRnX2Rlc2NyaXB0aW9uIjogInN0cmluZ3xuaWwiLAogICAgICAgICJ4ZGdfdGFnIjogInN0cmluZ3xuaWwiLAogICAgICAgICJ4d2F5bGFuZCI6ICJib29sZWFuIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5XaW5kb3ciCiAgICB9LAogICAgIkhMLldpbmRvd1F1ZXJ5RmlsdGVyIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJjbGFzcyI6ICJzdHJpbmciLAogICAgICAgICJmbG9hdGluZyI6ICJib29sZWFuIiwKICAgICAgICAibWFwcGVkIjogImJvb2xlYW4iLAogICAgICAgICJtb25pdG9yIjogIkhMLk1vbml0b3JTZWxlY3RvciIsCiAgICAgICAgInRhZyI6ICJzdHJpbmciLAogICAgICAgICJ0aXRsZSI6ICJzdHJpbmciLAogICAgICAgICJ3b3Jrc3BhY2UiOiAiSEwuV29ya3NwYWNlU2VsZWN0b3IiCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLldpbmRvd1F1ZXJ5RmlsdGVyIgogICAgfSwKICAgICJITC5XaW5kb3dSdWxlIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJpc19lbmFibGVkIjogImZ1bihzZWxmOiBITC5XaW5kb3dSdWxlLCAuLi4pOiBhbnkiLAogICAgICAgICJzZXRfZW5hYmxlZCI6ICJmdW4oc2VsZjogSEwuV2luZG93UnVsZSwgLi4uKTogYW55IgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5XaW5kb3dSdWxlIgogICAgfSwKICAgICJITC5XaW5kb3dSdWxlU3BlYyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAibWF0Y2giOiAidGFibGU8c3RyaW5nLCBzdHJpbmd8bnVtYmVyfGJvb2xlYW4+IiwKICAgICAgICAibmFtZSI6ICJzdHJpbmciCiAgICAgIH0sCiAgICAgICJuYW1lIjogIkhMLldpbmRvd1J1bGVTcGVjIgogICAgfSwKICAgICJITC5Xb3Jrc3BhY2UiOiB7CiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgImFjdGl2ZSI6ICJib29sZWFuIiwKICAgICAgICAiY29uZmlnX25hbWUiOiAic3RyaW5nIiwKICAgICAgICAiZnVsbHNjcmVlbl9tb2RlIjogImludGVnZXIiLAogICAgICAgICJmdWxsc2NyZWVuX3dpbmRvdyI6ICJITC5XaW5kb3d8bmlsIiwKICAgICAgICAiZ2V0X2dyb3VwcyI6ICJmdW4oc2VsZjogSEwuV29ya3NwYWNlLCAuLi4pOiBhbnkiLAogICAgICAgICJnZXRfd2luZG93cyI6ICJmdW4oc2VsZjogSEwuV29ya3NwYWNlLCAuLi4pOiBhbnkiLAogICAgICAgICJncm91cHMiOiAiaW50ZWdlcnxuaWwiLAogICAgICAgICJoYXNfZnVsbHNjcmVlbiI6ICJib29sZWFuIiwKICAgICAgICAiaGFzX3VyZ2VudCI6ICJib29sZWFuIiwKICAgICAgICAiaWQiOiAiaW50ZWdlciIsCiAgICAgICAgImlzX2VtcHR5IjogImJvb2xlYW4iLAogICAgICAgICJpc19wZXJzaXN0ZW50IjogImJvb2xlYW4iLAogICAgICAgICJsYXN0X3dpbmRvdyI6ICJITC5XaW5kb3d8bmlsIiwKICAgICAgICAibW9uaXRvciI6ICJITC5Nb25pdG9yfG5pbCIsCiAgICAgICAgIm5hbWUiOiAic3RyaW5nIiwKICAgICAgICAic3BlY2lhbCI6ICJib29sZWFuIiwKICAgICAgICAidGlsZWRfbGF5b3V0IjogInN0cmluZyIsCiAgICAgICAgInZpc2libGUiOiAiYm9vbGVhbiIsCiAgICAgICAgIndpbmRvd3MiOiAiaW50ZWdlciIKICAgICAgfSwKICAgICAgIm5hbWUiOiAiSEwuV29ya3NwYWNlIgogICAgfSwKICAgICJITC5Xb3Jrc3BhY2VSdWxlIjogewogICAgICAiZmllbGRzIjogewogICAgICAgICJpc19lbmFibGVkIjogImZ1bihzZWxmOiBITC5Xb3Jrc3BhY2VSdWxlLCAuLi4pOiBhbnkiLAogICAgICAgICJzZXRfZW5hYmxlZCI6ICJmdW4oc2VsZjogSEwuV29ya3NwYWNlUnVsZSwgLi4uKTogYW55IgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Xb3Jrc3BhY2VSdWxlIgogICAgfSwKICAgICJITC5Xb3Jrc3BhY2VSdWxlU3BlYyI6IHsKICAgICAgImZpZWxkcyI6IHsKICAgICAgICAiYW5pbWF0aW9uIjogInN0cmluZyIsCiAgICAgICAgImJvcmRlcl9zaXplIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAgICAgImRlY29yYXRlIjogImJvb2xlYW4iLAogICAgICAgICJkZWZhdWx0IjogImJvb2xlYW4iLAogICAgICAgICJkZWZhdWx0X25hbWUiOiAic3RyaW5nIiwKICAgICAgICAiZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICAgICAiZmxvYXRfZ2FwcyI6ICJpbnRlZ2VyfEhMLkNzc0dhcCIsCiAgICAgICAgImdhcHNfaW4iOiAiaW50ZWdlcnxITC5Dc3NHYXAiLAogICAgICAgICJnYXBzX291dCI6ICJpbnRlZ2VyfEhMLkNzc0dhcCIsCiAgICAgICAgImxheW91dCI6ICJzdHJpbmciLAogICAgICAgICJsYXlvdXRfb3B0cyI6ICJ0YWJsZTxzdHJpbmcsIHN0cmluZ3xudW1iZXJ8Ym9vbGVhbj4iLAogICAgICAgICJtb25pdG9yIjogInN0cmluZyIsCiAgICAgICAgIm5vX2JvcmRlciI6ICJib29sZWFuIiwKICAgICAgICAibm9fcm91bmRpbmciOiAiYm9vbGVhbiIsCiAgICAgICAgIm5vX3NoYWRvdyI6ICJib29sZWFuIiwKICAgICAgICAib25fY3JlYXRlZF9lbXB0eSI6ICJzdHJpbmciLAogICAgICAgICJwZXJzaXN0ZW50IjogImJvb2xlYW4iLAogICAgICAgICJ3b3Jrc3BhY2UiOiAic3RyaW5nIgogICAgICB9LAogICAgICAibmFtZSI6ICJITC5Xb3Jrc3BhY2VSdWxlU3BlYyIKICAgIH0KICB9LAogICJjb25maWdfdmFsdWVfdHlwZXMiOiB7CiAgICAiYW5pbWF0aW9ucy5lbmFibGVkIjogImJvb2xlYW4iLAogICAgImFuaW1hdGlvbnMud29ya3NwYWNlX3dyYXBhcm91bmQiOiAiYm9vbGVhbiIsCiAgICAiYmluZHMuYWxsb3dfcGluX2Z1bGxzY3JlZW4iOiAiYm9vbGVhbiIsCiAgICAiYmluZHMuYWxsb3dfd29ya3NwYWNlX2N5Y2xlcyI6ICJib29sZWFuIiwKICAgICJiaW5kcy5kaXNhYmxlX2tleWJpbmRfZ3JhYmJpbmciOiAiYm9vbGVhbiIsCiAgICAiYmluZHMuZHJhZ190aHJlc2hvbGQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJiaW5kcy5mb2N1c19wcmVmZXJyZWRfbWV0aG9kIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiYmluZHMuaGlkZV9zcGVjaWFsX29uX3dvcmtzcGFjZV9jaGFuZ2UiOiAiYm9vbGVhbiIsCiAgICAiYmluZHMuaWdub3JlX2dyb3VwX2xvY2siOiAiYm9vbGVhbiIsCiAgICAiYmluZHMubW92ZWZvY3VzX2N5Y2xlc19mdWxsc2NyZWVuIjogImJvb2xlYW4iLAogICAgImJpbmRzLm1vdmVmb2N1c19jeWNsZXNfZ3JvdXBmaXJzdCI6ICJib29sZWFuIiwKICAgICJiaW5kcy5wYXNzX21vdXNlX3doZW5fYm91bmQiOiAiYm9vbGVhbiIsCiAgICAiYmluZHMuc2Nyb2xsX2V2ZW50X2RlbGF5IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiYmluZHMud2luZG93X2RpcmVjdGlvbl9tb25pdG9yX2ZhbGxiYWNrIjogImJvb2xlYW4iLAogICAgImJpbmRzLndvcmtzcGFjZV9iYWNrX2FuZF9mb3J0aCI6ICJib29sZWFuIiwKICAgICJiaW5kcy53b3Jrc3BhY2VfY2VudGVyX29uIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiY3Vyc29yLmRlZmF1bHRfbW9uaXRvciI6ICJzdHJpbmciLAogICAgImN1cnNvci5lbmFibGVfaHlwcmN1cnNvciI6ICJib29sZWFuIiwKICAgICJjdXJzb3IuaGlkZV9vbl9rZXlfcHJlc3MiOiAiYm9vbGVhbiIsCiAgICAiY3Vyc29yLmhpZGVfb25fdGFibGV0IjogImJvb2xlYW4iLAogICAgImN1cnNvci5oaWRlX29uX3RvdWNoIjogImJvb2xlYW4iLAogICAgImN1cnNvci5ob3RzcG90X3BhZGRpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJjdXJzb3IuaW5hY3RpdmVfdGltZW91dCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiY3Vyc29yLmludmlzaWJsZSI6ICJib29sZWFuIiwKICAgICJjdXJzb3IubWluX3JlZnJlc2hfcmF0ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImN1cnNvci5ub19icmVha19mc192cnIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJjdXJzb3Iubm9faGFyZHdhcmVfY3Vyc29ycyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImN1cnNvci5ub193YXJwcyI6ICJib29sZWFuIiwKICAgICJjdXJzb3IucGVyc2lzdGVudF93YXJwcyI6ICJib29sZWFuIiwKICAgICJjdXJzb3Iuc3luY19nc2V0dGluZ3NfdGhlbWUiOiAiYm9vbGVhbiIsCiAgICAiY3Vyc29yLnVzZV9jcHVfYnVmZmVyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiY3Vyc29yLndhcnBfYmFja19hZnRlcl9ub25fbW91c2VfaW5wdXQiOiAiYm9vbGVhbiIsCiAgICAiY3Vyc29yLndhcnBfb25fY2hhbmdlX3dvcmtzcGFjZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImN1cnNvci53YXJwX29uX3RvZ2dsZV9zcGVjaWFsIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiY3Vyc29yLnpvb21fZGV0YWNoZWRfY2FtZXJhIjogImJvb2xlYW4iLAogICAgImN1cnNvci56b29tX2Rpc2FibGVfYWEiOiAiYm9vbGVhbiIsCiAgICAiY3Vyc29yLnpvb21fZmFjdG9yIjogIm51bWJlcnxib29sZWFuIiwKICAgICJjdXJzb3Iuem9vbV9yaWdpZCI6ICJib29sZWFuIiwKICAgICJkZWJ1Zy5jb2xvcmVkX3N0ZG91dF9sb2dzIjogImJvb2xlYW4iLAogICAgImRlYnVnLmRhbWFnZV9ibGluayI6ICJib29sZWFuIiwKICAgICJkZWJ1Zy5kYW1hZ2VfdHJhY2tpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJkZWJ1Zy5kaXNhYmxlX2xvZ3MiOiAiYm9vbGVhbiIsCiAgICAiZGVidWcuZGlzYWJsZV9zY2FsZV9jaGVja3MiOiAiYm9vbGVhbiIsCiAgICAiZGVidWcuZGlzYWJsZV90aW1lIjogImJvb2xlYW4iLAogICAgImRlYnVnLmRzX2hhbmRsZV9zYW1lX2J1ZmZlciI6ICJib29sZWFuIiwKICAgICJkZWJ1Zy5kc19oYW5kbGVfc2FtZV9idWZmZXJfZmlmbyI6ICJib29sZWFuIiwKICAgICJkZWJ1Zy5lbmFibGVfc3Rkb3V0X2xvZ3MiOiAiYm9vbGVhbiIsCiAgICAiZGVidWcuZXJyb3JfbGltaXQiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJkZWJ1Zy5lcnJvcl9wb3NpdGlvbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImRlYnVnLmZpZm9fcGVuZGluZ193b3JrYXJvdW5kIjogImJvb2xlYW4iLAogICAgImRlYnVnLmZ1bGxfY21fcHJvdG8iOiAiYm9vbGVhbiIsCiAgICAiZGVidWcuZ2xfZGVidWdnaW5nIjogImJvb2xlYW4iLAogICAgImRlYnVnLmludmFsaWRhdGVfZnAxNiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImRlYnVnLmxvZ19kYW1hZ2UiOiAiYm9vbGVhbiIsCiAgICAiZGVidWcubWFudWFsX2NyYXNoIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZGVidWcub3ZlcmxheSI6ICJib29sZWFuIiwKICAgICJkZWJ1Zy5wYXNzIjogImJvb2xlYW4iLAogICAgImRlYnVnLnJlbmRlcl9zb2xpdGFyeV93b19kYW1hZ2UiOiAiYm9vbGVhbiIsCiAgICAiZGVidWcuc3VwcHJlc3NfZXJyb3JzIjogImJvb2xlYW4iLAogICAgImRlYnVnLnZmciI6ICJib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmFjdGl2ZV9vcGFjaXR5IjogIm51bWJlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmJsdXIuYnJpZ2h0bmVzcyI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5ibHVyLmNvbnRyYXN0IjogIm51bWJlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmJsdXIuZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmJsdXIuaWdub3JlX29wYWNpdHkiOiAiYm9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5ibHVyLmlucHV0X21ldGhvZHMiOiAiYm9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5ibHVyLmlucHV0X21ldGhvZHNfaWdub3JlYWxwaGEiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImRlY29yYXRpb24uYmx1ci5uZXdfb3B0aW1pemF0aW9ucyI6ICJib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmJsdXIubm9pc2UiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImRlY29yYXRpb24uYmx1ci5wYXNzZXMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmJsdXIucG9wdXBzIjogImJvb2xlYW4iLAogICAgImRlY29yYXRpb24uYmx1ci5wb3B1cHNfaWdub3JlYWxwaGEiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImRlY29yYXRpb24uYmx1ci5zaXplIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5ibHVyLnNwZWNpYWwiOiAiYm9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5ibHVyLnZpYnJhbmN5IjogIm51bWJlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmJsdXIudmlicmFuY3lfZGFya25lc3MiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImRlY29yYXRpb24uYmx1ci54cmF5IjogImJvb2xlYW4iLAogICAgImRlY29yYXRpb24uYm9yZGVyX3BhcnRfb2Zfd2luZG93IjogImJvb2xlYW4iLAogICAgImRlY29yYXRpb24uZGltX2Fyb3VuZCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5kaW1faW5hY3RpdmUiOiAiYm9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5kaW1fbW9kYWwiOiAiYm9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5kaW1fc3BlY2lhbCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5kaW1fc3RyZW5ndGgiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImRlY29yYXRpb24uZnVsbHNjcmVlbl9vcGFjaXR5IjogIm51bWJlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmdsb3cuY29sb3IiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJkZWNvcmF0aW9uLmdsb3cuY29sb3JfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJkZWNvcmF0aW9uLmdsb3cuZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmdsb3cucmFuZ2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLmdsb3cucmVuZGVyX3Bvd2VyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5pbmFjdGl2ZV9vcGFjaXR5IjogIm51bWJlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLm1vdGlvbl9ibHVyLmVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5tb3Rpb25fYmx1ci5zYW1wbGVzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5yb3VuZGluZyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImRlY29yYXRpb24ucm91bmRpbmdfcG93ZXIiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImRlY29yYXRpb24uc2NyZWVuX3NoYWRlciI6ICJzdHJpbmciLAogICAgImRlY29yYXRpb24uc2hhZG93LmNvbG9yIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAiZGVjb3JhdGlvbi5zaGFkb3cuY29sb3JfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJkZWNvcmF0aW9uLnNoYWRvdy5lbmFibGVkIjogImJvb2xlYW4iLAogICAgImRlY29yYXRpb24uc2hhZG93Lm9mZnNldCI6ICJITC5WZWMyTGlrZSIsCiAgICAiZGVjb3JhdGlvbi5zaGFkb3cucmFuZ2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLnNoYWRvdy5yZW5kZXJfcG93ZXIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJkZWNvcmF0aW9uLnNoYWRvdy5zY2FsZSI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiZGVjb3JhdGlvbi5zaGFkb3cuc2hhcnAiOiAiYm9vbGVhbiIsCiAgICAiZHdpbmRsZS5kZWZhdWx0X3NwbGl0X3JhdGlvIjogIm51bWJlcnxib29sZWFuIiwKICAgICJkd2luZGxlLmZvcmNlX3NwbGl0IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZHdpbmRsZS5wZXJtYW5lbnRfZGlyZWN0aW9uX292ZXJyaWRlIjogImJvb2xlYW4iLAogICAgImR3aW5kbGUucHJlY2lzZV9tb3VzZV9tb3ZlIjogImJvb2xlYW4iLAogICAgImR3aW5kbGUucHJlc2VydmVfc3BsaXQiOiAiYm9vbGVhbiIsCiAgICAiZHdpbmRsZS5zbWFydF9yZXNpemluZyI6ICJib29sZWFuIiwKICAgICJkd2luZGxlLnNtYXJ0X3NwbGl0IjogImJvb2xlYW4iLAogICAgImR3aW5kbGUuc3BlY2lhbF9zY2FsZV9mYWN0b3IiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImR3aW5kbGUuc3BsaXRfYmlhcyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImR3aW5kbGUuc3BsaXRfd2lkdGhfbXVsdGlwbGllciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiZHdpbmRsZS51c2VfYWN0aXZlX2Zvcl9zcGxpdHMiOiAiYm9vbGVhbiIsCiAgICAiZWNvc3lzdGVtLmVuZm9yY2VfcGVybWlzc2lvbnMiOiAiYm9vbGVhbiIsCiAgICAiZWNvc3lzdGVtLm5vX2RvbmF0aW9uX25hZyI6ICJib29sZWFuIiwKICAgICJlY29zeXN0ZW0ubm9fdXBkYXRlX25ld3MiOiAiYm9vbGVhbiIsCiAgICAiZXhwZXJpbWVudGFsLndwX2NtXzFfMiI6ICJib29sZWFuIiwKICAgICJnZW5lcmFsLmFsbG93X3RlYXJpbmciOiAiYm9vbGVhbiIsCiAgICAiZ2VuZXJhbC5ib3JkZXJfc2l6ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdlbmVyYWwuY29sLmFjdGl2ZV9ib3JkZXIiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJnZW5lcmFsLmNvbC5pbmFjdGl2ZV9ib3JkZXIiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJnZW5lcmFsLmNvbC5ub2dyb3VwX2JvcmRlciI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgImdlbmVyYWwuY29sLm5vZ3JvdXBfYm9yZGVyX2FjdGl2ZSI6ICJzdHJpbmd8SEwuR3JhZGllbnQiLAogICAgImdlbmVyYWwuZXh0ZW5kX2JvcmRlcl9ncmFiX2FyZWEiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJnZW5lcmFsLmZsb2F0X2dhcHMiOiAiaW50ZWdlcnxITC5Dc3NHYXAiLAogICAgImdlbmVyYWwuZ2Fwc19pbiI6ICJpbnRlZ2VyfEhMLkNzc0dhcCIsCiAgICAiZ2VuZXJhbC5nYXBzX291dCI6ICJpbnRlZ2VyfEhMLkNzc0dhcCIsCiAgICAiZ2VuZXJhbC5nYXBzX3dvcmtzcGFjZXMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJnZW5lcmFsLmhvdmVyX2ljb25fb25fYm9yZGVyIjogImJvb2xlYW4iLAogICAgImdlbmVyYWwubGF5b3V0IjogInN0cmluZyIsCiAgICAiZ2VuZXJhbC5sb2NhbGUiOiAic3RyaW5nIiwKICAgICJnZW5lcmFsLm1vZGFsX3BhcmVudF9ibG9ja2luZyI6ICJib29sZWFuIiwKICAgICJnZW5lcmFsLm5vX2ZvY3VzX2ZhbGxiYWNrIjogImJvb2xlYW4iLAogICAgImdlbmVyYWwucmVzaXplX2Nvcm5lciI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdlbmVyYWwucmVzaXplX29uX2JvcmRlciI6ICJib29sZWFuIiwKICAgICJnZW5lcmFsLnNuYXAuYm9yZGVyX292ZXJsYXAiOiAiYm9vbGVhbiIsCiAgICAiZ2VuZXJhbC5zbmFwLmVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAiZ2VuZXJhbC5zbmFwLm1vbml0b3JfZ2FwIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ2VuZXJhbC5zbmFwLnJlc3BlY3RfZ2FwcyI6ICJib29sZWFuIiwKICAgICJnZW5lcmFsLnNuYXAud2luZG93X2dhcCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdlc3R1cmVzLmNsb3NlX21heF90aW1lb3V0IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ2VzdHVyZXMuc2Nyb2xsaW5nLm1vdmVfc25hcF9jdXJzb3IiOiAiYm9vbGVhbiIsCiAgICAiZ2VzdHVyZXMuc2Nyb2xsaW5nLm1vdmVfc25hcF90b19ncmlkIjogImJvb2xlYW4iLAogICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9jYW5jZWxfcmF0aW8iOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9jcmVhdGVfbmV3IjogImJvb2xlYW4iLAogICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV9kaXJlY3Rpb25fbG9jayI6ICJib29sZWFuIiwKICAgICJnZXN0dXJlcy53b3Jrc3BhY2Vfc3dpcGVfZGlyZWN0aW9uX2xvY2tfdGhyZXNob2xkIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2Rpc3RhbmNlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2ZvcmV2ZXIiOiAiYm9vbGVhbiIsCiAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX2ludmVydCI6ICJib29sZWFuIiwKICAgICJnZXN0dXJlcy53b3Jrc3BhY2Vfc3dpcGVfbWluX3NwZWVkX3RvX2ZvcmNlIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX3RvdWNoIjogImJvb2xlYW4iLAogICAgImdlc3R1cmVzLndvcmtzcGFjZV9zd2lwZV90b3VjaF9pbnZlcnQiOiAiYm9vbGVhbiIsCiAgICAiZ2VzdHVyZXMud29ya3NwYWNlX3N3aXBlX3VzZV9yIjogImJvb2xlYW4iLAogICAgImdyb3VwLmF1dG9fZ3JvdXAiOiAiYm9vbGVhbiIsCiAgICAiZ3JvdXAuY29sLmJvcmRlcl9hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJncm91cC5jb2wuYm9yZGVyX2luYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAiZ3JvdXAuY29sLmJvcmRlcl9sb2NrZWRfYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAiZ3JvdXAuY29sLmJvcmRlcl9sb2NrZWRfaW5hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJncm91cC5kcmFnX2ludG9fZ3JvdXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJncm91cC5mb2N1c19yZW1vdmVkX3dpbmRvdyI6ICJib29sZWFuIiwKICAgICJncm91cC5ncm91cF9vbl9tb3ZldG93b3Jrc3BhY2UiOiAiYm9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuYmx1ciI6ICJib29sZWFuIiwKICAgICJncm91cC5ncm91cGJhci5jb2wuYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuY29sLmluYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuY29sLmxvY2tlZF9hY3RpdmUiOiAic3RyaW5nfEhMLkdyYWRpZW50IiwKICAgICJncm91cC5ncm91cGJhci5jb2wubG9ja2VkX2luYWN0aXZlIjogInN0cmluZ3xITC5HcmFkaWVudCIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuZGlzYWJsZV93aGVuX29ubHkiOiAiYm9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICJncm91cC5ncm91cGJhci5mb250X2ZhbWlseSI6ICJzdHJpbmciLAogICAgImdyb3VwLmdyb3VwYmFyLmZvbnRfc2l6ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLmZvbnRfd2VpZ2h0X2FjdGl2ZSI6ICJpbnRlZ2VyfHN0cmluZyIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuZm9udF93ZWlnaHRfaW5hY3RpdmUiOiAiaW50ZWdlcnxzdHJpbmciLAogICAgImdyb3VwLmdyb3VwYmFyLmdhcHNfaW4iOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJncm91cC5ncm91cGJhci5nYXBzX291dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLmdyYWRpZW50X3JvdW5kX29ubHlfZWRnZXMiOiAiYm9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuZ3JhZGllbnRfcm91bmRpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJncm91cC5ncm91cGJhci5ncmFkaWVudF9yb3VuZGluZ19wb3dlciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIuZ3JhZGllbnRzIjogImJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLmhlaWdodCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLmluZGljYXRvcl9nYXAiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJncm91cC5ncm91cGJhci5pbmRpY2F0b3JfaGVpZ2h0IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIua2VlcF91cHBlcl9nYXAiOiAiYm9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIubWlkZGxlX2NsaWNrX2Nsb3NlIjogImJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLnByaW9yaXR5IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIucmVuZGVyX3RpdGxlcyI6ICJib29sZWFuIiwKICAgICJncm91cC5ncm91cGJhci5yb3VuZF9vbmx5X2VkZ2VzIjogImJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLnJvdW5kaW5nIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIucm91bmRpbmdfcG93ZXIiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLnNjcm9sbGluZyI6ICJib29sZWFuIiwKICAgICJncm91cC5ncm91cGJhci5zdGFja2VkIjogImJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLnRleHRfY29sb3IiOiAic3RyaW5nIiwKICAgICJncm91cC5ncm91cGJhci50ZXh0X2NvbG9yX2luYWN0aXZlIjogInN0cmluZyIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIudGV4dF9jb2xvcl9sb2NrZWRfYWN0aXZlIjogInN0cmluZyIsCiAgICAiZ3JvdXAuZ3JvdXBiYXIudGV4dF9jb2xvcl9sb2NrZWRfaW5hY3RpdmUiOiAic3RyaW5nIiwKICAgICJncm91cC5ncm91cGJhci50ZXh0X29mZnNldCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdyb3VwLmdyb3VwYmFyLnRleHRfcGFkZGluZyI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImdyb3VwLmluc2VydF9hZnRlcl9jdXJyZW50IjogImJvb2xlYW4iLAogICAgImdyb3VwLm1lcmdlX2Zsb2F0ZWRfaW50b190aWxlZF9vbl9ncm91cGJhciI6ICJib29sZWFuIiwKICAgICJncm91cC5tZXJnZV9ncm91cHNfb25fZHJhZyI6ICJib29sZWFuIiwKICAgICJncm91cC5tZXJnZV9ncm91cHNfb25fZ3JvdXBiYXIiOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQuYWNjZWxfcHJvZmlsZSI6ICJzdHJpbmciLAogICAgImlucHV0LmVtdWxhdGVfZGlzY3JldGVfc2Nyb2xsIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQuZmxvYXRfc3dpdGNoX292ZXJyaWRlX2ZvY3VzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQuZm9jdXNfb25fY2xvc2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC5mb2xsb3dfbW91c2UiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC5mb2xsb3dfbW91c2Vfc2hyaW5rIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQuZm9sbG93X21vdXNlX3RocmVzaG9sZCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQuZm9yY2Vfbm9fYWNjZWwiOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQua2JfZmlsZSI6ICJzdHJpbmciLAogICAgImlucHV0LmtiX2xheW91dCI6ICJzdHJpbmciLAogICAgImlucHV0LmtiX21vZGVsIjogInN0cmluZyIsCiAgICAiaW5wdXQua2Jfb3B0aW9ucyI6ICJzdHJpbmciLAogICAgImlucHV0LmtiX3J1bGVzIjogInN0cmluZyIsCiAgICAiaW5wdXQua2JfdmFyaWFudCI6ICJzdHJpbmciLAogICAgImlucHV0LmxlZnRfaGFuZGVkIjogImJvb2xlYW4iLAogICAgImlucHV0Lm1vdXNlX3JlZm9jdXMiOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQubmF0dXJhbF9zY3JvbGwiOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQubnVtbG9ja19ieV9kZWZhdWx0IjogImJvb2xlYW4iLAogICAgImlucHV0Lm9mZl93aW5kb3dfYXhpc19ldmVudHMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC5yZXBlYXRfZGVsYXkiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC5yZXBlYXRfcmF0ZSI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImlucHV0LnJlc29sdmVfYmluZHNfYnlfc3ltIjogImJvb2xlYW4iLAogICAgImlucHV0LnJvdGF0aW9uIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQuc2Nyb2xsX2J1dHRvbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgImlucHV0LnNjcm9sbF9idXR0b25fbG9jayI6ICJib29sZWFuIiwKICAgICJpbnB1dC5zY3JvbGxfZmFjdG9yIjogIm51bWJlcnxib29sZWFuIiwKICAgICJpbnB1dC5zY3JvbGxfbWV0aG9kIjogInN0cmluZyIsCiAgICAiaW5wdXQuc2Nyb2xsX3BvaW50cyI6ICJzdHJpbmciLAogICAgImlucHV0LnNlbnNpdGl2aXR5IjogIm51bWJlcnxib29sZWFuIiwKICAgICJpbnB1dC5zcGVjaWFsX2ZhbGx0aHJvdWdoIjogImJvb2xlYW4iLAogICAgImlucHV0LnRhYmxldC5hYnNvbHV0ZV9yZWdpb25fcG9zaXRpb24iOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQudGFibGV0LmFjdGl2ZV9hcmVhX3Bvc2l0aW9uIjogIkhMLlZlYzJMaWtlIiwKICAgICJpbnB1dC50YWJsZXQuYWN0aXZlX2FyZWFfc2l6ZSI6ICJITC5WZWMyTGlrZSIsCiAgICAiaW5wdXQudGFibGV0LmxlZnRfaGFuZGVkIjogImJvb2xlYW4iLAogICAgImlucHV0LnRhYmxldC5vdXRwdXQiOiAic3RyaW5nIiwKICAgICJpbnB1dC50YWJsZXQucmVnaW9uX3Bvc2l0aW9uIjogIkhMLlZlYzJMaWtlIiwKICAgICJpbnB1dC50YWJsZXQucmVnaW9uX3NpemUiOiAiSEwuVmVjMkxpa2UiLAogICAgImlucHV0LnRhYmxldC5yZWxhdGl2ZV9pbnB1dCI6ICJib29sZWFuIiwKICAgICJpbnB1dC50YWJsZXQudHJhbnNmb3JtIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQudGFibGV0dG9vbC5lcmFzZXJfYnV0dG9uX21vZGUiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC50YWJsZXR0b29sLmVyYXNlcl9idXR0b25fb3ZlcnJpZGUiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC50YWJsZXR0b29sLnByZXNzdXJlX3JhbmdlX21heCI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQudGFibGV0dG9vbC5wcmVzc3VyZV9yYW5nZV9taW4iOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImlucHV0LnRvdWNoZGV2aWNlLmVuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQudG91Y2hkZXZpY2Uub3V0cHV0IjogInN0cmluZyIsCiAgICAiaW5wdXQudG91Y2hkZXZpY2UudHJhbnNmb3JtIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAiaW5wdXQudG91Y2hwYWQuY2xpY2tmaW5nZXJfYmVoYXZpb3IiOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQudG91Y2hwYWQuZGlzYWJsZV93aGlsZV90eXBpbmciOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQudG91Y2hwYWQuZHJhZ18zZmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC50b3VjaHBhZC5kcmFnX2xvY2siOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dC50b3VjaHBhZC5mbGlwX3giOiAiYm9vbGVhbiIsCiAgICAiaW5wdXQudG91Y2hwYWQuZmxpcF95IjogImJvb2xlYW4iLAogICAgImlucHV0LnRvdWNocGFkLm1pZGRsZV9idXR0b25fZW11bGF0aW9uIjogImJvb2xlYW4iLAogICAgImlucHV0LnRvdWNocGFkLm5hdHVyYWxfc2Nyb2xsIjogImJvb2xlYW4iLAogICAgImlucHV0LnRvdWNocGFkLnNjcm9sbF9mYWN0b3IiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgImlucHV0LnRvdWNocGFkLnRhcF9hbmRfZHJhZyI6ICJib29sZWFuIiwKICAgICJpbnB1dC50b3VjaHBhZC50YXBfYnV0dG9uX21hcCI6ICJzdHJpbmciLAogICAgImlucHV0LnRvdWNocGFkLnRhcF90b19jbGljayI6ICJib29sZWFuIiwKICAgICJpbnB1dC52aXJ0dWFsa2V5Ym9hcmQucmVsZWFzZV9wcmVzc2VkX29uX2Nsb3NlIjogImJvb2xlYW4iLAogICAgImlucHV0LnZpcnR1YWxrZXlib2FyZC5zaGFyZV9zdGF0ZXMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJpbnB1dF9jYXB0dXJlLmNhcHR1cmVfbW9kaWZpZXJzIjogImJvb2xlYW4iLAogICAgImlucHV0X2NhcHR1cmUuZW5mb3JjZV9iYXJyaWVycyI6ICJib29sZWFuIiwKICAgICJsYXlvdXQuc2luZ2xlX3dpbmRvd19hc3BlY3RfcmF0aW8iOiAiSEwuVmVjMkxpa2UiLAogICAgImxheW91dC5zaW5nbGVfd2luZG93X2FzcGVjdF9yYXRpb190b2xlcmFuY2UiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgIm1hc3Rlci5hbGxvd19zbWFsbF9zcGxpdCI6ICJib29sZWFuIiwKICAgICJtYXN0ZXIuYWx3YXlzX2tlZXBfcG9zaXRpb24iOiAiYm9vbGVhbiIsCiAgICAibWFzdGVyLmNlbnRlcl9pZ25vcmVzX3Jlc2VydmVkIjogImJvb2xlYW4iLAogICAgIm1hc3Rlci5jZW50ZXJfbWFzdGVyX2ZhbGxiYWNrIjogInN0cmluZyIsCiAgICAibWFzdGVyLmRyb3BfYXRfY3Vyc29yIjogImJvb2xlYW4iLAogICAgIm1hc3Rlci5mb2N1c19tYXN0ZXJfb25fY2xvc2UiOiAiYm9vbGVhbiIsCiAgICAibWFzdGVyLm1mYWN0IjogIm51bWJlcnxib29sZWFuIiwKICAgICJtYXN0ZXIubmV3X29uX2FjdGl2ZSI6ICJzdHJpbmciLAogICAgIm1hc3Rlci5uZXdfb25fdG9wIjogImJvb2xlYW4iLAogICAgIm1hc3Rlci5uZXdfc3RhdHVzIjogInN0cmluZyIsCiAgICAibWFzdGVyLm9yaWVudGF0aW9uIjogInN0cmluZyIsCiAgICAibWFzdGVyLnNsYXZlX2NvdW50X2Zvcl9jZW50ZXJfbWFzdGVyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAibWFzdGVyLnNtYXJ0X3Jlc2l6aW5nIjogImJvb2xlYW4iLAogICAgIm1hc3Rlci5zcGVjaWFsX3NjYWxlX2ZhY3RvciI6ICJudW1iZXJ8Ym9vbGVhbiIsCiAgICAibWlzYy5hbGxvd19zZXNzaW9uX2xvY2tfcmVzdG9yZSI6ICJib29sZWFuIiwKICAgICJtaXNjLmFsd2F5c19mb2xsb3dfb25fZG5kIjogImJvb2xlYW4iLAogICAgIm1pc2MuYW5pbWF0ZV9tYW51YWxfcmVzaXplcyI6ICJib29sZWFuIiwKICAgICJtaXNjLmFuaW1hdGVfbW91c2Vfd2luZG93ZHJhZ2dpbmciOiAiYm9vbGVhbiIsCiAgICAibWlzYy5hbnJfbWlzc2VkX3BpbmdzIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAibWlzYy5iYWNrZ3JvdW5kX2NvbG9yIjogInN0cmluZyIsCiAgICAibWlzYy5jbG9zZV9zcGVjaWFsX29uX2VtcHR5IjogImJvb2xlYW4iLAogICAgIm1pc2MuY29sLnNwbGFzaCI6ICJzdHJpbmciLAogICAgIm1pc2MuZGlzYWJsZV9hdXRvcmVsb2FkIjogImJvb2xlYW4iLAogICAgIm1pc2MuZGlzYWJsZV9oeXBybGFuZF9ndWl1dGlsc19jaGVjayI6ICJib29sZWFuIiwKICAgICJtaXNjLmRpc2FibGVfaHlwcmxhbmRfbG9nbyI6ICJib29sZWFuIiwKICAgICJtaXNjLmRpc2FibGVfc2NhbGVfbm90aWZpY2F0aW9uIjogImJvb2xlYW4iLAogICAgIm1pc2MuZGlzYWJsZV9zcGxhc2hfcmVuZGVyaW5nIjogImJvb2xlYW4iLAogICAgIm1pc2MuZGlzYWJsZV93YXRjaGRvZ193YXJuaW5nIjogImJvb2xlYW4iLAogICAgIm1pc2MuZGlzYWJsZV94ZGdfZW52X2NoZWNrcyI6ICJib29sZWFuIiwKICAgICJtaXNjLmVuYWJsZV9hbnJfZGlhbG9nIjogImJvb2xlYW4iLAogICAgIm1pc2MuZW5hYmxlX3N3YWxsb3ciOiAiYm9vbGVhbiIsCiAgICAibWlzYy5leGl0X3dpbmRvd19yZXRhaW5zX2Z1bGxzY3JlZW4iOiAiYm9vbGVhbiIsCiAgICAibWlzYy5mb2N1c19vbl9hY3RpdmF0ZSI6ICJib29sZWFuIiwKICAgICJtaXNjLmZvbnRfZmFtaWx5IjogInN0cmluZyIsCiAgICAibWlzYy5mb3JjZV9kZWZhdWx0X3dhbGxwYXBlciI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgIm1pc2MuaW5pdGlhbF93b3Jrc3BhY2VfdG9rZW5fdGltZW91dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgIm1pc2MuaW5pdGlhbF93b3Jrc3BhY2VfdHJhY2tpbmciOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJtaXNjLmtleV9wcmVzc19lbmFibGVzX2RwbXMiOiAiYm9vbGVhbiIsCiAgICAibWlzYy5sYXllcnNfaG9nX2tleWJvYXJkX2ZvY3VzIjogImJvb2xlYW4iLAogICAgIm1pc2MubG9ja2RlYWRfc2NyZWVuX2RlbGF5IjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAibWlzYy5taWRkbGVfY2xpY2tfcGFzdGUiOiAiYm9vbGVhbiIsCiAgICAibWlzYy5tb3VzZV9tb3ZlX2VuYWJsZXNfZHBtcyI6ICJib29sZWFuIiwKICAgICJtaXNjLm1vdXNlX21vdmVfZm9jdXNlc19tb25pdG9yIjogImJvb2xlYW4iLAogICAgIm1pc2MubmFtZV92a19hZnRlcl9wcm9jIjogImJvb2xlYW4iLAogICAgIm1pc2Mub25fZm9jdXNfdW5kZXJfZnVsbHNjcmVlbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgIm1pc2MucmVuZGVyX3VuZm9jdXNlZF9mcHMiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJtaXNjLnNjcmVlbmNvcHlfZm9yY2VfOGIiOiAiYm9vbGVhbiIsCiAgICAibWlzYy5zZXNzaW9uX2xvY2tfYmx1ciI6ICJib29sZWFuIiwKICAgICJtaXNjLnNlc3Npb25fbG9ja194cmF5IjogImJvb2xlYW4iLAogICAgIm1pc2Muc2l6ZV9saW1pdHNfdGlsZWQiOiAiYm9vbGVhbiIsCiAgICAibWlzYy5zcGxhc2hfZm9udF9mYW1pbHkiOiAic3RyaW5nIiwKICAgICJtaXNjLnN3YWxsb3dfZXhjZXB0aW9uX3JlZ2V4IjogInN0cmluZyIsCiAgICAibWlzYy5zd2FsbG93X3JlZ2V4IjogInN0cmluZyIsCiAgICAibWlzYy52cnIiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJvcGVuZ2wubnZpZGlhX2FudGlfZmxpY2tlciI6ICJib29sZWFuIiwKICAgICJxdWlya3MucHJlZmVyX2hkciI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgInF1aXJrcy5za2lwX25vbl9rbXNfZG1hYnVmX2Zvcm1hdHMiOiAiYm9vbGVhbiIsCiAgICAicmVuZGVyLmNtX2F1dG9faGRyIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAicmVuZGVyLmNtX2VuYWJsZWQiOiAiYm9vbGVhbiIsCiAgICAicmVuZGVyLmNtX3Nkcl9lb3RmIjogInN0cmluZyIsCiAgICAicmVuZGVyLmNvbW1pdF90aW1pbmdfZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICJyZW5kZXIuY3RtX2FuaW1hdGlvbiI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgInJlbmRlci5kaXJlY3Rfc2Nhbm91dCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgInJlbmRlci5leHBhbmRfdW5kZXJzaXplZF90ZXh0dXJlcyI6ICJib29sZWFuIiwKICAgICJyZW5kZXIuZnAxNl9zZHJfdGYiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJyZW5kZXIuaWNjX3ZjZ3RfZW5hYmxlZCI6ICJib29sZWFuIiwKICAgICJyZW5kZXIua2VlcF91bm1vZGlmaWVkX2NvcHkiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJyZW5kZXIubmV3X3JlbmRlcl9zY2hlZHVsaW5nIjogImJvb2xlYW4iLAogICAgInJlbmRlci5ub25fc2hhZGVyX2NtIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAicmVuZGVyLm5vbl9zaGFkZXJfY21faW50ZXJvcCI6ICJpbnRlZ2VyfGJvb2xlYW4iLAogICAgInJlbmRlci5zZW5kX2NvbnRlbnRfdHlwZSI6ICJib29sZWFuIiwKICAgICJyZW5kZXIudXNlX2ZwMTYiOiAiaW50ZWdlcnxib29sZWFuIiwKICAgICJyZW5kZXIudXNlX3NoYWRlcl9ibHVyX2JsZW5kIjogImJvb2xlYW4iLAogICAgInJlbmRlci54cF9tb2RlIjogImJvb2xlYW4iLAogICAgInNjcm9sbGluZy5jb2x1bW5fd2lkdGgiOiAibnVtYmVyfGJvb2xlYW4iLAogICAgInNjcm9sbGluZy5kaXJlY3Rpb24iOiAic3RyaW5nIiwKICAgICJzY3JvbGxpbmcuZXhwbGljaXRfY29sdW1uX3dpZHRocyI6ICJzdHJpbmciLAogICAgInNjcm9sbGluZy5mb2N1c19maXRfbWV0aG9kIjogImludGVnZXJ8Ym9vbGVhbiIsCiAgICAic2Nyb2xsaW5nLmZvbGxvd19mb2N1cyI6ICJib29sZWFuIiwKICAgICJzY3JvbGxpbmcuZm9sbG93X21pbl92aXNpYmxlIjogIm51bWJlcnxib29sZWFuIiwKICAgICJzY3JvbGxpbmcuZnVsbHNjcmVlbl9vbl9vbmVfY29sdW1uIjogImJvb2xlYW4iLAogICAgInNjcm9sbGluZy53cmFwX2ZvY3VzIjogImJvb2xlYW4iLAogICAgInNjcm9sbGluZy53cmFwX3N3YXBjb2wiOiAiYm9vbGVhbiIsCiAgICAieHdheWxhbmQuY3JlYXRlX2Fic3RyYWN0X3NvY2tldCI6ICJib29sZWFuIiwKICAgICJ4d2F5bGFuZC5lbmFibGVkIjogImJvb2xlYW4iLAogICAgInh3YXlsYW5kLmZvcmNlX3plcm9fc2NhbGluZyI6ICJib29sZWFuIiwKICAgICJ4d2F5bGFuZC51c2VfbmVhcmVzdF9uZWlnaGJvciI6ICJib29sZWFuIgogIH0KfQo="; diff --git a/tests/test_checker.py b/tests/test_checker.py index c13bf0e..fdd16eb 100644 --- a/tests/test_checker.py +++ b/tests/test_checker.py @@ -98,6 +98,37 @@ def test_gradient_table_value_accepted_without_deep_structural_check(): assert findings == [] +def test_generic_table_type_spec_field_accepts_a_table_value(): + """HL.LayerRuleSpec.match is typed `table` - + LuaLS's generic map syntax, not `string|HL.Gradient` (a class + alternative) or a `{...}` literal shape. `_has_table_alternative` + didn't recognize "table<...>" at all, so this was a false positive on + every real layer rule with a match table - found by running + hyprvalidate against two independent real-world Hyprland Lua configs + (Garuda Linux's distribution settings and the sea-shell project), both + of which use exactly this pattern and both of which hit it.""" + schema = _schema() + findings = checker.check_source( + schema, + 'hl.layer_rule({ name = "blur-all-layers", match = { namespace = ".*" } })', + ) + assert findings == [] + + +def test_has_table_alternative_recognizes_every_real_table_shaped_form(): + """The schema uses three distinct textual shapes for "this alternative + is a table, not a scalar": a class reference (`HL.Gradient`), a + `{...}` literal shape, and LuaLS's generic `table<...>` / bare `table` + form - the last of which was missing before this fix. A genuinely + scalar-only type must still correctly return False, or every + type-mismatch check in this module goes blind.""" + assert checker._has_table_alternative("string|HL.Gradient") + assert checker._has_table_alternative("integer|table") + assert checker._has_table_alternative("table") + assert not checker._has_table_alternative("boolean") + assert not checker._has_table_alternative("string") + + def test_non_literal_config_value_is_accepted_uncritically(): """A variable reference can't be statically type-checked - accepted, not flagged, per the documented scope limitation."""