@rainbow-robotics/muscat-plugin-kit 1.3.2 → 1.3.3-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/cli/docker/Dockerfile.cpp +22 -5
  2. package/cli/docker/Dockerfile.dev +25 -5
  3. package/cli/docker/Dockerfile.python +19 -0
  4. package/cli/src/bridge.mjs +19 -2
  5. package/cli/src/build.mjs +31 -79
  6. package/cli/src/cpp.mjs +10 -6
  7. package/cli/src/dev.mjs +7 -2
  8. package/cli/src/devBack.mjs +39 -32
  9. package/cli/src/host_agent.py +143 -83
  10. package/cli/src/mcp.mjs +75 -16
  11. package/cli/src/new.mjs +5 -2
  12. package/cli/src/ports.mjs +21 -7
  13. package/cli/src/python.mjs +9 -17
  14. package/cli/src/ros2.mjs +13 -8
  15. package/cli/src/sdk.mjs +23 -21
  16. package/cli/src/templates-embedded.mjs +1 -1
  17. package/cli/src/type.mjs +42 -8
  18. package/cli/src/util.mjs +53 -5
  19. package/cli/storybook-dist/assets/{Color-YHDXOIA2-CRNvRzJD.js → Color-YHDXOIA2-DNIJVGRw.js} +1 -1
  20. package/cli/storybook-dist/assets/{Docs-80l_9VTs.js → Docs-CIT3omBi.js} +1 -1
  21. package/cli/storybook-dist/assets/{Docs-BgDx9SSn.js → Docs-CdX_ToEv.js} +1 -1
  22. package/cli/storybook-dist/assets/{Docs-BV0FgAF_.js → Docs-D9eMx0Cp.js} +1 -1
  23. package/cli/storybook-dist/assets/{Docs-C4S_Kfa9.js → Docs-RJox-ekp.js} +1 -1
  24. package/cli/storybook-dist/assets/{Docs-axk94PIl.js → Docs-wnrZBY76.js} +1 -1
  25. package/cli/storybook-dist/assets/{Docs-DurNQvJo.js → Docs-x99QNSvG.js} +1 -1
  26. package/cli/storybook-dist/assets/{DocsRenderer-CFRXHY34-CEdKXElc.js → DocsRenderer-CFRXHY34-CPuvjoGb.js} +1 -1
  27. package/cli/storybook-dist/assets/{NxAvatar.stories-CyZ4AE2b.js → NxAvatar.stories-B3OxXBgc.js} +1 -1
  28. package/cli/storybook-dist/assets/{NxButton.stories-Bx8UtGNd.js → NxButton.stories-UTqX8ZkA.js} +1 -1
  29. package/cli/storybook-dist/assets/{NxNumberInput.stories-skizAdd5.js → NxNumberInput.stories-GoLEe-uJ.js} +1 -1
  30. package/cli/storybook-dist/assets/{NxPagination.stories-gtIxt2u0.js → NxPagination.stories-Jj6dt6eG.js} +1 -1
  31. package/cli/storybook-dist/assets/{NxPointerHoldButton.stories-DSHMk3N5.js → NxPointerHoldButton.stories-tLN9u4nC.js} +1 -1
  32. package/cli/storybook-dist/assets/{NxRangeInput.stories-C1YtrFZ1.js → NxRangeInput.stories-C-MK73xb.js} +1 -1
  33. package/cli/storybook-dist/assets/{NxSelectBox.stories-DCySAtBp.js → NxSelectBox.stories-CBcFcOIX.js} +1 -1
  34. package/cli/storybook-dist/assets/{NxSlideRange.stories-gSaMOWo7.js → NxSlideRange.stories-oNQkoW66.js} +1 -1
  35. package/cli/storybook-dist/assets/{NxSwitch.stories-DF0DBiyG.js → NxSwitch.stories-CqBkO5GC.js} +1 -1
  36. package/cli/storybook-dist/assets/{NxTextArea.stories-Dill0M6z.js → NxTextArea.stories-DtysSyl4.js} +1 -1
  37. package/cli/storybook-dist/assets/{NxTextInput.stories-Bax14r48.js → NxTextInput.stories-BOLDbSgF.js} +1 -1
  38. package/cli/storybook-dist/assets/{RBAccordion.stories-CCwz_pIV.js → RBAccordion.stories-D9-wu9LY.js} +1 -1
  39. package/cli/storybook-dist/assets/{RBAccordionGroup.stories-BjDxxdPV.js → RBAccordionGroup.stories-BPfnIKm6.js} +1 -1
  40. package/cli/storybook-dist/assets/{RBAlert.stories-5z6GasgP.js → RBAlert.stories-CGn-c2ac.js} +1 -1
  41. package/cli/storybook-dist/assets/{RBBadge.stories-BwcM7i7w.js → RBBadge.stories-CBLmeoq1.js} +1 -1
  42. package/cli/storybook-dist/assets/{RBBattery.stories-DOeQH3rK.js → RBBattery.stories-oo47rbDh.js} +1 -1
  43. package/cli/storybook-dist/assets/{RBCard.stories-DcmiOXAV.js → RBCard.stories-SiD2VfQ4.js} +1 -1
  44. package/cli/storybook-dist/assets/{RBCheckBox.stories-BYru87fX.js → RBCheckBox.stories-sEEVrjSg.js} +1 -1
  45. package/cli/storybook-dist/assets/{RBCheckIconButton.stories-CXUjtR1a.js → RBCheckIconButton.stories-C5GQUjZf.js} +1 -1
  46. package/cli/storybook-dist/assets/{RBCheckLabelButton.stories-BSOQV7Du.js → RBCheckLabelButton.stories-DTaTqBvJ.js} +1 -1
  47. package/cli/storybook-dist/assets/{RBChipTab.stories-ByBmeukU.js → RBChipTab.stories-3AZr4kOz.js} +1 -1
  48. package/cli/storybook-dist/assets/{RBChipsBoxTab.stories-GtJ01RTr.js → RBChipsBoxTab.stories-hCJnBYQl.js} +1 -1
  49. package/cli/storybook-dist/assets/{RBColorIcons.stories-C9saET1u.js → RBColorIcons.stories-BX4RJygu.js} +1 -1
  50. package/cli/storybook-dist/assets/{RBCommand.stories-CcvnWlWZ.js → RBCommand.stories-BidZ4H8f.js} +1 -1
  51. package/cli/storybook-dist/assets/{RBConfirm.stories-hdBVSdBS.js → RBConfirm.stories-D3Txw1kT.js} +1 -1
  52. package/cli/storybook-dist/assets/{RBDateInput.stories-BE9JQl-E.js → RBDateInput.stories-CLxRaN6T.js} +1 -1
  53. package/cli/storybook-dist/assets/{RBDialog.stories-BaWuDgl_.js → RBDialog.stories-CEhmUGp-.js} +1 -1
  54. package/cli/storybook-dist/assets/{RBDivider.stories-D3INKm_Z.js → RBDivider.stories-peXP2KG9.js} +1 -1
  55. package/cli/storybook-dist/assets/{RBDrawer.stories-BZ8V0J6-.js → RBDrawer.stories-38iDf6uC.js} +1 -1
  56. package/cli/storybook-dist/assets/{RBDropdownMenu.stories-DxLi8HRw.js → RBDropdownMenu.stories-Dsi8tqSy.js} +1 -1
  57. package/cli/storybook-dist/assets/{RBEmptyView.stories-DQcvDt2S.js → RBEmptyView.stories-VMxWhzLP.js} +1 -1
  58. package/cli/storybook-dist/assets/{RBIconButton.stories-DJfuTpQ0.js → RBIconButton.stories-BPLhceGO.js} +1 -1
  59. package/cli/storybook-dist/assets/{RBIcons.stories-BSsyb0BK.js → RBIcons.stories-DuYdO951.js} +1 -1
  60. package/cli/storybook-dist/assets/{RBInlineLabelButton.stories-Di3th--x.js → RBInlineLabelButton.stories-CGNYhQyl.js} +1 -1
  61. package/cli/storybook-dist/assets/{RBJoyStick.stories-DfGazm4n.js → RBJoyStick.stories-CCmn-LMy.js} +1 -1
  62. package/cli/storybook-dist/assets/{RBLabelButton.stories-CLbxzW56.js → RBLabelButton.stories-IkKjthGk.js} +1 -1
  63. package/cli/storybook-dist/assets/{RBLight.stories-DeiuDm_P.js → RBLight.stories-eJFQOjPH.js} +1 -1
  64. package/cli/storybook-dist/assets/{RBMenubar.stories-BZQTV9e5.js → RBMenubar.stories-kg-xXGrW.js} +1 -1
  65. package/cli/storybook-dist/assets/{RBMultiRangeInput.stories-DDNmdi_n.js → RBMultiRangeInput.stories-Czr1r3gd.js} +1 -1
  66. package/cli/storybook-dist/assets/{RBPagination.stories-CLBCEyCU.js → RBPagination.stories-Dyu6Khnl.js} +1 -1
  67. package/cli/storybook-dist/assets/{RBPopover.stories-DRI5Kfa-.js → RBPopover.stories-CAM6hpf2.js} +1 -1
  68. package/cli/storybook-dist/assets/{RBPrompt.stories-DIAmypoJ.js → RBPrompt.stories-B4M-veaf.js} +1 -1
  69. package/cli/storybook-dist/assets/{RBRadioBox.stories-BS_N4aLf.js → RBRadioBox.stories-DeAOKvil.js} +1 -1
  70. package/cli/storybook-dist/assets/{RBRadioButton.stories-BTm8cYvm.js → RBRadioButton.stories-DjXwYXFy.js} +1 -1
  71. package/cli/storybook-dist/assets/{RBRangeDateInput.stories-D5hBsSyB.js → RBRangeDateInput.stories-9pzKhXGf.js} +1 -1
  72. package/cli/storybook-dist/assets/{RBResizable.stories-CxPEkbXQ.js → RBResizable.stories-B4Hi4DUD.js} +1 -1
  73. package/cli/storybook-dist/assets/{RBSelectBox.stories-FUQ7AcUi.js → RBSelectBox.stories-tVVv4c6z.js} +1 -1
  74. package/cli/storybook-dist/assets/{RBSheet.stories-mhVHH_71.js → RBSheet.stories-BwOCmaNN.js} +1 -1
  75. package/cli/storybook-dist/assets/{RBSideNumberInput.stories-5FMkLUim.js → RBSideNumberInput.stories-BbGOIitU.js} +1 -1
  76. package/cli/storybook-dist/assets/{RBSlider.stories-Bnhcp9pz.js → RBSlider.stories-yIDdawYQ.js} +1 -1
  77. package/cli/storybook-dist/assets/{RBSpinner.stories-Bf4416mP.js → RBSpinner.stories-CIJvpbgK.js} +1 -1
  78. package/cli/storybook-dist/assets/{RBSwitch.stories-BNhFjRaV.js → RBSwitch.stories-Bo8hrSiq.js} +1 -1
  79. package/cli/storybook-dist/assets/{RBTab.stories-Bsr7jlfb.js → RBTab.stories-Cq3N4Dgb.js} +1 -1
  80. package/cli/storybook-dist/assets/{RBTable.stories-BkA6pKzs.js → RBTable.stories-DDeZf-Wb.js} +1 -1
  81. package/cli/storybook-dist/assets/{RBTableRow.stories-D07Z7D5-.js → RBTableRow.stories-BeKVMSo3.js} +1 -1
  82. package/cli/storybook-dist/assets/{RBTabs.stories-DHnZiV21.js → RBTabs.stories-DovB7PPB.js} +1 -1
  83. package/cli/storybook-dist/assets/{RBTextArea.stories-CtLMLuV_.js → RBTextArea.stories-D7H4RvP8.js} +1 -1
  84. package/cli/storybook-dist/assets/{RBTextField.stories-Chz0i1-u.js → RBTextField.stories-CmkNXeEk.js} +1 -1
  85. package/cli/storybook-dist/assets/{RBTextInput.stories-Dk5cZfUF.js → RBTextInput.stories-hnxbQJsb.js} +1 -1
  86. package/cli/storybook-dist/assets/{RBToast.stories-tZxbjmr8.js → RBToast.stories-BklGGkNh.js} +1 -1
  87. package/cli/storybook-dist/assets/{RBToggle.stories-VTe7a4xZ.js → RBToggle.stories-C56AXyxq.js} +1 -1
  88. package/cli/storybook-dist/assets/{RBToggleGroup.stories-WiFnGGYx.js → RBToggleGroup.stories-CpLPdAF0.js} +1 -1
  89. package/cli/storybook-dist/assets/{RBTooltip.stories-B_L4W7Mn.js → RBTooltip.stories-BdOnCwGk.js} +1 -1
  90. package/cli/storybook-dist/assets/{SideNumberInput-os5wKKf7.js → SideNumberInput-DLmM2_Dy.js} +80 -80
  91. package/cli/storybook-dist/assets/{entry-preview-COJgWzHb.js → entry-preview-DqMcNOGI.js} +1 -1
  92. package/cli/storybook-dist/assets/{iframe-DQEjJuXA.js → iframe-C1kyDB-R.js} +2 -2
  93. package/cli/storybook-dist/assets/{index-DEgQqQ_-.js → index-CdVSDe2m.js} +3 -3
  94. package/cli/storybook-dist/assets/{preview-BZ5PpEp_.js → preview-C_JfiDjl.js} +2 -2
  95. package/cli/storybook-dist/assets/preview-DvwEjyb4.js +3 -0
  96. package/cli/storybook-dist/iframe.html +1 -1
  97. package/cli/storybook-dist/project.json +1 -1
  98. package/cli/templates/common/README.md +65 -4
  99. package/cli/templates/common/py/main.py +5 -1
  100. package/cli/templates/common/requirements.txt +3 -3
  101. package/cli/templates/cpp/cpp/CMakeLists.txt +1 -2
  102. package/cli/templates/cpp/cpp/main.cpp +48 -8
  103. package/cli/templates/readme-cpp/README.md +969 -0
  104. package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt +1 -1
  105. package/package.json +3 -3
  106. package/cli/storybook-dist/assets/preview-CmCb8Xea.js +0 -3
package/cli/src/sdk.mjs CHANGED
@@ -6,24 +6,24 @@
6
6
  // the new version immediately; this is best-effort only.
7
7
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
8
8
  import { resolve } from "node:path";
9
- import { spawnSync } from "node:child_process";
10
- import { findPluginRoot, log, venvPython } from "./util.mjs";
9
+ import { ensureIdeVenv, findPluginRoot, log, venvPython } from "./util.mjs";
11
10
 
12
11
  const PKG = "rainbow-rb-sdk";
13
12
 
14
- async function fetchVersions() {
13
+ async function fetchPypi() {
15
14
  try {
16
15
  const res = await fetch(`https://pypi.org/pypi/${PKG}/json`);
17
- if (!res.ok) return [];
18
- const data = await res.json();
19
- return Object.keys(data.releases || {}).sort((a, b) =>
20
- b.localeCompare(a, undefined, { numeric: true }),
21
- );
16
+ return res.ok ? await res.json() : null;
22
17
  } catch {
23
- return [];
18
+ return null;
24
19
  }
25
20
  }
26
21
 
22
+ async function fetchVersions() {
23
+ const data = await fetchPypi();
24
+ return Object.keys(data?.releases || {}).sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
25
+ }
26
+
27
27
  export async function runSdk(args = []) {
28
28
  const sub = args[0];
29
29
  const root = findPluginRoot();
@@ -42,23 +42,25 @@ export async function runSdk(args = []) {
42
42
  if (sub === "update") {
43
43
  let version = args[1];
44
44
  if (!version) {
45
- const versions = await fetchVersions();
46
- version = versions[0] || "latest";
45
+ // info.version = latest stable
46
+ version = (await fetchPypi())?.info?.version;
47
+ if (!version) throw new Error("could not fetch the latest version (offline?). Pass one: muscat-pk sdk update <version>");
47
48
  }
49
+ // rainbow-rb-* pin each other exactly — bump them together.
48
50
  let content = existsSync(reqs) ? readFileSync(reqs, "utf8") : "";
49
- const line = `${PKG}==${version}`;
50
- if (new RegExp(`^${PKG}==`, "m").test(content)) {
51
- content = content.replace(new RegExp(`^${PKG}==.*$`, "m"), line);
52
- } else {
53
- content = (content ? content.trimEnd() + "\n" : "") + line + "\n";
51
+ const pinned = /^(rainbow-rb-[\w-]+)\s*==.*$/gim;
52
+ const bumped = [...content.matchAll(pinned)].map((m) => m[1]);
53
+ content = content.replace(pinned, (_m, name) => `${name}==${version}`);
54
+ if (!bumped.some((n) => n.toLowerCase() === PKG)) {
55
+ content = (content ? content.trimEnd() + "\n" : "") + `${PKG}==${version}\n`;
56
+ bumped.push(PKG);
54
57
  }
55
58
  writeFileSync(reqs, content);
56
- log.ok(`requirements.txt → ${line}`);
59
+ log.ok(`requirements.txt → ${bumped.map((n) => `${n}==${version}`).join(", ")}`);
57
60
 
58
- const py = venvPython(resolve(root, ".venv"));
59
- if (existsSync(py)) {
60
- log.step("pip install -r requirements.txt (.venv, for your editor)…");
61
- spawnSync(py, ["-m", "pip", "install", "-q", "-r", reqs], { cwd: root, stdio: "inherit" });
61
+ if (existsSync(venvPython(resolve(root, ".venv")))) {
62
+ log.step("refreshing .venv (for your editor)…");
63
+ if (!ensureIdeVenv(root)) log.warn(".venv refresh failed — the Docker dev container is unaffected.");
62
64
  } else {
63
65
  log.info("Installed automatically on the next `muscat-pk dev` / `dev:back` (Docker container).");
64
66
  }
@@ -1,3 +1,3 @@
1
1
  // AUTO-GENERATED by cli/bundle-templates.mjs — do not edit.
2
2
  // ponytail: generated at publish time; not tracked in git.
3
- export const TEMPLATES = {"common/.mcp.json":"ewogICJtY3BTZXJ2ZXJzIjogewogICAgIm11c2NhdCI6IHsKICAgICAgImNvbW1hbmQiOiAibXVzY2F0LXBrIiwKICAgICAgImFyZ3MiOiBbIm1jcCJdCiAgICB9CiAgfQp9Cg==","common/README.md":"IyBfX1BMVUdJTl9OQU1FX18KCkEgTXVzY2F0IHBsdWdpbiBwcm9qZWN0LiBCdWlsZCwgZGV2ZWxvcCwgYW5kIHNoaXAgd2l0aCBgbXVzY2F0LXBrYCBDTEkuCgojIyBRdWljayBzdGFydAoKYGBgYmFzaAptdXNjYXQtcGsgZGV2ICAgICAgICAjIFVJIHByZXZpZXcgKyBiYWNrZW5kIHRvZ2V0aGVyCm11c2NhdC1wayBkZXY6dWkgICAgICMgVUkgcHJldmlldyBvbmx5Cm11c2NhdC1wayBkZXY6YmFjayAgICMgYmFja2VuZCBvbmx5IChQeXRob24gd2F0Y2hmaWxlcyAvIFJPUzIgRG9ja2VyKQptdXNjYXQtcGsgYnVpbGQgICAgICAjIGJ1aWxkICsgZGlzdHJpYnV0YWJsZSBaSVAKYGBgCgotLS0KCiMjIFByb2plY3Qgc3RydWN0dXJlCgpgYGAKX19QTFVHSU5fRElSX18vCuKUnOKUgCB1aS8K4pSCICAg4pSc4pSAIGNvbnRlbnQudHN4ICAgICAgIyBwbHVnaW4gVUkgZW50cnkgcG9pbnQK4pSCICAg4pSU4pSAIHN0eWxlLmNzcyAgICAgICAgIyBwbHVnaW4gc3R5bGVzIGF1dG8tbG9hZGVkIGJ5IG11c2NhdCgpCuKUnOKUgCBweS8K4pSCICAg4pSU4pSAIG1haW4ucHkgICAgICAgICAgIyBQeXRob24gYmFja2VuZCBlbnRyeSBwb2ludArilJzilIAgYXNzZXRzLwrilIIgICDilJTilIAgaWNvbi5zdmcgICAgICAgICAjIGljb24gcmVmZXJlbmNlZCBmcm9tIG1hbmlmZXN0CuKUnOKUgCBtYW5pZmVzdC5qc29uICAgICAgICAjIG1ldGFkYXRhLCBjb250cmlidXRpb24gcG9pbnRzLCBydW50aW1lIGNvbmZpZwrilJzilIAgUkVBRE1FLm1kICAgICAgICAgICAgIyB0aGlzIGZpbGUgKGNvcGllZCB0byBkaXN0LyBvbiBidWlsZCkK4pSU4pSAIHJlcXVpcmVtZW50cy50eHQgICAgICMgUHl0aG9uIGRlcHMgKGF1dG8tcGlubmVkIHRvIGxhdGVzdCBvbiBidWlsZCkKYGBgCgo+IFJPUzIgcGx1Z2lucyBhZGRpdGlvbmFsbHkgaW5jbHVkZSBhIGByb3MyX3dzL2AgZGlyZWN0b3J5LgoKLS0tCgojIyBGcm9udGVuZCAoYHVpL2NvbnRlbnQudHN4YCkKCiMjIyBKYXZhU2NyaXB0IGRlcGVuZGVuY2llcwoKYG11c2NhdC1wayBidWlsZGAgcnVucyB0aGlzIHBsdWdpbiBwcm9qZWN0J3Mgb3duIFZpdGUgYnVpbGQuIFZpdGUgcmVzb2x2ZXMKaW1wb3J0cyBmcm9tIGluc3RhbGxlZCBgbm9kZV9tb2R1bGVzYDsgaXQgZG9lcyBub3QgY2FyZSB3aGV0aGVyIGEgcGFja2FnZSBpcwpsaXN0ZWQgdW5kZXIgYGRlcGVuZGVuY2llc2Agb3IgYGRldkRlcGVuZGVuY2llc2AsIGJ1dCB0aGUgcGFja2FnZSBtdXN0IGJlCmluc3RhbGxlZC4KCkRvIG5vdCBydW4gYSBwcm9kdWN0aW9uLW9ubHkgaW5zdGFsbCBzdWNoIGFzIGBucG0gaW5zdGFsbCAtLW9taXQ9ZGV2YCBiZWZvcmUKYnVpbGRpbmcgdGhlIHBsdWdpbiBVSSwgYmVjYXVzZSBidWlsZCB0b29scyBsaWtlIGB2aXRlYCwgYHR5cGVzY3JpcHRgLApgdGFpbHdpbmRjc3NgLCBgQHRhaWx3aW5kY3NzL3ZpdGVgLCBgc2Fzc2AsIG9yIGBsZXNzYCBhcmUgdXN1YWxseQpgZGV2RGVwZW5kZW5jaWVzYC4KClRoZSBzY2FmZm9sZCBrZWVwcyB0aGlzIHNwbGl0OgoKfCBwYWNrYWdlIGtpbmQgfCBleGFtcGxlcyB8IHdoeSB8CnwtLS18LS0tfC0tLXwKfCBgZGVwZW5kZW5jaWVzYCB8IGBAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWlgLCBVSSBsaWJyYXJpZXMgaW1wb3J0ZWQgYnkgcGx1Z2luIHNvdXJjZSB8IEF1dGhvci1mYWNpbmcgQVBJcyB1c2VkIGJ5IGB1aS8qLnRzeGAgfAp8IGBkZXZEZXBlbmRlbmNpZXNgIHwgYHZpdGVgLCBgdHlwZXNjcmlwdGAsIGB0YWlsd2luZGNzc2AsIGBAdGFpbHdpbmRjc3Mvdml0ZWAsIGBzYXNzYCwgYGxlc3NgIHwgQnVpbGQvZGV2IHRvb2xzIG5lZWRlZCBiZWZvcmUgYGRpc3QvKi5qc2AgaXMgcHJvZHVjZWQgfAoKVGhlIGJ1aWx0IHBsdWdpbiBaSVAgZG9lcyBub3QgaW5jbHVkZSBgcGFja2FnZS5qc29uYCBvciBgbm9kZV9tb2R1bGVzYC4gRm9yCnByb2R1Y3Rpb24sIE11c2NhdCBwcm92aWRlcyBgQHJhaW5ib3ctcm9ib3RpY3MvcGx1Z2luLXVpYCwgUmVhY3QsIGFuZCBSZWFjdERPTQp0aHJvdWdoIHRoZSBob3N0IGltcG9ydCBtYXA7IHBsdWdpbiBVSSBidWlsZCBvdXRwdXQgaW1wb3J0cyB0aG9zZSBhcyBob3N0CmV4dGVybmFscy4KCiMjIyBTdHlsZXMKCmBtdXNjYXQoKWAgYXV0b21hdGljYWxseSBsb2FkcyBgdWkvc3R5bGUue2NzcyxzY3NzLHNhc3MsbGVzc31gIChvcgpgdWkvc3R5bGVzLntjc3Msc2NzcyxzYXNzLGxlc3N9YCkgZm9yIGV2ZXJ5IFVJIGVudHJ5LCBwbHVzCmB1aS97ZW50cnl9Lntjc3Msc2NzcyxzYXNzLGxlc3N9YCBmb3IgYSBtYXRjaGluZyBlbnRyeS1zcGVjaWZpYyBzdHlsZXNoZWV0LiBZb3UKZG8gbm90IG5lZWQgdG8gaW1wb3J0IENTUyBmcm9tIGV2ZXJ5IGAudHN4YCBmaWxlLgoKVGhlIHNjYWZmb2xkIHVzZXMgVGFpbHdpbmQncyB0aGVtZS91dGlsaXRpZXMgbGF5ZXJzIG9ubHksIHNvIHBsdWdpbiB1dGlsaXRpZXMKYXJlIGdlbmVyYXRlZCBmcm9tIGZpbGVzIHVuZGVyIGB1aS9gIHdpdGhvdXQgYXBwbHlpbmcgVGFpbHdpbmQgcHJlZmxpZ2h0IHJlc2V0cwp0byB0aGUgaG9zdCBwYWdlLgoKQnVpbHQgQ1NTIHNlbGVjdG9ycyBhcmUgc2NvcGVkIHVuZGVyIHRoZSBjdXJyZW50IHBsdWdpbiBpZAooYFtkYXRhLW11c2NhdC1wbHVnaW4taWQ9Ii4uLiJdYCkuIENTUy1pbi1KUyBsaWJyYXJpZXMgc3VjaCBhcyBFbW90aW9uIHdvcmsKbm9ybWFsbHksIGJ1dCBnbG9iYWwgc3R5bGVzIHNob3VsZCBiZSBzY29wZWQgYnkgdGhlIGF1dGhvci4KCiMjIyMgVGFpbHdpbmQKClRoaXMgdGVtcGxhdGUgZW5hYmxlcyBUYWlsd2luZCBpbiBgdml0ZS5jb25maWcudHNgOgoKYGBgdHMKaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbdGFpbHdpbmRjc3MoKSwgbXVzY2F0KCldLAp9KTsKYGBgCgpUaGUgZGVmYXVsdCBgdWkvc3R5bGUuY3NzYCB1c2VzIFRhaWx3aW5kIHRoZW1lL3V0aWxpdGllcyBvbmx5LCBub3QgcHJlZmxpZ2h0OgoKYGBgY3NzCkBsYXllciB0aGVtZSwgdXRpbGl0aWVzOwoKQGltcG9ydCAidGFpbHdpbmRjc3MvdGhlbWUuY3NzIiBsYXllcih0aGVtZSk7CkBpbXBvcnQgInRhaWx3aW5kY3NzL3V0aWxpdGllcy5jc3MiIGxheWVyKHV0aWxpdGllcyk7CgpAc291cmNlICIuLyoqLyoue3RzLHRzeH0iOwpgYGAKCiMjIyMgU0NTUywgU2FzcywgYW5kIExlc3MKCkluc3RhbGwgdGhlIHByZXByb2Nlc3NvciBwYWNrYWdlLCB0aGVuIGNyZWF0ZSBvbmUgb2YgdGhlIGF1dG8tbG9hZGVkIHN0eWxlIGZpbGVzLgoKYGBgYmFzaApucG0gaSAtRCBzYXNzCmBgYAoKYGBgc2NzcwovKiB1aS9zdHlsZS5zY3NzICovCiRhY2NlbnQ6ICMzYjgyZjY7CgoucGFuZWwgewogIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAkYWNjZW50IDQwJSwgdHJhbnNwYXJlbnQpOwoKICAmX190aXRsZSB7CiAgICBjb2xvcjogJGFjY2VudDsKICB9Cn0KYGBgCgpGb3IgTGVzcywgaW5zdGFsbCBgbGVzc2AgYW5kIHVzZSBgdWkvc3R5bGUubGVzc2AuCgojIyMjIEVtb3Rpb24KCkVtb3Rpb24gZGVwZW5kZW5jaWVzIG1heSBiZSBpbiBgZGVwZW5kZW5jaWVzYCBvciBgZGV2RGVwZW5kZW5jaWVzYDsgVml0ZSBjYW4KYnVuZGxlIHRoZW0gd2hlbiB0aGV5IGFyZSBpbnN0YWxsZWQgYW5kIGltcG9ydGVkIGJ5IHRoZSBwbHVnaW4uCgpGb3IgYHN0eWxlZGAsIG5vIFZpdGUgY29uZmlnIGNoYW5nZSBpcyBuZWVkZWQ6CgpgYGBiYXNoCm5wbSBpIEBlbW90aW9uL3JlYWN0IEBlbW90aW9uL3N0eWxlZApgYGAKCmBgYHRzeAppbXBvcnQgc3R5bGVkIGZyb20gIkBlbW90aW9uL3N0eWxlZCI7Cgpjb25zdCBQYW5lbCA9IHN0eWxlZC5kaXYoewogIGRpc3BsYXk6ICJncmlkIiwKICBnYXA6IDEyLAp9KTsKYGBgCgpGb3IgRW1vdGlvbidzIGBjc3NgIHByb3AsIHBhc3MgUmVhY3QgcGx1Z2luIG9wdGlvbnMgdGhyb3VnaCBgbXVzY2F0KClgIGFuZCBhZGQKYGpzeEltcG9ydFNvdXJjZWAgdG8gYHRzY29uZmlnLmpzb25gOgoKYGBgYmFzaApucG0gaSBAZW1vdGlvbi9yZWFjdCBAZW1vdGlvbi9zdHlsZWQKbnBtIGkgLUQgQGVtb3Rpb24vYmFiZWwtcGx1Z2luCmBgYAoKYGBgdHMKLy8gdml0ZS5jb25maWcudHMKaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbCiAgICB0YWlsd2luZGNzcygpLAogICAgbXVzY2F0KHsKICAgICAgcmVhY3Q6IHsKICAgICAgICBqc3hJbXBvcnRTb3VyY2U6ICJAZW1vdGlvbi9yZWFjdCIsCiAgICAgICAgYmFiZWw6IHsKICAgICAgICAgIHBsdWdpbnM6IFsiQGVtb3Rpb24vYmFiZWwtcGx1Z2luIl0sCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0pLAogIF0sCn0pOwpgYGAKCmBgYGpzb24KewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAianN4SW1wb3J0U291cmNlIjogIkBlbW90aW9uL3JlYWN0IgogIH0KfQpgYGAKCkVtb3Rpb24gYEdsb2JhbGAgd3JpdGVzIGdsb2JhbCBDU1MgYXQgcnVudGltZSwgc28gc2NvcGUgaXQgbWFudWFsbHkgb3IgYXZvaWQgaXQKaW5zaWRlIHBsdWdpbnMuCgojIyMgdXNlUmIoKSBob29rCgpBY2Nlc3MgdGhlIGNvbW11bmljYXRpb24gQVBJIGJldHdlZW4gdGhlIHBsdWdpbiBtb2R1bGUgYW5kIFVJIGZyb20gYW55IHBsdWdpbiBjb21wb25lbnQuCgpgYGB0c3gKaW1wb3J0IHsgdXNlUmIgfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvc2RrIjsKCmZ1bmN0aW9uIEFwcCgpIHsKICBjb25zdCByYiA9IHVzZVJiKCk7Cn0KYGBgCgojIyMgcmIgQVBJCgp8IE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGByYi5wdWIodG9waWMsIHBheWxvYWQpYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB1Ymxpc2ggYSBtZXNzYWdlIHRvIGEgdG9waWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGByYi5zdWIodG9waWMsIGhhbmRsZXIpYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1YnNjcmliZSB0byBhIHRvcGljIOKAlCByZXR1cm5zIGB7IHVuZGVjbGFyZSgpIH1gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLmFjdGlvbih0b3BpYywgcGF5bG9hZD8pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VuZCBhIHJlcXVlc3QgYW5kIGF3YWl0IGEgcmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnNlcnZlKHRvcGljLCBoYW5kbGVyKWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSGFuZGxlIGluY29taW5nIHJlcXVlc3RzIGZyb20gdGhlIGJhY2tlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnRvYXN0KHsgdGl0bGU/LCBtZXNzYWdlLCB0eXBlPywgYWN0aW9uTGFiZWw/LCBoYW5kbGVBY3Rpb25DbGljaz8sIGNsb3NlT25BY3Rpb25DbGljaz8sIGR1cmF0aW9uPywgb25DbG9zZT8gfSlgIHwgU2hvdyBhIGhvc3QgdG9hc3Qgbm90aWZpY2F0aW9uLiBgbWVzc2FnZWAgYWNjZXB0cyBhIHN0cmluZyBvciBgUmVhY3RFbGVtZW50YC4gYHR5cGVgIGNhbiBiZSBgImluZm8iYCwgYCJkYW5nZXIiYCwgYCJ3YXJuaW5nImAsIGAiY2F1dGlvbiJgLCBvciBgInN1Y2Nlc3MiYCB8CnwgYHJiLmFsZXJ0KHsgdGl0bGU/LCBtZXNzYWdlLCBidXR0b25UZXh0PyB9KWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgYWxlcnQgZGlhbG9nLiBSZXNvbHZlcyB3aGVuIHRoZSBkaWFsb2cgaXMgY2xvc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLmNvbmZpcm0oeyB0aXRsZT8sIG1lc3NhZ2UsIGJ1dHRvblRleHQ/IH0pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgY29uZmlybWF0aW9uIGRpYWxvZy4gYGJ1dHRvblRleHRgIGFjY2VwdHMgYHsgeWVzLCBubyB9YC4gUmVzb2x2ZXMgdG8gYHRydWVgIG9yIGBmYWxzZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnByb21wdCh7IHRpdGxlPywgbWVzc2FnZSwgdmFsdWU/LCBwbGFjZWhvbGRlcj8sIGJ1dHRvblRleHQ/IH0pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgcHJvbXB0IGRpYWxvZy4gYGJ1dHRvblRleHRgIGFjY2VwdHMgYHsgeWVzLCBubyB9YC4gUmVzb2x2ZXMgdG8gdGhlIGVudGVyZWQgc3RyaW5nIG9yIGB1bmRlZmluZWRgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgpUb3BpYyBuYW1lcyBwYXNzZWQgdG8gYHB1YmAsIGBzdWJgLCBgYWN0aW9uYCwgYW5kIGBzZXJ2ZWAgYXJlIGlzb2xhdGVkIHBlciBwbHVnaW4uCgoKQWxsIG1ldGhvZHMgc3VwcG9ydCBHZW5lcmljIFR5cGVzOgoKYGBgdHN4CmNvbnN0IHN0YXR1cyA9IGF3YWl0IHJiLmFjdGlvbjx7IG9rOiBib29sZWFuIH0sIHsgaWQ6IG51bWJlciB9PigKICAiZ2V0LXN0YXR1cyIsCiAgeyBpZDogMSB9LAopOwoKY29uc3Qgc3ViID0gYXdhaXQgcmIuc3ViPHsgdmFsdWU6IG51bWJlciB9Pigic2Vuc29yL2RhdGEiLCAoZGF0YSkgPT4gewogIGNvbnNvbGUubG9nKGRhdGEudmFsdWUpOwp9KTsKc3ViLnVuZGVjbGFyZSgpOyAvLyBjbGVhbnVwCgpjb25zdCBvayA9IGF3YWl0IHJiLmNvbmZpcm0oewogIHRpdGxlOiAiUnVuIiwKICBtZXNzYWdlOiAiU3RhcnQgdGhlIGJhY2tlbmQgYWN0aW9uPyIsCn0pOwppZiAob2spIHsKICBhd2FpdCByYi5hY3Rpb24oInJ1biIpOwp9CmBgYAoKIyMjIFNhdmluZyBhbmQgcmVzdG9yaW5nIGZvcm0gZGF0YSAoYHVzZVJiRm9ybURhdGFgIC8gYHVzZVJiU2F2ZWApCgpJZiB0aGUgaG9zdCBlbWJlZHMgeW91ciBwbHVnaW4gaW4gYSBmb3JtIGl0IG93bnMgKGUuZy4gYSBwcm9ncmFtIHN0ZXAgZWRpdG9yCndpdGggaXRzIG93biBTYXZlIGJ1dHRvbiksIGl0IGNhbiBoYW5kIHlvdXIgcGx1Z2luIHByZXZpb3VzbHktc2F2ZWQgdmFsdWVzIGFuZApwdWxsIHRoZSBjdXJyZW50IHZhbHVlcyBiYWNrIG91dCB3aGVuIHRoZSB1c2VyIHNhdmVzLiBUaGUgaG9zdCDigJQgbm90IHRoZQpwbHVnaW4g4oCUIHBlcnNpc3RzIHRoZSBkYXRhIChJbmRleGVkREIsIGJhY2tlbmQsIGV0Yy4pLgoKYGBgdHN4CmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAicmVhY3QiOwppbXBvcnQgeyB1c2VSYkZvcm1EYXRhLCB1c2VSYlNhdmUgfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3QiOwoKdHlwZSBHcmlwQXJncyA9IHsgdGFyZ2V0TmFtZTogc3RyaW5nOyB3aWR0aDogbnVtYmVyIH07CmNvbnN0IERFRkFVTFRTOiBHcmlwQXJncyA9IHsgdGFyZ2V0TmFtZTogIiIsIHdpZHRoOiAyMCB9OwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkgewogIC8vIFByZXZpb3VzbHktc2F2ZWQgdmFsdWVzLCBvciB1bmRlZmluZWQgZm9yIGEgYnJhbmQtbmV3IGluc3RhbmNlLgogIGNvbnN0IHNhdmVkID0gdXNlUmJGb3JtRGF0YTxHcmlwQXJncz4oKTsKICBjb25zdCBbYXJncywgc2V0QXJnc10gPSB1c2VTdGF0ZTxHcmlwQXJncz4oeyAuLi5ERUZBVUxUUywgLi4uc2F2ZWQgfSk7CgogIC8vIFJlZ2lzdGVycyBhIGdldHRlciB0aGUgaG9zdCBjYWxscyB3aGVuIGl0cyBTYXZlIGJ1dHRvbiBpcyBjbGlja2VkLgogIC8vIEFsd2F5cyByZXR1cm5zIHRoZSBDVVJSRU5UIHZhbHVlcyDigJQgcmUtcmVnaXN0ZXJpbmcgb24gZXZlcnkgcmVuZGVyIGtlZXBzCiAgLy8gdGhlIGNsb3N1cmUgZnJlc2gsIHdoaWNoIHVzZVJiU2F2ZSBhbHJlYWR5IGhhbmRsZXMgZm9yIHlvdS4KICB1c2VSYlNhdmUoKCkgPT4gKHsKICAgIGFyZ3MsCiAgICBzdW1tYXJ5OiBgJHthcmdzLnRhcmdldE5hbWUgfHwgInRhcmdldCJ9IMK3ICR7YXJncy53aWR0aH1tbWAsCiAgfSkpOwoKICByZXR1cm4gKC8qIC4uLmZvcm0gVUkgcmVhZGluZy93cml0aW5nIGBhcmdzYC4uLiAqLyk7Cn0KYGBgCgpUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBgdXNlUmJTYXZlYCBtdXN0IGJlIEpTT04tc2VyaWFsaXNhYmxlIOKAlCB0aGUgaG9zdApwZXJzaXN0cyBpdCBhcy1pcy4gTm90IGV2ZXJ5IGhvc3QgZW1iZWRzIHBsdWdpbnMgaW4gYSBzYXZlL3Jlc3RvcmUgZm9ybTsgaWYKeW91cnMgZG9lc24ndCwgeW91IGNhbiBza2lwIHRoZXNlIGhvb2tzIGVudGlyZWx5LgoKIyMjIFVJIGNvbXBvbmVudHMKCkltcG9ydCBNdXNjYXQgY29tcG9uZW50cyBmcm9tIGBAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3RgIGFuZCBleHBvcnQgYQpSZWFjdCBjb21wb25lbnQgYXMgdGhlIGRlZmF1bHQgZXhwb3J0LiBUaGUgaG9zdCBtb3VudHMgdGhhdCBjb21wb25lbnQgZGlyZWN0bHkKYW5kIHByb3ZpZGVzIGB1c2VSYigpYCB0aHJvdWdoIGNvbnRleHQuCgpgYGB0c3gKaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB7IFJCTGFiZWxCdXR0b24sIFJCU2xpZGVyLCBSQlN3aXRjaCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aS9yZWFjdCI7CmltcG9ydCB7IHVzZVJiIH0gZnJvbSAiQHJhaW5ib3ctcm9ib3RpY3MvcGx1Z2luLXVpL3NkayI7CgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7CiAgY29uc3QgcmIgPSB1c2VSYigpOwogIGNvbnN0IFt3aWR0aCwgc2V0V2lkdGhdID0gdXNlU3RhdGUoMjApOwogIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IHVzZVN0YXRlKHRydWUpOwoKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZmxleC1jb2wgZ2FwLTQiPgogICAgICA8UkJTbGlkZXIKICAgICAgICB2YWx1ZT17W3dpZHRoXX0KICAgICAgICBtaW49ezB9CiAgICAgICAgbWF4PXsxMDB9CiAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlczogbnVtYmVyW10pID0+IHNldFdpZHRoKHZhbHVlc1swXSA/PyAwKX0KICAgICAgLz4KICAgICAgPFJCU3dpdGNoIGNoZWNrZWQ9e2VuYWJsZWR9IG9uQ2hlY2tlZENoYW5nZT17c2V0RW5hYmxlZH0gLz4KICAgICAgPFJCTGFiZWxCdXR0b24KICAgICAgICBkaXNhYmxlZD17IWVuYWJsZWR9CiAgICAgICAgb25DbGljaz17KCkgPT4gcmIuYWN0aW9uKCJncmlwIiwgeyB3aWR0aCB9KX0KICAgICAgPgogICAgICAgIEdyaXAKICAgICAgPC9SQkxhYmVsQnV0dG9uPgogICAgPC9kaXY+CiAgKTsKfQpgYGAKCi0tLQoKIyMgRGV2ZWxvcGluZyBkaXJlY3RseSBvbiB0aGUgcm9ib3QgUEMKCklmIHlvdSdyZSBydW5uaW5nIGBtdXNjYXQtcGsgZGV2YCAqKm9uIHRoZSByb2JvdCBQQyBpdHNlbGYqKiwgTXVzY2F0IGlzIGxpa2VseSBhbHJlYWR5CnJ1bm5pbmcgaXRzIG93biBTb2NrZXQuSU8gYnJpZGdlIG9uIHBvcnQgMTAwMDAuIEluIHRoYXQgY2FzZSB0aGUgQ0xJIGRldGVjdHMgdGhlIHBvcnQKY29uZmxpY3QgYW5kIGFza3M6CgpgYGAK4pqgIHBvcnQgMTAwMDAgaXMgYWxyZWFkeSBpbiB1c2Ug4oCUIGNhbid0IHN0YXJ0IFNvY2tldC5JTyBicmlkZ2UuCiAgUHJvY2VlZCB3aXRob3V0IFNvY2tldC5JTyBicmlkZ2U/IFt5L05dOgpgYGAKCkFuc3dlciAqKnkqKi4gWW91ciBwbHVnaW4gYmFja2VuZCB3aWxsIGNvbm5lY3QgdG8gdGhlIE11c2NhdCBicmlkZ2UgdGhhdCdzIGFscmVhZHkKcnVubmluZyBpbnN0ZWFkIG9mIHN0YXJ0aW5nIGEgbmV3IG9uZSDigJQgZXhhY3RseSB3aGF0IHlvdSB3YW50IHdoZW4gZGV2ZWxvcGluZyBvbiB0aGUKcm9ib3QuCgo+IElmIHlvdSBhbnN3ZXIgKipuKiogKG9yIGp1c3QgcHJlc3MgRW50ZXIpLCB0aGUgQ0xJIGV4aXRzIHNvIHlvdSBjYW4gZnJlZSB0aGUgcG9ydAo+IG1hbnVhbGx5IGFuZCByZXRyeS4KCi0tLQoKIyMgQmFja2VuZCBydW50aW1lcwoKYG1hbmlmZXN0Lmpzb25gIGNob29zZXMgb25lIGJhY2tlbmQgcnVudGltZS4gYG11c2NhdC1wayBkZXZgIHJ1bnMgYmFja2VuZCBjb2RlIGluCmEgRG9ja2VyIGNvbnRhaW5lciBtYXRjaGluZyB0aGUgcm9ib3QgZW52aXJvbm1lbnQuIEJhY2tlbmQgY29kZSBzaG91bGQgY29udGFpbgpwbHVnaW4gbG9naWMgb25seTsgaXQgc2hvdWxkIG5vdCBzdGFydCB0aGUgTXVzY2F0IGJyaWRnZSBvciBpdHMgb3duIGNvcHkgb2YgdGhlCnBsdWdpbiBnYXRld2F5LgoKIyMjIFdoaWNoIGJhY2tlbmQgcGF0dGVybj8gKGRlcGVuZHMgb24gdGhlIGNvbnRyaWJ1dGlvbiBwb2ludCkKCioqSG93IHlvdSBjb250cm9sIHRoZSByb2JvdCBkZXBlbmRzIG9uIHdoYXQgeW91ciBwbHVnaW4gY29udHJpYnV0ZXMqKiAoc2VlCmBtYW5pZmVzdC5qc29uYCDihpIgYGNvbnRyaWJ1dGVzW10ucG9pbnRgKS4gRG9uJ3QgbWl4IHRoZXNlIHVwOgoKfCBDb250cmlidXRpb24gcG9pbnQgfCBXaGF0IGl0IGlzIHwgQmFja2VuZCBwYXR0ZXJuIHwKfCAtLS0gfCAtLS0gfCAtLS0gfAp8IGBwcm9ncmFtLnBhbmVsYCAod2l0aCBgY29tbWFuZEluZm9gKSB8IERlZmluZXMgYSAqKmN1c3RvbSBjb21tYW5kKiogdGhlIHBsdWdpbiBhZGRzIHRvIHRoZSBQcm9ncmFtIHBhZ2UncyBydWxlLWJhc2VkIHNlcXVlbmNlIGJ1aWxkZXIuIFRoZSBvcGVyYXRvciBwbGFjZXMgaXQgaW50byB0aGUgcHJvZ3JhbSB0cmVlIGxpa2UgYW55IGJ1aWx0LWluIGNvbW1hbmQgKE1vdmUgSiwgUG9pbnQsIFdhaXQsIOKApik7IGl0IHJ1bnMgd2hlbiB0aGUgcHJvZ3JhbSByZWFjaGVzIHRoYXQgc3RlcC4gfCAqKmBQbHVnaW5Qcm9ncmFtQ29udGV4dGAqKiDigJQgaW50ZWdyYXRlZCB3aXRoIHRoZSBwcm9ncmFtJ3Mgc3RvcC9wYXVzZSBhbmQgdmFyaWFibGVzLiBTZWUgX1Byb2dyYW0gY29tbWFuZCBiYWNrZW5kXyBiZWxvdy4gfAp8IGB0b29sYmFyYCAvIGBsbmJgIC8gYG1vdmUucGFuZWxgIHwgQSBsaXZlIFVJIHBhbmVsL3BvcG92ZXIgdGhlIG9wZXJhdG9yIGludGVyYWN0cyB3aXRoIGRpcmVjdGx5IHwgQ2FsbCB0aGUgcm9ib3QgKipTREsgZGlyZWN0bHkqKiAoYFJCTWFuaXB1bGF0ZVNES2AsIGBSQkFtclNES2ApIGZyb20gYHB5L21haW4ucHlgLCBvciBgcmIuYWN0aW9uKC4uLilgIOKGkiB5b3VyIGJhY2tlbmQg4oaSIFNESy4gKipOb3QqKiBhIHByb2dyYW0gc3RlcCDigJQgdGhlcmUgaXMgbm8gc3RvcC9wYXVzZS92YXJpYWJsZSBjb250ZXh0LiB8CgpSdWxlIG9mIHRodW1iOiB1c2UgYFBsdWdpblByb2dyYW1Db250ZXh0YCAqKm9ubHkqKiBmb3IgYSBgcHJvZ3JhbS5wYW5lbGAgY29tbWFuZAp0aGF0IHJ1bnMgYXMgcGFydCBvZiBhIHByb2dyYW0uIFRvIG1vdmUgdGhlIHJvYm90IGxpdmUgZnJvbSBhIHRvb2xiYXIvbW92ZSBwYW5lbCwKdXNlIHRoZSBTREsg4oCUIGEgcHJvZ3JhbS1zdGVwIGNvbnRleHQgZG9lcyBub3QgYXBwbHkuCgojIyMgRnJvbnRlbmQtb25seSAoYG5vbmVgKQoKVXNlIHRoaXMgd2hlbiB0aGUgcGx1Z2luIG9ubHkgaGFzIFVJIGFuZCBjYWxscyBob3N0IHNlcnZpY2VzOgoKYGBganNvbgp7ICJydW50aW1lIjogeyAidHlwZSI6ICJub25lIiB9IH0KYGBgCgojIyMgUHl0aG9uCgpQeXRob24gcGx1Z2lucyB1c2UgYHB5L21haW4ucHlgIGFuZCBjYW4gY29tbXVuaWNhdGUgd2l0aCB0aGUgVUkgdGhyb3VnaApgcmFpbmJvdy5yYl9zZGsuUkJQbHVnaW5DYWxsYC4KCmBgYHB5dGhvbgppbXBvcnQgdGltZQpmcm9tIHJhaW5ib3cucmJfc2RrIGltcG9ydCBSQkFtclNESywgUkJNYW5pcHVsYXRlU0RLLCBSQlBsdWdpbkNhbGwKCnBsdWdpbiA9IFJCUGx1Z2luQ2FsbCgpCgoKcGx1Z2luLnB1Ymxpc2goInN0YXRlIiwgeyJyZWFkeSI6IFRydWV9KQoKCkBwbHVnaW4uc3Vic2NyaWJlKCJldmVudCIpCmRlZiBvbl91aV9ldmVudChwYXlsb2FkPU5vbmUpOgogICAgcHJpbnQocGF5bG9hZCkKCgpAcGx1Z2luLnNlcnZlKCJ0b29sL2VjaG8iKQpkZWYgZWNobyhwYXlsb2FkPU5vbmUpOgogICAgcmV0dXJuIHsiZWNobyI6IHBheWxvYWR9CgoKZGVmIGNhbGxfZnJvbnRlbmQoKToKICAgIHJlcyA9IHBsdWdpbi5jYWxsKCJ0b29sL3BpbmciLCBwYXlsb2FkPXsiaGVsbG8iOiAicGx1Z2luIn0pCiAgICBwcmludChyZXMpCgoKZGVmIG1vdmVfal9leGFtcGxlKCk6CiAgICBhbXIgPSBSQkFtclNESygpCiAgICBtYW5pcHVsYXRlID0gUkJNYW5pcHVsYXRlU0RLKCkKICAgIHJldHVybiBtYW5pcHVsYXRlLm1vdmUuY2FsbF9tb3ZlX2ooCiAgICAgICAgcm9ib3RfbW9kZWw9IkM1MDA5MjAiLAogICAgICAgIHRhcmdldD17InRhcl92YWx1ZXMiOiBbMCwgMCwgMCwgMCwgMCwgMF0sICJ0YXJfZnJhbWUiOiAwLCAidGFyX3VuaXQiOiAwfSwKICAgICkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICB0aW1lLnNsZWVwKDEpCmBgYAoKIyMjIyBQcm9ncmFtIGNvbW1hbmQgYmFja2VuZCAoYHByb2dyYW0ucGFuZWxgKQoKQSBgcHJvZ3JhbS5wYW5lbGAgY29udHJpYnV0aW9uIGRlZmluZXMgYSAqKmN1c3RvbSBjb21tYW5kKiogeW91ciBwbHVnaW4gYWRkcyB0bwp0aGUgTXVzY2F0ICoqUHJvZ3JhbSBwYWdlKiosIHdoZXJlIHRoZSBvcGVyYXRvciBidWlsZHMgYSByb2JvdCBwcm9ncmFtIGFzIGEKcnVsZS1iYXNlZCBzZXF1ZW5jZSAoYSBwcm9ncmFtIHRyZWUpLiBZb3VyIGNvbW1hbmQgYXBwZWFycyBhbG9uZ3NpZGUgdGhlCmJ1aWx0LWlucyAoTW92ZSBKLCBQb2ludCwgV2FpdCwg4oCmKTsgdGhlIG9wZXJhdG9yIHBsYWNlcyBpdCBpbnRvIHRoZSB0cmVlLCBhbmQKZWFjaCB0aW1lIHRoZSBwcm9ncmFtIGV4ZWN1dGVzIHRoYXQgc3RlcCB0aGUgaG9zdCBjYWxscyB5b3VyIGJhY2tlbmQgdGhyb3VnaApgUGx1Z2luUHJvZ3JhbUNvbnRleHRgIOKAlCByZWNlaXZpbmcgdGhlIHN0ZXAgYXJncywgY2hlY2tpbmcgZm9yIHN0b3AvcGF1c2UsCnJlYWRpbmcvd3JpdGluZyBwcm9ncmFtIHZhcmlhYmxlcywgYW5kIHNpZ25hbGxpbmcgY29tcGxldGlvbi4gVGhpcyBwYXR0ZXJuIGlzCioqb25seSoqIGZvciBgcHJvZ3JhbS5wYW5lbGA7IGEgdG9vbGJhci9tb3ZlLXBhbmVsIHBsdWdpbiB1c2VzIHRoZSBTREsgZGlyZWN0bHkKaW5zdGVhZCAoc2VlIHRoZSB0YWJsZSBhYm92ZSkuCgpgYGBweXRob24KIiIiClBsdWdpbiBiYWNrZW5kIG1haW4ucHkgZXhhbXBsZSAocHJvZ3JhbS5wYW5lbCBjb21tYW5kKS4KCm1hbmlmZXN0Lmpzb246CiAgInJ1bnRpbWUiOiB7InR5cGUiOiAicHl0aG9uIiwgImVudHJ5IjogIm1haW4ucHkifSwKICAiY29udHJpYnV0ZXMiOiBbewogICAgInBvaW50IjogInByb2dyYW0ucGFuZWwiLAogICAgInVpIjogInByb2dyYW0iLAogICAgImxhYmVsIjogeyJlbiI6ICJNeSBQbHVnaW4gU3RlcCJ9LAogICAgImNvbW1hbmRJbmZvIjogewogICAgICAibmFtZSI6ICJNeSBQbHVnaW4gU3RlcCIsCiAgICAgICJpY29uIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgICAgICJmdW5jTmFtZSI6ICJyYl9wcm9ncmFtX3Nkay5wbHVnaW5fZXhlY3V0ZSIsCiAgICAgICJhcmdzIjogeyJtZXNzYWdlIjogImhlbGxvIn0gICAjIHBsdWdpbi1hdXRob3ItZGVmaW5lZCBhcmdzCiAgICB9CiAgfV0KClRoZSBob3N0IGludm9rZXMgY29tbWFuZEluZm8uZnVuY05hbWUgKHJiX3Byb2dyYW1fc2RrLnBsdWdpbl9leGVjdXRlKSB3aXRoCmFyZ3MucGx1Z2luX2lkICsgeW91ciBhcmdzIHdoZW4gdGhlIHByb2dyYW0gcmVhY2hlcyB0aGlzIHN0ZXAuCiIiIgppbXBvcnQgYXN5bmNpbwpmcm9tIHJhaW5ib3cucmJfc2RrIGltcG9ydCBQbHVnaW5Qcm9ncmFtQ29udGV4dAoKY3R4ID0gUGx1Z2luUHJvZ3JhbUNvbnRleHQocGx1Z2luX2lkPSJteS1wbHVnaW4iKQoKCkBjdHgub25fZXhlY3V0ZQphc3luYyBkZWYgaGFuZGxlKGFyZ3M6IGRpY3QpIC0+IE5vbmU6CiAgICBtZXNzYWdlID0gYXJncy5nZXQoIm1lc3NhZ2UiLCAiIikKICAgIHByaW50KGYiW215LXBsdWdpbl0gZXhlY3V0ZSBjYWxsZWQ6IG1lc3NhZ2U9e21lc3NhZ2V9IiwgZmx1c2g9VHJ1ZSkKCiAgICAjIGNoZWNrIHN0b3AvcGF1c2UgZHVyaW5nIGxvbmctcnVubmluZyB3b3JrCiAgICBmb3IgXyBpbiByYW5nZSgxMCk6CiAgICAgICAgYXdhaXQgY3R4LmNoZWNrX3N0b3AoKQogICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4xKQoKICAgICMgcmVhZCBhIHByb2dyYW0gdmFyaWFibGUKICAgIGNvdW50ZXIgPSBhd2FpdCBjdHguZ2V0X3ZhcmlhYmxlKCJjb3VudGVyIikKICAgIHByaW50KGYiW215LXBsdWdpbl0gY291bnRlcj17Y291bnRlcn0iLCBmbHVzaD1UcnVlKQoKICAgICMgdXBkYXRlIGEgdmFyaWFibGUKICAgIGF3YWl0IGN0eC5zZXRfdmFyaWFibGUoInJlc3VsdCIsIGYiZG9uZToge21lc3NhZ2V9IikKCiAgICAjIGZpbmlzaCB0aGUgc3RlcAogICAgYXdhaXQgY3R4LmRvbmUoKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBhc3luY2lvLnJ1bihjdHguc3RhcnQoKSkKYGBgCgojIyMgQysrCgpDKysgcGx1Z2lucyB1c2UgYGNwcC9gIGFuZCBhcmUgYnVpbHQgd2l0aCBDTWFrZSBpbnNpZGUgRG9ja2VyLiBUaGUgY3VycmVudCBDKysKdGVtcGxhdGUgaXMgYSBidWlsZC9ydW4gc2tlbGV0b247IHdpcmUgaXQgdG8gdGhlIHBsdWdpbiBnYXRld2F5IHdoZW4gdGhlIEMrKyBTREsKaXMgYXZhaWxhYmxlLgoKYGBgY3BwCiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0aHJlYWQ+CgppbnQgbWFpbigpIHsKICBjb25zdCBjaGFyKiBwbHVnaW5faWQgPSBzdGQ6OmdldGVudigiUkJfUExVR0lOX0lEIik7CiAgc3RkOjpjb3V0IDw8ICJbX19QTFVHSU5fTkFNRV9fXSBiYWNrZW5kIHJlYWR5IgogICAgICAgICAgICA8PCAocGx1Z2luX2lkID8gc3RkOjpzdHJpbmcoIiAoaWQ9IikgKyBwbHVnaW5faWQgKyAiKSIgOiAiIikKICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICB3aGlsZSAodHJ1ZSkgewogICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKICB9CiAgcmV0dXJuIDA7Cn0KYGBgCgojIyMgUk9TMiAocmNscHkpCgpST1MyIFB5dGhvbiBwbHVnaW5zIHVzZSBgcm9zMl93cy9gIHdpdGggYHJ1bnRpbWUucm9zQ2xpZW50OiAicmNscHkiYC4gVGhlIG5vZGUKaXMgbGF1bmNoZWQgd2l0aCBgLS1yb3MtYXJncyAtciBfX25zOj0ve3NsdWd9YCBhdXRvbWF0aWNhbGx5IGJ5IGBkZXY6YmFja2AuCgpgYGBweXRob24KIyByb3MyX3dzL3NyYy9fX1BMVUdJTl9TTFVHX18vX19QTFVHSU5fU0xVR19fL25vZGUucHkKaW1wb3J0IHJjbHB5CmZyb20gcmNscHkubm9kZSBpbXBvcnQgTm9kZQpmcm9tIHJhaW5ib3cucmJfc2RrIGltcG9ydCBSQk1hbmlwdWxhdGVTREsKCnNkayA9IFJCTWFuaXB1bGF0ZVNESygpCgoKY2xhc3MgX19QTFVHSU5fQ0xBU1NfX05vZGUoTm9kZSk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygiX19QTFVHSU5fU0xVR19fX25vZGUiKQogICAgICAgIHNlbGYuZ2V0X2xvZ2dlcigpLmluZm8oIl9fUExVR0lOX05BTUVfXyBub2RlIHN0YXJ0ZWQiKQogICAgICAgICMgdXNlIHNkayBhbG9uZ3NpZGUgUk9TMiBwdWJsaXNoZXJzL3N1YnNjcmliZXJzL3NlcnZpY2VzIGFzIG5lZWRlZApgYGAKCiMjIyBST1MyIChyY2xjcHApCgpST1MyIEMrKyBwbHVnaW5zIHVzZSBgcm9zMl93cy9gIHdpdGggYHJ1bnRpbWUucm9zQ2xpZW50OiAicmNsY3BwImAuCgpgYGBjcHAKI2luY2x1ZGUgInJjbGNwcC9yY2xjcHAuaHBwIgoKY2xhc3MgX19QTFVHSU5fQ0xBU1NfX05vZGUgOiBwdWJsaWMgcmNsY3BwOjpOb2RlIHsKcHVibGljOgogIF9fUExVR0lOX0NMQVNTX19Ob2RlKCkgOiBOb2RlKCJfX1BMVUdJTl9TTFVHX19fbm9kZSIpIHsKICAgIFJDTENQUF9JTkZPKHRoaXMtPmdldF9sb2dnZXIoKSwgIl9fUExVR0lOX05BTUVfXyBub2RlIHN0YXJ0ZWQiKTsKICB9Cn07CmBgYAoKLS0tCgojIyBtYW5pZmVzdC5qc29uCgpgYGBqc29uYwp7CiAgLy8gdW5pcXVlIHBsdWdpbiBJRCDigJQgcmV2ZXJzZS1kb21haW4gZm9ybWF0IHJlY29tbWVuZGVkCiAgImlkIjogImNvbS5leGFtcGxlLm15LXBsdWdpbiIsCiAgIm5hbWUiOiAiTXkgUGx1Z2luIiwKICAidmVyc2lvbiI6ICIxLjAuMCIsCgogIC8vIG1pbmltdW0gTXVzY2F0IHZlcnNpb24gcmVxdWlyZWQgdG8gbG9hZCB0aGlzIHBsdWdpbgogICJtaW5NdXNjYXRWZXJzaW9uIjogIjEuMC4wIiwKCiAgLy8gcGx1Z2luIGF1dGhvciAoZW1wdHkgc3RyaW5nIGlzIGZpbmUpCiAgImF1dGhvciI6ICJZb3VyIE5hbWUiLAoKICAvLyBkaXNwbGF5ZWQgaW4gdGhlIE11c2NhdCBwbHVnaW4gc3RvcmUgLyBpbmZvIHBhbmVsCiAgLy8gc3RyaW5nIG9yIHsgZW4gKHJlcXVpcmVkKSwga28sIGphLCB6aCwgdmksIHRoLCBlcyB9CiAgImRlc2NyaXB0aW9uIjogeyAiZW4iOiAiUGx1Z2luIGRlc2NyaXB0aW9uIiwgImtvIjogIu2UjOufrOq3uOyduCDshKTrqoUiIH0sCgogIC8vIFNWRyBzdHJpbmcgKHNpbmdsZSBmaWxlKSBvciBQTkcvSlBHIHNpemUgbWFwIChhbGwgdGhyZWUgc2l6ZXMgcmVxdWlyZWQpCiAgImljb25zIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgLy8gImljb25zIjogeyAiMTYiOiAiYXNzZXRzL2ljb24tMTYucG5nIiwgIjQ4IjogImFzc2V0cy9pY29uLTQ4LnBuZyIsICIxMjgiOiAiYXNzZXRzL2ljb24tMTI4LnBuZyIgfSwKCiAgLy8gdGFyZ2V0TW9kZWxzIGFuZC9vciB0YXJnZXRDYXRlZ29yeXMg4oCUIGF0IGxlYXN0IG9uZSBpcyByZXF1aXJlZAogIC8vICJhbGwiID0gZXZlcnkgdGFyZ2V0LCBvciBsaXN0IHNwZWNpZmljIHZhbHVlcwogICJ0YXJnZXRNb2RlbHMiOiAiYWxsIiwKICAvLyAidGFyZ2V0TW9kZWxzIjogWyJDNTAwOTIwIiwgIkM1MDA5MzAiXSwKICAidGFyZ2V0Q2F0ZWdvcnlzIjogImFsbCIsCiAgLy8gInRhcmdldENhdGVnb3J5cyI6IFsibWFuaXB1bGF0ZSIsICJhbXIiLCAicmJ5MSIsICJ2aXNpb24iXSwKCiAgImNvbnRyaWJ1dGVzIjogWwogICAgLy8gcHJvZ3JhbS5wYW5lbCDigJQgZGVmaW5lcyBhIGN1c3RvbSBjb21tYW5kIGZvciB0aGUgUHJvZ3JhbSBwYWdlIHNlcXVlbmNlCiAgICAvLyAgIGJ1aWxkZXI7IHJ1bnMgdmlhIFBsdWdpblByb2dyYW1Db250ZXh0IHdoZW4gdGhlIHByb2dyYW0gcmVhY2hlcyBpdAogICAgewogICAgICAicG9pbnQiOiAicHJvZ3JhbS5wYW5lbCIsCiAgICAgICJpY29uIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgICAgICJsYWJlbCI6IHsgImtvIjogIuuCtCDtlIzrn6zqt7jsnbgiLCAiZW4iOiAiTXkgUGx1Z2luIiB9LAogICAgICAidWkiOiAicHJvZ3JhbSIsICAgICAgICAgICAvLyBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIGNvbnRyaWJ1dGlvbnMKICAgICAgImNvbW1hbmRJbmZvIjogewogICAgICAgICJuYW1lIjogIk15IFBsdWdpbiIsCiAgICAgICAgImljb24iOiAiYXNzZXRzL2ljb24uc3ZnIiwKICAgICAgICAiZnVuY05hbWUiOiAicmJfcHJvZ3JhbV9zZGsucGx1Z2luX2V4ZWN1dGUiLAogICAgICAgICJhcmdzIjoge30KICAgICAgfQogICAgfSwKICAgIC8vIHRvb2xiYXIg4oCUIGFkZHMgYSBidXR0b24gdG8gdGhlIHRvcCB0b29sYmFyIChyZXF1aXJlZCkKICAgIHsKICAgICAgInBvaW50IjogInRvb2xiYXIiLAogICAgICAiaWNvbiI6ICJhc3NldHMvaWNvbi5zdmciLAogICAgICAibGFiZWwiOiB7ICJrbyI6ICLrgrQg7ZSM65+s6re47J24IiwgImVuIjogIk15IFBsdWdpbiIgfSwKICAgICAgInVpIjogImNvbnRlbnQiLCAgICAgICAgICAgLy8gbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBjb250cmlidXRpb25zCiAgICAgICJvcGVucyI6ICJwb3BvdmVyIiAgICAgICAgIC8vIHBvcG92ZXIgfCBwYW5lbCB8IHBhZ2UKICAgIH0sCiAgICAvLyBtb3ZlLnBhbmVsIOKAlCBhZGRzIGEgcGFuZWwgdG8gdGhlIE1vdmUgc2NyZWVuCiAgICB7CiAgICAgICJwb2ludCI6ICJtb3ZlLnBhbmVsIiwKICAgICAgImljb24iOiAiYXNzZXRzL2ljb24uc3ZnIiwKICAgICAgImxhYmVsIjogeyAia28iOiAi64K0IO2UjOufrOq3uOyduCIsICJlbiI6ICJNeSBQbHVnaW4iIH0sCiAgICAgICJ1aSI6ICJtb3ZlIiAgICAgICAgICAgICAgIC8vIG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhbGwgY29udHJpYnV0aW9ucwogICAgfQogIF0sCgogIC8vIHJ1bnRpbWUg4oCUIG9uZSBvZjoKICAvLyAgIHsgInR5cGUiOiAibm9uZSIgfQogIC8vICAgeyAidHlwZSI6ICJweXRob24iLCAiZW50cnkiOiAibWFpbi5weSIgfQogIC8vICAgeyAidHlwZSI6ICJjcHAiLCAiZW50cnkiOiAiPGV4ZWN1dGFibGUgbmFtZT4iIH0KICAvLyAgIHsgInR5cGUiOiAicm9zMiIsICJyb3NDbGllbnQiOiAicmNscHkiIHwgInJjbGNwcCIsICJwYWNrYWdlIjogIi4uLiIsICJsYXVuY2giOiAiLi4uX25vZGUiIH0KICAicnVudGltZSI6IHsgInR5cGUiOiAicHl0aG9uIiwgImVudHJ5IjogIm1haW4ucHkiIH0sCgogIC8vIG9wdGlvbmFsOiBUQ1AgcG9ydHMgb3BlbmVkIGJ5IHRoaXMgcGx1Z2luIGJhY2tlbmQKICAvLyBvbmx5IG51bWJlcltdIGlzIGFsbG93ZWQ7IHJhbmdlcy9vYmplY3RzIGFyZSBub3QgYWNjZXB0ZWQKICAvLyBleHRlcm5hbCBwbHVnaW4gcG9ydHMgbXVzdCBiZSB3aXRoaW4gMjg2MDAtMjg5OTkKICAicG9ydHMiOiBbMjg2MDBdCn0KYGBgCgoqKkJhY2tlbmQgdHlwZXM6KioKCnwgdHlwZSB8IHNvdXJjZSBkaXIgfCBidWlsZCAvIHJ1biB8IGVudHJ5IHwKfC0tLXwtLS18LS0tfC0tLXwKfCBgcHl0aG9uYCB8IGBweS9gIHwgcGlwICsgcnVuIGluIERvY2tlciB8IGBtYWluLnB5YCB8CnwgYGNwcGAgfCBgY3BwL2AgfCBDTWFrZSBpbiBEb2NrZXIgfCBidWlsdCBleGVjdXRhYmxlIG5hbWUgfAp8IGByb3MyYCAocmNscHkpIHwgYHJvczJfd3MvYCB8IGNvbGNvbiAoYW1lbnRfcHl0aG9uKSBpbiBEb2NrZXIgfCDigJQgfAp8IGByb3MyYCAocmNsY3BwKSB8IGByb3MyX3dzL2AgfCBjb2xjb24gKGFtZW50X2NtYWtlKSBpbiBEb2NrZXIgfCDigJQgfAoKPiBFdmVyeSBiYWNrIGVuZCBydW5zIGluIGEgRG9ja2VyIGNvbnRhaW5lciBtYXRjaGluZyB0aGUgcm9ib3QgKFVidW50dSAyNC4wNCArIFB5dGhvbiAzLjEyKSwgc28gZGV2IGJlaGF2ZXMgbGlrZSBwcm9kdWN0aW9uIGFuZCBjb21waWxlZCBiaW5hcmllcyBhcmUgQUJJLWNvbXBhdGlibGUuICoqRG9ja2VyIGlzIHJlcXVpcmVkKiogZm9yIGFsbCBiYWNrZW5kIHR5cGVzIChvbmx5IGEgZnJvbnRlbmQtb25seSBgbm9uZWAgcGx1Z2luIHNraXBzIGl0KS4gTm8gbG9jYWwgUHl0aG9uL3Rvb2xjaGFpbiBzZXR1cCBpcyBuZWVkZWQuCgoqKkNvbnRyaWJ1dGlvbiBwb2ludHM6KioKCnwgcG9pbnQgfCBXaGVyZSBpdCBhcHBlYXJzIHwgQmFja2VuZCB8IGBjb21tYW5kSW5mb2AgfAp8LS0tfC0tLXwtLS18Oi0tLTp8CnwgYHRvb2xiYXJgIHwgVG9wIHRvb2xiYXIgYnV0dG9uIChtdXN0IGhhdmUgYXQgbGVhc3Qgb25lKSB8IFNESyAvIGByYi5hY3Rpb25gIHwg4oCUIHwKfCBgbG5iYCB8IExlZnQgbmF2aWdhdGlvbiBlbnRyeSB8IFNESyAvIGByYi5hY3Rpb25gIHwg4oCUIHwKfCBgbW92ZS5wYW5lbGAgfCBNb3ZlIHNjcmVlbiBwYW5lbCB8IFNESyAvIGByYi5hY3Rpb25gIHwg4oCUIHwKfCBgcHJvZ3JhbS5wYW5lbGAgfCBDdXN0b20gY29tbWFuZCBpbiB0aGUgUHJvZ3JhbSBwYWdlIHNlcXVlbmNlIGJ1aWxkZXIgfCBgUGx1Z2luUHJvZ3JhbUNvbnRleHRgIHwg4pyTIHwKCioqYGNvbW1hbmRJbmZvYCBmaWVsZHMqKiAoZm9yIGBwcm9ncmFtLnBhbmVsYCk6Cgp8IGZpZWxkIHwgdHlwZSB8IGRlc2NyaXB0aW9uIHwKfC0tLXwtLS18LS0tfAp8IGBuYW1lYCB8IGBzdHJpbmdgIHwgRGlzcGxheSBuYW1lIG9mIHRoZSBjb21tYW5kIGluIHRoZSBwcm9ncmFtIHRyZWUgfAp8IGBpY29uYCB8IGBzdHJpbmdgIHwgSWNvbiBwYXRoIHwKfCBgaWNvbkNsYXNzTmFtZWAgfCBgc3RyaW5nP2AgfCBPcHRpb25hbCBDU1MgY2xhc3MgZm9yIHRoZSBpY29uIHwKfCBgZnVuY05hbWVgIHwgYHN0cmluZz9gIHwgQmFja2VuZCBmdW5jdGlvbiBuYW1lIHRvIGNhbGwgfAp8IGBhcmdzYCB8IGBSZWNvcmQ8c3RyaW5nLCBhbnk+P2AgfCBEZWZhdWx0IGFyZ3VtZW50cyB8CnwgYGRpc2FibGVkYCB8IGBib29sZWFuP2AgfCBXaGV0aGVyIHRoZSBub2RlIGlzIGRpc2FibGVkIHwKfCBgYWxsb3dDaGlsZHJlbmAgfCBgc3RyaW5nW10/YCB8IEFsbG93ZWQgY2hpbGQgY29tbWFuZHMgfAp8IGBhbGxvd1BhcmVudHNgIHwgYHN0cmluZ1tdP2AgfCBBbGxvd2VkIHBhcmVudCBjb21tYW5kcyB8CnwgYG5vdEFsbG93Q2hpbGRyZW5gIHwgYHN0cmluZ1tdP2AgfCBEaXNhbGxvd2VkIGNoaWxkIGNvbW1hbmRzIHwKfCBgc3luY0dyb3VwSWRgIHwgYGJvb2xlYW4/YCB8IFN5bmMgZ3JvdXAgSUQgYWNyb3NzIGNoaWxkcmVuIHwKfCBgZGlzYWJsZUNvcHlgIHwgYGJvb2xlYW4/YCB8IFByZXZlbnQgY29weSB8CnwgYGRpc2FibGVEZWxldGVgIHwgYGJvb2xlYW4/YCB8IFByZXZlbnQgZGVsZXRlIHwKfCBgcmVxdWlyZUNoaWxkcmVuYCB8IGBib29sZWFuP2AgfCBXaGV0aGVyIGEgY2hpbGQgY29tbWFuZCBpcyByZXF1aXJlZCB8CnwgYHJlcXVpcmVQYXJlbnRgIHwgYGJvb2xlYW4/YCB8IFdoZXRoZXIgYSBwYXJlbnQgY29tbWFuZCBpcyByZXF1aXJlZCB8CnwgYGNoaWxkcmVuQ29tbWFuZGAgfCBgc3RyaW5nP2AgfCBEZWZhdWx0IGNvbW1hbmQgdHlwZSBmb3IgY2hpbGRyZW4gfAoKKipWYWxpZGF0aW9uIHJ1bGVzOioqCi0gYGlkYCwgYG5hbWVgLCBgdmVyc2lvbmAsIGBtaW5NdXNjYXRWZXJzaW9uYCDigJQgcmVxdWlyZWQgbm9uLWVtcHR5IHN0cmluZ3MKLSBgYXV0aG9yYCDigJQgcmVxdWlyZWQgbm9uLWVtcHR5IHN0cmluZwotIGBkZXNjcmlwdGlvbmAg4oCUIHJlcXVpcmVkIChgc3RyaW5nYCBvciBgeyBlbiAocmVxdWlyZWQpLCBrbz8sIGphPywgemg/LCB2aT8sIHRoPywgZXM/IH1gKQotIGBpY29uc2Ag4oCUIFNWRzogc2luZ2xlIHN0cmluZyBwYXRoIGVuZGluZyBpbiBgLnN2Z2A7IFBORy9KUEc6IG9iamVjdCB3aXRoIGAiMTYiYCwgYCI0OCJgLCBgIjEyOCJgIGFsbCBwcmVzZW50Ci0gYHRhcmdldE1vZGVsc2Ag4oCUIGAiYWxsImAgb3IgYSBub24tZW1wdHkgYXJyYXkgb2Ygcm9ib3QgbW9kZWwgSUQgc3RyaW5ncyAoYXQgbGVhc3Qgb25lIG9mIGB0YXJnZXRNb2RlbHNgIC8gYHRhcmdldENhdGVnb3J5c2AgcmVxdWlyZWQpCi0gYHRhcmdldENhdGVnb3J5c2Ag4oCUIGAiYWxsImAgb3IgYSBub24tZW1wdHkgYXJyYXkgb2YgYCJtYW5pcHVsYXRlIiB8ICJhbXIiIHwgInJieTEiIHwgInZpc2lvbiJgIChhdCBsZWFzdCBvbmUgb2YgYHRhcmdldE1vZGVsc2AgLyBgdGFyZ2V0Q2F0ZWdvcnlzYCByZXF1aXJlZCkKLSBgY29udHJpYnV0ZXNgIOKAlCByZXF1aXJlZCBhcnJheTsgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBgdG9vbGJhcmAgZW50cnkKLSBgdWlgIOKAlCBlYWNoIGNvbnRyaWJ1dGlvbiBtdXN0IGhhdmUgYSB1bmlxdWUgdmFsdWUKLSBgY29tbWFuZEluZm9gIOKAlCByZXF1aXJlZCB3aGVuIGBwb2ludGAgaXMgYCJwcm9ncmFtLnBhbmVsImAKLSBgcG9ydHNgIOKAlCBvcHRpb25hbCBgbnVtYmVyW11gOyBldmVyeSBwb3J0IG11c3QgYmUgd2l0aGluIGAyODYwMC0yODk5OWAKICBhbmQgbXVzdCBub3QgYmUgYSByZXNlcnZlZCByb2JvdC9pbmR1c3RyaWFsL2ludGVybmFsIHBvcnQKCmBtdXNjYXQtcGsgYnVpbGRgIHRocm93cyBvbiBhbnkgdmFsaWRhdGlvbiBlcnJvci4gYG11c2NhdC1wayBkZXZgIHByaW50cyB3YXJuaW5ncy4KCioqQmFja2VuZCBwb3J0IHJ1bGVzOioqCi0gRGVjbGFyZSBhIHBvcnQgb25seSBpZiB5b3VyIGJhY2tlbmQgb3BlbnMgYSBUQ1Agc2VydmVyL2xpc3RlbmVyLgotICoqRXZlcnkgbGlzdGVuaW5nIFRDUCBwb3J0IG11c3QgYmUgZGVjbGFyZWQuKiogYG11c2NhdC1wayBkZXZgIGFuZAogIGBtdXNjYXQtcGsgZGV2OmJhY2tgIHdhdGNoIHRoZSBiYWNrZW5kIGFuZCBzdG9wIGl0IHRoZSBtb21lbnQgaXQgb3BlbnMgYSBwb3J0CiAgdGhhdCBpcyBub3QgaW4gYHBvcnRzYC4gQSBwb3J0IG91dHNpZGUgYDI4NjAwLTI4OTk5YCBjYW4ndCBiZSBkZWNsYXJlZCwgc28gaXQKICBtdXN0IG5vdCBiZSBvcGVuZWQgZWl0aGVyIOKAlCBwaWNraW5nIGUuZy4gYDU1MDBgIGlzIG5vdCBhIHdheSBhcm91bmQgdGhlIHJ1bGUuCiAgSXQgd291bGQgZXNjYXBlIHRoaXMgY2hlY2sgKmFuZCogdGhlIHJvYm90J3MgaW5zdGFsbC10aW1lIGNvbmZsaWN0IGNoZWNrLCBhbmQKICBvbmx5IGNvbGxpZGUgb25jZSBpdCdzIHJ1bm5pbmcgb24gYSByb2JvdC4KLSBSZXNlcnZlZCBwb3J0cyBpbmNsdWRlIGA1MDJgLCBgMjIyMmAsIGA0ODQwYCwgYDUxNzAtNTE3OWAsIGA4MDAwLTg5OTlgLAogIGAxMDAwMGAsIGAzMDAwNGAsIGAzNDk2NGAsIGA0NDgxOGAsIGA1MDAwMC01MDAwNWAsIGFuZCBgNTAwNTFgLgotIFRoZSByb2JvdCByZWplY3RzIGluc3RhbGxhdGlvbiAoSFRUUCA0MDkpIGlmIGEgZGVjbGFyZWQgcG9ydCBpcyByZXNlcnZlZCwKICBvdXQgb2YgcmFuZ2UsIG9yIGFscmVhZHkgY2xhaW1lZCBieSBhbm90aGVyIGVuYWJsZWQgcGx1Z2luLgoKKipSZWFjaGluZyB5b3VyIGJhY2tlbmQncyBwb3J0cyBkdXJpbmcgZGV2ZWxvcG1lbnQ6KioKLSBEZWNsYXJlZCBwb3J0cyBhcmUgcHVibGlzaGVkIHRvIGAxMjcuMC4wLjFgIG9uIHlvdXIgbWFjaGluZSwgc28KICBgY3VybCBodHRwOi8vMTI3LjAuMC4xOjI4NjAwYCB3b3JrcyBmcm9tIHRoZSBob3N0IG9uIG1hY09TLCBXaW5kb3dzLCBhbmQgTGludXguCi0gT24gbmF0aXZlIExpbnV4IHRoZSBkZXYgY29udGFpbmVyIHVzZXMgaG9zdCBuZXR3b3JraW5nLCBzbyB0aGUgcG9ydHMgYXJlIG9uCiAgdGhlIGhvc3QgYWxyZWFkeS4KLSBJZiBhIGRlY2xhcmVkIHBvcnQgaXMgYWxyZWFkeSB0YWtlbiBvbiB5b3VyIG1hY2hpbmUsIGBtdXNjYXQtcGsgZGV2YCB3YXJucyBhbmQKICBza2lwcyBwdWJsaXNoaW5nIHRoYXQgb25lIOKAlCB0aGUgYmFja2VuZCBzdGlsbCBsaXN0ZW5zIGluc2lkZSB0aGUgY29udGFpbmVyLgoKLS0tCgojIyBMb2NhbGl6ZWQgZG9jdW1lbnRhdGlvbgoKWW91IGNhbiBzaGlwIHBlci1sYW5ndWFnZSBSRUFETUUgZmlsZXMgYWxvbmdzaWRlIHRoZSBtYWluIGBSRUFETUUubWRgLiBQbGFjZSB0aGVtIGluIHRoZSBwcm9qZWN0IHJvb3Q6CgpgYGAKUkVBRE1FLm1kICAgICAgICAjIGRlZmF1bHQgLyBFbmdsaXNoIGZhbGxiYWNrClJFQURNRS5rby5tZCAgICAgIyBLb3JlYW4KUkVBRE1FLmVuLm1kICAgICAjIGV4cGxpY2l0IEVuZ2xpc2ggKG9wdGlvbmFsKQpSRUFETUUuamEubWQgICAgICMgSmFwYW5lc2UKYGBgCgpBbGwgYFJFQURNRSoubWRgIGZpbGVzIGZvdW5kIGF0IHRoZSBwcm9qZWN0IHJvb3QgYXJlIGF1dG9tYXRpY2FsbHkgY29waWVkIHRvIGBkaXN0L2Agb24KYG11c2NhdC1wayBidWlsZGAuIE11c2NhdCBkaXNwbGF5cyB0aGUgZmlsZSBtYXRjaGluZyB0aGUgdXNlcidzIGxvY2FsZSwKZmFsbGluZyBiYWNrIHRvIGBSRUFETUUubWRgIGlmIG5vbmUgbWF0Y2hlcy4KCi0tLQoKIyMgSW5zdGFsbGluZyBQeXRob24gZGVwZW5kZW5jaWVzCgpBZGQgYW55IHBhY2thZ2Ugd2l0aCBhbiBvcHRpb25hbCB2ZXJzaW9uIHBpbiB0byBgcmVxdWlyZW1lbnRzLnR4dGA6CgpgYGAKcmFpbmJvdy1yYi1zZGsKcmFpbmJvdy1yYi1mbGF0LWJ1ZmZlcnMKbnVtcHk9PTEuMjYuNApvcGVuY3YtcHl0aG9uCmBgYAoKUnVuIGBtdXNjYXQtcGsgZGV2YCBvciBgbXVzY2F0LXBrIGRldjpiYWNrYCDigJQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQgYXV0b21hdGljYWxseQppbnNpZGUgdGhlIGRldiBjb250YWluZXIgKGBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0YCkgb24gZXZlcnkgc3RhcnR1cC4gTm8KbG9jYWwgUHl0aG9uIGlzIHJlcXVpcmVkIGZvciB0aGlzLgoKYG11c2NhdC1wayBkZXY6YmFja2AgYWxzbyBiZXN0LWVmZm9ydCBjcmVhdGVzL3JlZnJlc2hlcyBhIGxvY2FsIGAudmVudmAgaW4gdGhlCmJhY2tncm91bmQgKHZpYSBgdXZgIGlmIGF2YWlsYWJsZSwgZWxzZSB5b3VyIHN5c3RlbSBQeXRob24pIHdpdGggdGhlIHNhbWUgZGVwcyDigJQKcHVyZWx5IHNvIHlvdXIgZWRpdG9yIChweWxpbnQsIHB5cmlnaHQsIG15cHksIC4uLikgY2FuIHJlc29sdmUgaW1wb3J0cyBhbmQgbGludApjb3JyZWN0bHkuIEl0J3Mgbm90IHVzZWQgdG8gcnVuIHRoZSBiYWNrZW5kOyBEb2NrZXIgaXMgdGhlIGFjdHVhbCBleGVjdXRpb24KZW52aXJvbm1lbnQsIHNvIHRoaXMgc3RlcCBpcyBzaWxlbnRseSBza2lwcGVkIGlmIG5vIGxvY2FsIFB5dGhvbiB0b29sY2hhaW4gaXMKYXZhaWxhYmxlLiBQb2ludCB5b3VyIGVkaXRvcidzIFB5dGhvbiBpbnRlcnByZXRlciBhdCBgLnZlbnZgLgoKYG11c2NhdC1wayBzZGsgdXBkYXRlYCBhbHNvIHJlZnJlc2hlcyBgLnZlbnZgIGluIHBsYWNlIGlmIG9uZSBhbHJlYWR5IGV4aXN0cywgc28KeW91ciBlZGl0b3IgcGlja3MgdXAgdGhlIG5ldyBgcmFpbmJvdy1yYi1zZGtgIHZlcnNpb24gaW1tZWRpYXRlbHkuCgo+IGBtdXNjYXQtcGsgYnVpbGRgIG9ubHkgKipwaW5zKiogdmVyc2lvbnMgaW4gYHJlcXVpcmVtZW50cy50eHRgIOKAlCBpdCBkb2VzIG5vdCBydW4gYHBpcCBpbnN0YWxsYCAodGhlIHJvYm90IGluc3RhbGxzIHRoZW0gYXQgbG9hZCB0aW1lKS4KCi0tLQoKIyMgU3dpdGNoaW5nIGJhY2tlbmQgdHlwZQoKYGBgYmFzaAptdXNjYXQtcGsgdHlwZSBjaGFuZ2UgICAgICAgICAgICAgICAgICMgaW50ZXJhY3RpdmUKbXVzY2F0LXBrIHR5cGUgY2hhbmdlIC0tdG8gY3BwICAgICAgICAjIOKGkiBDKysKbXVzY2F0LXBrIHR5cGUgY2hhbmdlIC0tdG8gcm9zMiAgICAgICAjIOKGkiBST1MyIChyY2xweSAvIFB5dGhvbikKbXVzY2F0LXBrIHR5cGUgY2hhbmdlIC0tdG8gcm9zMi1jcHAgICAjIOKGkiBST1MyIChyY2xjcHAgLyBDKyspCm11c2NhdC1wayB0eXBlIGNoYW5nZSAtLXRvIHB5dGhvbiAgICAgIyDihpIgUHl0aG9uCmBgYAoKPiBFeGlzdGluZyBiYWNrZW5kIGRpcnMgKGByb3MyX3dzL2AsIGBjcHAvYCkgYXJlIG5vdCBkZWxldGVkIHdoZW4gc3dpdGNoaW5nIGF3YXkuIFJlbW92ZSB0aGVtIG1hbnVhbGx5IGlmIG5vIGxvbmdlciBuZWVkZWQuCgotLS0KCiMjIEFJIGNvZGluZyBhc3Npc3RhbnRzIChNQ1ApCgpJZiB5b3UgYnVpbGQgeW91ciBwbHVnaW4gd2l0aCBhbiBBSSBhc3Npc3RhbnQgKENsYXVkZSBDb2RlLCBDb2RleCwg4oCmKSwgZ2l2ZSBpdApncm91bmRlZCBrbm93bGVkZ2Ugb2YgdGhlIE11c2NhdCBVSSBjb21wb25lbnRzLCBkZXNpZ24gdG9rZW5zLCBhbmQgU0RLIGluc3RlYWQgb2YKbGV0dGluZyBpdCBndWVzcy4gYG11c2NhdC1wayBtY3BgIGlzIGFuIE1DUCBzZXJ2ZXIgZXhwb3Npbmc6CgotIGBsaXN0X2NvbXBvbmVudHNgIC8gYGdldF9jb21wb25lbnRfcHJvcHNgIC8gYGdldF9jb21wb25lbnRfZXhhbXBsZWAg4oCUIGV2ZXJ5CiAgYEByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aS9yZWFjdGAgY29tcG9uZW50IHdpdGggaXRzIHJlYWwgcHJvcHMgYW5kIGEgd29ya2luZwogIFN0b3J5Ym9vayBleGFtcGxlLgotIGBsaXN0X2Rlc2lnbl90b2tlbnNgIC8gYHNlYXJjaF9kZXNpZ25fdG9rZW5zYCDigJQgdGhlIFRhaWx3aW5kIGNsYXNzZXMgdG8gdXNlCiAgKGBiZy1iZy0qYCwgYHRleHQtZmctKmAsIGB0eXBvLSpgLCDigKYpIHNvIHlvdXIgVUkgbWF0Y2hlcyB0aGUgaG9zdCB0aGVtZS4KLSBgc2VhcmNoX3JiX3Nka2Ag4oCUIGhvdyB0byB1c2UgYHVzZVJiKClgLCBgcmIuKmAsIGB1c2VSYkZvcm1EYXRhYC9gdXNlUmJTYXZlYCwgYW5kCiAgdGhlIGJhY2tlbmQgcnVudGltZXMuCi0gYGxpc3RfcmJfc2RrYCAvIGBnZXRfcmJfc2RrX2FwaWAg4oCUIHRoZSBpbnN0YWxsZWQgYHJhaW5ib3ctcmItc2RrYCAoUHl0aG9uCiAgYmFja2VuZCkgY2xhc3NlcyBhbmQgc2lnbmF0dXJlcy4KCioqQnJvd3NlIHRoZSBjb21wb25lbnRzIGxpdmUqKiB3aXRoIGBtdXNjYXQtcGsgc3Rvcnlib29rYC4KCiMjIyBSZWdpc3RlciB0aGUgc2VydmVyCgoqKkNsYXVkZSBDb2RlKiog4oCUIGEgYC5tY3AuanNvbmAgaXMgYWxyZWFkeSBzY2FmZm9sZGVkIGF0IHlvdXIgcGx1Z2luIHJvb3QsIHNvCml0IHdvcmtzIG91dCBvZiB0aGUgYm94OgoKYGBganNvbgp7CiAgIm1jcFNlcnZlcnMiOiB7CiAgICAibXVzY2F0IjogewogICAgICAiY29tbWFuZCI6ICJtdXNjYXQtcGsiLAogICAgICAiYXJncyI6IFsibWNwIl0KICAgIH0KICB9Cn0KYGBgCgoqKkNvZGV4Kiog4oCUIGFkZCB0byBgfi8uY29kZXgvY29uZmlnLnRvbWxgOgoKYGBgdG9tbApbbWNwX3NlcnZlcnMubXVzY2F0XQpjb21tYW5kID0gIm11c2NhdC1wayIKYXJncyA9IFsibWNwIl0KYGBgCgpBbnkgb3RoZXIgTUNQIGNsaWVudCB3b3JrcyB0b28g4oCUIGl0J3MgYSBzdGFuZGFyZCBzdGRpbyBNQ1Agc2VydmVyIHN0YXJ0ZWQgd2l0aApgbXVzY2F0LXBrIG1jcGAuIElmIGBtdXNjYXQtcGtgIGlzbid0IG9uIHRoZSBjbGllbnQncyBQQVRILCB1c2UgaXRzIGFic29sdXRlIHBhdGgKKGB3aGljaCBtdXNjYXQtcGtgKSBhcyBgY29tbWFuZGAuCgotLS0KCiMjIFNoaXBwaW5nCgpgYGBiYXNoCm11c2NhdC1wayBidWlsZCAgICAgICAgICAgICMgYnVpbGQgKyBaSVAKbXVzY2F0LXBrIGJ1aWxkIC0tbm8temlwICAgIyBidWlsZCBvbmx5LCBubyBaSVAKYGBgCgotIEJ1aWxkcyBgdWkvY29udGVudC50c3hgIOKGkiBgZGlzdC9jb250ZW50LmpzYCAobWluaWZpZWQpCi0gUGlucyBgcmVxdWlyZW1lbnRzLnR4dGAgdG8gbGF0ZXN0IHZlcnNpb25zIChzdGFibGUtb25seSBvbiBgbWFpbmAgYnJhbmNoKQotIENvcGllcyBgYXNzZXRzL2AsIGBtYW5pZmVzdC5qc29uYCwgYFJFQURNRSoubWRgLCBgcHkvYCwgYW5kIGByZXF1aXJlbWVudHMudHh0YCBpbnRvIGBkaXN0L2AKLSBST1MyOiBydW5zIGBjb2xjb24gYnVpbGRgIGluc2lkZSB0aGUgSmF6enkgY29udGFpbmVyOyBpbmNsdWRlcyBgcm9zMl93cy9pbnN0YWxsL2AKLSBPdXRwdXQ6IGBfX1BMVUdJTl9ESVJfXy17dmVyc2lvbn0uemlwYAoKWklQIGxheW91dDoKCmBgYApfX1BMVUdJTl9ESVJfXy0xLjAuMC56aXAK4pSc4pSAIGRpc3QvCuKUgiAgIOKUnOKUgCBjb250ZW50LmpzICAgICAgICAjIGJ1aWx0IFVJCuKUgiAgIOKUnOKUgCBtYW5pZmVzdC5qc29uCuKUgiAgIOKUnOKUgCBhc3NldHMvCuKUgiAgIOKUnOKUgCBSRUFETUUubWQK4pSCICAg4pSc4pSAIFJFQURNRS5rby5tZCAgICAgICMgaWYgcHJlc2VudArilIIgICDilJzilIAgbWFpbi5weSAgICAgICAgICAgIyBmcm9tIHB5LwrilIIgICDilJTilIAgcmVxdWlyZW1lbnRzLnR4dCAgIyBwaW5uZWQK4pSU4pSAIHJvczJfd3MvaW5zdGFsbC8gICAgICAjIFJPUzIgb25seQpgYGAKCi0tLQoKIyMgQWxsIGNvbW1hbmRzCgpgYGBiYXNoCm11c2NhdC1wayBkZXYgICAgICAgICMgVUkgKyBiYWNrZW5kCm11c2NhdC1wayBkZXY6dWkgICAgICMgVUkgcHJldmlldyBvbmx5IChwcmV2aWV3LWhvc3QpCm11c2NhdC1wayBkZXY6YmFjayAgICMgYmFja2VuZCBvbmx5IChQeXRob246IHdhdGNoZmlsZXMgLyBST1MyOiBEb2NrZXIpCm11c2NhdC1wayBidWlsZCAgICAgICMgYnVpbGQg4oaSIGRpc3QvICsgZGlzdHJpYnV0YWJsZSBaSVAgKC0tbm8temlwIHRvIHNraXApCm11c2NhdC1wayBzdG9yeWJvb2sgICMgYnJvd3NlIHRoZSByYi1jb21wb25lbnRzIFVJIGxpYnJhcnkgaW4gYSBicm93c2VyCm11c2NhdC1wayBtY3AgICAgICAgICMgTUNQIHNlcnZlciBmb3IgQUkgYXNzaXN0YW50cyAoY29tcG9uZW50cy90b2tlbnMvU0RLIGRvY3MpCmBgYAoKYGBgYmFzaAptdXNjYXQtcGsgdHlwZSBjaGFuZ2UgICAgIyBzd2l0Y2ggYmFja2VuZCB0eXBlCm11c2NhdC1wayBzZGsgbGlzdCAgICAgICAjIHNob3cgY3VycmVudCBQeXRob24gU0RLIHZlcnNpb24KbXVzY2F0LXBrIHNkayB1cGRhdGUgICAgICMgdXBkYXRlIFB5dGhvbiBTREsgdG8gbGF0ZXN0Cm11c2NhdC1wayB1cGRhdGUgICAgICAgICAjIHVwZGF0ZSBtdXNjYXQtcGx1Z2luLWtpdCBpdHNlbGYKbXVzY2F0LXBrIHVuaW5zdGFsbCAgICAgICMgcmVtb3ZlIG11c2NhdC1wayBpdHNlbGYKYGBgCg==","common/assets/icon.svg":"PHN2ZyB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI1NiIgdmlld0JveD0iMCAwIDI1NiAyNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImJnIiB4MT0iMzYiIHkxPSIyOCIgeDI9IjIyMCIgeTI9IjIyOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjOEI1Q0Y2Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzVCMjFCNiIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZ3JhcGUiIHgxPSI5MiIgeTE9Ijc0IiB4Mj0iMTY4IiB5Mj0iMTc4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNEOEI0RkUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQTg1NUY3Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KCiAgPHJlY3QgeD0iMTYiIHk9IjE2IiB3aWR0aD0iMjI0IiBoZWlnaHQ9IjIyNCIgcng9IjUyIiBmaWxsPSJ1cmwoI2JnKSIvPgoKICA8IS0tIHBsdWdpbiBicmFja2V0cyAtLT4KICA8cGF0aCBkPSJNNzIgODRINTZDNDcuMTYzNCA4NCA0MCA5MS4xNjM0IDQwIDEwMFYxMTYiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxwYXRoIGQ9Ik0xODQgODRIMjAwQzIwOC44MzcgODQgMjE2IDkxLjE2MzQgMjE2IDEwMFYxMTYiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxwYXRoIGQ9Ik03MiAxNzJINTZDNDcuMTYzNCAxNzIgNDAgMTY0LjgzNyA0MCAxNTZWMTQwIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjEyIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8cGF0aCBkPSJNMTg0IDE3MkgyMDBDMjA4LjgzNyAxNzIgMjE2IDE2NC44MzcgMjE2IDE1NlYxNDAiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgoKICA8IS0tIGdyYXBlIHN0ZW0gKyBsZWFmIC0tPgogIDxwYXRoIGQ9Ik0xMjggNzNDMTI4IDU5IDEzNyA0OCAxNTEgNDQiIHN0cm9rZT0iI0YzRThGRiIgc3Ryb2tlLXdpZHRoPSIxMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPHBhdGggZD0iTTE0MiA1MUMxNTEgMzkgMTY5IDM5IDE3OSA1MEMxNjUgNjAgMTUxIDYyIDE0MiA1MVoiIGZpbGw9IiNDNEI1RkQiLz4KCiAgPCEtLSBtdXNjYXQgZ3JhcGUgY2x1c3RlciAtLT4KICA8Y2lyY2xlIGN4PSIxMDYiIGN5PSI5MSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTMyIiBjeT0iODgiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjE1OCIgY3k9IjkxIiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSI5NCIgY3k9IjExOSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTIwIiBjeT0iMTE2IiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSIxNDYiIGN5PSIxMTYiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjE3MiIgY3k9IjExOSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTA3IiBjeT0iMTQ1IiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSIxMzMiIGN5PSIxNDQiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjE1OSIgY3k9IjE0NSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTIwIiBjeT0iMTcwIiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSIxNDYiIGN5PSIxNzAiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjEzMyIgY3k9IjE5MyIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CgogIDwhLS0gY2VudGVyIHBsdWdpbiBnbHlwaCAtLT4KICA8cGF0aCBkPSJNMTIyIDExOVYxMDlDMTIyIDEwMy40NzcgMTI2LjQ3NyA5OSAxMzIgOTlIMTM2QzE0MS41MjMgOTkgMTQ2IDEwMy40NzcgMTQ2IDEwOVYxMTkiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPHJlY3QgeD0iMTE2IiB5PSIxMTgiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNCIgcng9IjEwIiBmaWxsPSJ3aGl0ZSIvPgogIDxwYXRoIGQ9Ik0xMjcgMTUyVjE2MyIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8cGF0aCBkPSJNMTQxIDE1MlYxNjMiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=","common/manifest.json":"ewogICJpZCI6ICJfX1BMVUdJTl9JRF9fIiwKICAibmFtZSI6ICJfX1BMVUdJTl9OQU1FX18iLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAibWluTXVzY2F0VmVyc2lvbiI6ICIxLjAuMCIsCiAgImF1dGhvciI6ICJfX1BMVUdJTl9BVVRIT1JfXyIsCiAgImVtYWlsIjogIl9fUExVR0lOX0VNQUlMX18iLAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJrbyI6ICIiLAogICAgImVuIjogIiIKICB9LAogICJpY29ucyI6ICJhc3NldHMvaWNvbi5zdmciLAogICJ0YXJnZXRNb2RlbHMiOiAiYWxsIiwKICAidGFyZ2V0Q2F0ZWdvcnlzIjogImFsbCIsCiAgImNvbnRyaWJ1dGVzIjogWwogICAgewogICAgICAicG9pbnQiOiAidG9vbGJhciIsCiAgICAgICJpY29uIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgICAgICJsYWJlbCI6IHsgImtvIjogIl9fUExVR0lOX05BTUVfXyIsICJlbiI6ICJfX1BMVUdJTl9OQU1FX18iIH0sCiAgICAgICJ1aSI6ICJjb250ZW50IiwKICAgICAgIm9wZW5zIjogInBvcG92ZXIiCiAgICB9CiAgXSwKICAidmFyaWFibGVzIjogW10sCiAgInJ1bnRpbWUiOiB7ICJ0eXBlIjogIl9fUlVOVElNRV9UWVBFX18iLCAiZW50cnkiOiAibWFpbi5weSIgfQp9Cg==","common/package.json":"ewogICJuYW1lIjogIl9fUExVR0lOX0lEX18iLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAicHJpdmF0ZSI6IHRydWUsCiAgInR5cGUiOiAibW9kdWxlIiwKICAiZGVwZW5kZW5jaWVzIjogewogICAgIkByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aSI6ICJfX1JCX1ZFUlNJT05fXyIKICB9LAogICJkZXZEZXBlbmRlbmNpZXMiOiB7CiAgICAiQHRhaWx3aW5kY3NzL3ZpdGUiOiAiXjQuMS4wIiwKICAgICJAcmFpbmJvdy1yb2JvdGljcy9tdXNjYXQtcGx1Z2luLWtpdCI6ICJfX1JCX1ZFUlNJT05fXyIsCiAgICAiQHJhaW5ib3ctcm9ib3RpY3MvcHJldmlldy1ob3N0IjogIl9fUkJfVkVSU0lPTl9fIiwKICAgICJAdHlwZXMvcmVhY3QiOiAiXjE5LjAuMTAiLAogICAgIkB0eXBlcy9yZWFjdC1kb20iOiAiXjE5LjAuNCIsCiAgICAiQHZpdGVqcy9wbHVnaW4tcmVhY3QiOiAiXjQuMC4wIiwKICAgICJyZWFjdCI6ICJeMTkuMC4wIiwKICAgICJyZWFjdC1kb20iOiAiXjE5LjAuMCIsCiAgICAidGFpbHdpbmRjc3MiOiAiXjQuMS4wIiwKICAgICJ0eXBlc2NyaXB0IjogIl41LjguMCIsCiAgICAidml0ZSI6ICJeNi4wLjAiCiAgfQp9Cg==","common/py/main.py":"IiIiCk11c2NhdCBwbHVnaW4gYmFja2VuZCDigJQgX19QTFVHSU5fTkFNRV9fCgpPbi1yb2JvdCAoZGVmYXVsdCk6CiAgbXVzY2F0LXBrIGRldjpiYWNrCiAgcHl0aG9uIG1haW4ucHkKClJlbW90ZSBkZXYgKGZyb20geW91ciBsYXB0b3ApOgogIFNldCBlbnYgdmFycyBiZWZvcmUgcnVubmluZzoKICAgIE1VU0NBVF9ST0JPVF9IT1NUPTE5Mi4xNjguMS4xMDAKICAgIE1VU0NBVF9ST0JPVF9UT0tFTj08c2VydmljZSB0b2tlbj4KICBUaGVuOiBtdXNjYXQtcGsgZGV2OmJhY2sKIiIiCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgb3MKZnJvbSB0eXBpbmcgaW1wb3J0IEFueQoKZnJvbSByYWluYm93LnJiX3NkayBpbXBvcnQgUkJNYW5pcHVsYXRlU0RLLCBSQlBsdWdpbkNhbGwKCgpQTFVHSU5fTkFNRSA9ICJfX1BMVUdJTl9OQU1FX18iCgpwbHVnaW4gPSBSQlBsdWdpbkNhbGwoKQptYW5pcHVsYXRlID0gUkJNYW5pcHVsYXRlU0RLKCkKCgpkZWYgcmVnaXN0ZXJfaGFuZGxlcnMoKToKICAgICMgUmVnaXN0ZXIgaGFuZGxlcnMgaGVyZSDigJQgY2FsbGVkIGFmdGVyIGNvbm5lY3QoKSBzbyBzdWJzY3JpcHRpb25zIHN1cnZpdmUKICAgICMgc2Vzc2lvbiByZWNvbm5lY3Rpb24gaW4gcmVtb3RlLWRldiBtb2RlLgoKICAgIEBwbHVnaW4uc3Vic2NyaWJlKCJldmVudCIpCiAgICBkZWYgb25fdWlfZXZlbnQocGF5bG9hZDogZGljdFtzdHIsIEFueV0gfCBOb25lID0gTm9uZSk6CiAgICAgICAgIiIiSGFuZGxlIG1lc3NhZ2VzIHB1Ymxpc2hlZCBmcm9tIHRoZSBwbHVnaW4gVUkgd2l0aCByYi5wdWIoImV2ZW50IiwgLi4uKS4iIiIKICAgICAgICBwcmludChmIlt7UExVR0lOX05BTUV9XSBldmVudDoiLCBwYXlsb2FkKQoKICAgIEBwbHVnaW4uc2VydmUoImdyaXAiKQogICAgZGVmIGdyaXAocGF5bG9hZDogZGljdFtzdHIsIEFueV0gfCBOb25lID0gTm9uZSk6CiAgICAgICAgIiIiSGFuZGxlIHRoZSBkZWZhdWx0IFVJIGJ1dHRvbjogcmIuYWN0aW9uKCJncmlwIiwgeyB3aWR0aCB9KS4iIiIKICAgICAgICB3aWR0aCA9IChwYXlsb2FkIG9yIHt9KS5nZXQoIndpZHRoIiwgMjApCiAgICAgICAgcHJpbnQoZiJbe1BMVUdJTl9OQU1FfV0gZ3JpcCByZXF1ZXN0ZWQ6IHdpZHRoPXt3aWR0aH0iKQogICAgICAgIHBsdWdpbi5wdWJsaXNoKCJzdGF0ZSIsIHsicmVhZHkiOiBUcnVlLCAibGFzdF9ncmlwX3dpZHRoIjogd2lkdGh9KQogICAgICAgIHJldHVybiB7Im9rIjogVHJ1ZSwgIndpZHRoIjogd2lkdGh9CgogICAgQHBsdWdpbi5zZXJ2ZSgidG9vbC9lY2hvIikKICAgIGRlZiBlY2hvKHBheWxvYWQ6IGRpY3Rbc3RyLCBBbnldIHwgTm9uZSA9IE5vbmUpOgogICAgICAgICIiIlNtYWxsIHF1ZXJ5IGV4YW1wbGUgY2FsbGFibGUgZnJvbSB0aGUgVUkgd2l0aCByYi5hY3Rpb24oInRvb2wvZWNobyIsIC4uLikuIiIiCiAgICAgICAgcmV0dXJuIHsiZWNobyI6IHBheWxvYWQsICJwbHVnaW4iOiBQTFVHSU5fTkFNRX0KCgpkZWYgbW92ZV9qX2V4YW1wbGUoKToKICAgICIiIgogICAgRXhhbXBsZTogdXNlIG90aGVyIHJvYm90IFNES3MgZnJvbSB0aGUgc2FtZSBiYWNrZW5kLgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBhdXRvbWF0aWNhbGx5LiBBZGQgc2FmZXR5IGNoZWNrcyBhbmQgY2FsbCBpdAogICAgZnJvbSB5b3VyIG93biBoYW5kbGVyIHdoZW4gdGhlIHJvYm90IGlzIHJlYWR5LgogICAgIiIiCiAgICByZXR1cm4gbWFuaXB1bGF0ZS5tb3ZlLmNhbGxfbW92ZV9qKAogICAgICAgIHJvYm90X21vZGVsPSJDNTAwOTIwIiwKICAgICAgICB0YXJnZXQ9ewogICAgICAgICAgICAidGFyX3ZhbHVlcyI6IFswLCAwLCAwLCAwLCAwLCAwXSwKICAgICAgICAgICAgInRhcl9mcmFtZSI6IDAsCiAgICAgICAgICAgICJ0YXJfdW5pdCI6IDAsCiAgICAgICAgfSwKICAgICkKCgphc3luYyBkZWYgbWFpbigpOgogICAgcm9ib3RfaG9zdCA9IG9zLmdldGVudigiTVVTQ0FUX1JPQk9UX0hPU1QiKQogICAgcm9ib3RfdG9rZW4gPSBvcy5nZXRlbnYoIk1VU0NBVF9ST0JPVF9UT0tFTiIpCgogICAgaWYgcm9ib3RfaG9zdCBhbmQgcm9ib3RfdG9rZW46CiAgICAgICAgIyBSZW1vdGUgZGV2OiBjb25uZWN0IHRvIHRoZSByb2JvdCBiZWZvcmUgcmVnaXN0ZXJpbmcgYW55IGhhbmRsZXJzLgogICAgICAgICMgY29ubmVjdCgpIGNsb3NlcyBhbmQgcmVvcGVucyB0aGUgWmVub2ggc2Vzc2lvbiwgc28gaGFuZGxlcnMgcmVnaXN0ZXJlZAogICAgICAgICMgYmVmb3JlIHRoaXMgY2FsbCB3b3VsZCBiZSBsb3N0LgogICAgICAgIGF3YWl0IG1hbmlwdWxhdGUuY29ubmVjdCh0b2tlbj1yb2JvdF90b2tlbiwgaG9zdD1yb2JvdF9ob3N0KQoKICAgIHJlZ2lzdGVyX2hhbmRsZXJzKCkKCiAgICBwbHVnaW4ucHVibGlzaCgic3RhdGUiLCB7InJlYWR5IjogVHJ1ZSwgInBsdWdpbiI6IFBMVUdJTl9OQU1FfSkKICAgIHByaW50KGYiW3tQTFVHSU5fTkFNRX1dIGJhY2tlbmQgcmVhZHkiKQoKICAgIHRyeToKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDEpCiAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBhc3luY2lvLkNhbmNlbGxlZEVycm9yKToKICAgICAgICBwYXNzCiAgICBmaW5hbGx5OgogICAgICAgIGlmIHJvYm90X2hvc3QgYW5kIHJvYm90X3Rva2VuOgogICAgICAgICAgICBhd2FpdCBtYW5pcHVsYXRlLmRpc2Nvbm5lY3QoKQogICAgICAgIHByaW50KGYiW3tQTFVHSU5fTkFNRX1dIHN0b3BwZWQiKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0cnk6CiAgICAgICAgYXN5bmNpby5ydW4obWFpbigpKQogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIHBhc3MK","common/requirements.txt":"cmFpbmJvdy1yYi1zZGs9PTAuMC43OQpyYWluYm93LXJiLWZsYXQtYnVmZmVycz09MC4wLjc5CnJhaW5ib3ctcmItemVub2g9PTAuMC43OQpyZXF1ZXN0cz09Mi4zNC4yCg==","common/tsconfig.json":"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidGFyZ2V0IjogIkVTTmV4dCIsCiAgICAibW9kdWxlIjogIkVTTmV4dCIsCiAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJidW5kbGVyIiwKICAgICJqc3giOiAicmVhY3QtanN4IiwKICAgICJzdHJpY3QiOiB0cnVlLAogICAgInNraXBMaWJDaGVjayI6IHRydWUsCiAgICAibm9FbWl0IjogdHJ1ZSwKICAgICJsaWIiOiBbIkRPTSIsICJET00uSXRlcmFibGUiLCAiRVNOZXh0Il0KICB9LAogICJpbmNsdWRlIjogWyJ1aSJdCn0K","common/ui/content.tsx":"aW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB7CiAgUkJDaGVja0JveCwKICBSQkxhYmVsQnV0dG9uLAogIFJCUmFkaW9Cb3gsCiAgUkJTZWxlY3RCb3gsCiAgUkJTbGlkZXIsCiAgUkJTd2l0Y2gsCiAgUkJUZXh0QXJlYSwKICBSQlRleHRGaWVsZCwKICBSQlRleHRJbnB1dCwKICBPcHRpb24KfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3QiOwppbXBvcnQgeyB1c2VSYiB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aS9zZGsiOwoKdHlwZSBSdW5Nb2RlID0gImluc3BlY3QiIHwgImFzc2lzdCIgfCAiYXV0byI7Cgpjb25zdCBNT0RFX09QVElPTlM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IFJ1bk1vZGUgfT4gPSBbCiAgeyBsYWJlbDogIkluc3BlY3QiLCB2YWx1ZTogImluc3BlY3QiIH0sCiAgeyBsYWJlbDogIkFzc2lzdCIsIHZhbHVlOiAiYXNzaXN0IiB9LAogIHsgbGFiZWw6ICJBdXRvIiwgdmFsdWU6ICJhdXRvIiB9LApdOwoKY29uc3QgVEFTS19PUFRJT05TID0gWwogIHsgbGFiZWw6ICJQdWJsaXNoIHN0YXR1cyIsIHZhbHVlOiAicHVibGlzaCIgfSwKICB7IGxhYmVsOiAiUnVuIGdyaXAgYWN0aW9uIiwgdmFsdWU6ICJncmlwIiB9LAogIHsgbGFiZWw6ICJTYXZlIHNuYXBzaG90IiwgdmFsdWU6ICJzbmFwc2hvdCIgfSwKXTsKCi8vIEV4cG9ydCB5b3VyIFVJIGFzIHRoZSBkZWZhdWx0LiBUaGUgaG9zdCBtb3VudHMgaXQgKGRldjogd2l0aCBITVIpLgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7CiAgY29uc3QgcmIgPSB1c2VSYigpOwogIGNvbnN0IFt0YXJnZXROYW1lLCBzZXRUYXJnZXROYW1lXSA9IHVzZVN0YXRlKCJkZW1vX3RhcmdldCIpOwogIGNvbnN0IFtncmlwVHlwZSwgc2V0R3JpcFR5cGVdID0gdXNlU3RhdGU8c3RyaW5nPigpOwogIGNvbnN0IFtncmlwV2lkdGgsIHNldEdyaXBXaWR0aF0gPSB1c2VTdGF0ZSgyNCk7CiAgY29uc3QgW3NwZWVkLCBzZXRTcGVlZF0gPSB1c2VTdGF0ZSg0NSk7CiAgY29uc3QgW21vZGUsIHNldE1vZGVdID0gdXNlU3RhdGU8UnVuTW9kZT4oImFzc2lzdCIpOwogIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IHVzZVN0YXRlKHRydWUpOwogIGNvbnN0IFt0YXNrcywgc2V0VGFza3NdID0gdXNlU3RhdGU8QXJyYXk8c3RyaW5nPj4oWyJwdWJsaXNoIiwgImdyaXAiXSk7CiAgY29uc3QgW21lbW8sIHNldE1lbW9dID0gdXNlU3RhdGUoIlVzZSB0aGlzIGFyZWEgZm9yIG9wZXJhdG9yIG5vdGVzLiIpOwoKICBjb25zdCBwYXlsb2FkID0gdXNlTWVtbygKICAgICgpID0+ICh7CiAgICAgIHRhcmdldE5hbWUsCiAgICAgIGdyaXBXaWR0aCwKICAgICAgc3BlZWQsCiAgICAgIG1vZGUsCiAgICAgIGVuYWJsZWQsCiAgICAgIHRhc2tzLAogICAgICBtZW1vLAogICAgfSksCiAgICBbdGFyZ2V0TmFtZSwgZ3JpcFdpZHRoLCBzcGVlZCwgbW9kZSwgZW5hYmxlZCwgdGFza3MsIG1lbW9dLAogICk7CgogIGNvbnN0IHNob3dSZXF1ZXN0RXJyb3IgPSAoZXJyb3I6IHVua25vd24pID0+IHsKICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICJSZXF1ZXN0IGZhaWxlZCI7CiAgICByYi50b2FzdCh7IHR5cGU6ICJkYW5nZXIiLCBtZXNzYWdlIH0pOwogIH07CgogIGNvbnN0IHJ1bkFjdGlvbiA9IGFzeW5jICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGF3YWl0IHJiLmFjdGlvbigiZ3JpcCIsIHBheWxvYWQpOwogICAgICByYi50b2FzdCh7IHR5cGU6ICJzdWNjZXNzIiwgbWVzc2FnZTogYFNlbnQgJHt0YXJnZXROYW1lfWAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBzaG93UmVxdWVzdEVycm9yKGVycm9yKTsKICAgIH0KICB9OwoKICBjb25zdCBwdWJsaXNoUHJldmlldyA9IGFzeW5jICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGlzQ29uZmlybSA9IGF3YWl0IHJiLmNvbmZpcm0oewogICAgICAgIG1lc3NhZ2U6ICJBcmUgeW91IHN1cmUgcHVibGlzaD8iLAogICAgICAgIGJ1dHRvblRleHQ6IHsgeWVzOiAiY29uZmlybSIsIG5vOiAiY2FuY2VsIiB9LAogICAgICB9KTsKCiAgICAgIGlmIChpc0NvbmZpcm0pIHsKICAgICAgICBhd2FpdCByYi5wdWIoImV2ZW50IiwgcGF5bG9hZCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHNob3dSZXF1ZXN0RXJyb3IoZXJyb3IpOwogICAgfQogIH07CgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0ibWF4LWgtWzcwdmhdIHctWzQyMHB4XSBwLTQgbWF4LXctZnVsbCBvdmVyZmxvdy15LWF1dG8gYmctYmctZWxldmF0ZWQgdGV4dC1mZy1kZWZhdWx0Ij4KICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZmxleC1jb2wgZ2FwLTUiPgogICAgICAgIDxoZWFkZXI+CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0xMiI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT0idHlwby1oZWFkaW5nLXhzLXNlbWlib2xkIj5EZW1vIENvbnRyb2w8L2gyPgogICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idHlwby1ib2R5LXhzMi1ub3JtYWwgdGV4dC1mZy1zdWJ0bGUiPgogICAgICAgICAgICAgICAgSW5wdXQgcGF0dGVybnMgZm9yIE11c2NhdCBwbHVnaW4gVUlzCiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPFJCU3dpdGNoCiAgICAgICAgICAgICAgY2hlY2tlZD17ZW5hYmxlZH0KICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhuZXh0OiBib29sZWFuKSA9PiB7CiAgICAgICAgICAgICAgICBzZXRFbmFibGVkKG5leHQpOwogICAgICAgICAgICAgICAgcmIudG9hc3Qoe21lc3NhZ2U6IG5leHQgPyAiUGx1Z2luIGVuYWJsZWQiIDogIlBsdWdpbiBwYXVzZWQifSk7CiAgICAgICAgICAgICAgfX0KICAgICAgICAgICAgLz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaGVhZGVyPgoKICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9ImZsZXggZmxleC1jb2wgZ2FwLTQiPgogICAgICAgICAgPFJCVGV4dEZpZWxkCiAgICAgICAgICAgIGxhYmVsPSJUYXJnZXQgbmFtZSIKICAgICAgICAgICAgcmVxdWlyZWQKICAgICAgICAgICAgaGVscGVyVGV4dD0iVXNlZCBhcyB0aGUgYmFja2VuZCBhY3Rpb24gdGFyZ2V0LiIKICAgICAgICAgID4KICAgICAgICAgICAgPFJCVGV4dElucHV0CiAgICAgICAgICAgICAgbmFtZT0idGFyZ2V0TmFtZSIKICAgICAgICAgICAgICB2YWx1ZT17dGFyZ2V0TmFtZX0KICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0idGFyZ2V0IGlkIgogICAgICAgICAgICAgIGhhbmRsZUNoYW5nZT17KHZhbHVlKSA9PiBzZXRUYXJnZXROYW1lKFN0cmluZyh2YWx1ZSkpfQogICAgICAgICAgICAvPgogICAgICAgICAgPC9SQlRleHRGaWVsZD4KCiAgICAgICAgICA8UkJUZXh0RmllbGQgbGFiZWw9IlNlbGVjdCBHcmlwIj4KICAgICAgICAgICAgPFJCU2VsZWN0Qm94ICBjbGFzc05hbWU9InctZnVsbCIgdmFsdWU9e2dyaXBUeXBlfSBoYW5kbGVDaGFuZ2U9e3NldEdyaXBUeXBlfT4KICAgICAgICAgICAgICA8T3B0aW9uIHZhbHVlPSJBIj5BIEdyaXA8L09wdGlvbj4KICAgICAgICAgICAgICA8T3B0aW9uIHZhbHVlPSJCIj5CIEdyaXA8L09wdGlvbj4KICAgICAgICAgICAgPC9SQlNlbGVjdEJveD4KICAgICAgICAgIDwvUkJUZXh0RmllbGQ+CgogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZ2FwLTQiPgogICAgICAgICAgICA8UkJUZXh0RmllbGQgY2xhc3NOYW1lPSJmbGV4LTEiIGxhYmVsPSJHcmlwIHdpZHRoIiBoZWxwZXJUZXh0PSIwLTEwMCBtbSI+CiAgICAgICAgICAgICAgPFJCVGV4dElucHV0CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCIKICAgICAgICAgICAgICAgIG5hbWU9ImdyaXBXaWR0aCIKICAgICAgICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgICAgICAgIHZhbHVlPXtncmlwV2lkdGh9CiAgICAgICAgICAgICAgICB2YWxpZGF0ZT17KHZhbHVlOiBudW1iZXIpID0+CiAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgTnVtYmVyKHZhbHVlKSB8fCAwKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZT17KHZhbHVlKSA9PiBzZXRHcmlwV2lkdGgoTnVtYmVyKHZhbHVlKSB8fCAwKX0KICAgICAgICAgICAgICAvPgogICAgICAgICAgICA8L1JCVGV4dEZpZWxkPgoKICAgICAgICAgICAgPFJCVGV4dEZpZWxkIGNsYXNzTmFtZT0iZmxleC0xIiBsYWJlbD0iU3BlZWQiIGhlbHBlclRleHQ9e2Ake3NwZWVkfSVgfT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgcHgtMiI+CiAgICAgICAgICAgICAgICA8UkJTbGlkZXIKICAgICAgICAgICAgICAgICAgdmFsdWU9e1tzcGVlZF19CiAgICAgICAgICAgICAgICAgIG1pbj17MH0KICAgICAgICAgICAgICAgICAgbWF4PXsxMDB9CiAgICAgICAgICAgICAgICAgIHN0ZXA9ezV9CiAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZXM6IG51bWJlcltdKSA9PgogICAgICAgICAgICAgICAgICAgIHNldFNwZWVkKHZhbHVlc1swXSA/PyAwKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L1JCVGV4dEZpZWxkPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9Im1iLTQiPgogICAgICAgICAgPFJCVGV4dEZpZWxkIGxhYmVsPSJSdW4gbW9kZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItMSBib3JkZXItYm9yZGVyLXN1YnRsZSByb3VuZGVkLXNtIHAtMiI+CiAgICAgICAgICAgIHtNT0RFX09QVElPTlMubWFwKChpdGVtKSA9PiAoCiAgICAgICAgICAgICAgPFJCUmFkaW9Cb3gKICAgICAgICAgICAgICAgIGtleT17aXRlbS52YWx1ZX0KICAgICAgICAgICAgICAgIG5hbWU9Im1vZGUiCiAgICAgICAgICAgICAgICBjaGVja1ZhbHVlPXtpdGVtLnZhbHVlfQogICAgICAgICAgICAgICAgdmFsdWU9e21vZGV9CiAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2U9eyh2YWx1ZSkgPT4gc2V0TW9kZSh2YWx1ZSBhcyBSdW5Nb2RlKX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICB7aXRlbS5sYWJlbH0KICAgICAgICAgICAgICA8L1JCUmFkaW9Cb3g+CiAgICAgICAgICAgICkpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L1JCVGV4dEZpZWxkPgogICAgICAgIDwvc2VjdGlvbj4KCiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPSJtYi00Ij4KICAgICAgICAgIDxSQlRleHRGaWVsZCBsYWJlbD0iVGFza3MiPgogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLTEgYm9yZGVyLWJvcmRlci1zdWJ0bGUgcm91bmRlZC1zbSBwLTIiPgogICAgICAgICAgICAgIHtUQVNLX09QVElPTlMubWFwKChpdGVtKSA9PiAoCiAgICAgICAgICAgICAgICA8UkJDaGVja0JveAogICAgICAgICAgICAgICAgICBrZXk9e2l0ZW0udmFsdWV9CiAgICAgICAgICAgICAgICAgIG5hbWU9InRhc2tzIgogICAgICAgICAgICAgICAgICBjaGVja1ZhbHVlPXtpdGVtLnZhbHVlfQogICAgICAgICAgICAgICAgICB2YWx1ZT17dGFza3N9CiAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZT17KHZhbHVlKSA9PgogICAgICAgICAgICAgICAgICAgIHNldFRhc2tzKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKFN0cmluZykgOiBbXSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICB7aXRlbS5sYWJlbH0KICAgICAgICAgICAgICAgIDwvUkJDaGVja0JveD4KICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L1JCVGV4dEZpZWxkPgogICAgICAgICAgCiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8UkJUZXh0RmllbGQgbGFiZWw9Ik1lbW8iPgogICAgICAgICAgPFJCVGV4dEFyZWEKICAgICAgICAgICAgbmFtZT0ibWVtbyIKICAgICAgICAgICAgdmFsdWU9e21lbW99CiAgICAgICAgICAgIG1heExlbmd0aD17MTIwfQogICAgICAgICAgICByb3dzPXs0fQogICAgICAgICAgICBoYW5kbGVDaGFuZ2U9e3NldE1lbW99CiAgICAgICAgICAvPgogICAgICAgIDwvUkJUZXh0RmllbGQ+CgogICAgICAgIDxmb290ZXIgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIGdhcC04IHB0LTQiPgogICAgICAgICAgPFJCTGFiZWxCdXR0b24gdmFyaWFudD0ib3V0bGluZWQiIG9uQ2xpY2s9e3B1Ymxpc2hQcmV2aWV3fT4KICAgICAgICAgICAgUHVibGlzaAogICAgICAgICAgPC9SQkxhYmVsQnV0dG9uPgogICAgICAgICAgPFJCTGFiZWxCdXR0b24gb25DbGljaz17cnVuQWN0aW9ufSBkaXNhYmxlZD17IWVuYWJsZWR9PgogICAgICAgICAgICBSdW4gQWN0aW9uCiAgICAgICAgICA8L1JCTGFiZWxCdXR0b24+CiAgICAgICAgPC9mb290ZXI+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgKTsKfQo=","common/ui/style.css":"QGxheWVyIHRoZW1lLCB1dGlsaXRpZXM7CgpAaW1wb3J0ICJ0YWlsd2luZGNzcy90aGVtZS5jc3MiIGxheWVyKHRoZW1lKTsKQGltcG9ydCAidGFpbHdpbmRjc3MvdXRpbGl0aWVzLmNzcyIgbGF5ZXIodXRpbGl0aWVzKTsKCkBzb3VyY2UgIi4vKiovKi57dHMsdHN4fSI7Cg==","common/vite.config.ts":"aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKLy8gVGhlIG11c2NhdCgpIHByZXNldCB3aXJlcyByZWFjdC1yZWZyZXNoLCB1aS8gZW50cnkgZGlzY292ZXJ5LCBhbmQgbWFya3MgdGhlCi8vIGhvc3QtcHJvdmlkZWQgcnVudGltZSAocGx1Z2luLXVpLCByZWFjdCkgYXMgZXh0ZXJuYWwuIEFkZCB5b3VyIG93biBwbHVnaW5zIG9yCi8vIG92ZXJyaWRlcyBoZXJlIGFzIG5lZWRlZC4KZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbdGFpbHdpbmRjc3MoKSwgbXVzY2F0KCldLAp9KTsK","cpp/cpp/CMakeLists.txt":"Y21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMTYpCnByb2plY3QoX19QTFVHSU5fU0xVR19fIENYWCkKCnNldChDTUFLRV9DWFhfU1RBTkRBUkQgMTcpCnNldChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQgT04pCgojIFRoZSBleGVjdXRhYmxlIG5hbWUgbXVzdCBtYXRjaCBydW50aW1lLmVudHJ5IGluIG1hbmlmZXN0Lmpzb24uCmFkZF9leGVjdXRhYmxlKF9fUExVR0lOX1NMVUdfXyBtYWluLmNwcCkKCiMgVE9ETyhjcHAtc2RrKTogbGluayB0aGUgcmFpbmJvdyBjcHAgU0RLIGR5bmFtaWNhbGx5ICh0aGUgcm9ib3QgcHJvdmlkZXMgdGhlCiMgLnNvIGF0IHJ1bnRpbWUg4oCUIGRvIE5PVCBidW5kbGUvc3RhdGljLWxpbmsgaXQpLiBPbmNlIHRoZSBTREsgc2hpcHMgYW4gYXB0CiMgcGFja2FnZSB3aXRoIENNYWtlIGNvbmZpZywgZW5hYmxlOgojICAgZmluZF9wYWNrYWdlKHJhaW5ib3dfY3BwX3NkayBSRVFVSVJFRCkKIyAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhfX1BMVUdJTl9TTFVHX18gUFJJVkFURSByYWluYm93OjpjcHBfc2RrKQo=","cpp/cpp/main.cpp":"Ly8gX19QTFVHSU5fTkFNRV9fIOKAlCBDKysgcGx1Z2luIGJhY2sgZW5kLgovLwovLyBUaGUgQysrIHBsdWdpbiBTREsgaXMgbm90IGF2YWlsYWJsZSB5ZXQsIHNvIHRoaXMgaXMgYSBidWlsZC9ydW4gc2tlbGV0b24uCi8vIE9uY2UgdGhlIFNESyBsYW5kcywgY29ubmVjdCB0byB0aGUgcGx1Z2luIGdhdGV3YXkgaGVyZSAodGhlIGhvc3QgZXhwb3NlcyBpdAovLyBhdCB0aGUgUkJfUExVR0lOX0dBVEVXQVkgLyBSQl9QTFVHSU5fSUQgZW52aXJvbm1lbnQgdmFyaWFibGVzKSBhbmQgd2lyZSB1cAovLyBwdWIgLyBzdWIgLyBzZXJ2ZSwgbWlycm9yaW5nIHRoZSBQeXRob24gcmFpbmJvdy5yYl9zZGsuUkJQbHVnaW5DYWxsIEFQSS4KCiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0aHJlYWQ+CgppbnQgbWFpbigpIHsKICBjb25zdCBjaGFyKiBwbHVnaW5faWQgPSBzdGQ6OmdldGVudigiUkJfUExVR0lOX0lEIik7CiAgc3RkOjpjb3V0IDw8ICJbX19QTFVHSU5fTkFNRV9fXSBiYWNrZW5kIHJlYWR5IgogICAgICAgICAgICA8PCAocGx1Z2luX2lkID8gc3RkOjpzdHJpbmcoIiAoaWQ9IikgKyBwbHVnaW5faWQgKyAiKSIgOiAiIikKICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICAvLyBUT0RPOiBjb25uZWN0IHRvIHRoZSBwbHVnaW4gZ2F0ZXdheSBhbmQgcmVnaXN0ZXIgaGFuZGxlcnMgb25jZSB0aGUKICAvLyAgICAgICBDKysgU0RLIGlzIGF2YWlsYWJsZS4gRm9yIG5vdywganVzdCBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlLgogIHdoaWxlICh0cnVlKSB7CiAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwogIH0KICByZXR1cm4gMDsKfQo=","ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/__init__.py":"","ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py":"aW1wb3J0IHJjbHB5CmZyb20gcmNscHkubm9kZSBpbXBvcnQgTm9kZQpmcm9tIHJhaW5ib3cucmJfc2RrIGltcG9ydCBSQk1hbmlwdWxhdGVTREsgICMgUHlQSTogcmFpbmJvdy1yYi1zZGsKCgpzZGsgPSBSQk1hbmlwdWxhdGVTREsoKQoKCmNsYXNzIF9fUExVR0lOX0NMQVNTX19Ob2RlKE5vZGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oIl9fUExVR0lOX1NMVUdfX19ub2RlIikKICAgICAgICBzZWxmLmdldF9sb2dnZXIoKS5pbmZvKCJfX1BMVUdJTl9OQU1FX18gbm9kZSBzdGFydGVkIikKICAgICAgICAjIHNkayBpcyBhdmFpbGFibGUgaGVyZSDigJQgdXNlIGl0IGFsb25nc2lkZSBST1MyIHRvcGljcyBhcyBuZWVkZWQKCgpkZWYgbWFpbihhcmdzPU5vbmUpOgogICAgcmNscHkuaW5pdChhcmdzPWFyZ3MpCiAgICBub2RlID0gX19QTFVHSU5fQ0xBU1NfX05vZGUoKQogICAgcmNscHkuc3Bpbihub2RlKQogICAgbm9kZS5kZXN0cm95X25vZGUoKQogICAgcmNscHkuc2h1dGRvd24oKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK","ros2/ros2_ws/src/__PLUGIN_SLUG__/package.xml":"PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxwYWNrYWdlIGZvcm1hdD0iMyI+CiAgPG5hbWU+X19QTFVHSU5fU0xVR19fPC9uYW1lPgogIDx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgogIDxkZXNjcmlwdGlvbj5fX1BMVUdJTl9OQU1FX18gUk9TMiBub2RlPC9kZXNjcmlwdGlvbj4KICA8bWFpbnRhaW5lciBlbWFpbD0idG9kb0BleGFtcGxlLmNvbSI+bWFpbnRhaW5lcjwvbWFpbnRhaW5lcj4KICA8bGljZW5zZT5Qcm9wcmlldGFyeTwvbGljZW5zZT4KICA8ZGVwZW5kPnJjbHB5PC9kZXBlbmQ+CiAgPGV4cG9ydD48YnVpbGRfdHlwZT5hbWVudF9weXRob248L2J1aWxkX3R5cGU+PC9leHBvcnQ+CjwvcGFja2FnZT4K","ros2/ros2_ws/src/__PLUGIN_SLUG__/resource/__PLUGIN_SLUG__":"","ros2/ros2_ws/src/__PLUGIN_SLUG__/setup.py":"ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKcGFja2FnZV9uYW1lID0gIl9fUExVR0lOX1NMVUdfXyIKCnNldHVwKAogICAgbmFtZT1wYWNrYWdlX25hbWUsCiAgICB2ZXJzaW9uPSIwLjAuMSIsCiAgICBwYWNrYWdlcz1bcGFja2FnZV9uYW1lXSwKICAgIGRhdGFfZmlsZXM9WwogICAgICAgICgic2hhcmUvYW1lbnRfaW5kZXgvcmVzb3VyY2VfaW5kZXgvcGFja2FnZXMiLCBbInJlc291cmNlLyIgKyBwYWNrYWdlX25hbWVdKSwKICAgICAgICAoInNoYXJlLyIgKyBwYWNrYWdlX25hbWUsIFsicGFja2FnZS54bWwiXSksCiAgICBdLAogICAgaW5zdGFsbF9yZXF1aXJlcz1bInNldHVwdG9vbHMiXSwKICAgIHppcF9zYWZlPVRydWUsCiAgICBlbnRyeV9wb2ludHM9ewogICAgICAgICJjb25zb2xlX3NjcmlwdHMiOiBbIl9fUExVR0lOX1NMVUdfX19ub2RlID0gX19QTFVHSU5fU0xVR19fLm5vZGU6bWFpbiJdLAogICAgfSwKKQo=","ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt":"Y21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMTYpCnByb2plY3QoX19QTFVHSU5fU0xVR19fKQoKaWYoTk9UIENNQUtFX0NYWF9TVEFOREFSRCkKICBzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEIDE3KQplbmRpZigpCgpmaW5kX3BhY2thZ2UoYW1lbnRfY21ha2UgUkVRVUlSRUQpCmZpbmRfcGFja2FnZShyY2xjcHAgUkVRVUlSRUQpCgphZGRfZXhlY3V0YWJsZShfX1BMVUdJTl9TTFVHX19fbm9kZSBzcmMvbm9kZS5jcHApCmFtZW50X3RhcmdldF9kZXBlbmRlbmNpZXMoX19QTFVHSU5fU0xVR19fX25vZGUgcmNsY3BwKQoKaW5zdGFsbChUQVJHRVRTIF9fUExVR0lOX1NMVUdfX19ub2RlCiAgREVTVElOQVRJT04gbGliLyR7UFJPSkVDVF9OQU1FfSkKCmFtZW50X3BhY2thZ2UoKQo=","ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml":"PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxwYWNrYWdlIGZvcm1hdD0iMyI+CiAgPG5hbWU+X19QTFVHSU5fU0xVR19fPC9uYW1lPgogIDx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgogIDxkZXNjcmlwdGlvbj5fX1BMVUdJTl9OQU1FX18gUk9TMiBub2RlIChyY2xjcHApPC9kZXNjcmlwdGlvbj4KICA8bWFpbnRhaW5lciBlbWFpbD0idG9kb0BleGFtcGxlLmNvbSI+bWFpbnRhaW5lcjwvbWFpbnRhaW5lcj4KICA8bGljZW5zZT5Qcm9wcmlldGFyeTwvbGljZW5zZT4KICA8YnVpbGR0b29sX2RlcGVuZD5hbWVudF9jbWFrZTwvYnVpbGR0b29sX2RlcGVuZD4KICA8ZGVwZW5kPnJjbGNwcDwvZGVwZW5kPgogIDxleHBvcnQ+PGJ1aWxkX3R5cGU+YW1lbnRfY21ha2U8L2J1aWxkX3R5cGU+PC9leHBvcnQ+CjwvcGFja2FnZT4K","ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp":"Ly8gX19QTFVHSU5fTkFNRV9fIOKAlCBST1MyIG5vZGUgKHJjbGNwcCkuCi8vCi8vIFRoZSBub2RlIGlzIGxhdW5jaGVkIHdpdGggYC0tcm9zLWFyZ3MgLXIgX19uczo9L3tzbHVnfWAgYXV0b21hdGljYWxseSBieQovLyBkZXY6YmFjay4gUk9TMiB0b3BpY3MgYXJlIGJyaWRnZWQgdG8gdGhlIHBsdWdpbiBjb21tdW5pY2F0aW9uIGxheWVyLCBzbyBhCi8vIHBsYWluIHJjbGNwcCBub2RlIGlzIGFsbCB5b3UgbmVlZCDigJQgcmVsYXRpdmUgdG9waWMgbmFtZXMgZ2V0IHRoZSBuYW1lc3BhY2UKLy8gcHJlZml4IGFwcGxpZWQgYXV0b21hdGljYWxseS4KI2luY2x1ZGUgInJjbGNwcC9yY2xjcHAuaHBwIgoKY2xhc3MgX19QTFVHSU5fQ0xBU1NfX05vZGUgOiBwdWJsaWMgcmNsY3BwOjpOb2RlIHsKcHVibGljOgogIF9fUExVR0lOX0NMQVNTX19Ob2RlKCkgOiBOb2RlKCJfX1BMVUdJTl9TTFVHX19fbm9kZSIpIHsKICAgIFJDTENQUF9JTkZPKHRoaXMtPmdldF9sb2dnZXIoKSwgIl9fUExVR0lOX05BTUVfXyBub2RlIHN0YXJ0ZWQiKTsKICAgIC8vIGNyZWF0ZSBwdWJsaXNoZXJzIC8gc3Vic2NyaWJlcnMgLyBzZXJ2aWNlcyBoZXJlCiAgfQp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgcmNsY3BwOjppbml0KGFyZ2MsIGFyZ3YpOwogIHJjbGNwcDo6c3BpbihzdGQ6Om1ha2Vfc2hhcmVkPF9fUExVR0lOX0NMQVNTX19Ob2RlPigpKTsKICByY2xjcHA6OnNodXRkb3duKCk7CiAgcmV0dXJuIDA7Cn0K","docker/Dockerfile.bridge":"IyBTb2NrZXQuSU8gYnJpZGdlIGNvbnRhaW5lciDigJQgdGhlIGZyb250ZW5kIChwcmV2aWV3LWhvc3QpIGFuZCB0aGUgYmFja2VuZAojIGNvbnRhaW5lciByZW5kZXp2b3VzIGhlcmUgZHVyaW5nIGBtdXNjYXQtcGsgZGV2YC4KIyAgIC0gZnJvbnRlbmQgKGhvc3QpICDihpIgcHVibGlzaGVkIHBvcnQgbG9jYWxob3N0OjEwMDAwCiMgICAtIGJhY2tlbmQgY29udGFpbmVyIOKGkiBzaGFyZXMgdGhpcyBjb250YWluZXIncyBuZXRucyAoLS1uZXR3b3JrIGNvbnRhaW5lcjopLAojICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGl0IHJlYWNoZXMgdGhlIGJyaWRnZSBhdCBsb2NhbGhvc3Q6MTAwMDAgdG9vCiMgQnVpbGQgY29udGV4dCBpcyB0aGUgYGNsaS9gIGRpciBzbyBpdCBjYW4gY29weSBzcmMvc29ja2V0QnJpZGdlLm1qcy4KRlJPTSBub2RlOjIwLXNsaW0KTEFCRUwgY29tLnJhaW5ib3ctcm9ib3RpY3MubXVzY2F0LXBrPSJ0cnVlIgoKV09SS0RJUiAvYnJpZGdlCkNPUFkgZG9ja2VyL2JyaWRnZS1wYWNrYWdlLmpzb24gcGFja2FnZS5qc29uClJVTiBucG0gaW5zdGFsbCAtLW9taXQ9ZGV2IC0tbm8tYXVkaXQgLS1uby1mdW5kCgpDT1BZIHNyYy9zb2NrZXRCcmlkZ2UubWpzIC4vc29ja2V0QnJpZGdlLm1qcwoKRVhQT1NFIDEwMDAwCkNNRCBbIm5vZGUiLCAic29ja2V0QnJpZGdlLm1qcyJdCg==","docker/Dockerfile.cpp":"IyBEZXYvYnVpbGQgY29udGFpbmVyIGZvciB0aGUgcHVyZSBDKysgcGx1Z2luIGJhY2sgZW5kLgojIE1hdGNoZXMgdGhlIE11c2NhdCByb2JvdCBiYWNrZW5kIE9TIChVYnVudHUgMjQuMDQpIHNvIHRoZSBjb21waWxlZCBiaW5hcnkKIyBpcyBBQkktY29tcGF0aWJsZSB3aXRoIHRoZSByb2JvdC4gVXNlZCBieSBgbXVzY2F0LXBrIGRldjpiYWNrYCBhbmQgYGJ1aWxkYAojIOKAlCBOT1Qgc2hpcHBlZCBpbiB0aGUgcGx1Z2luIFpJUC4KRlJPTSB1YnVudHU6MjQuMDQKTEFCRUwgY29tLnJhaW5ib3ctcm9ib3RpY3MubXVzY2F0LXBrPSJ0cnVlIgoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCiAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCiAgICAgIGNtYWtlIFwKICAgICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKIyBUT0RPKGNwcC1zZGspOiBpbnN0YWxsIHRoZSByYWluYm93IGNwcCBTREsgKGRldiBwYWNrYWdlKSBoZXJlLCBwaW5uZWQgdG8gdGhlCiMgcm9ib3QncyB2ZXJzaW9uLCBzbyBwbHVnaW5zIGJ1aWxkL2xpbmsgYWdhaW5zdCB0aGUgc2FtZSBTREsgYXMgcHJvZHVjdGlvbi4KIyBQbGFuOiBhcHQgcGFja2FnZSArIGR5bmFtaWMgbGluayAodGhlIHJvYm90IHByb3ZpZGVzIHRoZSAuc28gYXQgcnVudGltZTsKIyB3ZSBkbyBOT1QgYnVuZGxlIGl0IGludG8gdGhlIHBsdWdpbiBiaW5hcnkpLiBlLmcuOgojICAgUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSByYWluYm93LWNwcC1zZGstZGV2PTxyb2JvdC12ZXJzaW9uPiBcCiMgICAgICAgJiYgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qCgpXT1JLRElSIC9wbHVnaW4KCkNNRCBbImJhc2giXQo=","docker/Dockerfile.dev":"IyBEZXYtb25seSBjb250YWluZXIgZm9yIHRoZSBST1MyIHBsdWdpbiBiYWNrIGVuZC4KIyBNYXRjaGVzIHRoZSBNdXNjYXQgcm9ib3QgYmFja2VuZDogUk9TMiBKYXp6eSArIFB5dGhvbiAzLjEyIChVYnVudHUgMjQuMDQpLgojIFVzZWQgYnkgYG11c2NhdC1wayBkZXY6YmFja2Ag4oCUIE5PVCBzaGlwcGVkIGluIHRoZSBwbHVnaW4gWklQLgpGUk9NIHJvczpqYXp6eS1yb3MtYmFzZQpMQUJFTCBjb20ucmFpbmJvdy1yb2JvdGljcy5tdXNjYXQtcGs9InRydWUiCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKICAgICAgcHl0aG9uMy1waXAgXAogICAgICBweXRob24zLWNvbGNvbi1jb21tb24tZXh0ZW5zaW9ucyBcCiAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCldPUktESVIgL3BsdWdpbgoKQ01EIFsiYmFzaCJdCg==","docker/Dockerfile.python":"IyBEZXYvYnVpbGQgY29udGFpbmVyIGZvciB0aGUgUHl0aG9uIHBsdWdpbiBiYWNrIGVuZC4KIyBNYXRjaGVzIHRoZSBNdXNjYXQgcm9ib3QgYmFja2VuZDogVWJ1bnR1IDI0LjA0ICsgUHl0aG9uIDMuMTIuCiMgVXNlZCBieSBgbXVzY2F0LXBrIGRldjpiYWNrYCAoaG90LXJlbG9hZCkgYW5kIGBtdXNjYXQtcGsgYnVpbGRgIChsb2NrICsgd2hlZWwgdmVuZG9yKS4KIyBOT1Qgc2hpcHBlZCBpbiB0aGUgcGx1Z2luIFpJUCDigJQgdGhlIHJvYm90IGluc3RhbGxzIGRlcHMgZnJvbSBkaXN0L3doZWVscy8gb2ZmbGluZS4KRlJPTSB1YnVudHU6MjQuMDQKTEFCRUwgY29tLnJhaW5ib3ctcm9ib3RpY3MubXVzY2F0LXBrPSJ0cnVlIgoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCiAgICAgIHB5dGhvbjMgXAogICAgICBweXRob24zLXBpcCBcCiAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogXAogICAgJiYgcGlwMyBpbnN0YWxsIHV2PT0wLjguMTggLS1icmVhay1zeXN0ZW0tcGFja2FnZXMKCiMgVE9ETyhjcHAtc2RrKTogdGhlIFB5dGhvbiBTREsgaXMgYSBweWJpbmQgd3JhcHBlciBvdmVyIHRoZSBjcHAgU0RLLCBzbyB0aGUKIyBjcHAgU0RLIHNoYXJlZCBsaWIgbXVzdCBiZSBwcmVzZW50IGZvciB0aGUgcHl0aG9uIG1vZHVsZSB0byBsb2FkLiBJbnN0YWxsIHRoZQojIHJhaW5ib3cgY3BwIFNESyAoYXB0LCBwaW5uZWQgdG8gdGhlIHJvYm90J3MgdmVyc2lvbikgaGVyZSBvbmNlIGl0IGV4aXN0cy4KCldPUktESVIgL3BsdWdpbgoKQ01EIFsiYmFzaCJdCg==","docker/bridge-package.json":"ewogICJuYW1lIjogIm11c2NhdC1way1icmlkZ2UiLAogICJwcml2YXRlIjogdHJ1ZSwKICAidHlwZSI6ICJtb2R1bGUiLAogICJkZXBlbmRlbmNpZXMiOiB7CiAgICAic29ja2V0LmlvIjogIl40LjguMSIKICB9Cn0K"};
3
+ export const TEMPLATES = {"common/.mcp.json":"ewogICJtY3BTZXJ2ZXJzIjogewogICAgIm11c2NhdCI6IHsKICAgICAgImNvbW1hbmQiOiAibXVzY2F0LXBrIiwKICAgICAgImFyZ3MiOiBbIm1jcCJdCiAgICB9CiAgfQp9Cg==","common/README.md":"IyBfX1BMVUdJTl9OQU1FX18KCkEgTXVzY2F0IHBsdWdpbiBwcm9qZWN0LiBCdWlsZCwgZGV2ZWxvcCwgYW5kIHNoaXAgd2l0aCBgbXVzY2F0LXBrYCBDTEkuCgojIyBRdWljayBzdGFydAoKYGBgYmFzaAptdXNjYXQtcGsgZGV2ICAgICAgICAjIFVJIHByZXZpZXcgKyBiYWNrZW5kIHRvZ2V0aGVyCm11c2NhdC1wayBkZXY6dWkgICAgICMgVUkgcHJldmlldyBvbmx5Cm11c2NhdC1wayBkZXY6YmFjayAgICMgYmFja2VuZCBvbmx5IChQeXRob24gd2F0Y2hmaWxlcyAvIFJPUzIgRG9ja2VyKQptdXNjYXQtcGsgYnVpbGQgICAgICAjIGJ1aWxkICsgZGlzdHJpYnV0YWJsZSBaSVAKYGBgCgotLS0KCiMjIFByb2plY3Qgc3RydWN0dXJlCgpgYGAKX19QTFVHSU5fRElSX18vCuKUnOKUgCB1aS8K4pSCICAg4pSc4pSAIGNvbnRlbnQudHN4ICAgICAgIyBwbHVnaW4gVUkgZW50cnkgcG9pbnQK4pSCICAg4pSU4pSAIHN0eWxlLmNzcyAgICAgICAgIyBwbHVnaW4gc3R5bGVzIGF1dG8tbG9hZGVkIGJ5IG11c2NhdCgpCuKUnOKUgCBweS8K4pSCICAg4pSU4pSAIG1haW4ucHkgICAgICAgICAgIyBQeXRob24gYmFja2VuZCBlbnRyeSBwb2ludArilJzilIAgYXNzZXRzLwrilIIgICDilJTilIAgaWNvbi5zdmcgICAgICAgICAjIGljb24gcmVmZXJlbmNlZCBmcm9tIG1hbmlmZXN0CuKUnOKUgCBtYW5pZmVzdC5qc29uICAgICAgICAjIG1ldGFkYXRhLCBjb250cmlidXRpb24gcG9pbnRzLCBydW50aW1lIGNvbmZpZwrilJzilIAgUkVBRE1FLm1kICAgICAgICAgICAgIyB0aGlzIGZpbGUgKGNvcGllZCB0byBkaXN0LyBvbiBidWlsZCkK4pSU4pSAIHJlcXVpcmVtZW50cy50eHQgICAgICMgUHl0aG9uIGRlcHMgKGF1dG8tcGlubmVkIHRvIGxhdGVzdCBvbiBidWlsZCkKYGBgCgo+IFJPUzIgcGx1Z2lucyBhZGRpdGlvbmFsbHkgaW5jbHVkZSBhIGByb3MyX3dzL2AgZGlyZWN0b3J5LgoKLS0tCgojIyBGcm9udGVuZCAoYHVpL2NvbnRlbnQudHN4YCkKCiMjIyBKYXZhU2NyaXB0IGRlcGVuZGVuY2llcwoKYG11c2NhdC1wayBidWlsZGAgcnVucyB0aGlzIHBsdWdpbiBwcm9qZWN0J3Mgb3duIFZpdGUgYnVpbGQuIFZpdGUgcmVzb2x2ZXMKaW1wb3J0cyBmcm9tIGluc3RhbGxlZCBgbm9kZV9tb2R1bGVzYDsgaXQgZG9lcyBub3QgY2FyZSB3aGV0aGVyIGEgcGFja2FnZSBpcwpsaXN0ZWQgdW5kZXIgYGRlcGVuZGVuY2llc2Agb3IgYGRldkRlcGVuZGVuY2llc2AsIGJ1dCB0aGUgcGFja2FnZSBtdXN0IGJlCmluc3RhbGxlZC4KCkRvIG5vdCBydW4gYSBwcm9kdWN0aW9uLW9ubHkgaW5zdGFsbCBzdWNoIGFzIGBucG0gaW5zdGFsbCAtLW9taXQ9ZGV2YCBiZWZvcmUKYnVpbGRpbmcgdGhlIHBsdWdpbiBVSSwgYmVjYXVzZSBidWlsZCB0b29scyBsaWtlIGB2aXRlYCwgYHR5cGVzY3JpcHRgLApgdGFpbHdpbmRjc3NgLCBgQHRhaWx3aW5kY3NzL3ZpdGVgLCBgc2Fzc2AsIG9yIGBsZXNzYCBhcmUgdXN1YWxseQpgZGV2RGVwZW5kZW5jaWVzYC4KClRoZSBzY2FmZm9sZCBrZWVwcyB0aGlzIHNwbGl0OgoKfCBwYWNrYWdlIGtpbmQgfCBleGFtcGxlcyB8IHdoeSB8CnwtLS18LS0tfC0tLXwKfCBgZGVwZW5kZW5jaWVzYCB8IGBAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWlgLCBVSSBsaWJyYXJpZXMgaW1wb3J0ZWQgYnkgcGx1Z2luIHNvdXJjZSB8IEF1dGhvci1mYWNpbmcgQVBJcyB1c2VkIGJ5IGB1aS8qLnRzeGAgfAp8IGBkZXZEZXBlbmRlbmNpZXNgIHwgYHZpdGVgLCBgdHlwZXNjcmlwdGAsIGB0YWlsd2luZGNzc2AsIGBAdGFpbHdpbmRjc3Mvdml0ZWAsIGBzYXNzYCwgYGxlc3NgIHwgQnVpbGQvZGV2IHRvb2xzIG5lZWRlZCBiZWZvcmUgYGRpc3QvKi5qc2AgaXMgcHJvZHVjZWQgfAoKVGhlIGJ1aWx0IHBsdWdpbiBaSVAgZG9lcyBub3QgaW5jbHVkZSBgcGFja2FnZS5qc29uYCBvciBgbm9kZV9tb2R1bGVzYC4gRm9yCnByb2R1Y3Rpb24sIE11c2NhdCBwcm92aWRlcyBgQHJhaW5ib3ctcm9ib3RpY3MvcGx1Z2luLXVpYCwgUmVhY3QsIGFuZCBSZWFjdERPTQp0aHJvdWdoIHRoZSBob3N0IGltcG9ydCBtYXA7IHBsdWdpbiBVSSBidWlsZCBvdXRwdXQgaW1wb3J0cyB0aG9zZSBhcyBob3N0CmV4dGVybmFscy4KCiMjIyBTdHlsZXMKCmBtdXNjYXQoKWAgYXV0b21hdGljYWxseSBsb2FkcyBgdWkvc3R5bGUue2NzcyxzY3NzLHNhc3MsbGVzc31gIChvcgpgdWkvc3R5bGVzLntjc3Msc2NzcyxzYXNzLGxlc3N9YCkgZm9yIGV2ZXJ5IFVJIGVudHJ5LCBwbHVzCmB1aS97ZW50cnl9Lntjc3Msc2NzcyxzYXNzLGxlc3N9YCBmb3IgYSBtYXRjaGluZyBlbnRyeS1zcGVjaWZpYyBzdHlsZXNoZWV0LiBZb3UKZG8gbm90IG5lZWQgdG8gaW1wb3J0IENTUyBmcm9tIGV2ZXJ5IGAudHN4YCBmaWxlLgoKVGhlIHNjYWZmb2xkIHVzZXMgVGFpbHdpbmQncyB0aGVtZS91dGlsaXRpZXMgbGF5ZXJzIG9ubHksIHNvIHBsdWdpbiB1dGlsaXRpZXMKYXJlIGdlbmVyYXRlZCBmcm9tIGZpbGVzIHVuZGVyIGB1aS9gIHdpdGhvdXQgYXBwbHlpbmcgVGFpbHdpbmQgcHJlZmxpZ2h0IHJlc2V0cwp0byB0aGUgaG9zdCBwYWdlLgoKQnVpbHQgQ1NTIHNlbGVjdG9ycyBhcmUgc2NvcGVkIHVuZGVyIHRoZSBjdXJyZW50IHBsdWdpbiBpZAooYFtkYXRhLW11c2NhdC1wbHVnaW4taWQ9Ii4uLiJdYCkuIENTUy1pbi1KUyBsaWJyYXJpZXMgc3VjaCBhcyBFbW90aW9uIHdvcmsKbm9ybWFsbHksIGJ1dCBnbG9iYWwgc3R5bGVzIHNob3VsZCBiZSBzY29wZWQgYnkgdGhlIGF1dGhvci4KCiMjIyMgVGFpbHdpbmQKClRoaXMgdGVtcGxhdGUgZW5hYmxlcyBUYWlsd2luZCBpbiBgdml0ZS5jb25maWcudHNgOgoKYGBgdHMKaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbdGFpbHdpbmRjc3MoKSwgbXVzY2F0KCldLAp9KTsKYGBgCgpUaGUgZGVmYXVsdCBgdWkvc3R5bGUuY3NzYCB1c2VzIFRhaWx3aW5kIHRoZW1lL3V0aWxpdGllcyBvbmx5LCBub3QgcHJlZmxpZ2h0OgoKYGBgY3NzCkBsYXllciB0aGVtZSwgdXRpbGl0aWVzOwoKQGltcG9ydCAidGFpbHdpbmRjc3MvdGhlbWUuY3NzIiBsYXllcih0aGVtZSk7CkBpbXBvcnQgInRhaWx3aW5kY3NzL3V0aWxpdGllcy5jc3MiIGxheWVyKHV0aWxpdGllcyk7CgpAc291cmNlICIuLyoqLyoue3RzLHRzeH0iOwpgYGAKCiMjIyMgU0NTUywgU2FzcywgYW5kIExlc3MKCkluc3RhbGwgdGhlIHByZXByb2Nlc3NvciBwYWNrYWdlLCB0aGVuIGNyZWF0ZSBvbmUgb2YgdGhlIGF1dG8tbG9hZGVkIHN0eWxlIGZpbGVzLgoKYGBgYmFzaApucG0gaSAtRCBzYXNzCmBgYAoKYGBgc2NzcwovKiB1aS9zdHlsZS5zY3NzICovCiRhY2NlbnQ6ICMzYjgyZjY7CgoucGFuZWwgewogIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAkYWNjZW50IDQwJSwgdHJhbnNwYXJlbnQpOwoKICAmX190aXRsZSB7CiAgICBjb2xvcjogJGFjY2VudDsKICB9Cn0KYGBgCgpGb3IgTGVzcywgaW5zdGFsbCBgbGVzc2AgYW5kIHVzZSBgdWkvc3R5bGUubGVzc2AuCgojIyMjIEVtb3Rpb24KCkVtb3Rpb24gZGVwZW5kZW5jaWVzIG1heSBiZSBpbiBgZGVwZW5kZW5jaWVzYCBvciBgZGV2RGVwZW5kZW5jaWVzYDsgVml0ZSBjYW4KYnVuZGxlIHRoZW0gd2hlbiB0aGV5IGFyZSBpbnN0YWxsZWQgYW5kIGltcG9ydGVkIGJ5IHRoZSBwbHVnaW4uCgpGb3IgYHN0eWxlZGAsIG5vIFZpdGUgY29uZmlnIGNoYW5nZSBpcyBuZWVkZWQ6CgpgYGBiYXNoCm5wbSBpIEBlbW90aW9uL3JlYWN0IEBlbW90aW9uL3N0eWxlZApgYGAKCmBgYHRzeAppbXBvcnQgc3R5bGVkIGZyb20gIkBlbW90aW9uL3N0eWxlZCI7Cgpjb25zdCBQYW5lbCA9IHN0eWxlZC5kaXYoewogIGRpc3BsYXk6ICJncmlkIiwKICBnYXA6IDEyLAp9KTsKYGBgCgpGb3IgRW1vdGlvbidzIGBjc3NgIHByb3AsIHBhc3MgUmVhY3QgcGx1Z2luIG9wdGlvbnMgdGhyb3VnaCBgbXVzY2F0KClgIGFuZCBhZGQKYGpzeEltcG9ydFNvdXJjZWAgdG8gYHRzY29uZmlnLmpzb25gOgoKYGBgYmFzaApucG0gaSBAZW1vdGlvbi9yZWFjdCBAZW1vdGlvbi9zdHlsZWQKbnBtIGkgLUQgQGVtb3Rpb24vYmFiZWwtcGx1Z2luCmBgYAoKYGBgdHMKLy8gdml0ZS5jb25maWcudHMKaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbCiAgICB0YWlsd2luZGNzcygpLAogICAgbXVzY2F0KHsKICAgICAgcmVhY3Q6IHsKICAgICAgICBqc3hJbXBvcnRTb3VyY2U6ICJAZW1vdGlvbi9yZWFjdCIsCiAgICAgICAgYmFiZWw6IHsKICAgICAgICAgIHBsdWdpbnM6IFsiQGVtb3Rpb24vYmFiZWwtcGx1Z2luIl0sCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0pLAogIF0sCn0pOwpgYGAKCmBgYGpzb24KewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAianN4SW1wb3J0U291cmNlIjogIkBlbW90aW9uL3JlYWN0IgogIH0KfQpgYGAKCkVtb3Rpb24gYEdsb2JhbGAgd3JpdGVzIGdsb2JhbCBDU1MgYXQgcnVudGltZSwgc28gc2NvcGUgaXQgbWFudWFsbHkgb3IgYXZvaWQgaXQKaW5zaWRlIHBsdWdpbnMuCgojIyMgdXNlUmIoKSBob29rCgpBY2Nlc3MgdGhlIGNvbW11bmljYXRpb24gQVBJIGJldHdlZW4gdGhlIHBsdWdpbiBtb2R1bGUgYW5kIFVJIGZyb20gYW55IHBsdWdpbiBjb21wb25lbnQuCgpgYGB0c3gKaW1wb3J0IHsgdXNlUmIgfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvc2RrIjsKCmZ1bmN0aW9uIEFwcCgpIHsKICBjb25zdCByYiA9IHVzZVJiKCk7Cn0KYGBgCgojIyMgcmIgQVBJCgp8IE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGByYi5wdWIodG9waWMsIHBheWxvYWQpYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB1Ymxpc2ggYSBtZXNzYWdlIHRvIGEgdG9waWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGByYi5zdWIodG9waWMsIGhhbmRsZXIpYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1YnNjcmliZSB0byBhIHRvcGljIOKAlCByZXR1cm5zIGB7IHVuZGVjbGFyZSgpIH1gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLmFjdGlvbih0b3BpYywgcGF5bG9hZD8pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VuZCBhIHJlcXVlc3QgYW5kIGF3YWl0IGEgcmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnNlcnZlKHRvcGljLCBoYW5kbGVyKWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSGFuZGxlIGluY29taW5nIHJlcXVlc3RzIGZyb20gdGhlIGJhY2tlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnRvYXN0KHsgdGl0bGU/LCBtZXNzYWdlLCB0eXBlPywgYWN0aW9uTGFiZWw/LCBoYW5kbGVBY3Rpb25DbGljaz8sIGNsb3NlT25BY3Rpb25DbGljaz8sIGR1cmF0aW9uPywgb25DbG9zZT8gfSlgIHwgU2hvdyBhIGhvc3QgdG9hc3Qgbm90aWZpY2F0aW9uLiBgbWVzc2FnZWAgYWNjZXB0cyBhIHN0cmluZyBvciBgUmVhY3RFbGVtZW50YC4gYHR5cGVgIGNhbiBiZSBgImluZm8iYCwgYCJkYW5nZXIiYCwgYCJ3YXJuaW5nImAsIGAiY2F1dGlvbiJgLCBvciBgInN1Y2Nlc3MiYCB8CnwgYHJiLmFsZXJ0KHsgdGl0bGU/LCBtZXNzYWdlLCBidXR0b25UZXh0PyB9KWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgYWxlcnQgZGlhbG9nLiBSZXNvbHZlcyB3aGVuIHRoZSBkaWFsb2cgaXMgY2xvc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLmNvbmZpcm0oeyB0aXRsZT8sIG1lc3NhZ2UsIGJ1dHRvblRleHQ/IH0pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgY29uZmlybWF0aW9uIGRpYWxvZy4gYGJ1dHRvblRleHRgIGFjY2VwdHMgYHsgeWVzLCBubyB9YC4gUmVzb2x2ZXMgdG8gYHRydWVgIG9yIGBmYWxzZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnByb21wdCh7IHRpdGxlPywgbWVzc2FnZSwgdmFsdWU/LCBwbGFjZWhvbGRlcj8sIGJ1dHRvblRleHQ/IH0pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgcHJvbXB0IGRpYWxvZy4gYGJ1dHRvblRleHRgIGFjY2VwdHMgYHsgeWVzLCBubyB9YC4gUmVzb2x2ZXMgdG8gdGhlIGVudGVyZWQgc3RyaW5nIG9yIGB1bmRlZmluZWRgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgpUb3BpYyBuYW1lcyBwYXNzZWQgdG8gYHB1YmAsIGBzdWJgLCBgYWN0aW9uYCwgYW5kIGBzZXJ2ZWAgYXJlIGlzb2xhdGVkIHBlciBwbHVnaW4uCgoKQWxsIG1ldGhvZHMgc3VwcG9ydCBHZW5lcmljIFR5cGVzOgoKYGBgdHN4CmNvbnN0IHN0YXR1cyA9IGF3YWl0IHJiLmFjdGlvbjx7IG9rOiBib29sZWFuIH0sIHsgaWQ6IG51bWJlciB9PigKICAiZ2V0LXN0YXR1cyIsCiAgeyBpZDogMSB9LAopOwoKY29uc3Qgc3ViID0gYXdhaXQgcmIuc3ViPHsgdmFsdWU6IG51bWJlciB9Pigic2Vuc29yL2RhdGEiLCAoZGF0YSkgPT4gewogIGNvbnNvbGUubG9nKGRhdGEudmFsdWUpOwp9KTsKc3ViLnVuZGVjbGFyZSgpOyAvLyBjbGVhbnVwCgpjb25zdCBvayA9IGF3YWl0IHJiLmNvbmZpcm0oewogIHRpdGxlOiAiUnVuIiwKICBtZXNzYWdlOiAiU3RhcnQgdGhlIGJhY2tlbmQgYWN0aW9uPyIsCn0pOwppZiAob2spIHsKICBhd2FpdCByYi5hY3Rpb24oInJ1biIpOwp9CmBgYAoKIyMjIFNhdmluZyBhbmQgcmVzdG9yaW5nIGZvcm0gZGF0YSAoYHVzZVJiRm9ybURhdGFgIC8gYHVzZVJiU2F2ZWApCgpJZiB0aGUgaG9zdCBlbWJlZHMgeW91ciBwbHVnaW4gaW4gYSBmb3JtIGl0IG93bnMgKGUuZy4gYSBwcm9ncmFtIHN0ZXAgZWRpdG9yCndpdGggaXRzIG93biBTYXZlIGJ1dHRvbiksIGl0IGNhbiBoYW5kIHlvdXIgcGx1Z2luIHByZXZpb3VzbHktc2F2ZWQgdmFsdWVzIGFuZApwdWxsIHRoZSBjdXJyZW50IHZhbHVlcyBiYWNrIG91dCB3aGVuIHRoZSB1c2VyIHNhdmVzLiBUaGUgaG9zdCDigJQgbm90IHRoZQpwbHVnaW4g4oCUIHBlcnNpc3RzIHRoZSBkYXRhIChJbmRleGVkREIsIGJhY2tlbmQsIGV0Yy4pLgoKYGBgdHN4CmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAicmVhY3QiOwppbXBvcnQgeyB1c2VSYkZvcm1EYXRhLCB1c2VSYlNhdmUgfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3QiOwoKdHlwZSBHcmlwQXJncyA9IHsgdGFyZ2V0TmFtZTogc3RyaW5nOyB3aWR0aDogbnVtYmVyIH07CmNvbnN0IERFRkFVTFRTOiBHcmlwQXJncyA9IHsgdGFyZ2V0TmFtZTogIiIsIHdpZHRoOiAyMCB9OwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkgewogIC8vIFByZXZpb3VzbHktc2F2ZWQgdmFsdWVzLCBvciB1bmRlZmluZWQgZm9yIGEgYnJhbmQtbmV3IGluc3RhbmNlLgogIGNvbnN0IHNhdmVkID0gdXNlUmJGb3JtRGF0YTxHcmlwQXJncz4oKTsKICBjb25zdCBbYXJncywgc2V0QXJnc10gPSB1c2VTdGF0ZTxHcmlwQXJncz4oeyAuLi5ERUZBVUxUUywgLi4uc2F2ZWQgfSk7CgogIC8vIFJlZ2lzdGVycyBhIGdldHRlciB0aGUgaG9zdCBjYWxscyB3aGVuIGl0cyBTYXZlIGJ1dHRvbiBpcyBjbGlja2VkLgogIC8vIEFsd2F5cyByZXR1cm5zIHRoZSBDVVJSRU5UIHZhbHVlcyDigJQgcmUtcmVnaXN0ZXJpbmcgb24gZXZlcnkgcmVuZGVyIGtlZXBzCiAgLy8gdGhlIGNsb3N1cmUgZnJlc2gsIHdoaWNoIHVzZVJiU2F2ZSBhbHJlYWR5IGhhbmRsZXMgZm9yIHlvdS4KICB1c2VSYlNhdmUoKCkgPT4gKHsKICAgIGFyZ3MsCiAgICBzdW1tYXJ5OiBgJHthcmdzLnRhcmdldE5hbWUgfHwgInRhcmdldCJ9IMK3ICR7YXJncy53aWR0aH1tbWAsCiAgfSkpOwoKICByZXR1cm4gKC8qIC4uLmZvcm0gVUkgcmVhZGluZy93cml0aW5nIGBhcmdzYC4uLiAqLyk7Cn0KYGBgCgpUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBgdXNlUmJTYXZlYCBtdXN0IGJlIEpTT04tc2VyaWFsaXNhYmxlIOKAlCB0aGUgaG9zdApwZXJzaXN0cyBpdCBhcy1pcy4gTm90IGV2ZXJ5IGhvc3QgZW1iZWRzIHBsdWdpbnMgaW4gYSBzYXZlL3Jlc3RvcmUgZm9ybTsgaWYKeW91cnMgZG9lc24ndCwgeW91IGNhbiBza2lwIHRoZXNlIGhvb2tzIGVudGlyZWx5LgoKIyMjIFVJIGNvbXBvbmVudHMKCkltcG9ydCBNdXNjYXQgY29tcG9uZW50cyBmcm9tIGBAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3RgIGFuZCBleHBvcnQgYQpSZWFjdCBjb21wb25lbnQgYXMgdGhlIGRlZmF1bHQgZXhwb3J0LiBUaGUgaG9zdCBtb3VudHMgdGhhdCBjb21wb25lbnQgZGlyZWN0bHkKYW5kIHByb3ZpZGVzIGB1c2VSYigpYCB0aHJvdWdoIGNvbnRleHQuCgpgYGB0c3gKaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB7IFJCTGFiZWxCdXR0b24sIFJCU2xpZGVyLCBSQlN3aXRjaCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aS9yZWFjdCI7CmltcG9ydCB7IHVzZVJiIH0gZnJvbSAiQHJhaW5ib3ctcm9ib3RpY3MvcGx1Z2luLXVpL3NkayI7CgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7CiAgY29uc3QgcmIgPSB1c2VSYigpOwogIGNvbnN0IFt3aWR0aCwgc2V0V2lkdGhdID0gdXNlU3RhdGUoMjApOwogIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IHVzZVN0YXRlKHRydWUpOwoKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZmxleC1jb2wgZ2FwLTQiPgogICAgICA8UkJTbGlkZXIKICAgICAgICB2YWx1ZT17W3dpZHRoXX0KICAgICAgICBtaW49ezB9CiAgICAgICAgbWF4PXsxMDB9CiAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlczogbnVtYmVyW10pID0+IHNldFdpZHRoKHZhbHVlc1swXSA/PyAwKX0KICAgICAgLz4KICAgICAgPFJCU3dpdGNoIGNoZWNrZWQ9e2VuYWJsZWR9IG9uQ2hlY2tlZENoYW5nZT17c2V0RW5hYmxlZH0gLz4KICAgICAgPFJCTGFiZWxCdXR0b24KICAgICAgICBkaXNhYmxlZD17IWVuYWJsZWR9CiAgICAgICAgb25DbGljaz17KCkgPT4gcmIuYWN0aW9uKCJncmlwIiwgeyB3aWR0aCB9KX0KICAgICAgPgogICAgICAgIEdyaXAKICAgICAgPC9SQkxhYmVsQnV0dG9uPgogICAgPC9kaXY+CiAgKTsKfQpgYGAKCi0tLQoKIyMgRGV2ZWxvcGluZyBkaXJlY3RseSBvbiB0aGUgcm9ib3QgUEMKCklmIHlvdSdyZSBydW5uaW5nIGBtdXNjYXQtcGsgZGV2YCAqKm9uIHRoZSByb2JvdCBQQyBpdHNlbGYqKiwgTXVzY2F0IGlzIGxpa2VseSBhbHJlYWR5CnJ1bm5pbmcgaXRzIG93biBTb2NrZXQuSU8gYnJpZGdlIG9uIHBvcnQgMTAwMDAuIEluIHRoYXQgY2FzZSB0aGUgQ0xJIGRldGVjdHMgdGhlIHBvcnQKY29uZmxpY3QgYW5kIGFza3M6CgpgYGAK4pqgIHBvcnQgMTAwMDAgaXMgYWxyZWFkeSBpbiB1c2Ug4oCUIGNhbid0IHN0YXJ0IFNvY2tldC5JTyBicmlkZ2UuCiAgUHJvY2VlZCB3aXRob3V0IFNvY2tldC5JTyBicmlkZ2U/IFt5L05dOgpgYGAKCkFuc3dlciAqKnkqKi4gWW91ciBwbHVnaW4gYmFja2VuZCB3aWxsIGNvbm5lY3QgdG8gdGhlIE11c2NhdCBicmlkZ2UgdGhhdCdzIGFscmVhZHkKcnVubmluZyBpbnN0ZWFkIG9mIHN0YXJ0aW5nIGEgbmV3IG9uZSDigJQgZXhhY3RseSB3aGF0IHlvdSB3YW50IHdoZW4gZGV2ZWxvcGluZyBvbiB0aGUKcm9ib3QuCgo+IElmIHlvdSBhbnN3ZXIgKipuKiogKG9yIGp1c3QgcHJlc3MgRW50ZXIpLCB0aGUgQ0xJIGV4aXRzIHNvIHlvdSBjYW4gZnJlZSB0aGUgcG9ydAo+IG1hbnVhbGx5IGFuZCByZXRyeS4KCi0tLQoKIyMgQmFja2VuZCBydW50aW1lcwoKYG1hbmlmZXN0Lmpzb25gIGNob29zZXMgb25lIGJhY2tlbmQgcnVudGltZS4gYG11c2NhdC1wayBkZXZgIHJ1bnMgYmFja2VuZCBjb2RlIGluCmEgRG9ja2VyIGNvbnRhaW5lciBtYXRjaGluZyB0aGUgcm9ib3QgZW52aXJvbm1lbnQuIEJhY2tlbmQgY29kZSBzaG91bGQgY29udGFpbgpwbHVnaW4gbG9naWMgb25seTsgaXQgc2hvdWxkIG5vdCBzdGFydCB0aGUgTXVzY2F0IGJyaWRnZSBvciBpdHMgb3duIGNvcHkgb2YgdGhlCnBsdWdpbiBnYXRld2F5LgoKIyMjIFdoaWNoIGJhY2tlbmQgcGF0dGVybj8gKGRlcGVuZHMgb24gdGhlIGNvbnRyaWJ1dGlvbiBwb2ludCkKCioqSG93IHlvdSBjb250cm9sIHRoZSByb2JvdCBkZXBlbmRzIG9uIHdoYXQgeW91ciBwbHVnaW4gY29udHJpYnV0ZXMqKiAoc2VlCmBtYW5pZmVzdC5qc29uYCDihpIgYGNvbnRyaWJ1dGVzW10ucG9pbnRgKS4gRG9uJ3QgbWl4IHRoZXNlIHVwOgoKfCBDb250cmlidXRpb24gcG9pbnQgfCBXaGF0IGl0IGlzIHwgQmFja2VuZCBwYXR0ZXJuIHwKfCAtLS0gfCAtLS0gfCAtLS0gfAp8IGBwcm9ncmFtLnBhbmVsYCAod2l0aCBgY29tbWFuZEluZm9gKSB8IERlZmluZXMgYSAqKmN1c3RvbSBjb21tYW5kKiogdGhlIHBsdWdpbiBhZGRzIHRvIHRoZSBQcm9ncmFtIHBhZ2UncyBydWxlLWJhc2VkIHNlcXVlbmNlIGJ1aWxkZXIuIFRoZSBvcGVyYXRvciBwbGFjZXMgaXQgaW50byB0aGUgcHJvZ3JhbSB0cmVlIGxpa2UgYW55IGJ1aWx0LWluIGNvbW1hbmQgKE1vdmUgSiwgUG9pbnQsIFdhaXQsIOKApik7IGl0IHJ1bnMgd2hlbiB0aGUgcHJvZ3JhbSByZWFjaGVzIHRoYXQgc3RlcC4gfCAqKmBQbHVnaW5Qcm9ncmFtQ29udGV4dGAqKiDigJQgaW50ZWdyYXRlZCB3aXRoIHRoZSBwcm9ncmFtJ3Mgc3RvcC9wYXVzZSBhbmQgdmFyaWFibGVzLiBTZWUgX1Byb2dyYW0gY29tbWFuZCBiYWNrZW5kXyBiZWxvdy4gfAp8IGB0b29sYmFyYCAvIGBsbmJgIC8gYG1vdmUucGFuZWxgIHwgQSBsaXZlIFVJIHBhbmVsL3BvcG92ZXIgdGhlIG9wZXJhdG9yIGludGVyYWN0cyB3aXRoIGRpcmVjdGx5IHwgQ2FsbCB0aGUgcm9ib3QgKipTREsgZGlyZWN0bHkqKiAoYFJCTWFuaXB1bGF0ZVNES2AsIGBSQkFtclNES2ApIGZyb20gYHB5L21haW4ucHlgLCBvciBgcmIuYWN0aW9uKC4uLilgIOKGkiB5b3VyIGJhY2tlbmQg4oaSIFNESy4gKipOb3QqKiBhIHByb2dyYW0gc3RlcCDigJQgdGhlcmUgaXMgbm8gc3RvcC9wYXVzZS92YXJpYWJsZSBjb250ZXh0LiB8CgpSdWxlIG9mIHRodW1iOiB1c2UgYFBsdWdpblByb2dyYW1Db250ZXh0YCAqKm9ubHkqKiBmb3IgYSBgcHJvZ3JhbS5wYW5lbGAgY29tbWFuZAp0aGF0IHJ1bnMgYXMgcGFydCBvZiBhIHByb2dyYW0uIFRvIG1vdmUgdGhlIHJvYm90IGxpdmUgZnJvbSBhIHRvb2xiYXIvbW92ZSBwYW5lbCwKdXNlIHRoZSBTREsg4oCUIGEgcHJvZ3JhbS1zdGVwIGNvbnRleHQgZG9lcyBub3QgYXBwbHkuCgojIyMgRnJvbnRlbmQtb25seSAoYG5vbmVgKQoKVXNlIHRoaXMgd2hlbiB0aGUgcGx1Z2luIG9ubHkgaGFzIFVJIGFuZCBjYWxscyBob3N0IHNlcnZpY2VzOgoKYGBganNvbgp7ICJydW50aW1lIjogeyAidHlwZSI6ICJub25lIiB9IH0KYGBgCgojIyMgUHl0aG9uCgpQeXRob24gcGx1Z2lucyB1c2UgYHB5L21haW4ucHlgIGFuZCBjYW4gY29tbXVuaWNhdGUgd2l0aCB0aGUgVUkgdGhyb3VnaApgcmFpbmJvdy5yYl9zZGsuUkJQbHVnaW5DYWxsYC4KCmBgYHB5dGhvbgppbXBvcnQgdGltZQpmcm9tIHJhaW5ib3cucmJfc2RrIGltcG9ydCBSQkFtclNESywgUkJNYW5pcHVsYXRlU0RLLCBSQlBsdWdpbkNhbGwKCnBsdWdpbiA9IFJCUGx1Z2luQ2FsbCgpCgoKcGx1Z2luLnB1Ymxpc2goInN0YXRlIiwgeyJyZWFkeSI6IFRydWV9KQoKCkBwbHVnaW4uc3Vic2NyaWJlKCJldmVudCIpCmRlZiBvbl91aV9ldmVudChwYXlsb2FkPU5vbmUpOgogICAgcHJpbnQocGF5bG9hZCkKCgpAcGx1Z2luLnNlcnZlKCJ0b29sL2VjaG8iKQpkZWYgZWNobyhwYXlsb2FkPU5vbmUpOgogICAgcmV0dXJuIHsiZWNobyI6IHBheWxvYWR9CgoKZGVmIGNhbGxfZnJvbnRlbmQoKToKICAgIHJlcyA9IHBsdWdpbi5jYWxsKCJ0b29sL3BpbmciLCBwYXlsb2FkPXsiaGVsbG8iOiAicGx1Z2luIn0pCiAgICBwcmludChyZXMpCgoKZGVmIG1vdmVfal9leGFtcGxlKCk6CiAgICBhbXIgPSBSQkFtclNESygpCiAgICBtYW5pcHVsYXRlID0gUkJNYW5pcHVsYXRlU0RLKCkKICAgIHJldHVybiBtYW5pcHVsYXRlLm1vdmUuY2FsbF9tb3ZlX2ooCiAgICAgICAgcm9ib3RfbW9kZWw9IkM1MDA5MjAiLAogICAgICAgIHRhcmdldD17InRhcl92YWx1ZXMiOiBbMCwgMCwgMCwgMCwgMCwgMF0sICJ0YXJfZnJhbWUiOiAwLCAidGFyX3VuaXQiOiAwfSwKICAgICkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICB0aW1lLnNsZWVwKDEpCmBgYAoKIyMjIyBFeHRlcm5hbCBlbmRwb2ludHMgKGBwbHVnaW4ucm91dGVyYCkKCmBwbHVnaW4uc2VydmVgIC8gYHBsdWdpbi5zdWJzY3JpYmVgIC8gYHBsdWdpbi5wdWJsaXNoYCBhcmUgKippbnRlcm5hbCBvbmx5KiogKHBsdWdpbgpVSSDihpQgYmFja2VuZCwgcGx1Z2luIOKGlCBwbHVnaW4pLiBUbyBleHBvc2UgYW4gZW5kcG9pbnQgdG8gdGhlIG91dHNpZGUgd29ybGQg4oCUClJFU1QsIFNvY2tldC5JTywgVENQLCBNUVRULCBXZWJSVEMg4oCUIHVzZSBgcGx1Z2luLnJvdXRlcmAuIERlY2xhcmluZyBvbmUgaXMgYQpzaW5nbGUgZGVjb3JhdG9yOyB0aGUgcnVubmluZyBNdXNjYXQgKGBjb21tb25gKSBwaWNrcyBpdCB1cCB3aXRob3V0IGEgcmVzdGFydCwKYW5kIGl0IGRpc2FwcGVhcnMgd2hlbiB0aGUgcGx1Z2luIHN0b3BzIG9yIGlzIHJlbW92ZWQuCgo+IFJlcXVpcmVzIGEgcm9ib3QgcnVubmluZyBgcmFpbmJvdy1yYi1zZGtgICoqMC4wLjkuZGV2NSBvciBuZXdlcioqICh0aGUgU0RLIGlzCj4gcHJvdmlkZWQgYnkgdGhlIHBsdWdpbiBjb250YWluZXIgYXQgcnVudGltZSkuIE9uIG9sZGVyIHJvYm90cyBgcGx1Z2luLnJvdXRlcmAKPiBkb2VzIG5vdCBleGlzdCBhbmQgcmFpc2VzIGBBdHRyaWJ1dGVFcnJvcmAuCgpgYGBweXRob24KZnJvbSByYWluYm93LnJiX3NkayBpbXBvcnQgUkJQbHVnaW5DYWxsCmZyb20gcmFpbmJvdy5yYl9zZGsucGx1Z2luIGltcG9ydCBQbHVnaW5Sb3V0ZUVycm9yCgpwbHVnaW4gPSBSQlBsdWdpbkNhbGwoKSAgIyBwbHVnaW5faWQgY29tZXMgZnJvbSBlbnYgUkJfUExVR0lOX0lECgoKQHBsdWdpbi5yb3V0ZXIub24oIi9oZWxsbyIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWxsIDUgdHJhbnNwb3J0cwpkZWYgaGVsbG8ocGF5bG9hZDogZGljdCwgbWV0YTogZGljdCk6CiAgICByZXR1cm4geyJtc2ciOiBmImhpIHtwYXlsb2FkLmdldCgnbmFtZScpfSJ9ICAgICAgICAgICAgICAjIHJldHVybiB2YWx1ZSA9IHJlc3BvbnNlIGJvZHkKCgpAcGx1Z2luLnJvdXRlci5vbigiL2FkbWluIiwgZXhwbGljaXRfcm91dGVzPVsiYXBpIl0pICAgICAgICAgIyBSRVNUIG9ubHkKZGVmIGFkbWluKHBheWxvYWQsIG1ldGEpOgogICAgaWYgbm90IChtZXRhLmdldCgicHJpbmNpcGFsIikgb3Ige30pLmdldCgiaXNfYWRtaW4iKToKICAgICAgICByYWlzZSBQbHVnaW5Sb3V0ZUVycm9yKDQwMywgImFkbWluIG9ubHkiKSAgICAgICAgICAgICMgYmVjb21lcyB0aGUgZXh0ZXJuYWwgc3RhdHVzCiAgICAuLi4KCgpAcGx1Z2luLnJvdXRlci5zdWJzY3JpYmUoIi9jbWQiLCBleHBsaWNpdF9ldmVudHM9WyJ0Y3AiXSkgICAgIyByZWNlaXZlIGV4dGVybmFsIFRDUCBwdWJsaXNoCmRlZiBvbl9jbWQocGF5bG9hZDogZGljdCk6CiAgICAuLi4KCgpwbHVnaW4ucm91dGVyLmVtaXQoIi9zdGF0ZSIsIHsiYnVzeSI6IFRydWV9KSAgICAgICAgICAgICAgICAgIyBwdXNoIHRvIGV4dGVybmFsIHN1YnNjcmliZXJzCmBgYAoKfCBBUEkgfCBNZWFuaW5nIHwgRXh0ZXJuYWwgYWRkcmVzcyB8CnwgLS0tIHwgLS0tIHwgLS0tIHwKfCBgcm91dGVyLm9uKHBhdGgsIGV4cGxpY2l0X3JvdXRlcz1Ob25lKWAgfCByZXF1ZXN0L3Jlc3BvbnNlIGhhbmRsZXIgfCBgY29tbW9uL3BsdWdpbi97cGx1Z2luX2lkfS97cGF0aH1gIChSRVNUIGlzIGFsd2F5cyBgUE9TVGApIHwKfCBgcm91dGVyLnN1YnNjcmliZSh0b3BpYywgZXhwbGljaXRfZXZlbnRzPU5vbmUpYCB8IHJlY2VpdmUgZXh0ZXJuYWwgcHVibGlzaGVzIHwgZXh0ZXJuYWwgc2lkZSBwdWJsaXNoZXMgdG8gYGNvbW1vbi9wbHVnaW4ve3BsdWdpbl9pZH0ve3RvcGljfWAgfAp8IGByb3V0ZXIuZW1pdCh0b3BpYywgcGF5bG9hZClgIHwgcGx1Z2luIOKGkiBleHRlcm5hbCBwdXNoIHwgZXh0ZXJuYWwgc2lkZSBzdWJzY3JpYmVzIHRvIGBjb21tb24vcGx1Z2luL3twbHVnaW5faWR9L3t0b3BpY31gIHwKCi0gVGhlIGBwbHVnaW5faWRgIHByZWZpeCBpcyBhZGRlZCBieSB0aGUgU0RLIOKAlCB3cml0ZSBvbmx5IHRoZSBwYXRoIGluIHBsdWdpbiBjb2RlLgotIFBhdGhzIG1heSBoYXZlIHNldmVyYWwgc2VnbWVudHMgKGAvdG9vbC9lY2hvYCkuIERlY2xhcmluZyB0aGUgc2FtZSBwYXRoIHR3aWNlIHJhaXNlcyBgVmFsdWVFcnJvcmAuCi0gVHJhbnNwb3J0IG5hbWVzOiBgYXBpIHwgc29ja2V0IHwgdGNwIHwgbXF0dCB8IHdlYnJ0Y2AuIGBzdWJzY3JpYmVgIGFjY2VwdHMgb25seSBgdGNwIHwgbXF0dCB8IHdlYnJ0Y2AuIFVua25vd24gbmFtZXMgcmFpc2UgYFZhbHVlRXJyb3JgLgotIGBleHBsaWNpdF9yb3V0ZXNgIC8gYGV4cGxpY2l0X2V2ZW50c2Agb2YgYE5vbmVgIG1lYW5zIGV2ZXJ5IHRyYW5zcG9ydC4gQSByZXF1ZXN0IG9uIGEgdHJhbnNwb3J0IG5vdCBsaXN0ZWQgZ2V0cyA0MDQuCgpIYW5kbGVyIGNvbnRyYWN0OgoKLSBTaWduYXR1cmUgYChwYXlsb2FkLCBtZXRhKWAsIGAocGF5bG9hZClgIG9yIGAoKWAg4oCUIG9ubHkgdGhlIGFyZ3VtZW50cyB5b3UgZGVjbGFyZSBhcmUgaW5qZWN0ZWQuIFN5bmMgYW5kIGFzeW5jIGJvdGggd29yay4KLSBgcGF5bG9hZGA6IHdoYXQgdGhlIGNhbGxlciBzZW50IChmb3IgUkVTVDogSlNPTiBib2R5IG1lcmdlZCB3aXRoIHF1ZXJ5IHBhcmFtcykuIFRoZSBzaGFwZSBpcyB1cCB0byB0aGUgcGx1Z2luLgotIGBtZXRhYDogYHsidHJhbnNwb3J0IjogImFwaSJ8InNvY2tldCJ8InRjcCJ8Im1xdHQifCJ3ZWJydGMiLCAicHJpbmNpcGFsIjogZGljdCB8IE5vbmV9YC4gV2hlbiB0aGUgcm9ib3QncyBsb2dpbiBwb2xpY3kgaXMgb24sIGBwcmluY2lwYWxgIGhvbGRzIHRoZSB0b2tlbiBzdWJqZWN0LiAqKlJvbGUgY2hlY2tzIGFyZSB0aGUgcGx1Z2luJ3Mgam9iKiog4oCUIGluc3BlY3QgYG1ldGFbInByaW5jaXBhbCJdYCB5b3Vyc2VsZi4KLSBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSByZXNwb25zZSBib2R5IChtdXN0IGJlIEpTT04tc2VyaWFsaXNhYmxlKS4gYE5vbmVgIOKGkiBlbXB0eSByZXNwb25zZS4KLSBTdGF0dXMgY29kZXM6IGByYWlzZSBQbHVnaW5Sb3V0ZUVycm9yKGNvZGUsIG1lc3NhZ2UpYC4gQW55IG90aGVyIGV4Y2VwdGlvbiDihpIgNTAwIHdpdGggYHN0cihleGMpYCBhcyB0aGUgbWVzc2FnZS4KLSBgc3Vic2NyaWJlYCBoYW5kbGVycyB0YWtlIGAocGF5bG9hZClgIG9ubHkgYW5kIHJldHVybiBub3RoaW5nLgoKIyMjIyBDYWxsaW5nIHBsdWdpbiBlbmRwb2ludHMgZnJvbSBvdXRzaWRlCgp8IFRyYW5zcG9ydCB8IEhvdyB8CnwgLS0tIHwgLS0tIHwKfCBSRVNUIHwgYFBPU1QgL2NvbW1vbi9wbHVnaW4ve3BsdWdpbl9pZH0ve3BhdGh9YCAodGhyb3VnaCB0aGUgYXBpLWdhdGV3YXkpLCBKU09OIGJvZHkgfAp8IFNvY2tldC5JTyB8IGVtaXQgZXZlbnQgYGNvbW1vbi9wbHVnaW4ve3BsdWdpbl9pZH0ve3BhdGh9YCwgcmVzcG9uc2UgYXJyaXZlcyBpbiB0aGUgYWNrIHwKfCBUQ1AgfCB0b3BpYyBgY29tbW9uL3BsdWdpbi97cGx1Z2luX2lkfS97cGF0aH1gIHJlcXVlc3QgLyBwdWJsaXNoIHwKfCBNUVRUIHwgcmVxdWVzdDogYGNvbW1vbi9wbHVnaW4ve3BsdWdpbl9pZH0ve3BhdGh9L19fcmVxX19gLCBwdWJsaXNoOiBgY29tbW9uL3BsdWdpbi97cGx1Z2luX2lkfS97dG9waWN9YCB8CnwgV2ViUlRDIHwgZGF0YSBjaGFubmVsIHRvcGljIGBjb21tb24vcGx1Z2luL3twbHVnaW5faWR9L3twYXRofWAgfAoKQXV0aDogd2hlbiB0aGUgcm9ib3QncyBsb2dpbiBwb2xpY3kgaXMgb24sIGEgdG9rZW4gaXMgKipyZXF1aXJlZCoqIChhbnkgcm9sZSDigJQgR1VFU1QgcGFzc2VzKS4gV2hlbiBpdCBpcyBvZmYsIGNhbGxzIGdvIHN0cmFpZ2h0IHRocm91Z2guIFJFU1QgdXNlcyB0aGUgc2FtZSBCZWFyZXIgdG9rZW4gYXMgdGhlIG90aGVyIE11c2NhdCBBUElzLgoKYGBgYmFzaApjdXJsIC1zIC1YIFBPU1QgaHR0cDovLzxyb2JvdD4vY29tbW9uL3BsdWdpbi9teS1wbHVnaW4vaGVsbG8gXAogIC1IICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIC1kICd7Im5hbWUiOiJraW0ifScKYGBgCgp8IFNpdHVhdGlvbiB8IFN0YXR1cyB8CnwgLS0tIHwgLS0tIHwKfCBObyBwbHVnaW4gZGVjbGFyZXMgdGhhdCBwYXRoIC8gcGx1Z2luIGlzIGRvd24gLyB0cmFuc3BvcnQgbm90IGFsbG93ZWQgfCA0MDQgfAp8IFBsdWdpbiBkaWQgbm90IGFuc3dlciB3aXRoaW4gMTAgcyB8IDUwNCB8CnwgYGNvbW1vbmAg4oaUIGdhdGV3YXkgbm90IGNvbm5lY3RlZCB8IDUwMyB8CnwgSGFuZGxlciByYWlzZWQgfCA1MDAgKGBQbHVnaW5Sb3V0ZUVycm9yYCDihpIgaXRzIGBjb2RlYCkgfAoKS25vd24gbGltaXRzOgoKLSBBIHBsdWdpbiBwYXRoIG5hbWVkIGBpbnN0YWxsYCBjYW5ub3QgYmUgY2FsbGVkIG92ZXIgUkVTVCAoYFBPU1QgL2NvbW1vbi9wbHVnaW4ve2lkfS9pbnN0YWxsYCBpcyB0YWtlbiBieSB0aGUgcmVnaXN0cnkgaW5zdGFsbCByb3V0ZSBmaXJzdCkuIFNvY2tldC9UQ1AgYXJlIHVuYWZmZWN0ZWQuCi0gU3dhZ2dlciBzaG93cyBvbmUgY2F0Y2gtYWxsIHJvdXRlLCBub3QgcGVyLXBsdWdpbiBwYXRocy4KLSBUaGUgTVFUVCBicm9rZXIgZWNob2VzIHRvIHRoZSBzZW5kZXI6IGEgcGx1Z2luIHRoYXQgYGVtaXRgcyBhbmQgYHN1YnNjcmliZWBzIHRoZSBzYW1lIHRvcGljIHJlY2VpdmVzIGl0cyBvd24gcHVzaCBvdmVyIGBtcXR0YC4gRHJvcCBgbXF0dGAgZnJvbSBgZXhwbGljaXRfZXZlbnRzYCBvciB1c2Ugc2VwYXJhdGUgdG9waWNzLiAoVENQIGlzIGZpbHRlcmVkIGJ5IGBzZW5kZXJfaWRgLikKLSBgb25gIGFuZCBgc3Vic2NyaWJlYCBtYXkgc2hhcmUgYSBuYW1lIOKAlCB0aGV5IGxpdmUgaW4gc2VwYXJhdGUgdGFibGVzLgoKRHVyaW5nIGBtdXNjYXQtcGsgZGV2YCAvIGBkZXY6YmFja2AgdGhlIGxvY2FsIGJyaWRnZSAocG9ydCBgMTAwMDBgKSBhY2NlcHRzIHRoZQpgcm91dGVyLipgIHJlZ2lzdHJhdGlvbnMsIGJ1dCAqKmV4dGVybmFsIGNhbGxzIG5lZWQgYSBydW5uaW5nIGBjb21tb25gKiog4oCUIGl0IGlzCmBjb21tb25gIHRoYXQgcm91dGVzIGBjb21tb24vcGx1Z2luLy4uLmAgdG8gdGhlIGdhdGV3YXkuIFVzZSBhIHJvYm90IChvciBhIGxvY2FsCmBjb21tb25gKSB0byBleGVyY2lzZSB0aGUgZXh0ZXJuYWwgYWRkcmVzc2VzLiBBZnRlciByZXN0YXJ0aW5nIHRoZSBwbHVnaW4gcHJvY2VzcywKZXh0ZXJuYWwgY2FsbHMgbWF5IHJldHVybiA1MDQgZm9yIHVwIHRvIGFib3V0IGEgbWludXRlICh1bnRpbCB0aGUgZ2F0ZXdheSBub3RpY2VzCnRoZSBvbGQgc29ja2V0IGlzIGdvbmUpLCB0aGVuIDQwNCDigJQgdGhhdCBpcyBleHBlY3RlZC4KCiMjIyMgUHJvZ3JhbSBjb21tYW5kIGJhY2tlbmQgKGBwcm9ncmFtLnBhbmVsYCkKCkEgYHByb2dyYW0ucGFuZWxgIGNvbnRyaWJ1dGlvbiBkZWZpbmVzIGEgKipjdXN0b20gY29tbWFuZCoqIHlvdXIgcGx1Z2luIGFkZHMgdG8KdGhlIE11c2NhdCAqKlByb2dyYW0gcGFnZSoqLCB3aGVyZSB0aGUgb3BlcmF0b3IgYnVpbGRzIGEgcm9ib3QgcHJvZ3JhbSBhcyBhCnJ1bGUtYmFzZWQgc2VxdWVuY2UgKGEgcHJvZ3JhbSB0cmVlKS4gWW91ciBjb21tYW5kIGFwcGVhcnMgYWxvbmdzaWRlIHRoZQpidWlsdC1pbnMgKE1vdmUgSiwgUG9pbnQsIFdhaXQsIOKApik7IHRoZSBvcGVyYXRvciBwbGFjZXMgaXQgaW50byB0aGUgdHJlZSwgYW5kCmVhY2ggdGltZSB0aGUgcHJvZ3JhbSBleGVjdXRlcyB0aGF0IHN0ZXAgdGhlIGhvc3QgY2FsbHMgeW91ciBiYWNrZW5kIHRocm91Z2gKYFBsdWdpblByb2dyYW1Db250ZXh0YCDigJQgcmVjZWl2aW5nIHRoZSBzdGVwIGFyZ3MsIGNoZWNraW5nIGZvciBzdG9wL3BhdXNlLApyZWFkaW5nL3dyaXRpbmcgcHJvZ3JhbSB2YXJpYWJsZXMsIGFuZCBzaWduYWxsaW5nIGNvbXBsZXRpb24uIFRoaXMgcGF0dGVybiBpcwoqKm9ubHkqKiBmb3IgYHByb2dyYW0ucGFuZWxgOyBhIHRvb2xiYXIvbW92ZS1wYW5lbCBwbHVnaW4gdXNlcyB0aGUgU0RLIGRpcmVjdGx5Cmluc3RlYWQgKHNlZSB0aGUgdGFibGUgYWJvdmUpLgoKYGBgcHl0aG9uCiIiIgpQbHVnaW4gYmFja2VuZCBtYWluLnB5IGV4YW1wbGUgKHByb2dyYW0ucGFuZWwgY29tbWFuZCkuCgptYW5pZmVzdC5qc29uOgogICJydW50aW1lIjogeyJ0eXBlIjogInB5dGhvbiIsICJlbnRyeSI6ICJtYWluLnB5In0sCiAgImNvbnRyaWJ1dGVzIjogW3sKICAgICJwb2ludCI6ICJwcm9ncmFtLnBhbmVsIiwKICAgICJ1aSI6ICJwcm9ncmFtIiwKICAgICJsYWJlbCI6IHsiZW4iOiAiTXkgUGx1Z2luIFN0ZXAifSwKICAgICJjb21tYW5kSW5mbyI6IHsKICAgICAgIm5hbWUiOiAiTXkgUGx1Z2luIFN0ZXAiLAogICAgICAiaWNvbiI6ICJhc3NldHMvaWNvbi5zdmciLAogICAgICAiZnVuY05hbWUiOiAicmJfcHJvZ3JhbV9zZGsucGx1Z2luX2V4ZWN1dGUiLAogICAgICAiYXJncyI6IHsibWVzc2FnZSI6ICJoZWxsbyJ9ICAgIyBwbHVnaW4tYXV0aG9yLWRlZmluZWQgYXJncwogICAgfQogIH1dCgpUaGUgaG9zdCBpbnZva2VzIGNvbW1hbmRJbmZvLmZ1bmNOYW1lIChyYl9wcm9ncmFtX3Nkay5wbHVnaW5fZXhlY3V0ZSkgd2l0aAphcmdzLnBsdWdpbl9pZCArIHlvdXIgYXJncyB3aGVuIHRoZSBwcm9ncmFtIHJlYWNoZXMgdGhpcyBzdGVwLgoiIiIKaW1wb3J0IGFzeW5jaW8KZnJvbSByYWluYm93LnJiX3NkayBpbXBvcnQgUGx1Z2luUHJvZ3JhbUNvbnRleHQKCmN0eCA9IFBsdWdpblByb2dyYW1Db250ZXh0KHBsdWdpbl9pZD0ibXktcGx1Z2luIikKCgpAY3R4Lm9uX2V4ZWN1dGUKYXN5bmMgZGVmIGhhbmRsZShhcmdzOiBkaWN0KSAtPiBOb25lOgogICAgIiIiQ2FsbGVkIG9uY2Ugd2hlbiBteSBTdGVwIGV4ZWN1dGVzLiBWYXJpYWJsZSB3cml0ZXMgYXBwbHkgdG8gdGhlCiAgICBydW5uaW5nIHByb2dyYW0gaW1tZWRpYXRlbHkgKyBicm9hZGNhc3QgdG8gb3RoZXIgcm9ib3RzJyBtYWluIHRhc2tzLiIiIgogICAgY291bnQgPSBhd2FpdCBjdHguZ2V0X3ZhcmlhYmxlKCJjb3VudGVyIikgICAgICAgICAgIyByZWFkIGFuIGV4aXN0aW5nIHByb2dyYW0gdmFyaWFibGUKICAgIGF3YWl0IGN0eC5zZXRfdmFyaWFibGUoImNvdW50ZXIiLCBjb3VudCArIDEpICAgICAgICMgdXBkYXRlIGFuIGV4aXN0aW5nIHZhcmlhYmxlIOKAlCBhbGxvd2VkCiAgICBhd2FpdCBjdHguc2V0X3ZhcmlhYmxlKCJSQlBfVEVTVCIsIDEpICAgICAgICAgICAgICAjIE5FVyB2YXJpYWJsZXMgbXVzdCBzdGFydCB3aXRoIFJCUF8KCiAgICBmb3IgaSBpbiByYW5nZSgxMDApOgogICAgICAgIGF3YWl0IGN0eC5jaGVja19zdG9wKCkgICAjIGF1dG8tc2NvcGVkIHRvIHRoaXMgU3RlcCdzIHJvYm90IG1vZGVsCiAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjUpCgogICAgYXdhaXQgY3R4LmRvbmUoKQoKCmFzeW5jIGRlZiBiYWNrZ3JvdW5kX21vbml0b3IoKSAtPiBOb25lOgogICAgIiIiUmVzaWRlbnQgdGFzayBvdXRzaWRlIGFueSBTdGVwLiBJZiBubyBwcm9ncmFtIGlzIHJ1bm5pbmcsCiAgICBnZXQgcmV0dXJucyBOb25lIGFuZCBzZXQgaXMgc2lsZW50bHkgaWdub3JlZCDigJQgYWx3YXlzIHNhZmUgdG8gY2FsbC4iIiIKICAgIHdoaWxlIFRydWU6CiAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxLjApCgogICAgICAgICMgdGFyZ2V0cyBldmVyeSBydW5uaW5nIG1haW4gdGFzayAobm8gcm9ib3RfbW9kZWwgcGFyYW0g4oCUIGFsd2F5cyBicm9hZGNhc3QpCiAgICAgICAgYXdhaXQgY3R4LnNldF92YXJpYWJsZSgiUkJQX1RFU1QiLCAzKQoKICAgICAgICAjIGdldCBvcHRpb25zCiAgICAgICAgdjEgPSBhd2FpdCBjdHguZ2V0X3ZhcmlhYmxlKCJjb3VudGVyIikgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IHZhbHVlIGZvdW5kIGluIHRoZSB3aG9sZSB0cmVlCiAgICAgICAgdjIgPSBhd2FpdCBjdHguZ2V0X3ZhcmlhYmxlKCJjb3VudGVyIiwgcm9ib3RfbW9kZWw9IkM1MDA5MjAiKSAgICAjIGEgc3BlY2lmaWMgcm9ib3QKICAgICAgICB2MyA9IGF3YWl0IGN0eC5nZXRfdmFyaWFibGUoIlJCUF9URVNUIiwgcGx1Z2luX2lkPSJteS1wbHVnaW4iKSAgICMgdGhlIHZhbHVlIG15LXBsdWdpbiBsYXN0IHdyb3RlCgogICAgICAgIGlmIGN0eC5leGVjdXRvcl9zdGF0ZSgiQzUwMDkyMCIpID09ICJwYXVzZWQiOgogICAgICAgICAgICBwcmludCgiQzUwMDkyMCBwcm9ncmFtIGlzIHBhdXNlZCIpCgoKYXN5bmMgZGVmIG1haW4oKSAtPiBOb25lOgogICAgYXN5bmNpby5jcmVhdGVfdGFzayhiYWNrZ3JvdW5kX21vbml0b3IoKSkKICAgIGF3YWl0IGN0eC5zdGFydCgpICAjIHN0YXlzIHJlc2lkZW50CgoKYXN5bmNpby5ydW4obWFpbigpKQpgYGAKCiMjIyMgUHJvZ3JhbSB2YXJpYWJsZXMgJiBleGVjdXRvciBzdGF0ZSAoYFBsdWdpblByb2dyYW1Db250ZXh0YCkKCmByYWluYm93LnJiX3Nkay5QbHVnaW5Qcm9ncmFtQ29udGV4dGAgbGV0cyB0aGUgcGx1Z2luIHByb2Nlc3MgaW50ZXJhY3Qgd2l0aCB0aGUKcnVubmluZyBwcm9ncmFtIChQeUZNKTogcmVhZC93cml0ZSBwcm9ncmFtIHZhcmlhYmxlcyBhbmQgb2JzZXJ2ZSBleGVjdXRpb24Kc3RhdGUg4oCUIGluc2lkZSBhIFN0ZXAgaGFuZGxlciBvciBmcm9tIGEgcmVzaWRlbnQgdGFzaywgYXQgYW55IHRpbWUuCgotIFRoZSBgb25fZXhlY3V0ZWAgaGFuZGxlciBpcyBjYWxsZWQgKipvbmx5IHdoZW4gUHlGTSBleGVjdXRlcyB0aGlzIHBsdWdpbidzCiAgU3RlcCoqLiBPbmUgU3RlcCBleGVjdXRpb24gPSBvbmUgaGFuZGxlciBjYWxsLCBhbmQgdGhlIFN0ZXAgZG9lcyBub3QgZmluaXNoCiAgdW50aWwgeW91IGNhbGwgYGN0eC5kb25lKClgIOKAlCBhbHdheXMgY2FsbCBpdC4KLSBUaGUgcGx1Z2luIHByb2Nlc3MgaXRzZWxmIHN0YXlzIHJlc2lkZW50IGFmdGVyIGBjdHguc3RhcnQoKWA7IGV4ZWN1dG9yIHN0YXRlCiAgcXVlcmllcyBhbmQgdmFyaWFibGUgYWNjZXNzIGJlbG93IGtlZXAgd29ya2luZyB3aGV0aGVyIG9yIG5vdCBhIFN0ZXAgaXMKICBleGVjdXRpbmcuCgojIyMjIFZhcmlhYmxlIG5hbWluZyBydWxlcyAoaW1wb3J0YW50KQoKUHlGTSB2YXJpYWJsZXMgYXJlIGEgKipwcm9ncmFtLXdpZGUgc2hhcmVkIG5hbWVzcGFjZSoqLiBPbmUgcnVsZToKCi0gKipNb2RpZnlpbmcgYW4gZXhpc3RpbmcgdmFyaWFibGUqKiDigJQgdGhlIG5hbWUgcGFzc2VzIGFzLWlzLiBFeGNoYW5naW5nCiAgdmFyaWFibGVzIGJldHdlZW4gdGhlIHByb2dyYW0gYW5kIHRoZSBwbHVnaW4gaXMgdGhlIGludGVuZGVkIHVzYWdlLgotICoqQ3JlYXRpbmcgYSB2YXJpYWJsZSB0aGF0IGRvZXNuJ3QgZXhpc3QqKiDigJQgdGhlIGBSQlBfYCBwcmVmaXggaXMKICAqKnJlcXVpcmVkKiogKGVuZm9yY2VkIGJ5IHRoZSBTREsvc2VydmVyOyBhIHZpb2xhdGlvbiByYWlzZXMKICBgUnVudGltZUVycm9yYCkuIEFwcGxpZXMgZXF1YWxseSBpbnNpZGUgYW5kIG91dHNpZGUgU3RlcCBleGVjdXRpb24uCgpGb3IgbmV3IHZhcmlhYmxlIG5hbWVzLCBhIGNvbnZlbnRpb24gdGhhdCBpbmNsdWRlcyB0aGUgcGx1Z2luIGlkIGlzIHN0cm9uZ2x5CnJlY29tbWVuZGVkOgoKYGBgClJCUF97cGx1Z2luX2lkfV97bmFtZX0KCmUuZy4gUkJQX3Zpc2lvbl9kZXRlY3RfY291bnQsIFJCUF9ncmlwcGVyX2xhc3RfZXJyb3IKYGBgCgpXaHk6CgotIGBSQlBfYCDigJQgaW5zdGFudGx5IGlkZW50aWZpZXMgcGx1Z2luLWNyZWF0ZWQgdmFyaWFibGVzIGluIHRoZSBwcm9ncmFtCiAgZWRpdG9yL1VJLgotIGB7cGx1Z2luX2lkfWAg4oCUICoqcHJldmVudHMgbmFtZSBjb2xsaXNpb25zIHdpdGggb3RoZXIgcGx1Z2lucy4qKiBJZiB0d28KICBwbHVnaW5zIHVzZSB0aGUgc2FtZSBuYW1lIHRoZXkgb3ZlcndyaXRlIHRoZSBzYW1lIHZhcmlhYmxlIChgUkJQX2AgYWxvbmUgaXMKICBub3Qgc29tZXRoaW5nIHRoZSBTREsgZ3VhcmRzIGFnYWluc3QpLgoKIyMjIyBSZWFkaW5nIC8gd3JpdGluZyB2YXJpYWJsZXMKCmBgYHB5dGhvbgp2YWx1ZSA9IGF3YWl0IGN0eC5nZXRfdmFyaWFibGUoImNvdW50ZXIiKSAgICAgICAgICAgICAgICAgIyByZWFkIChubyBuYW1lIHJlc3RyaWN0aW9uKQphd2FpdCBjdHguc2V0X3ZhcmlhYmxlKCJjb3VudGVyIiwgdmFsdWUgKyAxKSAgICAgICAgICAgICAgIyBtb2RpZnkgZXhpc3RpbmcgdmFyaWFibGUg4oCUIGFsbG93ZWQKYXdhaXQgY3R4LnNldF92YXJpYWJsZSgiUkJQX215LXBsdWdpbl9yZXN1bHQiLCA0MikgICAgICAgICMgY3JlYXRlIG5ldyB2YXJpYWJsZSDigJQgUkJQXyByZXF1aXJlZApgYGAKCmBzZXRfdmFyaWFibGVgIGFsd2F5cyBhcHBsaWVzIHRvICoqZXZlcnkgcnVubmluZyBtYWluIHRhc2sqKiAoYSBwbHVnaW4gYmVsb25ncwp0byBtdXNjYXQsIG5vdCB0byBhIHNwZWNpZmljIHJvYm90IOKAlCB0aGVyZSBpcyBubyBgcm9ib3RfbW9kZWxgIHBhcmFtZXRlcik6Cgp8IFdoZW4gfCBPd24gcHJvZ3JhbSB8IE90aGVyIHJvYm90cycgbWFpbiB0YXNrcyB8CnwtLS18LS0tfC0tLXwKfCBEdXJpbmcgb3duIFN0ZXAgZXhlY3V0aW9uIHwgdmlhIHRoZSBjb250cm9sIHF1ZXJ5YWJsZSDigJQgKippbW1lZGlhdGUqKiB8IGJyb2FkY2FzdCDigJQgZWFjaCBhdCBpdHMgbmV4dCBTdGVwIGJvdW5kYXJ5IHwKfCBPdXRzaWRlIGEgU3RlcCAocmVzaWRlbnQgdGFzaywg4oCmKSB8IHJlc2lkZW50IGVuZHBvaW50IOKAlCBuZXh0IFN0ZXAgYm91bmRhcnkgfCBzYW1lIHwKCmBnZXRfdmFyaWFibGVgIGhhcyBvcHRpb25zOgoKYGBgcHl0aG9uCmF3YWl0IGN0eC5nZXRfdmFyaWFibGUoImNvdW50ZXIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWFyY2ggYWxsIG1haW4gdGFza3MgKGZpcnN0IHZhbHVlIGZvdW5kKQphd2FpdCBjdHguZ2V0X3ZhcmlhYmxlKCJjb3VudGVyIiwgcm9ib3RfbW9kZWw9IkM1MDA5MjAiKSAgICMgYSBzcGVjaWZpYyByb2JvdCdzIHZhbHVlCmF3YWl0IGN0eC5nZXRfdmFyaWFibGUoIlJCUF9URVNUIiwgcGx1Z2luX2lkPSJBLnBsdWdpbiIpICAgIyB0aGUgdmFsdWUgdGhhdCBwbHVnaW4gbGFzdCB3cm90ZQpgYGAKCkNhdmVhdHM6CgotIElmIG5vIHByb2dyYW0gaXMgcnVubmluZywgYHNldF92YXJpYWJsZWAgaXMgKipzaWxlbnRseSBpZ25vcmVkKiogYW5kCiAgYGdldF92YXJpYWJsZWAgcmV0dXJucyBgTm9uZWAuIChgUnVudGltZUVycm9yYCBpcyByYWlzZWQgb25seSBmb3IgcmVhbAogIGVycm9ycywgbGlrZSB0aGUgYFJCUF9gIHZpb2xhdGlvbiBvbiBhIG5ldyB2YXJpYWJsZSDigJQgdGhlIG1lc3NhZ2UgaXMgdGFnZ2VkCiAgYFtwbHVnaW46e2lkfV1gIHdpdGggdGhlIG9mZmVuZGluZyBwbHVnaW4uKQotIFJhcmVseSwgYSB3cml0ZSBjYW4gYmUgbG9zdCBpZiBpdCByYWNlcyB0aGUgd29ya2VyJ3MgdmFyaWFibGUgZmx1c2gKICAobG9jay1mcmVlIHJlYWQtbW9kaWZ5LXdyaXRlKS4gRm9yIGltcG9ydGFudCB2YWx1ZXMsIHJlLWNoZWNrIGFuZCByZXRyeSBvbgogIHRoZSBuZXh0IGN5Y2xlLgoKIyMjIyBQZXItcGx1Z2luIHZhbHVlIHN0b3JhZ2UgKG1ldGEpCgpCZXNpZGVzIHRoZSBzaGFyZWQgdmFsdWUsIGVhY2ggdmFyaWFibGUgZW50cnkgcmVjb3JkcyB3aGljaCBwbHVnaW4gbGFzdCB3cm90ZQp3aGF0OgoKYGBgcHl0aG9uCiMgc3RhdGVfZGljdFsidmFyaWFibGVzIl0g4oCUIGFmdGVyIEEgd3JvdGUgMSBhbmQgQiB3cm90ZSAyCiJSQlBfVEVTVCI6IHsKICAgICJ2YWx1ZSI6IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNoYXJlZCBzbG90ID0gbGFzdCB3cml0dGVuIHZhbHVlCiAgICAidHlwZSI6ICJsb2NhbCIsCiAgICAibWV0YSI6IHsid3JpdGVycyI6IHsiQS5wbHVnaW4iOiAxLCAiQi5wbHVnaW4iOiAyfX0sICAgIyBwZXItcGx1Z2luIHJlY29yZAp9CmBgYAoKU28gdGhlIGV4YWN0IHZhbHVlIGlzIHJlY292ZXJhYmxlIGV2ZW4gd2hlbiBuYW1lcyBjb2xsaWRlOgoKLSBQbHVnaW4gU0RLOiBgY3R4LmdldF92YXJpYWJsZSgiUkJQX1RFU1QiLCBwbHVnaW5faWQ9IkEucGx1Z2luIilgIOKGkiBgMWAKLSBQcm9ncmFtIHN0ZXAgZXhwcmVzc2lvbjogYENPVU5UID0gZ2V0X3ZhcigiQS5wbHVnaW4iLCAiUkJQX1RFU1QiKSArIDFgIOKGkiBgMmAKLSBBIHBsYWluIG5hbWUgKGBSQlBfVEVTVCArPSAxYCkgdXNlcyB0aGUgc2hhcmVkIHNsb3QgKGxhc3Qgd3JpdHRlbiB2YWx1ZSkg4oaSIGAzYAoKIyMjIyBFeGVjdXRvciBzdGF0ZQoKU3Vic2NyaWJlcyB0byB0aGUgYG11c2NhdC9leGVjdXRvci9zdGF0ZWAgcHVibGlzaCAoMC44IHMgaW50ZXJ2YWwpIGFuZCBleHBvc2VzCnBlci1yb2JvdC1tb2RlbCBzdGF0ZToKCmBgYHB5dGhvbgpjdHguZXhlY3V0b3Jfc3RhdGUoIkM1MDA5MjAiKSAgICMgInJ1bm5pbmciIHwgInBhdXNlZCIgfCAid2FpdGluZyIgfCAuLi4gfCBOb25lCmN0eC5leGVjdXRvcl9zdGF0ZSgpICAgICAgICAgICAgIyB7IkM1MDA5MjAiOiAicGF1c2VkIiwgImFtciI6ICJydW5uaW5nIn0KY3R4LmlzX3BhdXNlZCgiQzUwMDkyMCIpICAgICAgICAjIHdoZXRoZXIgdGhhdCBtb2RlbCBpcyBwYXVzZWQKY3R4LmlzX3N0b3BwZWQoIkM1MDA5MjAiKSAgICAgICAjIHN0b3AvZXJyb3IgdHJhbnNpdGlvbiBvZiBhIG1vZGVsIHNlZW4gYWN0aXZlIHRoaXMgcnVuCmBgYAoKLSBTdGF0ZXM6IGBpZGxlIHwgcnVubmluZyB8IHBhdXNlZCB8IHdhaXRpbmcgfCBzdG9wcGVkIHwgcG9zdF9zdGFydCB8IGNvbXBsZXRlZCB8IGVycm9yYAotIEEgbW9kZWwgd2l0aCBubyBydW5uaW5nIHRhc2sgaXMgYE5vbmVgIC8gYWJzZW50IGZyb20gdGhlIGRpY3QuCi0gVGhlIHB1Ymxpc2ggaW50ZXJ2YWwgaXMgMC44IHMsIHNvIGV4cGVjdCB1cCB0byB+MSBzIG9mIGxhdGVuY3kuCi0gV2l0aCBgSVNfREVWPXRydWVgIHRoZXJlIGlzIG5vIHB1Ymxpc2ggYXQgYWxsIOKAlCBhbHdheXMgYE5vbmVgLgoKVG8gZ2V0IGEgY2FsbGJhY2sgYXQgdGhlIG1vbWVudCB0aGUgc3RhdGUgY2hhbmdlcywgd2l0aG91dCBwb2xsaW5nOgoKYGBgcHl0aG9uCkBjdHgub25fZXhlY3V0b3Jfc3RhdGVfY2hhbmdlCmFzeW5jIGRlZiBvbl9jaGFuZ2Uocm9ib3RfbW9kZWw6IHN0ciwgc3RhdGU6IHN0cikgLT4gTm9uZToKICAgIGlmIHN0YXRlID09ICJwYXVzZWQiOgogICAgICAgIHByaW50KGYie3JvYm90X21vZGVsfSBwYXVzZWQiKQpgYGAKCi0gTm90IGNhbGxlZCBmb3IgcmVwZWF0ZWQgcHVibGlzaGVzIG9mIHRoZSBzYW1lIHN0YXRlIOKAlCBmaXJlcyBleGFjdGx5IG9uY2UKICBwZXIgcGVyLW1vZGVsIHN0YXRlIGNoYW5nZS4KLSBBbiBleGNlcHRpb24gaW4gdGhlIGhhbmRsZXIgaXMgb25seSBsb2dnZWQ7IHN0YXRlIHRyYWNraW5nIGtlZXBzIHJ1bm5pbmcuCgojIyMjIFJlc3BvbmRpbmcgdG8gcGF1c2UgLyBzdG9wCgpgYGBweXRob24KQGN0eC5vbl9leGVjdXRlCmFzeW5jIGRlZiBoYW5kbGUoYXJnczogZGljdCkgLT4gTm9uZToKICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CiAgICAgICAgIyBzdG9wIOKGkiBDYW5jZWxsZWRFcnJvciAocHJvcGFnYXRlZCB0byB0aGUgZXhlY3V0b3IgYXMgYSBzdG9wKSwKICAgICAgICAjIHBhdXNlIOKGkiB3YWl0cyBoZXJlIHVudGlsIHJlc3VtZWQuCiAgICAgICAgIyBJbnNpZGUgb25fZXhlY3V0ZSB0aGlzIGF1dG9tYXRpY2FsbHkgd2F0Y2hlcyBvbmx5IHRoZSByb2JvdCBtb2RlbAogICAgICAgICMgZXhlY3V0aW5nIHRoaXMgU3RlcC4KICAgICAgICBhd2FpdCBjdHguY2hlY2tfc3RvcCgpCgogICAgICAgIC4uLiAgIyBhY3R1YWwgd29yawogICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC41KQoKICAgIGF3YWl0IGN0eC5kb25lKCkKYGBgCgpTY29wZSBwcmlvcml0eSBmb3IgYGNoZWNrX3N0b3BgIC8gYGlzX3BhdXNlZGAgLyBgaXNfc3RvcHBlZGA6CgoxLiBgcm9ib3RfbW9kZWxgIGdpdmVuIOKAlCB0aGF0IG1vZGVsIG9ubHkKMi4gT21pdHRlZCBpbnNpZGUgYG9uX2V4ZWN1dGVgIOKAlCAqKm9ubHkgdGhlIG1vZGVsIGV4ZWN1dGluZyB0aGlzIFN0ZXAqKgogICAocGFzc2VkIGluIGJ5IHRoZSBleGVjdXRvcikKMy4gT21pdHRlZCBlbHNld2hlcmUgKHJlc2lkZW50IHRhc2ssIOKApikg4oCUIGFsbCBtb2RlbHMKCkEgaGFuZGxlciBkb2luZyBsb25nLXJ1bm5pbmcgd29yayBtdXN0IGNhbGwgYGNoZWNrX3N0b3AoKWAgZXZlcnkgbG9vcAppdGVyYXRpb24gc28gaXQgcmVhY3RzIHRvIHBhdXNlL3N0b3AgaW1tZWRpYXRlbHkuIFdpdGhvdXQgaXQsIHRoZSBwbHVnaW4ga2VlcHMKcnVubmluZyBldmVuIGFmdGVyIHRoZSBvcGVyYXRvciBwcmVzc2VzIFN0b3AuCgpWYXJpYWJsZXMgeW91ciBwbHVnaW4gd2FudHMgdGhlIFByb2dyYW0gcGFnZSB2YXJpYWJsZSBwaWNrZXIgdG8gb2ZmZXIgbXVzdCBiZQpwcmUtZGVjbGFyZWQgaW4gYG1hbmlmZXN0Lmpzb25gIHVuZGVyIGAidmFyaWFibGVzImAgKHNlZSB0aGUgbWFuaWZlc3Qgc2VjdGlvbgpiZWxvdykuCgojIyMgQysrCgpDKysgcGx1Z2lucyB1c2UgYGNwcC9gIGFuZCBhcmUgYnVpbHQgd2l0aCBDTWFrZSBpbnNpZGUgRG9ja2VyIGFnYWluc3QgdGhlClJhaW5ib3cgUm9ib3RpY3MgQysrIFNESyAoc2VlIF9DKysgU0RLXyBiZWxvdykuCgpgYGBjcHAKI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHRocmVhZD4KCmludCBtYWluKCkgewogIGNvbnN0IGNoYXIqIHBsdWdpbl9pZCA9IHN0ZDo6Z2V0ZW52KCJSQl9QTFVHSU5fSUQiKTsKICBzdGQ6OmNvdXQgPDwgIltfX1BMVUdJTl9OQU1FX19dIGJhY2tlbmQgcmVhZHkiCiAgICAgICAgICAgIDw8IChwbHVnaW5faWQgPyBzdGQ6OnN0cmluZygiIChpZD0iKSArIHBsdWdpbl9pZCArICIpIiA6ICIiKQogICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CgogIHdoaWxlICh0cnVlKSB7CiAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwogIH0KICByZXR1cm4gMDsKfQpgYGAKCiMjIyMgQysrIFNESyAoYHJhaW5ib3ctcmItc2RrLWRldmApCgpCb3RoIEMrKyBydW50aW1lcyAoYGNwcGAsIGByb3MyYCArIGByY2xjcHBgKSBsaW5rIHRoZSBSYWluYm93IFJvYm90aWNzIEMrKyBTREsKZnJvbSB0aGUgYXB0IHBhY2thZ2UgYHJhaW5ib3ctcmItc2RrLWRldmAuIFRoZSBgbXVzY2F0LXBrYCBkZXYgY29udGFpbmVycyBhbHJlYWR5CmhhdmUgaXQsIHNvIGBtdXNjYXQtcGsgZGV2YCAvIGBidWlsZGAgbmVlZCBub3RoaW5nIGV4dHJhLiBUbyBidWlsZCBvdXRzaWRlIHRoZQpjb250YWluZXIgKHlvdXIgb3duIFVidW50dSAyNC4wNCBtYWNoaW5lLCBvciB0aGUgcm9ib3QgUEMpOgoKYGBgYmFzaApjdXJsIC1mc1NMIGh0dHBzOi8vcmFpbmJvd3JvYm90aWNzLmdpdGh1Yi5pby9yYi1zZGsvcmItc2RrLWFwdC1yZXBvLmdwZy5rZXkgfCBzdWRvIGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9yYi1zZGstYXB0LmdwZwplY2hvICdkZWIgW3NpZ25lZC1ieT0vdXNyL3NoYXJlL2tleXJpbmdzL3JiLXNkay1hcHQuZ3BnXSBodHRwczovL3JhaW5ib3dyb2JvdGljcy5naXRodWIuaW8vcmItc2RrIHN0YWJsZSBtYWluJyB8IHN1ZG8gdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL3JiLXNkay5saXN0CnN1ZG8gYXB0IHVwZGF0ZSAmJiBzdWRvIGFwdCBpbnN0YWxsIHJhaW5ib3ctcmItc2RrLWRldgpgYGAKCi0gQ01ha2U6IGBmaW5kX3BhY2thZ2UocmJfc2RrIFJFUVVJUkVEKWAgKyBgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKDx0YXJnZXQ+IHJiX3Nkazo6cmJfc2RrKWAgKEMrKzIwKS4gcGtnLWNvbmZpZzogYHJiX3Nka2AuCi0gSGVhZGVyczogYDxyYWluYm93L3JiX3Nkay9tYW5pcHVsYXRlL3JiX21hbmlwdWxhdGVfc2RrLmhwcD5gIChgUkJNYW5pcHVsYXRlU0RLYCksCiAgYDxyYWluYm93L3JiX3Nkay9wcm9ncmFtL3BsdWdpbl9wcm9ncmFtX2NvbnRleHQuaHBwPmAgKGByYl9wbHVnaW46OlBsdWdpblByb2dyYW1Db250ZXh0YCwgZm9yIGBwcm9ncmFtLnBhbmVsYCBjb21tYW5kcyDigJQgdGhlIGhlYWRlcidzIHRvcCBjb21tZW50IGhhcyBhIGZ1bGwgYG1haW4oKWAgZXhhbXBsZSkuCi0gVGhlIGJpbmFyeSBpcyBsaW5rZWQgKipkeW5hbWljYWxseSoqOyBgbXVzY2F0LXBrIGJ1aWxkYCBjb3BpZXMgdGhlIG1hdGNoaW5nIGBsaWJyYl9zZGsuc29gIGludG8gYGRpc3QvPGFyY2g+L2xpYi9gICh0aGUgcm9ib3QgaGFzIG5vIFNESyBpbnN0YWxsZWQpLCBzbyBlYWNoIHBsdWdpbiBrZWVwcyB0aGUgU0RLIHZlcnNpb24gaXQgd2FzIGJ1aWx0IHdpdGguIENoYW5nZSB0aGUgdmVyc2lvbiB3aXRoIGBNVVNDQVRfUEtfUkJfU0RLX1ZFUlNJT049PHZlcnNpb24+IE1VU0NBVF9QS19SRUJVSUxEX0lNQUdFPTEgbXVzY2F0LXBrIGRldmAuCi0gVUkg4oaUIGJhY2tlbmQgbWVzc2FnaW5nIHdvcmtzIGZyb20gQysrIHRvbzogYHJiX3BsdWdpbjo6UkJQbHVnaW5DYWxsYCBpbiBgPHJhaW5ib3cvcmJfc2RrL3BsdWdpbi9yYl9wbHVnaW4uaHBwPmAgKHNlZSB0aGUgc2NhZmZvbGRlZCBgY3BwL21haW4uY3BwYCkuCgojIyMgUk9TMiAocmNscHkpCgpST1MyIFB5dGhvbiBwbHVnaW5zIHVzZSBgcm9zMl93cy9gIHdpdGggYHJ1bnRpbWUucm9zQ2xpZW50OiAicmNscHkiYC4gVGhlIG5vZGUKaXMgbGF1bmNoZWQgd2l0aCBgLS1yb3MtYXJncyAtciBfX25zOj0ve3NsdWd9YCBhdXRvbWF0aWNhbGx5IGJ5IGBkZXY6YmFja2AuCgpgYGBweXRob24KIyByb3MyX3dzL3NyYy9fX1BMVUdJTl9TTFVHX18vX19QTFVHSU5fU0xVR19fL25vZGUucHkKaW1wb3J0IHJjbHB5CmZyb20gcmNscHkubm9kZSBpbXBvcnQgTm9kZQpmcm9tIHJhaW5ib3cucmJfc2RrIGltcG9ydCBSQk1hbmlwdWxhdGVTREsKCnNkayA9IFJCTWFuaXB1bGF0ZVNESygpCgoKY2xhc3MgX19QTFVHSU5fQ0xBU1NfX05vZGUoTm9kZSk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygiX19QTFVHSU5fU0xVR19fX25vZGUiKQogICAgICAgIHNlbGYuZ2V0X2xvZ2dlcigpLmluZm8oIl9fUExVR0lOX05BTUVfXyBub2RlIHN0YXJ0ZWQiKQogICAgICAgICMgdXNlIHNkayBhbG9uZ3NpZGUgUk9TMiBwdWJsaXNoZXJzL3N1YnNjcmliZXJzL3NlcnZpY2VzIGFzIG5lZWRlZApgYGAKCiMjIyBST1MyIChyY2xjcHApCgpST1MyIEMrKyBwbHVnaW5zIHVzZSBgcm9zMl93cy9gIHdpdGggYHJ1bnRpbWUucm9zQ2xpZW50OiAicmNsY3BwImAuIFRoZSBub2RlIGxpbmtzCnRoZSBSYWluYm93IEMrKyBTREsgdGhlIHNhbWUgd2F5IGFzIHRoZSBgY3BwYCBydW50aW1lIChzZWUgX0MrKyBTREtfIGFib3ZlKS4KCmBgYGNwcAojaW5jbHVkZSAicmNsY3BwL3JjbGNwcC5ocHAiCgpjbGFzcyBfX1BMVUdJTl9DTEFTU19fTm9kZSA6IHB1YmxpYyByY2xjcHA6Ok5vZGUgewpwdWJsaWM6CiAgX19QTFVHSU5fQ0xBU1NfX05vZGUoKSA6IE5vZGUoIl9fUExVR0lOX1NMVUdfX19ub2RlIikgewogICAgUkNMQ1BQX0lORk8odGhpcy0+Z2V0X2xvZ2dlcigpLCAiX19QTFVHSU5fTkFNRV9fIG5vZGUgc3RhcnRlZCIpOwogIH0KfTsKYGBgCgotLS0KCiMjIG1hbmlmZXN0Lmpzb24KCmBgYGpzb25jCnsKICAvLyB1bmlxdWUgcGx1Z2luIElEIOKAlCByZXZlcnNlLWRvbWFpbiBmb3JtYXQgcmVjb21tZW5kZWQKICAiaWQiOiAiY29tLmV4YW1wbGUubXktcGx1Z2luIiwKICAibmFtZSI6ICJNeSBQbHVnaW4iLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKCiAgLy8gbWluaW11bSBNdXNjYXQgdmVyc2lvbiByZXF1aXJlZCB0byBsb2FkIHRoaXMgcGx1Z2luCiAgIm1pbk11c2NhdFZlcnNpb24iOiAiMS4wLjAiLAoKICAvLyBwbHVnaW4gYXV0aG9yIChlbXB0eSBzdHJpbmcgaXMgZmluZSkKICAiYXV0aG9yIjogIllvdXIgTmFtZSIsCgogIC8vIGRpc3BsYXllZCBpbiB0aGUgTXVzY2F0IHBsdWdpbiBzdG9yZSAvIGluZm8gcGFuZWwKICAvLyBzdHJpbmcgb3IgeyBlbiAocmVxdWlyZWQpLCBrbywgamEsIHpoLCB2aSwgdGgsIGVzIH0KICAiZGVzY3JpcHRpb24iOiB7ICJlbiI6ICJQbHVnaW4gZGVzY3JpcHRpb24iLCAia28iOiAi7ZSM65+s6re47J24IOyEpOuqhSIgfSwKCiAgLy8gU1ZHIHN0cmluZyAoc2luZ2xlIGZpbGUpIG9yIFBORy9KUEcgc2l6ZSBtYXAgKGFsbCB0aHJlZSBzaXplcyByZXF1aXJlZCkKICAiaWNvbnMiOiAiYXNzZXRzL2ljb24uc3ZnIiwKICAvLyAiaWNvbnMiOiB7ICIxNiI6ICJhc3NldHMvaWNvbi0xNi5wbmciLCAiNDgiOiAiYXNzZXRzL2ljb24tNDgucG5nIiwgIjEyOCI6ICJhc3NldHMvaWNvbi0xMjgucG5nIiB9LAoKICAvLyB0YXJnZXRNb2RlbHMgYW5kL29yIHRhcmdldENhdGVnb3J5cyDigJQgYXQgbGVhc3Qgb25lIGlzIHJlcXVpcmVkCiAgLy8gImFsbCIgPSBldmVyeSB0YXJnZXQsIG9yIGxpc3Qgc3BlY2lmaWMgdmFsdWVzCiAgInRhcmdldE1vZGVscyI6ICJhbGwiLAogIC8vICJ0YXJnZXRNb2RlbHMiOiBbIkM1MDA5MjAiLCAiQzUwMDkzMCJdLAogICJ0YXJnZXRDYXRlZ29yeXMiOiAiYWxsIiwKICAvLyAidGFyZ2V0Q2F0ZWdvcnlzIjogWyJtYW5pcHVsYXRlIiwgImFtciIsICJyYnkxIiwgInZpc2lvbiJdLAoKICAiY29udHJpYnV0ZXMiOiBbCiAgICAvLyBwcm9ncmFtLnBhbmVsIOKAlCBkZWZpbmVzIGEgY3VzdG9tIGNvbW1hbmQgZm9yIHRoZSBQcm9ncmFtIHBhZ2Ugc2VxdWVuY2UKICAgIC8vICAgYnVpbGRlcjsgcnVucyB2aWEgUGx1Z2luUHJvZ3JhbUNvbnRleHQgd2hlbiB0aGUgcHJvZ3JhbSByZWFjaGVzIGl0CiAgICB7CiAgICAgICJwb2ludCI6ICJwcm9ncmFtLnBhbmVsIiwKICAgICAgImljb24iOiAiYXNzZXRzL2ljb24uc3ZnIiwKICAgICAgImxhYmVsIjogeyAia28iOiAi64K0IO2UjOufrOq3uOyduCIsICJlbiI6ICJNeSBQbHVnaW4iIH0sCiAgICAgICJ1aSI6ICJwcm9ncmFtIiwgICAgICAgICAgIC8vIG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhbGwgY29udHJpYnV0aW9ucwogICAgICAiY29tbWFuZEluZm8iOiB7CiAgICAgICAgIm5hbWUiOiAiTXkgUGx1Z2luIiwKICAgICAgICAiaWNvbiI6ICJhc3NldHMvaWNvbi5zdmciLAogICAgICAgICJmdW5jTmFtZSI6ICJyYl9wcm9ncmFtX3Nkay5wbHVnaW5fZXhlY3V0ZSIsCiAgICAgICAgImFyZ3MiOiB7fQogICAgICB9CiAgICB9LAogICAgLy8gdG9vbGJhciDigJQgYWRkcyBhIGJ1dHRvbiB0byB0aGUgdG9wIHRvb2xiYXIgKHJlcXVpcmVkKQogICAgewogICAgICAicG9pbnQiOiAidG9vbGJhciIsCiAgICAgICJpY29uIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgICAgICJsYWJlbCI6IHsgImtvIjogIuuCtCDtlIzrn6zqt7jsnbgiLCAiZW4iOiAiTXkgUGx1Z2luIiB9LAogICAgICAidWkiOiAiY29udGVudCIsICAgICAgICAgICAvLyBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIGNvbnRyaWJ1dGlvbnMKICAgICAgIm9wZW5zIjogInBvcG92ZXIiICAgICAgICAgLy8gcG9wb3ZlciB8IHBhbmVsIHwgcGFnZQogICAgfSwKICAgIC8vIG1vdmUucGFuZWwg4oCUIGFkZHMgYSBwYW5lbCB0byB0aGUgTW92ZSBzY3JlZW4KICAgIHsKICAgICAgInBvaW50IjogIm1vdmUucGFuZWwiLAogICAgICAiaWNvbiI6ICJhc3NldHMvaWNvbi5zdmciLAogICAgICAibGFiZWwiOiB7ICJrbyI6ICLrgrQg7ZSM65+s6re47J24IiwgImVuIjogIk15IFBsdWdpbiIgfSwKICAgICAgInVpIjogIm1vdmUiICAgICAgICAgICAgICAgLy8gbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBjb250cmlidXRpb25zCiAgICB9CiAgXSwKCiAgLy8gb3B0aW9uYWw6IHZhcmlhYmxlcyB0aGlzIHBsdWdpbiBleHBvc2VzIHRvIHB5Zm0gcHJvZ3JhbXMg4oCUIHRoZSBQcm9ncmFtCiAgLy8gcGFnZSB2YXJpYWJsZSBwaWNrZXIgbGlzdHMgT05MWSBkZWNsYXJlZCB2YXJpYWJsZXMuIG5hbWUgbXVzdCBzdGFydCB3aXRoCiAgLy8gUkJQXzsgZGVzY3JpcHRpb24gaXMgb3B0aW9uYWwgYnV0IHdpdGhvdXQgaXQgdGhlIFVJIGNhbid0IGV4cGxhaW4gdGhlCiAgLy8gdmFyaWFibGUsIHNvIHdyaXRlIG9uZS4KICAidmFyaWFibGVzIjogWwogICAgeyAibmFtZSI6ICJSQlBfZ3JpcF9mb3JjZSIsICJ0eXBlIjogIm51bWJlciIsICJpbml0IjogMC41LCAiZGVzY3JpcHRpb24iOiB7ICJrbyI6ICLqt7jrpqztjbwg7Z6YIiwgImVuIjogIkdyaXBwZXIgZm9yY2UiIH0gfSwKICAgIHsgIm5hbWUiOiAiUkJQX3RhcmdldF9wb3NlIiwgInR5cGUiOiAiYXJyYXkiLCAiaW5pdCI6IFswLCAwLCAwXSB9CiAgXSwKCiAgLy8gcnVudGltZSDigJQgb25lIG9mOgogIC8vICAgeyAidHlwZSI6ICJub25lIiB9CiAgLy8gICB7ICJ0eXBlIjogInB5dGhvbiIsICJlbnRyeSI6ICJtYWluLnB5IiB9CiAgLy8gICB7ICJ0eXBlIjogImNwcCIsICJlbnRyeSI6ICI8ZXhlY3V0YWJsZSBuYW1lPiIgfQogIC8vICAgeyAidHlwZSI6ICJyb3MyIiwgInJvc0NsaWVudCI6ICJyY2xweSIgfCAicmNsY3BwIiwgInBhY2thZ2UiOiAiLi4uIiwgImxhdW5jaCI6ICIuLi5fbm9kZSIgfQogICJydW50aW1lIjogeyAidHlwZSI6ICJweXRob24iLCAiZW50cnkiOiAibWFpbi5weSIgfSwKCiAgLy8gb3B0aW9uYWw6IFRDUCBwb3J0cyBvcGVuZWQgYnkgdGhpcyBwbHVnaW4gYmFja2VuZAogIC8vIG9ubHkgbnVtYmVyW10gaXMgYWxsb3dlZDsgcmFuZ2VzL29iamVjdHMgYXJlIG5vdCBhY2NlcHRlZAogIC8vIGV4dGVybmFsIHBsdWdpbiBwb3J0cyBtdXN0IGJlIHdpdGhpbiAyODYwMC0yODk5OQogICJwb3J0cyI6IFsyODYwMF0KfQpgYGAKCioqQmFja2VuZCB0eXBlczoqKgoKfCB0eXBlIHwgc291cmNlIGRpciB8IGJ1aWxkIC8gcnVuIHwgZW50cnkgfAp8LS0tfC0tLXwtLS18LS0tfAp8IGBweXRob25gIHwgYHB5L2AgfCBwaXAgKyBydW4gaW4gRG9ja2VyIHwgYG1haW4ucHlgIHwKfCBgY3BwYCB8IGBjcHAvYCB8IENNYWtlIGluIERvY2tlciB8IGJ1aWx0IGV4ZWN1dGFibGUgbmFtZSB8CnwgYHJvczJgIChyY2xweSkgfCBgcm9zMl93cy9gIHwgY29sY29uIChhbWVudF9weXRob24pIGluIERvY2tlciB8IOKAlCB8CnwgYHJvczJgIChyY2xjcHApIHwgYHJvczJfd3MvYCB8IGNvbGNvbiAoYW1lbnRfY21ha2UpIGluIERvY2tlciB8IOKAlCB8Cgo+IEV2ZXJ5IGJhY2sgZW5kIHJ1bnMgaW4gYSBEb2NrZXIgY29udGFpbmVyIG1hdGNoaW5nIHRoZSByb2JvdCAoVWJ1bnR1IDI0LjA0ICsgUHl0aG9uIDMuMTIpLCBzbyBkZXYgYmVoYXZlcyBsaWtlIHByb2R1Y3Rpb24gYW5kIGNvbXBpbGVkIGJpbmFyaWVzIGFyZSBBQkktY29tcGF0aWJsZS4gKipEb2NrZXIgaXMgcmVxdWlyZWQqKiBmb3IgYWxsIGJhY2tlbmQgdHlwZXMgKG9ubHkgYSBmcm9udGVuZC1vbmx5IGBub25lYCBwbHVnaW4gc2tpcHMgaXQpLiBObyBsb2NhbCBQeXRob24vdG9vbGNoYWluIHNldHVwIGlzIG5lZWRlZC4KCioqQ29udHJpYnV0aW9uIHBvaW50czoqKgoKfCBwb2ludCB8IFdoZXJlIGl0IGFwcGVhcnMgfCBCYWNrZW5kIHwgYGNvbW1hbmRJbmZvYCB8CnwtLS18LS0tfC0tLXw6LS0tOnwKfCBgdG9vbGJhcmAgfCBUb3AgdG9vbGJhciBidXR0b24gKG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUpIHwgU0RLIC8gYHJiLmFjdGlvbmAgfCDigJQgfAp8IGBsbmJgIHwgTGVmdCBuYXZpZ2F0aW9uIGVudHJ5IHwgU0RLIC8gYHJiLmFjdGlvbmAgfCDigJQgfAp8IGBtb3ZlLnBhbmVsYCB8IE1vdmUgc2NyZWVuIHBhbmVsIHwgU0RLIC8gYHJiLmFjdGlvbmAgfCDigJQgfAp8IGBwcm9ncmFtLnBhbmVsYCB8IEN1c3RvbSBjb21tYW5kIGluIHRoZSBQcm9ncmFtIHBhZ2Ugc2VxdWVuY2UgYnVpbGRlciB8IGBQbHVnaW5Qcm9ncmFtQ29udGV4dGAgfCDinJMgfAoKKipgY29tbWFuZEluZm9gIGZpZWxkcyoqIChmb3IgYHByb2dyYW0ucGFuZWxgKToKCnwgZmllbGQgfCB0eXBlIHwgZGVzY3JpcHRpb24gfAp8LS0tfC0tLXwtLS18CnwgYG5hbWVgIHwgYHN0cmluZ2AgfCBEaXNwbGF5IG5hbWUgb2YgdGhlIGNvbW1hbmQgaW4gdGhlIHByb2dyYW0gdHJlZSB8CnwgYGljb25gIHwgYHN0cmluZ2AgfCBJY29uIHBhdGggfAp8IGBpY29uQ2xhc3NOYW1lYCB8IGBzdHJpbmc/YCB8IE9wdGlvbmFsIENTUyBjbGFzcyBmb3IgdGhlIGljb24gfAp8IGBmdW5jTmFtZWAgfCBgc3RyaW5nP2AgfCBCYWNrZW5kIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCB8CnwgYGFyZ3NgIHwgYFJlY29yZDxzdHJpbmcsIGFueT4/YCB8IERlZmF1bHQgYXJndW1lbnRzIHwKfCBgZGlzYWJsZWRgIHwgYGJvb2xlYW4/YCB8IFdoZXRoZXIgdGhlIG5vZGUgaXMgZGlzYWJsZWQgfAp8IGBhbGxvd0NoaWxkcmVuYCB8IGBzdHJpbmdbXT9gIHwgQWxsb3dlZCBjaGlsZCBjb21tYW5kcyB8CnwgYGFsbG93UGFyZW50c2AgfCBgc3RyaW5nW10/YCB8IEFsbG93ZWQgcGFyZW50IGNvbW1hbmRzIHwKfCBgbm90QWxsb3dDaGlsZHJlbmAgfCBgc3RyaW5nW10/YCB8IERpc2FsbG93ZWQgY2hpbGQgY29tbWFuZHMgfAp8IGBzeW5jR3JvdXBJZGAgfCBgYm9vbGVhbj9gIHwgU3luYyBncm91cCBJRCBhY3Jvc3MgY2hpbGRyZW4gfAp8IGBkaXNhYmxlQ29weWAgfCBgYm9vbGVhbj9gIHwgUHJldmVudCBjb3B5IHwKfCBgZGlzYWJsZURlbGV0ZWAgfCBgYm9vbGVhbj9gIHwgUHJldmVudCBkZWxldGUgfAp8IGByZXF1aXJlQ2hpbGRyZW5gIHwgYGJvb2xlYW4/YCB8IFdoZXRoZXIgYSBjaGlsZCBjb21tYW5kIGlzIHJlcXVpcmVkIHwKfCBgcmVxdWlyZVBhcmVudGAgfCBgYm9vbGVhbj9gIHwgV2hldGhlciBhIHBhcmVudCBjb21tYW5kIGlzIHJlcXVpcmVkIHwKfCBgY2hpbGRyZW5Db21tYW5kYCB8IGBzdHJpbmc/YCB8IERlZmF1bHQgY29tbWFuZCB0eXBlIGZvciBjaGlsZHJlbiB8CgoqKlZhbGlkYXRpb24gcnVsZXM6KioKLSBgaWRgLCBgbmFtZWAsIGB2ZXJzaW9uYCwgYG1pbk11c2NhdFZlcnNpb25gIOKAlCByZXF1aXJlZCBub24tZW1wdHkgc3RyaW5ncwotIGBhdXRob3JgIOKAlCByZXF1aXJlZCBub24tZW1wdHkgc3RyaW5nCi0gYGRlc2NyaXB0aW9uYCDigJQgcmVxdWlyZWQgKGBzdHJpbmdgIG9yIGB7IGVuIChyZXF1aXJlZCksIGtvPywgamE/LCB6aD8sIHZpPywgdGg/LCBlcz8gfWApCi0gYGljb25zYCDigJQgU1ZHOiBzaW5nbGUgc3RyaW5nIHBhdGggZW5kaW5nIGluIGAuc3ZnYDsgUE5HL0pQRzogb2JqZWN0IHdpdGggYCIxNiJgLCBgIjQ4ImAsIGAiMTI4ImAgYWxsIHByZXNlbnQKLSBgdGFyZ2V0TW9kZWxzYCDigJQgYCJhbGwiYCBvciBhIG5vbi1lbXB0eSBhcnJheSBvZiByb2JvdCBtb2RlbCBJRCBzdHJpbmdzIChhdCBsZWFzdCBvbmUgb2YgYHRhcmdldE1vZGVsc2AgLyBgdGFyZ2V0Q2F0ZWdvcnlzYCByZXF1aXJlZCkKLSBgdGFyZ2V0Q2F0ZWdvcnlzYCDigJQgYCJhbGwiYCBvciBhIG5vbi1lbXB0eSBhcnJheSBvZiBgIm1hbmlwdWxhdGUiIHwgImFtciIgfCAicmJ5MSIgfCAidmlzaW9uImAgKGF0IGxlYXN0IG9uZSBvZiBgdGFyZ2V0TW9kZWxzYCAvIGB0YXJnZXRDYXRlZ29yeXNgIHJlcXVpcmVkKQotIGBjb250cmlidXRlc2Ag4oCUIHJlcXVpcmVkIGFycmF5OyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGB0b29sYmFyYCBlbnRyeQotIGB1aWAg4oCUIGVhY2ggY29udHJpYnV0aW9uIG11c3QgaGF2ZSBhIHVuaXF1ZSB2YWx1ZQotIGBjb21tYW5kSW5mb2Ag4oCUIHJlcXVpcmVkIHdoZW4gYHBvaW50YCBpcyBgInByb2dyYW0ucGFuZWwiYAotIGBwb3J0c2Ag4oCUIG9wdGlvbmFsIGBudW1iZXJbXWA7IGV2ZXJ5IHBvcnQgbXVzdCBiZSB3aXRoaW4gYDI4NjAwLTI4OTk5YAogIGFuZCBtdXN0IG5vdCBiZSBhIHJlc2VydmVkIHJvYm90L2luZHVzdHJpYWwvaW50ZXJuYWwgcG9ydAotIGB2YXJpYWJsZXNgIOKAlCBvcHRpb25hbCBhcnJheSBvZiBgeyBuYW1lLCB0eXBlLCBpbml0LCBkZXNjcmlwdGlvbj8gfWA6CiAgLSBgbmFtZWAg4oCUIG11c3Qgc3RhcnQgd2l0aCBgUkJQX2AsIHRoZW4gbGV0dGVycy9kaWdpdHMvdW5kZXJzY29yZTsgdW5pcXVlIHBlciBwbHVnaW4KICAtIGB0eXBlYCDigJQgYCJudW1iZXIiIHwgInN0cmluZyIgfCAiYXJyYXkiYAogIC0gYGluaXRgIOKAlCByZXF1aXJlZCBpbml0aWFsIHZhbHVlLCBtdXN0IG1hdGNoIGB0eXBlYAogIC0gYGRlc2NyaXB0aW9uYCDigJQgb3B0aW9uYWwgYHN0cmluZ2Agb3IgaTE4biBvYmplY3QgKGBlbmAgcmVxdWlyZWQgaW4gb2JqZWN0IGZvcm0pCgpgbXVzY2F0LXBrIGJ1aWxkYCB0aHJvd3Mgb24gYW55IHZhbGlkYXRpb24gZXJyb3IuIGBtdXNjYXQtcGsgZGV2YCBwcmludHMKd2FybmluZ3Mg4oCUIGV4Y2VwdCBgdmFyaWFibGVzYCBlcnJvcnMgKGUuZy4gYSBuYW1lIHdpdGhvdXQgdGhlIGBSQlBfYCBwcmVmaXgpLAp3aGljaCBhcmUgaGFyZCBlcnJvcnMgaW4gYGRldmAgLyBgZGV2OmJhY2tgIHRvby4KCioqQmFja2VuZCBwb3J0IHJ1bGVzOioqCi0gRGVjbGFyZSBhIHBvcnQgb25seSBpZiB5b3VyIGJhY2tlbmQgb3BlbnMgYSBUQ1Agc2VydmVyL2xpc3RlbmVyLgotICoqRXZlcnkgbGlzdGVuaW5nIFRDUCBwb3J0IG11c3QgYmUgZGVjbGFyZWQuKiogYG11c2NhdC1wayBkZXZgIGFuZAogIGBtdXNjYXQtcGsgZGV2OmJhY2tgIHdhdGNoIHRoZSBiYWNrZW5kIGFuZCBzdG9wIGl0IHRoZSBtb21lbnQgaXQgb3BlbnMgYSBwb3J0CiAgdGhhdCBpcyBub3QgaW4gYHBvcnRzYC4gQSBwb3J0IG91dHNpZGUgYDI4NjAwLTI4OTk5YCBjYW4ndCBiZSBkZWNsYXJlZCwgc28gaXQKICBtdXN0IG5vdCBiZSBvcGVuZWQgZWl0aGVyIOKAlCBwaWNraW5nIGUuZy4gYDU1MDBgIGlzIG5vdCBhIHdheSBhcm91bmQgdGhlIHJ1bGUuCiAgSXQgd291bGQgZXNjYXBlIHRoaXMgY2hlY2sgKmFuZCogdGhlIHJvYm90J3MgaW5zdGFsbC10aW1lIGNvbmZsaWN0IGNoZWNrLCBhbmQKICBvbmx5IGNvbGxpZGUgb25jZSBpdCdzIHJ1bm5pbmcgb24gYSByb2JvdC4KLSBSZXNlcnZlZCBwb3J0cyBpbmNsdWRlIGA1MDJgLCBgMjIyMmAsIGA0ODQwYCwgYDUxNzAtNTE3OWAsIGA4MDAwLTg5OTlgLAogIGAxMDAwMGAsIGAzMDAwNGAsIGAzNDk2NGAsIGA0NDgxOGAsIGA1MDAwMC01MDAwNWAsIGFuZCBgNTAwNTFgLgotIFRoZSByb2JvdCByZWplY3RzIGluc3RhbGxhdGlvbiAoSFRUUCA0MDkpIGlmIGEgZGVjbGFyZWQgcG9ydCBpcyByZXNlcnZlZCwKICBvdXQgb2YgcmFuZ2UsIG9yIGFscmVhZHkgY2xhaW1lZCBieSBhbm90aGVyIGVuYWJsZWQgcGx1Z2luLgoKKipSZWFjaGluZyB5b3VyIGJhY2tlbmQncyBwb3J0cyBkdXJpbmcgZGV2ZWxvcG1lbnQ6KioKLSBEZWNsYXJlZCBwb3J0cyBhcmUgcHVibGlzaGVkIHRvIGAxMjcuMC4wLjFgIG9uIHlvdXIgbWFjaGluZSwgc28KICBgY3VybCBodHRwOi8vMTI3LjAuMC4xOjI4NjAwYCB3b3JrcyBmcm9tIHRoZSBob3N0IG9uIG1hY09TLCBXaW5kb3dzLCBhbmQgTGludXguCi0gT24gbmF0aXZlIExpbnV4IHRoZSBkZXYgY29udGFpbmVyIHVzZXMgaG9zdCBuZXR3b3JraW5nLCBzbyB0aGUgcG9ydHMgYXJlIG9uCiAgdGhlIGhvc3QgYWxyZWFkeS4KLSBJZiBhIGRlY2xhcmVkIHBvcnQgaXMgYWxyZWFkeSB0YWtlbiBvbiB5b3VyIG1hY2hpbmUsIGBtdXNjYXQtcGsgZGV2YCB3YXJucyBhbmQKICBza2lwcyBwdWJsaXNoaW5nIHRoYXQgb25lIOKAlCB0aGUgYmFja2VuZCBzdGlsbCBsaXN0ZW5zIGluc2lkZSB0aGUgY29udGFpbmVyLgoKLS0tCgojIyBMb2NhbGl6ZWQgZG9jdW1lbnRhdGlvbgoKWW91IGNhbiBzaGlwIHBlci1sYW5ndWFnZSBSRUFETUUgZmlsZXMgYWxvbmdzaWRlIHRoZSBtYWluIGBSRUFETUUubWRgLiBQbGFjZSB0aGVtIGluIHRoZSBwcm9qZWN0IHJvb3Q6CgpgYGAKUkVBRE1FLm1kICAgICAgICAjIGRlZmF1bHQgLyBFbmdsaXNoIGZhbGxiYWNrClJFQURNRS5rby5tZCAgICAgIyBLb3JlYW4KUkVBRE1FLmVuLm1kICAgICAjIGV4cGxpY2l0IEVuZ2xpc2ggKG9wdGlvbmFsKQpSRUFETUUuamEubWQgICAgICMgSmFwYW5lc2UKYGBgCgpBbGwgYFJFQURNRSoubWRgIGZpbGVzIGZvdW5kIGF0IHRoZSBwcm9qZWN0IHJvb3QgYXJlIGF1dG9tYXRpY2FsbHkgY29waWVkIHRvIGBkaXN0L2Agb24KYG11c2NhdC1wayBidWlsZGAuIE11c2NhdCBkaXNwbGF5cyB0aGUgZmlsZSBtYXRjaGluZyB0aGUgdXNlcidzIGxvY2FsZSwKZmFsbGluZyBiYWNrIHRvIGBSRUFETUUubWRgIGlmIG5vbmUgbWF0Y2hlcy4KCi0tLQoKIyMgSW5zdGFsbGluZyBQeXRob24gZGVwZW5kZW5jaWVzCgpBZGQgYW55IHBhY2thZ2Ugd2l0aCBhbiBvcHRpb25hbCB2ZXJzaW9uIHBpbiB0byBgcmVxdWlyZW1lbnRzLnR4dGA6CgpgYGAKcmFpbmJvdy1yYi1zZGsKcmFpbmJvdy1yYi1mbGF0LWJ1ZmZlcnMKbnVtcHk9PTEuMjYuNApvcGVuY3YtcHl0aG9uCmBgYAoKUnVuIGBtdXNjYXQtcGsgZGV2YCBvciBgbXVzY2F0LXBrIGRldjpiYWNrYCDigJQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQgYXV0b21hdGljYWxseQppbnNpZGUgdGhlIGRldiBjb250YWluZXIgKGBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0YCkgb24gZXZlcnkgc3RhcnR1cC4gTm8KbG9jYWwgUHl0aG9uIGlzIHJlcXVpcmVkIGZvciB0aGlzLgoKYG11c2NhdC1wayBkZXY6YmFja2AgYWxzbyBiZXN0LWVmZm9ydCBjcmVhdGVzL3JlZnJlc2hlcyBhIGxvY2FsIGAudmVudmAgaW4gdGhlCmJhY2tncm91bmQgKHZpYSBgdXZgIGlmIGF2YWlsYWJsZSwgZWxzZSB5b3VyIHN5c3RlbSBQeXRob24pIHdpdGggdGhlIHNhbWUgZGVwcyDigJQKcHVyZWx5IHNvIHlvdXIgZWRpdG9yIChweWxpbnQsIHB5cmlnaHQsIG15cHksIC4uLikgY2FuIHJlc29sdmUgaW1wb3J0cyBhbmQgbGludApjb3JyZWN0bHkuIEl0J3Mgbm90IHVzZWQgdG8gcnVuIHRoZSBiYWNrZW5kOyBEb2NrZXIgaXMgdGhlIGFjdHVhbCBleGVjdXRpb24KZW52aXJvbm1lbnQsIHNvIHRoaXMgc3RlcCBpcyBzaWxlbnRseSBza2lwcGVkIGlmIG5vIGxvY2FsIFB5dGhvbiB0b29sY2hhaW4gaXMKYXZhaWxhYmxlLiBQb2ludCB5b3VyIGVkaXRvcidzIFB5dGhvbiBpbnRlcnByZXRlciBhdCBgLnZlbnZgLgoKYG11c2NhdC1wayBzZGsgdXBkYXRlYCBhbHNvIHJlZnJlc2hlcyBgLnZlbnZgIGluIHBsYWNlIGlmIG9uZSBhbHJlYWR5IGV4aXN0cywgc28KeW91ciBlZGl0b3IgcGlja3MgdXAgdGhlIG5ldyBgcmFpbmJvdy1yYi1zZGtgIHZlcnNpb24gaW1tZWRpYXRlbHkuCgo+IGBtdXNjYXQtcGsgYnVpbGRgIG9ubHkgKipwaW5zKiogdmVyc2lvbnMgaW4gYHJlcXVpcmVtZW50cy50eHRgIOKAlCBpdCBkb2VzIG5vdCBydW4gYHBpcCBpbnN0YWxsYCAodGhlIHJvYm90IGluc3RhbGxzIHRoZW0gYXQgbG9hZCB0aW1lKS4KCi0tLQoKIyMgU3dpdGNoaW5nIGJhY2tlbmQgdHlwZQoKYGBgYmFzaAptdXNjYXQtcGsgdHlwZSBjaGFuZ2UgICAgICAgICAgICAgICAgICMgaW50ZXJhY3RpdmUKbXVzY2F0LXBrIHR5cGUgY2hhbmdlIC0tdG8gY3BwICAgICAgICAjIOKGkiBDKysKbXVzY2F0LXBrIHR5cGUgY2hhbmdlIC0tdG8gcm9zMiAgICAgICAjIOKGkiBST1MyIChyY2xweSAvIFB5dGhvbikKbXVzY2F0LXBrIHR5cGUgY2hhbmdlIC0tdG8gcm9zMi1jcHAgICAjIOKGkiBST1MyIChyY2xjcHAgLyBDKyspCm11c2NhdC1wayB0eXBlIGNoYW5nZSAtLXRvIHB5dGhvbiAgICAgIyDihpIgUHl0aG9uCmBgYAoKPiBFeGlzdGluZyBiYWNrZW5kIGRpcnMgKGByb3MyX3dzL2AsIGBjcHAvYCkgYXJlIG5vdCBkZWxldGVkIHdoZW4gc3dpdGNoaW5nIGF3YXkuIFJlbW92ZSB0aGVtIG1hbnVhbGx5IGlmIG5vIGxvbmdlciBuZWVkZWQuCgotLS0KCiMjIEFJIGNvZGluZyBhc3Npc3RhbnRzIChNQ1ApCgpJZiB5b3UgYnVpbGQgeW91ciBwbHVnaW4gd2l0aCBhbiBBSSBhc3Npc3RhbnQgKENsYXVkZSBDb2RlLCBDb2RleCwg4oCmKSwgZ2l2ZSBpdApncm91bmRlZCBrbm93bGVkZ2Ugb2YgdGhlIE11c2NhdCBVSSBjb21wb25lbnRzLCBkZXNpZ24gdG9rZW5zLCBhbmQgU0RLIGluc3RlYWQgb2YKbGV0dGluZyBpdCBndWVzcy4gYG11c2NhdC1wayBtY3BgIGlzIGFuIE1DUCBzZXJ2ZXIgZXhwb3Npbmc6CgotIGBsaXN0X2NvbXBvbmVudHNgIC8gYGdldF9jb21wb25lbnRfcHJvcHNgIC8gYGdldF9jb21wb25lbnRfZXhhbXBsZWAg4oCUIGV2ZXJ5CiAgYEByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aS9yZWFjdGAgY29tcG9uZW50IHdpdGggaXRzIHJlYWwgcHJvcHMgYW5kIGEgd29ya2luZwogIFN0b3J5Ym9vayBleGFtcGxlLgotIGBsaXN0X2Rlc2lnbl90b2tlbnNgIC8gYHNlYXJjaF9kZXNpZ25fdG9rZW5zYCDigJQgdGhlIFRhaWx3aW5kIGNsYXNzZXMgdG8gdXNlCiAgKGBiZy1iZy0qYCwgYHRleHQtZmctKmAsIGB0eXBvLSpgLCDigKYpIHNvIHlvdXIgVUkgbWF0Y2hlcyB0aGUgaG9zdCB0aGVtZS4KLSBgc2VhcmNoX3JiX3Nka2Ag4oCUIGhvdyB0byB1c2UgYHVzZVJiKClgLCBgcmIuKmAsIGB1c2VSYkZvcm1EYXRhYC9gdXNlUmJTYXZlYCwgYW5kCiAgdGhlIGJhY2tlbmQgcnVudGltZXMuCi0gYGxpc3RfcmJfc2RrYCAvIGBnZXRfcmJfc2RrX2FwaWAg4oCUIHRoZSBpbnN0YWxsZWQgYHJhaW5ib3ctcmItc2RrYCAoUHl0aG9uCiAgYmFja2VuZCkgY2xhc3NlcyBhbmQgc2lnbmF0dXJlczsgd2l0aCBgbGFuZzogImNwcCJgLCB0aGUgQysrIFNESyBoZWFkZXJzCiAgKGByYWluYm93LXJiLXNkay1kZXZgLCByZWFkIG91dCBvZiB0aGUgYG11c2NhdC1wa2AgY3BwIGRldiBpbWFnZSDigJQgYnVpbGQgaXQKICBvbmNlIHdpdGggYG11c2NhdC1wayBkZXY6YmFja2ApLgoKKipCcm93c2UgdGhlIGNvbXBvbmVudHMgbGl2ZSoqIHdpdGggYG11c2NhdC1wayBzdG9yeWJvb2tgLgoKIyMjIFJlZ2lzdGVyIHRoZSBzZXJ2ZXIKCioqQ2xhdWRlIENvZGUqKiDigJQgYSBgLm1jcC5qc29uYCBpcyBhbHJlYWR5IHNjYWZmb2xkZWQgYXQgeW91ciBwbHVnaW4gcm9vdCwgc28KaXQgd29ya3Mgb3V0IG9mIHRoZSBib3g6CgpgYGBqc29uCnsKICAibWNwU2VydmVycyI6IHsKICAgICJtdXNjYXQiOiB7CiAgICAgICJjb21tYW5kIjogIm11c2NhdC1wayIsCiAgICAgICJhcmdzIjogWyJtY3AiXQogICAgfQogIH0KfQpgYGAKCioqQ29kZXgqKiDigJQgcmVnaXN0ZXIgb25jZSB3aXRoOgoKYGBgYmFzaAptdXNjYXQtcGsgbWNwIC0taW5zdGFsbCBjb2RleApgYGAKClRoaXMgYXBwZW5kcyB0aGUgc2VydmVyIHRvIGB+Ly5jb2RleC9jb25maWcudG9tbGAgKGlkZW1wb3RlbnQg4oCUIHNhZmUgdG8gcnVuCmFnYWluKS4gRXF1aXZhbGVudCBtYW51YWwgY29uZmlnOgoKYGBgdG9tbApbbWNwX3NlcnZlcnMubXVzY2F0XQpjb21tYW5kID0gIm11c2NhdC1wayIKYXJncyA9IFsibWNwIl0KYGBgCgpBbnkgb3RoZXIgTUNQIGNsaWVudCB3b3JrcyB0b28g4oCUIGl0J3MgYSBzdGFuZGFyZCBzdGRpbyBNQ1Agc2VydmVyIHN0YXJ0ZWQgd2l0aApgbXVzY2F0LXBrIG1jcGAuIElmIGBtdXNjYXQtcGtgIGlzbid0IG9uIHRoZSBjbGllbnQncyBQQVRILCB1c2UgaXRzIGFic29sdXRlIHBhdGgKKGB3aGljaCBtdXNjYXQtcGtgKSBhcyBgY29tbWFuZGAuCgotLS0KCiMjIFNoaXBwaW5nCgpgYGBiYXNoCm11c2NhdC1wayBidWlsZCAgICAgICAgICAgICMgYnVpbGQgKyBaSVAKbXVzY2F0LXBrIGJ1aWxkIC0tbm8temlwICAgIyBidWlsZCBvbmx5LCBubyBaSVAKYGBgCgotIEJ1aWxkcyBgdWkvY29udGVudC50c3hgIOKGkiBgZGlzdC9jb250ZW50LmpzYCAobWluaWZpZWQpCi0gUGlucyBgcmVxdWlyZW1lbnRzLnR4dGAgdG8gbGF0ZXN0IHZlcnNpb25zIChzdGFibGUtb25seSBvbiBgbWFpbmAgYnJhbmNoKQotIENvcGllcyBgYXNzZXRzL2AsIGBtYW5pZmVzdC5qc29uYCwgYFJFQURNRSoubWRgLCBgcHkvYCwgYW5kIGByZXF1aXJlbWVudHMudHh0YCBpbnRvIGBkaXN0L2AKLSBST1MyOiBydW5zIGBjb2xjb24gYnVpbGRgIGluc2lkZSB0aGUgSmF6enkgY29udGFpbmVyOyBpbmNsdWRlcyBgcm9zMl93cy9pbnN0YWxsL2AKLSBPdXRwdXQ6IGBfX1BMVUdJTl9ESVJfXy17dmVyc2lvbn0uemlwYAoKWklQIGxheW91dDoKCmBgYApfX1BMVUdJTl9ESVJfXy0xLjAuMC56aXAK4pSc4pSAIGRpc3QvCuKUgiAgIOKUnOKUgCBjb250ZW50LmpzICAgICAgICAjIGJ1aWx0IFVJCuKUgiAgIOKUnOKUgCBtYW5pZmVzdC5qc29uCuKUgiAgIOKUnOKUgCBhc3NldHMvCuKUgiAgIOKUnOKUgCBSRUFETUUubWQK4pSCICAg4pSc4pSAIFJFQURNRS5rby5tZCAgICAgICMgaWYgcHJlc2VudArilIIgICDilJzilIAgbWFpbi5weSAgICAgICAgICAgIyBmcm9tIHB5LwrilIIgICDilJTilIAgcmVxdWlyZW1lbnRzLnR4dCAgIyBwaW5uZWQK4pSU4pSAIHJvczJfd3MvaW5zdGFsbC8gICAgICAjIFJPUzIgb25seQpgYGAKCi0tLQoKIyMgQWxsIGNvbW1hbmRzCgpgYGBiYXNoCm11c2NhdC1wayBkZXYgICAgICAgICMgVUkgKyBiYWNrZW5kCm11c2NhdC1wayBkZXY6dWkgICAgICMgVUkgcHJldmlldyBvbmx5IChwcmV2aWV3LWhvc3QpCm11c2NhdC1wayBkZXY6YmFjayAgICMgYmFja2VuZCBvbmx5IChQeXRob246IHdhdGNoZmlsZXMgLyBST1MyOiBEb2NrZXIpCm11c2NhdC1wayBidWlsZCAgICAgICMgYnVpbGQg4oaSIGRpc3QvICsgZGlzdHJpYnV0YWJsZSBaSVAgKC0tbm8temlwIHRvIHNraXApCm11c2NhdC1wayBzdG9yeWJvb2sgICMgYnJvd3NlIHRoZSByYi1jb21wb25lbnRzIFVJIGxpYnJhcnkgaW4gYSBicm93c2VyCm11c2NhdC1wayBtY3AgICAgICAgICMgTUNQIHNlcnZlciBmb3IgQUkgYXNzaXN0YW50cyAoY29tcG9uZW50cy90b2tlbnMvU0RLIGRvY3MpCmBgYAoKYGBgYmFzaAptdXNjYXQtcGsgdHlwZSBjaGFuZ2UgICAgIyBzd2l0Y2ggYmFja2VuZCB0eXBlCm11c2NhdC1wayBzZGsgbGlzdCAgICAgICAjIHNob3cgY3VycmVudCBQeXRob24gU0RLIHZlcnNpb24KbXVzY2F0LXBrIHNkayB1cGRhdGUgICAgICMgdXBkYXRlIFB5dGhvbiBTREsgdG8gbGF0ZXN0Cm11c2NhdC1wayB1cGRhdGUgICAgICAgICAjIHVwZGF0ZSBtdXNjYXQtcGx1Z2luLWtpdCBpdHNlbGYKbXVzY2F0LXBrIHVuaW5zdGFsbCAgICAgICMgcmVtb3ZlIG11c2NhdC1wayBpdHNlbGYKYGBgCg==","common/assets/icon.svg":"PHN2ZyB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI1NiIgdmlld0JveD0iMCAwIDI1NiAyNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImJnIiB4MT0iMzYiIHkxPSIyOCIgeDI9IjIyMCIgeTI9IjIyOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjOEI1Q0Y2Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzVCMjFCNiIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZ3JhcGUiIHgxPSI5MiIgeTE9Ijc0IiB4Mj0iMTY4IiB5Mj0iMTc4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNEOEI0RkUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQTg1NUY3Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KCiAgPHJlY3QgeD0iMTYiIHk9IjE2IiB3aWR0aD0iMjI0IiBoZWlnaHQ9IjIyNCIgcng9IjUyIiBmaWxsPSJ1cmwoI2JnKSIvPgoKICA8IS0tIHBsdWdpbiBicmFja2V0cyAtLT4KICA8cGF0aCBkPSJNNzIgODRINTZDNDcuMTYzNCA4NCA0MCA5MS4xNjM0IDQwIDEwMFYxMTYiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxwYXRoIGQ9Ik0xODQgODRIMjAwQzIwOC44MzcgODQgMjE2IDkxLjE2MzQgMjE2IDEwMFYxMTYiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxwYXRoIGQ9Ik03MiAxNzJINTZDNDcuMTYzNCAxNzIgNDAgMTY0LjgzNyA0MCAxNTZWMTQwIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjEyIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8cGF0aCBkPSJNMTg0IDE3MkgyMDBDMjA4LjgzNyAxNzIgMjE2IDE2NC44MzcgMjE2IDE1NlYxNDAiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgoKICA8IS0tIGdyYXBlIHN0ZW0gKyBsZWFmIC0tPgogIDxwYXRoIGQ9Ik0xMjggNzNDMTI4IDU5IDEzNyA0OCAxNTEgNDQiIHN0cm9rZT0iI0YzRThGRiIgc3Ryb2tlLXdpZHRoPSIxMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPHBhdGggZD0iTTE0MiA1MUMxNTEgMzkgMTY5IDM5IDE3OSA1MEMxNjUgNjAgMTUxIDYyIDE0MiA1MVoiIGZpbGw9IiNDNEI1RkQiLz4KCiAgPCEtLSBtdXNjYXQgZ3JhcGUgY2x1c3RlciAtLT4KICA8Y2lyY2xlIGN4PSIxMDYiIGN5PSI5MSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTMyIiBjeT0iODgiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjE1OCIgY3k9IjkxIiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSI5NCIgY3k9IjExOSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTIwIiBjeT0iMTE2IiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSIxNDYiIGN5PSIxMTYiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjE3MiIgY3k9IjExOSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTA3IiBjeT0iMTQ1IiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSIxMzMiIGN5PSIxNDQiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjE1OSIgY3k9IjE0NSIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CiAgPGNpcmNsZSBjeD0iMTIwIiBjeT0iMTcwIiByPSIxOCIgZmlsbD0idXJsKCNncmFwZSkiLz4KICA8Y2lyY2xlIGN4PSIxNDYiIGN5PSIxNzAiIHI9IjE4IiBmaWxsPSJ1cmwoI2dyYXBlKSIvPgogIDxjaXJjbGUgY3g9IjEzMyIgY3k9IjE5MyIgcj0iMTgiIGZpbGw9InVybCgjZ3JhcGUpIi8+CgogIDwhLS0gY2VudGVyIHBsdWdpbiBnbHlwaCAtLT4KICA8cGF0aCBkPSJNMTIyIDExOVYxMDlDMTIyIDEwMy40NzcgMTI2LjQ3NyA5OSAxMzIgOTlIMTM2QzE0MS41MjMgOTkgMTQ2IDEwMy40NzcgMTQ2IDEwOVYxMTkiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPHJlY3QgeD0iMTE2IiB5PSIxMTgiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNCIgcng9IjEwIiBmaWxsPSJ3aGl0ZSIvPgogIDxwYXRoIGQ9Ik0xMjcgMTUyVjE2MyIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8cGF0aCBkPSJNMTQxIDE1MlYxNjMiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=","common/manifest.json":"ewogICJpZCI6ICJfX1BMVUdJTl9JRF9fIiwKICAibmFtZSI6ICJfX1BMVUdJTl9OQU1FX18iLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAibWluTXVzY2F0VmVyc2lvbiI6ICIxLjAuMCIsCiAgImF1dGhvciI6ICJfX1BMVUdJTl9BVVRIT1JfXyIsCiAgImVtYWlsIjogIl9fUExVR0lOX0VNQUlMX18iLAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJrbyI6ICIiLAogICAgImVuIjogIiIKICB9LAogICJpY29ucyI6ICJhc3NldHMvaWNvbi5zdmciLAogICJ0YXJnZXRNb2RlbHMiOiAiYWxsIiwKICAidGFyZ2V0Q2F0ZWdvcnlzIjogImFsbCIsCiAgImNvbnRyaWJ1dGVzIjogWwogICAgewogICAgICAicG9pbnQiOiAidG9vbGJhciIsCiAgICAgICJpY29uIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgICAgICJsYWJlbCI6IHsgImtvIjogIl9fUExVR0lOX05BTUVfXyIsICJlbiI6ICJfX1BMVUdJTl9OQU1FX18iIH0sCiAgICAgICJ1aSI6ICJjb250ZW50IiwKICAgICAgIm9wZW5zIjogInBvcG92ZXIiCiAgICB9CiAgXSwKICAidmFyaWFibGVzIjogW10sCiAgInJ1bnRpbWUiOiB7ICJ0eXBlIjogIl9fUlVOVElNRV9UWVBFX18iLCAiZW50cnkiOiAibWFpbi5weSIgfQp9Cg==","common/package.json":"ewogICJuYW1lIjogIl9fUExVR0lOX0lEX18iLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAicHJpdmF0ZSI6IHRydWUsCiAgInR5cGUiOiAibW9kdWxlIiwKICAiZGVwZW5kZW5jaWVzIjogewogICAgIkByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aSI6ICJfX1JCX1ZFUlNJT05fXyIKICB9LAogICJkZXZEZXBlbmRlbmNpZXMiOiB7CiAgICAiQHRhaWx3aW5kY3NzL3ZpdGUiOiAiXjQuMS4wIiwKICAgICJAcmFpbmJvdy1yb2JvdGljcy9tdXNjYXQtcGx1Z2luLWtpdCI6ICJfX1JCX1ZFUlNJT05fXyIsCiAgICAiQHJhaW5ib3ctcm9ib3RpY3MvcHJldmlldy1ob3N0IjogIl9fUkJfVkVSU0lPTl9fIiwKICAgICJAdHlwZXMvcmVhY3QiOiAiXjE5LjAuMTAiLAogICAgIkB0eXBlcy9yZWFjdC1kb20iOiAiXjE5LjAuNCIsCiAgICAiQHZpdGVqcy9wbHVnaW4tcmVhY3QiOiAiXjQuMC4wIiwKICAgICJyZWFjdCI6ICJeMTkuMC4wIiwKICAgICJyZWFjdC1kb20iOiAiXjE5LjAuMCIsCiAgICAidGFpbHdpbmRjc3MiOiAiXjQuMS4wIiwKICAgICJ0eXBlc2NyaXB0IjogIl41LjguMCIsCiAgICAidml0ZSI6ICJeNi4wLjAiCiAgfQp9Cg==","common/py/main.py":"IiIiCk11c2NhdCBwbHVnaW4gYmFja2VuZCDigJQgX19QTFVHSU5fTkFNRV9fCgpPbi1yb2JvdCAoZGVmYXVsdCk6CiAgbXVzY2F0LXBrIGRldjpiYWNrCiAgcHl0aG9uIG1haW4ucHkKClJlbW90ZSBkZXYgKGZyb20geW91ciBsYXB0b3ApOgogIFNldCBlbnYgdmFycyBiZWZvcmUgcnVubmluZzoKICAgIE1VU0NBVF9ST0JPVF9IT1NUPTE5Mi4xNjguMS4xMDAKICAgIE1VU0NBVF9ST0JPVF9UT0tFTj08c2VydmljZSB0b2tlbj4KICBUaGVuOiBtdXNjYXQtcGsgZGV2OmJhY2sKCkhhbmRsZXJzOgogIHBsdWdpbi5zZXJ2ZSAvIHBsdWdpbi5zdWJzY3JpYmUgLyBwbHVnaW4ucHVibGlzaCAgLT4gcGx1Z2luIFVJIDwtPiBiYWNrZW5kIG9ubHkKICBwbHVnaW4ucm91dGVyLm9uIC8gc3Vic2NyaWJlIC8gZW1pdCAgICAgICAgICAgICAgIC0+IGV4dGVybmFsIGVuZHBvaW50cwogICAgKFJFU1QgLyBTb2NrZXQuSU8gLyBUQ1AgLyBNUVRUIC8gV2ViUlRDIGF0IGNvbW1vbi9wbHVnaW4vPHBsdWdpbl9pZD4vPHBhdGg+KS4KICAgIE5lZWRzIGEgcm9ib3QgcnVubmluZyByYWluYm93LXJiLXNkayA+PSAwLjAuOS5kZXY1OyBvbGRlciByb2JvdHMgaGF2ZSBubwogICAgYHBsdWdpbi5yb3V0ZXJgIChBdHRyaWJ1dGVFcnJvcikuIFNlZSBSRUFETUUgIkV4dGVybmFsIGVuZHBvaW50cyIuCiIiIgoKaW1wb3J0IGFzeW5jaW8KaW1wb3J0IG9zCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmZyb20gcmFpbmJvdy5yYl9zZGsgaW1wb3J0IFJCTWFuaXB1bGF0ZVNESywgUkJQbHVnaW5DYWxsCmZyb20gcmFpbmJvdy5yYl9zZGsucmJfc2RrX2NwcCBpbXBvcnQgQ29ubmVjdE9wdGlvbnMKCgpQTFVHSU5fTkFNRSA9ICJfX1BMVUdJTl9OQU1FX18iCgpwbHVnaW4gPSBSQlBsdWdpbkNhbGwoKQptYW5pcHVsYXRlID0gUkJNYW5pcHVsYXRlU0RLKCkKCgpkZWYgcmVnaXN0ZXJfaGFuZGxlcnMoKToKICAgICMgUmVnaXN0ZXIgaGFuZGxlcnMgaGVyZSDigJQgY2FsbGVkIGFmdGVyIGNvbm5lY3QoKSBzbyBzdWJzY3JpcHRpb25zIHN1cnZpdmUKICAgICMgc2Vzc2lvbiByZWNvbm5lY3Rpb24gaW4gcmVtb3RlLWRldiBtb2RlLgoKICAgICMgLS0tIFBsdWdpbiBVSSA8LT4gYmFja2VuZCAobm90IHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgTXVzY2F0KSAtLS0KCiAgICBAcGx1Z2luLnN1YnNjcmliZSgiZXZlbnQiKQogICAgZGVmIG9uX3VpX2V2ZW50KHBheWxvYWQ6IGRpY3Rbc3RyLCBBbnldIHwgTm9uZSA9IE5vbmUpOgogICAgICAgICIiIkhhbmRsZSBtZXNzYWdlcyBwdWJsaXNoZWQgZnJvbSB0aGUgcGx1Z2luIFVJIHdpdGggcmIucHViKCJldmVudCIsIC4uLikuIiIiCiAgICAgICAgcHJpbnQoZiJbe1BMVUdJTl9OQU1FfV0gZXZlbnQ6IiwgcGF5bG9hZCkKCiAgICBAcGx1Z2luLnNlcnZlKCJncmlwIikKICAgIGRlZiBncmlwKHBheWxvYWQ6IGRpY3Rbc3RyLCBBbnldIHwgTm9uZSA9IE5vbmUpOgogICAgICAgICIiIkhhbmRsZSB0aGUgZGVmYXVsdCBVSSBidXR0b246IHJiLmFjdGlvbigiZ3JpcCIsIHsgd2lkdGggfSkuIiIiCiAgICAgICAgd2lkdGggPSAocGF5bG9hZCBvciB7fSkuZ2V0KCJ3aWR0aCIsIDIwKQogICAgICAgIHByaW50KGYiW3tQTFVHSU5fTkFNRX1dIGdyaXAgcmVxdWVzdGVkOiB3aWR0aD17d2lkdGh9IikKICAgICAgICBwbHVnaW4ucHVibGlzaCgic3RhdGUiLCB7InJlYWR5IjogVHJ1ZSwgImxhc3RfZ3JpcF93aWR0aCI6IHdpZHRofSkKICAgICAgICByZXR1cm4geyJvayI6IFRydWUsICJ3aWR0aCI6IHdpZHRofQoKICAgIEBwbHVnaW4uc2VydmUoInRvb2wvZWNobyIpCiAgICBkZWYgZWNobyhwYXlsb2FkOiBkaWN0W3N0ciwgQW55XSB8IE5vbmUgPSBOb25lKToKICAgICAgICAiIiJTbWFsbCBxdWVyeSBleGFtcGxlIGNhbGxhYmxlIGZyb20gdGhlIFVJIHdpdGggcmIuYWN0aW9uKCJ0b29sL2VjaG8iLCAuLi4pLiIiIgogICAgICAgIHJldHVybiB7ImVjaG8iOiBwYXlsb2FkLCAicGx1Z2luIjogUExVR0lOX05BTUV9CgogICAgIyAtLS0gRXh0ZXJuYWwgZW5kcG9pbnRzIChSRVNUIC8gU29ja2V0LklPIC8gVENQIC8gTVFUVCAvIFdlYlJUQykgLS0tCiAgICAjIEV4cG9zZWQgYXMgY29tbW9uL3BsdWdpbi88cGx1Z2luX2lkPi9oZWxsbywgZS5nLgogICAgIyAgIGN1cmwgLVggUE9TVCBodHRwOi8vPHJvYm90Pi9jb21tb24vcGx1Z2luLzxwbHVnaW5faWQ+L2hlbGxvIFwKICAgICMgICAgICAgIC1IICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIC1kICd7Im5hbWUiOiAia2ltIn0nCiAgICAjIFJlc3RyaWN0IHRyYW5zcG9ydHMgd2l0aCBleHBsaWNpdF9yb3V0ZXM9WyJhcGkiXSAoUkVTVCBvbmx5KSwgZXRjLgogICAgIyBSYWlzZSBQbHVnaW5Sb3V0ZUVycm9yKDQwMywgIm1zZyIpIHRvIHNldCB0aGUgcmVzcG9uc2Ugc3RhdHVzLgoKICAgIEBwbHVnaW4ucm91dGVyLm9uKCIvaGVsbG8iKQogICAgZGVmIGhlbGxvKHBheWxvYWQ6IGRpY3Rbc3RyLCBBbnldIHwgTm9uZSA9IE5vbmUsIG1ldGE6IGRpY3Rbc3RyLCBBbnldIHwgTm9uZSA9IE5vbmUpOgogICAgICAgICIiIm1ldGEgPSB7InRyYW5zcG9ydCI6ICJhcGkifCJzb2NrZXQifCJ0Y3AifCJtcXR0Inwid2VicnRjIiwgInByaW5jaXBhbCI6IGRpY3QgfCBOb25lfS4iIiIKICAgICAgICBuYW1lID0gKHBheWxvYWQgb3Ige30pLmdldCgibmFtZSIsICJ0aGVyZSIpCiAgICAgICAgcmV0dXJuIHsibXNnIjogZiJoaSB7bmFtZX0iLCAidmlhIjogKG1ldGEgb3Ige30pLmdldCgidHJhbnNwb3J0Iil9CgoKZGVmIG1vdmVfal9leGFtcGxlKCk6CiAgICAiIiIKICAgIEV4YW1wbGU6IHVzZSBvdGhlciByb2JvdCBTREtzIGZyb20gdGhlIHNhbWUgYmFja2VuZC4KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgYXV0b21hdGljYWxseS4gQWRkIHNhZmV0eSBjaGVja3MgYW5kIGNhbGwgaXQKICAgIGZyb20geW91ciBvd24gaGFuZGxlciB3aGVuIHRoZSByb2JvdCBpcyByZWFkeS4KICAgICIiIgogICAgcmV0dXJuIG1hbmlwdWxhdGUubW92ZS5jYWxsX21vdmVfaigKICAgICAgICByb2JvdF9tb2RlbD0iQzUwMDkyMCIsCiAgICAgICAgdGFyZ2V0PXsKICAgICAgICAgICAgInRhcl92YWx1ZXMiOiBbMCwgMCwgMCwgMCwgMCwgMF0sCiAgICAgICAgICAgICJ0YXJfZnJhbWUiOiAwLAogICAgICAgICAgICAidGFyX3VuaXQiOiAwLAogICAgICAgIH0sCiAgICApCgoKYXN5bmMgZGVmIG1haW4oKToKICAgIHJvYm90X2hvc3QgPSBvcy5nZXRlbnYoIk1VU0NBVF9ST0JPVF9IT1NUIikKICAgIHJvYm90X3Rva2VuID0gb3MuZ2V0ZW52KCJNVVNDQVRfUk9CT1RfVE9LRU4iKQoKICAgIGlmIHJvYm90X2hvc3QgYW5kIHJvYm90X3Rva2VuOgogICAgICAgICMgUmVtb3RlIGRldjogY29ubmVjdCB0byB0aGUgcm9ib3QgYmVmb3JlIHJlZ2lzdGVyaW5nIGFueSBoYW5kbGVycy4KICAgICAgICAjIGNvbm5lY3QoKSBjbG9zZXMgYW5kIHJlb3BlbnMgdGhlIFplbm9oIHNlc3Npb24sIHNvIGhhbmRsZXJzIHJlZ2lzdGVyZWQKICAgICAgICAjIGJlZm9yZSB0aGlzIGNhbGwgd291bGQgYmUgbG9zdC4KICAgICAgICBvcHRzID0gQ29ubmVjdE9wdGlvbnMoKQogICAgICAgIG9wdHMudG9rZW4gPSByb2JvdF90b2tlbgogICAgICAgIG9wdHMuaG9zdCA9IHJvYm90X2hvc3QKICAgICAgICBtYW5pcHVsYXRlLmNvbm5lY3Qob3B0cykKCiAgICByZWdpc3Rlcl9oYW5kbGVycygpCgogICAgcGx1Z2luLnB1Ymxpc2goInN0YXRlIiwgeyJyZWFkeSI6IFRydWUsICJwbHVnaW4iOiBQTFVHSU5fTkFNRX0pICAgICAgICMgLT4gcGx1Z2luIFVJCiAgICBwbHVnaW4ucm91dGVyLmVtaXQoIi9zdGF0ZSIsIHsicmVhZHkiOiBUcnVlLCAicGx1Z2luIjogUExVR0lOX05BTUV9KSAgIyAtPiBleHRlcm5hbCBzdWJzY3JpYmVycyBvZiBjb21tb24vcGx1Z2luLzxwbHVnaW5faWQ+L3N0YXRlCiAgICBwcmludChmIlt7UExVR0lOX05BTUV9XSBiYWNrZW5kIHJlYWR5IikKCiAgICB0cnk6CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxKQogICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgYXN5bmNpby5DYW5jZWxsZWRFcnJvcik6CiAgICAgICAgcGFzcwogICAgZmluYWxseToKICAgICAgICBpZiByb2JvdF9ob3N0IGFuZCByb2JvdF90b2tlbjoKICAgICAgICAgICAgYXdhaXQgbWFuaXB1bGF0ZS5kaXNjb25uZWN0KCkKICAgICAgICBwcmludChmIlt7UExVR0lOX05BTUV9XSBzdG9wcGVkIikKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdHJ5OgogICAgICAgIGFzeW5jaW8ucnVuKG1haW4oKSkKICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICBwYXNzCg==","common/requirements.txt":"cmFpbmJvdy1yYi1zZGs9PTAuMS4wCnJhaW5ib3ctcmItZmxhdC1idWZmZXJzPT0wLjEuMApyYWluYm93LXJiLXplbm9oPT0wLjEuMApyZXF1ZXN0cz09Mi4zNC4yCg==","common/tsconfig.json":"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidGFyZ2V0IjogIkVTTmV4dCIsCiAgICAibW9kdWxlIjogIkVTTmV4dCIsCiAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJidW5kbGVyIiwKICAgICJqc3giOiAicmVhY3QtanN4IiwKICAgICJzdHJpY3QiOiB0cnVlLAogICAgInNraXBMaWJDaGVjayI6IHRydWUsCiAgICAibm9FbWl0IjogdHJ1ZSwKICAgICJsaWIiOiBbIkRPTSIsICJET00uSXRlcmFibGUiLCAiRVNOZXh0Il0KICB9LAogICJpbmNsdWRlIjogWyJ1aSJdCn0K","common/ui/content.tsx":"aW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB7CiAgUkJDaGVja0JveCwKICBSQkxhYmVsQnV0dG9uLAogIFJCUmFkaW9Cb3gsCiAgUkJTZWxlY3RCb3gsCiAgUkJTbGlkZXIsCiAgUkJTd2l0Y2gsCiAgUkJUZXh0QXJlYSwKICBSQlRleHRGaWVsZCwKICBSQlRleHRJbnB1dCwKICBPcHRpb24KfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3QiOwppbXBvcnQgeyB1c2VSYiB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aS9zZGsiOwoKdHlwZSBSdW5Nb2RlID0gImluc3BlY3QiIHwgImFzc2lzdCIgfCAiYXV0byI7Cgpjb25zdCBNT0RFX09QVElPTlM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IFJ1bk1vZGUgfT4gPSBbCiAgeyBsYWJlbDogIkluc3BlY3QiLCB2YWx1ZTogImluc3BlY3QiIH0sCiAgeyBsYWJlbDogIkFzc2lzdCIsIHZhbHVlOiAiYXNzaXN0IiB9LAogIHsgbGFiZWw6ICJBdXRvIiwgdmFsdWU6ICJhdXRvIiB9LApdOwoKY29uc3QgVEFTS19PUFRJT05TID0gWwogIHsgbGFiZWw6ICJQdWJsaXNoIHN0YXR1cyIsIHZhbHVlOiAicHVibGlzaCIgfSwKICB7IGxhYmVsOiAiUnVuIGdyaXAgYWN0aW9uIiwgdmFsdWU6ICJncmlwIiB9LAogIHsgbGFiZWw6ICJTYXZlIHNuYXBzaG90IiwgdmFsdWU6ICJzbmFwc2hvdCIgfSwKXTsKCi8vIEV4cG9ydCB5b3VyIFVJIGFzIHRoZSBkZWZhdWx0LiBUaGUgaG9zdCBtb3VudHMgaXQgKGRldjogd2l0aCBITVIpLgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7CiAgY29uc3QgcmIgPSB1c2VSYigpOwogIGNvbnN0IFt0YXJnZXROYW1lLCBzZXRUYXJnZXROYW1lXSA9IHVzZVN0YXRlKCJkZW1vX3RhcmdldCIpOwogIGNvbnN0IFtncmlwVHlwZSwgc2V0R3JpcFR5cGVdID0gdXNlU3RhdGU8c3RyaW5nPigpOwogIGNvbnN0IFtncmlwV2lkdGgsIHNldEdyaXBXaWR0aF0gPSB1c2VTdGF0ZSgyNCk7CiAgY29uc3QgW3NwZWVkLCBzZXRTcGVlZF0gPSB1c2VTdGF0ZSg0NSk7CiAgY29uc3QgW21vZGUsIHNldE1vZGVdID0gdXNlU3RhdGU8UnVuTW9kZT4oImFzc2lzdCIpOwogIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IHVzZVN0YXRlKHRydWUpOwogIGNvbnN0IFt0YXNrcywgc2V0VGFza3NdID0gdXNlU3RhdGU8QXJyYXk8c3RyaW5nPj4oWyJwdWJsaXNoIiwgImdyaXAiXSk7CiAgY29uc3QgW21lbW8sIHNldE1lbW9dID0gdXNlU3RhdGUoIlVzZSB0aGlzIGFyZWEgZm9yIG9wZXJhdG9yIG5vdGVzLiIpOwoKICBjb25zdCBwYXlsb2FkID0gdXNlTWVtbygKICAgICgpID0+ICh7CiAgICAgIHRhcmdldE5hbWUsCiAgICAgIGdyaXBXaWR0aCwKICAgICAgc3BlZWQsCiAgICAgIG1vZGUsCiAgICAgIGVuYWJsZWQsCiAgICAgIHRhc2tzLAogICAgICBtZW1vLAogICAgfSksCiAgICBbdGFyZ2V0TmFtZSwgZ3JpcFdpZHRoLCBzcGVlZCwgbW9kZSwgZW5hYmxlZCwgdGFza3MsIG1lbW9dLAogICk7CgogIGNvbnN0IHNob3dSZXF1ZXN0RXJyb3IgPSAoZXJyb3I6IHVua25vd24pID0+IHsKICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICJSZXF1ZXN0IGZhaWxlZCI7CiAgICByYi50b2FzdCh7IHR5cGU6ICJkYW5nZXIiLCBtZXNzYWdlIH0pOwogIH07CgogIGNvbnN0IHJ1bkFjdGlvbiA9IGFzeW5jICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGF3YWl0IHJiLmFjdGlvbigiZ3JpcCIsIHBheWxvYWQpOwogICAgICByYi50b2FzdCh7IHR5cGU6ICJzdWNjZXNzIiwgbWVzc2FnZTogYFNlbnQgJHt0YXJnZXROYW1lfWAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBzaG93UmVxdWVzdEVycm9yKGVycm9yKTsKICAgIH0KICB9OwoKICBjb25zdCBwdWJsaXNoUHJldmlldyA9IGFzeW5jICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGlzQ29uZmlybSA9IGF3YWl0IHJiLmNvbmZpcm0oewogICAgICAgIG1lc3NhZ2U6ICJBcmUgeW91IHN1cmUgcHVibGlzaD8iLAogICAgICAgIGJ1dHRvblRleHQ6IHsgeWVzOiAiY29uZmlybSIsIG5vOiAiY2FuY2VsIiB9LAogICAgICB9KTsKCiAgICAgIGlmIChpc0NvbmZpcm0pIHsKICAgICAgICBhd2FpdCByYi5wdWIoImV2ZW50IiwgcGF5bG9hZCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHNob3dSZXF1ZXN0RXJyb3IoZXJyb3IpOwogICAgfQogIH07CgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0ibWF4LWgtWzcwdmhdIHctWzQyMHB4XSBwLTQgbWF4LXctZnVsbCBvdmVyZmxvdy15LWF1dG8gYmctYmctZWxldmF0ZWQgdGV4dC1mZy1kZWZhdWx0Ij4KICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZmxleC1jb2wgZ2FwLTUiPgogICAgICAgIDxoZWFkZXI+CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0xMiI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT0idHlwby1oZWFkaW5nLXhzLXNlbWlib2xkIj5EZW1vIENvbnRyb2w8L2gyPgogICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idHlwby1ib2R5LXhzMi1ub3JtYWwgdGV4dC1mZy1zdWJ0bGUiPgogICAgICAgICAgICAgICAgSW5wdXQgcGF0dGVybnMgZm9yIE11c2NhdCBwbHVnaW4gVUlzCiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPFJCU3dpdGNoCiAgICAgICAgICAgICAgY2hlY2tlZD17ZW5hYmxlZH0KICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhuZXh0OiBib29sZWFuKSA9PiB7CiAgICAgICAgICAgICAgICBzZXRFbmFibGVkKG5leHQpOwogICAgICAgICAgICAgICAgcmIudG9hc3Qoe21lc3NhZ2U6IG5leHQgPyAiUGx1Z2luIGVuYWJsZWQiIDogIlBsdWdpbiBwYXVzZWQifSk7CiAgICAgICAgICAgICAgfX0KICAgICAgICAgICAgLz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaGVhZGVyPgoKICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9ImZsZXggZmxleC1jb2wgZ2FwLTQiPgogICAgICAgICAgPFJCVGV4dEZpZWxkCiAgICAgICAgICAgIGxhYmVsPSJUYXJnZXQgbmFtZSIKICAgICAgICAgICAgcmVxdWlyZWQKICAgICAgICAgICAgaGVscGVyVGV4dD0iVXNlZCBhcyB0aGUgYmFja2VuZCBhY3Rpb24gdGFyZ2V0LiIKICAgICAgICAgID4KICAgICAgICAgICAgPFJCVGV4dElucHV0CiAgICAgICAgICAgICAgbmFtZT0idGFyZ2V0TmFtZSIKICAgICAgICAgICAgICB2YWx1ZT17dGFyZ2V0TmFtZX0KICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0idGFyZ2V0IGlkIgogICAgICAgICAgICAgIGhhbmRsZUNoYW5nZT17KHZhbHVlKSA9PiBzZXRUYXJnZXROYW1lKFN0cmluZyh2YWx1ZSkpfQogICAgICAgICAgICAvPgogICAgICAgICAgPC9SQlRleHRGaWVsZD4KCiAgICAgICAgICA8UkJUZXh0RmllbGQgbGFiZWw9IlNlbGVjdCBHcmlwIj4KICAgICAgICAgICAgPFJCU2VsZWN0Qm94ICBjbGFzc05hbWU9InctZnVsbCIgdmFsdWU9e2dyaXBUeXBlfSBoYW5kbGVDaGFuZ2U9e3NldEdyaXBUeXBlfT4KICAgICAgICAgICAgICA8T3B0aW9uIHZhbHVlPSJBIj5BIEdyaXA8L09wdGlvbj4KICAgICAgICAgICAgICA8T3B0aW9uIHZhbHVlPSJCIj5CIEdyaXA8L09wdGlvbj4KICAgICAgICAgICAgPC9SQlNlbGVjdEJveD4KICAgICAgICAgIDwvUkJUZXh0RmllbGQ+CgogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZ2FwLTQiPgogICAgICAgICAgICA8UkJUZXh0RmllbGQgY2xhc3NOYW1lPSJmbGV4LTEiIGxhYmVsPSJHcmlwIHdpZHRoIiBoZWxwZXJUZXh0PSIwLTEwMCBtbSI+CiAgICAgICAgICAgICAgPFJCVGV4dElucHV0CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCIKICAgICAgICAgICAgICAgIG5hbWU9ImdyaXBXaWR0aCIKICAgICAgICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgICAgICAgIHZhbHVlPXtncmlwV2lkdGh9CiAgICAgICAgICAgICAgICB2YWxpZGF0ZT17KHZhbHVlOiBudW1iZXIpID0+CiAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgTnVtYmVyKHZhbHVlKSB8fCAwKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZT17KHZhbHVlKSA9PiBzZXRHcmlwV2lkdGgoTnVtYmVyKHZhbHVlKSB8fCAwKX0KICAgICAgICAgICAgICAvPgogICAgICAgICAgICA8L1JCVGV4dEZpZWxkPgoKICAgICAgICAgICAgPFJCVGV4dEZpZWxkIGNsYXNzTmFtZT0iZmxleC0xIiBsYWJlbD0iU3BlZWQiIGhlbHBlclRleHQ9e2Ake3NwZWVkfSVgfT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgcHgtMiI+CiAgICAgICAgICAgICAgICA8UkJTbGlkZXIKICAgICAgICAgICAgICAgICAgdmFsdWU9e1tzcGVlZF19CiAgICAgICAgICAgICAgICAgIG1pbj17MH0KICAgICAgICAgICAgICAgICAgbWF4PXsxMDB9CiAgICAgICAgICAgICAgICAgIHN0ZXA9ezV9CiAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZXM6IG51bWJlcltdKSA9PgogICAgICAgICAgICAgICAgICAgIHNldFNwZWVkKHZhbHVlc1swXSA/PyAwKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L1JCVGV4dEZpZWxkPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9Im1iLTQiPgogICAgICAgICAgPFJCVGV4dEZpZWxkIGxhYmVsPSJSdW4gbW9kZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItMSBib3JkZXItYm9yZGVyLXN1YnRsZSByb3VuZGVkLXNtIHAtMiI+CiAgICAgICAgICAgIHtNT0RFX09QVElPTlMubWFwKChpdGVtKSA9PiAoCiAgICAgICAgICAgICAgPFJCUmFkaW9Cb3gKICAgICAgICAgICAgICAgIGtleT17aXRlbS52YWx1ZX0KICAgICAgICAgICAgICAgIG5hbWU9Im1vZGUiCiAgICAgICAgICAgICAgICBjaGVja1ZhbHVlPXtpdGVtLnZhbHVlfQogICAgICAgICAgICAgICAgdmFsdWU9e21vZGV9CiAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2U9eyh2YWx1ZSkgPT4gc2V0TW9kZSh2YWx1ZSBhcyBSdW5Nb2RlKX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICB7aXRlbS5sYWJlbH0KICAgICAgICAgICAgICA8L1JCUmFkaW9Cb3g+CiAgICAgICAgICAgICkpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L1JCVGV4dEZpZWxkPgogICAgICAgIDwvc2VjdGlvbj4KCiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPSJtYi00Ij4KICAgICAgICAgIDxSQlRleHRGaWVsZCBsYWJlbD0iVGFza3MiPgogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLTEgYm9yZGVyLWJvcmRlci1zdWJ0bGUgcm91bmRlZC1zbSBwLTIiPgogICAgICAgICAgICAgIHtUQVNLX09QVElPTlMubWFwKChpdGVtKSA9PiAoCiAgICAgICAgICAgICAgICA8UkJDaGVja0JveAogICAgICAgICAgICAgICAgICBrZXk9e2l0ZW0udmFsdWV9CiAgICAgICAgICAgICAgICAgIG5hbWU9InRhc2tzIgogICAgICAgICAgICAgICAgICBjaGVja1ZhbHVlPXtpdGVtLnZhbHVlfQogICAgICAgICAgICAgICAgICB2YWx1ZT17dGFza3N9CiAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZT17KHZhbHVlKSA9PgogICAgICAgICAgICAgICAgICAgIHNldFRhc2tzKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKFN0cmluZykgOiBbXSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICB7aXRlbS5sYWJlbH0KICAgICAgICAgICAgICAgIDwvUkJDaGVja0JveD4KICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L1JCVGV4dEZpZWxkPgogICAgICAgICAgCiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8UkJUZXh0RmllbGQgbGFiZWw9Ik1lbW8iPgogICAgICAgICAgPFJCVGV4dEFyZWEKICAgICAgICAgICAgbmFtZT0ibWVtbyIKICAgICAgICAgICAgdmFsdWU9e21lbW99CiAgICAgICAgICAgIG1heExlbmd0aD17MTIwfQogICAgICAgICAgICByb3dzPXs0fQogICAgICAgICAgICBoYW5kbGVDaGFuZ2U9e3NldE1lbW99CiAgICAgICAgICAvPgogICAgICAgIDwvUkJUZXh0RmllbGQ+CgogICAgICAgIDxmb290ZXIgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIGdhcC04IHB0LTQiPgogICAgICAgICAgPFJCTGFiZWxCdXR0b24gdmFyaWFudD0ib3V0bGluZWQiIG9uQ2xpY2s9e3B1Ymxpc2hQcmV2aWV3fT4KICAgICAgICAgICAgUHVibGlzaAogICAgICAgICAgPC9SQkxhYmVsQnV0dG9uPgogICAgICAgICAgPFJCTGFiZWxCdXR0b24gb25DbGljaz17cnVuQWN0aW9ufSBkaXNhYmxlZD17IWVuYWJsZWR9PgogICAgICAgICAgICBSdW4gQWN0aW9uCiAgICAgICAgICA8L1JCTGFiZWxCdXR0b24+CiAgICAgICAgPC9mb290ZXI+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgKTsKfQo=","common/ui/style.css":"QGxheWVyIHRoZW1lLCB1dGlsaXRpZXM7CgpAaW1wb3J0ICJ0YWlsd2luZGNzcy90aGVtZS5jc3MiIGxheWVyKHRoZW1lKTsKQGltcG9ydCAidGFpbHdpbmRjc3MvdXRpbGl0aWVzLmNzcyIgbGF5ZXIodXRpbGl0aWVzKTsKCkBzb3VyY2UgIi4vKiovKi57dHMsdHN4fSI7Cg==","common/vite.config.ts":"aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKLy8gVGhlIG11c2NhdCgpIHByZXNldCB3aXJlcyByZWFjdC1yZWZyZXNoLCB1aS8gZW50cnkgZGlzY292ZXJ5LCBhbmQgbWFya3MgdGhlCi8vIGhvc3QtcHJvdmlkZWQgcnVudGltZSAocGx1Z2luLXVpLCByZWFjdCkgYXMgZXh0ZXJuYWwuIEFkZCB5b3VyIG93biBwbHVnaW5zIG9yCi8vIG92ZXJyaWRlcyBoZXJlIGFzIG5lZWRlZC4KZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbdGFpbHdpbmRjc3MoKSwgbXVzY2F0KCldLAp9KTsK","cpp/cpp/CMakeLists.txt":"Y21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMTYpCnByb2plY3QoX19QTFVHSU5fU0xVR19fIENYWCkKCnNldChDTUFLRV9DWFhfU1RBTkRBUkQgMjApCnNldChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQgT04pCgojIFJhaW5ib3cgUm9ib3RpY3MgQysrIFNESyDigJQgcHJvdmlkZWQgYnkgdGhlIGFwdCBwYWNrYWdlIHJhaW5ib3ctcmItc2RrLWRldgojIChwcmUtaW5zdGFsbGVkIGluIHRoZSBtdXNjYXQtcGsgZGV2IGNvbnRhaW5lcikuIExpbmtlZCBkeW5hbWljYWxseTsgYG11c2NhdC1wayBidWlsZGAKIyBjb3BpZXMgdGhlIG1hdGNoaW5nIGxpYnJiX3Nkay5zbyBpbnRvIGRpc3QvPGFyY2g+L2xpYi8gZm9yIHRoZSByb2JvdC4KZmluZF9wYWNrYWdlKHJiX3NkayBSRVFVSVJFRCkKCiMgVGhlIGV4ZWN1dGFibGUgbmFtZSBtdXN0IG1hdGNoIHJ1bnRpbWUuZW50cnkgaW4gbWFuaWZlc3QuanNvbi4KYWRkX2V4ZWN1dGFibGUoX19QTFVHSU5fU0xVR19fIG1haW4uY3BwKQp0YXJnZXRfbGlua19saWJyYXJpZXMoX19QTFVHSU5fU0xVR19fIFBSSVZBVEUgcmJfc2RrOjpyYl9zZGspCg==","cpp/cpp/main.cpp":"Ly8gX19QTFVHSU5fTkFNRV9fIOKAlCBDKysgcGx1Z2luIGJhY2sgZW5kLgovLwovLyBUaGUgUmFpbmJvdyBSb2JvdGljcyBDKysgU0RLIChhcHQ6IHJhaW5ib3ctcmItc2RrLWRldikgaXMgaW5zdGFsbGVkIGluIHRoZQovLyBkZXYgY29udGFpbmVyIGFuZCBsaW5rZWQgdmlhIENNYWtlIChyYl9zZGs6OnJiX3NkaykuIEhlYWRlcnMgbGl2ZSB1bmRlcgovLyA8cmFpbmJvdy9yYl9zZGsvLi4uPjoKLy8gICAtIHBsdWdpbi9yYl9wbHVnaW4uaHBwICAgICAgICAgICAgICAgcmJfcGx1Z2luOjpSQlBsdWdpbkNhbGwg4oCUIHBsdWdpbiBVSSA8LT4gYmFja2VuZAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VydmUvc3Vic2NyaWJlL3B1Ymxpc2gpIGFuZCBleHRlcm5hbCBlbmRwb2ludHMgKHJvdXRlcikKLy8gICAtIG1hbmlwdWxhdGUvcmJfbWFuaXB1bGF0ZV9zZGsuaHBwICAgUkJNYW5pcHVsYXRlU0RLIOKAlCBjb250cm9sIHRoZSByb2JvdAovLyAgIC0gcHJvZ3JhbS9wbHVnaW5fcHJvZ3JhbV9jb250ZXh0LmhwcCByYl9wbHVnaW46OlBsdWdpblByb2dyYW1Db250ZXh0IOKAlAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnBhbmVsIGNvbW1hbmRzIChkb25lL3BhdXNlL3N0b3AsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gdmFyaWFibGVzKQoKI2luY2x1ZGUgPHJhaW5ib3cvcmJfc2RrL21hbmlwdWxhdGUvcmJfbWFuaXB1bGF0ZV9zZGsuaHBwPgojaW5jbHVkZSA8cmFpbmJvdy9yYl9zZGsvcGx1Z2luL3JiX3BsdWdpbi5ocHA+CgojaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dGhyZWFkPgoKdXNpbmcgbmxvaG1hbm46Ompzb247CnVzaW5nIHJiX3BsdWdpbjo6UkJQbHVnaW5DYWxsOwoKaW50IG1haW4oKSB7CiAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9ICJfX1BMVUdJTl9OQU1FX18iOwoKICAvLyBSZW1vdGUgZGV2IChtdXNjYXQtcGsgZGV2IC0tcm9ib3QtaXAgLi4uIC0tcm9ib3QtdG9rZW4gLi4uKTogY29ubmVjdCBmaXJzdCwKICAvLyBiZWNhdXNlIGNvbm5lY3QoKSByZW9wZW5zIHRoZSBaZW5vaCBzZXNzaW9uLgogIFJCTWFuaXB1bGF0ZVNESyBtYW5pcHVsYXRlOwogIGNvbnN0IGNoYXIqIGhvc3QgPSBzdGQ6OmdldGVudigiTVVTQ0FUX1JPQk9UX0hPU1QiKTsKICBjb25zdCBjaGFyKiB0b2tlbiA9IHN0ZDo6Z2V0ZW52KCJNVVNDQVRfUk9CT1RfVE9LRU4iKTsKICBpZiAoaG9zdCAmJiB0b2tlbikgbWFuaXB1bGF0ZS5jb25uZWN0KHsudG9rZW4gPSB0b2tlbiwgLmhvc3QgPSBob3N0fSk7CgogIC8vIHBsdWdpbiBpZCBjb21lcyBmcm9tIFJCX1BMVUdJTl9JRCAoc2V0IGJ5IG11c2NhdC1wayBkZXYgLyB0aGUgcm9ib3QpLgogIGF1dG8gcGx1Z2luID0gUkJQbHVnaW5DYWxsOjpnZXRfaW5zdGFuY2UoUkJQbHVnaW5DYWxsOjpyZXNvbHZlX3BsdWdpbl9pZChzdGQ6Om51bGxvcHQpKTsKCiAgLy8gLS0tIFBsdWdpbiBVSSA8LT4gYmFja2VuZCAobm90IHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgTXVzY2F0KSAtLS0KCiAgLy8gVUk6IGF3YWl0IHJiLmFjdGlvbigiZ3JpcCIsIHsgd2lkdGggfSkKICBwbHVnaW4tPnNlcnZlKCJncmlwIiwgWyZdKGNvbnN0IGpzb24mIHBheWxvYWQpIHsKICAgIGNvbnN0IGludCB3aWR0aCA9IHBheWxvYWQuaXNfb2JqZWN0KCkgPyBwYXlsb2FkLnZhbHVlKCJ3aWR0aCIsIDIwKSA6IDIwOwogICAgc3RkOjpjb3V0IDw8ICJbIiA8PCBuYW1lIDw8ICJdIGdyaXAgcmVxdWVzdGVkOiB3aWR0aD0iIDw8IHdpZHRoIDw8IHN0ZDo6ZW5kbDsKICAgIHBsdWdpbi0+cHVibGlzaCgic3RhdGUiLCB7eyJyZWFkeSIsIHRydWV9LCB7Imxhc3RfZ3JpcF93aWR0aCIsIHdpZHRofX0pOyAgLy8gLT4gcmIuc3ViKCJzdGF0ZSIpCiAgICByZXR1cm4ganNvbnt7Im9rIiwgdHJ1ZX0sIHsid2lkdGgiLCB3aWR0aH19OwogIH0pOwoKICAvLyBVSTogcmIucHViKCJldmVudCIsIC4uLikKICBhdXRvIGV2ZW50X3N1YiA9IHBsdWdpbi0+c3Vic2NyaWJlKCJldmVudCIsIFsmXShjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IGpzb24mIHBheWxvYWQpIHsKICAgIHN0ZDo6Y291dCA8PCAiWyIgPDwgbmFtZSA8PCAiXSBldmVudDogIiA8PCBwYXlsb2FkLmR1bXAoKSA8PCBzdGQ6OmVuZGw7CiAgfSk7CgogIC8vIC0tLSBFeHRlcm5hbCBlbmRwb2ludHMgKFJFU1QgLyBTb2NrZXQuSU8gLyBUQ1AgLyBNUVRUIC8gV2ViUlRDKSAtLS0KICAvLyAgIGN1cmwgLVggUE9TVCBodHRwOi8vPHJvYm90Pi9jb21tb24vcGx1Z2luLzxwbHVnaW5faWQ+L2hlbGxvIC1kICd7Im5hbWUiOiJraW0ifScKICBwbHVnaW4tPnJvdXRlcigpLm9uKCIvaGVsbG8iLCBbXShjb25zdCBqc29uJiBwYXlsb2FkLCBjb25zdCBqc29uJiBtZXRhKSB7CiAgICBjb25zdCBzdGQ6OnN0cmluZyB3aG8gPSBwYXlsb2FkLmlzX29iamVjdCgpID8gcGF5bG9hZC52YWx1ZSgibmFtZSIsIHN0ZDo6c3RyaW5nKCJ0aGVyZSIpKSA6ICJ0aGVyZSI7CiAgICByZXR1cm4ganNvbnt7Im1zZyIsICJoaSAiICsgd2hvfSwgeyJ2aWEiLCBtZXRhLnZhbHVlKCJ0cmFuc3BvcnQiLCBzdGQ6OnN0cmluZygpKX19OwogIH0pOwoKICAvLyBFeGFtcGxlOiByb2JvdCBjb250cm9sIChub3QgY2FsbGVkIGF1dG9tYXRpY2FsbHkg4oCUIGFkZCBzYWZldHkgY2hlY2tzIGZpcnN0KS4KICAvLyAgIElQQzo6TW92ZUlucHV0X1RhcmdldFQgdDsgdC50YXJfdmFsdWVzID0gezAsIDAsIDAsIDAsIDAsIDB9OwogIC8vICAgbWFuaXB1bGF0ZS5tb3ZlLmNhbGxfbW92ZV9qKCJDNTAwOTIwIiwgdCk7CgogIHBsdWdpbi0+cHVibGlzaCgic3RhdGUiLCB7eyJyZWFkeSIsIHRydWV9LCB7InBsdWdpbiIsIG5hbWV9fSk7CiAgc3RkOjpjb3V0IDw8ICJbIiA8PCBuYW1lIDw8ICJdIGJhY2tlbmQgcmVhZHkiIDw8IHN0ZDo6ZW5kbDsKCiAgLy8gS2VlcCB0aGUgcHJvY2VzcyBhbGl2ZS4KICB3aGlsZSAodHJ1ZSkgewogICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKICB9CiAgcmV0dXJuIDA7Cn0K","readme-cpp/README.md":"IyBfX1BMVUdJTl9OQU1FX18KCkEgTXVzY2F0IHBsdWdpbiBwcm9qZWN0LiBCdWlsZCwgZGV2ZWxvcCwgYW5kIHNoaXAgd2l0aCBgbXVzY2F0LXBrYCBDTEkuCgojIyBRdWljayBzdGFydAoKYGBgYmFzaAptdXNjYXQtcGsgZGV2ICAgICAgICAjIFVJIHByZXZpZXcgKyBiYWNrZW5kIHRvZ2V0aGVyCm11c2NhdC1wayBkZXY6dWkgICAgICMgVUkgcHJldmlldyBvbmx5Cm11c2NhdC1wayBkZXY6YmFjayAgICMgYmFja2VuZCBvbmx5IChDKysgcmVidWlsZCArIHJlc3RhcnQgaW4gRG9ja2VyKQptdXNjYXQtcGsgYnVpbGQgICAgICAjIGJ1aWxkICsgZGlzdHJpYnV0YWJsZSBaSVAKYGBgCgotLS0KCiMjIFByb2plY3Qgc3RydWN0dXJlCgpgYGAKX19QTFVHSU5fRElSX18vCuKUnOKUgCB1aS8K4pSCICAg4pSc4pSAIGNvbnRlbnQudHN4ICAgICAgIyBwbHVnaW4gVUkgZW50cnkgcG9pbnQK4pSCICAg4pSU4pSAIHN0eWxlLmNzcyAgICAgICAgIyBwbHVnaW4gc3R5bGVzIGF1dG8tbG9hZGVkIGJ5IG11c2NhdCgpCuKUnOKUgCBjcHAvCuKUgiAgIOKUnOKUgCBDTWFrZUxpc3RzLnR4dCAgICMgbGlua3MgcmJfc2RrOjpyYl9zZGsgKEMrKyBTREspCuKUgiAgIOKUlOKUgCBtYWluLmNwcCAgICAgICAgICMgQysrIGJhY2tlbmQgZW50cnkgcG9pbnQK4pSc4pSAIGFzc2V0cy8K4pSCICAg4pSU4pSAIGljb24uc3ZnICAgICAgICAgIyBpY29uIHJlZmVyZW5jZWQgZnJvbSBtYW5pZmVzdArilJzilIAgbWFuaWZlc3QuanNvbiAgICAgICAgIyBtZXRhZGF0YSwgY29udHJpYnV0aW9uIHBvaW50cywgcnVudGltZSBjb25maWcK4pSU4pSAIFJFQURNRS5tZCAgICAgICAgICAgICMgdGhpcyBmaWxlIChjb3BpZWQgdG8gZGlzdC8gb24gYnVpbGQpCmBgYAoKPiBST1MyIChyY2xjcHApIHBsdWdpbnMgaGF2ZSBgcm9zMl93cy9gIGluc3RlYWQgb2YgYGNwcC9gLgoKLS0tCgojIyBGcm9udGVuZCAoYHVpL2NvbnRlbnQudHN4YCkKCiMjIyBKYXZhU2NyaXB0IGRlcGVuZGVuY2llcwoKYG11c2NhdC1wayBidWlsZGAgcnVucyB0aGlzIHBsdWdpbiBwcm9qZWN0J3Mgb3duIFZpdGUgYnVpbGQuIFZpdGUgcmVzb2x2ZXMKaW1wb3J0cyBmcm9tIGluc3RhbGxlZCBgbm9kZV9tb2R1bGVzYDsgaXQgZG9lcyBub3QgY2FyZSB3aGV0aGVyIGEgcGFja2FnZSBpcwpsaXN0ZWQgdW5kZXIgYGRlcGVuZGVuY2llc2Agb3IgYGRldkRlcGVuZGVuY2llc2AsIGJ1dCB0aGUgcGFja2FnZSBtdXN0IGJlCmluc3RhbGxlZC4KCkRvIG5vdCBydW4gYSBwcm9kdWN0aW9uLW9ubHkgaW5zdGFsbCBzdWNoIGFzIGBucG0gaW5zdGFsbCAtLW9taXQ9ZGV2YCBiZWZvcmUKYnVpbGRpbmcgdGhlIHBsdWdpbiBVSSwgYmVjYXVzZSBidWlsZCB0b29scyBsaWtlIGB2aXRlYCwgYHR5cGVzY3JpcHRgLApgdGFpbHdpbmRjc3NgLCBgQHRhaWx3aW5kY3NzL3ZpdGVgLCBgc2Fzc2AsIG9yIGBsZXNzYCBhcmUgdXN1YWxseQpgZGV2RGVwZW5kZW5jaWVzYC4KClRoZSBzY2FmZm9sZCBrZWVwcyB0aGlzIHNwbGl0OgoKfCBwYWNrYWdlIGtpbmQgfCBleGFtcGxlcyB8IHdoeSB8CnwtLS18LS0tfC0tLXwKfCBgZGVwZW5kZW5jaWVzYCB8IGBAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWlgLCBVSSBsaWJyYXJpZXMgaW1wb3J0ZWQgYnkgcGx1Z2luIHNvdXJjZSB8IEF1dGhvci1mYWNpbmcgQVBJcyB1c2VkIGJ5IGB1aS8qLnRzeGAgfAp8IGBkZXZEZXBlbmRlbmNpZXNgIHwgYHZpdGVgLCBgdHlwZXNjcmlwdGAsIGB0YWlsd2luZGNzc2AsIGBAdGFpbHdpbmRjc3Mvdml0ZWAsIGBzYXNzYCwgYGxlc3NgIHwgQnVpbGQvZGV2IHRvb2xzIG5lZWRlZCBiZWZvcmUgYGRpc3QvKi5qc2AgaXMgcHJvZHVjZWQgfAoKVGhlIGJ1aWx0IHBsdWdpbiBaSVAgZG9lcyBub3QgaW5jbHVkZSBgcGFja2FnZS5qc29uYCBvciBgbm9kZV9tb2R1bGVzYC4gRm9yCnByb2R1Y3Rpb24sIE11c2NhdCBwcm92aWRlcyBgQHJhaW5ib3ctcm9ib3RpY3MvcGx1Z2luLXVpYCwgUmVhY3QsIGFuZCBSZWFjdERPTQp0aHJvdWdoIHRoZSBob3N0IGltcG9ydCBtYXA7IHBsdWdpbiBVSSBidWlsZCBvdXRwdXQgaW1wb3J0cyB0aG9zZSBhcyBob3N0CmV4dGVybmFscy4KCiMjIyBTdHlsZXMKCmBtdXNjYXQoKWAgYXV0b21hdGljYWxseSBsb2FkcyBgdWkvc3R5bGUue2NzcyxzY3NzLHNhc3MsbGVzc31gIChvcgpgdWkvc3R5bGVzLntjc3Msc2NzcyxzYXNzLGxlc3N9YCkgZm9yIGV2ZXJ5IFVJIGVudHJ5LCBwbHVzCmB1aS97ZW50cnl9Lntjc3Msc2NzcyxzYXNzLGxlc3N9YCBmb3IgYSBtYXRjaGluZyBlbnRyeS1zcGVjaWZpYyBzdHlsZXNoZWV0LiBZb3UKZG8gbm90IG5lZWQgdG8gaW1wb3J0IENTUyBmcm9tIGV2ZXJ5IGAudHN4YCBmaWxlLgoKVGhlIHNjYWZmb2xkIHVzZXMgVGFpbHdpbmQncyB0aGVtZS91dGlsaXRpZXMgbGF5ZXJzIG9ubHksIHNvIHBsdWdpbiB1dGlsaXRpZXMKYXJlIGdlbmVyYXRlZCBmcm9tIGZpbGVzIHVuZGVyIGB1aS9gIHdpdGhvdXQgYXBwbHlpbmcgVGFpbHdpbmQgcHJlZmxpZ2h0IHJlc2V0cwp0byB0aGUgaG9zdCBwYWdlLgoKQnVpbHQgQ1NTIHNlbGVjdG9ycyBhcmUgc2NvcGVkIHVuZGVyIHRoZSBjdXJyZW50IHBsdWdpbiBpZAooYFtkYXRhLW11c2NhdC1wbHVnaW4taWQ9Ii4uLiJdYCkuIENTUy1pbi1KUyBsaWJyYXJpZXMgc3VjaCBhcyBFbW90aW9uIHdvcmsKbm9ybWFsbHksIGJ1dCBnbG9iYWwgc3R5bGVzIHNob3VsZCBiZSBzY29wZWQgYnkgdGhlIGF1dGhvci4KCiMjIyMgVGFpbHdpbmQKClRoaXMgdGVtcGxhdGUgZW5hYmxlcyBUYWlsd2luZCBpbiBgdml0ZS5jb25maWcudHNgOgoKYGBgdHMKaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbdGFpbHdpbmRjc3MoKSwgbXVzY2F0KCldLAp9KTsKYGBgCgpUaGUgZGVmYXVsdCBgdWkvc3R5bGUuY3NzYCB1c2VzIFRhaWx3aW5kIHRoZW1lL3V0aWxpdGllcyBvbmx5LCBub3QgcHJlZmxpZ2h0OgoKYGBgY3NzCkBsYXllciB0aGVtZSwgdXRpbGl0aWVzOwoKQGltcG9ydCAidGFpbHdpbmRjc3MvdGhlbWUuY3NzIiBsYXllcih0aGVtZSk7CkBpbXBvcnQgInRhaWx3aW5kY3NzL3V0aWxpdGllcy5jc3MiIGxheWVyKHV0aWxpdGllcyk7CgpAc291cmNlICIuLyoqLyoue3RzLHRzeH0iOwpgYGAKCiMjIyMgU0NTUywgU2FzcywgYW5kIExlc3MKCkluc3RhbGwgdGhlIHByZXByb2Nlc3NvciBwYWNrYWdlLCB0aGVuIGNyZWF0ZSBvbmUgb2YgdGhlIGF1dG8tbG9hZGVkIHN0eWxlIGZpbGVzLgoKYGBgYmFzaApucG0gaSAtRCBzYXNzCmBgYAoKYGBgc2NzcwovKiB1aS9zdHlsZS5zY3NzICovCiRhY2NlbnQ6ICMzYjgyZjY7CgoucGFuZWwgewogIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAkYWNjZW50IDQwJSwgdHJhbnNwYXJlbnQpOwoKICAmX190aXRsZSB7CiAgICBjb2xvcjogJGFjY2VudDsKICB9Cn0KYGBgCgpGb3IgTGVzcywgaW5zdGFsbCBgbGVzc2AgYW5kIHVzZSBgdWkvc3R5bGUubGVzc2AuCgojIyMjIEVtb3Rpb24KCkVtb3Rpb24gZGVwZW5kZW5jaWVzIG1heSBiZSBpbiBgZGVwZW5kZW5jaWVzYCBvciBgZGV2RGVwZW5kZW5jaWVzYDsgVml0ZSBjYW4KYnVuZGxlIHRoZW0gd2hlbiB0aGV5IGFyZSBpbnN0YWxsZWQgYW5kIGltcG9ydGVkIGJ5IHRoZSBwbHVnaW4uCgpGb3IgYHN0eWxlZGAsIG5vIFZpdGUgY29uZmlnIGNoYW5nZSBpcyBuZWVkZWQ6CgpgYGBiYXNoCm5wbSBpIEBlbW90aW9uL3JlYWN0IEBlbW90aW9uL3N0eWxlZApgYGAKCmBgYHRzeAppbXBvcnQgc3R5bGVkIGZyb20gIkBlbW90aW9uL3N0eWxlZCI7Cgpjb25zdCBQYW5lbCA9IHN0eWxlZC5kaXYoewogIGRpc3BsYXk6ICJncmlkIiwKICBnYXA6IDEyLAp9KTsKYGBgCgpGb3IgRW1vdGlvbidzIGBjc3NgIHByb3AsIHBhc3MgUmVhY3QgcGx1Z2luIG9wdGlvbnMgdGhyb3VnaCBgbXVzY2F0KClgIGFuZCBhZGQKYGpzeEltcG9ydFNvdXJjZWAgdG8gYHRzY29uZmlnLmpzb25gOgoKYGBgYmFzaApucG0gaSBAZW1vdGlvbi9yZWFjdCBAZW1vdGlvbi9zdHlsZWQKbnBtIGkgLUQgQGVtb3Rpb24vYmFiZWwtcGx1Z2luCmBgYAoKYGBgdHMKLy8gdml0ZS5jb25maWcudHMKaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAidml0ZSI7CmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICJAdGFpbHdpbmRjc3Mvdml0ZSI7CmltcG9ydCB7IG11c2NhdCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL211c2NhdC1wbHVnaW4ta2l0L3ZpdGUiOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBwbHVnaW5zOiBbCiAgICB0YWlsd2luZGNzcygpLAogICAgbXVzY2F0KHsKICAgICAgcmVhY3Q6IHsKICAgICAgICBqc3hJbXBvcnRTb3VyY2U6ICJAZW1vdGlvbi9yZWFjdCIsCiAgICAgICAgYmFiZWw6IHsKICAgICAgICAgIHBsdWdpbnM6IFsiQGVtb3Rpb24vYmFiZWwtcGx1Z2luIl0sCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0pLAogIF0sCn0pOwpgYGAKCmBgYGpzb24KewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAianN4SW1wb3J0U291cmNlIjogIkBlbW90aW9uL3JlYWN0IgogIH0KfQpgYGAKCkVtb3Rpb24gYEdsb2JhbGAgd3JpdGVzIGdsb2JhbCBDU1MgYXQgcnVudGltZSwgc28gc2NvcGUgaXQgbWFudWFsbHkgb3IgYXZvaWQgaXQKaW5zaWRlIHBsdWdpbnMuCgojIyMgdXNlUmIoKSBob29rCgpBY2Nlc3MgdGhlIGNvbW11bmljYXRpb24gQVBJIGJldHdlZW4gdGhlIHBsdWdpbiBtb2R1bGUgYW5kIFVJIGZyb20gYW55IHBsdWdpbiBjb21wb25lbnQuCgpgYGB0c3gKaW1wb3J0IHsgdXNlUmIgfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvc2RrIjsKCmZ1bmN0aW9uIEFwcCgpIHsKICBjb25zdCByYiA9IHVzZVJiKCk7Cn0KYGBgCgojIyMgcmIgQVBJCgp8IE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGByYi5wdWIodG9waWMsIHBheWxvYWQpYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB1Ymxpc2ggYSBtZXNzYWdlIHRvIGEgdG9waWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGByYi5zdWIodG9waWMsIGhhbmRsZXIpYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1YnNjcmliZSB0byBhIHRvcGljIOKAlCByZXR1cm5zIGB7IHVuZGVjbGFyZSgpIH1gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLmFjdGlvbih0b3BpYywgcGF5bG9hZD8pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VuZCBhIHJlcXVlc3QgYW5kIGF3YWl0IGEgcmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnNlcnZlKHRvcGljLCBoYW5kbGVyKWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSGFuZGxlIGluY29taW5nIHJlcXVlc3RzIGZyb20gdGhlIGJhY2tlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnRvYXN0KHsgdGl0bGU/LCBtZXNzYWdlLCB0eXBlPywgYWN0aW9uTGFiZWw/LCBoYW5kbGVBY3Rpb25DbGljaz8sIGNsb3NlT25BY3Rpb25DbGljaz8sIGR1cmF0aW9uPywgb25DbG9zZT8gfSlgIHwgU2hvdyBhIGhvc3QgdG9hc3Qgbm90aWZpY2F0aW9uLiBgbWVzc2FnZWAgYWNjZXB0cyBhIHN0cmluZyBvciBgUmVhY3RFbGVtZW50YC4gYHR5cGVgIGNhbiBiZSBgImluZm8iYCwgYCJkYW5nZXIiYCwgYCJ3YXJuaW5nImAsIGAiY2F1dGlvbiJgLCBvciBgInN1Y2Nlc3MiYCB8CnwgYHJiLmFsZXJ0KHsgdGl0bGU/LCBtZXNzYWdlLCBidXR0b25UZXh0PyB9KWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgYWxlcnQgZGlhbG9nLiBSZXNvbHZlcyB3aGVuIHRoZSBkaWFsb2cgaXMgY2xvc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLmNvbmZpcm0oeyB0aXRsZT8sIG1lc3NhZ2UsIGJ1dHRvblRleHQ/IH0pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgY29uZmlybWF0aW9uIGRpYWxvZy4gYGJ1dHRvblRleHRgIGFjY2VwdHMgYHsgeWVzLCBubyB9YC4gUmVzb2x2ZXMgdG8gYHRydWVgIG9yIGBmYWxzZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHJiLnByb21wdCh7IHRpdGxlPywgbWVzc2FnZSwgdmFsdWU/LCBwbGFjZWhvbGRlcj8sIGJ1dHRvblRleHQ/IH0pYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvdyBhIGhvc3QgcHJvbXB0IGRpYWxvZy4gYGJ1dHRvblRleHRgIGFjY2VwdHMgYHsgeWVzLCBubyB9YC4gUmVzb2x2ZXMgdG8gdGhlIGVudGVyZWQgc3RyaW5nIG9yIGB1bmRlZmluZWRgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgpUb3BpYyBuYW1lcyBwYXNzZWQgdG8gYHB1YmAsIGBzdWJgLCBgYWN0aW9uYCwgYW5kIGBzZXJ2ZWAgYXJlIGlzb2xhdGVkIHBlciBwbHVnaW4uCgoKQWxsIG1ldGhvZHMgc3VwcG9ydCBHZW5lcmljIFR5cGVzOgoKYGBgdHN4CmNvbnN0IHN0YXR1cyA9IGF3YWl0IHJiLmFjdGlvbjx7IG9rOiBib29sZWFuIH0sIHsgaWQ6IG51bWJlciB9PigKICAiZ2V0LXN0YXR1cyIsCiAgeyBpZDogMSB9LAopOwoKY29uc3Qgc3ViID0gYXdhaXQgcmIuc3ViPHsgdmFsdWU6IG51bWJlciB9Pigic2Vuc29yL2RhdGEiLCAoZGF0YSkgPT4gewogIGNvbnNvbGUubG9nKGRhdGEudmFsdWUpOwp9KTsKc3ViLnVuZGVjbGFyZSgpOyAvLyBjbGVhbnVwCgpjb25zdCBvayA9IGF3YWl0IHJiLmNvbmZpcm0oewogIHRpdGxlOiAiUnVuIiwKICBtZXNzYWdlOiAiU3RhcnQgdGhlIGJhY2tlbmQgYWN0aW9uPyIsCn0pOwppZiAob2spIHsKICBhd2FpdCByYi5hY3Rpb24oInJ1biIpOwp9CmBgYAoKIyMjIFNhdmluZyBhbmQgcmVzdG9yaW5nIGZvcm0gZGF0YSAoYHVzZVJiRm9ybURhdGFgIC8gYHVzZVJiU2F2ZWApCgpJZiB0aGUgaG9zdCBlbWJlZHMgeW91ciBwbHVnaW4gaW4gYSBmb3JtIGl0IG93bnMgKGUuZy4gYSBwcm9ncmFtIHN0ZXAgZWRpdG9yCndpdGggaXRzIG93biBTYXZlIGJ1dHRvbiksIGl0IGNhbiBoYW5kIHlvdXIgcGx1Z2luIHByZXZpb3VzbHktc2F2ZWQgdmFsdWVzIGFuZApwdWxsIHRoZSBjdXJyZW50IHZhbHVlcyBiYWNrIG91dCB3aGVuIHRoZSB1c2VyIHNhdmVzLiBUaGUgaG9zdCDigJQgbm90IHRoZQpwbHVnaW4g4oCUIHBlcnNpc3RzIHRoZSBkYXRhIChJbmRleGVkREIsIGJhY2tlbmQsIGV0Yy4pLgoKYGBgdHN4CmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAicmVhY3QiOwppbXBvcnQgeyB1c2VSYkZvcm1EYXRhLCB1c2VSYlNhdmUgfSBmcm9tICJAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3QiOwoKdHlwZSBHcmlwQXJncyA9IHsgdGFyZ2V0TmFtZTogc3RyaW5nOyB3aWR0aDogbnVtYmVyIH07CmNvbnN0IERFRkFVTFRTOiBHcmlwQXJncyA9IHsgdGFyZ2V0TmFtZTogIiIsIHdpZHRoOiAyMCB9OwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkgewogIC8vIFByZXZpb3VzbHktc2F2ZWQgdmFsdWVzLCBvciB1bmRlZmluZWQgZm9yIGEgYnJhbmQtbmV3IGluc3RhbmNlLgogIGNvbnN0IHNhdmVkID0gdXNlUmJGb3JtRGF0YTxHcmlwQXJncz4oKTsKICBjb25zdCBbYXJncywgc2V0QXJnc10gPSB1c2VTdGF0ZTxHcmlwQXJncz4oeyAuLi5ERUZBVUxUUywgLi4uc2F2ZWQgfSk7CgogIC8vIFJlZ2lzdGVycyBhIGdldHRlciB0aGUgaG9zdCBjYWxscyB3aGVuIGl0cyBTYXZlIGJ1dHRvbiBpcyBjbGlja2VkLgogIC8vIEFsd2F5cyByZXR1cm5zIHRoZSBDVVJSRU5UIHZhbHVlcyDigJQgcmUtcmVnaXN0ZXJpbmcgb24gZXZlcnkgcmVuZGVyIGtlZXBzCiAgLy8gdGhlIGNsb3N1cmUgZnJlc2gsIHdoaWNoIHVzZVJiU2F2ZSBhbHJlYWR5IGhhbmRsZXMgZm9yIHlvdS4KICB1c2VSYlNhdmUoKCkgPT4gKHsKICAgIGFyZ3MsCiAgICBzdW1tYXJ5OiBgJHthcmdzLnRhcmdldE5hbWUgfHwgInRhcmdldCJ9IMK3ICR7YXJncy53aWR0aH1tbWAsCiAgfSkpOwoKICByZXR1cm4gKC8qIC4uLmZvcm0gVUkgcmVhZGluZy93cml0aW5nIGBhcmdzYC4uLiAqLyk7Cn0KYGBgCgpUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBgdXNlUmJTYXZlYCBtdXN0IGJlIEpTT04tc2VyaWFsaXNhYmxlIOKAlCB0aGUgaG9zdApwZXJzaXN0cyBpdCBhcy1pcy4gTm90IGV2ZXJ5IGhvc3QgZW1iZWRzIHBsdWdpbnMgaW4gYSBzYXZlL3Jlc3RvcmUgZm9ybTsgaWYKeW91cnMgZG9lc24ndCwgeW91IGNhbiBza2lwIHRoZXNlIGhvb2tzIGVudGlyZWx5LgoKIyMjIFVJIGNvbXBvbmVudHMKCkltcG9ydCBNdXNjYXQgY29tcG9uZW50cyBmcm9tIGBAcmFpbmJvdy1yb2JvdGljcy9wbHVnaW4tdWkvcmVhY3RgIGFuZCBleHBvcnQgYQpSZWFjdCBjb21wb25lbnQgYXMgdGhlIGRlZmF1bHQgZXhwb3J0LiBUaGUgaG9zdCBtb3VudHMgdGhhdCBjb21wb25lbnQgZGlyZWN0bHkKYW5kIHByb3ZpZGVzIGB1c2VSYigpYCB0aHJvdWdoIGNvbnRleHQuCgpgYGB0c3gKaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB7IFJCTGFiZWxCdXR0b24sIFJCU2xpZGVyLCBSQlN3aXRjaCB9IGZyb20gIkByYWluYm93LXJvYm90aWNzL3BsdWdpbi11aS9yZWFjdCI7CmltcG9ydCB7IHVzZVJiIH0gZnJvbSAiQHJhaW5ib3ctcm9ib3RpY3MvcGx1Z2luLXVpL3NkayI7CgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7CiAgY29uc3QgcmIgPSB1c2VSYigpOwogIGNvbnN0IFt3aWR0aCwgc2V0V2lkdGhdID0gdXNlU3RhdGUoMjApOwogIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IHVzZVN0YXRlKHRydWUpOwoKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZmxleC1jb2wgZ2FwLTQiPgogICAgICA8UkJTbGlkZXIKICAgICAgICB2YWx1ZT17W3dpZHRoXX0KICAgICAgICBtaW49ezB9CiAgICAgICAgbWF4PXsxMDB9CiAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlczogbnVtYmVyW10pID0+IHNldFdpZHRoKHZhbHVlc1swXSA/PyAwKX0KICAgICAgLz4KICAgICAgPFJCU3dpdGNoIGNoZWNrZWQ9e2VuYWJsZWR9IG9uQ2hlY2tlZENoYW5nZT17c2V0RW5hYmxlZH0gLz4KICAgICAgPFJCTGFiZWxCdXR0b24KICAgICAgICBkaXNhYmxlZD17IWVuYWJsZWR9CiAgICAgICAgb25DbGljaz17KCkgPT4gcmIuYWN0aW9uKCJncmlwIiwgeyB3aWR0aCB9KX0KICAgICAgPgogICAgICAgIEdyaXAKICAgICAgPC9SQkxhYmVsQnV0dG9uPgogICAgPC9kaXY+CiAgKTsKfQpgYGAKCi0tLQoKIyMgRGV2ZWxvcGluZyBkaXJlY3RseSBvbiB0aGUgcm9ib3QgUEMKCklmIHlvdSdyZSBydW5uaW5nIGBtdXNjYXQtcGsgZGV2YCAqKm9uIHRoZSByb2JvdCBQQyBpdHNlbGYqKiwgTXVzY2F0IGlzIGxpa2VseSBhbHJlYWR5CnJ1bm5pbmcgaXRzIG93biBTb2NrZXQuSU8gYnJpZGdlIG9uIHBvcnQgMTAwMDAuIEluIHRoYXQgY2FzZSB0aGUgQ0xJIGRldGVjdHMgdGhlIHBvcnQKY29uZmxpY3QgYW5kIGFza3M6CgpgYGAK4pqgIHBvcnQgMTAwMDAgaXMgYWxyZWFkeSBpbiB1c2Ug4oCUIGNhbid0IHN0YXJ0IFNvY2tldC5JTyBicmlkZ2UuCiAgUHJvY2VlZCB3aXRob3V0IFNvY2tldC5JTyBicmlkZ2U/IFt5L05dOgpgYGAKCkFuc3dlciAqKnkqKi4gWW91ciBwbHVnaW4gYmFja2VuZCB3aWxsIGNvbm5lY3QgdG8gdGhlIE11c2NhdCBicmlkZ2UgdGhhdCdzIGFscmVhZHkKcnVubmluZyBpbnN0ZWFkIG9mIHN0YXJ0aW5nIGEgbmV3IG9uZSDigJQgZXhhY3RseSB3aGF0IHlvdSB3YW50IHdoZW4gZGV2ZWxvcGluZyBvbiB0aGUKcm9ib3QuCgo+IElmIHlvdSBhbnN3ZXIgKipuKiogKG9yIGp1c3QgcHJlc3MgRW50ZXIpLCB0aGUgQ0xJIGV4aXRzIHNvIHlvdSBjYW4gZnJlZSB0aGUgcG9ydAo+IG1hbnVhbGx5IGFuZCByZXRyeS4KCi0tLQoKIyMgQmFja2VuZCBydW50aW1lcwoKYG1hbmlmZXN0Lmpzb25gIGNob29zZXMgb25lIGJhY2tlbmQgcnVudGltZS4gYG11c2NhdC1wayBkZXZgIHJ1bnMgYmFja2VuZCBjb2RlIGluCmEgRG9ja2VyIGNvbnRhaW5lciBtYXRjaGluZyB0aGUgcm9ib3QgZW52aXJvbm1lbnQuIEJhY2tlbmQgY29kZSBzaG91bGQgY29udGFpbgpwbHVnaW4gbG9naWMgb25seTsgaXQgc2hvdWxkIG5vdCBzdGFydCB0aGUgTXVzY2F0IGJyaWRnZSBvciBpdHMgb3duIGNvcHkgb2YgdGhlCnBsdWdpbiBnYXRld2F5LgoKIyMjIFdoaWNoIGJhY2tlbmQgcGF0dGVybj8gKGRlcGVuZHMgb24gdGhlIGNvbnRyaWJ1dGlvbiBwb2ludCkKCioqSG93IHlvdSBjb250cm9sIHRoZSByb2JvdCBkZXBlbmRzIG9uIHdoYXQgeW91ciBwbHVnaW4gY29udHJpYnV0ZXMqKiAoc2VlCmBtYW5pZmVzdC5qc29uYCDihpIgYGNvbnRyaWJ1dGVzW10ucG9pbnRgKS4gRG9uJ3QgbWl4IHRoZXNlIHVwOgoKfCBDb250cmlidXRpb24gcG9pbnQgfCBXaGF0IGl0IGlzIHwgQmFja2VuZCBwYXR0ZXJuIHwKfCAtLS0gfCAtLS0gfCAtLS0gfAp8IGBwcm9ncmFtLnBhbmVsYCAod2l0aCBgY29tbWFuZEluZm9gKSB8IERlZmluZXMgYSAqKmN1c3RvbSBjb21tYW5kKiogdGhlIHBsdWdpbiBhZGRzIHRvIHRoZSBQcm9ncmFtIHBhZ2UncyBydWxlLWJhc2VkIHNlcXVlbmNlIGJ1aWxkZXIuIFRoZSBvcGVyYXRvciBwbGFjZXMgaXQgaW50byB0aGUgcHJvZ3JhbSB0cmVlIGxpa2UgYW55IGJ1aWx0LWluIGNvbW1hbmQgKE1vdmUgSiwgUG9pbnQsIFdhaXQsIOKApik7IGl0IHJ1bnMgd2hlbiB0aGUgcHJvZ3JhbSByZWFjaGVzIHRoYXQgc3RlcC4gfCAqKmBQbHVnaW5Qcm9ncmFtQ29udGV4dGAqKiDigJQgaW50ZWdyYXRlZCB3aXRoIHRoZSBwcm9ncmFtJ3Mgc3RvcC9wYXVzZSBhbmQgdmFyaWFibGVzLiBTZWUgX1Byb2dyYW0gY29tbWFuZCBiYWNrZW5kXyBiZWxvdy4gfAp8IGB0b29sYmFyYCAvIGBsbmJgIC8gYG1vdmUucGFuZWxgIHwgQSBsaXZlIFVJIHBhbmVsL3BvcG92ZXIgdGhlIG9wZXJhdG9yIGludGVyYWN0cyB3aXRoIGRpcmVjdGx5IHwgQ2FsbCB0aGUgcm9ib3QgKipTREsgZGlyZWN0bHkqKiAoYFJCTWFuaXB1bGF0ZVNES2ApIGZyb20gYGNwcC9tYWluLmNwcGAsIG9yIGByYi5hY3Rpb24oLi4uKWAg4oaSIHlvdXIgYmFja2VuZCDihpIgU0RLLiAqKk5vdCoqIGEgcHJvZ3JhbSBzdGVwIOKAlCB0aGVyZSBpcyBubyBzdG9wL3BhdXNlL3ZhcmlhYmxlIGNvbnRleHQuIHwKClJ1bGUgb2YgdGh1bWI6IHVzZSBgUGx1Z2luUHJvZ3JhbUNvbnRleHRgICoqb25seSoqIGZvciBhIGBwcm9ncmFtLnBhbmVsYCBjb21tYW5kCnRoYXQgcnVucyBhcyBwYXJ0IG9mIGEgcHJvZ3JhbS4gVG8gbW92ZSB0aGUgcm9ib3QgbGl2ZSBmcm9tIGEgdG9vbGJhci9tb3ZlIHBhbmVsLAp1c2UgdGhlIFNESyDigJQgYSBwcm9ncmFtLXN0ZXAgY29udGV4dCBkb2VzIG5vdCBhcHBseS4KCiMjIyBGcm9udGVuZC1vbmx5IChgbm9uZWApCgpVc2UgdGhpcyB3aGVuIHRoZSBwbHVnaW4gb25seSBoYXMgVUkgYW5kIGNhbGxzIGhvc3Qgc2VydmljZXM6CgpgYGBqc29uCnsgInJ1bnRpbWUiOiB7ICJ0eXBlIjogIm5vbmUiIH0gfQpgYGAKCiMjIyBDKysgKGBjcHBgKQoKQysrIHBsdWdpbnMgYnVpbGQgYGNwcC9gIHdpdGggQ01ha2UgYW5kIHJ1biB0aGUgZXhlY3V0YWJsZSBuYW1lZCBieQpgbWFuaWZlc3QuanNvbmAg4oaSIGBydW50aW1lLmVudHJ5YC4gVGhlIFJhaW5ib3cgUm9ib3RpY3MgQysrIFNESwooYHJhaW5ib3ctcmItc2RrLWRldmApIGlzIHByZS1pbnN0YWxsZWQgaW4gdGhlIGBtdXNjYXQtcGtgIGRldiBjb250YWluZXIg4oCUIHlvdQpkb24ndCBpbnN0YWxsIGFueXRoaW5nIGxvY2FsbHkuCgpgYGBqc29uCnsgInJ1bnRpbWUiOiB7ICJ0eXBlIjogImNwcCIsICJlbnRyeSI6ICJfX1BMVUdJTl9TTFVHX18iIH0gfQpgYGAKCmBgYGNtYWtlCiMgY3BwL0NNYWtlTGlzdHMudHh0CmZpbmRfcGFja2FnZShyYl9zZGsgUkVRVUlSRUQpCmFkZF9leGVjdXRhYmxlKF9fUExVR0lOX1NMVUdfXyBtYWluLmNwcCkgICAgICAgICAgICMgbmFtZSBtdXN0IGVxdWFsIHJ1bnRpbWUuZW50cnkKdGFyZ2V0X2xpbmtfbGlicmFyaWVzKF9fUExVR0lOX1NMVUdfXyBQUklWQVRFIHJiX3Nkazo6cmJfc2RrKQpgYGAKCkhlYWRlcnMgbGl2ZSB1bmRlciBgPHJhaW5ib3cvcmJfc2RrLy4uLj5gOgoKfCBIZWFkZXIgfCBDbGFzcyB8IFVzZSB8CnwgLS0tIHwgLS0tIHwgLS0tIHwKfCBgcGx1Z2luL3JiX3BsdWdpbi5ocHBgIHwgYHJiX3BsdWdpbjo6UkJQbHVnaW5DYWxsYCB8IHBsdWdpbiBVSSDihpQgYmFja2VuZCwgZXh0ZXJuYWwgZW5kcG9pbnRzIChgcm91dGVyKClgKSB8CnwgYG1hbmlwdWxhdGUvcmJfbWFuaXB1bGF0ZV9zZGsuaHBwYCB8IGBSQk1hbmlwdWxhdGVTREtgIHwgY29udHJvbCBhIG1hbmlwdWxhdG9yIHwKfCBgcHJvZ3JhbS9yYl9wcm9ncmFtX3Nkay5ocHBgIHwgYFJCUHJvZ3JhbVNES2AgfCBwcm9ncmFtLXNpZGUgaGVscGVycyB8CnwgYHByb2dyYW0vcGx1Z2luX3Byb2dyYW1fY29udGV4dC5ocHBgIHwgYHJiX3BsdWdpbjo6UGx1Z2luUHJvZ3JhbUNvbnRleHRgIHwgYHByb2dyYW0ucGFuZWxgIGNvbW1hbmRzIHwKfCBgemVub2hfY2xpZW50LmhwcGAgfCBgWmVub2hDbGllbnRgIHwgbG93LWxldmVsIHB1Yi9zdWIvcXVlcnkgfAoKUGF5bG9hZHMgYXJlIGBubG9obWFubjo6anNvbmAgKGAjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+YCwgaW5zdGFsbGVkIHdpdGggdGhlIFNESykuCgojIyMjIFRhbGtpbmcgdG8gdGhlIHBsdWdpbiBVSSAoYFJCUGx1Z2luQ2FsbGApCgpgYGBjcHAKI2luY2x1ZGUgPHJhaW5ib3cvcmJfc2RrL3BsdWdpbi9yYl9wbHVnaW4uaHBwPgojaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+Cgp1c2luZyBubG9obWFubjo6anNvbjsKdXNpbmcgcmJfcGx1Z2luOjpSQlBsdWdpbkNhbGw7CgppbnQgbWFpbigpIHsKICAvLyBwbHVnaW4gaWQgY29tZXMgZnJvbSBlbnYgUkJfUExVR0lOX0lEIChzZXQgYnkgbXVzY2F0LXBrIGRldiBhbmQgYnkgdGhlIHJvYm90KQogIGF1dG8gcGx1Z2luID0gUkJQbHVnaW5DYWxsOjpnZXRfaW5zdGFuY2UoUkJQbHVnaW5DYWxsOjpyZXNvbHZlX3BsdWdpbl9pZChzdGQ6Om51bGxvcHQpKTsKCiAgcGx1Z2luLT5wdWJsaXNoKCJzdGF0ZSIsIHt7InJlYWR5IiwgdHJ1ZX19KTsgICAgICAgICAgICAgICAgIC8vIFVJOiByYi5zdWIoInN0YXRlIiwgLi4uKQoKICBhdXRvIHN1YiA9IHBsdWdpbi0+c3Vic2NyaWJlKCJldmVudCIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUk6IHJiLnB1YigiZXZlbnQiLCAuLi4pCiAgICAgIFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiB0b3BpYywgY29uc3QganNvbiYgcGF5bG9hZCkgeyAvKiAuLi4gKi8gfSk7CgogIHBsdWdpbi0+c2VydmUoInRvb2wvZWNobyIsIFtdKGNvbnN0IGpzb24mIHBheWxvYWQpIHsgICAgICAgICAvLyBVSTogYXdhaXQgcmIuYWN0aW9uKCJ0b29sL2VjaG8iLCAuLi4pCiAgICByZXR1cm4ganNvbnt7ImVjaG8iLCBwYXlsb2FkfX07CiAgfSk7CgogIGpzb24gcmVzID0gcGx1Z2luLT5jYWxsKCJ0b29sL3BpbmciLCB7eyJoZWxsbyIsICJwbHVnaW4ifX0sIDUuMCk7ICAvLyBVSSBhbnN3ZXJzIHdpdGggcmIuc2VydmUoInRvb2wvcGluZyIsIC4uLikKCiAgZm9yICg7Oykgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsgICAgLy8gc3RheSByZXNpZGVudAp9CmBgYAoKfCBDKysgfCBVSSAoYHVzZVJiKClgKSB8CnwgLS0tIHwgLS0tIHwKfCBgcGx1Z2luLT5zZXJ2ZSh0b3BpYywgZm4pYCB8IGBhd2FpdCByYi5hY3Rpb24odG9waWMsIHBheWxvYWQpYCB8CnwgYHBsdWdpbi0+c3Vic2NyaWJlKHRvcGljLCBmbilgIHwgYHJiLnB1Yih0b3BpYywgcGF5bG9hZClgIHwKfCBgcGx1Z2luLT5wdWJsaXNoKHRvcGljLCBwYXlsb2FkKWAgfCBgcmIuc3ViKHRvcGljLCBoYW5kbGVyKWAgfAp8IGBwbHVnaW4tPmNhbGwodG9waWMsIHBheWxvYWQsIHRpbWVvdXRfc2VjKWAgfCBgcmIuc2VydmUodG9waWMsIGhhbmRsZXIpYCB8CgotIEtlZXAgdGhlIGBTdWJzY3JpcHRpb25gIHJldHVybmVkIGJ5IGBzdWJzY3JpYmVgOyBwYXNzIGl0IHRvIGBwbHVnaW4tPnVuc3Vic2NyaWJlKHN0ZDo6bnVsbG9wdCwgc3ViKWAgdG8gcmVtb3ZlIGp1c3QgdGhhdCBvbmUuCi0gYGNhbGxgIHRocm93cyBgcmJfcGx1Z2luOjpSQlBsdWdpbkdhdGV3YXlFcnJvcmAgd2hlbiB0aGUgZ2F0ZXdheSBpcyBkb3duIG9yIHRoZSBVSSBkb2Vzbid0IGFuc3dlciBpbiB0aW1lLgoKIyMjIyBFeHRlcm5hbCBlbmRwb2ludHMgKGByb3V0ZXIoKWApCgpgc2VydmVgIC8gYHN1YnNjcmliZWAgLyBgcHVibGlzaGAgYXJlICoqaW50ZXJuYWwgb25seSoqIChwbHVnaW4gVUkg4oaUIGJhY2tlbmQpLgpUbyBleHBvc2UgYW4gZW5kcG9pbnQgdG8gdGhlIG91dHNpZGUgd29ybGQg4oCUIFJFU1QsIFNvY2tldC5JTywgVENQLCBNUVRULApXZWJSVEMg4oCUIHVzZSBgcGx1Z2luLT5yb3V0ZXIoKWAuIFRoZSBydW5uaW5nIE11c2NhdCAoYGNvbW1vbmApIHBpY2tzIGl0IHVwCndpdGhvdXQgYSByZXN0YXJ0LCBhbmQgaXQgZGlzYXBwZWFycyB3aGVuIHRoZSBwbHVnaW4gc3RvcHMuCgpgYGBjcHAKYXV0byYgcm91dGVyID0gcGx1Z2luLT5yb3V0ZXIoKTsKCnJvdXRlci5vbigiL2hlbGxvIiwgW10oY29uc3QganNvbiYgcGF5bG9hZCwgY29uc3QganNvbiYgbWV0YSkgeyAgICAgICAvLyBhbGwgNSB0cmFuc3BvcnRzCiAgcmV0dXJuIGpzb257eyJtc2ciLCAiaGkgIiArIHBheWxvYWQudmFsdWUoIm5hbWUiLCBzdGQ6OnN0cmluZygidGhlcmUiKSl9fTsKfSk7Cgpyb3V0ZXIub24oIi9hZG1pbiIsIFtdKGNvbnN0IGpzb24mIHBheWxvYWQsIGNvbnN0IGpzb24mIG1ldGEpIHsKICBpZiAoIW1ldGEudmFsdWUoInByaW5jaXBhbCIsIGpzb246Om9iamVjdCgpKS52YWx1ZSgiaXNfYWRtaW4iLCBmYWxzZSkpCiAgICB0aHJvdyByYl9wbHVnaW46OlBsdWdpblJvdXRlRXJyb3IoNDAzLCAiYWRtaW4gb25seSIpOyAgICAgICAgICAgICAgLy8gYmVjb21lcyB0aGUgZXh0ZXJuYWwgc3RhdHVzCiAgcmV0dXJuIGpzb246Om9iamVjdCgpOwp9LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImFwaSJ9KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkVTVCBvbmx5Cgpyb3V0ZXIuc3Vic2NyaWJlKCIvY21kIiwgW10oY29uc3QganNvbiYgcGF5bG9hZCkgeyAvKiAuLi4gKi8gfSwKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57InRjcCJ9KTsgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmUgZXh0ZXJuYWwgVENQIHB1Ymxpc2gKCnJvdXRlci5lbWl0KCIvc3RhdGUiLCB7eyJidXN5IiwgdHJ1ZX19KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVzaCB0byBleHRlcm5hbCBzdWJzY3JpYmVycwpgYGAKCmBgYGJhc2gKY3VybCAtcyAtWCBQT1NUIGh0dHA6Ly88cm9ib3Q+L2NvbW1vbi9wbHVnaW4vPHBsdWdpbl9pZD4vaGVsbG8gXAogIC1IICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIC1kICd7Im5hbWUiOiJraW0ifScKIyDihpIgeyJtc2ciOiJoaSBraW0ifQpgYGAKCnwgQVBJIHwgTWVhbmluZyB8IEV4dGVybmFsIGFkZHJlc3MgfAp8IC0tLSB8IC0tLSB8IC0tLSB8CnwgYHJvdXRlci5vbihwYXRoLCBoYW5kbGVyLCBleHBsaWNpdF9yb3V0ZXMpYCB8IHJlcXVlc3QvcmVzcG9uc2UgaGFuZGxlciB8IGBjb21tb24vcGx1Z2luL3twbHVnaW5faWR9L3twYXRofWAgKFJFU1QgaXMgYWx3YXlzIGBQT1NUYCkgfAp8IGByb3V0ZXIuc3Vic2NyaWJlKHRvcGljLCBoYW5kbGVyLCBleHBsaWNpdF9ldmVudHMpYCB8IHJlY2VpdmUgZXh0ZXJuYWwgcHVibGlzaGVzIHwgZXh0ZXJuYWwgc2lkZSBwdWJsaXNoZXMgdG8gYGNvbW1vbi9wbHVnaW4ve3BsdWdpbl9pZH0ve3RvcGljfWAgfAp8IGByb3V0ZXIuZW1pdCh0b3BpYywgcGF5bG9hZClgIHwgcGx1Z2luIOKGkiBleHRlcm5hbCBwdXNoIHwgZXh0ZXJuYWwgc2lkZSBzdWJzY3JpYmVzIHRvIGBjb21tb24vcGx1Z2luL3twbHVnaW5faWR9L3t0b3BpY31gIHwKCi0gYG1ldGFgID0gYHsidHJhbnNwb3J0IjogImFwaSJ8InNvY2tldCJ8InRjcCJ8Im1xdHQifCJ3ZWJydGMiLCAicHJpbmNpcGFsIjogb2JqZWN0IHwgbnVsbH1gLiAqKlJvbGUgY2hlY2tzIGFyZSB0aGUgcGx1Z2luJ3Mgam9iLioqCi0gVHJhbnNwb3J0IG5hbWVzOiBgYXBpIHwgc29ja2V0IHwgdGNwIHwgbXF0dCB8IHdlYnJ0Y2A7IGBzdWJzY3JpYmVgIGFjY2VwdHMgb25seSBgdGNwIHwgbXF0dCB8IHdlYnJ0Y2AuIFVua25vd24gbmFtZXMgb3IgZHVwbGljYXRlIHBhdGhzIHRocm93IGBzdGQ6OmludmFsaWRfYXJndW1lbnRgLgotIFRocm93IGByYl9wbHVnaW46OlBsdWdpblJvdXRlRXJyb3IoY29kZSwgbWVzc2FnZSlgIHRvIHNldCB0aGUgc3RhdHVzOyBhbnkgb3RoZXIgZXhjZXB0aW9uIOKGkiA1MDAuCgp8IFNpdHVhdGlvbiB8IFN0YXR1cyB8CnwgLS0tIHwgLS0tIHwKfCBObyBwbHVnaW4gZGVjbGFyZXMgdGhhdCBwYXRoIC8gcGx1Z2luIGlzIGRvd24gLyB0cmFuc3BvcnQgbm90IGFsbG93ZWQgfCA0MDQgfAp8IFBsdWdpbiBkaWQgbm90IGFuc3dlciB3aXRoaW4gMTAgcyB8IDUwNCB8CnwgYGNvbW1vbmAg4oaUIGdhdGV3YXkgbm90IGNvbm5lY3RlZCB8IDUwMyB8CgpEdXJpbmcgYG11c2NhdC1wayBkZXZgIHRoZSBsb2NhbCBicmlkZ2UgYWNjZXB0cyBgcm91dGVyKClgIHJlZ2lzdHJhdGlvbnMsIGJ1dAoqKmV4dGVybmFsIGNhbGxzIG5lZWQgYSBydW5uaW5nIGBjb21tb25gKiogKGEgcm9ib3Qgb3IgYSBsb2NhbCBgY29tbW9uYCkuIEFmdGVyCnJlc3RhcnRpbmcgdGhlIHBsdWdpbiwgZXh0ZXJuYWwgY2FsbHMgbWF5IHJldHVybiA1MDQgZm9yIGFib3V0IGEgbWludXRlLCB0aGVuIDQwNC4KCiMjIyMgUHJvZ3JhbSBjb21tYW5kIGJhY2tlbmQgKGBwcm9ncmFtLnBhbmVsYCkKCkEgYHByb2dyYW0ucGFuZWxgIGNvbnRyaWJ1dGlvbiBhZGRzIGEgKipjdXN0b20gY29tbWFuZCoqIHRvIHRoZSBQcm9ncmFtIHBhZ2UuCkVhY2ggdGltZSB0aGUgcHJvZ3JhbSByZWFjaGVzIHRoYXQgc3RlcCwgdGhlIGhvc3QgY2FsbHMgeW91ciBiYWNrZW5kIHRocm91Z2gKYFBsdWdpblByb2dyYW1Db250ZXh0YCB3aXRoIHRoZSBzdGVwIGFyZ3MgKHdoYXQgdGhlIFVJIHNhdmVkIHdpdGggYHVzZVJiU2F2ZWApLgoKYGBgY3BwCiNpbmNsdWRlIDxyYWluYm93L3JiX3Nkay9wcm9ncmFtL3BsdWdpbl9wcm9ncmFtX2NvbnRleHQuaHBwPgoKdXNpbmcgcmJfcGx1Z2luOjpQbHVnaW5Qcm9ncmFtQ29udGV4dDsKCmludCBtYWluKCkgewogIFBsdWdpblByb2dyYW1Db250ZXh0IGN0eCgiX19QTFVHSU5fSURfXyIpOwoKICBjdHguc2V0X2V4ZWN1dGVfaGFuZGxlcihbJl0oY29uc3QgbmxvaG1hbm46Ompzb24mIGFyZ3MpIHsKICAgIGF1dG8gY291bnQgPSBjdHguZ2V0X3ZhcmlhYmxlKCJjb3VudGVyIik7ICAgICAgICAgICAgICAgICAgLy8ganNvbjsgbnVsbCBpZiBubyBwcm9ncmFtIHJ1bnMKICAgIGN0eC5zZXRfdmFyaWFibGUoImNvdW50ZXIiLCBjb3VudC5pc19udW1iZXIoKSA/IGNvdW50LmdldDxpbnQ+KCkgKyAxIDogMSk7CiAgICBjdHguc2V0X3ZhcmlhYmxlKCJSQlBfX19QTFVHSU5fU0xVR19fX3Jlc3VsdCIsIDQyKTsgICAgICAgIC8vIE5FVyB2YXJpYWJsZXMgbXVzdCBzdGFydCB3aXRoIFJCUF8KCiAgICB0cnkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CiAgICAgICAgY3R4LmNoZWNrX3N0b3AoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdXNlIOKGkiBibG9ja3MsIHN0b3Ag4oaSIHRocm93cyBQbHVnaW5TdG9wcGVkCiAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNTAwKSk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGNvbnN0IHJiX3BsdWdpbjo6UGx1Z2luU3RvcHBlZCYpIHsKICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvZ3JhbSB3YXMgc3RvcHBlZAogICAgfQogICAgY3R4LmRvbmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgY2FsbCDigJQgdGhlIHN0ZXAgZW5kcyBoZXJlCiAgfSk7CgogIGN0eC5zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBibG9jawogIGZvciAoOzspIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Cn0KYGBgCgotIFRoZSBzdGVwIGRvZXMgbm90IGZpbmlzaCB1bnRpbCB5b3UgY2FsbCBgY3R4LmRvbmUoKWAuCi0gYHNldF9leGVjdXRlX2hhbmRsZXJgIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBgc3RhcnQoKWAuCi0gKipOZXcqKiB2YXJpYWJsZXMgbmVlZCB0aGUgYFJCUF9gIHByZWZpeCAoYFJCUF97cGx1Z2luX2lkfV97bmFtZX1gIHJlY29tbWVuZGVkKTsgZXhpc3Rpbmcgb25lcyBwYXNzIGFzLWlzLgotIGBnZXRfdmFyaWFibGUobmFtZSwgcm9ib3RfbW9kZWwsIHBsdWdpbl9pZClgIOKAlCBvcHRpb25hbCBmaWx0ZXJzOiBhIHNwZWNpZmljIHJvYm90LCBvciB0aGUgdmFsdWUgYSBnaXZlbiBwbHVnaW4gbGFzdCB3cm90ZS4KLSBFeGVjdXRvciBzdGF0ZTogYGN0eC5leGVjdXRvcl9zdGF0ZV9mb3IoIkM1MDA5MjAiKWAsIGBjdHguZXhlY3V0b3Jfc3RhdGVzKClgLCBgY3R4LmlzX3BhdXNlZCgpYCwgYGN0eC5pc19zdG9wcGVkKClgLAogIG9yIGBjdHguc2V0X3N0YXRlX2NoYW5nZV9oYW5kbGVyKFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXRlKSB7IC4uLiB9KWAuCi0gQSBsb25nLXJ1bm5pbmcgaGFuZGxlciBtdXN0IGNhbGwgYGNoZWNrX3N0b3AoKWAgZXZlcnkgaXRlcmF0aW9uLCBvciBpdCBrZWVwcyBydW5uaW5nIGFmdGVyIHRoZSBvcGVyYXRvciBwcmVzc2VzIFN0b3AuCgpWYXJpYWJsZXMgdGhlIFByb2dyYW0gcGFnZSB2YXJpYWJsZSBwaWNrZXIgc2hvdWxkIG9mZmVyIG11c3QgYmUgZGVjbGFyZWQgaW4KYG1hbmlmZXN0Lmpzb25gIHVuZGVyIGAidmFyaWFibGVzImAuCgojIyMjIENvbnRyb2xsaW5nIHRoZSByb2JvdAoKYGBgY3BwCiNpbmNsdWRlIDxyYWluYm93L3JiX3Nkay9tYW5pcHVsYXRlL3JiX21hbmlwdWxhdGVfc2RrLmhwcD4KClJCTWFuaXB1bGF0ZVNESyBtYW5pcHVsYXRlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIHJvYm90OiBjb25uZWN0cyB0byB0aGUgbG9jYWwgWmVub2gKbWFuaXB1bGF0ZS5zdGF0ZS5jYWxsX3NlcnZvY29udHJvbCgiQzUwMDkyMCIsIDEpOwoKSVBDOjpNb3ZlSW5wdXRfVGFyZ2V0VCB0Owp0LnRhcl92YWx1ZXMgPSB7MCwgMCwgOTAsIDAsIDkwLCAwfTsKdC50YXJfZnJhbWUgPSAwOwp0LnRhcl91bml0ID0gMTsKbWFuaXB1bGF0ZS5tb3ZlLmNhbGxfbW92ZV9qKCJDNTAwOTIwIiwgdCwgc3RkOjpudWxsb3B0LCBNb3ZlU3BlZWRBcmd7MSwgNjAuZiwgMTIwLmZ9KTsKbWFuaXB1bGF0ZS5tb3ZlLmNhbGxfbW92ZV93YWl0KCJDNTAwOTIwIiwgLTEpOwpgYGAKClJlbW90ZSBkZXYgKGBtdXNjYXQtcGsgZGV2IC0tcm9ib3QtaXAgPGlwPiAtLXJvYm90LXRva2VuIDx0b2tlbj5gKSBzZXRzCmBNVVNDQVRfUk9CT1RfSE9TVGAgLyBgTVVTQ0FUX1JPQk9UX1RPS0VOYDsgY29ubmVjdCAqKmJlZm9yZSoqIHJlZ2lzdGVyaW5nCnN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgYGNvbm5lY3QoKWAgcmVvcGVucyB0aGUgWmVub2ggc2Vzc2lvbjoKCmBgYGNwcAppZiAoY29uc3QgY2hhciogaG9zdCA9IHN0ZDo6Z2V0ZW52KCJNVVNDQVRfUk9CT1RfSE9TVCIpKQogIGlmIChjb25zdCBjaGFyKiB0b2tlbiA9IHN0ZDo6Z2V0ZW52KCJNVVNDQVRfUk9CT1RfVE9LRU4iKSkKICAgIG1hbmlwdWxhdGUuY29ubmVjdCh7LnRva2VuID0gdG9rZW4sIC5ob3N0ID0gaG9zdH0pOwpgYGAKCkFNUiBhbmQgUkItWTEgU0RLcyBhcmUgUHl0aG9uLW9ubHkgZm9yIG5vdy4KCiMjIyBST1MyIChyY2xjcHApCgpST1MyIEMrKyBwbHVnaW5zIHVzZSBgcm9zMl93cy9gIHdpdGggYHJ1bnRpbWUucm9zQ2xpZW50OiAicmNsY3BwImAuIFRoZSBub2RlCmxpbmtzIHRoZSBDKysgU0RLIHRoZSBzYW1lIHdheSAoYGZpbmRfcGFja2FnZShyYl9zZGspYCArIGByYl9zZGs6OnJiX3Nka2ApIGFuZCBpcwpsYXVuY2hlZCB3aXRoIGAtLXJvcy1hcmdzIC1yIF9fbnM6PS97c2x1Z31gIGF1dG9tYXRpY2FsbHkuCgpgYGBjcHAKI2luY2x1ZGUgInJjbGNwcC9yY2xjcHAuaHBwIgojaW5jbHVkZSA8cmFpbmJvdy9yYl9zZGsvbWFuaXB1bGF0ZS9yYl9tYW5pcHVsYXRlX3Nkay5ocHA+CgpjbGFzcyBfX1BMVUdJTl9DTEFTU19fTm9kZSA6IHB1YmxpYyByY2xjcHA6Ok5vZGUgewpwdWJsaWM6CiAgX19QTFVHSU5fQ0xBU1NfX05vZGUoKSA6IE5vZGUoIl9fUExVR0lOX1NMVUdfX19ub2RlIikgewogICAgUkNMQ1BQX0lORk8odGhpcy0+Z2V0X2xvZ2dlcigpLCAiX19QTFVHSU5fTkFNRV9fIG5vZGUgc3RhcnRlZCIpOwogIH0KfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogIHJjbGNwcDo6aW5pdChhcmdjLCBhcmd2KTsKICByY2xjcHA6OnNwaW4oc3RkOjptYWtlX3NoYXJlZDxfX1BMVUdJTl9DTEFTU19fTm9kZT4oKSk7CiAgcmNsY3BwOjpzaHV0ZG93bigpOwogIHJldHVybiAwOwp9CmBgYAoKYFJCUGx1Z2luQ2FsbGAgYW5kIGBQbHVnaW5Qcm9ncmFtQ29udGV4dGAgd29yayBpbiBhbiByY2xjcHAgbm9kZSB0b28g4oCUIGNyZWF0ZQp0aGVtIGluIGBtYWluKClgIGJlZm9yZSBgcmNsY3BwOjpzcGluYC4KCi0tLQoKIyMgbWFuaWZlc3QuanNvbgoKYGBganNvbmMKewogIC8vIHVuaXF1ZSBwbHVnaW4gSUQg4oCUIHJldmVyc2UtZG9tYWluIGZvcm1hdCByZWNvbW1lbmRlZAogICJpZCI6ICJjb20uZXhhbXBsZS5teS1wbHVnaW4iLAogICJuYW1lIjogIk15IFBsdWdpbiIsCiAgInZlcnNpb24iOiAiMS4wLjAiLAoKICAvLyBtaW5pbXVtIE11c2NhdCB2ZXJzaW9uIHJlcXVpcmVkIHRvIGxvYWQgdGhpcyBwbHVnaW4KICAibWluTXVzY2F0VmVyc2lvbiI6ICIxLjAuMCIsCgogIC8vIHBsdWdpbiBhdXRob3IgKGVtcHR5IHN0cmluZyBpcyBmaW5lKQogICJhdXRob3IiOiAiWW91ciBOYW1lIiwKCiAgLy8gZGlzcGxheWVkIGluIHRoZSBNdXNjYXQgcGx1Z2luIHN0b3JlIC8gaW5mbyBwYW5lbAogIC8vIHN0cmluZyBvciB7IGVuIChyZXF1aXJlZCksIGtvLCBqYSwgemgsIHZpLCB0aCwgZXMgfQogICJkZXNjcmlwdGlvbiI6IHsgImVuIjogIlBsdWdpbiBkZXNjcmlwdGlvbiIsICJrbyI6ICLtlIzrn6zqt7jsnbgg7ISk66qFIiB9LAoKICAvLyBTVkcgc3RyaW5nIChzaW5nbGUgZmlsZSkgb3IgUE5HL0pQRyBzaXplIG1hcCAoYWxsIHRocmVlIHNpemVzIHJlcXVpcmVkKQogICJpY29ucyI6ICJhc3NldHMvaWNvbi5zdmciLAogIC8vICJpY29ucyI6IHsgIjE2IjogImFzc2V0cy9pY29uLTE2LnBuZyIsICI0OCI6ICJhc3NldHMvaWNvbi00OC5wbmciLCAiMTI4IjogImFzc2V0cy9pY29uLTEyOC5wbmciIH0sCgogIC8vIHRhcmdldE1vZGVscyBhbmQvb3IgdGFyZ2V0Q2F0ZWdvcnlzIOKAlCBhdCBsZWFzdCBvbmUgaXMgcmVxdWlyZWQKICAvLyAiYWxsIiA9IGV2ZXJ5IHRhcmdldCwgb3IgbGlzdCBzcGVjaWZpYyB2YWx1ZXMKICAidGFyZ2V0TW9kZWxzIjogImFsbCIsCiAgLy8gInRhcmdldE1vZGVscyI6IFsiQzUwMDkyMCIsICJDNTAwOTMwIl0sCiAgInRhcmdldENhdGVnb3J5cyI6ICJhbGwiLAogIC8vICJ0YXJnZXRDYXRlZ29yeXMiOiBbIm1hbmlwdWxhdGUiLCAiYW1yIiwgInJieTEiLCAidmlzaW9uIl0sCgogICJjb250cmlidXRlcyI6IFsKICAgIC8vIHByb2dyYW0ucGFuZWwg4oCUIGRlZmluZXMgYSBjdXN0b20gY29tbWFuZCBmb3IgdGhlIFByb2dyYW0gcGFnZSBzZXF1ZW5jZQogICAgLy8gICBidWlsZGVyOyBydW5zIHZpYSBQbHVnaW5Qcm9ncmFtQ29udGV4dCB3aGVuIHRoZSBwcm9ncmFtIHJlYWNoZXMgaXQKICAgIHsKICAgICAgInBvaW50IjogInByb2dyYW0ucGFuZWwiLAogICAgICAiaWNvbiI6ICJhc3NldHMvaWNvbi5zdmciLAogICAgICAibGFiZWwiOiB7ICJrbyI6ICLrgrQg7ZSM65+s6re47J24IiwgImVuIjogIk15IFBsdWdpbiIgfSwKICAgICAgInVpIjogInByb2dyYW0iLCAgICAgICAgICAgLy8gbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBjb250cmlidXRpb25zCiAgICAgICJjb21tYW5kSW5mbyI6IHsKICAgICAgICAibmFtZSI6ICJNeSBQbHVnaW4iLAogICAgICAgICJpY29uIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgICAgICAgImZ1bmNOYW1lIjogInJiX3Byb2dyYW1fc2RrLnBsdWdpbl9leGVjdXRlIiwKICAgICAgICAiYXJncyI6IHt9CiAgICAgIH0KICAgIH0sCiAgICAvLyB0b29sYmFyIOKAlCBhZGRzIGEgYnV0dG9uIHRvIHRoZSB0b3AgdG9vbGJhciAocmVxdWlyZWQpCiAgICB7CiAgICAgICJwb2ludCI6ICJ0b29sYmFyIiwKICAgICAgImljb24iOiAiYXNzZXRzL2ljb24uc3ZnIiwKICAgICAgImxhYmVsIjogeyAia28iOiAi64K0IO2UjOufrOq3uOyduCIsICJlbiI6ICJNeSBQbHVnaW4iIH0sCiAgICAgICJ1aSI6ICJjb250ZW50IiwgICAgICAgICAgIC8vIG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhbGwgY29udHJpYnV0aW9ucwogICAgICAib3BlbnMiOiAicG9wb3ZlciIgICAgICAgICAvLyBwb3BvdmVyIHwgcGFuZWwgfCBwYWdlCiAgICB9LAogICAgLy8gbW92ZS5wYW5lbCDigJQgYWRkcyBhIHBhbmVsIHRvIHRoZSBNb3ZlIHNjcmVlbgogICAgewogICAgICAicG9pbnQiOiAibW92ZS5wYW5lbCIsCiAgICAgICJpY29uIjogImFzc2V0cy9pY29uLnN2ZyIsCiAgICAgICJsYWJlbCI6IHsgImtvIjogIuuCtCDtlIzrn6zqt7jsnbgiLCAiZW4iOiAiTXkgUGx1Z2luIiB9LAogICAgICAidWkiOiAibW92ZSIgICAgICAgICAgICAgICAvLyBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIGNvbnRyaWJ1dGlvbnMKICAgIH0KICBdLAoKICAvLyBvcHRpb25hbDogdmFyaWFibGVzIHRoaXMgcGx1Z2luIGV4cG9zZXMgdG8gcHlmbSBwcm9ncmFtcyDigJQgdGhlIFByb2dyYW0KICAvLyBwYWdlIHZhcmlhYmxlIHBpY2tlciBsaXN0cyBPTkxZIGRlY2xhcmVkIHZhcmlhYmxlcy4gbmFtZSBtdXN0IHN0YXJ0IHdpdGgKICAvLyBSQlBfOyBkZXNjcmlwdGlvbiBpcyBvcHRpb25hbCBidXQgd2l0aG91dCBpdCB0aGUgVUkgY2FuJ3QgZXhwbGFpbiB0aGUKICAvLyB2YXJpYWJsZSwgc28gd3JpdGUgb25lLgogICJ2YXJpYWJsZXMiOiBbCiAgICB7ICJuYW1lIjogIlJCUF9ncmlwX2ZvcmNlIiwgInR5cGUiOiAibnVtYmVyIiwgImluaXQiOiAwLjUsICJkZXNjcmlwdGlvbiI6IHsgImtvIjogIuq3uOumrO2NvCDtnpgiLCAiZW4iOiAiR3JpcHBlciBmb3JjZSIgfSB9LAogICAgeyAibmFtZSI6ICJSQlBfdGFyZ2V0X3Bvc2UiLCAidHlwZSI6ICJhcnJheSIsICJpbml0IjogWzAsIDAsIDBdIH0KICBdLAoKICAvLyBydW50aW1lIOKAlCBvbmUgb2Y6CiAgLy8gICB7ICJ0eXBlIjogIm5vbmUiIH0KICAvLyAgIHsgInR5cGUiOiAicHl0aG9uIiwgImVudHJ5IjogIm1haW4ucHkiIH0KICAvLyAgIHsgInR5cGUiOiAiY3BwIiwgImVudHJ5IjogIjxleGVjdXRhYmxlIG5hbWU+IiB9CiAgLy8gICB7ICJ0eXBlIjogInJvczIiLCAicm9zQ2xpZW50IjogInJjbHB5IiB8ICJyY2xjcHAiLCAicGFja2FnZSI6ICIuLi4iLCAibGF1bmNoIjogIi4uLl9ub2RlIiB9CiAgInJ1bnRpbWUiOiB7ICJ0eXBlIjogImNwcCIsICJlbnRyeSI6ICJfX1BMVUdJTl9TTFVHX18iIH0sCgogIC8vIG9wdGlvbmFsOiBUQ1AgcG9ydHMgb3BlbmVkIGJ5IHRoaXMgcGx1Z2luIGJhY2tlbmQKICAvLyBvbmx5IG51bWJlcltdIGlzIGFsbG93ZWQ7IHJhbmdlcy9vYmplY3RzIGFyZSBub3QgYWNjZXB0ZWQKICAvLyBleHRlcm5hbCBwbHVnaW4gcG9ydHMgbXVzdCBiZSB3aXRoaW4gMjg2MDAtMjg5OTkKICAicG9ydHMiOiBbMjg2MDBdCn0KYGBgCgoqKkJhY2tlbmQgdHlwZXM6KioKCnwgdHlwZSB8IHNvdXJjZSBkaXIgfCBidWlsZCAvIHJ1biB8IGVudHJ5IHwKfC0tLXwtLS18LS0tfC0tLXwKfCBgcHl0aG9uYCB8IGBweS9gIHwgcGlwICsgcnVuIGluIERvY2tlciB8IGBtYWluLnB5YCB8CnwgYGNwcGAgfCBgY3BwL2AgfCBDTWFrZSBpbiBEb2NrZXIgfCBidWlsdCBleGVjdXRhYmxlIG5hbWUgfAp8IGByb3MyYCAocmNscHkpIHwgYHJvczJfd3MvYCB8IGNvbGNvbiAoYW1lbnRfcHl0aG9uKSBpbiBEb2NrZXIgfCDigJQgfAp8IGByb3MyYCAocmNsY3BwKSB8IGByb3MyX3dzL2AgfCBjb2xjb24gKGFtZW50X2NtYWtlKSBpbiBEb2NrZXIgfCDigJQgfAoKPiBFdmVyeSBiYWNrIGVuZCBydW5zIGluIGEgRG9ja2VyIGNvbnRhaW5lciBtYXRjaGluZyB0aGUgcm9ib3QgKFVidW50dSAyNC4wNCArIFB5dGhvbiAzLjEyKSwgc28gZGV2IGJlaGF2ZXMgbGlrZSBwcm9kdWN0aW9uIGFuZCBjb21waWxlZCBiaW5hcmllcyBhcmUgQUJJLWNvbXBhdGlibGUuICoqRG9ja2VyIGlzIHJlcXVpcmVkKiogZm9yIGFsbCBiYWNrZW5kIHR5cGVzIChvbmx5IGEgZnJvbnRlbmQtb25seSBgbm9uZWAgcGx1Z2luIHNraXBzIGl0KS4gTm8gbG9jYWwgUHl0aG9uL3Rvb2xjaGFpbiBzZXR1cCBpcyBuZWVkZWQuCgoqKkNvbnRyaWJ1dGlvbiBwb2ludHM6KioKCnwgcG9pbnQgfCBXaGVyZSBpdCBhcHBlYXJzIHwgQmFja2VuZCB8IGBjb21tYW5kSW5mb2AgfAp8LS0tfC0tLXwtLS18Oi0tLTp8CnwgYHRvb2xiYXJgIHwgVG9wIHRvb2xiYXIgYnV0dG9uIChtdXN0IGhhdmUgYXQgbGVhc3Qgb25lKSB8IFNESyAvIGByYi5hY3Rpb25gIHwg4oCUIHwKfCBgbG5iYCB8IExlZnQgbmF2aWdhdGlvbiBlbnRyeSB8IFNESyAvIGByYi5hY3Rpb25gIHwg4oCUIHwKfCBgbW92ZS5wYW5lbGAgfCBNb3ZlIHNjcmVlbiBwYW5lbCB8IFNESyAvIGByYi5hY3Rpb25gIHwg4oCUIHwKfCBgcHJvZ3JhbS5wYW5lbGAgfCBDdXN0b20gY29tbWFuZCBpbiB0aGUgUHJvZ3JhbSBwYWdlIHNlcXVlbmNlIGJ1aWxkZXIgfCBgUGx1Z2luUHJvZ3JhbUNvbnRleHRgIHwg4pyTIHwKCioqYGNvbW1hbmRJbmZvYCBmaWVsZHMqKiAoZm9yIGBwcm9ncmFtLnBhbmVsYCk6Cgp8IGZpZWxkIHwgdHlwZSB8IGRlc2NyaXB0aW9uIHwKfC0tLXwtLS18LS0tfAp8IGBuYW1lYCB8IGBzdHJpbmdgIHwgRGlzcGxheSBuYW1lIG9mIHRoZSBjb21tYW5kIGluIHRoZSBwcm9ncmFtIHRyZWUgfAp8IGBpY29uYCB8IGBzdHJpbmdgIHwgSWNvbiBwYXRoIHwKfCBgaWNvbkNsYXNzTmFtZWAgfCBgc3RyaW5nP2AgfCBPcHRpb25hbCBDU1MgY2xhc3MgZm9yIHRoZSBpY29uIHwKfCBgZnVuY05hbWVgIHwgYHN0cmluZz9gIHwgQmFja2VuZCBmdW5jdGlvbiBuYW1lIHRvIGNhbGwgfAp8IGBhcmdzYCB8IGBSZWNvcmQ8c3RyaW5nLCBhbnk+P2AgfCBEZWZhdWx0IGFyZ3VtZW50cyB8CnwgYGRpc2FibGVkYCB8IGBib29sZWFuP2AgfCBXaGV0aGVyIHRoZSBub2RlIGlzIGRpc2FibGVkIHwKfCBgYWxsb3dDaGlsZHJlbmAgfCBgc3RyaW5nW10/YCB8IEFsbG93ZWQgY2hpbGQgY29tbWFuZHMgfAp8IGBhbGxvd1BhcmVudHNgIHwgYHN0cmluZ1tdP2AgfCBBbGxvd2VkIHBhcmVudCBjb21tYW5kcyB8CnwgYG5vdEFsbG93Q2hpbGRyZW5gIHwgYHN0cmluZ1tdP2AgfCBEaXNhbGxvd2VkIGNoaWxkIGNvbW1hbmRzIHwKfCBgc3luY0dyb3VwSWRgIHwgYGJvb2xlYW4/YCB8IFN5bmMgZ3JvdXAgSUQgYWNyb3NzIGNoaWxkcmVuIHwKfCBgZGlzYWJsZUNvcHlgIHwgYGJvb2xlYW4/YCB8IFByZXZlbnQgY29weSB8CnwgYGRpc2FibGVEZWxldGVgIHwgYGJvb2xlYW4/YCB8IFByZXZlbnQgZGVsZXRlIHwKfCBgcmVxdWlyZUNoaWxkcmVuYCB8IGBib29sZWFuP2AgfCBXaGV0aGVyIGEgY2hpbGQgY29tbWFuZCBpcyByZXF1aXJlZCB8CnwgYHJlcXVpcmVQYXJlbnRgIHwgYGJvb2xlYW4/YCB8IFdoZXRoZXIgYSBwYXJlbnQgY29tbWFuZCBpcyByZXF1aXJlZCB8CnwgYGNoaWxkcmVuQ29tbWFuZGAgfCBgc3RyaW5nP2AgfCBEZWZhdWx0IGNvbW1hbmQgdHlwZSBmb3IgY2hpbGRyZW4gfAoKKipWYWxpZGF0aW9uIHJ1bGVzOioqCi0gYGlkYCwgYG5hbWVgLCBgdmVyc2lvbmAsIGBtaW5NdXNjYXRWZXJzaW9uYCDigJQgcmVxdWlyZWQgbm9uLWVtcHR5IHN0cmluZ3MKLSBgYXV0aG9yYCDigJQgcmVxdWlyZWQgbm9uLWVtcHR5IHN0cmluZwotIGBkZXNjcmlwdGlvbmAg4oCUIHJlcXVpcmVkIChgc3RyaW5nYCBvciBgeyBlbiAocmVxdWlyZWQpLCBrbz8sIGphPywgemg/LCB2aT8sIHRoPywgZXM/IH1gKQotIGBpY29uc2Ag4oCUIFNWRzogc2luZ2xlIHN0cmluZyBwYXRoIGVuZGluZyBpbiBgLnN2Z2A7IFBORy9KUEc6IG9iamVjdCB3aXRoIGAiMTYiYCwgYCI0OCJgLCBgIjEyOCJgIGFsbCBwcmVzZW50Ci0gYHRhcmdldE1vZGVsc2Ag4oCUIGAiYWxsImAgb3IgYSBub24tZW1wdHkgYXJyYXkgb2Ygcm9ib3QgbW9kZWwgSUQgc3RyaW5ncyAoYXQgbGVhc3Qgb25lIG9mIGB0YXJnZXRNb2RlbHNgIC8gYHRhcmdldENhdGVnb3J5c2AgcmVxdWlyZWQpCi0gYHRhcmdldENhdGVnb3J5c2Ag4oCUIGAiYWxsImAgb3IgYSBub24tZW1wdHkgYXJyYXkgb2YgYCJtYW5pcHVsYXRlIiB8ICJhbXIiIHwgInJieTEiIHwgInZpc2lvbiJgIChhdCBsZWFzdCBvbmUgb2YgYHRhcmdldE1vZGVsc2AgLyBgdGFyZ2V0Q2F0ZWdvcnlzYCByZXF1aXJlZCkKLSBgY29udHJpYnV0ZXNgIOKAlCByZXF1aXJlZCBhcnJheTsgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBgdG9vbGJhcmAgZW50cnkKLSBgdWlgIOKAlCBlYWNoIGNvbnRyaWJ1dGlvbiBtdXN0IGhhdmUgYSB1bmlxdWUgdmFsdWUKLSBgY29tbWFuZEluZm9gIOKAlCByZXF1aXJlZCB3aGVuIGBwb2ludGAgaXMgYCJwcm9ncmFtLnBhbmVsImAKLSBgcG9ydHNgIOKAlCBvcHRpb25hbCBgbnVtYmVyW11gOyBldmVyeSBwb3J0IG11c3QgYmUgd2l0aGluIGAyODYwMC0yODk5OWAKICBhbmQgbXVzdCBub3QgYmUgYSByZXNlcnZlZCByb2JvdC9pbmR1c3RyaWFsL2ludGVybmFsIHBvcnQKLSBgdmFyaWFibGVzYCDigJQgb3B0aW9uYWwgYXJyYXkgb2YgYHsgbmFtZSwgdHlwZSwgaW5pdCwgZGVzY3JpcHRpb24/IH1gOgogIC0gYG5hbWVgIOKAlCBtdXN0IHN0YXJ0IHdpdGggYFJCUF9gLCB0aGVuIGxldHRlcnMvZGlnaXRzL3VuZGVyc2NvcmU7IHVuaXF1ZSBwZXIgcGx1Z2luCiAgLSBgdHlwZWAg4oCUIGAibnVtYmVyIiB8ICJzdHJpbmciIHwgImFycmF5ImAKICAtIGBpbml0YCDigJQgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSwgbXVzdCBtYXRjaCBgdHlwZWAKICAtIGBkZXNjcmlwdGlvbmAg4oCUIG9wdGlvbmFsIGBzdHJpbmdgIG9yIGkxOG4gb2JqZWN0IChgZW5gIHJlcXVpcmVkIGluIG9iamVjdCBmb3JtKQoKYG11c2NhdC1wayBidWlsZGAgdGhyb3dzIG9uIGFueSB2YWxpZGF0aW9uIGVycm9yLiBgbXVzY2F0LXBrIGRldmAgcHJpbnRzCndhcm5pbmdzIOKAlCBleGNlcHQgYHZhcmlhYmxlc2AgZXJyb3JzIChlLmcuIGEgbmFtZSB3aXRob3V0IHRoZSBgUkJQX2AgcHJlZml4KSwKd2hpY2ggYXJlIGhhcmQgZXJyb3JzIGluIGBkZXZgIC8gYGRldjpiYWNrYCB0b28uCgoqKkJhY2tlbmQgcG9ydCBydWxlczoqKgotIERlY2xhcmUgYSBwb3J0IG9ubHkgaWYgeW91ciBiYWNrZW5kIG9wZW5zIGEgVENQIHNlcnZlci9saXN0ZW5lci4KLSAqKkV2ZXJ5IGxpc3RlbmluZyBUQ1AgcG9ydCBtdXN0IGJlIGRlY2xhcmVkLioqIGBtdXNjYXQtcGsgZGV2YCBhbmQKICBgbXVzY2F0LXBrIGRldjpiYWNrYCB3YXRjaCB0aGUgYmFja2VuZCBhbmQgc3RvcCBpdCB0aGUgbW9tZW50IGl0IG9wZW5zIGEgcG9ydAogIHRoYXQgaXMgbm90IGluIGBwb3J0c2AuIEEgcG9ydCBvdXRzaWRlIGAyODYwMC0yODk5OWAgY2FuJ3QgYmUgZGVjbGFyZWQsIHNvIGl0CiAgbXVzdCBub3QgYmUgb3BlbmVkIGVpdGhlciDigJQgcGlja2luZyBlLmcuIGA1NTAwYCBpcyBub3QgYSB3YXkgYXJvdW5kIHRoZSBydWxlLgogIEl0IHdvdWxkIGVzY2FwZSB0aGlzIGNoZWNrICphbmQqIHRoZSByb2JvdCdzIGluc3RhbGwtdGltZSBjb25mbGljdCBjaGVjaywgYW5kCiAgb25seSBjb2xsaWRlIG9uY2UgaXQncyBydW5uaW5nIG9uIGEgcm9ib3QuCi0gUmVzZXJ2ZWQgcG9ydHMgaW5jbHVkZSBgNTAyYCwgYDIyMjJgLCBgNDg0MGAsIGA1MTcwLTUxNzlgLCBgODAwMC04OTk5YCwKICBgMTAwMDBgLCBgMzAwMDRgLCBgMzQ5NjRgLCBgNDQ4MThgLCBgNTAwMDAtNTAwMDVgLCBhbmQgYDUwMDUxYC4KLSBUaGUgcm9ib3QgcmVqZWN0cyBpbnN0YWxsYXRpb24gKEhUVFAgNDA5KSBpZiBhIGRlY2xhcmVkIHBvcnQgaXMgcmVzZXJ2ZWQsCiAgb3V0IG9mIHJhbmdlLCBvciBhbHJlYWR5IGNsYWltZWQgYnkgYW5vdGhlciBlbmFibGVkIHBsdWdpbi4KCioqUmVhY2hpbmcgeW91ciBiYWNrZW5kJ3MgcG9ydHMgZHVyaW5nIGRldmVsb3BtZW50OioqCi0gRGVjbGFyZWQgcG9ydHMgYXJlIHB1Ymxpc2hlZCB0byBgMTI3LjAuMC4xYCBvbiB5b3VyIG1hY2hpbmUsIHNvCiAgYGN1cmwgaHR0cDovLzEyNy4wLjAuMToyODYwMGAgd29ya3MgZnJvbSB0aGUgaG9zdCBvbiBtYWNPUywgV2luZG93cywgYW5kIExpbnV4LgotIE9uIG5hdGl2ZSBMaW51eCB0aGUgZGV2IGNvbnRhaW5lciB1c2VzIGhvc3QgbmV0d29ya2luZywgc28gdGhlIHBvcnRzIGFyZSBvbgogIHRoZSBob3N0IGFscmVhZHkuCi0gSWYgYSBkZWNsYXJlZCBwb3J0IGlzIGFscmVhZHkgdGFrZW4gb24geW91ciBtYWNoaW5lLCBgbXVzY2F0LXBrIGRldmAgd2FybnMgYW5kCiAgc2tpcHMgcHVibGlzaGluZyB0aGF0IG9uZSDigJQgdGhlIGJhY2tlbmQgc3RpbGwgbGlzdGVucyBpbnNpZGUgdGhlIGNvbnRhaW5lci4KCi0tLQoKIyMgTG9jYWxpemVkIGRvY3VtZW50YXRpb24KCllvdSBjYW4gc2hpcCBwZXItbGFuZ3VhZ2UgUkVBRE1FIGZpbGVzIGFsb25nc2lkZSB0aGUgbWFpbiBgUkVBRE1FLm1kYC4gUGxhY2UgdGhlbSBpbiB0aGUgcHJvamVjdCByb290OgoKYGBgClJFQURNRS5tZCAgICAgICAgIyBkZWZhdWx0IC8gRW5nbGlzaCBmYWxsYmFjawpSRUFETUUua28ubWQgICAgICMgS29yZWFuClJFQURNRS5lbi5tZCAgICAgIyBleHBsaWNpdCBFbmdsaXNoIChvcHRpb25hbCkKUkVBRE1FLmphLm1kICAgICAjIEphcGFuZXNlCmBgYAoKQWxsIGBSRUFETUUqLm1kYCBmaWxlcyBmb3VuZCBhdCB0aGUgcHJvamVjdCByb290IGFyZSBhdXRvbWF0aWNhbGx5IGNvcGllZCB0byBgZGlzdC9gIG9uCmBtdXNjYXQtcGsgYnVpbGRgLiBNdXNjYXQgZGlzcGxheXMgdGhlIGZpbGUgbWF0Y2hpbmcgdGhlIHVzZXIncyBsb2NhbGUsCmZhbGxpbmcgYmFjayB0byBgUkVBRE1FLm1kYCBpZiBub25lIG1hdGNoZXMuCgotLS0KCiMjIEMrKyBTREsgJiBkZXBlbmRlbmNpZXMKClRoZSBkZXYgY29udGFpbmVyIGhhcyB0aGUgQysrIFNESyAoYHJhaW5ib3ctcmItc2RrLWRldmApIHByZS1pbnN0YWxsZWQg4oCUIG5vIGxvY2FsCmluc3RhbGwgbmVlZGVkLiBQaWNrIGEgZGlmZmVyZW50IFNESyB2ZXJzaW9uIHdpdGg6CgpgYGBiYXNoCk1VU0NBVF9QS19SQl9TREtfVkVSU0lPTj08dmVyc2lvbj4gTVVTQ0FUX1BLX1JFQlVJTERfSU1BR0U9MSBtdXNjYXQtcGsgZGV2CmBgYAoKYG11c2NhdC1wayBidWlsZGAgY29waWVzIHRoZSBtYXRjaGluZyBgbGlicmJfc2RrLnNvYCBuZXh0IHRvIHlvdXIgYmluYXJ5CihgZGlzdC88YXJjaD4vbGliL2AsIG9yIGBpbnN0YWxsLTxhcmNoPi88cGtnPi9saWIvYCBmb3IgcmNsY3BwKSwgc28gdGhlIHJvYm90IG5lZWRzIG5vIFNESwppbnN0YWxsIGFuZCBlYWNoIHBsdWdpbiBrZWVwcyB0aGUgU0RLIHZlcnNpb24gaXQgd2FzIGJ1aWx0IHdpdGguCgpPdGhlciBsaWJyYXJpZXM6IGluc3RhbGwgdGhlbSBpbiB0aGUgYnVpbGQgKGUuZy4gdmVuZG9yIHRoZW0gdW5kZXIgYGNwcC9gIGFuZApgYWRkX3N1YmRpcmVjdG9yeWAsIG9yIGxpbmsgc3RhdGljYWxseSkg4oCUIHRoZSByb2JvdCBvbmx5IGhhcyBVYnVudHUgMjQuMDQgYmFzZQpsaWJyYXJpZXMuCgpUbyB1c2UgdGhlIFNESyBvdXRzaWRlIGEgcGx1Z2luICh5b3VyIG93biBVYnVudHUgMjQuMDQgbWFjaGluZSk6CgpgYGBiYXNoCmN1cmwgLWZzU0wgaHR0cHM6Ly9yYWluYm93cm9ib3RpY3MuZ2l0aHViLmlvL3JiLXNkay9yYi1zZGstYXB0LXJlcG8uZ3BnLmtleSB8IHN1ZG8gZ3BnIC0tZGVhcm1vciAtbyAvdXNyL3NoYXJlL2tleXJpbmdzL3JiLXNkay1hcHQuZ3BnCmVjaG8gJ2RlYiBbc2lnbmVkLWJ5PS91c3Ivc2hhcmUva2V5cmluZ3MvcmItc2RrLWFwdC5ncGddIGh0dHBzOi8vcmFpbmJvd3JvYm90aWNzLmdpdGh1Yi5pby9yYi1zZGsgc3RhYmxlIG1haW4nIHwgc3VkbyB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvcmItc2RrLmxpc3QKc3VkbyBhcHQgdXBkYXRlICYmIHN1ZG8gYXB0IGluc3RhbGwgcmFpbmJvdy1yYi1zZGstZGV2CmBgYAoKLS0tCgojIyBTd2l0Y2hpbmcgYmFja2VuZCB0eXBlCgpgYGBiYXNoCm11c2NhdC1wayB0eXBlIGNoYW5nZSAgICAgICAgICAgICAgICAgIyBpbnRlcmFjdGl2ZQptdXNjYXQtcGsgdHlwZSBjaGFuZ2UgLS10byBjcHAgICAgICAgICMg4oaSIEMrKwptdXNjYXQtcGsgdHlwZSBjaGFuZ2UgLS10byByb3MyICAgICAgICMg4oaSIFJPUzIgKHJjbHB5IC8gUHl0aG9uKQptdXNjYXQtcGsgdHlwZSBjaGFuZ2UgLS10byByb3MyLWNwcCAgICMg4oaSIFJPUzIgKHJjbGNwcCAvIEMrKykKbXVzY2F0LXBrIHR5cGUgY2hhbmdlIC0tdG8gcHl0aG9uICAgICAjIOKGkiBQeXRob24KYGBgCgo+IEV4aXN0aW5nIGJhY2tlbmQgZGlycyAoYHJvczJfd3MvYCwgYGNwcC9gKSBhcmUgbm90IGRlbGV0ZWQgd2hlbiBzd2l0Y2hpbmcgYXdheS4gUmVtb3ZlIHRoZW0gbWFudWFsbHkgaWYgbm8gbG9uZ2VyIG5lZWRlZC4KCi0tLQoKIyMgQUkgY29kaW5nIGFzc2lzdGFudHMgKE1DUCkKCklmIHlvdSBidWlsZCB5b3VyIHBsdWdpbiB3aXRoIGFuIEFJIGFzc2lzdGFudCAoQ2xhdWRlIENvZGUsIENvZGV4LCDigKYpLCBnaXZlIGl0Cmdyb3VuZGVkIGtub3dsZWRnZSBvZiB0aGUgTXVzY2F0IFVJIGNvbXBvbmVudHMsIGRlc2lnbiB0b2tlbnMsIGFuZCBTREsgaW5zdGVhZCBvZgpsZXR0aW5nIGl0IGd1ZXNzLiBgbXVzY2F0LXBrIG1jcGAgaXMgYW4gTUNQIHNlcnZlciBleHBvc2luZzoKCi0gYGxpc3RfY29tcG9uZW50c2AgLyBgZ2V0X2NvbXBvbmVudF9wcm9wc2AgLyBgZ2V0X2NvbXBvbmVudF9leGFtcGxlYCDigJQgZXZlcnkKICBgQHJhaW5ib3ctcm9ib3RpY3MvcGx1Z2luLXVpL3JlYWN0YCBjb21wb25lbnQgd2l0aCBpdHMgcmVhbCBwcm9wcyBhbmQgYSB3b3JraW5nCiAgU3Rvcnlib29rIGV4YW1wbGUuCi0gYGxpc3RfZGVzaWduX3Rva2Vuc2AgLyBgc2VhcmNoX2Rlc2lnbl90b2tlbnNgIOKAlCB0aGUgVGFpbHdpbmQgY2xhc3NlcyB0byB1c2UKICAoYGJnLWJnLSpgLCBgdGV4dC1mZy0qYCwgYHR5cG8tKmAsIOKApikgc28geW91ciBVSSBtYXRjaGVzIHRoZSBob3N0IHRoZW1lLgotIGBzZWFyY2hfcmJfc2RrYCDigJQgaG93IHRvIHVzZSBgdXNlUmIoKWAsIGByYi4qYCwgYHVzZVJiRm9ybURhdGFgL2B1c2VSYlNhdmVgLCBhbmQKICB0aGUgYmFja2VuZCBydW50aW1lcy4KLSBgbGlzdF9yYl9zZGtgIC8gYGdldF9yYl9zZGtfYXBpYCDigJQgdGhlIGluc3RhbGxlZCBgcmFpbmJvdy1yYi1zZGtgIChQeXRob24KICBiYWNrZW5kKSBjbGFzc2VzIGFuZCBzaWduYXR1cmVzOyB3aXRoIGBsYW5nOiAiY3BwImAsIHRoZSBDKysgU0RLIGhlYWRlcnMKICAoYHJhaW5ib3ctcmItc2RrLWRldmAsIHJlYWQgb3V0IG9mIHRoZSBgbXVzY2F0LXBrYCBjcHAgZGV2IGltYWdlIOKAlCBidWlsZCBpdAogIG9uY2Ugd2l0aCBgbXVzY2F0LXBrIGRldjpiYWNrYCkuCgoqKkJyb3dzZSB0aGUgY29tcG9uZW50cyBsaXZlKiogd2l0aCBgbXVzY2F0LXBrIHN0b3J5Ym9va2AuCgojIyMgUmVnaXN0ZXIgdGhlIHNlcnZlcgoKKipDbGF1ZGUgQ29kZSoqIOKAlCBhIGAubWNwLmpzb25gIGlzIGFscmVhZHkgc2NhZmZvbGRlZCBhdCB5b3VyIHBsdWdpbiByb290LCBzbwppdCB3b3JrcyBvdXQgb2YgdGhlIGJveDoKCmBgYGpzb24KewogICJtY3BTZXJ2ZXJzIjogewogICAgIm11c2NhdCI6IHsKICAgICAgImNvbW1hbmQiOiAibXVzY2F0LXBrIiwKICAgICAgImFyZ3MiOiBbIm1jcCJdCiAgICB9CiAgfQp9CmBgYAoKKipDb2RleCoqIOKAlCByZWdpc3RlciBvbmNlIHdpdGg6CgpgYGBiYXNoCm11c2NhdC1wayBtY3AgLS1pbnN0YWxsIGNvZGV4CmBgYAoKVGhpcyBhcHBlbmRzIHRoZSBzZXJ2ZXIgdG8gYH4vLmNvZGV4L2NvbmZpZy50b21sYCAoaWRlbXBvdGVudCDigJQgc2FmZSB0byBydW4KYWdhaW4pLiBFcXVpdmFsZW50IG1hbnVhbCBjb25maWc6CgpgYGB0b21sClttY3Bfc2VydmVycy5tdXNjYXRdCmNvbW1hbmQgPSAibXVzY2F0LXBrIgphcmdzID0gWyJtY3AiXQpgYGAKCkFueSBvdGhlciBNQ1AgY2xpZW50IHdvcmtzIHRvbyDigJQgaXQncyBhIHN0YW5kYXJkIHN0ZGlvIE1DUCBzZXJ2ZXIgc3RhcnRlZCB3aXRoCmBtdXNjYXQtcGsgbWNwYC4gSWYgYG11c2NhdC1wa2AgaXNuJ3Qgb24gdGhlIGNsaWVudCdzIFBBVEgsIHVzZSBpdHMgYWJzb2x1dGUgcGF0aAooYHdoaWNoIG11c2NhdC1wa2ApIGFzIGBjb21tYW5kYC4KCi0tLQoKIyMgU2hpcHBpbmcKCmBgYGJhc2gKbXVzY2F0LXBrIGJ1aWxkICAgICAgICAgICAgIyBidWlsZCArIFpJUAptdXNjYXQtcGsgYnVpbGQgLS1uby16aXAgICAjIGJ1aWxkIG9ubHksIG5vIFpJUApgYGAKCi0gQnVpbGRzIGB1aS9jb250ZW50LnRzeGAg4oaSIGBkaXN0L2NvbnRlbnQuanNgIChtaW5pZmllZCkKLSBDb21waWxlcyBgY3BwL2AgKFJlbGVhc2UpIGluIHRoZSBVYnVudHUgMjQuMDQgY29udGFpbmVyIHBlciBhcmNoIOKGkiBgZGlzdC88YXJjaD4vPGVudHJ5PmAgKyBgZGlzdC88YXJjaD4vbGliL2xpYnJiX3Nkay5zby4qYAotIFJPUzIgKHJjbGNwcCk6IHJ1bnMgYGNvbGNvbiBidWlsZGAgcGVyIGFyY2gg4oaSIGBkaXN0L3JvczJfd3MvaW5zdGFsbC08YXJjaD4vYAotIENvcGllcyBgYXNzZXRzL2AsIGBtYW5pZmVzdC5qc29uYCwgYW5kIGBSRUFETUUqLm1kYCBpbnRvIGBkaXN0L2AKLSBPdXRwdXQ6IGBfX1BMVUdJTl9ESVJfXy17dmVyc2lvbn0uemlwYAoKWklQIGxheW91dDoKCmBgYApfX1BMVUdJTl9ESVJfXy0xLjAuMC56aXAK4pSc4pSAIGRpc3QvCuKUgiAgIOKUnOKUgCBjb250ZW50LmpzICAgICAgICAjIGJ1aWx0IFVJCuKUgiAgIOKUnOKUgCBtYW5pZmVzdC5qc29uCuKUgiAgIOKUnOKUgCBhc3NldHMvCuKUgiAgIOKUnOKUgCBSRUFETUUubWQK4pSCICAg4pSc4pSAIFJFQURNRS5rby5tZCAgICAgICMgaWYgcHJlc2VudArilIIgICDilJzilIAgYW1kNjQvICAgICAgICAgICAgIyBjcHA6IDxlbnRyeT4gKyBsaWIvbGlicmJfc2RrLnNvLioK4pSCICAg4pSc4pSAIGFybTY0LwrilIIgICDilJTilIAgcm9zMl93cy8gICAgICAgICAgIyByY2xjcHA6IGluc3RhbGwtYW1kNjQvLCBpbnN0YWxsLWFybTY0LwpgYGAKCi0tLQoKIyMgQWxsIGNvbW1hbmRzCgpgYGBiYXNoCm11c2NhdC1wayBkZXYgICAgICAgICMgVUkgKyBiYWNrZW5kCm11c2NhdC1wayBkZXY6dWkgICAgICMgVUkgcHJldmlldyBvbmx5IChwcmV2aWV3LWhvc3QpCm11c2NhdC1wayBkZXY6YmFjayAgICMgYmFja2VuZCBvbmx5IChDKysgcmVidWlsZCArIHJlc3RhcnQgaW4gRG9ja2VyKQptdXNjYXQtcGsgYnVpbGQgICAgICAjIGJ1aWxkIOKGkiBkaXN0LyArIGRpc3RyaWJ1dGFibGUgWklQICgtLW5vLXppcCB0byBza2lwKQptdXNjYXQtcGsgc3Rvcnlib29rICAjIGJyb3dzZSB0aGUgcmItY29tcG9uZW50cyBVSSBsaWJyYXJ5IGluIGEgYnJvd3NlcgptdXNjYXQtcGsgbWNwICAgICAgICAjIE1DUCBzZXJ2ZXIgZm9yIEFJIGFzc2lzdGFudHMgKGNvbXBvbmVudHMvdG9rZW5zL1NESyBkb2NzKQpgYGAKCmBgYGJhc2gKbXVzY2F0LXBrIHR5cGUgY2hhbmdlICAgICMgc3dpdGNoIGJhY2tlbmQgdHlwZQptdXNjYXQtcGsgdXBkYXRlICAgICAgICAgIyB1cGRhdGUgbXVzY2F0LXBsdWdpbi1raXQgaXRzZWxmCm11c2NhdC1wayB1bmluc3RhbGwgICAgICAjIHJlbW92ZSBtdXNjYXQtcGsgaXRzZWxmCmBgYAo=","ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/__init__.py":"","ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py":"aW1wb3J0IHJjbHB5CmZyb20gcmNscHkubm9kZSBpbXBvcnQgTm9kZQpmcm9tIHJhaW5ib3cucmJfc2RrIGltcG9ydCBSQk1hbmlwdWxhdGVTREsgICMgUHlQSTogcmFpbmJvdy1yYi1zZGsKCgpzZGsgPSBSQk1hbmlwdWxhdGVTREsoKQoKCmNsYXNzIF9fUExVR0lOX0NMQVNTX19Ob2RlKE5vZGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oIl9fUExVR0lOX1NMVUdfX19ub2RlIikKICAgICAgICBzZWxmLmdldF9sb2dnZXIoKS5pbmZvKCJfX1BMVUdJTl9OQU1FX18gbm9kZSBzdGFydGVkIikKICAgICAgICAjIHNkayBpcyBhdmFpbGFibGUgaGVyZSDigJQgdXNlIGl0IGFsb25nc2lkZSBST1MyIHRvcGljcyBhcyBuZWVkZWQKCgpkZWYgbWFpbihhcmdzPU5vbmUpOgogICAgcmNscHkuaW5pdChhcmdzPWFyZ3MpCiAgICBub2RlID0gX19QTFVHSU5fQ0xBU1NfX05vZGUoKQogICAgcmNscHkuc3Bpbihub2RlKQogICAgbm9kZS5kZXN0cm95X25vZGUoKQogICAgcmNscHkuc2h1dGRvd24oKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK","ros2/ros2_ws/src/__PLUGIN_SLUG__/package.xml":"PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxwYWNrYWdlIGZvcm1hdD0iMyI+CiAgPG5hbWU+X19QTFVHSU5fU0xVR19fPC9uYW1lPgogIDx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgogIDxkZXNjcmlwdGlvbj5fX1BMVUdJTl9OQU1FX18gUk9TMiBub2RlPC9kZXNjcmlwdGlvbj4KICA8bWFpbnRhaW5lciBlbWFpbD0idG9kb0BleGFtcGxlLmNvbSI+bWFpbnRhaW5lcjwvbWFpbnRhaW5lcj4KICA8bGljZW5zZT5Qcm9wcmlldGFyeTwvbGljZW5zZT4KICA8ZGVwZW5kPnJjbHB5PC9kZXBlbmQ+CiAgPGV4cG9ydD48YnVpbGRfdHlwZT5hbWVudF9weXRob248L2J1aWxkX3R5cGU+PC9leHBvcnQ+CjwvcGFja2FnZT4K","ros2/ros2_ws/src/__PLUGIN_SLUG__/resource/__PLUGIN_SLUG__":"","ros2/ros2_ws/src/__PLUGIN_SLUG__/setup.py":"ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKcGFja2FnZV9uYW1lID0gIl9fUExVR0lOX1NMVUdfXyIKCnNldHVwKAogICAgbmFtZT1wYWNrYWdlX25hbWUsCiAgICB2ZXJzaW9uPSIwLjAuMSIsCiAgICBwYWNrYWdlcz1bcGFja2FnZV9uYW1lXSwKICAgIGRhdGFfZmlsZXM9WwogICAgICAgICgic2hhcmUvYW1lbnRfaW5kZXgvcmVzb3VyY2VfaW5kZXgvcGFja2FnZXMiLCBbInJlc291cmNlLyIgKyBwYWNrYWdlX25hbWVdKSwKICAgICAgICAoInNoYXJlLyIgKyBwYWNrYWdlX25hbWUsIFsicGFja2FnZS54bWwiXSksCiAgICBdLAogICAgaW5zdGFsbF9yZXF1aXJlcz1bInNldHVwdG9vbHMiXSwKICAgIHppcF9zYWZlPVRydWUsCiAgICBlbnRyeV9wb2ludHM9ewogICAgICAgICJjb25zb2xlX3NjcmlwdHMiOiBbIl9fUExVR0lOX1NMVUdfX19ub2RlID0gX19QTFVHSU5fU0xVR19fLm5vZGU6bWFpbiJdLAogICAgfSwKKQo=","ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt":"Y21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMTYpCnByb2plY3QoX19QTFVHSU5fU0xVR19fKQoKaWYoTk9UIENNQUtFX0NYWF9TVEFOREFSRCkKICBzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEIDE3KQplbmRpZigpCgpmaW5kX3BhY2thZ2UoYW1lbnRfY21ha2UgUkVRVUlSRUQpCmZpbmRfcGFja2FnZShyY2xjcHAgUkVRVUlSRUQpCiMgUmFpbmJvdyBSb2JvdGljcyBDKysgU0RLIChhcHQ6IHJhaW5ib3ctcmItc2RrLWRldiwgcHJlLWluc3RhbGxlZCBpbiB0aGUgZGV2CiMgY29udGFpbmVyKS4gRHluYW1pY2FsbHkgbGlua2VkIOKAlCBgbXVzY2F0LXBrIGJ1aWxkYCBzaGlwcyBsaWJyYl9zZGsuc28gaW4gaW5zdGFsbC17YXJjaH0vPHBrZz4vbGliLy4KZmluZF9wYWNrYWdlKHJiX3NkayBSRVFVSVJFRCkKCmFkZF9leGVjdXRhYmxlKF9fUExVR0lOX1NMVUdfX19ub2RlIHNyYy9ub2RlLmNwcCkKYW1lbnRfdGFyZ2V0X2RlcGVuZGVuY2llcyhfX1BMVUdJTl9TTFVHX19fbm9kZSByY2xjcHApCnRhcmdldF9saW5rX2xpYnJhcmllcyhfX1BMVUdJTl9TTFVHX19fbm9kZSByYl9zZGs6OnJiX3NkaykKCmluc3RhbGwoVEFSR0VUUyBfX1BMVUdJTl9TTFVHX19fbm9kZQogIERFU1RJTkFUSU9OIGxpYi8ke1BST0pFQ1RfTkFNRX0pCgphbWVudF9wYWNrYWdlKCkK","ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml":"PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxwYWNrYWdlIGZvcm1hdD0iMyI+CiAgPG5hbWU+X19QTFVHSU5fU0xVR19fPC9uYW1lPgogIDx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgogIDxkZXNjcmlwdGlvbj5fX1BMVUdJTl9OQU1FX18gUk9TMiBub2RlIChyY2xjcHApPC9kZXNjcmlwdGlvbj4KICA8bWFpbnRhaW5lciBlbWFpbD0idG9kb0BleGFtcGxlLmNvbSI+bWFpbnRhaW5lcjwvbWFpbnRhaW5lcj4KICA8bGljZW5zZT5Qcm9wcmlldGFyeTwvbGljZW5zZT4KICA8YnVpbGR0b29sX2RlcGVuZD5hbWVudF9jbWFrZTwvYnVpbGR0b29sX2RlcGVuZD4KICA8ZGVwZW5kPnJjbGNwcDwvZGVwZW5kPgogIDxleHBvcnQ+PGJ1aWxkX3R5cGU+YW1lbnRfY21ha2U8L2J1aWxkX3R5cGU+PC9leHBvcnQ+CjwvcGFja2FnZT4K","ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp":"Ly8gX19QTFVHSU5fTkFNRV9fIOKAlCBST1MyIG5vZGUgKHJjbGNwcCkuCi8vCi8vIFRoZSBub2RlIGlzIGxhdW5jaGVkIHdpdGggYC0tcm9zLWFyZ3MgLXIgX19uczo9L3tzbHVnfWAgYXV0b21hdGljYWxseSBieQovLyBkZXY6YmFjay4gUk9TMiB0b3BpY3MgYXJlIGJyaWRnZWQgdG8gdGhlIHBsdWdpbiBjb21tdW5pY2F0aW9uIGxheWVyLCBzbyBhCi8vIHBsYWluIHJjbGNwcCBub2RlIGlzIGFsbCB5b3UgbmVlZCDigJQgcmVsYXRpdmUgdG9waWMgbmFtZXMgZ2V0IHRoZSBuYW1lc3BhY2UKLy8gcHJlZml4IGFwcGxpZWQgYXV0b21hdGljYWxseS4KI2luY2x1ZGUgInJjbGNwcC9yY2xjcHAuaHBwIgovLyBSYWluYm93IFJvYm90aWNzIEMrKyBTREsgKGxpbmtlZCBhcyByYl9zZGs6OnJiX3Nkayk6IFJCTWFuaXB1bGF0ZVNESyBldGMuCiNpbmNsdWRlIDxyYWluYm93L3JiX3Nkay9tYW5pcHVsYXRlL3JiX21hbmlwdWxhdGVfc2RrLmhwcD4KCmNsYXNzIF9fUExVR0lOX0NMQVNTX19Ob2RlIDogcHVibGljIHJjbGNwcDo6Tm9kZSB7CnB1YmxpYzoKICBfX1BMVUdJTl9DTEFTU19fTm9kZSgpIDogTm9kZSgiX19QTFVHSU5fU0xVR19fX25vZGUiKSB7CiAgICBSQ0xDUFBfSU5GTyh0aGlzLT5nZXRfbG9nZ2VyKCksICJfX1BMVUdJTl9OQU1FX18gbm9kZSBzdGFydGVkIik7CiAgICAvLyBjcmVhdGUgcHVibGlzaGVycyAvIHN1YnNjcmliZXJzIC8gc2VydmljZXMgaGVyZQogIH0KfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogIHJjbGNwcDo6aW5pdChhcmdjLCBhcmd2KTsKICByY2xjcHA6OnNwaW4oc3RkOjptYWtlX3NoYXJlZDxfX1BMVUdJTl9DTEFTU19fTm9kZT4oKSk7CiAgcmNsY3BwOjpzaHV0ZG93bigpOwogIHJldHVybiAwOwp9Cg==","docker/Dockerfile.bridge":"IyBTb2NrZXQuSU8gYnJpZGdlIGNvbnRhaW5lciDigJQgdGhlIGZyb250ZW5kIChwcmV2aWV3LWhvc3QpIGFuZCB0aGUgYmFja2VuZAojIGNvbnRhaW5lciByZW5kZXp2b3VzIGhlcmUgZHVyaW5nIGBtdXNjYXQtcGsgZGV2YC4KIyAgIC0gZnJvbnRlbmQgKGhvc3QpICDihpIgcHVibGlzaGVkIHBvcnQgbG9jYWxob3N0OjEwMDAwCiMgICAtIGJhY2tlbmQgY29udGFpbmVyIOKGkiBzaGFyZXMgdGhpcyBjb250YWluZXIncyBuZXRucyAoLS1uZXR3b3JrIGNvbnRhaW5lcjopLAojICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGl0IHJlYWNoZXMgdGhlIGJyaWRnZSBhdCBsb2NhbGhvc3Q6MTAwMDAgdG9vCiMgQnVpbGQgY29udGV4dCBpcyB0aGUgYGNsaS9gIGRpciBzbyBpdCBjYW4gY29weSBzcmMvc29ja2V0QnJpZGdlLm1qcy4KRlJPTSBub2RlOjIwLXNsaW0KTEFCRUwgY29tLnJhaW5ib3ctcm9ib3RpY3MubXVzY2F0LXBrPSJ0cnVlIgoKV09SS0RJUiAvYnJpZGdlCkNPUFkgZG9ja2VyL2JyaWRnZS1wYWNrYWdlLmpzb24gcGFja2FnZS5qc29uClJVTiBucG0gaW5zdGFsbCAtLW9taXQ9ZGV2IC0tbm8tYXVkaXQgLS1uby1mdW5kCgpDT1BZIHNyYy9zb2NrZXRCcmlkZ2UubWpzIC4vc29ja2V0QnJpZGdlLm1qcwoKRVhQT1NFIDEwMDAwCkNNRCBbIm5vZGUiLCAic29ja2V0QnJpZGdlLm1qcyJdCg==","docker/Dockerfile.cpp":"IyBEZXYvYnVpbGQgY29udGFpbmVyIGZvciB0aGUgcHVyZSBDKysgcGx1Z2luIGJhY2sgZW5kLgojIE1hdGNoZXMgdGhlIE11c2NhdCByb2JvdCBiYWNrZW5kIE9TIChVYnVudHUgMjQuMDQpIHNvIHRoZSBjb21waWxlZCBiaW5hcnkKIyBpcyBBQkktY29tcGF0aWJsZSB3aXRoIHRoZSByb2JvdC4gVXNlZCBieSBgbXVzY2F0LXBrIGRldjpiYWNrYCBhbmQgYGJ1aWxkYAojIOKAlCBOT1Qgc2hpcHBlZCBpbiB0aGUgcGx1Z2luIFpJUC4KRlJPTSB1YnVudHU6MjQuMDQKTEFCRUwgY29tLnJhaW5ib3ctcm9ib3RpY3MubXVzY2F0LXBrPSJ0cnVlIgoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCiAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCiAgICAgIGNtYWtlIFwKICAgICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgoKIyBSYWluYm93IFJvYm90aWNzIEMrKyBTREsgKHJhaW5ib3ctcmItc2RrLWRldik6IGhlYWRlcnMgKyBDTWFrZSBjb25maWcgZm9yCiMgZmluZF9wYWNrYWdlKHJiX3NkaykuIFRoZSBiaW5hcnkgbGlua3MgbGlicmJfc2RrLnNvLjx2ZXI+IGJ5IFNPTkFNRTsgdGhlIHJvYm90CiMgY29udGFpbmVyIGhhcyBubyBsaWJyYl9zZGsuc28sIHNvIGBtdXNjYXQtcGsgYnVpbGRgIHNoaXBzIGl0IGluIGRpc3QvPGFyY2g+L2xpYi8uCiMgT3ZlcnJpZGUgd2l0aCBNVVNDQVRfUEtfUkJfU0RLX1ZFUlNJT049PHZlcj4gKCsgTVVTQ0FUX1BLX1JFQlVJTERfSU1BR0U9MSkuCkFSRyBSQl9TREtfVkVSU0lPTj0wLjEuMwpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGNhLWNlcnRpZmljYXRlcyBjdXJsIFwKICAgICYmIGluc3RhbGwgLWQgL2V0Yy9hcHQva2V5cmluZ3MgXAogICAgJiYgY3VybCAtZnNTTCBodHRwczovL3JhaW5ib3dyb2JvdGljcy5naXRodWIuaW8vcmItc2RrL3JiLXNkay1hcHQtcmVwby5ncGcua2V5IC1vIC9ldGMvYXB0L2tleXJpbmdzL3JiLXNkay5hc2MgXAogICAgJiYgcHJpbnRmICdkZWIgW3NpZ25lZC1ieT0vZXRjL2FwdC9rZXlyaW5ncy9yYi1zZGsuYXNjXSBodHRwczovL3JhaW5ib3dyb2JvdGljcy5naXRodWIuaW8vcmItc2RrICVzIG1haW5cbicgc3RhYmxlIGRldiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL3JiLXNkay5saXN0IFwKICAgICYmIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyAicmFpbmJvdy1yYi1zZGstZGV2PSR7UkJfU0RLX1ZFUlNJT059IiBcCiAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCldPUktESVIgL3BsdWdpbgoKQ01EIFsiYmFzaCJdCg==","docker/Dockerfile.dev":"IyBEZXYtb25seSBjb250YWluZXIgZm9yIHRoZSBST1MyIHBsdWdpbiBiYWNrIGVuZC4KIyBNYXRjaGVzIHRoZSBNdXNjYXQgcm9ib3QgYmFja2VuZDogUk9TMiBKYXp6eSArIFB5dGhvbiAzLjEyIChVYnVudHUgMjQuMDQpLgojIFVzZWQgYnkgYG11c2NhdC1wayBkZXY6YmFja2Ag4oCUIE5PVCBzaGlwcGVkIGluIHRoZSBwbHVnaW4gWklQLgpGUk9NIHJvczpqYXp6eS1yb3MtYmFzZQpMQUJFTCBjb20ucmFpbmJvdy1yb2JvdGljcy5tdXNjYXQtcGs9InRydWUiCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKICAgICAgcHl0aG9uMy1waXAgXAogICAgICBweXRob24zLWNvbGNvbi1jb21tb24tZXh0ZW5zaW9ucyBcCiAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCiMgUmFpbmJvdyBSb2JvdGljcyBDKysgU0RLIChyYWluYm93LXJiLXNkay1kZXYpOiBoZWFkZXJzICsgQ01ha2UgY29uZmlnIGZvcgojIGZpbmRfcGFja2FnZShyYl9zZGspLiBUaGUgYmluYXJ5IGxpbmtzIGxpYnJiX3Nkay5zby48dmVyPiBieSBTT05BTUU7IHRoZSByb2JvdAojIGNvbnRhaW5lciBoYXMgbm8gbGlicmJfc2RrLnNvLCBzbyBgbXVzY2F0LXBrIGJ1aWxkYCBzaGlwcyBpdCBpbiBkaXN0LzxhcmNoPi9saWIvLgojIE92ZXJyaWRlIHdpdGggTVVTQ0FUX1BLX1JCX1NES19WRVJTSU9OPTx2ZXI+ICgrIE1VU0NBVF9QS19SRUJVSUxEX0lNQUdFPTEpLgpBUkcgUkJfU0RLX1ZFUlNJT049MC4xLjMKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBjYS1jZXJ0aWZpY2F0ZXMgY3VybCBcCiAgICAmJiBpbnN0YWxsIC1kIC9ldGMvYXB0L2tleXJpbmdzIFwKICAgICYmIGN1cmwgLWZzU0wgaHR0cHM6Ly9yYWluYm93cm9ib3RpY3MuZ2l0aHViLmlvL3JiLXNkay9yYi1zZGstYXB0LXJlcG8uZ3BnLmtleSAtbyAvZXRjL2FwdC9rZXlyaW5ncy9yYi1zZGsuYXNjIFwKICAgICYmIHByaW50ZiAnZGViIFtzaWduZWQtYnk9L2V0Yy9hcHQva2V5cmluZ3MvcmItc2RrLmFzY10gaHR0cHM6Ly9yYWluYm93cm9ib3RpY3MuZ2l0aHViLmlvL3JiLXNkayAlcyBtYWluXG4nIHN0YWJsZSBkZXYgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9yYi1zZGsubGlzdCBcCiAgICAmJiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgInJhaW5ib3ctcmItc2RrLWRldj0ke1JCX1NES19WRVJTSU9OfSIgXAogICAgJiYgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qCgpXT1JLRElSIC9wbHVnaW4KCkNNRCBbImJhc2giXQo=","docker/Dockerfile.python":"IyBEZXYvYnVpbGQgY29udGFpbmVyIGZvciB0aGUgUHl0aG9uIHBsdWdpbiBiYWNrIGVuZC4KIyBNYXRjaGVzIHRoZSBNdXNjYXQgcm9ib3QgYmFja2VuZDogVWJ1bnR1IDI0LjA0ICsgUHl0aG9uIDMuMTIuCiMgVXNlZCBieSBgbXVzY2F0LXBrIGRldjpiYWNrYCAoaG90LXJlbG9hZCkgYW5kIGBtdXNjYXQtcGsgYnVpbGRgIChsb2NrICsgd2hlZWwgdmVuZG9yKS4KIyBOT1Qgc2hpcHBlZCBpbiB0aGUgcGx1Z2luIFpJUCDigJQgdGhlIHJvYm90IGluc3RhbGxzIGRlcHMgZnJvbSBkaXN0L3doZWVscy8gb2ZmbGluZS4KRlJPTSB1YnVudHU6MjQuMDQKTEFCRUwgY29tLnJhaW5ib3ctcm9ib3RpY3MubXVzY2F0LXBrPSJ0cnVlIgoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCiAgICAgIHB5dGhvbjMgXAogICAgICBweXRob24zLXBpcCBcCiAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogXAogICAgJiYgcGlwMyBpbnN0YWxsIHV2PT0wLjguMTggLS1icmVhay1zeXN0ZW0tcGFja2FnZXMKCiMgVE9ETyhjcHAtc2RrKTogdGhlIFB5dGhvbiBTREsgaXMgYSBweWJpbmQgd3JhcHBlciBvdmVyIHRoZSBjcHAgU0RLLCBzbyB0aGUKIyBjcHAgU0RLIHNoYXJlZCBsaWIgbXVzdCBiZSBwcmVzZW50IGZvciB0aGUgcHl0aG9uIG1vZHVsZSB0byBsb2FkLiBJbnN0YWxsIHRoZQojIHJhaW5ib3cgY3BwIFNESyAoYXB0LCBwaW5uZWQgdG8gdGhlIHJvYm90J3MgdmVyc2lvbikgaGVyZSBvbmNlIGl0IGV4aXN0cy4KCldPUktESVIgL3BsdWdpbgoKQ01EIFsiYmFzaCJdCg==","docker/bridge-package.json":"ewogICJuYW1lIjogIm11c2NhdC1way1icmlkZ2UiLAogICJwcml2YXRlIjogdHJ1ZSwKICAidHlwZSI6ICJtb2R1bGUiLAogICJkZXBlbmRlbmNpZXMiOiB7CiAgICAic29ja2V0LmlvIjogIl40LjguMSIKICB9Cn0K"};