ng-easycommerce 0.0.691 → 0.1.0

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 (63) hide show
  1. package/README.md +17 -0
  2. package/assets/ec-i18n/ct.json +3 -0
  3. package/assets/ec-i18n/en.json +3 -0
  4. package/assets/ec-i18n/es.json +3 -0
  5. package/assets/ec-i18n/fr.json +3 -0
  6. package/assets/ec-i18n/gl.json +3 -0
  7. package/assets/ec-i18n/pr.json +3 -0
  8. package/bundles/ng-easycommerce.umd.js +1219 -653
  9. package/bundles/ng-easycommerce.umd.js.map +1 -1
  10. package/bundles/ng-easycommerce.umd.min.js +1 -1
  11. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  12. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +103 -5
  13. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +22 -8
  14. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +34 -11
  15. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +18 -7
  16. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +12 -3
  17. package/esm2015/lib/interfaces/cart-item.js +1 -1
  18. package/esm2015/lib/interfaces/cart-totals.js +1 -0
  19. package/esm2015/lib/interfaces/channel.js +1 -0
  20. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  21. package/esm2015/lib/interfaces/product.js +1 -1
  22. package/esm2015/lib/services/account/orders.service.js +18 -3
  23. package/esm2015/lib/services/cart.service.js +138 -23
  24. package/esm2015/lib/services/checkout/checkout.service.js +34 -4
  25. package/esm2015/lib/utils/order-util.service.js +99 -7
  26. package/esm2015/lib/utils/price-presentation.service.js +127 -0
  27. package/esm2015/public-api.js +2 -1
  28. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +111 -5
  29. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +35 -8
  30. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +36 -13
  31. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +18 -7
  32. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +12 -3
  33. package/esm5/lib/interfaces/cart-item.js +1 -1
  34. package/esm5/lib/interfaces/cart-totals.js +1 -0
  35. package/esm5/lib/interfaces/channel.js +1 -0
  36. package/esm5/lib/interfaces/checkout-data.js +1 -1
  37. package/esm5/lib/interfaces/product.js +1 -1
  38. package/esm5/lib/services/account/orders.service.js +18 -3
  39. package/esm5/lib/services/cart.service.js +154 -23
  40. package/esm5/lib/services/checkout/checkout.service.js +30 -4
  41. package/esm5/lib/utils/order-util.service.js +99 -7
  42. package/esm5/lib/utils/price-presentation.service.js +130 -0
  43. package/esm5/public-api.js +2 -1
  44. package/fesm2015/ng-easycommerce.js +1181 -652
  45. package/fesm2015/ng-easycommerce.js.map +1 -1
  46. package/fesm5/ng-easycommerce.js +1219 -654
  47. package/fesm5/ng-easycommerce.js.map +1 -1
  48. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +15 -0
  49. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +8 -1
  50. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +1 -1
  51. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +2 -2
  52. package/lib/interfaces/cart-item.d.ts +27 -2
  53. package/lib/interfaces/cart-totals.d.ts +19 -0
  54. package/lib/interfaces/channel.d.ts +15 -0
  55. package/lib/interfaces/checkout-data.d.ts +2 -1
  56. package/lib/interfaces/product.d.ts +48 -1
  57. package/lib/services/account/orders.service.d.ts +5 -0
  58. package/lib/services/cart.service.d.ts +26 -5
  59. package/lib/utils/order-util.service.d.ts +22 -0
  60. package/lib/utils/price-presentation.service.d.ts +56 -0
  61. package/ng-easycommerce.metadata.json +1 -1
  62. package/package.json +1 -1
  63. package/public-api.d.ts +3 -0
@@ -83,12 +83,13 @@ import { OrderUtilityService } from '../utils/order-util.service';
83
83
  import { ChannelConfigService } from './channel-config.service';
84
84
  import { AnalyticsService } from '../../public-api';
85
85
  import { Router } from '@angular/router';
86
+ import { CartItemPricePresentation, CartSummaryPricePresentation, PricePresentationService } from '../utils/price-presentation.service';
86
87
  import * as i0 from "@angular/core";
87
88
  import * as i1 from "../../public-api";
88
89
  import * as i2 from "../utils/order-util.service";
89
90
  import * as i3 from "@angular/router";
