diff --git a/src/ozai_webui/__init__.py b/src/ozai_webui/__init__.py index c35f37a..adb91ec 100755 --- a/src/ozai_webui/__init__.py +++ b/src/ozai_webui/__init__.py @@ -79,6 +79,16 @@ def socketio_js(): #return the background image return app.send_static_file('socket.io.js') +@app.route('/browser-polyfill.js') +def socketio_js(): + #return the background image + return app.send_static_file('browser-polyfill.js') + +@app.route('/browser-polyfill.js.map') +def socketio_js(): + #return the background image + return app.send_static_file('browser-polyfill.js.map') + @app.route('/azul-flake.png') def logo(): #return the background image diff --git a/src/static/browser-polyfill.js b/src/static/browser-polyfill.js new file mode 100644 index 0000000..3eb552a --- /dev/null +++ b/src/static/browser-polyfill.js @@ -0,0 +1,1290 @@ +UNPKG - webextension-polyfill

UNPKG

38.4 kBJavaScriptView Raw
1(function (global, factory) { +
2 if (typeof define === "function" && define.amd) { +
3 define("webextension-polyfill", ["module"], factory); +
4 } else if (typeof exports !== "undefined") { +
5 factory(module); +
6 } else { +
7 var mod = { +
8 exports: {} +
9 }; +
10 factory(mod); +
11 global.browser = mod.exports; +
12 } +
13})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) { +
14 /* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */ +
15 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +
16 /* vim: set sts=2 sw=2 et tw=80: */ +
17 /* This Source Code Form is subject to the terms of the Mozilla Public +
18 * License, v. 2.0. If a copy of the MPL was not distributed with this +
19 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +
20 "use strict"; +
21 +
22 if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) { +
23 throw new Error("This script should only be loaded in a browser extension."); +
24 } +
25 if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) { +
26 const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; +
27 +
28 // Wrapping the bulk of this polyfill in a one-time-use function is a minor +
29 // optimization for Firefox. Since Spidermonkey does not fully parse the +
30 // contents of a function until the first time it's called, and since it will +
31 // never actually need to be called, this allows the polyfill to be included +
32 // in Firefox nearly for free. +
33 const wrapAPIs = extensionAPIs => { +
34 // NOTE: apiMetadata is associated to the content of the api-metadata.json file +
35 // at build time by replacing the following "include" with the content of the +
36 // JSON file. +
37 const apiMetadata = { +
38 "alarms": { +
39 "clear": { +
40 "minArgs": 0, +
41 "maxArgs": 1 +
42 }, +
43 "clearAll": { +
44 "minArgs": 0, +
45 "maxArgs": 0 +
46 }, +
47 "get": { +
48 "minArgs": 0, +
49 "maxArgs": 1 +
50 }, +
51 "getAll": { +
52 "minArgs": 0, +
53 "maxArgs": 0 +
54 } +
55 }, +
56 "bookmarks": { +
57 "create": { +
58 "minArgs": 1, +
59 "maxArgs": 1 +
60 }, +
61 "get": { +
62 "minArgs": 1, +
63 "maxArgs": 1 +
64 }, +
65 "getChildren": { +
66 "minArgs": 1, +
67 "maxArgs": 1 +
68 }, +
69 "getRecent": { +
70 "minArgs": 1, +
71 "maxArgs": 1 +
72 }, +
73 "getSubTree": { +
74 "minArgs": 1, +
75 "maxArgs": 1 +
76 }, +
77 "getTree": { +
78 "minArgs": 0, +
79 "maxArgs": 0 +
80 }, +
81 "move": { +
82 "minArgs": 2, +
83 "maxArgs": 2 +
84 }, +
85 "remove": { +
86 "minArgs": 1, +
87 "maxArgs": 1 +
88 }, +
89 "removeTree": { +
90 "minArgs": 1, +
91 "maxArgs": 1 +
92 }, +
93 "search": { +
94 "minArgs": 1, +
95 "maxArgs": 1 +
96 }, +
97 "update": { +
98 "minArgs": 2, +
99 "maxArgs": 2 +
100 } +
101 }, +
102 "browserAction": { +
103 "disable": { +
104 "minArgs": 0, +
105 "maxArgs": 1, +
106 "fallbackToNoCallback": true +
107 }, +
108 "enable": { +
109 "minArgs": 0, +
110 "maxArgs": 1, +
111 "fallbackToNoCallback": true +
112 }, +
113 "getBadgeBackgroundColor": { +
114 "minArgs": 1, +
115 "maxArgs": 1 +
116 }, +
117 "getBadgeText": { +
118 "minArgs": 1, +
119 "maxArgs": 1 +
120 }, +
121 "getPopup": { +
122 "minArgs": 1, +
123 "maxArgs": 1 +
124 }, +
125 "getTitle": { +
126 "minArgs": 1, +
127 "maxArgs": 1 +
128 }, +
129 "openPopup": { +
130 "minArgs": 0, +
131 "maxArgs": 0 +
132 }, +
133 "setBadgeBackgroundColor": { +
134 "minArgs": 1, +
135 "maxArgs": 1, +
136 "fallbackToNoCallback": true +
137 }, +
138 "setBadgeText": { +
139 "minArgs": 1, +
140 "maxArgs": 1, +
141 "fallbackToNoCallback": true +
142 }, +
143 "setIcon": { +
144 "minArgs": 1, +
145 "maxArgs": 1 +
146 }, +
147 "setPopup": { +
148 "minArgs": 1, +
149 "maxArgs": 1, +
150 "fallbackToNoCallback": true +
151 }, +
152 "setTitle": { +
153 "minArgs": 1, +
154 "maxArgs": 1, +
155 "fallbackToNoCallback": true +
156 } +
157 }, +
158 "browsingData": { +
159 "remove": { +
160 "minArgs": 2, +
161 "maxArgs": 2 +
162 }, +
163 "removeCache": { +
164 "minArgs": 1, +
165 "maxArgs": 1 +
166 }, +
167 "removeCookies": { +
168 "minArgs": 1, +
169 "maxArgs": 1 +
170 }, +
171 "removeDownloads": { +
172 "minArgs": 1, +
173 "maxArgs": 1 +
174 }, +
175 "removeFormData": { +
176 "minArgs": 1, +
177 "maxArgs": 1 +
178 }, +
179 "removeHistory": { +
180 "minArgs": 1, +
181 "maxArgs": 1 +
182 }, +
183 "removeLocalStorage": { +
184 "minArgs": 1, +
185 "maxArgs": 1 +
186 }, +
187 "removePasswords": { +
188 "minArgs": 1, +
189 "maxArgs": 1 +
190 }, +
191 "removePluginData": { +
192 "minArgs": 1, +
193 "maxArgs": 1 +
194 }, +
195 "settings": { +
196 "minArgs": 0, +
197 "maxArgs": 0 +
198 } +
199 }, +
200 "commands": { +
201 "getAll": { +
202 "minArgs": 0, +
203 "maxArgs": 0 +
204 } +
205 }, +
206 "contextMenus": { +
207 "remove": { +
208 "minArgs": 1, +
209 "maxArgs": 1 +
210 }, +
211 "removeAll": { +
212 "minArgs": 0, +
213 "maxArgs": 0 +
214 }, +
215 "update": { +
216 "minArgs": 2, +
217 "maxArgs": 2 +
218 } +
219 }, +
220 "cookies": { +
221 "get": { +
222 "minArgs": 1, +
223 "maxArgs": 1 +
224 }, +
225 "getAll": { +
226 "minArgs": 1, +
227 "maxArgs": 1 +
228 }, +
229 "getAllCookieStores": { +
230 "minArgs": 0, +
231 "maxArgs": 0 +
232 }, +
233 "remove": { +
234 "minArgs": 1, +
235 "maxArgs": 1 +
236 }, +
237 "set": { +
238 "minArgs": 1, +
239 "maxArgs": 1 +
240 } +
241 }, +
242 "devtools": { +
243 "inspectedWindow": { +
244 "eval": { +
245 "minArgs": 1, +
246 "maxArgs": 2, +
247 "singleCallbackArg": false +
248 } +
249 }, +
250 "panels": { +
251 "create": { +
252 "minArgs": 3, +
253 "maxArgs": 3, +
254 "singleCallbackArg": true +
255 }, +
256 "elements": { +
257 "createSidebarPane": { +
258 "minArgs": 1, +
259 "maxArgs": 1 +
260 } +
261 } +
262 } +
263 }, +
264 "downloads": { +
265 "cancel": { +
266 "minArgs": 1, +
267 "maxArgs": 1 +
268 }, +
269 "download": { +
270 "minArgs": 1, +
271 "maxArgs": 1 +
272 }, +
273 "erase": { +
274 "minArgs": 1, +
275 "maxArgs": 1 +
276 }, +
277 "getFileIcon": { +
278 "minArgs": 1, +
279 "maxArgs": 2 +
280 }, +
281 "open": { +
282 "minArgs": 1, +
283 "maxArgs": 1, +
284 "fallbackToNoCallback": true +
285 }, +
286 "pause": { +
287 "minArgs": 1, +
288 "maxArgs": 1 +
289 }, +
290 "removeFile": { +
291 "minArgs": 1, +
292 "maxArgs": 1 +
293 }, +
294 "resume": { +
295 "minArgs": 1, +
296 "maxArgs": 1 +
297 }, +
298 "search": { +
299 "minArgs": 1, +
300 "maxArgs": 1 +
301 }, +
302 "show": { +
303 "minArgs": 1, +
304 "maxArgs": 1, +
305 "fallbackToNoCallback": true +
306 } +
307 }, +
308 "extension": { +
309 "isAllowedFileSchemeAccess": { +
310 "minArgs": 0, +
311 "maxArgs": 0 +
312 }, +
313 "isAllowedIncognitoAccess": { +
314 "minArgs": 0, +
315 "maxArgs": 0 +
316 } +
317 }, +
318 "history": { +
319 "addUrl": { +
320 "minArgs": 1, +
321 "maxArgs": 1 +
322 }, +
323 "deleteAll": { +
324 "minArgs": 0, +
325 "maxArgs": 0 +
326 }, +
327 "deleteRange": { +
328 "minArgs": 1, +
329 "maxArgs": 1 +
330 }, +
331 "deleteUrl": { +
332 "minArgs": 1, +
333 "maxArgs": 1 +
334 }, +
335 "getVisits": { +
336 "minArgs": 1, +
337 "maxArgs": 1 +
338 }, +
339 "search": { +
340 "minArgs": 1, +
341 "maxArgs": 1 +
342 } +
343 }, +
344 "i18n": { +
345 "detectLanguage": { +
346 "minArgs": 1, +
347 "maxArgs": 1 +
348 }, +
349 "getAcceptLanguages": { +
350 "minArgs": 0, +
351 "maxArgs": 0 +
352 } +
353 }, +
354 "identity": { +
355 "launchWebAuthFlow": { +
356 "minArgs": 1, +
357 "maxArgs": 1 +
358 } +
359 }, +
360 "idle": { +
361 "queryState": { +
362 "minArgs": 1, +
363 "maxArgs": 1 +
364 } +
365 }, +
366 "management": { +
367 "get": { +
368 "minArgs": 1, +
369 "maxArgs": 1 +
370 }, +
371 "getAll": { +
372 "minArgs": 0, +
373 "maxArgs": 0 +
374 }, +
375 "getSelf": { +
376 "minArgs": 0, +
377 "maxArgs": 0 +
378 }, +
379 "setEnabled": { +
380 "minArgs": 2, +
381 "maxArgs": 2 +
382 }, +
383 "uninstallSelf": { +
384 "minArgs": 0, +
385 "maxArgs": 1 +
386 } +
387 }, +
388 "notifications": { +
389 "clear": { +
390 "minArgs": 1, +
391 "maxArgs": 1 +
392 }, +
393 "create": { +
394 "minArgs": 1, +
395 "maxArgs": 2 +
396 }, +
397 "getAll": { +
398 "minArgs": 0, +
399 "maxArgs": 0 +
400 }, +
401 "getPermissionLevel": { +
402 "minArgs": 0, +
403 "maxArgs": 0 +
404 }, +
405 "update": { +
406 "minArgs": 2, +
407 "maxArgs": 2 +
408 } +
409 }, +
410 "pageAction": { +
411 "getPopup": { +
412 "minArgs": 1, +
413 "maxArgs": 1 +
414 }, +
415 "getTitle": { +
416 "minArgs": 1, +
417 "maxArgs": 1 +
418 }, +
419 "hide": { +
420 "minArgs": 1, +
421 "maxArgs": 1, +
422 "fallbackToNoCallback": true +
423 }, +
424 "setIcon": { +
425 "minArgs": 1, +
426 "maxArgs": 1 +
427 }, +
428 "setPopup": { +
429 "minArgs": 1, +
430 "maxArgs": 1, +
431 "fallbackToNoCallback": true +
432 }, +
433 "setTitle": { +
434 "minArgs": 1, +
435 "maxArgs": 1, +
436 "fallbackToNoCallback": true +
437 }, +
438 "show": { +
439 "minArgs": 1, +
440 "maxArgs": 1, +
441 "fallbackToNoCallback": true +
442 } +
443 }, +
444 "permissions": { +
445 "contains": { +
446 "minArgs": 1, +
447 "maxArgs": 1 +
448 }, +
449 "getAll": { +
450 "minArgs": 0, +
451 "maxArgs": 0 +
452 }, +
453 "remove": { +
454 "minArgs": 1, +
455 "maxArgs": 1 +
456 }, +
457 "request": { +
458 "minArgs": 1, +
459 "maxArgs": 1 +
460 } +
461 }, +
462 "runtime": { +
463 "getBackgroundPage": { +
464 "minArgs": 0, +
465 "maxArgs": 0 +
466 }, +
467 "getPlatformInfo": { +
468 "minArgs": 0, +
469 "maxArgs": 0 +
470 }, +
471 "openOptionsPage": { +
472 "minArgs": 0, +
473 "maxArgs": 0 +
474 }, +
475 "requestUpdateCheck": { +
476 "minArgs": 0, +
477 "maxArgs": 0 +
478 }, +
479 "sendMessage": { +
480 "minArgs": 1, +
481 "maxArgs": 3 +
482 }, +
483 "sendNativeMessage": { +
484 "minArgs": 2, +
485 "maxArgs": 2 +
486 }, +
487 "setUninstallURL": { +
488 "minArgs": 1, +
489 "maxArgs": 1 +
490 } +
491 }, +
492 "sessions": { +
493 "getDevices": { +
494 "minArgs": 0, +
495 "maxArgs": 1 +
496 }, +
497 "getRecentlyClosed": { +
498 "minArgs": 0, +
499 "maxArgs": 1 +
500 }, +
501 "restore": { +
502 "minArgs": 0, +
503 "maxArgs": 1 +
504 } +
505 }, +
506 "storage": { +
507 "local": { +
508 "clear": { +
509 "minArgs": 0, +
510 "maxArgs": 0 +
511 }, +
512 "get": { +
513 "minArgs": 0, +
514 "maxArgs": 1 +
515 }, +
516 "getBytesInUse": { +
517 "minArgs": 0, +
518 "maxArgs": 1 +
519 }, +
520 "remove": { +
521 "minArgs": 1, +
522 "maxArgs": 1 +
523 }, +
524 "set": { +
525 "minArgs": 1, +
526 "maxArgs": 1 +
527 } +
528 }, +
529 "managed": { +
530 "get": { +
531 "minArgs": 0, +
532 "maxArgs": 1 +
533 }, +
534 "getBytesInUse": { +
535 "minArgs": 0, +
536 "maxArgs": 1 +
537 } +
538 }, +
539 "sync": { +
540 "clear": { +
541 "minArgs": 0, +
542 "maxArgs": 0 +
543 }, +
544 "get": { +
545 "minArgs": 0, +
546 "maxArgs": 1 +
547 }, +
548 "getBytesInUse": { +
549 "minArgs": 0, +
550 "maxArgs": 1 +
551 }, +
552 "remove": { +
553 "minArgs": 1, +
554 "maxArgs": 1 +
555 }, +
556 "set": { +
557 "minArgs": 1, +
558 "maxArgs": 1 +
559 } +
560 } +
561 }, +
562 "tabs": { +
563 "captureVisibleTab": { +
564 "minArgs": 0, +
565 "maxArgs": 2 +
566 }, +
567 "create": { +
568 "minArgs": 1, +
569 "maxArgs": 1 +
570 }, +
571 "detectLanguage": { +
572 "minArgs": 0, +
573 "maxArgs": 1 +
574 }, +
575 "discard": { +
576 "minArgs": 0, +
577 "maxArgs": 1 +
578 }, +
579 "duplicate": { +
580 "minArgs": 1, +
581 "maxArgs": 1 +
582 }, +
583 "executeScript": { +
584 "minArgs": 1, +
585 "maxArgs": 2 +
586 }, +
587 "get": { +
588 "minArgs": 1, +
589 "maxArgs": 1 +
590 }, +
591 "getCurrent": { +
592 "minArgs": 0, +
593 "maxArgs": 0 +
594 }, +
595 "getZoom": { +
596 "minArgs": 0, +
597 "maxArgs": 1 +
598 }, +
599 "getZoomSettings": { +
600 "minArgs": 0, +
601 "maxArgs": 1 +
602 }, +
603 "goBack": { +
604 "minArgs": 0, +
605 "maxArgs": 1 +
606 }, +
607 "goForward": { +
608 "minArgs": 0, +
609 "maxArgs": 1 +
610 }, +
611 "highlight": { +
612 "minArgs": 1, +
613 "maxArgs": 1 +
614 }, +
615 "insertCSS": { +
616 "minArgs": 1, +
617 "maxArgs": 2 +
618 }, +
619 "move": { +
620 "minArgs": 2, +
621 "maxArgs": 2 +
622 }, +
623 "query": { +
624 "minArgs": 1, +
625 "maxArgs": 1 +
626 }, +
627 "reload": { +
628 "minArgs": 0, +
629 "maxArgs": 2 +
630 }, +
631 "remove": { +
632 "minArgs": 1, +
633 "maxArgs": 1 +
634 }, +
635 "removeCSS": { +
636 "minArgs": 1, +
637 "maxArgs": 2 +
638 }, +
639 "sendMessage": { +
640 "minArgs": 2, +
641 "maxArgs": 3 +
642 }, +
643 "setZoom": { +
644 "minArgs": 1, +
645 "maxArgs": 2 +
646 }, +
647 "setZoomSettings": { +
648 "minArgs": 1, +
649 "maxArgs": 2 +
650 }, +
651 "update": { +
652 "minArgs": 1, +
653 "maxArgs": 2 +
654 } +
655 }, +
656 "topSites": { +
657 "get": { +
658 "minArgs": 0, +
659 "maxArgs": 0 +
660 } +
661 }, +
662 "webNavigation": { +
663 "getAllFrames": { +
664 "minArgs": 1, +
665 "maxArgs": 1 +
666 }, +
667 "getFrame": { +
668 "minArgs": 1, +
669 "maxArgs": 1 +
670 } +
671 }, +
672 "webRequest": { +
673 "handlerBehaviorChanged": { +
674 "minArgs": 0, +
675 "maxArgs": 0 +
676 } +
677 }, +
678 "windows": { +
679 "create": { +
680 "minArgs": 0, +
681 "maxArgs": 1 +
682 }, +
683 "get": { +
684 "minArgs": 1, +
685 "maxArgs": 2 +
686 }, +
687 "getAll": { +
688 "minArgs": 0, +
689 "maxArgs": 1 +
690 }, +
691 "getCurrent": { +
692 "minArgs": 0, +
693 "maxArgs": 1 +
694 }, +
695 "getLastFocused": { +
696 "minArgs": 0, +
697 "maxArgs": 1 +
698 }, +
699 "remove": { +
700 "minArgs": 1, +
701 "maxArgs": 1 +
702 }, +
703 "update": { +
704 "minArgs": 2, +
705 "maxArgs": 2 +
706 } +
707 } +
708 }; +
709 if (Object.keys(apiMetadata).length === 0) { +
710 throw new Error("api-metadata.json has not been included in browser-polyfill"); +
711 } +
712 +
713 /** +
714 * A WeakMap subclass which creates and stores a value for any key which does +
715 * not exist when accessed, but behaves exactly as an ordinary WeakMap +
716 * otherwise. +
717 * +
718 * @param {function} createItem +
719 * A function which will be called in order to create the value for any +
720 * key which does not exist, the first time it is accessed. The +
721 * function receives, as its only argument, the key being created. +
722 */ +
723 class DefaultWeakMap extends WeakMap { +
724 constructor(createItem, items = undefined) { +
725 super(items); +
726 this.createItem = createItem; +
727 } +
728 get(key) { +
729 if (!this.has(key)) { +
730 this.set(key, this.createItem(key)); +
731 } +
732 return super.get(key); +
733 } +
734 } +
735 +
736 /** +
737 * Returns true if the given object is an object with a `then` method, and can +
738 * therefore be assumed to behave as a Promise. +
739 * +
740 * @param {*} value The value to test. +
741 * @returns {boolean} True if the value is thenable. +
742 */ +
743 const isThenable = value => { +
744 return value && typeof value === "object" && typeof value.then === "function"; +
745 }; +
746 +
747 /** +
748 * Creates and returns a function which, when called, will resolve or reject +
749 * the given promise based on how it is called: +
750 * +
751 * - If, when called, `chrome.runtime.lastError` contains a non-null object, +
752 * the promise is rejected with that value. +
753 * - If the function is called with exactly one argument, the promise is +
754 * resolved to that value. +
755 * - Otherwise, the promise is resolved to an array containing all of the +
756 * function's arguments. +
757 * +
758 * @param {object} promise +
759 * An object containing the resolution and rejection functions of a +
760 * promise. +
761 * @param {function} promise.resolve +
762 * The promise's resolution function. +
763 * @param {function} promise.reject +
764 * The promise's rejection function. +
765 * @param {object} metadata +
766 * Metadata about the wrapped method which has created the callback. +
767 * @param {boolean} metadata.singleCallbackArg +
768 * Whether or not the promise is resolved with only the first +
769 * argument of the callback, alternatively an array of all the +
770 * callback arguments is resolved. By default, if the callback +
771 * function is invoked with only a single argument, that will be +
772 * resolved to the promise, while all arguments will be resolved as +
773 * an array if multiple are given. +
774 * +
775 * @returns {function} +
776 * The generated callback function. +
777 */ +
778 const makeCallback = (promise, metadata) => { +
779 return (...callbackArgs) => { +
780 if (extensionAPIs.runtime.lastError) { +
781 promise.reject(new Error(extensionAPIs.runtime.lastError.message)); +
782 } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) { +
783 promise.resolve(callbackArgs[0]); +
784 } else { +
785 promise.resolve(callbackArgs); +
786 } +
787 }; +
788 }; +
789 const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments"; +
790 +
791 /** +
792 * Creates a wrapper function for a method with the given name and metadata. +
793 * +
794 * @param {string} name +
795 * The name of the method which is being wrapped. +
796 * @param {object} metadata +
797 * Metadata about the method being wrapped. +
798 * @param {integer} metadata.minArgs +
799 * The minimum number of arguments which must be passed to the +
800 * function. If called with fewer than this number of arguments, the +
801 * wrapper will raise an exception. +
802 * @param {integer} metadata.maxArgs +
803 * The maximum number of arguments which may be passed to the +
804 * function. If called with more than this number of arguments, the +
805 * wrapper will raise an exception. +
806 * @param {boolean} metadata.singleCallbackArg +
807 * Whether or not the promise is resolved with only the first +
808 * argument of the callback, alternatively an array of all the +
809 * callback arguments is resolved. By default, if the callback +
810 * function is invoked with only a single argument, that will be +
811 * resolved to the promise, while all arguments will be resolved as +
812 * an array if multiple are given. +
813 * +
814 * @returns {function(object, ...*)} +
815 * The generated wrapper function. +
816 */ +
817 const wrapAsyncFunction = (name, metadata) => { +
818 return function asyncFunctionWrapper(target, ...args) { +
819 if (args.length < metadata.minArgs) { +
820 throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); +
821 } +
822 if (args.length > metadata.maxArgs) { +
823 throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); +
824 } +
825 return new Promise((resolve, reject) => { +
826 if (metadata.fallbackToNoCallback) { +
827 // This API method has currently no callback on Chrome, but it return a promise on Firefox, +
828 // and so the polyfill will try to call it with a callback first, and it will fallback +
829 // to not passing the callback if the first call fails. +
830 try { +
831 target[name](...args, makeCallback({ +
832 resolve, +
833 reject +
834 }, metadata)); +
835 } catch (cbError) { +
836 console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError); +
837 target[name](...args); +
838 +
839 // Update the API method metadata, so that the next API calls will not try to +
840 // use the unsupported callback anymore. +
841 metadata.fallbackToNoCallback = false; +
842 metadata.noCallback = true; +
843 resolve(); +
844 } +
845 } else if (metadata.noCallback) { +
846 target[name](...args); +
847 resolve(); +
848 } else { +
849 target[name](...args, makeCallback({ +
850 resolve, +
851 reject +
852 }, metadata)); +
853 } +
854 }); +
855 }; +
856 }; +
857 +
858 /** +
859 * Wraps an existing method of the target object, so that calls to it are +
860 * intercepted by the given wrapper function. The wrapper function receives, +
861 * as its first argument, the original `target` object, followed by each of +
862 * the arguments passed to the original method. +
863 * +
864 * @param {object} target +
865 * The original target object that the wrapped method belongs to. +
866 * @param {function} method +
867 * The method being wrapped. This is used as the target of the Proxy +
868 * object which is created to wrap the method. +
869 * @param {function} wrapper +
870 * The wrapper function which is called in place of a direct invocation +
871 * of the wrapped method. +
872 * +
873 * @returns {Proxy<function>} +
874 * A Proxy object for the given method, which invokes the given wrapper +
875 * method in its place. +
876 */ +
877 const wrapMethod = (target, method, wrapper) => { +
878 return new Proxy(method, { +
879 apply(targetMethod, thisObj, args) { +
880 return wrapper.call(thisObj, target, ...args); +
881 } +
882 }); +
883 }; +
884 let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); +
885 +
886 /** +
887 * Wraps an object in a Proxy which intercepts and wraps certain methods +
888 * based on the given `wrappers` and `metadata` objects. +
889 * +
890 * @param {object} target +
891 * The target object to wrap. +
892 * +
893 * @param {object} [wrappers = {}] +
894 * An object tree containing wrapper functions for special cases. Any +
895 * function present in this object tree is called in place of the +
896 * method in the same location in the `target` object tree. These +
897 * wrapper methods are invoked as described in {@see wrapMethod}. +
898 * +
899 * @param {object} [metadata = {}] +
900 * An object tree containing metadata used to automatically generate +
901 * Promise-based wrapper functions for asynchronous. Any function in +
902 * the `target` object tree which has a corresponding metadata object +
903 * in the same location in the `metadata` tree is replaced with an +
904 * automatically-generated wrapper function, as described in +
905 * {@see wrapAsyncFunction} +
906 * +
907 * @returns {Proxy<object>} +
908 */ +
909 const wrapObject = (target, wrappers = {}, metadata = {}) => { +
910 let cache = Object.create(null); +
911 let handlers = { +
912 has(proxyTarget, prop) { +
913 return prop in target || prop in cache; +
914 }, +
915 get(proxyTarget, prop, receiver) { +
916 if (prop in cache) { +
917 return cache[prop]; +
918 } +
919 if (!(prop in target)) { +
920 return undefined; +
921 } +
922 let value = target[prop]; +
923 if (typeof value === "function") { +
924 // This is a method on the underlying object. Check if we need to do +
925 // any wrapping. +
926 +
927 if (typeof wrappers[prop] === "function") { +
928 // We have a special-case wrapper for this method. +
929 value = wrapMethod(target, target[prop], wrappers[prop]); +
930 } else if (hasOwnProperty(metadata, prop)) { +
931 // This is an async method that we have metadata for. Create a +
932 // Promise wrapper for it. +
933 let wrapper = wrapAsyncFunction(prop, metadata[prop]); +
934 value = wrapMethod(target, target[prop], wrapper); +
935 } else { +
936 // This is a method that we don't know or care about. Return the +
937 // original method, bound to the underlying object. +
938 value = value.bind(target); +
939 } +
940 } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { +
941 // This is an object that we need to do some wrapping for the children +
942 // of. Create a sub-object wrapper for it with the appropriate child +
943 // metadata. +
944 value = wrapObject(value, wrappers[prop], metadata[prop]); +
945 } else if (hasOwnProperty(metadata, "*")) { +
946 // Wrap all properties in * namespace. +
947 value = wrapObject(value, wrappers[prop], metadata["*"]); +
948 } else { +
949 // We don't need to do any wrapping for this property, +
950 // so just forward all access to the underlying object. +
951 Object.defineProperty(cache, prop, { +
952 configurable: true, +
953 enumerable: true, +
954 get() { +
955 return target[prop]; +
956 }, +
957 set(value) { +
958 target[prop] = value; +
959 } +
960 }); +
961 return value; +
962 } +
963 cache[prop] = value; +
964 return value; +
965 }, +
966 set(proxyTarget, prop, value, receiver) { +
967 if (prop in cache) { +
968 cache[prop] = value; +
969 } else { +
970 target[prop] = value; +
971 } +
972 return true; +
973 }, +
974 defineProperty(proxyTarget, prop, desc) { +
975 return Reflect.defineProperty(cache, prop, desc); +
976 }, +
977 deleteProperty(proxyTarget, prop) { +
978 return Reflect.deleteProperty(cache, prop); +
979 } +
980 }; +
981 +
982 // Per contract of the Proxy API, the "get" proxy handler must return the +
983 // original value of the target if that value is declared read-only and +
984 // non-configurable. For this reason, we create an object with the +
985 // prototype set to `target` instead of using `target` directly. +
986 // Otherwise we cannot return a custom object for APIs that +
987 // are declared read-only and non-configurable, such as `chrome.devtools`. +
988 // +
989 // The proxy handlers themselves will still use the original `target` +
990 // instead of the `proxyTarget`, so that the methods and properties are +
991 // dereferenced via the original targets. +
992 let proxyTarget = Object.create(target); +
993 return new Proxy(proxyTarget, handlers); +
994 }; +
995 +
996 /** +
997 * Creates a set of wrapper functions for an event object, which handles +
998 * wrapping of listener functions that those messages are passed. +
999 * +
1000 * A single wrapper is created for each listener function, and stored in a +
1001 * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener` +
1002 * retrieve the original wrapper, so that attempts to remove a +
1003 * previously-added listener work as expected. +
1004 * +
1005 * @param {DefaultWeakMap<function, function>} wrapperMap +
1006 * A DefaultWeakMap object which will create the appropriate wrapper +
1007 * for a given listener function when one does not exist, and retrieve +
1008 * an existing one when it does. +
1009 * +
1010 * @returns {object} +
1011 */ +
1012 const wrapEvent = wrapperMap => ({ +
1013 addListener(target, listener, ...args) { +
1014 target.addListener(wrapperMap.get(listener), ...args); +
1015 }, +
1016 hasListener(target, listener) { +
1017 return target.hasListener(wrapperMap.get(listener)); +
1018 }, +
1019 removeListener(target, listener) { +
1020 target.removeListener(wrapperMap.get(listener)); +
1021 } +
1022 }); +
1023 const onRequestFinishedWrappers = new DefaultWeakMap(listener => { +
1024 if (typeof listener !== "function") { +
1025 return listener; +
1026 } +
1027 +
1028 /** +
1029 * Wraps an onRequestFinished listener function so that it will return a +
1030 * `getContent()` property which returns a `Promise` rather than using a +
1031 * callback API. +
1032 * +
1033 * @param {object} req +
1034 * The HAR entry object representing the network request. +
1035 */ +
1036 return function onRequestFinished(req) { +
1037 const wrappedReq = wrapObject(req, {} /* wrappers */, { +
1038 getContent: { +
1039 minArgs: 0, +
1040 maxArgs: 0 +
1041 } +
1042 }); +
1043 listener(wrappedReq); +
1044 }; +
1045 }); +
1046 const onMessageWrappers = new DefaultWeakMap(listener => { +
1047 if (typeof listener !== "function") { +
1048 return listener; +
1049 } +
1050 +
1051 /** +
1052 * Wraps a message listener function so that it may send responses based on +
1053 * its return value, rather than by returning a sentinel value and calling a +
1054 * callback. If the listener function returns a Promise, the response is +
1055 * sent when the promise either resolves or rejects. +
1056 * +
1057 * @param {*} message +
1058 * The message sent by the other end of the channel. +
1059 * @param {object} sender +
1060 * Details about the sender of the message. +
1061 * @param {function(*)} sendResponse +
1062 * A callback which, when called with an arbitrary argument, sends +
1063 * that value as a response. +
1064 * @returns {boolean} +
1065 * True if the wrapped listener returned a Promise, which will later +
1066 * yield a response. False otherwise. +
1067 */ +
1068 return function onMessage(message, sender, sendResponse) { +
1069 let didCallSendResponse = false; +
1070 let wrappedSendResponse; +
1071 let sendResponsePromise = new Promise(resolve => { +
1072 wrappedSendResponse = function (response) { +
1073 didCallSendResponse = true; +
1074 resolve(response); +
1075 }; +
1076 }); +
1077 let result; +
1078 try { +
1079 result = listener(message, sender, wrappedSendResponse); +
1080 } catch (err) { +
1081 result = Promise.reject(err); +
1082 } +
1083 const isResultThenable = result !== true && isThenable(result); +
1084 +
1085 // If the listener didn't returned true or a Promise, or called +
1086 // wrappedSendResponse synchronously, we can exit earlier +
1087 // because there will be no response sent from this listener. +
1088 if (result !== true && !isResultThenable && !didCallSendResponse) { +
1089 return false; +
1090 } +
1091 +
1092 // A small helper to send the message if the promise resolves +
1093 // and an error if the promise rejects (a wrapped sendMessage has +
1094 // to translate the message into a resolved promise or a rejected +
1095 // promise). +
1096 const sendPromisedResult = promise => { +
1097 promise.then(msg => { +
1098 // send the message value. +
1099 sendResponse(msg); +
1100 }, error => { +
1101 // Send a JSON representation of the error if the rejected value +
1102 // is an instance of error, or the object itself otherwise. +
1103 let message; +
1104 if (error && (error instanceof Error || typeof error.message === "string")) { +
1105 message = error.message; +
1106 } else { +
1107 message = "An unexpected error occurred"; +
1108 } +
1109 sendResponse({ +
1110 __mozWebExtensionPolyfillReject__: true, +
1111 message +
1112 }); +
1113 }).catch(err => { +
1114 // Print an error on the console if unable to send the response. +
1115 console.error("Failed to send onMessage rejected reply", err); +
1116 }); +
1117 }; +
1118 +
1119 // If the listener returned a Promise, send the resolved value as a +
1120 // result, otherwise wait the promise related to the wrappedSendResponse +
1121 // callback to resolve and send it as a response. +
1122 if (isResultThenable) { +
1123 sendPromisedResult(result); +
1124 } else { +
1125 sendPromisedResult(sendResponsePromise); +
1126 } +
1127 +
1128 // Let Chrome know that the listener is replying. +
1129 return true; +
1130 }; +
1131 }); +
1132 const wrappedSendMessageCallback = ({ +
1133 reject, +
1134 resolve +
1135 }, reply) => { +
1136 if (extensionAPIs.runtime.lastError) { +
1137 // Detect when none of the listeners replied to the sendMessage call and resolve +
1138 // the promise to undefined as in Firefox. +
1139 // See https://github.com/mozilla/webextension-polyfill/issues/130 +
1140 if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) { +
1141 resolve(); +
1142 } else { +
1143 reject(new Error(extensionAPIs.runtime.lastError.message)); +
1144 } +
1145 } else if (reply && reply.__mozWebExtensionPolyfillReject__) { +
1146 // Convert back the JSON representation of the error into +
1147 // an Error instance. +
1148 reject(new Error(reply.message)); +
1149 } else { +
1150 resolve(reply); +
1151 } +
1152 }; +
1153 const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => { +
1154 if (args.length < metadata.minArgs) { +
1155 throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); +
1156 } +
1157 if (args.length > metadata.maxArgs) { +
1158 throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); +
1159 } +
1160 return new Promise((resolve, reject) => { +
1161 const wrappedCb = wrappedSendMessageCallback.bind(null, { +
1162 resolve, +
1163 reject +
1164 }); +
1165 args.push(wrappedCb); +
1166 apiNamespaceObj.sendMessage(...args); +
1167 }); +
1168 }; +
1169 const staticWrappers = { +
1170 devtools: { +
1171 network: { +
1172 onRequestFinished: wrapEvent(onRequestFinishedWrappers) +
1173 } +
1174 }, +
1175 runtime: { +
1176 onMessage: wrapEvent(onMessageWrappers), +
1177 onMessageExternal: wrapEvent(onMessageWrappers), +
1178 sendMessage: wrappedSendMessage.bind(null, "sendMessage", { +
1179 minArgs: 1, +
1180 maxArgs: 3 +
1181 }) +
1182 }, +
1183 tabs: { +
1184 sendMessage: wrappedSendMessage.bind(null, "sendMessage", { +
1185 minArgs: 2, +
1186 maxArgs: 3 +
1187 }) +
1188 } +
1189 }; +
1190 const settingMetadata = { +
1191 clear: { +
1192 minArgs: 1, +
1193 maxArgs: 1 +
1194 }, +
1195 get: { +
1196 minArgs: 1, +
1197 maxArgs: 1 +
1198 }, +
1199 set: { +
1200 minArgs: 1, +
1201 maxArgs: 1 +
1202 } +
1203 }; +
1204 apiMetadata.privacy = { +
1205 network: { +
1206 "*": settingMetadata +
1207 }, +
1208 services: { +
1209 "*": settingMetadata +
1210 }, +
1211 websites: { +
1212 "*": settingMetadata +
1213 } +
1214 }; +
1215 return wrapObject(extensionAPIs, staticWrappers, apiMetadata); +
1216 }; +
1217 +
1218 // The build process adds a UMD wrapper around this file, which makes the +
1219 // `module` variable available. +
1220 module.exports = wrapAPIs(chrome); +
1221 } else { +
1222 module.exports = globalThis.browser; +
1223 } +
1224}); +
1225//# sourceMappingURL=browser-polyfill.js.map +
\ No newline at end of file diff --git a/src/static/browser-polyfill.js.map b/src/static/browser-polyfill.js.map new file mode 100644 index 0000000..8831f5c --- /dev/null +++ b/src/static/browser-polyfill.js.map @@ -0,0 +1,65 @@ +UNPKG - webextension-polyfill

UNPKG

60.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"browser-polyfill.js","names":["globalThis","chrome","runtime","id","Error","browser","CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE","wrapAPIs","extensionAPIs","apiMetadata","Object","keys","length","DefaultWeakMap","WeakMap","constructor","createItem","items","undefined","get","key","has","set","isThenable","value","then","makeCallback","promise","metadata","callbackArgs","lastError","reject","message","singleCallbackArg","resolve","pluralizeArguments","numArgs","wrapAsyncFunction","name","asyncFunctionWrapper","target","args","minArgs","maxArgs","Promise","fallbackToNoCallback","cbError","console","warn","noCallback","wrapMethod","method","wrapper","Proxy","apply","targetMethod","thisObj","call","hasOwnProperty","Function","bind","prototype","wrapObject","wrappers","cache","create","handlers","proxyTarget","prop","receiver","defineProperty","configurable","enumerable","desc","Reflect","deleteProperty","wrapEvent","wrapperMap","addListener","listener","hasListener","removeListener","onRequestFinishedWrappers","onRequestFinished","req","wrappedReq","getContent","onMessageWrappers","onMessage","sender","sendResponse","didCallSendResponse","wrappedSendResponse","sendResponsePromise","response","result","err","isResultThenable","sendPromisedResult","msg","error","__mozWebExtensionPolyfillReject__","catch","wrappedSendMessageCallback","reply","wrappedSendMessage","apiNamespaceObj","wrappedCb","push","sendMessage","staticWrappers","devtools","network","onMessageExternal","tabs","settingMetadata","clear","privacy","services","websites","module","exports"],"sources":["browser-polyfill.js"],"sourcesContent":["/* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */\n/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n/* vim: set sts=2 sw=2 et tw=80: */\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\"use strict\";\n\nif (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n}\n\nif (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\";\n\n // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n\n return super.get(key);\n }\n }\n\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg ||\n (callbackArgs.length <= 1 && metadata.singleCallbackArg !== false)) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n\n const pluralizeArguments = (numArgs) => numArgs == 1 ? \"argument\" : \"arguments\";\n\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({resolve, reject}, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` +\n \"falling back to call it without a callback: \", cbError);\n\n target[name](...args);\n\n // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({resolve, reject}, metadata));\n }\n });\n };\n };\n\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy<function>}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n },\n });\n };\n\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy<object>}\n */\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n\n if (!(prop in target)) {\n return undefined;\n }\n\n let value = target[prop];\n\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null &&\n (hasOwnProperty(wrappers, prop) ||\n hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n get() {\n return target[prop];\n },\n set(value) {\n target[prop] = value;\n },\n });\n\n return value;\n }\n\n cache[prop] = value;\n return value;\n },\n\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n return true;\n },\n\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n },\n };\n\n // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap<function, function>} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n },\n });\n\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {} /* wrappers */, {\n getContent: {\n minArgs: 0,\n maxArgs: 0,\n },\n });\n listener(wrappedReq);\n };\n });\n\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function(response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n\n let result;\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n\n const isResultThenable = result !== true && isThenable(result);\n\n // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n }\n\n // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n const sendPromisedResult = (promise) => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n if (error && (error instanceof Error ||\n typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message,\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n };\n\n // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n }\n\n // Let Chrome know that the listener is replying.\n return true;\n };\n });\n\n const wrappedSendMessageCallback = ({reject, resolve}, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {resolve, reject});\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers),\n },\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {minArgs: 1, maxArgs: 3}),\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {minArgs: 2, maxArgs: 3}),\n },\n };\n const settingMetadata = {\n clear: {minArgs: 1, maxArgs: 1},\n get: {minArgs: 1, maxArgs: 1},\n set: {minArgs: 1, maxArgs: 1},\n };\n apiMetadata.privacy = {\n network: {\"*\": settingMetadata},\n services: {\"*\": settingMetadata},\n websites: {\"*\": settingMetadata},\n };\n\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n };\n\n // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n module.exports = wrapAPIs(chrome);\n} else {\n module.exports = globalThis.browser;\n}\n"],"mappings":";;;;;;;;;;;;;EAAA;EACA;EACA;EACA;AACA;AACA;EACA,YAAY;;EAEZ,IAAI,EAAEA,UAAU,CAACC,MAAM,IAAID,UAAU,CAACC,MAAM,CAACC,OAAO,IAAIF,UAAU,CAACC,MAAM,CAACC,OAAO,CAACC,EAAE,CAAC,EAAE;IACrF,MAAM,IAAIC,KAAK,CAAC,2DAA2D,CAAC;EAC9E;EAEA,IAAI,EAAEJ,UAAU,CAACK,OAAO,IAAIL,UAAU,CAACK,OAAO,CAACH,OAAO,IAAIF,UAAU,CAACK,OAAO,CAACH,OAAO,CAACC,EAAE,CAAC,EAAE;IACxF,MAAMG,gDAAgD,GAAG,yDAAyD;;IAElH;IACA;IACA;IACA;IACA;IACA,MAAMC,QAAQ,GAAGC,aAAa,IAAI;MAChC;MACA;MACA;MACA,MAAMC,WAAW,GAAG;QAClB,QAAQ,EAAE;UACR,OAAO,EAAE;YACP,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,WAAW,EAAE;UACX,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,aAAa,EAAE;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,MAAM,EAAE;YACN,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,eAAe,EAAE;UACf,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,yBAAyB,EAAE;YACzB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,cAAc,EAAE;YACd,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,yBAAyB,EAAE;YACzB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,cAAc,EAAE;YACd,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B;QACF,CAAC;QACD,cAAc,EAAE;UACd,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,aAAa,EAAE;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,eAAe,EAAE;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,gBAAgB,EAAE;YAChB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,eAAe,EAAE;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,oBAAoB,EAAE;YACpB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,kBAAkB,EAAE;YAClB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,UAAU,EAAE;UACV,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,cAAc,EAAE;UACd,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,SAAS,EAAE;UACT,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,oBAAoB,EAAE;YACpB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,UAAU,EAAE;UACV,iBAAiB,EAAE;YACjB,MAAM,EAAE;cACN,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE,CAAC;cACZ,mBAAmB,EAAE;YACvB;UACF,CAAC;UACD,QAAQ,EAAE;YACR,QAAQ,EAAE;cACR,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE,CAAC;cACZ,mBAAmB,EAAE;YACvB,CAAC;YACD,UAAU,EAAE;cACV,mBAAmB,EAAE;gBACnB,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE;cACb;YACF;UACF;QACF,CAAC;QACD,WAAW,EAAE;UACX,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,OAAO,EAAE;YACP,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,aAAa,EAAE;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,MAAM,EAAE;YACN,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,OAAO,EAAE;YACP,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,MAAM,EAAE;YACN,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B;QACF,CAAC;QACD,WAAW,EAAE;UACX,2BAA2B,EAAE;YAC3B,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,0BAA0B,EAAE;YAC1B,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,SAAS,EAAE;UACT,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,aAAa,EAAE;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,MAAM,EAAE;UACN,gBAAgB,EAAE;YAChB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,oBAAoB,EAAE;YACpB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,UAAU,EAAE;UACV,mBAAmB,EAAE;YACnB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,MAAM,EAAE;UACN,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,YAAY,EAAE;UACZ,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,eAAe,EAAE;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,eAAe,EAAE;UACf,OAAO,EAAE;YACP,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,oBAAoB,EAAE;YACpB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,YAAY,EAAE;UACZ,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,MAAM,EAAE;YACN,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B,CAAC;UACD,MAAM,EAAE;YACN,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,sBAAsB,EAAE;UAC1B;QACF,CAAC;QACD,aAAa,EAAE;UACb,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,SAAS,EAAE;UACT,mBAAmB,EAAE;YACnB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,oBAAoB,EAAE;YACpB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,aAAa,EAAE;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,mBAAmB,EAAE;YACnB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,UAAU,EAAE;UACV,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,mBAAmB,EAAE;YACnB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,SAAS,EAAE;UACT,OAAO,EAAE;YACP,OAAO,EAAE;cACP,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,KAAK,EAAE;cACL,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,eAAe,EAAE;cACf,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,QAAQ,EAAE;cACR,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,KAAK,EAAE;cACL,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb;UACF,CAAC;UACD,SAAS,EAAE;YACT,KAAK,EAAE;cACL,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,eAAe,EAAE;cACf,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb;UACF,CAAC;UACD,MAAM,EAAE;YACN,OAAO,EAAE;cACP,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,KAAK,EAAE;cACL,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,eAAe,EAAE;cACf,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,QAAQ,EAAE;cACR,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb,CAAC;YACD,KAAK,EAAE;cACL,SAAS,EAAE,CAAC;cACZ,SAAS,EAAE;YACb;UACF;QACF,CAAC;QACD,MAAM,EAAE;UACN,mBAAmB,EAAE;YACnB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,gBAAgB,EAAE;YAChB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,eAAe,EAAE;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,MAAM,EAAE;YACN,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,OAAO,EAAE;YACP,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,aAAa,EAAE;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,SAAS,EAAE;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,UAAU,EAAE;UACV,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,eAAe,EAAE;UACf,cAAc,EAAE;YACd,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,YAAY,EAAE;UACZ,wBAAwB,EAAE;YACxB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF,CAAC;QACD,SAAS,EAAE;UACT,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,KAAK,EAAE;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,gBAAgB,EAAE;YAChB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb,CAAC;UACD,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;UACb;QACF;MACF,CAAC;MAED,IAAIC,MAAM,CAACC,IAAI,CAACF,WAAW,CAAC,CAACG,MAAM,KAAK,CAAC,EAAE;QACzC,MAAM,IAAIR,KAAK,CAAC,6DAA6D,CAAC;MAChF;;MAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACI,MAAMS,cAAc,SAASC,OAAO,CAAC;QACnCC,WAAWA,CAACC,UAAU,EAAEC,KAAK,GAAGC,SAAS,EAAE;UACzC,KAAK,CAACD,KAAK,CAAC;UACZ,IAAI,CAACD,UAAU,GAAGA,UAAU;QAC9B;QAEAG,GAAGA,CAACC,GAAG,EAAE;UACP,IAAI,CAAC,IAAI,CAACC,GAAG,CAACD,GAAG,CAAC,EAAE;YAClB,IAAI,CAACE,GAAG,CAACF,GAAG,EAAE,IAAI,CAACJ,UAAU,CAACI,GAAG,CAAC,CAAC;UACrC;UAEA,OAAO,KAAK,CAACD,GAAG,CAACC,GAAG,CAAC;QACvB;MACF;;MAEA;AACJ;AACA;AACA;AACA;AACA;AACA;MACI,MAAMG,UAAU,GAAGC,KAAK,IAAI;QAC1B,OAAOA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,OAAOA,KAAK,CAACC,IAAI,KAAK,UAAU;MAC/E,CAAC;;MAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACI,MAAMC,YAAY,GAAGA,CAACC,OAAO,EAAEC,QAAQ,KAAK;QAC1C,OAAO,CAAC,GAAGC,YAAY,KAAK;UAC1B,IAAIrB,aAAa,CAACN,OAAO,CAAC4B,SAAS,EAAE;YACnCH,OAAO,CAACI,MAAM,CAAC,IAAI3B,KAAK,CAACI,aAAa,CAACN,OAAO,CAAC4B,SAAS,CAACE,OAAO,CAAC,CAAC;UACpE,CAAC,MAAM,IAAIJ,QAAQ,CAACK,iBAAiB,IACzBJ,YAAY,CAACjB,MAAM,IAAI,CAAC,IAAIgB,QAAQ,CAACK,iBAAiB,KAAK,KAAM,EAAE;YAC7EN,OAAO,CAACO,OAAO,CAACL,YAAY,CAAC,CAAC,CAAC,CAAC;UAClC,CAAC,MAAM;YACLF,OAAO,CAACO,OAAO,CAACL,YAAY,CAAC;UAC/B;QACF,CAAC;MACH,CAAC;MAED,MAAMM,kBAAkB,GAAIC,OAAO,IAAKA,OAAO,IAAI,CAAC,GAAG,UAAU,GAAG,WAAW;;MAE/E;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACI,MAAMC,iBAAiB,GAAGA,CAACC,IAAI,EAAEV,QAAQ,KAAK;QAC5C,OAAO,SAASW,oBAAoBA,CAACC,MAAM,EAAE,GAAGC,IAAI,EAAE;UACpD,IAAIA,IAAI,CAAC7B,MAAM,GAAGgB,QAAQ,CAACc,OAAO,EAAE;YAClC,MAAM,IAAItC,KAAK,CAAE,qBAAoBwB,QAAQ,CAACc,OAAQ,IAAGP,kBAAkB,CAACP,QAAQ,CAACc,OAAO,CAAE,QAAOJ,IAAK,WAAUG,IAAI,CAAC7B,MAAO,EAAC,CAAC;UACpI;UAEA,IAAI6B,IAAI,CAAC7B,MAAM,GAAGgB,QAAQ,CAACe,OAAO,EAAE;YAClC,MAAM,IAAIvC,KAAK,CAAE,oBAAmBwB,QAAQ,CAACe,OAAQ,IAAGR,kBAAkB,CAACP,QAAQ,CAACe,OAAO,CAAE,QAAOL,IAAK,WAAUG,IAAI,CAAC7B,MAAO,EAAC,CAAC;UACnI;UAEA,OAAO,IAAIgC,OAAO,CAAC,CAACV,OAAO,EAAEH,MAAM,KAAK;YACtC,IAAIH,QAAQ,CAACiB,oBAAoB,EAAE;cACjC;cACA;cACA;cACA,IAAI;gBACFL,MAAM,CAACF,IAAI,CAAC,CAAC,GAAGG,IAAI,EAAEf,YAAY,CAAC;kBAACQ,OAAO;kBAAEH;gBAAM,CAAC,EAAEH,QAAQ,CAAC,CAAC;cAClE,CAAC,CAAC,OAAOkB,OAAO,EAAE;gBAChBC,OAAO,CAACC,IAAI,CAAE,GAAEV,IAAK,8DAA6D,GACrE,8CAA8C,EAAEQ,OAAO,CAAC;gBAErEN,MAAM,CAACF,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;;gBAErB;gBACA;gBACAb,QAAQ,CAACiB,oBAAoB,GAAG,KAAK;gBACrCjB,QAAQ,CAACqB,UAAU,GAAG,IAAI;gBAE1Bf,OAAO,CAAC,CAAC;cACX;YACF,CAAC,MAAM,IAAIN,QAAQ,CAACqB,UAAU,EAAE;cAC9BT,MAAM,CAACF,IAAI,CAAC,CAAC,GAAGG,IAAI,CAAC;cACrBP,OAAO,CAAC,CAAC;YACX,CAAC,MAAM;cACLM,MAAM,CAACF,IAAI,CAAC,CAAC,GAAGG,IAAI,EAAEf,YAAY,CAAC;gBAACQ,OAAO;gBAAEH;cAAM,CAAC,EAAEH,QAAQ,CAAC,CAAC;YAClE;UACF,CAAC,CAAC;QACJ,CAAC;MACH,CAAC;;MAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACI,MAAMsB,UAAU,GAAGA,CAACV,MAAM,EAAEW,MAAM,EAAEC,OAAO,KAAK;QAC9C,OAAO,IAAIC,KAAK,CAACF,MAAM,EAAE;UACvBG,KAAKA,CAACC,YAAY,EAAEC,OAAO,EAAEf,IAAI,EAAE;YACjC,OAAOW,OAAO,CAACK,IAAI,CAACD,OAAO,EAAEhB,MAAM,EAAE,GAAGC,IAAI,CAAC;UAC/C;QACF,CAAC,CAAC;MACJ,CAAC;MAED,IAAIiB,cAAc,GAAGC,QAAQ,CAACF,IAAI,CAACG,IAAI,CAAClD,MAAM,CAACmD,SAAS,CAACH,cAAc,CAAC;;MAExE;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACI,MAAMI,UAAU,GAAGA,CAACtB,MAAM,EAAEuB,QAAQ,GAAG,CAAC,CAAC,EAAEnC,QAAQ,GAAG,CAAC,CAAC,KAAK;QAC3D,IAAIoC,KAAK,GAAGtD,MAAM,CAACuD,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAIC,QAAQ,GAAG;UACb7C,GAAGA,CAAC8C,WAAW,EAAEC,IAAI,EAAE;YACrB,OAAOA,IAAI,IAAI5B,MAAM,IAAI4B,IAAI,IAAIJ,KAAK;UACxC,CAAC;UAED7C,GAAGA,CAACgD,WAAW,EAAEC,IAAI,EAAEC,QAAQ,EAAE;YAC/B,IAAID,IAAI,IAAIJ,KAAK,EAAE;cACjB,OAAOA,KAAK,CAACI,IAAI,CAAC;YACpB;YAEA,IAAI,EAAEA,IAAI,IAAI5B,MAAM,CAAC,EAAE;cACrB,OAAOtB,SAAS;YAClB;YAEA,IAAIM,KAAK,GAAGgB,MAAM,CAAC4B,IAAI,CAAC;YAExB,IAAI,OAAO5C,KAAK,KAAK,UAAU,EAAE;cAC/B;cACA;;cAEA,IAAI,OAAOuC,QAAQ,CAACK,IAAI,CAAC,KAAK,UAAU,EAAE;gBACxC;gBACA5C,KAAK,GAAG0B,UAAU,CAACV,MAAM,EAAEA,MAAM,CAAC4B,IAAI,CAAC,EAAEL,QAAQ,CAACK,IAAI,CAAC,CAAC;cAC1D,CAAC,MAAM,IAAIV,cAAc,CAAC9B,QAAQ,EAAEwC,IAAI,CAAC,EAAE;gBACzC;gBACA;gBACA,IAAIhB,OAAO,GAAGf,iBAAiB,CAAC+B,IAAI,EAAExC,QAAQ,CAACwC,IAAI,CAAC,CAAC;gBACrD5C,KAAK,GAAG0B,UAAU,CAACV,MAAM,EAAEA,MAAM,CAAC4B,IAAI,CAAC,EAAEhB,OAAO,CAAC;cACnD,CAAC,MAAM;gBACL;gBACA;gBACA5B,KAAK,GAAGA,KAAK,CAACoC,IAAI,CAACpB,MAAM,CAAC;cAC5B;YACF,CAAC,MAAM,IAAI,OAAOhB,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI,KAC1CkC,cAAc,CAACK,QAAQ,EAAEK,IAAI,CAAC,IAC9BV,cAAc,CAAC9B,QAAQ,EAAEwC,IAAI,CAAC,CAAC,EAAE;cAC3C;cACA;cACA;cACA5C,KAAK,GAAGsC,UAAU,CAACtC,KAAK,EAAEuC,QAAQ,CAACK,IAAI,CAAC,EAAExC,QAAQ,CAACwC,IAAI,CAAC,CAAC;YAC3D,CAAC,MAAM,IAAIV,cAAc,CAAC9B,QAAQ,EAAE,GAAG,CAAC,EAAE;cACxC;cACAJ,KAAK,GAAGsC,UAAU,CAACtC,KAAK,EAAEuC,QAAQ,CAACK,IAAI,CAAC,EAAExC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1D,CAAC,MAAM;cACL;cACA;cACAlB,MAAM,CAAC4D,cAAc,CAACN,KAAK,EAAEI,IAAI,EAAE;gBACjCG,YAAY,EAAE,IAAI;gBAClBC,UAAU,EAAE,IAAI;gBAChBrD,GAAGA,CAAA,EAAG;kBACJ,OAAOqB,MAAM,CAAC4B,IAAI,CAAC;gBACrB,CAAC;gBACD9C,GAAGA,CAACE,KAAK,EAAE;kBACTgB,MAAM,CAAC4B,IAAI,CAAC,GAAG5C,KAAK;gBACtB;cACF,CAAC,CAAC;cAEF,OAAOA,KAAK;YACd;YAEAwC,KAAK,CAACI,IAAI,CAAC,GAAG5C,KAAK;YACnB,OAAOA,KAAK;UACd,CAAC;UAEDF,GAAGA,CAAC6C,WAAW,EAAEC,IAAI,EAAE5C,KAAK,EAAE6C,QAAQ,EAAE;YACtC,IAAID,IAAI,IAAIJ,KAAK,EAAE;cACjBA,KAAK,CAACI,IAAI,CAAC,GAAG5C,KAAK;YACrB,CAAC,MAAM;cACLgB,MAAM,CAAC4B,IAAI,CAAC,GAAG5C,KAAK;YACtB;YACA,OAAO,IAAI;UACb,CAAC;UAED8C,cAAcA,CAACH,WAAW,EAAEC,IAAI,EAAEK,IAAI,EAAE;YACtC,OAAOC,OAAO,CAACJ,cAAc,CAACN,KAAK,EAAEI,IAAI,EAAEK,IAAI,CAAC;UAClD,CAAC;UAEDE,cAAcA,CAACR,WAAW,EAAEC,IAAI,EAAE;YAChC,OAAOM,OAAO,CAACC,cAAc,CAACX,KAAK,EAAEI,IAAI,CAAC;UAC5C;QACF,CAAC;;QAED;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,IAAID,WAAW,GAAGzD,MAAM,CAACuD,MAAM,CAACzB,MAAM,CAAC;QACvC,OAAO,IAAIa,KAAK,CAACc,WAAW,EAAED,QAAQ,CAAC;MACzC,CAAC;;MAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACI,MAAMU,SAAS,GAAGC,UAAU,KAAK;QAC/BC,WAAWA,CAACtC,MAAM,EAAEuC,QAAQ,EAAE,GAAGtC,IAAI,EAAE;UACrCD,MAAM,CAACsC,WAAW,CAACD,UAAU,CAAC1D,GAAG,CAAC4D,QAAQ,CAAC,EAAE,GAAGtC,IAAI,CAAC;QACvD,CAAC;QAEDuC,WAAWA,CAACxC,MAAM,EAAEuC,QAAQ,EAAE;UAC5B,OAAOvC,MAAM,CAACwC,WAAW,CAACH,UAAU,CAAC1D,GAAG,CAAC4D,QAAQ,CAAC,CAAC;QACrD,CAAC;QAEDE,cAAcA,CAACzC,MAAM,EAAEuC,QAAQ,EAAE;UAC/BvC,MAAM,CAACyC,cAAc,CAACJ,UAAU,CAAC1D,GAAG,CAAC4D,QAAQ,CAAC,CAAC;QACjD;MACF,CAAC,CAAC;MAEF,MAAMG,yBAAyB,GAAG,IAAIrE,cAAc,CAACkE,QAAQ,IAAI;QAC/D,IAAI,OAAOA,QAAQ,KAAK,UAAU,EAAE;UAClC,OAAOA,QAAQ;QACjB;;QAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;QACM,OAAO,SAASI,iBAAiBA,CAACC,GAAG,EAAE;UACrC,MAAMC,UAAU,GAAGvB,UAAU,CAACsB,GAAG,EAAE,CAAC,CAAC,CAAC,gBAAgB;YACpDE,UAAU,EAAE;cACV5C,OAAO,EAAE,CAAC;cACVC,OAAO,EAAE;YACX;UACF,CAAC,CAAC;UACFoC,QAAQ,CAACM,UAAU,CAAC;QACtB,CAAC;MACH,CAAC,CAAC;MAEF,MAAME,iBAAiB,GAAG,IAAI1E,cAAc,CAACkE,QAAQ,IAAI;QACvD,IAAI,OAAOA,QAAQ,KAAK,UAAU,EAAE;UAClC,OAAOA,QAAQ;QACjB;;QAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;QACM,OAAO,SAASS,SAASA,CAACxD,OAAO,EAAEyD,MAAM,EAAEC,YAAY,EAAE;UACvD,IAAIC,mBAAmB,GAAG,KAAK;UAE/B,IAAIC,mBAAmB;UACvB,IAAIC,mBAAmB,GAAG,IAAIjD,OAAO,CAACV,OAAO,IAAI;YAC/C0D,mBAAmB,GAAG,SAAAA,CAASE,QAAQ,EAAE;cACvCH,mBAAmB,GAAG,IAAI;cAC1BzD,OAAO,CAAC4D,QAAQ,CAAC;YACnB,CAAC;UACH,CAAC,CAAC;UAEF,IAAIC,MAAM;UACV,IAAI;YACFA,MAAM,GAAGhB,QAAQ,CAAC/C,OAAO,EAAEyD,MAAM,EAAEG,mBAAmB,CAAC;UACzD,CAAC,CAAC,OAAOI,GAAG,EAAE;YACZD,MAAM,GAAGnD,OAAO,CAACb,MAAM,CAACiE,GAAG,CAAC;UAC9B;UAEA,MAAMC,gBAAgB,GAAGF,MAAM,KAAK,IAAI,IAAIxE,UAAU,CAACwE,MAAM,CAAC;;UAE9D;UACA;UACA;UACA,IAAIA,MAAM,KAAK,IAAI,IAAI,CAACE,gBAAgB,IAAI,CAACN,mBAAmB,EAAE;YAChE,OAAO,KAAK;UACd;;UAEA;UACA;UACA;UACA;UACA,MAAMO,kBAAkB,GAAIvE,OAAO,IAAK;YACtCA,OAAO,CAACF,IAAI,CAAC0E,GAAG,IAAI;cAClB;cACAT,YAAY,CAACS,GAAG,CAAC;YACnB,CAAC,EAAEC,KAAK,IAAI;cACV;cACA;cACA,IAAIpE,OAAO;cACX,IAAIoE,KAAK,KAAKA,KAAK,YAAYhG,KAAK,IAChC,OAAOgG,KAAK,CAACpE,OAAO,KAAK,QAAQ,CAAC,EAAE;gBACtCA,OAAO,GAAGoE,KAAK,CAACpE,OAAO;cACzB,CAAC,MAAM;gBACLA,OAAO,GAAG,8BAA8B;cAC1C;cAEA0D,YAAY,CAAC;gBACXW,iCAAiC,EAAE,IAAI;gBACvCrE;cACF,CAAC,CAAC;YACJ,CAAC,CAAC,CAACsE,KAAK,CAACN,GAAG,IAAI;cACd;cACAjD,OAAO,CAACqD,KAAK,CAAC,yCAAyC,EAAEJ,GAAG,CAAC;YAC/D,CAAC,CAAC;UACJ,CAAC;;UAED;UACA;UACA;UACA,IAAIC,gBAAgB,EAAE;YACpBC,kBAAkB,CAACH,MAAM,CAAC;UAC5B,CAAC,MAAM;YACLG,kBAAkB,CAACL,mBAAmB,CAAC;UACzC;;UAEA;UACA,OAAO,IAAI;QACb,CAAC;MACH,CAAC,CAAC;MAEF,MAAMU,0BAA0B,GAAGA,CAAC;QAACxE,MAAM;QAAEG;MAAO,CAAC,EAAEsE,KAAK,KAAK;QAC/D,IAAIhG,aAAa,CAACN,OAAO,CAAC4B,SAAS,EAAE;UACnC;UACA;UACA;UACA,IAAItB,aAAa,CAACN,OAAO,CAAC4B,SAAS,CAACE,OAAO,KAAK1B,gDAAgD,EAAE;YAChG4B,OAAO,CAAC,CAAC;UACX,CAAC,MAAM;YACLH,MAAM,CAAC,IAAI3B,KAAK,CAACI,aAAa,CAACN,OAAO,CAAC4B,SAAS,CAACE,OAAO,CAAC,CAAC;UAC5D;QACF,CAAC,MAAM,IAAIwE,KAAK,IAAIA,KAAK,CAACH,iCAAiC,EAAE;UAC3D;UACA;UACAtE,MAAM,CAAC,IAAI3B,KAAK,CAACoG,KAAK,CAACxE,OAAO,CAAC,CAAC;QAClC,CAAC,MAAM;UACLE,OAAO,CAACsE,KAAK,CAAC;QAChB;MACF,CAAC;MAED,MAAMC,kBAAkB,GAAGA,CAACnE,IAAI,EAAEV,QAAQ,EAAE8E,eAAe,EAAE,GAAGjE,IAAI,KAAK;QACvE,IAAIA,IAAI,CAAC7B,MAAM,GAAGgB,QAAQ,CAACc,OAAO,EAAE;UAClC,MAAM,IAAItC,KAAK,CAAE,qBAAoBwB,QAAQ,CAACc,OAAQ,IAAGP,kBAAkB,CAACP,QAAQ,CAACc,OAAO,CAAE,QAAOJ,IAAK,WAAUG,IAAI,CAAC7B,MAAO,EAAC,CAAC;QACpI;QAEA,IAAI6B,IAAI,CAAC7B,MAAM,GAAGgB,QAAQ,CAACe,OAAO,EAAE;UAClC,MAAM,IAAIvC,KAAK,CAAE,oBAAmBwB,QAAQ,CAACe,OAAQ,IAAGR,kBAAkB,CAACP,QAAQ,CAACe,OAAO,CAAE,QAAOL,IAAK,WAAUG,IAAI,CAAC7B,MAAO,EAAC,CAAC;QACnI;QAEA,OAAO,IAAIgC,OAAO,CAAC,CAACV,OAAO,EAAEH,MAAM,KAAK;UACtC,MAAM4E,SAAS,GAAGJ,0BAA0B,CAAC3C,IAAI,CAAC,IAAI,EAAE;YAAC1B,OAAO;YAAEH;UAAM,CAAC,CAAC;UAC1EU,IAAI,CAACmE,IAAI,CAACD,SAAS,CAAC;UACpBD,eAAe,CAACG,WAAW,CAAC,GAAGpE,IAAI,CAAC;QACtC,CAAC,CAAC;MACJ,CAAC;MAED,MAAMqE,cAAc,GAAG;QACrBC,QAAQ,EAAE;UACRC,OAAO,EAAE;YACP7B,iBAAiB,EAAEP,SAAS,CAACM,yBAAyB;UACxD;QACF,CAAC;QACDhF,OAAO,EAAE;UACPsF,SAAS,EAAEZ,SAAS,CAACW,iBAAiB,CAAC;UACvC0B,iBAAiB,EAAErC,SAAS,CAACW,iBAAiB,CAAC;UAC/CsB,WAAW,EAAEJ,kBAAkB,CAAC7C,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE;YAAClB,OAAO,EAAE,CAAC;YAAEC,OAAO,EAAE;UAAC,CAAC;QACpF,CAAC;QACDuE,IAAI,EAAE;UACJL,WAAW,EAAEJ,kBAAkB,CAAC7C,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE;YAAClB,OAAO,EAAE,CAAC;YAAEC,OAAO,EAAE;UAAC,CAAC;QACpF;MACF,CAAC;MACD,MAAMwE,eAAe,GAAG;QACtBC,KAAK,EAAE;UAAC1E,OAAO,EAAE,CAAC;UAAEC,OAAO,EAAE;QAAC,CAAC;QAC/BxB,GAAG,EAAE;UAACuB,OAAO,EAAE,CAAC;UAAEC,OAAO,EAAE;QAAC,CAAC;QAC7BrB,GAAG,EAAE;UAACoB,OAAO,EAAE,CAAC;UAAEC,OAAO,EAAE;QAAC;MAC9B,CAAC;MACDlC,WAAW,CAAC4G,OAAO,GAAG;QACpBL,OAAO,EAAE;UAAC,GAAG,EAAEG;QAAe,CAAC;QAC/BG,QAAQ,EAAE;UAAC,GAAG,EAAEH;QAAe,CAAC;QAChCI,QAAQ,EAAE;UAAC,GAAG,EAAEJ;QAAe;MACjC,CAAC;MAED,OAAOrD,UAAU,CAACtD,aAAa,EAAEsG,cAAc,EAAErG,WAAW,CAAC;IAC/D,CAAC;;IAED;IACA;IACA+G,MAAM,CAACC,OAAO,GAAGlH,QAAQ,CAACN,MAAM,CAAC;EACnC,CAAC,MAAM;IACLuH,MAAM,CAACC,OAAO,GAAGzH,UAAU,CAACK,OAAO;EACrC;AAAC","ignoreList":[]}
\No newline at end of file
\ No newline at end of file diff --git a/src/templates/join_game.html b/src/templates/join_game.html index dbe2be4..63824f3 100644 --- a/src/templates/join_game.html +++ b/src/templates/join_game.html @@ -3,6 +3,7 @@ Ozai webui:Join Game + +
@@ -115,4 +114,4 @@
- \ No newline at end of file +