From 71c124cc68dd170a4e9fd0f1c8b021d3af6332a2 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Tue, 26 May 2026 09:38:56 -0300 Subject: [PATCH] first commit --- .gitignore | 51 + README.md | 27 + angular.json | 133 + banco.sql | 367 + browserslist | 12 + e2e/protractor.conf.js | 32 + e2e/src/app.e2e-spec.ts | 23 + e2e/src/app.po.ts | 11 + e2e/tsconfig.json | 13 + karma.conf.js | 32 + package-lock.json | 12078 ++++++++++++++++ package.json | 59 + privacidade.html | 1 + privacidade.txt | 1 + server/.env | 9 + server/connector.js | 126 + server/controllers/agrobaseController.js | 168 + .../allteeth/sincroniaController.js | 27 + .../allteeth/usuariosController.js | 141 + server/controllers/arquivosController.js | 40 + server/controllers/bingoController.js | 105 + server/controllers/checkoutController.js | 265 + server/controllers/emailController.js | 100 + server/controllers/gcaController.js | 406 + server/controllers/noticiasController.js | 80 + server/controllers/oriontardproController.js | 24 + server/controllers/priorieController.js | 585 + server/controllers/sistemasController.js | 355 + server/controllers/sliderController.js | 75 + server/controllers/usuariosController.js | 267 + server/forever.json | 10 + ...9b-firebase-adminsdk-pf0od-2e672cfd0a.json | 12 + server/google-services.json | 39 + server/package-lock.json | 2558 ++++ server/package.json | 30 + server/server.js | 37 + src/app/agrobase/login/login.component.html | 1 + src/app/agrobase/login/login.component.scss | 0 src/app/agrobase/login/login.component.ts | 19 + .../versionamento.component.html | 115 + .../versionamento.component.scss | 50 + .../versionamento/versionamento.component.ts | 154 + src/app/app-routing.module.ts | 174 + src/app/app.component.html | 1 + src/app/app.component.scss | 186 + src/app/app.component.ts | 22 + src/app/app.module.ts | 109 + src/app/base-site/base-site.component.html | 78 + src/app/base-site/base-site.component.scss | 242 + src/app/base-site/base-site.component.ts | 78 + .../bingo-dashboard.component.html | 112 + .../bingo-dashboard.component.scss | 0 .../bingo-dashboard.component.ts | 176 + src/app/bingo-sort/bingo-sort.component.html | 23 + src/app/bingo-sort/bingo-sort.component.scss | 32 + src/app/bingo-sort/bingo-sort.component.ts | 176 + src/app/bingo/bingo.component.html | 1 + src/app/bingo/bingo.component.scss | 0 src/app/bingo/bingo.component.ts | 15 + .../cad-det-sistema.component.html | 239 + .../cad-det-sistema.component.scss | 706 + .../cad-det-sistema.component.ts | 223 + src/app/chaves/chaves.component.html | 195 + src/app/chaves/chaves.component.scss | 672 + src/app/chaves/chaves.component.ts | 320 + src/app/client/client.component.html | 157 + src/app/client/client.component.scss | 452 + src/app/client/client.component.ts | 70 + src/app/criarconta/criarconta.component.html | 137 + src/app/criarconta/criarconta.component.scss | 386 + src/app/criarconta/criarconta.component.ts | 341 + src/app/dashboard/dashboard.component.html | 79 + src/app/dashboard/dashboard.component.scss | 385 + src/app/dashboard/dashboard.component.ts | 272 + .../detalhes-sistema.component.html | 197 + .../detalhes-sistema.component.scss | 628 + .../detalhes-sistema.component.ts | 202 + src/app/easy-ava/easy-ava.component.html | 12 + src/app/easy-ava/easy-ava.component.scss | 6 + src/app/easy-ava/easy-ava.component.ts | 28 + src/app/edit-home/edit-home.component.html | 273 + src/app/edit-home/edit-home.component.scss | 363 + src/app/edit-home/edit-home.component.ts | 173 + src/app/home/home.component.html | 121 + src/app/home/home.component.scss | 478 + src/app/home/home.component.ts | 67 + src/app/login/login.component.html | 160 + src/app/login/login.component.scss | 337 + src/app/login/login.component.ts | 359 + src/app/models/agrobaseModel.ts | 27 + src/app/models/bingoModel.ts | 27 + src/app/models/dashboardModel.ts | 10 + src/app/models/noticiasModel.ts | 15 + src/app/models/orionModel.ts | 92 + src/app/models/produtosModel.ts | 10 + src/app/models/sistemasModel.ts | 90 + src/app/models/sliderModel.ts | 13 + src/app/models/usuariosModel.ts | 46 + src/app/models/variaveisModel.ts | 10 + src/app/noticias/noticias.component.html | 237 + src/app/noticias/noticias.component.scss | 660 + src/app/noticias/noticias.component.ts | 219 + .../orion-dashboard.component.html | 181 + .../orion-dashboard.component.scss | 30 + .../orion-dashboard.component.spec.ts | 25 + .../orion-dashboard.component.ts | 300 + src/app/pipes/tipo-arquivo-nome.pipe.ts | 45 + src/app/produtos/produtos.component.html | 240 + src/app/produtos/produtos.component.scss | 635 + src/app/produtos/produtos.component.ts | 171 + src/app/services/agrobase.service.ts | 55 + src/app/services/bingoService.ts | 94 + src/app/services/easy-ava.service.ts | 15 + src/app/services/geral.service.ts | 24 + src/app/services/noticias.service.ts | 61 + src/app/services/orionService.ts | 31 + src/app/services/produtosService.ts | 61 + src/app/services/sistemas.service.ts | 236 + src/app/services/slider.service.ts | 61 + src/app/services/usuarios.service.ts | 122 + src/app/sistemas/sistemas.component.html | 310 + src/app/sistemas/sistemas.component.scss | 646 + src/app/sistemas/sistemas.component.ts | 371 + src/app/slider/slider.component.html | 199 + src/app/slider/slider.component.scss | 581 + src/app/slider/slider.component.ts | 214 + src/app/users/users.component.html | 230 + src/app/users/users.component.scss | 500 + src/app/users/users.component.ts | 206 + src/assets/.gitkeep | 0 src/assets/Enderecos.txt | 1 + src/assets/background.jpg | Bin 0 -> 71244 bytes src/assets/loader.gif | Bin 0 -> 38472 bytes src/assets/logo.png | Bin 0 -> 126030 bytes src/assets/logo_escrito.png | Bin 0 -> 50113 bytes src/assets/sucripts/swiper.js | 5360 +++++++ src/assets/sucripts/swiper.min.css | 15 + src/environments/environment.prod.ts | 38 + src/environments/environment.ts | 38 + src/favicon.ico | Bin 0 -> 3479 bytes src/index.html | 21 + src/main.ts | 13 + src/polyfills.ts | 63 + src/styles.scss | 139 + src/test.ts | 20 + termos.html | 1 + termos.txt | 1 + tsconfig.app.json | 14 + tsconfig.json | 26 + tsconfig.spec.json | 18 + tslint.json | 92 + 151 files changed, 41061 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 angular.json create mode 100644 banco.sql create mode 100644 browserslist create mode 100644 e2e/protractor.conf.js create mode 100644 e2e/src/app.e2e-spec.ts create mode 100644 e2e/src/app.po.ts create mode 100644 e2e/tsconfig.json create mode 100644 karma.conf.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 privacidade.html create mode 100644 privacidade.txt create mode 100644 server/.env create mode 100644 server/connector.js create mode 100644 server/controllers/agrobaseController.js create mode 100644 server/controllers/allteeth/sincroniaController.js create mode 100644 server/controllers/allteeth/usuariosController.js create mode 100644 server/controllers/arquivosController.js create mode 100644 server/controllers/bingoController.js create mode 100644 server/controllers/checkoutController.js create mode 100644 server/controllers/emailController.js create mode 100644 server/controllers/gcaController.js create mode 100644 server/controllers/noticiasController.js create mode 100644 server/controllers/oriontardproController.js create mode 100644 server/controllers/priorieController.js create mode 100644 server/controllers/sistemasController.js create mode 100644 server/controllers/sliderController.js create mode 100644 server/controllers/usuariosController.js create mode 100644 server/forever.json create mode 100644 server/gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json create mode 100644 server/google-services.json create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/server.js create mode 100644 src/app/agrobase/login/login.component.html create mode 100644 src/app/agrobase/login/login.component.scss create mode 100644 src/app/agrobase/login/login.component.ts create mode 100644 src/app/agrobase/versionamento/versionamento.component.html create mode 100644 src/app/agrobase/versionamento/versionamento.component.scss create mode 100644 src/app/agrobase/versionamento/versionamento.component.ts create mode 100644 src/app/app-routing.module.ts create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/base-site/base-site.component.html create mode 100644 src/app/base-site/base-site.component.scss create mode 100644 src/app/base-site/base-site.component.ts create mode 100644 src/app/bingo-dashboard/bingo-dashboard.component.html create mode 100644 src/app/bingo-dashboard/bingo-dashboard.component.scss create mode 100644 src/app/bingo-dashboard/bingo-dashboard.component.ts create mode 100644 src/app/bingo-sort/bingo-sort.component.html create mode 100644 src/app/bingo-sort/bingo-sort.component.scss create mode 100644 src/app/bingo-sort/bingo-sort.component.ts create mode 100644 src/app/bingo/bingo.component.html create mode 100644 src/app/bingo/bingo.component.scss create mode 100644 src/app/bingo/bingo.component.ts create mode 100644 src/app/cad-det-sistema/cad-det-sistema.component.html create mode 100644 src/app/cad-det-sistema/cad-det-sistema.component.scss create mode 100644 src/app/cad-det-sistema/cad-det-sistema.component.ts create mode 100644 src/app/chaves/chaves.component.html create mode 100644 src/app/chaves/chaves.component.scss create mode 100644 src/app/chaves/chaves.component.ts create mode 100644 src/app/client/client.component.html create mode 100644 src/app/client/client.component.scss create mode 100644 src/app/client/client.component.ts create mode 100644 src/app/criarconta/criarconta.component.html create mode 100644 src/app/criarconta/criarconta.component.scss create mode 100644 src/app/criarconta/criarconta.component.ts create mode 100644 src/app/dashboard/dashboard.component.html create mode 100644 src/app/dashboard/dashboard.component.scss create mode 100644 src/app/dashboard/dashboard.component.ts create mode 100644 src/app/detalhes-sistema/detalhes-sistema.component.html create mode 100644 src/app/detalhes-sistema/detalhes-sistema.component.scss create mode 100644 src/app/detalhes-sistema/detalhes-sistema.component.ts create mode 100644 src/app/easy-ava/easy-ava.component.html create mode 100644 src/app/easy-ava/easy-ava.component.scss create mode 100644 src/app/easy-ava/easy-ava.component.ts create mode 100644 src/app/edit-home/edit-home.component.html create mode 100644 src/app/edit-home/edit-home.component.scss create mode 100644 src/app/edit-home/edit-home.component.ts create mode 100644 src/app/home/home.component.html create mode 100644 src/app/home/home.component.scss create mode 100644 src/app/home/home.component.ts create mode 100644 src/app/login/login.component.html create mode 100644 src/app/login/login.component.scss create mode 100644 src/app/login/login.component.ts create mode 100644 src/app/models/agrobaseModel.ts create mode 100644 src/app/models/bingoModel.ts create mode 100644 src/app/models/dashboardModel.ts create mode 100644 src/app/models/noticiasModel.ts create mode 100644 src/app/models/orionModel.ts create mode 100644 src/app/models/produtosModel.ts create mode 100644 src/app/models/sistemasModel.ts create mode 100644 src/app/models/sliderModel.ts create mode 100644 src/app/models/usuariosModel.ts create mode 100644 src/app/models/variaveisModel.ts create mode 100644 src/app/noticias/noticias.component.html create mode 100644 src/app/noticias/noticias.component.scss create mode 100644 src/app/noticias/noticias.component.ts create mode 100644 src/app/orion-dashboard/orion-dashboard.component.html create mode 100644 src/app/orion-dashboard/orion-dashboard.component.scss create mode 100644 src/app/orion-dashboard/orion-dashboard.component.spec.ts create mode 100644 src/app/orion-dashboard/orion-dashboard.component.ts create mode 100644 src/app/pipes/tipo-arquivo-nome.pipe.ts create mode 100644 src/app/produtos/produtos.component.html create mode 100644 src/app/produtos/produtos.component.scss create mode 100644 src/app/produtos/produtos.component.ts create mode 100644 src/app/services/agrobase.service.ts create mode 100644 src/app/services/bingoService.ts create mode 100644 src/app/services/easy-ava.service.ts create mode 100644 src/app/services/geral.service.ts create mode 100644 src/app/services/noticias.service.ts create mode 100644 src/app/services/orionService.ts create mode 100644 src/app/services/produtosService.ts create mode 100644 src/app/services/sistemas.service.ts create mode 100644 src/app/services/slider.service.ts create mode 100644 src/app/services/usuarios.service.ts create mode 100644 src/app/sistemas/sistemas.component.html create mode 100644 src/app/sistemas/sistemas.component.scss create mode 100644 src/app/sistemas/sistemas.component.ts create mode 100644 src/app/slider/slider.component.html create mode 100644 src/app/slider/slider.component.scss create mode 100644 src/app/slider/slider.component.ts create mode 100644 src/app/users/users.component.html create mode 100644 src/app/users/users.component.scss create mode 100644 src/app/users/users.component.ts create mode 100644 src/assets/.gitkeep create mode 100644 src/assets/Enderecos.txt create mode 100644 src/assets/background.jpg create mode 100644 src/assets/loader.gif create mode 100644 src/assets/logo.png create mode 100644 src/assets/logo_escrito.png create mode 100644 src/assets/sucripts/swiper.js create mode 100644 src/assets/sucripts/swiper.min.css create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/favicon.ico create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/polyfills.ts create mode 100644 src/styles.scss create mode 100644 src/test.ts create mode 100644 termos.html create mode 100644 termos.txt create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json create mode 100644 tslint.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4a963a --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +# These are some examples of commonly ignored file patterns. +# You should customize this list as applicable to your project. +# Learn more about .gitignore: +# https://www.atlassian.com/git/tutorials/saving-changes/gitignore + +# Node artifact files +node_modules/ +dist/ + +# Compiled Java class files +*.class + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# Package files +*.jar + +# Maven +target/ +dist/ + +# JetBrains IDE +.idea/ + +# Unit test reports +TEST*.xml + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv + + +*desktop.ini \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8800bc9 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# ZendionInc + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.1.3. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..16c1a43 --- /dev/null +++ b/angular.json @@ -0,0 +1,133 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ZendionInc": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/ZendionInc", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": false, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/pink-bluegrey.css", + "src/styles.scss", + "node_modules/bootstrap/dist/css/bootstrap.min.css" + ], + "scripts": [ + "node_modules/jquery/dist/jquery.js", + "node_modules/popper.js/dist/umd/popper.js", + "node_modules/bootstrap/dist/js/bootstrap.js", + "node_modules/chart.js/dist/Chart.js" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ZendionInc:build" + }, + "configurations": { + "production": { + "browserTarget": "ZendionInc:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ZendionInc:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/pink-bluegrey.css", + "src/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "ZendionInc:serve" + }, + "configurations": { + "production": { + "devServerTarget": "ZendionInc:serve:production" + } + } + } + } + } + }, + "defaultProject": "ZendionInc" +} \ No newline at end of file diff --git a/banco.sql b/banco.sql new file mode 100644 index 0000000..536852e --- /dev/null +++ b/banco.sql @@ -0,0 +1,367 @@ +-- MySQL dump 10.13 Distrib 8.0.20, for Win64 (x86_64) +-- +-- Host: 18.228.31.8 Database: zendioninc +-- ------------------------------------------------------ +-- Server version 8.0.22-0ubuntu0.20.04.2 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `chaves` +-- + +DROP TABLE IF EXISTS `chaves`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `chaves` ( + `idchaves` int NOT NULL AUTO_INCREMENT, + `licenca` varchar(150) DEFAULT NULL, + `data_criacao` datetime DEFAULT NULL, + `data_validade` datetime DEFAULT NULL, + `idusuarios` int DEFAULT NULL, + `usada` tinyint DEFAULT NULL, + `idsistemas` int DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idchaves`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `chaves` +-- + +LOCK TABLES `chaves` WRITE; +/*!40000 ALTER TABLE `chaves` DISABLE KEYS */; +/*!40000 ALTER TABLE `chaves` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `noticias` +-- + +DROP TABLE IF EXISTS `noticias`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `noticias` ( + `idnoticias` int NOT NULL AUTO_INCREMENT, + `titulo` varchar(150) DEFAULT NULL, + `descricao` longtext, + `habilitado` tinyint DEFAULT NULL, + `link` varchar(200) DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idnoticias`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `noticias` +-- + +LOCK TABLES `noticias` WRITE; +/*!40000 ALTER TABLE `noticias` DISABLE KEYS */; +INSERT INTO `noticias` VALUES (1,'Teste noticia 1','Aqui entra o texto da noticia de teste 1',1,'https://www.google.com.br/','2021-03-05 23:23:01','2021-03-05 23:23:16'); +/*!40000 ALTER TABLE `noticias` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `plataformas` +-- + +DROP TABLE IF EXISTS `plataformas`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `plataformas` ( + `idplataformas` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idplataformas`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `plataformas` +-- + +LOCK TABLES `plataformas` WRITE; +/*!40000 ALTER TABLE `plataformas` DISABLE KEYS */; +/*!40000 ALTER TABLE `plataformas` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sistemas` +-- + +DROP TABLE IF EXISTS `sistemas`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sistemas` ( + `idsistemas` int NOT NULL AUTO_INCREMENT, + `nome` varchar(150) DEFAULT NULL, + `descricao` varchar(150) DEFAULT NULL, + `versaoatual` varchar(45) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `idtiposdesistema` int DEFAULT NULL, + `idplataformas` int DEFAULT NULL, + `nome_install` varchar(150) DEFAULT NULL, + `notasdeatualizacao` longtext, + `idtiposlicenca` int DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idsistemas`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sistemas` +-- + +LOCK TABLES `sistemas` WRITE; +/*!40000 ALTER TABLE `sistemas` DISABLE KEYS */; +INSERT INTO `sistemas` VALUES (9,'FMovel','Sistema de gestão de concecionaria','1.0.0.1',1,1,1,'fmovel_install.exe','Primeira versão',1,'2021-02-25 23:10:06','2021-03-04 00:30:07'); +/*!40000 ALTER TABLE `sistemas` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sistemasdetalhes` +-- + +DROP TABLE IF EXISTS `sistemasdetalhes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sistemasdetalhes` ( + `idsistemasdetalhes` int NOT NULL AUTO_INCREMENT, + `idsistemas` int DEFAULT NULL, + `descricao` varchar(250) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idsistemasdetalhes`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sistemasdetalhes` +-- + +LOCK TABLES `sistemasdetalhes` WRITE; +/*!40000 ALTER TABLE `sistemasdetalhes` DISABLE KEYS */; +/*!40000 ALTER TABLE `sistemasdetalhes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sistemasusuario` +-- + +DROP TABLE IF EXISTS `sistemasusuario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sistemasusuario` ( + `idsistemasusuario` int NOT NULL AUTO_INCREMENT, + `idsistemas` int DEFAULT NULL, + `idusuarios` int DEFAULT NULL, + `data_download` datetime DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idsistemasusuario`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sistemasusuario` +-- + +LOCK TABLES `sistemasusuario` WRITE; +/*!40000 ALTER TABLE `sistemasusuario` DISABLE KEYS */; +/*!40000 ALTER TABLE `sistemasusuario` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `slides` +-- + +DROP TABLE IF EXISTS `slides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `slides` ( + `idslides` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `link` varchar(250) DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idslides`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `slides` +-- + +LOCK TABLES `slides` WRITE; +/*!40000 ALTER TABLE `slides` DISABLE KEYS */; +INSERT INTO `slides` VALUES (1,'TI',1,'undefined','2021-03-05 23:21:52','2021-03-05 23:22:04'),(2,'Inovacao',1,'undefined','2021-03-05 23:22:25','2021-03-05 23:22:30'); +/*!40000 ALTER TABLE `slides` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `tiposdesistema` +-- + +DROP TABLE IF EXISTS `tiposdesistema`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tiposdesistema` ( + `idtiposdesistema` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtiposdesistema`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `tiposdesistema` +-- + +LOCK TABLES `tiposdesistema` WRITE; +/*!40000 ALTER TABLE `tiposdesistema` DISABLE KEYS */; +/*!40000 ALTER TABLE `tiposdesistema` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `tiposdeusuario` +-- + +DROP TABLE IF EXISTS `tiposdeusuario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tiposdeusuario` ( + `idtiposdeusuario` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(45) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtiposdeusuario`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `tiposdeusuario` +-- + +LOCK TABLES `tiposdeusuario` WRITE; +/*!40000 ALTER TABLE `tiposdeusuario` DISABLE KEYS */; +INSERT INTO `tiposdeusuario` VALUES (1,'Administrador',1,'2021-03-05 23:20:05',NULL),(2,'Cliente',1,'2021-03-05 23:20:05',NULL); +/*!40000 ALTER TABLE `tiposdeusuario` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `tiposlicenca` +-- + +DROP TABLE IF EXISTS `tiposlicenca`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tiposlicenca` ( + `idtiposlicenca` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtiposlicenca`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `tiposlicenca` +-- + +LOCK TABLES `tiposlicenca` WRITE; +/*!40000 ALTER TABLE `tiposlicenca` DISABLE KEYS */; +/*!40000 ALTER TABLE `tiposlicenca` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `trocasenha` +-- + +DROP TABLE IF EXISTS `trocasenha`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `trocasenha` ( + `idtrocasenha` int NOT NULL AUTO_INCREMENT, + `idusuarios` int DEFAULT NULL, + `tag` varchar(250) DEFAULT NULL, + `usada` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtrocasenha`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `trocasenha` +-- + +LOCK TABLES `trocasenha` WRITE; +/*!40000 ALTER TABLE `trocasenha` DISABLE KEYS */; +/*!40000 ALTER TABLE `trocasenha` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `usuarios` +-- + +DROP TABLE IF EXISTS `usuarios`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `usuarios` ( + `idusuarios` int NOT NULL AUTO_INCREMENT, + `nome` varchar(150) DEFAULT NULL, + `usuario` varchar(45) DEFAULT NULL, + `senha` varchar(45) DEFAULT NULL, + `data_cadastro` datetime DEFAULT NULL, + `email` varchar(45) DEFAULT NULL, + `idtiposdeusuario` int DEFAULT NULL, + `cpf` varchar(45) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idusuarios`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `usuarios` +-- + +LOCK TABLES `usuarios` WRITE; +/*!40000 ALTER TABLE `usuarios` DISABLE KEYS */; +INSERT INTO `usuarios` VALUES (1,'Diego Freitas','ZENDION','Z210203!','2021-03-05 23:15:50','zendionmazinni@gmail.com',1,'425.855.768-41',1,'2021-03-05 23:15:50','2021-03-05 23:18:42'); +/*!40000 ALTER TABLE `usuarios` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-03-05 20:27:35 diff --git a/browserslist b/browserslist new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 0000000..73e4e68 --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..7d0e3a5 --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to ZendionInc!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 0000000..5776aa9 --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root h1')).getText() as Promise; + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..39b800f --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..8c274a5 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/ZendionInc'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..918df2e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12078 @@ +{ + "name": "zendion-inc", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.801.3.tgz", + "integrity": "sha512-gg6ZyJMiRYuzzmbpuDszrsE/hpwzoUnlOVoLNNzbACGBSDiqelC1mvGHb9JQM56Sy8gSjZn6RT0K2/Og79GoSg==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "rxjs": "6.4.0" + } + }, + "@angular-devkit/build-angular": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.801.3.tgz", + "integrity": "sha512-BmN48xepRzQN2h2L7k9MhEWSAmEJj8celtD9Tu9Gn2DeM0yh2TFW9OKFKJlqyF3vGd3at24bqHOXI4MtDeltQQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.3", + "@angular-devkit/build-optimizer": "0.801.3", + "@angular-devkit/build-webpack": "0.801.3", + "@angular-devkit/core": "8.1.3", + "@ngtools/webpack": "8.1.3", + "ajv": "6.10.0", + "autoprefixer": "9.6.0", + "browserslist": "4.6.3", + "caniuse-lite": "1.0.30000979", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.2.1", + "copy-webpack-plugin": "5.0.3", + "core-js": "3.1.4", + "file-loader": "4.0.0", + "glob": "7.1.4", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.1", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.7.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "1.0.0", + "rxjs": "6.4.0", + "sass": "1.22.2", + "sass-loader": "7.1.0", + "semver": "6.2.0", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.12", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "0.23.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser-webpack-plugin": "1.3.0", + "tree-kill": "1.2.1", + "webpack": "4.35.2", + "webpack-dev-middleware": "3.7.0", + "webpack-dev-server": "3.7.2", + "webpack-merge": "4.2.1", + "webpack-sources": "1.3.0", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.1.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30000979", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz", + "integrity": "sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw==", + "dev": true + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.801.3.tgz", + "integrity": "sha512-5wyzek1Ls7T9bh24yGDC/3Ss1YePpnOyBu0D8mJkByjPJjQr0xXR6UPx/7Idq6Y8BMeGO/+MiMOLZoUTPTIa0w==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.5.6", + "typescript": "3.4.5", + "webpack-sources": "1.3.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.801.3.tgz", + "integrity": "sha512-IuR1WKldZwrAQWlKCLv+MnNeR1tWFCSJ9wXAgKqvlAPiYHEvTvazRVbWerxgVFvL4MCOt2wYVz/AqQWVYAhwlQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.3", + "@angular-devkit/core": "8.1.3", + "rxjs": "6.4.0", + "webpack-merge": "4.2.1" + } + }, + "@angular-devkit/core": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.3.tgz", + "integrity": "sha512-Vj5fowuz27J+S74U1+MrSrJ7vI+OZC5HBOp4m7rrh/GcYlujcX3BUu0Bxi7LI1v90yDsr0s/iEAKsff05ByXiw==", + "dev": true, + "requires": { + "ajv": "6.10.0", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.1.3.tgz", + "integrity": "sha512-nz3b0uXu3w3PPLq4D+ersjeX/AyW3Amq7UwXa8lZFoJ0oc8cPjXW+h4D56rNw2GbOGZX7aaNe/Cxd9SBt0wF2A==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "rxjs": "6.4.0" + } + }, + "@angular/animations": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.1.3.tgz", + "integrity": "sha512-IdWz2EcF+8ZM7LSZ+Kc64RNoLQK7t7hJr+3nKuiTZDncIwMcV3yPn98Jz5BncLNcK0vkYju/hPqnWJgI/0+w6A==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.3.tgz", + "integrity": "sha512-ZwO5Sn720RA2YvBqud0JAHkZXjmjxM0yNzCO8RVtRE9i8Gl26Wk0j0nQeJkVm4zwv2QO8MwbKUKGTMt8evsokA==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } + } + }, + "@angular/cli": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.1.3.tgz", + "integrity": "sha512-8BuN+UW1etRGS2U8rnxLagcA/zCxAmrtH6cB943CecPkr3p9+VUlVXtrRU8lkQE/wdrGmJjS5qkG9TybTIPRwg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.3", + "@angular-devkit/core": "8.1.3", + "@angular-devkit/schematics": "8.1.3", + "@schematics/angular": "8.1.3", + "@schematics/update": "0.801.3", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.0", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.4.1", + "npm-package-arg": "6.1.0", + "open": "6.4.0", + "pacote": "9.5.1", + "read-package-tree": "5.3.1", + "semver": "6.2.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.0.tgz", + "integrity": "sha512-3NkLpm6I6kEgC8J0I9EZ0fouXc/mm5J9zqJFCgA2jGqmsL0O64I7Uvi3AmUMnnRqc6u7uLgVVnY4pyBQ03nCiw==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@angular/common": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.1.3.tgz", + "integrity": "sha512-AnTlYV+Y3HYjJsAIt2AkIJ63qphvu9RNIJSZS61zQ4YBty29aslAJ/jh3PSWD0Yj9UT/AgzquJhfhhNEuImDRw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.1.3.tgz", + "integrity": "sha512-mKeRkpPy/iBPGBCVQIPF9x4f1S68ilEYaQTTfHoLR0OfivEQsyGuf2GEegwbTosEBX3JF+0JHfCNvsAE1zI5Og==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.1.3.tgz", + "integrity": "sha512-rzlKU/xo6AzSPBLnJ/jeSwgojn/MaByTaGFG4THLRUizfGPqAsmppQ12Nmqr9faIiuG0k/izGSoWmppCJEK8FA==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.1.3.tgz", + "integrity": "sha512-45ocymDkXhmgluhaIX/O6IgqGPCLOlSYEXYpJ660QS1JgprKU7Ae9mWiNSmbBmT0OGV/sKKF8SNMQAGOHgio6Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.1.3.tgz", + "integrity": "sha512-NabNiUsR1XgrI1/T8hFwbTH0BMqhKd1riSTU+xyJ3qVbdmORq1xnf6/dLbljNGxViMU28P8hBXvyf1BoTS+HyQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.1.3.tgz", + "integrity": "sha512-9s2LWlRlBhUXZ0oWh5ojYKnQgXgYH/VifEXteRWmEJ0dlwDApgw5Jk6usstDhv09XQvLdoumMQwOXf07zjcJrQ==", + "dev": true + }, + "@angular/material": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.3.tgz", + "integrity": "sha512-SOczkIaqes+r+9XF/UUiokidfFKBpHkOPIaFK857sFD0FBNPvPEpOr5oHKCG3feERRwAFqHS7Wo2ohVEWypb5A==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.1.3.tgz", + "integrity": "sha512-ihjoJd3OCmn/LBpYEDeCYnYJ1JRzeY6xYySNBEHNHLc07FX0TTiNwiZJHjbKoxdjr7qe6cj6gpT51M77pRlKKw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.1.3.tgz", + "integrity": "sha512-tsZWp8aFZNvbJ1TgP75GEfrwLe4SFW02kzEF12o7XlGU/iwnMjEs356rGHeueJZuWMFGS8PLL4mqPic7R5p53Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.1.3.tgz", + "integrity": "sha512-MOalKqqWcTaosHLNE5nmk5rsLRp3jE1PobGaFtbUJKTTZW0vS4rcr6iiRg2bZRv/srGixDXvNLenvYjTpzzTdw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@ngtools/webpack": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.1.3.tgz", + "integrity": "sha512-gSsLMdCJsQp7ZKF5Tl/yfns1eMtmc89J+yoWiOLoSHb8cupP2G4o7DL8wGkylsyALu5eomF/RSnivC9SGvdxYQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.3.0" + } + }, + "@schematics/angular": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.1.3.tgz", + "integrity": "sha512-DsR/LDC7Vifw78pDew4HhUYvhKM5gyY8muvJqqfAU9DLq4yZ5ixus7jpqWXNeL3ZalFcH1/yQW20nzLQiLETkA==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "@angular-devkit/schematics": "8.1.3" + } + }, + "@schematics/update": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.801.3.tgz", + "integrity": "sha512-Y4HlG1eMUMlu62Kw2ic1+hF9+kKJlP35o+DO4t2LHKe/Kw+P+HJUeEpr/jocUxV56LDxF43BT3hkc9yJGIQ/Yw==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "@angular-devkit/schematics": "8.1.3", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.1", + "rxjs": "6.4.0", + "semver": "6.2.0", + "semver-intersect": "1.4.0" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/swiper": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/swiper/-/swiper-4.4.11.tgz", + "integrity": "sha512-o+tYRUyVK0g2k2NGOPdn671RHoKiVjzvt+aaPkKbf6lyDfKWmAKQ7ThCs1u+5GLBWAnJsHdE/aitykpms1P7jQ==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "angular2-useful-swiper": { + "version": "8.0.1-beta.1", + "resolved": "https://registry.npmjs.org/angular2-useful-swiper/-/angular2-useful-swiper-8.0.1-beta.1.tgz", + "integrity": "sha512-vz3tagg/tgRHNzUPnmnhEsEhiOoQYlVEGu4tZ4PIynUzQedADaYykTjY9y+HvjbMgKhPQVH4TW6R2CcXrhJEXw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", + "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "dev": true, + "requires": { + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.16", + "postcss-value-parser": "^3.3.1" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "bootstrap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001197", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz", + "integrity": "sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chart.js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", + "integrity": "sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "dev": true, + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + }, + "dependencies": { + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.0.tgz", + "integrity": "sha512-hX+4kt2Rcwu+x1U0SsEFCn1quURjEjPEGH/cPBlpME/IidGimAdwfMU+B+xDr7et/KTR7VH2+ZqWGerv4NGs2w==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + } + }, + "core-js": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "detect-passive-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/detect-passive-events/-/detect-passive-events-1.0.5.tgz", + "integrity": "sha512-foW7Q35wwOCxVzW0xLf5XeB5Fhe7oyRgvkBYdiP9IWgLMzjqUqTvsJv9ymuEWGjY6AoDXD3OC294+Z9iuOw0QA==" + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom7": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.5.tgz", + "integrity": "sha512-xnhwVgyOh3eD++/XGtH+5qBwYTgCm0aW91GFgPJ3XG+jlsRLyJivnbP0QmUBFhI+Oaz9FV0s7cxgXHezwOEBYA==", + "requires": { + "ssr-window": "^2.0.0" + }, + "dependencies": { + "ssr-window": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-2.0.0.tgz", + "integrity": "sha512-NXzN+/HPObKAx191H3zKlYomE5WrVIkoCB5IaSdvKokxTpjBdWfr0RaP+1Z5KOfDT0ZVz+2tdtiBkhsEQ9p+0A==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.206.tgz", + "integrity": "sha512-djq9Ehxs2rwPh7pyY1GMf8vkOWPoK8eoMp913E4t0UaEXvbnOsiSowBBHI8YoN4aKVQJjvxQp5I0LdZkT3Uzmw==", + "dev": true + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.0.0.tgz", + "integrity": "sha512-roAbL6IdSGczwfXxhMi6Zq+jD4IfUpL0jWHD7fvmjdOVb7xBfdRUHe4LpBgO23VtVK5AW1OlWZo0p34Jvx3iWg==", + "dev": true, + "requires": { + "loader-utils": "^1.2.2", + "schema-utils": "^1.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", + "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz", + "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", + "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz", + "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "license-webpack-plugin": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.1.tgz", + "integrity": "sha512-TiarZIg5vkQ2rGdYJn2+5YxO/zqlqjpK5IVglr7OfmrN1sBCakS+PQrsP2uC5gtve1ZDb9WMSUMlmHDQ0FoW4w==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-fetch-happen": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.2.tgz", + "integrity": "sha512-YMJrAjHSb/BordlsDEcVcPyTbiJKkzqMf48N8dAJZT9Zjctrkb6Yg4TY9Sq2AwSIQJFn5qBBKVTYt3vP5FMIHA==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.3.3", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", + "integrity": "sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "ng5-slider": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/ng5-slider/-/ng5-slider-1.2.6.tgz", + "integrity": "sha512-xu3qfnCqVNndRY8DsdlsU4jKayJ6KTVlUQwSTWqRqplxY0d6QhK1V1mseWwcovZG7mOTqKBYymJL3zmX8+SbHQ==", + "requires": { + "detect-passive-events": "^1.0.4", + "rxjs": "^5.5.6", + "rxjs-compat": "^6.5.2", + "tslib": "^1.7.1" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==" + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", + "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.1.tgz", + "integrity": "sha512-VQCEZlydXw4AwLROAXWUR7QDfe2Y8Id/vpAgp6TI1/H78a4SiQ1kQrKZALm5/zxM5n4HIi+aYb+idUAV/RuY0Q==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.2", + "npm-package-arg": "^6.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.1.tgz", + "integrity": "sha512-Zqvczvf/zZ7QNosdE9uTC7SRuvSs9tFqRkF6cJl+2HH7COBnx4BRAGpeXJlrbN+mM0CMHpbi620xdEHhCflghA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", + "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "primeng": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/primeng/-/primeng-8.1.0.tgz", + "integrity": "sha512-jttemCtRq4LJf8WE5HaVqpdmPAecOqFCJIc53OqZrUfaChX7V7OV3evFIvscWqK7wQecv7uS31ROqQT87VGzvA==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", + "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.1.tgz", + "integrity": "sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "rxjs-compat": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.6.7.tgz", + "integrity": "sha512-szN4fK+TqBPOFBcBcsR0g2cmTTUF/vaFEOZNuSdfU8/pGFnNmmn2u8SystYXG1QMrjOPBc6XTKHMVfENDf6hHw==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.2.tgz", + "integrity": "sha512-enuQuy/CbfrZLA2vOy9tB7CK7pP5bZllnMbr5nPGWCFelwt0EMUVGC11gsv9rybkWc8pp/NKVY/c5+AKyjbnXg==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socks": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssr-window": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-1.0.1.tgz", + "integrity": "sha512-dgFqB+f00LJTEgb6UXhx0h+SrG50LJvti2yMKMqAgzfUmUXZrLSv2fjULF7AWGwK25EXu8+smLR3jYsJQChPsg==" + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "swiper": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-4.5.1.tgz", + "integrity": "sha512-se6I7PWWu950NAMXXT+ENtF/6SVb8mPyO+bTfNxbQBILSeLqsYp3Ndap+YOA0EczOIUlea274PKejT6gKZDseA==", + "requires": { + "dom7": "^2.1.3", + "ssr-window": "^1.0.1" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "terser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", + "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "loader-utils": "^1.2.3", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.0.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslint": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", + "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.35.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.2.tgz", + "integrity": "sha512-TZAmorNymV4q66gAM/h90cEjG+N3627Q2MnkSgKlX/z3DlNVKUtqy57lz1WmZU2+FUZwzM+qm7cGaO95PyrX5A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", + "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.20", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.1.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.1.0.tgz", + "integrity": "sha512-iQ9KTTmmN5fhfc2KMR7CcDblvcrg1QQ4pXymqZ3cRZF8L0890YLBcEqlIsGPdxoFwghyN8RA1pCEhCKuTF4Lkw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c79616e --- /dev/null +++ b/package.json @@ -0,0 +1,59 @@ +{ + "name": "zendion-inc", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~8.1.3", + "@angular/cdk": "~8.2.3", + "@angular/common": "~8.1.3", + "@angular/compiler": "~8.1.3", + "@angular/core": "~8.1.3", + "@angular/forms": "~8.1.3", + "@angular/material": "^8.2.3", + "@angular/platform-browser": "~8.1.3", + "@angular/platform-browser-dynamic": "~8.1.3", + "@angular/router": "~8.1.3", + "angular2-useful-swiper": "^8.0.1-beta.1", + "bootstrap": "^4.6.0", + "chart.js": "^2.7.3", + "hammerjs": "^2.0.8", + "jquery": "^3.6.0", + "ng5-slider": "^1.2.6", + "popper.js": "^1.16.1", + "primeng": "^8.1.0", + "rxjs": "~6.4.0", + "swiper": "^4.5.1", + "tslib": "^1.14.1", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.801.3", + "@angular/cli": "~8.1.3", + "@angular/compiler-cli": "~8.1.3", + "@angular/language-service": "~8.1.3", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "^2.0.8", + "@types/node": "~8.9.4", + "@types/swiper": "^4.4.11", + "codelyzer": "^5.2.2", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.5.4", + "protractor": "^5.4.4", + "ts-node": "~7.0.0", + "tslint": "~5.15.0", + "typescript": "~3.4.3" + } +} diff --git a/privacidade.html b/privacidade.html new file mode 100644 index 0000000..26ef38b --- /dev/null +++ b/privacidade.html @@ -0,0 +1 @@ +

Política Privacidade

A sua privacidade é importante para nós. É política do Zendion Inc respeitar a sua privacidade em relação a qualquer informação sua que possamos coletar no site Zendion Inc, e outros sites que possuímos e operamos.

Solicitamos informações pessoais apenas quando realmente precisamos delas para lhe fornecer um serviço. Fazemo-lo por meios justos e legais, com o seu conhecimento e consentimento. Também informamos por que estamos coletando e como será usado.

Apenas retemos as informações coletadas pelo tempo necessário para fornecer o serviço solicitado. Quando armazenamos dados, protegemos dentro de meios comercialmente aceitáveis ​​para evitar perdas e roubos, bem como acesso, divulgação, cópia, uso ou modificação não autorizados.

Não compartilhamos informações de identificação pessoal publicamente ou com terceiros, exceto quando exigido por lei.

O nosso site pode ter links para sites externos que não são operados por nós. Esteja ciente de que não temos controle sobre o conteúdo e práticas desses sites e não podemos aceitar responsabilidade por suas respectivas políticas de privacidade.

Você é livre para recusar a nossa solicitação de informações pessoais, entendendo que talvez não possamos fornecer alguns dos serviços desejados.

O uso continuado de nosso site será considerado como aceitação de nossas práticas em torno de privacidade e informações pessoais. Se você tiver alguma dúvida sobre como lidamos com dados do usuário e informações pessoais, entre em contacto connosco.

Compromisso do Usuário

O usuário se compromete a fazer uso adequado dos conteúdos e da informação que o Zendion Inc oferece no site e com caráter enunciativo, mas não limitativo:

  • A) Não se envolver em atividades que sejam ilegais ou contrárias à boa fé a à ordem pública;
  • B) Não difundir propaganda ou conteúdo de natureza racista, xenofóbica, onde apostar ou azar, qualquer tipo de pornografia ilegal, de apologia ao terrorismo ou contra os direitos humanos;
  • C) Não causar danos aos sistemas físicos (hardwares) e lógicos (softwares) do Zendion Inc, de seus fornecedores ou terceiros, para introduzir ou disseminar vírus informáticos ou quaisquer outros sistemas de hardware ou software que sejam capazes de causar danos anteriormente mencionados.

Mais informações

Esperemos que esteja esclarecido e, como mencionado anteriormente, se houver algo que você não tem certeza se precisa ou não, geralmente é mais seguro deixar os cookies ativados, caso interaja com um dos recursos que você usa em nosso site.

Esta política é efetiva a partir de 5 December 2022 22:21

\ No newline at end of file diff --git a/privacidade.txt b/privacidade.txt new file mode 100644 index 0000000..cbcf476 --- /dev/null +++ b/privacidade.txt @@ -0,0 +1 @@ +Política PrivacidadeA sua privacidade é importante para nós. É política do Zendion Inc respeitar a sua privacidade em relação a qualquer informação sua que possamos coletar no site Zendion Inc, e outros sites que possuímos e operamos.Solicitamos informações pessoais apenas quando realmente precisamos delas para lhe fornecer um serviço. Fazemo-lo por meios justos e legais, com o seu conhecimento e consentimento. Também informamos por que estamos coletando e como será usado.Apenas retemos as informações coletadas pelo tempo necessário para fornecer o serviço solicitado. Quando armazenamos dados, protegemos dentro de meios comercialmente aceitáveis ​​para evitar perdas e roubos, bem como acesso, divulgação, cópia, uso ou modificação não autorizados.Não compartilhamos informações de identificação pessoal publicamente ou com terceiros, exceto quando exigido por lei.O nosso site pode ter links para sites externos que não são operados por nós. Esteja ciente de que não temos controle sobre o conteúdo e práticas desses sites e não podemos aceitar responsabilidade por suas respectivas políticas de privacidade.Você é livre para recusar a nossa solicitação de informações pessoais, entendendo que talvez não possamos fornecer alguns dos serviços desejados.O uso continuado de nosso site será considerado como aceitação de nossas práticas em torno de privacidade e informações pessoais. Se você tiver alguma dúvida sobre como lidamos com dados do usuário e informações pessoais, entre em contacto connosco.Compromisso do UsuárioO usuário se compromete a fazer uso adequado dos conteúdos e da informação que o Zendion Inc oferece no site e com caráter enunciativo, mas não limitativo:A) Não se envolver em atividades que sejam ilegais ou contrárias à boa fé a à ordem pública;B) Não difundir propaganda ou conteúdo de natureza racista, xenofóbica, onde apostar ou azar, qualquer tipo de pornografia ilegal, de apologia ao terrorismo ou contra os direitos humanos;C) Não causar danos aos sistemas físicos (hardwares) e lógicos (softwares) do Zendion Inc, de seus fornecedores ou terceiros, para introduzir ou disseminar vírus informáticos ou quaisquer outros sistemas de hardware ou software que sejam capazes de causar danos anteriormente mencionados.Mais informaçõesEsperemos que esteja esclarecido e, como mencionado anteriormente, se houver algo que você não tem certeza se precisa ou não, geralmente é mais seguro deixar os cookies ativados, caso interaja com um dos recursos que você usa em nosso site.Esta política é efetiva a partir de 5 December 2022 22:21 \ No newline at end of file diff --git a/server/.env b/server/.env new file mode 100644 index 0000000..b6934b2 --- /dev/null +++ b/server/.env @@ -0,0 +1,9 @@ +SMTP_HOST=email-smtp.sa-east-1.amazonaws.com +SMTP_PORT=587 +SMTP_SECURE=false + +SMTP_USER=AKIAWD3MQRM2CPUVNA4P +SMTP_PASS=BEfWvd2+A098qv5QlUSeUwyajG+ID8XSAwKslE3+qxRU + +SMTP_FROM_EMAIL=contato@zendioninc.com.br +SMTP_FROM_NAME=Zendion, INC. \ No newline at end of file diff --git a/server/connector.js b/server/connector.js new file mode 100644 index 0000000..91a9fea --- /dev/null +++ b/server/connector.js @@ -0,0 +1,126 @@ +var mysql = require('mysql'); + +//#region ZENDION INC +var MySQLConfig = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'zendioninc', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoMySQL = function AbreConexaoMySQL() { + global.mysqlConnection = mysql.createPool(MySQLConfig); + console.log("MySQL Conectado! ZENDION INC"); +} +AbreConexaoMySQL(); + +global.ExecuteQuery = function ExecuteQuery(sqlQuery, req, res, params = [], callback = null) { + mysqlConnection.query(sqlQuery, params, function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(JSON.stringify({ "status": ((error) ? 500 : 200), "error": error, "response": results })) + }); +} + +//#endregion + +//#region GCA Control +var ConfigMySQLGCA = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'GCA', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoGCAMySQL = function AbreConexaoGCAMySQL() { + global.ConexaoMySQL_GCA = mysql.createPool(ConfigMySQLGCA); + console.log("MySQL Conectado! GCA Control"); +} +AbreConexaoGCAMySQL(); + +global.ExecuteQueryGCA = function ExecuteQueryGCA(sqlQuery, req, res, params = [], callback = null) { + ConexaoMySQL_GCA.query(sqlQuery, params, function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(JSON.stringify({ "status": ((error) ? 500 : 200), "error": error, "response": results })) + }); +} + + +//#endregion + +//#region PRIORIE +var ConfigMySQLPriorie = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'priorie', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoPriorieMySQL = function AbreConexaoPriorieMySQL() { + global.ConexaoMySQL_Priorie = mysql.createPool(ConfigMySQLPriorie); + console.log("MySQL Conectado! Priorie"); +} +AbreConexaoPriorieMySQL(); + +global.ExecuteQueryPriorie = function ExecutarQuery(sqlQuery, req, res, callback = null) { + ConexaoMySQL_Priorie.query(sqlQuery, function(error, results, fields) { + let Status = 0; + if (!error) { + Status = 200; + console.log(req.originalUrl + " success 200"); + } + else { + Status = 500; + console.log(req.originalUrl + " error 500"); + results = []; + } + res.send(JSON.stringify({ "status": Status, "response": results, "error": error })); + try { + callback(Status, results['insertId']); + } + catch (e) {} + }); +} + + +//#endregion + +//#region AGROBASE +var ConfigMySQLAgro = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'agrobase', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoAgroMySQL = function AbreConexaoAgroMySQL() { + global.ConexaoMySQL_Agro = mysql.createPool(ConfigMySQLAgro); + console.log("MySQL Conectado! AgroBase"); +} +AbreConexaoAgroMySQL(); + +global.ExecuteQueryAgro = function ExecuteQueryAgro(sqlQuery, req, res, params = [], callback = null) { + ConexaoMySQL_Agro.query(sqlQuery, params, function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(JSON.stringify({ "status": ((error) ? 500 : 200), "error": error, "response": results })) + }); +} + + +//#endregion + diff --git a/server/controllers/agrobaseController.js b/server/controllers/agrobaseController.js new file mode 100644 index 0000000..8f2e8ca --- /dev/null +++ b/server/controllers/agrobaseController.js @@ -0,0 +1,168 @@ +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); +const unzipper = require('unzipper'); +const fs = require('fs'); +const path = require('path'); + +// Defina o caminho do arquivo .vsf +const vsfFilePath = path.join('/var/www/html/agrobase/downloads/version_files.vsf'); + +var routes = function () { + + router.get('/getVsfData', (req, res) => { + fs.readFile(vsfFilePath, 'utf8', (err, data) => { + if (err) { + console.error("Erro ao ler o arquivo .vsf:", err); + return res.status(500).json({ message: "Erro ao ler o arquivo .vsf" }); + } + + // Tenta converter o conteúdo em JSON + try { + const jsonData = JSON.parse(data); + res.json(jsonData); + } catch (parseError) { + console.error("Erro ao analisar o arquivo .vsf:", parseError); + res.status(500).json({ message: "Erro ao analisar o conteúdo do arquivo .vsf" }); + } + }); + }); + + router.post('/uploadTrainFiles', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; // Limite de tamanho do arquivo + form.parse(req, async function (err, fields, files) { + if (err) { + console.error("Erro ao processar o arquivo:", err); + return res.status(500).send("Erro no processamento"); + } + + const nomeOperacao = fields.operacaoId; + const arquivoZipPath = files['imagens.zip'].path; + const dirDestino = '/var/www/html/agrobase/trainfiles/'; + + try { + // Certifique-se de que o diretório de destino existe + if (!fs.existsSync(dirDestino)) { + fs.mkdirSync(dirDestino, { recursive: true }); + } + + // Caminho completo do diretório para esta operação específica + const dirOperacao = path.join(dirDestino, nomeOperacao); + + // Certifique-se de que o diretório da operação existe + if (!fs.existsSync(dirOperacao)) { + fs.mkdirSync(dirOperacao, { recursive: true }); + } + + // Abrir o arquivo zip e extrair as imagens com as subpastas + fs.createReadStream(arquivoZipPath) + .pipe(unzipper.Parse()) + .on('entry', async function (entry) { + const fileName = entry.path; + const type = entry.type; // 'Directory' ou 'File' + + if (type === 'File' && fileName.endsWith('.jpg')) { + // Caminho de destino da imagem extraída (mantém a subpasta, se houver) + const caminhoImagem = path.join(dirOperacao, fileName); + const dirImagem = path.dirname(caminhoImagem); + + // Certifique-se de que a subpasta da imagem existe + if (!fs.existsSync(dirImagem)) { + fs.mkdirSync(dirImagem, { recursive: true }); + } + + // Salvar a imagem no diretório correto + entry.pipe(fs.createWriteStream(caminhoImagem)); + } else { + entry.autodrain(); // Ignorar diretórios ou arquivos não suportados + } + }) + .on('close', () => { + console.log("Arquivo descompactado com sucesso e imagens sincronizadas."); + res.send(true); + }); + } catch (error) { + console.error("Erro ao descompactar o arquivo:", error); + res.status(500).send("Erro no processamento do arquivo ZIP"); + } + }); + }); + + router.post('/uploadVersionFiles', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; // Limite de tamanho do arquivo + + form.parse(req, async function (err, fields, files) { + if (err) { + console.error("Erro ao processar o arquivo:", err); + return res.status(500).send("Erro no processamento"); + } + + const file = files.file; + const fileName = fields.fileName; // Nome do arquivo formatado + const destino = `/var/www/html/agrobase/downloads/${fileName}`; + + fs.copyFile(file.path, destino, (err) => { + if (err) { + console.error("Erro ao salvar o arquivo:", err); + return res.status(500).send("Erro ao salvar o arquivo"); + } + res.status(200).send({ filePath: destino }); + }); + }); + }); + + router.post('/deleteVersionFile', (req, res) => { + const { filePath } = req.body; + + if (!filePath) { + return res.status(400).send("Caminho do arquivo não fornecido."); + } + + const downloadsDir = '/var/www/html/agrobase/downloads'; + const fullPath = path.join(downloadsDir, path.basename(filePath)); + + fs.access(fullPath, fs.constants.F_OK, (err) => { + if (err) { + console.error("Arquivo não encontrado:", err); + return res.status(404).send("Arquivo não encontrado."); + } + + fs.unlink(fullPath, (err) => { + if (err) { + console.error("Erro ao excluir o arquivo:", err); + return res.status(500).send("Erro ao excluir o arquivo."); + } + + res.status(200).send({ message: "Arquivo excluído com sucesso." }); + }); + }); + }); + + router.post('/updateVsfFile', (req, res) => { + const jsonData = req.body.data; // Dados JSON do Angular + + fs.writeFile(vsfFilePath, jsonData, 'utf8', (err) => { + if (err) { + console.error("Erro ao atualizar o arquivo .vsf:", err); + return res.status(500).send("Erro ao salvar o arquivo .vsf"); + } + res.status(200).send("Arquivo .vsf atualizado com sucesso"); + }); + }); + + router.post('/login', function (req, res) { + let usuario = req.body.usuario; + let senha = req.body.senha; + const sqlQuery = `SELECT + nome + FROM usuarios + WHERE usuario = '${usuario}' AND senha = '${senha}';`; + ExecuteQueryAgro(sqlQuery, req, res); + }); + + return router; +} + +module.exports = routes; diff --git a/server/controllers/allteeth/sincroniaController.js b/server/controllers/allteeth/sincroniaController.js new file mode 100644 index 0000000..5f0b2c4 --- /dev/null +++ b/server/controllers/allteeth/sincroniaController.js @@ -0,0 +1,27 @@ +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/backupDump/:idusuarios', (req, res) => { + const idusuarios = parseInt(req.params.idusuarios); + const fs = require('fs'); + const shell = require('shelljs'); + const Diretorio = '/var/www/html/sistemas/5/backups/usuario_' + idusuarios + '/'; + if (!fs.existsSync(Diretorio)) { + fs.mkdirSync(Diretorio); + } + const Arquivo = Diretorio + 'dump.sql'; + shell.exec('mysqldump -uroot -pZ210203! Allteeth > ' + Arquivo, function(sucesso) { + fs.readFile(Arquivo, (err, data) => { + console.log("/backupDump success 200"); + res.send(JSON.stringify({"arquivo": Buffer.from(data).toString()})); + }); + + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/allteeth/usuariosController.js b/server/controllers/allteeth/usuariosController.js new file mode 100644 index 0000000..d0a47c4 --- /dev/null +++ b/server/controllers/allteeth/usuariosController.js @@ -0,0 +1,141 @@ +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/getUsuarios', function (req, res, next) { + const sqlQuery = `SELECT * FROM usuarios;`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/getUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/getUsuarios success 200"); + } + }); + }); + + router.get('/getUsuarioByID/:idusuarios', function (req, res, next) { + let idusuarios = req.params.idusuarios; + const sqlQuery = `SELECT * FROM usuarios WHERE idusuarios = ${idusuarios};`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/getUsuarioByID error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/getUsuarioByID success 200"); + } + }); + }); + + router.post('/authUser', function (req, res, next) { + let usuario = req.body.Usuario; + let senha = req.body.Senha; + const sqlQuery = ` + SELECT + idusuarios AS IDUsuario, + nome AS Nome, + data_cadastramento AS DataCadastramento, + null AS Permissoes + FROM + usuarios + WHERE + usuario = '${usuario}' + AND + senha = '${senha}' + AND + habilitado = 1;`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(null) + console.log("/users/authUser error 500"); + } + else { + res.send(results[0]); + console.log("/users/authUser success 200"); + } + }); + }); + + router.post('/insertUsuarios', function (req, res, next) { + let idusuarios = req.body.idusuarios; + let usuario = req.body.usuario; + let senha = req.body.senha; + let habilitado = req.body.habilitado ? 1 : 0; + let nome = req.body.nome; + let data_cadastramento = req.body.data_cadastramento; + + const sqlQuery = `INSERT INTO + usuarios (usuario, senha, habilitado, nome, data_cadastramento) + VALUES (UPPER('${usuario}'), UPPER('${senha}'), ${habilitado}, '${nome}', '${data_cadastramento}');`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/insertUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/insertUsuarios success 200"); + } + }); + }); + + router.patch('/updateUsuarios', function (req, res, next) { + let idusuarios = req.body.idusuarios; + let usuario = req.body.usuario; + let senha = req.body.senha; + let habilitado = req.body.habilitado ? 1 : 0; + let nome = req.body.nome; + let data_cadastramento = req.body.data_cadastramento; + + const sqlQuery = ` + UPDATE + usuarios + SET + usuario = UPPER('${usuario}'), + senha = UPPER('${senha}'), + habilitado = ${habilitado}, + nome = '${nome}', + data_cadastramento = '${data_cadastramento}' + WHERE + idusuarios = ${idusuarios};`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/updateUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/updateUsuarios success 200"); + } + }); + }); + + router.delete('/deleteUsuarios/:idusuarios', function (req, res, next) { + let idusuarios = req.params.idusuarios; + + const sqlQuery = ` + DELETE FROM + usuarios + WHERE + idusuarios = ${idusuarios};`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/deleteUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/deleteUsuarios success 200"); + } + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/arquivosController.js b/server/controllers/arquivosController.js new file mode 100644 index 0000000..237763f --- /dev/null +++ b/server/controllers/arquivosController.js @@ -0,0 +1,40 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var nome = fields.nome; + var pathImagem = files.arquivo.path; + var dir = '/var/www/html/' + fields.caminho; + + fs.rename(pathImagem, dir + nome, function (err) { + console.log("arquivo copiado com sucesso"); + res.send(true); + }) + }); + }); + + router.post('/editaConfig', (req, res) => { + var fs = require('fs'); + var content = req.body.content; + var path = "/var/www/html/assets/Enderecos.txt"; + fs.writeFile(path, content, function (erro) { + if (erro) { + throw erro; + } + else { + res.send(true); + } + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/bingoController.js b/server/controllers/bingoController.js new file mode 100644 index 0000000..bd21144 --- /dev/null +++ b/server/controllers/bingoController.js @@ -0,0 +1,105 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/getAllSorteios', function (req, res) { + ExecuteQuery(`SELECT idbingosorteios, descricao, rodada, date_format(data_sorteio, '%d/%m/%Y') as data_sorteio, n_max, participantes_max FROM bingosorteios;`, req, res); + }); + + router.get('/getSorteiosRealizar', function (req, res) { + ExecuteQuery(`SELECT * FROM bingosorteios where realizado = 0;`, req, res); + }); + + router.get('/getAllCartelas', function (req, res) { + ExecuteQuery(`SELECT * FROM bingocartelas;`, req, res); + }); + + router.get('/getCartelasSorteio/:idbingosorteios', function (req, res) { + const idbingosorteios = parseInt(req.params.idbingosorteios); + ExecuteQuery(`SELECT * FROM bingocartelas where idbingosorteios = ? order by canhoto asc;`, req, res, [idbingosorteios]); + }); + + router.get('/getCartelasVendidasSorteio/:idbingosorteios', function (req, res) { + const idbingosorteios = parseInt(req.params.idbingosorteios); + ExecuteQuery(`SELECT *, 1 as 'Acertos' FROM bingocartelas where idbingosorteios = ? and nome is not null order by canhoto asc;`, req, res, [idbingosorteios]); + }); + + router.post('/insertBingoSorteio', function (req, res) { + const descricao = req.body.descricao; + const rodada = parseInt(req.body.rodada); + const data_sorteio = req.body.data_sorteio; + const n_max = parseInt(req.body.n_max); + const participantes_max = parseInt(req.body.participantes_max); + ExecuteQuery(`insert into bingosorteios (descricao, rodada, data_sorteio, n_max, participantes_max) values (?, ?, ?, ?, ?);`, req, res, [descricao, rodada, data_sorteio, n_max, participantes_max]); + }); + + router.post('/updateBingoSorteio', function (req, res) { + const idbingosorteios = parseInt(req.body.idbingosorteios); + const descricao = req.body.descricao; + const rodada = parseInt(req.body.rodada); + const data_sorteio = req.body.data_sorteio; + const n_max = parseInt(req.body.n_max); + const participantes_max = parseInt(req.body.participantes_max); + const realizado = req.body.realizado ? 1 : 0; + ExecuteQuery(`update bingosorteios set descricao = ?, rodada = ?, data_sorteio = ?, n_max = ?, participantes_max = ?, realizado = ? where idbingosorteios = ?;`, req, res, [descricao, rodada, data_sorteio, n_max, participantes_max, realizado, idbingosorteios]); + }); + + router.delete('/deleteBingoSorteio/:idbingosorteios', function (req, res) { + const idbingosorteios = parseInt(req.params.idbingosorteios); + ExecuteQuery(`delete FROM bingosorteios where idbingosorteios = ${idbingosorteios};`, req, res); + }); + + router.post('/insertBingoCartela', function (req, res) { + const idbingosorteios = parseInt(req.body.idbingosorteios); + const Cartelas = req.body.Cartelas; + let SQLCartelas = `insert into bingocartelas (canhoto, idbingosorteios, numeros) values `; + for (let i = 0; i < Cartelas.length; i++) { + Cartelas[i]['numeros'] = Cartelas[i]['numeros'].toString().replace('passaros.png', 'LIVRE'); + SQLCartelas += `(${Cartelas[i]['canhoto']},${idbingosorteios},'${Cartelas[i]['numeros']}'),` + } + SQLCartelas = SQLCartelas.substring(0, SQLCartelas.length - 1); + //console.log(SQLCartelas); + ExecuteQuery(SQLCartelas, req, res); + }); + + router.patch('/updateBingoCartela', function (req, res) { + const canhoto = req.body.canhoto; + const nome = req.body.nome; + const endereco = req.body.endereco; + const telefone = req.body.telefone; + const bingo = req.body.bingo ? 1 : 0; + const cinquina1 = req.body.cinquina1 ? 1 : 0; + const cinquina2 = req.body.cinquina2 ? 1 : 0; + const cinquina3 = req.body.cinquina3 ? 1 : 0; + ExecuteQuery(`update bingocartelas set nome = ?, endereco = ?, telefone = ?, bingo = ?, cinquina1 = ?, cinquina2 = ?, cinquina3 = ? where canhoto = ?;`, req, res, [nome, endereco, telefone, bingo, cinquina1, cinquina2, cinquina3, canhoto]); + }); + + + router.post('/exportarExcel', function (req, res) { + const Cartelas = req.body.Cartelas; + const idbingosorteios = req.body.idbingosorteios; + let Texto2 = `Canhoto;Numeros;Nome;Endereco;Telefone;\r\n`; + for (let i = 0; i < Cartelas.length; i++) { + Texto2 += `${Cartelas[i]['canhoto']};${Cartelas[i]['numeros']};${Cartelas[i]['nome']};${Cartelas[i]['telefone']};\r\n`; + } + const fs = require('fs'); + fs.writeFile('/var/www/html/Jogos/Bingo/Gerador/Cartelas/' + idbingosorteios + '.csv', Texto2, 'utf8', function (err) { + let Sucesso = false; + if (err) { + console.log("Erro ao salvar cartelas"); + } + else { + console.log("Cartelas salvas com sucesso"); + Sucesso = true; + } + res.send(Sucesso); + }); + }); + + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/checkoutController.js b/server/controllers/checkoutController.js new file mode 100644 index 0000000..7cb671f --- /dev/null +++ b/server/controllers/checkoutController.js @@ -0,0 +1,265 @@ +const { MercadoPagoConfig, Preference, Payment } = require('mercadopago'); + +const express = require('express'); +const router = express.Router(); + +//const client = new MercadoPagoConfig({ accessToken: 'TEST-7218616229800258-090908-d403b108f1f9c31e432f525c8abb14b3-115139428' }); +const client = new MercadoPagoConfig({ accessToken: 'APP_USR-7218616229800258-090908-6281afa294bbb2de7f68e1e336539ba1-115139428' }); + +var routes = function () { + + + + router.post('/buy', function (req, res) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${' called'}`); + const idprodutos = parseInt(req.body.idprodutos); + const idusuarios = parseInt(req.body.idusuarios); + const qtd = parseInt(req.body.qtd); + + const sqlQuery = `SELECT + pdt.idprodutos, + pdt.valor, + sis.idsistemas, + sis.nome, + tpl.idtiposlicenca, + tpl.descricao, + (SELECT us.cpf from usuarios us WHERE us.idusuarios = ?) as cpf + FROM produtos pdt + INNER JOIN sistemas sis ON sis.idsistemas = pdt.idsistemas + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdt.idprodutos = ?`; + + mysqlConnection.query(sqlQuery, [idusuarios, idprodutos], function (error, results, fields) { + if (error) { + return res.status(500).send({ error: 'Erro ao consultar o banco de dados.' }); + } + + const produto = results[0]; + if (produto['idtiposlicenca'] == 6) { + const sqlGerarChave = `CALL GerarInserirChave(?, ?, ?, @SerialKey, @idChave);`; + mysqlConnection.query(sqlGerarChave, [produto['cpf'], 30, produto['idsistemas']], function (chaveError, resChave) { + if (chaveError) { + return res.status(500).send({ error: 'Erro ao gerar chave.' }); + } + else { + const serial = resChave[0]?.[0]['SerialKey'] + res.status(200).send({url: null, chave: serial}); + } + }) + } + else { + const sqlGetVenda = `SELECT * FROM produtosvendas WHERE idprodutos = ? AND idusuarios = ? AND quantidade = ? AND status IS NULL;`; + mysqlConnection.query(sqlGetVenda, [produto.idprodutos, idusuarios, qtd], function (getError, getVenda) { + if (getError) { + return res.status(500).send({ error: 'Erro ao consultar venda no banco de dados.' }); + } + + if (getVenda.length == 0) { + const sqlCreate = `INSERT INTO produtosvendas (idprodutos, idusuarios, quantidade, valor) VALUES (?, ?, ?, ?)`; + mysqlConnection.query(sqlCreate, [produto.idprodutos, idusuarios, qtd, qtd * produto.valor], function (createError, venda) { + if (createError) { + return res.status(500).send({ error: 'Erro ao criar venda no banco de dados.' }); + } + + const preference = new Preference(client); + const pref = { + body: { + items: [ + { + title: produto.nome + " " + produto.descricao, + quantity: qtd, + unit_price: produto.valor + } + ], + notification_url: 'https://zendioninc.com.br/api/checkout/webhook', + external_reference: "" + venda.insertId + } + }; + //console.log(pref); + preference.create(pref) + .then(response => { + //console.log(response); + const newPreferenceId = response.id; // ID da nova preferência criada + + // Atualiza o campo preference_id no banco de dados + const updateQuery = `UPDATE produtosvendas SET preference_id = ? WHERE idprodutosvendas = ?`; + mysqlConnection.query(updateQuery, [newPreferenceId, venda.insertId], function (updateError) { + if (updateError) { + return res.status(500).send({ error: 'Erro ao atualizar o preference_id no banco de dados.' }); + } + + // Redireciona para o checkout com a nova preferência + res.status(200).send({url: response.init_point}); + //res.redirect(response.init_point); + }); + }) + .catch(error => { + console.error('Erro ao criar a preferência:', error); + return res.status(500).send({ error: 'Erro ao criar a preferência de pagamento.' }); + }); + }); + } + else { + // Se já existir, redireciona para o checkout utilizando o preference_id existente + const init_point = `https://www.mercadopago.com.br/checkout/v1/redirect?pref_id=${getVenda[0].preference_id}`; + res.status(200).send({url: init_point}); + //return res.redirect(init_point); + } + }); + } + }); + }); + + router.post('/webhook', function (req, res) { + const paymentData = req.body; + + //console.log(paymentData); + + // Verifica o tipo de notificação recebida + if (paymentData.type === 'payment') { + const paymentId = paymentData.data.id; + //console.log(paymentId); + + // Consultar o status do pagamento no Mercado Pago usando o ID + const payment = new Payment(client); + payment.get({ + id: paymentId, + }) + .then(response => { + //console.log(response); + const vendaId = response.external_reference; + const status = response.status; + + if (vendaId == null) { + console.error('ID da venda nao informado!'); + return res.status(500).send('ID da venda nao informado!'); + } + + const updateQuery = `UPDATE produtosvendas SET status = ? WHERE idprodutosvendas = ?;`; + mysqlConnection.query(updateQuery, [status, vendaId], function (error) { + if (error) { + console.error('Erro ao atualizar status do pagamento no banco de dados:', error); + return res.status(500).send('Erro ao atualizar banco de dados.'); + } + + if (status === 'approved') { + // Pagamento foi aprovado, agora você pode liberar a licença + console.log('Pagamento aprovado!'); + + const getQuery = `SELECT + pdt.idsistemas, + usu.idusuarios, + usu.cpf, + tpl.dias + FROM produtosvendas pdv + INNER JOIN usuarios usu ON usu.idusuarios = pdv.idusuarios + INNER JOIN produtos pdt ON pdt.idprodutos = pdv.idprodutos + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdv.idprodutosvendas = ?;`; + mysqlConnection.query(getQuery, [vendaId], function (errGet, resGet) { + if (errGet) { + console.error('Erro ao consultar dados do usuario no banco de dados:', errGet); + return res.status(500).send('Erro ao consultar dados do usuario no banco de dados'); + } + const dados = resGet[0]; + const sqlGenerateSerial = `CALL GerarChave(?, ?, @serialKey); SELECT @serialKey AS serial;`; + mysqlConnection.query(sqlGenerateSerial, [dados.cpf, dados.dias], function (err, results) { + if (err) { + console.error('Erro ao gerar serial:', err); + return res.status(500).send('Erro ao gerar serial'); + } + const serial = results[1][0].serial; + const sqlInsertSerial = ` + INSERT INTO chaves (licenca, data_criacao, data_validade, idusuarios, usada, idsistemas) + VALUES (?, NOW(), DATE_ADD(NOW(), INTERVAL ? DAY), ?, 0, ?); + `; + mysqlConnection.query(sqlInsertSerial, [serial, dados.dias, dados.idusuarios, dados.idsistemas], function (errInsert) { + if (errInsert) { + console.error('Erro ao registrar serial:', errInsert); + return res.status(500).send('Erro ao registrar serial'); + } + res.status(200).send('Licença liberada com sucesso!'); + }); + }); + }); + } else { + // Se o status for diferente de "approved", trate adequadamente (pendente, recusado, etc.) + console.log('Status do pagamento:', status); + res.status(200).send('Pagamento não aprovado.'); + } + }); + }) + .catch(error => { + console.error('Erro ao consultar o pagamento:', error); + res.status(500).send('Erro ao consultar o pagamento.'); + }); + } else { + res.status(400).send('Tipo de notificação não suportado.'); + } + }); + + + router.get('/getProductsSell/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + ExecuteQuery(`SELECT + pdt.idprodutos, + pdt.valor, + tpl.descricao + FROM produtos pdt + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdt.idsistemas = ${idsistemas} AND pdt.ativado = 1 + ORDER BY tpl.dias ASC;;`, req, res); + }); + + router.get('/getAllProducts/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + ExecuteQuery(`SELECT + pdt.idprodutos, + pdt.valor, + pdt.ativado, + tpl.idtiposlicenca, + tpl.descricao, + (SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos) AS vendas, + (SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos AND pdv.status = 'approved') AS compensados + FROM produtos pdt + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdt.idsistemas = ${idsistemas} + ORDER BY pdt.valor ASC;`, req, res); + }); + + router.post('/insertProduto', function (req, res, next) { + const idsistemas = parseInt(req.body.idsistemas); + const idtiposlicenca = parseInt(req.body.idtiposlicenca); + const valor = req.body.valor; + const ativado = req.body.ativado ? 1 : 0; + + const sqlQuery = `INSERT INTO produtos (idsistemas, idtiposlicenca, valor, ativado) + VALUES (${idsistemas}, ${idtiposlicenca}, ${valor}, ${ativado});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateProduto', function (req, res, next) { + const idprodutos = parseInt(req.body.idprodutos); + const idsistemas = parseInt(req.body.idsistemas); + const idtiposlicenca = parseInt(req.body.idtiposlicenca); + const valor = req.body.valor; + const ativado = req.body.ativado ? 1 : 0; + const sqlQuery = `update produtos set + idtiposlicenca = ${idtiposlicenca}, + valor = ${valor}, + ativado = ${ativado} + where idprodutos = ${idprodutos};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteProduto/:idprodutos', function (req, res, next) { + const idprodutos = req.params.idprodutos; + const sqlQuery = `DELETE FROM produtos WHERE idprodutos = ${idprodutos};`; + ExecuteQuery(sqlQuery, req, res); + }); + + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/emailController.js b/server/controllers/emailController.js new file mode 100644 index 0000000..b596833 --- /dev/null +++ b/server/controllers/emailController.js @@ -0,0 +1,100 @@ +require('dotenv').config(); + +const express = require('express'); +const router = express.Router(); +const nodemailer = require('nodemailer'); + +const transporter = nodemailer.createTransport({ + host: process.env.SMTP_HOST, + port: Number(process.env.SMTP_PORT || 587), + secure: process.env.SMTP_SECURE === 'true', + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASS + } +}); + +// Teste de conexão SMTP ao iniciar +transporter.verify(function (error, success) { + if (error) { + console.error('[SMTP] Falha na conexão:', error); + } else { + console.log('[SMTP] Servidor pronto para enviar emails'); + } +}); + +async function EnviarEmailFunc(Para, Assunto, Conteudo, res) { + try { + if (!Para || !Assunto || !Conteudo) { + throw new Error('Para, Assunto e Conteudo são obrigatórios.'); + } + + const fromEmail = (process.env.SMTP_FROM_EMAIL || '').trim(); + const fromName = (process.env.SMTP_FROM_NAME || 'Zendion, INC.').trim(); + + if (!fromEmail) { + throw new Error('SMTP_FROM_EMAIL não configurado no .env.'); + } + + const msg = { + to: Para, + from: { + name: fromName, + address: fromEmail + }, + subject: Assunto, + text: Conteudo.replace(/<[^>]*>/g, ''), + html: Conteudo + }; + + const info = await transporter.sendMail(msg); + + console.log('[EMAIL] Enviado:', info.messageId); + + if (res) { + return res.status(200).send({ + sucesso: true, + message: 'Email enviado com sucesso', + messageId: info.messageId + }); + } + + return { + sucesso: true, + messageId: info.messageId + }; + + } catch (error) { + console.error('[EMAIL] Erro ao enviar:', error); + + if (res) { + return res.status(500).send({ + sucesso: false, + message: 'Erro ao enviar o e-mail', + detalhe: error.message + }); + } + + return { + sucesso: false, + erro: error.message + }; + } +} + +router.post('/enviarEmail', function (req, res) { + const { Para, Assunto, Conteudo } = req.body; + + if (!Para || !Assunto || !Conteudo) { + return res.status(400).send({ + error: 'Os campos "Para", "Assunto" e "Conteudo" são obrigatórios.' + }); + } + + EnviarEmailFunc(Para, Assunto, Conteudo, res); +}); + +module.exports = { + router, + EnviarEmailFunc +}; \ No newline at end of file diff --git a/server/controllers/gcaController.js b/server/controllers/gcaController.js new file mode 100644 index 0000000..83046b1 --- /dev/null +++ b/server/controllers/gcaController.js @@ -0,0 +1,406 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); +const nodemailer = require('nodemailer'); +const formidable = require('formidable'); +const shell = require('shelljs'); +var admin = require("firebase-admin"); +var serviceAccount = require("./../gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json"); + + +var routes = function () { + + //#region EMAIL + const Email = 'gcacontrol@gmail.com'; + const Senha = 'gcaCtrl123'; + var transporter = nodemailer.createTransport({ + service: 'gmail', + //host: "email-ssl.com.br", + //port: 465, + //secure: true, + auth: { + user: Email, + pass: Senha, + //user: 'iyrconline@myrobot.com.br', + //pass: 'iyrcMyrobot@2255', + //user: 'myrobotschool@gmail.com', + //pass: 'myrobot2020**==', + } + }); + + function EnviarEmail(Dados, idemail) { + ConexaoMySQL_GCA.query(`SELECT + em.* + FROM emails em + where em.idemails = ${idemail};`, function (error, results, fields) { + if (!error && results.length > 0) { + let Mensagem = results[0]['texto']; + for (let i = 0; i < 10; i++) { + if (Dados['descricao']) + Mensagem = Mensagem.replace('>DISPOSITIVO<', Dados['descricao']); + if (Dados['nome']) + Mensagem = Mensagem.replace('>CLIENTE<', Dados['nome']); + if (Dados['Segredo']) + Mensagem = Mensagem.replace('>SEGREDO<', Dados['Segredo']); + } + var mailOptions = { + from: "GCA Control ", + to: Dados['email'], + subject: results[0]['assunto'], + html: Mensagem + }; + transporter.sendMail(mailOptions, function (error, info) { + if (error) { + console.log(error); + } + else { + console.log('Email enviado para: ' + mailOptions.to + ' - ' + info.response); + ConexaoMySQL_GCA.query(`insert into emailsenviados (iddispositivos, idemails) values (${Dados['iddispositivos']}, ${idemail});`, function (error2, results2, fields2) { + }); + } + /* + // envia sms + const Hash = "0cc6fcb95a28d506def8259e1e8dd90e"; + const https = require('https'); + https.get(`https://smsmobile.com.br/sms/shortcode/routes/sms.php?hash=${Hash}&mensagem=${encodeURI(Mensagem)}&numero=${Telefone}`, (resp) => { + let data = ''; + resp.on('data', (chunk) => { + data += chunk; + }); + resp.on('end', () => { + console.log("SMS enviado com sucesso para " + Dispositivo['telefone']); + }); + }).on("error", (err) => { + console.log("Erro ao enviar SMS: " + err.message); + }); + */ + }); + } + }); + } + + router.get('/sendEmail/:iddispositivos/:idemail', (req, res) => { + const iddispositivos = parseInt(req.params.iddispositivos); + const idemail = parseInt(req.params.idemail); + ConexaoMySQL_GCA.query(`SELECT di.iddispositivos, di.descricao, di.alarme, cl.email, cl.telefone, cl.token FROM dispositivos di inner join clientes cl on cl.idclientes = di.idclientes WHERE di.iddispositivos = ${iddispositivos};`, function (error2, results2, fields2) { + EnviarEmail(results2[0], idemail); + console.log(req.originalUrl + "/ success 200"); + res.send(true); + }); + }); + + //#endregion + + //#region DISPOSITIVOS + + router.get('/getDispositivos', (req, res) => { + ConexaoMySQL_GCA.query(`select + di.iddispositivos, + di.qrcode, + di.idkits, + ki.descricao as 'Kit', + di.insert_date + from dispositivos di + left join clientes cl on cl.idclientes = di.idclientes + inner join kits ki on ki.idkits = di.idkits + where cl.idclientes is null;`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(results); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send([]); + } + }); + }); + + router.get('/getDispositivosCliente/:segredo', (req, res) => { + const segredo = req.params.segredo; + ConexaoMySQL_GCA.query(`select + di.iddispositivos, + di.qrcode, + di.descricao, + di.idclientes, + cl.nome as 'Cliente', + di.idkits, + ki.descricao as 'Kit', + di.alarme, + di.statusalarme, + di.portao, + di.lampada, + di.statuslampada, + di.update_date + from dispositivos di + inner join clientes cl on cl.idclientes = di.idclientes + inner join kits ki on ki.idkits = di.idkits + where cl.segredo = '${segredo}';`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(results); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send([]); + } + }); + }); + + router.get('/getStatus/:segredo/:iddispositivos', (req, res) => { + const segredo = req.params.segredo; + const iddispositivos = parseInt(req.params.iddispositivos); + ConexaoMySQL_GCA.query(`select + di.alarme, + di.statusalarme, + di.portao, + di.lampada, + di.statuslampada + FROM dispositivos di + inner join clientes cl on cl.idclientes = di.idclientes + where cl.segredo = '${segredo}' and di.iddispositivos = ${iddispositivos};`, function (error, results, fields) { + if (error) throw error; + if (results[0]) { + console.log(req.originalUrl + "/ success 200"); + res.send(results[0]); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send(false); + } + }); + }); + + router.get('/setStatus/:segredo/:iddispositivos/:Atuador/:Estado', (req, res) => { + const segredo = req.params.segredo; + const iddispositivos = parseInt(req.params.iddispositivos); + const Atuador = parseInt(req.params.Atuador); + const Estado = parseInt(req.params.Estado); + ConexaoMySQL_GCA.query(`UPDATE dispositivos D + inner join clientes C on C.idclientes = D.idclientes + SET ${ + (Atuador == 0) ? 'alarme' : + (Atuador == 1) ? 'statusalarme' : + (Atuador == 2) ? 'portao' : + (Atuador == 3) ? 'lampada' : + (Atuador == 4) ? 'statuslampada' : + ''} = ${Estado} + WHERE D.iddispositivos = ${iddispositivos} and C.segredo = '${segredo}';`, function (error, results, fields) { + if (error) throw error; + console.log(req.originalUrl + "/ success 200"); + let Resposta = shell.exec(`sudo mosquitto_pub -h gcacontrol.mooo.com -p 1883 -t "${segredo}" -m "${Atuador}:${Estado}" -u "tht" -P "123"`); + if (Atuador == 1 && Estado == 1) { + ConexaoMySQL_GCA.query(`select di.iddispositivos, di.descricao, di.alarme, cl.email, cl.telefone, cl.token from dispositivos di inner join clientes cl on cl.idclientes = di.idclientes where di.iddispositivos = ${iddispositivos};`, function (error2, results2, fields2) { + if (results2[0]['alarme'] == 1) { + EnviarEmail(results2[0], 1); + + const DadosMensagem = { + title: "Alarme Acionado!", + message: "Seu alarme no dispositivo " + results2[0]['descricao'] + " foi acionado!" + }; + EnviarNotificacao(DadosMensagem, results2[0]['token']); + } + res.send(true); + }); + } + else { + res.send(true); + } + }); + }); + + router.post('/vincularDispositivo', (req, res) => { + const descricao = req.body.descricao; + const segredo = req.body.segredo; + const iddispositivos = parseInt(req.body.iddispositivos); + ConexaoMySQL_GCA.query(`UPDATE dispositivos set + descricao = '${descricao}', + idclientes = (select idclientes from clientes where segredo = '${segredo}') + where iddispositivos = ${iddispositivos};`, function (error, results, fields) { + if (!error) { + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(error); + console.log(req.originalUrl + "/ error 500"); + res.send(false); + } + }); + }); + + //#endregion + + //#region CLIENTES + + router.post('/insertCliente', (req, res) => { + const nome = req.body.nome; + const cidade = req.body.cidade; + const telefone = req.body.telefone; + const email = req.body.email; + const cpf = req.body.cpf; + ConexaoMySQL_GCA.query(`select * from clientes where cpf = '${cpf}' or email = '${email}';`, function (errorS, resultsS, fieldsS) { + if (resultsS.length == 0) { + GeraSegredo(function(segredo) { + ConexaoMySQL_GCA.query(`insert into clientes (nome, cidade, telefone, email, segredo, cpf) + values ('${nome}', '${cidade}', '${telefone}', '${email}', '${segredo}', '${cpf}');`, function (error, results, fields) { + if (error) throw error; + if (!error) { + console.log(req.originalUrl + "/ success 200"); + let Cliente = { + nome: nome, + email: email, + telefone: telefone, + Segredo: segredo + } + EnviarEmail(Cliente, 2); + res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?segredo=${segredo}`); + } + else { + console.log(req.originalUrl + "/ error 500"); + res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?erro=0`); + } + }); + }); + } + else { + res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?erro=1`); + } + }); + }); + + function GeraSegredo(callback) { + const caracteresPermitidos = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-"; + let secret = ""; + ConexaoMySQL_GCA.query(`select segredo from clientes;`, function (error, results, fields) { + for (let i = 0; i < 15; i++) { + secret += caracteresPermitidos[Math.floor(Math.random() * (caracteresPermitidos.length))]; + } + let Aprovado = true; + for (let i = 0; i < results.length; i++) { + if (results[i]['segredo'] == secret) + Aprovado = false; + } + if (Aprovado) + callback(secret); + else + GeraSegredo(callback); + }); + } + + router.get('/setClienteToken/:segredo/:token', (req, res) => { + const segredo = req.params.segredo; + const token = req.params.token; + ConexaoMySQL_GCA.query(`UPDATE clientes SET + token = '${token}' + where segredo = '${segredo}';`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send(false); + } + }); + }); + + router.post('/salvarConfigCliente', (req, res) => { + const Segredo = req.body.Segredo; + const NomeRede = req.body.NomeRede; + const SenhaRede = req.body.SenhaRede; + const Dispositivo = parseInt(req.body.Dispositivo); + ConexaoMySQL_GCA.query(`UPDATE clientes set + nomeRede = '${NomeRede}', + senhaRede = '${SenhaRede}', + indexDispositivo = ${Dispositivo} + where segredo = '${Segredo}';`, function (error, results, fields) { + if (!error) { + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(error); + console.log(req.originalUrl + "/ error 500"); + res.send(false); + } + }); + }); + + //#endregion + + //#region CONFIGURACOES + + router.get('/getConfig', (req, res) => { + ConexaoMySQL_GCA.query(`select * from configuracoes;`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(results[0]); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send([]); + } + }); + }); + + //#endregion + + //#region PUSH NOTIFICATION FIREBASE + + admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), + projectId: "gca-control-bcb9b" + }); + + function EnviarNotificacao(DadosMensagem, registrationToken) { + // This registration token comes from the client FCM SDKs. + + const message = { + data: DadosMensagem, + token: registrationToken + }; + + // Send a message to the device corresponding to the provided + // registration token. + admin.messaging().send(message).then((response) => { + // Response is a message ID string. + console.log('Successfully sent message:', response); + }).catch((error) => { + console.log('Error sending message:', error); + }); + } + + router.post('/sendPushNotification', (req, res) => { + const titulo = req.body.titulo; + const mensagem = req.body.mensagem; + const segredo = req.body.segredo; + ConexaoMySQL_GCA.query(`SELECT token FROM clientes WHERE segredo = '${segredo}';`, function (error, results, fields) { + if (!error) { + + const DadosMensagem = { + title: titulo, + message: mensagem + }; + EnviarNotificacao(DadosMensagem, results[0]['token']); + + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(error); + console.log(req.originalUrl + "/ error 500"); + res.send(false); + } + }); + }); + + //#endregion + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/noticiasController.js b/server/controllers/noticiasController.js new file mode 100644 index 0000000..ba24d0a --- /dev/null +++ b/server/controllers/noticiasController.js @@ -0,0 +1,80 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + + router.get('/getAllNoticias', function (req, res) { + ExecuteQuery(`SELECT * FROM noticias;`, req, res); + }); + + router.get('/getNoticiasEn', function (req, res, next) { + const sqlQuery = `select + idnoticias, + titulo, + descricao, + CASE WHEN habilitado = 1 THEN 'Sim' ELSE 'Não' END AS habilitado, + link + FROM noticias + WHERE habilitado = 1;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getNoticiaByID/:idnoticias', function (req, res, next) { + const idnoticias = req.params.idnoticias; + const sqlQuery = `SELECT * FROM noticias WHERE idnoticias = ${idnoticias};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertNoticias', function (req, res, next) { + const idnoticias = req.body.idnoticias; + const titulo = req.body.titulo; + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `INSERT INTO noticias (titulo, descricao, habilitado, link) + VALUES ('${titulo}', '${descricao}', ${habilitado}, '${link}');`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateNoticias', function (req, res, next) { + const idnoticias = req.body.idnoticias; + const titulo = req.body.titulo; + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `update noticias set + titulo = '${titulo}', + descricao = '${descricao}', + habilitado = ${habilitado}, + link = '${link}' + where idnoticias = ${idnoticias};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteNoticias/:idnoticias', function (req, res, next) { + const idnoticias = req.params.idnoticias; + const sqlQuery = `DELETE FROM noticias WHERE idnoticias = ${idnoticias};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var idnoticias = fields.idnoticias; + var pathImagem = files.imagem.path; + var dir = '/var/www/html/imagens/noticias/'; + fs.rename(pathImagem, dir + "noticia_" + idnoticias + ".jpg", function (err) { + console.log("arquivo copiado com sucesso"); + res.send(true); + }); + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/oriontardproController.js b/server/controllers/oriontardproController.js new file mode 100644 index 0000000..52cf53e --- /dev/null +++ b/server/controllers/oriontardproController.js @@ -0,0 +1,24 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/getAllLogs', function (req, res) { + ExecuteQuery(`select * from vw_oriontard_logs where dataLog > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 MONTH);`, req, res); + }); + + router.post('/insertLog', function (req, res) { + const cpf = req.body.cpf; + const perfil = req.body.perfil; + const latitude = req.body.longitude; + const longitude = req.body.latitude; + const log = req.body.log; + ExecuteQuery(`insert into orionTardProLogs (cpf, perfil, latitude, longitude, log) values (?, ?, ?, ?, ?);`, + req, res, [cpf, perfil, latitude, longitude, log]); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/priorieController.js b/server/controllers/priorieController.js new file mode 100644 index 0000000..c691323 --- /dev/null +++ b/server/controllers/priorieController.js @@ -0,0 +1,585 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + //#region LOGIN + + router.post('/login', function(req, res) { + const usuario = req.body.usuario; + const senha = req.body.senha; + ExecuteQueryPriorie(`select * from usuarios where usuario = '${usuario}' and senha = '${senha}' and habilitado = 1;`, req, res); + }); + + //#endregion + + //#region USUARIOS + + router.post('/cadastrarUsuario', function(req, res) { + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = req.body.iddepartamentos; + const nome = req.body.nome; + const usuario = req.body.usuario; + const senha = req.body.senha; + const habilitado = req.body.habilitado ? 1 : 0; + const email = req.body.email; + ExecuteQueryPriorie(`insert into usuarios (iddepartamentos, nome, senha, usuario, habilitado, email) values + (${iddepartamentos}, '${nome}', '${senha}', '${usuario}', ${habilitado}, '${email}');`, req, res); + }); + + router.patch('/atualizarUsuario', function(req, res) { + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const nome = req.body.nome; + const usuario = req.body.usuario; + const senha = req.body.senha; + const habilitado = req.body.habilitado ? 1 : 0; + const email = req.body.email; + ExecuteQueryPriorie(`update usuarios set + iddepartamentos = ${iddepartamentos}, + nome = '${nome}', + senha = '${senha}', + usuario = '${usuario}', + habilitado = ${habilitado}, + email = '${email}' + where idusuarios = ${idusuarios};`, req, res); + }); + + router.delete('/removerUsuario/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`delete from usuarios + where idusuarios = ${idusuarios};`, req, res); + }); + + router.get('/getAllUsuarios', function(req, res) { + ExecuteQueryPriorie(`select + us.* , + dp.descricao as 'departamento' + from usuarios us + inner join departamentos dp on dp.iddepartamentos = us.iddepartamentos + order by nome asc;`, req, res); + }); + + router.get('/getUsuariosEnabled', function(req, res) { + ExecuteQueryPriorie(`select * from usuarios where habilitado = 1;`, req, res); + }); + + router.get('/getUsuario/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`select * from usuarios + where idusuarios = ${idusuarios};`, req, res); + }); + + //#endregion + + //#region TAREFAS + + router.post('/cadastrarTarefa', function(req, res) { + const idtarefas = parseInt(req.body.idtarefas); + const criadapor = parseInt(req.body.criadapor); + const descricao = fixApostrofe(req.body.descricao); + const idprojetos = parseInt(req.body.idprojetos); + const idtopicos = parseInt(req.body.idtopicos); + const idstatus = parseInt(req.body.idstatus); + const idtipotarefa = parseInt(req.body.idtipotarefa); + const previsaoinicio = req.body.previsaoinicio; + const iniciadoem = req.body.iniciadoem; + const previsaotermino = req.body.previsaotermino; + const concluidoem = req.body.concluidoem; + const prioridade = parseInt(req.body.prioridade); + const observacao = fixApostrofe(req.body.observacao); + ExecuteQueryPriorie(`insert into tarefas (criadapor, descricao, idprojetos, idtopicos, idstatus, idtipotarefa, ${(previsaoinicio) ? 'previsaoinicio,' : ''} ${(iniciadoem) ? 'iniciadoem,' : ''} ${(previsaotermino) ? 'previsaotermino,' : ''} ${(concluidoem) ? 'concluidoem,' : ''} prioridade, observacao) values + (${criadapor}, '${descricao}', ${idprojetos}, ${idtopicos}, ${idstatus}, ${idtipotarefa}, ${(previsaoinicio) ? "'" + previsaoinicio + "'," : ''} ${(iniciadoem) ? "'" + iniciadoem + "'," : ''} ${(previsaotermino) ? "'" + previsaotermino + "'," : ''} ${(concluidoem) ? "'" + concluidoem + "'," : ''} ${prioridade}, '${observacao}');`, req, res); + }); + + router.patch('/atualizarTarefa', function(req, res) { + const idtarefas = parseInt(req.body.idtarefas); + const criadapor = parseInt(req.body.criadapor); + const descricao = fixApostrofe(req.body.descricao); + const idprojetos = parseInt(req.body.idprojetos); + const idtopicos = parseInt(req.body.idtopicos); + const idstatus = parseInt(req.body.idstatus); + const idtipotarefa = parseInt(req.body.idtipotarefa); + const previsaoinicio = req.body.previsaoinicio; + const iniciadoem = req.body.iniciadoem; + const previsaotermino = req.body.previsaotermino; + const concluidoem = req.body.concluidoem; + const prioridade = parseInt(req.body.prioridade); + const observacao = fixApostrofe(req.body.observacao); + ExecuteQueryPriorie(`update tarefas set + criadapor = ${criadapor}, + descricao = '${descricao}', + idprojetos = ${idprojetos}, + idtopicos = ${idtopicos}, + idstatus = ${idstatus}, + idtipotarefa = ${idtipotarefa}, + ${(previsaoinicio) ? "previsaoinicio = '" + previsaoinicio + "',": ''} + ${(iniciadoem) ? "iniciadoem = '" + iniciadoem + "',": ''} + ${(previsaotermino) ? "previsaotermino = '" + previsaotermino + "',": ''} + ${(concluidoem) ? "concluidoem = '" + concluidoem + "',": ''} + prioridade = ${prioridade}, + observacao = '${observacao}' + where idtarefas = ${idtarefas};`, req, res, function(Status) { + if (Status == 200 && idstatus == 4) { + const SQLDados = `select + A.*, + us.nome as 'Gerente', + us.email as 'EmailGerente', + us2.nome + from (select distinct + ta.idtarefas, + date_format(ta.concluidoem, '%d/%m/%Y') as 'ConcluidaEm', + dm.idusuarios, + pr.descricao as 'Projeto', + tp.descricao as 'Topico', + ta.descricao as 'Tarefa' + from tarefas ta + inner join projetos pr on pr.idprojetos = ta.idprojetos + inner join topicos tp on tp.idtopicos = ta.idtopicos + inner join departamentosmembros dm on dm.iddepartamentos = pr.iddepartamentos + inner join usuarios us on us.iddepartamentos = dm.iddepartamentos and dm.gestor = 1 + where ta.idtarefas = ${idtarefas}) A + inner join usuarios us on us.idusuarios = A.idusuarios + inner join projetosmembros pm on pm.idtarefas = A.idtarefas + inner join usuarios us2 on us2.idusuarios = pm.idusuarios;`; + connection.query(SQLDados, function(error, Dados, fields) { + if (Dados && Dados[0]['EmailGerente'] != "" && Dados[0]['EmailGerente'] != null) { + let Membros = ""; + for (let i = 0; i < Dados.length; i++) { + if (i > 0) + Membros += ", "; + Membros += Dados[i]['nome']; + } + const Mensagem = `Olá ${Dados[0]['Gerente']}!
+ Uma tarefa do projeto ${Dados[0]['Projeto']} foi marcada com concluída:

+ Projeto: ${Dados[0]['Projeto']}
+ Tópico: ${Dados[0]['Topico']}
+ Tarefa: ${Dados[0]['Tarefa']}
+ Data de Conclusão: ${Dados[0]['ConcluidaEm']}
+ Membros: ${Membros}

+ Acesse o sistema para conferir!

+ Clique aqui para acessar o sistema`; + EnviarEmail(Mensagem, "Tarefa Concluída", Dados[0]['EmailGerente']); + } + }); + } + }); + }); + + router.delete('/removerTarefa/:idtarefas', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + ExecuteQueryPriorie(`delete from tarefas + where idtarefas = ${idtarefas};`, req, res); + }); + + router.get('/getAllTarefas', function(req, res) { + ExecuteQueryPriorie(`select * from tarefas;`, req, res); + }); + + router.get('/getTarefa/:idtarefas', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + ExecuteQueryPriorie(`select * from tarefas + where idtarefas = ${idtarefas};`, req, res); + }); + + router.get('/getTarefasUsuario/:idusuarios/:iddepartamentos/:IdsStatus/:idprojetos/:idtopicos', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + const iddepartamentos = parseInt(req.params.iddepartamentos); + const idprojetos = parseInt(req.params.idprojetos); + const idtopicos = parseInt(req.params.idtopicos); + const IdsStatus = req.params.IdsStatus; + + let Condicao = `pr.iddepartamentos = ${iddepartamentos} /*${(idusuarios == 0) ? 'or' : 'and'}*/and ((`; + if (idusuarios == 0) + Condicao += `pm.idusuarios in (select distinct dm.idusuarios from departamentosmembros dm where dm.iddepartamentos = ${iddepartamentos})`; + else + Condicao += "pm.idusuarios = " + idusuarios; + Condicao += " and st.idstatus in " + IdsStatus; + if (idprojetos > 0) + Condicao += " and ta.idprojetos = " + idprojetos; + if (idtopicos > 0) + Condicao += " and ta.idtopicos = " + idtopicos; + if (IdsStatus.includes("100")) { + //Condicao += `) or (0 = (select count(*) from projetosmembros pm1 where pm1.idtarefas = ta.idtarefas)${(idprojetos > 0) ? ' and ta.idprojetos = ' + idprojetos : ''}))`; + Condicao += `) or (0 = (select count(*) from projetosmembros pm1 inner join tarefas ta1 on ta1.idtarefas = pm1.idtarefas inner join projetos pr1 on pr1.idprojetos = ta1.idprojetos where pm1.idtarefas = ta.idtarefas)${(idprojetos > 0) ? ' and ta.idprojetos = ' + idprojetos : ''}))`; + } + else + Condicao += "))"; + let sqlQuery = `select + A.*, + GROUP_CONCAT(us.nome SEPARATOR ', ') as 'Membros', + GROUP_CONCAT(us.idusuarios SEPARATOR ',') as 'MembrosIDs' + from ( + SELECT distinct + ta.idtarefas, + ta.descricao, + ta.criadapor, + (select us2.nome from usuarios us2 where us2.idusuarios = ta.criadapor) as 'criadapor_d', + ta.idprojetos, + pr.descricao as 'projeto', + pr.iddepartamentos, + ta.idtopicos, + tp.descricao as 'topico', + ta.idstatus, + ta.idstatus as 'idstatus_c', + st.descricao as 'status', + st.prioridade as 'prioridade_s', + st.color, + st.background, + ta.idtipotarefa, + tt.descricao as 'tipotarefa', + ta.previsaoinicio, + ta.iniciadoem, + ta.previsaotermino, + ta.concluidoem, + ta.prioridade, + pd.descricao as 'prioridade_d', + ta.observacao, + date_format(ta.insert_date, '%d/%m/%Y %H:%i') as 'insert_date', + (select count(*) from projetosmembros pm2 where pm2.idtarefas = ta.idtarefas) as 'QtdMembros' + FROM tarefas ta + inner join projetos pr on pr.idprojetos = ta.idprojetos + inner join topicos tp on tp.idtopicos = ta.idtopicos + inner join status st on st.idstatus = ta.idstatus + inner join tipotarefa tt on tt.idtipotarefa = ta.idtipotarefa + left join projetosmembros pm on pm.idtarefas = ta.idtarefas + inner join prioridades pd on pd.prioridade = ta.prioridade + where ${Condicao}) A + left join projetosmembros pm on pm.idtarefas = A.idtarefas + left join usuarios us on us.idusuarios = pm.idusuarios + group by A.idtarefas + order by A.prioridade_s desc, A.prioridade asc, A.idtipotarefa asc;`; + //console.log(sqlQuery); + ExecuteQueryPriorie(sqlQuery, req, res); + }); + + router.get('/getMembrosTarefa/:idtarefas', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + ExecuteQueryPriorie(`SELECT + pm.idprojetosmembros, + pm.idusuarios, + pm.idtarefas, + us.nome + FROM projetosmembros pm + left join usuarios us on us.idusuarios = pm.idusuarios + where pm.idtarefas = ${idtarefas};`, req, res); + }); + + router.delete('/removerMembroTarefa/:idtarefas/:idusuarios', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`delete from projetosmembros + where idtarefas = ${idtarefas} and idusuarios = ${idusuarios};`, req, res); + }); + + router.post('/cadastrarTarefaMembros', function(req, res) { + const idtarefas = parseInt(req.body.idtarefas); + const idusuarios = parseInt(req.body.idusuarios); + ExecuteQueryPriorie(`insert into projetosmembros (idusuarios, idtarefas) + values (${idusuarios}, ${idtarefas});`, req, res, function(Status, idprojetosmembros) { + if (Status != 200) { + return; + } + const SQLDados = `select + pm.idusuarios, + us.nome, + us.email, + pr.descricao as 'Projeto', + tp.descricao as 'Topico', + ta.descricao as 'Tarefa', + date_format(ta.previsaoinicio, '%d/%m/%Y') as 'Inicio', + date_format(ta.previsaotermino, '%d/%m/%Y') as 'Previsao', + pd.descricao as 'Prioridade', + dp.descricao as 'Departamento' + from projetosmembros pm + inner join tarefas ta on ta.idtarefas = pm.idtarefas + inner join projetos pr on pr.idprojetos = ta.idprojetos + inner join topicos tp on tp.idtopicos = ta.idtopicos + inner join prioridades pd on pd.prioridade = ta.prioridade + inner join usuarios us on us.idusuarios = pm.idusuarios + inner join departamentos dp on dp.iddepartamentos = pr.iddepartamentos + where idprojetosmembros = ${idprojetosmembros};`; + connection.query(SQLDados, function(error, Dados, fields) { + if (Dados && Dados[0]['email'] != "" && Dados[0]['email'] != null) { + const Mensagem = `Olá ${Dados[0]['nome']}!
+ Você tem uma nova tarefa atribuída no sistema Priorie para o departamento ${Dados[0]['Departamento']}:

+ Projeto: ${Dados[0]['Projeto']}
+ Tópico: ${Dados[0]['Topico']}
+ Tarefa: ${Dados[0]['Tarefa']}
+ Prioridade: ${Dados[0]['Prioridade']}
+ Previsão de início: ${Dados[0]['Inicio']}
+ Previsão de término: ${Dados[0]['Previsao']}

+ Acesse o sistema para conferir!

+ Clique aqui para acessar o sistema`; + EnviarEmail(Mensagem, "Nova Tarefa Atribuída", Dados[0]['email']); + } + }); + }); + }); + + router.get('/getTarefasPorMembro/:IdsStatus/:idprojetos/:idtopicos', function(req, res) { + const IdsStatus = req.params.IdsStatus; + const idprojetos = parseInt(req.params.idprojetos); + const idtopicos = parseInt(req.params.idtopicos); + let Condicao = ""; + if (idprojetos > 0) + Condicao += " and ta.idprojetos = " + idprojetos; + if (idtopicos > 0) + Condicao += " and ta.idtopicos = " + idtopicos; + ExecuteQueryPriorie(`SELECT + pm.idusuarios, + pr.iddepartamentos, + ta.idstatus, + count(*) as 'QtdeTarefas' + FROM projetosmembros pm + inner join tarefas ta on ta.idtarefas = pm.idtarefas + inner join projetos pr on pr.idprojetos = ta.idprojetos + where ta.idstatus in ${IdsStatus}${Condicao} + group by pr.iddepartamentos, pm.idusuarios, ta.idstatus;`, req, res); + }); + + + //#endregion + + //#region STATUS + + router.get('/getAllStatus', function(req, res) { + ExecuteQueryPriorie(`select * from status;`, req, res); + }); + + //#endregion + + //#region DEPARTAMENTOS + + router.get('/getAllDepartamentos', function(req, res) { + ExecuteQueryPriorie(`SELECT * from departamentos order by descricao asc;`, req, res); + }); + + router.get('/getDepartamento/:iddepartamentos', function(req, res) { + const iddepartamentos = parseInt(req.params.iddepartamentos); + ExecuteQueryPriorie(`SELECT * from departamentos where iddepartamentos = ${iddepartamentos} order by descricao asc;`, req, res); + }); + + router.get('/getDepartamentosMembro/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`select * from departamentosmembros where idusuarios = ${idusuarios};`, req, res); + }); + + router.get('/getDepMembroDetalhe/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`SELECT + dm.iddepartamentosmembros, + dm.idusuarios, + us.nome, + us.iddepartamentos as 'iddepartamentos_u', + dm.iddepartamentos, + dp.descricao, + dm.gestor, + dm.permitecadastro + FROM departamentosmembros dm + inner join usuarios us on us.idusuarios = dm.idusuarios + inner join departamentos dp on dp.iddepartamentos = dm.iddepartamentos + where dm.idusuarios = ${idusuarios} + order by us.nome asc;`, req, res); + }); + + router.get('/getMemborsDepartamento/:iddepartamentos', function(req, res) { + const iddepartamentos = parseInt(req.params.iddepartamentos); + ExecuteQueryPriorie(`SELECT + dm.iddepartamentosmembros, + dm.idusuarios, + us.nome, + us.iddepartamentos as 'iddepartamentos_u', + dm.iddepartamentos, + dp.descricao, + dm.gestor, + dm.permitecadastro + FROM departamentosmembros dm + inner join usuarios us on us.idusuarios = dm.idusuarios + inner join departamentos dp on dp.iddepartamentos = dm.iddepartamentos + where dm.iddepartamentos = ${iddepartamentos} + order by us.nome asc;`, req, res); + }); + + + router.post('/cadastrarDepMembro', function(req, res) { + const iddepartamentosmembros = parseInt(req.body.iddepartamentosmembros); + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const gestor = req.body.gestor ? 1 : 0; + const permitecadastro = req.body.permitecadastro ? 1 : 0; + ExecuteQueryPriorie(`insert into departamentosmembros (idusuarios, iddepartamentos, gestor, permitecadastro) + values (${idusuarios}, ${iddepartamentos}, ${gestor}, ${permitecadastro});`, req, res); + }); + + router.patch('/atualizarDepMembro', function(req, res) { + const iddepartamentosmembros = parseInt(req.body.iddepartamentosmembros); + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const gestor = req.body.gestor ? 1 : 0; + const permitecadastro = req.body.permitecadastro ? 1 : 0; + ExecuteQueryPriorie(`update departamentosmembros set + idusuarios = ${idusuarios}, + iddepartamentos = ${iddepartamentos}, + gestpr = ${gestor}, + permitecadastro = ${permitecadastro} + where idtopicos = ${idtopicos};`, req, res); + }); + + router.delete('/removerDepMembro/:iddepartamentosmembros', function(req, res) { + const iddepartamentosmembros = parseInt(req.params.iddepartamentosmembros); + ExecuteQueryPriorie(`delete from departamentosmembros + where iddepartamentosmembros = ${iddepartamentosmembros};`, req, res); + }); + + + //#endregion + + //#region PROJETOS + + router.post('/cadastrarProjeto', function(req, res) { + const idprojetos = parseInt(req.body.idprojetos); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`insert into projetos (iddepartamentos, descricao) values + (${iddepartamentos}, '${descricao}');`, req, res); + }); + + router.patch('/atualizarProjeto', function(req, res) { + const idprojetos = parseInt(req.body.idprojetos); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`update projetos set + iddepartamentos = ${iddepartamentos}, + descricao = '${descricao}' + where idprojetos = ${idprojetos};`, req, res); + }); + + router.delete('/removerProjeto/:idprojetos', function(req, res) { + const idprojetos = parseInt(req.params.idprojetos); + ExecuteQueryPriorie(`delete from projetos + where idprojetos = ${idprojetos};`, req, res); + }); + + router.get('/getAllProjetos', function(req, res) { + ExecuteQueryPriorie(`select * from projetos;`, req, res); + }); + + router.get('/getProjetosDepartamento/:iddepartamentos', function(req, res) { + const iddepartamentos = parseInt(req.params.iddepartamentos); + ExecuteQueryPriorie(`select * from projetos where iddepartamentos = ${iddepartamentos} order by descricao asc;`, req, res); + }); + + router.get('/getAllTiposTarefas', function(req, res) { + ExecuteQueryPriorie(`select * from tipotarefa;`, req, res); + }); + + //#endregion + + //#region TOPICOS + + router.post('/cadastrarTopico', function(req, res) { + const idtopicos = parseInt(req.body.idtopicos); + const idprojetos = parseInt(req.body.idprojetos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`insert into topicos (idprojetos, descricao) values + (${idprojetos}, '${descricao}');`, req, res); + }); + + router.patch('/atualizarTopico', function(req, res) { + const idtopicos = parseInt(req.body.idtopicos); + const idprojetos = parseInt(req.body.idprojetos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`update topicos set + idprojetos = ${idprojetos}, + descricao = '${descricao}' + where idtopicos = ${idtopicos};`, req, res); + }); + + router.delete('/removerTopico/:idtopicos', function(req, res) { + const idtopicos = parseInt(req.params.idtopicos); + ExecuteQueryPriorie(`delete from topicos + where idtopicos = ${idtopicos};`, req, res); + }); + + router.get('/getAllTopicos', function(req, res) { + ExecuteQueryPriorie(`select * from topicos;`, req, res); + }); + + router.get('/getTopico/:idtopicos', function(req, res) { + const idtopicos = parseInt(req.params.idtopicos); + ExecuteQueryPriorie(`select * from topicos where idtopicos = ${idtopicos} order by descricao asc;`, req, res); + }); + + router.get('/getAllTopicosTarefa/:idprojetos', function(req, res) { + const idprojetos = parseInt(req.params.idprojetos); + ExecuteQueryPriorie(`select * from topicos where idprojetos = ${idprojetos} order by descricao asc;`, req, res); + }); + + //#endregion + + //#region PRIORIDADES + + router.get('/getAllPrioridades', function(req, res) { + ExecuteQueryPriorie(`select * from prioridades;`, req, res); + }); + + //#endregion + + //#region ENVIO DE NOTIFICACOES + + const nodemailer = require('nodemailer'); + const transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: "zendioninc.contato@gmail.com", + pass: "gmailzendioninc", + } + }); + /*var transporter = nodemailer.createTransport({ + host: "email-ssl.com.br", + port: 465, + secure: true, + auth: { + user: 'staff@myrobot.com.br', + pass: 'stAff66**' + } + });*/ + + function EnviarEmail(Mensagem, Assunto, Email) { + var mailOptions = { + from: '"Zendion, INC" ', + to: Email, + subject: Assunto, + html: Mensagem + }; + transporter.sendMail(mailOptions, function (error, info) { + if (error) { + console.log("Erro ao enviar e-mail para: " + mailOptions.to); + console.log(error); + } + else { + console.log('Email enviado com sucesso para: ' + mailOptions.to + ' - ' + info.response); + } + }); + } + + + //#endregion + + //#region FUNCOES + + function fixApostrofe(content) { + for (let i = 0; i < 20; i++) { + content = content.replace("'", '''); + } + return content; + } + + //#endregion + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/sistemasController.js b/server/controllers/sistemasController.js new file mode 100644 index 0000000..83110d6 --- /dev/null +++ b/server/controllers/sistemasController.js @@ -0,0 +1,355 @@ +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + + router.get('/getSistemas', function (req, res) { + const sqlQuery = `SELECT * FROM sistemas order by nome asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemasEn', function (req, res) { + const sqlQuery = `SELECT * FROM sistemas WHERE habilitado = 1 order by nome asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemaByID/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT * FROM sistemas WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemaByIDLista/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT + s.*, + p.descricao as plataforma, + t.descricao as tiposdesistema, + l.descricao as tiposlicenca + FROM sistemas s + INNER JOIN plataformas p ON s.idplataformas = p.idplataformas + INNER JOIN tiposdesistema t ON t.idtiposdesistema = s.idtiposdesistema + INNER JOIN tiposlicenca l ON s.idtiposlicenca = l.idtiposlicenca + WHERE idsistemas = ${idsistemas} + order by s.nome asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemaVersao/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT versaoatual as VersaoAtual, nome_install as NomeInstall FROM sistemas WHERE idsistemas = ${idsistemas};`; + //ExecuteQuery(sqlQuery, req, res); + mysqlConnection.query(sqlQuery, [], function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(results[0]) + }); + }); + + router.get('/getTiposdesistema', function (req, res) { + const sqlQuery = `SELECT * FROM tiposdesistema order by descricao asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdesistemaByID/:idtiposdesistema', function (req, res) { + const idtiposdesistema = parseInt(req.params.idtiposdesistema); + const sqlQuery = `SELECT * FROM tiposdesistema WHERE idtiposdesistema = ${idtiposdesistema};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdelicenca', function (req, res) { + const sqlQuery = `SELECT * FROM tiposlicenca order by descricao asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdelicencaByID/:idtiposlicenca', function (req, res) { + const idtiposlicenca = parseInt(req.params.idtiposlicenca); + const sqlQuery = `SELECT * FROM tiposlicenca WHERE idtiposlicenca = ${idtiposlicenca};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getPlataformas', function (req, res) { + const sqlQuery = `SELECT * FROM plataformas order by descricao asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getPlataformaByID/:idplataformas', function (req, res) { + let idplataformas = parseInt(req.params.idplataformas); + const sqlQuery = `SELECT * FROM plataformas WHERE idplataformas = ${idplataformas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getDetalhesByID/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT * FROM sistemasdetalhes WHERE idsistemas = ${idsistemas} order by ordem asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getDetalhesByIDEn/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT * FROM sistemasdetalhes WHERE idsistemas = ${idsistemas} AND habilitado = 1 order by ordem asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertSistemas', function (req, res) { + const idsistemas = req.body.idsistemas; + const nome = req.body.nome; + const descricao = req.body.descricao; + const versaoatual = req.body.versaoatual; + const habilitado = req.body.habilitado ? 1 : 0; + const idtiposdesistema = req.body.idtiposdesistema; + const idplataformas = req.body.idplataformas; + const nome_install = req.body.nome_install; + const notasdeatualizacao = req.body.notasdeatualizacao; + const idtiposlicenca = req.body.idtiposlicenca; + const sqlQuery = `INSERT INTO sistemas (nome, descricao, versaoatual, habilitado, downloads, idtiposdesistema, idplataformas, nome_install, notasdeatualizacao, idtiposlicenca) + VALUES ('${nome}', '${descricao}', '${versaoatual}', ${habilitado}, 0, ${idtiposdesistema}, ${idplataformas}, '${nome_install}', '${notasdeatualizacao}', ${idtiposlicenca});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateSistemas', function (req, res) { + const idsistemas = parseInt(req.body.idsistemas); + const nome = req.body.nome; + const descricao = req.body.descricao; + const versaoatual = req.body.versaoatual; + const habilitado = req.body.habilitado ? 1 : 0; + const idtiposdesistema = req.body.idtiposdesistema; + const idplataformas = req.body.idplataformas; + const nome_install = req.body.nome_install; + const notasdeatualizacao = req.body.notasdeatualizacao; + const idtiposlicenca = req.body.idtiposlicenca; + const sqlQuery = `UPDATE sistemas SET + nome = '${nome}', + descricao = '${descricao}', + versaoatual = '${versaoatual}', + habilitado = ${habilitado}, + idtiposdesistema = ${idtiposdesistema}, + idplataformas = ${idplataformas}, + nome_install = '${nome_install}', + notasdeatualizacao = '${notasdeatualizacao}', + idtiposlicenca = ${idtiposlicenca} + WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteSistemas/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `DELETE FROM sistemas WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteSistemaUsuario/:idsistemas/:idusuarios', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `DELETE FROM sistemasusuario WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/downloadSistema', function (req, res) { + const idsistemas = parseInt(req.body.idsistemas); + const sqlQuery = `UPDATE sistemas SET + downloads = downloads + 1 + WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertSistemaUsuario', function (req, res) { + const idsistemas = parseInt(req.body.idsistemas); + const idusuarios = parseInt(req.body.idusuarios); + const sqlQuery = `INSERT INTO sistemasusuario (idsistemas, idusuarios, data_download) + SELECT DISTINCT ${idsistemas} AS idsistemas, ${idusuarios} AS idusuarios, NOW() AS data_download + FROM sistemasusuario su WHERE (SELECT COUNT(*) qtdDown FROM sistemasusuario WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios}) = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var nome_install = fields.nome; + var versaoatual = fields.versaoatual; + var idsistemas = fields.idsistemas; + var pathArquivo = ""; + var pathIcone = ""; + + try { + pathArquivo = files.arquivo.path; + } + catch(e) { + console.log("não copia arquivo"); + } + try { + pathIcone = files.icone.path; + } + catch(e) { + console.log("não copia icone"); + } + var dir = '/var/www/html/sistemas/'; + if (!fs.existsSync(dir + idsistemas + "/")) { + fs.mkdirSync(dir + idsistemas + "/"); + fs.mkdirSync(dir + idsistemas + "/detalhes/"); + fs.mkdirSync(dir + idsistemas + "/versoes/"); + fs.mkdirSync(dir + idsistemas + "/backups/"); + fs.mkdirSync(dir + idsistemas + "/versoes/" + versaoatual + "/"); + } + else if (!fs.existsSync(dir + idsistemas + "/versoes/" + versaoatual + "/")) { + fs.mkdirSync(dir + idsistemas + "/versoes/" + versaoatual + "/"); + } + if (pathArquivo != "") { + fs.rename(pathArquivo, dir + idsistemas + "/versoes/" + versaoatual + "/" + nome_install, function (err) { + console.log("arquivo copiado com sucesso"); + }); + } + if (pathIcone != "") { + fs.rename(pathIcone, dir + idsistemas + "/icone.png", function (err) { + console.log("icone copiado com sucesso!"); + }); + } + setTimeout(() => { + res.send(true); + }, 200); + }); + }); + + router.get('/getChavesSistema/:idsistemas/:idusuarios', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT * FROM chaves + WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getChavesSistemaLista/:idsistemas/:idusuarios', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT + idchaves, + licenca as Chave, + data_criacao as DataCriacao, + data_validade as DataValidade, + CASE WHEN data_validade < NOW() THEN 'Expirada' ELSE 'Válida' END AS Status, + CASE WHEN usada = 0 THEN 'Não' ELSE 'Sim' END AS Ativada + FROM chaves + WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertChave', function (req, res) { + let licenca = req.body.licenca; + let idusuarios = req.body.idusuarios; + let idsistemas = req.body.idsistemas; + let data_validade = req.body.data_validade; + let newdate = data_validade.toString(); + newdate = newdate.substring(0, newdate.length - 1); + const sqlQuery = `INSERT INTO chaves (licenca, data_criacao, data_validade, idusuarios, usada, idsistemas) + VALUES ('${licenca}', NOW(), '${newdate}', ${idusuarios}, 0, ${idsistemas});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertDetalhe', function (req, res) { + const idsistemasdetalhes = req.body.idsistemasdetalhes; + const idsistemas = req.body.idsistemas; + const descricao = req.body.descricao; + const ordem = parseInt(req.body.ordem); + const habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `INSERT INTO sistemasdetalhes (idsistemas, descricao, ordem, habilitado) + VALUES (${idsistemas}, '${descricao}', ${ordem}, ${habilitado});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateDetalhe', function (req, res) { + const idsistemasdetalhes = req.body.idsistemasdetalhes; + const idsistemas = req.body.idsistemas; + const descricao = req.body.descricao; + const ordem = parseInt(req.body.ordem); + const habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `UPDATE sistemasdetalhes SET + idsistemas = ${idsistemas}, + descricao = '${descricao}', + ordem = ${ordem}, + habilitado = ${habilitado} + WHERE idsistemasdetalhes = ${idsistemasdetalhes};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteDetalhe/:idsistemasdetalhes/:idsistemas/:index', function (req, res) { + const idsistemasdetalhes = parseInt(req.params.idsistemasdetalhes); + const idsistemas = parseInt(req.params.idsistemas); + const index = parseInt(req.params.index); + const sqlQuery = `DELETE FROM sistemasdetalhes WHERE idsistemasdetalhes = ${idsistemasdetalhes};`; + ExecuteQuery(sqlQuery, req, res); + var Path = '/var/www/html/sistemas/' + idsistemas + "/detalhes/sistema_" + index + ".jpg"; + const fs = require('fs'); + if (fs.existsSync(Path)) { + fs.unlinkSync(Path); + } + }); + + router.post('/copyDetalhe', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files) { + const fs = require('fs'); + var nome = fields.nome; + var idsistemas = fields.idsistemas; + var pathArquivo = files.arquivo.path; + var dir = '/var/www/html/sistemas/' + idsistemas + "/detalhes/"; + fs.rename(pathArquivo, dir + nome, function (err) { + if (err) + console.log(err); + else + console.log("arquivo copiado com sucesso"); + res.send(true); + }); + }); + }); + + router.get('/atualizarListaDetalhes/:idsistemas', (req, res) => { + const idsistemas = parseInt(req.params.idsistemas); + const fs = require('fs'); + var dir = '/var/www/html/sistemas/' + idsistemas + "/detalhes/"; + let i = 0; + fs.readdirSync(dir).forEach(file => { + fs.renameSync(dir + file, dir + file.split('_')[0] + "_" + i + '.jpg'); + i++; + }); + res.send(true); + }); + + router.get('/getSistemaVersoes/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const fs = require('fs'); + const dir = '/var/www/html/sistemas/' + idsistemas + "/versoes/"; + if (!fs.existsSync(dir)) + fs.mkdirSync(dir); + const versoes = fs.readdirSync(dir); + var lista = []; + versoes.forEach(versao => { + const file = fs.readdirSync(dir + versao)[0]; + const arquivo = dir + versao + "/" + file; + const stats = fs.statSync(arquivo); + lista.push(arquivo + "¬" + stats.birthtime); + }); + res.send(lista); + }); + + router.get('/getSistemaDownloads/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const fs = require('fs'); + const dir = '/var/www/html/sistemas/' + idsistemas + "/downloads/"; + if (!fs.existsSync(dir)) + fs.mkdirSync(dir); + const downloads = fs.readdirSync(dir); + var lista = []; + downloads.forEach(download => { + var stats = fs.statSync(dir + download); + lista.push(dir + download + "¬" + stats.birthtime); + }); + res.send(lista); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/sliderController.js b/server/controllers/sliderController.js new file mode 100644 index 0000000..8347cc2 --- /dev/null +++ b/server/controllers/sliderController.js @@ -0,0 +1,75 @@ +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + + router.get('/getAllSlides', function (req, res) { + const sqlQuery = `SELECT * FROM slides;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSlidesEn', function (req, res) { + const sqlQuery = `select + idslides, + descricao, + CASE WHEN habilitado = 1 THEN 'Sim' ELSE 'Não' END AS habilitado, + link + FROM slides + WHERE habilitado = 1;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSlideByID/:idslides', function (req, res) { + const idslides = parseInt(req.params.idslides); + const sqlQuery = `SELECT * FROM slides WHERE idslides = ${idslides};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertSlides', function (req, res) { + const idslides = req.body.idslides; + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `INSERT INTO slides (descricao, habilitado, link) VALUES ('${descricao}', ${habilitado}, '${link}');`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateSlides', function (req, res) { + const idslides = parseInt(req.body.idslides); + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `UPDATE slides SET + descricao = '${descricao}', + habilitado = ${habilitado}, + link = '${link}' + WHERE idslides = ${idslides};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteSlides/:idslides', function (req, res) { + const idslides = parseInt(req.params.idslides); + const sqlQuery = `DELETE FROM slides WHERE idslides = ${idslides};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var idslides = fields.idslides; + var pathImagem = files.imagem.path; + var dir = '/var/www/html/imagens/slides/'; + fs.rename(pathImagem, dir + "slide_" + idslides + ".jpg", function (err) { + console.log("arquivo copiado com sucesso"); + res.send(true); + }); + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/usuariosController.js b/server/controllers/usuariosController.js new file mode 100644 index 0000000..1756f05 --- /dev/null +++ b/server/controllers/usuariosController.js @@ -0,0 +1,267 @@ +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/ativarUsuario/:idusuarios', function (req, res) { + const idusuarios = parseInt(req.params.idusuarios); + + if (!idusuarios || isNaN(idusuarios)) { + return res.status(400).send(RenderPaginaAtivacao({ + sucesso: false, + titulo: 'Link inválido', + mensagem: 'O link de ativação utilizado é inválido ou está incompleto.', + textoBotao: 'Voltar ao site' + })); + } + + const sqlQuery = ` + UPDATE usuarios + SET habilitado = 1 + WHERE idusuarios = ?; + `; + + mysqlConnection.query(sqlQuery, [idusuarios], function (error, results) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? '500 error' : '200 success'}`); + + if (error) { + return res.status(500).send(RenderPaginaAtivacao({ + sucesso: false, + titulo: 'Erro ao ativar conta', + mensagem: 'Não foi possível ativar sua conta no momento. Tente novamente mais tarde ou entre em contato com o suporte.', + textoBotao: 'Voltar ao site' + })); + } + + if (!results || results.affectedRows === 0) { + return res.status(404).send(RenderPaginaAtivacao({ + sucesso: false, + titulo: 'Conta não encontrada', + mensagem: 'Não encontramos uma conta associada a este link de ativação.', + textoBotao: 'Voltar ao site' + })); + } + + return res.status(200).send(RenderPaginaAtivacao({ + sucesso: true, + titulo: 'Conta ativada com sucesso!', + mensagem: 'Sua conta foi ativada e você já pode acessar a plataforma Zendion, INC.', + textoBotao: 'Entrar agora' + })); + }); + }); + + function RenderPaginaAtivacao({ sucesso, titulo, mensagem, textoBotao }) { + const corPrincipal = sucesso ? '#071b63' : '#991b1b'; + const corFundoIcone = sucesso ? '#dcfce7' : '#fee2e2'; + const corIcone = sucesso ? '#15803d' : '#b91c1c'; + const icone = sucesso ? '✓' : '!'; + const linkBotao = sucesso ? 'https://zendioninc.com.br/login' : 'https://zendioninc.com.br/home'; + + return ` + + + + + + ${titulo} + + + +
+ +
+ +
+ Zendion, INC. +
+ +
+
+ ${icone} +
+ +

+ ${titulo} +

+ +

+ ${mensagem} +

+ + + ${textoBotao} + +
+ +
+

+ Zendion, INC. • Este é um processo automático de ativação de conta. +

+
+ +
+
+ + + `; + } + + router.get('/getUsuarios', function (req, res) { + const sqlQuery = `SELECT * FROM usuarios;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getUsuarioByID/:idusuarios', function (req, res) { + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT * FROM usuarios WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemasDoUsuario/:idusuarios', function (req, res) { + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT + s.idsistemas, + s.nome, + su.data_download, + su.idusuarios, + s.descricao, + (SELECT COUNT(1) FROM chaves cv WHERE cv.idsistemas = s.idsistemas AND cv.idusuarios = su.idusuarios AND cv.data_validade > CURRENT_DATE) AS chavesValidas, + CASE WHEN s.idtiposlicenca = 6 THEN 1 ELSE 0 END AS gratis + FROM sistemasusuario su + INNER JOIN sistemas s ON s.idsistemas = su.idsistemas + WHERE su.idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/authUser', function (req, res) { + let usuario = req.body.usuario; + let senha = req.body.senha; + const sqlQuery = `SELECT + idusuarios, + nome, + idtiposdeusuario, + habilitado + FROM usuarios + WHERE usuario = '${usuario}' AND senha = '${senha}';`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdeusuario', function (req, res) { + const sqlQuery = `SELECT * FROM tiposdeusuario;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertUsuarios', function (req, res) { + let idusuarios = req.body.idusuarios; + let nome = req.body.nome; + let usuario = req.body.usuario; + let senha = req.body.senha; + let email = req.body.email; + let idtiposdeusuario = req.body.idtiposdeusuario; + let cpf = req.body.cpf; + let habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `INSERT INTO usuarios (nome, usuario, senha, data_cadastro, cpf, habilitado, email, idtiposdeusuario) + VALUES ('${nome}', UPPER('${usuario}'), UPPER('${senha}'), now(), '${cpf}', ${habilitado}, '${email}', ${idtiposdeusuario});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateUsuarios', function (req, res) { + let idusuarios = req.body.idusuarios; + let nome = req.body.nome; + let usuario = req.body.usuario; + let senha = req.body.senha; + let email = req.body.email; + let idtiposdeusuario = req.body.idtiposdeusuario; + let cpf = req.body.cpf; + let habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `UPDATE usuarios SET + nome = '${nome}', + usuario = UPPER('${usuario}'), + senha = UPPER('${senha}'), + cpf = '${cpf}', + habilitado = ${habilitado}, + email = '${email}', + idtiposdeusuario = ${idtiposdeusuario} + WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteUsuarios/:idusuarios', function (req, res) { + let idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `DELETE FROM usuarios WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/setUsada', function (req, res) { + let chave = req.body.Chave; + const sqlQuery = `UPDATE chaves SET usada = 1 WHERE licenca = '${chave}';`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/validaLicenca', function (req, res) { + let usuario = req.body.Usuario; + let senha = req.body.Senha; + let chave = req.body.Chave; + const sqlQuery = `SELECT + u.nome AS Nome, + u.cpf AS CPF, + c.usada AS Usada, + c.idsistemas AS IDSistema + FROM chaves c + INNER JOIN usuarios u ON c.idusuarios = u.idusuarios + WHERE c.licenca = '${chave}' AND u.usuario = '${usuario}' AND u.senha = '${senha}' AND u.habilitado = 1 AND c.usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertTrocasenha', function (req, res) { + let idusuarios = parseInt(req.body.idusuarios); + let tag = req.body.tag; + const sqlQuery = `INSERT INTO trocasenha (idusuarios, tag, usada) VALUES (${idusuarios}, '${tag}', 0);`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTrocasenha', function (req, res, next) { + const sqlQuery = `SELECT * FROM trocasenha WHERE usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTrocasenhaByTag/:tag', function (req, res, next) { + let tag = req.params.tag; + const sqlQuery = `SELECT * FROM trocasenha WHERE tag = '${tag}' AND usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/setExpirado', function (req, res, next) { + let tag = req.body.tag; + const sqlQuery = `UPDATE trocasenha SET usada = 1 WHERE tag = '${tag}';`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/trocaSenha', function (req, res, next) { + const idusuarios = parseInt(req.body.idusuarios); + const senha = req.body.senha; + const sqlQuery = `UPDATE usuarios SET + senha = UPPER('${senha}') + WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/validaLicencaByChave/:idsistemas', function (req, res, next) { + const idsistemas = parseInt(req.params.idsistemas); + const chave = req.body.Chave; + const sqlQuery = `SELECT + u.nome AS Nome, + u.cpf AS CPF, + c.usada AS Usada, + c.idsistemas AS IDSistema + FROM chaves c + INNER JOIN usuarios u ON c.idusuarios = u.idusuarios + WHERE c.licenca = '${chave}' AND c.idsistemas = ${idsistemas} AND u.habilitado = 1 AND c.usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/forever.json b/server/forever.json new file mode 100644 index 0000000..b71c0be --- /dev/null +++ b/server/forever.json @@ -0,0 +1,10 @@ +[ + { + "uid": "zendioninc_api", + "append": true, + "watch": false, + "script": "server.js", + "sourceDir": "/var/www/html/server/", + "workingDir": "/var/www/html/server/" + } +] diff --git a/server/gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json b/server/gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json new file mode 100644 index 0000000..125fdd0 --- /dev/null +++ b/server/gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "gca-control-bcb9b", + "private_key_id": "2e672cfd0a80e4d837abe0b0588540954677e4f8", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDKqU5nsJGM5P8C\n4DUsrNYIbIVQxZRxL1mdEvAtYuLg8S6sEjIaxUQElDazQ9W8X4fdU/oVL9oziCCG\nwlJoEKsaPMiLIi4aBzgyCxSjsMk1uJonl++TkEPxUQa4gy8fq/UhHXkBROS9nBy2\n7VWqvcN176oPmYwhg5qLxfhYsZWwwZLBtntpQNaGdA0Ul7h+nwp5qsrkst3Qx2Su\nqfvUOYr8pvvzb+P+eU1Qw5aPBjGQQXcZ8rE4d3qyTSJ+xaZwblPViQhHAch/bt8n\n2uKN/rFjl3QpumzDuiF7z7+dFqf4vnCfpHbar1jLK3HIS6RE+y5iTqBeREzRSLts\n2VAN1PP1AgMBAAECggEACW4nQMIcWmpLJy2Fg+qXULqIrz7BFCLlgF6MewwuLanu\nEkyMH3yc7Y/zsKlK1ZJmGSmKdPhuUUtiZMA/mJSSpaynkfkunIBIADoi79AEOOH6\nGGFkoPZLrGZpEeZsJ6+Mf0nmuCVQyzWWYiO5QrHvBGVOgZ3TQbmk6XVLmQhLGcz+\n6LdO225096syWBvAelcv8iSs2D7mEv920TT5Hj1ZwOuEnfOca38fiBpi359VrbMd\nqEDDO3B3qoy3mrWxWLW1NqTdavLLvJhee651xrFq4f5Zy99uuHVs9DD+L5Yo56BD\nRZBKJOmMHMtvpe3ePyYfr8d1E0ijMuWwIStnRHgFSQKBgQDuKgGwGq54wvg0ybgK\ngqtP/2gGHjXnS1ii5vUxy2DverCv1FcI5ll7/1LcgKQSwFBZGYcg+p7ZMTh31CCe\nQPvIEeFuo0pJIdqcjANKi1V9tQLq2BzJMJ/KXQpkr97Bz9PNaBy877Or/Nsf95Ao\n6rdaCteox5FU1vmFay2rfW/8XQKBgQDZ1qeIFMUFqKnMFKokk/bWnuSeCnwf6IGu\naMKQY0lVV1Y1nM7Ti0fLZRrEpYnSjvwpPYvno+onGH5yUSlP3owJdvaqPdLSAy54\nHrm/YdUUBx+f2LUdcC7hIaS+2b3rXlO5tT98wqbqYvFf5QSVfknjKpAEJ0ADYm7M\n4+bizLaceQKBgGdjcOwkCQ1/hgRUdUKKyxelRmExiDDqMoY1QMfnBCOx3TXXNhk0\n9i+v/Saf6ZoCRl8Hh/O3GHIsvdi3C5nnl+WYbYZ7+Gma+q3u0hbwOaKii6urOYPV\nSeitTy+6cTcto0KOKbuTSyokUHOmIrzAd+vsvQYV7G8qC5PxnRfPEmg5AoGAJShr\nXVgFn4h8pjYkK6cdpNBnuNmbAKpdbI2sGosFGEyUhQKheQ46CeTOIxsFnmgLdVFt\nSu734wFXmFJl1JzmkDq9qp5vFqm6RH0hPBcJDKiGaXLCuinHpVliy7dCoSJu76+O\nC878P+DuwWfEV2e6XMiG1l6HmcwxkDuTx74ZrCkCgYEAsa0RwkyCvQBShW7BtZot\nd6iziBqI+gqSq4KYraWvvMVrjA00IKk0B/uzofnK/aX98HJM4NzO9EAbW0ARpn5D\nDv7FwBRT+fWG8CW+XvT5LiKO7KYILimFm4cvzuv5gztLGexlfFBiUn1+t6fzI5Yf\neCafFoJuPEDGHoIOAqd5PME=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-pf0od@gca-control-bcb9b.iam.gserviceaccount.com", + "client_id": "105026073302094660795", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-pf0od%40gca-control-bcb9b.iam.gserviceaccount.com" +} diff --git a/server/google-services.json b/server/google-services.json new file mode 100644 index 0000000..ec54517 --- /dev/null +++ b/server/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "274810216572", + "project_id": "gca-control-bcb9b", + "storage_bucket": "gca-control-bcb9b.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:274810216572:android:0d9250a6adb98f84f4a9f9", + "android_client_info": { + "package_name": "com.ZendionInc.GCAControl" + } + }, + "oauth_client": [ + { + "client_id": "274810216572-6c1qof9nb2gns24604s1narajuhfluh4.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDTKEi1eHsF50y1KIMHY9x04OXXOVqs7ig" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "274810216572-6c1qof9nb2gns24604s1narajuhfluh4.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..76c45ac --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2558 @@ +{ + "name": "server", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@firebase/app-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", + "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" + }, + "@firebase/auth-interop-types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", + "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" + }, + "@firebase/component": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.10.tgz", + "integrity": "sha512-mzUpg6rsBbdQJvAdu1rNWabU3O7qdd+B+/ubE1b+pTbBKfw5ySRpRRE6sKcZ/oQuwLh0HHB6FRJHcylmI7jDzA==", + "requires": { + "@firebase/util": "1.4.3", + "tslib": "^2.1.0" + } + }, + "@firebase/database": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.5.tgz", + "integrity": "sha512-1Pd2jYqvqZI7SQWAiXbTZxmsOa29PyOaPiUtr8pkLSfLp4AeyMBegYAXCLYLW6BNhKn3zNKFkxYDxYHq4q+Ixg==", + "requires": { + "@firebase/auth-interop-types": "0.1.6", + "@firebase/component": "0.5.10", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "@firebase/database-compat": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.5.tgz", + "integrity": "sha512-UVxkHL24sZfsjsjs+yiKIdYdrWXHrLxSFCYNdwNXDlTkAc0CWP9AAY3feLhBVpUKk+4Cj0I4sGnyIm2C1ltAYg==", + "requires": { + "@firebase/component": "0.5.10", + "@firebase/database": "0.12.5", + "@firebase/database-types": "0.9.4", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.3", + "tslib": "^2.1.0" + }, + "dependencies": { + "@firebase/database-types": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.4.tgz", + "integrity": "sha512-uAQuc6NUZ5Oh/cWZPeMValtcZ+4L1stgKOeYvz7mLn8+s03tnCDL2N47OLCHdntktVkhImQTwGNARgqhIhtNeA==", + "requires": { + "@firebase/app-types": "0.7.0", + "@firebase/util": "1.4.3" + } + } + } + }, + "@firebase/database-types": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.7.3.tgz", + "integrity": "sha512-dSOJmhKQ0nL8O4EQMRNGpSExWCXeHtH57gGg0BfNAdWcKhC8/4Y+qfKLfWXzyHvrSecpLmO0SmAi/iK2D5fp5A==", + "requires": { + "@firebase/app-types": "0.6.3" + }, + "dependencies": { + "@firebase/app-types": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz", + "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw==" + } + } + }, + "@firebase/logger": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", + "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/util": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.4.3.tgz", + "integrity": "sha512-gQJl6r0a+MElLQEyU8Dx0kkC2coPj67f/zKZrGR7z7WpLgVanhaCUqEsptwpwoxi9RMFIaebleG+C9xxoARq+Q==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@google-cloud/common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.8.1.tgz", + "integrity": "sha512-FOs3NFU6bDt5mXE7IFpwIeqzLwRZNu9lJYl+bHVNkwmxX/w4VyDZAiGjQHhpV1Ek+muNKlX8HPchxaIxNTuOhw==", + "optional": true, + "requires": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^7.9.2", + "retry-request": "^4.2.2", + "teeny-request": "^7.0.0" + } + }, + "@google-cloud/firestore": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.15.1.tgz", + "integrity": "sha512-2PWsCkEF1W02QbghSeRsNdYKN1qavrHBP3m72gPDMHQSYrGULOaTi7fSJquQmAtc4iPVB2/x6h80rdLHTATQtA==", + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^2.24.1", + "protobufjs": "^6.8.6" + } + }, + "@google-cloud/paginator": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.6.tgz", + "integrity": "sha512-XCTm/GfQIlc1ZxpNtTSs/mnZxC2cePNhxU3X8EzHXKIJ2JFncmJj2Fcd2IP+gbmZaSZnY0juFxbUCkIeuu/2eQ==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + } + }, + "@google-cloud/projectify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz", + "integrity": "sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==", + "optional": true + }, + "@google-cloud/promisify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", + "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==", + "optional": true + }, + "@google-cloud/storage": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.17.0.tgz", + "integrity": "sha512-qM2+ysRL+SpBuDLYmGGBi4E961VUp0floYTFGCoTwhZsk//vEzVrGQZ2ZXeiNbijcVQNv9iAG2fVvmiBT3jo+Q==", + "optional": true, + "requires": { + "@google-cloud/common": "^3.8.1", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/promisify": "^2.0.0", + "abort-controller": "^3.0.0", + "arrify": "^2.0.0", + "async-retry": "^1.3.3", + "compressible": "^2.0.12", + "configstore": "^5.0.0", + "date-and-time": "^2.0.0", + "duplexify": "^4.0.0", + "extend": "^3.0.2", + "gaxios": "^4.0.0", + "get-stream": "^6.0.0", + "google-auth-library": "^7.0.0", + "hash-stream-validation": "^0.2.2", + "mime": "^3.0.0", + "mime-types": "^2.0.8", + "p-limit": "^3.0.1", + "pumpify": "^2.0.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.4", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "optional": true + } + } + }, + "@grpc/grpc-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", + "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "optional": true, + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "optional": true, + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + } + }, + "@panva/asn1.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", + "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "optional": true + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "optional": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "optional": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "optional": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "optional": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "optional": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "optional": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "optional": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "optional": true + }, + "@sendgrid/client": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-8.1.3.tgz", + "integrity": "sha512-mRwTticRZIdUTsnyzvlK6dMu3jni9ci9J+dW/6fMMFpGRAJdCJlivFVYQvqk8kRS3RnFzS7sf6BSmhLl1ldDhA==", + "requires": { + "@sendgrid/helpers": "^8.0.0", + "axios": "^1.6.8" + } + }, + "@sendgrid/helpers": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-8.0.0.tgz", + "integrity": "sha512-Ze7WuW2Xzy5GT5WRx+yEv89fsg/pgy3T1E3FS0QEx0/VvRmigMZ5qyVGhJz4SxomegDkzXv/i0aFPpHKN8qdAA==", + "requires": { + "deepmerge": "^4.2.2" + } + }, + "@sendgrid/mail": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-8.1.3.tgz", + "integrity": "sha512-Wg5iKSUOER83/cfY6rbPa+o3ChnYzWwv1OcsR8gCV8SKi+sUPIMroildimlnb72DBkQxcbylxng1W7f0RIX7MQ==", + "requires": { + "@sendgrid/client": "^8.1.3", + "@sendgrid/helpers": "^8.0.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "optional": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-jwt": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", + "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", + "requires": { + "@types/express": "*", + "@types/express-unless": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/express-unless": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.2.tgz", + "integrity": "sha512-Q74UyYRX/zIgl1HSp9tUX2PlG8glkVm+59r7aK4KGKzC5jqKIOX6rrVLRQrzpZUQ84VukHtRoeAuon2nIssHPQ==", + "requires": { + "@types/express": "*" + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "optional": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "optional": true, + "requires": { + "retry": "0.13.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "optional": true + }, + "bignumber.js": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.4.tgz", + "integrity": "sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg==" + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "requires": { + "fill-range": "^7.1.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "optional": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "optional": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "optional": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "optional": true + }, + "date-and-time": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.1.0.tgz", + "integrity": "sha512-X/b2gM7e8zQ7siiE0DhRLeNMpuCkIqec5Jnx4GMk/HWB71a6e5Lz48mH9/GIS/hpLsBRFZfMF1gjXBkY0vq5oA==", + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.1.tgz", + "integrity": "sha512-ObioMtXnmjYs3aRtpIJt9rgQSPCIhKVkFPip+E9GUDyWl8N435znUxK/JfNwGZJ2wnn5JKQ7Ly3vOK5Q5dylGA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "optional": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "optional": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "optional": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", + "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "requires": { + "once": "^1.4.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "optional": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + } + } + }, + "express-formidable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/express-formidable/-/express-formidable-1.0.0.tgz", + "integrity": "sha1-3JIvBFUTIyJFip7BowHYkbP/yo0=", + "requires": { + "formidable": "^1.0.17" + } + }, + "express-jwt": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.1.tgz", + "integrity": "sha512-1C9RNq0wMp/JvsH/qZMlg3SIPvKu14YkZ4YYv7gJQ1Vq+Dv8LH9tLKenS5vMNth45gTlEUGx+ycp9IHIlaHP/g==", + "requires": { + "async": "^1.5.0", + "express-unless": "^0.3.0", + "jsonwebtoken": "^8.1.0", + "lodash.set": "^4.0.0" + } + }, + "express-unless": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", + "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "optional": true + }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", + "optional": true + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "firebase-admin": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-10.0.1.tgz", + "integrity": "sha512-p8nrhNJyuAj/Pc3M0TWVU8rd4rPoeCREfRt7dJ+EwkMvFCdJ6Cb21y3ZlN3Qsbok8PEQjuWLNy+C3LQMTfUOcQ==", + "requires": { + "@firebase/database-compat": "^0.1.1", + "@firebase/database-types": "^0.7.2", + "@google-cloud/firestore": "^4.5.0", + "@google-cloud/storage": "^5.3.0", + "@types/node": ">=12.12.47", + "dicer": "^0.3.0", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "^2.0.2", + "node-forge": "^0.10.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "optional": true + }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "optional": true, + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "optional": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "optional": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "google-auth-library": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.11.0.tgz", + "integrity": "sha512-3S5jn2quRumvh9F/Ubf7GFrIq71HZ5a6vqosgdIu105kkk0WtSqc2jGCRqtWWOLRS8SX3AHACMOEDxhyWAQIcg==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "google-gax": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.29.3.tgz", + "integrity": "sha512-Knbg+SEFf31GxjjPm9asetQrqPWq0Yjmi4kW1WHE9UhG13y9avzfKnjuAW3Mz79y2LdZO/+LP9wZW2QN6T47SQ==", + "optional": true, + "requires": { + "@grpc/grpc-js": "~1.5.0", + "@grpc/proto-loader": "^0.6.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^7.6.1", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^2.1.1", + "proto3-json-serializer": "^0.1.5", + "protobufjs": "6.11.2", + "retry-request": "^4.0.0" + } + }, + "google-p12-pem": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", + "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", + "optional": true, + "requires": { + "node-forge": "^1.0.0" + }, + "dependencies": { + "node-forge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "optional": true + } + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "gtoken": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", + "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", + "optional": true, + "requires": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "hash-stream-validation": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", + "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", + "optional": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "optional": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "optional": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "optional": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "optional": true + }, + "is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "jose": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", + "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", + "requires": { + "@panva/asn1.js": "^1.0.0" + } + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "optional": true, + "requires": { + "bignumber.js": "^9.0.0" + }, + "dependencies": { + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "optional": true + } + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonwebtoken": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz", + "integrity": "sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag==", + "requires": { + "jws": "^3.1.5", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "jwa": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", + "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.10", + "safe-buffer": "^5.0.1" + } + }, + "jwks-rsa": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.5.tgz", + "integrity": "sha512-fliHfsiBRzEU0nXzSvwnh0hynzGB0WihF+CinKbSRlaqRxbqqKf2xbBPgwc8mzf18/WgwlG8e5eTpfSTBcU4DQ==", + "requires": { + "@types/express-jwt": "0.0.42", + "debug": "^4.3.2", + "jose": "^2.0.5", + "limiter": "^1.1.5", + "lru-memoizer": "^2.1.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "jws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", + "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", + "requires": { + "jwa": "^1.1.5", + "safe-buffer": "^5.0.1" + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "optional": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "optional": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lru-memoizer": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", + "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", + "requires": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, + "requires": { + "semver": "^6.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mercadopago": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/mercadopago/-/mercadopago-2.0.15.tgz", + "integrity": "sha512-sIV/Kow8i2raNrWT0CDjOLiEg92FiqgX55psWj4hEXcqmG3R9n5ST/yALN6awdgG0OzA/fq16YH0qYG/8y++Zg==", + "requires": { + "node-fetch": "^2.6.12", + "uuid": "^9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mysql": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.15.0.tgz", + "integrity": "sha512-C7tjzWtbN5nzkLIV+E8Crnl9bFyc7d3XJcBAvHKEVkjrYjogz3llo22q6s/hw+UcsE4/844pDob9ac+3dVjQSA==", + "requires": { + "bignumber.js": "4.0.4", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "sqlstring": "2.3.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "nodemailer": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==" + }, + "nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "requires": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" + }, + "brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "requires": { + "balanced-match": "^4.0.2" + } + }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "requires": { + "brace-expansion": "^5.0.5" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "optional": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "optional": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proto3-json-serializer": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.6.tgz", + "integrity": "sha512-tGbV6m6Kad8NqxMh5hw87euPS0YoZSAOIfvR01zYkQV8Gpx1V/8yU/0gCKCvfCkhAJsjvzzhnnsdQxA1w7PSog==", + "optional": true, + "requires": { + "protobufjs": "^6.11.2" + } + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "optional": true, + "requires": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "optional": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "optional": true + }, + "retry-request": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", + "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", + "optional": true, + "requires": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "optional": true + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "requires": { + "semver": "^7.5.3" + }, + "dependencies": { + "semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==" + } + } + }, + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", + "optional": true + }, + "sqlstring": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.0.tgz", + "integrity": "sha1-UluKT9Jtb3GqYegipsr5dtMa0qg=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "requires": { + "stubs": "^3.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "optional": true + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "teeny-request": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.3.tgz", + "integrity": "sha512-Ew3aoFzgQEatLA5OBIjdr1DWJUaC1xardG+qbPPo5k/y/3fMwXLxpjh5UB5dVfElktLaQbbMs80chkz53ByvSg==", + "optional": true, + "requires": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "optional": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "optional": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "requires": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "optional": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "optional": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "optional": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "optional": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "optional": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "optional": true + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..a8efd91 --- /dev/null +++ b/server/package.json @@ -0,0 +1,30 @@ +{ + "name": "server", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@sendgrid/mail": "^8.1.3", + "body-parser": "^1.18.3", + "cors": "^2.8.4", + "dotenv": "^17.4.2", + "express": "^4.16.3", + "express-formidable": "^1.0.0", + "express-jwt": "^5.3.1", + "firebase-admin": "^10.0.1", + "formidable": "^1.2.1", + "jsonwebtoken": "^8.3.0", + "lodash": "^4.17.10", + "mercadopago": "^2.0.15", + "mysql": "^2.15.0", + "nodemailer": "^6.10.1", + "nodemon": "^3.1.14", + "shelljs": "^0.8.4", + "unzipper": "^0.12.3" + } +} diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..0bacfa2 --- /dev/null +++ b/server/server.js @@ -0,0 +1,37 @@ +var express = require('express'); +var http = require('http'); +var app = express(); +var cors = require('cors'); +var bodyParser = require('body-parser'); + +var corsOptions = { + origin: '*', + optionsSuccessStatus: 200 +} + +app.use(cors(corsOptions)); +app.use(bodyParser.urlencoded({ extended: true })); +app.use(bodyParser.json()); + +http.createServer(app).listen(1337, () => { + console.log(`API is listening on 1337`); +}); + +app.use('/users', require('./controllers/usuariosController')()); +app.use('/sistemas', require('./controllers/sistemasController')()); +app.use('/slides', require('./controllers/sliderController')()); +app.use('/noticias', require('./controllers/noticiasController')()); +app.use('/arquivos', require('./controllers/arquivosController')()); +app.use('/bingo', require('./controllers/bingoController')()); +app.use('/gca', require('./controllers/gcaController')()); +app.use('/priorie', require('./controllers/priorieController')()); +app.use('/email', require('./controllers/emailController').router); +app.use('/checkout', require('./controllers/checkoutController')()); + +app.use('/otp', require('./controllers/oriontardproController')()); + +// Allteeth +app.use('/api_5/sincronia', require('./controllers/allteeth/sincroniaController')()); +app.use('/api_5/users', require('./controllers/allteeth/usuariosController')()); + +app.use('/agrobase', require('./controllers/agrobaseController')()); diff --git a/src/app/agrobase/login/login.component.html b/src/app/agrobase/login/login.component.html new file mode 100644 index 0000000..8335716 --- /dev/null +++ b/src/app/agrobase/login/login.component.html @@ -0,0 +1 @@ +agrobase login \ No newline at end of file diff --git a/src/app/agrobase/login/login.component.scss b/src/app/agrobase/login/login.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/agrobase/login/login.component.ts b/src/app/agrobase/login/login.component.ts new file mode 100644 index 0000000..c7f82f6 --- /dev/null +++ b/src/app/agrobase/login/login.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-agrobase-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class AgrobaseLoginComponent implements OnInit { + + constructor( + private route: ActivatedRoute + ) { } + + ngOnInit() { + + } + +} diff --git a/src/app/agrobase/versionamento/versionamento.component.html b/src/app/agrobase/versionamento/versionamento.component.html new file mode 100644 index 0000000..44374fc --- /dev/null +++ b/src/app/agrobase/versionamento/versionamento.component.html @@ -0,0 +1,115 @@ + +

Gerenciamento de Arquivos de Versão

+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome do Arquivo para Download{{ arquivo.ArquivoDownload }}Nome do Arquivo{{ arquivo.Arquivo }}Diretório{{ arquivo.Diretorio }}Extensão{{ arquivo.Extensao }}Versão{{ arquivo.Versao }}Tipo de Arquivo{{ arquivo.TipoArquivo | tipoArquivoNome }}Ações + + +
+ + + +

{{ data?.novo ? 'Adicionar Arquivo' : 'Editar Arquivo' }}

+
+ + + Nome do Arquivo Local + + + + + + Diretório + + + + + + Extensão + + + + + + Versão + + + + + + Tipo do Arquivo + + {{ tipo }} + + + + + + Nome do Arquivo para Download + + + + + + + +
+ + +
+
+
diff --git a/src/app/agrobase/versionamento/versionamento.component.scss b/src/app/agrobase/versionamento/versionamento.component.scss new file mode 100644 index 0000000..aa0c23a --- /dev/null +++ b/src/app/agrobase/versionamento/versionamento.component.scss @@ -0,0 +1,50 @@ +.agrobase-container { + background-color: #1A237E; /* Fundo azul escuro */ + color: #E3F2FD; /* Texto branco */ + padding: 20px; + border-radius: 8px; + display: flex; + flex-direction: column; + align-items: center; +} + +h1 { + color: #FFFFFF; /* Título branco */ + text-align: center; + margin-bottom: 20px; +} + +.table-container { + width: 100%; /* Largura total */ + background-color: #283593; /* Azul médio para destaque */ + color: #E3F2FD; /* Texto branco */ + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + margin-top: 20px; +} + +.mat-header-cell, .mat-cell { + color: #E3F2FD; /* Texto branco */ +} + +.mat-form-field { + color: #E3F2FD; /* Texto branco */ + background-color: #283593; /* Azul médio para contraste */ + border-radius: 4px; +} + +.mat-dialog-container { + background-color: #1E88E5; /* Fundo mais claro para o diálogo */ + color: #E3F2FD; + padding: 20px; + border-radius: 8px; +} + +.mat-button { + color: #E3F2FD; + background-color: #42A5F5; /* Botão azul claro */ +} + +.mat-button:hover { + background-color: #64B5F6; /* Azul mais claro para hover */ +} diff --git a/src/app/agrobase/versionamento/versionamento.component.ts b/src/app/agrobase/versionamento/versionamento.component.ts new file mode 100644 index 0000000..5c64e78 --- /dev/null +++ b/src/app/agrobase/versionamento/versionamento.component.ts @@ -0,0 +1,154 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatDialog, MatTableDataSource } from '@angular/material'; +import { ActivatedRoute } from '@angular/router'; +import { AgrobaseVersionFileModel, TiposArquivos } from 'src/app/models/agrobaseModel'; +import { AgrobaseService } from 'src/app/services/agrobase.service'; + +@Component({ + selector: 'app-agrobase-versionamento', + templateUrl: './versionamento.component.html', + styleUrls: ['./versionamento.component.scss'] +}) +export class AgrobaseVersionamentoComponent implements OnInit { + + displayedColumns: string[] = ['ArquivoDownload', 'Arquivo', 'Diretorio', 'Extensao', 'Versao', 'TipoArquivo', 'acoes']; + arquivos: MatTableDataSource = new MatTableDataSource(); + arquivoForm: FormGroup; + tiposArquivos = Object.values(TiposArquivos).filter(value => typeof value === 'string'); + arquivoSelecionado: File | null = null; + + @ViewChild('dialogoArquivo', null) dialogoArquivo; + + constructor( + private agrobaseService: AgrobaseService, + private dialog: MatDialog, + private fb: FormBuilder, + ) { + this.arquivoForm = this.fb.group({ + id: [''], + Arquivo: [''], + Diretorio: [''], + Extensao: [''], + Versao: [''], + TipoArquivo: [''], + ArquivoDownload: [''], + }); + } + + ngOnInit() { + this.carregarArquivos(); + } + + carregarArquivos() { + this.agrobaseService.getArquivosVersao().subscribe( + (data) => { + this.arquivos.data = data; + }, + (error) => { + console.error('Erro ao carregar dados de versão:', error); + } + ); + } + + abrirDialogoArquivo(arquivo?: AgrobaseVersionFileModel) { + const dialogRef = this.dialog.open(this.dialogoArquivo, { + data: arquivo ? { ...arquivo } : { novo: true } + }); + + if (arquivo) { + this.arquivoForm.patchValue(arquivo); + } else { + this.arquivoForm.reset(); + } + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.salvarArquivo(result); + } + }); + } + + onFileSelected(event: any) { + this.arquivoSelecionado = event.target.files[0] || null; + } + + // Este método irá enviar o arquivo .vsf atualizado para o servidor + atualizarArquivoVsf() { + const jsonData = JSON.stringify(this.arquivos.data); + + this.agrobaseService.atualizarVsfFile(jsonData).subscribe( + () => console.log("Arquivo .vsf atualizado com sucesso no servidor."), + (error) => console.error("Erro ao atualizar o arquivo .vsf:", error) + ); + } + + // Modifique o método salvarArquivo para incluir a atualização do .vsf após o upload do arquivo + salvarArquivo(dadosArquivo: AgrobaseVersionFileModel) { + if (this.arquivoSelecionado) { + this.agrobaseService.uploadFile(this.arquivoSelecionado, dadosArquivo.ArquivoDownload).subscribe(response => { + this.salvarNaTabela(dadosArquivo); + this.atualizarArquivoVsf(); // Chama a atualização do .vsf + }); + } else { + this.salvarNaTabela(dadosArquivo); + this.atualizarArquivoVsf(); // Atualiza o .vsf mesmo sem upload de arquivo + } + } + + salvarNaTabela(dadosArquivo: AgrobaseVersionFileModel) { + + console.log(dadosArquivo.TipoArquivo); + dadosArquivo.TipoArquivo = TiposArquivos[dadosArquivo.TipoArquivo as unknown as keyof typeof TiposArquivos]; + console.log(dadosArquivo.TipoArquivo); + + let index = this.arquivos.data.findIndex(a => + a.id === dadosArquivo.id || + (a.Arquivo === dadosArquivo.Arquivo && a.Diretorio === dadosArquivo.Diretorio) + ); + + if (index >= 0) { + // Substitui o item existente com os dados atualizados + this.arquivos.data[index] = dadosArquivo; + } else { + // Adiciona um novo item caso não exista na lista + dadosArquivo.id = this.gerarIdUnico(); // Gera um ID único + this.arquivos.data = [...this.arquivos.data, dadosArquivo]; + } + + this.arquivos._updateChangeSubscription(); // Atualiza a tabela + } + + // Função auxiliar para gerar IDs únicos + gerarIdUnico(): number { + return this.arquivos.data.length > 0 ? Math.max(...this.arquivos.data.map(a => a.id || 0)) + 1 : 1; + } + + excluirArquivo(arquivo: AgrobaseVersionFileModel) { + if (confirm("Tem certeza que deseja excluir o arquivo " + arquivo.Arquivo + "?")) { + this.agrobaseService.deleteVersionFile(arquivo.ArquivoDownload).subscribe( + (data) => { + this.arquivos.data = this.arquivos.data.filter(a => a !== arquivo); + this.arquivos._updateChangeSubscription(); // Atualiza a tabela + this.atualizarArquivoVsf(); + }, + (error) => { + console.error('Erro ao carregar dados de versão:', error); + } + ); + } + } + + onSubmit() { + if (this.arquivoForm.valid) { + const dadosArquivo: AgrobaseVersionFileModel = this.arquivoForm.value; + this.salvarArquivo(dadosArquivo); + this.dialog.closeAll(); + } + } + + onCancel() { + this.dialog.closeAll(); + } + +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 0000000..66be5cb --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,174 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { HomeComponent } from './home/home.component'; +import { LoginComponent } from './login/login.component'; +import { UsuariosService } from './services/usuarios.service'; +import { DashboardComponent } from './dashboard/dashboard.component'; +import { UsersComponent } from './users/users.component'; +import { ClientComponent } from './client/client.component'; +import { FuncoesGlobais } from 'src/environments/environment'; +import { SistemasComponent } from './sistemas/sistemas.component'; +import { SistemasService } from './services/sistemas.service'; +import { CriarcontaComponent } from './criarconta/criarconta.component'; +import { DetalhesSistemaComponent } from './detalhes-sistema/detalhes-sistema.component'; +import { BaseSiteComponent } from './base-site/base-site.component'; +import { ChavesComponent } from './chaves/chaves.component'; +import { EditHomeComponent } from './edit-home/edit-home.component'; +import { SliderComponent } from './slider/slider.component'; +import { NoticiasComponent } from './noticias/noticias.component'; +import { SliderService } from './services/slider.service'; +import { NoticiasService } from './services/noticias.service'; +import { GeralService } from './services/geral.service'; +import { CadDetSistemaComponent } from './cad-det-sistema/cad-det-sistema.component'; +import { EasyAVAComponent } from './easy-ava/easy-ava.component'; +import { EasyAVAService } from './services/easy-ava.service'; +import { BingoSortComponent } from './bingo-sort/bingo-sort.component'; +import { BingoComponent } from './bingo/bingo.component'; +import { BingoDashboardComponent } from './bingo-dashboard/bingo-dashboard.component'; +import { BingoService } from './services/bingoService'; +import { OrionDashboardComponent } from './orion-dashboard/orion-dashboard.component'; +import { OrionService } from './services/orionService'; +import { ProdutosComponent } from './produtos/produtos.component'; +import { ProdutosService } from './services/produtosService'; +import { AgrobaseLoginComponent } from './agrobase/login/login.component'; +import { AgrobaseVersionamentoComponent } from './agrobase/versionamento/versionamento.component'; +import { AgrobaseService } from './services/agrobase.service'; + + +const routes: Routes = [ + { path: '', redirectTo: 'home', pathMatch: 'full' }, + { + path: '', + component: BaseSiteComponent, + children: [ + { + path: 'home', + component: HomeComponent, + }, { + path: 'detalhes/:idsistemas', + component: DetalhesSistemaComponent, + }, + ] + }, { + path: 'login', + component: LoginComponent, + }, { + path: 'login/esqueci', + component: LoginComponent, + }, { + path: 'login/trocar/:tag', + component: LoginComponent, + }, { + path: 'criarconta', + component: CriarcontaComponent, + }, { + path: 'dashboard', + component: DashboardComponent, + children: [ + { + path: 'usuarios/cadastro', + component: UsersComponent, + }, { + path: 'usuarios/editar/:idusuarios', + component: UsersComponent, + }, { + path: 'usuarios/visualizar', + component: UsersComponent, + }, { + path: 'sistemas/cadastro', + component: SistemasComponent, + }, { + path: 'sistemas/editar/:idsistemas', + component: SistemasComponent, + }, { + path: 'sistemas/visualizar', + component: SistemasComponent, + }, { + path: 'sistemas/detalhes/:idsistemas', + component: CadDetSistemaComponent, + }, { + path: 'sistemas/produtos/:idsistemas', + component: ProdutosComponent, + }, { + path: 'cliente', + component: ClientComponent, + }, { + path: 'cliente/chave/:idsistemas', + component: ChavesComponent, + }, { + path: 'admin/home', + component: EditHomeComponent, + }, { + path: 'admin/slides', + component: SliderComponent, + }, { + path: 'admin/slides/visualizar', + component: SliderComponent, + }, { + path: 'admin/slides/editar/:idslides', + component: SliderComponent, + }, { + path: 'admin/noticias', + component: NoticiasComponent, + }, { + path: 'admin/noticias/visualizar', + component: NoticiasComponent, + }, { + path: 'admin/noticias/editar/:idnoticias', + component: NoticiasComponent, + } + ] + }, { + path: 'easyava', + component: EasyAVAComponent, + }, { + path: 'bingo', + //component: BingoComponent, + children: [ + { + path: 'dashboard', + component: BingoDashboardComponent, + }, { + path: 'sorteio', + component: BingoSortComponent, + }, + ] + }, { + path: 'orion-dashboard', + component: OrionDashboardComponent + }, { + path: 'agrobase', + children: [ + { + path: 'login', + component: AgrobaseLoginComponent, + }, { + path: 'versionamento', + component: AgrobaseVersionamentoComponent, + }, + ] + } +]; + +@NgModule({ + imports: [ + RouterModule.forRoot(routes), + ], + exports: [ + RouterModule, + ], + providers: [ + FuncoesGlobais, + UsuariosService, + SistemasService, + SliderService, + NoticiasService, + GeralService, + EasyAVAService, + BingoService, + OrionService, + ProdutosService, + AgrobaseService + ] +}) +export class AppRoutingModule { } diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..90c6b64 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..a6de2da --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,186 @@ +.form-cabecalho { + border: 1px solid gray; + margin-right: 1em; + border-radius: 0.3em 0.3em 0 0; + background: gray; + padding-top: 0.4em; + padding-left: 2em; + height: 3em; + border-bottom: #d8d8d8; +} + +.form-corpo { + border: 1px solid gray; + margin-right: 1em; + background: lightgrey; + padding: 1em; + color: #000; +} + +.checkHabilitado { + width: 8em; + position: absolute; + right: 0; + margin-top: -2em; +} + +table { + font-family: arial, sans-serif; + border-collapse: collapse; + width: 100%; +} + +td, th { + border: 1px solid #dddddd; + text-align: left; + padding: 8px; +} + +tr:nth-child(even) { + background-color: #dddddd; +} + +.quadro-Branco { + color: #000; + margin: 1em; + padding: 1em; + background: #fff; + border-radius: 1em; +} + +.MyHR { + background: #eee; + height: 1px; + margin: auto; + margin-top: 1em; + margin-bottom: 1em; +} + +.FundoCheio { + position: absolute; + height: 100vh; + width: 100vw; + top: 0; + left: 0; + background: #fff; + color: #000; + padding: 1em; +} + + + +@mixin sp-layout { + @media screen and (max-width: 750px) { + @content; + } +} + +body { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background: radial-gradient(ellipse at bottom, #0d1d31 0%, #0c0d13 100%); + overflow: hidden; +} + +@function random_range($min, $max) { + $rand: random(); + $random_range: $min + floor($rand * (($max - $min) + 1)); + @return $random_range; +} + +.stars { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 120%; + transform: rotate(-45deg); + z-index: -10; +} + +.star { + $star-count: 20; + --star-color: var(--primary-color); + --star-tail-length: 6em; + --star-tail-height: 2px; + --star-width: calc(var(--star-tail-length) / 6); + --fall-duration: 9s; + --tail-fade-duration: var(--fall-duration); + + position: absolute; + top: var(--top-offset); + left: 0; + width: var(--star-tail-length); + height: var(--star-tail-height); + color: var(--star-color); + background: linear-gradient(45deg, currentColor, transparent); + border-radius: 50%; + filter: drop-shadow(0 0 6px currentColor); + transform: translate3d(104em, 0, 0); + animation: fall var(--fall-duration) var(--fall-delay) linear infinite, tail-fade var(--tail-fade-duration) var(--fall-delay) ease-out infinite; + + @include sp-layout { + // For mobile performance, tail-fade animation will be removed QAQ + animation: fall var(--fall-duration) var(--fall-delay) linear infinite; + } + + @for $i from 1 through $star-count { + &:nth-child(#{$i}) { + --star-tail-length: #{random_range(500em, 750em) / 100}; + --top-offset: #{random_range(0vh, 10000vh) / 100}; + --fall-duration: #{random_range(6000, 12000s) / 1000}; + --fall-delay: #{random_range(0, 10000s) / 1000}; + } + } + + &::before, &::after { + position: absolute; + content: ''; + top: 0; + left: calc(var(--star-width) / -2); + width: var(--star-width); + height: 100%; + background: linear-gradient(45deg, transparent, currentColor, transparent); + border-radius: inherit; + animation: blink 2s linear infinite; + } + + &::before { + transform: rotate(45deg); + } + + &::after { + transform: rotate(-45deg); + } +} + +@keyframes fall { + to { + transform: translate3d(-30em, 0, 0); + } +} + +@keyframes tail-fade { + 0%, 50% { + width: var(--star-tail-length); + opacity: 1; + } + + 70%, 80% { + width: 0; + opacity: 0.4; + } + + 100% { + width: 0; + opacity: 0; + } +} + +@keyframes blink { + 50% { + opacity: 0.6; + } +} \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..73b2631 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,22 @@ +import { Title } from '@angular/platform-browser'; +import { Component } from '@angular/core'; +import { GeralService } from './services/geral.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) + +export class AppComponent { + + constructor( + private geralSerivice: GeralService, + private titleService: Title + ) { + this.titleService.setTitle(environment.Titulo); + } + + title = '"Zendion, Inc."'; +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..3f17130 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,109 @@ +import { BrowserModule, Title } from '@angular/platform-browser'; +import { LOCALE_ID, NgModule } from '@angular/core'; +import { registerLocaleData } from '@angular/common'; +import localePt from '@angular/common/locales/pt'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { HomeComponent } from './home/home.component'; +import { Angular2UsefulSwiperModule } from 'angular2-useful-swiper'; +import { LoginComponent } from './login/login.component'; +import { HttpClientModule } from '@angular/common/http'; +import { DashboardComponent } from './dashboard/dashboard.component'; +import { UsersComponent } from './users/users.component'; +import { ClientComponent } from './client/client.component'; +import { SistemasComponent } from './sistemas/sistemas.component'; +import { CriarcontaComponent } from './criarconta/criarconta.component'; +import { DetalhesSistemaComponent } from './detalhes-sistema/detalhes-sistema.component'; +import { BaseSiteComponent } from './base-site/base-site.component'; +import { ChavesComponent } from './chaves/chaves.component'; +import { EditHomeComponent } from './edit-home/edit-home.component'; +import { SliderComponent } from './slider/slider.component'; +import { NoticiasComponent } from './noticias/noticias.component'; +import { CadDetSistemaComponent } from './cad-det-sistema/cad-det-sistema.component'; +import { EasyAVAComponent } from './easy-ava/easy-ava.component'; +import { BingoSortComponent } from './bingo-sort/bingo-sort.component'; +import { BingoComponent } from './bingo/bingo.component'; +import { BingoDashboardComponent } from './bingo-dashboard/bingo-dashboard.component'; +import { OrionDashboardComponent } from './orion-dashboard/orion-dashboard.component'; + +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatNativeDateModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatTableModule } from '@angular/material/table'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatIconModule } from '@angular/material/icon'; +import { MatDialogModule } from '@angular/material/dialog'; +import { Ng5SliderModule } from 'ng5-slider'; +import { ProdutosComponent } from './produtos/produtos.component'; +import { AgrobaseLoginComponent } from './agrobase/login/login.component'; +import { AgrobaseVersionamentoComponent } from './agrobase/versionamento/versionamento.component'; +import { TipoArquivoNomePipe } from './pipes/tipo-arquivo-nome.pipe'; + + +// Registrar a localidade pt-BR +registerLocaleData(localePt); + +@NgModule({ + declarations: [ + AppComponent, + HomeComponent, + LoginComponent, + DashboardComponent, + UsersComponent, + ClientComponent, + SistemasComponent, + CriarcontaComponent, + DetalhesSistemaComponent, + BaseSiteComponent, + ChavesComponent, + EditHomeComponent, + SliderComponent, + NoticiasComponent, + CadDetSistemaComponent, + EasyAVAComponent, + BingoSortComponent, + BingoComponent, + BingoDashboardComponent, + OrionDashboardComponent, + ProdutosComponent, + AgrobaseLoginComponent, + AgrobaseVersionamentoComponent, + TipoArquivoNomePipe + ], + imports: [ + BrowserModule, + AppRoutingModule, + Angular2UsefulSwiperModule, + FormsModule, + ReactiveFormsModule, + HttpClientModule, + BrowserAnimationsModule, + MatDatepickerModule, + MatNativeDateModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatButtonModule, + MatSidenavModule, + MatTabsModule, + MatTableModule, + MatPaginatorModule, + MatIconModule, + MatDialogModule, + Ng5SliderModule + ], + providers: [ + Title, + { provide: LOCALE_ID, useValue: 'pt-BR' } + ], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/app/base-site/base-site.component.html b/src/app/base-site/base-site.component.html new file mode 100644 index 0000000..8b54c47 --- /dev/null +++ b/src/app/base-site/base-site.component.html @@ -0,0 +1,78 @@ +
+ + + +
+ +
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/src/app/base-site/base-site.component.scss b/src/app/base-site/base-site.component.scss new file mode 100644 index 0000000..31a441f --- /dev/null +++ b/src/app/base-site/base-site.component.scss @@ -0,0 +1,242 @@ +.site-layout { + min-height: 100vh; + display: flex; + flex-direction: column; + background: #f4f6fb; +} + +.site-header { + position: sticky; + top: 0; + z-index: 1000; + background: rgba(7, 27, 99, 0.92); + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: 0 12px 34px rgba(15, 23, 42, 0.18); + backdrop-filter: blur(14px); +} + +.header-content { + width: 100%; + max-width: 1220px; + min-height: 76px; + margin: 0 auto; + padding: 0 22px; + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + gap: 26px; + box-sizing: border-box; +} + +.brand-link { + display: inline-flex; + align-items: center; + text-decoration: none; +} + +.logo { + display: block; + object-fit: contain; +} + +.logo-escrito { + height: 46px; +} + +.logo-favicon { + display: none; + height: 42px; +} + +.header-nav { + display: flex; + align-items: center; + justify-content: center; + gap: 24px; +} + +.header-nav a { + position: relative; + color: #dbeafe; + font-size: 14px; + font-weight: 700; + text-decoration: none; + transition: color 0.18s ease; +} + +.header-nav a::after { + content: ""; + position: absolute; + left: 0; + bottom: -7px; + width: 0; + height: 2px; + border-radius: 999px; + background: #ffffff; + transition: width 0.18s ease; +} + +.header-nav a:hover { + color: #ffffff; +} + +.header-nav a:hover::after { + width: 100%; +} + +.header-actions { + display: flex; + align-items: center; + gap: 10px; +} + +.btn-header { + min-height: 42px; + padding: 0 18px; + border-radius: 12px; + font-size: 13px; + font-weight: 800; + border: 1px solid transparent; + cursor: pointer; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease, color 0.18s ease; + white-space: nowrap; +} + +.btn-header:hover { + transform: translateY(-1px); +} + +.btn-header-primary { + background: #ffffff; + color: #071b63; + box-shadow: 0 10px 24px rgba(0, 0, 0, 0.16); +} + +.btn-header-primary:hover { + background: #f8fafc; +} + +.btn-header-secondary { + background: rgba(255, 255, 255, 0.10); + color: #ffffff; + border-color: rgba(255, 255, 255, 0.22); +} + +.btn-header-secondary:hover { + background: rgba(255, 255, 255, 0.16); +} + +.site-main { + flex: 1; +} + +.site-footer { + margin-top: auto; + background: + radial-gradient(circle at top left, rgba(255, 255, 255, 0.10), transparent 30%), + linear-gradient(145deg, #071b63, #04113f); + color: #ffffff; +} + +.footer-content { + width: 100%; + max-width: 1220px; + margin: 0 auto; + padding: 48px 22px 36px 22px; + display: grid; + grid-template-columns: 1.4fr 0.8fr 0.9fr 1fr; + gap: 34px; + box-sizing: border-box; +} + +.footer-section h4 { + margin: 0 0 16px 0; + color: #ffffff; + font-size: 15px; + font-weight: 850; +} + +.footer-section p, +.footer-section a { + display: block; + margin: 0 0 10px 0; + color: #cbd5e1; + font-size: 14px; + line-height: 23px; + text-decoration: none; +} + +.footer-section a:hover { + color: #ffffff; + text-decoration: underline; +} + +.footer-logo { + height: 42px; + max-width: 220px; + object-fit: contain; + display: block; + margin-bottom: 18px; + filter: brightness(0) invert(1); +} + +.footer-bottom { + border-top: 1px solid rgba(255, 255, 255, 0.12); + padding: 18px 22px; + text-align: center; +} + +.footer-bottom p { + margin: 0; + color: #94a3b8; + font-size: 12px; + line-height: 18px; +} + +@media (max-width: 920px) { + .header-content { + grid-template-columns: auto auto; + justify-content: space-between; + } + + .header-nav { + display: none; + } + + .footer-content { + grid-template-columns: 1fr 1fr; + } +} + +@media (max-width: 576px) { + .header-content { + min-height: 68px; + padding: 0 14px; + gap: 12px; + } + + .logo-escrito { + display: none; + } + + .logo-favicon { + display: block; + height: 40px; + } + + .header-actions { + gap: 8px; + } + + .btn-header { + min-height: 38px; + padding: 0 12px; + font-size: 12px; + border-radius: 10px; + } + + .footer-content { + grid-template-columns: 1fr; + padding: 38px 20px 28px 20px; + } +} \ No newline at end of file diff --git a/src/app/base-site/base-site.component.ts b/src/app/base-site/base-site.component.ts new file mode 100644 index 0000000..c0e71a8 --- /dev/null +++ b/src/app/base-site/base-site.component.ts @@ -0,0 +1,78 @@ +import { Component, OnInit } from '@angular/core'; +import { Router, NavigationEnd } from '@angular/router'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-base-site', + templateUrl: './base-site.component.html', + styleUrls: ['./base-site.component.scss'] +}) +export class BaseSiteComponent implements OnInit { + + btnLoginText: string = "Entrar"; + btnSuperior: string = "Registrar"; + + emailContato: string = environment.emailContato; + foneContato: string = environment.telefoneContato; + currentYear: string = new Date().getFullYear().toString(); + + constructor( + private router: Router, + ) { } + + ngOnInit() { + this.CheckIsLogged(); + + this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.CheckIsLogged(); + } + }); + } + + CheckIsLogged() { + if (localStorage.getItem("Session") == "1") { + this.btnLoginText = "Sair"; + + if (localStorage.getItem("Role") != "1") { + this.btnSuperior = "Meus sistemas"; + } else { + this.btnSuperior = "Painel administrativo"; + } + } else { + this.btnLoginText = "Entrar"; + this.btnSuperior = "Registrar"; + } + } + + btnLoginClick() { + if (this.btnLoginText == "Entrar") { + this.router.navigate(['login']); + } else { + this.Logout(); + } + } + + Logout() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserName"); + localStorage.removeItem("Role"); + + this.CheckIsLogged(); + this.router.navigate(['home']); + } + + btnCriarcontaClick() { + if (this.btnSuperior == "Registrar") { + this.router.navigate(['criarconta']); + return; + } + + if (this.btnSuperior == "Painel administrativo") { + this.router.navigate(['dashboard/admin/home']); + return; + } + + this.router.navigate(['dashboard/cliente']); + } +} \ No newline at end of file diff --git a/src/app/bingo-dashboard/bingo-dashboard.component.html b/src/app/bingo-dashboard/bingo-dashboard.component.html new file mode 100644 index 0000000..bfa9955 --- /dev/null +++ b/src/app/bingo-dashboard/bingo-dashboard.component.html @@ -0,0 +1,112 @@ +
+
+
+

Sorteios

+
+ arrow_back +
+
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Cartelas

+
+
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+ + + +
+ + +
+
+ +
+ +
+

Lista

+
+ + + + + + + + + + + + + + + + + +
DescicãoRodadaDataNumerosCartelasAção
{{Sorteio.descricao}}{{Sorteio.rodada}}{{Sorteio.data_sorteio}}{{Sorteio.n_max}}{{Sorteio.participantes_max}} + + + +
+
+
+
\ No newline at end of file diff --git a/src/app/bingo-dashboard/bingo-dashboard.component.scss b/src/app/bingo-dashboard/bingo-dashboard.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/bingo-dashboard/bingo-dashboard.component.ts b/src/app/bingo-dashboard/bingo-dashboard.component.ts new file mode 100644 index 0000000..9549489 --- /dev/null +++ b/src/app/bingo-dashboard/bingo-dashboard.component.ts @@ -0,0 +1,176 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { BingoCartelasModel, BingoSorteiosModel } from '../models/bingoModel'; +import { BingoService } from '../services/bingoService'; + +@Component({ + selector: 'app-bingo-dashboard', + templateUrl: './bingo-dashboard.component.html', + styleUrls: ['./bingo-dashboard.component.scss', './../app.component.scss'] +}) +export class BingoDashboardComponent implements OnInit { + + FormSorteio: BingoSorteiosModel = new BingoSorteiosModel(); + ListaSorteios: BingoSorteiosModel[] = new Array(); + CartelaNumeros: number = 25; + AbreCartelas: boolean = false; + Novo: boolean = false; + Editando: boolean = false; + + constructor( + private bingoService: BingoService, + private router: Router + ) { } + + ngOnInit() { + this.AtualizarDados(); + } + + AtualizarDados() { + localStorage.setItem("Cartelas", ""); + localStorage.setItem("NMax", "0"); + localStorage.setItem("NParticipantes", "0"); + this.CancelarBingo(); + this.bingoService.getAllSorteios().then(resSorteios => { + this.ListaSorteios = resSorteios; + this.GetCartelasSorteio(0); + }); + } + + GetCartelasSorteio(Index) { + if (Index < this.ListaSorteios.length) { + this.bingoService.getCartelasSorteio(this.ListaSorteios[Index].idbingosorteios).then(resCartelas => { + this.ListaSorteios[Index].Cartelas = resCartelas; + Index++; + this.GetCartelasSorteio(Index); + }); + } + else { + //console.log(this.ListaSorteios); + } + } + + NovoBingo() { + this.FormSorteio = new BingoSorteiosModel(); + this.Novo = true; + } + + SalvarBingo() { + if (this.FormSorteio.idbingosorteios > 0) { + this.SalvarSorteio(); + } + else { + if (localStorage.getItem("Cartelas") == "") { + alert("Gere as cartelas para poder salvar"); + return; + } + if (localStorage.getItem("NMax") == "0" || localStorage.getItem("NParticipantes") == "0") { + alert("Preencha corretamente os numeros de participantes e cartelas"); + return; + } + this.FormSorteio.n_max = parseInt(localStorage.getItem("NMax")); + this.FormSorteio.participantes_max = parseInt(localStorage.getItem("NParticipantes")); + let CartelasGeradas: CasaCartela[] = JSON.parse(localStorage.getItem("Cartelas")); + + this.FormSorteio.Cartelas = new Array(); + for (let i = 0; i < CartelasGeradas.length; i++) { + let Cartela: BingoCartelasModel = new BingoCartelasModel(); + Cartela.canhoto = this.FormSorteio.Cartelas.length + 1; + for (let o = 0; o < this.CartelaNumeros; o++) { + if (Cartela.numeros != "") + Cartela.numeros += ","; + Cartela.numeros += CartelasGeradas[i][o].display; + } + this.FormSorteio.Cartelas.push(Cartela); + } + + console.log(this.FormSorteio); + this.SalvarSorteio(); + } + + } + + SalvarSorteio() { + this.bingoService.SalvarBingoSorteio(this.FormSorteio).then(resSalvar => { + if (resSalvar['status'] == 200) { + if (this.FormSorteio.idbingosorteios > 0) { + alert("Sorteio inserido com sucesso"); + this.AtualizarDados(); + } + else { // SALVAR AS CARTELAS SE ESTIVER EM MODO DE INSERT + this.FormSorteio.idbingosorteios = resSalvar['response']['insertId']; + this.bingoService.getAllCartelas().then(resAllCartelas => { + for (let i = 0; i < this.FormSorteio.Cartelas.length; i++) { + this.FormSorteio.Cartelas[i].canhoto += resAllCartelas.length; + } + this.bingoService.insertBingoCartela(this.FormSorteio).then(resCartelas => { + alert("Sorteio inserido com sucesso"); + this.AtualizarDados(); + }); + }); + } + } + else { + alert("Erro ao inserir Sorteio"); + console.log(resSalvar['error']); + } + }); + } + + CancelarBingo() { + this.FormSorteio = new BingoSorteiosModel(); + this.Novo = false; + this.Editando = false; + } + + ExportarCartelas(Sorteio: BingoSorteiosModel) { + this.bingoService.exportarExcel(Sorteio).then(resExport => { + window.open('http://zendioninc.mooo.com/Jogos/Bingo/Gerador/Cartelas/' + Sorteio.idbingosorteios + '.csv', '_blank'); + }); + } + + EditarSorteio(Sorteio: BingoSorteiosModel) { + this.FormSorteio = new BingoSorteiosModel(); + this.FormSorteio.data_sorteio = Sorteio.data_sorteio.split("/")[2] + "-" + Sorteio.data_sorteio.split("/")[1] + "-" + Sorteio.data_sorteio.split("/")[0]; + this.FormSorteio.descricao = Sorteio.descricao; + this.FormSorteio.idbingosorteios = Sorteio.idbingosorteios; + this.FormSorteio.n_max = Sorteio.n_max; + this.FormSorteio.participantes_max = Sorteio.participantes_max; + this.FormSorteio.rodada = Sorteio.rodada; + this.FormSorteio.Cartelas = Sorteio.Cartelas; + this.FormSorteio.VerCartelas = false; + this.Editando = true; + } + + RemoverSorteio(Sorteio: BingoSorteiosModel) { + if (!confirm("Tem certeza que deseja remover esse sorteio?")) + return; + + this.bingoService.deleteBingoSorteio(Sorteio.idbingosorteios).then(resDelete => { + alert("Removido com sucesso"); + this.AtualizarDados(); + }); + } + + SalvarCartela(Cartela: BingoCartelasModel) { + if (Cartela.Editando) { + this.bingoService.updateBingoCartela(Cartela).then(resUpdate => { + Cartela.Editando = !Cartela.Editando; + }); + } + else { + Cartela.Editando = !Cartela.Editando; + } + } + + Voltar() { + this.router.navigate(['dashboard/cliente']); + } + + +} + +class CasaCartela { + display: string; + tipo: number; +} \ No newline at end of file diff --git a/src/app/bingo-sort/bingo-sort.component.html b/src/app/bingo-sort/bingo-sort.component.html new file mode 100644 index 0000000..06e8724 --- /dev/null +++ b/src/app/bingo-sort/bingo-sort.component.html @@ -0,0 +1,23 @@ +
+
+
+
+

SELECIONE O SORTEIO

+
+
+ +
+
+ +
+
+ +
+ +
+ Cartelas faltando 1 numero para bater: {{CartelasParaBater.length}} +
+
\ No newline at end of file diff --git a/src/app/bingo-sort/bingo-sort.component.scss b/src/app/bingo-sort/bingo-sort.component.scss new file mode 100644 index 0000000..8016c73 --- /dev/null +++ b/src/app/bingo-sort/bingo-sort.component.scss @@ -0,0 +1,32 @@ +.Cabecalho { + color: forestgreen; +} + +.btnSorteio { + background: #90ee90; + border-radius: 10em; + border: 2px solid forestgreen; + width: 10em; + height: 3em; + font-size: xx-large; + color: forestgreen; + transition: 0.5s; + margin-top: 2em; +} + +.btnSorteio:hover { + background: #70c970; + color: #fff; +} + +.comboBox { + outline: none; + padding-left: 1em; + height: 3em; + width: 25em; + font-size: larger; + border: 2px solid forestgreen; + border-radius: 10em; + text-align: center; + margin-top: 2em; +} \ No newline at end of file diff --git a/src/app/bingo-sort/bingo-sort.component.ts b/src/app/bingo-sort/bingo-sort.component.ts new file mode 100644 index 0000000..eab80ab --- /dev/null +++ b/src/app/bingo-sort/bingo-sort.component.ts @@ -0,0 +1,176 @@ +import { Component, OnInit } from '@angular/core'; +import { BingoCartelasModel, BingoSorteiosModel } from '../models/bingoModel'; +import { BingoService } from '../services/bingoService'; + +@Component({ + selector: 'app-bingo-sort', + templateUrl: './bingo-sort.component.html', + styleUrls: ['./bingo-sort.component.scss', './../app.component.scss'] +}) +export class BingoSortComponent implements OnInit { + + Sorteados: string = ""; + Numeros: number[] = new Array(); + ListaSorteios: BingoSorteiosModel[] = new Array(); + LiberaSorteio: boolean = false; + SorteioSelecionado: BingoSorteiosModel = new BingoSorteiosModel(); + CartelasParaBater: BingoCartelasModel[] = new Array(); + Bingo: boolean = false; + Cinquina: number = 0; + CartelasSorteadas: BingoCartelasModel[] = new Array(); + + constructor( + private bingoService: BingoService + ) { } + + ngOnInit() { + localStorage.setItem("NumSort", ""); + this.Numeros = new Array(); + this.bingoService.getSorteiosRealizar().then(resSorteios => { + this.ListaSorteios = resSorteios; + }); + } + + SelecionarSorteio() { + for (let i = 0; i < this.ListaSorteios.length; i++) { + if (this.ListaSorteios[i].idbingosorteios == this.SorteioSelecionado.idbingosorteios) { + this.SorteioSelecionado = this.ListaSorteios[i]; + break; + } + } + this.bingoService.getCartelasVendidasSorteio(this.SorteioSelecionado.idbingosorteios).then(resCartelas => { + this.SorteioSelecionado.Cartelas = resCartelas; + this.LiberaSorteio = true; + console.log(this.SorteioSelecionado); + this.LoopNumeracao(); + }); + } + + LoopNumeracao() { + setTimeout(() => { + if (localStorage.getItem("NumSort") && localStorage.getItem("NumSort") != this.Sorteados) { + this.Sorteados = localStorage.getItem("NumSort"); + const NumVar: string[] = localStorage.getItem("NumSort").split(','); + const NumeroAtual: number = parseInt(NumVar[NumVar.length - 1]); + this.Numeros.push(NumeroAtual); + this.VerificaCartelas(NumeroAtual); + } + else { + + } + if (!this.Bingo) + this.LoopNumeracao(); + }, 1000); + } + + VerificaCartelas(NSorteado: number) { + for (let i = 0; i < this.SorteioSelecionado.Cartelas.length; i++) { + let Numeros: string[] = this.SorteioSelecionado.Cartelas[i].numeros.split(','); + for (let o = 0; o < Numeros.length; o++) { + if (Numeros[o] == NSorteado.toString()) { + this.SorteioSelecionado.Cartelas[i].Acertos++; + break; + } + } + + if (this.Cinquina < 3 && this.Numeros.length > 3) { + this.ConfereCinquina(); + } + + // CINQUINA 1 + if (this.Cinquina == 0 && !this.SorteioSelecionado.Cartelas[i].cinquina1 && this.SorteioSelecionado.Cartelas[i].Acertos == 5) { + this.SorteioSelecionado.Cartelas[i].cinquina1 = true; + this.CartelasSorteadas.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CINQUINA 2 + if (this.Cinquina == 1 && !this.SorteioSelecionado.Cartelas[i].cinquina2 && this.SorteioSelecionado.Cartelas[i].Acertos == 10) { + this.SorteioSelecionado.Cartelas[i].cinquina2 = true; + this.CartelasSorteadas.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CINQUINA 3 + if (this.Cinquina == 2 && !this.SorteioSelecionado.Cartelas[i].cinquina3 && this.SorteioSelecionado.Cartelas[i].Acertos == 15) { + this.SorteioSelecionado.Cartelas[i].cinquina3 = true; + this.CartelasSorteadas.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CARTELAS COM 1 NUMERO PARA BATER + if (this.SorteioSelecionado.Cartelas[i].Acertos == Numeros.length - 1) { + let Adicionada: boolean = false; + for (let o = 0; o < this.CartelasParaBater.length; o++) { + if (this.CartelasParaBater[o].idbingosorteios == this.SorteioSelecionado.Cartelas[i].idbingosorteios) { + Adicionada = true; + break; + } + } + if (!Adicionada) + this.CartelasParaBater.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CARTELA COM QUANTIDADE DE ACERTOS = QUANTIDADE DE NUMEROS, LOGO, BINGO! + if (this.SorteioSelecionado.Cartelas[i].Acertos == Numeros.length) { + this.SorteioSelecionado.Cartelas[i].bingo = true; + this.FinalizaSorteio(true, [this.SorteioSelecionado.Cartelas[i]]); + break; + } + } + + if (this.CartelasSorteadas.length > 0) + this.FinalizaSorteio(false, this.CartelasSorteadas); + + } + + FinalizaSorteio(Bingo: boolean, Cartelas: BingoCartelasModel[]) { + if (Bingo) { // BINGO + this.bingoService.updateBingoCartela(Cartelas[0]).then(resUpdate => { + this.SorteioSelecionado.realizado = true; + this.SorteioSelecionado.data_sorteio = this.SorteioSelecionado.data_sorteio.replace("T", " ").replace("Z", ""); + this.bingoService.SalvarBingoSorteio(this.SorteioSelecionado).then(resAtt => { + this.Bingo = true; + let Mensagem: string = `BINGO!!\r\nCartela: ${Cartelas[0].canhoto} - Ganhador: ${Cartelas[0].nome}\r\nParabens!`; + alert(Mensagem); + console.log("Cartela vencedora: " + Cartelas[0].canhoto); + console.log("Vencedor: " + Cartelas[0].nome); + }); + }); + } + else { // CINQUINAS + this.Cinquina++; + this.LoopUpdateCinquina(0); + } + } + + LoopUpdateCinquina(Index: number) { + if (Index < this.CartelasSorteadas.length) { + this.bingoService.updateBingoCartela(this.CartelasSorteadas[Index]).then(resUpdate => { + Index++; + this.LoopUpdateCinquina(Index); + }); + } + else { + let Mensagem: string = "CINQUINA " + this.Cinquina + " sorteada para as seguintes cartelas:\r\n"; + for (let i = 0; i < this.CartelasSorteadas.length; i++) { + Mensagem += `Cartela: ${this.CartelasSorteadas[i].canhoto} - Ganhador: ${this.CartelasSorteadas[i].nome}\r\n`; + } + Mensagem += "Parabens!!"; + alert(Mensagem); + this.CartelasSorteadas = new Array(); + } + } + + ConfereCinquina() { + for (let i = 0; i < this.SorteioSelecionado.Cartelas.length; i++) { + let CartelaNumeros: string[] = this.SorteioSelecionado.Cartelas[i].numeros.split(","); + if (CartelaNumeros.length > 3) { + let NIguais: number = 0; + for (let o = 0; o < this.Numeros.length; o++) { + if (this.SorteioSelecionado.Cartelas[i].numeros.includes(this.Numeros[o].toString())) { + + } + } + } + } + } + +} diff --git a/src/app/bingo/bingo.component.html b/src/app/bingo/bingo.component.html new file mode 100644 index 0000000..abe778c --- /dev/null +++ b/src/app/bingo/bingo.component.html @@ -0,0 +1 @@ +

bingo works!

diff --git a/src/app/bingo/bingo.component.scss b/src/app/bingo/bingo.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/bingo/bingo.component.ts b/src/app/bingo/bingo.component.ts new file mode 100644 index 0000000..e704e80 --- /dev/null +++ b/src/app/bingo/bingo.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-bingo', + templateUrl: './bingo.component.html', + styleUrls: ['./bingo.component.scss'] +}) +export class BingoComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/cad-det-sistema/cad-det-sistema.component.html b/src/app/cad-det-sistema/cad-det-sistema.component.html new file mode 100644 index 0000000..b864610 --- /dev/null +++ b/src/app/cad-det-sistema/cad-det-sistema.component.html @@ -0,0 +1,239 @@ +
+ + +
+ Carregando +

Carregando editor de detalhes...

+
+ + + + +
+
+ +
+ +
+ +
+ Editor de detalhes + +

{{ Sistema.nome }}

+ +

{{ Sistema.descricao }}

+ +
+ Versão {{ Sistema.versaoatual }} + {{ Sistema.tiposdesistema }} + {{ ListaDetalhes?.length || 0 }} detalhe(s) +
+
+ +
+
+ + +
+
+
+ article +
+ +
+ Total de detalhes + {{ ListaDetalhes?.length || 0 }} +
+
+ +
+
+ visibility +
+ +
+ Habilitados + {{ TotalDetalhesHabilitados }} +
+
+ +
+
+ visibility_off +
+ +
+ Desabilitados + {{ TotalDetalhesDesabilitados }} +
+
+
+ + +
+ +
+
+ Conteúdo da página pública +

Detalhes do sistema

+

+ Edite os blocos que aparecem na página pública do sistema. Cada detalhe pode ter texto, imagem e status de publicação. +

+
+ + +
+ + +
+
+ post_add +
+ +

Nenhum detalhe inserido

+ +

+ Clique em “Novo detalhe” para criar o primeiro bloco de apresentação deste sistema. +

+ + +
+ + +
+ +
+ +
+
+ #{{ i + 1 }} +
+ +
+ + {{ Detalhe.habilitado ? 'Habilitado' : 'Desabilitado' }} + +
+
+ +
+ +
+ + + + +
+ + + + {{ Detalhe.Arquivo.name }} + +
+ +
+ + + +
+
+ +
+ Prévia da imagem + +
+ Imagem do detalhe + +
+ image_not_supported + Nenhuma imagem selecionada +
+
+
+ +
+
+ +
+ +
+ + +
+ +
+ Disponível para + + Plataforma + + {{ Sistema.plataforma }} +
+ +
+ Notas de atualização + + + Atualizado em {{ Sistema.update_date | date:'dd/MM/yyyy' }} + + +
+
+ +
+ + +
+
+ Pronto para salvar? + As alterações serão aplicadas na página pública do sistema. +
+ + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/cad-det-sistema/cad-det-sistema.component.scss b/src/app/cad-det-sistema/cad-det-sistema.component.scss new file mode 100644 index 0000000..b6dface --- /dev/null +++ b/src/app/cad-det-sistema/cad-det-sistema.component.scss @@ -0,0 +1,706 @@ +.details-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* LOADING */ + +.details-loader { + min-height: 360px; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} + +.details-loader img { + width: 72px; + height: 72px; + object-fit: contain; + margin-bottom: 16px; +} + +.details-loader p { + margin: 0; + color: #64748b; + font-size: 15px; + font-weight: 800; +} + +/* HERO */ + +.system-hero { + position: relative; + overflow: hidden; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.system-hero::before { + content: ""; + position: absolute; + width: 320px; + height: 320px; + right: -120px; + top: -120px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.11); +} + +.system-hero-content { + position: relative; + z-index: 1; + display: flex; + align-items: center; + gap: 24px; +} + +.system-logo-box { + width: 96px; + height: 96px; + flex: 0 0 auto; + border-radius: 24px; + background: #ffffff; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 18px 42px rgba(0, 0, 0, 0.18); +} + +.system-logo { + width: 62px; + height: 62px; + object-fit: contain; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.system-hero .eyebrow { + color: #bfdbfe; +} + +.system-title h1 { + margin: 0 0 12px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.system-title p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +.system-tags { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 18px; +} + +.system-tags span { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); + color: #ffffff; + font-size: 12px; + font-weight: 800; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* CARDS */ + +.admin-card { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.details-panel { + margin-bottom: 22px; +} + +.panel-header { + display: flex; + justify-content: space-between; + gap: 22px; + align-items: flex-start; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0 0 8px 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.panel-header p { + max-width: 760px; + margin: 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* BUTTONS */ + +.btn-main, +.btn-card, +.btn-save { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-card:hover, +.btn-save:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons, +.btn-save .material-icons { + font-size: 19px; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* DETAIL EDITOR */ + +.details-list { + display: grid; + gap: 20px; +} + +.detail-editor-card { + position: relative; + overflow: hidden; + padding: 20px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.detail-editor-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + background: #94a3b8; +} + +.detail-editor-card.enabled { + border-color: rgba(22, 163, 74, 0.26); + background: linear-gradient(90deg, rgba(220, 252, 231, 0.60), #f8fafc 32%); +} + +.detail-editor-card.enabled::before { + background: #16a34a; +} + +.detail-editor-card.disabled { + border-color: rgba(220, 38, 38, 0.22); + background: linear-gradient(90deg, rgba(254, 226, 226, 0.55), #f8fafc 32%); +} + +.detail-editor-card.disabled::before { + background: #dc2626; +} + +.detail-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 16px; +} + +.detail-index span { + display: inline-flex; + align-items: center; + min-height: 30px; + padding: 0 12px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 13px; + font-weight: 900; +} + +.detail-status span { + display: inline-flex; + align-items: center; + min-height: 30px; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-enabled { + background: #dcfce7; + color: #166534; +} + +.status-disabled { + background: #fee2e2; + color: #991b1b; +} + +.detail-card-body { + display: grid; + grid-template-columns: 1fr 440px; + gap: 20px; + align-items: stretch; +} + +.detail-editor label, +.detail-preview span { + display: block; + margin-bottom: 8px; + color: #1e293b; + font-size: 14px; + font-weight: 900; +} + +.form-control { + width: 100%; + border-radius: 14px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 14px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.textarea-control { + min-height: 230px; + padding: 14px; + resize: vertical; + line-height: 22px; +} + +.file-row { + display: flex; + align-items: center; + gap: 12px; + margin-top: 14px; + flex-wrap: wrap; +} + +.file-label { + min-height: 40px; + display: inline-flex !important; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63 !important; + font-size: 13px !important; + font-weight: 900 !important; + cursor: pointer; + border: 1px solid #dbe6ff; + margin: 0 !important; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.file-row small { + color: #64748b; + font-size: 12px; + font-weight: 800; +} + +.detail-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 16px; +} + +.btn-card { + min-height: 40px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.remove { + background: #dc2626; +} + +.btn-card.enable { + background: #15803d; +} + +.btn-card.disable { + background: #b45309; +} + +.detail-preview { + min-width: 0; +} + +.preview-box { + height: 330px; + overflow: hidden; + border-radius: 18px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.preview-box img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.preview-empty { + display: flex; + flex-direction: column; + align-items: center; + color: #94a3b8; +} + +.preview-empty .material-icons { + font-size: 42px; + margin-bottom: 8px; +} + +/* SECONDARY */ + +.secondary-grid { + display: grid; + grid-template-columns: 0.75fr 1.25fr; + gap: 22px; + margin-bottom: 22px; +} + +.platform-card { + text-align: center; +} + +.platform-icon { + display: block; + width: 56px; + height: 56px; + object-fit: contain; + margin: 10px auto 14px auto; +} + +.platform-card strong { + color: #0f172a; + font-size: 18px; + font-weight: 900; +} + +.update-card small { + display: block; + margin-bottom: 14px; + color: #64748b; + font-size: 13px; + font-weight: 800; +} + +.update-text { + padding: 16px; + border-radius: 16px; + background: #f8fafc; + border: 1px solid #e5e7eb; + color: #475569; + font-size: 14px; + line-height: 23px; +} + +/* SAVE BAR */ + +.save-bar { + position: sticky; + bottom: 18px; + z-index: 20; + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + padding: 18px 20px; + border-radius: 20px; + background: rgba(7, 27, 99, 0.96); + color: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.24); + backdrop-filter: blur(12px); +} + +.save-bar strong { + display: block; + font-size: 15px; + font-weight: 900; +} + +.save-bar span { + display: block; + margin-top: 3px; + color: #bfdbfe; + font-size: 13px; +} + +.btn-save { + min-height: 44px; + display: inline-flex; + align-items: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.btn-save:disabled { + opacity: 0.7; + cursor: not-allowed; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .detail-card-body { + grid-template-columns: 1fr; + } + + .secondary-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .system-hero-content { + flex-direction: column; + text-align: center; + } + + .system-tags { + justify-content: center; + } + + .summary-grid { + grid-template-columns: 1fr; + } + + .panel-header { + flex-direction: column; + align-items: stretch; + } + + .btn-main { + width: 100%; + } + + .save-bar { + position: static; + flex-direction: column; + align-items: stretch; + } + + .btn-save { + width: 100%; + justify-content: center; + } +} + +@media (max-width: 520px) { + .system-hero, + .admin-card { + padding: 22px; + } + + .system-title h1 { + font-size: 28px; + line-height: 36px; + } + + .detail-editor-card { + padding: 16px; + } + + .preview-box { + height: 230px; + } + + .detail-actions { + flex-direction: column; + } + + .btn-card { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/cad-det-sistema/cad-det-sistema.component.ts b/src/app/cad-det-sistema/cad-det-sistema.component.ts new file mode 100644 index 0000000..71ec06f --- /dev/null +++ b/src/app/cad-det-sistema/cad-det-sistema.component.ts @@ -0,0 +1,223 @@ +import { Component, OnInit } from '@angular/core'; +import { SistemasDetalhes, SistemasLista } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { Router, ActivatedRoute } from '@angular/router'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-cad-det-sistema', + templateUrl: './cad-det-sistema.component.html', + styleUrls: ['./cad-det-sistema.component.scss', './../app.component.scss'] +}) +export class CadDetSistemaComponent implements OnInit { + + ListaDetalhes: SistemasDetalhes[] = []; + Sistema: SistemasLista = new SistemasLista(); + + LinkProjeto: string = environment.LinkProjeto; + + CarregadoLista: boolean = false; + CarregadoSistema: boolean = false; + + IndexDetalhe: number = 0; + ItensNaLista: number = 0; + + Salvando: boolean = false; + + constructor( + private sistemasService: SistemasService, + private router: Router, + private route: ActivatedRoute, + ) { } + + ngOnInit() { + this.CarregadoLista = false; + this.CarregadoSistema = false; + this.IndexDetalhe = 0; + this.Salvando = false; + + const idSistema = this.route.snapshot.params['idsistemas']; + + this.sistemasService.getSistemaByIDLista(idSistema).then(resSistema => { + this.Sistema = resSistema; + this.CarregadoSistema = true; + }); + + this.sistemasService.getDetalhesByID(idSistema).then(resDetalhes => { + this.ListaDetalhes = resDetalhes || []; + this.ItensNaLista = this.ListaDetalhes.length; + + if (this.ItensNaLista > 0) { + this.PreencheLista(); + } else { + this.CarregadoLista = true; + } + }); + } + + get TotalDetalhesHabilitados(): number { + return (this.ListaDetalhes || []).filter(detalhe => detalhe.habilitado).length; + } + + get TotalDetalhesDesabilitados(): number { + return (this.ListaDetalhes || []).filter(detalhe => !detalhe.habilitado).length; + } + + PreencheLista() { + for (let i = 0; i < this.ItensNaLista; i++) { + const detalhe = this.ListaDetalhes[i]; + + detalhe.botao = detalhe.habilitado ? "Desabilitar" : "Habilitar"; + + const ordemImagem = detalhe.ordem != null && detalhe.ordem != undefined ? detalhe.ordem : i; + + detalhe.imagem = this.LinkProjeto + + "/sistemas/" + + detalhe.idsistemas + + "/detalhes/detalhe_" + + ordemImagem + + ".jpg"; + } + + this.CarregadoLista = true; + } + + NovoDetalhe() { + const novo = new SistemasDetalhes(); + + novo.habilitado = false; + novo.idsistemas = this.Sistema.idsistemas; + novo.botao = "Habilitar"; + novo.ordem = this.ListaDetalhes.length; + novo.descricao = ""; + novo.imagem = ""; + + this.ListaDetalhes.push(novo); + } + + onFileChanged(event, index: number) { + if (event.target.files && event.target.files[0]) { + this.ListaDetalhes[index].Arquivo = event.target.files[0]; + + const reader = new FileReader(); + + reader.readAsDataURL(event.target.files[0]); + + reader.onload = (event) => { + this.ListaDetalhes[index].imagem = event.target['result']; + }; + } + } + + RemoverDetalhe(index: number) { + if (!confirm("Tem certeza que deseja remover esse item?")) { + return; + } + + const detalhe = this.ListaDetalhes[index]; + + if (!detalhe.idsistemasdetalhes) { + this.ListaDetalhes.splice(index, 1); + this.ReordenarListaLocal(); + return; + } + + this.sistemasService.deleteSistemaDetalhe(detalhe.idsistemasdetalhes, this.Sistema.idsistemas, index).then(resDelete => { + if (resDelete['status'] == 200) { + this.ListaDetalhes.splice(index, 1); + this.ItensNaLista = this.ListaDetalhes.length; + this.ReordenarListaLocal(); + } else { + alert("Erro ao remover detalhe"); + console.log(resDelete); + } + }); + } + + ReordenarListaLocal() { + for (let i = 0; i < this.ListaDetalhes.length; i++) { + this.ListaDetalhes[i].ordem = i; + } + } + + HabilitarDetalhe(Detalhe: SistemasDetalhes) { + Detalhe.habilitado = !Detalhe.habilitado; + Detalhe.botao = Detalhe.habilitado ? "Desabilitar" : "Habilitar"; + } + + Salvar() { + if (this.Salvando) { + return; + } + + this.Salvando = true; + this.IndexDetalhe = 0; + this.SalvarProximo(); + } + + SalvarProximo() { + if (this.IndexDetalhe < this.ListaDetalhes.length) { + const Detalhe = new SistemasDetalhes(); + + Detalhe.idsistemasdetalhes = this.ListaDetalhes[this.IndexDetalhe].idsistemasdetalhes; + Detalhe.habilitado = this.ListaDetalhes[this.IndexDetalhe].habilitado; + Detalhe.descricao = this.ListaDetalhes[this.IndexDetalhe].descricao; + Detalhe.idsistemas = this.ListaDetalhes[this.IndexDetalhe].idsistemas; + Detalhe.ordem = this.IndexDetalhe; + + if (this.IndexDetalhe < this.ItensNaLista) { + this.sistemasService.updateDetalhe(Detalhe).then(resUpdate => { + if (this.ListaDetalhes[this.IndexDetalhe].Arquivo != null) { + this.CopiarImagem(this.IndexDetalhe); + } + + this.IndexDetalhe++; + this.SalvarProximo(); + }); + + return; + } + + this.sistemasService.insertDetalhe(Detalhe).then(resInsert => { + this.ListaDetalhes[this.IndexDetalhe].idsistemasdetalhes = resInsert['response'].insertId; + + if (this.ListaDetalhes[this.IndexDetalhe].Arquivo != null) { + this.CopiarImagem(this.IndexDetalhe); + } + + this.IndexDetalhe++; + this.SalvarProximo(); + }); + + return; + } + + this.sistemasService.atualizarListaDetalhes(this.Sistema.idsistemas).then(resAtualizacao => { + console.log("Atualizacao do indice de detalhes:", resAtualizacao); + + alert("Detalhes cadastrados com sucesso!"); + + this.IndexDetalhe = 0; + this.Salvando = false; + this.ngOnInit(); + }); + } + + CopiarImagem(index: number) { + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("nome", "detalhe_" + this.ListaDetalhes[index].ordem + ".jpg"); + formData.append("arquivo", this.ListaDetalhes[index].Arquivo); + formData.append("idsistemas", this.ListaDetalhes[index].idsistemas.toString()); + + req.open("POST", environment.ApiUrl + "/sistemas/copyDetalhe"); + req.send(formData); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + console.log("Imagem copiada com sucesso"); + } + }; + } +} \ No newline at end of file diff --git a/src/app/chaves/chaves.component.html b/src/app/chaves/chaves.component.html new file mode 100644 index 0000000..968fa06 --- /dev/null +++ b/src/app/chaves/chaves.component.html @@ -0,0 +1,195 @@ +
+ + +
+
+
+ +
+ +
+ Licenças e chaves + +

{{ Sistema.nome }}

+ +

+ Gerencie suas chaves de acesso, compre licenças e acompanhe a validade deste sistema. +

+ +
+ Versão {{ Sistema.versaoatual }} + Lançamento {{ Sistema.insert_date | date:'dd/MM/yyyy' }} +
+
+
+
+ + +
+
+
+ vpn_key +
+ +
+ Chaves geradas + {{ ListaDeChaves?.length || 0 }} +
+
+ +
+
+ shopping_cart +
+ +
+ Opções de licença + {{ Produtos?.length || 0 }} +
+
+ +
+
+ verified_user +
+ +
+ Status + Disponível +
+
+
+ + +
+
+
+ Comprar licença +

Opções disponíveis

+
+
+ +
+
+
+
+ workspace_premium +
+ + Licença +
+ +

{{ Produto.descricao }}

+ +
+ R$ + {{ Produto.valor | number:'1.2-2' }} +
+ +

+ Libere uma chave de acesso para utilização do sistema conforme o tipo de licença selecionado. +

+ + +
+
+ +
+
+ info +
+ +

Nenhuma licença disponível

+ +

+ Este sistema não possui versões disponíveis para compra de licenças no momento. +

+
+
+ + +
+
+
+ Avaliação +

Gerar chave de avaliação

+

+ Você ainda não possui chaves para este sistema. Gere uma chave de avaliação para testar o acesso. +

+
+ + +
+
+ + +
+
+
+ Acessos +

Chaves do sistema

+
+
+ +
+
+ +
+ {{ getKeyStatusLabel(Chave) }} +
+ +
+ Chave de acesso + +
+ + content_copy +
+
+ +
+
+ Criação + {{ Chave.DataCriacao | date:'dd/MM/yyyy' }} +
+ +
+ Validade + {{ Chave.DataValidade | date:'dd/MM/yyyy' }} +
+ +
+ Status + {{ Chave.Status }} +
+ +
+ Ativada + {{ Chave.Ativada }} +
+
+
+
+ +
+
+ vpn_key_off +
+ +

Nenhuma chave gerada

+ +

+ Gere uma chave de avaliação ou compre uma licença para liberar o acesso ao sistema. +

+
+
+ +
\ No newline at end of file diff --git a/src/app/chaves/chaves.component.scss b/src/app/chaves/chaves.component.scss new file mode 100644 index 0000000..87517ca --- /dev/null +++ b/src/app/chaves/chaves.component.scss @@ -0,0 +1,672 @@ +.key-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.key-hero { + position: relative; + overflow: hidden; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.key-hero::before { + content: ""; + position: absolute; + width: 320px; + height: 320px; + right: -120px; + top: -120px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.11); +} + +.key-hero-content { + position: relative; + z-index: 1; + display: flex; + align-items: center; + gap: 24px; +} + +.system-logo-box { + width: 96px; + height: 96px; + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: center; + border-radius: 24px; + background: #ffffff; + cursor: pointer; + box-shadow: 0 18px 42px rgba(0, 0, 0, 0.18); +} + +.system-logo { + width: 62px; + height: 62px; + object-fit: contain; +} + +.system-title { + min-width: 0; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.key-hero .eyebrow, +.trial-section .eyebrow { + color: #bfdbfe; +} + +.system-title h1 { + margin: 0 0 12px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.system-title p { + max-width: 680px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +.system-tags { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 18px; +} + +.system-tags span { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); + color: #ffffff; + font-size: 12px; + font-weight: 800; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* PANELS */ + +.panel-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* LICENSES */ + +.license-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.license-card { + padding: 22px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.license-card:hover { + transform: translateY(-3px); + border-color: rgba(7, 27, 99, 0.22); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.license-card-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 18px; +} + +.license-icon { + width: 46px; + height: 46px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.license-card-header span { + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.license-card h3 { + margin: 0 0 16px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; +} + +.license-price { + display: flex; + align-items: flex-start; + gap: 6px; + margin-bottom: 14px; +} + +.license-price small { + margin-top: 6px; + color: #071b63; + font-size: 14px; + font-weight: 900; +} + +.license-price strong { + color: #071b63; + font-size: 34px; + line-height: 38px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.license-card p { + min-height: 68px; + margin: 0 0 18px 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.btn-license { + width: 100%; + min-height: 44px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 13px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.btn-license:hover { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.26); +} + +/* TRIAL */ + +.trial-section { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.12), transparent 34%), + linear-gradient(145deg, #15803d, #166534); + color: #ffffff; + box-shadow: 0 18px 45px rgba(21, 128, 61, 0.16); +} + +.trial-content { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + gap: 22px; +} + +.trial-content h2 { + margin: 0 0 8px 0; + color: #ffffff; + font-size: 26px; + line-height: 34px; + font-weight: 900; +} + +.trial-content p { + max-width: 680px; + margin: 0; + color: #dcfce7; + font-size: 14px; + line-height: 23px; +} + +.btn-trial { + min-height: 46px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border: none; + border-radius: 12px; + background: #ffffff; + color: #166534; + font-size: 13px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.btn-trial:hover { + transform: translateY(-1px); +} + +.btn-trial .material-icons { + font-size: 20px; +} + +/* KEYS */ + +.keys-list { + display: grid; + gap: 16px; +} + +.key-card { + padding: 20px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.key-main { + margin-bottom: 16px; +} + +.key-label { + display: block; + margin-bottom: 8px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.key-value { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + gap: 10px; + padding: 10px 12px; + border-radius: 14px; + background: #ffffff; + border: 1px solid #dbe6ff; + cursor: pointer; + transition: border-color 0.18s ease, box-shadow 0.18s ease; +} + +.key-value:hover { + border-color: rgba(7, 27, 99, 0.28); + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.08); +} + +.key-value input { + width: 100%; + min-width: 0; + border: none; + outline: none; + background: transparent; + color: #0f172a; + font-size: 15px; + font-weight: 800; + cursor: pointer; +} + +.key-value .material-icons { + color: #071b63; + font-size: 22px; +} + +.key-meta { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; +} + +.key-card { + position: relative; + overflow: hidden; + padding: 20px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.key-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + background: #94a3b8; +} + +.key-card:hover { + transform: translateY(-2px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.key-status-ribbon { + display: flex; + justify-content: flex-end; + margin-bottom: 14px; +} + +.key-status-ribbon span { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +/* Verde: válida e ativada */ +.key-card-active { + background: linear-gradient(90deg, rgba(220, 252, 231, 0.75), #f8fafc 34%); + border-color: rgba(22, 163, 74, 0.28); +} + +.key-card-active::before { + background: #16a34a; +} + +.key-card-active .key-status-ribbon span { + background: #dcfce7; + color: #166534; +} + +/* Amarelo: válida, mas não ativada */ +.key-card-pending { + background: linear-gradient(90deg, rgba(254, 249, 195, 0.82), #f8fafc 34%); + border-color: rgba(202, 138, 4, 0.28); +} + +.key-card-pending::before { + background: #ca8a04; +} + +.key-card-pending .key-status-ribbon span { + background: #fef9c3; + color: #854d0e; +} + +/* Vermelho: expirada/vencida/inválida */ +.key-card-expired { + background: linear-gradient(90deg, rgba(254, 226, 226, 0.82), #f8fafc 34%); + border-color: rgba(220, 38, 38, 0.28); +} + +.key-card-expired::before { + background: #dc2626; +} + +.key-card-expired .key-status-ribbon span { + background: #fee2e2; + color: #991b1b; +} + +/* Neutra */ +.key-card-neutral { + background: linear-gradient(90deg, rgba(226, 232, 240, 0.72), #f8fafc 34%); + border-color: rgba(100, 116, 139, 0.22); +} + +.key-card-neutral::before { + background: #64748b; +} + +.key-card-neutral .key-status-ribbon span { + background: #e2e8f0; + color: #334155; +} + +.meta-item { + padding: 14px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #e5e7eb; +} + +.meta-item span { + display: block; + margin-bottom: 5px; + color: #64748b; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.meta-item strong { + display: block; + color: #0f172a; + font-size: 14px; + line-height: 21px; + font-weight: 900; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-state.small { + padding: 30px 20px; +} + +.empty-icon { + width: 66px; + height: 66px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 32px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 520px; + margin: 0 auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1040px) { + .license-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .key-meta { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 720px) { + .key-hero-content { + flex-direction: column; + text-align: center; + } + + .system-tags { + justify-content: center; + } + + .summary-grid, + .license-grid { + grid-template-columns: 1fr; + } + + .trial-content { + grid-template-columns: 1fr; + } + + .btn-trial { + width: 100%; + } + + .panel-card, + .trial-section, + .key-hero { + padding: 22px; + } + + .panel-header h2, + .trial-content h2 { + font-size: 22px; + line-height: 30px; + } + + .system-title h1 { + font-size: 28px; + line-height: 36px; + } +} + +@media (max-width: 480px) { + .key-meta { + grid-template-columns: 1fr; + } + + .key-value { + grid-template-columns: 1fr; + } + + .key-value .material-icons { + justify-self: end; + } + + .license-price strong { + font-size: 30px; + } +} \ No newline at end of file diff --git a/src/app/chaves/chaves.component.ts b/src/app/chaves/chaves.component.ts new file mode 100644 index 0000000..cf26eb1 --- /dev/null +++ b/src/app/chaves/chaves.component.ts @@ -0,0 +1,320 @@ +import { Component, OnInit } from '@angular/core'; +import { SistemasService } from '../services/sistemas.service'; +import { Chaves, Sistemas, ListChaves } from '../models/sistemasModel'; +import { ActivatedRoute, Router } from '@angular/router'; +import { environment } from 'src/environments/environment'; +import { UsuariosService } from '../services/usuarios.service'; +import { Usuarios } from '../models/usuariosModel'; +import { ProdutosService } from '../services/produtosService'; +import { ProdutosModel } from '../models/produtosModel'; + +@Component({ + selector: 'app-chaves', + templateUrl: './chaves.component.html', + styleUrls: ['./chaves.component.scss', './../app.component.scss'] +}) +export class ChavesComponent implements OnInit { + + FormChaves: Chaves = new Chaves(); + Sistema: Sistemas = new Sistemas(); + ListaDeChaves: ListChaves[]; + Usuario: Usuarios = new Usuarios(); + UserID: number = parseInt(localStorage.getItem("UserID")); + idsistemas: number = this.route.snapshot.params['idsistemas']; + LinkImagem: string; + Produtos: ProdutosModel[] = []; + + constructor( + private sistemasService: SistemasService, + private route: ActivatedRoute, + private usuariosService: UsuariosService, + private router: Router, + private produtosService: ProdutosService + ) { } + + ngOnInit() { + this.sistemasService.getSistemaByID(this.idsistemas).then(resSistema => { + this.Sistema = resSistema; + this.LinkImagem = environment.LinkProjeto + "/sistemas/" + this.idsistemas + "/icone.png"; + }); + this.usuariosService.getUsuarioByID(this.UserID).then(resUsuario => { + this.Usuario = resUsuario; + }); + this.produtosService.getProdutosSell(this.idsistemas).then(resProdutos => { + this.Produtos = resProdutos; + }); + this.AtualizaChaves(); + } + + AtualizaChaves() { + this.sistemasService.getChavesSistemaLista(this.idsistemas, this.UserID).then(resChave => { + this.ListaDeChaves = resChave; + }) + } + + btnGerarClick() { + let Mensagem: string; + if (this.ListaDeChaves.length == 0) { + Mensagem = "A primeira chave do sistema é gerada gratuitamente com validade de 30 dias a partir de sua data de geração! Deseja gerar sua chave de avaliação agora?"; + } + else { + //this.Pagamento = true; + //this.GerarChave(30); + if (confirm("Deseja solicitar uma nova chave de sistema?")) { + this.produtosService.buySistema(this.idsistemas, this.UserID, 1).then(res => { + //console.log(res); + alert("Você será redirecionado para a tela de pagamentos do Mercado Pago.\rQuando o pagamento for confirmado, a licença será gerada automaticamente e já aparecerá na sua lista de chaves!"); + const paymentUrl = res['url']; + window.open(paymentUrl, '_blank'); + }); + } + return; + } + if (confirm(Mensagem)) { + this.GerarChave(30); + } + else { + return; + } + //this.GerarChave(30); + } + + DataValidade(Dias: number) { + let DataAtual = new Date(); + DataAtual.setDate(DataAtual.getDate() + Dias); + let DataFix = + DataAtual.toLocaleDateString()[0] + + DataAtual.toLocaleDateString()[1] + + DataAtual.toLocaleDateString()[3] + + DataAtual.toLocaleDateString()[4] + + DataAtual.toLocaleDateString()[6] + + DataAtual.toLocaleDateString()[7] + + DataAtual.toLocaleDateString()[8] + + DataAtual.toLocaleDateString()[9]; + return DataFix; + } + + GerarChave(Dias: number) { + let SerialKey: string; + let CPF = this.CryptText(this.Usuario.cpf); + let Validade = this.CryptText(this.DataValidade(Dias)); + SerialKey = + Validade[0].toString() + + CPF[13].toString() + + CPF[0].toString() + + Validade[1].toString() + + CPF[12].toString() + + CPF[1].toString() + + Validade[2].toString() + + CPF[11].toString() + + CPF[2].toString() + + Validade[3].toString() + + CPF[10].toString() + + CPF[3].toString() + + Validade[4].toString() + + CPF[9].toString() + + CPF[4].toString() + + Validade[5].toString() + + CPF[8].toString() + + CPF[5].toString() + + Validade[6].toString() + + CPF[7].toString() + + CPF[6].toString() + + Validade[7].toString(); + + let DatValidade = new Date(); + DatValidade.setDate(DatValidade.getDate() + Dias); + + this.FormChaves.licenca = SerialKey; + this.FormChaves.idusuarios = this.UserID; + this.FormChaves.idsistemas = this.idsistemas; + this.FormChaves.data_validade = DatValidade; + + this.sistemasService.insertChave(this.FormChaves).then(resInsert => { + if (resInsert['status'] == 200) { + alert("Chave de licença gerada com sucesso!"); + this.AtualizaChaves(); + } + else { + alert("Erro ao gerar chave! Por favor tente novamente mais tarde!"); + } + }) + } + + CryptText(Texto: string) + { + let RandNumber: number; + let NewChar: string; + let FinalString: string = ""; + let SwitchChar: string = ""; + for (let i = 0; i <= Texto.length; i++) + { + RandNumber = Math.floor(Math.random() * 2); + SwitchChar = Texto.substring(i, 1)[Texto.substring(i, 1).length - 1]; + if (SwitchChar != undefined) { + switch (SwitchChar) + { + case "0": + if (RandNumber == 0) + NewChar = "q"; + else + NewChar = "3"; + break; + case "1": + if (RandNumber == 0) + NewChar = "w"; + else + NewChar = "5"; + break; + case "2": + if (RandNumber == 0) + NewChar = "r"; + else + NewChar = "4"; + break; + case "3": + if (RandNumber == 0) + NewChar = "D"; + else + NewChar = "6"; + break; + case "4": + if (RandNumber == 0) + NewChar = "H"; + else + NewChar = "9"; + break; + case "5": + if (RandNumber == 0) + NewChar = "b"; + else + NewChar = "7"; + break; + case "6": + if (RandNumber == 0) + NewChar = "U"; + else + NewChar = "8"; + break; + case "7": + if (RandNumber == 0) + NewChar = "k"; + else + NewChar = "1"; + break; + case "8": + if (RandNumber == 0) + NewChar = "I"; + else + NewChar = "0"; + break; + case "9": + if (RandNumber == 0) + NewChar = "p"; + else + NewChar = "2"; + break; + default: + NewChar = "-"; + break; + } + FinalString += NewChar; + } + } + return FinalString; + } + + + comprarLicenca(Produto: ProdutosModel) { + if (confirm("Deseja solicitar uma nova chave de sistema na versão " + Produto.descricao + "?")) { + this.produtosService.buySistema(Produto.idprodutos, this.UserID, 1).then(res => { + //console.log(res); + if (res['chave'] != null) { + alert("Chave gerada com sucesso!"); + this.AtualizaChaves(); + } + else { + alert("Você será redirecionado para a tela de pagamentos do Mercado Pago.\rQuando o pagamento for confirmado, a licença será gerada automaticamente e já aparecerá na sua lista de chaves!"); + const paymentUrl = res['url']; + window.open(paymentUrl, '_blank'); + } + }); + } + } + + copyToClipboard(chave: string) { + navigator.clipboard.writeText(chave).then(() => { + alert("Chave copiada para a área de transferência!"); + }); + } + + NavegarSistema() { + const url = this.router.serializeUrl( + this.router.createUrlTree(['/detalhes/' + this.idsistemas]) + ); + window.open(url, '_blank'); + } + + getKeyCardClass(Chave: any): string { + const hoje = new Date(); + hoje.setHours(0, 0, 0, 0); + + const validade = new Date(Chave.DataValidade); + validade.setHours(0, 0, 0, 0); + + const status = (Chave.Status || '').toString().toLowerCase(); + const ativada = (Chave.Ativada || '').toString().toLowerCase(); + + const expirou = validade < hoje; + const estaAtivada = + ativada === 'sim' || + ativada === 'true' || + ativada === '1' || + ativada === 'ativada'; + + const estaValida = + !expirou && + ( + status.includes('válida') || + status.includes('valid') || + status.includes('ativa') || + status.includes('vigente') || + status === 'ok' + ); + + //console.log("status: " + status + ", ativada: " + ativada + ", expirou: " + expirou + ", estaAtivada: " + estaAtivada + ", estaValida: " + estaValida) + + if (expirou || status.includes('expir') || status.includes('venc')) { + return 'key-card-expired'; + } + + if (estaValida && estaAtivada) { + return 'key-card-active'; + } + + if (estaValida && !estaAtivada) { + return 'key-card-pending'; + } + + return 'key-card-neutral'; + } + + getKeyStatusLabel(Chave: any): string { + const cardClass = this.getKeyCardClass(Chave); + + if (cardClass === 'key-card-expired') { + return 'Expirada'; + } + + if (cardClass === 'key-card-active') { + return 'Válida e ativada'; + } + + if (cardClass === 'key-card-pending') { + return 'Válida, aguardando ativação'; + } + + return 'Status indefinido'; + } + +} diff --git a/src/app/client/client.component.html b/src/app/client/client.component.html new file mode 100644 index 0000000..8dcd829 --- /dev/null +++ b/src/app/client/client.component.html @@ -0,0 +1,157 @@ +
+ + +
+
+ Área do cliente + +

Bem-vindo, {{ NomeUsuario }}!

+ +

+ Gerencie seus sistemas, acompanhe suas licenças e gere chaves de acesso em um só lugar. +

+
+ +
+ Sistemas ativos + {{ SistemasDoUsuario?.length || 0 }} + Disponíveis na sua conta +
+
+ + +
+
+
+ apps +
+ +
+ Total de sistemas + {{ SistemasDoUsuario?.length || 0 }} +
+
+ +
+
+ vpn_key +
+ +
+ Chaves válidas + {{ TotalChavesValidas }} +
+
+ +
+
+ verified_user +
+ +
+ Status + Ativo +
+
+
+ + +
+ +
+
+ Meus sistemas +

Soluções vinculadas à sua conta

+
+
+ +
+ +
+ +
+
+ +
+ +
+

{{ Sistema.nome }}

+ + + {{ Sistema.gratis ? 'Gratuito' : 'Licenciado' }} + +
+
+ +

+ {{ Sistema.descricao }} +

+ +
+
+ Data download + {{ Sistema.data_download | date:'dd/MM/yyyy' }} +
+ +
+ Chaves válidas + {{ Sistema.chavesValidas }} +
+
+ +
+ + + + + +
+ +
+ +
+ +
+
+ inventory_2 +
+ +

Nenhum sistema vinculado ainda

+ +

+ Você ainda não possui sistemas na sua conta. Acesse a página inicial para conhecer as soluções disponíveis. +

+ + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/client/client.component.scss b/src/app/client/client.component.scss new file mode 100644 index 0000000..5a2daaa --- /dev/null +++ b/src/app/client/client.component.scss @@ -0,0 +1,452 @@ +.client-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.client-hero { + position: relative; + overflow: hidden; + display: grid; + grid-template-columns: 1fr 230px; + align-items: center; + gap: 24px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.client-hero::before { + content: ""; + position: absolute; + width: 320px; + height: 320px; + right: -120px; + top: -120px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.11); +} + +.client-hero-text { + position: relative; + z-index: 1; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.client-hero .eyebrow { + color: #bfdbfe; +} + +.client-hero h1 { + margin: 0 0 12px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.client-hero p { + max-width: 660px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +.client-hero-card { + position: relative; + z-index: 1; + padding: 22px; + border-radius: 22px; + background: rgba(255, 255, 255, 0.12); + border: 1px solid rgba(255, 255, 255, 0.18); + backdrop-filter: blur(10px); +} + +.client-hero-card span, +.client-hero-card small { + display: block; + color: #bfdbfe; + font-size: 12px; + font-weight: 800; +} + +.client-hero-card strong { + display: block; + margin: 8px 0; + color: #ffffff; + font-size: 42px; + line-height: 46px; + font-weight: 900; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* PANEL */ + +.systems-panel { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* SYSTEM CARDS */ + +.client-systems-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.client-system-card { + display: flex; + flex-direction: column; + min-height: 280px; + padding: 22px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.client-system-card:hover { + transform: translateY(-3px); + border-color: rgba(7, 27, 99, 0.22); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.system-card-top { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 18px; +} + +.system-logo-box { + width: 70px; + height: 70px; + flex: 0 0 auto; + border-radius: 18px; + display: flex; + align-items: center; + justify-content: center; + background: #ffffff; + border: 1px solid #dbe6ff; + cursor: pointer; +} + +.system-logo { + width: 46px; + height: 46px; + object-fit: contain; +} + +.system-title-block { + min-width: 0; +} + +.system-title-block h3 { + margin: 0 0 8px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; + letter-spacing: -0.025em; +} + +.system-status { + display: inline-flex; + align-items: center; + min-height: 24px; + padding: 0 10px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 12px; + font-weight: 900; +} + +.system-description { + flex: 1; + margin: 0 0 18px 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.system-meta-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + margin-bottom: 18px; +} + +.meta-item { + padding: 14px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #e5e7eb; +} + +.meta-item span { + display: block; + margin-bottom: 5px; + color: #64748b; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.meta-item strong { + display: block; + color: #0f172a; + font-size: 15px; + line-height: 22px; + font-weight: 900; +} + +.system-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.btn-card { + min-height: 40px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border: none; + border-radius: 12px; + color: #ffffff; + font-size: 12px; + font-weight: 900; + cursor: pointer; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-card .material-icons { + font-size: 18px; +} + +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-key { + background: #15803d; + box-shadow: 0 10px 20px rgba(21, 128, 61, 0.20); +} + +.btn-details { + background: #071b63; + box-shadow: 0 10px 20px rgba(7, 27, 99, 0.20); +} + +.btn-remove { + background: #dc2626; + box-shadow: 0 10px 20px rgba(220, 38, 38, 0.18); +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 520px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.btn-empty { + min-height: 44px; + padding: 0 18px; + border: none; + border-radius: 12px; + background: #071b63; + color: #ffffff; + font-size: 13px; + font-weight: 900; + cursor: pointer; +} + +/* RESPONSIVE */ + +@media (max-width: 980px) { + .client-hero { + grid-template-columns: 1fr; + } + + .client-hero-card { + max-width: 260px; + } + + .client-systems-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 720px) { + .summary-grid { + grid-template-columns: 1fr; + } + + .systems-panel { + padding: 20px; + } + + .panel-header h2 { + font-size: 22px; + line-height: 30px; + } + + .system-meta-grid { + grid-template-columns: 1fr; + } + + .system-actions { + flex-direction: column; + } + + .btn-card { + width: 100%; + } +} + +@media (max-width: 480px) { + .client-hero { + padding: 24px; + } + + .client-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .client-system-card { + padding: 18px; + } + + .system-card-top { + align-items: flex-start; + } +} \ No newline at end of file diff --git a/src/app/client/client.component.ts b/src/app/client/client.component.ts new file mode 100644 index 0000000..7b935cb --- /dev/null +++ b/src/app/client/client.component.ts @@ -0,0 +1,70 @@ +import { Component, OnInit } from '@angular/core'; +import { UsuariosService } from '../services/usuarios.service'; +import { SistemasDoUsuario } from '../models/usuariosModel'; +import { Modos } from '../models/variaveisModel'; +import { Router } from '@angular/router'; +import { SistemasService } from '../services/sistemas.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-client', + templateUrl: './client.component.html', + styleUrls: ['./client.component.scss', './../app.component.scss'] +}) +export class ClientComponent implements OnInit { + + NomeUsuario: string = localStorage.getItem("UserName") || "Usuário"; + idusuarios: number = parseInt(localStorage.getItem("UserID") || "0"); + + SistemasDoUsuario: SistemasDoUsuario[] = []; + + JanelaModo: Modos = new Modos(); + + constructor( + private usuariosService: UsuariosService, + private sistemasService: SistemasService, + public router: Router + ) { } + + ngOnInit() { + this.JanelaModo.Visualizar = true; + this.CarregarSistemas(); + } + + get TotalChavesValidas(): number { + if (!this.SistemasDoUsuario) { + return 0; + } + + return this.SistemasDoUsuario.reduce((total, sistema) => { + return total + Number(sistema["chavesValidas"] || 0); + }, 0); + } + + CarregarSistemas() { + this.usuariosService.getSistemasDoUsuario(this.idusuarios).then(resSistemas => { + this.SistemasDoUsuario = resSistemas || []; + }); + } + + GerarChave(Sistema: SistemasDoUsuario) { + this.router.navigate(['dashboard/cliente/chave/' + Sistema.idsistemas]); + } + + RemoverSistema(Sistema: SistemasDoUsuario) { + if (confirm("Tem certeza que deseja remover esse sistema de sua lista?")) { + this.sistemasService.deleteSistemaUsuario(Sistema.idsistemas, Sistema.idusuarios).then(resDelete => { + this.SistemasDoUsuario = this.SistemasDoUsuario.filter(item => item.idsistemas !== Sistema.idsistemas); + alert("Sistema removido com sucesso!"); + }); + } + } + + LinkImagem(idsistemas: number): string { + return environment.LinkProjeto + "/sistemas/" + idsistemas + "/icone.png"; + } + + NavegarSistema(idsistemas: number) { + this.router.navigate(['detalhes/' + idsistemas]); + } +} \ No newline at end of file diff --git a/src/app/criarconta/criarconta.component.html b/src/app/criarconta/criarconta.component.html new file mode 100644 index 0000000..c208ae5 --- /dev/null +++ b/src/app/criarconta/criarconta.component.html @@ -0,0 +1,137 @@ +
+
+ +
+
+ + +

Crie sua conta

+ +

+ Acesse os sistemas da Zendion, INC. com segurança e acompanhe suas soluções em um só lugar. +

+ +
+ Conta segura + Ativação por e-mail + Acesso rápido +
+
+
+ +
+
+ Cadastro +

{{ TituloJanela }}

+

+ Preencha seus dados para criar sua conta. Depois enviaremos um link de ativação para seu e-mail. +

+
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + + + + Digite um CPF válido para liberar o cadastro. + +
+ +
+ + +
+ +
+ + +
+ +
+ {{ MensagemForm }} +
+ + + +

+ Ao criar sua conta, você confirma que seus dados estão corretos e aceita receber o e-mail de ativação. +

+
+ +
+
+ +

Cadastro criado com sucesso

+ +

+ Enviamos um link de ativação para o seu e-mail. Verifique sua caixa de entrada e também a pasta de spam. +

+ + +
+ + + +
+
+ +
+
\ No newline at end of file diff --git a/src/app/criarconta/criarconta.component.scss b/src/app/criarconta/criarconta.component.scss new file mode 100644 index 0000000..9f67ef1 --- /dev/null +++ b/src/app/criarconta/criarconta.component.scss @@ -0,0 +1,386 @@ +.register-page { + min-height: calc(100vh - 80px); + display: flex; + align-items: center; + justify-content: center; + padding: 48px 18px; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.14), transparent 34%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); +} + +.register-shell { + width: 100%; + max-width: 1040px; + display: grid; + grid-template-columns: 0.95fr 1.05fr; + background: #ffffff; + border-radius: 24px; + overflow: hidden; + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.16); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.register-brand-panel { + position: relative; + min-height: 620px; + display: flex; + align-items: flex-end; + padding: 42px; + background: + linear-gradient(145deg, rgba(7, 27, 99, 0.96), rgba(18, 47, 132, 0.94)), + url('/assets/logo_escrito.png'); + color: #ffffff; + overflow: hidden; +} + +.register-brand-panel::before { + content: ""; + position: absolute; + width: 340px; + height: 340px; + right: -120px; + top: -100px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); +} + +.register-brand-panel::after { + content: ""; + position: absolute; + width: 220px; + height: 220px; + left: -80px; + bottom: -70px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.08); +} + +.brand-content { + position: relative; + z-index: 1; +} + +.brand-logo { + height: 54px; + max-width: 240px; + object-fit: contain; + display: block; + margin-bottom: 34px; + filter: brightness(0) invert(1); +} + +.brand-content h1 { + margin: 0 0 14px 0; + font-size: 34px; + line-height: 42px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.brand-content p { + max-width: 390px; + margin: 0; + color: #dbeafe; + font-size: 16px; + line-height: 27px; +} + +.brand-badges { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 28px; +} + +.brand-badges span { + display: inline-flex; + align-items: center; + padding: 8px 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.13); + color: #ffffff; + font-size: 12px; + font-weight: 700; + backdrop-filter: blur(8px); +} + +.register-card { + padding: 44px 48px; +} + +.register-header { + margin-bottom: 28px; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.register-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 30px; + line-height: 38px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.register-header p { + margin: 0; + color: #64748b; + font-size: 15px; + line-height: 24px; +} + +.register-body { + width: 100%; +} + +.register-form { + display: grid; + gap: 16px; +} + +.form-group { + text-align: left; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 700; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; + box-sizing: border-box; +} + +.form-control::placeholder { + color: #94a3b8; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); + background-color: #ffffff; +} + +.field-hint { + display: block; + margin-top: 7px; + color: #b45309; + font-size: 12px; + line-height: 18px; +} + +.btn-register { + width: 100%; + height: 48px; + margin-top: 6px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 15px; + font-weight: 800; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.22); + transition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease; +} + +.btn-register:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.28); +} + +.btn-register:active:not(:disabled) { + transform: translateY(0); +} + +.btn-register:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; +} + +.terms-text { + margin: 0; + color: #64748b; + font-size: 12px; + line-height: 19px; + text-align: center; +} + +.register-footer { + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + gap: 16px; + margin-top: 26px; + padding-top: 22px; + border-top: 1px solid #e5e7eb; +} + +.register-footer span { + width: 4px; + height: 4px; + border-radius: 999px; + background: #cbd5e1; +} + +.register-footer a { + color: #071b63; + font-size: 14px; + font-weight: 700; + text-decoration: none; +} + +.register-footer a:first-child { + text-align: left; +} + +.register-footer a:last-child { + text-align: right; +} + +.register-footer a:hover { + text-decoration: underline; +} + +.register-message { + padding: 12px 14px; + border-radius: 12px; + background: #fef2f2; + border: 1px solid #fecaca; + text-align: left; +} + +.register-message small { + display: block; + color: #b91c1c; + font-size: 13px; + line-height: 20px; + font-weight: 600; +} + +.success-box { + text-align: center; + padding: 18px 0 4px 0; +} + +.success-icon { + width: 64px; + height: 64px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #dcfce7; + color: #15803d; + font-size: 34px; + font-weight: 900; +} + +.success-box h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 24px; + line-height: 32px; + font-weight: 800; +} + +.success-box p { + margin: 0 0 24px 0; + color: #64748b; + font-size: 15px; + line-height: 24px; +} + +@media (max-width: 860px) { + .register-shell { + grid-template-columns: 1fr; + max-width: 560px; + } + + .register-brand-panel { + min-height: auto; + padding: 30px; + align-items: flex-start; + } + + .brand-logo { + height: 44px; + margin-bottom: 22px; + } + + .brand-content h1 { + font-size: 28px; + line-height: 36px; + } + + .register-card { + padding: 34px 26px; + } +} + +@media (max-width: 480px) { + .register-page { + padding: 22px 12px; + } + + .register-shell { + border-radius: 18px; + } + + .register-brand-panel { + padding: 24px; + } + + .brand-badges { + display: none; + } + + .register-card { + padding: 28px 20px; + } + + .register-header h2 { + font-size: 25px; + line-height: 32px; + } + + .register-footer { + grid-template-columns: 1fr; + gap: 10px; + } + + .register-footer span { + display: none; + } + + .register-footer a, + .register-footer a:first-child, + .register-footer a:last-child { + text-align: center; + } +} \ No newline at end of file diff --git a/src/app/criarconta/criarconta.component.ts b/src/app/criarconta/criarconta.component.ts new file mode 100644 index 0000000..c9b009e --- /dev/null +++ b/src/app/criarconta/criarconta.component.ts @@ -0,0 +1,341 @@ +import { Component, OnInit } from '@angular/core'; +import { Usuarios, Email } from '../models/usuariosModel'; +import { UsuariosService } from '../services/usuarios.service'; +import { environment } from 'src/environments/environment'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-criarconta', + templateUrl: './criarconta.component.html', + styleUrls: ['./criarconta.component.scss'] +}) +export class CriarcontaComponent implements OnInit { + + FormUsuario: Usuarios = new Usuarios(); + ListUsuarios: Usuarios[]; + MensagemForm: String; + TituloJanela: String = "Cadastre-se"; + TextoBotao: String = "Criar conta"; + FormEmail: Email = new Email(); + Sucesso: boolean = false; + CPFValido: boolean = false; + + constructor( + private usuariosSerivce: UsuariosService, + private router: Router, + ) { } + + ngOnInit() { + this.FormUsuario.idtiposdeusuario = 2; + this.FormUsuario.habilitado = false; + this.ListUsuarios = []; + + this.usuariosSerivce.getUsuarios().then(resUsuarios => { + this.ListUsuarios = resUsuarios || []; + }); + } + + EnviarEmail(link: string) { + const nomeUsuario = this.FormUsuario.nome || 'usuário'; + + const text = ` + + + + + + Ativação de conta Zendion, INC. + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Zendion, INC. +
+

+ Olá, ${nomeUsuario}! +

+
+

+ Sua conta na Zendion, INC. foi criada com sucesso. +

+ +

+ Para ativar sua conta e começar a usar o sistema, clique no botão abaixo: +

+
+ + Ativar minha conta + +
+

+ Se o botão não funcionar, copie e cole este link no navegador: +

+ +

+ + ${link} + +

+
+ + + + +
+

+ Se você não criou uma conta na Zendion, INC., ignore este e-mail. +

+
+
+

+ Atenciosamente,
+ Equipe Zendion, INC. +

+
+

+ Zendion, INC. +

+ +

+ +55 19 99871-7560
+ contato@zendioninc.com.br
+ + zendioninc.com.br + +

+
+ + + + + + +
+

+ Este é um e-mail automático. Por favor, não responda esta mensagem. +

+
+ +
+ + + + `; + + this.FormEmail.Assunto = 'Ative sua conta na Zendion, INC.'; + this.FormEmail.Conteudo = text; + this.FormEmail.Para = this.FormUsuario.email; + + this.usuariosSerivce.EnviarEmail(this.FormEmail).then(response => { + this.Sucesso = true; + this.TextoBotao = "Voltar ao site"; + + if (response != null && response["sucesso"] == true) { + this.TituloJanela = "Um link de ativação foi enviado para seu e-mail. Verifique sua caixa de entrada para ativar sua conta!"; + } else { + this.TituloJanela = "Ocorreu um erro ao enviar o link de ativação para seu endereço de e-mail. Verifique suas informações ou entre em contato com o administrador do sistema."; + } + }); + } + + btnCriarcontaClick() { + if (this.TextoBotao == "Voltar ao site") { + this.router.navigate(['home']); + return; + } + + this.MensagemForm = ""; + + if (!this.FormUsuario.nome || this.FormUsuario.nome.trim() == "") { + this.MensagemForm = "O campo nome é obrigatório."; + return; + } + + if (!this.FormUsuario.email || this.FormUsuario.email.trim() == "") { + this.MensagemForm = "O campo e-mail é obrigatório."; + return; + } + + if (!this.FormUsuario.cpf || this.FormUsuario.cpf.trim() == "") { + this.MensagemForm = "O campo CPF é obrigatório."; + return; + } + + if (!this.CPFValido) { + this.MensagemForm = "Digite um CPF válido para continuar."; + return; + } + + if (!this.FormUsuario.usuario || this.FormUsuario.usuario.trim() == "") { + this.MensagemForm = "O campo usuário é obrigatório."; + return; + } + + if (!this.FormUsuario.senha || this.FormUsuario.senha.trim() == "") { + this.MensagemForm = "O campo senha é obrigatório."; + return; + } + + if (this.ListUsuarios && this.ListUsuarios.length > 0) { + for (let i = 0; i < this.ListUsuarios.length; i++) { + if (this.ListUsuarios[i].usuario == this.FormUsuario.usuario) { + this.MensagemForm = "Nome de usuário indisponível."; + return; + } + + if (this.ListUsuarios[i].email == this.FormUsuario.email) { + this.MensagemForm = "Este e-mail já está cadastrado."; + return; + } + + if (this.ListUsuarios[i].cpf == this.FormUsuario.cpf) { + this.MensagemForm = "Este CPF já está cadastrado."; + return; + } + } + } + + this.usuariosSerivce.insertUsuarios(this.FormUsuario).then(resInsert => { + if (resInsert['status'] == 200) { + this.EnviarEmail(environment.ApiUrl + "/users/ativarUsuario/" + resInsert['response'].insertId); + } else { + this.MensagemForm = "Erro ao criar usuário."; + } + }); + } + + MascaraCPF(event: KeyboardEvent): void { + + if (!((event.keyCode >= 48 && event.keyCode <= 58) || (event.keyCode >= 96 && event.keyCode <= 106))) { + if (event.keyCode == 8 || (event.keyCode >= 37 && event.keyCode <= 40) || event.keyCode == 46) { + return; + } + this.FormUsuario.cpf = this.FormUsuario.cpf.substr(0, this.FormUsuario.cpf.length - 1); + } + if (this.FormUsuario.cpf.length == 3 || this.FormUsuario.cpf.length == 7) + this.FormUsuario.cpf += "."; + if (this.FormUsuario.cpf.length == 11) + this.FormUsuario.cpf += "-"; + if (this.FormUsuario.cpf.length == 14) + this.ValidaCPF(); + } + + ValidaCPF() { + const cpf = + this.FormUsuario.cpf[0] + + this.FormUsuario.cpf[1] + + this.FormUsuario.cpf[2] + + this.FormUsuario.cpf[4] + + this.FormUsuario.cpf[5] + + this.FormUsuario.cpf[6] + + this.FormUsuario.cpf[8] + + this.FormUsuario.cpf[9] + + this.FormUsuario.cpf[10] + + this.FormUsuario.cpf[12] + + this.FormUsuario.cpf[13]; + if (cpf) { + let numbers, digits, sum, i, result, equalDigits; + equalDigits = 1; + if (cpf.length < 11) { + this.CPFValido = false; + return null; + } + + for (i = 0; i < cpf.length - 1; i++) { + if (cpf.charAt(i) !== cpf.charAt(i + 1)) { + equalDigits = 0; + break; + } + } + + if (!equalDigits) { + numbers = cpf.substring(0, 9); + digits = cpf.substring(9); + sum = 0; + for (i = 10; i > 1; i--) { + sum += numbers.charAt(10 - i) * i; + } + + result = sum % 11 < 2 ? 0 : 11 - (sum % 11); + + if (result !== Number(digits.charAt(0))) { + this.CPFValido = false; + this.MensagemForm = "CPF digitado é inválido!"; + return { cpfNotValid: true }; + } + numbers = cpf.substring(0, 10); + sum = 0; + + for (i = 11; i > 1; i--) { + sum += numbers.charAt(11 - i) * i; + } + result = sum % 11 < 2 ? 0 : 11 - (sum % 11); + + if (result !== Number(digits.charAt(1))) { + this.CPFValido = false; + this.MensagemForm = "CPF digitado é inválido!"; + return { cpfNotValid: true }; + } + this.CPFValido = true; + this.MensagemForm = ""; + return null; + } else { + this.CPFValido = false; + this.MensagemForm = "CPF digitado é inválido!"; + return { cpfNotValid: true }; + } + } + this.MensagemForm = ""; + this.CPFValido = true; + return null; + } + +} diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html new file mode 100644 index 0000000..dc7631a --- /dev/null +++ b/src/app/dashboard/dashboard.component.html @@ -0,0 +1,79 @@ +
+ + +
+
+ + + + + +
+ +
+ Painel + Zendion, INC. +
+
+ +
+
+ account_circle + {{UserName || 'Usuário'}} +
+ + +
+
+ + + + + +
+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss new file mode 100644 index 0000000..ee84ae1 --- /dev/null +++ b/src/app/dashboard/dashboard.component.scss @@ -0,0 +1,385 @@ +.dashboard-layout { + min-height: 100vh; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.08), transparent 34%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 50%, #ffffff 100%); + color: #0f172a; +} + +/* ========================= + HEADER +========================= */ + +.dashboard-header { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 74px; + z-index: 1000; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 24px; + background: rgba(7, 27, 99, 0.95); + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: 0 14px 38px rgba(15, 23, 42, 0.22); + backdrop-filter: blur(14px); + box-sizing: border-box; +} + +.header-left, +.header-right { + display: flex; + align-items: center; +} + +.header-left { + gap: 18px; +} + +.header-right { + gap: 12px; +} + +.brand-link { + display: inline-flex; + align-items: center; + text-decoration: none; +} + +.logo { + object-fit: contain; + display: block; +} + +.logo-escrito { + height: 44px; +} + +.logo-favicon { + display: none; + height: 40px; +} + +.header-divider { + width: 1px; + height: 34px; + background: rgba(255, 255, 255, 0.18); +} + +.header-title { + display: flex; + flex-direction: column; + line-height: 1.15; +} + +.header-title span { + color: #bfdbfe; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.header-title strong { + color: #ffffff; + font-size: 15px; + font-weight: 900; +} + +.user-pill { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 8px; + padding: 0 14px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.10); + color: #ffffff; + border: 1px solid rgba(255, 255, 255, 0.16); +} + +.user-pill .material-icons { + font-size: 21px; +} + +.user-pill span { + font-size: 13px; + font-weight: 800; + max-width: 160px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.logout-btn { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 8px; + padding: 0 14px; + border: none; + border-radius: 12px; + background: #ffffff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 10px 24px rgba(0, 0, 0, 0.16); + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.logout-btn .material-icons { + font-size: 20px; +} + +.logout-btn:hover { + transform: translateY(-1px); + background: #f8fafc; + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.20); +} + +/* ========================= + SIDEBAR +========================= */ + +.dashboard-sidebar { + position: fixed; + top: 74px; + left: 0; + bottom: 0; + width: 270px; + z-index: 900; + padding: 22px 14px; + background: + radial-gradient(circle at top left, rgba(255, 255, 255, 0.10), transparent 34%), + linear-gradient(180deg, #071b63 0%, #04113f 100%); + border-right: 1px solid rgba(255, 255, 255, 0.10); + box-shadow: 14px 0 34px rgba(15, 23, 42, 0.12); + overflow-y: auto; + box-sizing: border-box; +} + +.sidebar-title { + padding: 0 12px 16px 12px; +} + +.sidebar-title span { + color: #bfdbfe; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.sidebar-nav { + display: grid; + gap: 8px; +} + +.menu-item { + width: 100%; +} + +.dropdown-btn { + width: 100%; + min-height: 46px; + padding: 0 12px; + border: none; + border-radius: 14px; + background: transparent; + color: #dbeafe; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + text-align: left; + transition: background-color 0.18s ease, color 0.18s ease, transform 0.18s ease; +} + +.dropdown-btn:hover { + background: rgba(255, 255, 255, 0.10); + color: #ffffff; +} + +.menu-main { + display: inline-flex; + align-items: center; + gap: 12px; + min-width: 0; +} + +.menu-main span { + font-size: 14px; + font-weight: 800; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.menu-icon { + font-size: 22px; + color: #bfdbfe; + flex: 0 0 auto; +} + +.dropdown-icon { + font-size: 22px; + color: #bfdbfe; + flex: 0 0 auto; +} + +.dropdown-container { + display: block; + margin: 6px 0 10px 0; + padding: 6px; + border-radius: 16px; + background: rgba(2, 6, 23, 0.22); + border: 1px solid rgba(255, 255, 255, 0.08); +} + +.submenu-item { + min-height: 40px; + padding: 0 10px; + display: flex; + align-items: center; + gap: 10px; + border-radius: 12px; + color: #cbd5e1; + text-decoration: none; + transition: background-color 0.18s ease, color 0.18s ease, transform 0.18s ease; +} + +.submenu-item span { + font-size: 13px; + font-weight: 750; +} + +.submenu-icon { + font-size: 19px; + color: #93c5fd; +} + +.submenu-item:hover, +.active-submenu { + background: rgba(255, 255, 255, 0.12); + color: #ffffff; + text-decoration: none; +} + +.submenu-item:hover { + transform: translateX(2px); +} + +/* ========================= + CONTENT +========================= */ + +.dashboard-main { + min-height: 100vh; + padding-top: 74px; + box-sizing: border-box; +} + +.dashboard-main.with-sidebar { + padding-left: 270px; +} + +.dashboard-main.without-sidebar { + padding-left: 0; +} + +.dashboard-content-card { + min-height: calc(100vh - 74px); + padding: 28px; + box-sizing: border-box; +} + +/* ========================= + RESPONSIVE +========================= */ + +@media (max-width: 900px) { + .dashboard-sidebar { + width: 230px; + } + + .dashboard-main.with-sidebar { + padding-left: 230px; + } + + .header-title { + display: none; + } +} + +@media (max-width: 768px) { + .dashboard-header { + height: 68px; + padding: 0 14px; + } + + .dashboard-sidebar { + position: relative; + top: 68px; + width: 100%; + height: auto; + min-height: auto; + padding: 12px; + display: block; + border-right: none; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + } + + .dashboard-main, + .dashboard-main.with-sidebar, + .dashboard-main.without-sidebar { + padding-left: 0; + padding-top: 68px; + } + + .dashboard-main.with-sidebar { + padding-top: 68px; + } + + .dashboard-content-card { + padding: 18px 14px; + } + + .logo-escrito { + display: none; + } + + .logo-favicon { + display: block; + } + + .user-pill { + display: none; + } + + .logout-btn span { + display: none; + } + + .logout-btn { + width: 40px; + padding: 0; + justify-content: center; + } +} + +@media (max-width: 480px) { + .dashboard-content-card { + padding: 14px 10px; + } + + .dropdown-btn { + min-height: 44px; + } + + .menu-main span { + font-size: 13px; + } +} \ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts new file mode 100644 index 0000000..cca6f56 --- /dev/null +++ b/src/app/dashboard/dashboard.component.ts @@ -0,0 +1,272 @@ +import { Component, OnInit } from '@angular/core'; +import { MenuItem } from '../models/dashboardModel'; +import { Router } from '@angular/router'; +import { FuncoesGlobais } from 'src/environments/environment'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'] +}) +export class DashboardComponent implements OnInit { + + BotoesMenuLateral: MenuItem[]; + UserName: string = localStorage.getItem("UserName") || ""; + + constructor( + private router: Router, + private FuncoesGlobais: FuncoesGlobais, + ) { } + + ngOnInit() { + if (localStorage.getItem("Role") == "1") { + this.PreencherMenuItensAdmin(); + } + else if (localStorage.getItem("Role") == "2") { + this.PreencherMenuItensCliente(); + } + else { + this.router.navigate(['/login']); + } + + } + + PreencherMenuItensAdmin() { + this.BotoesMenuLateral = [ + { + index: 0, + texto: "Página inicial", + link: "dashboard/admin/home", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 1, + texto: "Usuários", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "person", + issub: false, + sub: [ + { + index: 0, + texto: "Cadastrar", + link: "usuarios/cadastro", + icon: "person_add", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Visualizar", + link: "usuarios/visualizar", + icon: "pageview", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + { + index: 2, + texto: "Sistemas", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "extension", + issub: false, + sub: [ + { + index: 0, + texto: "Cadastro", + link: "sistemas/cadastro", + icon: "add_to_queue", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Visualizar", + link: "sistemas/visualizar", + icon: "pageview", + havesub: null, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + { + index: 3, + texto: "Ambiente cliente", + link: "/dashboard/cliente", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 4, + texto: "Bingo", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "extension", + issub: false, + sub: [ + { + index: 0, + texto: "Dashboard", + link: "/bingo/dashboard", + icon: "add_to_queue", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Sorteio", + link: "/bingo/sorteio", + icon: "pageview", + havesub: null, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + { + index: 5, + texto: "OrionTard Pro", + link: "/orion-dashboard", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 6, + texto: "AgroBase", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "agriculture", + issub: false, + sub: [ + { + index: 0, + texto: "Versionamento", + link: "/agrobase/versionamento", + icon: "update", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + ]; + this.CriaEventoClickSubItens(); + } + + PreencherMenuItensCliente() { + this.BotoesMenuLateral = [ + /*{ + index: 0, + texto: "Página inicial", + link: "/home", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 1, + texto: "Meus Sistemas", + link: "/dashboard/cliente", + havesub: false, + dropicon: "arrow_drop_down", + icon: "extension", + issub: false, + sub: [ + { + index: 0, + texto: "Machining Price Simulator", + link: "sistemas/MPS", + icon: "assessment", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Casco-Tubo", + link: "sistemas/Casco-Tubo", + icon: "assessment", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + ], + },*/ + ]; + this.CriaEventoClickSubItens(); + } + + CriaEventoClickSubItens() { + setTimeout(() => { + var dropdown = document.getElementsByClassName("dropdown-btn"); + for (let i = 0; i < dropdown.length; i++) { + if (this.BotoesMenuLateral[i].havesub) { + dropdown[i].addEventListener("click", function() { + this.classList.toggle("active"); + var dropdownContent = this.nextElementSibling; + if (dropdownContent.style.display === "block") { + dropdownContent.style.display = "none"; + } else { + dropdownContent.style.display = "block"; + } + }); + } + } + }, 100); + } + + DropMenuItem(indexBtnMenu) { + if (this.BotoesMenuLateral[indexBtnMenu].havesub) { + if (this.BotoesMenuLateral[indexBtnMenu].dropicon == "arrow_drop_down") + this.BotoesMenuLateral[indexBtnMenu].dropicon = "arrow_drop_up"; + else + this.BotoesMenuLateral[indexBtnMenu].dropicon = "arrow_drop_down"; + } + else { + this.router.navigate([this.BotoesMenuLateral[indexBtnMenu].link]); + } + } + + Sair() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserName"); + localStorage.removeItem("UserID"); + localStorage.removeItem("Role"); + localStorage.removeItem("LastRouteBeforeLogin"); + + this.router.navigate(['/home']); + } + +} diff --git a/src/app/detalhes-sistema/detalhes-sistema.component.html b/src/app/detalhes-sistema/detalhes-sistema.component.html new file mode 100644 index 0000000..8542844 --- /dev/null +++ b/src/app/detalhes-sistema/detalhes-sistema.component.html @@ -0,0 +1,197 @@ +
+ + +
+ Carregando +

Carregando detalhes do sistema...

+
+ + +
+ + +
+
+ +
+
+ Ícone do sistema +
+ +
+ Sistema Zendion + +

{{ Sistema.nome }}

+ +

{{ Sistema.descricao }}

+ +
+ {{ Sistema.tiposdesistema }} + {{ Sistema.tiposlicenca }} + {{ Sistema.plataforma }} +
+
+ +
+ Versão atual + {{ Sistema.versaoatual }} + + + +

+ {{ Sistema.plataforma }} • {{ Sistema.versaoatual }} +

+
+
+
+ + +
+
+ Versão + {{ Sistema.versaoatual }} +
+ +
+ Lançamento + {{ Sistema.insert_date | date:'dd/MM/yyyy' }} +
+ +
+ Categoria + {{ Sistema.tiposdesistema }} +
+ +
+ Licença + {{ Sistema.tiposlicenca }} +
+
+ + +
+
+ Detalhes +

Conheça melhor o sistema

+

Recursos, telas e informações importantes sobre esta solução.

+
+ +
+ +
+
+
+ +
+ Detalhe do sistema +
+
+
+ + +
+ +
+ Disponível para + + Plataforma + + {{ Sistema.plataforma }} +
+ +
+ Notas de atualização + + + Atualizado em {{ Sistema.update_date | date:'dd/MM/yyyy' }} + + +
+
+ +
+ + +
+
+
+ Histórico +

Versões anteriores

+
+
+ +
    +
  • +
    + {{ versao.split('versoes/')[1].split('/')[0] }} + {{ versao.split('¬')[1] | date:'dd/MM/yyyy HH:mm' }} +
    + + + Baixar + +
  • +
+
+ + +
+
+
+ Arquivos +

Materiais para download

+
+
+ +
    +
  • +
    + {{ download.split('downloads/')[1].split('¬')[0] }} + {{ download.split('¬')[1] | date:'dd/MM/yyyy HH:mm' }} +
    + + + Abrir + +
  • +
+
+ + +
+
+ Pronto para continuar? +

{{ Sistema.nome }}

+

{{ Sistema.plataforma }} • {{ Sistema.versaoatual }}

+
+ + +
+ +
+ + +
+ × + +
+
+ +
\ No newline at end of file diff --git a/src/app/detalhes-sistema/detalhes-sistema.component.scss b/src/app/detalhes-sistema/detalhes-sistema.component.scss new file mode 100644 index 0000000..7815689 --- /dev/null +++ b/src/app/detalhes-sistema/detalhes-sistema.component.scss @@ -0,0 +1,628 @@ +.details-page { + min-height: 100vh; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.14), transparent 32%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); + color: #0f172a; +} + +.details-loader { + min-height: 360px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.loader { + width: 72px; + height: 72px; + object-fit: contain; + margin-bottom: 16px; +} + +.details-loader p { + color: #64748b; + font-size: 15px; + font-weight: 700; +} + +.details-wrapper { + width: 100%; + max-width: 1180px; + margin: 0 auto; + padding: 44px 22px 64px 22px; + box-sizing: border-box; +} + +/* HERO */ + +.system-hero { + position: relative; + overflow: hidden; + border-radius: 28px; + background: + radial-gradient(circle at top right, rgba(255,255,255,0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.18); + color: #ffffff; +} + +.system-hero-glow { + position: absolute; + width: 360px; + height: 360px; + right: -130px; + top: -130px; + border-radius: 999px; + background: rgba(255,255,255,0.12); +} + +.system-hero-content { + position: relative; + z-index: 1; + display: grid; + grid-template-columns: auto 1fr 260px; + align-items: center; + gap: 30px; + padding: 42px; +} + +.system-icon-card { + width: 126px; + height: 126px; + border-radius: 28px; + background: #ffffff; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 18px 42px rgba(0, 0, 0, 0.18); +} + +.system-icon { + width: 82px; + height: 82px; + object-fit: contain; +} + +.eyebrow { + display: inline-block; + margin-bottom: 12px; + color: #bfdbfe; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.system-hero-text h1 { + margin: 0 0 14px 0; + font-size: 42px; + line-height: 50px; + font-weight: 900; + letter-spacing: -0.045em; +} + +.system-hero-text p { + max-width: 600px; + margin: 0; + color: #dbeafe; + font-size: 16px; + line-height: 27px; +} + +.system-badges { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 22px; +} + +.system-badges span { + padding: 8px 12px; + border-radius: 999px; + background: rgba(255,255,255,0.12); + color: #ffffff; + font-size: 12px; + font-weight: 800; +} + +.system-action-card { + padding: 22px; + border-radius: 22px; + background: rgba(255,255,255,0.12); + border: 1px solid rgba(255,255,255,0.18); + backdrop-filter: blur(10px); +} + +.system-action-card small { + display: block; + color: #bfdbfe; + font-size: 12px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.system-action-card strong { + display: block; + margin: 8px 0 18px 0; + color: #ffffff; + font-size: 24px; + font-weight: 900; +} + +.system-action-card p { + margin: 14px 0 0 0; + color: #dbeafe; + font-size: 12px; + line-height: 18px; +} + +.btn-main-action { + width: 100%; + min-height: 48px; + border: none; + border-radius: 14px; + background: #ffffff; + color: #071b63; + font-size: 15px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 14px 26px rgba(0,0,0,0.16); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.btn-main-action:hover { + transform: translateY(-1px); + box-shadow: 0 18px 34px rgba(0,0,0,0.20); +} + +/* INFO */ + +.info-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 16px; + margin-top: 24px; +} + +.info-card { + padding: 20px; + border-radius: 20px; + background: #ffffff; + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.info-card span { + display: block; + margin-bottom: 8px; + color: #64748b; + font-size: 12px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.info-card strong { + display: block; + color: #0f172a; + font-size: 17px; + line-height: 24px; + font-weight: 900; +} + +/* SECTION HEADER */ + +.section-header { + text-align: center; + margin: 54px 0 34px 0; +} + +.section-header .eyebrow { + color: #071b63; +} + +.section-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.section-header p { + max-width: 620px; + margin: 0 auto; + color: #64748b; + font-size: 16px; + line-height: 26px; +} + +/* DETAILS CARDS */ + +.details-sections { + margin-top: 12px; +} + +.detail-card { + display: grid; + grid-template-columns: 1fr 1fr; + overflow: hidden; + margin-bottom: 26px; + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.detail-card.reverse .detail-text { + order: 2; +} + +.detail-card.reverse .detail-image-wrapper { + order: 1; +} + +.detail-text { + padding: 38px; + display: flex; + align-items: center; + color: #475569; + font-size: 16px; + line-height: 27px; +} + +.detail-text h1, +.detail-text h2, +.detail-text h3, +.detail-text h4 { + color: #0f172a; + font-weight: 900; + letter-spacing: -0.025em; +} + +.detail-text p:last-child { + margin-bottom: 0; +} + +.detail-image-wrapper { + min-height: 340px; + background: #e5e7eb; +} + +.detail-image { + width: 100%; + height: 100%; + min-height: 340px; + object-fit: cover; + display: block; + cursor: zoom-in; + transition: transform 0.22s ease; +} + +.detail-image:hover { + transform: scale(1.025); +} + +/* SECONDARY PANELS */ + +.secondary-grid { + display: grid; + grid-template-columns: 0.75fr 1.25fr; + gap: 22px; + margin-top: 42px; +} + +.panel-card { + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.availability-section { + padding: 30px; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + +.panel-label { + display: block; + margin-bottom: 14px; + color: #071b63; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.10em; +} + +.platform-icon { + width: 54px; + height: 54px; + object-fit: contain; + margin: 8px 0 16px 0; +} + +.availability-section strong { + color: #0f172a; + font-size: 18px; + font-weight: 900; +} + +.update-notes { + padding: 30px; +} + +.update-notes small { + display: block; + color: #64748b; + font-size: 13px; + margin-bottom: 14px; +} + +.update-text { + color: #475569; + font-size: 15px; + line-height: 25px; + padding: 18px; + border-radius: 16px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +/* LISTS */ + +.list-panel { + margin-top: 24px; + padding: 30px; +} + +.list-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 18px; +} + +.list-header h3 { + margin: 0; + color: #0f172a; + font-size: 24px; + line-height: 32px; + font-weight: 900; +} + +.resource-list { + list-style: none; + margin: 0; + padding: 0; + display: grid; + gap: 12px; +} + +.resource-list li { + display: flex; + justify-content: space-between; + gap: 18px; + align-items: center; + padding: 16px; + border-radius: 16px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.resource-list strong { + display: block; + color: #0f172a; + font-size: 14px; + line-height: 21px; + font-weight: 900; + word-break: break-word; +} + +.resource-list small { + display: block; + margin-top: 4px; + color: #64748b; + font-size: 12px; +} + +.resource-list a { + flex: 0 0 auto; + padding: 10px 14px; + border-radius: 12px; + background: #071b63; + color: #ffffff; + font-size: 13px; + font-weight: 900; + text-decoration: none; +} + +.resource-list a:hover { + background: #12358f; +} + +/* FINAL CTA */ + +.final-cta { + margin-top: 34px; + padding: 32px; + border-radius: 24px; + display: grid; + grid-template-columns: 1fr 220px; + align-items: center; + gap: 24px; + background: + radial-gradient(circle at top right, rgba(255,255,255,0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.final-cta h2 { + margin: 0 0 8px 0; + color: #ffffff; + font-size: 28px; + line-height: 36px; + font-weight: 900; +} + +.final-cta p { + margin: 0; + color: #dbeafe; + font-size: 14px; +} + +.final-cta .btn-main-action { + background: #ffffff; + color: #071b63; +} + +/* MODAL */ + +.image-modal { + display: none; + position: fixed; + z-index: 9999; + inset: 0; + overflow: auto; + background-color: rgba(2, 6, 23, 0.92); + padding: 56px 18px; + box-sizing: border-box; +} + +.modal-content { + margin: auto; + display: block; + width: auto; + max-width: 92%; + max-height: 82vh; + border-radius: 16px; + box-shadow: 0 24px 70px rgba(0,0,0,0.45); +} + +#caption { + margin: 16px auto 0 auto; + width: 80%; + max-width: 760px; + text-align: center; + color: #cbd5e1; + font-size: 14px; + line-height: 22px; +} + +.close { + position: fixed; + top: 18px; + right: 30px; + color: #ffffff; + font-size: 42px; + font-weight: 900; + cursor: pointer; + z-index: 10000; +} + +.close:hover { + color: #cbd5e1; +} + +/* RESPONSIVE */ + +@media (max-width: 980px) { + .system-hero-content { + grid-template-columns: auto 1fr; + } + + .system-action-card { + grid-column: 1 / -1; + } + + .info-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .detail-card { + grid-template-columns: 1fr; + } + + .detail-card.reverse .detail-text, + .detail-card.reverse .detail-image-wrapper { + order: unset; + } + + .secondary-grid { + grid-template-columns: 1fr; + } + + .final-cta { + grid-template-columns: 1fr; + } +} + +@media (max-width: 620px) { + .details-wrapper { + padding: 28px 14px 46px 14px; + } + + .system-hero-content { + grid-template-columns: 1fr; + padding: 28px; + text-align: center; + } + + .system-icon-card { + margin: 0 auto; + } + + .system-hero-text h1 { + font-size: 32px; + line-height: 40px; + } + + .system-badges { + justify-content: center; + } + + .info-grid { + grid-template-columns: 1fr; + } + + .section-header h2 { + font-size: 28px; + line-height: 36px; + } + + .detail-text { + padding: 26px; + } + + .detail-image, + .detail-image-wrapper { + min-height: 240px; + } + + .resource-list li { + align-items: flex-start; + flex-direction: column; + } + + .resource-list a { + width: 100%; + text-align: center; + } + + .final-cta { + padding: 26px; + text-align: center; + } + + .modal-content { + width: 100%; + max-width: 100%; + } +} \ No newline at end of file diff --git a/src/app/detalhes-sistema/detalhes-sistema.component.ts b/src/app/detalhes-sistema/detalhes-sistema.component.ts new file mode 100644 index 0000000..3e12197 --- /dev/null +++ b/src/app/detalhes-sistema/detalhes-sistema.component.ts @@ -0,0 +1,202 @@ +import { Component, OnInit } from '@angular/core'; +import { Sistemas, Download, SistemasDetalhes, SistemasLista } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { UsuariosService } from '../services/usuarios.service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-detalhes-sistema', + templateUrl: './detalhes-sistema.component.html', + styleUrls: ['./detalhes-sistema.component.scss'] +}) +export class DetalhesSistemaComponent implements OnInit { + + Sistema: SistemasLista = new SistemasLista(); + + idsistemas: number = parseInt(this.route.snapshot.params['idsistemas']); + idusuarios: number = parseInt(localStorage.getItem("UserID") || "0"); + + FormDownload: Download = new Download(); + + Logado: boolean = false; + Adiquirido: boolean = false; + + btnBaixar: string = "Adquirir"; + + Detalhes: SistemasDetalhes[] = []; + + LinkProjeto: string = environment.LinkProjeto; + + Carregado: boolean = false; + + x86: boolean = false; + x64: boolean = true; + + constructor( + private sistemasService: SistemasService, + private usuariosService: UsuariosService, + private route: ActivatedRoute, + private router: Router + ) { } + + ngOnInit() { + this.FormDownload.idsistemas = this.idsistemas; + this.FormDownload.idusuarios = this.idusuarios; + + this.sistemasService.getSistemaByIDLista(this.idsistemas).then(resSistema => { + this.Sistema = resSistema; + + if (!this.Sistema.versoes) { + this.Sistema.versoes = []; + } + + if (!this.Sistema.mdownloads) { + this.Sistema.mdownloads = []; + } + + this.CarregarVersoesEDownloads(); + }) + .catch(error => { + console.error('[DetalhesSistema] Erro ao carregar sistema:', error); + this.Carregado = true; + }); + } + + CarregarVersoesEDownloads() { + this.sistemasService.getSistemaVersoes(this.idsistemas).then(resVersoes => { + this.Sistema.versoes = []; + + if (resVersoes) { + resVersoes.forEach(versao => { + this.Sistema.versoes.push(versao.replace("/var/www/html", this.LinkProjeto)); + }); + } + + this.CarregarDownloads(); + }) + .catch(error => { + this.CarregarDownloads(); + }); + } + + CarregarDownloads() { + this.sistemasService.getSistemaDownloads(this.idsistemas).then(resDownloads => { + this.Sistema.mdownloads = []; + + if (resDownloads) { + resDownloads.forEach(download => { + this.Sistema.mdownloads.push(download.replace("/var/www/html", this.LinkProjeto)); + }); + } + + this.CarregaDetalhesSistema(); + }) + .catch(error => { + this.CarregaDetalhesSistema(); + }); + } + + CarregaDetalhesSistema() { + if (localStorage.getItem("Session") == "1") { + this.Logado = true; + + this.usuariosService.getSistemasDoUsuario(this.idusuarios).then(resSistemas => { + if (resSistemas) { + resSistemas.forEach(sistema => { + if (sistema.idsistemas == this.Sistema.idsistemas) { + this.Adiquirido = true; + this.btnBaixar = (this.Sistema.idtiposdesistema == 6) ? "Acessar" : "Baixar"; + } + }); + } + + this.CarregarDetalhes(); + }) + .catch(error => { + this.CarregarDetalhes(); + }); + + return; + } + + this.CarregarDetalhes(); + } + + CarregarDetalhes() { + this.sistemasService.getDetalhesByIDEn(this.idsistemas).then(resDetalhes => { + this.Detalhes = resDetalhes || []; + this.Carregado = true; + }) + .catch(error => { + console.error('[DetalhesSistema] Erro ao carregar detalhes:', error); + this.Detalhes = []; + this.Carregado = true; + }); + } + + btnBaixarClick() { + if (localStorage.getItem("Session") == "1") { + this.Baixar(); + return; + } + + localStorage.setItem("LastRouteBeforeLogin", "/detalhes/" + this.idsistemas); + this.router.navigate(['/criarconta']); + } + + Baixar() { + if (this.btnBaixar == "Adquirir") { + this.sistemasService.downloadSistema(this.FormDownload).then(resDownload => { + this.sistemasService.insertSistemaUsuario(this.FormDownload).then(resInsertSistema => { + if (this.Sistema.idplataformas == 6) { + this.btnBaixar = "Acessar"; + } else { + this.btnBaixar = "Baixar"; + } + + this.Adiquirido = true; + alert("Acesso liberado! Clique em " + this.btnBaixar + " para continuar."); + }); + }); + + return; + } + + if (this.btnBaixar == "Acessar") { + window.open(this.Sistema.nome_install, '_blank'); + return; + } + + if (this.btnBaixar == "Baixar") { + window.open( + environment.LinkProjeto + "/sistemas/" + this.idsistemas + "/versoes/" + this.Sistema.versaoatual + "/" + this.Sistema.nome_install, + '_blank' + ); + } + } + + ImageClick(event) { + const modal = document.getElementById("myModal"); + const modalImg = document.getElementById("img01") as HTMLImageElement; + const captionText = document.getElementById("caption"); + + const target = event.target as HTMLImageElement; + + if (!modal || !modalImg || !captionText || !target) { + return; + } + + modal.style.display = "block"; + modalImg.src = target.currentSrc || target.src; + captionText.innerHTML = target.alt || ""; + } + + btnFecharModal() { + const modal = document.getElementById("myModal"); + + if (modal) { + modal.style.display = "none"; + } + } +} \ No newline at end of file diff --git a/src/app/easy-ava/easy-ava.component.html b/src/app/easy-ava/easy-ava.component.html new file mode 100644 index 0000000..154f271 --- /dev/null +++ b/src/app/easy-ava/easy-ava.component.html @@ -0,0 +1,12 @@ +
+

EasyAVA

+ +
+

+

+ A resposta correta é: {{Resposta}} + +

+ + +
\ No newline at end of file diff --git a/src/app/easy-ava/easy-ava.component.scss b/src/app/easy-ava/easy-ava.component.scss new file mode 100644 index 0000000..c2fed74 --- /dev/null +++ b/src/app/easy-ava/easy-ava.component.scss @@ -0,0 +1,6 @@ +.Corpo { + text-align: center; + margin: auto; + color: #fff; + margin-top: 2em; +} \ No newline at end of file diff --git a/src/app/easy-ava/easy-ava.component.ts b/src/app/easy-ava/easy-ava.component.ts new file mode 100644 index 0000000..25bf800 --- /dev/null +++ b/src/app/easy-ava/easy-ava.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { EasyAVAService } from '../services/easy-ava.service'; + +@Component({ + selector: 'app-easy-ava', + templateUrl: './easy-ava.component.html', + styleUrls: ['./easy-ava.component.scss'] +}) +export class EasyAVAComponent implements OnInit { + + Questao: string = ""; + Resposta: string = ""; + + constructor( + private easyAvaService: EasyAVAService + ) { } + + ngOnInit() { + + } + + Procurar() { + this.easyAvaService.ProcurarResposta().then(resResposta => { + console.log(resResposta); + }) + } + +} diff --git a/src/app/edit-home/edit-home.component.html b/src/app/edit-home/edit-home.component.html new file mode 100644 index 0000000..d97bb26 --- /dev/null +++ b/src/app/edit-home/edit-home.component.html @@ -0,0 +1,273 @@ +
+ + +
+
+ Backoffice +

Painel administrativo

+

+ Gerencie as configurações principais da página inicial, identidade visual, + endereços do projeto, slider e conteúdo público. +

+
+
+ + +
+
+
+ Configurações +

Cabeçalho e endereços

+
+
+ +
+ + +
+
+
+ title +
+ +
+

Título do site

+

Nome exibido nas configurações principais da aplicação.

+
+
+ +
+ + + +
+
+ + +
+
+
+ public +
+ +
+

URL do projeto

+

Endereço público utilizado pelo site para montar links e recursos.

+
+
+ +
+ + + + + +
+
+ + +
+
+
+ api +
+ +
+

URL da API

+

Endereço usado pelo frontend para se comunicar com o servidor.

+
+
+ +
+ + + + + +
+
+ +
+
+ + +
+
+
+ Identidade visual +

Arquivos do site

+
+
+ +
+ + +
+
+ Logo +
+ +
+

Logo escrita

+

Arquivo principal exibido no cabeçalho e rodapé do site.

+ + + + +
+
+ + +
+
+ Favicon +
+ +
+

Favicon

+

Ícone exibido na aba do navegador.

+ + + + +
+
+ + +
+
+ Background +
+ +
+

Background

+

Imagem de fundo usada no site.

+ + + + +
+
+ +
+
+ + +
+ +
+
+ collections +
+ +
+ Slider +

Slides da página inicial

+

Cadastre, edite e visualize os banners exibidos na home.

+
+ +
+ + + +
+
+ +
+
+ article +
+ +
+ Conteúdo +

Notícias da página inicial

+

Gerencie os conteúdos publicados na área de notícias do site.

+
+ +
+ + + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/edit-home/edit-home.component.scss b/src/app/edit-home/edit-home.component.scss new file mode 100644 index 0000000..3c2599f --- /dev/null +++ b/src/app/edit-home/edit-home.component.scss @@ -0,0 +1,363 @@ +.edit-home-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* BASE CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2, +.shortcut-card h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary { + min-height: 44px; + border: none; + border-radius: 12px; + padding: 0 18px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + font-size: 13px; + font-weight: 900; + cursor: pointer; + transition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease; +} + +.btn-main { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-secondary { + background: #f1f5f9; + color: #334155; +} + +.btn-main:hover:not(:disabled), +.btn-secondary:hover:not(:disabled) { + transform: translateY(-1px); +} + +.btn-main:disabled, +.btn-secondary:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; +} + +/* SETTINGS */ + +.settings-grid { + display: grid; + gap: 18px; +} + +.setting-card { + display: grid; + grid-template-columns: 1fr 420px; + gap: 22px; + align-items: center; + padding: 20px; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.setting-info { + display: flex; + align-items: flex-start; + gap: 14px; +} + +.setting-icon { + width: 46px; + height: 46px; + flex: 0 0 auto; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.setting-icon .material-icons { + font-size: 24px; +} + +.setting-info h3, +.asset-body h3 { + margin: 0 0 6px 0; + color: #0f172a; + font-size: 18px; + line-height: 25px; + font-weight: 900; +} + +.setting-info p, +.asset-body p, +.shortcut-card p { + margin: 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.setting-control { + display: grid; + gap: 10px; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.confirm-check { + display: flex; + align-items: center; + gap: 8px; + color: #64748b; + font-size: 13px; + font-weight: 800; + cursor: pointer; +} + +.confirm-check input { + width: 18px; + height: 18px; +} + +/* ASSETS */ + +.assets-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.asset-card { + overflow: hidden; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.asset-preview { + height: 150px; + display: flex; + align-items: center; + justify-content: center; + background: + radial-gradient(circle at top right, rgba(7, 27, 99, 0.12), transparent 34%), + #ffffff; + border-bottom: 1px solid #e5e7eb; +} + +.asset-preview img { + max-width: 76%; + max-height: 90px; + object-fit: contain; +} + +.favicon-preview img { + max-width: 64px; + max-height: 64px; +} + +.background-preview img { + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + object-fit: cover; +} + +.asset-body { + padding: 20px; +} + +.file-label { + min-height: 42px; + margin-top: 16px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + border: 1px solid #dbe6ff; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.asset-btn { + width: 100%; + margin-top: 14px; +} + +/* SHORTCUTS */ + +.shortcut-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 22px; +} + +.shortcut-card { + display: grid; + gap: 16px; +} + +.shortcut-icon { + width: 54px; + height: 54px; + border-radius: 18px; + background: #f1f5ff; + color: #071b63; + display: flex; + align-items: center; + justify-content: center; +} + +.shortcut-icon .material-icons { + font-size: 28px; +} + +.shortcut-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .setting-card { + grid-template-columns: 1fr; + } + + .assets-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .shortcut-grid { + grid-template-columns: 1fr; + } + + .shortcut-actions { + flex-direction: column; + } + + .shortcut-actions button { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/edit-home/edit-home.component.ts b/src/app/edit-home/edit-home.component.ts new file mode 100644 index 0000000..151e065 --- /dev/null +++ b/src/app/edit-home/edit-home.component.ts @@ -0,0 +1,173 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { environment, FuncoesGlobais } from 'src/environments/environment'; +import { GeralService } from '../services/geral.service'; + +@Component({ + selector: 'app-edit-home', + templateUrl: './edit-home.component.html', + styleUrls: ['./edit-home.component.scss', './../app.component.scss'] +}) +export class EditHomeComponent implements OnInit { + + LinkProjeto: string = environment.LinkProjeto; + + Logo: File = null; + Favicon: File = null; + Background: File = null; + + CaminhoLogo: string = environment.LinkProjeto + "/assets/logo_escrito.png"; + CaminhoFavicon: string = "/favicon.ico"; + CaminhoBackground: string = "/assets/background.jpg"; + + TituloAnterior: string = ""; + Titulo: string = ""; + + APIUrl: string = ""; + APIUrlAnterior: string = ""; + APIUrlCheck: boolean = false; + + ProjetoUrl: string = ""; + ProjetoUrlAnterior: string = ""; + ProjetoUrlCheck: boolean = false; + + StringConfig: string = ""; + + constructor( + private router: Router, + private geralService: GeralService, + private funcoesGlobais: FuncoesGlobais, + ) { } + + ngOnInit() { + this.funcoesGlobais.CheckAdminRoute(); + + this.geralService.readEnderecos().then(resGeral => { + this.StringConfig = resGeral || ""; + + const partes = this.StringConfig.split(';'); + + this.ProjetoUrlAnterior = partes[0].split('=')[1] || ""; + this.ProjetoUrl = this.ProjetoUrlAnterior; + + this.APIUrlAnterior = partes[1].split('=')[1] || ""; + this.APIUrl = this.APIUrlAnterior; + + this.TituloAnterior = partes[2].split('=')[1] || ""; + this.Titulo = this.TituloAnterior; + }); + } + + Visualizar(Janela: string) { + this.router.navigate(['/dashboard/admin/' + Janela + '/visualizar']); + } + + Cadastrar(Janela: string) { + this.router.navigate(['/dashboard/admin/' + Janela]); + } + + onFileChangedLogo(event) { + this.CarregarPreviewArquivo(event, 'logo'); + } + + onFileChangedFavicon(event) { + this.CarregarPreviewArquivo(event, 'favicon'); + } + + onFileChangedBackground(event) { + this.CarregarPreviewArquivo(event, 'background'); + } + + CarregarPreviewArquivo(event, tipo: string) { + if (event.target.files && event.target.files[0]) { + const arquivo = event.target.files[0]; + + if (tipo === 'logo') { + this.Logo = arquivo; + } + + if (tipo === 'favicon') { + this.Favicon = arquivo; + } + + if (tipo === 'background') { + this.Background = arquivo; + } + + const reader = new FileReader(); + reader.readAsDataURL(arquivo); + + reader.onload = (event) => { + const result = event.target['result'].toString(); + + if (tipo === 'logo') { + this.CaminhoLogo = result; + } + + if (tipo === 'favicon') { + this.CaminhoFavicon = result; + } + + if (tipo === 'background') { + this.CaminhoBackground = result; + } + }; + } + } + + CopiarArquivos(Nome: string, Arquivo: File, Caminho: string) { + if (!Arquivo) { + alert("Selecione um arquivo antes de salvar."); + return; + } + + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("nome", Nome); + formData.append("arquivo", Arquivo); + formData.append("caminho", Caminho); + + req.open("POST", environment.ApiUrl + "/arquivos/copy"); + req.send(formData); + + req.onreadystatechange = () => { + if (req.readyState === 4) { + alert(Nome + " alterado com sucesso!"); + + if (Nome === 'logo_escrito.png') { + this.Logo = null; + } + + if (Nome === 'favicon.ico') { + this.Favicon = null; + } + + if (Nome === 'background.jpg') { + this.Background = null; + } + } + }; + } + + Editar(Item: string) { + this.StringConfig = `Dominio=${this.ProjetoUrl};API=${this.APIUrl};Título=${this.Titulo}`; + + const form = { + content: this.StringConfig + }; + + this.geralService.writeEnderecos(form).then(resEdit => { + if (resEdit == true) { + alert(Item + " alterado com sucesso!"); + + this.ProjetoUrlAnterior = this.ProjetoUrl; + this.APIUrlAnterior = this.APIUrl; + this.TituloAnterior = this.Titulo; + + this.ProjetoUrlCheck = false; + this.APIUrlCheck = false; + } + }); + } +} \ No newline at end of file diff --git a/src/app/home/home.component.html b/src/app/home/home.component.html new file mode 100644 index 0000000..21a6408 --- /dev/null +++ b/src/app/home/home.component.html @@ -0,0 +1,121 @@ +
+ + +
+
+ +
+
+ Zendion, INC. + +

+ Soluções digitais para negócios mais inteligentes. +

+ +

+ Sistemas, automações e tecnologia sob medida para simplificar processos, + conectar informações e impulsionar operações. +

+ + +
+ +
+ +
+
+ Slide Zendion +
+
+ +
+
+
+
+
+
+
+ + +
+
+ Nossas soluções + +

Sistemas

+ +

+ Conheça os sistemas disponíveis na plataforma Zendion. +

+
+ +
+
+
+ Ícone do sistema +
+ +

{{ Sistema.nome }}

+ +

{{ Sistema.descricao }}

+ + +
+
+
+ + +
+
+ Atualizações + +

Notícias

+ +

+ Acompanhe novidades, comunicados e informações da Zendion. +

+
+ +
+
+ +
+ Imagem da notícia +
+ +
+ Notícia + +

{{ Noticia.titulo }}

+ +
+
+
+
+
+ +
\ No newline at end of file diff --git a/src/app/home/home.component.scss b/src/app/home/home.component.scss new file mode 100644 index 0000000..cb0179b --- /dev/null +++ b/src/app/home/home.component.scss @@ -0,0 +1,478 @@ +.home-page { + min-height: 100vh; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.18), transparent 30%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); + color: #0f172a; +} + +/* ========================= + HERO +========================= */ + +.hero-section { + position: relative; + overflow: hidden; + padding: 64px 22px 52px 22px; +} + +.hero-background-glow { + position: absolute; + width: 420px; + height: 420px; + right: -140px; + top: -140px; + border-radius: 999px; + background: rgba(7, 27, 99, 0.16); + filter: blur(8px); +} + +.hero-content { + position: relative; + z-index: 1; + width: 100%; + max-width: 1180px; + margin: 0 auto; + display: grid; + grid-template-columns: 0.9fr 1.1fr; + align-items: center; + gap: 42px; +} + +.hero-text { + padding: 18px 0; +} + +.eyebrow { + display: inline-block; + margin-bottom: 12px; + color: #071b63; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.hero-text h1 { + margin: 0 0 18px 0; + max-width: 520px; + color: #0f172a; + font-size: 48px; + line-height: 58px; + font-weight: 900; + letter-spacing: -0.045em; +} + +.hero-text p { + margin: 0; + max-width: 520px; + color: #475569; + font-size: 17px; + line-height: 29px; +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 14px; + margin-top: 30px; +} + +.btn-hero-primary, +.btn-hero-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 46px; + padding: 0 22px; + border-radius: 12px; + font-size: 14px; + font-weight: 800; + text-decoration: none; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-hero-primary { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 14px 28px rgba(7, 27, 99, 0.24); +} + +.btn-hero-secondary { + background: #ffffff; + color: #071b63; + border: 1px solid #d7deea; +} + +.btn-hero-primary:hover, +.btn-hero-secondary:hover { + transform: translateY(-1px); + text-decoration: none; +} + +.hero-slider-card { + position: relative; + background: #ffffff; + border-radius: 24px; + padding: 14px; + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.16); + border: 1px solid rgba(148, 163, 184, 0.22); + overflow: hidden; +} + +.hero-swiper { + width: 100%; + height: 430px; + border-radius: 18px; + overflow: hidden; + display: block; +} + +.slider-image { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +/* Swiper buttons */ +:host ::ng-deep .swiper-button-next, +:host ::ng-deep .swiper-button-prev { + color: #ffffff; + width: 42px; + height: 42px; + border-radius: 999px; + background: rgba(7, 27, 99, 0.78); + backdrop-filter: blur(6px); +} + +:host ::ng-deep .swiper-button-next::after, +:host ::ng-deep .swiper-button-prev::after { + font-size: 16px; + font-weight: 800; +} + +:host ::ng-deep .swiper-pagination-bullet { + background: #ffffff; + opacity: 0.65; +} + +:host ::ng-deep .swiper-pagination-bullet-active { + background: #071b63; + opacity: 1; +} + +/* ========================= + SECTIONS +========================= */ + +.systems-section, +.news-section { + width: 100%; + max-width: 1180px; + margin: 0 auto; + padding: 48px 22px; +} + +.section-header { + text-align: center; + margin-bottom: 34px; +} + +.section-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.section-header p { + margin: 0 auto; + max-width: 620px; + color: #64748b; + font-size: 16px; + line-height: 26px; +} + +/* ========================= + SISTEMAS +========================= */ + +.systems-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 22px; +} + +.system-card { + position: relative; + overflow: hidden; + min-height: 310px; + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 28px; + border-radius: 22px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.system-card::before { + content: ""; + position: absolute; + width: 180px; + height: 180px; + right: -80px; + top: -80px; + border-radius: 999px; + background: rgba(7, 27, 99, 0.08); +} + +.system-card:hover { + transform: translateY(-4px); + box-shadow: 0 24px 60px rgba(15, 23, 42, 0.16); + border-color: rgba(7, 27, 99, 0.22); +} + +.system-icon-wrapper { + width: 74px; + height: 74px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 22px; + border-radius: 18px; + background: #f1f5ff; + border: 1px solid #dbe6ff; +} + +.system-icon { + width: 48px; + height: 48px; + object-fit: contain; +} + +.system-card h3 { + margin: 0 0 12px 0; + color: #0f172a; + font-size: 21px; + line-height: 28px; + font-weight: 850; +} + +.system-card p { + flex: 1; + margin: 0 0 24px 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.system-btn { + width: 100%; + min-height: 44px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 14px; + font-weight: 800; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.system-btn:hover { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.26); +} + +/* ========================= + NOTÍCIAS +========================= */ + +.news-list { + display: grid; + gap: 28px; +} + +.news-card { + display: grid; + grid-template-columns: 0.92fr 1.08fr; + align-items: stretch; + gap: 0; + overflow: hidden; + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.news-card.reverse { + grid-template-columns: 1.08fr 0.92fr; +} + +.news-card.reverse .news-image-wrapper { + order: 2; +} + +.news-card.reverse .news-content { + order: 1; +} + +.news-image-wrapper { + min-height: 320px; + background: #e5e7eb; +} + +.news-image { + width: 100%; + height: 100%; + min-height: 320px; + object-fit: cover; + display: block; +} + +.news-content { + padding: 36px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.news-label { + display: inline-block; + width: fit-content; + margin-bottom: 14px; + padding: 7px 11px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 12px; + line-height: 16px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.news-content h3 { + margin: 0 0 16px 0; + color: #0f172a; + font-size: 28px; + line-height: 36px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.news-description { + color: #475569; + font-size: 15px; + line-height: 25px; +} + +.news-description p { + margin-top: 0; +} + +.news-description p:last-child { + margin-bottom: 0; +} + +/* ========================= + RESPONSIVO +========================= */ + +@media (max-width: 980px) { + .hero-content { + grid-template-columns: 1fr; + } + + .hero-text { + text-align: center; + } + + .hero-text h1, + .hero-text p { + margin-left: auto; + margin-right: auto; + } + + .hero-actions { + justify-content: center; + } + + .systems-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .news-card, + .news-card.reverse { + grid-template-columns: 1fr; + } + + .news-card.reverse .news-image-wrapper, + .news-card.reverse .news-content { + order: unset; + } +} + +@media (max-width: 680px) { + .hero-section { + padding: 42px 14px 34px 14px; + } + + .hero-text h1 { + font-size: 34px; + line-height: 42px; + } + + .hero-text p { + font-size: 15px; + line-height: 25px; + } + + .hero-swiper { + height: 280px; + } + + .systems-section, + .news-section { + padding: 38px 14px; + } + + .systems-grid { + grid-template-columns: 1fr; + } + + .section-header h2 { + font-size: 28px; + line-height: 36px; + } + + .news-content { + padding: 26px; + } + + .news-content h3 { + font-size: 24px; + line-height: 32px; + } + + .news-image, + .news-image-wrapper { + min-height: 230px; + } + + .hero-actions { + flex-direction: column; + } + + .btn-hero-primary, + .btn-hero-secondary { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts new file mode 100644 index 0000000..aaca710 --- /dev/null +++ b/src/app/home/home.component.ts @@ -0,0 +1,67 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { Sistemas } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { environment } from 'src/environments/environment'; +import { Slides } from '../models/sliderModel'; +import { SliderService } from '../services/slider.service'; +import { Noticias } from '../models/noticiasModel'; +import { NoticiasService } from '../services/noticias.service'; +import { SwiperOptions } from 'swiper'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'] +}) +export class HomeComponent implements OnInit { + + config: SwiperOptions = { + pagination: { + el: '.swiper-pagination', + clickable: true + }, + navigation: { + nextEl: '.swiper-button-next', + prevEl: '.swiper-button-prev' + }, + spaceBetween: 24, + loop: true, + speed: 700, + autoplay: { + delay: 8000, + disableOnInteraction: false + } + }; + + ListaDeSlides: Slides[] = []; + ListaDeSistemas: Sistemas[] = []; + ListaDeNoticias: Noticias[] = []; + + LinkProjeto: string = environment.LinkProjeto; + + constructor( + private sistemasService: SistemasService, + private router: Router, + private sliderService: SliderService, + private noticiasService: NoticiasService + ) { } + + ngOnInit() { + this.sliderService.getSlidesEn().then(resSlides => { + this.ListaDeSlides = resSlides || []; + }); + + this.sistemasService.getSistemasEn().then(resSistemas => { + this.ListaDeSistemas = resSistemas || []; + }); + + this.noticiasService.getNoticiasEn().then(resNoticias => { + this.ListaDeNoticias = resNoticias || []; + }); + } + + AbrirDetalhesSistema(Sistema: Sistemas) { + this.router.navigate(['/detalhes/' + Sistema.idsistemas]); + } +} \ No newline at end of file diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html new file mode 100644 index 0000000..e0074b9 --- /dev/null +++ b/src/app/login/login.component.html @@ -0,0 +1,160 @@ + \ No newline at end of file diff --git a/src/app/login/login.component.scss b/src/app/login/login.component.scss new file mode 100644 index 0000000..99e0dee --- /dev/null +++ b/src/app/login/login.component.scss @@ -0,0 +1,337 @@ +.login-page { + min-height: calc(100vh - 80px); + display: flex; + align-items: center; + justify-content: center; + padding: 48px 18px; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.14), transparent 34%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); +} + +.login-shell { + width: 100%; + max-width: 980px; + display: grid; + grid-template-columns: 0.95fr 1.05fr; + background: #ffffff; + border-radius: 24px; + overflow: hidden; + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.16); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.login-brand-panel { + position: relative; + min-height: 560px; + display: flex; + align-items: flex-end; + padding: 42px; + background: + linear-gradient(145deg, rgba(7, 27, 99, 0.96), rgba(18, 47, 132, 0.94)); + color: #ffffff; + overflow: hidden; +} + +.login-brand-panel::before { + content: ""; + position: absolute; + width: 340px; + height: 340px; + right: -120px; + top: -100px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); +} + +.login-brand-panel::after { + content: ""; + position: absolute; + width: 220px; + height: 220px; + left: -80px; + bottom: -70px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.08); +} + +.brand-content { + position: relative; + z-index: 1; +} + +.brand-logo { + height: 54px; + max-width: 240px; + object-fit: contain; + display: block; + margin-bottom: 34px; + filter: brightness(0) invert(1); +} + +.brand-content h1 { + margin: 0 0 14px 0; + font-size: 34px; + line-height: 42px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.brand-content p { + max-width: 390px; + margin: 0; + color: #dbeafe; + font-size: 16px; + line-height: 27px; +} + +.brand-badges { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 28px; +} + +.brand-badges span { + display: inline-flex; + align-items: center; + padding: 8px 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.13); + color: #ffffff; + font-size: 12px; + font-weight: 700; + backdrop-filter: blur(8px); +} + +.login-card { + display: flex; + flex-direction: column; + justify-content: center; + padding: 44px 48px; +} + +.login-header { + margin-bottom: 28px; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.login-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 30px; + line-height: 38px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.login-header p { + margin: 0; + color: #64748b; + font-size: 15px; + line-height: 24px; +} + +.login-body { + width: 100%; +} + +.login-form { + display: grid; + gap: 16px; +} + +.form-group { + text-align: left; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 700; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; + box-sizing: border-box; +} + +.form-control::placeholder { + color: #94a3b8; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); + background-color: #ffffff; +} + +.field-hint { + display: block; + margin-top: 2px; + color: #64748b; + font-size: 12px; + line-height: 18px; + text-align: left; +} + +.btn-login { + width: 100%; + height: 48px; + margin-top: 22px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 15px; + font-weight: 800; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.22); + transition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease; +} + +.btn-login:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.28); +} + +.btn-login:active:not(:disabled) { + transform: translateY(0); +} + +.btn-login:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; +} + +.login-footer { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px 16px; + margin-top: 26px; + padding-top: 22px; + border-top: 1px solid #e5e7eb; +} + +.login-footer a { + color: #071b63; + font-size: 14px; + font-weight: 700; + text-decoration: none; +} + +.login-footer a:hover { + text-decoration: underline; +} + +.login-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 12px; + background: #fef2f2; + border: 1px solid #fecaca; + text-align: left; +} + +.login-message small { + display: block; + color: #b91c1c; + font-size: 13px; + line-height: 20px; + font-weight: 600; +} + +/* Estados de erro herdados do seu TS */ +.Danger { + border-color: #ef4444 !important; + background-color: #fff7f7; +} + +.Danger:focus { + border-color: #ef4444 !important; + box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.12); +} + +.Normal { + border-color: #d7deea; +} + +@media (max-width: 860px) { + .login-shell { + grid-template-columns: 1fr; + max-width: 560px; + } + + .login-brand-panel { + min-height: auto; + padding: 30px; + align-items: flex-start; + } + + .brand-logo { + height: 44px; + margin-bottom: 22px; + } + + .brand-content h1 { + font-size: 28px; + line-height: 36px; + } + + .login-card { + padding: 34px 26px; + } +} + +@media (max-width: 480px) { + .login-page { + padding: 22px 12px; + } + + .login-shell { + border-radius: 18px; + } + + .login-brand-panel { + padding: 24px; + } + + .brand-badges { + display: none; + } + + .login-card { + padding: 28px 20px; + } + + .login-header h2 { + font-size: 25px; + line-height: 32px; + } + + .login-footer { + grid-template-columns: 1fr; + text-align: center; + } +} \ No newline at end of file diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts new file mode 100644 index 0000000..cd8d60e --- /dev/null +++ b/src/app/login/login.component.ts @@ -0,0 +1,359 @@ +import { Component, OnInit } from '@angular/core'; +import { UsuariosService } from '../services/usuarios.service'; +import { Login, Usuarios, Email, RecuperarSenha } from '../models/usuariosModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { Modos } from '../models/variaveisModel'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent implements OnInit { + + LoginModel: Login = new Login; + LoginError = false; + MenssagemForm: string; + BotaoText: string; + TituloJanela: string; + JanelaModo: Modos = new Modos(); + ListaDeUsuarios: Usuarios[]; + FormEmail: Email = new Email(); + FormTrocaSenha: RecuperarSenha = new RecuperarSenha(); + DesabilitaBotao: boolean = false; + ListaTrocaSenha: RecuperarSenha[]; + LinkProjeto: string = environment.LinkProjeto; + + constructor( + private usuariosSerive: UsuariosService, + private router: Router, + private route: ActivatedRoute, + ) { } + + ngOnInit() { + if (this.router.url.includes('esqueci')) { + this.usuariosSerive.getUsuarios().then(resUsuarios => { + this.ListaDeUsuarios = resUsuarios; + }) + this.usuariosSerive.getTrocasenha().then(resTrocasenha => { + this.ListaTrocaSenha = resTrocasenha; + }) + this.BotaoText = "Enviar e-mail"; + this.TituloJanela = "Esqueci a senha"; + this.JanelaModo.Cadastro = true; + } + else if (this.router.url.includes('trocar')) { + this.usuariosSerive.getTrocasenhaByTag(this.route.snapshot.params['tag']).then(resTag => { + if (resTag.length > 0) { + this.FormTrocaSenha = resTag[0]; + this.usuariosSerive.setExpirado(resTag[0]).then(resExpirado => { + console.log("certo"); + }) + } + else { + this.MenssagemForm = "Este link de redefinição de senha expirou"; + this.DesabilitaBotao = true; + } + }) + this.BotaoText = "Alterar senha"; + this.TituloJanela = "Digite a nova senha"; + this.JanelaModo.Editar = true; + } + else { + this.BotaoText = "Entrar"; + this.TituloJanela = "Login"; + this.JanelaModo.Visualizar = true; + } + } + + btnEntrarClick() { + if (this.BotaoText == "Voltar") { + this.router.navigate(['login']); + return; + } + if (this.JanelaModo.Visualizar) { // entrar + this.usuariosSerive.AuthUser(this.LoginModel).then(resLogin => { + if (resLogin['response'].length > 0) { + if (resLogin['response'][0]['habilitado'] == 0) { + this.MenssagemForm = "Usuário ainda não ativado! Acesse a caixa de entrada de seu e-mail e ative sua conta para entrar!"; + this.LoginError = true; + return; + } + localStorage.setItem("UserID", resLogin['response'][0]['idusuarios']); + localStorage.setItem("UserName", resLogin['response'][0]['nome']); + localStorage.setItem("Role", resLogin['response'][0]['idtiposdeusuario']); + localStorage.setItem("Session", "1"); + + if (localStorage.getItem("Role") == "1" || localStorage.getItem("Role") == "2") { + if (localStorage.getItem("LastRouteBeforeLogin")) { + this.router.navigate([localStorage.getItem("LastRouteBeforeLogin")]); + localStorage.removeItem("LastRouteBeforeLogin"); + } + else { + this.router.navigate(['dashboard/cliente']); + } + } + } + else { + this.MenssagemForm = "Usuário ou senha incorretos"; + this.LoginError = true; + } + }) + } + else if (this.JanelaModo.Cadastro) { // enviar email + let EmailCorreto = false; + let UsuarioCorreto = false; + let idusuariosU: number; + let idusuariosE: number; + let nomeUsuario: string; + for (let i = 0; i < this.ListaDeUsuarios.length; i++) { + if (this.LoginModel.email == this.ListaDeUsuarios[i].email) { + idusuariosU = this.ListaDeUsuarios[i].idusuarios; + EmailCorreto = true; + nomeUsuario = this.ListaDeUsuarios[i].nome; + } + if (this.LoginModel.usuario == this.ListaDeUsuarios[i].usuario) { + idusuariosE = this.ListaDeUsuarios[i].idusuarios; + UsuarioCorreto = true; + } + } + if (EmailCorreto && UsuarioCorreto && (idusuariosE == idusuariosU)) { + for (let i = 0; i < this.ListaTrocaSenha.length; i++) { + if (this.ListaTrocaSenha[i].idusuarios == idusuariosE) { + this.MenssagemForm = "Este usuário já tem um link de redefinição de senha pendente"; + this.BotaoText = "Voltar"; + return; + } + } + this.FormTrocaSenha.idusuarios = idusuariosE; + this.FormEmail.Para = this.LoginModel.email; + this.FormEmail.Assunto = "Redefinição de senha Zendion, Inc."; + this.FormEmail.Conteudo = this.MensagemEmail(nomeUsuario); + this.usuariosSerive.insertTrocasenha(this.FormTrocaSenha).then(resTrocasenha => { + if (resTrocasenha['status'] == 200) { + this.usuariosSerive.EnviarEmail(this.FormEmail).then(resEmail => { + if (resEmail != null && resEmail['sucesso'] == true) { + this.MenssagemForm = "Link de redefinição de senha enviado com sucesso!"; + this.BotaoText = "Voltar"; + } + else { + this.MenssagemForm = "Erro ao enviar e-mail"; + this.LoginError = true; + this.BotaoText = "Voltar"; + } + }) + } + else { + this.MenssagemForm = "Erro ao gerar link de redefinição de senha"; + this.LoginError = true; + this.BotaoText = "Voltar"; + } + }) + } + else { + this.LoginError = true; + if (!EmailCorreto) + this.MenssagemForm = "E-mail incorreto"; + if (!UsuarioCorreto) + this.MenssagemForm = "Usuário incorreto"; + if (!EmailCorreto && !UsuarioCorreto) + this.MenssagemForm = "Usuário e E-mail incorretos"; + if (idusuariosE != idusuariosU) + this.MenssagemForm = "Usuário ou E-mail incorreto"; + } + } + else if (this.JanelaModo.Editar) { // inserir nova senha + if (this.LoginModel.senha != this.LoginModel.novasenha) { + this.LoginError = true; + this.MenssagemForm = "As senhas digitadas não são iguais"; + return; + } + let formUsuario: Usuarios = new Usuarios(); + formUsuario.idusuarios = this.FormTrocaSenha.idusuarios; + formUsuario.senha = this.LoginModel.senha; + this.usuariosSerive.trocaSenha(formUsuario).then(resUpdate => { + if (resUpdate['status'] == 200) { + this.MenssagemForm = "Senha alterada com sucesso"; + } + else { + this.MenssagemForm = "Erro ao alterar senha"; + } + this.BotaoText = "Voltar"; + }) + } + } + + MensagemEmail(nomeUsuario: string) { + let Mensagem: string; + + const nome = nomeUsuario || 'usuário'; + + // Melhor que Math.random para token simples no frontend + const array = new Uint32Array(4); + window.crypto.getRandomValues(array); + + const Tag = Array.from(array) + .map(x => x.toString(16)) + .join(''); + + this.FormTrocaSenha.tag = Tag; + + const linkTrocaSenha = `${this.LinkProjeto}/login/trocar/${Tag}`; + + Mensagem = ` + + + + + + Redefinição de senha Zendion, INC. + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Zendion, INC. +
+

+ Redefinição de senha +

+
+

+ Olá, ${nome}! +

+ +

+ Recebemos uma solicitação para redefinir a senha da sua conta na Zendion, INC.. +

+ +

+ Para criar uma nova senha, clique no botão abaixo: +

+
+ + Redefinir minha senha + +
+ + + + +
+

+ Este link é válido por 24 horas. Após esse período, será necessário solicitar uma nova redefinição de senha. +

+
+
+

+ Se o botão não funcionar, copie e cole este link no navegador: +

+ +

+ + ${linkTrocaSenha} + +

+
+ + + + +
+

+ Se você não solicitou a redefinição de senha, ignore este e-mail. Sua senha atual continuará a mesma. +

+
+
+

+ Atenciosamente,
+ Equipe Zendion, INC. +

+
+

+ Zendion, INC. +

+ +

+ ${environment.telefoneContato}
+ ${environment.emailContato}
+ + ${this.LinkProjeto} + +

+
+ + + + + + +
+

+ Este é um e-mail automático. Por favor, não responda esta mensagem. +

+
+ +
+ + + + `; + + return Mensagem; + } + +} diff --git a/src/app/models/agrobaseModel.ts b/src/app/models/agrobaseModel.ts new file mode 100644 index 0000000..9eeea36 --- /dev/null +++ b/src/app/models/agrobaseModel.ts @@ -0,0 +1,27 @@ +export class AgrobaseVersionFileModel { + id: number; + Diretorio: string; + Arquivo: string; + Extensao: string; + Versao: string; + ArquivoDownload: string; + TipoArquivo: TiposArquivos; +} + +export enum TiposArquivos { + ModeloIA_StreetDetector = 0, + ModeloIA_WeedDetector = 1, + ParametrosModulo_ATU = 2, + ParametrosModulo_MVD = 3, + ParametrosModulo_SEN = 4, + ParametrosModulo_KNT = 5, + PinoutModulo_ATU = 6, + PinoutModulo_SEN = 7, + Script_StreetDetector = 8, + Script_WeedDetector = 9, + Script_GreenDetector = 10, + Script_MapLoad = 11, + Script_MapFollow = 12, + Script_GpsViewer = 13, + ArquivoModelo3D = 14, +} \ No newline at end of file diff --git a/src/app/models/bingoModel.ts b/src/app/models/bingoModel.ts new file mode 100644 index 0000000..29b8da0 --- /dev/null +++ b/src/app/models/bingoModel.ts @@ -0,0 +1,27 @@ +export class BingoSorteiosModel { + idbingosorteios: number = 0; + descricao: string = ""; + rodada: number = 1; + data_sorteio: string; + n_max: number = 75; + participantes_max: number = 0; + realizado: boolean = false; + Cartelas: BingoCartelasModel[]; + VerCartelas: boolean = false; +} + +export class BingoCartelasModel { + canhoto: number = 0; + idbingosorteios: number = 0; + numeros: string = ""; + nome: string = ""; + endereco: string = ""; + telefone: string = ""; + bingo: boolean = false; + cinquina1: boolean = false; + cinquina2: boolean = false; + cinquina3: boolean = false; + Valida: boolean = true; + Editando: boolean = false; + Acertos: number = 1; +} \ No newline at end of file diff --git a/src/app/models/dashboardModel.ts b/src/app/models/dashboardModel.ts new file mode 100644 index 0000000..4636c9b --- /dev/null +++ b/src/app/models/dashboardModel.ts @@ -0,0 +1,10 @@ +export class MenuItem { + index: number; + texto: string; + link: string; + havesub: boolean; + dropicon: string; + icon: string; + issub: boolean; + sub: MenuItem[]; +} \ No newline at end of file diff --git a/src/app/models/noticiasModel.ts b/src/app/models/noticiasModel.ts new file mode 100644 index 0000000..3d673c3 --- /dev/null +++ b/src/app/models/noticiasModel.ts @@ -0,0 +1,15 @@ +export class Noticias { + idnoticias: number; + titulo: string; + descricao: string; + habilitado: boolean; + link: string; +} + +export class NoticiasList { + idnoticias: number; + titulo: string; + descricao: string; + habilitado: string; + link: string; +} \ No newline at end of file diff --git a/src/app/models/orionModel.ts b/src/app/models/orionModel.ts new file mode 100644 index 0000000..b480922 --- /dev/null +++ b/src/app/models/orionModel.ts @@ -0,0 +1,92 @@ +export class OrionLogsModel { + dataLog: Date; + nome: string; + coordenadas: string; + perfil: string; + log: string; + logObj: OrionLogsDetalhesModel; +} + +export class OrionLogsDetalhesModel { + data: Date; + firmwareVersao: number; + robotNs: number; + modelo: string; + versao: string; + cpf: string; + usuario: string; + perfil: string; + camera: string; + servico: OrionLogServicoModel; + odometroTotal: number; + odometroConectado: number; + odometroMotores: number; + odometroMotoresParcial: number; + latitude: number; + longitude: number; + altitude: number; + tempoTotal: number; + tempoConectado: number; + sensores: OrionLogSensorModel[]; + portaCOM: string; + baudRate: number; + conectado: boolean; + distancia: number; + + HoraInicio: string; + HoraFim: string; + Duracao: string; + Coordenadas: string; + Localizacao: string; +} + +export class OrionLogServicoModel { + Nome: string; + Cidade: string; + Responsavel: string; + Servico: string; + Path: string; + DataCadastro: Date; +} + +export class OrionLogSensorModel { + sensor: number; + descricao: string; + minimo: number; + maximo: number; + media: number; + moda: number; + mediana: number; + lista: number[]; +} + +export class GeoCoordenadasResponseModel { + data: GeoCoordenadasModel[]; +} + +export class GeoCoordenadasModel { + latitude: number; + longitude: number; + type: string; + distance: number; + name: string; + number: string; + postal_code: string; + street: string; + confidence: number; + region: string; + region_code: string; + county: string; + lacality: string; + administrative_area: string; + neighborhood: string; + country: string; + country_code: string; + continent: string; + label: string; +} + +export class LogAgrupado { + key: string; + value: OrionLogsDetalhesModel[]; +} \ No newline at end of file diff --git a/src/app/models/produtosModel.ts b/src/app/models/produtosModel.ts new file mode 100644 index 0000000..3e43f1c --- /dev/null +++ b/src/app/models/produtosModel.ts @@ -0,0 +1,10 @@ +export class ProdutosModel { + idprodutos: number; + idsistemas: number; + idtiposlicenca: number; + valor: number; + ativado: boolean; + descricao: string; + vendas: number; + compensados: number; +} \ No newline at end of file diff --git a/src/app/models/sistemasModel.ts b/src/app/models/sistemasModel.ts new file mode 100644 index 0000000..5194ac6 --- /dev/null +++ b/src/app/models/sistemasModel.ts @@ -0,0 +1,90 @@ +export class Sistemas { + idsistemas: number; + nome: string; + descricao: string; + versaoatual: string; + habilitado: boolean; + downloads: number; + idtiposdesistema: number; + idplataformas: number; + nome_install: string; + notasdeatualizacao: string; + idtiposlicenca: number; + + insert_date: Date; +} + +export class SistemasLista { + idsistemas: number; + nome: string; + descricao: string; + versaoatual: string; + habilitado: boolean; + downloads: number; + idtiposdesistema: number; + tiposdesistema: string; + idplataformas: number; + plataforma: string; + nome_install: string; + notasdeatualizacao: string; + idtiposlicenca: number; + licenca: string; + custo: number; + versoes: string[]; + mdownloads: string[]; + + tiposlicenca: string; + insert_date: Date; + update_date: Date; +} + +export class TiposDeLicenca { + idtiposlicenca: number; + descricao: string; +} + + +export class TiposDeSistema { + idtiposdesistema: number; + descricao: string; +} + +export class Plataformas { + idplataformas: number; + descricao: string; +} + +export class Download { + idsistemas: number; + idusuarios: number; +} + +export class Chaves { + idchaves: number; + licenca: string; + data_criacao: Date; + data_validade: Date; + idusuarios: number; + usada: boolean; + idsistemas: number; +} + +export class ListChaves { + idchaves: number; + Chave: string; + DataCriacao: Date; + DataValidade: Date; + Status: string; + Ativada: string; +} + +export class SistemasDetalhes { + idsistemasdetalhes: number; + idsistemas: number; + descricao: string; + ordem: number; + habilitado: boolean; + imagem: string; + botao: string; + Arquivo: File; +} \ No newline at end of file diff --git a/src/app/models/sliderModel.ts b/src/app/models/sliderModel.ts new file mode 100644 index 0000000..4a293b5 --- /dev/null +++ b/src/app/models/sliderModel.ts @@ -0,0 +1,13 @@ +export class Slides { + idslides: number; + descricao: string; + habilitado: boolean; + link: string; +} + +export class SlidesList { + idslides: number; + descricao: string; + habilitado: string; + link: string; +} \ No newline at end of file diff --git a/src/app/models/usuariosModel.ts b/src/app/models/usuariosModel.ts new file mode 100644 index 0000000..c7f8e58 --- /dev/null +++ b/src/app/models/usuariosModel.ts @@ -0,0 +1,46 @@ +export class Usuarios { + idusuarios: number; + nome: string; + usuario: string; + senha: string; + data_cadastro: Date; + cpf: string; + habilitado: boolean; + email: string; + idtiposdeusuario: number; + } + +export class Login { + usuario: string; + senha: string; + email: string; + novasenha: string; +} + +export class TiposDeUsuario { + idtiposdeusuario: string; + descricao: string; +} + +export class Email { + Para: string; + Assunto: string; + Conteudo: string; +} + +export class SistemasDoUsuario { + idsistemas: number; + nome: string; + descricao: string; + data_download: Date; + idusuarios: number; + licensasValidas: number; + gratis: boolean; +} + +export class RecuperarSenha { + idtrocasenha: number; + idusuarios: number; + tag: string; + usada: boolean; +} \ No newline at end of file diff --git a/src/app/models/variaveisModel.ts b/src/app/models/variaveisModel.ts new file mode 100644 index 0000000..e7c2c76 --- /dev/null +++ b/src/app/models/variaveisModel.ts @@ -0,0 +1,10 @@ +export class Variaveis { + LinkAPI: string; + LinkProjeto: string; +} + +export class Modos { + Cadastro: boolean = false; + Editar: boolean = false; + Visualizar: boolean = false; +} \ No newline at end of file diff --git a/src/app/noticias/noticias.component.html b/src/app/noticias/noticias.component.html new file mode 100644 index 0000000..b226c17 --- /dev/null +++ b/src/app/noticias/noticias.component.html @@ -0,0 +1,237 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie as notícias exibidas na página inicial do site. +

+
+ +
+ +
+
+ + +
+ +
+
+ Conteúdo editorial +

{{ JanelaModo.Cadastro ? 'Cadastrar notícia' : 'Editar notícia' }}

+
+ + +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + + + + Recomendado: imagem horizontal em boa resolução, preferencialmente JPG. + +
+
+ +
+ Prévia da notícia + +
+
+ Prévia da notícia +
+ +
+ {{ FormNoticias.habilitado ? 'Publicada' : 'Oculta' }} + +

{{ FormNoticias.titulo || 'Título da notícia' }}

+ +
+
+
+
+
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ article +
+ +
+ Total de notícias + {{ ListaNoticias?.length || 0 }} +
+
+ +
+
+ visibility +
+ +
+ Habilitadas + {{ TotalHabilitadas }} +
+
+ +
+
+ visibility_off +
+ +
+ Desabilitadas + {{ TotalDesabilitadas }} +
+
+
+ +
+
+
+ Notícias +

Notícias cadastradas

+
+
+ +
+ +
+ +
+ Imagem da notícia +
+ +
+
+ #{{ Noticia.idnoticias }} + + + {{ Noticia.habilitado ? 'Habilitada' : 'Desabilitada' }} + +
+ +

{{ Noticia.titulo || 'Notícia sem título' }}

+ +
+ + + +
+ + + +
+
+ +
+ +
+ +
+
+ article +
+ +

Nenhuma notícia cadastrada

+ +

+ Cadastre a primeira notícia para exibir conteúdo na página inicial. +

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/noticias/noticias.component.scss b/src/app/noticias/noticias.component.scss new file mode 100644 index 0000000..0b948be --- /dev/null +++ b/src/app/noticias/noticias.component.scss @@ -0,0 +1,660 @@ +.news-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-card { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease, opacity 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: 1fr; + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.textarea-control { + min-height: 250px; + padding: 14px; + resize: vertical; + line-height: 23px; +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.file-label { + min-height: 42px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + border: 1px solid #dbe6ff; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.field-hint { + display: block; + margin-top: 8px; + color: #64748b; + font-size: 12px; + font-weight: 700; +} + +/* PREVIEW */ + +.news-preview-section { + margin-top: 22px; +} + +.news-preview-section > span { + display: block; + margin-bottom: 10px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.news-preview-card { + display: grid; + grid-template-columns: 0.9fr 1.1fr; + overflow: hidden; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.news-preview-image { + min-height: 300px; + background: #e5e7eb; +} + +.news-preview-image img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.news-preview-content { + padding: 24px; +} + +.news-preview-content small { + display: inline-flex; + margin-bottom: 12px; + padding: 6px 10px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; +} + +.news-preview-content h3 { + margin: 0 0 12px 0; + color: #0f172a; + font-size: 24px; + line-height: 32px; + font-weight: 900; +} + +.news-preview-description { + color: #475569; + font-size: 14px; + line-height: 23px; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* NEWS GRID */ + +.news-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.news-card { + position: relative; + overflow: hidden; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.news-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + z-index: 2; + background: #94a3b8; +} + +.news-card:hover { + transform: translateY(-3px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.news-enabled { + border-color: rgba(22, 163, 74, 0.26); +} + +.news-enabled::before { + background: #16a34a; +} + +.news-disabled { + border-color: rgba(220, 38, 38, 0.22); +} + +.news-disabled::before { + background: #dc2626; +} + +.news-image-wrapper { + height: 220px; + background: #e5e7eb; + overflow: hidden; +} + +.news-image { + width: 100%; + height: 100%; + object-fit: cover; +} + +.news-card-body { + padding: 18px; +} + +.news-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 14px; +} + +.id-pill { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 10px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 12px; + font-weight: 900; +} + +.status-badge { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-badge.enabled { + background: #dcfce7; + color: #166534; +} + +.status-badge.disabled { + background: #fee2e2; + color: #991b1b; +} + +.news-card h3 { + margin: 0 0 12px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; +} + +.news-description { + max-height: 96px; + overflow: hidden; + color: #64748b; + font-size: 14px; + line-height: 23px; + margin-bottom: 14px; +} + +.news-link { + display: flex; + align-items: center; + gap: 7px; + margin-bottom: 16px; + color: #071b63; + font-size: 12px; + font-weight: 800; + min-width: 0; +} + +.news-link .material-icons { + font-size: 18px; + flex: 0 0 auto; +} + +.news-link span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.news-actions { + display: flex; + gap: 10px; +} + +.btn-card { + min-height: 40px; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.edit { + background: #071b63; +} + +.btn-card.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1000px) { + .summary-grid { + grid-template-columns: 1fr; + } + + .news-grid { + grid-template-columns: 1fr; + } + + .news-preview-card { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } + + .news-preview-image { + min-height: 220px; + } +} + +@media (max-width: 520px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .news-actions { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/app/noticias/noticias.component.ts b/src/app/noticias/noticias.component.ts new file mode 100644 index 0000000..1315768 --- /dev/null +++ b/src/app/noticias/noticias.component.ts @@ -0,0 +1,219 @@ +import { Component, OnInit } from '@angular/core'; +import { Noticias, NoticiasList } from '../models/noticiasModel'; +import { Modos } from '../models/variaveisModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { NoticiasService } from '../services/noticias.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-noticias', + templateUrl: './noticias.component.html', + styleUrls: ['./noticias.component.scss', './../app.component.scss'] +}) +export class NoticiasComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + FormNoticias: Noticias = new Noticias(); + ListaNoticias: NoticiasList[] = []; + + JanelaModo: Modos = new Modos(); + + Imagem: File = null; + CaminhoImagem: string = null; + + Rota: string = "noticia"; + + constructor( + private router: Router, + private route: ActivatedRoute, + private noticiasService: NoticiasService + ) { } + + ngOnInit() { + this.CheckRouteMode(); + } + + get TotalHabilitadas(): number { + return (this.ListaNoticias || []).filter(noticia => noticia.habilitado).length; + } + + get TotalDesabilitadas(): number { + return (this.ListaNoticias || []).filter(noticia => !noticia.habilitado).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.JanelaModo.Visualizar = true; + this.TituloJanela = "Visualizar notícias"; + + this.CarregarNoticias(); + return; + } + + if (this.router.url.includes('editar')) { + this.JanelaModo.Editar = true; + this.TituloJanela = "Editar notícia"; + this.TextoBotao = "Editar"; + + this.noticiasService.getNoticiasByID(this.route.snapshot.params['id' + this.Rota + 's']).then(resNoticia => { + this.FormNoticias = resNoticia; + this.CaminhoImagem = environment.LinkProjeto + "/imagens/" + this.Rota + "s/noticia_" + this.FormNoticias.idnoticias + ".jpg"; + }); + + return; + } + + this.JanelaModo.Cadastro = true; + this.TituloJanela = "Cadastro de notícias"; + this.TextoBotao = "Salvar"; + + this.FormNoticias = new Noticias(); + this.FormNoticias.habilitado = true; + } + + CarregarNoticias() { + this.noticiasService.getNoticias().then(resNoticias => { + this.ListaNoticias = resNoticias || []; + }); + } + + NovaNoticia() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.noticiasService.insertNoticias(this.FormNoticias).then(resInsert => { + this.FormNoticias.idnoticias = resInsert['response'].insertId; + this.FimCadastro(resInsert['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.noticiasService.updateNoticias(this.FormNoticias).then(resUpdate => { + this.FimCadastro(resUpdate['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormNoticias.titulo || this.FormNoticias.titulo.trim() == '') { + this.MensagemForm = "Informe o título da notícia."; + return false; + } + + if (!this.FormNoticias.descricao || this.FormNoticias.descricao.trim() == '') { + this.MensagemForm = "Informe a descrição da notícia."; + return false; + } + + if (this.JanelaModo.Cadastro && !this.Imagem) { + this.MensagemForm = "Selecione uma imagem para a notícia."; + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Notícia cadastrada com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Notícia atualizada com sucesso!"; + } + + const deveCopiarImagem = + this.Imagem != null && + ( + this.JanelaModo.Cadastro || + this.JanelaModo.Editar + ); + + if (deveCopiarImagem) { + this.CopiarArquivos(); + } + + setTimeout(() => { + this.VoltarLista(); + }, 900); + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar notícia."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar notícia."; + } + + this.TextoBotao = "Lista de notícias"; + } + + EditarNoticia(Noticia: Noticias) { + this.router.navigate(['dashboard/admin/' + this.Rota + 's/editar/' + Noticia.idnoticias]); + } + + RemoverNoticia(Noticia: Noticias) { + if (confirm("Tem certeza que deseja remover a notícia '" + Noticia.titulo + "'?")) { + this.noticiasService.deleteNoticias(Noticia.idnoticias).then(resDelete => { + this.ListaNoticias = this.ListaNoticias.filter(item => item.idnoticias !== Noticia.idnoticias); + }); + } + } + + CopiarArquivos() { + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("id" + this.Rota + "s", this.FormNoticias.idnoticias.toString()); + formData.append("imagem", this.Imagem); + + req.open("POST", environment.ApiUrl + "/noticias/copy"); + req.send(formData); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + console.log("Notícia copiada com sucesso!"); + } + }; + } + + onFileChangedIcone(event) { + if (event.target.files && event.target.files[0]) { + this.Imagem = event.target.files[0]; + + const reader = new FileReader(); + reader.readAsDataURL(event.target.files[0]); + + reader.onload = (event) => { + this.CaminhoImagem = event.target['result'].toString(); + }; + } + } + + LinkImagemNoticia(Noticia: NoticiasList): string { + return environment.LinkProjeto + "/imagens/" + this.Rota + "s/noticia_" + Noticia.idnoticias + ".jpg"; + } +} \ No newline at end of file diff --git a/src/app/orion-dashboard/orion-dashboard.component.html b/src/app/orion-dashboard/orion-dashboard.component.html new file mode 100644 index 0000000..5352440 --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.html @@ -0,0 +1,181 @@ +
+ + +
+ +
+ + + + + + +

+ + + + +

+ + + +

+ + +
+ + + {{Nome}} + + + +

+ + +
+ + + {{Perfil}} + + + +

+ + +
+ + + + {{trabalho[0].dataLog | date: 'HH:mm'}} ({{trabalho.length}} logs) + + + + +

+ + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+ + + + +
+
+ + + +
+ + +
+
+ + + + + +
+ + + + + + + + +
+ + + + + + + + + +
+ + + + + + +
+ +

+ +
+ + + + Data + {{log.logObj.data | date:'short'}} + + + + Nome + {{log.nome}} + + + + Perfil + {{log.perfil}} + + + + Conectado + {{log.logObj.conectado ? 'Sim' : 'Não'}} + + + + Câmera + {{log.logObj.camera}} + + + + + + + + +
+
+
+
diff --git a/src/app/orion-dashboard/orion-dashboard.component.scss b/src/app/orion-dashboard/orion-dashboard.component.scss new file mode 100644 index 0000000..40ff643 --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.scss @@ -0,0 +1,30 @@ +#divChart{ + display: block; + width: 90%; + height: auto; +} + +.divChart{ + display: block; + width: 30%; + position: relative; + float: left; + margin-right: 3%; + height: 350px; +} + +.TabelaDados { + padding: 20px; +} + +.DivGraficoFora { + width: 100%; + height: auto; + position: relative; +} + + +::ng-deep .highlight-date .mat-calendar-body-cell-content { + background-color: #ffcc80; /* Cor de destaque */ + border-radius: 50%; +} \ No newline at end of file diff --git a/src/app/orion-dashboard/orion-dashboard.component.spec.ts b/src/app/orion-dashboard/orion-dashboard.component.spec.ts new file mode 100644 index 0000000..a4a2034 --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OrionDashboardComponent } from './orion-dashboard.component'; + +describe('OrionDashboardComponent', () => { + let component: OrionDashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OrionDashboardComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrionDashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/orion-dashboard/orion-dashboard.component.ts b/src/app/orion-dashboard/orion-dashboard.component.ts new file mode 100644 index 0000000..a294a3b --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.ts @@ -0,0 +1,300 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { Chart } from 'chart.js'; +import { LogAgrupado, OrionLogsDetalhesModel, OrionLogSensorModel, OrionLogsModel } from '../models/orionModel'; +import { OrionService } from '../services/orionService'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatTabChangeEvent } from '@angular/material'; + +@Component({ + selector: 'app-orion-dashboard', + templateUrl: './orion-dashboard.component.html', + styleUrls: ['./orion-dashboard.component.scss'] +}) +export class OrionDashboardComponent implements OnInit { + @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; + + constructor( + private orionService: OrionService + ) { } + + Datas: string[] = []; + DataSelecionada: Date; + LogsDetalhes: OrionLogsModel[]; + LogsDetalhesFiltrado: OrionLogsModel[]; + displayedColumns: string[] = ['data', 'nome', 'perfil', 'conectado', 'camera']; + dataSource = new MatTableDataSource(); + + MapNome: any; + NomesFiltro: string[] = []; + MapPerfil: any; + PerfisFiltro: string[] = []; + HoraInicial: number = 0; // Slider range start (0 hours) + HoraFinal: number = 23; // Slider range end (23 hours) + FiltroSelecionado: OrionLogsDetalhesModel = null; + selectedSensor: OrionLogSensorModel; + + trabalhos = []; + trabalhoSelecionado; + tempoLog: number = 10; + + sliderOptions = { + floor: 0, + ceil: 23, + step: 1, + noSwitching: true, + translate: (value: number): string => { + return value + ':00'; + } + }; + + highlightedDates: Set = new Set(); // Datas que possuem logs + + ngOnInit() { + this.orionService.getAllLogs().then(resLogs => { + resLogs.forEach(log => log.logObj = JSON.parse(log.log)); + + // Ordena os logs por data do mais novo para o mais antigo + /*resLogs.sort((a, b) => { + const dateA = new Date(a.logObj.data).getTime(); + const dateB = new Date(b.logObj.data).getTime(); + return dateB - dateA; // Ordena do mais novo para o mais antigo + });*/ + + this.LogsDetalhes = resLogs; + + var MapDatas = this.groupBy(this.LogsDetalhes, log => new Date(log.logObj.data).toLocaleDateString()); + this.Datas = Array.from(MapDatas.keys()); + + // Adiciona as datas ao conjunto de datas destacadas + this.Datas.forEach(date => this.highlightedDates.add(date)); + + // Inicializa a tabela com todos os logs + this.dataSource.data = this.LogsDetalhes; + this.dataSource.paginator = this.paginator; + }); + } + + // Método para destacar datas no calendário + highlightDates = (date: Date): string => { + const dateStr = date.toLocaleDateString(); + return this.highlightedDates.has(dateStr) ? 'highlight-date' : ''; + }; + + btnFiltrarClick() { + // Limpa gráficos e dados antes de aplicar o filtro + this.clearCharts(); + this.FiltroSelecionado = null; + this.trabalhoSelecionado = null; + + // Extrai a data no formato YYYY-MM-DD + let DataSelecionadaStr = this.DataSelecionada.toISOString().split('T')[0]; + + // Concatena a data formatada com a hora inicial e final + let DataInicial: Date = new Date(`${DataSelecionadaStr}T${(this.HoraInicial < 10 ? "0" : "") + this.HoraInicial}:00:00`); + let DataFinal: Date = new Date(`${DataSelecionadaStr}T${(this.HoraFinal < 0 ? "0" : "") + this.HoraFinal}:59:59`); + + this.LogsDetalhesFiltrado = this.LogsDetalhes.filter(log => new Date(log.logObj.data) >= DataInicial && new Date(log.logObj.data) <= DataFinal); + this.dataSource.data = this.LogsDetalhesFiltrado; + this.dataSource.paginator = this.paginator; + + this.MapNome = this.groupBy(this.LogsDetalhesFiltrado, log => log.nome); + this.NomesFiltro = Array.from(this.MapNome.keys()); + this.txtPerfilChange(""); + } + + txtNomeChange(NomeSelecionado: string) { + // Limpa todas as informações de perfil, trabalho e gráficos ao selecionar novo nome + this.LogsDetalhesFiltrado = []; + this.FiltroSelecionado = null; + this.PerfisFiltro = []; + this.trabalhoSelecionado = null; + + // Limpa gráficos + this.clearCharts(); + + // Carrega os perfis do novo usuário selecionado + this.MapPerfil = this.groupBy(this.MapNome.get(NomeSelecionado), log => log.perfil); + this.PerfisFiltro = Array.from(this.MapPerfil.keys()); + } + + txtPerfilChange(PerfilSelecionado: string) { + if (PerfilSelecionado != "") { + this.LogsDetalhesFiltrado = this.MapPerfil.get(PerfilSelecionado); + } + else { + this.LogsDetalhesFiltrado = []; + } + + // Agrupando logs por trabalhos baseados no intervalo de 5 minutos + let trabalhos = []; + let trabalhoAtual = []; + + // Limpa os gráficos e trabalhos anteriores ao selecionar novo perfil + this.FiltroSelecionado = null; + this.trabalhoSelecionado = null; + this.selectedSensor = null; + + // Limpa gráficos + this.clearCharts(); + + // Percorre os logs e separa em grupos + for (let i = 0; i < this.LogsDetalhesFiltrado.length; i++) { + const logAtual = this.LogsDetalhesFiltrado[i]; + const dataLogAtual = new Date(logAtual.dataLog); + + if (trabalhoAtual.length === 0) { + trabalhoAtual.push(logAtual); // Adiciona o primeiro log ao trabalho atual + } else { + const ultimoLog = trabalhoAtual[trabalhoAtual.length - 1]; + const dataUltimoLog = new Date(ultimoLog.dataLog); + + // Calcula a diferença em minutos entre o log atual e o último log do trabalho atual + const diffInMinutes = (dataLogAtual.getTime() - dataUltimoLog.getTime()) / 1000 / 60; + + if (diffInMinutes > this.tempoLog) { + // Se a diferença for maior que 5 minutos, inicia um novo trabalho + trabalhos.push(trabalhoAtual); + trabalhoAtual = [logAtual]; + } else { + // Caso contrário, adiciona o log ao trabalho atual + trabalhoAtual.push(logAtual); + } + } + } + + // Adiciona o último trabalho ao array de trabalhos + if (trabalhoAtual.length > 0) { + trabalhos.push(trabalhoAtual); + } + + // Atualiza o estado com os trabalhos identificados + this.trabalhos = trabalhos; + if (this.trabalhos.length == 1) { + this.onTrabalhoSelecionado(trabalhos[0]); + } + } + + onTrabalhoSelecionado(trabalhoSelecionado: OrionLogsModel[]) { + this.trabalhoSelecionado = trabalhoSelecionado; + this.FiltroSelecionado = trabalhoSelecionado[trabalhoSelecionado.length - 1].logObj; + + // Atualizar detalhes como horário de início, fim, duração, etc. + let Ordenado = trabalhoSelecionado.sort((a, b) => b.dataLog < a.dataLog ? 1 : a.dataLog > b.dataLog ? -1 : 0); + + this.FiltroSelecionado.HoraInicio = new Date(Ordenado[0].dataLog).toLocaleTimeString(); + this.FiltroSelecionado.HoraFim = new Date(Ordenado[Ordenado.length - 1].dataLog).toLocaleTimeString(); + + var Dif = (new Date(Ordenado[Ordenado.length - 1].dataLog).getTime() - new Date(Ordenado[0].dataLog).getTime()) / 1000; + this.FiltroSelecionado.Duracao = this.SegundosParaTempo(Dif); + + this.FiltroSelecionado.Coordenadas = trabalhoSelecionado[trabalhoSelecionado.length - 1].coordenadas; + this.orionService.coordenadaToEndereco(this.FiltroSelecionado.Coordenadas).then(res => { + console.log(res); + if (res && res.data && res.data.length > 0) { + this.FiltroSelecionado.Localizacao = res.data[0].label; + } + }) + + // Atualiza a interface com os dados filtrados + this.btnAtualizarClick(); + } + + btnAtualizarClick() { + if (this.selectedSensor == null) { + this.selectedSensor = this.FiltroSelecionado.sensores[0]; + } + this.renderChart(this.selectedSensor, 'chart_' + this.selectedSensor.sensor + '_' + this.selectedSensor.descricao); + } + + groupBy(list, keyGetter) { + const map = new Map(); + list.forEach((item) => { + const key = keyGetter(item); + const collection = map.get(key); + if (!collection) { + map.set(key, [item]); + } + else { + collection.push(item); + } + }); + return map; + } + + SegundosParaTempo(Segundos: number) : string { + return new Date(Segundos * 1000).toISOString().substring(11, 19); + } + + onTabChange(event: MatTabChangeEvent) { + this.selectedSensor = this.FiltroSelecionado.sensores[event.index]; + const chartId = `chart_${this.selectedSensor.sensor}_${this.selectedSensor.descricao}`; + this.renderChart(this.selectedSensor, chartId); + } + + renderChart(sensor: OrionLogSensorModel, chartId: string) { + setTimeout(() => { + const canvasElement = document.getElementById(chartId) as HTMLCanvasElement; + if (canvasElement) { + const context = canvasElement.getContext('2d'); + if (context) { + // Use os logs filtrados com base no trabalho selecionado + const DadosSensoresModa = this.trabalhoSelecionado.map(log => log.logObj.sensores.filter(s => s.sensor === sensor.sensor && s.descricao === sensor.descricao)[0].moda); + const DadosSensoresMedia = this.trabalhoSelecionado.map(log => log.logObj.sensores.filter(s => s.sensor === sensor.sensor && s.descricao === sensor.descricao)[0].media); + const DadosSensoresMediana = this.trabalhoSelecionado.map(log => log.logObj.sensores.filter(s => s.sensor === sensor.sensor && s.descricao === sensor.descricao)[0].mediana); + + const myChart = new Chart(chartId, { + type: 'line', + data: { + labels: this.trabalhoSelecionado.map(log => new Date(log.logObj.data).toLocaleTimeString()), + datasets: [ + { + label: 'Moda', + data: DadosSensoresModa, + backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgba(255, 99, 132, 1)', + borderWidth: 1, + }, + { + label: 'Média', + data: DadosSensoresMedia, + backgroundColor: 'rgba(54, 162, 235, 0.2)', + borderColor: 'rgba(54, 162, 235, 1)', + borderWidth: 1, + }, + { + label: 'Mediana', + data: DadosSensoresMediana, + backgroundColor: 'rgba(255, 206, 86, 0.2)', + borderColor: 'rgba(255, 206, 86, 1)', + borderWidth: 1, + }, + ], + }, + options: { + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); + } else { + console.error(`Não foi possível adquirir o contexto para o gráfico com id ${chartId}`); + } + } + }, 100); // Pequeno atraso de 100ms + } + + clearCharts() { + const canvasElements = document.querySelectorAll('canvas'); + canvasElements.forEach((canvas) => { + const context = canvas.getContext('2d'); + if (context) { + context.clearRect(0, 0, canvas.width, canvas.height); // Limpa os gráficos + } + }); + } + + +} diff --git a/src/app/pipes/tipo-arquivo-nome.pipe.ts b/src/app/pipes/tipo-arquivo-nome.pipe.ts new file mode 100644 index 0000000..d2c7181 --- /dev/null +++ b/src/app/pipes/tipo-arquivo-nome.pipe.ts @@ -0,0 +1,45 @@ +// tipo-arquivo-nome.pipe.ts +import { Pipe, PipeTransform } from '@angular/core'; +import { TiposArquivos } from '../models/agrobaseModel'; + +@Pipe({ + name: 'tipoArquivoNome' +}) +export class TipoArquivoNomePipe implements PipeTransform { + transform(value: TiposArquivos): string { + switch (value) { + case TiposArquivos.ModeloIA_StreetDetector: + return 'Modelo IA - Street Detector'; + case TiposArquivos.ModeloIA_WeedDetector: + return 'Modelo IA - Weed Detector'; + case TiposArquivos.ParametrosModulo_ATU: + return 'Parâmetros Módulo ATU'; + case TiposArquivos.ParametrosModulo_MVD: + return 'Parâmetros Módulo MVD'; + case TiposArquivos.ParametrosModulo_SEN: + return 'Parâmetros Módulo SEN'; + case TiposArquivos.ParametrosModulo_KNT: + return 'Parâmetros Módulo KNT'; + case TiposArquivos.PinoutModulo_ATU: + return 'Pinout Módulo ATU'; + case TiposArquivos.PinoutModulo_SEN: + return 'Pinout Módulo SEN'; + case TiposArquivos.Script_StreetDetector: + return 'Script - Street Detector'; + case TiposArquivos.Script_WeedDetector: + return 'Script - Weed Detector'; + case TiposArquivos.Script_GreenDetector: + return 'Script - Green Detector'; + case TiposArquivos.Script_MapLoad: + return 'Script - Map Load'; + case TiposArquivos.Script_MapFollow: + return 'Script - Map Follow'; + case TiposArquivos.Script_GpsViewer: + return 'Script - GPS Viewer'; + case TiposArquivos.ArquivoModelo3D: + return 'Arquivo Modelo 3D'; + default: + return 'Tipo desconhecido'; + } + } +} diff --git a/src/app/produtos/produtos.component.html b/src/app/produtos/produtos.component.html new file mode 100644 index 0000000..f8b9bb4 --- /dev/null +++ b/src/app/produtos/produtos.component.html @@ -0,0 +1,240 @@ +
+ + +
+
+ Backoffice + +

Produtos

+ +

+ Gerencie as opções de compra, valores e status comercial do sistema + {{ Sistema != null ? Sistema.nome : "" }}. +

+
+ +
+ +
+
+ + +
+
+ Ícone do sistema +
+ +
+ Sistema selecionado + {{ Sistema.nome }} + Produtos e licenças vinculados a este sistema +
+
+ + +
+
+
+ inventory_2 +
+ +
+ Total de produtos + {{ ListaProdutos?.length || 0 }} +
+
+ +
+
+ check_circle +
+ +
+ Ativados + {{ TotalProdutosAtivos }} +
+
+ +
+
+ payments +
+ +
+ Vendas + {{ TotalVendas }} +
+
+
+ + +
+
+
+ Produtos cadastrados +

Opções de compra

+
+
+ +
+ +
+ +
+
+ workspace_premium +
+ + + {{ produto.ativado ? 'Ativado' : 'Desativado' }} + +
+ +

Licença {{ produto.descricao }}

+ +
+ R$ + {{ produto.valor | number:'1.2-2' }} +
+ +
+
+ Vendas + {{ produto.vendas || 0 }} +
+ +
+ Compensados + {{ produto.compensados || 0 }} +
+
+ +
+ + + +
+ +
+ +
+ +
+
+ sell +
+ +

Nenhum produto cadastrado

+ +

+ Este sistema ainda não possui produtos ou opções de licença para compra. +

+ + +
+
+ + +
+
+
+ Cadastro comercial +

{{ FormProduto.idprodutos ? 'Editar produto' : 'Novo produto' }}

+
+ + +
+ +
+ +
+
+ + + +
+ +
+ + + +
+
+ +
+ Prévia comercial + +
+ Licença selecionada + + + R$ {{ FormProduto.valor || 0 | number:'1.2-2' }} + + +

+ {{ getTipoLicencaDescricao(FormProduto.idtiposlicenca) }} +

+
+
+ +
+ + + +
+ +
+
+ +
\ No newline at end of file diff --git a/src/app/produtos/produtos.component.scss b/src/app/produtos/produtos.component.scss new file mode 100644 index 0000000..9c56a70 --- /dev/null +++ b/src/app/produtos/produtos.component.scss @@ -0,0 +1,635 @@ +.products-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* SYSTEM STRIP */ + +.system-strip { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 22px; + padding: 18px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.system-icon-box { + width: 60px; + height: 60px; + border-radius: 18px; + background: #f1f5ff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.system-icon { + width: 40px; + height: 40px; + object-fit: contain; +} + +.system-strip span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.system-strip strong { + display: block; + color: #0f172a; + font-size: 18px; + font-weight: 900; +} + +.system-strip small { + display: block; + margin-top: 3px; + color: #64748b; + font-size: 13px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.money { + background: #fef9c3; + color: #854d0e; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-card { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* PRODUCTS */ + +.products-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.product-card { + position: relative; + overflow: hidden; + padding: 22px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.product-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + background: #94a3b8; +} + +.product-card:hover { + transform: translateY(-3px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.product-active { + border-color: rgba(22, 163, 74, 0.26); + background: linear-gradient(90deg, rgba(220, 252, 231, 0.55), #f8fafc 32%); +} + +.product-active::before { + background: #16a34a; +} + +.product-disabled { + border-color: rgba(220, 38, 38, 0.22); + background: linear-gradient(90deg, rgba(254, 226, 226, 0.50), #f8fafc 32%); +} + +.product-disabled::before { + background: #dc2626; +} + +.product-card-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 18px; +} + +.product-icon { + width: 46px; + height: 46px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; + color: #071b63; +} + +.status-badge { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-badge.enabled { + background: #dcfce7; + color: #166534; +} + +.status-badge.disabled { + background: #fee2e2; + color: #991b1b; +} + +.product-card h3 { + margin: 0 0 16px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; +} + +.product-price { + display: flex; + align-items: flex-start; + gap: 6px; + margin-bottom: 18px; +} + +.product-price small { + margin-top: 6px; + color: #071b63; + font-size: 14px; + font-weight: 900; +} + +.product-price strong { + color: #071b63; + font-size: 34px; + line-height: 38px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.product-meta-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + margin-bottom: 18px; +} + +.meta-item { + padding: 14px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #e5e7eb; +} + +.meta-item span { + display: block; + margin-bottom: 5px; + color: #64748b; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.meta-item strong { + display: block; + color: #0f172a; + font-size: 15px; + line-height: 22px; + font-weight: 900; +} + +.product-actions { + display: flex; + gap: 10px; +} + +.btn-card { + min-height: 40px; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.edit { + background: #071b63; +} + +.btn-card.remove { + background: #dc2626; +} + +/* FORM */ + +.form-grid { + display: grid; + grid-template-columns: 1fr 220px; + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.form-preview { + margin-top: 20px; +} + +.form-preview > span { + display: block; + margin-bottom: 10px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.preview-price-card { + padding: 18px; + border-radius: 18px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.preview-price-card small { + display: block; + margin-bottom: 6px; + color: #64748b; + font-size: 12px; + font-weight: 900; +} + +.preview-price-card strong { + display: block; + color: #071b63; + font-size: 28px; + font-weight: 900; +} + +.preview-price-card p { + margin: 6px 0 0 0; + color: #475569; + font-size: 14px; + font-weight: 800; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .products-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .summary-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .products-grid, + .form-grid { + grid-template-columns: 1fr; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } +} + +@media (max-width: 520px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .product-actions { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/app/produtos/produtos.component.ts b/src/app/produtos/produtos.component.ts new file mode 100644 index 0000000..775f528 --- /dev/null +++ b/src/app/produtos/produtos.component.ts @@ -0,0 +1,171 @@ +import { Component, OnInit } from '@angular/core'; +import { ProdutosService } from '../services/produtosService'; +import { Sistemas, TiposDeLicenca } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { ActivatedRoute } from '@angular/router'; +import { ProdutosModel } from '../models/produtosModel'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-produtos', + templateUrl: './produtos.component.html', + styleUrls: ['./produtos.component.scss'] +}) +export class ProdutosComponent implements OnInit { + + Sistema: Sistemas = null; + ListaProdutos: ProdutosModel[] = []; + TiposLicenca: TiposDeLicenca[] = []; + FormProduto: ProdutosModel = null; + + constructor( + private produtosService: ProdutosService, + private sistemasService: SistemasService, + private route: ActivatedRoute + ) { } + + ngOnInit() { + this.CarregarDados(); + } + + get LinkSistemaIcone(): string { + if (!this.Sistema) { + return ''; + } + + return environment.LinkProjeto + '/sistemas/' + this.Sistema.idsistemas + '/icone.png'; + } + + get TotalProdutosAtivos(): number { + return (this.ListaProdutos || []).filter(produto => produto.ativado).length; + } + + get TotalVendas(): number { + return (this.ListaProdutos || []).reduce((total, produto) => { + return total + Number(produto.vendas || 0); + }, 0); + } + + CarregarDados() { + this.sistemasService.getTiposdelicenca().then(resTiposLicenca => { + this.TiposLicenca = resTiposLicenca || []; + + this.sistemasService.getSistemaByID(this.route.snapshot.params['idsistemas']).then(resSistema => { + this.Sistema = resSistema; + this.cancelarFormulario(); + this.CarregarProdutos(); + }); + }); + } + + CarregarProdutos() { + this.produtosService.getAllProdutos(this.Sistema.idsistemas).then(resProdutos => { + this.ListaProdutos = resProdutos || []; + }); + } + + btnNovoProdutoClick() { + if (!this.Sistema) { + alert("Aguarde o sistema carregar."); + return; + } + + this.FormProduto = new ProdutosModel(); + this.FormProduto.idtiposlicenca = 0; + this.FormProduto.idsistemas = this.Sistema.idsistemas; + this.FormProduto.valor = 0; + this.FormProduto.ativado = true; + + this.ScrollParaFormulario(); + } + + btnEditarProdutoClick(produto: ProdutosModel) { + this.FormProduto = { ...produto }; + + this.ScrollParaFormulario(); + } + + ScrollParaFormulario() { + setTimeout(() => { + const elemento = document.getElementById("produtoForm"); + + if (elemento) { + elemento.scrollIntoView({ + behavior: "smooth", + block: "start" + }); + } + }, 100); + } + + btnExcluirProdutoClick(idprodutos: number) { + if (confirm('Deseja realmente excluir este produto?')) { + this.produtosService.deleteProduto(idprodutos).then(() => { + this.ListaProdutos = this.ListaProdutos.filter(p => p.idprodutos !== idprodutos); + + if (this.FormProduto && this.FormProduto.idprodutos === idprodutos) { + this.cancelarFormulario(); + } + }); + } + } + + cancelarFormulario() { + this.FormProduto = null; + } + + onSubmit() { + if (!this.ValidarFormulario()) { + return; + } + + if (this.FormProduto.idprodutos) { + this.produtosService.updateProduto(this.FormProduto).then(() => { + const index = this.ListaProdutos.findIndex(p => p.idprodutos === this.FormProduto.idprodutos); + + if (index >= 0) { + this.ListaProdutos[index] = { ...this.FormProduto }; + } + + this.cancelarFormulario(); + alert("Produto atualizado com sucesso!"); + }); + + return; + } + + this.produtosService.insertProduto(this.FormProduto).then(resInsert => { + alert("Produto cadastrado com sucesso!"); + this.CarregarProdutos(); + this.cancelarFormulario(); + }); + } + + ValidarFormulario(): boolean { + if (!this.FormProduto) { + return false; + } + + if (!this.FormProduto.idtiposlicenca || this.FormProduto.idtiposlicenca == 0) { + alert("Selecione o tipo de licença."); + return false; + } + + if (this.FormProduto.valor == null || Number(this.FormProduto.valor) < 0) { + alert("Informe um valor válido."); + return false; + } + + return true; + } + + getTipoLicencaDescricao(idtiposlicenca: number): string { + const tipo = (this.TiposLicenca || []).find(x => Number(x.idtiposlicenca) === Number(idtiposlicenca)); + + if (!tipo) { + return 'Nenhum tipo de licença selecionado'; + } + + return tipo.descricao; + } +} \ No newline at end of file diff --git a/src/app/services/agrobase.service.ts b/src/app/services/agrobase.service.ts new file mode 100644 index 0000000..fd48e9d --- /dev/null +++ b/src/app/services/agrobase.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpEvent, HttpEventType, HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; // Importação do operador map +import { environment } from 'src/environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class AgrobaseService { + + constructor(private http: HttpClient) {} + + getArquivosVersao(): Observable { + const version_file_Url: string = environment.ApiUrl + '/agrobase/getVsfData'; + return this.http.get(version_file_Url); + } + + uploadFile(file: File, fileName: string): Observable<{ filePath: string }> { + const formData = new FormData(); + formData.append('file', file, file.name); // Arquivo em si + formData.append('fileName', fileName); // Nome do arquivo desejado no servidor + + return this.http.post<{ filePath: string }>(`${environment.ApiUrl}/agrobase/uploadVersionFiles`, formData, { + headers: new HttpHeaders({ + 'Accept': 'application/json' + }), + reportProgress: true, + observe: 'events' + }).pipe( + map((event: HttpEvent) => { + switch (event.type) { + case HttpEventType.Response: + return event.body; + default: + return { filePath: '' }; + } + }) + ); + } + + deleteVersionFile(filePath: string): Observable { + return this.http.post(`${environment.ApiUrl}/agrobase/deleteVersionFile`, { filePath }); + } + + atualizarVsfFile(jsonData: string): Observable { + return this.http.post(`${environment.ApiUrl}/agrobase/updateVsfFile`, { data: jsonData }, { + headers: new HttpHeaders({ + 'Content-Type': 'application/json' + }), + responseType: 'text' + }); + } + +} diff --git a/src/app/services/bingoService.ts b/src/app/services/bingoService.ts new file mode 100644 index 0000000..24d2657 --- /dev/null +++ b/src/app/services/bingoService.ts @@ -0,0 +1,94 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { BingoCartelasModel, BingoSorteiosModel } from '../models/bingoModel'; +import { Slides } from '../models/sliderModel'; + +@Injectable() +export class BingoService { + + Rota: String = environment.ApiUrl + "/bingo"; + + constructor(private http: HttpClient) { } + + getAllSorteios() { + return this.http.get(`${this.Rota}/getAllSorteios`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getSorteiosRealizar() { + return this.http.get(`${this.Rota}/getSorteiosRealizar`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getAllCartelas() { + return this.http.get(`${this.Rota}/getAllCartelas`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getCartelasSorteio(idbingosorteios: number) { + return this.http.get(`${this.Rota}/getCartelasSorteio/${idbingosorteios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getCartelasVendidasSorteio(idbingosorteios: number) { + return this.http.get(`${this.Rota}/getCartelasVendidasSorteio/${idbingosorteios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + SalvarBingoSorteio(formSorteio: BingoSorteiosModel) { + const response = this.http + .post(`${this.Rota}/${(formSorteio.idbingosorteios > 0) ? 'update' : 'insert'}BingoSorteio`, formSorteio) + .toPromise(); + return response; + } + + deleteBingoSorteio(idbingosorteios: number) { + const response = this.http + .delete(`${this.Rota}/deleteBingoSorteio/${idbingosorteios}`) + .toPromise(); + return response; + } + + insertBingoCartela(formCartelas: BingoSorteiosModel) { + const response = this.http + .post(`${this.Rota}/insertBingoCartela`, formCartelas) + .toPromise(); + return response; + } + + updateBingoCartela(formCartela: BingoCartelasModel) { + const response = this.http + .patch(`${this.Rota}/updateBingoCartela`, formCartela) + .toPromise(); + return response; + } + + exportarExcel(formSorteio: BingoSorteiosModel) { + const response = this.http + .post(`${this.Rota}/exportarExcel`, formSorteio) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/easy-ava.service.ts b/src/app/services/easy-ava.service.ts new file mode 100644 index 0000000..e7d256e --- /dev/null +++ b/src/app/services/easy-ava.service.ts @@ -0,0 +1,15 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +@Injectable() +export class EasyAVAService { + + constructor(private http: HttpClient) { } + + ProcurarResposta() { + return this.http.get(`https://brainly.com.br/app/ask?entry=hero&q=porque+a+terra+gira`) + .toPromise() + .then(response => response) + .then(data => { return data; }); + } + +} diff --git a/src/app/services/geral.service.ts b/src/app/services/geral.service.ts new file mode 100644 index 0000000..d729e24 --- /dev/null +++ b/src/app/services/geral.service.ts @@ -0,0 +1,24 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +@Injectable() +export class GeralService { + + Rota: String = environment.ApiUrl + "/arquivos"; + + constructor(private http: HttpClient) { } + + readEnderecos() { + return this.http.get(`../assets/Enderecos.txt`, { responseType: 'text' }) + .toPromise() + .then(response => response) + .then(data => { return data; }); + } + + async writeEnderecos(content: any) { + const response = await this.http.post(`${this.Rota}/editaConfig`, content) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/noticias.service.ts b/src/app/services/noticias.service.ts new file mode 100644 index 0000000..9a0fbd0 --- /dev/null +++ b/src/app/services/noticias.service.ts @@ -0,0 +1,61 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Noticias } from '../models/noticiasModel'; + +@Injectable() +export class NoticiasService { + + Rota: String = environment.ApiUrl + "/noticias"; + + constructor(private http: HttpClient) { } + + getNoticias() { + return this.http.get(`${this.Rota}/getAllNoticias`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getNoticiasEn() { + return this.http.get(`${this.Rota}/getNoticiasEn`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getNoticiasByID(idnoticias: number) { + return this.http.get(`${this.Rota}/getNoticiaByID/${idnoticias}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + insertNoticias(formNoticias: Noticias) { + const response = this.http + .post(`${this.Rota}/insertNoticias`, formNoticias) + .toPromise(); + return response; + } + + updateNoticias(formNoticias: Noticias) { + const response = this.http + .patch(`${this.Rota}/updateNoticias`, formNoticias) + .toPromise(); + return response; + } + + deleteNoticias(idnoticias: number) { + const response = this.http + .delete(`${this.Rota}/deleteNoticias/${idnoticias}`) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/orionService.ts b/src/app/services/orionService.ts new file mode 100644 index 0000000..98f2f62 --- /dev/null +++ b/src/app/services/orionService.ts @@ -0,0 +1,31 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { GeoCoordenadasResponseModel, OrionLogsModel } from '../models/orionModel'; + +@Injectable() +export class OrionService { + + Rota: String = environment.ApiUrl + "/otp"; + + constructor(private http: HttpClient) { } + + getAllLogs() { + return this.http.get(`${this.Rota}/getAllLogs`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + coordenadaToEndereco(Coordenadas: string) { + return this.http.get(`http://api.positionstack.com/v1/reverse?access_key=${environment.GeoAPI}&query=${Coordenadas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }) + } + +} diff --git a/src/app/services/produtosService.ts b/src/app/services/produtosService.ts new file mode 100644 index 0000000..b3ee532 --- /dev/null +++ b/src/app/services/produtosService.ts @@ -0,0 +1,61 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { ProdutosModel } from '../models/produtosModel'; + +@Injectable() +export class ProdutosService { + + Rota: String = environment.ApiUrl + "/checkout"; + + constructor(private http: HttpClient) { } + + getProdutosSell(idsistemas: number) { + return this.http.get(`${this.Rota}/getProductsSell/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getAllProdutos(idsistemas: number) { + return this.http.get(`${this.Rota}/getAllProducts/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + buySistema(idprodutos: number, idusuarios: number, qtd: number) { + const response = this.http + .post(`${this.Rota}/buy`, { idprodutos: idprodutos, idusuarios: idusuarios, qtd: qtd }) + .toPromise(); + return response; + } + + + + insertProduto(formProduto: ProdutosModel) { + const response = this.http + .post(`${this.Rota}/insertProduto`, formProduto) + .toPromise(); + return response; + } + + updateProduto(formProduto: ProdutosModel) { + const response = this.http + .patch(`${this.Rota}/updateProduto`, formProduto) + .toPromise(); + return response; + } + + deleteProduto(idprodutos: number) { + const response = this.http + .delete(`${this.Rota}/deleteProduto/${idprodutos}`) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/sistemas.service.ts b/src/app/services/sistemas.service.ts new file mode 100644 index 0000000..ff363ab --- /dev/null +++ b/src/app/services/sistemas.service.ts @@ -0,0 +1,236 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Sistemas, TiposDeSistema, Plataformas, Download, Chaves, ListChaves, SistemasDetalhes, SistemasLista, TiposDeLicenca } from '../models/sistemasModel'; + +@Injectable() +export class SistemasService { + + Rota: String = environment.ApiUrl + "/sistemas"; + + constructor(private http: HttpClient) { } + + getSistemas() { + return this.http.get(`${this.Rota}/getSistemas`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSistemasEn() { + return this.http.get(`${this.Rota}/getSistemasEn`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSistemaByID(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaByID/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + getSistemaByIDLista(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaByIDLista/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + getTiposdesistema() { + return this.http.get(`${this.Rota}/getTiposdesistema`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTiposdesistemaByID(idtiposdesistemas: number) { + return this.http.get(`${this.Rota}/getTiposdesistemaByID/${idtiposdesistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTiposdelicenca() { + return this.http.get(`${this.Rota}/getTiposdelicenca`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTiposdelicencaByID(idtiposlicenca: number) { + return this.http.get(`${this.Rota}/getTiposdelicencaByID/${idtiposlicenca}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getPlataformas() { + return this.http.get(`${this.Rota}/getPlataformas`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getPlataformaByID(idplataformas: number) { + return this.http.get(`${this.Rota}/getPlataformaByID/${idplataformas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getDetalhesByID(idsistemas: number) { + return this.http.get(`${this.Rota}/getDetalhesByID/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getDetalhesByIDEn(idsistemas: number) { + return this.http.get(`${this.Rota}/getDetalhesByIDEn/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + insertSistemas(formSistemas: Sistemas) { + const response = this.http + .post(`${this.Rota}/insertSistemas`, formSistemas) + .toPromise(); + return response; + } + + updateSistemas(formSistemas: Sistemas) { + const response = this.http + .patch(`${this.Rota}/updateSistemas`, formSistemas) + .toPromise(); + return response; + } + + deleteSistemas(idsistemas: number) { + const response = this.http + .delete(`${this.Rota}/deleteSistemas/${idsistemas}`) + .toPromise(); + return response; + } + + downloadSistema(formDownload: Download) { + const response = this.http + .patch(`${this.Rota}/downloadSistema`, formDownload) + .toPromise(); + return response; + } + + insertSistemaUsuario(formDownload: Download) { + const response = this.http + .post(`${this.Rota}/insertSistemaUsuario`, formDownload) + .toPromise(); + return response; + } + + deleteSistemaUsuario(idsistemas, idusuarios: number) { + const response = this.http + .delete(`${this.Rota}/deleteSistemaUsuario/${idsistemas}/${idusuarios}`) + .toPromise(); + return response; + } + + getChavesSistema(idsistemas, idusuarios: number) { + return this.http.get(`${this.Rota}/getChavesSistema/${idsistemas}/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getChavesSistemaLista(idsistemas, idusuarios: number) { + return this.http.get(`${this.Rota}/getChavesSistemaLista/${idsistemas}/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + insertChave(formChave: Chaves) { + const response = this.http + .post(`${this.Rota}/insertChave`, formChave) + .toPromise(); + return response; + } + + insertDetalhe(formDetalhe: SistemasDetalhes) { + const response = this.http + .post(`${this.Rota}/insertDetalhe`, formDetalhe) + .toPromise(); + return response; + } + + updateDetalhe(formDetalhe: SistemasDetalhes) { + const response = this.http + .patch(`${this.Rota}/updateDetalhe`, formDetalhe) + .toPromise(); + return response; + } + + atualizarListaDetalhes(idsistemas: number) { + return this.http.get(`${this.Rota}/atualizarListaDetalhes/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }) + } + + deleteSistemaDetalhe(idsistemasdetalhes: number, idsistemas: number, index: number) { + const response = this.http + .delete(`${this.Rota}/deleteDetalhe/${idsistemasdetalhes}/${idsistemas}/${index}`) + .toPromise(); + return response; + } + + getSistemaVersoes(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaVersoes/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }); + } + + getSistemaDownloads(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaDownloads/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }); + } + +} diff --git a/src/app/services/slider.service.ts b/src/app/services/slider.service.ts new file mode 100644 index 0000000..7069129 --- /dev/null +++ b/src/app/services/slider.service.ts @@ -0,0 +1,61 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Slides } from '../models/sliderModel'; + +@Injectable() +export class SliderService { + + Rota: String = environment.ApiUrl + "/slides"; + + constructor(private http: HttpClient) { } + + getSlides() { + return this.http.get(`${this.Rota}/getAllSlides`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSlidesEn() { + return this.http.get(`${this.Rota}/getSlidesEn`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSlideByID(idslides: number) { + return this.http.get(`${this.Rota}/getSlideByID/${idslides}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + insertSlides(formSlides: Slides) { + const response = this.http + .post(`${this.Rota}/insertSlides`, formSlides) + .toPromise(); + return response; + } + + updateSlides(formSlides: Slides) { + const response = this.http + .patch(`${this.Rota}/updateSlides`, formSlides) + .toPromise(); + return response; + } + + deleteSlides(idslides: number) { + const response = this.http + .delete(`${this.Rota}/deleteSlides/${idslides}`) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/usuarios.service.ts b/src/app/services/usuarios.service.ts new file mode 100644 index 0000000..7870dda --- /dev/null +++ b/src/app/services/usuarios.service.ts @@ -0,0 +1,122 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Login, Usuarios, TiposDeUsuario, Email, SistemasDoUsuario, RecuperarSenha } from '../models/usuariosModel'; +import { environment } from 'src/environments/environment'; + +@Injectable() +export class UsuariosService { + + Rota: String = environment.ApiUrl + "/users"; + + constructor(private http: HttpClient) { } + + getUsuarios() { + return this.http.get(`${this.Rota}/getUsuarios`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getUsuarioByID(idusuarios: number) { + return this.http.get(`${this.Rota}/getUsuarioByID/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + getSistemasDoUsuario(idusuarios: number) { + return this.http.get(`${this.Rota}/getSistemasDoUsuario/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + AuthUser(formLogin: Login) { + const response = this.http + .post(`${this.Rota}/authUser`, formLogin) + .toPromise(); + return response; + } + + getTiposdeusuario() { + return this.http.get(`${this.Rota}/getTiposdeusuario`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + insertUsuarios(formUsuarios: Usuarios) { + const response = this.http + .post(`${this.Rota}/insertUsuarios`, formUsuarios) + .toPromise(); + return response; + } + + updateUsuarios(formUsuarios: Usuarios) { + const response = this.http + .patch(`${this.Rota}/updateUsuarios`, formUsuarios) + .toPromise(); + return response; + } + + deleteUsuarios(idusuarios: number) { + const response = this.http + .delete(`${this.Rota}/deleteUsuarios/${idusuarios}`) + .toPromise(); + return response; + } + + EnviarEmail(formEmail: Email) { + const response = this.http + .post(`${environment.ApiUrl}/email/enviarEmail`, formEmail) + .toPromise(); + return response; + } + + insertTrocasenha(formTrocasenha: RecuperarSenha) { + const response = this.http + .post(`${this.Rota}/insertTrocasenha`, formTrocasenha) + .toPromise(); + return response; + } + + getTrocasenha() { + return this.http.get(`${this.Rota}/getTrocasenha`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTrocasenhaByTag(tag: string) { + return this.http.get(`${this.Rota}/getTrocasenhaByTag/${tag}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + setExpirado(formTrocasenha: RecuperarSenha) { + const response = this.http + .post(`${this.Rota}/setExpirado`, formTrocasenha) + .toPromise(); + return response; + } + + trocaSenha(formUsuarios: Usuarios) { + const response = this.http + .patch(`${this.Rota}/trocaSenha`, formUsuarios) + .toPromise(); + return response; + } +} diff --git a/src/app/sistemas/sistemas.component.html b/src/app/sistemas/sistemas.component.html new file mode 100644 index 0000000..2f92675 --- /dev/null +++ b/src/app/sistemas/sistemas.component.html @@ -0,0 +1,310 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie sistemas, versões, plataformas, licenças, instaladores e materiais publicados. +

+
+ +
+ +
+
+ + +
+ +
+
+ Dados do sistema +

{{ JanelaModo.Cadastro ? 'Cadastrar sistema' : 'Editar sistema' }}

+
+ + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ Prévia do ícone + +
+ Ícone do sistema + image +
+
+ +
+ Upload em andamento +
+ {{ progressUpload || 0 }}% + Processando arquivo... +
+
+ +
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ apps +
+ +
+ Total de sistemas + {{ ListaSistemas?.length || 0 }} +
+
+ +
+
+ download +
+ +
+ Total de downloads + {{ TotalDownloads }} +
+
+ +
+
+ inventory_2 +
+ +
+ Sem downloads + {{ TotalSemDownloads }} +
+
+
+ +
+
+
+ Sistemas +

Lista de sistemas

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
IDSistemaDownloadsVersãoAção
+ #{{ Sistema.idsistemas }} + +
+
+ Ícone do sistema +
+ +
+ + {{ Sistema.nome }} + + {{ Sistema.nome_install }} +
+
+
+ + {{ Sistema.downloads || 0 }} + + + {{ Sistema.versaoatual }} + + + + + + + + +
+
+ +
+
+ apps +
+ +

Nenhum sistema encontrado

+

Cadastre o primeiro sistema para começar a organizar os produtos da plataforma.

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/sistemas/sistemas.component.scss b/src/app/sistemas/sistemas.component.scss new file mode 100644 index 0000000..ce2ee41 --- /dev/null +++ b/src/app/sistemas/sistemas.component.scss @@ -0,0 +1,646 @@ +.admin-systems-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-table { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-table:hover { + transform: translateY(-1px); +} + +.btn-main:disabled { + opacity: 0.6; + cursor: not-allowed; + box-shadow: none; +} + +.btn-main .material-icons, +.btn-table .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.form-group.full { + grid-column: 1 / -1; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.file-control { + padding-top: 9px; +} + +.textarea-control { + min-height: 132px; + padding: 14px; + resize: vertical; +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.upload-preview-grid { + display: flex; + align-items: stretch; + gap: 16px; + margin-top: 20px; + flex-wrap: wrap; +} + +.icon-preview-card, +.upload-progress-card { + padding: 18px; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.icon-preview-card span { + display: block; + margin-bottom: 12px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.icon-preview-box { + width: 104px; + height: 104px; + border-radius: 22px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.icon-preview-box img { + width: 74px; + height: 74px; + object-fit: contain; +} + +.icon-preview-box .material-icons { + color: #94a3b8; + font-size: 40px; +} + +.upload-progress-card { + display: flex; + align-items: center; + gap: 16px; +} + +.upload-progress-card img { + width: 62px; + height: 62px; + object-fit: contain; +} + +.upload-progress-card strong { + display: block; + color: #071b63; + font-size: 24px; + font-weight: 900; +} + +.upload-progress-card span { + display: block; + color: #64748b; + font-size: 13px; + font-weight: 800; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* TABLE */ + +.table-wrapper { + width: 100%; + overflow-x: auto; +} + +.admin-table { + width: 100%; + border-collapse: separate; + border-spacing: 0 10px; +} + +.admin-table th { + padding: 0 16px 10px 16px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; + text-align: left; +} + +.admin-table td { + padding: 16px; + background: #f8fafc; + border-top: 1px solid #e5e7eb; + border-bottom: 1px solid #e5e7eb; + vertical-align: middle; + color: #334155; + font-size: 14px; +} + +.admin-table td:first-child { + border-left: 1px solid #e5e7eb; + border-radius: 16px 0 0 16px; +} + +.admin-table td:last-child { + border-right: 1px solid #e5e7eb; + border-radius: 0 16px 16px 0; +} + +.id-pill, +.version-pill, +.download-pill { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; +} + +.id-pill { + background: #e0f2fe; + color: #075985; +} + +.version-pill { + background: #f1f5ff; + color: #071b63; +} + +.download-pill.has-downloads { + background: #dcfce7; + color: #166534; +} + +.download-pill.no-downloads { + background: #fee2e2; + color: #991b1b; +} + +.system-cell { + display: flex; + align-items: center; + gap: 12px; +} + +.system-avatar { + width: 46px; + height: 46px; + flex: 0 0 auto; + border-radius: 15px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.system-avatar img { + width: 31px; + height: 31px; + object-fit: contain; +} + +.system-cell a { + display: block; + color: #0f172a; + font-size: 14px; + font-weight: 900; + text-decoration: none; +} + +.system-cell a:hover { + text-decoration: underline; +} + +.system-cell small { + display: block; + margin-top: 3px; + color: #64748b; + font-size: 12px; + max-width: 340px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.action-col { + width: 380px; +} + +.actions { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.btn-table { + min-height: 36px; + display: inline-flex; + align-items: center; + gap: 6px; + padding: 0 12px; + border-radius: 11px; + color: #ffffff; + font-size: 12px; +} + +.btn-table.details { + background: #0f766e; +} + +.btn-table.products { + background: #7c3aed; +} + +.btn-table.edit { + background: #071b63; +} + +.btn-table.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .form-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .summary-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 900px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } + + .actions { + flex-direction: column; + } + + .btn-table { + width: 100%; + justify-content: center; + } +} + +@media (max-width: 640px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .form-grid { + grid-template-columns: 1fr; + } + + .upload-preview-grid { + flex-direction: column; + } + + .icon-preview-card, + .upload-progress-card { + width: 100%; + box-sizing: border-box; + } +} \ No newline at end of file diff --git a/src/app/sistemas/sistemas.component.ts b/src/app/sistemas/sistemas.component.ts new file mode 100644 index 0000000..8525870 --- /dev/null +++ b/src/app/sistemas/sistemas.component.ts @@ -0,0 +1,371 @@ +import { Component, OnInit } from '@angular/core'; +import { Sistemas, TiposDeSistema, Plataformas, TiposDeLicenca } from '../models/sistemasModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { SistemasService } from '../services/sistemas.service'; +import { Modos } from '../models/variaveisModel'; +import { environment, FuncoesGlobais } from 'src/environments/environment'; + +@Component({ + selector: 'app-sistemas', + templateUrl: './sistemas.component.html', + styleUrls: ['./sistemas.component.scss', './../app.component.scss'] +}) +export class SistemasComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + ListaSistemas: Sistemas[] = []; + + FormSistemas: Sistemas = new Sistemas(); + + TiposDeSistema: TiposDeSistema[] = []; + Plataformas: Plataformas[] = []; + TiposDeLicenca: TiposDeLicenca[] = []; + + JanelaModo: Modos = new Modos(); + + OnUpload: boolean = false; + progressUpload: number = 0; + + Arquivo: File = null; + Icone: File = null; + + CaminhoIcone: string = ''; + + LinkDownload: string = environment.LinkProjeto; + Rota: string = "sistema"; + + constructor( + private router: Router, + private route: ActivatedRoute, + private sistemasService: SistemasService, + private funcoesGlobais: FuncoesGlobais + ) { } + + ngOnInit() { + this.funcoesGlobais.CheckAdminRoute(); + this.CheckRouteMode(); + } + + get TotalDownloads(): number { + return (this.ListaSistemas || []).reduce((total, sistema) => { + return total + Number(sistema.downloads || 0); + }, 0); + } + + get TotalSemDownloads(): number { + return (this.ListaSistemas || []).filter(sistema => Number(sistema.downloads || 0) === 0).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.TituloJanela = "Visualizar sistemas"; + this.CarregarSistemas(); + return; + } + + if (this.router.url.includes('editar')) { + this.TituloJanela = "Editar sistema"; + this.TextoBotao = "Editar"; + + const idSistema = this.route.snapshot.params['id' + this.Rota + 's']; + + this.sistemasService.getSistemaByID(idSistema).then(resSistema => { + this.FormSistemas = resSistema; + this.CaminhoIcone = environment.LinkProjeto + "/" + this.Rota + "s/" + this.FormSistemas.idsistemas + "/icone.png"; + + this.CarregarCombos().then(() => { + this.JanelaModo.Editar = true; + }); + }); + + return; + } + + this.TituloJanela = "Cadastro de sistemas"; + this.TextoBotao = "Salvar"; + + this.FormSistemas = new Sistemas(); + this.FormSistemas.idtiposdesistema = 0; + this.FormSistemas.idplataformas = 0; + this.FormSistemas.idtiposlicenca = 0; + this.FormSistemas.habilitado = false; + + this.CarregarCombos().then(() => { + this.JanelaModo.Cadastro = true; + }); + } + + CarregarSistemas() { + this.sistemasService.getSistemas().then(resSistemas => { + this.ListaSistemas = resSistemas || []; + this.JanelaModo.Visualizar = true; + }); + } + + async CarregarCombos() { + await this.sistemasService.getTiposdesistema().then(resTiposdesistema => { + this.TiposDeSistema = resTiposdesistema || []; + }); + + await this.sistemasService.getPlataformas().then(resPlataformas => { + this.Plataformas = resPlataformas || []; + }); + + await this.sistemasService.getTiposdelicenca().then(resTiposlicenca => { + this.TiposDeLicenca = resTiposlicenca || []; + }); + } + + NovoSistema() { + this.router.navigate(['/dashboard/' + this.Rota + 's/cadastro']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.sistemasService.insertSistemas(this.FormSistemas).then(resInsert => { + this.FormSistemas.idsistemas = resInsert['response'].insertId; + this.FimCadastro(resInsert['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.sistemasService.updateSistemas(this.FormSistemas).then(resUpdate => { + this.FimCadastro(resUpdate['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormSistemas.nome || this.FormSistemas.nome.trim() == '') { + this.MensagemForm = 'Informe o nome do sistema.'; + return false; + } + + if (!this.FormSistemas.descricao || this.FormSistemas.descricao.trim() == '') { + this.MensagemForm = 'Informe a descrição do sistema.'; + return false; + } + + if (!this.FormSistemas.idtiposlicenca || this.FormSistemas.idtiposlicenca == 0) { + this.MensagemForm = 'Selecione o tipo de licença.'; + return false; + } + + if (!this.FormSistemas.versaoatual || this.FormSistemas.versaoatual.trim() == '') { + this.MensagemForm = 'Informe a versão atual.'; + return false; + } + + if (!this.FormSistemas.idtiposdesistema || this.FormSistemas.idtiposdesistema == 0) { + this.MensagemForm = 'Selecione o tipo de sistema.'; + return false; + } + + if (!this.FormSistemas.idplataformas || this.FormSistemas.idplataformas == 0) { + this.MensagemForm = 'Selecione a plataforma.'; + return false; + } + + if (!this.FormSistemas.nome_install || this.FormSistemas.nome_install.trim() == '') { + this.MensagemForm = this.FormSistemas.idplataformas == 6 + ? 'Informe o link de acesso.' + : 'Informe o nome do instalador.'; + + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Sistema cadastrado com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Sistema atualizado com sucesso!"; + } + + if ((this.JanelaModo.Editar && (this.Arquivo != null || this.Icone != null)) || this.JanelaModo.Cadastro) { + this.CopiarArquivos(); + } else { + setTimeout(() => { + this.VoltarLista(); + }, 800); + } + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar sistema."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar sistema."; + } + + this.TextoBotao = "Lista de sistemas"; + } + + EditarSistema(Sistema: Sistemas) { + this.router.navigate(['dashboard/' + this.Rota + 's/editar/' + Sistema.idsistemas]); + } + + EditarDetalhesSistema(Sistema: Sistemas) { + this.router.navigate(['dashboard/' + this.Rota + 's/detalhes/' + Sistema.idsistemas]); + } + + VerProdutos(Sistema: Sistemas) { + this.router.navigate(['/dashboard/sistemas/produtos/' + Sistema.idsistemas]); + } + + RemoverSistema(Sistema: Sistemas) { + if (confirm("Tem certeza que deseja remover o sistema '" + Sistema.nome + "'?")) { + this.sistemasService.deleteSistemas(Sistema.idsistemas).then(resDelete => { + this.ListaSistemas = this.ListaSistemas.filter(item => item.idsistemas !== Sistema.idsistemas); + }); + } + } + + onFileChangedArquivo(event) { + if (event.target.files && event.target.files[0]) { + this.Arquivo = event.target.files[0]; + this.OnUpload = true; + this.progressUpload = 0; + + const reader = new FileReader(); + + reader.readAsDataURL(event.target.files[0]); + + reader.onprogress = (event) => { + this.loading(event); + }; + + reader.onload = (event) => { + this.progressUpload = 100; + this.OnUpload = false; + }; + + reader.onerror = () => { + this.OnUpload = false; + this.MensagemForm = "Erro ao carregar arquivo."; + }; + } + } + + onFileChangedIcone(event) { + if (event.target.files && event.target.files[0]) { + this.Icone = event.target.files[0]; + this.OnUpload = true; + this.progressUpload = 0; + + const reader = new FileReader(); + + reader.readAsDataURL(event.target.files[0]); + + reader.onprogress = (event) => { + this.loading(event); + }; + + reader.onload = (event) => { + this.CaminhoIcone = event.target['result']; + this.progressUpload = 100; + this.OnUpload = false; + }; + + reader.onerror = () => { + this.OnUpload = false; + this.MensagemForm = "Erro ao carregar ícone."; + }; + } + } + + async loading(event) { + if (event.lengthComputable) { + const percentLoaded = Math.round((event.loaded / event.total) * 100); + + if (percentLoaded < 100) { + this.progressUpload = percentLoaded; + } + } + } + + CopiarArquivos() { + localStorage.setItem("fileUpload", "0"); + + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("nome", this.FormSistemas.nome_install || ""); + formData.append("id" + this.Rota + "s", this.FormSistemas.idsistemas.toString()); + formData.append("versaoatual", this.FormSistemas.versaoatual || ""); + + if (this.Arquivo) { + formData.append("arquivo", this.Arquivo); + } + + if (this.Icone) { + formData.append("icone", this.Icone); + } + + req.open("POST", environment.ApiUrl + "/sistemas/copy"); + req.send(formData); + + this.CheckUploadFile(); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + localStorage.setItem("fileUpload", "1"); + } + }; + } + + async CheckUploadFile() { + while (localStorage.getItem("fileUpload") == "0") { + await delay(500); + } + + localStorage.removeItem("fileUpload"); + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Arquivo inserido com sucesso."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Arquivo atualizado com sucesso."; + } + + setTimeout(() => { + this.VoltarLista(); + }, 800); + } + + getSistemaLink(Sistema: Sistemas): string { + if (Sistema.idplataformas != 6) { + return this.LinkDownload + '/sistemas/' + Sistema.idsistemas + '/versoes/' + Sistema.versaoatual + '/' + Sistema.nome_install; + } + + return Sistema.nome_install; + } +} + +async function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/src/app/slider/slider.component.html b/src/app/slider/slider.component.html new file mode 100644 index 0000000..f324488 --- /dev/null +++ b/src/app/slider/slider.component.html @@ -0,0 +1,199 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie os banners exibidos no slider principal da página inicial. +

+
+ +
+ +
+
+ + +
+ +
+
+ Banner da home +

{{ JanelaModo.Cadastro ? 'Cadastrar slide' : 'Editar slide' }}

+
+ + +
+ +
+
+ + +
+ +
+ + + + + + Recomendado: imagem horizontal em boa resolução, preferencialmente JPG. + +
+
+ +
+ Prévia do slide + +
+ Prévia do slide +
+
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ collections +
+ +
+ Total de slides + {{ ListaSlides?.length || 0 }} +
+
+ +
+
+ visibility +
+ +
+ Habilitados + {{ TotalHabilitados }} +
+
+ +
+
+ visibility_off +
+ +
+ Desabilitados + {{ TotalDesabilitados }} +
+
+
+ +
+
+
+ Slider +

Slides cadastrados

+
+
+ +
+ +
+ +
+ Imagem do slide +
+ +
+
+ #{{ Slider.idslides }} + + + {{ Slider.habilitado ? 'Habilitado' : 'Desabilitado' }} + +
+ +

{{ Slider.descricao || 'Slide sem descrição' }}

+ +
+ + + +
+
+ +
+ +
+ +
+
+ collections +
+ +

Nenhum slide cadastrado

+ +

+ Cadastre o primeiro banner para exibir no slider da página inicial. +

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/slider/slider.component.scss b/src/app/slider/slider.component.scss new file mode 100644 index 0000000..8da5916 --- /dev/null +++ b/src/app/slider/slider.component.scss @@ -0,0 +1,581 @@ +.slides-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-card { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease, opacity 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: 1fr; + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.file-label { + min-height: 42px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + border: 1px solid #dbe6ff; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.field-hint { + display: block; + margin-top: 8px; + color: #64748b; + font-size: 12px; + font-weight: 700; +} + +.slide-preview-section { + margin-top: 22px; +} + +.slide-preview-section > span { + display: block; + margin-bottom: 10px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.slide-preview-box { + overflow: hidden; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; + height: 330px; +} + +.slide-preview-box img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* SLIDES GRID */ + +.slides-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.slide-card { + position: relative; + overflow: hidden; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.slide-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + z-index: 2; + background: #94a3b8; +} + +.slide-card:hover { + transform: translateY(-3px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.slide-enabled { + border-color: rgba(22, 163, 74, 0.26); +} + +.slide-enabled::before { + background: #16a34a; +} + +.slide-disabled { + border-color: rgba(220, 38, 38, 0.22); +} + +.slide-disabled::before { + background: #dc2626; +} + +.slide-image-wrapper { + height: 220px; + background: #e5e7eb; + overflow: hidden; +} + +.slide-image { + width: 100%; + height: 100%; + object-fit: cover; +} + +.slide-card-body { + padding: 18px; +} + +.slide-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 14px; +} + +.id-pill { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 10px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 12px; + font-weight: 900; +} + +.status-badge { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-badge.enabled { + background: #dcfce7; + color: #166534; +} + +.status-badge.disabled { + background: #fee2e2; + color: #991b1b; +} + +.slide-card h3 { + min-height: 48px; + margin: 0 0 16px 0; + color: #0f172a; + font-size: 18px; + line-height: 24px; + font-weight: 900; +} + +.slide-actions { + display: flex; + gap: 10px; +} + +.btn-card { + min-height: 40px; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.edit { + background: #071b63; +} + +.btn-card.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1000px) { + .summary-grid { + grid-template-columns: 1fr; + } + + .slides-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } + + .slide-preview-box { + height: 240px; + } +} + +@media (max-width: 520px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .slide-actions { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/app/slider/slider.component.ts b/src/app/slider/slider.component.ts new file mode 100644 index 0000000..2760f48 --- /dev/null +++ b/src/app/slider/slider.component.ts @@ -0,0 +1,214 @@ +import { Component, OnInit } from '@angular/core'; +import { Slides, SlidesList } from '../models/sliderModel'; +import { Modos } from '../models/variaveisModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { SliderService } from '../services/slider.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-slider', + templateUrl: './slider.component.html', + styleUrls: ['./slider.component.scss', './../app.component.scss'] +}) +export class SliderComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + FormSlider: Slides = new Slides(); + ListaSlides: SlidesList[] = []; + + JanelaModo: Modos = new Modos(); + + Imagem: File = null; + CaminhoImagem: string = null; + + Rota: string = "slide"; + + constructor( + private route: ActivatedRoute, + private router: Router, + private sliderService: SliderService, + ) { } + + ngOnInit() { + this.CheckRouteMode(); + } + + get TotalHabilitados(): number { + return (this.ListaSlides || []).filter(slide => slide.habilitado).length; + } + + get TotalDesabilitados(): number { + return (this.ListaSlides || []).filter(slide => !slide.habilitado).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.JanelaModo.Visualizar = true; + this.TituloJanela = "Visualizar slides"; + + this.CarregarSlides(); + return; + } + + if (this.router.url.includes('editar')) { + this.JanelaModo.Editar = true; + this.TituloJanela = "Editar slide"; + this.TextoBotao = "Editar"; + + this.sliderService.getSlideByID(this.route.snapshot.params['id' + this.Rota + 's']).then(resSlide => { + this.FormSlider = resSlide; + this.CaminhoImagem = environment.LinkProjeto + "/imagens/" + this.Rota + "s/slide_" + this.FormSlider.idslides + ".jpg"; + }); + + return; + } + + this.JanelaModo.Cadastro = true; + this.TituloJanela = "Cadastro de slides"; + this.TextoBotao = "Salvar"; + + this.FormSlider = new Slides(); + this.FormSlider.habilitado = true; + } + + CarregarSlides() { + this.sliderService.getSlides().then(resSlides => { + this.ListaSlides = resSlides || []; + }); + } + + NovoSlide() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.sliderService.insertSlides(this.FormSlider).then(resInsert => { + this.FormSlider.idslides = resInsert['response'].insertId; + this.FimCadastro(resInsert['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.sliderService.updateSlides(this.FormSlider).then(resUpdate => { + this.FimCadastro(resUpdate['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormSlider.descricao || this.FormSlider.descricao.trim() == '') { + this.MensagemForm = "Informe a descrição do slide."; + return false; + } + + if (this.JanelaModo.Cadastro && !this.Imagem) { + this.MensagemForm = "Selecione uma imagem para o slide."; + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Slide cadastrado com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Slide atualizado com sucesso!"; + } + + const deveCopiarImagem = + this.Imagem != null && + ( + this.JanelaModo.Cadastro || + this.JanelaModo.Editar + ); + + if (deveCopiarImagem) { + this.CopiarArquivos(); + } + + setTimeout(() => { + this.VoltarLista(); + }, 900); + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar slide."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar slide."; + } + + this.TextoBotao = "Lista de slides"; + } + + EditarSlider(Slider: Slides) { + this.router.navigate(['dashboard/admin/' + this.Rota + 's/editar/' + Slider.idslides]); + } + + RemoverSlider(Slider: Slides) { + if (confirm("Tem certeza que deseja remover o slide '" + Slider.descricao + "'?")) { + this.sliderService.deleteSlides(Slider.idslides).then(resDelete => { + this.ListaSlides = this.ListaSlides.filter(item => item.idslides !== Slider.idslides); + }); + } + } + + CopiarArquivos() { + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("id" + this.Rota + "s", this.FormSlider.idslides.toString()); + formData.append("imagem", this.Imagem); + + req.open("POST", environment.ApiUrl + "/" + this.Rota + "s/copy"); + req.send(formData); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + console.log("Slide copiado com sucesso!"); + } + }; + } + + onFileChangedIcone(event) { + if (event.target.files && event.target.files[0]) { + this.Imagem = event.target.files[0]; + + const reader = new FileReader(); + reader.readAsDataURL(event.target.files[0]); + + reader.onload = (event) => { + this.CaminhoImagem = event.target['result'].toString(); + }; + } + } + + LinkImagemSlide(Slider: SlidesList): string { + return environment.LinkProjeto + "/imagens/" + this.Rota + "s/slide_" + Slider.idslides + ".jpg"; + } +} \ No newline at end of file diff --git a/src/app/users/users.component.html b/src/app/users/users.component.html new file mode 100644 index 0000000..23409ed --- /dev/null +++ b/src/app/users/users.component.html @@ -0,0 +1,230 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie usuários, permissões de acesso e status de habilitação da plataforma. +

+
+ +
+ +
+
+ + +
+ +
+
+ Dados do usuário +

{{ JanelaModo.Cadastro ? 'Cadastrar usuário' : 'Editar usuário' }}

+
+ + +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ group +
+ +
+ Total de usuários + {{ ListaUsuario?.length || 0 }} +
+
+ +
+
+ verified_user +
+ +
+ Habilitados + {{ TotalHabilitados }} +
+
+ +
+
+ block +
+ +
+ Desabilitados + {{ TotalDesabilitados }} +
+
+
+ +
+
+
+ Usuários +

Lista de usuários

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
IDNomeUsuárioCadastroAção
+ #{{ Usuario.idusuarios }} + +
+
+ {{ getInitials(Usuario.nome) }} +
+ +
+ {{ Usuario.nome }} + {{ Usuario.email }} +
+
+
+ {{ Usuario.usuario }} + {{ Usuario.data_cadastro | date:'dd/MM/yyyy' }} + + + +
+
+ +
+
+ person_off +
+ +

Nenhum usuário encontrado

+

Cadastre o primeiro usuário para iniciar o gerenciamento.

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/users/users.component.scss b/src/app/users/users.component.scss new file mode 100644 index 0000000..6202844 --- /dev/null +++ b/src/app/users/users.component.scss @@ -0,0 +1,500 @@ +.admin-users-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 680px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-table { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-actions .btn-main, +.empty-state .btn-main { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-table:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-table .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* TABLE */ + +.table-wrapper { + width: 100%; + overflow-x: auto; +} + +.admin-table { + width: 100%; + border-collapse: separate; + border-spacing: 0 10px; +} + +.admin-table th { + padding: 0 16px 10px 16px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; + text-align: left; +} + +.admin-table td { + padding: 16px; + background: #f8fafc; + border-top: 1px solid #e5e7eb; + border-bottom: 1px solid #e5e7eb; + vertical-align: middle; + color: #334155; + font-size: 14px; +} + +.admin-table td:first-child { + border-left: 1px solid #e5e7eb; + border-radius: 16px 0 0 16px; +} + +.admin-table td:last-child { + border-right: 1px solid #e5e7eb; + border-radius: 0 16px 16px 0; +} + +.id-pill, +.username-pill { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; +} + +.id-pill { + background: #e0f2fe; + color: #075985; +} + +.username-pill { + background: #f1f5ff; + color: #071b63; +} + +.user-cell { + display: flex; + align-items: center; + gap: 12px; +} + +.avatar { + width: 42px; + height: 42px; + flex: 0 0 auto; + border-radius: 14px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + display: flex; + align-items: center; + justify-content: center; + font-size: 13px; + font-weight: 900; +} + +.user-cell strong { + display: block; + color: #0f172a; + font-size: 14px; + font-weight: 900; +} + +.user-cell small { + display: block; + margin-top: 3px; + color: #64748b; + font-size: 12px; +} + +.action-col { + width: 220px; +} + +.actions { + display: flex; + gap: 8px; +} + +.btn-table { + min-height: 36px; + display: inline-flex; + align-items: center; + gap: 6px; + padding: 0 12px; + border-radius: 11px; + color: #ffffff; + font-size: 12px; +} + +.btn-table.edit { + background: #071b63; +} + +.btn-table.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 520px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 900px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .summary-grid, + .form-grid { + grid-template-columns: 1fr; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } +} + +@media (max-width: 640px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .actions { + flex-direction: column; + } + + .btn-table { + width: 100%; + justify-content: center; + } +} \ No newline at end of file diff --git a/src/app/users/users.component.ts b/src/app/users/users.component.ts new file mode 100644 index 0000000..1fddc73 --- /dev/null +++ b/src/app/users/users.component.ts @@ -0,0 +1,206 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Usuarios, TiposDeUsuario } from '../models/usuariosModel'; +import { UsuariosService } from '../services/usuarios.service'; +import { Modos } from '../models/variaveisModel'; +import { FuncoesGlobais } from 'src/environments/environment'; + +@Component({ + selector: 'app-users', + templateUrl: './users.component.html', + styleUrls: ['./users.component.scss', './../app.component.scss'] +}) +export class UsersComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + FormUsuario: Usuarios = new Usuarios(); + + ListaUsuario: Usuarios[] = []; + TiposDeUsuario: TiposDeUsuario[] = []; + + JanelaModo: Modos = new Modos(); + Rota: string = "usuario"; + + constructor( + private router: Router, + private route: ActivatedRoute, + private usuaruisService: UsuariosService, + private funcoesGlobais: FuncoesGlobais + ) { } + + ngOnInit() { + this.funcoesGlobais.CheckAdminRoute(); + + this.FormUsuario.idtiposdeusuario = 0; + this.FormUsuario.habilitado = false; + + this.usuaruisService.getTiposdeusuario().then(resTiposdeusuario => { + this.TiposDeUsuario = resTiposdeusuario || []; + }); + + this.CheckRouteMode(); + } + + get TotalHabilitados(): number { + return (this.ListaUsuario || []).filter(usuario => usuario.habilitado).length; + } + + get TotalDesabilitados(): number { + return (this.ListaUsuario || []).filter(usuario => !usuario.habilitado).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.JanelaModo.Visualizar = true; + this.TituloJanela = "Visualizar usuários"; + + this.CarregarUsuarios(); + return; + } + + if (this.router.url.includes('editar')) { + this.JanelaModo.Editar = true; + this.TituloJanela = "Editar usuário"; + this.TextoBotao = "Editar"; + + this.usuaruisService.getUsuarioByID(this.route.snapshot.params['id' + this.Rota + 's']).then(resUsuario => { + this.FormUsuario = resUsuario; + }); + + return; + } + + this.JanelaModo.Cadastro = true; + this.TituloJanela = "Cadastro de usuários"; + this.TextoBotao = "Salvar"; + } + + CarregarUsuarios() { + this.usuaruisService.getUsuarios().then(resUsuarios => { + this.ListaUsuario = resUsuarios || []; + }); + } + + NovoUsuario() { + this.router.navigate(['/dashboard/' + this.Rota + 's/cadastro']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.usuaruisService.insertUsuarios(this.FormUsuario).then(resInsertusuarios => { + this.FimCadastro(resInsertusuarios['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.usuaruisService.updateUsuarios(this.FormUsuario).then(resUpdateusuarios => { + this.FimCadastro(resUpdateusuarios['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormUsuario.nome || this.FormUsuario.nome.trim() == '') { + this.MensagemForm = 'Informe o nome do usuário.'; + return false; + } + + if (!this.FormUsuario.email || this.FormUsuario.email.trim() == '') { + this.MensagemForm = 'Informe o e-mail do usuário.'; + return false; + } + + if (!this.FormUsuario.usuario || this.FormUsuario.usuario.trim() == '') { + this.MensagemForm = 'Informe o login do usuário.'; + return false; + } + + if (this.JanelaModo.Cadastro && (!this.FormUsuario.senha || this.FormUsuario.senha.trim() == '')) { + this.MensagemForm = 'Informe a senha do usuário.'; + return false; + } + + if (!this.FormUsuario.cpf || this.FormUsuario.cpf.trim() == '') { + this.MensagemForm = 'Informe o CPF do usuário.'; + return false; + } + + if (!this.FormUsuario.idtiposdeusuario || this.FormUsuario.idtiposdeusuario == 0) { + this.MensagemForm = 'Selecione o tipo de usuário.'; + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Usuário cadastrado com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Usuário atualizado com sucesso!"; + } + + setTimeout(() => { + this.VoltarLista(); + }, 800); + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar usuário."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar usuário."; + } + + this.TextoBotao = "Lista de usuários"; + } + + EditarUsuario(Usuario) { + this.router.navigate(['dashboard/' + this.Rota + 's/editar/' + Usuario.idusuarios]); + } + + RemoverUsuario(Usuario) { + if (confirm("Tem certeza que deseja remover o usuário '" + Usuario.usuario + "' do cliente '" + Usuario.nome + "'?")) { + this.usuaruisService.deleteUsuarios(Usuario.idusuarios).then(resDelete => { + this.ListaUsuario = this.ListaUsuario.filter(item => item.idusuarios !== Usuario.idusuarios); + }); + } + } + + getInitials(nome: string): string { + if (!nome) { + return 'US'; + } + + const partes = nome.trim().split(' ').filter(x => x); + + if (partes.length == 1) { + return partes[0].substring(0, 2).toUpperCase(); + } + + return (partes[0][0] + partes[partes.length - 1][0]).toUpperCase(); + } +} \ No newline at end of file diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/Enderecos.txt b/src/assets/Enderecos.txt new file mode 100644 index 0000000..e373bbd --- /dev/null +++ b/src/assets/Enderecos.txt @@ -0,0 +1 @@ +Dominio=http://127.0.0.1:4200;API=http://127.0.0.1:1337;Título="Zendion, INC." \ No newline at end of file diff --git a/src/assets/background.jpg b/src/assets/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0978ba0553b8fb5e568cbc9d7a858506defb0b02 GIT binary patch literal 71244 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 literal 0 HcmV?d00001 diff --git a/src/assets/loader.gif b/src/assets/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2348d51453f5e9240630dc03291f83dcad5d40a GIT binary patch literal 38472 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 Y@Z$x3yugna`0)ZiUf{k literal 0 HcmV?d00001 diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..767117bf21f83e5cc6d93080d494224ddf12bc04 GIT binary patch literal 126030 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 KMNUMnLSTZ2z@}gT literal 0 HcmV?d00001 diff --git a/src/assets/sucripts/swiper.js b/src/assets/sucripts/swiper.js new file mode 100644 index 0000000..0efb408 --- /dev/null +++ b/src/assets/sucripts/swiper.js @@ -0,0 +1,5360 @@ +/** + * Swiper 3.4.2 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * + * http://www.idangero.us/swiper/ + * + * Copyright 2017, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: March 10, 2017 + */ +(function () { + 'use strict'; + var $; + + /*=========================== + Swiper + ===========================*/ + var Swiper = function (container, params) { + if (!(this instanceof Swiper)) return new Swiper(container, params); + + + var defaults = { + direction: 'horizontal', + touchEventsTarget: 'container', + initialSlide: 0, + speed: 300, + // autoplay + autoplay: false, + autoplayDisableOnInteraction: true, + autoplayStopOnLast: false, + // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView). + iOSEdgeSwipeDetection: false, + iOSEdgeSwipeThreshold: 20, + // Free mode + freeMode: false, + freeModeMomentum: true, + freeModeMomentumRatio: 1, + freeModeMomentumBounce: true, + freeModeMomentumBounceRatio: 1, + freeModeMomentumVelocityRatio: 1, + freeModeSticky: false, + freeModeMinimumVelocity: 0.02, + // Autoheight + autoHeight: false, + // Set wrapper width + setWrapperSize: false, + // Virtual Translate + virtualTranslate: false, + // Effects + effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + coverflow: { + rotate: 50, + stretch: 0, + depth: 100, + modifier: 1, + slideShadows : true + }, + flip: { + slideShadows : true, + limitRotation: true + }, + cube: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94 + }, + fade: { + crossFade: false + }, + // Parallax + parallax: false, + // Zoom + zoom: false, + zoomMax: 3, + zoomMin: 1, + zoomToggle: true, + // Scrollbar + scrollbar: null, + scrollbarHide: true, + scrollbarDraggable: false, + scrollbarSnapOnRelease: false, + // Keyboard Mousewheel + keyboardControl: false, + mousewheelControl: false, + mousewheelReleaseOnEdges: false, + mousewheelInvert: false, + mousewheelForceToAxis: false, + mousewheelSensitivity: 1, + mousewheelEventsTarged: 'container', + // Hash Navigation + hashnav: false, + hashnavWatchState: false, + // History + history: false, + // Commong Nav State + replaceState: false, + // Breakpoints + breakpoints: undefined, + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerColumnFill: 'column', + slidesPerGroup: 1, + centeredSlides: false, + slidesOffsetBefore: 0, // in px + slidesOffsetAfter: 0, // in px + // Round length + roundLengths: false, + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + onlyExternal: false, + threshold: 0, + touchMoveStopPropagation: true, + touchReleaseOnEdges: false, + // Unique Navigation Elements + uniqueNavElements: true, + // Pagination + pagination: null, + paginationElement: 'span', + paginationClickable: false, + paginationHide: false, + paginationBulletRender: null, + paginationProgressRender: null, + paginationFractionRender: null, + paginationCustomRender: null, + paginationType: 'bullets', // 'bullets' or 'progress' or 'fraction' or 'custom' + // Resistance + resistance: true, + resistanceRatio: 0.85, + // Next/prev buttons + nextButton: null, + prevButton: null, + // Progress + watchSlidesProgress: false, + watchSlidesVisibility: false, + // Cursor + grabCursor: false, + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + // Lazy Loading + lazyLoading: false, + lazyLoadingInPrevNext: false, + lazyLoadingInPrevNextAmount: 1, + lazyLoadingOnTransitionStart: false, + // Images + preloadImages: true, + updateOnImagesReady: true, + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + // Control + control: undefined, + controlInverse: false, + controlBy: 'slide', //or 'container' + normalizeSlideIndex: true, + // Swiping/no swiping + allowSwipeToPrev: true, + allowSwipeToNext: true, + swipeHandler: null, //'.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + // Passive Listeners + passiveListeners: true, + // NS + containerModifierClass: 'swiper-container-', // NEW + slideClass: 'swiper-slide', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + bulletClass: 'swiper-pagination-bullet', + bulletActiveClass: 'swiper-pagination-bullet-active', + buttonDisabledClass: 'swiper-button-disabled', + paginationCurrentClass: 'swiper-pagination-current', + paginationTotalClass: 'swiper-pagination-total', + paginationHiddenClass: 'swiper-pagination-hidden', + paginationProgressbarClass: 'swiper-pagination-progressbar', + paginationClickableClass: 'swiper-pagination-clickable', // NEW + paginationModifierClass: 'swiper-pagination-', // NEW + lazyLoadingClass: 'swiper-lazy', + lazyStatusLoadingClass: 'swiper-lazy-loading', + lazyStatusLoadedClass: 'swiper-lazy-loaded', + lazyPreloaderClass: 'swiper-lazy-preloader', + notificationClass: 'swiper-notification', + preloaderClass: 'preloader', + zoomContainerClass: 'swiper-zoom-container', + + // Observer + observer: false, + observeParents: false, + // Accessibility + a11y: false, + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + // Callbacks + runCallbacksOnInit: true + /* + Callbacks: + onInit: function (swiper) + onDestroy: function (swiper) + onBeforeResize: function (swiper) + onAfterResize: function (swiper) + onClick: function (swiper, e) + onTap: function (swiper, e) + onDoubleTap: function (swiper, e) + onSliderMove: function (swiper, e) + onSlideChangeStart: function (swiper) + onSlideChangeEnd: function (swiper) + onTransitionStart: function (swiper) + onTransitionEnd: function (swiper) + onImagesReady: function (swiper) + onProgress: function (swiper, progress) + onTouchStart: function (swiper, e) + onTouchMove: function (swiper, e) + onTouchMoveOpposite: function (swiper, e) + onTouchEnd: function (swiper, e) + onReachBeginning: function (swiper) + onReachEnd: function (swiper) + onSetTransition: function (swiper, duration) + onSetTranslate: function (swiper, translate) + onAutoplayStart: function (swiper) + onAutoplayStop: function (swiper), + onLazyImageLoad: function (swiper, slide, image) + onLazyImageReady: function (swiper, slide, image) + onKeyPress: function (swiper, keyCode) + */ + + }; + var initialVirtualTranslate = params && params.virtualTranslate; + + params = params || {}; + var originalParams = {}; + for (var param in params) { + if (typeof params[param] === 'object' && params[param] !== null && !(params[param].nodeType || params[param] === window || params[param] === document || (typeof Dom7 !== 'undefined' && params[param] instanceof Dom7) || (typeof jQuery !== 'undefined' && params[param] instanceof jQuery))) { + originalParams[param] = {}; + for (var deepParam in params[param]) { + originalParams[param][deepParam] = params[param][deepParam]; + } + } + else { + originalParams[param] = params[param]; + } + } + for (var def in defaults) { + if (typeof params[def] === 'undefined') { + params[def] = defaults[def]; + } + else if (typeof params[def] === 'object') { + for (var deepDef in defaults[def]) { + if (typeof params[def][deepDef] === 'undefined') { + params[def][deepDef] = defaults[def][deepDef]; + } + } + } + } + + // Swiper + var s = this; + + // Params + s.params = params; + s.originalParams = originalParams; + + // Classname + s.classNames = []; + /*========================= + Dom Library and plugins + ===========================*/ + if (typeof $ !== 'undefined' && typeof Dom7 !== 'undefined'){ + $ = Dom7; + } + if (typeof $ === 'undefined') { + if (typeof Dom7 === 'undefined') { + $ = window.Dom7 || window.Zepto || window.jQuery; + } + else { + $ = Dom7; + } + if (!$) return; + } + // Export it to Swiper instance + s.$ = $; + + /*========================= + Breakpoints + ===========================*/ + s.currentBreakpoint = undefined; + s.getActiveBreakpoint = function () { + //Get breakpoint for window width + if (!s.params.breakpoints) return false; + var breakpoint = false; + var points = [], point; + for ( point in s.params.breakpoints ) { + if (s.params.breakpoints.hasOwnProperty(point)) { + points.push(point); + } + } + points.sort(function (a, b) { + return parseInt(a, 10) > parseInt(b, 10); + }); + for (var i = 0; i < points.length; i++) { + point = points[i]; + if (point >= window.innerWidth && !breakpoint) { + breakpoint = point; + } + } + return breakpoint || 'max'; + }; + s.setBreakpoint = function () { + //Set breakpoint for window width and update parameters + var breakpoint = s.getActiveBreakpoint(); + if (breakpoint && s.currentBreakpoint !== breakpoint) { + var breakPointsParams = breakpoint in s.params.breakpoints ? s.params.breakpoints[breakpoint] : s.originalParams; + var needsReLoop = s.params.loop && (breakPointsParams.slidesPerView !== s.params.slidesPerView); + for ( var param in breakPointsParams ) { + s.params[param] = breakPointsParams[param]; + } + s.currentBreakpoint = breakpoint; + if(needsReLoop && s.destroyLoop) { + s.reLoop(true); + } + } + }; + // Set breakpoint on load + if (s.params.breakpoints) { + s.setBreakpoint(); + } + + /*========================= + Preparation - Define Container, Wrapper and Pagination + ===========================*/ + s.container = $(container); + if (s.container.length === 0) return; + if (s.container.length > 1) { + var swipers = []; + s.container.each(function () { + var container = this; + swipers.push(new Swiper(this, params)); + }); + return swipers; + } + + // Save instance in container HTML Element and in data + s.container[0].swiper = s; + s.container.data('swiper', s); + + s.classNames.push(s.params.containerModifierClass + s.params.direction); + + if (s.params.freeMode) { + s.classNames.push(s.params.containerModifierClass + 'free-mode'); + } + if (!s.support.flexbox) { + s.classNames.push(s.params.containerModifierClass + 'no-flexbox'); + s.params.slidesPerColumn = 1; + } + if (s.params.autoHeight) { + s.classNames.push(s.params.containerModifierClass + 'autoheight'); + } + // Enable slides progress when required + if (s.params.parallax || s.params.watchSlidesVisibility) { + s.params.watchSlidesProgress = true; + } + // Max resistance when touchReleaseOnEdges + if (s.params.touchReleaseOnEdges) { + s.params.resistanceRatio = 0; + } + // Coverflow / 3D + if (['cube', 'coverflow', 'flip'].indexOf(s.params.effect) >= 0) { + if (s.support.transforms3d) { + s.params.watchSlidesProgress = true; + s.classNames.push(s.params.containerModifierClass + '3d'); + } + else { + s.params.effect = 'slide'; + } + } + if (s.params.effect !== 'slide') { + s.classNames.push(s.params.containerModifierClass + s.params.effect); + } + if (s.params.effect === 'cube') { + s.params.resistanceRatio = 0; + s.params.slidesPerView = 1; + s.params.slidesPerColumn = 1; + s.params.slidesPerGroup = 1; + s.params.centeredSlides = false; + s.params.spaceBetween = 0; + s.params.virtualTranslate = true; + } + if (s.params.effect === 'fade' || s.params.effect === 'flip') { + s.params.slidesPerView = 1; + s.params.slidesPerColumn = 1; + s.params.slidesPerGroup = 1; + s.params.watchSlidesProgress = true; + s.params.spaceBetween = 0; + if (typeof initialVirtualTranslate === 'undefined') { + s.params.virtualTranslate = true; + } + } + + // Grab Cursor + if (s.params.grabCursor && s.support.touch) { + s.params.grabCursor = false; + } + + // Wrapper + s.wrapper = s.container.children('.' + s.params.wrapperClass); + + // Pagination + if (s.params.pagination) { + s.paginationContainer = $(s.params.pagination); + if (s.params.uniqueNavElements && typeof s.params.pagination === 'string' && s.paginationContainer.length > 1 && s.container.find(s.params.pagination).length === 1) { + s.paginationContainer = s.container.find(s.params.pagination); + } + + if (s.params.paginationType === 'bullets' && s.params.paginationClickable) { + s.paginationContainer.addClass(s.params.paginationModifierClass + 'clickable'); + } + else { + s.params.paginationClickable = false; + } + s.paginationContainer.addClass(s.params.paginationModifierClass + s.params.paginationType); + } + // Next/Prev Buttons + if (s.params.nextButton || s.params.prevButton) { + if (s.params.nextButton) { + s.nextButton = $(s.params.nextButton); + if (s.params.uniqueNavElements && typeof s.params.nextButton === 'string' && s.nextButton.length > 1 && s.container.find(s.params.nextButton).length === 1) { + s.nextButton = s.container.find(s.params.nextButton); + } + } + if (s.params.prevButton) { + s.prevButton = $(s.params.prevButton); + if (s.params.uniqueNavElements && typeof s.params.prevButton === 'string' && s.prevButton.length > 1 && s.container.find(s.params.prevButton).length === 1) { + s.prevButton = s.container.find(s.params.prevButton); + } + } + } + + // Is Horizontal + s.isHorizontal = function () { + return s.params.direction === 'horizontal'; + }; + // s.isH = isH; + + // RTL + s.rtl = s.isHorizontal() && (s.container[0].dir.toLowerCase() === 'rtl' || s.container.css('direction') === 'rtl'); + if (s.rtl) { + s.classNames.push(s.params.containerModifierClass + 'rtl'); + } + + // Wrong RTL support + if (s.rtl) { + s.wrongRTL = s.wrapper.css('display') === '-webkit-box'; + } + + // Columns + if (s.params.slidesPerColumn > 1) { + s.classNames.push(s.params.containerModifierClass + 'multirow'); + } + + // Check for Android + if (s.device.android) { + s.classNames.push(s.params.containerModifierClass + 'android'); + } + + // Add classes + s.container.addClass(s.classNames.join(' ')); + + // Translate + s.translate = 0; + + // Progress + s.progress = 0; + + // Velocity + s.velocity = 0; + + /*========================= + Locks, unlocks + ===========================*/ + s.lockSwipeToNext = function () { + s.params.allowSwipeToNext = false; + if (s.params.allowSwipeToPrev === false && s.params.grabCursor) { + s.unsetGrabCursor(); + } + }; + s.lockSwipeToPrev = function () { + s.params.allowSwipeToPrev = false; + if (s.params.allowSwipeToNext === false && s.params.grabCursor) { + s.unsetGrabCursor(); + } + }; + s.lockSwipes = function () { + s.params.allowSwipeToNext = s.params.allowSwipeToPrev = false; + if (s.params.grabCursor) s.unsetGrabCursor(); + }; + s.unlockSwipeToNext = function () { + s.params.allowSwipeToNext = true; + if (s.params.allowSwipeToPrev === true && s.params.grabCursor) { + s.setGrabCursor(); + } + }; + s.unlockSwipeToPrev = function () { + s.params.allowSwipeToPrev = true; + if (s.params.allowSwipeToNext === true && s.params.grabCursor) { + s.setGrabCursor(); + } + }; + s.unlockSwipes = function () { + s.params.allowSwipeToNext = s.params.allowSwipeToPrev = true; + if (s.params.grabCursor) s.setGrabCursor(); + }; + + /*========================= + Round helper + ===========================*/ + function round(a) { + return Math.floor(a); + } + /*========================= + Set grab cursor + ===========================*/ + s.setGrabCursor = function(moving) { + s.container[0].style.cursor = 'move'; + s.container[0].style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + s.container[0].style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + s.container[0].style.cursor = moving ? 'grabbing': 'grab'; + }; + s.unsetGrabCursor = function () { + s.container[0].style.cursor = ''; + }; + if (s.params.grabCursor) { + s.setGrabCursor(); + } + /*========================= + Update on Images Ready + ===========================*/ + s.imagesToLoad = []; + s.imagesLoaded = 0; + + s.loadImage = function (imgElement, src, srcset, sizes, checkForComplete, callback) { + var image; + function onReady () { + if (callback) callback(); + } + if (!imgElement.complete || !checkForComplete) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + if (sizes) { + image.sizes = sizes; + } + if (srcset) { + image.srcset = srcset; + } + if (src) { + image.src = src; + } + } else { + onReady(); + } + + } else {//image already loaded... + onReady(); + } + }; + s.preloadImages = function () { + s.imagesToLoad = s.container.find('img'); + function _onReady() { + if (typeof s === 'undefined' || s === null || !s) return; + if (s.imagesLoaded !== undefined) s.imagesLoaded++; + if (s.imagesLoaded === s.imagesToLoad.length) { + if (s.params.updateOnImagesReady) s.update(); + s.emit('onImagesReady', s); + } + } + for (var i = 0; i < s.imagesToLoad.length; i++) { + s.loadImage(s.imagesToLoad[i], (s.imagesToLoad[i].currentSrc || s.imagesToLoad[i].getAttribute('src')), (s.imagesToLoad[i].srcset || s.imagesToLoad[i].getAttribute('srcset')), s.imagesToLoad[i].sizes || s.imagesToLoad[i].getAttribute('sizes'), true, _onReady); + } + }; + + /*========================= + Autoplay + ===========================*/ + s.autoplayTimeoutId = undefined; + s.autoplaying = false; + s.autoplayPaused = false; + function autoplay() { + var autoplayDelay = s.params.autoplay; + var activeSlide = s.slides.eq(s.activeIndex); + if (activeSlide.attr('data-swiper-autoplay')) { + autoplayDelay = activeSlide.attr('data-swiper-autoplay') || s.params.autoplay; + } + s.autoplayTimeoutId = setTimeout(function () { + if (s.params.loop) { + s.fixLoop(); + s._slideNext(); + s.emit('onAutoplay', s); + } + else { + if (!s.isEnd) { + s._slideNext(); + s.emit('onAutoplay', s); + } + else { + if (!params.autoplayStopOnLast) { + s._slideTo(0); + s.emit('onAutoplay', s); + } + else { + s.stopAutoplay(); + } + } + } + }, autoplayDelay); + } + s.startAutoplay = function () { + if (typeof s.autoplayTimeoutId !== 'undefined') return false; + if (!s.params.autoplay) return false; + if (s.autoplaying) return false; + s.autoplaying = true; + s.emit('onAutoplayStart', s); + autoplay(); + }; + s.stopAutoplay = function (internal) { + if (!s.autoplayTimeoutId) return; + if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId); + s.autoplaying = false; + s.autoplayTimeoutId = undefined; + s.emit('onAutoplayStop', s); + }; + s.pauseAutoplay = function (speed) { + if (s.autoplayPaused) return; + if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId); + s.autoplayPaused = true; + if (speed === 0) { + s.autoplayPaused = false; + autoplay(); + } + else { + s.wrapper.transitionEnd(function () { + if (!s) return; + s.autoplayPaused = false; + if (!s.autoplaying) { + s.stopAutoplay(); + } + else { + autoplay(); + } + }); + } + }; + /*========================= + Min/Max Translate + ===========================*/ + s.minTranslate = function () { + return (-s.snapGrid[0]); + }; + s.maxTranslate = function () { + return (-s.snapGrid[s.snapGrid.length - 1]); + }; + /*========================= + Slider/slides sizes + ===========================*/ + s.updateAutoHeight = function () { + var activeSlides = []; + var newHeight = 0; + var i; + + // Find slides currently in view + if(s.params.slidesPerView !== 'auto' && s.params.slidesPerView > 1) { + for (i = 0; i < Math.ceil(s.params.slidesPerView); i++) { + var index = s.activeIndex + i; + if(index > s.slides.length) break; + activeSlides.push(s.slides.eq(index)[0]); + } + } else { + activeSlides.push(s.slides.eq(s.activeIndex)[0]); + } + + // Find new height from heighest slide in view + for (i = 0; i < activeSlides.length; i++) { + if (typeof activeSlides[i] !== 'undefined') { + var height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } + + // Update Height + if (newHeight) s.wrapper.css('height', newHeight + 'px'); + }; + s.updateContainerSize = function () { + var width, height; + if (typeof s.params.width !== 'undefined') { + width = s.params.width; + } + else { + width = s.container[0].clientWidth; + } + if (typeof s.params.height !== 'undefined') { + height = s.params.height; + } + else { + height = s.container[0].clientHeight; + } + if (width === 0 && s.isHorizontal() || height === 0 && !s.isHorizontal()) { + return; + } + + //Subtract paddings + width = width - parseInt(s.container.css('padding-left'), 10) - parseInt(s.container.css('padding-right'), 10); + height = height - parseInt(s.container.css('padding-top'), 10) - parseInt(s.container.css('padding-bottom'), 10); + + // Store values + s.width = width; + s.height = height; + s.size = s.isHorizontal() ? s.width : s.height; + }; + + s.updateSlidesSize = function () { + s.slides = s.wrapper.children('.' + s.params.slideClass); + s.snapGrid = []; + s.slidesGrid = []; + s.slidesSizesGrid = []; + + var spaceBetween = s.params.spaceBetween, + slidePosition = -s.params.slidesOffsetBefore, + i, + prevSlideSize = 0, + index = 0; + if (typeof s.size === 'undefined') return; + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * s.size; + } + + s.virtualSize = -spaceBetween; + // reset margins + if (s.rtl) s.slides.css({marginLeft: '', marginTop: ''}); + else s.slides.css({marginRight: '', marginBottom: ''}); + + var slidesNumberEvenToRows; + if (s.params.slidesPerColumn > 1) { + if (Math.floor(s.slides.length / s.params.slidesPerColumn) === s.slides.length / s.params.slidesPerColumn) { + slidesNumberEvenToRows = s.slides.length; + } + else { + slidesNumberEvenToRows = Math.ceil(s.slides.length / s.params.slidesPerColumn) * s.params.slidesPerColumn; + } + if (s.params.slidesPerView !== 'auto' && s.params.slidesPerColumnFill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, s.params.slidesPerView * s.params.slidesPerColumn); + } + } + + // Calc slides + var slideSize; + var slidesPerColumn = s.params.slidesPerColumn; + var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn; + var numFullColumns = slidesPerRow - (s.params.slidesPerColumn * slidesPerRow - s.slides.length); + for (i = 0; i < s.slides.length; i++) { + slideSize = 0; + var slide = s.slides.eq(i); + if (s.params.slidesPerColumn > 1) { + // Set slides order + var newSlideOrderIndex; + var column, row; + if (s.params.slidesPerColumnFill === 'column') { + column = Math.floor(i / slidesPerColumn); + row = i - column * slidesPerColumn; + if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn-1)) { + if (++row >= slidesPerColumn) { + row = 0; + column++; + } + } + newSlideOrderIndex = column + row * slidesNumberEvenToRows / slidesPerColumn; + slide + .css({ + '-webkit-box-ordinal-group': newSlideOrderIndex, + '-moz-box-ordinal-group': newSlideOrderIndex, + '-ms-flex-order': newSlideOrderIndex, + '-webkit-order': newSlideOrderIndex, + 'order': newSlideOrderIndex + }); + } + else { + row = Math.floor(i / slidesPerRow); + column = i - row * slidesPerRow; + } + slide + .css( + 'margin-' + (s.isHorizontal() ? 'top' : 'left'), + (row !== 0 && s.params.spaceBetween) && (s.params.spaceBetween + 'px') + ) + .attr('data-swiper-column', column) + .attr('data-swiper-row', row); + + } + if (slide.css('display') === 'none') continue; + if (s.params.slidesPerView === 'auto') { + slideSize = s.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true); + if (s.params.roundLengths) slideSize = round(slideSize); + } + else { + slideSize = (s.size - (s.params.slidesPerView - 1) * spaceBetween) / s.params.slidesPerView; + if (s.params.roundLengths) slideSize = round(slideSize); + + if (s.isHorizontal()) { + s.slides[i].style.width = slideSize + 'px'; + } + else { + s.slides[i].style.height = slideSize + 'px'; + } + } + s.slides[i].swiperSlideSize = slideSize; + s.slidesSizesGrid.push(slideSize); + + + if (s.params.centeredSlides) { + slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; + if(prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - s.size / 2 - spaceBetween; + if (i === 0) slidePosition = slidePosition - s.size / 2 - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition); + s.slidesGrid.push(slidePosition); + } + else { + if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition); + s.slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + s.virtualSize += slideSize + spaceBetween; + + prevSlideSize = slideSize; + + index ++; + } + s.virtualSize = Math.max(s.virtualSize, s.size) + s.params.slidesOffsetAfter; + var newSlidesGrid; + + if ( + s.rtl && s.wrongRTL && (s.params.effect === 'slide' || s.params.effect === 'coverflow')) { + s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); + } + if (!s.support.flexbox || s.params.setWrapperSize) { + if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); + else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'}); + } + + if (s.params.slidesPerColumn > 1) { + s.virtualSize = (slideSize + s.params.spaceBetween) * slidesNumberEvenToRows; + s.virtualSize = Math.ceil(s.virtualSize / s.params.slidesPerColumn) - s.params.spaceBetween; + if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); + else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'}); + if (s.params.centeredSlides) { + newSlidesGrid = []; + for (i = 0; i < s.snapGrid.length; i++) { + if (s.snapGrid[i] < s.virtualSize + s.snapGrid[0]) newSlidesGrid.push(s.snapGrid[i]); + } + s.snapGrid = newSlidesGrid; + } + } + + // Remove last grid elements depending on width + if (!s.params.centeredSlides) { + newSlidesGrid = []; + for (i = 0; i < s.snapGrid.length; i++) { + if (s.snapGrid[i] <= s.virtualSize - s.size) { + newSlidesGrid.push(s.snapGrid[i]); + } + } + s.snapGrid = newSlidesGrid; + if (Math.floor(s.virtualSize - s.size) - Math.floor(s.snapGrid[s.snapGrid.length - 1]) > 1) { + s.snapGrid.push(s.virtualSize - s.size); + } + } + if (s.snapGrid.length === 0) s.snapGrid = [0]; + + if (s.params.spaceBetween !== 0) { + if (s.isHorizontal()) { + if (s.rtl) s.slides.css({marginLeft: spaceBetween + 'px'}); + else s.slides.css({marginRight: spaceBetween + 'px'}); + } + else s.slides.css({marginBottom: spaceBetween + 'px'}); + } + if (s.params.watchSlidesProgress) { + s.updateSlidesOffset(); + } + }; + s.updateSlidesOffset = function () { + for (var i = 0; i < s.slides.length; i++) { + s.slides[i].swiperSlideOffset = s.isHorizontal() ? s.slides[i].offsetLeft : s.slides[i].offsetTop; + } + }; + + /*========================= + Dynamic Slides Per View + ===========================*/ + s.currentSlidesPerView = function () { + var spv = 1, i, j; + if (s.params.centeredSlides) { + var size = s.slides[s.activeIndex].swiperSlideSize; + var breakLoop; + for (i = s.activeIndex + 1; i < s.slides.length; i++) { + if (s.slides[i] && !breakLoop) { + size += s.slides[i].swiperSlideSize; + spv ++; + if (size > s.size) breakLoop = true; + } + } + for (j = s.activeIndex - 1; j >= 0; j--) { + if (s.slides[j] && !breakLoop) { + size += s.slides[j].swiperSlideSize; + spv ++; + if (size > s.size) breakLoop = true; + } + } + } + else { + for (i = s.activeIndex + 1; i < s.slides.length; i++) { + if (s.slidesGrid[i] - s.slidesGrid[s.activeIndex] < s.size) { + spv++; + } + } + } + return spv; + }; + /*========================= + Slider/slides progress + ===========================*/ + s.updateSlidesProgress = function (translate) { + if (typeof translate === 'undefined') { + translate = s.translate || 0; + } + if (s.slides.length === 0) return; + if (typeof s.slides[0].swiperSlideOffset === 'undefined') s.updateSlidesOffset(); + + var offsetCenter = -translate; + if (s.rtl) offsetCenter = translate; + + // Visible Slides + s.slides.removeClass(s.params.slideVisibleClass); + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides[i]; + var slideProgress = (offsetCenter + (s.params.centeredSlides ? s.minTranslate() : 0) - slide.swiperSlideOffset) / (slide.swiperSlideSize + s.params.spaceBetween); + if (s.params.watchSlidesVisibility) { + var slideBefore = -(offsetCenter - slide.swiperSlideOffset); + var slideAfter = slideBefore + s.slidesSizesGrid[i]; + var isVisible = + (slideBefore >= 0 && slideBefore < s.size) || + (slideAfter > 0 && slideAfter <= s.size) || + (slideBefore <= 0 && slideAfter >= s.size); + if (isVisible) { + s.slides.eq(i).addClass(s.params.slideVisibleClass); + } + } + slide.progress = s.rtl ? -slideProgress : slideProgress; + } + }; + s.updateProgress = function (translate) { + if (typeof translate === 'undefined') { + translate = s.translate || 0; + } + var translatesDiff = s.maxTranslate() - s.minTranslate(); + var wasBeginning = s.isBeginning; + var wasEnd = s.isEnd; + if (translatesDiff === 0) { + s.progress = 0; + s.isBeginning = s.isEnd = true; + } + else { + s.progress = (translate - s.minTranslate()) / (translatesDiff); + s.isBeginning = s.progress <= 0; + s.isEnd = s.progress >= 1; + } + if (s.isBeginning && !wasBeginning) s.emit('onReachBeginning', s); + if (s.isEnd && !wasEnd) s.emit('onReachEnd', s); + + if (s.params.watchSlidesProgress) s.updateSlidesProgress(translate); + s.emit('onProgress', s, s.progress); + }; + s.updateActiveIndex = function () { + var translate = s.rtl ? s.translate : -s.translate; + var newActiveIndex, i, snapIndex; + for (i = 0; i < s.slidesGrid.length; i ++) { + if (typeof s.slidesGrid[i + 1] !== 'undefined') { + if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1] - (s.slidesGrid[i + 1] - s.slidesGrid[i]) / 2) { + newActiveIndex = i; + } + else if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1]) { + newActiveIndex = i + 1; + } + } + else { + if (translate >= s.slidesGrid[i]) { + newActiveIndex = i; + } + } + } + // Normalize slideIndex + if(s.params.normalizeSlideIndex){ + if (newActiveIndex < 0 || typeof newActiveIndex === 'undefined') newActiveIndex = 0; + } + // for (i = 0; i < s.slidesGrid.length; i++) { + // if (- translate >= s.slidesGrid[i]) { + // newActiveIndex = i; + // } + // } + snapIndex = Math.floor(newActiveIndex / s.params.slidesPerGroup); + if (snapIndex >= s.snapGrid.length) snapIndex = s.snapGrid.length - 1; + + if (newActiveIndex === s.activeIndex) { + return; + } + s.snapIndex = snapIndex; + s.previousIndex = s.activeIndex; + s.activeIndex = newActiveIndex; + s.updateClasses(); + s.updateRealIndex(); + }; + s.updateRealIndex = function(){ + s.realIndex = parseInt(s.slides.eq(s.activeIndex).attr('data-swiper-slide-index') || s.activeIndex, 10); + }; + + /*========================= + Classes + ===========================*/ + s.updateClasses = function () { + s.slides.removeClass(s.params.slideActiveClass + ' ' + s.params.slideNextClass + ' ' + s.params.slidePrevClass + ' ' + s.params.slideDuplicateActiveClass + ' ' + s.params.slideDuplicateNextClass + ' ' + s.params.slideDuplicatePrevClass); + var activeSlide = s.slides.eq(s.activeIndex); + // Active classes + activeSlide.addClass(s.params.slideActiveClass); + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(s.params.slideDuplicateClass)) { + s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass); + } + else { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass); + } + } + // Next Slide + var nextSlide = activeSlide.next('.' + s.params.slideClass).addClass(s.params.slideNextClass); + if (s.params.loop && nextSlide.length === 0) { + nextSlide = s.slides.eq(0); + nextSlide.addClass(s.params.slideNextClass); + } + // Prev Slide + var prevSlide = activeSlide.prev('.' + s.params.slideClass).addClass(s.params.slidePrevClass); + if (s.params.loop && prevSlide.length === 0) { + prevSlide = s.slides.eq(-1); + prevSlide.addClass(s.params.slidePrevClass); + } + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(s.params.slideDuplicateClass)) { + s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass); + } + else { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass); + } + if (prevSlide.hasClass(s.params.slideDuplicateClass)) { + s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass); + } + else { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass); + } + } + + // Pagination + if (s.paginationContainer && s.paginationContainer.length > 0) { + // Current/Total + var current, + total = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length; + if (s.params.loop) { + current = Math.ceil((s.activeIndex - s.loopedSlides)/s.params.slidesPerGroup); + if (current > s.slides.length - 1 - s.loopedSlides * 2) { + current = current - (s.slides.length - s.loopedSlides * 2); + } + if (current > total - 1) current = current - total; + if (current < 0 && s.params.paginationType !== 'bullets') current = total + current; + } + else { + if (typeof s.snapIndex !== 'undefined') { + current = s.snapIndex; + } + else { + current = s.activeIndex || 0; + } + } + // Types + if (s.params.paginationType === 'bullets' && s.bullets && s.bullets.length > 0) { + s.bullets.removeClass(s.params.bulletActiveClass); + if (s.paginationContainer.length > 1) { + s.bullets.each(function () { + if ($(this).index() === current) $(this).addClass(s.params.bulletActiveClass); + }); + } + else { + s.bullets.eq(current).addClass(s.params.bulletActiveClass); + } + } + if (s.params.paginationType === 'fraction') { + s.paginationContainer.find('.' + s.params.paginationCurrentClass).text(current + 1); + s.paginationContainer.find('.' + s.params.paginationTotalClass).text(total); + } + if (s.params.paginationType === 'progress') { + var scale = (current + 1) / total, + scaleX = scale, + scaleY = 1; + if (!s.isHorizontal()) { + scaleY = scale; + scaleX = 1; + } + s.paginationContainer.find('.' + s.params.paginationProgressbarClass).transform('translate3d(0,0,0) scaleX(' + scaleX + ') scaleY(' + scaleY + ')').transition(s.params.speed); + } + if (s.params.paginationType === 'custom' && s.params.paginationCustomRender) { + s.paginationContainer.html(s.params.paginationCustomRender(s, current + 1, total)); + s.emit('onPaginationRendered', s, s.paginationContainer[0]); + } + } + + // Next/active buttons + if (!s.params.loop) { + if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { + if (s.isBeginning) { + s.prevButton.addClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.disable(s.prevButton); + } + else { + s.prevButton.removeClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.enable(s.prevButton); + } + } + if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { + if (s.isEnd) { + try { + document.getElementById("btnP").removeAttribute("disabled"); + } + catch { + + } + s.nextButton.addClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.disable(s.nextButton); + } + else { + s.nextButton.removeClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.enable(s.nextButton); + } + } + } + }; + + /*========================= + Pagination + ===========================*/ + s.updatePagination = function () { + if (!s.params.pagination) return; + if (s.paginationContainer && s.paginationContainer.length > 0) { + var paginationHTML = ''; + if (s.params.paginationType === 'bullets') { + var numberOfBullets = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length; + for (var i = 0; i < numberOfBullets; i++) { + if (s.params.paginationBulletRender) { + paginationHTML += s.params.paginationBulletRender(s, i, s.params.bulletClass); + } + else { + paginationHTML += '<' + s.params.paginationElement+' class="' + s.params.bulletClass + '">'; + } + } + s.paginationContainer.html(paginationHTML); + s.bullets = s.paginationContainer.find('.' + s.params.bulletClass); + if (s.params.paginationClickable && s.params.a11y && s.a11y) { + s.a11y.initPagination(); + } + } + if (s.params.paginationType === 'fraction') { + if (s.params.paginationFractionRender) { + paginationHTML = s.params.paginationFractionRender(s, s.params.paginationCurrentClass, s.params.paginationTotalClass); + } + else { + paginationHTML = + '' + + ' / ' + + ''; + } + s.paginationContainer.html(paginationHTML); + } + if (s.params.paginationType === 'progress') { + if (s.params.paginationProgressRender) { + paginationHTML = s.params.paginationProgressRender(s, s.params.paginationProgressbarClass); + } + else { + paginationHTML = ''; + } + s.paginationContainer.html(paginationHTML); + } + if (s.params.paginationType !== 'custom') { + s.emit('onPaginationRendered', s, s.paginationContainer[0]); + } + } + }; + /*========================= + Common update method + ===========================*/ + s.update = function (updateTranslate) { + if (!s) return; + s.updateContainerSize(); + s.updateSlidesSize(); + s.updateProgress(); + s.updatePagination(); + s.updateClasses(); + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.set(); + } + var newTranslate; + function forceSetTranslate() { + var translate = s.rtl ? -s.translate : s.translate; + newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate()); + s.setWrapperTranslate(newTranslate); + s.updateActiveIndex(); + s.updateClasses(); + } + if (updateTranslate) { + var translated; + if (s.controller && s.controller.spline) { + s.controller.spline = undefined; + } + if (s.params.freeMode) { + forceSetTranslate(); + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + } + else { + if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) { + translated = s.slideTo(s.slides.length - 1, 0, false, true); + } + else { + translated = s.slideTo(s.activeIndex, 0, false, true); + } + if (!translated) { + forceSetTranslate(); + } + } + } + else if (s.params.autoHeight) { + s.updateAutoHeight(); + } + }; + + /*========================= + Resize Handler + ===========================*/ + s.onResize = function (forceUpdatePagination) { + if (s.params.onBeforeResize) s.params.onBeforeResize(s); + //Breakpoints + if (s.params.breakpoints) { + s.setBreakpoint(); + } + + // Disable locks on resize + var allowSwipeToPrev = s.params.allowSwipeToPrev; + var allowSwipeToNext = s.params.allowSwipeToNext; + s.params.allowSwipeToPrev = s.params.allowSwipeToNext = true; + + s.updateContainerSize(); + s.updateSlidesSize(); + if (s.params.slidesPerView === 'auto' || s.params.freeMode || forceUpdatePagination) s.updatePagination(); + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.set(); + } + if (s.controller && s.controller.spline) { + s.controller.spline = undefined; + } + var slideChangedBySlideTo = false; + if (s.params.freeMode) { + var newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate()); + s.setWrapperTranslate(newTranslate); + s.updateActiveIndex(); + s.updateClasses(); + + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + } + else { + s.updateClasses(); + if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) { + slideChangedBySlideTo = s.slideTo(s.slides.length - 1, 0, false, true); + } + else { + slideChangedBySlideTo = s.slideTo(s.activeIndex, 0, false, true); + } + } + if (s.params.lazyLoading && !slideChangedBySlideTo && s.lazy) { + s.lazy.load(); + } + // Return locks after resize + s.params.allowSwipeToPrev = allowSwipeToPrev; + s.params.allowSwipeToNext = allowSwipeToNext; + if (s.params.onAfterResize) s.params.onAfterResize(s); + }; + + /*========================= + Events + ===========================*/ + + //Define Touch Events + s.touchEventsDesktop = {start: 'mousedown', move: 'mousemove', end: 'mouseup'}; + if (window.navigator.pointerEnabled) s.touchEventsDesktop = {start: 'pointerdown', move: 'pointermove', end: 'pointerup'}; + else if (window.navigator.msPointerEnabled) s.touchEventsDesktop = {start: 'MSPointerDown', move: 'MSPointerMove', end: 'MSPointerUp'}; + s.touchEvents = { + start : s.support.touch || !s.params.simulateTouch ? 'touchstart' : s.touchEventsDesktop.start, + move : s.support.touch || !s.params.simulateTouch ? 'touchmove' : s.touchEventsDesktop.move, + end : s.support.touch || !s.params.simulateTouch ? 'touchend' : s.touchEventsDesktop.end + }; + + + // WP8 Touch Events Fix + if (window.navigator.pointerEnabled || window.navigator.msPointerEnabled) { + (s.params.touchEventsTarget === 'container' ? s.container : s.wrapper).addClass('swiper-wp8-' + s.params.direction); + } + + // Attach/detach events + s.initEvents = function (detach) { + var actionDom = detach ? 'off' : 'on'; + var action = detach ? 'removeEventListener' : 'addEventListener'; + var touchEventsTarget = s.params.touchEventsTarget === 'container' ? s.container[0] : s.wrapper[0]; + var target = s.support.touch ? touchEventsTarget : document; + + var moveCapture = s.params.nested ? true : false; + + //Touch Events + if (s.browser.ie) { + touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, false); + target[action](s.touchEvents.move, s.onTouchMove, moveCapture); + target[action](s.touchEvents.end, s.onTouchEnd, false); + } + else { + if (s.support.touch) { + var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false; + touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, passiveListener); + touchEventsTarget[action](s.touchEvents.move, s.onTouchMove, moveCapture); + touchEventsTarget[action](s.touchEvents.end, s.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !s.device.ios && !s.device.android) || (params.simulateTouch && !s.support.touch && s.device.ios)) { + touchEventsTarget[action]('mousedown', s.onTouchStart, false); + document[action]('mousemove', s.onTouchMove, moveCapture); + document[action]('mouseup', s.onTouchEnd, false); + } + } + window[action]('resize', s.onResize); + + // Next, Prev, Index + if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { + s.nextButton[actionDom]('click', s.onClickNext); + if (s.params.a11y && s.a11y) s.nextButton[actionDom]('keydown', s.a11y.onEnterKey); + } + if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { + s.prevButton[actionDom]('click', s.onClickPrev); + if (s.params.a11y && s.a11y) s.prevButton[actionDom]('keydown', s.a11y.onEnterKey); + } + if (s.params.pagination && s.params.paginationClickable) { + s.paginationContainer[actionDom]('click', '.' + s.params.bulletClass, s.onClickIndex); + if (s.params.a11y && s.a11y) s.paginationContainer[actionDom]('keydown', '.' + s.params.bulletClass, s.a11y.onEnterKey); + } + + // Prevent Links Clicks + if (s.params.preventClicks || s.params.preventClicksPropagation) touchEventsTarget[action]('click', s.preventClicks, true); + }; + s.attachEvents = function () { + s.initEvents(); + }; + s.detachEvents = function () { + s.initEvents(true); + }; + + /*========================= + Handle Clicks + ===========================*/ + // Prevent Clicks + s.allowClick = true; + s.preventClicks = function (e) { + if (!s.allowClick) { + if (s.params.preventClicks) e.preventDefault(); + if (s.params.preventClicksPropagation && s.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + }; + // Clicks + s.onClickNext = function (e) { + e.preventDefault(); + if (s.isEnd && !s.params.loop) return; + s.slideNext(); + }; + s.onClickPrev = function (e) { + e.preventDefault(); + if (s.isBeginning && !s.params.loop) return; + s.slidePrev(); + }; + s.onClickIndex = function (e) { + e.preventDefault(); + var index = $(this).index() * s.params.slidesPerGroup; + if (s.params.loop) index = index + s.loopedSlides; + s.slideTo(index); + }; + + /*========================= + Handle Touches + ===========================*/ + function findElementInEvent(e, selector) { + var el = $(e.target); + if (!el.is(selector)) { + if (typeof selector === 'string') { + el = el.parents(selector); + } + else if (selector.nodeType) { + var found; + el.parents().each(function (index, _el) { + if (_el === selector) found = selector; + }); + if (!found) return undefined; + else return selector; + } + } + if (el.length === 0) { + return undefined; + } + return el[0]; + } + s.updateClickedSlide = function (e) { + var slide = findElementInEvent(e, '.' + s.params.slideClass); + var slideFound = false; + if (slide) { + for (var i = 0; i < s.slides.length; i++) { + if (s.slides[i] === slide) slideFound = true; + } + } + + if (slide && slideFound) { + s.clickedSlide = slide; + s.clickedIndex = $(slide).index(); + } + else { + s.clickedSlide = undefined; + s.clickedIndex = undefined; + return; + } + if (s.params.slideToClickedSlide && s.clickedIndex !== undefined && s.clickedIndex !== s.activeIndex) { + var slideToIndex = s.clickedIndex, + realIndex, + duplicatedSlides, + slidesPerView = s.params.slidesPerView === 'auto' ? s.currentSlidesPerView() : s.params.slidesPerView; + if (s.params.loop) { + if (s.animating) return; + realIndex = parseInt($(s.clickedSlide).attr('data-swiper-slide-index'), 10); + if (s.params.centeredSlides) { + if ((slideToIndex < s.loopedSlides - slidesPerView/2) || (slideToIndex > s.slides.length - s.loopedSlides + slidesPerView/2)) { + s.fixLoop(); + slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index(); + setTimeout(function () { + s.slideTo(slideToIndex); + }, 0); + } + else { + s.slideTo(slideToIndex); + } + } + else { + if (slideToIndex > s.slides.length - slidesPerView) { + s.fixLoop(); + slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index(); + setTimeout(function () { + s.slideTo(slideToIndex); + }, 0); + } + else { + s.slideTo(slideToIndex); + } + } + } + else { + s.slideTo(slideToIndex); + } + } + }; + + var isTouched, + isMoved, + allowTouchCallbacks, + touchStartTime, + isScrolling, + currentTranslate, + startTranslate, + allowThresholdMove, + // Form elements to match + formElements = 'input, select, textarea, button, video', + // Last click time + lastClickTime = Date.now(), clickTimeout, + //Velocities + velocities = [], + allowMomentumBounce; + + // Animating Flag + s.animating = false; + + // Touches information + s.touches = { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0 + }; + + // Touch handlers + var isTouchEvent, startMoving; + s.onTouchStart = function (e) { + if (e.originalEvent) e = e.originalEvent; + isTouchEvent = e.type === 'touchstart'; + if (!isTouchEvent && 'which' in e && e.which === 3) return; + if (s.params.noSwiping && findElementInEvent(e, '.' + s.params.noSwipingClass)) { + s.allowClick = true; + return; + } + if (s.params.swipeHandler) { + if (!findElementInEvent(e, s.params.swipeHandler)) return; + } + + var startX = s.touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + var startY = s.touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + + // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore + if(s.device.ios && s.params.iOSEdgeSwipeDetection && startX <= s.params.iOSEdgeSwipeThreshold) { + return; + } + + isTouched = true; + isMoved = false; + allowTouchCallbacks = true; + isScrolling = undefined; + startMoving = undefined; + s.touches.startX = startX; + s.touches.startY = startY; + touchStartTime = Date.now(); + s.allowClick = true; + s.updateContainerSize(); + s.swipeDirection = undefined; + if (s.params.threshold > 0) allowThresholdMove = false; + if (e.type !== 'touchstart') { + var preventDefault = true; + if ($(e.target).is(formElements)) preventDefault = false; + if (document.activeElement && $(document.activeElement).is(formElements)) { + document.activeElement.blur(); + } + if (preventDefault) { + e.preventDefault(); + } + } + s.emit('onTouchStart', s, e); + }; + + s.onTouchMove = function (e) { + if (e.originalEvent) e = e.originalEvent; + if (isTouchEvent && e.type === 'mousemove') return; + if (e.preventedByNestedSwiper) { + s.touches.startX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + s.touches.startY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + return; + } + if (s.params.onlyExternal) { + // isMoved = true; + s.allowClick = false; + if (isTouched) { + s.touches.startX = s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + s.touches.startY = s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + touchStartTime = Date.now(); + } + return; + } + if (isTouchEvent && s.params.touchReleaseOnEdges && !s.params.loop) { + if (!s.isHorizontal()) { + // Vertical + if ( + (s.touches.currentY < s.touches.startY && s.translate <= s.maxTranslate()) || + (s.touches.currentY > s.touches.startY && s.translate >= s.minTranslate()) + ) { + return; + } + } + else { + if ( + (s.touches.currentX < s.touches.startX && s.translate <= s.maxTranslate()) || + (s.touches.currentX > s.touches.startX && s.translate >= s.minTranslate()) + ) { + return; + } + } + } + if (isTouchEvent && document.activeElement) { + if (e.target === document.activeElement && $(e.target).is(formElements)) { + isMoved = true; + s.allowClick = false; + return; + } + } + if (allowTouchCallbacks) { + s.emit('onTouchMove', s, e); + } + if (e.targetTouches && e.targetTouches.length > 1) return; + + s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (typeof isScrolling === 'undefined') { + var touchAngle; + if (s.isHorizontal() && s.touches.currentY === s.touches.startY || !s.isHorizontal() && s.touches.currentX === s.touches.startX) { + isScrolling = false; + } + else { + touchAngle = Math.atan2(Math.abs(s.touches.currentY - s.touches.startY), Math.abs(s.touches.currentX - s.touches.startX)) * 180 / Math.PI; + isScrolling = s.isHorizontal() ? touchAngle > s.params.touchAngle : (90 - touchAngle > s.params.touchAngle); + } + } + if (isScrolling) { + s.emit('onTouchMoveOpposite', s, e); + } + if (typeof startMoving === 'undefined') { + if (s.touches.currentX !== s.touches.startX || s.touches.currentY !== s.touches.startY) { + startMoving = true; + } + } + if (!isTouched) return; + if (isScrolling) { + isTouched = false; + return; + } + if (!startMoving) { + return; + } + s.allowClick = false; + s.emit('onSliderMove', s, e); + e.preventDefault(); + if (s.params.touchMoveStopPropagation && !s.params.nested) { + e.stopPropagation(); + } + + if (!isMoved) { + if (params.loop) { + s.fixLoop(); + } + startTranslate = s.getWrapperTranslate(); + s.setWrapperTransition(0); + if (s.animating) { + s.wrapper.trigger('webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd msTransitionEnd'); + } + if (s.params.autoplay && s.autoplaying) { + if (s.params.autoplayDisableOnInteraction) { + s.stopAutoplay(); + } + else { + s.pauseAutoplay(); + } + } + allowMomentumBounce = false; + //Grab Cursor + if (s.params.grabCursor && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) { + s.setGrabCursor(true); + } + } + isMoved = true; + + var diff = s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY; + + diff = diff * s.params.touchRatio; + if (s.rtl) diff = -diff; + + s.swipeDirection = diff > 0 ? 'prev' : 'next'; + currentTranslate = diff + startTranslate; + + var disableParentSwiper = true; + if ((diff > 0 && currentTranslate > s.minTranslate())) { + disableParentSwiper = false; + if (s.params.resistance) currentTranslate = s.minTranslate() - 1 + Math.pow(-s.minTranslate() + startTranslate + diff, s.params.resistanceRatio); + } + else if (diff < 0 && currentTranslate < s.maxTranslate()) { + disableParentSwiper = false; + if (s.params.resistance) currentTranslate = s.maxTranslate() + 1 - Math.pow(s.maxTranslate() - startTranslate - diff, s.params.resistanceRatio); + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } + + // Directions locks + if (!s.params.allowSwipeToNext && s.swipeDirection === 'next' && currentTranslate < startTranslate) { + currentTranslate = startTranslate; + } + if (!s.params.allowSwipeToPrev && s.swipeDirection === 'prev' && currentTranslate > startTranslate) { + currentTranslate = startTranslate; + } + + + // Threshold + if (s.params.threshold > 0) { + if (Math.abs(diff) > s.params.threshold || allowThresholdMove) { + if (!allowThresholdMove) { + allowThresholdMove = true; + s.touches.startX = s.touches.currentX; + s.touches.startY = s.touches.currentY; + currentTranslate = startTranslate; + s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY; + return; + } + } + else { + currentTranslate = startTranslate; + return; + } + } + + if (!s.params.followFinger) return; + + // Update active index in free mode + if (s.params.freeMode || s.params.watchSlidesProgress) { + s.updateActiveIndex(); + } + if (s.params.freeMode) { + //Velocity + if (velocities.length === 0) { + velocities.push({ + position: s.touches[s.isHorizontal() ? 'startX' : 'startY'], + time: touchStartTime + }); + } + velocities.push({ + position: s.touches[s.isHorizontal() ? 'currentX' : 'currentY'], + time: (new window.Date()).getTime() + }); + } + // Update progress + s.updateProgress(currentTranslate); + // Update translate + s.setWrapperTranslate(currentTranslate); + }; + s.onTouchEnd = function (e) { + if (e.originalEvent) e = e.originalEvent; + if (allowTouchCallbacks) { + s.emit('onTouchEnd', s, e); + } + allowTouchCallbacks = false; + if (!isTouched) return; + //Return Grab Cursor + if (s.params.grabCursor && isMoved && isTouched && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) { + s.setGrabCursor(false); + } + + // Time diff + var touchEndTime = Date.now(); + var timeDiff = touchEndTime - touchStartTime; + + // Tap, doubleTap, Click + if (s.allowClick) { + s.updateClickedSlide(e); + s.emit('onTap', s, e); + if (timeDiff < 300 && (touchEndTime - lastClickTime) > 300) { + if (clickTimeout) clearTimeout(clickTimeout); + clickTimeout = setTimeout(function () { + if (!s) return; + if (s.params.paginationHide && s.paginationContainer.length > 0 && !$(e.target).hasClass(s.params.bulletClass)) { + s.paginationContainer.toggleClass(s.params.paginationHiddenClass); + } + s.emit('onClick', s, e); + }, 300); + + } + if (timeDiff < 300 && (touchEndTime - lastClickTime) < 300) { + if (clickTimeout) clearTimeout(clickTimeout); + s.emit('onDoubleTap', s, e); + } + } + + lastClickTime = Date.now(); + setTimeout(function () { + if (s) s.allowClick = true; + }, 0); + + if (!isTouched || !isMoved || !s.swipeDirection || s.touches.diff === 0 || currentTranslate === startTranslate) { + isTouched = isMoved = false; + return; + } + isTouched = isMoved = false; + + var currentPos; + if (s.params.followFinger) { + currentPos = s.rtl ? s.translate : -s.translate; + } + else { + currentPos = -currentTranslate; + } + if (s.params.freeMode) { + if (currentPos < -s.minTranslate()) { + s.slideTo(s.activeIndex); + return; + } + else if (currentPos > -s.maxTranslate()) { + if (s.slides.length < s.snapGrid.length) { + s.slideTo(s.snapGrid.length - 1); + } + else { + s.slideTo(s.slides.length - 1); + } + return; + } + + if (s.params.freeModeMomentum) { + if (velocities.length > 1) { + var lastMoveEvent = velocities.pop(), velocityEvent = velocities.pop(); + + var distance = lastMoveEvent.position - velocityEvent.position; + var time = lastMoveEvent.time - velocityEvent.time; + s.velocity = distance / time; + s.velocity = s.velocity / 2; + if (Math.abs(s.velocity) < s.params.freeModeMinimumVelocity) { + s.velocity = 0; + } + // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + if (time > 150 || (new window.Date().getTime() - lastMoveEvent.time) > 300) { + s.velocity = 0; + } + } else { + s.velocity = 0; + } + s.velocity = s.velocity * s.params.freeModeMomentumVelocityRatio; + + velocities.length = 0; + var momentumDuration = 1000 * s.params.freeModeMomentumRatio; + var momentumDistance = s.velocity * momentumDuration; + + var newPosition = s.translate + momentumDistance; + if (s.rtl) newPosition = - newPosition; + var doBounce = false; + var afterBouncePosition; + var bounceAmount = Math.abs(s.velocity) * 20 * s.params.freeModeMomentumBounceRatio; + if (newPosition < s.maxTranslate()) { + if (s.params.freeModeMomentumBounce) { + if (newPosition + s.maxTranslate() < -bounceAmount) { + newPosition = s.maxTranslate() - bounceAmount; + } + afterBouncePosition = s.maxTranslate(); + doBounce = true; + allowMomentumBounce = true; + } + else { + newPosition = s.maxTranslate(); + } + } + else if (newPosition > s.minTranslate()) { + if (s.params.freeModeMomentumBounce) { + if (newPosition - s.minTranslate() > bounceAmount) { + newPosition = s.minTranslate() + bounceAmount; + } + afterBouncePosition = s.minTranslate(); + doBounce = true; + allowMomentumBounce = true; + } + else { + newPosition = s.minTranslate(); + } + } + else if (s.params.freeModeSticky) { + var j = 0, + nextSlide; + for (j = 0; j < s.snapGrid.length; j += 1) { + if (s.snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + + } + if (Math.abs(s.snapGrid[nextSlide] - newPosition) < Math.abs(s.snapGrid[nextSlide - 1] - newPosition) || s.swipeDirection === 'next') { + newPosition = s.snapGrid[nextSlide]; + } else { + newPosition = s.snapGrid[nextSlide - 1]; + } + if (!s.rtl) newPosition = - newPosition; + } + //Fix duration + if (s.velocity !== 0) { + if (s.rtl) { + momentumDuration = Math.abs((-newPosition - s.translate) / s.velocity); + } + else { + momentumDuration = Math.abs((newPosition - s.translate) / s.velocity); + } + } + else if (s.params.freeModeSticky) { + s.slideReset(); + return; + } + + if (s.params.freeModeMomentumBounce && doBounce) { + s.updateProgress(afterBouncePosition); + s.setWrapperTransition(momentumDuration); + s.setWrapperTranslate(newPosition); + s.onTransitionStart(); + s.animating = true; + s.wrapper.transitionEnd(function () { + if (!s || !allowMomentumBounce) return; + s.emit('onMomentumBounce', s); + + s.setWrapperTransition(s.params.speed); + s.setWrapperTranslate(afterBouncePosition); + s.wrapper.transitionEnd(function () { + if (!s) return; + s.onTransitionEnd(); + }); + }); + } else if (s.velocity) { + s.updateProgress(newPosition); + s.setWrapperTransition(momentumDuration); + s.setWrapperTranslate(newPosition); + s.onTransitionStart(); + if (!s.animating) { + s.animating = true; + s.wrapper.transitionEnd(function () { + if (!s) return; + s.onTransitionEnd(); + }); + } + + } else { + s.updateProgress(newPosition); + } + + s.updateActiveIndex(); + } + if (!s.params.freeModeMomentum || timeDiff >= s.params.longSwipesMs) { + s.updateProgress(); + s.updateActiveIndex(); + } + return; + } + + // Find current slide + var i, stopIndex = 0, groupSize = s.slidesSizesGrid[0]; + for (i = 0; i < s.slidesGrid.length; i += s.params.slidesPerGroup) { + if (typeof s.slidesGrid[i + s.params.slidesPerGroup] !== 'undefined') { + if (currentPos >= s.slidesGrid[i] && currentPos < s.slidesGrid[i + s.params.slidesPerGroup]) { + stopIndex = i; + groupSize = s.slidesGrid[i + s.params.slidesPerGroup] - s.slidesGrid[i]; + } + } + else { + if (currentPos >= s.slidesGrid[i]) { + stopIndex = i; + groupSize = s.slidesGrid[s.slidesGrid.length - 1] - s.slidesGrid[s.slidesGrid.length - 2]; + } + } + } + + // Find current slide size + var ratio = (currentPos - s.slidesGrid[stopIndex]) / groupSize; + + if (timeDiff > s.params.longSwipesMs) { + // Long touches + if (!s.params.longSwipes) { + s.slideTo(s.activeIndex); + return; + } + if (s.swipeDirection === 'next') { + if (ratio >= s.params.longSwipesRatio) s.slideTo(stopIndex + s.params.slidesPerGroup); + else s.slideTo(stopIndex); + + } + if (s.swipeDirection === 'prev') { + if (ratio > (1 - s.params.longSwipesRatio)) s.slideTo(stopIndex + s.params.slidesPerGroup); + else s.slideTo(stopIndex); + } + } + else { + // Short swipes + if (!s.params.shortSwipes) { + s.slideTo(s.activeIndex); + return; + } + if (s.swipeDirection === 'next') { + s.slideTo(stopIndex + s.params.slidesPerGroup); + + } + if (s.swipeDirection === 'prev') { + s.slideTo(stopIndex); + } + } + }; + /*========================= + Transitions + ===========================*/ + s._slideTo = function (slideIndex, speed) { + return s.slideTo(slideIndex, speed, true, true); + }; + s.slideTo = function (slideIndex, speed, runCallbacks, internal) { + if (typeof runCallbacks === 'undefined') runCallbacks = true; + if (typeof slideIndex === 'undefined') slideIndex = 0; + if (slideIndex < 0) slideIndex = 0; + s.snapIndex = Math.floor(slideIndex / s.params.slidesPerGroup); + if (s.snapIndex >= s.snapGrid.length) s.snapIndex = s.snapGrid.length - 1; + + var translate = - s.snapGrid[s.snapIndex]; + // Stop autoplay + if (s.params.autoplay && s.autoplaying) { + if (internal || !s.params.autoplayDisableOnInteraction) { + s.pauseAutoplay(speed); + } + else { + s.stopAutoplay(); + } + } + // Update progress + s.updateProgress(translate); + + // Normalize slideIndex + if(s.params.normalizeSlideIndex){ + for (var i = 0; i < s.slidesGrid.length; i++) { + if (- Math.floor(translate * 100) >= Math.floor(s.slidesGrid[i] * 100)) { + slideIndex = i; + } + } + } + + // Directions locks + if (!s.params.allowSwipeToNext && translate < s.translate && translate < s.minTranslate()) { + return false; + } + if (!s.params.allowSwipeToPrev && translate > s.translate && translate > s.maxTranslate()) { + if ((s.activeIndex || 0) !== slideIndex ) return false; + } + + // Update Index + if (typeof speed === 'undefined') speed = s.params.speed; + s.previousIndex = s.activeIndex || 0; + s.activeIndex = slideIndex; + s.updateRealIndex(); + if ((s.rtl && -translate === s.translate) || (!s.rtl && translate === s.translate)) { + // Update Height + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + s.updateClasses(); + if (s.params.effect !== 'slide') { + s.setWrapperTranslate(translate); + } + return false; + } + s.updateClasses(); + s.onTransitionStart(runCallbacks); + + if (speed === 0 || s.browser.lteIE9) { + s.setWrapperTranslate(translate); + s.setWrapperTransition(0); + s.onTransitionEnd(runCallbacks); + } + else { + s.setWrapperTranslate(translate); + s.setWrapperTransition(speed); + if (!s.animating) { + s.animating = true; + s.wrapper.transitionEnd(function () { + if (!s) return; + s.onTransitionEnd(runCallbacks); + }); + } + + } + + return true; + }; + + s.onTransitionStart = function (runCallbacks) { + if (typeof runCallbacks === 'undefined') runCallbacks = true; + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + if (s.lazy) s.lazy.onTransitionStart(); + if (runCallbacks) { + s.emit('onTransitionStart', s); + if (s.activeIndex !== s.previousIndex) { + s.emit('onSlideChangeStart', s); + if (s.activeIndex > s.previousIndex) { + s.emit('onSlideNextStart', s); + } + else { + s.emit('onSlidePrevStart', s); + } + } + + } + }; + s.onTransitionEnd = function (runCallbacks) { + s.animating = false; + s.setWrapperTransition(0); + if (typeof runCallbacks === 'undefined') runCallbacks = true; + if (s.lazy) s.lazy.onTransitionEnd(); + if (runCallbacks) { + s.emit('onTransitionEnd', s); + if (s.activeIndex !== s.previousIndex) { + s.emit('onSlideChangeEnd', s); + if (s.activeIndex > s.previousIndex) { + s.emit('onSlideNextEnd', s); + } + else { + s.emit('onSlidePrevEnd', s); + } + } + } + if (s.params.history && s.history) { + s.history.setHistory(s.params.history, s.activeIndex); + } + if (s.params.hashnav && s.hashnav) { + s.hashnav.setHash(); + } + + }; + s.slideNext = function (runCallbacks, speed, internal) { + if (s.params.loop) { + if (s.animating) return false; + s.fixLoop(); + var clientLeft = s.container[0].clientLeft; + return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal); + } + else return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal); + }; + s._slideNext = function (speed) { + return s.slideNext(true, speed, true); + }; + s.slidePrev = function (runCallbacks, speed, internal) { + if (s.params.loop) { + if (s.animating) return false; + s.fixLoop(); + var clientLeft = s.container[0].clientLeft; + return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal); + } + else return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal); + }; + s._slidePrev = function (speed) { + return s.slidePrev(true, speed, true); + }; + s.slideReset = function (runCallbacks, speed, internal) { + return s.slideTo(s.activeIndex, speed, runCallbacks); + }; + + s.disableTouchControl = function () { + s.params.onlyExternal = true; + return true; + }; + s.enableTouchControl = function () { + s.params.onlyExternal = false; + return true; + }; + + /*========================= + Translate/transition helpers + ===========================*/ + s.setWrapperTransition = function (duration, byController) { + s.wrapper.transition(duration); + if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { + s.effects[s.params.effect].setTransition(duration); + } + if (s.params.parallax && s.parallax) { + s.parallax.setTransition(duration); + } + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.setTransition(duration); + } + if (s.params.control && s.controller) { + s.controller.setTransition(duration, byController); + } + s.emit('onSetTransition', s, duration); + }; + s.setWrapperTranslate = function (translate, updateActiveIndex, byController) { + var x = 0, y = 0, z = 0; + if (s.isHorizontal()) { + x = s.rtl ? -translate : translate; + } + else { + y = translate; + } + + if (s.params.roundLengths) { + x = round(x); + y = round(y); + } + + if (!s.params.virtualTranslate) { + if (s.support.transforms3d) s.wrapper.transform('translate3d(' + x + 'px, ' + y + 'px, ' + z + 'px)'); + else s.wrapper.transform('translate(' + x + 'px, ' + y + 'px)'); + } + + s.translate = s.isHorizontal() ? x : y; + + // Check if we need to update progress + var progress; + var translatesDiff = s.maxTranslate() - s.minTranslate(); + if (translatesDiff === 0) { + progress = 0; + } + else { + progress = (translate - s.minTranslate()) / (translatesDiff); + } + if (progress !== s.progress) { + s.updateProgress(translate); + } + + if (updateActiveIndex) s.updateActiveIndex(); + if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { + s.effects[s.params.effect].setTranslate(s.translate); + } + if (s.params.parallax && s.parallax) { + s.parallax.setTranslate(s.translate); + } + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.setTranslate(s.translate); + } + if (s.params.control && s.controller) { + s.controller.setTranslate(s.translate, byController); + } + s.emit('onSetTranslate', s, s.translate); + }; + + s.getTranslate = function (el, axis) { + var matrix, curTransform, curStyle, transformMatrix; + + // automatic axis detection + if (typeof axis === 'undefined') { + axis = 'x'; + } + + if (s.params.virtualTranslate) { + return s.rtl ? -s.translate : s.translate; + } + + curStyle = window.getComputedStyle(el, null); + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(function(a){ + return a.replace(',','.'); + }).join(', '); + } + // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } + else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + //Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) + curTransform = transformMatrix.m41; + //Crazy IE10 Matrix + else if (matrix.length === 16) + curTransform = parseFloat(matrix[12]); + //Normal Browsers + else + curTransform = parseFloat(matrix[4]); + } + if (axis === 'y') { + //Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) + curTransform = transformMatrix.m42; + //Crazy IE10 Matrix + else if (matrix.length === 16) + curTransform = parseFloat(matrix[13]); + //Normal Browsers + else + curTransform = parseFloat(matrix[5]); + } + if (s.rtl && curTransform) curTransform = -curTransform; + return curTransform || 0; + }; + s.getWrapperTranslate = function (axis) { + if (typeof axis === 'undefined') { + axis = s.isHorizontal() ? 'x' : 'y'; + } + return s.getTranslate(s.wrapper[0], axis); + }; + + /*========================= + Observer + ===========================*/ + s.observers = []; + function initObserver(target, options) { + options = options || {}; + // create an observer instance + var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; + var observer = new ObserverFunc(function (mutations) { + mutations.forEach(function (mutation) { + s.onResize(true); + s.emit('onObserverUpdate', s, mutation); + }); + }); + + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData + }); + + s.observers.push(observer); + } + s.initObservers = function () { + if (s.params.observeParents) { + var containerParents = s.container.parents(); + for (var i = 0; i < containerParents.length; i++) { + initObserver(containerParents[i]); + } + } + + // Observe container + initObserver(s.container[0], {childList: false}); + + // Observe wrapper + initObserver(s.wrapper[0], {attributes: false}); + }; + s.disconnectObservers = function () { + for (var i = 0; i < s.observers.length; i++) { + s.observers[i].disconnect(); + } + s.observers = []; + }; + /*========================= + Loop + ===========================*/ + // Create looped slides + s.createLoop = function () { + // Remove duplicated slides + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove(); + + var slides = s.wrapper.children('.' + s.params.slideClass); + + if(s.params.slidesPerView === 'auto' && !s.params.loopedSlides) s.params.loopedSlides = slides.length; + + s.loopedSlides = parseInt(s.params.loopedSlides || s.params.slidesPerView, 10); + s.loopedSlides = s.loopedSlides + s.params.loopAdditionalSlides; + if (s.loopedSlides > slides.length) { + s.loopedSlides = slides.length; + } + + var prependSlides = [], appendSlides = [], i; + slides.each(function (index, el) { + var slide = $(this); + if (index < s.loopedSlides) appendSlides.push(el); + if (index < slides.length && index >= slides.length - s.loopedSlides) prependSlides.push(el); + slide.attr('data-swiper-slide-index', index); + }); + for (i = 0; i < appendSlides.length; i++) { + s.wrapper.append($(appendSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass)); + } + for (i = prependSlides.length - 1; i >= 0; i--) { + s.wrapper.prepend($(prependSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass)); + } + }; + s.destroyLoop = function () { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove(); + s.slides.removeAttr('data-swiper-slide-index'); + }; + s.reLoop = function (updatePosition) { + var oldIndex = s.activeIndex - s.loopedSlides; + s.destroyLoop(); + s.createLoop(); + s.updateSlidesSize(); + if (updatePosition) { + s.slideTo(oldIndex + s.loopedSlides, 0, false); + } + + }; + s.fixLoop = function () { + var newIndex; + //Fix For Negative Oversliding + if (s.activeIndex < s.loopedSlides) { + newIndex = s.slides.length - s.loopedSlides * 3 + s.activeIndex; + newIndex = newIndex + s.loopedSlides; + s.slideTo(newIndex, 0, false, true); + } + //Fix For Positive Oversliding + else if ((s.params.slidesPerView === 'auto' && s.activeIndex >= s.loopedSlides * 2) || (s.activeIndex > s.slides.length - s.params.slidesPerView * 2)) { + newIndex = -s.slides.length + s.activeIndex + s.loopedSlides; + newIndex = newIndex + s.loopedSlides; + s.slideTo(newIndex, 0, false, true); + } + }; + /*========================= + Append/Prepend/Remove Slides + ===========================*/ + s.appendSlide = function (slides) { + if (s.params.loop) { + s.destroyLoop(); + } + if (typeof slides === 'object' && slides.length) { + for (var i = 0; i < slides.length; i++) { + if (slides[i]) s.wrapper.append(slides[i]); + } + } + else { + s.wrapper.append(slides); + } + if (s.params.loop) { + s.createLoop(); + } + if (!(s.params.observer && s.support.observer)) { + s.update(true); + } + }; + s.prependSlide = function (slides) { + if (s.params.loop) { + s.destroyLoop(); + } + var newActiveIndex = s.activeIndex + 1; + if (typeof slides === 'object' && slides.length) { + for (var i = 0; i < slides.length; i++) { + if (slides[i]) s.wrapper.prepend(slides[i]); + } + newActiveIndex = s.activeIndex + slides.length; + } + else { + s.wrapper.prepend(slides); + } + if (s.params.loop) { + s.createLoop(); + } + if (!(s.params.observer && s.support.observer)) { + s.update(true); + } + s.slideTo(newActiveIndex, 0, false); + }; + s.removeSlide = function (slidesIndexes) { + if (s.params.loop) { + s.destroyLoop(); + s.slides = s.wrapper.children('.' + s.params.slideClass); + } + var newActiveIndex = s.activeIndex, + indexToRemove; + if (typeof slidesIndexes === 'object' && slidesIndexes.length) { + for (var i = 0; i < slidesIndexes.length; i++) { + indexToRemove = slidesIndexes[i]; + if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex--; + } + newActiveIndex = Math.max(newActiveIndex, 0); + } + else { + indexToRemove = slidesIndexes; + if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex--; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (s.params.loop) { + s.createLoop(); + } + + if (!(s.params.observer && s.support.observer)) { + s.update(true); + } + if (s.params.loop) { + s.slideTo(newActiveIndex + s.loopedSlides, 0, false); + } + else { + s.slideTo(newActiveIndex, 0, false); + } + + }; + s.removeAllSlides = function () { + var slidesIndexes = []; + for (var i = 0; i < s.slides.length; i++) { + slidesIndexes.push(i); + } + s.removeSlide(slidesIndexes); + }; + + + /*========================= + Effects + ===========================*/ + s.effects = { + fade: { + setTranslate: function () { + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides.eq(i); + var offset = slide[0].swiperSlideOffset; + var tx = -offset; + if (!s.params.virtualTranslate) tx = tx - s.translate; + var ty = 0; + if (!s.isHorizontal()) { + ty = tx; + tx = 0; + } + var slideOpacity = s.params.fade.crossFade ? + Math.max(1 - Math.abs(slide[0].progress), 0) : + 1 + Math.min(Math.max(slide[0].progress, -1), 0); + slide + .css({ + opacity: slideOpacity + }) + .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px)'); + + } + + }, + setTransition: function (duration) { + s.slides.transition(duration); + if (s.params.virtualTranslate && duration !== 0) { + var eventTriggered = false; + s.slides.transitionEnd(function () { + if (eventTriggered) return; + if (!s) return; + eventTriggered = true; + s.animating = false; + var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd']; + for (var i = 0; i < triggerEvents.length; i++) { + s.wrapper.trigger(triggerEvents[i]); + } + }); + } + } + }, + flip: { + setTranslate: function () { + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides.eq(i); + var progress = slide[0].progress; + if (s.params.flip.limitRotation) { + progress = Math.max(Math.min(slide[0].progress, 1), -1); + } + var offset = slide[0].swiperSlideOffset; + var rotate = -180 * progress, + rotateY = rotate, + rotateX = 0, + tx = -offset, + ty = 0; + if (!s.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } + else if (s.rtl) { + rotateY = -rotateY; + } + + slide[0].style.zIndex = -Math.abs(Math.round(progress)) + s.slides.length; + + if (s.params.flip.slideShadows) { + //Set shadows + var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); + var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $('
    '); + slide.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $('
    '); + slide.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + + slide + .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)'); + } + }, + setTransition: function (duration) { + s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + if (s.params.virtualTranslate && duration !== 0) { + var eventTriggered = false; + s.slides.eq(s.activeIndex).transitionEnd(function () { + if (eventTriggered) return; + if (!s) return; + if (!$(this).hasClass(s.params.slideActiveClass)) return; + eventTriggered = true; + s.animating = false; + var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd']; + for (var i = 0; i < triggerEvents.length; i++) { + s.wrapper.trigger(triggerEvents[i]); + } + }); + } + } + }, + cube: { + setTranslate: function () { + var wrapperRotate = 0, cubeShadow; + if (s.params.cube.shadow) { + if (s.isHorizontal()) { + cubeShadow = s.wrapper.find('.swiper-cube-shadow'); + if (cubeShadow.length === 0) { + cubeShadow = $('
    '); + s.wrapper.append(cubeShadow); + } + cubeShadow.css({height: s.width + 'px'}); + } + else { + cubeShadow = s.container.find('.swiper-cube-shadow'); + if (cubeShadow.length === 0) { + cubeShadow = $('
    '); + s.container.append(cubeShadow); + } + } + } + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides.eq(i); + var slideAngle = i * 90; + var round = Math.floor(slideAngle / 360); + if (s.rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + var progress = Math.max(Math.min(slide[0].progress, 1), -1); + var tx = 0, ty = 0, tz = 0; + if (i % 4 === 0) { + tx = - round * 4 * s.size; + tz = 0; + } + else if ((i - 1) % 4 === 0) { + tx = 0; + tz = - round * 4 * s.size; + } + else if ((i - 2) % 4 === 0) { + tx = s.size + round * 4 * s.size; + tz = s.size; + } + else if ((i - 3) % 4 === 0) { + tx = - s.size; + tz = 3 * s.size + s.size * 4 * round; + } + if (s.rtl) { + tx = -tx; + } + + if (!s.isHorizontal()) { + ty = tx; + tx = 0; + } + + var transform = 'rotateX(' + (s.isHorizontal() ? 0 : -slideAngle) + 'deg) rotateY(' + (s.isHorizontal() ? slideAngle : 0) + 'deg) translate3d(' + tx + 'px, ' + ty + 'px, ' + tz + 'px)'; + if (progress <= 1 && progress > -1) { + wrapperRotate = i * 90 + progress * 90; + if (s.rtl) wrapperRotate = -i * 90 - progress * 90; + } + slide.transform(transform); + if (s.params.cube.slideShadows) { + //Set shadows + var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); + var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $('
    '); + slide.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $('
    '); + slide.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + s.wrapper.css({ + '-webkit-transform-origin': '50% 50% -' + (s.size / 2) + 'px', + '-moz-transform-origin': '50% 50% -' + (s.size / 2) + 'px', + '-ms-transform-origin': '50% 50% -' + (s.size / 2) + 'px', + 'transform-origin': '50% 50% -' + (s.size / 2) + 'px' + }); + + if (s.params.cube.shadow) { + if (s.isHorizontal()) { + cubeShadow.transform('translate3d(0px, ' + (s.width / 2 + s.params.cube.shadowOffset) + 'px, ' + (-s.width / 2) + 'px) rotateX(90deg) rotateZ(0deg) scale(' + (s.params.cube.shadowScale) + ')'); + } + else { + var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90; + var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2); + var scale1 = s.params.cube.shadowScale, + scale2 = s.params.cube.shadowScale / multiplier, + offset = s.params.cube.shadowOffset; + cubeShadow.transform('scale3d(' + scale1 + ', 1, ' + scale2 + ') translate3d(0px, ' + (s.height / 2 + offset) + 'px, ' + (-s.height / 2 / scale2) + 'px) rotateX(-90deg)'); + } + } + var zFactor = (s.isSafari || s.isUiWebView) ? (-s.size / 2) : 0; + s.wrapper.transform('translate3d(0px,0,' + zFactor + 'px) rotateX(' + (s.isHorizontal() ? 0 : wrapperRotate) + 'deg) rotateY(' + (s.isHorizontal() ? -wrapperRotate : 0) + 'deg)'); + }, + setTransition: function (duration) { + s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + if (s.params.cube.shadow && !s.isHorizontal()) { + s.container.find('.swiper-cube-shadow').transition(duration); + } + } + }, + coverflow: { + setTranslate: function () { + var transform = s.translate; + var center = s.isHorizontal() ? -transform + s.width / 2 : -transform + s.height / 2; + var rotate = s.isHorizontal() ? s.params.coverflow.rotate: -s.params.coverflow.rotate; + var translate = s.params.coverflow.depth; + //Each slide offset from center + for (var i = 0, length = s.slides.length; i < length; i++) { + var slide = s.slides.eq(i); + var slideSize = s.slidesSizesGrid[i]; + var slideOffset = slide[0].swiperSlideOffset; + var offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * s.params.coverflow.modifier; + + var rotateY = s.isHorizontal() ? rotate * offsetMultiplier : 0; + var rotateX = s.isHorizontal() ? 0 : rotate * offsetMultiplier; + // var rotateZ = 0 + var translateZ = -translate * Math.abs(offsetMultiplier); + + var translateY = s.isHorizontal() ? 0 : s.params.coverflow.stretch * (offsetMultiplier); + var translateX = s.isHorizontal() ? s.params.coverflow.stretch * (offsetMultiplier) : 0; + + //Fix for ultra small values + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + + var slideTransform = 'translate3d(' + translateX + 'px,' + translateY + 'px,' + translateZ + 'px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)'; + + slide.transform(slideTransform); + slide[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + if (s.params.coverflow.slideShadows) { + //Set shadows + var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); + var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $('
    '); + slide.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $('
    '); + slide.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; + if (shadowAfter.length) shadowAfter[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; + } + } + + //Set correct perspective for IE10 + if (s.browser.ie) { + var ws = s.wrapper[0].style; + ws.perspectiveOrigin = center + 'px 50%'; + } + }, + setTransition: function (duration) { + s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + } + } + }; + + + /*========================= + Images Lazy Loading + ===========================*/ + s.lazy = { + initialImageLoaded: false, + loadImageInSlide: function (index, loadInDuplicate) { + if (typeof index === 'undefined') return; + if (typeof loadInDuplicate === 'undefined') loadInDuplicate = true; + if (s.slides.length === 0) return; + + var slide = s.slides.eq(index); + var img = slide.find('.' + s.params.lazyLoadingClass + ':not(.' + s.params.lazyStatusLoadedClass + '):not(.' + s.params.lazyStatusLoadingClass + ')'); + if (slide.hasClass(s.params.lazyLoadingClass) && !slide.hasClass(s.params.lazyStatusLoadedClass) && !slide.hasClass(s.params.lazyStatusLoadingClass)) { + img = img.add(slide[0]); + } + if (img.length === 0) return; + + img.each(function () { + var _img = $(this); + _img.addClass(s.params.lazyStatusLoadingClass); + var background = _img.attr('data-background'); + var src = _img.attr('data-src'), + srcset = _img.attr('data-srcset'), + sizes = _img.attr('data-sizes'); + s.loadImage(_img[0], (src || background), srcset, sizes, false, function () { + if (typeof s === 'undefined' || s === null || !s) return; + if (background) { + _img.css('background-image', 'url("' + background + '")'); + _img.removeAttr('data-background'); + } + else { + if (srcset) { + _img.attr('srcset', srcset); + _img.removeAttr('data-srcset'); + } + if (sizes) { + _img.attr('sizes', sizes); + _img.removeAttr('data-sizes'); + } + if (src) { + _img.attr('src', src); + _img.removeAttr('data-src'); + } + + } + + _img.addClass(s.params.lazyStatusLoadedClass).removeClass(s.params.lazyStatusLoadingClass); + slide.find('.' + s.params.lazyPreloaderClass + ', .' + s.params.preloaderClass).remove(); + if (s.params.loop && loadInDuplicate) { + var slideOriginalIndex = slide.attr('data-swiper-slide-index'); + if (slide.hasClass(s.params.slideDuplicateClass)) { + var originalSlide = s.wrapper.children('[data-swiper-slide-index="' + slideOriginalIndex + '"]:not(.' + s.params.slideDuplicateClass + ')'); + s.lazy.loadImageInSlide(originalSlide.index(), false); + } + else { + var duplicatedSlide = s.wrapper.children('.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + slideOriginalIndex + '"]'); + s.lazy.loadImageInSlide(duplicatedSlide.index(), false); + } + } + s.emit('onLazyImageReady', s, slide[0], _img[0]); + }); + + s.emit('onLazyImageLoad', s, slide[0], _img[0]); + }); + + }, + load: function () { + var i; + var slidesPerView = s.params.slidesPerView; + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + if (!s.lazy.initialImageLoaded) s.lazy.initialImageLoaded = true; + if (s.params.watchSlidesVisibility) { + s.wrapper.children('.' + s.params.slideVisibleClass).each(function () { + s.lazy.loadImageInSlide($(this).index()); + }); + } + else { + if (slidesPerView > 1) { + for (i = s.activeIndex; i < s.activeIndex + slidesPerView ; i++) { + if (s.slides[i]) s.lazy.loadImageInSlide(i); + } + } + else { + s.lazy.loadImageInSlide(s.activeIndex); + } + } + if (s.params.lazyLoadingInPrevNext) { + if (slidesPerView > 1 || (s.params.lazyLoadingInPrevNextAmount && s.params.lazyLoadingInPrevNextAmount > 1)) { + var amount = s.params.lazyLoadingInPrevNextAmount; + var spv = slidesPerView; + var maxIndex = Math.min(s.activeIndex + spv + Math.max(amount, spv), s.slides.length); + var minIndex = Math.max(s.activeIndex - Math.max(spv, amount), 0); + // Next Slides + for (i = s.activeIndex + slidesPerView; i < maxIndex; i++) { + if (s.slides[i]) s.lazy.loadImageInSlide(i); + } + // Prev Slides + for (i = minIndex; i < s.activeIndex ; i++) { + if (s.slides[i]) s.lazy.loadImageInSlide(i); + } + } + else { + var nextSlide = s.wrapper.children('.' + s.params.slideNextClass); + if (nextSlide.length > 0) s.lazy.loadImageInSlide(nextSlide.index()); + + var prevSlide = s.wrapper.children('.' + s.params.slidePrevClass); + if (prevSlide.length > 0) s.lazy.loadImageInSlide(prevSlide.index()); + } + } + }, + onTransitionStart: function () { + if (s.params.lazyLoading) { + if (s.params.lazyLoadingOnTransitionStart || (!s.params.lazyLoadingOnTransitionStart && !s.lazy.initialImageLoaded)) { + s.lazy.load(); + } + } + }, + onTransitionEnd: function () { + if (s.params.lazyLoading && !s.params.lazyLoadingOnTransitionStart) { + s.lazy.load(); + } + } + }; + + + /*========================= + Scrollbar + ===========================*/ + s.scrollbar = { + isTouched: false, + setDragPosition: function (e) { + var sb = s.scrollbar; + var x = 0, y = 0; + var translate; + var pointerPosition = s.isHorizontal() ? + ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX) : + ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY) ; + var position = (pointerPosition) - sb.track.offset()[s.isHorizontal() ? 'left' : 'top'] - sb.dragSize / 2; + var positionMin = -s.minTranslate() * sb.moveDivider; + var positionMax = -s.maxTranslate() * sb.moveDivider; + if (position < positionMin) { + position = positionMin; + } + else if (position > positionMax) { + position = positionMax; + } + position = -position / sb.moveDivider; + s.updateProgress(position); + s.setWrapperTranslate(position, true); + }, + dragStart: function (e) { + var sb = s.scrollbar; + sb.isTouched = true; + e.preventDefault(); + e.stopPropagation(); + + sb.setDragPosition(e); + clearTimeout(sb.dragTimeout); + + sb.track.transition(0); + if (s.params.scrollbarHide) { + sb.track.css('opacity', 1); + } + s.wrapper.transition(100); + sb.drag.transition(100); + s.emit('onScrollbarDragStart', s); + }, + dragMove: function (e) { + var sb = s.scrollbar; + if (!sb.isTouched) return; + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + sb.setDragPosition(e); + s.wrapper.transition(0); + sb.track.transition(0); + sb.drag.transition(0); + s.emit('onScrollbarDragMove', s); + }, + dragEnd: function (e) { + var sb = s.scrollbar; + if (!sb.isTouched) return; + sb.isTouched = false; + if (s.params.scrollbarHide) { + clearTimeout(sb.dragTimeout); + sb.dragTimeout = setTimeout(function () { + sb.track.css('opacity', 0); + sb.track.transition(400); + }, 1000); + + } + s.emit('onScrollbarDragEnd', s); + if (s.params.scrollbarSnapOnRelease) { + s.slideReset(); + } + }, + draggableEvents: (function () { + if ((s.params.simulateTouch === false && !s.support.touch)) return s.touchEventsDesktop; + else return s.touchEvents; + })(), + enableDraggable: function () { + var sb = s.scrollbar; + var target = s.support.touch ? sb.track : document; + $(sb.track).on(sb.draggableEvents.start, sb.dragStart); + $(target).on(sb.draggableEvents.move, sb.dragMove); + $(target).on(sb.draggableEvents.end, sb.dragEnd); + }, + disableDraggable: function () { + var sb = s.scrollbar; + var target = s.support.touch ? sb.track : document; + $(sb.track).off(sb.draggableEvents.start, sb.dragStart); + $(target).off(sb.draggableEvents.move, sb.dragMove); + $(target).off(sb.draggableEvents.end, sb.dragEnd); + }, + set: function () { + if (!s.params.scrollbar) return; + var sb = s.scrollbar; + sb.track = $(s.params.scrollbar); + if (s.params.uniqueNavElements && typeof s.params.scrollbar === 'string' && sb.track.length > 1 && s.container.find(s.params.scrollbar).length === 1) { + sb.track = s.container.find(s.params.scrollbar); + } + sb.drag = sb.track.find('.swiper-scrollbar-drag'); + if (sb.drag.length === 0) { + sb.drag = $('
    '); + sb.track.append(sb.drag); + } + sb.drag[0].style.width = ''; + sb.drag[0].style.height = ''; + sb.trackSize = s.isHorizontal() ? sb.track[0].offsetWidth : sb.track[0].offsetHeight; + + sb.divider = s.size / s.virtualSize; + sb.moveDivider = sb.divider * (sb.trackSize / s.size); + sb.dragSize = sb.trackSize * sb.divider; + + if (s.isHorizontal()) { + sb.drag[0].style.width = sb.dragSize + 'px'; + } + else { + sb.drag[0].style.height = sb.dragSize + 'px'; + } + + if (sb.divider >= 1) { + sb.track[0].style.display = 'none'; + } + else { + sb.track[0].style.display = ''; + } + if (s.params.scrollbarHide) { + sb.track[0].style.opacity = 0; + } + }, + setTranslate: function () { + if (!s.params.scrollbar) return; + var diff; + var sb = s.scrollbar; + var translate = s.translate || 0; + var newPos; + + var newSize = sb.dragSize; + newPos = (sb.trackSize - sb.dragSize) * s.progress; + if (s.rtl && s.isHorizontal()) { + newPos = -newPos; + if (newPos > 0) { + newSize = sb.dragSize - newPos; + newPos = 0; + } + else if (-newPos + sb.dragSize > sb.trackSize) { + newSize = sb.trackSize + newPos; + } + } + else { + if (newPos < 0) { + newSize = sb.dragSize + newPos; + newPos = 0; + } + else if (newPos + sb.dragSize > sb.trackSize) { + newSize = sb.trackSize - newPos; + } + } + if (s.isHorizontal()) { + if (s.support.transforms3d) { + sb.drag.transform('translate3d(' + (newPos) + 'px, 0, 0)'); + } + else { + sb.drag.transform('translateX(' + (newPos) + 'px)'); + } + sb.drag[0].style.width = newSize + 'px'; + } + else { + if (s.support.transforms3d) { + sb.drag.transform('translate3d(0px, ' + (newPos) + 'px, 0)'); + } + else { + sb.drag.transform('translateY(' + (newPos) + 'px)'); + } + sb.drag[0].style.height = newSize + 'px'; + } + if (s.params.scrollbarHide) { + clearTimeout(sb.timeout); + sb.track[0].style.opacity = 1; + sb.timeout = setTimeout(function () { + sb.track[0].style.opacity = 0; + sb.track.transition(400); + }, 1000); + } + }, + setTransition: function (duration) { + if (!s.params.scrollbar) return; + s.scrollbar.drag.transition(duration); + } + }; + + + /*========================= + Controller + ===========================*/ + s.controller = { + LinearSpline: function (x, y) { + var binarySearch = (function() { + var maxIndex, minIndex, guess; + return function(array, val) { + minIndex = -1; + maxIndex = array.length; + while (maxIndex - minIndex > 1) + if (array[guess = maxIndex + minIndex >> 1] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + return maxIndex; + }; + })(); + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; + // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + var i1, i3; + var l = this.x.length; + + this.interpolate = function (x2) { + if (!x2) return 0; + + // Get the indexes of x1 and x3 (the array indexes before and after given x2): + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; + + // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + return ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]; + }; + }, + //xxx: for now i will just save one spline function to to + getInterpolateFunction: function(c){ + if(!s.controller.spline) s.controller.spline = s.params.loop ? + new s.controller.LinearSpline(s.slidesGrid, c.slidesGrid) : + new s.controller.LinearSpline(s.snapGrid, c.snapGrid); + }, + setTranslate: function (translate, byController) { + var controlled = s.params.control; + var multiplier, controlledTranslate; + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + translate = c.rtl && c.params.direction === 'horizontal' ? -s.translate : s.translate; + if (s.params.controlBy === 'slide') { + s.controller.getInterpolateFunction(c); + // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + controlledTranslate = -s.controller.spline.interpolate(-translate); + } + + if(!controlledTranslate || s.params.controlBy === 'container'){ + multiplier = (c.maxTranslate() - c.minTranslate()) / (s.maxTranslate() - s.minTranslate()); + controlledTranslate = (translate - s.minTranslate()) * multiplier + c.minTranslate(); + } + + if (s.params.controlInverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + c.updateProgress(controlledTranslate); + c.setWrapperTranslate(controlledTranslate, false, s); + c.updateActiveIndex(); + } + if (Array.isArray(controlled)) { + for (var i = 0; i < controlled.length; i++) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } + else if (controlled instanceof Swiper && byController !== controlled) { + + setControlledTranslate(controlled); + } + }, + setTransition: function (duration, byController) { + var controlled = s.params.control; + var i; + function setControlledTransition(c) { + c.setWrapperTransition(duration, s); + if (duration !== 0) { + c.onTransitionStart(); + c.wrapper.transitionEnd(function(){ + if (!controlled) return; + if (c.params.loop && s.params.controlBy === 'slide') { + c.fixLoop(); + } + c.onTransitionEnd(); + + }); + } + } + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i++) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } + else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + } + }; + + + /*========================= + Hash Navigation + ===========================*/ + s.hashnav = { + onHashCange: function (e, a) { + var newHash = document.location.hash.replace('#', ''); + var activeSlideHash = s.slides.eq(s.activeIndex).attr('data-hash'); + if (newHash !== activeSlideHash) { + s.slideTo(s.wrapper.children('.' + s.params.slideClass + '[data-hash="' + (newHash) + '"]').index()); + } + }, + attachEvents: function (detach) { + var action = detach ? 'off' : 'on'; + $(window)[action]('hashchange', s.hashnav.onHashCange); + }, + setHash: function () { + if (!s.hashnav.initialized || !s.params.hashnav) return; + if (s.params.replaceState && window.history && window.history.replaceState) { + window.history.replaceState(null, null, ('#' + s.slides.eq(s.activeIndex).attr('data-hash') || '')); + } else { + var slide = s.slides.eq(s.activeIndex); + var hash = slide.attr('data-hash') || slide.attr('data-history'); + document.location.hash = hash || ''; + } + }, + init: function () { + if (!s.params.hashnav || s.params.history) return; + s.hashnav.initialized = true; + var hash = document.location.hash.replace('#', ''); + if (hash) { + var speed = 0; + for (var i = 0, length = s.slides.length; i < length; i++) { + var slide = s.slides.eq(i); + var slideHash = slide.attr('data-hash') || slide.attr('data-history'); + if (slideHash === hash && !slide.hasClass(s.params.slideDuplicateClass)) { + var index = slide.index(); + s.slideTo(index, speed, s.params.runCallbacksOnInit, true); + } + } + } + if (s.params.hashnavWatchState) s.hashnav.attachEvents(); + }, + destroy: function () { + if (s.params.hashnavWatchState) s.hashnav.attachEvents(true); + } + }; + + + /*========================= + History Api with fallback to Hashnav + ===========================*/ + s.history = { + init: function () { + if (!s.params.history) return; + if (!window.history || !window.history.pushState) { + s.params.history = false; + s.params.hashnav = true; + return; + } + s.history.initialized = true; + this.paths = this.getPathValues(); + if (!this.paths.key && !this.paths.value) return; + this.scrollToSlide(0, this.paths.value, s.params.runCallbacksOnInit); + if (!s.params.replaceState) { + window.addEventListener('popstate', this.setHistoryPopState); + } + }, + setHistoryPopState: function() { + s.history.paths = s.history.getPathValues(); + s.history.scrollToSlide(s.params.speed, s.history.paths.value, false); + }, + getPathValues: function() { + var pathArray = window.location.pathname.slice(1).split('/'); + var total = pathArray.length; + var key = pathArray[total - 2]; + var value = pathArray[total - 1]; + return { key: key, value: value }; + }, + setHistory: function (key, index) { + if (!s.history.initialized || !s.params.history) return; + var slide = s.slides.eq(index); + var value = this.slugify(slide.attr('data-history')); + if (!window.location.pathname.includes(key)) { + value = key + '/' + value; + } + if (s.params.replaceState) { + window.history.replaceState(null, null, value); + } else { + window.history.pushState(null, null, value); + } + }, + slugify: function(text) { + return text.toString().toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^\w\-]+/g, '') + .replace(/\-\-+/g, '-') + .replace(/^-+/, '') + .replace(/-+$/, ''); + }, + scrollToSlide: function(speed, value, runCallbacks) { + if (value) { + for (var i = 0, length = s.slides.length; i < length; i++) { + var slide = s.slides.eq(i); + var slideHistory = this.slugify(slide.attr('data-history')); + if (slideHistory === value && !slide.hasClass(s.params.slideDuplicateClass)) { + var index = slide.index(); + s.slideTo(index, speed, runCallbacks); + } + } + } else { + s.slideTo(0, speed, runCallbacks); + } + } + }; + + + /*========================= + Keyboard Control + ===========================*/ + function handleKeyboard(e) { + if (e.originalEvent) e = e.originalEvent; //jquery fix + var kc = e.keyCode || e.charCode; + // Directions locks + if (!s.params.allowSwipeToNext && (s.isHorizontal() && kc === 39 || !s.isHorizontal() && kc === 40)) { + return false; + } + if (!s.params.allowSwipeToPrev && (s.isHorizontal() && kc === 37 || !s.isHorizontal() && kc === 38)) { + return false; + } + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return; + } + if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { + return; + } + if (kc === 37 || kc === 39 || kc === 38 || kc === 40) { + var inView = false; + //Check that swiper should be inside of visible area of window + if (s.container.parents('.' + s.params.slideClass).length > 0 && s.container.parents('.' + s.params.slideActiveClass).length === 0) { + return; + } + var windowScroll = { + left: window.pageXOffset, + top: window.pageYOffset + }; + var windowWidth = window.innerWidth; + var windowHeight = window.innerHeight; + var swiperOffset = s.container.offset(); + if (s.rtl) swiperOffset.left = swiperOffset.left - s.container[0].scrollLeft; + var swiperCoord = [ + [swiperOffset.left, swiperOffset.top], + [swiperOffset.left + s.width, swiperOffset.top], + [swiperOffset.left, swiperOffset.top + s.height], + [swiperOffset.left + s.width, swiperOffset.top + s.height] + ]; + for (var i = 0; i < swiperCoord.length; i++) { + var point = swiperCoord[i]; + if ( + point[0] >= windowScroll.left && point[0] <= windowScroll.left + windowWidth && + point[1] >= windowScroll.top && point[1] <= windowScroll.top + windowHeight + ) { + inView = true; + } + + } + if (!inView) return; + } + if (s.isHorizontal()) { + if (kc === 37 || kc === 39) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if ((kc === 39 && !s.rtl) || (kc === 37 && s.rtl)) s.slideNext(); + if ((kc === 37 && !s.rtl) || (kc === 39 && s.rtl)) s.slidePrev(); + } + else { + if (kc === 38 || kc === 40) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if (kc === 40) s.slideNext(); + if (kc === 38) s.slidePrev(); + } + s.emit('onKeyPress', s, kc); + } + s.disableKeyboardControl = function () { + s.params.keyboardControl = false; + $(document).off('keydown', handleKeyboard); + }; + s.enableKeyboardControl = function () { + s.params.keyboardControl = true; + $(document).on('keydown', handleKeyboard); + }; + + + /*========================= + Mousewheel Control + ===========================*/ + s.mousewheel = { + event: false, + lastScrollTime: (new window.Date()).getTime() + }; + function isEventSupported() { + var eventName = 'onwheel'; + var isSupported = eventName in document; + + if (!isSupported) { + var element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + if (!isSupported && + document.implementation && + document.implementation.hasFeature && + // always returns true in newer browsers as per the standard. + // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature + document.implementation.hasFeature('', '') !== true ) { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); + } + + return isSupported; + } + /** + * Mouse wheel (and 2-finger trackpad) support on the web sucks. It is + * complicated, thus this doc is long and (hopefully) detailed enough to answer + * your questions. + * + * If you need to react to the mouse wheel in a predictable way, this code is + * like your bestest friend. * hugs * + * + * As of today, there are 4 DOM event types you can listen to: + * + * 'wheel' -- Chrome(31+), FF(17+), IE(9+) + * 'mousewheel' -- Chrome, IE(6+), Opera, Safari + * 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother! + * 'DOMMouseScroll' -- FF(0.9.7+) since 2003 + * + * So what to do? The is the best: + * + * normalizeWheel.getEventType(); + * + * In your event callback, use this code to get sane interpretation of the + * deltas. This code will return an object with properties: + * + * spinX -- normalized spin speed (use for zoom) - x plane + * spinY -- " - y plane + * pixelX -- normalized distance (to pixels) - x plane + * pixelY -- " - y plane + * + * Wheel values are provided by the browser assuming you are using the wheel to + * scroll a web page by a number of lines or pixels (or pages). Values can vary + * significantly on different platforms and browsers, forgetting that you can + * scroll at different speeds. Some devices (like trackpads) emit more events + * at smaller increments with fine granularity, and some emit massive jumps with + * linear speed or acceleration. + * + * This code does its best to normalize the deltas for you: + * + * - spin is trying to normalize how far the wheel was spun (or trackpad + * dragged). This is super useful for zoom support where you want to + * throw away the chunky scroll steps on the PC and make those equal to + * the slow and smooth tiny steps on the Mac. Key data: This code tries to + * resolve a single slow step on a wheel to 1. + * + * - pixel is normalizing the desired scroll delta in pixel units. You'll + * get the crazy differences between browsers, but at least it'll be in + * pixels! + * + * - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This + * should translate to positive value zooming IN, negative zooming OUT. + * This matches the newer 'wheel' event. + * + * Why are there spinX, spinY (or pixels)? + * + * - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn + * with a mouse. It results in side-scrolling in the browser by default. + * + * - spinY is what you expect -- it's the classic axis of a mouse wheel. + * + * - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and + * probably is by browsers in conjunction with fancy 3D controllers .. but + * you know. + * + * Implementation info: + * + * Examples of 'wheel' event if you scroll slowly (down) by one step with an + * average mouse: + * + * OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120) + * OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12) + * OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A) + * Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120) + * Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120) + * + * On the trackpad: + * + * OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6) + * OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A) + * + * On other/older browsers.. it's more complicated as there can be multiple and + * also missing delta values. + * + * The 'wheel' event is more standard: + * + * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents + * + * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and + * deltaX, deltaY and deltaZ. Some browsers provide other values to maintain + * backward compatibility with older events. Those other values help us + * better normalize spin speed. Example of what the browsers provide: + * + * | event.wheelDelta | event.detail + * ------------------+------------------+-------------- + * Safari v5/OS X | -120 | 0 + * Safari v5/Win7 | -120 | 0 + * Chrome v17/OS X | -120 | 0 + * Chrome v17/Win7 | -120 | 0 + * IE9/Win7 | -120 | undefined + * Firefox v4/OS X | undefined | 1 + * Firefox v4/Win7 | undefined | 3 + * + */ + function normalizeWheel( /*object*/ event ) /*object*/ { + // Reasonable defaults + var PIXEL_STEP = 10; + var LINE_HEIGHT = 40; + var PAGE_HEIGHT = 800; + + var sX = 0, sY = 0, // spinX, spinY + pX = 0, pY = 0; // pixelX, pixelY + + // Legacy + if( 'detail' in event ) { + sY = event.detail; + } + if( 'wheelDelta' in event ) { + sY = -event.wheelDelta / 120; + } + if( 'wheelDeltaY' in event ) { + sY = -event.wheelDeltaY / 120; + } + if( 'wheelDeltaX' in event ) { + sX = -event.wheelDeltaX / 120; + } + + // side scrolling on FF with DOMMouseScroll + if( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if( 'deltaY' in event ) { + pY = event.deltaY; + } + if( 'deltaX' in event ) { + pX = event.deltaX; + } + + if( (pX || pY) && event.deltaMode ) { + if( event.deltaMode === 1 ) { // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } + + // Fall-back if spin cannot be determined + if( pX && !sX ) { + sX = (pX < 1) ? -1 : 1; + } + if( pY && !sY ) { + sY = (pY < 1) ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY + }; + } + if (s.params.mousewheelControl) { + /** + * The best combination if you prefer spinX + spinY normalization. It favors + * the older DOMMouseScroll for Firefox, as FF does not include wheelDelta with + * 'wheel' event, making spin speed determination impossible. + */ + s.mousewheel.event = (navigator.userAgent.indexOf('firefox') > -1) ? + 'DOMMouseScroll' : + isEventSupported() ? + 'wheel' : 'mousewheel'; + } + function handleMousewheel(e) { + if (e.originalEvent) e = e.originalEvent; //jquery fix + var delta = 0; + var rtlFactor = s.rtl ? -1 : 1; + + var data = normalizeWheel( e ); + + if (s.params.mousewheelForceToAxis) { + if (s.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = data.pixelX * rtlFactor; + else return; + } + else { + if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = data.pixelY; + else return; + } + } + else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? - data.pixelX * rtlFactor : - data.pixelY; + } + + if (delta === 0) return; + + if (s.params.mousewheelInvert) delta = -delta; + + if (!s.params.freeMode) { + if ((new window.Date()).getTime() - s.mousewheel.lastScrollTime > 60) { + if (delta < 0) { + if ((!s.isEnd || s.params.loop) && !s.animating) { + s.slideNext(); + s.emit('onScroll', s, e); + } + else if (s.params.mousewheelReleaseOnEdges) return true; + } + else { + if ((!s.isBeginning || s.params.loop) && !s.animating) { + s.slidePrev(); + s.emit('onScroll', s, e); + } + else if (s.params.mousewheelReleaseOnEdges) return true; + } + } + s.mousewheel.lastScrollTime = (new window.Date()).getTime(); + + } + else { + //Freemode or scrollContainer: + var position = s.getWrapperTranslate() + delta * s.params.mousewheelSensitivity; + var wasBeginning = s.isBeginning, + wasEnd = s.isEnd; + + if (position >= s.minTranslate()) position = s.minTranslate(); + if (position <= s.maxTranslate()) position = s.maxTranslate(); + + s.setWrapperTransition(0); + s.setWrapperTranslate(position); + s.updateProgress(); + s.updateActiveIndex(); + + if (!wasBeginning && s.isBeginning || !wasEnd && s.isEnd) { + s.updateClasses(); + } + + if (s.params.freeModeSticky) { + clearTimeout(s.mousewheel.timeout); + s.mousewheel.timeout = setTimeout(function () { + s.slideReset(); + }, 300); + } + else { + if (s.params.lazyLoading && s.lazy) { + s.lazy.load(); + } + } + // Emit event + s.emit('onScroll', s, e); + + // Stop autoplay + if (s.params.autoplay && s.params.autoplayDisableOnInteraction) s.stopAutoplay(); + + // Return page scroll on edge positions + if (position === 0 || position === s.maxTranslate()) return; + } + + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + return false; + } + s.disableMousewheelControl = function () { + if (!s.mousewheel.event) return false; + var target = s.container; + if (s.params.mousewheelEventsTarged !== 'container') { + target = $(s.params.mousewheelEventsTarged); + } + target.off(s.mousewheel.event, handleMousewheel); + s.params.mousewheelControl = false; + return true; + }; + + s.enableMousewheelControl = function () { + if (!s.mousewheel.event) return false; + var target = s.container; + if (s.params.mousewheelEventsTarged !== 'container') { + target = $(s.params.mousewheelEventsTarged); + } + target.on(s.mousewheel.event, handleMousewheel); + s.params.mousewheelControl = true; + return true; + }; + + + /*========================= + Parallax + ===========================*/ + function setParallaxTransform(el, progress) { + el = $(el); + var p, pX, pY; + var rtlFactor = s.rtl ? -1 : 1; + + p = el.attr('data-swiper-parallax') || '0'; + pX = el.attr('data-swiper-parallax-x'); + pY = el.attr('data-swiper-parallax-y'); + if (pX || pY) { + pX = pX || '0'; + pY = pY || '0'; + } + else { + if (s.isHorizontal()) { + pX = p; + pY = '0'; + } + else { + pY = p; + pX = '0'; + } + } + + if ((pX).indexOf('%') >= 0) { + pX = parseInt(pX, 10) * progress * rtlFactor + '%'; + } + else { + pX = pX * progress * rtlFactor + 'px' ; + } + if ((pY).indexOf('%') >= 0) { + pY = parseInt(pY, 10) * progress + '%'; + } + else { + pY = pY * progress + 'px' ; + } + + el.transform('translate3d(' + pX + ', ' + pY + ',0px)'); + } + s.parallax = { + setTranslate: function () { + s.container.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){ + setParallaxTransform(this, s.progress); + + }); + s.slides.each(function () { + var slide = $(this); + slide.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function () { + var progress = Math.min(Math.max(slide[0].progress, -1), 1); + setParallaxTransform(this, progress); + }); + }); + }, + setTransition: function (duration) { + if (typeof duration === 'undefined') duration = s.params.speed; + s.container.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){ + var el = $(this); + var parallaxDuration = parseInt(el.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) parallaxDuration = 0; + el.transition(parallaxDuration); + }); + } + }; + + + /*========================= + Zoom + ===========================*/ + s.zoom = { + // "Global" Props + scale: 1, + currentScale: 1, + isScaling: false, + gesture: { + slide: undefined, + slideWidth: undefined, + slideHeight: undefined, + image: undefined, + imageWrap: undefined, + zoomMax: s.params.zoomMax + }, + image: { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {} + }, + velocity: { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined + }, + // Calc Scale From Multi-touches + getDistanceBetweenTouches: function (e) { + if (e.targetTouches.length < 2) return 1; + var x1 = e.targetTouches[0].pageX, + y1 = e.targetTouches[0].pageY, + x2 = e.targetTouches[1].pageX, + y2 = e.targetTouches[1].pageY; + var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + return distance; + }, + // Events + onGestureStart: function (e) { + var z = s.zoom; + if (!s.support.gestures) { + if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) { + return; + } + z.gesture.scaleStart = z.getDistanceBetweenTouches(e); + } + if (!z.gesture.slide || !z.gesture.slide.length) { + z.gesture.slide = $(this); + if (z.gesture.slide.length === 0) z.gesture.slide = s.slides.eq(s.activeIndex); + z.gesture.image = z.gesture.slide.find('img, svg, canvas'); + z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass); + z.gesture.zoomMax = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax ; + if (z.gesture.imageWrap.length === 0) { + z.gesture.image = undefined; + return; + } + } + z.gesture.image.transition(0); + z.isScaling = true; + }, + onGestureChange: function (e) { + var z = s.zoom; + if (!s.support.gestures) { + if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) { + return; + } + z.gesture.scaleMove = z.getDistanceBetweenTouches(e); + } + if (!z.gesture.image || z.gesture.image.length === 0) return; + if (s.support.gestures) { + z.scale = e.scale * z.currentScale; + } + else { + z.scale = (z.gesture.scaleMove / z.gesture.scaleStart) * z.currentScale; + } + if (z.scale > z.gesture.zoomMax) { + z.scale = z.gesture.zoomMax - 1 + Math.pow((z.scale - z.gesture.zoomMax + 1), 0.5); + } + if (z.scale < s.params.zoomMin) { + z.scale = s.params.zoomMin + 1 - Math.pow((s.params.zoomMin - z.scale + 1), 0.5); + } + z.gesture.image.transform('translate3d(0,0,0) scale(' + z.scale + ')'); + }, + onGestureEnd: function (e) { + var z = s.zoom; + if (!s.support.gestures) { + if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2) { + return; + } + } + if (!z.gesture.image || z.gesture.image.length === 0) return; + z.scale = Math.max(Math.min(z.scale, z.gesture.zoomMax), s.params.zoomMin); + z.gesture.image.transition(s.params.speed).transform('translate3d(0,0,0) scale(' + z.scale + ')'); + z.currentScale = z.scale; + z.isScaling = false; + if (z.scale === 1) z.gesture.slide = undefined; + }, + onTouchStart: function (s, e) { + var z = s.zoom; + if (!z.gesture.image || z.gesture.image.length === 0) return; + if (z.image.isTouched) return; + if (s.device.os === 'android') e.preventDefault(); + z.image.isTouched = true; + z.image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + z.image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + }, + onTouchMove: function (e) { + var z = s.zoom; + if (!z.gesture.image || z.gesture.image.length === 0) return; + s.allowClick = false; + if (!z.image.isTouched || !z.gesture.slide) return; + + if (!z.image.isMoved) { + z.image.width = z.gesture.image[0].offsetWidth; + z.image.height = z.gesture.image[0].offsetHeight; + z.image.startX = s.getTranslate(z.gesture.imageWrap[0], 'x') || 0; + z.image.startY = s.getTranslate(z.gesture.imageWrap[0], 'y') || 0; + z.gesture.slideWidth = z.gesture.slide[0].offsetWidth; + z.gesture.slideHeight = z.gesture.slide[0].offsetHeight; + z.gesture.imageWrap.transition(0); + if (s.rtl) z.image.startX = -z.image.startX; + if (s.rtl) z.image.startY = -z.image.startY; + } + // Define if we need image drag + var scaledWidth = z.image.width * z.scale; + var scaledHeight = z.image.height * z.scale; + + if (scaledWidth < z.gesture.slideWidth && scaledHeight < z.gesture.slideHeight) return; + + z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0); + z.image.maxX = -z.image.minX; + z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0); + z.image.maxY = -z.image.minY; + + z.image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + z.image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!z.image.isMoved && !z.isScaling) { + if (s.isHorizontal() && + (Math.floor(z.image.minX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x < z.image.touchesStart.x) || + (Math.floor(z.image.maxX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x > z.image.touchesStart.x) + ) { + z.image.isTouched = false; + return; + } + else if (!s.isHorizontal() && + (Math.floor(z.image.minY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y < z.image.touchesStart.y) || + (Math.floor(z.image.maxY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y > z.image.touchesStart.y) + ) { + z.image.isTouched = false; + return; + } + } + e.preventDefault(); + e.stopPropagation(); + + z.image.isMoved = true; + z.image.currentX = z.image.touchesCurrent.x - z.image.touchesStart.x + z.image.startX; + z.image.currentY = z.image.touchesCurrent.y - z.image.touchesStart.y + z.image.startY; + + if (z.image.currentX < z.image.minX) { + z.image.currentX = z.image.minX + 1 - Math.pow((z.image.minX - z.image.currentX + 1), 0.8); + } + if (z.image.currentX > z.image.maxX) { + z.image.currentX = z.image.maxX - 1 + Math.pow((z.image.currentX - z.image.maxX + 1), 0.8); + } + + if (z.image.currentY < z.image.minY) { + z.image.currentY = z.image.minY + 1 - Math.pow((z.image.minY - z.image.currentY + 1), 0.8); + } + if (z.image.currentY > z.image.maxY) { + z.image.currentY = z.image.maxY - 1 + Math.pow((z.image.currentY - z.image.maxY + 1), 0.8); + } + + //Velocity + if (!z.velocity.prevPositionX) z.velocity.prevPositionX = z.image.touchesCurrent.x; + if (!z.velocity.prevPositionY) z.velocity.prevPositionY = z.image.touchesCurrent.y; + if (!z.velocity.prevTime) z.velocity.prevTime = Date.now(); + z.velocity.x = (z.image.touchesCurrent.x - z.velocity.prevPositionX) / (Date.now() - z.velocity.prevTime) / 2; + z.velocity.y = (z.image.touchesCurrent.y - z.velocity.prevPositionY) / (Date.now() - z.velocity.prevTime) / 2; + if (Math.abs(z.image.touchesCurrent.x - z.velocity.prevPositionX) < 2) z.velocity.x = 0; + if (Math.abs(z.image.touchesCurrent.y - z.velocity.prevPositionY) < 2) z.velocity.y = 0; + z.velocity.prevPositionX = z.image.touchesCurrent.x; + z.velocity.prevPositionY = z.image.touchesCurrent.y; + z.velocity.prevTime = Date.now(); + + z.gesture.imageWrap.transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)'); + }, + onTouchEnd: function (s, e) { + var z = s.zoom; + if (!z.gesture.image || z.gesture.image.length === 0) return; + if (!z.image.isTouched || !z.image.isMoved) { + z.image.isTouched = false; + z.image.isMoved = false; + return; + } + z.image.isTouched = false; + z.image.isMoved = false; + var momentumDurationX = 300; + var momentumDurationY = 300; + var momentumDistanceX = z.velocity.x * momentumDurationX; + var newPositionX = z.image.currentX + momentumDistanceX; + var momentumDistanceY = z.velocity.y * momentumDurationY; + var newPositionY = z.image.currentY + momentumDistanceY; + + //Fix duration + if (z.velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - z.image.currentX) / z.velocity.x); + if (z.velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - z.image.currentY) / z.velocity.y); + var momentumDuration = Math.max(momentumDurationX, momentumDurationY); + + z.image.currentX = newPositionX; + z.image.currentY = newPositionY; + + // Define if we need image drag + var scaledWidth = z.image.width * z.scale; + var scaledHeight = z.image.height * z.scale; + z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0); + z.image.maxX = -z.image.minX; + z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0); + z.image.maxY = -z.image.minY; + z.image.currentX = Math.max(Math.min(z.image.currentX, z.image.maxX), z.image.minX); + z.image.currentY = Math.max(Math.min(z.image.currentY, z.image.maxY), z.image.minY); + + z.gesture.imageWrap.transition(momentumDuration).transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)'); + }, + onTransitionEnd: function (s) { + var z = s.zoom; + if (z.gesture.slide && s.previousIndex !== s.activeIndex) { + z.gesture.image.transform('translate3d(0,0,0) scale(1)'); + z.gesture.imageWrap.transform('translate3d(0,0,0)'); + z.gesture.slide = z.gesture.image = z.gesture.imageWrap = undefined; + z.scale = z.currentScale = 1; + } + }, + // Toggle Zoom + toggleZoom: function (s, e) { + var z = s.zoom; + if (!z.gesture.slide) { + z.gesture.slide = s.clickedSlide ? $(s.clickedSlide) : s.slides.eq(s.activeIndex); + z.gesture.image = z.gesture.slide.find('img, svg, canvas'); + z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass); + } + if (!z.gesture.image || z.gesture.image.length === 0) return; + + var touchX, touchY, offsetX, offsetY, diffX, diffY, translateX, translateY, imageWidth, imageHeight, scaledWidth, scaledHeight, translateMinX, translateMinY, translateMaxX, translateMaxY, slideWidth, slideHeight; + + if (typeof z.image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } + else { + touchX = z.image.touchesStart.x; + touchY = z.image.touchesStart.y; + } + + if (z.scale && z.scale !== 1) { + // Zoom Out + z.scale = z.currentScale = 1; + z.gesture.imageWrap.transition(300).transform('translate3d(0,0,0)'); + z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(1)'); + z.gesture.slide = undefined; + } + else { + // Zoom In + z.scale = z.currentScale = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax; + if (e) { + slideWidth = z.gesture.slide[0].offsetWidth; + slideHeight = z.gesture.slide[0].offsetHeight; + offsetX = z.gesture.slide.offset().left; + offsetY = z.gesture.slide.offset().top; + diffX = offsetX + slideWidth/2 - touchX; + diffY = offsetY + slideHeight/2 - touchY; + + imageWidth = z.gesture.image[0].offsetWidth; + imageHeight = z.gesture.image[0].offsetHeight; + scaledWidth = imageWidth * z.scale; + scaledHeight = imageHeight * z.scale; + + translateMinX = Math.min((slideWidth / 2 - scaledWidth / 2), 0); + translateMinY = Math.min((slideHeight / 2 - scaledHeight / 2), 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + + translateX = diffX * z.scale; + translateY = diffY * z.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } + else { + translateX = 0; + translateY = 0; + } + z.gesture.imageWrap.transition(300).transform('translate3d(' + translateX + 'px, ' + translateY + 'px,0)'); + z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(' + z.scale + ')'); + } + }, + // Attach/Detach Events + attachEvents: function (detach) { + var action = detach ? 'off' : 'on'; + + if (s.params.zoom) { + var target = s.slides; + var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false; + // Scale image + if (s.support.gestures) { + s.slides[action]('gesturestart', s.zoom.onGestureStart, passiveListener); + s.slides[action]('gesturechange', s.zoom.onGestureChange, passiveListener); + s.slides[action]('gestureend', s.zoom.onGestureEnd, passiveListener); + } + else if (s.touchEvents.start === 'touchstart') { + s.slides[action](s.touchEvents.start, s.zoom.onGestureStart, passiveListener); + s.slides[action](s.touchEvents.move, s.zoom.onGestureChange, passiveListener); + s.slides[action](s.touchEvents.end, s.zoom.onGestureEnd, passiveListener); + } + + // Move image + s[action]('touchStart', s.zoom.onTouchStart); + s.slides.each(function (index, slide){ + if ($(slide).find('.' + s.params.zoomContainerClass).length > 0) { + $(slide)[action](s.touchEvents.move, s.zoom.onTouchMove); + } + }); + s[action]('touchEnd', s.zoom.onTouchEnd); + + // Scale Out + s[action]('transitionEnd', s.zoom.onTransitionEnd); + if (s.params.zoomToggle) { + s.on('doubleTap', s.zoom.toggleZoom); + } + } + }, + init: function () { + s.zoom.attachEvents(); + }, + destroy: function () { + s.zoom.attachEvents(true); + } + }; + + + /*========================= + Plugins API. Collect all and init all plugins + ===========================*/ + s._plugins = []; + for (var plugin in s.plugins) { + var p = s.plugins[plugin](s, s.params[plugin]); + if (p) s._plugins.push(p); + } + // Method to call all plugins event/method + s.callPlugins = function (eventName) { + for (var i = 0; i < s._plugins.length; i++) { + if (eventName in s._plugins[i]) { + s._plugins[i][eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + } + } + }; + + + /*========================= + Events/Callbacks/Plugins Emitter + ===========================*/ + function normalizeEventName (eventName) { + if (eventName.indexOf('on') !== 0) { + if (eventName[0] !== eventName[0].toUpperCase()) { + eventName = 'on' + eventName[0].toUpperCase() + eventName.substring(1); + } + else { + eventName = 'on' + eventName; + } + } + return eventName; + } + s.emitterEventListeners = { + + }; + s.emit = function (eventName) { + // Trigger callbacks + if (s.params[eventName]) { + s.params[eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + } + var i; + // Trigger events + if (s.emitterEventListeners[eventName]) { + for (i = 0; i < s.emitterEventListeners[eventName].length; i++) { + s.emitterEventListeners[eventName][i](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + } + } + // Trigger plugins + if (s.callPlugins) s.callPlugins(eventName, arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + }; + s.on = function (eventName, handler) { + eventName = normalizeEventName(eventName); + if (!s.emitterEventListeners[eventName]) s.emitterEventListeners[eventName] = []; + s.emitterEventListeners[eventName].push(handler); + return s; + }; + s.off = function (eventName, handler) { + var i; + eventName = normalizeEventName(eventName); + if (typeof handler === 'undefined') { + // Remove all handlers for such event + s.emitterEventListeners[eventName] = []; + return s; + } + if (!s.emitterEventListeners[eventName] || s.emitterEventListeners[eventName].length === 0) return; + for (i = 0; i < s.emitterEventListeners[eventName].length; i++) { + if(s.emitterEventListeners[eventName][i] === handler) s.emitterEventListeners[eventName].splice(i, 1); + } + return s; + }; + s.once = function (eventName, handler) { + eventName = normalizeEventName(eventName); + var _handler = function () { + handler(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); + s.off(eventName, _handler); + }; + s.on(eventName, _handler); + return s; + }; + + + // Accessibility tools + s.a11y = { + makeFocusable: function ($el) { + $el.attr('tabIndex', '0'); + return $el; + }, + addRole: function ($el, role) { + $el.attr('role', role); + return $el; + }, + + addLabel: function ($el, label) { + $el.attr('aria-label', label); + return $el; + }, + + disable: function ($el) { + $el.attr('aria-disabled', true); + return $el; + }, + + enable: function ($el) { + $el.attr('aria-disabled', false); + return $el; + }, + + onEnterKey: function (event) { + if (event.keyCode !== 13) return; + if ($(event.target).is(s.params.nextButton)) { + s.onClickNext(event); + if (s.isEnd) { + s.a11y.notify(s.params.lastSlideMessage); + } + else { + s.a11y.notify(s.params.nextSlideMessage); + } + } + else if ($(event.target).is(s.params.prevButton)) { + s.onClickPrev(event); + if (s.isBeginning) { + s.a11y.notify(s.params.firstSlideMessage); + } + else { + s.a11y.notify(s.params.prevSlideMessage); + } + } + if ($(event.target).is('.' + s.params.bulletClass)) { + $(event.target)[0].click(); + } + }, + + liveRegion: $(''), + + notify: function (message) { + var notification = s.a11y.liveRegion; + if (notification.length === 0) return; + notification.html(''); + notification.html(message); + }, + init: function () { + // Setup accessibility + if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { + s.a11y.makeFocusable(s.nextButton); + s.a11y.addRole(s.nextButton, 'button'); + s.a11y.addLabel(s.nextButton, s.params.nextSlideMessage); + } + if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { + s.a11y.makeFocusable(s.prevButton); + s.a11y.addRole(s.prevButton, 'button'); + s.a11y.addLabel(s.prevButton, s.params.prevSlideMessage); + } + + $(s.container).append(s.a11y.liveRegion); + }, + initPagination: function () { + if (s.params.pagination && s.params.paginationClickable && s.bullets && s.bullets.length) { + s.bullets.each(function () { + var bullet = $(this); + s.a11y.makeFocusable(bullet); + s.a11y.addRole(bullet, 'button'); + s.a11y.addLabel(bullet, s.params.paginationBulletMessage.replace(/{{index}}/, bullet.index() + 1)); + }); + } + }, + destroy: function () { + if (s.a11y.liveRegion && s.a11y.liveRegion.length > 0) s.a11y.liveRegion.remove(); + } + }; + + + /*========================= + Init/Destroy + ===========================*/ + s.init = function () { + if (s.params.loop) s.createLoop(); + s.updateContainerSize(); + s.updateSlidesSize(); + s.updatePagination(); + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.set(); + if (s.params.scrollbarDraggable) { + s.scrollbar.enableDraggable(); + } + } + if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { + if (!s.params.loop) s.updateProgress(); + s.effects[s.params.effect].setTranslate(); + } + if (s.params.loop) { + s.slideTo(s.params.initialSlide + s.loopedSlides, 0, s.params.runCallbacksOnInit); + } + else { + s.slideTo(s.params.initialSlide, 0, s.params.runCallbacksOnInit); + if (s.params.initialSlide === 0) { + if (s.parallax && s.params.parallax) s.parallax.setTranslate(); + if (s.lazy && s.params.lazyLoading) { + s.lazy.load(); + s.lazy.initialImageLoaded = true; + } + } + } + s.attachEvents(); + if (s.params.observer && s.support.observer) { + s.initObservers(); + } + if (s.params.preloadImages && !s.params.lazyLoading) { + s.preloadImages(); + } + if (s.params.zoom && s.zoom) { + s.zoom.init(); + } + if (s.params.autoplay) { + s.startAutoplay(); + } + if (s.params.keyboardControl) { + if (s.enableKeyboardControl) s.enableKeyboardControl(); + } + if (s.params.mousewheelControl) { + if (s.enableMousewheelControl) s.enableMousewheelControl(); + } + // Deprecated hashnavReplaceState changed to replaceState for use in hashnav and history + if (s.params.hashnavReplaceState) { + s.params.replaceState = s.params.hashnavReplaceState; + } + if (s.params.history) { + if (s.history) s.history.init(); + } + if (s.params.hashnav) { + if (s.hashnav) s.hashnav.init(); + } + if (s.params.a11y && s.a11y) s.a11y.init(); + s.emit('onInit', s); + }; + + // Cleanup dynamic styles + s.cleanupStyles = function () { + // Container + s.container.removeClass(s.classNames.join(' ')).removeAttr('style'); + + // Wrapper + s.wrapper.removeAttr('style'); + + // Slides + if (s.slides && s.slides.length) { + s.slides + .removeClass([ + s.params.slideVisibleClass, + s.params.slideActiveClass, + s.params.slideNextClass, + s.params.slidePrevClass + ].join(' ')) + .removeAttr('style') + .removeAttr('data-swiper-column') + .removeAttr('data-swiper-row'); + } + + // Pagination/Bullets + if (s.paginationContainer && s.paginationContainer.length) { + s.paginationContainer.removeClass(s.params.paginationHiddenClass); + } + if (s.bullets && s.bullets.length) { + s.bullets.removeClass(s.params.bulletActiveClass); + } + + // Buttons + if (s.params.prevButton) $(s.params.prevButton).removeClass(s.params.buttonDisabledClass); + if (s.params.nextButton) $(s.params.nextButton).removeClass(s.params.buttonDisabledClass); + + // Scrollbar + if (s.params.scrollbar && s.scrollbar) { + if (s.scrollbar.track && s.scrollbar.track.length) s.scrollbar.track.removeAttr('style'); + if (s.scrollbar.drag && s.scrollbar.drag.length) s.scrollbar.drag.removeAttr('style'); + } + }; + + // Destroy + s.destroy = function (deleteInstance, cleanupStyles) { + // Detach evebts + s.detachEvents(); + // Stop autoplay + s.stopAutoplay(); + // Disable draggable + if (s.params.scrollbar && s.scrollbar) { + if (s.params.scrollbarDraggable) { + s.scrollbar.disableDraggable(); + } + } + // Destroy loop + if (s.params.loop) { + s.destroyLoop(); + } + // Cleanup styles + if (cleanupStyles) { + s.cleanupStyles(); + } + // Disconnect observer + s.disconnectObservers(); + + // Destroy zoom + if (s.params.zoom && s.zoom) { + s.zoom.destroy(); + } + // Disable keyboard/mousewheel + if (s.params.keyboardControl) { + if (s.disableKeyboardControl) s.disableKeyboardControl(); + } + if (s.params.mousewheelControl) { + if (s.disableMousewheelControl) s.disableMousewheelControl(); + } + // Disable a11y + if (s.params.a11y && s.a11y) s.a11y.destroy(); + // Delete history popstate + if (s.params.history && !s.params.replaceState) { + window.removeEventListener('popstate', s.history.setHistoryPopState); + } + if (s.params.hashnav && s.hashnav) { + s.hashnav.destroy(); + } + // Destroy callback + s.emit('onDestroy'); + // Delete instance + if (deleteInstance !== false) s = null; + }; + + s.init(); + + + + // Return swiper instance + return s; + }; + + + /*================================================== + Prototype + ====================================================*/ + Swiper.prototype = { + isSafari: (function () { + var ua = window.navigator.userAgent.toLowerCase(); + return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0); + })(), + isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent), + isArray: function (arr) { + return Object.prototype.toString.apply(arr) === '[object Array]'; + }, + /*================================================== + Browser + ====================================================*/ + browser: { + ie: window.navigator.pointerEnabled || window.navigator.msPointerEnabled, + ieTouch: (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 1) || (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 1), + lteIE9: (function() { + // create temporary DIV + var div = document.createElement('div'); + // add content to tmp DIV which is wrapped into the IE HTML conditional statement + div.innerHTML = ''; + // return true / false value based on what will browser render + return div.getElementsByTagName('i').length === 1; + })() + }, + /*================================================== + Devices + ====================================================*/ + device: (function () { + var ua = window.navigator.userAgent; + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + return { + ios: ipad || iphone || ipod, + android: android + }; + })(), + /*================================================== + Feature Detection + ====================================================*/ + support: { + touch : (window.Modernizr && Modernizr.touch === true) || (function () { + return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch); + })(), + + transforms3d : (window.Modernizr && Modernizr.csstransforms3d === true) || (function () { + var div = document.createElement('div').style; + return ('webkitPerspective' in div || 'MozPerspective' in div || 'OPerspective' in div || 'MsPerspective' in div || 'perspective' in div); + })(), + + flexbox: (function () { + var div = document.createElement('div').style; + var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' '); + for (var i = 0; i < styles.length; i++) { + if (styles[i] in div) return true; + } + })(), + + observer: (function () { + return ('MutationObserver' in window || 'WebkitMutationObserver' in window); + })(), + + passiveListener: (function () { + var supportsPassive = false; + try { + var opts = Object.defineProperty({}, 'passive', { + get: function() { + supportsPassive = true; + } + }); + window.addEventListener('testPassiveListener', null, opts); + } catch (e) {} + return supportsPassive; + })(), + + gestures: (function () { + return 'ongesturestart' in window; + })() + }, + /*================================================== + Plugins + ====================================================*/ + plugins: {} + }; + + + /*=========================== + Dom7 Library + ===========================*/ + var Dom7 = (function () { + var Dom7 = function (arr) { + var _this = this, i = 0; + // Create array-like object + for (i = 0; i < arr.length; i++) { + _this[i] = arr[i]; + } + _this.length = arr.length; + // Return collection with methods + return this; + }; + var $ = function (selector, context) { + var arr = [], i = 0; + if (selector && !context) { + if (selector instanceof Dom7) { + return selector; + } + } + if (selector) { + // String + if (typeof selector === 'string') { + var els, tempParent, html = selector.trim(); + if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { + var toCreate = 'div'; + if (html.indexOf(':~]/)) { + // Pure ID selector + els = [document.getElementById(selector.split('#')[1])]; + } + else { + // Other selectors + els = (context || document).querySelectorAll(selector); + } + for (i = 0; i < els.length; i++) { + if (els[i]) arr.push(els[i]); + } + } + } + // Node/element + else if (selector.nodeType || selector === window || selector === document) { + arr.push(selector); + } + //Array of elements or instance of Dom + else if (selector.length > 0 && selector[0].nodeType) { + for (i = 0; i < selector.length; i++) { + arr.push(selector[i]); + } + } + } + return new Dom7(arr); + }; + Dom7.prototype = { + // Classes and attriutes + addClass: function (className) { + if (typeof className === 'undefined') { + return this; + } + var classes = className.split(' '); + for (var i = 0; i < classes.length; i++) { + for (var j = 0; j < this.length; j++) { + this[j].classList.add(classes[i]); + } + } + return this; + }, + removeClass: function (className) { + var classes = className.split(' '); + for (var i = 0; i < classes.length; i++) { + for (var j = 0; j < this.length; j++) { + this[j].classList.remove(classes[i]); + } + } + return this; + }, + hasClass: function (className) { + if (!this[0]) return false; + else return this[0].classList.contains(className); + }, + toggleClass: function (className) { + var classes = className.split(' '); + for (var i = 0; i < classes.length; i++) { + for (var j = 0; j < this.length; j++) { + this[j].classList.toggle(classes[i]); + } + } + return this; + }, + attr: function (attrs, value) { + if (arguments.length === 1 && typeof attrs === 'string') { + // Get attr + if (this[0]) return this[0].getAttribute(attrs); + else return undefined; + } + else { + // Set attrs + for (var i = 0; i < this.length; i++) { + if (arguments.length === 2) { + // String + this[i].setAttribute(attrs, value); + } + else { + // Object + for (var attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + return this; + } + }, + removeAttr: function (attr) { + for (var i = 0; i < this.length; i++) { + this[i].removeAttribute(attr); + } + return this; + }, + data: function (key, value) { + if (typeof value === 'undefined') { + // Get value + if (this[0]) { + var dataKey = this[0].getAttribute('data-' + key); + if (dataKey) return dataKey; + else if (this[0].dom7ElementDataStorage && (key in this[0].dom7ElementDataStorage)) return this[0].dom7ElementDataStorage[key]; + else return undefined; + } + else return undefined; + } + else { + // Set value + for (var i = 0; i < this.length; i++) { + var el = this[i]; + if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {}; + el.dom7ElementDataStorage[key] = value; + } + return this; + } + }, + // Transforms + transform : function (transform) { + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform; + } + return this; + }, + transition: function (duration) { + if (typeof duration !== 'string') { + duration = duration + 'ms'; + } + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration; + } + return this; + }, + //Events + on: function (eventName, targetSelector, listener, capture) { + function handleLiveEvent(e) { + var target = e.target; + if ($(target).is(targetSelector)) listener.call(target, e); + else { + var parents = $(target).parents(); + for (var k = 0; k < parents.length; k++) { + if ($(parents[k]).is(targetSelector)) listener.call(parents[k], e); + } + } + } + var events = eventName.split(' '); + var i, j; + for (i = 0; i < this.length; i++) { + if (typeof targetSelector === 'function' || targetSelector === false) { + // Usual events + if (typeof targetSelector === 'function') { + listener = arguments[1]; + capture = arguments[2] || false; + } + for (j = 0; j < events.length; j++) { + this[i].addEventListener(events[j], listener, capture); + } + } + else { + //Live events + for (j = 0; j < events.length; j++) { + if (!this[i].dom7LiveListeners) this[i].dom7LiveListeners = []; + this[i].dom7LiveListeners.push({listener: listener, liveListener: handleLiveEvent}); + this[i].addEventListener(events[j], handleLiveEvent, capture); + } + } + } + + return this; + }, + off: function (eventName, targetSelector, listener, capture) { + var events = eventName.split(' '); + for (var i = 0; i < events.length; i++) { + for (var j = 0; j < this.length; j++) { + if (typeof targetSelector === 'function' || targetSelector === false) { + // Usual events + if (typeof targetSelector === 'function') { + listener = arguments[1]; + capture = arguments[2] || false; + } + this[j].removeEventListener(events[i], listener, capture); + } + else { + // Live event + if (this[j].dom7LiveListeners) { + for (var k = 0; k < this[j].dom7LiveListeners.length; k++) { + if (this[j].dom7LiveListeners[k].listener === listener) { + this[j].removeEventListener(events[i], this[j].dom7LiveListeners[k].liveListener, capture); + } + } + } + } + } + } + return this; + }, + once: function (eventName, targetSelector, listener, capture) { + var dom = this; + if (typeof targetSelector === 'function') { + targetSelector = false; + listener = arguments[1]; + capture = arguments[2]; + } + function proxy(e) { + listener(e); + dom.off(eventName, targetSelector, proxy, capture); + } + dom.on(eventName, targetSelector, proxy, capture); + }, + trigger: function (eventName, eventData) { + for (var i = 0; i < this.length; i++) { + var evt; + try { + evt = new window.CustomEvent(eventName, {detail: eventData, bubbles: true, cancelable: true}); + } + catch (e) { + evt = document.createEvent('Event'); + evt.initEvent(eventName, true, true); + evt.detail = eventData; + } + this[i].dispatchEvent(evt); + } + return this; + }, + transitionEnd: function (callback) { + var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'], + i, j, dom = this; + function fireCallBack(e) { + /*jshint validthis:true */ + if (e.target !== this) return; + callback.call(this, e); + for (i = 0; i < events.length; i++) { + dom.off(events[i], fireCallBack); + } + } + if (callback) { + for (i = 0; i < events.length; i++) { + dom.on(events[i], fireCallBack); + } + } + return this; + }, + // Sizing/Styles + width: function () { + if (this[0] === window) { + return window.innerWidth; + } + else { + if (this.length > 0) { + return parseFloat(this.css('width')); + } + else { + return null; + } + } + }, + outerWidth: function (includeMargins) { + if (this.length > 0) { + if (includeMargins) + return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left')); + else + return this[0].offsetWidth; + } + else return null; + }, + height: function () { + if (this[0] === window) { + return window.innerHeight; + } + else { + if (this.length > 0) { + return parseFloat(this.css('height')); + } + else { + return null; + } + } + }, + outerHeight: function (includeMargins) { + if (this.length > 0) { + if (includeMargins) + return this[0].offsetHeight + parseFloat(this.css('margin-top')) + parseFloat(this.css('margin-bottom')); + else + return this[0].offsetHeight; + } + else return null; + }, + offset: function () { + if (this.length > 0) { + var el = this[0]; + var box = el.getBoundingClientRect(); + var body = document.body; + var clientTop = el.clientTop || body.clientTop || 0; + var clientLeft = el.clientLeft || body.clientLeft || 0; + var scrollTop = window.pageYOffset || el.scrollTop; + var scrollLeft = window.pageXOffset || el.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; + } + else { + return null; + } + }, + css: function (props, value) { + var i; + if (arguments.length === 1) { + if (typeof props === 'string') { + if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); + } + else { + for (i = 0; i < this.length; i++) { + for (var prop in props) { + this[i].style[prop] = props[prop]; + } + } + return this; + } + } + if (arguments.length === 2 && typeof props === 'string') { + for (i = 0; i < this.length; i++) { + this[i].style[props] = value; + } + return this; + } + return this; + }, + + //Dom manipulation + each: function (callback) { + for (var i = 0; i < this.length; i++) { + callback.call(this[i], i, this[i]); + } + return this; + }, + html: function (html) { + if (typeof html === 'undefined') { + return this[0] ? this[0].innerHTML : undefined; + } + else { + for (var i = 0; i < this.length; i++) { + this[i].innerHTML = html; + } + return this; + } + }, + text: function (text) { + if (typeof text === 'undefined') { + if (this[0]) { + return this[0].textContent.trim(); + } + else return null; + } + else { + for (var i = 0; i < this.length; i++) { + this[i].textContent = text; + } + return this; + } + }, + is: function (selector) { + if (!this[0]) return false; + var compareWith, i; + if (typeof selector === 'string') { + var el = this[0]; + if (el === document) return selector === document; + if (el === window) return selector === window; + + if (el.matches) return el.matches(selector); + else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); + else if (el.mozMatchesSelector) return el.mozMatchesSelector(selector); + else if (el.msMatchesSelector) return el.msMatchesSelector(selector); + else { + compareWith = $(selector); + for (i = 0; i < compareWith.length; i++) { + if (compareWith[i] === this[0]) return true; + } + return false; + } + } + else if (selector === document) return this[0] === document; + else if (selector === window) return this[0] === window; + else { + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + for (i = 0; i < compareWith.length; i++) { + if (compareWith[i] === this[0]) return true; + } + return false; + } + return false; + } + + }, + index: function () { + if (this[0]) { + var child = this[0]; + var i = 0; + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) i++; + } + return i; + } + else return undefined; + }, + eq: function (index) { + if (typeof index === 'undefined') return this; + var length = this.length; + var returnIndex; + if (index > length - 1) { + return new Dom7([]); + } + if (index < 0) { + returnIndex = length + index; + if (returnIndex < 0) return new Dom7([]); + else return new Dom7([this[returnIndex]]); + } + return new Dom7([this[index]]); + }, + append: function (newChild) { + var i, j; + for (i = 0; i < this.length; i++) { + if (typeof newChild === 'string') { + var tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } + else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j++) { + this[i].appendChild(newChild[j]); + } + } + else { + this[i].appendChild(newChild); + } + } + return this; + }, + prepend: function (newChild) { + var i, j; + for (i = 0; i < this.length; i++) { + if (typeof newChild === 'string') { + var tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + for (j = tempDiv.childNodes.length - 1; j >= 0; j--) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + // this[i].insertAdjacentHTML('afterbegin', newChild); + } + else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j++) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } + else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + return this; + }, + insertBefore: function (selector) { + var before = $(selector); + for (var i = 0; i < this.length; i++) { + if (before.length === 1) { + before[0].parentNode.insertBefore(this[i], before[0]); + } + else if (before.length > 1) { + for (var j = 0; j < before.length; j++) { + before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]); + } + } + } + }, + insertAfter: function (selector) { + var after = $(selector); + for (var i = 0; i < this.length; i++) { + if (after.length === 1) { + after[0].parentNode.insertBefore(this[i], after[0].nextSibling); + } + else if (after.length > 1) { + for (var j = 0; j < after.length; j++) { + after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling); + } + } + } + }, + next: function (selector) { + if (this.length > 0) { + if (selector) { + if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) return new Dom7([this[0].nextElementSibling]); + else return new Dom7([]); + } + else { + if (this[0].nextElementSibling) return new Dom7([this[0].nextElementSibling]); + else return new Dom7([]); + } + } + else return new Dom7([]); + }, + nextAll: function (selector) { + var nextEls = []; + var el = this[0]; + if (!el) return new Dom7([]); + while (el.nextElementSibling) { + var next = el.nextElementSibling; + if (selector) { + if($(next).is(selector)) nextEls.push(next); + } + else nextEls.push(next); + el = next; + } + return new Dom7(nextEls); + }, + prev: function (selector) { + if (this.length > 0) { + if (selector) { + if (this[0].previousElementSibling && $(this[0].previousElementSibling).is(selector)) return new Dom7([this[0].previousElementSibling]); + else return new Dom7([]); + } + else { + if (this[0].previousElementSibling) return new Dom7([this[0].previousElementSibling]); + else return new Dom7([]); + } + } + else return new Dom7([]); + }, + prevAll: function (selector) { + var prevEls = []; + var el = this[0]; + if (!el) return new Dom7([]); + while (el.previousElementSibling) { + var prev = el.previousElementSibling; + if (selector) { + if($(prev).is(selector)) prevEls.push(prev); + } + else prevEls.push(prev); + el = prev; + } + return new Dom7(prevEls); + }, + parent: function (selector) { + var parents = []; + for (var i = 0; i < this.length; i++) { + if (selector) { + if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); + } + else { + parents.push(this[i].parentNode); + } + } + return $($.unique(parents)); + }, + parents: function (selector) { + var parents = []; + for (var i = 0; i < this.length; i++) { + var parent = this[i].parentNode; + while (parent) { + if (selector) { + if ($(parent).is(selector)) parents.push(parent); + } + else { + parents.push(parent); + } + parent = parent.parentNode; + } + } + return $($.unique(parents)); + }, + find : function (selector) { + var foundElements = []; + for (var i = 0; i < this.length; i++) { + var found = this[i].querySelectorAll(selector); + for (var j = 0; j < found.length; j++) { + foundElements.push(found[j]); + } + } + return new Dom7(foundElements); + }, + children: function (selector) { + var children = []; + for (var i = 0; i < this.length; i++) { + var childNodes = this[i].childNodes; + + for (var j = 0; j < childNodes.length; j++) { + if (!selector) { + if (childNodes[j].nodeType === 1) children.push(childNodes[j]); + } + else { + if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) children.push(childNodes[j]); + } + } + } + return new Dom7($.unique(children)); + }, + remove: function () { + for (var i = 0; i < this.length; i++) { + if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); + } + return this; + }, + add: function () { + var dom = this; + var i, j; + for (i = 0; i < arguments.length; i++) { + var toAdd = $(arguments[i]); + for (j = 0; j < toAdd.length; j++) { + dom[dom.length] = toAdd[j]; + dom.length++; + } + } + return dom; + } + }; + $.fn = Dom7.prototype; + $.unique = function (arr) { + var unique = []; + for (var i = 0; i < arr.length; i++) { + if (unique.indexOf(arr[i]) === -1) unique.push(arr[i]); + } + return unique; + }; + + return $; + })(); + + + /*=========================== + Get Dom libraries + ===========================*/ + var swiperDomPlugins = ['jQuery', 'Zepto', 'Dom7']; + for (var i = 0; i < swiperDomPlugins.length; i++) { + if (window[swiperDomPlugins[i]]) { + addLibraryPlugin(window[swiperDomPlugins[i]]); + } + } + // Required DOM Plugins + var domLib; + if (typeof Dom7 === 'undefined') { + domLib = window.Dom7 || window.Zepto || window.jQuery; + } + else { + domLib = Dom7; + } + + + /*=========================== + Add .swiper plugin from Dom libraries + ===========================*/ + function addLibraryPlugin(lib) { + lib.fn.swiper = function (params) { + var firstInstance; + lib(this).each(function () { + var s = new Swiper(this, params); + if (!firstInstance) firstInstance = s; + }); + return firstInstance; + }; + } + + if (domLib) { + if (!('transitionEnd' in domLib.fn)) { + domLib.fn.transitionEnd = function (callback) { + var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'], + i, j, dom = this; + function fireCallBack(e) { + /*jshint validthis:true */ + if (e.target !== this) return; + callback.call(this, e); + for (i = 0; i < events.length; i++) { + dom.off(events[i], fireCallBack); + } + } + if (callback) { + for (i = 0; i < events.length; i++) { + dom.on(events[i], fireCallBack); + } + } + return this; + }; + } + if (!('transform' in domLib.fn)) { + domLib.fn.transform = function (transform) { + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform; + } + return this; + }; + } + if (!('transition' in domLib.fn)) { + domLib.fn.transition = function (duration) { + if (typeof duration !== 'string') { + duration = duration + 'ms'; + } + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration; + } + return this; + }; + } + if (!('outerWidth' in domLib.fn)) { + domLib.fn.outerWidth = function (includeMargins) { + if (this.length > 0) { + if (includeMargins) + return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left')); + else + return this[0].offsetWidth; + } + else return null; + }; + } + } + + + window.Swiper = Swiper; +})(); + +/*=========================== +Swiper AMD Export +===========================*/ +if (typeof(module) !== 'undefined') +{ + module.exports = window.Swiper; +} +else if (typeof define === 'function' && define.amd) { + define([], function () { + 'use strict'; + return window.Swiper; + }); +} + +//# sourceMappingURL=maps/swiper.js.map \ No newline at end of file diff --git a/src/assets/sucripts/swiper.min.css b/src/assets/sucripts/swiper.min.css new file mode 100644 index 0000000..542f193 --- /dev/null +++ b/src/assets/sucripts/swiper.min.css @@ -0,0 +1,15 @@ +/** + * Swiper 3.4.2 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * + * http://www.idangero.us/swiper/ + * + * Copyright 2017, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: March 10, 2017 + */ + .swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;width:100%;height:100%;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;transition:.3s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1;background:#007aff}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 5px}.swiper-pagination-progress{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progress .swiper-pagination-progressbar{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar{-webkit-transform-origin:right top;-moz-transform-origin:right top;-ms-transform-origin:right top;-o-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progress{width:100%;height:4px;left:0;top:0}.swiper-container-vertical>.swiper-pagination-progress{width:4px;height:100%;left:0;top:0}.swiper-pagination-progress.swiper-pagination-white{background:rgba(255,255,255,.5)}.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar{background:#fff}.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar{background:#000}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-coverflow .swiper-wrapper,.swiper-container-flip .swiper-wrapper{-ms-perspective:1200px}.swiper-container-cube,.swiper-container-flip{overflow:visible}.swiper-container-cube .swiper-slide,.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-cube .swiper-slide .swiper-slide,.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active,.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top,.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-slide{visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-zoom-container{width:100%;height:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:center;-moz-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-moz-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..eb78be0 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,38 @@ +//"http://ec2-34-222-134-101.us-west-2.compute.amazonaws.com" DNS +//"http://zendioninc.mooo.com" SITE +//"http://127.0.0.1" PRODUÇÃO +import { Router } from '@angular/router'; + +export class FuncoesGlobais { + + constructor(private router: Router) { } + + Logout() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserID"); + localStorage.removeItem("UserName"); + localStorage.removeItem("Role"); + window.history.pushState("", "", environment.LinkProjeto + "/home"); + window.location.reload(); + } + + CheckAdminRoute() { + if (localStorage.getItem("Role") != "1") { + if (localStorage.getItem("Role") == "2") + this.router.navigate(['/dashboard/cliente']); + else + this.router.navigate(['/login']); + } + } + +} + +export const environment = { + production: true, + Titulo: "Zendion, INC", + LinkProjeto: "https://zendioninc.com.br", + ApiUrl: "https://zendioninc.com.br/api", + GeoAPI: "01f438a7f97b3f8baafa65c58a9b4fc8&query", + emailContato: "contato@zendioninc.com.br", + telefoneContato: "+55 (19) 99871-7560" +}; \ No newline at end of file diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..c37ad80 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,38 @@ +//"http://ec2-34-222-134-101.us-west-2.compute.amazonaws.com" DNS +//"http://zendioninc.mooo.com" SITE +//"http://127.0.0.1" PRODUÇÃO +import { Router } from '@angular/router'; + +export class FuncoesGlobais { + + constructor(private router: Router) { } + + Logout() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserID"); + localStorage.removeItem("UserName"); + localStorage.removeItem("Role"); + window.history.pushState("", "", environment.LinkProjeto + "/home"); + window.location.reload(); + } + + CheckAdminRoute() { + if (localStorage.getItem("Role") != "1") { + if (localStorage.getItem("Role") == "2") + this.router.navigate(['/dashboard/cliente']); + else + this.router.navigate(['/login']); + } + } + +} + +export const environment = { + production: false, + Titulo: "Zendion, INC", + LinkProjeto: "https://zendioninc.com.br", + ApiUrl: "http://127.0.0.1:1337", + GeoAPI: "01f438a7f97b3f8baafa65c58a9b4fc8&query", + emailContato: "contato@zendioninc.com.br", + telefoneContato: "+55 (19) 99871-7560" +}; \ No newline at end of file diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5af82df14a178bdb07fca8f7c1e92436e2c11aeb GIT binary patch literal 3479 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 FV1gSNhqC|x literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..c037b02 --- /dev/null +++ b/src/index.html @@ -0,0 +1,21 @@ + + + + + Carregando... + + + + + + + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..3b2b7d0 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,13 @@ +import 'hammerjs'; +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..aa665d6 --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..2850164 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,139 @@ +/* Global Styles */ +body { + overflow-x: hidden; + background: radial-gradient(ellipse at bottom, #0d1d31 0%, #0c0d13 100%); + background-attachment: fixed; /* Faz o background ficar fixo ao scrollar */ + background-size: cover; /* Faz com que o background cubra a tela inteira */ + color: #FFF; + font-family: 'Roboto', "Helvetica Neue", sans-serif; + margin: 0; + line-height: 1.6; + height: 100%; +} + + +html, body { + height: 100%; +} + +hr { + background-color: #FFF; + border: none; + height: 1px; + margin: 2em auto; + width: 70%; +} + +/* Header Improvements */ +.header { + background: #003366; /* Azul escuro sólido para combinar com a identidade visual */ + border-bottom: 2px solid #001F3F; /* Um tom mais escuro para destaque */ + height: 3em; + width: 100vw; + position: fixed; + top: 0; + left: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 2em; +} + +.header img { + height: 80%; +} + +.header .btnSearch { + color: #FFF; + font-size: 1.1rem; + cursor: pointer; + transition: color 0.3s ease; +} + +.header .btnSearch:hover { + color: #FFD700; /* Adiciona um efeito de hover com um dourado suave */ +} + +.header .btn { + background-color: #001F3F; + border-color: #001F3F; + color: white; + transition: background-color 0.3s ease, border-color 0.3s ease; +} + +.header .btn:hover { + background-color: #FFD700; + border-color: #FFD700; +} + +/* Footer Improvements */ +.footer { + background-color: #001F3F; /* Azul escuro para o footer */ + color: white; + padding: 2em; + text-align: center; + position: relative; + bottom: 0; + width: 100%; + box-shadow: 0px -5px 15px rgba(0, 0, 0, 0.3); +} + +.footer p { + margin: 0.5em 0; + font-size: 1rem; +} + +.footer a { + color: #FFD700; + text-decoration: none; + transition: color 0.3s ease; +} + +.footer a:hover { + color: #FFF; +} + +/* Scrollbar Customization */ +body::-webkit-scrollbar { + width: 10px; +} + +body::-webkit-scrollbar-track { + background: #111; +} + +body::-webkit-scrollbar-thumb { + background: #003366; + border-radius: 10px; +} + +body::-webkit-scrollbar-thumb:hover { + background: #FFD700; +} + +/* Buttons */ +.btn { + background-color: #003366; + border: none; + color: white; + padding: 0.75em 1.5em; + font-size: 1rem; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.btn:hover { + background-color: #001F3F; +} + +/* Links */ +a { + color: #FFD700; + text-decoration: none; + transition: color 0.3s ease; +} + +a:hover { + color: #FFF; +} diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/termos.html b/termos.html new file mode 100644 index 0000000..6ce86ba --- /dev/null +++ b/termos.html @@ -0,0 +1 @@ +

    1. Termos

    2. Uso de Licença

    É concedida permissão para baixar temporariamente uma cópia dos materiais (informações ou software) no site Zendion Inc , apenas para visualização transitória pessoal e não comercial. Esta é a concessão de uma licença, não uma transferência de título e, sob esta licença, você não pode: 

    1. modificar ou copiar os materiais; 
    2. usar os materiais para qualquer finalidade comercial ou para exibição pública (comercial ou não comercial); 
    3. tentar descompilar ou fazer engenharia reversa de qualquer software contido no site Zendion Inc; 
    4. remover quaisquer direitos autorais ou outras notações de propriedade dos materiais; ou 
    5. transferir os materiais para outra pessoa ou 'espelhe' os materiais em qualquer outro servidor.

    Esta licença será automaticamente rescindida se você violar alguma dessas restrições e poderá ser rescindida por Zendion Inc a qualquer momento. Ao encerrar a visualização desses materiais ou após o término desta licença, você deve apagar todos os materiais baixados em sua posse, seja em formato eletrónico ou impresso.

    3. Isenção de responsabilidade

    1. Os materiais no site da Zendion Inc são fornecidos 'como estão'. Zendion Inc não oferece garantias, expressas ou implícitas, e, por este meio, isenta e nega todas as outras garantias, incluindo, sem limitação, garantias implícitas ou condições de comercialização, adequação a um fim específico ou não violação de propriedade intelectual ou outra violação de direitos.
    2. Além disso, o Zendion Inc não garante ou faz qualquer representação relativa à precisão, aos resultados prováveis ​​ou à confiabilidade do uso dos materiais em seu site ou de outra forma relacionado a esses materiais ou em sites vinculados a este site.

    4. Limitações

    Em nenhum caso o Zendion Inc ou seus fornecedores serão responsáveis ​​por quaisquer danos (incluindo, sem limitação, danos por perda de dados ou lucro ou devido a interrupção dos negócios) decorrentes do uso ou da incapacidade de usar os materiais em Zendion Inc, mesmo que Zendion Inc ou um representante autorizado da Zendion Inc tenha sido notificado oralmente ou por escrito da possibilidade de tais danos. Como algumas jurisdições não permitem limitações em garantias implícitas, ou limitações de responsabilidade por danos conseqüentes ou incidentais, essas limitações podem não se aplicar a você.

    5. Precisão dos materiais

    Os materiais exibidos no site da Zendion Inc podem incluir erros técnicos, tipográficos ou fotográficos. Zendion Inc não garante que qualquer material em seu site seja preciso, completo ou atual. Zendion Inc pode fazer alterações nos materiais contidos em seu site a qualquer momento, sem aviso prévio. No entanto, Zendion Inc não se compromete a atualizar os materiais.

    6. Links

    O Zendion Inc não analisou todos os sites vinculados ao seu site e não é responsável pelo conteúdo de nenhum site vinculado. A inclusão de qualquer link não implica endosso por Zendion Inc do site. O uso de qualquer site vinculado é por conta e risco do usuário.


    Modificações

    O Zendion Inc pode revisar estes termos de serviço do site a qualquer momento, sem aviso prévio. Ao usar este site, você concorda em ficar vinculado à versão atual desses termos de serviço.

    Lei aplicável

    Estes termos e condições são regidos e interpretados de acordo com as leis do Zendion Inc e você se submete irrevogavelmente à jurisdição exclusiva dos tribunais naquele estado ou localidade.

    \ No newline at end of file diff --git a/termos.txt b/termos.txt new file mode 100644 index 0000000..25ec777 --- /dev/null +++ b/termos.txt @@ -0,0 +1 @@ +1. TermosAo acessar ao site Zendion Inc, concorda em cumprir estes termos de serviço, todas as leis e regulamentos aplicáveis ​​e concorda que é responsável pelo cumprimento de todas as leis locais aplicáveis. Se você não concordar com algum desses termos, está proibido de usar ou acessar este site. Os materiais contidos neste site são protegidos pelas leis de direitos autorais e marcas comerciais aplicáveis.2. Uso de LicençaÉ concedida permissão para baixar temporariamente uma cópia dos materiais (informações ou software) no site Zendion Inc , apenas para visualização transitória pessoal e não comercial. Esta é a concessão de uma licença, não uma transferência de título e, sob esta licença, você não pode: modificar ou copiar os materiais; usar os materiais para qualquer finalidade comercial ou para exibição pública (comercial ou não comercial); tentar descompilar ou fazer engenharia reversa de qualquer software contido no site Zendion Inc; remover quaisquer direitos autorais ou outras notações de propriedade dos materiais; ou transferir os materiais para outra pessoa ou 'espelhe' os materiais em qualquer outro servidor.Esta licença será automaticamente rescindida se você violar alguma dessas restrições e poderá ser rescindida por Zendion Inc a qualquer momento. Ao encerrar a visualização desses materiais ou após o término desta licença, você deve apagar todos os materiais baixados em sua posse, seja em formato eletrónico ou impresso.3. Isenção de responsabilidadeOs materiais no site da Zendion Inc são fornecidos 'como estão'. Zendion Inc não oferece garantias, expressas ou implícitas, e, por este meio, isenta e nega todas as outras garantias, incluindo, sem limitação, garantias implícitas ou condições de comercialização, adequação a um fim específico ou não violação de propriedade intelectual ou outra violação de direitos.Além disso, o Zendion Inc não garante ou faz qualquer representação relativa à precisão, aos resultados prováveis ​​ou à confiabilidade do uso dos materiais em seu site ou de outra forma relacionado a esses materiais ou em sites vinculados a este site.4. LimitaçõesEm nenhum caso o Zendion Inc ou seus fornecedores serão responsáveis ​​por quaisquer danos (incluindo, sem limitação, danos por perda de dados ou lucro ou devido a interrupção dos negócios) decorrentes do uso ou da incapacidade de usar os materiais em Zendion Inc, mesmo que Zendion Inc ou um representante autorizado da Zendion Inc tenha sido notificado oralmente ou por escrito da possibilidade de tais danos. Como algumas jurisdições não permitem limitações em garantias implícitas, ou limitações de responsabilidade por danos conseqüentes ou incidentais, essas limitações podem não se aplicar a você.5. Precisão dos materiaisOs materiais exibidos no site da Zendion Inc podem incluir erros técnicos, tipográficos ou fotográficos. Zendion Inc não garante que qualquer material em seu site seja preciso, completo ou atual. Zendion Inc pode fazer alterações nos materiais contidos em seu site a qualquer momento, sem aviso prévio. No entanto, Zendion Inc não se compromete a atualizar os materiais.6. LinksO Zendion Inc não analisou todos os sites vinculados ao seu site e não é responsável pelo conteúdo de nenhum site vinculado. A inclusão de qualquer link não implica endosso por Zendion Inc do site. O uso de qualquer site vinculado é por conta e risco do usuário.ModificaçõesO Zendion Inc pode revisar estes termos de serviço do site a qualquer momento, sem aviso prévio. Ao usar este site, você concorda em ficar vinculado à versão atual desses termos de serviço.Lei aplicávelEstes termos e condições são regidos e interpretados de acordo com as leis do Zendion Inc e você se submete irrevogavelmente à jurisdição exclusiva dos tribunais naquele estado ou localidade. \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..31f8397 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..30956ae --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..6400fde --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..f0adae9 --- /dev/null +++ b/tslint.json @@ -0,0 +1,92 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file

    Ao acessar ao site Zendion Inc, concorda em cumprir estes termos de serviço, todas as leis e regulamentos aplicáveis ​​e concorda que é responsável pelo cumprimento de todas as leis locais aplicáveis. Se você não concordar com algum desses termos, está proibido de usar ou acessar este site. Os materiais contidos neste site são protegidos pelas leis de direitos autorais e marcas comerciais aplicáveis.