├── .DS_Store ├── .gitattributes ├── .gitignore ├── README.md ├── package.json ├── src ├── BaileysResponder.ts ├── CMDLineChat.ts ├── ChatAPI2Responder.ts ├── LanguageProcessor.ts ├── WAResponder.ts ├── example │ ├── .DS_Store │ ├── index.ts │ └── intents │ │ ├── doc-access.ts │ │ ├── greeting.json │ │ ├── help.ts │ │ ├── img-access.ts │ │ ├── index.ts │ │ └── timings.json ├── index.ts ├── types.ts └── utils.ts ├── tsconfig.json └── yarn.lock /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adiwajshing/WhatsAppInfoBot/61838680a771dbe490df7b4e59628f0e60939af9/.DS_Store -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | Example/auth_info.json 3 | package-lock.json 4 | dist 5 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WhatsappInfoBot - A framework to build bots generally, but specifically on WhatsApp. 2 | 3 | The framework uses [natural](https://github.com/NaturalNode/natural) (implemented by [@actuallysoham](https://github.com/actuallysoham)) to perform the natural language processing part. It can [Baileys](https://github.com/adiwajshing/Baileys) to interact with WhatsApp or with [SendMammy]() webhooks. 4 | 5 | ## Install 6 | 7 | 1. Edge version: `yarn add github:adiwajshing/WhatsappInfoBot` 8 | 2. Stable version: `yarn add @adiwajshing/whatsapp-info-bot` 9 | 10 | ## Building Intents 11 | 12 | The library follows a modular design. 13 | For example, a simple intent to answer queries about timings could look look like this: 14 | 15 | [`timings.json`](/src/example/intents/timings.json) 16 | ``` javascript 17 | { 18 | "keywords": ["timings","time","when","timing","schedule","open","close"], // the keywords to identify an intent 19 | "answer": "*Timings for {{entity.key}} are:*\n {{entity.value}}", // the answer for this intent 20 | "entities": { // list of things the bot can answer for the `timings` intent 21 | "piano room": "6:00AM-12:00AM", 22 | "lunch": "12:15PM-02:30PM", 23 | "breakfast": "08:00AM-10:30AM", 24 | "snacks": "04:45PM-06:15PM", 25 | "dinner": "07:30PM-10:15PM", 26 | "laundry": "dropoff: Mon & Thu 08:00AM-02:00PM\npickup: Wed & Sat 04:30PM-06:00PM", 27 | "library": "all the time fren, except friday", 28 | "salon": { 29 | "alternates": ["parlour", "parlor", "saloon"], // alternate names for the same entity 30 | "value": "11:00AM-7:00PM, closed on tuesdays" 31 | }, 32 | "asg": "shuts at 11:30PM" 33 | }, 34 | "meta": { // some optional metadata to maybe create user facing documentation, see Example/intents/help.js 35 | "userFacingName": ["timings"], 36 | "description": "Timings for facilities", 37 | "examples": ["mail room timings", "timing 4 dinner", "yo bro, when can i get lunch"] 38 | } 39 | } 40 | ``` 41 | 42 | And use this intent like this: 43 | ``` ts 44 | import timings from './timings.json' 45 | import { createLanguageProcessor } from '@adiwajshing/whatsapp-info-bot/LanguageProcessor' 46 | 47 | createLanguageProcessor([ timings ]).chat() // will start chat in terminal 48 | ``` 49 | 50 | So, if somebody asks the bot *ayy, till when does the parlour stay open?*, the bot will reply with: 51 | ``` 52 | Timings for salon: 53 | 11:00AM-7:00PM, closed on tuesdays 54 | ``` 55 | 56 | Here, `{{entity.key}}` maps onto the key, `salon` & `{{entity.value}}` maps onto the value, `11:00AM-7:00PM, closed on tuesdays`. 57 | Note: The syntax for these is the `Mustache` templating system. [Here](https://mustache.github.io/mustache.5.html) are the docs for the same. 58 | 59 | Moreover, because `parlour` is an alternate name for *salon*, the library maps `parlour` back to the true name `salon` and then responds. 60 | 61 | Sometimes, statically typing intents like this is too much of a pain or impossible to do. What if one wants to fetch the weather? Then, one could use a js class to describe the intent. 62 | 63 | For example, `weather.js` could look like the following: 64 | 65 | ``` ts 66 | 67 | export default async () => { 68 | const entities: {[_: string]: string} = {} 69 | 70 | const fetchCities = async() => { 71 | // fetch the cities you can answer for, possibly using a REST API 72 | // fetch weather.com/rest or something 73 | // then call this function to finally update the entities, you can leave the values blank because the answer will be fetched 74 | entities = {"new york": "", "sf": "", "new delhi": "", "tokyo": ""} 75 | } 76 | await fetchCities() 77 | return { 78 | keywords: ['weather', 'like'], 79 | entities: entities, 80 | answer: (entities: string[], user: string) => { 81 | // fetch the cities you can answer for, possibly using a REST API 82 | // fetch weather.com/rest or something 83 | return "lol I dont know" 84 | }, 85 | meta: { 86 | userFacingName: ["weather"], 87 | description: "Ask about the weather in different cities", 88 | examples: ["weather in SF?", "new york weather", "listen fren, you better tell me what its like in Bombay"] 89 | } 90 | } 91 | } 92 | ``` 93 | 94 | This class intent can be used very similarly, like: 95 | ``` ts 96 | import timings from './timings.json' 97 | import weather from './weather' 98 | import { createLanguageProcessor } from '@adiwajshing/whatsapp-info-bot/LanguageProcessor' 99 | 100 | (async () => { 101 | createLanguageProcessor( 102 | [ 103 | timings, 104 | await weather() 105 | ], 106 | { 107 | parsingFailedText: 'I dont understand {{input}}' 108 | } 109 | ).chat() // will start chat in terminal 110 | })() 111 | 112 | ``` 113 | 114 | ### Regexp based intents 115 | 116 | Sometimes, you require more precise intent parsing that requires regular expressions. You can add that as well. 117 | 118 | Example for a document access intent: 119 | ``` ts 120 | export default { 121 | regexps: [ 122 | /(?:i want to |)access doc(?:ument|) ([a-z0-9]*)(?: and ([a-z0-9]*)|)/ 123 | ], 124 | entities: { }, 125 | answer: entities => { 126 | return 'I see you want to access docs ' + entities.join(', ') 127 | }, 128 | meta: { 129 | userFacingName: [ 'documents', 'document access' ], 130 | description: 'Access a document by ID. Of course, this is a test', 131 | examples: [ 132 | 'I want to access document 1234 and 5678', 133 | 'access doc 1234' 134 | ] 135 | } 136 | } 137 | ``` 138 | 139 | ## Usage over WhatsApp: 140 | 141 | ### With Baileys 142 | 143 | ``` ts 144 | import timings from './timings.json' 145 | import weather from './weather' 146 | import { createLanguageProcessor, createBaileysResponder } from '@adiwajshing/whatsapp-info-bot/LanguageProcessor' 147 | 148 | (async () => { 149 | const languageProcessor = createLanguageProcessor( 150 | [ 151 | timings, 152 | await weather() 153 | ], 154 | { 155 | parsingFailedText: 'I dont understand {{input}}' 156 | } 157 | ) 158 | 159 | createBaileysResponder( 160 | languageProcessor, 161 | { 162 | authFile: './auth_info.json' 163 | respondToPendingMessages: false // will respond to unread messages 164 | } 165 | ).start() // will connect and start responding to messages 166 | })() 167 | ``` 168 | The first time you run the bot on WhatsApp, you will have to scan the QR code to enable WhatsApp Web. 169 | Once you run this code, the responder will now connect to WhatsApp & it'll print out a QR code for you to scan with WhatsApp on your phone. 170 | Once you scan it with your phone, the bot will start recieving & responding to messages. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@adiwajshing/whatsapp-info-bot", 3 | "version": "2.0.0", 4 | "description": "A framework to make bots", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "prepare": "tsc", 9 | "test:chat": "ts-node src/example/intents --chat", 10 | "example": "ts-node src/example/index.ts", 11 | "build": "tsc" 12 | }, 13 | "files": [ 14 | "dist/*" 15 | ], 16 | "keywords": [], 17 | "repository": { 18 | "url": "git@github.com:adiwajshing/WhatsAppInfoBot.git" 19 | }, 20 | "author": "Adhiraj Singh", 21 | "license": "ISC", 22 | "dependencies": { 23 | "got": "^11.8.1", 24 | "he": "^1.2.0", 25 | "mustache": "^4.1.0", 26 | "natural": "^2.1.5" 27 | }, 28 | "peerDependencies": { 29 | "@adiwajshing/baileys": "^3.4.0", 30 | "@chatdaddy/client": "git+https://github.com/chatdaddy/typescript-client" 31 | }, 32 | "devDependencies": { 33 | "@adiwajshing/baileys": "^3.4.0", 34 | "@chatdaddy/client": "git+https://github.com/chatdaddy/typescript-client", 35 | "@types/aws-lambda": "^8.10.82", 36 | "@types/he": "^1.1.1", 37 | "@types/mustache": "^4.1.1", 38 | "@types/natural": "^2.1.1", 39 | "@types/node": "^14.14.31", 40 | "ts-node": "^9.1.1", 41 | "typescript": "^4.1.5" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/BaileysResponder.ts: -------------------------------------------------------------------------------- 1 | import type { MessageOptions, MessageType, WAConnection, WAMessage } from '@adiwajshing/baileys' 2 | import { Answer, LanguageProcessor, WAResponderParameters } from "./types"; 3 | import { onChatUpdate, onWAMessage } from "./WAResponder"; 4 | import { promises as fs } from "fs"; 5 | 6 | export type BaileysResponderParameters = WAResponderParameters & { 7 | authFile: string 8 | } 9 | export const createBaileysResponder = ( 10 | processor: LanguageProcessor, 11 | metadata: BaileysResponderParameters 12 | ) => { 13 | const Baileys = require('@adiwajshing/baileys') 14 | if(!Baileys) throw new Error('Baileys not found') 15 | 16 | const connection: WAConnection = new Baileys.WAConnection() 17 | connection.autoReconnect = Baileys.ReconnectMode.onAllErrors 18 | 19 | const sendMessage = async(jid: string, answer: Answer, quoted: WAMessage) => { 20 | 21 | let type: MessageType 22 | let content: any 23 | let options: Partial = {} 24 | if(typeof answer === 'object' && 'template' in answer) { 25 | throw new Error('Baileys responder does not support templates') 26 | } else if(typeof answer === 'string') { 27 | content = answer 28 | type = Baileys.MessageType.conversation 29 | } else { 30 | if(answer.image) { 31 | content = answer.image 32 | options = { caption: answer.text } 33 | type = Baileys.MessageType.imageMessage 34 | } else if(answer.video) { 35 | content = answer.video 36 | options = { caption: answer.text } 37 | type = Baileys.MessageType.videoMessage 38 | } else if(answer.audio) { 39 | content = answer.video 40 | type = Baileys.MessageType.audioMessage 41 | } else if(answer.document) { 42 | content = answer.document 43 | type = Baileys.MessageType.documentMessage 44 | } else if(answer.contact) { 45 | throw new Error('No support for contact messages right now') 46 | } else { 47 | content = answer.text 48 | type = Baileys.MessageType.conversation 49 | } 50 | } 51 | 52 | await connection.updatePresence(jid, Baileys.Presence.available) 53 | Baileys.delay (250) 54 | 55 | await connection.chatRead(jid) 56 | Baileys.delay (250) 57 | 58 | await connection.updatePresence(jid, Baileys.Presence.composing) 59 | Baileys.delay (2000) 60 | 61 | await connection.sendMessage(jid, content, type, { quoted, ...options }) 62 | } 63 | 64 | connection.on('chat-update', update => ( 65 | onChatUpdate(update, { sendMessage, metadata, processor }) 66 | )) 67 | 68 | return { 69 | start: async() => { 70 | const {authFile} = metadata 71 | const authExists = await fs.access(authFile).catch(() => false) 72 | authExists && connection.loadAuthInfo(authFile) 73 | 74 | const hasAuth = connection.canLogin() 75 | await connection.connect() 76 | 77 | if (hasAuth) { 78 | fs.writeFile( 79 | authFile, 80 | JSON.stringify( 81 | connection.base64EncodedAuthInfo(), 82 | null, 83 | "\t" 84 | ) 85 | ) 86 | } 87 | console.log ("Using account of: " + connection.user.name) 88 | 89 | if (metadata.respondToPendingMessages) { 90 | const unreadMessages = await connection.loadAllUnreadMessages() 91 | console.log (`responding to ${unreadMessages.length} unread messages`) 92 | for (let message of unreadMessages) { 93 | await onWAMessage(message, { sendMessage, metadata, processor }) 94 | } 95 | } 96 | }, 97 | close: () => connection.close() 98 | } 99 | } -------------------------------------------------------------------------------- /src/CMDLineChat.ts: -------------------------------------------------------------------------------- 1 | import { randomBytes } from 'crypto' 2 | import {createInterface} from 'readline' 3 | import { LanguageProcessor } from './types' 4 | 5 | export const chat = ({output}: LanguageProcessor) => { 6 | console.log("type 'q' to exit;") 7 | const readline = createInterface({input: process.stdin, output: process.stdout}) 8 | 9 | const getInput = () => { 10 | readline.question("\ntype: ", async (ques: string) => { 11 | if (ques === "q") { 12 | readline.close() 13 | process.exit(0) 14 | } else { 15 | try { 16 | const ctx = { 17 | userId: 'test', 18 | messageId: randomBytes(8).toString('hex') 19 | } 20 | const response = await output(ques, ctx) 21 | console.log("response:\n", response) 22 | } catch(error: any) { 23 | console.log(`fallback:\n${error.message}\ntrace: ${error.stack}`) 24 | } finally { 25 | getInput() 26 | } 27 | } 28 | }) 29 | } 30 | getInput() 31 | } -------------------------------------------------------------------------------- /src/ChatAPI2Responder.ts: -------------------------------------------------------------------------------- 1 | import type { makeAccessTokenFactory, Message, MessageAttachment, MessageCompose, Configuration } from "@chatdaddy/client" 2 | import type { APIGatewayProxyEvent } from "aws-lambda" 3 | import { Answer, LanguageProcessor, WAResponderParameters, FileAnswer } from "./types" 4 | 5 | // serverless function for interacting with ChatAPI2 APIs 6 | 7 | export type ChatApi2ResponderParameters = WAResponderParameters & { 8 | refreshToken: string 9 | } 10 | 11 | type ChatAPISendMessageOptions = { 12 | id: string 13 | accountId: string 14 | 15 | teamId: string 16 | 17 | answer: Answer 18 | quotedId?: string 19 | } 20 | 21 | const DEFAULT_CHATS_FETCH_SIZE = 75 22 | 23 | const ATTACH_TYPES = ['image', 'video', 'audio', 'document', 'contact'] as const 24 | 25 | export const createChatAPI2Responder = ( 26 | processor: LanguageProcessor, 27 | metadata: ChatApi2ResponderParameters 28 | ) => { 29 | let getToken: ReturnType 30 | 31 | return { 32 | handler: async (event: APIGatewayProxyEvent) => { 33 | const { verifyToken } = await import('@chatdaddy/client') 34 | 35 | const authToken = event.headers['Authorization']?.replace('Bearer ', '') 36 | const { user } = await verifyToken(authToken) 37 | 38 | console.log('received web-hook for ' + user.teamId) 39 | 40 | const body = JSON.parse(event.body) 41 | 42 | console.log('event is ', body.event) 43 | 44 | switch(body.event) { 45 | case 'message-insert': 46 | const msgs = body.data as Message[] 47 | for(const msg of msgs) { 48 | await respondToMessage(msg, user.teamId) 49 | } 50 | break 51 | } 52 | 53 | return { statusCode: 204 } 54 | }, 55 | respondToUnrespondedChats 56 | } 57 | 58 | async function sendWAMessage({ id, accountId, answer, quotedId, teamId }: ChatAPISendMessageOptions) { 59 | const { MessagesApi } = await import('@chatdaddy/client') 60 | const messagesApi = new MessagesApi(await getConfiguration(teamId)) 61 | 62 | const composeOpts: MessageCompose = { 63 | text: '', 64 | miscOptions: { 65 | withTyping: true, 66 | randomizeMessage: false 67 | }, 68 | quoted: { 69 | id: quotedId, 70 | chatId: id 71 | }, 72 | } 73 | 74 | if(typeof answer === 'object' && 'template' in answer) { 75 | throw new Error('template not supported') 76 | } else if(typeof answer === 'string') { 77 | composeOpts.text = answer 78 | } else { 79 | const attachments: MessageAttachment[] = [] 80 | composeOpts.text = answer.text || '' 81 | for(const key of ATTACH_TYPES) { 82 | const item = answer[key] as FileAnswer 83 | if(item) { 84 | attachments.push({ 85 | type: key, 86 | url: item.url, 87 | mimetype: item.mimetype, 88 | filename: item.name 89 | }) 90 | } 91 | } 92 | if(attachments.length) { 93 | composeOpts.attachments = attachments 94 | } 95 | } 96 | 97 | await messagesApi.messagesPost({ 98 | accountId, 99 | chatId: id, 100 | messageCompose: composeOpts, 101 | }) 102 | } 103 | 104 | async function respondToMessage(msg: Message, teamId: string) { 105 | if(!msg.fromMe && !msg.action) { 106 | console.log(`recv message on ${msg.accountId}/${msg.id} from "${msg.senderContactId}" -- "${msg.text?.slice(0, 150)}""`) 107 | const text = msg.text 108 | 109 | let responses: Answer[] 110 | try { 111 | responses = await processor.output(text, { messageId: msg.id, userId: msg.senderContactId }) 112 | } catch (err: any) { 113 | // do not respond if its a group 114 | if (msg.chatId.includes("@g.us")) return 115 | responses = [ 116 | (err.message || err).replace('Error: ', '') 117 | ] 118 | } 119 | if (responses) { 120 | for(const response of responses) { 121 | console.log({ 122 | message: 'replying', 123 | reply: response, 124 | }) 125 | await sendWAMessage({ 126 | id: msg.chatId, 127 | accountId: msg.accountId, 128 | teamId: teamId, 129 | answer: response, 130 | quotedId: msg.id 131 | }) 132 | } 133 | } 134 | } 135 | } 136 | 137 | async function respondToUnrespondedChats(teamId: string) { 138 | const { ChatsApi } = await import('@chatdaddy/client') 139 | const chatsApi = new ChatsApi(await getConfiguration(teamId)) 140 | 141 | const { data: { chats } } = await chatsApi.chatsGet( 142 | { 143 | count: DEFAULT_CHATS_FETCH_SIZE, 144 | lastMessageFromMe: false, 145 | } 146 | ) 147 | console.log(`got ${chats.length} chats`) 148 | 149 | for(const chat of chats) { 150 | const msg = chat.messages?.[0] 151 | if(msg) { 152 | try { 153 | await respondToMessage(msg, teamId) 154 | } catch(error) { 155 | console.error(`error in responding to (${msg.chatId}, ${msg.id}): ${error}`) 156 | } 157 | } 158 | } 159 | 160 | console.log(`responded to ${chats.length} chats`) 161 | } 162 | 163 | async function getConfiguration(teamId: string): Promise { 164 | if(!getToken) { 165 | const { makeAccessTokenFactory } = await import('@chatdaddy/client') 166 | 167 | getToken = makeAccessTokenFactory({ 168 | request: { 169 | refreshToken: metadata.refreshToken, 170 | scopes: [ 171 | 'MESSAGES_SEND_TO_ALL', 172 | 'CHATS_ACCESS_ALL', 173 | ] 174 | }, 175 | }) 176 | } 177 | 178 | return { 179 | accessToken: () => getToken(teamId).then(t => t.token), 180 | isJsonMime() { 181 | return true 182 | } 183 | } 184 | } 185 | } -------------------------------------------------------------------------------- /src/LanguageProcessor.ts: -------------------------------------------------------------------------------- 1 | import natural from 'natural' 2 | import { chat as cmdLineChat } from './CMDLineChat' 3 | import { Answer, InputContext, IntentData, LanguageProcessorMetadata } from './types' 4 | import { parseTemplate } from './utils' 5 | 6 | const OBJECT_KEYS = new Set([ 'template', 'image', 'video', 'audio', 'document' ]) 7 | 8 | export const createLanguageProcessor = (intents: IntentData[], metadata: LanguageProcessorMetadata = {}) => { 9 | const tokenizer = new natural.RegexpTokenizer ({pattern: /\ /}) 10 | const trie = new natural.Trie(false) 11 | // add keywords to trie 12 | intents.forEach(intent => { 13 | if('keywords' in intent) { 14 | trie.addStrings(intent.keywords) 15 | } 16 | }) 17 | /** 18 | * Extract all intents & corresponding entities from a given input text 19 | * @param input - the input text 20 | * @returns array of recognized intents and corresponding entities 21 | */ 22 | const extractIntentsAndOptions = (input: string) => { 23 | const findEntities = (intent: IntentData, input: string, method: 'includes' | 'equals') => ( 24 | Object.keys(intent.entities).filter(entity => { 25 | const list = [ 26 | entity, 27 | //@ts-ignore 28 | ...(intent.entities[entity].alternates || []) 29 | ] as string[] 30 | if(list.find(item => ( 31 | method === 'includes' ? input.includes(item) : input === item 32 | ))) { 33 | return entity 34 | } 35 | }) 36 | ) 37 | /** 38 | * Check if the input maps on exactly to some entity 39 | * For eg. if method=='equals' -- given intents "timings" & "meals" with entities "lunch" and input as "lunch", the function will return {timings: ["lunch"], meals: ["lunch"]} 40 | */ 41 | const extractEntities = (input: string, intents: IntentData[], method: 'includes' | 'equals') => ( 42 | intents.map(intent => { 43 | const entities = findEntities(intent, input, method) 44 | if(entities.length > 0) { 45 | return { intent, entities } 46 | } 47 | }).filter(Boolean) 48 | ) 49 | /** Tokenize the given input string & stem the words */ 50 | const stemInput = (input: string) => { 51 | const words = tokenizer.tokenize(input) 52 | return words.map(word => natural.PorterStemmer.stem(word)) 53 | } 54 | /** Extract the possible keyword-based intents from the stemmed words */ 55 | const getPossibleIntents = (input: string) => { 56 | const stemmedWords = stemInput(input) 57 | const wordCloudSet = new Set( 58 | stemmedWords.filter(word => trie.contains(word)).flat() 59 | ) 60 | return intents.map(intent => { 61 | let entities: string[] 62 | if('keywords' in intent) { 63 | if(!!intent.keywords.find(keyword => wordCloudSet.has(keyword))) { 64 | entities = findEntities(intent, input, 'includes') 65 | } 66 | } else { 67 | for(const regexp of intent.regexps) { 68 | const result = new RegExp(regexp, 'gi').exec(input) 69 | if(!result) continue 70 | 71 | entities = [] 72 | let i = 1 73 | while(typeof result[i] !== 'undefined') { 74 | entities.push(result[i]) 75 | i += 1 76 | } 77 | } 78 | } 79 | if(entities) { 80 | return { 81 | intent, 82 | entities 83 | } 84 | } 85 | }) 86 | .filter(Boolean) 87 | } 88 | // remove all punctuations and unnecessary items 89 | input = input.toLowerCase().replace(/’|!|'|\?|\./g, '').trim() 90 | // first, do a simple extract 91 | let extractedIntents = extractEntities(input, intents, 'equals') 92 | if (extractedIntents.length == 0) { // if nothing was picked up 93 | extractedIntents = getPossibleIntents(input) 94 | } 95 | return extractedIntents 96 | } 97 | const computeOutput = async(data: IntentData, entities: string[], ctx: InputContext) => { 98 | let answer: Answer | Answer[] 99 | if (typeof data.answer === 'function') { // if the intent requires a function to answer 100 | answer = await data.answer(entities, ctx) 101 | } else if(entities.length === 0) { 102 | if (typeof data.answer === 'string' && data.answer.includes("{{")) { // if the answer requires an entity to answer but no entities were parsed 103 | throw new Error( 104 | metadata.entityRequiredText(Object.keys(data.entities)) 105 | ) 106 | } 107 | answer = data.answer 108 | } else { 109 | answer = await Promise.all( 110 | entities.map (key => { 111 | // account for the fact that the 'value' may be a property 112 | const entityObj = data.entities[key] 113 | const value = typeof entityObj === 'object' && 'value' in entityObj ? entityObj.value : entityObj 114 | 115 | if(typeof value === 'function') return value(entities, ctx) 116 | else { 117 | const mustacheParams = { entity: { key, value } } 118 | if(typeof data.answer !== 'string') { 119 | throw new Error(parseTemplate(metadata.expectedStringAnswerText, mustacheParams)) 120 | } 121 | return parseTemplate(data.answer, mustacheParams) 122 | } 123 | }) 124 | ) 125 | } 126 | return answer 127 | } 128 | /** 129 | * Get the response for a given input string 130 | * @param user - ID of the user who is requesting the output 131 | * @returns the response 132 | */ 133 | const output = async (input: string, ctx: InputContext) => { 134 | const compileAnswer = (strings: (string | { text: string })[]) => ( 135 | strings.length===1 ? 136 | //@ts-ignore 137 | (strings[0].text || strings[0]) : 138 | //@ts-ignore 139 | strings.map ((str, i) => `*${i+1}.* ${str.text || str}`).join("\n") 140 | ) as string 141 | 142 | let extractedIntents = extractIntentsAndOptions(input) 143 | if (extractedIntents.length > 1) { // if more than one intent was recognized & a greeting was detected too 144 | extractedIntents = extractedIntents.filter(intent => !intent.intent.isGreeting) 145 | } if (extractedIntents.length === 0) { 146 | throw new Error( 147 | parseTemplate(metadata.parsingFailedText, { input }) 148 | ) 149 | } 150 | // compute the output for each intent & map the errors as text 151 | const tasks = extractedIntents.map(({ intent, entities }) => ( 152 | computeOutput(intent, entities, ctx) 153 | )) 154 | const outputs = await Promise.allSettled(tasks) 155 | const correctOutputs = outputs.map(output => ( 156 | output.status === 'fulfilled' && output.value 157 | )).filter(Boolean).flat() 158 | const errorOutputs = outputs.map(output => ( 159 | output.status === 'rejected' && (output.reason?.message || output.reason) as string 160 | )).filter(Boolean).flat() 161 | 162 | if (!!correctOutputs.length) { 163 | // check if all answers are strings 164 | const allStrings = !correctOutputs.find(item => ( 165 | typeof item === 'object' && 166 | !!Object.keys(item).filter(k => OBJECT_KEYS.has(k)).length 167 | )) 168 | if(allStrings) { 169 | return [ 170 | compileAnswer(correctOutputs as { text: string }[]) 171 | ] 172 | } 173 | return correctOutputs 174 | } else { 175 | throw new Error(compileAnswer(errorOutputs)) 176 | } 177 | } 178 | const chat = () => cmdLineChat({ output }) 179 | 180 | if(!metadata.entityRequiredText) { 181 | metadata.entityRequiredText = availableEntities => ( 182 | "Sorry, I can't answer this specific query.\n" + 183 | "However, I can answer for the following options:\n " + availableEntities?.join("\n ") 184 | ) 185 | } 186 | if(!metadata.expectedStringAnswerText) { 187 | metadata.expectedStringAnswerText = 'Expected a string for {{entity.key}}' 188 | } 189 | if(!metadata.parsingFailedText) { 190 | metadata.parsingFailedText = 'Unknown command: {{input}}' 191 | } 192 | if(process.argv.includes('--chat')) { 193 | chat() 194 | } 195 | return { 196 | output, 197 | chat 198 | } 199 | } -------------------------------------------------------------------------------- /src/WAResponder.ts: -------------------------------------------------------------------------------- 1 | import { Answer, InputContext, LanguageProcessor, WAResponderParameters } from "./types" 2 | import type { WAMessage, WAChatUpdate, proto } from '@adiwajshing/baileys' 3 | 4 | // file contains generic code to build a WA responder 5 | 6 | export type WAMessageParameters = { 7 | sendMessage: (jid: string, reply: Answer, quoting?: WAMessage) => Promise 8 | metadata: WAResponderParameters, 9 | processor: LanguageProcessor 10 | } 11 | export const onChatUpdate = async( 12 | chatUpdate: WAChatUpdate, 13 | p: WAMessageParameters 14 | ) => { 15 | if(chatUpdate.hasNewMessage) { 16 | let msg: WAMessage 17 | if(chatUpdate.messages.all) { 18 | msg = chatUpdate.messages.all()[0] 19 | } else { 20 | //@ts-ignore 21 | msg = chatUpdate.messages[0] 22 | } 23 | await onWAMessage(msg, p) 24 | } 25 | } 26 | export const onWAMessage = async( 27 | message: WAMessage, 28 | { sendMessage, metadata, processor }: WAMessageParameters 29 | ) => { 30 | // obviously don't respond to your own messages 31 | if (message.key.fromMe) return 32 | 33 | const senderID = message.key.remoteJid 34 | const messageText = message.message?.conversation || message.message?.extendedTextMessage?.text 35 | if (!message.message) { 36 | console.log("recieved notification from " + senderID + " of type " + message.toJSON().messageStubType + "; cannot be responded to") 37 | return 38 | } 39 | if (!messageText) { 40 | console.log("recieved message from " + senderID + " with no text: " + JSON.stringify(message).slice(0, 100)) 41 | return 42 | } 43 | 44 | // if a delay trigger is specified 45 | if (metadata.minimumDelayTriggerS && metadata.delayMessage) { 46 | // get timestamp of message 47 | //@ts-ignore 48 | const sendTime = message.messageTimestamp?.low || message.messageTimestamp 49 | const diff = (Date.now()/1000)-sendTime 50 | if (diff > metadata.minimumDelayTriggerS) { 51 | console.log (`been ${diff} seconds since message, responding with delay message to ${senderID}`) 52 | // respond if not a group 53 | if (!senderID.includes("@g.us")) await sendMessage(senderID, metadata.delayMessage) 54 | } 55 | } 56 | 57 | let responses: Answer[] 58 | const ctx: InputContext = { 59 | userId: senderID, 60 | messageId: message.key.id 61 | } 62 | const [messageContent] = Object.values(message.message) 63 | if(typeof messageContent === 'object' && messageContent.contextInfo) { 64 | const contextInfo = messageContent.contextInfo as proto.IContextInfo 65 | if(contextInfo.remoteJid && contextInfo.stanzaId) { 66 | ctx.quotedMessage = { 67 | id: contextInfo.stanzaId, 68 | remoteJid: contextInfo.remoteJid 69 | } 70 | } 71 | } 72 | try { 73 | responses = await processor.output(messageText, ctx) 74 | } catch (err: any) { 75 | // do not respond if its a group 76 | if (senderID.includes("@g.us")) return 77 | responses = [ 78 | (err.message || err).replace('Error: ', '') 79 | ] 80 | } 81 | if (responses) { 82 | for(const response of responses) { 83 | console.log({ 84 | message: 'replying', 85 | context: ctx, 86 | reply: response, 87 | }) 88 | await sendMessage(ctx.userId, response, message) 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /src/example/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adiwajshing/WhatsAppInfoBot/61838680a771dbe490df7b4e59628f0e60939af9/src/example/.DS_Store -------------------------------------------------------------------------------- /src/example/index.ts: -------------------------------------------------------------------------------- 1 | import LanguageProcessor from './intents' 2 | import { createBaileysResponder } from '../BaileysResponder' 3 | 4 | createBaileysResponder( 5 | LanguageProcessor, 6 | { authFile: './auth_info.json' } 7 | ) -------------------------------------------------------------------------------- /src/example/intents/doc-access.ts: -------------------------------------------------------------------------------- 1 | import { IntentData } from "../../types"; 2 | 3 | export default { 4 | regexps: [ 5 | /(?:i want to |)access doc(?:ument|) ([a-z0-9]*)(?: and ([a-z0-9]*)|)/ 6 | ], 7 | entities: { }, 8 | answer: entities => { 9 | return 'I see you want to access docs ' + entities.join(', ') 10 | }, 11 | meta: { 12 | userFacingName: [ 'documents', 'document access' ], 13 | description: 'Access a document by ID. Of course, this is a test', 14 | examples: [ 15 | 'I want to access document 1234 and 5678', 16 | 'access doc 1234' 17 | ] 18 | } 19 | } as IntentData -------------------------------------------------------------------------------- /src/example/intents/greeting.json: -------------------------------------------------------------------------------- 1 | { 2 | "keywords": ["hi", "hello", "yo", "wassup", "messcat", "aye", "mate"], 3 | "entities": {}, 4 | "answer": "Hello! Type 'help' to know what all I can do", 5 | "meta": {}, 6 | "isGreeting": true 7 | } -------------------------------------------------------------------------------- /src/example/intents/help.ts: -------------------------------------------------------------------------------- 1 | import { IntentData, IntentEntities } from '../../types' 2 | 3 | export default (intents: IntentData[]) => { 4 | const entities: IntentEntities = {} 5 | const meta = {} 6 | 7 | let helpAnswer = '' 8 | /// compute the help answer from our JSON file 9 | const computeHelpAnswer = () => { 10 | let ans = ['*I can provide information about:*'] 11 | // go through all commands 12 | for (const {meta} of intents) { 13 | // don't include the help command or commands that don't have the required metadata 14 | if (!meta || !meta.description || !meta.userFacingName) { 15 | continue 16 | } 17 | // get the user facing name of the command, essentially the name of the command the user will see 18 | if (Array.isArray(meta.userFacingName)) { 19 | entities[meta.userFacingName[0]] = { 20 | alternates: meta.userFacingName.slice(1), 21 | value: meta.userFacingName[0] 22 | } 23 | } else { 24 | entities[meta.userFacingName] = meta.userFacingName 25 | } 26 | 27 | // get 2 examples 28 | const examples = "'" + meta.examples.slice(0, 2).join("', '") + "'" 29 | const str = "-" + meta.description + ". Eg: " + examples + "\n" + 30 | " type 'help for " + meta.userFacingName[0] + "' for more details" 31 | // add to our list 32 | ans.push(str) 33 | } 34 | // add a line about communicating with the admins 35 | //ans.push("For suggestions & feedback, WhatsApp: " + this.processor.metadata.admins.join(", ")) 36 | helpAnswer = ans.join("\n\n") 37 | console.log("computed help answer") 38 | } 39 | computeHelpAnswer() 40 | return { 41 | keywords: ['help', 'assist'], 42 | entities, 43 | answer: (entities: string[]) => { 44 | // if no specific help was asked for 45 | if (Object.keys(entities).length === 0) { 46 | // give generic answer 47 | return helpAnswer 48 | } else { 49 | return entities.map (str => { 50 | const data = intents.find(({ meta }) => meta?.userFacingName && meta.userFacingName[0] === str) 51 | // get the actual name of the command 52 | if (!data) { // if the command does not exist 53 | throw "No help available for '" + str + "' :/" 54 | } 55 | // create the answer 56 | let ans = [ 57 | str + " help:", 58 | "What it does: " + data.meta.description, 59 | "Example usage:", 60 | "- '" + data.meta.examples.join("'\n- '") + "'", 61 | ] 62 | let entities = Object.keys(data.entities) // if it has options, 63 | if (entities.length > 0) { 64 | // mention all the options it can answer for 65 | ans.push("I can answer for:") 66 | ans.push(" " + entities.join("\n ")) 67 | } 68 | // compile the answer 69 | return ans.join("\n") 70 | }) 71 | } 72 | }, 73 | meta 74 | } as IntentData 75 | } -------------------------------------------------------------------------------- /src/example/intents/img-access.ts: -------------------------------------------------------------------------------- 1 | import { IntentData } from "../../types"; 2 | 3 | const IMGS = [ 4 | 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSS815rKFCQQ7zkA8mDW5gH45sBT0Eiu7McHw&usqp=CAU', 5 | 'https://i.pinimg.com/originals/05/1b/7d/051b7d93394fc94c082f1801bc4ccfb2.jpg' 6 | ] 7 | // sends a random image 8 | export default { 9 | keywords: [ 10 | 'image', 11 | 'img', 12 | 'imag' 13 | ], 14 | entities: { }, 15 | answer: () => { 16 | const url = IMGS[Math.floor(Math.random()*IMGS.length)] 17 | return { 18 | text: 'here is a random image for you', 19 | image: { url } 20 | } 21 | }, 22 | meta: { 23 | userFacingName: [ 'random image' ], 24 | description: 'Replies with a random image', 25 | examples: [ 26 | 'image pls', 27 | 'send a random image' 28 | ] 29 | } 30 | } as IntentData -------------------------------------------------------------------------------- /src/example/intents/index.ts: -------------------------------------------------------------------------------- 1 | import greeting from './greeting.json' 2 | import timings from './timings.json' 3 | import docAccess from './doc-access' 4 | import imgAccess from './img-access' 5 | import help from './help' 6 | 7 | import { createLanguageProcessor } from '../../LanguageProcessor' 8 | 9 | export default createLanguageProcessor( 10 | [ 11 | greeting, 12 | timings, 13 | docAccess, 14 | imgAccess, 15 | help([greeting, timings, docAccess, imgAccess]) // generate help for our intents 16 | ], 17 | { 18 | parsingFailedText: "Sorry we couldn't understand '{{input}}'" 19 | } 20 | ) -------------------------------------------------------------------------------- /src/example/intents/timings.json: -------------------------------------------------------------------------------- 1 | { 2 | "keywords": ["timings","time","when","timing","schedule","open","close"], 3 | "answer": "*Timings for {{entity.key}} are:*\n {{entity.value}}", 4 | "entities": { 5 | "piano room": "6:00AM-12:00AM", 6 | "lunch": "12:15PM-02:30PM", 7 | "breakfast": "08:00AM-10:30AM", 8 | "snacks": "04:45PM-06:15PM", 9 | "dinner": "07:30PM-10:15PM", 10 | "laundry": "dropoff: Mon & Thu 08:00AM-02:00PM\npickup: Wed & Sat 04:30PM-06:00PM", 11 | "tuck shop": "10:00AM-12:00AM", 12 | "dosai": "12:00AM-12:00PM", 13 | "amul": "11:00AM-11:00PM", 14 | "dhaba": "02:00PM-04:00AM", 15 | "cross access": "08:00AM-12:30AM", 16 | "salon": { 17 | "alternates": ["parlour", "parlor", "saloon"], 18 | "value": "11:00AM-7:00PM, closed on tuesdays" 19 | }, 20 | "library": "all the time fren, except friday", 21 | "document centre": "08:00AM-07:00PM, all days except Sunday", 22 | "fuel zone": "10:00AM-02:00AM", 23 | "asg": "shuts at 11:30PM" 24 | }, 25 | "meta": { 26 | "userFacingName": ["timings"], 27 | "description": "Timings for facilities", 28 | "examples": ["mail room timings", "timing 4 dinner", "yo bro, when can i get lunch"] 29 | } 30 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './LanguageProcessor' 2 | export * from './types' 3 | export * from './BaileysResponder' 4 | export * from './WAResponder' 5 | export * from './ChatAPI2Responder' -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type InputContext = { 2 | /** the id of the user */ 3 | userId: string 4 | /** id of the message sent */ 5 | messageId: string 6 | /** info about the message that was quoted (if any) */ 7 | quotedMessage?: { 8 | id: string 9 | remoteJid: string 10 | } 11 | } 12 | export type FileAnswer = { url: string, name?: string, mimetype?: string } 13 | export type Answer = string | { 14 | text?: string 15 | image?: FileAnswer 16 | video?: FileAnswer 17 | audio?: FileAnswer 18 | document?: FileAnswer & { name: string, mimetype: string } 19 | contact?: { displayName: string, phoneNumber: string }[] 20 | } | { 21 | template: string, 22 | parameters: { [_: string]: any } 23 | } 24 | 25 | export type IntentAnswer = Answer | ((entities: string[], ctx: InputContext) => Promise | Answer) 26 | export type IntentEntities = { 27 | [_: string]: IntentAnswer | { alternates?: string[], value: IntentAnswer } 28 | } 29 | export type IntentData = ({ 30 | /** The keywords required to recognize an intent */ 31 | keywords: string[] 32 | } | { 33 | /** regular expressions to detect the intent */ 34 | regexps: (RegExp | string)[] 35 | }) & { 36 | /** The entities in this intent mapped to their respective answers */ 37 | entities: IntentEntities 38 | answer: IntentAnswer 39 | /** Some metadata about the command */ 40 | meta?: { 41 | description?: string 42 | userFacingName?: string | string[] 43 | examples?: string[] 44 | } 45 | /** 46 | * is this a greeting intent? 47 | * If this is picked up alongside another intent -- it is ignored 48 | */ 49 | isGreeting?: boolean 50 | } 51 | export type LanguageProcessorMetadata = { 52 | parsingFailedText?: string 53 | expectedStringAnswerText?: string 54 | entityRequiredText?: (availableEntities: string[]) => string 55 | } 56 | export type LanguageProcessor = { 57 | output: (input: string, ctx: InputContext) => Promise 58 | } 59 | export type Responser = { 60 | start: () => void | Promise 61 | close: () => void | Promise 62 | } 63 | export type CreateResponder = (processor: LanguageProcessor, args: T) => Responser 64 | 65 | export type WAResponderParameters = { 66 | /** send a sorry for delay message 67 | * if message is responded to X seconds after being received */ 68 | minimumDelayTriggerS?: number 69 | /** the content of the sorry for delay message */ 70 | delayMessage?: string 71 | /** should the app respond to pending messages on a reconnect */ 72 | respondToPendingMessages?: boolean 73 | } -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | 2 | import he from 'he' 3 | import mustache from 'mustache' 4 | 5 | export const parseTemplate = (text: string, params: {[_: string]: any}) => { 6 | text = mustache.render(text, params) 7 | text = he.decode(text) 8 | return text 9 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "ES2019" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 8 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 9 | "lib": [ 10 | "ES2020.string", 11 | "ES2020.Promise", 12 | "ES2019.Array" 13 | ] /* Specify library files to be included in the compilation. */, 14 | // "allowJs": true /* Allow javascript files to be compiled. */, 15 | // "checkJs": true, /* Report errors in .js files. */ 16 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 17 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 18 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 19 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 20 | // "outFile": "./", /* Concatenate and emit output to single file. */ 21 | "outDir": "./dist" /* Redirect output structure to the directory. */, 22 | "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, 23 | // "composite": true, /* Enable project compilation */ 24 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 25 | // "removeComments": true, /* Do not emit comments to output. */ 26 | // "noEmit": true, /* Do not emit outputs. */ 27 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 28 | "downlevelIteration": true /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */, 29 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 30 | 31 | /* Strict Type-Checking Options */ 32 | "strict": true /* Enable all strict type-checking options. */, 33 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 34 | "strictNullChecks": false /* Enable strict null checks. */, 35 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 36 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 37 | "strictPropertyInitialization": false /* Enable strict checking of property initialization in classes. */, 38 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 39 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 40 | 41 | /* Additional Checks */ 42 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 43 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 44 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 45 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 46 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 47 | 48 | /* Module Resolution Options */ 49 | "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, 50 | "resolveJsonModule": true, 51 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 52 | // "typeRoots": [], /* List of folders to include type definitions from. */ 53 | // "types": [], /* Type declaration files to be included in compilation. */ 54 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 55 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 56 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 57 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 58 | 59 | /* Source Map Options */ 60 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 61 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 62 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 63 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 64 | 65 | /* Experimental Options */ 66 | "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, 67 | "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, 68 | 69 | /* Advanced Options */ 70 | "skipLibCheck": true /* Skip type checking of declaration files. */, 71 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 72 | }, 73 | "exclude": ["./dist/**/*"] 74 | } 75 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@adiwajshing/baileys@^3.4.0": 6 | version "3.5.2" 7 | resolved "https://registry.yarnpkg.com/@adiwajshing/baileys/-/baileys-3.5.2.tgz#cf7d14bd9fd3c501896e7a7937192bff10721f1a" 8 | integrity sha512-tC9xGvVueql57pnEj6OwxTU2ENOfXMG9w4tVkbCh5w3BseyIjH+xqM0fd+hcOyYFdwi43bdMIlqYa39D50xGDQ== 9 | dependencies: 10 | "@adiwajshing/keyed-db" "^0.2.2" 11 | curve25519-js "^0.0.4" 12 | futoin-hkdf "^1.3.2" 13 | got "^11.8.1" 14 | https-proxy-agent "^5.0.0" 15 | jimp "^0.16.1" 16 | music-metadata "^7.4.1" 17 | pino "^6.7.0" 18 | pino-pretty "^4.3.0" 19 | protobufjs "^6.10.1" 20 | qrcode-terminal "^0.12.0" 21 | ws "^7.3.1" 22 | 23 | "@adiwajshing/keyed-db@^0.2.2": 24 | version "0.2.4" 25 | resolved "https://registry.yarnpkg.com/@adiwajshing/keyed-db/-/keyed-db-0.2.4.tgz#2a09e88fce20b2672deb60a7750c5fe3ab0dfd99" 26 | integrity sha512-yprSnAtj80/VKuDqRcFFLDYltoNV8tChNwFfIgcf6PGD4sjzWIBgs08pRuTqGH5mk5wgL6PBRSsMCZqtZwzFEw== 27 | 28 | "@babel/runtime@^7.7.2": 29 | version "7.16.0" 30 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b" 31 | integrity sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw== 32 | dependencies: 33 | regenerator-runtime "^0.13.4" 34 | 35 | "@chatdaddy/client@git+https://github.com/chatdaddy/typescript-client": 36 | version "0.1.0" 37 | resolved "git+https://github.com/chatdaddy/typescript-client#692c93543da4bcd8425f0c4c1baaa3a55106b828" 38 | dependencies: 39 | axios "^0.21.1" 40 | optionalDependencies: 41 | jsonwebtoken "^8.5.1" 42 | 43 | "@hapi/bourne@^2.0.0": 44 | version "2.0.0" 45 | resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" 46 | integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== 47 | 48 | "@jimp/bmp@^0.16.1": 49 | version "0.16.1" 50 | resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.16.1.tgz#6e2da655b2ba22e721df0795423f34e92ef13768" 51 | integrity sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg== 52 | dependencies: 53 | "@babel/runtime" "^7.7.2" 54 | "@jimp/utils" "^0.16.1" 55 | bmp-js "^0.1.0" 56 | 57 | "@jimp/core@^0.16.1": 58 | version "0.16.1" 59 | resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.16.1.tgz#68c4288f6ef7f31a0f6b859ba3fb28dae930d39d" 60 | integrity sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g== 61 | dependencies: 62 | "@babel/runtime" "^7.7.2" 63 | "@jimp/utils" "^0.16.1" 64 | any-base "^1.1.0" 65 | buffer "^5.2.0" 66 | exif-parser "^0.1.12" 67 | file-type "^9.0.0" 68 | load-bmfont "^1.3.1" 69 | mkdirp "^0.5.1" 70 | phin "^2.9.1" 71 | pixelmatch "^4.0.2" 72 | tinycolor2 "^1.4.1" 73 | 74 | "@jimp/custom@^0.16.1": 75 | version "0.16.1" 76 | resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.16.1.tgz#28b659c59e20a1d75a0c46067bd3f4bd302cf9c5" 77 | integrity sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A== 78 | dependencies: 79 | "@babel/runtime" "^7.7.2" 80 | "@jimp/core" "^0.16.1" 81 | 82 | "@jimp/gif@^0.16.1": 83 | version "0.16.1" 84 | resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.16.1.tgz#d1f7c3a58f4666482750933af8b8f4666414f3ca" 85 | integrity sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw== 86 | dependencies: 87 | "@babel/runtime" "^7.7.2" 88 | "@jimp/utils" "^0.16.1" 89 | gifwrap "^0.9.2" 90 | omggif "^1.0.9" 91 | 92 | "@jimp/jpeg@^0.16.1": 93 | version "0.16.1" 94 | resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.16.1.tgz#3b7bb08a4173f2f6d81f3049b251df3ee2ac8175" 95 | integrity sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w== 96 | dependencies: 97 | "@babel/runtime" "^7.7.2" 98 | "@jimp/utils" "^0.16.1" 99 | jpeg-js "0.4.2" 100 | 101 | "@jimp/plugin-blit@^0.16.1": 102 | version "0.16.1" 103 | resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz#09ea919f9d326de3b9c2826fe4155da37dde8edb" 104 | integrity sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg== 105 | dependencies: 106 | "@babel/runtime" "^7.7.2" 107 | "@jimp/utils" "^0.16.1" 108 | 109 | "@jimp/plugin-blur@^0.16.1": 110 | version "0.16.1" 111 | resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz#e614fa002797dcd662e705d4cea376e7db968bf5" 112 | integrity sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw== 113 | dependencies: 114 | "@babel/runtime" "^7.7.2" 115 | "@jimp/utils" "^0.16.1" 116 | 117 | "@jimp/plugin-circle@^0.16.1": 118 | version "0.16.1" 119 | resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz#20e3194a67ca29740aba2630fd4d0a89afa27491" 120 | integrity sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg== 121 | dependencies: 122 | "@babel/runtime" "^7.7.2" 123 | "@jimp/utils" "^0.16.1" 124 | 125 | "@jimp/plugin-color@^0.16.1": 126 | version "0.16.1" 127 | resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.16.1.tgz#0f298ba74dee818b663834cd80d53e56f3755233" 128 | integrity sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A== 129 | dependencies: 130 | "@babel/runtime" "^7.7.2" 131 | "@jimp/utils" "^0.16.1" 132 | tinycolor2 "^1.4.1" 133 | 134 | "@jimp/plugin-contain@^0.16.1": 135 | version "0.16.1" 136 | resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz#3c5f5c495fd9bb08a970739d83694934f58123f2" 137 | integrity sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg== 138 | dependencies: 139 | "@babel/runtime" "^7.7.2" 140 | "@jimp/utils" "^0.16.1" 141 | 142 | "@jimp/plugin-cover@^0.16.1": 143 | version "0.16.1" 144 | resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz#0e8caec16a40abe15b1b32e5383a603a3306dc41" 145 | integrity sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q== 146 | dependencies: 147 | "@babel/runtime" "^7.7.2" 148 | "@jimp/utils" "^0.16.1" 149 | 150 | "@jimp/plugin-crop@^0.16.1": 151 | version "0.16.1" 152 | resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz#b362497c873043fe47ba881ab08604bf7226f50f" 153 | integrity sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew== 154 | dependencies: 155 | "@babel/runtime" "^7.7.2" 156 | "@jimp/utils" "^0.16.1" 157 | 158 | "@jimp/plugin-displace@^0.16.1": 159 | version "0.16.1" 160 | resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz#4dd9db518c3e78de9d723f86a234bf98922afe8d" 161 | integrity sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw== 162 | dependencies: 163 | "@babel/runtime" "^7.7.2" 164 | "@jimp/utils" "^0.16.1" 165 | 166 | "@jimp/plugin-dither@^0.16.1": 167 | version "0.16.1" 168 | resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz#b47de2c0bb09608bed228b41c3cd01a85ec2d45b" 169 | integrity sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q== 170 | dependencies: 171 | "@babel/runtime" "^7.7.2" 172 | "@jimp/utils" "^0.16.1" 173 | 174 | "@jimp/plugin-fisheye@^0.16.1": 175 | version "0.16.1" 176 | resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz#f625047b6cdbe1b83b89e9030fd025ab19cdb1a4" 177 | integrity sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A== 178 | dependencies: 179 | "@babel/runtime" "^7.7.2" 180 | "@jimp/utils" "^0.16.1" 181 | 182 | "@jimp/plugin-flip@^0.16.1": 183 | version "0.16.1" 184 | resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz#7a99ea22bde802641017ed0f2615870c144329bb" 185 | integrity sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w== 186 | dependencies: 187 | "@babel/runtime" "^7.7.2" 188 | "@jimp/utils" "^0.16.1" 189 | 190 | "@jimp/plugin-gaussian@^0.16.1": 191 | version "0.16.1" 192 | resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz#0845e314085ccd52e34fad9a83949bc0d81a68e8" 193 | integrity sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg== 194 | dependencies: 195 | "@babel/runtime" "^7.7.2" 196 | "@jimp/utils" "^0.16.1" 197 | 198 | "@jimp/plugin-invert@^0.16.1": 199 | version "0.16.1" 200 | resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz#7e6f5a15707256f3778d06921675bbcf18545c97" 201 | integrity sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w== 202 | dependencies: 203 | "@babel/runtime" "^7.7.2" 204 | "@jimp/utils" "^0.16.1" 205 | 206 | "@jimp/plugin-mask@^0.16.1": 207 | version "0.16.1" 208 | resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz#e7f2460e05c3cda7af5e76f33ccb0579f66f90df" 209 | integrity sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q== 210 | dependencies: 211 | "@babel/runtime" "^7.7.2" 212 | "@jimp/utils" "^0.16.1" 213 | 214 | "@jimp/plugin-normalize@^0.16.1": 215 | version "0.16.1" 216 | resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz#032dfd88eefbc4dedc8b1b2d243832e4f3af30c8" 217 | integrity sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw== 218 | dependencies: 219 | "@babel/runtime" "^7.7.2" 220 | "@jimp/utils" "^0.16.1" 221 | 222 | "@jimp/plugin-print@^0.16.1": 223 | version "0.16.1" 224 | resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.16.1.tgz#66b803563f9d109825970714466e6ab9ae639ff6" 225 | integrity sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q== 226 | dependencies: 227 | "@babel/runtime" "^7.7.2" 228 | "@jimp/utils" "^0.16.1" 229 | load-bmfont "^1.4.0" 230 | 231 | "@jimp/plugin-resize@^0.16.1": 232 | version "0.16.1" 233 | resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz#65e39d848ed13ba2d6c6faf81d5d590396571d10" 234 | integrity sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ== 235 | dependencies: 236 | "@babel/runtime" "^7.7.2" 237 | "@jimp/utils" "^0.16.1" 238 | 239 | "@jimp/plugin-rotate@^0.16.1": 240 | version "0.16.1" 241 | resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz#53fb5d51a4b3d05af9c91c2a8fffe5d7a1a47c8c" 242 | integrity sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg== 243 | dependencies: 244 | "@babel/runtime" "^7.7.2" 245 | "@jimp/utils" "^0.16.1" 246 | 247 | "@jimp/plugin-scale@^0.16.1": 248 | version "0.16.1" 249 | resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz#89f6ba59feed3429847ed226aebda33a240cc647" 250 | integrity sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw== 251 | dependencies: 252 | "@babel/runtime" "^7.7.2" 253 | "@jimp/utils" "^0.16.1" 254 | 255 | "@jimp/plugin-shadow@^0.16.1": 256 | version "0.16.1" 257 | resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz#a7af892a740febf41211e10a5467c3c5c521a04c" 258 | integrity sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA== 259 | dependencies: 260 | "@babel/runtime" "^7.7.2" 261 | "@jimp/utils" "^0.16.1" 262 | 263 | "@jimp/plugin-threshold@^0.16.1": 264 | version "0.16.1" 265 | resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz#34f3078f9965145b7ae26c53a32ad74b1195bbf5" 266 | integrity sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA== 267 | dependencies: 268 | "@babel/runtime" "^7.7.2" 269 | "@jimp/utils" "^0.16.1" 270 | 271 | "@jimp/plugins@^0.16.1": 272 | version "0.16.1" 273 | resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.16.1.tgz#9f08544c97226d6460a16ced79f57e85bec3257b" 274 | integrity sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA== 275 | dependencies: 276 | "@babel/runtime" "^7.7.2" 277 | "@jimp/plugin-blit" "^0.16.1" 278 | "@jimp/plugin-blur" "^0.16.1" 279 | "@jimp/plugin-circle" "^0.16.1" 280 | "@jimp/plugin-color" "^0.16.1" 281 | "@jimp/plugin-contain" "^0.16.1" 282 | "@jimp/plugin-cover" "^0.16.1" 283 | "@jimp/plugin-crop" "^0.16.1" 284 | "@jimp/plugin-displace" "^0.16.1" 285 | "@jimp/plugin-dither" "^0.16.1" 286 | "@jimp/plugin-fisheye" "^0.16.1" 287 | "@jimp/plugin-flip" "^0.16.1" 288 | "@jimp/plugin-gaussian" "^0.16.1" 289 | "@jimp/plugin-invert" "^0.16.1" 290 | "@jimp/plugin-mask" "^0.16.1" 291 | "@jimp/plugin-normalize" "^0.16.1" 292 | "@jimp/plugin-print" "^0.16.1" 293 | "@jimp/plugin-resize" "^0.16.1" 294 | "@jimp/plugin-rotate" "^0.16.1" 295 | "@jimp/plugin-scale" "^0.16.1" 296 | "@jimp/plugin-shadow" "^0.16.1" 297 | "@jimp/plugin-threshold" "^0.16.1" 298 | timm "^1.6.1" 299 | 300 | "@jimp/png@^0.16.1": 301 | version "0.16.1" 302 | resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.16.1.tgz#f24cfc31529900b13a2dd9d4fdb4460c1e4d814e" 303 | integrity sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw== 304 | dependencies: 305 | "@babel/runtime" "^7.7.2" 306 | "@jimp/utils" "^0.16.1" 307 | pngjs "^3.3.3" 308 | 309 | "@jimp/tiff@^0.16.1": 310 | version "0.16.1" 311 | resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.16.1.tgz#0e8756695687d7574b6bc73efab0acd4260b7a12" 312 | integrity sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ== 313 | dependencies: 314 | "@babel/runtime" "^7.7.2" 315 | utif "^2.0.1" 316 | 317 | "@jimp/types@^0.16.1": 318 | version "0.16.1" 319 | resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.16.1.tgz#0dbab37b3202315c91010f16c31766d35a2322cc" 320 | integrity sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ== 321 | dependencies: 322 | "@babel/runtime" "^7.7.2" 323 | "@jimp/bmp" "^0.16.1" 324 | "@jimp/gif" "^0.16.1" 325 | "@jimp/jpeg" "^0.16.1" 326 | "@jimp/png" "^0.16.1" 327 | "@jimp/tiff" "^0.16.1" 328 | timm "^1.6.1" 329 | 330 | "@jimp/utils@^0.16.1": 331 | version "0.16.1" 332 | resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.16.1.tgz#2f51e6f14ff8307c4aa83d5e1a277da14a9fe3f7" 333 | integrity sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw== 334 | dependencies: 335 | "@babel/runtime" "^7.7.2" 336 | regenerator-runtime "^0.13.3" 337 | 338 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 339 | version "1.1.2" 340 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 341 | integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= 342 | 343 | "@protobufjs/base64@^1.1.2": 344 | version "1.1.2" 345 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 346 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 347 | 348 | "@protobufjs/codegen@^2.0.4": 349 | version "2.0.4" 350 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 351 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 352 | 353 | "@protobufjs/eventemitter@^1.1.0": 354 | version "1.1.0" 355 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 356 | integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= 357 | 358 | "@protobufjs/fetch@^1.1.0": 359 | version "1.1.0" 360 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 361 | integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= 362 | dependencies: 363 | "@protobufjs/aspromise" "^1.1.1" 364 | "@protobufjs/inquire" "^1.1.0" 365 | 366 | "@protobufjs/float@^1.0.2": 367 | version "1.0.2" 368 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 369 | integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= 370 | 371 | "@protobufjs/inquire@^1.1.0": 372 | version "1.1.0" 373 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 374 | integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= 375 | 376 | "@protobufjs/path@^1.1.2": 377 | version "1.1.2" 378 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 379 | integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= 380 | 381 | "@protobufjs/pool@^1.1.0": 382 | version "1.1.0" 383 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 384 | integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= 385 | 386 | "@protobufjs/utf8@^1.1.0": 387 | version "1.1.0" 388 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 389 | integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= 390 | 391 | "@sindresorhus/is@^4.0.0": 392 | version "4.2.0" 393 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.2.0.tgz#667bfc6186ae7c9e0b45a08960c551437176e1ca" 394 | integrity sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw== 395 | 396 | "@szmarczak/http-timer@^4.0.5": 397 | version "4.0.6" 398 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" 399 | integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== 400 | dependencies: 401 | defer-to-connect "^2.0.0" 402 | 403 | "@tokenizer/token@^0.3.0": 404 | version "0.3.0" 405 | resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" 406 | integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== 407 | 408 | "@types/aws-lambda@^8.10.82": 409 | version "8.10.85" 410 | resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.85.tgz#26cd76897b1972247cbc1a34b6f21d023e987437" 411 | integrity sha512-cMRXVxb+NMb6EekKel1fPBfz2ZqE5cGhIS14G7FVUM4Bqilx0lHKnZbsDLWLSeckDpkvlp5six2F7UWyEEJSoQ== 412 | 413 | "@types/cacheable-request@^6.0.1": 414 | version "6.0.2" 415 | resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" 416 | integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== 417 | dependencies: 418 | "@types/http-cache-semantics" "*" 419 | "@types/keyv" "*" 420 | "@types/node" "*" 421 | "@types/responselike" "*" 422 | 423 | "@types/he@^1.1.1": 424 | version "1.1.2" 425 | resolved "https://registry.yarnpkg.com/@types/he/-/he-1.1.2.tgz#0c8b275f36d2b8b651104638e4d45693349c3953" 426 | integrity sha512-kSJPcLO1x+oolc0R89pUl2kozldQ/fVQ1C1p5mp8fPoLdF/ZcBvckaTC2M8xXh3GYendXvCpy5m/a2eSbfgNgw== 427 | 428 | "@types/http-cache-semantics@*": 429 | version "4.0.1" 430 | resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" 431 | integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== 432 | 433 | "@types/keyv@*": 434 | version "3.1.3" 435 | resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41" 436 | integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg== 437 | dependencies: 438 | "@types/node" "*" 439 | 440 | "@types/long@^4.0.1": 441 | version "4.0.1" 442 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" 443 | integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== 444 | 445 | "@types/mustache@^4.1.1": 446 | version "4.1.2" 447 | resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.1.2.tgz#d0e158013c81674a5b6d8780bc3fe234e1804eaf" 448 | integrity sha512-c4OVMMcyodKQ9dpwBwh3ofK9P6U9ZktKU9S+p33UqwMNN1vlv2P0zJZUScTshnx7OEoIIRcCFNQ904sYxZz8kg== 449 | 450 | "@types/natural@^2.1.1": 451 | version "2.1.2" 452 | resolved "https://registry.yarnpkg.com/@types/natural/-/natural-2.1.2.tgz#f82ba70b34eec876a19cebf9af4ddbe1da4214f0" 453 | integrity sha512-piNFbfpNjEbr7E8vq8RK+6yualaBv8uGw+aeq7umg9MPw9MPAjytz14d7H5Okpjp+t58gMo7Mfhuw2ZLGqGJSg== 454 | dependencies: 455 | "@types/node" "*" 456 | 457 | "@types/node@*", "@types/node@>=13.7.0": 458 | version "16.11.6" 459 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" 460 | integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== 461 | 462 | "@types/node@^14.14.31": 463 | version "14.17.32" 464 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.32.tgz#2ca61c9ef8c77f6fa1733be9e623ceb0d372ad96" 465 | integrity sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ== 466 | 467 | "@types/responselike@*", "@types/responselike@^1.0.0": 468 | version "1.0.0" 469 | resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" 470 | integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== 471 | dependencies: 472 | "@types/node" "*" 473 | 474 | afinn-165@^1.0.2: 475 | version "1.0.4" 476 | resolved "https://registry.yarnpkg.com/afinn-165/-/afinn-165-1.0.4.tgz#3abf6b8922dd5db84d84e0abd155924381dd73a4" 477 | integrity sha512-7+Wlx3BImrK0HiG6y3lU4xX7SpBPSSu8T9iguPMlaueRFxjbYwAQrp9lqZUuFikqKbd/en8lVREILvP2J80uJA== 478 | 479 | agent-base@6: 480 | version "6.0.2" 481 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 482 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 483 | dependencies: 484 | debug "4" 485 | 486 | ansi-styles@^3.2.1: 487 | version "3.2.1" 488 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 489 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 490 | dependencies: 491 | color-convert "^1.9.0" 492 | 493 | ansi-styles@^4.1.0: 494 | version "4.3.0" 495 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 496 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 497 | dependencies: 498 | color-convert "^2.0.1" 499 | 500 | any-base@^1.1.0: 501 | version "1.1.0" 502 | resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" 503 | integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== 504 | 505 | apparatus@^0.0.10: 506 | version "0.0.10" 507 | resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e" 508 | integrity sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg== 509 | dependencies: 510 | sylvester ">= 0.0.8" 511 | 512 | arg@^4.1.0: 513 | version "4.1.3" 514 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 515 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 516 | 517 | args@^5.0.1: 518 | version "5.0.1" 519 | resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761" 520 | integrity sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ== 521 | dependencies: 522 | camelcase "5.0.0" 523 | chalk "2.4.2" 524 | leven "2.1.0" 525 | mri "1.1.4" 526 | 527 | atomic-sleep@^1.0.0: 528 | version "1.0.0" 529 | resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" 530 | integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== 531 | 532 | axios@^0.21.1: 533 | version "0.21.4" 534 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" 535 | integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== 536 | dependencies: 537 | follow-redirects "^1.14.0" 538 | 539 | base64-js@^1.3.1: 540 | version "1.5.1" 541 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 542 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 543 | 544 | bmp-js@^0.1.0: 545 | version "0.1.0" 546 | resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" 547 | integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= 548 | 549 | buffer-equal-constant-time@1.0.1: 550 | version "1.0.1" 551 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 552 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 553 | 554 | buffer-equal@0.0.1: 555 | version "0.0.1" 556 | resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" 557 | integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= 558 | 559 | buffer-from@^1.0.0: 560 | version "1.1.2" 561 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 562 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 563 | 564 | buffer@^5.2.0: 565 | version "5.7.1" 566 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 567 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 568 | dependencies: 569 | base64-js "^1.3.1" 570 | ieee754 "^1.1.13" 571 | 572 | cacheable-lookup@^5.0.3: 573 | version "5.0.4" 574 | resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" 575 | integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== 576 | 577 | cacheable-request@^7.0.1: 578 | version "7.0.2" 579 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" 580 | integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== 581 | dependencies: 582 | clone-response "^1.0.2" 583 | get-stream "^5.1.0" 584 | http-cache-semantics "^4.0.0" 585 | keyv "^4.0.0" 586 | lowercase-keys "^2.0.0" 587 | normalize-url "^6.0.1" 588 | responselike "^2.0.0" 589 | 590 | camelcase@5.0.0: 591 | version "5.0.0" 592 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" 593 | integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== 594 | 595 | chalk@2.4.2: 596 | version "2.4.2" 597 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 598 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 599 | dependencies: 600 | ansi-styles "^3.2.1" 601 | escape-string-regexp "^1.0.5" 602 | supports-color "^5.3.0" 603 | 604 | chalk@^4.0.0: 605 | version "4.1.2" 606 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 607 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 608 | dependencies: 609 | ansi-styles "^4.1.0" 610 | supports-color "^7.1.0" 611 | 612 | clone-response@^1.0.2: 613 | version "1.0.2" 614 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 615 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 616 | dependencies: 617 | mimic-response "^1.0.0" 618 | 619 | color-convert@^1.9.0: 620 | version "1.9.3" 621 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 622 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 623 | dependencies: 624 | color-name "1.1.3" 625 | 626 | color-convert@^2.0.1: 627 | version "2.0.1" 628 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 629 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 630 | dependencies: 631 | color-name "~1.1.4" 632 | 633 | color-name@1.1.3: 634 | version "1.1.3" 635 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 636 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 637 | 638 | color-name@~1.1.4: 639 | version "1.1.4" 640 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 641 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 642 | 643 | content-type@^1.0.4: 644 | version "1.0.4" 645 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 646 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 647 | 648 | create-require@^1.1.0: 649 | version "1.1.1" 650 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 651 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 652 | 653 | curve25519-js@^0.0.4: 654 | version "0.0.4" 655 | resolved "https://registry.yarnpkg.com/curve25519-js/-/curve25519-js-0.0.4.tgz#e6ad967e8cd284590d657bbfc90d8b50e49ba060" 656 | integrity sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w== 657 | 658 | dateformat@^4.5.1: 659 | version "4.6.3" 660 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" 661 | integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== 662 | 663 | debug@4, debug@^4.3.2: 664 | version "4.3.2" 665 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 666 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 667 | dependencies: 668 | ms "2.1.2" 669 | 670 | decompress-response@^6.0.0: 671 | version "6.0.0" 672 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" 673 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 674 | dependencies: 675 | mimic-response "^3.1.0" 676 | 677 | defer-to-connect@^2.0.0: 678 | version "2.0.1" 679 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" 680 | integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== 681 | 682 | diff@^4.0.1: 683 | version "4.0.2" 684 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 685 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 686 | 687 | dom-walk@^0.1.0: 688 | version "0.1.2" 689 | resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" 690 | integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== 691 | 692 | ecdsa-sig-formatter@1.0.11: 693 | version "1.0.11" 694 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 695 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 696 | dependencies: 697 | safe-buffer "^5.0.1" 698 | 699 | end-of-stream@^1.1.0: 700 | version "1.4.4" 701 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 702 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 703 | dependencies: 704 | once "^1.4.0" 705 | 706 | escape-string-regexp@^1.0.5: 707 | version "1.0.5" 708 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 709 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 710 | 711 | exif-parser@^0.1.12: 712 | version "0.1.12" 713 | resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" 714 | integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= 715 | 716 | fast-redact@^3.0.0: 717 | version "3.0.2" 718 | resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.2.tgz#c940ba7162dde3aeeefc522926ae8c5231412904" 719 | integrity sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg== 720 | 721 | fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.0.8: 722 | version "2.1.1" 723 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" 724 | integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== 725 | 726 | fastify-warning@^0.2.0: 727 | version "0.2.0" 728 | resolved "https://registry.yarnpkg.com/fastify-warning/-/fastify-warning-0.2.0.tgz#e717776026a4493dc9a2befa44db6d17f618008f" 729 | integrity sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== 730 | 731 | file-type@16.5.3: 732 | version "16.5.3" 733 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz#474b7e88c74724046abb505e9b8ed4db30c4fc06" 734 | integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A== 735 | dependencies: 736 | readable-web-to-node-stream "^3.0.0" 737 | strtok3 "^6.2.4" 738 | token-types "^4.1.1" 739 | 740 | file-type@^9.0.0: 741 | version "9.0.0" 742 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" 743 | integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== 744 | 745 | flatstr@^1.0.12: 746 | version "1.0.12" 747 | resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" 748 | integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== 749 | 750 | follow-redirects@^1.14.0: 751 | version "1.14.5" 752 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" 753 | integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== 754 | 755 | futoin-hkdf@^1.3.2: 756 | version "1.4.2" 757 | resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.4.2.tgz#fd534e848e0e50339b8bfbd81250b09cbff10ba3" 758 | integrity sha512-2BggwLEJOTfXzKq4Tl2bIT37p0IqqKkblH4e0cMp2sXTdmwg/ADBKMxvxaEytYYcgdxgng8+acsi3WgMVUl6CQ== 759 | 760 | get-stream@^5.1.0: 761 | version "5.2.0" 762 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 763 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 764 | dependencies: 765 | pump "^3.0.0" 766 | 767 | gifwrap@^0.9.2: 768 | version "0.9.2" 769 | resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.9.2.tgz#348e286e67d7cf57942172e1e6f05a71cee78489" 770 | integrity sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA== 771 | dependencies: 772 | image-q "^1.1.1" 773 | omggif "^1.0.10" 774 | 775 | global@~4.4.0: 776 | version "4.4.0" 777 | resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" 778 | integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== 779 | dependencies: 780 | min-document "^2.19.0" 781 | process "^0.11.10" 782 | 783 | got@^11.8.1: 784 | version "11.8.2" 785 | resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" 786 | integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== 787 | dependencies: 788 | "@sindresorhus/is" "^4.0.0" 789 | "@szmarczak/http-timer" "^4.0.5" 790 | "@types/cacheable-request" "^6.0.1" 791 | "@types/responselike" "^1.0.0" 792 | cacheable-lookup "^5.0.3" 793 | cacheable-request "^7.0.1" 794 | decompress-response "^6.0.0" 795 | http2-wrapper "^1.0.0-beta.5.2" 796 | lowercase-keys "^2.0.0" 797 | p-cancelable "^2.0.0" 798 | responselike "^2.0.0" 799 | 800 | has-flag@^3.0.0: 801 | version "3.0.0" 802 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 803 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 804 | 805 | has-flag@^4.0.0: 806 | version "4.0.0" 807 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 808 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 809 | 810 | he@^1.2.0: 811 | version "1.2.0" 812 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 813 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 814 | 815 | http-cache-semantics@^4.0.0: 816 | version "4.1.0" 817 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 818 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 819 | 820 | http2-wrapper@^1.0.0-beta.5.2: 821 | version "1.0.3" 822 | resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" 823 | integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== 824 | dependencies: 825 | quick-lru "^5.1.1" 826 | resolve-alpn "^1.0.0" 827 | 828 | https-proxy-agent@^5.0.0: 829 | version "5.0.0" 830 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 831 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 832 | dependencies: 833 | agent-base "6" 834 | debug "4" 835 | 836 | ieee754@^1.1.13, ieee754@^1.2.1: 837 | version "1.2.1" 838 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 839 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 840 | 841 | image-q@^1.1.1: 842 | version "1.1.1" 843 | resolved "https://registry.yarnpkg.com/image-q/-/image-q-1.1.1.tgz#fc84099664460b90ca862d9300b6bfbbbfbf8056" 844 | integrity sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY= 845 | 846 | inherits@^2.0.3: 847 | version "2.0.4" 848 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 849 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 850 | 851 | is-function@^1.0.1: 852 | version "1.0.2" 853 | resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" 854 | integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== 855 | 856 | jimp@^0.16.1: 857 | version "0.16.1" 858 | resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.16.1.tgz#192f851a30e5ca11112a3d0aa53137659a78ca7a" 859 | integrity sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw== 860 | dependencies: 861 | "@babel/runtime" "^7.7.2" 862 | "@jimp/custom" "^0.16.1" 863 | "@jimp/plugins" "^0.16.1" 864 | "@jimp/types" "^0.16.1" 865 | regenerator-runtime "^0.13.3" 866 | 867 | jmespath@^0.15.0: 868 | version "0.15.0" 869 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" 870 | integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= 871 | 872 | joycon@^2.2.5: 873 | version "2.2.5" 874 | resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615" 875 | integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ== 876 | 877 | jpeg-js@0.4.2: 878 | version "0.4.2" 879 | resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.2.tgz#8b345b1ae4abde64c2da2fe67ea216a114ac279d" 880 | integrity sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw== 881 | 882 | json-buffer@3.0.1: 883 | version "3.0.1" 884 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 885 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 886 | 887 | json-stable-stringify@^1.0.1: 888 | version "1.0.1" 889 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 890 | integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= 891 | dependencies: 892 | jsonify "~0.0.0" 893 | 894 | jsonify@~0.0.0: 895 | version "0.0.0" 896 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 897 | integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= 898 | 899 | jsonwebtoken@^8.5.1: 900 | version "8.5.1" 901 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 902 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 903 | dependencies: 904 | jws "^3.2.2" 905 | lodash.includes "^4.3.0" 906 | lodash.isboolean "^3.0.3" 907 | lodash.isinteger "^4.0.4" 908 | lodash.isnumber "^3.0.3" 909 | lodash.isplainobject "^4.0.6" 910 | lodash.isstring "^4.0.1" 911 | lodash.once "^4.0.0" 912 | ms "^2.1.1" 913 | semver "^5.6.0" 914 | 915 | jwa@^1.4.1: 916 | version "1.4.1" 917 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 918 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 919 | dependencies: 920 | buffer-equal-constant-time "1.0.1" 921 | ecdsa-sig-formatter "1.0.11" 922 | safe-buffer "^5.0.1" 923 | 924 | jws@^3.2.2: 925 | version "3.2.2" 926 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 927 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 928 | dependencies: 929 | jwa "^1.4.1" 930 | safe-buffer "^5.0.1" 931 | 932 | keyv@^4.0.0: 933 | version "4.0.4" 934 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.4.tgz#f040b236ea2b06ed15ed86fbef8407e1a1c8e376" 935 | integrity sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg== 936 | dependencies: 937 | json-buffer "3.0.1" 938 | 939 | leven@2.1.0: 940 | version "2.1.0" 941 | resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 942 | integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= 943 | 944 | load-bmfont@^1.3.1, load-bmfont@^1.4.0: 945 | version "1.4.1" 946 | resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" 947 | integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== 948 | dependencies: 949 | buffer-equal "0.0.1" 950 | mime "^1.3.4" 951 | parse-bmfont-ascii "^1.0.3" 952 | parse-bmfont-binary "^1.0.5" 953 | parse-bmfont-xml "^1.1.4" 954 | phin "^2.9.1" 955 | xhr "^2.0.1" 956 | xtend "^4.0.0" 957 | 958 | lodash.includes@^4.3.0: 959 | version "4.3.0" 960 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 961 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 962 | 963 | lodash.isboolean@^3.0.3: 964 | version "3.0.3" 965 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 966 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 967 | 968 | lodash.isinteger@^4.0.4: 969 | version "4.0.4" 970 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 971 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 972 | 973 | lodash.isnumber@^3.0.3: 974 | version "3.0.3" 975 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 976 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 977 | 978 | lodash.isplainobject@^4.0.6: 979 | version "4.0.6" 980 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 981 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 982 | 983 | lodash.isstring@^4.0.1: 984 | version "4.0.1" 985 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 986 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 987 | 988 | lodash.once@^4.0.0: 989 | version "4.1.1" 990 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 991 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 992 | 993 | long@^4.0.0: 994 | version "4.0.0" 995 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 996 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 997 | 998 | lowercase-keys@^2.0.0: 999 | version "2.0.0" 1000 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 1001 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 1002 | 1003 | make-error@^1.1.1: 1004 | version "1.3.6" 1005 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1006 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1007 | 1008 | media-typer@^1.1.0: 1009 | version "1.1.0" 1010 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" 1011 | integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== 1012 | 1013 | mime@^1.3.4: 1014 | version "1.6.0" 1015 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1016 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1017 | 1018 | mimic-response@^1.0.0: 1019 | version "1.0.1" 1020 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1021 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1022 | 1023 | mimic-response@^3.1.0: 1024 | version "3.1.0" 1025 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" 1026 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 1027 | 1028 | min-document@^2.19.0: 1029 | version "2.19.0" 1030 | resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" 1031 | integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= 1032 | dependencies: 1033 | dom-walk "^0.1.0" 1034 | 1035 | minimist@^1.2.5: 1036 | version "1.2.5" 1037 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1038 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1039 | 1040 | mkdirp@^0.5.1: 1041 | version "0.5.5" 1042 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1043 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1044 | dependencies: 1045 | minimist "^1.2.5" 1046 | 1047 | mri@1.1.4: 1048 | version "1.1.4" 1049 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" 1050 | integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== 1051 | 1052 | ms@2.1.2: 1053 | version "2.1.2" 1054 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1055 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1056 | 1057 | ms@^2.1.1: 1058 | version "2.1.3" 1059 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1060 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1061 | 1062 | music-metadata@^7.4.1: 1063 | version "7.11.4" 1064 | resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-7.11.4.tgz#31db326a50de552628297571a8e078de2fe16c02" 1065 | integrity sha512-pEaS/vRo0zCAWJ0y5zZ5ruM8CvPPJ/VXbevRMUVkZkWN8rZAQun04xx09/3/PV0qS3nlrzPUDCRK6jDrbGVtUg== 1066 | dependencies: 1067 | content-type "^1.0.4" 1068 | debug "^4.3.2" 1069 | file-type "16.5.3" 1070 | media-typer "^1.1.0" 1071 | strtok3 "^6.2.4" 1072 | token-types "^4.1.1" 1073 | 1074 | mustache@^4.1.0: 1075 | version "4.2.0" 1076 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" 1077 | integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== 1078 | 1079 | natural@^2.1.5: 1080 | version "2.4.5" 1081 | resolved "https://registry.yarnpkg.com/natural/-/natural-2.4.5.tgz#6507e445b204071e54daebe02a5914eb966f5ea5" 1082 | integrity sha512-fxQou4ubo6Rzf7XL0jjwtC2vHm6Sdicu7ztcE0k1ODZs+d1UzcKF1Hu2IwE2y7OgzU3Sa9o8obw7rnyNrjsd1A== 1083 | dependencies: 1084 | afinn-165 "^1.0.2" 1085 | apparatus "^0.0.10" 1086 | json-stable-stringify "^1.0.1" 1087 | sylvester "^0.0.12" 1088 | underscore "^1.9.1" 1089 | wordnet-db "^3.1.11" 1090 | 1091 | normalize-url@^6.0.1: 1092 | version "6.1.0" 1093 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" 1094 | integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== 1095 | 1096 | omggif@^1.0.10, omggif@^1.0.9: 1097 | version "1.0.10" 1098 | resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" 1099 | integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== 1100 | 1101 | once@^1.3.1, once@^1.4.0: 1102 | version "1.4.0" 1103 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1104 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1105 | dependencies: 1106 | wrappy "1" 1107 | 1108 | p-cancelable@^2.0.0: 1109 | version "2.1.1" 1110 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" 1111 | integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== 1112 | 1113 | pako@^1.0.5: 1114 | version "1.0.11" 1115 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1116 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1117 | 1118 | parse-bmfont-ascii@^1.0.3: 1119 | version "1.0.6" 1120 | resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" 1121 | integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= 1122 | 1123 | parse-bmfont-binary@^1.0.5: 1124 | version "1.0.6" 1125 | resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" 1126 | integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= 1127 | 1128 | parse-bmfont-xml@^1.1.4: 1129 | version "1.1.4" 1130 | resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" 1131 | integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== 1132 | dependencies: 1133 | xml-parse-from-string "^1.0.0" 1134 | xml2js "^0.4.5" 1135 | 1136 | parse-headers@^2.0.0: 1137 | version "2.0.4" 1138 | resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.4.tgz#9eaf2d02bed2d1eff494331ce3df36d7924760bf" 1139 | integrity sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw== 1140 | 1141 | peek-readable@^4.0.1: 1142 | version "4.0.1" 1143 | resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.0.1.tgz#9a045f291db254111c3412c1ce4fec27ddd4d202" 1144 | integrity sha512-7qmhptnR0WMSpxT5rMHG9bW/mYSR1uqaPFj2MHvT+y/aOUu6msJijpKt5SkTDKySwg65OWG2JwTMBlgcbwMHrQ== 1145 | 1146 | phin@^2.9.1: 1147 | version "2.9.3" 1148 | resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" 1149 | integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== 1150 | 1151 | pino-pretty@^4.3.0: 1152 | version "4.8.0" 1153 | resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.8.0.tgz#f2f3055bf222456217b14ffb04d8be0a0cc17fce" 1154 | integrity sha512-mhQfHG4rw5ZFpWL44m0Utjo4GC2+HMfdNvxyA8lLw0sIqn6fCf7uQe6dPckUcW/obly+OQHD7B/MTso6LNizYw== 1155 | dependencies: 1156 | "@hapi/bourne" "^2.0.0" 1157 | args "^5.0.1" 1158 | chalk "^4.0.0" 1159 | dateformat "^4.5.1" 1160 | fast-safe-stringify "^2.0.7" 1161 | jmespath "^0.15.0" 1162 | joycon "^2.2.5" 1163 | pump "^3.0.0" 1164 | readable-stream "^3.6.0" 1165 | rfdc "^1.3.0" 1166 | split2 "^3.1.1" 1167 | strip-json-comments "^3.1.1" 1168 | 1169 | pino-std-serializers@^3.1.0: 1170 | version "3.2.0" 1171 | resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" 1172 | integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== 1173 | 1174 | pino@^6.7.0: 1175 | version "6.13.3" 1176 | resolved "https://registry.yarnpkg.com/pino/-/pino-6.13.3.tgz#60b93bcda1541f92fb37b3f2be0a25cf1d05b6fe" 1177 | integrity sha512-tJy6qVgkh9MwNgqX1/oYi3ehfl2Y9H0uHyEEMsBe74KinESIjdMrMQDWpcZPpPicg3VV35d/GLQZmo4QgU2Xkg== 1178 | dependencies: 1179 | fast-redact "^3.0.0" 1180 | fast-safe-stringify "^2.0.8" 1181 | fastify-warning "^0.2.0" 1182 | flatstr "^1.0.12" 1183 | pino-std-serializers "^3.1.0" 1184 | quick-format-unescaped "^4.0.3" 1185 | sonic-boom "^1.0.2" 1186 | 1187 | pixelmatch@^4.0.2: 1188 | version "4.0.2" 1189 | resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" 1190 | integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= 1191 | dependencies: 1192 | pngjs "^3.0.0" 1193 | 1194 | pngjs@^3.0.0, pngjs@^3.3.3: 1195 | version "3.4.0" 1196 | resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" 1197 | integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== 1198 | 1199 | process@^0.11.10: 1200 | version "0.11.10" 1201 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 1202 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 1203 | 1204 | protobufjs@^6.10.1: 1205 | version "6.11.2" 1206 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" 1207 | integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== 1208 | dependencies: 1209 | "@protobufjs/aspromise" "^1.1.2" 1210 | "@protobufjs/base64" "^1.1.2" 1211 | "@protobufjs/codegen" "^2.0.4" 1212 | "@protobufjs/eventemitter" "^1.1.0" 1213 | "@protobufjs/fetch" "^1.1.0" 1214 | "@protobufjs/float" "^1.0.2" 1215 | "@protobufjs/inquire" "^1.1.0" 1216 | "@protobufjs/path" "^1.1.2" 1217 | "@protobufjs/pool" "^1.1.0" 1218 | "@protobufjs/utf8" "^1.1.0" 1219 | "@types/long" "^4.0.1" 1220 | "@types/node" ">=13.7.0" 1221 | long "^4.0.0" 1222 | 1223 | pump@^3.0.0: 1224 | version "3.0.0" 1225 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1226 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1227 | dependencies: 1228 | end-of-stream "^1.1.0" 1229 | once "^1.3.1" 1230 | 1231 | qrcode-terminal@^0.12.0: 1232 | version "0.12.0" 1233 | resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" 1234 | integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== 1235 | 1236 | quick-format-unescaped@^4.0.3: 1237 | version "4.0.4" 1238 | resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" 1239 | integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== 1240 | 1241 | quick-lru@^5.1.1: 1242 | version "5.1.1" 1243 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" 1244 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 1245 | 1246 | readable-stream@^3.0.0, readable-stream@^3.6.0: 1247 | version "3.6.0" 1248 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1249 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1250 | dependencies: 1251 | inherits "^2.0.3" 1252 | string_decoder "^1.1.1" 1253 | util-deprecate "^1.0.1" 1254 | 1255 | readable-web-to-node-stream@^3.0.0: 1256 | version "3.0.2" 1257 | resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" 1258 | integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== 1259 | dependencies: 1260 | readable-stream "^3.6.0" 1261 | 1262 | regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: 1263 | version "0.13.9" 1264 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 1265 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 1266 | 1267 | resolve-alpn@^1.0.0: 1268 | version "1.2.1" 1269 | resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" 1270 | integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== 1271 | 1272 | responselike@^2.0.0: 1273 | version "2.0.0" 1274 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" 1275 | integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== 1276 | dependencies: 1277 | lowercase-keys "^2.0.0" 1278 | 1279 | rfdc@^1.3.0: 1280 | version "1.3.0" 1281 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" 1282 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== 1283 | 1284 | safe-buffer@^5.0.1, safe-buffer@~5.2.0: 1285 | version "5.2.1" 1286 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1287 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1288 | 1289 | sax@>=0.6.0: 1290 | version "1.2.4" 1291 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1292 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1293 | 1294 | semver@^5.6.0: 1295 | version "5.7.1" 1296 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1297 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1298 | 1299 | sonic-boom@^1.0.2: 1300 | version "1.4.1" 1301 | resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" 1302 | integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== 1303 | dependencies: 1304 | atomic-sleep "^1.0.0" 1305 | flatstr "^1.0.12" 1306 | 1307 | source-map-support@^0.5.17: 1308 | version "0.5.20" 1309 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" 1310 | integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== 1311 | dependencies: 1312 | buffer-from "^1.0.0" 1313 | source-map "^0.6.0" 1314 | 1315 | source-map@^0.6.0: 1316 | version "0.6.1" 1317 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1318 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1319 | 1320 | split2@^3.1.1: 1321 | version "3.2.2" 1322 | resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" 1323 | integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== 1324 | dependencies: 1325 | readable-stream "^3.0.0" 1326 | 1327 | string_decoder@^1.1.1: 1328 | version "1.3.0" 1329 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1330 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1331 | dependencies: 1332 | safe-buffer "~5.2.0" 1333 | 1334 | strip-json-comments@^3.1.1: 1335 | version "3.1.1" 1336 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1337 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1338 | 1339 | strtok3@^6.2.4: 1340 | version "6.2.4" 1341 | resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.2.4.tgz#302aea64c0fa25d12a0385069ba66253fdc38a81" 1342 | integrity sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw== 1343 | dependencies: 1344 | "@tokenizer/token" "^0.3.0" 1345 | peek-readable "^4.0.1" 1346 | 1347 | supports-color@^5.3.0: 1348 | version "5.5.0" 1349 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1350 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1351 | dependencies: 1352 | has-flag "^3.0.0" 1353 | 1354 | supports-color@^7.1.0: 1355 | version "7.2.0" 1356 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1357 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1358 | dependencies: 1359 | has-flag "^4.0.0" 1360 | 1361 | "sylvester@>= 0.0.8": 1362 | version "0.0.21" 1363 | resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7" 1364 | integrity sha1-KYexzivS84sNzio0OIiEv6RADqc= 1365 | 1366 | sylvester@^0.0.12: 1367 | version "0.0.12" 1368 | resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.12.tgz#5a884415cd2d002c57e7a3aac99462a75ce9fdb4" 1369 | integrity sha1-WohEFc0tACxX56OqyZRip1zp/bQ= 1370 | 1371 | timm@^1.6.1: 1372 | version "1.7.1" 1373 | resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" 1374 | integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== 1375 | 1376 | tinycolor2@^1.4.1: 1377 | version "1.4.2" 1378 | resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" 1379 | integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== 1380 | 1381 | token-types@^4.1.1: 1382 | version "4.1.1" 1383 | resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.1.1.tgz#ef9e8c8e2e0ded9f1b3f8dbaa46a3228b113ba1a" 1384 | integrity sha512-hD+QyuUAyI2spzsI0B7gf/jJ2ggR4RjkAo37j3StuePhApJUwcWDjnHDOFdIWYSwNR28H14hpwm4EI+V1Ted1w== 1385 | dependencies: 1386 | "@tokenizer/token" "^0.3.0" 1387 | ieee754 "^1.2.1" 1388 | 1389 | ts-node@^9.1.1: 1390 | version "9.1.1" 1391 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 1392 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 1393 | dependencies: 1394 | arg "^4.1.0" 1395 | create-require "^1.1.0" 1396 | diff "^4.0.1" 1397 | make-error "^1.1.1" 1398 | source-map-support "^0.5.17" 1399 | yn "3.1.1" 1400 | 1401 | typescript@^4.1.5: 1402 | version "4.4.4" 1403 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" 1404 | integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== 1405 | 1406 | underscore@^1.9.1: 1407 | version "1.13.1" 1408 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" 1409 | integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== 1410 | 1411 | utif@^2.0.1: 1412 | version "2.0.1" 1413 | resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" 1414 | integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== 1415 | dependencies: 1416 | pako "^1.0.5" 1417 | 1418 | util-deprecate@^1.0.1: 1419 | version "1.0.2" 1420 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1421 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1422 | 1423 | wordnet-db@^3.1.11: 1424 | version "3.1.14" 1425 | resolved "https://registry.yarnpkg.com/wordnet-db/-/wordnet-db-3.1.14.tgz#7ba1ec2cb5730393f0856efcc738a60085426199" 1426 | integrity sha512-zVyFsvE+mq9MCmwXUWHIcpfbrHHClZWZiVOzKSxNJruIcFn2RbY55zkhiAMMxM8zCVSmtNiViq8FsAZSFpMYag== 1427 | 1428 | wrappy@1: 1429 | version "1.0.2" 1430 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1431 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1432 | 1433 | ws@^7.3.1: 1434 | version "7.5.5" 1435 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" 1436 | integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== 1437 | 1438 | xhr@^2.0.1: 1439 | version "2.6.0" 1440 | resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" 1441 | integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== 1442 | dependencies: 1443 | global "~4.4.0" 1444 | is-function "^1.0.1" 1445 | parse-headers "^2.0.0" 1446 | xtend "^4.0.0" 1447 | 1448 | xml-parse-from-string@^1.0.0: 1449 | version "1.0.1" 1450 | resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" 1451 | integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= 1452 | 1453 | xml2js@^0.4.5: 1454 | version "0.4.23" 1455 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" 1456 | integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== 1457 | dependencies: 1458 | sax ">=0.6.0" 1459 | xmlbuilder "~11.0.0" 1460 | 1461 | xmlbuilder@~11.0.0: 1462 | version "11.0.1" 1463 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 1464 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 1465 | 1466 | xtend@^4.0.0: 1467 | version "4.0.2" 1468 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1469 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1470 | 1471 | yn@3.1.1: 1472 | version "3.1.1" 1473 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1474 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1475 | --------------------------------------------------------------------------------