ng-easycommerce 0.0.681 → 0.0.682

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 (42) hide show
  1. package/README.md +14 -0
  2. package/bundles/ng-easycommerce.umd.js +870 -57
  3. package/bundles/ng-easycommerce.umd.js.map +1 -1
  4. package/bundles/ng-easycommerce.umd.min.js +1 -1
  5. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  6. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +230 -2
  7. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +6 -3
  8. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +13 -4
  9. package/esm2015/lib/ec-component/index.js +4 -1
  10. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +61 -1
  11. package/esm2015/lib/ec-component/widgets-ec/unit-promotion-price-ec/unit-promotion-price-ec.component.js +268 -0
  12. package/esm2015/lib/interfaces/cart-item.js +1 -1
  13. package/esm2015/lib/services/cart.service.js +186 -14
  14. package/esm2015/lib/services/checkout/checkout.service.js +2 -2
  15. package/esm2015/lib/utils/order-util.service.js +87 -1
  16. package/esm2015/public-api.js +2 -1
  17. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +236 -2
  18. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +6 -3
  19. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +13 -4
  20. package/esm5/lib/ec-component/index.js +4 -1
  21. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +61 -1
  22. package/esm5/lib/ec-component/widgets-ec/unit-promotion-price-ec/unit-promotion-price-ec.component.js +248 -0
  23. package/esm5/lib/interfaces/cart-item.js +1 -1
  24. package/esm5/lib/services/cart.service.js +188 -14
  25. package/esm5/lib/services/checkout/checkout.service.js +2 -2
  26. package/esm5/lib/utils/order-util.service.js +88 -1
  27. package/esm5/public-api.js +2 -1
  28. package/fesm2015/ng-easycommerce.js +882 -59
  29. package/fesm2015/ng-easycommerce.js.map +1 -1
  30. package/fesm5/ng-easycommerce.js +871 -59
  31. package/fesm5/ng-easycommerce.js.map +1 -1
  32. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +139 -0
  33. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +3 -1
  34. package/lib/ec-component/index.d.ts +1 -0
  35. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +52 -0
  36. package/lib/ec-component/widgets-ec/unit-promotion-price-ec/unit-promotion-price-ec.component.d.ts +117 -0
  37. package/lib/interfaces/cart-item.d.ts +54 -0
  38. package/lib/services/cart.service.d.ts +98 -1
  39. package/lib/utils/order-util.service.d.ts +58 -0
  40. package/ng-easycommerce.metadata.json +1 -1
  41. package/package.json +1 -1
  42. package/public-api.d.ts +1 -0
@@ -13,7 +13,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
13
13
  step((generator = generator.apply(thisArg, _arguments || [])).next());
14
14
  });
15
15
  };
16
- import { Component } from "@angular/core";
16
+ import { Component, HostListener } from "@angular/core";
17
17
  import { Router } from "@angular/router";
18
18
  import { BsModalService } from "ngx-bootstrap/modal";
19
19
  import { Constants } from "../../core.consts";
