contable 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/client/client/client.js +240 -0
  2. package/dist/client/{menu.js → client/menu.js} +1 -1
  3. package/dist/client/client/redux-formulario.js +379 -0
  4. package/dist/client/client/render-components.js +750 -0
  5. package/dist/client/client/render-formulario.js +56 -0
  6. package/dist/client/client/render-general.js +197 -0
  7. package/dist/client/client/render-handlers.js +69 -0
  8. package/dist/client/client/tipos.js +13 -0
  9. package/dist/client/{tsconfig.json → client/tsconfig.json} +3 -4
  10. package/dist/{unlogged → client/unlogged}/tsconfig.json +1 -3
  11. package/dist/server/client/tipos.d.ts +119 -0
  12. package/dist/server/client/tipos.js +13 -0
  13. package/dist/server/{app-contable.d.ts → server/app-contable.d.ts} +63 -3
  14. package/dist/server/server/app-contable.js +192 -0
  15. package/dist/server/server/def-config.d.ts +1 -0
  16. package/dist/server/server/def-config.js +101 -0
  17. package/dist/server/server/procedures-contable.js +508 -0
  18. package/dist/server/{server-contable.js → server/server-contable.js} +1 -1
  19. package/dist/server/server/table-categorias_producto.js +29 -0
  20. package/dist/server/server/table-clientes.js +56 -0
  21. package/dist/server/server/table-condicion_iva.js +29 -0
  22. package/dist/server/server/table-estados_pedido.js +33 -0
  23. package/dist/server/server/table-estados_presupuesto.js +34 -0
  24. package/dist/server/server/table-insumos.js +44 -0
  25. package/dist/server/server/table-items_pedido.js +48 -0
  26. package/dist/server/server/table-items_presupuesto.js +48 -0
  27. package/dist/server/server/table-iva_productos.js +29 -0
  28. package/dist/server/server/table-parametros.js +38 -0
  29. package/dist/server/server/table-pedidos.js +48 -0
  30. package/dist/server/server/table-pedidos_pendientes.js +28 -0
  31. package/dist/server/server/table-pedidos_vencidos.js +28 -0
  32. package/dist/server/server/table-presupuestos.js +56 -0
  33. package/dist/server/server/table-productos.js +70 -0
  34. package/dist/server/server/table-productos_clientes.js +22 -0
  35. package/dist/server/server/table-productos_generales.js +22 -0
  36. package/dist/server/server/table-productos_insumos.js +47 -0
  37. package/dist/server/server/table-usuarios.js +44 -0
  38. package/dist/server/{types-contable.d.ts → server/types-contable.d.ts} +14 -3
  39. package/dist/server/server/types-contable.js +28 -0
  40. package/dist/unlogged/unlogged/adapt.js +8 -0
  41. package/dist/unlogged/unlogged/css/styles.styl +88 -0
  42. package/dist/unlogged/unlogged/img/login-logo-icon.png +0 -0
  43. package/dist/unlogged/unlogged/img/logo.png +0 -0
  44. package/dist/unlogged/unlogged/tsconfig.json +13 -0
  45. package/dist/unlogged/unlogged/unlogged.js +13 -0
  46. package/package.json +22 -5
  47. package/dist/client/client.js +0 -182
  48. package/dist/client/redux-formulario.js +0 -326
  49. package/dist/client/render-components.js +0 -617
  50. package/dist/client/render-formulario.js +0 -56
  51. package/dist/client/render-general.js +0 -172
  52. package/dist/client/render-handlers.js +0 -29
  53. package/dist/client/tipos.js +0 -13
  54. package/dist/server/app-contable.js +0 -192
  55. package/dist/server/def-config.d.ts +0 -1
  56. package/dist/server/def-config.js +0 -100
  57. package/dist/server/procedures-contable.js +0 -508
  58. package/dist/server/table-categorias_producto.js +0 -29
  59. package/dist/server/table-clientes.js +0 -56
  60. package/dist/server/table-condicion_iva.js +0 -29
  61. package/dist/server/table-estados_pedido.js +0 -33
  62. package/dist/server/table-estados_presupuesto.js +0 -34
  63. package/dist/server/table-insumos.js +0 -44
  64. package/dist/server/table-items_pedido.js +0 -48
  65. package/dist/server/table-items_presupuesto.js +0 -48
  66. package/dist/server/table-iva_productos.js +0 -29
  67. package/dist/server/table-parametros.js +0 -38
  68. package/dist/server/table-pedidos.js +0 -48
  69. package/dist/server/table-pedidos_pendientes.js +0 -28
  70. package/dist/server/table-pedidos_vencidos.js +0 -28
  71. package/dist/server/table-presupuestos.js +0 -56
  72. package/dist/server/table-productos.js +0 -70
  73. package/dist/server/table-productos_clientes.js +0 -22
  74. package/dist/server/table-productos_generales.js +0 -22
  75. package/dist/server/table-productos_insumos.js +0 -47
  76. package/dist/server/table-usuarios.js +0 -44
  77. package/dist/server/tsconfig.json +0 -10
  78. package/dist/server/types-contable.js +0 -28
  79. package/dist/unlogged/adapt.js +0 -8
  80. package/dist/unlogged/unlogged.js +0 -118
  81. /package/dist/client/{client.d.ts → client/client.d.ts} +0 -0
  82. /package/dist/client/{img → client/img}/bannersuperior.png +0 -0
  83. /package/dist/client/{menu.d.ts → client/menu.d.ts} +0 -0
  84. /package/dist/client/{redux-formulario.d.ts → client/redux-formulario.d.ts} +0 -0
  85. /package/dist/client/{render-components.d.ts → client/render-components.d.ts} +0 -0
  86. /package/dist/client/{render-components.tsx → client/render-components.tsx} +0 -0
  87. /package/dist/client/{render-formulario.d.ts → client/render-formulario.d.ts} +0 -0
  88. /package/dist/client/{render-formulario.tsx → client/render-formulario.tsx} +0 -0
  89. /package/dist/client/{render-general.d.ts → client/render-general.d.ts} +0 -0
  90. /package/dist/client/{render-general.tsx → client/render-general.tsx} +0 -0
  91. /package/dist/client/{render-handlers.d.ts → client/render-handlers.d.ts} +0 -0
  92. /package/dist/client/{tipos.d.ts → client/tipos.d.ts} +0 -0
  93. /package/dist/{unlogged → client/unlogged}/css/styles.styl +0 -0
  94. /package/dist/{unlogged/img/login-logo-icon.png.png → client/unlogged/img/login-logo-icon.png} +0 -0
  95. /package/dist/{unlogged → client/unlogged}/img/logo.png +0 -0
  96. /package/dist/server/{procedures-contable.d.ts → server/procedures-contable.d.ts} +0 -0
  97. /package/dist/server/{server-contable.d.ts → server/server-contable.d.ts} +0 -0
  98. /package/dist/server/{table-categorias_producto.d.ts → server/table-categorias_producto.d.ts} +0 -0
  99. /package/dist/server/{table-clientes.d.ts → server/table-clientes.d.ts} +0 -0
  100. /package/dist/server/{table-condicion_iva.d.ts → server/table-condicion_iva.d.ts} +0 -0
  101. /package/dist/server/{table-estados_pedido.d.ts → server/table-estados_pedido.d.ts} +0 -0
  102. /package/dist/server/{table-estados_presupuesto.d.ts → server/table-estados_presupuesto.d.ts} +0 -0
  103. /package/dist/server/{table-insumos.d.ts → server/table-insumos.d.ts} +0 -0
  104. /package/dist/server/{table-items_pedido.d.ts → server/table-items_pedido.d.ts} +0 -0
  105. /package/dist/server/{table-items_presupuesto.d.ts → server/table-items_presupuesto.d.ts} +0 -0
  106. /package/dist/server/{table-iva_productos.d.ts → server/table-iva_productos.d.ts} +0 -0
  107. /package/dist/server/{table-parametros.d.ts → server/table-parametros.d.ts} +0 -0
  108. /package/dist/server/{table-pedidos.d.ts → server/table-pedidos.d.ts} +0 -0
  109. /package/dist/server/{table-pedidos_pendientes.d.ts → server/table-pedidos_pendientes.d.ts} +0 -0
  110. /package/dist/server/{table-pedidos_vencidos.d.ts → server/table-pedidos_vencidos.d.ts} +0 -0
  111. /package/dist/server/{table-presupuestos.d.ts → server/table-presupuestos.d.ts} +0 -0
  112. /package/dist/server/{table-productos.d.ts → server/table-productos.d.ts} +0 -0
  113. /package/dist/server/{table-productos_clientes.d.ts → server/table-productos_clientes.d.ts} +0 -0
  114. /package/dist/server/{table-productos_generales.d.ts → server/table-productos_generales.d.ts} +0 -0
  115. /package/dist/server/{table-productos_insumos.d.ts → server/table-productos_insumos.d.ts} +0 -0
  116. /package/dist/server/{table-usuarios.d.ts → server/table-usuarios.d.ts} +0 -0
  117. /package/dist/unlogged/{adapt.d.ts → unlogged/adapt.d.ts} +0 -0
  118. /package/dist/unlogged/{unlogged.d.ts → unlogged/unlogged.d.ts} +0 -0
