ngx-phone-validators
Version:
An implementation of angular validators for Angular 2 and higher
330 lines • 25.7 kB
JavaScript
import { Util } from "./../util";
import { PhoneNumberUtil } from "google-libphonenumber";
export const regionsCode = {
// Region code for global networks (e.g. +800 numbers).
UN001: "001",
AD: "AD",
AE: "AE",
AF: "AF",
AG: "AG",
AI: "AI",
AL: "AL",
AM: "AM",
AN: "AN",
AO: "AO",
AQ: "AQ",
AR: "AR",
AS: "AS",
AT: "AT",
AU: "AU",
AW: "AW",
AX: "AX",
AZ: "AZ",
BA: "BA",
BB: "BB",
BD: "BD",
BE: "BE",
BF: "BF",
BG: "BG",
BH: "BH",
BI: "BI",
BJ: "BJ",
BL: "BL",
BM: "BM",
BN: "BN",
BO: "BO",
BR: "BR",
BS: "BS",
BT: "BT",
BV: "BV",
BW: "BW",
BY: "BY",
BZ: "BZ",
CA: "CA",
CC: "CC",
CD: "CD",
CF: "CF",
CG: "CG",
CH: "CH",
CI: "CI",
CK: "CK",
CL: "CL",
CM: "CM",
CN: "CN",
CO: "CO",
CR: "CR",
CU: "CU",
CV: "CV",
CX: "CX",
CY: "CY",
CZ: "CZ",
DE: "DE",
DJ: "DJ",
DK: "DK",
DM: "DM",
DO: "DO",
DZ: "DZ",
EC: "EC",
EE: "EE",
EG: "EG",
EH: "EH",
ER: "ER",
ES: "ES",
ET: "ET",
FI: "FI",
FJ: "FJ",
FK: "FK",
FM: "FM",
FO: "FO",
FR: "FR",
GA: "GA",
GB: "GB",
GD: "GD",
GE: "GE",
GF: "GF",
GG: "GG",
GH: "GH",
GI: "GI",
GL: "GL",
GM: "GM",
GN: "GN",
GP: "GP",
GQ: "GQ",
GR: "GR",
GS: "GS",
GT: "GT",
GU: "GU",
GW: "GW",
GY: "GY",
HK: "HK",
HM: "HM",
HN: "HN",
HR: "HR",
HT: "HT",
HU: "HU",
ID: "ID",
IE: "IE",
IL: "IL",
IM: "IM",
IN: "IN",
IO: "IO",
IQ: "IQ",
IR: "IR",
IS: "IS",
IT: "IT",
JE: "JE",
JM: "JM",
JO: "JO",
JP: "JP",
KE: "KE",
KG: "KG",
KH: "KH",
KI: "KI",
KM: "KM",
KN: "KN",
KP: "KP",
KR: "KR",
KW: "KW",
KY: "KY",
KZ: "KZ",
LA: "LA",
LB: "LB",
LC: "LC",
LI: "LI",
LK: "LK",
LR: "LR",
LS: "LS",
LT: "LT",
LU: "LU",
LV: "LV",
LY: "LY",
MA: "MA",
MC: "MC",
MD: "MD",
ME: "ME",
MF: "MF",
MG: "MG",
MH: "MH",
MK: "MK",
ML: "ML",
MM: "MM",
MN: "MN",
MO: "MO",
MP: "MP",
MQ: "MQ",
MR: "MR",
MS: "MS",
MT: "MT",
MU: "MU",
MV: "MV",
MW: "MW",
MX: "MX",
MY: "MY",
MZ: "MZ",
NA: "NA",
NC: "NC",
NE: "NE",
NF: "NF",
NG: "NG",
NI: "NI",
NL: "NL",
NO: "NO",
NP: "NP",
NR: "NR",
NU: "NU",
NZ: "NZ",
OM: "OM",
PA: "PA",
PE: "PE",
PF: "PF",
PG: "PG",
PH: "PH",
PK: "PK",
PL: "PL",
PM: "PM",
PN: "PN",
PR: "PR",
PS: "PS",
PT: "PT",
PW: "PW",
PY: "PY",
QA: "QA",
RE: "RE",
RO: "RO",
RS: "RS",
RU: "RU",
RW: "RW",
SA: "SA",
SB: "SB",
SC: "SC",
SD: "SD",
SE: "SE",
SG: "SG",
SH: "SH",
SI: "SI",
SJ: "SJ",
SK: "SK",
SL: "SL",
SM: "SM",
SN: "SN",
SO: "SO",
SR: "SR",
ST: "ST",
SV: "SV",
SY: "SY",
SZ: "SZ",
TC: "TC",
TD: "TD",
TF: "TF",
TG: "TG",
TH: "TH",
TJ: "TJ",
TK: "TK",
TL: "TL",
TM: "TM",
TN: "TN",
TO: "TO",
TR: "TR",
TT: "TT",
TV: "TV",
TW: "TW",
TZ: "TZ",
UA: "UA",
UG: "UG",
UM: "UM",
US: "US",
UY: "UY",
UZ: "UZ",
VA: "VA",
VC: "VC",
VE: "VE",
VG: "VG",
VI: "VI",
VN: "VN",
VU: "VU",
WF: "WF",
WS: "WS",
YE: "YE",
YT: "YT",
ZA: "ZA",
ZM: "ZM",
ZW: "ZW",
// Official code for the unknown region.
ZZ: "ZZ",
};
export class PhoneValidators {
static checkRegionCode(local) {
return !(regionsCode[local] === undefined);
}
static isValidRegionCode(control) {
if (Util.isNotPresent(control)) {
return undefined;
}
if (!PhoneValidators.checkRegionCode(control.value)) {
return { noValidRegionCode: true };
}
return undefined;
}
static isPhoneNumber(local) {
const validator = (control) => {
if (Util.isNotPresent(control)) {
return undefined;
}
if (!PhoneValidators.checkRegionCode(local)) {
return { noValidRegionCode: true };
}
const phoneParser = PhoneNumberUtil.getInstance();
let error = { noPhoneNumber: true };
try {
const phoneNumber = phoneParser.parse(control.value, local);
if (phoneParser.isValidNumber(phoneNumber)) {
error = undefined;
}
}
catch (err) {
error = { noPhoneNumber: true };
}
return error;
};
return validator;
}
static isPossibleNumberWithReason(local) {
const validator = (control) => {
if (Util.isNotPresent(control)) {
return undefined;
}
if (!PhoneValidators.checkRegionCode(local)) {
return { noValidRegionCode: true };
}
const phoneParser = PhoneNumberUtil.getInstance();
let error = { noPhoneNumber: true };
try {
const phoneNumber = phoneParser.parse(control.value, local);
const reason = phoneParser.isPossibleNumberWithReason(phoneNumber);
switch (reason) {
case PhoneNumberUtil.ValidationResult.IS_POSSIBLE:
error = undefined;
break;
case PhoneNumberUtil.ValidationResult.TOO_LONG:
error = { phoneNumberTooLong: true };
break;
case PhoneNumberUtil.ValidationResult.TOO_SHORT:
error = { phoneNumberTooShort: true };
break;
case PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE:
error = { phoneNumberInvalidCountryCode: true };
break;
default:
error = { noPhoneNumber: true };
break;
}
}
catch (err) {
error = { noPhoneNumber: true };
}
return error;
};
return validator;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3Bob25lL3Bob25lLXZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHeEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUE4QjtJQUNwRCx1REFBdUQ7SUFDdkQsS0FBSyxFQUFFLEtBQUs7SUFDWixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFD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LEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO3dCQUNoQyxNQUFNO2lCQUNUO2FBQ0Y7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixLQUFLLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDakM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQztRQUNGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFV0aWwgfSBmcm9tIFwiLi8uLi91dGlsXCI7XG5pbXBvcnQgeyBQaG9uZU51bWJlclV0aWwgfSBmcm9tIFwiZ29vZ2xlLWxpYnBob25lbnVtYmVyXCI7XG5pbXBvcnQgKiBhcyBsaWJQaG9uZU51bWJlciBmcm9tIFwiZ29vZ2xlLWxpYnBob25lbnVtYmVyXCI7XG5cbmV4cG9ydCBjb25zdCByZWdpb25zQ29kZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgLy8gUmVnaW9uIGNvZGUgZm9yIGdsb2JhbCBuZXR3b3JrcyAoZS5nLiArODAwIG51bWJlcnMpLlxuICBVTjAwMTogXCIwMDFcIixcbiAgQUQ6IFwiQURcIixcbiAgQUU6IFwiQUVcIixcbiAgQUY6IFwiQUZcIixcbiAgQUc6IFwiQUdcIixcbiAgQUk6IFwiQUlcIixcbiAgQUw6IFwiQUxcIixcbiAgQU06IFwiQU1cIixcbiAgQU46IFwiQU5cIixcbiAgQU86IFwiQU9cIixcbiAgQVE6IFwiQVFcIixcbiAgQVI6IFwiQVJcIixcbiAgQVM6IFwiQVNcIixcbiAgQVQ6IFwiQVRcIixcbiAgQVU6IFwiQVVcIixcbiAgQVc6IFwiQVdcIixcbiAgQVg6IFwiQVhcIixcbiAgQVo6IFwiQVpcIixcbiAgQkE6IFwiQkFcIixcbiAgQkI6IFwiQkJcIixcbiAgQkQ6IFwiQkRcIixcbiAgQkU6IFwiQkVcIixcbiAgQkY6IFwiQkZcIixcbiAgQkc6IFwiQkdcIixcbiAgQkg6IFwiQkhcIixcbiAgQkk6IFwiQklcIixcbiAgQko6IFwiQkpcIixcbiAgQkw6IFwiQkxcIixcbiAgQk06IFwiQk1cIixcbiAgQk46IFwiQk5cIixcbiAgQk86IFwiQk9cIixcbiAgQlI6IFwiQlJcIixcbiAgQlM6IFwiQlNcIixcbiAgQlQ6IFwiQlRcIixcbiAgQlY6IFwiQlZcIixcbiAgQlc6IFwiQldcIixcbiAgQlk6IFwiQllcIixcbiAgQlo6IFwiQlpcIixcbiAgQ0E6IFwiQ0FcIixcbiAgQ0M6IFwiQ0NcIixcbiAgQ0Q6IFwiQ0RcIixcbiAgQ0Y6IFwiQ0ZcIixcbiAgQ0c6IFwiQ0dcIixcbiAgQ0g6IFwiQ0hcIixcbiAgQ0k6IFwiQ0lcIixcbiAgQ0s6IFwiQ0tcIixcbiAgQ0w6IFwiQ0xcIixcbiAgQ006IFwiQ01cIixcbiAgQ046IFwiQ05cIixcbiAgQ086IFwiQ09cIixcbiAgQ1I6IFwiQ1JcIixcbiAgQ1U6IFwiQ1VcIixcbiAgQ1Y6IFwiQ1ZcIixcbiAgQ1g6IFwiQ1hcIixcbiAgQ1k6IFwiQ1lcIixcbiAgQ1o6IFwiQ1pcIixcbiAgREU6IFwiREVcIixcbiAgREo6IFwiREpcIixcbiAgREs6IFwiREtcIixcbiAgRE06IFwiRE1cIixcbiAgRE86IFwiRE9cIixcbiAgRFo6IFwiRFpcIixcbiAgRUM6IFwiRUNcIixcbiAgRUU6IFwiRUVcIixcbiAgRUc6IFwiRUdcIixcbiAgRUg6IFwiRUhcIixcbiAgRVI6IFwiRVJcIixcbiAgRVM6IFwiRVNcIixcbiAgRVQ6IFwiRVRcIixcbiAgRkk6IFwiRklcIixcbiAgRko6IFwiRkpcIixcbiAgRks6IFwiRktcIixcbiAgRk06IFwiRk1cIixcbiAgRk86IFwiRk9cIixcbiAgRlI6IFwiRlJcIixcbiAgR0E6IFwiR0FcIixcbiAgR0I6IFwiR0JcIixcbiAgR0Q6IFwiR0RcIixcbiAgR0U6IFwiR0VcIixcbiAgR0Y6IFwiR0ZcIixcbiAgR0c6IFwiR0dcIixcbiAgR0g6IFwiR0hcIixcbiAgR0k6IFwiR0lcIixcbiAgR0w6IFwiR0xcIixcbiAgR006IFwiR01cIixcbiAgR046IFwiR05cIixcbiAgR1A6IFwiR1BcIixcbiAgR1E6IFwiR1FcIixcbiAgR1I6IFwiR1JcIixcbiAgR1M6IFwiR1NcIixcbiAgR1Q6IFwiR1RcIixcbiAgR1U6IFwiR1VcIixcbiAgR1c6IFwiR1dcIixcbiAgR1k6IFwiR1lcIixcbiAgSEs6IFwiSEtcIixcbiAgSE06IFwiSE1cIixcbiAgSE46IFwiSE5cIixcbiAgSFI6IFwiSFJcIixcbiAgSFQ6IFwiSFRcIixcbiAgSFU6IFwiSFVcIixcbiAgSUQ6IFwiSURcIixcbiAgSUU6IFwiSUVcIixcbiAgSUw6IFwiSUxcIixcbiAgSU06IFwiSU1cIixcbiAgSU46IFwiSU5cIixcbiAgSU86IFwiSU9cIixcbiAgSVE6IFwiSVFcIixcbiAgSVI6IFwiSVJcIixcbiAgSVM6IFwiSVNcIixcbiAgSVQ6IFwiSVRcIixcbiAgSkU6IFwiSkVcIixcbiAgSk06IFwiSk1cIixcbiAgSk86IFwiSk9cIixcbiAgSlA6IFwiSlBcIixcbiAgS0U6IFwiS0VcIixcbiAgS0c6IFwiS0dcIixcbiAgS0g6IFwiS0hcIixcbiAgS0k6IFwiS0lcIixcbiAgS006IFwiS01cIixcbiAgS046IFwiS05cIixcbiAgS1A6IFwiS1BcIixcbiAgS1I6IFwiS1JcIixcbiAgS1c6IFwiS1dcIixcbiAgS1k6IFwiS1lcIixcbiAgS1o6IFwiS1pcIixcbiAgTEE6IFwiTEFcIixcbiAgTEI6IFwiTEJcIixcbiAgTEM6IFwiTENcIixcbiAgTEk6IFwiTElcIixcbiAgTEs6IFwiTEtcIixcbiAgTFI6IFwiTFJcIixcbiAgTFM6IFwiTFNcIixcbiAgTFQ6IFwiTFRcIixcbiAgTFU6IFwiTFVcIixcbiAgTFY6IFwiTFZcIixcbiAgTFk6IFwiTFlcIixcbiAgTUE6IFwiTUFcIixcbiAgTUM6IFwiTUNcIixcbiAgTUQ6IFwiTURcIixcbiAgTUU6IFwiTUVcIixcbiAgTUY6IFwiTUZcIixcbiAgTUc6IFwiTUdcIixcbiAgTUg6IFwiTUhcIixcbiAgTUs6IFwiTUtcIixcbiAgTUw6IFwiTUxcIixcbiAgTU06IFwiTU1cIixcbiAgTU46IFwiTU5cIixcbiAgTU86IFwiTU9cIixcbiAgTVA6IFwiTVBcIixcbiAgTVE6IFwiTVFcIixcbiAgTVI6IFwiTVJcIixcbiAgTVM6IFwiTVNcIixcbiAgTVQ6IFwiTVRcIixcbiAgTVU6IFwiTVVcIixcbiAgTVY6IFwiTVZcIixcbiAgTVc6IFwiTVdcIixcbiAgTVg6IFwiTVhcIixcbiAgTVk6IFwiTVlcIixcbiAgTVo6IFwiTVpcIixcbiAgTkE6IFwiTkFcIixcbiAgTkM6IFwiTkNcIixcbiAgTkU6IFwiTkVcIixcbiAgTkY6IFwiTkZcIixcbiAgTkc6IFwiTkdcIixcbiAgTkk6IFwiTklcIixcbiAgTkw6IFwiTkxcIixcbiAgTk86IFwiTk9cIixcbiAgTlA6IFwiTlBcIixcbiAgTlI6IFwiTlJcIixcbiAgTlU6IFwiTlVcIixcbiAgTlo6IFwiTlpcIixcbiAgT006IFwiT01cIixcbiAgUEE6IFwiUEFcIixcbiAgUEU6IFwiUEVcIixcbiAgUEY6IFwiUEZcIixcbiAgUEc6IFwiUEdcIixcbiAgUEg6IFwiUEhcIixcbiAgUEs6IFwiUEtcIixcbiAgUEw6IFwiUExcIixcbiAgUE06IFwiUE1cIixcbiAgUE46IFwiUE5cIixcbiAgUFI6IFwiUFJcIixcbiAgUFM6IFwiUFNcIixcbiAgUFQ6IFwiUFRcIixcbiAgUFc6IFwiUFdcIixcbiAgUFk6IFwiUFlcIixcbiAgUUE6IFwiUUFcIixcbiAgUkU6IFwiUkVcIixcbiAgUk86IFwiUk9cIixcbiAgUlM6IFwiUlNcIixcbiAgUlU6IFwiUlVcIixcbiAgUlc6IFwiUldcIixcbiAgU0E6IFwiU0FcIixcbiAgU0I6IFwiU0JcIixcbiAgU0M6IFwiU0NcIixcbiAgU0Q6IFwiU0RcIixcbiAgU0U6IFwiU0VcIixcbiAgU0c6IFwiU0dcIixcbiAgU0g6IFwiU0hcIixcbiAgU0k6IFwiU0lcIixcbiAgU0o6IFwiU0pcIixcbiAgU0s6IFwiU0tcIixcbiAgU0w6IFwiU0xcIixcbiAgU006IFwiU01cIixcbiAgU046IFwiU05cIixcbiAgU086IFwiU09cIixcbiAgU1I6IFwiU1JcIixcbiAgU1Q6IFwiU1RcIixcbiAgU1Y6IFwiU1ZcIixcbiAgU1k6IFwiU1lcIixcbiAgU1o6IFwiU1pcIixcbiAgVEM6IFwiVENcIixcbiAgVEQ6IFwiVERcIixcbiAgVEY6IFwiVEZcIixcbiAgVEc6IFwiVEdcIixcbiAgVEg6IFwiVEhcIixcbiAgVEo6IFwiVEpcIixcbiAgVEs6IFwiVEtcIixcbiAgVEw6IFwiVExcIixcbiAgVE06IFwiVE1cIixcbiAgVE46IFwiVE5cIixcbiAgVE86IFwiVE9cIixcbiAgVFI6IFwiVFJcIixcbiAgVFQ6IFwiVFRcIixcbiAgVFY6IFwiVFZcIixcbiAgVFc6IFwiVFdcIixcbiAgVFo6IFwiVFpcIixcbiAgVUE6IFwiVUFcIixcbiAgVUc6IFwiVUdcIixcbiAgVU06IFwiVU1cIixcbiAgVVM6IFwiVVNcIixcbiAgVVk6IFwiVVlcIixcbiAgVVo6IFwiVVpcIixcbiAgVkE6IFwiVkFcIixcbiAgVkM6IFwiVkNcIixcbiAgVkU6IFwiVkVcIixcbiAgVkc6IFwiVkdcIixcbiAgVkk6IFwiVklcIixcbiAgVk46IFwiVk5cIixcbiAgVlU6IFwiVlVcIixcbiAgV0Y6IFwiV0ZcIixcbiAgV1M6IFwiV1NcIixcbiAgWUU6IFwiWUVcIixcbiAgWVQ6IFwiWVRcIixcbiAgWkE6IFwiWkFcIixcbiAgWk06IFwiWk1cIixcbiAgWlc6IFwiWldcIixcbiAgLy8gT2ZmaWNpYWwgY29kZSBmb3IgdGhlIHVua25vd24gcmVnaW9uLlxuICBaWjogXCJaWlwiLFxufTtcbmV4cG9ydCBjbGFzcyBQaG9uZVZhbGlkYXRvcnMge1xuICBzdGF0aWMgY2hlY2tSZWdpb25Db2RlKGxvY2FsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShyZWdpb25zQ29kZVtsb2NhbF0gPT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZFJlZ2lvbkNvZGUoXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXG4gICk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICBpZiAoVXRpbC5pc05vdFByZXNlbnQoY29udHJvbCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFQaG9uZVZhbGlkYXRvcnMuY2hlY2tSZWdpb25Db2RlKGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBub1ZhbGlkUmVnaW9uQ29kZTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc1Bob25lTnVtYmVyKGxvY2FsOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNOb3RQcmVzZW50KGNvbnRyb2wpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghUGhvbmVWYWxpZGF0b3JzLmNoZWNrUmVnaW9uQ29kZShsb2NhbCkpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9WYWxpZFJlZ2lvbkNvZGU6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGhvbmVQYXJzZXI6IFBob25lTnVtYmVyVXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICBsZXQgZXJyb3IgPSB7IG5vUGhvbmVOdW1iZXI6IHRydWUgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBob25lTnVtYmVyOiBsaWJQaG9uZU51bWJlci5QaG9uZU51bWJlciA9IHBob25lUGFyc2VyLnBhcnNlKFxuICAgICAgICAgIGNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgbG9jYWxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBob25lUGFyc2VyLmlzVmFsaWROdW1iZXIocGhvbmVOdW1iZXIpKSB7XG4gICAgICAgICAgZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvciA9IHsgbm9QaG9uZU51bWJlcjogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfTtcbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc1Bvc3NpYmxlTnVtYmVyV2l0aFJlYXNvbihsb2NhbDogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzID0+IHtcbiAgICAgIGlmIChVdGlsLmlzTm90UHJlc2VudChjb250cm9sKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoIVBob25lVmFsaWRhdG9ycy5jaGVja1JlZ2lvbkNvZGUobG9jYWwpKSB7XG4gICAgICAgIHJldHVybiB7IG5vVmFsaWRSZWdpb25Db2RlOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBob25lUGFyc2VyOiBQaG9uZU51bWJlclV0aWwgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgbGV0IGVycm9yOiBWYWxpZGF0aW9uRXJyb3JzID0geyBub1Bob25lTnVtYmVyOiB0cnVlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwaG9uZU51bWJlcjogbGliUGhvbmVOdW1iZXIuUGhvbmVOdW1iZXIgPSBwaG9uZVBhcnNlci5wYXJzZShcbiAgICAgICAgICBjb250cm9sLnZhbHVlLFxuICAgICAgICAgIGxvY2FsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYXNvbjogUGhvbmVOdW1iZXJVdGlsLlZhbGlkYXRpb25SZXN1bHQgPSBwaG9uZVBhcnNlci5pc1Bvc3NpYmxlTnVtYmVyV2l0aFJlYXNvbihcbiAgICAgICAgICBwaG9uZU51bWJlclxuICAgICAgICApO1xuICAgICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICAgIGNhc2UgUGhvbmVOdW1iZXJVdGlsLlZhbGlkYXRpb25SZXN1bHQuSVNfUE9TU0lCTEU6XG4gICAgICAgICAgICBlcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUGhvbmVOdW1iZXJVdGlsLlZhbGlkYXRpb25SZXN1bHQuVE9PX0xPTkc6XG4gICAgICAgICAgICBlcnJvciA9IHsgcGhvbmVOdW1iZXJUb29Mb25nOiB0cnVlIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFBob25lTnVtYmVyVXRpbC5WYWxpZGF0aW9uUmVzdWx0LlRPT19TSE9SVDpcbiAgICAgICAgICAgIGVycm9yID0geyBwaG9uZU51bWJlclRvb1Nob3J0OiB0cnVlIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFBob25lTnVtYmVyVXRpbC5WYWxpZGF0aW9uUmVzdWx0LklOVkFMSURfQ09VTlRSWV9DT0RFOlxuICAgICAgICAgICAgZXJyb3IgPSB7IHBob25lTnVtYmVySW52YWxpZENvdW50cnlDb2RlOiB0cnVlIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3IgPSB7IG5vUGhvbmVOdW1iZXI6IHRydWUgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZXJyb3IgPSB7IG5vUGhvbmVOdW1iZXI6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH07XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxufVxuIl19