├── docs ├── logo.png ├── reply.gif ├── options.png └── screenshot.png ├── icons ├── 128.png ├── 16.png ├── 32.png ├── 48.png ├── button.svg └── button_error.svg ├── src ├── utils │ └── wait.ts ├── settings │ ├── components │ │ ├── space.tsx │ │ ├── text_input.tsx │ │ ├── text.tsx │ │ ├── selector.tsx │ │ └── checkbox.tsx │ ├── settings.tsx │ ├── settings_screen.styled.ts │ └── settings_screen.tsx ├── inject │ ├── utils │ │ └── generate_text.ts │ ├── dom │ │ ├── set_input_text.ts │ │ ├── find_closest_input.ts │ │ ├── create_observer.ts │ │ └── add_gpt_button.ts │ └── inject.ts └── background │ ├── background.ts │ └── chat_gpt_client │ ├── chat_gpt_client.ts │ └── locales.ts ├── .gitignore ├── tsconfig.json ├── assets ├── unchecked.svg ├── checked.svg └── settings.html ├── webpack.config.js ├── manifest.json ├── package.json ├── LICENCE ├── css └── inject.css ├── README.MD ├── lib ├── background.js └── inject.js └── yarn.lock /docs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/logo.png -------------------------------------------------------------------------------- /docs/reply.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/reply.gif -------------------------------------------------------------------------------- /icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/128.png -------------------------------------------------------------------------------- /icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/16.png -------------------------------------------------------------------------------- /icons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/32.png -------------------------------------------------------------------------------- /icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/icons/48.png -------------------------------------------------------------------------------- /docs/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/options.png -------------------------------------------------------------------------------- /docs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yaroslav-n/tweetGPT/HEAD/docs/screenshot.png -------------------------------------------------------------------------------- /src/utils/wait.ts: -------------------------------------------------------------------------------- 1 | export const wait = (timeout: number) => { 2 | return new Promise((res) => setTimeout(() => res(null), timeout)); 3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log* 2 | yarn-debug.log* 3 | yarn-error.log* 4 | 5 | node_modules/ 6 | .vscode 7 | .history 8 | */.DS_Store 9 | .DS_Store 10 | *.zip -------------------------------------------------------------------------------- /src/settings/components/space.tsx: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Space = styled.div((props: { height: number }) => ` 4 | height: ${props.height}px; 5 | `); -------------------------------------------------------------------------------- /src/settings/settings.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import { SettingsScreen } from './settings_screen'; 4 | 5 | const root = createRoot( 6 | document.getElementById('root')! 7 | ); 8 | 9 | root.render(); -------------------------------------------------------------------------------- /src/inject/utils/generate_text.ts: -------------------------------------------------------------------------------- 1 | import { TweetProps } from "../../background/chat_gpt_client/chat_gpt_client"; 2 | 3 | export const generateText = (props: TweetProps): Promise => { 4 | return new Promise((resolve) => { 5 | chrome.runtime.sendMessage({type: 'generate_tweet', props}, response => resolve(response)); 6 | }); 7 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "moduleResolution": "node", 5 | "types": ["node", "chrome"], 6 | "jsx": "react", 7 | "allowJs": false, 8 | "removeComments": false, 9 | "strict": true, 10 | "skipLibCheck": true, 11 | }, 12 | "include": ["src/**/*"], 13 | "exclude": ["node_modules"] 14 | } 15 | -------------------------------------------------------------------------------- /src/settings/components/text_input.tsx: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const TextInput = styled.input` 4 | box-sizing: border-box; 5 | width: 100%; 6 | height: 40px; 7 | padding: 0 10px; 8 | background: #FFFFFF; 9 | border: 1px solid #D1D9DD; 10 | color: #181C21; 11 | font-size: 15px; 12 | border-radius: 5px; 13 | 14 | ::placeholder { 15 | color: #D1D9DD; 16 | } 17 | `; -------------------------------------------------------------------------------- /assets/unchecked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/settings/components/text.tsx: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const H1 = styled.h1` 4 | font-size: 25px; 5 | font-weight: bold; 6 | color: #181C21; 7 | margin: 0; 8 | `; 9 | 10 | export const H2 = styled.h2` 11 | font-size: 18px; 12 | font-weight: 600; 13 | color: #181C21; 14 | margin: 0; 15 | ` 16 | 17 | export const Subtitle = styled.span` 18 | font-size: 15px; 19 | color: #566370; 20 | 21 | a { 22 | color: #566370; 23 | } 24 | ` -------------------------------------------------------------------------------- /assets/checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/settings.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | TweetGPT Settings 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/inject/dom/set_input_text.ts: -------------------------------------------------------------------------------- 1 | export const setInputText = async (el: any, text: string) => { 2 | const dataTransfer = new DataTransfer(); 3 | 4 | // this may be 'text/html' if it's required 5 | dataTransfer.setData("text/plain", text); 6 | 7 | el.dispatchEvent( 8 | new ClipboardEvent("paste", { 9 | clipboardData: dataTransfer, 10 | 11 | // need these for the event to reach Draft paste handler 12 | bubbles: true, 13 | cancelable: true, 14 | }) 15 | ); 16 | 17 | // clear DataTransfer Data 18 | dataTransfer.clearData(); 19 | }; 20 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | mode: "production", 5 | entry: { 6 | inject: "./src/inject/inject.ts", 7 | background: "./src/background/background.ts", 8 | settings: './src/settings/settings.tsx', 9 | }, 10 | optimization: { 11 | minimize: false 12 | }, 13 | output: { 14 | path: path.resolve(__dirname, './lib'), 15 | filename: "[name].js" 16 | }, 17 | resolve: { 18 | extensions: [".ts", ".tsx", ".js"], 19 | }, 20 | module: { 21 | rules: [ 22 | { 23 | test: /\.tsx?$/, 24 | loader: "ts-loader" 25 | } 26 | ] 27 | } 28 | }; -------------------------------------------------------------------------------- /src/inject/dom/find_closest_input.ts: -------------------------------------------------------------------------------- 1 | // can be more optimised, but ¯\_(ツ)_/¯, typically common container is just 2-3 levels higher 2 | export const findClosestInput: (el: Element) => HTMLElement | null = (el) => { 3 | // Adjust the selector to target the contenteditable div 4 | const contentEditableEl = el.querySelector("div[data-testid^='tweetTextarea_'][contenteditable='true']") as HTMLElement; 5 | if (contentEditableEl) { 6 | return contentEditableEl; 7 | } 8 | 9 | // Recurse up the DOM tree if the element is not found 10 | if (!el.parentElement) { 11 | return null; 12 | } else { 13 | return findClosestInput(el.parentElement); 14 | } 15 | }; -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TweetGPT", 3 | "manifest_version": 3, 4 | "version": "2.0.3", 5 | "description": "Helps writing tweets using chatGPT", 6 | "permissions": [ 7 | "storage", 8 | "scripting", 9 | "notifications" 10 | ], 11 | "host_permissions": [ 12 | "https://twitter.com/", 13 | "https://api.openai.com/" 14 | ], 15 | "externally_connectable": { 16 | "matches": ["https://twitter.com/*"] 17 | }, 18 | "icons": { 19 | "16": "icons/16.png", 20 | "32": "icons/32.png", 21 | "48": "icons/48.png", 22 | "128": "icons/128.png" 23 | }, 24 | "background": { 25 | "service_worker": "lib/background.js" 26 | }, 27 | "web_accessible_resources": [ 28 | { 29 | "resources": ["icons/button.svg", "icons/button_error.svg", "assets/settings.html"], 30 | "matches": ["https://twitter.com/*"] 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitter-gpt", 3 | "version": "2.0.1", 4 | "description": "A chrome extension that writes tweets with chatGPT", 5 | "main": "lib/background.js", 6 | "author": "Yaroslav https://twitter.com/512x512", 7 | "license": "MIT", 8 | "scripts": { 9 | "build": "yarn clean && webpack", 10 | "watch": "yarn clean && webpack -w", 11 | "clean": "rm -rf ./lib/*", 12 | "package": "rm -f ./extension.zip && yarn build && zip -r -X extension.zip *" 13 | }, 14 | "dependencies": { 15 | "react": "^18.2.0", 16 | "react-dom": "^18.2.0", 17 | "styled-components": "^5.3.10", 18 | "typescript": "^4.9.3" 19 | }, 20 | "devDependencies": { 21 | "@types/chrome": "^0.0.203", 22 | "@types/node": "^18.11.11", 23 | "@types/react": "^18.0.38", 24 | "@types/react-dom": "^18.0.11", 25 | "@types/styled-components": "^5.1.26", 26 | "ts-loader": "^9.4.2", 27 | "webpack": "^5.75.0", 28 | "webpack-cli": "^5.0.1" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /icons/button.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/settings/settings_screen.styled.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Body = styled.div` 4 | display: flex; 5 | width: 100%; 6 | height: 100%; 7 | flex-direction: column; 8 | align-items: center; 9 | justify-content: flex-start; 10 | padding-top: 50px; 11 | background-color: #F7F9F9; 12 | font-family: 'Roboto', sans-serif; 13 | box-sizing: border-box; 14 | `; 15 | 16 | export const Container = styled.div` 17 | width: 600px; 18 | padding: 35px 25px; 19 | border-radius: 10px; 20 | background-color: white; 21 | display: flex; 22 | flex-direction: column; 23 | `; 24 | 25 | 26 | export const Logo = styled.img` 27 | width: 80px; 28 | height: 80px; 29 | margin-bottom: 25px; 30 | `; 31 | 32 | export const SettingsBlock = styled.div` 33 | width: 100%; 34 | margin-top: 25px; 35 | display: flex; 36 | justify-content: flex-start; 37 | align-items: flex-start; 38 | flex-direction: column; 39 | `; 40 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Yaroslav Nazarov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/inject/dom/create_observer.ts: -------------------------------------------------------------------------------- 1 | type ElementObserver = ( 2 | selector: string, 3 | onInputAdded: (el: Element) => void, 4 | onInputRemoved: (el: Element) => void, 5 | ) => MutationObserver; 6 | 7 | export const createObserver: ElementObserver = (selector, onInputAdded, onInputRemoved) => { 8 | return new MutationObserver((mutations_list) => { 9 | mutations_list.forEach((mutation) => { 10 | const addedNodes = mutation.addedNodes as unknown as HTMLElement[]; // wrong typings 11 | addedNodes.forEach((added_node) => { 12 | if (added_node.querySelector) { 13 | const inputEl = added_node.querySelector(selector); 14 | if (!!inputEl) { 15 | onInputAdded(inputEl); 16 | }; 17 | } 18 | }); 19 | 20 | const removedNodes = mutation.removedNodes as unknown as HTMLElement[]; 21 | removedNodes.forEach((removed_node) => { 22 | if (removed_node.querySelector) { 23 | const inputEl = removed_node.querySelector(selector); 24 | if (!!inputEl) { 25 | onInputRemoved(inputEl); 26 | }; 27 | } 28 | }); 29 | }); 30 | }); 31 | } 32 | -------------------------------------------------------------------------------- /src/settings/components/selector.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { FC } from "react"; 3 | import styled from 'styled-components'; 4 | 5 | export type languageOption = { 6 | value: string; 7 | label: string; 8 | } 9 | 10 | type Props = { 11 | value: string; 12 | onChange: (newVal: string) => void; 13 | options: languageOption[]; 14 | }; 15 | 16 | export const Selector: FC = ({ value, onChange, options }) => { 17 | return ( 18 | 19 | 24 | 25 | ) 26 | }; 27 | 28 | const Container = styled.div` 29 | border: 1px solid #ccc; 30 | border-radius: 3px; 31 | padding-right: 10px; 32 | width: 100%; 33 | `; 34 | 35 | const Select = styled.select` 36 | border-radius: 3px; 37 | border-width: 0; 38 | padding: 7px 10px; 39 | font-size: 15px; 40 | font-family: 'Roboto', sans-serif; 41 | color: #333; 42 | cursor: pointer; 43 | outline: none; 44 | width: 100%; 45 | box-sizing: border-box; 46 | `; -------------------------------------------------------------------------------- /icons/button_error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /css/inject.css: -------------------------------------------------------------------------------- 1 | .gptIconWrapper { 2 | min-width: 36px; 3 | min-height: 36px; 4 | border-radius: 100px; 5 | cursor: pointer; 6 | display: flex; 7 | justify-content: center; 8 | align-items: center; 9 | user-select: none; 10 | } 11 | 12 | .gptIconWrapper:hover { 13 | background-color: rgba(29, 155, 240, 0.1); 14 | } 15 | 16 | .gptIconWrapper.loading { 17 | animation: pulsate 1s linear infinite; 18 | pointer-events: none; 19 | cursor: default; 20 | background-color: transparent !important; 21 | } 22 | 23 | .gptIcon { 24 | max-height: 20px; 25 | max-width: 20px; 26 | } 27 | 28 | .gptIcon.error { 29 | animation: error 0.5s linear 2; 30 | } 31 | 32 | .gptSelector { 33 | cursor: pointer; 34 | padding: 10px 10px; 35 | } 36 | 37 | .gptSelector:hover { 38 | background-color: rgb(247, 249, 249); 39 | } 40 | 41 | .gptSeparator { 42 | height: 1px; 43 | width: 100%; 44 | background-color: rgba(0,0,0,0.05); 45 | } 46 | 47 | .gptSelectorContainer { 48 | position: absolute; 49 | z-index: 999999; 50 | font-family: TwitterChirp, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; 51 | color: rgb(15, 20, 25); 52 | font-size: 15px; 53 | background-color: white; 54 | border-radius: 10px; 55 | overflow: hidden; 56 | box-shadow: rgb(101 119 134 / 20%) 0px 0px 15px, rgb(101 119 134 / 15%) 0px 0px 3px 1px; 57 | } 58 | 59 | @keyframes pulsate { 60 | from { opacity: 1; } 61 | 50% { opacity: 0.3; } 62 | to { opacity: 1; } 63 | } 64 | 65 | @keyframes error { 66 | from { transform: scale(1); } 67 | 50% { transform: scale(1.3); } 68 | to { transform: scale(1); } 69 | } -------------------------------------------------------------------------------- /src/background/background.ts: -------------------------------------------------------------------------------- 1 | import { ChatGPTClient, TweetProps } from "./chat_gpt_client/chat_gpt_client"; 2 | 3 | chrome.scripting.registerContentScripts([ 4 | { 5 | id: `main_context_inject_${Math.random()}`, 6 | world: "ISOLATED", 7 | matches: ["https://twitter.com/*"], 8 | js: ["lib/inject.js"], 9 | css: ["css/inject.css"], 10 | }, 11 | ]); 12 | 13 | chrome.runtime.onInstalled.addListener(function (object) { 14 | let internalUrl = chrome.runtime.getURL("assets/settings.html"); 15 | chrome.tabs.create({ url: internalUrl }); 16 | }); 17 | 18 | 19 | const gptChat = new ChatGPTClient(); 20 | 21 | type Message = { 22 | type: 'generate_tweet'; 23 | props: TweetProps; 24 | } 25 | 26 | chrome.runtime.onMessage.addListener((message: Message, sender, sendResponse) => { 27 | if (!message.type) { 28 | return; 29 | } 30 | 31 | switch(message.type) { 32 | case 'generate_tweet': 33 | gptChat.generateTweet(message.props).then( 34 | async (text) => { 35 | if (!text) { 36 | return sendResponse(undefined); 37 | } 38 | 39 | let finalText = text; 40 | const savedSettings = await chrome.storage.local.get('isAddSignature') 41 | const isAddSignature = savedSettings.isAddSignature ?? true; 42 | if (isAddSignature) { 43 | finalText = text + ' — tweetGPT'; 44 | } 45 | sendResponse(finalText); 46 | }, 47 | () => sendResponse(undefined) 48 | ); 49 | break; 50 | } 51 | 52 | return true; 53 | }); -------------------------------------------------------------------------------- /src/settings/components/checkbox.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { FC } from "react"; 3 | import styled from "styled-components"; 4 | 5 | type Props = { 6 | value: boolean; 7 | label: string; 8 | onChange: (newVal: boolean) => void; 9 | } 10 | 11 | const icons = { 12 | checked: chrome.runtime.getURL("assets/checked.svg"), 13 | uncheked: chrome.runtime.getURL("assets/unchecked.svg"), 14 | }; 15 | 16 | export const Checkbox: FC = ({ value, label, onChange}) => { 17 | const src = value && icons.checked || icons.uncheked; 18 | 19 | return ( 20 | onChange(!value)}> 21 |
22 | 23 | 24 |
25 | 26 |
27 | ) 28 | } 29 | 30 | const Container = styled.div` 31 | cursor: pointer; 32 | 33 | .iconContainer { 34 | /* padding: 10px; */ 35 | border-radius: 3px; 36 | float:left; 37 | position: relative; 38 | } 39 | 40 | &:hover { 41 | .iconContainer { 42 | outline: 5px solid rgba(0,0,0,0.07); 43 | } 44 | } 45 | ` 46 | 47 | const CheckboxSquare = styled.input` 48 | position: absolute; 49 | left: 0; 50 | top: 0; 51 | width: 100%; 52 | height: 100%; 53 | margin: 0; 54 | opacity: 0; 55 | cursor: pointer; 56 | ` 57 | 58 | const Icon = styled.img` 59 | width: 18px; 60 | height: 18px; 61 | ` 62 | 63 | 64 | const Label = styled.label` 65 | margin-left: 10px; 66 | font-size: 15px; 67 | cursor: pointer; 68 | color: #181C21; 69 | user-select: none; 70 | ` -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Archived 4 | This open-source version of the extension is no longer supported. You can install the proprietary version from https://typebar.app 5 | 6 | # tweetGPT Chrome Extension - Community Edition 7 | This is an open-source edition of the [TweetGPT chrome extension](https://chrome.google.com/webstore/detail/tweetgpt/lkjblpoingopdeaofcaapmeoojjjnhnc). It doesn't use TweetGPT backend and only relies on your own OpenAI API credentials. 8 | 9 | ## Requirements 10 | To use this extension, will you need: 11 | * Twitter account 12 | * OpenAI [API KEY](https://platform.openai.com/account/api-keys) 13 | * Chrome browser 14 | 15 | ## Installation 16 | 1. Clone this repo to your machine 17 | 2. Open [chrome://extensions/](chrome://extensions/) in your browser 18 | 3. Check the box for Developer mode in the top right 19 | 4. Press __Load Unpacked__ button and select the folder with the code 20 | 5. The settings screen should open, where you need to put your OpenAI API Key. You can find your API key on [this page](https://platform.openai.com/account/api-keys). 21 | 22 | You can start using the extension now. 23 | 24 | 25 | ## How to use tweetGPT 26 | When you open a new tab with Twitter, you will see this icon under the tweet section: 27 | 28 | 29 | 30 | When you press it, it will let you select a type of tweet to generate. The types include positive, negative, controversial, etc. 31 | 32 | 33 | 34 | Once selected, the extension will write a new tweet. 35 | 36 | For a reply, it will generate a tweet based on the original tweet. For a new tweet, it will ask for a topic you want to write tweet about. 37 | 38 | 39 | 40 | ## ⚠️ Warning 41 | Depending on the tweet type, TweetGPT can sometimes generate controversial or even offensive tweets. 42 | Remember, this is like an L2 autopilot - the driver is responsible for the outcome. Don't tweet what you disagree with, just re-generate the tweet instead. 43 | -------------------------------------------------------------------------------- /src/inject/inject.ts: -------------------------------------------------------------------------------- 1 | import { addGPTButton, showErrorButton } from "./dom/add_gpt_button"; 2 | import { createObserver } from "./dom/create_observer"; 3 | import { findClosestInput } from "./dom/find_closest_input"; 4 | import { generateText } from "./utils/generate_text"; 5 | import { setInputText } from "./dom/set_input_text"; 6 | import { defaultLocale } from "../background/chat_gpt_client/locales"; 7 | const onToolBarAdded = (toolBarEl: Element) => { 8 | let inputEl = findClosestInput(toolBarEl); 9 | if (inputEl) { 10 | addGPTButton(toolBarEl, async (type: string, topic?: string) => { 11 | (toolBarEl as HTMLDivElement).click(); 12 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]"); 13 | let replyTo: string | undefined = undefined; 14 | if (!!replyToTweet) { 15 | const textEl = replyToTweet.querySelector("div[data-testid=\"tweetText\"]"); 16 | if (!textEl || !textEl.textContent) { 17 | showErrorButton(toolBarEl); 18 | return; 19 | } 20 | 21 | replyTo = textEl.textContent; 22 | } 23 | 24 | const text = await generateText({ 25 | locale: (await chrome.storage.local.get('language')).language ?? defaultLocale, 26 | type, 27 | replyTo, 28 | topic 29 | }); 30 | if (text) { 31 | inputEl = findClosestInput(toolBarEl); 32 | if (inputEl) { 33 | setInputText(inputEl, text); 34 | } 35 | } else { // show error 36 | showErrorButton(toolBarEl); 37 | } 38 | }); 39 | } 40 | } 41 | 42 | const onToolBarRemoved = (toolBarEl: Element) => {} 43 | 44 | // observe dom tree to detect all tweet inputs once they are created 45 | const toolbarObserver = createObserver("div[data-testid=\"toolBar\"]", onToolBarAdded, onToolBarRemoved); 46 | const reactRoot = document.querySelector("#react-root") as unknown as Node; 47 | toolbarObserver.observe(reactRoot, { subtree: true, childList: true }); -------------------------------------------------------------------------------- /src/background/chat_gpt_client/chat_gpt_client.ts: -------------------------------------------------------------------------------- 1 | const GPT_TOKEN_NAME = 'openAIToken'; 2 | 3 | export type TweetProps = { 4 | type: string, 5 | topic?: string, 6 | locale: string, 7 | replyTo?: string, 8 | } 9 | 10 | export class ChatGPTClient { 11 | waitForTokenCallback: ((newGptToken: string) => void) | undefined; 12 | async generateTweet(props: TweetProps): Promise { 13 | const token = await this.getToken(); 14 | 15 | if (!token) { 16 | return Promise.reject(); 17 | } 18 | 19 | const systemMessage = `You are a ghostwriter for users tweets. Use locale "${props.locale}". Return only one tweet. Keep it short.`; 20 | const systemMessage2 = 21 | "Exclude everything after the tweet. Exclude hashtags. Exclude emojis. Don't apologize. Don't provide translation. Don't provide notes. Exclude сalls to action."; 22 | const userMessage = `Write a ${props.type} tweet${ 23 | props.topic ? ` about ${props.topic}` : "" 24 | }${props.replyTo ? ` in reply to a tweet "${props.replyTo}"` : ""}`; 25 | 26 | const body = { 27 | stream: false, 28 | model: "gpt-3.5-turbo", 29 | messages: [ 30 | { role: "system", content: systemMessage }, 31 | { role: "system", content: systemMessage2 }, 32 | { role: "user", content: userMessage }, 33 | ], 34 | }; 35 | 36 | try { 37 | const response = await fetch(`https://api.openai.com/v1/chat/completions`, { 38 | method: 'POST', 39 | headers: { 40 | 'Content-Type': 'application/json', 41 | 'authorization': `Bearer ${token}`, 42 | }, 43 | body: JSON.stringify(body), 44 | }); 45 | 46 | if (response.status === 403) { 47 | await chrome.storage.local.remove(GPT_TOKEN_NAME) 48 | } 49 | 50 | if (response.status !== 200) { 51 | console.error(JSON.stringify(response.body)); 52 | chrome.notifications.create( 53 | "TextGenerationError", 54 | { 55 | type: 'basic', 56 | iconUrl: "./icons/32.png", 57 | title: 'Error', 58 | message: JSON.stringify(response.body), 59 | priority: 2, 60 | } 61 | ); 62 | return Promise.reject(); 63 | } 64 | 65 | const responseJSON = await response.json(); 66 | const tweet = responseJSON?.choices[0].message?.content || ''; 67 | return tweet.trim() 68 | .replace(/^\"/g, "") 69 | .replace(/\"$/g, "") 70 | .trim(); 71 | } catch(e) { 72 | console.error(e); 73 | return Promise.reject(); 74 | } 75 | } 76 | 77 | getTextFromResponse(response: string): string { 78 | const message = JSON.parse(response); 79 | let tweet = message?.message?.content?.parts[0] || ''; 80 | tweet = tweet.trim().replace(/"([^"]*)[#"]?/g, '$1'); 81 | 82 | return tweet; 83 | } 84 | 85 | async getToken(): Promise { 86 | const result = await chrome.storage.local.get(GPT_TOKEN_NAME); 87 | 88 | if (!result[GPT_TOKEN_NAME]) { 89 | let internalUrl = chrome.runtime.getURL("assets/settings.html"); 90 | chrome.tabs.create({ url: internalUrl }); 91 | } 92 | 93 | return result[GPT_TOKEN_NAME]; 94 | } 95 | } -------------------------------------------------------------------------------- /src/settings/settings_screen.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { useMemo, useEffect, useState, useCallback } from 'react'; 3 | import { Body, Container, Logo, SettingsBlock } from './settings_screen.styled'; 4 | import { Checkbox } from './components/checkbox'; 5 | import { Selector, languageOption } from './components/selector'; 6 | import { TextInput } from './components/text_input'; 7 | import { H1, H2, Subtitle } from './components/text'; 8 | import { Space } from './components/space'; 9 | import { locales } from '../background/chat_gpt_client/locales'; 10 | import { defaultLocale } from '../background/chat_gpt_client/locales'; 11 | 12 | export const SettingsScreen = () => { 13 | const logoPath = useMemo(() => chrome.runtime.getURL('icons/128.png'), []); 14 | const [openAIToken, setOpenAIToken] = useState(''); 15 | const [selectedLanguage, setLanguage] = useState(defaultLocale); 16 | const [isAddSignature, setAddSignature] = useState(true); 17 | const [isAddTopicForReplies, setTopicForReplies] = useState(false); 18 | 19 | const changeOpenAIToken = useCallback(async (newToken: string) => { 20 | await chrome.storage.local.set({ openAIToken: newToken }); 21 | setOpenAIToken(newToken); 22 | }, []); 23 | 24 | const changeSignature = useCallback(async (isNewAddSignature: boolean) => { 25 | console.log('>>>', isNewAddSignature); 26 | await chrome.storage.local.set({ isAddSignature: isNewAddSignature }); 27 | setAddSignature(isNewAddSignature); 28 | }, []); 29 | 30 | const changeTopic = useCallback(async (isAddTopicForReplies: boolean) => { 31 | await chrome.storage.local.set({ isAddTopicForReplies }); 32 | setTopicForReplies(isAddTopicForReplies); 33 | }, []); 34 | 35 | const changeLanguage = useCallback(async (language: string) => { 36 | await chrome.storage.local.set({ language }); 37 | setLanguage(language); 38 | }, []); 39 | 40 | useEffect(() => { 41 | chrome.storage.local.get(['language', 'isAddSignature', 'isAddTopicForReplies', 'openAIToken']).then((state) => { 42 | if (state['language']) { 43 | setLanguage(state['language']); 44 | } 45 | if (state['isAddSignature'] != null) { 46 | setAddSignature(state['isAddSignature']); 47 | } 48 | if (state['isAddTopicForReplies'] != null) { 49 | setTopicForReplies(state['isAddTopicForReplies']); 50 | } 51 | if (state['openAIToken']) { 52 | setOpenAIToken(state['openAIToken']); 53 | } 54 | }); 55 | }, []); 56 | 57 | const languageOptions: languageOption[] = useMemo(() =>{ 58 | const codes = Object.keys(locales); 59 | 60 | return codes.map(code => ({ 61 | value: code, 62 | label: locales[code][0] 63 | })); 64 | }, []); 65 | 66 | const warning = useMemo(() => { 67 | return openAIToken.length === 0 ? '⚠️' : ''; 68 | }, [openAIToken === '']); 69 | 70 | return ( 71 | 72 | 73 | 74 |

TweetGPT Settings

75 | 76 |

OpenAI API Token {warning}

77 | 78 | Required. You can find your Secret API key in your OpenAI User settings. 79 | 80 | changeOpenAIToken(e.target.value)}/> 81 |
82 | 83 |

Text Generation

84 | 85 | 86 | 87 | 88 |
89 | 90 |

Language

91 | 92 | 93 |
94 |
95 | 96 | ) 97 | }; -------------------------------------------------------------------------------- /src/background/chat_gpt_client/locales.ts: -------------------------------------------------------------------------------- 1 | export const locales: Record = { 2 | "af-ZA": [ 3 | "Afrikaans", 4 | "Afrikaans" 5 | ], 6 | "ar": [ 7 | "العربية", 8 | "Arabic" 9 | ], 10 | "bg-BG": [ 11 | "Български", 12 | "Bulgarian" 13 | ], 14 | "ca-AD": [ 15 | "Català", 16 | "Catalan" 17 | ], 18 | "cs-CZ": [ 19 | "Čeština", 20 | "Czech" 21 | ], 22 | "cy-GB": [ 23 | "Cymraeg", 24 | "Welsh" 25 | ], 26 | "da-DK": [ 27 | "Dansk", 28 | "Danish" 29 | ], 30 | "de-AT": [ 31 | "Deutsch (Österreich)", 32 | "German (Austria)" 33 | ], 34 | "de-CH": [ 35 | "Deutsch (Schweiz)", 36 | "German (Switzerland)" 37 | ], 38 | "de-DE": [ 39 | "Deutsch (Deutschland)", 40 | "German (Germany)" 41 | ], 42 | "el-GR": [ 43 | "Ελληνικά", 44 | "Greek" 45 | ], 46 | "en-GB": [ 47 | "English (UK)", 48 | "English (UK)" 49 | ], 50 | "en-US": [ 51 | "English (US)", 52 | "English (US)" 53 | ], 54 | "es-CL": [ 55 | "Español (Chile)", 56 | "Spanish (Chile)" 57 | ], 58 | "es-ES": [ 59 | "Español (España)", 60 | "Spanish (Spain)" 61 | ], 62 | "es-MX": [ 63 | "Español (México)", 64 | "Spanish (Mexico)" 65 | ], 66 | "et-EE": [ 67 | "Eesti keel", 68 | "Estonian" 69 | ], 70 | "eu": [ 71 | "Euskara", 72 | "Basque" 73 | ], 74 | "fa-IR": [ 75 | "فارسی", 76 | "Persian" 77 | ], 78 | "fi-FI": [ 79 | "Suomi", 80 | "Finnish" 81 | ], 82 | "fr-CA": [ 83 | "Français (Canada)", 84 | "French (Canada)" 85 | ], 86 | "fr-FR": [ 87 | "Français (France)", 88 | "French (France)" 89 | ], 90 | "he-IL": [ 91 | "עברית", 92 | "Hebrew" 93 | ], 94 | "hi-IN": [ 95 | "हिंदी", 96 | "Hindi" 97 | ], 98 | "hr-HR": [ 99 | "Hrvatski", 100 | "Croatian" 101 | ], 102 | "hu-HU": [ 103 | "Magyar", 104 | "Hungarian" 105 | ], 106 | "id-ID": [ 107 | "Bahasa Indonesia", 108 | "Indonesian" 109 | ], 110 | "is-IS": [ 111 | "Íslenska", 112 | "Icelandic" 113 | ], 114 | "it-IT": [ 115 | "Italiano", 116 | "Italian" 117 | ], 118 | "ja-JP": [ 119 | "日本語", 120 | "Japanese" 121 | ], 122 | "km-KH": [ 123 | "ភាសាខ្មែរ", 124 | "Khmer" 125 | ], 126 | "ko-KR": [ 127 | "한국어", 128 | "Korean" 129 | ], 130 | "la": [ 131 | "Latina", 132 | "Latin" 133 | ], 134 | "lt-LT": [ 135 | "Lietuvių kalba", 136 | "Lithuanian" 137 | ], 138 | "lv-LV": [ 139 | "Latviešu", 140 | "Latvian" 141 | ], 142 | "mn-MN": [ 143 | "Монгол", 144 | "Mongolian" 145 | ], 146 | "nb-NO": [ 147 | "Norsk bokmål", 148 | "Norwegian (Bokmål)" 149 | ], 150 | "nl-NL": [ 151 | "Nederlands", 152 | "Dutch" 153 | ], 154 | "nn-NO": [ 155 | "Norsk nynorsk", 156 | "Norwegian (Nynorsk)" 157 | ], 158 | "pl-PL": [ 159 | "Polski", 160 | "Polish" 161 | ], 162 | "pt-BR": [ 163 | "Português (Brasil)", 164 | "Portuguese (Brazil)" 165 | ], 166 | "pt-PT": [ 167 | "Português (Portugal)", 168 | "Portuguese (Portugal)" 169 | ], 170 | "ro-RO": [ 171 | "Română", 172 | "Romanian" 173 | ], 174 | "ru-RU": [ 175 | "Русский", 176 | "Russian" 177 | ], 178 | "sk-SK": [ 179 | "Slovenčina", 180 | "Slovak" 181 | ], 182 | "sl-SI": [ 183 | "Slovenščina", 184 | "Slovenian" 185 | ], 186 | "sr-RS": [ 187 | "Српски / Srpski", 188 | "Serbian" 189 | ], 190 | "sv-SE": [ 191 | "Svenska", 192 | "Swedish" 193 | ], 194 | "th-TH": [ 195 | "ไทย", 196 | "Thai" 197 | ], 198 | "tr-TR": [ 199 | "Türkçe", 200 | "Turkish" 201 | ], 202 | "uk-UA": [ 203 | "Українська", 204 | "Ukrainian" 205 | ], 206 | "ur-PK": [ 207 | "اردو", 208 | "Urdu" 209 | ], 210 | "vi-VN": [ 211 | "Tiếng Việt", 212 | "Vietnamese" 213 | ], 214 | "zh-CN": [ 215 | "中文 (中国大陆)", 216 | "Chinese (PRC)" 217 | ], 218 | "zh-TW": [ 219 | "中文 (台灣)", 220 | "Chinese (Taiwan)" 221 | ] 222 | }; 223 | 224 | export const defaultLocale = 'en-US'; -------------------------------------------------------------------------------- /lib/background.js: -------------------------------------------------------------------------------- 1 | /******/ (() => { // webpackBootstrap 2 | /******/ "use strict"; 3 | var __webpack_exports__ = {}; 4 | 5 | ;// CONCATENATED MODULE: ./src/background/chat_gpt_client/chat_gpt_client.ts 6 | const GPT_TOKEN_NAME = 'openAIToken'; 7 | class ChatGPTClient { 8 | waitForTokenCallback; 9 | async generateTweet(props) { 10 | const token = await this.getToken(); 11 | if (!token) { 12 | return Promise.reject(); 13 | } 14 | const systemMessage = `You are a ghostwriter for users tweets. Use locale "${props.locale}". Return only one tweet. Keep it short.`; 15 | const systemMessage2 = "Exclude everything after the tweet. Exclude hashtags. Exclude emojis. Don't apologize. Don't provide translation. Don't provide notes. Exclude сalls to action."; 16 | const userMessage = `Write a ${props.type} tweet${props.topic ? ` about ${props.topic}` : ""}${props.replyTo ? ` in reply to a tweet "${props.replyTo}"` : ""}`; 17 | const body = { 18 | stream: false, 19 | model: "gpt-3.5-turbo", 20 | messages: [ 21 | { role: "system", content: systemMessage }, 22 | { role: "system", content: systemMessage2 }, 23 | { role: "user", content: userMessage }, 24 | ], 25 | }; 26 | try { 27 | const response = await fetch(`https://api.openai.com/v1/chat/completions`, { 28 | method: 'POST', 29 | headers: { 30 | 'Content-Type': 'application/json', 31 | 'authorization': `Bearer ${token}`, 32 | }, 33 | body: JSON.stringify(body), 34 | }); 35 | if (response.status === 403) { 36 | await chrome.storage.local.remove(GPT_TOKEN_NAME); 37 | } 38 | if (response.status !== 200) { 39 | console.error(response.body); 40 | chrome.notifications.create("TextGenerationError", { 41 | type: 'basic', 42 | iconUrl: "./icons/32.png", 43 | title: 'Error', 44 | message: JSON.stringify(response.body), 45 | priority: 2, 46 | }); 47 | return Promise.reject(); 48 | } 49 | const responseJSON = await response.json(); 50 | const tweet = responseJSON?.choices[0].message?.content || ''; 51 | return tweet.trim() 52 | .replace(/^\"/g, "") 53 | .replace(/\"$/g, "") 54 | .trim(); 55 | } 56 | catch (e) { 57 | console.error(e); 58 | return Promise.reject(); 59 | } 60 | } 61 | getTextFromResponse(response) { 62 | const message = JSON.parse(response); 63 | let tweet = message?.message?.content?.parts[0] || ''; 64 | tweet = tweet.trim().replace(/"([^"]*)[#"]?/g, '$1'); 65 | return tweet; 66 | } 67 | async getToken() { 68 | const result = await chrome.storage.local.get(GPT_TOKEN_NAME); 69 | if (!result[GPT_TOKEN_NAME]) { 70 | let internalUrl = chrome.runtime.getURL("assets/settings.html"); 71 | chrome.tabs.create({ url: internalUrl }); 72 | } 73 | return result[GPT_TOKEN_NAME]; 74 | } 75 | } 76 | 77 | ;// CONCATENATED MODULE: ./src/background/background.ts 78 | 79 | chrome.scripting.registerContentScripts([ 80 | { 81 | id: `main_context_inject_${Math.random()}`, 82 | world: "ISOLATED", 83 | matches: ["https://twitter.com/*"], 84 | js: ["lib/inject.js"], 85 | css: ["css/inject.css"], 86 | }, 87 | ]); 88 | chrome.runtime.onInstalled.addListener(function (object) { 89 | let internalUrl = chrome.runtime.getURL("assets/settings.html"); 90 | chrome.tabs.create({ url: internalUrl }); 91 | }); 92 | const gptChat = new ChatGPTClient(); 93 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 94 | if (!message.type) { 95 | return; 96 | } 97 | switch (message.type) { 98 | case 'generate_tweet': 99 | gptChat.generateTweet(message.props).then(async (text) => { 100 | if (!text) { 101 | return sendResponse(undefined); 102 | } 103 | let finalText = text; 104 | const savedSettings = await chrome.storage.local.get('isAddSignature'); 105 | const isAddSignature = savedSettings.isAddSignature ?? true; 106 | if (isAddSignature) { 107 | finalText = text + ' — tweetGPT'; 108 | } 109 | sendResponse(finalText); 110 | }, () => sendResponse(undefined)); 111 | break; 112 | } 113 | return true; 114 | }); 115 | 116 | /******/ })() 117 | ; -------------------------------------------------------------------------------- /src/inject/dom/add_gpt_button.ts: -------------------------------------------------------------------------------- 1 | import { wait } from "../../utils/wait"; 2 | 3 | const gptIconSrc = chrome.runtime.getURL("icons/button.svg"); 4 | const gptIconErrorSrc = chrome.runtime.getURL("icons/button_error.svg"); 5 | const tweetTypes: Array<{ emoji: string; type: string; }> = [ 6 | {emoji: '👍', type: 'supportive'}, 7 | {emoji: '🎩', type: 'snarky'}, 8 | {emoji: '🌤️', type: 'optimistic'}, 9 | {emoji: '🔥', type: 'controversial'}, 10 | {emoji: '🤩', type: 'excited'}, 11 | {emoji: '🧠', type: 'smart'}, 12 | {emoji: '🤠', type: 'hillbilly'}, 13 | {emoji: '🏴‍☠️', type: 'pirate'}, 14 | {emoji: '🤣', type: 'humorous'}, 15 | {emoji: '🙄', type: 'passive aggressive'} 16 | ]; 17 | 18 | export const addGPTButton = async (toolbarEl: Element, onClick: (type: string, topic?: string) => Promise) => { 19 | addGPTButtonWithType(toolbarEl, onClick); 20 | } 21 | 22 | const maybeReturnTopic = async (): Promise => { 23 | const replyState = await chrome.storage.local.get('isAddTopicForReplies'); 24 | const isAddTopicForReplies = replyState.isAddTopicForReplies ?? false; 25 | 26 | const lastState = await chrome.storage.local.get('lastTopic'); 27 | const lastTopic = lastState.lastTopic ?? ''; 28 | 29 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]"); 30 | 31 | let topic: string | undefined; 32 | 33 | if (!replyToTweet || isAddTopicForReplies) { 34 | topic = window.prompt("What do you want to tweet about?", lastTopic) || 'Twitter'; 35 | await chrome.storage.local.set({'lastTopic': topic}); 36 | } 37 | 38 | return topic; 39 | } 40 | 41 | const addGPTButtonWithType = (toolbarEl: Element, onClick: (type: string, topic?: string) => Promise) => { 42 | const doc = new DOMParser().parseFromString(` 43 |
44 | 45 |
46 | `, "text/html"); 47 | const iconWrap = doc.querySelector("div[id=\"gptButton\"]")! as HTMLDivElement; 48 | 49 | const buttonContainer = toolbarEl.children[0]; 50 | 51 | // attach to container 52 | buttonContainer.appendChild(iconWrap); 53 | 54 | iconWrap.onclick = async () => { 55 | const topic = await maybeReturnTopic(); 56 | const bodyRect = document.body.getBoundingClientRect(); 57 | const elemRect = iconWrap.getBoundingClientRect(); 58 | 59 | const top = elemRect.top - bodyRect.top; 60 | const left = elemRect.left - bodyRect.left + 40; 61 | let optionsList: HTMLDivElement; 62 | let dismissHandler: GlobalEventHandlers["onclick"]; 63 | optionsList = createOptionsList(async (type: string) => { 64 | if (dismissHandler) { 65 | document.body.removeEventListener('click', dismissHandler); 66 | } 67 | if (optionsList) { 68 | optionsList.remove(); 69 | } 70 | 71 | iconWrap.classList.add("loading"); 72 | await onClick(type, topic); 73 | iconWrap.classList.remove("loading"); 74 | }); 75 | 76 | // adding settings button 77 | const separator = document.createElement("div"); 78 | separator.classList.add("gptSeparator"); 79 | optionsList.appendChild(separator); 80 | const item = document.createElement("div"); 81 | item.classList.add("gptSelector"); 82 | item.innerHTML = `⚙️  Settings`; 83 | item.onclick = (e) => { 84 | e.stopPropagation(); 85 | const url = chrome.runtime.getURL("assets/settings.html"); 86 | window.open(url, '_blank')?.focus(); 87 | }; 88 | optionsList.appendChild(item); 89 | 90 | 91 | optionsList.style.left = `${left}px`; 92 | optionsList.style.top = `${top}px`; 93 | 94 | document.body.appendChild(optionsList); 95 | dismissHandler = () => { 96 | if (dismissHandler) { 97 | document.body.removeEventListener('click', dismissHandler); 98 | } 99 | if (optionsList) { 100 | optionsList.remove(); 101 | } 102 | }; 103 | 104 | window.setTimeout(() => { 105 | document.body.addEventListener('click', dismissHandler!); 106 | }, 1); 107 | } 108 | } 109 | 110 | const createOptionsList = (onClick: (type: string) => Promise) => { 111 | const container = document.createElement("div"); 112 | container.classList.add("gptSelectorContainer"); 113 | 114 | for(const tt of tweetTypes) { 115 | const item = document.createElement("div"); 116 | item.classList.add("gptSelector"); 117 | item.innerHTML = `${tt.emoji}  ${tt.type}`; 118 | item.onclick = (e) => { 119 | e.stopPropagation(); 120 | onClick(tt.type); 121 | }; 122 | container.appendChild(item); 123 | } 124 | 125 | return container; 126 | } 127 | 128 | export const showErrorButton = async (toolbarEl: Element) => { 129 | const gptIcon = toolbarEl.querySelector(".gptIcon"); 130 | if (gptIcon) { 131 | gptIcon.setAttribute("src", gptIconErrorSrc); 132 | gptIcon.classList.add("error"); 133 | } 134 | await wait(5000); 135 | gptIcon?.setAttribute("src", gptIconSrc); 136 | gptIcon?.classList.remove("error"); 137 | } -------------------------------------------------------------------------------- /lib/inject.js: -------------------------------------------------------------------------------- 1 | /******/ (() => { // webpackBootstrap 2 | /******/ "use strict"; 3 | var __webpack_exports__ = {}; 4 | 5 | ;// CONCATENATED MODULE: ./src/utils/wait.ts 6 | const wait = (timeout) => { 7 | return new Promise((res) => setTimeout(() => res(null), timeout)); 8 | }; 9 | 10 | ;// CONCATENATED MODULE: ./src/inject/dom/add_gpt_button.ts 11 | 12 | const gptIconSrc = chrome.runtime.getURL("icons/button.svg"); 13 | const gptIconErrorSrc = chrome.runtime.getURL("icons/button_error.svg"); 14 | const tweetTypes = [ 15 | { emoji: '👍', type: 'supportive' }, 16 | { emoji: '🎩', type: 'snarky' }, 17 | { emoji: '🌤️', type: 'optimistic' }, 18 | { emoji: '🔥', type: 'controversial' }, 19 | { emoji: '🤩', type: 'excited' }, 20 | { emoji: '🧠', type: 'smart' }, 21 | { emoji: '🤠', type: 'hillbilly' }, 22 | { emoji: '🏴‍☠️', type: 'pirate' }, 23 | { emoji: '🤣', type: 'humorous' }, 24 | { emoji: '🙄', type: 'passive aggressive' } 25 | ]; 26 | const addGPTButton = async (toolbarEl, onClick) => { 27 | addGPTButtonWithType(toolbarEl, onClick); 28 | }; 29 | const maybeReturnTopic = async () => { 30 | const replyState = await chrome.storage.local.get('isAddTopicForReplies'); 31 | const isAddTopicForReplies = replyState.isAddTopicForReplies ?? false; 32 | const lastState = await chrome.storage.local.get('lastTopic'); 33 | const lastTopic = lastState.lastTopic ?? ''; 34 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]"); 35 | let topic; 36 | if (!replyToTweet || isAddTopicForReplies) { 37 | topic = window.prompt("What do you want to tweet about?", lastTopic) || 'Twitter'; 38 | await chrome.storage.local.set({ 'lastTopic': topic }); 39 | } 40 | return topic; 41 | }; 42 | const addGPTButtonWithType = (toolbarEl, onClick) => { 43 | const doc = new DOMParser().parseFromString(` 44 |
45 | 46 |
47 | `, "text/html"); 48 | const iconWrap = doc.querySelector("div[id=\"gptButton\"]"); 49 | const buttonContainer = toolbarEl.children[0]; 50 | // attach to container 51 | buttonContainer.appendChild(iconWrap); 52 | iconWrap.onclick = async () => { 53 | const topic = await maybeReturnTopic(); 54 | const bodyRect = document.body.getBoundingClientRect(); 55 | const elemRect = iconWrap.getBoundingClientRect(); 56 | const top = elemRect.top - bodyRect.top; 57 | const left = elemRect.left - bodyRect.left + 40; 58 | let optionsList; 59 | let dismissHandler; 60 | optionsList = createOptionsList(async (type) => { 61 | if (dismissHandler) { 62 | document.body.removeEventListener('click', dismissHandler); 63 | } 64 | if (optionsList) { 65 | optionsList.remove(); 66 | } 67 | iconWrap.classList.add("loading"); 68 | await onClick(type, topic); 69 | iconWrap.classList.remove("loading"); 70 | }); 71 | // adding settings button 72 | const separator = document.createElement("div"); 73 | separator.classList.add("gptSeparator"); 74 | optionsList.appendChild(separator); 75 | const item = document.createElement("div"); 76 | item.classList.add("gptSelector"); 77 | item.innerHTML = `⚙️  Settings`; 78 | item.onclick = (e) => { 79 | e.stopPropagation(); 80 | const url = chrome.runtime.getURL("assets/settings.html"); 81 | window.open(url, '_blank')?.focus(); 82 | }; 83 | optionsList.appendChild(item); 84 | optionsList.style.left = `${left}px`; 85 | optionsList.style.top = `${top}px`; 86 | document.body.appendChild(optionsList); 87 | dismissHandler = () => { 88 | if (dismissHandler) { 89 | document.body.removeEventListener('click', dismissHandler); 90 | } 91 | if (optionsList) { 92 | optionsList.remove(); 93 | } 94 | }; 95 | window.setTimeout(() => { 96 | document.body.addEventListener('click', dismissHandler); 97 | }, 1); 98 | }; 99 | }; 100 | const createOptionsList = (onClick) => { 101 | const container = document.createElement("div"); 102 | container.classList.add("gptSelectorContainer"); 103 | for (const tt of tweetTypes) { 104 | const item = document.createElement("div"); 105 | item.classList.add("gptSelector"); 106 | item.innerHTML = `${tt.emoji}  ${tt.type}`; 107 | item.onclick = (e) => { 108 | e.stopPropagation(); 109 | onClick(tt.type); 110 | }; 111 | container.appendChild(item); 112 | } 113 | return container; 114 | }; 115 | const showErrorButton = async (toolbarEl) => { 116 | const gptIcon = toolbarEl.querySelector(".gptIcon"); 117 | if (gptIcon) { 118 | gptIcon.setAttribute("src", gptIconErrorSrc); 119 | gptIcon.classList.add("error"); 120 | } 121 | await wait(5000); 122 | gptIcon?.setAttribute("src", gptIconSrc); 123 | gptIcon?.classList.remove("error"); 124 | }; 125 | 126 | ;// CONCATENATED MODULE: ./src/inject/dom/create_observer.ts 127 | const createObserver = (selector, onInputAdded, onInputRemoved) => { 128 | return new MutationObserver((mutations_list) => { 129 | mutations_list.forEach((mutation) => { 130 | const addedNodes = mutation.addedNodes; // wrong typings 131 | addedNodes.forEach((added_node) => { 132 | if (added_node.querySelector) { 133 | const inputEl = added_node.querySelector(selector); 134 | if (!!inputEl) { 135 | onInputAdded(inputEl); 136 | } 137 | ; 138 | } 139 | }); 140 | const removedNodes = mutation.removedNodes; 141 | removedNodes.forEach((removed_node) => { 142 | if (removed_node.querySelector) { 143 | const inputEl = removed_node.querySelector(selector); 144 | if (!!inputEl) { 145 | onInputRemoved(inputEl); 146 | } 147 | ; 148 | } 149 | }); 150 | }); 151 | }); 152 | }; 153 | 154 | ;// CONCATENATED MODULE: ./src/inject/dom/find_closest_input.ts 155 | // can be more optimised, but ¯\_(ツ)_/¯, typically common container is just 2-3 levels higher 156 | const findClosestInput = (el) => { 157 | const inputEl = el.querySelector("div[data-testid^=\"tweetTextarea_\"][role=\"textbox\"]"); 158 | if (inputEl) { 159 | return inputEl; 160 | } 161 | if (!el.parentElement) { 162 | return null; 163 | } 164 | else { 165 | return findClosestInput(el.parentElement); 166 | } 167 | }; 168 | 169 | ;// CONCATENATED MODULE: ./src/inject/utils/generate_text.ts 170 | const generateText = (props) => { 171 | return new Promise((resolve) => { 172 | chrome.runtime.sendMessage({ type: 'generate_tweet', props }, response => resolve(response)); 173 | }); 174 | }; 175 | 176 | ;// CONCATENATED MODULE: ./src/inject/dom/set_input_text.ts 177 | const setInputText = async (inputEl, text) => { 178 | const textWrapper = inputEl.querySelector('[data-text="true"]')?.parentElement; 179 | if (textWrapper) { 180 | textWrapper.innerHTML = `${text}`; 181 | textWrapper.dispatchEvent(new Event('input', { 'bubbles': true, 'cancelable': true })); 182 | } 183 | }; 184 | 185 | ;// CONCATENATED MODULE: ./src/background/chat_gpt_client/locales.ts 186 | const locales = { 187 | "af-ZA": [ 188 | "Afrikaans", 189 | "Afrikaans" 190 | ], 191 | "ar": [ 192 | "العربية", 193 | "Arabic" 194 | ], 195 | "bg-BG": [ 196 | "Български", 197 | "Bulgarian" 198 | ], 199 | "ca-AD": [ 200 | "Català", 201 | "Catalan" 202 | ], 203 | "cs-CZ": [ 204 | "Čeština", 205 | "Czech" 206 | ], 207 | "cy-GB": [ 208 | "Cymraeg", 209 | "Welsh" 210 | ], 211 | "da-DK": [ 212 | "Dansk", 213 | "Danish" 214 | ], 215 | "de-AT": [ 216 | "Deutsch (Österreich)", 217 | "German (Austria)" 218 | ], 219 | "de-CH": [ 220 | "Deutsch (Schweiz)", 221 | "German (Switzerland)" 222 | ], 223 | "de-DE": [ 224 | "Deutsch (Deutschland)", 225 | "German (Germany)" 226 | ], 227 | "el-GR": [ 228 | "Ελληνικά", 229 | "Greek" 230 | ], 231 | "en-GB": [ 232 | "English (UK)", 233 | "English (UK)" 234 | ], 235 | "en-US": [ 236 | "English (US)", 237 | "English (US)" 238 | ], 239 | "es-CL": [ 240 | "Español (Chile)", 241 | "Spanish (Chile)" 242 | ], 243 | "es-ES": [ 244 | "Español (España)", 245 | "Spanish (Spain)" 246 | ], 247 | "es-MX": [ 248 | "Español (México)", 249 | "Spanish (Mexico)" 250 | ], 251 | "et-EE": [ 252 | "Eesti keel", 253 | "Estonian" 254 | ], 255 | "eu": [ 256 | "Euskara", 257 | "Basque" 258 | ], 259 | "fa-IR": [ 260 | "فارسی", 261 | "Persian" 262 | ], 263 | "fi-FI": [ 264 | "Suomi", 265 | "Finnish" 266 | ], 267 | "fr-CA": [ 268 | "Français (Canada)", 269 | "French (Canada)" 270 | ], 271 | "fr-FR": [ 272 | "Français (France)", 273 | "French (France)" 274 | ], 275 | "he-IL": [ 276 | "עברית", 277 | "Hebrew" 278 | ], 279 | "hi-IN": [ 280 | "हिंदी", 281 | "Hindi" 282 | ], 283 | "hr-HR": [ 284 | "Hrvatski", 285 | "Croatian" 286 | ], 287 | "hu-HU": [ 288 | "Magyar", 289 | "Hungarian" 290 | ], 291 | "id-ID": [ 292 | "Bahasa Indonesia", 293 | "Indonesian" 294 | ], 295 | "is-IS": [ 296 | "Íslenska", 297 | "Icelandic" 298 | ], 299 | "it-IT": [ 300 | "Italiano", 301 | "Italian" 302 | ], 303 | "ja-JP": [ 304 | "日本語", 305 | "Japanese" 306 | ], 307 | "km-KH": [ 308 | "ភាសាខ្មែរ", 309 | "Khmer" 310 | ], 311 | "ko-KR": [ 312 | "한국어", 313 | "Korean" 314 | ], 315 | "la": [ 316 | "Latina", 317 | "Latin" 318 | ], 319 | "lt-LT": [ 320 | "Lietuvių kalba", 321 | "Lithuanian" 322 | ], 323 | "lv-LV": [ 324 | "Latviešu", 325 | "Latvian" 326 | ], 327 | "mn-MN": [ 328 | "Монгол", 329 | "Mongolian" 330 | ], 331 | "nb-NO": [ 332 | "Norsk bokmål", 333 | "Norwegian (Bokmål)" 334 | ], 335 | "nl-NL": [ 336 | "Nederlands", 337 | "Dutch" 338 | ], 339 | "nn-NO": [ 340 | "Norsk nynorsk", 341 | "Norwegian (Nynorsk)" 342 | ], 343 | "pl-PL": [ 344 | "Polski", 345 | "Polish" 346 | ], 347 | "pt-BR": [ 348 | "Português (Brasil)", 349 | "Portuguese (Brazil)" 350 | ], 351 | "pt-PT": [ 352 | "Português (Portugal)", 353 | "Portuguese (Portugal)" 354 | ], 355 | "ro-RO": [ 356 | "Română", 357 | "Romanian" 358 | ], 359 | "ru-RU": [ 360 | "Русский", 361 | "Russian" 362 | ], 363 | "sk-SK": [ 364 | "Slovenčina", 365 | "Slovak" 366 | ], 367 | "sl-SI": [ 368 | "Slovenščina", 369 | "Slovenian" 370 | ], 371 | "sr-RS": [ 372 | "Српски / Srpski", 373 | "Serbian" 374 | ], 375 | "sv-SE": [ 376 | "Svenska", 377 | "Swedish" 378 | ], 379 | "th-TH": [ 380 | "ไทย", 381 | "Thai" 382 | ], 383 | "tr-TR": [ 384 | "Türkçe", 385 | "Turkish" 386 | ], 387 | "uk-UA": [ 388 | "Українська", 389 | "Ukrainian" 390 | ], 391 | "ur-PK": [ 392 | "اردو", 393 | "Urdu" 394 | ], 395 | "vi-VN": [ 396 | "Tiếng Việt", 397 | "Vietnamese" 398 | ], 399 | "zh-CN": [ 400 | "中文 (中国大陆)", 401 | "Chinese (PRC)" 402 | ], 403 | "zh-TW": [ 404 | "中文 (台灣)", 405 | "Chinese (Taiwan)" 406 | ] 407 | }; 408 | const defaultLocale = 'en-US'; 409 | 410 | ;// CONCATENATED MODULE: ./src/inject/inject.ts 411 | 412 | 413 | 414 | 415 | 416 | 417 | const onToolBarAdded = (toolBarEl) => { 418 | let inputEl = findClosestInput(toolBarEl); 419 | if (inputEl) { 420 | addGPTButton(toolBarEl, async (type, topic) => { 421 | toolBarEl.click(); 422 | const replyToTweet = document.querySelector("article[data-testid=\"tweet\"][tabindex=\"-1\"]"); 423 | let replyTo = undefined; 424 | if (!!replyToTweet) { 425 | const textEl = replyToTweet.querySelector("div[data-testid=\"tweetText\"]"); 426 | if (!textEl || !textEl.textContent) { 427 | showErrorButton(toolBarEl); 428 | return; 429 | } 430 | replyTo = textEl.textContent; 431 | } 432 | const text = await generateText({ 433 | locale: (await chrome.storage.local.get('language')).language ?? defaultLocale, 434 | type, 435 | replyTo, 436 | topic 437 | }); 438 | if (text) { 439 | inputEl = findClosestInput(toolBarEl); 440 | if (inputEl) { 441 | setInputText(inputEl, text); 442 | } 443 | } 444 | else { // show error 445 | showErrorButton(toolBarEl); 446 | } 447 | }); 448 | } 449 | }; 450 | const onToolBarRemoved = (toolBarEl) => { }; 451 | // observe dom tree to detect all tweet inputs once they are created 452 | const toolbarObserver = createObserver("div[data-testid=\"toolBar\"]", onToolBarAdded, onToolBarRemoved); 453 | const reactRoot = document.querySelector("#react-root"); 454 | toolbarObserver.observe(reactRoot, { subtree: true, childList: true }); 455 | 456 | /******/ })() 457 | ; -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": 6 | version "7.21.4" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" 8 | integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== 9 | dependencies: 10 | "@babel/highlight" "^7.18.6" 11 | 12 | "@babel/generator@^7.21.4": 13 | version "7.21.4" 14 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" 15 | integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== 16 | dependencies: 17 | "@babel/types" "^7.21.4" 18 | "@jridgewell/gen-mapping" "^0.3.2" 19 | "@jridgewell/trace-mapping" "^0.3.17" 20 | jsesc "^2.5.1" 21 | 22 | "@babel/helper-annotate-as-pure@^7.16.0": 23 | version "7.18.6" 24 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" 25 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 26 | dependencies: 27 | "@babel/types" "^7.18.6" 28 | 29 | "@babel/helper-environment-visitor@^7.18.9": 30 | version "7.18.9" 31 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" 32 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 33 | 34 | "@babel/helper-function-name@^7.21.0": 35 | version "7.21.0" 36 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" 37 | integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== 38 | dependencies: 39 | "@babel/template" "^7.20.7" 40 | "@babel/types" "^7.21.0" 41 | 42 | "@babel/helper-hoist-variables@^7.18.6": 43 | version "7.18.6" 44 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" 45 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== 46 | dependencies: 47 | "@babel/types" "^7.18.6" 48 | 49 | "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": 50 | version "7.21.4" 51 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" 52 | integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== 53 | dependencies: 54 | "@babel/types" "^7.21.4" 55 | 56 | "@babel/helper-split-export-declaration@^7.18.6": 57 | version "7.18.6" 58 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" 59 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 60 | dependencies: 61 | "@babel/types" "^7.18.6" 62 | 63 | "@babel/helper-string-parser@^7.19.4": 64 | version "7.19.4" 65 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" 66 | integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== 67 | 68 | "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": 69 | version "7.19.1" 70 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" 71 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 72 | 73 | "@babel/highlight@^7.18.6": 74 | version "7.18.6" 75 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 76 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 77 | dependencies: 78 | "@babel/helper-validator-identifier" "^7.18.6" 79 | chalk "^2.0.0" 80 | js-tokens "^4.0.0" 81 | 82 | "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": 83 | version "7.21.4" 84 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" 85 | integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== 86 | 87 | "@babel/template@^7.20.7": 88 | version "7.20.7" 89 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" 90 | integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== 91 | dependencies: 92 | "@babel/code-frame" "^7.18.6" 93 | "@babel/parser" "^7.20.7" 94 | "@babel/types" "^7.20.7" 95 | 96 | "@babel/traverse@^7.4.5": 97 | version "7.21.4" 98 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" 99 | integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== 100 | dependencies: 101 | "@babel/code-frame" "^7.21.4" 102 | "@babel/generator" "^7.21.4" 103 | "@babel/helper-environment-visitor" "^7.18.9" 104 | "@babel/helper-function-name" "^7.21.0" 105 | "@babel/helper-hoist-variables" "^7.18.6" 106 | "@babel/helper-split-export-declaration" "^7.18.6" 107 | "@babel/parser" "^7.21.4" 108 | "@babel/types" "^7.21.4" 109 | debug "^4.1.0" 110 | globals "^11.1.0" 111 | 112 | "@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4": 113 | version "7.21.4" 114 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" 115 | integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== 116 | dependencies: 117 | "@babel/helper-string-parser" "^7.19.4" 118 | "@babel/helper-validator-identifier" "^7.19.1" 119 | to-fast-properties "^2.0.0" 120 | 121 | "@discoveryjs/json-ext@^0.5.0": 122 | version "0.5.7" 123 | resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" 124 | integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== 125 | 126 | "@emotion/is-prop-valid@^1.1.0": 127 | version "1.2.0" 128 | resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" 129 | integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== 130 | dependencies: 131 | "@emotion/memoize" "^0.8.0" 132 | 133 | "@emotion/memoize@^0.8.0": 134 | version "0.8.0" 135 | resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" 136 | integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== 137 | 138 | "@emotion/stylis@^0.8.4": 139 | version "0.8.5" 140 | resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" 141 | integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== 142 | 143 | "@emotion/unitless@^0.7.4": 144 | version "0.7.5" 145 | resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" 146 | integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== 147 | 148 | "@jridgewell/gen-mapping@^0.3.0": 149 | version "0.3.2" 150 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" 151 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 152 | dependencies: 153 | "@jridgewell/set-array" "^1.0.1" 154 | "@jridgewell/sourcemap-codec" "^1.4.10" 155 | "@jridgewell/trace-mapping" "^0.3.9" 156 | 157 | "@jridgewell/gen-mapping@^0.3.2": 158 | version "0.3.3" 159 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" 160 | integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== 161 | dependencies: 162 | "@jridgewell/set-array" "^1.0.1" 163 | "@jridgewell/sourcemap-codec" "^1.4.10" 164 | "@jridgewell/trace-mapping" "^0.3.9" 165 | 166 | "@jridgewell/resolve-uri@3.1.0": 167 | version "3.1.0" 168 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 169 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 170 | 171 | "@jridgewell/set-array@^1.0.1": 172 | version "1.1.2" 173 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 174 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 175 | 176 | "@jridgewell/source-map@^0.3.2": 177 | version "0.3.2" 178 | resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" 179 | integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== 180 | dependencies: 181 | "@jridgewell/gen-mapping" "^0.3.0" 182 | "@jridgewell/trace-mapping" "^0.3.9" 183 | 184 | "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": 185 | version "1.4.14" 186 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 187 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 188 | 189 | "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": 190 | version "0.3.17" 191 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" 192 | integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== 193 | dependencies: 194 | "@jridgewell/resolve-uri" "3.1.0" 195 | "@jridgewell/sourcemap-codec" "1.4.14" 196 | 197 | "@jridgewell/trace-mapping@^0.3.17": 198 | version "0.3.18" 199 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" 200 | integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== 201 | dependencies: 202 | "@jridgewell/resolve-uri" "3.1.0" 203 | "@jridgewell/sourcemap-codec" "1.4.14" 204 | 205 | "@types/chrome@^0.0.203": 206 | version "0.0.203" 207 | resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.203.tgz#cf883669ba489ec965e48d32cdcf14f45437f7cf" 208 | integrity sha512-JlQNebwpBETVc8U1Rr2inDFuOTtn0lahRAhnddx1dd0S5RrLAFJEEsyIu7AXI14mkCgSunksnuLGioH8kvBqRA== 209 | dependencies: 210 | "@types/filesystem" "*" 211 | "@types/har-format" "*" 212 | 213 | "@types/eslint-scope@^3.7.3": 214 | version "3.7.4" 215 | resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" 216 | integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== 217 | dependencies: 218 | "@types/eslint" "*" 219 | "@types/estree" "*" 220 | 221 | "@types/eslint@*": 222 | version "8.4.10" 223 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" 224 | integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== 225 | dependencies: 226 | "@types/estree" "*" 227 | "@types/json-schema" "*" 228 | 229 | "@types/estree@*": 230 | version "1.0.0" 231 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" 232 | integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== 233 | 234 | "@types/estree@^0.0.51": 235 | version "0.0.51" 236 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" 237 | integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== 238 | 239 | "@types/filesystem@*": 240 | version "0.0.32" 241 | resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf" 242 | integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== 243 | dependencies: 244 | "@types/filewriter" "*" 245 | 246 | "@types/filewriter@*": 247 | version "0.0.29" 248 | resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee" 249 | integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== 250 | 251 | "@types/har-format@*": 252 | version "1.2.10" 253 | resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.10.tgz#7b4e1e0ada4d17684ac3b05d601a4871cfab11fc" 254 | integrity sha512-o0J30wqycjF5miWDKYKKzzOU1ZTLuA42HZ4HE7/zqTOc/jTLdQ5NhYWvsRQo45Nfi1KHoRdNhteSI4BAxTF1Pg== 255 | 256 | "@types/hoist-non-react-statics@*": 257 | version "3.3.1" 258 | resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" 259 | integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== 260 | dependencies: 261 | "@types/react" "*" 262 | hoist-non-react-statics "^3.3.0" 263 | 264 | "@types/json-schema@*", "@types/json-schema@^7.0.8": 265 | version "7.0.11" 266 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 267 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 268 | 269 | "@types/node@*", "@types/node@^18.11.11": 270 | version "18.11.11" 271 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.11.tgz#1d455ac0211549a8409d3cdb371cd55cc971e8dc" 272 | integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g== 273 | 274 | "@types/prop-types@*": 275 | version "15.7.5" 276 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 277 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 278 | 279 | "@types/react-dom@^18.0.11": 280 | version "18.0.11" 281 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" 282 | integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== 283 | dependencies: 284 | "@types/react" "*" 285 | 286 | "@types/react@*", "@types/react@^18.0.38": 287 | version "18.0.38" 288 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.38.tgz#02a23bef8848b360a0d1dceef4432c15c21c600c" 289 | integrity sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw== 290 | dependencies: 291 | "@types/prop-types" "*" 292 | "@types/scheduler" "*" 293 | csstype "^3.0.2" 294 | 295 | "@types/scheduler@*": 296 | version "0.16.3" 297 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" 298 | integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== 299 | 300 | "@types/styled-components@^5.1.26": 301 | version "5.1.26" 302 | resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af" 303 | integrity sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw== 304 | dependencies: 305 | "@types/hoist-non-react-statics" "*" 306 | "@types/react" "*" 307 | csstype "^3.0.2" 308 | 309 | "@webassemblyjs/ast@1.11.1": 310 | version "1.11.1" 311 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" 312 | integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== 313 | dependencies: 314 | "@webassemblyjs/helper-numbers" "1.11.1" 315 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 316 | 317 | "@webassemblyjs/floating-point-hex-parser@1.11.1": 318 | version "1.11.1" 319 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" 320 | integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== 321 | 322 | "@webassemblyjs/helper-api-error@1.11.1": 323 | version "1.11.1" 324 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" 325 | integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== 326 | 327 | "@webassemblyjs/helper-buffer@1.11.1": 328 | version "1.11.1" 329 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" 330 | integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== 331 | 332 | "@webassemblyjs/helper-numbers@1.11.1": 333 | version "1.11.1" 334 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" 335 | integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== 336 | dependencies: 337 | "@webassemblyjs/floating-point-hex-parser" "1.11.1" 338 | "@webassemblyjs/helper-api-error" "1.11.1" 339 | "@xtuc/long" "4.2.2" 340 | 341 | "@webassemblyjs/helper-wasm-bytecode@1.11.1": 342 | version "1.11.1" 343 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" 344 | integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== 345 | 346 | "@webassemblyjs/helper-wasm-section@1.11.1": 347 | version "1.11.1" 348 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" 349 | integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== 350 | dependencies: 351 | "@webassemblyjs/ast" "1.11.1" 352 | "@webassemblyjs/helper-buffer" "1.11.1" 353 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 354 | "@webassemblyjs/wasm-gen" "1.11.1" 355 | 356 | "@webassemblyjs/ieee754@1.11.1": 357 | version "1.11.1" 358 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" 359 | integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== 360 | dependencies: 361 | "@xtuc/ieee754" "^1.2.0" 362 | 363 | "@webassemblyjs/leb128@1.11.1": 364 | version "1.11.1" 365 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" 366 | integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== 367 | dependencies: 368 | "@xtuc/long" "4.2.2" 369 | 370 | "@webassemblyjs/utf8@1.11.1": 371 | version "1.11.1" 372 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" 373 | integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== 374 | 375 | "@webassemblyjs/wasm-edit@1.11.1": 376 | version "1.11.1" 377 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" 378 | integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== 379 | dependencies: 380 | "@webassemblyjs/ast" "1.11.1" 381 | "@webassemblyjs/helper-buffer" "1.11.1" 382 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 383 | "@webassemblyjs/helper-wasm-section" "1.11.1" 384 | "@webassemblyjs/wasm-gen" "1.11.1" 385 | "@webassemblyjs/wasm-opt" "1.11.1" 386 | "@webassemblyjs/wasm-parser" "1.11.1" 387 | "@webassemblyjs/wast-printer" "1.11.1" 388 | 389 | "@webassemblyjs/wasm-gen@1.11.1": 390 | version "1.11.1" 391 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" 392 | integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== 393 | dependencies: 394 | "@webassemblyjs/ast" "1.11.1" 395 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 396 | "@webassemblyjs/ieee754" "1.11.1" 397 | "@webassemblyjs/leb128" "1.11.1" 398 | "@webassemblyjs/utf8" "1.11.1" 399 | 400 | "@webassemblyjs/wasm-opt@1.11.1": 401 | version "1.11.1" 402 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" 403 | integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== 404 | dependencies: 405 | "@webassemblyjs/ast" "1.11.1" 406 | "@webassemblyjs/helper-buffer" "1.11.1" 407 | "@webassemblyjs/wasm-gen" "1.11.1" 408 | "@webassemblyjs/wasm-parser" "1.11.1" 409 | 410 | "@webassemblyjs/wasm-parser@1.11.1": 411 | version "1.11.1" 412 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" 413 | integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== 414 | dependencies: 415 | "@webassemblyjs/ast" "1.11.1" 416 | "@webassemblyjs/helper-api-error" "1.11.1" 417 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 418 | "@webassemblyjs/ieee754" "1.11.1" 419 | "@webassemblyjs/leb128" "1.11.1" 420 | "@webassemblyjs/utf8" "1.11.1" 421 | 422 | "@webassemblyjs/wast-printer@1.11.1": 423 | version "1.11.1" 424 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" 425 | integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== 426 | dependencies: 427 | "@webassemblyjs/ast" "1.11.1" 428 | "@xtuc/long" "4.2.2" 429 | 430 | "@webpack-cli/configtest@^2.0.1": 431 | version "2.0.1" 432 | resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.0.1.tgz#a69720f6c9bad6aef54a8fa6ba9c3533e7ef4c7f" 433 | integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A== 434 | 435 | "@webpack-cli/info@^2.0.1": 436 | version "2.0.1" 437 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.1.tgz#eed745799c910d20081e06e5177c2b2569f166c0" 438 | integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== 439 | 440 | "@webpack-cli/serve@^2.0.1": 441 | version "2.0.1" 442 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.1.tgz#34bdc31727a1889198855913db2f270ace6d7bf8" 443 | integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw== 444 | 445 | "@xtuc/ieee754@^1.2.0": 446 | version "1.2.0" 447 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 448 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 449 | 450 | "@xtuc/long@4.2.2": 451 | version "4.2.2" 452 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 453 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 454 | 455 | acorn-import-assertions@^1.7.6: 456 | version "1.8.0" 457 | resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" 458 | integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== 459 | 460 | acorn@^8.5.0, acorn@^8.7.1: 461 | version "8.8.1" 462 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" 463 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 464 | 465 | ajv-keywords@^3.5.2: 466 | version "3.5.2" 467 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 468 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 469 | 470 | ajv@^6.12.5: 471 | version "6.12.6" 472 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 473 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 474 | dependencies: 475 | fast-deep-equal "^3.1.1" 476 | fast-json-stable-stringify "^2.0.0" 477 | json-schema-traverse "^0.4.1" 478 | uri-js "^4.2.2" 479 | 480 | ansi-styles@^3.2.1: 481 | version "3.2.1" 482 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 483 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 484 | dependencies: 485 | color-convert "^1.9.0" 486 | 487 | ansi-styles@^4.1.0: 488 | version "4.3.0" 489 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 490 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 491 | dependencies: 492 | color-convert "^2.0.1" 493 | 494 | "babel-plugin-styled-components@>= 1.12.0": 495 | version "2.1.1" 496 | resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.1.tgz#cd977cc0ff8410d5cbfdd142e42576e9c8794b87" 497 | integrity sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA== 498 | dependencies: 499 | "@babel/helper-annotate-as-pure" "^7.16.0" 500 | "@babel/helper-module-imports" "^7.16.0" 501 | babel-plugin-syntax-jsx "^6.18.0" 502 | lodash "^4.17.21" 503 | picomatch "^2.3.0" 504 | 505 | babel-plugin-syntax-jsx@^6.18.0: 506 | version "6.18.0" 507 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" 508 | integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== 509 | 510 | braces@^3.0.2: 511 | version "3.0.2" 512 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 513 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 514 | dependencies: 515 | fill-range "^7.0.1" 516 | 517 | browserslist@^4.14.5: 518 | version "4.21.4" 519 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" 520 | integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== 521 | dependencies: 522 | caniuse-lite "^1.0.30001400" 523 | electron-to-chromium "^1.4.251" 524 | node-releases "^2.0.6" 525 | update-browserslist-db "^1.0.9" 526 | 527 | buffer-from@^1.0.0: 528 | version "1.1.2" 529 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 530 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 531 | 532 | camelize@^1.0.0: 533 | version "1.0.1" 534 | resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" 535 | integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== 536 | 537 | caniuse-lite@^1.0.30001400: 538 | version "1.0.30001436" 539 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" 540 | integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== 541 | 542 | chalk@^2.0.0: 543 | version "2.4.2" 544 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 545 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 546 | dependencies: 547 | ansi-styles "^3.2.1" 548 | escape-string-regexp "^1.0.5" 549 | supports-color "^5.3.0" 550 | 551 | chalk@^4.1.0: 552 | version "4.1.2" 553 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 554 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 555 | dependencies: 556 | ansi-styles "^4.1.0" 557 | supports-color "^7.1.0" 558 | 559 | chrome-trace-event@^1.0.2: 560 | version "1.0.3" 561 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" 562 | integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== 563 | 564 | clone-deep@^4.0.1: 565 | version "4.0.1" 566 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" 567 | integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== 568 | dependencies: 569 | is-plain-object "^2.0.4" 570 | kind-of "^6.0.2" 571 | shallow-clone "^3.0.0" 572 | 573 | color-convert@^1.9.0: 574 | version "1.9.3" 575 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 576 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 577 | dependencies: 578 | color-name "1.1.3" 579 | 580 | color-convert@^2.0.1: 581 | version "2.0.1" 582 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 583 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 584 | dependencies: 585 | color-name "~1.1.4" 586 | 587 | color-name@1.1.3: 588 | version "1.1.3" 589 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 590 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 591 | 592 | color-name@~1.1.4: 593 | version "1.1.4" 594 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 595 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 596 | 597 | colorette@^2.0.14: 598 | version "2.0.19" 599 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" 600 | integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== 601 | 602 | commander@^2.20.0: 603 | version "2.20.3" 604 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 605 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 606 | 607 | commander@^9.4.1: 608 | version "9.4.1" 609 | resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" 610 | integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== 611 | 612 | cross-spawn@^7.0.3: 613 | version "7.0.3" 614 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 615 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 616 | dependencies: 617 | path-key "^3.1.0" 618 | shebang-command "^2.0.0" 619 | which "^2.0.1" 620 | 621 | css-color-keywords@^1.0.0: 622 | version "1.0.0" 623 | resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" 624 | integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== 625 | 626 | css-to-react-native@^3.0.0: 627 | version "3.2.0" 628 | resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" 629 | integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== 630 | dependencies: 631 | camelize "^1.0.0" 632 | css-color-keywords "^1.0.0" 633 | postcss-value-parser "^4.0.2" 634 | 635 | csstype@^3.0.2: 636 | version "3.1.2" 637 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" 638 | integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== 639 | 640 | debug@^4.1.0: 641 | version "4.3.4" 642 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 643 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 644 | dependencies: 645 | ms "2.1.2" 646 | 647 | electron-to-chromium@^1.4.251: 648 | version "1.4.284" 649 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" 650 | integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== 651 | 652 | enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: 653 | version "5.12.0" 654 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" 655 | integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== 656 | dependencies: 657 | graceful-fs "^4.2.4" 658 | tapable "^2.2.0" 659 | 660 | envinfo@^7.7.3: 661 | version "7.8.1" 662 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" 663 | integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== 664 | 665 | es-module-lexer@^0.9.0: 666 | version "0.9.3" 667 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" 668 | integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== 669 | 670 | escalade@^3.1.1: 671 | version "3.1.1" 672 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 673 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 674 | 675 | escape-string-regexp@^1.0.5: 676 | version "1.0.5" 677 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 678 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 679 | 680 | eslint-scope@5.1.1: 681 | version "5.1.1" 682 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 683 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 684 | dependencies: 685 | esrecurse "^4.3.0" 686 | estraverse "^4.1.1" 687 | 688 | esrecurse@^4.3.0: 689 | version "4.3.0" 690 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 691 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 692 | dependencies: 693 | estraverse "^5.2.0" 694 | 695 | estraverse@^4.1.1: 696 | version "4.3.0" 697 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 698 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 699 | 700 | estraverse@^5.2.0: 701 | version "5.3.0" 702 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 703 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 704 | 705 | events@^3.2.0: 706 | version "3.3.0" 707 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 708 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 709 | 710 | fast-deep-equal@^3.1.1: 711 | version "3.1.3" 712 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 713 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 714 | 715 | fast-json-stable-stringify@^2.0.0: 716 | version "2.1.0" 717 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 718 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 719 | 720 | fastest-levenshtein@^1.0.12: 721 | version "1.0.16" 722 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" 723 | integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== 724 | 725 | fill-range@^7.0.1: 726 | version "7.0.1" 727 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 728 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 729 | dependencies: 730 | to-regex-range "^5.0.1" 731 | 732 | find-up@^4.0.0: 733 | version "4.1.0" 734 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 735 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 736 | dependencies: 737 | locate-path "^5.0.0" 738 | path-exists "^4.0.0" 739 | 740 | function-bind@^1.1.1: 741 | version "1.1.1" 742 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 743 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 744 | 745 | glob-to-regexp@^0.4.1: 746 | version "0.4.1" 747 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 748 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 749 | 750 | globals@^11.1.0: 751 | version "11.12.0" 752 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 753 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 754 | 755 | graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: 756 | version "4.2.10" 757 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 758 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 759 | 760 | has-flag@^3.0.0: 761 | version "3.0.0" 762 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 763 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 764 | 765 | has-flag@^4.0.0: 766 | version "4.0.0" 767 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 768 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 769 | 770 | has@^1.0.3: 771 | version "1.0.3" 772 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 773 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 774 | dependencies: 775 | function-bind "^1.1.1" 776 | 777 | hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: 778 | version "3.3.2" 779 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" 780 | integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== 781 | dependencies: 782 | react-is "^16.7.0" 783 | 784 | import-local@^3.0.2: 785 | version "3.1.0" 786 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" 787 | integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== 788 | dependencies: 789 | pkg-dir "^4.2.0" 790 | resolve-cwd "^3.0.0" 791 | 792 | interpret@^3.1.1: 793 | version "3.1.1" 794 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" 795 | integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== 796 | 797 | is-core-module@^2.9.0: 798 | version "2.11.0" 799 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" 800 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 801 | dependencies: 802 | has "^1.0.3" 803 | 804 | is-number@^7.0.0: 805 | version "7.0.0" 806 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 807 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 808 | 809 | is-plain-object@^2.0.4: 810 | version "2.0.4" 811 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 812 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 813 | dependencies: 814 | isobject "^3.0.1" 815 | 816 | isexe@^2.0.0: 817 | version "2.0.0" 818 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 819 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 820 | 821 | isobject@^3.0.1: 822 | version "3.0.1" 823 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 824 | integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== 825 | 826 | jest-worker@^27.4.5: 827 | version "27.5.1" 828 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" 829 | integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== 830 | dependencies: 831 | "@types/node" "*" 832 | merge-stream "^2.0.0" 833 | supports-color "^8.0.0" 834 | 835 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 836 | version "4.0.0" 837 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 838 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 839 | 840 | jsesc@^2.5.1: 841 | version "2.5.2" 842 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 843 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 844 | 845 | json-parse-even-better-errors@^2.3.1: 846 | version "2.3.1" 847 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 848 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 849 | 850 | json-schema-traverse@^0.4.1: 851 | version "0.4.1" 852 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 853 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 854 | 855 | kind-of@^6.0.2: 856 | version "6.0.3" 857 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 858 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 859 | 860 | loader-runner@^4.2.0: 861 | version "4.3.0" 862 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" 863 | integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== 864 | 865 | locate-path@^5.0.0: 866 | version "5.0.0" 867 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 868 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 869 | dependencies: 870 | p-locate "^4.1.0" 871 | 872 | lodash@^4.17.21: 873 | version "4.17.21" 874 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 875 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 876 | 877 | loose-envify@^1.1.0: 878 | version "1.4.0" 879 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 880 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 881 | dependencies: 882 | js-tokens "^3.0.0 || ^4.0.0" 883 | 884 | lru-cache@^6.0.0: 885 | version "6.0.0" 886 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 887 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 888 | dependencies: 889 | yallist "^4.0.0" 890 | 891 | merge-stream@^2.0.0: 892 | version "2.0.0" 893 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 894 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 895 | 896 | micromatch@^4.0.0: 897 | version "4.0.5" 898 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 899 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 900 | dependencies: 901 | braces "^3.0.2" 902 | picomatch "^2.3.1" 903 | 904 | mime-db@1.52.0: 905 | version "1.52.0" 906 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 907 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 908 | 909 | mime-types@^2.1.27: 910 | version "2.1.35" 911 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 912 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 913 | dependencies: 914 | mime-db "1.52.0" 915 | 916 | ms@2.1.2: 917 | version "2.1.2" 918 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 919 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 920 | 921 | neo-async@^2.6.2: 922 | version "2.6.2" 923 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 924 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 925 | 926 | node-releases@^2.0.6: 927 | version "2.0.6" 928 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" 929 | integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== 930 | 931 | p-limit@^2.2.0: 932 | version "2.3.0" 933 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 934 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 935 | dependencies: 936 | p-try "^2.0.0" 937 | 938 | p-locate@^4.1.0: 939 | version "4.1.0" 940 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 941 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 942 | dependencies: 943 | p-limit "^2.2.0" 944 | 945 | p-try@^2.0.0: 946 | version "2.2.0" 947 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 948 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 949 | 950 | path-exists@^4.0.0: 951 | version "4.0.0" 952 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 953 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 954 | 955 | path-key@^3.1.0: 956 | version "3.1.1" 957 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 958 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 959 | 960 | path-parse@^1.0.7: 961 | version "1.0.7" 962 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 963 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 964 | 965 | picocolors@^1.0.0: 966 | version "1.0.0" 967 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 968 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 969 | 970 | picomatch@^2.3.0, picomatch@^2.3.1: 971 | version "2.3.1" 972 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 973 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 974 | 975 | pkg-dir@^4.2.0: 976 | version "4.2.0" 977 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 978 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 979 | dependencies: 980 | find-up "^4.0.0" 981 | 982 | postcss-value-parser@^4.0.2: 983 | version "4.2.0" 984 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" 985 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 986 | 987 | punycode@^2.1.0: 988 | version "2.1.1" 989 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 990 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 991 | 992 | randombytes@^2.1.0: 993 | version "2.1.0" 994 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 995 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 996 | dependencies: 997 | safe-buffer "^5.1.0" 998 | 999 | react-dom@^18.2.0: 1000 | version "18.2.0" 1001 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 1002 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 1003 | dependencies: 1004 | loose-envify "^1.1.0" 1005 | scheduler "^0.23.0" 1006 | 1007 | react-is@^16.7.0: 1008 | version "16.13.1" 1009 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 1010 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1011 | 1012 | react@^18.2.0: 1013 | version "18.2.0" 1014 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 1015 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 1016 | dependencies: 1017 | loose-envify "^1.1.0" 1018 | 1019 | rechoir@^0.8.0: 1020 | version "0.8.0" 1021 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" 1022 | integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== 1023 | dependencies: 1024 | resolve "^1.20.0" 1025 | 1026 | resolve-cwd@^3.0.0: 1027 | version "3.0.0" 1028 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 1029 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 1030 | dependencies: 1031 | resolve-from "^5.0.0" 1032 | 1033 | resolve-from@^5.0.0: 1034 | version "5.0.0" 1035 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1036 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1037 | 1038 | resolve@^1.20.0: 1039 | version "1.22.1" 1040 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 1041 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1042 | dependencies: 1043 | is-core-module "^2.9.0" 1044 | path-parse "^1.0.7" 1045 | supports-preserve-symlinks-flag "^1.0.0" 1046 | 1047 | safe-buffer@^5.1.0: 1048 | version "5.2.1" 1049 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1050 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1051 | 1052 | scheduler@^0.23.0: 1053 | version "0.23.0" 1054 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 1055 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 1056 | dependencies: 1057 | loose-envify "^1.1.0" 1058 | 1059 | schema-utils@^3.1.0, schema-utils@^3.1.1: 1060 | version "3.1.1" 1061 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" 1062 | integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== 1063 | dependencies: 1064 | "@types/json-schema" "^7.0.8" 1065 | ajv "^6.12.5" 1066 | ajv-keywords "^3.5.2" 1067 | 1068 | semver@^7.3.4: 1069 | version "7.3.8" 1070 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" 1071 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== 1072 | dependencies: 1073 | lru-cache "^6.0.0" 1074 | 1075 | serialize-javascript@^6.0.0: 1076 | version "6.0.0" 1077 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1078 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1079 | dependencies: 1080 | randombytes "^2.1.0" 1081 | 1082 | shallow-clone@^3.0.0: 1083 | version "3.0.1" 1084 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" 1085 | integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== 1086 | dependencies: 1087 | kind-of "^6.0.2" 1088 | 1089 | shallowequal@^1.1.0: 1090 | version "1.1.0" 1091 | resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" 1092 | integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== 1093 | 1094 | shebang-command@^2.0.0: 1095 | version "2.0.0" 1096 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1097 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1098 | dependencies: 1099 | shebang-regex "^3.0.0" 1100 | 1101 | shebang-regex@^3.0.0: 1102 | version "3.0.0" 1103 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1104 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1105 | 1106 | source-map-support@~0.5.20: 1107 | version "0.5.21" 1108 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 1109 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 1110 | dependencies: 1111 | buffer-from "^1.0.0" 1112 | source-map "^0.6.0" 1113 | 1114 | source-map@^0.6.0: 1115 | version "0.6.1" 1116 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1117 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1118 | 1119 | styled-components@^5.3.10: 1120 | version "5.3.10" 1121 | resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.10.tgz#42f7245f58fe960362a63f543dda23c0ac107c0f" 1122 | integrity sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg== 1123 | dependencies: 1124 | "@babel/helper-module-imports" "^7.0.0" 1125 | "@babel/traverse" "^7.4.5" 1126 | "@emotion/is-prop-valid" "^1.1.0" 1127 | "@emotion/stylis" "^0.8.4" 1128 | "@emotion/unitless" "^0.7.4" 1129 | babel-plugin-styled-components ">= 1.12.0" 1130 | css-to-react-native "^3.0.0" 1131 | hoist-non-react-statics "^3.0.0" 1132 | shallowequal "^1.1.0" 1133 | supports-color "^5.5.0" 1134 | 1135 | supports-color@^5.3.0, supports-color@^5.5.0: 1136 | version "5.5.0" 1137 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1138 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1139 | dependencies: 1140 | has-flag "^3.0.0" 1141 | 1142 | supports-color@^7.1.0: 1143 | version "7.2.0" 1144 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1145 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1146 | dependencies: 1147 | has-flag "^4.0.0" 1148 | 1149 | supports-color@^8.0.0: 1150 | version "8.1.1" 1151 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1152 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1153 | dependencies: 1154 | has-flag "^4.0.0" 1155 | 1156 | supports-preserve-symlinks-flag@^1.0.0: 1157 | version "1.0.0" 1158 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1159 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1160 | 1161 | tapable@^2.1.1, tapable@^2.2.0: 1162 | version "2.2.1" 1163 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 1164 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== 1165 | 1166 | terser-webpack-plugin@^5.1.3: 1167 | version "5.3.6" 1168 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" 1169 | integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== 1170 | dependencies: 1171 | "@jridgewell/trace-mapping" "^0.3.14" 1172 | jest-worker "^27.4.5" 1173 | schema-utils "^3.1.1" 1174 | serialize-javascript "^6.0.0" 1175 | terser "^5.14.1" 1176 | 1177 | terser@^5.14.1: 1178 | version "5.16.1" 1179 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" 1180 | integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== 1181 | dependencies: 1182 | "@jridgewell/source-map" "^0.3.2" 1183 | acorn "^8.5.0" 1184 | commander "^2.20.0" 1185 | source-map-support "~0.5.20" 1186 | 1187 | to-fast-properties@^2.0.0: 1188 | version "2.0.0" 1189 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1190 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 1191 | 1192 | to-regex-range@^5.0.1: 1193 | version "5.0.1" 1194 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1195 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1196 | dependencies: 1197 | is-number "^7.0.0" 1198 | 1199 | ts-loader@^9.4.2: 1200 | version "9.4.2" 1201 | resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" 1202 | integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA== 1203 | dependencies: 1204 | chalk "^4.1.0" 1205 | enhanced-resolve "^5.0.0" 1206 | micromatch "^4.0.0" 1207 | semver "^7.3.4" 1208 | 1209 | typescript@^4.9.3: 1210 | version "4.9.3" 1211 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" 1212 | integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== 1213 | 1214 | update-browserslist-db@^1.0.9: 1215 | version "1.0.10" 1216 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" 1217 | integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== 1218 | dependencies: 1219 | escalade "^3.1.1" 1220 | picocolors "^1.0.0" 1221 | 1222 | uri-js@^4.2.2: 1223 | version "4.4.1" 1224 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1225 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1226 | dependencies: 1227 | punycode "^2.1.0" 1228 | 1229 | watchpack@^2.4.0: 1230 | version "2.4.0" 1231 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" 1232 | integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== 1233 | dependencies: 1234 | glob-to-regexp "^0.4.1" 1235 | graceful-fs "^4.1.2" 1236 | 1237 | webpack-cli@^5.0.1: 1238 | version "5.0.1" 1239 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.0.1.tgz#95fc0495ac4065e9423a722dec9175560b6f2d9a" 1240 | integrity sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A== 1241 | dependencies: 1242 | "@discoveryjs/json-ext" "^0.5.0" 1243 | "@webpack-cli/configtest" "^2.0.1" 1244 | "@webpack-cli/info" "^2.0.1" 1245 | "@webpack-cli/serve" "^2.0.1" 1246 | colorette "^2.0.14" 1247 | commander "^9.4.1" 1248 | cross-spawn "^7.0.3" 1249 | envinfo "^7.7.3" 1250 | fastest-levenshtein "^1.0.12" 1251 | import-local "^3.0.2" 1252 | interpret "^3.1.1" 1253 | rechoir "^0.8.0" 1254 | webpack-merge "^5.7.3" 1255 | 1256 | webpack-merge@^5.7.3: 1257 | version "5.8.0" 1258 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" 1259 | integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== 1260 | dependencies: 1261 | clone-deep "^4.0.1" 1262 | wildcard "^2.0.0" 1263 | 1264 | webpack-sources@^3.2.3: 1265 | version "3.2.3" 1266 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" 1267 | integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== 1268 | 1269 | webpack@^5.75.0: 1270 | version "5.75.0" 1271 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" 1272 | integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== 1273 | dependencies: 1274 | "@types/eslint-scope" "^3.7.3" 1275 | "@types/estree" "^0.0.51" 1276 | "@webassemblyjs/ast" "1.11.1" 1277 | "@webassemblyjs/wasm-edit" "1.11.1" 1278 | "@webassemblyjs/wasm-parser" "1.11.1" 1279 | acorn "^8.7.1" 1280 | acorn-import-assertions "^1.7.6" 1281 | browserslist "^4.14.5" 1282 | chrome-trace-event "^1.0.2" 1283 | enhanced-resolve "^5.10.0" 1284 | es-module-lexer "^0.9.0" 1285 | eslint-scope "5.1.1" 1286 | events "^3.2.0" 1287 | glob-to-regexp "^0.4.1" 1288 | graceful-fs "^4.2.9" 1289 | json-parse-even-better-errors "^2.3.1" 1290 | loader-runner "^4.2.0" 1291 | mime-types "^2.1.27" 1292 | neo-async "^2.6.2" 1293 | schema-utils "^3.1.0" 1294 | tapable "^2.1.1" 1295 | terser-webpack-plugin "^5.1.3" 1296 | watchpack "^2.4.0" 1297 | webpack-sources "^3.2.3" 1298 | 1299 | which@^2.0.1: 1300 | version "2.0.2" 1301 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1302 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1303 | dependencies: 1304 | isexe "^2.0.0" 1305 | 1306 | wildcard@^2.0.0: 1307 | version "2.0.0" 1308 | resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" 1309 | integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== 1310 | 1311 | yallist@^4.0.0: 1312 | version "4.0.0" 1313 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1314 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1315 | --------------------------------------------------------------------------------