/ commands / chrome / chrome.tsx
chrome.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import React, { useState } from 'react';
  3  import { type OptionWithDescription, Select } from '../../components/CustomSelect/select.js';
  4  import { Dialog } from '../../components/design-system/Dialog.js';
  5  import { Box, Text } from '../../ink.js';
  6  import { useAppState } from '../../state/AppState.js';
  7  import { isClaudeAISubscriber } from '../../utils/auth.js';
  8  import { openBrowser } from '../../utils/browser.js';
  9  import { CLAUDE_IN_CHROME_MCP_SERVER_NAME, openInChrome } from '../../utils/claudeInChrome/common.js';
 10  import { isChromeExtensionInstalled } from '../../utils/claudeInChrome/setup.js';
 11  import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
 12  import { env } from '../../utils/env.js';
 13  import { isRunningOnHomespace } from '../../utils/envUtils.js';
 14  const CHROME_EXTENSION_URL = 'https://claude.ai/chrome';
 15  const CHROME_PERMISSIONS_URL = 'https://clau.de/chrome/permissions';
 16  const CHROME_RECONNECT_URL = 'https://clau.de/chrome/reconnect';
 17  type MenuAction = 'install-extension' | 'reconnect' | 'manage-permissions' | 'toggle-default';
 18  type Props = {
 19    onDone: (result?: string) => void;
 20    isExtensionInstalled: boolean;
 21    configEnabled: boolean | undefined;
 22    isClaudeAISubscriber: boolean;
 23    isWSL: boolean;
 24  };
 25  function ClaudeInChromeMenu(t0) {
 26    const $ = _c(41);
 27    const {
 28      onDone,
 29      isExtensionInstalled: installed,
 30      configEnabled,
 31      isClaudeAISubscriber,
 32      isWSL
 33    } = t0;
 34    const mcpClients = useAppState(_temp);
 35    const [selectKey, setSelectKey] = useState(0);
 36    const [enabledByDefault, setEnabledByDefault] = useState(configEnabled ?? false);
 37    const [showInstallHint, setShowInstallHint] = useState(false);
 38    const [isExtensionInstalled, setIsExtensionInstalled] = useState(installed);
 39    let t1;
 40    if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
 41      t1 = false && isRunningOnHomespace();
 42      $[0] = t1;
 43    } else {
 44      t1 = $[0];
 45    }
 46    const isHomespace = t1;
 47    let t2;
 48    if ($[1] !== mcpClients) {
 49      t2 = mcpClients.find(_temp2);
 50      $[1] = mcpClients;
 51      $[2] = t2;
 52    } else {
 53      t2 = $[2];
 54    }
 55    const chromeClient = t2;
 56    const isConnected = chromeClient?.type === "connected";
 57    let t3;
 58    if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
 59      t3 = function openUrl(url) {
 60        if (isHomespace) {
 61          openBrowser(url);
 62        } else {
 63          openInChrome(url);
 64        }
 65      };
 66      $[3] = t3;
 67    } else {
 68      t3 = $[3];
 69    }
 70    const openUrl = t3;
 71    let t4;
 72    if ($[4] !== enabledByDefault) {
 73      t4 = function handleAction(action) {
 74        bb22: switch (action) {
 75          case "install-extension":
 76            {
 77              setSelectKey(_temp3);
 78              setShowInstallHint(true);
 79              openUrl(CHROME_EXTENSION_URL);
 80              break bb22;
 81            }
 82          case "reconnect":
 83            {
 84              setSelectKey(_temp4);
 85              isChromeExtensionInstalled().then(installed_0 => {
 86                setIsExtensionInstalled(installed_0);
 87                if (installed_0) {
 88                  setShowInstallHint(false);
 89                }
 90              });
 91              openUrl(CHROME_RECONNECT_URL);
 92              break bb22;
 93            }
 94          case "manage-permissions":
 95            {
 96              setSelectKey(_temp5);
 97              openUrl(CHROME_PERMISSIONS_URL);
 98              break bb22;
 99            }
100          case "toggle-default":
101            {
102              const newValue = !enabledByDefault;
103              saveGlobalConfig(current => ({
104                ...current,
105                claudeInChromeDefaultEnabled: newValue
106              }));
107              setEnabledByDefault(newValue);
108            }
109        }
110      };
111      $[4] = enabledByDefault;
112      $[5] = t4;
113    } else {
114      t4 = $[5];
115    }
116    const handleAction = t4;
117    let options;
118    if ($[6] !== enabledByDefault || $[7] !== isExtensionInstalled) {
119      options = [];
120      const requiresExtensionSuffix = isExtensionInstalled ? "" : " (requires extension)";
121      if (!isExtensionInstalled && !isHomespace) {
122        let t5;
123        if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
124          t5 = {
125            label: "Install Chrome extension",
126            value: "install-extension"
127          };
128          $[9] = t5;
129        } else {
130          t5 = $[9];
131        }
132        options.push(t5);
133      }
134      let t5;
135      if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
136        t5 = <Text>Manage permissions</Text>;
137        $[10] = t5;
138      } else {
139        t5 = $[10];
140      }
141      let t6;
142      if ($[11] !== requiresExtensionSuffix) {
143        t6 = {
144          label: <>{t5}<Text dimColor={true}>{requiresExtensionSuffix}</Text></>,
145          value: "manage-permissions"
146        };
147        $[11] = requiresExtensionSuffix;
148        $[12] = t6;
149      } else {
150        t6 = $[12];
151      }
152      let t7;
153      if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
154        t7 = <Text>Reconnect extension</Text>;
155        $[13] = t7;
156      } else {
157        t7 = $[13];
158      }
159      let t8;
160      if ($[14] !== requiresExtensionSuffix) {
161        t8 = {
162          label: <>{t7}<Text dimColor={true}>{requiresExtensionSuffix}</Text></>,
163          value: "reconnect"
164        };
165        $[14] = requiresExtensionSuffix;
166        $[15] = t8;
167      } else {
168        t8 = $[15];
169      }
170      const t9 = `Enabled by default: ${enabledByDefault ? "Yes" : "No"}`;
171      let t10;
172      if ($[16] !== t9) {
173        t10 = {
174          label: t9,
175          value: "toggle-default"
176        };
177        $[16] = t9;
178        $[17] = t10;
179      } else {
180        t10 = $[17];
181      }
182      options.push(t6, t8, t10);
183      $[6] = enabledByDefault;
184      $[7] = isExtensionInstalled;
185      $[8] = options;
186    } else {
187      options = $[8];
188    }
189    const isDisabled = isWSL || true && !isClaudeAISubscriber;
190    let t5;
191    if ($[18] !== onDone) {
192      t5 = () => onDone();
193      $[18] = onDone;
194      $[19] = t5;
195    } else {
196      t5 = $[19];
197    }
198    let t6;
199    if ($[20] === Symbol.for("react.memo_cache_sentinel")) {
200      t6 = <Text>Claude in Chrome works with the Chrome extension to let you control your browser directly from Claude Code. Navigate websites, fill forms, capture screenshots, record GIFs, and debug with console logs and network requests.</Text>;
201      $[20] = t6;
202    } else {
203      t6 = $[20];
204    }
205    let t7;
206    if ($[21] !== isWSL) {
207      t7 = isWSL && <Text color="error">Claude in Chrome is not supported in WSL at this time.</Text>;
208      $[21] = isWSL;
209      $[22] = t7;
210    } else {
211      t7 = $[22];
212    }
213    let t8;
214    if ($[23] !== isClaudeAISubscriber) {
215      t8 = true && !isClaudeAISubscriber && <Text color="error">Claude in Chrome requires a claude.ai subscription.</Text>;
216      $[23] = isClaudeAISubscriber;
217      $[24] = t8;
218    } else {
219      t8 = $[24];
220    }
221    let t9;
222    if ($[25] !== handleAction || $[26] !== isConnected || $[27] !== isDisabled || $[28] !== isExtensionInstalled || $[29] !== options || $[30] !== selectKey || $[31] !== showInstallHint) {
223      t9 = !isDisabled && <>{!isHomespace && <Box flexDirection="column"><Text>Status:{" "}{isConnected ? <Text color="success">Enabled</Text> : <Text color="inactive">Disabled</Text>}</Text><Text>Extension:{" "}{isExtensionInstalled ? <Text color="success">Installed</Text> : <Text color="warning">Not detected</Text>}</Text></Box>}<Select key={selectKey} options={options} onChange={handleAction} hideIndexes={true} />{showInstallHint && <Text color="warning">Once installed, select {"\"Reconnect extension\""} to connect.</Text>}<Text><Text dimColor={true}>Usage: </Text><Text>claude --chrome</Text><Text dimColor={true}> or </Text><Text>claude --no-chrome</Text></Text><Text dimColor={true}>Site-level permissions are inherited from the Chrome extension. Manage permissions in the Chrome extension settings to control which sites Claude can browse, click, and type on.</Text></>;
224      $[25] = handleAction;
225      $[26] = isConnected;
226      $[27] = isDisabled;
227      $[28] = isExtensionInstalled;
228      $[29] = options;
229      $[30] = selectKey;
230      $[31] = showInstallHint;
231      $[32] = t9;
232    } else {
233      t9 = $[32];
234    }
235    let t10;
236    if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
237      t10 = <Text dimColor={true}>Learn more: https://code.claude.com/docs/en/chrome</Text>;
238      $[33] = t10;
239    } else {
240      t10 = $[33];
241    }
242    let t11;
243    if ($[34] !== t7 || $[35] !== t8 || $[36] !== t9) {
244      t11 = <Box flexDirection="column" gap={1}>{t6}{t7}{t8}{t9}{t10}</Box>;
245      $[34] = t7;
246      $[35] = t8;
247      $[36] = t9;
248      $[37] = t11;
249    } else {
250      t11 = $[37];
251    }
252    let t12;
253    if ($[38] !== t11 || $[39] !== t5) {
254      t12 = <Dialog title="Claude in Chrome (Beta)" onCancel={t5} color="chromeYellow">{t11}</Dialog>;
255      $[38] = t11;
256      $[39] = t5;
257      $[40] = t12;
258    } else {
259      t12 = $[40];
260    }
261    return t12;
262  }
263  function _temp5(k) {
264    return k + 1;
265  }
266  function _temp4(k_0) {
267    return k_0 + 1;
268  }
269  function _temp3(k_1) {
270    return k_1 + 1;
271  }
272  function _temp2(c) {
273    return c.name === CLAUDE_IN_CHROME_MCP_SERVER_NAME;
274  }
275  function _temp(s) {
276    return s.mcp.clients;
277  }
278  export const call = async function (onDone: (result?: string) => void): Promise<React.ReactNode> {
279    const isExtensionInstalled = await isChromeExtensionInstalled();
280    const config = getGlobalConfig();
281    const isSubscriber = isClaudeAISubscriber();
282    const isWSL = env.isWslEnvironment();
283    return <ClaudeInChromeMenu onDone={onDone} isExtensionInstalled={isExtensionInstalled} configEnabled={config.claudeInChromeDefaultEnabled} isClaudeAISubscriber={isSubscriber} isWSL={isWSL} />;
284  };
285  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiT3B0aW9uV2l0aERlc2NyaXB0aW9uIiwiU2VsZWN0IiwiRGlhbG9nIiwiQm94IiwiVGV4dCIsInVzZUFwcFN0YXRlIiwiaXNDbGF1ZGVBSVN1YnNjcmliZXIiLCJvcGVuQnJvd3NlciIsIkNMQVVERV9JTl9DSFJPTUVfTUNQX1NFUlZFUl9OQU1FIiwib3BlbkluQ2hyb21lIiwiaXNDaHJvbWVFeHRlbnNpb25JbnN0YWxsZWQiLCJnZXRHbG9iYWxDb25maWciLCJzYXZlR2xvYmFsQ29uZmlnIiwiZW52IiwiaXNSdW5uaW5nT25Ib21lc3BhY2UiLCJDSFJPTUVfRVhURU5TSU9OX1VSTCIsIkNIUk9NRV9QRVJNSVNTSU9OU19VUkwiLCJDSFJPTUVfUkVDT05ORUNUX1VSTCIsIk1lbnVBY3Rpb24iLCJQcm9wcyIsIm9uRG9uZSIsInJlc3VsdCIsImlzRXh0ZW5zaW9uSW5zdGFsbGVkIiwiY29uZmlnRW5hYmxlZCIsImlzV1NMIiwiQ2xhdWRlSW5DaHJvbWVNZW51IiwidDAiLCIkIiwiX2MiLCJpbnN0YWxsZWQiLCJtY3BDbGllbnRzIiwiX3RlbXAiLCJzZWxlY3RLZXkiLCJzZXRTZWxlY3RLZXkiLCJlbmFibGVkQnlEZWZhdWx0Iiwic2V0RW5hYmxlZEJ5RGVmYXVsdCIsInNob3dJbnN0YWxsSGludCIsInNldFNob3dJbnN0YWxsSGludCIsInNldElzRXh0ZW5zaW9uSW5zdGFsbGVkIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJpc0hvbWVzcGFjZSIsInQyIiwiZmluZCIsIl90ZW1wMiIsImNocm9tZUNsaWVudCIsImlzQ29ubmVjdGVkIiwidHlwZSIsInQzIiwib3BlblVybCIsInVybCIsInQ0IiwiaGFuZGxlQWN0aW9uIiwiYWN0aW9uIiwiYmIyMiIsIl90ZW1wMyIsIl90ZW1wNCIsInRoZW4iLCJpbnN0YWxsZWRfMCIsIl90ZW1wNSIsIm5ld1ZhbHVlIiwiY3VycmVudCIsImNsYXVkZUluQ2hyb21lRGVmYXVsdEVuYWJsZWQiLCJvcHRpb25zIiwicmVxdWlyZXNFeHRlbnNpb25TdWZmaXgiLCJ0NSIsImxhYmVsIiwidmFsdWUiLCJwdXNoIiwidDYiLCJ0NyIsInQ4IiwidDkiLCJ0MTAiLCJpc0Rpc2FibGVkIiwidDExIiwidDEyIiwiayIsImtfMCIsImtfMSIsImMiLCJuYW1lIiwicyIsIm1jcCIsImNsaWVudHMiLCJjYWxsIiwiUHJvbWlzZSIsIlJlYWN0Tm9kZSIsImNvbmZpZyIsImlzU3Vic2NyaWJlciIsImlzV3NsRW52aXJvbm1lbnQiXSwic291cmNlcyI6WyJjaHJvbWUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtcbiAgdHlwZSBPcHRpb25XaXRoRGVzY3JpcHRpb24sXG4gIFNlbGVjdCxcbn0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DdXN0b21TZWxlY3Qvc2VsZWN0LmpzJ1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9kZXNpZ24tc3lzdGVtL0RpYWxvZy5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgeyBpc0NsYXVkZUFJU3Vic2NyaWJlciB9IGZyb20gJy4uLy4uL3V0aWxzL2F1dGguanMnXG5pbXBvcnQgeyBvcGVuQnJvd3NlciB9IGZyb20gJy4uLy4uL3V0aWxzL2Jyb3dzZXIuanMnXG5pbXBvcnQge1xuICBDTEFVREVfSU5fQ0hST01FX01DUF9TRVJWRVJfTkFNRSxcbiAgb3BlbkluQ2hyb21lLFxufSBmcm9tICcuLi8uLi91dGlscy9jbGF1ZGVJbkNocm9tZS9jb21tb24uanMnXG5pbXBvcnQgeyBpc0Nocm9tZUV4dGVuc2lvbkluc3RhbGxlZCB9IGZyb20gJy4uLy4uL3V0aWxzL2NsYXVkZUluQ2hyb21lL3NldHVwLmpzJ1xuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnLCBzYXZlR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZmlnLmpzJ1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW52LmpzJ1xuaW1wb3J0IHsgaXNSdW5uaW5nT25Ib21lc3BhY2UgfSBmcm9tICcuLi8uLi91dGlscy9lbnZVdGlscy5qcydcblxuY29uc3QgQ0hST01FX0VYVEVOU0lPTl9VUkwgPSAnaHR0cHM6Ly9jbGF1ZGUuYWkvY2hyb21lJ1xuY29uc3QgQ0hST01FX1BFUk1JU1NJT05TX1VSTCA9ICdodHRwczovL2NsYXUuZGUvY2hyb21lL3Blcm1pc3Npb25zJ1xuY29uc3QgQ0hST01FX1JFQ09OTkVDVF9VUkwgPSAnaHR0cHM6Ly9jbGF1LmRlL2Nocm9tZS9yZWNvbm5lY3QnXG5cbnR5cGUgTWVudUFjdGlvbiA9XG4gIHwgJ2luc3RhbGwtZXh0ZW5zaW9uJ1xuICB8ICdyZWNvbm5lY3QnXG4gIHwgJ21hbmFnZS1wZXJtaXNzaW9ucydcbiAgfCAndG9nZ2xlLWRlZmF1bHQnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIG9uRG9uZTogKHJlc3VsdD86IHN0cmluZykgPT4gdm9pZFxuICBpc0V4dGVuc2lvbkluc3RhbGxlZDogYm9vbGVhblxuICBjb25maWdFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIGlzQ2xhdWRlQUlTdWJzY3JpYmVyOiBib29sZWFuXG4gIGlzV1NMOiBib29sZWFuXG59XG5cbmZ1bmN0aW9uIENsYXVkZUluQ2hyb21lTWVudSh7XG4gIG9uRG9uZSxcbiAgaXNFeHRlbnNpb25JbnN0YWxsZWQ6IGluc3RhbGxlZCxcbiAgY29uZmlnRW5hYmxlZCxcbiAgaXNDbGF1ZGVBSVN1YnNjcmliZXIsXG4gIGlzV1NMLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBtY3BDbGllbnRzID0gdXNlQXBwU3RhdGUocyA9PiBzLm1jcC5jbGllbnRzKVxuICBjb25zdCBbc2VsZWN0S2V5LCBzZXRTZWxlY3RLZXldID0gdXNlU3RhdGUoMClcbiAgY29uc3QgW2VuYWJsZWRCeURlZmF1bHQsIHNldEVuYWJsZWRCeURlZmF1bHRdID0gdXNlU3RhdGUoXG4gICAgY29uZmlnRW5hYmxlZCA/PyBmYWxzZSxcbiAgKVxuICBjb25zdCBbc2hvd0luc3RhbGxIaW50LCBzZXRTaG93SW5zdGFsbEhpbnRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc0V4dGVuc2lvbkluc3RhbGxlZCwgc2V0SXNFeHRlbnNpb25JbnN0YWxsZWRdID0gdXNlU3RhdGUoaW5zdGFsbGVkKVxuXG4gIGNvbnN0IGlzSG9tZXNwYWNlID0gXCJleHRlcm5hbFwiID09PSAnYW50JyAmJiBpc1J1bm5pbmdPbkhvbWVzcGFjZSgpXG5cbiAgY29uc3QgY2hyb21lQ2xpZW50ID0gbWNwQ2xpZW50cy5maW5kKFxuICAgIGMgPT4gYy5uYW1lID09PSBDTEFVREVfSU5fQ0hST01FX01DUF9TRVJWRVJfTkFNRSxcbiAgKVxuICBjb25zdCBpc0Nvbm5lY3RlZCA9IGNocm9tZUNsaWVudD8udHlwZSA9PT0gJ2Nvbm5lY3RlZCdcblxuICBmdW5jdGlvbiBvcGVuVXJsKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzSG9tZXNwYWNlKSB7XG4gICAgICB2b2lkIG9wZW5Ccm93c2VyKHVybClcbiAgICB9IGVsc2Uge1xuICAgICAgdm9pZCBvcGVuSW5DaHJvbWUodXJsKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUFjdGlvbihhY3Rpb246IE1lbnVBY3Rpb24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgY2FzZSAnaW5zdGFsbC1leHRlbnNpb24nOlxuICAgICAgICBzZXRTZWxlY3RLZXkoayA9PiBrICsgMSlcbiAgICAgICAgc2V0U2hvd0luc3RhbGxIaW50KHRydWUpXG4gICAgICAgIG9wZW5VcmwoQ0hST01FX0VYVEVOU0lPTl9VUkwpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyZWNvbm5lY3QnOlxuICAgICAgICBzZXRTZWxlY3RLZXkoayA9PiBrICsgMSlcbiAgICAgICAgdm9pZCBpc0Nocm9tZUV4dGVuc2lvbkluc3RhbGxlZCgpLnRoZW4oaW5zdGFsbGVkID0+IHtcbiAgICAgICAgICBzZXRJc0V4dGVuc2lvbkluc3RhbGxlZChpbnN0YWxsZWQpXG4gICAgICAgICAgaWYgKGluc3RhbGxlZCkge1xuICAgICAgICAgICAgc2V0U2hvd0luc3RhbGxIaW50KGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgb3BlblVybChDSFJPTUVfUkVDT05ORUNUX1VSTClcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21hbmFnZS1wZXJtaXNzaW9ucyc6XG4gICAgICAgIHNldFNlbGVjdEtleShrID0+IGsgKyAxKVxuICAgICAgICBvcGVuVXJsKENIUk9NRV9QRVJNSVNTSU9OU19VUkwpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICd0b2dnbGUtZGVmYXVsdCc6IHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAhZW5hYmxlZEJ5RGVmYXVsdFxuICAgICAgICBzYXZlR2xvYmFsQ29uZmlnKGN1cnJlbnQgPT4gKHtcbiAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgIGNsYXVkZUluQ2hyb21lRGVmYXVsdEVuYWJsZWQ6IG5ld1ZhbHVlLFxuICAgICAgICB9KSlcbiAgICAgICAgc2V0RW5hYmxlZEJ5RGVmYXVsdChuZXdWYWx1ZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBPcHRpb25XaXRoRGVzY3JpcHRpb248TWVudUFjdGlvbj5bXSA9IFtdXG4gIGNvbnN0IHJlcXVpcmVzRXh0ZW5zaW9uU3VmZml4ID0gaXNFeHRlbnNpb25JbnN0YWxsZWRcbiAgICA/ICcnXG4gICAgOiAnIChyZXF1aXJlcyBleHRlbnNpb24pJ1xuXG4gIGlmICghaXNFeHRlbnNpb25JbnN0YWxsZWQgJiYgIWlzSG9tZXNwYWNlKSB7XG4gICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnSW5zdGFsbCBDaHJvbWUgZXh0ZW5zaW9uJyxcbiAgICAgIHZhbHVlOiAnaW5zdGFsbC1leHRlbnNpb24nLFxuICAgIH0pXG4gIH1cblxuICBvcHRpb25zLnB1c2goXG4gICAge1xuICAgICAgbGFiZWw6IChcbiAgICAgICAgPD5cbiAgICAgICAgICA8VGV4dD5NYW5hZ2UgcGVybWlzc2lvbnM8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+e3JlcXVpcmVzRXh0ZW5zaW9uU3VmZml4fTwvVGV4dD5cbiAgICAgICAgPC8+XG4gICAgICApLFxuICAgICAgdmFsdWU6ICdtYW5hZ2UtcGVybWlzc2lvbnMnLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IChcbiAgICAgICAgPD5cbiAgICAgICAgICA8VGV4dD5SZWNvbm5lY3QgZXh0ZW5zaW9uPC9UZXh0PlxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPntyZXF1aXJlc0V4dGVuc2lvblN1ZmZpeH08L1RleHQ+XG4gICAgICAgIDwvPlxuICAgICAgKSxcbiAgICAgIHZhbHVlOiAncmVjb25uZWN0JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBgRW5hYmxlZCBieSBkZWZhdWx0OiAke2VuYWJsZWRCeURlZmF1bHQgPyAnWWVzJyA6ICdObyd9YCxcbiAgICAgIHZhbHVlOiAndG9nZ2xlLWRlZmF1bHQnLFxuICAgIH0sXG4gIClcblxuICBjb25zdCBpc0Rpc2FibGVkID1cbiAgICBpc1dTTCB8fCAoXCJleHRlcm5hbFwiICE9PSAnYW50JyAmJiAhaXNDbGF1ZGVBSVN1YnNjcmliZXIpXG5cbiAgcmV0dXJuIChcbiAgICA8RGlhbG9nXG4gICAgICB0aXRsZT1cIkNsYXVkZSBpbiBDaHJvbWUgKEJldGEpXCJcbiAgICAgIG9uQ2FuY2VsPXsoKSA9PiBvbkRvbmUoKX1cbiAgICAgIGNvbG9yPVwiY2hyb21lWWVsbG93XCJcbiAgICA+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9PlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICBDbGF1ZGUgaW4gQ2hyb21lIHdvcmtzIHdpdGggdGhlIENocm9tZSBleHRlbnNpb24gdG8gbGV0IHlvdSBjb250cm9sXG4gICAgICAgICAgeW91ciBicm93c2VyIGRpcmVjdGx5IGZyb20gQ2xhdWRlIENvZGUuIE5hdmlnYXRlIHdlYnNpdGVzLCBmaWxsIGZvcm1zLFxuICAgICAgICAgIGNhcHR1cmUgc2NyZWVuc2hvdHMsIHJlY29yZCBHSUZzLCBhbmQgZGVidWcgd2l0aCBjb25zb2xlIGxvZ3MgYW5kXG4gICAgICAgICAgbmV0d29yayByZXF1ZXN0cy5cbiAgICAgICAgPC9UZXh0PlxuXG4gICAgICAgIHtpc1dTTCAmJiAoXG4gICAgICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPlxuICAgICAgICAgICAgQ2xhdWRlIGluIENocm9tZSBpcyBub3Qgc3VwcG9ydGVkIGluIFdTTCBhdCB0aGlzIHRpbWUuXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApfVxuXG5cbiAgICAgICAge1wiZXh0ZXJuYWxcIiAhPT0gJ2FudCcgJiYgIWlzQ2xhdWRlQUlTdWJzY3JpYmVyICYmIChcbiAgICAgICAgICA8VGV4dCBjb2xvcj1cImVycm9yXCI+XG4gICAgICAgICAgICBDbGF1ZGUgaW4gQ2hyb21lIHJlcXVpcmVzIGEgY2xhdWRlLmFpIHN1YnNjcmlwdGlvbi5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG5cbiAgICAgICAgeyFpc0Rpc2FibGVkICYmIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgeyFpc0hvbWVzcGFjZSAmJiAoXG4gICAgICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgICAgICAgU3RhdHVzOnsnICd9XG4gICAgICAgICAgICAgICAgICB7aXNDb25uZWN0ZWQgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwic3VjY2Vzc1wiPkVuYWJsZWQ8L1RleHQ+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cImluYWN0aXZlXCI+RGlzYWJsZWQ8L1RleHQ+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbjp7JyAnfVxuICAgICAgICAgICAgICAgICAge2lzRXh0ZW5zaW9uSW5zdGFsbGVkID8gKFxuICAgICAgICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cInN1Y2Nlc3NcIj5JbnN0YWxsZWQ8L1RleHQ+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cIndhcm5pbmdcIj5Ob3QgZGV0ZWN0ZWQ8L1RleHQ+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICBrZXk9e3NlbGVjdEtleX1cbiAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUFjdGlvbn1cbiAgICAgICAgICAgICAgaGlkZUluZGV4ZXNcbiAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgIHtzaG93SW5zdGFsbEhpbnQgJiYgKFxuICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cIndhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICBPbmNlIGluc3RhbGxlZCwgc2VsZWN0IHsnXCJSZWNvbm5lY3QgZXh0ZW5zaW9uXCInfSB0byBjb25uZWN0LlxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+VXNhZ2U6IDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHQ+Y2xhdWRlIC0tY2hyb21lPC9UZXh0PlxuICAgICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj4gb3IgPC9UZXh0PlxuICAgICAgICAgICAgICA8VGV4dD5jbGF1ZGUgLS1uby1jaHJvbWU8L1RleHQ+XG4gICAgICAgICAgICA8L1RleHQ+XG5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICBTaXRlLWxldmVsIHBlcm1pc3Npb25zIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgQ2hyb21lIGV4dGVuc2lvbi5cbiAgICAgICAgICAgICAgTWFuYWdlIHBlcm1pc3Npb25zIGluIHRoZSBDaHJvbWUgZXh0ZW5zaW9uIHNldHRpbmdzIHRvIGNvbnRyb2xcbiAgICAgICAgICAgICAgd2hpY2ggc2l0ZXMgQ2xhdWRlIGNhbiBicm93c2UsIGNsaWNrLCBhbmQgdHlwZSBvbi5cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgICAgPFRleHQgZGltQ29sb3I+TGVhcm4gbW9yZTogaHR0cHM6Ly9jb2RlLmNsYXVkZS5jb20vZG9jcy9lbi9jaHJvbWU8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICA8L0RpYWxvZz5cbiAgKVxufVxuXG5leHBvcnQgY29uc3QgY2FsbCA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgb25Eb25lOiAocmVzdWx0Pzogc3RyaW5nKSA9PiB2b2lkLFxuKTogUHJvbWlzZTxSZWFjdC5SZWFjdE5vZGU+IHtcbiAgY29uc3QgaXNFeHRlbnNpb25JbnN0YWxsZWQgPSBhd2FpdCBpc0Nocm9tZUV4dGVuc2lvbkluc3RhbGxlZCgpXG4gIGNvbnN0IGNvbmZpZyA9IGdldEdsb2JhbENvbmZpZygpXG4gIGNvbnN0IGlzU3Vic2NyaWJlciA9IGlzQ2xhdWRlQUlTdWJzY3JpYmVyKClcbiAgY29uc3QgaXNXU0wgPSBlbnYuaXNXc2xFbnZpcm9ubWVudCgpXG5cbiAgcmV0dXJuIChcbiAgICA8Q2xhdWRlSW5DaHJvbWVNZW51XG4gICAgICBvbkRvbmU9e29uRG9uZX1cbiAgICAgIGlzRXh0ZW5zaW9uSW5zdGFsbGVkPXtpc0V4dGVuc2lvbkluc3RhbGxlZH1cbiAgICAgIGNvbmZpZ0VuYWJsZWQ9e2NvbmZpZy5jbGF1ZGVJbkNocm9tZURlZmF1bHRFbmFibGVkfVxuICAgICAgaXNDbGF1ZGVBSVN1YnNjcmliZXI9e2lzU3Vic2NyaWJlcn1cbiAgICAgIGlzV1NMPXtpc1dTTH1cbiAgICAvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQUlDLFFBQVEsUUFBUSxPQUFPO0FBQ3ZDLFNBQ0UsS0FBS0MscUJBQXFCLEVBQzFCQyxNQUFNLFFBQ0QseUNBQXlDO0FBQ2hELFNBQVNDLE1BQU0sUUFBUSwwQ0FBMEM7QUFDakUsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxXQUFXLFFBQVEseUJBQXlCO0FBQ3JELFNBQVNDLG9CQUFvQixRQUFRLHFCQUFxQjtBQUMxRCxTQUFTQyxXQUFXLFFBQVEsd0JBQXdCO0FBQ3BELFNBQ0VDLGdDQUFnQyxFQUNoQ0MsWUFBWSxRQUNQLHNDQUFzQztBQUM3QyxTQUFTQywwQkFBMEIsUUFBUSxxQ0FBcUM7QUFDaEYsU0FBU0MsZUFBZSxFQUFFQyxnQkFBZ0IsUUFBUSx1QkFBdUI7QUFDekUsU0FBU0MsR0FBRyxRQUFRLG9CQUFvQjtBQUN4QyxTQUFTQyxvQkFBb0IsUUFBUSx5QkFBeUI7QUFFOUQsTUFBTUMsb0JBQW9CLEdBQUcsMEJBQTBCO0FBQ3ZELE1BQU1DLHNCQUFzQixHQUFHLG9DQUFvQztBQUNuRSxNQUFNQyxvQkFBb0IsR0FBRyxrQ0FBa0M7QUFFL0QsS0FBS0MsVUFBVSxHQUNYLG1CQUFtQixHQUNuQixXQUFXLEdBQ1gsb0JBQW9CLEdBQ3BCLGdCQUFnQjtBQUVwQixLQUFLQyxLQUFLLEdBQUc7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