├── img ├── images go in here └── sample.png ├── data └── data files appear in here ├── nodemon.json ├── public ├── favicon.ico ├── logo192.png ├── logo512.png ├── robots.txt ├── manifest.json ├── output.json ├── asset-manifest.json ├── static │ └── js │ │ ├── 2.46749ce1.chunk.js.LICENSE.txt │ │ ├── 2.c9ca875a.chunk.js.LICENSE.txt │ │ ├── runtime-main.1bc30be2.js │ │ ├── runtime-main.6e8cf183.js │ │ ├── 3.24ef5471.chunk.js │ │ ├── 3.e5acc395.chunk.js │ │ ├── 3.24ef5471.chunk.js.map │ │ ├── 3.e5acc395.chunk.js.map │ │ ├── runtime-main.1bc30be2.js.map │ │ ├── runtime-main.6e8cf183.js.map │ │ ├── main.5ab38de4.chunk.js │ │ └── main.6aa8440a.chunk.js └── index.html ├── screenshots ├── admin.png └── screen-large.jpg ├── .gitignore ├── endpoints ├── get_clients.js ├── save_all_playlists.js ├── delete_playlist.js ├── save_client.js ├── save_image_set.js ├── upload_files.js └── get_image.js ├── Dockerfile ├── package.json ├── utils ├── data.js ├── get_pixel_buffer.js └── get_image_stat.js ├── README.md ├── server.js └── yarn.lock /img/images go in here: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/data files appear in here: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": ["data/*.json", "images/**/*"] 3 | } -------------------------------------------------------------------------------- /img/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hughc/pixel-art-server/HEAD/img/sample.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hughc/pixel-art-server/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hughc/pixel-art-server/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hughc/pixel-art-server/HEAD/public/logo512.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /screenshots/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hughc/pixel-art-server/HEAD/screenshots/admin.png -------------------------------------------------------------------------------- /screenshots/screen-large.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hughc/pixel-art-server/HEAD/screenshots/screen-large.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | img/**/*.png 3 | img/**/*.jpg 4 | img/**/*.gif 5 | !img/sample.png 6 | .history 7 | data/*.json -------------------------------------------------------------------------------- /endpoints/get_clients.js: -------------------------------------------------------------------------------- 1 | import { Data } from "../utils/data.js"; 2 | 3 | 4 | export function getClients(req, res) { 5 | res.send(Data.clients); 6 | }; -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:21 2 | WORKDIR /app 3 | COPY . . 4 | RUN npm install && yarn && npm prune --production 5 | EXPOSE 80 6 | ENTRYPOINT ["node","server.js"] 7 | CMD ["--port","80"] 8 | 9 | -------------------------------------------------------------------------------- /endpoints/save_all_playlists.js: -------------------------------------------------------------------------------- 1 | import fsextra from 'fs-extra'; 2 | const { writeJSONSync } = fsextra; 3 | import { Data } from "../utils/data.js"; 4 | 5 | export function saveAllPlaylists(playlists) { 6 | console.log("saveAllPlaylists", playlists.length); 7 | writeJSONSync(Data.playlistFilePath, playlists, { spaces: 2 }); 8 | Data.playlists = playlists; 9 | } 10 | -------------------------------------------------------------------------------- /endpoints/delete_playlist.js: -------------------------------------------------------------------------------- 1 | import _ from 'underscore'; 2 | import { saveAllPlaylists } from './save_all_playlists.js'; 3 | import { Data } from '../utils/data.js'; 4 | 5 | export function deletePlaylist(req, res) { 6 | console.log("Got a DELETE request at /imageset"); 7 | const uid = req.body.uid; 8 | Data.playlists = _.reject(Data.playlists, (imageset) => imageset.id == uid); 9 | saveAllPlaylists(Data.playlists); 10 | res.send({ success: true, message: "imageset removed" }); 11 | } 12 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /public/output.json: -------------------------------------------------------------------------------- 1 | [40,40,40,2,2,2,65,64,63,96,98,101,71,79,90,60,45,31,31,17,2,26,26,29,54,40,23,192,104,8,245,147,38,247,230,207,217,223,229,238,239,240,57,57,57,13,13,13,39,39,39,255,255,255,247,255,255,67,60,53,215,116,6,255,157,44,234,146,46,197,119,33,210,126,34,227,144,50,227,134,28,231,131,18,254,247,238,255,255,255,242,242,242,31,31,31,39,39,39,247,247,247,255,255,255,202,194,187,222,115,8,230,132,24,229,142,41,238,141,34,170,102,28,248,135,10,255,157,21,230,155,62,84,83,80,244,250,255,223,223,223,33,33,33,13,13,13,19,19,19,205,205,204,231,238,246,215,213,210,210,123,25,178,95,3,27,26,25,38,41,45,9,11,15,13,13,15,15,16,21,29,29,29,14,14,14,3,3,3,46,46,46] 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pixelart-server", 3 | "version": "1.0.0", 4 | "description": "supplies RGB values, as JSON arrays to drive an LED strip", 5 | "main": "main.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "type": "module", 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "body-parser": "^1.19.0", 15 | "command-line-args": "^5.2.1", 16 | "command-line-usage": "^7.0.1", 17 | "cors": "^2.8.5", 18 | "express": "^4.17.1", 19 | "express-fileupload": "^1.2.0", 20 | "express-static": "^1.2.6", 21 | "fs-extra": "^9.0.1", 22 | "sharp": "^0.25.4", 23 | "underscore": "^1.10.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /endpoints/save_client.js: -------------------------------------------------------------------------------- 1 | import fsextra from 'fs-extra'; 2 | import _ from 'underscore'; 3 | const { writeJSONSync } = fsextra; 4 | 5 | import { Data } from "../utils/data.js"; 6 | 7 | export function saveClient(clientData, overWriteFlag) { 8 | const existingClient = _.findWhere(Data.clients, { id: clientData.id }); 9 | let updateToDisk = false; 10 | if (existingClient && overWriteFlag) { 11 | const pos = Data.clients.indexOf(existingClient); 12 | Data.clients.splice(pos, 1, clientData); 13 | console.log({'server clients': Data.clients }); 14 | updateToDisk = true; 15 | } else if (!existingClient) { 16 | Data.clients.push(clientData); 17 | updateToDisk = true; 18 | } 19 | if(updateToDisk) writeJSONSync(Data.clientsFilePath, Data.clients, {spaces: 2}); 20 | } -------------------------------------------------------------------------------- /public/asset-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "main.css": "/static/css/main.f579f4a8.chunk.css", 4 | "main.js": "/static/js/main.5ab38de4.chunk.js", 5 | "main.js.map": "/static/js/main.5ab38de4.chunk.js.map", 6 | "runtime-main.js": "/static/js/runtime-main.6e8cf183.js", 7 | "runtime-main.js.map": "/static/js/runtime-main.6e8cf183.js.map", 8 | "static/js/2.46749ce1.chunk.js": "/static/js/2.46749ce1.chunk.js", 9 | "static/js/2.46749ce1.chunk.js.map": "/static/js/2.46749ce1.chunk.js.map", 10 | "static/js/3.e5acc395.chunk.js": "/static/js/3.e5acc395.chunk.js", 11 | "static/js/3.e5acc395.chunk.js.map": "/static/js/3.e5acc395.chunk.js.map", 12 | "index.html": "/index.html", 13 | "static/css/main.f579f4a8.chunk.css.map": "/static/css/main.f579f4a8.chunk.css.map", 14 | "static/js/2.46749ce1.chunk.js.LICENSE.txt": "/static/js/2.46749ce1.chunk.js.LICENSE.txt" 15 | }, 16 | "entrypoints": [ 17 | "static/js/runtime-main.6e8cf183.js", 18 | "static/js/2.46749ce1.chunk.js", 19 | "static/css/main.f579f4a8.chunk.css", 20 | "static/js/main.5ab38de4.chunk.js" 21 | ] 22 | } -------------------------------------------------------------------------------- /utils/data.js: -------------------------------------------------------------------------------- 1 | import fsextra from 'fs-extra'; 2 | const { readJSONSync, existsSync } = fsextra; 3 | import {resolve} from 'path' 4 | 5 | import { dirname } from 'path'; 6 | import { fileURLToPath } from 'url'; 7 | 8 | 9 | 10 | export class Data { 11 | static staticImageBaseURL = "/image-preview"; 12 | static clients = []; 13 | static playlists = []; 14 | static imageDirectoryPath; 15 | static playlistFilePath; 16 | static clientsFilePath; 17 | static basePath; 18 | 19 | constructor(baseURL) { 20 | Data.basePath = dirname(fileURLToPath(baseURL)); 21 | Data.imageDirectoryPath = resolve(Data.basePath, 'img'); 22 | Data.playlistFilePath = resolve(Data.basePath, 'data/playlists.json'); 23 | Data.clientsFilePath = resolve(Data.basePath,"data/clients.json"); 24 | 25 | 26 | if (existsSync(Data.playlistFilePath)) { 27 | Data.playlists = readJSONSync(Data.playlistFilePath); 28 | } 29 | if (existsSync(Data.clientsFilePath)) { 30 | Data.clients = readJSONSync(Data.clientsFilePath); 31 | } 32 | } 33 | }; -------------------------------------------------------------------------------- /endpoints/save_image_set.js: -------------------------------------------------------------------------------- 1 | import fsextra from 'fs-extra'; 2 | const { writeJSONSync } = fsextra; 3 | import { Data } from "../utils/data.js"; 4 | 5 | export function replaceImageSet(req, res) { 6 | console.log('app.post("/imageset"', req.body); 7 | const imagesetData = _.pick( 8 | req.body, 9 | "id", 10 | "name", 11 | "duration", 12 | "brightness", 13 | "images" 14 | ); 15 | if (!imagesetData.id) { 16 | res.send({ success: false, error: "no client id supplied" }); 17 | return; 18 | } 19 | saveImageset(imagesetData, true); 20 | res.send({ success: true }); 21 | } 22 | 23 | // saves to fiska nd updates cache in memory 24 | function saveImageset(imagesetData, overWriteFlag) { 25 | existingImageset = _.findWhere(Data.playlists, { id: imagesetData.id }); 26 | let updateToDisk = false; 27 | if (existingImageset && overWriteFlag) { 28 | const pos = Data.playlists.indexOf(existingImageset); 29 | Data.playlists.splice(pos, 1, imagesetData); 30 | console.log({ playlists: Data.playlists }); 31 | updateToDisk = true; 32 | } else if (!existingImageset) { 33 | Data.playlists.push(imagesetData); 34 | updateToDisk = true; 35 | } 36 | if (updateToDisk) writeJSONSync(playlistFilePath, Data.playlists, {spaces: 2}); 37 | } -------------------------------------------------------------------------------- /public/static/js/2.46749ce1.chunk.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /* 2 | object-assign 3 | (c) Sindre Sorhus 4 | @license MIT 5 | */ 6 | 7 | /*! 8 | Copyright (c) 2018 Jed Watson. 9 | Licensed under the MIT License (MIT), see 10 | http://jedwatson.github.io/classnames 11 | */ 12 | 13 | /** @license React v0.20.2 14 | * scheduler.production.min.js 15 | * 16 | * Copyright (c) Facebook, Inc. and its affiliates. 17 | * 18 | * This source code is licensed under the MIT license found in the 19 | * LICENSE file in the root directory of this source tree. 20 | */ 21 | 22 | /** @license React v17.0.2 23 | * react-dom.production.min.js 24 | * 25 | * Copyright (c) Facebook, Inc. and its affiliates. 26 | * 27 | * This source code is licensed under the MIT license found in the 28 | * LICENSE file in the root directory of this source tree. 29 | */ 30 | 31 | /** @license React v17.0.2 32 | * react-jsx-runtime.production.min.js 33 | * 34 | * Copyright (c) Facebook, Inc. and its affiliates. 35 | * 36 | * This source code is licensed under the MIT license found in the 37 | * LICENSE file in the root directory of this source tree. 38 | */ 39 | 40 | /** @license React v17.0.2 41 | * react.production.min.js 42 | * 43 | * Copyright (c) Facebook, Inc. and its affiliates. 44 | * 45 | * This source code is licensed under the MIT license found in the 46 | * LICENSE file in the root directory of this source tree. 47 | */ 48 | -------------------------------------------------------------------------------- /public/static/js/2.c9ca875a.chunk.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /* 2 | object-assign 3 | (c) Sindre Sorhus 4 | @license MIT 5 | */ 6 | 7 | /*! 8 | Copyright (c) 2018 Jed Watson. 9 | Licensed under the MIT License (MIT), see 10 | http://jedwatson.github.io/classnames 11 | */ 12 | 13 | /** @license React v0.20.2 14 | * scheduler.production.min.js 15 | * 16 | * Copyright (c) Facebook, Inc. and its affiliates. 17 | * 18 | * This source code is licensed under the MIT license found in the 19 | * LICENSE file in the root directory of this source tree. 20 | */ 21 | 22 | /** @license React v17.0.2 23 | * react-dom.production.min.js 24 | * 25 | * Copyright (c) Facebook, Inc. and its affiliates. 26 | * 27 | * This source code is licensed under the MIT license found in the 28 | * LICENSE file in the root directory of this source tree. 29 | */ 30 | 31 | /** @license React v17.0.2 32 | * react-jsx-runtime.production.min.js 33 | * 34 | * Copyright (c) Facebook, Inc. and its affiliates. 35 | * 36 | * This source code is licensed under the MIT license found in the 37 | * LICENSE file in the root directory of this source tree. 38 | */ 39 | 40 | /** @license React v17.0.2 41 | * react.production.min.js 42 | * 43 | * Copyright (c) Facebook, Inc. and its affiliates. 44 | * 45 | * This source code is licensed under the MIT license found in the 46 | * LICENSE file in the root directory of this source tree. 47 | */ 48 | -------------------------------------------------------------------------------- /endpoints/upload_files.js: -------------------------------------------------------------------------------- 1 | import { ensureDirSync } from "fs-extra"; 2 | import { resolve } from "path"; 3 | import { Data } from "../utils/data.js"; 4 | import { addAnImagePath, addAnImageStat, returnAnImageStat } from "../utils/get_image_stat.js"; 5 | 6 | export function uploadFiles(req, res) { 7 | //console.log(req.files); 8 | 9 | if (!req.files || Object.keys(req.files).length === 0) { 10 | return res 11 | .status(200) 12 | .send({ success: false, error: "No files were uploaded." }); 13 | } 14 | 15 | // The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file 16 | let uploadedFile = req.files.file; 17 | let newName = uploadedFile.name; 18 | let subdir = req.body.subdir; 19 | ensureDirSync(resolve(Data.basePath, `${Data.imageDirectoryPath}/${subdir ? subdir + "/" : ""}`)); 20 | // Use the mv() method to place the file somewhere on your server 21 | const shortPath = `${subdir ? subdir + "/" : ""}${newName}`; 22 | const newPath = resolve(Data.basePath, `${Data.imageDirectoryPath}/${shortPath}`); 23 | uploadedFile.mv(newPath, function (err) { 24 | if (err) return res.status(500).send(err); 25 | returnAnImageStat({ path: shortPath }).then((result) => { 26 | addAnImageStat(result); 27 | addAnImagePath(shortPath); 28 | res.send({ 29 | success: true, 30 | message: "File uploaded!", 31 | uid: newName, 32 | stats: result, 33 | }); 34 | }); 35 | }); 36 | } -------------------------------------------------------------------------------- /utils/get_pixel_buffer.js: -------------------------------------------------------------------------------- 1 | import sharp from "sharp"; 2 | import _ from "underscore"; 3 | import { Data } from "./data.js"; 4 | import { returnAnImageStat } from "./get_image_stat.js"; 5 | 6 | export function getImgPixelsBuffer(img, setup, background) { 7 | const size = setup.width; 8 | //const background = setup.background || "#000000"; 9 | var promise = returnAnImageStat({ path: img }) 10 | .then((metadata) => { 11 | return metadata; 12 | }) 13 | .then((metadata) => { 14 | if (metadata.pages > 1) { 15 | const operations = _.map(_.range(0, metadata.pages), (page) => { 16 | return sharp(`${Data.imageDirectoryPath}/${img}`, { page: page }) 17 | .resize(setup.width, setup.height, { 18 | kernel: 19 | setup.width < metadata.width 20 | ? sharp.kernel.lanczos3 21 | : sharp.kernel.nearest, 22 | }) 23 | .ensureAlpha() 24 | // .flatten({ background }) 25 | .raw() 26 | .toBuffer({ resolveWithObject: true }) 27 | .then({ 28 | onfulfilled: (result) => { 29 | return { metadata, result }; 30 | }, 31 | }); 32 | }); 33 | return Promise.all(operations); 34 | } else { 35 | return sharp(`${Data.imageDirectoryPath}/${img}`) 36 | .resize(setup.width, setup.height, { 37 | kernel: 38 | setup.width < metadata.width || setup.height < metadata.height 39 | ? sharp.kernel.lanczos3 40 | : sharp.kernel.nearest, 41 | }) 42 | .ensureAlpha() 43 | // .flatten({ background: background }) 44 | .raw() 45 | .toBuffer({ resolveWithObject: true }) 46 | .then((result) => result); 47 | } 48 | }); 49 | 50 | return promise; 51 | } -------------------------------------------------------------------------------- /public/static/js/runtime-main.1bc30be2.js: -------------------------------------------------------------------------------- 1 | !function(e){function t(t){for(var n,i,a=t[0],c=t[1],l=t[2],s=0,p=[];sPixel Stream Admin
-------------------------------------------------------------------------------- /utils/get_image_stat.js: -------------------------------------------------------------------------------- 1 | import sharp from "sharp"; 2 | import { Data } from "./data.js"; 3 | import fsextra from 'fs-extra'; 4 | import _ from "underscore"; 5 | const { readdirSync, statSync } = fsextra; 6 | 7 | const metadataKeys = ["width", "height", "format", "hasAlpha", "pages", "delay"]; 8 | 9 | let imageDirectoryCache = []; 10 | let imageStatsCache = []; 11 | 12 | export function returnAnImageStat(imgObj) { 13 | let { path } = imgObj; 14 | return sharp(`${Data.imageDirectoryPath}/${path}`) 15 | .metadata() 16 | .catch((err) => console.warn(`${path}: ${err}`)) 17 | .then(function (metadata) { 18 | path = `${Data.staticImageBaseURL}/${path}`; 19 | 20 | return { 21 | id: imgObj.path, 22 | path, 23 | ..._.pick(metadata, metadataKeys), 24 | }; 25 | }) 26 | .catch((err) => console.warn(`${path}: ${err}`)); 27 | } 28 | 29 | export function addAnImageStat(theStat) { 30 | imageStatsCache.push(theStat); 31 | } 32 | export function addAnImagePath(thePath) { 33 | imageDirectoryCache.push(thePath); 34 | } 35 | 36 | 37 | export function getAllImageStats() { 38 | if (!_.isEmpty(imageStatsCache)) return imageStatsCache; 39 | var images = gatherAllImages(Data.imageDirectoryPath); 40 | var output = []; 41 | return Promise.all( 42 | images.map((imgObj) => { 43 | let { path, created } = imgObj; 44 | return sharp(`${Data.imageDirectoryPath}/${path}`) 45 | .metadata() 46 | .catch((err) => console.warn(`${path}: ${err}`)) 47 | .then(function (metadata) { 48 | path = `${Data.staticImageBaseURL}/${path}`; 49 | output.push({ 50 | id: imgObj.path, 51 | path, 52 | created, 53 | ..._.pick(metadata, metadataKeys), 54 | }); 55 | }) 56 | .catch((err) => console.warn(`${path}: ${err}`)); 57 | }) 58 | ).then((results) => { 59 | imageStatsCache = output; 60 | console.log(`imageStatsCache has ${output.length} entries`); 61 | return output; 62 | }); 63 | } 64 | 65 | function gatherAllImages(basePath) { 66 | if (!_.isEmpty(imageDirectoryCache)) { 67 | console.log("returning cached file values"); 68 | return imageDirectoryCache; 69 | } 70 | const recursiveList = (dir, list) => { 71 | const inThisDir = readdirSync(dir); 72 | _.each(inThisDir, (fileOrFolder) => { 73 | const conCatPath = `${dir}/${fileOrFolder}`; 74 | const stat = statSync(conCatPath); 75 | if (stat.isDirectory()) { 76 | list = recursiveList(conCatPath, list); 77 | } else if (fileOrFolder.match(/\.gif|\.jpg|\.png|\.jpeg/g)) { 78 | // console.log({ stat }); 79 | const path = conCatPath.substring(basePath.length + 1); 80 | const created = stat.birthtimeMs; 81 | list.push({ path, created }); 82 | } 83 | }); 84 | return list; 85 | }; 86 | imageDirectoryCache = recursiveList(basePath, []); 87 | return imageDirectoryCache; 88 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pixel Art Server 2 | This is simple server to supply images to [a matching WLED usermod](https://github.com/hughc/wled-pixelart-client) to display on matrices of different sizes. 3 | 4 | ![screen](/screenshots/screen-large.jpg) 5 | ![admin interface](/screenshots/admin.png) 6 | 7 | ## Hardware requirements 8 | The hardware consists of 3 parts: 9 | 10 | - an LED matrix, either off-the-shelf or handmade using LED strips joined together to form a grid (WS2812, WS2815 etc) 11 | - a wifi enabled microcontroller to run WLED (an ESP32 is recommended) 12 | - a server, either on your LAN or accessible over the internet. This does not have to be powerful- a Raspberry Pi Zero W will do. 13 | 14 | Other optional components include a push button wired to the microcontroller to trigger a configuration portal, and a buck transformer to run the microcontroller if the strip runs at 12V (the ESP8266 runs at 5V). 15 | 16 | To generate a clean matrix with square pixels, you need a diffuser screen. [This design](https://www.thingiverse.com/thing:4973163) can be used to 3D print arbitrary sized diffusers. 17 | 18 | ## Server 19 | This is a node.js / express server that responds to requests for images from WLED clients, decoding images (jpg, gif, png) to raw pixel values and sending them to the client as JSON. It includes an admin interface that allows for uploading images and curating playlists of images, including setting background colours for transparent images. It keeps track of each clients' progress through assigned playlists. It understands multi-frame gif images, but the clients' ability to decode multiframe gifs is limited by the memory of the device - an ESP32 is recommended for the extra memory provided. 20 | 21 | Images are stored in the `img` directory under the server. A given image's unique ID is its path relative to the `img` dir. You do not have to use the provided upload mechanism to add images, you can instead just place images in the directory in question an restart the server, to trigger a rescan of the contents. 22 | 23 | Clients make only 2 calls to the server: 24 | - On boot, they attempt a connection to `/checkin`, passing the `id` stored in their firmware. This registers a new client allowing it to be configured in the administration interface. 25 | example: `http://192.168.0.xx/checkin?id=my-grid-id` 26 | 27 | - after this, the client repeatedly calls the `/image` endpoint to request images for display, including its `id` to identify which playlist to load the next image from. It also supplies a width and height, to indicate to the server the data required. 28 | 29 | The timing of these calls (ie the display time per image) is determined by the metadata returned from the server (an attribute of the playlist). 30 | example: `http://192.168.0.xx/image?id=my-grid-id&width=16&height=16` 31 | 32 | ## setup 33 | - install [node.js](https://nodejs.org/) 34 | - install `yarn` with `npm install -g yarn` 35 | - with nodejs installed, run `yarn` from within the server directory to install all dependencies 36 | - from within the same dir run `node ./server.js` to start the server. Use the `--port xxxx` switch to choose a port to run it on. The admin interface should be available at this url. 37 | - if you wish to run the server at system startup, I recommend installing [pm2](https://github.com/Unitech/pm2), the node process manager. You can then add the server process to pm2 with the command `pm2 start server.js -- --port xxxx"` and `pm2 save` to save the config. YOu then just need pm2 to [run on startup](https://pm2.keymetrics.io/docs/usage/startup/) 38 | 39 | -------------------------------------------------------------------------------- /public/static/js/3.24ef5471.chunk.js: -------------------------------------------------------------------------------- 1 | (this.webpackJsonpclient=this.webpackJsonpclient||[]).push([[3],{246:function(t,e,n){"use strict";n.r(e),n.d(e,"getCLS",(function(){return d})),n.d(e,"getFCP",(function(){return S})),n.d(e,"getFID",(function(){return F})),n.d(e,"getLCP",(function(){return k})),n.d(e,"getTTFB",(function(){return C}));var i,a,r,o,u=function(t,e){return{name:t,value:void 0===e?-1:e,delta:0,entries:[],id:"v1-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(t,e){try{if(PerformanceObserver.supportedEntryTypes.includes(t)){if("first-input"===t&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(t){return t.getEntries().map(e)}));return n.observe({type:t,buffered:!0}),n}}catch(t){}},f=function(t,e){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(t(i),e&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(t){addEventListener("pageshow",(function(e){e.persisted&&t(e)}),!0)},m="function"==typeof WeakSet?new WeakSet:new Set,p=function(t,e,n){var i;return function(){e.value>=0&&(n||m.has(e)||"hidden"===document.visibilityState)&&(e.delta=e.value-(i||0),(e.delta||void 0===i)&&(i=e.value,t(e)))}},d=function(t,e){var n,i=u("CLS",0),a=function(t){t.hadRecentInput||(i.value+=t.value,i.entries.push(t),n())},r=c("layout-shift",a);r&&(n=p(t,i,e),f((function(){r.takeRecords().map(a),n()})),s((function(){i=u("CLS",0),n=p(t,i,e)})))},v=-1,l=function(){return"hidden"===document.visibilityState?0:1/0},h=function(){f((function(t){var e=t.timeStamp;v=e}),!0)},g=function(){return v<0&&(v=l(),h(),s((function(){setTimeout((function(){v=l(),h()}),0)}))),{get timeStamp(){return v}}},S=function(t,e){var n,i=g(),a=u("FCP"),r=function(t){"first-contentful-paint"===t.name&&(f&&f.disconnect(),t.startTime=0&&a1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,e){var n=function(){w(t,e),a()},i=function(){a()},a=function(){removeEventListener("pointerup",n,y),removeEventListener("pointercancel",i,y)};addEventListener("pointerup",n,y),addEventListener("pointercancel",i,y)}(e,t):w(e,t)}},b=function(t){["mousedown","keydown","touchstart","pointerdown"].forEach((function(e){return t(e,T,y)}))},F=function(t,e){var n,r=g(),d=u("FID"),v=function(t){t.startTime=0&&(n||m.has(e)||"hidden"===document.visibilityState)&&(e.delta=e.value-(i||0),(e.delta||void 0===i)&&(i=e.value,t(e)))}},d=function(t,e){var n,i=u("CLS",0),a=function(t){t.hadRecentInput||(i.value+=t.value,i.entries.push(t),n())},r=c("layout-shift",a);r&&(n=p(t,i,e),f((function(){r.takeRecords().map(a),n()})),s((function(){i=u("CLS",0),n=p(t,i,e)})))},v=-1,l=function(){return"hidden"===document.visibilityState?0:1/0},h=function(){f((function(t){var e=t.timeStamp;v=e}),!0)},g=function(){return v<0&&(v=l(),h(),s((function(){setTimeout((function(){v=l(),h()}),0)}))),{get timeStamp(){return v}}},S=function(t,e){var n,i=g(),a=u("FCP"),r=function(t){"first-contentful-paint"===t.name&&(f&&f.disconnect(),t.startTime=0&&a1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,e){var n=function(){w(t,e),a()},i=function(){a()},a=function(){removeEventListener("pointerup",n,y),removeEventListener("pointercancel",i,y)};addEventListener("pointerup",n,y),addEventListener("pointercancel",i,y)}(e,t):w(e,t)}},b=function(t){["mousedown","keydown","touchstart","pointerdown"].forEach((function(e){return t(e,T,y)}))},F=function(t,e){var n,r=g(),d=u("FID"),v=function(t){t.startTime", 29 | description: "server port - defaults to 80", 30 | }, 31 | { 32 | name: "env", 33 | alias: "e", 34 | type: String, 35 | description: "environment - dev starts server on dev port (3001)", 36 | }, 37 | { name: "help", type: Boolean }, 38 | ]; 39 | 40 | const sections = [ 41 | { 42 | header: "Pixel art server", 43 | content: "serves rgb values to multiple LED matrices.", 44 | }, 45 | { 46 | header: "Options", 47 | optionList: optionDefinitions, 48 | }, 49 | ]; 50 | 51 | const usage = commandLineUsage(sections); 52 | const options = commandLineArgs(optionDefinitions); 53 | 54 | //if (options.help) return console.log(usage); 55 | const port = options["port"] ? options.port : options.env == "dev" ? 3001 : 80; 56 | 57 | // init the data sources (clients, playlists) 58 | new Data(import.meta.url); 59 | 60 | console.log({plpath: Data.playlistFilePath, clientsFilePath: Data.clientsFilePath}) 61 | 62 | var app = express(); 63 | app.use(cors()); 64 | app.use("/", express.static("public")); 65 | //var bodyParser = require("body-parser"); 66 | 67 | app.use(Data.staticImageBaseURL, express.static(Data.imageDirectoryPath)); 68 | // default options 69 | app.use(fileUpload()); 70 | // Parse URL-encoded bodies (as sent by HTML forms) 71 | app.use(urlencoded({ extended: true })); 72 | app.use(json({ type: "application/json)" })); 73 | //app.use(bodyParser.json()); 74 | // Parse JSON bodies (as sent by API clients) 75 | app.use(json()); 76 | 77 | 78 | // prime image cache - this returns a Promise 79 | getAllImageStats(); 80 | 81 | app.post("/upload", uploadFiles); 82 | 83 | app.get("/clients", getClients) 84 | 85 | app.get("/imagesets", (req, res) => { 86 | res.send(Data.playlists); 87 | }); 88 | 89 | // sent by client on boot 90 | app.get("/api/client/checkin", (req, res) => { 91 | const {width, height, pixelCount: pixels, id} = req.query; 92 | const params = { id, pixels, width, height}; 93 | console.warn(`client '${id}' checked in OK`); 94 | // only save if new 95 | saveClient(params, false); 96 | res.send("ok"); 97 | }); 98 | 99 | app.post("/clients", function (req, res) { 100 | var clientData = _.pick( 101 | req.body, 102 | "id", 103 | "name", 104 | "pixelsCount", 105 | "width", 106 | "height", 107 | "imagesetId" 108 | ); 109 | if (!clientData.id) { 110 | res.send({ success: false, error: "no client id supplied" }); 111 | return; 112 | } 113 | saveClient(clientData, true); 114 | res.send({ success: true }); 115 | }); 116 | 117 | app.post("/imageset", replaceImageSet); 118 | 119 | app.post("/imagesets", function (req, res) { 120 | saveAllPlaylists(req.body); 121 | res.send({ success: true }); 122 | }); 123 | 124 | app.delete("/imageset", deletePlaylist); 125 | 126 | app.get("/api/image/pixels", getImage); 127 | 128 | app.get("/images", (req, res) => { 129 | res.send(getAllImageStats()); 130 | }); 131 | 132 | app.listen(port, () => 133 | console.log(`server app listening at http://localhost:${port}`) 134 | ); 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /endpoints/get_image.js: -------------------------------------------------------------------------------- 1 | import _ from 'underscore'; 2 | import { Data } from '../utils/data.js'; 3 | import { getAllImageStats } from '../utils/get_image_stat.js'; 4 | import { getImgPixelsBuffer } from '../utils/get_pixel_buffer.js'; 5 | 6 | export function getImage (req, res) { 7 | let { screen_id:id, width = 8, height = 8 } = req.query; 8 | width = parseInt(width); 9 | height = parseInt(height); 10 | 11 | let setup = _.findWhere(Data.clients, { id }); 12 | if (!setup) { 13 | console.warn(`client '${id}' not found`); 14 | // res.send(JSON.stringify({warning: id ? 'client not found' : 'need client param'})); 15 | // return; 16 | setup = {}; 17 | } 18 | 19 | setup.width = parseInt(width); 20 | setup.height = parseInt(height); 21 | if (!setup.imagesetId) { 22 | } 23 | let imageset = _.findWhere(Data.playlists, { id: parseInt(setup.imagesetId) }); 24 | if (!imageset) { 25 | console.warn(`imageset not found for id '${setup.imagesetId}'`); 26 | imageset = Data.playlists[0] || {}; 27 | } 28 | let { images, index, duration, brightness, backgroundColor } = imageset; 29 | var imageCount = images?.length; 30 | if (_.isUndefined(index)) 31 | index = 0; 32 | if (index >= imageCount) 33 | index = 0; 34 | const imageStats = getAllImageStats(); 35 | var path = images?.[index] || imageStats?.[_.random(imageStats.length - 1)].id; 36 | if (!path) { 37 | res.send(JSON.stringify({ warning: 'no playlist and no backup image' })); 38 | return; 39 | } 40 | 41 | imageset.index = index + 1; 42 | console.log({ path }); 43 | 44 | backgroundColor = backgroundColor || "#000000"; 45 | const pixelBufferOp = getImgPixelsBuffer(path, setup, backgroundColor); 46 | const metadata = _.findWhere(imageStats, { id: path }); 47 | let frames, info; 48 | console.log({ delay: metadata.delay }); 49 | return pixelBufferOp.then((result) => { 50 | if (metadata?.pages > 1) { 51 | frames = _.pluck(result, "data"); 52 | info = _.pluck(result, "info"); 53 | } else { 54 | frames = [result.data]; 55 | info = [{}]; 56 | } 57 | console.log({ frames: frames.length }); 58 | const rows = _.reduce(frames, (memo, frameData, frameIndex) => { 59 | // default to 15 FPS 60 | const duration = metadata?.delay?.[frameIndex] || Math.round(1000 / 15); 61 | console.log({ duration }); 62 | var rgb = _.compact( 63 | // frameData is a linear arry of r,g,b values, starting at top left 64 | _.map(frameData, (dp, index) => { 65 | if (index % 4) 66 | return; 67 | let r = parseInt(dp).toString(16); 68 | r = r.length == 2 ? r : '0' + r; 69 | let g = parseInt(frameData[index + 1]).toString(16); 70 | g = g.length == 2 ? g : '0' + g; 71 | let b = parseInt(frameData[index + 2]).toString(16); 72 | b = b.length == 2 ? b : '0' + b; 73 | let a = parseInt(frameData[index + 3]).toString(16); 74 | a = a.length == 2 ? a : '0' + a; 75 | return r + g + b + a; 76 | }) 77 | ); 78 | // console.log(rgb); 79 | let linearCount = 0; 80 | for (let rowIndex = 0; rowIndex < setup.height; rowIndex++) { 81 | const pixels = []; 82 | for (let col = 0; col < setup.width; col++) { 83 | pixels.push(rgb[linearCount]); 84 | linearCount++; 85 | } 86 | const row = {frame: frameIndex, duration, row: rowIndex, pixels} 87 | memo.push(row) 88 | } 89 | return memo //{ rows, duration, frame: frameIndex }; 90 | }, []); 91 | console.log(`>> server returns ${path} with ${rows.length} rows over ${frames.length} frames`); 92 | // add extra metadata 93 | duration = duration || 10; 94 | brightness = brightness || 25; 95 | const output = {meta: { path, duration, brightness, backgroundColor: backgroundColor.substring(1), frames: frames.length, width, height}, rows }; 96 | res.removeHeader('transfer-encoding'); 97 | res.contentType("application/json"); 98 | res.send(JSON.stringify(output)); 99 | }); 100 | }; 101 | -------------------------------------------------------------------------------- /public/static/js/3.24ef5471.chunk.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../node_modules/web-vitals/dist/web-vitals.js"],"names":["e","t","n","i","a","name","value","delta","entries","id","concat","Date","now","Math","floor","random","r","PerformanceObserver","supportedEntryTypes","includes","self","getEntries","map","observe","type","buffered","o","document","visibilityState","removeEventListener","addEventListener","c","persisted","u","WeakSet","Set","f","has","s","hadRecentInput","push","takeRecords","m","p","v","timeStamp","d","setTimeout","l","disconnect","startTime","add","performance","getEntriesByName","requestAnimationFrame","h","passive","capture","S","y","w","g","entryType","target","cancelable","processingStart","forEach","E","L","T","once","b","getEntriesByType","timing","max","navigationStart","responseStart","readyState"],"mappings":"kGAAA,+MAAIA,EAAEC,EAAEC,EAAEC,EAAEC,EAAE,SAASJ,EAAEC,GAAG,MAAM,CAACI,KAAKL,EAAEM,WAAM,IAASL,GAAG,EAAEA,EAAEM,MAAM,EAAEC,QAAQ,GAAGC,GAAG,MAAMC,OAAOC,KAAKC,MAAM,KAAKF,OAAOG,KAAKC,MAAM,cAAcD,KAAKE,UAAU,QAAQC,EAAE,SAAShB,EAAEC,GAAG,IAAI,GAAGgB,oBAAoBC,oBAAoBC,SAASnB,GAAG,CAAC,GAAG,gBAAgBA,KAAK,2BAA2BoB,MAAM,OAAO,IAAIlB,EAAE,IAAIe,qBAAqB,SAASjB,GAAG,OAAOA,EAAEqB,aAAaC,IAAIrB,MAAM,OAAOC,EAAEqB,QAAQ,CAACC,KAAKxB,EAAEyB,UAAS,IAAKvB,GAAG,MAAMF,MAAM0B,EAAE,SAAS1B,EAAEC,GAAG,IAAIC,EAAE,SAASA,EAAEC,GAAG,aAAaA,EAAEqB,MAAM,WAAWG,SAASC,kBAAkB5B,EAAEG,GAAGF,IAAI4B,oBAAoB,mBAAmB3B,GAAE,GAAI2B,oBAAoB,WAAW3B,GAAE,MAAO4B,iBAAiB,mBAAmB5B,GAAE,GAAI4B,iBAAiB,WAAW5B,GAAE,IAAK6B,EAAE,SAAS/B,GAAG8B,iBAAiB,YAAY,SAAS7B,GAAGA,EAAE+B,WAAWhC,EAAEC,MAAK,IAAKgC,EAAE,mBAAmBC,QAAQ,IAAIA,QAAQ,IAAIC,IAAIC,EAAE,SAASpC,EAAEC,EAAEC,GAAG,IAAIC,EAAE,OAAO,WAAWF,EAAEK,OAAO,IAAIJ,GAAG+B,EAAEI,IAAIpC,IAAI,WAAW0B,SAASC,mBAAmB3B,EAAEM,MAAMN,EAAEK,OAAOH,GAAG,IAAIF,EAAEM,YAAO,IAASJ,KAAKA,EAAEF,EAAEK,MAAMN,EAAEC,OAAOqC,EAAE,SAAStC,EAAEC,GAAG,IAAIC,EAAEC,EAAEC,EAAE,MAAM,GAAG6B,EAAE,SAASjC,GAAGA,EAAEuC,iBAAiBpC,EAAEG,OAAON,EAAEM,MAAMH,EAAEK,QAAQgC,KAAKxC,GAAGE,MAAMoC,EAAEtB,EAAE,eAAeiB,GAAGK,IAAIpC,EAAEkC,EAAEpC,EAAEG,EAAEF,GAAGyB,GAAG,WAAWY,EAAEG,cAAcnB,IAAIW,GAAG/B,OAAO6B,GAAG,WAAW5B,EAAEC,EAAE,MAAM,GAAGF,EAAEkC,EAAEpC,EAAEG,EAAEF,QAAQyC,GAAG,EAAEC,EAAE,WAAW,MAAM,WAAWhB,SAASC,gBAAgB,EAAE,KAAKgB,EAAE,WAAWlB,GAAG,SAAS1B,GAAG,IAAIC,EAAED,EAAE6C,UAAUH,EAAEzC,KAAI,IAAK6C,EAAE,WAAW,OAAOJ,EAAE,IAAIA,EAAEC,IAAIC,IAAIb,GAAG,WAAWgB,YAAY,WAAWL,EAAEC,IAAIC,MAAM,OAAO,CAAC,gBAAgB,OAAOF,KAAKM,EAAE,SAAShD,EAAEC,GAAG,IAAIC,EAAEC,EAAE2C,IAAIpB,EAAEtB,EAAE,OAAOkC,EAAE,SAAStC,GAAG,2BAA2BA,EAAEK,OAAOsC,GAAGA,EAAEM,aAAajD,EAAEkD,UAAU/C,EAAE0C,YAAYnB,EAAEpB,MAAMN,EAAEkD,UAAUxB,EAAElB,QAAQgC,KAAKxC,GAAGiC,EAAEkB,IAAIzB,GAAGxB,OAAOwC,EAAEU,YAAYC,iBAAiB,0BAA0B,GAAGV,EAAED,EAAE,KAAK1B,EAAE,QAAQsB,IAAII,GAAGC,KAAKzC,EAAEkC,EAAEpC,EAAE0B,EAAEzB,GAAGyC,GAAGJ,EAAEI,GAAGX,GAAG,SAAS5B,GAAGuB,EAAEtB,EAAE,OAAOF,EAAEkC,EAAEpC,EAAE0B,EAAEzB,GAAGqD,uBAAuB,WAAWA,uBAAuB,WAAW5B,EAAEpB,MAAM8C,YAAYxC,MAAMT,EAAE0C,UAAUZ,EAAEkB,IAAIzB,GAAGxB,eAAeqD,EAAE,CAACC,SAAQ,EAAGC,SAAQ,GAAIC,EAAE,IAAI/C,KAAKgD,EAAE,SAASxD,EAAEC,GAAGJ,IAAIA,EAAEI,EAAEH,EAAEE,EAAED,EAAE,IAAIS,KAAKiD,EAAE/B,qBAAqBgC,MAAMA,EAAE,WAAW,GAAG5D,GAAG,GAAGA,EAAEC,EAAEwD,EAAE,CAAC,IAAItD,EAAE,CAAC0D,UAAU,cAAczD,KAAKL,EAAEwB,KAAKuC,OAAO/D,EAAE+D,OAAOC,WAAWhE,EAAEgE,WAAWd,UAAUlD,EAAE6C,UAAUoB,gBAAgBjE,EAAE6C,UAAU5C,GAAGE,EAAE+D,SAAS,SAASlE,GAAGA,EAAEI,MAAMD,EAAE,KAAKgE,EAAE,SAASnE,GAAG,GAAGA,EAAEgE,WAAW,CAAC,IAAI/D,GAAGD,EAAE6C,UAAU,KAAK,IAAIlC,KAAKyC,YAAYxC,OAAOZ,EAAE6C,UAAU,eAAe7C,EAAEwB,KAAK,SAASxB,EAAEC,GAAG,IAAIC,EAAE,WAAWyD,EAAE3D,EAAEC,GAAGG,KAAKD,EAAE,WAAWC,KAAKA,EAAE,WAAWyB,oBAAoB,YAAY3B,EAAEqD,GAAG1B,oBAAoB,gBAAgB1B,EAAEoD,IAAIzB,iBAAiB,YAAY5B,EAAEqD,GAAGzB,iBAAiB,gBAAgB3B,EAAEoD,GAA9N,CAAkOtD,EAAED,GAAG2D,EAAE1D,EAAED,KAAK4D,EAAE,SAAS5D,GAAG,CAAC,YAAY,UAAU,aAAa,eAAekE,SAAS,SAASjE,GAAG,OAAOD,EAAEC,EAAEkE,EAAEZ,OAAOa,EAAE,SAASlE,EAAEoC,GAAG,IAAII,EAAEC,EAAEG,IAAIF,EAAExC,EAAE,OAAO4C,EAAE,SAAShD,GAAGA,EAAEkD,UAAUP,EAAEE,YAAYD,EAAEtC,MAAMN,EAAEiE,gBAAgBjE,EAAEkD,UAAUN,EAAEpC,QAAQgC,KAAKxC,GAAGiC,EAAEkB,IAAIP,GAAGF,MAAMa,EAAEvC,EAAE,cAAcgC,GAAGN,EAAEN,EAAElC,EAAE0C,EAAEN,GAAGiB,GAAG7B,GAAG,WAAW6B,EAAEd,cAAcnB,IAAI0B,GAAGO,EAAEN,gBAAe,GAAIM,GAAGxB,GAAG,WAAW,IAAIf,EAAE4B,EAAExC,EAAE,OAAOsC,EAAEN,EAAElC,EAAE0C,EAAEN,GAAGnC,EAAE,GAAGF,GAAG,EAAED,EAAE,KAAK4D,EAAE9B,kBAAkBd,EAAEgC,EAAE7C,EAAEqC,KAAKxB,GAAG6C,QAAQQ,EAAE,SAASrE,EAAEC,GAAG,IAAIC,EAAEC,EAAE2C,IAAIR,EAAElC,EAAE,OAAOsC,EAAE,SAAS1C,GAAG,IAAIC,EAAED,EAAEkD,UAAUjD,EAAEE,EAAE0C,YAAYP,EAAEhC,MAAML,EAAEqC,EAAE9B,QAAQgC,KAAKxC,IAAIE,KAAKyC,EAAE3B,EAAE,2BAA2B0B,GAAG,GAAGC,EAAE,CAACzC,EAAEkC,EAAEpC,EAAEsC,EAAErC,GAAG,IAAI2C,EAAE,WAAWX,EAAEI,IAAIC,KAAKK,EAAEF,cAAcnB,IAAIoB,GAAGC,EAAEM,aAAahB,EAAEkB,IAAIb,GAAGpC,MAAM,CAAC,UAAU,SAASgE,SAAS,SAASlE,GAAG8B,iBAAiB9B,EAAE4C,EAAE,CAAC0B,MAAK,EAAGb,SAAQ,OAAQ/B,EAAEkB,GAAE,GAAIb,GAAG,SAAS5B,GAAGmC,EAAElC,EAAE,OAAOF,EAAEkC,EAAEpC,EAAEsC,EAAErC,GAAGqD,uBAAuB,WAAWA,uBAAuB,WAAWhB,EAAEhC,MAAM8C,YAAYxC,MAAMT,EAAE0C,UAAUZ,EAAEkB,IAAIb,GAAGpC,eAAeqE,EAAE,SAASvE,GAAG,IAAIC,EAAEC,EAAEE,EAAE,QAAQH,EAAE,WAAW,IAAI,IAAIA,EAAEmD,YAAYoB,iBAAiB,cAAc,IAAI,WAAW,IAAIxE,EAAEoD,YAAYqB,OAAOxE,EAAE,CAAC6D,UAAU,aAAaZ,UAAU,GAAG,IAAI,IAAIhD,KAAKF,EAAE,oBAAoBE,GAAG,WAAWA,IAAID,EAAEC,GAAGW,KAAK6D,IAAI1E,EAAEE,GAAGF,EAAE2E,gBAAgB,IAAI,OAAO1E,EAAhL,GAAqL,GAAGC,EAAEI,MAAMJ,EAAEK,MAAMN,EAAE2E,cAAc1E,EAAEI,MAAM,EAAE,OAAOJ,EAAEM,QAAQ,CAACP,GAAGD,EAAEE,GAAG,MAAMF,MAAM,aAAa2B,SAASkD,WAAW9B,WAAW9C,EAAE,GAAG6B,iBAAiB,WAAW7B","file":"static/js/3.24ef5471.chunk.js","sourcesContent":["var e,t,n,i,a=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:\"v1-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12)}},r=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if(\"first-input\"===e&&!(\"PerformanceEventTiming\"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},o=function(e,t){var n=function n(i){\"pagehide\"!==i.type&&\"hidden\"!==document.visibilityState||(e(i),t&&(removeEventListener(\"visibilitychange\",n,!0),removeEventListener(\"pagehide\",n,!0)))};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},c=function(e){addEventListener(\"pageshow\",(function(t){t.persisted&&e(t)}),!0)},u=\"function\"==typeof WeakSet?new WeakSet:new Set,f=function(e,t,n){var i;return function(){t.value>=0&&(n||u.has(t)||\"hidden\"===document.visibilityState)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},s=function(e,t){var n,i=a(\"CLS\",0),u=function(e){e.hadRecentInput||(i.value+=e.value,i.entries.push(e),n())},s=r(\"layout-shift\",u);s&&(n=f(e,i,t),o((function(){s.takeRecords().map(u),n()})),c((function(){i=a(\"CLS\",0),n=f(e,i,t)})))},m=-1,p=function(){return\"hidden\"===document.visibilityState?0:1/0},v=function(){o((function(e){var t=e.timeStamp;m=t}),!0)},d=function(){return m<0&&(m=p(),v(),c((function(){setTimeout((function(){m=p(),v()}),0)}))),{get timeStamp(){return m}}},l=function(e,t){var n,i=d(),o=a(\"FCP\"),s=function(e){\"first-contentful-paint\"===e.name&&(p&&p.disconnect(),e.startTime=0&&t1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){y(e,t),a()},i=function(){a()},a=function(){removeEventListener(\"pointerup\",n,h),removeEventListener(\"pointercancel\",i,h)};addEventListener(\"pointerup\",n,h),addEventListener(\"pointercancel\",i,h)}(t,e):y(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,E,h)}))},L=function(n,s){var m,p=d(),v=a(\"FID\"),l=function(e){e.startTime=0&&(n||u.has(t)||\"hidden\"===document.visibilityState)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},s=function(e,t){var n,i=a(\"CLS\",0),u=function(e){e.hadRecentInput||(i.value+=e.value,i.entries.push(e),n())},s=r(\"layout-shift\",u);s&&(n=f(e,i,t),o((function(){s.takeRecords().map(u),n()})),c((function(){i=a(\"CLS\",0),n=f(e,i,t)})))},m=-1,p=function(){return\"hidden\"===document.visibilityState?0:1/0},v=function(){o((function(e){var t=e.timeStamp;m=t}),!0)},d=function(){return m<0&&(m=p(),v(),c((function(){setTimeout((function(){m=p(),v()}),0)}))),{get timeStamp(){return m}}},l=function(e,t){var n,i=d(),o=a(\"FCP\"),s=function(e){\"first-contentful-paint\"===e.name&&(p&&p.disconnect(),e.startTime=0&&t1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){y(e,t),a()},i=function(){a()},a=function(){removeEventListener(\"pointerup\",n,h),removeEventListener(\"pointercancel\",i,h)};addEventListener(\"pointerup\",n,h),addEventListener(\"pointercancel\",i,h)}(t,e):y(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,E,h)}))},L=function(n,s){var m,p=d(),v=a(\"FID\"),l=function(e){e.startTime2&&(a=v.a.filter(a,(function(e){return e.id.toLowerCase().indexOf(d.toLowerCase())>-1}))),""!==f&&(a=v.a.filter(a,(function(e){return e.id.indexOf(f)>-1})))),v.a.map(a,(function(t){return Object(w.jsx)(te,{id:t.id,alt:t.id.replace(/.png|.gif|.jpg/g,""),children:Object(w.jsx)("div",{style:{backgroundColor:e.backgroundColor},children:Object(w.jsx)("img",{className:"c-draggable-image",alt:t.id.replace(/.png|.gif|.jpg/g,""),src:"".concat("").concat(t.path)})})},t.id)}))},y=v.a.compact(v.a.uniq(v.a.map(c,(function(e){return 1!==e.id.split("/").length&&e.id.split("/")[0]}))));return Object(w.jsxs)(ae.a,{defaultActiveKey:"add-remove",id:"uncontrolled-tab-example",children:[Object(w.jsx)(ne.a,{eventKey:"add-remove",title:"Add / Remove",children:Object(w.jsxs)(ee.a,{onDragEnd:function(t){var c,a=!1;if(t.over&&"selectedImages"===t.over.id){var n=t.active.id;if(v.a.contains(i,n))return;(c=i.slice()).push(n),a=!0}if(t.over&&"allImages"===t.over.id){console.log({event:t});var r=t.active.id;if(!v.a.contains(i,r))return;(c=v.a.clone(i)).splice(i.indexOf(r),1),a=!0}a&&e.changeCallback(c)},children:[Object(w.jsxs)("div",{className:"c-draggable-list",children:[Object(w.jsx)("div",{className:"c-draggable-list-header",children:Object(w.jsx)("div",{className:"c-draggable-list-label",children:"Selected Images"})}),Object(w.jsx)(ce,{dropId:"selectedImages",className:"drop-zone",children:Object(w.jsx)("div",{className:"c-draggable-list-items",children:p("selected")})})]}),Object(w.jsxs)("div",{className:"c-draggable-list",children:[Object(w.jsxs)("div",{className:"c-draggable-list-header",children:[Object(w.jsx)(b.a,{children:Object(w.jsx)("div",{className:"c-draggable-list-label col-sm-12",children:"All Images"})}),Object(w.jsxs)(b.a,{children:[Object(w.jsxs)("div",{className:"c-draggable-list-filter col-sm-12 col-md-6",children:["Subdir:"," ",Object(w.jsxs)("select",{className:"u-flex--1",onChange:function(e){x(e.target.value)},value:f,children:[Object(w.jsx)("option",{value:"",children:"-- all --"}),v.a.map(y,(function(e){return Object(w.jsx)("option",{value:e,children:e})}))]}),Object(w.jsx)("div",{className:"c-draggable-list-filter-clear",onClick:function(e){x("")},children:"X"})]}),Object(w.jsxs)("div",{className:"c-draggable-list-filter col-sm-12 col-md-6",children:["Filter:"," ",Object(w.jsx)("input",{type:"text",onChange:function(e){j(e.target.value)},value:d,className:"u-flex--1"}),Object(w.jsx)("div",{className:"c-draggable-list-filter-clear",onClick:function(e){j("")},children:"X"})]})]})]}),Object(w.jsx)(ce,{dropId:"allImages",className:"drop-zone",children:Object(w.jsx)("div",{className:"c-draggable-list-items",children:p("unselected")})})]})]})}),Object(w.jsx)(ne.a,{eventKey:"reorder",title:"Re-Order",children:Object(w.jsx)("p",{children:"This feature not implemented yet"})})]})}var ie=c(259);function se(e){return Object(w.jsxs)(ie.a,Object(G.a)(Object(G.a)({},e),{},{size:"lg","aria-labelledby":"contained-modal-title-vcenter",centered:!0,children:[Object(w.jsx)(ie.a.Header,{closeButton:!0,children:Object(w.jsx)(ie.a.Title,{id:"contained-modal-title-vcenter",children:"Confirmation"})}),Object(w.jsx)(ie.a.Body,{children:Object(w.jsxs)("p",{children:["Are you sure you want to delete",Object(w.jsx)("br",{}),"the imageset `",e.title,"`?"]})}),Object(w.jsxs)(ie.a.Footer,{children:[Object(w.jsx)(R.a,{onClick:e.onAccept,children:"Yes"}),Object(w.jsx)(R.a,{onClick:e.onDecline,children:"Cancel"})]})]}))}var le=c(131);function oe(e){var t=Object(m.d)(M),c=Object(O.a)(t,2),n=c[0],r=c[1],i=Object(m.d)(Y),s=Object(O.a)(i,2),l=s[0],o=s[1],d=Object(a.useState)(!1),j=Object(O.a)(d,2),u=j[0],b=j[1],f=Object(m.d)(z),p=Object(O.a)(f,2),y=p[0],k=p[1],N=Object(m.g)(_),C=function(e){var t="checkbox"===e.target.type?e.target.checked:e.target.value;t="number"===e.target.type?parseInt(t):t;var c=v.a.defaults(Object(F.a)({},e.target.name,t),Object(G.a)({},n));console.log({newLocalState:c}),r(c)},I=function(e){var t,c=l.slice(),a=v.a.findWhere(c,{id:n.id});if(a){var r=c.indexOf(a);c.splice(r,1);var i=(t=n.id,Object(g.a)(x.a.mark((function e(){var c,a;return x.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return c=new Request(U,{method:"delete",body:JSON.stringify({uid:t}),headers:{"Content-Type":"application/json"}}),e.next=3,fetch(c);case 3:return(a=e.sent).success&&console.log("image deleted OK"),e.abrupt("return",a);case 6:case"end":return e.stop()}}),e)})))),s=null;i().then((function(e){return s=e.json()})).then((function(e){s=e,console.log({finalresult:s}),s.success&&(N(0),o(c))}))}},S=v.a.isEmpty(n)?Object(w.jsx)("div",{children:"Choose a playlist from the list to configure it."}):Object(w.jsxs)("div",{children:[Object(w.jsxs)(B.a,{onSubmit:function(e){e.preventDefault();var t=l.slice(),c=v.a.findWhere(t,{id:n.id});if(c){var a=t.indexOf(c);t.splice(a,1,n)}else t.push(n);var r,i=(r=t,Object(g.a)(x.a.mark((function e(){var t,c;return x.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=new Request(J,{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}}),console.log({request:t}),e.next=4,fetch(t);case 4:return(c=e.sent).success&&console.log({promise:c}),e.abrupt("return",c);case 7:case"end":return e.stop()}}),e)})))),s=null;i().then((function(e){return s=e.json()})).then((function(e){s=e,console.log({finalresult:s}),s.success&&o(t)}));var d=v.a.map(y,(function(e){return v.a.clone(e)})),j=v.a.findWhere(d,{id:n.targetClientId});j&&(j.imagesetId=n.id,Z(j)(z).then((function(e){return s=e.json()})).then((function(e){s=e,console.log({finalresult:s}),k(d)})))},children:[Object(w.jsxs)(B.a.Row,{children:[Object(w.jsx)(h.a,{lg:2,md:6,children:Object(w.jsxs)(B.a.Group,{controlId:"imagesetId",children:[Object(w.jsx)(B.a.Label,{children:"playlist ID"}),Object(w.jsx)(B.a.Control,{name:"id",onChange:C,type:"text",value:n.id,disabled:!0}),Object(w.jsx)(B.a.Text,{className:"text-muted",children:"squential counter, locked."})]})}),Object(w.jsx)(h.a,{lg:5,md:6,children:Object(w.jsxs)(B.a.Group,{controlId:"name",children:[Object(w.jsx)(B.a.Label,{children:"Name"}),Object(w.jsx)(B.a.Control,{name:"name",onChange:C,value:n.name})]})}),Object(w.jsx)(h.a,{lg:2,md:6,children:Object(w.jsxs)(B.a.Group,{controlId:"duration",children:[Object(w.jsx)(B.a.Label,{children:"Image duration"}),Object(w.jsx)(B.a.Control,{name:"duration",onChange:C,type:"number",value:n.duration}),Object(w.jsx)(B.a.Text,{className:"text-muted",children:"Time each image displays for (seconds)."})]})})]}),Object(w.jsxs)(B.a.Row,{children:[Object(w.jsx)(h.a,{children:Object(w.jsxs)(B.a.Group,{className:"sm-3",children:[Object(w.jsx)(B.a.Label,{children:"Assign this playlist to a client:"}),Object(w.jsx)("br",{}),Object(w.jsxs)("select",{className:"u-flex--1",onChange:C,name:"targetClientId",value:n.targetClientId,children:[Object(w.jsx)("option",{value:"",children:"-- none --"}),v.a.map(y,(function(e){return Object(w.jsx)("option",{value:e.id,children:e.name})}))]})]})}),Object(w.jsx)(h.a,{children:Object(w.jsxs)(B.a.Group,{className:"sm-3",controlId:"colorPicker",children:[Object(w.jsx)(B.a.Label,{children:"Background colour"}),Object(w.jsx)(le.a,{alpha:!1,color:n.backgroundColor||"#000000",onChange:function(e){C({target:{type:"color",name:"backgroundColor",value:e.hex}})}})]})})]}),Object(w.jsxs)(B.a.Row,{children:[Object(w.jsx)(h.a,{md:6,lg:3,children:Object(w.jsx)(B.a.Group,{className:"sm-3",controlId:"save",children:Object(w.jsx)(R.a,{variant:"primary",type:"submit",children:"Save playlist"})})}),Object(w.jsx)(h.a,{md:6,lg:3,children:Object(w.jsx)(B.a.Group,{children:Object(w.jsx)(R.a,{variant:"warning",onClick:function(e){e.preventDefault(),b(!0)},children:"Delete playlist"})})})]}),Object(w.jsx)(re,{selectedImageIds:n.images,changeCallback:function(e){r(Object(G.a)(Object(G.a)({},n),{},{images:e}))},backgroundColor:n.backgroundColor||"#000000"})]}),Object(w.jsx)(se,{show:u,onAccept:function(e){b(!1),I()},onDecline:function(){return b(!1)},title:n.name})," "]});return Object(w.jsx)("div",{children:S})}function de(e){var t=Object(m.e)(Y),c=Object(m.g)(_),a=Object(m.g)(K),n=function(e){e.preventDefault(),a({}),c((function(t){return parseInt(e.target.dataset.target)}))};return Object(w.jsxs)("div",{className:"c-clients",children:[Object(w.jsx)("h4",{children:"Playlists:"}),Object(w.jsx)("div",{children:v.a.isEmpty(t)?"no playlists found":t.map((function(e){return Object(w.jsx)("div",{className:"c-clients__single",children:Object(w.jsx)("a",{href:"clients-{item-id}","data-target":e.id,onClick:n,children:e.name})},e.id)}))}),Object(w.jsx)(R.a,{className:"u-margin--top-20",onClick:function(e){var n=v.a.max(v.a.pluck(t,"id"));console.log(t),a({}),c((function(e){return n>0?n+1:1}))},variant:"light",type:"submit",children:"New Playlist"})]})}var je=function(e){Object(d.a)(c,e);var t=Object(j.a)(c);function c(e){var a;return Object(s.a)(this,c),(a=t.call(this,e)).state={userId:0},a}return Object(l.a)(c,[{key:"onImagesetSelect",value:function(e){e.preventDefault(),this.setState({userId:e.target.dataset.target})}},{key:"render",value:function(){return Object(w.jsxs)("div",{children:[Object(w.jsx)("div",{className:"u-pad--20",children:Object(w.jsx)("h4",{children:"Playlist manager"})}),Object(w.jsx)(u.a,{fluid:!0,className:"u-h--1",children:Object(w.jsxs)(b.a,{className:"u-h--1",children:[Object(w.jsx)(h.a,{xs:12,md:2,lg:2,className:"sidebar u-pad--20",children:Object(w.jsx)(a.Suspense,{fallback:Object(w.jsx)("div",{children:"Loading..."}),children:Object(w.jsx)(de,{className:"u-h--1",onImagesetSelect:this.onImagesetSelect.bind(this)})})}),Object(w.jsx)(a.Suspense,{fallback:Object(w.jsx)("div",{children:"Loading..."}),children:Object(w.jsx)(h.a,{xs:12,md:10,lg:10,className:"u-pad--20",children:Object(w.jsx)(oe,{ImagesetId:this.state.userId})})})]})})]})}}]),c}(a.Component),ue=c(132);function be(){var e=Object(a.useState)({uploadDir:""}),t=Object(O.a)(e,2),c=t[0],n=t[1],r=Object(a.useState)([]),i=Object(O.a)(r,2),s=i[0],l=i[1],o=(Object(m.f)(I),Object(m.d)(I)),d=Object(O.a)(o,2),j=(d[0],d[1]);Object(a.useEffect)((function(){}));var u=Object(a.useCallback)((function(e){N(e)}),[]),b=Object(ue.a)({onDrop:u}),f=b.getRootProps,p=b.getInputProps,y=b.isDragActive,N=function(){var e=Object(g.a)(x.a.mark((function e(t){var c,a;return x.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return c=v.a.map(t,(function(e){return new Promise((function(t){var c=new FileReader;c.onabort=function(){return console.log("file reading was aborted")},c.onerror=function(){return console.log("file reading has failed")},c.onload=function(){return t({uid:e.path,file:e,uri:c.result})},c.readAsDataURL(e)}))})),e.next=3,Promise.all(c).then((function(e){a=v.a.map(e,(function(e,t){return{uid:e.uid,element:Object(w.jsx)("img",{alt:e.uid,src:e.uri},t),file:e.file}}))}));case 3:console.log("dealWithUploads",{result:a}),l(a);case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),C=function(){var e=Object(g.a)(x.a.mark((function e(){var t;return x.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=v.a.map(s,(function(e){var t=e.file,a=new FormData;a.append("subdir",c.uploadDir),a.append("file",t),console.log("form.uploadDir: ".concat(c.uploadDir));var n=new Request(k,{method:"POST",body:a,headers:{}});return fetch(n).then((function(e){return e.json()}))})),Promise.all(t).then((function(e){var t=v.a.clone(s);v.a.each(e,(function(e){e.stats&&j((function(t){var c=v.a.clone(t);return c.push(e.stats),c})),t=v.a.filter(t,(function(t){return t.uid!==e.uid}))})),l(t)}));case 2:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),S=v.a.isEmpty(s)?Object(w.jsx)("p",{children:"Drag files here, or click to select files"}):Object(w.jsx)("p",{});return Object(w.jsxs)("div",{children:[Object(w.jsx)("div",{className:"u-pad--top-20",children:Object(w.jsx)("h4",{children:"Image uploader"})}),Object(w.jsx)("p",{children:"Upload your images by dropping them into the area below. When you have selected them, hit upload."}),Object(w.jsxs)(B.a,{onSubmit:function(e){e.preventDefault(),C()},children:[Object(w.jsx)(B.a.Row,{children:Object(w.jsx)(h.a,{sm:"4",children:Object(w.jsxs)(B.a.Group,{controlId:"uploadDir",children:[Object(w.jsx)(B.a.Label,{children:"Upload subdirectory"}),Object(w.jsx)(B.a.Control,{name:"uploadDir",onChange:function(e){var t="checkbox"===e.target.type?e.target.checked:e.target.value;t="number"===e.target.type?parseInt(t):t;var a=v.a.defaults(Object(F.a)({},e.target.name,t),Object(G.a)({},c));n(a)},type:"text",value:c.uploadDir}),Object(w.jsx)(B.a.Text,{className:"text-muted",children:"Optional subdir to upload files - can make filtering easier.."})]})})}),Object(w.jsx)(B.a.Row,{children:Object(w.jsx)(h.a,{children:Object(w.jsxs)("div",Object(G.a)(Object(G.a)({className:"c-filedropzone"},f()),{},{children:[Object(w.jsx)("input",Object(G.a)({},p())),Object(w.jsxs)("div",{className:"c-filedropzone-inner",children:[y?Object(w.jsx)("p",{children:"Drop the files here ..."}):S,Object(w.jsx)("div",{className:"upload",children:v.a.pluck(s,"element")})]})]}))})}),Object(w.jsx)(B.a.Row,{children:Object(w.jsx)(h.a,{children:Object(w.jsx)(B.a.Group,{className:"sm-3 u-margin--top-20",controlId:"save",children:Object(w.jsx)(R.a,{variant:"primary",type:"submit",children:"Upload"})})})})]})]})}var he=function(e){Object(d.a)(c,e);var t=Object(j.a)(c);function c(){var e;return Object(s.a)(this,c),(e=t.call(this)).state={currentScreen:"welcome"},e.linkClick=e.changeScreen.bind(Object(o.a)(e)),e}return Object(l.a)(c,[{key:"render",value:function(){var e;switch(console.log("this.state.currentScreen: ".concat(this.state.currentScreen)),this.state.currentScreen){case"imagesorter":e=Object(w.jsx)(je,{});break;case"welcome":e=Object(w.jsx)(T,{});break;case"clientconfig":e=Object(w.jsx)($,{});break;case"imageupload":e=Object(w.jsx)(be,{})}return Object(w.jsx)(m.a,{children:Object(w.jsxs)("div",{className:"App full-height",children:[Object(w.jsx)(u.a,{fluid:!0,className:"c-header-background",children:Object(w.jsx)(u.a,{children:Object(w.jsx)(a.Suspense,{fallback:Object(w.jsx)("div",{children:"Loading..."}),children:Object(w.jsx)(D,{title:"Pixel grid admin",homeclick:this.linkClick,children:Object(w.jsx)(P,{onClick:this.linkClick,activeScreen:this.state.currentScreen})})})})}),Object(w.jsx)(u.a,{className:"u-h--1",children:Object(w.jsx)(b.a,{className:"u-h--1",children:Object(w.jsx)(h.a,{className:"u-pad--20",children:e})})})]})})}},{key:"changeScreen",value:function(e){console.log(e),e.preventDefault(),this.setState({currentScreen:e.currentTarget.dataset.target})}}]),c}(a.Component),Oe=function(e){e&&e instanceof Function&&c.e(3).then(c.bind(null,262)).then((function(t){var c=t.getCLS,a=t.getFID,n=t.getFCP,r=t.getLCP,i=t.getTTFB;c(e),a(e),n(e),r(e),i(e)}))};i.a.render(Object(w.jsx)(n.a.StrictMode,{children:Object(w.jsx)(he,{})}),document.getElementById("root")),Oe()}},[[251,1,2]]]); 2 | //# sourceMappingURL=main.5ab38de4.chunk.js.map -------------------------------------------------------------------------------- /public/static/js/main.6aa8440a.chunk.js: -------------------------------------------------------------------------------- 1 | (this.webpackJsonpclient=this.webpackJsonpclient||[]).push([[0],{125:function(e,t,a){},126:function(e,t,a){},238:function(e,t,a){"use strict";a.r(t);var c=a(0),n=a.n(c),r=a(21),i=a.n(r),s=(a(125),a(14)),l=a(17),o=a(31),d=a(18),j=a(19),u=(a(126),a(241)),b=a(242),h=a(110),O=a(6),m=a(10);var x=a(13),g=a.n(x),f=a(16),p=a(11),v=a.n(p),y="".concat("","/images"),k="".concat("","/upload"),C=(Object(m.b)({key:"imageFetching",default:!1}),Object(m.b)({key:"imageId",default:0})),N=(Object(m.c)({key:"imageObject",get:function(e){var t=e.get,a=t(C),c=t(I);if(a)return v.a.findWhere(c,{id:a})||{id:a,name:"",duration:10,images:[]}}}),Object(m.c)({key:"imageSelector",get:function(){var e=Object(f.a)(g.a.mark((function e(){var t;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(y).then((function(e){return e.json()}));case 2:return t=e.sent,e.abrupt("return",t);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),set:function(e,t){(0,e.set)(I,t)}})),I=Object(m.b)({key:"imagesList",default:N}),w=Object(m.c)({key:"randomImage",get:function(e){var t=(0,e.get)(I),a=t[Math.round(1e5*Math.random())%t.length];return console.log({thisImage:a}),a}}),S=a(1);function D(e){var t=Object(m.d)(w),a=Object(O.a)(t,1)[0];return Object(S.jsxs)("div",{className:"c-header u-pad--20 u-flex u-flex--align-center u-flex--justify-between",children:[Object(S.jsx)("div",{className:"c-header-branding u-flex u-flex--align-center",children:Object(S.jsxs)("div",{className:"home-link u-flex u-cursor--pointer","data-target":"welcome",children:[Object(S.jsx)("img",{className:"u-margin--right-20",src:""+a.path,alt:a.path}),Object(S.jsx)("h2",{className:"c-header-title u-margin--bottom-0",children:e.title})]})}),Object(S.jsx)("div",{className:"c-header-links",children:e.children})]})}var L=a(109),R=a(120);function T(e){return Object(S.jsxs)(L.a,{className:"c-link-list","aria-label":"First group",children:[Object(S.jsx)(R.a,{variant:"light",className:"imageupload"===e.activeScreen?"is-active":"","data-target":"imageupload",onClick:e.onClick,children:"Images"}),Object(S.jsx)(R.a,{variant:"light",className:"clientconfig"===e.activeScreen?"is-active":"","data-target":"clientconfig",onClick:e.onClick,children:"Clients"}),Object(S.jsx)(R.a,{variant:"light",className:"imagesorter"===e.activeScreen?"is-active":"","data-target":"imagesorter",onClick:e.onClick,children:"Playlists"})]})}function P(e){return Object(S.jsxs)("div",{className:"u-pad--20",children:[Object(S.jsx)("p",{children:"Choose a function from the options above to get started."}),Object(S.jsxs)("ul",{children:[Object(S.jsx)("li",{children:"Images - upload images to display"}),Object(S.jsx)("li",{children:"Clients - configure clients for correct image display"}),Object(S.jsx)("li",{children:"Playlists - arrange one or more images into a sequence, adjust timings etc."})]})]})}var G=a(3),z=a(20),F="".concat("","/clients"),q=(Object(m.b)({key:"clientFetching",default:!1}),Object(m.b)({key:"clientId",default:0})),A=Object(m.c)({key:"clientObject",get:function(e){var t=e.get,a=t(q),c=t(B);if(a)return v.a.findWhere(c,{id:a})}}),W=Object(m.c)({key:"clientSelector",get:function(){var e=Object(f.a)(g.a.mark((function e(){var t;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(F).then((function(e){return e.json()}));case 2:return t=e.sent,e.abrupt("return",t);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),set:function(e,t){(0,e.set)(B,t)}}),B=Object(m.b)({key:"clientsList",default:W}),E=a(244),J="".concat("","/imagesets"),U="".concat("","/imageset"),_=(Object(m.b)({key:"imagesetFetching",default:!1}),Object(m.b)({key:"imagesetId",default:0})),M=Object(m.b)({key:"imageFormState",default:{}}),H=Object(m.c)({key:"imagesetObject",get:function(e){var t=e.get;if(!v.a.isEmpty(t(M)))return t(M);var a=t(_),c=t(V);if(a){var n=v.a.clone(v.a.findWhere(c,{id:a}));return n?(console.log(n),n.images=n.images?n.images.slice():[],n):Z(a)}},set:function(e,t){(0,e.set)(M,t)}}),Z=function(e){return{id:e,name:"",duration:10,images:[]}},K=Object(m.c)({key:"imagesetSelector",get:function(){var e=Object(f.a)(g.a.mark((function e(){var t;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(J).then((function(e){return e.json()}));case 2:return t=e.sent,e.abrupt("return",t);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),set:function(e,t){(0,e.set)(V,t)}}),V=Object(m.b)({key:"imagesetsList",default:K});function X(e){var t=Object(m.d)(A),a=Object(O.a)(t,1)[0],c=Object(m.d)(B),n=Object(O.a)(c,2),r=n[0],i=n[1],s=Object(m.d)(V),l=Object(O.a)(s,1)[0],o=function(e){var t=r.slice(),c="checkbox"===e.target.type?e.target.checked:e.target.value;c="number"===e.target.type?parseInt(c):c;var n=v.a.defaults(Object(z.a)({},e.target.name,c),Object(G.a)({},a)),s=v.a.findWhere(t,{id:n.id}),l=t.indexOf(s);t.splice(l,1,n),i(t)},d=function(){var e=Object(f.a)(g.a.mark((function e(t){var c,n;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),c=new Request(F,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json"}}),e.next=4,fetch(c).then((function(e){return e.json()}));case 4:n=e.sent,console.log(n);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),j=a?Object(S.jsx)("div",{children:Object(S.jsxs)(E.a,{onSubmit:d,children:[Object(S.jsxs)(E.a.Row,{children:[Object(S.jsx)(h.a,{sm:"6",children:Object(S.jsxs)(E.a.Group,{controlId:"clientId",children:[Object(S.jsx)(E.a.Label,{children:"Client Name"}),Object(S.jsx)(E.a.Control,{name:"name",onChange:o,type:"text",value:a.name})]})}),Object(S.jsx)(h.a,{sm:"3",children:Object(S.jsxs)(E.a.Group,{controlId:"clientId",children:[Object(S.jsx)(E.a.Label,{children:"Client ID"}),Object(S.jsx)(E.a.Control,{name:"id",onChange:o,type:"text",value:a.id,disabled:!0}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"Set in client, locked."})]})}),Object(S.jsx)(h.a,{sm:"3",children:Object(S.jsxs)(E.a.Group,{controlId:"pixelsCount",children:[Object(S.jsx)(E.a.Label,{children:"Pixels count"}),Object(S.jsx)(E.a.Control,{name:"pixelsCount",onChange:o,type:"number",value:a.pixelsCount,disabled:!0}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"Set in client, locked."})]})})]}),Object(S.jsxs)(E.a.Row,{children:[Object(S.jsx)(h.a,{sm:"2",children:Object(S.jsxs)(E.a.Group,{controlId:"width",children:[Object(S.jsx)(E.a.Label,{children:"Pixel width"}),Object(S.jsx)(E.a.Control,{name:"width",onChange:o,type:"number",value:a.width})]})}),Object(S.jsx)(h.a,{sm:"2",children:Object(S.jsxs)(E.a.Group,{controlId:"height",children:[Object(S.jsx)(E.a.Label,{children:"Pixel height"}),Object(S.jsx)(E.a.Control,{name:"height",onChange:o,type:"number",value:a.height})]})}),Object(S.jsx)(h.a,{sm:"4",children:Object(S.jsxs)(E.a.Group,{className:"sm-3",controlId:"direction",children:[Object(S.jsx)(E.a.Label,{children:"Row direction"}),Object(S.jsxs)(E.a.Control,{as:"select",name:"direction",onChange:o,children:[Object(S.jsx)("option",{children:"Choose the orientation of rows in the matrix"}),Object(S.jsx)("option",{value:"horizontal",children:"Horizontal"}),Object(S.jsx)("option",{value:"vertical",children:"Vertical"})]})]})}),Object(S.jsx)(h.a,{sm:"4",children:Object(S.jsxs)(E.a.Group,{className:"sm-3",controlId:"start",children:[Object(S.jsx)(E.a.Label,{children:"Starting point"}),Object(S.jsxs)(E.a.Control,{as:"select",name:"start",value:a.start,onChange:o,children:[Object(S.jsx)("option",{children:"location of the first pixel"}),Object(S.jsx)("option",{value:"topleft",children:"Top-left"}),Object(S.jsx)("option",{value:"topright",children:"Top-right"}),Object(S.jsx)("option",{value:"bottomleft",children:"Bottom-left"}),Object(S.jsx)("option",{value:"bottomright",children:"Bottom-right"})]})]})})]}),Object(S.jsx)(E.a.Row,{children:Object(S.jsx)(h.a,{children:Object(S.jsxs)(E.a.Group,{className:"sm-3",controlId:"zigzag",children:[Object(S.jsx)(E.a.Check,{type:"checkbox",label:"Zigzag rows",name:"zigzag",onChange:o,value:a.zigzag}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"Do the rows zigzag? If false, they are assumed to start at the same end."})]})})}),Object(S.jsx)(E.a.Row,{children:Object(S.jsx)(h.a,{children:Object(S.jsxs)(E.a.Group,{className:"sm-3",controlId:"imagesetId",children:[Object(S.jsx)(E.a.Control,{as:"select",label:"Zigzag rows",name:"imagesetId",onChange:o,value:a.imagesetId,children:l.map((function(e,t){return Object(S.jsx)("option",{value:e.id,children:e.name},t)}))}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"Do the rows imagesetId? If false, they are assumed to start at the same end."})]})})}),Object(S.jsx)(E.a.Row,{children:Object(S.jsx)(h.a,{children:Object(S.jsx)(E.a.Group,{className:"sm-3",controlId:"save",children:Object(S.jsx)(R.a,{variant:"primary",type:"submit",children:"Save Config"})})})})]})}):Object(S.jsx)("div",{children:"Choose a client from the list to configure it."});return Object(S.jsx)("div",{children:j})}function Y(e){var t=Object(m.e)(B),a=Object(m.g)(q),c=function(e){e.preventDefault(),a((function(t){return e.target.dataset.target}))};return Object(S.jsxs)("div",{className:"c-clients",children:[Object(S.jsx)("h4",{children:"Client List:"}),t.map((function(e){return Object(S.jsx)("div",{className:"c-clients__single",children:Object(S.jsx)("a",{href:"clients-{item-id}","data-target":e.id,onClick:c,children:e.id})},e.id)}))]})}var Q=function(e){Object(d.a)(a,e);var t=Object(j.a)(a);function a(e){var c;return Object(s.a)(this,a),(c=t.call(this,e)).state={userId:0},c}return Object(l.a)(a,[{key:"onClientSelect",value:function(e){e.preventDefault(),this.setState({userId:e.target.dataset.target})}},{key:"render",value:function(){return Object(S.jsxs)("div",{children:[Object(S.jsx)("div",{className:"u-pad--20",children:Object(S.jsx)("h4",{children:"Client configuration manager"})}),Object(S.jsx)(u.a,{fluid:!0,className:"u-h--1",children:Object(S.jsxs)(b.a,{className:"u-h--1",children:[Object(S.jsx)(h.a,{sm:"2",className:"sidebar u-pad--20",children:Object(S.jsx)(c.Suspense,{fallback:Object(S.jsx)("div",{children:"Loading..."}),children:Object(S.jsx)(Y,{onClientSelect:this.onClientSelect.bind(this)})})}),Object(S.jsx)(c.Suspense,{fallback:Object(S.jsx)("div",{children:"Loading..."}),children:Object(S.jsx)(h.a,{className:"u-pad--20",children:Object(S.jsx)(X,{clientId:this.state.userId})})})]})})]})}}]),a}(c.Component),$=a(38);function ee(e){var t=Object($.b)({id:e.id}),a=t.attributes,c=t.listeners,n=t.setNodeRef,r=t.transform,i=r?{transform:"translate3d(".concat(r.x,"px, ").concat(r.y,"px, 0)")}:void 0;return Object(S.jsx)("div",Object(G.a)(Object(G.a)(Object(G.a)({title:e.alt,className:"c-draggable",ref:n,style:i},c),a),{},{children:e.children}))}function te(e){var t=Object($.c)({id:e.dropId}),a=t.isOver,c=t.setNodeRef,n={color:a?"green":void 0};return Object(S.jsx)("div",{ref:c,style:n,children:e.children})}var ae=a(245),ce=a(111);function ne(e){var t=Object(m.d)(I),a=Object(O.a)(t,1)[0],n=Object(c.useState)([]),r=Object(O.a)(n,2),i=r[0],s=r[1],l=Object(c.useState)(""),o=Object(O.a)(l,2),d=o[0],j=o[1],u=Object(c.useState)(""),b=Object(O.a)(u,2),h=b[0],x=b[1];Object(c.useEffect)((function(){s(v.a.uniq(e.selectedImageIds))}),[e.selectedImageIds]);var g=function(t){var c,n=v.a.uniq(i);return"selected"===t?c=v.a.compact(v.a.map(n,(function(e){return v.a.findWhere(a,{id:e})}))):(c=v.a.filter(a,(function(e){return-1===n.indexOf(e.id)})),d.length>2&&(c=v.a.filter(c,(function(e){return e.id.toLowerCase().indexOf(d.toLowerCase())>-1})))),v.a.map(c,(function(t){return Object(S.jsx)(ee,{id:t.id,alt:t.id.replace(/.png|.gif|.jpg/g,""),children:Object(S.jsx)("div",{style:{backgroundColor:e.backgroundColor},children:Object(S.jsx)("img",{className:"c-draggable-image",alt:t.id.replace(/.png|.gif|.jpg/g,""),src:"".concat("").concat(t.path)})})},t.id)}))};return Object(S.jsxs)($.a,{onDragEnd:function(t){var a,c=!1;if(t.over&&"selectedImages"===t.over.id){var n=t.active.id;if(v.a.contains(i,n))return;(a=i.slice()).push(n),c=!0}if(t.over&&"allImages"===t.over.id){console.log({event:t});var r=t.active.id;if(!v.a.contains(i,r))return;(a=v.a.clone(i)).splice(i.indexOf(r),1),c=!0}c&&e.changeCallback(a)},children:[Object(S.jsxs)(ae.a,{value:h,name:"mode",className:"mb-2",onChange:function(e){console.log("clicked: ".concat(e)),x(e)},children:[Object(S.jsx)(ce.a,{id:"add",value:"add",children:"Add & Remove"}),Object(S.jsx)(ce.a,{id:"sort",value:"sort",children:"Re-Order"})]}),Object(S.jsxs)("div",{className:"c-draggable-list",children:[Object(S.jsx)("div",{className:"c-draggable-list-header",children:Object(S.jsx)("div",{className:"c-draggable-list-label",children:"Selected Images"})}),Object(S.jsx)(te,{dropId:"selectedImages",className:"drop-zone",children:Object(S.jsx)("div",{className:"c-draggable-list-items",children:g("selected")})})]}),Object(S.jsxs)("div",{className:"c-draggable-list",children:[Object(S.jsxs)("div",{className:"c-draggable-list-header",children:[Object(S.jsx)("div",{className:"c-draggable-list-label",children:"All Images"}),Object(S.jsxs)("div",{className:"c-draggable-list-filter",children:["Filter:"," ",Object(S.jsx)("input",{type:"text",onChange:function(e){j(e.target.value)},value:d}),Object(S.jsx)("div",{className:"c-draggable-list-filter-clear",onClick:function(e){j("")},children:"X"})]})]}),Object(S.jsx)(te,{dropId:"allImages",className:"drop-zone",children:Object(S.jsx)("div",{className:"c-draggable-list-items",children:g("unselected")})})]})]})}var re=a(243);function ie(e){return Object(S.jsxs)(re.a,Object(G.a)(Object(G.a)({},e),{},{size:"lg","aria-labelledby":"contained-modal-title-vcenter",centered:!0,children:[Object(S.jsx)(re.a.Header,{closeButton:!0,children:Object(S.jsx)(re.a.Title,{id:"contained-modal-title-vcenter",children:"Confirmation"})}),Object(S.jsx)(re.a.Body,{children:Object(S.jsxs)("p",{children:["Are you sure you want to delete",Object(S.jsx)("br",{}),"the imageset `",e.title,"`?"]})}),Object(S.jsxs)(re.a.Footer,{children:[Object(S.jsx)(R.a,{onClick:e.onAccept,children:"Yes"}),Object(S.jsx)(R.a,{onClick:e.onDecline,children:"Cancel"})]})]}))}var se=a(118),le=function(e){return Object(f.a)(g.a.mark((function t(){var a,c;return g.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return a=new Request(J,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}}),console.log({request:a}),t.next=4,fetch(a);case 4:return(c=t.sent).success&&console.log({promise:c}),t.abrupt("return",c);case 7:case"end":return t.stop()}}),t)})))};function oe(e){var t=Object(m.d)(H),a=Object(O.a)(t,2),n=a[0],r=a[1],i=Object(m.d)(V),s=Object(O.a)(i,2),l=s[0],o=s[1],d=Object(c.useState)(!1),j=Object(O.a)(d,2),u=j[0],b=j[1],x=Object(m.d)(B),p=Object(O.a)(x,1)[0],y=Object(m.g)(_),k=function(e){var t="checkbox"===e.target.type?e.target.checked:e.target.value;t="number"===e.target.type?parseInt(t):t;var a=v.a.defaults(Object(z.a)({},e.target.name,t),Object(G.a)({},n));r(a)},C=function(e){var t,a=l.slice(),c=v.a.findWhere(a,{id:n.id});if(c){var r=a.indexOf(c);a.splice(r,1);var i=(t=n.id,Object(f.a)(g.a.mark((function e(){var a,c;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=new Request(U,{method:"delete",body:JSON.stringify({uid:t}),headers:{"Content-Type":"application/json"}}),e.next=3,fetch(a);case 3:return(c=e.sent).success&&console.log("image deleted OK"),e.abrupt("return",c);case 6:case"end":return e.stop()}}),e)})))),s=null;i().then((function(e){return s=e.json()})).then((function(e){s=e,console.log({finalresult:s}),s.success&&(y(0),o(a))}))}},N=v.a.isEmpty(n)?Object(S.jsx)("div",{children:"Choose a imageset from the list to configure it."}):Object(S.jsxs)("div",{children:[Object(S.jsxs)(E.a,{onSubmit:function(e){e.preventDefault();var t=l.slice(),a=v.a.findWhere(t,{id:n.id});if(a){var c=t.indexOf(a);t.splice(c,1,n)}else t.push(n);console.log({saveImageSetsToServer:le}),le(t);var r=le(t),i=null;r().then((function(e){return i=e.json()})).then((function(e){i=e,console.log({finalresult:i}),i.success&&o(t)}))},children:[Object(S.jsxs)(E.a.Row,{children:[Object(S.jsx)(h.a,{sm:"2",children:Object(S.jsxs)(E.a.Group,{controlId:"imagesetId",children:[Object(S.jsx)(E.a.Label,{children:"Imageset ID"}),Object(S.jsx)(E.a.Control,{name:"id",onChange:k,type:"text",value:n.id,disabled:!0}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"squential counter, locked."})]})}),Object(S.jsx)(h.a,{sm:"6",children:Object(S.jsxs)(E.a.Group,{controlId:"name",children:[Object(S.jsx)(E.a.Label,{children:"Name"}),Object(S.jsx)(E.a.Control,{name:"name",onChange:k,value:n.name})]})}),Object(S.jsx)(h.a,{sm:"2",children:Object(S.jsxs)(E.a.Group,{controlId:"duration",children:[Object(S.jsx)(E.a.Label,{children:"Pixel duration"}),Object(S.jsx)(E.a.Control,{name:"duration",onChange:k,type:"number",value:n.duration}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"Time each image displays for."})]})}),Object(S.jsx)(h.a,{sm:"2",children:Object(S.jsxs)(E.a.Group,{controlId:"brightness",children:[Object(S.jsx)(E.a.Label,{children:"Pixel brightness"}),Object(S.jsx)(E.a.Control,{name:"brightness",onChange:k,type:"number",value:n.brightness}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"Time each image displays for."})]})})]}),Object(S.jsxs)(E.a.Row,{children:[Object(S.jsx)(h.a,{children:Object(S.jsxs)(E.a.Group,{className:"sm-3",controlId:"selectedClient",children:[Object(S.jsx)(E.a.Label,{children:"Show this playlist on these clients:"}),p.map((function(e){return Object(S.jsx)(E.a.Check,{id:e.name,type:"checkbox",label:e.name,name:"selectedClient",onChange:k,value:e.id},e.name)}))]})}),Object(S.jsx)(h.a,{children:Object(S.jsxs)(E.a.Group,{className:"sm-3",controlId:"colorPicker",children:[Object(S.jsx)(E.a.Label,{children:"Background colour"}),Object(S.jsx)(se.a,{alpha:!1,color:n.backgroundColor||"#000000",onChange:function(e){k({target:{type:"color",name:"backgroundColor",value:e.hex}})}})]})})]}),Object(S.jsxs)(E.a.Row,{children:[Object(S.jsx)(h.a,{sm:"2",children:Object(S.jsx)(E.a.Group,{className:"sm-3",controlId:"save",children:Object(S.jsx)(R.a,{variant:"primary",type:"submit",children:"Save playlist"})})}),Object(S.jsx)(h.a,{sm:"2",children:Object(S.jsx)(E.a.Group,{children:Object(S.jsx)(R.a,{variant:"warning",onClick:function(e){e.preventDefault(),b(!0)},children:"Delete playlist"})})})]}),Object(S.jsx)(ne,{selectedImageIds:n.images,changeCallback:function(e){r(Object(G.a)(Object(G.a)({},n),{},{images:e}))},backgroundColor:n.backgroundColor||"#000000"})]}),Object(S.jsx)(ie,{show:u,onAccept:function(e){b(!1),C()},onDecline:function(){return b(!1)},title:n.name})," "]});return Object(S.jsx)("div",{children:N})}function de(e){var t=Object(m.e)(V),a=Object(m.g)(_),c=Object(m.g)(M),n=function(e){e.preventDefault(),c({}),a((function(t){return parseInt(e.target.dataset.target)}))};return Object(S.jsxs)("div",{className:"c-clients",children:[Object(S.jsx)("h4",{children:"Playlists:"}),Object(S.jsx)("div",{children:t.map((function(e){return Object(S.jsx)("div",{className:"c-clients__single",children:Object(S.jsx)("a",{href:"clients-{item-id}","data-target":e.id,onClick:n,children:e.name})},e.id)}))}),Object(S.jsx)(R.a,{className:"u-margin--top-20",onClick:function(e){var n=v.a.max(v.a.pluck(t,"id"));console.log(t),c({}),a((function(e){return n>0?n+1:1}))},variant:"light",type:"submit",children:"New Playlist"})]})}var je=function(e){Object(d.a)(a,e);var t=Object(j.a)(a);function a(e){var c;return Object(s.a)(this,a),(c=t.call(this,e)).state={userId:0},c}return Object(l.a)(a,[{key:"onImagesetSelect",value:function(e){e.preventDefault(),this.setState({userId:e.target.dataset.target})}},{key:"render",value:function(){return Object(S.jsxs)("div",{children:[Object(S.jsx)("div",{className:"u-pad--20",children:Object(S.jsx)("h4",{children:"Playlist manager"})}),Object(S.jsx)(u.a,{fluid:!0,className:"u-h--1",children:Object(S.jsxs)(b.a,{className:"u-h--1",children:[Object(S.jsx)(h.a,{xs:2,className:"sidebar u-pad--20",children:Object(S.jsx)(c.Suspense,{fallback:Object(S.jsx)("div",{children:"Loading..."}),children:Object(S.jsx)(de,{className:"u-h--1",onImagesetSelect:this.onImagesetSelect.bind(this)})})}),Object(S.jsx)(c.Suspense,{fallback:Object(S.jsx)("div",{children:"Loading..."}),children:Object(S.jsx)(h.a,{className:"u-pad--20",children:Object(S.jsx)(oe,{ImagesetId:this.state.userId})})})]})})]})}}]),a}(c.Component),ue=a(119);function be(){var e=Object(c.useState)({uploadDir:""}),t=Object(O.a)(e,2),a=t[0],n=t[1],r=Object(c.useState)([]),i=Object(O.a)(r,2),s=i[0],l=i[1],o=Object(m.f)(I),d=Object(m.g)(I);Object(c.useEffect)((function(){}));var j=Object(c.useCallback)((function(e){y(e)}),[]),u=Object(ue.a)({onDrop:j}),b=u.getRootProps,x=u.getInputProps,p=u.isDragActive,y=function(){var e=Object(f.a)(g.a.mark((function e(t){var a,c;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=v.a.map(t,(function(e){return new Promise((function(t){var a=new FileReader;a.onabort=function(){return console.log("file reading was aborted")},a.onerror=function(){return console.log("file reading has failed")},a.onload=function(){return t({uid:e.path,file:e,uri:a.result})},a.readAsDataURL(e)}))})),e.next=3,Promise.all(a).then((function(e){c=v.a.map(e,(function(e,t){return{uid:e.uid,element:Object(S.jsx)("img",{alt:e.uid,src:e.uri},t),file:e.file}}))}));case 3:console.log({result:c}),l(c);case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),C=function(){var e=Object(f.a)(g.a.mark((function e(){var t;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=v.a.map(s,(function(e){var t=e.file,c=new FormData;c.append("subdir",a.uploadDir),c.append("file",t),console.log("form.uploadDir: ".concat(a.uploadDir));var n=new Request(k,{method:"POST",body:c,headers:{}});return fetch(n).then((function(e){return e.json()}))})),Promise.all(t).then((function(e){var t=v.a.clone(s);v.a.each(e,(function(e){e.stats&&d((function(t){var a=v.a.clone(t);return a.push(e.stats),a})),t=v.a.filter(t,(function(t){return t.uid!==e.uid}))})),l(t)})).then((function(e){o()}));case 2:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),N=v.a.isEmpty(s)?Object(S.jsx)("p",{children:"Drag files here, or click to select files"}):Object(S.jsx)("p",{});return Object(S.jsxs)("div",{children:[Object(S.jsx)("div",{className:"u-pad--top-20",children:Object(S.jsx)("h4",{children:"Image uploader"})}),Object(S.jsx)("p",{children:"Upload your images by dropping them into the area below. When you have selected them, hit upload."}),Object(S.jsxs)(E.a,{onSubmit:function(e){e.preventDefault(),C()},children:[Object(S.jsx)(E.a.Row,{children:Object(S.jsx)(h.a,{sm:"4",children:Object(S.jsxs)(E.a.Group,{controlId:"uploadDir",children:[Object(S.jsx)(E.a.Label,{children:"Upload subdirectory"}),Object(S.jsx)(E.a.Control,{name:"uploadDir",onChange:function(e){var t="checkbox"===e.target.type?e.target.checked:e.target.value;t="number"===e.target.type?parseInt(t):t;var c=v.a.defaults(Object(z.a)({},e.target.name,t),Object(G.a)({},a));n(c)},type:"text",value:a.uploadDir}),Object(S.jsx)(E.a.Text,{className:"text-muted",children:"Optional subdir to upload files - can make filtering easier.."})]})})}),Object(S.jsx)(E.a.Row,{children:Object(S.jsx)(h.a,{children:Object(S.jsxs)("div",Object(G.a)(Object(G.a)({className:"c-filedropzone"},b()),{},{children:[Object(S.jsx)("input",Object(G.a)({},x())),Object(S.jsxs)("div",{className:"c-filedropzone-inner",children:[p?Object(S.jsx)("p",{children:"Drop the files here ..."}):N,Object(S.jsx)("div",{className:"upload",children:v.a.pluck(s,"element")})]})]}))})}),Object(S.jsx)(E.a.Row,{children:Object(S.jsx)(h.a,{children:Object(S.jsx)(E.a.Group,{className:"sm-3 u-margin--top-20",controlId:"save",children:Object(S.jsx)(R.a,{variant:"primary",type:"submit",children:"Upload"})})})})]})]})}var he=function(e){Object(d.a)(a,e);var t=Object(j.a)(a);function a(){var e;return Object(s.a)(this,a),(e=t.call(this)).state={currentScreen:"welcome"},e.linkClick=e.changeScreen.bind(Object(o.a)(e)),e}return Object(l.a)(a,[{key:"render",value:function(){var e;switch(console.log("this.state.currentScreen: ".concat(this.state.currentScreen)),this.state.currentScreen){case"imagesorter":e=Object(S.jsx)(je,{});break;case"welcome":e=Object(S.jsx)(P,{});break;case"clientconfig":e=Object(S.jsx)(Q,{});break;case"imageupload":e=Object(S.jsx)(be,{})}return Object(S.jsx)(m.a,{children:Object(S.jsxs)("div",{className:"App full-height",children:[Object(S.jsx)(u.a,{fluid:!0,className:"c-header-background",children:Object(S.jsx)(u.a,{children:Object(S.jsx)(c.Suspense,{fallback:Object(S.jsx)("div",{children:"Loading..."}),children:Object(S.jsx)(D,{title:"Pixel grid admin",homeclick:this.linkClick,children:Object(S.jsx)(T,{onClick:this.linkClick,activeScreen:this.state.currentScreen})})})})}),Object(S.jsx)(u.a,{className:"u-h--1",children:Object(S.jsx)(b.a,{className:"u-h--1",children:Object(S.jsx)(h.a,{className:"u-pad--20",children:e})})})]})})}},{key:"changeScreen",value:function(e){console.log(e),e.preventDefault(),this.setState({currentScreen:e.currentTarget.dataset.target})}}]),a}(c.Component),Oe=function(e){e&&e instanceof Function&&a.e(3).then(a.bind(null,246)).then((function(t){var a=t.getCLS,c=t.getFID,n=t.getFCP,r=t.getLCP,i=t.getTTFB;a(e),c(e),n(e),r(e),i(e)}))};i.a.render(Object(S.jsx)(n.a.StrictMode,{children:Object(S.jsx)(he,{})}),document.getElementById("root")),Oe()}},[[238,1,2]]]); 2 | //# sourceMappingURL=main.6aa8440a.chunk.js.map -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@75lb/deep-merge@^1.1.1": 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/@75lb/deep-merge/-/deep-merge-1.1.1.tgz#3b06155b90d34f5f8cc2107d796f1853ba02fd6d" 8 | integrity sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw== 9 | dependencies: 10 | lodash.assignwith "^4.2.0" 11 | typical "^7.1.1" 12 | 13 | accepts@~1.3.8: 14 | version "1.3.8" 15 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 16 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 17 | dependencies: 18 | mime-types "~2.1.34" 19 | negotiator "0.6.3" 20 | 21 | ansi-regex@^2.0.0: 22 | version "2.1.1" 23 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 24 | integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== 25 | 26 | ansi-regex@^5.0.1: 27 | version "5.0.1" 28 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 29 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 30 | 31 | ansi-styles@^4.1.0: 32 | version "4.3.0" 33 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 34 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 35 | dependencies: 36 | color-convert "^2.0.1" 37 | 38 | aproba@^1.0.3: 39 | version "1.2.0" 40 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 41 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 42 | 43 | are-we-there-yet@~1.1.2: 44 | version "1.1.7" 45 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" 46 | integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== 47 | dependencies: 48 | delegates "^1.0.0" 49 | readable-stream "^2.0.6" 50 | 51 | array-back@^3.0.1, array-back@^3.1.0: 52 | version "3.1.0" 53 | resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" 54 | integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== 55 | 56 | array-back@^6.2.2: 57 | version "6.2.2" 58 | resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157" 59 | integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw== 60 | 61 | array-flatten@1.1.1: 62 | version "1.1.1" 63 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 64 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 65 | 66 | at-least-node@^1.0.0: 67 | version "1.0.0" 68 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 69 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 70 | 71 | base64-js@^1.3.1: 72 | version "1.5.1" 73 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 74 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 75 | 76 | bl@^4.0.3: 77 | version "4.1.0" 78 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 79 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 80 | dependencies: 81 | buffer "^5.5.0" 82 | inherits "^2.0.4" 83 | readable-stream "^3.4.0" 84 | 85 | body-parser@1.20.1: 86 | version "1.20.1" 87 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 88 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 89 | dependencies: 90 | bytes "3.1.2" 91 | content-type "~1.0.4" 92 | debug "2.6.9" 93 | depd "2.0.0" 94 | destroy "1.2.0" 95 | http-errors "2.0.0" 96 | iconv-lite "0.4.24" 97 | on-finished "2.4.1" 98 | qs "6.11.0" 99 | raw-body "2.5.1" 100 | type-is "~1.6.18" 101 | unpipe "1.0.0" 102 | 103 | body-parser@^1.19.0: 104 | version "1.20.2" 105 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" 106 | integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== 107 | dependencies: 108 | bytes "3.1.2" 109 | content-type "~1.0.5" 110 | debug "2.6.9" 111 | depd "2.0.0" 112 | destroy "1.2.0" 113 | http-errors "2.0.0" 114 | iconv-lite "0.4.24" 115 | on-finished "2.4.1" 116 | qs "6.11.0" 117 | raw-body "2.5.2" 118 | type-is "~1.6.18" 119 | unpipe "1.0.0" 120 | 121 | buffer@^5.5.0: 122 | version "5.7.1" 123 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 124 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 125 | dependencies: 126 | base64-js "^1.3.1" 127 | ieee754 "^1.1.13" 128 | 129 | busboy@^1.6.0: 130 | version "1.6.0" 131 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" 132 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 133 | dependencies: 134 | streamsearch "^1.1.0" 135 | 136 | bytes@3.1.2: 137 | version "3.1.2" 138 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 139 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 140 | 141 | call-bind@^1.0.0: 142 | version "1.0.2" 143 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 144 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 145 | dependencies: 146 | function-bind "^1.1.1" 147 | get-intrinsic "^1.0.2" 148 | 149 | chalk-template@^0.4.0: 150 | version "0.4.0" 151 | resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" 152 | integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== 153 | dependencies: 154 | chalk "^4.1.2" 155 | 156 | chalk@^4.1.2: 157 | version "4.1.2" 158 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 159 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 160 | dependencies: 161 | ansi-styles "^4.1.0" 162 | supports-color "^7.1.0" 163 | 164 | chownr@^1.1.1: 165 | version "1.1.4" 166 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 167 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 168 | 169 | chownr@^2.0.0: 170 | version "2.0.0" 171 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" 172 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 173 | 174 | code-point-at@^1.0.0: 175 | version "1.1.0" 176 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 177 | integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== 178 | 179 | color-convert@^1.9.3: 180 | version "1.9.3" 181 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 182 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 183 | dependencies: 184 | color-name "1.1.3" 185 | 186 | color-convert@^2.0.1: 187 | version "2.0.1" 188 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 189 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 190 | dependencies: 191 | color-name "~1.1.4" 192 | 193 | color-name@1.1.3: 194 | version "1.1.3" 195 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 196 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 197 | 198 | color-name@^1.0.0, color-name@~1.1.4: 199 | version "1.1.4" 200 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 201 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 202 | 203 | color-string@^1.6.0: 204 | version "1.9.1" 205 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" 206 | integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== 207 | dependencies: 208 | color-name "^1.0.0" 209 | simple-swizzle "^0.2.2" 210 | 211 | color@^3.1.2: 212 | version "3.2.1" 213 | resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" 214 | integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== 215 | dependencies: 216 | color-convert "^1.9.3" 217 | color-string "^1.6.0" 218 | 219 | command-line-args@^5.2.1: 220 | version "5.2.1" 221 | resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" 222 | integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== 223 | dependencies: 224 | array-back "^3.1.0" 225 | find-replace "^3.0.0" 226 | lodash.camelcase "^4.3.0" 227 | typical "^4.0.0" 228 | 229 | command-line-usage@^7.0.0, command-line-usage@^7.0.1: 230 | version "7.0.1" 231 | resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.1.tgz#e540afef4a4f3bc501b124ffde33956309100655" 232 | integrity sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ== 233 | dependencies: 234 | array-back "^6.2.2" 235 | chalk-template "^0.4.0" 236 | table-layout "^3.0.0" 237 | typical "^7.1.1" 238 | 239 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 240 | version "1.1.0" 241 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 242 | integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== 243 | 244 | content-disposition@0.5.4: 245 | version "0.5.4" 246 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 247 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 248 | dependencies: 249 | safe-buffer "5.2.1" 250 | 251 | content-type@~1.0.4, content-type@~1.0.5: 252 | version "1.0.5" 253 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 254 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 255 | 256 | cookie-signature@1.0.6: 257 | version "1.0.6" 258 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 259 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 260 | 261 | cookie@0.5.0: 262 | version "0.5.0" 263 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 264 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 265 | 266 | core-util-is@~1.0.0: 267 | version "1.0.3" 268 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 269 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 270 | 271 | cors@^2.8.5: 272 | version "2.8.5" 273 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 274 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 275 | dependencies: 276 | object-assign "^4" 277 | vary "^1" 278 | 279 | debug@2.6.9: 280 | version "2.6.9" 281 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 282 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 283 | dependencies: 284 | ms "2.0.0" 285 | 286 | decompress-response@^4.2.0: 287 | version "4.2.1" 288 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 289 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 290 | dependencies: 291 | mimic-response "^2.0.0" 292 | 293 | decompress-response@^6.0.0: 294 | version "6.0.0" 295 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" 296 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 297 | dependencies: 298 | mimic-response "^3.1.0" 299 | 300 | deep-extend@^0.6.0: 301 | version "0.6.0" 302 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 303 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 304 | 305 | delegates@^1.0.0: 306 | version "1.0.0" 307 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 308 | integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== 309 | 310 | depd@2.0.0: 311 | version "2.0.0" 312 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 313 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 314 | 315 | destroy@1.2.0: 316 | version "1.2.0" 317 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 318 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 319 | 320 | detect-libc@^1.0.3: 321 | version "1.0.3" 322 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 323 | integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== 324 | 325 | ee-first@1.1.1: 326 | version "1.1.1" 327 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 328 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 329 | 330 | emoji-regex@^8.0.0: 331 | version "8.0.0" 332 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 333 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 334 | 335 | encodeurl@~1.0.2: 336 | version "1.0.2" 337 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 338 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 339 | 340 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 341 | version "1.4.4" 342 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 343 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 344 | dependencies: 345 | once "^1.4.0" 346 | 347 | escape-html@~1.0.3: 348 | version "1.0.3" 349 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 350 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 351 | 352 | etag@~1.8.1: 353 | version "1.8.1" 354 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 355 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 356 | 357 | expand-template@^2.0.3: 358 | version "2.0.3" 359 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" 360 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 361 | 362 | express-fileupload@^1.2.0: 363 | version "1.4.0" 364 | resolved "https://registry.yarnpkg.com/express-fileupload/-/express-fileupload-1.4.0.tgz#be9d70a881d6c2b1ce668df86e4f89ddbf238ec7" 365 | integrity sha512-RjzLCHxkv3umDeZKeFeMg8w7qe0V09w3B7oGZprr/oO2H/ISCgNzuqzn7gV3HRWb37GjRk429CCpSLS2KNTqMQ== 366 | dependencies: 367 | busboy "^1.6.0" 368 | 369 | express-static@^1.2.6: 370 | version "1.2.6" 371 | resolved "https://registry.yarnpkg.com/express-static/-/express-static-1.2.6.tgz#567aab6ba808386936b8c17bb0a90f6f61d0db4f" 372 | integrity sha512-pmp8fSe+bCxGCTk5+X6HzIF2APYMvrAq3Y7sT/WOELc0JZZxJhMTVgCbxcoUgMRBSqnQ9EfTw/Uv3J1ONoIAuA== 373 | dependencies: 374 | mime2 latest 375 | 376 | express@^4.17.1: 377 | version "4.18.2" 378 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 379 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 380 | dependencies: 381 | accepts "~1.3.8" 382 | array-flatten "1.1.1" 383 | body-parser "1.20.1" 384 | content-disposition "0.5.4" 385 | content-type "~1.0.4" 386 | cookie "0.5.0" 387 | cookie-signature "1.0.6" 388 | debug "2.6.9" 389 | depd "2.0.0" 390 | encodeurl "~1.0.2" 391 | escape-html "~1.0.3" 392 | etag "~1.8.1" 393 | finalhandler "1.2.0" 394 | fresh "0.5.2" 395 | http-errors "2.0.0" 396 | merge-descriptors "1.0.1" 397 | methods "~1.1.2" 398 | on-finished "2.4.1" 399 | parseurl "~1.3.3" 400 | path-to-regexp "0.1.7" 401 | proxy-addr "~2.0.7" 402 | qs "6.11.0" 403 | range-parser "~1.2.1" 404 | safe-buffer "5.2.1" 405 | send "0.18.0" 406 | serve-static "1.15.0" 407 | setprototypeof "1.2.0" 408 | statuses "2.0.1" 409 | type-is "~1.6.18" 410 | utils-merge "1.0.1" 411 | vary "~1.1.2" 412 | 413 | finalhandler@1.2.0: 414 | version "1.2.0" 415 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 416 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 417 | dependencies: 418 | debug "2.6.9" 419 | encodeurl "~1.0.2" 420 | escape-html "~1.0.3" 421 | on-finished "2.4.1" 422 | parseurl "~1.3.3" 423 | statuses "2.0.1" 424 | unpipe "~1.0.0" 425 | 426 | find-replace@^3.0.0: 427 | version "3.0.0" 428 | resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" 429 | integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== 430 | dependencies: 431 | array-back "^3.0.1" 432 | 433 | forwarded@0.2.0: 434 | version "0.2.0" 435 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 436 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 437 | 438 | fresh@0.5.2: 439 | version "0.5.2" 440 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 441 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 442 | 443 | fs-constants@^1.0.0: 444 | version "1.0.0" 445 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 446 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 447 | 448 | fs-extra@^9.0.1: 449 | version "9.1.0" 450 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" 451 | integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== 452 | dependencies: 453 | at-least-node "^1.0.0" 454 | graceful-fs "^4.2.0" 455 | jsonfile "^6.0.1" 456 | universalify "^2.0.0" 457 | 458 | fs-minipass@^2.0.0: 459 | version "2.1.0" 460 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" 461 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 462 | dependencies: 463 | minipass "^3.0.0" 464 | 465 | function-bind@^1.1.1: 466 | version "1.1.1" 467 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 468 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 469 | 470 | gauge@~2.7.3: 471 | version "2.7.4" 472 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 473 | integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== 474 | dependencies: 475 | aproba "^1.0.3" 476 | console-control-strings "^1.0.0" 477 | has-unicode "^2.0.0" 478 | object-assign "^4.1.0" 479 | signal-exit "^3.0.0" 480 | string-width "^1.0.1" 481 | strip-ansi "^3.0.1" 482 | wide-align "^1.1.0" 483 | 484 | get-intrinsic@^1.0.2: 485 | version "1.2.0" 486 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" 487 | integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== 488 | dependencies: 489 | function-bind "^1.1.1" 490 | has "^1.0.3" 491 | has-symbols "^1.0.3" 492 | 493 | github-from-package@0.0.0: 494 | version "0.0.0" 495 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 496 | integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== 497 | 498 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 499 | version "4.2.11" 500 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 501 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 502 | 503 | has-flag@^4.0.0: 504 | version "4.0.0" 505 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 506 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 507 | 508 | has-symbols@^1.0.3: 509 | version "1.0.3" 510 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 511 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 512 | 513 | has-unicode@^2.0.0: 514 | version "2.0.1" 515 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 516 | integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== 517 | 518 | has@^1.0.3: 519 | version "1.0.3" 520 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 521 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 522 | dependencies: 523 | function-bind "^1.1.1" 524 | 525 | http-errors@2.0.0: 526 | version "2.0.0" 527 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 528 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 529 | dependencies: 530 | depd "2.0.0" 531 | inherits "2.0.4" 532 | setprototypeof "1.2.0" 533 | statuses "2.0.1" 534 | toidentifier "1.0.1" 535 | 536 | iconv-lite@0.4.24: 537 | version "0.4.24" 538 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 539 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 540 | dependencies: 541 | safer-buffer ">= 2.1.2 < 3" 542 | 543 | ieee754@^1.1.13: 544 | version "1.2.1" 545 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 546 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 547 | 548 | inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: 549 | version "2.0.4" 550 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 551 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 552 | 553 | ini@~1.3.0: 554 | version "1.3.8" 555 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 556 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 557 | 558 | ipaddr.js@1.9.1: 559 | version "1.9.1" 560 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 561 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 562 | 563 | is-arrayish@^0.3.1: 564 | version "0.3.2" 565 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" 566 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 567 | 568 | is-fullwidth-code-point@^1.0.0: 569 | version "1.0.0" 570 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 571 | integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== 572 | dependencies: 573 | number-is-nan "^1.0.0" 574 | 575 | is-fullwidth-code-point@^3.0.0: 576 | version "3.0.0" 577 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 578 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 579 | 580 | isarray@~1.0.0: 581 | version "1.0.0" 582 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 583 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 584 | 585 | jsonfile@^6.0.1: 586 | version "6.1.0" 587 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 588 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 589 | dependencies: 590 | universalify "^2.0.0" 591 | optionalDependencies: 592 | graceful-fs "^4.1.6" 593 | 594 | lodash.assignwith@^4.2.0: 595 | version "4.2.0" 596 | resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" 597 | integrity sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g== 598 | 599 | lodash.camelcase@^4.3.0: 600 | version "4.3.0" 601 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 602 | integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== 603 | 604 | lru-cache@^6.0.0: 605 | version "6.0.0" 606 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 607 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 608 | dependencies: 609 | yallist "^4.0.0" 610 | 611 | media-typer@0.3.0: 612 | version "0.3.0" 613 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 614 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 615 | 616 | merge-descriptors@1.0.1: 617 | version "1.0.1" 618 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 619 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 620 | 621 | methods@~1.1.2: 622 | version "1.1.2" 623 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 624 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 625 | 626 | mime-db@1.52.0: 627 | version "1.52.0" 628 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 629 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 630 | 631 | mime-types@~2.1.24, mime-types@~2.1.34: 632 | version "2.1.35" 633 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 634 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 635 | dependencies: 636 | mime-db "1.52.0" 637 | 638 | mime2@latest: 639 | version "0.0.11" 640 | resolved "https://registry.yarnpkg.com/mime2/-/mime2-0.0.11.tgz#ae75a1386114ffd51d9e97c481464318e97d87c5" 641 | integrity sha512-Ch599Y8U4vUgG9AaQgLEnIdXRRLoZPfjAdWFDLYePBEJS1nsS43H2pzbZn0u8lkbYx+yInuKxLsUEgM3fa9ZLQ== 642 | 643 | mime@1.6.0: 644 | version "1.6.0" 645 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 646 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 647 | 648 | mimic-response@^2.0.0: 649 | version "2.1.0" 650 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 651 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 652 | 653 | mimic-response@^3.1.0: 654 | version "3.1.0" 655 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" 656 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 657 | 658 | minimist@^1.2.0, minimist@^1.2.3: 659 | version "1.2.8" 660 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 661 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 662 | 663 | minipass@^3.0.0: 664 | version "3.3.6" 665 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" 666 | integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== 667 | dependencies: 668 | yallist "^4.0.0" 669 | 670 | minipass@^4.0.0: 671 | version "4.2.8" 672 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" 673 | integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== 674 | 675 | minizlib@^2.1.1: 676 | version "2.1.2" 677 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" 678 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 679 | dependencies: 680 | minipass "^3.0.0" 681 | yallist "^4.0.0" 682 | 683 | mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: 684 | version "0.5.3" 685 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 686 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 687 | 688 | mkdirp@^1.0.3: 689 | version "1.0.4" 690 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 691 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 692 | 693 | ms@2.0.0: 694 | version "2.0.0" 695 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 696 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 697 | 698 | ms@2.1.3: 699 | version "2.1.3" 700 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 701 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 702 | 703 | napi-build-utils@^1.0.1: 704 | version "1.0.2" 705 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" 706 | integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== 707 | 708 | negotiator@0.6.3: 709 | version "0.6.3" 710 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 711 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 712 | 713 | node-abi@^2.7.0: 714 | version "2.30.1" 715 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" 716 | integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== 717 | dependencies: 718 | semver "^5.4.1" 719 | 720 | node-addon-api@^3.0.0: 721 | version "3.2.1" 722 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" 723 | integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== 724 | 725 | noop-logger@^0.1.1: 726 | version "0.1.1" 727 | resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" 728 | integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== 729 | 730 | npmlog@^4.0.1, npmlog@^4.1.2: 731 | version "4.1.2" 732 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 733 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 734 | dependencies: 735 | are-we-there-yet "~1.1.2" 736 | console-control-strings "~1.1.0" 737 | gauge "~2.7.3" 738 | set-blocking "~2.0.0" 739 | 740 | number-is-nan@^1.0.0: 741 | version "1.0.1" 742 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 743 | integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== 744 | 745 | object-assign@^4, object-assign@^4.1.0: 746 | version "4.1.1" 747 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 748 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 749 | 750 | object-inspect@^1.9.0: 751 | version "1.12.3" 752 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 753 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 754 | 755 | on-finished@2.4.1: 756 | version "2.4.1" 757 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 758 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 759 | dependencies: 760 | ee-first "1.1.1" 761 | 762 | once@^1.3.1, once@^1.4.0: 763 | version "1.4.0" 764 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 765 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 766 | dependencies: 767 | wrappy "1" 768 | 769 | parseurl@~1.3.3: 770 | version "1.3.3" 771 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 772 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 773 | 774 | path-to-regexp@0.1.7: 775 | version "0.1.7" 776 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 777 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 778 | 779 | prebuild-install@^5.3.4: 780 | version "5.3.6" 781 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291" 782 | integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg== 783 | dependencies: 784 | detect-libc "^1.0.3" 785 | expand-template "^2.0.3" 786 | github-from-package "0.0.0" 787 | minimist "^1.2.3" 788 | mkdirp-classic "^0.5.3" 789 | napi-build-utils "^1.0.1" 790 | node-abi "^2.7.0" 791 | noop-logger "^0.1.1" 792 | npmlog "^4.0.1" 793 | pump "^3.0.0" 794 | rc "^1.2.7" 795 | simple-get "^3.0.3" 796 | tar-fs "^2.0.0" 797 | tunnel-agent "^0.6.0" 798 | which-pm-runs "^1.0.0" 799 | 800 | process-nextick-args@~2.0.0: 801 | version "2.0.1" 802 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 803 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 804 | 805 | proxy-addr@~2.0.7: 806 | version "2.0.7" 807 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 808 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 809 | dependencies: 810 | forwarded "0.2.0" 811 | ipaddr.js "1.9.1" 812 | 813 | pump@^3.0.0: 814 | version "3.0.0" 815 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 816 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 817 | dependencies: 818 | end-of-stream "^1.1.0" 819 | once "^1.3.1" 820 | 821 | qs@6.11.0: 822 | version "6.11.0" 823 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 824 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 825 | dependencies: 826 | side-channel "^1.0.4" 827 | 828 | range-parser@~1.2.1: 829 | version "1.2.1" 830 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 831 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 832 | 833 | raw-body@2.5.1: 834 | version "2.5.1" 835 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 836 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 837 | dependencies: 838 | bytes "3.1.2" 839 | http-errors "2.0.0" 840 | iconv-lite "0.4.24" 841 | unpipe "1.0.0" 842 | 843 | raw-body@2.5.2: 844 | version "2.5.2" 845 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" 846 | integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== 847 | dependencies: 848 | bytes "3.1.2" 849 | http-errors "2.0.0" 850 | iconv-lite "0.4.24" 851 | unpipe "1.0.0" 852 | 853 | rc@^1.2.7: 854 | version "1.2.8" 855 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 856 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 857 | dependencies: 858 | deep-extend "^0.6.0" 859 | ini "~1.3.0" 860 | minimist "^1.2.0" 861 | strip-json-comments "~2.0.1" 862 | 863 | readable-stream@^2.0.6: 864 | version "2.3.8" 865 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 866 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 867 | dependencies: 868 | core-util-is "~1.0.0" 869 | inherits "~2.0.3" 870 | isarray "~1.0.0" 871 | process-nextick-args "~2.0.0" 872 | safe-buffer "~5.1.1" 873 | string_decoder "~1.1.1" 874 | util-deprecate "~1.0.1" 875 | 876 | readable-stream@^3.1.1, readable-stream@^3.4.0: 877 | version "3.6.2" 878 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" 879 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 880 | dependencies: 881 | inherits "^2.0.3" 882 | string_decoder "^1.1.1" 883 | util-deprecate "^1.0.1" 884 | 885 | safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: 886 | version "5.2.1" 887 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 888 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 889 | 890 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 891 | version "5.1.2" 892 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 893 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 894 | 895 | "safer-buffer@>= 2.1.2 < 3": 896 | version "2.1.2" 897 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 898 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 899 | 900 | semver@^5.4.1: 901 | version "5.7.1" 902 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 903 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 904 | 905 | semver@^7.3.2: 906 | version "7.4.0" 907 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" 908 | integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== 909 | dependencies: 910 | lru-cache "^6.0.0" 911 | 912 | send@0.18.0: 913 | version "0.18.0" 914 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 915 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 916 | dependencies: 917 | debug "2.6.9" 918 | depd "2.0.0" 919 | destroy "1.2.0" 920 | encodeurl "~1.0.2" 921 | escape-html "~1.0.3" 922 | etag "~1.8.1" 923 | fresh "0.5.2" 924 | http-errors "2.0.0" 925 | mime "1.6.0" 926 | ms "2.1.3" 927 | on-finished "2.4.1" 928 | range-parser "~1.2.1" 929 | statuses "2.0.1" 930 | 931 | serve-static@1.15.0: 932 | version "1.15.0" 933 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 934 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 935 | dependencies: 936 | encodeurl "~1.0.2" 937 | escape-html "~1.0.3" 938 | parseurl "~1.3.3" 939 | send "0.18.0" 940 | 941 | set-blocking@~2.0.0: 942 | version "2.0.0" 943 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 944 | integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== 945 | 946 | setprototypeof@1.2.0: 947 | version "1.2.0" 948 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 949 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 950 | 951 | sharp@^0.25.4: 952 | version "0.25.4" 953 | resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.25.4.tgz#1a8e542144a07ab7e9316ab89de80182b827c363" 954 | integrity sha512-umSzJJ1oBwIOfwFFt/fJ7JgCva9FvrEU2cbbm7u/3hSDZhXvkME8WE5qpaJqLIe2Har5msF5UG4CzYlEg5o3BQ== 955 | dependencies: 956 | color "^3.1.2" 957 | detect-libc "^1.0.3" 958 | node-addon-api "^3.0.0" 959 | npmlog "^4.1.2" 960 | prebuild-install "^5.3.4" 961 | semver "^7.3.2" 962 | simple-get "^4.0.0" 963 | tar "^6.0.2" 964 | tunnel-agent "^0.6.0" 965 | 966 | side-channel@^1.0.4: 967 | version "1.0.4" 968 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 969 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 970 | dependencies: 971 | call-bind "^1.0.0" 972 | get-intrinsic "^1.0.2" 973 | object-inspect "^1.9.0" 974 | 975 | signal-exit@^3.0.0: 976 | version "3.0.7" 977 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 978 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 979 | 980 | simple-concat@^1.0.0: 981 | version "1.0.1" 982 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" 983 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 984 | 985 | simple-get@^3.0.3: 986 | version "3.1.1" 987 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" 988 | integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== 989 | dependencies: 990 | decompress-response "^4.2.0" 991 | once "^1.3.1" 992 | simple-concat "^1.0.0" 993 | 994 | simple-get@^4.0.0: 995 | version "4.0.1" 996 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" 997 | integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== 998 | dependencies: 999 | decompress-response "^6.0.0" 1000 | once "^1.3.1" 1001 | simple-concat "^1.0.0" 1002 | 1003 | simple-swizzle@^0.2.2: 1004 | version "0.2.2" 1005 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" 1006 | integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== 1007 | dependencies: 1008 | is-arrayish "^0.3.1" 1009 | 1010 | statuses@2.0.1: 1011 | version "2.0.1" 1012 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1013 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1014 | 1015 | stream-read-all@^3.0.1: 1016 | version "3.0.1" 1017 | resolved "https://registry.yarnpkg.com/stream-read-all/-/stream-read-all-3.0.1.tgz#60762ae45e61d93ba0978cda7f3913790052ad96" 1018 | integrity sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A== 1019 | 1020 | streamsearch@^1.1.0: 1021 | version "1.1.0" 1022 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" 1023 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 1024 | 1025 | string-width@^1.0.1: 1026 | version "1.0.2" 1027 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1028 | integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== 1029 | dependencies: 1030 | code-point-at "^1.0.0" 1031 | is-fullwidth-code-point "^1.0.0" 1032 | strip-ansi "^3.0.0" 1033 | 1034 | "string-width@^1.0.2 || 2 || 3 || 4": 1035 | version "4.2.3" 1036 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1037 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1038 | dependencies: 1039 | emoji-regex "^8.0.0" 1040 | is-fullwidth-code-point "^3.0.0" 1041 | strip-ansi "^6.0.1" 1042 | 1043 | string_decoder@^1.1.1: 1044 | version "1.3.0" 1045 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1046 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1047 | dependencies: 1048 | safe-buffer "~5.2.0" 1049 | 1050 | string_decoder@~1.1.1: 1051 | version "1.1.1" 1052 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1053 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1054 | dependencies: 1055 | safe-buffer "~5.1.0" 1056 | 1057 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1058 | version "3.0.1" 1059 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1060 | integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== 1061 | dependencies: 1062 | ansi-regex "^2.0.0" 1063 | 1064 | strip-ansi@^6.0.1: 1065 | version "6.0.1" 1066 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1067 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1068 | dependencies: 1069 | ansi-regex "^5.0.1" 1070 | 1071 | strip-json-comments@~2.0.1: 1072 | version "2.0.1" 1073 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1074 | integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== 1075 | 1076 | supports-color@^7.1.0: 1077 | version "7.2.0" 1078 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1079 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1080 | dependencies: 1081 | has-flag "^4.0.0" 1082 | 1083 | table-layout@^3.0.0: 1084 | version "3.0.2" 1085 | resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-3.0.2.tgz#69c2be44388a5139b48c59cf21e73b488021769a" 1086 | integrity sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw== 1087 | dependencies: 1088 | "@75lb/deep-merge" "^1.1.1" 1089 | array-back "^6.2.2" 1090 | command-line-args "^5.2.1" 1091 | command-line-usage "^7.0.0" 1092 | stream-read-all "^3.0.1" 1093 | typical "^7.1.1" 1094 | wordwrapjs "^5.1.0" 1095 | 1096 | tar-fs@^2.0.0: 1097 | version "2.1.1" 1098 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" 1099 | integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== 1100 | dependencies: 1101 | chownr "^1.1.1" 1102 | mkdirp-classic "^0.5.2" 1103 | pump "^3.0.0" 1104 | tar-stream "^2.1.4" 1105 | 1106 | tar-stream@^2.1.4: 1107 | version "2.2.0" 1108 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" 1109 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 1110 | dependencies: 1111 | bl "^4.0.3" 1112 | end-of-stream "^1.4.1" 1113 | fs-constants "^1.0.0" 1114 | inherits "^2.0.3" 1115 | readable-stream "^3.1.1" 1116 | 1117 | tar@^6.0.2: 1118 | version "6.1.13" 1119 | resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" 1120 | integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== 1121 | dependencies: 1122 | chownr "^2.0.0" 1123 | fs-minipass "^2.0.0" 1124 | minipass "^4.0.0" 1125 | minizlib "^2.1.1" 1126 | mkdirp "^1.0.3" 1127 | yallist "^4.0.0" 1128 | 1129 | toidentifier@1.0.1: 1130 | version "1.0.1" 1131 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1132 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1133 | 1134 | tunnel-agent@^0.6.0: 1135 | version "0.6.0" 1136 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1137 | integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== 1138 | dependencies: 1139 | safe-buffer "^5.0.1" 1140 | 1141 | type-is@~1.6.18: 1142 | version "1.6.18" 1143 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1144 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1145 | dependencies: 1146 | media-typer "0.3.0" 1147 | mime-types "~2.1.24" 1148 | 1149 | typical@^4.0.0: 1150 | version "4.0.0" 1151 | resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" 1152 | integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== 1153 | 1154 | typical@^7.1.1: 1155 | version "7.1.1" 1156 | resolved "https://registry.yarnpkg.com/typical/-/typical-7.1.1.tgz#ba177ab7ab103b78534463ffa4c0c9754523ac1f" 1157 | integrity sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA== 1158 | 1159 | underscore@^1.10.2: 1160 | version "1.13.6" 1161 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" 1162 | integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== 1163 | 1164 | universalify@^2.0.0: 1165 | version "2.0.0" 1166 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 1167 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 1168 | 1169 | unpipe@1.0.0, unpipe@~1.0.0: 1170 | version "1.0.0" 1171 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1172 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1173 | 1174 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1175 | version "1.0.2" 1176 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1177 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1178 | 1179 | utils-merge@1.0.1: 1180 | version "1.0.1" 1181 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1182 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 1183 | 1184 | vary@^1, vary@~1.1.2: 1185 | version "1.1.2" 1186 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1187 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 1188 | 1189 | which-pm-runs@^1.0.0: 1190 | version "1.1.0" 1191 | resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" 1192 | integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== 1193 | 1194 | wide-align@^1.1.0: 1195 | version "1.1.5" 1196 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" 1197 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== 1198 | dependencies: 1199 | string-width "^1.0.2 || 2 || 3 || 4" 1200 | 1201 | wordwrapjs@^5.1.0: 1202 | version "5.1.0" 1203 | resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.0.tgz#4c4d20446dcc670b14fa115ef4f8fd9947af2b3a" 1204 | integrity sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg== 1205 | 1206 | wrappy@1: 1207 | version "1.0.2" 1208 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1209 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1210 | 1211 | yallist@^4.0.0: 1212 | version "4.0.0" 1213 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1214 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1215 | --------------------------------------------------------------------------------