From 3f826ffc8605cc1a5faba2cffcc2b080b2817319 Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 14 Sep 2022 18:14:03 +0200 Subject: [PATCH 01/38] Translation to spanish --- .../components/header/header.component.html | 2 +- .../add_camera/vid.component.html | 18 ++-- .../algorithms/algorithms.component.html | 96 ++++++++++++++----- .../algorithms/algorithms.component.ts | 14 ++- .../camera_list/livestream.component.html | 16 ++-- .../camera_list/livestream.component.ts | 2 +- .../livestream/live.component.html | 2 +- .../pages/cameras_conf/roi/roi.component.ts | 26 ++++- .../pages/online/admin/admin.component.html | 6 +- .../app/pages/online/admin/admin.component.ts | 20 ++-- .../change-pass/change-pass.component.html | 22 ++--- .../graphs/center/center.component.html | 10 +- .../online/graphs/center/center.component.ts | 4 +- .../graphs/control/control.component.html | 22 ++--- .../graphs/control/control.component.ts | 20 ++-- .../online/graphs/dash/dash.component.ts | 10 +- .../ham-cheese/ham-cheese.component.html | 34 +++---- .../graphs/ham-cheese/ham-cheese.component.ts | 35 +++---- .../online/graphs/queue/queue.component.html | 30 +++--- .../online/graphs/queue/queue.component.ts | 3 + .../pages/online/log-in/log-in.component.html | 8 +- .../pages/online/log-in/log-in.component.ts | 2 +- .../pages/online/set-up/set-up.component.html | 73 +++++++------- .../pages/online/ticket/ticket.component.html | 40 ++++---- .../pages/online/ticket/ticket.component.ts | 28 +++--- client/src/app/pages/pages-menu.ts | 52 +++++----- .../app/pages/search/list/list.component.html | 10 +- .../app/pages/search/list/list.component.ts | 2 +- .../pages/search/upload/upload.component.html | 84 +--------------- .../pages/search/upload/upload.component.ts | 6 +- server/app/controllers/auth.controller.js | 6 +- .../app/controllers/relations.controller.js | 15 ++- server/app/initializator/updateFunc.js | 21 ++++ server/app/middleware/authJwt.js | 4 +- server/server.js | 8 ++ 35 files changed, 394 insertions(+), 357 deletions(-) create mode 100644 server/app/initializator/updateFunc.js diff --git a/client/src/app/@theme/components/header/header.component.html b/client/src/app/@theme/components/header/header.component.html index 7a317ba9..2351b03f 100755 --- a/client/src/app/@theme/components/header/header.component.html +++ b/client/src/app/@theme/components/header/header.component.html @@ -13,7 +13,7 @@
- + - +
@@ -19,22 +19,22 @@
Lat: {{camera.atributes.latitu
-
Name:
+
Nombre:
- +
- Fill the name to proceed. + Porfavor llenar nombre.
-
Rtsp link:
+
Link Rtsp:
- Fill an Rtsp link to proceed. + Porfavor llenar link Rtsp.
- This Rtsp link has been used in this branch. + Este link esta en uso.
@@ -46,7 +46,7 @@
Latitude:
--> - +
diff --git a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html index f25f18da..330de2e5 100755 --- a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html +++ b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html @@ -2,14 +2,14 @@
-

Settings of {{camera.name}}

+

Configuracion de {{camera.name}}

- + {{remaining.analytics}} @@ -22,16 +22,16 @@

Settings of {{camera.name}}

- A) People related.   + A) Personas.   {{actC}}/{{Calgos.length}}
Status - Name - RoI - Confidence - Save crops + Nombre + RdI +
@@ -42,13 +42,22 @@

Settings of {{camera.name}}

for={{algorithm.id}}>
{{algorithm.name}} - -  % + + + + +
- + - C) Security realated.  {{actA}}/{{Aalgos.length}} + B) Seguridad.  {{actA}}/{{Aalgos.length}}
Status - Name - RoI - Confidence - Save crops + Nombre + RdI +
@@ -127,8 +136,8 @@

Settings of {{camera.name}}

- {{algorithm.id == 4 || algorithm.id == 8 ? 'Hacer click para definir area necesaria' : 'Agregar area de foco'}} +
@@ -153,9 +162,9 @@

Settings of {{camera.name}}

- + - +
@@ -402,6 +411,41 @@

Settings of {{camera.name}}

