PageSourceSearch

https://captaineth.replit.app/src/components/game/GameControls.tsx

js captaineth.replit.app collected 2026-10-03 03:50:59 UTC 23,712 bytes, 233 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/components/game/GameControls.tsx");import __vite__cjsImport0_react_jsxDevRuntime from "/@fs/home/runner/workspace/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=50bf458b"; const Fragment = __vite__cjsImport0_react_jsxDevRuntime["Fragment"]; const jsxDEV = __vite__cjsImport0_react_jsxDevRuntime["jsxDEV"];
2import RefreshRuntime from "/@react-refresh";
3const inWebWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope;
4let prevRefreshReg;
5let prevRefreshSig;
6if (import.meta.hot && !inWebWorker) {
7  if (!window.__vite_plugin_react_preamble_installed__) {
8    throw new Error("@vitejs/plugin-react can't detect preamble. Something is wrong. See https://github.com/vitejs/vite-plugin-react/pull/11#discussion_r430879201");
9  }
10  prevRefreshReg = window.$RefreshReg$;
11  prevRefreshSig = window.$RefreshSig$;
12  window.$RefreshReg$ = (type, id) => {
13    RefreshRuntime.register(type, "/home/runner/workspace/client/src/components/game/GameControls.tsx " + id);
14  };
15  window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
16}
17var _s = $RefreshSig$();
18import __vite__cjsImport3_react from "/@fs/home/runner/workspace/node_modules/.vite/deps/react.js?v=50bf458b"; const useEffect = __vite__cjsImport3_react["useEffect"]; const useState = __vite__cjsImport3_react["useState"];
19import { useKeyboardControls } from "/@fs/home/runner/workspace/node_modules/.vite/deps/@react-three_drei.js?v=50bf458b";
20import { useRunner } from "/src/lib/stores/useRunner.tsx";
21export function GameControls() {
22  _s();
23  const { jump, moveLeft, moveRight, gamePhase } = useRunner();
24  const [showMobileControls, setShowMobileControls] = useState(false);
25  const jumpPressed = useKeyboardControls((state) => state.jump);
26  const leftPressed = useKeyboardControls((state) => state.left);
27  const rightPressed = useKeyboardControls((state) => state.right);
28  useEffect(() => {
29    const checkIfMobile = () => {
30      const isTouchDevice = "ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
31      const isMobileSize = window.innerWidth <= 1024;
32      console.log("Touch device check:", {
33        isTouchDevice,
34        isMobileSize,
35        width: window.innerWidth,
36        userAgent: navigator.userAgent
37      });
38      setShowMobileControls(isTouchDevice || isMobileSize);
39    };
40    checkIfMobile();
41    window.addEventListener("resize", checkIfMobile);
42    setShowMobileControls(true);
43    return () => {
44      window.removeEventListener("resize", checkIfMobile);
45    };
46  }, []);
47  useEffect(() => {
48    if (jumpPressed && gamePhase === "playing") {
49      jump();
50    }
51  }, [jumpPressed, jump, gamePhase]);
52  useEffect(() => {
53    if (leftPressed && gamePhase === "playing") {
54      moveLeft();
55      console.log("Left key pressed - moving left");
56    }
57  }, [leftPressed, moveLeft, gamePhase]);
58  useEffect(() => {
59    if (rightPressed && gamePhase === "playing") {
60      moveRight();
61      console.log("Right key pressed - moving right");
62    }
63  }, [rightPressed, moveRight, gamePhase]);
64  const handleJump = () => {
65    if (gamePhase === "ready") {
66      jump();
67      console.log("Game started from jump");
68      return;
69    }
70    if (gamePhase === "playing") {
71      jump();
72      console.log("Jump executed, game phase:", gamePhase);
73    }
74  };
75  const handleMoveLeft = () => {
76    if (gamePhase !== "playing") {
77      console.log("Cannot move left, game not playing. Phase:", gamePhase);
78      return;
79    }
80    moveLeft();
81    console.log("Move left executed, game phase:", gamePhase);
82  };
83  const handleMoveRight = () => {
84    if (gamePhase !== "playing") {
85      console.log("Cannot move right, game not playing. Phase:", gamePhase);
86      return;
87    }
88    moveRight();
89    console.log("Move right executed, game phase:", gamePhase);
90  };
91  const buttonStyle = {
92    width: "90px",
93    // Increased size
94    height: "90px",
95    // Increased size
96    borderRadius: "50%",
97    display: "flex",
98    justifyContent: "center",
99    alignItems: "center",
100    fontSize: "36px",
101    // Larger font size
102    fontWeight: "bold",
103    backgroundColor: "rgba(255, 255, 255, 0.5)",
104    // More opaque background
105    backdropFilter: "blur(10px)",
106    border: "3px solid rgba(255, 255, 255, 0.8)",
107    // More visible border
108    color: "white",
109    boxShadow: "0 6px 12px rgba(0, 0, 0, 0.4)",
110    // More pronounced shadow
111    userSelect: "none",
112    // Type assertion to fix the error
113    touchAction: "manipulation",
114    WebkitTapHighlightColor: "transparent"
115  };
116  return /* @__PURE__ */ jsxDEV(Fragment, { children: showMobileControls && /* @__P
116URE__ */ jsxDEV(Fragment, { children: gamePhase === "playing" && /* @__PURE__ */ jsxDEV("div", { className: "fixed bottom-10 inset-x-0 z-50 flex justify-between px-4 pointer-events-none", children: [
117    /* @__PURE__ */ jsxDEV("div", { className: "left-control pointer-events-auto", children: /* @__PURE__ */ jsxDEV(
118      "div",
119      {
120        style: buttonStyle,
121        className: "left-button",
122        onTouchStart: (e) => {
123          e.preventDefault();
124          handleMoveLeft();
125          console.log("Touch left button - moving LEFT");
126        },
127        onTouchEnd: (e) => e.preventDefault(),
128        onClick: handleMoveLeft,
129        children: "◀"
130      },
131      void 0,
132      false,
133      {
134        fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
135        lineNumber: 146,
136        columnNumber: 17
137      },
138      this
139    ) }, void 0, false, {
140      fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
141      lineNumber: 145,
142      columnNumber: 15
143    }, this),
144    /* @__PURE__ */ jsxDEV("div", { className: "middle-control pointer-events-auto", children: /* @__PURE__ */ jsxDEV(
145      "div",
146      {
147        style: buttonStyle,
148        className: "jump-button",
149        onTouchStart: (e) => {
150          e.preventDefault();
151          handleJump();
152          console.log("Touch jump button");
153        },
154        onTouchEnd: (e) => e.preventDefault(),
155        onClick: handleJump,
156        children: "▲"
157      },
158      void 0,
159      false,
160      {
161        fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
162        lineNumber: 162,
163        columnNumber: 17
164      },
165      this
166    ) }, void 0, false, {
167      fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
168      lineNumber: 161,
169      columnNumber: 15
170    }, this),
171    /* @__PURE__ */ jsxDEV("div", { className: "right-control pointer-events-auto", children: /* @__PURE__ */ jsxDEV(
172      "div",
173      {
174        style: buttonStyle,
175        className: "right-button",
176        onTouchStart: (e) => {
177          e.preventDefault();
178          handleMoveRight();
179          console.log("Touch right button - moving RIGHT");
180        },
181        onTouchEnd: (e) => e.preventDefault(),
182        onClick: handleMoveRight,
183        children: "▶"
184      },
185      void 0,
186      false,
187      {
188        fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
189        lineNumber: 178,
190        columnNumber: 17
191      },
192      this
193    ) }, void 0, false, {
194      fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
195      lineNumber: 177,
196      columnNumber: 15
197    }, this)
198  ] }, void 0, true, {
199    fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
200    lineNumber: 144,
201    columnNumber: 9
202  }, this) }, void 0, false, {
203    fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
204    lineNumber: 139,
205    columnNumber: 7
206  }, this) }, void 0, false, {
207    fileName: "/home/runner/workspace/client/src/components/game/GameControls.tsx",
208    lineNumber: 136,
209    columnNumber: 5
210  }, this);
211}
212_s(GameControls, "l6h6PGU4o3D5U6dQ/eowA2pvQ/c=", false, function() {
213  return [useRunner, useKeyboardControls, useKeyboardControls, useKeyboardControls];
214});
215_c = GameControls;
216var _c;
217$RefreshReg$(_c, "GameControls");
218if (import.meta.hot && !inWebWorker) {
219  window.$RefreshReg$ = prevRefreshReg;
220  window.$RefreshSig$ = prevRefreshSig;
221}
222if (import.meta.hot && !inWebWorker) {
223  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
224    RefreshRuntime.registerExportsForReactRefresh("/home/runner/workspace/client/src/components/game/GameControls.tsx", currentExports);
225    import.meta.hot.accept((nextExports) => {
226      if (!nextExports) return;
227      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/home/runner/workspace/client/src/components/game/GameControls.tsx", currentExports, nextExports);
228      if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
229    });
230  });
231}
232
233//# sourceMappingURL=data:application/json;base64,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tBQUFBO0FBQUEsSUFZQSxLQWJGO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FjQTtBQUFBLElBRUEsdUJBQUMsU0FBSSxXQUFVLHFDQUNiO0FBQUEsTUFBQztBQUFBO0FBQUEsUUFDQyxPQUFPRztBQUFBQSxRQUNQLFdBQVU7QUFBQSxRQUNWLGNBQWMsQ0FBQ2dCLE1BQU07QUFDbkJBLFlBQUVDLGVBQWU7QUFDakJsQiwwQkFBZ0I7QUFDaEJSLGtCQUFRQyxJQUFJLG1DQUFtQztBQUFBLFFBQ2pEO0FBQUEsUUFDQSxZQUFZLENBQUN3QixNQUFNQSxFQUFFQyxlQUFlO0FBQUEsUUFDcEMsU0FBU2xCO0FBQUFBLFFBQWlCO0FBQUE7QUFBQSxNQVQ1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFZQSxLQWJGO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FjQTtBQUFBLE9BL0NGO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FnREEsS0FyREo7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQXVEQSxLQTFESjtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBNERBO0FBRUo7QUFBQzlCLEdBaE1lRCxjQUFZO0FBQUEsVUFDdUJELFdBTTdCRCxxQkFDQUEscUJBQ0NBLG1CQUFtQjtBQUFBO0FBQUFvRCxLQVQxQmxEO0FBQVksSUFBQWtEO0FBQUFDLGFBQUFELElBQUEiLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUtleWJvYXJkQ29udHJvbHMiLCJ1c2VSdW5uZXIiLCJHYW1lQ29udHJvbHMiLCJfcyIsImp1bXAiLCJtb3ZlTGVmdCIsIm1vdmVSaWdodCIsImdhbWVQaGFzZSIsInNob3dNb2JpbGVDb250cm9scyIsInNldFNob3dNb2JpbGVDb250cm9scyIsImp1bXBQcmVzc2VkIiwic3RhdGUiLCJsZWZ0UHJlc3NlZCIsImxlZnQiLCJyaWdodFByZXNzZWQiLCJyaWdodCIsInVzZUVmZmVjdCIsImNoZWNrSWZNb2JpbGUiLCJpc1RvdWNoRGV2aWNlIiwid2luZG93IiwibmF2aWdhdG9yIiwibWF4VG91Y2hQb2ludHMiLCJtc01heFRvdWNoUG9pbnRzIiwiaXNNb2JpbGVTaXplIiwiaW5uZXJXaWR0aCIsImNvbnNvbGUiLCJsb2ciLCJ3aWR0aCIsInVzZXJBZ2VudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiaGFuZGxlSnVtcCIsImhhbmRsZU1vdmVMZWZ0IiwiaGFuZGxlTW92ZVJpZ2h0IiwiYnV0dG9uU3R5bGUiLCJoZWlnaHQiLCJib3JkZXJSYWRpdXMiLCJkaXNwbGF5IiwianVzdGlmeUNvbnRlbnQiLCJhbGlnbkl0ZW1zIiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwiYmFja2dyb3VuZENvbG9yIiwiYmFja2Ryb3BGaWx0ZXIiLCJib3JkZXIiLCJjb2xvciIsImJveFNoYWRvdyIsInVzZXJTZWxlY3QiLCJ0b3VjaEFjdGlvbiIsIldlYmtpdFRhcEhpZ2hsaWdodENvbG9yIiwiZSIsInByZXZlbn
233REZWZhdWx0IiwiX2MiLCIkUmVmcmVzaFJlZyQiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiR2FtZUNvbnRyb2xzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VLZXlib2FyZENvbnRyb2xzIH0gZnJvbSBcIkByZWFjdC10aHJlZS9kcmVpXCI7XG5pbXBvcnQgeyB1c2VSdW5uZXIgfSBmcm9tIFwiQC9saWIvc3RvcmVzL3VzZVJ1bm5lclwiO1xuaW1wb3J0IHsgQ29udHJvbHMgfSBmcm9tIFwiQC9saWIvY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBHYW1lQ29udHJvbHMoKSB7XG4gIGNvbnN0IHsganVtcCwgbW92ZUxlZnQsIG1vdmVSaWdodCwgZ2FtZVBoYXNlIH0gPSB1c2VSdW5uZXIoKTtcbiAgXG4gIC8vIFN0YXRlIGZvciBtb2JpbGUgY29udHJvbHNcbiAgY29uc3QgW3Nob3dNb2JpbGVDb250cm9scywgc2V0U2hvd01vYmlsZUNvbnRyb2xzXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgXG4gIC8vIERldGVjdCBrZXlib2FyZCBpbnB1dCB1c2luZyBkcmVpIGtleWJvYXJkIGNvbnRyb2xzXG4gIGNvbnN0IGp1bXBQcmVzc2VkID0gdXNlS2V5Ym9hcmRDb250cm9sczxDb250cm9scz4oc3RhdGUgPT4gc3RhdGUuanVtcCk7XG4gIGNvbnN0IGxlZnRQcmVzc2VkID0gdXNlS2V5Ym9hcmRDb250cm9sczxDb250cm9scz4oc3RhdGUgPT4gc3RhdGUubGVmdCk7XG4gIGNvbnN0IHJpZ2h0UHJlc3NlZCA9IHVzZUtleWJvYXJkQ29udHJvbHM8Q29udHJvbHM+KHN0YXRlID0+IHN0YXRlLnJpZ2h0KTtcbiAgXG4gIC8vIERldGVjdCBpZiBkZXZpY2UgaXMgbW9iaWxlIG9yIGhhcyB0b3VjaCBjYXBhYmlsaXR5XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY2hlY2tJZk1vYmlsZSA9ICgpID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciB0b3VjaCBkZXZpY2UgYnkgZmVhdHVyZSBkZXRlY3Rpb25cbiAgICAgIGNvbnN0IGlzVG91Y2hEZXZpY2UgPSAnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hdmlnYXRvciBhcyBhbnkpLm1zTWF4VG91Y2hQb2ludHMgPiAwO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBkZXZpY2Ugd2lkdGggLSBjb25zaWRlciB0YWJsZXRzIGFzIG1vYmlsZSBmb3IgY29udHJvbHNcbiAgICAgIGNvbnN0IGlzTW9iaWxlU2l6ZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwMjQ7XG4gICAgICBcbiAgICAgIC8vIExvZyBmb3IgZGVidWdnaW5nXG4gICAgICBjb25zb2xlLmxvZygnVG91Y2ggZGV2aWNlIGNoZWNrOicsIHsgXG4gICAgICAgIGlzVG91Y2hEZXZpY2UsIFxuICAgICAgICBpc01vYmlsZVNpemUsIFxuICAgICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsIFxuICAgICAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQgXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gU2V0IG1vYmlsZSBjb250cm9scyBpZiBlaXRoZXIgY29uZGl0aW9uIGlzIHRydWVcbiAgICAgIHNldFNob3dNb2JpbGVDb250cm9scyhpc1RvdWNoRGV2aWNlIHx8IGlzTW9iaWxlU2l6ZSk7XG4gICAgfTtcbiAgICBcbiAgICAvLyBJbml0aWFsIGNoZWNrXG4gICAgY2hlY2tJZk1vYmlsZSgpO1xuICAgIFxuICAgIC8vIExpc3RlbiBmb3Igd2luZG93IHJlc2l6ZVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjaGVja0lmTW9iaWxlKTtcbiAgICBcbiAgICAvLyBBbHNvIGZvcmNlIG1vYmlsZSBjb250cm9scyB2aXNpYmxlIGZvciB0ZXN0aW5nXG4gICAgLy8gQ29tbWVudCBvdXQgZm9yIHByb2R1Y3Rpb24gaWYgbmVlZGVkXG4gICAgc2V0U2hvd01vYmlsZUNvbnRyb2xzKHRydWUpO1xuICAgIFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2hlY2tJZk1vYmlsZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICBcbiAgLy8gSGFuZGxlIGtleWJvYXJkIGNvbnRyb2xzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGp1bXBQcmVzc2VkICYmIGdhbWVQaGFzZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICBqdW1wKCk7XG4gICAgfVxuICB9LCBbanVtcFByZXNzZWQsIGp1bXAsIGdhbWVQaGFzZV0pO1xuICBcbiAgLy8gSGFuZGxlIGxlZnQvcmlnaHQgbW92ZW1lbnRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGVmdFByZXNzZWQgJiYgZ2FtZVBoYXNlID09PSAncGxheWluZycpIHtcbiAgICAgIG1vdmVMZWZ0KCk7XG4gICAgICBjb25zb2xlLmxvZygnTGVmdCBrZXkgcHJlc3NlZCAtIG1vdmluZyBsZWZ0Jyk7XG4gICAgfVxuICB9LCBbbGVmdFByZXNzZWQsIG1vdmVMZWZ0LCBnYW1lUGhhc2VdKTtcbiAgXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJpZ2h0UHJlc3NlZCAmJiBnYW1lUGhhc2UgPT09ICdwbGF5aW5nJykge1xuICAgICAgbW92ZVJpZ2h0KCk7XG4gICAgICBjb25zb2xlLmxvZygnUmlnaHQga2V5IHByZXNzZWQgLSBtb3ZpbmcgcmlnaHQnKTtcbiAgICB9XG4gIH0sIFtyaWdodFByZXNzZWQsIG1vdmVSaWdodCwgZ2FtZVBoYXNlXSk7XG4gIFxuICAvLyBIYW5kbGVyIGZ1bmN0aW9ucyBmb3IgdG91Y2ggY29udHJvbHMgd2l0aCBpbXByb3ZlZCBkZWJ1Z2dpbmdcbiAgY29uc3QgaGFuZGxlSnVtcCA9ICgpID0+IHtcbiAgICAvLyBTdGFydCBnYW1lIGlmIG5vdCBhbHJlYWR5IHBsYXlpbmdcbiAgICBpZiAoZ2FtZVBoYXNlID09PSAncmVhZHknKSB7XG4gICAgICBqdW1wKCk7IC8vIFRoaXMgc2hvdWxkIGNhbGwgc3RhcnRHYW1lKClcbiAgICAgIGNvbnNvbGUubG9nKCdHYW1lIHN0YXJ0ZWQgZnJvbSBqdW1wJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIE9ubHkganVtcCBpZiBnYW1lIGlzIHBsYXlpbmdcbiAgICBpZiAoZ2FtZVBoYXNlID09PSAncGxheWluZycpIHtcbiAgICAgIGp1bXAoKTtcbiAgICAgIGNvbnNvbGUubG9nKCdKdW1wIGV4ZWN1dGVkLCBnYW1lIHBoYXNlOicsIGdhbWVQaGFzZSk7XG4gICAgfVxuICB9O1xuICBcbiAgY29uc3QgaGFuZGxlTW92ZUxlZnQgPSAoKSA9PiB7XG4gICAgaWYgKGdhbWVQaGFzZSAhPT0gJ3BsYXlpbmcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnQ2Fubm90IG1vdmUgbGVmdCwgZ2FtZSBub3QgcGxheWluZy4gUGhhc2U6JywgZ2FtZVBoYXNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbW92ZUxlZnQoKTtcbiAgICBjb25zb2xlLmxvZygnTW92ZSBsZWZ0IGV4ZWN1dGVkLCBnYW1lIHBoYXNlOicsIGdhbWVQaGFzZSk7XG4gIH07XG4gIFxuICBjb25zdCBoYW5kbGVNb3ZlUmlnaHQgPSAoKSA9PiB7XG4gICAgaWYgKGdhbWVQaGFzZSAhPT0gJ3BsYXlpbmcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnQ2Fubm90IG1vdmUgcmlnaHQsIGdhbWUgbm90IHBsYXlpbmcuIFBoYXNlOicsIGdhbWVQaGFzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIG1vdmVSaWdodCgpO1xuICAgIGNvbnNvbGUubG9nKCdNb3ZlIHJpZ2h0IGV4ZWN1dGVkLCBnYW1lIHBoYXNlOicsIGdhbWVQaGFzZSk7XG4gIH07XG4gIFxuICAvLyBNb2JpbGUgY29udHJvbCBzdHlsZXMgLSBtYWtpbmcgbGFyZ2VyIGFuZCBtb3JlIHZpc2libGVcbiAgY29uc3QgYnV0dG9uU3R5bGUgPSB7XG4gICAgd2lkdGg6ICc5MHB4JywgIC8vIEluY3JlYXNlZCBzaXplXG4gICAgaGVpZ2h0OiAnOTBweCcsICAvLyBJbmNyZWFzZWQgc2l6ZVxuICAgIGJvcmRlclJhZGl1czogJzUwJScsXG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBmb250U2l6ZTogJzM2cHgnLCAgLy8gTGFyZ2VyIGZvbnQgc2l6ZVxuICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICBiYWNrZ3JvdW5k
233Q29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSknLCAgLy8gTW9yZSBvcGFxdWUgYmFja2dyb3VuZFxuICAgIGJhY2tkcm9wRmlsdGVyOiAnYmx1cigxMHB4KScsXG4gICAgYm9yZGVyOiAnM3B4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KScsICAvLyBNb3JlIHZpc2libGUgYm9yZGVyXG4gICAgY29sb3I6ICd3aGl0ZScsXG4gICAgYm94U2hhZG93OiAnMCA2cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNCknLCAgLy8gTW9yZSBwcm9ub3VuY2VkIHNoYWRvd1xuICAgIHVzZXJTZWxlY3Q6ICdub25lJyBhcyAnbm9uZScsICAvLyBUeXBlIGFzc2VydGlvbiB0byBmaXggdGhlIGVycm9yXG4gICAgdG91Y2hBY3Rpb246ICdtYW5pcHVsYXRpb24nLFxuICAgIFdlYmtpdFRhcEhpZ2hsaWdodENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICB9O1xuICBcbiAgLy8gU3RhcnQgYnV0dG9uIHN0eWxlIHJlbW92ZWQgc2luY2Ugd2UncmUgdXNpbmcgb25seSB0aGUgbWFpbiBTVEFSVCBidXR0b25cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7LyogTW9iaWxlIGNvbnRyb2xzICovfVxuICAgICAge3Nob3dNb2JpbGVDb250cm9scyAmJiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgey8qIE1vYmlsZSBTVEFSVCBidXR0b24gcmVtb3ZlZCB0byBwcmV2ZW50IGR1cGxpY2F0aW9uIHdpdGggdGhlIG1haW4gU1RBUlQgYnV0dG9uICovfVxuICAgICAgICAgIFxuICAgICAgICAgIHsvKiBHYW1lIGNvbnRyb2xzIC0gb25seSBzaG93IHdoZW4gZ2FtZSBpcyBwbGF5aW5nICovfVxuICAgICAgICAgIHtnYW1lUGhhc2UgPT09ICdwbGF5aW5nJyAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIGJvdHRvbS0xMCBpbnNldC14LTAgei01MCBmbGV4IGp1c3RpZnktYmV0d2VlbiBweC00IHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWZ0LWNvbnRyb2wgcG9pbnRlci1ldmVudHMtYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICAgICBzdHlsZT17YnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJsZWZ0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvblRvdWNoU3RhcnQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTW92ZUxlZnQoKTsgLy8gRml4ZWQ6IFVzaW5nIGNvcnJlY3QgaGFuZGxlciBmb3IgbGVmdCBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1RvdWNoIGxlZnQgYnV0dG9uIC0gbW92aW5nIExFRlQnKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlTW92ZUxlZnR9IC8vIEZpeGVkOiBVc2luZyBjb3JyZWN0IGhhbmRsZXIgZm9yIGxlZnQgYnV0dG9uXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAg4peAXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaWRkbGUtY29udHJvbCBwb2ludGVyLWV2ZW50cy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXtidXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImp1bXAtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uVG91Y2hTdGFydD17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVKdW1wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUb3VjaCBqdW1wIGJ1dHRvbicpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVKdW1wfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIOKWslxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmlnaHQtY29udHJvbCBwb2ludGVyLWV2ZW50cy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXtidXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJpZ2h0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvblRvdWNoU3RhcnQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTW92ZVJpZ2h0KCk7IC8vIEZpeGVkOiBVc2luZyBjb3JyZWN0IGhhbmRsZXIgZm9yIHJpZ2h0IGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVG91Y2ggcmlnaHQgYnV0dG9uIC0gbW92aW5nIFJJR0hUJyk7XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IGUucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1vdmVSaWdodH0gLy8gRml4ZWQ6IFVzaW5nIGNvcnJlY3QgaGFuZGxlciBmb3IgcmlnaHQgYnV0dG9uXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAg4pa2XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC8+XG4gICAgICApfVxuICAgIDwvPlxuICApO1xufVxuIl0sImZpbGUiOiIvaG9tZS9ydW5uZXIvd29ya3NwYWNlL2NsaWVudC9zcmMvY29tcG9uZW50cy9nYW1lL0dhbWVDb250cm9scy50c3gifQ==

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.