contable 0.0.1 → 0.0.2

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 (44) hide show
  1. package/dist/client/client.d.ts +1 -0
  2. package/dist/client/client.js +63 -140
  3. package/dist/client/menu.d.ts +0 -0
  4. package/dist/client/redux-formulario.d.ts +477 -0
  5. package/dist/client/redux-formulario.js +236 -289
  6. package/dist/client/render-components.d.ts +66 -0
  7. package/dist/client/render-components.js +293 -426
  8. package/dist/client/render-formulario.d.ts +1 -0
  9. package/dist/client/render-formulario.js +4 -4
  10. package/dist/client/render-general.d.ts +124 -0
  11. package/dist/client/render-general.js +38 -63
  12. package/dist/client/render-handlers.d.ts +1 -0
  13. package/dist/client/render-handlers.js +14 -54
  14. package/dist/client/tipos.d.ts +119 -0
  15. package/dist/client/tsconfig.json +3 -1
  16. package/dist/server/app-contable.d.ts +118 -0
  17. package/dist/server/def-config.d.ts +1 -0
  18. package/dist/server/procedures-contable.d.ts +3 -0
  19. package/dist/server/server-contable.d.ts +1 -0
  20. package/dist/server/table-categorias_producto.d.ts +2 -0
  21. package/dist/server/table-clientes.d.ts +2 -0
  22. package/dist/server/table-condicion_iva.d.ts +2 -0
  23. package/dist/server/table-estados_pedido.d.ts +2 -0
  24. package/dist/server/table-estados_presupuesto.d.ts +2 -0
  25. package/dist/server/table-insumos.d.ts +2 -0
  26. package/dist/server/table-items_pedido.d.ts +2 -0
  27. package/dist/server/table-items_presupuesto.d.ts +2 -0
  28. package/dist/server/table-iva_productos.d.ts +2 -0
  29. package/dist/server/table-parametros.d.ts +2 -0
  30. package/dist/server/table-pedidos.d.ts +2 -0
  31. package/dist/server/table-pedidos_pendientes.d.ts +2 -0
  32. package/dist/server/table-pedidos_vencidos.d.ts +2 -0
  33. package/dist/server/table-presupuestos.d.ts +2 -0
  34. package/dist/server/table-productos.d.ts +2 -0
  35. package/dist/server/table-productos_clientes.d.ts +2 -0
  36. package/dist/server/table-productos_generales.d.ts +2 -0
  37. package/dist/server/table-productos_insumos.d.ts +2 -0
  38. package/dist/server/table-usuarios.d.ts +2 -0
  39. package/dist/server/types-contable.d.ts +29 -0
  40. package/dist/unlogged/adapt.d.ts +0 -0
  41. package/dist/unlogged/tsconfig.json +1 -1
  42. package/dist/unlogged/unlogged.d.ts +1 -0
  43. package/dist/unlogged/unlogged.js +83 -170
  44. package/package.json +1 -1