+ + diff --git a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts index a0c27629..7764260b 100755 --- a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts +++ b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts @@ -65,7 +65,7 @@ export class AlgorithmsComponent implements OnInit { this.Calgos.push(this.algos[i]); } else if (this.algos[i]['id'] > 3 && this.algos[i]['id'] <= 8 || this.algos[i]['id'] === 5 || this.algos[i]['id'] === 13 || this.algos[i]['id'] === 25 || this.algos[i]['id'] === 26 || this.algos[i]['id'] === 28 || this.algos[i]['id'] === 29 || this.algos[i]['id'] === 30 || this.algos[i]['id'] === 31 || this.algos[i]['id'] === 33 || this.algos[i]['id'] === 58 || this.algos[i]['id'] === 34 || this.algos[i]['id'] === 63 || this.algos[i]['id'] === 65) { this.Balgos.push(this.algos[i]); - } else if (this.algos[i]['id'] > 8 && this.algos[i]['id'] <= 11 || this.algos[i]['id'] === 27 || this.algos[i]['id'] === 39 || this.algos[i]['id'] === 53 || this.algos[i]['id'] === 54 || this.algos[i]['id'] === 55 || this.algos[i]['id'] === 56 || this.algos[i]['id'] === 66 || this.algos[i]['id'] === 64) { + } else if (this.algos[i]['id'] > 8 && this.algos[i]['id'] <= 11 || this.algos[i]['id'] === 27 || this.algos[i]['id'] === 39 || this.algos[i]['id'] === 53 || this.algos[i]['id'] === 54 || this.algos[i]['id'] === 55 || this.algos[i]['id'] === 56 || this.algos[i]['id'] === 66 || this.algos[i]['id'] === 64 || this.algos[i]['id'] === 69) { this.Aalgos.push(this.algos[i]); } } @@ -212,6 +212,14 @@ export class AlgorithmsComponent implements OnInit { quantity: any = { crowd: 50, }; + queue: any = { + peopleAlert: 5 + } + hamAndCheese: any = { + low: 1, + med: 3, + high: 5 + } showL: boolean; showS: boolean; showU0: boolean; @@ -423,7 +431,7 @@ export class AlgorithmsComponent implements OnInit { saave() { const data = []; const id = this.activatedRoute.snapshot.params.uuid; - data.push(this.algos, this.climb, this.loiteringTime, this.aod, this.speed, this.unwanted, this.dac, this.quantity, this.parkingTime); + data.push(this.algos, this.climb, this.loiteringTime, this.aod, this.speed, this.unwanted, this.dac, this.quantity, this.parkingTime,this.queue, this.hamAndCheese); this.facesService.sendAlgs(id, data).subscribe( res => { // this.router.navigateByUrl(`/pages/cameras/algorithms/${id}`) @@ -440,7 +448,7 @@ export class AlgorithmsComponent implements OnInit { nSave() { const data = []; const id = this.activatedRoute.snapshot.params.uuid; - data.push(this.algos, this.climb, this.loiteringTime, this.aod, this.speed, this.unwanted, this.dac, this.quantity, this.parkingTime); + data.push(this.algos, this.climb, this.loiteringTime, this.aod, this.speed, this.unwanted, this.dac, this.quantity, this.parkingTime, this.queue, this.hamAndCheese); this.facesService.sendAlgs(id, data).subscribe( res => {}, err => console.log(err), diff --git a/client/src/app/pages/cameras_conf/camera_list/livestream.component.html b/client/src/app/pages/cameras_conf/camera_list/livestream.component.html index 261669dc..5cde5480 100755 --- a/client/src/app/pages/cameras_conf/camera_list/livestream.component.html +++ b/client/src/app/pages/cameras_conf/camera_list/livestream.component.html @@ -5,7 +5,7 @@ - + {{remaining.cameras}} @@ -15,12 +15,12 @@ - - - - + + + + - + @@ -29,10 +29,10 @@
Name
Play
Edit
 Algorithms
Nombre
Reproducir
Editar
 Algoritmos
 Heatmap
Delete
Eliminar
diff --git a/client/src/app/pages/cameras_conf/roi/roi.component.ts b/client/src/app/pages/cameras_conf/roi/roi.component.ts index 38b5ac55..187960f9 100755 --- a/client/src/app/pages/cameras_conf/roi/roi.component.ts +++ b/client/src/app/pages/cameras_conf/roi/roi.component.ts @@ -18,6 +18,12 @@ export class ROIComponent implements OnInit { link: SafeResourceUrl; open:boolean; actANPR: boolean = false; + queue: number; + hamAndCheese : any = { + low: 0, + med: 3, + high: 5 + } constructor(private rd: Renderer2, private facesService: FacesService, private activatedRoute: ActivatedRoute,sanitizer: DomSanitizer, private colo:ColorsService, private router: Router) { const params = this.activatedRoute.snapshot.params; this.wrong['dir'] = 'beggining'; @@ -33,6 +39,14 @@ export class ROIComponent implements OnInit { } this.atr['save'] = a[1] this.atr['time'] = Number(a[2]) + if(params.id === '22'){ + this.queue = a[3] + } + if(params.id === '68'){ + this.hamAndCheese.low = a[3] + this.hamAndCheese.med = a[4] + this.hamAndCheese.high = a[5] + } this.facesService.getAlgos() .subscribe( res =>{ @@ -89,7 +103,7 @@ export class ROIComponent implements OnInit { algorithm: Algorithm = { id: -1, - name: "Loading" + name: "Cargando" }; relation: Relation ={ camera_id: '', @@ -183,7 +197,6 @@ export class ROIComponent implements OnInit { this.res_height =this.camera.cam_height; this.resRelation = this.res_height / this.res_width; this.width = rect.width; - console.log(this.width, rect.width) this.height = this.width*this.resRelation; }, err =>{console.error(err)}) @@ -688,11 +701,20 @@ nSave(){ } } } + if(this.id == 22){ + this.atr['peopleAlert'] = this.queue + console.log('aaaa', this.queue) + } + if(this.id == 68){ + this.atr['hamAndCheese'] = this.hamAndCheese + } + data = { rois: this.polygons, id: this.id, conf: this.atr } + this.facesService.sendRois(id,data).subscribe( res => console.log(res), err => console.log(err) diff --git a/client/src/app/pages/online/admin/admin.component.html b/client/src/app/pages/online/admin/admin.component.html index e0649a58..9aeab63a 100755 --- a/client/src/app/pages/online/admin/admin.component.html +++ b/client/src/app/pages/online/admin/admin.component.html @@ -1,13 +1,13 @@
- + - Choose where to filter: + Donde filtrar: {{obj.show}}
- Choose a field to search. + Porfavor elegir un campo para buscar.
diff --git a/client/src/app/pages/online/admin/admin.component.ts b/client/src/app/pages/online/admin/admin.component.ts index f00d417d..52d3a8c0 100755 --- a/client/src/app/pages/online/admin/admin.component.ts +++ b/client/src/app/pages/online/admin/admin.component.ts @@ -33,7 +33,7 @@ export class AdminComponent implements OnInit { searchFields = [ { value: 'username', - show: 'User Name' + show: 'Usuario' }, { value: 'email', @@ -41,7 +41,7 @@ export class AdminComponent implements OnInit { }, { value: 'role', - show: 'Role' + show: 'Tipo' }, ]; searchWr:string = ''; @@ -52,7 +52,7 @@ export class AdminComponent implements OnInit { actions: { position: 'right', //custom: [{ name: 'routeToAPage', title: `` }] - columnTitle: 'Add User', + columnTitle: 'Agregar Usuario', // add: true, // edit: true, // delete: true, @@ -80,10 +80,10 @@ export class AdminComponent implements OnInit { deleteButtonContent: '', confirmDelete: true, }, - noDataMessage: "No users found", + noDataMessage: "No hay usuarios encontrados.", columns: { username: { - title: 'User Name', + title: 'Usuario', type: 'string', filter: false }, @@ -93,12 +93,12 @@ export class AdminComponent implements OnInit { filter: false }, role: { - title: 'Role', + title: 'Tipo', type: 'string', filter: false }, changePs: { - title: 'Change Password', + title: 'Cambiar clave', type: 'custom', filter: false, renderComponent: ButtonViewComponent, @@ -109,7 +109,7 @@ export class AdminComponent implements OnInit { } }, disabled: { - title: 'Active', + title: 'Activo', type: 'custom', filter: false, renderComponent: ButtonComponent, @@ -164,7 +164,7 @@ export class AdminComponent implements OnInit { } hola3(event): void{ - if(confirm("Do you want to delete "+ event.data.username +" account?")){ + if(confirm("Se quiere eliminar la cuenta "+ event.data.username +"?")){ this.accountserv.deleteAccount(event.data.id,event.data.role).subscribe( res => { console.log(res) @@ -194,7 +194,7 @@ export class ButtonViewComponent implements ViewCell, OnInit { @Output() save: EventEmitter = new EventEmitter(); openWindowForm() { - this.windowService.open(ChangePassComponent, { title: `Change Password for ${this.rowData.username}`, context: { id: this.rowData.id}}); + this.windowService.open(ChangePassComponent, { title: `Cambiar clave de ${this.rowData.username}`, context: { id: this.rowData.id}}); } ngOnInit() { diff --git a/client/src/app/pages/online/change-pass/change-pass.component.html b/client/src/app/pages/online/change-pass/change-pass.component.html index b62ef804..2594fba9 100755 --- a/client/src/app/pages/online/change-pass/change-pass.component.html +++ b/client/src/app/pages/online/change-pass/change-pass.component.html @@ -1,23 +1,23 @@
- - + +
-
Password is required
-
Password must be at least 10 characters
-
Password must contain at least 1 uppercase, 1 lowercase, 1 number and a special character ( # ? ! @ $ % ^ & * - _ )
+
La clave es requerida
+
La clave debe contener al menos 10 caracteres
+
La clave debe contener al menos: 1 mayuscula, 1 minuscula, 1 numero y un caracter especial ( # ? ! @ $ % ^ & * - _ )
- - + +
-
Confirm Password is required
-
Passwords must match
+
La clave debe ser confirmada
+
La clave debe ser exacta
- View Password + Ver clave
- +
\ No newline at end of file diff --git a/client/src/app/pages/online/graphs/center/center.component.html b/client/src/app/pages/online/graphs/center/center.component.html index 8453dbdf..c0c7c70b 100755 --- a/client/src/app/pages/online/graphs/center/center.component.html +++ b/client/src/app/pages/online/graphs/center/center.component.html @@ -9,25 +9,25 @@ - General Dashboard + Dashboard general - PREMISES + Personas {{alg.name}} - THREATS + Lugar {{alg.name}} - LIVE VIEW + Vista en vivo - Live View + Vista en vivo diff --git a/client/src/app/pages/online/graphs/center/center.component.ts b/client/src/app/pages/online/graphs/center/center.component.ts index d814afa9..5afb30fe 100755 --- a/client/src/app/pages/online/graphs/center/center.component.ts +++ b/client/src/app/pages/online/graphs/center/center.component.ts @@ -29,13 +29,13 @@ export class CenterComponent implements OnInit { } overview ={ algo_id: -3, - name: 'General Dashboard', + name: 'Dashboard General', status: "'primary'" } liveView = { algo_id: -4, - name: 'Live View', + name: 'Vista en vivo', status: "'primary'" } diff --git a/client/src/app/pages/online/graphs/control/control.component.html b/client/src/app/pages/online/graphs/control/control.component.html index b2b12652..b1990af6 100755 --- a/client/src/app/pages/online/graphs/control/control.component.html +++ b/client/src/app/pages/online/graphs/control/control.component.html @@ -6,7 +6,7 @@
- +
@@ -19,7 +19,7 @@
- Choose a camera: + Elegir camara: {{cam.name}}
@@ -31,7 +31,7 @@
- Off + Apagado 5 s 30 s 1 m @@ -46,12 +46,12 @@
- Fill the range, for a day, click it twice. + Complete el rango, para un dia, apretar dos veces.
- Choose a location: + Elegir un lugar: {{loc.username}}
@@ -136,10 +136,10 @@
- Date + Fecha
- +
@@ -147,10 +147,10 @@
- Month + Mes
- + {{calMonths[month.getMonth()] + " '" + month.getFullYear()}}
@@ -159,10 +159,10 @@
- Custom + Definido
- +
diff --git a/client/src/app/pages/online/graphs/control/control.component.ts b/client/src/app/pages/online/graphs/control/control.component.ts index 7a4a4634..7e19b4e9 100755 --- a/client/src/app/pages/online/graphs/control/control.component.ts +++ b/client/src/app/pages/online/graphs/control/control.component.ts @@ -30,26 +30,26 @@ export class ControlComponent implements OnInit, OnDestroy { renew: any; timezone: string; now_user: Account; - calMonths: string[] = ['Jan', 'Feb', 'March', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + calMonths: string[] = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre']; selectedDate: Date; selectedMonth: Date; lastMonths: Date[] = []; - currentSelection: string = 'Date'; + currentSelection: string = 'Fecha'; items = [ { - title: 'Cameras', + title: 'Camaras', icon: 'video-outline', link: '/pages/camerasList', children: [ { - title: 'Add Camera', + title: 'Agregar Camara', link: '/pages/cameras/add_camera', home: true, }, { - title: 'Cameras List', + title: 'Lista de Camaras', link: '/pages/camerasList', home: true, }, @@ -61,16 +61,16 @@ export class ControlComponent implements OnInit, OnDestroy { link: '/pages/tickets', }, { - title: 'Stored Videos', + title: 'Videos locales', icon: 'film-outline', link: '/pages/search/list', children: [ { - title: 'Video List', + title: 'Lista de videos', link: '/pages/search/list', }, { - title: 'Add Video', + title: 'Agregar video', link: '/pages/search/upload', }, ], @@ -86,7 +86,7 @@ export class ControlComponent implements OnInit, OnDestroy { if (authService.isAdmin){ this.items = [ { - title: 'Accounts', + title: 'Cuentas', icon: 'people-outline', link: '/pages/accounts', }, @@ -349,7 +349,7 @@ private showToast( body: string, status: NbComponentStatus) { position: this.position, preventDuplicates: this.preventDuplicates, }; - const titleContent = 'Look!'; + const titleContent = 'Mira!'; this.toastrService.show( body, diff --git a/client/src/app/pages/online/graphs/dash/dash.component.ts b/client/src/app/pages/online/graphs/dash/dash.component.ts index f38bb3fe..1a4c4a25 100755 --- a/client/src/app/pages/online/graphs/dash/dash.component.ts +++ b/client/src/app/pages/online/graphs/dash/dash.component.ts @@ -391,15 +391,15 @@ export class DashComponent implements OnInit , OnDestroy { cancelButtonContent: '', confirmSave: true, }, - noDataMessage: "No data found", + noDataMessage: "No se a encontrado data", columns: { type: { - title: 'INCIDENT TYPE', + title: 'Tipo de incidente', type: 'string', filter: false }, createdAt: { - title: 'TIME', + title: 'Hora', type: 'string', filter: false, // valuePrepareFunction: (createdAt) => { @@ -407,12 +407,12 @@ export class DashComponent implements OnInit , OnDestroy { // } }, cam_name: { - title: 'CAMERA', + title: 'Camara', type: 'string', filter: false, }, level: { - title: 'SEVERITY', + title: 'Severidad', type: 'custom', filter: false, renderComponent: SeverityComponent, diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html index 8882a58f..f7df1c4d 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html @@ -4,38 +4,38 @@
-

People over time

-

Total: {{queue == undefined ? 'None' : queue.count}}

+

Personas en el periodo

+

Total: {{queue == undefined ? '0' : queue.count}}

- Queue {{qu.zone}}: {{qu.amount}}

+ Fila {{qu.zone}}: {{qu.amount}}

-

Avg Wait Time: {{queue == undefined ? 'None' : queue.avg}} min

-

- Queue {{i + 1 === 1 ? 'Ham & Cheese' : 'Meat'}}: {{avg}} min

+

Tiempo de espera medio: {{queue == undefined ? '0' : queue.avg}} min

+

+ Fila {{i + 1 === 1 ? 'Jamon & Queso' : 'Carne'}}: {{avg}} min

-

Fastest Queue

-

{{queue == undefined || queue.min == undefined ? 'None' : queue.min}}

+

Fila mas rapida

+

{{queue == undefined || queue.min == undefined ? 'Ninguna' : queue.min}}

-

Slowest Queue

-

{{queue == undefined || queue.max == undefined ? 'None' : queue.max}}

+

Fila mas lenta

+

{{queue == undefined || queue.max == undefined ? 'Ninguna' : queue.max}}

@@ -44,7 +44,7 @@
-

People over time

+

Personas en el periodo

@@ -54,7 +54,7 @@
-

High alerts over time

+

Alertas altas en el periodo

@@ -64,7 +64,7 @@
-

Medium alerts over time

+

Alertas medias en el periodo

@@ -74,7 +74,7 @@
-

Low alerts over time

+

Alertas bajas en el periodo

@@ -84,8 +84,8 @@
- - + + @@ -111,7 +111,7 @@
-

Live Output Feed

+

Camara en tiempo real

diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts index 9ce2dd76..e3ef96d5 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts @@ -24,6 +24,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { now_user: Account; rtspIn: any; queues: Array = []; + avgss: Array = []; themeSubscription: any; dataL: any; dataM: any; @@ -115,6 +116,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { this.serv.queue(this.camera,l).subscribe( res=>{ this.queue = res['data'] + this.avgss = this.queue.avgs for(let m of this.queue.rawAlerts){ m['picture'] = this.sanitizer.bypassSecurityTrustUrl(api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['picture']) m['clip_path'] = api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['clip_path'] @@ -127,22 +129,22 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { } } if(this.queue.min === '1'){ - this.queue.min = 'Ham & Cheese' + this.queue.min = 'Jamon & Queso' }else if(this.queue.min === '2'){ - this.queue.min = 'Meat' + this.queue.min = 'Carnes' } if(this.queue.max === '1'){ - this.queue.max = 'Ham & Cheese' + this.queue.max = 'Jamon & Queso' }else if(this.queue.max === '2'){ - this.queue.max = 'Meat' + this.queue.max = 'Carnes' } for(const qu in this.queue.countAll){ let name; if(qu === '1'){ - name = 'Ham & Cheese' + name = 'Jamon & Queso' } if(qu === '2'){ - name = 'Meat' + name = 'Carnes' } this.queues.push({zone: name, amount: this.queue.countAll[qu]}) } @@ -173,9 +175,9 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { for(let i = 0; i < this.queue.dataAlertsLow.length; i++){ let label = 'None' if(i + 1 === 1){ - label = 'Ham & Cheese' + label = 'Jamon & Quesos' }else if (i + 1 === 2){ - label = 'Meat' + label = 'Carnes' } datasetsLow.push({ label: `${label}`, @@ -220,7 +222,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { this.dataP = { labels: times, datasets: [{ - label: `People over time`, + label: `Personas en el periodo`, data: Object.values(this.queue.dataPeople), borderColor: colors.primary, backgroundColor: colors.primary, @@ -248,7 +250,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { display: false, scaleLabel: { display: false, - labelString: "Month", + labelString: "Mes", }, gridLines: { display: true, @@ -283,6 +285,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { err => { console.error(err) this.queue = undefined; + this.avgss = [] } ) } @@ -329,10 +332,10 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { display : true, perPage:5 }, - noDataMessage: "No data found", + noDataMessage: "No se encotro data.", columns: { picture: { - title: 'PICTURE', + title: 'Imagen', type: 'custom', filter: false, renderComponent: ButtonViewComponentPic, @@ -343,17 +346,17 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { } }, time: { - title: 'TIME', + title: 'Hora', type: 'string', filter: false }, camera_name: { - title: 'CAM', + title: 'Camara', type: 'string', filter: false }, severity: { - title: 'Severity', + title: 'Severidad', type: 'custom', filter: false, renderComponent: SeverityComponent, @@ -364,7 +367,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { }, }, zone: { - title: 'QUEUE', + title: 'Fila', type: 'string', filter: false } diff --git a/client/src/app/pages/online/graphs/queue/queue.component.html b/client/src/app/pages/online/graphs/queue/queue.component.html index 7d7cff00..43a1e682 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.html +++ b/client/src/app/pages/online/graphs/queue/queue.component.html @@ -4,38 +4,38 @@
-

People over time

-

Total: {{queue == undefined ? 'None' : queue.count}}

+

Personas en el periodo

+

Total: {{queue == undefined ? '0' : queue.count}}

- Queue {{qu.zone}}: {{qu.amount}}

+ Fila {{qu.zone}}: {{qu.amount}}

-

Avg Wait Time: {{queue == undefined ? 'None' : queue.avg}} min

-

- Queue {{i + 1}}: {{avg}} min

+

Tiempo de espera medio: {{queue == undefined ? '0' : queue.avg}} min

+

+ Fila {{i + 1}}: {{avg}} min

-

Fastest Queue

-

{{queue == undefined ? 'None' : queue.min}}

+

Fila mas rapida

+

{{queue == undefined ? 'Ninguna' : queue.min}}

-

Slowest Queue

-

{{queue == undefined ? 'None' : queue.max}}

+

Fila mas lenta

+

{{queue == undefined ? 'Ninguna' : queue.max}}

@@ -44,7 +44,7 @@
-

People over time

+

Personas en el periodo

@@ -54,7 +54,7 @@
-

High alerts over time

+

Alertas altas en el periodo

@@ -84,8 +84,8 @@
- - + + @@ -111,7 +111,7 @@
-

Live Output Feed

+

Camara en tiempo real

diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index 74887d90..a9826e42 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -23,6 +23,7 @@ export class QueueComponent implements OnInit, OnDestroy { now_user: Account; rtspIn: any; queues: Array = []; + avgss: Array = []; themeSubscription: any; dataL: any; dataM: any; @@ -113,6 +114,7 @@ export class QueueComponent implements OnInit, OnDestroy { this.serv.queue(this.camera,l).subscribe( res=>{ this.queue = res['data'] + this.avgss = this.queue.avgs for(let m of this.queue.rawAlerts){ m['picture'] = this.sanitizer.bypassSecurityTrustUrl(api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['picture']) m['clip_path'] = api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['clip_path'] @@ -258,6 +260,7 @@ export class QueueComponent implements OnInit, OnDestroy { err => { console.error(err) this.queue = undefined; + this.avgss = [] } ) } diff --git a/client/src/app/pages/online/log-in/log-in.component.html b/client/src/app/pages/online/log-in/log-in.component.html index 3d251048..e6c53106 100755 --- a/client/src/app/pages/online/log-in/log-in.component.html +++ b/client/src/app/pages/online/log-in/log-in.component.html @@ -4,7 +4,7 @@
-

Sign In

+

Acceder

@@ -38,12 +38,12 @@

Sign In

- +
- +
diff --git a/client/src/app/pages/online/log-in/log-in.component.ts b/client/src/app/pages/online/log-in/log-in.component.ts index 743fd24f..08e1e7e8 100755 --- a/client/src/app/pages/online/log-in/log-in.component.ts +++ b/client/src/app/pages/online/log-in/log-in.component.ts @@ -203,7 +203,7 @@ export class LogInComponent implements OnInit { position: this.position, preventDuplicates: this.preventDuplicates, }; - const titleContent = 'Warning'; + const titleContent = 'Peligro!'; this.toastrService.show( body, diff --git a/client/src/app/pages/online/set-up/set-up.component.html b/client/src/app/pages/online/set-up/set-up.component.html index 579278c4..9d096391 100755 --- a/client/src/app/pages/online/set-up/set-up.component.html +++ b/client/src/app/pages/online/set-up/set-up.component.html @@ -6,72 +6,69 @@
- - + +
-
Username is required
-
Username already in use
+
Usuario es requerido
+
Usuario ya esta registrado
-
Email is required
-
Email must be a valid email address
-
Email already in use
+
Email es requerido
+
Email debe ser en formato email correcto
+
Email ya esta registrado
-
+ -
+
-->
- + - Client + Cliente - Admin + Administrador - Client + Cliente - Admin + Administrador
- Unique Account - Unique Account + Cuenta unica + Cuenta unica
- +
- +
@@ -79,25 +76,25 @@
- Disable Account + Deshabilitar cuenta
- - + +
-
Password is required
-
Password must be at least 10 characters
-
Password must contain at least 1 uppercase, 1 lowercase, 1 number and a special character ( # ? ! @ $ % ^ & * - _ )
+
La clave es requerida
+
La clave debe contener al menos 10 caracteres
+
La clave debe contener al menos: 1 mayuscula, 1 minuscula, 1 numero y un caracter especial ( # ? ! @ $ % ^ & * - _ )
- - + +
-
Confirm Password is required
-
Passwords must match
+
La clave debe ser confirmada
+
La clave debe ser exacta
- View Password + Ver clave
@@ -105,19 +102,19 @@
- +
    -
  • Select All
  • +
  • Seleccionar todos
  • {{alg.name}}
- Choose at least one algorithm to proceed. + Se debe elegir al menos un algoritmo para continuar.
- +
  • {{alg.name}} @@ -128,13 +125,13 @@








    - +

- + diff --git a/client/src/app/pages/online/ticket/ticket.component.html b/client/src/app/pages/online/ticket/ticket.component.html index 68c18b3a..e025f068 100755 --- a/client/src/app/pages/online/ticket/ticket.component.html +++ b/client/src/app/pages/online/ticket/ticket.component.html @@ -1,13 +1,13 @@
- + - Choose where to filter: + Elija donde filtrar: {{obj.show}}
- Choose a field to search. + Elija un campo para buscar.
@@ -19,25 +19,25 @@
- Legend + Leyenda
- +
- +
- +
- +
- +
- +
- +
@@ -47,39 +47,39 @@
- Overview + Resumen
- + {{count.l2}}
- + {{count.l1}}
- + {{count.l0}}
- + {{count.l2r}}
- + {{count.l1r}}
- + {{count.l0r}}
- + {{count.st0}}
- + {{count.st1}}
diff --git a/client/src/app/pages/online/ticket/ticket.component.ts b/client/src/app/pages/online/ticket/ticket.component.ts index c579fec2..46fa33cf 100755 --- a/client/src/app/pages/online/ticket/ticket.component.ts +++ b/client/src/app/pages/online/ticket/ticket.component.ts @@ -96,11 +96,11 @@ export class TicketComponent implements OnInit, OnDestroy { searchFields = [ { value: 'type', - show: 'Type of alert', + show: 'Tipo de alerta', }, { value: 'assigned', - show: 'Assigned User', + show: 'Usuario asignado', }, ]; searchWr: string = ''; @@ -111,7 +111,7 @@ export class TicketComponent implements OnInit, OnDestroy { actions: { position: 'right', // custom: [{ name: 'routeToAPage', title: `` }] - columnTitle: 'Asign / Update', + columnTitle: 'Asignar / Actualizar', add: false, // edit: true, // delete: true, @@ -133,35 +133,35 @@ export class TicketComponent implements OnInit, OnDestroy { deleteButtonContent: '', confirmDelete: true, }, - noDataMessage: 'No tickets found', + noDataMessage: 'No se han encontrado tickets', columns: { createdAt: { - title: 'Occurance', + title: 'Ocurrencia', type: 'string', filter: false, }, updatedAt: { - title: 'Finished', + title: 'Finalizado', type: 'string', filter: false, }, type: { - title: 'Type of alert', + title: 'Tipo de alerta', type: 'string', filter: false, }, assigned: { - title: 'Assigned User', + title: 'Usuario asignado', type: 'string', filter: false, }, assignedBy: { - title: 'Assigned By', + title: 'Asignado por', type: 'string', filter: false, }, level: { - title: 'Severity', + title: 'Severidad', type: 'custom', filter: false, renderComponent: SeverityComponent, @@ -172,7 +172,7 @@ export class TicketComponent implements OnInit, OnDestroy { }, }, status: { - title: 'Reviewed', + title: 'Revisado', type: 'custom', filter: false, renderComponent: StatusComponent, @@ -297,7 +297,7 @@ export class TicketComponent implements OnInit, OnDestroy { hola1(event): void { if (event.data.assigned != null && this.now_user.role === 'user'){ - return this.showToast('User has been assigned previously.', 'warning'); + return this.showToast('Usuario a sido asignado anteriormente.', 'warning'); }else { this.windowService.open(ReviewComponent, { title: `Assign for ${event.data.type}`, context: { type: 'assign', id: event.data.id, assigned: event.data.assigned}}); } @@ -305,9 +305,9 @@ export class TicketComponent implements OnInit, OnDestroy { hola3(event): void { if (event.data.assigned != null && this.now_user.role === 'user'){ - return this.showToast(`This task has been finished by: ${event.data.reviewed}.`, 'danger'); + return this.showToast(`Esta tarea a sido finalizada por: ${event.data.reviewed}.`, 'danger'); }else { - this.windowService.open(ReviewComponent, { title: `Update for ${event.data.type}`, context: { type: 'update' , id: event.data.id, reviewed: event.data.reviewed, date: event.data.createdAt}}); + this.windowService.open(ReviewComponent, { title: `Actualizar ${event.data.type}`, context: { type: 'update' , id: event.data.id, reviewed: event.data.reviewed, date: event.data.createdAt}}); } } diff --git a/client/src/app/pages/pages-menu.ts b/client/src/app/pages/pages-menu.ts index 2e40431f..b480e85f 100755 --- a/client/src/app/pages/pages-menu.ts +++ b/client/src/app/pages/pages-menu.ts @@ -8,18 +8,18 @@ export const MENU_ITEMSBRANCH: NbMenuItem[] = [ // home: true, // }, { - title: "Start", + title: "Inicio", icon: "home-outline", link: "/dashboard", hidden: true, home: true, }, { - title: "Features for Branch", + title: "Atributos", group: true, }, { - title: "Accounts", + title: "Cuentas", icon: "people-outline", link: "accounts", }, @@ -34,15 +34,15 @@ export const MENU_ITEMSBRANCH: NbMenuItem[] = [ // link: 'analytics' // }, { - title: "Cameras", + title: "Camaras", icon: "video-outline", children: [ { - title: "Cameras List", + title: "Lista de Camaras", link: "camerasList", }, { - title: "Add Camera", + title: "Agregar Camara", link: "cameras/add_camera", }, ], @@ -58,15 +58,15 @@ export const MENU_ITEMSBRANCH: NbMenuItem[] = [ link: "tickets", }, { - title: "Stored Videos", + title: "Videos locales", icon: "film-outline", children: [ { - title: "Video List", + title: "Lista de videos", link: "search/list", }, { - title: "Add Video", + title: "Agregar Videos", link: "search/upload", }, { @@ -76,7 +76,7 @@ export const MENU_ITEMSBRANCH: NbMenuItem[] = [ ], }, { - title: "Help", + title: "Ayuda", icon: "paper-plane-outline", link: "helpdesk", }, @@ -94,18 +94,18 @@ export const MENU_ITEMSADMIN: NbMenuItem[] = [ // link: '/pages/iot-dashboard', // }, { - title: "Start", + title: "Inicio", icon: "home-outline", link: "/dashboard", hidden: true, home: true, }, { - title: "Features for Admin", + title: "Atributos de Administrador", group: true, }, { - title: "Accounts", + title: "Cuentas", icon: "people-outline", link: "accounts", }, @@ -113,23 +113,23 @@ export const MENU_ITEMSADMIN: NbMenuItem[] = [ export const MENU_ITEMSCLIENT: NbMenuItem[] = [ { - title: "Start", + title: "Inicio", icon: "home-outline", link: "/dashboard", hidden: true, home: true, }, { - title: "Features for Client", + title: "Atributos de Cliente", group: true, }, { - title: "Accounts", + title: "Cuentas", icon: "people-outline", link: "accounts", }, { - title: "Reports", + title: "Reportes", icon: "bar-chart-outline", link: "graphs", }, @@ -139,15 +139,15 @@ export const MENU_ITEMSCLIENT: NbMenuItem[] = [ link: "tickets", }, { - title: "Stored Videos", + title: "Videos locales", icon: "film-outline", children: [ { - title: "Video List", + title: "Lista de videos", link: "search/list", }, { - title: "Add Video", + title: "Agregar Videos", link: "search/upload", }, { @@ -162,7 +162,7 @@ export const MENU_ITEMSCLIENT: NbMenuItem[] = [ link: "helpdesk-listing", }, { - title: "Incident Logs", + title: "Incidentes Logs", icon: "star", link: "incident-logs", }, @@ -170,22 +170,22 @@ export const MENU_ITEMSCLIENT: NbMenuItem[] = [ export const MENU_ITEMSUSER: NbMenuItem[] = [ { - title: "Start", + title: "Inicio", icon: "home-outline", link: "/dashboard", hidden: true, home: true, }, { - title: "Features for User", + title: "Atributos de User", group: true, }, { - title: "Cameras", + title: "Camaras", icon: "video-outline", children: [ { - title: "Cameras List", + title: "Lista de camaras", link: "camerasList", home: true, }, @@ -207,7 +207,7 @@ export const MENU_ITEMSUSER: NbMenuItem[] = [ // link: 'settings' // } { - title: "Help", + title: "Ayuda", icon: "paper-plane-outline", link: "helpdesk", }, diff --git a/client/src/app/pages/search/list/list.component.html b/client/src/app/pages/search/list/list.component.html index 4d807acd..00ea82ba 100755 --- a/client/src/app/pages/search/list/list.component.html +++ b/client/src/app/pages/search/list/list.component.html @@ -6,11 +6,11 @@ - - - + + + - + @@ -19,7 +19,7 @@
Name
Play
 Algorithms
Nombre
Reproducir
 Algoritmos
 Heatmap
Delete
Eliminar

- - - -
-
-
- -
-
- -
-
-
- - -
-
-
- -
-
- -
- - {{ messageBar }} -
- -
-
- - -
diff --git a/client/src/app/pages/search/upload/upload.component.ts b/client/src/app/pages/search/upload/upload.component.ts index 3682940b..253beb35 100755 --- a/client/src/app/pages/search/upload/upload.component.ts +++ b/client/src/app/pages/search/upload/upload.component.ts @@ -33,7 +33,7 @@ export class UploadComponent implements OnInit { private facesService: FacesService, private SpinnerService: NgxSpinnerService ) {} - messageBar: string = "Processing"; + messageBar: string = "Procesando"; fileName: string; up: boolean = false; load: boolean = false; @@ -93,8 +93,6 @@ export class UploadComponent implements OnInit { if (progress["progress"] === 100) { //this.SpinnerService.hide(); this.finished = true; - - console.log("video uploaded"); } }; @@ -163,7 +161,7 @@ export class UploadComponent implements OnInit { } else { this.fileName = null; this.load = false; - alert("Please choose video file only"); + alert("Porfavor elegir formato de video"); } } diff --git a/server/app/controllers/auth.controller.js b/server/app/controllers/auth.controller.js index 8014a4d3..ae95930d 100755 --- a/server/app/controllers/auth.controller.js +++ b/server/app/controllers/auth.controller.js @@ -152,7 +152,7 @@ exports.signin = (req, res) => { if (!user) { return res .status(404) - .send({ success: false, message: 'User is not in the records', type: 'user' }) + .send({ success: false, message: 'Este usuario no esta registrado', type: 'user' }) } const passwordIsValid = bcrypt.compareSync(req.body.password, user.password) @@ -160,14 +160,14 @@ exports.signin = (req, res) => { if (!passwordIsValid) { return res.status(400).send({ success: false, - message: 'Invalid Password', + message: 'Clave invalida', type: 'password' }) } if (user.disabled === 1) { return res.status(401).send({ success: false, - message: 'This account has been disabled, please get in contact with the Administator.', + message: 'Esta cuenta se a deshabilitado, por favor contactar al Administrador.', type: 'disable' }) } diff --git a/server/app/controllers/relations.controller.js b/server/app/controllers/relations.controller.js index beb252e5..f75cf26f 100755 --- a/server/app/controllers/relations.controller.js +++ b/server/app/controllers/relations.controller.js @@ -507,7 +507,7 @@ exports.configs = (req, res) => { let token = req.headers['x-access-token'] let inf = req.body const id = req.params.id - var count = 0 + let count = 0 jwt.verify(token, process.env.secret, (err, decoded) => { User.findOne({ where: { @@ -550,6 +550,12 @@ exports.configs = (req, res) => { if (a.id == 12) { stuff.push(inf[7]) } + if (a.id == 22) { + stuff.push(inf[9]) + } + if (a.id == 68) { + stuff.push(inf[10]) + } for (var rela of rels) { if (rela.algo_id == a.id) { if (rela.atributes != JSON.stringify(stuff)) { @@ -604,15 +610,16 @@ exports.configsRoi = (req, res) => { let token = req.headers['x-access-token'] const relas = req.body const id = req.params.id + console.log(relas) jwt.verify(token, process.env.secret, (err, decoded) => { Relation.destroy({ where: {algo_id: relas.id, id_branch: decoded.id_branch, camera_id: id} }) .then(respo => { - for (var inside of relas.rois) { + for (let inside of relas.rois) { inside.pop() - var atr = [] + let atr = [] atr.push(relas.conf) if (inside[inside.length - 1]['x'] == undefined) { atr.push(inside[inside.length - 1]) @@ -686,6 +693,8 @@ exports.dashboards = (req, res) => { parseInt(d) == 14 || parseInt(d) == 35 || parseInt(d) == 51 + || + parseInt(d) == 68 ) { analyticsPrem.push({ algo_id: parseInt(d), diff --git a/server/app/initializator/updateFunc.js b/server/app/initializator/updateFunc.js new file mode 100644 index 00000000..7adce1a2 --- /dev/null +++ b/server/app/initializator/updateFunc.js @@ -0,0 +1,21 @@ +const db = require('../models') +const algo = db.algorithm + +exports.initial = async function () { + await algo.update({ + name: 'Fila tradicional' + }, + { + where: { id: 22 } + }) + await algo.update({ + name: 'Carnes / Jamon & Queso' + }, + { + where: { id: 68 } + }) + await algo.create({ + id: 69, + name: 'Temperatura y disponibilidad Pan' + }) +} diff --git a/server/app/middleware/authJwt.js b/server/app/middleware/authJwt.js index 6ee47f8a..807cffa2 100755 --- a/server/app/middleware/authJwt.js +++ b/server/app/middleware/authJwt.js @@ -15,7 +15,7 @@ const verifyToken = (req, res, next) => { jwt.verify(token, process.env.secret, (err, decoded) => { if (err) { return res.status(401).send({ - message: 'Unauthorized!' + message: 'No autorizado' }) } req.userId = decoded.id @@ -149,7 +149,7 @@ const isAvailable = (req, res, next) => { if (id === 'none') { res.status(202).send({ - message: 'Exists' + message: 'Existe' }) } next() diff --git a/server/server.js b/server/server.js index 011ef442..3418eefc 100755 --- a/server/server.js +++ b/server/server.js @@ -7,12 +7,14 @@ const morgan = require('morgan') const fs = require('fs') const path = require('path') const init = require('./app/initializator/initialFunct') +const updt = require('./app/initializator/updateFunc') const mysql = require('mysql2/promise') const compression = require('compression') const swaggerJsDoc = require('swagger-jsdoc') const swaggerUi = require('swagger-ui-express') const db = require('./app/models') const usr = db.user +const algo = db.algorithm // const resourcesFolderPath = // process.env.home + process.env.username + process.env.pathDocker + process.env.resources const resourcesFolderPath = path.resolve(process.env.resourcePath) @@ -110,6 +112,12 @@ if (process.env.INSTALL === 'true') { const find = await usr.findOne({ where: { id: '0000-11111-aaaaaa-bbbbbb' } }) + const span = await algo.findOne({ + where: { id: 69 } + }) + if (span === null) { + await updt.initial() + } if (find === null) { await init.initial() } From a9d6f521b8393ca01b4bc593781525d69e66557e Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 14 Sep 2022 18:14:27 +0200 Subject: [PATCH 02/38] console.log out --- server/app/controllers/relations.controller.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/app/controllers/relations.controller.js b/server/app/controllers/relations.controller.js index f75cf26f..c90ada17 100755 --- a/server/app/controllers/relations.controller.js +++ b/server/app/controllers/relations.controller.js @@ -610,8 +610,6 @@ exports.configsRoi = (req, res) => { let token = req.headers['x-access-token'] const relas = req.body const id = req.params.id - console.log(relas) - jwt.verify(token, process.env.secret, (err, decoded) => { Relation.destroy({ where: {algo_id: relas.id, id_branch: decoded.id_branch, camera_id: id} From 16942f42610d3a558c0be90e9be6e4b5348a4877 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 15 Sep 2022 12:04:38 +0200 Subject: [PATCH 03/38] added algo 70 --- .../pages/cameras_conf/algorithms/algorithms.component.ts | 2 +- server/app/initializator/updateFunc.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts index 7764260b..38e2f3b6 100755 --- a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts +++ b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts @@ -65,7 +65,7 @@ export class AlgorithmsComponent implements OnInit { this.Calgos.push(this.algos[i]); } else if (this.algos[i]['id'] > 3 && this.algos[i]['id'] <= 8 || this.algos[i]['id'] === 5 || this.algos[i]['id'] === 13 || this.algos[i]['id'] === 25 || this.algos[i]['id'] === 26 || this.algos[i]['id'] === 28 || this.algos[i]['id'] === 29 || this.algos[i]['id'] === 30 || this.algos[i]['id'] === 31 || this.algos[i]['id'] === 33 || this.algos[i]['id'] === 58 || this.algos[i]['id'] === 34 || this.algos[i]['id'] === 63 || this.algos[i]['id'] === 65) { this.Balgos.push(this.algos[i]); - } else if (this.algos[i]['id'] > 8 && this.algos[i]['id'] <= 11 || this.algos[i]['id'] === 27 || this.algos[i]['id'] === 39 || this.algos[i]['id'] === 53 || this.algos[i]['id'] === 54 || this.algos[i]['id'] === 55 || this.algos[i]['id'] === 56 || this.algos[i]['id'] === 66 || this.algos[i]['id'] === 64 || this.algos[i]['id'] === 69) { + } else if (this.algos[i]['id'] > 8 && this.algos[i]['id'] <= 11 || this.algos[i]['id'] === 27 || this.algos[i]['id'] === 39 || this.algos[i]['id'] === 53 || this.algos[i]['id'] === 54 || this.algos[i]['id'] === 55 || this.algos[i]['id'] === 56 || this.algos[i]['id'] === 66 || this.algos[i]['id'] === 64 || this.algos[i]['id'] === 69 || this.algos[i]['id'] === 70) { this.Aalgos.push(this.algos[i]); } } diff --git a/server/app/initializator/updateFunc.js b/server/app/initializator/updateFunc.js index 7adce1a2..3de84623 100644 --- a/server/app/initializator/updateFunc.js +++ b/server/app/initializator/updateFunc.js @@ -16,6 +16,10 @@ exports.initial = async function () { }) await algo.create({ id: 69, - name: 'Temperatura y disponibilidad Pan' + name: 'Disponibilidad Pan' + }) + await algo.create({ + id: 70, + name: 'Temperatura Pan' }) } From ccf8a21d7c7a92cba45a67d98b83faeacd7d6207 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 15 Sep 2022 12:04:46 +0200 Subject: [PATCH 04/38] docker compose update --- dockerDeployment/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 8951eb73..7fe23061 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,14 +11,14 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:1.2.37 + image: graymatics1/multi-tenant-server:2.1.1 restart: always volumes: - ./resources:/usr/src/app/resources - ../configDocker.env:/usr/src/config.env multi-tenant-ui: - image: graymatics1/multi-tenant-ui:1.2.51 + image: graymatics1/multi-tenant-ui:2.1.1 # networks: # - dev restart: always From 9b6bdcf6eedefb5698dc42f750150bacdacb5a57 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 15 Sep 2022 15:43:52 +0200 Subject: [PATCH 05/38] bread added --- .../availability/availability.component.html | 32 +++ .../availability/availability.component.scss | 0 .../availability.component.spec.ts | 25 +++ .../availability/availability.component.ts | 191 +++++++++++++++++ .../graphs/control/control.component.html | 4 +- .../temperature/temperature.component.html | 32 +++ .../temperature/temperature.component.scss | 0 .../temperature/temperature.component.spec.ts | 25 +++ .../temperature/temperature.component.ts | 192 ++++++++++++++++++ client/src/app/pages/pages.module.ts | 4 + client/src/app/services/analytics.service.ts | 6 + .../app/controllers/analytics.controller.js | 144 +++++++++++++ server/app/routes/analytics.routes.js | 4 + 13 files changed, 658 insertions(+), 1 deletion(-) create mode 100644 client/src/app/pages/online/graphs/availability/availability.component.html create mode 100644 client/src/app/pages/online/graphs/availability/availability.component.scss create mode 100644 client/src/app/pages/online/graphs/availability/availability.component.spec.ts create mode 100644 client/src/app/pages/online/graphs/availability/availability.component.ts create mode 100644 client/src/app/pages/online/graphs/temperature/temperature.component.html create mode 100644 client/src/app/pages/online/graphs/temperature/temperature.component.scss create mode 100644 client/src/app/pages/online/graphs/temperature/temperature.component.spec.ts create mode 100644 client/src/app/pages/online/graphs/temperature/temperature.component.ts diff --git a/client/src/app/pages/online/graphs/availability/availability.component.html b/client/src/app/pages/online/graphs/availability/availability.component.html new file mode 100644 index 00000000..fb09526a --- /dev/null +++ b/client/src/app/pages/online/graphs/availability/availability.component.html @@ -0,0 +1,32 @@ +
+
+
+
+ + +

En el periodo de tiempo

+ +
+
+
+
+
+
+
+ + +

Camara en tiempo real

+
+
+
+ +
+ +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/client/src/app/pages/online/graphs/availability/availability.component.scss b/client/src/app/pages/online/graphs/availability/availability.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/client/src/app/pages/online/graphs/availability/availability.component.spec.ts b/client/src/app/pages/online/graphs/availability/availability.component.spec.ts new file mode 100644 index 00000000..45704287 --- /dev/null +++ b/client/src/app/pages/online/graphs/availability/availability.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AvailabilityComponent } from './availability.component'; + +describe('AvailabilityComponent', () => { + let component: AvailabilityComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AvailabilityComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AvailabilityComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/client/src/app/pages/online/graphs/availability/availability.component.ts b/client/src/app/pages/online/graphs/availability/availability.component.ts new file mode 100644 index 00000000..20b1a507 --- /dev/null +++ b/client/src/app/pages/online/graphs/availability/availability.component.ts @@ -0,0 +1,191 @@ +import { DatePipe } from "@angular/common"; +import { + Component, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + Renderer2, + ViewChild, +} from "@angular/core"; +import { DomSanitizer } from "@angular/platform-browser"; +import { NbCalendarRange, NbColorHelper, NbThemeService } from "@nebular/theme"; +import { LocalDataSource, ViewCell } from "ng2-smart-table"; +import { api } from "../../../../models/API"; +import { AnalyticsService } from "../../../../services/analytics.service"; +import { FacesService } from "../../../../services/faces.service"; +import { Account } from "../../../../models/Account"; +import { NbDialogRef, NbDialogService } from "@nebular/theme"; +import { FormBuilder, FormGroup } from "@angular/forms"; + +@Component({ + selector: 'ngx-availability', + templateUrl: './availability.component.html', + styleUrls: ['./availability.component.scss'] +}) +export class AvailabilityComponent implements OnInit, OnDestroy { + @Input() range: NbCalendarRange; + @Input() camera; + availability: any = []; + player: any; + timezone: any; + now_user: Account; + themeSubscription: any; + options: any = {}; + imageUrl: any; + dialogRef: NbDialogRef; + @ViewChild("streaming", { static: false }) streamingcanvas: ElementRef; + canvas: any; + context: any; + data: any; + manualTriggerForm: FormGroup; + algorithms: any; + loading: boolean = false; + loadingTakeScreenShot: boolean = false; + algoId = 69; + + constructor( + private serv: AnalyticsService, + public sanitizer: DomSanitizer, + private face: FacesService, + public datepipe: DatePipe, + private theme: NbThemeService, + ) {} + single: any; + colorScheme: any; + source: any = new LocalDataSource(); + dataL: any; + optionsL: any; + count: number = 0; + coords = []; + + ngOnDestroy() { + } + + @ViewChild("videoPlayer", { static: false }) videoplayer: ElementRef; + isPlay: boolean = false; + videoFile: string = ""; + + video: boolean = false; + rtspIn: any; + + ngOnInit(): void { + this.now_user = JSON.parse(localStorage.getItem("now_user")); + var time = new Date(); + this.timezone = time + .toString() + .match(/[\+,\-](\d{4})\s/g)[0] + .split(" ")[0] + .slice(0, 3); + this.timezone = parseInt(this.timezone); + let p = ""; + if (this.timezone > 0) { + p = "+"; + } + this.timezone = p + JSON.stringify(this.timezone) + "00"; + let type; + if (this.now_user.id_branch != "0000") { + type = "cam_id"; + } else { + type = "id_account"; + } + let l = { + start: this.range.start, + end: this.range.end, + type: type, + }; + // this.algoId = 19; + this.face.checkVideo(this.algoId, this.camera).subscribe( + (res) => { + this.video = res["video"]; + this.link = res["http_out"]; + this.rtspIn = this.sanitizer.bypassSecurityTrustResourceUrl( + res["http_out"] + ); + }, + (err) => console.error(err) + ); + this.serv.availability(this.camera, l).subscribe( + (res) => { + this.availability = res["data"]; + const times = []; + for (const q of this.availability.labelsD){ + // times.push(new Date(q)) + times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '+0000')); + } + + this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { + const colors: any = config.variables; + const chartjs: any = config.variables.chartjs; + + this.dataL = { + labels: times, + datasets: [{ + label: 'Disponibilidad', + data: this.availability.dwell, + borderColor: colors.primary, + backgroundColor: colors.primary, + fill: false, + pointRadius: 2, + pointHoverRadius: 5, + }], + }; + + this.optionsL = { + responsive: true, + maintainAspectRatio: false, + legend: { + display: false, + position: "bottom", + labels: { + fontColor: chartjs.textColor, + }, + }, + hover: { + mode: "index", + }, + scales: { + xAxes: [ + { + display: false, + scaleLabel: { + display: false, + labelString: "Month", + }, + gridLines: { + display: true, + color: chartjs.axisLineColor, + }, + ticks: { + fontColor: chartjs.textColor, + }, + }, + ], + yAxes: [ + { + display: true, + scaleLabel: { + display: false, + labelString: "Value", + }, + gridLines: { + display: true, + color: chartjs.axisLineColor, + }, + ticks: { + fontColor: chartjs.textColor, + }, + }, + ], + }, + }; + }); + }, + (err) => console.error(err) + ); + } + + link: string; +} \ No newline at end of file diff --git a/client/src/app/pages/online/graphs/control/control.component.html b/client/src/app/pages/online/graphs/control/control.component.html index b1990af6..cd283110 100755 --- a/client/src/app/pages/online/graphs/control/control.component.html +++ b/client/src/app/pages/online/graphs/control/control.component.html @@ -31,7 +31,7 @@
- Apagado + No refrescar 5 s 30 s 1 m @@ -127,6 +127,8 @@ + +
diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.html b/client/src/app/pages/online/graphs/temperature/temperature.component.html new file mode 100644 index 00000000..6dd93ffc --- /dev/null +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.html @@ -0,0 +1,32 @@ +
+
+
+
+ + +

En el periodo de tiempo

+ +
+
+
+
+
+
+
+ + +

Camara en tiempo real

+
+
+
+ +
+ +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.scss b/client/src/app/pages/online/graphs/temperature/temperature.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.spec.ts b/client/src/app/pages/online/graphs/temperature/temperature.component.spec.ts new file mode 100644 index 00000000..e6f83ec7 --- /dev/null +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TemperatureComponent } from './temperature.component'; + +describe('TemperatureComponent', () => { + let component: TemperatureComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TemperatureComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TemperatureComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.ts b/client/src/app/pages/online/graphs/temperature/temperature.component.ts new file mode 100644 index 00000000..2fa7f448 --- /dev/null +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.ts @@ -0,0 +1,192 @@ +import { DatePipe } from "@angular/common"; +import { + Component, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + Renderer2, + ViewChild, +} from "@angular/core"; +import { DomSanitizer } from "@angular/platform-browser"; +import { NbCalendarRange, NbColorHelper, NbThemeService } from "@nebular/theme"; +import { LocalDataSource, ViewCell } from "ng2-smart-table"; +import { api } from "../../../../models/API"; +import { AnalyticsService } from "../../../../services/analytics.service"; +import { FacesService } from "../../../../services/faces.service"; +import { Account } from "../../../../models/Account"; +import { NbDialogRef, NbDialogService } from "@nebular/theme"; +import { FormBuilder, FormGroup } from "@angular/forms"; + + +@Component({ + selector: 'ngx-temperature', + templateUrl: './temperature.component.html', + styleUrls: ['./temperature.component.scss'] +}) +export class TemperatureComponent implements OnInit, OnDestroy { + @Input() range: NbCalendarRange; + @Input() camera; + temperature: any = []; + player: any; + timezone: any; + now_user: Account; + themeSubscription: any; + options: any = {}; + imageUrl: any; + dialogRef: NbDialogRef; + @ViewChild("streaming", { static: false }) streamingcanvas: ElementRef; + canvas: any; + context: any; + data: any; + manualTriggerForm: FormGroup; + algorithms: any; + loading: boolean = false; + loadingTakeScreenShot: boolean = false; + algoId = 69; + + constructor( + private serv: AnalyticsService, + public sanitizer: DomSanitizer, + private face: FacesService, + public datepipe: DatePipe, + private theme: NbThemeService, + ) {} + single: any; + colorScheme: any; + source: any = new LocalDataSource(); + dataL: any; + optionsL: any; + count: number = 0; + coords = []; + + ngOnDestroy() { + } + + @ViewChild("videoPlayer", { static: false }) videoplayer: ElementRef; + isPlay: boolean = false; + videoFile: string = ""; + + video: boolean = false; + rtspIn: any; + + ngOnInit(): void { + this.now_user = JSON.parse(localStorage.getItem("now_user")); + var time = new Date(); + this.timezone = time + .toString() + .match(/[\+,\-](\d{4})\s/g)[0] + .split(" ")[0] + .slice(0, 3); + this.timezone = parseInt(this.timezone); + let p = ""; + if (this.timezone > 0) { + p = "+"; + } + this.timezone = p + JSON.stringify(this.timezone) + "00"; + let type; + if (this.now_user.id_branch != "0000") { + type = "cam_id"; + } else { + type = "id_account"; + } + let l = { + start: this.range.start, + end: this.range.end, + type: type, + }; + // this.algoId = 19; + this.face.checkVideo(this.algoId, this.camera).subscribe( + (res) => { + this.video = res["video"]; + this.link = res["http_out"]; + this.rtspIn = this.sanitizer.bypassSecurityTrustResourceUrl( + res["http_out"] + ); + }, + (err) => console.error(err) + ); + this.serv.temperature(this.camera, l).subscribe( + (res) => { + this.temperature = res["data"]; + const times = []; + for (const q of this.temperature.labelsD){ + // times.push(new Date(q)) + times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '+0000')); + } + + this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { + const colors: any = config.variables; + const chartjs: any = config.variables.chartjs; + + this.dataL = { + labels: times, + datasets: [{ + label: 'Disponibilidad', + data: this.temperature.dwell, + borderColor: colors.primary, + backgroundColor: colors.primary, + fill: false, + pointRadius: 2, + pointHoverRadius: 5, + }], + }; + + this.optionsL = { + responsive: true, + maintainAspectRatio: false, + legend: { + display: false, + position: "bottom", + labels: { + fontColor: chartjs.textColor, + }, + }, + hover: { + mode: "index", + }, + scales: { + xAxes: [ + { + display: false, + scaleLabel: { + display: false, + labelString: "Month", + }, + gridLines: { + display: true, + color: chartjs.axisLineColor, + }, + ticks: { + fontColor: chartjs.textColor, + }, + }, + ], + yAxes: [ + { + display: true, + scaleLabel: { + display: false, + labelString: "Value", + }, + gridLines: { + display: true, + color: chartjs.axisLineColor, + }, + ticks: { + fontColor: chartjs.textColor, + }, + }, + ], + }, + }; + }); + }, + (err) => console.error(err) + ); + } + + link: string; +} \ No newline at end of file diff --git a/client/src/app/pages/pages.module.ts b/client/src/app/pages/pages.module.ts index 1917fc08..9b01d1fc 100755 --- a/client/src/app/pages/pages.module.ts +++ b/client/src/app/pages/pages.module.ts @@ -165,6 +165,8 @@ import { WindowOpenerComponent } from './online/graphs/window-opener/window-open import { SignalLostComponent } from './online/graphs/signal-lost/signal-lost.component'; import { EnterExitVComponent } from './online/graphs/enter-exit-v/enter-exit-v.component'; import { HamCheeseComponent } from './online/graphs/ham-cheese/ham-cheese.component'; +import { AvailabilityComponent } from './online/graphs/availability/availability.component'; +import { TemperatureComponent } from './online/graphs/temperature/temperature.component'; @NgModule({ imports: [ @@ -338,6 +340,8 @@ import { HamCheeseComponent } from './online/graphs/ham-cheese/ham-cheese.compon SignalLostComponent, EnterExitVComponent, HamCheeseComponent, + AvailabilityComponent, + TemperatureComponent, ], providers: [ FacesService, diff --git a/client/src/app/services/analytics.service.ts b/client/src/app/services/analytics.service.ts index 66ea23f5..65e519fc 100755 --- a/client/src/app/services/analytics.service.ts +++ b/client/src/app/services/analytics.service.ts @@ -201,6 +201,12 @@ export class AnalyticsService { enterExitV(id: string, dates){ return this.http.post(`${this.API_URL}65/${id}`, dates); } + availability(id: string, dates){ + return this.http.post(`${this.API_URL}69/${id}`, dates); + } + temperature(id: string, dates){ + return this.http.post(`${this.API_URL}70/${id}`, dates); + } report(algo_id:number, cam_id:string, dates){ return this.http.post(`${api}/report/${algo_id}/${cam_id}`, dates ,{ responseType: 'blob' diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index 3ee448e1..a8e8ce71 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -8745,4 +8745,148 @@ exports.enterExitV = async (req, res) => { ) }) }) +} + +exports.breadAvail = async (req, res) => { + let token = req.headers['x-access-token'] + const data = req.body + jwt.verify(token, process.env.secret, async (err, decoded) => { + let wh + if (decoded.id_branch != 0000) { + wh = { + id_branch: decoded.id_branch, + algo_id: 69 + } + } else { + wh = { + id_account: decoded.id_account, + algo_id: 69 + } + } + Relation.findOne({ + where: wh + }) + .then(async rel => { + await db + .con() + .query( + `SELECT * from availability WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); + let cache = '', range, cou = 0 + if(diff === 1){ + range = 30 * 60 * 1000 + }else if(diff >= 1 && diff <= 3){ + range = 2 * 60 * 60 * 1000 + }else if(diff >= 3 && diff <= 7){ + range = 4 * 60 * 60 * 1000 + }else if(diff >= 7 && diff <= 14){ + range = 8 * 60 * 60 * 1000 + }else if(diff >= 14 && diff <= 32){ + range = 24 * 60 * 60 * 1000 + } + cache = new Date(data.start).getTime() + var ress = {} + var dwell = [] + var labelsD = [] + result.forEach(function (v) { + ress[v.time.getHours()] = (ress[v.time.getHours()] || 0) + 1 + dwell.push(v.availability) + labelsD.push(v.time) + }) + let a = { + dwell: dwell, + labelsD: labelsD, + } + res.status(200).json({ + success: true, + data: a + }) + } + ) + }) + .catch(err => { + return res.status(500).send({ + success: false, + message: err + }) + }) + }) +} + +exports.breadTemp = async (req, res) => { + let token = req.headers['x-access-token'] + const data = req.body + jwt.verify(token, process.env.secret, async (err, decoded) => { + let wh + if (decoded.id_branch != 0000) { + wh = { + id_branch: decoded.id_branch, + algo_id: 70 + } + } else { + wh = { + id_account: decoded.id_account, + algo_id: 70 + } + } + Relation.findOne({ + where: wh + }) + .then(async rel => { + await db + .con() + .query( + `SELECT * from temperature WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); + let cache = '', range, cou = 0 + if(diff === 1){ + range = 30 * 60 * 1000 + }else if(diff >= 1 && diff <= 3){ + range = 2 * 60 * 60 * 1000 + }else if(diff >= 3 && diff <= 7){ + range = 4 * 60 * 60 * 1000 + }else if(diff >= 7 && diff <= 14){ + range = 8 * 60 * 60 * 1000 + }else if(diff >= 14 && diff <= 32){ + range = 24 * 60 * 60 * 1000 + } + cache = new Date(data.start).getTime() + var ress = {} + var dwell = [] + var labelsD = [] + result.forEach(function (v) { + ress[v.time.getHours()] = (ress[v.time.getHours()] || 0) + 1 + dwell.push(v.temperature) + labelsD.push(v.time) + }) + let a = { + dwell: dwell, + labelsD: labelsD, + } + res.status(200).json({ + success: true, + data: a + }) + } + ) + }) + .catch(err => { + return res.status(500).send({ + success: false, + message: err + }) + }) + }) } \ No newline at end of file diff --git a/server/app/routes/analytics.routes.js b/server/app/routes/analytics.routes.js index 7b604636..ed9d0569 100755 --- a/server/app/routes/analytics.routes.js +++ b/server/app/routes/analytics.routes.js @@ -2831,4 +2831,8 @@ module.exports = function (app) { app.post('/api/analytics/64/:id', [authJwt.isAvailable, authJwt.verifyToken], controller.signalLost) app.post('/api/analytics/65/:id', [authJwt.isAvailable, authJwt.verifyToken], controller.enterExitV) + + app.post('/api/analytics/69/:id', [authJwt.isAvailable, authJwt.verifyToken], controller.breadAvail) + + app.post('/api/analytics/70/:id', [authJwt.isAvailable, authJwt.verifyToken], controller.breadTemp) } From e5b018a038826585732f5ff8c60fc5f1c88a0915 Mon Sep 17 00:00:00 2001 From: ridweng Date: Fri, 16 Sep 2022 10:34:00 +0200 Subject: [PATCH 06/38] timezone adjustment --- .../availability/availability.component.ts | 2 +- .../online/graphs/dash/dash.component.ts | 6 +-- .../graphs/ham-cheese/ham-cheese.component.ts | 6 +-- .../online/graphs/queue/queue.component.ts | 6 +-- .../temperature/temperature.component.ts | 2 +- .../pages/online/ticket/ticket.component.ts | 6 +++ server/app/controllers/ticket.controller.js | 50 +++++++++++++++---- 7 files changed, 58 insertions(+), 20 deletions(-) diff --git a/client/src/app/pages/online/graphs/availability/availability.component.ts b/client/src/app/pages/online/graphs/availability/availability.component.ts index 20b1a507..4e265e27 100644 --- a/client/src/app/pages/online/graphs/availability/availability.component.ts +++ b/client/src/app/pages/online/graphs/availability/availability.component.ts @@ -113,7 +113,7 @@ export class AvailabilityComponent implements OnInit, OnDestroy { const times = []; for (const q of this.availability.labelsD){ // times.push(new Date(q)) - times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '+0000')); + times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '-0300')); } this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { diff --git a/client/src/app/pages/online/graphs/dash/dash.component.ts b/client/src/app/pages/online/graphs/dash/dash.component.ts index 1a4c4a25..8e4c35b9 100755 --- a/client/src/app/pages/online/graphs/dash/dash.component.ts +++ b/client/src/app/pages/online/graphs/dash/dash.component.ts @@ -402,9 +402,9 @@ export class DashComponent implements OnInit , OnDestroy { title: 'Hora', type: 'string', filter: false, - // valuePrepareFunction: (createdAt) => { - // return this.datepipe.transform(new Date(createdAt), 'yyyy-M-dd HH:mm'); - // } + valuePrepareFunction: (createdAt) => { + return this.datepipe.transform(new Date(createdAt), 'yyyy-M-dd HH:mm','-0300'); + } }, cam_name: { title: 'Camara', diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts index e3ef96d5..72559bd8 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts @@ -120,7 +120,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { for(let m of this.queue.rawAlerts){ m['picture'] = this.sanitizer.bypassSecurityTrustUrl(api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['picture']) m['clip_path'] = api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['clip_path'] - m['time'] = this.datepipe.transform(m['time'], 'yyyy-M-dd HH:mm:ss','-0400') + m['time'] = this.datepipe.transform(m['time'], 'yyyy-M-dd HH:mm:ss','-0300') m['videoClip'] = this.sanitizer.bypassSecurityTrustUrl(api + '/pictures/' + this.now_user['id_account'] + '/' + m['id_branch'] + '/queue/' + m['cam_id'] + '/' + m['movie']); if(m.queuing === 1){ m.inLine = 'Waiting' @@ -155,11 +155,11 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { const labels = []; for (let o of Object.keys(this.queue.dataAlertsLow[0])){ o = o + ':00'; - labels.push(this.datepipe.transform(o, 'yyyy-M-dd HH:mm','-0400')); + labels.push(this.datepipe.transform(o, 'yyyy-M-dd HH:mm','-0300')); } let times = []; for (var q of Object.keys(this.queue.dataPeople)) { - times.push(this.datepipe.transform(q, "yyyy-M-dd HH:mm", '-0400')); + times.push(this.datepipe.transform(q, "yyyy-M-dd HH:mm", '-0300')); } this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { const colors: any = config.variables; diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index a9826e42..440e38f8 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -118,7 +118,7 @@ export class QueueComponent implements OnInit, OnDestroy { for(let m of this.queue.rawAlerts){ m['picture'] = this.sanitizer.bypassSecurityTrustUrl(api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['picture']) m['clip_path'] = api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/queue/' + m['cam_id'] + '/' + m['clip_path'] - m['time'] = this.datepipe.transform(m['time'], 'yyyy-M-dd HH:mm:ss','-0400') + m['time'] = this.datepipe.transform(m['time'], 'yyyy-M-dd HH:mm:ss','-0300') m['videoClip'] = this.sanitizer.bypassSecurityTrustUrl(api + '/pictures/' + this.now_user['id_account'] + '/' + m['id_branch'] + '/queue/' + m['cam_id'] + '/' + m['movie']); if(m.queuing === 1){ m.inLine = 'Waiting' @@ -135,11 +135,11 @@ export class QueueComponent implements OnInit, OnDestroy { const labels = [] for (let o of Object.keys(this.queue.dataAlertsLow[0])){ o = o + ':00'; - labels.push(this.datepipe.transform(o, 'yyyy-M-dd HH:mm','-0400')); + labels.push(this.datepipe.transform(o, 'yyyy-M-dd HH:mm','-0300')); } let times = []; for (var q of Object.keys(this.queue.dataPeople)) { - times.push(this.datepipe.transform(q, "yyyy-M-dd HH:mm", '-0400')); + times.push(this.datepipe.transform(q, "yyyy-M-dd HH:mm", '-0300')); } this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.ts b/client/src/app/pages/online/graphs/temperature/temperature.component.ts index 2fa7f448..f0b6043b 100644 --- a/client/src/app/pages/online/graphs/temperature/temperature.component.ts +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.ts @@ -114,7 +114,7 @@ export class TemperatureComponent implements OnInit, OnDestroy { const times = []; for (const q of this.temperature.labelsD){ // times.push(new Date(q)) - times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '+0000')); + times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '-0300')); } this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { diff --git a/client/src/app/pages/online/ticket/ticket.component.ts b/client/src/app/pages/online/ticket/ticket.component.ts index 46fa33cf..3f43e37a 100755 --- a/client/src/app/pages/online/ticket/ticket.component.ts +++ b/client/src/app/pages/online/ticket/ticket.component.ts @@ -139,11 +139,17 @@ export class TicketComponent implements OnInit, OnDestroy { title: 'Ocurrencia', type: 'string', filter: false, + valuePrepareFunction: (createdAt) => { + return this.datepipe.transform(new Date(createdAt), 'yyyy-M-dd HH:mm','-0300'); + } }, updatedAt: { title: 'Finalizado', type: 'string', filter: false, + valuePrepareFunction: (updatedAt) => { + return this.datepipe.transform(new Date(updatedAt), 'yyyy-M-dd HH:mm','-0300'); + } }, type: { title: 'Tipo de alerta', diff --git a/server/app/controllers/ticket.controller.js b/server/app/controllers/ticket.controller.js index d6d9b159..7b0ee99d 100755 --- a/server/app/controllers/ticket.controller.js +++ b/server/app/controllers/ticket.controller.js @@ -114,7 +114,19 @@ exports.getAll = (req, res) => { break } case 'queue_mgt': { - element.type = 'Queue Management' + element.type = 'Fila tradicional' + break + } + case 'breadAvail': { + element.type = 'Disponibilidad Pan' + break + } + case 'breadTemp': { + element.type = 'Temperatura Pan' + break + } + case 'hamCheese': { + element.type = 'Carnes / Jamon & Queso' break } case 'faces': { @@ -146,6 +158,22 @@ const getAllTickets = async (row_count, type, id, data, res) => { element.updatedAt = '' } switch (element.type) { + case 'queue_mgt': { + element.type = 'Fila tradicional' + break + } + case 'breadAvail': { + element.type = 'Disponibilidad Pan' + break + } + case 'breadTemp': { + element.type = 'Temperatura Pan' + break + } + case 'hamCheese': { + element.type = 'Carnes / Jamon & Queso' + break + } case 'loitering': { element.type = 'Person Loitering in restricted area' break @@ -214,10 +242,6 @@ const getAllTickets = async (row_count, type, id, data, res) => { element.type = 'Vehicle parked in restricted area' break } - case 'queue_mgt': { - element.type = 'Queue Management' - break - } case 'faces': { element.type = 'Face detection' break @@ -261,7 +285,7 @@ exports.searchAllTickets = (req, res) => { searchStr = 'fr' break } - case 'face':{ + case 'face': { searchStr = 'fr' break } @@ -317,12 +341,20 @@ exports.searchAllTickets = (req, res) => { searchStr = 'parking' break } - case 'Queue Management': { + case 'Fila tradicional': { searchStr = 'queue_mgt' break } - case 'Face detection': { - searchStr = 'faces' + case 'Disponibilidad Pan': { + searchStr = 'breadAvail' + break + } + case 'Temperatura Pan': { + searchStr = 'breadTemp' + break + } + case 'Carnes / Jamon & Queso': { + searchStr = 'hamCheese' break } } From e38c12f762861a3bd2345c72cda0aa84c2750d87 Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 21 Sep 2022 11:37:34 -0300 Subject: [PATCH 07/38] Range of availability and temp --- .../availability/availability.component.ts | 38 ++-- .../temperature/temperature.component.ts | 36 ++-- client/src/index.html | 2 +- dockerDeployment/docker-compose.yml | 4 +- .../app/controllers/analytics.controller.js | 194 ++++++++++++++++-- .../app/controllers/relations.controller.js | 15 ++ 6 files changed, 248 insertions(+), 41 deletions(-) diff --git a/client/src/app/pages/online/graphs/availability/availability.component.ts b/client/src/app/pages/online/graphs/availability/availability.component.ts index 4e265e27..febd6956 100644 --- a/client/src/app/pages/online/graphs/availability/availability.component.ts +++ b/client/src/app/pages/online/graphs/availability/availability.component.ts @@ -95,6 +95,7 @@ export class AvailabilityComponent implements OnInit, OnDestroy { start: this.range.start, end: this.range.end, type: type, + timezone: '-0300' }; // this.algoId = 19; this.face.checkVideo(this.algoId, this.camera).subscribe( @@ -111,33 +112,44 @@ export class AvailabilityComponent implements OnInit, OnDestroy { (res) => { this.availability = res["data"]; const times = []; - for (const q of this.availability.labelsD){ + for (const q of this.availability.labelsDAll[0]){ // times.push(new Date(q)) - times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '-0300')); + times.push(this.datepipe.transform(q, 'HH:mm', '-0300')); } this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { const colors: any = config.variables; const chartjs: any = config.variables.chartjs; - - this.dataL = { - labels: times, - datasets: [{ - label: 'Disponibilidad', - data: this.availability.dwell, - borderColor: colors.primary, - backgroundColor: colors.primary, + const data = [] + const cols = { + 0: colors.primary, + 1: colors.warning, + 2: colors.success, + 3: colors.info, + 4: colors.danger + } + for(let i = 0; i < this.availability.dwellAll.length; i++){ + data.push({ + label: `Zone: ${i + 1}`, + data: Object.values(this.availability.dwellAll[i]), + borderColor: cols[i], + backgroundColor: cols[i], fill: false, pointRadius: 2, pointHoverRadius: 5, - }], + }) + } + + this.dataL = { + labels: times, + datasets: data, }; this.optionsL = { responsive: true, maintainAspectRatio: false, legend: { - display: false, + display: true, position: "bottom", labels: { fontColor: chartjs.textColor, @@ -149,7 +161,7 @@ export class AvailabilityComponent implements OnInit, OnDestroy { scales: { xAxes: [ { - display: false, + display: true, scaleLabel: { display: false, labelString: "Month", diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.ts b/client/src/app/pages/online/graphs/temperature/temperature.component.ts index f0b6043b..b1e9edf9 100644 --- a/client/src/app/pages/online/graphs/temperature/temperature.component.ts +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.ts @@ -45,7 +45,7 @@ export class TemperatureComponent implements OnInit, OnDestroy { algorithms: any; loading: boolean = false; loadingTakeScreenShot: boolean = false; - algoId = 69; + algoId = 70; constructor( private serv: AnalyticsService, @@ -96,6 +96,7 @@ export class TemperatureComponent implements OnInit, OnDestroy { start: this.range.start, end: this.range.end, type: type, + timezone: '-0300' }; // this.algoId = 19; this.face.checkVideo(this.algoId, this.camera).subscribe( @@ -112,26 +113,37 @@ export class TemperatureComponent implements OnInit, OnDestroy { (res) => { this.temperature = res["data"]; const times = []; - for (const q of this.temperature.labelsD){ + for (const q of this.temperature.labelsDAll[0]){ // times.push(new Date(q)) - times.push(this.datepipe.transform(q, 'yyyy-M-dd HH:mm', '-0300')); + times.push(this.datepipe.transform(q, 'HH:mm', '-0300')); } this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { const colors: any = config.variables; const chartjs: any = config.variables.chartjs; - - this.dataL = { - labels: times, - datasets: [{ - label: 'Disponibilidad', - data: this.temperature.dwell, - borderColor: colors.primary, - backgroundColor: colors.primary, + const data = [] + const cols = { + 0: colors.primary, + 1: colors.warning, + 2: colors.success, + 3: colors.info, + 4: colors.danger + } + for(let i = 0; i < this.temperature.dwellAll.length; i++){ + data.push({ + label: `Zone: ${i + 1}`, + data: Object.values(this.temperature.dwellAll[i]), + borderColor: cols[i], + backgroundColor: cols[i], fill: false, pointRadius: 2, pointHoverRadius: 5, - }], + }) + } + + this.dataL = { + labels: times, + datasets: data, }; this.optionsL = { diff --git a/client/src/index.html b/client/src/index.html index 7de7d113..8d4e0d2d 100755 --- a/client/src/index.html +++ b/client/src/index.html @@ -14,7 +14,7 @@ Loading... - +
diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 7fe23061..3d1abcea 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,14 +11,14 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.1.1 + image: graymatics1/multi-tenant-server:2.2.1 restart: always volumes: - ./resources:/usr/src/app/resources - ../configDocker.env:/usr/src/config.env multi-tenant-ui: - image: graymatics1/multi-tenant-ui:2.1.1 + image: graymatics1/multi-tenant-ui:2.2.1 # networks: # - dev restart: always diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index a8e8ce71..c8884cb8 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -8767,10 +8767,16 @@ exports.breadAvail = async (req, res) => { where: wh }) .then(async rel => { + const count = await Relation.count({ + where: { + algo_id: 69, + camera_id: req.params.id + } + }); await db .con() .query( - `SELECT * from availability WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, + `SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, function (err, result) { if (err) return res.status(500).json({ @@ -8778,7 +8784,7 @@ exports.breadAvail = async (req, res) => { message: err }) const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); - let cache = '', range, cou = 0 + let cache = [], range if(diff === 1){ range = 30 * 60 * 1000 }else if(diff >= 1 && diff <= 3){ @@ -8790,18 +8796,48 @@ exports.breadAvail = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - cache = new Date(data.start).getTime() - var ress = {} - var dwell = [] - var labelsD = [] + // cache = new Date(data.start).getTime() + let dwell = [], dwellAll = [] + let labelsD = [], labelsDAll =[] + let av = [], sum = [] + let cacheTime = 0 + const num = parseInt(data.timezone.slice(1,3)) * 3600 * 1000 + if(data.timezone.slice(0,1) == '-'){ + cacheTime = new Date(data.start).getTime() + range + num + }else{ + cacheTime = new Date(data.start).getTime() + range - num + } + for(let i = 1; i <= count; i++){ + cache.push(cacheTime) + dwellAll.push([]) + labelsDAll.push([new Date(data.start).getTime()]) + av.push([]) + sum.push(0) + } result.forEach(function (v) { - ress[v.time.getHours()] = (ress[v.time.getHours()] || 0) + 1 - dwell.push(v.availability) - labelsD.push(v.time) + if(v.zone == 'right'){ + v.zone = 1 + }else if(v.zone == 'left'){ + v.zone = 0 + } + if(v.time.getTime() < cache[v.zone]){ + av[v.zone].push(v.availability) + sum[v.zone] = sum[v.zone] + parseInt(v.availability) + }else{ + cache[v.zone] += range + let availability = sum[v.zone]/av[v.zone].length + availability = Math.round(availability * 100) / 100 + dwellAll[v.zone].push(availability) + sum[v.zone] = 0 + av[v.zone] = [] + labelsDAll[v.zone].push(cache[v.zone]) + } }) let a = { dwell: dwell, labelsD: labelsD, + dwellAll: dwellAll, + labelsDAll: labelsDAll } res.status(200).json({ success: true, @@ -8811,6 +8847,7 @@ exports.breadAvail = async (req, res) => { ) }) .catch(err => { + console.error(err) return res.status(500).send({ success: false, message: err @@ -8839,10 +8876,16 @@ exports.breadTemp = async (req, res) => { where: wh }) .then(async rel => { + const count = await Relation.count({ + where: { + algo_id: 70, + camera_id: req.params.id + } + }); await db .con() .query( - `SELECT * from temperature WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, + `SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, function (err, result) { if (err) return res.status(500).json({ @@ -8863,17 +8906,141 @@ exports.breadTemp = async (req, res) => { range = 24 * 60 * 60 * 1000 } cache = new Date(data.start).getTime() - var ress = {} - var dwell = [] - var labelsD = [] + let ress = {}, ressAll = [] + let dwell = [], dwellAll = [] + let labelsD = [], labelsDAll =[] + for(let i = 1; i <= count; i++){ + ressAll.push({}) + dwellAll.push([]) + labelsDAll.push([]) + } + result.forEach(function (v) { + if(v.zone == 'right'){ + v.zone = 1 + }else if(v.zone == 'left'){ + v.zone = 0 + } ress[v.time.getHours()] = (ress[v.time.getHours()] || 0) + 1 dwell.push(v.temperature) labelsD.push(v.time) + ressAll[v.zone][v.time.getHours()] = (ressAll[v.zone][v.time.getHours()] || 0) + 1 + dwellAll[v.zone].push(v.temperature) + labelsDAll[v.zone].push(v.time) + }) + let a = { + dwell: dwell, + labelsD: labelsD, + dwellAll: dwellAll, + labelsDAll: labelsDAll + } + res.status(200).json({ + success: true, + data: a + }) + } + ) + }) + .catch(err => { + return res.status(500).send({ + success: false, + message: err + }) + }) + }) +} + +exports.breadTemp = async (req, res) => { + let token = req.headers['x-access-token'] + const data = req.body + jwt.verify(token, process.env.secret, async (err, decoded) => { + let wh + if (decoded.id_branch != 0000) { + wh = { + id_branch: decoded.id_branch, + algo_id: 70 + } + } else { + wh = { + id_account: decoded.id_account, + algo_id: 70 + } + } + Relation.findOne({ + where: wh + }) + .then(async rel => { + const count = await Relation.count({ + where: { + algo_id: 70, + camera_id: req.params.id + } + }); + await db + .con() + .query( + `SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); + let cache = [], range + if(diff === 1){ + range = 30 * 60 * 1000 + }else if(diff >= 1 && diff <= 3){ + range = 2 * 60 * 60 * 1000 + }else if(diff >= 3 && diff <= 7){ + range = 4 * 60 * 60 * 1000 + }else if(diff >= 7 && diff <= 14){ + range = 8 * 60 * 60 * 1000 + }else if(diff >= 14 && diff <= 32){ + range = 24 * 60 * 60 * 1000 + } + // cache = new Date(data.start).getTime() + let dwell = [], dwellAll = [] + let labelsD = [], labelsDAll =[] + let av = [], sum = [] + let cacheTime = 0 + const num = parseInt(data.timezone.slice(1,3)) * 3600 * 1000 + if(data.timezone.slice(0,1) == '-'){ + cacheTime = new Date(data.start).getTime() + range + num + }else{ + cacheTime = new Date(data.start).getTime() + range - num + } + for(let i = 1; i <= count; i++){ + cache.push(cacheTime) + dwellAll.push([]) + labelsDAll.push([new Date(data.start).getTime()]) + av.push([]) + sum.push(0) + } + result.forEach(function (v) { + if(v.zone == 'right'){ + v.zone = 1 + }else if(v.zone == 'left'){ + v.zone = 0 + } + if(v.time.getTime() < cache[v.zone]){ + av[v.zone].push(v.temperature) + sum[v.zone] = sum[v.zone] + parseInt(v.temperature) + }else{ + cache[v.zone] += range + let temperature = sum[v.zone]/av[v.zone].length + temperature = Math.round(temperature * 100) / 100 + dwellAll[v.zone].push(temperature) + sum[v.zone] = 0 + av[v.zone] = [] + labelsDAll[v.zone].push(cache[v.zone]) + } }) let a = { dwell: dwell, labelsD: labelsD, + dwellAll: dwellAll, + labelsDAll: labelsDAll } res.status(200).json({ success: true, @@ -8883,6 +9050,7 @@ exports.breadTemp = async (req, res) => { ) }) .catch(err => { + console.error(err) return res.status(500).send({ success: false, message: err diff --git a/server/app/controllers/relations.controller.js b/server/app/controllers/relations.controller.js index c90ada17..c1f88550 100755 --- a/server/app/controllers/relations.controller.js +++ b/server/app/controllers/relations.controller.js @@ -411,6 +411,21 @@ const tables = { alert: true, table: 'queue_mgt' }, + 'Carnes / Jamon & Queso': { + id: 68, + alert: true, + table: 'queue_mgt' + }, + 'Disponibilidad Pan': { + id: 69, + alert: true, + table: 'bread_availability' + }, + 'Temperatura Pan': { + id: 70, + alert: true, + table: 'bread_temperature' + }, } From 3fd1b5a80781aefd886032052a80a2ab0f4b4c57 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 1 Dec 2022 07:11:24 -0300 Subject: [PATCH 08/38] LAtest commit --- client/package-lock.json | 11 + client/package.json | 3 +- .../algorithms/algorithms.component.html | 7 +- .../algorithms/algorithms.component.ts | 2 +- .../availability/availability.component.html | 22 +- .../availability/availability.component.ts | 175 ++++- .../graphs/control/control.component.html | 1 + .../graphs/control/control.component.ts | 118 ++-- .../ham-cheese/ham-cheese.component.html | 12 +- .../graphs/ham-cheese/ham-cheese.component.ts | 108 +++- .../online/graphs/queue/queue.component.html | 8 +- .../online/graphs/queue/queue.component.ts | 99 ++- .../online/graphs/scc/scc.component.html | 68 ++ .../online/graphs/scc/scc.component.scss | 0 .../online/graphs/scc/scc.component.spec.ts | 25 + .../pages/online/graphs/scc/scc.component.ts | 377 +++++++++++ .../temperature/temperature.component.html | 22 +- .../temperature/temperature.component.ts | 153 ++++- client/src/app/pages/pages.module.ts | 2 + client/src/app/services/analytics.service.ts | 15 +- client/src/index.html | 2 +- dockerDeployment/docker-compose.yml | 4 +- .../app/controllers/analytics.controller.js | 607 +++++++++++++----- server/app/controllers/report.controller.js | 34 +- server/app/initializator/updateFunc.js | 4 + server/app/routes/analytics.routes.js | 2 + 26 files changed, 1572 insertions(+), 309 deletions(-) create mode 100644 client/src/app/pages/online/graphs/scc/scc.component.html create mode 100644 client/src/app/pages/online/graphs/scc/scc.component.scss create mode 100644 client/src/app/pages/online/graphs/scc/scc.component.spec.ts create mode 100644 client/src/app/pages/online/graphs/scc/scc.component.ts diff --git a/client/package-lock.json b/client/package-lock.json index 107bee0b..34571fdf 100755 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -46,6 +46,7 @@ "core-js": "^2.6.12", "echarts": "^5.2.1", "eva-icons": "^1.1.3", + "file-saver": "^2.0.5", "glob-parent": "^5.1.2", "intl": "1.2.5", "ionicons": "2.0.1", @@ -8876,6 +8877,11 @@ "node": ">=4" } }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -25738,6 +25744,11 @@ "flat-cache": "^2.0.1" } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", diff --git a/client/package.json b/client/package.json index 283b0e1d..56d33b21 100755 --- a/client/package.json +++ b/client/package.json @@ -60,6 +60,7 @@ "core-js": "^2.6.12", "echarts": "^5.2.1", "eva-icons": "^1.1.3", + "file-saver": "^2.0.5", "glob-parent": "^5.1.2", "intl": "1.2.5", "ionicons": "2.0.1", @@ -118,4 +119,4 @@ "tslint": "~6.1.0", "tslint-language-service": "^0.9.9" } -} \ No newline at end of file +} diff --git a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html index 330de2e5..2841828f 100755 --- a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html +++ b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html @@ -54,7 +54,12 @@

Configuracion de {{camera.name}}

+ [disabled]='algorithm.activated==false || algorithm.activated == undefined'>{{i == 8 || i == 4 || algorithm.id == 59 || algorithm.id == 22 || algorithm.id == 68 ? 'Hacer click para definir area necesaria' : 'Agregar area de foco'}} + + + + + + + + +
+
+ + + + + +
+ + + +
+
+
+ + +

Camara en tiempo real

+
+ +
+ + +
+
+
+
+
+
+ diff --git a/client/src/app/pages/online/graphs/scc/scc.component.scss b/client/src/app/pages/online/graphs/scc/scc.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/client/src/app/pages/online/graphs/scc/scc.component.spec.ts b/client/src/app/pages/online/graphs/scc/scc.component.spec.ts new file mode 100644 index 00000000..454a137f --- /dev/null +++ b/client/src/app/pages/online/graphs/scc/scc.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SccComponent } from './scc.component'; + +describe('SccComponent', () => { + let component: SccComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SccComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SccComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/client/src/app/pages/online/graphs/scc/scc.component.ts b/client/src/app/pages/online/graphs/scc/scc.component.ts new file mode 100644 index 00000000..ac35b6f6 --- /dev/null +++ b/client/src/app/pages/online/graphs/scc/scc.component.ts @@ -0,0 +1,377 @@ +import { DatePipe } from '@angular/common'; +import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; +import { NbCalendarRange, NbThemeService } from '@nebular/theme'; +import { LocalDataSource, ViewCell } from 'ng2-smart-table'; +import { api } from '../../../../models/API'; +import { AnalyticsService } from '../../../../services/analytics.service'; +import { FacesService } from '../../../../services/faces.service'; +import { Router } from '@angular/router'; +import { Account } from '../../../../models/Account'; + +@Component({ + selector: 'ngx-scc', + templateUrl: './scc.component.html', + styleUrls: ['./scc.component.scss'] +}) +export class SccComponent implements OnInit, OnDestroy { + + @Input() range: NbCalendarRange; + @Input() camera; + scc: any = []; + player: any; + now_user: Account; + rtspIn: any; + sccs: Array = []; + avgss: Array = []; + themeSubscription: any; + dataR: any; + dataT: any; + dataH: any; + dataP: any; + options: any; + + @ViewChild('streaming', {static: false}) streamingcanvas: ElementRef; + + constructor( + private theme: NbThemeService, + private serv: AnalyticsService, + public sanitizer: DomSanitizer, + private face: FacesService, + public datepipe: DatePipe, + private route: Router + ) { } + source:any = new LocalDataSource(); + + ngOnDestroy(){ + if(this.player != undefined){ + this.player.destroy() + this.face.cameraStop({id: this.camera}).subscribe( + res =>{ + }, + err=> console.error(err) + ) + } + } + + @ViewChild("videoPlayer", { static: false }) videoplayer: ElementRef; + isPlay: boolean = false; + toggleVideo(event: any) { + this.videoplayer.nativeElement.play(); + } + videoFile:string = ""; + pass(vid:string){ + this.videoplayer.nativeElement.src = vid + this.videoplayer.nativeElement.load(); + this.videoplayer.nativeElement.play(); + + } + timezone: any; + video:boolean = false; + algo_id: number = 71; + + ngOnInit(): void { + this.now_user = JSON.parse(localStorage.getItem('now_user')) + var time = new Date(); + this.timezone = time.toString().match(/[\+,\-](\d{4})\s/g)[0].split(' ')[0].slice(0,3); + this.timezone = parseInt(this.timezone); + let p = '' + if(this.timezone > 0){ + p = '+' + } + this.timezone = p + JSON.stringify(this.timezone) + '00'; + let type; + if(this.now_user.id_branch != '0000'){ + type = 'cam_id'; + }else{ + type = 'id_account' + } + let l = { + start: this.range.start, + end: this.range.end, + type: type, + timezone: '-0300' + } + this.face.checkVideo(this.algo_id,this.camera).subscribe( + res=>{ + this.video = res['video']; + this.rtspIn = this.sanitizer.bypassSecurityTrustResourceUrl(res['http_out']); + if(this.video === true){ + this.settings['columns']['picture'] = { + title: 'VIDEO', + type: 'custom', + filter: false, + renderComponent: ButtonViewComponent, + onComponentInitFunction:(instance) => { + instance.save.subscribe((row: string) => { + this.pass(row) + }); + } + } + this.settings = Object.assign({},this.settings) + } + }, err => console.error(err) + ) + this.serv.scc(this.camera,l).subscribe( + res=>{ + this.scc = res['data'] + for(let m of this.scc.raw){ + m['picture'] = this.sanitizer.bypassSecurityTrustUrl(api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/scc/' + m['cam_id'] + '/' + m['picture']) + m['clip_path'] = api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/scc/' + m['cam_id'] + '/' + m['clip_path'] + m['time'] = this.datepipe.transform(m['time'], 'yyyy-M-dd HH:mm:ss','-0300') + m['videoClip'] = this.sanitizer.bypassSecurityTrustUrl(api + '/pictures/' + this.now_user['id_account'] + '/' + m['id_branch'] + '/scc/' + m['cam_id'] + '/' + m['movie']); + } + const source = this.scc.raw + this.source = source.slice().sort((a, b) => +new Date(b.time) - +new Date(a.time)) + const labelstr = [], lab = {}, labelsr = [] + for (let o of Object.keys(this.scc.dataAlertsTrolley)){ + lab[this.datepipe.transform(o, 'yyyy-M-dd HH:mm','-0300')] = this.scc.dataAlertsTrolley[o] + o = o + ':00'; + const date = new Date(o) + labelstr.push(this.datepipe.transform(date, 'HH:mm','-0600')); + } + for (let o of Object.keys(this.scc.dataPeopleReceipt)){ + lab[this.datepipe.transform(o, 'yyyy-M-dd HH:mm','-0300')] = this.scc.dataPeopleReceipt[o] + o = o + ':00'; + const date = new Date(o) + labelsr.push(this.datepipe.transform(date, 'HH:mm','-0600')); + } + // let times = []; + // for (var q of Object.keys(this.scc.dataPeople)) { + // const date = new Date(q) + // times.push(this.datepipe.transform(date, "HH:mm", '-0600')); + // } + + this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { + const colors: any = config.variables; + const cols = { + 0: colors.primary, + 1: colors.warning, + 2: colors.success, + 3: colors.info, + 4: colors.danger + } + const chartjs: any = config.variables.chartjs; + + this.dataR = { + labels: labelsr, + datasets: [ + { + label: `Recibo`, + data: Object.values(this.scc.dataPeopleReceipt), + borderColor: cols[0], + backgroundColor: cols[0], + fill: false, + pointRadius: 2, + pointHoverRadius: 5, + } + ], + }; + this.dataT = { + labels: labelstr, + datasets: [ + { + label: `Carro`, + data: Object.values(this.scc.dataAlertsTrolley), + borderColor: cols[1], + backgroundColor: cols[1], + fill: false, + pointRadius: 2, + pointHoverRadius: 5, + } + ], + }; + // this.dataM = { + // labels: labels, + // datasets: datasetsMed, + // }; + + // this.dataP = { + // labels: times, + // datasets: datasetsPall + // }; + this.options = { + responsive: true, + maintainAspectRatio: false, + legend: { + display: true, + position: "bottom", + labels: { + fontColor: chartjs.textColor, + }, + }, + hover: { + mode: "index", + }, + scales: { + xAxes: [ + { + display: true, + scaleLabel: { + display: false, + labelString: "Month", + }, + gridLines: { + display: true, + color: chartjs.axisLineColor, + }, + ticks: { + fontColor: chartjs.textColor, + }, + }, + ], + yAxes: [ + { + display: true, + scaleLabel: { + display: false, + labelString: "Value", + }, + gridLines: { + display: true, + color: chartjs.axisLineColor, + }, + ticks: { + fontColor: chartjs.textColor, + }, + }, + ], + }, + }; + } + ) + }, + err => { + console.error(err) + this.scc = undefined; + this.avgss = [] + } + ) + } + got(id){ + this.route.navigate([`/pages/tickets`]) + } + goToLink(url: string){ + window.open(url, "_blank"); + } + + async csv(algo){ + let type; + if(this.now_user.id_branch != '0000'){ + type = 'cam_id'; + }else{ + type = 'id_account' + } + let l = { + start: this.range.start, + end: this.range.end, + type: type, + ham: true, + algo: algo + } + ;(await this.serv.report(this.algo_id, this.camera, l)).subscribe( + res => { + var blob = new Blob([res], { type: res.type.toString() }); + var url = window.URL.createObjectURL(blob); + this.goToLink(url) + }, + err => console.error(err) + ) + } + + settings = { + mode: 'external', + actions: false, + edit: { + editButtonContent: '', + saveButtonContent: '', + cancelButtonContent: '', + confirmSave: true, + }, + pager : { + display : true, + perPage:5 + }, + noDataMessage: "No data found", + columns: { + picture: { + title: 'PICTURE', + type: 'custom', + filter: false, + renderComponent: ButtonViewComponentPic, + onComponentInitFunction:(instance) => { + instance.save.subscribe((row: string) => { + this.pass(row) + }); + } + }, + time: { + title: 'TIME', + type: 'string', + filter: false + }, + camera_name: { + title: 'CAM', + type: 'string', + filter: false + }, + zone: { + title: 'scc', + type: 'string', + filter: false + } + }, + }; + +} + +@Component({ + selector: 'button-view', + styles: ['.play-btn { position: absolute; left: 50%; top: 50%; margin-top: -17px; margin-left: -20px; color: #f7f9fc47}'], + template: ` +
+
+ + +
+
+ `, +}) +export class ButtonViewComponent implements ViewCell, OnInit { + renderValue: string; + + constructor(){ + } + + @Input() value: string | number; + @Input() rowData: any; + + @Output() save: EventEmitter = new EventEmitter(); + + openVideo(){ + this.save.emit(this.rowData.clip_path) + } + + ngOnInit() { + this.renderValue = this.value.toString().toUpperCase(); + } +} + +@Component({ + selector: 'button-view', + template: ` + + `, +}) +export class ButtonViewComponentPic implements ViewCell, OnInit { + + constructor(){ + } + + @Input() value: string | number; + @Input() rowData: any; + @Output() save: EventEmitter = new EventEmitter(); + + ngOnInit() { + } +} diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.html b/client/src/app/pages/online/graphs/temperature/temperature.component.html index 6dd93ffc..bab290b0 100644 --- a/client/src/app/pages/online/graphs/temperature/temperature.component.html +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.html @@ -5,13 +5,33 @@

En el periodo de tiempo

- +
+
+ + + + +
+ No hay data de alertas. +
+ + +
+ No hay data. +
+
+ + + + +
+
diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.ts b/client/src/app/pages/online/graphs/temperature/temperature.component.ts index b1e9edf9..1f985644 100644 --- a/client/src/app/pages/online/graphs/temperature/temperature.component.ts +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.ts @@ -117,6 +117,15 @@ export class TemperatureComponent implements OnInit, OnDestroy { // times.push(new Date(q)) times.push(this.datepipe.transform(q, 'HH:mm', '-0300')); } + for(let m of this.temperature.rawAlerts){ + m['picture'] = this.sanitizer.bypassSecurityTrustUrl(api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/temp_alerts/' + m['cam_id'] + '/' + m['picture']) + m['clip_path'] = api + "/pictures/" + this.now_user['id_account']+'/' + m['id_branch']+'/temp_alerts/' + m['cam_id'] + '/' + m['clip_path'] + m['time'] = this.datepipe.transform(m['time'], 'yyyy-M-dd HH:mm:ss','-0300') + m['videoClip'] = this.sanitizer.bypassSecurityTrustUrl(api + '/pictures/' + this.now_user['id_account'] + '/' + m['id_branch'] + '/temp_alerts/' + m['cam_id'] + '/' + m['movie']); + m['alert'] = '' + } + const source = this.temperature.rawAlerts + this.source = source.slice().sort((a, b) => +new Date(b.time) - +new Date(a.time)) this.themeSubscription = this.theme.getJsTheme().subscribe((config) => { const colors: any = config.variables; @@ -130,8 +139,14 @@ export class TemperatureComponent implements OnInit, OnDestroy { 4: colors.danger } for(let i = 0; i < this.temperature.dwellAll.length; i++){ + let label = 'None' + if(i + 1 === 1){ + label = 'Marraqueta: ' + }else if (i + 1 === 2){ + label = 'Hallulla: ' + } data.push({ - label: `Zone: ${i + 1}`, + label: `${label}`, data: Object.values(this.temperature.dwellAll[i]), borderColor: cols[i], backgroundColor: cols[i], @@ -150,7 +165,7 @@ export class TemperatureComponent implements OnInit, OnDestroy { responsive: true, maintainAspectRatio: false, legend: { - display: false, + display: true, position: "bottom", labels: { fontColor: chartjs.textColor, @@ -162,7 +177,7 @@ export class TemperatureComponent implements OnInit, OnDestroy { scales: { xAxes: [ { - display: false, + display: true, scaleLabel: { display: false, labelString: "Month", @@ -200,5 +215,137 @@ export class TemperatureComponent implements OnInit, OnDestroy { ); } + pass(vid:string){ + this.videoplayer.nativeElement.src = vid + this.videoplayer.nativeElement.load(); + this.videoplayer.nativeElement.play(); + } + + settings = { + mode: 'external', + actions: false, + edit: { + editButtonContent: '', + saveButtonContent: '', + cancelButtonContent: '', + confirmSave: true, + }, + pager : { + display : true, + perPage:5 + }, + noDataMessage: "No se a encontrado data", + columns: { + picture: { + title: 'Imagen', + type: 'custom', + filter: false, + renderComponent: ButtonViewComponentPic, + onComponentInitFunction:(instance) => { + instance.save.subscribe((row: string) => { + this.pass(row) + }); + } + }, + time: { + title: 'Hora', + type: 'string', + filter: false + }, + camera_name: { + title: 'Camara', + type: 'string', + filter: false + }, + zone: { + title: 'Zona', + type: 'string', + filter: false, + valuePrepareFunction: (zone) => { + if(zone == 0){ + return 'Marraqueta' + }else if(zone == 1){ + return 'Hallulla' + } + } + }, + alert: { + title: 'Alerta', + type: 'string', + filter: false, + valuePrepareFunction: (alert) => { + return 'Menos de 20 C' + } + } + }, + }; + + goToLink(url: string){ + window.open(url, "_blank"); + } + + showAlert: boolean = false; + showData: boolean = false; + csvAlerts: Object = { + alerts: false, + data: false + } + + async csv(typ){ + this.csvAlerts[typ] = true + this.showData = false; + this.showAlert = false; + let type; + if(this.now_user.id_branch != '0000'){ + type = 'cam_id'; + }else{ + type = 'id_account' + } + let l = { + start: this.range.start, + end: this.range.end, + type: type, + typ: typ, + algo: this.algoId + } + ;(await this.serv.report(this.algoId, this.camera, l)).subscribe( + async (res) => { + const blob = new Blob([res], { type: res.type.toString() }); + const url = await window.URL.createObjectURL(blob); + await window.open(url, "_blank"); + this.csvAlerts[typ] = false + }, + err => { + console.error(err) + this.csvAlerts[typ] = false + if(typ === 'data'){ + this.showData = true; + } + if(typ === 'alerts'){ + this.showAlert = true; + } + } + ) + } + link: string; +} + +@Component({ + selector: 'button-view', + template: ` + + `, +}) +export class ButtonViewComponentPic implements ViewCell, OnInit { + + constructor(){ + } + + @Input() value: string | number; + @Input() rowData: any; + @Output() save: EventEmitter = new EventEmitter(); + + ngOnInit() { + } } \ No newline at end of file diff --git a/client/src/app/pages/pages.module.ts b/client/src/app/pages/pages.module.ts index 9b01d1fc..7f9a10c4 100755 --- a/client/src/app/pages/pages.module.ts +++ b/client/src/app/pages/pages.module.ts @@ -167,6 +167,7 @@ import { EnterExitVComponent } from './online/graphs/enter-exit-v/enter-exit-v.c import { HamCheeseComponent } from './online/graphs/ham-cheese/ham-cheese.component'; import { AvailabilityComponent } from './online/graphs/availability/availability.component'; import { TemperatureComponent } from './online/graphs/temperature/temperature.component'; +import { SccComponent } from './online/graphs/scc/scc.component'; @NgModule({ imports: [ @@ -342,6 +343,7 @@ import { TemperatureComponent } from './online/graphs/temperature/temperature.co HamCheeseComponent, AvailabilityComponent, TemperatureComponent, + SccComponent, ], providers: [ FacesService, diff --git a/client/src/app/services/analytics.service.ts b/client/src/app/services/analytics.service.ts index 65e519fc..1148a35e 100755 --- a/client/src/app/services/analytics.service.ts +++ b/client/src/app/services/analytics.service.ts @@ -207,10 +207,21 @@ export class AnalyticsService { temperature(id: string, dates){ return this.http.post(`${this.API_URL}70/${id}`, dates); } - report(algo_id:number, cam_id:string, dates){ - return this.http.post(`${api}/report/${algo_id}/${cam_id}`, dates ,{ + scc(id: string, dates){ + return this.http.post(`${this.API_URL}71/${id}`, dates); + } + async report(algo_id:number, cam_id:string, dates){ + return await this.http.post(`${api}/report/${algo_id}/${cam_id}`, dates ,{ responseType: 'blob' }); } + + // async downloadLargeFile(url:string): Promise { + // return await this.http.get(url, { + // responseType: "arraybuffer", + // }).pipe(map((file:ArrayBuffer) => { + // return file; + // })).toPromise + // } constructor(private http: HttpClient) { } } diff --git a/client/src/index.html b/client/src/index.html index 8d4e0d2d..46939c73 100755 --- a/client/src/index.html +++ b/client/src/index.html @@ -14,7 +14,7 @@ Loading... - +
diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 3d1abcea..80a6d020 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,14 +11,14 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.2.1 + image: graymatics1/multi-tenant-server:2.3.46 restart: always volumes: - ./resources:/usr/src/app/resources - ../configDocker.env:/usr/src/config.env multi-tenant-ui: - image: graymatics1/multi-tenant-ui:2.2.1 + image: graymatics1/multi-tenant-ui:2.3.40 # networks: # - dev restart: always diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index c8884cb8..10d84cfc 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -1721,33 +1721,50 @@ exports.queue = async (req, res) => { camera_id: req.params.id } }); + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); + let cache = '', range, cou = 0, start, end + if(diff === 1){ + range = 30 * 60 * 1000 + start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 + start = JSON.stringify(new Date(start)) + start = start.substring(1, start.length - 1); + end = new Date(data.end).getTime() - 1.5 * 60 * 60 * 1000 + end = JSON.stringify(new Date(end)) + end = end.substring(1, end.length - 1); + }else if(diff >= 1 && diff <= 3){ + range = 2 * 60 * 60 * 1000 + }else if(diff >= 3 && diff <= 7){ + range = 4 * 60 * 60 * 1000 + }else if(diff >= 7 && diff <= 14){ + range = 8 * 60 * 60 * 1000 + }else if(diff >= 14 && diff <= 32){ + range = 24 * 60 * 60 * 1000 + } + if(start === undefined){ + start = data.start + end = data.end + } + // console.log(data, start, end) + // console.log(`SELECT * from queue_mgt WHERE ${data.type} = '${req.params.id}' and start_time >= '${start}' and start_time <= '${end}' order by start_time asc;`) await db .con() .query( - `SELECT * from queue_mgt WHERE ${data.type} = '${req.params.id}' and start_time >= '${data.start}' and start_time <= '${data.end}' order by start_time asc;`, + `SELECT * from queue_mgt WHERE ${data.type} = '${req.params.id}' and start_time >= '${start}' and start_time <= '${end}' order by start_time asc;`, async function (err, result) { - if (err || result.length === 0) + if (result === undefined || result.length === 0) + return res.status(500).json({ + success: false, + message: 'No results' + }) + if (err) return res.status(500).json({ success: false, message: err }) - const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); - let cache = '', range, cou = 0 - if(diff === 1){ - range = 30 * 60 * 1000 - }else if(diff >= 1 && diff <= 3){ - range = 2 * 60 * 60 * 1000 - }else if(diff >= 3 && diff <= 7){ - range = 4 * 60 * 60 * 1000 - }else if(diff >= 7 && diff <= 14){ - range = 8 * 60 * 60 * 1000 - }else if(diff >= 14 && diff <= 32){ - range = 24 * 60 * 60 * 1000 - } - cache = new Date(data.start).getTime() + // cache = new Date(data.start).getTime() let countIn = 0 let countAll = {}, timesAv = {}, avgs = [] - let dataAlertsMed = [], dataAlertsHigh = [], dataAlertsLow = [], dataPeople = {} + let dataAlertsMed = [], dataAlertsHigh = [], dataAlertsLow = [], dataPeople = {}, dataPeopleAll = [] for(let i = 1; i <= count; i++){ avgs[i - 1] = 0 timesAv[i] = 0 @@ -1755,23 +1772,35 @@ exports.queue = async (req, res) => { dataAlertsMed.push({}) dataAlertsHigh.push({}) dataAlertsLow.push({}) + dataPeopleAll.push({}) } const label = [] const labelPeople = [] let avg = 0 - let min = 0 - let max = 0 + let min = -1 + let max = -1 let minQ, maxQ let times = [] + // let cacheTime = new Date(start).getTime() + // let cacheTime = 0 + // const num = parseInt(data.timezone.slice(1,3)) * 3600 * 1000 + // if(data.timezone.slice(0,1) == '-'){ + // cacheTime = new Date(start).getTime() + num + // }else{ + // cacheTime = new Date(start).getTime() - num + // } + cache = new Date(start).getTime() + // console.log(dataPeopleAll) for (var v of result) { - if (v.queuing == 1) { + if (v.queuing == 0) { countAll[v.qid] = (countAll[v.qid] || 0) + 1 countIn++ - } else { + // } else { v['wait'] = (v.end_time - v.start_time) / 1000 v['wait'] = display(v['wait']) + // console.log(v.end_time, v.start_time, (v.end_time - v.start_time)) times.push({ - time: (v.end_time - v.start_time) / 60000, + time: (v.end_time - v.start_time) / 1000, queue: v.qid }) } @@ -1804,7 +1833,7 @@ exports.queue = async (req, res) => { v.pic_path = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/queue/${req.params.id}/${v.picture}` v.movie = `${d}_${v.id}_video.mp4` v.vid = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/queue/${req.params.id}/${v.movie}` - if(v.queuing == 1){ + if(v.queuing == 0){ if ( cache < v.start_time.getTime() ) { @@ -1813,6 +1842,9 @@ exports.queue = async (req, res) => { ) { cache = new Date(cache) dataPeople[cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + for(let e = 0; e < count; e++){ + dataPeopleAll[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + } cache = cache.getTime() cache += range } @@ -1824,6 +1856,7 @@ exports.queue = async (req, res) => { t -= range t = new Date(t) dataPeople[t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes()] = (dataPeople[ t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes() ] || 0) + 1 + dataPeopleAll[v.qid - 1][t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes()] = (dataPeopleAll[v.qid - 1][ t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes() ] || 0) + 1 } labelPeople.push(v.start_time) cou++ @@ -1831,35 +1864,43 @@ exports.queue = async (req, res) => { } if(cou === countIn){ while ( - cache <= new Date(data.end) + cache <= new Date(end) ) { cache = new Date(cache) dataPeople[cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + for(let e = 0; e < count; e++){ + dataPeopleAll[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + } cache = cache.getTime() cache += range } } - for (var e of times) { + for (let e of times) { avgs[e.queue - 1] = avgs[e.queue - 1] + e.time avg = avg + e.time timesAv[e.queue] = (timesAv[e.queue] || 0 ) + 1 - if (min == 0) { + if (min === -1) { + // console.log('++++++++++++++++++++++++++++++++', e.queue, e.time, min) min = e.time minQ = e.queue } else if (e.time < min) { + // console.log('================================', e.queue, min) min = e.time minQ = e.queue } - if (max == 0) { + if (max === -1) { + // console.log('////////////////////////////////', e.queue) max = e.time maxQ = e.queue } else if (e.time > max) { + // console.log('--------------------------------', e.queue) max = e.time maxQ = e.queue } } + // console.log(minQ, maxQ) for(let t = 0; t < avgs.length; t++){ - avgs[t] = Math.round((avgs[t] / timesAv[t + 1]) * 100) / 100 + avgs[t] = Math.round(avgs[t] / timesAv[t + 1]) if(isNaN(avgs[t])){ avgs[t] = 0 } @@ -1867,22 +1908,9 @@ exports.queue = async (req, res) => { await db .con() .query( - `SELECT * from queue_alerts WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, + `SELECT * from queue_alerts WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, function (err, result2) { - const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); - let cache = '', range, cou = 0 - if(diff === 1){ - range = 30 * 60 * 1000 - }else if(diff >= 1 && diff <= 3){ - range = 2 * 60 * 60 * 1000 - }else if(diff >= 3 && diff <= 7){ - range = 4 * 60 * 60 * 1000 - }else if(diff >= 7 && diff <= 14){ - range = 8 * 60 * 60 * 1000 - }else if(diff >= 14 && diff <= 32){ - range = 24 * 60 * 60 * 1000 - } - cache = new Date(data.start).getTime() + cache = new Date(start).getTime() result2.forEach(function (v) { let d = v.time let se = d.getSeconds() @@ -1959,20 +1987,32 @@ exports.queue = async (req, res) => { } label.push(v.time) if(cou === result2.length){ - while ( - cache <= new Date(data.end) - ) { - cache = new Date(cache) - for(let e = 0; e < count; e++){ - dataAlertsLow[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 - dataAlertsMed[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 - dataAlertsHigh[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 - } - cache = cache.getTime() - cache += range - } + // while ( + // cache <= new Date(end) + // ) { + // cache = new Date(cache) + // for(let e = 0; e < count; e++){ + // dataAlertsLow[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + // dataAlertsMed[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + // dataAlertsHigh[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + // } + // cache = cache.getTime() + // cache += range + // } } }) + while ( + cache <= new Date(end) + ) { + cache = new Date(cache) + for(let e = 0; e < count; e++){ + dataAlertsLow[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + dataAlertsMed[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + dataAlertsHigh[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + } + cache = cache.getTime() + cache += range + } let a = { label: label, labelPeople: labelPeople, @@ -1988,7 +2028,8 @@ exports.queue = async (req, res) => { avgs: avgs, min: minQ, max: maxQ, - rel: rel + rel: rel, + dataPeopleAll: dataPeopleAll } res.status(200).json({ success: true, @@ -8773,44 +8814,55 @@ exports.breadAvail = async (req, res) => { camera_id: req.params.id } }); + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); + let start, end + let cache = [], range + start = new Date(data.start) + end = new Date(data.end) + if(diff === 1){ + // range = 30 * 60 * 1000 + range = 5 * 60 * 1000 + start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 + start = JSON.stringify(new Date(start)) + start = start.substring(1, start.length - 1); + end = new Date(data.end).getTime() - 1.5* 60 * 60 * 1000 + end = JSON.stringify(new Date(end)) + end = end.substring(1, end.length - 1); + }else if(diff >= 1 && diff <= 3){ + range = 2 * 60 * 60 * 1000 + }else if(diff >= 3 && diff <= 7){ + range = 4 * 60 * 60 * 1000 + }else if(diff >= 7 && diff <= 14){ + range = 8 * 60 * 60 * 1000 + }else if(diff >= 14 && diff <= 32){ + range = 24 * 60 * 60 * 1000 + } + console.log(start, end,`SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) await db .con() .query( - `SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, - function (err, result) { + `SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`, + async function (err, result) { if (err) return res.status(500).json({ success: false, message: err }) - const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); - let cache = [], range - if(diff === 1){ - range = 30 * 60 * 1000 - }else if(diff >= 1 && diff <= 3){ - range = 2 * 60 * 60 * 1000 - }else if(diff >= 3 && diff <= 7){ - range = 4 * 60 * 60 * 1000 - }else if(diff >= 7 && diff <= 14){ - range = 8 * 60 * 60 * 1000 - }else if(diff >= 14 && diff <= 32){ - range = 24 * 60 * 60 * 1000 - } - // cache = new Date(data.start).getTime() + let dwell = [], dwellAll = [] let labelsD = [], labelsDAll =[] let av = [], sum = [] let cacheTime = 0 const num = parseInt(data.timezone.slice(1,3)) * 3600 * 1000 if(data.timezone.slice(0,1) == '-'){ - cacheTime = new Date(data.start).getTime() + range + num + cacheTime = new Date(start).getTime() }else{ - cacheTime = new Date(data.start).getTime() + range - num + cacheTime = new Date(start).getTime() } for(let i = 1; i <= count; i++){ cache.push(cacheTime) dwellAll.push([]) - labelsDAll.push([new Date(data.start).getTime()]) + labelsDAll.push([new Date(cacheTime).getTime()]) av.push([]) sum.push(0) } @@ -8820,29 +8872,85 @@ exports.breadAvail = async (req, res) => { }else if(v.zone == 'left'){ v.zone = 0 } - if(v.time.getTime() < cache[v.zone]){ + if(v.time.getTime() >= cache[v.zone] && v.time.getTime() < cache[v.zone] + range){ av[v.zone].push(v.availability) - sum[v.zone] = sum[v.zone] + parseInt(v.availability) + sum[v.zone] += parseInt(v.availability) }else{ cache[v.zone] += range + labelsDAll[v.zone].push(cache[v.zone]) let availability = sum[v.zone]/av[v.zone].length availability = Math.round(availability * 100) / 100 dwellAll[v.zone].push(availability) sum[v.zone] = 0 - av[v.zone] = [] - labelsDAll[v.zone].push(cache[v.zone]) + av[v.zone] = [] } }) - let a = { - dwell: dwell, - labelsD: labelsD, - dwellAll: dwellAll, - labelsDAll: labelsDAll + for(let i = 0; i < sum.length; i++){ + let availability = sum[i]/av[i].length + availability = Math.round(availability * 100) / 100 + dwellAll[i].push(availability) } - res.status(200).json({ - success: true, - data: a - }) + await db + .con() + .query( + `SELECT * from avail_alerts WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + function (err, result2) { + if(result2 === undefined || result2.length === 0){ + let a = { + dwell: dwell, + labelsD: labelsD, + dwellAll: dwellAll, + labelsDAll: labelsDAll, + rawAlerts: result2 + } + return res.status(200).json({ + success: true, + data: a + }) + } + result2.forEach(function (v) { + let d = v.time + let se = d.getSeconds() + let mi = d.getMinutes() + let ho = d.getHours() + if (se < 10) { + se = '0' + se + } + if (mi < 10) { + mi = '0' + mi + } + if (ho < 10) { + ho = '0' + ho + } + d = + d.getFullYear() + + '-' + + (d.getMonth() + 1) + + '-' + + d.getDate() + + '_' + + ho + + ':' + + mi + + ':' + + se + v['picture'] = `${d}_${v.id}.jpg` + v.pic_path = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/avail_alerts/${req.params.id}/${v.picture}` + v.movie = `${d}_${v.id}_video.mp4` + v.vid = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/avail_alerts/${req.params.id}/${v.movie}` + }) + let a = { + dwell: dwell, + labelsD: labelsD, + dwellAll: dwellAll, + labelsDAll: labelsDAll, + rawAlerts: result2 + } + res.status(200).json({ + success: true, + data: a + }) + }) } ) }) @@ -8882,66 +8990,144 @@ exports.breadTemp = async (req, res) => { camera_id: req.params.id } }); + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); + let start, end + let cache = [], range, cou = 0 + start = new Date(data.start) + end = new Date(data.end) + if(diff === 1){ + range = 5 * 60 * 1000 + start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 + start = JSON.stringify(new Date(start)) + start = start.substring(1, start.length - 1); + end = new Date(data.end).getTime() - 1.5 * 60 * 60 * 1000 + end = JSON.stringify(new Date(end)) + end = end.substring(1, end.length - 1); + }else if(diff >= 1 && diff <= 3){ + range = 2 * 60 * 60 * 1000 + }else if(diff >= 3 && diff <= 7){ + range = 4 * 60 * 60 * 1000 + }else if(diff >= 7 && diff <= 14){ + range = 8 * 60 * 60 * 1000 + }else if(diff >= 14 && diff <= 32){ + range = 24 * 60 * 60 * 1000 + } + // console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`) await db .con() .query( - `SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, - function (err, result) { + `SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + async function (err, result) { if (err) return res.status(500).json({ success: false, message: err }) - const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); - let cache = '', range, cou = 0 - if(diff === 1){ - range = 30 * 60 * 1000 - }else if(diff >= 1 && diff <= 3){ - range = 2 * 60 * 60 * 1000 - }else if(diff >= 3 && diff <= 7){ - range = 4 * 60 * 60 * 1000 - }else if(diff >= 7 && diff <= 14){ - range = 8 * 60 * 60 * 1000 - }else if(diff >= 14 && diff <= 32){ - range = 24 * 60 * 60 * 1000 - } - cache = new Date(data.start).getTime() - let ress = {}, ressAll = [] + let dwell = [], dwellAll = [] let labelsD = [], labelsDAll =[] + let av = [], sum = [] + let cacheTime = new Date(start).getTime() for(let i = 1; i <= count; i++){ - ressAll.push({}) + cache.push(cacheTime) dwellAll.push([]) - labelsDAll.push([]) + labelsDAll.push([new Date(cacheTime).getTime()]) + av.push([]) + sum.push(0) } - + // console.log(result) result.forEach(function (v) { if(v.zone == 'right'){ v.zone = 1 }else if(v.zone == 'left'){ v.zone = 0 } - ress[v.time.getHours()] = (ress[v.time.getHours()] || 0) + 1 - dwell.push(v.temperature) - labelsD.push(v.time) - ressAll[v.zone][v.time.getHours()] = (ressAll[v.zone][v.time.getHours()] || 0) + 1 - dwellAll[v.zone].push(v.temperature) - labelsDAll[v.zone].push(v.time) + // console.log(v.time.getTime()) + if(v.time.getTime() >= cache[v.zone] && v.time.getTime() < cache[v.zone] + range){ + av[v.zone].push(v.temperature) + sum[v.zone] += parseInt(v.temperature) + }else{ + cache[v.zone] += range + labelsDAll[v.zone].push(cache[v.zone]) + let temperature = sum[v.zone]/av[v.zone].length + temperature = Math.round(temperature * 100) / 100 + dwellAll[v.zone].push(temperature) + // console.log(v) + sum[v.zone] = 0 + av[v.zone] = [] + } }) - let a = { - dwell: dwell, - labelsD: labelsD, - dwellAll: dwellAll, - labelsDAll: labelsDAll + for(let i = 0; i < sum.length; i++){ + let temperature = sum[i]/av[i].length + temperature = Math.round(temperature * 100) / 100 + dwellAll[i].push(temperature) } - res.status(200).json({ - success: true, - data: a + await db + .con() + .query( + `SELECT * from temp_alerts WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + function (err, result2) { + if(result2 === undefined || result2.length === 0){ + let a = { + dwell: dwell, + labelsD: labelsD, + dwellAll: dwellAll, + labelsDAll: labelsDAll, + rawAlerts: result2 + } + return res.status(200).json({ + success: true, + data: a + }) + } + result2.forEach(function (v) { + let d = v.time + let se = d.getSeconds() + let mi = d.getMinutes() + let ho = d.getHours() + if (se < 10) { + se = '0' + se + } + if (mi < 10) { + mi = '0' + mi + } + if (ho < 10) { + ho = '0' + ho + } + d = + d.getFullYear() + + '-' + + (d.getMonth() + 1) + + '-' + + d.getDate() + + '_' + + ho + + ':' + + mi + + ':' + + se + v['picture'] = `${d}_${v.id}.jpg` + v.pic_path = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/temp_alerts/${req.params.id}/${v.picture}` + v.movie = `${d}_${v.id}_video.mp4` + v.vid = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/temp_alerts/${req.params.id}/${v.movie}` + }) + let a = { + dwell: dwell, + labelsD: labelsD, + dwellAll: dwellAll, + labelsDAll: labelsDAll, + rawAlerts: result2 + } + res.status(200).json({ + success: true, + data: a + }) }) } ) }) .catch(err => { + console.error(err) return res.status(500).send({ success: false, message: err @@ -8950,7 +9136,7 @@ exports.breadTemp = async (req, res) => { }) } -exports.breadTemp = async (req, res) => { +exports.scc = async (req, res) => { let token = req.headers['x-access-token'] const data = req.body jwt.verify(token, process.env.secret, async (err, decoded) => { @@ -8958,12 +9144,12 @@ exports.breadTemp = async (req, res) => { if (decoded.id_branch != 0000) { wh = { id_branch: decoded.id_branch, - algo_id: 70 + algo_id: 71 } } else { wh = { id_account: decoded.id_account, - algo_id: 70 + algo_id: 71 } } Relation.findOne({ @@ -8972,75 +9158,144 @@ exports.breadTemp = async (req, res) => { .then(async rel => { const count = await Relation.count({ where: { - algo_id: 70, + algo_id: 71, camera_id: req.params.id } }); + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); + let start, end + let cache, cacheTr, range + let dataAlertsTrolley = {}, dataPeopleReceipt = {} + start = new Date(data.start) + end = new Date(data.end) + const labelPeople = [] + if(diff === 1){ + range = 5 * 60 * 1000 + start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 + start = JSON.stringify(new Date(start)) + start = start.substring(1, start.length - 1); + end = new Date(data.end).getTime() - 1.5 * 60 * 60 * 1000 + end = JSON.stringify(new Date(end)) + end = end.substring(1, end.length - 1); + }else if(diff >= 1 && diff <= 3){ + range = 2 * 60 * 60 * 1000 + }else if(diff >= 3 && diff <= 7){ + range = 4 * 60 * 60 * 1000 + }else if(diff >= 7 && diff <= 14){ + range = 8 * 60 * 60 * 1000 + }else if(diff >= 14 && diff <= 32){ + range = 24 * 60 * 60 * 1000 + } + cache = new Date(start).getTime() + cacheTr = new Date(start).getTime() await db .con() .query( - `SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${data.start}' and time <= '${data.end}' order by time asc;`, - function (err, result) { + `SELECT * from scc WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + async function (err, result) { if (err) return res.status(500).json({ success: false, message: err }) - const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)); - let cache = [], range - if(diff === 1){ - range = 30 * 60 * 1000 - }else if(diff >= 1 && diff <= 3){ - range = 2 * 60 * 60 * 1000 - }else if(diff >= 3 && diff <= 7){ - range = 4 * 60 * 60 * 1000 - }else if(diff >= 7 && diff <= 14){ - range = 8 * 60 * 60 * 1000 - }else if(diff >= 14 && diff <= 32){ - range = 24 * 60 * 60 * 1000 + result.forEach(function (v) { + let d = v.time + let se = d.getSeconds() + let mi = d.getMinutes() + let ho = d.getHours() + if (se < 10) { + se = '0' + se } - // cache = new Date(data.start).getTime() - let dwell = [], dwellAll = [] - let labelsD = [], labelsDAll =[] - let av = [], sum = [] - let cacheTime = 0 - const num = parseInt(data.timezone.slice(1,3)) * 3600 * 1000 - if(data.timezone.slice(0,1) == '-'){ - cacheTime = new Date(data.start).getTime() + range + num - }else{ - cacheTime = new Date(data.start).getTime() + range - num + if (mi < 10) { + mi = '0' + mi } - for(let i = 1; i <= count; i++){ - cache.push(cacheTime) - dwellAll.push([]) - labelsDAll.push([new Date(data.start).getTime()]) - av.push([]) - sum.push(0) + if (ho < 10) { + ho = '0' + ho } - result.forEach(function (v) { - if(v.zone == 'right'){ - v.zone = 1 - }else if(v.zone == 'left'){ - v.zone = 0 + d = + d.getFullYear() + + '-' + + (d.getMonth() + 1) + + '-' + + d.getDate() + + '_' + + ho + + ':' + + mi + + ':' + + se + v['picture'] = `${d}_${v.id}.jpg` + v.pic_path = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/temp_alerts/${req.params.id}/${v.picture}` + if(v.trolley == '1'){ + if ( + cacheTr < v.time.getTime() + ) { + while ( + cacheTr < v.time.getTime() + ) { + cacheTr = new Date(cacheTr) + dataAlertsTrolley[cacheTr.getFullYear() + '-' + (cacheTr.getMonth() + 1) + '-' + cacheTr.getDate() + ' ' + cacheTr.getHours() + ':' + cacheTr.getMinutes()] = 0 + cacheTr = cacheTr.getTime() + cacheTr += range + } + } + if ( + cacheTr >= v.time.getTime() + ) { + let t = cacheTr + t -= range + t = new Date(t) + dataAlertsTrolley[t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes()] = (dataAlertsTrolley[ t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes() ] || 0) + 1 + } + labelPeople.push(v.time) } - if(v.time.getTime() < cache[v.zone]){ - av[v.zone].push(v.temperature) - sum[v.zone] = sum[v.zone] + parseInt(v.temperature) - }else{ - cache[v.zone] += range - let temperature = sum[v.zone]/av[v.zone].length - temperature = Math.round(temperature * 100) / 100 - dwellAll[v.zone].push(temperature) - sum[v.zone] = 0 - av[v.zone] = [] - labelsDAll[v.zone].push(cache[v.zone]) + if(v.receipt == '1'){ + if ( + cache < v.time.getTime() + ) { + while ( + cache < v.time.getTime() + ) { + cache = new Date(cache) + dataPeopleReceipt[cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + cache = cache.getTime() + cache += range + } + } + if ( + cache >= v.time.getTime() + ) { + let t = cache + t -= range + t = new Date(t) + dataPeopleReceipt[t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes()] = (dataPeopleReceipt[ t.getFullYear() + '-' + (t.getMonth() + 1) + '-' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes() ] || 0) + 1 + } + labelPeople.push(v.time) } }) + while ( + cacheTr <= new Date(end) + ) { + cacheTr = new Date(cacheTr) + dataAlertsTrolley[cacheTr.getFullYear() + '-' + (cacheTr.getMonth() + 1) + '-' + cacheTr.getDate() + ' ' + cacheTr.getHours() + ':' + cacheTr.getMinutes()] = 0 + cacheTr = cacheTr.getTime() + cacheTr += range + } + while ( + cache <= new Date(end) + ) { + cache = new Date(cache) + dataPeopleReceipt[cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 + cache = cache.getTime() + cache += range + } let a = { - dwell: dwell, - labelsD: labelsD, - dwellAll: dwellAll, - labelsDAll: labelsDAll + raw: result, + dataAlertsTrolley: dataAlertsTrolley, + dataPeopleReceipt: dataPeopleReceipt + // labelsD: labelsD, + // dwellAll: dwellAll, + // labelsDAll: labelsDAll, } res.status(200).json({ success: true, diff --git a/server/app/controllers/report.controller.js b/server/app/controllers/report.controller.js index afcaef51..11a952e0 100755 --- a/server/app/controllers/report.controller.js +++ b/server/app/controllers/report.controller.js @@ -5,7 +5,7 @@ const db = require('../models/dbmysql') const stream = require('stream') const xlsx = require('node-xlsx').default -const createExelReport = (data, name) => { +const createExelReport = async (data, name) => { const excelDataArray = [] excelDataArray.push(Object.keys(data[0])) for (const obj of data) { @@ -22,17 +22,43 @@ exports.report = async (req, res) => { if (req.params.algo_id === '22') { extra = " and severity = '2'" } - let query = `SELECT id, time, camera_name, cam_id, zone, severity from queue_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${data.start}' and time <= '${data.end}'${extra} order by time asc;` + const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)) + let start, end + if (diff === 1) { + start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 + start = JSON.stringify(new Date(start)) + start = start.substring(1, start.length - 1) + end = new Date(data.end).getTime() - 1 * 60 * 60 * 1000 + end = JSON.stringify(new Date(end)) + end = end.substring(1, end.length - 1) + } + // console.log(req.params.algo_id) + let query = `SELECT id, time, camera_name, cam_id, zone, severity from queue_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}'${extra} order by time asc;` if (data.algo === 'count') { - query = `SELECT id, start_time, end_time, camera_name, cam_id, qid, track_id, queuing from queue_mgt WHERE ${data.type} = '${req.params.cam_id}' and start_time >= '${data.start}' and start_time <= '${data.end}' order by start_time asc;` + query = `SELECT id, start_time, end_time, camera_name, cam_id, qid, track_id, queuing from queue_mgt WHERE ${data.type} = '${req.params.cam_id}' and start_time >= '${start}' and start_time <= '${end}' order by start_time asc;` + } + if (req.params.algo_id === '69' && data.typ === 'alerts') { + query = `SELECT id, time, camera_name, cam_id, zone, severity from avail_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` + } + if (req.params.algo_id === '69' && data.typ === 'data') { + query = `SELECT time, camera_name, cam_id, zone, availability from bread_availability WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` + } + if (req.params.algo_id === '70' && data.typ === 'alerts') { + query = `SELECT id, time, camera_name, cam_id, zone, severity from temp_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` + } + if (req.params.algo_id === '70' && data.typ === 'data') { + query = `SELECT time, camera_name, cam_id, zone, temperature from bread_temperature WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` } await db .con() .query( query, async function (_err, result) { - const fn = `${req.params.cam_id}-${data.start}` + if (result === undefined || result.length === 0) { + return res.status(400).send({ success: false, message: 'No hay data.', type: data.typ }) + } + const fn = `${req.params.cam_id}-${start}` const exc = await createExelReport(result, fn) const readStream = new stream.PassThrough() readStream.end(exc) diff --git a/server/app/initializator/updateFunc.js b/server/app/initializator/updateFunc.js index 3de84623..6de79ae7 100644 --- a/server/app/initializator/updateFunc.js +++ b/server/app/initializator/updateFunc.js @@ -14,6 +14,10 @@ exports.initial = async function () { { where: { id: 68 } }) + await algo.create({ + id: 71, + name: 'Caja automatica' + }) await algo.create({ id: 69, name: 'Disponibilidad Pan' diff --git a/server/app/routes/analytics.routes.js b/server/app/routes/analytics.routes.js index ed9d0569..9fe778c2 100755 --- a/server/app/routes/analytics.routes.js +++ b/server/app/routes/analytics.routes.js @@ -2835,4 +2835,6 @@ module.exports = function (app) { app.post('/api/analytics/69/:id', [authJwt.isAvailable, authJwt.verifyToken], controller.breadAvail) app.post('/api/analytics/70/:id', [authJwt.isAvailable, authJwt.verifyToken], controller.breadTemp) + + app.post('/api/analytics/71/:id', [authJwt.isAvailable, authJwt.verifyToken], controller.scc) } From c0dc535201f979f5afecdef130e2858db25cfbec Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 5 Dec 2022 11:22:36 -0300 Subject: [PATCH 09/38] docker compose updated --- dockerDeployment/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 80a6d020..e6b885f6 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,7 +11,7 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.3.46 + image: graymatics1/multi-tenant-server:2.3.47 restart: always volumes: - ./resources:/usr/src/app/resources From 5d4aa18c9a5bb035d759ef0155d5d34ff2b9ecc1 Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 21 Dec 2022 10:47:13 -0300 Subject: [PATCH 10/38] proxy added in gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9351d6e1..e9e3fa0c 100755 --- a/.gitignore +++ b/.gitignore @@ -45,4 +45,5 @@ dockerDeployment/resources/** !dockerDeployment/resources/Microsoft_logo.svg.png !dockerDeployment/resources/googleLogo.png !dockerDeployment/resources/favicon1.png -!dockerDeployment/resources/favicon1.ico \ No newline at end of file +!dockerDeployment/resources/favicon1.ico +proxy/resources/** \ No newline at end of file From c83a23d15f45141d4a489ff51da4e74183a1588f Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 21 Dec 2022 10:54:58 -0300 Subject: [PATCH 11/38] updated docker compose --- dockerDeployment/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index e6b885f6..07243c7b 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -18,7 +18,7 @@ services: - ../configDocker.env:/usr/src/config.env multi-tenant-ui: - image: graymatics1/multi-tenant-ui:2.3.40 + image: graymatics1/multi-tenant-ui:2.3.42 # networks: # - dev restart: always From f3f1899082f123d645625bf2f5be9b4b4df2290a Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 21 Dec 2022 10:55:07 -0300 Subject: [PATCH 12/38] spanish queue --- .../src/app/pages/online/graphs/queue/queue.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index b45edd43..dd127c1f 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -364,7 +364,7 @@ export class QueueComponent implements OnInit, OnDestroy { noDataMessage: "No data found", columns: { picture: { - title: 'PICTURE', + title: 'Imagen', type: 'custom', filter: false, renderComponent: ButtonViewComponentPic, @@ -375,17 +375,17 @@ export class QueueComponent implements OnInit, OnDestroy { } }, time: { - title: 'TIME', + title: 'Hora', type: 'string', filter: false }, camera_name: { - title: 'CAM', + title: 'Camara', type: 'string', filter: false }, zone: { - title: 'QUEUE', + title: 'Fila', type: 'string', filter: false } From 2e7dfcd4330ddc72d185cca93497278027481a07 Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 21 Dec 2022 10:55:18 -0300 Subject: [PATCH 13/38] trolley and receipt --- .../pages/online/graphs/scc/scc.component.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/client/src/app/pages/online/graphs/scc/scc.component.ts b/client/src/app/pages/online/graphs/scc/scc.component.ts index ac35b6f6..8bb97fa7 100644 --- a/client/src/app/pages/online/graphs/scc/scc.component.ts +++ b/client/src/app/pages/online/graphs/scc/scc.component.ts @@ -295,7 +295,7 @@ export class SccComponent implements OnInit, OnDestroy { noDataMessage: "No data found", columns: { picture: { - title: 'PICTURE', + title: 'Imagen', type: 'custom', filter: false, renderComponent: ButtonViewComponentPic, @@ -306,17 +306,27 @@ export class SccComponent implements OnInit, OnDestroy { } }, time: { - title: 'TIME', + title: 'Hora', type: 'string', filter: false }, camera_name: { - title: 'CAM', + title: 'Camara', + type: 'string', + filter: false + }, + receipt: { + title: 'Recibo', + type: 'string', + filter: false + }, + trolley: { + title: 'Carro', type: 'string', filter: false }, zone: { - title: 'scc', + title: 'Zona', type: 'string', filter: false } From 857f8225dd61e3fe767a7aaf5cb07ea10e5745e8 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 29 Dec 2022 10:05:09 -0300 Subject: [PATCH 14/38] update --- dockerDeployment/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 07243c7b..b1e2e22a 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,7 +11,7 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.3.47 + image: graymatics1/multi-tenant-server:2.3.48 restart: always volumes: - ./resources:/usr/src/app/resources From e84ba785240bb7ad1add3e66f6b467bca874bd16 Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 2 Jan 2023 14:50:37 -0300 Subject: [PATCH 15/38] Fixed sort function of faster and slower queue --- .../app/controllers/analytics.controller.js | 53 +++++++------------ 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index 10d84cfc..fd42e029 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -1879,32 +1879,33 @@ exports.queue = async (req, res) => { avgs[e.queue - 1] = avgs[e.queue - 1] + e.time avg = avg + e.time timesAv[e.queue] = (timesAv[e.queue] || 0 ) + 1 - if (min === -1) { - // console.log('++++++++++++++++++++++++++++++++', e.queue, e.time, min) - min = e.time - minQ = e.queue - } else if (e.time < min) { - // console.log('================================', e.queue, min) - min = e.time - minQ = e.queue - } - if (max === -1) { - // console.log('////////////////////////////////', e.queue) - max = e.time - maxQ = e.queue - } else if (e.time > max) { - // console.log('--------------------------------', e.queue) - max = e.time - maxQ = e.queue - } + // console.log(e.time, e.queue) } - // console.log(minQ, maxQ) for(let t = 0; t < avgs.length; t++){ avgs[t] = Math.round(avgs[t] / timesAv[t + 1]) if(isNaN(avgs[t])){ avgs[t] = 0 } + if (min === -1) { + // console.log('++++++++++++++++++++++++++++++++', avgs[t]) + min = avgs[t] + minQ = t + 1 + } else if (avgs[t] < min) { + // console.log('================================', avgs[t]) + min = avgs[t] + minQ = t + 1 + } + if (max === -1) { + // console.log('////////////////////////////////',avgs[t]) + max = avgs[t] + maxQ = t + 1 + } else if (avgs[t] > max) { + // console.log('--------------------------------',avgs[t]) + max = avgs[t] + maxQ = t + 1 + } } + // console.log(minQ, maxQ) await db .con() .query( @@ -1986,20 +1987,6 @@ exports.queue = async (req, res) => { } } label.push(v.time) - if(cou === result2.length){ - // while ( - // cache <= new Date(end) - // ) { - // cache = new Date(cache) - // for(let e = 0; e < count; e++){ - // dataAlertsLow[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 - // dataAlertsMed[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 - // dataAlertsHigh[e][cache.getFullYear() + '-' + (cache.getMonth() + 1) + '-' + cache.getDate() + ' ' + cache.getHours() + ':' + cache.getMinutes()] = 0 - // } - // cache = cache.getTime() - // cache += range - // } - } }) while ( cache <= new Date(end) From e2eee5f8e7959e8c52147e8782fafa27b3f5ed2e Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 2 Jan 2023 14:53:23 -0300 Subject: [PATCH 16/38] newer docker compose --- dockerDeployment/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index b1e2e22a..b8a665db 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,7 +11,7 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.3.48 + image: graymatics1/multi-tenant-server:2.3.49 restart: always volumes: - ./resources:/usr/src/app/resources From 2ae6eefc4c14b6439576b0573160a3b873fd1e20 Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 11 Jan 2023 12:33:50 -0300 Subject: [PATCH 17/38] console.log out --- server/app/controllers/analytics.controller.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index fd42e029..1a7d6d10 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -8824,7 +8824,7 @@ exports.breadAvail = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - console.log(start, end,`SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) + // console.log(start, end,`SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) await db .con() .query( @@ -8880,8 +8880,10 @@ exports.breadAvail = async (req, res) => { await db .con() .query( - `SELECT * from avail_alerts WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + `SELECT * from avail_alerts WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`, function (err, result2) { + // console.log(`SELECT * from avail_alerts WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) + // console.log(result2.length,'==========') if(result2 === undefined || result2.length === 0){ let a = { dwell: dwell, @@ -8926,6 +8928,7 @@ exports.breadAvail = async (req, res) => { v.movie = `${d}_${v.id}_video.mp4` v.vid = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/avail_alerts/${req.params.id}/${v.movie}` }) + console.log(result2.length) let a = { dwell: dwell, labelsD: labelsD, From 30bebdcbecec97ac8a4e4dbc3814bacae2789055 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 19 Jan 2023 08:40:06 -0300 Subject: [PATCH 18/38] test new excel --- server/app/controllers/report.controller.js | 92 +- server/package-lock.json | 1342 ++++++++++++++++++- server/package.json | 1 + server/server.js | 4 +- 4 files changed, 1414 insertions(+), 25 deletions(-) diff --git a/server/app/controllers/report.controller.js b/server/app/controllers/report.controller.js index 11a952e0..7e5c5247 100755 --- a/server/app/controllers/report.controller.js +++ b/server/app/controllers/report.controller.js @@ -4,6 +4,8 @@ require('dotenv').config({ const db = require('../models/dbmysql') const stream = require('stream') const xlsx = require('node-xlsx').default +const Excel = require('exceljs') +const async = require('async') const createExelReport = async (data, name) => { const excelDataArray = [] @@ -16,22 +18,22 @@ const createExelReport = async (data, name) => { return buffer } -exports.report = async (req, res) => { +exports.report1 = async (req, res) => { const data = req.body let extra = '' if (req.params.algo_id === '22') { extra = " and severity = '2'" } - const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)) + // const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)) let start, end - if (diff === 1) { - start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 - start = JSON.stringify(new Date(start)) - start = start.substring(1, start.length - 1) - end = new Date(data.end).getTime() - 1 * 60 * 60 * 1000 - end = JSON.stringify(new Date(end)) - end = end.substring(1, end.length - 1) - } + // if (diff === 1) { + start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 + start = JSON.stringify(new Date(start)) + start = start.substring(1, start.length - 1) + end = new Date(data.end).getTime() - 1 * 60 * 60 * 1000 + end = JSON.stringify(new Date(end)) + end = end.substring(1, end.length - 1) + // } // console.log(req.params.algo_id) let query = `SELECT id, time, camera_name, cam_id, zone, severity from queue_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}'${extra} order by time asc;` @@ -68,3 +70,73 @@ exports.report = async (req, res) => { readStream.pipe(res) }) } + +exports.report = async (req, res) => { + const data = req.body + let extra = '' + if (req.params.algo_id === '22') { + extra = " and severity = '2'" + } + // const diff = Math.ceil((new Date(data.end) - new Date(data.start)) / (1000 * 3600 * 24)) + let start, end + // if (diff === 1) { + start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 + start = JSON.stringify(new Date(start)) + start = start.substring(1, start.length - 1) + end = new Date(data.end).getTime() - 1 * 60 * 60 * 1000 + end = JSON.stringify(new Date(end)) + end = end.substring(1, end.length - 1) + // } + // console.log(req.params.algo_id) + let query = `SELECT id, time, camera_name, cam_id, zone, severity from queue_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}'${extra} order by time asc;` + + if (data.algo === 'count') { + query = `SELECT id, start_time, end_time, camera_name, cam_id, qid, track_id, queuing from queue_mgt WHERE ${data.type} = '${req.params.cam_id}' and start_time >= '${start}' and start_time <= '${end}' order by start_time asc;` + } + if (req.params.algo_id === '69' && data.typ === 'alerts') { + query = `SELECT id, time, camera_name, cam_id, zone, severity from avail_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` + } + if (req.params.algo_id === '69' && data.typ === 'data') { + query = `SELECT time, camera_name, cam_id, zone, availability from bread_availability WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` + } + if (req.params.algo_id === '70' && data.typ === 'alerts') { + query = `SELECT id, time, camera_name, cam_id, zone, severity from temp_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` + } + if (req.params.algo_id === '70' && data.typ === 'data') { + query = `SELECT time, camera_name, cam_id, zone, temperature from bread_temperature WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` + } + const options = { + stream: res, // write to server response + useStyles: false, + useSharedStrings: false + } + + const workbook = new Excel.stream.xlsx.WorkbookWriter(options) + const tableToSheet = function (name, done, id, query) { + const str = db.con().query(query).stream() + const sheet = workbook.addWorksheet(name) + + str.on('data', function (d) { + sheet.addRow(d).commit() // format object if required + }) + + str.on('end', function () { + sheet.commit() + done() + }) + + str.on('error', function (err) { + done(err) + }) + } + res.status(200) + res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls') + res.setHeader('Content-type', 'application/vnd.ms-excel') + + async.mapSeries(['cars'], tableToSheet, function (err) { + if (err) { + // log error + } + res.end() + }) +} diff --git a/server/package-lock.json b/server/package-lock.json index 232c9745..adeee460 100755 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -19,6 +19,7 @@ "cors": "^2.8.5", "dateformat": "^4.4.1", "dotenv": "^8.2.0", + "exceljs": "^4.3.0", "exif": "^0.6.0", "express": "^4.17.1", "glob-parent": "^5.1.2", @@ -287,6 +288,43 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/format/node_modules/@types/node": { + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@fast-csv/parse/node_modules/@types/node": { + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -399,6 +437,110 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "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" + } + }, + "node_modules/archiver-utils/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/archiver/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/archiver/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -454,6 +596,11 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/aws-sdk": { "version": "2.1099.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1099.0.tgz", @@ -558,6 +705,84 @@ "node": "*" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/bl/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", @@ -602,6 +827,14 @@ "isarray": "^1.0.0" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/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", @@ -742,6 +975,60 @@ "node": ">= 6" } }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compress-commons/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/compress-commons/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -893,6 +1180,58 @@ "node": ">=0.8" } }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/crc32-stream/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/crc32-stream/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/crc32-stream/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -915,6 +1254,11 @@ "node": "*" } }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1732,6 +2076,65 @@ "node": ">=0.4.x" } }, + "node_modules/exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/exceljs/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/exceljs/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/exceljs/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/exif": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/exif/-/exif-0.6.0.tgz", @@ -1788,6 +2191,18 @@ "node": ">= 0.10.0" } }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1915,6 +2330,11 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2112,6 +2532,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2382,6 +2807,44 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "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" + } + }, + "node_modules/jszip/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -2401,6 +2864,44 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "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" + } + }, + "node_modules/lazystream/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2414,6 +2915,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -2452,11 +2961,36 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -2472,11 +3006,21 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", @@ -2492,11 +3036,26 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -2840,6 +3399,14 @@ "validate-npm-package-license": "^3.0.1" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2985,6 +3552,11 @@ "node": ">=4" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3265,6 +3837,33 @@ "string_decoder": "~0.10.x" } }, + "node_modules/readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -3317,7 +3916,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -3343,6 +3941,17 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/secure-json-parse": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.3.0.tgz", @@ -3857,6 +4466,61 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3868,6 +4532,17 @@ "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.0.tgz", "integrity": "sha512-SaqBK8GtTKYSsTfhKdN0+NrZRgmVWO+j3fvgzLjt0t/g0osNzRH5os8icm2Rv5HvaeTd4TpxetUuLE+R9yg/yg==" }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -4181,6 +4856,11 @@ "node": ">=4.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -4218,6 +4898,59 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "optional": true + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/zip-stream/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/zip-stream/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } } }, "dependencies": { @@ -4418,6 +5151,47 @@ } } }, + "@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" + } + } + }, + "@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" + } + } + }, "@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -4495,17 +5269,102 @@ "uri-js": "^4.2.2" } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.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==", + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4546,6 +5405,11 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "aws-sdk": { "version": "2.1099.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1099.0.tgz", @@ -4619,6 +5483,55 @@ "chainsaw": "~0.1.0" } }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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==", + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", @@ -4667,6 +5580,11 @@ } } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, "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", @@ -4771,6 +5689,42 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==" }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.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==", + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -4893,6 +5847,40 @@ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.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==", + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4909,6 +5897,11 @@ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.4.1.tgz", "integrity": "sha512-3V9b/50QBYmFtd2c3cPOmdr2xNfnDphoBLxh/UVBoPIsylWkbUYGq3f4EQYuEaK7Mq4vcIpQCmOyJ37pqW/Uug==" }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5509,6 +6502,47 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "requires": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.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==", + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "exif": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/exif/-/exif-0.6.0.tgz", @@ -5559,6 +6593,15 @@ "vary": "~1.1.2" } }, + "fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "requires": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5651,6 +6694,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5805,6 +6853,11 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6001,6 +7054,46 @@ } } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -6020,6 +7113,43 @@ "safe-buffer": "^5.0.1" } }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6030,6 +7160,14 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -6062,11 +7200,36 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -6082,11 +7245,21 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, "lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, "lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", @@ -6102,11 +7275,26 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -6388,6 +7576,11 @@ "validate-npm-package-license": "^3.0.1" } }, + "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", @@ -6494,6 +7687,11 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6704,6 +7902,32 @@ "string_decoder": "~0.10.x" } }, + "readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -6741,7 +7965,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -6761,6 +7984,14 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, "secure-json-parse": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.3.0.tgz", @@ -7141,6 +8372,43 @@ } } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "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==", + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -7152,6 +8420,14 @@ "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.0.tgz", "integrity": "sha512-SaqBK8GtTKYSsTfhKdN0+NrZRgmVWO+j3fvgzLjt0t/g0osNzRH5os8icm2Rv5HvaeTd4TpxetUuLE+R9yg/yg==" }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -7398,6 +8674,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -7426,6 +8707,41 @@ "optional": true } } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.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==", + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } } } } diff --git a/server/package.json b/server/package.json index eb762dbf..7d70d175 100755 --- a/server/package.json +++ b/server/package.json @@ -19,6 +19,7 @@ "cors": "^2.8.5", "dateformat": "^4.4.1", "dotenv": "^8.2.0", + "exceljs": "^4.3.0", "exif": "^0.6.0", "express": "^4.17.1", "glob-parent": "^5.1.2", diff --git a/server/server.js b/server/server.js index 3418eefc..ab14f101 100755 --- a/server/server.js +++ b/server/server.js @@ -60,9 +60,9 @@ function customHeaders (req, res, next) { app.use(customHeaders) // parse requests of content-type - application/json -app.use(bodyParser.json({ limit: '10mb', extended: true })) +app.use(bodyParser.json({ limit: '100mb', extended: true })) // parse requests of content-type - application/x-www-form-urlencoded -app.use(bodyParser.urlencoded({ limit: '10mb', extended: true })) +app.use(bodyParser.urlencoded({ limit: '100mb', extended: true })) app.all(function (req, res, next) { res.header('Access-Control-Allow-Origin', `http://${process.env.my_ip}:4200`) res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE') From bff1f2b6ce43eee0ec52c37d241a4d45e058b779 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 19 Jan 2023 14:47:32 -0300 Subject: [PATCH 19/38] new method of excel data --- client/package-lock.json | 71 ++++++++++++++++--- client/package.json | 2 + .../availability/availability.component.ts | 11 +-- .../ham-cheese/ham-cheese.component.html | 6 +- .../graphs/ham-cheese/ham-cheese.component.ts | 25 +++++-- .../online/graphs/queue/queue.component.html | 6 +- .../online/graphs/queue/queue.component.ts | 24 +++++-- .../online/graphs/scc/scc.component.html | 5 +- .../pages/online/graphs/scc/scc.component.ts | 26 +++++-- .../temperature/temperature.component.ts | 12 ++-- client/src/app/services/analytics.service.ts | 4 ++ .../app/controllers/analytics.controller.js | 10 +-- server/app/controllers/report.controller.js | 48 ++++--------- 13 files changed, 168 insertions(+), 82 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 34571fdf..152d36a8 100755 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -75,6 +75,8 @@ "tslib": "^2.0.0", "typeface-exo": "0.0.22", "typescript": "^4.5.5", + "uuid": "^9.0.0", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz", "zone.js": "~0.11.4" }, "devDependencies": { @@ -15763,6 +15765,16 @@ "node": ">= 6" } }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "devOptional": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -17568,6 +17580,16 @@ "node": ">=8" } }, + "node_modules/tempfile/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/terser": { "version": "5.14.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", @@ -18380,13 +18402,11 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "devOptional": true, + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { @@ -19061,6 +19081,18 @@ } } }, + "node_modules/xlsx": { + "version": "0.19.1", + "resolved": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz", + "integrity": "sha512-pPh/ybd1bChlhCrtQ9QmRUx2yjQwMbS4tfvV9MSA2Qmm7vRUHQtPDMlLjAvQ2A4v8G92i2RlrNkSOKb1bwY7ww==", + "license": "Apache-2.0", + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -30857,6 +30889,14 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "devOptional": true + } } }, "require-directory": { @@ -32237,6 +32277,14 @@ "requires": { "temp-dir": "^2.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "terser": { @@ -32870,10 +32918,9 @@ } }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "devOptional": true + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, "v8-compile-cache": { "version": "2.1.1", @@ -33359,6 +33406,10 @@ "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "requires": {} }, + "xlsx": { + "version": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz", + "integrity": "sha512-pPh/ybd1bChlhCrtQ9QmRUx2yjQwMbS4tfvV9MSA2Qmm7vRUHQtPDMlLjAvQ2A4v8G92i2RlrNkSOKb1bwY7ww==" + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", diff --git a/client/package.json b/client/package.json index 56d33b21..9935af9e 100755 --- a/client/package.json +++ b/client/package.json @@ -89,6 +89,8 @@ "tslib": "^2.0.0", "typeface-exo": "0.0.22", "typescript": "^4.5.5", + "uuid": "^9.0.0", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz", "zone.js": "~0.11.4" }, "devDependencies": { diff --git a/client/src/app/pages/online/graphs/availability/availability.component.ts b/client/src/app/pages/online/graphs/availability/availability.component.ts index 35c729d7..cf31d015 100644 --- a/client/src/app/pages/online/graphs/availability/availability.component.ts +++ b/client/src/app/pages/online/graphs/availability/availability.component.ts @@ -19,6 +19,8 @@ import { FacesService } from "../../../../services/faces.service"; import { Account } from "../../../../models/Account"; import { NbDialogRef, NbDialogService } from "@nebular/theme"; import { FormBuilder, FormGroup } from "@angular/forms"; +import { utils, writeFileXLSX } from 'xlsx'; +import { v4 as uuidv4 } from 'uuid'; @Component({ selector: 'ngx-availability', @@ -333,11 +335,12 @@ export class AvailabilityComponent implements OnInit, OnDestroy { typ: typ, algo: this.algoId } - ;(await this.serv.report(this.algoId, this.camera, l)).subscribe( + ;(await this.serv.report1(this.algoId, this.camera, l)).subscribe( async (res) => { - const blob = new Blob([res], { type: res.type.toString() }); - const url = await window.URL.createObjectURL(blob); - await window.open(url, "_blank"); + const ws = utils.json_to_sheet(res['data']); + const wb = utils.book_new(); + utils.book_append_sheet(wb, ws, "Data"); + await writeFileXLSX(wb, `${uuidv4()}.xlsx`); this.csvAlerts[typ] = false }, err => { diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html index 2a4aeb08..58c6ff18 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html @@ -84,8 +84,10 @@
- - + + + + diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts index 4757e582..8b1724b8 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts @@ -9,6 +9,8 @@ import { FacesService } from '../../../../services/faces.service'; import { Router } from '@angular/router'; import { Account } from '../../../../models/Account'; import { SeverityComponent } from '../../severity/severity.component'; +import { utils, writeFileXLSX } from 'xlsx'; +import { v4 as uuidv4 } from 'uuid'; @Component({ selector: 'ngx-ham-cheese', @@ -350,8 +352,14 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { goToLink(url: string){ window.open(url, "_blank"); } + + csvAlerts: Object = { + alerts: false, + count: false + } async csv(algo){ + this.csvAlerts[algo] = true let type; if(this.now_user.id_branch != '0000'){ type = 'cam_id'; @@ -365,13 +373,18 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { ham: true, algo: algo } - ;(await this.serv.report(this.algo_id, this.camera, l)).subscribe( - res => { - var blob = new Blob([res], { type: res.type.toString() }); - var url = window.URL.createObjectURL(blob); - this.goToLink(url) + ;(await this.serv.report1(this.algo_id, this.camera, l)).subscribe( + async (res) => { + const ws = utils.json_to_sheet(res['data']); + const wb = utils.book_new(); + utils.book_append_sheet(wb, ws, "Data"); + await writeFileXLSX(wb, `${uuidv4()}.xlsx`); + this.csvAlerts[algo] = false }, - err => console.error(err) + err => { + console.error(err) + this.csvAlerts[algo] = false + } ) } settings = { diff --git a/client/src/app/pages/online/graphs/queue/queue.component.html b/client/src/app/pages/online/graphs/queue/queue.component.html index 056bc499..1b2baa70 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.html +++ b/client/src/app/pages/online/graphs/queue/queue.component.html @@ -84,8 +84,10 @@
- - + + + + diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index dd127c1f..7332b0f8 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -8,6 +8,8 @@ import { AnalyticsService } from '../../../../services/analytics.service'; import { FacesService } from '../../../../services/faces.service'; import { Router } from '@angular/router'; import { Account } from '../../../../models/Account'; +import { utils, writeFileXLSX } from 'xlsx'; +import { v4 as uuidv4 } from 'uuid'; @Component({ selector: 'ngx-queue', @@ -324,6 +326,11 @@ export class QueueComponent implements OnInit, OnDestroy { window.open(url, "_blank"); } + csvAlerts: Object = { + alerts: false, + count: false + } + async csv(algo){ let type; if(this.now_user.id_branch != '0000'){ @@ -338,13 +345,18 @@ export class QueueComponent implements OnInit, OnDestroy { ham: true, algo: algo } - ;(await this.serv.report(this.algo_id, this.camera, l)).subscribe( - res => { - var blob = new Blob([res], { type: res.type.toString() }); - var url = window.URL.createObjectURL(blob); - this.goToLink(url) + ;(await this.serv.report1(this.algo_id, this.camera, l)).subscribe( + async (res) => { + const ws = utils.json_to_sheet(res['data']); + const wb = utils.book_new(); + utils.book_append_sheet(wb, ws, "Data"); + await writeFileXLSX(wb, `${uuidv4()}.xlsx`); + this.csvAlerts[algo] = false }, - err => console.error(err) + err => { + console.error(err) + this.csvAlerts[algo] = false + } ) } diff --git a/client/src/app/pages/online/graphs/scc/scc.component.html b/client/src/app/pages/online/graphs/scc/scc.component.html index 658174ff..1c3e3bd0 100644 --- a/client/src/app/pages/online/graphs/scc/scc.component.html +++ b/client/src/app/pages/online/graphs/scc/scc.component.html @@ -24,8 +24,9 @@
- + + + diff --git a/client/src/app/pages/online/graphs/scc/scc.component.ts b/client/src/app/pages/online/graphs/scc/scc.component.ts index 8bb97fa7..59278fa3 100644 --- a/client/src/app/pages/online/graphs/scc/scc.component.ts +++ b/client/src/app/pages/online/graphs/scc/scc.component.ts @@ -8,6 +8,8 @@ import { AnalyticsService } from '../../../../services/analytics.service'; import { FacesService } from '../../../../services/faces.service'; import { Router } from '@angular/router'; import { Account } from '../../../../models/Account'; +import { utils, writeFileXLSX } from 'xlsx'; +import { v4 as uuidv4 } from 'uuid'; @Component({ selector: 'ngx-scc', @@ -255,7 +257,12 @@ export class SccComponent implements OnInit, OnDestroy { window.open(url, "_blank"); } - async csv(algo){ + csvAlerts: Object = { + alerts: false, + count: false + } + + async csv(algo){ let type; if(this.now_user.id_branch != '0000'){ type = 'cam_id'; @@ -269,13 +276,18 @@ export class SccComponent implements OnInit, OnDestroy { ham: true, algo: algo } - ;(await this.serv.report(this.algo_id, this.camera, l)).subscribe( - res => { - var blob = new Blob([res], { type: res.type.toString() }); - var url = window.URL.createObjectURL(blob); - this.goToLink(url) + ;(await this.serv.report1(this.algo_id, this.camera, l)).subscribe( + async (res) => { + const ws = utils.json_to_sheet(res['data']); + const wb = utils.book_new(); + utils.book_append_sheet(wb, ws, "Data"); + await writeFileXLSX(wb, `${uuidv4()}.xlsx`); + this.csvAlerts[algo] = false }, - err => console.error(err) + err => { + console.error(err) + this.csvAlerts[algo] = false + } ) } diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.ts b/client/src/app/pages/online/graphs/temperature/temperature.component.ts index 1f985644..fa0135ef 100644 --- a/client/src/app/pages/online/graphs/temperature/temperature.component.ts +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.ts @@ -19,7 +19,8 @@ import { FacesService } from "../../../../services/faces.service"; import { Account } from "../../../../models/Account"; import { NbDialogRef, NbDialogService } from "@nebular/theme"; import { FormBuilder, FormGroup } from "@angular/forms"; - +import { utils, writeFileXLSX } from 'xlsx'; +import { v4 as uuidv4 } from 'uuid'; @Component({ selector: 'ngx-temperature', @@ -308,11 +309,12 @@ export class TemperatureComponent implements OnInit, OnDestroy { typ: typ, algo: this.algoId } - ;(await this.serv.report(this.algoId, this.camera, l)).subscribe( + ;(await this.serv.report1(this.algoId, this.camera, l)).subscribe( async (res) => { - const blob = new Blob([res], { type: res.type.toString() }); - const url = await window.URL.createObjectURL(blob); - await window.open(url, "_blank"); + const ws = utils.json_to_sheet(res['data']); + const wb = utils.book_new(); + utils.book_append_sheet(wb, ws, "Data"); + await writeFileXLSX(wb, `${uuidv4()}.xlsx`); this.csvAlerts[typ] = false }, err => { diff --git a/client/src/app/services/analytics.service.ts b/client/src/app/services/analytics.service.ts index 1148a35e..4e19afef 100755 --- a/client/src/app/services/analytics.service.ts +++ b/client/src/app/services/analytics.service.ts @@ -216,6 +216,10 @@ export class AnalyticsService { }); } + report1(algo_id:number, cam_id:string, dates){ + return this.http.post(`${api}/report/${algo_id}/${cam_id}`, dates); + } + // async downloadLargeFile(url:string): Promise { // return await this.http.get(url, { // responseType: "arraybuffer", diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index 1a7d6d10..be944dd7 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -8824,7 +8824,7 @@ exports.breadAvail = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - // console.log(start, end,`SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) + console.log(start, end,`SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) await db .con() .query( @@ -9002,11 +9002,11 @@ exports.breadTemp = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - // console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`) + console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, range/1000/60/60) await db .con() .query( - `SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + `SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`, async function (err, result) { if (err) return res.status(500).json({ @@ -9055,7 +9055,7 @@ exports.breadTemp = async (req, res) => { await db .con() .query( - `SELECT * from temp_alerts WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + `SELECT * from temp_alerts WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`, function (err, result2) { if(result2 === undefined || result2.length === 0){ let a = { @@ -9181,7 +9181,7 @@ exports.scc = async (req, res) => { await db .con() .query( - `SELECT * from scc WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, + `SELECT * from scc WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`, async function (err, result) { if (err) return res.status(500).json({ diff --git a/server/app/controllers/report.controller.js b/server/app/controllers/report.controller.js index 7e5c5247..66fc694a 100755 --- a/server/app/controllers/report.controller.js +++ b/server/app/controllers/report.controller.js @@ -105,38 +105,20 @@ exports.report = async (req, res) => { if (req.params.algo_id === '70' && data.typ === 'data') { query = `SELECT time, camera_name, cam_id, zone, temperature from bread_temperature WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` } - const options = { - stream: res, // write to server response - useStyles: false, - useSharedStrings: false + if (req.params.algo_id === '71') { + query = `SELECT time, camera_name, cam_id, zone, receipt, trolley from scc WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` } - - const workbook = new Excel.stream.xlsx.WorkbookWriter(options) - const tableToSheet = function (name, done, id, query) { - const str = db.con().query(query).stream() - const sheet = workbook.addWorksheet(name) - - str.on('data', function (d) { - sheet.addRow(d).commit() // format object if required - }) - - str.on('end', function () { - sheet.commit() - done() - }) - - str.on('error', function (err) { - done(err) - }) - } - res.status(200) - res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls') - res.setHeader('Content-type', 'application/vnd.ms-excel') - - async.mapSeries(['cars'], tableToSheet, function (err) { - if (err) { - // log error - } - res.end() - }) + await db + .con() + .query( + query, + async function (_err, result) { + if (result === undefined || result.length === 0) { + return res.status(400).send({ success: false, message: 'No hay data.', type: data.typ }) + } + res.status(200).json({ + sucess: true, + data: result + }) + }) } From 9ec9b3987d5ab27b852fb305721f3573258a5c2c Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 19 Jan 2023 15:07:14 -0300 Subject: [PATCH 20/38] no data situation --- .../online/graphs/ham-cheese/ham-cheese.component.html | 6 ++++++ .../online/graphs/ham-cheese/ham-cheese.component.ts | 8 ++++++++ .../app/pages/online/graphs/queue/queue.component.html | 6 ++++++ .../src/app/pages/online/graphs/queue/queue.component.ts | 8 ++++++++ client/src/app/pages/online/graphs/scc/scc.component.html | 3 +++ client/src/app/pages/online/graphs/scc/scc.component.ts | 4 ++++ 6 files changed, 35 insertions(+) diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html index 58c6ff18..110b58a6 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html @@ -86,8 +86,14 @@ +
+ No hay data de alertas. +
+
+ No hay data. +
diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts index 8b1724b8..84906fed 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts @@ -357,6 +357,8 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { alerts: false, count: false } + showAlert: boolean = false; + showData: boolean = false; async csv(algo){ this.csvAlerts[algo] = true @@ -384,6 +386,12 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { err => { console.error(err) this.csvAlerts[algo] = false + if(algo === 'count'){ + this.showData = true; + } + if(algo === 'alerts'){ + this.showAlert = true; + } } ) } diff --git a/client/src/app/pages/online/graphs/queue/queue.component.html b/client/src/app/pages/online/graphs/queue/queue.component.html index 1b2baa70..6bc4a815 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.html +++ b/client/src/app/pages/online/graphs/queue/queue.component.html @@ -86,8 +86,14 @@ +
+ No hay data de alertas. +
+
+ No hay data. +
diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index 7332b0f8..0a30dc9e 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -330,6 +330,8 @@ export class QueueComponent implements OnInit, OnDestroy { alerts: false, count: false } + showAlert: boolean = false; + showData: boolean = false; async csv(algo){ let type; @@ -356,6 +358,12 @@ export class QueueComponent implements OnInit, OnDestroy { err => { console.error(err) this.csvAlerts[algo] = false + if(algo === 'count'){ + this.showData = true; + } + if(algo === 'alerts'){ + this.showAlert = true; + } } ) } diff --git a/client/src/app/pages/online/graphs/scc/scc.component.html b/client/src/app/pages/online/graphs/scc/scc.component.html index 1c3e3bd0..d82c2d52 100644 --- a/client/src/app/pages/online/graphs/scc/scc.component.html +++ b/client/src/app/pages/online/graphs/scc/scc.component.html @@ -26,6 +26,9 @@ +
+ No hay data. +
diff --git a/client/src/app/pages/online/graphs/scc/scc.component.ts b/client/src/app/pages/online/graphs/scc/scc.component.ts index 59278fa3..75736674 100644 --- a/client/src/app/pages/online/graphs/scc/scc.component.ts +++ b/client/src/app/pages/online/graphs/scc/scc.component.ts @@ -261,6 +261,7 @@ export class SccComponent implements OnInit, OnDestroy { alerts: false, count: false } + showData: boolean = false; async csv(algo){ let type; @@ -287,6 +288,9 @@ export class SccComponent implements OnInit, OnDestroy { err => { console.error(err) this.csvAlerts[algo] = false + if(algo === 'alerts'){ + this.showData = true; + } } ) } From d584da712d48ce914aed3c9cd56011a2d3160dc8 Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 30 Jan 2023 07:58:52 -0300 Subject: [PATCH 21/38] added proxy to docker --- dockerDeployment/docker-compose.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index b8a665db..9e3ccb2d 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -50,4 +50,16 @@ services: volumes: - ../configDocker.env:/usr/src/config.env - ./resources:/usr/src/app/resources + + multi-tenant-proxy: + network_mode: host + # ports: + # - "3301:3301" + # networks: + # - dev + image: graymatics1/multi-tenant-proxy:1.3.1 + restart: always + volumes: + - ../configDocker.env:/usr/src/config.env + - ./resources:/usr/src/app/resources \ No newline at end of file From 50f53f4cb26fb6fd0896241b17be456ba9d2f882 Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 30 Jan 2023 12:25:36 -0300 Subject: [PATCH 22/38] console logs removed --- .../app/pages/online/graphs/ham-cheese/ham-cheese.component.ts | 1 + server/app/controllers/analytics.controller.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts index 84906fed..afc65d03 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts @@ -119,6 +119,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { this.serv.queue(this.camera,l).subscribe( res=>{ this.queue = res['data'] + // console.log(this.queue) let secondsString if(this.queue.avg >= 60){ let minutes = Math.floor(this.queue.avg / 60); diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index be944dd7..261eeb14 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -1798,7 +1798,7 @@ exports.queue = async (req, res) => { // } else { v['wait'] = (v.end_time - v.start_time) / 1000 v['wait'] = display(v['wait']) - // console.log(v.end_time, v.start_time, (v.end_time - v.start_time)) + // console.log(v.end_time, v.start_time, (v.end_time - v.start_time) / 1000) times.push({ time: (v.end_time - v.start_time) / 1000, queue: v.qid From 26e35686da23c8363ca76eb35ef48cc54eb2d765 Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 6 Feb 2023 16:42:12 -0300 Subject: [PATCH 23/38] fixed issue with availability --- server/app/controllers/analytics.controller.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index 261eeb14..aa8b3eab 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -8824,7 +8824,7 @@ exports.breadAvail = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - console.log(start, end,`SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) + // console.log(start, end,`SELECT * from bread_availability WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) await db .con() .query( @@ -8854,6 +8854,7 @@ exports.breadAvail = async (req, res) => { sum.push(0) } result.forEach(function (v) { + // console.log(v.availability) if(v.zone == 'right'){ v.zone = 1 }else if(v.zone == 'left'){ @@ -8863,8 +8864,11 @@ exports.breadAvail = async (req, res) => { av[v.zone].push(v.availability) sum[v.zone] += parseInt(v.availability) }else{ + av[v.zone].push(v.availability) + sum[v.zone] += parseInt(v.availability) cache[v.zone] += range labelsDAll[v.zone].push(cache[v.zone]) + // console.log(sum[v.zone],av[v.zone].length, v.zone) let availability = sum[v.zone]/av[v.zone].length availability = Math.round(availability * 100) / 100 dwellAll[v.zone].push(availability) @@ -9002,7 +9006,7 @@ exports.breadTemp = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, range/1000/60/60) + // console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, range/1000/60/60) await db .con() .query( From 6a653eabd57313af88e5b705dbdacec82a2f7600 Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 6 Feb 2023 16:42:26 -0300 Subject: [PATCH 24/38] changed queues from H&C to strings --- .../online/graphs/ham-cheese/ham-cheese.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts index afc65d03..df419801 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts @@ -176,14 +176,14 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { m.inLine = 'Exit' } } - if(this.queue.min === '1'){ + if(this.queue.min === 1){ this.queue.min = 'Jamon & Queso' - }else if(this.queue.min === '2'){ + }else if(this.queue.min === 2){ this.queue.min = 'Carnes' } - if(this.queue.max === '1'){ + if(this.queue.max === 1){ this.queue.max = 'Jamon & Queso' - }else if(this.queue.max === '2'){ + }else if(this.queue.max === 2){ this.queue.max = 'Carnes' } for(const qu in this.queue.countAll){ From b1db9b7c45093624dbea9f73ef8e96efb7fdab56 Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 6 Feb 2023 16:43:37 -0300 Subject: [PATCH 25/38] space remov --- client/src/app/pages/online/graphs/queue/queue.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index 0a30dc9e..7ff20412 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -66,7 +66,6 @@ export class QueueComponent implements OnInit, OnDestroy { this.videoplayer.nativeElement.src = vid this.videoplayer.nativeElement.load(); this.videoplayer.nativeElement.play(); - } timezone: any; video:boolean = false; From b5c23d83ece9ba6edffbe33b4a52394eeb3c534b Mon Sep 17 00:00:00 2001 From: ridweng Date: Mon, 6 Feb 2023 17:56:53 -0300 Subject: [PATCH 26/38] queue changed to queue number --- .../online/graphs/queue/queue.component.html | 2 +- .../online/graphs/queue/queue.component.ts | 25 +++++++++++++++---- .../app/controllers/analytics.controller.js | 7 +++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/client/src/app/pages/online/graphs/queue/queue.component.html b/client/src/app/pages/online/graphs/queue/queue.component.html index 6bc4a815..cf972e8b 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.html +++ b/client/src/app/pages/online/graphs/queue/queue.component.html @@ -19,7 +19,7 @@

Tiempo de espera medio - {{queue == undefined ? '0' : queue.avg}} min

- Fila {{i + 1}} - {{avg}} min

+ Fila {{labelsQueues[i]}} - {{avg}} min

diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index 7ff20412..bfc10728 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -26,6 +26,7 @@ export class QueueComponent implements OnInit, OnDestroy { rtspIn: any; queues: Array = []; avgss: Array = []; + labelsQueues: Array = [] themeSubscription: any; dataL: any; dataM: any; @@ -116,6 +117,8 @@ export class QueueComponent implements OnInit, OnDestroy { this.serv.queue(this.camera,l).subscribe( res=>{ this.queue = res['data'] + console.log(this.queue) + this.labelsQueues = this.queue.cam_name.split('-')[1].split('/') let secondsString if(this.queue.avg >= 60){ let minutes = Math.floor(this.queue.avg / 60); @@ -135,6 +138,7 @@ export class QueueComponent implements OnInit, OnDestroy { this.queue.avg = `0:${secondsString}` } for(let s of this.queue.avgs){ + console.log(s) let secondsStr if(s >= 60){ let minutes = Math.floor(s / 60); @@ -173,8 +177,18 @@ export class QueueComponent implements OnInit, OnDestroy { m.inLine = 'Exit' } } + if(this.queue.min === 1){ + this.queue.min = this.labelsQueues[0] + }else if(this.queue.min === 2){ + this.queue.min = this.labelsQueues[1] + } + if(this.queue.max === 1){ + this.queue.max = this.labelsQueues[0] + }else if(this.queue.max === 2){ + this.queue.max = this.labelsQueues[1] + } for(const qu in this.queue.countAll){ - this.queues.push({zone: qu, amount: this.queue.countAll[qu]}) + this.queues.push({zone: this.labelsQueues[parseInt(qu) - 1], amount: this.queue.countAll[qu]}) } const source = this.queue.rawAlerts.filter( alert => alert.severity === 2 ) // this.source = this.queue.raw.slice().sort((a, b) => +new Date(b.start_time) - +new Date(a.start_time)) @@ -204,8 +218,9 @@ export class QueueComponent implements OnInit, OnDestroy { const chartjs: any = config.variables.chartjs; const datasetsLow = [], datasetsMed = [], datasetsHigh = [], datasetsPall = [] for(let i = 0; i < this.queue.dataAlertsLow.length; i++){ + datasetsLow.push({ - label: `Fila: ${i + 1}`, + label: `Fila: ${this.labelsQueues[i]}`, data: Object.values(this.queue.dataAlertsLow[i]), borderColor: cols[i], backgroundColor: cols[i], @@ -214,7 +229,7 @@ export class QueueComponent implements OnInit, OnDestroy { pointHoverRadius: 5, }) datasetsMed.push({ - label: `Fila: ${i + 1}`, + label: `Fila: ${this.labelsQueues[i]}`, data: Object.values(this.queue.dataAlertsMed[i]), borderColor: cols[i], backgroundColor: cols[i], @@ -223,7 +238,7 @@ export class QueueComponent implements OnInit, OnDestroy { pointHoverRadius: 5, }) datasetsHigh.push({ - label: `Fila: ${i + 1}`, + label: `Fila: ${this.labelsQueues[i]}`, data: Object.values(this.queue.dataAlertsHigh[i]), borderColor: cols[i], backgroundColor: cols[i], @@ -234,7 +249,7 @@ export class QueueComponent implements OnInit, OnDestroy { } for(let i = 0; i < this.queue.dataPeopleAll.length; i++){ datasetsPall.push({ - label: `Fila: ${i + 1}`, + label: `Fila: ${this.labelsQueues[i]}`, data: Object.values(this.queue.dataPeopleAll[i]), borderColor: cols[i], backgroundColor: cols[i], diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index aa8b3eab..6626329c 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -1781,6 +1781,7 @@ exports.queue = async (req, res) => { let max = -1 let minQ, maxQ let times = [] + let cam_name = '' // let cacheTime = new Date(start).getTime() // let cacheTime = 0 // const num = parseInt(data.timezone.slice(1,3)) * 3600 * 1000 @@ -1861,6 +1862,9 @@ exports.queue = async (req, res) => { labelPeople.push(v.start_time) cou++ } + if(cam_name === ''){ + cam_name = v.camera_name + } } if(cou === countIn){ while ( @@ -2016,7 +2020,8 @@ exports.queue = async (req, res) => { min: minQ, max: maxQ, rel: rel, - dataPeopleAll: dataPeopleAll + dataPeopleAll: dataPeopleAll, + cam_name: cam_name } res.status(200).json({ success: true, From 7e5522ba6377d91a59faebafbc5d44f169de988a Mon Sep 17 00:00:00 2001 From: ridweng Date: Tue, 7 Feb 2023 11:20:53 -0300 Subject: [PATCH 27/38] docker update --- dockerDeployment/docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 9e3ccb2d..43b52d11 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,14 +11,14 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.3.49 + image: graymatics1/multi-tenant-server:2.4.1 restart: always volumes: - ./resources:/usr/src/app/resources - ../configDocker.env:/usr/src/config.env multi-tenant-ui: - image: graymatics1/multi-tenant-ui:2.3.42 + image: graymatics1/multi-tenant-ui:2.4.1 # networks: # - dev restart: always @@ -57,7 +57,7 @@ services: # - "3301:3301" # networks: # - dev - image: graymatics1/multi-tenant-proxy:1.3.1 + image: graymatics1/multi-tenant-proxy:1.4.2 restart: always volumes: - ../configDocker.env:/usr/src/config.env From 4a991031daa591be3e09a09d7c4ec75381dc7a36 Mon Sep 17 00:00:00 2001 From: ridweng Date: Tue, 7 Feb 2023 11:21:09 -0300 Subject: [PATCH 28/38] proxy added in rep --- proxy/.dockerignore | 8 + proxy/Dockerfile | 7 + proxy/LICENSE | 21 + proxy/README.md | 13 + proxy/controllers/proxy.controller.js | 130 + proxy/helpers/dbmysql.js | 40 + proxy/index.js | 72 + proxy/middleware/index.js | 7 + proxy/middleware/verify.js | 30 + proxy/middleware/verifyInsertion.js | 25 + proxy/package-lock.json | 6935 +++++++++++++++++++++++++ proxy/package.json | 29 + proxy/routes/proxy.route.js | 39 + 13 files changed, 7356 insertions(+) create mode 100755 proxy/.dockerignore create mode 100755 proxy/Dockerfile create mode 100755 proxy/LICENSE create mode 100755 proxy/README.md create mode 100755 proxy/controllers/proxy.controller.js create mode 100755 proxy/helpers/dbmysql.js create mode 100755 proxy/index.js create mode 100755 proxy/middleware/index.js create mode 100644 proxy/middleware/verify.js create mode 100644 proxy/middleware/verifyInsertion.js create mode 100755 proxy/package-lock.json create mode 100755 proxy/package.json create mode 100755 proxy/routes/proxy.route.js diff --git a/proxy/.dockerignore b/proxy/.dockerignore new file mode 100755 index 00000000..edfd9dda --- /dev/null +++ b/proxy/.dockerignore @@ -0,0 +1,8 @@ +config.env +node_modules +.gitignore +access.log +.dockerignore +Dockerfile +resources/** +test \ No newline at end of file diff --git a/proxy/Dockerfile b/proxy/Dockerfile new file mode 100755 index 00000000..06c643d5 --- /dev/null +++ b/proxy/Dockerfile @@ -0,0 +1,7 @@ +FROM node:alpine +WORKDIR /usr/src/app +RUN apk add --no-cache tzdata +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +CMD ["npm", "start"] \ No newline at end of file diff --git a/proxy/LICENSE b/proxy/LICENSE new file mode 100755 index 00000000..5f0c6bf1 --- /dev/null +++ b/proxy/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 AlexIgnacioKaiser + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/proxy/README.md b/proxy/README.md new file mode 100755 index 00000000..ba366742 --- /dev/null +++ b/proxy/README.md @@ -0,0 +1,13 @@ +# Websocket Server +Server to communicate via websocket + +Installation: +npm install + +Run: +npm start + +Requires: +config.env + +Default port 3301 diff --git a/proxy/controllers/proxy.controller.js b/proxy/controllers/proxy.controller.js new file mode 100755 index 00000000..a963b5a7 --- /dev/null +++ b/proxy/controllers/proxy.controller.js @@ -0,0 +1,130 @@ +const db = require('../helpers/dbmysql') + +exports.retrieve = async (req, res) => { + const data = req.body + await db + .con() + .query( + `SELECT * from ${data.table} LIMIT 1000`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const a = { + results: result, + } + res.status(200).json({ + success: true, + data: a + }) + } + ) +} + +exports.update = async (req, res) => { + const data = req.body + await db + .con() + .query( + `UPDATE ${data.table} SET ${data.updtField} = '${data.updtValue}' WHERE (${data.key} = '${data.value}')`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const a = { + results: result, + } + res.status(200).json({ + success: true, + data: a + }) + } + ) +} + +exports.updateMultiple = async (req, res) => { + const data = req.body + data.updates = JSON.parse(data.updates) + let string = '' + for(const updt in data.updates){ + string = `${string}${updt} = '${data.updates[updt]}', ` + } + string = string.slice(0, -2); + await db + .con() + .query( + `UPDATE ${data.table} SET ${string} WHERE (${data.key} = '${data.value}')`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const a = { + results: result, + } + res.status(200).json({ + success: true, + data: a + }) + } + ) +} + +exports.insert = async (req, res) => { + const data = req.body + await db + .con() + .query( + `INSERT INTO ${data.table} VALUES (${data.values});`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const a = { + results: result, + } + res.status(200).json({ + success: true, + data: a + }) + } + ) +} + +exports.create = async (req, res) => { + const data = req.body + data.values = '' + + data.columns.map(item => { + data.values += `${item.key} ${item.type} ${item.default}, ` + }) + + data.values += `PRIMARY KEY (id)` + + await db + .con() + .query( + `CREATE TABLE if not exists ${data.table} (${data.values});`, + function (err, result) { + if (err) + return res.status(500).json({ + success: false, + message: err + }) + const a = { + results: result, + } + res.status(200).json({ + success: true, + data: a + }) + } + ) +} \ No newline at end of file diff --git a/proxy/helpers/dbmysql.js b/proxy/helpers/dbmysql.js new file mode 100755 index 00000000..089d1d25 --- /dev/null +++ b/proxy/helpers/dbmysql.js @@ -0,0 +1,40 @@ +const mysql = require('mysql') +require('dotenv').config({ path: '../../../config.env' }) + +const connection = { + con: function () { + if (!this.pool) { + this.pool = mysql.createPool({ + host: process.env.HOST, + user: process.env.USERM, + password: process.env.PASSWORD, + database: process.env.DB, + connectionLimit: 40 + }) + + this.pool.on('acquire', function (connection) { + console.log( + 'Connection %d acquired. No of connnections: %d', + connection.threadId, + this._acquiringConnections.length + 1 + ) + }) + + this.pool.on('connection', function (connection) { + console.log( + 'New connection created. No of connections: %d', + this._acquiringConnections.length + 1 + ) + }) + this.pool.on('enqueue', function () { + console.log('Waiting for available connection slot') + }) + this.pool.on('release', function (connection) { + console.log('Connection %d released', connection.threadId) + }) + } + return this.pool + } +} + +module.exports = connection diff --git a/proxy/index.js b/proxy/index.js new file mode 100755 index 00000000..28d4977e --- /dev/null +++ b/proxy/index.js @@ -0,0 +1,72 @@ +const express = require('express') +const compression = require('compression') +const cors = require('cors') +const bodyParser = require('body-parser') +require('dotenv').config({ path: '../config.env' }) +const morgan = require('morgan') +const fs = require('fs') + +//init Express +const app = express(); +//init Express Router +express.Router(); +const port = process.env.PORTPR || 3302; + +app.use(compression()) +app.use(bodyParser.json({ limit: '10mb', extended: true })) +// parse requests of content-type - application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ limit: '10mb', extended: true })) + +if (process.env.NODE_ENV === 'production') { + const corsOptions = { + origin: [ + `http://${process.env.my_ip}:4200`, + `${process.env.app_url}`, + 'http://localhost:4200', + `http://${process.env.my_ip}:3200` + ] + } + app.use(cors(corsOptions)) + console.log(`Running on Production on http://${process.env.my_ip}:${process.env.PORTPR}`) +} else { + const corsOptions = { + origin: [ + `http://${process.env.my_ip}:4200`, + `${process.env.app_url}`, + 'http://localhost:4200', + `http://${process.env.my_ip}:3200` + ] + } + app.use(cors(corsOptions)) + console.log(`Running Dev version on port ${process.env.PORTPR}`) +} + +app.use( + morgan( + 'Method: :method:url // Url: :remote-addr // Status::status // User-agent: :user-agent // Date: :date[web]' + ) +) +app.use( + morgan( + 'Date: :date[web] // Url: :remote-addr // Method: :method:url // Status::status // User-agent: :user-agent', + { + stream: fs.createWriteStream('./resources/logs/prAccess.log', { flags: 'a' }) + } + ) +) + +function customHeaders (req, res, next) { + app.disable('X-Powered-By') + res.setHeader('X-Powered-By', 'Graymatics-server-proxy') + res.setHeader('Content-Security-Policy', "default-src 'self'") + res.setHeader('X-Frame-Options', 'SAMEORIGIN') + next() +} + +app.use(customHeaders) + +const v = 'v1' + +require('./routes/proxy.route')(app, v) + +app.listen(port) diff --git a/proxy/middleware/index.js b/proxy/middleware/index.js new file mode 100755 index 00000000..e1d98900 --- /dev/null +++ b/proxy/middleware/index.js @@ -0,0 +1,7 @@ +const verifyIn = require('./verifyInsertion') +const verify = require('./verify') + +module.exports = { + verifyIn, + verify +} diff --git a/proxy/middleware/verify.js b/proxy/middleware/verify.js new file mode 100644 index 00000000..051de6ad --- /dev/null +++ b/proxy/middleware/verify.js @@ -0,0 +1,30 @@ +const CryptoJS = require('crypto-js') +require('dotenv').config({ path: '../../../config.env' }) + +const check = (req, res, next) => { + const token = req.headers['proxy'] + if (!token) { + return res.status(403).send({ + message: 'No password provided!' + }) + } + + const key = CryptoJS.enc.Utf8.parse(process.env.SECRETAPIPROXY); + const iv = CryptoJS.enc.Utf8.parse(process.env.ENCRYPTIONIV); + const data = CryptoJS.AES.decrypt(token, key, { iv: iv }); + const comparison = data.toString(CryptoJS.enc.Utf8); + + if(comparison !== process.env.PASSAPIPROXY){ + return res.status(401).send({ + message: 'Unauthorized!' + }) + }else if(comparison === process.env.PASSAPIPROXY){ + next() + } +} + +const verify = { + check: check + } + +module.exports = verify \ No newline at end of file diff --git a/proxy/middleware/verifyInsertion.js b/proxy/middleware/verifyInsertion.js new file mode 100644 index 00000000..6387f99d --- /dev/null +++ b/proxy/middleware/verifyInsertion.js @@ -0,0 +1,25 @@ + const values = (req, res, next) => { + const data = req.body + + let values = '' + + + for(let i = 0; i < data.values.length; i++){ + if(i === data.values.length - 1){ + values += `"${data.values[i]}"` + }else{ + values += `"${data.values[i]}", ` + } + // if(key.includes('bye')) + } + + req.body.values = values + + next() + } + +const verifyInsertion = { + values: values +} + +module.exports = verifyInsertion \ No newline at end of file diff --git a/proxy/package-lock.json b/proxy/package-lock.json new file mode 100755 index 00000000..e9f6f2d1 --- /dev/null +++ b/proxy/package-lock.json @@ -0,0 +1,6935 @@ +{ + "name": "proxy-server", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "proxy-server", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "axios": "^0.26.1", + "body-parser": "^1.20.0", + "compression": "^1.7.4", + "cors": "^2.8.5", + "crypto-js": "^4.1.1", + "dotenv": "^16.0.0", + "express": "^4.17.3", + "morgan": "^1.10.0", + "mysql": "^2.18.1", + "uuid": "^8.3.2", + "ws": "^8.8.0" + }, + "devDependencies": { + "nodemon": "^1.3.3", + "util": "^0.12.4" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", + "dev": true, + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/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, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/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==" + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "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" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/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==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dev": true, + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "dev": true, + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-abstract": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.3.tgz", + "integrity": "sha512-4axXLNovnMYf0+csS5rVnS5hLmV1ek+ecx9MuCjByL1E5Nn54avf6CHQxIjgQIHBnfX9AMxTRIy0q+Yu5J/fXA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "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.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "dev": true, + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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 + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", + "dev": true, + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/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==" + }, + "node_modules/nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^2.1.8", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "dev": true, + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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=" + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "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" + } + }, + "node_modules/readable-stream/node_modules/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==" + }, + "node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "dev": true, + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "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.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/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==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "dev": true, + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dev": true, + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "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": "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": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "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": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "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 + }, + "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 + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "requires": { + "follow-redirects": "^1.14.8" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "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==" + } + } + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "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": "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" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "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" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "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" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "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" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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 + } + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "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==", + "dev": true, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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 + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "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" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "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==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dev": true, + "requires": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "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.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "dev": 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" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "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" + } + }, + "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=" + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==" + }, + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "es-abstract": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.3.tgz", + "integrity": "sha512-4axXLNovnMYf0+csS5rVnS5hLmV1ek+ecx9MuCjByL1E5Nn54avf6CHQxIjgQIHBnfX9AMxTRIy0q+Yu5J/fXA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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 + } + } + } + } + }, + "express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "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.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + } + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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" + } + }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "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=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "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-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "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==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "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": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "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==", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "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" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.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.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.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" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.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" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "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-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "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 + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "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" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.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=" + }, + "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=" + }, + "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": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "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" + } + } + } + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "dependencies": { + "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==" + } + } + }, + "nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "nodemon": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "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 + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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 + } + } + } + } + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, + "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": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "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" + } + }, + "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==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "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=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "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": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "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==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "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==", + "dev": true + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + }, + "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==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + }, + "dependencies": { + "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==" + } + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + } + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "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 + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "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==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "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.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "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" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "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": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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 + } + } + } + } + }, + "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": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + } + } + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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 + } + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "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==" + } + } + }, + "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" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "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" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "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": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "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-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "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": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "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": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "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": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "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 + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "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-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "requires": {} + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } +} diff --git a/proxy/package.json b/proxy/package.json new file mode 100755 index 00000000..e5edba6a --- /dev/null +++ b/proxy/package.json @@ -0,0 +1,29 @@ +{ + "scripts": { + "start": "node index.js", + "dev": "nodemon index.js" + }, + "dependencies": { + "axios": "^0.26.1", + "body-parser": "^1.20.0", + "compression": "^1.7.4", + "cors": "^2.8.5", + "crypto-js": "^4.1.1", + "dotenv": "^16.0.0", + "express": "^4.17.3", + "morgan": "^1.10.0", + "mysql": "^2.18.1", + "uuid": "^8.3.2", + "ws": "^8.8.0" + }, + "name": "proxy-server", + "version": "0.0.1", + "description": "Server to connect via proxy with database.", + "main": "index.js", + "author": "Alex Ignacio Kaiser", + "license": "MIT", + "devDependencies": { + "nodemon": "^1.3.3", + "util": "^0.12.4" + } +} diff --git a/proxy/routes/proxy.route.js b/proxy/routes/proxy.route.js new file mode 100755 index 00000000..c641f185 --- /dev/null +++ b/proxy/routes/proxy.route.js @@ -0,0 +1,39 @@ +const { verifyIn, verify } = require('../middleware') +const controller = require('../controllers/proxy.controller') + +module.exports = function (app, v) { + app.use(function (req, res, next) { + res.header('Access-Control-Allow-Headers', 'x-access-token, Origin, Content-Type, Accept') + next() + }) + + app.post( + `/api/${v}/r`, + [verify.check], + controller.retrieve + ) + + app.put( + `/api/${v}/u`, + [verify.check], + controller.update + ) + + app.put( + `/api/${v}/um`, + [verify.check], + controller.updateMultiple + ) + + app.post( + `/api/${v}/i`, + [verifyIn.values,verify.check], + controller.insert + ) + + app.post( + `/api/${v}/c`, + [verify.check], + controller.create + ) +} From 7c0ce9a585f551257d0a8c17d1e314a23ee90b11 Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 8 Feb 2023 08:31:10 -0300 Subject: [PATCH 29/38] docker updatrd --- dockerDeployment/docker-compose.yml | 2 +- server/app/controllers/analytics.controller.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 43b52d11..8b1f9d3e 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,7 +11,7 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.4.1 + image: graymatics1/multi-tenant-server:2.4.2 restart: always volumes: - ./resources:/usr/src/app/resources diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index 6626329c..ec8b818a 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -8937,7 +8937,6 @@ exports.breadAvail = async (req, res) => { v.movie = `${d}_${v.id}_video.mp4` v.vid = `${process.env.app_url}/api/pictures/${decoded.id_account}/${decoded.id_branch}/avail_alerts/${req.params.id}/${v.movie}` }) - console.log(result2.length) let a = { dwell: dwell, labelsD: labelsD, @@ -9011,7 +9010,7 @@ exports.breadTemp = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - // console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, range/1000/60/60) + console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, range/1000/60/60) await db .con() .query( @@ -9046,6 +9045,8 @@ exports.breadTemp = async (req, res) => { av[v.zone].push(v.temperature) sum[v.zone] += parseInt(v.temperature) }else{ + av[v.zone].push(v.temperature) + sum[v.zone] += parseInt(v.temperature) cache[v.zone] += range labelsDAll[v.zone].push(cache[v.zone]) let temperature = sum[v.zone]/av[v.zone].length From 62103cffdfdf6e2356813c825542722ad6079d11 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 9 Feb 2023 11:10:45 -0300 Subject: [PATCH 30/38] augmented pool of proxy --- proxy/helpers/dbmysql.js | 2 +- server/app/controllers/analytics.controller.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/proxy/helpers/dbmysql.js b/proxy/helpers/dbmysql.js index 089d1d25..da0ee09d 100755 --- a/proxy/helpers/dbmysql.js +++ b/proxy/helpers/dbmysql.js @@ -9,7 +9,7 @@ const connection = { user: process.env.USERM, password: process.env.PASSWORD, database: process.env.DB, - connectionLimit: 40 + connectionLimit: 1000 }) this.pool.on('acquire', function (connection) { diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index ec8b818a..def6ad46 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -9010,7 +9010,7 @@ exports.breadTemp = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`, range/1000/60/60) + console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`) await db .con() .query( From 83c2dd9894cb95e80fa36d5228bd7dbb60f32790 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 9 Feb 2023 13:02:12 -0300 Subject: [PATCH 31/38] changed graphs --- .../online/graphs/availability/availability.component.ts | 4 +++- .../pages/online/graphs/ham-cheese/ham-cheese.component.html | 4 ++-- .../pages/online/graphs/ham-cheese/ham-cheese.component.ts | 3 +++ .../src/app/pages/online/graphs/queue/queue.component.html | 4 ++-- client/src/app/pages/online/graphs/queue/queue.component.ts | 3 +++ client/src/app/pages/online/graphs/scc/scc.component.ts | 5 ++++- .../pages/online/graphs/temperature/temperature.component.ts | 2 ++ 7 files changed, 19 insertions(+), 6 deletions(-) diff --git a/client/src/app/pages/online/graphs/availability/availability.component.ts b/client/src/app/pages/online/graphs/availability/availability.component.ts index cf31d015..b535aa38 100644 --- a/client/src/app/pages/online/graphs/availability/availability.component.ts +++ b/client/src/app/pages/online/graphs/availability/availability.component.ts @@ -163,6 +163,7 @@ export class AvailabilityComponent implements OnInit, OnDestroy { }; this.optionsL = { + spanGaps: true, responsive: true, maintainAspectRatio: false, legend: { @@ -207,7 +208,8 @@ export class AvailabilityComponent implements OnInit, OnDestroy { ticks: { fontColor: chartjs.textColor, min: 0, - max:100 + max:100, + beginAtZero: true, }, }, ], diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html index 110b58a6..5bc07223 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html @@ -17,9 +17,9 @@
-

Tiempo de espera medio - {{queue == undefined ? '0' : queue.avg}} min

+

Tiempo de espera medio - {{queue == undefined ? '0' : queue.avg}}

- Fila {{i + 1 === 1 ? 'Jamon & Queso' : 'Carne'}} - {{avg}} min

+ Fila {{i + 1 === 1 ? 'Jamon & Queso' : 'Carne'}} - {{avg}}

diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts index df419801..4b5f4ed4 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.ts @@ -290,6 +290,7 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { }; this.options = { + spanGaps: true, responsive: true, maintainAspectRatio: false, legend: { @@ -332,6 +333,8 @@ export class HamCheeseComponent implements OnInit ,OnDestroy { }, ticks: { fontColor: chartjs.textColor, + beginAtZero: true, + stepSize: 1 }, }, ], diff --git a/client/src/app/pages/online/graphs/queue/queue.component.html b/client/src/app/pages/online/graphs/queue/queue.component.html index cf972e8b..002f3749 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.html +++ b/client/src/app/pages/online/graphs/queue/queue.component.html @@ -17,9 +17,9 @@
-

Tiempo de espera medio - {{queue == undefined ? '0' : queue.avg}} min

+

Tiempo de espera medio - {{queue == undefined ? '0' : queue.avg}}

- Fila {{labelsQueues[i]}} - {{avg}} min

+ Fila {{labelsQueues[i]}} - {{avg}}

diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index bfc10728..d17026fe 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -276,6 +276,7 @@ export class QueueComponent implements OnInit, OnDestroy { datasets: datasetsPall }; this.options = { + spanGaps: true, responsive: true, maintainAspectRatio: false, legend: { @@ -318,6 +319,8 @@ export class QueueComponent implements OnInit, OnDestroy { }, ticks: { fontColor: chartjs.textColor, + beginAtZero: true, + stepSize: 1 }, }, ], diff --git a/client/src/app/pages/online/graphs/scc/scc.component.ts b/client/src/app/pages/online/graphs/scc/scc.component.ts index 75736674..a2b11670 100644 --- a/client/src/app/pages/online/graphs/scc/scc.component.ts +++ b/client/src/app/pages/online/graphs/scc/scc.component.ts @@ -193,6 +193,7 @@ export class SccComponent implements OnInit, OnDestroy { // datasets: datasetsPall // }; this.options = { + spanGaps: true, responsive: true, maintainAspectRatio: false, legend: { @@ -235,6 +236,8 @@ export class SccComponent implements OnInit, OnDestroy { }, ticks: { fontColor: chartjs.textColor, + beginAtZero: true, + stepSize: 1 }, }, ], @@ -308,7 +311,7 @@ export class SccComponent implements OnInit, OnDestroy { display : true, perPage:5 }, - noDataMessage: "No data found", + noDataMessage: "No hay data", columns: { picture: { title: 'Imagen', diff --git a/client/src/app/pages/online/graphs/temperature/temperature.component.ts b/client/src/app/pages/online/graphs/temperature/temperature.component.ts index fa0135ef..55faff3f 100644 --- a/client/src/app/pages/online/graphs/temperature/temperature.component.ts +++ b/client/src/app/pages/online/graphs/temperature/temperature.component.ts @@ -163,6 +163,7 @@ export class TemperatureComponent implements OnInit, OnDestroy { }; this.optionsL = { + spanGaps: true, responsive: true, maintainAspectRatio: false, legend: { @@ -205,6 +206,7 @@ export class TemperatureComponent implements OnInit, OnDestroy { }, ticks: { fontColor: chartjs.textColor, + beginAtZero: true, }, }, ], From 64ff1f275479365e15ccf619c523cbb60efe3e59 Mon Sep 17 00:00:00 2001 From: ridweng Date: Fri, 10 Feb 2023 10:54:13 -0300 Subject: [PATCH 32/38] console.log out --- .../app/pages/online/graphs/queue/queue.component.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/src/app/pages/online/graphs/queue/queue.component.ts b/client/src/app/pages/online/graphs/queue/queue.component.ts index d17026fe..36da74ee 100755 --- a/client/src/app/pages/online/graphs/queue/queue.component.ts +++ b/client/src/app/pages/online/graphs/queue/queue.component.ts @@ -117,7 +117,6 @@ export class QueueComponent implements OnInit, OnDestroy { this.serv.queue(this.camera,l).subscribe( res=>{ this.queue = res['data'] - console.log(this.queue) this.labelsQueues = this.queue.cam_name.split('-')[1].split('/') let secondsString if(this.queue.avg >= 60){ @@ -424,7 +423,14 @@ export class QueueComponent implements OnInit, OnDestroy { zone: { title: 'Fila', type: 'string', - filter: false + filter: false, + valuePrepareFunction: (zone) => { + if(zone == 1){ + return this.labelsQueues[0] + }else if(zone == 2){ + return this.labelsQueues[1] + } + } } }, }; From c89be07166e18aa04b30e07fad1fc1572410496b Mon Sep 17 00:00:00 2001 From: ridweng Date: Fri, 24 Feb 2023 10:55:34 -0300 Subject: [PATCH 33/38] report adapted --- server/app/controllers/report.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app/controllers/report.controller.js b/server/app/controllers/report.controller.js index 66fc694a..422e657a 100755 --- a/server/app/controllers/report.controller.js +++ b/server/app/controllers/report.controller.js @@ -83,7 +83,7 @@ exports.report = async (req, res) => { start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 start = JSON.stringify(new Date(start)) start = start.substring(1, start.length - 1) - end = new Date(data.end).getTime() - 1 * 60 * 60 * 1000 + end = new Date(data.end).getTime() - 1.5 * 60 * 60 * 1000 end = JSON.stringify(new Date(end)) end = end.substring(1, end.length - 1) // } From d9b238e700a1a5f3e8e8fff32532656d087181ca Mon Sep 17 00:00:00 2001 From: ridweng Date: Tue, 28 Mar 2023 14:20:23 +0100 Subject: [PATCH 34/38] removed queue 1 from db --- server/app/controllers/report.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app/controllers/report.controller.js b/server/app/controllers/report.controller.js index 422e657a..8e36a75a 100755 --- a/server/app/controllers/report.controller.js +++ b/server/app/controllers/report.controller.js @@ -91,7 +91,7 @@ exports.report = async (req, res) => { let query = `SELECT id, time, camera_name, cam_id, zone, severity from queue_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}'${extra} order by time asc;` if (data.algo === 'count') { - query = `SELECT id, start_time, end_time, camera_name, cam_id, qid, track_id, queuing from queue_mgt WHERE ${data.type} = '${req.params.cam_id}' and start_time >= '${start}' and start_time <= '${end}' order by start_time asc;` + query = `SELECT id, start_time, end_time, camera_name, cam_id, qid, track_id, queuing from queue_mgt WHERE ${data.type} = '${req.params.cam_id}' and start_time >= '${start}' and start_time <= '${end}' and queuing = 0 order by start_time asc;` } if (req.params.algo_id === '69' && data.typ === 'alerts') { query = `SELECT id, time, camera_name, cam_id, zone, severity from avail_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` From d89c841d19c8e05853d143345e1541e4fc9731e6 Mon Sep 17 00:00:00 2001 From: ridweng Date: Wed, 29 Mar 2023 11:12:11 +0100 Subject: [PATCH 35/38] report --- dockerDeployment/docker-compose.yml | 2 +- server/app/controllers/report.controller.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerDeployment/docker-compose.yml b/dockerDeployment/docker-compose.yml index 8b1f9d3e..7ae482d0 100755 --- a/dockerDeployment/docker-compose.yml +++ b/dockerDeployment/docker-compose.yml @@ -11,7 +11,7 @@ services: # ports: # - "3300:3300" network_mode: host - image: graymatics1/multi-tenant-server:2.4.2 + image: graymatics1/multi-tenant-server:2.5.1 restart: always volumes: - ./resources:/usr/src/app/resources diff --git a/server/app/controllers/report.controller.js b/server/app/controllers/report.controller.js index 8e36a75a..0ae3059d 100755 --- a/server/app/controllers/report.controller.js +++ b/server/app/controllers/report.controller.js @@ -91,7 +91,7 @@ exports.report = async (req, res) => { let query = `SELECT id, time, camera_name, cam_id, zone, severity from queue_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}'${extra} order by time asc;` if (data.algo === 'count') { - query = `SELECT id, start_time, end_time, camera_name, cam_id, qid, track_id, queuing from queue_mgt WHERE ${data.type} = '${req.params.cam_id}' and start_time >= '${start}' and start_time <= '${end}' and queuing = 0 order by start_time asc;` + query = `SELECT id, start_time, end_time, camera_name, cam_id, qid, track_id, queuing from queue_mgt WHERE ${data.type} = '${req.params.cam_id}' and queuing = 0 and start_time >= '${start}' and start_time <= '${end}' order by start_time asc;` } if (req.params.algo_id === '69' && data.typ === 'alerts') { query = `SELECT id, time, camera_name, cam_id, zone, severity from avail_alerts WHERE ${data.type} = '${req.params.cam_id}' and time >= '${start}' and time <= '${end}' order by time asc;` From 531ff7d47d43e4c240dd3f0560add7a4e13159e4 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 18 May 2023 14:52:59 +0100 Subject: [PATCH 36/38] console.log --- server/app/controllers/analytics.controller.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/app/controllers/analytics.controller.js b/server/app/controllers/analytics.controller.js index def6ad46..ecc9d040 100755 --- a/server/app/controllers/analytics.controller.js +++ b/server/app/controllers/analytics.controller.js @@ -8993,6 +8993,7 @@ exports.breadTemp = async (req, res) => { let cache = [], range, cou = 0 start = new Date(data.start) end = new Date(data.end) + console.log(data, start, end) if(diff === 1){ range = 5 * 60 * 1000 start = new Date(data.start).getTime() + 7 * 60 * 60 * 1000 @@ -9010,7 +9011,7 @@ exports.breadTemp = async (req, res) => { }else if(diff >= 14 && diff <= 32){ range = 24 * 60 * 60 * 1000 } - console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= '${start}' and time <= '${end}' order by time asc;`) + console.log(`SELECT * from bread_temperature WHERE ${data.type} = '${req.params.id}' and time >= ${JSON.stringify(start)} and time <= ${JSON.stringify(end)} order by time asc;`) await db .con() .query( @@ -9021,7 +9022,7 @@ exports.breadTemp = async (req, res) => { success: false, message: err }) - + console.log(result.length) let dwell = [], dwellAll = [] let labelsD = [], labelsDAll =[] let av = [], sum = [] From bcea724da702c3210af6aa6deea4312bf1163238 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 18 May 2023 14:54:27 +0100 Subject: [PATCH 37/38] cam ham and cheese --- .../pages/online/graphs/ham-cheese/ham-cheese.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html index 5bc07223..8c59b7cd 100755 --- a/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html +++ b/client/src/app/pages/online/graphs/ham-cheese/ham-cheese.component.html @@ -116,7 +116,7 @@
-
+

Camara en tiempo real

From e6055205eb3af9f4e0bacfc2984e7994aa11ec62 Mon Sep 17 00:00:00 2001 From: ridweng Date: Thu, 18 May 2023 15:01:07 +0100 Subject: [PATCH 38/38] picture retaken feature --- .../cameras_conf/add_camera/vid.component.ts | 11 +++++--- .../algorithms/algorithms.component.html | 1 + .../algorithms/algorithms.component.ts | 27 +++++++++++++++++++ .../pages/search/upload/upload.component.ts | 19 +++++++++---- client/src/app/services/faces.service.ts | 2 +- 5 files changed, 51 insertions(+), 9 deletions(-) diff --git a/client/src/app/pages/cameras_conf/add_camera/vid.component.ts b/client/src/app/pages/cameras_conf/add_camera/vid.component.ts index aa9597ea..d72b9d61 100755 --- a/client/src/app/pages/cameras_conf/add_camera/vid.component.ts +++ b/client/src/app/pages/cameras_conf/add_camera/vid.component.ts @@ -4,6 +4,7 @@ import { FacesService } from '../../../services/faces.service'; import { ActivatedRoute, Router } from '@angular/router'; import { v4 as uuid } from 'uuid'; import { NbComponentStatus, NbGlobalPhysicalPosition, NbGlobalPosition, NbToastrService } from '@nebular/theme'; +import { Account } from '../../../models/Account'; @Component({ selector: 'app-vid', @@ -30,10 +31,12 @@ export class VidComponent implements OnInit { edit : boolean = false; submitted: boolean = false; is_saving : boolean = false; + now_user: Account; constructor(private facesService: FacesService, private router: Router, private activatedRoute: ActivatedRoute, private toastrService: NbToastrService) { } ngOnInit() { + this.now_user = JSON.parse(localStorage.getItem('now_user')); const params = this.activatedRoute.snapshot.params; if(params.uuid){ this.facesService.getCamera(params.uuid) @@ -61,16 +64,18 @@ export class VidComponent implements OnInit { res=>{ // console.log(res); let response = { - cam_id: res['id'] + cameraId: res['id'], + id_account: this.now_user.id_account, + id_branch: this.now_user.id_branch }; this.facesService.doOneImage(response).subscribe( res => { // console.log(res) - this.router.navigate(['/pages/cameras/algorithms/'+response['cam_id']]); + this.router.navigate(['/pages/cameras/algorithms/'+response['id']]); }, err => { // console.error(err) - this.router.navigate(['/pages/cameras/algorithms/'+response['cam_id']]); + this.router.navigate(['/pages/cameras/algorithms/'+response['id']]); } ) }, diff --git a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html index 2841828f..be0caaa9 100755 --- a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html +++ b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.html @@ -169,6 +169,7 @@

Configuracion de {{camera.name}}

+
diff --git a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts index 5618b553..e365b0b6 100755 --- a/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts +++ b/client/src/app/pages/cameras_conf/algorithms/algorithms.component.ts @@ -233,6 +233,33 @@ export class AlgorithmsComponent implements OnInit { analytics: 0, }; + reTakeVals: any = { + show: false, + error: false + } + reTake(){ + this.reTakeVals.show = true + this.reTakeVals.error = false + let response = { + cameraId: this.camera.id, + id_account: this.camera['id_account'], + id_branch: this.camera['id_branch'] + }; + + this.facesService.doOneImage(response).subscribe( + (res) => { + this.reTakeVals.show = false + window.location.reload(); + // console.log(res) + }, + (err) => { + this.reTakeVals.show = false + this.reTakeVals.error = true + // console.error(err) + } + ); + } + back(which){ if (which === 'Yes'){ this.router.navigateByUrl('/pages/search/list'); diff --git a/client/src/app/pages/search/upload/upload.component.ts b/client/src/app/pages/search/upload/upload.component.ts index 253beb35..565e8e2d 100755 --- a/client/src/app/pages/search/upload/upload.component.ts +++ b/client/src/app/pages/search/upload/upload.component.ts @@ -17,6 +17,7 @@ import { api } from "../../../models/API"; import { Router } from "@angular/router"; import { AuthService } from "../../../services/auth.service"; import { NgxSpinnerService } from "ngx-spinner"; +import { Account } from "../../../models/Account"; const URL = `${api}/elastic/video`; const uploadZipURL = `${api}/elastic/zip`; @@ -45,6 +46,7 @@ export class UploadComponent implements OnInit { zipName: string; zipLoad: boolean = false; zipUploadFinished: boolean = false; + now_user: Account; @ViewChild("fileInput", { static: false }) fileInputVariable: any; @ViewChild("zipFileInput", { static: false }) zipFileInputVariable: any; @@ -62,6 +64,7 @@ export class UploadComponent implements OnInit { }); ngOnInit(): void { + this.now_user = JSON.parse(localStorage.getItem('now_user')); this.uploader.onAfterAddingFile = (file) => { //this.SpinnerService.show(); file.withCredentials = false; @@ -179,21 +182,27 @@ export class UploadComponent implements OnInit { } } + error: boolean = false + addRoI(res) { + const id = res.id let response = { - cam_id: res.id, + cameraId: id, + id_account: this.now_user.id_account, + id_branch: this.now_user.id_branch }; this.facesService.doOneImage(response).subscribe( (res) => { // console.log(res) - //this.router.navigate(['/pages/cameras/algorithms/' + id]); - this.router.navigateByUrl("/pages/search/list"); + this.router.navigate(['/pages/cameras/algorithms/' + id]); + // this.router.navigateByUrl("/pages/search/list"); }, (err) => { // console.error(err) - //this.router.navigate(['/pages/cameras/algorithms/' + id]); - this.router.navigateByUrl("/pages/search/list"); + this.error = true + this.router.navigate(['/pages/cameras/algorithms/' + id]); + // this.router.navigateByUrl("/pages/search/list"); } ); } diff --git a/client/src/app/services/faces.service.ts b/client/src/app/services/faces.service.ts index 4cadce0f..f036edd5 100755 --- a/client/src/app/services/faces.service.ts +++ b/client/src/app/services/faces.service.ts @@ -25,7 +25,7 @@ export class FacesService { return this.http.post(`${this.API_URI}/getInfo`, info); } doOneImage(camera_id: any) { - return this.http.post(`${this.API_URI}/cameraImages/`, camera_id); + return this.http.post(`${this.API_URI}2/frame`, camera_id); } doAllImages() { return this.http.get(`${this.API_URI}/cameraImages/all`);