contable 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/client/client/client.js +240 -0
  2. package/dist/client/{menu.js → client/menu.js} +1 -1
  3. package/dist/client/client/redux-formulario.js +379 -0
  4. package/dist/client/client/render-components.js +750 -0
  5. package/dist/client/client/render-formulario.js +56 -0
  6. package/dist/client/client/render-general.js +197 -0
  7. package/dist/client/client/render-handlers.js +69 -0
  8. package/dist/client/client/tipos.js +13 -0
  9. package/dist/client/{tsconfig.json → client/tsconfig.json} +3 -4
  10. package/dist/{unlogged → client/unlogged}/tsconfig.json +1 -3
  11. package/dist/server/client/tipos.d.ts +119 -0
  12. package/dist/server/client/tipos.js +13 -0
  13. package/dist/server/{app-contable.d.ts → server/app-contable.d.ts} +63 -3
  14. package/dist/server/server/app-contable.js +192 -0
  15. package/dist/server/server/def-config.d.ts +1 -0
  16. package/dist/server/server/def-config.js +101 -0
  17. package/dist/server/server/procedures-contable.js +508 -0
  18. package/dist/server/{server-contable.js → server/server-contable.js} +1 -1
  19. package/dist/server/server/table-categorias_producto.js +29 -0
  20. package/dist/server/server/table-clientes.js +56 -0
  21. package/dist/server/server/table-condicion_iva.js +29 -0
  22. package/dist/server/server/table-estados_pedido.js +33 -0
  23. package/dist/server/server/table-estados_presupuesto.js +34 -0
  24. package/dist/server/server/table-insumos.js +44 -0
  25. package/dist/server/server/table-items_pedido.js +48 -0
  26. package/dist/server/server/table-items_presupuesto.js +48 -0
  27. package/dist/server/server/table-iva_productos.js +29 -0
  28. package/dist/server/server/table-parametros.js +38 -0
  29. package/dist/server/server/table-pedidos.js +48 -0
  30. package/dist/server/server/table-pedidos_pendientes.js +28 -0
  31. package/dist/server/server/table-pedidos_vencidos.js +28 -0
  32. package/dist/server/server/table-presupuestos.js +56 -0
  33. package/dist/server/server/table-productos.js +70 -0
  34. package/dist/server/server/table-productos_clientes.js +22 -0
  35. package/dist/server/server/table-productos_generales.js +22 -0
  36. package/dist/server/server/table-productos_insumos.js +47 -0
  37. package/dist/server/server/table-usuarios.js +44 -0
  38. package/dist/server/{types-contable.d.ts → server/types-contable.d.ts} +14 -3
  39. package/dist/server/server/types-contable.js +28 -0
  40. package/dist/unlogged/unlogged/adapt.js +8 -0
  41. package/dist/unlogged/unlogged/css/styles.styl +88 -0
  42. package/dist/unlogged/unlogged/img/login-logo-icon.png +0 -0
  43. package/dist/unlogged/unlogged/img/logo.png +0 -0
  44. package/dist/unlogged/unlogged/tsconfig.json +13 -0
  45. package/dist/unlogged/unlogged/unlogged.js +13 -0
  46. package/package.json +22 -5
  47. package/dist/client/client.js +0 -182
  48. package/dist/client/redux-formulario.js +0 -326
  49. package/dist/client/render-components.js +0 -617
  50. package/dist/client/render-formulario.js +0 -56
  51. package/dist/client/render-general.js +0 -172
  52. package/dist/client/render-handlers.js +0 -29
  53. package/dist/client/tipos.js +0 -13
  54. package/dist/server/app-contable.js +0 -192
  55. package/dist/server/def-config.d.ts +0 -1
  56. package/dist/server/def-config.js +0 -100
  57. package/dist/server/procedures-contable.js +0 -508
  58. package/dist/server/table-categorias_producto.js +0 -29
  59. package/dist/server/table-clientes.js +0 -56
  60. package/dist/server/table-condicion_iva.js +0 -29
  61. package/dist/server/table-estados_pedido.js +0 -33
  62. package/dist/server/table-estados_presupuesto.js +0 -34
  63. package/dist/server/table-insumos.js +0 -44
  64. package/dist/server/table-items_pedido.js +0 -48
  65. package/dist/server/table-items_presupuesto.js +0 -48
  66. package/dist/server/table-iva_productos.js +0 -29
  67. package/dist/server/table-parametros.js +0 -38
  68. package/dist/server/table-pedidos.js +0 -48
  69. package/dist/server/table-pedidos_pendientes.js +0 -28
  70. package/dist/server/table-pedidos_vencidos.js +0 -28
  71. package/dist/server/table-presupuestos.js +0 -56
  72. package/dist/server/table-productos.js +0 -70
  73. package/dist/server/table-productos_clientes.js +0 -22
  74. package/dist/server/table-productos_generales.js +0 -22
  75. package/dist/server/table-productos_insumos.js +0 -47
  76. package/dist/server/table-usuarios.js +0 -44
  77. package/dist/server/tsconfig.json +0 -10
  78. package/dist/server/types-contable.js +0 -28
  79. package/dist/unlogged/adapt.js +0 -8
  80. package/dist/unlogged/unlogged.js +0 -118
  81. /package/dist/client/{client.d.ts → client/client.d.ts} +0 -0
  82. /package/dist/client/{img → client/img}/bannersuperior.png +0 -0
  83. /package/dist/client/{menu.d.ts → client/menu.d.ts} +0 -0
  84. /package/dist/client/{redux-formulario.d.ts → client/redux-formulario.d.ts} +0 -0
  85. /package/dist/client/{render-components.d.ts → client/render-components.d.ts} +0 -0
  86. /package/dist/client/{render-components.tsx → client/render-components.tsx} +0 -0
  87. /package/dist/client/{render-formulario.d.ts → client/render-formulario.d.ts} +0 -0
  88. /package/dist/client/{render-formulario.tsx → client/render-formulario.tsx} +0 -0
  89. /package/dist/client/{render-general.d.ts → client/render-general.d.ts} +0 -0
  90. /package/dist/client/{render-general.tsx → client/render-general.tsx} +0 -0
  91. /package/dist/client/{render-handlers.d.ts → client/render-handlers.d.ts} +0 -0
  92. /package/dist/client/{tipos.d.ts → client/tipos.d.ts} +0 -0
  93. /package/dist/{unlogged → client/unlogged}/css/styles.styl +0 -0
  94. /package/dist/{unlogged/img/login-logo-icon.png.png → client/unlogged/img/login-logo-icon.png} +0 -0
  95. /package/dist/{unlogged → client/unlogged}/img/logo.png +0 -0
  96. /package/dist/server/{procedures-contable.d.ts → server/procedures-contable.d.ts} +0 -0
  97. /package/dist/server/{server-contable.d.ts → server/server-contable.d.ts} +0 -0
  98. /package/dist/server/{table-categorias_producto.d.ts → server/table-categorias_producto.d.ts} +0 -0
  99. /package/dist/server/{table-clientes.d.ts → server/table-clientes.d.ts} +0 -0
  100. /package/dist/server/{table-condicion_iva.d.ts → server/table-condicion_iva.d.ts} +0 -0
  101. /package/dist/server/{table-estados_pedido.d.ts → server/table-estados_pedido.d.ts} +0 -0
  102. /package/dist/server/{table-estados_presupuesto.d.ts → server/table-estados_presupuesto.d.ts} +0 -0
  103. /package/dist/server/{table-insumos.d.ts → server/table-insumos.d.ts} +0 -0
  104. /package/dist/server/{table-items_pedido.d.ts → server/table-items_pedido.d.ts} +0 -0
  105. /package/dist/server/{table-items_presupuesto.d.ts → server/table-items_presupuesto.d.ts} +0 -0
  106. /package/dist/server/{table-iva_productos.d.ts → server/table-iva_productos.d.ts} +0 -0
  107. /package/dist/server/{table-parametros.d.ts → server/table-parametros.d.ts} +0 -0
  108. /package/dist/server/{table-pedidos.d.ts → server/table-pedidos.d.ts} +0 -0
  109. /package/dist/server/{table-pedidos_pendientes.d.ts → server/table-pedidos_pendientes.d.ts} +0 -0
  110. /package/dist/server/{table-pedidos_vencidos.d.ts → server/table-pedidos_vencidos.d.ts} +0 -0
  111. /package/dist/server/{table-presupuestos.d.ts → server/table-presupuestos.d.ts} +0 -0
  112. /package/dist/server/{table-productos.d.ts → server/table-productos.d.ts} +0 -0
  113. /package/dist/server/{table-productos_clientes.d.ts → server/table-productos_clientes.d.ts} +0 -0
  114. /package/dist/server/{table-productos_generales.d.ts → server/table-productos_generales.d.ts} +0 -0
  115. /package/dist/server/{table-productos_insumos.d.ts → server/table-productos_insumos.d.ts} +0 -0
  116. /package/dist/server/{table-usuarios.d.ts → server/table-usuarios.d.ts} +0 -0
  117. /package/dist/unlogged/{adapt.d.ts → unlogged/adapt.d.ts} +0 -0
  118. /package/dist/unlogged/{unlogged.d.ts → unlogged/unlogged.d.ts} +0 -0
