ng-easycommerce 0.0.683 → 0.0.684
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.
- package/README.md +9 -0
- package/bundles/ng-easycommerce.umd.js +427 -38
- package/bundles/ng-easycommerce.umd.js.map +1 -1
- package/bundles/ng-easycommerce.umd.min.js +1 -1
- package/bundles/ng-easycommerce.umd.min.js.map +1 -1
- package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +317 -8
- package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +2 -2
- package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +41 -24
- package/esm2015/lib/services/checkout/addressing.service.js +21 -1
- package/esm2015/lib/services/checkout/shipment.service.js +5 -4
- package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +359 -8
- package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +2 -2
- package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +41 -24
- package/esm5/lib/services/checkout/addressing.service.js +21 -1
- package/esm5/lib/services/checkout/shipment.service.js +10 -9
- package/fesm2015/ng-easycommerce.js +380 -33
- package/fesm2015/ng-easycommerce.js.map +1 -1
- package/fesm5/ng-easycommerce.js +427 -38
- package/fesm5/ng-easycommerce.js.map +1 -1
- package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +26 -0
- package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +4 -3
- package/lib/services/checkout/addressing.service.d.ts +5 -0
- package/ng-easycommerce.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -135,11 +135,13 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
135
135
|
_this.allready_data = false;
|
|
136
136
|
_this.addressBook = [];
|
|
137
137
|
_this.addressBookSelected = { id: 0, notes: "" };
|
|
138
|
+
_this.addressBookSelectedFacturacion = { id: 0, notes: "" };
|
|
138
139
|
_this.finish = false; //Esta variable se usa para mostrar el boton de finalizar.
|
|
139
140
|
_this.validado = false;
|
|
140
141
|
_this.viewDataFacturacion = true;
|
|
141
142
|
_this.params = {};
|
|
142
143
|
_this.selectAddres = false;
|
|
144
|
+
_this.selectAddressFacturacion = false;
|
|
143
145
|
_this.addressSearch = '';
|
|
144
146
|
_this.addressDropdownOpen = false;
|
|
145
147
|
_this.formReadonly = false;
|
|
@@ -147,6 +149,10 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
147
149
|
_this.tempAddressId = 0;
|
|
148
150
|
_this.postalCodeErrorMessage = "";
|
|
149
151
|
_this.postalCodeErrorMessageFacturacion = "";
|
|
152
|
+
_this.postalCodeVisible = true;
|
|
153
|
+
_this.postalCodeVisibleFacturacion = true;
|
|
154
|
+
_this.postalCodeRequired = true;
|
|
155
|
+
_this.postalCodeRequiredFacturacion = true;
|
|
150
156
|
_this.documentErrorMessage = "";
|
|
151
157
|
_this.documentErrorMessageFacturacion = "";
|
|
152
158
|
_this.customerHasCustomerTaxRate = false;
|
|
@@ -301,6 +307,57 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
301
307
|
var current = _this.checkoutFormFacturacion.controls['documentType'].value;
|
|
302
308
|
return ((_b = (_a = documentTypes) === null || _a === void 0 ? void 0 : _a.find(function (doc) { return doc.code == current; })) === null || _b === void 0 ? void 0 : _b.name) || '';
|
|
303
309
|
};
|
|
310
|
+
_this.getBasePostalCodeEnabled = function () { var _a, _b, _c, _d; return _d = (_c = (_b = (_a = _this.addressingService.getTypeForm()) === null || _a === void 0 ? void 0 : _a.viewForms) === null || _b === void 0 ? void 0 : _b.postcode) === null || _c === void 0 ? void 0 : _c.enabled, (_d !== null && _d !== void 0 ? _d : true); };
|
|
311
|
+
_this.getBasePostalCodeRequired = function () { var _a, _b, _c, _d; return _d = (_c = (_b = (_a = _this.addressingService.getTypeForm()) === null || _a === void 0 ? void 0 : _a.viewForms) === null || _b === void 0 ? void 0 : _b.postcode) === null || _c === void 0 ? void 0 : _c.required, (_d !== null && _d !== void 0 ? _d : true); };
|
|
312
|
+
_this.getDefaultPostalCodeFieldState = function () {
|
|
313
|
+
var visible = _this.getBasePostalCodeEnabled();
|
|
314
|
+
return {
|
|
315
|
+
visible: visible,
|
|
316
|
+
required: visible && _this.getBasePostalCodeRequired()
|
|
317
|
+
};
|
|
318
|
+
};
|
|
319
|
+
_this.resolveCountryByCode = function (code) {
|
|
320
|
+
if (!code)
|
|
321
|
+
return null;
|
|
322
|
+
var countryFromSubjects = __spread((_this.countriesSubject.value || []), (_this.countriesFacturacionSubject.value || [])).find(function (country) { return country.code == code; });
|
|
323
|
+
return countryFromSubjects
|
|
324
|
+
|| _this.addressingService.countriesList.find(function (country) { return country.code == code; })
|
|
325
|
+
|| null;
|
|
326
|
+
};
|
|
327
|
+
_this.resolveCountryForPostalCode = function (selectedCountry) {
|
|
328
|
+
if (!selectedCountry)
|
|
329
|
+
return null;
|
|
330
|
+
if (selectedCountry.checkoutRequiredFields || selectedCountry.isPostalCodeNumeric !== undefined) {
|
|
331
|
+
return selectedCountry;
|
|
332
|
+
}
|
|
333
|
+
return _this.resolveCountryByCode(selectedCountry.code || selectedCountry.countryCode);
|
|
334
|
+
};
|
|
335
|
+
_this.resolvePostalCodeFieldState = function (country) {
|
|
336
|
+
var _a, _b;
|
|
337
|
+
var checkoutPostalCode = (_b = (_a = country) === null || _a === void 0 ? void 0 : _a.checkoutRequiredFields) === null || _b === void 0 ? void 0 : _b.postalCode;
|
|
338
|
+
if (checkoutPostalCode === false) {
|
|
339
|
+
return { visible: false, required: false };
|
|
340
|
+
}
|
|
341
|
+
if (checkoutPostalCode === true) {
|
|
342
|
+
return { visible: true, required: true };
|
|
343
|
+
}
|
|
344
|
+
return _this.getDefaultPostalCodeFieldState();
|
|
345
|
+
};
|
|
346
|
+
_this.isPostalCodeFieldVisible = function (billing) {
|
|
347
|
+
if (billing === void 0) { billing = false; }
|
|
348
|
+
return billing ? _this.postalCodeVisibleFacturacion : _this.postalCodeVisible;
|
|
349
|
+
};
|
|
350
|
+
_this.isPostalCodeFieldRequired = function (billing) {
|
|
351
|
+
if (billing === void 0) { billing = false; }
|
|
352
|
+
return billing ? _this.postalCodeRequiredFacturacion : _this.postalCodeRequired;
|
|
353
|
+
};
|
|
354
|
+
_this.shouldShowPostalCodeByCountryCode = function (code) {
|
|
355
|
+
var country = _this.resolveCountryByCode(code);
|
|
356
|
+
if (!country) {
|
|
357
|
+
return _this.getDefaultPostalCodeFieldState().visible;
|
|
358
|
+
}
|
|
359
|
+
return _this.resolvePostalCodeFieldState(country).visible;
|
|
360
|
+
};
|
|
304
361
|
_this.toggleDocumentTypeDropdown = function (event) {
|
|
305
362
|
var _a;
|
|
306
363
|
event.stopPropagation();
|
|
@@ -557,6 +614,260 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
557
614
|
_this.setCheckoutFormReadonly(_this.compactAddressView && !_this.getMode());
|
|
558
615
|
_this.evaluateDirtyState();
|
|
559
616
|
};
|
|
617
|
+
_this.getModeFacturacion = function () {
|
|
618
|
+
switch (_this.addressingService.modeSelectAddress) {
|
|
619
|
+
case 'ONLY_LOAD_ADDRESS':
|
|
620
|
+
return true;
|
|
621
|
+
case 'ONLY_ADDRESS_SELECTION':
|
|
622
|
+
return !_this.authService.isAuthenticated();
|
|
623
|
+
case 'LOAD_ADDRESS_AND_SELECTION':
|
|
624
|
+
return _this.authService.isAuthenticated() ? _this.selectAddressFacturacion : true;
|
|
625
|
+
}
|
|
626
|
+
};
|
|
627
|
+
_this.setModeFacturacion = function (mode) {
|
|
628
|
+
_this.selectAddressFacturacion = mode === 'carga';
|
|
629
|
+
_this.onFormChange();
|
|
630
|
+
_this.evaluateDirtyState();
|
|
631
|
+
};
|
|
632
|
+
_this.setSelectAddressFacturacion = function (addressSelect) {
|
|
633
|
+
var _a;
|
|
634
|
+
(_this.addressBook || []).forEach(function (address) {
|
|
635
|
+
var _a;
|
|
636
|
+
address.selectedFacturacion = String(address.id) === String((_a = addressSelect) === null || _a === void 0 ? void 0 : _a.id);
|
|
637
|
+
});
|
|
638
|
+
_this.addressBookSelectedFacturacion.id = ((_a = (_this.addressBook || []).find(function (address) { return address.selectedFacturacion; })) === null || _a === void 0 ? void 0 : _a.id) || 0;
|
|
639
|
+
};
|
|
640
|
+
_this.buildAddressFromBook = function (bookAddress) {
|
|
641
|
+
var _a, _b;
|
|
642
|
+
var contact = ((_a = bookAddress) === null || _a === void 0 ? void 0 : _a.addressContact) || {};
|
|
643
|
+
return {
|
|
644
|
+
firstName: contact.firstName || '',
|
|
645
|
+
lastName: contact.lastName || '',
|
|
646
|
+
phoneNumber: contact.phoneNumber || '',
|
|
647
|
+
email: contact.email || '',
|
|
648
|
+
documentType: contact.documentType || '',
|
|
649
|
+
documentNumber: contact.documentNumber || '',
|
|
650
|
+
countryCode: bookAddress.countryCode,
|
|
651
|
+
provinceCode: bookAddress.provinceCode,
|
|
652
|
+
city: bookAddress.city,
|
|
653
|
+
street: bookAddress.street,
|
|
654
|
+
postcode: ((_b = bookAddress.postcode) === null || _b === void 0 ? void 0 : _b.toString()) || ''
|
|
655
|
+
};
|
|
656
|
+
};
|
|
657
|
+
_this.handleBillingFormSubmit = function (event) {
|
|
658
|
+
event.preventDefault();
|
|
659
|
+
if (_this.getMode()) {
|
|
660
|
+
_this.verifyValidate(null, null);
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
_this.onSelectAddress = function (items) { return __awaiter(_this, void 0, void 0, function () {
|
|
664
|
+
var notesCfg, previousTotals, addressSelected, request, resultSede_2, totalsChanged, e_3;
|
|
665
|
+
var _this = this;
|
|
666
|
+
return __generator(this, function (_a) {
|
|
667
|
+
switch (_a.label) {
|
|
668
|
+
case 0:
|
|
669
|
+
if (this.canCompleteLegacyAddressOnlyCheckout()) {
|
|
670
|
+
this.nextStep();
|
|
671
|
+
return [2 /*return*/];
|
|
672
|
+
}
|
|
673
|
+
notesCfg = this.addressingService.getTypeForm().viewForms.notes;
|
|
674
|
+
if (notesCfg.required && (!this.addressBookSelected.notes || !this.addressBookSelected.notes.trim())) {
|
|
675
|
+
this.toast.show('required-fields');
|
|
676
|
+
return [2 /*return*/];
|
|
677
|
+
}
|
|
678
|
+
previousTotals = __assign({}, this.lastSummaryTotalsSnapshot);
|
|
679
|
+
this.loading = true;
|
|
680
|
+
_a.label = 1;
|
|
681
|
+
case 1:
|
|
682
|
+
_a.trys.push([1, 3, 4, 5]);
|
|
683
|
+
addressSelected = this.addressBook.find(function (address) { return address.selected; });
|
|
684
|
+
if (!addressSelected) {
|
|
685
|
+
this.showError('invalid-form');
|
|
686
|
+
return [2 /*return*/];
|
|
687
|
+
}
|
|
688
|
+
if (!this.addressBookSelected.id)
|
|
689
|
+
this.addressBookSelected.id = addressSelected.id || 0;
|
|
690
|
+
request = {
|
|
691
|
+
shippingAddressId: addressSelected.id,
|
|
692
|
+
billingAddressId: addressSelected.id,
|
|
693
|
+
notes: this.addressBookSelected.notes || ""
|
|
694
|
+
};
|
|
695
|
+
return [4 /*yield*/, this.addressingService.setHeadquarterByIds(request)];
|
|
696
|
+
case 2:
|
|
697
|
+
resultSede_2 = _a.sent();
|
|
698
|
+
if (!resultSede_2) {
|
|
699
|
+
this.toast.show('operation-error');
|
|
700
|
+
return [2 /*return*/];
|
|
701
|
+
}
|
|
702
|
+
if (this.cartService.channelConfig.applyOrderLot) {
|
|
703
|
+
(items || []).forEach(function (item) {
|
|
704
|
+
var _a, _b, _c, _d;
|
|
705
|
+
if (!item.lot[0]) {
|
|
706
|
+
_this.cartService.addToLot(item.product, 0, item.variant_id, 0, item.item_id, item.quantity, item.product.price, item.quantity, item.discount, item.product.price * item.quantity, 'new', '', '', 0, ((_b = (_a = resultSede_2) === null || _a === void 0 ? void 0 : _a.shippingAddress) === null || _b === void 0 ? void 0 : _b.city) + ' - ' + ((_d = (_c = resultSede_2) === null || _c === void 0 ? void 0 : _c.shippingAddress) === null || _d === void 0 ? void 0 : _d.street), 'newlot');
|
|
707
|
+
}
|
|
708
|
+
});
|
|
709
|
+
}
|
|
710
|
+
this.form_ready = true;
|
|
711
|
+
this.allready_data = true;
|
|
712
|
+
this.setSavedStateFromCurrent();
|
|
713
|
+
totalsChanged = this.haveTotalsChanged(previousTotals, resultSede_2);
|
|
714
|
+
if (this.compactAddressView && this.nextStep) {
|
|
715
|
+
this.nextStep();
|
|
716
|
+
}
|
|
717
|
+
else if (this.isLegacyAddressOnlyCheckout()) {
|
|
718
|
+
totalsChanged && this.scrollToLegacySummary();
|
|
719
|
+
return [2 /*return*/];
|
|
720
|
+
}
|
|
721
|
+
else {
|
|
722
|
+
this.nextStep();
|
|
723
|
+
}
|
|
724
|
+
return [3 /*break*/, 5];
|
|
725
|
+
case 3:
|
|
726
|
+
e_3 = _a.sent();
|
|
727
|
+
this.toast.show('operation-error');
|
|
728
|
+
return [3 /*break*/, 5];
|
|
729
|
+
case 4:
|
|
730
|
+
this.loading = false;
|
|
731
|
+
return [7 /*endfinally*/];
|
|
732
|
+
case 5: return [2 /*return*/];
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
}); };
|
|
736
|
+
_this.onSelectAddressFacturacion = function (items) { return __awaiter(_this, void 0, void 0, function () {
|
|
737
|
+
var addressSelectedFacturacion, addressSelectedEnvio, previousTotals, request, resultSede, totalsChanged, e_4;
|
|
738
|
+
var _this = this;
|
|
739
|
+
return __generator(this, function (_a) {
|
|
740
|
+
switch (_a.label) {
|
|
741
|
+
case 0:
|
|
742
|
+
addressSelectedFacturacion = this.addressBook.find(function (address) { return address.selectedFacturacion; });
|
|
743
|
+
addressSelectedEnvio = this.addressBook.find(function (address) { return address.selected; });
|
|
744
|
+
if (!addressSelectedFacturacion || !addressSelectedEnvio) {
|
|
745
|
+
this.showError('invalid-form');
|
|
746
|
+
return [2 /*return*/];
|
|
747
|
+
}
|
|
748
|
+
previousTotals = __assign({}, this.lastSummaryTotalsSnapshot);
|
|
749
|
+
this.loading = true;
|
|
750
|
+
_a.label = 1;
|
|
751
|
+
case 1:
|
|
752
|
+
_a.trys.push([1, 3, 4, 5]);
|
|
753
|
+
this.addressBookSelected.id = addressSelectedEnvio.id || 0;
|
|
754
|
+
this.addressBookSelectedFacturacion.id = addressSelectedFacturacion.id || 0;
|
|
755
|
+
request = {
|
|
756
|
+
shippingAddressId: addressSelectedEnvio.id,
|
|
757
|
+
billingAddressId: addressSelectedFacturacion.id,
|
|
758
|
+
notes: this.addressBookSelected.notes || ""
|
|
759
|
+
};
|
|
760
|
+
return [4 /*yield*/, this.addressingService.setHeadquarterByIds(request)];
|
|
761
|
+
case 2:
|
|
762
|
+
resultSede = _a.sent();
|
|
763
|
+
if (!resultSede) {
|
|
764
|
+
this.toast.show('operation-error');
|
|
765
|
+
return [2 /*return*/];
|
|
766
|
+
}
|
|
767
|
+
if (this.cartService.channelConfig.applyOrderLot) {
|
|
768
|
+
(items || []).forEach(function (item) {
|
|
769
|
+
if (!item.lot[0]) {
|
|
770
|
+
_this.cartService.addToLot(item.product, 0, item.variant_id, 0, item.item_id, item.quantity, item.product.price, item.quantity, item.discount, item.product.price * item.quantity, 'new', '', '', 0, addressSelectedEnvio.city + ' - ' + addressSelectedEnvio.street, 'newlot');
|
|
771
|
+
}
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
this.form_ready = true;
|
|
775
|
+
this.allready_data = true;
|
|
776
|
+
this.setSavedStateFromCurrent();
|
|
777
|
+
totalsChanged = this.haveTotalsChanged(previousTotals, resultSede);
|
|
778
|
+
if (this.compactAddressView && this.nextStep) {
|
|
779
|
+
this.nextStep();
|
|
780
|
+
}
|
|
781
|
+
else if (this.isLegacyAddressOnlyCheckout()) {
|
|
782
|
+
totalsChanged && this.scrollToLegacySummary();
|
|
783
|
+
return [2 /*return*/];
|
|
784
|
+
}
|
|
785
|
+
else {
|
|
786
|
+
this.nextStep();
|
|
787
|
+
}
|
|
788
|
+
return [3 /*break*/, 5];
|
|
789
|
+
case 3:
|
|
790
|
+
e_4 = _a.sent();
|
|
791
|
+
this.toast.show('operation-error');
|
|
792
|
+
return [3 /*break*/, 5];
|
|
793
|
+
case 4:
|
|
794
|
+
this.loading = false;
|
|
795
|
+
return [7 /*endfinally*/];
|
|
796
|
+
case 5: return [2 /*return*/];
|
|
797
|
+
}
|
|
798
|
+
});
|
|
799
|
+
}); };
|
|
800
|
+
_this.onSubmitNewBillingAddress = function (items) { return __awaiter(_this, void 0, void 0, function () {
|
|
801
|
+
var addressSelectedEnvio, previousTotals, billingFormData, addressData, result, totalsChanged, e_5;
|
|
802
|
+
var _this = this;
|
|
803
|
+
var _a;
|
|
804
|
+
return __generator(this, function (_b) {
|
|
805
|
+
switch (_b.label) {
|
|
806
|
+
case 0:
|
|
807
|
+
if (!this.checkoutFormFacturacion.valid) {
|
|
808
|
+
this.showError('invalid-form');
|
|
809
|
+
return [2 /*return*/];
|
|
810
|
+
}
|
|
811
|
+
addressSelectedEnvio = this.addressBook.find(function (address) { return address.selected; });
|
|
812
|
+
if (!addressSelectedEnvio) {
|
|
813
|
+
this.showError('invalid-form');
|
|
814
|
+
return [2 /*return*/];
|
|
815
|
+
}
|
|
816
|
+
previousTotals = __assign({}, this.lastSummaryTotalsSnapshot);
|
|
817
|
+
this.loading = true;
|
|
818
|
+
_b.label = 1;
|
|
819
|
+
case 1:
|
|
820
|
+
_b.trys.push([1, 3, 4, 5]);
|
|
821
|
+
billingFormData = __assign({}, this.checkoutFormFacturacion.getRawValue());
|
|
822
|
+
billingFormData.postcode = (_a = billingFormData.postcode) === null || _a === void 0 ? void 0 : _a.toString();
|
|
823
|
+
addressData = {
|
|
824
|
+
shippingAddress: this.buildAddressFromBook(addressSelectedEnvio),
|
|
825
|
+
billingAddress: billingFormData,
|
|
826
|
+
notes: this.addressBookSelected.notes || ""
|
|
827
|
+
};
|
|
828
|
+
return [4 /*yield*/, this.addressingService.setAddress(addressData)];
|
|
829
|
+
case 2:
|
|
830
|
+
result = _b.sent();
|
|
831
|
+
if (result === false) {
|
|
832
|
+
this.require_login = true;
|
|
833
|
+
this.toast.show('email_already_registered');
|
|
834
|
+
return [2 /*return*/];
|
|
835
|
+
}
|
|
836
|
+
if (result !== undefined) {
|
|
837
|
+
if (this.cartService.channelConfig.applyOrderLot) {
|
|
838
|
+
(items || []).forEach(function (item) {
|
|
839
|
+
if (!item.lot[0]) {
|
|
840
|
+
_this.cartService.addToLot(item.product, 0, item.variant_id, 0, item.item_id, item.quantity, item.product.price, item.quantity, item.discount, item.product.price * item.quantity, 'new', '', '', 0, addressSelectedEnvio.city + ' - ' + addressSelectedEnvio.street, 'newlot');
|
|
841
|
+
}
|
|
842
|
+
});
|
|
843
|
+
}
|
|
844
|
+
this.form_ready = true;
|
|
845
|
+
this.allready_data = true;
|
|
846
|
+
this.setSavedStateFromCurrent();
|
|
847
|
+
totalsChanged = this.haveTotalsChanged(previousTotals, result);
|
|
848
|
+
if (this.compactAddressView && this.nextStep) {
|
|
849
|
+
this.nextStep();
|
|
850
|
+
}
|
|
851
|
+
else if (this.isLegacyAddressOnlyCheckout()) {
|
|
852
|
+
totalsChanged && this.scrollToLegacySummary();
|
|
853
|
+
return [2 /*return*/];
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
this.nextStep();
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
return [3 /*break*/, 5];
|
|
860
|
+
case 3:
|
|
861
|
+
e_5 = _b.sent();
|
|
862
|
+
this.toast.show('operation-error');
|
|
863
|
+
return [3 /*break*/, 5];
|
|
864
|
+
case 4:
|
|
865
|
+
this.loading = false;
|
|
866
|
+
return [7 /*endfinally*/];
|
|
867
|
+
case 5: return [2 /*return*/];
|
|
868
|
+
}
|
|
869
|
+
});
|
|
870
|
+
}); };
|
|
560
871
|
_this.toggleAddressDropdown = function () {
|
|
561
872
|
_this.addressDropdownOpen = !_this.addressDropdownOpen;
|
|
562
873
|
};
|
|
@@ -890,24 +1201,26 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
890
1201
|
_this.updateDocumentValidation(selectedDoc);
|
|
891
1202
|
}
|
|
892
1203
|
}
|
|
1204
|
+
var selectedBillingCountry = _this.countriesFacturacionSubject.value.find(function (country) { return country.code == _this.checkoutFormFacturacion.controls['countryCode'].value; });
|
|
1205
|
+
_this.updatePostalCodeValidationFacturacion(selectedBillingCountry);
|
|
893
1206
|
_this.onFormChange();
|
|
894
1207
|
}
|
|
895
1208
|
_this.suppressDirty = false;
|
|
896
1209
|
_this.setDirtyState(false);
|
|
897
1210
|
};
|
|
898
1211
|
_this.ecOnConstruct();
|
|
899
|
-
_this.checkoutForm = _this.fb.group(__assign(__assign({}, _this.addressingService.getTypeForm().configForm.formAddres), { postcode: [''
|
|
900
|
-
}));
|
|
1212
|
+
_this.checkoutForm = _this.fb.group(__assign(__assign({}, _this.addressingService.getTypeForm().configForm.formAddres), { postcode: [''] }));
|
|
901
1213
|
_this.checkoutForm.statusChanges
|
|
902
1214
|
.pipe(filter(function () { _this.onFormChange(); return _this.checkoutForm.valid; }))
|
|
903
1215
|
.subscribe(function () { return _this.onFormValid(); });
|
|
904
1216
|
_this.checkoutForm.valueChanges.subscribe(function () { return _this.evaluateDirtyState(); });
|
|
905
|
-
_this.checkoutFormFacturacion = _this.fb.group(__assign(__assign({}, _this.addressingService.getTypeForm().configForm.formBilling), { postcode: [''
|
|
906
|
-
}));
|
|
1217
|
+
_this.checkoutFormFacturacion = _this.fb.group(__assign(__assign({}, _this.addressingService.getTypeForm().configForm.formBilling), { postcode: [''] }));
|
|
907
1218
|
_this.checkoutFormFacturacion.statusChanges
|
|
908
1219
|
.pipe(filter(function () { _this.onFormChange(); return _this.checkoutFormFacturacion.valid; }))
|
|
909
1220
|
.subscribe(function () { return _this.onFormValid(); });
|
|
910
1221
|
_this.checkoutFormFacturacion.valueChanges.subscribe(function () { return _this.evaluateDirtyState(); });
|
|
1222
|
+
_this.updatePostalCodeValidation(null);
|
|
1223
|
+
_this.updatePostalCodeValidationFacturacion(null);
|
|
911
1224
|
return _this;
|
|
912
1225
|
}
|
|
913
1226
|
DataFormEcComponent.prototype.ngOnInit = function () {
|
|
@@ -1014,10 +1327,48 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
1014
1327
|
form.controls[formControlName].updateValueAndValidity();
|
|
1015
1328
|
};
|
|
1016
1329
|
DataFormEcComponent.prototype.updatePostalCodeValidation = function (selectedCountry) {
|
|
1017
|
-
|
|
1330
|
+
var _a, _b;
|
|
1331
|
+
var country = this.resolveCountryForPostalCode(selectedCountry);
|
|
1332
|
+
var _c = country
|
|
1333
|
+
? this.resolvePostalCodeFieldState(country)
|
|
1334
|
+
: this.getDefaultPostalCodeFieldState(), visible = _c.visible, required = _c.required;
|
|
1335
|
+
var isNumeric = (_b = (_a = country) === null || _a === void 0 ? void 0 : _a.isPostalCodeNumeric, (_b !== null && _b !== void 0 ? _b : false));
|
|
1336
|
+
var validators = [];
|
|
1337
|
+
if (required) {
|
|
1338
|
+
validators.push(Validators.required);
|
|
1339
|
+
}
|
|
1340
|
+
if (visible && isNumeric) {
|
|
1341
|
+
validators.push(Validators.pattern(/^\d+$/));
|
|
1342
|
+
}
|
|
1343
|
+
this.postalCodeVisible = visible;
|
|
1344
|
+
this.postalCodeRequired = required;
|
|
1345
|
+
this.postalCodeErrorMessage = isNumeric
|
|
1346
|
+
? 'postal-code-pattern-error.numeric'
|
|
1347
|
+
: 'postal-code-pattern-error.default';
|
|
1348
|
+
this.checkoutForm.controls['postcode'].setValidators(validators);
|
|
1349
|
+
this.checkoutForm.controls['postcode'].updateValueAndValidity({ emitEvent: false });
|
|
1018
1350
|
};
|
|
1019
1351
|
DataFormEcComponent.prototype.updatePostalCodeValidationFacturacion = function (selectedCountry) {
|
|
1020
|
-
|
|
1352
|
+
var _a, _b;
|
|
1353
|
+
var country = this.resolveCountryForPostalCode(selectedCountry);
|
|
1354
|
+
var _c = country
|
|
1355
|
+
? this.resolvePostalCodeFieldState(country)
|
|
1356
|
+
: this.getDefaultPostalCodeFieldState(), visible = _c.visible, required = _c.required;
|
|
1357
|
+
var isNumeric = (_b = (_a = country) === null || _a === void 0 ? void 0 : _a.isPostalCodeNumeric, (_b !== null && _b !== void 0 ? _b : false));
|
|
1358
|
+
var validators = [];
|
|
1359
|
+
if (required) {
|
|
1360
|
+
validators.push(Validators.required);
|
|
1361
|
+
}
|
|
1362
|
+
if (visible && isNumeric) {
|
|
1363
|
+
validators.push(Validators.pattern(/^\d+$/));
|
|
1364
|
+
}
|
|
1365
|
+
this.postalCodeVisibleFacturacion = visible;
|
|
1366
|
+
this.postalCodeRequiredFacturacion = required;
|
|
1367
|
+
this.postalCodeErrorMessageFacturacion = isNumeric
|
|
1368
|
+
? 'postal-code-pattern-error.numeric'
|
|
1369
|
+
: 'postal-code-pattern-error.default';
|
|
1370
|
+
this.checkoutFormFacturacion.controls['postcode'].setValidators(validators);
|
|
1371
|
+
this.checkoutFormFacturacion.controls['postcode'].updateValueAndValidity({ emitEvent: false });
|
|
1021
1372
|
};
|
|
1022
1373
|
DataFormEcComponent.prototype.updateDocumentValidation = function (selectedDocumentType) {
|
|
1023
1374
|
this.updateValidation(selectedDocumentType, 'documentNumber', this.checkoutForm, 'documentErrorMessage', 'isNumeric', 'document-pattern-error', this.addressingService.getTypeForm().viewForms.documentNumber.required);
|
|
@@ -1059,7 +1410,7 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
1059
1410
|
DataFormEcComponent = __decorate([
|
|
1060
1411
|
Component({
|
|
1061
1412
|
selector: 'app-dataform-ec',
|
|
1062
|
-
template: "<ng-container\n *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n <ng-container\n *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null && !compactAddressView\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\"\n *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\"\n *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compactAddressView || getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n <div class=\"single-step-surface\">\n <div class=\"single-step-overlay\" *ngIf=\"compactAddressView && loading\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <app-dataform-ec-single\n *ngIf=\"compactAddressView\"\n [showToggle]=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\"\n [isNewAddressMode]=\"getMode()\"\n [showDefaultNewAddressButton]=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\"\n [customNewAddressLabel]=\"getParamByChannelAndLanguage('btn_new_address_')?.value\"\n [isTemporarySelected]=\"selectedAddress?.isTemporary\"\n [selectedAddressLabel]=\"getSelectedAddressLabel()\"\n [addressDropdownOpen]=\"addressDropdownOpen\"\n [addressSearch]=\"addressSearch\"\n [addressOptions]=\"getFilteredAddressOptions()\"\n [showSelectBlock]=\"!getMode()\"\n [hasSelectedAddress]=\"hasSelectedAddress()\"\n (modeChange)=\"setMode($event)\"\n (toggleDropdown)=\"toggleAddressDropdown()\"\n (closeDropdown)=\"addressDropdownOpen = false\"\n (selectAddress)=\"selectAddressFromDropdown($event)\"\n (addressSearchChange)=\"addressSearch = $event\">\n </app-dataform-ec-single>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\"\n [class.compact-address-form]=\"compactAddressView\"\n *ngIf=\"!compactAddressView || getMode() || hasSelectedAddress()\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.countryCode.dirty || checkoutForm.controls.countryCode.touched) && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.provinceCode.dirty || checkoutForm.controls.provinceCode.touched) && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.city.dirty || checkoutForm.controls.city.touched) && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span>\n <span class=\"char-count\">\n {{ 50 - (checkoutForm.controls['street'].value?.length || 0) }}\n {{'remainingCharacters'|translate}}\n </span>\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFull\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnly\">\n <div class=\"form-group col-12\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdown($event)\"\n [attr.aria-expanded]=\"documentTypeDropdownOpen\"\n [disabled]=\"checkoutForm.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabel(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentType(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnly>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFull>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a' && !(compactAddressView && !getMode())\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" rows=\"3\" placeholder=\"\"\n autocomplete=\"off\"></textarea>\n </div>\n </div>\n <div class=\"row mt-df address-meta-row\" *ngIf=\"!(compactAddressView && !getMode())\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df address-required-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"col-12\">\n <span class=\"required-hint-text\">\n <span class=\"required-hint-asterisk\">*</span> {{ 'required-fields' | translate }}\n </span>\n </div>\n </div>\n <div class=\"row mt-df address-terms-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <label class=\"terms-label\" for=\"\">\n <input class=\"me-2\" name=\"terms\" [formControl]=\"checkoutForm.controls['terms']\"\n type=\"checkbox\" required (change)=\"onInputChange()\" />\n <span>{{ 'accept-terms-prefix' | translate }}</span>\n <button type=\"button\" class=\"terms-link\" (click)=\"openModal(template)\">\n {{ 'terms-and-conditions' | translate }}\n </button>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n </label>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.terms.dirty || checkoutForm.controls.terms.touched) && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\" *ngIf=\"!formReadonly\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}</button>\n\n\n </div>\n <div *ngIf=\"loading && !compactAddressView\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n <ng-container *ngIf=\"compactAddressView && !getMode()\">\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <textarea (change)=\"onSelectionNotesChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" rows=\"3\"\n placeholder=\"\" autocomplete=\"off\" [disabled]=\"selectedAddress?.isTemporary\"></textarea>\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <ng-container *ngIf=\"compactAddressView; else addressCardFull\">\n <div class=\"address-card-compact\" [class.is-selected]=\"item.selected\"\n (click)=\"setSelectAddress(item); onInputChange()\">\n <label class=\"address-card-radio\">\n <input class=\"form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n </label>\n <div class=\"address-card-content\">\n <div class=\"address-card-main\">\n <div class=\"address-card-title\">{{ item.street }}</div>\n <div class=\"address-card-sub\">\n {{ item.city }} - {{ getProvince(item.provinceCode) }} - {{ getCountry(item.countryCode) }}\n </div>\n <div class=\"address-card-sub\">\n {{ 'postal-code' | translate }} {{ item.postcode }}\n </div>\n </div>\n <details class=\"address-card-details\" (click)=\"$event.stopPropagation()\">\n <summary>{{ 'details' | translate }}</summary>\n <div class=\"address-card-details-body\">\n <div class=\"address-card-detail-title\">{{ 'address-contact' | translate }}</div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'first-name' | translate }}</strong> {{ item.addressContact.firstName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'last-name' | translate }}</strong> {{ item.addressContact.lastName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-type' | translate }}</strong> {{ getDocumentType(item.addressContact.documentType) }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-number' | translate }}</strong> {{ item.addressContact.documentNumber }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'email-address' | translate }}</strong> {{ item.addressContact.email }}\n </div>\n </div>\n </details>\n </div>\n </div>\n </ng-container>\n <ng-template #addressCardFull>\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n </div>\n <!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"checkout-btn-unique text-end\">\n <button (click)=\"selectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-template>\n\n\n <ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"verifyValidate()\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.countryCode.dirty || checkoutFormFacturacion.controls.countryCode.touched) && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.provinceCode.dirty || checkoutFormFacturacion.controls.provinceCode.touched) && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.city.dirty || checkoutFormFacturacion.controls.city.touched) && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"postcode\" [formControl]=\"checkoutFormFacturacion.controls['postcode']\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{postalCodeErrorMessage |translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFullFacturacion\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnlyFacturacion\">\n <div class=\"form-group col-12\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdownFacturacion($event)\"\n [attr.aria-expanded]=\"documentTypeFactDropdownOpen\"\n [disabled]=\"checkoutFormFacturacion.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabelFacturacion(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeFactDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentTypeFacturacion(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnlyFacturacion>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFullFacturacion>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">\n {{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n </ng-template>\n </div>\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\"\n *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\n <div [innerHTML]=\"labelNotesHtml.value\"></div> \n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [formControl]=\"checkoutFormFacturacion.controls['notes']\"\n rows=\"3\" placeholder=\"\" autocomplete=\"off\"></textarea>\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n </ng-template>\n\n\n <ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>\n",
|
|
1413
|
+
template: "<ng-container\n *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n <ng-container\n *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null && !compactAddressView\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\"\n *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\"\n *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compactAddressView || getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n <div class=\"single-step-surface\">\n <div class=\"single-step-overlay\" *ngIf=\"compactAddressView && loading\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <app-dataform-ec-single\n *ngIf=\"compactAddressView\"\n [showToggle]=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\"\n [isNewAddressMode]=\"getMode()\"\n [showDefaultNewAddressButton]=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\"\n [customNewAddressLabel]=\"getParamByChannelAndLanguage('btn_new_address_')?.value\"\n [isTemporarySelected]=\"selectedAddress?.isTemporary\"\n [selectedAddressLabel]=\"getSelectedAddressLabel()\"\n [addressDropdownOpen]=\"addressDropdownOpen\"\n [addressSearch]=\"addressSearch\"\n [addressOptions]=\"getFilteredAddressOptions()\"\n [showSelectBlock]=\"!getMode()\"\n [hasSelectedAddress]=\"hasSelectedAddress()\"\n (modeChange)=\"setMode($event)\"\n (toggleDropdown)=\"toggleAddressDropdown()\"\n (closeDropdown)=\"addressDropdownOpen = false\"\n (selectAddress)=\"selectAddressFromDropdown($event)\"\n (addressSearchChange)=\"addressSearch = $event\">\n </app-dataform-ec-single>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\"\n [class.compact-address-form]=\"compactAddressView\"\n *ngIf=\"!compactAddressView || getMode() || hasSelectedAddress()\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.countryCode.dirty || checkoutForm.controls.countryCode.touched) && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.provinceCode.dirty || checkoutForm.controls.provinceCode.touched) && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.city.dirty || checkoutForm.controls.city.touched) && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span>\n <span class=\"char-count\">\n {{ 50 - (checkoutForm.controls['street'].value?.length || 0) }}\n {{'remainingCharacters'|translate}}\n </span>\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible()\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired()\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFull\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnly\">\n <div class=\"form-group col-12\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdown($event)\"\n [attr.aria-expanded]=\"documentTypeDropdownOpen\"\n [disabled]=\"checkoutForm.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabel(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentType(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnly>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFull>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a' && !(compactAddressView && !getMode())\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" rows=\"3\" placeholder=\"\"\n autocomplete=\"off\"></textarea>\n </div>\n </div>\n <div class=\"row mt-df address-meta-row\" *ngIf=\"!(compactAddressView && !getMode())\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df address-required-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"col-12\">\n <span class=\"required-hint-text\">\n <span class=\"required-hint-asterisk\">*</span> {{ 'required-fields' | translate }}\n </span>\n </div>\n </div>\n <div class=\"row mt-df address-terms-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <label class=\"terms-label\" for=\"\">\n <input class=\"me-2\" name=\"terms\" [formControl]=\"checkoutForm.controls['terms']\"\n type=\"checkbox\" required (change)=\"onInputChange()\" />\n <span>{{ 'accept-terms-prefix' | translate }}</span>\n <button type=\"button\" class=\"terms-link\" (click)=\"openModal(template)\">\n {{ 'terms-and-conditions' | translate }}\n </button>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n </label>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.terms.dirty || checkoutForm.controls.terms.touched) && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\" *ngIf=\"!formReadonly\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}</button>\n\n\n </div>\n <div *ngIf=\"loading && !compactAddressView\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n <ng-container *ngIf=\"compactAddressView && !getMode()\">\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <textarea (change)=\"onSelectionNotesChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" rows=\"3\"\n placeholder=\"\" autocomplete=\"off\" [disabled]=\"selectedAddress?.isTemporary\"></textarea>\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <ng-container *ngIf=\"compactAddressView; else addressCardFull\">\n <div class=\"address-card-compact\" [class.is-selected]=\"item.selected\"\n (click)=\"setSelectAddress(item); onInputChange()\">\n <label class=\"address-card-radio\">\n <input class=\"form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n </label>\n <div class=\"address-card-content\">\n <div class=\"address-card-main\">\n <div class=\"address-card-title\">{{ item.street }}</div>\n <div class=\"address-card-sub\">\n {{ item.city }} - {{ getProvince(item.provinceCode) }} - {{ getCountry(item.countryCode) }}\n </div>\n <div class=\"address-card-sub\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n {{ 'postal-code' | translate }} {{ item.postcode }}\n </div>\n </div>\n <details class=\"address-card-details\" (click)=\"$event.stopPropagation()\">\n <summary>{{ 'details' | translate }}</summary>\n <div class=\"address-card-details-body\">\n <div class=\"address-card-detail-title\">{{ 'address-contact' | translate }}</div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'first-name' | translate }}</strong> {{ item.addressContact.firstName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'last-name' | translate }}</strong> {{ item.addressContact.lastName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-type' | translate }}</strong> {{ getDocumentType(item.addressContact.documentType) }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-number' | translate }}</strong> {{ item.addressContact.documentNumber }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'email-address' | translate }}</strong> {{ item.addressContact.email }}\n </div>\n </div>\n </details>\n </div>\n </div>\n </ng-container>\n <ng-template #addressCardFull>\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n </div>\n <!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"row mt-df\"><!--Direcci\u00F3n de facturaci\u00F3n-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFactSelection\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFactSelection\"></label>\n </div>\n </div>\n <ng-container *ngIf=\"!viewDataFacturacion\">\n <!-- Selector de modo para direcci\u00F3n de facturaci\u00F3n -->\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption1\" autocomplete=\"off\"\n [checked]=\"!getModeFacturacion()\" (change)=\"setModeFacturacion('seleccion')\">\n {{'select-address' | translate | titlecase}}\n </label>\n <label [class]=\"'btn btn-outline-secondary ' + (getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption2\" autocomplete=\"off\"\n [checked]=\"getModeFacturacion()\" (change)=\"setModeFacturacion('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n </div>\n </div>\n </div>\n </div>\n <!-- Formulario de nueva direcci\u00F3n de facturaci\u00F3n -->\n <ng-container *ngIf=\"getModeFacturacion()\">\n <ng-container *ngTemplateOutlet=\"datosFormFacturacion\"></ng-container>\n </ng-container>\n <!-- Selecci\u00F3n de direcci\u00F3n de facturaci\u00F3n del address book -->\n <ng-container *ngIf=\"!getModeFacturacion()\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'billing-'+i\"\n [id]=\"'billing-'+i\" [checked]=\"item.selectedFacturacion\"\n (click)=\"setSelectAddressFacturacion(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <div class=\"checkout-btn-unique text-end\">\n <button *ngIf=\"!viewDataFacturacion && !getModeFacturacion()\"\n (click)=\"onSelectAddressFacturacion(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"!addressBookSelectedFacturacion.id\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"!viewDataFacturacion && getModeFacturacion()\"\n (click)=\"onSubmitNewBillingAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"checkoutFormFacturacion.invalid\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"viewDataFacturacion\"\n (click)=\"onSelectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-template>\n\n\n <ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"handleBillingFormSubmit($event)\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.countryCode.dirty || checkoutFormFacturacion.controls.countryCode.touched) && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.provinceCode.dirty || checkoutFormFacturacion.controls.provinceCode.touched) && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.city.dirty || checkoutFormFacturacion.controls.city.touched) && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible(true)\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired(true)\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"postcode\" [formControl]=\"checkoutFormFacturacion.controls['postcode']\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{postalCodeErrorMessageFacturacion |translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFullFacturacion\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnlyFacturacion\">\n <div class=\"form-group col-12\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdownFacturacion($event)\"\n [attr.aria-expanded]=\"documentTypeFactDropdownOpen\"\n [disabled]=\"checkoutFormFacturacion.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabelFacturacion(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeFactDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentTypeFacturacion(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnlyFacturacion>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFullFacturacion>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">\n {{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n </ng-template>\n </div>\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\"\n *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\n <div [innerHTML]=\"labelNotesHtml.value\"></div> \n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [formControl]=\"checkoutFormFacturacion.controls['notes']\"\n rows=\"3\" placeholder=\"\" autocomplete=\"off\"></textarea>\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n </ng-template>\n\n\n <ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>\n",
|
|
1063
1414
|
providers: [BsModalService],
|
|
1064
1415
|
styles: ["@charset \"UTF-8\";.btn.valid-btn{background-color:var(--ec-primary,#000);border-color:var(--ec-primary,#000);color:var(--ec-primary-contrast,#fff);margin-right:-3px;margin-bottom:10px}.btn.valid-btn:disabled,.btn.valid-btn[disabled]{background-color:var(--ec-primary-muted,#6c757d);border-color:var(--ec-primary-muted,#6c757d);color:var(--ec-primary-contrast,#fff);opacity:.8}.mt-df{margin:10px auto 0}.btn.btn-outline-secondary.active,.btn.btn-outline-secondary:hover{color:#fff!important}.required{color:red}.address-required-row .required-hint-text{color:#6b6b6b;font-size:.85rem;font-weight:500;letter-spacing:.01em}.address-required-row .required-hint-asterisk{color:#6b6b6b;font-weight:700}.field-label{color:#000}:host-context(#appCheckoutEc) .field-label{font-weight:700}:host-context(#appCheckoutEc) .address-meta-row b,:host-context(#appCheckoutEc) .address-terms-row label{font-weight:400}.terms-label{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.35rem}.terms-link{background:0 0;border:0;padding:0;color:inherit;text-decoration:underline;cursor:pointer}.form-control.ng-dirty.ng-invalid,.form-control.ng-touched.ng-invalid{border-color:#dc3545;box-shadow:0 0 0 .15rem rgba(220,53,69,.18)}.form-control.ng-dirty.ng-valid,.form-control.ng-touched.ng-valid{border-color:#16a34a;box-shadow:0 0 0 .15rem rgba(22,163,74,.15)}.char-count{margin-left:.35rem;font-size:.78rem;font-weight:400;color:#888;white-space:nowrap}.notes-textarea{min-height:120px;max-height:240px;resize:vertical;max-width:100%}.compact-address-form .valid-btn{font-size:1rem;padding:.7rem 1.1rem;letter-spacing:.02em}.document-input-group{position:relative;align-items:stretch}.document-input-group .dropdown-menu{max-height:240px;overflow-y:auto}.document-input-group .dropdown-toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;min-height:100%;border-color:#ced4da;color:#495057}.document-input-group .form-control{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}:host-context(#appCheckoutEc) .checkout-btn-unique{display:flex;justify-content:flex-end}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{display:block;margin-left:auto;width:56%;max-width:360px;min-width:220px}@media screen and (max-width:992px){:host-context(#appCheckoutEc) .checkout-btn-unique{justify-content:stretch}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{width:100%;min-width:0}.address-required-row .required-hint-text{font-size:.82rem}}:host-context(#appCheckoutEc) .valid-btn{text-transform:uppercase}label{color:#000}#appCheckoutEc .checkout-single .btn-group-toggle{border:1px solid #e3e3e3;border-radius:6px;overflow:hidden}#appCheckoutEc .checkout-single .btn-group-toggle .btn{border-radius:0!important;font-weight:600;padding:.55rem 1rem;border-left:1px solid #e3e3e3}#appCheckoutEc .checkout-single .btn-group-toggle .btn:first-child{border-left:0}.input-size-lg{width:1.8rem;height:1.8rem}.address-card-compact{display:flex;gap:.75rem;border:1px solid #e3e3e3;border-radius:6px;padding:.75rem;background:#fff;align-items:flex-start;cursor:pointer;transition:border-color .2s,box-shadow .2s}.address-card-compact.is-selected{border-color:#000;box-shadow:0 0 0 1px #000 inset}.address-card-compact:hover{border-color:#444}.address-card-radio{margin-top:.25rem}.address-card-content{flex:1;display:flex;flex-direction:column;gap:.35rem}.address-card-title{font-weight:600;font-size:1rem}.address-card-sub{color:#666;font-size:.9rem}.address-card-details{margin-top:.5rem}.address-card-details summary{cursor:pointer;color:#000;font-weight:600;font-size:.9rem;list-style:none;display:inline-flex;align-items:center;gap:.35rem}.address-card-details summary::-webkit-details-marker{display:none}.address-card-details summary::before{content:\"\u25B8\";font-size:.85rem}.address-card-details[open] summary::before{content:\"\u25BE\"}.address-card-details-body{margin-top:.5rem;padding:.5rem;background:#f8f8f8;border-radius:6px}.address-card-detail-title{font-weight:600;margin-bottom:.25rem}.address-card-detail-line{font-size:.9rem;color:#555}.single-step-surface{position:relative}.single-step-overlay{position:absolute;inset:0;background:rgba(255,255,255,.6);display:flex;align-items:center;justify-content:center;z-index:5}.compact-address-form .address-meta-row,.compact-address-form .address-required-row,.compact-address-form .address-terms-row{margin-top:.4rem}.compact-address-form .address-meta-row label,.compact-address-form .address-terms-row label{display:inline-flex;align-items:center;gap:.4rem;margin-bottom:0;font-weight:600}.compact-address-form .address-terms-row a{margin-left:0!important;display:inline-block;font-size:.85rem}.compact-address-form .address-terms-row .text-danger-container{margin-top:.35rem}"]
|
|
1065
1416
|
})
|
|
@@ -1067,4 +1418,4 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
1067
1418
|
return DataFormEcComponent;
|
|
1068
1419
|
}(ComponentHelper));
|
|
1069
1420
|
export { DataFormEcComponent };
|
|
1070
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrQyxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBa0J4RTtJQUF5Qyx1Q0FBZTtJQWlFcEQsNkJBQW1CLFdBQXdCLEVBQ2hDLEVBQWUsRUFDZixLQUFtQixFQUNuQixpQkFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsZUFBZ0MsRUFDL0IsVUFBK0IsRUFDL0IsWUFBNEIsRUFDN0IsYUFBZ0MsRUFDaEMsTUFBaUIsRUFDakIsYUFBbUM7UUFWOUMsWUFXSSxpQkFBTyxTQXFCVjtRQWhDa0IsaUJBQVcsR0FBWCxXQUFXLENBQWE7UUFDaEMsUUFBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFdBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsdUJBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxpQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixxQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDL0IsZ0JBQVUsR0FBVixVQUFVLENBQXFCO1FBQy9CLGtCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUM3QixtQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDaEMsWUFBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixtQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUF4RXJDLGVBQVMsR0FBWSxLQUFLLENBQUM7UUFFM0Isd0JBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ25DLGlCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUUxQyxzQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUNsRCxzQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUNsRCwwQkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUN0RCxpQ0FBMkIsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUM3RCxpQ0FBMkIsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUM3RCxxQ0FBK0IsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUVwRSxnQkFBVSxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxnQkFBVSxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxvQkFBYyxHQUFHLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxRCwyQkFBcUIsR0FBRyxLQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEUsMkJBQXFCLEdBQUcsS0FBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hFLCtCQUF5QixHQUFHLEtBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVoRixtQkFBYSxHQUFHLEtBQUssQ0FBQztRQUd0QixhQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGdCQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLG1CQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLGlCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLHlCQUFtQixHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUE7UUFDMUMsWUFBTSxHQUFZLEtBQUssQ0FBQyxDQUFDLDBEQUEwRDtRQUVuRixjQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLHlCQUFtQixHQUFZLElBQUksQ0FBQztRQUdwQyxZQUFNLEdBQVEsRUFBRSxDQUFDO1FBQ2pCLGtCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLG1CQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLHlCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixrQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixxQkFBZSxHQUFRLElBQUksQ0FBQztRQUMzQixtQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVuQiw0QkFBc0IsR0FBVyxFQUFFLENBQUM7UUFDcEMsdUNBQWlDLEdBQVcsRUFBRSxDQUFDO1FBQy9DLDBCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUNsQyxxQ0FBK0IsR0FBVyxFQUFFLENBQUM7UUFDN0MsZ0NBQTBCLEdBQVksS0FBSyxDQUFDO1FBQzVDLDhCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyxrQ0FBNEIsR0FBRyxLQUFLLENBQUM7UUFDcEMsb0JBQWMsR0FBZSxJQUFJLENBQUM7UUFDbEMsYUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixtQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixnQ0FBMEIsR0FBRyxLQUFLLENBQUM7UUFDbkMsK0JBQXlCLEdBQTBCO1lBQ3ZELFFBQVEsRUFBRSxDQUFDO1lBQ1gsS0FBSyxFQUFFLENBQUM7WUFDUixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxTQUFTLEVBQUUsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1NBQ1gsQ0FBQztRQStHRjs7Ozs7OztXQU9HO1FBQ0sseUJBQW1CLEdBQUcsVUFBQyxTQUFnQjtZQUMzQywrQ0FBK0M7WUFDL0MsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksS0FBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxLQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNFLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxLQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQWxELENBQWtELENBQUMsQ0FBQzthQUMxRjtZQUNELDREQUE0RDtZQUM1RCxJQUFJLEtBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsS0FBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUE5QyxDQUE4QyxDQUFDLENBQUE7Z0JBQy9GLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDOUIsT0FBTyxpQkFBaUIsQ0FBQTtpQkFDM0I7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyw2RUFBNkUsQ0FBQyxDQUFBO29CQUM1RixPQUFPLFFBQVEsQ0FBQTtpQkFDbEI7YUFDSjtpQkFBTTtnQkFDSCxPQUFPLFFBQVEsQ0FBQTthQUNsQjtRQUNMLENBQUMsQ0FBQTtRQUVELHlCQUFtQixHQUFHO1lBQ2xCLEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQTtZQUNwRCxJQUFJLENBQUMsS0FBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUMzQixLQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFVBQUEsR0FBRzs7b0JBQ3BDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN2QixLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBQzFFLEtBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFFbkQsWUFBWTt3QkFDWixLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsT0FDMUQsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FDNUIsQ0FBQTt3QkFDRCxLQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsU0FBUyxDQUFDLENBQUE7d0JBRXhELFlBQVk7d0JBQ1osS0FBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLE9BQUMsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO3dCQUM3RixLQUFJLENBQUMsbUNBQW1DLE9BQUMsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ25FLEtBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLE9BQUMsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxhQUFhLENBQUMsQ0FBQTtxQkFDbkU7Z0JBQ0wsQ0FBQyxDQUFDLENBQUE7YUFDTDtZQUNELEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtZQUNuQixLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUN6QixPQUFPLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQTtRQUNuQyxDQUFDLENBQUE7UUFFRCxpQkFBVyxHQUFHO1FBQ2QsQ0FBQyxDQUFBO1FBZ0JELG1CQUFhLEdBQUc7WUFDWixLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFFRix1QkFBaUIsR0FBRyxVQUFDLEtBQUs7WUFDdEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkYsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFELEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUV4RCxJQUFJLGVBQWUsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFyQixDQUFxQixDQUFDLENBQUM7WUFFekYsSUFBSSxlQUFlLEVBQUU7Z0JBQ2pCLEtBQUksQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNwRDtZQUVELFdBQVc7WUFDWCxJQUFJLFNBQVMsR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFyQixDQUFxQixDQUFDLENBQUMsU0FBUztnQkFDNUUsQ0FBQztvQkFDRCxFQUFFLENBQUE7WUFDTixLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDbEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxRTtZQUVELGdCQUFnQjtZQUNoQixJQUFJLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5RTtZQUVELElBQUksb0JBQW9CLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxFQUE1RCxDQUE0RCxDQUFDLENBQUM7WUFDbkgsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsS0FBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDdkQ7UUFFTCxDQUFDLENBQUE7UUFFRCxrQ0FBNEIsR0FBRyxVQUFDLEtBQUs7WUFDakMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5RixLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRSxLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVuRSxJQUFJLGVBQWUsR0FBRyxLQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFyQixDQUFxQixDQUFDLENBQUM7WUFFcEcsSUFBSSxlQUFlLEVBQUU7Z0JBQ2pCLEtBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMvRDtZQUVELFlBQVk7WUFDWixJQUFJLFNBQVMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxLQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDbEIsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JGO1lBRUQsaUJBQWlCO1lBQ2pCLElBQUksYUFBYSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pFLEtBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUN0QixLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDekY7WUFFRCxJQUFJLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxFQUF2RSxDQUF1RSxDQUFDLENBQUM7WUFDOUgsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsS0FBSSxDQUFDLG1DQUFtQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDbEU7UUFDTCxDQUFDLENBQUM7UUFHRix5QkFBbUIsR0FBRyxVQUFDLEtBQUssSUFBSyxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFuRixDQUFtRixDQUFDO1FBRXJILG9DQUE4QixHQUFHLFVBQUMsS0FBSyxJQUFLLE9BQUEsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBOUYsQ0FBOEYsQ0FBQztRQUUzSSw2QkFBdUIsR0FBRyxVQUFDLEtBQUs7WUFDNUIsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUUsSUFBSSxvQkFBb0IsR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFqQixDQUFpQixDQUFDLENBQUM7WUFFMUYsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsS0FBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDdkQ7UUFDTCxDQUFDLENBQUM7UUFFRix3Q0FBa0MsR0FBRyxVQUFDLEtBQUs7WUFDdkMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV6RixJQUFJLG9CQUFvQixHQUFHLEtBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLEVBQWpCLENBQWlCLENBQUMsQ0FBQztZQUVyRyxJQUFJLG9CQUFvQixFQUFFO2dCQUN0QixLQUFJLENBQUMsbUNBQW1DLENBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUNsRTtRQUNMLENBQUMsQ0FBQztRQUVGLGtDQUE0QixHQUFHLFVBQUMsYUFBb0I7O1lBQ2hELElBQU0sT0FBTyxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNqRSxPQUFPLGFBQUEsYUFBYSwwQ0FBRSxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBbkIsQ0FBbUIsMkNBQUcsSUFBSSxLQUFJLEVBQUUsQ0FBQztRQUN2RSxDQUFDLENBQUE7UUFFRCw2Q0FBdUMsR0FBRyxVQUFDLGFBQW9COztZQUMzRCxJQUFNLE9BQU8sR0FBRyxLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM1RSxPQUFPLGFBQUEsYUFBYSwwQ0FBRSxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBbkIsQ0FBbUIsMkNBQUcsSUFBSSxLQUFJLEVBQUUsQ0FBQztRQUN2RSxDQUFDLENBQUE7UUFFRCxnQ0FBMEIsR0FBRyxVQUFDLEtBQWlCOztZQUMzQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQ0FBRSxRQUFRLEtBQUksS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDM0UsS0FBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsT0FBTzthQUNWO1lBQ0QsS0FBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsS0FBSSxDQUFDLHdCQUF3QixDQUFDO1lBQy9ELElBQUksS0FBSSxDQUFDLHdCQUF3QixFQUFFO2dCQUMvQixLQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO2FBQzdDO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsMkNBQXFDLEdBQUcsVUFBQyxLQUFpQjs7WUFDdEQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBQSxLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQ0FBRSxRQUFRLEtBQUksS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEYsS0FBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztnQkFDMUMsT0FBTzthQUNWO1lBQ0QsS0FBSSxDQUFDLDRCQUE0QixHQUFHLENBQUMsS0FBSSxDQUFDLDRCQUE0QixDQUFDO1lBQ3ZFLElBQUksS0FBSSxDQUFDLDRCQUE0QixFQUFFO2dCQUNuQyxLQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO2FBQ3pDO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsd0JBQWtCLEdBQUcsVUFBQyxJQUFZOztZQUM5QixJQUFJLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLDBDQUFFLFFBQVEsS0FBSSxLQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMzRSxLQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxPQUFPO2FBQ1Y7WUFDRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsS0FBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztRQUMxQyxDQUFDLENBQUE7UUFFRCxtQ0FBNkIsR0FBRyxVQUFDLElBQVk7O1lBQ3pDLElBQUksT0FBQSxLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQ0FBRSxRQUFRLEtBQUksS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEYsS0FBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztnQkFDMUMsT0FBTzthQUNWO1lBQ0QsS0FBSSxDQUFDLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLEtBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDOUMsQ0FBQyxDQUFBO1FBUUQsb0JBQWMsR0FBRyxVQUFPLENBQUMsRUFBRSxLQUFLOztnQkFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxFQUFFLEVBQUU7b0JBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDaEIsc0JBQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLEVBQUU7b0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUVwRztnQkFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO29CQUN6QixxREFBcUQ7b0JBQ3JELDJCQUEyQjtvQkFDM0IsMkJBQTJCO29CQUMzQiw4U0FBOFM7b0JBQzlTLFVBQVU7b0JBQ1YsUUFBUTtvQkFDUixJQUFJO29CQUNKLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFDckI7O29CQUNHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7OzthQUN0QyxDQUFBO1FBRUQsZUFBUyxHQUFHLFVBQUMsYUFBYSxJQUFPLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFckUsZ0JBQVUsR0FBRzs7Ozs7d0JBQ25CLElBQUksSUFBSSxDQUFDLG9DQUFvQyxFQUFFLEVBQUU7NEJBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDaEIsc0JBQU87eUJBQ1Y7d0JBQ0ssY0FBYyxnQkFBUSxJQUFJLENBQUMseUJBQXlCLENBQUUsQ0FBQzt3QkFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7d0JBQ2hCLElBQUksR0FBUSxFQUFFLGVBQWUsd0JBQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsS0FBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUN6TCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLOzRCQUFFLElBQUkseUJBQVEsSUFBSSxLQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLEdBQUUsQ0FBQzs7Ozt3QkFFdEoscUJBQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQTs7d0JBQXRELE1BQU0sR0FBRyxTQUE2Qzt3QkFFMUQsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFOzRCQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzs0QkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTt5QkFFOUM7NkJBQ0ksSUFBSSxNQUFNLEtBQUssS0FBSyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7NEJBQy9DLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBOzRCQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTs0QkFDekIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7NEJBQzFCLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDOzRCQUNyRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0NBQzNDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dDQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQ0FDakMsK0RBQStEO2dDQUMvRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDOzZCQUNwRTs0QkFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dDQUMxQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7NkJBQ25CO2lDQUFNLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUU7Z0NBQzNDLGFBQWEsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQ0FDOUMsc0JBQU87NkJBQ1Y7aUNBQU07Z0NBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOzZCQUNuQjt5QkFDSjs7Ozt3QkFHRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBOzs7d0JBRWxDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOzs7OzthQUU1QixDQUFBO1FBTUQsc0JBQWdCLEdBQUcsVUFBQyxhQUFrQjs7WUFDbEMsSUFBSSxhQUFhLElBQUksS0FBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsS0FBSyxhQUFhLENBQUMsRUFBRSxFQUFFO2dCQUNuRSxPQUFPO2FBQ1Y7WUFDRCxJQUFJLGFBQWEsV0FBSSxLQUFJLENBQUMsZUFBZSwwQ0FBRSxXQUFXLENBQUEsSUFBSSxhQUFhLENBQUMsRUFBRSxLQUFLLEtBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFO2dCQUNwRyxLQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUNqQztZQUNELElBQU0sVUFBVSxTQUFHLGFBQWEsMENBQUUsRUFBRSxDQUFDO1lBQ3JDLENBQUMsS0FBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPO2dCQUNwQyxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxRQUFRLEVBQWhCLENBQWdCLENBQUMsQ0FBQztZQUNuRixLQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLE9BQUEsZUFBZSwwQ0FBRSxFQUFFLEtBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksZUFBZSxFQUFFO2dCQUNqQixLQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDOUM7WUFDRCx5RUFBeUU7WUFDekUsS0FBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLEtBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksS0FBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQ2hDLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMxRDtRQUNMLENBQUMsQ0FBQTtRQW9FRCxtQkFBYSxHQUFHLFVBQU8sS0FBSyxFQUFFLGNBQThCO1lBQTlCLCtCQUFBLEVBQUEscUJBQThCOzs7Ozs7OzRCQUN4RCxJQUFJLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFO2dDQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ2hCLHNCQUFPOzZCQUNWOzRCQUNLLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQzs0QkFDdEUsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dDQUNsRyxJQUFJLGNBQWMsRUFBRTtvQ0FDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQ0FDdEM7Z0NBQ0Qsc0JBQU87NkJBQ1Y7NEJBRUssY0FBYyxnQkFBUSxJQUFJLENBQUMseUJBQXlCLENBQUUsQ0FBQzs0QkFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Ozs7NEJBRVosZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsT0FBTyxDQUFDLFFBQVEsRUFBaEIsQ0FBZ0IsQ0FBQyxDQUFBOzRCQUN4RSxJQUFJLENBQUMsZUFBZSxFQUFFO2dDQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dDQUM5QixzQkFBTzs2QkFDVjs0QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRTtnQ0FDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTs2QkFDeEQ7NEJBQ0ssZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0I7Z0NBQzNDLENBQUMsQ0FBQztvQ0FDRSxFQUFFLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7b0NBQy9CLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLEVBQUU7aUNBQzlDO2dDQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7NEJBQ3pCLE9BQU8sR0FBRztnQ0FDWixRQUFRLEVBQUUsZUFBZTtnQ0FDekIsZUFBZSxFQUFFLGVBQWU7NkJBQ25DLENBQUE7NEJBQ2tCLHFCQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUE7OzRCQUFqRSxlQUFhLFNBQW9EOzRCQUN2RSxJQUFJLENBQUMsWUFBVSxFQUFFO2dDQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0NBQ25DLHNCQUFPOzZCQUNWOzRCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFO2dDQUM5QyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO29DQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTt3Q0FDZCxLQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFlBQVUsQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLEtBQUssR0FBRyxZQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztxQ0FDOVI7Z0NBQ0wsQ0FBQyxDQUFDLENBQUM7NkJBQ047NEJBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7NEJBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDOzRCQUMxQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzs0QkFDMUIsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsWUFBVSxDQUFDLENBQUM7NEJBQ3pFLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0NBQzFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs2QkFDbkI7aUNBQU0sSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRTtnQ0FDM0MsYUFBYSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dDQUM5QyxzQkFBTzs2QkFDVjtpQ0FBTTtnQ0FDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7NkJBQ25COzs7OzRCQUVELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7Ozs0QkFFbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Ozs7OztTQUU1QixDQUFBO1FBRUQsYUFBTyxHQUFHO1lBQ04sUUFBUSxLQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzlDLEtBQUssbUJBQW1CO29CQUNwQixPQUFPLElBQUksQ0FBQTtnQkFDZixLQUFLLHdCQUF3QjtvQkFDekIsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUFFO3dCQUNwQyxPQUFPLEtBQUssQ0FBQTtxQkFDZjtvQkFDRCxPQUFPLElBQUksQ0FBQTtnQkFDZixLQUFLLDRCQUE0QjtvQkFDN0IsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUFFO3dCQUNwQyxPQUFPLEtBQUksQ0FBQyxZQUFZLENBQUE7cUJBQzNCO29CQUNELE9BQU8sSUFBSSxDQUFBO2FBQ2xCO1FBQ0wsQ0FBQyxDQUFBO1FBR0QsYUFBTyxHQUFHLFVBQUMsSUFBSTtZQUNYLEtBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQztZQUNwQyxLQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN6RSxLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUE7UUFFRCwyQkFBcUIsR0FBRztZQUNwQixLQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxLQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDekQsQ0FBQyxDQUFBO1FBRUQsK0JBQXlCLEdBQUcsVUFBQyxPQUFZO1lBQ3JDLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixLQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQTtRQUVELDRCQUFzQixHQUFHO1lBQ3JCLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLEtBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFO2dCQUNoQyxLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUNuRDtRQUNMLENBQUMsQ0FBQTtRQUVELDZCQUF1QixHQUFHOztZQUN0QixJQUFNLE9BQU8sR0FBRyxLQUFJLENBQUMsZUFBZSxXQUFJLEtBQUksQ0FBQyxXQUFXLDBDQUFFLElBQUksQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxRQUFRLEVBQWIsQ0FBYSxFQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxLQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNwRCxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxJQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0UsSUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5RSxPQUFPLElBQUksSUFBSSxLQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUE7UUFFRCwyQkFBcUIsR0FBRyxVQUFDLE9BQVk7O1lBQ2pDLElBQU0sT0FBTyxHQUFHLE9BQUEsT0FBTywwQ0FBRSxjQUFjLEtBQUksRUFBRSxDQUFDO1lBQzlDLElBQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RSxPQUFPLENBQUMsSUFBSSxRQUFFLE9BQU8sMENBQUUsTUFBTSxRQUFFLE9BQU8sMENBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUE7UUFFRCw2QkFBdUIsR0FBRzs7WUFDdEIsSUFBSSxLQUFJLENBQUMsa0JBQWtCO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sT0FBQSxLQUFJLENBQUMsV0FBVywwQ0FBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxNQUFNLEtBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxDQUFDLENBQUE7UUFFRCxnQkFBVSxHQUFHLFVBQUMsSUFBSSxZQUFLLE9BQUEsT0FBQSxLQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBbEUsQ0FBa0UsQ0FBQywwQ0FBRSxJQUFJLEtBQUksRUFBRSxDQUFBLEVBQUEsQ0FBQTtRQUUxSixpQkFBVyxHQUFHLFVBQUMsSUFBSSxZQUFLLE9BQUEsT0FBQSxLQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFmLENBQWUsQ0FBQywwQ0FBRSxJQUFJLEtBQUksRUFBRSxDQUFBLEVBQUEsQ0FBQTtRQUVuRyxxQkFBZSxHQUFHLFVBQUMsSUFBSSxZQUFLLE9BQUEsT0FBQSxLQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFmLENBQWUsQ0FBQywwQ0FBRSxJQUFJLEtBQUksRUFBRSxDQUFBLEVBQUEsQ0FBQTtRQUV4Ryx3QkFBa0IsR0FBRyxjQUFNLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsTUFBTSxFQUFFLGNBQWMsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFwSCxDQUFvSCxDQUFBO1FBRS9JLGtDQUE0QixHQUFHLFVBQUMsU0FBUyxJQUFLLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUEvRyxDQUErRyxDQUFBO1FBRTdKLDRCQUFzQixHQUFHO1lBQ3JCLElBQUksQ0FBQyxLQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7Z0JBQy9DLE9BQU8sRUFBRSxDQUFDO2FBQ2I7WUFDRCxJQUFNLElBQUksR0FBRyxDQUFDLEtBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDUCxPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUM7YUFDM0I7WUFDRCxPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQUEsT0FBTztnQkFDbEMsSUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7Z0JBQzdDLElBQU0sUUFBUSxHQUFHO29CQUNiLE9BQU8sQ0FBQyxNQUFNO29CQUNkLE9BQU8sQ0FBQyxJQUFJO29CQUNaLE9BQU8sQ0FBQyxRQUFRO29CQUNoQixPQUFPLENBQUMsV0FBVztvQkFDbkIsT0FBTyxDQUFDLFlBQVk7b0JBQ3BCLEtBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztvQkFDcEMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO29CQUN0QyxPQUFPLENBQUMsU0FBUztvQkFDakIsT0FBTyxDQUFDLFFBQVE7b0JBQ2hCLE9BQU8sQ0FBQyxLQUFLO2lCQUNoQjtxQkFDSSxNQUFNLENBQUMsT0FBTyxDQUFDO3FCQUNmLElBQUksQ0FBQyxHQUFHLENBQUM7cUJBQ1QsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQTtRQUVELCtCQUF5QixHQUFHO1lBQ3hCLE9BQU8sS0FBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsR0FBRyxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsdUJBQzdDLE9BQU8sS0FDVixLQUFLLEVBQUUsS0FBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxJQUM1QyxFQUhrRCxDQUdsRCxDQUFDLENBQUM7UUFDUixDQUFDLENBQUE7UUFFRCx3QkFBa0IsR0FBRyxzQkFBTSxPQUFBLENBQUMsUUFBQyxLQUFJLENBQUMsV0FBVywwQ0FBRSxJQUFJLENBQUMsVUFBQSxJQUFJLHlCQUFJLElBQUksMENBQUUsUUFBUSxHQUFBLEVBQUMsQ0FBQSxFQUFBLENBQUM7UUFFcEUsMEJBQW9CLEdBQUcsVUFBQyxPQUFZOztZQUN4QyxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPO1lBQ3JCLEtBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLEtBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1lBQy9CLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1lBQzdDLEtBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUN6QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFO2dCQUNsQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFO2dCQUNoQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFO2dCQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLO2dCQUNqRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFO2dCQUN4QyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFO2dCQUM1QyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFO2dCQUM1QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJO2dCQUN4QyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUN4QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJO2dCQUMxQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFO2FBQ25DLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUV6QixJQUFNLGVBQWUsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBbkMsQ0FBbUMsQ0FBQyxDQUFDO1lBQ3pHLElBQUksZUFBZSxFQUFFO2dCQUNqQixLQUFJLENBQUMsMEJBQTBCLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2pELEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RCxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNqRTtZQUVELElBQU0sV0FBVyxlQUFHLGVBQWUsMENBQUUsYUFBYSwwQ0FBRSxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQWhDLENBQWdDLENBQUMsQ0FBQztZQUNsRyxJQUFJLFdBQVcsRUFBRTtnQkFDYixLQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDOUM7WUFFRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekUsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQyxDQUFBO1FBRU8sNkJBQXVCLEdBQUcsVUFBQyxRQUFpQjtZQUNoRCxLQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztnQkFDL0MsSUFBTSxPQUFPLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hELFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDNUYsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLEtBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkgsQ0FBQyxDQUFBO1FBRU8sNkJBQXVCLEdBQUc7O1lBQzlCLElBQUksQ0FBQyxLQUFJLENBQUMsa0JBQWtCLElBQUksS0FBSSxDQUFDLE9BQU8sRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM3RCxVQUFJLEtBQUksQ0FBQyxlQUFlLDBDQUFFLFdBQVc7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDcEQsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDdEUsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxLQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dCQUNsRyxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQTtRQUVPLGlDQUEyQixHQUFHO1lBQ2xDLElBQU0sT0FBTyxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsSUFBTSxVQUFVLEdBQUc7Z0JBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFJLENBQUMsYUFBYSxDQUFDO2dCQUMvQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ2xCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDMUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO2dCQUNoQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7Z0JBQ2xDLGNBQWMsRUFBRTtvQkFDWixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtvQkFDMUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO29CQUNwQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7b0JBQ2hDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtvQkFDbEMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO2lCQUN6QzthQUNKLENBQUM7WUFFRixLQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQXBCLENBQW9CLENBQUMsQ0FBQztZQUNwRixLQUFJLENBQUMsV0FBVztnQkFDWixVQUFVO2VBQ1AsS0FBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSx1QkFBTSxPQUFPLEtBQUUsUUFBUSxFQUFFLEtBQUssSUFBRyxFQUFqQyxDQUFpQyxDQUFDLENBQ3hFLENBQUM7WUFDRixLQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUMsS0FBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQTtRQUVPLDRCQUFzQixHQUFHOztZQUM3QixJQUFJLFFBQUMsS0FBSSxDQUFDLFdBQVcsMENBQUUsTUFBTSxDQUFBO2dCQUFFLE9BQU87WUFDdEMsS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQTtRQUVPLHVCQUFpQixHQUFHOztZQUN4QixJQUFJLEtBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLEtBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDNUMsT0FBTztvQkFDSCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxVQUFVLEVBQUUsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsV0FBSSxLQUFJLENBQUMsZUFBZSwwQ0FBRSxFQUFFLENBQUEsSUFBSSxDQUFDO29CQUN4RSxLQUFLLEVBQUUsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxFQUFFO2lCQUM5QyxDQUFDO2FBQ0w7WUFDRCxPQUFPO2dCQUNILElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRTtnQkFDckMsT0FBTyxFQUFFLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFO2dCQUNyRixtQkFBbUIsRUFBRSxLQUFJLENBQUMsbUJBQW1CO2FBQ2hELENBQUM7UUFDTixDQUFDLENBQUE7UUFFTyxtQkFBYSxHQUFHLFVBQUMsU0FBa0I7WUFDdkMsSUFBSSxLQUFJLENBQUMsT0FBTyxLQUFLLFNBQVM7Z0JBQUUsT0FBTztZQUN2QyxLQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLFNBQVMsSUFBSSxLQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRTtnQkFDakQsS0FBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQzthQUMzQztZQUNELEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUE7UUFFTyw4QkFBd0IsR0FBRztZQUMvQixLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQy9DLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxLQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRTtnQkFDcEMsS0FBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQzthQUMxQztRQUNMLENBQUMsQ0FBQTtRQUVPLHdCQUFrQixHQUFHO1lBQ3pCLElBQUksS0FBSSxDQUFDLGFBQWE7Z0JBQUUsT0FBTztZQUMvQixJQUFJLENBQUMsS0FBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTztZQUNqQyxJQUFNLE9BQU8sR0FBRyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QyxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xGLEtBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFBO1FBRU8saUNBQTJCLEdBQUc7O1lBQ2xDLElBQU0sT0FBTyxTQUFHLEtBQUksQ0FBQyxXQUFXLDBDQUFFLGFBQWEsQ0FBQztZQUNoRCxPQUFPLENBQ0gsQ0FBQyxLQUFJLENBQUMsa0JBQWtCO2dCQUN4QixLQUFJLENBQUMsU0FBUztnQkFDZCxDQUFDLFFBQUMsT0FBTywwQ0FBRSw2QkFBNkIsQ0FBQTtnQkFDeEMsQ0FBQyxRQUFDLE9BQU8sMENBQUUsNEJBQTRCLENBQUEsQ0FDMUMsQ0FBQztRQUNOLENBQUMsQ0FBQTtRQUVPLDBDQUFvQyxHQUFHLGNBQU0sT0FBQSxLQUFJLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxLQUFJLENBQUMsMEJBQTBCLElBQUksQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUF0RixDQUFzRixDQUFDO1FBRTVJLDJCQUFxQixHQUFHO1lBQ3BCLElBQUksS0FBSSxDQUFDLG9DQUFvQyxFQUFFLEVBQUU7Z0JBQzdDLE9BQU8saUJBQWlCLENBQUM7YUFDNUI7WUFDRCxJQUFJLEtBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxLQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRTtnQkFDdkQsT0FBTyxpQkFBaUIsQ0FBQzthQUM1QjtZQUNELE9BQU8sS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDeEQsQ0FBQyxDQUFBO1FBRU8sNEJBQXNCLEdBQUcsY0FBNkIsT0FBQSxDQUFDO1lBQzNELFFBQVEsRUFBRSxDQUFDO1lBQ1gsS0FBSyxFQUFFLENBQUM7WUFDUixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxTQUFTLEVBQUUsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1NBQ1gsQ0FBQyxFQVI0RCxDQVE1RCxDQUFDO1FBRUssd0NBQWtDLEdBQUcsVUFBQyxJQUFrQjs7WUFDNUQsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsSUFBSSxRQUFDLElBQUksMENBQUUsTUFBTSxDQUFBO2dCQUFFLE9BQU8sUUFBUSxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBQyxJQUFTOztnQkFDbkIsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQUEsSUFBSSwwQ0FBRSxNQUFNLEtBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLGNBQVEsSUFBSSwwQ0FBRSxJQUFJLEVBQUU7b0JBQ2hCLEtBQUssVUFBVTt3QkFDWCxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQzt3QkFDM0IsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7d0JBQ3hCLE1BQU07b0JBQ1YsS0FBSyxPQUFPO3dCQUNSLFFBQVEsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO3dCQUN4QixNQUFNO29CQUNWLEtBQUssVUFBVTt3QkFDWCxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQzt3QkFDM0IsTUFBTTtvQkFDVixLQUFLLGFBQWE7d0JBQ2QsUUFBUSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7d0JBQzlCLE1BQU07b0JBQ1YsS0FBSyxPQUFPO3dCQUNSLFFBQVEsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO3dCQUN4QixNQUFNO29CQUNWLEtBQUssVUFBVSxDQUFDO29CQUNoQixLQUFLLFFBQVE7d0JBQ1QsUUFBUSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUM7d0JBQzdCLE1BQU07b0JBQ1Y7d0JBQ0ksTUFBTTtpQkFDYjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxRQUFRLENBQUM7UUFDcEIsQ0FBQyxDQUFBO1FBRU8sK0JBQXlCLEdBQUcsVUFBQyxLQUFVOztZQUMzQyxJQUFNLE1BQU0sR0FBRyxPQUFBLEtBQUssMENBQUUsTUFBTSxLQUFJLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNILFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLFNBQVMsRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQztnQkFDM0QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQzthQUNuQyxDQUFDO1FBQ04sQ0FBQyxDQUFBO1FBRU8sdUJBQWlCLEdBQUcsVUFBQyxNQUE2QixFQUFFLEtBQVU7WUFDbEUsSUFBTSxLQUFLLEdBQUcsS0FBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FDSCxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRO2dCQUNsQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLO2dCQUM1QixNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRO2dCQUNsQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLO2dCQUM1QixNQUFNLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxXQUFXO2dCQUN4QyxNQUFNLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxTQUFTO2dCQUNwQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQy9CLENBQUM7UUFDTixDQUFDLENBQUE7UUFFTywyQkFBcUIsR0FBRztZQUM1QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7Z0JBQUUsT0FBTztZQUMxQyxVQUFVLENBQUM7Z0JBQ1AsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO29CQUFFLE9BQU87Z0JBQzFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQTtRQUVNLG9CQUFjLEdBQUc7O1lBQ3BCLElBQUksQ0FBQyxLQUFJLENBQUMsY0FBYztnQkFBRSxPQUFPO1lBQ2pDLEtBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUN2QyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsS0FBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDakMsSUFBTSxZQUFVLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7Z0JBQ2xELElBQU0sZUFBZSxHQUFHLENBQUMsS0FBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxZQUFVLENBQUMsRUFBekMsQ0FBeUMsQ0FBQyxDQUFDO2dCQUM1RyxJQUFJLGVBQWUsRUFBRTtvQkFDakIsQ0FBQyxLQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87d0JBQ3BDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLENBQUMsWUFBVSxDQUFDLENBQUM7b0JBQ2pFLENBQUMsQ0FBQyxDQUFDO29CQUNILEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3RELEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNqRSxLQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQzlDO3FCQUFNO29CQUNILEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2lCQUNwRTtnQkFDRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDNUU7aUJBQU07Z0JBQ0gsS0FBSSxDQUFDLG1CQUFtQixTQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLHVDQUFJLEtBQUksQ0FBQyxtQkFBbUIsRUFBQSxDQUFDO2dCQUMvRixLQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxLQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtvQkFDN0IsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxLQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUM5RjtnQkFDRCxJQUFNLGVBQWUsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUEvRCxDQUErRCxDQUFDLENBQUM7Z0JBQ3JJLElBQUksZUFBZSxFQUFFO29CQUNqQixLQUFJLENBQUMsMEJBQTBCLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2pELEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN0RCxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDOUQsSUFBTSxXQUFXLGVBQUcsZUFBZSwwQ0FBRSxhQUFhLDBDQUFFLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxFQUE1RCxDQUE0RCxDQUFDLENBQUM7b0JBQzlILElBQUksV0FBVyxFQUFFO3dCQUNiLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDOUM7aUJBQ0o7Z0JBQ0QsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZCO1lBQ0QsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsS0FBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUE7UUFsNkJHLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNwQixLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyx1QkFDMUIsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQzdELFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1FQUFtRTtZQUMzRyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFlBQVksQ0FBQyxhQUFhO2FBQzFCLElBQUksQ0FDRCxNQUFNLENBQUMsY0FBUSxLQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekUsU0FBUyxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsV0FBVyxFQUFFLEVBQWxCLENBQWtCLENBQUMsQ0FBQztRQUN6QyxLQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUF6QixDQUF5QixDQUFDLENBQUM7UUFFMUUsS0FBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyx1QkFDckMsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQzlELFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1FQUFtRTtZQUMzRyxDQUFDO1FBQ0gsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWE7YUFDckMsSUFBSSxDQUNELE1BQU0sQ0FBQyxjQUFRLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFNBQVMsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLFdBQVcsRUFBRSxFQUFsQixDQUFrQixDQUFDLENBQUM7UUFDekMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUF6QixDQUF5QixDQUFDLENBQUM7O0lBQ3pGLENBQUM7SUFFRCxzQ0FBUSxHQUFSO1FBQUEsaUJBMEVDOztRQXpFRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekUsSUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJLFlBQUksT0FBQSxLQUFJLENBQUMsMEJBQTBCLFNBQUcsSUFBSSwwQ0FBRSwwQkFBMEIsQ0FBQSxFQUFBLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLDBDQUFFLEtBQUssS0FBSSxVQUFVLENBQUMsQ0FBQztRQUN4SSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUc7WUFDL0MsSUFBSSxTQUFTLEdBQUcsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzdDLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEMsS0FBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixLQUFLLDRCQUE0QjtZQUN6RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEtBQUssd0JBQXdCLEVBQUU7WUFFdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUc7Z0JBQzVDLEtBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQztnQkFDL0IsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFO29CQUNsQixJQUFJLGVBQWUsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxRQUFRLEVBQWhCLENBQWdCLENBQUMsQ0FBQztvQkFDekUsK0VBQStFO29CQUMvRSxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDakQsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNwQyxlQUFlLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDO3FCQUNwRDtvQkFDRCxJQUFJLGVBQWUsRUFBRTt3QkFDakIsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDdEQsS0FBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUMzQyxLQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNoRixLQUFJLENBQUMsMEJBQTBCLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ2pELEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDekUsSUFBSSxLQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxjQUFjLEVBQUU7NEJBQ3JFLEtBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO3lCQUNuQzt3QkFDRCxJQUFJLEtBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFOzRCQUNoQyxLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzt5QkFDbkQ7cUJBQ0o7aUJBQ0o7cUJBQU07b0JBQ0gsS0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDekI7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBQSxHQUFHOztZQUN6QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDL0QsS0FBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV4QyxZQUFZO2dCQUNaLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsT0FDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FDNUIsQ0FBQTtnQkFDRCxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsU0FBUyxDQUFDLENBQUE7Z0JBRTdDLFlBQVk7Z0JBQ1osS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDbEYsS0FBSSxDQUFDLHdCQUF3QixPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUE7YUFDeEQ7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTztZQUNoRixVQUFVLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUEvQixDQUErQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUM5QyxLQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSSxDQUFDLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ25CLENBQUM7SUEwRFMsMENBQVksR0FBdEI7UUFDSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRTtnQkFDakUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7Z0JBQ3BCLE9BQU07YUFDVDtZQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtnQkFDcEIsT0FBTTthQUNUO1NBQ0o7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQTtJQUN6QixDQUFDO0lBdUpELG9EQUFzQixHQUF0QjtRQUNJLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztJQUM5QyxDQUFDO0lBMEVELHVDQUFTLEdBQVQsVUFBVSxRQUEwQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBeUJELDhDQUFnQixHQUFoQixVQUNJLFlBQWlCLEVBQ2pCLGVBQXVCLEVBQ3ZCLElBQVMsRUFDVCxlQUF1QixFQUN2QixZQUFvQixFQUNwQixjQUFzQixFQUN0QixRQUF3QjtRQUF4Qix5QkFBQSxFQUFBLGVBQXdCOztRQUV4QixJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFFMUIsSUFBTSxTQUFTLFNBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyx1Q0FBSSxLQUFLLEVBQUEsQ0FBQztRQUN0RCxJQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFJLGNBQWMsYUFBVSxDQUFDLENBQUMsQ0FBSSxjQUFjLGFBQVUsQ0FBQztRQUU5RixJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2pILElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsd0RBQTBCLEdBQTFCLFVBQTJCLGVBQW9CO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FDakIsZUFBZSxFQUNmLFVBQVUsRUFDVixJQUFJLENBQUMsWUFBWSxFQUNqQix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLDJCQUEyQixDQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVELG1FQUFxQyxHQUFyQyxVQUFzQyxlQUFvQjtRQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQ2pCLGVBQWUsRUFDZixVQUFVLEVBQ1YsSUFBSSxDQUFDLHVCQUF1QixFQUM1QixtQ0FBbUMsRUFDbkMscUJBQXFCLEVBQ3JCLDJCQUEyQixDQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVELHNEQUF3QixHQUF4QixVQUF5QixvQkFBeUI7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUNqQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsd0JBQXdCLEVBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FDekUsQ0FBQztJQUNOLENBQUM7SUFFRCxpRUFBbUMsR0FBbkMsVUFBb0Msb0JBQXlCO1FBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FDakIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsdUJBQXVCLEVBQzVCLGlDQUFpQyxFQUNqQyxXQUFXLEVBQ1gsd0JBQXdCLEVBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FDekUsQ0FBQztJQUNOLENBQUM7O2dCQWpmK0IsV0FBVztnQkFDNUIsV0FBVztnQkFDUixZQUFZO2dCQUNBLGlCQUFpQjtnQkFDdkIsV0FBVztnQkFDUCxlQUFlO2dCQUNuQixtQkFBbUI7Z0JBQ2pCLGNBQWM7Z0JBQ2QsaUJBQWlCO2dCQUN4QixTQUFTO2dCQUNGLG9CQUFvQjs7SUF6RXJDO1FBQVIsS0FBSyxFQUFFO3dEQUFTO0lBQ1I7UUFBUixLQUFLLEVBQUU7MERBQTRCO0lBQzNCO1FBQVIsS0FBSyxFQUFFO3lEQUFvQjtJQUNuQjtRQUFSLEtBQUssRUFBRTttRUFBcUM7SUFDbkM7UUFBVCxNQUFNLEVBQUU7NERBQTJDO0lBb1lwRDtRQURDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztxRUFJOUI7SUE3WVEsbUJBQW1CO1FBTi9CLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsMnIzRUFBeUM7WUFFekMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDOztTQUM5QixDQUFDO09BQ1csbUJBQW1CLENBZy9CL0I7SUFBRCwwQkFBQztDQUFBLEFBaC9CRCxDQUF5QyxlQUFlLEdBZy9CdkQ7U0FoL0JZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgVGVtcGxhdGVSZWYsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IEFkZHJlc3NpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hlY2tvdXQvYWRkcmVzc2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsL2JzLW1vZGFsLXJlZi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUuY29uc3RzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hlY2tvdXQvY2hlY2tvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBPcmRlclV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvb3JkZXItdXRpbC5zZXJ2aWNlJztcblxudHlwZSBTdW1tYXJ5VG90YWxzU25hcHNob3QgPSB7XG4gICAgc3VidG90YWw6IG51bWJlcjtcbiAgICB0YXhlczogbnVtYmVyO1xuICAgIHNoaXBwaW5nOiBudW1iZXI7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBjbGllbnRUYXhlczogbnVtYmVyO1xuICAgIHByb21vdGlvbjogbnVtYmVyO1xuICAgIGl0ZW1zOiBudW1iZXI7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1kYXRhZm9ybS1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICdkYXRhZm9ybS1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbQnNNb2RhbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFGb3JtRWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgc3RlcF9pZDtcbiAgICBASW5wdXQoKSBpc0xhc3RPbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBuZXh0U3RlcDogRnVuY3Rpb247XG4gICAgQElucHV0KCkgY29tcGFjdEFkZHJlc3NWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gICAgQE91dHB1dCgpIGRpcnR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgcHJvdGVjdGVkIGNvdW50cmllc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHByb3ZpbmNlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBjb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcblxuICAgIHB1YmxpYyBjb3VudHJpZXMkID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm92aW5jZXMkID0gdGhpcy5wcm92aW5jZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzJCA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGNvdW50cmllc0ZhY3R1cmFjaW9uJCA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm92aW5jZXNGYWN0dXJhY2lvbiQgPSB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uJCA9IHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHB1YmxpYyByZXF1aXJlX2xvZ2luID0gZmFsc2U7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybTogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBjaGVja291dEZvcm1GYWN0dXJhY2lvbjogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGZvcm1fcmVhZHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgYWxscmVhZHlfZGF0YSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhZGRyZXNzQm9vayA9IFtdO1xuICAgIHB1YmxpYyBhZGRyZXNzQm9va1NlbGVjdGVkID0geyBpZDogMCwgbm90ZXM6IFwiXCIgfVxuICAgIHB1YmxpYyBmaW5pc2g6IGJvb2xlYW4gPSBmYWxzZTsgLy9Fc3RhIHZhcmlhYmxlIHNlIHVzYSBwYXJhIG1vc3RyYXIgZWwgYm90b24gZGUgZmluYWxpemFyLlxuXG4gICAgcHVibGljIHZhbGlkYWRvID0gZmFsc2U7XG4gICAgcHVibGljIHZpZXdEYXRhRmFjdHVyYWNpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcbiAgICBwdWJsaWMgcGFyYW1zOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgc2VsZWN0QWRkcmVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGFkZHJlc3NTZWFyY2ggPSAnJztcbiAgICBwdWJsaWMgYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBmb3JtUmVhZG9ubHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRBZGRyZXNzOiBhbnkgPSBudWxsO1xuICAgIHByaXZhdGUgdGVtcEFkZHJlc3NJZCA9IDA7XG5cbiAgICBwdWJsaWMgcG9zdGFsQ29kZUVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgcG9zdGFsQ29kZUVycm9yTWVzc2FnZUZhY3R1cmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBkb2N1bWVudEVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbjogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgY3VzdG9tZXJIYXNDdXN0b21lclRheFJhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RTYXZlZFN0YXRlOiBhbnkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGlzRGlydHkgPSBmYWxzZTtcbiAgICBwcml2YXRlIHN1cHByZXNzRGlydHkgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90OiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPSB7XG4gICAgICAgIHN1YnRvdGFsOiAwLFxuICAgICAgICB0YXhlczogMCxcbiAgICAgICAgc2hpcHBpbmc6IDAsXG4gICAgICAgIHRvdGFsOiAwLFxuICAgICAgICBjbGllbnRUYXhlczogMCxcbiAgICAgICAgcHJvbW90aW9uOiAwLFxuICAgICAgICBpdGVtczogMFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwdWJsaWMgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHVibGljIGFkZHJlc3NpbmdTZXJ2aWNlOiBBZGRyZXNzaW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICAgICAgcHVibGljIGNoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG9yZGVyVXRpbHM6IE9yZGVyVXRpbGl0eVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICAgICAgcHVibGljIHBhcmFtc1NlcnZpY2U6IFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBDaGFubmVsQ29uZmlnU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLmNvbmZpZ0Zvcm0uZm9ybUFkZHJlcyxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0gLy8gU2UgYWdyZWdhIHBhcmEgcXVlIHPDs2xvIGFjZXB0ZSBjw7NkaWdvcyBwb3N0YWxlcyBtYXlvcmVzIHF1ZSBjZXJvXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm0udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKSk7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbiA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLmNvbmZpZ0Zvcm0uZm9ybUJpbGxpbmcsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dIC8vIFNlIGFncmVnYSBwYXJhIHF1ZSBzw7NsbyBhY2VwdGUgY8OzZGlnb3MgcG9zdGFsZXMgbWF5b3JlcyBxdWUgY2Vyb1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvcm1WYWxpZCgpKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBhcmFtc1NlcnZpY2UucGFyYW1ldGVycy5zdWJzY3JpYmUocmVzID0+IHRoaXMucGFyYW1zID0gcmVzKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5pbml0aWFsaXplKHRoaXMuc3RlcF9pZCk7XG4gICAgICAgIC8vIEluIHNpbmdsZS9jb21wYWN0IHNlbGVjdGlvbiBtb2RlIHdlIHNob3VsZCBub3Qgc2hvdyB0aGUgc3VibWl0IGJ1dHRvbi5cbiAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICBjb25zdCBsb2NhbEVtYWlsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21haWwnKTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5jYXJ0LnN1YnNjcmliZShjYXJ0ID0+IHRoaXMuY3VzdG9tZXJIYXNDdXN0b21lclRheFJhdGUgPSBjYXJ0Py5jdXN0b21lckhhc0N1c3RvbWVyVGF4UmF0ZSk7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUodGhpcy5hdXRoU2VydmljZS5nZXRDdXN0b21lcigpPy5lbWFpbCB8fCBsb2NhbEVtYWlsKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldEFkZHJlc3NpbmdEYXRhKCkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgbGV0IGNvdW50cmllcyA9IHRoaXMuZmlsdGVyQ291bnRyeUJ5Q29kZShyZXMpXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJyB8fFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nKSB7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc0Jvb2soKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IHJlcyB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3NCb29rKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEFkZHJlc3MgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2kgbm8gaGF5IG5pbmd1bmEgZGlyZWNjacOzbiBzZWxlY2Npb25hZGEsIHNlbGVjY2lvbmFyIGxhIHByaW1lcmEgcG9yIGRlZmVjdG9cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZEFkZHJlc3MgJiYgdGhpcy5hZGRyZXNzQm9vay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2tbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3MuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gc2VsZWN0ZWRBZGRyZXNzLmlkIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRBZGRyZXNzKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShzZWxlY3RlZEFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZEFkZHJlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdhZGRyZXNzJykgJiYgIXRoaXMubGFzdFNhdmVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzcyh0aGlzLmNhcnRTZXJ2aWNlLmdldENhcnQyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdjYXJnYScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3VudHJpZXMkLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24ocmVzWzBdKTtcblxuICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmVzWzBdPy5wcm92aW5jZXNbMF0uY29kZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2Uuc3RhdGUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdhZGRyZXNzJykgfHwgdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmFzb2NpYXRlZERhdGEkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9IHRoaXMuZ2V0U3VtbWFyeVRvdGFsc0Zyb21Bc3NvY2lhdGVkRGF0YShkYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBmaWx0cmEgbG9zIHBhaXNlcyBkZSBhY3VlcmRvIGFsIGEgbG9zIGNvZGlnb3MgcmV0b3JuYWRvcyBlbiBsYSBmdW5jaW9uIGdldENvdW50cmllcy5cbiAgICAgKiBDYXNvcyBkZSB1c29zOiBTaSBnZXRDb3VudHJpZXMgZXMgdmFjaW8sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIFNpIGdldENvdW50cmllcyBjb250aWVuZSB2YWxvcmVzIHF1ZSBubyBjb2luY2lkZW4sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIERlIGxvIGNvbnRyYXJpbyByZXRvcm5hIGxvcyB2YWxvcmVzIGZpbHRyYWRvcy5cbiAgICAgKiBAcGFyYW0gY291bnRyaWVzIEFycmVnbG8gcXVlIGNvbnRpZW5lIGxvcyBjb3VudHJpZXMgcmVjaWJpZG9zIGVuIGxhIHN1YnNjcmlwY2lvbiBkZWwgb2JzZXJ2YWJsZS5cbiAgICAgKiBAcmV0dXJucyB1biBhcnJlZ2xvIGRlIGNvdW50cmllcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlckNvdW50cnlCeUNvZGUgPSAoY291bnRyaWVzOiBhbnlbXSkgPT4ge1xuICAgICAgICAvLyAxLiBTaSBoYXkgcGHDrXNlcyBFWENMVUlET1MsIHF1w610YWxvcyBzaWVtcHJlXG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IGNvdW50cmllcztcbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmV4Y2x1ZGVkQ291bnRyaWVzICYmIHRoaXMuY29uc3RzLmV4Y2x1ZGVkQ291bnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKGVsZW0gPT4gIXRoaXMuY29uc3RzLmV4Y2x1ZGVkQ291bnRyaWVzLmluY2x1ZGVzKGVsZW0uY29kZSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDIuIFNpIGhheSBwYcOtc2VzIElOQ0xVSURPUywgYXBsaWNhIGVsIGZpbHRybyBkZSBpbmNsdXNpw7NuXG4gICAgICAgIGlmICh0aGlzLmNvbnN0cy5nZXRDb3VudHJpZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzRmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoZWxlbSA9PiB0aGlzLmNvbnN0cy5nZXRDb3VudHJpZXMoKS5pbmNsdWRlcyhlbGVtLmNvZGUpKVxuICAgICAgICAgICAgaWYgKGNvdW50cmllc0ZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyaWVzRmlsdGVyZWRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRWwvbG9zIGNvZGlnby9zIGluZ3Jlc2Fkby9zIG5vIGNvaW5jaWRlbiBjb24gbG9zIHByb3Zpc3RvcyBkZXNkZSBlbCBiYWNrZW5kJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0Zvcm1GYWN0dXJhY2lvbiA9ICgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbikge1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvbiQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24ocmVzWzBdKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24ocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkZvcm1DaGFuZ2UoKVxuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cbiAgICB9XG5cbiAgICBvbkZvcm1WYWxpZCA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Gb3JtQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZGFkbyA9IGZhbHNlXG4gICAgfVxuXG4gICAgb25JbnB1dENoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCk7XG4gICAgfTtcblxuICAgIG9uQ291bnRyeVNlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpLnByb3ZpbmNlc1xuICAgICAgICAgICAgOlxuICAgICAgICAgICAgW11cbiAgICAgICAgdGhpcy5wcm92aW5jZXNTdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShwcm92aW5jZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL0RvY3VtZW50IHR5cGVzXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KGRvY3VtZW50VHlwZXMpO1xuICAgICAgICBpZiAoZG9jdW1lbnRUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSgnJyk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkucHJvdmluY2VzIDogW107XG4gICAgICAgIHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvY3VtZW50IHR5cGVzXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoZG9jdW1lbnRUeXBlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IGRvY3VtZW50VHlwZXMuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgb25Qcm92aW5jZXNTZWxlY3RlZCA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG5cbiAgICBvbkRvY3VtZW50VHlwZXNTZWxlY3RlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0LnZhbHVlLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHZhbHVlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBvbkRvY3VtZW50VHlwZXNTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHZhbHVlID09ICcnID8gJycgOiB2YWx1ZSk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHZhbHVlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGdldFNlbGVjdGVkRG9jdW1lbnRUeXBlTGFiZWwgPSAoZG9jdW1lbnRUeXBlczogYW55W10pID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IGN1cnJlbnQpPy5uYW1lIHx8ICcnO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGVkRG9jdW1lbnRUeXBlTGFiZWxGYWN0dXJhY2lvbiA9IChkb2N1bWVudFR5cGVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWU7XG4gICAgICAgIHJldHVybiBkb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSBjdXJyZW50KT8ubmFtZSB8fCAnJztcbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXT8uZGlzYWJsZWQgfHwgdGhpcy5mb3JtUmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW47XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93bkZhY3R1cmFjaW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuO1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0RG9jdW1lbnRUeXBlID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddPy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1SZWFkb25seSkge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGNvZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdERvY3VtZW50VHlwZUZhY3R1cmFjaW9uID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24oY29kZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRmFjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgICBjbG9zZURvY3VtZW50RHJvcGRvd25zKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSA9IGFzeW5jIChlLCBpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmlvdXNUb3RhbHMgPSB7IC4uLnRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCB9O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1ZXN0cyBtdXN0IGJlIGFibGUgdG8gcmVvcGVuIHN0ZXAgMSBhbmQgZWRpdCB0aGVpciBhZGRyZXNzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkgJiYgYWRkcmVzc1NlbGVjdC5pZCAhPT0gdGhpcy5zZWxlY3RlZEFkZHJlc3MuaWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBhZGRyZXNzU2VsZWN0Py5pZDtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3M/LmlkIHx8IDA7XG4gICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIHRoZSBmb3JtIHJlYWQtb25seSB3aGlsZSBicm93c2luZyBzYXZlZCBhZGRyZXNzZXMgaW4gc2luZ2xlIG1vZGUuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhbnksXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBmb3JtOiBhbnksXG4gICAgICAgIGVycm9yTWVzc2FnZVZhcjogc3RyaW5nLFxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXNOdW1lcmljID0gc2VsZWN0ZWRJdGVtW2lzTnVtZXJpY0tleV0gPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc051bWVyaWMgPyAvXlxcZCskLyA6IC8uKi87XG4gICAgICAgIHRoaXNbZXJyb3JNZXNzYWdlVmFyXSA9IGlzTnVtZXJpYyA/IGAke2Vycm9yS2V5UHJlZml4fS5udW1lcmljYCA6IGAke2Vycm9yS2V5UHJlZml4fS5kZWZhdWx0YDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gcmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXSA6IFtWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybildO1xuICAgICAgICBmb3JtLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgICAgICBzZWxlY3RlZENvdW50cnksXG4gICAgICAgICAgICAncG9zdGNvZGUnLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0sXG4gICAgICAgICAgICAncG9zdGFsQ29kZUVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXG4gICAgICAgICAgICAncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkQ291bnRyeSxcbiAgICAgICAgICAgICdwb3N0Y29kZScsXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLFxuICAgICAgICAgICAgJ3Bvc3RhbENvZGVFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbicsXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXG4gICAgICAgICAgICAncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGU6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgICAgICBzZWxlY3RlZERvY3VtZW50VHlwZSxcbiAgICAgICAgICAgICdkb2N1bWVudE51bWJlcicsXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSxcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAnaXNOdW1lcmljJyxcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJyxcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24sXG4gICAgICAgICAgICAnZG9jdW1lbnRFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbicsXG4gICAgICAgICAgICAnaXNOdW1lcmljJyxcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJyxcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZWxlY3RBZGRyZXNzID0gYXN5bmMgKGl0ZW1zLCBzaG93Tm90ZXNFcnJvcjogYm9vbGVhbiA9IHRydWUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3Rlc0NmZyA9IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubm90ZXM7XG4gICAgICAgIGlmIChub3Rlc0NmZy5yZXF1aXJlZCAmJiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCAhdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzLnRyaW0oKSkpIHtcbiAgICAgICAgICAgIGlmIChzaG93Tm90ZXNFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygncmVxdWlyZWQtZmllbGRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c1RvdGFscyA9IHsgLi4udGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90IH07XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYWRkcmVzc1NlbGVjdGVkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZClcbiAgICAgICAgICAgIGlmICghYWRkcmVzc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYXlsb2FkID0gdGhpcy5jb21wYWN0QWRkcmVzc1ZpZXdcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbm90ZXM6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkUGF5bG9hZCxcbiAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IGFkZHJlc3NTZWxlY3RlZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXIocmVxdWVzdCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdFNlZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgIChpdGVtcyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLmNpdHkgKyAnIC0gJyArIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLnN0cmVldCwgJ25ld2xvdCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0U2VkZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkge1xuICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNb2RlID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QWRkcmVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHNldE1vZGUgPSAobW9kZSkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdEFkZHJlcyA9IG1vZGUgPT0gXCJjYXJnYVwiO1xuICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIHRvZ2dsZUFkZHJlc3NEcm9wZG93biA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gIXRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbjtcbiAgICB9XG5cbiAgICBzZWxlY3RBZGRyZXNzRnJvbURyb3Bkb3duID0gKGFkZHJlc3M6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNldFNlbGVjdEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uTm90ZXNDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMub25JbnB1dENoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRBdXRvU2VsZWN0QWRkcmVzcygpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFkZHJlc3ModGhpcy5jYXJ0U2VydmljZS5nZXRDYXJ0MigpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNlbGVjdGVkQWRkcmVzc0xhYmVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5zZWxlY3RlZEFkZHJlc3MgfHwgdGhpcy5hZGRyZXNzQm9vaz8uZmluZChpdGVtID0+IGl0ZW0uc2VsZWN0ZWQpO1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHJldHVybiB0aGlzLmdldERlZmF1bHRTZWxlY3RlZExhYmVsKCk7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICBjb25zdCBuYW1lID0gW2NvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgICBjb25zdCBtYWluID0gW25hbWUsIGFkZHJlc3Muc3RyZWV0LCBhZGRyZXNzLmNpdHldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcbiAgICAgICAgcmV0dXJuIG1haW4gfHwgdGhpcy5nZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCgpO1xuICAgIH1cblxuICAgIGdldEFkZHJlc3NPcHRpb25MYWJlbCA9IChhZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFjdCA9IGFkZHJlc3M/LmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICBjb25zdCBuYW1lID0gW2NvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgICByZXR1cm4gW25hbWUsIGFkZHJlc3M/LnN0cmVldCwgYWRkcmVzcz8uY2l0eV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRTZWxlY3RlZExhYmVsID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcpIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc0Jvb2s/Lmxlbmd0aCA/ICh0aGlzLmFkZHJlc3NCb29rWzBdPy5zdHJlZXQgfHwgJycpIDogJyc7XG4gICAgfVxuXG4gICAgZ2V0Q291bnRyeSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmNvdW50cmllc0xpc3QuZmluZChwYWlzZXMgPT4gcGFpc2VzLmNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKT8ubmFtZSB8fCBcIlwiXG5cbiAgICBnZXRQcm92aW5jZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLnByb3ZpbmNlTGlzdC5maW5kKGN0ID0+IGN0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0RG9jdW1lbnRUeXBlID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZG9jdW1lbnRUeXBlcy5maW5kKGR0ID0+IGR0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0TGFiZWxOb3Rlc1BhcmFtID0gKCkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsICdsYWJlbF9ub3Rlc18nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJ18nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXSlcblxuICAgIGdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UgPSAobmFtZVBhcmFtKSA9PiB0aGlzLmhhc1BhcmFtcyh0aGlzLnBhcmFtcywgbmFtZVBhcmFtICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJ18nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXSlcblxuICAgIGdldEZpbHRlcmVkQWRkcmVzc0Jvb2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9vayB8fCAhdGhpcy5hZGRyZXNzQm9vay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXJtID0gKHRoaXMuYWRkcmVzc1NlYXJjaCB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGlmICghdGVybSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc0Jvb2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc0Jvb2suZmlsdGVyKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFjdCA9IGFkZHJlc3MuYWRkcmVzc0NvbnRhY3QgfHwge307XG4gICAgICAgICAgICBjb25zdCBoYXlzdGFjayA9IFtcbiAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmVldCxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLmNpdHksXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5wb3N0Y29kZSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLmNvdW50cnlDb2RlLFxuICAgICAgICAgICAgICAgIGFkZHJlc3MucHJvdmluY2VDb2RlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q291bnRyeShhZGRyZXNzLmNvdW50cnlDb2RlKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3ZpbmNlKGFkZHJlc3MucHJvdmluY2VDb2RlKSxcbiAgICAgICAgICAgICAgICBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgICAgICBjb250YWN0Lmxhc3ROYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRhY3QuZW1haWxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKHRlcm0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRGaWx0ZXJlZEFkZHJlc3NPcHRpb25zID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZEFkZHJlc3NCb29rKCkubWFwKGFkZHJlc3MgPT4gKHtcbiAgICAgICAgICAgIC4uLmFkZHJlc3MsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy5nZXRBZGRyZXNzT3B0aW9uTGFiZWwoYWRkcmVzcylcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGhhc1NlbGVjdGVkQWRkcmVzcyA9ICgpID0+ICEhdGhpcy5hZGRyZXNzQm9vaz8uc29tZShpdGVtID0+IGl0ZW0/LnNlbGVjdGVkKTtcblxuICAgIHByaXZhdGUgYXBwbHlTZWxlY3RlZEFkZHJlc3MgPSAoYWRkcmVzczogYW55KSA9PiB7XG4gICAgICAgIGlmICghYWRkcmVzcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnN1cHByZXNzRGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBsYXN0TmFtZTogY29udGFjdC5sYXN0TmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwgfHwgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10udmFsdWUsXG4gICAgICAgICAgICBkb2N1bWVudFR5cGU6IGNvbnRhY3QuZG9jdW1lbnRUeXBlIHx8ICcnLFxuICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXIgfHwgJycsXG4gICAgICAgICAgICBzdHJlZXQ6IGFkZHJlc3Muc3RyZWV0IHx8ICcnLFxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGFkZHJlc3MuY291bnRyeUNvZGUgfHwgbnVsbCxcbiAgICAgICAgICAgIGNpdHk6IGFkZHJlc3MuY2l0eSB8fCAnJyxcbiAgICAgICAgICAgIHByb3ZpbmNlQ29kZTogYWRkcmVzcy5wcm92aW5jZUNvZGUgfHwgbnVsbCxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBhZGRyZXNzLnBvc3Rjb2RlIHx8ICcnLFxuICAgICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gYWRkcmVzcy5jb3VudHJ5Q29kZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMpO1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KHNlbGVjdGVkQ291bnRyeS5kb2N1bWVudFR5cGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRG9jID0gc2VsZWN0ZWRDb3VudHJ5Py5kb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSBjb250YWN0LmRvY3VtZW50VHlwZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvYykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB0aGlzLnN1cHByZXNzRGlydHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENoZWNrb3V0Rm9ybVJlYWRvbmx5ID0gKHJlYWRvbmx5OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybVJlYWRvbmx5ID0gcmVhZG9ubHk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNba2V5XTtcbiAgICAgICAgICAgIHJlYWRvbmx5ID8gY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KSA6IGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uZ2V0KCdlbWFpbCcpLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3VsZEF1dG9TZWxlY3RBZGRyZXNzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGFjdEFkZHJlc3NWaWV3IHx8IHRoaXMuZ2V0TW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qgbm90ZXNDZmcgPSB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzO1xuICAgICAgICBpZiAobm90ZXNDZmcucmVxdWlyZWQgJiYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3Rlcy50cmltKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSB0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICBjb25zdCBuZXdBZGRyZXNzID0ge1xuICAgICAgICAgICAgaWQ6IC0xICogKCsrdGhpcy50ZW1wQWRkcmVzc0lkKSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgaXNUZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICBzdHJlZXQ6IGNvbnRhY3Quc3RyZWV0LFxuICAgICAgICAgICAgY2l0eTogY29udGFjdC5jaXR5LFxuICAgICAgICAgICAgcG9zdGNvZGU6IGNvbnRhY3QucG9zdGNvZGUsXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogY29udGFjdC5jb3VudHJ5Q29kZSxcbiAgICAgICAgICAgIHByb3ZpbmNlQ29kZTogY29udGFjdC5wcm92aW5jZUNvZGUsXG4gICAgICAgICAgICBhZGRyZXNzQ29udGFjdDoge1xuICAgICAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUsXG4gICAgICAgICAgICAgICAgbGFzdE5hbWU6IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwsXG4gICAgICAgICAgICAgICAgcGhvbmVOdW1iZXI6IGNvbnRhY3QucGhvbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiBjb250YWN0LmRvY3VtZW50VHlwZSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudE51bWJlcjogY29udGFjdC5kb2N1bWVudE51bWJlclxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmlsdGVyKGFkZHJlc3MgPT4gIWFkZHJlc3MuaXNUZW1wb3JhcnkpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gW1xuICAgICAgICAgICAgbmV3QWRkcmVzcyxcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc0Jvb2subWFwKGFkZHJlc3MgPT4gKHsgLi4uYWRkcmVzcywgc2VsZWN0ZWQ6IGZhbHNlIH0pKVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBuZXdBZGRyZXNzLmlkO1xuICAgICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRBZGRyZXNzKG5ld0FkZHJlc3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NCb29rPy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IHRoaXMuYWRkcmVzc0Jvb2suZmlsdGVyKGFkZHJlc3MgPT4gIWFkZHJlc3MuaXNUZW1wb3JhcnkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDdXJyZW50U3RhdGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkIHx8IHRoaXMuc2VsZWN0ZWRBZGRyZXNzPy5pZCB8fCAwLFxuICAgICAgICAgICAgICAgIG5vdGVzOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgJydcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGU6ICdmb3JtJyxcbiAgICAgICAgICAgIGZvcm06IHRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCksXG4gICAgICAgICAgICBiaWxsaW5nOiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPyBudWxsIDogdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICAgICAgdmlld0RhdGFGYWN0dXJhY2lvbjogdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREaXJ0eVN0YXRlID0gKG5leHREaXJ0eTogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5ID09PSBuZXh0RGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pc0RpcnR5ID0gbmV4dERpcnR5O1xuICAgICAgICBpZiAobmV4dERpcnR5ICYmIHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc1N5bmNlZEZvckNvbXBsZXRpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5Q2hhbmdlLmVtaXQodGhpcy5pc0RpcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IHRoaXMuYnVpbGRDdXJyZW50U3RhdGUoKTtcbiAgICAgICAgdGhpcy5zZXREaXJ0eVN0YXRlKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc1N5bmNlZEZvckNvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBldmFsdWF0ZURpcnR5U3RhdGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzRGlydHkpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmxhc3RTYXZlZFN0YXRlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmJ1aWxkQ3VycmVudFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5leHREaXJ0eSA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnQpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmxhc3RTYXZlZFN0YXRlKTtcbiAgICAgICAgdGhpcy5zZXREaXJ0eVN0YXRlKG5leHREaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNhcnRTZXJ2aWNlPy5jaGFubmVsQ29uZmlnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgIXRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmXG4gICAgICAgICAgICB0aGlzLmlzTGFzdE9uZSAmJlxuICAgICAgICAgICAgISFjaGFubmVsPy5pc1NraXBwaW5nU2hpcHBpbmdTdGVwQWxsb3dlZCAmJlxuICAgICAgICAgICAgISFjaGFubmVsPy5pc1NraXBwaW5nUGF5bWVudFN0ZXBBbGxvd2VkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5Db21wbGV0ZUxlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQgPSAoKSA9PiB0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpICYmIHRoaXMuYWRkcmVzc1N5bmNlZEZvckNvbXBsZXRpb24gJiYgIXRoaXMuaXNEaXJ0eTtcblxuICAgIGdldFByaW1hcnlBY3Rpb25MYWJlbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnZmluaXNoLWNoZWNrb3V0JztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0xhc3RPbmUgJiYgIXRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnZmluaXNoLWNoZWNrb3V0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5hbGxyZWFkeV9kYXRhID8gJ3VwZGF0ZScgOiAncmVhZHktZm9ybSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFbXB0eVRvdGFsc1NuYXBzaG90ID0gKCk6IFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9PiAoe1xuICAgICAgICBzdWJ0b3RhbDogMCxcbiAgICAgICAgdGF4ZXM6IDAsXG4gICAgICAgIHNoaXBwaW5nOiAwLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgY2xpZW50VGF4ZXM6IDAsXG4gICAgICAgIHByb21vdGlvbjogMCxcbiAgICAgICAgaXRlbXM6IDBcbiAgICB9KTtcblxuICAgIHByaXZhdGUgZ2V0U3VtbWFyeVRvdGFsc0Zyb21Bc3NvY2lhdGVkRGF0YSA9IChkYXRhOiBhbnlbXSB8IG51bGwpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4ge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuZ2V0RW1wdHlUb3RhbHNTbmFwc2hvdCgpO1xuICAgICAgICBpZiAoIWRhdGE/Lmxlbmd0aCkgcmV0dXJuIHNuYXBzaG90O1xuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW1vdW50ID0gTnVtYmVyKGl0ZW0/LmFtb3VudCB8fCAwKTtcbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbT8udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N1YnRvdGFsJzpcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3Quc3VidG90YWwgPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90Lml0ZW1zID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0YXhlcyc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnRheGVzID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzaGlwbWVudCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnNoaXBwaW5nID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjbGllbnRUYXhlcyc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LmNsaWVudFRheGVzID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0b3RhbCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnRvdGFsID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkaXNjb3VudCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY291cG9uJzpcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3QucHJvbW90aW9uICs9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdW1tYXJ5VG90YWxzRnJvbU9yZGVyID0gKG9yZGVyOiBhbnkpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4ge1xuICAgICAgICBjb25zdCB0b3RhbHMgPSBvcmRlcj8udG90YWxzIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VidG90YWw6IE51bWJlcih0b3RhbHMuc3VidG90YWwgfHwgMCksXG4gICAgICAgICAgICB0YXhlczogTnVtYmVyKHRvdGFscy50YXhlcyB8fCAwKSxcbiAgICAgICAgICAgIHNoaXBwaW5nOiBOdW1iZXIodG90YWxzLnNoaXBwaW5nIHx8IDApLFxuICAgICAgICAgICAgdG90YWw6IE51bWJlcih0b3RhbHMudG90YWwgfHwgMCksXG4gICAgICAgICAgICBjbGllbnRUYXhlczogTnVtYmVyKHRvdGFscy5jbGllbnRUYXhlcyB8fCAwKSxcbiAgICAgICAgICAgIHByb21vdGlvbjogdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQob3JkZXIpLFxuICAgICAgICAgICAgaXRlbXM6IE51bWJlcih0b3RhbHMuaXRlbXMgfHwgMClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhdmVUb3RhbHNDaGFuZ2VkID0gKGJlZm9yZTogU3VtbWFyeVRvdGFsc1NuYXBzaG90LCBvcmRlcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdGhpcy5nZXRTdW1tYXJ5VG90YWxzRnJvbU9yZGVyKG9yZGVyKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGJlZm9yZS5zdWJ0b3RhbCAhPT0gYWZ0ZXIuc3VidG90YWwgfHxcbiAgICAgICAgICAgIGJlZm9yZS50YXhlcyAhPT0gYWZ0ZXIudGF4ZXMgfHxcbiAgICAgICAgICAgIGJlZm9yZS5zaGlwcGluZyAhPT0gYWZ0ZXIuc2hpcHBpbmcgfHxcbiAgICAgICAgICAgIGJlZm9yZS50b3RhbCAhPT0gYWZ0ZXIudG90YWwgfHxcbiAgICAgICAgICAgIGJlZm9yZS5jbGllbnRUYXhlcyAhPT0gYWZ0ZXIuY2xpZW50VGF4ZXMgfHxcbiAgICAgICAgICAgIGJlZm9yZS5wcm9tb3Rpb24gIT09IGFmdGVyLnByb21vdGlvbiB8fFxuICAgICAgICAgICAgYmVmb3JlLml0ZW1zICE9PSBhZnRlci5pdGVtc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9MZWdhY3lTdW1tYXJ5ID0gKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzY2FyZENoYW5nZXMgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnN1cHByZXNzRGlydHkgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5sYXN0U2F2ZWRTdGF0ZS5tb2RlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMubGFzdFNhdmVkU3RhdGUuc2VsZWN0ZWRJZDtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQWRkcmVzcyA9ICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5maW5kKGFkZHJlc3MgPT4gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCkpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQWRkcmVzcykge1xuICAgICAgICAgICAgICAgICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gc2VsZWN0ZWRBZGRyZXNzLmlkIHx8IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzID0gdGhpcy5sYXN0U2F2ZWRTdGF0ZS5ub3RlcyB8fCAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRBZGRyZXNzKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyA9IHRoaXMubGFzdFNhdmVkU3RhdGUubm90ZXMgfHwgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSB0aGlzLmxhc3RTYXZlZFN0YXRlLnZpZXdEYXRhRmFjdHVyYWNpb24gPz8gdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uO1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmxhc3RTYXZlZFN0YXRlLmZvcm0gfHwge30sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RTYXZlZFN0YXRlLmJpbGxpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnBhdGNoVmFsdWUodGhpcy5sYXN0U2F2ZWRTdGF0ZS5iaWxsaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREb2MgPSBzZWxlY3RlZENvdW50cnk/LmRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwcHJlc3NEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldERpcnR5U3RhdGUoZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==
|
|
1421
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrQyxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDaEYs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RUFDakMsV0FBVyxFQUNYLHdCQUF3QixFQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQ3pFLENBQUM7SUFDTixDQUFDOztnQkFybEIrQixXQUFXO2dCQUM1QixXQUFXO2dCQUNSLFlBQVk7Z0JBQ0EsaUJBQWlCO2dCQUN2QixXQUFXO2dCQUNQLGVBQWU7Z0JBQ25CLG1CQUFtQjtnQkFDakIsY0FBYztnQkFDZCxpQkFBaUI7Z0JBQ3hCLFNBQVM7Z0JBQ0Ysb0JBQW9COztJQS9FckM7UUFBUixLQUFLLEVBQUU7d0RBQVM7SUFDUjtRQUFSLEtBQUssRUFBRTswREFBNEI7SUFDM0I7UUFBUixLQUFLLEVBQUU7eURBQW9CO0lBQ25CO1FBQVIsS0FBSyxFQUFFO21FQUFxQztJQUNuQztRQUFULE1BQU0sRUFBRTs0REFBMkM7SUFnZHBEO1FBREMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO3FFQUk5QjtJQXpkUSxtQkFBbUI7UUFOL0IsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQiw4L2pGQUF5QztZQUV6QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O1NBQzlCLENBQUM7T0FDVyxtQkFBbUIsQ0E0dkMvQjtJQUFELDBCQUFDO0NBQUEsQUE1dkNELENBQXlDLGVBQWUsR0E0dkN2RDtTQTV2Q1ksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzc2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9hZGRyZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9jaGVja291dC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuXG50eXBlIFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9IHtcbiAgICBzdWJ0b3RhbDogbnVtYmVyO1xuICAgIHRheGVzOiBudW1iZXI7XG4gICAgc2hpcHBpbmc6IG51bWJlcjtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIGNsaWVudFRheGVzOiBudW1iZXI7XG4gICAgcHJvbW90aW9uOiBudW1iZXI7XG4gICAgaXRlbXM6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0YWZvcm0tZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtCc01vZGFsU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm1FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBzdGVwX2lkO1xuICAgIEBJbnB1dCgpIGlzTGFzdE9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG5leHRTdGVwOiBGdW5jdGlvbjtcbiAgICBASW5wdXQoKSBjb21wYWN0QWRkcmVzc1ZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBAT3V0cHV0KCkgZGlydHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuXG4gICAgcHVibGljIGNvdW50cmllcyQgPSB0aGlzLmNvdW50cmllc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlcyQgPSB0aGlzLnByb3ZpbmNlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXMkID0gdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlc0ZhY3R1cmFjaW9uJCA9IHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb24kID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHVibGljIHJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZm9ybV9yZWFkeSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhbGxyZWFkeV9kYXRhID0gZmFsc2U7XG4gICAgcHVibGljIGFkZHJlc3NCb29rID0gW107XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWQgPSB7IGlkOiAwLCBub3RlczogXCJcIiB9XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZmluaXNoOiBib29sZWFuID0gZmFsc2U7IC8vRXN0YSB2YXJpYWJsZSBzZSB1c2EgcGFyYSBtb3N0cmFyIGVsIGJvdG9uIGRlIGZpbmFsaXphci5cblxuICAgIHB1YmxpYyB2YWxpZGFkbyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3RGF0YUZhY3R1cmFjaW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBtb2RhbFJlZjogQnNNb2RhbFJlZiB8IG51bGw7XG4gICAgcHVibGljIHBhcmFtczogYW55ID0ge307XG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RBZGRyZXNzRmFjdHVyYWNpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgYWRkcmVzc1NlYXJjaCA9ICcnO1xuICAgIHB1YmxpYyBhZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHVibGljIGZvcm1SZWFkb25seSA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RlZEFkZHJlc3M6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSB0ZW1wQWRkcmVzc0lkID0gMDtcblxuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIHBvc3RhbENvZGVWaXNpYmxlID0gdHJ1ZTtcbiAgICBwdWJsaWMgcG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZCA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uID0gdHJ1ZTtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGRvY3VtZW50RXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogYW55IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhZGRyZXNzU3luY2VkRm9yQ29tcGxldGlvbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgbGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdDogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0ge1xuICAgICAgICBzdWJ0b3RhbDogMCxcbiAgICAgICAgdGF4ZXM6IDAsXG4gICAgICAgIHNoaXBwaW5nOiAwLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgY2xpZW50VGF4ZXM6IDAsXG4gICAgICAgIHByb21vdGlvbjogMCxcbiAgICAgICAgaXRlbXM6IDBcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHVibGljIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBhZGRyZXNzaW5nU2VydmljZTogQWRkcmVzc2luZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjaGVja291dFNlcnZpY2U6IENoZWNrb3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogQ2hhbm5lbENvbmZpZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1BZGRyZXMsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCkpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24obnVsbCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucGFyYW1zU2VydmljZS5wYXJhbWV0ZXJzLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wYXJhbXMgPSByZXMpO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5zdGVwX2lkKTtcbiAgICAgICAgLy8gSW4gc2luZ2xlL2NvbXBhY3Qgc2VsZWN0aW9uIG1vZGUgd2Ugc2hvdWxkIG5vdCBzaG93IHRoZSBzdWJtaXQgYnV0dG9uLlxuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIGNvbnN0IGxvY2FsRW1haWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWFpbCcpO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmNhcnQuc3Vic2NyaWJlKGNhcnQgPT4gdGhpcy5jdXN0b21lckhhc0N1c3RvbWVyVGF4UmF0ZSA9IGNhcnQ/LmN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZSh0aGlzLmF1dGhTZXJ2aWNlLmdldEN1c3RvbWVyKCk/LmVtYWlsIHx8IGxvY2FsRW1haWwpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc2luZ0RhdGEoKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzID0gdGhpcy5maWx0ZXJDb3VudHJ5QnlDb2RlKHJlcylcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nIHx8XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnT05MWV9BRERSRVNTX1NFTEVDVElPTicpIHtcblxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gcmVzIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkcmVzc0Jvb2spIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTaSBubyBoYXkgbmluZ3VuYSBkaXJlY2Npw7NuIHNlbGVjY2lvbmFkYSwgc2VsZWNjaW9uYXIgbGEgcHJpbWVyYSBwb3IgZGVmZWN0b1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQWRkcmVzcyAmJiB0aGlzLmFkZHJlc3NCb29rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzQm9va1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRBZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3MuaWQgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHNlbGVjdGVkQWRkcmVzcy5jb3VudHJ5Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSAmJiAhdGhpcy5sYXN0U2F2ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRBdXRvU2VsZWN0QWRkcmVzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2NhcmdhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50cmllcyQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRvXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSB8fCB0aGlzLmxhc3RTYXZlZFN0YXRlKSByZXR1cm47XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UuYXNvY2lhdGVkRGF0YSQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90ID0gdGhpcy5nZXRTdW1tYXJ5VG90YWxzRnJvbUFzc29jaWF0ZWREYXRhKGRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVjT25Jbml0KClcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGZpbHRyYSBsb3MgcGFpc2VzIGRlIGFjdWVyZG8gYWwgYSBsb3MgY29kaWdvcyByZXRvcm5hZG9zIGVuIGxhIGZ1bmNpb24gZ2V0Q291bnRyaWVzLlxuICAgICAqIENhc29zIGRlIHVzb3M6IFNpIGdldENvdW50cmllcyBlcyB2YWNpbywgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogU2kgZ2V0Q291bnRyaWVzIGNvbnRpZW5lIHZhbG9yZXMgcXVlIG5vIGNvaW5jaWRlbiwgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogRGUgbG8gY29udHJhcmlvIHJldG9ybmEgbG9zIHZhbG9yZXMgZmlsdHJhZG9zLlxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgQXJyZWdsbyBxdWUgY29udGllbmUgbG9zIGNvdW50cmllcyByZWNpYmlkb3MgZW4gbGEgc3Vic2NyaXBjaW9uIGRlbCBvYnNlcnZhYmxlLlxuICAgICAqIEByZXR1cm5zIHVuIGFycmVnbG8gZGUgY291bnRyaWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmlsdGVyQ291bnRyeUJ5Q29kZSA9IChjb3VudHJpZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIC8vIDEuIFNpIGhheSBwYcOtc2VzIEVYQ0xVSURPUywgcXXDrXRhbG9zIHNpZW1wcmVcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gY291bnRyaWVzO1xuICAgICAgICBpZiAodGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMgJiYgdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoZWxlbSA9PiAhdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMuaW5jbHVkZXMoZWxlbS5jb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMi4gU2kgaGF5IHBhw61zZXMgSU5DTFVJRE9TLCBhcGxpY2EgZWwgZmlsdHJvIGRlIGluY2x1c2nDs25cbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXNGaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihlbGVtID0+IHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmluY2x1ZGVzKGVsZW0uY29kZSkpXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNGaWx0ZXJlZFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFbC9sb3MgY29kaWdvL3MgaW5ncmVzYWRvL3Mgbm8gY29pbmNpZGVuIGNvbiBsb3MgcHJvdmlzdG9zIGRlc2RlIGVsIGJhY2tlbmQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93Rm9ybUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1swXT8ucHJvdmluY2VzWzBdLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpXG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKClcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgIH1cblxuICAgIG9uRm9ybVZhbGlkID0gKCkgPT4ge1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkZvcm1DaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYWRvID0gZmFsc2VcbiAgICB9XG5cbiAgICBvbklucHV0Q2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9O1xuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoJycpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9Qcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGVzLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBvbkNvdW50cnlTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHNlbGVjdGVkQ291bnRyeSA/IHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMgOiBbXTtcbiAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcbiAgICAgICAgaWYgKGRvY3VtZW50VHlwZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbCA9IChkb2N1bWVudFR5cGVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnZhbHVlO1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY3VycmVudCk/Lm5hbWUgfHwgJyc7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbEZhY3R1cmFjaW9uID0gKGRvY3VtZW50VHlwZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IGN1cnJlbnQpPy5uYW1lIHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkID0gKCkgPT5cbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpPy52aWV3Rm9ybXM/LnBvc3Rjb2RlPy5lbmFibGVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldEJhc2VQb3N0YWxDb2RlUmVxdWlyZWQgPSAoKSA9PlxuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCk/LnZpZXdGb3Jtcz8ucG9zdGNvZGU/LnJlcXVpcmVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2aXNpYmxlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHZpc2libGUgJiYgdGhpcy5nZXRCYXNlUG9zdGFsQ29kZVJlcXVpcmVkKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVDb3VudHJ5QnlDb2RlID0gKGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKCFjb2RlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudHJ5RnJvbVN1YmplY3RzID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZSB8fCBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUgfHwgW10pXG4gICAgICAgIF0uZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSBjb2RlKTtcblxuICAgICAgICByZXR1cm4gY291bnRyeUZyb21TdWJqZWN0c1xuICAgICAgICAgICAgfHwgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gY29kZSlcbiAgICAgICAgICAgIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUgPSAoc2VsZWN0ZWRDb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZENvdW50cnkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkuY2hlY2tvdXRSZXF1aXJlZEZpZWxkcyB8fCBzZWxlY3RlZENvdW50cnkuaXNQb3N0YWxDb2RlTnVtZXJpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb3VudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvdW50cnlCeUNvZGUoc2VsZWN0ZWRDb3VudHJ5LmNvZGUgfHwgc2VsZWN0ZWRDb3VudHJ5LmNvdW50cnlDb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZSA9IChjb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRQb3N0YWxDb2RlID0gY291bnRyeT8uY2hlY2tvdXRSZXF1aXJlZEZpZWxkcz8ucG9zdGFsQ29kZTtcblxuICAgICAgICBpZiAoY2hlY2tvdXRQb3N0YWxDb2RlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrb3V0UG9zdGFsQ29kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogdHJ1ZSwgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgIH1cblxuICAgIGlzUG9zdGFsQ29kZUZpZWxkVmlzaWJsZSA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVWaXNpYmxlRmFjdHVyYWNpb24gOiB0aGlzLnBvc3RhbENvZGVWaXNpYmxlO1xuXG4gICAgaXNQb3N0YWxDb2RlRmllbGRSZXF1aXJlZCA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uIDogdGhpcy5wb3N0YWxDb2RlUmVxdWlyZWQ7XG5cbiAgICBzaG91bGRTaG93UG9zdGFsQ29kZUJ5Q291bnRyeUNvZGUgPSAoY29kZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUJ5Q29kZShjb2RlKTtcblxuICAgICAgICBpZiAoIWNvdW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpLnZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUG9zdGFsQ29kZUZpZWxkU3RhdGUoY291bnRyeSkudmlzaWJsZTtcbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXT8uZGlzYWJsZWQgfHwgdGhpcy5mb3JtUmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW47XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93bkZhY3R1cmFjaW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuO1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0RG9jdW1lbnRUeXBlID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddPy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1SZWFkb25seSkge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGNvZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdERvY3VtZW50VHlwZUZhY3R1cmFjaW9uID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24oY29kZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRmFjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgICBjbG9zZURvY3VtZW50RHJvcGRvd25zKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSA9IGFzeW5jIChlLCBpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmlvdXNUb3RhbHMgPSB7IC4uLnRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCB9O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1ZXN0cyBtdXN0IGJlIGFibGUgdG8gcmVvcGVuIHN0ZXAgMSBhbmQgZWRpdCB0aGVpciBhZGRyZXNzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkgJiYgYWRkcmVzc1NlbGVjdC5pZCAhPT0gdGhpcy5zZWxlY3RlZEFkZHJlc3MuaWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBhZGRyZXNzU2VsZWN0Py5pZDtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3M/LmlkIHx8IDA7XG4gICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIHRoZSBmb3JtIHJlYWQtb25seSB3aGlsZSBicm93c2luZyBzYXZlZCBhZGRyZXNzZXMgaW4gc2luZ2xlIG1vZGUuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhbnksXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBmb3JtOiBhbnksXG4gICAgICAgIGVycm9yTWVzc2FnZVZhcjogc3RyaW5nLFxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXNOdW1lcmljID0gc2VsZWN0ZWRJdGVtW2lzTnVtZXJpY0tleV0gPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc051bWVyaWMgPyAvXlxcZCskLyA6IC8uKi87XG4gICAgICAgIHRoaXNbZXJyb3JNZXNzYWdlVmFyXSA9IGlzTnVtZXJpYyA/IGAke2Vycm9yS2V5UHJlZml4fS5udW1lcmljYCA6IGAke2Vycm9yS2V5UHJlZml4fS5kZWZhdWx0YDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gcmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXSA6IFtWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybildO1xuICAgICAgICBmb3JtLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVFcnJvck1lc3NhZ2UgPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHZpc2libGU7XG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVJlcXVpcmVkRmFjdHVyYWNpb24gPSByZXF1aXJlZDtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb24gPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwb3N0Y29kZSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLFxuICAgICAgICAgICAgJ2RvY3VtZW50RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxuICAgICAgICAgICAgc2VsZWN0ZWREb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbixcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMsIHNob3dOb3Rlc0Vycm9yOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYW5Db21wbGV0ZUxlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgaWYgKHNob3dOb3Rlc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdyZXF1aXJlZC1maWVsZHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhZGRyZXNzU2VsZWN0ZWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKVxuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZC5pZCB8fCAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBheWxvYWQgPSB0aGlzLmNvbXBhY3RBZGRyZXNzVmlld1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkLFxuICAgICAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzc1NlbGVjdGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3MuY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1vZGUgPSAoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcykge1xuICAgICAgICAgICAgY2FzZSAnT05MWV9MT0FEX0FERFJFU1MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIGNhc2UgJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBZGRyZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgc2V0TW9kZSA9IChtb2RlKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gbW9kZSA9PSBcImNhcmdhXCI7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0TW9kZUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgPyB0aGlzLnNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA6IHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldE1vZGVGYWN0dXJhY2lvbiA9IChtb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzRmFjdHVyYWNpb24gPSBtb2RlID09PSAnY2FyZ2EnO1xuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIHNldFNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IChhZGRyZXNzU2VsZWN0OiBhbnkpID0+IHtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkRmFjdHVyYWNpb24gPSBTdHJpbmcoYWRkcmVzcy5pZCkgPT09IFN0cmluZyhhZGRyZXNzU2VsZWN0Py5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9ICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZEZhY3R1cmFjaW9uKT8uaWQgfHwgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQWRkcmVzc0Zyb21Cb29rID0gKGJvb2tBZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFjdCA9IGJvb2tBZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBsYXN0TmFtZTogY29udGFjdC5sYXN0TmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwgfHwgJycsXG4gICAgICAgICAgICBkb2N1bWVudFR5cGU6IGNvbnRhY3QuZG9jdW1lbnRUeXBlIHx8ICcnLFxuICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXIgfHwgJycsXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogYm9va0FkZHJlc3MuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGJvb2tBZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgIGNpdHk6IGJvb2tBZGRyZXNzLmNpdHksXG4gICAgICAgICAgICBzdHJlZXQ6IGJvb2tBZGRyZXNzLnN0cmVldCxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBib29rQWRkcmVzcy5wb3N0Y29kZT8udG9TdHJpbmcoKSB8fCAnJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZUJpbGxpbmdGb3JtU3VibWl0ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmVyaWZ5VmFsaWRhdGUobnVsbCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdGhpcy5uZXh0U3RlcCgpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3Qgbm90ZXNDZmcgPSB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzO1xuICAgICAgICBpZiAobm90ZXNDZmcucmVxdWlyZWQgJiYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3Rlcy50cmltKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ3JlcXVpcmVkLWZpZWxkcycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZCA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkKSB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzSWQ6IGFkZHJlc3NTZWxlY3RlZC5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWQuaWQsXG4gICAgICAgICAgICAgICAgbm90ZXM6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCBcIlwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXJCeUlkcyhyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkgeyB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgIChpdGVtcyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGU/LnNoaXBwaW5nQWRkcmVzcz8uY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZT8uc2hpcHBpbmdBZGRyZXNzPy5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxzQ2hhbmdlZCA9IHRoaXMuaGF2ZVRvdGFsc0NoYW5nZWQocHJldmlvdXNUb3RhbHMsIHJlc3VsdFNlZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmIHRoaXMubmV4dFN0ZXApIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7IHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTsgcmV0dXJuOyB9XG4gICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWRGYWN0dXJhY2lvbik7XG4gICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZEVudmlvID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCk7XG4gICAgICAgIGlmICghYWRkcmVzc1NlbGVjdGVkRmFjdHVyYWNpb24gfHwgIWFkZHJlc3NTZWxlY3RlZEVudmlvKSB7IHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKTsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZEVudmlvLmlkIHx8IDA7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9IGFkZHJlc3NTZWxlY3RlZEZhY3R1cmFjaW9uLmlkIHx8IDA7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRFbnZpby5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8IFwiXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlckJ5SWRzKHJlcXVlc3QpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHRTZWRlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IHJldHVybjsgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgYWRkcmVzc1NlbGVjdGVkRW52aW8uY2l0eSArICcgLSAnICsgYWRkcmVzc1NlbGVjdGVkRW52aW8uc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkgeyB0b3RhbHNDaGFuZ2VkICYmIHRoaXMuc2Nyb2xsVG9MZWdhY3lTdW1tYXJ5KCk7IHJldHVybjsgfVxuICAgICAgICAgICAgZWxzZSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IH1cbiAgICAgICAgZmluYWxseSB7IHRoaXMubG9hZGluZyA9IGZhbHNlOyB9XG4gICAgfVxuXG4gICAgb25TdWJtaXROZXdCaWxsaW5nQWRkcmVzcyA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3QgYWRkcmVzc1NlbGVjdGVkRW52aW8gPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWRFbnZpbykgeyB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1RvdGFscyA9IHsgLi4udGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90IH07XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaWxsaW5nRm9ybURhdGEgPSB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICAgICAgYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlID0gYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzc0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiB0aGlzLmJ1aWxkQWRkcmVzc0Zyb21Cb29rKGFkZHJlc3NTZWxlY3RlZEVudmlvKSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzczogYmlsbGluZ0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgIG5vdGVzOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgXCJcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhhZGRyZXNzRGF0YSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdlbWFpbF9hbHJlYWR5X3JlZ2lzdGVyZWQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCBhZGRyZXNzU2VsZWN0ZWRFbnZpby5jaXR5ICsgJyAtICcgKyBhZGRyZXNzU2VsZWN0ZWRFbnZpby5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpOyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICB0b2dnbGVBZGRyZXNzRHJvcGRvd24gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW47XG4gICAgfVxuXG4gICAgc2VsZWN0QWRkcmVzc0Zyb21Ecm9wZG93biA9IChhZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbk5vdGVzQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEFkZHJlc3NMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzIHx8IHRoaXMuYWRkcmVzc0Jvb2s/LmZpbmQoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzKSByZXR1cm4gdGhpcy5nZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCgpO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgbWFpbiA9IFtuYW1lLCBhZGRyZXNzLnN0cmVldCwgYWRkcmVzcy5jaXR5XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgIHJldHVybiBtYWluIHx8IHRoaXMuZ2V0RGVmYXVsdFNlbGVjdGVkTGFiZWwoKTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzT3B0aW9uTGFiZWwgPSAoYWRkcmVzczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgcmV0dXJuIFtuYW1lLCBhZGRyZXNzPy5zdHJlZXQsIGFkZHJlc3M/LmNpdHldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3KSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rPy5sZW5ndGggPyAodGhpcy5hZGRyZXNzQm9va1swXT8uc3RyZWV0IHx8ICcnKSA6ICcnO1xuICAgIH1cblxuICAgIGdldENvdW50cnkgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQocGFpc2VzID0+IHBhaXNlcy5jb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0UHJvdmluY2UgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZChjdCA9PiBjdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldERvY3VtZW50VHlwZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmRvY3VtZW50VHlwZXMuZmluZChkdCA9PiBkdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldExhYmVsTm90ZXNQYXJhbSA9ICgpID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlID0gKG5hbWVQYXJhbSkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsIG5hbWVQYXJhbSArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRGaWx0ZXJlZEFkZHJlc3NCb29rID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2sgfHwgIXRoaXMuYWRkcmVzc0Jvb2subGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVybSA9ICh0aGlzLmFkZHJlc3NTZWFyY2ggfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBbXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJlZXQsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jaXR5LFxuICAgICAgICAgICAgICAgIGFkZHJlc3MucG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jb3VudHJ5Q29kZSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvdW50cnkoYWRkcmVzcy5jb3VudHJ5Q29kZSksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm92aW5jZShhZGRyZXNzLnByb3ZpbmNlQ29kZSksXG4gICAgICAgICAgICAgICAgY29udGFjdC5maXJzdE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGFjdC5sYXN0TmFtZSxcbiAgICAgICAgICAgICAgICBjb250YWN0LmVtYWlsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RmlsdGVyZWRBZGRyZXNzT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRBZGRyZXNzQm9vaygpLm1hcChhZGRyZXNzID0+ICh7XG4gICAgICAgICAgICAuLi5hZGRyZXNzLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuZ2V0QWRkcmVzc09wdGlvbkxhYmVsKGFkZHJlc3MpXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBoYXNTZWxlY3RlZEFkZHJlc3MgPSAoKSA9PiAhIXRoaXMuYWRkcmVzc0Jvb2s/LnNvbWUoaXRlbSA9PiBpdGVtPy5zZWxlY3RlZCk7XG5cbiAgICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRBZGRyZXNzID0gKGFkZHJlc3M6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnLFxuICAgICAgICAgICAgbGFzdE5hbWU6IGNvbnRhY3QubGFzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBwaG9uZU51bWJlcjogY29udGFjdC5waG9uZU51bWJlciB8fCAnJyxcbiAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsIHx8IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnZhbHVlLFxuICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiBjb250YWN0LmRvY3VtZW50VHlwZSB8fCAnJyxcbiAgICAgICAgICAgIGRvY3VtZW50TnVtYmVyOiBjb250YWN0LmRvY3VtZW50TnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgc3RyZWV0OiBhZGRyZXNzLnN0cmVldCB8fCAnJyxcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiBhZGRyZXNzLmNvdW50cnlDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBjaXR5OiBhZGRyZXNzLmNpdHkgfHwgJycsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGFkZHJlc3MucHJvdmluY2VDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBwb3N0Y29kZTogYWRkcmVzcy5wb3N0Y29kZSB8fCAnJyxcbiAgICAgICAgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IGFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZERvYyA9IHNlbGVjdGVkQ291bnRyeT8uZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY29udGFjdC5kb2N1bWVudFR5cGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2MpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDaGVja291dEZvcm1SZWFkb25seSA9IChyZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLmZvcm1SZWFkb25seSA9IHJlYWRvbmx5O1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzW2tleV07XG4gICAgICAgICAgICByZWFkb25seSA/IGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRBdXRvU2VsZWN0QWRkcmVzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyB8fCB0aGlzLmdldE1vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEFkZHJlc3M/LmlzVGVtcG9yYXJ5KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVGVtcG9yYXJ5QWRkcmVzc0Zyb21Gb3JtID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWN0ID0gdGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IHtcbiAgICAgICAgICAgIGlkOiAtMSAqICgrK3RoaXMudGVtcEFkZHJlc3NJZCksXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzVGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgICAgICAgc3RyZWV0OiBjb250YWN0LnN0cmVldCxcbiAgICAgICAgICAgIGNpdHk6IGNvbnRhY3QuY2l0eSxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBjb250YWN0LnBvc3Rjb2RlLFxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGNvbnRhY3QuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGNvbnRhY3QucHJvdmluY2VDb2RlLFxuICAgICAgICAgICAgYWRkcmVzc0NvbnRhY3Q6IHtcbiAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgICAgICAgICAgICAgIGxhc3ROYW1lOiBjb250YWN0Lmxhc3ROYW1lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsLFxuICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50VHlwZTogY29udGFjdC5kb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IFtcbiAgICAgICAgICAgIG5ld0FkZHJlc3MsXG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NCb29rLm1hcChhZGRyZXNzID0+ICh7IC4uLmFkZHJlc3MsIHNlbGVjdGVkOiBmYWxzZSB9KSlcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gbmV3QWRkcmVzcy5pZDtcbiAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhuZXdBZGRyZXNzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVRlbXBvcmFyeUFkZHJlc3MgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9vaz8ubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQ3VycmVudFN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCB8fCB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaWQgfHwgMCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb2RlOiAnZm9ybScsXG4gICAgICAgICAgICBmb3JtOiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICAgICAgYmlsbGluZzogdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID8gbnVsbCA6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSxcbiAgICAgICAgICAgIHZpZXdEYXRhRmFjdHVyYWNpb246IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGlydHlTdGF0ZSA9IChuZXh0RGlydHk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSA9PT0gbmV4dERpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IG5leHREaXJ0eTtcbiAgICAgICAgaWYgKG5leHREaXJ0eSAmJiB0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eUNoYW5nZS5lbWl0KHRoaXMuaXNEaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmJ1aWxkQ3VycmVudFN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXZhbHVhdGVEaXJ0eVN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc0RpcnR5KSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5idWlsZEN1cnJlbnRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXh0RGlydHkgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50KSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5sYXN0U2F2ZWRTdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShuZXh0RGlydHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jYXJ0U2VydmljZT8uY2hhbm5lbENvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJlxuICAgICAgICAgICAgdGhpcy5pc0xhc3RPbmUgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1NoaXBwaW5nU3RlcEFsbG93ZWQgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1BheW1lbnRTdGVwQWxsb3dlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4gdGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSAmJiB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uICYmICF0aGlzLmlzRGlydHk7XG5cbiAgICBnZXRQcmltYXJ5QWN0aW9uTGFiZWwgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0T25lICYmICF0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDogJ3JlYWR5LWZvcm0nO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RW1wdHlUb3RhbHNTbmFwc2hvdCA9ICgpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4gKHtcbiAgICAgICAgc3VidG90YWw6IDAsXG4gICAgICAgIHRheGVzOiAwLFxuICAgICAgICBzaGlwcGluZzogMCxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICAgIGNsaWVudFRheGVzOiAwLFxuICAgICAgICBwcm9tb3Rpb246IDAsXG4gICAgICAgIGl0ZW1zOiAwXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGdldFN1bW1hcnlUb3RhbHNGcm9tQXNzb2NpYXRlZERhdGEgPSAoZGF0YTogYW55W10gfCBudWxsKTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmdldEVtcHR5VG90YWxzU25hcHNob3QoKTtcbiAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihpdGVtPy5hbW91bnQgfHwgMCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0/LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdWJ0b3RhbCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnN1YnRvdGFsID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5pdGVtcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50YXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2hpcG1lbnQnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5zaGlwcGluZyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpZW50VGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5jbGllbnRUYXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndG90YWwnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50b3RhbCA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzY291bnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnByb21vdGlvbiArPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlciA9IChvcmRlcjogYW55KTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3QgdG90YWxzID0gb3JkZXI/LnRvdGFscyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YnRvdGFsOiBOdW1iZXIodG90YWxzLnN1YnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgdGF4ZXM6IE51bWJlcih0b3RhbHMudGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBzaGlwcGluZzogTnVtYmVyKHRvdGFscy5zaGlwcGluZyB8fCAwKSxcbiAgICAgICAgICAgIHRvdGFsOiBOdW1iZXIodG90YWxzLnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgY2xpZW50VGF4ZXM6IE51bWJlcih0b3RhbHMuY2xpZW50VGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBwcm9tb3Rpb246IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KG9yZGVyKSxcbiAgICAgICAgICAgIGl0ZW1zOiBOdW1iZXIodG90YWxzLml0ZW1zIHx8IDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXZlVG90YWxzQ2hhbmdlZCA9IChiZWZvcmU6IFN1bW1hcnlUb3RhbHNTbmFwc2hvdCwgb3JkZXI6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBhZnRlciA9IHRoaXMuZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlcihvcmRlcik7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBiZWZvcmUuc3VidG90YWwgIT09IGFmdGVyLnN1YnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUudGF4ZXMgIT09IGFmdGVyLnRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUuc2hpcHBpbmcgIT09IGFmdGVyLnNoaXBwaW5nIHx8XG4gICAgICAgICAgICBiZWZvcmUudG90YWwgIT09IGFmdGVyLnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUuY2xpZW50VGF4ZXMgIT09IGFmdGVyLmNsaWVudFRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUucHJvbW90aW9uICE9PSBhZnRlci5wcm9tb3Rpb24gfHxcbiAgICAgICAgICAgIGJlZm9yZS5pdGVtcyAhPT0gYWZ0ZXIuaXRlbXNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvTGVnYWN5U3VtbWFyeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2NhcmRDaGFuZ2VzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubGFzdFNhdmVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFNhdmVkU3RhdGUubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLnNlbGVjdGVkSWQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zZWxlY3RlZCA9IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZCB8fCAwO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyA9IHRoaXMubGFzdFNhdmVkU3RhdGUubm90ZXMgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhzZWxlY3RlZEFkZHJlc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLm5vdGVzIHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gdGhpcy5sYXN0U2F2ZWRTdGF0ZS52aWV3RGF0YUZhY3R1cmFjaW9uID8/IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbjtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnBhdGNoVmFsdWUodGhpcy5sYXN0U2F2ZWRTdGF0ZS5mb3JtIHx8IHt9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0U2F2ZWRTdGF0ZS5iaWxsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5wYXRjaFZhbHVlKHRoaXMubGFzdFNhdmVkU3RhdGUuYmlsbGluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10udmFsdWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRG9jID0gc2VsZWN0ZWRDb3VudHJ5Py5kb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZERvYykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwcHJlc3NEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldERpcnR5U3RhdGUoZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==
|