@@ -1,50 +1,3 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
- return new (P || (P = Promise))(function (resolve, reject) {
15
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
- step((generator = generator.apply(thisArg, _arguments || [])).next());
19
- });
20
- };
21
- var __generator = (this && this.__generator) || function (thisArg, body) {
22
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
- function verb(n) { return function (v) { return step([n, v]); }; }
25
- function step(op) {
26
- if (f) throw new TypeError("Generator is already executing.");
27
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
- if (y = 0, t) op = [op[0] & 2, t.value];
30
- switch (op[0]) {
31
- case 0: case 1: t = op; break;
32
- case 4: _.label++; return { value: op[1], done: false };
33
- case 5: _.label++; y = op[1]; op = [0]; continue;
34
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
- default:
36
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
- if (t[2]) _.ops.pop();
41
- _.trys.pop(); continue;
42
- }
43
- op = body.call(thisArg, _);
44
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
- }
47
- };
48
1
  (function (factory) {
49
2
  if (typeof module === "object" && typeof module.exports === "object") {
50
3
  var v = factory(require, exports);
@@ -66,10 +19,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
66
19
  exports.createInitialStatePresupuesto = createInitialStatePresupuesto;
67
20
  exports.createInitialStatePedido = createInitialStatePedido;
68
21
  exports.crearStore = crearStore;
69
- var redux_1 = require("redux");
70
- var redux_typed_reducer_1 = require("redux-typed-reducer");
71
- var best_globals_1 = require("best-globals");
72
- var ESTADO_INICIAL_PEDIDO = "preparacion";
22
+ const redux_1 = require("redux");
23
+ const redux_typed_reducer_1 = require("redux-typed-reducer");
24
+ const best_globals_1 = require("best-globals");
25
+ const ESTADO_INICIAL_PEDIDO = "preparacion";
73
26
  var my = myOwn;
74
27
  exports.STORAGE_STATE_NAME = 'contable_state';
75
28
  function crearItem() {
@@ -80,214 +33,235 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
80
33
  }
81
34
  function calcularTotalLinea(item) {
82
35
  if (item.cantidad && item.precio_unitario) {
83
- var subtotal = item.cantidad * item.precio_unitario;
84
- var descuento = parseFloat((item.porcentaje_descuento ? subtotal / 100 * item.porcentaje_descuento : 0).toFixed(2));
85
- var total = parseFloat((subtotal - descuento).toFixed(2));
86
- return { descuento: descuento, total: total };
36
+ let subtotal = item.cantidad * item.precio_unitario;
37
+ let descuento = parseFloat((item.porcentaje_descuento ? subtotal / 100 * item.porcentaje_descuento : 0).toFixed(2));
38
+ let total = parseFloat((subtotal - descuento).toFixed(2));
39
+ return { descuento, total };
87
40
  }
88
41
  else {
89
42
  return { descuento: undefined, total: undefined };
90
43
  }
91
44
  }
92
45
  function calcularTotales(items, datos, datosDesde) {
93
- var pedidoOpresupuestoIndex = datosDesde == "datosPedido" ? 'pedido' : 'presupuesto';
46
+ let pedidoOpresupuestoIndex = datosDesde == "datosPedido" ? 'pedido' : 'presupuesto';
94
47
  //@ts-ignore estoy seguro que llega bien
95
- var pedidoOpresupuesto = datos[pedidoOpresupuestoIndex];
96
- pedidoOpresupuesto.subtotal = items.reduce(function (acum, item) { return acum + (item.total || 0); }, 0);
48
+ let pedidoOpresupuesto = datos[pedidoOpresupuestoIndex];
49
+ pedidoOpresupuesto.subtotal = items.reduce((acum, item) => acum + (item.total || 0), 0);
97
50
  pedidoOpresupuesto.descuento = pedidoOpresupuesto.descuento || 0;
98
51
  pedidoOpresupuesto.total = pedidoOpresupuesto.subtotal - (pedidoOpresupuesto.descuento || 0);
99
52
  }
100
53
  var reducers = {
101
- SET_OPCION: function (payload) {
102
- return function (state) {
103
- var _a;
104
- return __assign(__assign({}, state), { opciones: __assign(__assign({}, state.opciones), (_a = {}, _a[payload.opcion] = payload.valor, _a)) });
54
+ SET_OPCION: (payload) => function (state) {
55
+ return {
56
+ ...state,
57
+ opciones: {
58
+ ...state.opciones,
59
+ [payload.opcion]: payload.valor
60
+ }
105
61
  };
106
62
  },
107
- SET_CLIENTE: function (payload) {
108
- return function (state) {
109
- var _a;
110
- return __assign(__assign({}, state), (_a = {}, _a[payload.datosDesde] = __assign(__assign({}, state[payload.datosDesde]), { cliente: payload.cliente }), _a));
63
+ SET_CLIENTE: (payload) => function (state) {
64
+ return {
65
+ ...state,
66
+ [payload.datosDesde]: {
67
+ ...state[payload.datosDesde],
68
+ cliente: payload.cliente
69
+ }
111
70
  };
112
71
  },
113
- ADD_ITEM: function (payload) {
114
- return function (state) {
115
- var _a;
116
- var items = state[payload.datosDesde].items;
117
- items.push(crearItem());
118
- calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
119
- return __assign(__assign({}, state), (_a = {}, _a[payload.datosDesde] = __assign(__assign({}, state[payload.datosDesde]), { items: items }), _a));
72
+ ADD_ITEM: (payload) => function (state) {
73
+ var items = state[payload.datosDesde].items;
74
+ items.push(crearItem());
75
+ calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
76
+ return {
77
+ ...state,
78
+ [payload.datosDesde]: {
79
+ ...state[payload.datosDesde],
80
+ items: items
81
+ }
120
82
  };
121
83
  },
122
- REMOVE_ITEM: function (payload) {
123
- return function (state) {
124
- var _a;
125
- var items = state[payload.datosDesde].items;
126
- items.splice(payload.index, 1);
127
- calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
128
- if (items.length == 0) {
129
- items.push(crearItem());
84
+ REMOVE_ITEM: (payload) => function (state) {
85
+ var items = state[payload.datosDesde].items;
86
+ items.splice(payload.index, 1);
87
+ calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
88
+ if (items.length == 0) {
89
+ items.push(crearItem());
90
+ }
91
+ return {
92
+ ...state,
93
+ [payload.datosDesde]: {
94
+ ...state[payload.datosDesde],
95
+ items: items
130
96
  }
131
- return __assign(__assign({}, state), (_a = {}, _a[payload.datosDesde] = __assign(__assign({}, state[payload.datosDesde]), { items: items }), _a));
132
97
  };
133
98
  },
134
- SET_PRODUCTO_ITEM: function (payload) {
135
- return function (state) {
136
- var _a;
137
- var index = payload.index, producto = payload.producto;
138
- var items = state[payload.datosDesde].items;
139
- items[index].producto = producto ? producto.producto : undefined;
140
- items[index].nombre = producto ? producto.nombre : undefined;
141
- items[index].descripcion = producto ? producto.descripcion : undefined;
142
- items[index].precio_unitario = producto ? producto.precio : undefined;
143
- var _b = calcularTotalLinea(items[index]), descuento = _b.descuento, total = _b.total;
144
- items[index].descuento = descuento;
145
- items[index].total = total;
146
- calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
147
- return __assign(__assign({}, state), (_a = {}, _a[payload.datosDesde] = __assign(__assign({}, state[payload.datosDesde]), { items: items }), _a));
99
+ SET_PRODUCTO_ITEM: (payload) => function (state) {
100
+ let { index, producto } = payload;
101
+ let items = state[payload.datosDesde].items;
102
+ items[index].producto = producto ? producto.producto : undefined;
103
+ items[index].nombre = producto ? producto.nombre : undefined;
104
+ items[index].descripcion = producto ? producto.descripcion : undefined;
105
+ items[index].precio_unitario = producto ? producto.precio : undefined;
106
+ let { descuento, total } = calcularTotalLinea(items[index]);
107
+ items[index].descuento = descuento;
108
+ items[index].total = total;
109
+ calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
110
+ return {
111
+ ...state,
112
+ [payload.datosDesde]: {
113
+ ...state[payload.datosDesde],
114
+ items: items
115
+ }
148
116
  };
149
117
  },
150
- SET_FIELD_CUSTOM_ITEM: function (payload) {
151
- return function (state) {
152
- var _a;
153
- var index = payload.index, campo = payload.campo, valor = payload.valor;
154
- var items = state[payload.datosDesde].items;
155
- // @ts-ignore que el indice y el campo existen
156
- items[index][campo] = valor;
157
- var _b = calcularTotalLinea(items[index]), descuento = _b.descuento, total = _b.total;
158
- items[index].descuento = descuento;
159
- items[index].total = total;
160
- calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
161
- return __assign(__assign({}, state), (_a = {}, _a[payload.datosDesde] = __assign(__assign({}, state[payload.datosDesde]), { items: items }), _a));
118
+ SET_FIELD_CUSTOM_ITEM: (payload) => function (state) {
119
+ let { index, campo, valor } = payload;
120
+ let items = state[payload.datosDesde].items;
121
+ // @ts-ignore que el indice y el campo existen
122
+ items[index][campo] = valor;
123
+ let { descuento, total } = calcularTotalLinea(items[index]);
124
+ items[index].descuento = descuento;
125
+ items[index].total = total;
126
+ calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
127
+ return {
128
+ ...state,
129
+ [payload.datosDesde]: {
130
+ ...state[payload.datosDesde],
131
+ items: items
132
+ }
162
133
  };
163
134
  },
164
- SET_CANTIDAD_ITEM: function (payload) {
165
- return function (state) {
166
- var _a;
167
- var index = payload.index, cantidad = payload.cantidad;
168
- var items = state[payload.datosDesde].items;
169
- items[index].cantidad = cantidad || undefined;
170
- var _b = calcularTotalLinea(items[index]), descuento = _b.descuento, total = _b.total;
171
- items[index].descuento = descuento;
172
- items[index].total = total;
173
- calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
174
- return __assign(__assign({}, state), (_a = {}, _a[payload.datosDesde] = __assign(__assign({}, state[payload.datosDesde]), { items: items }), _a));
135
+ SET_CANTIDAD_ITEM: (payload) => function (state) {
136
+ let { index, cantidad } = payload;
137
+ let items = state[payload.datosDesde].items;
138
+ items[index].cantidad = cantidad || undefined;
139
+ let { descuento, total } = calcularTotalLinea(items[index]);
140
+ items[index].descuento = descuento;
141
+ items[index].total = total;
142
+ calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
143
+ return {
144
+ ...state,
145
+ [payload.datosDesde]: {
146
+ ...state[payload.datosDesde],
147
+ items: items
148
+ }
175
149
  };
176
150
  },
177
- SET_DESCUENTO_ITEM: function (payload) {
178
- return function (state) {
179
- var _a;
180
- var index = payload.index, porcentaje = payload.porcentaje;
181
- var items = state[payload.datosDesde].items;
182
- items[index].porcentaje_descuento = porcentaje;
183
- var _b = calcularTotalLinea(items[index]), descuento = _b.descuento, total = _b.total;
184
- items[index].descuento = descuento;
185
- items[index].total = total;
186
- calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
187
- return __assign(__assign({}, state), (_a = {}, _a[payload.datosDesde] = __assign(__assign({}, state[payload.datosDesde]), { items: items }), _a));
151
+ SET_DESCUENTO_ITEM: (payload) => function (state) {
152
+ let { index, porcentaje } = payload;
153
+ let items = state[payload.datosDesde].items;
154
+ items[index].porcentaje_descuento = porcentaje;
155
+ let { descuento, total } = calcularTotalLinea(items[index]);
156
+ items[index].descuento = descuento;
157
+ items[index].total = total;
158
+ calcularTotales(items, state[payload.datosDesde], payload.datosDesde);
159
+ return {
160
+ ...state,
161
+ [payload.datosDesde]: {
162
+ ...state[payload.datosDesde],
163
+ items: items
164
+ }
188
165
  };
189
166
  },
190
- SET_DESCUENTO_PRESUPUESTO: function (payload) {
191
- return function (state) {
192
- var descuento = payload.descuento;
193
- var items = state.datosPresupuesto.items;
194
- var myState = __assign(__assign({}, state), { datosPresupuesto: __assign(__assign({}, state.datosPresupuesto), { presupuesto: __assign(__assign({}, state.datosPresupuesto.presupuesto), { descuento: descuento }) }) });
195
- calcularTotales(items, myState.datosPresupuesto, 'datosPresupuesto');
196
- return myState;
167
+ SET_DESCUENTO_PRESUPUESTO: (payload) => function (state) {
168
+ var { descuento } = payload;
169
+ var items = state.datosPresupuesto.items;
170
+ var myState = {
171
+ ...state,
172
+ datosPresupuesto: {
173
+ ...state.datosPresupuesto,
174
+ presupuesto: {
175
+ ...state.datosPresupuesto.presupuesto,
176
+ descuento: descuento
177
+ }
178
+ }
197
179
  };
180
+ calcularTotales(items, myState.datosPresupuesto, 'datosPresupuesto');
181
+ return myState;
198
182
  },
199
- SET_DESCUENTO_PEDIDO: function (payload) {
200
- return function (state) {
201
- var descuento = payload.descuento;
202
- var items = state.datosPedido.items;
203
- var myState = __assign(__assign({}, state), { datosPedido: __assign(__assign({}, state.datosPedido), { pedido: __assign(__assign({}, state.datosPedido.pedido), { descuento: descuento }) }) });
204
- calcularTotales(items, myState.datosPedido, 'datosPedido');
205
- return myState;
183
+ SET_DESCUENTO_PEDIDO: (payload) => function (state) {
184
+ var { descuento } = payload;
185
+ var items = state.datosPedido.items;
186
+ var myState = {
187
+ ...state,
188
+ datosPedido: {
189
+ ...state.datosPedido,
190
+ pedido: {
191
+ ...state.datosPedido.pedido,
192
+ descuento: descuento
193
+ }
194
+ }
206
195
  };
196
+ calcularTotales(items, myState.datosPedido, 'datosPedido');
197
+ return myState;
207
198
  },
208
- SET_CAMPO_PRESUPUESTO: function (payload) {
209
- return function (state) {
210
- var _a;
211
- var campo = payload.campo, valor = payload.valor;
212
- return __assign(__assign({}, state), { datosPresupuesto: __assign(__assign({}, state.datosPresupuesto), { presupuesto: __assign(__assign({}, state.datosPresupuesto.presupuesto), (_a = {}, _a[campo] = valor, _a)) }) });
199
+ SET_CAMPO_PRESUPUESTO: (payload) => function (state) {
200
+ var { campo, valor } = payload;
201
+ return {
202
+ ...state,
203
+ datosPresupuesto: {
204
+ ...state.datosPresupuesto,
205
+ presupuesto: {
206
+ ...state.datosPresupuesto.presupuesto,
207
+ [campo]: valor
208
+ }
209
+ }
213
210
  };
214
211
  },
215
- SET_CAMPO_PEDIDO: function (payload) {
216
- return function (state) {
217
- var _a;
218
- var campo = payload.campo, valor = payload.valor;
219
- return __assign(__assign({}, state), { datosPedido: __assign(__assign({}, state.datosPedido), { pedido: __assign(__assign({}, state.datosPedido.pedido), (_a = {}, _a[campo] = valor, _a)) }) });
212
+ SET_CAMPO_PEDIDO: (payload) => function (state) {
213
+ var { campo, valor } = payload;
214
+ return {
215
+ ...state,
216
+ datosPedido: {
217
+ ...state.datosPedido,
218
+ pedido: {
219
+ ...state.datosPedido.pedido,
220
+ [campo]: valor
221
+ }
222
+ }
220
223
  };
221
224
  },
222
- RESET_OPCIONES: function (_payload) {
223
- return function (state) {
224
- return __assign(__assign({}, state), { opciones: __assign({}, state.opciones) });
225
+ RESET_OPCIONES: (_payload) => function (state) {
226
+ return {
227
+ ...state,
228
+ opciones: {
229
+ ...state.opciones,
230
+ }
225
231
  };
226
232
  },
227
233
  };
228
234
  /* FIN ACCIONES */
229
235
  exports.dispatchers = (0, redux_typed_reducer_1.createDispatchers)(reducers);
230
- function traerEstructura() {
231
- return __awaiter(this, void 0, void 0, function () {
232
- var estructura;
233
- return __generator(this, function (_a) {
234
- switch (_a.label) {
235
- case 0: return [4 /*yield*/, my.ajax.estructura_crear()];
236
- case 1:
237
- estructura = _a.sent();
238
- return [2 /*return*/, estructura];
239
- }
240
- });
241
- });
236
+ async function traerEstructura() {
237
+ var estructura = await my.ajax.estructura_crear();
238
+ return estructura;
242
239
  }
243
- function guardarPresupuesto(cliente, presupuesto, items) {
244
- return __awaiter(this, void 0, void 0, function () {
245
- return __generator(this, function (_a) {
246
- switch (_a.label) {
247
- case 0: return [4 /*yield*/, my.ajax.presupuesto_guardar({ cliente: cliente, presupuesto: presupuesto, items: items })];
248
- case 1: return [2 /*return*/, _a.sent()];
249
- }
250
- });
251
- });
240
+ async function guardarPresupuesto(cliente, presupuesto, items) {
241
+ return await my.ajax.presupuesto_guardar({ cliente, presupuesto, items });
252
242
  }
253
- function guardarPedido(cliente, pedido, items) {
254
- return __awaiter(this, void 0, void 0, function () {
255
- return __generator(this, function (_a) {
256
- switch (_a.label) {
257
- case 0: return [4 /*yield*/, my.ajax.pedido_guardar({ cliente: cliente, pedido: pedido, items: items })];
258
- case 1: return [2 /*return*/, _a.sent()];
259
- }
260
- });
261
- });
243
+ async function guardarPedido(cliente, pedido, items) {
244
+ return await my.ajax.pedido_guardar({ cliente, pedido, items });
262
245
  }
263
- function createInitialStatePresupuesto() {
264
- return __awaiter(this, void 0, void 0, function () {
265
- var estructura, initialState;
266
- return __generator(this, function (_a) {
267
- switch (_a.label) {
268
- case 0: return [4 /*yield*/, traerEstructura()];
269
- case 1:
270
- estructura = _a.sent();
271
- initialState = {
272
- estructura: estructura,
273
- datosPresupuesto: {
274
- cliente: {},
275
- items: [crearItem()],
276
- presupuesto: {
277
- estado: "espera",
278
- fecha: best_globals_1.datetime.now().toYmd(),
279
- //@ts-ignore se puede llamar
280
- valido_hasta: (best_globals_1.datetime.now().add((0, best_globals_1.timeInterval)({ days: 7 }))).toYmd(),
281
- }
282
- },
283
- opciones: {},
284
- };
285
- return [2 /*return*/, initialState];
246
+ async function createInitialStatePresupuesto() {
247
+ var estructura = await traerEstructura();
248
+ var initialState = {
249
+ estructura,
250
+ datosPresupuesto: {
251
+ cliente: {},
252
+ items: [crearItem()],
253
+ presupuesto: {
254
+ estado: "espera",
255
+ fecha: best_globals_1.datetime.now().toYmd(),
256
+ //@ts-ignore se puede llamar
257
+ valido_hasta: (best_globals_1.datetime.now().add((0, best_globals_1.timeInterval)({ days: 7 }))).toYmd(),
286
258
  }
287
- });
288
- });
259
+ },
260
+ opciones: {},
261
+ };
262
+ return initialState;
289
263
  }
290
- var inicializarPedido = function () {
264
+ const inicializarPedido = () => {
291
265
  return {
292
266
  estado: ESTADO_INICIAL_PEDIDO,
293
267
  fecha: best_globals_1.datetime.now().toYmd(),
@@ -297,83 +271,56 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
297
271
  };
298
272
  };
299
273
  exports.inicializarPedido = inicializarPedido;
300
- function createInitialStatePedido() {
301
- return __awaiter(this, void 0, void 0, function () {
302
- var estructura, initialState;
303
- return __generator(this, function (_a) {
304
- switch (_a.label) {
305
- case 0: return [4 /*yield*/, traerEstructura()];
306
- case 1:
307
- estructura = _a.sent();
308
- initialState = {
309
- estructura: estructura,
310
- datosPedido: {
311
- cliente: {},
312
- items: [crearItem()],
313
- pedido: (0, exports.inicializarPedido)()
314
- },
315
- opciones: {},
316
- };
317
- return [2 /*return*/, initialState];
318
- }
319
- });
320
- });
274
+ async function createInitialStatePedido() {
275
+ var estructura = await traerEstructura();
276
+ var initialState = {
277
+ estructura,
278
+ datosPedido: {
279
+ cliente: {},
280
+ items: [crearItem()],
281
+ pedido: (0, exports.inicializarPedido)()
282
+ },
283
+ opciones: {},
284
+ };
285
+ return initialState;
321
286
  }
322
- function crearStore(opts, createInitialState) {
323
- return __awaiter(this, void 0, void 0, function () {
324
- var loadState, saveState, initialState, reducer, store;
325
- return __generator(this, function (_a) {
326
- switch (_a.label) {
327
- case 0:
328
- opts.useSessionStorage = opts.useSessionStorage || false;
329
- loadState = function loadState() {
330
- return __awaiter(this, void 0, void 0, function () {
331
- var presupuestoState, initialState;
332
- return __generator(this, function (_a) {
333
- switch (_a.label) {
334
- case 0:
335
- presupuestoState = opts.useSessionStorage ? my.getSessionVar(exports.STORAGE_STATE_NAME) : my.getLocalVar(exports.STORAGE_STATE_NAME);
336
- if (!presupuestoState) return [3 /*break*/, 2];
337
- return [4 /*yield*/, createInitialState()];
338
- case 1:
339
- initialState = _a.sent();
340
- presupuestoState = __assign(__assign({}, initialState), presupuestoState);
341
- presupuestoState.estructura = __assign({}, initialState.estructura);
342
- return [3 /*break*/, 4];
343
- case 2: return [4 /*yield*/, createInitialState()];
344
- case 3:
345
- initialState = _a.sent();
346
- presupuestoState = initialState;
347
- _a.label = 4;
348
- case 4:
349
- if (opts.datosPresupuesto) {
350
- presupuestoState.datosPresupuesto = __assign(__assign({}, presupuestoState.datosPresupuesto), opts.datosPresupuesto);
351
- }
352
- if (opts.datosPedido) {
353
- presupuestoState.datosPedido = __assign(__assign({}, presupuestoState.datosPedido), opts.datosPedido);
354
- }
355
- return [2 /*return*/, presupuestoState];
356
- }
357
- });
358
- });
359
- };
360
- saveState = function saveState(state) {
361
- opts.useSessionStorage ? my.setSessionVar(exports.STORAGE_STATE_NAME, state) : my.setLocalVar(exports.STORAGE_STATE_NAME, state);
362
- };
363
- return [4 /*yield*/, loadState()];
364
- case 1:
365
- initialState = _a.sent();
366
- reducer = (0, redux_typed_reducer_1.createReducer)(reducers, initialState);
367
- store = (0, redux_1.createStore)(reducer, initialState);
368
- saveState(store.getState());
369
- store.subscribe(function () {
370
- saveState(store.getState());
371
- });
372
- /* FIN CREACION STORE */
373
- return [2 /*return*/, store];
374
- }
375
- });
287
+ async function crearStore(opts, createInitialState) {
288
+ opts.useSessionStorage = opts.useSessionStorage || false;
289
+ var loadState = async function loadState() {
290
+ var presupuestoState = opts.useSessionStorage ? my.getSessionVar(exports.STORAGE_STATE_NAME) : my.getLocalVar(exports.STORAGE_STATE_NAME);
291
+ if (presupuestoState) {
292
+ initialState = await createInitialState();
293
+ presupuestoState = { ...initialState, ...presupuestoState };
294
+ presupuestoState.estructura = { ...initialState.estructura };
295
+ }
296
+ else {
297
+ var initialState = await createInitialState();
298
+ presupuestoState = initialState;
299
+ }
300
+ if (opts.datosPresupuesto) {
301
+ presupuestoState.datosPresupuesto = { ...presupuestoState.datosPresupuesto, ...opts.datosPresupuesto };
302
+ }
303
+ if (opts.datosPedido) {
304
+ presupuestoState.datosPedido = { ...presupuestoState.datosPedido, ...opts.datosPedido };
305
+ }
306
+ return presupuestoState;
307
+ };
308
+ var saveState = function saveState(state) {
309
+ opts.useSessionStorage ? my.setSessionVar(exports.STORAGE_STATE_NAME, state) : my.setLocalVar(exports.STORAGE_STATE_NAME, state);
310
+ };
311
+ /* DEFINICION CONTROLADOR */
312
+ var initialState = await loadState();
313
+ const reducer = (0, redux_typed_reducer_1.createReducer)(reducers, initialState);
314
+ /* FIN DEFINICION CONTROLADOR */
315
+ /* CARGA Y GUARDADO DE STATE */
316
+ /* CREACION STORE */
317
+ const store = (0, redux_1.createStore)(reducer, initialState);
318
+ saveState(store.getState());
319
+ store.subscribe(function () {
320
+ saveState(store.getState());
376
321
  });
322
+ /* FIN CREACION STORE */
323
+ return store;
377
324
  }
378
325
  });
379
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtZm9ybXVsYXJpby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvcmVkdXgtZm9ybXVsYXJpby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWVBLDhCQUtDO0lBRUQsZ0RBU0M7SUFFRCwwQ0FPQztJQTBNRCwwQ0FHQztJQUVELGdEQUVDO0lBRUQsc0NBRUM7SUFFRCxzRUFpQkM7SUFZRCw0REFhQztJQUVELGdDQTJDQztJQXRWRCwrQkFBb0M7SUFFcEMsMkRBQW9GO0lBSXBGLDZDQUEyRDtJQUczRCxJQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztJQUU1QyxJQUFJLEVBQUUsR0FBQyxLQUFLLENBQUM7SUFFQSxRQUFBLGtCQUFrQixHQUFFLGdCQUFnQixDQUFDO0lBRWxELFNBQWdCLFNBQVM7UUFDckIsT0FBTztZQUNILFFBQVEsRUFBQyxDQUFDO1lBQ1YsU0FBUyxFQUFDLENBQUM7U0FDZCxDQUFBO0lBQ0wsQ0FBQztJQUVELFNBQWdCLGtCQUFrQixDQUFDLElBQVM7UUFDeEMsSUFBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUMsQ0FBQztZQUN0QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbEQsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFBLENBQUMsQ0FBQSxRQUFRLEdBQUMsR0FBRyxHQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUcsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxD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QUE7O3dCQUF0QyxZQUFZLEdBQVMsU0FBaUI7d0JBQ3BDLE9BQU8sR0FBRyxJQUFBLG1DQUFhLEVBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO3dCQUloRCxLQUFLLEdBQUcsSUFBQSxtQkFBVyxFQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDakQsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3dCQUM1QixLQUFLLENBQUMsU0FBUyxDQUFDOzRCQUNaLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFDaEMsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsd0JBQXdCO3dCQUN4QixzQkFBTyxLQUFLLEVBQUM7Ozs7S0FDaEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gXCJyZWR1eFwiO1xyXG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSBcImJlc3QtZ2xvYmFsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVSZWR1Y2VyLCBjcmVhdGVEaXNwYXRjaGVycywgQWN0aW9uc0Zyb20gfSBmcm9tIFwicmVkdXgtdHlwZWQtcmVkdWNlclwiO1xyXG5pbXBvcnQge1N0YXRlLCBFc3RydWN0dXJhLCBJdGVtLCBQcmVzdXB1ZXN0bywgRGF0b3NQcmVzdXB1ZXN0bywgUGVkaWRvLCBEYXRvc1BlZGlkbywgRGF0b3NEZXNkZX0gZnJvbSBcIi4vdGlwb3NcIlxyXG5pbXBvcnQgKiBhcyBKU09ONGFsbCBmcm9tIFwianNvbjRhbGxcIjtcclxuaW1wb3J0ICogYXMgbGlrZUFyIGZyb20gXCJsaWtlLWFyXCI7XHJcbmltcG9ydCB7ZGF0ZXRpbWUsIGRhdGUsIHRpbWVJbnRlcnZhbCB9IGZyb20gJ2Jlc3QtZ2xvYmFscyc7XHJcbmltcG9ydCB7IENsaWVudGUsIFByb2R1Y3RvLCBDb25kaWNpb25JdmEgfSBmcm9tIFwiLi90aXBvc1wiO1xyXG4gICAgXHJcbmNvbnN0IEVTVEFET19JTklDSUFMX1BFRElETyA9IFwicHJlcGFyYWNpb25cIjtcclxuXHJcbnZhciBteT1teU93bjtcclxuXHJcbmV4cG9ydCBjb25zdCBTVE9SQUdFX1NUQVRFX05BTUUgPSdjb250YWJsZV9zdGF0ZSc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXJJdGVtKCk6SXRlbXtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY2FudGlkYWQ6MSxcclxuICAgICAgICBkZXNjdWVudG86MFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJUb3RhbExpbmVhKGl0ZW06SXRlbSl7XHJcbiAgICBpZihpdGVtLmNhbnRpZGFkICYmIGl0ZW0ucHJlY2lvX3VuaXRhcmlvKXtcclxuICAgICAgICBsZXQgc3VidG90YWwgPSBpdGVtLmNhbnRpZGFkKml0ZW0ucHJlY2lvX3VuaXRhcmlvO1xyXG4gICAgICAgIGxldCBkZXNjdWVudG8gPSBwYXJzZUZsb2F0KChpdGVtLnBvcmNlbnRhamVfZGVzY3VlbnRvP3N1YnRvdGFsLzEwMCppdGVtLnBvcmNlbnRhamVfZGVzY3VlbnRvOjApLnRvRml4ZWQoMikpO1xyXG4gICAgICAgIGxldCB0b3RhbCA9IHBhcnNlRmxvYXQoKHN1YnRvdGFsIC0gZGVzY3VlbnRvKS50b0ZpeGVkKDIpKTtcclxuICAgICAgICByZXR1cm4ge2Rlc2N1ZW50bywgdG90YWx9O1xyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIHtkZXNjdWVudG86dW5kZWZpbmVkLCB0b3RhbDp1bmRlZmluZWR9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhclRvdGFsZXMoaXRlbXM6SXRlbVtdLCBkYXRvczpEYXRvc1BlZGlkb3xEYXRvc1ByZXN1cHVlc3RvLCBkYXRvc0Rlc2RlOkRhdG9zRGVzZGUpOnZvaWR7XHJcbiAgICBsZXQgcGVkaWRvT3ByZXN1cHVlc3RvSW5kZXg6J3BlZGlkbyd8J3ByZXN1cHVlc3RvJz1kYXRvc0Rlc2RlPT1cImRhdG9zUGVkaWRvXCI/J3BlZGlkbyc6J3ByZXN1cHVlc3RvJztcclxuICAgIC8vQHRzLWlnbm9yZSBlc3RveSBzZWd1cm8gcXVlIGxsZWdhIGJpZW5cclxuICAgIGxldCBwZWRpZG9PcHJlc3VwdWVzdG86UGVkaWRvfFByZXN1cHVlc3RvPWRhdG9zW3BlZGlkb09wcmVzdXB1ZXN0b0luZGV4XTtcclxuICAgIHBlZGlkb09wcmVzdXB1ZXN0by5zdWJ0b3RhbD1pdGVtcy5yZWR1Y2UoKGFjdW0sIGl0ZW0pID0+IGFjdW0gKyAoaXRlbS50b3RhbCB8fCAwKSwgMCk7XHJcbiAgICBwZWRpZG9PcHJlc3VwdWVzdG8uZGVzY3VlbnRvPXBlZGlkb09wcmVzdXB1ZXN0by5kZXNjdWVudG8gfHwgMDtcclxuICAgIHBlZGlkb09wcmVzdXB1ZXN0by50b3RhbD1wZWRpZG9PcHJlc3VwdWVzdG8uc3VidG90YWwtKHBlZGlkb09wcmVzdXB1ZXN0by5kZXNjdWVudG98fDApO1xyXG59XHJcblxyXG52YXIgcmVkdWNlcnM9e1xyXG4gICAgU0VUX09QQ0lPTjogKHBheWxvYWQ6IHtvcGNpb246a2V5b2YgU3RhdGVbJ29wY2lvbmVzJ10sIHZhbG9yOmFueX0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBTdGF0ZSl7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIG9wY2lvbmVzOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vcGNpb25lcyxcclxuICAgICAgICAgICAgICAgICAgICBbcGF5bG9hZC5vcGNpb25dOiBwYXlsb2FkLnZhbG9yXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgU0VUX0NMSUVOVEU6IChwYXlsb2FkOiB7Y2xpZW50ZTpDbGllbnRlLCBkYXRvc0Rlc2RlOkRhdG9zRGVzZGV9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBbcGF5bG9hZC5kYXRvc0Rlc2RlXTp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRlOiBwYXlsb2FkLmNsaWVudGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBBRERfSVRFTTogKHBheWxvYWQ6IHtkYXRvc0Rlc2RlOkRhdG9zRGVzZGV9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICB2YXIgaXRlbXM9c3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXS5pdGVtcztcclxuICAgICAgICAgICAgaXRlbXMucHVzaChjcmVhckl0ZW0oKSk7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSwgcGF5bG9hZC5kYXRvc0Rlc2RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgW3BheWxvYWQuZGF0b3NEZXNkZV06e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6aXRlbXNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBSRU1PVkVfSVRFTTogKHBheWxvYWQ6IHtpbmRleDpudW1iZXIsIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBTdGF0ZSl7XHJcbiAgICAgICAgICAgIHZhciBpdGVtcz1zdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLml0ZW1zO1xyXG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UocGF5bG9hZC5pbmRleCwgMSk7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSwgcGF5bG9hZC5kYXRvc0Rlc2RlKTtcclxuICAgICAgICAgICAgaWYoaXRlbXMubGVuZ3RoPT0wKXtcclxuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goY3JlYXJJdGVtKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIFtwYXlsb2FkLmRhdG9zRGVzZGVdOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOml0ZW1zXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgU0VUX1BST0RVQ1RPX0lURU06IChwYXlsb2FkOiB7aW5kZXg6bnVtYmVyLCBwcm9kdWN0bzpQcm9kdWN0b3xudWxsLCBkYXRvc0Rlc2RlOkRhdG9zRGVzZGV9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICBsZXQge2luZGV4LCBwcm9kdWN0b30gPSBwYXlsb2FkO1xyXG4gICAgICAgICAgICBsZXQgaXRlbXM9c3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXS5pdGVtcztcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLnByb2R1Y3RvPXByb2R1Y3RvP3Byb2R1Y3RvLnByb2R1Y3RvOnVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLm5vbWJyZT1wcm9kdWN0bz9wcm9kdWN0by5ub21icmU6dW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0uZGVzY3JpcGNpb249cHJvZHVjdG8/cHJvZHVjdG8uZGVzY3JpcGNpb246dW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0ucHJlY2lvX3VuaXRhcmlvPXByb2R1Y3RvP3Byb2R1Y3RvLnByZWNpbzp1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGxldCB7ZGVzY3VlbnRvLCB0b3RhbH0gPSBjYWxjdWxhclRvdGFsTGluZWEoaXRlbXNbaW5kZXhdKTtcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLmRlc2N1ZW50bz1kZXNjdWVudG87XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS50b3RhbD10b3RhbDtcclxuICAgICAgICAgICAgY2FsY3VsYXJUb3RhbGVzKGl0ZW1zLCBzdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLCBwYXlsb2FkLmRhdG9zRGVzZGUpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBbcGF5bG9hZC5kYXRvc0Rlc2RlXTp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSxcclxuICAgICAgICAgICAgICAgICAgICBpdGVtczppdGVtc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIFNFVF9GSUVMRF9DVVNUT01fSVRFTTogKHBheWxvYWQ6IHtpbmRleDpudW1iZXIsIGNhbXBvOmtleW9mIEl0ZW0sIHZhbG9yOm51bWJlcnxzdHJpbmd8bnVsbCwgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgbGV0IHtpbmRleCwgY2FtcG8sIHZhbG9yfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgICAgIGxldCBpdGVtcz1zdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLml0ZW1zO1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHPDqSBxdWUgZWwgaW5kaWNlIHkgZWwgY2FtcG8gZXhpc3RlblxyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF1bY2FtcG9dPXZhbG9yO1xyXG4gICAgICAgICAgICBsZXQge2Rlc2N1ZW50bywgdG90YWx9ID0gY2FsY3VsYXJUb3RhbExpbmVhKGl0ZW1zW2luZGV4XSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5kZXNjdWVudG89ZGVzY3VlbnRvO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0udG90YWw9dG90YWw7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSwgcGF5bG9hZC5kYXRvc0Rlc2RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgW3BheWxvYWQuZGF0b3NEZXNkZV06e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6aXRlbXNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBTRVRfQ0FOVElEQURfSVRFTTogKHBheWxvYWQ6IHtpbmRleDpudW1iZXIsIGNhbnRpZGFkOm51bWJlcnxudWxsLCBkYXRvc0Rlc2RlOkRhdG9zRGVzZGV9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICBsZXQge2luZGV4LCBjYW50aWRhZH0gPSBwYXlsb2FkO1xyXG4gICAgICAgICAgICBsZXQgaXRlbXM9c3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXS5pdGVtcztcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLmNhbnRpZGFkPWNhbnRpZGFkfHx1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGxldCB7ZGVzY3VlbnRvLCB0b3RhbH0gPSBjYWxjdWxhclRvdGFsTGluZWEoaXRlbXNbaW5kZXhdKTtcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLmRlc2N1ZW50bz1kZXNjdWVudG87XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS50b3RhbD10b3RhbDtcclxuICAgICAgICAgICAgY2FsY3VsYXJUb3RhbGVzKGl0ZW1zLCBzdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLCBwYXlsb2FkLmRhdG9zRGVzZGUpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBbcGF5bG9hZC5kYXRvc0Rlc2RlXTp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSxcclxuICAgICAgICAgICAgICAgICAgICBpdGVtczppdGVtc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIFNFVF9ERVNDVUVOVE9fSVRFTTogKHBheWxvYWQ6IHtpbmRleDpudW1iZXIsIHBvcmNlbnRhamU6bnVtYmVyfG51bGwsIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBTdGF0ZSl7XHJcbiAgICAgICAgICAgIGxldCB7aW5kZXgsIHBvcmNlbnRhamV9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgbGV0IGl0ZW1zPXN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0uaXRlbXM7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5wb3JjZW50YWplX2Rlc2N1ZW50bz1wb3JjZW50YWplO1xyXG4gICAgICAgICAgICBsZXQge2Rlc2N1ZW50bywgdG90YWx9ID0gY2FsY3VsYXJUb3RhbExpbmVhKGl0ZW1zW2luZGV4XSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5kZXNjdWVudG89ZGVzY3VlbnRvO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0udG90YWw9dG90YWw7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSwgcGF5bG9hZC5kYXRvc0Rlc2RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgW3BheWxvYWQuZGF0b3NEZXNkZV06e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6aXRlbXNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBTRVRfREVTQ1VFTlRPX1BSRVNVUFVFU1RPOiAocGF5bG9hZDoge2Rlc2N1ZW50bzpudW1iZXJ9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICB2YXIge2Rlc2N1ZW50b30gPSBwYXlsb2FkO1xyXG4gICAgICAgICAgICB2YXIgaXRlbXM9c3RhdGUuZGF0b3NQcmVzdXB1ZXN0by5pdGVtcztcclxuICAgICAgICAgICAgdmFyIG15U3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIGRhdG9zUHJlc3VwdWVzdG86e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmRhdG9zUHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwdWVzdG86e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRvc1ByZXN1cHVlc3RvLnByZXN1cHVlc3RvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjdWVudG86IGRlc2N1ZW50b1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2FsY3VsYXJUb3RhbGVzKGl0ZW1zLCBteVN0YXRlLmRhdG9zUHJlc3VwdWVzdG8sICdkYXRvc1ByZXN1cHVlc3RvJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBteVN0YXRlO1xyXG4gICAgICAgIH0sXHJcbiAgICBTRVRfREVTQ1VFTlRPX1BFRElETzogKHBheWxvYWQ6IHtkZXNjdWVudG86bnVtYmVyfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgdmFyIHtkZXNjdWVudG99ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zPXN0YXRlLmRhdG9zUGVkaWRvLml0ZW1zO1xyXG4gICAgICAgICAgICB2YXIgbXlTdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgZGF0b3NQZWRpZG86e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmRhdG9zUGVkaWRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkbzp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmRhdG9zUGVkaWRvLnBlZGlkbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3VlbnRvOiBkZXNjdWVudG9cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgbXlTdGF0ZS5kYXRvc1BlZGlkbywgJ2RhdG9zUGVkaWRvJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBteVN0YXRlO1xyXG4gICAgICAgIH0sXHJcbiAgICBTRVRfQ0FNUE9fUFJFU1VQVUVTVE86IChwYXlsb2FkOiB7Y2FtcG86a2V5b2YgUHJlc3VwdWVzdG8sIHZhbG9yOnN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxudWxsfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgdmFyIHtjYW1wbywgdmFsb3J9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgZGF0b3NQcmVzdXB1ZXN0bzp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuZGF0b3NQcmVzdXB1ZXN0byxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXB1ZXN0bzp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmRhdG9zUHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjYW1wb106IHZhbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcbiAgICBTRVRfQ0FNUE9fUEVESURPOiAocGF5bG9hZDoge2NhbXBvOmtleW9mIFBlZGlkbywgdmFsb3I6c3RyaW5nfG51bWJlcnxib29sZWFufG51bGx9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICB2YXIge2NhbXBvLCB2YWxvcn0gPSBwYXlsb2FkO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBkYXRvc1BlZGlkbzp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuZGF0b3NQZWRpZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuZGF0b3NQZWRpZG8ucGVkaWRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FtcG9dOiB2YWxvclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG4gICAgUkVTRVRfT1BDSU9ORVM6IChfcGF5bG9hZDoge30pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBTdGF0ZSl7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIG9wY2lvbmVzOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vcGNpb25lcyxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEFjdGlvbkZvcm11bGFyaW9TdGF0ZSA9IEFjdGlvbnNGcm9tPHR5cGVvZiByZWR1Y2Vycz47XHJcbi8qIEZJTiBBQ0NJT05FUyAqL1xyXG5cclxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoZXJzID0gY3JlYXRlRGlzcGF0Y2hlcnMocmVkdWNlcnMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWVyRXN0cnVjdHVyYSgpe1xyXG4gICAgdmFyIGVzdHJ1Y3R1cmE6IEVzdHJ1Y3R1cmEgPSBhd2FpdCBteS5hamF4LmVzdHJ1Y3R1cmFfY3JlYXIoKTtcclxuICAgIHJldHVybiBlc3RydWN0dXJhO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ3VhcmRhclByZXN1cHVlc3RvKGNsaWVudGU6Q2xpZW50ZSwgcHJlc3VwdWVzdG86UHJlc3VwdWVzdG8sIGl0ZW1zOkl0ZW1bXSl7XHJcbiAgICByZXR1cm4gYXdhaXQgbXkuYWpheC5wcmVzdXB1ZXN0b19ndWFyZGFyKHtjbGllbnRlLCBwcmVzdXB1ZXN0bywgaXRlbXN9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGd1YXJkYXJQZWRpZG8oY2xpZW50ZTpDbGllbnRlLCBwZWRpZG86UGVkaWRvLCBpdGVtczpJdGVtW10pe1xyXG4gICAgcmV0dXJuIGF3YWl0IG15LmFqYXgucGVkaWRvX2d1YXJkYXIoe2NsaWVudGUsIHBlZGlkbywgaXRlbXN9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZVByZXN1cHVlc3RvKCl7XHJcbiAgICB2YXIgZXN0cnVjdHVyYSA9IGF3YWl0IHRyYWVyRXN0cnVjdHVyYSgpO1xyXG4gICAgdmFyIGluaXRpYWxTdGF0ZTpTdGF0ZSA9IHtcclxuICAgICAgICBlc3RydWN0dXJhLFxyXG4gICAgICAgIGRhdG9zUHJlc3VwdWVzdG86e1xyXG4gICAgICAgICAgICBjbGllbnRlOnt9LFxyXG4gICAgICAgICAgICBpdGVtczpbY3JlYXJJdGVtKCldLFxyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0bzp7XHJcbiAgICAgICAgICAgICAgICBlc3RhZG86IFwiZXNwZXJhXCIsXHJcbiAgICAgICAgICAgICAgICBmZWNoYTogZGF0ZXRpbWUubm93KCkudG9ZbWQoKSxcclxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZSBzZSBwdWVkZSBsbGFtYXJcclxuICAgICAgICAgICAgICAgIHZhbGlkb19oYXN0YTogKGRhdGV0aW1lLm5vdygpLmFkZCh0aW1lSW50ZXJ2YWwoe2RheXM6N30pKSkudG9ZbWQoKSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3BjaW9uZXM6e30sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGluaWNpYWxpemFyUGVkaWRvPSgpPT57XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGVzdGFkbzogRVNUQURPX0lOSUNJQUxfUEVESURPLFxyXG4gICAgICAgIGZlY2hhOiBkYXRldGltZS5ub3coKS50b1ltZCgpLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZSBzZSBwdWVkZSBsbGFtYXJcclxuICAgICAgICBmZWNoYV9lbnRyZWdhOiAoZGF0ZXRpbWUubm93KCkuYWRkKHRpbWVJbnRlcnZhbCh7ZGF5czo3fSkpKS50b1ltZCgpLFxyXG4gICAgICAgIG9ic2VydmFjaW9uZXM6IG51bGxcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbygpe1xyXG4gICAgXHJcbiAgICB2YXIgZXN0cnVjdHVyYSA9IGF3YWl0IHRyYWVyRXN0cnVjdHVyYSgpO1xyXG4gICAgdmFyIGluaXRpYWxTdGF0ZTpTdGF0ZSA9IHtcclxuICAgICAgICBlc3RydWN0dXJhLFxyXG4gICAgICAgIGRhdG9zUGVkaWRvOntcclxuICAgICAgICAgICAgY2xpZW50ZTp7fSxcclxuICAgICAgICAgICAgaXRlbXM6W2NyZWFySXRlbSgpXSxcclxuICAgICAgICAgICAgcGVkaWRvOiBpbmljaWFsaXphclBlZGlkbygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcGNpb25lczp7fSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gaW5pdGlhbFN0YXRlO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXJTdG9yZShcclxuICAgIG9wdHM6e1xyXG4gICAgICAgIHVzZVNlc3Npb25TdG9yYWdlPzpib29sZWFuLCBcclxuICAgICAgICBkYXRvc1ByZXN1cHVlc3RvPzpEYXRvc1ByZXN1cHVlc3RvLFxyXG4gICAgICAgIGRhdG9zUGVkaWRvPzpEYXRvc1BlZGlkb1xyXG4gICAgfSwgXHJcbiAgICBjcmVhdGVJbml0aWFsU3RhdGU6KCk9PlByb21pc2U8U3RhdGU+LCBcclxuKXtcclxuICAgIG9wdHMudXNlU2Vzc2lvblN0b3JhZ2U9IG9wdHMudXNlU2Vzc2lvblN0b3JhZ2V8fGZhbHNlO1xyXG4gICAgdmFyIGxvYWRTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIGxvYWRTdGF0ZSgpOlByb21pc2U8U3RhdGU+e1xyXG4gICAgICAgIHZhciBwcmVzdXB1ZXN0b1N0YXRlOlN0YXRlfG51bGwgPSBvcHRzLnVzZVNlc3Npb25TdG9yYWdlP215LmdldFNlc3Npb25WYXIoU1RPUkFHRV9TVEFURV9OQU1FKTpteS5nZXRMb2NhbFZhcihTVE9SQUdFX1NUQVRFX05BTUUpO1xyXG4gICAgICAgIGlmKHByZXN1cHVlc3RvU3RhdGUpe1xyXG4gICAgICAgICAgICBpbml0aWFsU3RhdGUgPSBhd2FpdCBjcmVhdGVJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICAgICAgcHJlc3VwdWVzdG9TdGF0ZSA9IHsuLi5pbml0aWFsU3RhdGUsIC4uLnByZXN1cHVlc3RvU3RhdGV9O1xyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0b1N0YXRlLmVzdHJ1Y3R1cmEgPSB7Li4uaW5pdGlhbFN0YXRlLmVzdHJ1Y3R1cmF9O1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB2YXIgaW5pdGlhbFN0YXRlID0gYXdhaXQgY3JlYXRlSW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvU3RhdGUgPSBpbml0aWFsU3RhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG9wdHMuZGF0b3NQcmVzdXB1ZXN0byl7XHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvU3RhdGUuZGF0b3NQcmVzdXB1ZXN0bz17Li4ucHJlc3VwdWVzdG9TdGF0ZS5kYXRvc1ByZXN1cHVlc3RvLCAuLi5vcHRzLmRhdG9zUHJlc3VwdWVzdG99XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG9wdHMuZGF0b3NQZWRpZG8pe1xyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0b1N0YXRlLmRhdG9zUGVkaWRvPXsuLi5wcmVzdXB1ZXN0b1N0YXRlLmRhdG9zUGVkaWRvLCAuLi5vcHRzLmRhdG9zUGVkaWRvfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJlc3VwdWVzdG9TdGF0ZTtcclxuICAgIH1cclxuICAgIHZhciBzYXZlU3RhdGUgPSBmdW5jdGlvbiBzYXZlU3RhdGUoc3RhdGU6U3RhdGUpe1xyXG4gICAgICAgIG9wdHMudXNlU2Vzc2lvblN0b3JhZ2U/bXkuc2V0U2Vzc2lvblZhcihTVE9SQUdFX1NUQVRFX05BTUUsIHN0YXRlKTpteS5zZXRMb2NhbFZhcihTVE9SQUdFX1NUQVRFX05BTUUsIHN0YXRlKTtcclxuICAgIH1cclxuICAgIC8qIERFRklOSUNJT04gQ09OVFJPTEFET1IgKi9cclxuICAgIHZhciBpbml0aWFsU3RhdGU6U3RhdGUgPSBhd2FpdCBsb2FkU3RhdGUoKTtcclxuICAgIGNvbnN0IHJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKHJlZHVjZXJzLCBpbml0aWFsU3RhdGUpO1xyXG4gICAgLyogRklOIERFRklOSUNJT04gQ09OVFJPTEFET1IgKi9cclxuICAgIC8qIENBUkdBIFkgR1VBUkRBRE8gREUgU1RBVEUgKi9cclxuICAgIC8qIENSRUFDSU9OIFNUT1JFICovXHJcbiAgICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7IFxyXG4gICAgc2F2ZVN0YXRlKHN0b3JlLmdldFN0YXRlKCkpO1xyXG4gICAgc3RvcmUuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgc2F2ZVN0YXRlKHN0b3JlLmdldFN0YXRlKCkpO1xyXG4gICAgfSk7XHJcbiAgICAvKiBGSU4gQ1JFQUNJT04gU1RPUkUgKi9cclxuICAgIHJldHVybiBzdG9yZTtcclxufVxyXG5cclxuIl19
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtZm9ybXVsYXJpby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvcmVkdXgtZm9ybXVsYXJpby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUFlQSw4QkFLQztJQUVELGdEQVNDO0lBRUQsMENBT0M7SUEwTUQsMENBR0M7SUFFRCxnREFFQztJQUVELHNDQUVDO0lBRUQsc0VBaUJDO0lBWUQsNERBYUM7SUFFRCxnQ0EyQ0M7SUF0VkQsaUNBQW9DO0lBRXBDLDZEQUFvRjtJQUlwRiwrQ0FBMkQ7SUFHM0QsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUM7SUFFNUMsSUFBSSxFQUFFLEdBQUMsS0FBSyxDQUFDO0lBRUEsUUFBQSxrQkFBa0IsR0FBRSxnQkFBZ0IsQ0FBQztJQUVsRCxTQUFnQixTQUFTO1FBQ3JCLE9BQU87WUFDSCxRQUFRLEVBQUMsQ0FBQztZQUNWLFNBQVMsRUFBQyxDQUFDO1NBQ2QsQ0FBQTtJQUNMLENBQUM7SUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxJQUFTO1FBQ3hDLElBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFDLENBQUM7WUFDdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ2xELElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQSxDQUFDLENBQUEsUUFBUSxHQUFDLEdBQUcsR0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVHLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxPQUFPLEVBQUMsU0FBUyxFQUFFLEtB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Q0FBQTtRQUNELElBQUksU0FBUyxHQUFHLFNBQVMsU0FBUyxDQUFDLEtBQVc7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFBLENBQUMsQ0FBQSxFQUFFLENBQUMsYUFBYSxDQUFDLDBCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFBLENBQUMsQ0FBQSxFQUFFLENBQUMsV0FBVyxDQUFDLDBCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pILENBQUMsQ0FBQTtRQUNELDRCQUE0QjtRQUM1QixJQUFJLFlBQVksR0FBUyxNQUFNLFNBQVMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUEsbUNBQWEsRUFBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEQsZ0NBQWdDO1FBQ2hDLCtCQUErQjtRQUMvQixvQkFBb0I7UUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBQSxtQkFBVyxFQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUIsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNaLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNILHdCQUF3QjtRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tIFwicmVkdXhcIjtcclxuaW1wb3J0IHsgZGVlcEZyZWV6ZSB9IGZyb20gXCJiZXN0LWdsb2JhbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlUmVkdWNlciwgY3JlYXRlRGlzcGF0Y2hlcnMsIEFjdGlvbnNGcm9tIH0gZnJvbSBcInJlZHV4LXR5cGVkLXJlZHVjZXJcIjtcclxuaW1wb3J0IHtTdGF0ZSwgRXN0cnVjdHVyYSwgSXRlbSwgUHJlc3VwdWVzdG8sIERhdG9zUHJlc3VwdWVzdG8sIFBlZGlkbywgRGF0b3NQZWRpZG8sIERhdG9zRGVzZGV9IGZyb20gXCIuL3RpcG9zXCJcclxuaW1wb3J0ICogYXMgSlNPTjRhbGwgZnJvbSBcImpzb240YWxsXCI7XHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5pbXBvcnQge2RhdGV0aW1lLCBkYXRlLCB0aW1lSW50ZXJ2YWwgfSBmcm9tICdiZXN0LWdsb2JhbHMnO1xyXG5pbXBvcnQgeyBDbGllbnRlLCBQcm9kdWN0bywgQ29uZGljaW9uSXZhIH0gZnJvbSBcIi4vdGlwb3NcIjtcclxuICAgIFxyXG5jb25zdCBFU1RBRE9fSU5JQ0lBTF9QRURJRE8gPSBcInByZXBhcmFjaW9uXCI7XHJcblxyXG52YXIgbXk9bXlPd247XHJcblxyXG5leHBvcnQgY29uc3QgU1RPUkFHRV9TVEFURV9OQU1FID0nY29udGFibGVfc3RhdGUnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWFySXRlbSgpOkl0ZW17XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNhbnRpZGFkOjEsXHJcbiAgICAgICAgZGVzY3VlbnRvOjBcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyVG90YWxMaW5lYShpdGVtOkl0ZW0pe1xyXG4gICAgaWYoaXRlbS5jYW50aWRhZCAmJiBpdGVtLnByZWNpb191bml0YXJpbyl7XHJcbiAgICAgICAgbGV0IHN1YnRvdGFsID0gaXRlbS5jYW50aWRhZCppdGVtLnByZWNpb191bml0YXJpbztcclxuICAgICAgICBsZXQgZGVzY3VlbnRvID0gcGFyc2VGbG9hdCgoaXRlbS5wb3JjZW50YWplX2Rlc2N1ZW50bz9zdWJ0b3RhbC8xMDAqaXRlbS5wb3JjZW50YWplX2Rlc2N1ZW50bzowKS50b0ZpeGVkKDIpKTtcclxuICAgICAgICBsZXQgdG90YWwgPSBwYXJzZUZsb2F0KChzdWJ0b3RhbCAtIGRlc2N1ZW50bykudG9GaXhlZCgyKSk7XHJcbiAgICAgICAgcmV0dXJuIHtkZXNjdWVudG8sIHRvdGFsfTtcclxuICAgIH1lbHNle1xyXG4gICAgICAgIHJldHVybiB7ZGVzY3VlbnRvOnVuZGVmaW5lZCwgdG90YWw6dW5kZWZpbmVkfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJUb3RhbGVzKGl0ZW1zOkl0ZW1bXSwgZGF0b3M6RGF0b3NQZWRpZG98RGF0b3NQcmVzdXB1ZXN0bywgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlKTp2b2lke1xyXG4gICAgbGV0IHBlZGlkb09wcmVzdXB1ZXN0b0luZGV4OidwZWRpZG8nfCdwcmVzdXB1ZXN0byc9ZGF0b3NEZXNkZT09XCJkYXRvc1BlZGlkb1wiPydwZWRpZG8nOidwcmVzdXB1ZXN0byc7XHJcbiAgICAvL0B0cy1pZ25vcmUgZXN0b3kgc2VndXJvIHF1ZSBsbGVnYSBiaWVuXHJcbiAgICBsZXQgcGVkaWRvT3ByZXN1cHVlc3RvOlBlZGlkb3xQcmVzdXB1ZXN0bz1kYXRvc1twZWRpZG9PcHJlc3VwdWVzdG9JbmRleF07XHJcbiAgICBwZWRpZG9PcHJlc3VwdWVzdG8uc3VidG90YWw9aXRlbXMucmVkdWNlKChhY3VtLCBpdGVtKSA9PiBhY3VtICsgKGl0ZW0udG90YWwgfHwgMCksIDApO1xyXG4gICAgcGVkaWRvT3ByZXN1cHVlc3RvLmRlc2N1ZW50bz1wZWRpZG9PcHJlc3VwdWVzdG8uZGVzY3VlbnRvIHx8IDA7XHJcbiAgICBwZWRpZG9PcHJlc3VwdWVzdG8udG90YWw9cGVkaWRvT3ByZXN1cHVlc3RvLnN1YnRvdGFsLShwZWRpZG9PcHJlc3VwdWVzdG8uZGVzY3VlbnRvfHwwKTtcclxufVxyXG5cclxudmFyIHJlZHVjZXJzPXtcclxuICAgIFNFVF9PUENJT046IChwYXlsb2FkOiB7b3BjaW9uOmtleW9mIFN0YXRlWydvcGNpb25lcyddLCB2YWxvcjphbnl9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBvcGNpb25lczp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUub3BjaW9uZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgW3BheWxvYWQub3BjaW9uXTogcGF5bG9hZC52YWxvclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIFNFVF9DTElFTlRFOiAocGF5bG9hZDoge2NsaWVudGU6Q2xpZW50ZSwgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgW3BheWxvYWQuZGF0b3NEZXNkZV06e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50ZTogcGF5bG9hZC5jbGllbnRlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgQUREX0lURU06IChwYXlsb2FkOiB7ZGF0b3NEZXNkZTpEYXRvc0Rlc2RlfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zPXN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0uaXRlbXM7XHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goY3JlYXJJdGVtKCkpO1xyXG4gICAgICAgICAgICBjYWxjdWxhclRvdGFsZXMoaXRlbXMsIHN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sIHBheWxvYWQuZGF0b3NEZXNkZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIFtwYXlsb2FkLmRhdG9zRGVzZGVdOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOml0ZW1zXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgUkVNT1ZFX0lURU06IChwYXlsb2FkOiB7aW5kZXg6bnVtYmVyLCBkYXRvc0Rlc2RlOkRhdG9zRGVzZGV9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICB2YXIgaXRlbXM9c3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXS5pdGVtcztcclxuICAgICAgICAgICAgaXRlbXMuc3BsaWNlKHBheWxvYWQuaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICBjYWxjdWxhclRvdGFsZXMoaXRlbXMsIHN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sIHBheWxvYWQuZGF0b3NEZXNkZSk7XHJcbiAgICAgICAgICAgIGlmKGl0ZW1zLmxlbmd0aD09MCl7XHJcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGNyZWFySXRlbSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBbcGF5bG9hZC5kYXRvc0Rlc2RlXTp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSxcclxuICAgICAgICAgICAgICAgICAgICBpdGVtczppdGVtc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIFNFVF9QUk9EVUNUT19JVEVNOiAocGF5bG9hZDoge2luZGV4Om51bWJlciwgcHJvZHVjdG86UHJvZHVjdG98bnVsbCwgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgbGV0IHtpbmRleCwgcHJvZHVjdG99ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgbGV0IGl0ZW1zPXN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0uaXRlbXM7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5wcm9kdWN0bz1wcm9kdWN0bz9wcm9kdWN0by5wcm9kdWN0bzp1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5ub21icmU9cHJvZHVjdG8/cHJvZHVjdG8ubm9tYnJlOnVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLmRlc2NyaXBjaW9uPXByb2R1Y3RvP3Byb2R1Y3RvLmRlc2NyaXBjaW9uOnVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLnByZWNpb191bml0YXJpbz1wcm9kdWN0bz9wcm9kdWN0by5wcmVjaW86dW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQge2Rlc2N1ZW50bywgdG90YWx9ID0gY2FsY3VsYXJUb3RhbExpbmVhKGl0ZW1zW2luZGV4XSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5kZXNjdWVudG89ZGVzY3VlbnRvO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0udG90YWw9dG90YWw7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSwgcGF5bG9hZC5kYXRvc0Rlc2RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgW3BheWxvYWQuZGF0b3NEZXNkZV06e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6aXRlbXNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBTRVRfRklFTERfQ1VTVE9NX0lURU06IChwYXlsb2FkOiB7aW5kZXg6bnVtYmVyLCBjYW1wbzprZXlvZiBJdGVtLCB2YWxvcjpudW1iZXJ8c3RyaW5nfG51bGwsIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBTdGF0ZSl7XHJcbiAgICAgICAgICAgIGxldCB7aW5kZXgsIGNhbXBvLCB2YWxvcn0gPSBwYXlsb2FkO1xyXG4gICAgICAgICAgICBsZXQgaXRlbXM9c3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXS5pdGVtcztcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBzw6kgcXVlIGVsIGluZGljZSB5IGVsIGNhbXBvIGV4aXN0ZW5cclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdW2NhbXBvXT12YWxvcjtcclxuICAgICAgICAgICAgbGV0IHtkZXNjdWVudG8sIHRvdGFsfSA9IGNhbGN1bGFyVG90YWxMaW5lYShpdGVtc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0uZGVzY3VlbnRvPWRlc2N1ZW50bztcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLnRvdGFsPXRvdGFsO1xyXG4gICAgICAgICAgICBjYWxjdWxhclRvdGFsZXMoaXRlbXMsIHN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sIHBheWxvYWQuZGF0b3NEZXNkZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIFtwYXlsb2FkLmRhdG9zRGVzZGVdOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOml0ZW1zXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgU0VUX0NBTlRJREFEX0lURU06IChwYXlsb2FkOiB7aW5kZXg6bnVtYmVyLCBjYW50aWRhZDpudW1iZXJ8bnVsbCwgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgbGV0IHtpbmRleCwgY2FudGlkYWR9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgbGV0IGl0ZW1zPXN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0uaXRlbXM7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5jYW50aWRhZD1jYW50aWRhZHx8dW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQge2Rlc2N1ZW50bywgdG90YWx9ID0gY2FsY3VsYXJUb3RhbExpbmVhKGl0ZW1zW2luZGV4XSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2luZGV4XS5kZXNjdWVudG89ZGVzY3VlbnRvO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0udG90YWw9dG90YWw7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgc3RhdGVbcGF5bG9hZC5kYXRvc0Rlc2RlXSwgcGF5bG9hZC5kYXRvc0Rlc2RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgW3BheWxvYWQuZGF0b3NEZXNkZV06e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6aXRlbXNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICBTRVRfREVTQ1VFTlRPX0lURU06IChwYXlsb2FkOiB7aW5kZXg6bnVtYmVyLCBwb3JjZW50YWplOm51bWJlcnxudWxsLCBkYXRvc0Rlc2RlOkRhdG9zRGVzZGV9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICBsZXQge2luZGV4LCBwb3JjZW50YWplfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgICAgIGxldCBpdGVtcz1zdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLml0ZW1zO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0ucG9yY2VudGFqZV9kZXNjdWVudG89cG9yY2VudGFqZTtcclxuICAgICAgICAgICAgbGV0IHtkZXNjdWVudG8sIHRvdGFsfSA9IGNhbGN1bGFyVG90YWxMaW5lYShpdGVtc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBpdGVtc1tpbmRleF0uZGVzY3VlbnRvPWRlc2N1ZW50bztcclxuICAgICAgICAgICAgaXRlbXNbaW5kZXhdLnRvdGFsPXRvdGFsO1xyXG4gICAgICAgICAgICBjYWxjdWxhclRvdGFsZXMoaXRlbXMsIHN0YXRlW3BheWxvYWQuZGF0b3NEZXNkZV0sIHBheWxvYWQuZGF0b3NEZXNkZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIFtwYXlsb2FkLmRhdG9zRGVzZGVdOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZVtwYXlsb2FkLmRhdG9zRGVzZGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOml0ZW1zXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgU0VUX0RFU0NVRU5UT19QUkVTVVBVRVNUTzogKHBheWxvYWQ6IHtkZXNjdWVudG86bnVtYmVyfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgdmFyIHtkZXNjdWVudG99ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zPXN0YXRlLmRhdG9zUHJlc3VwdWVzdG8uaXRlbXM7XHJcbiAgICAgICAgICAgIHZhciBteVN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBkYXRvc1ByZXN1cHVlc3RvOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRvc1ByZXN1cHVlc3RvLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cHVlc3RvOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuZGF0b3NQcmVzdXB1ZXN0by5wcmVzdXB1ZXN0byxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3VlbnRvOiBkZXNjdWVudG9cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNhbGN1bGFyVG90YWxlcyhpdGVtcywgbXlTdGF0ZS5kYXRvc1ByZXN1cHVlc3RvLCAnZGF0b3NQcmVzdXB1ZXN0bycpO1xyXG4gICAgICAgICAgICByZXR1cm4gbXlTdGF0ZTtcclxuICAgICAgICB9LFxyXG4gICAgU0VUX0RFU0NVRU5UT19QRURJRE86IChwYXlsb2FkOiB7ZGVzY3VlbnRvOm51bWJlcn0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBTdGF0ZSl7XHJcbiAgICAgICAgICAgIHZhciB7ZGVzY3VlbnRvfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgICAgIHZhciBpdGVtcz1zdGF0ZS5kYXRvc1BlZGlkby5pdGVtcztcclxuICAgICAgICAgICAgdmFyIG15U3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIGRhdG9zUGVkaWRvOntcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRvc1BlZGlkbyxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG86e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRvc1BlZGlkby5wZWRpZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2N1ZW50bzogZGVzY3VlbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjYWxjdWxhclRvdGFsZXMoaXRlbXMsIG15U3RhdGUuZGF0b3NQZWRpZG8sICdkYXRvc1BlZGlkbycpO1xyXG4gICAgICAgICAgICByZXR1cm4gbXlTdGF0ZTtcclxuICAgICAgICB9LFxyXG4gICAgU0VUX0NBTVBPX1BSRVNVUFVFU1RPOiAocGF5bG9hZDoge2NhbXBvOmtleW9mIFByZXN1cHVlc3RvLCB2YWxvcjpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbH0pID0+IFxyXG4gICAgICAgIGZ1bmN0aW9uKHN0YXRlOiBTdGF0ZSl7XHJcbiAgICAgICAgICAgIHZhciB7Y2FtcG8sIHZhbG9yfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIGRhdG9zUHJlc3VwdWVzdG86e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmRhdG9zUHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwdWVzdG86e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRvc1ByZXN1cHVlc3RvLnByZXN1cHVlc3RvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FtcG9dOiB2YWxvclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG4gICAgU0VUX0NBTVBPX1BFRElETzogKHBheWxvYWQ6IHtjYW1wbzprZXlvZiBQZWRpZG8sIHZhbG9yOnN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxudWxsfSkgPT4gXHJcbiAgICAgICAgZnVuY3Rpb24oc3RhdGU6IFN0YXRlKXtcclxuICAgICAgICAgICAgdmFyIHtjYW1wbywgdmFsb3J9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgZGF0b3NQZWRpZG86e1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmRhdG9zUGVkaWRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkbzp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmRhdG9zUGVkaWRvLnBlZGlkbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NhbXBvXTogdmFsb3JcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuICAgIFJFU0VUX09QQ0lPTkVTOiAoX3BheWxvYWQ6IHt9KSA9PiBcclxuICAgICAgICBmdW5jdGlvbihzdGF0ZTogU3RhdGUpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBvcGNpb25lczp7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUub3BjaW9uZXMsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBY3Rpb25Gb3JtdWxhcmlvU3RhdGUgPSBBY3Rpb25zRnJvbTx0eXBlb2YgcmVkdWNlcnM+O1xyXG4vKiBGSU4gQUNDSU9ORVMgKi9cclxuXHJcbmV4cG9ydCBjb25zdCBkaXNwYXRjaGVycyA9IGNyZWF0ZURpc3BhdGNoZXJzKHJlZHVjZXJzKTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFlckVzdHJ1Y3R1cmEoKXtcclxuICAgIHZhciBlc3RydWN0dXJhOiBFc3RydWN0dXJhID0gYXdhaXQgbXkuYWpheC5lc3RydWN0dXJhX2NyZWFyKCk7XHJcbiAgICByZXR1cm4gZXN0cnVjdHVyYTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGd1YXJkYXJQcmVzdXB1ZXN0byhjbGllbnRlOkNsaWVudGUsIHByZXN1cHVlc3RvOlByZXN1cHVlc3RvLCBpdGVtczpJdGVtW10pe1xyXG4gICAgcmV0dXJuIGF3YWl0IG15LmFqYXgucHJlc3VwdWVzdG9fZ3VhcmRhcih7Y2xpZW50ZSwgcHJlc3VwdWVzdG8sIGl0ZW1zfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBndWFyZGFyUGVkaWRvKGNsaWVudGU6Q2xpZW50ZSwgcGVkaWRvOlBlZGlkbywgaXRlbXM6SXRlbVtdKXtcclxuICAgIHJldHVybiBhd2FpdCBteS5hamF4LnBlZGlkb19ndWFyZGFyKHtjbGllbnRlLCBwZWRpZG8sIGl0ZW1zfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVJbml0aWFsU3RhdGVQcmVzdXB1ZXN0bygpe1xyXG4gICAgdmFyIGVzdHJ1Y3R1cmEgPSBhd2FpdCB0cmFlckVzdHJ1Y3R1cmEoKTtcclxuICAgIHZhciBpbml0aWFsU3RhdGU6U3RhdGUgPSB7XHJcbiAgICAgICAgZXN0cnVjdHVyYSxcclxuICAgICAgICBkYXRvc1ByZXN1cHVlc3RvOntcclxuICAgICAgICAgICAgY2xpZW50ZTp7fSxcclxuICAgICAgICAgICAgaXRlbXM6W2NyZWFySXRlbSgpXSxcclxuICAgICAgICAgICAgcHJlc3VwdWVzdG86e1xyXG4gICAgICAgICAgICAgICAgZXN0YWRvOiBcImVzcGVyYVwiLFxyXG4gICAgICAgICAgICAgICAgZmVjaGE6IGRhdGV0aW1lLm5vdygpLnRvWW1kKCksXHJcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgc2UgcHVlZGUgbGxhbWFyXHJcbiAgICAgICAgICAgICAgICB2YWxpZG9faGFzdGE6IChkYXRldGltZS5ub3coKS5hZGQodGltZUludGVydmFsKHtkYXlzOjd9KSkpLnRvWW1kKCksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wY2lvbmVzOnt9LFxyXG4gICAgfTtcclxuICAgIHJldHVybiBpbml0aWFsU3RhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpbmljaWFsaXphclBlZGlkbz0oKT0+e1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBlc3RhZG86IEVTVEFET19JTklDSUFMX1BFRElETyxcclxuICAgICAgICBmZWNoYTogZGF0ZXRpbWUubm93KCkudG9ZbWQoKSxcclxuICAgICAgICAvL0B0cy1pZ25vcmUgc2UgcHVlZGUgbGxhbWFyXHJcbiAgICAgICAgZmVjaGFfZW50cmVnYTogKGRhdGV0aW1lLm5vdygpLmFkZCh0aW1lSW50ZXJ2YWwoe2RheXM6N30pKSkudG9ZbWQoKSxcclxuICAgICAgICBvYnNlcnZhY2lvbmVzOiBudWxsXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVJbml0aWFsU3RhdGVQZWRpZG8oKXtcclxuICAgIFxyXG4gICAgdmFyIGVzdHJ1Y3R1cmEgPSBhd2FpdCB0cmFlckVzdHJ1Y3R1cmEoKTtcclxuICAgIHZhciBpbml0aWFsU3RhdGU6U3RhdGUgPSB7XHJcbiAgICAgICAgZXN0cnVjdHVyYSxcclxuICAgICAgICBkYXRvc1BlZGlkbzp7XHJcbiAgICAgICAgICAgIGNsaWVudGU6e30sXHJcbiAgICAgICAgICAgIGl0ZW1zOltjcmVhckl0ZW0oKV0sXHJcbiAgICAgICAgICAgIHBlZGlkbzogaW5pY2lhbGl6YXJQZWRpZG8oKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3BjaW9uZXM6e30sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWFyU3RvcmUoXHJcbiAgICBvcHRzOntcclxuICAgICAgICB1c2VTZXNzaW9uU3RvcmFnZT86Ym9vbGVhbiwgXHJcbiAgICAgICAgZGF0b3NQcmVzdXB1ZXN0bz86RGF0b3NQcmVzdXB1ZXN0byxcclxuICAgICAgICBkYXRvc1BlZGlkbz86RGF0b3NQZWRpZG9cclxuICAgIH0sIFxyXG4gICAgY3JlYXRlSW5pdGlhbFN0YXRlOigpPT5Qcm9taXNlPFN0YXRlPiwgXHJcbil7XHJcbiAgICBvcHRzLnVzZVNlc3Npb25TdG9yYWdlPSBvcHRzLnVzZVNlc3Npb25TdG9yYWdlfHxmYWxzZTtcclxuICAgIHZhciBsb2FkU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdGUoKTpQcm9taXNlPFN0YXRlPntcclxuICAgICAgICB2YXIgcHJlc3VwdWVzdG9TdGF0ZTpTdGF0ZXxudWxsID0gb3B0cy51c2VTZXNzaW9uU3RvcmFnZT9teS5nZXRTZXNzaW9uVmFyKFNUT1JBR0VfU1RBVEVfTkFNRSk6bXkuZ2V0TG9jYWxWYXIoU1RPUkFHRV9TVEFURV9OQU1FKTtcclxuICAgICAgICBpZihwcmVzdXB1ZXN0b1N0YXRlKXtcclxuICAgICAgICAgICAgaW5pdGlhbFN0YXRlID0gYXdhaXQgY3JlYXRlSW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvU3RhdGUgPSB7Li4uaW5pdGlhbFN0YXRlLCAuLi5wcmVzdXB1ZXN0b1N0YXRlfTtcclxuICAgICAgICAgICAgcHJlc3VwdWVzdG9TdGF0ZS5lc3RydWN0dXJhID0gey4uLmluaXRpYWxTdGF0ZS5lc3RydWN0dXJhfTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdmFyIGluaXRpYWxTdGF0ZSA9IGF3YWl0IGNyZWF0ZUluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0b1N0YXRlID0gaW5pdGlhbFN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihvcHRzLmRhdG9zUHJlc3VwdWVzdG8pe1xyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0b1N0YXRlLmRhdG9zUHJlc3VwdWVzdG89ey4uLnByZXN1cHVlc3RvU3RhdGUuZGF0b3NQcmVzdXB1ZXN0bywgLi4ub3B0cy5kYXRvc1ByZXN1cHVlc3RvfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihvcHRzLmRhdG9zUGVkaWRvKXtcclxuICAgICAgICAgICAgcHJlc3VwdWVzdG9TdGF0ZS5kYXRvc1BlZGlkbz17Li4ucHJlc3VwdWVzdG9TdGF0ZS5kYXRvc1BlZGlkbywgLi4ub3B0cy5kYXRvc1BlZGlkb31cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByZXN1cHVlc3RvU3RhdGU7XHJcbiAgICB9XHJcbiAgICB2YXIgc2F2ZVN0YXRlID0gZnVuY3Rpb24gc2F2ZVN0YXRlKHN0YXRlOlN0YXRlKXtcclxuICAgICAgICBvcHRzLnVzZVNlc3Npb25TdG9yYWdlP215LnNldFNlc3Npb25WYXIoU1RPUkFHRV9TVEFURV9OQU1FLCBzdGF0ZSk6bXkuc2V0TG9jYWxWYXIoU1RPUkFHRV9TVEFURV9OQU1FLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICAvKiBERUZJTklDSU9OIENPTlRST0xBRE9SICovXHJcbiAgICB2YXIgaW5pdGlhbFN0YXRlOlN0YXRlID0gYXdhaXQgbG9hZFN0YXRlKCk7XHJcbiAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihyZWR1Y2VycywgaW5pdGlhbFN0YXRlKTtcclxuICAgIC8qIEZJTiBERUZJTklDSU9OIENPTlRST0xBRE9SICovXHJcbiAgICAvKiBDQVJHQSBZIEdVQVJEQURPIERFIFNUQVRFICovXHJcbiAgICAvKiBDUkVBQ0lPTiBTVE9SRSAqL1xyXG4gICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VyLCBpbml0aWFsU3RhdGUpOyBcclxuICAgIHNhdmVTdGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcclxuICAgIHN0b3JlLnN1YnNjcmliZShmdW5jdGlvbigpe1xyXG4gICAgICAgIHNhdmVTdGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcclxuICAgIH0pO1xyXG4gICAgLyogRklOIENSRUFDSU9OIFNUT1JFICovXHJcbiAgICByZXR1cm4gc3RvcmU7XHJcbn1cclxuXHJcbiJdfQ==