@@ -52,7 +52,203 @@ let CartEcComponent = class CartEcComponent extends ComponentHelper {
52
52
  this.showTaxLegend = false;
53
53
  this.cartLoading = false;
54
54
  this.enableFieldNotesInArticleFile = false;
55
+ this.activeUnitPromotionItemId = null;
56
+ this.activeUnitPromotionSummaryStyles = {};
57
+ this.supportsUnitPromotionHover = false;
58
+ /**
59
+ * Convierte un monto crudo al formato decimal esperado por la UI.
60
+ *
61
+ * @param amount Monto en centavos o entero crudo.
62
+ * @returns Monto decimal.
63
+ */
55
64
  this.toDecimal = (amount) => this.consts.toDecimal(amount);
65
+ /** @param item Ítem del carrito. @returns Porcentaje de descuento legacy para el badge `% OFF`. */
66
+ this.getItemDiscount = (item) => { var _a; return Number(((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.discountPercent) || 0); };
67
+ /**
68
+ * Devuelve el porcentaje efectivo total del ítem, considerando promociones unitarias.
69
+ *
70
+ * @param item Ítem del carrito.
71
+ * @returns Porcentaje entero calculado contra el precio de referencia del ítem.
72
+ *
73
+ * @remarks
74
+ * Si existe precio tachado, compara `finalPrice` contra `strikePrice`.
75
+ * Si no existe, usa `basePrice` como referencia.
76
+ * Esto permite mostrar un badge coherente cuando el precio visible ya incluye
77
+ * descuentos/promociones unitarias adicionales.
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * // strikePrice 240000, finalPrice 45000 => 81
82
+ * this.getItemEffectiveDiscount(item);
83
+ * ```
84
+ */
85
+ this.getItemEffectiveDiscount = (item) => { var _a; return Number(((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.effectiveDiscountPercent) || 0); };
86
+ /** @param item Ítem del carrito. @returns Subtotal actual del renglón según backend. */
87
+ this.getDisplayedItemTotal = (item) => { var _a, _b; return Number((_b = (_a = item) === null || _a === void 0 ? void 0 : _a.total, (_b !== null && _b !== void 0 ? _b : 0))); };
88
+ /** @param item Ítem del carrito. @returns `true` si el backend informó promociones unitarias. */
89
+ this.hasUnitPromotions = (item) => { var _a; return Boolean((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.hasUnitPromotions); };
90
+ /** @param item Ítem del carrito. @returns `true` si el resumen activo pertenece a ese ítem. */
91
+ this.isUnitPromotionSummaryOpen = (item) => { var _a; return this.activeUnitPromotionItemId === ((_a = item) === null || _a === void 0 ? void 0 : _a.item_id); };
92
+ /**
93
+ * Abre el resumen del ítem al entrar con el mouse en desktop.
94
+ *
95
+ * @param item Ítem del carrito.
96
+ * @param anchor Elemento usado como ancla visual.
97
+ * @returns `void`
98
+ */
99
+ this.handleUnitPromotionMouseEnter = (item, anchor) => {
100
+ if (!this.supportsUnitPromotionHover) {
101
+ return;
102
+ }
103
+ this.openUnitPromotionSummary(item, anchor);
104
+ };
105
+ /**
106
+ * Cierra el resumen al salir con el mouse en desktop.
107
+ *
108
+ * @param item Ítem asociado al resumen.
109
+ * @returns `void`
110
+ */
111
+ this.handleUnitPromotionMouseLeave = (item) => {
112
+ if (!this.supportsUnitPromotionHover) {
113
+ return;
114
+ }
115
+ this.closeUnitPromotionSummary(item);
116
+ };
117
+ /**
118
+ * Abre el resumen de promociones unitarias para un ítem puntual.
119
+ *
120
+ * @param item Ítem del carrito.
121
+ * @param anchor Elemento de referencia para posicionamiento.
122
+ * @returns `void`
123
+ */
124
+ this.openUnitPromotionSummary = (item, anchor) => {
125
+ var _a, _b;
126
+ if (!this.hasUnitPromotions(item)) {
127
+ return;
128
+ }
129
+ this.activeUnitPromotionItemId = (_b = (_a = item) === null || _a === void 0 ? void 0 : _a.item_id, (_b !== null && _b !== void 0 ? _b : null));
130
+ this.updateUnitPromotionSummaryStyles(anchor);
131
+ };
132
+ /**
133
+ * Cierra el resumen activo.
134
+ *
135
+ * @param item Si se envía, solo cierra cuando coincide con el ítem activo.
136
+ * @returns `void`
137
+ */
138
+ this.closeUnitPromotionSummary = (item) => {
139
+ var _a;
140
+ if (!item || this.activeUnitPromotionItemId === ((_a = item) === null || _a === void 0 ? void 0 : _a.item_id)) {
141
+ this.activeUnitPromotionItemId = null;
142
+ this.activeUnitPromotionSummaryStyles = {};
143
+ }
144
+ };
145
+ /**
146
+ * Alterna manualmente la apertura del resumen para un ítem.
147
+ *
148
+ * @param item Ítem del carrito.
149
+ * @param anchor Elemento de referencia.
150
+ * @param event Evento del puntero.
151
+ * @returns `void`
152
+ */
153
+ this.toggleUnitPromotionSummary = (item, anchor, event) => {
154
+ event.preventDefault();
155
+ event.stopPropagation();
156
+ if (!this.hasUnitPromotions(item)) {
157
+ return;
158
+ }
159
+ if (this.isUnitPromotionSummaryOpen(item)) {
160
+ this.closeUnitPromotionSummary(item);
161
+ return;
162
+ }
163
+ this.openUnitPromotionSummary(item, anchor);
164
+ };
165
+ /**
166
+ * Maneja el click/tap sobre el precio en dispositivos sin hover.
167
+ *
168
+ * @param item Ítem del carrito.
169
+ * @param anchor Elemento usado como trigger.
170
+ * @param event Evento de click/tap.
171
+ * @returns `void`
172
+ */
173
+ this.handleUnitPromotionPriceClick = (item, anchor, event) => {
174
+ if (this.supportsUnitPromotionHover) {
175
+ return;
176
+ }
177
+ this.toggleUnitPromotionSummary(item, anchor, event);
178
+ };
179
+ /**
180
+ * Evita que eventos dentro del resumen se propaguen al documento.
181
+ *
182
+ * @param event Evento del puntero.
183
+ * @returns `void`
184
+ */
185
+ this.stopUnitPromotionSummaryEvent = (event) => {
186
+ event.stopPropagation();
187
+ };
188
+ /** @param item Ítem del carrito. @returns Precio unitario base (`saleprice` o `price`). */
189
+ this.getOriginalUnitPrice = (item) => { var _a; return Number(((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.basePrice) || 0); };
190
+ /** @param item Ítem del carrito. @returns Precio tachado legacy o `0`. */
191
+ this.getStrikeThroughUnitPrice = (item) => { var _a; return Number(((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.strikePrice) || 0); };
192
+ /** @param item Ítem del carrito. @returns Suma de promociones unitarias aplicadas. */
193
+ this.getUnitPromotionTotal = (item) => { var _a; return Number(((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.unitPromotionTotal) || 0); };
194
+ /** @param item Ítem del carrito. @returns Precio final unitario luego de promociones. */
195
+ this.getFinalUnitPrice = (item) => { var _a; return Number(((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.finalPrice) || 0); };
196
+ /** @param item Ítem del carrito. @returns Precio principal a mostrar junto al trigger. */
197
+ this.getDisplayedUnitPrice = (item) => { var _a; return Number(((_a = this.cartService.getItemPricing(item)) === null || _a === void 0 ? void 0 : _a.finalPrice) || 0); };
198
+ /** @param item Ítem del carrito. @returns `true` si debe mostrarse el precio base junto al final. */
199
+ this.shouldShowOriginalUnitPrice = (item) => this.hasUnitPromotions(item) && this.getFinalUnitPrice(item) !== this.getOriginalUnitPrice(item);
200
+ /** @param item Ítem del carrito. @returns `true` si además del base price existe tachado legacy. */
201
+ this.shouldShowLegacyPriceOrigin = (item) => this.getStrikeThroughUnitPrice(item) > this.getOriginalUnitPrice(item);
202
+ /** @param item Ítem del carrito. @returns Etiqueta final del resumen. */
203
+ this.getUnitPromotionFinalPriceLabel = (item) => this.hasUnitPromotions(item) ? 'Precio final' : 'Precio unitario';
204
+ /**
205
+ * Busca dentro de una lista el ítem que tiene actualmente el resumen abierto.
206
+ *
207
+ * @param items Lista de ítems del carrito.
208
+ * @returns Ítem activo o `null`.
209
+ */
210
+ this.getActiveUnitPromotionItem = (items) => { var _a; return ((_a = items) === null || _a === void 0 ? void 0 : _a.find(item => { var _a; return ((_a = item) === null || _a === void 0 ? void 0 : _a.item_id) === this.activeUnitPromotionItemId; })) || null; };
211
+ /** @param item Ítem del carrito. @returns Promociones unitarias crudas del backend. */
212
+ this.getUnitPromotions = (item) => { var _a; return Array.isArray((_a = item) === null || _a === void 0 ? void 0 : _a.unitPromotions) ? item.unitPromotions : []; };
213
+ /**
214
+ * Detecta si el dispositivo soporta `hover` real y debe comportarse como desktop.
215
+ *
216
+ * @returns `void`
217
+ */
218
+ this.updateUnitPromotionViewportMode = () => {
219
+ this.supportsUnitPromotionHover = typeof window !== 'undefined'
220
+ && typeof window.matchMedia === 'function'
221
+ && window.matchMedia('(hover: hover) and (pointer: fine)').matches
222
+ && window.innerWidth >= 768;
223
+ };
224
+ /**
225
+ * Calcula estilos inline para mantener el resumen mobile dentro del viewport.
226
+ *
227
+ * @param anchor Elemento usado como ancla visual.
228
+ * @returns `void`
229
+ */
230
+ this.updateUnitPromotionSummaryStyles = (anchor) => {
231
+ if (this.supportsUnitPromotionHover || !anchor || typeof window === 'undefined') {
232
+ this.activeUnitPromotionSummaryStyles = {};
233
+ return;
234
+ }
235
+ const viewportPadding = 12;
236
+ const rect = anchor.getBoundingClientRect();
237
+ const estimatedPopupHeight = 260;
238
+ const nextTop = rect.bottom + 8;
239
+ const maxTop = window.innerHeight - estimatedPopupHeight - viewportPadding;
240
+ const top = Math.max(viewportPadding, Math.min(nextTop, maxTop));
241
+ this.activeUnitPromotionSummaryStyles = {
242
+ left: `${viewportPadding}px`,
243
+ right: `${viewportPadding}px`,
244
+ top: `${top}px`,
245
+ width: 'auto',
246
+ 'max-width': 'none',
247
+ 'max-height': `calc(100vh - ${top + viewportPadding}px)`,
248
+ overflow: 'auto',
249
+ position: 'fixed'
250
+ };
251
+ };
56
252
  this.cartItemPlus = (item) => {
57
253
  var _a, _b;
58
254
  const multipleQty = ((_a = item.product.variants[0]) === null || _a === void 0 ? void 0 : _a.multipleQuantity) || 0;
@@ -141,6 +337,8 @@ let CartEcComponent = class CartEcComponent extends ComponentHelper {
141
337
  this.ecOnConstruct();
142
338
  this.isLoggedIn = this.authService.isAuthenticated();
143
339
  this.mediaUrl = this.consts.mediaUrl();
340
+ this.summaryPromotionAmount$ = this.cartService.getSummaryPromotionAmount();
341
+ this.hasAppliedCoupon$ = this.cartService.hasAppliedCoupon();
144
342
  }
145
343
  ngOnChanges() {
146
344
  this.isLoggedIn = this.authService.isAuthenticated();
@@ -150,6 +348,7 @@ let CartEcComponent = class CartEcComponent extends ComponentHelper {
150
348
  }
151
349
  ngOnInit() {
152
350
  window.scroll(0, 0);
351
+ this.updateUnitPromotionViewportMode();
153
352
  this.cartService.promotions.subscribe(promotions => this.promotions = promotions);
154
353
  // console.log(this.cartService.getTaxes());
155
354
  this.channelConfigService.channelConfig$.subscribe(channel => {
@@ -171,6 +370,26 @@ let CartEcComponent = class CartEcComponent extends ComponentHelper {
171
370
  });
172
371
  this.ecOnInit();
173
372
  }
373
+ /** Cierra el resumen al hacer click fuera en desktop. */
374
+ handleDocumentClick() {
375
+ if (!this.supportsUnitPromotionHover) {
376
+ return;
377
+ }
378
+ this.activeUnitPromotionItemId = null;
379
+ this.activeUnitPromotionSummaryStyles = {};
380
+ }
381
+ /** Recalcula el modo de interacción y cierra el resumen al cambiar el viewport. */
382
+ handleWindowResize() {
383
+ this.updateUnitPromotionViewportMode();
384
+ this.closeUnitPromotionSummary();
385
+ }
386
+ /** Cierra el resumen en mobile al hacer scroll para evitar desalineación visual. */
387
+ handleWindowScroll() {
388
+ if (this.supportsUnitPromotionHover) {
389
+ return;
390
+ }
391
+ this.closeUnitPromotionSummary();
392
+ }
174
393
  actualizarCantidad(item, cantidad, stock, id) {
175
394
  var _a, _b, _c;
176
395
  if (this.cartLoading) {
@@ -461,6 +680,15 @@ CartEcComponent.ctorParameters = () => [
461
680
  { type: AddressingService },
462
681
  { type: ChannelConfigService }
463
682
  ];
683
+ __decorate([
684
+ HostListener('document:click')
685
+ ], CartEcComponent.prototype, "handleDocumentClick", null);
686
+ __decorate([
687
+ HostListener('window:resize')
688
+ ], CartEcComponent.prototype, "handleWindowResize", null);
689
+ __decorate([
690
+ HostListener('window:scroll')
691
+ ], CartEcComponent.prototype, "handleWindowScroll", null);
464
692
  CartEcComponent = __decorate([
465
693
  Component({
466
694
  selector: 'app-cart-ec',
@@ -469,4 +697,4 @@ CartEcComponent = __decorate([
469
697
  })
470
698
  ], CartEcComponent);
471
699
  export { CartEcComponent };
472
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NhcnQtZWMvY2FydC1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBOEIsTUFBTSxlQUFlLENBQUE7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUUvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQVM3RSxJQUFhLGVBQWUsR0FBNUIsTUFBYSxlQUFnQixTQUFRLGVBQWU7SUFzQmhELFlBQ1csV0FBd0IsRUFDeEIsV0FBd0IsRUFDckIsTUFBaUIsRUFDcEIsZUFBZ0MsRUFDaEMsTUFBYyxFQUNkLFlBQTRCLEVBQ3pCLGFBQTJCLEVBQzlCLGlCQUFvQyxFQUNwQyxvQkFBMEM7UUFDakQsS0FBSyxFQUFFLENBQUM7UUFURCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNyQixXQUFNLEdBQU4s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QixZQUF1Qzs7S0FFMUMsQ0FBQztHQUNXLGVBQWUsQ0F3ZTNCO1NBeGVZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tIFwibmd4LWJvb3RzdHJhcC9tb2RhbFwiO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL2NvcmUuY29uc3RzXCI7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0cy5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gXCIuLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXJcIjtcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCIuLi8uLi91dGlscy90b2FzdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBBZGRyZXNzaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoZWNrb3V0L2FkZHJlc3Npbmcuc2VydmljZSc7XG5pbXBvcnQgeyBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtY2FydC1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhcnQtZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhcnQtZWMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDYXJ0RWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xuXG5cbiAgICBwdWJsaWMgdmFyaWFudHNUb1Nob3c6IHN0cmluZ1tdID0gWydUQUxMRScsICdDT0xPUiddO1xuICAgIHB1YmxpYyBpc0xvZ2dlZEluID0gZmFsc2U7XG4gICAgcHVibGljIG1lZGlhVXJsID0gJyc7XG4gICAgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcbiAgICBwdWJsaWMgcHJvbW90aW9ucyA9IFtdO1xuICAgIHB1YmxpYyBpdGVtczogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHByaXZhdGUgY2FyZ2FuZG86IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hhbm5lbDogYW55ID0ge307XG4gICAgcHVibGljIHVwZGF0ZVN0b2NrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGV4aXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBoaWRlUHJpY2VzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGhpZGVEaXNjb3VudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaGlkZVRheGVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNyZWRpdEFjY291bnRTaG93UHJpY2VzOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHNob3dUYXhMZWdlbmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2FydExvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHB1YmxpYyBwcm9kdWN0c1NlcnZpY2U6IFByb2R1Y3RzU2VydmljZSxcbiAgICAgICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwdWJsaWMgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHVibGljIGFkZHJlc3NpbmdTZXJ2aWNlOiBBZGRyZXNzaW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNoYW5uZWxDb25maWdTZXJ2aWNlOiBDaGFubmVsQ29uZmlnU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgICAgICB0aGlzLmlzTG9nZ2VkSW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICB0aGlzLm1lZGlhVXJsID0gdGhpcy5jb25zdHMubWVkaWFVcmwoKTtcblxuICAgIH1cblxuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuaXNMb2dnZWRJbiA9IHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlTG9nZ2VkSW4oKSB7XG4gICAgICAgIHRoaXMuaXNMb2dnZWRJbiA9IHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGwoMCwgMCk7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UucHJvbW90aW9ucy5zdWJzY3JpYmUocHJvbW90aW9ucyA9PiB0aGlzLnByb21vdGlvbnMgPSBwcm9tb3Rpb25zKTtcbiAgICAgICAgLy8gICAgY29uc29sZS5sb2codGhpcy5jYXJ0U2VydmljZS5nZXRUYXhlcygpKTtcblxuICAgICAgICB0aGlzLmNoYW5uZWxDb25maWdTZXJ2aWNlLmNoYW5uZWxDb25maWckLnN1YnNjcmliZShjaGFubmVsID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVByaWNlcyA9IGNoYW5uZWw/LmhpZGVQcmljZXMgPz8gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhpZGVEaXNjb3VudHMgPSBjaGFubmVsPy5oaWRlRGlzY291bnRzID8/IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oaWRlVGF4ZXMgPSBjaGFubmVsPy5oaWRlVGF4ZXMgPz8gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNob3dUYXhMZWdlbmQgPSBjaGFubmVsPy5zaG93VGF4TGVnZW5kID8/IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZSA9IGNoYW5uZWw/LmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlID8/IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5oaWRlUHJpY2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5zaG93UHJpY2UkLnN1YnNjcmliZSgoc2hvd1ByaWNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWRpdEFjY291bnRTaG93UHJpY2VzID0gc2hvd1ByaWNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5sb2FkaW5nLnN1YnNjcmliZShpc0xvYWRpbmcgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYXJ0TG9hZGluZyA9IGlzTG9hZGluZztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWNPbkluaXQoKVxuXG4gICAgfVxuXG4gICAgdG9EZWNpbWFsID0gKGFtb3VudCkgPT4gdGhpcy5jb25zdHMudG9EZWNpbWFsKGFtb3VudCk7XG5cbiAgICBwcm90ZWN0ZWQgYWN0dWFsaXphckNhbnRpZGFkKGl0ZW06IGFueSwgY2FudGlkYWQ6IG51bWJlciB8IHN0cmluZywgc3RvY2s6IG51bWJlciwgaWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2FydExvYWRpbmcpIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdWx0aXBsZVF1YW50aXR5ID0gaXRlbS5wcm9kdWN0Py52YXJpYW50cyAmJiBpdGVtLnByb2R1Y3QudmFyaWFudHMubGVuZ3RoID4gMCA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5IDogMDtcbiAgICAgICAgY29uc3Qgc3RlcCA9IG11bHRpcGxlUXVhbnRpdHkgJiYgbXVsdGlwbGVRdWFudGl0eSA+IDAgPyBtdWx0aXBsZVF1YW50aXR5IDogMTtcblxuICAgICAgICBsZXQgbmV3UXVhbnRpdHk6IG51bWJlcjtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbnRpZGFkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbmV3UXVhbnRpdHkgPSBwYXJzZUludChjYW50aWRhZCwgMTApO1xuICAgICAgICAgICAgaWYgKG5ld1F1YW50aXR5ICUgc3RlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogc3RlcCB9KTtcbiAgICAgICAgICAgICAgICBuZXdRdWFudGl0eSA9IE1hdGgucm91bmQobmV3UXVhbnRpdHkgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdRdWFudGl0eSA9IGNhbnRpZGFkO1xuICAgICAgICAgICAgaWYgKG5ld1F1YW50aXR5ICUgc3RlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIG5ld1F1YW50aXR5ID0gTWF0aC5yb3VuZChuZXdRdWFudGl0eSAvIHN0ZXApICogc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtlZXBTYW1lQ29tbWVudCA9IGl0ZW0/LmNvbW1lbnRzID8/IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7IC8vIEFjdHVhbGl6YSBsYSBwcm9waWVkYWQgdmluY3VsYWRhIGEgYFtkaXNhYmxlZF1gXG4gICAgICAgICAgICBpZiAobmV3UXVhbnRpdHkgPiAwICYmIG5ld1F1YW50aXR5IDw9IHN0b2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgbmV3UXVhbnRpdHksIGtlZXBTYW1lQ29tbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IC8vIEZ1bmNpw7NuIGRlIGZsZWNoYSBwYXJhIHByZXNlcnZhciBlbCBjb250ZXh0b1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmV3UXVhbnRpdHkgPiAwICYmIG5ld1F1YW50aXR5IDw9IHN0b2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgbmV3UXVhbnRpdHksIGtlZXBTYW1lQ29tbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIGNhcnRJdGVtUGx1cyA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbXVsdGlwbGVRdHk6IG51bWJlciA9IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSB8fCAwO1xuICAgICAgICBjb25zdCBzdGVwID0gbXVsdGlwbGVRdHkgfHwgMTtcbiAgICAgICAgY29uc3Qgc3RvY2sgPSBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0/LnN0b2NrO1xuICAgICAgICBjb25zdCBjdXJyZW50OiBudW1iZXIgPSBpdGVtLnF1YW50aXR5O1xuXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdGVwID4gMSAmJiBjdXJyZW50ICUgc3RlcCAhPT0gMFxuICAgICAgICAgICAgPyBNYXRoLmNlaWwoY3VycmVudCAvIHN0ZXApICogc3RlcFxuICAgICAgICAgICAgOiBjdXJyZW50ICsgc3RlcDtcblxuICAgICAgICB0aGlzLmFjdHVhbGl6YXJDYW50aWRhZChpdGVtLCBuZXh0LCBzdG9jaywgJ2NhcnRQbHVzJyk7XG4gICAgfVxuXG4gICAgY2FydEl0ZW1MZXNzID0gKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBtdWx0aXBsZVF0eTogbnVtYmVyID0gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5IHx8IDA7XG4gICAgICAgIGNvbnN0IG1pbmltdW1RdHk6IG51bWJlciA9IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHkgfHwgMDtcbiAgICAgICAgY29uc3Qgc3RlcCA9IG11bHRpcGxlUXR5IHx8IDE7XG4gICAgICAgIGNvbnN0IGZsb29yID0gbWluaW11bVF0eSB8fCBzdGVwO1xuICAgICAgICBjb25zdCBjdXJyZW50OiBudW1iZXIgPSBpdGVtLnF1YW50aXR5O1xuXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdGVwID4gMSAmJiBjdXJyZW50ICUgc3RlcCAhPT0gMFxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKGN1cnJlbnQgLyBzdGVwKSAqIHN0ZXBcbiAgICAgICAgICAgIDogY3VycmVudCAtIHN0ZXA7XG5cbiAgICAgICAgaWYgKG5leHQgPj0gZmxvb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphckNhbnRpZGFkKGl0ZW0sIG5leHQsIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8uc3RvY2ssICdjYXJ0TGVzcycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVkaXJlY3RDaGVja291dCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuaGFzU3VmZmljaWVudENyZWRpdHNGb3JDYXJ0VG90YWwoKSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChgL2NoZWNrb3V0YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIHNlIHB1ZWRlIHJlZGlyaWdpciBhbCBjaGVja291dCBkZWJpZG8gYSB1bmEgdmFsaWRhY2nDs24gZmFsbGlkYS5cIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWRpcmVjdFJlZ2lzdGVyID0gKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChgL2F1dGgvbG9naW5gKVxuXG4gICAgb3Blbk1vZGFsKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMubW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KHRlbXBsYXRlLCB7IGNsYXNzOiAnbW9kYWwteGwnLCBrZXlib2FyZDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcmVkaXJlY3REZXRhaWxQcm9kdWN0KHByb2R1Y3QpIHtcbiAgICAgICAgbGV0IHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzWzBdXG4gICAgICAgIGxldCBwYXRoID0gJy9wcm9kdWN0LydcbiAgICAgICAgcGF0aCArPSB2YXJpYW50LmNvZGVcbiAgICAgICAgcGF0aCArPSB2YXJpYW50Lm9wdGlvbnMubGVuZ3RoID8gXCI/dmFyaWFudD10cnVlXCIgOiBcIlwiXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocGF0aClcbiAgICB9XG5cbiAgICBmb3JtYXREYXRlKGRhdGUpIHtcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShkYXRlKSxcbiAgICAgICAgICAgIG1vbnRoID0gJycgKyAoZC5nZXRNb250aCgpICsgMSksXG4gICAgICAgICAgICBkYXkgPSAnJyArIGQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgeWVhciA9IGQuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICBpZiAobW9udGgubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIG1vbnRoID0gJzAnICsgbW9udGg7XG4gICAgICAgIGlmIChkYXkubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIGRheSA9ICcwJyArIGRheTtcblxuICAgICAgICByZXR1cm4gW3llYXIsIG1vbnRoLCBkYXldLmpvaW4oJy0nKTtcbiAgICB9XG5cbiAgICBhc3luYyBjYXJnYU1vZGFsKGl0ZW0pIHtcblxuICAgICAgICAvLyBPYnRpZW5lIGxhcyBzZWRlcyBkZWwgY2xpZW50ZVxuICAgICAgICBjb25zdCBzZWRlcyA9IGF3YWl0IHRoaXMuY2FydFNlcnZpY2UuZ2V0QWRkcmVzc0Jvb2soKTtcblxuICAgICAgICAvLyBDcmVvIHVuYSBzZXJpZSBkZSB2YXJpYWJsZXMgcXVlIHZveSBhIG5lY2VzaXRhciwgaWQgcGFyYSBjb250cm9sYXIgbGFzIHZ1ZWx0YXMgcXVlIGRhIHkgY3VhbnRhcyBsaW5lYXMgaGF5IHkgYWxsSUQgcGFyYSBhbG1hY2VuYXIgbG9zIElEIGRlIGxvcyBsb3Rlcy5cbiAgICAgICAgdmFyIGlkID0gMTtcbiAgICAgICAgdmFyIHRoaXNfID0gdGhpcztcbiAgICAgICAgdmFyIGFsbElEID0gW107XG5cbiAgICAgICAgLy8gQcOxYWRlIGxvcyBkYXRvcyBhbCBlbmNhYmV6YWRvIGRlbCBNb2RhbFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5jYWJlemFkb01vZGFsJykuaW5uZXJIVE1MID0gJzxhIGNsYXNzPVwidGl0bGUgdGV4dC1kYXJrIHRleHQtZGVjb3JhdGlvbi1ub25lIGg1IGQtYmxvY2sgbS0wIHAtMCBtLTAgcC0wXCI+PHAgY2xhc3M9XCJub21icmUgbWItMFwiIGlkPVwicHJvZHVjdE5hbWVcIj4nICsgaXRlbVsncHJvZHVjdCddWyduYW1lJ10gKyAnPC9wPjxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5IHBzLTIgbXMtMVwiIGlkPVwicHJvZHVjdFJlZlwiPlJlZjonICsgaXRlbVsndmFyaWFudF9pZCddICsgJzwvc21hbGw+PC9hPic7XG5cbiAgICAgICAgLy8gQm9ycmFtb3MgdG9kb3MgbG9zIGRhdG9zIGRlIGxvcyBsb3RlcyBhbnRlcmlvcmVzXG4gICAgICAgIHZhciBib2R5VGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxvdF9ib2R5X3RhYmxlXCIpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XG4gICAgICAgIGJvZHlUYWJsZS5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvLyBSZWNvcnJlIHRvZG9zIGxvcyBhcnRpY3Vsb3MgeSBlbmN1ZW50cmEgc2kgdGllbmVuIGxvdGVzIG8gbm8sIHNpIHRpZW5lIGNyZWEgbGFzIGxpbmVhc1xuICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5nZXRDYXJ0MigpLmZvckVhY2goaSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChpWydpdGVtX2lkJ10gPT0gaXRlbS5pdGVtX2lkICYmIGlbJ2xvdCddICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgYm9keVRhYmxlLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIGlbJ2xvdCddLmZvckVhY2gobG90ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IGJvZHlUYWJsZS5pbnNlcnRSb3coYm9keVRhYmxlLnJvd3MubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwxID0gcm93Lmluc2VydENlbGwoMCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjZWxsMiA9IHJvdy5pbnNlcnRDZWxsKDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbDMgPSByb3cuaW5zZXJ0Q2VsbCgyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGw0ID0gcm93Lmluc2VydENlbGwoMyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjZWxsNSA9IHJvdy5pbnNlcnRDZWxsKDQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbDYgPSByb3cuaW5zZXJ0Q2VsbCg1KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKGxvdFsnZGF0ZV9yZXF1ZXN0J10pKTtcbiAgICAgICAgICAgICAgICAgICAgY2VsbDEuaW5uZXJIVE1MID0gJzxpbnB1dCBpZD1cImlkJyArIGlkICsgJ1wiICBzdHlsZT1cImJvcmRlcjogMDtcIiB2YWx1ZT1cIicgKyBsb3QuaWQgKyAnXCIgZGlzYWJsZWQ+JztcbiAgICAgICAgICAgICAgICAgICAgY2VsbDIuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJxdWFudGl0eScgKyBpZCArICdcIiB2YWx1ZT0gXCInICsgbG90LnF1YW50aXR5ICsgJ1wiY2xhc3M9XCJmb3JtLWNvbnRyb2wgdy01MFwiIG1heD1cIicgKyBsb3QucXVhbnRpdHkgKyAnXCI+JztcbiAgICAgICAgICAgICAgICAgICAgY2VsbDMuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiZGF0ZVwiIHZhbHVlPVwiJyArIHRoaXMuZm9ybWF0RGF0ZShkYXRlKSArICdcIiBpZD1cImRlbGl2ZXJ5RGF0ZScgKyBpZCArICdcIiBjbGFzcz1cImZvcm0tY29udHJvbCB3LTc1XCI+JztcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9wY2lvbmVzID0gXCJcIlxuICAgICAgICAgICAgICAgICAgICBzZWRlcy5mb3JFYWNoKHNlZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZGUuaWQgPT0gbG90LnNoaXBwaW5nX2FkZHJlc3NfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNpb25lcyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBzZWRlLmlkICsgJ1wiIHNlbGVjdGVkPicgKyBzZWRlLmNpdHkgKyAnIC0gJyArIHNlZGUuc3RyZWV0ICsgJzwvb3B0aW9uPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNpb25lcyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBzZWRlLmlkICsgJ1wiPicgKyBzZWRlLmNpdHkgKyAnIC0gJyArIHNlZGUuc3RyZWV0ICsgJzwvb3B0aW9uPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjZWxsNC5pbm5lckhUTUwgPSAnPHNlbGVjdCAgaWQ9XCJzaGlwcGluZ0FkZHJlc3MnICsgaWQgKyAnXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdy03NVwiPicgKyBvcGNpb25lcyArICc8L3NlbGVjdD4nO1xuICAgICAgICAgICAgICAgICAgICBjZWxsNS5pbm5lckhUTUwgPSAnPGlucHV0IHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG5TZWd1aXJcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYnMtdGFyZ2V0PVwiI2NvbGxhcHNlRXhhbXBsZScgKyBpZCArICdcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPVwiY29sbGFwc2VFeGFtcGxlJyArIGlkICsgJ1wiIHZhbHVlPVwiVmVyXCI+PC9pbnB1dD4nO1xuICAgICAgICAgICAgICAgICAgICBjZWxsNi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImNvbC0xIGZsZXgtZ3Jvdy0wIHRleHQtcmlnaHQgYnRuQm9ycmFyIGQtbm9uZSBkLW1kLWJsb2NrIGQtbm9uZSBkLW1kLWJsb2NrXCI+PGJ1dHRvbiB2YWx1ZT1cIicgKyBsb3QuaWQgKyAnXCIgY2xhc3M9XCJidG5cIiBpZD1cImJvdG9uQm9ycmFyXCI+PGltZyBzcmM9XCIuL2Fzc2V0cy9tYXF1ZXRhZG8vaW1nL2ljLWJvcnJhci5zdmdcIiBhbHQ9XCJcIj4gPC9idXR0b24+PC9kaXY+JztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdzIgPSBib2R5VGFibGUuaW5zZXJ0Um93KGJvZHlUYWJsZS5yb3dzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWxhMiA9IHJvdzIuaW5zZXJ0Q2VsbCgwKVxuICAgICAgICAgICAgICAgICAgICBmaWxhMi5jb2xTcGFuID0gNjtcbiAgICAgICAgICAgICAgICAgICAgZmlsYTIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJjb2xsYXBzZVwiIGlkPVwiY29sbGFwc2VFeGFtcGxlJyArIGlkICsgJ1wiPjxpbnB1dCBpZD1cIm5vdGVzJyArIGlkICsgJ1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdmFsdWU9XCInICsgbG90Lm5vdGVzICsgJ1wiIHBsYWNlaG9sZGVyPVwiSW5ncmVzZSB1biBjb21lbnRhcmlvIGVuIGNhc28gZGUgcXVlIHNlYSBuZWNlc2FyaW8uXCIgdHlwZT1cInRleHRcIi8+PC9kaXY+JztcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBpZCArIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgYWxsSUQucHVzaChsb3RbJ2lkJ10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90b25BZ3JlZ2FyJykub25jbGljayA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgLy8gLy8gU2UgY2FsY3VsYSBsYSBjYW50aWRhZCB5IGVsIGNvbnRhZG9yIHBhcmEgcXVlIG5vIGV4Y2VkYSBsYSBjYW50aWRhZCBkZSBsYSBsaW5lYSBhbCBjcmVhciB1biBudWV2byBsb3RlLlxuICAgICAgICAgICAgdmFyIGNhbnRpZGFkQWN0dWFsID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBpZDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmICg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRBY3R1YWwgPSBjYW50aWRhZEFjdHVhbCArIHBhcnNlSW50KCg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlIGHDsWFkZSBsYSBsaW5lYSBzaWVtcHJlIHkgY3VhbmRvIGxhIGNhbnRpZGFkIHJlc3RhbnRlIG5vIHNlYSBjZXJvLlxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkQWN0dWFsIDwgaXRlbVsncXVhbnRpdHknXSkge1xuICAgICAgICAgICAgICAgIHZhciByb3cgPSBib2R5VGFibGUuaW5zZXJ0Um93KGJvZHlUYWJsZS5yb3dzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwxID0gcm93Lmluc2VydENlbGwoMCk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwyID0gcm93Lmluc2VydENlbGwoMSk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwzID0gcm93Lmluc2VydENlbGwoMik7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGw0ID0gcm93Lmluc2VydENlbGwoMyk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGw1ID0gcm93Lmluc2VydENlbGwoNCk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGw2ID0gcm93Lmluc2VydENlbGwoNSk7XG4gICAgICAgICAgICAgICAgY2VsbDEuaW5uZXJIVE1MID0gJzxpbnB1dCBpZD1cImlkJyArIGlkICsgJ1wiICBzdHlsZT1cImJvcmRlcjogMDtcIiB2YWx1ZT1cIlBlbmR0LlwiIGRpc2FibGVkPic7XG4gICAgICAgICAgICAgICAgY2VsbDIuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJxdWFudGl0eScgKyBpZCArICdcIiB2YWx1ZT0gXCInICsgKGl0ZW1bJ3F1YW50aXR5J10gLSBjYW50aWRhZEFjdHVhbCkgKyAnXCJjbGFzcz1cImZvcm0tY29udHJvbCB3LTUwXCIgbWF4PVwiJyArIChpdGVtWydxdWFudGl0eSddIC0gY2FudGlkYWRBY3R1YWwpICsgJ1wiPic7XG4gICAgICAgICAgICAgICAgY2VsbDMuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiZGF0ZVwiIGlkPVwiZGVsaXZlcnlEYXRlJyArIGlkICsgJ1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIHctNzVcIj4nO1xuICAgICAgICAgICAgICAgIHZhciBvcGNpb25lcyA9IFwiXCJcbiAgICAgICAgICAgICAgICBzZWRlcy5mb3JFYWNoKHNlZGUgPT4geyBvcGNpb25lcyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBzZWRlLmlkICsgJ1wiPicgKyBzZWRlLmNpdHkgKyAnIC0gJyArIHNlZGUuc3RyZWV0ICsgJzwvb3B0aW9uPic7IH0pO1xuICAgICAgICAgICAgICAgIGNlbGw0LmlubmVySFRNTCA9ICc8c2VsZWN0ICBpZD1cInNoaXBwaW5nQWRkcmVzcycgKyBpZCArICdcIiBjbGFzcz1cImZvcm0tY29udHJvbCB3LTc1XCI+JyArIG9wY2lvbmVzICsgJzwvc2VsZWN0Pic7XG4gICAgICAgICAgICAgICAgY2VsbDUuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuU2VndWlyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJzLXRhcmdldD1cIiNjb2xsYXBzZUV4YW1wbGUnICsgaWQgKyAnXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgYXJpYS1jb250cm9scz1cImNvbGxhcHNlRXhhbXBsZScgKyBpZCArICdcIiB2YWx1ZT1cIlZlclwiPjwvaW5wdXQ+JztcbiAgICAgICAgICAgICAgICBjZWxsNi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImNvbC0xIGZsZXgtZ3Jvdy0wIHRleHQtcmlnaHQgYnRuQm9ycmFyIGQtbm9uZSBkLW1kLWJsb2NrIGQtbm9uZSBkLW1kLWJsb2NrXCI+PGJ1dHRvbiBjbGFzcz1cImJ0blwiIGlkPVwiYm90b25Cb3JyYXJcIj48aW1nIHNyYz1cIi4vYXNzZXRzL21hcXVldGFkby9pbWcvaWMtYm9ycmFyLnN2Z1wiIGFsdD1cIlwiPiA8L2J1dHQ+PC9kaXY+JztcbiAgICAgICAgICAgICAgICB2YXIgcm93MiA9IGJvZHlUYWJsZS5pbnNlcnRSb3coYm9keVRhYmxlLnJvd3MubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB2YXIgZmlsYTIgPSByb3cyLmluc2VydENlbGwoMClcbiAgICAgICAgICAgICAgICBmaWxhMi5jb2xTcGFuID0gNjtcbiAgICAgICAgICAgICAgICBmaWxhMi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImNvbGxhcHNlXCIgaWQ9XCJjb2xsYXBzZUV4YW1wbGUnICsgaWQgKyAnXCI+PGlucHV0IGlkPVwibm90ZXMnICsgaWQgKyAnXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIkluZ3Jlc2UgdW4gY29tZW50YXJpbyBlbiBjYXNvIGRlIHF1ZSBzZWEgbmVjZXNhcmlvLlwiIHR5cGU9XCJ0ZXh0XCIvPjwvZGl2Pic7XG5cblxuICAgICAgICAgICAgICAgIGlkID0gaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzXy50b2FzdHJTZXJ2aWNlLnNob3coJ2xvdC1tYXgtcXVhbnRpdHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEN1YW5kbyBzZSBwdWxzYSBlbCBib3RvbiBwYXJhIGd1YXJkYXIgZWwgbG90ZSByZWNvcnJlIGxhIGZ1bmNpb24geSBlbCBmb3IgLCByZWNvcnJlIGxpbmVhIGEgbGluZWEgeSBsYW56YSBlbCBlbmRwb2ludCBjb24gdW5hIHBhdXNhIHBhcmEgcXVlIG5vIHNlIHBpZXJkYSBuaW5ndW5vIHkgbm8gc2UgcXVlZGUgcGlsbGFkby5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdG9uR3VhcmRhcicpLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzXy50b2FzdHJTZXJ2aWNlLnNob3coJ2xvdC1zYXZpbmcnKTtcbiAgICAgICAgICAgIHRoaXNfLmNhcmdhbmRvID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBsb3RJRCA9ICcnO1xuICAgICAgICAgICAgdmFyIGNhbnRpZGFkTG90ZXMgPSAwO1xuICAgICAgICAgICAgLy9Db250cm9sYSBxdWUgbGFzIGNhbnRpZGFkZXMgZGUgbG9zIGxvdGVzIG5vIHNlYSBzdXBlcmlvciBhIGxhIGRlbCBwcm9kdWN0byBlbiBlbCBjYXJyaXRvLlxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGlkOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVhbnRpdHlcIiArIGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBjYW50aWRhZExvdGVzID0gY2FudGlkYWRMb3RlcyArIHBhcnNlSW50KCg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpdGVtLnF1YW50aXR5ID49IGNhbnRpZGFkTG90ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhjYW50aWRhZExvdGVzKTtcbiAgICAgICAgICAgICAgICB2YXIgeSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGlkOyBpbmRleCsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbnRpdHkgPSBwYXJzZUludCgoPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWFudGl0eVwiICsgaW5kZXgpKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsaXZlcnlEYXRlID0gKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsaXZlcnlEYXRlXCIgKyBpbmRleCkpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoaXBwaW5nQWRkcmVzcyA9ICQoXCIjc2hpcHBpbmdBZGRyZXNzXCIgKyBpbmRleCkudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm90ZXMgPSAkKFwiI25vdGVzXCIgKyBpbmRleCkudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hpcHBpbmdBZGRyZXNzTmFtZSA9ICQoJyNzaGlwcGluZ0FkZHJlc3MnICsgaW5kZXggKyAnIG9wdGlvbjpzZWxlY3RlZCcpLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaWRcIiArIGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvdElEID0gKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaWRcIiArIGluZGV4KSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXlJbmRleCA9IGFsbElELmluZGV4T2YocGFyc2VJbnQobG90SUQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbElELnNwbGljZShteUluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb3RJRCA9PSAnUGVuZHQuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ251ZXZvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBxdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBxdWFudGl0eSwgJ25ldycsIGRlbGl2ZXJ5RGF0ZSwgbm90ZXMsIHBhcnNlSW50KHNoaXBwaW5nQWRkcmVzcyksIHNoaXBwaW5nQWRkcmVzc05hbWUsICduZXdsb3QnKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvdElEICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsb3RJRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgcGFyc2VJbnQobG90SUQpLCBpdGVtLml0ZW1faWQsIHF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIHF1YW50aXR5LCAnZWRpdGVkJywgZGVsaXZlcnlEYXRlLCBub3RlcywgcGFyc2VJbnQoc2hpcHBpbmdBZGRyZXNzKSwgc2hpcHBpbmdBZGRyZXNzTmFtZSwgJ2VkaXRsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB5ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFsbElELmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2coJ2JvcnJhcicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgZWxlbWVudCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2RlbGV0ZScsIDAsICcnLCAwLCAnZGVsZXRlJywgJ2RlbGV0ZWxvdCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aGlzXy5jYXJ0U2VydmljZS5sb2FkQ2FydEJ5VG9rZW4odGhpc18uY2FydFNlcnZpY2UuZ2V0Q2FydFRva2VuKCkpOyB9LCAzMDAgKiB5KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aGlzXy50b2FzdHJTZXJ2aWNlLnNob3coJ2xvdC1zYXZlZCcpOyB9LCAzMDAgKiB5KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aGlzXy5jYXJnYW5kbyA9IGZhbHNlIH0sIDMwMCAqIHkpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNfLnRvYXN0clNlcnZpY2Uuc2hvdygnTGEgY2FudGlkYWQgZGUgbG9zIGxvdGVzIGVzIHN1cGVyaW9yIGEgbGEgY2FudGlkYWQgZGVsIHByb2R1Y3RvLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcjYm90b25Cb3JyYXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzKTtcbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgndHInKS5yZW1vdmUoKTtcblxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGNsb3NlTW9kYWwoaWQpIHtcbiAgICAgICAgJCgnIycgKyBpZCkubW9kYWwoJ2hpZGUnKTtcbiAgICB9XG5cbiAgICBjaGVja1N0b2NrKGl0ZW0pIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIGl0ZW0ucHJvZHVjdC52YXJpYW50cykge1xuICAgICAgICAgICAgaWYgKGl0ZW0udmFyaWFudF9pZCA9PT0gdmFyaWFudC5jb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnQuc3RvY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnMCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnF1YW50aXR5ID4gdmFyaWFudC5zdG9jaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0b2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhbnQuc3RvY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gU29sbyBzZSBlamVjdXRhIHNpIG5vIHNlIGN1bXBsZSBsYSBjb25kaWNpw7NuXG4gICAgfVxuXG4gICAgdXBkYXRlQWxsU3RvY2soKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIC8vIERlZmluZSBsYSBzdXNjcmlwY2nDs24gYW50ZXMgZGUgdXNhcmxhXG5cbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5jYXJ0SXRlbXMuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICByZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhcmlhbnQgb2YgaXRlbS5wcm9kdWN0LnZhcmlhbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhcmlhbnRfaWQgPT09IHZhcmlhbnQuY29kZSAmJiAhdGhpcy5leGl0VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudC5zdG9jayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZGVsZXRlQ2FydEl0ZW0oaXRlbSwgZmFsc2UpOyAvLyBCb3JyYSBlbCBhcnTDrWN1bG9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5xdWFudGl0eSA+IHZhcmlhbnQuc3RvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IHZhcmlhbnQuc3RvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRDb2RlOiB2YXJpYW50LmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudENvZGU6IHZhcmlhbnQuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgIXRoaXMuZXhpdFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAgLy8gRGVzdXNjcsOtYmV0ZSBhbnRlcyBkZSBhY3R1YWxpemFyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRBbGxUb0NhcnQoaXRlbXMpOyAgLy8gQWN0dWFsaXphIGVsIGNhcnJpdG9cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5leGl0VXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUFsbFN0b2NrKCk7ICAvLyBWdWVsdmUgYSB2ZXJpZmljYXIgZWwgc3RvY2tcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG5cblxuICAgIGdldFZhcmlhbnRzID0gcHJvZHVjdCA9PiB7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSBwcm9kdWN0LnByb2R1Y3RcblxuICAgICAgICBpZiAoaXRlbS52YXJpYW50cyAmJiBpdGVtLnZhcmlhbnRzLmxlbmd0aCAmJiBpdGVtLnZhcmlhbnRzWzBdLm9wdGlvbnMgJiYgaXRlbS52YXJpYW50c1swXS5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBpdGVtLnZhcmlhbnRzWzBdLm9wdGlvbnNcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4gdGhpcy52YXJpYW50c1RvU2hvdy5maW5kKG5hbWUgPT4gb3B0aW9uLmhhc093blByb3BlcnR5KG5hbWUpKSlcbiAgICAgICAgICAgIGxldCBvcHRpb25zTWFwID0gW11cbiAgICAgICAgICAgIG9wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9uKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uQWRkZWQgPSBmYWxzZTsgIC8vIFZhcmlhYmxlIHBhcmEgZXZpdGFyIG3Dumx0aXBsZXMgaW5zZXJjaW9uZXNcblxuICAgICAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZm9yRWFjaChvcHRpb24yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24yLmNvZGUgPT0gJ0NPTE9SJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjIudmFsdWVzLmZvckVhY2goY29sb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IuY29kZSA9PSBvcHRpb25bZW50cnldICYmICFvcHRpb25BZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXNoKHsgbmFtZTogZW50cnksIHZhbHVlOiBvcHRpb25bZW50cnldLCBpbWFnZTogY29sb3IuaW1hZ2UsIG1vYmlsZUltYWdlOiBjb2xvci5tb2JpbGVJbWFnZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkFkZGVkID0gdHJ1ZTsgLy8gTWFyY2FyIG9wY2nDs24gYWdyZWdhZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2kgbm8gc2UgYcOxYWRpw7MgbGEgb3BjacOzbiBkZSBDT0xPUiwgbWFuZWphciBvdHJhcyBvcGNpb25lc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbkFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZm9yRWFjaChvcHRpb24yID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24yLmNvZGUgIT09ICdDT0xPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbltlbnRyeV1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uQWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNNYXA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNNYXA7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGNyZWF0ZURpc2NvdW50TWVzc2FnZShzYWxlcHJpY2U6IG51bWJlciwgcHJpY2U6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmIChpc05hTihzYWxlcHJpY2UpIHx8IGlzTmFOKHByaWNlKSB8fCBzYWxlcHJpY2UgPj0gcHJpY2UgfHwgc2FsZXByaWNlIDw9IDAgfHwgcHJpY2UgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRpc2NvdW50UGVyY2VudGFnZSA9IE1hdGgucm91bmQoKChwcmljZSAtIHNhbGVwcmljZSkgLyBwcmljZSkgKiAxMDApO1xuXG4gICAgICAgIGxldCBkaXNjb3VudE1lc3NhZ2UgPSBgJHtkaXNjb3VudFBlcmNlbnRhZ2V9JSBPRkZgO1xuICAgICAgICByZXR1cm4gZGlzY291bnRNZXNzYWdlO1xuICAgIH1cbiAgICBnZXRNaW5pbXVtUHVyY2hhc2VBbW91bnQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwudHlwZSA9PSAnYjJiJyA/IHRoaXMuY2hhbm5lbC53aG9sZXNhbGVyTWluaW11bVB1cmNoYXNlQW1vdW50IDogdGhpcy5jaGFubmVsLnJldGFpbGVyTWluaW11bVB1cmNoYXNlQW1vdW50XG5cbiAgICB9XG5cbiAgICBleGNlZWRzTWluaW11bUFtb3VudCA9ICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLmdldE1pbmltdW1QdXJjaGFzZUFtb3VudCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWRpcmVjdENoZWNrb3V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBWZXJpZmljYXIgc2kgaGF5IHVuIGJhbGFuY2UgZGUgY2xpZW50ZSBhY3Rpdm9cbiAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYmFsYW5jZUN1c3RvbWVyJC5zdWJzY3JpYmUoYmFsYW5jZUN1c3RvbWVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYmFsYW5jZUN1c3RvbWVyICYmIGJhbGFuY2VDdXN0b21lci5jcmVkaXRBbW91bnQgIT09IG51bGwgJiYgYmFsYW5jZUN1c3RvbWVyLmNyZWRpdEFtb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdxdWFudGl0eS1ub3QtZXhjZWVkZWQtd2hpdG91dC1hbW91bnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncXVhbnRpdHktbm90LWV4Y2VlZGVkJywgeyBhbW91bnQ6IHRoaXMuZ2V0TWluaW11bVB1cmNoYXNlQW1vdW50KCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudW5zdWJzY3JpYmUoKTsgLy8gRGVzdXNjcmliaXJzZSBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpcyBkZSBvYnRlbmVyIGVsIHZhbG9yXG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuXG5cblxuXG5cblxuXG5cblxuXG5cbiJdfQ==
700
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NhcnQtZWMvY2FydC1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBOEIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25GLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFTN0UsSUFBYSxlQUFlLEdBQTVCLE1BQWEsZUFBZ0IsU0FBUSxlQUFlO0lBMkJoRCxZQUNXLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3JCLE1BQWlCLEVBQ3BCLGVBQWdDLEVBQ2hDLE1BQWMsRUFDZCxZQUE0QixFQUN6QixhQUEyQixFQUM5QixpQkFBb0MsRUFDcEMsb0JBQTBDO1FBQ2pELEtBQUssRUFBRSxDQUFDO1FBVEQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDckIs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QVk7WUFDWCxpQkFBaUI7WUFDZCxvQkFBb0I7O0FBNk9yRDtJQURDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQzswREFROUI7QUFJRDtJQURDLFlBQVksQ0FBQyxlQUFlLENBQUM7eURBSTdCO0FBSUQ7SUFEQyxZQUFZLENBQUMsZUFBZSxDQUFDO3lEQU83QjtBQXpTUSxlQUFlO0lBTDNCLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxhQUFhO1FBQ3ZCLFlBQXVDOztLQUUxQyxDQUFDO0dBQ1csZUFBZSxDQWt2QjNCO1NBbHZCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tIFwibmd4LWJvb3RzdHJhcC9tb2RhbFwiO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL2NvcmUuY29uc3RzXCI7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0cy5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gXCIuLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXJcIjtcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCIuLi8uLi91dGlscy90b2FzdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBBZGRyZXNzaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoZWNrb3V0L2FkZHJlc3Npbmcuc2VydmljZSc7XG5pbXBvcnQgeyBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtY2FydC1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhcnQtZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhcnQtZWMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDYXJ0RWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xuXG5cbiAgICBwdWJsaWMgdmFyaWFudHNUb1Nob3c6IHN0cmluZ1tdID0gWydUQUxMRScsICdDT0xPUiddO1xuICAgIHB1YmxpYyBpc0xvZ2dlZEluID0gZmFsc2U7XG4gICAgcHVibGljIG1lZGlhVXJsID0gJyc7XG4gICAgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcbiAgICBwdWJsaWMgcHJvbW90aW9ucyA9IFtdO1xuICAgIHB1YmxpYyBpdGVtczogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHByaXZhdGUgY2FyZ2FuZG86IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hhbm5lbDogYW55ID0ge307XG4gICAgcHVibGljIHVwZGF0ZVN0b2NrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGV4aXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBoaWRlUHJpY2VzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGhpZGVEaXNjb3VudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaGlkZVRheGVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNyZWRpdEFjY291bnRTaG93UHJpY2VzOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHNob3dUYXhMZWdlbmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2FydExvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc3VtbWFyeVByb21vdGlvbkFtb3VudCQ7XG4gICAgcHVibGljIGhhc0FwcGxpZWRDb3Vwb24kO1xuICAgIHB1YmxpYyBhY3RpdmVVbml0UHJvbW90aW9uSXRlbUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgYWN0aXZlVW5pdFByb21vdGlvblN1bW1hcnlTdHlsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBwdWJsaWMgc3VwcG9ydHNVbml0UHJvbW90aW9uSG92ZXIgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHB1YmxpYyBwcm9kdWN0c1NlcnZpY2U6IFByb2R1Y3RzU2VydmljZSxcbiAgICAgICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwdWJsaWMgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHVibGljIGFkZHJlc3NpbmdTZXJ2aWNlOiBBZGRyZXNzaW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNoYW5uZWxDb25maWdTZXJ2aWNlOiBDaGFubmVsQ29uZmlnU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgICAgICB0aGlzLmlzTG9nZ2VkSW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICB0aGlzLm1lZGlhVXJsID0gdGhpcy5jb25zdHMubWVkaWFVcmwoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5UHJvbW90aW9uQW1vdW50JCA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCgpO1xuICAgICAgICB0aGlzLmhhc0FwcGxpZWRDb3Vwb24kID0gdGhpcy5jYXJ0U2VydmljZS5oYXNBcHBsaWVkQ291cG9uKCk7XG5cbiAgICB9XG5cblxuICAgIG5nT25DaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLmlzTG9nZ2VkSW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgIH1cblxuICAgIHVwZGF0ZUxvZ2dlZEluKCkge1xuICAgICAgICB0aGlzLmlzTG9nZ2VkSW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsKDAsIDApO1xuICAgICAgICB0aGlzLnVwZGF0ZVVuaXRQcm9tb3Rpb25WaWV3cG9ydE1vZGUoKTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5wcm9tb3Rpb25zLnN1YnNjcmliZShwcm9tb3Rpb25zID0+IHRoaXMucHJvbW90aW9ucyA9IHByb21vdGlvbnMpO1xuICAgICAgICAvLyAgICBjb25zb2xlLmxvZyh0aGlzLmNhcnRTZXJ2aWNlLmdldFRheGVzKCkpO1xuXG4gICAgICAgIHRoaXMuY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKGNoYW5uZWwgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlUHJpY2VzID0gY2hhbm5lbD8uaGlkZVByaWNlcyA/PyBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaGlkZURpc2NvdW50cyA9IGNoYW5uZWw/LmhpZGVEaXNjb3VudHMgPz8gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhpZGVUYXhlcyA9IGNoYW5uZWw/LmhpZGVUYXhlcyA/PyBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RheExlZ2VuZCA9IGNoYW5uZWw/LnNob3dUYXhMZWdlbmQgPz8gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlID0gY2hhbm5lbD8uZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGUgPz8gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVQcmljZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnNob3dQcmljZSQuc3Vic2NyaWJlKChzaG93UHJpY2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlZGl0QWNjb3VudFNob3dQcmljZXMgPSBzaG93UHJpY2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmxvYWRpbmcuc3Vic2NyaWJlKGlzTG9hZGluZyA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhcnRMb2FkaW5nID0gaXNMb2FkaW5nO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252aWVydGUgdW4gbW9udG8gY3J1ZG8gYWwgZm9ybWF0byBkZWNpbWFsIGVzcGVyYWRvIHBvciBsYSBVSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhbW91bnQgTW9udG8gZW4gY2VudGF2b3MgbyBlbnRlcm8gY3J1ZG8uXG4gICAgICogQHJldHVybnMgTW9udG8gZGVjaW1hbC5cbiAgICAgKi9cbiAgICB0b0RlY2ltYWwgPSAoYW1vdW50KSA9PiB0aGlzLmNvbnN0cy50b0RlY2ltYWwoYW1vdW50KTtcblxuICAgIC8qKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by4gQHJldHVybnMgUG9yY2VudGFqZSBkZSBkZXNjdWVudG8gbGVnYWN5IHBhcmEgZWwgYmFkZ2UgYCUgT0ZGYC4gKi9cbiAgICBnZXRJdGVtRGlzY291bnQgPSAoaXRlbSk6IG51bWJlciA9PiBOdW1iZXIodGhpcy5jYXJ0U2VydmljZS5nZXRJdGVtUHJpY2luZyhpdGVtKT8uZGlzY291bnRQZXJjZW50IHx8IDApO1xuXG4gICAgLyoqXG4gICAgICogRGV2dWVsdmUgZWwgcG9yY2VudGFqZSBlZmVjdGl2byB0b3RhbCBkZWwgw610ZW0sIGNvbnNpZGVyYW5kbyBwcm9tb2Npb25lcyB1bml0YXJpYXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBQb3JjZW50YWplIGVudGVybyBjYWxjdWxhZG8gY29udHJhIGVsIHByZWNpbyBkZSByZWZlcmVuY2lhIGRlbCDDrXRlbS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2kgZXhpc3RlIHByZWNpbyB0YWNoYWRvLCBjb21wYXJhIGBmaW5hbFByaWNlYCBjb250cmEgYHN0cmlrZVByaWNlYC5cbiAgICAgKiBTaSBubyBleGlzdGUsIHVzYSBgYmFzZVByaWNlYCBjb21vIHJlZmVyZW5jaWEuXG4gICAgICogRXN0byBwZXJtaXRlIG1vc3RyYXIgdW4gYmFkZ2UgY29oZXJlbnRlIGN1YW5kbyBlbCBwcmVjaW8gdmlzaWJsZSB5YSBpbmNsdXllXG4gICAgICogZGVzY3VlbnRvcy9wcm9tb2Npb25lcyB1bml0YXJpYXMgYWRpY2lvbmFsZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogLy8gc3RyaWtlUHJpY2UgMjQwMDAwLCBmaW5hbFByaWNlIDQ1MDAwID0+IDgxXG4gICAgICogdGhpcy5nZXRJdGVtRWZmZWN0aXZlRGlzY291bnQoaXRlbSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0SXRlbUVmZmVjdGl2ZURpc2NvdW50ID0gKGl0ZW0pOiBudW1iZXIgPT4gTnVtYmVyKHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk/LmVmZmVjdGl2ZURpc2NvdW50UGVyY2VudCB8fCAwKTtcblxuICAgIC8qKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by4gQHJldHVybnMgU3VidG90YWwgYWN0dWFsIGRlbCByZW5nbMOzbiBzZWfDum4gYmFja2VuZC4gKi9cbiAgICBnZXREaXNwbGF5ZWRJdGVtVG90YWwgPSAoaXRlbSk6IG51bWJlciA9PiBOdW1iZXIoaXRlbT8udG90YWwgPz8gMCk7XG5cbiAgICAvKiogQHBhcmFtIGl0ZW0gw410ZW0gZGVsIGNhcnJpdG8uIEByZXR1cm5zIGB0cnVlYCBzaSBlbCBiYWNrZW5kIGluZm9ybcOzIHByb21vY2lvbmVzIHVuaXRhcmlhcy4gKi9cbiAgICBoYXNVbml0UHJvbW90aW9ucyA9IChpdGVtKTogYm9vbGVhbiA9PiBCb29sZWFuKHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk/Lmhhc1VuaXRQcm9tb3Rpb25zKTtcblxuICAgIC8qKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by4gQHJldHVybnMgYHRydWVgIHNpIGVsIHJlc3VtZW4gYWN0aXZvIHBlcnRlbmVjZSBhIGVzZSDDrXRlbS4gKi9cbiAgICBpc1VuaXRQcm9tb3Rpb25TdW1tYXJ5T3BlbiA9IChpdGVtKTogYm9vbGVhbiA9PiB0aGlzLmFjdGl2ZVVuaXRQcm9tb3Rpb25JdGVtSWQgPT09IGl0ZW0/Lml0ZW1faWQ7XG5cbiAgICAvKipcbiAgICAgKiBBYnJlIGVsIHJlc3VtZW4gZGVsIMOtdGVtIGFsIGVudHJhciBjb24gZWwgbW91c2UgZW4gZGVza3RvcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIMONdGVtIGRlbCBjYXJyaXRvLlxuICAgICAqIEBwYXJhbSBhbmNob3IgRWxlbWVudG8gdXNhZG8gY29tbyBhbmNsYSB2aXN1YWwuXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICovXG4gICAgaGFuZGxlVW5pdFByb21vdGlvbk1vdXNlRW50ZXIgPSAoaXRlbSwgYW5jaG9yOiBIVE1MRWxlbWVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNVbml0UHJvbW90aW9uSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlblVuaXRQcm9tb3Rpb25TdW1tYXJ5KGl0ZW0sIGFuY2hvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2llcnJhIGVsIHJlc3VtZW4gYWwgc2FsaXIgY29uIGVsIG1vdXNlIGVuIGRlc2t0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBhc29jaWFkbyBhbCByZXN1bWVuLlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqL1xuICAgIGhhbmRsZVVuaXRQcm9tb3Rpb25Nb3VzZUxlYXZlID0gKGl0ZW0pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzVW5pdFByb21vdGlvbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsb3NlVW5pdFByb21vdGlvblN1bW1hcnkoaXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWJyZSBlbCByZXN1bWVuIGRlIHByb21vY2lvbmVzIHVuaXRhcmlhcyBwYXJhIHVuIMOtdGVtIHB1bnR1YWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by5cbiAgICAgKiBAcGFyYW0gYW5jaG9yIEVsZW1lbnRvIGRlIHJlZmVyZW5jaWEgcGFyYSBwb3NpY2lvbmFtaWVudG8uXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICovXG4gICAgb3BlblVuaXRQcm9tb3Rpb25TdW1tYXJ5ID0gKGl0ZW0sIGFuY2hvcj86IEhUTUxFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5oYXNVbml0UHJvbW90aW9ucyhpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVVbml0UHJvbW90aW9uSXRlbUlkID0gaXRlbT8uaXRlbV9pZCA/PyBudWxsO1xuICAgICAgICB0aGlzLnVwZGF0ZVVuaXRQcm9tb3Rpb25TdW1tYXJ5U3R5bGVzKGFuY2hvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2llcnJhIGVsIHJlc3VtZW4gYWN0aXZvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gU2kgc2UgZW52w61hLCBzb2xvIGNpZXJyYSBjdWFuZG8gY29pbmNpZGUgY29uIGVsIMOtdGVtIGFjdGl2by5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBjbG9zZVVuaXRQcm9tb3Rpb25TdW1tYXJ5ID0gKGl0ZW0/KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghaXRlbSB8fCB0aGlzLmFjdGl2ZVVuaXRQcm9tb3Rpb25JdGVtSWQgPT09IGl0ZW0/Lml0ZW1faWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlVW5pdFByb21vdGlvbkl0ZW1JZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVVuaXRQcm9tb3Rpb25TdW1tYXJ5U3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIG1hbnVhbG1lbnRlIGxhIGFwZXJ0dXJhIGRlbCByZXN1bWVuIHBhcmEgdW4gw610ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by5cbiAgICAgKiBAcGFyYW0gYW5jaG9yIEVsZW1lbnRvIGRlIHJlZmVyZW5jaWEuXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgcHVudGVyby5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICB0b2dnbGVVbml0UHJvbW90aW9uU3VtbWFyeSA9IChpdGVtLCBhbmNob3I6IEhUTUxFbGVtZW50LCBldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1VuaXRQcm9tb3Rpb25zKGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1VuaXRQcm9tb3Rpb25TdW1tYXJ5T3BlbihpdGVtKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVVuaXRQcm9tb3Rpb25TdW1tYXJ5KGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGVuVW5pdFByb21vdGlvblN1bW1hcnkoaXRlbSwgYW5jaG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5lamEgZWwgY2xpY2svdGFwIHNvYnJlIGVsIHByZWNpbyBlbiBkaXNwb3NpdGl2b3Mgc2luIGhvdmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gw410ZW0gZGVsIGNhcnJpdG8uXG4gICAgICogQHBhcmFtIGFuY2hvciBFbGVtZW50byB1c2FkbyBjb21vIHRyaWdnZXIuXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZSBjbGljay90YXAuXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICovXG4gICAgaGFuZGxlVW5pdFByb21vdGlvblByaWNlQ2xpY2sgPSAoaXRlbSwgYW5jaG9yOiBIVE1MRWxlbWVudCwgZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzVW5pdFByb21vdGlvbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvZ2dsZVVuaXRQcm9tb3Rpb25TdW1tYXJ5KGl0ZW0sIGFuY2hvciwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2aXRhIHF1ZSBldmVudG9zIGRlbnRybyBkZWwgcmVzdW1lbiBzZSBwcm9wYWd1ZW4gYWwgZG9jdW1lbnRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgcHVudGVyby5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBzdG9wVW5pdFByb21vdGlvblN1bW1hcnlFdmVudCA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSBpdGVtIMONdGVtIGRlbCBjYXJyaXRvLiBAcmV0dXJucyBQcmVjaW8gdW5pdGFyaW8gYmFzZSAoYHNhbGVwcmljZWAgbyBgcHJpY2VgKS4gKi9cbiAgICBnZXRPcmlnaW5hbFVuaXRQcmljZSA9IChpdGVtKTogbnVtYmVyID0+IE51bWJlcih0aGlzLmNhcnRTZXJ2aWNlLmdldEl0ZW1QcmljaW5nKGl0ZW0pPy5iYXNlUHJpY2UgfHwgMCk7XG5cbiAgICAvKiogQHBhcmFtIGl0ZW0gw410ZW0gZGVsIGNhcnJpdG8uIEByZXR1cm5zIFByZWNpbyB0YWNoYWRvIGxlZ2FjeSBvIGAwYC4gKi9cbiAgICBnZXRTdHJpa2VUaHJvdWdoVW5pdFByaWNlID0gKGl0ZW0pOiBudW1iZXIgPT5cbiAgICAgICAgTnVtYmVyKHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk/LnN0cmlrZVByaWNlIHx8IDApO1xuXG4gICAgLyoqIEBwYXJhbSBpdGVtIMONdGVtIGRlbCBjYXJyaXRvLiBAcmV0dXJucyBTdW1hIGRlIHByb21vY2lvbmVzIHVuaXRhcmlhcyBhcGxpY2FkYXMuICovXG4gICAgZ2V0VW5pdFByb21vdGlvblRvdGFsID0gKGl0ZW0pOiBudW1iZXIgPT5cbiAgICAgICAgTnVtYmVyKHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk/LnVuaXRQcm9tb3Rpb25Ub3RhbCB8fCAwKTtcblxuICAgIC8qKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by4gQHJldHVybnMgUHJlY2lvIGZpbmFsIHVuaXRhcmlvIGx1ZWdvIGRlIHByb21vY2lvbmVzLiAqL1xuICAgIGdldEZpbmFsVW5pdFByaWNlID0gKGl0ZW0pOiBudW1iZXIgPT4gTnVtYmVyKHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk/LmZpbmFsUHJpY2UgfHwgMCk7XG5cbiAgICAvKiogQHBhcmFtIGl0ZW0gw410ZW0gZGVsIGNhcnJpdG8uIEByZXR1cm5zIFByZWNpbyBwcmluY2lwYWwgYSBtb3N0cmFyIGp1bnRvIGFsIHRyaWdnZXIuICovXG4gICAgZ2V0RGlzcGxheWVkVW5pdFByaWNlID0gKGl0ZW0pOiBudW1iZXIgPT4gTnVtYmVyKHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk/LmZpbmFsUHJpY2UgfHwgMCk7XG5cbiAgICAvKiogQHBhcmFtIGl0ZW0gw410ZW0gZGVsIGNhcnJpdG8uIEByZXR1cm5zIGB0cnVlYCBzaSBkZWJlIG1vc3RyYXJzZSBlbCBwcmVjaW8gYmFzZSBqdW50byBhbCBmaW5hbC4gKi9cbiAgICBzaG91bGRTaG93T3JpZ2luYWxVbml0UHJpY2UgPSAoaXRlbSk6IGJvb2xlYW4gPT5cbiAgICAgICAgdGhpcy5oYXNVbml0UHJvbW90aW9ucyhpdGVtKSAmJiB0aGlzLmdldEZpbmFsVW5pdFByaWNlKGl0ZW0pICE9PSB0aGlzLmdldE9yaWdpbmFsVW5pdFByaWNlKGl0ZW0pO1xuXG4gICAgLyoqIEBwYXJhbSBpdGVtIMONdGVtIGRlbCBjYXJyaXRvLiBAcmV0dXJucyBgdHJ1ZWAgc2kgYWRlbcOhcyBkZWwgYmFzZSBwcmljZSBleGlzdGUgdGFjaGFkbyBsZWdhY3kuICovXG4gICAgc2hvdWxkU2hvd0xlZ2FjeVByaWNlT3JpZ2luID0gKGl0ZW0pOiBib29sZWFuID0+XG4gICAgICAgIHRoaXMuZ2V0U3RyaWtlVGhyb3VnaFVuaXRQcmljZShpdGVtKSA+IHRoaXMuZ2V0T3JpZ2luYWxVbml0UHJpY2UoaXRlbSk7XG5cbiAgICAvKiogQHBhcmFtIGl0ZW0gw410ZW0gZGVsIGNhcnJpdG8uIEByZXR1cm5zIEV0aXF1ZXRhIGZpbmFsIGRlbCByZXN1bWVuLiAqL1xuICAgIGdldFVuaXRQcm9tb3Rpb25GaW5hbFByaWNlTGFiZWwgPSAoaXRlbSk6IHN0cmluZyA9PlxuICAgICAgICB0aGlzLmhhc1VuaXRQcm9tb3Rpb25zKGl0ZW0pID8gJ1ByZWNpbyBmaW5hbCcgOiAnUHJlY2lvIHVuaXRhcmlvJztcblxuICAgIC8qKlxuICAgICAqIEJ1c2NhIGRlbnRybyBkZSB1bmEgbGlzdGEgZWwgw610ZW0gcXVlIHRpZW5lIGFjdHVhbG1lbnRlIGVsIHJlc3VtZW4gYWJpZXJ0by5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBMaXN0YSBkZSDDrXRlbXMgZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgw410ZW0gYWN0aXZvIG8gYG51bGxgLlxuICAgICAqL1xuICAgIGdldEFjdGl2ZVVuaXRQcm9tb3Rpb25JdGVtID0gKGl0ZW1zKSA9PlxuICAgICAgICBpdGVtcz8uZmluZChpdGVtID0+IGl0ZW0/Lml0ZW1faWQgPT09IHRoaXMuYWN0aXZlVW5pdFByb21vdGlvbkl0ZW1JZCkgfHwgbnVsbDtcblxuICAgIC8qKiBAcGFyYW0gaXRlbSDDjXRlbSBkZWwgY2Fycml0by4gQHJldHVybnMgUHJvbW9jaW9uZXMgdW5pdGFyaWFzIGNydWRhcyBkZWwgYmFja2VuZC4gKi9cbiAgICBnZXRVbml0UHJvbW90aW9ucyA9IChpdGVtKTogYW55W10gPT4gQXJyYXkuaXNBcnJheShpdGVtPy51bml0UHJvbW90aW9ucykgPyBpdGVtLnVuaXRQcm9tb3Rpb25zIDogW107XG5cbiAgICAvKiogQ2llcnJhIGVsIHJlc3VtZW4gYWwgaGFjZXIgY2xpY2sgZnVlcmEgZW4gZGVza3RvcC4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gICAgaGFuZGxlRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzVW5pdFByb21vdGlvbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZVVuaXRQcm9tb3Rpb25JdGVtSWQgPSBudWxsO1xuICAgICAgICB0aGlzLmFjdGl2ZVVuaXRQcm9tb3Rpb25TdW1tYXJ5U3R5bGVzID0ge307XG4gICAgfVxuXG4gICAgLyoqIFJlY2FsY3VsYSBlbCBtb2RvIGRlIGludGVyYWNjacOzbiB5IGNpZXJyYSBlbCByZXN1bWVuIGFsIGNhbWJpYXIgZWwgdmlld3BvcnQuICovXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gICAgaGFuZGxlV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVVuaXRQcm9tb3Rpb25WaWV3cG9ydE1vZGUoKTtcbiAgICAgICAgdGhpcy5jbG9zZVVuaXRQcm9tb3Rpb25TdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqIENpZXJyYSBlbCByZXN1bWVuIGVuIG1vYmlsZSBhbCBoYWNlciBzY3JvbGwgcGFyYSBldml0YXIgZGVzYWxpbmVhY2nDs24gdmlzdWFsLiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICAgIGhhbmRsZVdpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNVbml0UHJvbW90aW9uSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2VVbml0UHJvbW90aW9uU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVjdGEgc2kgZWwgZGlzcG9zaXRpdm8gc29wb3J0YSBgaG92ZXJgIHJlYWwgeSBkZWJlIGNvbXBvcnRhcnNlIGNvbW8gZGVza3RvcC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlVW5pdFByb21vdGlvblZpZXdwb3J0TW9kZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zdXBwb3J0c1VuaXRQcm9tb3Rpb25Ib3ZlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcoaG92ZXI6IGhvdmVyKSBhbmQgKHBvaW50ZXI6IGZpbmUpJykubWF0Y2hlc1xuICAgICAgICAgICAgJiYgd2luZG93LmlubmVyV2lkdGggPj0gNzY4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGEgZXN0aWxvcyBpbmxpbmUgcGFyYSBtYW50ZW5lciBlbCByZXN1bWVuIG1vYmlsZSBkZW50cm8gZGVsIHZpZXdwb3J0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFuY2hvciBFbGVtZW50byB1c2FkbyBjb21vIGFuY2xhIHZpc3VhbC5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZVVuaXRQcm9tb3Rpb25TdW1tYXJ5U3R5bGVzID0gKGFuY2hvcj86IEhUTUxFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzVW5pdFByb21vdGlvbkhvdmVyIHx8ICFhbmNob3IgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlVW5pdFByb21vdGlvblN1bW1hcnlTdHlsZXMgPSB7fTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0UGFkZGluZyA9IDEyO1xuICAgICAgICBjb25zdCByZWN0ID0gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBlc3RpbWF0ZWRQb3B1cEhlaWdodCA9IDI2MDtcbiAgICAgICAgY29uc3QgbmV4dFRvcCA9IHJlY3QuYm90dG9tICsgODtcbiAgICAgICAgY29uc3QgbWF4VG9wID0gd2luZG93LmlubmVySGVpZ2h0IC0gZXN0aW1hdGVkUG9wdXBIZWlnaHQgLSB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KHZpZXdwb3J0UGFkZGluZywgTWF0aC5taW4obmV4dFRvcCwgbWF4VG9wKSk7XG5cbiAgICAgICAgdGhpcy5hY3RpdmVVbml0UHJvbW90aW9uU3VtbWFyeVN0eWxlcyA9IHtcbiAgICAgICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0UGFkZGluZ31weGAsXG4gICAgICAgICAgICByaWdodDogYCR7dmlld3BvcnRQYWRkaW5nfXB4YCxcbiAgICAgICAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAnbWF4LXdpZHRoJzogJ25vbmUnLFxuICAgICAgICAgICAgJ21heC1oZWlnaHQnOiBgY2FsYygxMDB2aCAtICR7dG9wICsgdmlld3BvcnRQYWRkaW5nfXB4KWAsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2F1dG8nLFxuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWN0dWFsaXphckNhbnRpZGFkKGl0ZW06IGFueSwgY2FudGlkYWQ6IG51bWJlciB8IHN0cmluZywgc3RvY2s6IG51bWJlciwgaWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2FydExvYWRpbmcpIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdWx0aXBsZVF1YW50aXR5ID0gaXRlbS5wcm9kdWN0Py52YXJpYW50cyAmJiBpdGVtLnByb2R1Y3QudmFyaWFudHMubGVuZ3RoID4gMCA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5IDogMDtcbiAgICAgICAgY29uc3Qgc3RlcCA9IG11bHRpcGxlUXVhbnRpdHkgJiYgbXVsdGlwbGVRdWFudGl0eSA+IDAgPyBtdWx0aXBsZVF1YW50aXR5IDogMTtcblxuICAgICAgICBsZXQgbmV3UXVhbnRpdHk6IG51bWJlcjtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbnRpZGFkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbmV3UXVhbnRpdHkgPSBwYXJzZUludChjYW50aWRhZCwgMTApO1xuICAgICAgICAgICAgaWYgKG5ld1F1YW50aXR5ICUgc3RlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogc3RlcCB9KTtcbiAgICAgICAgICAgICAgICBuZXdRdWFudGl0eSA9IE1hdGgucm91bmQobmV3UXVhbnRpdHkgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdRdWFudGl0eSA9IGNhbnRpZGFkO1xuICAgICAgICAgICAgaWYgKG5ld1F1YW50aXR5ICUgc3RlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIG5ld1F1YW50aXR5ID0gTWF0aC5yb3VuZChuZXdRdWFudGl0eSAvIHN0ZXApICogc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtlZXBTYW1lQ29tbWVudCA9IGl0ZW0/LmNvbW1lbnRzID8/IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7IC8vIEFjdHVhbGl6YSBsYSBwcm9waWVkYWQgdmluY3VsYWRhIGEgYFtkaXNhYmxlZF1gXG4gICAgICAgICAgICBpZiAobmV3UXVhbnRpdHkgPiAwICYmIG5ld1F1YW50aXR5IDw9IHN0b2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgbmV3UXVhbnRpdHksIGtlZXBTYW1lQ29tbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IC8vIEZ1bmNpw7NuIGRlIGZsZWNoYSBwYXJhIHByZXNlcnZhciBlbCBjb250ZXh0b1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmV3UXVhbnRpdHkgPiAwICYmIG5ld1F1YW50aXR5IDw9IHN0b2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgbmV3UXVhbnRpdHksIGtlZXBTYW1lQ29tbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIGNhcnRJdGVtUGx1cyA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbXVsdGlwbGVRdHk6IG51bWJlciA9IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSB8fCAwO1xuICAgICAgICBjb25zdCBzdGVwID0gbXVsdGlwbGVRdHkgfHwgMTtcbiAgICAgICAgY29uc3Qgc3RvY2sgPSBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0/LnN0b2NrO1xuICAgICAgICBjb25zdCBjdXJyZW50OiBudW1iZXIgPSBpdGVtLnF1YW50aXR5O1xuXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdGVwID4gMSAmJiBjdXJyZW50ICUgc3RlcCAhPT0gMFxuICAgICAgICAgICAgPyBNYXRoLmNlaWwoY3VycmVudCAvIHN0ZXApICogc3RlcFxuICAgICAgICAgICAgOiBjdXJyZW50ICsgc3RlcDtcblxuICAgICAgICB0aGlzLmFjdHVhbGl6YXJDYW50aWRhZChpdGVtLCBuZXh0LCBzdG9jaywgJ2NhcnRQbHVzJyk7XG4gICAgfVxuXG4gICAgY2FydEl0ZW1MZXNzID0gKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBtdWx0aXBsZVF0eTogbnVtYmVyID0gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5IHx8IDA7XG4gICAgICAgIGNvbnN0IG1pbmltdW1RdHk6IG51bWJlciA9IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHkgfHwgMDtcbiAgICAgICAgY29uc3Qgc3RlcCA9IG11bHRpcGxlUXR5IHx8IDE7XG4gICAgICAgIGNvbnN0IGZsb29yID0gbWluaW11bVF0eSB8fCBzdGVwO1xuICAgICAgICBjb25zdCBjdXJyZW50OiBudW1iZXIgPSBpdGVtLnF1YW50aXR5O1xuXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdGVwID4gMSAmJiBjdXJyZW50ICUgc3RlcCAhPT0gMFxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKGN1cnJlbnQgLyBzdGVwKSAqIHN0ZXBcbiAgICAgICAgICAgIDogY3VycmVudCAtIHN0ZXA7XG5cbiAgICAgICAgaWYgKG5leHQgPj0gZmxvb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphckNhbnRpZGFkKGl0ZW0sIG5leHQsIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8uc3RvY2ssICdjYXJ0TGVzcycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVkaXJlY3RDaGVja291dCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuaGFzU3VmZmljaWVudENyZWRpdHNGb3JDYXJ0VG90YWwoKSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChgL2NoZWNrb3V0YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIHNlIHB1ZWRlIHJlZGlyaWdpciBhbCBjaGVja291dCBkZWJpZG8gYSB1bmEgdmFsaWRhY2nDs24gZmFsbGlkYS5cIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWRpcmVjdFJlZ2lzdGVyID0gKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChgL2F1dGgvbG9naW5gKVxuXG4gICAgb3Blbk1vZGFsKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMubW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KHRlbXBsYXRlLCB7IGNsYXNzOiAnbW9kYWwteGwnLCBrZXlib2FyZDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcmVkaXJlY3REZXRhaWxQcm9kdWN0KHByb2R1Y3QpIHtcbiAgICAgICAgbGV0IHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzWzBdXG4gICAgICAgIGxldCBwYXRoID0gJy9wcm9kdWN0LydcbiAgICAgICAgcGF0aCArPSB2YXJpYW50LmNvZGVcbiAgICAgICAgcGF0aCArPSB2YXJpYW50Lm9wdGlvbnMubGVuZ3RoID8gXCI/dmFyaWFudD10cnVlXCIgOiBcIlwiXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocGF0aClcbiAgICB9XG5cbiAgICBmb3JtYXREYXRlKGRhdGUpIHtcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShkYXRlKSxcbiAgICAgICAgICAgIG1vbnRoID0gJycgKyAoZC5nZXRNb250aCgpICsgMSksXG4gICAgICAgICAgICBkYXkgPSAnJyArIGQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgeWVhciA9IGQuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICBpZiAobW9udGgubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIG1vbnRoID0gJzAnICsgbW9udGg7XG4gICAgICAgIGlmIChkYXkubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIGRheSA9ICcwJyArIGRheTtcblxuICAgICAgICByZXR1cm4gW3llYXIsIG1vbnRoLCBkYXldLmpvaW4oJy0nKTtcbiAgICB9XG5cbiAgICBhc3luYyBjYXJnYU1vZGFsKGl0ZW0pIHtcblxuICAgICAgICAvLyBPYnRpZW5lIGxhcyBzZWRlcyBkZWwgY2xpZW50ZVxuICAgICAgICBjb25zdCBzZWRlcyA9IGF3YWl0IHRoaXMuY2FydFNlcnZpY2UuZ2V0QWRkcmVzc0Jvb2soKTtcblxuICAgICAgICAvLyBDcmVvIHVuYSBzZXJpZSBkZSB2YXJpYWJsZXMgcXVlIHZveSBhIG5lY2VzaXRhciwgaWQgcGFyYSBjb250cm9sYXIgbGFzIHZ1ZWx0YXMgcXVlIGRhIHkgY3VhbnRhcyBsaW5lYXMgaGF5IHkgYWxsSUQgcGFyYSBhbG1hY2VuYXIgbG9zIElEIGRlIGxvcyBsb3Rlcy5cbiAgICAgICAgdmFyIGlkID0gMTtcbiAgICAgICAgdmFyIHRoaXNfID0gdGhpcztcbiAgICAgICAgdmFyIGFsbElEID0gW107XG5cbiAgICAgICAgLy8gQcOxYWRlIGxvcyBkYXRvcyBhbCBlbmNhYmV6YWRvIGRlbCBNb2RhbFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5jYWJlemFkb01vZGFsJykuaW5uZXJIVE1MID0gJzxhIGNsYXNzPVwidGl0bGUgdGV4dC1kYXJrIHRleHQtZGVjb3JhdGlvbi1ub25lIGg1IGQtYmxvY2sgbS0wIHAtMCBtLTAgcC0wXCI+PHAgY2xhc3M9XCJub21icmUgbWItMFwiIGlkPVwicHJvZHVjdE5hbWVcIj4nICsgaXRlbVsncHJvZHVjdCddWyduYW1lJ10gKyAnPC9wPjxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5IHBzLTIgbXMtMVwiIGlkPVwicHJvZHVjdFJlZlwiPlJlZjonICsgaXRlbVsndmFyaWFudF9pZCddICsgJzwvc21hbGw+PC9hPic7XG5cbiAgICAgICAgLy8gQm9ycmFtb3MgdG9kb3MgbG9zIGRhdG9zIGRlIGxvcyBsb3RlcyBhbnRlcmlvcmVzXG4gICAgICAgIHZhciBib2R5VGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxvdF9ib2R5X3RhYmxlXCIpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XG4gICAgICAgIGJvZHlUYWJsZS5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvLyBSZWNvcnJlIHRvZG9zIGxvcyBhcnRpY3Vsb3MgeSBlbmN1ZW50cmEgc2kgdGllbmVuIGxvdGVzIG8gbm8sIHNpIHRpZW5lIGNyZWEgbGFzIGxpbmVhc1xuICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5nZXRDYXJ0MigpLmZvckVhY2goaSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChpWydpdGVtX2lkJ10gPT0gaXRlbS5pdGVtX2lkICYmIGlbJ2xvdCddICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgYm9keVRhYmxlLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIGlbJ2xvdCddLmZvckVhY2gobG90ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IGJvZHlUYWJsZS5pbnNlcnRSb3coYm9keVRhYmxlLnJvd3MubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwxID0gcm93Lmluc2VydENlbGwoMCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjZWxsMiA9IHJvdy5pbnNlcnRDZWxsKDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbDMgPSByb3cuaW5zZXJ0Q2VsbCgyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGw0ID0gcm93Lmluc2VydENlbGwoMyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjZWxsNSA9IHJvdy5pbnNlcnRDZWxsKDQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbDYgPSByb3cuaW5zZXJ0Q2VsbCg1KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKGxvdFsnZGF0ZV9yZXF1ZXN0J10pKTtcbiAgICAgICAgICAgICAgICAgICAgY2VsbDEuaW5uZXJIVE1MID0gJzxpbnB1dCBpZD1cImlkJyArIGlkICsgJ1wiICBzdHlsZT1cImJvcmRlcjogMDtcIiB2YWx1ZT1cIicgKyBsb3QuaWQgKyAnXCIgZGlzYWJsZWQ+JztcbiAgICAgICAgICAgICAgICAgICAgY2VsbDIuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJxdWFudGl0eScgKyBpZCArICdcIiB2YWx1ZT0gXCInICsgbG90LnF1YW50aXR5ICsgJ1wiY2xhc3M9XCJmb3JtLWNvbnRyb2wgdy01MFwiIG1heD1cIicgKyBsb3QucXVhbnRpdHkgKyAnXCI+JztcbiAgICAgICAgICAgICAgICAgICAgY2VsbDMuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiZGF0ZVwiIHZhbHVlPVwiJyArIHRoaXMuZm9ybWF0RGF0ZShkYXRlKSArICdcIiBpZD1cImRlbGl2ZXJ5RGF0ZScgKyBpZCArICdcIiBjbGFzcz1cImZvcm0tY29udHJvbCB3LTc1XCI+JztcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9wY2lvbmVzID0gXCJcIlxuICAgICAgICAgICAgICAgICAgICBzZWRlcy5mb3JFYWNoKHNlZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZGUuaWQgPT0gbG90LnNoaXBwaW5nX2FkZHJlc3NfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNpb25lcyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBzZWRlLmlkICsgJ1wiIHNlbGVjdGVkPicgKyBzZWRlLmNpdHkgKyAnIC0gJyArIHNlZGUuc3RyZWV0ICsgJzwvb3B0aW9uPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNpb25lcyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBzZWRlLmlkICsgJ1wiPicgKyBzZWRlLmNpdHkgKyAnIC0gJyArIHNlZGUuc3RyZWV0ICsgJzwvb3B0aW9uPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjZWxsNC5pbm5lckhUTUwgPSAnPHNlbGVjdCAgaWQ9XCJzaGlwcGluZ0FkZHJlc3MnICsgaWQgKyAnXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdy03NVwiPicgKyBvcGNpb25lcyArICc8L3NlbGVjdD4nO1xuICAgICAgICAgICAgICAgICAgICBjZWxsNS5pbm5lckhUTUwgPSAnPGlucHV0IHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG5TZWd1aXJcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYnMtdGFyZ2V0PVwiI2NvbGxhcHNlRXhhbXBsZScgKyBpZCArICdcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPVwiY29sbGFwc2VFeGFtcGxlJyArIGlkICsgJ1wiIHZhbHVlPVwiVmVyXCI+PC9pbnB1dD4nO1xuICAgICAgICAgICAgICAgICAgICBjZWxsNi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImNvbC0xIGZsZXgtZ3Jvdy0wIHRleHQtcmlnaHQgYnRuQm9ycmFyIGQtbm9uZSBkLW1kLWJsb2NrIGQtbm9uZSBkLW1kLWJsb2NrXCI+PGJ1dHRvbiB2YWx1ZT1cIicgKyBsb3QuaWQgKyAnXCIgY2xhc3M9XCJidG5cIiBpZD1cImJvdG9uQm9ycmFyXCI+PGltZyBzcmM9XCIuL2Fzc2V0cy9tYXF1ZXRhZG8vaW1nL2ljLWJvcnJhci5zdmdcIiBhbHQ9XCJcIj4gPC9idXR0b24+PC9kaXY+JztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdzIgPSBib2R5VGFibGUuaW5zZXJ0Um93KGJvZHlUYWJsZS5yb3dzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWxhMiA9IHJvdzIuaW5zZXJ0Q2VsbCgwKVxuICAgICAgICAgICAgICAgICAgICBmaWxhMi5jb2xTcGFuID0gNjtcbiAgICAgICAgICAgICAgICAgICAgZmlsYTIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJjb2xsYXBzZVwiIGlkPVwiY29sbGFwc2VFeGFtcGxlJyArIGlkICsgJ1wiPjxpbnB1dCBpZD1cIm5vdGVzJyArIGlkICsgJ1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdmFsdWU9XCInICsgbG90Lm5vdGVzICsgJ1wiIHBsYWNlaG9sZGVyPVwiSW5ncmVzZSB1biBjb21lbnRhcmlvIGVuIGNhc28gZGUgcXVlIHNlYSBuZWNlc2FyaW8uXCIgdHlwZT1cInRleHRcIi8+PC9kaXY+JztcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBpZCArIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgYWxsSUQucHVzaChsb3RbJ2lkJ10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90b25BZ3JlZ2FyJykub25jbGljayA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgLy8gLy8gU2UgY2FsY3VsYSBsYSBjYW50aWRhZCB5IGVsIGNvbnRhZG9yIHBhcmEgcXVlIG5vIGV4Y2VkYSBsYSBjYW50aWRhZCBkZSBsYSBsaW5lYSBhbCBjcmVhciB1biBudWV2byBsb3RlLlxuICAgICAgICAgICAgdmFyIGNhbnRpZGFkQWN0dWFsID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBpZDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmICg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRBY3R1YWwgPSBjYW50aWRhZEFjdHVhbCArIHBhcnNlSW50KCg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlIGHDsWFkZSBsYSBsaW5lYSBzaWVtcHJlIHkgY3VhbmRvIGxhIGNhbnRpZGFkIHJlc3RhbnRlIG5vIHNlYSBjZXJvLlxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkQWN0dWFsIDwgaXRlbVsncXVhbnRpdHknXSkge1xuICAgICAgICAgICAgICAgIHZhciByb3cgPSBib2R5VGFibGUuaW5zZXJ0Um93KGJvZHlUYWJsZS5yb3dzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwxID0gcm93Lmluc2VydENlbGwoMCk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwyID0gcm93Lmluc2VydENlbGwoMSk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwzID0gcm93Lmluc2VydENlbGwoMik7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGw0ID0gcm93Lmluc2VydENlbGwoMyk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGw1ID0gcm93Lmluc2VydENlbGwoNCk7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGw2ID0gcm93Lmluc2VydENlbGwoNSk7XG4gICAgICAgICAgICAgICAgY2VsbDEuaW5uZXJIVE1MID0gJzxpbnB1dCBpZD1cImlkJyArIGlkICsgJ1wiICBzdHlsZT1cImJvcmRlcjogMDtcIiB2YWx1ZT1cIlBlbmR0LlwiIGRpc2FibGVkPic7XG4gICAgICAgICAgICAgICAgY2VsbDIuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJxdWFudGl0eScgKyBpZCArICdcIiB2YWx1ZT0gXCInICsgKGl0ZW1bJ3F1YW50aXR5J10gLSBjYW50aWRhZEFjdHVhbCkgKyAnXCJjbGFzcz1cImZvcm0tY29udHJvbCB3LTUwXCIgbWF4PVwiJyArIChpdGVtWydxdWFudGl0eSddIC0gY2FudGlkYWRBY3R1YWwpICsgJ1wiPic7XG4gICAgICAgICAgICAgICAgY2VsbDMuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiZGF0ZVwiIGlkPVwiZGVsaXZlcnlEYXRlJyArIGlkICsgJ1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIHctNzVcIj4nO1xuICAgICAgICAgICAgICAgIHZhciBvcGNpb25lcyA9IFwiXCJcbiAgICAgICAgICAgICAgICBzZWRlcy5mb3JFYWNoKHNlZGUgPT4geyBvcGNpb25lcyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBzZWRlLmlkICsgJ1wiPicgKyBzZWRlLmNpdHkgKyAnIC0gJyArIHNlZGUuc3RyZWV0ICsgJzwvb3B0aW9uPic7IH0pO1xuICAgICAgICAgICAgICAgIGNlbGw0LmlubmVySFRNTCA9ICc8c2VsZWN0ICBpZD1cInNoaXBwaW5nQWRkcmVzcycgKyBpZCArICdcIiBjbGFzcz1cImZvcm0tY29udHJvbCB3LTc1XCI+JyArIG9wY2lvbmVzICsgJzwvc2VsZWN0Pic7XG4gICAgICAgICAgICAgICAgY2VsbDUuaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuU2VndWlyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJzLXRhcmdldD1cIiNjb2xsYXBzZUV4YW1wbGUnICsgaWQgKyAnXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgYXJpYS1jb250cm9scz1cImNvbGxhcHNlRXhhbXBsZScgKyBpZCArICdcIiB2YWx1ZT1cIlZlclwiPjwvaW5wdXQ+JztcbiAgICAgICAgICAgICAgICBjZWxsNi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImNvbC0xIGZsZXgtZ3Jvdy0wIHRleHQtcmlnaHQgYnRuQm9ycmFyIGQtbm9uZSBkLW1kLWJsb2NrIGQtbm9uZSBkLW1kLWJsb2NrXCI+PGJ1dHRvbiBjbGFzcz1cImJ0blwiIGlkPVwiYm90b25Cb3JyYXJcIj48aW1nIHNyYz1cIi4vYXNzZXRzL21hcXVldGFkby9pbWcvaWMtYm9ycmFyLnN2Z1wiIGFsdD1cIlwiPiA8L2J1dHQ+PC9kaXY+JztcbiAgICAgICAgICAgICAgICB2YXIgcm93MiA9IGJvZHlUYWJsZS5pbnNlcnRSb3coYm9keVRhYmxlLnJvd3MubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB2YXIgZmlsYTIgPSByb3cyLmluc2VydENlbGwoMClcbiAgICAgICAgICAgICAgICBmaWxhMi5jb2xTcGFuID0gNjtcbiAgICAgICAgICAgICAgICBmaWxhMi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImNvbGxhcHNlXCIgaWQ9XCJjb2xsYXBzZUV4YW1wbGUnICsgaWQgKyAnXCI+PGlucHV0IGlkPVwibm90ZXMnICsgaWQgKyAnXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIkluZ3Jlc2UgdW4gY29tZW50YXJpbyBlbiBjYXNvIGRlIHF1ZSBzZWEgbmVjZXNhcmlvLlwiIHR5cGU9XCJ0ZXh0XCIvPjwvZGl2Pic7XG5cblxuICAgICAgICAgICAgICAgIGlkID0gaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzXy50b2FzdHJTZXJ2aWNlLnNob3coJ2xvdC1tYXgtcXVhbnRpdHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEN1YW5kbyBzZSBwdWxzYSBlbCBib3RvbiBwYXJhIGd1YXJkYXIgZWwgbG90ZSByZWNvcnJlIGxhIGZ1bmNpb24geSBlbCBmb3IgLCByZWNvcnJlIGxpbmVhIGEgbGluZWEgeSBsYW56YSBlbCBlbmRwb2ludCBjb24gdW5hIHBhdXNhIHBhcmEgcXVlIG5vIHNlIHBpZXJkYSBuaW5ndW5vIHkgbm8gc2UgcXVlZGUgcGlsbGFkby5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdG9uR3VhcmRhcicpLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzXy50b2FzdHJTZXJ2aWNlLnNob3coJ2xvdC1zYXZpbmcnKTtcbiAgICAgICAgICAgIHRoaXNfLmNhcmdhbmRvID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBsb3RJRCA9ICcnO1xuICAgICAgICAgICAgdmFyIGNhbnRpZGFkTG90ZXMgPSAwO1xuICAgICAgICAgICAgLy9Db250cm9sYSBxdWUgbGFzIGNhbnRpZGFkZXMgZGUgbG9zIGxvdGVzIG5vIHNlYSBzdXBlcmlvciBhIGxhIGRlbCBwcm9kdWN0byBlbiBlbCBjYXJyaXRvLlxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGlkOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVhbnRpdHlcIiArIGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBjYW50aWRhZExvdGVzID0gY2FudGlkYWRMb3RlcyArIHBhcnNlSW50KCg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpdGVtLnF1YW50aXR5ID49IGNhbnRpZGFkTG90ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhjYW50aWRhZExvdGVzKTtcbiAgICAgICAgICAgICAgICB2YXIgeSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGlkOyBpbmRleCsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YW50aXR5XCIgKyBpbmRleCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbnRpdHkgPSBwYXJzZUludCgoPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWFudGl0eVwiICsgaW5kZXgpKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsaXZlcnlEYXRlID0gKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsaXZlcnlEYXRlXCIgKyBpbmRleCkpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoaXBwaW5nQWRkcmVzcyA9ICQoXCIjc2hpcHBpbmdBZGRyZXNzXCIgKyBpbmRleCkudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm90ZXMgPSAkKFwiI25vdGVzXCIgKyBpbmRleCkudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hpcHBpbmdBZGRyZXNzTmFtZSA9ICQoJyNzaGlwcGluZ0FkZHJlc3MnICsgaW5kZXggKyAnIG9wdGlvbjpzZWxlY3RlZCcpLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaWRcIiArIGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvdElEID0gKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaWRcIiArIGluZGV4KSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXlJbmRleCA9IGFsbElELmluZGV4T2YocGFyc2VJbnQobG90SUQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbElELnNwbGljZShteUluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb3RJRCA9PSAnUGVuZHQuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ251ZXZvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBxdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBxdWFudGl0eSwgJ25ldycsIGRlbGl2ZXJ5RGF0ZSwgbm90ZXMsIHBhcnNlSW50KHNoaXBwaW5nQWRkcmVzcyksIHNoaXBwaW5nQWRkcmVzc05hbWUsICduZXdsb3QnKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvdElEICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsb3RJRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgcGFyc2VJbnQobG90SUQpLCBpdGVtLml0ZW1faWQsIHF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIHF1YW50aXR5LCAnZWRpdGVkJywgZGVsaXZlcnlEYXRlLCBub3RlcywgcGFyc2VJbnQoc2hpcHBpbmdBZGRyZXNzKSwgc2hpcHBpbmdBZGRyZXNzTmFtZSwgJ2VkaXRsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB5ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFsbElELmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2coJ2JvcnJhcicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzXy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgZWxlbWVudCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2RlbGV0ZScsIDAsICcnLCAwLCAnZGVsZXRlJywgJ2RlbGV0ZWxvdCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aGlzXy5jYXJ0U2VydmljZS5sb2FkQ2FydEJ5VG9rZW4odGhpc18uY2FydFNlcnZpY2UuZ2V0Q2FydFRva2VuKCkpOyB9LCAzMDAgKiB5KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aGlzXy50b2FzdHJTZXJ2aWNlLnNob3coJ2xvdC1zYXZlZCcpOyB9LCAzMDAgKiB5KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aGlzXy5jYXJnYW5kbyA9IGZhbHNlIH0sIDMwMCAqIHkpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNfLnRvYXN0clNlcnZpY2Uuc2hvdygnTGEgY2FudGlkYWQgZGUgbG9zIGxvdGVzIGVzIHN1cGVyaW9yIGEgbGEgY2FudGlkYWQgZGVsIHByb2R1Y3RvLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcjYm90b25Cb3JyYXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzKTtcbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgndHInKS5yZW1vdmUoKTtcblxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGNsb3NlTW9kYWwoaWQpIHtcbiAgICAgICAgJCgnIycgKyBpZCkubW9kYWwoJ2hpZGUnKTtcbiAgICB9XG5cbiAgICBjaGVja1N0b2NrKGl0ZW0pIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIGl0ZW0ucHJvZHVjdC52YXJpYW50cykge1xuICAgICAgICAgICAgaWYgKGl0ZW0udmFyaWFudF9pZCA9PT0gdmFyaWFudC5jb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnQuc3RvY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnMCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnF1YW50aXR5ID4gdmFyaWFudC5zdG9jaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0b2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhbnQuc3RvY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gU29sbyBzZSBlamVjdXRhIHNpIG5vIHNlIGN1bXBsZSBsYSBjb25kaWNpw7NuXG4gICAgfVxuXG4gICAgdXBkYXRlQWxsU3RvY2soKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIC8vIERlZmluZSBsYSBzdXNjcmlwY2nDs24gYW50ZXMgZGUgdXNhcmxhXG5cbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5jYXJ0SXRlbXMuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICByZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhcmlhbnQgb2YgaXRlbS5wcm9kdWN0LnZhcmlhbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhcmlhbnRfaWQgPT09IHZhcmlhbnQuY29kZSAmJiAhdGhpcy5leGl0VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudC5zdG9jayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZGVsZXRlQ2FydEl0ZW0oaXRlbSwgZmFsc2UpOyAvLyBCb3JyYSBlbCBhcnTDrWN1bG9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5xdWFudGl0eSA+IHZhcmlhbnQuc3RvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IHZhcmlhbnQuc3RvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRDb2RlOiB2YXJpYW50LmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudENvZGU6IHZhcmlhbnQuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgIXRoaXMuZXhpdFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAgLy8gRGVzdXNjcsOtYmV0ZSBhbnRlcyBkZSBhY3R1YWxpemFyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRBbGxUb0NhcnQoaXRlbXMpOyAgLy8gQWN0dWFsaXphIGVsIGNhcnJpdG9cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5leGl0VXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUFsbFN0b2NrKCk7ICAvLyBWdWVsdmUgYSB2ZXJpZmljYXIgZWwgc3RvY2tcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG5cblxuICAgIGdldFZhcmlhbnRzID0gcHJvZHVjdCA9PiB7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSBwcm9kdWN0LnByb2R1Y3RcblxuICAgICAgICBpZiAoaXRlbS52YXJpYW50cyAmJiBpdGVtLnZhcmlhbnRzLmxlbmd0aCAmJiBpdGVtLnZhcmlhbnRzWzBdLm9wdGlvbnMgJiYgaXRlbS52YXJpYW50c1swXS5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBpdGVtLnZhcmlhbnRzWzBdLm9wdGlvbnNcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4gdGhpcy52YXJpYW50c1RvU2hvdy5maW5kKG5hbWUgPT4gb3B0aW9uLmhhc093blByb3BlcnR5KG5hbWUpKSlcbiAgICAgICAgICAgIGxldCBvcHRpb25zTWFwID0gW11cbiAgICAgICAgICAgIG9wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9uKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uQWRkZWQgPSBmYWxzZTsgIC8vIFZhcmlhYmxlIHBhcmEgZXZpdGFyIG3Dumx0aXBsZXMgaW5zZXJjaW9uZXNcblxuICAgICAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZm9yRWFjaChvcHRpb24yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24yLmNvZGUgPT0gJ0NPTE9SJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjIudmFsdWVzLmZvckVhY2goY29sb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IuY29kZSA9PSBvcHRpb25bZW50cnldICYmICFvcHRpb25BZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXNoKHsgbmFtZTogZW50cnksIHZhbHVlOiBvcHRpb25bZW50cnldLCBpbWFnZTogY29sb3IuaW1hZ2UsIG1vYmlsZUltYWdlOiBjb2xvci5tb2JpbGVJbWFnZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkFkZGVkID0gdHJ1ZTsgLy8gTWFyY2FyIG9wY2nDs24gYWdyZWdhZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2kgbm8gc2UgYcOxYWRpw7MgbGEgb3BjacOzbiBkZSBDT0xPUiwgbWFuZWphciBvdHJhcyBvcGNpb25lc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbkFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZm9yRWFjaChvcHRpb24yID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24yLmNvZGUgIT09ICdDT0xPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbltlbnRyeV1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uQWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNNYXA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNNYXA7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGNyZWF0ZURpc2NvdW50TWVzc2FnZShzYWxlcHJpY2U6IG51bWJlciwgcHJpY2U6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmIChpc05hTihzYWxlcHJpY2UpIHx8IGlzTmFOKHByaWNlKSB8fCBzYWxlcHJpY2UgPj0gcHJpY2UgfHwgc2FsZXByaWNlIDw9IDAgfHwgcHJpY2UgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRpc2NvdW50UGVyY2VudGFnZSA9IE1hdGgucm91bmQoKChwcmljZSAtIHNhbGVwcmljZSkgLyBwcmljZSkgKiAxMDApO1xuXG4gICAgICAgIGxldCBkaXNjb3VudE1lc3NhZ2UgPSBgJHtkaXNjb3VudFBlcmNlbnRhZ2V9JSBPRkZgO1xuICAgICAgICByZXR1cm4gZGlzY291bnRNZXNzYWdlO1xuICAgIH1cbiAgICBnZXRNaW5pbXVtUHVyY2hhc2VBbW91bnQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwudHlwZSA9PSAnYjJiJyA/IHRoaXMuY2hhbm5lbC53aG9sZXNhbGVyTWluaW11bVB1cmNoYXNlQW1vdW50IDogdGhpcy5jaGFubmVsLnJldGFpbGVyTWluaW11bVB1cmNoYXNlQW1vdW50XG5cbiAgICB9XG5cbiAgICBleGNlZWRzTWluaW11bUFtb3VudCA9ICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLmdldE1pbmltdW1QdXJjaGFzZUFtb3VudCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWRpcmVjdENoZWNrb3V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBWZXJpZmljYXIgc2kgaGF5IHVuIGJhbGFuY2UgZGUgY2xpZW50ZSBhY3Rpdm9cbiAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYmFsYW5jZUN1c3RvbWVyJC5zdWJzY3JpYmUoYmFsYW5jZUN1c3RvbWVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYmFsYW5jZUN1c3RvbWVyICYmIGJhbGFuY2VDdXN0b21lci5jcmVkaXRBbW91bnQgIT09IG51bGwgJiYgYmFsYW5jZUN1c3RvbWVyLmNyZWRpdEFtb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdxdWFudGl0eS1ub3QtZXhjZWVkZWQtd2hpdG91dC1hbW91bnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncXVhbnRpdHktbm90LWV4Y2VlZGVkJywgeyBhbW91bnQ6IHRoaXMuZ2V0TWluaW11bVB1cmNoYXNlQW1vdW50KCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudW5zdWJzY3JpYmUoKTsgLy8gRGVzdXNjcmliaXJzZSBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpcyBkZSBvYnRlbmVyIGVsIHZhbG9yXG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuXG5cblxuXG5cblxuXG4iXX0=