Compare commits
	
		
			1 Commits
		
	
	
		
			e346242255
			...
			1bb4440d43
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1bb4440d43 | 
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,6 +1,6 @@
 | 
				
			|||||||
.DS_Store
 | 
					.DS_Store
 | 
				
			||||||
node_modules
 | 
					node_modules
 | 
				
			||||||
/dist
 | 
					frontend/dist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# local env files
 | 
					# local env files
 | 
				
			||||||
@ -21,3 +21,5 @@ pnpm-debug.log*
 | 
				
			|||||||
*.njsproj
 | 
					*.njsproj
 | 
				
			||||||
*.sln
 | 
					*.sln
 | 
				
			||||||
*.sw?
 | 
					*.sw?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/files
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								backend/lib/SocketTypes.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								backend/lib/SocketTypes.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					export const EDITOR_SESSION = 1
 | 
				
			||||||
 | 
					export const TERMINAL_SESSION = 2
 | 
				
			||||||
@ -7,7 +7,10 @@
 | 
				
			|||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "body-parser": "^1.19.0",
 | 
					    "body-parser": "^1.19.0",
 | 
				
			||||||
    "express": "^4.17.1",
 | 
					    "express": "^4.17.1",
 | 
				
			||||||
 | 
					    "lib0": "^0.2.42",
 | 
				
			||||||
    "node-pty": "^0.10.1",
 | 
					    "node-pty": "^0.10.1",
 | 
				
			||||||
    "ws": "^8.2.3"
 | 
					    "ws": "^8.2.3",
 | 
				
			||||||
 | 
					    "y-protocols": "^1.0.5",
 | 
				
			||||||
 | 
					    "yjs": "^13.5.18"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,6 @@ export function getContainerShell (containerId, shell = 'sh') {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function startContainer (image = 'alpine', cmd = ['sh', '-c', 'while true; do sleep 1d; done']) {
 | 
					export function startContainer (image = 'alpine', cmd = ['sh', '-c', 'while true; do sleep 1d; done']) {
 | 
				
			||||||
  console.log(['run', '-d', '-l', config.containerLabel, image, ...cmd])
 | 
					 | 
				
			||||||
  return exec(config.containerBinary, ['run', '--rm', '-d', '-l', config.containerLabel, image, ...cmd])
 | 
					  return exec(config.containerBinary, ['run', '--rm', '-d', '-l', config.containerLabel, image, ...cmd])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										229
									
								
								backend/src/editor.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								backend/src/editor.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,229 @@
 | 
				
			|||||||
 | 
					// Mostly adopted from: https://github.com/yjs/y-websocket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as awarenessProtocol from 'y-protocols/awareness.js'
 | 
				
			||||||
 | 
					import * as syncProtocol from 'y-protocols/sync.js'
 | 
				
			||||||
 | 
					import { Doc } from 'yjs'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { decoding, encoding, map } from 'lib0'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { readFile, stat, writeFile } from 'fs/promises'
 | 
				
			||||||
 | 
					import { fileURLToPath } from 'url'
 | 
				
			||||||
 | 
					import path from 'path'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export async function upgrade (sessions, request, reqPath) {
 | 
				
			||||||
 | 
					  // todo: check auth and project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // todo: check dir traversal
 | 
				
			||||||
 | 
					  request.editorFile = `${path.dirname(fileURLToPath(import.meta.url))}/../../files/${reqPath[3]}`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export async function connection (ws, req) {
 | 
				
			||||||
 | 
					  ws.binaryType = 'arraybuffer'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // get doc, initialize if it does not exist yet
 | 
				
			||||||
 | 
					  const doc = getYDoc(req.editorFile)
 | 
				
			||||||
 | 
					  doc.conns.set(ws, new Set())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // listen and reply to events
 | 
				
			||||||
 | 
					  ws.on('message', message => messageListener(ws, doc, new Uint8Array(message)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Check if connection is still alive
 | 
				
			||||||
 | 
					  let pongReceived = true
 | 
				
			||||||
 | 
					  const pingInterval = setInterval(() => {
 | 
				
			||||||
 | 
					    if (!pongReceived) {
 | 
				
			||||||
 | 
					      if (doc.conns.has(ws)) {
 | 
				
			||||||
 | 
					        closeConn(doc, ws)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      clearInterval(pingInterval)
 | 
				
			||||||
 | 
					    } else if (doc.conns.has(ws)) {
 | 
				
			||||||
 | 
					      pongReceived = false
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        ws.ping()
 | 
				
			||||||
 | 
					      } catch (e) {
 | 
				
			||||||
 | 
					        closeConn(doc, ws)
 | 
				
			||||||
 | 
					        clearInterval(pingInterval)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }, pingTimeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ws.on('close', () => {
 | 
				
			||||||
 | 
					    closeConn(doc, ws)
 | 
				
			||||||
 | 
					    clearInterval(pingInterval)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ws.on('pong', () => {
 | 
				
			||||||
 | 
					    pongReceived = true
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // put the following in a variables in a block so the interval handlers don't keep in in
 | 
				
			||||||
 | 
					  // scope
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // send sync step 1
 | 
				
			||||||
 | 
					    const encoder = encoding.createEncoder()
 | 
				
			||||||
 | 
					    encoding.writeVarUint(encoder, messageSync)
 | 
				
			||||||
 | 
					    syncProtocol.writeSyncStep1(encoder, doc)
 | 
				
			||||||
 | 
					    send(doc, ws, encoding.toUint8Array(encoder))
 | 
				
			||||||
 | 
					    const awarenessStates = doc.awareness.getStates()
 | 
				
			||||||
 | 
					    if (awarenessStates.size > 0) {
 | 
				
			||||||
 | 
					      const encoder = encoding.createEncoder()
 | 
				
			||||||
 | 
					      encoding.writeVarUint(encoder, messageAwareness)
 | 
				
			||||||
 | 
					      encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(doc.awareness, Array.from(awarenessStates.keys())))
 | 
				
			||||||
 | 
					      send(doc, ws, encoding.toUint8Array(encoder))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const messageSync = 0
 | 
				
			||||||
 | 
					const messageAwareness = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const wsReadyStateConnecting = 0
 | 
				
			||||||
 | 
					const wsReadyStateOpen = 1
 | 
				
			||||||
 | 
					const wsReadyStateClosing = 2
 | 
				
			||||||
 | 
					const wsReadyStateClosed = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const pingTimeout = 30000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const docs = new Map()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class WSSharedDoc extends Doc {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * @param {string} name
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor (name) {
 | 
				
			||||||
 | 
					    super({ gc: true })
 | 
				
			||||||
 | 
					    this.name = name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.conns = new Map()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.awareness = new awarenessProtocol.Awareness(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.awareness.setLocalState(null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const awarenessChangeHandler = ({ added, updated, removed }, conn) => {
 | 
				
			||||||
 | 
					      const changedClients = added.concat(updated, removed)
 | 
				
			||||||
 | 
					      if (conn !== null) {
 | 
				
			||||||
 | 
					        const connControlledIDs = this.conns.get(conn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (connControlledIDs !== undefined) {
 | 
				
			||||||
 | 
					          added.forEach(clientID => connControlledIDs.add(clientID))
 | 
				
			||||||
 | 
					          removed.forEach(clientID => connControlledIDs.delete(clientID))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // broadcast awareness update
 | 
				
			||||||
 | 
					      const encoder = encoding.createEncoder()
 | 
				
			||||||
 | 
					      encoding.writeVarUint(encoder, messageAwareness)
 | 
				
			||||||
 | 
					      encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(this.awareness, changedClients))
 | 
				
			||||||
 | 
					      const buff = encoding.toUint8Array(encoder)
 | 
				
			||||||
 | 
					      this.conns.forEach((_, c) => {
 | 
				
			||||||
 | 
					        send(this, c, buff)
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.awareness.on('update', awarenessChangeHandler)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.on('update', updateHandler)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const updateHandler = (update, origin, doc) => {
 | 
				
			||||||
 | 
					  const encoder = encoding.createEncoder()
 | 
				
			||||||
 | 
					  encoding.writeVarUint(encoder, messageSync)
 | 
				
			||||||
 | 
					  syncProtocol.writeUpdate(encoder, update)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const message = encoding.toUint8Array(encoder)
 | 
				
			||||||
 | 
					  doc.conns.forEach((_, conn) => send(doc, conn, message))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  writeUpdate(doc)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const debounce = (func, wait, immediate) => {
 | 
				
			||||||
 | 
					  let timeout
 | 
				
			||||||
 | 
					  return (...args) => {
 | 
				
			||||||
 | 
					    let context = this
 | 
				
			||||||
 | 
					    let later = () => {
 | 
				
			||||||
 | 
					      timeout = null
 | 
				
			||||||
 | 
					      if (!immediate) func.apply(context, args)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    let callNow = immediate && !timeout
 | 
				
			||||||
 | 
					    clearTimeout(timeout)
 | 
				
			||||||
 | 
					    timeout = setTimeout(later, wait)
 | 
				
			||||||
 | 
					    if (callNow) func.apply(context, args)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const writeUpdate = debounce(async doc => {
 | 
				
			||||||
 | 
					  await writeFile(doc.name, doc.getText('monaco').toJSON())
 | 
				
			||||||
 | 
					}, 2000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getYDoc = file => map.setIfUndefined(docs, file, () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const doc = new WSSharedDoc(file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  doc.gc = true
 | 
				
			||||||
 | 
					  docs.set(file, doc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  stat(file)
 | 
				
			||||||
 | 
					    .then(() => {
 | 
				
			||||||
 | 
					      return readFile(file, { encoding: 'utf8' })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    .then(content => {
 | 
				
			||||||
 | 
					      const text = doc.getText('monaco')
 | 
				
			||||||
 | 
					      text.insert(0, content)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    .catch(() => {
 | 
				
			||||||
 | 
					      // new file
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return doc
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const messageListener = (conn, doc, message) => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const encoder = encoding.createEncoder()
 | 
				
			||||||
 | 
					    const decoder = decoding.createDecoder(message)
 | 
				
			||||||
 | 
					    const messageType = decoding.readVarUint(decoder)
 | 
				
			||||||
 | 
					    switch (messageType) {
 | 
				
			||||||
 | 
					      case messageSync:
 | 
				
			||||||
 | 
					        encoding.writeVarUint(encoder, messageSync)
 | 
				
			||||||
 | 
					        syncProtocol.readSyncMessage(decoder, encoder, doc, null)
 | 
				
			||||||
 | 
					        if (encoding.length(encoder) > 1) {
 | 
				
			||||||
 | 
					          send(doc, conn, encoding.toUint8Array(encoder))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					      case messageAwareness: {
 | 
				
			||||||
 | 
					        awarenessProtocol.applyAwarenessUpdate(doc.awareness, decoding.readVarUint8Array(decoder), conn)
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error(err)
 | 
				
			||||||
 | 
					    doc.emit('error', [err])
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const send = (doc, conn, m) => {
 | 
				
			||||||
 | 
					  if (conn.readyState !== wsReadyStateConnecting && conn.readyState !== wsReadyStateOpen) {
 | 
				
			||||||
 | 
					    console.log(conn.readyState)
 | 
				
			||||||
 | 
					    closeConn(doc, conn)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    conn.send(m, err => { err != null && closeConn(doc, conn) })
 | 
				
			||||||
 | 
					  } catch (e) {
 | 
				
			||||||
 | 
					    closeConn(doc, conn)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const closeConn = (doc, conn) => {
 | 
				
			||||||
 | 
					  if (doc.conns.has(conn)) {
 | 
				
			||||||
 | 
					    const controlledIds = doc.conns.get(conn)
 | 
				
			||||||
 | 
					    doc.conns.delete(conn)
 | 
				
			||||||
 | 
					    awarenessProtocol.removeAwarenessStates(doc.awareness, Array.from(controlledIds), null)
 | 
				
			||||||
 | 
					    docs.delete(doc.name)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  conn.close()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										45
									
								
								backend/src/shell.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								backend/src/shell.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					import { containerExists, getContainerShell } from './containers.js'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export async function upgrade(sessions, request, path) {
 | 
				
			||||||
 | 
					  const [container, sessionId] = path.splice(2)
 | 
				
			||||||
 | 
					  const session = sessions[sessionId]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (session && session.container !== container) {
 | 
				
			||||||
 | 
					    console.log('wrong session')
 | 
				
			||||||
 | 
					    return false
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!(await containerExists(container))) {
 | 
				
			||||||
 | 
					    console.log('no container')
 | 
				
			||||||
 | 
					    return false
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!session) {
 | 
				
			||||||
 | 
					    sessions[sessionId] = { container }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  request.session = sessions[sessionId]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export async function connection(ws, req) {
 | 
				
			||||||
 | 
					  if (!req.session.term) {
 | 
				
			||||||
 | 
					    req.session.term = getContainerShell(req.session.container)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ws.on('message', message => {
 | 
				
			||||||
 | 
					    const decoded = message.toString()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    req.session.term.write(decoded)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  req.session.term.onData(data => {
 | 
				
			||||||
 | 
					    ws.send(data)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  req.session.term.onExit(exit => {
 | 
				
			||||||
 | 
					    ws.send(`Process terminated with code ${exit.exitCode}`)
 | 
				
			||||||
 | 
					    ws.close()
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,63 +1,47 @@
 | 
				
			|||||||
import { containerExists, getContainerShell } from './containers.js'
 | 
					 | 
				
			||||||
import { WebSocketServer } from 'ws'
 | 
					import { WebSocketServer } from 'ws'
 | 
				
			||||||
 | 
					import { EDITOR_SESSION, TERMINAL_SESSION } from '../lib/SocketTypes.js'
 | 
				
			||||||
 | 
					import { upgrade as upgradeShell, connection as connectionShell  } from './shell.js'
 | 
				
			||||||
 | 
					import { upgrade as upgradeEditor, connection as connectionEditor } from './editor.js'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (server, sessions) => {
 | 
					export default (server, sessions) => {
 | 
				
			||||||
  const wss = new WebSocketServer({ noServer: true })
 | 
					  const wss = new WebSocketServer({ noServer: true })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  server.on('upgrade', async (request, socket, head) => {
 | 
					  server.on('upgrade', async (request, socket, head) => {
 | 
				
			||||||
    const forbidden = () => {
 | 
					    const forbidden = () => {
 | 
				
			||||||
      socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
 | 
					      socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n')
 | 
				
			||||||
      socket.destroy();
 | 
					      socket.destroy()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const path = request.url.substr(1).split('/')
 | 
					    const path = request.url.substr(1).split('/')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (path.length !== 3 || path[0] !== 'ws') {
 | 
					    if (path.length < 1 || path[0] !== 'ws') {
 | 
				
			||||||
      return forbidden()
 | 
					      return forbidden()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const [_, container, sessionId] = path
 | 
					    if (path.length > 3 && path[1] === 'editor' && (await upgradeEditor(sessions, request, path))) {
 | 
				
			||||||
    const session = sessions[sessionId]
 | 
					      // /ws/editor/:project/:path
 | 
				
			||||||
 | 
					      request.type = EDITOR_SESSION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (session && session.container !== container) {
 | 
					    } else if (path.length === 4 && path[1] === 'terminal' && (await upgradeShell(sessions, request, path))) {
 | 
				
			||||||
      console.log('wrong session')
 | 
					      // /ws/terminal/:container/:session
 | 
				
			||||||
 | 
					      request.type = TERMINAL_SESSION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
      return forbidden()
 | 
					      return forbidden()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(await containerExists(container))) {
 | 
					 | 
				
			||||||
      console.log('no container')
 | 
					 | 
				
			||||||
      return forbidden()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!session) {
 | 
					 | 
				
			||||||
      sessions[sessionId] = { container }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    request.session = sessions[sessionId]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    wss.handleUpgrade(request, socket, head, ws => {
 | 
					    wss.handleUpgrade(request, socket, head, ws => {
 | 
				
			||||||
      wss.emit('connection', ws, request);
 | 
					      wss.emit('connection', ws, request)
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  wss.on('connection', (ws, req) => {
 | 
					  wss.on('connection', async (ws, req) => {
 | 
				
			||||||
    if (!req.session.term) {
 | 
					    if (req.type === EDITOR_SESSION) {
 | 
				
			||||||
      req.session.term = getContainerShell(req.session.container)
 | 
					      await connectionEditor(ws, req)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ws.on('message', message => {
 | 
					    if (req.type === TERMINAL_SESSION) {
 | 
				
			||||||
      const decoded = message.toString()
 | 
					      await connectionShell(ws, req)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
      req.session.term.write(decoded)
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    req.session.term.onData(data => {
 | 
					 | 
				
			||||||
      ws.send(data)
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    req.session.term.onExit(exit => {
 | 
					 | 
				
			||||||
      ws.send(`Process terminated with code ${exit.exitCode}`)
 | 
					 | 
				
			||||||
      ws.close()
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -198,6 +198,18 @@ ipaddr.js@1.9.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
 | 
					  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
 | 
				
			||||||
  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
 | 
					  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					isomorphic.js@^0.2.4:
 | 
				
			||||||
 | 
					  version "0.2.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.4.tgz#24ca374163ae54a7ce3b86ce63b701b91aa84969"
 | 
				
			||||||
 | 
					  integrity sha512-Y4NjZceAwaPXctwsHgNsmfuPxR8lJ3f8X7QTAkhltrX4oGIv+eTlgHLXn4tWysC9zGTi929gapnPp+8F8cg7nA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lib0@^0.2.42:
 | 
				
			||||||
 | 
					  version "0.2.42"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.42.tgz#6d8bf1fb8205dec37a953c521c5ee403fd8769b0"
 | 
				
			||||||
 | 
					  integrity sha512-8BNM4MiokEKzMvSxTOC3gnCBisJH+jL67CnSnqzHv3jli3pUvGC8wz+0DQ2YvGr4wVQdb2R2uNNPw9LEpVvJ4Q==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    isomorphic.js "^0.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
media-typer@0.3.0:
 | 
					media-typer@0.3.0:
 | 
				
			||||||
  version "0.3.0"
 | 
					  version "0.3.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
 | 
					  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
 | 
				
			||||||
@ -383,3 +395,17 @@ ws@^8.2.3:
 | 
				
			|||||||
  version "8.2.3"
 | 
					  version "8.2.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
 | 
					  resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
 | 
				
			||||||
  integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
 | 
					  integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					y-protocols@^1.0.5:
 | 
				
			||||||
 | 
					  version "1.0.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.5.tgz#91d574250060b29fcac8f8eb5e276fbad594245e"
 | 
				
			||||||
 | 
					  integrity sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    lib0 "^0.2.42"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					yjs@^13.5.18:
 | 
				
			||||||
 | 
					  version "13.5.18"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.5.18.tgz#4151f381b170726b69be26296fd84b2efdc82e6e"
 | 
				
			||||||
 | 
					  integrity sha512-6LcTL8gRe12fy89OvXG6Xs/uhsl7iwE4Wh106H1NItkcqcUaY2waTje1NVWmOZNXHXWVAzdf/fBQqB4Phq9sGA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    lib0 "^0.2.42"
 | 
				
			||||||
 | 
				
			|||||||
@ -9,11 +9,15 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "core-js": "^3.6.5",
 | 
					    "core-js": "^3.6.5",
 | 
				
			||||||
 | 
					    "monaco-editor": "^0.30.0",
 | 
				
			||||||
    "vue": "^3.0.0",
 | 
					    "vue": "^3.0.0",
 | 
				
			||||||
    "vue-router": "^4.0.0-0",
 | 
					    "vue-router": "^4.0.0-0",
 | 
				
			||||||
    "xterm": "^4.14.1",
 | 
					    "xterm": "^4.14.1",
 | 
				
			||||||
    "xterm-addon-attach": "^0.6.0",
 | 
					    "xterm-addon-attach": "^0.6.0",
 | 
				
			||||||
    "xterm-addon-fit": "^0.5.0"
 | 
					    "xterm-addon-fit": "^0.5.0",
 | 
				
			||||||
 | 
					    "y-monaco": "^0.1.2",
 | 
				
			||||||
 | 
					    "y-websocket": "^1.3.17",
 | 
				
			||||||
 | 
					    "yjs": "^13.5.18"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@vue/cli-plugin-babel": "~4.5.0",
 | 
					    "@vue/cli-plugin-babel": "~4.5.0",
 | 
				
			||||||
@ -28,7 +32,8 @@
 | 
				
			|||||||
    "eslint-plugin-node": "^11.1.0",
 | 
					    "eslint-plugin-node": "^11.1.0",
 | 
				
			||||||
    "eslint-plugin-promise": "^4.2.1",
 | 
					    "eslint-plugin-promise": "^4.2.1",
 | 
				
			||||||
    "eslint-plugin-standard": "^4.0.0",
 | 
					    "eslint-plugin-standard": "^4.0.0",
 | 
				
			||||||
    "eslint-plugin-vue": "^7.0.0"
 | 
					    "eslint-plugin-vue": "^7.0.0",
 | 
				
			||||||
 | 
					    "monaco-editor-webpack-plugin": "^6.0.0"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "eslintConfig": {
 | 
					  "eslintConfig": {
 | 
				
			||||||
    "root": true,
 | 
					    "root": true,
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										40
									
								
								frontend/src/components/Editor.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								frontend/src/components/Editor.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div ref="editorEl" id="test" style="height: 300px; text-align: left"></div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import { onMounted, ref } from 'vue'
 | 
				
			||||||
 | 
					import * as monaco from 'monaco-editor'
 | 
				
			||||||
 | 
					import { WebsocketProvider } from 'y-websocket'
 | 
				
			||||||
 | 
					import { Doc } from 'yjs'
 | 
				
			||||||
 | 
					import { MonacoBinding } from 'y-monaco'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: 'Editor',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setup () {
 | 
				
			||||||
 | 
					    const editorEl = ref(null)
 | 
				
			||||||
 | 
					    const monacoBinding = ref(null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    onMounted(() => {
 | 
				
			||||||
 | 
					      const ydoc = new Doc()
 | 
				
			||||||
 | 
					      const provider = new WebsocketProvider('ws://localhost:8000/ws/editor/test/lol.js', location.hash, ydoc)
 | 
				
			||||||
 | 
					      const ytext = ydoc.getText('monaco')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const editor = monaco.editor.create(document.getElementById('test'), {
 | 
				
			||||||
 | 
					        value: '',
 | 
				
			||||||
 | 
					        language: 'javascript',
 | 
				
			||||||
 | 
					        theme: 'vs-dark'
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      monacoBinding.value = new MonacoBinding(ytext, editor.getModel(), new Set([editor]), provider.awareness)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return { editorEl, monacoBinding }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@ -19,7 +19,7 @@ export default {
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setup (props) {
 | 
					  setup (props) {
 | 
				
			||||||
    const socket = new WebSocket(`ws://localhost:1234/ws/${props.container}/${props.session}`)
 | 
					    const socket = new WebSocket(`ws://localhost:1234/ws/shell/${props.container}/${props.session}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const renderEl = ref(null)
 | 
					    const renderEl = ref(null)
 | 
				
			||||||
    const term = new Terminal()
 | 
					    const term = new Terminal()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,8 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div class="home">
 | 
					  <div class="home">
 | 
				
			||||||
    <ContainerList :containers="containers"/>
 | 
					    <ContainerList :containers="containers"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <Editor />
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -8,10 +10,11 @@
 | 
				
			|||||||
import ContainerList from '../components/ContainerList'
 | 
					import ContainerList from '../components/ContainerList'
 | 
				
			||||||
import { getContainers } from '../lib/api'
 | 
					import { getContainers } from '../lib/api'
 | 
				
			||||||
import { ref } from 'vue'
 | 
					import { ref } from 'vue'
 | 
				
			||||||
 | 
					import Editor from '../components/Editor'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'Dashboard',
 | 
					  name: 'Dashboard',
 | 
				
			||||||
  components: { ContainerList },
 | 
					  components: { Editor, ContainerList },
 | 
				
			||||||
  setup () {
 | 
					  setup () {
 | 
				
			||||||
    const containers = ref([])
 | 
					    const containers = ref([])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								frontend/vue.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								frontend/vue.config.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					const MonacoEditorWebpackPlugin = require('monaco-editor-webpack-plugin')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = {
 | 
				
			||||||
 | 
					  configureWebpack: {
 | 
				
			||||||
 | 
					    plugins: [
 | 
				
			||||||
 | 
					      new MonacoEditorWebpackPlugin({
 | 
				
			||||||
 | 
					        // https://github.com/Microsoft/monaco-editor-webpack-plugin#options
 | 
				
			||||||
 | 
					        // Include a subset of languages support
 | 
				
			||||||
 | 
					        // Some language extensions like typescript are so huge that may impact build performance
 | 
				
			||||||
 | 
					        // e.g. Build full languages support with webpack 4.0 takes over 80 seconds
 | 
				
			||||||
 | 
					        // Languages are loaded on demand at runtime
 | 
				
			||||||
 | 
					        languages: ['javascript', 'css', 'html', 'typescript']
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -252,14 +252,14 @@
 | 
				
			|||||||
    js-tokens "^4.0.0"
 | 
					    js-tokens "^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/parser@^7.15.0", "@babel/parser@^7.16.0", "@babel/parser@^7.7.0":
 | 
					"@babel/parser@^7.15.0", "@babel/parser@^7.16.0", "@babel/parser@^7.7.0":
 | 
				
			||||||
  version "7.16.0"
 | 
					  version "7.16.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.0.tgz#cf147d7ada0a3655e79bf4b08ee846f00a00a295"
 | 
					  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac"
 | 
				
			||||||
  integrity sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==
 | 
					  integrity sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.0":
 | 
					"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.0":
 | 
				
			||||||
  version "7.16.0"
 | 
					  version "7.16.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.0.tgz#efb7f147042aca34ce8156a055906a7abaadeaf0"
 | 
					  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183"
 | 
				
			||||||
  integrity sha512-djyecbGMEh4rOb/Tc1M5bUW2Ih1IZRa9PoubnPOCzM+DRE89uGUHR1Y+3aDdTMW4drjGRZ2ol8dt1JUFg6hJLQ==
 | 
					  integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/helper-plugin-utils" "^7.14.5"
 | 
					    "@babel/helper-plugin-utils" "^7.14.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1389,47 +1389,47 @@
 | 
				
			|||||||
    semver "^6.1.0"
 | 
					    semver "^6.1.0"
 | 
				
			||||||
    strip-ansi "^6.0.0"
 | 
					    strip-ansi "^6.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-core@3.2.20":
 | 
					"@vue/compiler-core@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.20.tgz#af5a3c5237818835b0d0be837eb5885a8d21c160"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.21.tgz#26566c32b2ad838199d471ef5df620a83846f24e"
 | 
				
			||||||
  integrity sha512-vcEXlKXoPwBXFP5aUTHN9GTZaDfwCofa9Yu9bbW2C5O/QSa9Esdt7OG4+0RRd3EHEMxUvEdj4RZrd/KpQeiJbA==
 | 
					  integrity sha512-NhhiQZNG71KNq1h5pMW/fAXdTF7lJRaSI7LDm2edhHXVz1ROMICo8SreUmQnSf4Fet0UPBVqJ988eF4+936iDQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/parser" "^7.15.0"
 | 
					    "@babel/parser" "^7.15.0"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
    estree-walker "^2.0.2"
 | 
					    estree-walker "^2.0.2"
 | 
				
			||||||
    source-map "^0.6.1"
 | 
					    source-map "^0.6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-dom@3.2.20":
 | 
					"@vue/compiler-dom@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.20.tgz#8e0ef354449c0faf41519b00bfc2045eae01dcb5"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.21.tgz#d6f6c85364ef8888f9c4e9122bfba11e78fb398c"
 | 
				
			||||||
  integrity sha512-QnI77ec/JtV7R0YBbcVayYTDCRcI9OCbxiUQK6izVyqQO0658n0zQuoNwe+bYgtqnvGAIqTR3FShTd5y4oOjdg==
 | 
					  integrity sha512-gsJD3DpYZSYquiA7UIPsMDSlAooYWDvHPq9VRsqzJEk2PZtFvLvHPb4aaMD8Ufd62xzYn32cnnkzsEOJhyGilA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-core" "3.2.20"
 | 
					    "@vue/compiler-core" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-sfc@3.2.20", "@vue/compiler-sfc@^3.0.0":
 | 
					"@vue/compiler-sfc@3.2.21", "@vue/compiler-sfc@^3.0.0":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.20.tgz#2d7668e76f066c566dd7c09c15c9acce4e876e0a"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.21.tgz#42639ee49e725afb7d8f1d1940e75dc17a56002c"
 | 
				
			||||||
  integrity sha512-03aZo+6tQKiFLfunHKSPZvdK4Jsn/ftRCyaro8AQIWkuxJbvSosbKK6HTTn+D2c3nPScG155akJoxKENw7rftQ==
 | 
					  integrity sha512-+yDlUSebKpz/ovxM2vLRRx7w/gVfY767pOfYTgbIhAs+ogvIV2BsIt4fpxlThnlCNChJ+yE0ERUNoROv2kEGEQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/parser" "^7.15.0"
 | 
					    "@babel/parser" "^7.15.0"
 | 
				
			||||||
    "@vue/compiler-core" "3.2.20"
 | 
					    "@vue/compiler-core" "3.2.21"
 | 
				
			||||||
    "@vue/compiler-dom" "3.2.20"
 | 
					    "@vue/compiler-dom" "3.2.21"
 | 
				
			||||||
    "@vue/compiler-ssr" "3.2.20"
 | 
					    "@vue/compiler-ssr" "3.2.21"
 | 
				
			||||||
    "@vue/ref-transform" "3.2.20"
 | 
					    "@vue/ref-transform" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
    estree-walker "^2.0.2"
 | 
					    estree-walker "^2.0.2"
 | 
				
			||||||
    magic-string "^0.25.7"
 | 
					    magic-string "^0.25.7"
 | 
				
			||||||
    postcss "^8.1.10"
 | 
					    postcss "^8.1.10"
 | 
				
			||||||
    source-map "^0.6.1"
 | 
					    source-map "^0.6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-ssr@3.2.20":
 | 
					"@vue/compiler-ssr@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.20.tgz#9cceb6261d9932cb5568202610c1c28f86c5e521"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.21.tgz#37d124f89e8adef9fd56b85775de4b5310a0436e"
 | 
				
			||||||
  integrity sha512-rzzVVYivm+EjbfiGQvNeyiYZWzr6Hkej97RZLZvcumacQlnKv9176Xo9rRyeWwFbBlxmtNdrVMslRXtipMXk2w==
 | 
					  integrity sha512-eU+A0iWYy+1zAo2CRIJ0zSVlv1iuGAIbNRCnllSJ31pV1lX3jypJYzGbJlSRAbB7VP6E+tYveVT1Oq8JKewa3g==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-dom" "3.2.20"
 | 
					    "@vue/compiler-dom" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.1.2":
 | 
					"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.1.2":
 | 
				
			||||||
  version "3.3.0"
 | 
					  version "3.3.0"
 | 
				
			||||||
@ -1448,9 +1448,9 @@
 | 
				
			|||||||
    prettier "^1.18.2 || ^2.0.0"
 | 
					    prettier "^1.18.2 || ^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/devtools-api@^6.0.0-beta.18":
 | 
					"@vue/devtools-api@^6.0.0-beta.18":
 | 
				
			||||||
  version "6.0.0-beta.19"
 | 
					  version "6.0.0-beta.20"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.0.0-beta.19.tgz#f8e88059daa424515992426a0c7ea5cde07e99bf"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.tgz#b5405c9a84fb44687d05e7c4c7854b1639141106"
 | 
				
			||||||
  integrity sha512-ObzQhgkoVeoyKv+e8+tB/jQBL2smtk/NmC9OmFK8UqdDpoOdv/Kf9pyDWL+IFyM7qLD2C75rszJujvGSPSpGlw==
 | 
					  integrity sha512-21u2jFOk8jbAneeGpDwZQ0W66RJa0IBDUyVl6SgKnn2cRFjLWzKj+ukXjpLhYr1KASyCe5E5U4jXwChVo0YUAw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/eslint-config-standard@^5.1.2":
 | 
					"@vue/eslint-config-standard@^5.1.2":
 | 
				
			||||||
  version "5.1.2"
 | 
					  version "5.1.2"
 | 
				
			||||||
@ -1466,53 +1466,53 @@
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz#ceb924b4ecb3b9c43871c7a429a02f8423e621ab"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz#ceb924b4ecb3b9c43871c7a429a02f8423e621ab"
 | 
				
			||||||
  integrity sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==
 | 
					  integrity sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/reactivity@3.2.20":
 | 
					"@vue/reactivity@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.20.tgz#81fe1c368e7f20bc0ec1dec1045bbee253582de8"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.21.tgz#073ad144192ed78a07e151e95a3baa515e4099a2"
 | 
				
			||||||
  integrity sha512-nSmoLojUTk+H8HNTAkrUduB4+yIUBK2HPihJo2uXVSH4Spry6oqN6lFzE5zpLK+F27Sja+UqR9R1+/kIOsHV5w==
 | 
					  integrity sha512-7C57zFm/5E3SSTUhVuYj1InDwuJ+GIVQ/z+H43C9sST85gIThGXVhksl1yWTAadf8Yz4T5lSbqi5Ds8U/ueWcw==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/ref-transform@3.2.20":
 | 
					"@vue/ref-transform@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.20.tgz#2a59ec90caf8e5c7336776a0900bff0a8b81c090"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.21.tgz#b0c554c9f640c3f005f77e676066aa0faba90984"
 | 
				
			||||||
  integrity sha512-Y42d3PGlYZ1lXcF3dbd3+qU/C/a3wYEZ949fyOI5ptzkjDWlkfU6vn74fmOjsLjEcjs10BXK2qO99FqQIK2r1Q==
 | 
					  integrity sha512-uiEWWBsrGeun9O7dQExYWzXO3rHm/YdtFNXDVqCSoPypzOVxWxdiL+8hHeWzxMB58fVuV2sT80aUtIVyaBVZgQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/parser" "^7.15.0"
 | 
					    "@babel/parser" "^7.15.0"
 | 
				
			||||||
    "@vue/compiler-core" "3.2.20"
 | 
					    "@vue/compiler-core" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
    estree-walker "^2.0.2"
 | 
					    estree-walker "^2.0.2"
 | 
				
			||||||
    magic-string "^0.25.7"
 | 
					    magic-string "^0.25.7"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/runtime-core@3.2.20":
 | 
					"@vue/runtime-core@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.20.tgz#8f63e956a3f88fb772541443c45a7701211012cb"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.21.tgz#e12dac8c3893b7aebfc37e32066718d8aa686ac5"
 | 
				
			||||||
  integrity sha512-d1xfUGhZPfiZzAN7SatStD4vRtT8deJSXib2+Cz3x0brjMWKxe32asQc154FF1E2fFgMCHtnfd4A90bQEzV4GQ==
 | 
					  integrity sha512-7oOxKaU0D2IunOAMOOHZgJVrHg63xwng8BZx3fbgmakqEIMwHhQcp+5GV1sOg/sWW7R4UhaRDIUCukO2GRVK2Q==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/reactivity" "3.2.20"
 | 
					    "@vue/reactivity" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/runtime-dom@3.2.20":
 | 
					"@vue/runtime-dom@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.20.tgz#8aa56ae6c30f9cd4a71ca0e9ec3c4bdc67148d15"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.21.tgz#33dd15bc85281e773177a30dc6931c294bd77aa1"
 | 
				
			||||||
  integrity sha512-4TCvZMLhESWCFHFYgqN4QmMA/onnINAlUovhopjlS8ST27G1A8Z0tyxPzLoXLa+b5JrOpbMPheEMPvdKExTJig==
 | 
					  integrity sha512-apBdriD6QsI4ywbllY8kjr9/0scGuStDuvLbJULPQkFPtHzntd51bP5PQTQVAEIc9kwnTozmj6x6ZdX/cwo7xA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/runtime-core" "3.2.20"
 | 
					    "@vue/runtime-core" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
    csstype "^2.6.8"
 | 
					    csstype "^2.6.8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/server-renderer@3.2.20":
 | 
					"@vue/server-renderer@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.20.tgz#705e07ae9425132b2b6227d308a51a13f4d4ec81"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.21.tgz#887d0a44de76f72313cff2686a24c0315231d634"
 | 
				
			||||||
  integrity sha512-viIbZGep9XabnrRcaxWIi00cOh1x21QYm2upIL5W0zqzTJ54VdTzpI+zi1osNp+VfRQDTHpV2U7H3Kn4ljYJvg==
 | 
					  integrity sha512-QBgYqVgI7XCSBCqGa4LduV9vpfQFdZBOodFmq5Txk5W/v1KrJ1LoOh2Q0RHiRgtoK/UR9uyvRVcYqOmwHkZNEg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-ssr" "3.2.20"
 | 
					    "@vue/compiler-ssr" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/shared@3.2.20":
 | 
					"@vue/shared@3.2.21":
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.20.tgz#53746961f731a8ea666e3316271e944238dc31db"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.21.tgz#4cd80c0e62cf65a7adab2449e86b6f0cb33a130b"
 | 
				
			||||||
  integrity sha512-FbpX+hD5BvXCQerEYO7jtAGHlhAkhTQ4KIV73kmLWNlawWhTiVuQxizgVb0BOkX5oG9cIRZ42EG++d/k/Efp0w==
 | 
					  integrity sha512-5EQmIPK6gw4UVYUbM959B0uPsJ58+xoMESCZs3N89XyvJ9e+fX4pqEPrOGV8OroIk3SbEvJcC+eYc8BH9JQrHA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/web-component-wrapper@^1.2.0":
 | 
					"@vue/web-component-wrapper@^1.2.0":
 | 
				
			||||||
  version "1.3.0"
 | 
					  version "1.3.0"
 | 
				
			||||||
@ -1674,6 +1674,28 @@
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
 | 
					  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
 | 
				
			||||||
  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 | 
					  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abstract-leveldown@^6.2.1:
 | 
				
			||||||
 | 
					  version "6.3.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
 | 
				
			||||||
 | 
					  integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    buffer "^5.5.0"
 | 
				
			||||||
 | 
					    immediate "^3.2.3"
 | 
				
			||||||
 | 
					    level-concat-iterator "~2.0.0"
 | 
				
			||||||
 | 
					    level-supports "~1.0.0"
 | 
				
			||||||
 | 
					    xtend "~4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3:
 | 
				
			||||||
 | 
					  version "6.2.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
 | 
				
			||||||
 | 
					  integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    buffer "^5.5.0"
 | 
				
			||||||
 | 
					    immediate "^3.2.3"
 | 
				
			||||||
 | 
					    level-concat-iterator "~2.0.0"
 | 
				
			||||||
 | 
					    level-supports "~1.0.0"
 | 
				
			||||||
 | 
					    xtend "~4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
 | 
					accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
 | 
				
			||||||
  version "1.3.7"
 | 
					  version "1.3.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
 | 
					  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
 | 
				
			||||||
@ -1899,9 +1921,9 @@ asn1.js@^5.2.0:
 | 
				
			|||||||
    safer-buffer "^2.1.0"
 | 
					    safer-buffer "^2.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
asn1@~0.2.3:
 | 
					asn1@~0.2.3:
 | 
				
			||||||
  version "0.2.4"
 | 
					  version "0.2.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
 | 
					  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
 | 
				
			||||||
  integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
 | 
					  integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    safer-buffer "~2.1.0"
 | 
					    safer-buffer "~2.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2036,7 +2058,7 @@ balanced-match@^1.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
 | 
					  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
 | 
				
			||||||
  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
 | 
					  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
base64-js@^1.0.2:
 | 
					base64-js@^1.0.2, base64-js@^1.3.1:
 | 
				
			||||||
  version "1.5.1"
 | 
					  version "1.5.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
 | 
					  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
 | 
				
			||||||
  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
 | 
					  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
 | 
				
			||||||
@ -2248,13 +2270,13 @@ browserify-zlib@^0.2.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    pako "~1.0.5"
 | 
					    pako "~1.0.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.5:
 | 
					browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.6:
 | 
				
			||||||
  version "4.17.5"
 | 
					  version "4.17.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.5.tgz#c827bbe172a4c22b123f5e337533ceebadfdd559"
 | 
					  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d"
 | 
				
			||||||
  integrity sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==
 | 
					  integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    caniuse-lite "^1.0.30001271"
 | 
					    caniuse-lite "^1.0.30001274"
 | 
				
			||||||
    electron-to-chromium "^1.3.878"
 | 
					    electron-to-chromium "^1.3.886"
 | 
				
			||||||
    escalade "^3.1.1"
 | 
					    escalade "^3.1.1"
 | 
				
			||||||
    node-releases "^2.0.1"
 | 
					    node-releases "^2.0.1"
 | 
				
			||||||
    picocolors "^1.0.0"
 | 
					    picocolors "^1.0.0"
 | 
				
			||||||
@ -2288,6 +2310,14 @@ buffer@^4.3.0:
 | 
				
			|||||||
    ieee754 "^1.1.4"
 | 
					    ieee754 "^1.1.4"
 | 
				
			||||||
    isarray "^1.0.0"
 | 
					    isarray "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					buffer@^5.5.0, buffer@^5.6.0:
 | 
				
			||||||
 | 
					  version "5.7.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
 | 
				
			||||||
 | 
					  integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    base64-js "^1.3.1"
 | 
				
			||||||
 | 
					    ieee754 "^1.1.13"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
builtin-status-codes@^3.0.0:
 | 
					builtin-status-codes@^3.0.0:
 | 
				
			||||||
  version "3.0.0"
 | 
					  version "3.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
 | 
					  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
 | 
				
			||||||
@ -2416,10 +2446,10 @@ caniuse-api@^3.0.0:
 | 
				
			|||||||
    lodash.memoize "^4.1.2"
 | 
					    lodash.memoize "^4.1.2"
 | 
				
			||||||
    lodash.uniq "^4.5.0"
 | 
					    lodash.uniq "^4.5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001271:
 | 
					caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001274:
 | 
				
			||||||
  version "1.0.30001274"
 | 
					  version "1.0.30001278"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz#26ca36204d15b17601ba6fc35dbdad950a647cc7"
 | 
					  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz#51cafc858df77d966b17f59b5839250b24417fff"
 | 
				
			||||||
  integrity sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==
 | 
					  integrity sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
case-sensitive-paths-webpack-plugin@^2.3.0:
 | 
					case-sensitive-paths-webpack-plugin@^2.3.0:
 | 
				
			||||||
  version "2.4.0"
 | 
					  version "2.4.0"
 | 
				
			||||||
@ -2820,17 +2850,17 @@ copy-webpack-plugin@^5.1.1:
 | 
				
			|||||||
    webpack-log "^2.0.0"
 | 
					    webpack-log "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
core-js-compat@^3.18.0, core-js-compat@^3.19.0, core-js-compat@^3.6.5:
 | 
					core-js-compat@^3.18.0, core-js-compat@^3.19.0, core-js-compat@^3.6.5:
 | 
				
			||||||
  version "3.19.0"
 | 
					  version "3.19.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.0.tgz#b3b93f93c8721b3ed52b91f12f964cc410967f8b"
 | 
					  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.1.tgz#fe598f1a9bf37310d77c3813968e9f7c7bb99476"
 | 
				
			||||||
  integrity sha512-R09rKZ56ccGBebjTLZHvzDxhz93YPT37gBm6qUhnwj3Kt7aCjjZWD1injyNbyeFHxNKfeZBSyds6O9n3MKq1sw==
 | 
					  integrity sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    browserslist "^4.17.5"
 | 
					    browserslist "^4.17.6"
 | 
				
			||||||
    semver "7.0.0"
 | 
					    semver "7.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
core-js@^3.6.5:
 | 
					core-js@^3.6.5:
 | 
				
			||||||
  version "3.19.0"
 | 
					  version "3.19.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.0.tgz#9e40098a9bc326c7e81b486abbd5e12b9d275176"
 | 
					  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641"
 | 
				
			||||||
  integrity sha512-L1TpFRWXZ76vH1yLM+z6KssLZrP8Z6GxxW4auoCj+XiViOzNPJCAuTIkn03BGdFe6Z5clX5t64wRIRypsZQrUg==
 | 
					  integrity sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
core-util-is@1.0.2:
 | 
					core-util-is@1.0.2:
 | 
				
			||||||
  version "1.0.2"
 | 
					  version "1.0.2"
 | 
				
			||||||
@ -3185,6 +3215,14 @@ defaults@^1.0.3:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    clone "^1.0.2"
 | 
					    clone "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					deferred-leveldown@~5.3.0:
 | 
				
			||||||
 | 
					  version "5.3.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
 | 
				
			||||||
 | 
					  integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    abstract-leveldown "~6.2.1"
 | 
				
			||||||
 | 
					    inherits "^2.0.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define-properties@^1.1.2, define-properties@^1.1.3:
 | 
					define-properties@^1.1.2, define-properties@^1.1.3:
 | 
				
			||||||
  version "1.1.3"
 | 
					  version "1.1.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
 | 
					  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
 | 
				
			||||||
@ -3423,10 +3461,10 @@ ejs@^2.6.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
 | 
					  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
 | 
				
			||||||
  integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 | 
					  integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
electron-to-chromium@^1.3.878:
 | 
					electron-to-chromium@^1.3.886:
 | 
				
			||||||
  version "1.3.885"
 | 
					  version "1.3.890"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz#c8cec32fbc61364127849ae00f2395a1bae7c454"
 | 
					  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.890.tgz#e7143b659f73dc4d0512d1ae4baeb0fb9e7bc835"
 | 
				
			||||||
  integrity sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==
 | 
					  integrity sha512-VWlVXSkv0cA/OOehrEyqjUTHwV8YXCPTfPvbtoeU2aHR21vI4Ejh5aC4AxUwOmbLbBgb6Gd3URZahoCxtBqCYQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
elliptic@^6.5.3:
 | 
					elliptic@^6.5.3:
 | 
				
			||||||
  version "6.5.4"
 | 
					  version "6.5.4"
 | 
				
			||||||
@ -3466,6 +3504,16 @@ encodeurl@~1.0.2:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
 | 
					  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
 | 
				
			||||||
  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 | 
					  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					encoding-down@^6.3.0:
 | 
				
			||||||
 | 
					  version "6.3.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
 | 
				
			||||||
 | 
					  integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    abstract-leveldown "^6.2.1"
 | 
				
			||||||
 | 
					    inherits "^2.0.3"
 | 
				
			||||||
 | 
					    level-codec "^9.0.0"
 | 
				
			||||||
 | 
					    level-errors "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
 | 
					end-of-stream@^1.0.0, end-of-stream@^1.1.0:
 | 
				
			||||||
  version "1.4.4"
 | 
					  version "1.4.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
 | 
					  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
 | 
				
			||||||
@ -3496,7 +3544,7 @@ entities@^2.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
 | 
					  resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
 | 
				
			||||||
  integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
 | 
					  integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
errno@^0.1.3, errno@~0.1.7:
 | 
					errno@^0.1.3, errno@~0.1.1, errno@~0.1.7:
 | 
				
			||||||
  version "0.1.8"
 | 
					  version "0.1.8"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
 | 
					  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
 | 
				
			||||||
  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
 | 
					  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
 | 
				
			||||||
@ -3976,9 +4024,9 @@ extsprintf@1.3.0:
 | 
				
			|||||||
  integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
 | 
					  integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extsprintf@^1.2.0:
 | 
					extsprintf@^1.2.0:
 | 
				
			||||||
  version "1.4.0"
 | 
					  version "1.4.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
 | 
					  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
 | 
				
			||||||
  integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
 | 
					  integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fast-deep-equal@^3.1.1:
 | 
					fast-deep-equal@^3.1.1:
 | 
				
			||||||
  version "3.1.3"
 | 
					  version "3.1.3"
 | 
				
			||||||
@ -4733,7 +4781,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    postcss "^7.0.14"
 | 
					    postcss "^7.0.14"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ieee754@^1.1.4:
 | 
					ieee754@^1.1.13, ieee754@^1.1.4:
 | 
				
			||||||
  version "1.2.1"
 | 
					  version "1.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
 | 
					  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
 | 
				
			||||||
  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
 | 
					  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
 | 
				
			||||||
@ -4754,9 +4802,14 @@ ignore@^4.0.3, ignore@^4.0.6:
 | 
				
			|||||||
  integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 | 
					  integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ignore@^5.1.1:
 | 
					ignore@^5.1.1:
 | 
				
			||||||
  version "5.1.8"
 | 
					  version "5.1.9"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
 | 
					  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb"
 | 
				
			||||||
  integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
 | 
					  integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					immediate@^3.2.3:
 | 
				
			||||||
 | 
					  version "3.3.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
 | 
				
			||||||
 | 
					  integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import-cwd@^2.0.0:
 | 
					import-cwd@^2.0.0:
 | 
				
			||||||
  version "2.1.0"
 | 
					  version "2.1.0"
 | 
				
			||||||
@ -5245,6 +5298,11 @@ isobject@^3.0.0, isobject@^3.0.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
 | 
					  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
 | 
				
			||||||
  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
 | 
					  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					isomorphic.js@^0.2.4:
 | 
				
			||||||
 | 
					  version "0.2.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.4.tgz#24ca374163ae54a7ce3b86ce63b701b91aa84969"
 | 
				
			||||||
 | 
					  integrity sha512-Y4NjZceAwaPXctwsHgNsmfuPxR8lJ3f8X7QTAkhltrX4oGIv+eTlgHLXn4tWysC9zGTi929gapnPp+8F8cg7nA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
isstream@~0.1.2:
 | 
					isstream@~0.1.2:
 | 
				
			||||||
  version "0.1.2"
 | 
					  version "0.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
 | 
					  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
 | 
				
			||||||
@ -5410,6 +5468,88 @@ launch-editor@^2.2.1:
 | 
				
			|||||||
    chalk "^2.3.0"
 | 
					    chalk "^2.3.0"
 | 
				
			||||||
    shell-quote "^1.6.1"
 | 
					    shell-quote "^1.6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level-codec@^9.0.0:
 | 
				
			||||||
 | 
					  version "9.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
 | 
				
			||||||
 | 
					  integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    buffer "^5.6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level-concat-iterator@~2.0.0:
 | 
				
			||||||
 | 
					  version "2.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
 | 
				
			||||||
 | 
					  integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level-errors@^2.0.0, level-errors@~2.0.0:
 | 
				
			||||||
 | 
					  version "2.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
 | 
				
			||||||
 | 
					  integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    errno "~0.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level-iterator-stream@~4.0.0:
 | 
				
			||||||
 | 
					  version "4.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
 | 
				
			||||||
 | 
					  integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    inherits "^2.0.4"
 | 
				
			||||||
 | 
					    readable-stream "^3.4.0"
 | 
				
			||||||
 | 
					    xtend "^4.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level-js@^5.0.0:
 | 
				
			||||||
 | 
					  version "5.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55"
 | 
				
			||||||
 | 
					  integrity sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    abstract-leveldown "~6.2.3"
 | 
				
			||||||
 | 
					    buffer "^5.5.0"
 | 
				
			||||||
 | 
					    inherits "^2.0.3"
 | 
				
			||||||
 | 
					    ltgt "^2.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level-packager@^5.1.0:
 | 
				
			||||||
 | 
					  version "5.1.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
 | 
				
			||||||
 | 
					  integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    encoding-down "^6.3.0"
 | 
				
			||||||
 | 
					    levelup "^4.3.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level-supports@~1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
 | 
				
			||||||
 | 
					  integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    xtend "^4.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					level@^6.0.1:
 | 
				
			||||||
 | 
					  version "6.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6"
 | 
				
			||||||
 | 
					  integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    level-js "^5.0.0"
 | 
				
			||||||
 | 
					    level-packager "^5.1.0"
 | 
				
			||||||
 | 
					    leveldown "^5.4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					leveldown@^5.4.0:
 | 
				
			||||||
 | 
					  version "5.6.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
 | 
				
			||||||
 | 
					  integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    abstract-leveldown "~6.2.1"
 | 
				
			||||||
 | 
					    napi-macros "~2.0.0"
 | 
				
			||||||
 | 
					    node-gyp-build "~4.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					levelup@^4.3.2:
 | 
				
			||||||
 | 
					  version "4.4.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
 | 
				
			||||||
 | 
					  integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    deferred-leveldown "~5.3.0"
 | 
				
			||||||
 | 
					    level-errors "~2.0.0"
 | 
				
			||||||
 | 
					    level-iterator-stream "~4.0.0"
 | 
				
			||||||
 | 
					    level-supports "~1.0.0"
 | 
				
			||||||
 | 
					    xtend "~4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
levn@^0.3.0, levn@~0.3.0:
 | 
					levn@^0.3.0, levn@~0.3.0:
 | 
				
			||||||
  version "0.3.0"
 | 
					  version "0.3.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
 | 
					  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
 | 
				
			||||||
@ -5418,6 +5558,13 @@ levn@^0.3.0, levn@~0.3.0:
 | 
				
			|||||||
    prelude-ls "~1.1.2"
 | 
					    prelude-ls "~1.1.2"
 | 
				
			||||||
    type-check "~0.3.2"
 | 
					    type-check "~0.3.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lib0@^0.2.31, lib0@^0.2.35, lib0@^0.2.42:
 | 
				
			||||||
 | 
					  version "0.2.42"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.42.tgz#6d8bf1fb8205dec37a953c521c5ee403fd8769b0"
 | 
				
			||||||
 | 
					  integrity sha512-8BNM4MiokEKzMvSxTOC3gnCBisJH+jL67CnSnqzHv3jli3pUvGC8wz+0DQ2YvGr4wVQdb2R2uNNPw9LEpVvJ4Q==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    isomorphic.js "^0.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lines-and-columns@^1.1.6:
 | 
					lines-and-columns@^1.1.6:
 | 
				
			||||||
  version "1.1.6"
 | 
					  version "1.1.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
 | 
					  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
 | 
				
			||||||
@ -5456,9 +5603,9 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4
 | 
				
			|||||||
    json5 "^1.0.1"
 | 
					    json5 "^1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
loader-utils@^2.0.0:
 | 
					loader-utils@^2.0.0:
 | 
				
			||||||
  version "2.0.1"
 | 
					  version "2.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.1.tgz#3b8d4386f42378d6434d32d7bc08e7a52d39575e"
 | 
					  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
 | 
				
			||||||
  integrity sha512-g4miPa9uUrZz4iElkaVJgDFwKJGh8aQGM7pUL4ejXl6cu7kSb30seQOVGNMP6sW8j7DW77X68hJZ+GM7UGhXeQ==
 | 
					  integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    big.js "^5.2.2"
 | 
					    big.js "^5.2.2"
 | 
				
			||||||
    emojis-list "^3.0.0"
 | 
					    emojis-list "^3.0.0"
 | 
				
			||||||
@ -5559,6 +5706,11 @@ lru-cache@^5.1.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    yallist "^3.0.2"
 | 
					    yallist "^3.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ltgt@^2.1.2:
 | 
				
			||||||
 | 
					  version "2.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
 | 
				
			||||||
 | 
					  integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
magic-string@^0.25.7:
 | 
					magic-string@^0.25.7:
 | 
				
			||||||
  version "0.25.7"
 | 
					  version "0.25.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
 | 
					  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
 | 
				
			||||||
@ -5718,9 +5870,9 @@ mime@1.6.0:
 | 
				
			|||||||
  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
 | 
					  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mime@^2.4.4:
 | 
					mime@^2.4.4:
 | 
				
			||||||
  version "2.5.2"
 | 
					  version "2.6.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
 | 
					  resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
 | 
				
			||||||
  integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
 | 
					  integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mimic-fn@^1.0.0:
 | 
					mimic-fn@^1.0.0:
 | 
				
			||||||
  version "1.2.0"
 | 
					  version "1.2.0"
 | 
				
			||||||
@ -5802,6 +5954,18 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    minimist "^1.2.5"
 | 
					    minimist "^1.2.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					monaco-editor-webpack-plugin@^6.0.0:
 | 
				
			||||||
 | 
					  version "6.0.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-6.0.0.tgz#628956ce1851afa2a5f6c88d0ecbb24e9a444898"
 | 
				
			||||||
 | 
					  integrity sha512-vC886Mzpd2AkSM35XLkfQMjH+Ohz6RISVwhAejDUzZDheJAiz6G34lky1vyO8fZ702v7IrcKmsGwL1rRFnwvUA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    loader-utils "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					monaco-editor@^0.30.0:
 | 
				
			||||||
 | 
					  version "0.30.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.30.0.tgz#1c7f9ba1d18c21868ce3a5413ef56351f9df7933"
 | 
				
			||||||
 | 
					  integrity sha512-/k++/ofRmwnwWTpOWYOMGVcqBrqrlt3MP0Mt/cRTQojW7A9fnekcvPQ2iIFA0YSZdPWPN9yYXrYq0xqiUuxT/A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
move-concurrently@^1.0.1:
 | 
					move-concurrently@^1.0.1:
 | 
				
			||||||
  version "1.0.1"
 | 
					  version "1.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
 | 
					  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
 | 
				
			||||||
@ -5888,6 +6052,11 @@ nanomatch@^1.2.9:
 | 
				
			|||||||
    snapdragon "^0.8.1"
 | 
					    snapdragon "^0.8.1"
 | 
				
			||||||
    to-regex "^3.0.1"
 | 
					    to-regex "^3.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					napi-macros@~2.0.0:
 | 
				
			||||||
 | 
					  version "2.0.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b"
 | 
				
			||||||
 | 
					  integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
natural-compare@^1.4.0:
 | 
					natural-compare@^1.4.0:
 | 
				
			||||||
  version "1.4.0"
 | 
					  version "1.4.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
 | 
					  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
 | 
				
			||||||
@ -5920,6 +6089,11 @@ node-forge@^0.10.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
 | 
					  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
 | 
				
			||||||
  integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
 | 
					  integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node-gyp-build@~4.1.0:
 | 
				
			||||||
 | 
					  version "4.1.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
 | 
				
			||||||
 | 
					  integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
node-ipc@^9.1.1:
 | 
					node-ipc@^9.1.1:
 | 
				
			||||||
  version "9.2.1"
 | 
					  version "9.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.2.1.tgz#b32f66115f9d6ce841dc4ec2009d6a733f98bb6b"
 | 
					  resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.2.1.tgz#b32f66115f9d6ce841dc4ec2009d6a733f98bb6b"
 | 
				
			||||||
@ -7097,7 +7271,7 @@ read-pkg@^5.1.1:
 | 
				
			|||||||
    string_decoder "~1.1.1"
 | 
					    string_decoder "~1.1.1"
 | 
				
			||||||
    util-deprecate "~1.0.1"
 | 
					    util-deprecate "~1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
readable-stream@^3.0.6, readable-stream@^3.6.0:
 | 
					readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0:
 | 
				
			||||||
  version "3.6.0"
 | 
					  version "3.6.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
 | 
					  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
 | 
				
			||||||
  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
 | 
					  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
 | 
				
			||||||
@ -8532,9 +8706,9 @@ vue-hot-reload-api@^2.3.0:
 | 
				
			|||||||
  integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
 | 
					  integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"vue-loader-v16@npm:vue-loader@^16.1.0":
 | 
					"vue-loader-v16@npm:vue-loader@^16.1.0":
 | 
				
			||||||
  version "16.8.2"
 | 
					  version "16.8.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.2.tgz#78552d6558207a93f09e4fb68b068d44964eb740"
 | 
					  resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087"
 | 
				
			||||||
  integrity sha512-Nkq+z9mAsMEK+qkXgK+9Ia7D8w9uu9j4ut0IMT5coMfux3rCgIp1QBB1CYwY0M34A1nRMSONEaWXxAAw6xSl/Q==
 | 
					  integrity sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    chalk "^4.1.0"
 | 
					    chalk "^4.1.0"
 | 
				
			||||||
    hash-sum "^2.0.0"
 | 
					    hash-sum "^2.0.0"
 | 
				
			||||||
@ -8572,15 +8746,15 @@ vue-template-es2015-compiler@^1.9.0:
 | 
				
			|||||||
  integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
 | 
					  integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vue@^3.0.0:
 | 
					vue@^3.0.0:
 | 
				
			||||||
  version "3.2.20"
 | 
					  version "3.2.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.20.tgz#940f8aa8bf3e3be78243ca582bad41fcd45ae3e6"
 | 
					  resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.21.tgz#55f5665172d95cf97e806b9aad0a375180be23a1"
 | 
				
			||||||
  integrity sha512-81JjEP4OGk9oO8+CU0h2nFPGgJBm9mNa3kdCX2k6FuRdrWrC+CNe+tOnuIeTg8EWwQuI+wwdra5Q7vSzp7p4Iw==
 | 
					  integrity sha512-jpy7ckXdyclfRzqLjL4mtq81AkzQleE54KjZsJg/9OorNVurAxdlU5XpD49GpjKdnftuffKUvx2C5jDOrgc/zg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-dom" "3.2.20"
 | 
					    "@vue/compiler-dom" "3.2.21"
 | 
				
			||||||
    "@vue/compiler-sfc" "3.2.20"
 | 
					    "@vue/compiler-sfc" "3.2.21"
 | 
				
			||||||
    "@vue/runtime-dom" "3.2.20"
 | 
					    "@vue/runtime-dom" "3.2.21"
 | 
				
			||||||
    "@vue/server-renderer" "3.2.20"
 | 
					    "@vue/server-renderer" "3.2.21"
 | 
				
			||||||
    "@vue/shared" "3.2.20"
 | 
					    "@vue/shared" "3.2.21"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
watchpack-chokidar2@^2.0.1:
 | 
					watchpack-chokidar2@^2.0.1:
 | 
				
			||||||
  version "2.0.1"
 | 
					  version "2.0.1"
 | 
				
			||||||
@ -8845,7 +9019,7 @@ ws@^6.0.0, ws@^6.2.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async-limiter "~1.0.0"
 | 
					    async-limiter "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
xtend@^4.0.0, xtend@~4.0.1:
 | 
					xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
 | 
				
			||||||
  version "4.0.2"
 | 
					  version "4.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
 | 
					  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
 | 
				
			||||||
  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
 | 
					  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
 | 
				
			||||||
@ -8861,9 +9035,43 @@ xterm-addon-fit@^0.5.0:
 | 
				
			|||||||
  integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==
 | 
					  integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
xterm@^4.14.1:
 | 
					xterm@^4.14.1:
 | 
				
			||||||
  version "4.14.1"
 | 
					  version "4.15.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.14.1.tgz#6884cb8fb3b83353b1a98139ea23daedf8e35796"
 | 
					  resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.15.0.tgz#e52038507eba7e0d36d47f81e29fe548c82b9561"
 | 
				
			||||||
  integrity sha512-jgzNg5BuGPwq5/M4dGnmbghZvHx2jaj+9crSEt15bV34Za49VziBmCu7zIy88zUKKiGTxeo7aVzirFSJArIMFw==
 | 
					  integrity sha512-Ik1GoSq1yqKZQ2LF37RPS01kX9t4TP8gpamUYblD09yvWX5mEYuMK4CcqH6+plgiNEZduhTz/UrcaWs97gOlOw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					y-leveldb@^0.1.0:
 | 
				
			||||||
 | 
					  version "0.1.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/y-leveldb/-/y-leveldb-0.1.0.tgz#8b60c1af020252445875ebc70d52666017bcb038"
 | 
				
			||||||
 | 
					  integrity sha512-sMuitVrsAUNh+0b66I42nAuW3lCmez171uP4k0ePcTAJ+c+Iw9w4Yq3wwiyrDMFXBEyQSjSF86Inc23wEvWnxw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    level "^6.0.1"
 | 
				
			||||||
 | 
					    lib0 "^0.2.31"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					y-monaco@^0.1.2:
 | 
				
			||||||
 | 
					  version "0.1.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/y-monaco/-/y-monaco-0.1.2.tgz#aa71e7acddcd1ab37e5e570aca1529a379f69ef6"
 | 
				
			||||||
 | 
					  integrity sha512-8VkmPsSbj4JZlLW8/su1O4ULZEGeS22VAvAXawpHlh2BoyeNy5AIwSl5eam+soEuyWHpktQSmxYOBOvQuu6mpQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    lib0 "^0.2.35"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					y-protocols@^1.0.5:
 | 
				
			||||||
 | 
					  version "1.0.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.5.tgz#91d574250060b29fcac8f8eb5e276fbad594245e"
 | 
				
			||||||
 | 
					  integrity sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    lib0 "^0.2.42"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					y-websocket@^1.3.17:
 | 
				
			||||||
 | 
					  version "1.3.17"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/y-websocket/-/y-websocket-1.3.17.tgz#d5465fe6d378df9f6bdd503f23d001e5b526db54"
 | 
				
			||||||
 | 
					  integrity sha512-SswN7EosLDpnrWue45/yQjkTGSRkzxioFc/0WcyHNkudnknWToOBaIo2coWgnYZd9BP0XlNAc8pPhTGkDveQJQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    lib0 "^0.2.42"
 | 
				
			||||||
 | 
					    lodash.debounce "^4.0.8"
 | 
				
			||||||
 | 
					    y-protocols "^1.0.5"
 | 
				
			||||||
 | 
					  optionalDependencies:
 | 
				
			||||||
 | 
					    ws "^6.2.1"
 | 
				
			||||||
 | 
					    y-leveldb "^0.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
y18n@^4.0.0:
 | 
					y18n@^4.0.0:
 | 
				
			||||||
  version "4.0.3"
 | 
					  version "4.0.3"
 | 
				
			||||||
@ -8932,6 +9140,13 @@ yargs@^16.0.0:
 | 
				
			|||||||
    y18n "^5.0.5"
 | 
					    y18n "^5.0.5"
 | 
				
			||||||
    yargs-parser "^20.2.2"
 | 
					    yargs-parser "^20.2.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					yjs@^13.5.18:
 | 
				
			||||||
 | 
					  version "13.5.18"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.5.18.tgz#4151f381b170726b69be26296fd84b2efdc82e6e"
 | 
				
			||||||
 | 
					  integrity sha512-6LcTL8gRe12fy89OvXG6Xs/uhsl7iwE4Wh106H1NItkcqcUaY2waTje1NVWmOZNXHXWVAzdf/fBQqB4Phq9sGA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    lib0 "^0.2.42"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
yorkie@^2.0.0:
 | 
					yorkie@^2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9"
 | 
					  resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user