@@ -1,508 +0,0 @@
1
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2
- if (k2 === undefined) k2 = k;
3
- var desc = Object.getOwnPropertyDescriptor(m, k);
4
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
5
- desc = { enumerable: true, get: function() { return m[k]; } };
6
- }
7
- Object.defineProperty(o, k2, desc);
8
- }) : (function(o, m, k, k2) {
9
- if (k2 === undefined) k2 = k;
10
- o[k2] = m[k];
11
- }));
12
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
13
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
14
- };
15
- (function (factory) {
16
- if (typeof module === "object" && typeof module.exports === "object") {
17
- var v = factory(require, exports);
18
- if (v !== undefined) module.exports = v;
19
- }
20
- else if (typeof define === "function" && define.amd) {
21
- define(["require", "exports", "./types-contable", "best-globals"], factory);
22
- }
23
- })(function (require, exports) {
24
- "use strict";
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.ProceduresContable = void 0;
27
- __exportStar(require("./types-contable"), exports);
28
- const best_globals_1 = require("best-globals");
29
- var path = require('path');
30
- var sqlTools = require('sql-tools');
31
- const ESTADO_ACEPTADO_PRESUPUESTO = 'aceptado';
32
- const ESTADO_ANULADO_PRESUPUESTO = 'anulado';
33
- const ESTADO_RECHAZADO_PRESUPUESTO = 'rechazado';
34
- function json(sql, orderby) {
35
- return `COALESCE((SELECT jsonb_agg(to_jsonb(j.*) ORDER BY ${orderby}) from (${sql}) as j),'[]'::jsonb)`;
36
- }
37
- function jsono(sql, indexedby) {
38
- return `COALESCE((SELECT jsonb_object_agg(${indexedby},to_jsonb(j.*)) from (${sql}) as j),'{}'::jsonb)`;
39
- }
40
- var createStructure = function createStructure(context, tableName) {
41
- var be = context.be;
42
- var mainTableDef = be.tableStructures[tableName](context);
43
- var getPkFromTableDef = function getPkFromTableDef(tableDef) {
44
- return tableDef.primaryKey.map(function (pk) {
45
- return { fieldName: pk };
46
- });
47
- };
48
- var getFkFromTableDef = function getFkFromTableDef(tableDef) {
49
- return tableDef.foreignKeys.map(function (fk) {
50
- return fk.fields;
51
- });
52
- };
53
- var struct = {
54
- tableName: mainTableDef.name,
55
- pkFields: getPkFromTableDef(mainTableDef),
56
- };
57
- struct.childTables = [];
58
- if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
59
- mainTableDef.detailTables.forEach(function (detailTable) {
60
- struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), getFkFromTableDef(be.tableStructures[detailTable.table](context))));
61
- });
62
- }
63
- return struct;
64
- };
65
- async function permiteEditarPresupuesto(nroPresup, client) {
66
- if (!(await client.query(`
67
- select *
68
- from presupuestos inner join estados_presupuesto using (estado)
69
- where presupuesto = $1
70
- `, [nroPresup]).fetchOneRowIfExists()).row.permite_editar) {
71
- //si el estado no permite editar tira error
72
- throw Error('No se puede editar ya que su estado no lo permite.');
73
- }
74
- }
75
- exports.ProceduresContable = [
76
- {
77
- action: 'estructura_crear',
78
- parameters: [],
79
- coreFunction: async function (context, _parameters) {
80
- var client = context.client;
81
- var query = `
82
- SELECT
83
- ${jsono(`
84
- SELECT *
85
- FROM clientes
86
- `, 'cliente')} as clientes,
87
- ${jsono(`
88
- select p.*,
89
- sum(i.costo_unitario*i.utilidad*pi.cantidad_insumo) as total_insumos,
90
- precio_sin_insumos + coalesce(sum(i.costo_unitario*i.utilidad*pi.cantidad_insumo),0) as precio
91
- from productos p
92
- left join productos_insumos pi using (producto)
93
- left join insumos i using (insumo)
94
- where p.producto > 0
95
- group by p.producto,
96
- p.categoria,
97
- p.nombre,
98
- p.descripcion,
99
- p.habilitado,
100
- p.precio_sin_insumos,
101
- p.stock,
102
- p.stock_minimo,
103
- p.stock_maximo,
104
- p.iva
105
- `, 'producto')} as productos,
106
- ${jsono(`
107
- SELECT *
108
- FROM condicion_iva
109
- `, 'condicion')} as "condicionesIva",
110
- ${json(`
111
- SELECT *
112
- FROM estados_presupuesto
113
- `, 'orden')} as "estadosPresupuesto",
114
- ${json(`
115
- SELECT *
116
- FROM estados_pedido
117
- `, 'orden')} as "estadosPedido",
118
- (SELECT to_jsonb(j.*)
119
- from (select legales_pedido, legales_presupuesto from parametros) as j) as parametros
120
- `;
121
- try {
122
- var result = await client.query(query).fetchUniqueRow();
123
- return result.row;
124
- }
125
- catch (err) {
126
- console.log('ERROR', err.message);
127
- throw err;
128
- }
129
- ;
130
- }
131
- },
132
- {
133
- action: 'presupuesto_cargar',
134
- parameters: [
135
- { name: 'presupuesto', typeName: 'integer' },
136
- ],
137
- coreFunction: async function (context, parameters) {
138
- var client = context.client;
139
- var query = `
140
- SELECT
141
- COALESCE(
142
- (SELECT to_jsonb(j.*)
143
- from (
144
- SELECT *
145
- from presupuestos
146
- where presupuesto = $1
147
- ) as j
148
- )
149
- ,'{}'::jsonb
150
- ) as presupuesto,
151
- COALESCE(
152
- (SELECT to_jsonb(j.*)
153
- from (
154
- SELECT *
155
- FROM clientes
156
- where cliente = (select cliente from presupuestos where presupuesto = $1)
157
- ) as j
158
- ),'{}'::jsonb
159
- ) as cliente,
160
- ${json(`
161
- SELECT *
162
- FROM items_presupuesto
163
- where presupuesto = $1
164
- `, 'numero_linea')} as "items"
165
- `;
166
- try {
167
- var result = await client.query(query, [parameters.presupuesto]).fetchUniqueRow();
168
- return result.row;
169
- }
170
- catch (err) {
171
- console.log('ERROR', err.message);
172
- throw err;
173
- }
174
- ;
175
- }
176
- },
177
- {
178
- action: 'presupuesto_guardar',
179
- parameters: [
180
- { name: 'presupuesto', typeName: 'jsonb' },
181
- { name: 'items', typeName: 'jsonb' },
182
- { name: 'cliente', typeName: 'jsonb' },
183
- ],
184
- coreFunction: async function (context, parameters) {
185
- var client = context.client;
186
- var presup = parameters.presupuesto;
187
- var cliente = parameters.cliente;
188
- var numeroPresupuesto;
189
- try {
190
- var presupuestoFieldsSql = `(fecha, cliente, estado, valido_hasta, subtotal, descuento, total, con_opciones, con_descuento_en_items) `;
191
- var presupuestoValuesSql = `($1,$2,$3,$4,$5,$6,$7,$8,$9) `;
192
- var presupuestoValues = [
193
- presup.fecha,
194
- cliente.cliente,
195
- presup.estado,
196
- presup.valido_hasta,
197
- presup.subtotal,
198
- presup.descuento,
199
- presup.total,
200
- presup.con_opciones,
201
- presup.con_descuento_en_items
202
- ];
203
- if (presup.presupuesto) {
204
- await permiteEditarPresupuesto(presup.presupuesto, client);
205
- numeroPresupuesto = presup.presupuesto;
206
- await client.query(`delete from items_presupuesto where presupuesto = $1`, [numeroPresupuesto]).execute();
207
- await client.query(`
208
- update presupuestos
209
- set ${presupuestoFieldsSql} = ${presupuestoValuesSql}
210
- where presupuesto = $10
211
- returning *
212
- `, presupuestoValues.concat(presup.presupuesto)).fetchUniqueRow();
213
- }
214
- else {
215
- numeroPresupuesto = (await client.query(`
216
- insert into
217
- presupuestos ${presupuestoFieldsSql}
218
- values ${presupuestoValuesSql}
219
- returning *
220
- `, presupuestoValues).fetchUniqueRow()).row.presupuesto;
221
- }
222
- for (let item of parameters.items) {
223
- await client.query(`
224
- insert
225
- into items_presupuesto (presupuesto, cantidad, producto, nombre, descripcion, precio_unitario, porcentaje_descuento, descuento, total)
226
- values ($1,$2,$3,$4,$5,$6,$7,$8,$9)
227
- `, [numeroPresupuesto, item.cantidad, item.producto, item.nombre, item.descripcion, item.precio_unitario, item.porcentaje_descuento, item.descuento, item.total])
228
- .execute();
229
- }
230
- return { estado: 'ok', presupuesto: numeroPresupuesto };
231
- }
232
- catch (err) {
233
- console.log('ERROR', err.message);
234
- throw err;
235
- }
236
- ;
237
- }
238
- },
239
- {
240
- action: 'presupuesto_anular',
241
- parameters: [
242
- { name: 'presupuesto', typeName: 'integer' },
243
- ],
244
- coreFunction: async function (context, parameters) {
245
- var client = context.client;
246
- var db = context.be.db;
247
- var nroPresup = parameters.presupuesto;
248
- try {
249
- await permiteEditarPresupuesto(nroPresup, client);
250
- await client.query(`
251
- update presupuestos
252
- set estado = $2
253
- where presupuesto = $1
254
- returning *
255
- `, [nroPresup, ESTADO_ANULADO_PRESUPUESTO]).fetchUniqueRow();
256
- return { estado: 'ok' };
257
- }
258
- catch (err) {
259
- console.log('ERROR', err.message);
260
- throw err;
261
- }
262
- ;
263
- }
264
- },
265
- {
266
- action: 'presupuesto_rechazar',
267
- parameters: [
268
- { name: 'presupuesto', typeName: 'integer' },
269
- ],
270
- coreFunction: async function (context, parameters) {
271
- var client = context.client;
272
- var db = context.be.db;
273
- var nroPresup = parameters.presupuesto;
274
- try {
275
- await permiteEditarPresupuesto(nroPresup, client);
276
- await client.query(`
277
- update presupuestos
278
- set estado = $2
279
- where presupuesto = $1
280
- returning *
281
- `, [nroPresup, ESTADO_RECHAZADO_PRESUPUESTO]).fetchUniqueRow();
282
- return { estado: 'ok' };
283
- }
284
- catch (err) {
285
- console.log('ERROR', err.message);
286
- throw err;
287
- }
288
- ;
289
- }
290
- },
291
- {
292
- action: 'pedido_cargar',
293
- parameters: [
294
- { name: 'pedido', typeName: 'integer' },
295
- ],
296
- coreFunction: async function (context, parameters) {
297
- var client = context.client;
298
- var query = `
299
- SELECT
300
- COALESCE(
301
- (SELECT to_jsonb(j.*)
302
- from (
303
- SELECT *
304
- from pedidos
305
- where pedido = $1
306
- ) as j
307
- )
308
- ,'{}'::jsonb
309
- ) as pedido,
310
- COALESCE(
311
- (SELECT to_jsonb(j.*)
312
- from (
313
- SELECT *
314
- FROM clientes
315
- where cliente = (select cliente from pedidos where pedido = $1)
316
- ) as j
317
- ),'{}'::jsonb
318
- ) as cliente,
319
- ${json(`
320
- SELECT *
321
- FROM items_pedido
322
- where pedido = $1
323
- `, 'numero_linea')} as "items"
324
- `;
325
- try {
326
- var result = await client.query(query, [parameters.pedido]).fetchUniqueRow();
327
- return result.row;
328
- }
329
- catch (err) {
330
- console.log('ERROR', err.message);
331
- throw err;
332
- }
333
- ;
334
- }
335
- },
336
- {
337
- // TODO -> stock (puede ir en trigger)
338
- action: 'pedido_guardar',
339
- parameters: [
340
- { name: 'pedido', typeName: 'jsonb' },
341
- { name: 'items', typeName: 'jsonb' },
342
- { name: 'cliente', typeName: 'jsonb' },
343
- ],
344
- coreFunction: async function (context, parameters) {
345
- var client = context.client;
346
- var pedido = parameters.pedido;
347
- var cliente = parameters.cliente;
348
- var numeroPedido;
349
- try {
350
- var pedidoFieldsSql = `(presupuesto, fecha, cliente, estado, fecha_entrega, subtotal, descuento, total, observaciones) `;
351
- var pedidoValuesSql = `($1,$2,$3,$4,$5,$6,$7,$8, $9) `;
352
- var pedidoValues = [
353
- pedido.presupuesto,
354
- pedido.fecha,
355
- cliente.cliente,
356
- pedido.estado,
357
- pedido.fecha_entrega,
358
- pedido.subtotal,
359
- pedido.descuento,
360
- pedido.total,
361
- pedido.observaciones
362
- ];
363
- if (pedido.pedido) {
364
- numeroPedido = pedido.pedido;
365
- await client.query(`delete from items_pedido where pedido = $1`, [numeroPedido]).execute();
366
- await client.query(`
367
- update pedidos
368
- set ${pedidoFieldsSql} = ${pedidoValuesSql}
369
- where pedido = $10
370
- returning *
371
- `, pedidoValues.concat(pedido.pedido)).fetchUniqueRow();
372
- }
373
- else {
374
- pedido.presupuesto ? await permiteEditarPresupuesto(pedido.presupuesto, client) : null;
375
- numeroPedido = (await client.query(`
376
- insert into
377
- pedidos ${pedidoFieldsSql}
378
- values ${pedidoValuesSql}
379
- returning *
380
- `, pedidoValues).fetchUniqueRow()).row.pedido;
381
- }
382
- for (let item of parameters.items) {
383
- await client.query(`
384
- insert
385
- into items_pedido (pedido, cantidad, producto, nombre, descripcion, precio_unitario, porcentaje_descuento, descuento, total)
386
- values ($1,$2,$3,$4,$5,$6,$7,$8,$9)
387
- `, [numeroPedido, item.cantidad, item.producto, item.nombre, item.descripcion, item.precio_unitario, item.porcentaje_descuento, item.descuento, item.total])
388
- .execute();
389
- }
390
- if (pedido.presupuesto) {
391
- await client.query(`
392
- update presupuestos
393
- set estado = $1
394
- where presupuesto = $2
395
- returning *
396
- `, [ESTADO_ACEPTADO_PRESUPUESTO, pedido.presupuesto]).fetchUniqueRow();
397
- try {
398
- await client.query(`
399
- select presupuesto
400
- from pedidos
401
- where presupuesto = $1
402
- `, [pedido.presupuesto]).fetchUniqueValue();
403
- }
404
- catch (err) {
405
- throw Error(`El presupuesto ${pedido.presupuesto} ya tiene un pedido creado. ` + err.message);
406
- }
407
- }
408
- return { estado: 'ok', pedido: numeroPedido };
409
- }
410
- catch (err) {
411
- console.log('ERROR', err.message);
412
- throw err;
413
- }
414
- ;
415
- }
416
- },
417
- {
418
- action: 'producto_clonar',
419
- parameters: [
420
- { name: 'producto', typeName: 'integer' },
421
- ],
422
- coreFunction: async function (context, parameters) {
423
- var client = context.client;
424
- var be = context.be;
425
- var producto = parameters.producto;
426
- //clonacion producto
427
- var productoAClonar = (await client.query(`select * from productos where producto = $1`, [producto]).fetchUniqueRow()).row;
428
- delete (productoAClonar.producto);
429
- delete (productoAClonar.stock);
430
- delete (productoAClonar.stock_minimo);
431
- delete (productoAClonar.stock_maximo);
432
- var productoKeys = [];
433
- var productoValues = [];
434
- for (let key in productoAClonar) {
435
- productoKeys.push(be.db.quoteIdent(key));
436
- productoValues.push(be.db.quoteNullable(productoAClonar[key]));
437
- }
438
- var productoNuevo = (await client.query(`insert into productos (${productoKeys.join(',')}) values (${productoValues.join(',')}) returning *`, []).fetchUniqueRow()).row;
439
- //clonacion insumos
440
- var productosInsumosAClonar = (await client.query(`select * from productos_insumos where producto = $1`, [producto]).fetchAll()).rows;
441
- var prodInsumosNuevos = [];
442
- for (var prodInsumo of productosInsumosAClonar) {
443
- prodInsumo.producto = productoNuevo.producto;
444
- var prodInsumoKeys = [];
445
- var prodInsumoValues = [];
446
- for (let key in prodInsumo) {
447
- prodInsumoKeys.push(be.db.quoteIdent(key));
448
- prodInsumoValues.push(be.db.quoteNullable(prodInsumo[key]));
449
- }
450
- prodInsumosNuevos.push((await client.query(`
451
- insert into
452
- productos_insumos (${prodInsumoKeys.join(',')})
453
- values (${prodInsumoValues.join(',')})
454
- returning *`, []).fetchUniqueRow()).row);
455
- }
456
- return { estado: 'ok', productoNuevo, prodInsumosNuevos };
457
- }
458
- },
459
- {
460
- action: 'object_get',
461
- parameters: [
462
- { name: 'tablename', typeName: 'text' },
463
- { name: 'pk_values', typeName: 'jsonb' },
464
- ],
465
- coreFunction: async function (context, parameters) {
466
- var client = context.client;
467
- var query = sqlTools.structuredData.sqlRead(parameters.pk_values, createStructure(context, parameters.tablename));
468
- try {
469
- var result = await client.query(query).fetchUniqueValue();
470
- return result.value;
471
- }
472
- catch (err) {
473
- console.log('ERROR', err.message);
474
- throw err;
475
- }
476
- ;
477
- }
478
- },
479
- {
480
- action: 'object_save',
481
- parameters: [
482
- { name: 'tablename', typeName: 'text' },
483
- { name: 'datos', typeName: 'jsonb' },
484
- ],
485
- coreFunction: async function (context, parameters) {
486
- var be = context.be;
487
- var client = context.client;
488
- var queries = sqlTools.structuredData.sqlWrite(parameters.datos, createStructure(context, parameters.tablename));
489
- console.log("#############", queries);
490
- return await queries.reduce(function (promise, query) {
491
- return promise.then(function () {
492
- return client.query(query).execute().then(function () {
493
- return 'ok';
494
- });
495
- });
496
- }, Promise.resolve()).then(async function () {
497
- //TODO: traer json refrescado
498
- //var result = await be.procedure.object_get.coreFunction(context, {tablename:parameters.tablename, });
499
- return 'ok';
500
- }).catch(function (err) {
501
- console.log("ENTRA EN EL CATCH: ", err);
502
- throw err;
503
- });
504
- }
505
- },
506
- ];
507
- });
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1jb250YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvcHJvY2VkdXJlcy1jb250YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBS2IsbURBQWlDO0lBRWpDLCtDQUF1RDtJQUl2RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBR3BDLE1BQU0sMkJBQTJCLEdBQUksVUFBVSxDQUFDO0lBQ2hELE1BQU0sMEJBQTBCLEdBQUssU0FBUyxDQUFDO0lBQy9DLE1BQU0sNEJBQTRCLEdBQUcsV0FBVyxDQUFDO0lBRWpELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPO1FBQ3RCLE9BQU8scURBQXFELE9BQU8sV0FBVyxHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUztRQUN6QixPQUFPLHFDQUFxQyxTQUFTLHlCQUF5QixHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxJQUFJLGVBQWUsR0FBRyxTQUFTLGVBQWUsQ0FBQyxPQUFlLEVBQUUsU0FBZ0I7UUFDNUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFJLFlBQVksR0FBbUIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRSxJQUFJLGlCQUFpQixHQUFHLFNBQVMsaUJBQWlCLENBQUMsUUFBd0I7WUFDdkUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFTLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENB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QUNuRixJQUFJLEVBQUUsR0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLE1BQU0sR0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUMxQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUNwQyxPQUFPLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFTLE9BQW9CLEVBQUUsS0FBWTtvQkFDbkUsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNoQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUN0QyxPQUFPLElBQUksQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUMzQiw2QkFBNkI7b0JBQzdCLHVHQUF1RztvQkFDdkcsT0FBTyxJQUFJLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFTLEdBQVM7b0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLE1BQU0sR0FBRyxDQUFBO2dCQUNiLENBQUMsQ0FBQyxDQUFBO1lBQ04sQ0FBQztTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCB9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyZUNvbnRleHQsIENvcmVGdW5jdGlvblBhcmFtZXRlcnMsIENvbnRleHQsIEZvcmVpZ25LZXksIGNvcmVGdW5jdGlvblBhcmFtZXRlcnMgfSBmcm9tIFwiYmFja2VuZC1wbHVzXCI7XHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy1jb250YWJsZVwiO1xyXG5pbXBvcnQge2pzb24sIGpzb25vfSBmcm9tIFwicGctcHJvbWlzZS1zdHJpY3RcIjtcclxuaW1wb3J0IHtjaGFuZ2luZywgZGF0ZXRpbWUsIGRhdGUgfSBmcm9tICdiZXN0LWdsb2JhbHMnO1xyXG5cclxuaW1wb3J0IHtwcm9taXNlcyBhcyAgZnN9IGZyb20gXCJmc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tIFwiZG9tYWluXCI7XHJcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG52YXIgc3FsVG9vbHMgPSByZXF1aXJlKCdzcWwtdG9vbHMnKTtcclxudHlwZSBBbnlPYmplY3QgPSB7W2s6c3RyaW5nXTphbnl9XHJcblxyXG5jb25zdCBFU1RBRE9fQUNFUFRBRE9fUFJFU1VQVUVTVE8gID0gJ2FjZXB0YWRvJztcclxuY29uc3QgRVNUQURPX0FOVUxBRE9fUFJFU1VQVUVTVE8gICA9ICdhbnVsYWRvJztcclxuY29uc3QgRVNUQURPX1JFQ0hBWkFET19QUkVTVVBVRVNUTyA9ICdyZWNoYXphZG8nO1xyXG5cclxuZnVuY3Rpb24ganNvbihzcWwsIG9yZGVyYnkpe1xyXG4gICAgcmV0dXJuIGBDT0FMRVNDRSgoU0VMRUNUIGpzb25iX2FnZyh0b19qc29uYihqLiopIE9SREVSIEJZICR7b3JkZXJieX0pIGZyb20gKCR7c3FsfSkgYXMgaiksJ1tdJzo6anNvbmIpYFxyXG59XHJcblxyXG5mdW5jdGlvbiBqc29ubyhzcWwsIGluZGV4ZWRieSl7XHJcbiAgICByZXR1cm4gYENPQUxFU0NFKChTRUxFQ1QganNvbmJfb2JqZWN0X2FnZygke2luZGV4ZWRieX0sdG9fanNvbmIoai4qKSkgZnJvbSAoJHtzcWx9KSBhcyBqKSwne30nOjpqc29uYilgXHJcbn1cclxuXHJcbnZhciBjcmVhdGVTdHJ1Y3R1cmUgPSBmdW5jdGlvbiBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dDpDb250ZXh0LCB0YWJsZU5hbWU6c3RyaW5nKXtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgbWFpblRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbiA9IGJlLnRhYmxlU3RydWN0dXJlc1t0YWJsZU5hbWVdKGNvbnRleHQpO1xyXG4gICAgdmFyIGdldFBrRnJvbVRhYmxlRGVmID0gZnVuY3Rpb24gZ2V0UGtGcm9tVGFibGVEZWYodGFibGVEZWY6VGFibGVEZWZpbml0aW9uKXtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYucHJpbWFyeUtleS5tYXAoZnVuY3Rpb24ocGspe1xyXG4gICAgICAgICAgICByZXR1cm4ge2ZpZWxkTmFtZTpwa307XHJcbiAgICAgICAgfSlcclxuICAgIH07XHJcbiAgICB2YXIgZ2V0RmtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRGa0Zyb21UYWJsZURlZih0YWJsZURlZjpUYWJsZURlZmluaXRpb24pe1xyXG4gICAgICAgIHJldHVybiB0YWJsZURlZi5mb3JlaWduS2V5cy5tYXAoZnVuY3Rpb24oZmspe1xyXG4gICAgICAgICAgICByZXR1cm4gZmsuZmllbGRzXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB2YXIgc3RydWN0PXtcclxuICAgICAgICB0YWJsZU5hbWU6bWFpblRhYmxlRGVmLm5hbWUsXHJcbiAgICAgICAgcGtGaWVsZHM6Z2V0UGtGcm9tVGFibGVEZWYobWFpblRhYmxlRGVmKSxcclxuICAgIH07XHJcbiAgICBzdHJ1Y3QuY2hpbGRUYWJsZXM9W107XHJcbiAgICBpZihtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzICYmIG1haW5UYWJsZURlZi5kZXRhaWxUYWJsZXMubGVuZ3RoKXtcclxuICAgICAgICBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmZvckVhY2goZnVuY3Rpb24oZGV0YWlsVGFibGUpe1xyXG4gICAgICAgICAgICBzdHJ1Y3QuY2hpbGRUYWJsZXMucHVzaChcclxuICAgICAgICAgICAgICAgIGNoYW5naW5nKFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBkZXRhaWxUYWJsZS50YWJsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0RmtGcm9tVGFibGVEZWYoYmUudGFibGVTdHJ1Y3R1cmVzW2RldGFpbFRhYmxlLnRhYmxlXShjb250ZXh0KSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcGVybWl0ZUVkaXRhclByZXN1cHVlc3RvKG5yb1ByZXN1cDpudW1iZXIsIGNsaWVudDpDbGllbnQpe1xyXG4gICAgaWYoIShhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgIHNlbGVjdCAqIFxyXG4gICAgICAgICAgICBmcm9tIHByZXN1cHVlc3RvcyBpbm5lciBqb2luIGVzdGFkb3NfcHJlc3VwdWVzdG8gdXNpbmcgKGVzdGFkbylcclxuICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgYCxbbnJvUHJlc3VwXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpKS5yb3cucGVybWl0ZV9lZGl0YXIpe1xyXG4gICAgICAgIC8vc2kgZWwgZXN0YWRvIG5vIHBlcm1pdGUgZWRpdGFyIHRpcmEgZXJyb3JcclxuICAgICAgICB0aHJvdyBFcnJvciAoJ05vIHNlIHB1ZWRlIGVkaXRhciB5YSBxdWUgc3UgZXN0YWRvIG5vIGxvIHBlcm1pdGUuJykgXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBQcm9jZWR1cmVzQ29udGFibGUgOiBQcm9jZWR1cmVEZWZbXSA9IFtcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlc3RydWN0dXJhX2NyZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcXVlcnkgPWBcclxuICAgICAgICAgICAgICAgIFNFTEVDVCBcclxuICAgICAgICAgICAgICAgICAgICAke2pzb25vKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY2xpZW50ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudGUnXHJcbiAgICAgICAgICAgICAgICAgICAgKX0gYXMgY2xpZW50ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBwLiosIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShpLmNvc3RvX3VuaXRhcmlvKmkudXRpbGlkYWQqcGkuY2FudGlkYWRfaW5zdW1vKSBhcyB0b3RhbF9pbnN1bW9zLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fc2luX2luc3Vtb3MgKyBjb2FsZXNjZShzdW0oaS5jb3N0b191bml0YXJpbyppLnV0aWxpZGFkKnBpLmNhbnRpZGFkX2luc3VtbyksMCkgYXMgcHJlY2lvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHByb2R1Y3RvcyBwIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBwcm9kdWN0b3NfaW5zdW1vcyBwaSB1c2luZyAocHJvZHVjdG8pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBpbnN1bW9zIGkgdXNpbmcgKGluc3VtbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHAucHJvZHVjdG8gPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCBieSBwLnByb2R1Y3RvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhdGVnb3JpYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5ub21icmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZGVzY3JpcGNpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaGFiaWxpdGFkbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5wcmVjaW9fc2luX2luc3Vtb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RvY2tfbWluaW1vLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0b2NrX21heGltbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pdmFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y3RvJ1xyXG4gICAgICAgICAgICAgICAgICAgICl9IGFzIHByb2R1Y3RvcyxcclxuICAgICAgICAgICAgICAgICAgICAke2pzb25vKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY29uZGljaW9uX2l2YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uZGljaW9uJ1xyXG4gICAgICAgICAgICAgICAgICAgICl9IGFzIFwiY29uZGljaW9uZXNJdmFcIixcclxuICAgICAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBlc3RhZG9zX3ByZXN1cHVlc3RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdvcmRlbidcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBcImVzdGFkb3NQcmVzdXB1ZXN0b1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGVzdGFkb3NfcGVkaWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdvcmRlbidcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBcImVzdGFkb3NQZWRpZG9cIixcclxuICAgICAgICAgICAgICAgICAgICAoU0VMRUNUIHRvX2pzb25iKGouKikgXHJcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tIChzZWxlY3QgbGVnYWxlc19wZWRpZG8sIGxlZ2FsZXNfcHJlc3VwdWVzdG8gZnJvbSBwYXJhbWV0cm9zKSBhcyBqKSBhcyBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIGA7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnkpLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvdztcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID1gXHJcbiAgICAgICAgICAgICAgICBTRUxFQ1QgXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHByZXN1cHVlc3RvcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLCd7fSc6Ompzb25iXHJcbiAgICAgICAgICAgICAgICAgICAgKSBhcyBwcmVzdXB1ZXN0byxcclxuICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShcclxuICAgICAgICAgICAgICAgICAgICAgICAgKFNFTEVDVCB0b19qc29uYihqLiopIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBjbGllbnRlcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgY2xpZW50ZSA9IChzZWxlY3QgY2xpZW50ZSBmcm9tIHByZXN1cHVlc3RvcyB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksJ3t9Jzo6anNvbmJcclxuICAgICAgICAgICAgICAgICAgICApIGFzIGNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaXRlbXNfcHJlc3VwdWVzdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ251bWVyb19saW5lYSdcclxuICAgICAgICAgICAgICAgICl9IGFzIFwiaXRlbXNcIlxyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5LFtwYXJhbWV0ZXJzLnByZXN1cHVlc3RvXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncHJlc3VwdWVzdG9fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidwcmVzdXB1ZXN0bycgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICAgICAge25hbWU6J2l0ZW1zJyAgICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonY2xpZW50ZScgICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBwcmVzdXAgPSBwYXJhbWV0ZXJzLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50ZSA9IHBhcmFtZXRlcnMuY2xpZW50ZTtcclxuICAgICAgICAgICAgdmFyIG51bWVyb1ByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJlc3VwdWVzdG9GaWVsZHNTcWwgPSBgKGZlY2hhLCBjbGllbnRlLCBlc3RhZG8sIHZhbGlkb19oYXN0YSwgc3VidG90YWwsIGRlc2N1ZW50bywgdG90YWwsIGNvbl9vcGNpb25lcywgY29uX2Rlc2N1ZW50b19lbl9pdGVtcykgYDtcclxuICAgICAgICAgICAgICAgIHZhciBwcmVzdXB1ZXN0b1ZhbHVlc1NxbCA9IGAoJDEsJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDkpIGA7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJlc3VwdWVzdG9WYWx1ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudGUuY2xpZW50ZSxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAuZXN0YWRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC52YWxpZG9faGFzdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLnN1YnRvdGFsLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5kZXNjdWVudG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLnRvdGFsLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5jb25fb3BjaW9uZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLmNvbl9kZXNjdWVudG9fZW5faXRlbXNcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBpZihwcmVzdXAucHJlc3VwdWVzdG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBlcm1pdGVFZGl0YXJQcmVzdXB1ZXN0byhwcmVzdXAucHJlc3VwdWVzdG8sIGNsaWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJvUHJlc3VwdWVzdG89cHJlc3VwLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgZGVsZXRlIGZyb20gaXRlbXNfcHJlc3VwdWVzdG8gd2hlcmUgcHJlc3VwdWVzdG8gPSAkMWAsW251bWVyb1ByZXN1cHVlc3RvXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgJHtwcmVzdXB1ZXN0b0ZpZWxkc1NxbH0gPSAke3ByZXN1cHVlc3RvVmFsdWVzU3FsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMTBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxwcmVzdXB1ZXN0b1ZhbHVlcy5jb25jYXQocHJlc3VwLnByZXN1cHVlc3RvKSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1ByZXN1cHVlc3RvID0gKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBpbnRvIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3VwdWVzdG9zICR7cHJlc3VwdWVzdG9GaWVsZHNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgJHtwcmVzdXB1ZXN0b1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxwcmVzdXB1ZXN0b1ZhbHVlcykuZmV0Y2hVbmlxdWVSb3coKSkucm93LnByZXN1cHVlc3RvXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgcGFyYW1ldGVycy5pdGVtcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBpdGVtc19wcmVzdXB1ZXN0byAocHJlc3VwdWVzdG8sIGNhbnRpZGFkLCBwcm9kdWN0bywgbm9tYnJlLCBkZXNjcmlwY2lvbiwgcHJlY2lvX3VuaXRhcmlvLCBwb3JjZW50YWplX2Rlc2N1ZW50bywgZGVzY3VlbnRvLCB0b3RhbCkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgKCQxLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCQ5KVxyXG4gICAgICAgICAgICAgICAgICAgIGAsW251bWVyb1ByZXN1cHVlc3RvLCBpdGVtLmNhbnRpZGFkLCBpdGVtLnByb2R1Y3RvLCBpdGVtLm5vbWJyZSwgaXRlbS5kZXNjcmlwY2lvbiwgaXRlbS5wcmVjaW9fdW5pdGFyaW8sIGl0ZW0ucG9yY2VudGFqZV9kZXNjdWVudG8sIGl0ZW0uZGVzY3VlbnRvLCBpdGVtLnRvdGFsXSlcclxuICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJywgcHJlc3VwdWVzdG86IG51bWVyb1ByZXN1cHVlc3RvfTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX2FudWxhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidwcmVzdXB1ZXN0bycgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgZGIgPSAgY29udGV4dC5iZS5kYjtcclxuICAgICAgICAgICAgdmFyIG5yb1ByZXN1cCA9IHBhcmFtZXRlcnMucHJlc3VwdWVzdG87XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHBlcm1pdGVFZGl0YXJQcmVzdXB1ZXN0byhucm9QcmVzdXAsIGNsaWVudCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICBgLFtucm9QcmVzdXAsIEVTVEFET19BTlVMQURPX1BSRVNVUFVFU1RPXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvayd9O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncHJlc3VwdWVzdG9fcmVjaGF6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGRiID0gIGNvbnRleHQuYmUuZGI7XHJcbiAgICAgICAgICAgIHZhciBucm9QcmVzdXAgPSBwYXJhbWV0ZXJzLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8obnJvUHJlc3VwLCBjbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICBgLFtucm9QcmVzdXAsIEVTVEFET19SRUNIQVpBRE9fUFJFU1VQVUVTVE9dKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJ307XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwZWRpZG9fY2FyZ2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidwZWRpZG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID1gXHJcbiAgICAgICAgICAgICAgICBTRUxFQ1QgXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBlZGlkb3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHBlZGlkbyA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIGFzIGpcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsJ3t9Jzo6anNvbmJcclxuICAgICAgICAgICAgICAgICAgICApIGFzIHBlZGlkbyxcclxuICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShcclxuICAgICAgICAgICAgICAgICAgICAgICAgKFNFTEVDVCB0b19qc29uYihqLiopIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBjbGllbnRlcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgY2xpZW50ZSA9IChzZWxlY3QgY2xpZW50ZSBmcm9tIHBlZGlkb3Mgd2hlcmUgcGVkaWRvID0gJDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIGFzIGpcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSwne30nOjpqc29uYlxyXG4gICAgICAgICAgICAgICAgICAgICkgYXMgY2xpZW50ZSxcclxuICAgICAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBpdGVtc19wZWRpZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcGVkaWRvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICdudW1lcm9fbGluZWEnXHJcbiAgICAgICAgICAgICAgICApfSBhcyBcIml0ZW1zXCJcclxuICAgICAgICAgICAgYDtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeSxbcGFyYW1ldGVycy5wZWRpZG9dKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3c7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICAvLyBUT0RPIC0+IHN0b2NrIChwdWVkZSBpciBlbiB0cmlnZ2VyKVxyXG4gICAgICAgIGFjdGlvbjogJ3BlZGlkb19ndWFyZGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3BlZGlkbycgICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonaXRlbXMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOidjbGllbnRlJyAgICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHBlZGlkbyA9IHBhcmFtZXRlcnMucGVkaWRvO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50ZSA9IHBhcmFtZXRlcnMuY2xpZW50ZTtcclxuICAgICAgICAgICAgdmFyIG51bWVyb1BlZGlkbztcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHBlZGlkb0ZpZWxkc1NxbCA9IGAocHJlc3VwdWVzdG8sIGZlY2hhLCBjbGllbnRlLCBlc3RhZG8sIGZlY2hhX2VudHJlZ2EsIHN1YnRvdGFsLCBkZXNjdWVudG8sIHRvdGFsLCBvYnNlcnZhY2lvbmVzKSBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBlZGlkb1ZhbHVlc1NxbCA9IGAoJDEsJDIsJDMsJDQsJDUsJDYsJDcsJDgsICQ5KSBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBlZGlkb1ZhbHVlcyA9IFtcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8ucHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudGUuY2xpZW50ZSxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uZXN0YWRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5mZWNoYV9lbnRyZWdhLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5zdWJ0b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uZGVzY3VlbnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby50b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8ub2JzZXJ2YWNpb25lc1xyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgIGlmKHBlZGlkby5wZWRpZG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1BlZGlkbz1wZWRpZG8ucGVkaWRvO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgZGVsZXRlIGZyb20gaXRlbXNfcGVkaWRvIHdoZXJlIHBlZGlkbyA9ICQxYCxbbnVtZXJvUGVkaWRvXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwZWRpZG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7cGVkaWRvRmllbGRzU3FsfSA9ICR7cGVkaWRvVmFsdWVzU3FsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcGVkaWRvID0gJDEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscGVkaWRvVmFsdWVzLmNvbmNhdChwZWRpZG8ucGVkaWRvKSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5wcmVzdXB1ZXN0bz9hd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8ocGVkaWRvLnByZXN1cHVlc3RvLCBjbGllbnQpOm51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJvUGVkaWRvID0gKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBpbnRvIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVkaWRvcyAke3BlZGlkb0ZpZWxkc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAke3BlZGlkb1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxwZWRpZG9WYWx1ZXMpLmZldGNoVW5pcXVlUm93KCkpLnJvdy5wZWRpZG9cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaXRlbSBvZiBwYXJhbWV0ZXJzLml0ZW1zKXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGl0ZW1zX3BlZGlkbyAocGVkaWRvLCBjYW50aWRhZCwgcHJvZHVjdG8sIG5vbWJyZSwgZGVzY3JpcGNpb24sIHByZWNpb191bml0YXJpbywgcG9yY2VudGFqZV9kZXNjdWVudG8sIGRlc2N1ZW50bywgdG90YWwpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICgkMSwkMiwkMywkNCwkNSwkNiwkNywkOCwkOSlcclxuICAgICAgICAgICAgICAgICAgICBgLFtudW1lcm9QZWRpZG8sIGl0ZW0uY2FudGlkYWQsIGl0ZW0ucHJvZHVjdG8sIGl0ZW0ubm9tYnJlLCBpdGVtLmRlc2NyaXBjaW9uLCBpdGVtLnByZWNpb191bml0YXJpbywgaXRlbS5wb3JjZW50YWplX2Rlc2N1ZW50bywgaXRlbS5kZXNjdWVudG8sIGl0ZW0udG90YWxdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZihwZWRpZG8ucHJlc3VwdWVzdG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxbRVNUQURPX0FDRVBUQURPX1BSRVNVUFVFU1RPLCBwZWRpZG8ucHJlc3VwdWVzdG9dKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBwcmVzdXB1ZXN0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGVkaWRvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxbcGVkaWRvLnByZXN1cHVlc3RvXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgRWwgcHJlc3VwdWVzdG8gJHtwZWRpZG8ucHJlc3VwdWVzdG99IHlhIHRpZW5lIHVuIHBlZGlkbyBjcmVhZG8uIGAgKyBlcnIubWVzc2FnZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge2VzdGFkbzonb2snLCBwZWRpZG86IG51bWVyb1BlZGlkb307XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwcm9kdWN0b19jbG9uYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJvZHVjdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHByb2R1Y3RvID0gcGFyYW1ldGVycy5wcm9kdWN0bztcclxuXHJcbiAgICAgICAgICAgIC8vY2xvbmFjaW9uIHByb2R1Y3RvXHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b0FDbG9uYXIgPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBzZWxlY3QgKiBmcm9tIHByb2R1Y3RvcyB3aGVyZSBwcm9kdWN0byA9ICQxYCxbcHJvZHVjdG9dKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcbiAgICAgICAgICAgIGRlbGV0ZShwcm9kdWN0b0FDbG9uYXIucHJvZHVjdG8pO1xyXG4gICAgICAgICAgICBkZWxldGUocHJvZHVjdG9BQ2xvbmFyLnN0b2NrKTtcclxuICAgICAgICAgICAgZGVsZXRlKHByb2R1Y3RvQUNsb25hci5zdG9ja19taW5pbW8pO1xyXG4gICAgICAgICAgICBkZWxldGUocHJvZHVjdG9BQ2xvbmFyLnN0b2NrX21heGltbyk7XHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b0tleXM9W107XHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b1ZhbHVlcz1bXTtcclxuICAgICAgICAgICAgZm9yKGxldCBrZXkgaW4gcHJvZHVjdG9BQ2xvbmFyKXtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RvS2V5cy5wdXNoKGJlLmRiLnF1b3RlSWRlbnQoa2V5KSk7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1ZhbHVlcy5wdXNoKGJlLmRiLnF1b3RlTnVsbGFibGUocHJvZHVjdG9BQ2xvbmFyW2tleV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9OdWV2byA9IChhd2FpdCBjbGllbnQucXVlcnkoYGluc2VydCBpbnRvIHByb2R1Y3RvcyAoJHtwcm9kdWN0b0tleXMuam9pbignLCcpfSkgdmFsdWVzICgke3Byb2R1Y3RvVmFsdWVzLmpvaW4oJywnKX0pIHJldHVybmluZyAqYCxbXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93XHJcbiAgICAgICAgICAgIC8vY2xvbmFjaW9uIGluc3Vtb3NcclxuICAgICAgICAgICAgdmFyIHByb2R1Y3Rvc0luc3Vtb3NBQ2xvbmFyID0gKGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSBwcm9kdWN0b3NfaW5zdW1vcyB3aGVyZSBwcm9kdWN0byA9ICQxYCxbcHJvZHVjdG9dKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG4gICAgICAgICAgICB2YXIgcHJvZEluc3Vtb3NOdWV2b3M9W107XHJcbiAgICAgICAgICAgIGZvcih2YXIgcHJvZEluc3VtbyBvZiBwcm9kdWN0b3NJbnN1bW9zQUNsb25hcil7XHJcbiAgICAgICAgICAgICAgICBwcm9kSW5zdW1vLnByb2R1Y3RvPXByb2R1Y3RvTnVldm8ucHJvZHVjdG87XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvZEluc3Vtb0tleXM9W107XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvZEluc3Vtb1ZhbHVlcz1bXTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQga2V5IGluIHByb2RJbnN1bW8pe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RJbnN1bW9LZXlzLnB1c2goYmUuZGIucXVvdGVJZGVudChrZXkpKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kSW5zdW1vVmFsdWVzLnB1c2goYmUuZGIucXVvdGVOdWxsYWJsZShwcm9kSW5zdW1vW2tleV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb2RJbnN1bW9zTnVldm9zLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBpbnRvIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zX2luc3Vtb3MgKCR7cHJvZEluc3Vtb0tleXMuam9pbignLCcpfSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgKCR7cHJvZEluc3Vtb1ZhbHVlcy5qb2luKCcsJyl9KSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxbXSkuZmV0Y2hVbmlxdWVSb3coKVxyXG4gICAgICAgICAgICAgICAgICAgICkucm93XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJywgcHJvZHVjdG9OdWV2bywgcHJvZEluc3Vtb3NOdWV2b3N9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnb2JqZWN0X2dldCcsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZTondGFibGVuYW1lJyAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZToncGtfdmFsdWVzJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcXVlcnkgPSBzcWxUb29scy5zdHJ1Y3R1cmVkRGF0YS5zcWxSZWFkKHBhcmFtZXRlcnMucGtfdmFsdWVzLCBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgcGFyYW1ldGVycy50YWJsZW5hbWUpKTtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeSkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonb2JqZWN0X3NhdmUnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTondGFibGVuYW1lJyAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2RhdG9zJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBxdWVyaWVzID0gc3FsVG9vbHMuc3RydWN0dXJlZERhdGEuc3FsV3JpdGUocGFyYW1ldGVycy5kYXRvcywgY3JlYXRlU3RydWN0dXJlKGNvbnRleHQsIHBhcmFtZXRlcnMudGFibGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiIyMjIyMjIyMjIyMjI1wiLHF1ZXJpZXMpXHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBxdWVyaWVzLnJlZHVjZShmdW5jdGlvbihwcm9taXNlOlByb21pc2U8YW55PiwgcXVlcnk6c3RyaW5nKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5xdWVyeShxdWVyeSkuZXhlY3V0ZSgpLnRoZW4oZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSxQcm9taXNlLnJlc29sdmUoKSkudGhlbihhc3luYyBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0cmFlciBqc29uIHJlZnJlc2NhZG9cclxuICAgICAgICAgICAgICAgIC8vdmFyIHJlc3VsdCA9IGF3YWl0IGJlLnByb2NlZHVyZS5vYmplY3RfZ2V0LmNvcmVGdW5jdGlvbihjb250ZXh0LCB7dGFibGVuYW1lOnBhcmFtZXRlcnMudGFibGVuYW1lLCB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnI6RXJyb3Ipe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFTlRSQSBFTiBFTCBDQVRDSDogXCIsZXJyKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXTsiXX0=
@@ -1,29 +0,0 @@
1
- (function (factory) {
2
- if (typeof module === "object" && typeof module.exports === "object") {
3
- var v = factory(require, exports);
4
- if (v !== undefined) module.exports = v;
5
- }
6
- else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports"], factory);
8
- }
9
- })(function (require, exports) {
10
- "use strict";
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.categorias_producto = categorias_producto;
13
- function categorias_producto(context) {
14
- var admin = context.user.rol === 'admin';
15
- return {
16
- name: 'categorias_producto',
17
- allow: {
18
- "vertical-edit": false,
19
- },
20
- editable: admin,
21
- fields: [
22
- { name: 'categoria', typeName: 'text', nullable: false },
23
- { name: 'nombre', typeName: 'text', isName: true, nullable: false },
24
- ],
25
- primaryKey: ['categoria']
26
- };
27
- }
28
- });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvdGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7SUFBQSxZQUFZLENBQUM7O0lBSWIsa0RBY0M7SUFkRCxTQUFnQixtQkFBbUIsQ0FBQyxPQUFvQjtRQUNwRCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBRyxPQUFPLENBQUM7UUFDdkMsT0FBTztZQUNILElBQUksRUFBQyxxQkFBcUI7WUFDMUIsS0FBSyxFQUFDO2dCQUNGLGVBQWUsRUFBQyxLQUFLO2FBQ3hCO1lBQ0QsUUFBUSxFQUFDLEtBQUs7WUFDZCxNQUFNLEVBQUM7Z0JBQ0gsRUFBQyxJQUFJLEVBQUMsV0FBVyxFQUFLLFFBQVEsRUFBQyxNQUFNLEVBQUcsUUFBUSxFQUFDLEtBQUssRUFBQztnQkFDdkQsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFRLFFBQVEsRUFBQyxNQUFNLEVBQUcsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsS0FBSyxFQUFDO2FBQ3ZFO1lBQ0QsVUFBVSxFQUFDLENBQUMsV0FBVyxDQUFDO1NBQzNCLENBQUM7SUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7VGFibGVEZWZpbml0aW9uLCBUYWJsZUNvbnRleHR9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpYXNfcHJvZHVjdG8oY29udGV4dDpUYWJsZUNvbnRleHQpOlRhYmxlRGVmaW5pdGlvbntcbiAgICB2YXIgYWRtaW4gPSBjb250ZXh0LnVzZXIucm9sPT09J2FkbWluJztcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOidjYXRlZ29yaWFzX3Byb2R1Y3RvJyxcbiAgICAgICAgYWxsb3c6e1xuICAgICAgICAgICAgXCJ2ZXJ0aWNhbC1lZGl0XCI6ZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGVkaXRhYmxlOmFkbWluLFxuICAgICAgICBmaWVsZHM6W1xuICAgICAgICAgICAge25hbWU6J2NhdGVnb3JpYScgICAsIHR5cGVOYW1lOid0ZXh0JyAsIG51bGxhYmxlOmZhbHNlfSxcbiAgICAgICAgICAgIHtuYW1lOidub21icmUnICAgICAgLCB0eXBlTmFtZTondGV4dCcgLCBpc05hbWU6dHJ1ZSwgbnVsbGFibGU6ZmFsc2V9LFxuICAgICAgICBdLFxuICAgICAgICBwcmltYXJ5S2V5OlsnY2F0ZWdvcmlhJ11cbiAgICB9O1xufVxuIl19