Parked: migrate re-keys mis-keyed unified-store snapshots (a6ca2233)
Parked snapshot of muse commit a6ca2233 — "fix: migrate re-keys mis-keyed snapshots in the unified object store" (modifies muse/core/migrate.py, adds tests/test_migrate_rekey_unified_snapshot.py). WHY PARKED (not in the codebase): the staging gabriel/muse clone failure was NOT caused by mis-keyed snapshots. The real causes were (1) dropped snapshot *directories* in storage and (2) a migration-stamped spurious signer_public_key on 2 main-line merge commits. Those were fixed via repair-snapshot, the new repair-commit endpoint, and the serve-path recovery hardening (musehub c00aa21d) — all shipped to dev/main + staging. This migrate-rekey change therefore solves a non-existent problem and touches the destructive object-store-rewrite path (muse code migrate), so it is intentionally kept OUT of the tree. Preserved for reference only. Reconstruct with: muse apply-patch <this artifact>. Captured during the rc13 ship-out, 2026-06-16.
{"patch_id":"sha256:e20a1b60c0b8effb1d6ad30df4bb8c55322662b77db084aa6967dae555697cb3","from_snapshot_id":"sha256:bca18592e9118048bef8fa1d8a9da35d64e38c037a42f3c94b3440aae8c9fbba","to_snapshot_id":"sha256:e0f2b300980d7b2ff4813db94421e47b3265243f5ee3113760434c4871074e24","from_commit_id":"sha256:e452ad9a6ace6ccc6d875a35e06caf9da5576a970c1c36133b69a891ce5fefa8","to_commit_id":"sha256:a6ca2233d0684c36eda29fdff67508b6e63449454f22e86eacba982ff0604df0","domain":"code","format_version":"1.0","created_at":"2026-06-16T21:59:01.835189+00:00","agent_id":"","model_id":"","signer_public_key":"","signature":"","intent":"","sem_ver_bump":"minor","breaking_changes":[],"summary":"1 file added, 1 file modified","ops":[{"op":"insert","address":"tests/test_migrate_rekey_unified_snapshot.py","position":null,"content_id":"sha256:92e77c7be4a7df04336bd19a0d8ed86346fd69c625e24890bb90c604a9e31d7b","content_summary":"tests/test_migrate_rekey_unified_snapshot.py added","action_label":"inserted"},{"op":"replace","address":"muse/core/migrate.py","position":null,"old_content_id":"sha256:86f1e84a17c251a218d861d90e38e92e57cbabdc6d1f31324bb57c002b5c00ec","new_content_id":"sha256:d166896c847b1d425027cf3f65b47109c2d93437eee741f788d13a4e44a2b87f","old_summary":"muse/core/migrate.py before","new_summary":"muse/core/migrate.py after","action_label":"modified"}],"files_added":["tests/test_migrate_rekey_unified_snapshot.py"],"files_modified":["muse/core/migrate.py"],"files_deleted":[],"files_renamed":{},"required_objects":["sha256:92e77c7be4a7df04336bd19a0d8ed86346fd69c625e24890bb90c604a9e31d7b","sha256:d166896c847b1d425027cf3f65b47109c2d93437eee741f788d13a4e44a2b87f"],"from_manifest":{"muse/core/migrate.py":"sha256:86f1e84a17c251a218d861d90e38e92e57cbabdc6d1f31324bb57c002b5c00ec"},"to_manifest":{"tests/test_migrate_rekey_unified_snapshot.py":"sha256:92e77c7be4a7df04336bd19a0d8ed86346fd69c625e24890bb90c604a9e31d7b","muse/core/migrate.py":"sha256:d166896c847b1d425027cf3f65b47109c2d93437eee741f788d13a4e44a2b87f"},"applicability":{"requires_snapshot":"sha256:bca18592e9118048bef8fa1d8a9da35d64e38c037a42f3c94b3440aae8c9fbba","independent_dimensions":[],"conflict_free":true},"blobs":{"sha256:92e77c7be4a7df04336bd19a0d8ed86346fd69c625e24890bb90c604a9e31d7b":"IiIiVEREIOKAlCBgbXVzZSBjb2RlIG1pZ3JhdGVgIG11c3QgcmUta2V5IG1pcy1rZXllZCBzbmFwc2hvdHMgaW4gdGhlIFVOSUZJRUQgb2JqZWN0IHN0b3JlLgoKUm9vdCBjYXVzZSAocmVncmVzc2lvbiB0aGF0IGJyb2tlIHRoZSBvZmZpY2lhbCBnYWJyaWVsL211c2UgY2xvbmUpOgpgbWlncmF0ZV9zbmFwc2hvdF9pZHNgIG9ubHkgZ2xvYnMgYC5tdXNlL3NuYXBzaG90cy9zaGEyNTYvKi5tc2dwYWNrYC4gQWZ0ZXIgYSByZXBvIGlzCnVuaWZpZWQgKHNuYXBzaG90cyByZWxvY2F0ZWQgaW50byBgLm11c2Uvb2JqZWN0cy9gKSwgdGhhdCBsZWdhY3kgZGlyIGlzIGVtcHR5LCBzbyBhCnNuYXBzaG90IHdob3NlIHN0b3JlZCBpZCBubyBsb25nZXIgZXF1YWxzIGBoYXNoX3NuYXBzaG90KGNvbnRlbnQpYCBpcyBuZXZlciByZS1rZXllZCDigJQKYW5kIGBtaWdyYXRlYCBpcyBhIHNpbGVudCBuby1vcCBvbiB0aGUgYWxyZWFkeS11bmlmaWVkIHJlcG8uIFN1Y2ggYSBzbmFwc2hvdCBpcwp1bmNsb25hYmxlOiB0aGUgY2xpZW50IHJlY29tcHV0ZXMgaXRzIGhhc2gsIGl0IG1pc21hdGNoZXMgdGhlIGlkLCB0aGUgY29tbWl0IGlzIGRyb3BwZWQsCmFuZCBldmVyeSBkZXNjZW5kYW50IGZhaWxzICJwYXJlbnQgbm90IGluIG1wYWNrIi4KClRoaXMgaXMgZXhhY3RseSBob3cgc3RhZ2luZyBgZ2FicmllbC9tdXNlYCBzbmFwc2hvdHMgYGVlYTA3YTFmYCAvIGA3MDhkNTczNGAgZW5kZWQgdXAKc3RvcmVkIHVuZGVyIGlkcyB0aGVpciBjb250ZW50IGRvZXNuJ3QgcmVwcm9kdWNlLgoKVGhlIGZpeDogYG1pZ3JhdGVgIG11c3Qgc2NhbiBzbmFwc2hvdCBvYmplY3RzIGluIHRoZSB1bmlmaWVkIHN0b3JlLCBkZXRlY3QgYW55IHdob3NlCnN0b3JlZCBpZCAhPSBgaGFzaF9zbmFwc2hvdChjb250ZW50KWAsIHJlLWtleSB0aGVtIHRvIHRoZSBjb3JyZWN0IGlkLCBhbmQgY2FzY2FkZSB0aGUKb2xk4oaSbmV3IG1hcHBpbmcgaW50byByZWZlcmVuY2luZyBjb21taXRzICh2aWEgdGhlIGV4aXN0aW5nIGNvbW1pdCBwYXNzKS4KClJFRCBiZWZvcmUgdGhlIGZpeDsgR1JFRU4gYWZ0ZXIuIElkZW1wb3RlbnQ6IGEgY29ycmVjdGx5LWtleWVkIHNuYXBzaG90IGlzIHVudG91Y2hlZC4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBkYXRldGltZQppbXBvcnQganNvbgppbXBvcnQgcGF0aGxpYgoKaW1wb3J0IG1zZ3BhY2sKCmZyb20gbXVzZS5jb3JlLmlkcyBpbXBvcnQgaGFzaF9jb21taXQgYXMgY29tcHV0ZV9jb21taXRfaWQsIGhhc2hfc25hcHNob3QgYXMgY29tcHV0ZV9zbmFwc2hvdF9pZApmcm9tIG11c2UuY29yZS5taWdyYXRlIGltcG9ydCBtaWdyYXRlCmZyb20gbXVzZS5jb3JlLm9iamVjdF9zdG9yZSBpbXBvcnQgb2JqZWN0X3BhdGgKZnJvbSBtdXNlLmNvcmUucGF0aHMgaW1wb3J0IGNvbW1pdHNfZGlyLCBtdXNlX2RpciwgcmVmX3BhdGgKZnJvbSBtdXNlLmNvcmUudHlwZXMgaW1wb3J0IGJsb2JfaWQsIGxvbmdfaWQsIHNwbGl0X2lkCgpfQVQgPSBkYXRldGltZS5kYXRldGltZSgyMDI2LCAxLCAxLCB0emluZm89ZGF0ZXRpbWUudGltZXpvbmUudXRjKQpfQVRfSVNPID0gX0FULmlzb2Zvcm1hdCgpCl9SRVBPX0lEID0gYmxvYl9pZChiInJla2V5LXVuaWZpZWQtdGVzdCIpCgoKIyAtLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRlZiBfaW5pdF9yZXBvKHRtcF9wYXRoOiBwYXRobGliLlBhdGgpIC0+IHBhdGhsaWIuUGF0aDoKICAgIG11c2UgPSBtdXNlX2Rpcih0bXBfcGF0aCkKICAgIGZvciBzdWIgaW4gKCJjb21taXRzL3NoYTI1NiIsICJzbmFwc2hvdHMvc2hhMjU2IiwgIm9iamVjdHMvc2hhMjU2IiwgInJlZnMvaGVhZHMiLCAicmVtb3RlcyIpOgogICAgICAgIChtdXNlIC8gc3ViKS5ta2RpcihwYXJlbnRzPVRydWUpCiAgICAobXVzZSAvICJIRUFEIikud3JpdGVfdGV4dCgicmVmOiByZWZzL2hlYWRzL21haW4iLCBlbmNvZGluZz0idXRmLTgiKQogICAgKG11c2UgLyAicmVwby5qc29uIikud3JpdGVfdGV4dChqc29uLmR1bXBzKHsicmVwb19pZCI6IF9SRVBPX0lELCAiZG9tYWluIjogImNvZGUifSksIGVuY29kaW5nPSJ1dGYtOCIpCiAgICByZXR1cm4gdG1wX3BhdGgKCgpkZWYgX3dyaXRlX3VuaWZpZWRfc25hcHNob3QocmVwbzogcGF0aGxpYi5QYXRoLCBzbmFwX2lkOiBzdHIsIG1hbmlmZXN0OiBkaWN0LCBkaXJlY3Rvcmllcz1Ob25lKSAtPiBOb25lOgogICAgIiIiU3RvcmUgYSBzbmFwc2hvdCBvYmplY3QgaW4gdGhlIHVuaWZpZWQgc3RvcmUga2V5ZWQgYnkgKnNuYXBfaWQqICh3aGljaCBtYXkgYmUKICAgIGRlbGliZXJhdGVseSBXUk9ORywgdG8gc2ltdWxhdGUgdGhlIGxlZ2FjeSBtaXMta2V5aW5nKS4iIiIKICAgIHJlYyA9IHsic25hcHNob3RfaWQiOiBzbmFwX2lkLCAibWFuaWZlc3QiOiBtYW5pZmVzdCwgImRpcmVjdG9yaWVzIjogZGlyZWN0b3JpZXMgb3IgW10sICJjcmVhdGVkX2F0IjogX0FUX0lTT30KICAgIHBheWxvYWQgPSBqc29uLmR1bXBzKHJlYywgc2VwYXJhdG9ycz0oIiwiLCAiOiIpKS5lbmNvZGUoKQogICAgYmxvYiA9IGYic25hcHNob3Qge2xlbihwYXlsb2FkKX1cMCIuZW5jb2RlKCkgKyBwYXlsb2FkCiAgICBwID0gb2JqZWN0X3BhdGgocmVwbywgc25hcF9pZCkKICAgIHAucGFyZW50Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgIHAud3JpdGVfYnl0ZXMoYmxvYikKCgpkZWYgX3JlYWRfdW5pZmllZF9zbmFwc2hvdChyZXBvOiBwYXRobGliLlBhdGgsIHNuYXBfaWQ6IHN0cikgLT4gZGljdDoKICAgIHJhdyA9IG9iamVjdF9wYXRoKHJlcG8sIHNuYXBfaWQpLnJlYWRfYnl0ZXMoKQogICAgbnVsID0gcmF3LmZpbmQoYiJcMCIpCiAgICByZXR1cm4ganNvbi5sb2FkcyhyYXdbbnVsICsgMTpdKQoKCmRlZiBfcmVhZF9jb21taXQocmVwbzogcGF0aGxpYi5QYXRoLCBjaWQ6IHN0cikgLT4gZGljdDoKICAgICIiIlJlYWQgYSBjb21taXQgYnkgaWQgZnJvbSB3aGVyZXZlciBtaWdyYXRlIGxlYXZlcyBpdCAodW5pZmllZCBvYmplY3Qgc3RvcmUgYXMKICAgIGBjb21taXQgPHNpemU+XFwwPGpzb24+YCwgb3IgdGhlIGxlZ2FjeSBgY29tbWl0cy9zaGEyNTYvPGhleD4ubXNncGFja2ApLiIiIgogICAgcCA9IG9iamVjdF9wYXRoKHJlcG8sIGNpZCkKICAgIGlmIHAuZXhpc3RzKCk6CiAgICAgICAgcmF3ID0gcC5yZWFkX2J5dGVzKCkKICAgICAgICBudWwgPSByYXcuZmluZChiIlwwIikKICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhyYXdbbnVsICsgMTpdKQogICAgaGV4X2lkID0gc3BsaXRfaWQoY2lkKVsxXQogICAgcmV0dXJuIG1zZ3BhY2sudW5wYWNrYigoY29tbWl0c19kaXIocmVwbykgLyAic2hhMjU2IiAvIGYie2hleF9pZH0ubXNncGFjayIpLnJlYWRfYnl0ZXMoKSwgcmF3PUZhbHNlKQoKCmRlZiBfd3JpdGVfY2Fub25pY2FsX2NvbW1pdChyZXBvOiBwYXRobGliLlBhdGgsIHNuYXBzaG90X2lkOiBzdHIsIG1lc3NhZ2U6IHN0cikgLT4gc3RyOgogICAgY2lkID0gY29tcHV0ZV9jb21taXRfaWQoCiAgICAgICAgcGFyZW50X2lkcz1bXSwgc25hcHNob3RfaWQ9c25hcHNob3RfaWQsIG1lc3NhZ2U9bWVzc2FnZSwKICAgICAgICBjb21taXR0ZWRfYXRfaXNvPV9BVF9JU08sIGF1dGhvcj0iZ2FicmllbCIsIHNpZ25lcl9wdWJsaWNfa2V5PSIiLAogICAgKQogICAgcmVjID0gewogICAgICAgICJjb21taXRfaWQiOiBjaWQsICJyZXBvX2lkIjogX1JFUE9fSUQsICJicmFuY2giOiAibWFpbiIsCiAgICAgICAgInNuYXBzaG90X2lkIjogc25hcHNob3RfaWQsICJtZXNzYWdlIjogbWVzc2FnZSwgImNvbW1pdHRlZF9hdCI6IF9BVF9JU08sCiAgICAgICAgInBhcmVudF9jb21taXRfaWQiOiBOb25lLCAicGFyZW50Ml9jb21taXRfaWQiOiBOb25lLCAiYXV0aG9yIjogImdhYnJpZWwiLAogICAgICAgICJtZXRhZGF0YSI6IHt9LCAic2lnbmF0dXJlIjogIiIsICJzaWduZXJfcHVibGljX2tleSI6ICIiLCAiZm9ybWF0X3ZlcnNpb24iOiA4LAogICAgfQogICAgaGV4X2lkID0gbG9uZ19pZChjaWQsIHN0cmlwPVRydWUpCiAgICBwID0gY29tbWl0c19kaXIocmVwbykgLyAic2hhMjU2IiAvIGYie2hleF9pZH0ubXNncGFjayIKICAgIHAucGFyZW50Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgIHAud3JpdGVfYnl0ZXMobXNncGFjay5wYWNrYihyZWMsIHVzZV9iaW5fdHlwZT1UcnVlKSkKICAgIHJlZl9wYXRoKHJlcG8sICJtYWluIikud3JpdGVfdGV4dChjaWQsIGVuY29kaW5nPSJ1dGYtOCIpCiAgICByZXR1cm4gY2lkCgoKIyAtLS0gdGVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRlZiB0ZXN0X21pZ3JhdGVfcmVrZXlzX21pc2tleWVkX3VuaWZpZWRfc25hcHNob3QodG1wX3BhdGg6IHBhdGhsaWIuUGF0aCkgLT4gTm9uZToKICAgIHJlcG8gPSBfaW5pdF9yZXBvKHRtcF9wYXRoKQogICAgbWFuaWZlc3QgPSB7InNyYy9hcHAucHkiOiBsb25nX2lkKCJhIiAqIDY0KSwgIlJFQURNRS5tZCI6IGxvbmdfaWQoImIiICogNjQpfQogICAgcmVhbF9zaWQgPSBjb21wdXRlX3NuYXBzaG90X2lkKG1hbmlmZXN0KSAgICAgICAgICAgICAgICAgICAgICAgIyB3aGF0IHRoZSBjb250ZW50IGhhc2hlcyB0bwogICAgd3Jvbmdfc2lkID0gY29tcHV0ZV9zbmFwc2hvdF9pZCh7InVucmVsYXRlZC5weSI6IGxvbmdfaWQoImMiICogNjQpfSkgICMgYSB2YWxpZCBidXQgV1JPTkcgaWQKICAgIGFzc2VydCB3cm9uZ19zaWQgIT0gcmVhbF9zaWQKICAgIF93cml0ZV91bmlmaWVkX3NuYXBzaG90KHJlcG8sIHdyb25nX3NpZCwgbWFuaWZlc3QpICAgICAgICAgICAgICMgc3RvcmVkIG1pcy1rZXllZAoKICAgIG1pZ3JhdGUocmVwbykKCiAgICAjIFRoZSBzbmFwc2hvdCBtdXN0IG5vdyBleGlzdCB1bmRlciBpdHMgQ09SUkVDVCBpZCwgd2l0aCBpbnRhY3QgY29udGVudC4KICAgIGFzc2VydCBvYmplY3RfcGF0aChyZXBvLCByZWFsX3NpZCkuZXhpc3RzKCksICgKICAgICAgICAibWlncmF0ZSBkaWQgbm90IHJlLWtleSB0aGUgbWlzLWtleWVkIHVuaWZpZWQtc3RvcmUgc25hcHNob3QgdG8gaXRzIGNvcnJlY3QgaWQiCiAgICApCiAgICByZWMgPSBfcmVhZF91bmlmaWVkX3NuYXBzaG90KHJlcG8sIHJlYWxfc2lkKQogICAgYXNzZXJ0IHJlY1sibWFuaWZlc3QiXSA9PSBtYW5pZmVzdCwgInJlLWtleSBtdXN0IHByZXNlcnZlIG1hbmlmZXN0IGNvbnRlbnQgKHJlLWtleSwgbm90IHJld3JpdGUpIgogICAgYXNzZXJ0IGNvbXB1dGVfc25hcHNob3RfaWQocmVjWyJtYW5pZmVzdCJdLCByZWMuZ2V0KCJkaXJlY3RvcmllcyIpIG9yIE5vbmUpID09IHJlYWxfc2lkCgoKZGVmIHRlc3RfbWlncmF0ZV9jYXNjYWRlc19yZWtleV9pbnRvX3JlZmVyZW5jaW5nX2NvbW1pdCh0bXBfcGF0aDogcGF0aGxpYi5QYXRoKSAtPiBOb25lOgogICAgcmVwbyA9IF9pbml0X3JlcG8odG1wX3BhdGgpCiAgICBtYW5pZmVzdCA9IHsic3JjL2FwcC5weSI6IGxvbmdfaWQoImEiICogNjQpfQogICAgcmVhbF9zaWQgPSBjb21wdXRlX3NuYXBzaG90X2lkKG1hbmlmZXN0KQogICAgd3Jvbmdfc2lkID0gY29tcHV0ZV9zbmFwc2hvdF9pZCh7InVucmVsYXRlZC5weSI6IGxvbmdfaWQoImMiICogNjQpfSkKICAgIF93cml0ZV91bmlmaWVkX3NuYXBzaG90KHJlcG8sIHdyb25nX3NpZCwgbWFuaWZlc3QpCiAgICBfd3JpdGVfY2Fub25pY2FsX2NvbW1pdChyZXBvLCB3cm9uZ19zaWQsICJydW5nOiBhcHAiKQoKICAgIG1pZ3JhdGUocmVwbykKCiAgICAjIFRoZSBicmFuY2ggcmVmIG11c3QgcG9pbnQgYXQgYSBjb21taXQgd2hvc2Ugc25hcHNob3RfaWQgaXMgdGhlIFJFLUtFWUVEIGlkLgogICAgbmV3X2hlYWQgPSByZWZfcGF0aChyZXBvLCAibWFpbiIpLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKS5zdHJpcCgpCiAgICBjcmVjID0gX3JlYWRfY29tbWl0KHJlcG8sIG5ld19oZWFkKQogICAgYXNzZXJ0IGNyZWNbInNuYXBzaG90X2lkIl0gPT0gcmVhbF9zaWQsICgKICAgICAgICAiY29tbWl0IHN0aWxsIHJlZmVyZW5jZXMgdGhlIGRlYWQgbWlzLWtleWVkIHNuYXBzaG90IGlkIOKAlCByZS1rZXkgd2FzIG5vdCBjYXNjYWRlZCIKICAgICkKCgpkZWYgdGVzdF9taWdyYXRlX2xlYXZlc19jb3JyZWN0bHlfa2V5ZWRfdW5pZmllZF9zbmFwc2hvdF91bnRvdWNoZWQodG1wX3BhdGg6IHBhdGhsaWIuUGF0aCkgLT4gTm9uZToKICAgICIiIklkZW1wb3RlbmNlIGd1YXJkOiBhIHNuYXBzaG90IGFscmVhZHkga2V5ZWQgYnkgaGFzaF9zbmFwc2hvdChjb250ZW50KSBpcyBub3QgY2hhbmdlZC4iIiIKICAgIHJlcG8gPSBfaW5pdF9yZXBvKHRtcF9wYXRoKQogICAgbWFuaWZlc3QgPSB7InNyYy9hcHAucHkiOiBsb25nX2lkKCJhIiAqIDY0KX0KICAgIHNpZCA9IGNvbXB1dGVfc25hcHNob3RfaWQobWFuaWZlc3QpCiAgICBfd3JpdGVfdW5pZmllZF9zbmFwc2hvdChyZXBvLCBzaWQsIG1hbmlmZXN0KSAgICAgICAgICAgICAgICAgICAjIGNvcnJlY3RseSBrZXllZAoKICAgIG1pZ3JhdGUocmVwbykKCiAgICBhc3NlcnQgb2JqZWN0X3BhdGgocmVwbywgc2lkKS5leGlzdHMoKQogICAgYXNzZXJ0IF9yZWFkX3VuaWZpZWRfc25hcHNob3QocmVwbywgc2lkKVsibWFuaWZlc3QiXSA9PSBtYW5pZmVzdAo=","sha256:d166896c847b1d425027cf3f65b47109c2d93437eee741f788d13a4e44a2b87f":"IiIiRnVsbCBsYXlvdXQgYW5kIGNvbW1pdC1JRCBtaWdyYXRpb24gZW5naW5lLgoKTWlncmF0ZXMgYW55IE11c2UgcmVwb3NpdG9yeSBmcm9tIGxlZ2FjeSBvbi1kaXNrIGxheW91dHMgdG8gdGhlIGNhbm9uaWNhbApjdXJyZW50IGxheW91dDoKCk9sZCBsYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbm9uaWNhbCBsYXlvdXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpvYmplY3RzLzxzaGFyZD4vPHJlc3Q+ICAgICAgICAgICAgICAgICAgb2JqZWN0cy9zaGEyNTYvPHNoYXJkPi88cmVzdD4KY29tbWl0cy88aGV4Pi5tc2dwYWNrICAgICAgICAgICAgICAgICAgIGNvbW1pdHMvc2hhMjU2LzxoZXg+Lm1zZ3BhY2sKc25hcHNob3RzLzxoZXg+Lm1zZ3BhY2sgICAgICAgICAgICAgICAgIHNuYXBzaG90cy9zaGEyNTYvPGhleD4ubXNncGFjawpicmFuY2ggcmVmOiBiYXJlIGhleCAgICAgICAgICAgICAgICAgICAgYnJhbmNoIHJlZjogc2hhMjU2OjxoZXg+CnJlbW90ZSByZWY6IGJhcmUgaGV4IG9yIHN0YWxlIElEICAgICAgICByZW1vdGUgcmVmOiBzaGEyNTY6PGN1cnJlbnQtaGV4PgpyZXBvX2lkOiBwbGFpbiBzdHJpbmcgKHByZS1zaGEyNTYpICAgICAgcmVwb19pZDogc2hhMjU2OjxoZXg+CmNvbW1pdCBmaWVsZDogY3JlYXRlZF9vbl9icmFuY2ggICAgICAgICBjb21taXQgZmllbGQ6IGJyYW5jaApjb21taXQgZmllbGQ6IGZvcm1hdF92ZXJzaW9uIDwgOCAgICAgICAgY29tbWl0IGZpZWxkOiBmb3JtYXRfdmVyc2lvbiA9IDgKY29tbWl0IHNpZ25hdHVyZTogYmFyZSBiYXNlNjR1cmwgICAgICAgIGNvbW1pdCBzaWduYXR1cmU6IGVkMjU1MTk6PGJhc2U2NHVybD4KY29tbWl0X2lkOiBsZWdhY3kgZm9ybXVsYSAgICAgICAgICAgICAgIGNvbW1pdF9pZDogaGFzaF9jb21taXQoLi4uKQoKRW50cnkgcG9pbnRzCi0tLS0tLS0tLS0tLQotIDpmdW5jOmBtaWdyYXRlYCDigJQgZnVsbCBleGVjdXRpb24gb3IgZHJ5LXJ1bgotIDpjbGFzczpgTWlncmF0ZVJlc3VsdGAg4oCUIHJldHVybmVkIGJ5IDpmdW5jOmBtaWdyYXRlYAoiIiIKCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHBhdGhsaWIKaW1wb3J0IHNodXRpbApmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MsIGZpZWxkCmZyb20gdHlwaW5nIGltcG9ydCBUWVBFX0NIRUNLSU5HCgppbXBvcnQgbXNncGFjawoKZnJvbSBtdXNlLmNvcmUucGF0aHMgaW1wb3J0ICgKICAgIGNvbW1pdHNfZGlyLCBoZWFkc19kaXIsIGxvZ3NfZGlyLCBtdXNlX2RpciwKICAgIG9iamVjdHNfZGlyLCByZWJhc2VfbWVyZ2VfZGlyLCByZW1vdGVzX2RpciwKICAgIHJlcG9fanNvbl9wYXRoLCBzbmFwc2hvdHNfZGlyLAopCmZyb20gbXVzZS5jb3JlLmlkcyBpbXBvcnQgaGFzaF9ibG9iLCBoYXNoX2NvbW1pdCwgaGFzaF9zbmFwc2hvdApmcm9tIG11c2UuY29yZS50eXBlcyBpbXBvcnQgYjY0dXJsX2RlY29kZSwgYmxvYl9pZCwgZW5jb2RlX3NpZywgbG9uZ19pZApmcm9tIG11c2UuY29yZS5yZWZzIGltcG9ydCBnZXRfYWxsX2JyYW5jaF9oZWFkcywgd3JpdGVfYnJhbmNoX3JlZgoKaWYgVFlQRV9DSEVDS0lORzoKICAgIGZyb20gbXVzZS5jb3JlLnRyYW5zcG9ydCBpbXBvcnQgU2lnbmluZ0lkZW50aXR5Cgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCnR5cGUgX0lkTWFwID0gZGljdFtzdHIsIHN0cl0KdHlwZSBfUmF3Q29tbWl0ID0gZGljdFtzdHIsIHN0ciB8IGludCB8IGZsb2F0IHwgYnl0ZXMgfCBkYXRldGltZS5kYXRldGltZSB8IE5vbmVdCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQaGFzZSA3IOKAlCBibG9iIElEIG1pZ3JhdGlvbiByZXN1bHQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkBkYXRhY2xhc3MKY2xhc3MgQmxvYk1pZ3JhdGVSZXN1bHQ6CiAgICAiIiJSZXN1bHQgb2YgOmZ1bmM6YG1pZ3JhdGVfYmxvYl9pZHNgLiIiIgogICAgaWRfbWFwOiBkaWN0W3N0ciwgc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1kaWN0KQogICAgYmxvYnNfd3JpdHRlbjogaW50ID0gMAogICAgYmxvYnNfc2tpcHBlZDogaW50ID0gMAogICAgZHJ5X3J1bjogYm9vbCA9IEZhbHNlCnR5cGUgX0NvbW1pdEVudHJ5ID0gdHVwbGVbX1Jhd0NvbW1pdCwgcGF0aGxpYi5QYXRoXQp0eXBlIF9Db21taXRJbmRleCA9IGRpY3Rbc3RyLCBfQ29tbWl0RW50cnldCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFJlc3VsdCB0eXBlCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpAZGF0YWNsYXNzCmNsYXNzIE1pZ3JhdGVSZXN1bHQ6CiAgICBpZF9tYXA6IGRpY3Rbc3RyLCBzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWRpY3QpCiAgICBjb21taXRzX3Jld3JpdHRlbjogaW50ID0gMAogICAgYmxvYnNfbWlncmF0ZWQ6IGludCA9IDAKICAgIGxlZ2FjeV9kaXJzX3JlbW92ZWQ6IGludCA9IDAKICAgIGRyeV9ydW46IGJvb2wgPSBGYWxzZQogICAgY29tbWl0c19yZWxvY2F0ZWQ6IGludCA9IDAKICAgIHNuYXBzaG90c19yZWxvY2F0ZWQ6IGludCA9IDAKICAgIHJlZnNfdXBkYXRlZDogaW50ID0gMAogICAgcmVtb3RlX3JlZnNfdXBkYXRlZDogaW50ID0gMAogICAgcmVwb19pZF91cGRhdGVkOiBib29sID0gRmFsc2UKICAgIGJyYW5jaF9maWVsZHNfcmVuYW1lZDogaW50ID0gMAogICAgc2lnbmF0dXJlc19ub3JtYWxpc2VkOiBpbnQgPSAwCiAgICBmb3JtYXRfdmVyc2lvbnNfYnVtcGVkOiBpbnQgPSAwCiAgICByZWZsb2dzX3VwZGF0ZWQ6IGludCA9IDAKICAgIGNvbW1pdHNfc2lnbmVkOiBpbnQgPSAwCiAgICB1bnNpZ25lZF9jb21taXRzX3NraXBwZWQ6IGludCA9IDAKICAgICMgUGhhc2UgNyDigJQgdW5pZmllZCBvYmplY3Qgc3RvcmUgYmFja2ZpbGwKICAgIGJsb2JzX3Jld3JpdHRlbjogaW50ID0gMAogICAgc25hcHNob3RzX3Jld3JpdHRlbjogaW50ID0gMAogICAgY29tbWl0c191bmlmaWVkOiBpbnQgPSAwCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEludGVybmFsIGhlbHBlcnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRlZiBfbm9ybWFsaXNlX3NpZyhzaWc6IHN0cikgLT4gc3RyOgogICAgaWYgbm90IHNpZyBvciBzaWcuc3RhcnRzd2l0aCgiZWQyNTUxOToiKToKICAgICAgICByZXR1cm4gc2lnCiAgICByYXcgPSBiNjR1cmxfZGVjb2RlKHNpZykKICAgIHJldHVybiBlbmNvZGVfc2lnKCJlZDI1NTE5IiwgcmF3KQoKZGVmIF9jb21taXR0ZWRfYXRfaXNvKHJhdzogX1Jhd0NvbW1pdCkgLT4gc3RyOgogICAgdmFsID0gcmF3LmdldCgiY29tbWl0dGVkX2F0IiwgIiIpCiAgICBpZiBpc2luc3RhbmNlKHZhbCwgZGF0ZXRpbWUuZGF0ZXRpbWUpOgogICAgICAgIHJldHVybiB2YWwuaXNvZm9ybWF0KCkKICAgIHJldHVybiBzdHIodmFsKQoKZGVmIF9jb2xsZWN0X2FsbF9jb21taXRzKHJvb3Q6IHBhdGhsaWIuUGF0aCkgLT4gX0NvbW1pdEluZGV4OgogICAgIiIiUmVhZCBldmVyeSBjb21taXQgZmlsZSBpbiB0aGUgc3RvcmUuCgogICAgUmV0dXJucyBhIG1hcHBpbmcgb2YgY29tbWl0X2lkIOKGkiAocmF3X2RpY3QsIGZpbGVfcGF0aCkuICBDb3ZlcnM6CiAgICAtIExlZ2FjeSBtc2dwYWNrIGZpbGVzIGluIGBgLm11c2UvY29tbWl0cy9zaGEyNTYvYGAKICAgIC0gVW5pZmllZCBvYmplY3Qgc3RvcmUgZW50cmllcyBpbiBgYC5tdXNlL29iamVjdHMvc2hhMjU2L2BgIHdpdGggYQogICAgICBgYGNvbW1pdCA8c2l6ZT5cXDA8anNvbj5gYCBoZWFkZXIKICAgICIiIgogICAgcmVzdWx0OiBfQ29tbWl0SW5kZXggPSB7fQoKICAgICMgTGVnYWN5IG1zZ3BhY2sgY29tbWl0cwogICAgX2RpciA9IGNvbW1pdHNfZGlyKHJvb3QpCiAgICBpZiBfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBwYXRoIGluIF9kaXIucmdsb2IoIioubXNncGFjayIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByYXcgPSBtc2dwYWNrLnVucGFja2IocGF0aC5yZWFkX2J5dGVzKCksIHJhdz1GYWxzZSkKICAgICAgICAgICAgICAgIGNpZCA9IHJhdy5nZXQoImNvbW1pdF9pZCIsICIiKQogICAgICAgICAgICAgICAgaWYgY2lkOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdFtjaWRdID0gKHJhdywgcGF0aCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiU2tpcHBpbmcgdW5yZWFkYWJsZSBjb21taXQgJXM6ICVzIiwgcGF0aCwgZXhjKQoKICAgICMgVW5pZmllZCBvYmplY3Qgc3RvcmUgY29tbWl0cyAoY29tbWl0IDxzaXplPlwwPGpzb24+KQogICAgb2JqX2RpciA9IG9iamVjdHNfZGlyKHJvb3QpIC8gInNoYTI1NiIKICAgIGlmIG9ial9kaXIuZXhpc3RzKCk6CiAgICAgICAgZm9yIHBhdGggaW4gb2JqX2Rpci5nbG9iKCIqLyoiKToKICAgICAgICAgICAgaWYgbm90IHBhdGguaXNfZmlsZSgpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGF0YSA9IHBhdGgucmVhZF9ieXRlcygpCiAgICAgICAgICAgICAgICBpZiBub3QgZGF0YS5zdGFydHN3aXRoKGIiY29tbWl0ICIpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBubCA9IGRhdGEuaW5kZXgoYiJceDAwIikKICAgICAgICAgICAgICAgIHJhdyA9IGpzb24ubG9hZHMoZGF0YVtubCArIDE6XSkKICAgICAgICAgICAgICAgIGNpZCA9IHJhdy5nZXQoImNvbW1pdF9pZCIsICIiKQogICAgICAgICAgICAgICAgaWYgY2lkIGFuZCBjaWQgbm90IGluIHJlc3VsdDoKICAgICAgICAgICAgICAgICAgICByZXN1bHRbY2lkXSA9IChyYXcsIHBhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIlNraXBwaW5nIHVucmVhZGFibGUgb2JqZWN0ICVzOiAlcyIsIHBhdGgsIGV4YykKCiAgICByZXR1cm4gcmVzdWx0CgpkZWYgX3RvcG9sb2dpY2FsX3NvcnQoY29tbWl0czogX0NvbW1pdEluZGV4KSAtPiBsaXN0W3N0cl06CiAgICAiIiJSZXR1cm4gY29tbWl0IElEcyBpbiB0b3BvbG9naWNhbCBvcmRlciAocGFyZW50cyBiZWZvcmUgY2hpbGRyZW4pLiIiIgogICAgaW5fZGVncmVlOiBkaWN0W3N0ciwgaW50XSA9IHtjaWQ6IDAgZm9yIGNpZCBpbiBjb21taXRzfQogICAgY2hpbGRyZW46IGRpY3Rbc3RyLCBsaXN0W3N0cl1dID0ge2NpZDogW10gZm9yIGNpZCBpbiBjb21taXRzfQoKICAgIGZvciBjaWQsIChyYXcsIF8pIGluIGNvbW1pdHMuaXRlbXMoKToKICAgICAgICBmb3Iga2V5IGluICgicGFyZW50X2NvbW1pdF9pZCIsICJwYXJlbnQyX2NvbW1pdF9pZCIpOgogICAgICAgICAgICBwaWQgPSByYXcuZ2V0KGtleSkKICAgICAgICAgICAgaWYgcGlkIGFuZCBwaWQgaW4gY29tbWl0czoKICAgICAgICAgICAgICAgIGluX2RlZ3JlZVtjaWRdID0gaW5fZGVncmVlLmdldChjaWQsIDApICsgMQogICAgICAgICAgICAgICAgY2hpbGRyZW5bcGlkXS5hcHBlbmQoY2lkKQoKICAgIHF1ZXVlOiBjb2xsZWN0aW9ucy5kZXF1ZVtzdHJdID0gY29sbGVjdGlvbnMuZGVxdWUoCiAgICAgICAgc29ydGVkKGNpZCBmb3IgY2lkLCBkZWcgaW4gaW5fZGVncmVlLml0ZW1zKCkgaWYgZGVnID09IDApCiAgICApCiAgICBvcmRlcjogbGlzdFtzdHJdID0gW10KICAgIHdoaWxlIHF1ZXVlOgogICAgICAgIGNpZCA9IHF1ZXVlLnBvcGxlZnQoKQogICAgICAgIG9yZGVyLmFwcGVuZChjaWQpCiAgICAgICAgZm9yIGNoaWxkIGluIHNvcnRlZChjaGlsZHJlbi5nZXQoY2lkLCBbXSkpOgogICAgICAgICAgICBpbl9kZWdyZWVbY2hpbGRdIC09IDEKICAgICAgICAgICAgaWYgaW5fZGVncmVlW2NoaWxkXSA9PSAwOgogICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKGNoaWxkKQogICAgcmV0dXJuIG9yZGVyCgpkZWYgX21ha2VfY2Fub25pY2FsX2RpY3QoCiAgICByYXc6IF9SYXdDb21taXQsCiAgICBpZF9tYXA6IF9JZE1hcCwKICAgIHNpZ25pbmdfaWRlbnRpdHk6IFNpZ25pbmdJZGVudGl0eSB8IE5vbmUgPSBOb25lLAogICAgZm9yY2VfcmVzaWduOiBib29sID0gRmFsc2UsCikgLT4gdHVwbGVbX1Jhd0NvbW1pdCwgc3RyLCBib29sXToKICAgICIiIkJ1aWxkIHRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiBhIHJhdyBjb21taXQgZGljdC4KCiAgICBSZXR1cm5zIGBgKGNhbm9uaWNhbF9kaWN0LCBuZXdfY29tbWl0X2lkLCB3YXNfc2lnbmVkKWBgLgogICAgYGB3YXNfc2lnbmVkYGAgaXMgVHJ1ZSB3aGVuIGEgbmV3IHNpZ25hdHVyZSB3YXMgY3JlYXRlZCAodW5zaWduZWQgY29tbWl0LAogICAgcGFyZW50IGNhc2NhZGUsIG9yIGBgZm9yY2VfcmVzaWduYGApLgogICAgIiIiCiAgICBwMSA9IHJhdy5nZXQoInBhcmVudF9jb21taXRfaWQiKQogICAgcDIgPSByYXcuZ2V0KCJwYXJlbnQyX2NvbW1pdF9pZCIpCiAgICBuZXdfcDEgPSBpZF9tYXAuZ2V0KHAxLCBwMSkgaWYgcDEgZWxzZSBOb25lCiAgICBuZXdfcDIgPSBpZF9tYXAuZ2V0KHAyLCBwMikgaWYgcDIgZWxzZSBOb25lCgogICAgcGFyZW50X2lkczogbGlzdFtzdHJdID0gW10KICAgIGlmIG5ld19wMToKICAgICAgICBwYXJlbnRfaWRzLmFwcGVuZChuZXdfcDEpCiAgICBpZiBuZXdfcDI6CiAgICAgICAgcGFyZW50X2lkcy5hcHBlbmQobmV3X3AyKQoKICAgIHNuYXBzaG90X2lkOiBzdHIgPSByYXcuZ2V0KCJzbmFwc2hvdF9pZCIsICIiKQogICAgbWVzc2FnZTogc3RyID0gcmF3LmdldCgibWVzc2FnZSIsICIiKQogICAgY29tbWl0dGVkX2F0X2lzbyA9IF9jb21taXR0ZWRfYXRfaXNvKHJhdykKICAgIGF1dGhvcjogc3RyID0gcmF3LmdldCgiYXV0aG9yIiwgIiIpCgogICAgcGFyZW50c19jaGFuZ2VkID0gKG5ld19wMSAhPSBwMSkgb3IgKG5ld19wMiAhPSBwMikKICAgIGlzX3Vuc2lnbmVkID0gbm90IHJhdy5nZXQoInNpZ25hdHVyZSIpIGFuZCBub3QgcmF3LmdldCgic2lnbmVyX3B1YmxpY19rZXkiKQogICAgIyBSZS1zaWduIHdoZW46IChhKSBjb21taXQgd2FzIHVuc2lnbmVkLCAoYikgcGFyZW50IElEcyBjaGFuZ2VkIHNvIHRoZQogICAgIyBvbGQgc2lnbmF0dXJlIGNvdmVycyB0aGUgd3JvbmcgY29tbWl0X2lkLCBvciAoYykgZm9yY2VfcmVzaWduIGlzIHNldC4KICAgIHNob3VsZF9zaWduID0gc2lnbmluZ19pZGVudGl0eSBpcyBub3QgTm9uZSBhbmQgKGlzX3Vuc2lnbmVkIG9yIHBhcmVudHNfY2hhbmdlZCBvciBmb3JjZV9yZXNpZ24pCgogICAgIyBOb3JtYWxpc2UgZW1wdHkgYXV0aG9yIHRvIHRoZSBzaWduaW5nIGlkZW50aXR5J3MgaGFuZGxlIHNvIGV2ZXJ5CiAgICAjIHJlc2lnbmVkIGNvbW1pdCBjYXJyaWVzIHByb3BlciBhdHRyaWJ1dGlvbiBiYWtlZCBpbnRvIGl0cyBjb250ZW50IGhhc2guCiAgICBpZiBzaG91bGRfc2lnbiBhbmQgc2lnbmluZ19pZGVudGl0eSBpcyBub3QgTm9uZSBhbmQgbm90IGF1dGhvcjoKICAgICAgICBhdXRob3IgPSBzaWduaW5nX2lkZW50aXR5LmhhbmRsZQoKICAgIGlmIHNob3VsZF9zaWduOgogICAgICAgIGZyb20gbXVzZS5jb3JlLnByb3ZlbmFuY2UgaW1wb3J0IGVuY29kZV9wdWJsaWNfa2V5LCBwcm92ZW5hbmNlX3BheWxvYWQsIHNpZ25fY29tbWl0X2VkMjU1MTkKICAgICAgICBfLCBwdWJfc3RyID0gZW5jb2RlX3B1YmxpY19rZXkoc2lnbmluZ19pZGVudGl0eS5wcml2YXRlX2tleSkgICMgdHlwZTogaWdub3JlW2FyZy10eXBlXQogICAgICAgIG5ld19pZCA9IGhhc2hfY29tbWl0KAogICAgICAgICAgICBwYXJlbnRfaWRzPXBhcmVudF9pZHMsCiAgICAgICAgICAgIHNuYXBzaG90X2lkPXNuYXBzaG90X2lkLAogICAgICAgICAgICBtZXNzYWdlPW1lc3NhZ2UsCiAgICAgICAgICAgIGNvbW1pdHRlZF9hdF9pc289Y29tbWl0dGVkX2F0X2lzbywKICAgICAgICAgICAgYXV0aG9yPWF1dGhvciwKICAgICAgICAgICAgc2lnbmVyX3B1YmxpY19rZXk9cHViX3N0ciwKICAgICAgICApCiAgICAgICAgcGF5bG9hZCA9IHByb3ZlbmFuY2VfcGF5bG9hZCgKICAgICAgICAgICAgY29tbWl0X2lkPW5ld19pZCwKICAgICAgICAgICAgYXV0aG9yPWF1dGhvciwKICAgICAgICAgICAgYWdlbnRfaWQ9cmF3LmdldCgiYWdlbnRfaWQiLCAiIiksCiAgICAgICAgICAgIG1vZGVsX2lkPXJhdy5nZXQoIm1vZGVsX2lkIiwgIiIpLAogICAgICAgICAgICB0b29sY2hhaW5faWQ9cmF3LmdldCgidG9vbGNoYWluX2lkIiwgIiIpLAogICAgICAgICAgICBwcm9tcHRfaGFzaD1yYXcuZ2V0KCJwcm9tcHRfaGFzaCIsICIiKSwKICAgICAgICAgICAgY29tbWl0dGVkX2F0PWNvbW1pdHRlZF9hdF9pc28sCiAgICAgICAgKQogICAgICAgIHNpZyA9IHNpZ25fY29tbWl0X2VkMjU1MTkocGF5bG9hZCwgc2lnbmluZ19pZGVudGl0eS5wcml2YXRlX2tleSkgICMgdHlwZTogaWdub3JlW2FyZy10eXBlXQogICAgZWxzZToKICAgICAgICBwdWJfc3RyID0gcmF3LmdldCgic2lnbmVyX3B1YmxpY19rZXkiLCAiIikKICAgICAgICBuZXdfaWQgPSBoYXNoX2NvbW1pdCgKICAgICAgICAgICAgcGFyZW50X2lkcz1wYXJlbnRfaWRzLAogICAgICAgICAgICBzbmFwc2hvdF9pZD1zbmFwc2hvdF9pZCwKICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlLAogICAgICAgICAgICBjb21taXR0ZWRfYXRfaXNvPWNvbW1pdHRlZF9hdF9pc28sCiAgICAgICAgICAgIGF1dGhvcj1hdXRob3IsCiAgICAgICAgICAgIHNpZ25lcl9wdWJsaWNfa2V5PXB1Yl9zdHIsCiAgICAgICAgKQogICAgICAgIHNpZyA9IF9ub3JtYWxpc2Vfc2lnKHJhdy5nZXQoInNpZ25hdHVyZSIsICIiKSkKCiAgICBicmFuY2hfdmFsID0gcmF3LmdldCgiYnJhbmNoIikgb3IgcmF3LmdldCgiY3JlYXRlZF9vbl9icmFuY2giKSBvciAibWFpbiIKCiAgICBvdXQgPSBkaWN0KHJhdykKICAgIG91dFsiY29tbWl0X2lkIl0gPSBuZXdfaWQKICAgIG91dFsicGFyZW50X2NvbW1pdF9pZCJdID0gbmV3X3AxCiAgICBvdXRbInBhcmVudDJfY29tbWl0X2lkIl0gPSBuZXdfcDIKICAgIG91dFsiYXV0aG9yIl0gPSBhdXRob3IKICAgIG91dFsic2lnbmF0dXJlIl0gPSBzaWcKICAgIG91dFsiYnJhbmNoIl0gPSBicmFuY2hfdmFsCiAgICBvdXRbImZvcm1hdF92ZXJzaW9uIl0gPSA4CiAgICBvdXRbImNvbW1pdHRlZF9hdCJdID0gY29tbWl0dGVkX2F0X2lzbwogICAgaWYgc2hvdWxkX3NpZ246CiAgICAgICAgb3V0WyJzaWduZXJfcHVibGljX2tleSJdID0gcHViX3N0cgogICAgb3V0LnBvcCgiY3JlYXRlZF9vbl9icmFuY2giLCBOb25lKQogICAgb3V0LnBvcCgicmVwb19pZCIsIE5vbmUpCgogICAgcmV0dXJuIG91dCwgbmV3X2lkLCBzaG91bGRfc2lnbgoKZGVmIF9jYW5vbmljYWxfY29tbWl0X3BhdGgocm9vdDogcGF0aGxpYi5QYXRoLCBoZXhfaWQ6IHN0cikgLT4gcGF0aGxpYi5QYXRoOgogICAgcmV0dXJuIGNvbW1pdHNfZGlyKHJvb3QpIC8gInNoYTI1NiIgLyBmIntoZXhfaWR9Lm1zZ3BhY2siCgpkZWYgX3dyaXRlX3Jhd19jb21taXQocm9vdDogcGF0aGxpYi5QYXRoLCBjYW5vbmljYWw6IF9SYXdDb21taXQpIC0+IE5vbmU6CiAgICBoZXhfaWQgPSBsb25nX2lkKGNhbm9uaWNhbFsiY29tbWl0X2lkIl0sIHN0cmlwPVRydWUpCiAgICBwYXRoID0gX2Nhbm9uaWNhbF9jb21taXRfcGF0aChyb290LCBoZXhfaWQpCiAgICBwYXRoLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICBwYXRoLndyaXRlX2J5dGVzKG1zZ3BhY2sucGFja2IoY2Fub25pY2FsLCB1c2VfYmluX3R5cGU9VHJ1ZSkpCgpkZWYgX2lzX2ZsYXRfY29tbWl0X3BhdGgocm9vdDogcGF0aGxpYi5QYXRoLCBwYXRoOiBwYXRobGliLlBhdGgpIC0+IGJvb2w6CiAgICBfZGlyID0gY29tbWl0c19kaXIocm9vdCkKICAgIHRyeToKICAgICAgICByZWwgPSBwYXRoLnJlbGF0aXZlX3RvKF9kaXIpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiByZWwucGFydHNbMF0gIT0gInNoYTI1NiIKCmRlZiBfbWlncmF0ZV9vYmplY3RzKHJvb3Q6IHBhdGhsaWIuUGF0aCwgZHJ5X3J1bjogYm9vbCkgLT4gdHVwbGVbaW50LCBpbnRdOgogICAgX2RpciA9IG9iamVjdHNfZGlyKHJvb3QpCiAgICBpZiBub3QgX2Rpci5leGlzdHMoKToKICAgICAgICByZXR1cm4gMCwgMAoKICAgIGJsb2JzX21vdmVkID0gMAogICAgZGlyc19yZW1vdmVkID0gMAoKICAgIGZvciBlbnRyeSBpbiBzb3J0ZWQoX2Rpci5pdGVyZGlyKCkpOgogICAgICAgIGlmIG5vdCBlbnRyeS5pc19kaXIoKSBvciBlbnRyeS5uYW1lID09ICJzaGEyNTYiOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHByZWZpeCA9IGVudHJ5Lm5hbWUKICAgICAgICBmb3IgYmxvYl9wYXRoIGluIHNvcnRlZChlbnRyeS5pdGVyZGlyKCkpOgogICAgICAgICAgICBpZiBub3QgYmxvYl9wYXRoLmlzX2ZpbGUoKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJlc3QgPSBibG9iX3BhdGgubmFtZQogICAgICAgICAgICBjYW5vbmljYWwgPSBfZGlyIC8gInNoYTI1NiIgLyBwcmVmaXggLyByZXN0CiAgICAgICAgICAgIGlmIGNhbm9uaWNhbC5leGlzdHMoKToKICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIGJsb2JfcGF0aC51bmxpbmsoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgICAgICAgICAgYmxvYl9wYXRoLnJlbmFtZShjYW5vbmljYWwpCiAgICAgICAgICAgIGJsb2JzX21vdmVkICs9IDEKICAgICAgICBpZiBub3QgZHJ5X3J1biBhbmQgZW50cnkuaXNfZGlyKCkgYW5kIG5vdCBhbnkoZW50cnkuaXRlcmRpcigpKToKICAgICAgICAgICAgZW50cnkucm1kaXIoKQogICAgICAgICAgICBkaXJzX3JlbW92ZWQgKz0gMQoKICAgIHJldHVybiBibG9ic19tb3ZlZCwgZGlyc19yZW1vdmVkCgpkZWYgX21pZ3JhdGVfc25hcHNob3RzKHJvb3Q6IHBhdGhsaWIuUGF0aCwgZHJ5X3J1bjogYm9vbCkgLT4gaW50OgogICAgc25hcHNfZGlyID0gc25hcHNob3RzX2Rpcihyb290KQogICAgaWYgbm90IHNuYXBzX2Rpci5leGlzdHMoKToKICAgICAgICByZXR1cm4gMAogICAgY291bnQgPSAwCiAgICBmb3IgcGF0aCBpbiBzb3J0ZWQoc25hcHNfZGlyLml0ZXJkaXIoKSk6CiAgICAgICAgaWYgbm90IHBhdGguaXNfZmlsZSgpIG9yIG5vdCBwYXRoLm5hbWUuZW5kc3dpdGgoIi5tc2dwYWNrIik6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaGV4X2lkID0gcGF0aC5zdGVtCiAgICAgICAgY2Fub25pY2FsID0gc25hcHNfZGlyIC8gInNoYTI1NiIgLyBmIntoZXhfaWR9Lm1zZ3BhY2siCiAgICAgICAgaWYgY2Fub25pY2FsLmV4aXN0cygpOgogICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgIHBhdGgudW5saW5rKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGNhbm9uaWNhbC5wYXJlbnQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICAgICAgcGF0aC5yZW5hbWUoY2Fub25pY2FsKQogICAgICAgIGNvdW50ICs9IDEKICAgIHJldHVybiBjb3VudAoKZGVmIF9ub3JtYWxpc2VfcmVmX3ZhbHVlKHZhbDogc3RyLCBpZF9tYXA6IF9JZE1hcCkgLT4gc3RyOgogICAgdmFsID0gdmFsLnN0cmlwKCkKICAgIHZhbCA9IGxvbmdfaWQodmFsKQogICAgcmV0dXJuIGlkX21hcC5nZXQodmFsLCB2YWwpCgpkZWYgX21pZ3JhdGVfcmVmcyhyb290OiBwYXRobGliLlBhdGgsIGlkX21hcDogX0lkTWFwLCBkcnlfcnVuOiBib29sKSAtPiBpbnQ6CiAgICByZWZzX2RpciA9IGhlYWRzX2Rpcihyb290KQogICAgaWYgbm90IHJlZnNfZGlyLmV4aXN0cygpOgogICAgICAgIHJldHVybiAwCiAgICBjb3VudCA9IDAKICAgIGZvciBwYXRoIGluIHNvcnRlZChyZWZzX2Rpci5yZ2xvYigiKiIpKToKICAgICAgICBpZiBub3QgcGF0aC5pc19maWxlKCk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdmFsID0gcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04Iikuc3RyaXAoKQogICAgICAgIG5ld192YWwgPSBfbm9ybWFsaXNlX3JlZl92YWx1ZSh2YWwsIGlkX21hcCkKICAgICAgICBpZiBuZXdfdmFsICE9IHZhbDoKICAgICAgICAgICAgY291bnQgKz0gMQogICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgIHBhdGgud3JpdGVfdGV4dChmIntuZXdfdmFsfVxuIiwgZW5jb2Rpbmc9InV0Zi04IikKICAgIHJldHVybiBjb3VudAoKZGVmIF9taWdyYXRlX3JlbW90ZV9yZWZzKAogICAgcm9vdDogcGF0aGxpYi5QYXRoLCBpZF9tYXA6IGRpY3Rbc3RyLCBzdHJdLCBkcnlfcnVuOiBib29sCikgLT4gaW50OgogICAgX2RpciA9IHJlbW90ZXNfZGlyKHJvb3QpCiAgICBpZiBub3QgX2Rpci5leGlzdHMoKToKICAgICAgICByZXR1cm4gMAogICAgY291bnQgPSAwCiAgICBmb3IgcGF0aCBpbiBzb3J0ZWQoX2Rpci5yZ2xvYigiKiIpKToKICAgICAgICBpZiBub3QgcGF0aC5pc19maWxlKCk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdmFsID0gcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04Iikuc3RyaXAoKQogICAgICAgIG5ld192YWwgPSBfbm9ybWFsaXNlX3JlZl92YWx1ZSh2YWwsIGlkX21hcCkKICAgICAgICBpZiBuZXdfdmFsICE9IHZhbDoKICAgICAgICAgICAgY291bnQgKz0gMQogICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgIHBhdGgud3JpdGVfdGV4dChmIntuZXdfdmFsfVxuIiwgZW5jb2Rpbmc9InV0Zi04IikKICAgIHJldHVybiBjb3VudAoKZGVmIF9taWdyYXRlX3JlcG9faWQocm9vdDogcGF0aGxpYi5QYXRoLCBkcnlfcnVuOiBib29sKSAtPiBib29sOgogICAgcmVwb19qc29uID0gcmVwb19qc29uX3BhdGgocm9vdCkKICAgIGlmIG5vdCByZXBvX2pzb24uZXhpc3RzKCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBkYXRhID0ganNvbi5sb2FkcyhyZXBvX2pzb24ucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQogICAgcmlkID0gZGF0YS5nZXQoInJlcG9faWQiLCAiIikKICAgIGlmIHJpZC5zdGFydHN3aXRoKCJzaGEyNTY6Iik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBuZXdfaWQgPSBibG9iX2lkKHJpZC5lbmNvZGUoKSkKICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgIGRhdGFbInJlcG9faWQiXSA9IG5ld19pZAogICAgICAgIHJlcG9fanNvbi53cml0ZV90ZXh0KGpzb24uZHVtcHMoZGF0YSksIGVuY29kaW5nPSJ1dGYtOCIpCiAgICByZXR1cm4gVHJ1ZQoKZGVmIF9taWdyYXRlX3JlZmxvZ3MoCiAgICByb290OiBwYXRobGliLlBhdGgsIGlkX21hcDogZGljdFtzdHIsIHN0cl0sIGRyeV9ydW46IGJvb2wKKSAtPiBpbnQ6CiAgICBfZGlyID0gbG9nc19kaXIocm9vdCkKICAgIGlmIG5vdCBfZGlyLmV4aXN0cygpOgogICAgICAgIHJldHVybiAwCiAgICBjb3VudCA9IDAKICAgIGZvciBwYXRoIGluIHNvcnRlZChfZGlyLnJnbG9iKCIqIikpOgogICAgICAgIGlmIG5vdCBwYXRoLmlzX2ZpbGUoKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBjb250ZW50ID0gcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04IikKICAgICAgICBuZXdfY29udGVudCA9IGNvbnRlbnQKICAgICAgICBmb3Igb2xkX2lkLCBuZXdfaWQgaW4gaWRfbWFwLml0ZW1zKCk6CiAgICAgICAgICAgIG5ld19jb250ZW50ID0gbmV3X2NvbnRlbnQucmVwbGFjZShvbGRfaWQsIG5ld19pZCkKICAgICAgICBpZiBuZXdfY29udGVudCAhPSBjb250ZW50OgogICAgICAgICAgICBjb3VudCArPSAxCiAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICAgICAgcGF0aC53cml0ZV90ZXh0KG5ld19jb250ZW50LCBlbmNvZGluZz0idXRmLTgiKQogICAgcmV0dXJuIGNvdW50CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBoYXNlIDcg4oCUIGJsb2IgSUQgbWlncmF0aW9uCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpkZWYgbWlncmF0ZV9ibG9iX2lkcygKICAgIHJlcG9fcm9vdDogcGF0aGxpYi5QYXRoLAogICAgZHJ5X3J1bjogYm9vbCA9IEZhbHNlLAopIC0+IEJsb2JNaWdyYXRlUmVzdWx0OgogICAgIiIiTWlncmF0ZSByYXcgKG9sZC1mb3JtdWxhKSBibG9icyB0byBtdXNlLWZvcm1hdCBhdCBuZXcgaGFzaF9ibG9iIHBhdGhzLgoKICAgIEZvciBlYWNoIGJsb2Igc3RvcmVkIHdpdGggdGhlIHByZS1QaGFzZS0yIGZvcm11bGEgYGBzaGEyNTYoY29udGVudClgYCwKICAgIHRoaXMgZnVuY3Rpb246CgogICAgMS4gUmVhZHMgdGhlIHJhdyBieXRlcyBmcm9tIHRoZSBvbGQgb2JqZWN0IHBhdGguCiAgICAyLiBEZXRlY3RzIHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBtdXNlLWZvcm1hdCAoaGFzIGEgdmFsaWQKICAgICAgIGBgImJsb2IgPHNpemU+XFwwImBgIGhlYWRlciB3aG9zZSBkZWNsYXJlZCBzaXplIG1hdGNoZXMgdGhlIHBheWxvYWQpLgogICAgMy4gSWYgb2xkLWZvcm1hdDogd3JpdGVzIGBgImJsb2IgPHNpemU+XFwwPGNvbnRlbnQ+ImBgIHRvIHRoZSBuZXcgb2JqZWN0CiAgICAgICBwYXRoIGRlcml2ZWQgZnJvbSBgYGhhc2hfYmxvYihjb250ZW50KWBgLgogICAgNC4gQnVpbGRzIGFuZCByZXR1cm5zIGFuIG9sZF9pZCDihpIgbmV3X2lkIG1hcCBmb3IgdXNlIGJ5IHRoZSBzbmFwc2hvdAogICAgICAgbWlncmF0aW9uIHBhc3MuCgogICAgTm9uLWRlc3RydWN0aXZlOiBvbGQgZmlsZXMgYXJlIG5ldmVyIGRlbGV0ZWQuCgogICAgQXJnczoKICAgICAgICByZXBvX3Jvb3Q6IFJlcG9zaXRvcnkgcm9vdCAoY29udGFpbnMgYGAubXVzZS9gYCkuCiAgICAgICAgZHJ5X3J1bjogICBXaGVuIFRydWUsIGNvbXB1dGUgdGhlIG1hcHBpbmcgYnV0IHdyaXRlIG5vdGhpbmcuCgogICAgUmV0dXJuczoKICAgICAgICA6Y2xhc3M6YEJsb2JNaWdyYXRlUmVzdWx0YCB3aXRoIHRoZSBJRCBtYXAgYW5kIHdyaXRlIGNvdW50cy4KICAgICIiIgogICAgZnJvbSBtdXNlLmNvcmUub2JqZWN0X3N0b3JlIGltcG9ydCBpdGVyX3N0b3JlZF9vYmplY3RzLCBvYmplY3RfcGF0aCBhcyBfb2JqZWN0X3BhdGgKCiAgICByZXN1bHQgPSBCbG9iTWlncmF0ZVJlc3VsdChkcnlfcnVuPWRyeV9ydW4pCgogICAgZm9yIG9sZF9pZCwgcGF0aCBpbiBpdGVyX3N0b3JlZF9vYmplY3RzKHJlcG9fcm9vdCk6CiAgICAgICAgZGF0YSA9IHBhdGgucmVhZF9ieXRlcygpCgogICAgICAgICMgRGV0ZWN0IHR5cGVkIG9iamVjdHM6ICJibG9ifHNuYXBzaG90fGNvbW1pdCA8c2l6ZT5cMDxwYXlsb2FkPiIuCiAgICAgICAgIyBTbmFwc2hvdCBhbmQgY29tbWl0IG9iamVjdHMgbXVzdCBuZXZlciBiZSB0cmVhdGVkIGFzIGJsb2JzLgogICAgICAgIG51bGxfaWR4ID0gZGF0YS5maW5kKGIiXDAiKQogICAgICAgIGlmIG51bGxfaWR4ID4gMDoKICAgICAgICAgICAgaGVhZGVyID0gZGF0YVs6bnVsbF9pZHhdLmRlY29kZShlcnJvcnM9InJlcGxhY2UiKQogICAgICAgICAgICBwYXJ0cyA9IGhlYWRlci5zcGxpdCgiICIsIDEpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMiBhbmQgcGFydHNbMV0uaXNkaWdpdCgpIGFuZCBsZW4oZGF0YSkgLSBudWxsX2lkeCAtIDEgPT0gaW50KHBhcnRzWzFdKToKICAgICAgICAgICAgICAgIGlmIHBhcnRzWzBdIGluICgic25hcHNob3QiLCAiY29tbWl0Iik6CiAgICAgICAgICAgICAgICAgICAgIyBOb3QgYSBibG9iIOKAlCBza2lwIGVudGlyZWx5LCBuZXZlciByZXdyaXRlLgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pZF9tYXBbb2xkX2lkXSA9IG9sZF9pZAogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ibG9ic19za2lwcGVkICs9IDEKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgcGFydHNbMF0gPT0gImJsb2IiOgogICAgICAgICAgICAgICAgICAgICMgQWxyZWFkeSBtdXNlLWZvcm1hdCBibG9iIOKAlCBtYXAgdG8gaXRzZWxmIGFuZCBza2lwLgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pZF9tYXBbb2xkX2lkXSA9IG9sZF9pZAogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ibG9ic19za2lwcGVkICs9IDEKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIE9sZC1mb3JtYXQgcmF3IGJsb2I6IGNvbXB1dGUgdGhlIG5ldyBtdXNlLWlkaW9tYXRpYyBJRC4KICAgICAgICBuZXdfaWQgPSBoYXNoX2Jsb2IoZGF0YSkKICAgICAgICByZXN1bHQuaWRfbWFwW29sZF9pZF0gPSBuZXdfaWQKCiAgICAgICAgaWYgbmV3X2lkID09IG9sZF9pZDoKICAgICAgICAgICAgcmVzdWx0LmJsb2JzX3NraXBwZWQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBuZXdfcGF0aCA9IF9vYmplY3RfcGF0aChyZXBvX3Jvb3QsIG5ld19pZCkKICAgICAgICBpZiBuZXdfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgIyBOZXcgYmxvYiBhbHJlYWR5IHdyaXR0ZW4g4oCUIGRlbGV0ZSB0aGUgc3RhbGUgb2xkLWZvcm1hdCBmaWxlLgogICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgIHBhdGgudW5saW5rKG1pc3Npbmdfb2s9VHJ1ZSkKICAgICAgICAgICAgcmVzdWx0LmJsb2JzX3NraXBwZWQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgaGVhZGVyX2J5dGVzID0gZiJibG9iIHtsZW4oZGF0YSl9XDAiLmVuY29kZSgpCiAgICAgICAgICAgIG5ld19wYXRoLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIG5ld19wYXRoLndyaXRlX2J5dGVzKGhlYWRlcl9ieXRlcyArIGRhdGEpCiAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBvbGQtZm9ybWF0IGZpbGUgbm93IHRoYXQgdGhlIG5ldyBvbmUgaXMgc2FmZWx5IHdyaXR0ZW4uCiAgICAgICAgICAgIHBhdGgudW5saW5rKG1pc3Npbmdfb2s9VHJ1ZSkKCiAgICAgICAgcmVzdWx0LmJsb2JzX3dyaXR0ZW4gKz0gMQoKICAgIHJldHVybiByZXN1bHQKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBoYXNlIDcg4oCUIHNuYXBzaG90IElEIG1pZ3JhdGlvbgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQGRhdGFjbGFzcwpjbGFzcyBTbmFwc2hvdE1pZ3JhdGVSZXN1bHQ6CiAgICAiIiJSZXN1bHQgb2YgOmZ1bmM6YG1pZ3JhdGVfc25hcHNob3RfaWRzYC4iIiIKICAgIGlkX21hcDogZGljdFtzdHIsIHN0cl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9ZGljdCkKICAgIHNuYXBzaG90c193cml0dGVuOiBpbnQgPSAwCiAgICBzbmFwc2hvdHNfc2tpcHBlZDogaW50ID0gMAogICAgZHJ5X3J1bjogYm9vbCA9IEZhbHNlCgoKZGVmIG1pZ3JhdGVfc25hcHNob3RfaWRzKAogICAgcmVwb19yb290OiBwYXRobGliLlBhdGgsCiAgICBibG9iX2lkX21hcDogZGljdFtzdHIsIHN0cl0sCiAgICBkcnlfcnVuOiBib29sID0gRmFsc2UsCikgLT4gU25hcHNob3RNaWdyYXRlUmVzdWx0OgogICAgIiIiTWlncmF0ZSBvbGQtZm9ybXVsYSBzbmFwc2hvdHMgdG8gbXVzZS1mb3JtYXQgaW4gdGhlIHVuaWZpZWQgb2JqZWN0IHN0b3JlLgoKICAgIEZvciBlYWNoIHNuYXBzaG90IG1zZ3BhY2sgaW4gYGAubXVzZS9zbmFwc2hvdHMvc2hhMjU2L2BgOgoKICAgIDEuIFJlYWRzIHRoZSByZWNvcmQgYW5kIHVwZGF0ZXMgZXZlcnkgbWFuaWZlc3QgZW50cnkgdXNpbmcgKmJsb2JfaWRfbWFwKgogICAgICAgKG9sZCBibG9iIElEIOKGkiBuZXcgYmxvYiBJRCkuCiAgICAyLiBSZWNvbXB1dGVzIHRoZSBzbmFwc2hvdCBJRCB3aXRoIHRoZSBjdXJyZW50IGBgaGFzaF9zbmFwc2hvdGBgIGZvcm11bGEuCiAgICAzLiBXcml0ZXMgdGhlIHVwZGF0ZWQgcmVjb3JkIGFzIEpTT04gdG8gYGAubXVzZS9vYmplY3RzL3NoYTI1Ni88Mj4vPDYyPmBgCiAgICAgICBpbiBgYCJzbmFwc2hvdCA8c2l6ZT5cXDA8anNvbj4iYGAgZm9ybWF0LgoKICAgIE5vbi1kZXN0cnVjdGl2ZTogb2xkIG1zZ3BhY2sgZmlsZXMgYXJlIG5ldmVyIGRlbGV0ZWQuCgogICAgQXJnczoKICAgICAgICByZXBvX3Jvb3Q6ICAgUmVwb3NpdG9yeSByb290IChjb250YWlucyBgYC5tdXNlL2BgKS4KICAgICAgICBibG9iX2lkX21hcDogT2xkIGJsb2IgSUQg4oaSIG5ldyBibG9iIElEIG1hcCBmcm9tIDpmdW5jOmBtaWdyYXRlX2Jsb2JfaWRzYC4KICAgICAgICBkcnlfcnVuOiAgICAgV2hlbiBUcnVlLCBjb21wdXRlIHRoZSBtYXBwaW5nIGJ1dCB3cml0ZSBub3RoaW5nLgoKICAgIFJldHVybnM6CiAgICAgICAgOmNsYXNzOmBTbmFwc2hvdE1pZ3JhdGVSZXN1bHRgIHdpdGggdGhlIElEIG1hcCBhbmQgd3JpdGUgY291bnRzLgogICAgIiIiCiAgICBmcm9tIG11c2UuY29yZS5vYmplY3Rfc3RvcmUgaW1wb3J0IG9iamVjdF9wYXRoIGFzIF9vYmplY3RfcGF0aCwgaXRlcl9zdG9yZWRfb2JqZWN0cwoKICAgIHJlc3VsdCA9IFNuYXBzaG90TWlncmF0ZVJlc3VsdChkcnlfcnVuPWRyeV9ydW4pCgogICAgZGVmIF93cml0ZV9zbmFwc2hvdChuZXdfc25hcF9pZDogc3RyLCBuZXdfbWFuaWZlc3Q6IGRpY3QsIGJhc2VfcmVjb3JkOiBkaWN0KSAtPiBOb25lOgogICAgICAgIG5ld19wYXRoID0gX29iamVjdF9wYXRoKHJlcG9fcm9vdCwgbmV3X3NuYXBfaWQpCiAgICAgICAgaWYgbmV3X3BhdGguZXhpc3RzKCk6CiAgICAgICAgICAgIHJlc3VsdC5zbmFwc2hvdHNfc2tpcHBlZCArPSAxCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICB1cGRhdGVkID0gZGljdChiYXNlX3JlY29yZCkKICAgICAgICAgICAgdXBkYXRlZFsic25hcHNob3RfaWQiXSA9IG5ld19zbmFwX2lkCiAgICAgICAgICAgIHVwZGF0ZWRbIm1hbmlmZXN0Il0gPSBuZXdfbWFuaWZlc3QKICAgICAgICAgICAgIyBjcmVhdGVkX2F0IG1heSBiZSBhIGRhdGV0aW1lIOKAlCBub3JtYWxpc2UgdG8gSVNPIHN0cmluZyBmb3IgSlNPTi4KICAgICAgICAgICAgaWYgaGFzYXR0cih1cGRhdGVkLmdldCgiY3JlYXRlZF9hdCIpLCAiaXNvZm9ybWF0Iik6CiAgICAgICAgICAgICAgICB1cGRhdGVkWyJjcmVhdGVkX2F0Il0gPSB1cGRhdGVkWyJjcmVhdGVkX2F0Il0uaXNvZm9ybWF0KCkKICAgICAgICAgICAgcGF5bG9hZCA9IGpzb24uZHVtcHModXBkYXRlZCwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpKS5lbmNvZGUoKQogICAgICAgICAgICBuZXdfcGF0aC5wYXJlbnQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICBuZXdfcGF0aC53cml0ZV9ieXRlcyhmInNuYXBzaG90IHtsZW4ocGF5bG9hZCl9XDAiLmVuY29kZSgpICsgcGF5bG9hZCkKICAgICAgICByZXN1bHQuc25hcHNob3RzX3dyaXR0ZW4gKz0gMQoKICAgICMgUGFzcyBBIOKAlCBsZWdhY3kgc25hcHNob3RzIGluIC5tdXNlL3NuYXBzaG90cy9zaGEyNTYvIChwcmUtdW5pZmljYXRpb24gbGF5b3V0KS4KICAgICMgVGhlc2UgYXJlIEFMV0FZUyByZWxvY2F0ZWQgaW50byB0aGUgdW5pZmllZCBvYmplY3Qgc3RvcmUgKHdyaXR0ZW4gdW5kZXIgdGhlaXIKICAgICMgcmVjb21wdXRlZCBpZCwgd2hpY2ggZXF1YWxzIHRoZSBvbGQgaWQgd2hlbiB0aGUgYmxvYiByZW1hcCBkaWRuJ3QgY2hhbmdlIGl0KS4KICAgIHNuYXBzID0gc25hcHNob3RzX2RpcihyZXBvX3Jvb3QpIC8gInNoYTI1NiIKICAgIGlmIHNuYXBzLmV4aXN0cygpOgogICAgICAgIGZyb20gbXVzZS5jb3JlLmlvIGltcG9ydCB6c3RkX2RlY29tcHJlc3NfaWZfbmVlZGVkCiAgICAgICAgZm9yIHBhdGggaW4gc29ydGVkKHNuYXBzLmdsb2IoIioubXNncGFjayIpKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmF3ID0gbXNncGFjay51bnBhY2tiKHpzdGRfZGVjb21wcmVzc19pZl9uZWVkZWQocGF0aC5yZWFkX2J5dGVzKCkpLCByYXc9RmFsc2UpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIlNraXBwaW5nIHVucmVhZGFibGUgc25hcHNob3QgJXM6ICVzIiwgcGF0aCwgZXhjKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgb2xkX2lkOiBzdHIgPSByYXcuZ2V0KCJzbmFwc2hvdF9pZCIsICIiKQogICAgICAgICAgICBpZiBub3Qgb2xkX2lkOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgb2xkX21hbmlmZXN0OiBkaWN0W3N0ciwgc3RyXSA9IGRpY3QocmF3LmdldCgibWFuaWZlc3QiKSBvciB7fSkKICAgICAgICAgICAgbmV3X21hbmlmZXN0ID0ge2ZwOiBibG9iX2lkX21hcC5nZXQob2lkLCBvaWQpIGZvciBmcCwgb2lkIGluIG9sZF9tYW5pZmVzdC5pdGVtcygpfQogICAgICAgICAgICBuZXdfc25hcF9pZCA9IGhhc2hfc25hcHNob3QobmV3X21hbmlmZXN0LCAocmF3LmdldCgiZGlyZWN0b3JpZXMiKSBvciBbXSkgb3IgTm9uZSkKICAgICAgICAgICAgcmVzdWx0LmlkX21hcFtvbGRfaWRdID0gbmV3X3NuYXBfaWQKICAgICAgICAgICAgX3dyaXRlX3NuYXBzaG90KG5ld19zbmFwX2lkLCBuZXdfbWFuaWZlc3QsIHJhdykKCiAgICAjIFBhc3MgQiDigJQgc25hcHNob3RzIGFscmVhZHkgaW4gdGhlIFVOSUZJRUQgb2JqZWN0IHN0b3JlLiAgQW4gZWFybGllciBtaWdyYXRpb24KICAgICMgY291bGQgcmV3cml0ZSBhIHNuYXBzaG90J3MgbWFuaWZlc3QgKG5ldyBibG9iIElEcykgV0lUSE9VVCByZWNvbXB1dGluZyB0aGUKICAgICMgc25hcHNob3QgSUQsIGxlYXZpbmcgdGhlIG9iamVjdCBzdG9yZWQgdW5kZXIgYW4gSUQgaXRzIGNvbnRlbnQgbm8gbG9uZ2VyCiAgICAjIHJlcHJvZHVjZXMuICBTdWNoIGEgc25hcHNob3QgaXMgdW5jbG9uYWJsZTogdGhlIGNsaWVudCByZS1oYXNoZXMgaXQsIHRoZSBoYXNoCiAgICAjIG1pc21hdGNoZXMgdGhlIHN0b3JlZCBJRCwgdGhlIGNvbW1pdCBpcyBkcm9wcGVkLCBhbmQgZXZlcnkgZGVzY2VuZGFudCBmYWlscwogICAgIyAicGFyZW50IG5vdCBpbiBtcGFjayIuICBSZS1rZXkgT05MWSB0aGUgbWlzLWtleWVkIG9uZXMgKHN0b3JlZCBJRCAhPQogICAgIyBoYXNoX3NuYXBzaG90KGNvbnRlbnQpKTsgY29ycmVjdGx5LWtleWVkIG9iamVjdHMgYXJlIGxlZnQgdW50b3VjaGVkIChpZGVtcG90ZW50KS4KICAgICMgVGhlIGNvbW1pdCBwYXNzIHRoZW4gY2FzY2FkZXMgdGhlIG9sZOKGkm5ldyBtYXBwaW5nIGludG8gcmVmZXJlbmNpbmcgY29tbWl0cy4KICAgICMgTWF0ZXJpYWxpc2UgdGhlIGl0ZXJhdG9yIGZpcnN0IHNvIG9iamVjdHMgd3JpdHRlbiBhYm92ZSBkb24ndCBwZXJ0dXJiIGl0LgogICAgZm9yIHN0b3JlZF9pZCwgb2JqX3BhdGggaW4gbGlzdChpdGVyX3N0b3JlZF9vYmplY3RzKHJlcG9fcm9vdCkpOgogICAgICAgICMgQ2hlYXBseSBzbmlmZiB0aGUgdHlwZSBoZWFkZXIgYmVmb3JlIHJlYWRpbmcgdGhlIHdob2xlIG9iamVjdCAoYmxvYnMgYXJlIGxhcmdlKS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb2JqX3BhdGgub3BlbigicmIiKSBhcyBmaDoKICAgICAgICAgICAgICAgIHByZWZpeCA9IGZoLnJlYWQoNjQpCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbnVsID0gcHJlZml4LmZpbmQoYiJcMCIpCiAgICAgICAgaWYgbnVsIDw9IDA6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaGVhZCA9IHByZWZpeFs6bnVsXS5zcGxpdChiIiAiLCAxKQogICAgICAgIGlmIGxlbihoZWFkKSAhPSAyIG9yIGhlYWRbMF0gIT0gYiJzbmFwc2hvdCIgb3Igbm90IGhlYWRbMV0uaXNkaWdpdCgpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IG9ial9wYXRoLnJlYWRfYnl0ZXMoKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGJvZHlfbnVsID0gZGF0YS5maW5kKGIiXDAiKQogICAgICAgIGlmIGxlbihkYXRhKSAtIGJvZHlfbnVsIC0gMSAhPSBpbnQoaGVhZFsxXSk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZWMgPSBqc29uLmxvYWRzKGRhdGFbYm9keV9udWwgKyAxOl0pCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBvbGRfbWFuaWZlc3QgPSBkaWN0KHJlYy5nZXQoIm1hbmlmZXN0Iikgb3Ige30pCiAgICAgICAgbmV3X21hbmlmZXN0ID0ge2ZwOiBibG9iX2lkX21hcC5nZXQob2lkLCBvaWQpIGZvciBmcCwgb2lkIGluIG9sZF9tYW5pZmVzdC5pdGVtcygpfQogICAgICAgIG5ld19zbmFwX2lkID0gaGFzaF9zbmFwc2hvdChuZXdfbWFuaWZlc3QsIChyZWMuZ2V0KCJkaXJlY3RvcmllcyIpIG9yIFtdKSBvciBOb25lKQogICAgICAgIGlmIG5ld19zbmFwX2lkID09IHN0b3JlZF9pZDoKICAgICAgICAgICAgY29udGludWUgICMgYWxyZWFkeSBjb3JyZWN0bHkga2V5ZWQg4oCUIGlkZW1wb3RlbnQgbm8tb3AKICAgICAgICByZXN1bHQuaWRfbWFwW3N0b3JlZF9pZF0gPSBuZXdfc25hcF9pZAogICAgICAgIF93cml0ZV9zbmFwc2hvdChuZXdfc25hcF9pZCwgbmV3X21hbmlmZXN0LCByZWMpCgogICAgcmV0dXJuIHJlc3VsdAoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUGhhc2UgNyDigJQgY29tbWl0IElEIG1pZ3JhdGlvbgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQGRhdGFjbGFzcwpjbGFzcyBDb21taXRNaWdyYXRlUmVzdWx0OgogICAgIiIiUmVzdWx0IG9mIDpmdW5jOmBtaWdyYXRlX2NvbW1pdF9pZHNgLiIiIgogICAgaWRfbWFwOiBkaWN0W3N0ciwgc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1kaWN0KQogICAgY29tbWl0c193cml0dGVuOiBpbnQgPSAwCiAgICBjb21taXRzX3NraXBwZWQ6IGludCA9IDAKICAgIGRyeV9ydW46IGJvb2wgPSBGYWxzZQoKCmRlZiBtaWdyYXRlX2NvbW1pdF9pZHMoCiAgICByZXBvX3Jvb3Q6IHBhdGhsaWIuUGF0aCwKICAgIHNuYXBzaG90X2lkX21hcDogZGljdFtzdHIsIHN0cl0sCiAgICBkcnlfcnVuOiBib29sID0gRmFsc2UsCikgLT4gQ29tbWl0TWlncmF0ZVJlc3VsdDoKICAgICIiIk1pZ3JhdGUgb2xkLWZvcm11bGEgY29tbWl0cyB0byBtdXNlLWZvcm1hdCBpbiB0aGUgdW5pZmllZCBvYmplY3Qgc3RvcmUuCgogICAgRm9yIGVhY2ggY29tbWl0IG1zZ3BhY2sgaW4gYGAubXVzZS9jb21taXRzL3NoYTI1Ni9gYDoKCiAgICAxLiBSZWFkcyB0aGUgcmVjb3JkIGFuZCB1cGRhdGVzIGBgc25hcHNob3RfaWRgYCB1c2luZyAqc25hcHNob3RfaWRfbWFwKi4KICAgIDIuIFVwZGF0ZXMgcGFyZW50IGNvbW1pdCBJRHMgZnJvbSB0aGUgcmVzdWx0J3Mgb3duIGBgaWRfbWFwYGAgKHR3by1wYXNzOgogICAgICAgYWxsIG5ldyBJRHMgYXJlIGNvbXB1dGVkIGZpcnN0LCB0aGVuIGZpbGVzIGFyZSB3cml0dGVuKS4KICAgIDMuIFJlY29tcHV0ZXMgdGhlIGNvbW1pdCBJRCB3aXRoIHRoZSBjdXJyZW50IGBgaGFzaF9jb21taXRgYCBmb3JtdWxhLgogICAgNC4gV3JpdGVzIHRoZSB1cGRhdGVkIHJlY29yZCBhcyBKU09OIHRvIGBgLm11c2Uvb2JqZWN0cy9zaGEyNTYvPDI+Lzw2Mj5gYAogICAgICAgaW4gYGAiY29tbWl0IDxzaXplPlxcMDxqc29uPiJgYCBmb3JtYXQuCgogICAgTm9uLWRlc3RydWN0aXZlOiBvbGQgbXNncGFjayBmaWxlcyBhcmUgbmV2ZXIgZGVsZXRlZC4KCiAgICBBcmdzOgogICAgICAgIHJlcG9fcm9vdDogICAgICAgIFJlcG9zaXRvcnkgcm9vdCAoY29udGFpbnMgYGAubXVzZS9gYCkuCiAgICAgICAgc25hcHNob3RfaWRfbWFwOiAgT2xkIHNuYXBzaG90IElEIOKGkiBuZXcgc25hcHNob3QgSUQgbWFwIGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgICA6ZnVuYzpgbWlncmF0ZV9zbmFwc2hvdF9pZHNgLgogICAgICAgIGRyeV9ydW46ICAgICAgICAgIFdoZW4gVHJ1ZSwgY29tcHV0ZSB0aGUgbWFwcGluZyBidXQgd3JpdGUgbm90aGluZy4KCiAgICBSZXR1cm5zOgogICAgICAgIDpjbGFzczpgQ29tbWl0TWlncmF0ZVJlc3VsdGAgd2l0aCB0aGUgSUQgbWFwIGFuZCB3cml0ZSBjb3VudHMuCiAgICAiIiIKICAgIGZyb20gbXVzZS5jb3JlLm9iamVjdF9zdG9yZSBpbXBvcnQgb2JqZWN0X3BhdGggYXMgX29iamVjdF9wYXRoCgogICAgcmVzdWx0ID0gQ29tbWl0TWlncmF0ZVJlc3VsdChkcnlfcnVuPWRyeV9ydW4pCiAgICBhbGxfY29tbWl0cyA9IF9jb2xsZWN0X2FsbF9jb21taXRzKHJlcG9fcm9vdCkKICAgIG9yZGVyID0gX3RvcG9sb2dpY2FsX3NvcnQoYWxsX2NvbW1pdHMpCgogICAgIyBQYXNzIDE6IGJ1aWxkIHRoZSBjb21taXQgaWRfbWFwIChwYXJlbnRzLWJlZm9yZS1jaGlsZHJlbiBvcmRlciBlbnN1cmVzCiAgICAjIHBhcmVudCBJRHMgYXJlIGFscmVhZHkgaW4gaWRfbWFwIHdoZW4gcHJvY2Vzc2luZyBlYWNoIGNoaWxkKS4KICAgIGNvbW1pdF9pZF9tYXA6IGRpY3Rbc3RyLCBzdHJdID0ge30KICAgIGZvciBvbGRfaWQgaW4gb3JkZXI6CiAgICAgICAgcmF3LCBfID0gYWxsX2NvbW1pdHNbb2xkX2lkXQogICAgICAgIHAxID0gcmF3LmdldCgicGFyZW50X2NvbW1pdF9pZCIpCiAgICAgICAgcDIgPSByYXcuZ2V0KCJwYXJlbnQyX2NvbW1pdF9pZCIpCiAgICAgICAgbmV3X3AxID0gY29tbWl0X2lkX21hcC5nZXQocDEsIHAxKSBpZiBwMSBlbHNlIE5vbmUKICAgICAgICBuZXdfcDIgPSBjb21taXRfaWRfbWFwLmdldChwMiwgcDIpIGlmIHAyIGVsc2UgTm9uZQoKICAgICAgICBwYXJlbnRfaWRzOiBsaXN0W3N0cl0gPSBbeCBmb3IgeCBpbiAobmV3X3AxLCBuZXdfcDIpIGlmIHhdCiAgICAgICAgb2xkX3NuYXAgPSByYXcuZ2V0KCJzbmFwc2hvdF9pZCIsICIiKQogICAgICAgIG5ld19zbmFwID0gc25hcHNob3RfaWRfbWFwLmdldChvbGRfc25hcCwgb2xkX3NuYXApCiAgICAgICAgY29tbWl0dGVkX2F0X2lzbyA9IF9jb21taXR0ZWRfYXRfaXNvKHJhdykKCiAgICAgICAgbmV3X2lkID0gaGFzaF9jb21taXQoCiAgICAgICAgICAgIHBhcmVudF9pZHM9cGFyZW50X2lkcywKICAgICAgICAgICAgc25hcHNob3RfaWQ9bmV3X3NuYXAsCiAgICAgICAgICAgIG1lc3NhZ2U9cmF3LmdldCgibWVzc2FnZSIsICIiKSwKICAgICAgICAgICAgY29tbWl0dGVkX2F0X2lzbz1jb21taXR0ZWRfYXRfaXNvLAogICAgICAgICAgICBhdXRob3I9cmF3LmdldCgiYXV0aG9yIiwgIiIpLAogICAgICAgICAgICBzaWduZXJfcHVibGljX2tleT1yYXcuZ2V0KCJzaWduZXJfcHVibGljX2tleSIsICIiKSBvciAiIiwKICAgICAgICApCiAgICAgICAgaWYgbmV3X2lkICE9IG9sZF9pZDoKICAgICAgICAgICAgY29tbWl0X2lkX21hcFtvbGRfaWRdID0gbmV3X2lkCgogICAgcmVzdWx0LmlkX21hcCA9IHsqKmNvbW1pdF9pZF9tYXB9CgogICAgIyBQYXNzIDI6IHdyaXRlIHVwZGF0ZWQgcmVjb3Jkcy4KICAgIGZvciBvbGRfaWQgaW4gb3JkZXI6CiAgICAgICAgcmF3LCBfID0gYWxsX2NvbW1pdHNbb2xkX2lkXQogICAgICAgIHAxID0gcmF3LmdldCgicGFyZW50X2NvbW1pdF9pZCIpCiAgICAgICAgcDIgPSByYXcuZ2V0KCJwYXJlbnQyX2NvbW1pdF9pZCIpCiAgICAgICAgbmV3X3AxID0gY29tbWl0X2lkX21hcC5nZXQocDEsIHAxKSBpZiBwMSBlbHNlIE5vbmUKICAgICAgICBuZXdfcDIgPSBjb21taXRfaWRfbWFwLmdldChwMiwgcDIpIGlmIHAyIGVsc2UgTm9uZQoKICAgICAgICBwYXJlbnRfaWRzID0gW3ggZm9yIHggaW4gKG5ld19wMSwgbmV3X3AyKSBpZiB4XQogICAgICAgIG9sZF9zbmFwID0gcmF3LmdldCgic25hcHNob3RfaWQiLCAiIikKICAgICAgICBuZXdfc25hcCA9IHNuYXBzaG90X2lkX21hcC5nZXQob2xkX3NuYXAsIG9sZF9zbmFwKQogICAgICAgIG5ld19pZCA9IGNvbW1pdF9pZF9tYXAuZ2V0KG9sZF9pZCwgb2xkX2lkKQogICAgICAgIGNvbW1pdHRlZF9hdF9pc28gPSBfY29tbWl0dGVkX2F0X2lzbyhyYXcpCgogICAgICAgIG9ial9wYXRoID0gX29iamVjdF9wYXRoKHJlcG9fcm9vdCwgbmV3X2lkKQogICAgICAgIGlmIG9ial9wYXRoLmV4aXN0cygpOgogICAgICAgICAgICByZXN1bHQuY29tbWl0c19za2lwcGVkICs9IDEKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIHVwZGF0ZWQgPSBkaWN0KHJhdykKICAgICAgICAgICAgdXBkYXRlZFsiY29tbWl0X2lkIl0gPSBuZXdfaWQKICAgICAgICAgICAgdXBkYXRlZFsic25hcHNob3RfaWQiXSA9IG5ld19zbmFwCiAgICAgICAgICAgIHVwZGF0ZWRbInBhcmVudF9jb21taXRfaWQiXSA9IG5ld19wMQogICAgICAgICAgICB1cGRhdGVkWyJwYXJlbnQyX2NvbW1pdF9pZCJdID0gbmV3X3AyCiAgICAgICAgICAgIHVwZGF0ZWRbImNvbW1pdHRlZF9hdCJdID0gY29tbWl0dGVkX2F0X2lzbwogICAgICAgICAgICB1cGRhdGVkLnBvcCgiY3JlYXRlZF9vbl9icmFuY2giLCBOb25lKQoKICAgICAgICAgICAgcGF5bG9hZCA9IGpzb24uZHVtcHModXBkYXRlZCwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBkZWZhdWx0PXN0cikuZW5jb2RlKCkKICAgICAgICAgICAgaGVhZGVyID0gZiJjb21taXQge2xlbihwYXlsb2FkKX1cMCIuZW5jb2RlKCkKICAgICAgICAgICAgb2JqX3BhdGgucGFyZW50Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgb2JqX3BhdGgud3JpdGVfYnl0ZXMoaGVhZGVyICsgcGF5bG9hZCkKCgogICAgICAgIHJlc3VsdC5jb21taXRzX3dyaXR0ZW4gKz0gMQoKICAgIHJldHVybiByZXN1bHQKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFB1YmxpYyBBUEkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRlZiBtaWdyYXRlKAogICAgcm9vdDogcGF0aGxpYi5QYXRoLAogICAgZHJ5X3J1bjogYm9vbCA9IEZhbHNlLAogICAgc2lnbmluZ19pZGVudGl0eTogU2lnbmluZ0lkZW50aXR5IHwgTm9uZSA9IE5vbmUsCiAgICBmb3JjZV9yZXNpZ246IGJvb2wgPSBGYWxzZSwKKSAtPiBNaWdyYXRlUmVzdWx0OgogICAgIiIiTWlncmF0ZSBhIE11c2UgcmVwb3NpdG9yeSB0byB0aGUgY2Fub25pY2FsIGN1cnJlbnQgbGF5b3V0LgoKICAgIEFyZ3M6CiAgICAgICAgcm9vdDogICAgICAgICAgICAgUmVwbyByb290IChjb250YWlucyBgYC5tdXNlL2BgKS4KICAgICAgICBkcnlfcnVuOiAgICAgICAgICBXaGVuIFRydWUsIGNvbXB1dGUgYWxsIGNoYW5nZXMgYW5kIHJlcG9ydCB0aGVtIGJ1dAogICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG5vdGhpbmcgdG8gZGlzay4KICAgICAgICBzaWduaW5nX2lkZW50aXR5OiBXaGVuIHByb3ZpZGVkLCB1bnNpZ25lZCBjb21taXRzIGFyZSBzaWduZWQgd2l0aCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkgZHVyaW5nIG1pZ3JhdGlvbi4gIEFscmVhZHktc2lnbmVkIGNvbW1pdHMKICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbmV2ZXIgcmUtc2lnbmVkLgoKICAgIFJldHVybnM6CiAgICAgICAgOmNsYXNzOmBNaWdyYXRlUmVzdWx0YCB3aXRoIGZ1bGwgbWlncmF0aW9uIHN1bW1hcnkuCgogICAgUmFpc2VzOgogICAgICAgIFJ1bnRpbWVFcnJvcjogSWYgYSBtZXJnZSBvciByZWJhc2UgaXMgaW4gcHJvZ3Jlc3MuCiAgICAiIiIKICAgIGlmIGZvcmNlX3Jlc2lnbiBhbmQgc2lnbmluZ19pZGVudGl0eSBpcyBOb25lOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICJmb3JjZV9yZXNpZ249VHJ1ZSByZXF1aXJlcyBhIHNpZ25pbmcgaWRlbnRpdHkuICIKICAgICAgICAgICAgIlJ1biBgbXVzZSBhdXRoIGtleWdlbiAmJiBtdXNlIGF1dGggcmVnaXN0ZXJgLCBvciBjb25uZWN0IGEgaHViICIKICAgICAgICAgICAgIndpdGggYG11c2UgaHViIGNvbm5lY3RgIHNvIGNyZWRlbnRpYWxzIGNhbiBiZSByZXNvbHZlZC4iCiAgICAgICAgKQogICAgaWYgKG11c2VfZGlyKHJvb3QpIC8gIk1FUkdFX1NUQVRFIikuZXhpc3RzKCk6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAiQSBtZXJnZSBpcyBpbiBwcm9ncmVzcyDigJQgZmluaXNoIG9yIGFib3J0IGl0IGJlZm9yZSBydW5uaW5nIG1pZ3JhdGUuIgogICAgICAgICkKICAgIGlmIHJlYmFzZV9tZXJnZV9kaXIocm9vdCkuZXhpc3RzKCk6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAiQSByZWJhc2UgaXMgaW4gcHJvZ3Jlc3Mg4oCUIGZpbmlzaCBvciBhYm9ydCBpdCBiZWZvcmUgcnVubmluZyBtaWdyYXRlLiIKICAgICAgICApCgogICAgIyAtLS0gcmVwby5qc29uIC0tLQogICAgcmVwb19pZF91cGRhdGVkID0gX21pZ3JhdGVfcmVwb19pZChyb290LCBkcnlfcnVuPWRyeV9ydW4pCgogICAgIyAtLS0gc25hcHNob3RzIC0tLQogICAgc25hcHNob3RzX3JlbG9jYXRlZCA9IF9taWdyYXRlX3NuYXBzaG90cyhyb290LCBkcnlfcnVuPWRyeV9ydW4pCgogICAgIyAtLS0gY29sbGVjdCBhbGwgY29tbWl0cyAoZmxhdCArIGNhbm9uaWNhbCkgLS0tCiAgICBhbGxfY29tbWl0cyA9IF9jb2xsZWN0X2FsbF9jb21taXRzKHJvb3QpCiAgICBvcmRlciA9IF90b3BvbG9naWNhbF9zb3J0KGFsbF9jb21taXRzKQoKICAgIGlkX21hcDogZGljdFtzdHIsIHN0cl0gPSB7fQogICAgY29tbWl0c19yZXdyaXR0ZW4gPSAwCiAgICBjb21taXRzX3JlbG9jYXRlZCA9IDAKICAgIGJyYW5jaF9maWVsZHNfcmVuYW1lZCA9IDAKICAgIHNpZ25hdHVyZXNfbm9ybWFsaXNlZCA9IDAKICAgIGZvcm1hdF92ZXJzaW9uc19idW1wZWQgPSAwCiAgICBjb21taXRzX3NpZ25lZCA9IDAKICAgIHVuc2lnbmVkX2NvbW1pdHNfc2tpcHBlZCA9IDAKCiAgICAjIEZpcnN0IHBhc3M6IGJ1aWxkIGlkX21hcCAobXVzdCBiZSBjb21wbGV0ZSBiZWZvcmUgc2Vjb25kIHBhc3MpLgogICAgIyBTaWduaW5nLWF3YXJlOiBpZiBzaWduaW5nX2lkZW50aXR5IGlzIHByb3ZpZGVkLCB1bnNpZ25lZCBjb21taXRzIHdpbGwKICAgICMgZ2V0IGEgbmV3IHNpZ25lcl9wdWJsaWNfa2V5IGJha2VkIGludG8gdGhlaXIgY29tbWl0X2lkLgogICAgZm9yIG9sZF9pZCBpbiBvcmRlcjoKICAgICAgICByYXcsIF8gPSBhbGxfY29tbWl0c1tvbGRfaWRdCiAgICAgICAgXywgbmV3X2lkLCBfID0gX21ha2VfY2Fub25pY2FsX2RpY3QocmF3LCBpZF9tYXAsIHNpZ25pbmdfaWRlbnRpdHksIGZvcmNlX3Jlc2lnbikKICAgICAgICBpZiBuZXdfaWQgIT0gb2xkX2lkOgogICAgICAgICAgICBpZF9tYXBbb2xkX2lkXSA9IG5ld19pZAoKICAgICMgU2Vjb25kIHBhc3M6IHdyaXRlIGNhbm9uaWNhbCBmaWxlcywgY29sbGVjdCBzdGF0cwogICAgZm9yIG9sZF9pZCBpbiBvcmRlcjoKICAgICAgICByYXcsIG9sZF9wYXRoID0gYWxsX2NvbW1pdHNbb2xkX2lkXQogICAgICAgIGNhbm9uaWNhbCwgbmV3X2lkLCB3YXNfc2lnbmVkID0gX21ha2VfY2Fub25pY2FsX2RpY3QocmF3LCBpZF9tYXAsIHNpZ25pbmdfaWRlbnRpdHksIGZvcmNlX3Jlc2lnbikKCiAgICAgICAgaXNfZmxhdCA9IF9pc19mbGF0X2NvbW1pdF9wYXRoKHJvb3QsIG9sZF9wYXRoKQogICAgICAgIGlkX2NoYW5nZWQgPSBuZXdfaWQgIT0gb2xkX2lkCiAgICAgICAgYnJhbmNoX3JlbmFtZWQgPSAiY3JlYXRlZF9vbl9icmFuY2giIGluIHJhdyBhbmQgImJyYW5jaCIgbm90IGluIHJhdwogICAgICAgIHNpZ19ub3JtYWxpc2VkID0gYm9vbChyYXcuZ2V0KCJzaWduYXR1cmUiKSkgYW5kIG5vdCByYXdbInNpZ25hdHVyZSJdLnN0YXJ0c3dpdGgoImVkMjU1MTk6IikKICAgICAgICBmdl9idW1wZWQgPSByYXcuZ2V0KCJmb3JtYXRfdmVyc2lvbiIsIDEpICE9IDgKICAgICAgICBpc191bnNpZ25lZCA9IG5vdCByYXcuZ2V0KCJzaWduYXR1cmUiKSBhbmQgbm90IHJhdy5nZXQoInNpZ25lcl9wdWJsaWNfa2V5IikKICAgICAgICBoYXNfcmVwb19pZCA9ICJyZXBvX2lkIiBpbiByYXcKCiAgICAgICAgaWYgaWRfY2hhbmdlZDoKICAgICAgICAgICAgY29tbWl0c19yZXdyaXR0ZW4gKz0gMQogICAgICAgIGlmIGlzX2ZsYXQ6CiAgICAgICAgICAgIGNvbW1pdHNfcmVsb2NhdGVkICs9IDEKICAgICAgICBpZiBicmFuY2hfcmVuYW1lZDoKICAgICAgICAgICAgYnJhbmNoX2ZpZWxkc19yZW5hbWVkICs9IDEKICAgICAgICBpZiBzaWdfbm9ybWFsaXNlZDoKICAgICAgICAgICAgc2lnbmF0dXJlc19ub3JtYWxpc2VkICs9IDEKICAgICAgICBpZiBmdl9idW1wZWQ6CiAgICAgICAgICAgIGZvcm1hdF92ZXJzaW9uc19idW1wZWQgKz0gMQogICAgICAgIGlmIHdhc19zaWduZWQ6CiAgICAgICAgICAgIGNvbW1pdHNfc2lnbmVkICs9IDEKICAgICAgICBlbGlmIGlzX3Vuc2lnbmVkIGFuZCBzaWduaW5nX2lkZW50aXR5IGlzIE5vbmU6CiAgICAgICAgICAgIHVuc2lnbmVkX2NvbW1pdHNfc2tpcHBlZCArPSAxCgogICAgICAgIG5lZWRzX3dyaXRlID0gaWRfY2hhbmdlZCBvciBpc19mbGF0IG9yIGJyYW5jaF9yZW5hbWVkIG9yIHNpZ19ub3JtYWxpc2VkIG9yIGZ2X2J1bXBlZCBvciB3YXNfc2lnbmVkIG9yIGhhc19yZXBvX2lkCiAgICAgICAgaWYgbm90IGRyeV9ydW4gYW5kIG5lZWRzX3dyaXRlOgogICAgICAgICAgICBfd3JpdGVfcmF3X2NvbW1pdChyb290LCBjYW5vbmljYWwpCiAgICAgICAgICAgICMgRGVsZXRlIG9sZCBmaWxlIGlmIGl0J3MgYXQgYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhhbiB0aGUgbmV3IGNhbm9uaWNhbCBwYXRoCiAgICAgICAgICAgIG5ld19oZXggPSBsb25nX2lkKG5ld19pZCwgc3RyaXA9VHJ1ZSkKICAgICAgICAgICAgbmV3X3BhdGggPSBfY2Fub25pY2FsX2NvbW1pdF9wYXRoKHJvb3QsIG5ld19oZXgpCiAgICAgICAgICAgIGlmIG9sZF9wYXRoICE9IG5ld19wYXRoIGFuZCBvbGRfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgICAgIG9sZF9wYXRoLnVubGluaygpCgogICAgIyAtLS0gb2JqZWN0cyAobGVnYWN5IGxheW91dDogb2JqZWN0cy88c2hhcmQ+IOKGkiBvYmplY3RzL3NoYTI1Ni88c2hhcmQ+KSAtLS0KICAgIGJsb2JzX21pZ3JhdGVkLCBsZWdhY3lfZGlyc19yZW1vdmVkID0gX21pZ3JhdGVfb2JqZWN0cyhyb290LCBkcnlfcnVuPWRyeV9ydW4pCgogICAgIyAtLS0gUGhhc2UgNzogSUQgY2hhaW4gbWlncmF0aW9uIChibG9icyDihpIgc25hcHNob3RzIOKGkiBjb21taXRzKSAtLS0KICAgICMgUGFzcyAxOiByZXdyaXRlIHJhdyBibG9icyB0byBtdXNlLWZvcm1hdCBhdCBuZXcgaGFzaF9ibG9iIHBhdGhzLgogICAgYmxvYl9yZXN1bHQgPSBtaWdyYXRlX2Jsb2JfaWRzKHJvb3QsIGRyeV9ydW49ZHJ5X3J1bikKICAgICMgUGFzcyAyOiB1cGRhdGUgc25hcHNob3QgbWFuaWZlc3RzIHdpdGggbmV3IGJsb2IgSURzLCB3cml0ZSB0byBvYmplY3Qgc3RvcmUuCiAgICBzbmFwX3Jlc3VsdCA9IG1pZ3JhdGVfc25hcHNob3RfaWRzKHJvb3QsIGJsb2JfcmVzdWx0LmlkX21hcCwgZHJ5X3J1bj1kcnlfcnVuKQogICAgIyBQYXNzIDM6IHVwZGF0ZSBjb21taXQgc25hcHNob3RfaWQgZmllbGRzLCByZWNvbXB1dGUgY29tbWl0IElEcywgd3JpdGUgdG8KICAgICMgb2JqZWN0IHN0b3JlIGFuZCBuZXcgbXNncGFjayBwYXRocy4KICAgIGNvbW1pdF9yZXN1bHQgPSBtaWdyYXRlX2NvbW1pdF9pZHMocm9vdCwgc25hcF9yZXN1bHQuaWRfbWFwLCBkcnlfcnVuPWRyeV9ydW4pCgogICAgIyBCdWlsZCB0aGUgY29tYmluZWQgb2xk4oaSbmV3IElEIG1hcCBmb3IgcmVmIGFuZCByZWZsb2cgdXBkYXRlcy4KICAgICMKICAgICMgVGhlIGV4aXN0aW5nIGxvb3AgbWFwcyAgb2xkX2lkIOKGkiBsZWdhY3lfaWQgIChwYXJlbnQgY2FzY2FkZSwgc2lnbmluZykuCiAgICAjIFBoYXNlIDcgbWFwcyAgICAgICAgICAgIGxlZ2FjeV9pZCDihpIgcGhhc2U3X2lkICAoZnVsbCBJRCBjaGFpbikuCiAgICAjCiAgICAjIEEgbmHDr3ZlIG1lcmdlICh7KippZF9tYXAsICoqY29tbWl0X3Jlc3VsdC5pZF9tYXB9KSBvbmx5IHJlc29sdmVzIG9uZSBob3A6CiAgICAjIHJlZnMgY29udGFpbmluZyBvbGRfaWQgd291bGQgbGFuZCBhdCBsZWdhY3lfaWQsIG5vdCBwaGFzZTdfaWQuICBXZSBuZWVkCiAgICAjIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmU6IG9sZF9pZCDihpIgcGhhc2U3X2lkIGluIG9uZSBzdGVwLgogICAgY29tYmluZWRfaWRfbWFwOiBkaWN0W3N0ciwgc3RyXSA9IHt9CiAgICBmb3Igb2xkX2lkLCBsZWdhY3lfaWQgaW4gaWRfbWFwLml0ZW1zKCk6CiAgICAgICAgZmluYWxfaWQgPSBjb21taXRfcmVzdWx0LmlkX21hcC5nZXQobGVnYWN5X2lkLCBsZWdhY3lfaWQpCiAgICAgICAgY29tYmluZWRfaWRfbWFwW29sZF9pZF0gPSBmaW5hbF9pZAogICAgIyBBbHNvIGNhcnJ5IHRocm91Z2ggYW55IFBoYXNlIDcgZW50cmllcyBub3QgY292ZXJlZCBieSB0aGUgbGVnYWN5IG1hcAogICAgIyAoY29tbWl0cyB0aGF0IHdlcmUgYWxyZWFkeSBhdCB0aGVpciBsZWdhY3kgZm9ybSBiZWZvcmUgdGhpcyBydW4pLgogICAgZm9yIGxlZ2FjeV9pZCwgcGhhc2U3X2lkIGluIGNvbW1pdF9yZXN1bHQuaWRfbWFwLml0ZW1zKCk6CiAgICAgICAgaWYgbGVnYWN5X2lkIG5vdCBpbiBjb21iaW5lZF9pZF9tYXA6CiAgICAgICAgICAgIGNvbWJpbmVkX2lkX21hcFtsZWdhY3lfaWRdID0gcGhhc2U3X2lkCgogICAgIyAtLS0gYnJhbmNoIHJlZnMgLS0tCiAgICByZWZzX3VwZGF0ZWQgPSBfbWlncmF0ZV9yZWZzKHJvb3QsIGNvbWJpbmVkX2lkX21hcCwgZHJ5X3J1bj1kcnlfcnVuKQoKICAgICMgLS0tIHJlbW90ZSByZWZzIC0tLQogICAgcmVtb3RlX3JlZnNfdXBkYXRlZCA9IF9taWdyYXRlX3JlbW90ZV9yZWZzKHJvb3QsIGNvbWJpbmVkX2lkX21hcCwgZHJ5X3J1bj1kcnlfcnVuKQoKICAgICMgLS0tIHJlZmxvZ3MgLS0tCiAgICByZWZsb2dzX3VwZGF0ZWQgPSBfbWlncmF0ZV9yZWZsb2dzKHJvb3QsIGNvbWJpbmVkX2lkX21hcCwgZHJ5X3J1bj1kcnlfcnVuKQoKICAgICMgLS0tIHJlbW92ZSBsZWdhY3kgZGlyZWN0b3JpZXMgLS0tCiAgICAjIEFsbCBjb250ZW50IGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIHVuaWZpZWQgb2JqZWN0IHN0b3JlIGJ5IHRoaXMgcG9pbnQuCiAgICAjIE9ycGhhbmVkIG9iamVjdHMgdW5yZWZlcmVuY2VkIGJ5IGFueSBicmFuY2ggd2lsbCBiZSBjb2xsZWN0ZWQgYnkgZ2MuCiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICBmb3IgbGVnYWN5X2RpciBpbiAoY29tbWl0c19kaXIocm9vdCksIHNuYXBzaG90c19kaXIocm9vdCkpOgogICAgICAgICAgICBpZiBsZWdhY3lfZGlyLmV4aXN0cygpOgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShsZWdhY3lfZGlyKQoKICAgIHJldHVybiBNaWdyYXRlUmVzdWx0KAogICAgICAgIGlkX21hcD1jb21iaW5lZF9pZF9tYXAsCiAgICAgICAgY29tbWl0c19yZXdyaXR0ZW49Y29tbWl0c19yZXdyaXR0ZW4sCiAgICAgICAgYmxvYnNfbWlncmF0ZWQ9YmxvYnNfbWlncmF0ZWQsCiAgICAgICAgbGVnYWN5X2RpcnNfcmVtb3ZlZD1sZWdhY3lfZGlyc19yZW1vdmVkLAogICAgICAgIGRyeV9ydW49ZHJ5X3J1biwKICAgICAgICBjb21taXRzX3JlbG9jYXRlZD1jb21taXRzX3JlbG9jYXRlZCwKICAgICAgICBzbmFwc2hvdHNfcmVsb2NhdGVkPXNuYXBzaG90c19yZWxvY2F0ZWQsCiAgICAgICAgcmVmc191cGRhdGVkPXJlZnNfdXBkYXRlZCwKICAgICAgICByZW1vdGVfcmVmc191cGRhdGVkPXJlbW90ZV9yZWZzX3VwZGF0ZWQsCiAgICAgICAgcmVwb19pZF91cGRhdGVkPXJlcG9faWRfdXBkYXRlZCwKICAgICAgICBicmFuY2hfZmllbGRzX3JlbmFtZWQ9YnJhbmNoX2ZpZWxkc19yZW5hbWVkLAogICAgICAgIHNpZ25hdHVyZXNfbm9ybWFsaXNlZD1zaWduYXR1cmVzX25vcm1hbGlzZWQsCiAgICAgICAgZm9ybWF0X3ZlcnNpb25zX2J1bXBlZD1mb3JtYXRfdmVyc2lvbnNfYnVtcGVkLAogICAgICAgIHJlZmxvZ3NfdXBkYXRlZD1yZWZsb2dzX3VwZGF0ZWQsCiAgICAgICAgY29tbWl0c19zaWduZWQ9Y29tbWl0c19zaWduZWQsCiAgICAgICAgdW5zaWduZWRfY29tbWl0c19za2lwcGVkPXVuc2lnbmVkX2NvbW1pdHNfc2tpcHBlZCwKICAgICAgICBibG9ic19yZXdyaXR0ZW49YmxvYl9yZXN1bHQuYmxvYnNfd3JpdHRlbiwKICAgICAgICBzbmFwc2hvdHNfcmV3cml0dGVuPXNuYXBfcmVzdWx0LnNuYXBzaG90c193cml0dGVuLAogICAgICAgIGNvbW1pdHNfdW5pZmllZD1jb21taXRfcmVzdWx0LmNvbW1pdHNfd3JpdHRlbiwKICAgICkK"}}