contable 0.0.1

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 (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/client/client.js +259 -0
  4. package/dist/client/img/bannersuperior.png +0 -0
  5. package/dist/client/menu.js +3 -0
  6. package/dist/client/redux-formulario.js +379 -0
  7. package/dist/client/render-components.js +750 -0
  8. package/dist/client/render-components.tsx +1117 -0
  9. package/dist/client/render-formulario.js +56 -0
  10. package/dist/client/render-formulario.tsx +72 -0
  11. package/dist/client/render-general.js +197 -0
  12. package/dist/client/render-general.tsx +212 -0
  13. package/dist/client/render-handlers.js +69 -0
  14. package/dist/client/tipos.js +13 -0
  15. package/dist/client/tsconfig.json +12 -0
  16. package/dist/server/app-contable.js +174 -0
  17. package/dist/server/def-config.js +100 -0
  18. package/dist/server/procedures-contable.js +508 -0
  19. package/dist/server/server-contable.js +17 -0
  20. package/dist/server/table-categorias_producto.js +29 -0
  21. package/dist/server/table-clientes.js +56 -0
  22. package/dist/server/table-condicion_iva.js +29 -0
  23. package/dist/server/table-estados_pedido.js +33 -0
  24. package/dist/server/table-estados_presupuesto.js +34 -0
  25. package/dist/server/table-insumos.js +44 -0
  26. package/dist/server/table-items_pedido.js +48 -0
  27. package/dist/server/table-items_presupuesto.js +48 -0
  28. package/dist/server/table-iva_productos.js +29 -0
  29. package/dist/server/table-parametros.js +38 -0
  30. package/dist/server/table-pedidos.js +48 -0
  31. package/dist/server/table-pedidos_pendientes.js +28 -0
  32. package/dist/server/table-pedidos_vencidos.js +28 -0
  33. package/dist/server/table-presupuestos.js +56 -0
  34. package/dist/server/table-productos.js +70 -0
  35. package/dist/server/table-productos_clientes.js +22 -0
  36. package/dist/server/table-productos_generales.js +22 -0
  37. package/dist/server/table-productos_insumos.js +47 -0
  38. package/dist/server/table-usuarios.js +44 -0
  39. package/dist/server/tsconfig.json +10 -0
  40. package/dist/server/types-contable.js +28 -0
  41. package/dist/unlogged/adapt.js +8 -0
  42. package/dist/unlogged/css/styles.styl +88 -0
  43. package/dist/unlogged/img/login-logo-icon.png.png +0 -0
  44. package/dist/unlogged/img/logo.png +0 -0
  45. package/dist/unlogged/tsconfig.json +15 -0
  46. package/dist/unlogged/unlogged.js +205 -0
  47. package/install/categorias_producto.tab +2 -0
  48. package/install/condicion_iva.tab +3 -0
  49. package/install/estados_pedido.tab +5 -0
  50. package/install/estados_presupuesto.tab +5 -0
  51. package/install/iva_productos.tab +3 -0
  52. package/install/productos.tab +2 -0
  53. package/install/usuarios.tab +2 -0
  54. package/package.json +58 -0
  55. package/unlogged/img/main-loading.gif +0 -0
  56. package/unlogged/main-loading.gif +0 -0
  57. package/unlogged/my-skin.js +0 -0
@@ -0,0 +1,508 @@
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=
@@ -0,0 +1,17 @@
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", "backend-plus", "./app-contable"], factory);
8
+ }
9
+ })(function (require, exports) {
10
+ "use strict";
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const backend_plus_1 = require("backend-plus");
13
+ const app_contable_1 = require("./app-contable");
14
+ var AppContable = (0, app_contable_1.emergeAppContable)(backend_plus_1.AppBackend);
15
+ new AppContable().start();
16
+ });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNvbnRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zZXJ2ZXItY29udGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOztJQUViLCtDQUEwQztJQUMxQyxpREFBbUQ7SUFFbkQsSUFBSSxXQUFXLEdBQUcsSUFBQSxnQ0FBaUIsRUFBQyx5QkFBVSxDQUFDLENBQUM7SUFFaEQsSUFBSSxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgQXBwQmFja2VuZCB9IGZyb20gXCJiYWNrZW5kLXBsdXNcIjtcclxuaW1wb3J0IHsgZW1lcmdlQXBwQ29udGFibGUgfSBmcm9tIFwiLi9hcHAtY29udGFibGVcIjtcclxuXHJcbnZhciBBcHBDb250YWJsZSA9IGVtZXJnZUFwcENvbnRhYmxlKEFwcEJhY2tlbmQpO1xyXG5cclxubmV3IEFwcENvbnRhYmxlKCkuc3RhcnQoKTtcclxuXHJcbiJdfQ==
@@ -0,0 +1,29 @@
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