90
91
  var CartService = /** @class */ (function () {
91
- function CartService(connection, toastrService, consts, authService, orderUtils, analyticsService, channelConfigService, router) {
92
+ function CartService(connection, toastrService, consts, authService, orderUtils, analyticsService, channelConfigService, router, pricePresentationService) {
92
93
  var _this = this;
93
94
  this.connection = connection;
94
95
  this.toastrService = toastrService;
@@ -98,6 +99,7 @@ var CartService = /** @class */ (function () {
98
99
  this.analyticsService = analyticsService;
99
100
  this.channelConfigService = channelConfigService;
100
101
  this.router = router;
102
+ this.pricePresentationService = pricePresentationService;
101
103
  this.cartItemsSubject = new BehaviorSubject([]);
102
104
  this.couponSubject = new BehaviorSubject(null);
103
105
  this.cartSubject = new BehaviorSubject(null);
@@ -526,6 +528,10 @@ var CartService = /** @class */ (function () {
526
528
  this.getTotalAmount = function () {
527
529
  return _this.cart.pipe(map(function (cart) { var _a, _b; return (_b = (_a = cart) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.total; }));
528
530
  };
531
+ /** Total para carrito/sidebar, sin envío persistido ni recargos de checkout. */
532
+ this.getCartTotalAmount = function () {
533
+ return _this.cart.pipe(map(function (cart) { return _this.orderUtils.getCartTotalAmount(cart); }));
534
+ };
529
535
  this.getCountCartItems = function () {
530
536
  return _this.cartItems.pipe(map(function (cartItems) { var _a; return (_a = cartItems) === null || _a === void 0 ? void 0 : _a.length; }));
531
537
  };
@@ -533,7 +539,13 @@ var CartService = /** @class */ (function () {
533
539
  return _this.cart.pipe(map(function (cart) { var _a, _b, _c, _d; return ((_b = (_a = cart) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.taxes) > 0 ? (_d = (_c = cart) === null || _c === void 0 ? void 0 : _c.totals) === null || _d === void 0 ? void 0 : _d.taxes : 0; }));
534
540
  };
535
541
  this.getSubTotalAmount = function () {
536
- return _this.cart.pipe(map(function (cart) { var _a, _b; return (_b = (_a = cart) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.subtotal; }));
542
+ return _this.cart.pipe(map(function (cart) { return _this.orderUtils.getSummarySubtotalAmount(cart); }));
543
+ };
544
+ this.getCartTaxesAmount = function () {
545
+ return _this.cart.pipe(map(function (cart) { return _this.orderUtils.getCartTaxesAmount(cart); }));
546
+ };
547
+ this.getCartClientTaxesAmount = function () {
548
+ return _this.cart.pipe(map(function (cart) { return _this.orderUtils.getCartClientTaxesAmount(cart); }));
537
549
  };
538
550
  /**
539
551
  * Devuelve el descuento que debe mostrarse en el resumen de compra.
@@ -546,11 +558,16 @@ var CartService = /** @class */ (function () {
546
558
  * ```
547
559
  *
548
560
  * @remarks
549
- * Si el backend nuevo informa `totals.promotionBreakdown.orderPromotions`, se usa ese valor.
550
- * Si todavía no existe, el método hace fallback a `totals.promotion` para mantener compatibilidad.
561
+ * Si el backend nuevo informa `totals.orderDiscount`, se usa ese valor.
562
+ * En su ausencia, prioriza `totals.promotionBreakdown.orderPromotions` y
563
+ * luego hace fallback a `totals.promotion` para mantener compatibilidad.
551
564
  */
552
565
  this.getSummaryPromotionAmount = function () {
553
- return _this.cart.pipe(map(function (cart) { return _this.orderUtils.getSummaryPromotionAmount(cart); }));
566
+ return _this.cart.pipe(map(function (cart) { return _this.getCartSummaryPricePresentation(cart).orderDiscount; }));
567
+ };
568
+ /** Descuento específico del cupón, si el backend lo informa por separado. */
569
+ this.getCouponPromotionAmount = function () {
570
+ return _this.cart.pipe(map(function (cart) { return _this.getCartSummaryPricePresentation(cart).couponDiscount; }));
554
571
  };
555
572
  /**
556
573
  * Indica si existe un cupón aplicado en el carrito actual.
@@ -579,6 +596,100 @@ var CartService = /** @class */ (function () {
579
596
  * ```
580
597
  */
581
598
  this.getItemPricing = function (item) { var _a; return ((_a = item) === null || _a === void 0 ? void 0 : _a.pricing) || _this.buildCartItemPricing(item); };
599
+ /** Resuelve la presentación nueva de una línea y conserva el fallback legacy. */
600
+ this.getCartItemPricePresentation = function (item, channel) {
601
+ var _a;
602
+ return _this.pricePresentationService.getCartItemPricePresentation(item, channel || _this.channelConfig, ((_a = item) === null || _a === void 0 ? void 0 : _a.linePricing) ? undefined : _this.getItemPricing(item));
603
+ };
604
+ /** Resuelve el resumen visible usando linePricing sin convertir importes fiscales. */
605
+ this.getCartSummaryPricePresentation = function (cart, channel, includeShipping) {
606
+ if (cart === void 0) { cart = _this.cartSubject.value; }
607
+ if (includeShipping === void 0) { includeShipping = false; }
608
+ var _a, _b, _c, _d;
609
+ var responseItems = Array.isArray((_a = cart) === null || _a === void 0 ? void 0 : _a.items) && cart.items.length ? cart.items : null;
610
+ var items = (responseItems || (_this.cartItemsSubject.value || []))
611
+ .map(function (item) { return _this.normalizeCartItemPricing(item); });
612
+ var hasLinePricing = items.length > 0 && items.every(function (item) { var _a; return !!((_a = item) === null || _a === void 0 ? void 0 : _a.linePricing); });
613
+ var showGross = ((_b = (channel || _this.channelConfig)) === null || _b === void 0 ? void 0 : _b.showPriceWithTaxesWhileBrowsing) === true;
614
+ var pricingKey = showGross ? 'gross' : 'net';
615
+ var taxes = _this.orderUtils.getCartTaxesAmount(cart);
616
+ var clientTaxes = _this.orderUtils.getCartClientTaxesAmount(cart);
617
+ var legacyShipping = includeShipping ? _this.orderUtils.getSummaryShipmentAmount(cart) : null;
618
+ var shippingPricing = _this.getTotalsPricing(cart, 'shipping_pricing', 'shippingPricing');
619
+ var shipping = includeShipping
620
+ ? (shippingPricing ? shippingPricing[pricingKey] : legacyShipping)
621
+ : null;
622
+ var total = includeShipping
623
+ ? Number(((_d = (_c = cart) === null || _c === void 0 ? void 0 : _c.totals) === null || _d === void 0 ? void 0 : _d.total) || 0)
624
+ : _this.orderUtils.getCartTotalAmount(cart);
625
+ var orderDiscountPricing = _this.getTotalsPricing(cart, 'order_discount_pricing', 'orderDiscountPricing');
626
+ var couponDiscountPricing = _this.getTotalsPricing(cart, 'coupon_discount_pricing', 'couponDiscountPricing');
627
+ var couponDiscount = couponDiscountPricing
628
+ ? couponDiscountPricing[pricingKey]
629
+ : _this.orderUtils.getCouponPromotionAmount(cart);
630
+ var orderDiscount = orderDiscountPricing
631
+ ? orderDiscountPricing[pricingKey]
632
+ : _this.orderUtils.getOrderPromotionAmount
633
+ ? _this.orderUtils.getOrderPromotionAmount(cart)
634
+ : _this.orderUtils.getSummaryPromotionAmount(cart);
635
+ if (hasLinePricing) {
636
+ return {
637
+ productsBeforeDiscounts: items.reduce(function (total, item) {
638
+ return total + Number(item.linePricing.unit[pricingKey] || 0) * Number(item.quantity || 0);
639
+ }, 0),
640
+ lineDiscounts: items.reduce(function (total, item) {
641
+ return total + Number(item.linePricing.discount[pricingKey] || 0);
642
+ }, 0),
643
+ subtotal: items.reduce(function (total, item) {
644
+ return total + Number(item.linePricing.subtotal[pricingKey] || 0);
645
+ }, 0),
646
+ orderDiscount: orderDiscount,
647
+ couponDiscount: couponDiscount,
648
+ taxes: taxes,
649
+ clientTaxes: clientTaxes,
650
+ shipping: shipping,
651
+ total: total,
652
+ taxesIncludedInTotal: showGross && taxes !== 0,
653
+ source: 'linePricing'
654
+ };
655
+ }
656
+ return {
657
+ productsBeforeDiscounts: 0,
658
+ lineDiscounts: 0,
659
+ subtotal: _this.orderUtils.getSummarySubtotalAmount(cart),
660
+ orderDiscount: orderDiscount,
661
+ couponDiscount: couponDiscount,
662
+ taxes: taxes,
663
+ clientTaxes: clientTaxes,
664
+ shipping: shipping,
665
+ total: total,
666
+ taxesIncludedInTotal: false,
667
+ source: 'legacy'
668
+ };
669
+ };
670
+ /** Normaliza sólo el alias serializado del contrato de línea. */
671
+ this.normalizeCartItemPricing = function (item) {
672
+ var _a, _b;
673
+ return (__assign(__assign({}, item), { linePricing: ((_a = item) === null || _a === void 0 ? void 0 : _a.linePricing) || ((_b = item) === null || _b === void 0 ? void 0 : _b.line_pricing) }));
674
+ };
675
+ /**
676
+ * Lee el contrato nuevo sin confundir un objeto válido con fallback legacy,
677
+ * incluso cuando todos sus importes son cero.
678
+ */
679
+ this.getTotalsPricing = function (cart, snakeCaseKey, camelCaseKey) {
680
+ var _a, _b;
681
+ var totals = ((_a = cart) === null || _a === void 0 ? void 0 : _a.totals) || {};
682
+ var value = (_b = totals[snakeCaseKey], (_b !== null && _b !== void 0 ? _b : totals[camelCaseKey]));
683
+ if (!value || typeof value !== 'object')
684
+ return null;
685
+ if (![value.net, value.tax, value.gross].every(function (amount) { return Number.isFinite(Number(amount)); }))
686
+ return null;
687
+ return {
688
+ net: Number(value.net),
689
+ tax: Number(value.tax),
690
+ gross: Number(value.gross)
691
+ };
692
+ };
582
693
  this.addCoupon = function (code) { return __awaiter(_this, void 0, void 0, function () {
583
694
  var result, e_1;
584
695
  return __generator(this, function (_a) {
@@ -683,6 +794,7 @@ var CartService = /** @class */ (function () {
683
794
  * - mantiene la forma histórica del item consumido por los templates
684
795
  */
685
796
  this.transformItems = function (server_item) { return server_item.map(function (item) {
797
+ var _a, _b;
686
798
  item = {
687
799
  product: item.product,
688
800
  variant_id: item.product.variants[0].code,
@@ -691,7 +803,15 @@ var CartService = /** @class */ (function () {
691
803
  comments: item.comments || '',
692
804
  item_id: item.id,
693
805
  total: item.total,
694
- unitPromotions: Array.isArray(item.unitPromotions) ? item.unitPromotions : []
806
+ unitPrice: (_a = item.unitPrice, (_a !== null && _a !== void 0 ? _a : item.unit_price)),
807
+ discount: item.discount,
808
+ subtotal: item.subtotal,
809
+ taxTotal: (_b = item.taxTotal, (_b !== null && _b !== void 0 ? _b : item.tax_total)),
810
+ unitPromotions: Array.isArray(item.unitPromotions)
811
+ ? item.unitPromotions
812
+ : (Array.isArray(item.unit_promotions) ? item.unit_promotions : []),
813
+ linePricing: item.linePricing || item.line_pricing,
814
+ line_pricing: item.line_pricing
695
815
  };
696
816
  item.pricing = _this.buildCartItemPricing(item);
697
817
  // console.log(item.product.variants[0]);
@@ -712,34 +832,44 @@ var CartService = /** @class */ (function () {
712
832
  * @example
713
833
  * ```ts
714
834
  * const pricing = this.buildCartItemPricing(item);
715
- * // pricing.basePrice => saleprice si existe, si no price
716
- * // pricing.finalPrice => basePrice + unitPromotionTotal
835
+ * // pricing.basePrice => unitPrice del backend nuevo o fallback legacy
836
+ * // pricing.finalPrice => unitPrice del backend nuevo o cálculo legacy
717
837
  * // pricing.effectiveDiscountPercent => % total contra el precio de referencia
718
838
  * ```
719
839
  */
720
840
  this.buildCartItemPricing = function (item) {
721
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
841
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
722
842
  var variant = (_c = (_b = (_a = item) === null || _a === void 0 ? void 0 : _a.product) === null || _b === void 0 ? void 0 : _b.variants) === null || _c === void 0 ? void 0 : _c[0];
723
843
  var cartAndSidebarPrices = (_d = variant) === null || _d === void 0 ? void 0 : _d.cartAndSidebarPrices;
724
844
  // Si el backend nuevo informa `cartAndSidebarPrices`, ese es el precio correcto
725
845
  // para carrito/sidebar porque excluye impuestos de orden que no se listan por ítem.
726
846
  // Si no existe, se mantiene el fallback histórico.
727
- var basePrice = _this.parsePriceValue((_t = (_q = (_m = (_k = (_h = (_f = (_e = cartAndSidebarPrices) === null || _e === void 0 ? void 0 : _e.saleprice, (_f !== null && _f !== void 0 ? _f : (_g = cartAndSidebarPrices) === null || _g === void 0 ? void 0 : _g.price)), (_h !== null && _h !== void 0 ? _h : (_j = variant) === null || _j === void 0 ? void 0 : _j.saleprice)), (_k !== null && _k !== void 0 ? _k : (_l = variant) === null || _l === void 0 ? void 0 : _l.price)), (_m !== null && _m !== void 0 ? _m : (_p = (_o = item) === null || _o === void 0 ? void 0 : _o.product) === null || _p === void 0 ? void 0 : _p.saleprice)), (_q !== null && _q !== void 0 ? _q : (_s = (_r = item) === null || _r === void 0 ? void 0 : _r.product) === null || _s === void 0 ? void 0 : _s.price)), (_t !== null && _t !== void 0 ? _t : 0)));
728
- var strikePriceCandidate = _this.parsePriceValue((_0 = (_x = (_v = (_u = cartAndSidebarPrices) === null || _u === void 0 ? void 0 : _u.price, (_v !== null && _v !== void 0 ? _v : (_w = variant) === null || _w === void 0 ? void 0 : _w.price)), (_x !== null && _x !== void 0 ? _x : (_z = (_y = item) === null || _y === void 0 ? void 0 : _y.product) === null || _z === void 0 ? void 0 : _z.price)), (_0 !== null && _0 !== void 0 ? _0 : 0)));
847
+ var explicitUnitPrice = _this.parsePriceValue((_e = item) === null || _e === void 0 ? void 0 : _e.unitPrice);
848
+ var hasExplicitUnitPrice = Number.isFinite(explicitUnitPrice);
849
+ var basePrice = hasExplicitUnitPrice
850
+ ? explicitUnitPrice
851
+ : _this.parsePriceValue((_u = (_r = (_o = (_l = (_j = (_g = (_f = cartAndSidebarPrices) === null || _f === void 0 ? void 0 : _f.saleprice, (_g !== null && _g !== void 0 ? _g : (_h = cartAndSidebarPrices) === null || _h === void 0 ? void 0 : _h.price)), (_j !== null && _j !== void 0 ? _j : (_k = variant) === null || _k === void 0 ? void 0 : _k.saleprice)), (_l !== null && _l !== void 0 ? _l : (_m = variant) === null || _m === void 0 ? void 0 : _m.price)), (_o !== null && _o !== void 0 ? _o : (_q = (_p = item) === null || _p === void 0 ? void 0 : _p.product) === null || _q === void 0 ? void 0 : _q.saleprice)), (_r !== null && _r !== void 0 ? _r : (_t = (_s = item) === null || _s === void 0 ? void 0 : _s.product) === null || _t === void 0 ? void 0 : _t.price)), (_u !== null && _u !== void 0 ? _u : 0)));
852
+ var strikePriceCandidate = _this.parsePriceValue((_1 = (_y = (_w = (_v = cartAndSidebarPrices) === null || _v === void 0 ? void 0 : _v.price, (_w !== null && _w !== void 0 ? _w : (_x = variant) === null || _x === void 0 ? void 0 : _x.price)), (_y !== null && _y !== void 0 ? _y : (_0 = (_z = item) === null || _z === void 0 ? void 0 : _z.product) === null || _0 === void 0 ? void 0 : _0.price)), (_1 !== null && _1 !== void 0 ? _1 : 0)));
729
853
  var normalizedBasePrice = isNaN(basePrice) ? 0 : basePrice;
730
854
  var normalizedStrikePrice = isNaN(strikePriceCandidate) ? 0 : strikePriceCandidate;
731
- var unitPromotionTotal = Array.isArray((_1 = item) === null || _1 === void 0 ? void 0 : _1.unitPromotions)
855
+ var unitPromotionTotal = Array.isArray((_2 = item) === null || _2 === void 0 ? void 0 : _2.unitPromotions)
732
856
  ? item.unitPromotions.reduce(function (total, promotion) { var _a; return total + Number(((_a = promotion) === null || _a === void 0 ? void 0 : _a.amount) || 0); }, 0)
733
857
  : 0;
734
858
  var hasStrikePrice = normalizedStrikePrice > normalizedBasePrice && normalizedBasePrice > 0;
735
- var hasUnitPromotions = Array.isArray((_2 = item) === null || _2 === void 0 ? void 0 : _2.unitPromotions) && item.unitPromotions.length > 0;
736
- var finalPrice = hasUnitPromotions ? normalizedBasePrice + unitPromotionTotal : normalizedBasePrice;
737
- var productDiscount = Number(((_4 = (_3 = item) === null || _3 === void 0 ? void 0 : _3.product) === null || _4 === void 0 ? void 0 : _4.discount) || 0);
738
- var discountPercent = !isNaN(productDiscount) && productDiscount > 0
739
- ? Math.round(productDiscount)
740
- : hasStrikePrice
741
- ? Math.round(((normalizedStrikePrice - normalizedBasePrice) / normalizedStrikePrice) * 100)
742
- : 0;
859
+ var hasUnitPromotions = Array.isArray((_3 = item) === null || _3 === void 0 ? void 0 : _3.unitPromotions) && item.unitPromotions.length > 0;
860
+ var quantity = Number(((_4 = item) === null || _4 === void 0 ? void 0 : _4.quantity) || 0);
861
+ var finalPrice = hasExplicitUnitPrice
862
+ ? normalizedBasePrice
863
+ : hasUnitPromotions ? normalizedBasePrice + unitPromotionTotal : normalizedBasePrice;
864
+ var productDiscount = _this.parsePriceValue((_5 = item) === null || _5 === void 0 ? void 0 : _5.discount);
865
+ var legacyProductDiscount = Number(((_7 = (_6 = item) === null || _6 === void 0 ? void 0 : _6.product) === null || _7 === void 0 ? void 0 : _7.discount) || 0);
866
+ var discountPercent = Number.isFinite(productDiscount) && productDiscount < 0 && normalizedBasePrice > 0 && quantity > 0
867
+ ? Math.round((Math.abs(productDiscount) / (normalizedBasePrice * quantity)) * 100)
868
+ : !isNaN(legacyProductDiscount) && legacyProductDiscount > 0
869
+ ? Math.round(legacyProductDiscount)
870
+ : hasStrikePrice
871
+ ? Math.round(((normalizedStrikePrice - normalizedBasePrice) / normalizedStrikePrice) * 100)
872
+ : 0;
743
873
  var effectiveReferencePrice = hasStrikePrice ? normalizedStrikePrice : normalizedBasePrice;
744
874
  var effectiveDiscountPercent = effectiveReferencePrice > 0 && finalPrice > 0 && effectiveReferencePrice > finalPrice
745
875
  ? Math.round(((effectiveReferencePrice - finalPrice) / effectiveReferencePrice) * 100)
@@ -914,9 +1044,10 @@ var CartService = /** @class */ (function () {
914
1044
  { type: OrderUtilityService },
915
1045
  { type: AnalyticsService },
916
1046
  { type: ChannelConfigService },
917
- { type: Router }
1047
+ { type: Router },
1048
+ { type: PricePresentationService }
918
1049
  ]; };
919
- CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new i1.CartService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i1.ToastService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i1.AuthService), i0.ɵɵinject(i2.OrderUtilityService), i0.ɵɵinject(i1.AnalyticsService), i0.ɵɵinject(i1.ChannelConfigService), i0.ɵɵinject(i3.Router)); }, token: i1.CartService, providedIn: "root" });
1050
+ CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new i1.CartService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i1.ToastService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i1.AuthService), i0.ɵɵinject(i2.OrderUtilityService), i0.ɵɵinject(i1.AnalyticsService), i0.ɵɵinject(i1.ChannelConfigService), i0.ɵɵinject(i3.Router), i0.ɵɵinject(i1.PricePresentationService)); }, token: i1.CartService, providedIn: "root" });
920
1051
  CartService = __decorate([
921
1052
  Injectable({
922
1053
  providedIn: 'root'
@@ -925,4 +1056,4 @@ var CartService = /** @class */ (function () {
925
1056
  return CartService;
926
1057
  }());
927
1058
  export { CartService };
928
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHMUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7OztBQUt6QztJQWtESSxxQkFBb0IsVUFBNkIsRUFBVSxhQUEyQixFQUFVLE1BQWlCLEVBQ3JHLFdBQXdCLEVBQVUsVUFBK0IsRUFBVSxnQkFBa0MsRUFDN0csb0JBQTBDLEVBQzFDLE1BQWM7UUFIMUIsaUJBVUM7UUFWbUIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFBVSxrQkFBYSxHQUFiLGFB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QztPQUNXLFdBQVcsQ0E4NkJ2QjtzQkFuOEJEO0NBbThCQyxBQTk2QkQsSUE4NkJDO1NBOTZCWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcbmltcG9ydCB7IENhcnRJdGVtLCBDYXJ0SXRlbVByaWNpbmcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NhcnQtaXRlbSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ291cG9uSSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY291cG9uJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVja291dC1kYXRhJztcbmltcG9ydCB7IENhcnRBZmZvcmRhYmxlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0L2NhcnQtYWZmb3JkYWJsZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENhcnRTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGNhcnRJdGVtc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxDYXJ0SXRlbVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICAgIHByaXZhdGUgY291cG9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgIHByaXZhdGUgY2FydFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICBwcml2YXRlIHJlcXVlc3RJblByb2Nlc3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBwcml2YXRlIHByb21vdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXREYXRhW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG5cbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZD86IGJvb2xlYW47XG4gICAgICAgIGFsbG93RXhjZWVkQmFsYW5jZT86IGJvb2xlYW47XG4gICAgICAgIGNyZWRpdEFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICAgIHNob3dNYXg/OiBib29sZWFuO1xuICAgICAgICBzaG93UHJpY2U/OiBib29sZWFuO1xuICAgICAgICByZW1haW5pbmdDcmVkaXRzPzogbnVtYmVyO1xuICAgICAgICBhcHBseU1heE9yZGVycz86IGJvb2xlYW47XG4gICAgICAgIG1heE9yZGVycz86IG51bWJlcjtcbiAgICB9IHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHJpdmF0ZSBpdGVtcyA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb3VudDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGxvY2FsZSA9IFwiXCI7XG4gICAgcHJpdmF0ZSBsb2dnZWRfaW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGhhdmVfdG9fdXBkYXRlID0gdHJ1ZTtcbiAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogYW55ID0ge307XG4gICAgcHJpdmF0ZSBjYXJ0X2Jhc2VVcmwgPSAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMnO1xuXG4gICAgcHVibGljIGNhcnRJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRJdGVtQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zJyArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgYWRkQWxsSXRlbXNBcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvbXVsdGlwbGUtaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyB1cGRhdGVJdGVtUXVhbnRpdHlBcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBkZWxldGVJdGVtQXBpID0gKGl0ZW1faWQpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9pdGVtcy8nICsgaXRlbV9pZCArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgY291cG9uQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2NvdXBvbic7XG4gICAgcHVibGljIGFkZHJlc3NCb29rQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2FkZHJlc3MtYm9vayc7XG4gICAgcHVibGljIHRheGVzQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2NhcnRzL3RheCc7XG5cbiAgICBwdWJsaWMgY2FydF90b2tlbjtcbiAgICBwdWJsaWMgY2FydEl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKGl0ZW1zID0+IHRoaXMuc3dpdGNoUHJpY2VJbkNhcnRJdGVtKGl0ZW1zKSkpXG4gICAgcHVibGljIGNvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY2FydCA9IHRoaXMuY2FydFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb21vdGlvbnMgPSB0aGlzLnByb21vdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkZWxldGluZzogQm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBiYWxhbmNlQ3VzdG9tZXIkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBhbGxvd0FueVBheW1lbnRNZXRob2QkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uYWxsb3dBbnlQYXltZW50TWV0aG9kID8/IG51bGwpKTtcbiAgICBwdWJsaWMgYWxsb3dFeGNlZWRCYWxhbmNlJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmFsbG93RXhjZWVkQmFsYW5jZSA/PyBudWxsKSk7XG4gICAgcHVibGljIGNyZWRpdEFtb3VudCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5jcmVkaXRBbW91bnQgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93TWF4JCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LnNob3dNYXggPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93UHJpY2UkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uc2hvd1ByaWNlID8/IG51bGwpKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29ubmVjdGlvbjogQ29ubmVjdGlvblNlcnZpY2UsIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ1NlcnZpY2U6IENoYW5uZWxDb25maWdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0JykpIHx8IFtdO1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkSW4uc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmdldENhcnQoKSk7XG4gICAgICAgIHRoaXMuY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmNoYW5uZWxDb25maWcgPSByZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYXJ0MigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzQm9vayA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5hZGRyZXNzQm9va0FwaSgpKS5waXBlKG1hcChyZXMgPT4gcmVzPy5sZW5ndGggJiYgcmVzLm1hcChhZGRyZXMgPT4geyByZXR1cm4gYWRkcmVzICYmIHsgLi4uYWRkcmVzLCBzZWxlY3RlZDogYWRkcmVzLmRlZmF1bHQgfSB9KSB8fCBudWxsKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgZ2V0VGF4ZXMgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRheGVzQXBpKCksIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KS5zdWJzY3JpYmUocmVzID0+IHJlcylcblxuICAgIHByaXZhdGUgZ2V0Q2FydCA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuY2FydEl0ZW1zQXBpKCksICgodGhpcy5jYXJ0X3Rva2VuICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IDEpICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeVRva2VuID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwgKCh0aGlzLmNhcnRfdG9rZW4pICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeUN1c3RvbWVyID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKiAgQ0FSVCBDUlVEIFNFUlZFUidTIFNZTkNST05JWkVEXG4gICAgICovXG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVDYXJ0ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHJlc3BvbnNlLnRva2VuVmFsdWU7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0X3Rva2VuJywgdGhpcy5jYXJ0X3Rva2VuKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSByZXNwb25zZS5sb2NhbGU7XG4gICAgICAgIC8qIGxldCBsb2NhbGVGcm9tU3RvcmFnZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdMT0NBTEUnKVxuICAgICAgICBjb25zb2xlLmxvZyhsb2NhbGVGcm9tU3RvcmFnZSlcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVGcm9tU3RvcmFnZSA/IGxvY2FsZUZyb21TdG9yYWdlIDogcmVzcG9uc2UubG9jYWxlO1xuICAgICAgICByZXNwb25zZS5sb2NhbGUgPSB0aGlzLmxvY2FsZSAqL1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXModGhpcy50cmFuc2Zvcm1JdGVtcyhyZXNwb25zZS5pdGVtcykpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYXNpZ25hIGBwcm9kdWN0LnByaWNlYCBhbCBwcmVjaW8gYmFzZSBsZWdhY3kgcXVlIGVzcGVyYSBlbCB0ZW1wbGF0ZSBoaXN0w7NyaWNvIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIMONdGVtcyBub3JtYWxpemFkb3MgZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgTG9zIG1pc21vcyDDrXRlbXMgY29uIGBwcm9kdWN0LnByaWNlYCBhbGluZWFkbyBhbCBwcmVjaW8gYmFzZSBtb3N0cmFkbyBlbiBsYSB0YWJsYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBtw6l0b2RvIG5vIG1vZGlmaWNhIGBwcmljaW5nLmZpbmFsUHJpY2VgLiBTb2xvIHByZXNlcnZhIGNvbXBhdGliaWxpZGFkIGNvbiB0ZW1wbGF0ZXNcbiAgICAgKiB2aWVqb3MgcXVlIHRvZGF2w61hIGxlZW4gYGl0ZW0ucHJvZHVjdC5wcmljZWAgZGlyZWN0YW1lbnRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3dpdGNoUHJpY2VJbkNhcnRJdGVtID0gKGl0ZW1zOiBDYXJ0SXRlbVtdKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoXG4gICAgICAgICAgICBpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5wcm9kdWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByaWNpbmcgPSB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0gaXRlbS5wcm9kdWN0LnZhcmlhbnRzPy5bMF07XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdC5wcmljZSA9IHByaWNpbmc/LmJhc2VQcmljZSB8fCB2YXJpYW50Py5zYWxlcHJpY2UgfHwgdmFyaWFudD8ucHJpY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0ZXBDYXJ0ID0gKHJlcykgPT4ge1xuICAgICAgICByZXMuaXRlbXMubGVuZ3RoID4gMCAmJiByZXMuaXRlbXMuZm9yRWFjaChcbiAgICAgICAgICAgIGl0ZW0gPT4gIXRoaXMuaXNJdGVtSW5Mb2NhbChpdGVtLmlkKSAmJiB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW0sIGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEFsbFRvQ2FydChcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gIXJlcy5pdGVtcy5zb21lKGV4dGVybmFsX2l0ZW0gPT4gZXh0ZXJuYWxfaXRlbS5pZCA9PSBpdGVtLml0ZW1faWQpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRJdGVtcyA9IChpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsQ2FydCgpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2luY3Jvbml6YSBgY2FydEl0ZW1zU3ViamVjdGAgY29uIGxhIMO6bHRpbWEgcmVzcHVlc3RhIGRlbCBiYWNrZW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhcnQgUmVzcHVlc3RhIGRlIGNhcnJpdG8gcmVjaWJpZGEgZGVzZGUgY3VhbHF1aWVyIGVuZHBvaW50IHF1ZSBkZXZ1ZWx2YSBgaXRlbXNgLlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTZSByZXV0aWxpemEgZGVzcHXDqXMgZGUgYWN0dWFsaXphciBjYW50aWRhZGVzLCBhcGxpY2FyIGN1cMOzbiBvIHJlbW92ZXIgcHJvZHVjdG9zIHBhcmEgZXZpdGFyXG4gICAgICogcXVlIGxhIHRhYmxhIHF1ZWRlIGNvbiBzdWJ0b3RhbGVzIG8gcHJvbW9jaW9uZXMgZGVzYWN0dWFsaXphZGFzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZSA9IChjYXJ0KSA9PiB7XG4gICAgICAgIGlmICghY2FydD8uaXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbXMgPSB0aGlzLml0ZW1zIHx8IFtdO1xuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSB0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnQuaXRlbXMpLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW06IGFueSA9IHByZXZpb3VzSXRlbXMuZmluZChwcmV2ID0+IHByZXYuaXRlbV9pZCA9PSBpdGVtLml0ZW1faWQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2aW91c0l0ZW0sXG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBmYWlsZWQ6IHByZXZpb3VzSXRlbT8uZmFpbGVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBwcmV2aW91c0l0ZW0/LmVycm9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyhuZXh0SXRlbXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydEl0ZW1RdWFudGl0eSA9ICh2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHM/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb21tZW50cyA9IGNvbW1lbnRzICE9PSB1bmRlZmluZWQgPyAoY29tbWVudHMgPz8gJycpLnRyaW0oKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IHRoaXMuaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIGlmIChpdC52YXJpYW50X2lkICE9PSB2YXJpYW50X2lkKSByZXR1cm4gaXQ7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkOiBhbnkgPSB7IC4uLml0LCBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRDb21tZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZC5jb21tZW50cyA9IG5vcm1hbGl6ZWRDb21tZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1zID0gbmV3SXRlbXM7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlTG9jYWxDYXJ0KCk7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kVG9DYXJ0ID0gKGNhcnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UoY2FydCk7XG4gICAgICAgIC8vICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LWFkZGVkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVDYXJ0SXRlbSA9IChjYXJ0LCBwcm9kdWN0LCB0b2FzdCA9IHRydWUpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICB0b2FzdCAmJiB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRvYXN0ICYmIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXJlbW92ZWQnKTtcbiAgICAgICAgLy8gdGhpcy5nb29nbGVBbmFseXRpY3MucmVtb3ZlRnJvbUNhcnQocHJvZHVjdCk7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3JlbW92ZV9mcm9tX2NhcnQnLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0cy5jdXJyZW5jeS5jb2RlIH0pXG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZElmQWxscmVhZHlFeGlzdHMgPSAocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHlBZGQgPSAxLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+XG4gICAgICAgIHRoaXMuaXRlbXMuZmluZCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLnByb2R1Y3QuaWQgPT0gcHJvZHVjdC5pZCAmJiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5KGl0ZW0sIHRoaXMuZmluZEl0ZW0ocHJvZHVjdC5pZCkucXVhbnRpdHkgKyBxdWFudGl0eUFkZCwgY29tbWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIHByaXZhdGUgdXBkYXRlTG9jYWxDYXJ0ID0gKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuaXRlbXMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0Q2FydCA9IChuZXh0PykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhudWxsKTtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnQnLCBcIltdXCIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICBuZXh0ICYmIG5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRPYmogPSAoY2FydCwgZW1pdEV2ZW50ID0gdHJ1ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCk7XG4gICAgICAgIHRoaXMudXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMoY2FydD8uYmFsYW5jZUN1c3RvbWVyLCBjYXJ0Py50b3RhbHM/LnRvdGFsKTtcbiAgICAgICAgZW1pdEV2ZW50ICYmIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ2FkZF90b19jYXJ0JywgY2FydCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dCh0aGlzLm9yZGVyVXRpbHMuZ2V0UHJvbW90aW9ucyhjYXJ0LCB0cnVlKSk7XG5cbiAgICAgICAgY2FydC5jb3Vwb25Db2RlXG4gICAgICAgICAgICA/IHRoaXMuZm9ybWF0Q291cG9uKGNhcnQpXG4gICAgICAgICAgICA6IHRoaXMuY291cG9uU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSXRlbUluTG9jYWwgPSAoaXRlbV9pZCkgPT4gdGhpcy5pdGVtcy5zb21lKGl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGl0ZW1faWQpO1xuXG4gICAgLyoqXG4gICAgICogIEBwdWJsaWNcbiAgICAgKiAgQ0FSVCBDUlVEXG4gICAgICovXG5cbiAgICBhZGRUb0NhcnQgPSAocHJvZHVjdDogUHJvZHVjdCwgcXVhbnRpdHk6IG51bWJlciwgdmFyaWFudF9pZCwgY29tbWVudHM/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdEluUHJvY2Vzcy5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcbiAgICAgICAgY29uc3QgYXBwbHlNYXhPcmRlcnMgPSBiYWxhbmNlPy5hcHBseU1heE9yZGVycyA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgbWF4T3JkZXJzID0gYmFsYW5jZT8ubWF4T3JkZXJzID8/IEluZmluaXR5O1xuXG4gICAgICAgIGlmIChhcHBseU1heE9yZGVycyAmJiAobWF4T3JkZXJzIDw9IDAgfHwgbWF4T3JkZXJzID09PSBudWxsKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heC1vcmRlcnMtcmVhY2hlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBxdWFudGl0eSxcbiAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogdmFyaWFudF9pZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50cykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY29tbWVudHMgPSBjb21tZW50cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmVqYXIgbGEgcmVzcHVlc3RhIEhUVFAgZXhpdG9zYSAoY8OzZGlnbyAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRvQ2FydChyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmVqYXIgZWwgZXJyb3IgZGUgbGEgbGxhbWFkYSBIVFRQIChjw7NkaWdvIDUwMCB1IG90cm8gZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ8OzZGlnbyBkZSBlcnJvciA1MDAgKHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdIYSBvY3VycmlkbyB1biBlcnJvciBhbCBhZ3JlZ2FyIGFsIGNhcnJpdG8uIFZ1ZWx2YSBhIGludGVudGFybG8uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90cm8gY8OzZGlnbyBkZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnRXJyb3IgaW5lc3BlcmFkby4gVnVlbHZhIGEgaW50ZW50YXJsbycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG5cbiAgICB9XG5cbiAgICBhZGRUb0xvdCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBpZD8sIG9yZGVyX2l0ZW1faWQ/LCBsb3RfcXVhbnRpdHk/LCB1bml0X3ByaWNlPywgdW5pdF90b3RhbD8sIGFqdXN0ZW1lbnRfdG90YWw/LCB0b3RhbF9sb3Q/LCBsb3Rfc3RhdHVzPywgZGF0ZV9yZXF1ZXN0Pywgbm90ZXM/LCBzaGlwcGluZ19hZGRyZXNzX2lkPywgc2hpcHBpbmdfYWRkcmVzc19uYW1lPywgYWN0aW9uPykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFkZGVkID0gJyc7XG4gICAgICAgICFhZGRlZCAmJiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCwgaWQ6IGlkIHx8ICcnLCBvcmRlcl9pdGVtX2lkOiBvcmRlcl9pdGVtX2lkIHx8ICcnLCBsb3RfcXVhbnRpdHk6IGxvdF9xdWFudGl0eSB8fCAnJywgdW5pdF9wcmljZTogdW5pdF9wcmljZSB8fCAnJywgdW5pdF90b3RhbDogdW5pdF90b3RhbCB8fCAnJywgYWp1c3RlbWVudF90b3RhbDogYWp1c3RlbWVudF90b3RhbCB8fCAnJywgdG90YWxfbG90OiB0b3RhbF9sb3QgfHwgJycsIGxvdF9zdGF0dXM6IGxvdF9zdGF0dXMgfHwgJycsIGRhdGVfcmVxdWVzdDogZGF0ZV9yZXF1ZXN0IHx8ICcnLCBub3Rlczogbm90ZXMgfHwgJycsIHNoaXBwaW5nX2FkZHJlc3NfaWQ6IHNoaXBwaW5nX2FkZHJlc3NfaWQgfHwgJycsIHNoaXBwaW5nX2FkZHJlc3NfbmFtZTogc2hpcHBpbmdfYWRkcmVzc19uYW1lIHx8ICcnLCBhY3Rpb246IGFjdGlvbiB8fCAnbmV3bG90JyB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICByZXMgPT4gdGhpcy5hcHBlbmRUb0NhcnQocmVzKSxcbiAgICAgICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIGFkZFRvQ2FydFByb21pc2UgPSBhc3luYyAocHJvZHVjdDogUHJvZHVjdCwgcXVhbnRpdHk6IG51bWJlciwgdmFyaWFudF9pZCwgY29tbWVudHM/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgbGV0IGFkZGVkID0gdGhpcy5hZGRJZkFsbHJlYWR5RXhpc3RzKHByb2R1Y3QsIHZhcmlhbnRfaWQsIHF1YW50aXR5LCBjb21tZW50cyk7XG4gICAgICAgIGlmICghYWRkZWQpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCAodGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHsgcHJvZHVjdENvZGU6IHByb2R1Y3QuaWQsIHF1YW50aXR5OiBxdWFudGl0eSwgdmFyaWFudENvZGU6IHZhcmlhbnRfaWQgfSkudG9Qcm9taXNlKCkpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0LmVycm9yKSB0aGlzLmhhbmRsZUVycm9yKHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRvQ2FydChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUgfVxuICAgIH1cblxuXG4gICAgYWRkQWxsVG9DYXJ0ID0gKGl0ZW1zOiBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBpdGVtczogdGhpcy5tZXJnZUl0ZW1zQWRkQWxsVG9DYXJ0KGl0ZW1zKSB9O1xuXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkQWxsSXRlbXNBcGkoKSwgcGFyYW1zKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpLnRoZW4oXG4gICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcy5jYXJ0KSAmJiB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKHJlcy5jYXJ0Lml0ZW1zKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jYXJ0X3Jlc3BvbnNlLnN0YXR1cyA9PSAnc3VjY2VzcycgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3RzLWFkZGVkJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFJlcGVhdE9yZGVyVG9DYXJ0KGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdjYXJ0LW5vdC1lbXB0eScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zVG9BZGQgPSBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCxcbiAgICAgICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgICAgICAgdmFyaWFudENvZGU6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5jb2RlXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoaXRlbXNUb0FkZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCduby1wcm9kdWN0cy10by1hZGQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtc1RvQWRkXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRBbGxJdGVtc0FwaSgpLCBwYXJhbXMpXG4gICAgICAgICAgICAudG9Qcm9taXNlKClcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSByZXMuZXJyb3I/LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnXycpIHx8ICd1bmtub3duX2Vycm9yJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zUmVzcG9uc2UgPSByZXM/Lml0ZW1zX3Jlc3BvbnNlIHx8IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcnRJdGVtcyA9IHJlcz8uY2FydD8uaXRlbXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRPZlN0b2NrSXRlbXMgPSBpdGVtc1Jlc3BvbnNlLmZpbHRlcihpdGVtID0+XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc3RhdHVzID09PSAnZmFpbHVyZScgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5lcnJvcnMuc29tZShlcnJvciA9PiBlcnJvci5jb2RlID09PSAnb3V0X29mX3N0b2NrJylcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhcnRJdGVtcy5sZW5ndGggPT09IDAgJiYgb3V0T2ZTdG9ja0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2FsbC1wcm9kdWN0cy1vdXQtb2Ytc3RvY2snKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnc29tZS1wcm9kdWN0cy1vdXQtb2Ytc3RvY2snKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcy5jYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXModGhpcy50cmFuc2Zvcm1JdGVtcyhjYXJ0SXRlbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3RzLWFkZGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1lcmdlSXRlbXNBZGRBbGxUb0NhcnQgPSAoaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGxldCBwYXJhbXNNZXJnZSA9IFtdXG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtSW50ZXJubyA9IGl0ZW1zLmZpbmQoaXRlbVBhcmFtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpXG4gICAgICAgICAgICBwYXJhbXNNZXJnZS5wdXNoKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudENvZGU6IGl0ZW0udmFyaWFudF9pZCxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW1JbnRlcm5vICYmIGl0ZW1JbnRlcm5vLnF1YW50aXR5IHx8IGl0ZW0ucXVhbnRpdHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG5cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbVBhcmFtID0+ICF0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtUGFyYW0udmFyaWFudENvZGUgPT0gaXRlbS52YXJpYW50X2lkKSlcblxuICAgICAgICByZXR1cm4gWy4uLml0ZW1zLCAuLi5wYXJhbXNNZXJnZV1cbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtUXVhbnRpdHkgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5LCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVRdWFudGl0eShpdGVtLCBxdWFudGl0eSkgJiYgKHRoaXMudmFsaWRhdGVQcmljZUFuZENyZWRpdHMoaXRlbSwgcXVhbnRpdHkpKSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHsgcXVhbnRpdHk6IE51bWJlcihxdWFudGl0eSkgfTtcbiAgICAgICAgICAgIGlmIChjb21tZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZCA9IChjb21tZW50cyA/PyAnJykudHJpbSgpO1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY29tbWVudHMgPSBjbGVhbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAucHV0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1RdWFudGl0eUFwaSh0aGlzLmZpbmRJdGVtQnlJZFZhcmlhbnQoaXRlbS52YXJpYW50X2lkKSksXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC11cGRhdGVkJywgeyBxdWFudGl0eSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgdmFsaWRhdGVRdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHkpID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgPiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWF4aW11bUl0ZW1zUXVhbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtYXhpbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1heGltdW1JdGVtc1F1YW50aXR5IH0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSA8IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5taW5pbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21pbmltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWluaW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSAmJiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSA+IDApIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpICUgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1iZS1tdWx0aXBsZScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQcmljZUFuZENyZWRpdHMgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcblxuICAgICAgICBpZiAoIWJhbGFuY2UgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IG51bGwgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bml0UHJpY2UgPSBpdGVtLnRvdGFsIC8gaXRlbS5xdWFudGl0eTtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFF1YW50aXR5ID0gcXVhbnRpdHkgLSBpdGVtLnF1YW50aXR5O1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsUXVhbnRpdHkgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsQ29zdCA9IHVuaXRQcmljZSAqIGFkZGl0aW9uYWxRdWFudGl0eTtcblxuICAgICAgICBpZiAoYWRkaXRpb25hbENvc3QgPiBiYWxhbmNlLnJlbWFpbmluZ0NyZWRpdHMpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdub3QtZW5vdWdoLWNyZWRpdHMnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwdWJsaWMgaGFzU3VmZmljaWVudENyZWRpdHNGb3JDYXJ0VG90YWwgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QudmFsdWU7XG5cbiAgICAgICAgaWYgKCFiYWxhbmNlIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSBudWxsIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmNhcnRTdWJqZWN0LnZhbHVlPy50b3RhbHM/LnRvdGFsIHx8IDA7XG5cbiAgICAgICAgLy8gU2kgTk8gcHVlZGUgZXhjZWRlciBzYWxkbyB5IGVsIHRvdGFsIHN1cGVyYSBlbCBjcmVkaXRvLCBibG9xdWVhclxuICAgICAgICBpZiAoIWJhbGFuY2UuYWxsb3dFeGNlZWRCYWxhbmNlICYmIHRvdGFsID4gYmFsYW5jZS5jcmVkaXRBbW91bnQpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdub3QtZW5vdWdoLWNyZWRpdHMnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBjYWxjdWxhdGVTdG9ja0NvdW50cyA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC5zdG9jayA8IGl0ZW0ucXVhbnRpdHkgKyBxdWFudGl0eSkge1xuICAgICAgICAgICAgLy8gdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBkZWxldGVDYXJ0SXRlbSA9IChpdGVtLCB0b2FzdCA9IHRydWUpID0+IHtcbiAgICAgICAgbGV0IGlkX2J1c2NhZG8gPSB0aGlzLmZpbmRJdGVtQnlJZFZhcmlhbnQoaXRlbS52YXJpYW50X2lkKVxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgLy8gICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHsgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCwgcXVhbnRpdHk6IDAsIHZhcmlhbnRDb2RlOiBpdGVtLnZhcmlhbnRfaWQsIGlkOiAnJywgb3JkZXJfaXRlbV9pZDogaXRlbS5pdGVtX2lkLCBsb3RfcXVhbnRpdHk6ICcnLCB1bml0X3ByaWNlOiAnJywgdW5pdF90b3RhbDogJycsIGFqdXN0ZW1lbnRfdG90YWw6ICcnLCB0b3RhbF9sb3Q6ICcnLCBsb3Rfc3RhdHVzOiAnJywgZGF0ZV9yZXF1ZXN0OiAnJywgbm90ZXM6ICAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogJycsIHNoaXBwaW5nX2FkZHJlc3NfbmFtZTogJycsIGFjdGlvbjogICdkZWxldGVvcmRlcml0ZW0nfSlcbiAgICAgICAgLy8gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIC8vICAgICAgICAgICAgcmVzID0+IHRoaXMucmVtb3ZlQ2FydEl0ZW0ocmVzLCBpdGVtLCB0b2FzdCksXG4gICAgICAgIC8vICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxuICAgICAgICAvLyAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRlbGV0ZSh0aGlzLmRlbGV0ZUl0ZW1BcGkoaWRfYnVzY2FkbykpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlcyA9PiB7IHRoaXMucmVtb3ZlQ2FydEl0ZW0ocmVzLCBpdGVtLCB0b2FzdCk7IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTsgfSxcbiAgICAgICAgICAgIGVyciA9PiB7IHRoaXMuaGFuZGxlRXJyb3IoZXJyKTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICApXG4gICAgfVxuXG4gICAgY2xlYXJDYXJ0KCkge1xuICAgICAgICAvL3NvbHVjaW9uIHByb3Zpc2FvcmlhXG4gICAgICAgIGxldCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXVxuICAgICAgICB3aGlsZSAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDYXJ0SXRlbShpdGVtcy5wb3AoKSwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgLy90aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnQpO1xuICAgIH1cblxuICAgIGNsZWFyQW5kUmVzZXRDYXJ0KCkge1xuICAgICAgICB0aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnQpO1xuICAgIH1cblxuICAgIGNsZWFyQW5kUmVzZXRDdXN0b21lckNhcnQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ2xlYXJpbmcgYW5kIHJlc2V0aW5nLi4uXCIpXG4gICAgICAgIHRoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydEJ5Q3VzdG9tZXIpXG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3IgPSAoZXJyb3I6IHsgZXJyb3I6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIGdldENvdW50RnJvbUl0ZW1JbkNhcnQgPSAoY29kZVZhcmlhbnQpOiBudW1iZXIgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS52YXJpYW50X2lkID09IGNvZGVWYXJpYW50KT8ucXVhbnRpdHkgfHwgMDtcblxuICAgIGZpbmRJdGVtQnlJZFZhcmlhbnQgPSAodmFyaWFudF9pZCkgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS52YXJpYW50X2lkID09IHZhcmlhbnRfaWQpLml0ZW1faWRcblxuICAgIGZpbmRJdGVtID0gKHByb2R1Y3RfaWQpID0+IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW0ucHJvZHVjdC5pZCA9PSBwcm9kdWN0X2lkKTtcblxuICAgIC8qKiBEQVRBIEZPUiBPVEhFUiBTRVJWSUNFUyAqL1xuICAgIGdldENhcnRUb2tlbiA9ICgpID0+IHRoaXMuY2FydF90b2tlbjtcblxuICAgIGdldExvY2FsZSA9ICgpID0+IHRoaXMubG9jYWxlO1xuXG4gICAgZ2V0VG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50b3RhbCkpO1xuXG4gICAgZ2V0Q291bnRDYXJ0SXRlbXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChjYXJ0SXRlbXMpID0+IGNhcnRJdGVtcz8ubGVuZ3RoKSk7XG5cbiAgICBnZXRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8udGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRTdWJUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnN1YnRvdGFsKSk7XG5cbiAgICAvKipcbiAgICAgKiBEZXZ1ZWx2ZSBlbCBkZXNjdWVudG8gcXVlIGRlYmUgbW9zdHJhcnNlIGVuIGVsIHJlc3VtZW4gZGUgY29tcHJhLlxuICAgICAqXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gZWwgbW9udG8gZGUgcHJvbW9jaW9uZXMgZGUgb3JkZW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogdGhpcy5zdW1tYXJ5UHJvbW90aW9uQW1vdW50JCA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYHRvdGFscy5wcm9tb3Rpb25CcmVha2Rvd24ub3JkZXJQcm9tb3Rpb25zYCwgc2UgdXNhIGVzZSB2YWxvci5cbiAgICAgKiBTaSB0b2RhdsOtYSBubyBleGlzdGUsIGVsIG3DqXRvZG8gaGFjZSBmYWxsYmFjayBhIGB0b3RhbHMucHJvbW90aW9uYCBwYXJhIG1hbnRlbmVyIGNvbXBhdGliaWxpZGFkLlxuICAgICAqL1xuICAgIGdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQoY2FydCkpKTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYSBzaSBleGlzdGUgdW4gY3Vww7NuIGFwbGljYWRvIGVuIGVsIGNhcnJpdG8gYWN0dWFsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBib29sZWFubyBwYXJhIGNvbnRyb2xhciBsYSB2aXNpYmlsaWRhZCBkZSBgUXVpdGFyIGN1cMOzbmAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE5vIGRlYmUgYXRhcnNlIGEgYGdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQoKWAsIHBvcnF1ZSB1biBjdXDDs24gcHVlZGUgYWZlY3RhclxuICAgICAqIHNvbG8gcHJvbW9jaW9uZXMgdW5pdGFyaWFzIHkgZGVqYXIgZWwgZGVzY3VlbnRvIGRlIG9yZGVuIGVuIGAwYC5cbiAgICAgKi9cbiAgICBoYXNBcHBsaWVkQ291cG9uID0gKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuaGFzQXBwbGllZENvdXBvbihjYXJ0KSkpO1xuXG4gICAgdG9EZWNpbWFsID0gKHRvdGFsKSA9PiAodG90YWwgLSBNYXRoLmZsb29yKHRvdGFsKSA9PSAwKSA/IHRvdGFsIC8gMTAwIDogdG90YWxcblxuICAgIGdldERpc2NvdW50KCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcnRJdGVtcy5waXBlKG1hcCgocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRvdGFsID0gdGhpcy5pdGVtcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIucHJvZHVjdC5zYWxlcHJpY2UgKiBjdXJyLnF1YW50aXR5O1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICBsZXQgc3VidG90YWwgPSB0aGlzLml0ZW1zLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3Vyci5wcm9kdWN0LnByaWNlICogY3Vyci5xdWFudGl0eTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmV0dXJuIHN1YnRvdGFsIC0gdG90YWw7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnRpZW5lIGVsIHByZWNpbyBub3JtYWxpemFkbyBkZSB1biDDrXRlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIMONdGVtIGRlIGNhcnJpdG8gbm9ybWFsaXphZG8uXG4gICAgICogQHJldHVybnMgT2JqZXRvIGBDYXJ0SXRlbVByaWNpbmdgIGxpc3RvIHBhcmEgcmVuZGVyaXphciBwcmVjaW8gYmFzZSwgdGFjaGFkbyB5IGZpbmFsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHByaWNpbmcgPSB0aGlzLmNhcnRTZXJ2aWNlLmdldEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAqIGNvbnN0IHNob3dUb29sdGlwID0gcHJpY2luZy5oYXNVbml0UHJvbW90aW9ucztcbiAgICAgKiBjb25zdCBmaW5hbFByaWNlID0gcHJpY2luZy5maW5hbFByaWNlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldEl0ZW1QcmljaW5nID0gKGl0ZW06IENhcnRJdGVtKTogQ2FydEl0ZW1QcmljaW5nID0+IGl0ZW0/LnByaWNpbmcgfHwgdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcblxuICAgIGFkZENvdXBvbiA9IGFzeW5jIChjb2RlKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucHV0KHRoaXMuY291cG9uQXBpKCksIHsgY291cG9uOiBjb2RlIH0pLnRvUHJvbWlzZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuZXJyb3JzKSByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2ludmFsaWQtY291cG9uJyB9O1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlc3VsdCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIG1lc3NhZ2U6ICdvaycgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdpbnZhbGlkLWNvdXBvbicgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUNvdXBvbiA9IGFzeW5jICgpID0+IHRoaXMuY29ubmVjdGlvbi5kZWxldGUodGhpcy5jb3Vwb25BcGkoKSkucGlwZShtYXAocmVzID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcywgZmFsc2UpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSkpLnRvUHJvbWlzZSgpO1xuXG4gICAgZm9ybWF0Q291cG9uID0gKGNhcnQpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRfY291cG9uID0gdGhpcy5jb3Vwb25TdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgY291cG9uOiBDb3Vwb25JID0geyBjb2RlOiBjYXJ0LmNvdXBvbkNvZGUgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGNhcnQuY2FydERpc2NvdW50cylbMF07XG4gICAgICAgICAgICBjb3Vwb24gPSB7XG4gICAgICAgICAgICAgICAgLi4uY291cG9uLFxuICAgICAgICAgICAgICAgIGFtb3VudDogKGNhcnQuY2FydERpc2NvdW50cyAmJiBjYXJ0LmNhcnREaXNjb3VudHNba2V5XS5hbW91bnQuY3VycmVudCkgfHwgMCxcbiAgICAgICAgICAgICAgICBuYW1lOiAoY2FydC5jYXJ0RGlzY291bnRzICYmIGNhcnQuY2FydERpc2NvdW50c1trZXldLm5hbWUpIHx8ICduby1uYW1lJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIChjb3Vwb24gIT0gY3VycmVudF9jb3Vwb24pICYmIHRoaXMuY291cG9uU3ViamVjdC5uZXh0KGNvdXBvbik7XG4gICAgfVxuXG4gICAgY2hhbmdlSGF2ZVRvVXBkYXRlID0gKHZhbHVlKSA9PiB0aGlzLmhhdmVfdG9fdXBkYXRlID0gdmFsdWU7XG5cbiAgICByZWFkeUZvckNoZWNrb3V0ID0gKHN1Y2Nlc3NDYWxsYmFjaz86IEZ1bmN0aW9uLCBlcnJvckNhbGxiYWNrPzogRnVuY3Rpb24pOiBDYXJ0QWZmb3JkYWJsZSA9PiB7XG4gICAgICAgIGxldCBjYXJ0ID0gdGhpcy5jYXJ0U3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgcmVzdWx0OiBDYXJ0QWZmb3JkYWJsZSA9IHsgb2s6IHRydWUgfTtcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8IHRoaXMuY2hhbm5lbENvbmZpZy5taW5pbXVtUXVhbnRpdHlQdXJjaGFzZUl0ZW1zKSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1pdGVtcycgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FydC50b3RhbHMudG90YWwgPCB0aGlzLmNoYW5uZWxDb25maWcubWluaW11bVB1cmNoYXNlQW1vdW50KSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1hbW91bnQnIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjayB8fCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXN1bHQub2tcbiAgICAgICAgICAgICAgICA/IHN1Y2Nlc3NDYWxsYmFjayAmJiBzdWNjZXNzQ2FsbGJhY2soKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtc09uRXJyb3IgPSAoaXRlbXNXaXRoRXJyb3I6IGFueVtdLCBjb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNXaXRoRXJyb3IpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLml0ZW1zKTtcbiAgICAgICAgbGV0IGl0ZW1zVXBkYXRlZCA9IHRoaXMuaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1XaXRoRXJyb3IgPSBpdGVtc1dpdGhFcnJvci5maW5kKGZhaWxlZEl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGZhaWxlZEl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGl0ZW1XaXRoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaXRlbS5lcnJvciA9IGNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSlcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNVcGRhdGVkKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXMoaXRlbXNVcGRhdGVkKTtcbiAgICB9XG5cbiAgICBsb2FkQ2FydEJ5VG9rZW4gPSBhc3luYyAodG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSB0b2tlblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRDYXJ0QnlUb2tlbigpXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVVRJTFNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybWEgbG9zIMOtdGVtcyBjcnVkb3MgZGVsIGJhY2tlbmQgYWwgY29udHJhdG8gaW50ZXJubyBgQ2FydEl0ZW1gLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZlcl9pdGVtIFJlc3B1ZXN0YSBgaXRlbXNgIGRlbCBlbmRwb2ludCBkZSBjYXJyaXRvLlxuICAgICAqIEByZXR1cm5zIEFycmVnbG8gZGUgw610ZW1zIG5vcm1hbGl6YWRvcywgY2FkYSB1bm8gY29uIGBwcmljaW5nYCBwcmVjb21wdXRhZG8uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVzdGUgZXMgZWwgcHVudG8gZG9uZGUgZWwgY29yZTpcbiAgICAgKiAtIHByZXNlcnZhIGB1bml0UHJvbW90aW9uc2BcbiAgICAgKiAtIGFybWEgYHByaWNpbmdgXG4gICAgICogLSBtYW50aWVuZSBsYSBmb3JtYSBoaXN0w7NyaWNhIGRlbCBpdGVtIGNvbnN1bWlkbyBwb3IgbG9zIHRlbXBsYXRlc1xuICAgICAqL1xuICAgIHRyYW5zZm9ybUl0ZW1zID0gKHNlcnZlcl9pdGVtKSA9PiBzZXJ2ZXJfaXRlbS5tYXAoXG4gICAgICAgIGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0OiBpdGVtLnByb2R1Y3QsXG4gICAgICAgICAgICAgICAgdmFyaWFudF9pZDogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGUsXG4gICAgICAgICAgICAgICAgbG90OiBpdGVtLm9yZGVySXRlbUxvdCxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICBjb21tZW50czogaXRlbS5jb21tZW50cyB8fCAnJyxcbiAgICAgICAgICAgICAgICBpdGVtX2lkOiBpdGVtLmlkLFxuICAgICAgICAgICAgICAgIHRvdGFsOiBpdGVtLnRvdGFsLFxuICAgICAgICAgICAgICAgIHVuaXRQcm9tb3Rpb25zOiBBcnJheS5pc0FycmF5KGl0ZW0udW5pdFByb21vdGlvbnMpID8gaXRlbS51bml0UHJvbW90aW9ucyA6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnByaWNpbmcgPSB0aGlzLmJ1aWxkQ2FydEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UgPiAwID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vICAgICBpdGVtLnByb2R1Y3QucHJpY2UgPSBpdGVtLnRvdGFsIC8gaXRlbS5xdWFudGl0eS8vID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZTtcbiAgICAgICAgICAgIC8vIH0sIDEwMCk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgIClcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnV5ZSBsYSBub3JtYWxpemFjacOzbiBkZSBwcmVjaW9zIHBhcmEgdW4gw610ZW0gZGVsIGNhcnJpdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBub3JtYWxpemFkbyBkZWwgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBFc3RydWN0dXJhIGBDYXJ0SXRlbVByaWNpbmdgIGNvbiBwcmVjaW8gYmFzZSwgdGFjaGFkbywgZmluYWwgeSBmbGFncyBkZSBVSS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiAvLyBwcmljaW5nLmJhc2VQcmljZSA9PiBzYWxlcHJpY2Ugc2kgZXhpc3RlLCBzaSBubyBwcmljZVxuICAgICAqIC8vIHByaWNpbmcuZmluYWxQcmljZSA9PiBiYXNlUHJpY2UgKyB1bml0UHJvbW90aW9uVG90YWxcbiAgICAgKiAvLyBwcmljaW5nLmVmZmVjdGl2ZURpc2NvdW50UGVyY2VudCA9PiAlIHRvdGFsIGNvbnRyYSBlbCBwcmVjaW8gZGUgcmVmZXJlbmNpYVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRDYXJ0SXRlbVByaWNpbmcgPSAoaXRlbTogQ2FydEl0ZW0pOiBDYXJ0SXRlbVByaWNpbmcgPT4ge1xuICAgICAgICBjb25zdCB2YXJpYW50ID0gaXRlbT8ucHJvZHVjdD8udmFyaWFudHM/LlswXTtcbiAgICAgICAgY29uc3QgY2FydEFuZFNpZGViYXJQcmljZXMgPSB2YXJpYW50Py5jYXJ0QW5kU2lkZWJhclByaWNlcztcbiAgICAgICAgLy8gU2kgZWwgYmFja2VuZCBudWV2byBpbmZvcm1hIGBjYXJ0QW5kU2lkZWJhclByaWNlc2AsIGVzZSBlcyBlbCBwcmVjaW8gY29ycmVjdG9cbiAgICAgICAgLy8gcGFyYSBjYXJyaXRvL3NpZGViYXIgcG9ycXVlIGV4Y2x1eWUgaW1wdWVzdG9zIGRlIG9yZGVuIHF1ZSBubyBzZSBsaXN0YW4gcG9yIMOtdGVtLlxuICAgICAgICAvLyBTaSBubyBleGlzdGUsIHNlIG1hbnRpZW5lIGVsIGZhbGxiYWNrIGhpc3TDs3JpY28uXG4gICAgICAgIGNvbnN0IGJhc2VQcmljZSA9IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgY2FydEFuZFNpZGViYXJQcmljZXM/LnNhbGVwcmljZVxuICAgICAgICAgICAgPz8gY2FydEFuZFNpZGViYXJQcmljZXM/LnByaWNlXG4gICAgICAgICAgICA/PyB2YXJpYW50Py5zYWxlcHJpY2VcbiAgICAgICAgICAgID8/IHZhcmlhbnQ/LnByaWNlXG4gICAgICAgICAgICA/PyBpdGVtPy5wcm9kdWN0Py5zYWxlcHJpY2VcbiAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICA/PyAwXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0cmlrZVByaWNlQ2FuZGlkYXRlID0gdGhpcy5wYXJzZVByaWNlVmFsdWUoXG4gICAgICAgICAgICBjYXJ0QW5kU2lkZWJhclByaWNlcz8ucHJpY2VcbiAgICAgICAgICAgID8/IHZhcmlhbnQ/LnByaWNlXG4gICAgICAgICAgICA/PyBpdGVtPy5wcm9kdWN0Py5wcmljZVxuICAgICAgICAgICAgPz8gMFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQmFzZVByaWNlID0gaXNOYU4oYmFzZVByaWNlKSA/IDAgOiBiYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA9IGlzTmFOKHN0cmlrZVByaWNlQ2FuZGlkYXRlKSA/IDAgOiBzdHJpa2VQcmljZUNhbmRpZGF0ZTtcbiAgICAgICAgY29uc3QgdW5pdFByb21vdGlvblRvdGFsID0gQXJyYXkuaXNBcnJheShpdGVtPy51bml0UHJvbW90aW9ucylcbiAgICAgICAgICAgID8gaXRlbS51bml0UHJvbW90aW9ucy5yZWR1Y2UoKHRvdGFsLCBwcm9tb3Rpb24pID0+IHRvdGFsICsgTnVtYmVyKHByb21vdGlvbj8uYW1vdW50IHx8IDApLCAwKVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBoYXNTdHJpa2VQcmljZSA9IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA+IG5vcm1hbGl6ZWRCYXNlUHJpY2UgJiYgbm9ybWFsaXplZEJhc2VQcmljZSA+IDA7XG4gICAgICAgIGNvbnN0IGhhc1VuaXRQcm9tb3Rpb25zID0gQXJyYXkuaXNBcnJheShpdGVtPy51bml0UHJvbW90aW9ucykgJiYgaXRlbS51bml0UHJvbW90aW9ucy5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gaGFzVW5pdFByb21vdGlvbnMgPyBub3JtYWxpemVkQmFzZVByaWNlICsgdW5pdFByb21vdGlvblRvdGFsIDogbm9ybWFsaXplZEJhc2VQcmljZTtcbiAgICAgICAgY29uc3QgcHJvZHVjdERpc2NvdW50ID0gTnVtYmVyKGl0ZW0/LnByb2R1Y3Q/LmRpc2NvdW50IHx8IDApO1xuICAgICAgICBjb25zdCBkaXNjb3VudFBlcmNlbnQgPSAhaXNOYU4ocHJvZHVjdERpc2NvdW50KSAmJiBwcm9kdWN0RGlzY291bnQgPiAwXG4gICAgICAgICAgICA/IE1hdGgucm91bmQocHJvZHVjdERpc2NvdW50KVxuICAgICAgICAgICAgOiBoYXNTdHJpa2VQcmljZVxuICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKG5vcm1hbGl6ZWRTdHJpa2VQcmljZSAtIG5vcm1hbGl6ZWRCYXNlUHJpY2UpIC8gbm9ybWFsaXplZFN0cmlrZVByaWNlKSAqIDEwMClcbiAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID0gaGFzU3RyaWtlUHJpY2UgPyBub3JtYWxpemVkU3RyaWtlUHJpY2UgOiBub3JtYWxpemVkQmFzZVByaWNlO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVEaXNjb3VudFBlcmNlbnQgPSBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA+IDAgJiYgZmluYWxQcmljZSA+IDAgJiYgZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPiBmaW5hbFByaWNlXG4gICAgICAgICAgICA/IE1hdGgucm91bmQoKChlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSAtIGZpbmFsUHJpY2UpIC8gZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UpICogMTAwKVxuICAgICAgICAgICAgOiBkaXNjb3VudFBlcmNlbnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhc2VQcmljZTogbm9ybWFsaXplZEJhc2VQcmljZSxcbiAgICAgICAgICAgIHN0cmlrZVByaWNlOiBoYXNTdHJpa2VQcmljZSA/IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA6IG51bGwsXG4gICAgICAgICAgICBmaW5hbFByaWNlLFxuICAgICAgICAgICAgdW5pdFByb21vdGlvblRvdGFsLFxuICAgICAgICAgICAgaGFzU3RyaWtlUHJpY2UsXG4gICAgICAgICAgICBoYXNVbml0UHJvbW90aW9ucyxcbiAgICAgICAgICAgIGRpc2NvdW50UGVyY2VudCxcbiAgICAgICAgICAgIGVmZmVjdGl2ZURpc2NvdW50UGVyY2VudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6YSB2YWxvcmVzIGRlIHByZWNpbyBwcm92ZW5pZW50ZXMgZGVsIGJhY2tlbmQgYSBgbnVtYmVyYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBWYWxvciBudW3DqXJpY28gbyBzdHJpbmcgY29uIGZvcm1hdG8gbG9jYWwgKGAxMjAuMDAwYCwgYDEyMDAwMGAsIGAxMjAwMDAtMWAsIGV0Yy4pLlxuICAgICAqIEByZXR1cm5zIE7Dum1lcm8gcGFyc2VhZG8gbyBgTmFOYCBzaSBlbCB2YWxvciBubyBlcyB1dGlsaXphYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTZSB1c2EgcGFyYSBzb3BvcnRhciByZXNwdWVzdGFzIGNvbiBzZXBhcmFkb3JlcyBkZSBtaWxlcywgY29tYSBkZWNpbWFsIG8gcmFuZ29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VQcmljZVZhbHVlID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXcgPSB2YWx1ZS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmF3LmluY2x1ZGVzKCctJykgPyByYXcuc3BsaXQoJy0nKVswXS50cmltKCkgOiByYXc7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaXJzdFZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLig/PVxcZHszfShcXER8JCkpL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xuXG4gICAgICAgIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG4gICAgfVxuXG5cbiAgICBnZXRDcmVkaXRBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShcbiAgICAgICAgICAgIG1hcCgoYmFsYW5jZUN1c3RvbWVyKSA9PiBiYWxhbmNlQ3VzdG9tZXI/LmNyZWRpdEFtb3VudCA/PyBudWxsKVxuICAgICAgICApO1xuXG4gICAgZ2V0Q2xpZW50VGF4ZXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LmNsaWVudFRheGVzIDogMCkpO1xuXG4gICAgZ2V0UmVtYWluaW5nQ3JlZGl0cyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnBpcGUobWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8ucmVtYWluaW5nQ3JlZGl0cykpO1xuXG4gICAgcHVibGljIHVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGJhbGFuY2U6IGFueSwgdG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghYmFsYW5jZSkge1xuICAgICAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRvdGFsID8/IDA7XG5cbiAgICAgICAgY29uc3QgYmFsYW5jZURhdGEgPSB7XG4gICAgICAgICAgICBhbGxvd0FueVBheW1lbnRNZXRob2Q6IGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kLFxuICAgICAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlOiBiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSxcbiAgICAgICAgICAgIGNyZWRpdEFtb3VudDogYmFsYW5jZS5jcmVkaXRBbW91bnQsXG4gICAgICAgICAgICBzaG93TWF4OiBiYWxhbmNlLnNob3dNYXgsXG4gICAgICAgICAgICBzaG93UHJpY2U6IGJhbGFuY2Uuc2hvd1ByaWNlLFxuICAgICAgICAgICAgcmVtYWluaW5nQ3JlZGl0czpcbiAgICAgICAgICAgICAgICBiYWxhbmNlLmNyZWRpdEFtb3VudCAhPSBudWxsICYmIHRvdGFsQW1vdW50ICE9IG51bGwgJiYgYmFsYW5jZS5jcmVkaXRBbW91bnQgPj0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgPyBiYWxhbmNlLmNyZWRpdEFtb3VudCAtIHRvdGFsQW1vdW50XG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGFwcGx5TWF4T3JkZXJzOiBiYWxhbmNlLmFwcGx5TWF4T3JkZXJzLFxuICAgICAgICAgICAgbWF4T3JkZXJzOiBiYWxhbmNlLm1heE9yZGVyc1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5uZXh0KGJhbGFuY2VEYXRhKTtcbiAgICB9XG5cbn1cbiJdfQ==
1059
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHMUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7OztBQUt4STtJQWtESSxxQkFBb0IsVUFBNkIsRUFBVSxhQUEyQixFQUFVLE1BQWlCLEVBQ3JHLFdBQXdCLEVBQVUsVUFBK0IsRUFBVSxnQkFBa0MsRUFDN0csb0JBQTBD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QUFDLFlBQVksSUFBSSxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLFdBQVc7Z0JBQ3RGLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLFdBQVc7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFDO1lBQ1gsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO1lBQ3RDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztTQUMvQixDQUFDO1FBRUYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDOztnQkFsZ0MrQixpQkFBaUI7Z0JBQXlCLFlBQVk7Z0JBQWtCLFNBQVM7Z0JBQ3hGLFdBQVc7Z0JBQXNCLG1CQUFtQjtnQkFBNEIsZ0JBQWdCO2dCQUN2RixvQkFBb0I7Z0JBQ2xDLE1BQU07Z0JBQ1ksd0JBQXdCOzs7SUF0RHJELFdBQVc7UUFIdkIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLFdBQVcsQ0FzakN2QjtzQkE5a0NEO0NBOGtDQyxBQXRqQ0QsSUFzakNDO1NBdGpDWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcbmltcG9ydCB7IENhcnRJdGVtLCBDYXJ0SXRlbVByaWNpbmcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NhcnQtaXRlbSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ291cG9uSSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY291cG9uJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVja291dC1kYXRhJztcbmltcG9ydCB7IENhcnRBZmZvcmRhYmxlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0L2NhcnQtYWZmb3JkYWJsZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hhbm5lbCc7XG5pbXBvcnQgeyBDYXJ0VG90YWxQcmljaW5nVmFsdWUsIENhcnRUb3RhbHNQcmljaW5nIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0LXRvdGFscyc7XG5pbXBvcnQgeyBDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uLCBDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uLCBQcmljZVByZXNlbnRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9wcmljZS1wcmVzZW50YXRpb24uc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ2FydFNlcnZpY2Uge1xuICAgIHByaXZhdGUgY2FydEl0ZW1zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PENhcnRJdGVtW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gICAgcHJpdmF0ZSBjb3Vwb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gICAgcHJpdmF0ZSBjYXJ0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgIHByaXZhdGUgcmVxdWVzdEluUHJvY2VzcyA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHByaXZhdGUgcHJvbW90aW9uc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxDaGVja291dERhdGFbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcblxuICAgIHByaXZhdGUgYmFsYW5jZUN1c3RvbWVyU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHtcbiAgICAgICAgYWxsb3dBbnlQYXltZW50TWV0aG9kPzogYm9vbGVhbjtcbiAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlPzogYm9vbGVhbjtcbiAgICAgICAgY3JlZGl0QW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgc2hvd01heD86IGJvb2xlYW47XG4gICAgICAgIHNob3dQcmljZT86IGJvb2xlYW47XG4gICAgICAgIHJlbWFpbmluZ0NyZWRpdHM/OiBudW1iZXI7XG4gICAgICAgIGFwcGx5TWF4T3JkZXJzPzogYm9vbGVhbjtcbiAgICAgICAgbWF4T3JkZXJzPzogbnVtYmVyO1xuICAgIH0gfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgICBwcml2YXRlIGl0ZW1zID0gW107XG5cbiAgICBwcml2YXRlIGNvdW50OiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgbG9jYWxlID0gXCJcIjtcbiAgICBwcml2YXRlIGxvZ2dlZF9pbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgaGF2ZV90b191cGRhdGUgPSB0cnVlO1xuICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBhbnkgPSB7fTtcbiAgICBwcml2YXRlIGNhcnRfYmFzZVVybCA9ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJy9jYXJ0cyc7XG5cbiAgICBwdWJsaWMgY2FydEl0ZW1zQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGFkZEl0ZW1BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRBbGxJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9tdWx0aXBsZS1pdGVtcycgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIHVwZGF0ZUl0ZW1RdWFudGl0eUFwaSA9IChpdGVtX2lkKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMvJyArIGl0ZW1faWQgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGRlbGV0ZUl0ZW1BcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBjb3Vwb25BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvY291cG9uJztcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvYWRkcmVzcy1ib29rJztcbiAgICBwdWJsaWMgdGF4ZXNBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMvdGF4JztcblxuICAgIHB1YmxpYyBjYXJ0X3Rva2VuO1xuICAgIHB1YmxpYyBjYXJ0SXRlbXMgPSB0aGlzLmNhcnRJdGVtc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShtYXAoaXRlbXMgPT4gdGhpcy5zd2l0Y2hQcmljZUluQ2FydEl0ZW0oaXRlbXMpKSlcbiAgICBwdWJsaWMgY291cG9uID0gdGhpcy5jb3Vwb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBjYXJ0ID0gdGhpcy5jYXJ0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcHJvbW90aW9ucyA9IHRoaXMucHJvbW90aW9uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRlbGV0aW5nOiBCb29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGJhbGFuY2VDdXN0b21lciQgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGFsbG93QW55UGF5bWVudE1ldGhvZCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5hbGxvd0FueVBheW1lbnRNZXRob2QgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBhbGxvd0V4Y2VlZEJhbGFuY2UkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uYWxsb3dFeGNlZWRCYWxhbmNlID8/IG51bGwpKTtcbiAgICBwdWJsaWMgY3JlZGl0QW1vdW50JCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmNyZWRpdEFtb3VudCA/PyBudWxsKSk7XG4gICAgcHVibGljIHNob3dNYXgkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uc2hvd01heCA/PyBudWxsKSk7XG4gICAgcHVibGljIHNob3dQcmljZSQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5zaG93UHJpY2UgPz8gbnVsbCkpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSwgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsIHByaXZhdGUgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcml2YXRlIG9yZGVyVXRpbHM6IE9yZGVyVXRpbGl0eVNlcnZpY2UsIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaGFubmVsQ29uZmlnU2VydmljZTogQ2hhbm5lbENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcHJpY2VQcmVzZW50YXRpb25TZXJ2aWNlOiBQcmljZVByZXNlbnRhdGlvblNlcnZpY2UpIHtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnQnKSkgfHwgW107XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5sb2dnZWRJbi5zdWJzY3JpYmUocmVzID0+IHRoaXMuZ2V0Q2FydCgpKTtcbiAgICAgICAgdGhpcy5jaGFubmVsQ29uZmlnU2VydmljZS5jaGFubmVsQ29uZmlnJC5zdWJzY3JpYmUocmVzID0+IHRoaXMuY2hhbm5lbENvbmZpZyA9IHJlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENhcnQyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlO1xuICAgIH1cblxuICAgIGdldEFkZHJlc3NCb29rID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmdldCh0aGlzLmFkZHJlc3NCb29rQXBpKCkpLnBpcGUobWFwKHJlcyA9PiByZXM/Lmxlbmd0aCAmJiByZXMubWFwKGFkZHJlcyA9PiB7IHJldHVybiBhZGRyZXMgJiYgeyAuLi5hZGRyZXMsIHNlbGVjdGVkOiBhZGRyZXMuZGVmYXVsdCB9IH0pIHx8IG51bGwpKS50b1Byb21pc2UoKTtcblxuICAgIHB1YmxpYyBnZXRUYXhlcyA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudGF4ZXNBcGkoKSwgeyB0b2tlbjogdGhpcy5jYXJ0X3Rva2VuIH0pLnN1YnNjcmliZShyZXMgPT4gcmVzKVxuXG4gICAgcHJpdmF0ZSBnZXRDYXJ0ID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwgKCh0aGlzLmNhcnRfdG9rZW4gJiYgdGhpcy5pdGVtcy5sZW5ndGggPj0gMSkgJiYgeyB0b2tlbjogdGhpcy5jYXJ0X3Rva2VuIH0pKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4gdGhpcy5pbml0aWFsaXplQ2FydChyZXMpXG4gICAgICAgIClcblxuICAgIHByaXZhdGUgZ2V0Q2FydEJ5VG9rZW4gPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmNhcnRJdGVtc0FwaSgpLCAoKHRoaXMuY2FydF90b2tlbikgJiYgeyB0b2tlbjogdGhpcy5jYXJ0X3Rva2VuIH0pKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4gdGhpcy5pbml0aWFsaXplQ2FydChyZXMpXG4gICAgICAgIClcblxuICAgIHByaXZhdGUgZ2V0Q2FydEJ5Q3VzdG9tZXIgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmNhcnRJdGVtc0FwaSgpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4gdGhpcy5pbml0aWFsaXplQ2FydChyZXMpXG4gICAgICAgIClcblxuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqICBDQVJUIENSVUQgU0VSVkVSJ1MgU1lOQ1JPTklaRURcbiAgICAgKi9cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUNhcnQgPSAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gcmVzcG9uc2UudG9rZW5WYWx1ZTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRfdG9rZW4nLCB0aGlzLmNhcnRfdG9rZW4pO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHJlc3BvbnNlLmxvY2FsZTtcbiAgICAgICAgLyogbGV0IGxvY2FsZUZyb21TdG9yYWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xPQ0FMRScpXG4gICAgICAgIGNvbnNvbGUubG9nKGxvY2FsZUZyb21TdG9yYWdlKVxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZUZyb21TdG9yYWdlID8gbG9jYWxlRnJvbVN0b3JhZ2UgOiByZXNwb25zZS5sb2NhbGU7XG4gICAgICAgIHJlc3BvbnNlLmxvY2FsZSA9IHRoaXMubG9jYWxlICovXG4gICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXNwb25zZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKHJlc3BvbnNlLml0ZW1zKSk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhc2lnbmEgYHByb2R1Y3QucHJpY2VgIGFsIHByZWNpbyBiYXNlIGxlZ2FjeSBxdWUgZXNwZXJhIGVsIHRlbXBsYXRlIGhpc3TDs3JpY28gZGVsIGNhcnJpdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgw410ZW1zIG5vcm1hbGl6YWRvcyBkZWwgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBMb3MgbWlzbW9zIMOtdGVtcyBjb24gYHByb2R1Y3QucHJpY2VgIGFsaW5lYWRvIGFsIHByZWNpbyBiYXNlIG1vc3RyYWRvIGVuIGxhIHRhYmxhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFc3RlIG3DqXRvZG8gbm8gbW9kaWZpY2EgYHByaWNpbmcuZmluYWxQcmljZWAuIFNvbG8gcHJlc2VydmEgY29tcGF0aWJpbGlkYWQgY29uIHRlbXBsYXRlc1xuICAgICAqIHZpZWpvcyBxdWUgdG9kYXbDrWEgbGVlbiBgaXRlbS5wcm9kdWN0LnByaWNlYCBkaXJlY3RhbWVudGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzd2l0Y2hQcmljZUluQ2FydEl0ZW0gPSAoaXRlbXM6IENhcnRJdGVtW10pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcChcbiAgICAgICAgICAgIGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpY2luZyA9IHRoaXMuZ2V0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBpdGVtLnByb2R1Y3QudmFyaWFudHM/LlswXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0LnByaWNlID0gcHJpY2luZz8uYmFzZVByaWNlIHx8IHZhcmlhbnQ/LnNhbGVwcmljZSB8fCB2YXJpYW50Py5wcmljZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RlcENhcnQgPSAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5pdGVtcy5sZW5ndGggPiAwICYmIHJlcy5pdGVtcy5mb3JFYWNoKFxuICAgICAgICAgICAgaXRlbSA9PiAhdGhpcy5pc0l0ZW1JbkxvY2FsKGl0ZW0uaWQpICYmIHRoaXMuZGVsZXRlQ2FydEl0ZW0oaXRlbSwgZmFsc2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkQWxsVG9DYXJ0KFxuICAgICAgICAgICAgdGhpcy5pdGVtcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgaXRlbSA9PiAhcmVzLml0ZW1zLnNvbWUoZXh0ZXJuYWxfaXRlbSA9PiBleHRlcm5hbF9pdGVtLmlkID09IGl0ZW0uaXRlbV9pZClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydEl0ZW1zID0gKGl0ZW1zKSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgdGhpcy5jb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQodGhpcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlTG9jYWxDYXJ0KCk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaW5jcm9uaXphIGBjYXJ0SXRlbXNTdWJqZWN0YCBjb24gbGEgw7psdGltYSByZXNwdWVzdGEgZGVsIGJhY2tlbmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FydCBSZXNwdWVzdGEgZGUgY2Fycml0byByZWNpYmlkYSBkZXNkZSBjdWFscXVpZXIgZW5kcG9pbnQgcXVlIGRldnVlbHZhIGBpdGVtc2AuXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNlIHJldXRpbGl6YSBkZXNwdcOpcyBkZSBhY3R1YWxpemFyIGNhbnRpZGFkZXMsIGFwbGljYXIgY3Vww7NuIG8gcmVtb3ZlciBwcm9kdWN0b3MgcGFyYSBldml0YXJcbiAgICAgKiBxdWUgbGEgdGFibGEgcXVlZGUgY29uIHN1YnRvdGFsZXMgbyBwcm9tb2Npb25lcyBkZXNhY3R1YWxpemFkYXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlID0gKGNhcnQpID0+IHtcbiAgICAgICAgaWYgKCFjYXJ0Py5pdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtcyA9IHRoaXMuaXRlbXMgfHwgW107XG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IHRoaXMudHJhbnNmb3JtSXRlbXMoY2FydC5pdGVtcykubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbTogYW55ID0gcHJldmlvdXNJdGVtcy5maW5kKHByZXYgPT4gcHJldi5pdGVtX2lkID09IGl0ZW0uaXRlbV9pZCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnByZXZpb3VzSXRlbSxcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIGZhaWxlZDogcHJldmlvdXNJdGVtPy5mYWlsZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHByZXZpb3VzSXRlbT8uZXJyb3JcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQ2FydEl0ZW1zKG5leHRJdGVtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJ0SXRlbVF1YW50aXR5ID0gKHZhcmlhbnRfaWQsIHF1YW50aXR5LCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZENvbW1lbnRzID0gY29tbWVudHMgIT09IHVuZGVmaW5lZCA/IChjb21tZW50cyA/PyAnJykudHJpbSgpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gdGhpcy5pdGVtcy5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgaWYgKGl0LnZhcmlhbnRfaWQgIT09IHZhcmlhbnRfaWQpIHJldHVybiBpdDtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQ6IGFueSA9IHsgLi4uaXQsIHF1YW50aXR5OiBOdW1iZXIocXVhbnRpdHkpIH07XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZENvbW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkLmNvbW1lbnRzID0gbm9ybWFsaXplZENvbW1lbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaXRlbXMgPSBuZXdJdGVtcztcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQodGhpcy5pdGVtcyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVMb2NhbENhcnQoKTtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtdXBkYXRlZCcsIHsgcXVhbnRpdHkgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmRUb0NhcnQgPSAoY2FydCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCk7XG4gICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShjYXJ0KTtcbiAgICAgICAgLy8gICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtYWRkZWQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUNhcnRJdGVtID0gKGNhcnQsIHByb2R1Y3QsIHRvYXN0ID0gdHJ1ZSkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCwgZmFsc2UpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UoY2FydCk7XG4gICAgICAgIHRvYXN0ICYmIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdG9hc3QgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtcmVtb3ZlZCcpO1xuICAgICAgICAvLyB0aGlzLmdvb2dsZUFuYWx5dGljcy5yZW1vdmVGcm9tQ2FydChwcm9kdWN0KTtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgncmVtb3ZlX2Zyb21fY2FydCcsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RzLmN1cnJlbmN5LmNvZGUgfSlcblxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkSWZBbGxyZWFkeUV4aXN0cyA9IChwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eUFkZCA9IDEsIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5maW5kKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC5pZCA9PSBwcm9kdWN0LmlkICYmIGl0ZW0udmFyaWFudF9pZCA9PSB2YXJpYW50X2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgdGhpcy5maW5kSXRlbShwcm9kdWN0LmlkKS5xdWFudGl0eSArIHF1YW50aXR5QWRkLCBjb21tZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVMb2NhbENhcnQgPSAoKSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5pdGVtcykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRDYXJ0ID0gKG5leHQ/KSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5jYXJ0U3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKG51bGwpO1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLmNhcnRJdGVtc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsIFwiW11cIik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjYXJ0X3Rva2VuJyk7XG4gICAgICAgIG5leHQgJiYgbmV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydE9iaiA9IChjYXJ0LCBlbWl0RXZlbnQgPSB0cnVlKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhjYXJ0Py5iYWxhbmNlQ3VzdG9tZXIsIGNhcnQ/LnRvdGFscz8udG90YWwpO1xuICAgICAgICBlbWl0RXZlbnQgJiYgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgnYWRkX3RvX2NhcnQnLCBjYXJ0KTtcbiAgICAgICAgdGhpcy5wcm9tb3Rpb25zU3ViamVjdC5uZXh0KHRoaXMub3JkZXJVdGlscy5nZXRQcm9tb3Rpb25zKGNhcnQsIHRydWUpKTtcblxuICAgICAgICBjYXJ0LmNvdXBvbkNvZGVcbiAgICAgICAgICAgID8gdGhpcy5mb3JtYXRDb3Vwb24oY2FydClcbiAgICAgICAgICAgIDogdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJdGVtSW5Mb2NhbCA9IChpdGVtX2lkKSA9PiB0aGlzLml0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLml0ZW1faWQgPT0gaXRlbV9pZCk7XG5cbiAgICAvKipcbiAgICAgKiAgQHB1YmxpY1xuICAgICAqICBDQVJUIENSVURcbiAgICAgKi9cblxuICAgIGFkZFRvQ2FydCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuICAgICAgICBjb25zdCBhcHBseU1heE9yZGVycyA9IGJhbGFuY2U/LmFwcGx5TWF4T3JkZXJzID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBtYXhPcmRlcnMgPSBiYWxhbmNlPy5tYXhPcmRlcnMgPz8gSW5maW5pdHk7XG5cbiAgICAgICAgaWYgKGFwcGx5TWF4T3JkZXJzICYmIChtYXhPcmRlcnMgPD0gMCB8fCBtYXhPcmRlcnMgPT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4LW9yZGVycy1yZWFjaGVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIGxldCBhZGRlZCA9IHRoaXMuYWRkSWZBbGxyZWFkeUV4aXN0cyhwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHMpO1xuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IHByb2R1Y3QuaWQsXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IHF1YW50aXR5LFxuICAgICAgICAgICAgICAgIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgcGF5bG9hZClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBsYSByZXNwdWVzdGEgSFRUUCBleGl0b3NhIChjw7NkaWdvIDIwMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC1hZGRlZCcpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBlbCBlcnJvciBkZSBsYSBsbGFtYWRhIEhUVFAgKGPDs2RpZ28gNTAwIHUgb3RybyBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDw7NkaWdvIGRlIGVycm9yIDUwMCAodGltZW91dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ0hhIG9jdXJyaWRvIHVuIGVycm9yIGFsIGFncmVnYXIgYWwgY2Fycml0by4gVnVlbHZhIGEgaW50ZW50YXJsby4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RybyBjw7NkaWdvIGRlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdFcnJvciBpbmVzcGVyYWRvLiBWdWVsdmEgYSBpbnRlbnRhcmxvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIGFkZFRvTG90ID0gKHByb2R1Y3Q6IFByb2R1Y3QsIHF1YW50aXR5OiBudW1iZXIsIHZhcmlhbnRfaWQsIGlkPywgb3JkZXJfaXRlbV9pZD8sIGxvdF9xdWFudGl0eT8sIHVuaXRfcHJpY2U/LCB1bml0X3RvdGFsPywgYWp1c3RlbWVudF90b3RhbD8sIHRvdGFsX2xvdD8sIGxvdF9zdGF0dXM/LCBkYXRlX3JlcXVlc3Q/LCBub3Rlcz8sIHNoaXBwaW5nX2FkZHJlc3NfaWQ/LCBzaGlwcGluZ19hZGRyZXNzX25hbWU/LCBhY3Rpb24/KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSAnJztcbiAgICAgICAgIWFkZGVkICYmIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkSXRlbUFwaSgpLCB7IHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLCBxdWFudGl0eTogcXVhbnRpdHksIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLCBpZDogaWQgfHwgJycsIG9yZGVyX2l0ZW1faWQ6IG9yZGVyX2l0ZW1faWQgfHwgJycsIGxvdF9xdWFudGl0eTogbG90X3F1YW50aXR5IHx8ICcnLCB1bml0X3ByaWNlOiB1bml0X3ByaWNlIHx8ICcnLCB1bml0X3RvdGFsOiB1bml0X3RvdGFsIHx8ICcnLCBhanVzdGVtZW50X3RvdGFsOiBhanVzdGVtZW50X3RvdGFsIHx8ICcnLCB0b3RhbF9sb3Q6IHRvdGFsX2xvdCB8fCAnJywgbG90X3N0YXR1czogbG90X3N0YXR1cyB8fCAnJywgZGF0ZV9yZXF1ZXN0OiBkYXRlX3JlcXVlc3QgfHwgJycsIG5vdGVzOiBub3RlcyB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogc2hpcHBpbmdfYWRkcmVzc19pZCB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiBzaGlwcGluZ19hZGRyZXNzX25hbWUgfHwgJycsIGFjdGlvbjogYWN0aW9uIHx8ICduZXdsb3QnIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlcyA9PiB0aGlzLmFwcGVuZFRvQ2FydChyZXMpLFxuICAgICAgICAgICAgICAgIGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycilcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgYWRkVG9DYXJ0UHJvbWlzZSA9IGFzeW5jIChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCB9KS50b1Byb21pc2UoKSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMuaGFuZGxlRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9XG4gICAgfVxuXG5cbiAgICBhZGRBbGxUb0NhcnQgPSAoaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGl0ZW1zOiB0aGlzLm1lcmdlSXRlbXNBZGRBbGxUb0NhcnQoaXRlbXMpIH07XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRBbGxJdGVtc0FwaSgpLCBwYXJhbXMpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCkudGhlbihcbiAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpICYmIHRoaXMudXBkYXRlQ2FydEl0ZW1zKHRoaXMudHJhbnNmb3JtSXRlbXMocmVzLmNhcnQuaXRlbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmNhcnRfcmVzcG9uc2Uuc3RhdHVzID09ICdzdWNjZXNzJyAmJiB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkUmVwZWF0T3JkZXJUb0NhcnQoaXRlbXM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhcnQtbm90LWVtcHR5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXNUb0FkZCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGVcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChpdGVtc1RvQWRkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vLXByb2R1Y3RzLXRvLWFkZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zVG9BZGRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEFsbEl0ZW1zQXBpKCksIHBhcmFtcylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHJlcy5lcnJvcj8udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICdfJykgfHwgJ3Vua25vd25fZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdyhlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNSZXNwb25zZSA9IHJlcz8uaXRlbXNfcmVzcG9uc2UgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgY2FydEl0ZW1zID0gcmVzPy5jYXJ0Py5pdGVtcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dE9mU3RvY2tJdGVtcyA9IGl0ZW1zUmVzcG9uc2UuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPT09ICdmYWlsdXJlJyAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycy5zb21lKGVycm9yID0+IGVycm9yLmNvZGUgPT09ICdvdXRfb2Zfc3RvY2snKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnYWxsLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG91dE9mU3RvY2tJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzb21lLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnRJdGVtcykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyZ2VJdGVtc0FkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgbGV0IHBhcmFtc01lcmdlID0gW11cbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1JbnRlcm5vID0gaXRlbXMuZmluZChpdGVtUGFyYW0gPT4gaXRlbVBhcmFtLnZhcmlhbnRDb2RlID09IGl0ZW0udmFyaWFudF9pZClcbiAgICAgICAgICAgIHBhcmFtc01lcmdlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS52YXJpYW50X2lkLFxuICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbUludGVybm8gJiYgaXRlbUludGVybm8ucXVhbnRpdHkgfHwgaXRlbS5xdWFudGl0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcblxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtUGFyYW0gPT4gIXRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpKVxuXG4gICAgICAgIHJldHVybiBbLi4uaXRlbXMsIC4uLnBhcmFtc01lcmdlXVxuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1RdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZVF1YW50aXR5KGl0ZW0sIHF1YW50aXR5KSAmJiAodGhpcy52YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyhpdGVtLCBxdWFudGl0eSkpKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0geyBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKGNvbW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkID0gKGNvbW1lbnRzID8/ICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNsZWFuZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIC5wdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5QXBpKHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpKSxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB2YWxpZGF0ZVF1YW50aXR5ID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSA+IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tYXhpbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heGltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWF4aW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpIDwgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1pbmltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWluaW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5taW5pbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ICYmIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ID4gMCkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgJSBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHk6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuXG4gICAgICAgIGlmICghYmFsYW5jZSB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gbnVsbCB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXRQcmljZSA9IGl0ZW0udG90YWwgLyBpdGVtLnF1YW50aXR5O1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUXVhbnRpdHkgPSBxdWFudGl0eSAtIGl0ZW0ucXVhbnRpdHk7XG5cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxRdWFudGl0eSA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxDb3N0ID0gdW5pdFByaWNlICogYWRkaXRpb25hbFF1YW50aXR5O1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29zdCA+IGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cykge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBoYXNTdWZmaWNpZW50Q3JlZGl0c0ZvckNhcnRUb3RhbCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcblxuICAgICAgICBpZiAoIWJhbGFuY2UgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IG51bGwgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMuY2FydFN1YmplY3QudmFsdWU/LnRvdGFscz8udG90YWwgfHwgMDtcblxuICAgICAgICAvLyBTaSBOTyBwdWVkZSBleGNlZGVyIHNhbGRvIHkgZWwgdG90YWwgc3VwZXJhIGVsIGNyZWRpdG8sIGJsb3F1ZWFyXG4gICAgICAgIGlmICghYmFsYW5jZS5hbGxvd0V4Y2VlZEJhbGFuY2UgJiYgdG90YWwgPiBiYWxhbmNlLmNyZWRpdEFtb3VudCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGNhbGN1bGF0ZVN0b2NrQ291bnRzID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5wcm9kdWN0LnN0b2NrIDwgaXRlbS5xdWFudGl0eSArIHF1YW50aXR5KSB7XG4gICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGRlbGV0ZUNhcnRJdGVtID0gKGl0ZW0sIHRvYXN0ID0gdHJ1ZSkgPT4ge1xuICAgICAgICBsZXQgaWRfYnVzY2FkbyA9IHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICAvLyAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLCBxdWFudGl0eTogMCwgdmFyaWFudENvZGU6IGl0ZW0udmFyaWFudF9pZCwgaWQ6ICcnLCBvcmRlcl9pdGVtX2lkOiBpdGVtLml0ZW1faWQsIGxvdF9xdWFudGl0eTogJycsIHVuaXRfcHJpY2U6ICcnLCB1bml0X3RvdGFsOiAnJywgYWp1c3RlbWVudF90b3RhbDogJycsIHRvdGFsX2xvdDogJycsIGxvdF9zdGF0dXM6ICcnLCBkYXRlX3JlcXVlc3Q6ICcnLCBub3RlczogICcnLCBzaGlwcGluZ19hZGRyZXNzX2lkOiAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiAnJywgYWN0aW9uOiAgJ2RlbGV0ZW9yZGVyaXRlbSd9KVxuICAgICAgICAvLyAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gICAgICAgICAgICByZXMgPT4gdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KSxcbiAgICAgICAgLy8gICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgIC8vICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuZGVsZXRlSXRlbUFwaShpZF9idXNjYWRvKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHsgdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICAgICAgZXJyID0+IHsgdGhpcy5oYW5kbGVFcnJvcihlcnIpOyB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7IH0sXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBjbGVhckNhcnQoKSB7XG4gICAgICAgIC8vc29sdWNpb24gcHJvdmlzYW9yaWFcbiAgICAgICAgbGV0IGl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdXG4gICAgICAgIHdoaWxlIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW1zLnBvcCgpLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICAvL3RoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldENhcnQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldEN1c3RvbWVyQ2FydCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJDbGVhcmluZyBhbmQgcmVzZXRpbmcuLi5cIilcbiAgICAgICAgdGhpcy5yZXNldENhcnQodGhpcy5nZXRDYXJ0QnlDdXN0b21lcilcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvciA9IChlcnJvcjogeyBlcnJvcjogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvci1wYXJhbScpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgZ2V0Q291bnRGcm9tSXRlbUluQ2FydCA9IChjb2RlVmFyaWFudCk6IG51bWJlciA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gY29kZVZhcmlhbnQpPy5xdWFudGl0eSB8fCAwO1xuXG4gICAgZmluZEl0ZW1CeUlkVmFyaWFudCA9ICh2YXJpYW50X2lkKSA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkuaXRlbV9pZFxuXG4gICAgZmluZEl0ZW0gPSAocHJvZHVjdF9pZCkgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5wcm9kdWN0LmlkID09IHByb2R1Y3RfaWQpO1xuXG4gICAgLyoqIERBVEEgRk9SIE9USEVSIFNFUlZJQ0VTICovXG4gICAgZ2V0Q2FydFRva2VuID0gKCkgPT4gdGhpcy5jYXJ0X3Rva2VuO1xuXG4gICAgZ2V0TG9jYWxlID0gKCkgPT4gdGhpcy5sb2NhbGU7XG5cbiAgICBnZXRUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRvdGFsKSk7XG5cbiAgICAvKiogVG90YWwgcGFyYSBjYXJyaXRvL3NpZGViYXIsIHNpbiBlbnbDrW8gcGVyc2lzdGlkbyBuaSByZWNhcmdvcyBkZSBjaGVja291dC4gKi9cbiAgICBnZXRDYXJ0VG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUb3RhbEFtb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q291bnRDYXJ0SXRlbXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChjYXJ0SXRlbXMpID0+IGNhcnRJdGVtcz8ubGVuZ3RoKSk7XG5cbiAgICBnZXRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8udGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRTdWJUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpKSk7XG5cbiAgICBnZXRDYXJ0VGF4ZXNBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUYXhlc0Ftb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q2FydENsaWVudFRheGVzQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0Q2xpZW50VGF4ZXNBbW91bnQoY2FydCkpKTtcblxuICAgIC8qKlxuICAgICAqIERldnVlbHZlIGVsIGRlc2N1ZW50byBxdWUgZGViZSBtb3N0cmFyc2UgZW4gZWwgcmVzdW1lbiBkZSBjb21wcmEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBlbCBtb250byBkZSBwcm9tb2Npb25lcyBkZSBvcmRlbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiB0aGlzLnN1bW1hcnlQcm9tb3Rpb25BbW91bnQkID0gdGhpcy5jYXJ0U2VydmljZS5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNpIGVsIGJhY2tlbmQgbnVldm8gaW5mb3JtYSBgdG90YWxzLm9yZGVyRGlzY291bnRgLCBzZSB1c2EgZXNlIHZhbG9yLlxuICAgICAqIEVuIHN1IGF1c2VuY2lhLCBwcmlvcml6YSBgdG90YWxzLnByb21vdGlvbkJyZWFrZG93bi5vcmRlclByb21vdGlvbnNgIHlcbiAgICAgKiBsdWVnbyBoYWNlIGZhbGxiYWNrIGEgYHRvdGFscy5wcm9tb3Rpb25gIHBhcmEgbWFudGVuZXIgY29tcGF0aWJpbGlkYWQuXG4gICAgICovXG4gICAgZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLmdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24oY2FydCkub3JkZXJEaXNjb3VudCkpO1xuXG4gICAgLyoqIERlc2N1ZW50byBlc3BlY8OtZmljbyBkZWwgY3Vww7NuLCBzaSBlbCBiYWNrZW5kIGxvIGluZm9ybWEgcG9yIHNlcGFyYWRvLiAqL1xuICAgIGdldENvdXBvblByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5nZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uKGNhcnQpLmNvdXBvbkRpc2NvdW50KSk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2kgZXhpc3RlIHVuIGN1cMOzbiBhcGxpY2FkbyBlbiBlbCBjYXJyaXRvIGFjdHVhbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgYm9vbGVhbm8gcGFyYSBjb250cm9sYXIgbGEgdmlzaWJpbGlkYWQgZGUgYFF1aXRhciBjdXDDs25gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBObyBkZWJlIGF0YXJzZSBhIGBnZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KClgLCBwb3JxdWUgdW4gY3Vww7NuIHB1ZWRlIGFmZWN0YXJcbiAgICAgKiBzb2xvIHByb21vY2lvbmVzIHVuaXRhcmlhcyB5IGRlamFyIGVsIGRlc2N1ZW50byBkZSBvcmRlbiBlbiBgMGAuXG4gICAgICovXG4gICAgaGFzQXBwbGllZENvdXBvbiA9ICgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmhhc0FwcGxpZWRDb3Vwb24oY2FydCkpKTtcblxuICAgIHRvRGVjaW1hbCA9ICh0b3RhbCkgPT4gKHRvdGFsIC0gTWF0aC5mbG9vcih0b3RhbCkgPT0gMCkgPyB0b3RhbCAvIDEwMCA6IHRvdGFsXG5cbiAgICBnZXREaXNjb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJ0SXRlbXMucGlwZShtYXAoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IHRoaXMuaXRlbXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyLnByb2R1Y3Quc2FsZXByaWNlICogY3Vyci5xdWFudGl0eTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgbGV0IHN1YnRvdGFsID0gdGhpcy5pdGVtcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIucHJvZHVjdC5wcmljZSAqIGN1cnIucXVhbnRpdHk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybiBzdWJ0b3RhbCAtIHRvdGFsO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0aWVuZSBlbCBwcmVjaW8gbm9ybWFsaXphZG8gZGUgdW4gw610ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBkZSBjYXJyaXRvIG5vcm1hbGl6YWRvLlxuICAgICAqIEByZXR1cm5zIE9iamV0byBgQ2FydEl0ZW1QcmljaW5nYCBsaXN0byBwYXJhIHJlbmRlcml6YXIgcHJlY2lvIGJhc2UsIHRhY2hhZG8geSBmaW5hbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5jYXJ0U2VydmljZS5nZXRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiBjb25zdCBzaG93VG9vbHRpcCA9IHByaWNpbmcuaGFzVW5pdFByb21vdGlvbnM7XG4gICAgICogY29uc3QgZmluYWxQcmljZSA9IHByaWNpbmcuZmluYWxQcmljZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiBpdGVtPy5wcmljaW5nIHx8IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG5cbiAgICAvKiogUmVzdWVsdmUgbGEgcHJlc2VudGFjacOzbiBudWV2YSBkZSB1bmEgbMOtbmVhIHkgY29uc2VydmEgZWwgZmFsbGJhY2sgbGVnYWN5LiAqL1xuICAgIGdldENhcnRJdGVtUHJpY2VQcmVzZW50YXRpb24gPSAoaXRlbTogQ2FydEl0ZW0sIGNoYW5uZWw/OiBDaGFubmVsKTogQ2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbiA9PlxuICAgICAgICB0aGlzLnByaWNlUHJlc2VudGF0aW9uU2VydmljZS5nZXRDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uKFxuICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgIGNoYW5uZWwgfHwgdGhpcy5jaGFubmVsQ29uZmlnLFxuICAgICAgICAgICAgaXRlbT8ubGluZVByaWNpbmcgPyB1bmRlZmluZWQgOiB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pXG4gICAgICAgICk7XG5cbiAgICAvKiogUmVzdWVsdmUgZWwgcmVzdW1lbiB2aXNpYmxlIHVzYW5kbyBsaW5lUHJpY2luZyBzaW4gY29udmVydGlyIGltcG9ydGVzIGZpc2NhbGVzLiAqL1xuICAgIGdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPSAoXG4gICAgICAgIGNhcnQ6IGFueSA9IHRoaXMuY2FydFN1YmplY3QudmFsdWUsXG4gICAgICAgIGNoYW5uZWw/OiBDaGFubmVsLFxuICAgICAgICBpbmNsdWRlU2hpcHBpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZUl0ZW1zID0gQXJyYXkuaXNBcnJheShjYXJ0Py5pdGVtcykgJiYgY2FydC5pdGVtcy5sZW5ndGggPyBjYXJ0Lml0ZW1zIDogbnVsbDtcbiAgICAgICAgY29uc3QgaXRlbXM6IENhcnRJdGVtW10gPSAocmVzcG9uc2VJdGVtcyB8fCAodGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlIHx8IFtdKSlcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLm5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyhpdGVtKSk7XG4gICAgICAgIGNvbnN0IGhhc0xpbmVQcmljaW5nID0gaXRlbXMubGVuZ3RoID4gMCAmJiBpdGVtcy5ldmVyeShpdGVtID0+ICEhaXRlbT8ubGluZVByaWNpbmcpO1xuICAgICAgICBjb25zdCBzaG93R3Jvc3MgPSAoY2hhbm5lbCB8fCB0aGlzLmNoYW5uZWxDb25maWcpPy5zaG93UHJpY2VXaXRoVGF4ZXNXaGlsZUJyb3dzaW5nID09PSB0cnVlO1xuICAgICAgICBjb25zdCBwcmljaW5nS2V5ID0gc2hvd0dyb3NzID8gJ2dyb3NzJyA6ICduZXQnO1xuICAgICAgICBjb25zdCB0YXhlcyA9IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VGF4ZXNBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IGNsaWVudFRheGVzID0gdGhpcy5vcmRlclV0aWxzLmdldENhcnRDbGllbnRUYXhlc0Ftb3VudChjYXJ0KTtcbiAgICAgICAgY29uc3QgbGVnYWN5U2hpcHBpbmcgPSBpbmNsdWRlU2hpcHBpbmcgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVNoaXBtZW50QW1vdW50KGNhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc2hpcHBpbmdQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdzaGlwcGluZ19wcmljaW5nJywgJ3NoaXBwaW5nUHJpY2luZycpO1xuICAgICAgICBjb25zdCBzaGlwcGluZyA9IGluY2x1ZGVTaGlwcGluZ1xuICAgICAgICAgICAgPyAoc2hpcHBpbmdQcmljaW5nID8gc2hpcHBpbmdQcmljaW5nW3ByaWNpbmdLZXldIDogbGVnYWN5U2hpcHBpbmcpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaW5jbHVkZVNoaXBwaW5nXG4gICAgICAgICAgICA/IE51bWJlcihjYXJ0Py50b3RhbHM/LnRvdGFsIHx8IDApXG4gICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VG90YWxBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IG9yZGVyRGlzY291bnRQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdvcmRlcl9kaXNjb3VudF9wcmljaW5nJywgJ29yZGVyRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50UHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnY291cG9uX2Rpc2NvdW50X3ByaWNpbmcnLCAnY291cG9uRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50ID0gY291cG9uRGlzY291bnRQcmljaW5nXG4gICAgICAgICAgICA/IGNvdXBvbkRpc2NvdW50UHJpY2luZ1twcmljaW5nS2V5XVxuICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q291cG9uUHJvbW90aW9uQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBvcmRlckRpc2NvdW50ID0gb3JkZXJEaXNjb3VudFByaWNpbmdcbiAgICAgICAgICAgID8gb3JkZXJEaXNjb3VudFByaWNpbmdbcHJpY2luZ0tleV1cbiAgICAgICAgICAgIDogdGhpcy5vcmRlclV0aWxzLmdldE9yZGVyUHJvbW90aW9uQW1vdW50XG4gICAgICAgICAgICAgICAgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0T3JkZXJQcm9tb3Rpb25BbW91bnQoY2FydClcbiAgICAgICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KGNhcnQpO1xuXG4gICAgICAgIGlmIChoYXNMaW5lUHJpY2luZykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0c0JlZm9yZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnVuaXRbcHJpY2luZ0tleV0gfHwgMCkgKiBOdW1iZXIoaXRlbS5xdWFudGl0eSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgbGluZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLmRpc2NvdW50W3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBzdWJ0b3RhbDogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnN1YnRvdGFsW3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBvcmRlckRpc2NvdW50LFxuICAgICAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgICAgIHRheGVzLFxuICAgICAgICAgICAgICAgIGNsaWVudFRheGVzLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgICAgIHRheGVzSW5jbHVkZWRJblRvdGFsOiBzaG93R3Jvc3MgJiYgdGF4ZXMgIT09IDAsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnbGluZVByaWNpbmcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb2R1Y3RzQmVmb3JlRGlzY291bnRzOiAwLFxuICAgICAgICAgICAgbGluZURpc2NvdW50czogMCxcbiAgICAgICAgICAgIHN1YnRvdGFsOiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpLFxuICAgICAgICAgICAgb3JkZXJEaXNjb3VudCxcbiAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgdGF4ZXMsXG4gICAgICAgICAgICBjbGllbnRUYXhlcyxcbiAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICB0YXhlc0luY2x1ZGVkSW5Ub3RhbDogZmFsc2UsXG4gICAgICAgICAgICBzb3VyY2U6ICdsZWdhY3knXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKiBOb3JtYWxpemEgc8OzbG8gZWwgYWxpYXMgc2VyaWFsaXphZG8gZGVsIGNvbnRyYXRvIGRlIGzDrW5lYS4gKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBhbnkpOiBDYXJ0SXRlbSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBsaW5lUHJpY2luZzogaXRlbT8ubGluZVByaWNpbmcgfHwgaXRlbT8ubGluZV9wcmljaW5nXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBMZWUgZWwgY29udHJhdG8gbnVldm8gc2luIGNvbmZ1bmRpciB1biBvYmpldG8gdsOhbGlkbyBjb24gZmFsbGJhY2sgbGVnYWN5LFxuICAgICAqIGluY2x1c28gY3VhbmRvIHRvZG9zIHN1cyBpbXBvcnRlcyBzb24gY2Vyby5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFRvdGFsc1ByaWNpbmcgPSAoXG4gICAgICAgIGNhcnQ6IGFueSxcbiAgICAgICAgc25ha2VDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZyxcbiAgICAgICAgY2FtZWxDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZ1xuICAgICk6IENhcnRUb3RhbFByaWNpbmdWYWx1ZSB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCB0b3RhbHMgPSBjYXJ0Py50b3RhbHMgfHwge307XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdG90YWxzW3NuYWtlQ2FzZUtleV0gPz8gdG90YWxzW2NhbWVsQ2FzZUtleV07XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghW3ZhbHVlLm5ldCwgdmFsdWUudGF4LCB2YWx1ZS5ncm9zc10uZXZlcnkoYW1vdW50ID0+IE51bWJlci5pc0Zpbml0ZShOdW1iZXIoYW1vdW50KSkpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV0OiBOdW1iZXIodmFsdWUubmV0KSxcbiAgICAgICAgICAgIHRheDogTnVtYmVyKHZhbHVlLnRheCksXG4gICAgICAgICAgICBncm9zczogTnVtYmVyKHZhbHVlLmdyb3NzKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBhZGRDb3Vwb24gPSBhc3luYyAoY29kZSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnB1dCh0aGlzLmNvdXBvbkFwaSgpLCB7IGNvdXBvbjogY29kZSB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LmVycm9ycykgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdpbnZhbGlkLWNvdXBvbicgfTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiAnb2snIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnaW52YWxpZC1jb3Vwb24nIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVDb3Vwb24gPSBhc3luYyAoKSA9PiB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuY291cG9uQXBpKCkpLnBpcGUobWFwKHJlcyA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKHJlcyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pKS50b1Byb21pc2UoKTtcblxuICAgIGZvcm1hdENvdXBvbiA9IChjYXJ0KSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50X2NvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IGNvdXBvbjogQ291cG9uSSA9IHsgY29kZTogY2FydC5jb3Vwb25Db2RlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhjYXJ0LmNhcnREaXNjb3VudHMpWzBdO1xuICAgICAgICAgICAgY291cG9uID0ge1xuICAgICAgICAgICAgICAgIC4uLmNvdXBvbixcbiAgICAgICAgICAgICAgICBhbW91bnQ6IChjYXJ0LmNhcnREaXNjb3VudHMgJiYgY2FydC5jYXJ0RGlzY291bnRzW2tleV0uYW1vdW50LmN1cnJlbnQpIHx8IDAsXG4gICAgICAgICAgICAgICAgbmFtZTogKGNhcnQuY2FydERpc2NvdW50cyAmJiBjYXJ0LmNhcnREaXNjb3VudHNba2V5XS5uYW1lKSB8fCAnbm8tbmFtZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAoY291cG9uICE9IGN1cnJlbnRfY291cG9uKSAmJiB0aGlzLmNvdXBvblN1YmplY3QubmV4dChjb3Vwb24pO1xuICAgIH1cblxuICAgIGNoYW5nZUhhdmVUb1VwZGF0ZSA9ICh2YWx1ZSkgPT4gdGhpcy5oYXZlX3RvX3VwZGF0ZSA9IHZhbHVlO1xuXG4gICAgcmVhZHlGb3JDaGVja291dCA9IChzdWNjZXNzQ2FsbGJhY2s/OiBGdW5jdGlvbiwgZXJyb3JDYWxsYmFjaz86IEZ1bmN0aW9uKTogQ2FydEFmZm9yZGFibGUgPT4ge1xuICAgICAgICBsZXQgY2FydCA9IHRoaXMuY2FydFN1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IHJlc3VsdDogQ2FydEFmZm9yZGFibGUgPSB7IG9rOiB0cnVlIH07XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPCB0aGlzLmNoYW5uZWxDb25maWcubWluaW11bVF1YW50aXR5UHVyY2hhc2VJdGVtcykge1xuICAgICAgICAgICAgcmVzdWx0Lm9rID0gZmFsc2U7IHJlc3VsdC5yZWFzb25zLnB1c2goeyBtZXNzYWdlOiAnbm90LWVub3VnaHQtaXRlbXMnIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcnQudG90YWxzLnRvdGFsIDwgdGhpcy5jaGFubmVsQ29uZmlnLm1pbmltdW1QdXJjaGFzZUFtb3VudCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9rID0gZmFsc2U7IHJlc3VsdC5yZWFzb25zLnB1c2goeyBtZXNzYWdlOiAnbm90LWVub3VnaHQtYW1vdW50JyB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2sgfHwgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICAgICAgcmVzdWx0Lm9rXG4gICAgICAgICAgICAgICAgPyBzdWNjZXNzQ2FsbGJhY2sgJiYgc3VjY2Vzc0NhbGxiYWNrKClcbiAgICAgICAgICAgICAgICA6IGVycm9yQ2FsbGJhY2sgJiYgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdXBkYXRlSXRlbXNPbkVycm9yID0gKGl0ZW1zV2l0aEVycm9yOiBhbnlbXSwgY29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW1zV2l0aEVycm9yKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pdGVtcyk7XG4gICAgICAgIGxldCBpdGVtc1VwZGF0ZWQgPSB0aGlzLml0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtV2l0aEVycm9yID0gaXRlbXNXaXRoRXJyb3IuZmluZChmYWlsZWRJdGVtID0+IGl0ZW0uaXRlbV9pZCA9PSBmYWlsZWRJdGVtLmlkKTtcbiAgICAgICAgICAgIGlmIChpdGVtV2l0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5mYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGl0ZW0uZXJyb3IgPSBjb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW1zVXBkYXRlZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydEl0ZW1zKGl0ZW1zVXBkYXRlZCk7XG4gICAgfVxuXG4gICAgbG9hZENhcnRCeVRva2VuID0gYXN5bmMgKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gdG9rZW5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0Q2FydEJ5VG9rZW4oKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFVUSUxTXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1hIGxvcyDDrXRlbXMgY3J1ZG9zIGRlbCBiYWNrZW5kIGFsIGNvbnRyYXRvIGludGVybm8gYENhcnRJdGVtYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2ZXJfaXRlbSBSZXNwdWVzdGEgYGl0ZW1zYCBkZWwgZW5kcG9pbnQgZGUgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBBcnJlZ2xvIGRlIMOtdGVtcyBub3JtYWxpemFkb3MsIGNhZGEgdW5vIGNvbiBgcHJpY2luZ2AgcHJlY29tcHV0YWRvLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFc3RlIGVzIGVsIHB1bnRvIGRvbmRlIGVsIGNvcmU6XG4gICAgICogLSBwcmVzZXJ2YSBgdW5pdFByb21vdGlvbnNgXG4gICAgICogLSBhcm1hIGBwcmljaW5nYFxuICAgICAqIC0gbWFudGllbmUgbGEgZm9ybWEgaGlzdMOzcmljYSBkZWwgaXRlbSBjb25zdW1pZG8gcG9yIGxvcyB0ZW1wbGF0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1JdGVtcyA9IChzZXJ2ZXJfaXRlbSkgPT4gc2VydmVyX2l0ZW0ubWFwKFxuICAgICAgICBpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdDogaXRlbS5wcm9kdWN0LFxuICAgICAgICAgICAgICAgIHZhcmlhbnRfaWQ6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5jb2RlLFxuICAgICAgICAgICAgICAgIGxvdDogaXRlbS5vcmRlckl0ZW1Mb3QsXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICAgICAgY29tbWVudHM6IGl0ZW0uY29tbWVudHMgfHwgJycsXG4gICAgICAgICAgICAgICAgaXRlbV9pZDogaXRlbS5pZCxcbiAgICAgICAgICAgICAgICB0b3RhbDogaXRlbS50b3RhbCxcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IGl0ZW0udW5pdFByaWNlID8/IGl0ZW0udW5pdF9wcmljZSxcbiAgICAgICAgICAgICAgICBkaXNjb3VudDogaXRlbS5kaXNjb3VudCxcbiAgICAgICAgICAgICAgICBzdWJ0b3RhbDogaXRlbS5zdWJ0b3RhbCxcbiAgICAgICAgICAgICAgICB0YXhUb3RhbDogaXRlbS50YXhUb3RhbCA/PyBpdGVtLnRheF90b3RhbCxcbiAgICAgICAgICAgICAgICB1bml0UHJvbW90aW9uczogQXJyYXkuaXNBcnJheShpdGVtLnVuaXRQcm9tb3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udW5pdFByb21vdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgOiAoQXJyYXkuaXNBcnJheShpdGVtLnVuaXRfcHJvbW90aW9ucykgPyBpdGVtLnVuaXRfcHJvbW90aW9ucyA6IFtdKSxcbiAgICAgICAgICAgICAgICBsaW5lUHJpY2luZzogaXRlbS5saW5lUHJpY2luZyB8fCBpdGVtLmxpbmVfcHJpY2luZyxcbiAgICAgICAgICAgICAgICBsaW5lX3ByaWNpbmc6IGl0ZW0ubGluZV9wcmljaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnByaWNpbmcgPSB0aGlzLmJ1aWxkQ2FydEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UgPiAwID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vICAgICBpdGVtLnByb2R1Y3QucHJpY2UgPSBpdGVtLnRvdGFsIC8gaXRlbS5xdWFudGl0eS8vID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZTtcbiAgICAgICAgICAgIC8vIH0sIDEwMCk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgIClcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnV5ZSBsYSBub3JtYWxpemFjacOzbiBkZSBwcmVjaW9zIHBhcmEgdW4gw610ZW0gZGVsIGNhcnJpdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBub3JtYWxpemFkbyBkZWwgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBFc3RydWN0dXJhIGBDYXJ0SXRlbVByaWNpbmdgIGNvbiBwcmVjaW8gYmFzZSwgdGFjaGFkbywgZmluYWwgeSBmbGFncyBkZSBVSS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiAvLyBwcmljaW5nLmJhc2VQcmljZSA9PiB1bml0UHJpY2UgZGVsIGJhY2tlbmQgbnVldm8gbyBmYWxsYmFjayBsZWdhY3lcbiAgICAgKiAvLyBwcmljaW5nLmZpbmFsUHJpY2UgPT4gdW5pdFByaWNlIGRlbCBiYWNrZW5kIG51ZXZvIG8gY8OhbGN1bG8gbGVnYWN5XG4gICAgICogLy8gcHJpY2luZy5lZmZlY3RpdmVEaXNjb3VudFBlcmNlbnQgPT4gJSB0b3RhbCBjb250cmEgZWwgcHJlY2lvIGRlIHJlZmVyZW5jaWFcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkQ2FydEl0ZW1QcmljaW5nID0gKGl0ZW06IENhcnRJdGVtKTogQ2FydEl0ZW1QcmljaW5nID0+IHtcbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGl0ZW0/LnByb2R1Y3Q/LnZhcmlhbnRzPy5bMF07XG4gICAgICAgIGNvbnN0IGNhcnRBbmRTaWRlYmFyUHJpY2VzID0gdmFyaWFudD8uY2FydEFuZFNpZGViYXJQcmljZXM7XG4gICAgICAgIC8vIFNpIGVsIGJhY2tlbmQgbnVldm8gaW5mb3JtYSBgY2FydEFuZFNpZGViYXJQcmljZXNgLCBlc2UgZXMgZWwgcHJlY2lvIGNvcnJlY3RvXG4gICAgICAgIC8vIHBhcmEgY2Fycml0by9zaWRlYmFyIHBvcnF1ZSBleGNsdXllIGltcHVlc3RvcyBkZSBvcmRlbiBxdWUgbm8gc2UgbGlzdGFuIHBvciDDrXRlbS5cbiAgICAgICAgLy8gU2kgbm8gZXhpc3RlLCBzZSBtYW50aWVuZSBlbCBmYWxsYmFjayBoaXN0w7NyaWNvLlxuICAgICAgICBjb25zdCBleHBsaWNpdFVuaXRQcmljZSA9IHRoaXMucGFyc2VQcmljZVZhbHVlKGl0ZW0/LnVuaXRQcmljZSk7XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0VW5pdFByaWNlID0gTnVtYmVyLmlzRmluaXRlKGV4cGxpY2l0VW5pdFByaWNlKTtcbiAgICAgICAgY29uc3QgYmFzZVByaWNlID0gaGFzRXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgID8gZXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgIDogdGhpcy5wYXJzZVByaWNlVmFsdWUoXG4gICAgICAgICAgICAgICAgY2FydEFuZFNpZGViYXJQcmljZXM/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5wcmljZVxuICAgICAgICAgICAgICAgID8/IHZhcmlhbnQ/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IHZhcmlhbnQ/LnByaWNlXG4gICAgICAgICAgICAgICAgPz8gaXRlbT8ucHJvZHVjdD8uc2FsZXByaWNlXG4gICAgICAgICAgICAgICAgPz8gaXRlbT8ucHJvZHVjdD8ucHJpY2VcbiAgICAgICAgICAgICAgICA/PyAwXG4gICAgICAgICAgICApO1xuICAgICAgICBjb25zdCBzdHJpa2VQcmljZUNhbmRpZGF0ZSA9IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgY2FydEFuZFNpZGViYXJQcmljZXM/LnByaWNlXG4gICAgICAgICAgICA/PyB2YXJpYW50Py5wcmljZVxuICAgICAgICAgICAgPz8gaXRlbT8ucHJvZHVjdD8ucHJpY2VcbiAgICAgICAgICAgID8/IDBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEJhc2VQcmljZSA9IGlzTmFOKGJhc2VQcmljZSkgPyAwIDogYmFzZVByaWNlO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU3RyaWtlUHJpY2UgPSBpc05hTihzdHJpa2VQcmljZUNhbmRpZGF0ZSkgPyAwIDogc3RyaWtlUHJpY2VDYW5kaWRhdGU7XG4gICAgICAgIGNvbnN0IHVuaXRQcm9tb3Rpb25Ub3RhbCA9IEFycmF5LmlzQXJyYXkoaXRlbT8udW5pdFByb21vdGlvbnMpXG4gICAgICAgICAgICA/IGl0ZW0udW5pdFByb21vdGlvbnMucmVkdWNlKCh0b3RhbCwgcHJvbW90aW9uKSA9PiB0b3RhbCArIE51bWJlcihwcm9tb3Rpb24/LmFtb3VudCB8fCAwKSwgMClcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgaGFzU3RyaWtlUHJpY2UgPSBub3JtYWxpemVkU3RyaWtlUHJpY2UgPiBub3JtYWxpemVkQmFzZVByaWNlICYmIG5vcm1hbGl6ZWRCYXNlUHJpY2UgPiAwO1xuICAgICAgICBjb25zdCBoYXNVbml0UHJvbW90aW9ucyA9IEFycmF5LmlzQXJyYXkoaXRlbT8udW5pdFByb21vdGlvbnMpICYmIGl0ZW0udW5pdFByb21vdGlvbnMubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBOdW1iZXIoaXRlbT8ucXVhbnRpdHkgfHwgMCk7XG4gICAgICAgIGNvbnN0IGZpbmFsUHJpY2UgPSBoYXNFeHBsaWNpdFVuaXRQcmljZVxuICAgICAgICAgICAgPyBub3JtYWxpemVkQmFzZVByaWNlXG4gICAgICAgICAgICA6IGhhc1VuaXRQcm9tb3Rpb25zID8gbm9ybWFsaXplZEJhc2VQcmljZSArIHVuaXRQcm9tb3Rpb25Ub3RhbCA6IG5vcm1hbGl6ZWRCYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IHByb2R1Y3REaXNjb3VudCA9IHRoaXMucGFyc2VQcmljZVZhbHVlKGl0ZW0/LmRpc2NvdW50KTtcbiAgICAgICAgY29uc3QgbGVnYWN5UHJvZHVjdERpc2NvdW50ID0gTnVtYmVyKGl0ZW0/LnByb2R1Y3Q/LmRpc2NvdW50IHx8IDApO1xuICAgICAgICBjb25zdCBkaXNjb3VudFBlcmNlbnQgPSBOdW1iZXIuaXNGaW5pdGUocHJvZHVjdERpc2NvdW50KSAmJiBwcm9kdWN0RGlzY291bnQgPCAwICYmIG5vcm1hbGl6ZWRCYXNlUHJpY2UgPiAwICYmIHF1YW50aXR5ID4gMFxuICAgICAgICAgICAgPyBNYXRoLnJvdW5kKChNYXRoLmFicyhwcm9kdWN0RGlzY291bnQpIC8gKG5vcm1hbGl6ZWRCYXNlUHJpY2UgKiBxdWFudGl0eSkpICogMTAwKVxuICAgICAgICAgICAgOiAhaXNOYU4obGVnYWN5UHJvZHVjdERpc2NvdW50KSAmJiBsZWdhY3lQcm9kdWN0RGlzY291bnQgPiAwXG4gICAgICAgICAgICAgICAgPyBNYXRoLnJvdW5kKGxlZ2FjeVByb2R1Y3REaXNjb3VudClcbiAgICAgICAgICAgICAgICA6IGhhc1N0cmlrZVByaWNlXG4gICAgICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKG5vcm1hbGl6ZWRTdHJpa2VQcmljZSAtIG5vcm1hbGl6ZWRCYXNlUHJpY2UpIC8gbm9ybWFsaXplZFN0cmlrZVByaWNlKSAqIDEwMClcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA9IGhhc1N0cmlrZVByaWNlID8gbm9ybWFsaXplZFN0cmlrZVByaWNlIDogbm9ybWFsaXplZEJhc2VQcmljZTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRGlzY291bnRQZXJjZW50ID0gZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPiAwICYmIGZpbmFsUHJpY2UgPiAwICYmIGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID4gZmluYWxQcmljZVxuICAgICAgICAgICAgPyBNYXRoLnJvdW5kKCgoZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgLSBmaW5hbFByaWNlKSAvIGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlKSAqIDEwMClcbiAgICAgICAgICAgIDogZGlzY291bnRQZXJjZW50O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiYXNlUHJpY2U6IG5vcm1hbGl6ZWRCYXNlUHJpY2UsXG4gICAgICAgICAgICBzdHJpa2VQcmljZTogaGFzU3RyaWtlUHJpY2UgPyBub3JtYWxpemVkU3RyaWtlUHJpY2UgOiBudWxsLFxuICAgICAgICAgICAgZmluYWxQcmljZSxcbiAgICAgICAgICAgIHVuaXRQcm9tb3Rpb25Ub3RhbCxcbiAgICAgICAgICAgIGhhc1N0cmlrZVByaWNlLFxuICAgICAgICAgICAgaGFzVW5pdFByb21vdGlvbnMsXG4gICAgICAgICAgICBkaXNjb3VudFBlcmNlbnQsXG4gICAgICAgICAgICBlZmZlY3RpdmVEaXNjb3VudFBlcmNlbnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemEgdmFsb3JlcyBkZSBwcmVjaW8gcHJvdmVuaWVudGVzIGRlbCBiYWNrZW5kIGEgYG51bWJlcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVmFsb3IgbnVtw6lyaWNvIG8gc3RyaW5nIGNvbiBmb3JtYXRvIGxvY2FsIChgMTIwLjAwMGAsIGAxMjAwMDBgLCBgMTIwMDAwLTFgLCBldGMuKS5cbiAgICAgKiBAcmV0dXJucyBOw7ptZXJvIHBhcnNlYWRvIG8gYE5hTmAgc2kgZWwgdmFsb3Igbm8gZXMgdXRpbGl6YWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2UgdXNhIHBhcmEgc29wb3J0YXIgcmVzcHVlc3RhcyBjb24gc2VwYXJhZG9yZXMgZGUgbWlsZXMsIGNvbWEgZGVjaW1hbCBvIHJhbmdvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUHJpY2VWYWx1ZSA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhdyA9IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICBpZiAoIXJhdykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSByYXcuaW5jbHVkZXMoJy0nKSA/IHJhdy5zcGxpdCgnLScpWzBdLnRyaW0oKSA6IHJhdztcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZpcnN0VmFsdWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHMvZywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwuKD89XFxkezN9KFxcRHwkKSkvZywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnLCcsICcuJyk7XG5cbiAgICAgICAgcmV0dXJuIE51bWJlcihub3JtYWxpemVkKTtcbiAgICB9XG5cblxuICAgIGdldENyZWRpdEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5waXBlKFxuICAgICAgICAgICAgbWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8uY3JlZGl0QW1vdW50ID8/IG51bGwpXG4gICAgICAgICk7XG5cbiAgICBnZXRDbGllbnRUYXhlcyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8uY2xpZW50VGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRSZW1haW5pbmdDcmVkaXRzID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShtYXAoKGJhbGFuY2VDdXN0b21lcikgPT4gYmFsYW5jZUN1c3RvbWVyPy5yZW1haW5pbmdDcmVkaXRzKSk7XG5cbiAgICBwdWJsaWMgdXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMoYmFsYW5jZTogYW55LCB0b3RhbDogbnVtYmVyIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFiYWxhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsQW1vdW50ID0gdG90YWwgPz8gMDtcblxuICAgICAgICBjb25zdCBiYWxhbmNlRGF0YSA9IHtcbiAgICAgICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZDogYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QsXG4gICAgICAgICAgICBhbGxvd0V4Y2VlZEJhbGFuY2U6IGJhbGFuY2UuYWxsb3dFeGNlZWRCYWxhbmNlLFxuICAgICAgICAgICAgY3JlZGl0QW1vdW50OiBiYWxhbmNlLmNyZWRpdEFtb3VudCxcbiAgICAgICAgICAgIHNob3dNYXg6IGJhbGFuY2Uuc2hvd01heCxcbiAgICAgICAgICAgIHNob3dQcmljZTogYmFsYW5jZS5zaG93UHJpY2UsXG4gICAgICAgICAgICByZW1haW5pbmdDcmVkaXRzOlxuICAgICAgICAgICAgICAgIGJhbGFuY2UuY3JlZGl0QW1vdW50ICE9IG51bGwgJiYgdG90YWxBbW91bnQgIT0gbnVsbCAmJiBiYWxhbmNlLmNyZWRpdEFtb3VudCA+PSB0b3RhbEFtb3VudFxuICAgICAgICAgICAgICAgICAgICA/IGJhbGFuY2UuY3JlZGl0QW1vdW50IC0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgYXBwbHlNYXhPcmRlcnM6IGJhbGFuY2UuYXBwbHlNYXhPcmRlcnMsXG4gICAgICAgICAgICBtYXhPcmRlcnM6IGJhbGFuY2UubWF4T3JkZXJzXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQoYmFsYW5jZURhdGEpO1xuICAgIH1cblxufVxuIl19