ng-payment-card
Version:
Customizable component with zero external dependencies.
614 lines (601 loc) • 60 kB
JavaScript
import { __values, __read } from 'tslib';
import { Injectable, Component, EventEmitter, Output, Input, ViewEncapsulation, Pipe, NgModule } from '@angular/core';
import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* Collection of validation methods
*/
var CardValidator = /** @class */ (function () {
function CardValidator() {
}
/**
* Check if control contains numbers only
*/
/**
* Check if control contains numbers only
* @param {?} abstractCtrl
* @return {?}
*/
CardValidator.numbersOnly = /**
* Check if control contains numbers only
* @param {?} abstractCtrl
* @return {?}
*/
function (abstractCtrl) {
/** @type {?} */
var ccNum = abstractCtrl.value;
/** @type {?} */
var NUMBERS_ONLY = new RegExp(/^[0-9]+$/);
return !NUMBERS_ONLY.test(ccNum) ? CardValidator.NUMBERS_ONLY_ERR : null;
};
/**
* Check checksum number in card number using Luhn algorithm
*/
/**
* Check checksum number in card number using Luhn algorithm
* @param {?} abstractCtr
* @return {?}
*/
CardValidator.checksum = /**
* Check checksum number in card number using Luhn algorithm
* @param {?} abstractCtr
* @return {?}
*/
function (abstractCtr) {
/** @type {?} */
var ccNumber = abstractCtr.value;
/** @type {?} */
var luhnArray = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9];
/** @type {?} */
var length = ccNumber ? ccNumber.length : 0;
/** @type {?} */
var sum = 0;
/** @type {?} */
var shouldMultiply = true;
while (length) {
/** @type {?} */
var val = parseInt(ccNumber.charAt(--length), 10);
sum += (shouldMultiply = !shouldMultiply) ? luhnArray[val] : val;
}
return !(sum && sum % 10 === 0) ? CardValidator.CHECKSUM_INVALID : null;
};
/**
* Check validity of the card
*/
/**
* Check validity of the card
* @param {?} formGroup
* @return {?}
*/
CardValidator.expiration = /**
* Check validity of the card
* @param {?} formGroup
* @return {?}
*/
function (formGroup) {
/** @type {?} */
var expirationMonth = Number(formGroup.get('expirationMonth').value);
/** @type {?} */
var expirationYear = Number(formGroup.get('expirationYear').value);
/** @type {?} */
var expirationDate = new Date(expirationYear, expirationMonth + 1, 0);
return new Date().getTime() > expirationDate.getTime() ? CardValidator.CARD_EXPIRED : null;
};
/**
* Custom error for alphanumeric input
*/
CardValidator.NUMBERS_ONLY_ERR = {
numbersOnly: true,
};
/**
* Custom error for invalid checksum
*/
CardValidator.CHECKSUM_INVALID = {
checksum: true,
};
/**
* Custom error for expired card
*/
CardValidator.CARD_EXPIRED = {
expiration: true,
};
return CardValidator;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/** @enum {string} */
var CardType = {
AMERICAN_EXPRESS: 'American Express',
DINERS: 'Diners',
DINERS_CARTE_BLANCHE: 'Diners Carte Blanche',
DISCOVER_CLUB: 'Discover Club',
CHINA_UNIONPAY: 'China UnionPay',
JCB: 'JCB',
LASER: 'Laser',
MAESTRO: 'Maestro',
MASTERCARD: 'Mastercard',
VISA_ELECTRON: 'Visa Electron',
VISA: 'VISA',
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/** @type {?} */
var CARD_TYPES = new Map();
CARD_TYPES.set(CardType.AMERICAN_EXPRESS, new RegExp('^3[47]'));
CARD_TYPES.set(CardType.DINERS, new RegExp('^36'));
CARD_TYPES.set(CardType.DINERS_CARTE_BLANCHE, new RegExp('^30[0-5]'));
CARD_TYPES.set(CardType.DISCOVER_CLUB, new RegExp('^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)'));
CARD_TYPES.set(CardType.CHINA_UNIONPAY, new RegExp('^(62[0-9]{14,17})$'));
CARD_TYPES.set(CardType.JCB, new RegExp('^35(2[89]|[3-8][0-9])'));
CARD_TYPES.set(CardType.LASER, new RegExp('^(6304|6706|6709|6771)[0-9]{12,15}$'));
CARD_TYPES.set(CardType.MAESTRO, new RegExp('^(50|5[6-8]|6)[0-9]{12,19}$'));
CARD_TYPES.set(CardType.MASTERCARD, new RegExp('^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$'));
CARD_TYPES.set(CardType.VISA_ELECTRON, new RegExp('^(4026|417500|4508|4844|491([37]))'));
CARD_TYPES.set(CardType.VISA, new RegExp('^4'));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/** @enum {string} */
var Month = {
JANUARY: '01',
FEBRUARY: '02',
MARCH: '03',
APRIL: '04',
MAY: '05',
JUNE: '06',
JULY: '07',
AUGUST: '08',
SEPTEMBER: '09',
OCTOBER: '10',
NOVEMBER: '11',
DECEMBER: '12',
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var PaymentCardService = /** @class */ (function () {
function PaymentCardService() {
}
/**
* Return card type based on card number
*/
/**
* Return card type based on card number
* @param {?} ccNum
* @return {?}
*/
PaymentCardService.getCardType = /**
* Return card type based on card number
* @param {?} ccNum
* @return {?}
*/
function (ccNum) {
var e_1, _a;
try {
for (var _b = __values(Array.from(PaymentCardService.cardTypes.entries())), _c = _b.next(); !_c.done; _c = _b.next()) {
var _d = __read(_c.value, 2), key = _d[0], val = _d[1];
if (ccNum
.split(new RegExp('[ \\-]'))
.join('')
.match(val)) {
return key;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return null;
};
/**
* Return months in numerical format
*/
/**
* Return months in numerical format
* @return {?}
*/
PaymentCardService.getMonths = /**
* Return months in numerical format
* @return {?}
*/
function () {
var e_2, _a;
/** @type {?} */
var months = [];
try {
for (var _b = __values(Object.keys(Month)), _c = _b.next(); !_c.done; _c = _b.next()) {
var key = _c.value;
months.push(Month[key]);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
return months;
};
/**
* Return years based on current year
*/
/**
* Return years based on current year
* @return {?}
*/
PaymentCardService.getYears = /**
* Return years based on current year
* @return {?}
*/
function () {
/** @type {?} */
var years = [];
/** @type {?} */
var year = new Date().getFullYear();
for (var i = -2; i < 5; i++) {
years.push(year + i);
}
return years;
};
/**
* Collection of card types
*/
PaymentCardService.cardTypes = CARD_TYPES;
PaymentCardService.decorators = [
{ type: Injectable }
];
return PaymentCardService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* NgPaymentCard without any dependencies other then ReactiveFormsModule
*/
var PaymentCardComponent = /** @class */ (function () {
function PaymentCardComponent(_ccService, _fb) {
this._ccService = _ccService;
this._fb = _fb;
/**
* List of months
*/
this.months = [];
/**
* List of years
*/
this.years = [];
/**
* Validation message for missing payment card number
*/
this.ccNumMissingTxt = 'Card number is required';
/**
* Validation message for too short payment card number
*/
this.ccNumTooShortTxt = 'Card number is too short';
/**
* Validation message for too long payment card number
*/
this.ccNumTooLongTxt = 'Card number is too long';
/**
* Validation message for payment card number that contains characters other than digits
*/
this.ccNumContainsLettersTxt = 'Card number can contain digits only';
/**
* Validation message for invalid payment card number (Luhn's validation)
*/
this.ccNumChecksumInvalidTxt = 'Provided card number is invalid';
/**
* Validation message for missing card holder name
*/
this.cardHolderMissingTxt = 'Card holder name is required';
/**
* Validation message for too long card holder name
*/
this.cardHolderTooLongTxt = 'Card holder name is too long';
/**
* Validation message for missing expiration month
*/
this.expirationMonthMissingTxt = 'Expiration month is required';
/**
* Validation message for missing expiration year
*/
this.expirationYearMissingTxt = 'Expiration year is required';
/**
* Validation message for missing CCV number
*/
this.ccvMissingTxt = 'CCV number is required';
/**
* Validation message for too short CCV number
*/
this.ccvNumTooShortTxt = 'CCV number is too short';
/**
* Validation message for too long CCV number
*/
this.ccvNumTooLongTxt = 'CCV number is too long';
/**
* Validation message for incorrect CCV number containing characters other than digits
*/
this.ccvContainsLettersTxt = 'CCV number can contain digits only';
/**
* Validation message for expired card
*/
this.cardExpiredTxt = 'Card has expired';
/**
* Switch validation of the payment card number
*/
this.validateCCNum = true;
/**
* Switch validation of the payment card holder
*/
this.validateCardHolder = true;
/**
* Switch validation of the payment card expiration month
*/
this.validateExpirationMonth = true;
/**
* Switch validation of the payment card expiration year
*/
this.validateExpirationYear = true;
/**
* Switch validation of the payment card expiration
*/
this.validateCardExpiration = true;
/**
* Switch validation of the payment card CCV number
*/
this.validateCCV = true;
/**
* EventEmitter for payment card object
*/
this.formSaved = new EventEmitter();
}
/**
* @return {?}
*/
PaymentCardComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.buildForm();
this.assignDateValues();
};
/**
* Populate months and years
*/
/**
* Populate months and years
* @return {?}
*/
PaymentCardComponent.prototype.assignDateValues = /**
* Populate months and years
* @return {?}
*/
function () {
this.months = PaymentCardService.getMonths();
this.years = PaymentCardService.getYears();
};
/**
* Build reactive form
*/
/**
* Build reactive form
* @return {?}
*/
PaymentCardComponent.prototype.buildForm = /**
* Build reactive form
* @return {?}
*/
function () {
this.ccForm = this._fb.group({
cardNumber: [
'',
Validators.compose([
Validators.required,
Validators.minLength(12),
Validators.maxLength(19),
CardValidator.numbersOnly,
CardValidator.checksum,
]),
],
cardHolder: ['', Validators.compose([Validators.required, Validators.maxLength(22)])],
expirationMonth: ['', Validators.required],
expirationYear: ['', Validators.required],
ccv: [
'',
Validators.compose([
Validators.required,
Validators.minLength(3),
Validators.maxLength(4),
CardValidator.numbersOnly,
]),
],
}, {
validator: CardValidator.expiration,
});
};
/**
* Returns payment card type based on payment card number
*/
/**
* Returns payment card type based on payment card number
* @param {?} ccNum
* @return {?}
*/
PaymentCardComponent.prototype.getCardType = /**
* Returns payment card type based on payment card number
* @param {?} ccNum
* @return {?}
*/
function (ccNum) {
return PaymentCardService.getCardType(ccNum);
};
/**
* Callback function that emits payment card details after user clicks submit, or press enter
*/
/**
* Callback function that emits payment card details after user clicks submit, or press enter
* @return {?}
*/
PaymentCardComponent.prototype.emitSavedCard = /**
* Callback function that emits payment card details after user clicks submit, or press enter
* @return {?}
*/
function () {
/** @type {?} */
var cardDetails = (/** @type {?} */ (this.ccForm.value));
this.formSaved.emit(cardDetails);
};
PaymentCardComponent.decorators = [
{ type: Component, args: [{
selector: 'ng-payment-card',
template: "<section class=\"cc-wrapper\">\r\n <div class=\"cc-box\">\r\n <div #ccBoxFlip class=\"cc-box--flip\">\r\n <div class=\"cc-box__front\">\r\n <div class=\"cc-box__logo\">\r\n <p>{{getCardType(ccNumber.value) | uppercase}}</p>\r\n </div>\r\n <div class=\"cc-box__element\">\r\n <label class=\"cc-form__label\" for=\"cc-card-number-display\"></label>\r\n <input class=\"cc-form__input cc-form__input--transparent cc-form__input--embosed\" id=\"cc-card-number-display\"\r\n aria-label=\"Payment card number\" disabled=\"disabled\"\r\n [value]=\"ccForm.get('cardNumber').value | paymentCardNumber\">\r\n </div>\r\n <div class=\"cc-box__element\">\r\n <label class=\"cc-form__label\" for=\"cc-holder-display\">CARD HOLDER</label>\r\n <input class=\"cc-form__input cc-form__input--transparent cc-form__input--embosed\" id=\"cc-holder-display\"\r\n aria-label=\"Card holder\" disabled=\"disabled\" [value]=\"ccForm.get('cardHolder').value | uppercase\">\r\n </div>\r\n <div class=\"cc-box__element\">\r\n <label class=\"cc-form__label\" for=\"cc-valid-date-display\">VALID THRU</label>\r\n <input class=\"cc-form__input cc-form__input--left-align cc-form__input--transparent cc-form__input--embosed\"\r\n id=\"cc-valid-date-display\" aria-label=\"Card holder\" disabled=\"disabled\"\r\n [value]=\"ccForm.get('expirationMonth').value + '/' + ccForm.get('expirationYear').value | validThru\">\r\n </div>\r\n <div class=\"cc-box__chip\"></div>\r\n </div>\r\n <div class=\"cc-box__back\">\r\n <div class=\"cc-box__strip\"> </div>\r\n <div class=\"cc-box__element\">\r\n <input class=\"cc-form__input cc-form__input--cursive cc-form__input--right-align\" id=\"cc-ccv-display\"\r\n aria-label=\"CCV\" disabled=\"disabled\"\r\n [value]=\"'CCV: ' + ccForm.get('ccv').value\" title=\"CCV\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <form class=\"cc-form\" [formGroup]=\"ccForm\" autocomplete=\"off\">\r\n <div class=\"cc-form__wrapper--long\">\r\n <label for=\"cc-number\" class=\"cc-form__label cc-form__label--first\">Card number</label>\r\n <input #ccNumber class=\"cc-form__input\" id=\"cc-number\" aria-label=\"Card number\"\r\n type=\"text\" title=\"Card number\" maxlength=\"19\" formControlName=\"cardNumber\"\r\n (focus)=\"ccBoxFlip.classList.remove('hover')\">\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCNum && ccForm.get('cardNumber').touched && ccForm.get('cardNumber').hasError('required')\">\r\n {{ccNumMissingTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCNum && ccForm.get('cardNumber').touched && ccForm.get('cardNumber').hasError('minlength')\">\r\n {{ccNumTooShortTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCNum && ccForm.get('cardNumber').touched && ccForm.get('cardNumber').hasError('maxlength')\">\r\n {{ccNumTooLongTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCNum && ccForm.get('cardNumber').touched && ccForm.get('cardNumber').hasError('numbersOnly')\">\r\n {{ccNumContainsLettersTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCNum && ccForm.get('cardNumber').touched && ccForm.get('cardNumber').hasError('checksum')\">\r\n {{ccNumChecksumInvalidTxt}}\r\n </div>\r\n </div>\r\n <div class=\"cc-form__wrapper--long\">\r\n <label for=\"cc-holder-name\" class=\"cc-form__label\">Card Holder name</label>\r\n <input class=\"cc-form__input\" id=\"cc-holder-name\" aria-label=\"Card holder name\" type=\"text\"\r\n title=\"Card holder name\" maxlength=\"22\" formControlName=\"cardHolder\"\r\n (focus)=\"ccBoxFlip.classList.remove('hover')\">\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCardHolder && ccForm.get('cardHolder').touched &&\r\n ccForm.get('cardHolder').hasError('required')\">\r\n {{cardHolderMissingTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCardHolder && ccForm.get('cardHolder').touched &&\r\n ccForm.get('cardHolder').hasError('maxlength')\">\r\n {{cardHolderTooLongTxt}}\r\n </div>\r\n </div>\r\n <div class=\"cc-form--inline\">\r\n <div class=\"cc-form__wrapper cc-form__wrapper--short\">\r\n <label for=\"cc-expiration-month\" class=\"cc-form__label\">Expiration month</label>\r\n <select id=\"cc-expiration-month\" class=\"cc-form__select\" aria-label=\"Expiration month\"\r\n formControlName=\"expirationMonth\">\r\n <option *ngFor=\"let month of months\" value=\"{{month}}\"\r\n (click)=\"ccBoxFlip.classList.remove('hover')\">{{month}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"cc-form__wrapper cc-form__wrapper--short\">\r\n <label for=\"cc-expiration-year\" class=\"cc-form__label\">Expiration year</label>\r\n <select id=\"cc-expiration-year\" class=\"cc-form__select\" aria-label=\"Expiration year\"\r\n formControlName=\"expirationYear\">\r\n <option *ngFor=\"let year of years\" value=\"{{year}}\"\r\n (click)=\"ccBoxFlip.classList.remove('hover')\">{{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"cc-form__wrapper cc-form__wrapper--short cc-form__wrapper--last\">\r\n <label for=\"cc-ccv\" class=\"cc-form__label\">ccv</label>\r\n <input class=\"cc-form__input cc-form__input--short\" id=\"cc-ccv\" aria-label=\"CCV\" type=\"text\" title=\"CCV\"\r\n minlength=\"3\" maxlength=\"4\" formControlName=\"ccv\" (focus)=\"ccBoxFlip.classList.add('hover')\">\r\n </div>\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateExpirationMonth && ccForm.get('expirationMonth').touched &&\r\n ccForm.get('expirationMonth').hasError('required')\">\r\n {{expirationMonthMissingTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateExpirationMonth && ccForm.get('expirationYear').touched &&\r\n ccForm.get('expirationYear').hasError('required')\">\r\n {{expirationYearMissingTxt}}\r\n </div>\r\n <div class=\"cc-form__error\" *ngIf=\"validateCardExpiration && ccForm.get('expirationMonth').touched &&\r\n ccForm.get('expirationYear').touched && ccForm.hasError('expiration')\">\r\n {{cardExpiredTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCV && ccForm.get('ccv').touched && ccForm.get('ccv').hasError('required')\">\r\n {{ccvMissingTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCV && ccForm.get('ccv').touched && ccForm.get('ccv').hasError('minlength')\">\r\n {{ccvNumTooShortTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCV && ccForm.get('ccv').touched && ccForm.get('ccv').hasError('maxlength')\">\r\n {{ccvNumTooLongTxt}}\r\n </div>\r\n <div class=\"cc-form__error\"\r\n *ngIf=\"validateCCV && ccForm.get('ccv').touched && ccForm.get('ccv').hasError('numbersOnly')\">\r\n {{ccvContainsLettersTxt}}\r\n </div>\r\n <button type=\"submit\" class=\"cc-form__button cc-form__button--ripple\" aria-label=\"submit\" (click)=\"emitSavedCard()\"\r\n (keydown.enter)=\"emitSavedCard()\">Submit\r\n </button>\r\n </form>\r\n</section>\r\n",
encapsulation: ViewEncapsulation.None,
styles: ["@import url(https://fonts.googleapis.com/css?family=Inconsolata);.cc-form{align-items:center;display:flex;flex-flow:column;flex-wrap:wrap;height:100%;justify-content:center;width:100%}.cc-form--inline{align-items:inherit;display:inherit;flex-flow:row;flex-wrap:inherit;height:100%;justify-content:flex-end;margin-bottom:5%;width:100%}@media only screen and (max-width:1279px){.cc-form--inline{align-items:inherit;display:inherit;flex-flow:row;flex-wrap:inherit;height:100%;justify-content:flex-end;margin-bottom:5%;width:100%}}@media only screen and (max-width:599px){.cc-form--inline{align-items:center;display:inherit;flex-flow:column;flex-wrap:wrap;height:100%;justify-content:center;width:100%}}input[type=number]{-moz-appearance:textfield}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}@media only screen and (max-width:1919px){.cc-form__wrapper{margin-right:5%;margin-top:5%}.cc-form__wrapper--long{width:60%}.cc-form__wrapper--short{width:15%}.cc-form__wrapper--last{margin-left:5%;margin-right:20%;margin-top:30px}}@media only screen and (max-width:1279px){.cc-form__wrapper{margin-right:5%;margin-top:5%}.cc-form__wrapper--long{width:60%}.cc-form__wrapper--short{width:15%}.cc-form__wrapper--last{margin-left:5%;margin-right:20%}}@media only screen and (max-width:599px){.cc-form__wrapper{margin-right:0;margin-top:0}.cc-form__wrapper--long,.cc-form__wrapper--short{width:80%}.cc-form__wrapper--last{margin-left:0;margin-right:0}}.cc-form__label{color:rgba(0,0,0,.6);display:block;font-family:Inconsolata,Serif,serif;font-size:.7em;font-weight:400;letter-spacing:1px;line-height:10px;margin-bottom:5px;margin-top:5%;text-align:left;text-shadow:none;text-transform:uppercase;width:100%}.cc-form__label--first{margin-top:20%}.cc-form__select{-webkit-appearance:listbox;-moz-appearance:listbox;appearance:listbox}.cc-form__input,.cc-form__select{border:1px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:inset 0 1px 4px rgba(0,0,0,.2);color:#333;display:block;font-size:1.2em;height:38px;margin:0;outline:0;padding:0;text-align:left;width:100%}.cc-form__input--transparent{background:0 0;border:none;border-radius:0;box-shadow:none}.cc-form__input--embosed{color:#fff;font-family:Inconsolata,monospace;font-size:2vw;text-shadow:0 2px 1px rgba(0,0,0,.3)}@media only screen and (max-width:1279px){.cc-form__input--embosed{font-size:2.5vw}}@media only screen and (max-width:599px){.cc-form__input--embosed{font-size:3vw}}.cc-form__input--cursive{font-size:.7em;font-style:italic;left:0;margin:0 auto;position:absolute}.cc-form__input--right-align{padding-right:5%;text-align:right}.cc-form__input--left-align{text-align:left}.cc-form__input:focus,.cc-form__select:focus{border-color:#41acf4}.cc-form__error{color:#ff5b5f;font-size:.7em}.cc-form__button{background:#41acf4;border:0;border-radius:3px;color:#fff;cursor:pointer;margin-bottom:5%;margin-top:1%;outline:0;overflow:hidden;padding:1%;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap;width:60%}.cc-form__button:hover{box-shadow:0 6px 8px -3px rgba(0,0,0,.3)}.cc-form__button:focus{background:#0e91ea}.cc-form__button--ripple{overflow:hidden;position:relative}.cc-form__button--ripple:after{background:rgba(255,255,255,.3);border-radius:80%;content:'';display:block;height:120px;left:50%;margin-left:-50%;margin-top:-60px;position:absolute;top:50%;-webkit-transform:scale(0);transform:scale(0);width:100%}.cc-form__button--ripple:not(:active):after{-webkit-animation:2s ease-out button-ripple;animation:2s ease-out button-ripple}@-webkit-keyframes button-ripple{0%{-webkit-transform:scale(0);transform:scale(0)}20%{-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes button-ripple{0%{-webkit-transform:scale(0);transform:scale(0)}20%{-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}.cc-wrapper{background-color:#fff;border-radius:20px;height:100%;margin:0;padding:0;width:100%}.cc-box{height:100px;margin:0 auto;padding:0;position:relative;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:70%;z-index:1}@media only screen and (max-width:1279px){.cc-box{-webkit-transform:translateY(-115%);transform:translateY(-115%)}}@media only screen and (max-width:599px){.cc-box{-webkit-transform:translateY(-130%);transform:translateY(-130%)}}.cc-box--flip{-webkit-transform-style:preserve-3d;transform-style:preserve-3d;transition:.6s}.cc-box--flip.hover,.cc-box--flip:hover{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.cc-box__element{padding:0;width:80%}.cc-box__logo{align-items:center;color:#fff;display:flex;flex-flow:row nowrap;font-size:1.2em;font-style:italic;font-weight:700;justify-content:flex-end;margin-right:10%;width:100%}.cc-box__strip{background:linear-gradient(135deg,#404040,#1a1a1a);font-size:1.7em;margin:0;padding:0;position:relative;-webkit-transform:translateY(-90%);transform:translateY(-90%);width:100%}.cc-box__back,.cc-box__front{align-items:center;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:linear-gradient(135deg,#bd6772,#53223f);border-radius:15px;display:flex;flex-direction:column;flex-flow:column nowrap;height:250px;justify-content:center;left:0;position:absolute;top:0;width:100%}.cc-box__front{-webkit-transform:rotateY(0);transform:rotateY(0)}.cc-box__back{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ng-invalid.ng-touched{border-color:#ff5b5f}.ng-valid.ng-touched{border-color:#b2b2b2}"]
}] }
];
/** @nocollapse */
PaymentCardComponent.ctorParameters = function () { return [
{ type: PaymentCardService },
{ type: FormBuilder }
]; };
PaymentCardComponent.propDecorators = {
ccNumMissingTxt: [{ type: Input }],
ccNumTooShortTxt: [{ type: Input }],
ccNumTooLongTxt: [{ type: Input }],
ccNumContainsLettersTxt: [{ type: Input }],
ccNumChecksumInvalidTxt: [{ type: Input }],
cardHolderMissingTxt: [{ type: Input }],
cardHolderTooLongTxt: [{ type: Input }],
expirationMonthMissingTxt: [{ type: Input }],
expirationYearMissingTxt: [{ type: Input }],
ccvMissingTxt: [{ type: Input }],
ccvNumTooShortTxt: [{ type: Input }],
ccvNumTooLongTxt: [{ type: Input }],
ccvContainsLettersTxt: [{ type: Input }],
cardExpiredTxt: [{ type: Input }],
validateCCNum: [{ type: Input }],
validateCardHolder: [{ type: Input }],
validateExpirationMonth: [{ type: Input }],
validateExpirationYear: [{ type: Input }],
validateCardExpiration: [{ type: Input }],
validateCCV: [{ type: Input }],
formSaved: [{ type: Output }]
};
return PaymentCardComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var PaymentCardNumberPipe = /** @class */ (function () {
function PaymentCardNumberPipe() {
}
/**
* Transform card number to card format for known numbers
*/
/**
* Transform card number to card format for known numbers
* @param {?} value
* @return {?}
*/
PaymentCardNumberPipe.prototype.transform = /**
* Transform card number to card format for known numbers
* @param {?} value
* @return {?}
*/
function (value) {
switch (value.length) {
case 15:
value = value.replace(/\b(\d{4})/, '$1-');
value = value.replace(/-(\d{6})/, '-$1-');
return value;
case 16:
return value.match(/.{4}/g).join('-');
default:
return value;
}
};
PaymentCardNumberPipe.decorators = [
{ type: Pipe, args: [{
name: 'paymentCardNumber',
},] }
];
return PaymentCardNumberPipe;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var ValidThruPipe = /** @class */ (function () {
function ValidThruPipe() {
}
/**
* Transform month and year into card format
*/
/**
* Transform month and year into card format
* @param {?} value
* @return {?}
*/
ValidThruPipe.prototype.transform = /**
* Transform month and year into card format
* @param {?} value
* @return {?}
*/
function (value) {
return value && value.length === 7 ? value.substr(0, 3) + value.substr(5) : '/';
};
ValidThruPipe.decorators = [
{ type: Pipe, args: [{
name: 'validThru',
},] }
];
return ValidThruPipe;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* Monolithic module that is being bundled and published.
* Depends only on ReactiveFormsModule and CommonModule.
*/
var NgPaymentCardModule = /** @class */ (function () {
function NgPaymentCardModule() {
}
NgPaymentCardModule.decorators = [
{ type: NgModule, args: [{
imports: [ReactiveFormsModule, CommonModule],
declarations: [PaymentCardComponent, PaymentCardNumberPipe, ValidThruPipe],
providers: [PaymentCardService],
exports: [PaymentCardComponent],
},] }
];
return NgPaymentCardModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
export { PaymentCardComponent, NgPaymentCardModule, PaymentCardNumberPipe as ɵb, ValidThruPipe as ɵc, PaymentCardService as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcGF5bWVudC1jYXJkLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZy1wYXltZW50LWNhcmQvbGliL3ZhbGlkYXRvci9jYXJkLXZhbGlkYXRvci50cyIsIm5nOi8vbmctcGF5bWVudC1jYXJkL2xpYi9kb21haW4vY2FyZC10eXBlLmVudW0udHMiLCJuZzovL25nLXBheW1lbnQtY2FyZC9saWIvZG9tYWluL2NhcmQtdHlwZXMudHMiLCJuZzovL25nLXBheW1lbnQtY2FyZC9saWIvZG9tYWluL21vbnRoLmVudW0udHMiLCJuZzovL25nLXBheW1lbnQtY2FyZC9saWIvc2VydmljZS9wYXltZW50LWNhcmQuc2VydmljZS50cyIsIm5nOi8vbmctcGF5bWVudC1jYXJkL2xpYi9wYXltZW50LWNhcmQuY29tcG9uZW50LnRzIiwibmc6Ly9uZy1wYXltZW50LWNhcmQvbGliL3BpcGUvcGF5bWVudC1jYXJkLW51bWJlci9wYXltZW50LWNhcmQtbnVtYmVyLnBpcGUudHMiLCJuZzovL25nLXBheW1lbnQtY2FyZC9saWIvcGlwZS92YWxpZC10aHJ1L3ZhbGlkLXRocnUucGlwZS50cyIsIm5nOi8vbmctcGF5bWVudC1jYXJkL2xpYi9uZy1wYXltZW50LWNhcmQubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgdmFsaWRhdGlvbiBtZXRob2RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXJkVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBmb3IgYWxwaGFudW1lcmljIGlucHV0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBOVU1CRVJTX09OTFlfRVJSOiBWYWxpZGF0aW9uRXJyb3JzID0ge1xuICAgIG51bWJlcnNPbmx5OiB0cnVlLFxuICB9O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgZm9yIGludmFsaWQgY2hlY2tzdW1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIENIRUNLU1VNX0lOVkFMSUQ6IFZhbGlkYXRpb25FcnJvcnMgPSB7XG4gICAgY2hlY2tzdW06IHRydWUsXG4gIH07XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBmb3IgZXhwaXJlZCBjYXJkXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBDQVJEX0VYUElSRUQ6IFZhbGlkYXRpb25FcnJvcnMgPSB7XG4gICAgZXhwaXJhdGlvbjogdHJ1ZSxcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29udHJvbCBjb250YWlucyBudW1iZXJzIG9ubHlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtYmVyc09ubHkoYWJzdHJhY3RDdHJsOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgY2NOdW06IHN0cmluZyA9IGFic3RyYWN0Q3RybC52YWx1ZTtcbiAgICBjb25zdCBOVU1CRVJTX09OTFk6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoL15bMC05XSskLyk7XG4gICAgcmV0dXJuICFOVU1CRVJTX09OTFkudGVzdChjY051bSkgPyBDYXJkVmFsaWRhdG9yLk5VTUJFUlNfT05MWV9FUlIgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGNoZWNrc3VtIG51bWJlciBpbiBjYXJkIG51bWJlciB1c2luZyBMdWhuIGFsZ29yaXRobVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjaGVja3N1bShhYnN0cmFjdEN0cjogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGNjTnVtYmVyOiBzdHJpbmcgPSBhYnN0cmFjdEN0ci52YWx1ZTtcbiAgICBjb25zdCBsdWhuQXJyYXk6IEFycmF5PG51bWJlcj4gPSBbMCwgMiwgNCwgNiwgOCwgMSwgMywgNSwgNywgOV07XG4gICAgbGV0IGxlbmd0aDogbnVtYmVyID0gY2NOdW1iZXIgPyBjY051bWJlci5sZW5ndGggOiAwO1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGxldCBzaG91bGRNdWx0aXBseSA9IHRydWU7XG5cbiAgICB3aGlsZSAobGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWw6IG51bWJlciA9IHBhcnNlSW50KGNjTnVtYmVyLmNoYXJBdCgtLWxlbmd0aCksIDEwKTtcbiAgICAgIHN1bSArPSAoc2hvdWxkTXVsdGlwbHkgPSAhc2hvdWxkTXVsdGlwbHkpID8gbHVobkFycmF5W3ZhbF0gOiB2YWw7XG4gICAgfVxuICAgIHJldHVybiAhKHN1bSAmJiBzdW0gJSAxMCA9PT0gMCkgPyBDYXJkVmFsaWRhdG9yLkNIRUNLU1VNX0lOVkFMSUQgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHZhbGlkaXR5IG9mIHRoZSBjYXJkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4cGlyYXRpb24oZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgZXhwaXJhdGlvbk1vbnRoOiBudW1iZXIgPSBOdW1iZXIoZm9ybUdyb3VwLmdldCgnZXhwaXJhdGlvbk1vbnRoJykudmFsdWUpO1xuICAgIGNvbnN0IGV4cGlyYXRpb25ZZWFyOiBudW1iZXIgPSBOdW1iZXIoZm9ybUdyb3VwLmdldCgnZXhwaXJhdGlvblllYXInKS52YWx1ZSk7XG4gICAgY29uc3QgZXhwaXJhdGlvbkRhdGU6IERhdGUgPSBuZXcgRGF0ZShleHBpcmF0aW9uWWVhciwgZXhwaXJhdGlvbk1vbnRoICsgMSwgMCk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpID4gZXhwaXJhdGlvbkRhdGUuZ2V0VGltZSgpID8gQ2FyZFZhbGlkYXRvci5DQVJEX0VYUElSRUQgOiBudWxsO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBDYXJkVHlwZSB7XG4gIEFNRVJJQ0FOX0VYUFJFU1MgPSAnQW1lcmljYW4gRXhwcmVzcycsXG4gIERJTkVSUyA9ICdEaW5lcnMnLFxuICBESU5FUlNfQ0FSVEVfQkxBTkNIRSA9ICdEaW5lcnMgQ2FydGUgQmxhbmNoZScsXG4gIERJU0NPVkVSX0NMVUIgPSAnRGlzY292ZXIgQ2x1YicsXG4gIENISU5BX1VOSU9OUEFZID0gJ0NoaW5hIFVuaW9uUGF5JyxcbiAgSkNCID0gJ0pDQicsXG4gIExBU0VSID0gJ0xhc2VyJyxcbiAgTUFFU1RSTyA9ICdNYWVzdHJvJyxcbiAgTUFTVEVSQ0FSRCA9ICdNYXN0ZXJjYXJkJyxcbiAgVklTQV9FTEVDVFJPTiA9ICdWaXNhIEVsZWN0cm9uJyxcbiAgVklTQSA9ICdWSVNBJyxcbn1cbiIsImltcG9ydCB7IENhcmRUeXBlIH0gZnJvbSAnLi9jYXJkLXR5cGUuZW51bSc7XG5cbmNvbnN0IENBUkRfVFlQRVM6IE1hcDxzdHJpbmcsIFJlZ0V4cD4gPSBuZXcgTWFwKCk7XG5DQVJEX1RZUEVTLnNldChDYXJkVHlwZS5BTUVSSUNBTl9FWFBSRVNTLCBuZXcgUmVnRXhwKCdeM1s0N10nKSk7XG5DQVJEX1RZUEVTLnNldChDYXJkVHlwZS5ESU5FUlMsIG5ldyBSZWdFeHAoJ14zNicpKTtcbkNBUkRfVFlQRVMuc2V0KENhcmRUeXBlLkRJTkVSU19DQVJURV9CTEFOQ0hFLCBuZXcgUmVnRXhwKCdeMzBbMC01XScpKTtcbkNBUkRfVFlQRVMuc2V0KFxuICBDYXJkVHlwZS5ESVNDT1ZFUl9DTFVCLFxuICBuZXcgUmVnRXhwKCdeKDYwMTF8NjIyKDEyWzYtOV18MVszLTldWzAtOV18WzItOF1bMC05XXsyfXw5WzAtMV1bMC05XXw5MlswLTVdfDY0WzQtOV0pfDY1KScpXG4pO1xuQ0FSRF9UWVBFUy5zZXQoQ2FyZFR5cGUuQ0hJTkFfVU5JT05QQVksIG5ldyBSZWdFeHAoJ14oNjJbMC05XXsxNCwxN30pJCcpKTtcbkNBUkRfVFlQRVMuc2V0KENhcmRUeXBlLkpDQiwgbmV3IFJlZ0V4cCgnXjM1KDJbODldfFszLThdWzAtOV0pJykpO1xuQ0FSRF9UWVBFUy5zZXQoQ2FyZFR5cGUuTEFTRVIsIG5ldyBSZWdFeHAoJ14oNjMwNHw2NzA2fDY3MDl8Njc3MSlbMC05XXsxMiwxNX0kJykpO1xuQ0FSRF9UWVBFUy5zZXQoQ2FyZFR5cGUuTUFFU1RSTywgbmV3IFJlZ0V4cCgnXig1MHw1WzYtOF18NilbMC05XXsxMiwxOX0kJykpO1xuQ0FSRF9UWVBFUy5zZXQoXG4gIENhcmRUeXBlLk1BU1RFUkNBUkQsXG4gIG5ldyBSZWdFeHAoJ14oNVsxLTVdWzAtOV17MTR9fDIoMjJbMS05XVswLTldezEyfXwyWzMtOV1bMC05XXsxM318WzMtNl1bMC05XXsxNH18N1swLTFdWzAtOV17MTN9fDcyMFswLTldezEyfSkpJCcpXG4pO1xuQ0FSRF9UWVBFUy5zZXQoQ2FyZFR5cGUuVklTQV9FTEVDVFJPTiwgbmV3IFJlZ0V4cCgnXig0MDI2fDQxNzUwMHw0NTA4fDQ4NDR8NDkxKFszN10pKScpKTtcbkNBUkRfVFlQRVMuc2V0KENhcmRUeXBlLlZJU0EsIG5ldyBSZWdFeHAoJ140JykpO1xuXG5leHBvcnQgZGVmYXVsdCBDQVJEX1RZUEVTO1xuZXhwb3J0IHR5cGUgQ2FyZFR5cGVzQ29udGFpbmVyID0gdHlwZW9mIENBUkRfVFlQRVM7XG4iLCJleHBvcnQgZW51bSBNb250aCB7XG4gIEpBTlVBUlkgPSAnMDEnLFxuICBGRUJSVUFSWSA9ICcwMicsXG4gIE1BUkNIID0gJzAzJyxcbiAgQVBSSUwgPSAnMDQnLFxuICBNQVkgPSAnMDUnLFxuICBKVU5FID0gJzA2JyxcbiAgSlVMWSA9ICcwNycsXG4gIEFVR1VTVCA9ICcwOCcsXG4gIFNFUFRFTUJFUiA9ICcwOScsXG4gIE9DVE9CRVIgPSAnMTAnLFxuICBOT1ZFTUJFUiA9ICcxMScsXG4gIERFQ0VNQkVSID0gJzEyJyxcbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZGVmYXVsdCBhcyBDQVJEX1RZUEVTLCBDYXJkVHlwZXNDb250YWluZXIgfSBmcm9tICcuLi9kb21haW4vY2FyZC10eXBlcyc7XG5pbXBvcnQgeyBNb250aCB9IGZyb20gJy4uL2RvbWFpbi9tb250aC5lbnVtJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBheW1lbnRDYXJkU2VydmljZSB7XG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIGNhcmQgdHlwZXNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNhcmRUeXBlczogQ2FyZFR5cGVzQ29udGFpbmVyID0gQ0FSRF9UWVBFUztcblxuICAvKipcbiAgICogUmV0dXJuIGNhcmQgdHlwZSBiYXNlZCBvbiBjYXJkIG51bWJlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRDYXJkVHlwZShjY051bTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIEFycmF5LmZyb20oUGF5bWVudENhcmRTZXJ2aWNlLmNhcmRUeXBlcy5lbnRyaWVzKCkpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNjTnVtXG4gICAgICAgICAgLnNwbGl0KG5ldyBSZWdFeHAoJ1sgXFxcXC1dJykpXG4gICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgLm1hdGNoKHZhbClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gbW9udGhzIGluIG51bWVyaWNhbCBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TW9udGhzKCk6IEFycmF5PE1vbnRoPiB7XG4gICAgY29uc3QgbW9udGhzOiBBcnJheTxNb250aD4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhNb250aCkpIHtcbiAgICAgIG1vbnRocy5wdXNoKE1vbnRoW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gbW9udGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB5ZWFycyBiYXNlZCBvbiBjdXJyZW50IHllYXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0WWVhcnMoKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgY29uc3QgeWVhcnM6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgICBjb25zdCB5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgIGZvciAobGV0IGkgPSAtMjsgaSA8IDU7IGkrKykge1xuICAgICAgeWVhcnMucHVzaCh5ZWFyICsgaSk7XG4gICAgfVxuICAgIHJldHVybiB5ZWFycztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT3V0cHV0LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IENhcmRWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvci9jYXJkLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBJQ2FyZERldGFpbHMgfSBmcm9tICcuL2RvbWFpbi9pLWNhcmQtZGV0YWlscyc7XG5pbXBvcnQgeyBDYXJkRGV0YWlscyB9IGZyb20gJy4vZG9tYWluL2NhcmQtZGV0YWlscyc7XG5pbXBvcnQgeyBQYXltZW50Q2FyZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvcGF5bWVudC1jYXJkLnNlcnZpY2UnO1xuXG4vKipcbiAqIE5nUGF5bWVudENhcmQgd2l0aG91dCBhbnkgZGVwZW5kZW5jaWVzIG90aGVyIHRoZW4gUmVhY3RpdmVGb3Jtc01vZHVsZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1wYXltZW50LWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGF5bWVudC1jYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGF5bWVudC1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFBheW1lbnRDYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIEZvcm1Hcm91cCBhdmFpbGFibGUgcHVibGljbHlcbiAgICovXG4gIHB1YmxpYyBjY0Zvcm06IEZvcm1Hcm91cDtcblxuICAvKipcbiAgICogTGlzdCBvZiBtb250aHNcbiAgICovXG4gIHB1YmxpYyBtb250aHM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiB5ZWFyc1xuICAgKi9cbiAgcHVibGljIHllYXJzOiBBcnJheTxudW1iZXI+ID0gW107XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gbWVzc2FnZSBmb3IgbWlzc2luZyBwYXltZW50IGNhcmQgbnVtYmVyXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2NOdW1NaXNzaW5nVHh0PyA9ICdDYXJkIG51bWJlciBpcyByZXF1aXJlZCc7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gbWVzc2FnZSBmb3IgdG9vIHNob3J0IHBheW1lbnQgY2FyZCBudW1iZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjY051bVRvb1Nob3J0VHh0PyA9ICdDYXJkIG51bWJlciBpcyB0b28gc2hvcnQnO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIG1lc3NhZ2UgZm9yIHRvbyBsb25nIHBheW1lbnQgY2FyZCBudW1iZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjY051bVRvb0xvbmdUeHQ/ID0gJ0NhcmQgbnVtYmVyIGlzIHRvbyBsb25nJztcblxuICAvKipcbiAgICogVmFsaWRhdGlvbiBtZXNzYWdlIGZvciBwYXltZW50IGNhcmQgbnVtYmVyIHRoYXQgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIGRpZ2l0c1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGNjTnVtQ29udGFpbnNMZXR0ZXJzVHh0PyA9ICdDYXJkIG51bWJlciBjYW4gY29udGFpbiBkaWdpdHMgb25seSc7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gbWVzc2FnZSBmb3IgaW52YWxpZCBwYXltZW50IGNhcmQgIG51bWJlciAoTHVobidzIHZhbGlkYXRpb24pXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2NOdW1DaGVja3N1bUludmFsaWRUeHQ/ID0gJ1Byb3ZpZGVkIGNhcmQgbnVtYmVyIGlzIGludmFsaWQnO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIG1lc3NhZ2UgZm9yIG1pc3NpbmcgY2FyZCBob2xkZXIgbmFtZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGNhcmRIb2xkZXJNaXNzaW5nVHh0PyA9ICdDYXJkIGhvbGRlciBuYW1lIGlzIHJlcXVpcmVkJztcblxuICAvKipcbiAgICogVmFsaWRhdGlvbiBtZXNzYWdlIGZvciB0b28gbG9uZyBjYXJkIGhvbGRlciBuYW1lXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2FyZEhvbGRlclRvb0xvbmdUeHQ/ID0gJ0NhcmQgaG9sZGVyIG5hbWUgaXMgdG9vIGxvbmcnO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIG1lc3NhZ2UgZm9yIG1pc3NpbmcgZXhwaXJhdGlvbiBtb250aFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGV4cGlyYXRpb25Nb250aE1pc3NpbmdUeHQ/ID0gJ0V4cGlyYXRpb24gbW9udGggaXMgcmVxdWlyZWQnO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIG1lc3NhZ2UgZm9yIG1pc3NpbmcgZXhwaXJhdGlvbiB5ZWFyXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZXhwaXJhdGlvblllYXJNaXNzaW5nVHh0PyA9ICdFeHBpcmF0aW9uIHllYXIgaXMgcmVxdWlyZWQnO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIG1lc3NhZ2UgZm9yIG1pc3NpbmcgQ0NWIG51bWJlclxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGNjdk1pc3NpbmdUeHQ/ID0gJ0NDViBudW1iZXIgaXMgcmVxdWlyZWQnO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIG1lc3NhZ2UgZm9yIHRvbyBzaG9ydCBDQ1YgbnVtYmVyXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2N2TnVtVG9vU2hvcnRUeHQ/ID0gJ0NDViBudW1iZXIgaXMgdG9vIHNob3J0JztcblxuICAvKipcbiAgICogVmFsaWRhdGlvbiBtZXNzYWdlIGZvciB0b28gbG9uZyBDQ1YgbnVtYmVyXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2N2TnVtVG9vTG9uZ1R4dD8gPSAnQ0NWIG51bWJlciBpcyB0b28gbG9uZyc7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gbWVzc2FnZSBmb3IgaW5jb3JyZWN0IENDViBudW1iZXIgY29udGFpbmluZyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gZGlnaXRzXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2N2Q29udGFpbnNMZXR0ZXJzVHh0PyA9ICdDQ1YgbnVtYmVyIGNhbiBjb250YWluIGRpZ2l0cyBvbmx5JztcblxuICAvKipcbiAgICogVmFsaWRhdGlvbiBtZXNzYWdlIGZvciBleHBpcmVkIGNhcmRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjYXJkRXhwaXJlZFR4dD8gPSAnQ2FyZCBoYXMgZXhwaXJlZCc7XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB2YWxpZGF0aW9uIG9mIHRoZSBwYXltZW50IGNhcmQgbnVtYmVyXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdmFsaWRhdGVDQ051bT8gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdmFsaWRhdGlvbiBvZiB0aGUgcGF5bWVudCBjYXJkIGhvbGRlclxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHZhbGlkYXRlQ2FyZEhvbGRlcj8gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdmFsaWRhdGlvbiBvZiB0aGUgcGF5bWVudCBjYXJkIGV4cGlyYXRpb24gbW9udGhcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWxpZGF0ZUV4cGlyYXRpb25Nb250aD8gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdmFsaWRhdGlvbiBvZiB0aGUgcGF5bWVudCBjYXJkIGV4cGlyYXRpb24geWVhclxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHZhbGlkYXRlRXhwaXJhdGlvblllYXI/ID0gdHJ1ZTtcblxuICAvKipcbiAgICogU3dpdGNoIHZhbGlkYXRpb24gb2YgdGhlIHBheW1lbnQgY2FyZCBleHBpcmF0aW9uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdmFsaWRhdGVDYXJkRXhwaXJhdGlvbj8gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdmFsaWRhdGlvbiBvZiB0aGUgcGF5bWVudCBjYXJkIENDViBudW1iZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWxpZGF0ZUNDVj8gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBFdmVudEVtaXR0ZXIgZm9yIHBheW1lbnQgY2FyZCBvYmplY3RcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZm9ybVNhdmVkOiBFdmVudEVtaXR0ZXI8SUNhcmREZXRhaWxzPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZERldGFpbHM+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2NTZXJ2aWNlOiBQYXltZW50Q2FyZFNlcnZpY2UsIHByaXZhdGUgX2ZiOiBGb3JtQnVpbGRlcikge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEZvcm0oKTtcbiAgICB0aGlzLmFzc2lnbkRhdGVWYWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSBtb250aHMgYW5kIHllYXJzXG4gICAqL1xuICBwcml2YXRlIGFzc2lnbkRhdGVWYWx1ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5tb250aHMgPSBQYXltZW50Q2FyZFNlcnZpY2UuZ2V0TW9udGhzKCk7XG4gICAgdGhpcy55ZWFycyA9IFBheW1lbnRDYXJkU2VydmljZS5nZXRZZWFycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHJlYWN0aXZlIGZvcm1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2NGb3JtID0gdGhpcy5fZmIuZ3JvdXAoXG4gICAgICB7XG4gICAgICAgIGNhcmROdW1iZXI6IFtcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEyKSxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDE5KSxcbiAgICAgICAgICAgIENhcmRWYWxpZGF0b3IubnVtYmVyc09ubHksXG4gICAgICAgICAgICBDYXJkVmFsaWRhdG9yLmNoZWNrc3VtLFxuICAgICAgICAgIF0pLFxuICAgICAgICBdLFxuICAgICAgICBjYXJkSG9sZGVyOiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjIpXSldLFxuICAgICAgICBleHBpcmF0aW9uTW9udGg6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIGV4cGlyYXRpb25ZZWFyOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBjY3Y6IFtcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNCksXG4gICAgICAgICAgICBDYXJkVmFsaWRhdG9yLm51bWJlcnNPbmx5LFxuICAgICAgICAgIF0pLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdG9yOiBDYXJkVmFsaWRhdG9yLmV4cGlyYXRpb24sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBheW1lbnQgY2FyZCB0eXBlIGJhc2VkIG9uIHBheW1lbnQgY2FyZCBudW1iZXJcbiAgICovXG4gIHB1YmxpYyBnZXRDYXJkVHlwZShjY051bTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIFBheW1lbnRDYXJkU2VydmljZS5nZXRDYXJkVHlwZShjY051bSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBlbWl0cyBwYXltZW50IGNhcmQgZGV0YWlscyBhZnRlciB1c2VyIGNsaWNrcyBzdWJtaXQsIG9yIHByZXNzIGVudGVyXG4gICAqL1xuICBwdWJsaWMgZW1pdFNhdmVkQ2FyZCgpOiB2b2lkIHtcbiAgICBjb25zdCBjYXJkRGV0YWlsczogSUNhcmREZXRhaWxzID0gPENhcmREZXRhaWxzPnRoaXMuY2NGb3JtLnZhbHVlO1xuICAgIHRoaXMuZm9ybVNhdmVkLmVtaXQoY2FyZERldGFpbHMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ3BheW1lbnRDYXJkTnVtYmVyJyxcbn0pXG5leHBvcnQgY2xhc3MgUGF5bWVudENhcmROdW1iZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gY2FyZCBudW1iZXIgdG8gY2FyZCBmb3JtYXQgZm9yIGtub3duIG51bWJlcnNcbiAgICovXG4gIHB1YmxpYyB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxiKFxcZHs0fSkvLCAnJDEtJyk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvLShcXGR7Nn0pLywgJy0kMS0nKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgY2FzZSAxNjpcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hdGNoKC8uezR9L2cpLmpvaW4oJy0nKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQFBpcGUoe1xuICBuYW1lOiAndmFsaWRUaHJ1Jyxcbn0pXG5leHBvcnQgY2xhc3MgVmFsaWRUaHJ1UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVHJhbnNmb3JtIG1vbnRoIGFuZCB5ZWFyIGludG8gY2FyZCBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA9PT0gNyA/IHZhbHVlLnN1YnN0cigwLCAzKSArIHZhbHVlLnN1YnN0cig1KSA6ICcvJztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBQYXltZW50Q2FyZENvbXBvbmVudCB9IGZyb20gJy4vcGF5bWVudC1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXltZW50Q2FyZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvcGF5bWVudC1jYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGF5bWVudENhcmROdW1iZXJQaXBlIH0gZnJvbSAnLi9waXBlL3BheW1lbnQtY2FyZC1udW1iZXIvcGF5bWVudC1jYXJkLW51bWJlci5waXBlJztcbmltcG9ydCB7IFZhbGlkVGhydVBpcGUgfSBmcm9tICcuL3BpcGUvdmFsaWQtdGhydS92YWxpZC10aHJ1LnBpcGUnO1x