@@ -1,617 +0,0 @@
1
- (function (factory) {
2
- if (typeof module === "object" && typeof module.exports === "object") {
3
- var v = factory(require, exports);
4
- if (v !== undefined) module.exports = v;
5
- }
6
- else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "react", "react-dom", "./render-general", "./redux-formulario", "@material-ui/core", "react", "react-redux", "like-ar"], factory);
8
- }
9
- })(function (require, exports) {
10
- "use strict";
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.generarPedidoDesdePresupuesto = exports.ESTADO_ACEPTADO_PRESUPUESTO = void 0;
13
- exports.Autocompleter = Autocompleter;
14
- exports.TypedField = TypedField;
15
- exports.ClienteComponent = ClienteComponent;
16
- exports.EstadoPresupuesto = EstadoPresupuesto;
17
- exports.EstadoPedido = EstadoPedido;
18
- exports.ObservacionesPedido = ObservacionesPedido;
19
- exports.Items = Items;
20
- exports.ItemP = ItemP;
21
- exports.PresupuestoComponent = PresupuestoComponent;
22
- exports.PedidoComponent = PedidoComponent;
23
- exports.desplegarPresupuesto = desplegarPresupuesto;
24
- exports.desplegarPedido = desplegarPedido;
25
- const React = require("react");
26
- const ReactDOM = require("react-dom");
27
- const render_general_1 = require("./render-general");
28
- const redux_formulario_1 = require("./redux-formulario");
29
- const core_1 = require("@material-ui/core");
30
- const react_1 = require("react");
31
- const react_redux_1 = require("react-redux");
32
- const likeAr = require("like-ar");
33
- exports.ESTADO_ACEPTADO_PRESUPUESTO = "aceptado";
34
- var my = myOwn;
35
- var generarPedidoDesdePresupuesto = (datosPresupuesto) => {
36
- let { cliente, items, presupuesto } = datosPresupuesto;
37
- let datosPedido = {
38
- cliente,
39
- items,
40
- pedido: {
41
- presupuesto: presupuesto.presupuesto,
42
- cliente: presupuesto.cliente,
43
- descuento: presupuesto.descuento,
44
- subtotal: presupuesto.subtotal,
45
- total: presupuesto.total,
46
- ...(0, redux_formulario_1.inicializarPedido)()
47
- }
48
- };
49
- return datosPedido;
50
- };
51
- exports.generarPedidoDesdePresupuesto = generarPedidoDesdePresupuesto;
52
- my.wScreens.presupuesto = async function (addrParams) {
53
- var datosPresupuesto = null;
54
- //@ts-ignore existe
55
- if (addrParams.presupuesto) {
56
- //@ts-ignore existe
57
- datosPresupuesto = await my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto });
58
- }
59
- var store = await (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPresupuesto: datosPresupuesto || undefined }, redux_formulario_1.createInitialStatePresupuesto);
60
- desplegarPresupuesto(store);
61
- };
62
- my.wScreens.pedido = async function (addrParams) {
63
- var datosPedido = null;
64
- //@ts-ignore existe
65
- if (addrParams.pedido) {
66
- //@ts-ignore existe
67
- datosPedido = await my.ajax.pedido_cargar({ pedido: addrParams.pedido });
68
- //@ts-ignore existe
69
- }
70
- else if (addrParams.presupuesto) {
71
- //@ts-ignore existe
72
- var datosPresupuesto = await my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto });
73
- datosPedido = (0, exports.generarPedidoDesdePresupuesto)(datosPresupuesto);
74
- }
75
- var store = await (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPedido: datosPedido || undefined }, redux_formulario_1.createInitialStatePedido);
76
- desplegarPedido(store);
77
- };
78
- const useStyles = (0, core_1.makeStyles)((theme) => ({
79
- appBar: {
80
- position: 'relative',
81
- },
82
- layout: {
83
- width: 'auto',
84
- marginLeft: theme.spacing(2),
85
- marginRight: theme.spacing(2),
86
- [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: {
87
- //width: 600,
88
- //marginLeft: 'auto',
89
- //marginRight: 'auto',
90
- },
91
- },
92
- paper: {
93
- marginTop: theme.spacing(2),
94
- marginBottom: theme.spacing(2),
95
- padding: theme.spacing(2),
96
- [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: {
97
- marginTop: theme.spacing(2),
98
- marginBottom: theme.spacing(2),
99
- padding: theme.spacing(3),
100
- },
101
- },
102
- stepper: {
103
- padding: theme.spacing(3, 0, 5),
104
- },
105
- buttons: {
106
- display: 'flex',
107
- justifyContent: 'flex-end',
108
- },
109
- button: {
110
- marginTop: theme.spacing(1),
111
- marginBottom: theme.spacing(1),
112
- },
113
- }));
114
- function Autocompleter(props) {
115
- const { rows, value, searchKey, searchType, onSelection, id, className, label, name, matchInListConditionCallback } = props;
116
- const anchorRef = (0, react_1.useRef)(null);
117
- const [filteredRows, setFilteredRows] = (0, react_1.useState)([]);
118
- const [open, setOpen] = (0, react_1.useState)(false);
119
- const [focusOnList, setFocusOnList] = (0, react_1.useState)(false);
120
- const [valorIngresado, setValorIngresado] = (0, react_1.useState)(null);
121
- (0, react_1.useEffect)(() => {
122
- setValorIngresado(value);
123
- }, [value]);
124
- (0, react_1.useEffect)(() => {
125
- document.body.style.overflow = open ? 'hidden' : 'unset';
126
- });
127
- const focusToId = (id, opts, cb) => {
128
- var element = document.getElementById(id);
129
- var padre = element;
130
- while (padre && padre.className != 'pregunta' && padre != document.body)
131
- padre = padre.parentElement;
132
- if (padre && padre.className == 'pregunta')
133
- element = padre;
134
- if (element) {
135
- if (cb) {
136
- cb(element);
137
- }
138
- else {
139
- element.focus();
140
- if (opts.moveToElement) {
141
- element.scrollIntoView();
142
- window.scroll({ behavior: opts.moveBehavior || 'auto', top: window.scrollY - 100, left: 0 });
143
- }
144
- }
145
- }
146
- };
147
- const checkIfValue = () => {
148
- var result = rows.find((row) => row[searchKey].toString().toLowerCase() == (valorIngresado || '').toLowerCase());
149
- if (result) {
150
- setValorIngresado(result[searchKey]);
151
- onSelection(result);
152
- setOpen(false);
153
- }
154
- else {
155
- setValorIngresado(null);
156
- setFilteredRows([]);
157
- onSelection(null);
158
- setOpen(false);
159
- }
160
- };
161
- const handleClose = (event) => {
162
- if (anchorRef.current && anchorRef.current.contains(event.target)) {
163
- return;
164
- }
165
- checkIfValue();
166
- //y al borrar con backspace primero marca si no está marcado y después borra
167
- focusToId(id, { moveToElement: false });
168
- };
169
- const handleSelection = (row) => {
170
- onSelection(row);
171
- setValorIngresado(row[searchKey]);
172
- setFilteredRows([]);
173
- setOpen(false);
174
- focusToId(id, { moveToElement: false });
175
- };
176
- return React.createElement(React.Fragment, null,
177
- React.createElement(core_1.TextField, { id: id, className: className, spellCheck: false, autoCapitalize: "off", autoComplete: "off", autoCorrect: "off", multiline: props.multiline, name: name, label: label, ref: anchorRef, fullWidth: true, type: searchType, disabled: props.disabled || false, value: valorIngresado || '', onChange: (event) => {
178
- let value = event.target.value;
179
- setValorIngresado(event.target.value || null);
180
- setFilteredRows(rows.filter((row) => value.split(' ').every(palabraBuscada => row[searchKey].toString().toLocaleLowerCase().includes(palabraBuscada.toLocaleLowerCase()) &&
181
- (matchInListConditionCallback ? matchInListConditionCallback(row) : true))));
182
- setOpen(event.target.value.length > 1 && filteredRows.length <= 10);
183
- }, onFocus: (_event) => {
184
- setFocusOnList(false);
185
- //setOpen(!!valorIngresado && valorIngresado.length>1);
186
- }, onBlur: () => {
187
- if (!open) {
188
- checkIfValue();
189
- }
190
- }, onKeyDown: (event) => {
191
- //down key
192
- if (event.keyCode == 40) {
193
- if (open) {
194
- setFocusOnList(true);
195
- }
196
- //enter key or tab key
197
- }
198
- else if ([13, 9].includes(event.keyCode)) {
199
- checkIfValue();
200
- }
201
- }, "aria-controls": open ? 'menu-list-grow' : undefined, "aria-haspopup": "true" }),
202
- React.createElement(core_1.Popper, { open: open, anchorEl: anchorRef.current, placement: "bottom-start", transition: true }, ({ TransitionProps, placement }) => (React.createElement(core_1.Grow, { ...TransitionProps, style: { transformOrigin: placement === 'bottom' ? 'left top' : 'center bottom' } },
203
- React.createElement(core_1.Paper, null,
204
- React.createElement(core_1.ClickAwayListener, { onClickAway: handleClose },
205
- React.createElement(core_1.MenuList, { autoFocusItem: focusOnList, id: "menu-list-grow" }, filteredRows.length ?
206
- filteredRows.map((row, i) => React.createElement(core_1.MenuItem, { key: i, value: i, onClick: () => handleSelection(row), onKeyDown: (event) => {
207
- //esc key
208
- if (event.keyCode == 27 && open) {
209
- setOpen(false);
210
- focusToId(id, { moveToElement: false });
211
- }
212
- //tab
213
- if (event.keyCode == 9) {
214
- handleSelection(row);
215
- }
216
- } }, row[searchKey]))
217
- :
218
- React.createElement(core_1.MenuItem, { key: -1, disabled: true }, "Sin resultados"))))))));
219
- }
220
- function TypedField(props) {
221
- const { value, type, id, className, name, label, onChange, matchInList, disabled, textAlign, inputAdornment, adornmentPosition } = props;
222
- (0, react_1.useEffect)(() => {
223
- setMyValue(value);
224
- }, [value]);
225
- const [myValue, setMyValue] = (0, react_1.useState)(value);
226
- var inputProps = {
227
- style: { textAlign: textAlign }
228
- };
229
- var inputLabelProps = {
230
- shrink: true,
231
- };
232
- var adornmentProps = {};
233
- var adornment = inputAdornment ? React.createElement(core_1.InputAdornment, { position: "end" }, inputAdornment) : null;
234
- adornmentPosition == 'start' ?
235
- adornmentProps.startAdornment = adornment
236
- :
237
- adornmentProps.endAdornment = adornment;
238
- return React.createElement(core_1.TextField, { inputProps: inputProps, spellCheck: false, autoCapitalize: "off", autoComplete: "off", autoCorrect: "off", value: myValue == null ? '' : myValue, disabled: disabled || false, id: id, multiline: props.multiline, className: className, name: name, label: label, type: type, fullWidth: true, onChange: (event) => {
239
- var value = event.target.value;
240
- setMyValue(value == '' ? null : value);
241
- }, onBlur: () => {
242
- var value = matchInList ? matchInList.find((elem) => elem == myValue) : myValue;
243
- setMyValue(value);
244
- onChange(myValue);
245
- }, InputLabelProps: inputLabelProps, InputProps: adornmentProps });
246
- }
247
- function ClienteComponent(props) {
248
- const { datosDesde } = props;
249
- const { clientes, condicionesIva, clienteActual } = (0, react_redux_1.useSelector)((estado) => ({ clientes: estado.estructura.clientes, condicionesIva: estado.estructura.condicionesIva, clienteActual: estado[datosDesde].cliente }));
250
- const clientesArr = likeAr(clientes).array();
251
- const dispatch = (0, react_redux_1.useDispatch)();
252
- const condicionesIvaArr = likeAr(condicionesIva).array();
253
- const classes = useStyles();
254
- return React.createElement(core_1.Paper, { className: classes.paper },
255
- React.createElement(core_1.Grid, { container: true, spacing: 3 },
256
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4, md: 1 },
257
- React.createElement(TypedField, { value: clienteActual.cliente, type: "number", id: "cliente", name: "cliente", label: "Cliente", matchInList: clientesArr.map((cliente) => cliente.cliente), disabled: !props.editando, onChange: (value) => {
258
- var searchResult = null;
259
- if (value) {
260
- searchResult = clientesArr.find((cliente) => cliente.cliente == value) || null;
261
- }
262
- dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...searchResult }, datosDesde }));
263
- } })),
264
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 8, md: 5 },
265
- React.createElement(Autocompleter, { rows: clientesArr, value: clienteActual.razon_social || '', id: "razon-social", name: "razon-social", label: "Razon social", searchKey: "razon_social", searchType: "text", disabled: !props.editando, onSelection: (clienteSeleccionado) => dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...clienteSeleccionado }, datosDesde })) })),
266
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 6, md: 3 },
267
- React.createElement(core_1.FormControl, { fullWidth: true },
268
- React.createElement(core_1.InputLabel, { id: "condicion_iva_label" }, "Cond. IVA"),
269
- React.createElement(core_1.Select, { disabled: true, labelId: "condicion_iva_label", id: "condicion_iva", value: clienteActual.condicion_iva || '', onChange: (event) => {
270
- var condicion_iva = event.target.value || null;
271
- dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...clienteActual, condicion_iva }, datosDesde }));
272
- } }, condicionesIvaArr.map((condicionIva) => React.createElement(core_1.MenuItem, { key: condicionIva.condicion, value: condicionIva.condicion }, condicionIva.nombre))))),
273
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 6, md: 3 },
274
- React.createElement(TypedField, { type: "number", disabled: true, value: clienteActual.cuit_dni, id: "cuit_dni", label: "CUIT/DNI", name: "cuit_dni", onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...clienteActual, cuit_dni: Number(value) }, datosDesde })) }))));
275
- }
276
- function EstadoPresupuesto(props) {
277
- const { presupuesto, estadosPresupuesto } = (0, react_redux_1.useSelector)((estado) => ({ presupuesto: estado.datosPresupuesto.presupuesto, estadosPresupuesto: estado.estructura.estadosPresupuesto }));
278
- const dispatch = (0, react_redux_1.useDispatch)();
279
- const classes = useStyles();
280
- return React.createElement(core_1.Paper, { className: classes.paper },
281
- React.createElement(core_1.Grid, { container: true, spacing: 3 },
282
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
283
- React.createElement(core_1.FormControl, { fullWidth: true },
284
- React.createElement(core_1.InputLabel, { id: "estado_label" }, "Estado"),
285
- React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: presupuesto.estado || '', disabled: true, onChange: (event) => {
286
- var estado = event.target.value || null;
287
- dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "estado", valor: estado }));
288
- } }, estadosPresupuesto
289
- .map((estado) => React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre))))),
290
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
291
- React.createElement(TypedField, { type: "date", value: presupuesto.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "fecha", valor: value }))) })),
292
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
293
- React.createElement(TypedField, { type: "date", value: presupuesto.valido_hasta, id: "valido_hasta", label: "valido hasta", name: "valido_hasta", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "valido_hasta", valor: value }))) }))));
294
- }
295
- function EstadoPedido(props) {
296
- const { pedido, estadosPedido } = (0, react_redux_1.useSelector)((estado) => ({ pedido: estado.datosPedido.pedido, estadosPedido: estado.estructura.estadosPedido }));
297
- const dispatch = (0, react_redux_1.useDispatch)();
298
- const classes = useStyles();
299
- return React.createElement(core_1.Paper, { className: classes.paper },
300
- React.createElement(core_1.Grid, { container: true, spacing: 3 },
301
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
302
- React.createElement(core_1.FormControl, { fullWidth: true },
303
- React.createElement(core_1.InputLabel, { id: "estado_label" }, "Estado"),
304
- React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: pedido.estado || '', disabled: !props.editando, onChange: (event) => {
305
- var estado = event.target.value || null;
306
- dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "estado", valor: estado }));
307
- } }, estadosPedido.map((estado) => React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre))))),
308
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
309
- React.createElement(TypedField, { type: "date", value: pedido.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha", valor: value }))) })),
310
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
311
- React.createElement(TypedField, { type: "date", value: pedido.fecha_entrega, id: "fecha_entrega", label: "fecha entrega", name: "fecha_entrega", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha_entrega", valor: value }))) }))));
312
- }
313
- function ObservacionesPedido(props) {
314
- const { pedido } = (0, react_redux_1.useSelector)((estado) => ({ pedido: estado.datosPedido.pedido }));
315
- const dispatch = (0, react_redux_1.useDispatch)();
316
- const classes = useStyles();
317
- return React.createElement(core_1.Paper, { className: classes.paper },
318
- React.createElement(core_1.Grid, { container: true, spacing: 3 },
319
- React.createElement(core_1.Grid, { item: true, xs: 12, sm: 12 },
320
- React.createElement(TypedField, { type: "text", disabled: !props.editando, value: pedido.observaciones, id: "observaciones", label: "Observaciones", name: "observaciones", onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "observaciones", valor: value })) }))));
321
- }
322
- function Items(props) {
323
- const { conDescuentoEnItems, conOpciones, datosDesde, presupuestoOPedido } = props;
324
- const { items, cliente } = (0, react_redux_1.useSelector)((estado) => estado[datosDesde]);
325
- const classes = useStyles();
326
- const dispatch = (0, react_redux_1.useDispatch)();
327
- const handleAdd = () => {
328
- dispatch(redux_formulario_1.dispatchers.ADD_ITEM({ datosDesde }));
329
- setTimeout(() => (0, render_general_1.focusToId)("cantidad_" + (items.length - 1).toString(), { moveToElement: false }), 100);
330
- };
331
- return React.createElement(core_1.TableContainer, { component: core_1.Paper },
332
- React.createElement(core_1.Table, { "aria-label": "customized table", id: "items-table" },
333
- React.createElement(core_1.TableHead, null,
334
- React.createElement(core_1.TableRow, null,
335
- React.createElement(StyledTableCell, { style: { width: "50px" }, className: "not-print" }, "Items"),
336
- React.createElement(StyledTableCell, { style: { width: "55px" } }, "Cantidad"),
337
- React.createElement(StyledTableCell, { style: { width: "60px" } }, "Cod prod"),
338
- React.createElement(StyledTableCell, { className: "not-print" }, "Nombre prod"),
339
- React.createElement(StyledTableCell, null, "Descripcion"),
340
- React.createElement(StyledTableCell, { style: { width: "80px" }, align: "right" }, "P unitario"),
341
- conDescuentoEnItems ? React.createElement(StyledTableCell, { style: { width: "40px" }, align: "right" }, "Dto") : null,
342
- conDescuentoEnItems ? React.createElement(StyledTableCell, { style: { width: "50px" }, align: "right" }, "Bonif") : null,
343
- React.createElement(StyledTableCell, { style: { width: "80px" }, align: "right" }, "Total"))),
344
- React.createElement(core_1.TableBody, null,
345
- items.map((item, index) => (React.createElement(ItemP, { key: index, index: index, item: item, editando: props.editando, cliente: cliente, conDescuentoEnItems: conDescuentoEnItems, datosDesde: datosDesde }))),
346
- React.createElement(core_1.TableRow, null,
347
- React.createElement(StyledTableCell, { className: "not-print" },
348
- React.createElement(core_1.Button, { size: "small", variant: "outlined", color: "primary", onClick: handleAdd, disabled: !props.editando, onKeyDown: (event) => {
349
- //enter
350
- if ([13].includes(event.keyCode)) {
351
- handleAdd();
352
- }
353
- }, className: classes.button },
354
- React.createElement(render_general_1.ICON.Add, null))),
355
- React.createElement(StyledTableCell, { className: "not-print" }),
356
- conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 2 }) : null,
357
- conOpciones ?
358
- React.createElement(StyledTableCell, { colSpan: 2, align: "right" })
359
- :
360
- React.createElement(React.Fragment, null,
361
- React.createElement(StyledTableCell, { colSpan: 4, align: "right" }, "subtotal $"),
362
- React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, presupuestoOPedido.subtotal))),
363
- conOpciones ? null : React.createElement(React.Fragment, null,
364
- React.createElement(core_1.TableRow, null,
365
- React.createElement(StyledTableCell, { className: "not-print" }),
366
- React.createElement(StyledTableCell, { className: "not-print" }),
367
- conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 2 }) : null,
368
- React.createElement(StyledTableCell, { align: "right", colSpan: 4 }, "descuento general $"),
369
- React.createElement(StyledTableCell, { align: "right" },
370
- React.createElement(TypedField, { textAlign: "right", type: "number", disabled: !props.editando, value: presupuestoOPedido.descuento, id: "descuento", name: "descuento", onChange: (value) => datosDesde == 'datosPresupuesto' ?
371
- dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PRESUPUESTO({ descuento: Number(value) }))
372
- :
373
- dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PEDIDO({ descuento: Number(value) })) }))),
374
- React.createElement(core_1.TableRow, null,
375
- React.createElement(StyledTableCell, { className: "not-print" }),
376
- React.createElement(StyledTableCell, { className: "not-print" }),
377
- conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 3 }) : null,
378
- React.createElement(StyledTableCell, { align: "right", colSpan: conDescuentoEnItems ? 3 : 4 }, "total $"),
379
- React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, presupuestoOPedido.total))))));
380
- }
381
- function ItemP(props) {
382
- var _a, _b;
383
- const { productos } = (0, react_redux_1.useSelector)((estado) => estado.estructura);
384
- const productosArr = likeAr(productos).array();
385
- const dispatch = (0, react_redux_1.useDispatch)();
386
- const { item, index, conDescuentoEnItems, cliente, datosDesde } = props;
387
- const classes = useStyles();
388
- const EDICION_LIBRE = item.producto == 0;
389
- return React.createElement(core_1.Grow, { in: true },
390
- React.createElement(StyledTableRow, { key: item.producto },
391
- React.createElement(StyledTableCell, { className: "not-print" },
392
- React.createElement(core_1.Button, { id: "agregar_" + index.toString(), size: "small", variant: "outlined", disabled: !props.editando, color: "secondary", onClick: () => {
393
- dispatch(redux_formulario_1.dispatchers.REMOVE_ITEM({ index: index, datosDesde }));
394
- }, className: classes.button },
395
- React.createElement(render_general_1.ICON.DeleteOutline, null))),
396
- React.createElement(StyledTableCell, { align: "right" },
397
- React.createElement(TypedField, { id: "cantidad_" + index.toString(), type: "number", value: item.cantidad || null, name: "cantidad", disabled: !props.editando, onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_CANTIDAD_ITEM({ index, cantidad: Number(value), datosDesde })) })),
398
- React.createElement(StyledTableCell, { align: "right" },
399
- React.createElement(TypedField, { value: item.producto || null, id: "poroducto_" + index.toString(), name: "producto", type: "number", disabled: !props.editando, matchInList: EDICION_LIBRE ? undefined : productosArr.map((producto) => producto.producto), onChange: (value) => {
400
- if (value == '0') {
401
- dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'producto', valor: value, datosDesde }));
402
- }
403
- else {
404
- var searchResult = null;
405
- if (value) {
406
- searchResult = productosArr.find((producto) => producto.producto == value) || null;
407
- }
408
- dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index, producto: searchResult, datosDesde }));
409
- }
410
- } })),
411
- React.createElement(StyledTableCell, { className: "not-print" },
412
- React.createElement(render_general_1.AltoImpresionStyle, { charsPerLine: conDescuentoEnItems ? 60 : 75, componentId: "nombre-producto_" + index.toString(), lineHeight: 30, value: (item === null || item === void 0 ? void 0 : item.nombre) || '' }),
413
- React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, {
414
- ...{
415
- value: (item === null || item === void 0 ? void 0 : item.nombre) || '',
416
- id: "nombre-producto_" + index.toString(),
417
- name: "nombre-producto",
418
- disabled: !props.editando,
419
- multiline: true,
420
- matchInListConditionCallback: (producto) => cliente.cliente == producto.cliente || producto.cliente == null
421
- }, ...(EDICION_LIBRE ? {
422
- onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'nombre', valor: value, datosDesde }))
423
- } : {
424
- rows: productosArr,
425
- searchKey: "nombre",
426
- searchType: "text",
427
- onSelection: (productoSeleccionado) => dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index, producto: productoSeleccionado, datosDesde }))
428
- })
429
- })),
430
- React.createElement(StyledTableCell, null,
431
- React.createElement(render_general_1.AltoImpresionStyle, { charsPerLine: conDescuentoEnItems ? 60 : 75, componentId: "descripcion-producto_" + index.toString(), lineHeight: 30, value: (item === null || item === void 0 ? void 0 : item.descripcion) || '' }),
432
- React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, {
433
- ...{
434
- value: (item === null || item === void 0 ? void 0 : item.descripcion) || '',
435
- id: "descripcion-producto_" + index.toString(),
436
- name: "descripcion-producto",
437
- disabled: !props.editando,
438
- multiline: true,
439
- }, ...(EDICION_LIBRE ? {
440
- onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'descripcion', valor: value, datosDesde }))
441
- } : {
442
- rows: productosArr,
443
- searchKey: "descripcion",
444
- searchType: "text",
445
- onSelection: (productoSeleccionado) => dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index, producto: productoSeleccionado, datosDesde }))
446
- })
447
- })),
448
- React.createElement(StyledTableCell, { align: "right" }, EDICION_LIBRE ?
449
- React.createElement(TypedField, { textAlign: "right", id: "precio_unitario" + index.toString(), type: "number", value: item.precio_unitario || null, name: "precio_unitario", disabled: !props.editando, onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'precio_unitario', valor: value, datosDesde })) })
450
- :
451
- (_a = item.precio_unitario) === null || _a === void 0 ? void 0 : _a.toString()),
452
- conDescuentoEnItems ?
453
- React.createElement(React.Fragment, null,
454
- React.createElement(StyledTableCell, { align: "right" },
455
- React.createElement(TypedField, { textAlign: "right", value: item.porcentaje_descuento || 0, id: "porcentaje_descuento_" + index.toString(), name: "porcentaje_descuento", type: "number", disabled: !props.editando, onChange: (value) => {
456
- dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_ITEM({ index, porcentaje: Number(value), datosDesde }));
457
- }, inputAdornment: "%" })),
458
- React.createElement(StyledTableCell, { align: "right" }, item.descuento))
459
- : null,
460
- React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, (_b = item.total) === null || _b === void 0 ? void 0 : _b.toString())));
461
- }
462
- const StyledTableCell = (0, core_1.withStyles)((theme) => (0, core_1.createStyles)({
463
- head: {
464
- backgroundColor: theme.palette.common.black,
465
- color: theme.palette.common.white,
466
- },
467
- body: {
468
- fontSize: 14,
469
- padding: 8
470
- },
471
- }))(core_1.TableCell);
472
- const StyledTableRow = (0, core_1.withStyles)((theme) => (0, core_1.createStyles)({
473
- root: {
474
- '&:nth-of-type(odd)': {
475
- backgroundColor: theme.palette.action.hover,
476
- },
477
- },
478
- }))(core_1.TableRow);
479
- function PresupuestoComponent(_props) {
480
- var _a;
481
- const { cliente, presupuesto, items } = (0, react_redux_1.useSelector)((estado) => (estado.datosPresupuesto));
482
- const { estadosPresupuesto } = (0, react_redux_1.useSelector)((estado) => ({ estadosPresupuesto: estado.estructura.estadosPresupuesto }));
483
- const { parametros } = (0, react_redux_1.useSelector)((estado) => (estado.estructura));
484
- const classes = useStyles();
485
- const dispatch = (0, react_redux_1.useDispatch)();
486
- const [open, setOpen] = (0, react_1.useState)(false);
487
- const esNuevo = !(presupuesto.presupuesto);
488
- const disabled = !((_a = estadosPresupuesto.find((estado) => estado.estado == presupuesto.estado)) === null || _a === void 0 ? void 0 : _a.permite_editar);
489
- const [editando, setEditando] = (0, react_1.useState)(esNuevo);
490
- const [snackBarMessage, setSnackBarMessage] = (0, react_1.useState)('');
491
- const hayDescuentosIngresados = items.some((item) => item.descuento != 0);
492
- const handleClose = (_event, reason) => {
493
- if (reason === 'clickaway') {
494
- return;
495
- }
496
- setOpen(false);
497
- };
498
- return React.createElement("main", { className: classes.layout, id: "presupuesto" },
499
- React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
500
- React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-start", direction: "row" },
501
- React.createElement("h2", null, presupuesto.presupuesto ? `Presupuesto Nº ${presupuesto.presupuesto}` : `Nuevo presupuesto`)),
502
- React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
503
- React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: () => {
504
- setEditando(!editando);
505
- }, disabled: disabled, className: classes.button }, editando ?
506
- React.createElement(render_general_1.ICON.Cancel, null)
507
- :
508
- React.createElement(render_general_1.ICON.Edit, null)),
509
- React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: () => {
510
- window.print();
511
- }, className: classes.button },
512
- React.createElement(render_general_1.ICON.Print, null))),
513
- React.createElement(ClienteComponent, { editando: editando, datosDesde: "datosPresupuesto" }),
514
- React.createElement(EstadoPresupuesto, { editando: editando }),
515
- React.createElement(Items, { editando: editando, conDescuentoEnItems: presupuesto.con_descuento_en_items, conOpciones: presupuesto.con_opciones, datosDesde: 'datosPresupuesto', presupuestoOPedido: presupuesto }),
516
- React.createElement(core_1.Grid, { container: true, className: "not-print", alignItems: "flex-start", justify: "flex-end", direction: "row" },
517
- React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_opciones, onChange: ((event) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_opciones", valor: event.target.checked }))), disabled: !editando, name: "con_opciones", color: "primary" }), labelPlacement: "start", label: "ocultar totales" })),
518
- React.createElement(core_1.Grid, { container: true, className: "not-print", alignItems: "flex-start", justify: "flex-end", direction: "row" },
519
- React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_descuento_en_items, onChange: ((event) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_descuento_en_items", valor: event.target.checked }))), disabled: !editando || hayDescuentosIngresados, name: "con_descuento_en_items", color: "primary" }), labelPlacement: "start", label: "descuento en items" })),
520
- React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
521
- React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: async () => {
522
- try {
523
- let result = await (0, redux_formulario_1.guardarPresupuesto)(cliente, presupuesto, items);
524
- dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "presupuesto", valor: result.presupuesto }));
525
- setSnackBarMessage(`Presupuesto ${result.presupuesto} guardado`);
526
- setOpen(true);
527
- setEditando(false);
528
- }
529
- catch (err) {
530
- setSnackBarMessage(`Error al guardar el presupuesto. ${err.message}`);
531
- setOpen(true);
532
- }
533
- }, className: classes.button },
534
- React.createElement(render_general_1.ICON.Save, null)),
535
- React.createElement(core_1.Snackbar, { anchorOrigin: {
536
- vertical: 'bottom',
537
- horizontal: 'left',
538
- }, open: open, autoHideDuration: 6000, onClose: handleClose, message: snackBarMessage, action: React.createElement(React.Fragment, null,
539
- React.createElement(core_1.IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: handleClose },
540
- React.createElement(render_general_1.ICON.Close, null))) })),
541
- (parametros === null || parametros === void 0 ? void 0 : parametros.legales_presupuesto) ?
542
- React.createElement(core_1.Paper, { className: classes.paper + " legales" },
543
- React.createElement("p", null, parametros.legales_presupuesto))
544
- :
545
- null);
546
- }
547
- function PedidoComponent(_props) {
548
- const { cliente, pedido, items } = (0, react_redux_1.useSelector)((estado) => (estado.datosPedido));
549
- const classes = useStyles();
550
- const dispatch = (0, react_redux_1.useDispatch)();
551
- const [open, setOpen] = (0, react_1.useState)(false);
552
- const esNuevo = !(pedido.pedido);
553
- const [editando, setEditando] = (0, react_1.useState)(esNuevo);
554
- const [snackBarMessage, setSnackBarMessage] = (0, react_1.useState)('');
555
- const handleClose = (_event, reason) => {
556
- if (reason === 'clickaway') {
557
- return;
558
- }
559
- setOpen(false);
560
- };
561
- return React.createElement("main", { className: classes.layout, id: "pedido" },
562
- React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
563
- React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-start", direction: "row" },
564
- React.createElement("h2", null, pedido.pedido ? `Pedido Nº ${pedido.pedido}` : `Nuevo pedido`)),
565
- React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
566
- React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: () => {
567
- setEditando(!editando);
568
- }, className: classes.button }, editando ?
569
- React.createElement(render_general_1.ICON.Cancel, null)
570
- :
571
- React.createElement(render_general_1.ICON.Edit, null)),
572
- React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: () => {
573
- window.print();
574
- }, className: classes.button },
575
- React.createElement(render_general_1.ICON.Print, null))),
576
- React.createElement(ClienteComponent, { editando: editando, datosDesde: "datosPedido" }),
577
- React.createElement(EstadoPedido, { editando: editando }),
578
- React.createElement(Items, { editando: editando, conDescuentoEnItems: true, conOpciones: false, datosDesde: 'datosPedido', presupuestoOPedido: pedido }),
579
- React.createElement(ObservacionesPedido, { editando: editando }),
580
- React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
581
- React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: async () => {
582
- try {
583
- let result = await (0, redux_formulario_1.guardarPedido)(cliente, pedido, items);
584
- dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "pedido", valor: result.pedido }));
585
- setSnackBarMessage(`Pedido ${result.pedido} guardado`);
586
- setOpen(true);
587
- setEditando(false);
588
- }
589
- catch (err) {
590
- setSnackBarMessage(`Error al guardar el pedido. ${err.message}`);
591
- setOpen(true);
592
- }
593
- }, className: classes.button },
594
- React.createElement(render_general_1.ICON.Save, null)),
595
- React.createElement(core_1.Snackbar, { anchorOrigin: {
596
- vertical: 'bottom',
597
- horizontal: 'left',
598
- }, open: open, autoHideDuration: 6000, onClose: handleClose, message: snackBarMessage, action: React.createElement(React.Fragment, null,
599
- React.createElement(core_1.IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: handleClose },
600
- React.createElement(render_general_1.ICON.Close, null))) })));
601
- }
602
- async function desplegarPresupuesto(store) {
603
- ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
604
- React.createElement(PresupuestoComponent, null)), document.getElementById('main_layout'));
605
- }
606
- async function desplegarPedido(store) {
607
- ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
608
- React.createElement(PedidoComponent, null)), document.getElementById('main_layout'));
609
- }
610
- if (typeof window !== 'undefined') {
611
- // @ts-ignore para hacerlo
612
- window.desplegarPresupuesto = desplegarPresupuesto;
613
- // @ts-ignore para hacerlo
614
- window.desplegarPedido = desplegarPedido;
615
- }
616
- });
617
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWNvbXBvbmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L3JlbmRlci1jb21wb25lbnRzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUEwSEEsc0NBMEtDO0lBQ0QsZ0NBNkRDO0lBRUQsNENBMEVDO0lBRUQsOENBdURDO0lBRUQsb0NBcURDO0lBQ0Qsa0RBcUJDO0lBRUQsc0JBMkdDO0lBRUQsc0JBb0pDO0lBeUJELG9EQStJQztJQUVELDBDQWdHQztJQUVELG9EQVFDO0lBRUQsMENBUUM7SUFybENELCtCQUErQjtJQUMvQixzQ0FBc0M7SUFDdEMscURBUTBCO0lBQzFCLHlEQUMwSDtJQUMxSCw0Q0FXMkI7SUFDM0IsaUNBQW9EO0lBQ3BELDZDQUFpRTtJQUNqRSxrQ0FBa0M7SUFNckIsUUFBQSwyQkFBMkIsR0FBd0IsVUFBVSxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFDLEtBQUssQ0FBQztJQUVOLElBQUksNkJBQTZCLEdBQUcsQ0FBQyxnQkFBaUMsRUFBQyxFQUFFO1FBQzVFLElBQUksRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBQyxHQUFJLGdCQUFnQixDQUFDO1FBQ3RELElBQUksV0FBVyxHQUFlO1lBQzFCLE9BQU87WUFDUCxLQUFLO1lBQ0wsTUFBTSxFQUFDO2dCQUNILFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVztnQkFDcEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO2dCQUM1QixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7Z0JBQ2hDLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUTtnQkFDOUIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO2dCQUN4QixHQUFHLElBQUEsb0NBQWlCLEdBQUU7YUFDekI7U0FDSixDQUFBO1FBQ0QsT0FBTyxXQUFXLENBQUE7SUFDdEIsQ0FBQyxDQUFBO0lBZlUsUUFBQSw2QkFBNkIsaUNBZXZDO0lBS0QsRUFBRSxD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LE1BQU0sQ0FDWCxvQkFBQyxzQkFBUSxJQUFDLEtBQUssRUFBRSxLQUFLO1lBQ2xCLG9CQUFDLG9CQUFvQixPQUFFLENBQ2hCLEVBRVgsUUFBUSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FDekMsQ0FBQTtJQUNMLENBQUM7SUFFTSxLQUFLLFVBQVUsZUFBZSxDQUFDLEtBQXdDO1FBQzFFLFFBQVEsQ0FBQyxNQUFNLENBQ1gsb0JBQUMsc0JBQVEsSUFBQyxLQUFLLEVBQUUsS0FBSztZQUNsQixvQkFBQyxlQUFlLE9BQUUsQ0FDWCxFQUVYLFFBQVEsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQ3pDLENBQUE7SUFDTCxDQUFDO0lBRUQsSUFBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUMsQ0FBQztRQUM5QiwwQkFBMEI7UUFDMUIsTUFBTSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBQ25ELDBCQUEwQjtRQUMxQixNQUFNLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcclxuaW1wb3J0IHsgIFxyXG4gICAgRm9jdXNPcHRzLCBSZW5kZXJQcmluY2lwYWwsIFxyXG4gICAgY2xzeCxcclxuICAgIElDT04sXHJcbiAgICBmb2N1c1RvSWQsXHJcbiAgICBzY3JvbGxUb1RvcCxcclxuICAgIHNjcm9sbFRvQm90dG9tLFxyXG4gICAgSW5wdXRUeXBlcywgdG90YWxzU3R5bGVzLCBBbHRvSW1wcmVzaW9uU3R5bGVcclxufSBmcm9tIFwiLi9yZW5kZXItZ2VuZXJhbFwiO1xyXG5pbXBvcnQgeyBkaXNwYXRjaGVycywgY3JlYXJTdG9yZSwgQWN0aW9uRm9ybXVsYXJpb1N0YXRlLCBndWFyZGFyUHJlc3VwdWVzdG8sIFxyXG4gICAgY3JlYXRlSW5pdGlhbFN0YXRlUHJlc3VwdWVzdG8sIGd1YXJkYXJQZWRpZG8sIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbywgaW5pY2lhbGl6YXJQZWRpZG8gfSBmcm9tIFwiLi9yZWR1eC1mb3JtdWxhcmlvXCI7XHJcbmltcG9ydCB7XHJcbiAgICBBcHBCYXIsIEJhZGdlLCBCdXR0b24sIEJ1dHRvbkdyb3VwLCBDYXJkLCBDaGVja2JveCwgQ2hpcCwgQ2lyY3VsYXJQcm9ncmVzcywgQ3NzQmFzZWxpbmUsIFxyXG4gICAgRGlhbG9nLCBEaWFsb2dBY3Rpb25zLCBEaWFsb2dDb250ZW50LCBEaWFsb2dDb250ZW50VGV4dCwgXHJcbiAgICBEaWFsb2dUaXRsZSwgRGl2aWRlciwgRmFiLCBGb3JtQ29udHJvbExhYmVsLCBHcmlkLCBJY29uQnV0dG9uLCBJbnB1dEJhc2UsIElucHV0TGFiZWwsIFxyXG4gICAgTGluaywgTGlzdCwgTGlzdEl0ZW0sIExpc3RJdGVtSWNvbiwgTGlzdEl0ZW1UZXh0LCBEcmF3ZXIsIFxyXG4gICAgTWVudSwgTWVudUl0ZW0sIFBhcGVyLCBQb3BvdmVyLFxyXG4gICAgU2VsZWN0LCBTbmFja2JhciwgU3RlcCwgU3RlcHBlciwgU3RlcENvbnRlbnQsIFN0ZXBMYWJlbCwgXHJcbiAgICBTdmdJY29uLCBTd2l0Y2gsIFxyXG4gICAgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCBUYWJsZUhlYWQsIFRhYmxlUm93LCBUZXh0RmllbGQsIFRoZW1lLCBUb29sYmFyLCBUeXBvZ3JhcGh5LCBab29tLFxyXG4gICAgdXNlU2Nyb2xsVHJpZ2dlcixcclxuICAgIGNyZWF0ZVN0eWxlcywgbWFrZVN0eWxlcywgSWNvbiwgUG9wcGVyLCBHcm93LCBDbGlja0F3YXlMaXN0ZW5lciwgTWVudUxpc3QsIEZvcm1Db250cm9sLCBUYWJsZUNvbnRhaW5lciwgd2l0aFN0eWxlcywgSW5wdXRBZG9ybm1lbnQsIElucHV0UHJvcHNcclxufSBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmVcIjtcclxuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7IHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCwgUHJvdmlkZXIgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjsgXHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5pbXBvcnQge3NhdmVEZXBvdH0gZnJvbSBcIi4vcmVuZGVyLWhhbmRsZXJzXCI7XHJcbmltcG9ydCB7IENsaWVudGUsIFByb2R1Y3RvLCBJdGVtLCBTdGF0ZSwgRGF0b3NQcmVzdXB1ZXN0bywgSWRDb25kSXZhLCBEYXRvc1BlZGlkbywgRGF0b3NEZXNkZSwgUHJlc3VwdWVzdG8sIFBlZGlkbywgSWRFc3RhZG9QcmVzdXB1ZXN0byB9IGZyb20gXCIuL3RpcG9zXCI7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSBcInJlZHV4XCI7XHJcbmltcG9ydCB7IEFjdGlvbnNGcm9tIH0gZnJvbSBcInJlZHV4LXR5cGVkLXJlZHVjZXJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBFU1RBRE9fQUNFUFRBRE9fUFJFU1VQVUVTVE86IElkRXN0YWRvUHJlc3VwdWVzdG8gPSBcImFjZXB0YWRvXCI7XHJcbnZhciBteT1teU93bjtcclxuXHJcbmV4cG9ydCB2YXIgZ2VuZXJhclBlZGlkb0Rlc2RlUHJlc3VwdWVzdG8gPSAoZGF0b3NQcmVzdXB1ZXN0bzpEYXRvc1ByZXN1cHVlc3RvKT0+e1xyXG4gICAgbGV0IHtjbGllbnRlLCBpdGVtcywgcHJlc3VwdWVzdG99ICA9IGRhdG9zUHJlc3VwdWVzdG87XHJcbiAgICBsZXQgZGF0b3NQZWRpZG86RGF0b3NQZWRpZG8gPSB7XHJcbiAgICAgICAgY2xpZW50ZSxcclxuICAgICAgICBpdGVtcyxcclxuICAgICAgICBwZWRpZG86e1xyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0bzogcHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgIGNsaWVudGU6IHByZXN1cHVlc3RvLmNsaWVudGUsXHJcbiAgICAgICAgICAgIGRlc2N1ZW50bzogcHJlc3VwdWVzdG8uZGVzY3VlbnRvLFxyXG4gICAgICAgICAgICBzdWJ0b3RhbDogcHJlc3VwdWVzdG8uc3VidG90YWwsXHJcbiAgICAgICAgICAgIHRvdGFsOiBwcmVzdXB1ZXN0by50b3RhbCxcclxuICAgICAgICAgICAgLi4uaW5pY2lhbGl6YXJQZWRpZG8oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkYXRvc1BlZGlkb1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5teS53U2NyZWVucy5wcmVzdXB1ZXN0bz1hc3luYyBmdW5jdGlvbihhZGRyUGFyYW1zKXtcclxuICAgIHZhciBkYXRvc1ByZXN1cHVlc3RvOiBEYXRvc1ByZXN1cHVlc3RvfG51bGw9bnVsbDtcclxuICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgIGlmKGFkZHJQYXJhbXMucHJlc3VwdWVzdG8pe1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgICAgICBkYXRvc1ByZXN1cHVlc3RvID0gYXdhaXQgbXkuYWpheC5wcmVzdXB1ZXN0b19jYXJnYXIoe3ByZXN1cHVlc3RvOmFkZHJQYXJhbXMucHJlc3VwdWVzdG99KTtcclxuICAgIH1cclxuICAgIHZhciBzdG9yZSA9IGF3YWl0IGNyZWFyU3RvcmUoe3VzZVNlc3Npb25TdG9yYWdlOnRydWUsIGRhdG9zUHJlc3VwdWVzdG86IGRhdG9zUHJlc3VwdWVzdG8gfHwgdW5kZWZpbmVkfSwgY3JlYXRlSW5pdGlhbFN0YXRlUHJlc3VwdWVzdG8pO1xyXG4gICAgZGVzcGxlZ2FyUHJlc3VwdWVzdG8oc3RvcmUpO1xyXG59XHJcblxyXG5teS53U2NyZWVucy5wZWRpZG89YXN5bmMgZnVuY3Rpb24oYWRkclBhcmFtcyl7XHJcbiAgICB2YXIgZGF0b3NQZWRpZG86IERhdG9zUGVkaWRvfG51bGw9bnVsbDtcclxuICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgIGlmKGFkZHJQYXJhbXMucGVkaWRvKXtcclxuICAgICAgICAvL0B0cy1pZ25vcmUgZXhpc3RlXHJcbiAgICAgICAgZGF0b3NQZWRpZG8gPSBhd2FpdCBteS5hamF4LnBlZGlkb19jYXJnYXIoe3BlZGlkbzphZGRyUGFyYW1zLnBlZGlkb30pO1xyXG4gICAgLy9AdHMtaWdub3JlIGV4aXN0ZVxyXG4gICAgfWVsc2UgaWYoYWRkclBhcmFtcy5wcmVzdXB1ZXN0byl7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlIGV4aXN0ZVxyXG4gICAgICAgIHZhciBkYXRvc1ByZXN1cHVlc3RvOiBEYXRvc1ByZXN1cHVlc3RvID0gYXdhaXQgbXkuYWpheC5wcmVzdXB1ZXN0b19jYXJnYXIoe3ByZXN1cHVlc3RvOmFkZHJQYXJhbXMucHJlc3VwdWVzdG99KTtcclxuICAgICAgICBkYXRvc1BlZGlkbyA9IGdlbmVyYXJQZWRpZG9EZXNkZVByZXN1cHVlc3RvKGRhdG9zUHJlc3VwdWVzdG8pO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0b3JlID0gYXdhaXQgY3JlYXJTdG9yZSh7dXNlU2Vzc2lvblN0b3JhZ2U6dHJ1ZSwgZGF0b3NQZWRpZG86IGRhdG9zUGVkaWRvIHx8IHVuZGVmaW5lZH0sIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbyk7XHJcbiAgICBkZXNwbGVnYXJQZWRpZG8oc3RvcmUpO1xyXG59XHJcblxyXG5cclxuXHJcbmNvbnN0IHVzZVN0eWxlcyA9IG1ha2VTdHlsZXMoKHRoZW1lKSA9PiAoe1xyXG4gICAgYXBwQmFyOiB7XHJcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxyXG4gICAgfSxcclxuICAgIGxheW91dDoge1xyXG4gICAgICB3aWR0aDogJ2F1dG8nLFxyXG4gICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBtYXJnaW5SaWdodDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgW3RoZW1lLmJyZWFrcG9pbnRzLnVwKDYwMCArIHRoZW1lLnNwYWNpbmcoMikgKiAyKV06IHtcclxuICAgICAgICAvL3dpZHRoOiA2MDAsXHJcbiAgICAgICAgLy9tYXJnaW5MZWZ0OiAnYXV0bycsXHJcbiAgICAgICAgLy9tYXJnaW5SaWdodDogJ2F1dG8nLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIHBhcGVyOiB7XHJcbiAgICAgIG1hcmdpblRvcDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgbWFyZ2luQm90dG9tOiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBwYWRkaW5nOiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBbdGhlbWUuYnJlYWtwb2ludHMudXAoNjAwICsgdGhlbWUuc3BhY2luZygzKSAqIDIpXToge1xyXG4gICAgICAgIG1hcmdpblRvcDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMiksXHJcbiAgICAgICAgcGFkZGluZzogdGhlbWUuc3BhY2luZygzKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBzdGVwcGVyOiB7XHJcbiAgICAgIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMywgMCwgNSksXHJcbiAgICB9LFxyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXHJcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1lbmQnLFxyXG4gICAgfSxcclxuICAgIGJ1dHRvbjoge1xyXG4gICAgICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcoMSksXHJcbiAgICAgIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZygxKSxcclxuICAgIH0sXHJcbiAgfSkpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEF1dG9jb21wbGV0ZXIocHJvcHM6e1xyXG4gICAgcm93czphbnlbXSwgXHJcbiAgICB2YWx1ZTphbnksXHJcbiAgICBzZWFyY2hLZXk6c3RyaW5nLCBcclxuICAgIHNlYXJjaFR5cGU6J3RleHQnfCdudW1iZXInLCBcclxuICAgIG9uU2VsZWN0aW9uOihyb3c6YW55KT0+dm9pZFxyXG4gICAgaWQ6IHN0cmluZyxcclxuICAgIGNsYXNzTmFtZT86c3RyaW5nLFxyXG4gICAgbGFiZWw/OiBzdHJpbmcsXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgZGlzYWJsZWQ/OmJvb2xlYW5cclxuICAgIG11bHRpbGluZT86Ym9vbGVhblxyXG4gICAgbWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFjaz86KGVsZW06UHJvZHVjdG8pPT5ib29sZWFuXHJcbn0pe1xyXG4gICAgY29uc3Qge3Jvd3MsIHZhbHVlLCBzZWFyY2hLZXksIHNlYXJjaFR5cGUsIG9uU2VsZWN0aW9uLCBpZCwgY2xhc3NOYW1lLCBsYWJlbCwgbmFtZSwgbWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFja30gPSBwcm9wcztcclxuICAgIGNvbnN0IGFuY2hvclJlZiA9IHVzZVJlZjxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ+KG51bGwpO1xyXG4gICAgY29uc3QgW2ZpbHRlcmVkUm93cywgc2V0RmlsdGVyZWRSb3dzXSA9IHVzZVN0YXRlPGFueVtdPihbXSk7XHJcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XHJcbiAgICBjb25zdCBbZm9jdXNPbkxpc3QsIHNldEZvY3VzT25MaXN0XSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIGNvbnN0IFt2YWxvckluZ3Jlc2Fkbywgc2V0VmFsb3JJbmdyZXNhZG9dID0gdXNlU3RhdGU8c3RyaW5nfG51bGw+KG51bGwpO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBzZXRWYWxvckluZ3Jlc2Fkbyh2YWx1ZSlcclxuICAgIH0sW3ZhbHVlXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9b3Blbj8naGlkZGVuJzondW5zZXQnXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZvY3VzVG9JZCA9IChpZDpzdHJpbmcsIG9wdHM6Rm9jdXNPcHRzLCBjYj86KGU6SFRNTEVsZW1lbnQpPT52b2lkKT0+e1xyXG4gICAgICAgIHZhciBlbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgICAgICB2YXIgcGFkcmU9ZWxlbWVudDtcclxuICAgICAgICB3aGlsZShwYWRyZSAmJiBwYWRyZS5jbGFzc05hbWUhPSdwcmVndW50YScgJiYgcGFkcmUhPWRvY3VtZW50LmJvZHkpIHBhZHJlID0gcGFkcmUucGFyZW50RWxlbWVudDtcclxuICAgICAgICBpZihwYWRyZSAmJiBwYWRyZS5jbGFzc05hbWU9PSdwcmVndW50YScpIGVsZW1lbnQ9cGFkcmU7XHJcbiAgICAgICAgaWYoZWxlbWVudCl7XHJcbiAgICAgICAgICAgIGlmKGNiKXtcclxuICAgICAgICAgICAgICAgIGNiKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGlmKG9wdHMubW92ZVRvRWxlbWVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwoe2JlaGF2aW9yOm9wdHMubW92ZUJlaGF2aW9yfHwnYXV0bycsIHRvcDp3aW5kb3cuc2Nyb2xsWS0xMDAsIGxlZnQ6MH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGVja0lmVmFsdWUgPSAoKSA9PiB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJvd3MuZmluZCgocm93KT0+cm93W3NlYXJjaEtleV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpPT0odmFsb3JJbmdyZXNhZG98fCcnKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZihyZXN1bHQpe1xyXG4gICAgICAgICAgICBzZXRWYWxvckluZ3Jlc2FkbyhyZXN1bHRbc2VhcmNoS2V5XSk7XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIHNldE9wZW4oZmFsc2UpICAgXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHNldFZhbG9ySW5ncmVzYWRvKG51bGwpO1xyXG4gICAgICAgICAgICBzZXRGaWx0ZXJlZFJvd3MoW10pO1xyXG4gICAgICAgICAgICBvblNlbGVjdGlvbihudWxsKTtcclxuICAgICAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQ8RXZlbnRUYXJnZXQ+KSA9PiB7XHJcbiAgICAgICAgaWYgKGFuY2hvclJlZi5jdXJyZW50ICYmIGFuY2hvclJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGVja0lmVmFsdWUoKTtcclxuICAgICAgICAvL3kgYWwgYm9ycmFyIGNvbiBiYWNrc3BhY2UgcHJpbWVybyBtYXJjYSBzaSBubyBlc3TDoSBtYXJjYWRvIHkgZGVzcHXDqXMgYm9ycmFcclxuICAgICAgICBmb2N1c1RvSWQoaWQsIHttb3ZlVG9FbGVtZW50OmZhbHNlfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVNlbGVjdGlvbiA9IChyb3c6YW55KT0+e1xyXG4gICAgICAgIG9uU2VsZWN0aW9uKHJvdyk7XHJcbiAgICAgICAgc2V0VmFsb3JJbmdyZXNhZG8ocm93W3NlYXJjaEtleV0pO1xyXG4gICAgICAgIHNldEZpbHRlcmVkUm93cyhbXSk7XHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgICAgZm9jdXNUb0lkKGlkLCB7bW92ZVRvRWxlbWVudDpmYWxzZX0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDw+XHJcbiAgICAgICAgPFRleHRGaWVsZFxyXG4gICAgICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxyXG4gICAgICAgICAgICBzcGVsbENoZWNrPXtmYWxzZX1cclxuICAgICAgICAgICAgYXV0b0NhcGl0YWxpemU9XCJvZmZcIlxyXG4gICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICBhdXRvQ29ycmVjdD1cIm9mZlwiXHJcbiAgICAgICAgICAgIG11bHRpbGluZT17cHJvcHMubXVsdGlsaW5lfVxyXG4gICAgICAgICAgICBuYW1lPXtuYW1lfVxyXG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgICAgICAgIHJlZj17YW5jaG9yUmVmfSBcclxuICAgICAgICAgICAgZnVsbFdpZHRoXHJcbiAgICAgICAgICAgIHR5cGU9e3NlYXJjaFR5cGV9XHJcbiAgICAgICAgICAgIGRpc2FibGVkPXtwcm9wcy5kaXNhYmxlZCB8fCBmYWxzZX1cclxuICAgICAgICAgICAgdmFsdWU9e3ZhbG9ySW5ncmVzYWRvIHx8ICcnfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgc2V0VmFsb3JJbmdyZXNhZG8oZXZlbnQudGFyZ2V0LnZhbHVlIHx8IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgc2V0RmlsdGVyZWRSb3dzKHJvd3MuZmlsdGVyKChyb3cpPT5cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zcGxpdCgnICcpLmV2ZXJ5KHBhbGFicmFCdXNjYWRhPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W3NlYXJjaEtleV0udG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhbGFicmFCdXNjYWRhLnRvTG9jYWxlTG93ZXJDYXNlKCkpICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoSW5MaXN0Q29uZGl0aW9uQ2FsbGJhY2s/bWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFjayhyb3cpOnRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgICBzZXRPcGVuKGV2ZW50LnRhcmdldC52YWx1ZS5sZW5ndGg+MSAmJiBmaWx0ZXJlZFJvd3MubGVuZ3RoIDw9IDEwKVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBvbkZvY3VzPXsoX2V2ZW50KT0+IHtcclxuICAgICAgICAgICAgICAgIHNldEZvY3VzT25MaXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vc2V0T3BlbighIXZhbG9ySW5ncmVzYWRvICYmIHZhbG9ySW5ncmVzYWRvLmxlbmd0aD4xKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgb25CbHVyPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYoIW9wZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSWZWYWx1ZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIG9uS2V5RG93bj17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgLy9kb3duIGtleVxyXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSA0MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYob3Blbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzT25MaXN0KHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9lbnRlciBrZXkgb3IgdGFiIGtleVxyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoWzEzLDldLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpKXtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0lmVmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBhcmlhLWNvbnRyb2xzPXtvcGVuID8gJ21lbnUtbGlzdC1ncm93JyA6IHVuZGVmaW5lZH1cclxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPFBvcHBlciBvcGVuPXtvcGVufSBhbmNob3JFbD17YW5jaG9yUmVmLmN1cnJlbnR9IHBsYWNlbWVudD1cImJvdHRvbS1zdGFydFwiIHRyYW5zaXRpb24+XHJcbiAgICAgICAgICB7KHsgVHJhbnNpdGlvblByb3BzLCBwbGFjZW1lbnQgfSkgPT4gKFxyXG4gICAgICAgICAgICA8R3Jvd1xyXG4gICAgICAgICAgICAgIHsuLi5UcmFuc2l0aW9uUHJvcHN9XHJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgdHJhbnNmb3JtT3JpZ2luOiBwbGFjZW1lbnQgPT09ICdib3R0b20nID8gJ2xlZnQgdG9wJyA6ICdjZW50ZXIgYm90dG9tJyB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFBhcGVyPlxyXG4gICAgICAgICAgICAgICAgPENsaWNrQXdheUxpc3RlbmVyIG9uQ2xpY2tBd2F5PXtoYW5kbGVDbG9zZX0+XHJcbiAgICAgICAgICAgICAgICAgIDxNZW51TGlzdCBhdXRvRm9jdXNJdGVtPXtmb2N1c09uTGlzdH0gIGlkPVwibWVudS1saXN0LWdyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSb3dzLmxlbmd0aD9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSb3dzLm1hcCgocm93LCBpKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17aX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCk9PmhhbmRsZVNlbGVjdGlvbihyb3cpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VzYyBrZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSAyNyAmJiBvcGVuKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wZW4oZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1RvSWQoaWQsIHttb3ZlVG9FbGVtZW50OmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90YWJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSA5KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbihyb3cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93W3NlYXJjaEtleV19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXstMX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTaW4gcmVzdWx0YWRvc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvTWVudUl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICA8L01lbnVMaXN0PlxyXG4gICAgICAgICAgICAgICAgPC9DbGlja0F3YXlMaXN0ZW5lcj5cclxuICAgICAgICAgICAgICA8L1BhcGVyPlxyXG4gICAgICAgICAgICA8L0dyb3c+XHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvUG9wcGVyPlxyXG4gICAgPC8+XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIFR5cGVkRmllbGQocHJvcHM6e1xyXG4gICAgdGV4dEFsaWduPzonbGVmdCd8J3JpZ2h0J3wnY2VudGVyJ3wnanVzdGlmeSd8J2luaGVyaXQnXHJcbiAgICB2YWx1ZTpzdHJpbmd8bnVtYmVyfG51bGwsXHJcbiAgICBkaXNhYmxlZD86Ym9vbGVhblxyXG4gICAgdHlwZTogJ3RleHQnfCdudW1iZXInfCdkYXRlJ3wndGltZSd8J3RlbCcsXHJcbiAgICBpZDpzdHJpbmcsXHJcbiAgICBjbGFzc05hbWU/OnN0cmluZyxcclxuICAgIG5hbWU/OnN0cmluZyxcclxuICAgIGxhYmVsPzpzdHJpbmdcclxuICAgIG9uQ2hhbmdlOih2YWx1ZTpzdHJpbmd8bnVtYmVyfG51bGwpPT52b2lkXHJcblxyXG4gICAgbWF0Y2hJbkxpc3Q/OmFueVtdLFxyXG4gICAgbXVsdGlsaW5lPzpib29sZWFuLFxyXG4gICAgaW5wdXRBZG9ybm1lbnQ/OnN0cmluZ1xyXG4gICAgYWRvcm5tZW50UG9zaXRpb24/OidzdGFydCd8J2VuZCdcclxufSl7XHJcbiAgICBjb25zdCB7dmFsdWUsIHR5cGUsIGlkLCBjbGFzc05hbWUsIG5hbWUsIGxhYmVsLCBvbkNoYW5nZSwgbWF0Y2hJbkxpc3QsIGRpc2FibGVkLCB0ZXh0QWxpZ24sIGlucHV0QWRvcm5tZW50LCBhZG9ybm1lbnRQb3NpdGlvbn0gPSBwcm9wcztcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgc2V0TXlWYWx1ZSh2YWx1ZSlcclxuICAgIH0sW3ZhbHVlXSk7XHJcbiAgICBjb25zdCBbbXlWYWx1ZSwgc2V0TXlWYWx1ZV0gPSB1c2VTdGF0ZSh2YWx1ZSk7XHJcbiAgICB2YXIgaW5wdXRQcm9wcz17XHJcbiAgICAgICBzdHlsZTogeyB0ZXh0QWxpZ246IHRleHRBbGlnbiB9XHJcbiAgICAgICBcclxuICAgIH1cclxuICAgIHZhciBpbnB1dExhYmVsUHJvcHM9e1xyXG4gICAgICBzaHJpbms6IHRydWUsXHJcbiAgICB9XHJcbiAgICB2YXIgYWRvcm5tZW50UHJvcHM6SW5wdXRQcm9wcyA9IHt9XHJcbiAgICB2YXIgYWRvcm5tZW50ID0gaW5wdXRBZG9ybm1lbnQ/PElucHV0QWRvcm5tZW50IHBvc2l0aW9uPVwiZW5kXCI+e2lucHV0QWRvcm5tZW50fTwvSW5wdXRBZG9ybm1lbnQ+Om51bGw7XHJcbiAgICBhZG9ybm1lbnRQb3NpdGlvbj09J3N0YXJ0Jz9cclxuICAgICAgICBhZG9ybm1lbnRQcm9wcy5zdGFydEFkb3JubWVudD1hZG9ybm1lbnRcclxuICAgIDpcclxuICAgICAgICBhZG9ybm1lbnRQcm9wcy5lbmRBZG9ybm1lbnQ9YWRvcm5tZW50XHJcbiAgICByZXR1cm4gPFRleHRGaWVsZFxyXG4gICAgICAgIGlucHV0UHJvcHM9e2lucHV0UHJvcHN9XHJcbiAgICAgICAgc3BlbGxDaGVjaz17ZmFsc2V9XHJcbiAgICAgICAgYXV0b0NhcGl0YWxpemU9XCJvZmZcIlxyXG4gICAgICAgIGF1dG9Db21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgYXV0b0NvcnJlY3Q9XCJvZmZcIlxyXG4gICAgICAgIHZhbHVlPXtteVZhbHVlPT1udWxsPycnOm15VmFsdWV9XHJcbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfHxmYWxzZX1cclxuICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgbXVsdGlsaW5lPXtwcm9wcy5tdWx0aWxpbmV9XHJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XHJcbiAgICAgICAgbmFtZT17bmFtZX1cclxuICAgICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgICAgdHlwZT17dHlwZX1cclxuICAgICAgICBmdWxsV2lkdGhcclxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgIHNldE15VmFsdWUodmFsdWU9PScnP251bGw6dmFsdWUpXHJcbiAgICAgICAgfX1cclxuICAgICAgICBvbkJsdXI9eygpPT57XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG1hdGNoSW5MaXN0P21hdGNoSW5MaXN0LmZpbmQoKGVsZW0pPT5lbGVtPT1teVZhbHVlKTpteVZhbHVlO1xyXG4gICAgICAgICAgICBzZXRNeVZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2UobXlWYWx1ZSlcclxuICAgICAgICB9fVxyXG4gICAgICAgIElucHV0TGFiZWxQcm9wcz17aW5wdXRMYWJlbFByb3BzfVxyXG4gICAgICAgIElucHV0UHJvcHM9e2Fkb3JubWVudFByb3BzfVxyXG4gICAgLz5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIENsaWVudGVDb21wb25lbnQocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW4sIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pe1xyXG4gICAgY29uc3Qge2RhdG9zRGVzZGV9ID0gcHJvcHM7XHJcbiAgICBjb25zdCB7Y2xpZW50ZXMsIGNvbmRpY2lvbmVzSXZhLCBjbGllbnRlQWN0dWFsfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe2NsaWVudGVzOmVzdGFkby5lc3RydWN0dXJhLmNsaWVudGVzLCBjb25kaWNpb25lc0l2YTplc3RhZG8uZXN0cnVjdHVyYS5jb25kaWNpb25lc0l2YSwgY2xpZW50ZUFjdHVhbDplc3RhZG9bZGF0b3NEZXNkZV0uY2xpZW50ZX0pKTtcclxuICAgIGNvbnN0IGNsaWVudGVzQXJyID0gbGlrZUFyKGNsaWVudGVzKS5hcnJheSgpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgY29uZGljaW9uZXNJdmFBcnIgPSBsaWtlQXIoY29uZGljaW9uZXNJdmEpLmFycmF5KCk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICByZXR1cm4gPFBhcGVyIGNsYXNzTmFtZT17Y2xhc3Nlcy5wYXBlcn0+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9ezN9PlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9IG1kPXsxfT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwuY2xpZW50ZX1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cImNsaWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjbGllbnRlXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkNsaWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoSW5MaXN0PXtjbGllbnRlc0Fyci5tYXAoKGNsaWVudGUpPT5jbGllbnRlLmNsaWVudGUpfVxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99IFxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hSZXN1bHQ9bnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0ID0gY2xpZW50ZXNBcnIuZmluZCgoY2xpZW50ZSk9PmNsaWVudGUuY2xpZW50ZT09dmFsdWUpIHx8IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0xJRU5URSh7Y2xpZW50ZTp7Li4uc2VhcmNoUmVzdWx0fSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17OH0gbWQ9ezV9PlxyXG4gICAgICAgICAgICAgICAgPEF1dG9jb21wbGV0ZXIgXHJcbiAgICAgICAgICAgICAgICAgICAgcm93cz17Y2xpZW50ZXNBcnJ9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwucmF6b25fc29jaWFsIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicmF6b24tc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwicmF6b24tc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlJhem9uIHNvY2lhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoS2V5PVwicmF6b25fc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hUeXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb30gXHJcbiAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Rpb249eyhjbGllbnRlU2VsZWNjaW9uYWRvOkNsaWVudGUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0xJRU5URSh7Y2xpZW50ZTp7Li4uY2xpZW50ZVNlbGVjY2lvbmFkb30sIGRhdG9zRGVzZGV9KSl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17Nn0gbWQ9ezN9PlxyXG4gICAgICAgICAgICAgICAgPEZvcm1Db250cm9sIGZ1bGxXaWR0aD5cclxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbCBpZD1cImNvbmRpY2lvbl9pdmFfbGFiZWxcIj5Db25kLiBJVkE8L0lucHV0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxJZD1cImNvbmRpY2lvbl9pdmFfbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbmRpY2lvbl9pdmFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2xpZW50ZUFjdHVhbC5jb25kaWNpb25faXZhIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpY2lvbl9pdmEgPSBldmVudC50YXJnZXQudmFsdWUgYXMgSWRDb25kSXZhfHxudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NMSUVOVEUoe2NsaWVudGU6ey4uLmNsaWVudGVBY3R1YWwsIGNvbmRpY2lvbl9pdmF9LCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29uZGljaW9uZXNJdmFBcnIubWFwKChjb25kaWNpb25JdmEpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e2NvbmRpY2lvbkl2YS5jb25kaWNpb259IHZhbHVlPXtjb25kaWNpb25JdmEuY29uZGljaW9ufT57Y29uZGljaW9uSXZhLm5vbWJyZX08L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9Gb3JtQ29udHJvbD5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezZ9IG1kPXszfT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwuY3VpdF9kbml9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJjdWl0X2RuaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDVUlUL0ROSVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImN1aXRfZG5pXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DTElFTlRFKHtjbGllbnRlOnsuLi5jbGllbnRlQWN0dWFsLCBjdWl0X2RuaTpOdW1iZXIodmFsdWUpfSwgZGF0b3NEZXNkZX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRXN0YWRvUHJlc3VwdWVzdG8ocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW59KXtcclxuICAgIGNvbnN0IHtwcmVzdXB1ZXN0bywgZXN0YWRvc1ByZXN1cHVlc3RvfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe3ByZXN1cHVlc3RvOiBlc3RhZG8uZGF0b3NQcmVzdXB1ZXN0by5wcmVzdXB1ZXN0bywgZXN0YWRvc1ByZXN1cHVlc3RvOiBlc3RhZG8uZXN0cnVjdHVyYS5lc3RhZG9zUHJlc3VwdWVzdG99KSk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICByZXR1cm4gPFBhcGVyIGNsYXNzTmFtZT17Y2xhc3Nlcy5wYXBlcn0+IFxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXszfT5cclxuICAgICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IHNtPXs0fT5cclxuICAgICAgICAgICAgICAgIDxGb3JtQ29udHJvbCBmdWxsV2lkdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPElucHV0TGFiZWwgaWQ9XCJlc3RhZG9fbGFiZWxcIj5Fc3RhZG88L0lucHV0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbElkPVwiZXN0YWRvX2xhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlc3RhZG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8uZXN0YWRvIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlc3RhZG8gPSBldmVudC50YXJnZXQudmFsdWUgYXMgc3RyaW5nfHxudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImVzdGFkb1wiLCB2YWxvcjplc3RhZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtlc3RhZG9zUHJlc3VwdWVzdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGVzdGFkbyk9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e2VzdGFkby5lc3RhZG99IHZhbHVlPXtlc3RhZG8uZXN0YWRvfT57ZXN0YWRvLm5vbWJyZX08L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L0Zvcm1Db250cm9sPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17NH0+XHJcbiAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8uZmVjaGF9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZlY2hhXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QUkVTVVBVRVNUTyh7Y2FtcG86XCJmZWNoYVwiLCB2YWxvcjp2YWx1ZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17NH0+XHJcbiAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8udmFsaWRvX2hhc3RhfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidmFsaWRvX2hhc3RhXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInZhbGlkbyBoYXN0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbGlkb19oYXN0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUFJFU1VQVUVTVE8oe2NhbXBvOlwidmFsaWRvX2hhc3RhXCIsIHZhbG9yOnZhbHVlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRXN0YWRvUGVkaWRvKHByb3BzOntlZGl0YW5kbzpib29sZWFufSl7XHJcbiAgICBjb25zdCB7cGVkaWRvLCBlc3RhZG9zUGVkaWRvfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe3BlZGlkbzogZXN0YWRvLmRhdG9zUGVkaWRvLnBlZGlkbywgZXN0YWRvc1BlZGlkbzogZXN0YWRvLmVzdHJ1Y3R1cmEuZXN0YWRvc1BlZGlkb30pKTtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSB1c2VTdHlsZXMoKTtcclxuICAgIHJldHVybiA8UGFwZXIgY2xhc3NOYW1lPXtjbGFzc2VzLnBhcGVyfT4gXHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9ezN9PlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9PlxyXG4gICAgICAgICAgICAgICAgPEZvcm1Db250cm9sIGZ1bGxXaWR0aD5cclxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbCBpZD1cImVzdGFkb19sYWJlbFwiPkVzdGFkbzwvSW5wdXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsSWQ9XCJlc3RhZG9fbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVzdGFkb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwZWRpZG8uZXN0YWRvIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVzdGFkbyA9IGV2ZW50LnRhcmdldC52YWx1ZSBhcyBzdHJpbmd8fG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUEVESURPKHtjYW1wbzpcImVzdGFkb1wiLCB2YWxvcjplc3RhZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtlc3RhZG9zUGVkaWRvLm1hcCgoZXN0YWRvKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0ga2V5PXtlc3RhZG8uZXN0YWRvfSB2YWx1ZT17ZXN0YWRvLmVzdGFkb30+e2VzdGFkby5ub21icmV9PC9NZW51SXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvRm9ybUNvbnRyb2w+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IHNtPXs0fT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwZWRpZG8uZmVjaGF9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZlY2hhXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwiZmVjaGFcIiwgdmFsb3I6dmFsdWV9KSlcclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9PlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3BlZGlkby5mZWNoYV9lbnRyZWdhfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZmVjaGFfZW50cmVnYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYSBlbnRyZWdhXCJcclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmVjaGFfZW50cmVnYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUEVESURPKHtjYW1wbzpcImZlY2hhX2VudHJlZ2FcIiwgdmFsb3I6dmFsdWV9KSlcclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgIDwvUGFwZXI+XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIE9ic2VydmFjaW9uZXNQZWRpZG8ocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW59KXtcclxuICAgIGNvbnN0IHtwZWRpZG99ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pih7cGVkaWRvOiBlc3RhZG8uZGF0b3NQZWRpZG8ucGVkaWRvfSkpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IHVzZVN0eWxlcygpO1xyXG4gICAgcmV0dXJuIDxQYXBlciBjbGFzc05hbWU9e2NsYXNzZXMucGFwZXJ9PiBcclxuICAgICAgICA8R3JpZCBjb250YWluZXIgc3BhY2luZz17M30+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17MTJ9PlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cGVkaWRvLm9ic2VydmFjaW9uZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJvYnNlcnZhY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIk9ic2VydmFjaW9uZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJvYnNlcnZhY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwib2JzZXJ2YWNpb25lc1wiLCB2YWxvcjp2YWx1ZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXRlbXMocHJvcHM6e1xyXG4gICAgZWRpdGFuZG86Ym9vbGVhbixcclxuICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM6Ym9vbGVhbixcclxuICAgIGNvbk9wY2lvbmVzOiBib29sZWFuLFxyXG4gICAgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlXHJcbiAgICBwcmVzdXB1ZXN0b09QZWRpZG86UHJlc3VwdWVzdG98UGVkaWRvXHJcbn0pe1xyXG4gICAgY29uc3Qge2NvbkRlc2N1ZW50b0VuSXRlbXMsIGNvbk9wY2lvbmVzLCBkYXRvc0Rlc2RlLCBwcmVzdXB1ZXN0b09QZWRpZG99ID0gcHJvcHM7XHJcbiAgICBjb25zdCB7aXRlbXMsIGNsaWVudGV9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9PmVzdGFkb1tkYXRvc0Rlc2RlXSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBoYW5kbGVBZGQgPSAoKT0+e1xyXG4gICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLkFERF9JVEVNKHtkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgc2V0VGltZW91dCgoKT0+Zm9jdXNUb0lkKFwiY2FudGlkYWRfXCIrKGl0ZW1zLmxlbmd0aC0xKS50b1N0cmluZygpLHttb3ZlVG9FbGVtZW50OmZhbHNlfSksMTAwKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDxUYWJsZUNvbnRhaW5lciBjb21wb25lbnQ9e1BhcGVyfT5cclxuICAgICAgICA8VGFibGUgYXJpYS1sYWJlbD1cImN1c3RvbWl6ZWQgdGFibGVcIiBpZD1cIml0ZW1zLXRhYmxlXCI+XHJcbiAgICAgICAgICAgIDxUYWJsZUhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBzdHlsZT17e3dpZHRoOlwiNTBweFwifX1jbGFzc05hbWU9XCJub3QtcHJpbnRcIj5JdGVtczwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjU1cHhcIn19PkNhbnRpZGFkPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBzdHlsZT17e3dpZHRoOlwiNjBweFwifX0+Q29kIHByb2Q8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPk5vbWJyZSBwcm9kPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbD5EZXNjcmlwY2lvbjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjgwcHhcIn19YWxpZ249XCJyaWdodFwiPlAgdW5pdGFyaW88L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIHN0eWxlPXt7d2lkdGg6XCI0MHB4XCJ9fWFsaWduPVwicmlnaHRcIj5EdG88L1N0eWxlZFRhYmxlQ2VsbD46bnVsbH1cclxuICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIHN0eWxlPXt7d2lkdGg6XCI1MHB4XCJ9fWFsaWduPVwicmlnaHRcIj5Cb25pZjwvU3R5bGVkVGFibGVDZWxsPjpudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjgwcHhcIn19YWxpZ249XCJyaWdodFwiPlRvdGFsPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxyXG4gICAgICAgICAgICA8L1RhYmxlSGVhZD5cclxuICAgICAgICAgICAgPFRhYmxlQm9keT5cclxuICAgICAgICAgICAgICAgIHtpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPEl0ZW1QIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT17aXRlbX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFuZG89e3Byb3BzLmVkaXRhbmRvfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ZT17Y2xpZW50ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uRGVzY3VlbnRvRW5JdGVtcz17Y29uRGVzY3VlbnRvRW5JdGVtc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b3NEZXNkZT17ZGF0b3NEZXNkZX1cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBjbGFzc05hbWU9XCJub3QtcHJpbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQWRkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb30gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbktleURvd249eyhldmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VudGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoWzEzXS5pbmNsdWRlcyhldmVudC5rZXlDb2RlKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFkZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ09OLkFkZC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAge2NvbkRlc2N1ZW50b0VuSXRlbXM/PFN0eWxlZFRhYmxlQ2VsbCBjb2xTcGFuPXsyfT48L1N0eWxlZFRhYmxlQ2VsbD46bnVsbH1cclxuICAgICAgICAgICAgICAgICAgICB7Y29uT3BjaW9uZXM/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY29sU3Bhbj17Mn0gYWxpZ249XCJyaWdodFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNvbFNwYW49ezR9IGFsaWduPVwicmlnaHRcIj5zdWJ0b3RhbCAkPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBzdHlsZT17dG90YWxzU3R5bGVzfT57cHJlc3VwdWVzdG9PUGVkaWRvLnN1YnRvdGFsfTwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxyXG4gICAgICAgICAgICAgICAge2Nvbk9wY2lvbmVzP251bGw6PD5cclxuICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25EZXNjdWVudG9Fbkl0ZW1zPzxTdHlsZWRUYWJsZUNlbGwgY29sU3Bhbj17Mn0+PC9TdHlsZWRUYWJsZUNlbGw+Om51bGx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgYWxpZ249XCJyaWdodFwiIGNvbFNwYW49ezR9PmRlc2N1ZW50byBnZW5lcmFsICQ8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG9PUGVkaWRvLmRlc2N1ZW50b31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImRlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9zRGVzZGU9PSdkYXRvc1ByZXN1cHVlc3RvJz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfREVTQ1VFTlRPX1BSRVNVUFVFU1RPKHtkZXNjdWVudG86TnVtYmVyKHZhbHVlKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9ERVNDVUVOVE9fUEVESURPKHtkZXNjdWVudG86TnVtYmVyKHZhbHVlKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlUm93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIGNvbFNwYW49ezN9PjwvU3R5bGVkVGFibGVDZWxsPjpudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBjb2xTcGFuPXtjb25EZXNjdWVudG9Fbkl0ZW1zPzM6NH0+dG90YWwgJDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBzdHlsZT17dG90YWxzU3R5bGVzfT57cHJlc3VwdWVzdG9PUGVkaWRvLnRvdGFsfTwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICA8Lz59XHJcbiAgICAgICAgICAgIDwvVGFibGVCb2R5PlxyXG4gICAgICAgIDwvVGFibGU+XHJcbiAgICA8L1RhYmxlQ29udGFpbmVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXRlbVAocHJvcHM6e2l0ZW06SXRlbSwgaW5kZXg6bnVtYmVyLCBlZGl0YW5kbzpib29sZWFuLCBjb25EZXNjdWVudG9Fbkl0ZW1zOmJvb2xlYW4sIGNsaWVudGU6IENsaWVudGUsIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pe1xyXG4gICAgY29uc3Qge3Byb2R1Y3Rvc30gPSB1c2VTZWxlY3RvcigoZXN0YWRvOlN0YXRlKT0+ZXN0YWRvLmVzdHJ1Y3R1cmEpO1xyXG4gICAgY29uc3QgcHJvZHVjdG9zQXJyID0gbGlrZUFyKHByb2R1Y3RvcykuYXJyYXkoKTtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IHtpdGVtLCBpbmRleCwgY29uRGVzY3VlbnRvRW5JdGVtcywgY2xpZW50ZSwgZGF0b3NEZXNkZX09cHJvcHM7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBFRElDSU9OX0xJQlJFID0gaXRlbS5wcm9kdWN0bz09MDtcclxuICAgIHJldHVybiA8R3JvdyBpbj17dHJ1ZX0+XHJcbiAgICAgICAgPFN0eWxlZFRhYmxlUm93IGtleT17aXRlbS5wcm9kdWN0b30+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9e1wiYWdyZWdhcl9cIiArIGluZGV4LnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlJFTU9WRV9JVEVNKHtpbmRleDogaW5kZXgsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uRGVsZXRlT3V0bGluZS8+XHJcbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgYWxpZ249XCJyaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICBpZD17XCJjYW50aWRhZF9cIiArIGluZGV4LnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0uY2FudGlkYWQgfHwgbnVsbH1cclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY2FudGlkYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FOVElEQURfSVRFTSh7aW5kZXgsY2FudGlkYWQ6TnVtYmVyKHZhbHVlKSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0ucHJvZHVjdG8gfHwgbnVsbH1cclxuICAgICAgICAgICAgICAgICAgICBpZD17XCJwb3JvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfVxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwcm9kdWN0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBtYXRjaEluTGlzdD17RURJQ0lPTl9MSUJSRT91bmRlZmluZWQ6cHJvZHVjdG9zQXJyLm1hcCgocHJvZHVjdG8pPT5wcm9kdWN0by5wcm9kdWN0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWU9PScwJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfRklFTERfQ1VTVE9NX0lURU0oe2luZGV4LCBjYW1wbzoncHJvZHVjdG8nLHZhbG9yOnZhbHVlLCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaFJlc3VsdD1udWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdCA9IHByb2R1Y3Rvc0Fyci5maW5kKChwcm9kdWN0byk9PnByb2R1Y3RvLnByb2R1Y3RvPT12YWx1ZSkgfHwgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX1BST0RVQ1RPX0lURU0oe2luZGV4LCBwcm9kdWN0bzpzZWFyY2hSZXN1bHQsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBjbGFzc05hbWU9XCJub3QtcHJpbnRcIj5cclxuICAgICAgICAgICAgICAgIDxBbHRvSW1wcmVzaW9uU3R5bGUgY2hhcnNQZXJMaW5lPXtjb25EZXNjdWVudG9Fbkl0ZW1zPzYwOjc1fSBjb21wb25lbnRJZD17XCJub21icmUtcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfSBsaW5lSGVpZ2h0PXszMH0gdmFsdWU9e2l0ZW0/Lm5vbWJyZSB8fCAnJ30vPlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRURJQ0lPTl9MSUJSRT9UeXBlZEZpZWxkOkF1dG9jb21wbGV0ZXIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ue1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6aXRlbT8ubm9tYnJlIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6XCJub21icmUtcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcIm5vbWJyZS1wcm9kdWN0b1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IXByb3BzLmVkaXRhbmRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlsaW5lOnRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEluTGlzdENvbmRpdGlvbkNhbGxiYWNrOihwcm9kdWN0bzogUHJvZHVjdG8pPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRlLmNsaWVudGUgPT0gcHJvZHVjdG8uY2xpZW50ZSB8fCBwcm9kdWN0by5jbGllbnRlID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LC4uLihFRElDSU9OX0xJQlJFP3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOih2YWx1ZTogc3RyaW5nKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0ZJRUxEX0NVU1RPTV9JVEVNKHtpbmRleCwgY2FtcG86J25vbWJyZScsdmFsb3I6dmFsdWUsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzOiBwcm9kdWN0b3NBcnIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hLZXk6XCJub21icmVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFR5cGU6XCJ0ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZHVjdG9TZWxlY2Npb25hZG86UHJvZHVjdG98bnVsbCk9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfUFJPRFVDVE9fSVRFTSh7aW5kZXgsIHByb2R1Y3RvOnByb2R1Y3RvU2VsZWNjaW9uYWRvLCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICA8QWx0b0ltcHJlc2lvblN0eWxlIGNoYXJzUGVyTGluZT17Y29uRGVzY3VlbnRvRW5JdGVtcz82MDo3NX0gY29tcG9uZW50SWQ9e1wiZGVzY3JpcGNpb24tcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfSBsaW5lSGVpZ2h0PXszMH0gdmFsdWU9e2l0ZW0/LmRlc2NyaXBjaW9uIHx8ICcnfS8+XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChFRElDSU9OX0xJQlJFP1R5cGVkRmllbGQ6QXV0b2NvbXBsZXRlciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTppdGVtPy5kZXNjcmlwY2lvbiB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOlwiZGVzY3JpcGNpb24tcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcImRlc2NyaXBjaW9uLXByb2R1Y3RvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDohcHJvcHMuZWRpdGFuZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmU6dHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwuLi4oRURJQ0lPTl9MSUJSRT97XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZToodmFsdWU6c3RyaW5nKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0ZJRUxEX0NVU1RPTV9JVEVNKHtpbmRleCwgY2FtcG86J2Rlc2NyaXBjaW9uJyx2YWxvcjp2YWx1ZSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9OntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M6IHByb2R1Y3Rvc0FycixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEtleTpcImRlc2NyaXBjaW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUeXBlOlwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2R1Y3RvU2VsZWNjaW9uYWRvOlByb2R1Y3RvfG51bGwpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX1BST0RVQ1RPX0lURU0oe2luZGV4LCBwcm9kdWN0bzpwcm9kdWN0b1NlbGVjY2lvbmFkbywgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj57XHJcbiAgICAgICAgICAgICAgICBFRElDSU9OX0xJQlJFP1xyXG4gICAgICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e1wicHJlY2lvX3VuaXRhcmlvXCIgKyBpbmRleC50b1N0cmluZygpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0ucHJlY2lvX3VuaXRhcmlvIHx8IG51bGx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwcmVjaW9fdW5pdGFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfRklFTERfQ1VTVE9NX0lURU0oe2luZGV4LCBjYW1wbzoncHJlY2lvX3VuaXRhcmlvJyx2YWxvcjp2YWx1ZSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnByZWNpb191bml0YXJpbz8udG9TdHJpbmcoKX1cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIHtjb25EZXNjdWVudG9Fbkl0ZW1zP1xyXG4gICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtpdGVtLnBvcmNlbnRhamVfZGVzY3VlbnRvfHwgMH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPXtcInBvcmNlbnRhamVfZGVzY3VlbnRvX1wiICsgaW5kZXgudG9TdHJpbmcoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwb3JjZW50YWplX2Rlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9ERVNDVUVOVE9fSVRFTSh7aW5kZXgsIHBvcmNlbnRhamU6TnVtYmVyKHZhbHVlKSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QWRvcm5tZW50PVwiJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpdGVtLmRlc2N1ZW50b31cclxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICA6bnVsbH1cclxuICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCIgc3R5bGU9e3RvdGFsc1N0eWxlc30+e2l0ZW0udG90YWw/LnRvU3RyaW5nKCl9PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgPC9TdHlsZWRUYWJsZVJvdz5cclxuICAgIDwvR3Jvdz5cclxufVxyXG5cclxuY29uc3QgU3R5bGVkVGFibGVDZWxsID0gd2l0aFN0eWxlcygodGhlbWU6IFRoZW1lKSA9PlxyXG4gIGNyZWF0ZVN0eWxlcyh7XHJcbiAgICBoZWFkOiB7XHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5jb21tb24uYmxhY2ssXHJcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmNvbW1vbi53aGl0ZSxcclxuICAgIH0sXHJcbiAgICBib2R5OiB7XHJcbiAgICAgIGZvbnRTaXplOiAxNCxcclxuICAgICAgcGFkZGluZzogOFxyXG4gICAgfSxcclxuICB9KSxcclxuKShUYWJsZUNlbGwpO1xyXG5cclxuY29uc3QgU3R5bGVkVGFibGVSb3cgPSB3aXRoU3R5bGVzKCh0aGVtZTogVGhlbWUpID0+XHJcbiAgY3JlYXRlU3R5bGVzKHtcclxuICAgIHJvb3Q6IHtcclxuICAgICAgJyY6bnRoLW9mLXR5cGUob2RkKSc6IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmhvdmVyLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICB9KSxcclxuKShUYWJsZVJvdyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUHJlc3VwdWVzdG9Db21wb25lbnQoX3Byb3BzOnt9KXtcclxuICAgIGNvbnN0IHtjbGllbnRlLCBwcmVzdXB1ZXN0bywgaXRlbXN9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pihlc3RhZG8uZGF0b3NQcmVzdXB1ZXN0bykpO1xyXG4gICAgY29uc3Qge2VzdGFkb3NQcmVzdXB1ZXN0b30gPSB1c2VTZWxlY3RvcigoZXN0YWRvOlN0YXRlKT0+KHtlc3RhZG9zUHJlc3VwdWVzdG86ZXN0YWRvLmVzdHJ1Y3R1cmEuZXN0YWRvc1ByZXN1cHVlc3RvfSkpO1xyXG4gICAgY29uc3Qge3BhcmFtZXRyb3N9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pihlc3RhZG8uZXN0cnVjdHVyYSkpO1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IHVzZVN0eWxlcygpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgZXNOdWV2byA9ICEocHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8pO1xyXG4gICAgY29uc3QgZGlzYWJsZWQgPSAhZXN0YWRvc1ByZXN1cHVlc3RvLmZpbmQoKGVzdGFkbyk9PmVzdGFkby5lc3RhZG8gPT0gcHJlc3VwdWVzdG8uZXN0YWRvKT8ucGVybWl0ZV9lZGl0YXI7XHJcbiAgICBjb25zdCBbZWRpdGFuZG8sIHNldEVkaXRhbmRvXSA9IHVzZVN0YXRlKGVzTnVldm8pO1xyXG4gICAgY29uc3QgW3NuYWNrQmFyTWVzc2FnZSwgc2V0U25hY2tCYXJNZXNzYWdlXSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IGhheURlc2N1ZW50b3NJbmdyZXNhZG9zID0gaXRlbXMuc29tZSgoaXRlbSk9Pml0ZW0uZGVzY3VlbnRvICE9IDApO1xyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoX2V2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCB8IFJlYWN0Lk1vdXNlRXZlbnQsIHJlYXNvbj86IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChyZWFzb24gPT09ICdjbGlja2F3YXknKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICByZXR1cm4gPG1haW4gY2xhc3NOYW1lPXtjbGFzc2VzLmxheW91dH0gaWQ9XCJwcmVzdXB1ZXN0b1wiPlxyXG4gICAgICAgIDxpbWcgaWQ9XCJiYW5uZXItc3VwZXJpb3ItaW1wcmVzaW9uXCIgY2xhc3NOYW1lPVwib25seS1mb3ItcHJpbnRcIiBzcmM9XCJpbWcvYmFubmVyc3VwZXJpb3IucG5nXCIgYWx0PVwiYmFubmVyc3VwZXJpb3IucG5nXCIvPlxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBhbGlnbkl0ZW1zPVwiZmxleC1zdGFydFwiIGp1c3RpZnk9XCJmbGV4LXN0YXJ0XCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxoMj57cHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8/YFByZXN1cHVlc3RvIE7CuiAke3ByZXN1cHVlc3RvLnByZXN1cHVlc3RvfWA6YE51ZXZvIHByZXN1cHVlc3RvYH08L2gyPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1lbmRcIiBkaXJlY3Rpb249XCJyb3dcIj5cclxuICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj17ZWRpdGFuZG8/XCJzZWNvbmRhcnlcIjpcInByaW1hcnlcIn1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGFuZG8oIWVkaXRhbmRvKVxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHtlZGl0YW5kbz9cclxuICAgICAgICAgICAgICAgICAgICA8SUNPTi5DYW5jZWwvPlxyXG4gICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgIDxJQ09OLkVkaXQvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wcmludCgpXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPElDT04uUHJpbnQvPlxyXG4gICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPENsaWVudGVDb21wb25lbnQgZWRpdGFuZG89e2VkaXRhbmRvfSBkYXRvc0Rlc2RlPVwiZGF0b3NQcmVzdXB1ZXN0b1wiLz5cclxuICAgICAgICA8RXN0YWRvUHJlc3VwdWVzdG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEl0ZW1zIFxyXG4gICAgICAgICAgICBlZGl0YW5kbz17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM9e3ByZXN1cHVlc3RvLmNvbl9kZXNjdWVudG9fZW5faXRlbXN9XHJcbiAgICAgICAgICAgIGNvbk9wY2lvbmVzPXtwcmVzdXB1ZXN0by5jb25fb3BjaW9uZXN9XHJcbiAgICAgICAgICAgIGRhdG9zRGVzZGU9J2RhdG9zUHJlc3VwdWVzdG8nXHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvT1BlZGlkbz17cHJlc3VwdWVzdG99XHJcbiAgICAgICAgLz5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgY2xhc3NOYW1lPVwibm90LXByaW50XCIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1lbmRcIiBkaXJlY3Rpb249XCJyb3dcIj5cclxuICAgICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2w9e1xyXG4gICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtwcmVzdXB1ZXN0by5jb25fb3BjaW9uZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImNvbl9vcGNpb25lc1wiLCB2YWxvcjpldmVudC50YXJnZXQuY2hlY2tlZH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29uX29wY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJzdGFydFwiXHJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIm9jdWx0YXIgdG90YWxlc1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBjbGFzc05hbWU9XCJub3QtcHJpbnRcIiBhbGlnbkl0ZW1zPVwiZmxleC1zdGFydFwiIGp1c3RpZnk9XCJmbGV4LWVuZFwiIGRpcmVjdGlvbj1cInJvd1wiPlxyXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxyXG4gICAgICAgICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3ByZXN1cHVlc3RvLmNvbl9kZXNjdWVudG9fZW5faXRlbXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImNvbl9kZXNjdWVudG9fZW5faXRlbXNcIiwgdmFsb3I6ZXZlbnQudGFyZ2V0LmNoZWNrZWR9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFlZGl0YW5kbyB8fCBoYXlEZXNjdWVudG9zSW5ncmVzYWRvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImNvbl9kZXNjdWVudG9fZW5faXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsYWJlbFBsYWNlbWVudD1cInN0YXJ0XCJcclxuICAgICAgICAgICAgICAgIGxhYmVsPVwiZGVzY3VlbnRvIGVuIGl0ZW1zXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGd1YXJkYXJQcmVzdXB1ZXN0byhjbGllbnRlLCBwcmVzdXB1ZXN0bywgaXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUFJFU1VQVUVTVE8oe2NhbXBvOlwicHJlc3VwdWVzdG9cIiwgdmFsb3I6cmVzdWx0LnByZXN1cHVlc3RvfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNuYWNrQmFyTWVzc2FnZShgUHJlc3VwdWVzdG8gJHtyZXN1bHQucHJlc3VwdWVzdG99IGd1YXJkYWRvYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGFuZG8oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTbmFja0Jhck1lc3NhZ2UoYEVycm9yIGFsIGd1YXJkYXIgZWwgcHJlc3VwdWVzdG8uICR7ZXJyLm1lc3NhZ2V9YClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPElDT04uU2F2ZS8+XHJcbiAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICA8U25hY2tiYXJcclxuICAgICAgICAgICAgICAgIGFuY2hvck9yaWdpbj17e1xyXG4gICAgICAgICAgICAgICAgdmVydGljYWw6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbDogJ2xlZnQnLFxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIG9wZW49e29wZW59XHJcbiAgICAgICAgICAgICAgICBhdXRvSGlkZUR1cmF0aW9uPXs2MDAwfVxyXG4gICAgICAgICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlPXtzbmFja0Jhck1lc3NhZ2V9XHJcbiAgICAgICAgICAgICAgICBhY3Rpb249e1xyXG4gICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b24gc2l6ZT1cInNtYWxsXCIgYXJpYS1sYWJlbD1cImNsb3NlXCIgY29sb3I9XCJpbmhlcml0XCIgb25DbGljaz17aGFuZGxlQ2xvc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDT04uQ2xvc2UvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAge3BhcmFtZXRyb3M/LmxlZ2FsZXNfcHJlc3VwdWVzdG8/XHJcbiAgICAgICAgICAgIDxQYXBlciBjbGFzc05hbWU9e2NsYXNzZXMucGFwZXIrXCIgbGVnYWxlc1wifT4gXHJcbiAgICAgICAgICAgICAgICA8cD57cGFyYW1ldHJvcy5sZWdhbGVzX3ByZXN1cHVlc3RvfTwvcD5cclxuICAgICAgICAgICAgPC9QYXBlcj5cclxuICAgICAgICA6XHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICB9XHJcbiAgICA8L21haW4+XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBQZWRpZG9Db21wb25lbnQoX3Byb3BzOnt9KXtcclxuICAgIGNvbnN0IHtjbGllbnRlLCBwZWRpZG8sIGl0ZW1zfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oZXN0YWRvLmRhdG9zUGVkaWRvKSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgICBjb25zdCBlc051ZXZvID0gIShwZWRpZG8ucGVkaWRvKTtcclxuICAgIGNvbnN0IFtlZGl0YW5kbywgc2V0RWRpdGFuZG9dID0gdXNlU3RhdGUoZXNOdWV2byk7XHJcbiAgICBjb25zdCBbc25hY2tCYXJNZXNzYWdlLCBzZXRTbmFja0Jhck1lc3NhZ2VdID0gdXNlU3RhdGUoJycpO1xyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoX2V2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCB8IFJlYWN0Lk1vdXNlRXZlbnQsIHJlYXNvbj86IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChyZWFzb24gPT09ICdjbGlja2F3YXknKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICByZXR1cm4gPG1haW4gY2xhc3NOYW1lPXtjbGFzc2VzLmxheW91dH0gaWQ9XCJwZWRpZG9cIj5cclxuICAgICAgICA8aW1nIGlkPVwiYmFubmVyLXN1cGVyaW9yLWltcHJlc2lvblwiIGNsYXNzTmFtZT1cIm9ubHktZm9yLXByaW50XCIgc3JjPVwiaW1nL2Jhbm5lcnN1cGVyaW9yLnBuZ1wiIGFsdD1cImJhbm5lcnN1cGVyaW9yLnBuZ1wiLz5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1zdGFydFwiIGRpcmVjdGlvbj1cInJvd1wiPlxyXG4gICAgICAgICAgICA8aDI+e3BlZGlkby5wZWRpZG8/YFBlZGlkbyBOwrogJHtwZWRpZG8ucGVkaWRvfWA6YE51ZXZvIHBlZGlkb2B9PC9oMj5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9e2VkaXRhbmRvP1wic2Vjb25kYXJ5XCI6XCJwcmltYXJ5XCJ9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEVkaXRhbmRvKCFlZGl0YW5kbylcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuYnV0dG9ufVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7ZWRpdGFuZG8/XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uQ2FuY2VsLz5cclxuICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICA8SUNPTi5FZGl0Lz5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2VkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucHJpbnQoKVxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxJQ09OLlByaW50Lz5cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDxDbGllbnRlQ29tcG9uZW50IGVkaXRhbmRvPXtlZGl0YW5kb30gZGF0b3NEZXNkZT1cImRhdG9zUGVkaWRvXCIvPlxyXG4gICAgICAgIDxFc3RhZG9QZWRpZG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEl0ZW1zIFxyXG4gICAgICAgICAgICBlZGl0YW5kbz17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM9e3RydWV9XHJcbiAgICAgICAgICAgIGNvbk9wY2lvbmVzPXtmYWxzZX1cclxuICAgICAgICAgICAgZGF0b3NEZXNkZT0nZGF0b3NQZWRpZG8nXHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvT1BlZGlkbz17cGVkaWRvfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPE9ic2VydmFjaW9uZXNQZWRpZG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGd1YXJkYXJQZWRpZG8oY2xpZW50ZSwgcGVkaWRvLCBpdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwicGVkaWRvXCIsIHZhbG9yOnJlc3VsdC5wZWRpZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U25hY2tCYXJNZXNzYWdlKGBQZWRpZG8gJHtyZXN1bHQucGVkaWRvfSBndWFyZGFkb2ApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wZW4odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRhbmRvKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U25hY2tCYXJNZXNzYWdlKGBFcnJvciBhbCBndWFyZGFyIGVsIHBlZGlkby4gJHtlcnIubWVzc2FnZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRPcGVuKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuYnV0dG9ufVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8SUNPTi5TYXZlLz5cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxTbmFja2JhclxyXG4gICAgICAgICAgICAgICAgYW5jaG9yT3JpZ2luPXt7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbDogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgb3Blbj17b3Blbn1cclxuICAgICAgICAgICAgICAgIGF1dG9IaWRlRHVyYXRpb249ezYwMDB9XHJcbiAgICAgICAgICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3NuYWNrQmFyTWVzc2FnZX1cclxuICAgICAgICAgICAgICAgIGFjdGlvbj17XHJcbiAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvbiBzaXplPVwic21hbGxcIiBhcmlhLWxhYmVsPVwiY2xvc2VcIiBjb2xvcj1cImluaGVyaXRcIiBvbkNsaWNrPXtoYW5kbGVDbG9zZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNPTi5DbG9zZS8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgIDwvbWFpbj5cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3BsZWdhclByZXN1cHVlc3RvKHN0b3JlOlN0b3JlPFN0YXRlLEFjdGlvbkZvcm11bGFyaW9TdGF0ZT4pe1xyXG4gICAgUmVhY3RET00ucmVuZGVyKFxyXG4gICAgICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxyXG4gICAgICAgICAgICA8UHJlc3VwdWVzdG9Db21wb25lbnQvPlxyXG4gICAgICAgIDwvUHJvdmlkZXI+XHJcbiAgICAgICAgLFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluX2xheW91dCcpXHJcbiAgICApXHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNwbGVnYXJQZWRpZG8oc3RvcmU6U3RvcmU8U3RhdGUsQWN0aW9uRm9ybXVsYXJpb1N0YXRlPil7XHJcbiAgICBSZWFjdERPTS5yZW5kZXIoXHJcbiAgICAgICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZX0+XHJcbiAgICAgICAgICAgIDxQZWRpZG9Db21wb25lbnQvPlxyXG4gICAgICAgIDwvUHJvdmlkZXI+XHJcbiAgICAgICAgLFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluX2xheW91dCcpXHJcbiAgICApXHJcbn1cclxuXHJcbmlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKXtcclxuICAgIC8vIEB0cy1pZ25vcmUgcGFyYSBoYWNlcmxvXHJcbiAgICB3aW5kb3cuZGVzcGxlZ2FyUHJlc3VwdWVzdG8gPSBkZXNwbGVnYXJQcmVzdXB1ZXN0bztcclxuICAgIC8vIEB0cy1pZ25vcmUgcGFyYSBoYWNlcmxvXHJcbiAgICB3aW5kb3cuZGVzcGxlZ2FyUGVkaWRvID0gZGVzcGxlZ2FyUGVkaWRvO1xyXG59Il19