From 33fcdc58433ff0a1996d6d9b3aa87b030a8998b3 Mon Sep 17 00:00:00 2001 From: Marco Ricupero Date: Sat, 21 Sep 2024 04:35:50 +0200 Subject: [PATCH] 3.1.0 --- CHANGELOG.MD | 7 + dist/codice-fiscale-utils.bundle.min.js | 4 +- dist/codice-fiscale-utils.bundle.min.js.map | 422 +-- dist/index.d.ts | 1039 +++--- dist/index.js | 31 +- dist/index.mjs | 4 +- dist/index.mjs.map | 2 +- docs/assets/search.js | 2 +- docs/classes/CFMismatchValidator.html | 2052 +---------- docs/classes/CheckDigitizer.html | 735 +--- docs/classes/CodiceFiscaleUtils.html | 4 +- docs/classes/DateUtils.html | 563 +-- docs/classes/Gender.html | 706 +--- docs/classes/Parser.html | 3075 +---------------- docs/classes/Pattern.html | 2015 +---------- docs/classes/Validator-1.html | 1741 +--------- docs/enums/BirthMonth.html | 726 +--- docs/enums/CRC.html | 1230 +------ docs/enums/Omocodes.html | 654 +--- docs/index.html | 2 +- docs/interfaces/IMismatchVerboseErrors.html | 4 +- docs/modules/DATE_MATCHER.html | 384 +- docs/modules/VALIDATOR.html | 588 +--- docs/types/BelfiorePlace.html | 260 +- docs/types/DateDay.html | 319 +- docs/types/DateMonth.html | 281 +- docs/types/Genders.html | 261 +- docs/types/MultiFormatDate.html | 266 +- docs/variables/DATE_MATCHER.DAY.html | 263 +- .../DATE_MATCHER.DAYS_30_MONTHS.html | 267 +- .../DATE_MATCHER.DAYS_31_MONTHS.html | 269 +- docs/variables/DATE_MATCHER.HOURS.html | 263 +- .../DATE_MATCHER.ISO8601_DATE_TIME.html | 269 +- .../DATE_MATCHER.ISO8601_SHORT_DATE.html | 269 +- docs/variables/DATE_MATCHER.LEAP_MONTH.html | 263 +- docs/variables/DATE_MATCHER.MILLISECONDS.html | 263 +- docs/variables/DATE_MATCHER.MINUTES.html | 263 +- docs/variables/DATE_MATCHER.MONTH.html | 263 +- docs/variables/DATE_MATCHER.MONTH_DAY.html | 263 +- docs/variables/DATE_MATCHER.SECONDS.html | 263 +- docs/variables/DATE_MATCHER.TIME.html | 261 +- docs/variables/DATE_MATCHER.TIMEZONE.html | 263 +- docs/variables/DATE_MATCHER.YEAR.html | 261 +- .../VALIDATOR.BELFIORE_CODE_MATCHER.html | 270 +- .../VALIDATOR.CF_FULL_NAME_MATCHER.html | 270 +- docs/variables/VALIDATOR.CF_NAME_MATCHER.html | 267 +- .../VALIDATOR.CF_SURNAME_MATCHER.html | 267 +- docs/variables/VALIDATOR.CHECK_DIGIT.html | 263 +- docs/variables/VALIDATOR.CITY_CODE_LIST.html | 265 +- .../VALIDATOR.CITY_CODE_MATCHER.html | 267 +- docs/variables/VALIDATOR.CODICE_FISCALE.html | 265 +- docs/variables/VALIDATOR.CONSONANT_LIST.html | 267 +- .../VALIDATOR.COUNTRY_CODE_LIST.html | 267 +- .../VALIDATOR.COUNTRY_CODE_MATCHER.html | 270 +- docs/variables/VALIDATOR.DAY_29_MATCHER.html | 265 +- docs/variables/VALIDATOR.DAY_2X_MATCHER.html | 266 +- docs/variables/VALIDATOR.DAY_30_MATCHER.html | 265 +- docs/variables/VALIDATOR.DAY_31_MATCHER.html | 265 +- docs/variables/VALIDATOR.DAY_3X_MATCHER.html | 266 +- docs/variables/VALIDATOR.DAY_MATCHER.html | 263 +- .../VALIDATOR.FEMALE_DAY_MATCHER.html | 267 +- .../VALIDATOR.FEMALE_FULL_DATE_MATCHER.html | 270 +- .../VALIDATOR.FULL_DATE_MATCHER.html | 267 +- .../VALIDATOR.LEAP_YEAR_MATCHER.html | 269 +- .../variables/VALIDATOR.MALE_DAY_MATCHER.html | 267 +- .../VALIDATOR.MALE_FULL_DATE_MATCHER.html | 270 +- .../VALIDATOR.MONTH_30DAYS_LIST.html | 267 +- .../VALIDATOR.MONTH_31DAYS_LIST.html | 267 +- .../VALIDATOR.MONTH_DAY_MATCHER.html | 267 +- docs/variables/VALIDATOR.MONTH_LIST.html | 263 +- docs/variables/VALIDATOR.MONTH_MATCHER.html | 265 +- ...ALIDATOR.OMOCODE_NON_ZERO_NUMBER_LIST.html | 271 +- .../VALIDATOR.OMOCODE_NUMBER_LIST.html | 270 +- .../VALIDATOR.OMOCODE_ZERO_LIST.html | 267 +- ...LIDATOR.PARTIAL_BELFIORE_CODE_MATCHER.html | 273 +- docs/variables/VALIDATOR.PARTIAL_CF.html | 263 +- .../VALIDATOR.PARTIAL_CF_FULL_NAME.html | 270 +- .../VALIDATOR.PARTIAL_CF_NAME_MATCHER.html | 270 +- .../VALIDATOR.PARTIAL_FULL_DATE.html | 267 +- .../VALIDATOR.PARTIAL_MONTH_DAY.html | 267 +- docs/variables/VALIDATOR.PARTIAL_YEAR.html | 263 +- docs/variables/VALIDATOR.VOWEL_LIST.html | 263 +- docs/variables/VALIDATOR.YEAR_MATCHER.html | 263 +- package-lock.json | 31 +- package.json | 2 +- 85 files changed, 893 insertions(+), 31154 deletions(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index f35f719..7270f09 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,5 +1,12 @@ ## CHANGELOG +### 3.1.0 (2024-09-19) + +- Replaced moment with dayjs +- Updated dependency to @marketto/belfiore-connector@3.0.0 +- Used semantic versioning to prevent compatibility issues +- Updated Usage>Typestript example in README + ### 3.0.0 (2024-08-20) - Belfiore Connector separated from CodiceFiscaleUtils diff --git a/dist/codice-fiscale-utils.bundle.min.js b/dist/codice-fiscale-utils.bundle.min.js index fc87865..d393edb 100644 --- a/dist/codice-fiscale-utils.bundle.min.js +++ b/dist/codice-fiscale-utils.bundle.min.js @@ -1,8 +1,8 @@ /** - * @marketto/codice-fiscale-utils 3.0.0 + * @marketto/codice-fiscale-utils 3.1.0 * Copyright (c) 2019-2024, Marco Ricupero * License: MIT */ -var CodiceFiscaleUtils=function(t,e,i){"use strict";function r(t,e,i,r){return new(i||(i=Promise))((function(s,n){function a(t){try{c(r.next(t))}catch(t){n(t)}}function o(t){try{c(r.throw(t))}catch(t){n(t)}}function c(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}c((r=r.apply(t,e||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const s=15,n="[12][0-9]{3}",a="0[1-9]|1[0-2]",o="0[469]|11",c="0[13578]|1[02]",h=`(?:${a})-(?:0[1-9]|[12]\\d)|(?:${o})-30|(?:${c})-3[01]`,l="[01]\\d|2[0-3]",d="[0-5]\\d",u=d,f="\\d{3}",T=`Z|[-+](?:${l})(?::?${d})?`,$=`(?:${l})(?::${d}(?::${u}(\\.${f})?)?(?:${T})?)?`,A=`${n}-(?:${h})(?:T${$})?`,E=`${n}(?:-(?:(?:${a})|(?:${h})(?:T${$})?))?`;var _=Object.freeze({__proto__:null,DAY:"0[1-9]|[12][0-9]|3[01]",DAYS_30_MONTHS:o,DAYS_31_MONTHS:c,HOURS:l,ISO8601_DATE_TIME:E,ISO8601_SHORT_DATE:A,LEAP_MONTH:"02",MILLISECONDS:f,MINUTES:d,MONTH:a,MONTH_DAY:h,SECONDS:u,TIME:$,TIMEZONE:T,YEAR:n});class p{static parseDate(t){if(!(t instanceof Date||t instanceof e||"string"==typeof t&&new RegExp(`^(?:${E})$`).test(t)||Array.isArray(t)&&t.length&&!t.some((t=>"number"!=typeof t||isNaN(t)))))return null;try{let i;if(Array.isArray(t)){const[r,s=0,n=1]=t;if(!(s>=0&&s<=11&&n>0&&n<=31))return null;i=e(Date.UTC(r,s||0,n||1))}else i=e(t);return i.isValid()?i.toDate():null}catch(t){return null}}static ymdToDate(t,e,i){return this.parseDate([t,e,i])}}const C="B-DF-HJ-NP-TV-Z",m="AEIOU",R="\\dLMNP-V",D="1-9MNP-V",v="0L",N="A-EHLMPR-T",M="DHPS",O="ACELMRT",S="A-M",I="Z",y=`[A-Z][${m}][${m}X]|[${m}]X{2}|[${C}]{2}[A-Z]`,g=y,L=`(?:${y}){2}`,P=`[${R}]{2}`,F="[02468LNQSU][048LQU]|[13579MPRTV][26NS]",b=`[${N}]`,B="[26NS]",w="[37PT]",H=`[${v}4Q][${D}]|[1256MNRS][${R}]`,Y=`[${w}][${v}]`,V=`[${w}][${v}1M]`,G=`(?:${H}|${w}[${v}1M])`,U=`(?:[${v}][${D}]|[12MN][${R}]|[3P][${v}1M])`,j=`(?:[4Q][${D}]|[56RS][${R}]|[7T][${v}1M])`,x=`${b}(?:${H})|[${M}]${Y}|[${O}]${V}`,Z=`${P}(?:${b}(?:[${v}4Q][${D}]|[15MR][${R}]|${B}[0-8LMNP-U])|[${M}]${w}[${v}]|[${O}]${w}[${v}1M]|[${M}${O}]${B}[9V])|(?:${F})B${B}[9V]`,k=`${P}(?:${b}(?:[${v}][${D}]|[1M][${R}]|[2N][0-8LMNP-U])|[${M}][3P][${v}]|[${O}][3P][${v}1M]|[${M}${O}][2N][9V])|(?:${F})B[2N][9V]`,X=`${P}(?:${b}(?:[4Q][${D}]|[5R][${R}]|[6S][0-8LMNP-U])|[${M}][7T][${v}]|[${O}][7T][${v}1M]|[${M}${O}][6S][9V])|(?:${F})B[6S][9V]`,Q=`[${S}](?:[${D}][${R}]{2}|[${v}](?:[${D}][${R}]|[${v}][${D}]))`,J=`${I}[${D}][${R}]{2}`,z=`(?:[${S}${I}][${D}][${R}]{2})|(?:[${S}][${v}](?:[${D}][${R}]|[${v}][${D}]))`,K="[A-Z]",W=`${L}(?:${Z})(?:${z})${K}`,q=`[A-Z][${m}]?|[${C}]{1,2}`,tt=`(?:${q})|(?:(?:${y})(?:${q})?)`,et=`[${R}]`,it=`${b}[${v}12456MNQRS]?|[${M}${O}]${w}`,rt=`${et}|(?:${P}(?:${it})?)`,st=`[${S}${I}](?:[${D}][${R}]?)?|[${I}](?:[${v}][${R}]?)?`,nt=`${tt}|(?:${L}(?:(?:${rt})|(?:${Z})(?:(?:${st})|(?:${z})${K}?)?)?)?`;var at,ot=Object.freeze({__proto__:null,BELFIORE_CODE_MATCHER:z,CF_FULL_NAME_MATCHER:L,CF_NAME_MATCHER:y,CF_SURNAME_MATCHER:g,CHECK_DIGIT:K,CITY_CODE_LIST:S,CITY_CODE_MATCHER:Q,CODICE_FISCALE:W,CONSONANT_LIST:C,COUNTRY_CODE_LIST:I,COUNTRY_CODE_MATCHER:J,DAY_29_MATCHER:H,DAY_2X_MATCHER:B,DAY_30_MATCHER:Y,DAY_31_MATCHER:V,DAY_3X_MATCHER:w,DAY_MATCHER:G,FEMALE_DAY_MATCHER:j,FEMALE_FULL_DATE_MATCHER:X,FULL_DATE_MATCHER:Z,LEAP_YEAR_MATCHER:F,MALE_DAY_MATCHER:U,MALE_FULL_DATE_MATCHER:k,MONTH_30DAYS_LIST:M,MONTH_31DAYS_LIST:O,MONTH_DAY_MATCHER:x,MONTH_LIST:N,MONTH_MATCHER:b,OMOCODE_NON_ZERO_NUMBER_LIST:D,OMOCODE_NUMBER_LIST:R,OMOCODE_ZERO_LIST:v,PARTIAL_BELFIORE_CODE_MATCHER:st,PARTIAL_CF:nt,PARTIAL_CF_FULL_NAME:tt,PARTIAL_CF_NAME_MATCHER:q,PARTIAL_FULL_DATE:rt,PARTIAL_MONTH_DAY:it,PARTIAL_YEAR:et,VOWEL_LIST:m,YEAR_MATCHER:P});!function(t){t[t.B=0]="B",t[t.A=1]="A",t[t.K=2]="K",t[t.P=3]="P",t[t.L=4]="L",t[t.C=5]="C",t[t.Q=6]="Q",t[t.D=7]="D",t[t.R=8]="R",t[t.E=9]="E",t[t.V=10]="V",t[t.O=11]="O",t[t.S=12]="S",t[t.F=13]="F",t[t.T=14]="T",t[t.G=15]="G",t[t.U=16]="U",t[t.H=17]="H",t[t.M=18]="M",t[t.I=19]="I",t[t.N=20]="N",t[t.J=21]="J",t[t.W=22]="W",t[t.Z=23]="Z",t[t.Y=24]="Y",t[t.X=25]="X"}(at||(at={}));var ct,ht=at;class lt{static checkDigit(t){if("string"==typeof t&&new RegExp(nt).test(t)){const e=t.substr(0,s);let i=0;for(const t of this.evaluateChar(e))i+=t;return String.fromCharCode(i%this.CRC_MOD+this.CHAR_OFFSET)}return null}static evaluateChar(t=""){return(e=this.evaluateCharGenerator(t))[Symbol.iterator]=()=>e,e;var e}static*evaluateCharGenerator(t=""){if("string"==typeof t&&t.length)for(let e=0;e0&&e<=this.MAX_MONTH_DAY?e:null}static getGender(t){return this.toArray().find((e=>t>=Tt[e]&&t<=Tt[e]+this.MAX_MONTH_DAY))||null}static genderizeDay(t,e){return t+Tt[e]}static toArray(){return["M","F"]}}At.MAX_MONTH_DAY=31;const Et=new Date("1973-09-29"),_t=new i;class pt{constructor(t){this.belfioreConnector=t,this.OMOCODE_BITMAP=30400,this.JOLLY_CHAR="*"}cfDeomocode(t){if(t&&t.length<=6)return t;const e=this.partialCfDeomocode(t);if(e.length=0;r--)if(Math.pow(2,r)&this.OMOCODE_BITMAP){if(!!(e&Math.pow(2,s))!==isNaN(parseInt(i[r],10))){const t=i[r].toUpperCase();i[r]=$t[t]}s++}const r=i[15];if(r){const t=i.slice(0,s).join("");i[15]=this.appyCaseToChar(lt.checkDigit(t)||"",r)}return i.join("")}cfOmocodeId(t){const e=t.split("").filter(((t,e)=>Math.pow(2,e)&this.OMOCODE_BITMAP)).map((t=>/^[a-z]$/i.test(_t[t])?1:0)).join("");return parseInt(e,2)}cfToLastName(t){const e=null==t?void 0:t.substring(0,3);if("string"!=typeof t||3!==e.length||!new RegExp(`^(?:${g})`,"iu").test(e))return null;const i=t.substring(0,3),[r=""]=i.match(new RegExp(`^[${C}]{1,3}`,"ig"))||[],[s=""]=i.match(new RegExp(`[${m}]{1,3}`,"ig"))||[],n=r.length+s.length;if(n<2||n<3&&"X"!==i[2].toUpperCase())return null;switch(r.length){case 3:return(r+s).split("").join(this.JOLLY_CHAR)+this.JOLLY_CHAR;case 2:return`${r[0]}${s[0]}*${r[1]}${this.JOLLY_CHAR}`;case 1:return`${r[0]}${s}${this.JOLLY_CHAR}`;default:return`${s}${3===s.length?this.JOLLY_CHAR:""}`}}cfToFirstName(t){const e=null==t?void 0:t.substring(3,6);return"string"==typeof t&&3===(null==e?void 0:e.length)&&new RegExp(`^(${y})$`,"iu").test(e)?this.cfToLastName(e):null}cfToGender(t){if("string"!=typeof t||t.length<10)return null;const e=t.substring(9,10),i=10*parseInt(this.partialCfDeomocode(e,9),10);return At.getGender(i)}cfToBirthYear(t){if("string"!=typeof t||t.length<8)return null;const i=t.substring(6,8),r=parseInt(this.partialCfDeomocode(i,6),10);if(isNaN(r))return null;const s=parseInt(e().format("YY"),10),n=100*(r>s?1:0);return e().subtract(s-r+n,"years").year()}cfToBirthMonth(t){if("string"!=typeof t||t.length<9)return null;const e=t.substring(8,9).toUpperCase(),i=ut[e];return"number"!=typeof i||i<0||i>11?null:i}cfToBirthDay(t){if("string"!=typeof t||t.length<11)return null;const e=t.substring(9,11),i=parseInt(this.partialCfDeomocode(e,9),10);return isNaN(i)?null:At.getDay(i)}cfToBirthDate(t){const e=this.cfToBirthDay(t);if(!e)return null;const i=this.cfToBirthMonth(t);if("number"!=typeof i)return null;const r=this.cfToBirthYear(t);return p.ymdToDate(r,i,e)}cfToBirthPlace(t){return r(this,arguments,void 0,(function*(t,i=!0){if("string"!=typeof t||t.length<15)return null;const r=t.substring(11,15),s=this.partialCfDeomocode(r,11),n=yield this.belfioreConnector.findByCode(s);if(!n)return null;const{creationDate:a,expirationDate:o}=n;if((a||o)&&i){const i=this.cfToBirthDate(t),r=e(Et).add(5,"years").isBefore(i,"day");if(i&&r){if(!((!o||e(i).isBefore(o,"day"))&&(!a||e(i).isAfter(a,"day"))))return null}}return n}))}cfDecode(t){return r(this,void 0,void 0,(function*(){var e;const i=this.cfToBirthYear(t)||void 0,r=null!==(e=this.cfToBirthMonth(t))&&void 0!==e?e:void 0,s=this.cfToBirthDay(t)||void 0,n=p.ymdToDate(i,r,s)||void 0,a=yield this.cfToBirthPlace(t),o={firstName:this.cfToFirstName(t)||void 0,lastName:this.cfToLastName(t)||void 0,day:s,month:r,year:i,date:n,gender:this.cfToGender(t)||void 0,place:a||void 0,omocodeId:this.cfOmocodeId(t)};return i&&r&&s&&(o.date=new Date(Date.UTC(i,r,s))),o}))}lastNameToCf(t){if(!t||(t||"").trim().length<2)return null;if(!/^[A-Z ']{1,32}$/iu.test(_t.replace(t)))return null;const e=(this.charExtractor(t,C)+this.charExtractor(t,m)).padEnd(3,"X").substring(0,3);return e.length<3?null:e.toUpperCase()}firstNameToCf(t){if(!t||(t||"").trim().length<2)return null;const e=this.charExtractor(t,C);return e.length>=4?(e[0]+e.substring(2,4)).toUpperCase():this.lastNameToCf(t)}yearToCf(t){let e;return e="string"==typeof t?parseInt(t,10):t,"number"!=typeof e||isNaN(e)||!(e>=1900||e<100)?null:`0${e}`.substr(-2)}monthToCf(t){return t<0||t>11?null:ut[t]||null}dayGenderToCf(t,e){if(t<1||t>31)return null;const i=Tt[e];return"number"!=typeof i?null:`0${t+i}`.substr(-2)}yearMonthDayToDate(t,i=0,r=1){if(!t||t<1861||[i,r].some((t=>"number"!=typeof t)))return null;const s=e(Date.UTC(t,i||0,r||1));return s.isValid()&&s.year()===t&&s.month()===i&&s.date()===r?s.toDate():null}parsePlace(t){return r(this,void 0,void 0,(function*(){let e;return t?("object"==typeof t&&t.belfioreCode?e=yield this.belfioreConnector.findByCode(t.belfioreCode):"string"==typeof t&&(e=(yield this.belfioreConnector.findByCode(t))||(yield this.belfioreConnector.findByName(t))),e||null):null}))}dateGenderToCf(t,e){const i=p.parseDate(t);if(!i)return null;return`${this.yearToCf(i.getFullYear())}${this.monthToCf(i.getMonth())}${this.dayGenderToCf(i.getDate(),e)}`}placeToCf(t,e,i){return r(this,void 0,void 0,(function*(){const r=p.parseDate(t);let s,n;if(r||"string"!=typeof t){if(!e)return null;s=e,n=i}else s=t,n=e;let a=this.belfioreConnector;if(n&&(a=a.byProvince(n)),r&&a&&(a=a.from(r)),a){const t=yield new pt(a).parsePlace(s);if(t)return t.belfioreCode}return null}))}encodeCf(t){return r(this,arguments,void 0,(function*({lastName:t,firstName:e,year:i,month:s,day:n,date:a,gender:o,place:c,omocodeId:h=0}){const l=p.parseDate(a)||this.yearMonthDayToDate(i,s,n);if(!(l&&t&&e&&o&&c))return null;const d=[()=>r(this,void 0,void 0,(function*(){return this.lastNameToCf(t)})),()=>r(this,void 0,void 0,(function*(){return this.firstNameToCf(e)})),()=>r(this,void 0,void 0,(function*(){return this.dateGenderToCf(l,o)})),()=>r(this,void 0,void 0,(function*(){return yield this.placeToCf(l,(null==c?void 0:c.belfioreCode)||c)}))];let u="";for(const t of d){const e=yield t();if(!e)return null;u+=e}return this.cfOmocode(u,h)}))}checkBitmap(t){return!!(Math.pow(2,t)&this.OMOCODE_BITMAP)}charOmocode(t,e){return/^[A-Z]$/giu.test(t)&&this.checkBitmap(e)?$t[t.toUpperCase()]:t}charExtractor(t,e){const i=new RegExp(`[${e}]{1,24}`,"ig");return(_t.replace(t).trim().match(i)||[]).join("")}partialCfDeomocode(t,e=0){return t.replace(/[\dA-Z]/giu,((t,i)=>this.charOmocode(t,i+e)))}appyCaseToChar(t,e){if(t&&e){const i=e[0]===e[0].toUpperCase(),r=e[0]===e[0].toLowerCase();if(i&&!r)return t[0].toUpperCase();if(!i&&r)return t[0].toLowerCase()}return t[0]}}const Ct="Provided lastName is not valid, only letters, diacritics and apostrophe allowed",mt="Provided name is not valid, only letters, diacritics and apostrophe allowed",Rt="Provided day is not valid",Dt="Provided gender is not valid",vt="Provided day and/or gender are not valid",Nt="Provided year is not valid, only 2 or 4 digit numbers are allowed",Mt="Provided date is not valid";var Ot=Object.freeze({__proto__:null,INVALID_DATE:Mt,INVALID_DAY:Rt,INVALID_DAY_OR_GENDER:vt,INVALID_GENDER:Dt,INVALID_NAME:mt,INVALID_PLACE_NAME:"Proviced City/Country name is not valid",INVALID_SURNAME:Ct,INVALID_YEAR:Nt});class St extends Error{constructor(t){super((Object.entries(Ot).find((([e])=>e===t))||[])[1]||t)}}const It=new i;class yt{constructor(t){this.belfioreConnector=t,this.LETTER_SET=`[A-Z${It.matcherBy(/^[A-Z]$/iu)}]`,this.SEPARATOR_SET="(?:'?\\s{0,4})",this.parser=new pt(t)}cfLastName(t){let e=g;if(t){if(!this.lastName().test(t))throw new St(Ct);e=this.parser.lastNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfFirstName(t){let e=y;if(t){if(!this.lastName().test(t))throw new St(mt);e=this.parser.firstNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfYear(t){let e=P;if(t){const i=this.parser.yearToCf(t);if(!i)throw new St(Nt);e=this.deomocode(i)}return this.isolatedInsensitiveTailor(e)}cfMonth(t){let e=b;return t&&(e=this.parser.monthToCf(t)||e),this.isolatedInsensitiveTailor(e)}cfDay(t){let e=G;if(t){const i=this.parser.dayGenderToCf(t,"M"),r=this.parser.dayGenderToCf(t,"F");if(!i||!r)throw new St(Rt);e=`(?:${this.deomocode(i)})|(?:${this.deomocode(r)})`}return this.isolatedInsensitiveTailor(e)}cfDayGender(t,e){if(!e)return this.cfDay(t);let i;if(t){const r=this.parser.dayGenderToCf(t,e);if(!r)throw new St(vt);i=this.deomocode(r)}else switch(e){case"M":i=U;break;case"F":i=j;break;default:throw new St(Dt)}return this.isolatedInsensitiveTailor(i)}cfDateGender(t,e){if(t&&!p.parseDate(t))throw new St(Mt);if(e&&!At.toArray().includes(e))throw new St(Dt);let i=Z;if(t){const r=e&&this.parser.dateGenderToCf(t,e);if(r)i=this.deomocode(r);else{const e=e=>{const i=this.parser.dateGenderToCf(t,e);if(!i)throw new St(Mt);return i&&this.deomocode(i)};i=`(?:${At.toArray().map(e).join("|")})`}}else"M"===e?i=k:"F"===e&&(i=X);return this.isolatedInsensitiveTailor(i)}cfPlace(t,e){return r(this,void 0,void 0,(function*(){let i=z;if(t){const r=p.parseDate(t);if(r&&e){const t=e,s=yield this.parser.placeToCf(r,t);i=this.deomocode(s||"")}else if(!r&&"string"==typeof t){const e=t,r=yield this.parser.placeToCf(e);i=this.deomocode(r||"")}}return this.isolatedInsensitiveTailor(i)}))}codiceFiscale(t){return r(this,void 0,void 0,(function*(){let e=W;if(t){const i=yield this.parser.encodeCf(t);if(i)e=this.deomocode(i);else{const{lastName:i,firstName:s,year:n,month:a,day:o,date:c,gender:h,place:l}=t;if(i||s||n||a||o||c||h||l){let t=null;c?t=p.parseDate(c):n&&(t=this.parser.yearMonthDayToDate(n,a,o));const d=[()=>r(this,void 0,void 0,(function*(){return this.cfLastName(i)})),()=>r(this,void 0,void 0,(function*(){return this.cfFirstName(s)})),()=>r(this,void 0,void 0,(function*(){return this.cfDateGender(t,h)})),()=>r(this,void 0,void 0,(function*(){return yield this.cfPlace(t,(null==l?void 0:l.belfioreCode)||l)}))];e="";for(const t of d){const i=(yield t()).toString(),r=i.match(/\^(.{1,256})\$/),s=r&&r[1];if(!s)throw new Error(`Unable to handle [${i}]`);e+=`(?:${s})`}e+=K}}}return this.isolatedInsensitiveTailor(e)}))}lastName(t){let e=`${this.LETTER_SET}{1,24}`;if(t&&/^[A-Z]{1,3}/iu.test(t)){const i=t.substr(0,3),r=t=>t.split("").map((t=>`[${It.insensitiveMatcher[t]}]`)),[s,n]=[`^[${C}]{1,3}`,`[${m}]{1,3}`].map((t=>r((i.match(new RegExp(t,"ig"))||[])[0]||""))),a=`[${m+It.matcherBy(new RegExp(`^[${m}]$`,"ui"))}]`,o=`(?:${a}${this.SEPARATOR_SET}){0,24}`,c=`(?:${this.SEPARATOR_SET}${o}${a})?`;switch(s.length){case 3:{const t=o;e=t+s.join(`${this.SEPARATOR_SET}${t}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;break}case 2:e=`(?:${[`${n[0]}${o}${this.SEPARATOR_SET}${s[0]}${o}${s[1]}`,`${s[0]}${this.SEPARATOR_SET}`+n.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${o}${s[1]}`,s.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${n[0]}`].join("|")})${c}`;break;case 1:e=`(?:${[n.slice(0,2).join(`${this.SEPARATOR_SET}`)+o+s.join(`${this.SEPARATOR_SET}`),`${n[0]}${this.SEPARATOR_SET}`+s.join(`${this.SEPARATOR_SET}`)+n[1],[s[0],...n.slice(0,2)].join(`${this.SEPARATOR_SET}`)].join("|")})${c}`;break;default:e=`${n.join(`${this.SEPARATOR_SET}`)}${c}`}if((null==n?void 0:n.length)+(null==s?void 0:s.length)<3)return this.isolatedInsensitiveTailor(`\\s{0,4}(${e})\\s{0,4}`)}return this.isolatedInsensitiveTailor(`\\s{0,4}((?:${e})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\s{0,4}`)}firstName(t){if(t&&new RegExp(`^[A-Z]{3}[${C}]{3}`,"iu").test(t)){const e=((t.substr(3,3).match(new RegExp(`^[${C}]{1,3}`,"ig"))||[])[0]||"").split("").map((t=>`[${It.insensitiveMatcher[t]}]`)),[i,r]=[m,C].map((t=>t+It.matcherBy(new RegExp(`^[${t}]$`,"ui")))),s=`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}${e[0]}${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${r}]${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24})?`+e.slice(1,3).join(`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;return this.isolatedInsensitiveTailor(s)}return this.lastName((t||"").substr(3,3))}date(t){let i=E;if(t){const r=this.parser.cfToBirthDate(t);if(r){const t=r.toJSON();if(e().diff(e(r),"y")<50){const e=parseInt(t.substr(0,2),10);i=`(?:${[e-1,e].map((t=>t.toString().padStart(2,"0"))).join("|")})`+t.substr(2,8)}else i=t.substr(0,10)}}return this.isolatedInsensitiveTailor(`${i}(?:T${$}(?:${T})?)?`)}gender(t){const e=t&&this.parser.cfToGender(t)||`[${At.toArray().join("")}]`;return this.isolatedInsensitiveTailor(e)}place(t){return r(this,void 0,void 0,(function*(){let e=".{1,32}";const i=t&&(yield this.parser.cfToBirthPlace(t));if(i){e=`(?:(?:${i.name.replace(/./gu,(t=>It[t]===t?t:`[${t}${It[t]}]`))})|${i.belfioreCode})`}return this.isolatedInsensitiveTailor(e)}))}deomocode(t){return t.replace(/\d/gu,(t=>`[${t}${$t[t]}]`))}isolatedInsensitiveTailor(t){return new RegExp(`^(?:${t})$`,"iu")}}class gt{constructor(t,e){this.codiceFiscale=e,this.pattern=new yt(t),this.parser=new pt(t)}get hasLastName(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=3}get hasFirstName(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=6}get hasBirthYear(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=8}get hasBirthDate(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=11}get hasGender(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=10}get hasBirthPlace(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=15}get hasCRC(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=16}matchPersonalInfo(t){return r(this,void 0,void 0,(function*(){return(yield this.pattern.codiceFiscale(t)).test(this.codiceFiscale)}))}mismatchPersonalInfo(t){return r(this,void 0,void 0,(function*(){return!(!(this.codiceFiscale&&t&&t.lastName&&t.firstName&&(t.date||t.day&&t.month&&t.year)&&t.gender&&t.place)||(yield this.matchPersonalInfo(t)))}))}matchLastName(t){return this.hasLastName&&this.pattern.lastName(this.codiceFiscale).test(t||"")}mismatchLastName(t){return this.hasLastName&&!!t&&!this.matchLastName(t)}matchFirstName(t){return this.hasFirstName&&this.pattern.firstName(this.codiceFiscale).test(t||"")}mismatchFirstName(t){return this.hasFirstName&&!!t&&!this.matchFirstName(t)}matchBirthDate(t){if(this.hasBirthDate){const i=this.parser.cfToBirthDate(this.codiceFiscale),r=p.parseDate(t);if(i&&r)return e(i).isSame(r,"d")}return!1}mismatchBirthDate(t){return this.hasBirthYear&&!!p.parseDate(t)&&!this.matchBirthDate(t)}matchGender(t){return this.hasGender&&this.pattern.gender(this.codiceFiscale).test(t||"")}mismatchGender(t){return this.hasGender&&!!t&&!this.matchGender(t)}matchBirthPlace(t){return r(this,void 0,void 0,(function*(){if(this.hasBirthPlace&&t){const e=yield this.pattern.place(this.codiceFiscale),i=yield this.parser.parsePlace(t);return!!i&&e.test(null==i?void 0:i.belfioreCode)}return!1}))}mismatchBirthPlace(t){return r(this,void 0,void 0,(function*(){return this.hasBirthPlace&&!!t&&!(yield this.matchBirthPlace(t))}))}get errors(){return Promise.all([this.parser.cfToBirthPlace(this.codiceFiscale,!1),this.parser.cfToBirthPlace(this.codiceFiscale,!0)]).then((([t,e])=>{var i,r;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},this.parser.cfToLastName(this.codiceFiscale)?{}:{lastName:"MISSING_OR_INVALID_LAST_NAME"}),this.parser.cfToFirstName(this.codiceFiscale)?{}:{firstName:"MISSING_OR_INVALID_FIRST_NAME"}),this.parser.cfToBirthDate(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DATE"}),this.parser.cfToBirthDay(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DAY"}),this.parser.cfToBirthMonth(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_MONTH"}),this.parser.cfToBirthYear(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_YEAR"}),this.parser.cfToGender(this.codiceFiscale)?{}:{gender:"MISSING_DAY"}),t?{}:{place:"MISSING_OR_INVALID_PLACE"}),e?{}:{place:"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE",date:"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE"}),(null===(r=null===(i=this.codiceFiscale)||void 0===i?void 0:i.substring(s,16))||void 0===r?void 0:r.toUpperCase())===lt.checkDigit(this.codiceFiscale)?{}:{crc:"INVALID_CRC_CODE"}),this.hasCRC?{}:{crc:"MISSING_CRC_CODE"})})).then((t=>Object.keys(t).length?t:null))}get valid(){return Promise.all([this.pattern.codiceFiscale(),this.parser.cfToBirthPlace(this.codiceFiscale)]).then((([t,e])=>{var i,r;return!(!this.hasCRC||!t.test(this.codiceFiscale)||(null===(r=null===(i=this.codiceFiscale)||void 0===i?void 0:i.substring(s,16))||void 0===r?void 0:r.toUpperCase())!==lt.checkDigit(this.codiceFiscale)||!e)}))}get invalid(){return this.valid.then((t=>!!this.codiceFiscale&&!t))}}class Lt{constructor(t){this.belfioreConnector=t,this.parser=new pt(t),this.pattern=new yt(t)}codiceFiscale(t){return new gt(this.belfioreConnector,t)}isLastNameValid(t){return this.pattern.lastName().test(t)}isLastNameInvalid(t){return!!t&&!this.isLastNameValid(t)}isFirstNameValid(t){return this.pattern.firstName().test(t)}isFirstNameInvalid(t){return!!t&&!this.isFirstNameValid(t)}isBirthDateValid(t){return!!p.parseDate(t)}isBirthDateInvalid(t){return!!t&&!this.isBirthDateValid(t)}isGenderValid(t){return this.pattern.gender().test(t)}isGenderInvalid(t){return!!t&&!this.isGenderValid(t)}isBirthPlaceValid(t){return r(this,void 0,void 0,(function*(){const e=yield this.parser.parsePlace(t);return!!e&&!!(yield this.belfioreConnector.findByCode(e.belfioreCode))}))}isBirthPlaceInvalid(t){return r(this,void 0,void 0,(function*(){return!!t&&!(yield this.isBirthPlaceValid(t))}))}birthDatePlaceMatch(t,i){return r(this,void 0,void 0,(function*(){const r=yield this.parser.parsePlace(i);return this.isBirthDateValid(t)&&!!r&&(!!(yield this.belfioreConnector.from(t).findByCode(r.belfioreCode))||e(p.parseDate(t)).isSameOrBefore(Et,"day"))}))}birthDatePlaceMismatch(t,e){return r(this,void 0,void 0,(function*(){const i=yield this.parser.parsePlace(e);return this.isBirthDateValid(t)&&!!i&&!(yield this.birthDatePlaceMatch(t,e))}))}birthPlaceDateMatch(t,e){return r(this,void 0,void 0,(function*(){return yield this.birthDatePlaceMatch(e,t)}))}birthPlaceDateMismatch(t,e){return r(this,void 0,void 0,(function*(){return yield this.birthDatePlaceMismatch(e,t)}))}}class Pt{constructor(t){this.belfioreConnector=t,this.validator=new Lt(t),this.parser=new pt(t),this.pattern=new yt(t)}}return t.BirthMonth=ut,t.CFMismatchValidator=gt,t.CRC=ht,t.CheckDigitizer=lt,t.CodiceFiscaleUtils=Pt,t.DATE_MATCHER=_,t.DateUtils=p,t.Gender=At,t.Matcher=ot,t.Omocodes=$t,t.Parser=pt,t.Pattern=yt,t.VALIDATOR=ot,t.Validator=Lt,t.default=Pt,Object.defineProperty(t,"__esModule",{value:!0}),t}({},moment,DiacriticRemover); +var CodiceFiscaleUtils=function(t,e,i){"use strict";function r(t,e,i,r){return new(i||(i=Promise))((function(s,n){function a(t){try{c(r.next(t))}catch(t){n(t)}}function o(t){try{c(r.throw(t))}catch(t){n(t)}}function c(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}c((r=r.apply(t,e||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const s=15,n="[12][0-9]{3}",a="0[1-9]|1[0-2]",o="0[469]|11",c="0[13578]|1[02]",h=`(?:${a})-(?:0[1-9]|[12]\\d)|(?:${o})-30|(?:${c})-3[01]`,l="[01]\\d|2[0-3]",d="[0-5]\\d",u=d,f="\\d{3}",T=`Z|[-+](?:${l})(?::?${d})?`,$=`(?:${l})(?::${d}(?::${u}(\\.${f})?)?(?:${T})?)?`,A=`${n}-(?:${h})(?:T${$})?`,E=`${n}(?:-(?:(?:${a})|(?:${h})(?:T${$})?))?`;var _=Object.freeze({__proto__:null,DAY:"0[1-9]|[12][0-9]|3[01]",DAYS_30_MONTHS:o,DAYS_31_MONTHS:c,HOURS:l,ISO8601_DATE_TIME:E,ISO8601_SHORT_DATE:A,LEAP_MONTH:"02",MILLISECONDS:f,MINUTES:d,MONTH:a,MONTH_DAY:h,SECONDS:u,TIME:$,TIMEZONE:T,YEAR:n});class p{static parseDate(t){if(!(t instanceof Date||"string"==typeof t&&new RegExp(`^(?:${E})$`).test(t)||Array.isArray(t)&&t.length&&!t.some((t=>"number"!=typeof t||isNaN(t)))))return null;try{let i;if(Array.isArray(t)){const[r,s=0,n=1]=t;if(!(s>=0&&s<=11&&n>0&&n<=31))return null;i=e(Date.UTC(r,s||0,n||1))}else i=e(t);return i.isValid()?i.toDate():null}catch(t){return null}}static ymdToDate(t,e,i){return this.parseDate([t,e,i])}}const C="B-DF-HJ-NP-TV-Z",R="AEIOU",m="\\dLMNP-V",D="1-9MNP-V",v="0L",N="A-EHLMPR-T",M="DHPS",O="ACELMRT",I="A-M",S="Z",y=`[A-Z][${R}][${R}X]|[${R}]X{2}|[${C}]{2}[A-Z]`,g=y,L=`(?:${y}){2}`,P=`[${m}]{2}`,F="[02468LNQSU][048LQU]|[13579MPRTV][26NS]",b=`[${N}]`,B="[26NS]",w="[37PT]",H=`[${v}4Q][${D}]|[1256MNRS][${m}]`,Y=`[${w}][${v}]`,V=`[${w}][${v}1M]`,G=`(?:${H}|${w}[${v}1M])`,U=`(?:[${v}][${D}]|[12MN][${m}]|[3P][${v}1M])`,j=`(?:[4Q][${D}]|[56RS][${m}]|[7T][${v}1M])`,x=`${b}(?:${H})|[${M}]${Y}|[${O}]${V}`,Z=`${P}(?:${b}(?:[${v}4Q][${D}]|[15MR][${m}]|${B}[0-8LMNP-U])|[${M}]${w}[${v}]|[${O}]${w}[${v}1M]|[${M}${O}]${B}[9V])|(?:${F})B${B}[9V]`,k=`${P}(?:${b}(?:[${v}][${D}]|[1M][${m}]|[2N][0-8LMNP-U])|[${M}][3P][${v}]|[${O}][3P][${v}1M]|[${M}${O}][2N][9V])|(?:${F})B[2N][9V]`,X=`${P}(?:${b}(?:[4Q][${D}]|[5R][${m}]|[6S][0-8LMNP-U])|[${M}][7T][${v}]|[${O}][7T][${v}1M]|[${M}${O}][6S][9V])|(?:${F})B[6S][9V]`,Q=`[${I}](?:[${D}][${m}]{2}|[${v}](?:[${D}][${m}]|[${v}][${D}]))`,J=`${S}[${D}][${m}]{2}`,z=`(?:[${I}${S}][${D}][${m}]{2})|(?:[${I}][${v}](?:[${D}][${m}]|[${v}][${D}]))`,K="[A-Z]",W=`${L}(?:${Z})(?:${z})${K}`,q=`[A-Z][${R}]?|[${C}]{1,2}`,tt=`(?:${q})|(?:(?:${y})(?:${q})?)`,et=`[${m}]`,it=`${b}[${v}12456MNQRS]?|[${M}${O}]${w}`,rt=`${et}|(?:${P}(?:${it})?)`,st=`[${I}${S}](?:[${D}][${m}]?)?|[${S}](?:[${v}][${m}]?)?`,nt=`${tt}|(?:${L}(?:(?:${rt})|(?:${Z})(?:(?:${st})|(?:${z})${K}?)?)?)?`;var at,ot=Object.freeze({__proto__:null,BELFIORE_CODE_MATCHER:z,CF_FULL_NAME_MATCHER:L,CF_NAME_MATCHER:y,CF_SURNAME_MATCHER:g,CHECK_DIGIT:K,CITY_CODE_LIST:I,CITY_CODE_MATCHER:Q,CODICE_FISCALE:W,CONSONANT_LIST:C,COUNTRY_CODE_LIST:S,COUNTRY_CODE_MATCHER:J,DAY_29_MATCHER:H,DAY_2X_MATCHER:B,DAY_30_MATCHER:Y,DAY_31_MATCHER:V,DAY_3X_MATCHER:w,DAY_MATCHER:G,FEMALE_DAY_MATCHER:j,FEMALE_FULL_DATE_MATCHER:X,FULL_DATE_MATCHER:Z,LEAP_YEAR_MATCHER:F,MALE_DAY_MATCHER:U,MALE_FULL_DATE_MATCHER:k,MONTH_30DAYS_LIST:M,MONTH_31DAYS_LIST:O,MONTH_DAY_MATCHER:x,MONTH_LIST:N,MONTH_MATCHER:b,OMOCODE_NON_ZERO_NUMBER_LIST:D,OMOCODE_NUMBER_LIST:m,OMOCODE_ZERO_LIST:v,PARTIAL_BELFIORE_CODE_MATCHER:st,PARTIAL_CF:nt,PARTIAL_CF_FULL_NAME:tt,PARTIAL_CF_NAME_MATCHER:q,PARTIAL_FULL_DATE:rt,PARTIAL_MONTH_DAY:it,PARTIAL_YEAR:et,VOWEL_LIST:R,YEAR_MATCHER:P});!function(t){t[t.B=0]="B",t[t.A=1]="A",t[t.K=2]="K",t[t.P=3]="P",t[t.L=4]="L",t[t.C=5]="C",t[t.Q=6]="Q",t[t.D=7]="D",t[t.R=8]="R",t[t.E=9]="E",t[t.V=10]="V",t[t.O=11]="O",t[t.S=12]="S",t[t.F=13]="F",t[t.T=14]="T",t[t.G=15]="G",t[t.U=16]="U",t[t.H=17]="H",t[t.M=18]="M",t[t.I=19]="I",t[t.N=20]="N",t[t.J=21]="J",t[t.W=22]="W",t[t.Z=23]="Z",t[t.Y=24]="Y",t[t.X=25]="X"}(at||(at={}));var ct,ht=at;class lt{static checkDigit(t){if("string"==typeof t&&new RegExp(nt).test(t)){const e=t.substr(0,s);let i=0;for(const t of this.evaluateChar(e))i+=t;return String.fromCharCode(i%this.CRC_MOD+this.CHAR_OFFSET)}return null}static evaluateChar(t=""){return(e=this.evaluateCharGenerator(t))[Symbol.iterator]=()=>e,e;var e}static*evaluateCharGenerator(t=""){if("string"==typeof t&&t.length)for(let e=0;e0&&e<=this.MAX_MONTH_DAY?e:null}static getGender(t){return this.toArray().find((e=>t>=Tt[e]&&t<=Tt[e]+this.MAX_MONTH_DAY))||null}static genderizeDay(t,e){return t+Tt[e]}static toArray(){return["M","F"]}}At.MAX_MONTH_DAY=31;const Et=new Date("1973-09-29"),_t=new i;class pt{constructor(t){this.belfioreConnector=t,this.OMOCODE_BITMAP=30400,this.JOLLY_CHAR="*"}cfDeomocode(t){if(t&&t.length<=6)return t;const e=this.partialCfDeomocode(t);if(e.length=0;r--)if(Math.pow(2,r)&this.OMOCODE_BITMAP){if(!!(e&Math.pow(2,s))!==isNaN(parseInt(i[r],10))){const t=i[r].toUpperCase();i[r]=$t[t]}s++}const r=i[15];if(r){const t=i.slice(0,s).join("");i[15]=this.appyCaseToChar(lt.checkDigit(t)||"",r)}return i.join("")}cfOmocodeId(t){const e=t.split("").filter(((t,e)=>Math.pow(2,e)&this.OMOCODE_BITMAP)).map((t=>/^[a-z]$/i.test(_t[t])?1:0)).join("");return parseInt(e,2)}cfToLastName(t){const e=null==t?void 0:t.substring(0,3);if("string"!=typeof t||3!==e.length||!new RegExp(`^(?:${g})`,"iu").test(e))return null;const i=t.substring(0,3),[r=""]=i.match(new RegExp(`^[${C}]{1,3}`,"ig"))||[],[s=""]=i.match(new RegExp(`[${R}]{1,3}`,"ig"))||[],n=r.length+s.length;if(n<2||n<3&&"X"!==i[2].toUpperCase())return null;switch(r.length){case 3:return(r+s).split("").join(this.JOLLY_CHAR)+this.JOLLY_CHAR;case 2:return`${r[0]}${s[0]}*${r[1]}${this.JOLLY_CHAR}`;case 1:return`${r[0]}${s}${this.JOLLY_CHAR}`;default:return`${s}${3===s.length?this.JOLLY_CHAR:""}`}}cfToFirstName(t){const e=null==t?void 0:t.substring(3,6);return"string"==typeof t&&3===(null==e?void 0:e.length)&&new RegExp(`^(${y})$`,"iu").test(e)?this.cfToLastName(e):null}cfToGender(t){if("string"!=typeof t||t.length<10)return null;const e=t.substring(9,10),i=10*parseInt(this.partialCfDeomocode(e,9),10);return At.getGender(i)}cfToBirthYear(t){if("string"!=typeof t||t.length<8)return null;const i=t.substring(6,8),r=parseInt(this.partialCfDeomocode(i,6),10);if(isNaN(r))return null;const s=parseInt(e().format("YY"),10),n=100*(r>s?1:0);return e().subtract(s-r+n,"years").year()}cfToBirthMonth(t){if("string"!=typeof t||t.length<9)return null;const e=t.substring(8,9).toUpperCase(),i=ut[e];return"number"!=typeof i||i<0||i>11?null:i}cfToBirthDay(t){if("string"!=typeof t||t.length<11)return null;const e=t.substring(9,11),i=parseInt(this.partialCfDeomocode(e,9),10);return isNaN(i)?null:At.getDay(i)}cfToBirthDate(t){const e=this.cfToBirthDay(t);if(!e)return null;const i=this.cfToBirthMonth(t);if("number"!=typeof i)return null;const r=this.cfToBirthYear(t);return p.ymdToDate(r,i,e)}cfToBirthPlace(t){return r(this,arguments,void 0,(function*(t,i=!0){if("string"!=typeof t||t.length<15)return null;const r=t.substring(11,15),s=this.partialCfDeomocode(r,11),n=yield this.belfioreConnector.findByCode(s);if(!n)return null;const{creationDate:a,expirationDate:o}=n;if((a||o)&&i){const i=this.cfToBirthDate(t),r=e(Et).add(5,"years").isBefore(i,"day");if(i&&r){if(!((!o||e(i).isBefore(o,"day"))&&(!a||e(i).isAfter(a,"day"))))return null}}return n}))}cfDecode(t){return r(this,void 0,void 0,(function*(){var e;const i=this.cfToBirthYear(t)||void 0,r=null!==(e=this.cfToBirthMonth(t))&&void 0!==e?e:void 0,s=this.cfToBirthDay(t)||void 0,n=p.ymdToDate(i,r,s)||void 0,a=yield this.cfToBirthPlace(t),o={firstName:this.cfToFirstName(t)||void 0,lastName:this.cfToLastName(t)||void 0,day:s,month:r,year:i,date:n,gender:this.cfToGender(t)||void 0,place:a||void 0,omocodeId:this.cfOmocodeId(t)};return i&&r&&s&&(o.date=new Date(Date.UTC(i,r,s))),o}))}lastNameToCf(t){if(!t||(t||"").trim().length<2)return null;if(!/^[A-Z ']{1,32}$/iu.test(_t.replace(t)))return null;const e=(this.charExtractor(t,C)+this.charExtractor(t,R)).padEnd(3,"X").substring(0,3);return e.length<3?null:e.toUpperCase()}firstNameToCf(t){if(!t||(t||"").trim().length<2)return null;const e=this.charExtractor(t,C);return e.length>=4?(e[0]+e.substring(2,4)).toUpperCase():this.lastNameToCf(t)}yearToCf(t){let e;return e="string"==typeof t?parseInt(t,10):t,"number"!=typeof e||isNaN(e)||!(e>=1900||e<100)?null:`0${e}`.substr(-2)}monthToCf(t){return t<0||t>11?null:ut[t]||null}dayGenderToCf(t,e){if(t<1||t>31)return null;const i=Tt[e];return"number"!=typeof i?null:`0${t+i}`.substr(-2)}yearMonthDayToDate(t,i=0,r=1){if(!t||t<1861||[i,r].some((t=>"number"!=typeof t)))return null;const s=e(Date.UTC(t,i||0,r||1));return s.isValid()&&s.year()===t&&s.month()===i&&s.date()===r?s.toDate():null}parsePlace(t){return r(this,void 0,void 0,(function*(){let e;return t?("object"==typeof t&&t.belfioreCode?e=yield this.belfioreConnector.findByCode(t.belfioreCode):"string"==typeof t&&(e=(yield this.belfioreConnector.findByCode(t))||(yield this.belfioreConnector.findByName(t))),e||null):null}))}dateGenderToCf(t,e){const i=p.parseDate(t);if(!i)return null;return`${this.yearToCf(i.getFullYear())}${this.monthToCf(i.getMonth())}${this.dayGenderToCf(i.getDate(),e)}`}placeToCf(t,e,i){return r(this,void 0,void 0,(function*(){const r=p.parseDate(t);let s,n;if(r||"string"!=typeof t){if(!e)return null;s=e,n=i}else s=t,n=e;let a=this.belfioreConnector;if(n&&(a=a.byProvince(n)),r&&a&&(a=a.from(r)),a){const t=yield new pt(a).parsePlace(s);if(t)return t.belfioreCode}return null}))}encodeCf(t){return r(this,arguments,void 0,(function*({lastName:t,firstName:e,year:i,month:s,day:n,date:a,gender:o,place:c,omocodeId:h=0}){const l=p.parseDate(a)||this.yearMonthDayToDate(i,s,n);if(!(l&&t&&e&&o&&c))return null;const d=[()=>r(this,void 0,void 0,(function*(){return this.lastNameToCf(t)})),()=>r(this,void 0,void 0,(function*(){return this.firstNameToCf(e)})),()=>r(this,void 0,void 0,(function*(){return this.dateGenderToCf(l,o)})),()=>r(this,void 0,void 0,(function*(){return yield this.placeToCf(l,(null==c?void 0:c.belfioreCode)||c)}))];let u="";for(const t of d){const e=yield t();if(!e)return null;u+=e}return this.cfOmocode(u,h)}))}checkBitmap(t){return!!(Math.pow(2,t)&this.OMOCODE_BITMAP)}charOmocode(t,e){return/^[A-Z]$/giu.test(t)&&this.checkBitmap(e)?$t[t.toUpperCase()]:t}charExtractor(t,e){const i=new RegExp(`[${e}]{1,24}`,"ig");return(_t.replace(t).trim().match(i)||[]).join("")}partialCfDeomocode(t,e=0){return t.replace(/[\dA-Z]/giu,((t,i)=>this.charOmocode(t,i+e)))}appyCaseToChar(t,e){if(t&&e){const i=e[0]===e[0].toUpperCase(),r=e[0]===e[0].toLowerCase();if(i&&!r)return t[0].toUpperCase();if(!i&&r)return t[0].toLowerCase()}return t[0]}}const Ct="Provided lastName is not valid, only letters, diacritics and apostrophe allowed",Rt="Provided name is not valid, only letters, diacritics and apostrophe allowed",mt="Provided day is not valid",Dt="Provided gender is not valid",vt="Provided day and/or gender are not valid",Nt="Provided year is not valid, only 2 or 4 digit numbers are allowed",Mt="Provided date is not valid";var Ot=Object.freeze({__proto__:null,INVALID_DATE:Mt,INVALID_DAY:mt,INVALID_DAY_OR_GENDER:vt,INVALID_GENDER:Dt,INVALID_NAME:Rt,INVALID_PLACE_NAME:"Proviced City/Country name is not valid",INVALID_SURNAME:Ct,INVALID_YEAR:Nt});class It extends Error{constructor(t){super((Object.entries(Ot).find((([e])=>e===t))||[])[1]||t)}}const St=new i;class yt{constructor(t){this.belfioreConnector=t,this.LETTER_SET=`[A-Z${St.matcherBy(/^[A-Z]$/iu)}]`,this.SEPARATOR_SET="(?:'?\\s{0,4})",this.parser=new pt(t)}cfLastName(t){let e=g;if(t){if(!this.lastName().test(t))throw new It(Ct);e=this.parser.lastNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfFirstName(t){let e=y;if(t){if(!this.lastName().test(t))throw new It(Rt);e=this.parser.firstNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfYear(t){let e=P;if(t){const i=this.parser.yearToCf(t);if(!i)throw new It(Nt);e=this.deomocode(i)}return this.isolatedInsensitiveTailor(e)}cfMonth(t){let e=b;return t&&(e=this.parser.monthToCf(t)||e),this.isolatedInsensitiveTailor(e)}cfDay(t){let e=G;if(t){const i=this.parser.dayGenderToCf(t,"M"),r=this.parser.dayGenderToCf(t,"F");if(!i||!r)throw new It(mt);e=`(?:${this.deomocode(i)})|(?:${this.deomocode(r)})`}return this.isolatedInsensitiveTailor(e)}cfDayGender(t,e){if(!e)return this.cfDay(t);let i;if(t){const r=this.parser.dayGenderToCf(t,e);if(!r)throw new It(vt);i=this.deomocode(r)}else switch(e){case"M":i=U;break;case"F":i=j;break;default:throw new It(Dt)}return this.isolatedInsensitiveTailor(i)}cfDateGender(t,e){if(t&&!p.parseDate(t))throw new It(Mt);if(e&&!At.toArray().includes(e))throw new It(Dt);let i=Z;if(t){const r=e&&this.parser.dateGenderToCf(t,e);if(r)i=this.deomocode(r);else{const e=e=>{const i=this.parser.dateGenderToCf(t,e);if(!i)throw new It(Mt);return i&&this.deomocode(i)};i=`(?:${At.toArray().map(e).join("|")})`}}else"M"===e?i=k:"F"===e&&(i=X);return this.isolatedInsensitiveTailor(i)}cfPlace(t,e){return r(this,void 0,void 0,(function*(){let i=z;if(t){const r=p.parseDate(t);if(r&&e){const t=e,s=yield this.parser.placeToCf(r,t);i=this.deomocode(s||"")}else if(!r&&"string"==typeof t){const e=t,r=yield this.parser.placeToCf(e);i=this.deomocode(r||"")}}return this.isolatedInsensitiveTailor(i)}))}codiceFiscale(t){return r(this,void 0,void 0,(function*(){let e=W;if(t){const i=yield this.parser.encodeCf(t);if(i)e=this.deomocode(i);else{const{lastName:i,firstName:s,year:n,month:a,day:o,date:c,gender:h,place:l}=t;if(i||s||n||a||o||c||h||l){let t=null;c?t=p.parseDate(c):n&&(t=this.parser.yearMonthDayToDate(n,a,o));const d=[()=>r(this,void 0,void 0,(function*(){return this.cfLastName(i)})),()=>r(this,void 0,void 0,(function*(){return this.cfFirstName(s)})),()=>r(this,void 0,void 0,(function*(){return this.cfDateGender(t,h)})),()=>r(this,void 0,void 0,(function*(){return yield this.cfPlace(t,(null==l?void 0:l.belfioreCode)||l)}))];e="";for(const t of d){const i=(yield t()).toString(),r=i.match(/\^(.{1,256})\$/),s=r&&r[1];if(!s)throw new Error(`Unable to handle [${i}]`);e+=`(?:${s})`}e+=K}}}return this.isolatedInsensitiveTailor(e)}))}lastName(t){let e=`${this.LETTER_SET}{1,24}`;if(t&&/^[A-Z]{1,3}/iu.test(t)){const i=t.substr(0,3),r=t=>t.split("").map((t=>`[${St.insensitiveMatcher[t]}]`)),[s,n]=[`^[${C}]{1,3}`,`[${R}]{1,3}`].map((t=>r((i.match(new RegExp(t,"ig"))||[])[0]||""))),a=`[${R+St.matcherBy(new RegExp(`^[${R}]$`,"ui"))}]`,o=`(?:${a}${this.SEPARATOR_SET}){0,24}`,c=`(?:${this.SEPARATOR_SET}${o}${a})?`;switch(s.length){case 3:{const t=o;e=t+s.join(`${this.SEPARATOR_SET}${t}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;break}case 2:e=`(?:${[`${n[0]}${o}${this.SEPARATOR_SET}${s[0]}${o}${s[1]}`,`${s[0]}${this.SEPARATOR_SET}`+n.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${o}${s[1]}`,s.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${n[0]}`].join("|")})${c}`;break;case 1:e=`(?:${[n.slice(0,2).join(`${this.SEPARATOR_SET}`)+o+s.join(`${this.SEPARATOR_SET}`),`${n[0]}${this.SEPARATOR_SET}`+s.join(`${this.SEPARATOR_SET}`)+n[1],[s[0],...n.slice(0,2)].join(`${this.SEPARATOR_SET}`)].join("|")})${c}`;break;default:e=`${n.join(`${this.SEPARATOR_SET}`)}${c}`}if((null==n?void 0:n.length)+(null==s?void 0:s.length)<3)return this.isolatedInsensitiveTailor(`\\s{0,4}(${e})\\s{0,4}`)}return this.isolatedInsensitiveTailor(`\\s{0,4}((?:${e})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\s{0,4}`)}firstName(t){if(t&&new RegExp(`^[A-Z]{3}[${C}]{3}`,"iu").test(t)){const e=((t.substr(3,3).match(new RegExp(`^[${C}]{1,3}`,"ig"))||[])[0]||"").split("").map((t=>`[${St.insensitiveMatcher[t]}]`)),[i,r]=[R,C].map((t=>t+St.matcherBy(new RegExp(`^[${t}]$`,"ui")))),s=`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}${e[0]}${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${r}]${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24})?`+e.slice(1,3).join(`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;return this.isolatedInsensitiveTailor(s)}return this.lastName((t||"").substr(3,3))}date(t){let i=E;if(t){const r=this.parser.cfToBirthDate(t);if(r){const t=r.toJSON();if(e().diff(e(r),"y")<50){const e=parseInt(t.substr(0,2),10);i=`(?:${[e-1,e].map((t=>t.toString().padStart(2,"0"))).join("|")})`+t.substr(2,8)}else i=t.substr(0,10)}}return this.isolatedInsensitiveTailor(`${i}(?:T${$}(?:${T})?)?`)}gender(t){const e=t&&this.parser.cfToGender(t)||`[${At.toArray().join("")}]`;return this.isolatedInsensitiveTailor(e)}place(t){return r(this,void 0,void 0,(function*(){let e=".{1,32}";const i=t&&(yield this.parser.cfToBirthPlace(t));if(i){e=`(?:(?:${i.name.replace(/./gu,(t=>St[t]===t?t:`[${t}${St[t]}]`))})|${i.belfioreCode})`}return this.isolatedInsensitiveTailor(e)}))}deomocode(t){return t.replace(/\d/gu,(t=>`[${t}${$t[t]}]`))}isolatedInsensitiveTailor(t){return new RegExp(`^(?:${t})$`,"iu")}}class gt{constructor(t,e){this.codiceFiscale=e,this.pattern=new yt(t),this.parser=new pt(t)}get hasLastName(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=3}get hasFirstName(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=6}get hasBirthYear(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=8}get hasBirthDate(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=11}get hasGender(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=10}get hasBirthPlace(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=15}get hasCRC(){var t;return(null===(t=this.codiceFiscale)||void 0===t?void 0:t.length)>=16}matchPersonalInfo(t){return r(this,void 0,void 0,(function*(){return(yield this.pattern.codiceFiscale(t)).test(this.codiceFiscale)}))}mismatchPersonalInfo(t){return r(this,void 0,void 0,(function*(){return!(!(this.codiceFiscale&&t&&t.lastName&&t.firstName&&(t.date||t.day&&t.month&&t.year)&&t.gender&&t.place)||(yield this.matchPersonalInfo(t)))}))}matchLastName(t){return this.hasLastName&&this.pattern.lastName(this.codiceFiscale).test(t||"")}mismatchLastName(t){return this.hasLastName&&!!t&&!this.matchLastName(t)}matchFirstName(t){return this.hasFirstName&&this.pattern.firstName(this.codiceFiscale).test(t||"")}mismatchFirstName(t){return this.hasFirstName&&!!t&&!this.matchFirstName(t)}matchBirthDate(t){if(this.hasBirthDate){const i=this.parser.cfToBirthDate(this.codiceFiscale),r=p.parseDate(t);if(i&&r)return e(i).isSame(r,"d")}return!1}mismatchBirthDate(t){return this.hasBirthYear&&!!p.parseDate(t)&&!this.matchBirthDate(t)}matchGender(t){return this.hasGender&&this.pattern.gender(this.codiceFiscale).test(t||"")}mismatchGender(t){return this.hasGender&&!!t&&!this.matchGender(t)}matchBirthPlace(t){return r(this,void 0,void 0,(function*(){if(this.hasBirthPlace&&t){const e=yield this.pattern.place(this.codiceFiscale),i=yield this.parser.parsePlace(t);return!!i&&e.test(null==i?void 0:i.belfioreCode)}return!1}))}mismatchBirthPlace(t){return r(this,void 0,void 0,(function*(){return this.hasBirthPlace&&!!t&&!(yield this.matchBirthPlace(t))}))}get errors(){return Promise.all([this.parser.cfToBirthPlace(this.codiceFiscale,!1),this.parser.cfToBirthPlace(this.codiceFiscale,!0)]).then((([t,e])=>{var i,r;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},this.parser.cfToLastName(this.codiceFiscale)?{}:{lastName:"MISSING_OR_INVALID_LAST_NAME"}),this.parser.cfToFirstName(this.codiceFiscale)?{}:{firstName:"MISSING_OR_INVALID_FIRST_NAME"}),this.parser.cfToBirthDate(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DATE"}),this.parser.cfToBirthDay(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DAY"}),this.parser.cfToBirthMonth(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_MONTH"}),this.parser.cfToBirthYear(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_YEAR"}),this.parser.cfToGender(this.codiceFiscale)?{}:{gender:"MISSING_DAY"}),t?{}:{place:"MISSING_OR_INVALID_PLACE"}),e?{}:{place:"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE",date:"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE"}),(null===(r=null===(i=this.codiceFiscale)||void 0===i?void 0:i.substring(s,16))||void 0===r?void 0:r.toUpperCase())===lt.checkDigit(this.codiceFiscale)?{}:{crc:"INVALID_CRC_CODE"}),this.hasCRC?{}:{crc:"MISSING_CRC_CODE"})})).then((t=>Object.keys(t).length?t:null))}get valid(){return Promise.all([this.pattern.codiceFiscale(),this.parser.cfToBirthPlace(this.codiceFiscale)]).then((([t,e])=>{var i,r;return!(!this.hasCRC||!t.test(this.codiceFiscale)||(null===(r=null===(i=this.codiceFiscale)||void 0===i?void 0:i.substring(s,16))||void 0===r?void 0:r.toUpperCase())!==lt.checkDigit(this.codiceFiscale)||!e)}))}get invalid(){return this.valid.then((t=>!!this.codiceFiscale&&!t))}}class Lt{constructor(t){this.belfioreConnector=t,this.parser=new pt(t),this.pattern=new yt(t)}codiceFiscale(t){return new gt(this.belfioreConnector,t)}isLastNameValid(t){return this.pattern.lastName().test(t)}isLastNameInvalid(t){return!!t&&!this.isLastNameValid(t)}isFirstNameValid(t){return this.pattern.firstName().test(t)}isFirstNameInvalid(t){return!!t&&!this.isFirstNameValid(t)}isBirthDateValid(t){return!!p.parseDate(t)}isBirthDateInvalid(t){return!!t&&!this.isBirthDateValid(t)}isGenderValid(t){return this.pattern.gender().test(t)}isGenderInvalid(t){return!!t&&!this.isGenderValid(t)}isBirthPlaceValid(t){return r(this,void 0,void 0,(function*(){const e=yield this.parser.parsePlace(t);return!!e&&!!(yield this.belfioreConnector.findByCode(e.belfioreCode))}))}isBirthPlaceInvalid(t){return r(this,void 0,void 0,(function*(){return!!t&&!(yield this.isBirthPlaceValid(t))}))}birthDatePlaceMatch(t,i){return r(this,void 0,void 0,(function*(){const r=yield this.parser.parsePlace(i);return this.isBirthDateValid(t)&&!!r&&(!!(yield this.belfioreConnector.from(t).findByCode(r.belfioreCode))||!e(p.parseDate(t)).isAfter(Et,"day"))}))}birthDatePlaceMismatch(t,e){return r(this,void 0,void 0,(function*(){const i=yield this.parser.parsePlace(e);return this.isBirthDateValid(t)&&!!i&&!(yield this.birthDatePlaceMatch(t,e))}))}birthPlaceDateMatch(t,e){return r(this,void 0,void 0,(function*(){return yield this.birthDatePlaceMatch(e,t)}))}birthPlaceDateMismatch(t,e){return r(this,void 0,void 0,(function*(){return yield this.birthDatePlaceMismatch(e,t)}))}}class Pt{constructor(t){this.belfioreConnector=t,this.validator=new Lt(t),this.parser=new pt(t),this.pattern=new yt(t)}}return t.BirthMonth=ut,t.CFMismatchValidator=gt,t.CRC=ht,t.CheckDigitizer=lt,t.CodiceFiscaleUtils=Pt,t.DATE_MATCHER=_,t.DateUtils=p,t.Gender=At,t.Matcher=ot,t.Omocodes=$t,t.Parser=pt,t.Pattern=yt,t.VALIDATOR=ot,t.Validator=Lt,t.default=Pt,Object.defineProperty(t,"__esModule",{value:!0}),t}({},dayjs,DiacriticRemover); //# sourceMappingURL=codice-fiscale-utils.bundle.min.js.map diff --git a/dist/codice-fiscale-utils.bundle.min.js.map b/dist/codice-fiscale-utils.bundle.min.js.map index 14ef16b..8ffd99b 100644 --- a/dist/codice-fiscale-utils.bundle.min.js.map +++ b/dist/codice-fiscale-utils.bundle.min.js.map @@ -1,421 +1 @@ -{ - "version": 3, - "file": "codice-fiscale-utils.bundle.min.js", - "sources": [ - "../src/const/cf-offsets.const.ts", - "../src/date-utils/date-matcher.const.ts", - "../src/date-utils/date-utils.class.ts", - "../src/const/matcher.const.ts", - "../src/enums/crc.enum.ts", - "../src/enums/birth-month.enum.ts", - "../src/classes/check-digitizer.class.ts", - "../src/functions/generator-wrapper.function.ts", - "../src/enums/gender-weight.enum.ts", - "../src/enums/omocodes.enum.ts", - "../src/classes/gender.class.ts", - "../src/const/logic.const.ts", - "../src/classes/parser.class.ts", - "../src/const/error-messages.const.ts", - "../src/classes/cfu-error.class.ts", - "../src/classes/pattern.class.ts", - "../src/classes/cf-mismatch-validator.class.ts", - "../src/classes/validator.class.ts", - "../src/index.ts" - ], - "sourcesContent": [ - "export const LASTNAME_OFFSET = 0;\r\nexport const LASTNAME_SIZE = 3;\r\nexport const FIRSTNAME_OFFSET = 3;\r\nexport const FIRSTNAME_SIZE = 3;\r\nexport const YEAR_OFFSET = 6;\r\nexport const YEAR_SIZE = 2;\r\nexport const MONTH_OFFSET = 8;\r\nexport const MONTH_SIZE = 1;\r\nexport const DAY_OFFSET = 9;\r\nexport const DAY_SIZE = 2;\r\nexport const DATE_OFFSET = YEAR_OFFSET;\r\nexport const DATE_SIZE = YEAR_SIZE + MONTH_SIZE + DAY_SIZE;\r\nexport const GENDER_OFFSET = DAY_OFFSET;\r\nexport const GENDER_SIZE = 1;\r\nexport const PLACE_OFFSET = 11;\r\nexport const PLACE_SIZE = 4;\r\nexport const CRC_OFFSET = 15;\r\nexport const CRC_SIZE = 1;\r\nexport const CF_SIZE =\r\n\tLASTNAME_SIZE + FIRSTNAME_SIZE + DATE_SIZE + PLACE_SIZE + CRC_SIZE;\r\n", - "const YEAR: string = \"[12][0-9]{3}\";\r\nconst MONTH: string = \"0[1-9]|1[0-2]\";\r\nconst DAY: string = \"0[1-9]|[12][0-9]|3[01]\";\r\nconst LEAP_MONTH: string = \"02\";\r\nconst DAYS_30_MONTHS: string = \"0[469]|11\";\r\nconst DAYS_31_MONTHS: string = \"0[13578]|1[02]\";\r\nconst MONTH_DAY: string = `(?:${MONTH})-(?:0[1-9]|[12]\\\\d)|(?:${DAYS_30_MONTHS})-30|(?:${DAYS_31_MONTHS})-3[01]`;\r\nconst HOURS: string = \"[01]\\\\d|2[0-3]\";\r\nconst MINUTES: string = \"[0-5]\\\\d\";\r\nconst SECONDS: string = MINUTES;\r\nconst MILLISECONDS: string = \"\\\\d{3}\";\r\nconst TIMEZONE: string = `Z|[-+](?:${HOURS})(?::?${MINUTES})?`;\r\nconst TIME: string = `(?:${HOURS})(?::${MINUTES}(?::${SECONDS}(\\\\.${MILLISECONDS})?)?(?:${TIMEZONE})?)?`;\r\nconst ISO8601_SHORT_DATE: string = `${YEAR}-(?:${MONTH_DAY})(?:T${TIME})?`;\r\nconst ISO8601_DATE_TIME: string = `${YEAR}(?:-(?:(?:${MONTH})|(?:${MONTH_DAY})(?:T${TIME})?))?`;\r\n\r\n/**\r\n * Date Matcher consts\r\n * @property {Object} DATE_VALIDATOR\r\n * @property {string} DATE_VALIDATOR.YEAR Matcher for ISO8601 4 digits year (limited to 1000-2999)\r\n * @property {string} DATE_VALIDATOR.MONTH Matcher for ISO8601 2 digits month (01-12)\r\n * @property {string} DATE_VALIDATOR.DAY Matcher for ISO8601 2 digits day (01-31)\r\n * @property {string} DATE_VALIDATOR.LEAP_MONTH Matcher for ISO8601 2 digits leap month\r\n * @property {string} DATE_VALIDATOR.DAYS_30_MONTHS Matcher for ISO8601 2 digits 30 days month\r\n * @property {string} DATE_VALIDATOR.DAYS_31_MONTHS Matcher for ISO8601 2 digits 31 days month\r\n * @property {string} DATE_VALIDATOR.MONTH_DAY Matcher for ISO8601 2 + 2 digits (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.ISO8601_SHORT_DATE Matcher for ISO8601 date: 4+2+2 digits year + (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.HOURS Matcher for ISO8601 2 digits hours (00-23)\r\n * @property {string} DATE_VALIDATOR.MINUTES Matcher for ISO8601 2 digits minutes (00-59)\r\n * @property {string} DATE_VALIDATOR.SECONDS Matcher for ISO8601 2 digits seconds (00-59)\r\n * @property {string} DATE_VALIDATOR.MILLISECONDS Matcher for ISO8601 3 digits milliseconds (000-999)\r\n * @property {string} DATE_VALIDATOR.TIMEZONE Matcher for ISO8601 timezone (Z or ±## or ±##:## or ±####)\r\n * @property {string} DATE_VALIDATOR.TIME Matcher for ISO8601 for time (T## , T##:## , T##:##:## , T##:##:##.###)\r\n * @property {string} DATE_VALIDATOR.ISO8601_DATE_TIME Matcher for ISO8601 date/time format\r\n */\r\nexport {\r\n\tDAY,\r\n\tDAYS_30_MONTHS,\r\n\tDAYS_31_MONTHS,\r\n\tHOURS,\r\n\tISO8601_DATE_TIME,\r\n\tISO8601_SHORT_DATE,\r\n\tLEAP_MONTH,\r\n\tMILLISECONDS,\r\n\tMINUTES,\r\n\tMONTH,\r\n\tMONTH_DAY,\r\n\tSECONDS,\r\n\tTIME,\r\n\tTIMEZONE,\r\n\tYEAR,\r\n};\r\n", - "import moment, { Moment } from \"moment\";\r\nimport type DateDay from \"./date-day.type\";\r\nimport { ISO8601_DATE_TIME } from \"./date-matcher.const\";\r\nimport type DateMonth from \"./date-month.type\";\r\nimport type MultiFormatDate from \"./multi-format-date.type\";\r\nexport default class DateUtils {\r\n\t/**\r\n\t * Parse a Dated and Gender information to create Date/Gender CF part\r\n\t * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @returns Parsed Date or null if not valid\r\n\t */\r\n\tpublic static parseDate(date?: MultiFormatDate | null): Date | null {\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\tdate instanceof Date ||\r\n\t\t\t\tdate instanceof moment ||\r\n\t\t\t\t(typeof date === \"string\" &&\r\n\t\t\t\t\tnew RegExp(`^(?:${ISO8601_DATE_TIME})$`).test(date)) ||\r\n\t\t\t\t(Array.isArray(date) &&\r\n\t\t\t\t\tdate.length &&\r\n\t\t\t\t\t!date.some((value) => typeof value !== \"number\" || isNaN(value)))\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tlet parsedDate: Moment;\r\n\t\t\tif (Array.isArray(date)) {\r\n\t\t\t\tconst [year, month = 0, day = 1] = date;\r\n\t\t\t\tif (month >= 0 && month <= 11 && day > 0 && day <= 31) {\r\n\t\t\t\t\tparsedDate = moment(Date.UTC(year, month || 0, day || 1));\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tparsedDate = moment(date);\r\n\t\t\t}\r\n\t\t\treturn parsedDate.isValid() ? parsedDate.toDate() : null;\r\n\t\t} catch (err) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static ymdToDate(\r\n\t\tyear?: number | null,\r\n\t\tmonth?: DateMonth | null,\r\n\t\tday?: DateDay | null\r\n\t): Date | null {\r\n\t\treturn this.parseDate([year, month, day] as number[]);\r\n\t}\r\n}\r\n", - "export const CONSONANT_LIST: string = \"B-DF-HJ-NP-TV-Z\";\r\nexport const VOWEL_LIST: string = \"AEIOU\";\r\nexport const OMOCODE_NUMBER_LIST: string = \"\\\\dLMNP-V\";\r\nexport const OMOCODE_NON_ZERO_NUMBER_LIST: string = \"1-9MNP-V\";\r\nexport const OMOCODE_ZERO_LIST: string = \"0L\";\r\nexport const MONTH_LIST: string = \"A-EHLMPR-T\";\r\nexport const MONTH_30DAYS_LIST: string = \"DHPS\";\r\nexport const MONTH_31DAYS_LIST: string = \"ACELMRT\";\r\nexport const CITY_CODE_LIST: string = \"A-M\";\r\nexport const COUNTRY_CODE_LIST: string = \"Z\";\r\n\r\nexport const CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}][${VOWEL_LIST}X]|[${VOWEL_LIST}]X{2}|[${CONSONANT_LIST}]{2}[A-Z]`;\r\nexport const CF_SURNAME_MATCHER: string = CF_NAME_MATCHER;\r\nexport const CF_FULL_NAME_MATCHER: string = `(?:${CF_NAME_MATCHER}){2}`;\r\n\r\nexport const YEAR_MATCHER: string = `[${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const LEAP_YEAR_MATCHER: string =\r\n\t\"[02468LNQSU][048LQU]|[13579MPRTV][26NS]\";\r\nexport const MONTH_MATCHER: string = `[${MONTH_LIST}]`;\r\nexport const DAY_2X_MATCHER: string = \"[26NS]\";\r\nexport const DAY_3X_MATCHER: string = \"[37PT]\";\r\nexport const DAY_29_MATCHER: string = `[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1256MNRS][${OMOCODE_NUMBER_LIST}]`;\r\nexport const DAY_30_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}]`;\r\nexport const DAY_31_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}1M]`;\r\n\r\nexport const DAY_MATCHER: string = `(?:${DAY_29_MATCHER}|${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MALE_DAY_MATCHER: string = `(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[12MN][${OMOCODE_NUMBER_LIST}]|[3P][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const FEMALE_DAY_MATCHER: string = `(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[56RS][${OMOCODE_NUMBER_LIST}]|[7T][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MONTH_DAY_MATCHER: string = `${MONTH_MATCHER}(?:${DAY_29_MATCHER})|[${MONTH_30DAYS_LIST}]${DAY_30_MATCHER}|[${MONTH_31DAYS_LIST}]${DAY_31_MATCHER}`;\r\nexport const FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[15MR][${OMOCODE_NUMBER_LIST}]|${DAY_2X_MATCHER}[0-8LMNP-U])|[${MONTH_30DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_2X_MATCHER}[9V])|(?:${LEAP_YEAR_MATCHER})B${DAY_2X_MATCHER}[9V]`;\r\nexport const MALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1M][${OMOCODE_NUMBER_LIST}]|[2N][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][2N][9V])|(?:${LEAP_YEAR_MATCHER})B[2N][9V]`;\r\nexport const FEMALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[5R][${OMOCODE_NUMBER_LIST}]|[6S][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][6S][9V])|(?:${LEAP_YEAR_MATCHER})B[6S][9V]`;\r\n\r\nexport const CITY_CODE_MATCHER: string = `[${CITY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}|[${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\nexport const COUNTRY_CODE_MATCHER: string = `${COUNTRY_CODE_LIST}[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const BELFIORE_CODE_MATCHER: string = `(?:[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2})|(?:[${CITY_CODE_LIST}][${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\n\r\nexport const CHECK_DIGIT: string = \"[A-Z]\";\r\n\r\nexport const CODICE_FISCALE: string = `${CF_FULL_NAME_MATCHER}(?:${FULL_DATE_MATCHER})(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}`;\r\n\r\nexport const PARTIAL_CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}]?|[${CONSONANT_LIST}]{1,2}`;\r\nexport const PARTIAL_CF_FULL_NAME: string = `(?:${PARTIAL_CF_NAME_MATCHER})|(?:(?:${CF_NAME_MATCHER})(?:${PARTIAL_CF_NAME_MATCHER})?)`;\r\nexport const PARTIAL_YEAR: string = `[${OMOCODE_NUMBER_LIST}]`;\r\nexport const PARTIAL_MONTH_DAY: string = `${MONTH_MATCHER}[${OMOCODE_ZERO_LIST}12456MNQRS]?|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}`;\r\nexport const PARTIAL_FULL_DATE: string = `${PARTIAL_YEAR}|(?:${YEAR_MATCHER}(?:${PARTIAL_MONTH_DAY})?)`;\r\nexport const PARTIAL_BELFIORE_CODE_MATCHER: string = `[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]?)?|[${COUNTRY_CODE_LIST}](?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NUMBER_LIST}]?)?`;\r\n\r\nexport const PARTIAL_CF: string = `${PARTIAL_CF_FULL_NAME}|(?:${CF_FULL_NAME_MATCHER}(?:(?:${PARTIAL_FULL_DATE})|(?:${FULL_DATE_MATCHER})(?:(?:${PARTIAL_BELFIORE_CODE_MATCHER})|(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}?)?)?)?`;\r\n", - "enum CRC {\r\n \"B\",\r\n \"A\",\r\n \"K\",\r\n \"P\",\r\n \"L\",\r\n \"C\",\r\n \"Q\",\r\n \"D\",\r\n \"R\",\r\n \"E\",\r\n \"V\",\r\n \"O\",\r\n \"S\",\r\n \"F\",\r\n \"T\",\r\n \"G\",\r\n \"U\",\r\n \"H\",\r\n \"M\",\r\n \"I\",\r\n \"N\",\r\n \"J\",\r\n \"W\",\r\n \"Z\",\r\n \"Y\",\r\n \"X\",\r\n}\r\n\r\nexport default CRC;\r\n", - "enum BirthMonth {\r\n\t\"A\",\r\n\t\"B\",\r\n\t\"C\",\r\n\t\"D\",\r\n\t\"E\",\r\n\t\"H\",\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"P\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n}\r\n\r\nexport default BirthMonth;\r\n", - "import { CRC_OFFSET, LASTNAME_OFFSET } from \"../const/cf-offsets.const\";\r\nimport { PARTIAL_CF } from \"../const/matcher.const\";\r\nimport CRC from \"../enums/crc.enum\";\r\nimport generatorWrapper from \"../functions/generator-wrapper.function\";\r\nimport type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nimport type CodiceFiscaleCRC from \"../types/codice-fiscale-crc.type\";\r\nclass CheckDigitizer {\r\n\t/**\r\n\t * Evaluate given partial CF to produce last check digit character\r\n\t * @param codiceFiscale Partial or complete Fiscal Code to evaluate to produce last character\r\n\t * @returns 16th CF char\r\n\t */\r\n\tpublic static checkDigit(codiceFiscale: string): CodiceFiscaleCRC | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale === \"string\" &&\r\n\t\t\tnew RegExp(PARTIAL_CF).test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst partialCF = codiceFiscale.substr(LASTNAME_OFFSET, CRC_OFFSET);\r\n\t\t\tlet partialCfValue = 0;\r\n\t\t\tfor (const charValue of this.evaluateChar(partialCF)) {\r\n\t\t\t\tpartialCfValue += charValue as number;\r\n\t\t\t}\r\n\t\t\treturn String.fromCharCode(\r\n\t\t\t\t(partialCfValue % this.CRC_MOD) + this.CHAR_OFFSET\r\n\t\t\t) as CodiceFiscaleCRC;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpublic static evaluateChar(\r\n\t\tpartialCF: string = \"\"\r\n\t): IGeneratorWrapper {\r\n\t\treturn generatorWrapper(this.evaluateCharGenerator(partialCF));\r\n\t}\r\n\r\n\tprivate static CHAR_OFFSET: number = 65;\r\n\tprivate static CRC_MOD: number = 26;\r\n\r\n\t/**\r\n\t * Partial FiscalCode Evaluator\r\n\t * @param Partial Fiscal Code to evaluate\r\n\t * @yields character value odd/even\r\n\t */\r\n\tprivate static *evaluateCharGenerator(partialCF: string = \"\"): Generator {\r\n\t\tif (typeof partialCF === \"string\" && partialCF.length) {\r\n\t\t\tfor (let index = 0; index < partialCF.length; index++) {\r\n\t\t\t\tlet char: string = partialCF[index].toUpperCase();\r\n\t\t\t\tconst isNumber: boolean = /^\\d$/u.test(char);\r\n\t\t\t\tif (isNumber) {\r\n\t\t\t\t\t// Numbers have always (odd/even) the same values of corresponding letters (0-9 => A-J)\r\n\t\t\t\t\tchar = String.fromCharCode(parseInt(char, 10) + this.CHAR_OFFSET);\r\n\t\t\t\t}\r\n\t\t\t\t// Odd/Even are shifted/swapped\r\n\t\t\t\t// array starts from 0, \"Agenzia delle Entrate\" documentation counts the string from 1\r\n\t\t\t\tconst isOdd: boolean = !(index % 2); // Odd according to documentation\r\n\t\t\t\tif (isOdd) {\r\n\t\t\t\t\t// Odd positions\r\n\t\t\t\t\tyield parseInt(CRC[char as any], 10);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Even positions\r\n\t\t\t\t\tyield char.charCodeAt(0) - this.CHAR_OFFSET;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\nexport default CheckDigitizer;\r\n", - "import type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nexport default function generatorWrapper<\r\n\tT = unknown,\r\n\tTReturn = any,\r\n\tTNext = unknown\r\n>(generator: Generator): IGeneratorWrapper {\r\n\tgenerator[Symbol.iterator] = () => generator;\r\n\treturn generator as IGeneratorWrapper;\r\n}\r\n", - "enum GenderWeight {\r\n\t\"M\" = 0,\r\n\t\"F\" = 40,\r\n}\r\n\r\nexport default GenderWeight;\r\n", - "enum Omocodes {\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"N\",\r\n\t\"P\",\r\n\t\"Q\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n\t\"U\",\r\n\t\"V\",\r\n}\r\n\r\nexport default Omocodes;\r\n", - "import { DateDay } from \"../date-utils/\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport type Genders from \"../types/genders.type\";\r\n\r\nclass Gender {\r\n\tpublic static getDay(genderDay: number): DateDay | null {\r\n\t\tconst plainDay = genderDay % GenderWeight.F;\r\n\t\treturn plainDay > 0 && plainDay <= this.MAX_MONTH_DAY\r\n\t\t\t? (plainDay as DateDay)\r\n\t\t\t: null;\r\n\t}\r\n\r\n\tpublic static getGender(genderDay: number): Genders | null {\r\n\t\treturn (\r\n\t\t\tthis.toArray().find(\r\n\t\t\t\t(gender) =>\r\n\t\t\t\t\tgenderDay >= GenderWeight[gender] &&\r\n\t\t\t\t\tgenderDay <= GenderWeight[gender] + this.MAX_MONTH_DAY\r\n\t\t\t) || null\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static genderizeDay(day: number, gender: Genders): number {\r\n\t\treturn day + GenderWeight[gender];\r\n\t}\r\n\r\n\tpublic static toArray(): Genders[] {\r\n\t\treturn [\"M\", \"F\"];\r\n\t}\r\n\r\n\tprivate static MAX_MONTH_DAY: number = 31;\r\n}\r\n\r\nexport default Gender;\r\n", - "export const CF_INTRODUCTION_DATE = new Date(\"1973-09-29\");\r\n", - "import {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport moment from \"moment\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDAY_OFFSET,\r\n\tDAY_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tMONTH_OFFSET,\r\n\tMONTH_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { CF_NAME_MATCHER, CF_SURNAME_MATCHER } from \"../const/matcher.const\";\r\nimport { CONSONANT_LIST, VOWEL_LIST } from \"../const/matcher.const\";\r\nimport { DateDay, DateMonth, DateUtils, MultiFormatDate } from \"../date-utils\";\r\nimport BirthMonth from \"../enums/birth-month.enum\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Gender from \"./gender.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Parser {\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {}\r\n\r\n\t/**\r\n\t * Default omocode bitmap\r\n\t */\r\n\tpublic OMOCODE_BITMAP: number = 0b0111011011000000;\r\n\r\n\t/**\r\n\t * Convert omocode CF into plain one\r\n\t * @param codiceFiscale Partial or complete Omocode/Regular CF to parse, starting from LastName\r\n\t * @returns Regular CF w/o omocodes chars\r\n\t */\r\n\tpublic cfDeomocode(codiceFiscale: string): string {\r\n\t\tif (codiceFiscale && codiceFiscale.length <= YEAR_OFFSET) {\r\n\t\t\treturn codiceFiscale;\r\n\t\t}\r\n\t\tconst deomocodedCf = this.partialCfDeomocode(codiceFiscale);\r\n\t\tif (deomocodedCf.length < CRC_OFFSET) {\r\n\t\t\treturn deomocodedCf;\r\n\t\t}\r\n\t\tconst partialDeomocodedCf = deomocodedCf.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tCRC_OFFSET\r\n\t\t);\r\n\t\treturn (\r\n\t\t\tpartialDeomocodedCf +\r\n\t\t\tthis.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(deomocodedCf) || \"\",\r\n\t\t\t\tdeomocodedCf.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic cfOmocode(codiceFiscale: string, omocodeId: number): string {\r\n\t\tif (!omocodeId) {\r\n\t\t\treturn this.cfDeomocode(codiceFiscale);\r\n\t\t}\r\n\t\tconst omocodedCf = codiceFiscale.split(\"\");\r\n\t\t// tslint:disable-next-line: prefer-for-of\r\n\t\tfor (let i = codiceFiscale.length - 1, o = 0; i >= 0; i--) {\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\tif ((2 ** i) & this.OMOCODE_BITMAP) {\r\n\t\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t\tconst charToEncode: boolean = !!(omocodeId & (2 ** o));\r\n\t\t\t\tconst isOmocode: boolean = isNaN(parseInt(omocodedCf[i], 10));\r\n\t\t\t\tif (charToEncode !== isOmocode) {\r\n\t\t\t\t\tconst char: any = omocodedCf[i].toUpperCase();\r\n\t\t\t\t\tomocodedCf[i] = Omocodes[char];\r\n\t\t\t\t}\r\n\t\t\t\to++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst crc = omocodedCf[CRC_OFFSET];\r\n\t\tif (crc) {\r\n\t\t\tconst partialCf = omocodedCf.slice(LASTNAME_OFFSET, CRC_OFFSET).join(\"\");\r\n\t\t\tomocodedCf[CRC_OFFSET] = this.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(partialCf) || \"\",\r\n\t\t\t\tcrc\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn omocodedCf.join(\"\");\r\n\t}\r\n\r\n\tpublic cfOmocodeId(codiceFiscale: string): number {\r\n\t\tconst cfOmocodeBitmap = codiceFiscale\r\n\t\t\t.split(\"\")\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t.filter((char, index) => (2 ** index) & this.OMOCODE_BITMAP)\r\n\t\t\t.map((char) => (/^[a-z]$/i.test(diacriticRemover[char]) ? 1 : 0))\r\n\t\t\t.join(\"\");\r\n\t\treturn parseInt(cfOmocodeBitmap, 2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible lastName\r\n\t */\r\n\tpublic cfToLastName(codiceFiscale: string): string | null {\r\n\t\tconst cfLastNamePart = codiceFiscale?.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfLastNamePart.length !== LASTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(?:${CF_SURNAME_MATCHER})`, \"iu\").test(cfLastNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst lastNameCf = codiceFiscale.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\r\n\t\tconst [cons = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) || [];\r\n\t\tconst [vow = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`[${VOWEL_LIST}]{1,3}`, \"ig\")) || [];\r\n\r\n\t\tconst matchingLength = cons.length + vow.length;\r\n\r\n\t\tif (\r\n\t\t\tmatchingLength < 2 ||\r\n\t\t\t(matchingLength < 3 && lastNameCf[2].toUpperCase() !== \"X\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (cons.length) {\r\n\t\t\tcase 3:\r\n\t\t\t\treturn (cons + vow).split(\"\").join(this.JOLLY_CHAR) + this.JOLLY_CHAR;\r\n\t\t\tcase 2:\r\n\t\t\t\treturn `${cons[0]}${vow[0]}*${cons[1]}${this.JOLLY_CHAR}`;\r\n\t\t\tcase 1:\r\n\t\t\t\treturn `${cons[0]}${vow}${this.JOLLY_CHAR}`;\r\n\t\t\tdefault:\r\n\t\t\t\treturn `${vow}${vow.length === 3 ? this.JOLLY_CHAR : \"\"}`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible firstName\r\n\t */\r\n\tpublic cfToFirstName(codiceFiscale: string): string | null {\r\n\t\tconst cfFirstNamePart = codiceFiscale?.substring(\r\n\t\t\tFIRSTNAME_OFFSET,\r\n\t\t\tFIRSTNAME_OFFSET + FIRSTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfFirstNamePart?.length !== FIRSTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(${CF_NAME_MATCHER})$`, \"iu\").test(cfFirstNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn this.cfToLastName(cfFirstNamePart);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse gender information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Male or female\r\n\t */\r\n\tpublic cfToGender(codiceFiscale: string): Genders | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < GENDER_OFFSET + GENDER_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfGenderPart = codiceFiscale.substring(\r\n\t\t\tGENDER_OFFSET,\r\n\t\t\tGENDER_OFFSET + GENDER_SIZE\r\n\t\t);\r\n\t\tconst genderInt =\r\n\t\t\tparseInt(this.partialCfDeomocode(cfGenderPart, GENDER_OFFSET), 10) * 10;\r\n\t\treturn Gender.getGender(genderInt);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth year information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Year (4 digits)\r\n\t */\r\n\tpublic cfToBirthYear(codiceFiscale: string): number | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < YEAR_OFFSET + YEAR_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfBirthYearPart = codiceFiscale.substring(\r\n\t\t\tYEAR_OFFSET,\r\n\t\t\tYEAR_OFFSET + YEAR_SIZE\r\n\t\t);\r\n\t\tconst birthYear: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthYearPart, YEAR_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthYear)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst current2DigitsYear: number = parseInt(moment().format(\"YY\"), 10);\r\n\r\n\t\tconst century: number = (birthYear > current2DigitsYear ? 1 : 0) * 100;\r\n\t\treturn moment()\r\n\t\t\t.subtract(current2DigitsYear - birthYear + century, \"years\")\r\n\t\t\t.year();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth month information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Month (0...11 - Date notation)\r\n\t */\r\n\tpublic cfToBirthMonth(codiceFiscale: string): DateMonth | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < MONTH_OFFSET + MONTH_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthMonthPart: any = codiceFiscale\r\n\t\t\t.substring(MONTH_OFFSET, MONTH_OFFSET + MONTH_SIZE)\r\n\t\t\t.toUpperCase();\r\n\t\tconst birthMonth = BirthMonth[cfBirthMonthPart];\r\n\t\tif (typeof birthMonth !== \"number\" || birthMonth < 0 || birthMonth > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn birthMonth as DateMonth;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth day information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth day (1..31)\r\n\t */\r\n\tpublic cfToBirthDay(codiceFiscale: string): DateDay | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < DAY_OFFSET + DAY_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthDayPart = codiceFiscale.substring(\r\n\t\t\tDAY_OFFSET,\r\n\t\t\tDAY_OFFSET + DAY_SIZE\r\n\t\t);\r\n\t\tconst birthDay: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthDayPart, DAY_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthDay)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn Gender.getDay(birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth date information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Date\r\n\t */\r\n\tpublic cfToBirthDate(codiceFiscale: string): Date | null {\r\n\t\tconst birthDay = this.cfToBirthDay(codiceFiscale);\r\n\t\tif (!birthDay) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthMonth = this.cfToBirthMonth(codiceFiscale);\r\n\t\tif (typeof birthMonth !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthYear = this.cfToBirthYear(codiceFiscale);\r\n\r\n\t\treturn DateUtils.ymdToDate(birthYear, birthMonth, birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth place information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @param checkBirthDateConsistency Ensure birthday is between creation and expiran date of the cf city or country, default value: true\r\n\t * @returns Birth place\r\n\t */\r\n\tpublic async cfToBirthPlace(\r\n\t\tcodiceFiscale: string,\r\n\t\tcheckBirthDateConsistency: boolean = true\r\n\t): Promise {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < PLACE_OFFSET + PLACE_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthPlacePart = codiceFiscale.substring(\r\n\t\t\tPLACE_OFFSET,\r\n\t\t\tPLACE_OFFSET + PLACE_SIZE\r\n\t\t);\r\n\t\tconst belfioreCode: string = this.partialCfDeomocode(\r\n\t\t\tcfBirthPlacePart,\r\n\t\t\tPLACE_OFFSET\r\n\t\t);\r\n\r\n\t\tconst birthPlace: BelfiorePlace | undefined | null =\r\n\t\t\tawait this.belfioreConnector.findByCode(belfioreCode);\r\n\t\tif (!birthPlace) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst { creationDate, expirationDate } = birthPlace;\r\n\t\tif ((creationDate || expirationDate) && checkBirthDateConsistency) {\r\n\t\t\tconst birthDate = this.cfToBirthDate(codiceFiscale);\r\n\t\t\tconst isBirthDateAfterCfIntroduction = moment(CF_INTRODUCTION_DATE)\r\n\t\t\t\t// Adding some tolerance\r\n\t\t\t\t.add(5, \"years\")\r\n\t\t\t\t.isBefore(birthDate, \"day\");\r\n\r\n\t\t\t// Skipping birthDate vs Creation/Expiration check for people born up to 5y after cf introduction\r\n\t\t\tif (birthDate && isBirthDateAfterCfIntroduction) {\r\n\t\t\t\tconst datePlaceConsistency =\r\n\t\t\t\t\t// BirthDay is before expiration date\r\n\t\t\t\t\t(!expirationDate ||\r\n\t\t\t\t\t\tmoment(birthDate).isBefore(expirationDate, \"day\")) &&\r\n\t\t\t\t\t// BirthDay is after creation date\r\n\t\t\t\t\t(!creationDate || moment(birthDate).isAfter(creationDate, \"day\"));\r\n\t\t\t\tif (!datePlaceConsistency) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn birthPlace;\r\n\t}\r\n\r\n\t/**\r\n\t * @param fiscalCode 16 character Codice Fiscale to decode\r\n\t * @returns Decoded CF Info\r\n\t */\r\n\tpublic async cfDecode(fiscalCode: string): Promise {\r\n\t\tconst year = this.cfToBirthYear(fiscalCode) || undefined;\r\n\t\t// 0 is a month\r\n\t\tconst month = this.cfToBirthMonth(fiscalCode) ?? undefined;\r\n\t\tconst day = this.cfToBirthDay(fiscalCode) || undefined;\r\n\t\tconst date = DateUtils.ymdToDate(year, month, day) || undefined;\r\n\t\tconst place = await this.cfToBirthPlace(fiscalCode);\r\n\t\tconst personalInfo: IPersonalInfo = {\r\n\t\t\tfirstName: this.cfToFirstName(fiscalCode) || undefined,\r\n\t\t\tlastName: this.cfToLastName(fiscalCode) || undefined,\r\n\r\n\t\t\tday,\r\n\t\t\tmonth,\r\n\t\t\tyear,\r\n\r\n\t\t\tdate,\r\n\r\n\t\t\tgender: this.cfToGender(fiscalCode) || undefined,\r\n\t\t\tplace: place || undefined,\r\n\r\n\t\t\tomocodeId: this.cfOmocodeId(fiscalCode),\r\n\t\t};\r\n\r\n\t\tif (year && month && day) {\r\n\t\t\tpersonalInfo.date = new Date(Date.UTC(year, month, day));\r\n\t\t}\r\n\r\n\t\treturn personalInfo;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName to cf part\r\n\t * @param lastName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic lastNameToCf(lastName?: string | null): string | null {\r\n\t\tif (!lastName || (lastName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (!/^[A-Z ']{1,32}$/iu.test(diacriticRemover.replace(lastName))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst consonants = this.charExtractor(lastName, CONSONANT_LIST);\r\n\t\tconst vowels = this.charExtractor(lastName, VOWEL_LIST);\r\n\r\n\t\tconst partialCf = (consonants + vowels).padEnd(3, \"X\").substring(0, 3);\r\n\r\n\t\tif (partialCf.length < 3) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn partialCf.toUpperCase();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName to cf part\r\n\t * @param firstName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic firstNameToCf(firstName?: string | null): string | null {\r\n\t\tif (!firstName || (firstName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst consonants = this.charExtractor(firstName, CONSONANT_LIST);\r\n\t\tif (consonants.length >= 4) {\r\n\t\t\treturn (consonants[0] + consonants.substring(2, 4)).toUpperCase();\r\n\t\t}\r\n\t\treturn this.lastNameToCf(firstName);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse year to cf part\r\n\t * @param year Birth year 2 or 4 digit string, number above 19XX or below 100\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic yearToCf(year: string | number): string | null {\r\n\t\tlet parsedYear: number;\r\n\t\tif (typeof year === \"string\") {\r\n\t\t\tparsedYear = parseInt(year, 10);\r\n\t\t} else {\r\n\t\t\tparsedYear = year;\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\ttypeof parsedYear === \"number\" &&\r\n\t\t\t\t!isNaN(parsedYear) &&\r\n\t\t\t\t(parsedYear >= 1900 || parsedYear < 100)\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${parsedYear}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse month information\r\n\t * @param month Month number 0..11\r\n\t * @returns Birth Month CF code\r\n\t */\r\n\tpublic monthToCf(month: DateMonth | number): string | null {\r\n\t\tif (month < 0 || month > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn BirthMonth[month] || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse day information\r\n\t * @param day Day number 1..31\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth Day CF code\r\n\t */\r\n\tpublic dayGenderToCf(day: DateDay | number, gender: Genders): string | null {\r\n\t\tif (day < 1 || day > 31) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst genderValue = GenderWeight[gender as any];\r\n\t\tif (typeof genderValue !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${day + genderValue}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Year, Month, Day to Dated\r\n\t * @param year 4 digits Year\r\n\t * @param month 1 or 2 digits Month 0..11\r\n\t * @param day 1,2 digits Day 1..31\r\n\t * @returns Date or null if provided year/month/day are not valid\r\n\t */\r\n\tpublic yearMonthDayToDate(\r\n\t\tyear: number | null | undefined,\r\n\t\tmonth: DateMonth | null | undefined = 0,\r\n\t\tday: DateDay | null | undefined = 1\r\n\t): Date | null {\r\n\t\tif (\r\n\t\t\t!year ||\r\n\t\t\tyear < 1861 ||\r\n\t\t\t[month, day].some((param) => typeof param !== \"number\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst date = moment(Date.UTC(year, month || 0, day || 1));\r\n\t\tif (\r\n\t\t\t!date.isValid() ||\r\n\t\t\tdate.year() !== year ||\r\n\t\t\tdate.month() !== month ||\r\n\t\t\tdate.date() !== day\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn date.toDate();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Place information to return city or country details\r\n\t * @param place Belfiore place instance, belfiore code or city/country name\r\n\t * @returns BelfiorePlace instance with the target city or country details\r\n\t */\r\n\tpublic async parsePlace(\r\n\t\tplace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tlet verifiedBirthPlace: BelfiorePlace | null | undefined;\r\n\t\tif (!place) {\r\n\t\t\treturn null;\r\n\t\t} else if (typeof place === \"object\" && place.belfioreCode) {\r\n\t\t\tverifiedBirthPlace = await this.belfioreConnector.findByCode(\r\n\t\t\t\tplace.belfioreCode\r\n\t\t\t);\r\n\t\t} else if (typeof place === \"string\") {\r\n\t\t\tverifiedBirthPlace =\r\n\t\t\t\t(await this.belfioreConnector.findByCode(place)) ||\r\n\t\t\t\t(await this.belfioreConnector.findByName(place));\r\n\t\t}\r\n\t\treturn verifiedBirthPlace || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Date and Gender information to create Date/Gender CF part\r\n\t * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth date and Gender CF code\r\n\t */\r\n\tpublic dateGenderToCf(date: MultiFormatDate, gender: Genders): string | null {\r\n\t\tconst parsedDate = DateUtils.parseDate(date);\r\n\t\tif (!parsedDate) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfYear = this.yearToCf(parsedDate.getFullYear());\r\n\t\tconst cfMonth = this.monthToCf(parsedDate.getMonth());\r\n\t\tconst cfDayGender = this.dayGenderToCf(parsedDate.getDate(), gender);\r\n\r\n\t\treturn `${cfYear}${cfMonth}${cfDayGender}`;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse place name and province to Belfiore code\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\t/**\r\n\t * Parse a Date and Gender information to create Date/Gender CF part\r\n\t * @param birthDate Date or Moment instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\tpublic async placeToCf(\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tdateOrName: MultiFormatDate,\r\n\t\tnameOrProvince?: string,\r\n\t\tprovinceId?: string\r\n\t): Promise {\r\n\t\tconst birthDate: Date | null = DateUtils.parseDate(dateOrName);\r\n\t\tlet name: string;\r\n\t\tlet province: string | undefined;\r\n\t\tif (!birthDate && typeof dateOrName === \"string\") {\r\n\t\t\tname = dateOrName;\r\n\t\t\tprovince = nameOrProvince;\r\n\t\t} else if (nameOrProvince) {\r\n\t\t\tname = nameOrProvince;\r\n\t\t\tprovince = provinceId;\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet placeFinder: IBelfioreConnector | undefined = this.belfioreConnector;\r\n\t\tif (province) {\r\n\t\t\tplaceFinder = placeFinder.byProvince(province);\r\n\t\t}\r\n\t\tif (birthDate && placeFinder) {\r\n\t\t\tplaceFinder = placeFinder.from(birthDate);\r\n\t\t}\r\n\t\tif (placeFinder) {\r\n\t\t\tconst foundPlace: BelfiorePlace | null = await new Parser(\r\n\t\t\t\tplaceFinder\r\n\t\t\t).parsePlace(name);\r\n\t\t\tif (foundPlace) {\r\n\t\t\t\treturn foundPlace.belfioreCode;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF\r\n\t * @returns Complete CF\r\n\t */\r\n\tpublic async encodeCf({\r\n\t\tlastName,\r\n\t\tfirstName,\r\n\r\n\t\tyear,\r\n\t\tmonth,\r\n\t\tday,\r\n\t\tdate,\r\n\r\n\t\tgender,\r\n\t\tplace,\r\n\r\n\t\tomocodeId = 0,\r\n\t}: Omit & {\r\n\t\tplace?: BelfiorePlace | string | undefined;\r\n\t}): Promise {\r\n\t\tconst dtParams =\r\n\t\t\tDateUtils.parseDate(date) || this.yearMonthDayToDate(year, month, day);\r\n\t\tif (!(dtParams && lastName && firstName && gender && place)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst generator = [\r\n\t\t\tasync () => this.lastNameToCf(lastName),\r\n\t\t\tasync () => this.firstNameToCf(firstName),\r\n\t\t\tasync () => this.dateGenderToCf(dtParams, gender),\r\n\t\t\tasync () =>\r\n\t\t\t\tawait this.placeToCf(\r\n\t\t\t\t\tdtParams,\r\n\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t),\r\n\t\t];\r\n\t\tlet cf = \"\";\r\n\t\tfor (const cfPartGenerator of generator) {\r\n\t\t\tconst cfValue = await cfPartGenerator();\r\n\t\t\tif (!cfValue) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tcf += cfValue;\r\n\t\t}\r\n\r\n\t\treturn this.cfOmocode(cf, omocodeId);\r\n\t}\r\n\r\n\tprivate JOLLY_CHAR: string = \"*\";\r\n\r\n\tprivate checkBitmap(offset: number): boolean {\r\n\t\t// tslint:disable-next-line: no-bitwise\r\n\t\treturn !!((2 ** offset) & this.OMOCODE_BITMAP);\r\n\t}\r\n\r\n\tprivate charOmocode(char: string, offset: number): string {\r\n\t\tif (/^[A-Z]$/giu.test(char) && this.checkBitmap(offset)) {\r\n\t\t\treturn Omocodes[char.toUpperCase() as any];\r\n\t\t}\r\n\r\n\t\treturn char;\r\n\t}\r\n\r\n\tprivate charExtractor(text: string, CHAR_LIST: string): string {\r\n\t\tconst charMatcher = new RegExp(`[${CHAR_LIST}]{1,24}`, \"ig\");\r\n\t\tconst diacriticFreeText = diacriticRemover.replace(text).trim();\r\n\t\tconst matchingChars = diacriticFreeText.match(charMatcher);\r\n\t\treturn (matchingChars || []).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Convert omocode full or chunk CF into plain one\r\n\t * @param partialCodiceFiscale Partial or complete Omocode/Regular CF to parse\r\n\t * @param offset starting point of the given chunk in the 16 char CF\r\n\t * @returns Regular version w/o omocodes chars of the given chunk\r\n\t */\r\n\tprivate partialCfDeomocode(\r\n\t\tpartialCodiceFiscale: string,\r\n\t\toffset: number = 0\r\n\t): string {\r\n\t\tconst charReplacer = (char: string, position: number) =>\r\n\t\t\tthis.charOmocode(char, position + offset);\r\n\t\treturn partialCodiceFiscale.replace(/[\\dA-Z]/giu, charReplacer);\r\n\t}\r\n\r\n\tprivate appyCaseToChar(targetChar: string, counterCaseChar: string): string {\r\n\t\tif (targetChar && counterCaseChar) {\r\n\t\t\tconst isUpperCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toUpperCase();\r\n\t\t\tconst isLowerCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toLowerCase();\r\n\r\n\t\t\tif (isUpperCase && !isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toUpperCase();\r\n\t\t\t} else if (!isUpperCase && isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toLowerCase();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn targetChar[0];\r\n\t}\r\n}\r\n", - "const INVALID_SURNAME: string =\r\n\t\"Provided lastName is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_NAME: string =\r\n\t\"Provided name is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_DAY: string = \"Provided day is not valid\";\r\nconst INVALID_GENDER: string = \"Provided gender is not valid\";\r\nconst INVALID_DAY_OR_GENDER: string =\r\n\t\"Provided day and/or gender are not valid\";\r\nconst INVALID_YEAR: string =\r\n\t\"Provided year is not valid, only 2 or 4 digit numbers are allowed\";\r\nconst INVALID_DATE: string = \"Provided date is not valid\";\r\nconst INVALID_PLACE_NAME: string = \"Proviced City/Country name is not valid\";\r\n\r\nexport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_PLACE_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n};\r\n", - "import * as ErrorMessages from \"../const/error-messages.const\";\r\n\r\nclass CfuError extends Error {\r\n constructor(errorMessage: string)\r\n constructor(errorCode: string) {\r\n super((Object.entries(ErrorMessages).find(([errId]) => errId === errorCode) || [])[1] || errorCode);\r\n }\r\n}\r\n\r\nexport default CfuError;\r\n", - "import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport moment from \"moment\";\r\nimport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n} from \"../const/error-messages.const\";\r\nimport {\r\n\tBELFIORE_CODE_MATCHER,\r\n\tCF_NAME_MATCHER,\r\n\tCF_SURNAME_MATCHER,\r\n\tCHECK_DIGIT,\r\n\tCODICE_FISCALE,\r\n\tCONSONANT_LIST,\r\n\tDAY_MATCHER,\r\n\tFEMALE_DAY_MATCHER,\r\n\tFEMALE_FULL_DATE_MATCHER,\r\n\tFULL_DATE_MATCHER,\r\n\tMALE_DAY_MATCHER,\r\n\tMALE_FULL_DATE_MATCHER,\r\n\tMONTH_MATCHER,\r\n\tVOWEL_LIST,\r\n\tYEAR_MATCHER,\r\n} from \"../const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tDateUtils,\r\n\tMultiFormatDate,\r\n} from \"../date-utils/\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CfuError from \"./cfu-error.class\";\r\nimport Gender from \"./gender.class\";\r\nimport Parser from \"./parser.class\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Pattern {\r\n\tprivate parser: Parser;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given lastName or generic\r\n\t * @param lastName Optional lastName to generate validation regexp\r\n\t * @return CF Surname matcher\r\n\t * @throw INVALID_SURNAME\r\n\t */\r\n\tpublic cfLastName(lastName?: string): RegExp {\r\n\t\tlet matcher: string = CF_SURNAME_MATCHER;\r\n\t\tif (lastName) {\r\n\t\t\tif (!this.lastName().test(lastName)) {\r\n\t\t\t\tthrow new CfuError(INVALID_SURNAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.lastNameToCf(lastName) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given name or generic\r\n\t * @param name Optional name to generate validation regexp\r\n\t * @return CF name matcher\r\n\t * @throw INVALID_NAME\r\n\t */\r\n\tpublic cfFirstName(name?: string): RegExp {\r\n\t\tlet matcher: string = CF_NAME_MATCHER;\r\n\t\tif (name) {\r\n\t\t\tif (!this.lastName().test(name)) {\r\n\t\t\t\tthrow new CfuError(INVALID_NAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.firstNameToCf(name) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param year Optional year to generate validation regexp\r\n\t * @return CF year matcher\r\n\t */\r\n\tpublic cfYear(year?: number): RegExp {\r\n\t\tlet matcher: string = YEAR_MATCHER;\r\n\t\tif (year) {\r\n\t\t\tconst parsedYear = this.parser.yearToCf(year);\r\n\t\t\tif (parsedYear) {\r\n\t\t\t\tmatcher = this.deomocode(parsedYear);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_YEAR);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given month or generic\r\n\t * @param month Optional month to generate validation regexp\r\n\t * @return CF month matcher\r\n\t */\r\n\tpublic cfMonth(month?: DateMonth) {\r\n\t\tlet matcher: string = MONTH_MATCHER;\r\n\t\tif (month) {\r\n\t\t\tmatcher = this.parser.monthToCf(month) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given day or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @return CF day matcher\r\n\t */\r\n\tpublic cfDay(day?: DateDay): RegExp {\r\n\t\tlet matcher = DAY_MATCHER;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayM = this.parser.dayGenderToCf(day, \"M\");\r\n\t\t\tconst parsedDayF = this.parser.dayGenderToCf(day, \"F\");\r\n\t\t\tif (parsedDayM && parsedDayF) {\r\n\t\t\t\tconst matcherM: string = this.deomocode(parsedDayM);\r\n\t\t\t\tconst matcherF: string = this.deomocode(parsedDayF);\r\n\t\t\t\tmatcher = `(?:${matcherM})|(?:${matcherF})`;\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @param gender Gender @see Genders\r\n\t * @return CF day and gender matcher\r\n\t */\r\n\tpublic cfDayGender(day?: DateDay, gender?: Genders): RegExp {\r\n\t\tif (!gender) {\r\n\t\t\treturn this.cfDay(day);\r\n\t\t}\r\n\t\tlet matcher;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayGender = this.parser.dayGenderToCf(day, gender);\r\n\t\t\tif (parsedDayGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDayGender);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY_OR_GENDER);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tswitch (gender) {\r\n\t\t\t\tcase \"M\":\r\n\t\t\t\t\tmatcher = MALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"F\":\r\n\t\t\t\t\tmatcher = FEMALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param gender @see Genders\r\n\t * @return CF date and gender matcher\r\n\t */\r\n\tpublic cfDateGender(\r\n\t\tdate?: MultiFormatDate | null,\r\n\t\tgender?: Genders | null\r\n\t): RegExp {\r\n\t\tif (date && !DateUtils.parseDate(date)) {\r\n\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t}\r\n\t\tif (gender && !Gender.toArray().includes(gender)) {\r\n\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t}\r\n\t\tlet matcher = FULL_DATE_MATCHER;\r\n\t\tif (date) {\r\n\t\t\tconst parsedDateGender =\r\n\t\t\t\tgender && this.parser.dateGenderToCf(date, gender);\r\n\t\t\tif (parsedDateGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDateGender);\r\n\t\t\t} else {\r\n\t\t\t\tconst parseDeomocode = (g: Genders): string => {\r\n\t\t\t\t\tconst parsedGender = this.parser.dateGenderToCf(date, g);\r\n\t\t\t\t\tif (!parsedGender) {\r\n\t\t\t\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn parsedGender && this.deomocode(parsedGender);\r\n\t\t\t\t};\r\n\t\t\t\tmatcher = `(?:${Gender.toArray().map(parseDeomocode).join(\"|\")})`;\r\n\t\t\t}\r\n\t\t} else if (gender === \"M\") {\r\n\t\t\tmatcher = MALE_FULL_DATE_MATCHER;\r\n\t\t} else if (gender === \"F\") {\r\n\t\t\tmatcher = FEMALE_FULL_DATE_MATCHER;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\t/**\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\tpublic async cfPlace(placeName?: string | null): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDate?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDateOrName?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise {\r\n\t\tlet matcher = BELFIORE_CODE_MATCHER;\r\n\t\tif (birthDateOrName) {\r\n\t\t\tconst birthDate: Date | null = DateUtils.parseDate(birthDateOrName);\r\n\r\n\t\t\tif (birthDate && placeName) {\r\n\t\t\t\tconst place: string = placeName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(birthDate, place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t} else if (!birthDate && typeof birthDateOrName === \"string\") {\r\n\t\t\t\tconst place: string = birthDateOrName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF validator based on given optional input or generic\r\n\t * @param personalInfo Input Object\r\n\t * @return CodiceFiscale matcher\r\n\t */\r\n\tpublic async codiceFiscale(\r\n\t\tpersonalInfo?: Omit & {\r\n\t\t\tplace?: BelfiorePlace | string | undefined;\r\n\t\t}\r\n\t): Promise {\r\n\t\tlet matcher = CODICE_FISCALE;\r\n\t\tif (personalInfo) {\r\n\t\t\tconst parsedCf = await this.parser.encodeCf(personalInfo);\r\n\r\n\t\t\tif (parsedCf) {\r\n\t\t\t\tmatcher = this.deomocode(parsedCf);\r\n\t\t\t} else {\r\n\t\t\t\tconst { lastName, firstName, year, month, day, date, gender, place } =\r\n\t\t\t\t\tpersonalInfo;\r\n\t\t\t\tif (\r\n\t\t\t\t\tlastName ||\r\n\t\t\t\t\tfirstName ||\r\n\t\t\t\t\tyear ||\r\n\t\t\t\t\tmonth ||\r\n\t\t\t\t\tday ||\r\n\t\t\t\t\tdate ||\r\n\t\t\t\t\tgender ||\r\n\t\t\t\t\tplace\r\n\t\t\t\t) {\r\n\t\t\t\t\tlet dtParams: Date | null = null;\r\n\t\t\t\t\tif (date) {\r\n\t\t\t\t\t\tdtParams = DateUtils.parseDate(date);\r\n\t\t\t\t\t} else if (year) {\r\n\t\t\t\t\t\tdtParams = this.parser.yearMonthDayToDate(year, month, day);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst generator: (() => Promise)[] = [\r\n\t\t\t\t\t\tasync () => this.cfLastName(lastName),\r\n\t\t\t\t\t\tasync () => this.cfFirstName(firstName),\r\n\t\t\t\t\t\tasync () => this.cfDateGender(dtParams, gender),\r\n\t\t\t\t\t\tasync () =>\r\n\t\t\t\t\t\t\tawait this.cfPlace(\r\n\t\t\t\t\t\t\t\tdtParams,\r\n\t\t\t\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t\t\t\t),\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\tmatcher = \"\";\r\n\t\t\t\t\tfor (const validator of generator) {\r\n\t\t\t\t\t\tconst cfMatcher = (await validator()).toString();\r\n\t\t\t\t\t\tconst match = cfMatcher.match(/\\^(.{1,256})\\$/);\r\n\t\t\t\t\t\tconst cfValue: string | null | undefined = match && match[1];\r\n\r\n\t\t\t\t\t\tif (!cfValue) {\r\n\t\t\t\t\t\t\tthrow new Error(`Unable to handle [${cfMatcher}]`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmatcher += `(?:${cfValue})`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Final addition of CheckDigit\r\n\t\t\t\t\tmatcher += CHECK_DIGIT;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tprivate LETTER_SET: string = `[A-Z${diacriticRemover.matcherBy(\r\n\t\t/^[A-Z]$/iu\r\n\t)}]`;\r\n\tprivate SEPARATOR_SET: string = \"(?:'?\\\\s{0,4})\";\r\n\r\n\t/**\r\n\t * Returns lastName validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic lastName(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = `${this.LETTER_SET}{1,24}`;\r\n\t\tif (codiceFiscale && /^[A-Z]{1,3}/iu.test(codiceFiscale)) {\r\n\t\t\tconst lastNameCf: string = codiceFiscale.substr(0, 3);\r\n\t\t\tconst diacriticizer = (matchingChars: string) =>\r\n\t\t\t\tmatchingChars\r\n\t\t\t\t\t.split(\"\")\r\n\t\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [cons, vow] = [\r\n\t\t\t\t`^[${CONSONANT_LIST}]{1,3}`,\r\n\t\t\t\t`[${VOWEL_LIST}]{1,3}`,\r\n\t\t\t].map((charMatcher) =>\r\n\t\t\t\tdiacriticizer(\r\n\t\t\t\t\t(lastNameCf.match(new RegExp(charMatcher, \"ig\")) || [])[0] || \"\"\r\n\t\t\t\t)\r\n\t\t\t);\r\n\r\n\t\t\tconst diacriticsVowelList: string =\r\n\t\t\t\tVOWEL_LIST +\r\n\t\t\t\tdiacriticRemover.matcherBy(new RegExp(`^[${VOWEL_LIST}]$`, \"ui\"));\r\n\t\t\tconst diacriticsVowelMatcher: string = `[${diacriticsVowelList}]`;\r\n\t\t\tconst midDiacriticVowelMatcher: string = `(?:${diacriticsVowelMatcher}${this.SEPARATOR_SET}){0,24}`;\r\n\t\t\tconst endingDiacritcVowelMatcher: string = `(?:${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${diacriticsVowelMatcher})?`;\r\n\t\t\tswitch (cons.length) {\r\n\t\t\t\tcase 3: {\r\n\t\t\t\t\tconst divider = midDiacriticVowelMatcher;\r\n\t\t\t\t\tmatcher =\r\n\t\t\t\t\t\tdivider +\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}${divider}`) +\r\n\t\t\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 2: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\t`${vow[0]}${midDiacriticVowelMatcher}${this.SEPARATOR_SET}${cons[0]}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\t`${cons[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tvow.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${vow[0]}`,\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 1: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\tvow.slice(0, 2).join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tmidDiacriticVowelMatcher +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t\t`${vow[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tvow[1],\r\n\t\t\t\t\t\t[cons[0], ...vow.slice(0, 2)].join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tmatcher = `${vow.join(\r\n\t\t\t\t\t\t`${this.SEPARATOR_SET}`\r\n\t\t\t\t\t)}${endingDiacritcVowelMatcher}`;\r\n\t\t\t}\r\n\r\n\t\t\tif (vow?.length + cons?.length < 3) {\r\n\t\t\t\treturn this.isolatedInsensitiveTailor(`\\\\s{0,4}(${matcher})\\\\s{0,4}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`\\\\s{0,4}((?:${matcher})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\\\s{0,4}`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns name validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic firstName(codiceFiscale?: string): RegExp {\r\n\t\tif (\r\n\t\t\tcodiceFiscale &&\r\n\t\t\tnew RegExp(`^[A-Z]{3}[${CONSONANT_LIST}]{3}`, \"iu\").test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst nameCf: string = codiceFiscale.substr(3, 3);\r\n\r\n\t\t\tconst cons: string[] = (\r\n\t\t\t\t(nameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) ||\r\n\t\t\t\t\t[])[0] || \"\"\r\n\t\t\t)\r\n\t\t\t\t.split(\"\")\r\n\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [diacriticsVowelList, diacriticsConsonantList]: string[] = [\r\n\t\t\t\tVOWEL_LIST,\r\n\t\t\t\tCONSONANT_LIST,\r\n\t\t\t].map(\r\n\t\t\t\t(chars) =>\r\n\t\t\t\t\tchars + diacriticRemover.matcherBy(new RegExp(`^[${chars}]$`, \"ui\"))\r\n\t\t\t);\r\n\r\n\t\t\tconst matcher: string =\r\n\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}${cons[0]}${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${diacriticsConsonantList}]${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24})?` +\r\n\t\t\t\tcons\r\n\t\t\t\t\t.slice(1, 3)\r\n\t\t\t\t\t.join(\r\n\t\t\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}`\r\n\t\t\t\t\t) +\r\n\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;\r\n\r\n\t\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t\t}\r\n\t\treturn this.lastName((codiceFiscale || \"\").substr(3, 3));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns iso8601 date validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic date(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = DATE_MATCHER.ISO8601_DATE_TIME;\r\n\t\tif (codiceFiscale) {\r\n\t\t\tconst parsedDate = this.parser.cfToBirthDate(codiceFiscale);\r\n\t\t\tif (parsedDate) {\r\n\t\t\t\tconst dateIso8601: string = parsedDate.toJSON();\r\n\t\t\t\tif (moment().diff(moment(parsedDate), \"y\") < 50) {\r\n\t\t\t\t\tconst century: number = parseInt(dateIso8601.substr(0, 2), 10);\r\n\t\t\t\t\tconst centuries: string[] = [century - 1, century].map((year) =>\r\n\t\t\t\t\t\tyear.toString().padStart(2, \"0\")\r\n\t\t\t\t\t);\r\n\t\t\t\t\tmatcher = `(?:${centuries.join(\"|\")})` + dateIso8601.substr(2, 8);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmatcher = dateIso8601.substr(0, 10);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`${matcher}(?:T${DATE_MATCHER.TIME}(?:${DATE_MATCHER.TIMEZONE})?)?`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns gender validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic gender(codiceFiscale?: string): RegExp {\r\n\t\tconst parsedGender = codiceFiscale && this.parser.cfToGender(codiceFiscale);\r\n\t\tconst matcher: string = parsedGender || `[${Gender.toArray().join(\"\")}]`;\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns place validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic async place(codiceFiscale?: string): Promise {\r\n\t\tlet matcher: string = \".{1,32}\";\r\n\t\tconst parsedPlace =\r\n\t\t\tcodiceFiscale && (await this.parser.cfToBirthPlace(codiceFiscale));\r\n\r\n\t\tif (parsedPlace) {\r\n\t\t\tconst nameMatcher: string = parsedPlace.name.replace(/./gu, (c) =>\r\n\t\t\t\tdiacriticRemover[c] === c ? c : `[${c}${diacriticRemover[c]}]`\r\n\t\t\t);\r\n\t\t\tmatcher = `(?:(?:${nameMatcher})|${parsedPlace.belfioreCode})`;\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tpublic deomocode(omocode: string): string {\r\n\t\treturn omocode.replace(/\\d/gu, (n: any) => `[${n}${Omocodes[n]}]`);\r\n\t}\r\n\r\n\tprivate isolatedInsensitiveTailor(matcher: string): RegExp {\r\n\t\treturn new RegExp(`^(?:${matcher})$`, \"iu\");\r\n\t}\r\n}\r\n", - "import moment from \"moment\";\r\nimport {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDATE_OFFSET,\r\n\tDATE_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport type IMismatchVerboseErrors from \"../interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport default class CFMismatchValidator {\r\n\tprivate pattern: Pattern;\r\n\tprivate parser: Parser;\r\n\tconstructor(\r\n\t\tbelfioreConnector: IBelfioreConnector,\r\n\t\tprivate readonly codiceFiscale: string\r\n\t) {\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\tprivate get hasLastName() {\r\n\t\treturn this.codiceFiscale?.length >= LASTNAME_OFFSET + LASTNAME_SIZE;\r\n\t}\r\n\r\n\tprivate get hasFirstName() {\r\n\t\treturn this.codiceFiscale?.length >= FIRSTNAME_OFFSET + FIRSTNAME_SIZE;\r\n\t}\r\n\tprivate get hasBirthYear() {\r\n\t\treturn this.codiceFiscale?.length >= YEAR_OFFSET + YEAR_SIZE;\r\n\t}\r\n\tprivate get hasBirthDate() {\r\n\t\treturn this.codiceFiscale?.length >= DATE_OFFSET + DATE_SIZE;\r\n\t}\r\n\tprivate get hasGender() {\r\n\t\treturn this.codiceFiscale?.length >= GENDER_OFFSET + GENDER_SIZE;\r\n\t}\r\n\tprivate get hasBirthPlace() {\r\n\t\treturn this.codiceFiscale?.length >= PLACE_OFFSET + PLACE_SIZE;\r\n\t}\r\n\r\n\tprivate get hasCRC() {\r\n\t\treturn this.codiceFiscale?.length >= CRC_OFFSET + CRC_SIZE;\r\n\t}\r\n\r\n\tpublic async matchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn (await this.pattern.codiceFiscale(personalInfo)).test(\r\n\t\t\tthis.codiceFiscale\r\n\t\t);\r\n\t}\r\n\tpublic async mismatchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn !!(\r\n\t\t\tthis.codiceFiscale &&\r\n\t\t\tpersonalInfo &&\r\n\t\t\tpersonalInfo.lastName &&\r\n\t\t\tpersonalInfo.firstName &&\r\n\t\t\t(personalInfo.date ||\r\n\t\t\t\t(personalInfo.day && personalInfo.month && personalInfo.year)) &&\r\n\t\t\tpersonalInfo.gender &&\r\n\t\t\tpersonalInfo.place &&\r\n\t\t\t!(await this.matchPersonalInfo(personalInfo))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchLastName(lastName?: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasLastName &&\r\n\t\t\tthis.pattern.lastName(this.codiceFiscale).test(lastName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchLastName(lastName?: string): boolean {\r\n\t\treturn this.hasLastName && !!lastName && !this.matchLastName(lastName);\r\n\t}\r\n\r\n\tpublic matchFirstName(firstName: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasFirstName &&\r\n\t\t\tthis.pattern.firstName(this.codiceFiscale).test(firstName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchFirstName(firstName: string): boolean {\r\n\t\treturn this.hasFirstName && !!firstName && !this.matchFirstName(firstName);\r\n\t}\r\n\r\n\tpublic matchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\tif (this.hasBirthDate) {\r\n\t\t\tconst parsedCfDate = this.parser.cfToBirthDate(this.codiceFiscale);\r\n\t\t\tconst parsedDate = DateUtils.parseDate(birthDate);\r\n\t\t\tif (parsedCfDate && parsedDate) {\r\n\t\t\t\treturn moment(parsedCfDate).isSame(parsedDate, \"d\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic mismatchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthYear &&\r\n\t\t\t!!DateUtils.parseDate(birthDate) &&\r\n\t\t\t!this.matchBirthDate(birthDate)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchGender(gender: Genders | string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasGender &&\r\n\t\t\tthis.pattern.gender(this.codiceFiscale).test(gender || \"\")\r\n\t\t);\r\n\t}\r\n\r\n\tpublic mismatchGender(gender: Genders | string): boolean {\r\n\t\treturn this.hasGender && !!gender && !this.matchGender(gender);\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async matchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tif (this.hasBirthPlace && birthPlace) {\r\n\t\t\tconst matcher = await this.pattern.place(this.codiceFiscale);\r\n\t\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\r\n\t\t\treturn !!parsedBirthPlace && matcher.test(parsedBirthPlace?.belfioreCode);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async mismatchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthPlace &&\r\n\t\t\t!!birthPlace &&\r\n\t\t\t!(await this.matchBirthPlace(birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @param codiceFiscale Complete CF to parse\r\n\t * @return Verbose errors\r\n\t */\r\n\tpublic get errors(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, false),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, true),\r\n\t\t])\r\n\t\t\t.then(([placeCheck, placeCreationExpirationCheck]) => ({\r\n\t\t\t\t// Checking lastName validity\r\n\t\t\t\t...(this.parser.cfToLastName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { lastName: \"MISSING_OR_INVALID_LAST_NAME\" }),\r\n\t\t\t\t// Checking firstName validity\r\n\t\t\t\t...(this.parser.cfToFirstName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { firstName: \"MISSING_OR_INVALID_FIRST_NAME\" }),\r\n\t\t\t\t// Checking Date validity\r\n\t\t\t\t...(this.parser.cfToBirthDate(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DATE\" }),\r\n\t\t\t\t// Checking Day validity\r\n\t\t\t\t...(this.parser.cfToBirthDay(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DAY\" }),\r\n\t\t\t\t// Checking Month validity\r\n\t\t\t\t...(this.parser.cfToBirthMonth(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_MONTH\" }),\r\n\t\t\t\t// Checking Year validity\r\n\t\t\t\t...(this.parser.cfToBirthYear(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_YEAR\" }),\r\n\t\t\t\t// Checking Gender validity\r\n\t\t\t\t...(this.parser.cfToGender(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { gender: \"MISSING_DAY\" }),\r\n\t\t\t\t// Checking Place validity\r\n\t\t\t\t...(placeCheck ? {} : { place: \"MISSING_OR_INVALID_PLACE\" }),\r\n\t\t\t\t// Checking Place Creation/Expiration vs Birthdate validity\r\n\t\t\t\t...(placeCreationExpirationCheck\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: {\r\n\t\t\t\t\t\t\tplace: \"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE\",\r\n\t\t\t\t\t\t\tdate: \"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE\",\r\n\t\t\t\t\t }),\r\n\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t...(this.codiceFiscale\r\n\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t?.toUpperCase() === CheckDigitizer.checkDigit(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { crc: \"INVALID_CRC_CODE\" }),\r\n\r\n\t\t\t\t// Checking length\r\n\t\t\t\t...(this.hasCRC ? {} : { crc: \"MISSING_CRC_CODE\" }),\r\n\t\t\t}))\r\n\t\t\t.then((errors) => (Object.keys(errors).length ? errors : null));\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic get valid(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.pattern.codiceFiscale(),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale),\r\n\t\t]).then(\r\n\t\t\t([cfPattern, cfToBirthPlace]) =>\r\n\t\t\t\t!(\r\n\t\t\t\t\t// Checking length\r\n\t\t\t\t\t(\r\n\t\t\t\t\t\t!this.hasCRC ||\r\n\t\t\t\t\t\t// Checking form validity\r\n\t\t\t\t\t\t!cfPattern.test(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t\t\tthis.codiceFiscale\r\n\t\t\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t\t\t?.toUpperCase() !==\r\n\t\t\t\t\t\t\tCheckDigitizer.checkDigit(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking Birth date/place validity\r\n\t\t\t\t\t\t!cfToBirthPlace\r\n\t\t\t\t\t)\r\n\t\t\t\t)\r\n\t\t);\r\n\t}\r\n\tpublic get invalid(): Promise {\r\n\t\treturn this.valid.then((isValid) => !!this.codiceFiscale && !isValid);\r\n\t}\r\n}\r\n", - "import {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport moment from \"moment\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CFMismatchValidator from \"./cf-mismatch-validator.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\n\r\nexport default class Validator {\r\n\tprivate parser: Parser;\r\n\tprivate pattern: Pattern;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n\r\n\tpublic codiceFiscale(codiceFiscale: string): CFMismatchValidator {\r\n\t\treturn new CFMismatchValidator(this.belfioreConnector, codiceFiscale);\r\n\t}\r\n\r\n\tpublic isLastNameValid(lastName: string): boolean {\r\n\t\treturn this.pattern.lastName().test(lastName);\r\n\t}\r\n\tpublic isLastNameInvalid(lastName: string): boolean {\r\n\t\treturn !!lastName && !this.isLastNameValid(lastName);\r\n\t}\r\n\r\n\tpublic isFirstNameValid(firstName: string): boolean {\r\n\t\treturn this.pattern.firstName().test(firstName);\r\n\t}\r\n\tpublic isFirstNameInvalid(firstName: string): boolean {\r\n\t\treturn !!firstName && !this.isFirstNameValid(firstName);\r\n\t}\r\n\r\n\tpublic isBirthDateValid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!DateUtils.parseDate(birthDate);\r\n\t}\r\n\tpublic isBirthDateInvalid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!birthDate && !this.isBirthDateValid(birthDate);\r\n\t}\r\n\r\n\tpublic isGenderValid(gender: Genders | string): boolean {\r\n\t\treturn this.pattern.gender().test(gender);\r\n\t}\r\n\tpublic isGenderInvalid(gender: Genders | string): boolean {\r\n\t\treturn !!gender && !this.isGenderValid(gender);\r\n\t}\r\n\r\n\tpublic async isBirthPlaceValid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\t!!parsedBirthPlace &&\r\n\t\t\t!!(await this.belfioreConnector.findByCode(parsedBirthPlace.belfioreCode))\r\n\t\t);\r\n\t}\r\n\tpublic async isBirthPlaceInvalid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn !!birthPlace && !(await this.isBirthPlaceValid(birthPlace));\r\n\t}\r\n\r\n\tpublic async birthDatePlaceMatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t(!!(await this.belfioreConnector\r\n\t\t\t\t.from(birthDate)\r\n\t\t\t\t.findByCode(parsedPlace.belfioreCode)) ||\r\n\t\t\t\t// Ignoring control for people born before CF introduction\r\n\t\t\t\tmoment(DateUtils.parseDate(birthDate)).isSameOrBefore(\r\n\t\t\t\t\tCF_INTRODUCTION_DATE,\r\n\t\t\t\t\t\"day\"\r\n\t\t\t\t))\r\n\t\t);\r\n\t}\r\n\tpublic async birthDatePlaceMismatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t!(await this.birthDatePlaceMatch(birthDate, birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMatch(birthDate, birthPlace);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMismatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMismatch(birthDate, birthPlace);\r\n\t}\r\n}\r\n", - "import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport CFMismatchValidator from \"./classes/cf-mismatch-validator.class\";\r\nimport CheckDigitizer from \"./classes/check-digitizer.class\";\r\nimport Gender from \"./classes/gender.class\";\r\nimport Parser from \"./classes/parser.class\";\r\nimport Pattern from \"./classes/pattern.class\";\r\nimport Validator from \"./classes/validator.class\";\r\nimport * as VALIDATOR from \"./const/matcher.const\";\r\nimport * as Matcher from \"./const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\ttype DateDay,\r\n\ttype DateMonth,\r\n\tDateUtils,\r\n\ttype MultiFormatDate,\r\n} from \"./date-utils/\";\r\nimport BirthMonth from \"./enums/birth-month.enum\";\r\nimport CRC from \"./enums/crc.enum\";\r\nimport Omocodes from \"./enums/omocodes.enum\";\r\nimport type Genders from \"./types/genders.type\";\r\nimport IMismatchVerboseErrors from \"./interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport type {\r\n\tBelfiorePlace,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tGenders,\r\n\tMultiFormatDate,\r\n\tIMismatchVerboseErrors,\r\n};\r\n\r\nexport default class CodiceFiscaleUtils {\r\n\tpublic readonly validator: Validator;\r\n\tpublic readonly parser: Parser;\r\n\tpublic readonly pattern: Pattern;\r\n\r\n\tconstructor(public readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.validator = new Validator(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n}\r\n\r\nexport {\r\n\tBirthMonth,\r\n\tCheckDigitizer,\r\n\tCRC,\r\n\tDATE_MATCHER,\r\n\tDateUtils,\r\n\tGender,\r\n\tOmocodes,\r\n\tVALIDATOR,\r\n\tMatcher,\r\n\tCFMismatchValidator,\r\n\tParser,\r\n\tPattern,\r\n\tValidator,\r\n\tCodiceFiscaleUtils,\r\n};\r\n" - ], - "names": [ - "CRC_OFFSET", - "YEAR", - "MONTH", - "DAYS_30_MONTHS", - "DAYS_31_MONTHS", - "MONTH_DAY", - "HOURS", - "MINUTES", - "SECONDS", - "MILLISECONDS", - "TIMEZONE", - "TIME", - "ISO8601_SHORT_DATE", - "ISO8601_DATE_TIME", - "DateUtils", - "parseDate", - "date", - "Date", - "moment", - "RegExp", - "test", - "Array", - "isArray", - "length", - "some", - "value", - "isNaN", - "parsedDate", - "year", - "month", - "day", - "UTC", - "isValid", - "toDate", - "err", - "ymdToDate", - "this", - "CONSONANT_LIST", - "VOWEL_LIST", - "OMOCODE_NUMBER_LIST", - "OMOCODE_NON_ZERO_NUMBER_LIST", - "OMOCODE_ZERO_LIST", - "MONTH_LIST", - "MONTH_30DAYS_LIST", - "MONTH_31DAYS_LIST", - "CITY_CODE_LIST", - "COUNTRY_CODE_LIST", - "CF_NAME_MATCHER", - "CF_SURNAME_MATCHER", - "CF_FULL_NAME_MATCHER", - "YEAR_MATCHER", - "LEAP_YEAR_MATCHER", - "MONTH_MATCHER", - "DAY_2X_MATCHER", - "DAY_3X_MATCHER", - "DAY_29_MATCHER", - "DAY_30_MATCHER", - "DAY_31_MATCHER", - "DAY_MATCHER", - "MALE_DAY_MATCHER", - "FEMALE_DAY_MATCHER", - "MONTH_DAY_MATCHER", - "FULL_DATE_MATCHER", - "MALE_FULL_DATE_MATCHER", - "FEMALE_FULL_DATE_MATCHER", - "CITY_CODE_MATCHER", - "COUNTRY_CODE_MATCHER", - "BELFIORE_CODE_MATCHER", - "CHECK_DIGIT", - "CODICE_FISCALE", - "PARTIAL_CF_NAME_MATCHER", - "PARTIAL_CF_FULL_NAME", - "PARTIAL_YEAR", - "PARTIAL_MONTH_DAY", - "PARTIAL_FULL_DATE", - "PARTIAL_BELFIORE_CODE_MATCHER", - "PARTIAL_CF", - "CRC", - "BirthMonth", - "CRC$1", - "CheckDigitizer", - "checkDigit", - "codiceFiscale", - "partialCF", - "substr", - "partialCfValue", - "charValue", - "evaluateChar", - "String", - "fromCharCode", - "CRC_MOD", - "CHAR_OFFSET", - "generator", - "evaluateCharGenerator", - "Symbol", - "iterator", - "index", - "char", - "toUpperCase", - "parseInt", - "charCodeAt", - "GenderWeight", - "BirthMonth$1", - "Omocodes", - "GenderWeight$1", - "Omocodes$1", - "Gender", - "getDay", - "genderDay", - "plainDay", - "F", - "MAX_MONTH_DAY", - "getGender", - "toArray", - "find", - "gender", - "genderizeDay", - "CF_INTRODUCTION_DATE", - "diacriticRemover", - "DiacriticRemover", - "Parser", - "constructor", - "belfioreConnector", - "OMOCODE_BITMAP", - "JOLLY_CHAR", - "cfDeomocode", - "deomocodedCf", - "partialCfDeomocode", - "substring", - "appyCaseToChar", - "cfOmocode", - "omocodeId", - "omocodedCf", - "split", - "i", - "o", - "Math", - "pow", - "crc", - "partialCf", - "slice", - "join", - "cfOmocodeId", - "cfOmocodeBitmap", - "filter", - "map", - "cfToLastName", - "cfLastNamePart", - "LASTNAME_OFFSET", - "lastNameCf", - "cons", - "match", - "vow", - "matchingLength", - "cfToFirstName", - "cfFirstNamePart", - "FIRSTNAME_OFFSET", - "cfToGender", - "GENDER_OFFSET", - "cfGenderPart", - "genderInt", - "cfToBirthYear", - "YEAR_OFFSET", - "cfBirthYearPart", - "birthYear", - "current2DigitsYear", - "format", - "century", - "subtract", - "cfToBirthMonth", - "MONTH_OFFSET", - "cfBirthMonthPart", - "birthMonth", - "cfToBirthDay", - "DAY_OFFSET", - "cfBirthDayPart", - "birthDay", - "cfToBirthDate", - "cfToBirthPlace", - "codiceFiscale_1", - "checkBirthDateConsistency", - "PLACE_OFFSET", - "cfBirthPlacePart", - "belfioreCode", - "birthPlace", - "findByCode", - "creationDate", - "expirationDate", - "birthDate", - "isBirthDateAfterCfIntroduction", - "add", - "isBefore", - "isAfter", - "cfDecode", - "fiscalCode", - "undefined", - "_a", - "place", - "personalInfo", - "firstName", - "lastName", - "lastNameToCf", - "trim", - "replace", - "charExtractor", - "padEnd", - "firstNameToCf", - "consonants", - "yearToCf", - "parsedYear", - "monthToCf", - "dayGenderToCf", - "genderValue", - "yearMonthDayToDate", - "param", - "parsePlace", - "verifiedBirthPlace", - "findByName", - "dateGenderToCf", - "getFullYear", - "getMonth", - "getDate", - "placeToCf", - "dateOrName", - "nameOrProvince", - "provinceId", - "name", - "province", - "placeFinder", - "byProvince", - "from", - "foundPlace", - "encodeCf", - "__awaiter", - "arguments", - "dtParams", - "cf", - "cfPartGenerator", - "cfValue", - "checkBitmap", - "offset", - "charOmocode", - "text", - "CHAR_LIST", - "charMatcher", - "partialCodiceFiscale", - "position", - "targetChar", - "counterCaseChar", - "isUpperCase", - "isLowerCase", - "toLowerCase", - "INVALID_SURNAME", - "INVALID_NAME", - "INVALID_DAY", - "INVALID_GENDER", - "INVALID_DAY_OR_GENDER", - "INVALID_YEAR", - "INVALID_DATE", - "CfuError", - "Error", - "errorCode", - "super", - "Object", - "entries", - "ErrorMessages", - "errId", - "Pattern", - "LETTER_SET", - "matcherBy", - "SEPARATOR_SET", - "parser", - "cfLastName", - "matcher", - "isolatedInsensitiveTailor", - "cfFirstName", - "cfYear", - "deomocode", - "cfMonth", - "cfDay", - "parsedDayM", - "parsedDayF", - "cfDayGender", - "parsedDayGender", - "cfDateGender", - "includes", - "parsedDateGender", - "parseDeomocode", - "g", - "parsedGender", - "cfPlace", - "birthDateOrName", - "placeName", - "parsedPlace", - "parsedCf", - "validator", - "cfMatcher", - "toString", - "diacriticizer", - "matchingChars", - "insensitiveMatcher", - "diacriticsVowelMatcher", - "midDiacriticVowelMatcher", - "endingDiacritcVowelMatcher", - "divider", - "diacriticsVowelList", - "diacriticsConsonantList", - "chars", - "DATE_MATCHER.ISO8601_DATE_TIME", - "dateIso8601", - "toJSON", - "diff", - "padStart", - "DATE_MATCHER.TIME", - "DATE_MATCHER.TIMEZONE", - "c", - "omocode", - "n", - "CFMismatchValidator", - "pattern", - "hasLastName", - "hasFirstName", - "hasBirthYear", - "hasBirthDate", - "DATE_OFFSET", - "hasGender", - "hasBirthPlace", - "hasCRC", - "matchPersonalInfo", - "mismatchPersonalInfo", - "matchLastName", - "mismatchLastName", - "matchFirstName", - "mismatchFirstName", - "matchBirthDate", - "parsedCfDate", - "isSame", - "mismatchBirthDate", - "matchGender", - "mismatchGender", - "matchBirthPlace", - "parsedBirthPlace", - "mismatchBirthPlace", - "errors", - "Promise", - "all", - "then", - "placeCheck", - "placeCreationExpirationCheck", - "assign", - "_b", - "keys", - "valid", - "cfPattern", - "invalid", - "Validator", - "isLastNameValid", - "isLastNameInvalid", - "isFirstNameValid", - "isFirstNameInvalid", - "isBirthDateValid", - "isBirthDateInvalid", - "isGenderValid", - "isGenderInvalid", - "isBirthPlaceValid", - "isBirthPlaceInvalid", - "birthDatePlaceMatch", - "isSameOrBefore", - "birthDatePlaceMismatch", - "birthPlaceDateMatch", - "birthPlaceDateMismatch", - "CodiceFiscaleUtils" - ], - "mappings": "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,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,EAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACH,CAAA,CAAA,CA3BD,CAAKA,CAAAA,CAAAA,CAAA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AAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAsB,CACtBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,+BACzBC,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACKC,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA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" -} +{"version":3,"file":"codice-fiscale-utils.bundle.min.js","sources":["../src/const/cf-offsets.const.ts","../src/date-utils/date-matcher.const.ts","../src/date-utils/date-utils.class.ts","../src/const/matcher.const.ts","../src/enums/crc.enum.ts","../src/enums/birth-month.enum.ts","../src/classes/check-digitizer.class.ts","../src/functions/generator-wrapper.function.ts","../src/enums/gender-weight.enum.ts","../src/enums/omocodes.enum.ts","../src/classes/gender.class.ts","../src/const/logic.const.ts","../src/classes/parser.class.ts","../src/const/error-messages.const.ts","../src/classes/cfu-error.class.ts","../src/classes/pattern.class.ts","../src/classes/cf-mismatch-validator.class.ts","../src/classes/validator.class.ts","../src/index.ts"],"sourcesContent":["export const LASTNAME_OFFSET = 0;\r\nexport const LASTNAME_SIZE = 3;\r\nexport const FIRSTNAME_OFFSET = 3;\r\nexport const FIRSTNAME_SIZE = 3;\r\nexport const YEAR_OFFSET = 6;\r\nexport const YEAR_SIZE = 2;\r\nexport const MONTH_OFFSET = 8;\r\nexport const MONTH_SIZE = 1;\r\nexport const DAY_OFFSET = 9;\r\nexport const DAY_SIZE = 2;\r\nexport const DATE_OFFSET = YEAR_OFFSET;\r\nexport const DATE_SIZE = YEAR_SIZE + MONTH_SIZE + DAY_SIZE;\r\nexport const GENDER_OFFSET = DAY_OFFSET;\r\nexport const GENDER_SIZE = 1;\r\nexport const PLACE_OFFSET = 11;\r\nexport const PLACE_SIZE = 4;\r\nexport const CRC_OFFSET = 15;\r\nexport const CRC_SIZE = 1;\r\nexport const CF_SIZE =\r\n\tLASTNAME_SIZE + FIRSTNAME_SIZE + DATE_SIZE + PLACE_SIZE + CRC_SIZE;\r\n","const YEAR: string = \"[12][0-9]{3}\";\r\nconst MONTH: string = \"0[1-9]|1[0-2]\";\r\nconst DAY: string = \"0[1-9]|[12][0-9]|3[01]\";\r\nconst LEAP_MONTH: string = \"02\";\r\nconst DAYS_30_MONTHS: string = \"0[469]|11\";\r\nconst DAYS_31_MONTHS: string = \"0[13578]|1[02]\";\r\nconst MONTH_DAY: string = `(?:${MONTH})-(?:0[1-9]|[12]\\\\d)|(?:${DAYS_30_MONTHS})-30|(?:${DAYS_31_MONTHS})-3[01]`;\r\nconst HOURS: string = \"[01]\\\\d|2[0-3]\";\r\nconst MINUTES: string = \"[0-5]\\\\d\";\r\nconst SECONDS: string = MINUTES;\r\nconst MILLISECONDS: string = \"\\\\d{3}\";\r\nconst TIMEZONE: string = `Z|[-+](?:${HOURS})(?::?${MINUTES})?`;\r\nconst TIME: string = `(?:${HOURS})(?::${MINUTES}(?::${SECONDS}(\\\\.${MILLISECONDS})?)?(?:${TIMEZONE})?)?`;\r\nconst ISO8601_SHORT_DATE: string = `${YEAR}-(?:${MONTH_DAY})(?:T${TIME})?`;\r\nconst ISO8601_DATE_TIME: string = `${YEAR}(?:-(?:(?:${MONTH})|(?:${MONTH_DAY})(?:T${TIME})?))?`;\r\n\r\n/**\r\n * Date Matcher consts\r\n * @property {Object} DATE_VALIDATOR\r\n * @property {string} DATE_VALIDATOR.YEAR Matcher for ISO8601 4 digits year (limited to 1000-2999)\r\n * @property {string} DATE_VALIDATOR.MONTH Matcher for ISO8601 2 digits month (01-12)\r\n * @property {string} DATE_VALIDATOR.DAY Matcher for ISO8601 2 digits day (01-31)\r\n * @property {string} DATE_VALIDATOR.LEAP_MONTH Matcher for ISO8601 2 digits leap month\r\n * @property {string} DATE_VALIDATOR.DAYS_30_MONTHS Matcher for ISO8601 2 digits 30 days month\r\n * @property {string} DATE_VALIDATOR.DAYS_31_MONTHS Matcher for ISO8601 2 digits 31 days month\r\n * @property {string} DATE_VALIDATOR.MONTH_DAY Matcher for ISO8601 2 + 2 digits (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.ISO8601_SHORT_DATE Matcher for ISO8601 date: 4+2+2 digits year + (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.HOURS Matcher for ISO8601 2 digits hours (00-23)\r\n * @property {string} DATE_VALIDATOR.MINUTES Matcher for ISO8601 2 digits minutes (00-59)\r\n * @property {string} DATE_VALIDATOR.SECONDS Matcher for ISO8601 2 digits seconds (00-59)\r\n * @property {string} DATE_VALIDATOR.MILLISECONDS Matcher for ISO8601 3 digits milliseconds (000-999)\r\n * @property {string} DATE_VALIDATOR.TIMEZONE Matcher for ISO8601 timezone (Z or ±## or ±##:## or ±####)\r\n * @property {string} DATE_VALIDATOR.TIME Matcher for ISO8601 for time (T## , T##:## , T##:##:## , T##:##:##.###)\r\n * @property {string} DATE_VALIDATOR.ISO8601_DATE_TIME Matcher for ISO8601 date/time format\r\n */\r\nexport {\r\n\tDAY,\r\n\tDAYS_30_MONTHS,\r\n\tDAYS_31_MONTHS,\r\n\tHOURS,\r\n\tISO8601_DATE_TIME,\r\n\tISO8601_SHORT_DATE,\r\n\tLEAP_MONTH,\r\n\tMILLISECONDS,\r\n\tMINUTES,\r\n\tMONTH,\r\n\tMONTH_DAY,\r\n\tSECONDS,\r\n\tTIME,\r\n\tTIMEZONE,\r\n\tYEAR,\r\n};\r\n","import dayjs, { Dayjs } from \"dayjs\";\r\nimport type DateDay from \"./date-day.type\";\r\nimport { ISO8601_DATE_TIME } from \"./date-matcher.const\";\r\nimport type DateMonth from \"./date-month.type\";\r\nimport type MultiFormatDate from \"./multi-format-date.type\";\r\nexport default class DateUtils {\r\n\t/**\r\n\t * Parse a Dated and Gender information to create Date/Gender CF part\r\n\t * @param date Date instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @returns Parsed Date or null if not valid\r\n\t */\r\n\tpublic static parseDate(date?: MultiFormatDate | null): Date | null {\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\tdate instanceof Date ||\r\n\t\t\t\t(typeof date === \"string\" &&\r\n\t\t\t\t\tnew RegExp(`^(?:${ISO8601_DATE_TIME})$`).test(date)) ||\r\n\t\t\t\t(Array.isArray(date) &&\r\n\t\t\t\t\tdate.length &&\r\n\t\t\t\t\t!date.some((value) => typeof value !== \"number\" || isNaN(value)))\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tlet parsedDate: Dayjs;\r\n\t\t\tif (Array.isArray(date)) {\r\n\t\t\t\tconst [year, month = 0, day = 1] = date;\r\n\t\t\t\tif (month >= 0 && month <= 11 && day > 0 && day <= 31) {\r\n\t\t\t\t\tparsedDate = dayjs(Date.UTC(year, month || 0, day || 1));\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tparsedDate = dayjs(date);\r\n\t\t\t}\r\n\t\t\treturn parsedDate.isValid() ? parsedDate.toDate() : null;\r\n\t\t} catch (err) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static ymdToDate(\r\n\t\tyear?: number | null,\r\n\t\tmonth?: DateMonth | null,\r\n\t\tday?: DateDay | null\r\n\t): Date | null {\r\n\t\treturn this.parseDate([year, month, day] as number[]);\r\n\t}\r\n}\r\n","export const CONSONANT_LIST: string = \"B-DF-HJ-NP-TV-Z\";\r\nexport const VOWEL_LIST: string = \"AEIOU\";\r\nexport const OMOCODE_NUMBER_LIST: string = \"\\\\dLMNP-V\";\r\nexport const OMOCODE_NON_ZERO_NUMBER_LIST: string = \"1-9MNP-V\";\r\nexport const OMOCODE_ZERO_LIST: string = \"0L\";\r\nexport const MONTH_LIST: string = \"A-EHLMPR-T\";\r\nexport const MONTH_30DAYS_LIST: string = \"DHPS\";\r\nexport const MONTH_31DAYS_LIST: string = \"ACELMRT\";\r\nexport const CITY_CODE_LIST: string = \"A-M\";\r\nexport const COUNTRY_CODE_LIST: string = \"Z\";\r\n\r\nexport const CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}][${VOWEL_LIST}X]|[${VOWEL_LIST}]X{2}|[${CONSONANT_LIST}]{2}[A-Z]`;\r\nexport const CF_SURNAME_MATCHER: string = CF_NAME_MATCHER;\r\nexport const CF_FULL_NAME_MATCHER: string = `(?:${CF_NAME_MATCHER}){2}`;\r\n\r\nexport const YEAR_MATCHER: string = `[${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const LEAP_YEAR_MATCHER: string =\r\n\t\"[02468LNQSU][048LQU]|[13579MPRTV][26NS]\";\r\nexport const MONTH_MATCHER: string = `[${MONTH_LIST}]`;\r\nexport const DAY_2X_MATCHER: string = \"[26NS]\";\r\nexport const DAY_3X_MATCHER: string = \"[37PT]\";\r\nexport const DAY_29_MATCHER: string = `[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1256MNRS][${OMOCODE_NUMBER_LIST}]`;\r\nexport const DAY_30_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}]`;\r\nexport const DAY_31_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}1M]`;\r\n\r\nexport const DAY_MATCHER: string = `(?:${DAY_29_MATCHER}|${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MALE_DAY_MATCHER: string = `(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[12MN][${OMOCODE_NUMBER_LIST}]|[3P][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const FEMALE_DAY_MATCHER: string = `(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[56RS][${OMOCODE_NUMBER_LIST}]|[7T][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MONTH_DAY_MATCHER: string = `${MONTH_MATCHER}(?:${DAY_29_MATCHER})|[${MONTH_30DAYS_LIST}]${DAY_30_MATCHER}|[${MONTH_31DAYS_LIST}]${DAY_31_MATCHER}`;\r\nexport const FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[15MR][${OMOCODE_NUMBER_LIST}]|${DAY_2X_MATCHER}[0-8LMNP-U])|[${MONTH_30DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_2X_MATCHER}[9V])|(?:${LEAP_YEAR_MATCHER})B${DAY_2X_MATCHER}[9V]`;\r\nexport const MALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1M][${OMOCODE_NUMBER_LIST}]|[2N][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][2N][9V])|(?:${LEAP_YEAR_MATCHER})B[2N][9V]`;\r\nexport const FEMALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[5R][${OMOCODE_NUMBER_LIST}]|[6S][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][6S][9V])|(?:${LEAP_YEAR_MATCHER})B[6S][9V]`;\r\n\r\nexport const CITY_CODE_MATCHER: string = `[${CITY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}|[${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\nexport const COUNTRY_CODE_MATCHER: string = `${COUNTRY_CODE_LIST}[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const BELFIORE_CODE_MATCHER: string = `(?:[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2})|(?:[${CITY_CODE_LIST}][${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\n\r\nexport const CHECK_DIGIT: string = \"[A-Z]\";\r\n\r\nexport const CODICE_FISCALE: string = `${CF_FULL_NAME_MATCHER}(?:${FULL_DATE_MATCHER})(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}`;\r\n\r\nexport const PARTIAL_CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}]?|[${CONSONANT_LIST}]{1,2}`;\r\nexport const PARTIAL_CF_FULL_NAME: string = `(?:${PARTIAL_CF_NAME_MATCHER})|(?:(?:${CF_NAME_MATCHER})(?:${PARTIAL_CF_NAME_MATCHER})?)`;\r\nexport const PARTIAL_YEAR: string = `[${OMOCODE_NUMBER_LIST}]`;\r\nexport const PARTIAL_MONTH_DAY: string = `${MONTH_MATCHER}[${OMOCODE_ZERO_LIST}12456MNQRS]?|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}`;\r\nexport const PARTIAL_FULL_DATE: string = `${PARTIAL_YEAR}|(?:${YEAR_MATCHER}(?:${PARTIAL_MONTH_DAY})?)`;\r\nexport const PARTIAL_BELFIORE_CODE_MATCHER: string = `[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]?)?|[${COUNTRY_CODE_LIST}](?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NUMBER_LIST}]?)?`;\r\n\r\nexport const PARTIAL_CF: string = `${PARTIAL_CF_FULL_NAME}|(?:${CF_FULL_NAME_MATCHER}(?:(?:${PARTIAL_FULL_DATE})|(?:${FULL_DATE_MATCHER})(?:(?:${PARTIAL_BELFIORE_CODE_MATCHER})|(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}?)?)?)?`;\r\n","enum CRC {\r\n \"B\",\r\n \"A\",\r\n \"K\",\r\n \"P\",\r\n \"L\",\r\n \"C\",\r\n \"Q\",\r\n \"D\",\r\n \"R\",\r\n \"E\",\r\n \"V\",\r\n \"O\",\r\n \"S\",\r\n \"F\",\r\n \"T\",\r\n \"G\",\r\n \"U\",\r\n \"H\",\r\n \"M\",\r\n \"I\",\r\n \"N\",\r\n \"J\",\r\n \"W\",\r\n \"Z\",\r\n \"Y\",\r\n \"X\",\r\n}\r\n\r\nexport default CRC;\r\n","enum BirthMonth {\r\n\t\"A\",\r\n\t\"B\",\r\n\t\"C\",\r\n\t\"D\",\r\n\t\"E\",\r\n\t\"H\",\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"P\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n}\r\n\r\nexport default BirthMonth;\r\n","import { CRC_OFFSET, LASTNAME_OFFSET } from \"../const/cf-offsets.const\";\r\nimport { PARTIAL_CF } from \"../const/matcher.const\";\r\nimport CRC from \"../enums/crc.enum\";\r\nimport generatorWrapper from \"../functions/generator-wrapper.function\";\r\nimport type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nimport type CodiceFiscaleCRC from \"../types/codice-fiscale-crc.type\";\r\nclass CheckDigitizer {\r\n\t/**\r\n\t * Evaluate given partial CF to produce last check digit character\r\n\t * @param codiceFiscale Partial or complete Fiscal Code to evaluate to produce last character\r\n\t * @returns 16th CF char\r\n\t */\r\n\tpublic static checkDigit(codiceFiscale: string): CodiceFiscaleCRC | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale === \"string\" &&\r\n\t\t\tnew RegExp(PARTIAL_CF).test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst partialCF = codiceFiscale.substr(LASTNAME_OFFSET, CRC_OFFSET);\r\n\t\t\tlet partialCfValue = 0;\r\n\t\t\tfor (const charValue of this.evaluateChar(partialCF)) {\r\n\t\t\t\tpartialCfValue += charValue as number;\r\n\t\t\t}\r\n\t\t\treturn String.fromCharCode(\r\n\t\t\t\t(partialCfValue % this.CRC_MOD) + this.CHAR_OFFSET\r\n\t\t\t) as CodiceFiscaleCRC;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpublic static evaluateChar(\r\n\t\tpartialCF: string = \"\"\r\n\t): IGeneratorWrapper {\r\n\t\treturn generatorWrapper(this.evaluateCharGenerator(partialCF));\r\n\t}\r\n\r\n\tprivate static CHAR_OFFSET: number = 65;\r\n\tprivate static CRC_MOD: number = 26;\r\n\r\n\t/**\r\n\t * Partial FiscalCode Evaluator\r\n\t * @param Partial Fiscal Code to evaluate\r\n\t * @yields character value odd/even\r\n\t */\r\n\tprivate static *evaluateCharGenerator(partialCF: string = \"\"): Generator {\r\n\t\tif (typeof partialCF === \"string\" && partialCF.length) {\r\n\t\t\tfor (let index = 0; index < partialCF.length; index++) {\r\n\t\t\t\tlet char: string = partialCF[index].toUpperCase();\r\n\t\t\t\tconst isNumber: boolean = /^\\d$/u.test(char);\r\n\t\t\t\tif (isNumber) {\r\n\t\t\t\t\t// Numbers have always (odd/even) the same values of corresponding letters (0-9 => A-J)\r\n\t\t\t\t\tchar = String.fromCharCode(parseInt(char, 10) + this.CHAR_OFFSET);\r\n\t\t\t\t}\r\n\t\t\t\t// Odd/Even are shifted/swapped\r\n\t\t\t\t// array starts from 0, \"Agenzia delle Entrate\" documentation counts the string from 1\r\n\t\t\t\tconst isOdd: boolean = !(index % 2); // Odd according to documentation\r\n\t\t\t\tif (isOdd) {\r\n\t\t\t\t\t// Odd positions\r\n\t\t\t\t\tyield parseInt(CRC[char as any], 10);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Even positions\r\n\t\t\t\t\tyield char.charCodeAt(0) - this.CHAR_OFFSET;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\nexport default CheckDigitizer;\r\n","import type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nexport default function generatorWrapper<\r\n\tT = unknown,\r\n\tTReturn = any,\r\n\tTNext = unknown\r\n>(generator: Generator): IGeneratorWrapper {\r\n\tgenerator[Symbol.iterator] = () => generator;\r\n\treturn generator as IGeneratorWrapper;\r\n}\r\n","enum GenderWeight {\r\n\t\"M\" = 0,\r\n\t\"F\" = 40,\r\n}\r\n\r\nexport default GenderWeight;\r\n","enum Omocodes {\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"N\",\r\n\t\"P\",\r\n\t\"Q\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n\t\"U\",\r\n\t\"V\",\r\n}\r\n\r\nexport default Omocodes;\r\n","import { DateDay } from \"../date-utils/\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport type Genders from \"../types/genders.type\";\r\n\r\nclass Gender {\r\n\tpublic static getDay(genderDay: number): DateDay | null {\r\n\t\tconst plainDay = genderDay % GenderWeight.F;\r\n\t\treturn plainDay > 0 && plainDay <= this.MAX_MONTH_DAY\r\n\t\t\t? (plainDay as DateDay)\r\n\t\t\t: null;\r\n\t}\r\n\r\n\tpublic static getGender(genderDay: number): Genders | null {\r\n\t\treturn (\r\n\t\t\tthis.toArray().find(\r\n\t\t\t\t(gender) =>\r\n\t\t\t\t\tgenderDay >= GenderWeight[gender] &&\r\n\t\t\t\t\tgenderDay <= GenderWeight[gender] + this.MAX_MONTH_DAY\r\n\t\t\t) || null\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static genderizeDay(day: number, gender: Genders): number {\r\n\t\treturn day + GenderWeight[gender];\r\n\t}\r\n\r\n\tpublic static toArray(): Genders[] {\r\n\t\treturn [\"M\", \"F\"];\r\n\t}\r\n\r\n\tprivate static MAX_MONTH_DAY: number = 31;\r\n}\r\n\r\nexport default Gender;\r\n","export const CF_INTRODUCTION_DATE = new Date(\"1973-09-29\");\r\n","import dayjs from \"dayjs\";\r\nimport {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDAY_OFFSET,\r\n\tDAY_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tMONTH_OFFSET,\r\n\tMONTH_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { CF_NAME_MATCHER, CF_SURNAME_MATCHER } from \"../const/matcher.const\";\r\nimport { CONSONANT_LIST, VOWEL_LIST } from \"../const/matcher.const\";\r\nimport { DateDay, DateMonth, DateUtils, MultiFormatDate } from \"../date-utils\";\r\nimport BirthMonth from \"../enums/birth-month.enum\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Gender from \"./gender.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Parser {\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {}\r\n\r\n\t/**\r\n\t * Default omocode bitmap\r\n\t */\r\n\tpublic OMOCODE_BITMAP: number = 0b0111011011000000;\r\n\r\n\t/**\r\n\t * Convert omocode CF into plain one\r\n\t * @param codiceFiscale Partial or complete Omocode/Regular CF to parse, starting from LastName\r\n\t * @returns Regular CF w/o omocodes chars\r\n\t */\r\n\tpublic cfDeomocode(codiceFiscale: string): string {\r\n\t\tif (codiceFiscale && codiceFiscale.length <= YEAR_OFFSET) {\r\n\t\t\treturn codiceFiscale;\r\n\t\t}\r\n\t\tconst deomocodedCf = this.partialCfDeomocode(codiceFiscale);\r\n\t\tif (deomocodedCf.length < CRC_OFFSET) {\r\n\t\t\treturn deomocodedCf;\r\n\t\t}\r\n\t\tconst partialDeomocodedCf = deomocodedCf.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tCRC_OFFSET\r\n\t\t);\r\n\t\treturn (\r\n\t\t\tpartialDeomocodedCf +\r\n\t\t\tthis.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(deomocodedCf) || \"\",\r\n\t\t\t\tdeomocodedCf.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic cfOmocode(codiceFiscale: string, omocodeId: number): string {\r\n\t\tif (!omocodeId) {\r\n\t\t\treturn this.cfDeomocode(codiceFiscale);\r\n\t\t}\r\n\t\tconst omocodedCf = codiceFiscale.split(\"\");\r\n\t\t// tslint:disable-next-line: prefer-for-of\r\n\t\tfor (let i = codiceFiscale.length - 1, o = 0; i >= 0; i--) {\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\tif ((2 ** i) & this.OMOCODE_BITMAP) {\r\n\t\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t\tconst charToEncode: boolean = !!(omocodeId & (2 ** o));\r\n\t\t\t\tconst isOmocode: boolean = isNaN(parseInt(omocodedCf[i], 10));\r\n\t\t\t\tif (charToEncode !== isOmocode) {\r\n\t\t\t\t\tconst char: any = omocodedCf[i].toUpperCase();\r\n\t\t\t\t\tomocodedCf[i] = Omocodes[char];\r\n\t\t\t\t}\r\n\t\t\t\to++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst crc = omocodedCf[CRC_OFFSET];\r\n\t\tif (crc) {\r\n\t\t\tconst partialCf = omocodedCf.slice(LASTNAME_OFFSET, CRC_OFFSET).join(\"\");\r\n\t\t\tomocodedCf[CRC_OFFSET] = this.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(partialCf) || \"\",\r\n\t\t\t\tcrc\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn omocodedCf.join(\"\");\r\n\t}\r\n\r\n\tpublic cfOmocodeId(codiceFiscale: string): number {\r\n\t\tconst cfOmocodeBitmap = codiceFiscale\r\n\t\t\t.split(\"\")\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t.filter((char, index) => (2 ** index) & this.OMOCODE_BITMAP)\r\n\t\t\t.map((char) => (/^[a-z]$/i.test(diacriticRemover[char]) ? 1 : 0))\r\n\t\t\t.join(\"\");\r\n\t\treturn parseInt(cfOmocodeBitmap, 2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible lastName\r\n\t */\r\n\tpublic cfToLastName(codiceFiscale: string): string | null {\r\n\t\tconst cfLastNamePart = codiceFiscale?.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfLastNamePart.length !== LASTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(?:${CF_SURNAME_MATCHER})`, \"iu\").test(cfLastNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst lastNameCf = codiceFiscale.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\r\n\t\tconst [cons = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) || [];\r\n\t\tconst [vow = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`[${VOWEL_LIST}]{1,3}`, \"ig\")) || [];\r\n\r\n\t\tconst matchingLength = cons.length + vow.length;\r\n\r\n\t\tif (\r\n\t\t\tmatchingLength < 2 ||\r\n\t\t\t(matchingLength < 3 && lastNameCf[2].toUpperCase() !== \"X\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (cons.length) {\r\n\t\t\tcase 3:\r\n\t\t\t\treturn (cons + vow).split(\"\").join(this.JOLLY_CHAR) + this.JOLLY_CHAR;\r\n\t\t\tcase 2:\r\n\t\t\t\treturn `${cons[0]}${vow[0]}*${cons[1]}${this.JOLLY_CHAR}`;\r\n\t\t\tcase 1:\r\n\t\t\t\treturn `${cons[0]}${vow}${this.JOLLY_CHAR}`;\r\n\t\t\tdefault:\r\n\t\t\t\treturn `${vow}${vow.length === 3 ? this.JOLLY_CHAR : \"\"}`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible firstName\r\n\t */\r\n\tpublic cfToFirstName(codiceFiscale: string): string | null {\r\n\t\tconst cfFirstNamePart = codiceFiscale?.substring(\r\n\t\t\tFIRSTNAME_OFFSET,\r\n\t\t\tFIRSTNAME_OFFSET + FIRSTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfFirstNamePart?.length !== FIRSTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(${CF_NAME_MATCHER})$`, \"iu\").test(cfFirstNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn this.cfToLastName(cfFirstNamePart);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse gender information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Male or female\r\n\t */\r\n\tpublic cfToGender(codiceFiscale: string): Genders | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < GENDER_OFFSET + GENDER_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfGenderPart = codiceFiscale.substring(\r\n\t\t\tGENDER_OFFSET,\r\n\t\t\tGENDER_OFFSET + GENDER_SIZE\r\n\t\t);\r\n\t\tconst genderInt =\r\n\t\t\tparseInt(this.partialCfDeomocode(cfGenderPart, GENDER_OFFSET), 10) * 10;\r\n\t\treturn Gender.getGender(genderInt);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth year information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Year (4 digits)\r\n\t */\r\n\tpublic cfToBirthYear(codiceFiscale: string): number | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < YEAR_OFFSET + YEAR_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfBirthYearPart = codiceFiscale.substring(\r\n\t\t\tYEAR_OFFSET,\r\n\t\t\tYEAR_OFFSET + YEAR_SIZE\r\n\t\t);\r\n\t\tconst birthYear: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthYearPart, YEAR_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthYear)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst current2DigitsYear: number = parseInt(dayjs().format(\"YY\"), 10);\r\n\r\n\t\tconst century: number = (birthYear > current2DigitsYear ? 1 : 0) * 100;\r\n\t\treturn dayjs()\r\n\t\t\t.subtract(current2DigitsYear - birthYear + century, \"years\")\r\n\t\t\t.year();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth month information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Month (0...11 - Date notation)\r\n\t */\r\n\tpublic cfToBirthMonth(codiceFiscale: string): DateMonth | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < MONTH_OFFSET + MONTH_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthMonthPart: any = codiceFiscale\r\n\t\t\t.substring(MONTH_OFFSET, MONTH_OFFSET + MONTH_SIZE)\r\n\t\t\t.toUpperCase();\r\n\t\tconst birthMonth = BirthMonth[cfBirthMonthPart];\r\n\t\tif (typeof birthMonth !== \"number\" || birthMonth < 0 || birthMonth > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn birthMonth as DateMonth;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth day information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth day (1..31)\r\n\t */\r\n\tpublic cfToBirthDay(codiceFiscale: string): DateDay | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < DAY_OFFSET + DAY_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthDayPart = codiceFiscale.substring(\r\n\t\t\tDAY_OFFSET,\r\n\t\t\tDAY_OFFSET + DAY_SIZE\r\n\t\t);\r\n\t\tconst birthDay: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthDayPart, DAY_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthDay)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn Gender.getDay(birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth date information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Date\r\n\t */\r\n\tpublic cfToBirthDate(codiceFiscale: string): Date | null {\r\n\t\tconst birthDay = this.cfToBirthDay(codiceFiscale);\r\n\t\tif (!birthDay) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthMonth = this.cfToBirthMonth(codiceFiscale);\r\n\t\tif (typeof birthMonth !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthYear = this.cfToBirthYear(codiceFiscale);\r\n\r\n\t\treturn DateUtils.ymdToDate(birthYear, birthMonth, birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth place information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @param checkBirthDateConsistency Ensure birthday is between creation and expiran date of the cf city or country, default value: true\r\n\t * @returns Birth place\r\n\t */\r\n\tpublic async cfToBirthPlace(\r\n\t\tcodiceFiscale: string,\r\n\t\tcheckBirthDateConsistency: boolean = true\r\n\t): Promise {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < PLACE_OFFSET + PLACE_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthPlacePart = codiceFiscale.substring(\r\n\t\t\tPLACE_OFFSET,\r\n\t\t\tPLACE_OFFSET + PLACE_SIZE\r\n\t\t);\r\n\t\tconst belfioreCode: string = this.partialCfDeomocode(\r\n\t\t\tcfBirthPlacePart,\r\n\t\t\tPLACE_OFFSET\r\n\t\t);\r\n\r\n\t\tconst birthPlace: BelfiorePlace | undefined | null =\r\n\t\t\tawait this.belfioreConnector.findByCode(belfioreCode);\r\n\t\tif (!birthPlace) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst { creationDate, expirationDate } = birthPlace;\r\n\t\tif ((creationDate || expirationDate) && checkBirthDateConsistency) {\r\n\t\t\tconst birthDate = this.cfToBirthDate(codiceFiscale);\r\n\t\t\tconst isBirthDateAfterCfIntroduction = dayjs(CF_INTRODUCTION_DATE)\r\n\t\t\t\t// Adding some tolerance\r\n\t\t\t\t.add(5, \"years\")\r\n\t\t\t\t.isBefore(birthDate, \"day\");\r\n\r\n\t\t\t// Skipping birthDate vs Creation/Expiration check for people born up to 5y after cf introduction\r\n\t\t\tif (birthDate && isBirthDateAfterCfIntroduction) {\r\n\t\t\t\tconst datePlaceConsistency =\r\n\t\t\t\t\t// BirthDay is before expiration date\r\n\t\t\t\t\t(!expirationDate ||\r\n\t\t\t\t\t\tdayjs(birthDate).isBefore(expirationDate, \"day\")) &&\r\n\t\t\t\t\t// BirthDay is after creation date\r\n\t\t\t\t\t(!creationDate || dayjs(birthDate).isAfter(creationDate, \"day\"));\r\n\t\t\t\tif (!datePlaceConsistency) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn birthPlace;\r\n\t}\r\n\r\n\t/**\r\n\t * @param fiscalCode 16 character Codice Fiscale to decode\r\n\t * @returns Decoded CF Info\r\n\t */\r\n\tpublic async cfDecode(fiscalCode: string): Promise {\r\n\t\tconst year = this.cfToBirthYear(fiscalCode) || undefined;\r\n\t\t// 0 is a month\r\n\t\tconst month = this.cfToBirthMonth(fiscalCode) ?? undefined;\r\n\t\tconst day = this.cfToBirthDay(fiscalCode) || undefined;\r\n\t\tconst date = DateUtils.ymdToDate(year, month, day) || undefined;\r\n\t\tconst place = await this.cfToBirthPlace(fiscalCode);\r\n\t\tconst personalInfo: IPersonalInfo = {\r\n\t\t\tfirstName: this.cfToFirstName(fiscalCode) || undefined,\r\n\t\t\tlastName: this.cfToLastName(fiscalCode) || undefined,\r\n\r\n\t\t\tday,\r\n\t\t\tmonth,\r\n\t\t\tyear,\r\n\r\n\t\t\tdate,\r\n\r\n\t\t\tgender: this.cfToGender(fiscalCode) || undefined,\r\n\t\t\tplace: place || undefined,\r\n\r\n\t\t\tomocodeId: this.cfOmocodeId(fiscalCode),\r\n\t\t};\r\n\r\n\t\tif (year && month && day) {\r\n\t\t\tpersonalInfo.date = new Date(Date.UTC(year, month, day));\r\n\t\t}\r\n\r\n\t\treturn personalInfo;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName to cf part\r\n\t * @param lastName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic lastNameToCf(lastName?: string | null): string | null {\r\n\t\tif (!lastName || (lastName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (!/^[A-Z ']{1,32}$/iu.test(diacriticRemover.replace(lastName))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst consonants = this.charExtractor(lastName, CONSONANT_LIST);\r\n\t\tconst vowels = this.charExtractor(lastName, VOWEL_LIST);\r\n\r\n\t\tconst partialCf = (consonants + vowels).padEnd(3, \"X\").substring(0, 3);\r\n\r\n\t\tif (partialCf.length < 3) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn partialCf.toUpperCase();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName to cf part\r\n\t * @param firstName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic firstNameToCf(firstName?: string | null): string | null {\r\n\t\tif (!firstName || (firstName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst consonants = this.charExtractor(firstName, CONSONANT_LIST);\r\n\t\tif (consonants.length >= 4) {\r\n\t\t\treturn (consonants[0] + consonants.substring(2, 4)).toUpperCase();\r\n\t\t}\r\n\t\treturn this.lastNameToCf(firstName);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse year to cf part\r\n\t * @param year Birth year 2 or 4 digit string, number above 19XX or below 100\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic yearToCf(year: string | number): string | null {\r\n\t\tlet parsedYear: number;\r\n\t\tif (typeof year === \"string\") {\r\n\t\t\tparsedYear = parseInt(year, 10);\r\n\t\t} else {\r\n\t\t\tparsedYear = year;\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\ttypeof parsedYear === \"number\" &&\r\n\t\t\t\t!isNaN(parsedYear) &&\r\n\t\t\t\t(parsedYear >= 1900 || parsedYear < 100)\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${parsedYear}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse month information\r\n\t * @param month Month number 0..11\r\n\t * @returns Birth Month CF code\r\n\t */\r\n\tpublic monthToCf(month: DateMonth | number): string | null {\r\n\t\tif (month < 0 || month > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn BirthMonth[month] || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse day information\r\n\t * @param day Day number 1..31\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth Day CF code\r\n\t */\r\n\tpublic dayGenderToCf(day: DateDay | number, gender: Genders): string | null {\r\n\t\tif (day < 1 || day > 31) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst genderValue = GenderWeight[gender as any];\r\n\t\tif (typeof genderValue !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${day + genderValue}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Year, Month, Day to Dated\r\n\t * @param year 4 digits Year\r\n\t * @param month 1 or 2 digits Month 0..11\r\n\t * @param day 1,2 digits Day 1..31\r\n\t * @returns Date or null if provided year/month/day are not valid\r\n\t */\r\n\tpublic yearMonthDayToDate(\r\n\t\tyear: number | null | undefined,\r\n\t\tmonth: DateMonth | null | undefined = 0,\r\n\t\tday: DateDay | null | undefined = 1\r\n\t): Date | null {\r\n\t\tif (\r\n\t\t\t!year ||\r\n\t\t\tyear < 1861 ||\r\n\t\t\t[month, day].some((param) => typeof param !== \"number\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst date = dayjs(Date.UTC(year, month || 0, day || 1));\r\n\t\tif (\r\n\t\t\t!date.isValid() ||\r\n\t\t\tdate.year() !== year ||\r\n\t\t\tdate.month() !== month ||\r\n\t\t\tdate.date() !== day\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn date.toDate();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Place information to return city or country details\r\n\t * @param place Belfiore place instance, belfiore code or city/country name\r\n\t * @returns BelfiorePlace instance with the target city or country details\r\n\t */\r\n\tpublic async parsePlace(\r\n\t\tplace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tlet verifiedBirthPlace: BelfiorePlace | null | undefined;\r\n\t\tif (!place) {\r\n\t\t\treturn null;\r\n\t\t} else if (typeof place === \"object\" && place.belfioreCode) {\r\n\t\t\tverifiedBirthPlace = await this.belfioreConnector.findByCode(\r\n\t\t\t\tplace.belfioreCode\r\n\t\t\t);\r\n\t\t} else if (typeof place === \"string\") {\r\n\t\t\tverifiedBirthPlace =\r\n\t\t\t\t(await this.belfioreConnector.findByCode(place)) ||\r\n\t\t\t\t(await this.belfioreConnector.findByName(place));\r\n\t\t}\r\n\t\treturn verifiedBirthPlace || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Date and Gender information to create Date/Gender CF part\r\n\t * @param date Date instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth date and Gender CF code\r\n\t */\r\n\tpublic dateGenderToCf(date: MultiFormatDate, gender: Genders): string | null {\r\n\t\tconst parsedDate = DateUtils.parseDate(date);\r\n\t\tif (!parsedDate) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfYear = this.yearToCf(parsedDate.getFullYear());\r\n\t\tconst cfMonth = this.monthToCf(parsedDate.getMonth());\r\n\t\tconst cfDayGender = this.dayGenderToCf(parsedDate.getDate(), gender);\r\n\r\n\t\treturn `${cfYear}${cfMonth}${cfDayGender}`;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse place name and province to Belfiore code\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\t/**\r\n\t * Parse a Date and Gender information to create Date/Gender CF part\r\n\t * @param birthDate Date instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\tpublic async placeToCf(\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tdateOrName: MultiFormatDate,\r\n\t\tnameOrProvince?: string,\r\n\t\tprovinceId?: string\r\n\t): Promise {\r\n\t\tconst birthDate: Date | null = DateUtils.parseDate(dateOrName);\r\n\t\tlet name: string;\r\n\t\tlet province: string | undefined;\r\n\t\tif (!birthDate && typeof dateOrName === \"string\") {\r\n\t\t\tname = dateOrName;\r\n\t\t\tprovince = nameOrProvince;\r\n\t\t} else if (nameOrProvince) {\r\n\t\t\tname = nameOrProvince;\r\n\t\t\tprovince = provinceId;\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet placeFinder: IBelfioreConnector | undefined = this.belfioreConnector;\r\n\t\tif (province) {\r\n\t\t\tplaceFinder = placeFinder.byProvince(province);\r\n\t\t}\r\n\t\tif (birthDate && placeFinder) {\r\n\t\t\tplaceFinder = placeFinder.from(birthDate);\r\n\t\t}\r\n\t\tif (placeFinder) {\r\n\t\t\tconst foundPlace: BelfiorePlace | null = await new Parser(\r\n\t\t\t\tplaceFinder\r\n\t\t\t).parsePlace(name);\r\n\t\t\tif (foundPlace) {\r\n\t\t\t\treturn foundPlace.belfioreCode;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF\r\n\t * @returns Complete CF\r\n\t */\r\n\tpublic async encodeCf({\r\n\t\tlastName,\r\n\t\tfirstName,\r\n\r\n\t\tyear,\r\n\t\tmonth,\r\n\t\tday,\r\n\t\tdate,\r\n\r\n\t\tgender,\r\n\t\tplace,\r\n\r\n\t\tomocodeId = 0,\r\n\t}: Omit & {\r\n\t\tplace?: BelfiorePlace | string | undefined;\r\n\t}): Promise {\r\n\t\tconst dtParams =\r\n\t\t\tDateUtils.parseDate(date) || this.yearMonthDayToDate(year, month, day);\r\n\t\tif (!(dtParams && lastName && firstName && gender && place)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst generator = [\r\n\t\t\tasync () => this.lastNameToCf(lastName),\r\n\t\t\tasync () => this.firstNameToCf(firstName),\r\n\t\t\tasync () => this.dateGenderToCf(dtParams, gender),\r\n\t\t\tasync () =>\r\n\t\t\t\tawait this.placeToCf(\r\n\t\t\t\t\tdtParams,\r\n\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t),\r\n\t\t];\r\n\t\tlet cf = \"\";\r\n\t\tfor (const cfPartGenerator of generator) {\r\n\t\t\tconst cfValue = await cfPartGenerator();\r\n\t\t\tif (!cfValue) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tcf += cfValue;\r\n\t\t}\r\n\r\n\t\treturn this.cfOmocode(cf, omocodeId);\r\n\t}\r\n\r\n\tprivate JOLLY_CHAR: string = \"*\";\r\n\r\n\tprivate checkBitmap(offset: number): boolean {\r\n\t\t// tslint:disable-next-line: no-bitwise\r\n\t\treturn !!((2 ** offset) & this.OMOCODE_BITMAP);\r\n\t}\r\n\r\n\tprivate charOmocode(char: string, offset: number): string {\r\n\t\tif (/^[A-Z]$/giu.test(char) && this.checkBitmap(offset)) {\r\n\t\t\treturn Omocodes[char.toUpperCase() as any];\r\n\t\t}\r\n\r\n\t\treturn char;\r\n\t}\r\n\r\n\tprivate charExtractor(text: string, CHAR_LIST: string): string {\r\n\t\tconst charMatcher = new RegExp(`[${CHAR_LIST}]{1,24}`, \"ig\");\r\n\t\tconst diacriticFreeText = diacriticRemover.replace(text).trim();\r\n\t\tconst matchingChars = diacriticFreeText.match(charMatcher);\r\n\t\treturn (matchingChars || []).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Convert omocode full or chunk CF into plain one\r\n\t * @param partialCodiceFiscale Partial or complete Omocode/Regular CF to parse\r\n\t * @param offset starting point of the given chunk in the 16 char CF\r\n\t * @returns Regular version w/o omocodes chars of the given chunk\r\n\t */\r\n\tprivate partialCfDeomocode(\r\n\t\tpartialCodiceFiscale: string,\r\n\t\toffset: number = 0\r\n\t): string {\r\n\t\tconst charReplacer = (char: string, position: number) =>\r\n\t\t\tthis.charOmocode(char, position + offset);\r\n\t\treturn partialCodiceFiscale.replace(/[\\dA-Z]/giu, charReplacer);\r\n\t}\r\n\r\n\tprivate appyCaseToChar(targetChar: string, counterCaseChar: string): string {\r\n\t\tif (targetChar && counterCaseChar) {\r\n\t\t\tconst isUpperCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toUpperCase();\r\n\t\t\tconst isLowerCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toLowerCase();\r\n\r\n\t\t\tif (isUpperCase && !isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toUpperCase();\r\n\t\t\t} else if (!isUpperCase && isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toLowerCase();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn targetChar[0];\r\n\t}\r\n}\r\n","const INVALID_SURNAME: string =\r\n\t\"Provided lastName is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_NAME: string =\r\n\t\"Provided name is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_DAY: string = \"Provided day is not valid\";\r\nconst INVALID_GENDER: string = \"Provided gender is not valid\";\r\nconst INVALID_DAY_OR_GENDER: string =\r\n\t\"Provided day and/or gender are not valid\";\r\nconst INVALID_YEAR: string =\r\n\t\"Provided year is not valid, only 2 or 4 digit numbers are allowed\";\r\nconst INVALID_DATE: string = \"Provided date is not valid\";\r\nconst INVALID_PLACE_NAME: string = \"Proviced City/Country name is not valid\";\r\n\r\nexport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_PLACE_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n};\r\n","import * as ErrorMessages from \"../const/error-messages.const\";\r\n\r\nclass CfuError extends Error {\r\n constructor(errorMessage: string)\r\n constructor(errorCode: string) {\r\n super((Object.entries(ErrorMessages).find(([errId]) => errId === errorCode) || [])[1] || errorCode);\r\n }\r\n}\r\n\r\nexport default CfuError;\r\n","import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n} from \"../const/error-messages.const\";\r\nimport {\r\n\tBELFIORE_CODE_MATCHER,\r\n\tCF_NAME_MATCHER,\r\n\tCF_SURNAME_MATCHER,\r\n\tCHECK_DIGIT,\r\n\tCODICE_FISCALE,\r\n\tCONSONANT_LIST,\r\n\tDAY_MATCHER,\r\n\tFEMALE_DAY_MATCHER,\r\n\tFEMALE_FULL_DATE_MATCHER,\r\n\tFULL_DATE_MATCHER,\r\n\tMALE_DAY_MATCHER,\r\n\tMALE_FULL_DATE_MATCHER,\r\n\tMONTH_MATCHER,\r\n\tVOWEL_LIST,\r\n\tYEAR_MATCHER,\r\n} from \"../const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tDateUtils,\r\n\tMultiFormatDate,\r\n} from \"../date-utils/\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CfuError from \"./cfu-error.class\";\r\nimport Gender from \"./gender.class\";\r\nimport Parser from \"./parser.class\";\r\nimport dayjs from \"dayjs\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Pattern {\r\n\tprivate parser: Parser;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given lastName or generic\r\n\t * @param lastName Optional lastName to generate validation regexp\r\n\t * @return CF Surname matcher\r\n\t * @throw INVALID_SURNAME\r\n\t */\r\n\tpublic cfLastName(lastName?: string): RegExp {\r\n\t\tlet matcher: string = CF_SURNAME_MATCHER;\r\n\t\tif (lastName) {\r\n\t\t\tif (!this.lastName().test(lastName)) {\r\n\t\t\t\tthrow new CfuError(INVALID_SURNAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.lastNameToCf(lastName) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given name or generic\r\n\t * @param name Optional name to generate validation regexp\r\n\t * @return CF name matcher\r\n\t * @throw INVALID_NAME\r\n\t */\r\n\tpublic cfFirstName(name?: string): RegExp {\r\n\t\tlet matcher: string = CF_NAME_MATCHER;\r\n\t\tif (name) {\r\n\t\t\tif (!this.lastName().test(name)) {\r\n\t\t\t\tthrow new CfuError(INVALID_NAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.firstNameToCf(name) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param year Optional year to generate validation regexp\r\n\t * @return CF year matcher\r\n\t */\r\n\tpublic cfYear(year?: number): RegExp {\r\n\t\tlet matcher: string = YEAR_MATCHER;\r\n\t\tif (year) {\r\n\t\t\tconst parsedYear = this.parser.yearToCf(year);\r\n\t\t\tif (parsedYear) {\r\n\t\t\t\tmatcher = this.deomocode(parsedYear);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_YEAR);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given month or generic\r\n\t * @param month Optional month to generate validation regexp\r\n\t * @return CF month matcher\r\n\t */\r\n\tpublic cfMonth(month?: DateMonth) {\r\n\t\tlet matcher: string = MONTH_MATCHER;\r\n\t\tif (month) {\r\n\t\t\tmatcher = this.parser.monthToCf(month) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given day or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @return CF day matcher\r\n\t */\r\n\tpublic cfDay(day?: DateDay): RegExp {\r\n\t\tlet matcher = DAY_MATCHER;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayM = this.parser.dayGenderToCf(day, \"M\");\r\n\t\t\tconst parsedDayF = this.parser.dayGenderToCf(day, \"F\");\r\n\t\t\tif (parsedDayM && parsedDayF) {\r\n\t\t\t\tconst matcherM: string = this.deomocode(parsedDayM);\r\n\t\t\t\tconst matcherF: string = this.deomocode(parsedDayF);\r\n\t\t\t\tmatcher = `(?:${matcherM})|(?:${matcherF})`;\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @param gender Gender @see Genders\r\n\t * @return CF day and gender matcher\r\n\t */\r\n\tpublic cfDayGender(day?: DateDay, gender?: Genders): RegExp {\r\n\t\tif (!gender) {\r\n\t\t\treturn this.cfDay(day);\r\n\t\t}\r\n\t\tlet matcher;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayGender = this.parser.dayGenderToCf(day, gender);\r\n\t\t\tif (parsedDayGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDayGender);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY_OR_GENDER);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tswitch (gender) {\r\n\t\t\t\tcase \"M\":\r\n\t\t\t\t\tmatcher = MALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"F\":\r\n\t\t\t\t\tmatcher = FEMALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param gender @see Genders\r\n\t * @return CF date and gender matcher\r\n\t */\r\n\tpublic cfDateGender(\r\n\t\tdate?: MultiFormatDate | null,\r\n\t\tgender?: Genders | null\r\n\t): RegExp {\r\n\t\tif (date && !DateUtils.parseDate(date)) {\r\n\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t}\r\n\t\tif (gender && !Gender.toArray().includes(gender)) {\r\n\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t}\r\n\t\tlet matcher = FULL_DATE_MATCHER;\r\n\t\tif (date) {\r\n\t\t\tconst parsedDateGender =\r\n\t\t\t\tgender && this.parser.dateGenderToCf(date, gender);\r\n\t\t\tif (parsedDateGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDateGender);\r\n\t\t\t} else {\r\n\t\t\t\tconst parseDeomocode = (g: Genders): string => {\r\n\t\t\t\t\tconst parsedGender = this.parser.dateGenderToCf(date, g);\r\n\t\t\t\t\tif (!parsedGender) {\r\n\t\t\t\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn parsedGender && this.deomocode(parsedGender);\r\n\t\t\t\t};\r\n\t\t\t\tmatcher = `(?:${Gender.toArray().map(parseDeomocode).join(\"|\")})`;\r\n\t\t\t}\r\n\t\t} else if (gender === \"M\") {\r\n\t\t\tmatcher = MALE_FULL_DATE_MATCHER;\r\n\t\t} else if (gender === \"F\") {\r\n\t\t\tmatcher = FEMALE_FULL_DATE_MATCHER;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\t/**\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\tpublic async cfPlace(placeName?: string | null): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDate?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDateOrName?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise {\r\n\t\tlet matcher = BELFIORE_CODE_MATCHER;\r\n\t\tif (birthDateOrName) {\r\n\t\t\tconst birthDate: Date | null = DateUtils.parseDate(birthDateOrName);\r\n\r\n\t\t\tif (birthDate && placeName) {\r\n\t\t\t\tconst place: string = placeName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(birthDate, place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t} else if (!birthDate && typeof birthDateOrName === \"string\") {\r\n\t\t\t\tconst place: string = birthDateOrName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF validator based on given optional input or generic\r\n\t * @param personalInfo Input Object\r\n\t * @return CodiceFiscale matcher\r\n\t */\r\n\tpublic async codiceFiscale(\r\n\t\tpersonalInfo?: Omit & {\r\n\t\t\tplace?: BelfiorePlace | string | undefined;\r\n\t\t}\r\n\t): Promise {\r\n\t\tlet matcher = CODICE_FISCALE;\r\n\t\tif (personalInfo) {\r\n\t\t\tconst parsedCf = await this.parser.encodeCf(personalInfo);\r\n\r\n\t\t\tif (parsedCf) {\r\n\t\t\t\tmatcher = this.deomocode(parsedCf);\r\n\t\t\t} else {\r\n\t\t\t\tconst { lastName, firstName, year, month, day, date, gender, place } =\r\n\t\t\t\t\tpersonalInfo;\r\n\t\t\t\tif (\r\n\t\t\t\t\tlastName ||\r\n\t\t\t\t\tfirstName ||\r\n\t\t\t\t\tyear ||\r\n\t\t\t\t\tmonth ||\r\n\t\t\t\t\tday ||\r\n\t\t\t\t\tdate ||\r\n\t\t\t\t\tgender ||\r\n\t\t\t\t\tplace\r\n\t\t\t\t) {\r\n\t\t\t\t\tlet dtParams: Date | null = null;\r\n\t\t\t\t\tif (date) {\r\n\t\t\t\t\t\tdtParams = DateUtils.parseDate(date);\r\n\t\t\t\t\t} else if (year) {\r\n\t\t\t\t\t\tdtParams = this.parser.yearMonthDayToDate(year, month, day);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst generator: (() => Promise)[] = [\r\n\t\t\t\t\t\tasync () => this.cfLastName(lastName),\r\n\t\t\t\t\t\tasync () => this.cfFirstName(firstName),\r\n\t\t\t\t\t\tasync () => this.cfDateGender(dtParams, gender),\r\n\t\t\t\t\t\tasync () =>\r\n\t\t\t\t\t\t\tawait this.cfPlace(\r\n\t\t\t\t\t\t\t\tdtParams,\r\n\t\t\t\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t\t\t\t),\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\tmatcher = \"\";\r\n\t\t\t\t\tfor (const validator of generator) {\r\n\t\t\t\t\t\tconst cfMatcher = (await validator()).toString();\r\n\t\t\t\t\t\tconst match = cfMatcher.match(/\\^(.{1,256})\\$/);\r\n\t\t\t\t\t\tconst cfValue: string | null | undefined = match && match[1];\r\n\r\n\t\t\t\t\t\tif (!cfValue) {\r\n\t\t\t\t\t\t\tthrow new Error(`Unable to handle [${cfMatcher}]`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmatcher += `(?:${cfValue})`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Final addition of CheckDigit\r\n\t\t\t\t\tmatcher += CHECK_DIGIT;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tprivate LETTER_SET: string = `[A-Z${diacriticRemover.matcherBy(\r\n\t\t/^[A-Z]$/iu\r\n\t)}]`;\r\n\tprivate SEPARATOR_SET: string = \"(?:'?\\\\s{0,4})\";\r\n\r\n\t/**\r\n\t * Returns lastName validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic lastName(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = `${this.LETTER_SET}{1,24}`;\r\n\t\tif (codiceFiscale && /^[A-Z]{1,3}/iu.test(codiceFiscale)) {\r\n\t\t\tconst lastNameCf: string = codiceFiscale.substr(0, 3);\r\n\t\t\tconst diacriticizer = (matchingChars: string) =>\r\n\t\t\t\tmatchingChars\r\n\t\t\t\t\t.split(\"\")\r\n\t\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [cons, vow] = [\r\n\t\t\t\t`^[${CONSONANT_LIST}]{1,3}`,\r\n\t\t\t\t`[${VOWEL_LIST}]{1,3}`,\r\n\t\t\t].map((charMatcher) =>\r\n\t\t\t\tdiacriticizer(\r\n\t\t\t\t\t(lastNameCf.match(new RegExp(charMatcher, \"ig\")) || [])[0] || \"\"\r\n\t\t\t\t)\r\n\t\t\t);\r\n\r\n\t\t\tconst diacriticsVowelList: string =\r\n\t\t\t\tVOWEL_LIST +\r\n\t\t\t\tdiacriticRemover.matcherBy(new RegExp(`^[${VOWEL_LIST}]$`, \"ui\"));\r\n\t\t\tconst diacriticsVowelMatcher: string = `[${diacriticsVowelList}]`;\r\n\t\t\tconst midDiacriticVowelMatcher: string = `(?:${diacriticsVowelMatcher}${this.SEPARATOR_SET}){0,24}`;\r\n\t\t\tconst endingDiacritcVowelMatcher: string = `(?:${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${diacriticsVowelMatcher})?`;\r\n\t\t\tswitch (cons.length) {\r\n\t\t\t\tcase 3: {\r\n\t\t\t\t\tconst divider = midDiacriticVowelMatcher;\r\n\t\t\t\t\tmatcher =\r\n\t\t\t\t\t\tdivider +\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}${divider}`) +\r\n\t\t\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 2: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\t`${vow[0]}${midDiacriticVowelMatcher}${this.SEPARATOR_SET}${cons[0]}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\t`${cons[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tvow.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${vow[0]}`,\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 1: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\tvow.slice(0, 2).join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tmidDiacriticVowelMatcher +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t\t`${vow[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tvow[1],\r\n\t\t\t\t\t\t[cons[0], ...vow.slice(0, 2)].join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tmatcher = `${vow.join(\r\n\t\t\t\t\t\t`${this.SEPARATOR_SET}`\r\n\t\t\t\t\t)}${endingDiacritcVowelMatcher}`;\r\n\t\t\t}\r\n\r\n\t\t\tif (vow?.length + cons?.length < 3) {\r\n\t\t\t\treturn this.isolatedInsensitiveTailor(`\\\\s{0,4}(${matcher})\\\\s{0,4}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`\\\\s{0,4}((?:${matcher})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\\\s{0,4}`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns name validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic firstName(codiceFiscale?: string): RegExp {\r\n\t\tif (\r\n\t\t\tcodiceFiscale &&\r\n\t\t\tnew RegExp(`^[A-Z]{3}[${CONSONANT_LIST}]{3}`, \"iu\").test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst nameCf: string = codiceFiscale.substr(3, 3);\r\n\r\n\t\t\tconst cons: string[] = (\r\n\t\t\t\t(nameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) ||\r\n\t\t\t\t\t[])[0] || \"\"\r\n\t\t\t)\r\n\t\t\t\t.split(\"\")\r\n\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [diacriticsVowelList, diacriticsConsonantList]: string[] = [\r\n\t\t\t\tVOWEL_LIST,\r\n\t\t\t\tCONSONANT_LIST,\r\n\t\t\t].map(\r\n\t\t\t\t(chars) =>\r\n\t\t\t\t\tchars + diacriticRemover.matcherBy(new RegExp(`^[${chars}]$`, \"ui\"))\r\n\t\t\t);\r\n\r\n\t\t\tconst matcher: string =\r\n\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}${cons[0]}${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${diacriticsConsonantList}]${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24})?` +\r\n\t\t\t\tcons\r\n\t\t\t\t\t.slice(1, 3)\r\n\t\t\t\t\t.join(\r\n\t\t\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}`\r\n\t\t\t\t\t) +\r\n\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;\r\n\r\n\t\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t\t}\r\n\t\treturn this.lastName((codiceFiscale || \"\").substr(3, 3));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns iso8601 date validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic date(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = DATE_MATCHER.ISO8601_DATE_TIME;\r\n\t\tif (codiceFiscale) {\r\n\t\t\tconst parsedDate = this.parser.cfToBirthDate(codiceFiscale);\r\n\t\t\tif (parsedDate) {\r\n\t\t\t\tconst dateIso8601: string = parsedDate.toJSON();\r\n\t\t\t\tif (dayjs().diff(dayjs(parsedDate), \"y\") < 50) {\r\n\t\t\t\t\tconst century: number = parseInt(dateIso8601.substr(0, 2), 10);\r\n\t\t\t\t\tconst centuries: string[] = [century - 1, century].map((year) =>\r\n\t\t\t\t\t\tyear.toString().padStart(2, \"0\")\r\n\t\t\t\t\t);\r\n\t\t\t\t\tmatcher = `(?:${centuries.join(\"|\")})` + dateIso8601.substr(2, 8);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmatcher = dateIso8601.substr(0, 10);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`${matcher}(?:T${DATE_MATCHER.TIME}(?:${DATE_MATCHER.TIMEZONE})?)?`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns gender validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic gender(codiceFiscale?: string): RegExp {\r\n\t\tconst parsedGender = codiceFiscale && this.parser.cfToGender(codiceFiscale);\r\n\t\tconst matcher: string = parsedGender || `[${Gender.toArray().join(\"\")}]`;\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns place validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic async place(codiceFiscale?: string): Promise {\r\n\t\tlet matcher: string = \".{1,32}\";\r\n\t\tconst parsedPlace =\r\n\t\t\tcodiceFiscale && (await this.parser.cfToBirthPlace(codiceFiscale));\r\n\r\n\t\tif (parsedPlace) {\r\n\t\t\tconst nameMatcher: string = parsedPlace.name.replace(/./gu, (c) =>\r\n\t\t\t\tdiacriticRemover[c] === c ? c : `[${c}${diacriticRemover[c]}]`\r\n\t\t\t);\r\n\t\t\tmatcher = `(?:(?:${nameMatcher})|${parsedPlace.belfioreCode})`;\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tpublic deomocode(omocode: string): string {\r\n\t\treturn omocode.replace(/\\d/gu, (n: any) => `[${n}${Omocodes[n]}]`);\r\n\t}\r\n\r\n\tprivate isolatedInsensitiveTailor(matcher: string): RegExp {\r\n\t\treturn new RegExp(`^(?:${matcher})$`, \"iu\");\r\n\t}\r\n}\r\n","import dayjs from \"dayjs\";\r\nimport {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDATE_OFFSET,\r\n\tDATE_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport type IMismatchVerboseErrors from \"../interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport default class CFMismatchValidator {\r\n\tprivate pattern: Pattern;\r\n\tprivate parser: Parser;\r\n\tconstructor(\r\n\t\tbelfioreConnector: IBelfioreConnector,\r\n\t\tprivate readonly codiceFiscale: string\r\n\t) {\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\tprivate get hasLastName() {\r\n\t\treturn this.codiceFiscale?.length >= LASTNAME_OFFSET + LASTNAME_SIZE;\r\n\t}\r\n\r\n\tprivate get hasFirstName() {\r\n\t\treturn this.codiceFiscale?.length >= FIRSTNAME_OFFSET + FIRSTNAME_SIZE;\r\n\t}\r\n\tprivate get hasBirthYear() {\r\n\t\treturn this.codiceFiscale?.length >= YEAR_OFFSET + YEAR_SIZE;\r\n\t}\r\n\tprivate get hasBirthDate() {\r\n\t\treturn this.codiceFiscale?.length >= DATE_OFFSET + DATE_SIZE;\r\n\t}\r\n\tprivate get hasGender() {\r\n\t\treturn this.codiceFiscale?.length >= GENDER_OFFSET + GENDER_SIZE;\r\n\t}\r\n\tprivate get hasBirthPlace() {\r\n\t\treturn this.codiceFiscale?.length >= PLACE_OFFSET + PLACE_SIZE;\r\n\t}\r\n\r\n\tprivate get hasCRC() {\r\n\t\treturn this.codiceFiscale?.length >= CRC_OFFSET + CRC_SIZE;\r\n\t}\r\n\r\n\tpublic async matchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn (await this.pattern.codiceFiscale(personalInfo)).test(\r\n\t\t\tthis.codiceFiscale\r\n\t\t);\r\n\t}\r\n\tpublic async mismatchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn !!(\r\n\t\t\tthis.codiceFiscale &&\r\n\t\t\tpersonalInfo &&\r\n\t\t\tpersonalInfo.lastName &&\r\n\t\t\tpersonalInfo.firstName &&\r\n\t\t\t(personalInfo.date ||\r\n\t\t\t\t(personalInfo.day && personalInfo.month && personalInfo.year)) &&\r\n\t\t\tpersonalInfo.gender &&\r\n\t\t\tpersonalInfo.place &&\r\n\t\t\t!(await this.matchPersonalInfo(personalInfo))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchLastName(lastName?: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasLastName &&\r\n\t\t\tthis.pattern.lastName(this.codiceFiscale).test(lastName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchLastName(lastName?: string): boolean {\r\n\t\treturn this.hasLastName && !!lastName && !this.matchLastName(lastName);\r\n\t}\r\n\r\n\tpublic matchFirstName(firstName: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasFirstName &&\r\n\t\t\tthis.pattern.firstName(this.codiceFiscale).test(firstName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchFirstName(firstName: string): boolean {\r\n\t\treturn this.hasFirstName && !!firstName && !this.matchFirstName(firstName);\r\n\t}\r\n\r\n\tpublic matchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\tif (this.hasBirthDate) {\r\n\t\t\tconst parsedCfDate = this.parser.cfToBirthDate(this.codiceFiscale);\r\n\t\t\tconst parsedDate = DateUtils.parseDate(birthDate);\r\n\t\t\tif (parsedCfDate && parsedDate) {\r\n\t\t\t\treturn dayjs(parsedCfDate).isSame(parsedDate, \"d\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic mismatchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthYear &&\r\n\t\t\t!!DateUtils.parseDate(birthDate) &&\r\n\t\t\t!this.matchBirthDate(birthDate)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchGender(gender: Genders | string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasGender &&\r\n\t\t\tthis.pattern.gender(this.codiceFiscale).test(gender || \"\")\r\n\t\t);\r\n\t}\r\n\r\n\tpublic mismatchGender(gender: Genders | string): boolean {\r\n\t\treturn this.hasGender && !!gender && !this.matchGender(gender);\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async matchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tif (this.hasBirthPlace && birthPlace) {\r\n\t\t\tconst matcher = await this.pattern.place(this.codiceFiscale);\r\n\t\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\r\n\t\t\treturn !!parsedBirthPlace && matcher.test(parsedBirthPlace?.belfioreCode);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async mismatchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthPlace &&\r\n\t\t\t!!birthPlace &&\r\n\t\t\t!(await this.matchBirthPlace(birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @param codiceFiscale Complete CF to parse\r\n\t * @return Verbose errors\r\n\t */\r\n\tpublic get errors(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, false),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, true),\r\n\t\t])\r\n\t\t\t.then(([placeCheck, placeCreationExpirationCheck]) => ({\r\n\t\t\t\t// Checking lastName validity\r\n\t\t\t\t...(this.parser.cfToLastName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { lastName: \"MISSING_OR_INVALID_LAST_NAME\" }),\r\n\t\t\t\t// Checking firstName validity\r\n\t\t\t\t...(this.parser.cfToFirstName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { firstName: \"MISSING_OR_INVALID_FIRST_NAME\" }),\r\n\t\t\t\t// Checking Date validity\r\n\t\t\t\t...(this.parser.cfToBirthDate(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DATE\" }),\r\n\t\t\t\t// Checking Day validity\r\n\t\t\t\t...(this.parser.cfToBirthDay(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DAY\" }),\r\n\t\t\t\t// Checking Month validity\r\n\t\t\t\t...(this.parser.cfToBirthMonth(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_MONTH\" }),\r\n\t\t\t\t// Checking Year validity\r\n\t\t\t\t...(this.parser.cfToBirthYear(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_YEAR\" }),\r\n\t\t\t\t// Checking Gender validity\r\n\t\t\t\t...(this.parser.cfToGender(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { gender: \"MISSING_DAY\" }),\r\n\t\t\t\t// Checking Place validity\r\n\t\t\t\t...(placeCheck ? {} : { place: \"MISSING_OR_INVALID_PLACE\" }),\r\n\t\t\t\t// Checking Place Creation/Expiration vs Birthdate validity\r\n\t\t\t\t...(placeCreationExpirationCheck\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: {\r\n\t\t\t\t\t\t\tplace: \"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE\",\r\n\t\t\t\t\t\t\tdate: \"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE\",\r\n\t\t\t\t\t }),\r\n\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t...(this.codiceFiscale\r\n\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t?.toUpperCase() === CheckDigitizer.checkDigit(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { crc: \"INVALID_CRC_CODE\" }),\r\n\r\n\t\t\t\t// Checking length\r\n\t\t\t\t...(this.hasCRC ? {} : { crc: \"MISSING_CRC_CODE\" }),\r\n\t\t\t}))\r\n\t\t\t.then((errors) => (Object.keys(errors).length ? errors : null));\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic get valid(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.pattern.codiceFiscale(),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale),\r\n\t\t]).then(\r\n\t\t\t([cfPattern, cfToBirthPlace]) =>\r\n\t\t\t\t!(\r\n\t\t\t\t\t// Checking length\r\n\t\t\t\t\t(\r\n\t\t\t\t\t\t!this.hasCRC ||\r\n\t\t\t\t\t\t// Checking form validity\r\n\t\t\t\t\t\t!cfPattern.test(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t\t\tthis.codiceFiscale\r\n\t\t\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t\t\t?.toUpperCase() !==\r\n\t\t\t\t\t\t\tCheckDigitizer.checkDigit(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking Birth date/place validity\r\n\t\t\t\t\t\t!cfToBirthPlace\r\n\t\t\t\t\t)\r\n\t\t\t\t)\r\n\t\t);\r\n\t}\r\n\tpublic get invalid(): Promise {\r\n\t\treturn this.valid.then((isValid) => !!this.codiceFiscale && !isValid);\r\n\t}\r\n}\r\n","import {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CFMismatchValidator from \"./cf-mismatch-validator.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default class Validator {\r\n\tprivate parser: Parser;\r\n\tprivate pattern: Pattern;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n\r\n\tpublic codiceFiscale(codiceFiscale: string): CFMismatchValidator {\r\n\t\treturn new CFMismatchValidator(this.belfioreConnector, codiceFiscale);\r\n\t}\r\n\r\n\tpublic isLastNameValid(lastName: string): boolean {\r\n\t\treturn this.pattern.lastName().test(lastName);\r\n\t}\r\n\tpublic isLastNameInvalid(lastName: string): boolean {\r\n\t\treturn !!lastName && !this.isLastNameValid(lastName);\r\n\t}\r\n\r\n\tpublic isFirstNameValid(firstName: string): boolean {\r\n\t\treturn this.pattern.firstName().test(firstName);\r\n\t}\r\n\tpublic isFirstNameInvalid(firstName: string): boolean {\r\n\t\treturn !!firstName && !this.isFirstNameValid(firstName);\r\n\t}\r\n\r\n\tpublic isBirthDateValid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!DateUtils.parseDate(birthDate);\r\n\t}\r\n\tpublic isBirthDateInvalid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!birthDate && !this.isBirthDateValid(birthDate);\r\n\t}\r\n\r\n\tpublic isGenderValid(gender: Genders | string): boolean {\r\n\t\treturn this.pattern.gender().test(gender);\r\n\t}\r\n\tpublic isGenderInvalid(gender: Genders | string): boolean {\r\n\t\treturn !!gender && !this.isGenderValid(gender);\r\n\t}\r\n\r\n\tpublic async isBirthPlaceValid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\t!!parsedBirthPlace &&\r\n\t\t\t!!(await this.belfioreConnector.findByCode(parsedBirthPlace.belfioreCode))\r\n\t\t);\r\n\t}\r\n\tpublic async isBirthPlaceInvalid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn !!birthPlace && !(await this.isBirthPlaceValid(birthPlace));\r\n\t}\r\n\r\n\tpublic async birthDatePlaceMatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t(!!(await this.belfioreConnector\r\n\t\t\t\t.from(birthDate)\r\n\t\t\t\t.findByCode(parsedPlace.belfioreCode)) ||\r\n\t\t\t\t// Ignoring control for people born before CF introduction\r\n\t\t\t\t!dayjs(DateUtils.parseDate(birthDate)).isAfter(\r\n\t\t\t\t\tCF_INTRODUCTION_DATE,\r\n\t\t\t\t\t\"day\"\r\n\t\t\t\t))\r\n\t\t);\r\n\t}\r\n\tpublic async birthDatePlaceMismatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t!(await this.birthDatePlaceMatch(birthDate, birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMatch(birthDate, birthPlace);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMismatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMismatch(birthDate, birthPlace);\r\n\t}\r\n}\r\n","import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport CFMismatchValidator from \"./classes/cf-mismatch-validator.class\";\r\nimport CheckDigitizer from \"./classes/check-digitizer.class\";\r\nimport Gender from \"./classes/gender.class\";\r\nimport Parser from \"./classes/parser.class\";\r\nimport Pattern from \"./classes/pattern.class\";\r\nimport Validator from \"./classes/validator.class\";\r\nimport * as VALIDATOR from \"./const/matcher.const\";\r\nimport * as Matcher from \"./const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\ttype DateDay,\r\n\ttype DateMonth,\r\n\tDateUtils,\r\n\ttype MultiFormatDate,\r\n} from \"./date-utils/\";\r\nimport BirthMonth from \"./enums/birth-month.enum\";\r\nimport CRC from \"./enums/crc.enum\";\r\nimport Omocodes from \"./enums/omocodes.enum\";\r\nimport type Genders from \"./types/genders.type\";\r\nimport IMismatchVerboseErrors from \"./interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport type {\r\n\tBelfiorePlace,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tGenders,\r\n\tMultiFormatDate,\r\n\tIMismatchVerboseErrors,\r\n};\r\n\r\nexport default class CodiceFiscaleUtils {\r\n\tpublic readonly validator: Validator;\r\n\tpublic readonly parser: Parser;\r\n\tpublic readonly pattern: Pattern;\r\n\r\n\tconstructor(public readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.validator = new Validator(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n}\r\n\r\nexport {\r\n\tBirthMonth,\r\n\tCheckDigitizer,\r\n\tCRC,\r\n\tDATE_MATCHER,\r\n\tDateUtils,\r\n\tGender,\r\n\tOmocodes,\r\n\tVALIDATOR,\r\n\tMatcher,\r\n\tCFMismatchValidator,\r\n\tParser,\r\n\tPattern,\r\n\tValidator,\r\n\tCodiceFiscaleUtils,\r\n};\r\n"],"names":["CRC_OFFSET","YEAR","MONTH","DAYS_30_MONTHS","DAYS_31_MONTHS","MONTH_DAY","HOURS","MINUTES","SECONDS","MILLISECONDS","TIMEZONE","TIME","ISO8601_SHORT_DATE","ISO8601_DATE_TIME","DateUtils","parseDate","date","Date","RegExp","test","Array","isArray","length","some","value","isNaN","parsedDate","year","month","day","dayjs","UTC","isValid","toDate","err","ymdToDate","this","CONSONANT_LIST","VOWEL_LIST","OMOCODE_NUMBER_LIST","OMOCODE_NON_ZERO_NUMBER_LIST","OMOCODE_ZERO_LIST","MONTH_LIST","MONTH_30DAYS_LIST","MONTH_31DAYS_LIST","CITY_CODE_LIST","COUNTRY_CODE_LIST","CF_NAME_MATCHER","CF_SURNAME_MATCHER","CF_FULL_NAME_MATCHER","YEAR_MATCHER","LEAP_YEAR_MATCHER","MONTH_MATCHER","DAY_2X_MATCHER","DAY_3X_MATCHER","DAY_29_MATCHER","DAY_30_MATCHER","DAY_31_MATCHER","DAY_MATCHER","MALE_DAY_MATCHER","FEMALE_DAY_MATCHER","MONTH_DAY_MATCHER","FULL_DATE_MATCHER","MALE_FULL_DATE_MATCHER","FEMALE_FULL_DATE_MATCHER","CITY_CODE_MATCHER","COUNTRY_CODE_MATCHER","BELFIORE_CODE_MATCHER","CHECK_DIGIT","CODICE_FISCALE","PARTIAL_CF_NAME_MATCHER","PARTIAL_CF_FULL_NAME","PARTIAL_YEAR","PARTIAL_MONTH_DAY","PARTIAL_FULL_DATE","PARTIAL_BELFIORE_CODE_MATCHER","PARTIAL_CF","CRC","BirthMonth","CRC$1","CheckDigitizer","checkDigit","codiceFiscale","partialCF","substr","partialCfValue","charValue","evaluateChar","String","fromCharCode","CRC_MOD","CHAR_OFFSET","generator","evaluateCharGenerator","Symbol","iterator","index","char","toUpperCase","parseInt","charCodeAt","GenderWeight","BirthMonth$1","Omocodes","GenderWeight$1","Omocodes$1","Gender","getDay","genderDay","plainDay","F","MAX_MONTH_DAY","getGender","toArray","find","gender","genderizeDay","CF_INTRODUCTION_DATE","diacriticRemover","DiacriticRemover","Parser","constructor","belfioreConnector","OMOCODE_BITMAP","JOLLY_CHAR","cfDeomocode","deomocodedCf","partialCfDeomocode","substring","appyCaseToChar","cfOmocode","omocodeId","omocodedCf","split","i","o","Math","pow","crc","partialCf","slice","join","cfOmocodeId","cfOmocodeBitmap","filter","map","cfToLastName","cfLastNamePart","LASTNAME_OFFSET","lastNameCf","cons","match","vow","matchingLength","cfToFirstName","cfFirstNamePart","FIRSTNAME_OFFSET","cfToGender","GENDER_OFFSET","cfGenderPart","genderInt","cfToBirthYear","YEAR_OFFSET","cfBirthYearPart","birthYear","current2DigitsYear","format","century","subtract","cfToBirthMonth","MONTH_OFFSET","cfBirthMonthPart","birthMonth","cfToBirthDay","DAY_OFFSET","cfBirthDayPart","birthDay","cfToBirthDate","cfToBirthPlace","codiceFiscale_1","checkBirthDateConsistency","PLACE_OFFSET","cfBirthPlacePart","belfioreCode","birthPlace","findByCode","creationDate","expirationDate","birthDate","isBirthDateAfterCfIntroduction","add","isBefore","isAfter","cfDecode","fiscalCode","undefined","_a","place","personalInfo","firstName","lastName","lastNameToCf","trim","replace","charExtractor","padEnd","firstNameToCf","consonants","yearToCf","parsedYear","monthToCf","dayGenderToCf","genderValue","yearMonthDayToDate","param","parsePlace","verifiedBirthPlace","findByName","dateGenderToCf","getFullYear","getMonth","getDate","placeToCf","dateOrName","nameOrProvince","provinceId","name","province","placeFinder","byProvince","from","foundPlace","encodeCf","__awaiter","arguments","dtParams","cf","cfPartGenerator","cfValue","checkBitmap","offset","charOmocode","text","CHAR_LIST","charMatcher","partialCodiceFiscale","position","targetChar","counterCaseChar","isUpperCase","isLowerCase","toLowerCase","INVALID_SURNAME","INVALID_NAME","INVALID_DAY","INVALID_GENDER","INVALID_DAY_OR_GENDER","INVALID_YEAR","INVALID_DATE","CfuError","Error","errorCode","super","Object","entries","ErrorMessages","errId","Pattern","LETTER_SET","matcherBy","SEPARATOR_SET","parser","cfLastName","matcher","isolatedInsensitiveTailor","cfFirstName","cfYear","deomocode","cfMonth","cfDay","parsedDayM","parsedDayF","cfDayGender","parsedDayGender","cfDateGender","includes","parsedDateGender","parseDeomocode","g","parsedGender","cfPlace","birthDateOrName","placeName","parsedPlace","parsedCf","validator","cfMatcher","toString","diacriticizer","matchingChars","insensitiveMatcher","diacriticsVowelMatcher","midDiacriticVowelMatcher","endingDiacritcVowelMatcher","divider","diacriticsVowelList","diacriticsConsonantList","chars","DATE_MATCHER.ISO8601_DATE_TIME","dateIso8601","toJSON","diff","padStart","DATE_MATCHER.TIME","DATE_MATCHER.TIMEZONE","c","omocode","n","CFMismatchValidator","pattern","hasLastName","hasFirstName","hasBirthYear","hasBirthDate","DATE_OFFSET","hasGender","hasBirthPlace","hasCRC","matchPersonalInfo","mismatchPersonalInfo","matchLastName","mismatchLastName","matchFirstName","mismatchFirstName","matchBirthDate","parsedCfDate","isSame","mismatchBirthDate","matchGender","mismatchGender","matchBirthPlace","parsedBirthPlace","mismatchBirthPlace","errors","Promise","all","then","placeCheck","placeCreationExpirationCheck","assign","_b","keys","valid","cfPattern","invalid","Validator","isLastNameValid","isLastNameInvalid","isFirstNameValid","isFirstNameInvalid","isBirthDateValid","isBirthDateInvalid","isGenderValid","isGenderInvalid","isBirthPlaceValid","isBirthPlaceInvalid","birthDatePlaceMatch","birthDatePlaceMismatch","birthPlaceDateMatch","birthPlaceDateMismatch","CodiceFiscaleUtils"],"mappings":"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AAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,EAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,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AAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACKC,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACtBC,CAAyB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACzBC,GACL,CACKC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACL,CACKC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAuB,6JACM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,sCCTnC,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiBC,CAEnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA3I,CAAY4I,CACRC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOC,CAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQC,CAAevJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAEwJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAWA,CAAUL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAc,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMA,CAC5F,CAAA,CAAA,CCwCL,CAAM/I,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAmB,IAAIC,CAEf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOoJ,CAGpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAlJ,CAA6BC,CAAAA,CAAAA,CAAAtF,CAAiBsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAjBA,CAuQrBtF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUwO,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOtJ,CAAiBuJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACpD,CAEOzO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa0O,cAAW,CAzQ/B1O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIvJ,CAAOE,CAAAA,CAAAA,CAAAA,CACzB,CAQM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAsJ,CAAWxE,CAAAA,CAAAA,CACjB,CAAIyE,CAAAA,CAAAA,CAAAA,CAAAA,CAAkBjO,CACtB,CAAA,CAAA,CAAA,CAAIwJ,CAAU,CAAA,CACb,CAAKpK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKoK,CAAWrL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKqL,CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI2D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASP,CAEpBqB,CAAAA,CAAAA,CAAAA,CAAAA,CAAU7O,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOtE,CAAaD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAayE,CAChD,CACD,OAAO7O,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0BD,CACtC,CAAA,CAQM,CAAAE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAYjD,CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI+C,CAAkBlO,CAAAA,CAAAA,CACtB,CAAImL,CAAAA,CAAAA,CAAAA,CAAM,CACT,CAAA,CAAA,CAAA,CAAK9L,CAAKoK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAWrL,KAAK+M,CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAIiC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASN,CAEpBoB,CAAAA,CAAAA,CAAAA,CAAAA,CAAU7O,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOjE,CAAcoB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS+C,CAC7C,CACD,CAAO7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8O,CAA0BD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACtC,CAOM,CAAAG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOzP,CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIsP,CAAkB/N,CAAAA,CAAAA,CACtB,CAAIvB,CAAAA,CAAAA,CAAAA,CAAM,CACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMsL,CAAa7K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO/D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASrL,CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIsL,CAGH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAIkD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASF,CAFnBgB,CAAAA,CAAAA,CAAAA,CAAAA,CAAU7O,CAAKiP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUpE,CAI1B,CAAA,CACD,CAAO7K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8O,CAA0BD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACtC,CAOM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAK,CAAQ1P,CACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIqP,CAAkB7N,CAAAA,CAAAA,CAItB,CAHIxB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACHqP,CAAU7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO7D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUtL,CAAUqP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEpC7O,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0BD,CACtC,CAAA,CAOM,KAAAM,CAAM1P,CAAAA,CAAAA,CACZ,CAAIoP,CAAAA,CAAAA,CAAAA,CAAAA,CAAUvN,CACd,CAAA,CAAA,CAAA,CAAI7B,CAAK,CAAA,CACR,CAAM2P,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAapP,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO5D,CAActL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAC5C4P,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAarP,KAAK2O,CAAO5D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAActL,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAClD,CAAI2P,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAcC,CAKjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAItB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASL,CAFnBmB,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAFe7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKiP,CAAUG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACfpP,CAAKiP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUI,CAKzC,CAAA,CAAA,CAAA,CAAA,CACD,CAAOrP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8O,CAA0BD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACtC,CAQM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAS,CAAY7P,CAAAA,CAAesF,CACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKA,CACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO/E,KAAKmP,CAAM1P,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEnB,CAAIoP,CAAAA,CAAAA,CAAAA,CAAAA,CACJ,CAAIpP,CAAAA,CAAAA,CAAAA,CAAK,CACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM8P,CAAkBvP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO5D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAActL,CAAKsF,CAAAA,CAAAA,CAAAA,CACvD,CAAIwK,CAAAA,CAAAA,CAAAA,CAAAA,CAGH,MAAM,CAAIxB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASH,CAFnBiB,CAAAA,CAAAA,CAAAA,CAAAA,CAAU7O,CAAKiP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUM,CAI1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,CAAQxK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACP,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACJ8J,CAAUtN,CAAAA,CAAAA,CACV,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IACJsN,CAAUrN,CAAAA,CAAAA,CACV,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIuM,CAASJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAGtB,CAAO3N,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8O,CAA0BD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACtC,CAQM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAW,CACN5Q,CAAAA,CACAmG,CAEA,CAAA,CAAA,CAAA,CAAA,CAAInG,CAASF,CAAAA,CAAAA,CAAAA,CAAAA,CAAUC,CAAUC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAChC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAImP,CAASD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEpB,CAAI/I,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAWT,CAAOO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU4K,CAAS1K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACxC,MAAM,CAAIgJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASJ,CAEpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIkB,CAAUnN,CAAAA,CAAAA,CACd,CAAI9C,CAAAA,CAAAA,CAAAA,CAAM,CACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM8Q,CACL3K,CAAAA,CAAAA,CAAAA,CAAU/E,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOrD,CAAe1M,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAMmG,GAC5C,CAAI2K,CAAAA,CAAAA,CAAAA,CACHb,CAAU7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKiP,CAAUS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACnB,CACN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMC,CAAkBC,CAAAA,CAAAA,CAAAA,CAAAA,CACvB,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe7P,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOrD,CAAe1M,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAMgR,GACtD,CAAKC,CAAAA,CAAAA,CAAAA,CAAAA,CACJ,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI9B,CAASD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEpB,CAAO+B,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB7P,CAAKiP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUY,CAAa,CAAA,CAAA,CAEpDhB,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMvK,CAAOO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUgC,IAAI8I,CAAgBlJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACD,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX1B,CACV8J,CAAAA,CAAAA,CAAUlN,CACW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAXoD,CACV8J,CAAAA,CAAAA,CAAAA,CAAAA,CAAUjN,CAEX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO5B,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0BD,EACtC,CAgBY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAiB,CACZC,CAAAA,CACAC,iCAEA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAInB,CAAU9M,CAAAA,CAAAA,CACd,CAAIgO,CAAAA,CAAAA,CAAAA,CAAiB,CACpB,CAAMvG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB9K,CAAUC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUoR,CAEnD,CAAA,CAAA,CAAA,CAAA,CAAIvG,CAAawG,CAAAA,CAAAA,CAAAA,CAAW,CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM/F,CAAgB+F,CAAAA,CAAAA,CAChBC,CAAoBjQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAOjD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUlC,EAAWS,CAC3D4E,CAAAA,CAAAA,CAAAA,CAAU7O,CAAKiP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUgB,CAAe,CAAA,CAAA,CAAA,CAAA,CACxC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKzG,CAAwC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAApBuG,CAA8B,CAAA,CAC7D,CAAM9F,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB8F,CAChBE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAoBjQ,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOjD,CAAUzB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAChD4E,CAAU7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKiP,CAAUgB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CACxC,CAAA,CAAA,CACD,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOjQ,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0BD,KACtC,CAOY,CAAA/L,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACZoH,iCAIA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI2E,CAAU5M,CAAAA,CAAAA,CACd,CAAIiI,CAAAA,CAAAA,CAAAA,CAAc,CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMgG,QAAiBlQ,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOvC,CAASlC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAE5C,CAAIgG,CAAAA,CAAAA,CAAAA,CACHrB,CAAU7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKiP,CAAUiB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACnB,CACN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM9F,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQD,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS5K,KAAEA,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAEA,CAAKC,CAAAA,CAAAA,CAAAA,CAAAA,CAAEA,CAAGb,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAEA,CAAImG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAEA,CAAMkF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAEA,CAC5DC,CAAAA,CAAAA,CAAAA,CACD,CACCE,CAAAA,CAAAA,CAAAA,CAAAA,CACAD,CACA5K,CAAAA,CAAAA,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CAAAA,CAAAA,CACAb,CACAmG,CAAAA,CAAAA,CAAAA,CAAAA,CACAkF,CACC,CAAA,CACD,CAAIsC,CAAAA,CAAAA,CAAAA,CAAAA,CAAwB,CACxB3N,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACH2N,CAAW7N,CAAAA,CAAAA,CAAUC,CAAUC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACrBW,CACVgN,CAAAA,CAAAA,CAAAA,CAAAA,CAAWvM,KAAK2O,CAAO1D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAmB1L,CAAMC,CAAAA,CAAAA,CAAOC,CAExD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM+D,CAAuC,CAAA,CAC5C,CAAY6I,CAAAA,CAAAA,CAAAA,CAAAA,CAAArM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK4O,WAAWxE,CAAS,CAAA,CAAA,CAAA,CAAA,CACrC,CAAYiC,CAAAA,CAAAA,CAAAA,CAAAA,CAAArM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK+O,CAAY5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAWkC,CAAArM,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKwP,CAAajD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUxH,CAAO,CAAA,CAAA,CAAA,CAAA,CAC/C,CAAWsH,CAAAA,CAAAA,CAAAA,CAAAA,CAAArM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACV,CAAMA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8P,CACVvD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACCtC,eAAAA,CAAyBd,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiBc,CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAGH4E,CAAU,CAAA,CAAA,CAAA,CACV,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMsB,CAAa3M,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM4M,SAAmBD,CAAaE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAChClJ,CAAQiJ,CAAAA,CAAAA,CAAUjJ,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACxBuF,CAAqCvF,CAAAA,CAAAA,CAAAA,CAASA,CAAM,CAAA,CAAA,CAAA,CAE1D,CAAKuF,CAAAA,CAAAA,CAAAA,CAAAA,CACJ,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIsB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqBoC,MAEtCvB,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMnC,CACjB,CAAA,CAAA,CAAA,CAEDmC,CAAW7M,CAAAA,CAAAA,CACX,CACD,CACD,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOhC,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0BD,KACtC,CAYM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAzE,CAAStH,CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI+L,CAAkB,CAAA,CAAA,CAAA,CAAG7O,CAAKwO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC9B,CAAI1L,CAAAA,CAAAA,CAAAA,CAAAA,CAAiB,CAAgB/D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK+D,CAAgB,CAAA,CAAA,CACzD,CAAMmE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAqBnE,CAAcE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAC7CsN,CAAiBC,CAAAA,CAAAA,CAAAA,CACtBA,CACEtK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CACNY,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKhD,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIqB,CAAiBsL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAmB3M,CAElDqD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,CAAO,CAAA,CAAA,CACnB,KAAKnH,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIC,CACH2G,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKmG,CACNsD,CAAAA,CAAAA,CAAAA,CAAAA,CACErJ,CAAWE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAIrI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOkO,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAO1DyD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiC,IAFtCvQ,CACAgF,CAAAA,CAAAA,CAAAA,CAAiBuJ,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI3P,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKoB,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEtDwQ,CAAmC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMD,CAAyBzQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CACvEiC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAqC,CAAM3Q,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,gBAAgBgC,CAA2BD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACjG,CAAQvJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKhI,CACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CACP,CAAM0R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUF,CAChB7B,CAAAA,CAAAA,CACC+B,CACA1J,CAAAA,CAAAA,CAAKT,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGzG,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgBkC,CAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM5Q,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB1O,CAAKwO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAmBxO,CAAKwO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACzD,CACA,CAAA,CAAA,CAAA,CAAA,CACD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CASJK,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CARY,CACrB,CAAGzH,CAAAA,CAAAA,CAAAA,CAAI,CAAKsJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA2B1Q,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgBxH,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKwJ,CAA2BxJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CACtG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKlH,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACjBtH,EAAIX,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGzG,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACjB,CAAG1O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CAAgBgC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA2BxJ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CACzDA,CAAKT,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAGzG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG1O,KAAK0O,CAAgBtH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAEAX,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC7B,CACIkK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACL,CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAUJ9B,CAAAA,CAAAA,CAAU,CATY,CAAA,CAAA,CAAA,CAAA,CAAA,CACrBzH,CAAIZ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAGC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGzG,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC5BgC,CACAxJ,CAAAA,CAAAA,CAAKT,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGzG,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACnB,CAAGtH,CAAAA,CAAAA,CAAAA,CAAI,CAAKpH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CAChBxH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKT,KAAK,CAAGzG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CAClBtH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CACL,CAAA,CAAA,CAACF,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOE,CAAIZ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAIC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGzG,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEdjI,KAC7B,CACIkK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACL,CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACC9B,CAAU,CAAA,CAAA,CAAA,CAAGzH,CAAIX,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAChB,CAAGzG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CACLiC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAGN,CAAIvJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,CAAAA,CAAAA,CAAKlI,SAASgI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAJA,CAAMhI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS,CAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOc,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0B,CAAYD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEnD,CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO7O,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACX,CAAeD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAc7O,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB1O,CAAKwO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAExD,CAOM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAArE,CAAUrH,CAAAA,CAAAA,CAChB,CACCA,CAAAA,CAAAA,CAAAA,CAAAA,CACA,CAAIhE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAamB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAsB,CAAMlB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK+D,GACxD,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAEMoE,CAFiBpE,CAAAA,CAAAA,CAAAA,CAAAA,CAAcE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAGtCmE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAIrI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAKmB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAwB,CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEVgG,MAAM,CACNY,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKhD,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIqB,CAAiBsL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAmB3M,CAEjDgN,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAqBC,CAAqC,CAAA,CAAA,CAChE5Q,CACAD,CAAAA,CAAAA,CAAAA,CACC4G,CACAkK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACAA,CAAQ7L,CAAAA,CAAAA,CAAAA,CAAiBuJ,UAAU,CAAI3P,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAKiS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAG1DlC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACL,CAAOgC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B7Q,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAuBxH,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKlH,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAoBmC,CAA6B7Q,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,2BAA2BoC,CAA2B9Q,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CAAoBmC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B7Q,CAAK0O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACtPxH,CACEV,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CACTC,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOoK,CAA6B7Q,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0O,CAE3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM1O,KAAK0O,CAAgB1O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKwO,CAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOxO,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0BD,CACtC,CAAA,CACD,CAAO7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKoK,CAAUtH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiB,CAAIE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CACrD,CAOM,CAAApE,CAAAA,CAAAA,CAAAA,CAAKkE,CACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI+L,CAAkBmC,CAAAA,CAAAA,CACtB,CAAIlO,CAAAA,CAAAA,CAAAA,CAAe,CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMxD,CAAaU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO9F,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAc/F,CAC7C,CAAA,CAAA,CAAA,CAAA,CAAIxD,EAAY,CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM2R,CAAsB3R,CAAAA,CAAAA,CAAW4R,CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIxR,CAAQyR,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKzR,CAAMJ,CAAAA,CAAAA,CAAAA,CAAa,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM6I,CAAkBpE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASkN,CAAYjO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAI,CAI3D6L,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAHkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC1G,CAAU,CAAA,CAAA,CAAGA,CAAStB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKtH,CACvDA,CAAAA,CAAAA,CAAAA,CAAK8Q,CAAWe,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS,EAAG,CAEH3K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAUwK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAYjO,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA6L,CAAUoC,CAAAA,CAAAA,CAAYjO,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAEjC,CAAA,CAAA,CACD,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOhD,KAAK8O,CACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGD,CAAcwC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAuBC,CAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAOM,CAAAvM,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOjC,CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACM+L,CADe/L,CAAAA,CAAAA,CAAAA,CAAiB9C,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOlH,CAAW3E,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACrB,IAAIwB,CAAOO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU4B,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAClE,CAAOzG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8O,CAA0BD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACtC,CAOY,CAAA,CAAA,CAAA,CAAA,CAAA5E,CAAMnH,CAAAA,CAAAA,0CAClB,CAAI+L,CAAAA,CAAAA,CAAAA,CAAAA,CAAkB,CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMoB,CACLnN,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAwB9C,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO7F,CAAehG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEpD,CAAImN,CAAAA,CAAAA,CAAAA,CAAa,CAIhBpB,CAAAA,CAAU,SAHkBoB,CAAYnE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKvB,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQgH,CAC5DrM,CAAAA,CAAAA,CAAAA,CAAAA,CAAiBqM,CAAOA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAIA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAIA,CAAIrM,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiBqM,CAEvBtB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY9G,CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAED,OAAOnJ,CAAK8O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA0BD,KACtC,CAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAI,CAAUuC,CAAAA,CAAAA,CAChB,CAAOA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQjH,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAASkH,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIA,CAAItN,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASsN,OAC5D,CAEO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA3C,CAA0BD,CAAAA,CAAAA,CACjC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI/P,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO+P,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACtC,CC9dY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO6C,CAGpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAArM,CACCC,CAAAA,CACiBxC,CAAA9C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa8C,CAAbA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAEjB9C,CAAK2R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAAIpD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQjJ,CAC3BtF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIvJ,CAAOE,CAAAA,CAAAA,CAAAA,CACzB,CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAYsM,SACX,CAA2B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAApB5H,CAAAhK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAkH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,CAAA9K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU8H,CACrC,CAED,CAAY6K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,MACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA2B,CAApB7H,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAhK,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CAAAkH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAAA,CAAAA,CAAAA,CAAA9K,CAAUsI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACrC,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAYsK,SACX,CAA2B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAApB9H,CAAAhK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAkH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,CAAA9K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU4I,CACrC,CACD,CAAYiK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,OACX,CAA2B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAApB/H,CAAAhK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAkH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,CAAA9K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU8S,CACrC,CAAA,CACD,CAAYC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,OACX,OAA2B,CAApBjI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAhK,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CAAAkH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAAA,CAAAA,CAAAA,CAAA9K,CAAUwI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACrC,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAYwK,QACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA2B,QAApBlI,CAAAhK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAkH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,CAAA9K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU+J,CACrC,CAAA,CAED,CAAYkJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,OACX,CAA2B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAApBnI,EAAAhK,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CAAAkH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAAA,CAAAA,CAAAA,CAAA9K,CAAUtB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACrC,CAEY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAwU,CACZlI,CAAAA,CAAAA,0CAIA,CAAclK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2R,CAAQ7O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAcoH,CAAenL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACvDiB,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAEN,CAAA,CAAA,CACY,CAAAuP,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACZnI,4CAIA,CACClK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CACLoH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACAA,CAAaE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACbF,CAAaC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACZD,CAAatL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACZsL,CAAazK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOyK,EAAa1K,CAAS0K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa3K,CACzD2K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAanF,CACbmF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAaD,CACLjK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKoS,CAAkBlI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAEhC,CAAA,CAAA,CAEM,CAAAoI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAclI,CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACCpK,KAAK4R,CACL5R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2R,CAAQvH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASpK,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe/D,CAAKqL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAE5D,CAAA,CAAA,CACM,CAAAmI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiBnI,CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOpK,CAAK4R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiBxH,CAAapK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKsS,CAAclI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC7D,CAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAoI,CAAerI,CAAAA,CAAAA,CACrB,CACCnK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK6R,CACL7R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2R,CAAQxH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUnK,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe/D,KAAKoL,CAAa,CAAA,CAAA,CAAA,CAAA,CAE9D,CACM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAsI,CAAkBtI,CAAAA,CAAAA,CACxB,CAAOnK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK6R,CAAkB1H,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAcnK,CAAKwS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAerI,CAChE,CAAA,CAEM,CAAAuI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAelJ,GACrB,CAAIxJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK+R,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACtB,CAAMY,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe3S,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO9F,CAAc7I,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAC9CxD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAaZ,CAAUC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU6K,CACvC,CAAA,CAAA,CAAA,CAAA,CAAImJ,GAAgBrT,CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOI,CAAMiT,CAAAA,CAAAA,CAAAA,CAAcC,CAAOtT,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAE/C,CAAA,CAAA,CAAA,CACD,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACP,CAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAuT,CAAkBrJ,CAAAA,CAAAA,CACxB,CACCxJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8R,CACHpT,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUC,CAAU6K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACrBxJ,CAAK0S,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAelJ,CAEtB,CAAA,CAEM,CAAAsJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY/N,CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACC/E,CAAKiS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACLjS,CAAK2R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ5M,OAAO/E,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe/D,CAAKgG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAExD,CAAA,CAAA,CAEM,CAAAgO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAehO,CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO/E,CAAKiS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAelN,CAAW/E,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8S,CAAY/N,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACvD,CAKY,CAAAiO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACZ5J,iCAEA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIpJ,CAAKkS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiB9I,CAAY,CAAA,CACrC,CAAMyF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB7O,KAAK2R,CAAQ1H,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAMjK,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACxCmQ,CAAyBjT,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAOxD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW/B,CAEtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS6J,CAAoBpE,CAAAA,CAAAA,CAAAA,CAAQ9P,CAAKkU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAAA,CAAAA,CAAAA,CAAkB9J,aAC5D,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IACP,CAKY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA+J,CACZ9J,CAAAA,CAAAA,0CAEA,CACCpJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKkS,iBACH9I,CACMpJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKgT,CAAgB5J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAE9B,CAAA,CAAA,CAOD,CAAW+J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACV,CAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQC,CAAI,CAAA,CAAA,CAAA,CAClBrT,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO7F,CAAe9I,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,eAAe,CAC/C9C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO7F,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe9I,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CAE9CwQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAEC,CAAAA,CAAAA,CAAYC,cAAkC,CAAArF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAsF,OAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAtF,CAAAsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAEjDzT,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO7H,CAAa9G,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CACF,CAAA,CAAEsH,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEXpK,KAAK2O,CAAOrH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAActH,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAChC,CAAE,CAAA,CACF,CAAEqH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAEZnK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO9F,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAc7I,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAChC,CAAE,CAAA,CACF,CAAElE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEPoB,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOlG,CAAazI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CACF,CAAA,CAAElE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEPoB,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOtG,CAAerI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,eACjC,CAAE,CAAA,CACF,CAAElE,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAEPoB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO9G,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAc7H,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAChC,CAAE,CAAA,CACF,CAAElE,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAEPoB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAOlH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAWzH,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC7B,CAAE,CAAA,CACF,CAAEiC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAETwO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,CAAE,CAAA,CAAG,CAAEtJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAE3BuJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACD,CAAE,CACF,CAAA,CACAvJ,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACPrL,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAIsC,CAD3C8U,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACD,CADC1J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAhK,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACN,CAAAkH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAAA,CAAAA,CAAAA,CAAApE,UAAUhI,CAAYA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAsB,CAAA8V,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAAA,CAAAA,CAAAA,CAC5C5P,CAAkBlB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAeC,CAAW7C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CACF,CAAA,CAAEwD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAGNtG,KAAKmS,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAE7L,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC7B,CACDgN,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAMH,CAAYhF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOwF,CAAKR,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQjU,CAASiU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS,CAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAMD,CAAWS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACV,CAAOR,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQC,CAAI,CAAA,CAAA,CAAA,CAClBrT,CAAK2R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ7O,CACb9C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAO7F,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe9I,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC9BwQ,CACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAEO,EAAW/K,cACZ,CAGG9I,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKmS,CAEL0B,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU9U,CAAKiB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAG0B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAD/CkH,CAAAhK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,oCACF8C,CAAUhI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAYA,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA8V,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,CAC5C5P,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACFlB,CAAeC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW7C,CAAK8C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAE/BgG,EAEF,CAEH,CAAA,CAAA,CACD,CAAWgL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACV,CAAO9T,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK4T,CAAMN,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM1T,CAAcI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK8C,CAAkBlD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC7D,CCvPY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOmU,CAIpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA1O,CAA6BC,CAAAA,CAAAA,CAAAtF,CAAiBsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAjBA,CAC5BtF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIvJ,CAAOE,CAAAA,CAAAA,CAAAA,CAAAA,CACzBtF,CAAK2R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAAIpD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQjJ,CAC3B,CAAA,CAEM,aAAAxC,CAAcA,CAAAA,CAAAA,CACpB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI4O,CAAoB1R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKsF,CAAmBxC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACvD,CAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAkR,CAAgB5J,CAAAA,CAAAA,CACtB,CAAOpK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2R,CAAQvH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAWrL,KAAKqL,CACpC,CAAA,CACM,CAAA6J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAkB7J,CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAASA,CAAapK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKgU,CAAgB5J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC3C,CAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA8J,CAAiB/J,CAAAA,CAAAA,CACvB,CAAOnK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2R,QAAQxH,CAAYpL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKoL,CACrC,CAAA,CACM,CAAAgK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAmBhK,CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAASA,CAAcnK,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKkU,CAAiB/J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC7C,CAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAiK,CAAiB5K,CAAAA,CAAAA,CACvB,CAAS9K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAUC,CAAU6K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAC7B,CACM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA6K,CAAmB7K,CAAAA,CAAAA,CACzB,CAASA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAcxJ,CAAKoU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiB5K,CAC7C,CAAA,CAEM,CAAA8K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAcvP,GACpB,CAAO/E,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2R,CAAQ5M,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAShG,CAAKgG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAClC,CACM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAwP,CAAgBxP,CAAAA,CAAAA,CACtB,CAASA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW/E,CAAKsU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAcvP,CACvC,CAAA,CAEY,iBAAAyP,CACZpL,CAAAA,CAAAA,0CAEA,CAAM6J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyBjT,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOxD,CAAW/B,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACtD,CACG6J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACOjT,KAAKsF,CAAkB+D,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW4J,CAAiB9J,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAE7D,CAAA,CAAA,CACY,CAAAsL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACZrL,iCAEA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAASA,CAAsBpJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKwU,CAAkBpL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EACtD,CAAA,CAAA,CAEY,CAAAsL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACZlL,CACAJ,CAAAA,CAAAA,CAAAA,0CAEA,MAAM6G,CAAoBjQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2O,CAAOxD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAW/B,CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACCpJ,CAAKoU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAiB5K,CACpByG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACQjQ,CAAKsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACb4G,CAAK1C,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACLH,CAAW4G,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY9G,iBAEvBzJ,CAAMhB,CAAAA,CAAAA,CAAUC,CAAU6K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAYI,CACtC3E,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACA,UAGH,CACY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA0P,CACZnL,CAAAA,CACAJ,4CAEA,CAAM6G,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAoBjQ,CAAK2O,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOxD,CAAW/B,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACjD,CACCpJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKoU,CAAiB5K,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACpByG,CACMjQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK0U,CAAoBlL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAWJ,MAE7C,CAEY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAwL,CACZxL,CAAAA,CACAI,iCAEA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAaxJ,CAAK0U,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAoBlL,EAAWJ,KACjD,CAEY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAyL,CACZzL,CAAAA,CACAI,iCAEA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAaxJ,CAAK2U,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAuBnL,EAAWJ,KACpD,CC5EY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO0L,CAKpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAzP,CAA4BC,CAAAA,CAAAA,CAAAtF,CAAiBsF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAjBA,CAC3BtF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKmQ,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI4D,CAAUzO,CAAAA,CAAAA,CAAAA,CAAAA,CAC/BtF,KAAK2O,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIvJ,CAAOE,CAAAA,CAAAA,CAAAA,CAAAA,CACzBtF,CAAK2R,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAAIpD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQjJ,CAC3B,CAAA,CAAA"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index acf2ba6..b11e917 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,42 +1,7 @@ -import { - BelfiorePlace, - IBelfioreConnector, -} from "@marketto/belfiore-connector"; -export { BelfiorePlace } from "@marketto/belfiore-connector"; -import { Moment } from "moment"; +import { BelfiorePlace, IBelfioreConnector } from '@marketto/belfiore-connector'; +export { BelfiorePlace } from '@marketto/belfiore-connector'; -type DateDay = - | 1 - | 2 - | 3 - | 4 - | 5 - | 6 - | 7 - | 8 - | 9 - | 10 - | 11 - | 12 - | 13 - | 14 - | 15 - | 16 - | 17 - | 18 - | 19 - | 20 - | 21 - | 22 - | 23 - | 24 - | 25 - | 26 - | 27 - | 28 - | 29 - | 30 - | 31; +type DateDay = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31; declare const YEAR: string; declare const MONTH: string; @@ -70,500 +35,408 @@ declare const dateMatcher_const_TIME: typeof TIME; declare const dateMatcher_const_TIMEZONE: typeof TIMEZONE; declare const dateMatcher_const_YEAR: typeof YEAR; declare namespace dateMatcher_const { - export { - dateMatcher_const_DAY as DAY, - dateMatcher_const_DAYS_30_MONTHS as DAYS_30_MONTHS, - dateMatcher_const_DAYS_31_MONTHS as DAYS_31_MONTHS, - dateMatcher_const_HOURS as HOURS, - dateMatcher_const_ISO8601_DATE_TIME as ISO8601_DATE_TIME, - dateMatcher_const_ISO8601_SHORT_DATE as ISO8601_SHORT_DATE, - dateMatcher_const_LEAP_MONTH as LEAP_MONTH, - dateMatcher_const_MILLISECONDS as MILLISECONDS, - dateMatcher_const_MINUTES as MINUTES, - dateMatcher_const_MONTH as MONTH, - dateMatcher_const_MONTH_DAY as MONTH_DAY, - dateMatcher_const_SECONDS as SECONDS, - dateMatcher_const_TIME as TIME, - dateMatcher_const_TIMEZONE as TIMEZONE, - dateMatcher_const_YEAR as YEAR, - }; + export { dateMatcher_const_DAY as DAY, dateMatcher_const_DAYS_30_MONTHS as DAYS_30_MONTHS, dateMatcher_const_DAYS_31_MONTHS as DAYS_31_MONTHS, dateMatcher_const_HOURS as HOURS, dateMatcher_const_ISO8601_DATE_TIME as ISO8601_DATE_TIME, dateMatcher_const_ISO8601_SHORT_DATE as ISO8601_SHORT_DATE, dateMatcher_const_LEAP_MONTH as LEAP_MONTH, dateMatcher_const_MILLISECONDS as MILLISECONDS, dateMatcher_const_MINUTES as MINUTES, dateMatcher_const_MONTH as MONTH, dateMatcher_const_MONTH_DAY as MONTH_DAY, dateMatcher_const_SECONDS as SECONDS, dateMatcher_const_TIME as TIME, dateMatcher_const_TIMEZONE as TIMEZONE, dateMatcher_const_YEAR as YEAR }; } type DateMonth = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; -type MultiFormatDate = string | Date | Moment | number[]; +type MultiFormatDate = string | Date | number[]; declare class DateUtils { - /** - * Parse a Dated and Gender information to create Date/Gender CF part - * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day] - * @returns Parsed Date or null if not valid - */ - static parseDate(date?: MultiFormatDate | null): Date | null; - static ymdToDate( - year?: number | null, - month?: DateMonth | null, - day?: DateDay | null - ): Date | null; + /** + * Parse a Dated and Gender information to create Date/Gender CF part + * @param date Date instance, ISO8601 date string or array of numbers [year, month, day] + * @returns Parsed Date or null if not valid + */ + static parseDate(date?: MultiFormatDate | null): Date | null; + static ymdToDate(year?: number | null, month?: DateMonth | null, day?: DateDay | null): Date | null; } type Genders = "M" | "F"; interface IPersonalInfo { - firstName?: string; - lastName?: string; - date?: Date; - day?: DateDay; - month?: DateMonth; - year?: number; - gender?: Genders; - place?: BelfiorePlace; - omocodeId?: number; + firstName?: string; + lastName?: string; + date?: Date; + day?: DateDay; + month?: DateMonth; + year?: number; + gender?: Genders; + place?: BelfiorePlace; + omocodeId?: number; } interface IMismatchVerboseErrors { - firstName?: string; - lastName?: string; - date?: string; - gender?: string; - place?: string; - crc?: string; + firstName?: string; + lastName?: string; + date?: string; + gender?: string; + place?: string; + crc?: string; } declare class CFMismatchValidator { - private readonly codiceFiscale; - private pattern; - private parser; - constructor(belfioreConnector: IBelfioreConnector, codiceFiscale: string); - private get hasLastName(); - private get hasFirstName(); - private get hasBirthYear(); - private get hasBirthDate(); - private get hasGender(); - private get hasBirthPlace(); - private get hasCRC(); - matchPersonalInfo( - personalInfo: Omit & { - place?: string | BelfiorePlace; - } - ): Promise; - mismatchPersonalInfo( - personalInfo: Omit & { - place?: string | BelfiorePlace; - } - ): Promise; - matchLastName(lastName?: string): boolean; - mismatchLastName(lastName?: string): boolean; - matchFirstName(firstName: string): boolean; - mismatchFirstName(firstName: string): boolean; - matchBirthDate(birthDate: MultiFormatDate): boolean; - mismatchBirthDate(birthDate: MultiFormatDate): boolean; - matchGender(gender: Genders | string): boolean; - mismatchGender(gender: Genders | string): boolean; - /** - * @param birthPlace BirthPlace, place name or BelfioreCode - */ - matchBirthPlace(birthPlace: BelfiorePlace | string): Promise; - /** - * @param birthPlace BirthPlace, place name or BelfioreCode - */ - mismatchBirthPlace(birthPlace: BelfiorePlace | string): Promise; - /** - * Check the given cf validity by form, birth date/place and digit code - * @param codiceFiscale Complete CF to parse - * @return Verbose errors - */ - get errors(): Promise; - /** - * Check the given cf validity by form, birth date/place and digit code - * @return Generic or specific regular expression - */ - get valid(): Promise; - get invalid(): Promise; + private readonly codiceFiscale; + private pattern; + private parser; + constructor(belfioreConnector: IBelfioreConnector, codiceFiscale: string); + private get hasLastName(); + private get hasFirstName(); + private get hasBirthYear(); + private get hasBirthDate(); + private get hasGender(); + private get hasBirthPlace(); + private get hasCRC(); + matchPersonalInfo(personalInfo: Omit & { + place?: string | BelfiorePlace; + }): Promise; + mismatchPersonalInfo(personalInfo: Omit & { + place?: string | BelfiorePlace; + }): Promise; + matchLastName(lastName?: string): boolean; + mismatchLastName(lastName?: string): boolean; + matchFirstName(firstName: string): boolean; + mismatchFirstName(firstName: string): boolean; + matchBirthDate(birthDate: MultiFormatDate): boolean; + mismatchBirthDate(birthDate: MultiFormatDate): boolean; + matchGender(gender: Genders | string): boolean; + mismatchGender(gender: Genders | string): boolean; + /** + * @param birthPlace BirthPlace, place name or BelfioreCode + */ + matchBirthPlace(birthPlace: BelfiorePlace | string): Promise; + /** + * @param birthPlace BirthPlace, place name or BelfioreCode + */ + mismatchBirthPlace(birthPlace: BelfiorePlace | string): Promise; + /** + * Check the given cf validity by form, birth date/place and digit code + * @param codiceFiscale Complete CF to parse + * @return Verbose errors + */ + get errors(): Promise; + /** + * Check the given cf validity by form, birth date/place and digit code + * @return Generic or specific regular expression + */ + get valid(): Promise; + get invalid(): Promise; } -interface IGeneratorWrapper - extends Generator { - [Symbol.iterator]: () => Generator; +interface IGeneratorWrapper extends Generator { + [Symbol.iterator]: () => Generator; } -type CodiceFiscaleCRC = - | "A" - | "B" - | "C" - | "D" - | "E" - | "F" - | "G" - | "H" - | "I" - | "J" - | "K" - | "L" - | "M" - | "N" - | "O" - | "P" - | "Q" - | "R" - | "S" - | "T" - | "U" - | "V" - | "W" - | "X" - | "Y" - | "Z"; +type CodiceFiscaleCRC = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"; declare class CheckDigitizer { - /** - * Evaluate given partial CF to produce last check digit character - * @param codiceFiscale Partial or complete Fiscal Code to evaluate to produce last character - * @returns 16th CF char - */ - static checkDigit(codiceFiscale: string): CodiceFiscaleCRC | null; - static evaluateChar(partialCF?: string): IGeneratorWrapper; - private static CHAR_OFFSET; - private static CRC_MOD; - /** - * Partial FiscalCode Evaluator - * @param Partial Fiscal Code to evaluate - * @yields character value odd/even - */ - private static evaluateCharGenerator; + /** + * Evaluate given partial CF to produce last check digit character + * @param codiceFiscale Partial or complete Fiscal Code to evaluate to produce last character + * @returns 16th CF char + */ + static checkDigit(codiceFiscale: string): CodiceFiscaleCRC | null; + static evaluateChar(partialCF?: string): IGeneratorWrapper; + private static CHAR_OFFSET; + private static CRC_MOD; + /** + * Partial FiscalCode Evaluator + * @param Partial Fiscal Code to evaluate + * @yields character value odd/even + */ + private static evaluateCharGenerator; } declare class Gender { - static getDay(genderDay: number): DateDay | null; - static getGender(genderDay: number): Genders | null; - static genderizeDay(day: number, gender: Genders): number; - static toArray(): Genders[]; - private static MAX_MONTH_DAY; + static getDay(genderDay: number): DateDay | null; + static getGender(genderDay: number): Genders | null; + static genderizeDay(day: number, gender: Genders): number; + static toArray(): Genders[]; + private static MAX_MONTH_DAY; } declare class Parser { - private readonly belfioreConnector; - constructor(belfioreConnector: IBelfioreConnector); - /** - * Default omocode bitmap - */ - OMOCODE_BITMAP: number; - /** - * Convert omocode CF into plain one - * @param codiceFiscale Partial or complete Omocode/Regular CF to parse, starting from LastName - * @returns Regular CF w/o omocodes chars - */ - cfDeomocode(codiceFiscale: string): string; - cfOmocode(codiceFiscale: string, omocodeId: number): string; - cfOmocodeId(codiceFiscale: string): number; - /** - * Parse lastName information - * @param codiceFiscale Partial or complete CF to parse - * @returns Partial/possible lastName - */ - cfToLastName(codiceFiscale: string): string | null; - /** - * Parse firstName information - * @param codiceFiscale Partial or complete CF to parse - * @returns Partial/possible firstName - */ - cfToFirstName(codiceFiscale: string): string | null; - /** - * Parse gender information - * @param codiceFiscale Partial or complete CF to parse - * @returns Male or female - */ - cfToGender(codiceFiscale: string): Genders | null; - /** - * Parse birth year information - * @param codiceFiscale Partial or complete CF to parse - * @returns Birth Year (4 digits) - */ - cfToBirthYear(codiceFiscale: string): number | null; - /** - * Parse birth month information - * @param codiceFiscale Partial or complete CF to parse - * @returns Birth Month (0...11 - Date notation) - */ - cfToBirthMonth(codiceFiscale: string): DateMonth | null; - /** - * Parse birth day information - * @param codiceFiscale Partial or complete CF to parse - * @returns Birth day (1..31) - */ - cfToBirthDay(codiceFiscale: string): DateDay | null; - /** - * Parse birth date information - * @param codiceFiscale Partial or complete CF to parse - * @returns Birth Date - */ - cfToBirthDate(codiceFiscale: string): Date | null; - /** - * Parse birth place information - * @param codiceFiscale Partial or complete CF to parse - * @param checkBirthDateConsistency Ensure birthday is between creation and expiran date of the cf city or country, default value: true - * @returns Birth place - */ - cfToBirthPlace( - codiceFiscale: string, - checkBirthDateConsistency?: boolean - ): Promise; - /** - * @param fiscalCode 16 character Codice Fiscale to decode - * @returns Decoded CF Info - */ - cfDecode(fiscalCode: string): Promise; - /** - * Parse lastName to cf part - * @param lastName Partial or complete CF to parse - * @returns partial cf - */ - lastNameToCf(lastName?: string | null): string | null; - /** - * Parse firstName to cf part - * @param firstName Partial or complete CF to parse - * @returns partial cf - */ - firstNameToCf(firstName?: string | null): string | null; - /** - * Parse year to cf part - * @param year Birth year 2 or 4 digit string, number above 19XX or below 100 - * @returns partial cf - */ - yearToCf(year: string | number): string | null; - /** - * Parse month information - * @param month Month number 0..11 - * @returns Birth Month CF code - */ - monthToCf(month: DateMonth | number): string | null; - /** - * Parse day information - * @param day Day number 1..31 - * @param gender Gender enum value - * @returns Birth Day CF code - */ - dayGenderToCf(day: DateDay | number, gender: Genders): string | null; - /** - * Parse Year, Month, Day to Dated - * @param year 4 digits Year - * @param month 1 or 2 digits Month 0..11 - * @param day 1,2 digits Day 1..31 - * @returns Date or null if provided year/month/day are not valid - */ - yearMonthDayToDate( - year: number | null | undefined, - month?: DateMonth | null | undefined, - day?: DateDay | null | undefined - ): Date | null; - /** - * Parse Place information to return city or country details - * @param place Belfiore place instance, belfiore code or city/country name - * @returns BelfiorePlace instance with the target city or country details - */ - parsePlace(place: BelfiorePlace | string): Promise; - /** - * Parse Date and Gender information to create Date/Gender CF part - * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day] - * @param gender Gender enum value - * @returns Birth date and Gender CF code - */ - dateGenderToCf(date: MultiFormatDate, gender: Genders): string | null; - /** - * Parse place name and province to Belfiore code - * @param cityOrCountryName City or Country name - * @param provinceId Province code for cities - * @returns Matching place belfiore code, if only once is matching criteria - */ - /** - * Parse a Date and Gender information to create Date/Gender CF part - * @param birthDate Date or Moment instance, ISO8601 date string or array of numbers [year, month, day] - * @param cityOrCountryName City or Country name - * @param provinceId Province code for cities - * @returns Matching place belfiore code, if only once is matching criteria - */ - placeToCf( - cityOrCountryName: string, - provinceId?: string - ): Promise; - placeToCf( - birthDate: MultiFormatDate, - cityOrCountryName: string, - provinceId?: string - ): Promise; - /** - * Generates full CF - * @returns Complete CF - */ - encodeCf({ - lastName, - firstName, - year, - month, - day, - date, - gender, - place, - omocodeId, - }: Omit & { - place?: BelfiorePlace | string | undefined; - }): Promise; - private JOLLY_CHAR; - private checkBitmap; - private charOmocode; - private charExtractor; - /** - * Convert omocode full or chunk CF into plain one - * @param partialCodiceFiscale Partial or complete Omocode/Regular CF to parse - * @param offset starting point of the given chunk in the 16 char CF - * @returns Regular version w/o omocodes chars of the given chunk - */ - private partialCfDeomocode; - private appyCaseToChar; + private readonly belfioreConnector; + constructor(belfioreConnector: IBelfioreConnector); + /** + * Default omocode bitmap + */ + OMOCODE_BITMAP: number; + /** + * Convert omocode CF into plain one + * @param codiceFiscale Partial or complete Omocode/Regular CF to parse, starting from LastName + * @returns Regular CF w/o omocodes chars + */ + cfDeomocode(codiceFiscale: string): string; + cfOmocode(codiceFiscale: string, omocodeId: number): string; + cfOmocodeId(codiceFiscale: string): number; + /** + * Parse lastName information + * @param codiceFiscale Partial or complete CF to parse + * @returns Partial/possible lastName + */ + cfToLastName(codiceFiscale: string): string | null; + /** + * Parse firstName information + * @param codiceFiscale Partial or complete CF to parse + * @returns Partial/possible firstName + */ + cfToFirstName(codiceFiscale: string): string | null; + /** + * Parse gender information + * @param codiceFiscale Partial or complete CF to parse + * @returns Male or female + */ + cfToGender(codiceFiscale: string): Genders | null; + /** + * Parse birth year information + * @param codiceFiscale Partial or complete CF to parse + * @returns Birth Year (4 digits) + */ + cfToBirthYear(codiceFiscale: string): number | null; + /** + * Parse birth month information + * @param codiceFiscale Partial or complete CF to parse + * @returns Birth Month (0...11 - Date notation) + */ + cfToBirthMonth(codiceFiscale: string): DateMonth | null; + /** + * Parse birth day information + * @param codiceFiscale Partial or complete CF to parse + * @returns Birth day (1..31) + */ + cfToBirthDay(codiceFiscale: string): DateDay | null; + /** + * Parse birth date information + * @param codiceFiscale Partial or complete CF to parse + * @returns Birth Date + */ + cfToBirthDate(codiceFiscale: string): Date | null; + /** + * Parse birth place information + * @param codiceFiscale Partial or complete CF to parse + * @param checkBirthDateConsistency Ensure birthday is between creation and expiran date of the cf city or country, default value: true + * @returns Birth place + */ + cfToBirthPlace(codiceFiscale: string, checkBirthDateConsistency?: boolean): Promise; + /** + * @param fiscalCode 16 character Codice Fiscale to decode + * @returns Decoded CF Info + */ + cfDecode(fiscalCode: string): Promise; + /** + * Parse lastName to cf part + * @param lastName Partial or complete CF to parse + * @returns partial cf + */ + lastNameToCf(lastName?: string | null): string | null; + /** + * Parse firstName to cf part + * @param firstName Partial or complete CF to parse + * @returns partial cf + */ + firstNameToCf(firstName?: string | null): string | null; + /** + * Parse year to cf part + * @param year Birth year 2 or 4 digit string, number above 19XX or below 100 + * @returns partial cf + */ + yearToCf(year: string | number): string | null; + /** + * Parse month information + * @param month Month number 0..11 + * @returns Birth Month CF code + */ + monthToCf(month: DateMonth | number): string | null; + /** + * Parse day information + * @param day Day number 1..31 + * @param gender Gender enum value + * @returns Birth Day CF code + */ + dayGenderToCf(day: DateDay | number, gender: Genders): string | null; + /** + * Parse Year, Month, Day to Dated + * @param year 4 digits Year + * @param month 1 or 2 digits Month 0..11 + * @param day 1,2 digits Day 1..31 + * @returns Date or null if provided year/month/day are not valid + */ + yearMonthDayToDate(year: number | null | undefined, month?: DateMonth | null | undefined, day?: DateDay | null | undefined): Date | null; + /** + * Parse Place information to return city or country details + * @param place Belfiore place instance, belfiore code or city/country name + * @returns BelfiorePlace instance with the target city or country details + */ + parsePlace(place: BelfiorePlace | string): Promise; + /** + * Parse Date and Gender information to create Date/Gender CF part + * @param date Date instance, ISO8601 date string or array of numbers [year, month, day] + * @param gender Gender enum value + * @returns Birth date and Gender CF code + */ + dateGenderToCf(date: MultiFormatDate, gender: Genders): string | null; + /** + * Parse place name and province to Belfiore code + * @param cityOrCountryName City or Country name + * @param provinceId Province code for cities + * @returns Matching place belfiore code, if only once is matching criteria + */ + /** + * Parse a Date and Gender information to create Date/Gender CF part + * @param birthDate Date instance, ISO8601 date string or array of numbers [year, month, day] + * @param cityOrCountryName City or Country name + * @param provinceId Province code for cities + * @returns Matching place belfiore code, if only once is matching criteria + */ + placeToCf(cityOrCountryName: string, provinceId?: string): Promise; + placeToCf(birthDate: MultiFormatDate, cityOrCountryName: string, provinceId?: string): Promise; + /** + * Generates full CF + * @returns Complete CF + */ + encodeCf({ lastName, firstName, year, month, day, date, gender, place, omocodeId, }: Omit & { + place?: BelfiorePlace | string | undefined; + }): Promise; + private JOLLY_CHAR; + private checkBitmap; + private charOmocode; + private charExtractor; + /** + * Convert omocode full or chunk CF into plain one + * @param partialCodiceFiscale Partial or complete Omocode/Regular CF to parse + * @param offset starting point of the given chunk in the 16 char CF + * @returns Regular version w/o omocodes chars of the given chunk + */ + private partialCfDeomocode; + private appyCaseToChar; } declare class Pattern { - private readonly belfioreConnector; - private parser; - constructor(belfioreConnector: IBelfioreConnector); - /** - * Validation regexp for the given lastName or generic - * @param lastName Optional lastName to generate validation regexp - * @return CF Surname matcher - * @throw INVALID_SURNAME - */ - cfLastName(lastName?: string): RegExp; - /** - * Validation regexp for the given name or generic - * @param name Optional name to generate validation regexp - * @return CF name matcher - * @throw INVALID_NAME - */ - cfFirstName(name?: string): RegExp; - /** - * Validation regexp for the given year or generic - * @param year Optional year to generate validation regexp - * @return CF year matcher - */ - cfYear(year?: number): RegExp; - /** - * Validation regexp for the given month or generic - * @param month Optional month to generate validation regexp - * @return CF month matcher - */ - cfMonth(month?: DateMonth): RegExp; - /** - * Validation regexp for the given day or generic - * @param day Optional day to generate validation regexp - * @return CF day matcher - */ - cfDay(day?: DateDay): RegExp; - /** - * Validation regexp for the given year or generic - * @param day Optional day to generate validation regexp - * @param gender Gender @see Genders - * @return CF day and gender matcher - */ - cfDayGender(day?: DateDay, gender?: Genders): RegExp; - /** - * Validation regexp for the given year or generic - * @param date Optional date to generate validation regexp - * @param gender @see Genders - * @return CF date and gender matcher - */ - cfDateGender(date?: MultiFormatDate | null, gender?: Genders | null): RegExp; - /** - * @param placeName Optional place name to generate validation regexp - * @return CF place matcher - */ - /** - * @param date Optional date to generate validation regexp - * @param placeName Optional place name to generate validation regexp - * @return CF place matcher - */ - cfPlace(placeName?: string | null): Promise; - cfPlace( - birthDate?: MultiFormatDate | null, - placeName?: string | null - ): Promise; - /** - * Generates full CF validator based on given optional input or generic - * @param personalInfo Input Object - * @return CodiceFiscale matcher - */ - codiceFiscale( - personalInfo?: Omit & { - place?: BelfiorePlace | string | undefined; - } - ): Promise; - private LETTER_SET; - private SEPARATOR_SET; - /** - * Returns lastName validator based on given cf or generic - * @param codiceFiscale Partial or complete CF to parse - * @return Generic or specific regular expression - */ - lastName(codiceFiscale?: string): RegExp; - /** - * Returns name validator based on given cf or generic - * @param codiceFiscale Partial or complete CF to parse - * @return Generic or specific regular expression - */ - firstName(codiceFiscale?: string): RegExp; - /** - * Returns iso8601 date validator based on given cf or generic - * @param codiceFiscale Partial or complete CF to parse - * @return Generic or specific regular expression - */ - date(codiceFiscale?: string): RegExp; - /** - * Returns gender validator based on given cf or generic - * @param codiceFiscale Partial or complete CF to parse - * @return Generic or specific regular expression - */ - gender(codiceFiscale?: string): RegExp; - /** - * Returns place validator based on given cf or generic - * @param codiceFiscale Partial or complete CF to parse - * @return Generic or specific regular expression - */ - place(codiceFiscale?: string): Promise; - deomocode(omocode: string): string; - private isolatedInsensitiveTailor; + private readonly belfioreConnector; + private parser; + constructor(belfioreConnector: IBelfioreConnector); + /** + * Validation regexp for the given lastName or generic + * @param lastName Optional lastName to generate validation regexp + * @return CF Surname matcher + * @throw INVALID_SURNAME + */ + cfLastName(lastName?: string): RegExp; + /** + * Validation regexp for the given name or generic + * @param name Optional name to generate validation regexp + * @return CF name matcher + * @throw INVALID_NAME + */ + cfFirstName(name?: string): RegExp; + /** + * Validation regexp for the given year or generic + * @param year Optional year to generate validation regexp + * @return CF year matcher + */ + cfYear(year?: number): RegExp; + /** + * Validation regexp for the given month or generic + * @param month Optional month to generate validation regexp + * @return CF month matcher + */ + cfMonth(month?: DateMonth): RegExp; + /** + * Validation regexp for the given day or generic + * @param day Optional day to generate validation regexp + * @return CF day matcher + */ + cfDay(day?: DateDay): RegExp; + /** + * Validation regexp for the given year or generic + * @param day Optional day to generate validation regexp + * @param gender Gender @see Genders + * @return CF day and gender matcher + */ + cfDayGender(day?: DateDay, gender?: Genders): RegExp; + /** + * Validation regexp for the given year or generic + * @param date Optional date to generate validation regexp + * @param gender @see Genders + * @return CF date and gender matcher + */ + cfDateGender(date?: MultiFormatDate | null, gender?: Genders | null): RegExp; + /** + * @param placeName Optional place name to generate validation regexp + * @return CF place matcher + */ + /** + * @param date Optional date to generate validation regexp + * @param placeName Optional place name to generate validation regexp + * @return CF place matcher + */ + cfPlace(placeName?: string | null): Promise; + cfPlace(birthDate?: MultiFormatDate | null, placeName?: string | null): Promise; + /** + * Generates full CF validator based on given optional input or generic + * @param personalInfo Input Object + * @return CodiceFiscale matcher + */ + codiceFiscale(personalInfo?: Omit & { + place?: BelfiorePlace | string | undefined; + }): Promise; + private LETTER_SET; + private SEPARATOR_SET; + /** + * Returns lastName validator based on given cf or generic + * @param codiceFiscale Partial or complete CF to parse + * @return Generic or specific regular expression + */ + lastName(codiceFiscale?: string): RegExp; + /** + * Returns name validator based on given cf or generic + * @param codiceFiscale Partial or complete CF to parse + * @return Generic or specific regular expression + */ + firstName(codiceFiscale?: string): RegExp; + /** + * Returns iso8601 date validator based on given cf or generic + * @param codiceFiscale Partial or complete CF to parse + * @return Generic or specific regular expression + */ + date(codiceFiscale?: string): RegExp; + /** + * Returns gender validator based on given cf or generic + * @param codiceFiscale Partial or complete CF to parse + * @return Generic or specific regular expression + */ + gender(codiceFiscale?: string): RegExp; + /** + * Returns place validator based on given cf or generic + * @param codiceFiscale Partial or complete CF to parse + * @return Generic or specific regular expression + */ + place(codiceFiscale?: string): Promise; + deomocode(omocode: string): string; + private isolatedInsensitiveTailor; } declare class Validator { - private readonly belfioreConnector; - private parser; - private pattern; - constructor(belfioreConnector: IBelfioreConnector); - codiceFiscale(codiceFiscale: string): CFMismatchValidator; - isLastNameValid(lastName: string): boolean; - isLastNameInvalid(lastName: string): boolean; - isFirstNameValid(firstName: string): boolean; - isFirstNameInvalid(firstName: string): boolean; - isBirthDateValid(birthDate: MultiFormatDate): boolean; - isBirthDateInvalid(birthDate: MultiFormatDate): boolean; - isGenderValid(gender: Genders | string): boolean; - isGenderInvalid(gender: Genders | string): boolean; - isBirthPlaceValid(birthPlace: BelfiorePlace | string): Promise; - isBirthPlaceInvalid(birthPlace: BelfiorePlace | string): Promise; - birthDatePlaceMatch( - birthDate: MultiFormatDate, - birthPlace: BelfiorePlace | string - ): Promise; - birthDatePlaceMismatch( - birthDate: MultiFormatDate, - birthPlace: BelfiorePlace | string - ): Promise; - birthPlaceDateMatch( - birthPlace: BelfiorePlace | string, - birthDate: MultiFormatDate - ): Promise; - birthPlaceDateMismatch( - birthPlace: BelfiorePlace | string, - birthDate: MultiFormatDate - ): Promise; + private readonly belfioreConnector; + private parser; + private pattern; + constructor(belfioreConnector: IBelfioreConnector); + codiceFiscale(codiceFiscale: string): CFMismatchValidator; + isLastNameValid(lastName: string): boolean; + isLastNameInvalid(lastName: string): boolean; + isFirstNameValid(firstName: string): boolean; + isFirstNameInvalid(firstName: string): boolean; + isBirthDateValid(birthDate: MultiFormatDate): boolean; + isBirthDateInvalid(birthDate: MultiFormatDate): boolean; + isGenderValid(gender: Genders | string): boolean; + isGenderInvalid(gender: Genders | string): boolean; + isBirthPlaceValid(birthPlace: BelfiorePlace | string): Promise; + isBirthPlaceInvalid(birthPlace: BelfiorePlace | string): Promise; + birthDatePlaceMatch(birthDate: MultiFormatDate, birthPlace: BelfiorePlace | string): Promise; + birthDatePlaceMismatch(birthDate: MultiFormatDate, birthPlace: BelfiorePlace | string): Promise; + birthPlaceDateMatch(birthPlace: BelfiorePlace | string, birthDate: MultiFormatDate): Promise; + birthPlaceDateMismatch(birthPlace: BelfiorePlace | string, birthDate: MultiFormatDate): Promise; } declare const CONSONANT_LIST: string; @@ -648,134 +521,72 @@ declare const matcher_const_PARTIAL_YEAR: typeof PARTIAL_YEAR; declare const matcher_const_VOWEL_LIST: typeof VOWEL_LIST; declare const matcher_const_YEAR_MATCHER: typeof YEAR_MATCHER; declare namespace matcher_const { - export { - matcher_const_BELFIORE_CODE_MATCHER as BELFIORE_CODE_MATCHER, - matcher_const_CF_FULL_NAME_MATCHER as CF_FULL_NAME_MATCHER, - matcher_const_CF_NAME_MATCHER as CF_NAME_MATCHER, - matcher_const_CF_SURNAME_MATCHER as CF_SURNAME_MATCHER, - matcher_const_CHECK_DIGIT as CHECK_DIGIT, - matcher_const_CITY_CODE_LIST as CITY_CODE_LIST, - matcher_const_CITY_CODE_MATCHER as CITY_CODE_MATCHER, - matcher_const_CODICE_FISCALE as CODICE_FISCALE, - matcher_const_CONSONANT_LIST as CONSONANT_LIST, - matcher_const_COUNTRY_CODE_LIST as COUNTRY_CODE_LIST, - matcher_const_COUNTRY_CODE_MATCHER as COUNTRY_CODE_MATCHER, - matcher_const_DAY_29_MATCHER as DAY_29_MATCHER, - matcher_const_DAY_2X_MATCHER as DAY_2X_MATCHER, - matcher_const_DAY_30_MATCHER as DAY_30_MATCHER, - matcher_const_DAY_31_MATCHER as DAY_31_MATCHER, - matcher_const_DAY_3X_MATCHER as DAY_3X_MATCHER, - matcher_const_DAY_MATCHER as DAY_MATCHER, - matcher_const_FEMALE_DAY_MATCHER as FEMALE_DAY_MATCHER, - matcher_const_FEMALE_FULL_DATE_MATCHER as FEMALE_FULL_DATE_MATCHER, - matcher_const_FULL_DATE_MATCHER as FULL_DATE_MATCHER, - matcher_const_LEAP_YEAR_MATCHER as LEAP_YEAR_MATCHER, - matcher_const_MALE_DAY_MATCHER as MALE_DAY_MATCHER, - matcher_const_MALE_FULL_DATE_MATCHER as MALE_FULL_DATE_MATCHER, - matcher_const_MONTH_30DAYS_LIST as MONTH_30DAYS_LIST, - matcher_const_MONTH_31DAYS_LIST as MONTH_31DAYS_LIST, - matcher_const_MONTH_DAY_MATCHER as MONTH_DAY_MATCHER, - matcher_const_MONTH_LIST as MONTH_LIST, - matcher_const_MONTH_MATCHER as MONTH_MATCHER, - matcher_const_OMOCODE_NON_ZERO_NUMBER_LIST as OMOCODE_NON_ZERO_NUMBER_LIST, - matcher_const_OMOCODE_NUMBER_LIST as OMOCODE_NUMBER_LIST, - matcher_const_OMOCODE_ZERO_LIST as OMOCODE_ZERO_LIST, - matcher_const_PARTIAL_BELFIORE_CODE_MATCHER as PARTIAL_BELFIORE_CODE_MATCHER, - matcher_const_PARTIAL_CF as PARTIAL_CF, - matcher_const_PARTIAL_CF_FULL_NAME as PARTIAL_CF_FULL_NAME, - matcher_const_PARTIAL_CF_NAME_MATCHER as PARTIAL_CF_NAME_MATCHER, - matcher_const_PARTIAL_FULL_DATE as PARTIAL_FULL_DATE, - matcher_const_PARTIAL_MONTH_DAY as PARTIAL_MONTH_DAY, - matcher_const_PARTIAL_YEAR as PARTIAL_YEAR, - matcher_const_VOWEL_LIST as VOWEL_LIST, - matcher_const_YEAR_MATCHER as YEAR_MATCHER, - }; + export { matcher_const_BELFIORE_CODE_MATCHER as BELFIORE_CODE_MATCHER, matcher_const_CF_FULL_NAME_MATCHER as CF_FULL_NAME_MATCHER, matcher_const_CF_NAME_MATCHER as CF_NAME_MATCHER, matcher_const_CF_SURNAME_MATCHER as CF_SURNAME_MATCHER, matcher_const_CHECK_DIGIT as CHECK_DIGIT, matcher_const_CITY_CODE_LIST as CITY_CODE_LIST, matcher_const_CITY_CODE_MATCHER as CITY_CODE_MATCHER, matcher_const_CODICE_FISCALE as CODICE_FISCALE, matcher_const_CONSONANT_LIST as CONSONANT_LIST, matcher_const_COUNTRY_CODE_LIST as COUNTRY_CODE_LIST, matcher_const_COUNTRY_CODE_MATCHER as COUNTRY_CODE_MATCHER, matcher_const_DAY_29_MATCHER as DAY_29_MATCHER, matcher_const_DAY_2X_MATCHER as DAY_2X_MATCHER, matcher_const_DAY_30_MATCHER as DAY_30_MATCHER, matcher_const_DAY_31_MATCHER as DAY_31_MATCHER, matcher_const_DAY_3X_MATCHER as DAY_3X_MATCHER, matcher_const_DAY_MATCHER as DAY_MATCHER, matcher_const_FEMALE_DAY_MATCHER as FEMALE_DAY_MATCHER, matcher_const_FEMALE_FULL_DATE_MATCHER as FEMALE_FULL_DATE_MATCHER, matcher_const_FULL_DATE_MATCHER as FULL_DATE_MATCHER, matcher_const_LEAP_YEAR_MATCHER as LEAP_YEAR_MATCHER, matcher_const_MALE_DAY_MATCHER as MALE_DAY_MATCHER, matcher_const_MALE_FULL_DATE_MATCHER as MALE_FULL_DATE_MATCHER, matcher_const_MONTH_30DAYS_LIST as MONTH_30DAYS_LIST, matcher_const_MONTH_31DAYS_LIST as MONTH_31DAYS_LIST, matcher_const_MONTH_DAY_MATCHER as MONTH_DAY_MATCHER, matcher_const_MONTH_LIST as MONTH_LIST, matcher_const_MONTH_MATCHER as MONTH_MATCHER, matcher_const_OMOCODE_NON_ZERO_NUMBER_LIST as OMOCODE_NON_ZERO_NUMBER_LIST, matcher_const_OMOCODE_NUMBER_LIST as OMOCODE_NUMBER_LIST, matcher_const_OMOCODE_ZERO_LIST as OMOCODE_ZERO_LIST, matcher_const_PARTIAL_BELFIORE_CODE_MATCHER as PARTIAL_BELFIORE_CODE_MATCHER, matcher_const_PARTIAL_CF as PARTIAL_CF, matcher_const_PARTIAL_CF_FULL_NAME as PARTIAL_CF_FULL_NAME, matcher_const_PARTIAL_CF_NAME_MATCHER as PARTIAL_CF_NAME_MATCHER, matcher_const_PARTIAL_FULL_DATE as PARTIAL_FULL_DATE, matcher_const_PARTIAL_MONTH_DAY as PARTIAL_MONTH_DAY, matcher_const_PARTIAL_YEAR as PARTIAL_YEAR, matcher_const_VOWEL_LIST as VOWEL_LIST, matcher_const_YEAR_MATCHER as YEAR_MATCHER }; } declare enum BirthMonth { - "A" = 0, - "B" = 1, - "C" = 2, - "D" = 3, - "E" = 4, - "H" = 5, - "L" = 6, - "M" = 7, - "P" = 8, - "R" = 9, - "S" = 10, - "T" = 11, + "A" = 0, + "B" = 1, + "C" = 2, + "D" = 3, + "E" = 4, + "H" = 5, + "L" = 6, + "M" = 7, + "P" = 8, + "R" = 9, + "S" = 10, + "T" = 11 } declare enum CRC { - "B" = 0, - "A" = 1, - "K" = 2, - "P" = 3, - "L" = 4, - "C" = 5, - "Q" = 6, - "D" = 7, - "R" = 8, - "E" = 9, - "V" = 10, - "O" = 11, - "S" = 12, - "F" = 13, - "T" = 14, - "G" = 15, - "U" = 16, - "H" = 17, - "M" = 18, - "I" = 19, - "N" = 20, - "J" = 21, - "W" = 22, - "Z" = 23, - "Y" = 24, - "X" = 25, + "B" = 0, + "A" = 1, + "K" = 2, + "P" = 3, + "L" = 4, + "C" = 5, + "Q" = 6, + "D" = 7, + "R" = 8, + "E" = 9, + "V" = 10, + "O" = 11, + "S" = 12, + "F" = 13, + "T" = 14, + "G" = 15, + "U" = 16, + "H" = 17, + "M" = 18, + "I" = 19, + "N" = 20, + "J" = 21, + "W" = 22, + "Z" = 23, + "Y" = 24, + "X" = 25 } declare enum Omocodes { - "L" = 0, - "M" = 1, - "N" = 2, - "P" = 3, - "Q" = 4, - "R" = 5, - "S" = 6, - "T" = 7, - "U" = 8, - "V" = 9, + "L" = 0, + "M" = 1, + "N" = 2, + "P" = 3, + "Q" = 4, + "R" = 5, + "S" = 6, + "T" = 7, + "U" = 8, + "V" = 9 } declare class CodiceFiscaleUtils { - readonly belfioreConnector: IBelfioreConnector; - readonly validator: Validator; - readonly parser: Parser; - readonly pattern: Pattern; - constructor(belfioreConnector: IBelfioreConnector); + readonly belfioreConnector: IBelfioreConnector; + readonly validator: Validator; + readonly parser: Parser; + readonly pattern: Pattern; + constructor(belfioreConnector: IBelfioreConnector); } -export { - BirthMonth, - CFMismatchValidator, - CRC, - CheckDigitizer, - CodiceFiscaleUtils, - dateMatcher_const as DATE_MATCHER, - type DateDay, - type DateMonth, - DateUtils, - Gender, - type Genders, - type IMismatchVerboseErrors, - matcher_const as Matcher, - type MultiFormatDate, - Omocodes, - Parser, - Pattern, - matcher_const as VALIDATOR, - Validator, - CodiceFiscaleUtils as default, -}; +export { BirthMonth, CFMismatchValidator, CRC, CheckDigitizer, CodiceFiscaleUtils, dateMatcher_const as DATE_MATCHER, type DateDay, type DateMonth, DateUtils, Gender, type Genders, type IMismatchVerboseErrors, matcher_const as Matcher, type MultiFormatDate, Omocodes, Parser, Pattern, matcher_const as VALIDATOR, Validator, CodiceFiscaleUtils as default }; diff --git a/dist/index.js b/dist/index.js index 4ac1c2a..1a279a9 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,5 +1,5 @@ /** - * @marketto/codice-fiscale-utils 3.0.0 + * @marketto/codice-fiscale-utils 3.1.0 * Copyright (c) 2019-2024, Marco Ricupero * License: MIT */ @@ -8,7 +8,7 @@ Object.defineProperty(exports, '__esModule', { value: true }); -var moment = require('moment'); +var dayjs = require('dayjs'); var DiacriticRemover = require('@marketto/diacritic-remover'); /****************************************************************************** @@ -100,12 +100,11 @@ var dateMatcher_const = /*#__PURE__*/Object.freeze({ class DateUtils { /** * Parse a Dated and Gender information to create Date/Gender CF part - * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day] + * @param date Date instance, ISO8601 date string or array of numbers [year, month, day] * @returns Parsed Date or null if not valid */ static parseDate(date) { if (!(date instanceof Date || - date instanceof moment || (typeof date === "string" && new RegExp(`^(?:${ISO8601_DATE_TIME})$`).test(date)) || (Array.isArray(date) && @@ -118,14 +117,14 @@ class DateUtils { if (Array.isArray(date)) { const [year, month = 0, day = 1] = date; if (month >= 0 && month <= 11 && day > 0 && day <= 31) { - parsedDate = moment(Date.UTC(year, month || 0, day || 1)); + parsedDate = dayjs(Date.UTC(year, month || 0, day || 1)); } else { return null; } } else { - parsedDate = moment(date); + parsedDate = dayjs(date); } return parsedDate.isValid() ? parsedDate.toDate() : null; } @@ -510,9 +509,9 @@ class Parser { if (isNaN(birthYear)) { return null; } - const current2DigitsYear = parseInt(moment().format("YY"), 10); + const current2DigitsYear = parseInt(dayjs().format("YY"), 10); const century = (birthYear > current2DigitsYear ? 1 : 0) * 100; - return moment() + return dayjs() .subtract(current2DigitsYear - birthYear + century, "years") .year(); } @@ -590,7 +589,7 @@ class Parser { const { creationDate, expirationDate } = birthPlace; if ((creationDate || expirationDate) && checkBirthDateConsistency) { const birthDate = this.cfToBirthDate(codiceFiscale); - const isBirthDateAfterCfIntroduction = moment(CF_INTRODUCTION_DATE) + const isBirthDateAfterCfIntroduction = dayjs(CF_INTRODUCTION_DATE) // Adding some tolerance .add(5, "years") .isBefore(birthDate, "day"); @@ -599,9 +598,9 @@ class Parser { const datePlaceConsistency = // BirthDay is before expiration date (!expirationDate || - moment(birthDate).isBefore(expirationDate, "day")) && + dayjs(birthDate).isBefore(expirationDate, "day")) && // BirthDay is after creation date - (!creationDate || moment(birthDate).isAfter(creationDate, "day")); + (!creationDate || dayjs(birthDate).isAfter(creationDate, "day")); if (!datePlaceConsistency) { return null; } @@ -735,7 +734,7 @@ class Parser { [month, day].some((param) => typeof param !== "number")) { return null; } - const date = moment(Date.UTC(year, month || 0, day || 1)); + const date = dayjs(Date.UTC(year, month || 0, day || 1)); if (!date.isValid() || date.year() !== year || date.month() !== month || @@ -768,7 +767,7 @@ class Parser { } /** * Parse Date and Gender information to create Date/Gender CF part - * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day] + * @param date Date instance, ISO8601 date string or array of numbers [year, month, day] * @param gender Gender enum value * @returns Birth date and Gender CF code */ @@ -1250,7 +1249,7 @@ class Pattern { const parsedDate = this.parser.cfToBirthDate(codiceFiscale); if (parsedDate) { const dateIso8601 = parsedDate.toJSON(); - if (moment().diff(moment(parsedDate), "y") < 50) { + if (dayjs().diff(dayjs(parsedDate), "y") < 50) { const century = parseInt(dateIso8601.substr(0, 2), 10); const centuries = [century - 1, century].map((year) => year.toString().padStart(2, "0")); matcher = `(?:${centuries.join("|")})` + dateIso8601.substr(2, 8); @@ -1367,7 +1366,7 @@ class CFMismatchValidator { const parsedCfDate = this.parser.cfToBirthDate(this.codiceFiscale); const parsedDate = DateUtils.parseDate(birthDate); if (parsedCfDate && parsedDate) { - return moment(parsedCfDate).isSame(parsedDate, "d"); + return dayjs(parsedCfDate).isSame(parsedDate, "d"); } } return false; @@ -1525,7 +1524,7 @@ class Validator { .from(birthDate) .findByCode(parsedPlace.belfioreCode)) || // Ignoring control for people born before CF introduction - moment(DateUtils.parseDate(birthDate)).isSameOrBefore(CF_INTRODUCTION_DATE, "day"))); + !dayjs(DateUtils.parseDate(birthDate)).isAfter(CF_INTRODUCTION_DATE, "day"))); }); } birthDatePlaceMismatch(birthDate, birthPlace) { diff --git a/dist/index.mjs b/dist/index.mjs index 93f9355..fc09c00 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -1,8 +1,8 @@ /** - * @marketto/codice-fiscale-utils 3.0.0 + * @marketto/codice-fiscale-utils 3.1.0 * Copyright (c) 2019-2024, Marco Ricupero * License: MIT */ -import t from"moment";import e from"@marketto/diacritic-remover";const i=15,r="[12][0-9]{3}",s="0[1-9]|1[0-2]",a="0[469]|11",n="0[13578]|1[02]",o=`(?:${s})-(?:0[1-9]|[12]\\d)|(?:${a})-30|(?:${n})-3[01]`,c="[01]\\d|2[0-3]",h="[0-5]\\d",l=h,d="\\d{3}",T=`Z|[-+](?:${c})(?::?${h})?`,f=`(?:${c})(?::${h}(?::${l}(\\.${d})?)?(?:${T})?)?`,$=`${r}-(?:${o})(?:T${f})?`,u=`${r}(?:-(?:(?:${s})|(?:${o})(?:T${f})?))?`;var A=Object.freeze({__proto__:null,DAY:"0[1-9]|[12][0-9]|3[01]",DAYS_30_MONTHS:a,DAYS_31_MONTHS:n,HOURS:c,ISO8601_DATE_TIME:u,ISO8601_SHORT_DATE:$,LEAP_MONTH:"02",MILLISECONDS:d,MINUTES:h,MONTH:s,MONTH_DAY:o,SECONDS:l,TIME:f,TIMEZONE:T,YEAR:r});class E{static parseDate(e){if(!(e instanceof Date||e instanceof t||"string"==typeof e&&new RegExp(`^(?:${u})$`).test(e)||Array.isArray(e)&&e.length&&!e.some((t=>"number"!=typeof t||isNaN(t)))))return null;try{let i;if(Array.isArray(e)){const[r,s=0,a=1]=e;if(!(s>=0&&s<=11&&a>0&&a<=31))return null;i=t(Date.UTC(r,s||0,a||1))}else i=t(e);return i.isValid()?i.toDate():null}catch(t){return null}}static ymdToDate(t,e,i){return this.parseDate([t,e,i])}}const _="B-DF-HJ-NP-TV-Z",p="AEIOU",C="\\dLMNP-V",m="1-9MNP-V",R="0L",D="A-EHLMPR-T",N="DHPS",M="ACELMRT",I="A-M",S="Z",O=`[A-Z][${p}][${p}X]|[${p}]X{2}|[${_}]{2}[A-Z]`,y=O,g=`(?:${O}){2}`,L=`[${C}]{2}`,P="[02468LNQSU][048LQU]|[13579MPRTV][26NS]",F=`[${D}]`,w="[26NS]",B="[37PT]",b=`[${R}4Q][${m}]|[1256MNRS][${C}]`,v=`[${B}][${R}]`,H=`[${B}][${R}1M]`,Y=`(?:${b}|${B}[${R}1M])`,V=`(?:[${R}][${m}]|[12MN][${C}]|[3P][${R}1M])`,G=`(?:[4Q][${m}]|[56RS][${C}]|[7T][${R}1M])`,U=`${F}(?:${b})|[${N}]${v}|[${M}]${H}`,j=`${L}(?:${F}(?:[${R}4Q][${m}]|[15MR][${C}]|${w}[0-8LMNP-U])|[${N}]${B}[${R}]|[${M}]${B}[${R}1M]|[${N}${M}]${w}[9V])|(?:${P})B${w}[9V]`,x=`${L}(?:${F}(?:[${R}][${m}]|[1M][${C}]|[2N][0-8LMNP-U])|[${N}][3P][${R}]|[${M}][3P][${R}1M]|[${N}${M}][2N][9V])|(?:${P})B[2N][9V]`,Z=`${L}(?:${F}(?:[4Q][${m}]|[5R][${C}]|[6S][0-8LMNP-U])|[${N}][7T][${R}]|[${M}][7T][${R}1M]|[${N}${M}][6S][9V])|(?:${P})B[6S][9V]`,k=`[${I}](?:[${m}][${C}]{2}|[${R}](?:[${m}][${C}]|[${R}][${m}]))`,X=`${S}[${m}][${C}]{2}`,Q=`(?:[${I}${S}][${m}][${C}]{2})|(?:[${I}][${R}](?:[${m}][${C}]|[${R}][${m}]))`,J="[A-Z]",z=`${g}(?:${j})(?:${Q})${J}`,K=`[A-Z][${p}]?|[${_}]{1,2}`,W=`(?:${K})|(?:(?:${O})(?:${K})?)`,q=`[${C}]`,tt=`${F}[${R}12456MNQRS]?|[${N}${M}]${B}`,et=`${q}|(?:${L}(?:${tt})?)`,it=`[${I}${S}](?:[${m}][${C}]?)?|[${S}](?:[${R}][${C}]?)?`,rt=`${W}|(?:${g}(?:(?:${et})|(?:${j})(?:(?:${it})|(?:${Q})${J}?)?)?)?`;var st,at=Object.freeze({__proto__:null,BELFIORE_CODE_MATCHER:Q,CF_FULL_NAME_MATCHER:g,CF_NAME_MATCHER:O,CF_SURNAME_MATCHER:y,CHECK_DIGIT:J,CITY_CODE_LIST:I,CITY_CODE_MATCHER:k,CODICE_FISCALE:z,CONSONANT_LIST:_,COUNTRY_CODE_LIST:S,COUNTRY_CODE_MATCHER:X,DAY_29_MATCHER:b,DAY_2X_MATCHER:w,DAY_30_MATCHER:v,DAY_31_MATCHER:H,DAY_3X_MATCHER:B,DAY_MATCHER:Y,FEMALE_DAY_MATCHER:G,FEMALE_FULL_DATE_MATCHER:Z,FULL_DATE_MATCHER:j,LEAP_YEAR_MATCHER:P,MALE_DAY_MATCHER:V,MALE_FULL_DATE_MATCHER:x,MONTH_30DAYS_LIST:N,MONTH_31DAYS_LIST:M,MONTH_DAY_MATCHER:U,MONTH_LIST:D,MONTH_MATCHER:F,OMOCODE_NON_ZERO_NUMBER_LIST:m,OMOCODE_NUMBER_LIST:C,OMOCODE_ZERO_LIST:R,PARTIAL_BELFIORE_CODE_MATCHER:it,PARTIAL_CF:rt,PARTIAL_CF_FULL_NAME:W,PARTIAL_CF_NAME_MATCHER:K,PARTIAL_FULL_DATE:et,PARTIAL_MONTH_DAY:tt,PARTIAL_YEAR:q,VOWEL_LIST:p,YEAR_MATCHER:L});!function(t){t[t.B=0]="B",t[t.A=1]="A",t[t.K=2]="K",t[t.P=3]="P",t[t.L=4]="L",t[t.C=5]="C",t[t.Q=6]="Q",t[t.D=7]="D",t[t.R=8]="R",t[t.E=9]="E",t[t.V=10]="V",t[t.O=11]="O",t[t.S=12]="S",t[t.F=13]="F",t[t.T=14]="T",t[t.G=15]="G",t[t.U=16]="U",t[t.H=17]="H",t[t.M=18]="M",t[t.I=19]="I",t[t.N=20]="N",t[t.J=21]="J",t[t.W=22]="W",t[t.Z=23]="Z",t[t.Y=24]="Y",t[t.X=25]="X"}(st||(st={}));var nt,ot=st;class ct{static checkDigit(t){if("string"==typeof t&&new RegExp(rt).test(t)){const e=t.substr(0,i);let r=0;for(const t of this.evaluateChar(e))r+=t;return String.fromCharCode(r%this.CRC_MOD+this.CHAR_OFFSET)}return null}static evaluateChar(t=""){return(e=this.evaluateCharGenerator(t))[Symbol.iterator]=()=>e,e;var e}static CHAR_OFFSET=65;static CRC_MOD=26;static*evaluateCharGenerator(t=""){if("string"==typeof t&&t.length)for(let e=0;e0&&e<=this.MAX_MONTH_DAY?e:null}static getGender(t){return this.toArray().find((e=>t>=Tt[e]&&t<=Tt[e]+this.MAX_MONTH_DAY))||null}static genderizeDay(t,e){return t+Tt[e]}static toArray(){return["M","F"]}static MAX_MONTH_DAY=31}const ut=new Date("1973-09-29"),At=new e;class Et{belfioreConnector;constructor(t){this.belfioreConnector=t}OMOCODE_BITMAP=30400;cfDeomocode(t){if(t&&t.length<=6)return t;const e=this.partialCfDeomocode(t);if(e.length=0;i--)if(2**i&this.OMOCODE_BITMAP){if(!!(e&2**s)!==isNaN(parseInt(r[i],10))){const t=r[i].toUpperCase();r[i]=ft[t]}s++}const s=r[15];if(s){const t=r.slice(0,i).join("");r[15]=this.appyCaseToChar(ct.checkDigit(t)||"",s)}return r.join("")}cfOmocodeId(t){const e=t.split("").filter(((t,e)=>2**e&this.OMOCODE_BITMAP)).map((t=>/^[a-z]$/i.test(At[t])?1:0)).join("");return parseInt(e,2)}cfToLastName(t){const e=t?.substring(0,3);if("string"!=typeof t||3!==e.length||!new RegExp(`^(?:${y})`,"iu").test(e))return null;const i=t.substring(0,3),[r=""]=i.match(new RegExp(`^[${_}]{1,3}`,"ig"))||[],[s=""]=i.match(new RegExp(`[${p}]{1,3}`,"ig"))||[],a=r.length+s.length;if(a<2||a<3&&"X"!==i[2].toUpperCase())return null;switch(r.length){case 3:return(r+s).split("").join(this.JOLLY_CHAR)+this.JOLLY_CHAR;case 2:return`${r[0]}${s[0]}*${r[1]}${this.JOLLY_CHAR}`;case 1:return`${r[0]}${s}${this.JOLLY_CHAR}`;default:return`${s}${3===s.length?this.JOLLY_CHAR:""}`}}cfToFirstName(t){const e=t?.substring(3,6);return"string"==typeof t&&3===e?.length&&new RegExp(`^(${O})$`,"iu").test(e)?this.cfToLastName(e):null}cfToGender(t){if("string"!=typeof t||t.length<10)return null;const e=t.substring(9,10),i=10*parseInt(this.partialCfDeomocode(e,9),10);return $t.getGender(i)}cfToBirthYear(e){if("string"!=typeof e||e.length<8)return null;const i=e.substring(6,8),r=parseInt(this.partialCfDeomocode(i,6),10);if(isNaN(r))return null;const s=parseInt(t().format("YY"),10),a=100*(r>s?1:0);return t().subtract(s-r+a,"years").year()}cfToBirthMonth(t){if("string"!=typeof t||t.length<9)return null;const e=t.substring(8,9).toUpperCase(),i=lt[e];return"number"!=typeof i||i<0||i>11?null:i}cfToBirthDay(t){if("string"!=typeof t||t.length<11)return null;const e=t.substring(9,11),i=parseInt(this.partialCfDeomocode(e,9),10);return isNaN(i)?null:$t.getDay(i)}cfToBirthDate(t){const e=this.cfToBirthDay(t);if(!e)return null;const i=this.cfToBirthMonth(t);if("number"!=typeof i)return null;const r=this.cfToBirthYear(t);return E.ymdToDate(r,i,e)}async cfToBirthPlace(e,i=!0){if("string"!=typeof e||e.length<15)return null;const r=e.substring(11,15),s=this.partialCfDeomocode(r,11),a=await this.belfioreConnector.findByCode(s);if(!a)return null;const{creationDate:n,expirationDate:o}=a;if((n||o)&&i){const i=this.cfToBirthDate(e),r=t(ut).add(5,"years").isBefore(i,"day");if(i&&r){if(!((!o||t(i).isBefore(o,"day"))&&(!n||t(i).isAfter(n,"day"))))return null}}return a}async cfDecode(t){const e=this.cfToBirthYear(t)||void 0,i=this.cfToBirthMonth(t)??void 0,r=this.cfToBirthDay(t)||void 0,s=E.ymdToDate(e,i,r)||void 0,a=await this.cfToBirthPlace(t),n={firstName:this.cfToFirstName(t)||void 0,lastName:this.cfToLastName(t)||void 0,day:r,month:i,year:e,date:s,gender:this.cfToGender(t)||void 0,place:a||void 0,omocodeId:this.cfOmocodeId(t)};return e&&i&&r&&(n.date=new Date(Date.UTC(e,i,r))),n}lastNameToCf(t){if(!t||(t||"").trim().length<2)return null;if(!/^[A-Z ']{1,32}$/iu.test(At.replace(t)))return null;const e=(this.charExtractor(t,_)+this.charExtractor(t,p)).padEnd(3,"X").substring(0,3);return e.length<3?null:e.toUpperCase()}firstNameToCf(t){if(!t||(t||"").trim().length<2)return null;const e=this.charExtractor(t,_);return e.length>=4?(e[0]+e.substring(2,4)).toUpperCase():this.lastNameToCf(t)}yearToCf(t){let e;return e="string"==typeof t?parseInt(t,10):t,"number"!=typeof e||isNaN(e)||!(e>=1900||e<100)?null:`0${e}`.substr(-2)}monthToCf(t){return t<0||t>11?null:lt[t]||null}dayGenderToCf(t,e){if(t<1||t>31)return null;const i=Tt[e];return"number"!=typeof i?null:`0${t+i}`.substr(-2)}yearMonthDayToDate(e,i=0,r=1){if(!e||e<1861||[i,r].some((t=>"number"!=typeof t)))return null;const s=t(Date.UTC(e,i||0,r||1));return s.isValid()&&s.year()===e&&s.month()===i&&s.date()===r?s.toDate():null}async parsePlace(t){let e;return t?("object"==typeof t&&t.belfioreCode?e=await this.belfioreConnector.findByCode(t.belfioreCode):"string"==typeof t&&(e=await this.belfioreConnector.findByCode(t)||await this.belfioreConnector.findByName(t)),e||null):null}dateGenderToCf(t,e){const i=E.parseDate(t);if(!i)return null;return`${this.yearToCf(i.getFullYear())}${this.monthToCf(i.getMonth())}${this.dayGenderToCf(i.getDate(),e)}`}async placeToCf(t,e,i){const r=E.parseDate(t);let s,a;if(r||"string"!=typeof t){if(!e)return null;s=e,a=i}else s=t,a=e;let n=this.belfioreConnector;if(a&&(n=n.byProvince(a)),r&&n&&(n=n.from(r)),n){const t=await new Et(n).parsePlace(s);if(t)return t.belfioreCode}return null}async encodeCf({lastName:t,firstName:e,year:i,month:r,day:s,date:a,gender:n,place:o,omocodeId:c=0}){const h=E.parseDate(a)||this.yearMonthDayToDate(i,r,s);if(!(h&&t&&e&&n&&o))return null;const l=[async()=>this.lastNameToCf(t),async()=>this.firstNameToCf(e),async()=>this.dateGenderToCf(h,n),async()=>await this.placeToCf(h,o?.belfioreCode||o)];let d="";for(const t of l){const e=await t();if(!e)return null;d+=e}return this.cfOmocode(d,c)}JOLLY_CHAR="*";checkBitmap(t){return!!(2**t&this.OMOCODE_BITMAP)}charOmocode(t,e){return/^[A-Z]$/giu.test(t)&&this.checkBitmap(e)?ft[t.toUpperCase()]:t}charExtractor(t,e){const i=new RegExp(`[${e}]{1,24}`,"ig");return(At.replace(t).trim().match(i)||[]).join("")}partialCfDeomocode(t,e=0){return t.replace(/[\dA-Z]/giu,((t,i)=>this.charOmocode(t,i+e)))}appyCaseToChar(t,e){if(t&&e){const i=e[0]===e[0].toUpperCase(),r=e[0]===e[0].toLowerCase();if(i&&!r)return t[0].toUpperCase();if(!i&&r)return t[0].toLowerCase()}return t[0]}}const _t="Provided lastName is not valid, only letters, diacritics and apostrophe allowed",pt="Provided name is not valid, only letters, diacritics and apostrophe allowed",Ct="Provided day is not valid",mt="Provided gender is not valid",Rt="Provided day and/or gender are not valid",Dt="Provided year is not valid, only 2 or 4 digit numbers are allowed",Nt="Provided date is not valid";var Mt=Object.freeze({__proto__:null,INVALID_DATE:Nt,INVALID_DAY:Ct,INVALID_DAY_OR_GENDER:Rt,INVALID_GENDER:mt,INVALID_NAME:pt,INVALID_PLACE_NAME:"Proviced City/Country name is not valid",INVALID_SURNAME:_t,INVALID_YEAR:Dt});class It extends Error{constructor(t){super((Object.entries(Mt).find((([e])=>e===t))||[])[1]||t)}}const St=new e;class Ot{belfioreConnector;parser;constructor(t){this.belfioreConnector=t,this.parser=new Et(t)}cfLastName(t){let e=y;if(t){if(!this.lastName().test(t))throw new It(_t);e=this.parser.lastNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfFirstName(t){let e=O;if(t){if(!this.lastName().test(t))throw new It(pt);e=this.parser.firstNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfYear(t){let e=L;if(t){const i=this.parser.yearToCf(t);if(!i)throw new It(Dt);e=this.deomocode(i)}return this.isolatedInsensitiveTailor(e)}cfMonth(t){let e=F;return t&&(e=this.parser.monthToCf(t)||e),this.isolatedInsensitiveTailor(e)}cfDay(t){let e=Y;if(t){const i=this.parser.dayGenderToCf(t,"M"),r=this.parser.dayGenderToCf(t,"F");if(!i||!r)throw new It(Ct);e=`(?:${this.deomocode(i)})|(?:${this.deomocode(r)})`}return this.isolatedInsensitiveTailor(e)}cfDayGender(t,e){if(!e)return this.cfDay(t);let i;if(t){const r=this.parser.dayGenderToCf(t,e);if(!r)throw new It(Rt);i=this.deomocode(r)}else switch(e){case"M":i=V;break;case"F":i=G;break;default:throw new It(mt)}return this.isolatedInsensitiveTailor(i)}cfDateGender(t,e){if(t&&!E.parseDate(t))throw new It(Nt);if(e&&!$t.toArray().includes(e))throw new It(mt);let i=j;if(t){const r=e&&this.parser.dateGenderToCf(t,e);if(r)i=this.deomocode(r);else{const e=e=>{const i=this.parser.dateGenderToCf(t,e);if(!i)throw new It(Nt);return i&&this.deomocode(i)};i=`(?:${$t.toArray().map(e).join("|")})`}}else"M"===e?i=x:"F"===e&&(i=Z);return this.isolatedInsensitiveTailor(i)}async cfPlace(t,e){let i=Q;if(t){const r=E.parseDate(t);if(r&&e){const t=e,s=await this.parser.placeToCf(r,t);i=this.deomocode(s||"")}else if(!r&&"string"==typeof t){const e=t,r=await this.parser.placeToCf(e);i=this.deomocode(r||"")}}return this.isolatedInsensitiveTailor(i)}async codiceFiscale(t){let e=z;if(t){const i=await this.parser.encodeCf(t);if(i)e=this.deomocode(i);else{const{lastName:i,firstName:r,year:s,month:a,day:n,date:o,gender:c,place:h}=t;if(i||r||s||a||n||o||c||h){let t=null;o?t=E.parseDate(o):s&&(t=this.parser.yearMonthDayToDate(s,a,n));const l=[async()=>this.cfLastName(i),async()=>this.cfFirstName(r),async()=>this.cfDateGender(t,c),async()=>await this.cfPlace(t,h?.belfioreCode||h)];e="";for(const t of l){const i=(await t()).toString(),r=i.match(/\^(.{1,256})\$/),s=r&&r[1];if(!s)throw new Error(`Unable to handle [${i}]`);e+=`(?:${s})`}e+=J}}}return this.isolatedInsensitiveTailor(e)}LETTER_SET=`[A-Z${St.matcherBy(/^[A-Z]$/iu)}]`;SEPARATOR_SET="(?:'?\\s{0,4})";lastName(t){let e=`${this.LETTER_SET}{1,24}`;if(t&&/^[A-Z]{1,3}/iu.test(t)){const i=t.substr(0,3),r=t=>t.split("").map((t=>`[${St.insensitiveMatcher[t]}]`)),[s,a]=[`^[${_}]{1,3}`,`[${p}]{1,3}`].map((t=>r((i.match(new RegExp(t,"ig"))||[])[0]||""))),n=`[${p+St.matcherBy(new RegExp(`^[${p}]$`,"ui"))}]`,o=`(?:${n}${this.SEPARATOR_SET}){0,24}`,c=`(?:${this.SEPARATOR_SET}${o}${n})?`;switch(s.length){case 3:{const t=o;e=t+s.join(`${this.SEPARATOR_SET}${t}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;break}case 2:e=`(?:${[`${a[0]}${o}${this.SEPARATOR_SET}${s[0]}${o}${s[1]}`,`${s[0]}${this.SEPARATOR_SET}`+a.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${o}${s[1]}`,s.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${a[0]}`].join("|")})${c}`;break;case 1:e=`(?:${[a.slice(0,2).join(`${this.SEPARATOR_SET}`)+o+s.join(`${this.SEPARATOR_SET}`),`${a[0]}${this.SEPARATOR_SET}`+s.join(`${this.SEPARATOR_SET}`)+a[1],[s[0],...a.slice(0,2)].join(`${this.SEPARATOR_SET}`)].join("|")})${c}`;break;default:e=`${a.join(`${this.SEPARATOR_SET}`)}${c}`}if(a?.length+s?.length<3)return this.isolatedInsensitiveTailor(`\\s{0,4}(${e})\\s{0,4}`)}return this.isolatedInsensitiveTailor(`\\s{0,4}((?:${e})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\s{0,4}`)}firstName(t){if(t&&new RegExp(`^[A-Z]{3}[${_}]{3}`,"iu").test(t)){const e=((t.substr(3,3).match(new RegExp(`^[${_}]{1,3}`,"ig"))||[])[0]||"").split("").map((t=>`[${St.insensitiveMatcher[t]}]`)),[i,r]=[p,_].map((t=>t+St.matcherBy(new RegExp(`^[${t}]$`,"ui")))),s=`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}${e[0]}${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${r}]${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24})?`+e.slice(1,3).join(`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;return this.isolatedInsensitiveTailor(s)}return this.lastName((t||"").substr(3,3))}date(e){let i=u;if(e){const r=this.parser.cfToBirthDate(e);if(r){const e=r.toJSON();if(t().diff(t(r),"y")<50){const t=parseInt(e.substr(0,2),10);i=`(?:${[t-1,t].map((t=>t.toString().padStart(2,"0"))).join("|")})`+e.substr(2,8)}else i=e.substr(0,10)}}return this.isolatedInsensitiveTailor(`${i}(?:T${f}(?:${T})?)?`)}gender(t){const e=t&&this.parser.cfToGender(t)||`[${$t.toArray().join("")}]`;return this.isolatedInsensitiveTailor(e)}async place(t){let e=".{1,32}";const i=t&&await this.parser.cfToBirthPlace(t);if(i){e=`(?:(?:${i.name.replace(/./gu,(t=>St[t]===t?t:`[${t}${St[t]}]`))})|${i.belfioreCode})`}return this.isolatedInsensitiveTailor(e)}deomocode(t){return t.replace(/\d/gu,(t=>`[${t}${ft[t]}]`))}isolatedInsensitiveTailor(t){return new RegExp(`^(?:${t})$`,"iu")}}class yt{codiceFiscale;pattern;parser;constructor(t,e){this.codiceFiscale=e,this.pattern=new Ot(t),this.parser=new Et(t)}get hasLastName(){return this.codiceFiscale?.length>=3}get hasFirstName(){return this.codiceFiscale?.length>=6}get hasBirthYear(){return this.codiceFiscale?.length>=8}get hasBirthDate(){return this.codiceFiscale?.length>=11}get hasGender(){return this.codiceFiscale?.length>=10}get hasBirthPlace(){return this.codiceFiscale?.length>=15}get hasCRC(){return this.codiceFiscale?.length>=16}async matchPersonalInfo(t){return(await this.pattern.codiceFiscale(t)).test(this.codiceFiscale)}async mismatchPersonalInfo(t){return!(!(this.codiceFiscale&&t&&t.lastName&&t.firstName&&(t.date||t.day&&t.month&&t.year)&&t.gender&&t.place)||await this.matchPersonalInfo(t))}matchLastName(t){return this.hasLastName&&this.pattern.lastName(this.codiceFiscale).test(t||"")}mismatchLastName(t){return this.hasLastName&&!!t&&!this.matchLastName(t)}matchFirstName(t){return this.hasFirstName&&this.pattern.firstName(this.codiceFiscale).test(t||"")}mismatchFirstName(t){return this.hasFirstName&&!!t&&!this.matchFirstName(t)}matchBirthDate(e){if(this.hasBirthDate){const i=this.parser.cfToBirthDate(this.codiceFiscale),r=E.parseDate(e);if(i&&r)return t(i).isSame(r,"d")}return!1}mismatchBirthDate(t){return this.hasBirthYear&&!!E.parseDate(t)&&!this.matchBirthDate(t)}matchGender(t){return this.hasGender&&this.pattern.gender(this.codiceFiscale).test(t||"")}mismatchGender(t){return this.hasGender&&!!t&&!this.matchGender(t)}async matchBirthPlace(t){if(this.hasBirthPlace&&t){const e=await this.pattern.place(this.codiceFiscale),i=await this.parser.parsePlace(t);return!!i&&e.test(i?.belfioreCode)}return!1}async mismatchBirthPlace(t){return this.hasBirthPlace&&!!t&&!await this.matchBirthPlace(t)}get errors(){return Promise.all([this.parser.cfToBirthPlace(this.codiceFiscale,!1),this.parser.cfToBirthPlace(this.codiceFiscale,!0)]).then((([t,e])=>({...this.parser.cfToLastName(this.codiceFiscale)?{}:{lastName:"MISSING_OR_INVALID_LAST_NAME"},...this.parser.cfToFirstName(this.codiceFiscale)?{}:{firstName:"MISSING_OR_INVALID_FIRST_NAME"},...this.parser.cfToBirthDate(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DATE"},...this.parser.cfToBirthDay(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DAY"},...this.parser.cfToBirthMonth(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_MONTH"},...this.parser.cfToBirthYear(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_YEAR"},...this.parser.cfToGender(this.codiceFiscale)?{}:{gender:"MISSING_DAY"},...t?{}:{place:"MISSING_OR_INVALID_PLACE"},...e?{}:{place:"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE",date:"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE"},...this.codiceFiscale?.substring(i,16)?.toUpperCase()===ct.checkDigit(this.codiceFiscale)?{}:{crc:"INVALID_CRC_CODE"},...this.hasCRC?{}:{crc:"MISSING_CRC_CODE"}}))).then((t=>Object.keys(t).length?t:null))}get valid(){return Promise.all([this.pattern.codiceFiscale(),this.parser.cfToBirthPlace(this.codiceFiscale)]).then((([t,e])=>!(!this.hasCRC||!t.test(this.codiceFiscale)||this.codiceFiscale?.substring(i,16)?.toUpperCase()!==ct.checkDigit(this.codiceFiscale)||!e)))}get invalid(){return this.valid.then((t=>!!this.codiceFiscale&&!t))}}class gt{belfioreConnector;parser;pattern;constructor(t){this.belfioreConnector=t,this.parser=new Et(t),this.pattern=new Ot(t)}codiceFiscale(t){return new yt(this.belfioreConnector,t)}isLastNameValid(t){return this.pattern.lastName().test(t)}isLastNameInvalid(t){return!!t&&!this.isLastNameValid(t)}isFirstNameValid(t){return this.pattern.firstName().test(t)}isFirstNameInvalid(t){return!!t&&!this.isFirstNameValid(t)}isBirthDateValid(t){return!!E.parseDate(t)}isBirthDateInvalid(t){return!!t&&!this.isBirthDateValid(t)}isGenderValid(t){return this.pattern.gender().test(t)}isGenderInvalid(t){return!!t&&!this.isGenderValid(t)}async isBirthPlaceValid(t){const e=await this.parser.parsePlace(t);return!!e&&!!await this.belfioreConnector.findByCode(e.belfioreCode)}async isBirthPlaceInvalid(t){return!!t&&!await this.isBirthPlaceValid(t)}async birthDatePlaceMatch(e,i){const r=await this.parser.parsePlace(i);return this.isBirthDateValid(e)&&!!r&&(!!await this.belfioreConnector.from(e).findByCode(r.belfioreCode)||t(E.parseDate(e)).isSameOrBefore(ut,"day"))}async birthDatePlaceMismatch(t,e){const i=await this.parser.parsePlace(e);return this.isBirthDateValid(t)&&!!i&&!await this.birthDatePlaceMatch(t,e)}async birthPlaceDateMatch(t,e){return await this.birthDatePlaceMatch(e,t)}async birthPlaceDateMismatch(t,e){return await this.birthDatePlaceMismatch(e,t)}}class Lt{belfioreConnector;validator;parser;pattern;constructor(t){this.belfioreConnector=t,this.validator=new gt(t),this.parser=new Et(t),this.pattern=new Ot(t)}}export{lt as BirthMonth,yt as CFMismatchValidator,ot as CRC,ct as CheckDigitizer,Lt as CodiceFiscaleUtils,A as DATE_MATCHER,E as DateUtils,$t as Gender,at as Matcher,ft as Omocodes,Et as Parser,Ot as Pattern,at as VALIDATOR,gt as Validator,Lt as default}; +import t from"dayjs";import e from"@marketto/diacritic-remover";const i=15,r="[12][0-9]{3}",s="0[1-9]|1[0-2]",a="0[469]|11",n="0[13578]|1[02]",o=`(?:${s})-(?:0[1-9]|[12]\\d)|(?:${a})-30|(?:${n})-3[01]`,c="[01]\\d|2[0-3]",h="[0-5]\\d",l=h,d="\\d{3}",T=`Z|[-+](?:${c})(?::?${h})?`,f=`(?:${c})(?::${h}(?::${l}(\\.${d})?)?(?:${T})?)?`,$=`${r}-(?:${o})(?:T${f})?`,u=`${r}(?:-(?:(?:${s})|(?:${o})(?:T${f})?))?`;var A=Object.freeze({__proto__:null,DAY:"0[1-9]|[12][0-9]|3[01]",DAYS_30_MONTHS:a,DAYS_31_MONTHS:n,HOURS:c,ISO8601_DATE_TIME:u,ISO8601_SHORT_DATE:$,LEAP_MONTH:"02",MILLISECONDS:d,MINUTES:h,MONTH:s,MONTH_DAY:o,SECONDS:l,TIME:f,TIMEZONE:T,YEAR:r});class E{static parseDate(e){if(!(e instanceof Date||"string"==typeof e&&new RegExp(`^(?:${u})$`).test(e)||Array.isArray(e)&&e.length&&!e.some((t=>"number"!=typeof t||isNaN(t)))))return null;try{let i;if(Array.isArray(e)){const[r,s=0,a=1]=e;if(!(s>=0&&s<=11&&a>0&&a<=31))return null;i=t(Date.UTC(r,s||0,a||1))}else i=t(e);return i.isValid()?i.toDate():null}catch(t){return null}}static ymdToDate(t,e,i){return this.parseDate([t,e,i])}}const _="B-DF-HJ-NP-TV-Z",p="AEIOU",C="\\dLMNP-V",m="1-9MNP-V",R="0L",D="A-EHLMPR-T",N="DHPS",M="ACELMRT",I="A-M",S="Z",O=`[A-Z][${p}][${p}X]|[${p}]X{2}|[${_}]{2}[A-Z]`,y=O,g=`(?:${O}){2}`,L=`[${C}]{2}`,P="[02468LNQSU][048LQU]|[13579MPRTV][26NS]",F=`[${D}]`,w="[26NS]",b="[37PT]",B=`[${R}4Q][${m}]|[1256MNRS][${C}]`,v=`[${b}][${R}]`,H=`[${b}][${R}1M]`,Y=`(?:${B}|${b}[${R}1M])`,V=`(?:[${R}][${m}]|[12MN][${C}]|[3P][${R}1M])`,G=`(?:[4Q][${m}]|[56RS][${C}]|[7T][${R}1M])`,U=`${F}(?:${B})|[${N}]${v}|[${M}]${H}`,j=`${L}(?:${F}(?:[${R}4Q][${m}]|[15MR][${C}]|${w}[0-8LMNP-U])|[${N}]${b}[${R}]|[${M}]${b}[${R}1M]|[${N}${M}]${w}[9V])|(?:${P})B${w}[9V]`,x=`${L}(?:${F}(?:[${R}][${m}]|[1M][${C}]|[2N][0-8LMNP-U])|[${N}][3P][${R}]|[${M}][3P][${R}1M]|[${N}${M}][2N][9V])|(?:${P})B[2N][9V]`,Z=`${L}(?:${F}(?:[4Q][${m}]|[5R][${C}]|[6S][0-8LMNP-U])|[${N}][7T][${R}]|[${M}][7T][${R}1M]|[${N}${M}][6S][9V])|(?:${P})B[6S][9V]`,k=`[${I}](?:[${m}][${C}]{2}|[${R}](?:[${m}][${C}]|[${R}][${m}]))`,X=`${S}[${m}][${C}]{2}`,Q=`(?:[${I}${S}][${m}][${C}]{2})|(?:[${I}][${R}](?:[${m}][${C}]|[${R}][${m}]))`,J="[A-Z]",z=`${g}(?:${j})(?:${Q})${J}`,K=`[A-Z][${p}]?|[${_}]{1,2}`,W=`(?:${K})|(?:(?:${O})(?:${K})?)`,q=`[${C}]`,tt=`${F}[${R}12456MNQRS]?|[${N}${M}]${b}`,et=`${q}|(?:${L}(?:${tt})?)`,it=`[${I}${S}](?:[${m}][${C}]?)?|[${S}](?:[${R}][${C}]?)?`,rt=`${W}|(?:${g}(?:(?:${et})|(?:${j})(?:(?:${it})|(?:${Q})${J}?)?)?)?`;var st,at=Object.freeze({__proto__:null,BELFIORE_CODE_MATCHER:Q,CF_FULL_NAME_MATCHER:g,CF_NAME_MATCHER:O,CF_SURNAME_MATCHER:y,CHECK_DIGIT:J,CITY_CODE_LIST:I,CITY_CODE_MATCHER:k,CODICE_FISCALE:z,CONSONANT_LIST:_,COUNTRY_CODE_LIST:S,COUNTRY_CODE_MATCHER:X,DAY_29_MATCHER:B,DAY_2X_MATCHER:w,DAY_30_MATCHER:v,DAY_31_MATCHER:H,DAY_3X_MATCHER:b,DAY_MATCHER:Y,FEMALE_DAY_MATCHER:G,FEMALE_FULL_DATE_MATCHER:Z,FULL_DATE_MATCHER:j,LEAP_YEAR_MATCHER:P,MALE_DAY_MATCHER:V,MALE_FULL_DATE_MATCHER:x,MONTH_30DAYS_LIST:N,MONTH_31DAYS_LIST:M,MONTH_DAY_MATCHER:U,MONTH_LIST:D,MONTH_MATCHER:F,OMOCODE_NON_ZERO_NUMBER_LIST:m,OMOCODE_NUMBER_LIST:C,OMOCODE_ZERO_LIST:R,PARTIAL_BELFIORE_CODE_MATCHER:it,PARTIAL_CF:rt,PARTIAL_CF_FULL_NAME:W,PARTIAL_CF_NAME_MATCHER:K,PARTIAL_FULL_DATE:et,PARTIAL_MONTH_DAY:tt,PARTIAL_YEAR:q,VOWEL_LIST:p,YEAR_MATCHER:L});!function(t){t[t.B=0]="B",t[t.A=1]="A",t[t.K=2]="K",t[t.P=3]="P",t[t.L=4]="L",t[t.C=5]="C",t[t.Q=6]="Q",t[t.D=7]="D",t[t.R=8]="R",t[t.E=9]="E",t[t.V=10]="V",t[t.O=11]="O",t[t.S=12]="S",t[t.F=13]="F",t[t.T=14]="T",t[t.G=15]="G",t[t.U=16]="U",t[t.H=17]="H",t[t.M=18]="M",t[t.I=19]="I",t[t.N=20]="N",t[t.J=21]="J",t[t.W=22]="W",t[t.Z=23]="Z",t[t.Y=24]="Y",t[t.X=25]="X"}(st||(st={}));var nt,ot=st;class ct{static checkDigit(t){if("string"==typeof t&&new RegExp(rt).test(t)){const e=t.substr(0,i);let r=0;for(const t of this.evaluateChar(e))r+=t;return String.fromCharCode(r%this.CRC_MOD+this.CHAR_OFFSET)}return null}static evaluateChar(t=""){return(e=this.evaluateCharGenerator(t))[Symbol.iterator]=()=>e,e;var e}static CHAR_OFFSET=65;static CRC_MOD=26;static*evaluateCharGenerator(t=""){if("string"==typeof t&&t.length)for(let e=0;e0&&e<=this.MAX_MONTH_DAY?e:null}static getGender(t){return this.toArray().find((e=>t>=Tt[e]&&t<=Tt[e]+this.MAX_MONTH_DAY))||null}static genderizeDay(t,e){return t+Tt[e]}static toArray(){return["M","F"]}static MAX_MONTH_DAY=31}const ut=new Date("1973-09-29"),At=new e;class Et{belfioreConnector;constructor(t){this.belfioreConnector=t}OMOCODE_BITMAP=30400;cfDeomocode(t){if(t&&t.length<=6)return t;const e=this.partialCfDeomocode(t);if(e.length=0;i--)if(2**i&this.OMOCODE_BITMAP){if(!!(e&2**s)!==isNaN(parseInt(r[i],10))){const t=r[i].toUpperCase();r[i]=ft[t]}s++}const s=r[15];if(s){const t=r.slice(0,i).join("");r[15]=this.appyCaseToChar(ct.checkDigit(t)||"",s)}return r.join("")}cfOmocodeId(t){const e=t.split("").filter(((t,e)=>2**e&this.OMOCODE_BITMAP)).map((t=>/^[a-z]$/i.test(At[t])?1:0)).join("");return parseInt(e,2)}cfToLastName(t){const e=t?.substring(0,3);if("string"!=typeof t||3!==e.length||!new RegExp(`^(?:${y})`,"iu").test(e))return null;const i=t.substring(0,3),[r=""]=i.match(new RegExp(`^[${_}]{1,3}`,"ig"))||[],[s=""]=i.match(new RegExp(`[${p}]{1,3}`,"ig"))||[],a=r.length+s.length;if(a<2||a<3&&"X"!==i[2].toUpperCase())return null;switch(r.length){case 3:return(r+s).split("").join(this.JOLLY_CHAR)+this.JOLLY_CHAR;case 2:return`${r[0]}${s[0]}*${r[1]}${this.JOLLY_CHAR}`;case 1:return`${r[0]}${s}${this.JOLLY_CHAR}`;default:return`${s}${3===s.length?this.JOLLY_CHAR:""}`}}cfToFirstName(t){const e=t?.substring(3,6);return"string"==typeof t&&3===e?.length&&new RegExp(`^(${O})$`,"iu").test(e)?this.cfToLastName(e):null}cfToGender(t){if("string"!=typeof t||t.length<10)return null;const e=t.substring(9,10),i=10*parseInt(this.partialCfDeomocode(e,9),10);return $t.getGender(i)}cfToBirthYear(e){if("string"!=typeof e||e.length<8)return null;const i=e.substring(6,8),r=parseInt(this.partialCfDeomocode(i,6),10);if(isNaN(r))return null;const s=parseInt(t().format("YY"),10),a=100*(r>s?1:0);return t().subtract(s-r+a,"years").year()}cfToBirthMonth(t){if("string"!=typeof t||t.length<9)return null;const e=t.substring(8,9).toUpperCase(),i=lt[e];return"number"!=typeof i||i<0||i>11?null:i}cfToBirthDay(t){if("string"!=typeof t||t.length<11)return null;const e=t.substring(9,11),i=parseInt(this.partialCfDeomocode(e,9),10);return isNaN(i)?null:$t.getDay(i)}cfToBirthDate(t){const e=this.cfToBirthDay(t);if(!e)return null;const i=this.cfToBirthMonth(t);if("number"!=typeof i)return null;const r=this.cfToBirthYear(t);return E.ymdToDate(r,i,e)}async cfToBirthPlace(e,i=!0){if("string"!=typeof e||e.length<15)return null;const r=e.substring(11,15),s=this.partialCfDeomocode(r,11),a=await this.belfioreConnector.findByCode(s);if(!a)return null;const{creationDate:n,expirationDate:o}=a;if((n||o)&&i){const i=this.cfToBirthDate(e),r=t(ut).add(5,"years").isBefore(i,"day");if(i&&r){if(!((!o||t(i).isBefore(o,"day"))&&(!n||t(i).isAfter(n,"day"))))return null}}return a}async cfDecode(t){const e=this.cfToBirthYear(t)||void 0,i=this.cfToBirthMonth(t)??void 0,r=this.cfToBirthDay(t)||void 0,s=E.ymdToDate(e,i,r)||void 0,a=await this.cfToBirthPlace(t),n={firstName:this.cfToFirstName(t)||void 0,lastName:this.cfToLastName(t)||void 0,day:r,month:i,year:e,date:s,gender:this.cfToGender(t)||void 0,place:a||void 0,omocodeId:this.cfOmocodeId(t)};return e&&i&&r&&(n.date=new Date(Date.UTC(e,i,r))),n}lastNameToCf(t){if(!t||(t||"").trim().length<2)return null;if(!/^[A-Z ']{1,32}$/iu.test(At.replace(t)))return null;const e=(this.charExtractor(t,_)+this.charExtractor(t,p)).padEnd(3,"X").substring(0,3);return e.length<3?null:e.toUpperCase()}firstNameToCf(t){if(!t||(t||"").trim().length<2)return null;const e=this.charExtractor(t,_);return e.length>=4?(e[0]+e.substring(2,4)).toUpperCase():this.lastNameToCf(t)}yearToCf(t){let e;return e="string"==typeof t?parseInt(t,10):t,"number"!=typeof e||isNaN(e)||!(e>=1900||e<100)?null:`0${e}`.substr(-2)}monthToCf(t){return t<0||t>11?null:lt[t]||null}dayGenderToCf(t,e){if(t<1||t>31)return null;const i=Tt[e];return"number"!=typeof i?null:`0${t+i}`.substr(-2)}yearMonthDayToDate(e,i=0,r=1){if(!e||e<1861||[i,r].some((t=>"number"!=typeof t)))return null;const s=t(Date.UTC(e,i||0,r||1));return s.isValid()&&s.year()===e&&s.month()===i&&s.date()===r?s.toDate():null}async parsePlace(t){let e;return t?("object"==typeof t&&t.belfioreCode?e=await this.belfioreConnector.findByCode(t.belfioreCode):"string"==typeof t&&(e=await this.belfioreConnector.findByCode(t)||await this.belfioreConnector.findByName(t)),e||null):null}dateGenderToCf(t,e){const i=E.parseDate(t);if(!i)return null;return`${this.yearToCf(i.getFullYear())}${this.monthToCf(i.getMonth())}${this.dayGenderToCf(i.getDate(),e)}`}async placeToCf(t,e,i){const r=E.parseDate(t);let s,a;if(r||"string"!=typeof t){if(!e)return null;s=e,a=i}else s=t,a=e;let n=this.belfioreConnector;if(a&&(n=n.byProvince(a)),r&&n&&(n=n.from(r)),n){const t=await new Et(n).parsePlace(s);if(t)return t.belfioreCode}return null}async encodeCf({lastName:t,firstName:e,year:i,month:r,day:s,date:a,gender:n,place:o,omocodeId:c=0}){const h=E.parseDate(a)||this.yearMonthDayToDate(i,r,s);if(!(h&&t&&e&&n&&o))return null;const l=[async()=>this.lastNameToCf(t),async()=>this.firstNameToCf(e),async()=>this.dateGenderToCf(h,n),async()=>await this.placeToCf(h,o?.belfioreCode||o)];let d="";for(const t of l){const e=await t();if(!e)return null;d+=e}return this.cfOmocode(d,c)}JOLLY_CHAR="*";checkBitmap(t){return!!(2**t&this.OMOCODE_BITMAP)}charOmocode(t,e){return/^[A-Z]$/giu.test(t)&&this.checkBitmap(e)?ft[t.toUpperCase()]:t}charExtractor(t,e){const i=new RegExp(`[${e}]{1,24}`,"ig");return(At.replace(t).trim().match(i)||[]).join("")}partialCfDeomocode(t,e=0){return t.replace(/[\dA-Z]/giu,((t,i)=>this.charOmocode(t,i+e)))}appyCaseToChar(t,e){if(t&&e){const i=e[0]===e[0].toUpperCase(),r=e[0]===e[0].toLowerCase();if(i&&!r)return t[0].toUpperCase();if(!i&&r)return t[0].toLowerCase()}return t[0]}}const _t="Provided lastName is not valid, only letters, diacritics and apostrophe allowed",pt="Provided name is not valid, only letters, diacritics and apostrophe allowed",Ct="Provided day is not valid",mt="Provided gender is not valid",Rt="Provided day and/or gender are not valid",Dt="Provided year is not valid, only 2 or 4 digit numbers are allowed",Nt="Provided date is not valid";var Mt=Object.freeze({__proto__:null,INVALID_DATE:Nt,INVALID_DAY:Ct,INVALID_DAY_OR_GENDER:Rt,INVALID_GENDER:mt,INVALID_NAME:pt,INVALID_PLACE_NAME:"Proviced City/Country name is not valid",INVALID_SURNAME:_t,INVALID_YEAR:Dt});class It extends Error{constructor(t){super((Object.entries(Mt).find((([e])=>e===t))||[])[1]||t)}}const St=new e;class Ot{belfioreConnector;parser;constructor(t){this.belfioreConnector=t,this.parser=new Et(t)}cfLastName(t){let e=y;if(t){if(!this.lastName().test(t))throw new It(_t);e=this.parser.lastNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfFirstName(t){let e=O;if(t){if(!this.lastName().test(t))throw new It(pt);e=this.parser.firstNameToCf(t)||e}return this.isolatedInsensitiveTailor(e)}cfYear(t){let e=L;if(t){const i=this.parser.yearToCf(t);if(!i)throw new It(Dt);e=this.deomocode(i)}return this.isolatedInsensitiveTailor(e)}cfMonth(t){let e=F;return t&&(e=this.parser.monthToCf(t)||e),this.isolatedInsensitiveTailor(e)}cfDay(t){let e=Y;if(t){const i=this.parser.dayGenderToCf(t,"M"),r=this.parser.dayGenderToCf(t,"F");if(!i||!r)throw new It(Ct);e=`(?:${this.deomocode(i)})|(?:${this.deomocode(r)})`}return this.isolatedInsensitiveTailor(e)}cfDayGender(t,e){if(!e)return this.cfDay(t);let i;if(t){const r=this.parser.dayGenderToCf(t,e);if(!r)throw new It(Rt);i=this.deomocode(r)}else switch(e){case"M":i=V;break;case"F":i=G;break;default:throw new It(mt)}return this.isolatedInsensitiveTailor(i)}cfDateGender(t,e){if(t&&!E.parseDate(t))throw new It(Nt);if(e&&!$t.toArray().includes(e))throw new It(mt);let i=j;if(t){const r=e&&this.parser.dateGenderToCf(t,e);if(r)i=this.deomocode(r);else{const e=e=>{const i=this.parser.dateGenderToCf(t,e);if(!i)throw new It(Nt);return i&&this.deomocode(i)};i=`(?:${$t.toArray().map(e).join("|")})`}}else"M"===e?i=x:"F"===e&&(i=Z);return this.isolatedInsensitiveTailor(i)}async cfPlace(t,e){let i=Q;if(t){const r=E.parseDate(t);if(r&&e){const t=e,s=await this.parser.placeToCf(r,t);i=this.deomocode(s||"")}else if(!r&&"string"==typeof t){const e=t,r=await this.parser.placeToCf(e);i=this.deomocode(r||"")}}return this.isolatedInsensitiveTailor(i)}async codiceFiscale(t){let e=z;if(t){const i=await this.parser.encodeCf(t);if(i)e=this.deomocode(i);else{const{lastName:i,firstName:r,year:s,month:a,day:n,date:o,gender:c,place:h}=t;if(i||r||s||a||n||o||c||h){let t=null;o?t=E.parseDate(o):s&&(t=this.parser.yearMonthDayToDate(s,a,n));const l=[async()=>this.cfLastName(i),async()=>this.cfFirstName(r),async()=>this.cfDateGender(t,c),async()=>await this.cfPlace(t,h?.belfioreCode||h)];e="";for(const t of l){const i=(await t()).toString(),r=i.match(/\^(.{1,256})\$/),s=r&&r[1];if(!s)throw new Error(`Unable to handle [${i}]`);e+=`(?:${s})`}e+=J}}}return this.isolatedInsensitiveTailor(e)}LETTER_SET=`[A-Z${St.matcherBy(/^[A-Z]$/iu)}]`;SEPARATOR_SET="(?:'?\\s{0,4})";lastName(t){let e=`${this.LETTER_SET}{1,24}`;if(t&&/^[A-Z]{1,3}/iu.test(t)){const i=t.substr(0,3),r=t=>t.split("").map((t=>`[${St.insensitiveMatcher[t]}]`)),[s,a]=[`^[${_}]{1,3}`,`[${p}]{1,3}`].map((t=>r((i.match(new RegExp(t,"ig"))||[])[0]||""))),n=`[${p+St.matcherBy(new RegExp(`^[${p}]$`,"ui"))}]`,o=`(?:${n}${this.SEPARATOR_SET}){0,24}`,c=`(?:${this.SEPARATOR_SET}${o}${n})?`;switch(s.length){case 3:{const t=o;e=t+s.join(`${this.SEPARATOR_SET}${t}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;break}case 2:e=`(?:${[`${a[0]}${o}${this.SEPARATOR_SET}${s[0]}${o}${s[1]}`,`${s[0]}${this.SEPARATOR_SET}`+a.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${o}${s[1]}`,s.join(`${this.SEPARATOR_SET}`)+`${this.SEPARATOR_SET}${a[0]}`].join("|")})${c}`;break;case 1:e=`(?:${[a.slice(0,2).join(`${this.SEPARATOR_SET}`)+o+s.join(`${this.SEPARATOR_SET}`),`${a[0]}${this.SEPARATOR_SET}`+s.join(`${this.SEPARATOR_SET}`)+a[1],[s[0],...a.slice(0,2)].join(`${this.SEPARATOR_SET}`)].join("|")})${c}`;break;default:e=`${a.join(`${this.SEPARATOR_SET}`)}${c}`}if(a?.length+s?.length<3)return this.isolatedInsensitiveTailor(`\\s{0,4}(${e})\\s{0,4}`)}return this.isolatedInsensitiveTailor(`\\s{0,4}((?:${e})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\s{0,4}`)}firstName(t){if(t&&new RegExp(`^[A-Z]{3}[${_}]{3}`,"iu").test(t)){const e=((t.substr(3,3).match(new RegExp(`^[${_}]{1,3}`,"ig"))||[])[0]||"").split("").map((t=>`[${St.insensitiveMatcher[t]}]`)),[i,r]=[p,_].map((t=>t+St.matcherBy(new RegExp(`^[${t}]$`,"ui")))),s=`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}${e[0]}${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${r}]${this.SEPARATOR_SET}(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24})?`+e.slice(1,3).join(`(?:[${i}]{1,24}${this.SEPARATOR_SET}){0,24}`)+`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;return this.isolatedInsensitiveTailor(s)}return this.lastName((t||"").substr(3,3))}date(e){let i=u;if(e){const r=this.parser.cfToBirthDate(e);if(r){const e=r.toJSON();if(t().diff(t(r),"y")<50){const t=parseInt(e.substr(0,2),10);i=`(?:${[t-1,t].map((t=>t.toString().padStart(2,"0"))).join("|")})`+e.substr(2,8)}else i=e.substr(0,10)}}return this.isolatedInsensitiveTailor(`${i}(?:T${f}(?:${T})?)?`)}gender(t){const e=t&&this.parser.cfToGender(t)||`[${$t.toArray().join("")}]`;return this.isolatedInsensitiveTailor(e)}async place(t){let e=".{1,32}";const i=t&&await this.parser.cfToBirthPlace(t);if(i){e=`(?:(?:${i.name.replace(/./gu,(t=>St[t]===t?t:`[${t}${St[t]}]`))})|${i.belfioreCode})`}return this.isolatedInsensitiveTailor(e)}deomocode(t){return t.replace(/\d/gu,(t=>`[${t}${ft[t]}]`))}isolatedInsensitiveTailor(t){return new RegExp(`^(?:${t})$`,"iu")}}class yt{codiceFiscale;pattern;parser;constructor(t,e){this.codiceFiscale=e,this.pattern=new Ot(t),this.parser=new Et(t)}get hasLastName(){return this.codiceFiscale?.length>=3}get hasFirstName(){return this.codiceFiscale?.length>=6}get hasBirthYear(){return this.codiceFiscale?.length>=8}get hasBirthDate(){return this.codiceFiscale?.length>=11}get hasGender(){return this.codiceFiscale?.length>=10}get hasBirthPlace(){return this.codiceFiscale?.length>=15}get hasCRC(){return this.codiceFiscale?.length>=16}async matchPersonalInfo(t){return(await this.pattern.codiceFiscale(t)).test(this.codiceFiscale)}async mismatchPersonalInfo(t){return!(!(this.codiceFiscale&&t&&t.lastName&&t.firstName&&(t.date||t.day&&t.month&&t.year)&&t.gender&&t.place)||await this.matchPersonalInfo(t))}matchLastName(t){return this.hasLastName&&this.pattern.lastName(this.codiceFiscale).test(t||"")}mismatchLastName(t){return this.hasLastName&&!!t&&!this.matchLastName(t)}matchFirstName(t){return this.hasFirstName&&this.pattern.firstName(this.codiceFiscale).test(t||"")}mismatchFirstName(t){return this.hasFirstName&&!!t&&!this.matchFirstName(t)}matchBirthDate(e){if(this.hasBirthDate){const i=this.parser.cfToBirthDate(this.codiceFiscale),r=E.parseDate(e);if(i&&r)return t(i).isSame(r,"d")}return!1}mismatchBirthDate(t){return this.hasBirthYear&&!!E.parseDate(t)&&!this.matchBirthDate(t)}matchGender(t){return this.hasGender&&this.pattern.gender(this.codiceFiscale).test(t||"")}mismatchGender(t){return this.hasGender&&!!t&&!this.matchGender(t)}async matchBirthPlace(t){if(this.hasBirthPlace&&t){const e=await this.pattern.place(this.codiceFiscale),i=await this.parser.parsePlace(t);return!!i&&e.test(i?.belfioreCode)}return!1}async mismatchBirthPlace(t){return this.hasBirthPlace&&!!t&&!await this.matchBirthPlace(t)}get errors(){return Promise.all([this.parser.cfToBirthPlace(this.codiceFiscale,!1),this.parser.cfToBirthPlace(this.codiceFiscale,!0)]).then((([t,e])=>({...this.parser.cfToLastName(this.codiceFiscale)?{}:{lastName:"MISSING_OR_INVALID_LAST_NAME"},...this.parser.cfToFirstName(this.codiceFiscale)?{}:{firstName:"MISSING_OR_INVALID_FIRST_NAME"},...this.parser.cfToBirthDate(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DATE"},...this.parser.cfToBirthDay(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_DAY"},...this.parser.cfToBirthMonth(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_MONTH"},...this.parser.cfToBirthYear(this.codiceFiscale)?{}:{date:"MISSING_OR_INVALID_YEAR"},...this.parser.cfToGender(this.codiceFiscale)?{}:{gender:"MISSING_DAY"},...t?{}:{place:"MISSING_OR_INVALID_PLACE"},...e?{}:{place:"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE",date:"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE"},...this.codiceFiscale?.substring(i,16)?.toUpperCase()===ct.checkDigit(this.codiceFiscale)?{}:{crc:"INVALID_CRC_CODE"},...this.hasCRC?{}:{crc:"MISSING_CRC_CODE"}}))).then((t=>Object.keys(t).length?t:null))}get valid(){return Promise.all([this.pattern.codiceFiscale(),this.parser.cfToBirthPlace(this.codiceFiscale)]).then((([t,e])=>!(!this.hasCRC||!t.test(this.codiceFiscale)||this.codiceFiscale?.substring(i,16)?.toUpperCase()!==ct.checkDigit(this.codiceFiscale)||!e)))}get invalid(){return this.valid.then((t=>!!this.codiceFiscale&&!t))}}class gt{belfioreConnector;parser;pattern;constructor(t){this.belfioreConnector=t,this.parser=new Et(t),this.pattern=new Ot(t)}codiceFiscale(t){return new yt(this.belfioreConnector,t)}isLastNameValid(t){return this.pattern.lastName().test(t)}isLastNameInvalid(t){return!!t&&!this.isLastNameValid(t)}isFirstNameValid(t){return this.pattern.firstName().test(t)}isFirstNameInvalid(t){return!!t&&!this.isFirstNameValid(t)}isBirthDateValid(t){return!!E.parseDate(t)}isBirthDateInvalid(t){return!!t&&!this.isBirthDateValid(t)}isGenderValid(t){return this.pattern.gender().test(t)}isGenderInvalid(t){return!!t&&!this.isGenderValid(t)}async isBirthPlaceValid(t){const e=await this.parser.parsePlace(t);return!!e&&!!await this.belfioreConnector.findByCode(e.belfioreCode)}async isBirthPlaceInvalid(t){return!!t&&!await this.isBirthPlaceValid(t)}async birthDatePlaceMatch(e,i){const r=await this.parser.parsePlace(i);return this.isBirthDateValid(e)&&!!r&&(!!await this.belfioreConnector.from(e).findByCode(r.belfioreCode)||!t(E.parseDate(e)).isAfter(ut,"day"))}async birthDatePlaceMismatch(t,e){const i=await this.parser.parsePlace(e);return this.isBirthDateValid(t)&&!!i&&!await this.birthDatePlaceMatch(t,e)}async birthPlaceDateMatch(t,e){return await this.birthDatePlaceMatch(e,t)}async birthPlaceDateMismatch(t,e){return await this.birthDatePlaceMismatch(e,t)}}class Lt{belfioreConnector;validator;parser;pattern;constructor(t){this.belfioreConnector=t,this.validator=new gt(t),this.parser=new Et(t),this.pattern=new Ot(t)}}export{lt as BirthMonth,yt as CFMismatchValidator,ot as CRC,ct as CheckDigitizer,Lt as CodiceFiscaleUtils,A as DATE_MATCHER,E as DateUtils,$t as Gender,at as Matcher,ft as Omocodes,Et as Parser,Ot as Pattern,at as VALIDATOR,gt as Validator,Lt as default}; //# sourceMappingURL=index.mjs.map diff --git a/dist/index.mjs.map b/dist/index.mjs.map index 06736d9..82ee25d 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"file":"index.mjs","sources":["../src/const/cf-offsets.const.ts","../src/date-utils/date-matcher.const.ts","../src/date-utils/date-utils.class.ts","../src/const/matcher.const.ts","../src/enums/crc.enum.ts","../src/enums/birth-month.enum.ts","../src/classes/check-digitizer.class.ts","../src/functions/generator-wrapper.function.ts","../src/enums/gender-weight.enum.ts","../src/enums/omocodes.enum.ts","../src/classes/gender.class.ts","../src/const/logic.const.ts","../src/classes/parser.class.ts","../src/const/error-messages.const.ts","../src/classes/cfu-error.class.ts","../src/classes/pattern.class.ts","../src/classes/cf-mismatch-validator.class.ts","../src/classes/validator.class.ts","../src/index.ts"],"sourcesContent":["export const LASTNAME_OFFSET = 0;\r\nexport const LASTNAME_SIZE = 3;\r\nexport const FIRSTNAME_OFFSET = 3;\r\nexport const FIRSTNAME_SIZE = 3;\r\nexport const YEAR_OFFSET = 6;\r\nexport const YEAR_SIZE = 2;\r\nexport const MONTH_OFFSET = 8;\r\nexport const MONTH_SIZE = 1;\r\nexport const DAY_OFFSET = 9;\r\nexport const DAY_SIZE = 2;\r\nexport const DATE_OFFSET = YEAR_OFFSET;\r\nexport const DATE_SIZE = YEAR_SIZE + MONTH_SIZE + DAY_SIZE;\r\nexport const GENDER_OFFSET = DAY_OFFSET;\r\nexport const GENDER_SIZE = 1;\r\nexport const PLACE_OFFSET = 11;\r\nexport const PLACE_SIZE = 4;\r\nexport const CRC_OFFSET = 15;\r\nexport const CRC_SIZE = 1;\r\nexport const CF_SIZE =\r\n\tLASTNAME_SIZE + FIRSTNAME_SIZE + DATE_SIZE + PLACE_SIZE + CRC_SIZE;\r\n","const YEAR: string = \"[12][0-9]{3}\";\r\nconst MONTH: string = \"0[1-9]|1[0-2]\";\r\nconst DAY: string = \"0[1-9]|[12][0-9]|3[01]\";\r\nconst LEAP_MONTH: string = \"02\";\r\nconst DAYS_30_MONTHS: string = \"0[469]|11\";\r\nconst DAYS_31_MONTHS: string = \"0[13578]|1[02]\";\r\nconst MONTH_DAY: string = `(?:${MONTH})-(?:0[1-9]|[12]\\\\d)|(?:${DAYS_30_MONTHS})-30|(?:${DAYS_31_MONTHS})-3[01]`;\r\nconst HOURS: string = \"[01]\\\\d|2[0-3]\";\r\nconst MINUTES: string = \"[0-5]\\\\d\";\r\nconst SECONDS: string = MINUTES;\r\nconst MILLISECONDS: string = \"\\\\d{3}\";\r\nconst TIMEZONE: string = `Z|[-+](?:${HOURS})(?::?${MINUTES})?`;\r\nconst TIME: string = `(?:${HOURS})(?::${MINUTES}(?::${SECONDS}(\\\\.${MILLISECONDS})?)?(?:${TIMEZONE})?)?`;\r\nconst ISO8601_SHORT_DATE: string = `${YEAR}-(?:${MONTH_DAY})(?:T${TIME})?`;\r\nconst ISO8601_DATE_TIME: string = `${YEAR}(?:-(?:(?:${MONTH})|(?:${MONTH_DAY})(?:T${TIME})?))?`;\r\n\r\n/**\r\n * Date Matcher consts\r\n * @property {Object} DATE_VALIDATOR\r\n * @property {string} DATE_VALIDATOR.YEAR Matcher for ISO8601 4 digits year (limited to 1000-2999)\r\n * @property {string} DATE_VALIDATOR.MONTH Matcher for ISO8601 2 digits month (01-12)\r\n * @property {string} DATE_VALIDATOR.DAY Matcher for ISO8601 2 digits day (01-31)\r\n * @property {string} DATE_VALIDATOR.LEAP_MONTH Matcher for ISO8601 2 digits leap month\r\n * @property {string} DATE_VALIDATOR.DAYS_30_MONTHS Matcher for ISO8601 2 digits 30 days month\r\n * @property {string} DATE_VALIDATOR.DAYS_31_MONTHS Matcher for ISO8601 2 digits 31 days month\r\n * @property {string} DATE_VALIDATOR.MONTH_DAY Matcher for ISO8601 2 + 2 digits (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.ISO8601_SHORT_DATE Matcher for ISO8601 date: 4+2+2 digits year + (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.HOURS Matcher for ISO8601 2 digits hours (00-23)\r\n * @property {string} DATE_VALIDATOR.MINUTES Matcher for ISO8601 2 digits minutes (00-59)\r\n * @property {string} DATE_VALIDATOR.SECONDS Matcher for ISO8601 2 digits seconds (00-59)\r\n * @property {string} DATE_VALIDATOR.MILLISECONDS Matcher for ISO8601 3 digits milliseconds (000-999)\r\n * @property {string} DATE_VALIDATOR.TIMEZONE Matcher for ISO8601 timezone (Z or ±## or ±##:## or ±####)\r\n * @property {string} DATE_VALIDATOR.TIME Matcher for ISO8601 for time (T## , T##:## , T##:##:## , T##:##:##.###)\r\n * @property {string} DATE_VALIDATOR.ISO8601_DATE_TIME Matcher for ISO8601 date/time format\r\n */\r\nexport {\r\n\tDAY,\r\n\tDAYS_30_MONTHS,\r\n\tDAYS_31_MONTHS,\r\n\tHOURS,\r\n\tISO8601_DATE_TIME,\r\n\tISO8601_SHORT_DATE,\r\n\tLEAP_MONTH,\r\n\tMILLISECONDS,\r\n\tMINUTES,\r\n\tMONTH,\r\n\tMONTH_DAY,\r\n\tSECONDS,\r\n\tTIME,\r\n\tTIMEZONE,\r\n\tYEAR,\r\n};\r\n","import moment, { Moment } from \"moment\";\r\nimport type DateDay from \"./date-day.type\";\r\nimport { ISO8601_DATE_TIME } from \"./date-matcher.const\";\r\nimport type DateMonth from \"./date-month.type\";\r\nimport type MultiFormatDate from \"./multi-format-date.type\";\r\nexport default class DateUtils {\r\n\t/**\r\n\t * Parse a Dated and Gender information to create Date/Gender CF part\r\n\t * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @returns Parsed Date or null if not valid\r\n\t */\r\n\tpublic static parseDate(date?: MultiFormatDate | null): Date | null {\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\tdate instanceof Date ||\r\n\t\t\t\tdate instanceof moment ||\r\n\t\t\t\t(typeof date === \"string\" &&\r\n\t\t\t\t\tnew RegExp(`^(?:${ISO8601_DATE_TIME})$`).test(date)) ||\r\n\t\t\t\t(Array.isArray(date) &&\r\n\t\t\t\t\tdate.length &&\r\n\t\t\t\t\t!date.some((value) => typeof value !== \"number\" || isNaN(value)))\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tlet parsedDate: Moment;\r\n\t\t\tif (Array.isArray(date)) {\r\n\t\t\t\tconst [year, month = 0, day = 1] = date;\r\n\t\t\t\tif (month >= 0 && month <= 11 && day > 0 && day <= 31) {\r\n\t\t\t\t\tparsedDate = moment(Date.UTC(year, month || 0, day || 1));\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tparsedDate = moment(date);\r\n\t\t\t}\r\n\t\t\treturn parsedDate.isValid() ? parsedDate.toDate() : null;\r\n\t\t} catch (err) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static ymdToDate(\r\n\t\tyear?: number | null,\r\n\t\tmonth?: DateMonth | null,\r\n\t\tday?: DateDay | null\r\n\t): Date | null {\r\n\t\treturn this.parseDate([year, month, day] as number[]);\r\n\t}\r\n}\r\n","export const CONSONANT_LIST: string = \"B-DF-HJ-NP-TV-Z\";\r\nexport const VOWEL_LIST: string = \"AEIOU\";\r\nexport const OMOCODE_NUMBER_LIST: string = \"\\\\dLMNP-V\";\r\nexport const OMOCODE_NON_ZERO_NUMBER_LIST: string = \"1-9MNP-V\";\r\nexport const OMOCODE_ZERO_LIST: string = \"0L\";\r\nexport const MONTH_LIST: string = \"A-EHLMPR-T\";\r\nexport const MONTH_30DAYS_LIST: string = \"DHPS\";\r\nexport const MONTH_31DAYS_LIST: string = \"ACELMRT\";\r\nexport const CITY_CODE_LIST: string = \"A-M\";\r\nexport const COUNTRY_CODE_LIST: string = \"Z\";\r\n\r\nexport const CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}][${VOWEL_LIST}X]|[${VOWEL_LIST}]X{2}|[${CONSONANT_LIST}]{2}[A-Z]`;\r\nexport const CF_SURNAME_MATCHER: string = CF_NAME_MATCHER;\r\nexport const CF_FULL_NAME_MATCHER: string = `(?:${CF_NAME_MATCHER}){2}`;\r\n\r\nexport const YEAR_MATCHER: string = `[${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const LEAP_YEAR_MATCHER: string =\r\n\t\"[02468LNQSU][048LQU]|[13579MPRTV][26NS]\";\r\nexport const MONTH_MATCHER: string = `[${MONTH_LIST}]`;\r\nexport const DAY_2X_MATCHER: string = \"[26NS]\";\r\nexport const DAY_3X_MATCHER: string = \"[37PT]\";\r\nexport const DAY_29_MATCHER: string = `[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1256MNRS][${OMOCODE_NUMBER_LIST}]`;\r\nexport const DAY_30_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}]`;\r\nexport const DAY_31_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}1M]`;\r\n\r\nexport const DAY_MATCHER: string = `(?:${DAY_29_MATCHER}|${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MALE_DAY_MATCHER: string = `(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[12MN][${OMOCODE_NUMBER_LIST}]|[3P][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const FEMALE_DAY_MATCHER: string = `(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[56RS][${OMOCODE_NUMBER_LIST}]|[7T][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MONTH_DAY_MATCHER: string = `${MONTH_MATCHER}(?:${DAY_29_MATCHER})|[${MONTH_30DAYS_LIST}]${DAY_30_MATCHER}|[${MONTH_31DAYS_LIST}]${DAY_31_MATCHER}`;\r\nexport const FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[15MR][${OMOCODE_NUMBER_LIST}]|${DAY_2X_MATCHER}[0-8LMNP-U])|[${MONTH_30DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_2X_MATCHER}[9V])|(?:${LEAP_YEAR_MATCHER})B${DAY_2X_MATCHER}[9V]`;\r\nexport const MALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1M][${OMOCODE_NUMBER_LIST}]|[2N][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][2N][9V])|(?:${LEAP_YEAR_MATCHER})B[2N][9V]`;\r\nexport const FEMALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[5R][${OMOCODE_NUMBER_LIST}]|[6S][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][6S][9V])|(?:${LEAP_YEAR_MATCHER})B[6S][9V]`;\r\n\r\nexport const CITY_CODE_MATCHER: string = `[${CITY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}|[${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\nexport const COUNTRY_CODE_MATCHER: string = `${COUNTRY_CODE_LIST}[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const BELFIORE_CODE_MATCHER: string = `(?:[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2})|(?:[${CITY_CODE_LIST}][${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\n\r\nexport const CHECK_DIGIT: string = \"[A-Z]\";\r\n\r\nexport const CODICE_FISCALE: string = `${CF_FULL_NAME_MATCHER}(?:${FULL_DATE_MATCHER})(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}`;\r\n\r\nexport const PARTIAL_CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}]?|[${CONSONANT_LIST}]{1,2}`;\r\nexport const PARTIAL_CF_FULL_NAME: string = `(?:${PARTIAL_CF_NAME_MATCHER})|(?:(?:${CF_NAME_MATCHER})(?:${PARTIAL_CF_NAME_MATCHER})?)`;\r\nexport const PARTIAL_YEAR: string = `[${OMOCODE_NUMBER_LIST}]`;\r\nexport const PARTIAL_MONTH_DAY: string = `${MONTH_MATCHER}[${OMOCODE_ZERO_LIST}12456MNQRS]?|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}`;\r\nexport const PARTIAL_FULL_DATE: string = `${PARTIAL_YEAR}|(?:${YEAR_MATCHER}(?:${PARTIAL_MONTH_DAY})?)`;\r\nexport const PARTIAL_BELFIORE_CODE_MATCHER: string = `[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]?)?|[${COUNTRY_CODE_LIST}](?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NUMBER_LIST}]?)?`;\r\n\r\nexport const PARTIAL_CF: string = `${PARTIAL_CF_FULL_NAME}|(?:${CF_FULL_NAME_MATCHER}(?:(?:${PARTIAL_FULL_DATE})|(?:${FULL_DATE_MATCHER})(?:(?:${PARTIAL_BELFIORE_CODE_MATCHER})|(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}?)?)?)?`;\r\n","enum CRC {\r\n \"B\",\r\n \"A\",\r\n \"K\",\r\n \"P\",\r\n \"L\",\r\n \"C\",\r\n \"Q\",\r\n \"D\",\r\n \"R\",\r\n \"E\",\r\n \"V\",\r\n \"O\",\r\n \"S\",\r\n \"F\",\r\n \"T\",\r\n \"G\",\r\n \"U\",\r\n \"H\",\r\n \"M\",\r\n \"I\",\r\n \"N\",\r\n \"J\",\r\n \"W\",\r\n \"Z\",\r\n \"Y\",\r\n \"X\",\r\n}\r\n\r\nexport default CRC;\r\n","enum BirthMonth {\r\n\t\"A\",\r\n\t\"B\",\r\n\t\"C\",\r\n\t\"D\",\r\n\t\"E\",\r\n\t\"H\",\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"P\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n}\r\n\r\nexport default BirthMonth;\r\n","import { CRC_OFFSET, LASTNAME_OFFSET } from \"../const/cf-offsets.const\";\r\nimport { PARTIAL_CF } from \"../const/matcher.const\";\r\nimport CRC from \"../enums/crc.enum\";\r\nimport generatorWrapper from \"../functions/generator-wrapper.function\";\r\nimport type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nimport type CodiceFiscaleCRC from \"../types/codice-fiscale-crc.type\";\r\nclass CheckDigitizer {\r\n\t/**\r\n\t * Evaluate given partial CF to produce last check digit character\r\n\t * @param codiceFiscale Partial or complete Fiscal Code to evaluate to produce last character\r\n\t * @returns 16th CF char\r\n\t */\r\n\tpublic static checkDigit(codiceFiscale: string): CodiceFiscaleCRC | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale === \"string\" &&\r\n\t\t\tnew RegExp(PARTIAL_CF).test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst partialCF = codiceFiscale.substr(LASTNAME_OFFSET, CRC_OFFSET);\r\n\t\t\tlet partialCfValue = 0;\r\n\t\t\tfor (const charValue of this.evaluateChar(partialCF)) {\r\n\t\t\t\tpartialCfValue += charValue as number;\r\n\t\t\t}\r\n\t\t\treturn String.fromCharCode(\r\n\t\t\t\t(partialCfValue % this.CRC_MOD) + this.CHAR_OFFSET\r\n\t\t\t) as CodiceFiscaleCRC;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpublic static evaluateChar(\r\n\t\tpartialCF: string = \"\"\r\n\t): IGeneratorWrapper {\r\n\t\treturn generatorWrapper(this.evaluateCharGenerator(partialCF));\r\n\t}\r\n\r\n\tprivate static CHAR_OFFSET: number = 65;\r\n\tprivate static CRC_MOD: number = 26;\r\n\r\n\t/**\r\n\t * Partial FiscalCode Evaluator\r\n\t * @param Partial Fiscal Code to evaluate\r\n\t * @yields character value odd/even\r\n\t */\r\n\tprivate static *evaluateCharGenerator(partialCF: string = \"\"): Generator {\r\n\t\tif (typeof partialCF === \"string\" && partialCF.length) {\r\n\t\t\tfor (let index = 0; index < partialCF.length; index++) {\r\n\t\t\t\tlet char: string = partialCF[index].toUpperCase();\r\n\t\t\t\tconst isNumber: boolean = /^\\d$/u.test(char);\r\n\t\t\t\tif (isNumber) {\r\n\t\t\t\t\t// Numbers have always (odd/even) the same values of corresponding letters (0-9 => A-J)\r\n\t\t\t\t\tchar = String.fromCharCode(parseInt(char, 10) + this.CHAR_OFFSET);\r\n\t\t\t\t}\r\n\t\t\t\t// Odd/Even are shifted/swapped\r\n\t\t\t\t// array starts from 0, \"Agenzia delle Entrate\" documentation counts the string from 1\r\n\t\t\t\tconst isOdd: boolean = !(index % 2); // Odd according to documentation\r\n\t\t\t\tif (isOdd) {\r\n\t\t\t\t\t// Odd positions\r\n\t\t\t\t\tyield parseInt(CRC[char as any], 10);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Even positions\r\n\t\t\t\t\tyield char.charCodeAt(0) - this.CHAR_OFFSET;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\nexport default CheckDigitizer;\r\n","import type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nexport default function generatorWrapper<\r\n\tT = unknown,\r\n\tTReturn = any,\r\n\tTNext = unknown\r\n>(generator: Generator): IGeneratorWrapper {\r\n\tgenerator[Symbol.iterator] = () => generator;\r\n\treturn generator as IGeneratorWrapper;\r\n}\r\n","enum GenderWeight {\r\n\t\"M\" = 0,\r\n\t\"F\" = 40,\r\n}\r\n\r\nexport default GenderWeight;\r\n","enum Omocodes {\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"N\",\r\n\t\"P\",\r\n\t\"Q\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n\t\"U\",\r\n\t\"V\",\r\n}\r\n\r\nexport default Omocodes;\r\n","import { DateDay } from \"../date-utils/\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport type Genders from \"../types/genders.type\";\r\n\r\nclass Gender {\r\n\tpublic static getDay(genderDay: number): DateDay | null {\r\n\t\tconst plainDay = genderDay % GenderWeight.F;\r\n\t\treturn plainDay > 0 && plainDay <= this.MAX_MONTH_DAY\r\n\t\t\t? (plainDay as DateDay)\r\n\t\t\t: null;\r\n\t}\r\n\r\n\tpublic static getGender(genderDay: number): Genders | null {\r\n\t\treturn (\r\n\t\t\tthis.toArray().find(\r\n\t\t\t\t(gender) =>\r\n\t\t\t\t\tgenderDay >= GenderWeight[gender] &&\r\n\t\t\t\t\tgenderDay <= GenderWeight[gender] + this.MAX_MONTH_DAY\r\n\t\t\t) || null\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static genderizeDay(day: number, gender: Genders): number {\r\n\t\treturn day + GenderWeight[gender];\r\n\t}\r\n\r\n\tpublic static toArray(): Genders[] {\r\n\t\treturn [\"M\", \"F\"];\r\n\t}\r\n\r\n\tprivate static MAX_MONTH_DAY: number = 31;\r\n}\r\n\r\nexport default Gender;\r\n","export const CF_INTRODUCTION_DATE = new Date(\"1973-09-29\");\r\n","import {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport moment from \"moment\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDAY_OFFSET,\r\n\tDAY_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tMONTH_OFFSET,\r\n\tMONTH_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { CF_NAME_MATCHER, CF_SURNAME_MATCHER } from \"../const/matcher.const\";\r\nimport { CONSONANT_LIST, VOWEL_LIST } from \"../const/matcher.const\";\r\nimport { DateDay, DateMonth, DateUtils, MultiFormatDate } from \"../date-utils\";\r\nimport BirthMonth from \"../enums/birth-month.enum\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Gender from \"./gender.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Parser {\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {}\r\n\r\n\t/**\r\n\t * Default omocode bitmap\r\n\t */\r\n\tpublic OMOCODE_BITMAP: number = 0b0111011011000000;\r\n\r\n\t/**\r\n\t * Convert omocode CF into plain one\r\n\t * @param codiceFiscale Partial or complete Omocode/Regular CF to parse, starting from LastName\r\n\t * @returns Regular CF w/o omocodes chars\r\n\t */\r\n\tpublic cfDeomocode(codiceFiscale: string): string {\r\n\t\tif (codiceFiscale && codiceFiscale.length <= YEAR_OFFSET) {\r\n\t\t\treturn codiceFiscale;\r\n\t\t}\r\n\t\tconst deomocodedCf = this.partialCfDeomocode(codiceFiscale);\r\n\t\tif (deomocodedCf.length < CRC_OFFSET) {\r\n\t\t\treturn deomocodedCf;\r\n\t\t}\r\n\t\tconst partialDeomocodedCf = deomocodedCf.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tCRC_OFFSET\r\n\t\t);\r\n\t\treturn (\r\n\t\t\tpartialDeomocodedCf +\r\n\t\t\tthis.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(deomocodedCf) || \"\",\r\n\t\t\t\tdeomocodedCf.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic cfOmocode(codiceFiscale: string, omocodeId: number): string {\r\n\t\tif (!omocodeId) {\r\n\t\t\treturn this.cfDeomocode(codiceFiscale);\r\n\t\t}\r\n\t\tconst omocodedCf = codiceFiscale.split(\"\");\r\n\t\t// tslint:disable-next-line: prefer-for-of\r\n\t\tfor (let i = codiceFiscale.length - 1, o = 0; i >= 0; i--) {\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\tif ((2 ** i) & this.OMOCODE_BITMAP) {\r\n\t\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t\tconst charToEncode: boolean = !!(omocodeId & (2 ** o));\r\n\t\t\t\tconst isOmocode: boolean = isNaN(parseInt(omocodedCf[i], 10));\r\n\t\t\t\tif (charToEncode !== isOmocode) {\r\n\t\t\t\t\tconst char: any = omocodedCf[i].toUpperCase();\r\n\t\t\t\t\tomocodedCf[i] = Omocodes[char];\r\n\t\t\t\t}\r\n\t\t\t\to++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst crc = omocodedCf[CRC_OFFSET];\r\n\t\tif (crc) {\r\n\t\t\tconst partialCf = omocodedCf.slice(LASTNAME_OFFSET, CRC_OFFSET).join(\"\");\r\n\t\t\tomocodedCf[CRC_OFFSET] = this.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(partialCf) || \"\",\r\n\t\t\t\tcrc\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn omocodedCf.join(\"\");\r\n\t}\r\n\r\n\tpublic cfOmocodeId(codiceFiscale: string): number {\r\n\t\tconst cfOmocodeBitmap = codiceFiscale\r\n\t\t\t.split(\"\")\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t.filter((char, index) => (2 ** index) & this.OMOCODE_BITMAP)\r\n\t\t\t.map((char) => (/^[a-z]$/i.test(diacriticRemover[char]) ? 1 : 0))\r\n\t\t\t.join(\"\");\r\n\t\treturn parseInt(cfOmocodeBitmap, 2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible lastName\r\n\t */\r\n\tpublic cfToLastName(codiceFiscale: string): string | null {\r\n\t\tconst cfLastNamePart = codiceFiscale?.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfLastNamePart.length !== LASTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(?:${CF_SURNAME_MATCHER})`, \"iu\").test(cfLastNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst lastNameCf = codiceFiscale.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\r\n\t\tconst [cons = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) || [];\r\n\t\tconst [vow = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`[${VOWEL_LIST}]{1,3}`, \"ig\")) || [];\r\n\r\n\t\tconst matchingLength = cons.length + vow.length;\r\n\r\n\t\tif (\r\n\t\t\tmatchingLength < 2 ||\r\n\t\t\t(matchingLength < 3 && lastNameCf[2].toUpperCase() !== \"X\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (cons.length) {\r\n\t\t\tcase 3:\r\n\t\t\t\treturn (cons + vow).split(\"\").join(this.JOLLY_CHAR) + this.JOLLY_CHAR;\r\n\t\t\tcase 2:\r\n\t\t\t\treturn `${cons[0]}${vow[0]}*${cons[1]}${this.JOLLY_CHAR}`;\r\n\t\t\tcase 1:\r\n\t\t\t\treturn `${cons[0]}${vow}${this.JOLLY_CHAR}`;\r\n\t\t\tdefault:\r\n\t\t\t\treturn `${vow}${vow.length === 3 ? this.JOLLY_CHAR : \"\"}`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible firstName\r\n\t */\r\n\tpublic cfToFirstName(codiceFiscale: string): string | null {\r\n\t\tconst cfFirstNamePart = codiceFiscale?.substring(\r\n\t\t\tFIRSTNAME_OFFSET,\r\n\t\t\tFIRSTNAME_OFFSET + FIRSTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfFirstNamePart?.length !== FIRSTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(${CF_NAME_MATCHER})$`, \"iu\").test(cfFirstNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn this.cfToLastName(cfFirstNamePart);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse gender information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Male or female\r\n\t */\r\n\tpublic cfToGender(codiceFiscale: string): Genders | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < GENDER_OFFSET + GENDER_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfGenderPart = codiceFiscale.substring(\r\n\t\t\tGENDER_OFFSET,\r\n\t\t\tGENDER_OFFSET + GENDER_SIZE\r\n\t\t);\r\n\t\tconst genderInt =\r\n\t\t\tparseInt(this.partialCfDeomocode(cfGenderPart, GENDER_OFFSET), 10) * 10;\r\n\t\treturn Gender.getGender(genderInt);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth year information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Year (4 digits)\r\n\t */\r\n\tpublic cfToBirthYear(codiceFiscale: string): number | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < YEAR_OFFSET + YEAR_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfBirthYearPart = codiceFiscale.substring(\r\n\t\t\tYEAR_OFFSET,\r\n\t\t\tYEAR_OFFSET + YEAR_SIZE\r\n\t\t);\r\n\t\tconst birthYear: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthYearPart, YEAR_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthYear)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst current2DigitsYear: number = parseInt(moment().format(\"YY\"), 10);\r\n\r\n\t\tconst century: number = (birthYear > current2DigitsYear ? 1 : 0) * 100;\r\n\t\treturn moment()\r\n\t\t\t.subtract(current2DigitsYear - birthYear + century, \"years\")\r\n\t\t\t.year();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth month information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Month (0...11 - Date notation)\r\n\t */\r\n\tpublic cfToBirthMonth(codiceFiscale: string): DateMonth | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < MONTH_OFFSET + MONTH_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthMonthPart: any = codiceFiscale\r\n\t\t\t.substring(MONTH_OFFSET, MONTH_OFFSET + MONTH_SIZE)\r\n\t\t\t.toUpperCase();\r\n\t\tconst birthMonth = BirthMonth[cfBirthMonthPart];\r\n\t\tif (typeof birthMonth !== \"number\" || birthMonth < 0 || birthMonth > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn birthMonth as DateMonth;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth day information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth day (1..31)\r\n\t */\r\n\tpublic cfToBirthDay(codiceFiscale: string): DateDay | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < DAY_OFFSET + DAY_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthDayPart = codiceFiscale.substring(\r\n\t\t\tDAY_OFFSET,\r\n\t\t\tDAY_OFFSET + DAY_SIZE\r\n\t\t);\r\n\t\tconst birthDay: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthDayPart, DAY_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthDay)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn Gender.getDay(birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth date information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Date\r\n\t */\r\n\tpublic cfToBirthDate(codiceFiscale: string): Date | null {\r\n\t\tconst birthDay = this.cfToBirthDay(codiceFiscale);\r\n\t\tif (!birthDay) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthMonth = this.cfToBirthMonth(codiceFiscale);\r\n\t\tif (typeof birthMonth !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthYear = this.cfToBirthYear(codiceFiscale);\r\n\r\n\t\treturn DateUtils.ymdToDate(birthYear, birthMonth, birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth place information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @param checkBirthDateConsistency Ensure birthday is between creation and expiran date of the cf city or country, default value: true\r\n\t * @returns Birth place\r\n\t */\r\n\tpublic async cfToBirthPlace(\r\n\t\tcodiceFiscale: string,\r\n\t\tcheckBirthDateConsistency: boolean = true\r\n\t): Promise {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < PLACE_OFFSET + PLACE_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthPlacePart = codiceFiscale.substring(\r\n\t\t\tPLACE_OFFSET,\r\n\t\t\tPLACE_OFFSET + PLACE_SIZE\r\n\t\t);\r\n\t\tconst belfioreCode: string = this.partialCfDeomocode(\r\n\t\t\tcfBirthPlacePart,\r\n\t\t\tPLACE_OFFSET\r\n\t\t);\r\n\r\n\t\tconst birthPlace: BelfiorePlace | undefined | null =\r\n\t\t\tawait this.belfioreConnector.findByCode(belfioreCode);\r\n\t\tif (!birthPlace) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst { creationDate, expirationDate } = birthPlace;\r\n\t\tif ((creationDate || expirationDate) && checkBirthDateConsistency) {\r\n\t\t\tconst birthDate = this.cfToBirthDate(codiceFiscale);\r\n\t\t\tconst isBirthDateAfterCfIntroduction = moment(CF_INTRODUCTION_DATE)\r\n\t\t\t\t// Adding some tolerance\r\n\t\t\t\t.add(5, \"years\")\r\n\t\t\t\t.isBefore(birthDate, \"day\");\r\n\r\n\t\t\t// Skipping birthDate vs Creation/Expiration check for people born up to 5y after cf introduction\r\n\t\t\tif (birthDate && isBirthDateAfterCfIntroduction) {\r\n\t\t\t\tconst datePlaceConsistency =\r\n\t\t\t\t\t// BirthDay is before expiration date\r\n\t\t\t\t\t(!expirationDate ||\r\n\t\t\t\t\t\tmoment(birthDate).isBefore(expirationDate, \"day\")) &&\r\n\t\t\t\t\t// BirthDay is after creation date\r\n\t\t\t\t\t(!creationDate || moment(birthDate).isAfter(creationDate, \"day\"));\r\n\t\t\t\tif (!datePlaceConsistency) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn birthPlace;\r\n\t}\r\n\r\n\t/**\r\n\t * @param fiscalCode 16 character Codice Fiscale to decode\r\n\t * @returns Decoded CF Info\r\n\t */\r\n\tpublic async cfDecode(fiscalCode: string): Promise {\r\n\t\tconst year = this.cfToBirthYear(fiscalCode) || undefined;\r\n\t\t// 0 is a month\r\n\t\tconst month = this.cfToBirthMonth(fiscalCode) ?? undefined;\r\n\t\tconst day = this.cfToBirthDay(fiscalCode) || undefined;\r\n\t\tconst date = DateUtils.ymdToDate(year, month, day) || undefined;\r\n\t\tconst place = await this.cfToBirthPlace(fiscalCode);\r\n\t\tconst personalInfo: IPersonalInfo = {\r\n\t\t\tfirstName: this.cfToFirstName(fiscalCode) || undefined,\r\n\t\t\tlastName: this.cfToLastName(fiscalCode) || undefined,\r\n\r\n\t\t\tday,\r\n\t\t\tmonth,\r\n\t\t\tyear,\r\n\r\n\t\t\tdate,\r\n\r\n\t\t\tgender: this.cfToGender(fiscalCode) || undefined,\r\n\t\t\tplace: place || undefined,\r\n\r\n\t\t\tomocodeId: this.cfOmocodeId(fiscalCode),\r\n\t\t};\r\n\r\n\t\tif (year && month && day) {\r\n\t\t\tpersonalInfo.date = new Date(Date.UTC(year, month, day));\r\n\t\t}\r\n\r\n\t\treturn personalInfo;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName to cf part\r\n\t * @param lastName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic lastNameToCf(lastName?: string | null): string | null {\r\n\t\tif (!lastName || (lastName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (!/^[A-Z ']{1,32}$/iu.test(diacriticRemover.replace(lastName))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst consonants = this.charExtractor(lastName, CONSONANT_LIST);\r\n\t\tconst vowels = this.charExtractor(lastName, VOWEL_LIST);\r\n\r\n\t\tconst partialCf = (consonants + vowels).padEnd(3, \"X\").substring(0, 3);\r\n\r\n\t\tif (partialCf.length < 3) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn partialCf.toUpperCase();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName to cf part\r\n\t * @param firstName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic firstNameToCf(firstName?: string | null): string | null {\r\n\t\tif (!firstName || (firstName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst consonants = this.charExtractor(firstName, CONSONANT_LIST);\r\n\t\tif (consonants.length >= 4) {\r\n\t\t\treturn (consonants[0] + consonants.substring(2, 4)).toUpperCase();\r\n\t\t}\r\n\t\treturn this.lastNameToCf(firstName);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse year to cf part\r\n\t * @param year Birth year 2 or 4 digit string, number above 19XX or below 100\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic yearToCf(year: string | number): string | null {\r\n\t\tlet parsedYear: number;\r\n\t\tif (typeof year === \"string\") {\r\n\t\t\tparsedYear = parseInt(year, 10);\r\n\t\t} else {\r\n\t\t\tparsedYear = year;\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\ttypeof parsedYear === \"number\" &&\r\n\t\t\t\t!isNaN(parsedYear) &&\r\n\t\t\t\t(parsedYear >= 1900 || parsedYear < 100)\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${parsedYear}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse month information\r\n\t * @param month Month number 0..11\r\n\t * @returns Birth Month CF code\r\n\t */\r\n\tpublic monthToCf(month: DateMonth | number): string | null {\r\n\t\tif (month < 0 || month > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn BirthMonth[month] || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse day information\r\n\t * @param day Day number 1..31\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth Day CF code\r\n\t */\r\n\tpublic dayGenderToCf(day: DateDay | number, gender: Genders): string | null {\r\n\t\tif (day < 1 || day > 31) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst genderValue = GenderWeight[gender as any];\r\n\t\tif (typeof genderValue !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${day + genderValue}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Year, Month, Day to Dated\r\n\t * @param year 4 digits Year\r\n\t * @param month 1 or 2 digits Month 0..11\r\n\t * @param day 1,2 digits Day 1..31\r\n\t * @returns Date or null if provided year/month/day are not valid\r\n\t */\r\n\tpublic yearMonthDayToDate(\r\n\t\tyear: number | null | undefined,\r\n\t\tmonth: DateMonth | null | undefined = 0,\r\n\t\tday: DateDay | null | undefined = 1\r\n\t): Date | null {\r\n\t\tif (\r\n\t\t\t!year ||\r\n\t\t\tyear < 1861 ||\r\n\t\t\t[month, day].some((param) => typeof param !== \"number\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst date = moment(Date.UTC(year, month || 0, day || 1));\r\n\t\tif (\r\n\t\t\t!date.isValid() ||\r\n\t\t\tdate.year() !== year ||\r\n\t\t\tdate.month() !== month ||\r\n\t\t\tdate.date() !== day\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn date.toDate();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Place information to return city or country details\r\n\t * @param place Belfiore place instance, belfiore code or city/country name\r\n\t * @returns BelfiorePlace instance with the target city or country details\r\n\t */\r\n\tpublic async parsePlace(\r\n\t\tplace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tlet verifiedBirthPlace: BelfiorePlace | null | undefined;\r\n\t\tif (!place) {\r\n\t\t\treturn null;\r\n\t\t} else if (typeof place === \"object\" && place.belfioreCode) {\r\n\t\t\tverifiedBirthPlace = await this.belfioreConnector.findByCode(\r\n\t\t\t\tplace.belfioreCode\r\n\t\t\t);\r\n\t\t} else if (typeof place === \"string\") {\r\n\t\t\tverifiedBirthPlace =\r\n\t\t\t\t(await this.belfioreConnector.findByCode(place)) ||\r\n\t\t\t\t(await this.belfioreConnector.findByName(place));\r\n\t\t}\r\n\t\treturn verifiedBirthPlace || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Date and Gender information to create Date/Gender CF part\r\n\t * @param date Date or Moment instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth date and Gender CF code\r\n\t */\r\n\tpublic dateGenderToCf(date: MultiFormatDate, gender: Genders): string | null {\r\n\t\tconst parsedDate = DateUtils.parseDate(date);\r\n\t\tif (!parsedDate) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfYear = this.yearToCf(parsedDate.getFullYear());\r\n\t\tconst cfMonth = this.monthToCf(parsedDate.getMonth());\r\n\t\tconst cfDayGender = this.dayGenderToCf(parsedDate.getDate(), gender);\r\n\r\n\t\treturn `${cfYear}${cfMonth}${cfDayGender}`;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse place name and province to Belfiore code\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\t/**\r\n\t * Parse a Date and Gender information to create Date/Gender CF part\r\n\t * @param birthDate Date or Moment instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\tpublic async placeToCf(\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tdateOrName: MultiFormatDate,\r\n\t\tnameOrProvince?: string,\r\n\t\tprovinceId?: string\r\n\t): Promise {\r\n\t\tconst birthDate: Date | null = DateUtils.parseDate(dateOrName);\r\n\t\tlet name: string;\r\n\t\tlet province: string | undefined;\r\n\t\tif (!birthDate && typeof dateOrName === \"string\") {\r\n\t\t\tname = dateOrName;\r\n\t\t\tprovince = nameOrProvince;\r\n\t\t} else if (nameOrProvince) {\r\n\t\t\tname = nameOrProvince;\r\n\t\t\tprovince = provinceId;\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet placeFinder: IBelfioreConnector | undefined = this.belfioreConnector;\r\n\t\tif (province) {\r\n\t\t\tplaceFinder = placeFinder.byProvince(province);\r\n\t\t}\r\n\t\tif (birthDate && placeFinder) {\r\n\t\t\tplaceFinder = placeFinder.from(birthDate);\r\n\t\t}\r\n\t\tif (placeFinder) {\r\n\t\t\tconst foundPlace: BelfiorePlace | null = await new Parser(\r\n\t\t\t\tplaceFinder\r\n\t\t\t).parsePlace(name);\r\n\t\t\tif (foundPlace) {\r\n\t\t\t\treturn foundPlace.belfioreCode;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF\r\n\t * @returns Complete CF\r\n\t */\r\n\tpublic async encodeCf({\r\n\t\tlastName,\r\n\t\tfirstName,\r\n\r\n\t\tyear,\r\n\t\tmonth,\r\n\t\tday,\r\n\t\tdate,\r\n\r\n\t\tgender,\r\n\t\tplace,\r\n\r\n\t\tomocodeId = 0,\r\n\t}: Omit & {\r\n\t\tplace?: BelfiorePlace | string | undefined;\r\n\t}): Promise {\r\n\t\tconst dtParams =\r\n\t\t\tDateUtils.parseDate(date) || this.yearMonthDayToDate(year, month, day);\r\n\t\tif (!(dtParams && lastName && firstName && gender && place)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst generator = [\r\n\t\t\tasync () => this.lastNameToCf(lastName),\r\n\t\t\tasync () => this.firstNameToCf(firstName),\r\n\t\t\tasync () => this.dateGenderToCf(dtParams, gender),\r\n\t\t\tasync () =>\r\n\t\t\t\tawait this.placeToCf(\r\n\t\t\t\t\tdtParams,\r\n\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t),\r\n\t\t];\r\n\t\tlet cf = \"\";\r\n\t\tfor (const cfPartGenerator of generator) {\r\n\t\t\tconst cfValue = await cfPartGenerator();\r\n\t\t\tif (!cfValue) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tcf += cfValue;\r\n\t\t}\r\n\r\n\t\treturn this.cfOmocode(cf, omocodeId);\r\n\t}\r\n\r\n\tprivate JOLLY_CHAR: string = \"*\";\r\n\r\n\tprivate checkBitmap(offset: number): boolean {\r\n\t\t// tslint:disable-next-line: no-bitwise\r\n\t\treturn !!((2 ** offset) & this.OMOCODE_BITMAP);\r\n\t}\r\n\r\n\tprivate charOmocode(char: string, offset: number): string {\r\n\t\tif (/^[A-Z]$/giu.test(char) && this.checkBitmap(offset)) {\r\n\t\t\treturn Omocodes[char.toUpperCase() as any];\r\n\t\t}\r\n\r\n\t\treturn char;\r\n\t}\r\n\r\n\tprivate charExtractor(text: string, CHAR_LIST: string): string {\r\n\t\tconst charMatcher = new RegExp(`[${CHAR_LIST}]{1,24}`, \"ig\");\r\n\t\tconst diacriticFreeText = diacriticRemover.replace(text).trim();\r\n\t\tconst matchingChars = diacriticFreeText.match(charMatcher);\r\n\t\treturn (matchingChars || []).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Convert omocode full or chunk CF into plain one\r\n\t * @param partialCodiceFiscale Partial or complete Omocode/Regular CF to parse\r\n\t * @param offset starting point of the given chunk in the 16 char CF\r\n\t * @returns Regular version w/o omocodes chars of the given chunk\r\n\t */\r\n\tprivate partialCfDeomocode(\r\n\t\tpartialCodiceFiscale: string,\r\n\t\toffset: number = 0\r\n\t): string {\r\n\t\tconst charReplacer = (char: string, position: number) =>\r\n\t\t\tthis.charOmocode(char, position + offset);\r\n\t\treturn partialCodiceFiscale.replace(/[\\dA-Z]/giu, charReplacer);\r\n\t}\r\n\r\n\tprivate appyCaseToChar(targetChar: string, counterCaseChar: string): string {\r\n\t\tif (targetChar && counterCaseChar) {\r\n\t\t\tconst isUpperCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toUpperCase();\r\n\t\t\tconst isLowerCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toLowerCase();\r\n\r\n\t\t\tif (isUpperCase && !isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toUpperCase();\r\n\t\t\t} else if (!isUpperCase && isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toLowerCase();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn targetChar[0];\r\n\t}\r\n}\r\n","const INVALID_SURNAME: string =\r\n\t\"Provided lastName is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_NAME: string =\r\n\t\"Provided name is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_DAY: string = \"Provided day is not valid\";\r\nconst INVALID_GENDER: string = \"Provided gender is not valid\";\r\nconst INVALID_DAY_OR_GENDER: string =\r\n\t\"Provided day and/or gender are not valid\";\r\nconst INVALID_YEAR: string =\r\n\t\"Provided year is not valid, only 2 or 4 digit numbers are allowed\";\r\nconst INVALID_DATE: string = \"Provided date is not valid\";\r\nconst INVALID_PLACE_NAME: string = \"Proviced City/Country name is not valid\";\r\n\r\nexport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_PLACE_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n};\r\n","import * as ErrorMessages from \"../const/error-messages.const\";\r\n\r\nclass CfuError extends Error {\r\n constructor(errorMessage: string)\r\n constructor(errorCode: string) {\r\n super((Object.entries(ErrorMessages).find(([errId]) => errId === errorCode) || [])[1] || errorCode);\r\n }\r\n}\r\n\r\nexport default CfuError;\r\n","import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport moment from \"moment\";\r\nimport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n} from \"../const/error-messages.const\";\r\nimport {\r\n\tBELFIORE_CODE_MATCHER,\r\n\tCF_NAME_MATCHER,\r\n\tCF_SURNAME_MATCHER,\r\n\tCHECK_DIGIT,\r\n\tCODICE_FISCALE,\r\n\tCONSONANT_LIST,\r\n\tDAY_MATCHER,\r\n\tFEMALE_DAY_MATCHER,\r\n\tFEMALE_FULL_DATE_MATCHER,\r\n\tFULL_DATE_MATCHER,\r\n\tMALE_DAY_MATCHER,\r\n\tMALE_FULL_DATE_MATCHER,\r\n\tMONTH_MATCHER,\r\n\tVOWEL_LIST,\r\n\tYEAR_MATCHER,\r\n} from \"../const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tDateUtils,\r\n\tMultiFormatDate,\r\n} from \"../date-utils/\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CfuError from \"./cfu-error.class\";\r\nimport Gender from \"./gender.class\";\r\nimport Parser from \"./parser.class\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Pattern {\r\n\tprivate parser: Parser;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given lastName or generic\r\n\t * @param lastName Optional lastName to generate validation regexp\r\n\t * @return CF Surname matcher\r\n\t * @throw INVALID_SURNAME\r\n\t */\r\n\tpublic cfLastName(lastName?: string): RegExp {\r\n\t\tlet matcher: string = CF_SURNAME_MATCHER;\r\n\t\tif (lastName) {\r\n\t\t\tif (!this.lastName().test(lastName)) {\r\n\t\t\t\tthrow new CfuError(INVALID_SURNAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.lastNameToCf(lastName) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given name or generic\r\n\t * @param name Optional name to generate validation regexp\r\n\t * @return CF name matcher\r\n\t * @throw INVALID_NAME\r\n\t */\r\n\tpublic cfFirstName(name?: string): RegExp {\r\n\t\tlet matcher: string = CF_NAME_MATCHER;\r\n\t\tif (name) {\r\n\t\t\tif (!this.lastName().test(name)) {\r\n\t\t\t\tthrow new CfuError(INVALID_NAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.firstNameToCf(name) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param year Optional year to generate validation regexp\r\n\t * @return CF year matcher\r\n\t */\r\n\tpublic cfYear(year?: number): RegExp {\r\n\t\tlet matcher: string = YEAR_MATCHER;\r\n\t\tif (year) {\r\n\t\t\tconst parsedYear = this.parser.yearToCf(year);\r\n\t\t\tif (parsedYear) {\r\n\t\t\t\tmatcher = this.deomocode(parsedYear);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_YEAR);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given month or generic\r\n\t * @param month Optional month to generate validation regexp\r\n\t * @return CF month matcher\r\n\t */\r\n\tpublic cfMonth(month?: DateMonth) {\r\n\t\tlet matcher: string = MONTH_MATCHER;\r\n\t\tif (month) {\r\n\t\t\tmatcher = this.parser.monthToCf(month) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given day or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @return CF day matcher\r\n\t */\r\n\tpublic cfDay(day?: DateDay): RegExp {\r\n\t\tlet matcher = DAY_MATCHER;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayM = this.parser.dayGenderToCf(day, \"M\");\r\n\t\t\tconst parsedDayF = this.parser.dayGenderToCf(day, \"F\");\r\n\t\t\tif (parsedDayM && parsedDayF) {\r\n\t\t\t\tconst matcherM: string = this.deomocode(parsedDayM);\r\n\t\t\t\tconst matcherF: string = this.deomocode(parsedDayF);\r\n\t\t\t\tmatcher = `(?:${matcherM})|(?:${matcherF})`;\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @param gender Gender @see Genders\r\n\t * @return CF day and gender matcher\r\n\t */\r\n\tpublic cfDayGender(day?: DateDay, gender?: Genders): RegExp {\r\n\t\tif (!gender) {\r\n\t\t\treturn this.cfDay(day);\r\n\t\t}\r\n\t\tlet matcher;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayGender = this.parser.dayGenderToCf(day, gender);\r\n\t\t\tif (parsedDayGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDayGender);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY_OR_GENDER);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tswitch (gender) {\r\n\t\t\t\tcase \"M\":\r\n\t\t\t\t\tmatcher = MALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"F\":\r\n\t\t\t\t\tmatcher = FEMALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param gender @see Genders\r\n\t * @return CF date and gender matcher\r\n\t */\r\n\tpublic cfDateGender(\r\n\t\tdate?: MultiFormatDate | null,\r\n\t\tgender?: Genders | null\r\n\t): RegExp {\r\n\t\tif (date && !DateUtils.parseDate(date)) {\r\n\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t}\r\n\t\tif (gender && !Gender.toArray().includes(gender)) {\r\n\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t}\r\n\t\tlet matcher = FULL_DATE_MATCHER;\r\n\t\tif (date) {\r\n\t\t\tconst parsedDateGender =\r\n\t\t\t\tgender && this.parser.dateGenderToCf(date, gender);\r\n\t\t\tif (parsedDateGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDateGender);\r\n\t\t\t} else {\r\n\t\t\t\tconst parseDeomocode = (g: Genders): string => {\r\n\t\t\t\t\tconst parsedGender = this.parser.dateGenderToCf(date, g);\r\n\t\t\t\t\tif (!parsedGender) {\r\n\t\t\t\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn parsedGender && this.deomocode(parsedGender);\r\n\t\t\t\t};\r\n\t\t\t\tmatcher = `(?:${Gender.toArray().map(parseDeomocode).join(\"|\")})`;\r\n\t\t\t}\r\n\t\t} else if (gender === \"M\") {\r\n\t\t\tmatcher = MALE_FULL_DATE_MATCHER;\r\n\t\t} else if (gender === \"F\") {\r\n\t\t\tmatcher = FEMALE_FULL_DATE_MATCHER;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\t/**\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\tpublic async cfPlace(placeName?: string | null): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDate?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDateOrName?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise {\r\n\t\tlet matcher = BELFIORE_CODE_MATCHER;\r\n\t\tif (birthDateOrName) {\r\n\t\t\tconst birthDate: Date | null = DateUtils.parseDate(birthDateOrName);\r\n\r\n\t\t\tif (birthDate && placeName) {\r\n\t\t\t\tconst place: string = placeName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(birthDate, place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t} else if (!birthDate && typeof birthDateOrName === \"string\") {\r\n\t\t\t\tconst place: string = birthDateOrName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF validator based on given optional input or generic\r\n\t * @param personalInfo Input Object\r\n\t * @return CodiceFiscale matcher\r\n\t */\r\n\tpublic async codiceFiscale(\r\n\t\tpersonalInfo?: Omit & {\r\n\t\t\tplace?: BelfiorePlace | string | undefined;\r\n\t\t}\r\n\t): Promise {\r\n\t\tlet matcher = CODICE_FISCALE;\r\n\t\tif (personalInfo) {\r\n\t\t\tconst parsedCf = await this.parser.encodeCf(personalInfo);\r\n\r\n\t\t\tif (parsedCf) {\r\n\t\t\t\tmatcher = this.deomocode(parsedCf);\r\n\t\t\t} else {\r\n\t\t\t\tconst { lastName, firstName, year, month, day, date, gender, place } =\r\n\t\t\t\t\tpersonalInfo;\r\n\t\t\t\tif (\r\n\t\t\t\t\tlastName ||\r\n\t\t\t\t\tfirstName ||\r\n\t\t\t\t\tyear ||\r\n\t\t\t\t\tmonth ||\r\n\t\t\t\t\tday ||\r\n\t\t\t\t\tdate ||\r\n\t\t\t\t\tgender ||\r\n\t\t\t\t\tplace\r\n\t\t\t\t) {\r\n\t\t\t\t\tlet dtParams: Date | null = null;\r\n\t\t\t\t\tif (date) {\r\n\t\t\t\t\t\tdtParams = DateUtils.parseDate(date);\r\n\t\t\t\t\t} else if (year) {\r\n\t\t\t\t\t\tdtParams = this.parser.yearMonthDayToDate(year, month, day);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst generator: (() => Promise)[] = [\r\n\t\t\t\t\t\tasync () => this.cfLastName(lastName),\r\n\t\t\t\t\t\tasync () => this.cfFirstName(firstName),\r\n\t\t\t\t\t\tasync () => this.cfDateGender(dtParams, gender),\r\n\t\t\t\t\t\tasync () =>\r\n\t\t\t\t\t\t\tawait this.cfPlace(\r\n\t\t\t\t\t\t\t\tdtParams,\r\n\t\t\t\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t\t\t\t),\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\tmatcher = \"\";\r\n\t\t\t\t\tfor (const validator of generator) {\r\n\t\t\t\t\t\tconst cfMatcher = (await validator()).toString();\r\n\t\t\t\t\t\tconst match = cfMatcher.match(/\\^(.{1,256})\\$/);\r\n\t\t\t\t\t\tconst cfValue: string | null | undefined = match && match[1];\r\n\r\n\t\t\t\t\t\tif (!cfValue) {\r\n\t\t\t\t\t\t\tthrow new Error(`Unable to handle [${cfMatcher}]`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmatcher += `(?:${cfValue})`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Final addition of CheckDigit\r\n\t\t\t\t\tmatcher += CHECK_DIGIT;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tprivate LETTER_SET: string = `[A-Z${diacriticRemover.matcherBy(\r\n\t\t/^[A-Z]$/iu\r\n\t)}]`;\r\n\tprivate SEPARATOR_SET: string = \"(?:'?\\\\s{0,4})\";\r\n\r\n\t/**\r\n\t * Returns lastName validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic lastName(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = `${this.LETTER_SET}{1,24}`;\r\n\t\tif (codiceFiscale && /^[A-Z]{1,3}/iu.test(codiceFiscale)) {\r\n\t\t\tconst lastNameCf: string = codiceFiscale.substr(0, 3);\r\n\t\t\tconst diacriticizer = (matchingChars: string) =>\r\n\t\t\t\tmatchingChars\r\n\t\t\t\t\t.split(\"\")\r\n\t\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [cons, vow] = [\r\n\t\t\t\t`^[${CONSONANT_LIST}]{1,3}`,\r\n\t\t\t\t`[${VOWEL_LIST}]{1,3}`,\r\n\t\t\t].map((charMatcher) =>\r\n\t\t\t\tdiacriticizer(\r\n\t\t\t\t\t(lastNameCf.match(new RegExp(charMatcher, \"ig\")) || [])[0] || \"\"\r\n\t\t\t\t)\r\n\t\t\t);\r\n\r\n\t\t\tconst diacriticsVowelList: string =\r\n\t\t\t\tVOWEL_LIST +\r\n\t\t\t\tdiacriticRemover.matcherBy(new RegExp(`^[${VOWEL_LIST}]$`, \"ui\"));\r\n\t\t\tconst diacriticsVowelMatcher: string = `[${diacriticsVowelList}]`;\r\n\t\t\tconst midDiacriticVowelMatcher: string = `(?:${diacriticsVowelMatcher}${this.SEPARATOR_SET}){0,24}`;\r\n\t\t\tconst endingDiacritcVowelMatcher: string = `(?:${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${diacriticsVowelMatcher})?`;\r\n\t\t\tswitch (cons.length) {\r\n\t\t\t\tcase 3: {\r\n\t\t\t\t\tconst divider = midDiacriticVowelMatcher;\r\n\t\t\t\t\tmatcher =\r\n\t\t\t\t\t\tdivider +\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}${divider}`) +\r\n\t\t\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 2: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\t`${vow[0]}${midDiacriticVowelMatcher}${this.SEPARATOR_SET}${cons[0]}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\t`${cons[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tvow.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${vow[0]}`,\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 1: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\tvow.slice(0, 2).join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tmidDiacriticVowelMatcher +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t\t`${vow[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tvow[1],\r\n\t\t\t\t\t\t[cons[0], ...vow.slice(0, 2)].join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tmatcher = `${vow.join(\r\n\t\t\t\t\t\t`${this.SEPARATOR_SET}`\r\n\t\t\t\t\t)}${endingDiacritcVowelMatcher}`;\r\n\t\t\t}\r\n\r\n\t\t\tif (vow?.length + cons?.length < 3) {\r\n\t\t\t\treturn this.isolatedInsensitiveTailor(`\\\\s{0,4}(${matcher})\\\\s{0,4}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`\\\\s{0,4}((?:${matcher})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\\\s{0,4}`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns name validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic firstName(codiceFiscale?: string): RegExp {\r\n\t\tif (\r\n\t\t\tcodiceFiscale &&\r\n\t\t\tnew RegExp(`^[A-Z]{3}[${CONSONANT_LIST}]{3}`, \"iu\").test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst nameCf: string = codiceFiscale.substr(3, 3);\r\n\r\n\t\t\tconst cons: string[] = (\r\n\t\t\t\t(nameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) ||\r\n\t\t\t\t\t[])[0] || \"\"\r\n\t\t\t)\r\n\t\t\t\t.split(\"\")\r\n\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [diacriticsVowelList, diacriticsConsonantList]: string[] = [\r\n\t\t\t\tVOWEL_LIST,\r\n\t\t\t\tCONSONANT_LIST,\r\n\t\t\t].map(\r\n\t\t\t\t(chars) =>\r\n\t\t\t\t\tchars + diacriticRemover.matcherBy(new RegExp(`^[${chars}]$`, \"ui\"))\r\n\t\t\t);\r\n\r\n\t\t\tconst matcher: string =\r\n\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}${cons[0]}${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${diacriticsConsonantList}]${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24})?` +\r\n\t\t\t\tcons\r\n\t\t\t\t\t.slice(1, 3)\r\n\t\t\t\t\t.join(\r\n\t\t\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}`\r\n\t\t\t\t\t) +\r\n\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;\r\n\r\n\t\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t\t}\r\n\t\treturn this.lastName((codiceFiscale || \"\").substr(3, 3));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns iso8601 date validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic date(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = DATE_MATCHER.ISO8601_DATE_TIME;\r\n\t\tif (codiceFiscale) {\r\n\t\t\tconst parsedDate = this.parser.cfToBirthDate(codiceFiscale);\r\n\t\t\tif (parsedDate) {\r\n\t\t\t\tconst dateIso8601: string = parsedDate.toJSON();\r\n\t\t\t\tif (moment().diff(moment(parsedDate), \"y\") < 50) {\r\n\t\t\t\t\tconst century: number = parseInt(dateIso8601.substr(0, 2), 10);\r\n\t\t\t\t\tconst centuries: string[] = [century - 1, century].map((year) =>\r\n\t\t\t\t\t\tyear.toString().padStart(2, \"0\")\r\n\t\t\t\t\t);\r\n\t\t\t\t\tmatcher = `(?:${centuries.join(\"|\")})` + dateIso8601.substr(2, 8);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmatcher = dateIso8601.substr(0, 10);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`${matcher}(?:T${DATE_MATCHER.TIME}(?:${DATE_MATCHER.TIMEZONE})?)?`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns gender validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic gender(codiceFiscale?: string): RegExp {\r\n\t\tconst parsedGender = codiceFiscale && this.parser.cfToGender(codiceFiscale);\r\n\t\tconst matcher: string = parsedGender || `[${Gender.toArray().join(\"\")}]`;\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns place validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic async place(codiceFiscale?: string): Promise {\r\n\t\tlet matcher: string = \".{1,32}\";\r\n\t\tconst parsedPlace =\r\n\t\t\tcodiceFiscale && (await this.parser.cfToBirthPlace(codiceFiscale));\r\n\r\n\t\tif (parsedPlace) {\r\n\t\t\tconst nameMatcher: string = parsedPlace.name.replace(/./gu, (c) =>\r\n\t\t\t\tdiacriticRemover[c] === c ? c : `[${c}${diacriticRemover[c]}]`\r\n\t\t\t);\r\n\t\t\tmatcher = `(?:(?:${nameMatcher})|${parsedPlace.belfioreCode})`;\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tpublic deomocode(omocode: string): string {\r\n\t\treturn omocode.replace(/\\d/gu, (n: any) => `[${n}${Omocodes[n]}]`);\r\n\t}\r\n\r\n\tprivate isolatedInsensitiveTailor(matcher: string): RegExp {\r\n\t\treturn new RegExp(`^(?:${matcher})$`, \"iu\");\r\n\t}\r\n}\r\n","import moment from \"moment\";\r\nimport {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDATE_OFFSET,\r\n\tDATE_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport type IMismatchVerboseErrors from \"../interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport default class CFMismatchValidator {\r\n\tprivate pattern: Pattern;\r\n\tprivate parser: Parser;\r\n\tconstructor(\r\n\t\tbelfioreConnector: IBelfioreConnector,\r\n\t\tprivate readonly codiceFiscale: string\r\n\t) {\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\tprivate get hasLastName() {\r\n\t\treturn this.codiceFiscale?.length >= LASTNAME_OFFSET + LASTNAME_SIZE;\r\n\t}\r\n\r\n\tprivate get hasFirstName() {\r\n\t\treturn this.codiceFiscale?.length >= FIRSTNAME_OFFSET + FIRSTNAME_SIZE;\r\n\t}\r\n\tprivate get hasBirthYear() {\r\n\t\treturn this.codiceFiscale?.length >= YEAR_OFFSET + YEAR_SIZE;\r\n\t}\r\n\tprivate get hasBirthDate() {\r\n\t\treturn this.codiceFiscale?.length >= DATE_OFFSET + DATE_SIZE;\r\n\t}\r\n\tprivate get hasGender() {\r\n\t\treturn this.codiceFiscale?.length >= GENDER_OFFSET + GENDER_SIZE;\r\n\t}\r\n\tprivate get hasBirthPlace() {\r\n\t\treturn this.codiceFiscale?.length >= PLACE_OFFSET + PLACE_SIZE;\r\n\t}\r\n\r\n\tprivate get hasCRC() {\r\n\t\treturn this.codiceFiscale?.length >= CRC_OFFSET + CRC_SIZE;\r\n\t}\r\n\r\n\tpublic async matchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn (await this.pattern.codiceFiscale(personalInfo)).test(\r\n\t\t\tthis.codiceFiscale\r\n\t\t);\r\n\t}\r\n\tpublic async mismatchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn !!(\r\n\t\t\tthis.codiceFiscale &&\r\n\t\t\tpersonalInfo &&\r\n\t\t\tpersonalInfo.lastName &&\r\n\t\t\tpersonalInfo.firstName &&\r\n\t\t\t(personalInfo.date ||\r\n\t\t\t\t(personalInfo.day && personalInfo.month && personalInfo.year)) &&\r\n\t\t\tpersonalInfo.gender &&\r\n\t\t\tpersonalInfo.place &&\r\n\t\t\t!(await this.matchPersonalInfo(personalInfo))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchLastName(lastName?: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasLastName &&\r\n\t\t\tthis.pattern.lastName(this.codiceFiscale).test(lastName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchLastName(lastName?: string): boolean {\r\n\t\treturn this.hasLastName && !!lastName && !this.matchLastName(lastName);\r\n\t}\r\n\r\n\tpublic matchFirstName(firstName: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasFirstName &&\r\n\t\t\tthis.pattern.firstName(this.codiceFiscale).test(firstName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchFirstName(firstName: string): boolean {\r\n\t\treturn this.hasFirstName && !!firstName && !this.matchFirstName(firstName);\r\n\t}\r\n\r\n\tpublic matchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\tif (this.hasBirthDate) {\r\n\t\t\tconst parsedCfDate = this.parser.cfToBirthDate(this.codiceFiscale);\r\n\t\t\tconst parsedDate = DateUtils.parseDate(birthDate);\r\n\t\t\tif (parsedCfDate && parsedDate) {\r\n\t\t\t\treturn moment(parsedCfDate).isSame(parsedDate, \"d\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic mismatchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthYear &&\r\n\t\t\t!!DateUtils.parseDate(birthDate) &&\r\n\t\t\t!this.matchBirthDate(birthDate)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchGender(gender: Genders | string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasGender &&\r\n\t\t\tthis.pattern.gender(this.codiceFiscale).test(gender || \"\")\r\n\t\t);\r\n\t}\r\n\r\n\tpublic mismatchGender(gender: Genders | string): boolean {\r\n\t\treturn this.hasGender && !!gender && !this.matchGender(gender);\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async matchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tif (this.hasBirthPlace && birthPlace) {\r\n\t\t\tconst matcher = await this.pattern.place(this.codiceFiscale);\r\n\t\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\r\n\t\t\treturn !!parsedBirthPlace && matcher.test(parsedBirthPlace?.belfioreCode);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async mismatchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthPlace &&\r\n\t\t\t!!birthPlace &&\r\n\t\t\t!(await this.matchBirthPlace(birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @param codiceFiscale Complete CF to parse\r\n\t * @return Verbose errors\r\n\t */\r\n\tpublic get errors(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, false),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, true),\r\n\t\t])\r\n\t\t\t.then(([placeCheck, placeCreationExpirationCheck]) => ({\r\n\t\t\t\t// Checking lastName validity\r\n\t\t\t\t...(this.parser.cfToLastName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { lastName: \"MISSING_OR_INVALID_LAST_NAME\" }),\r\n\t\t\t\t// Checking firstName validity\r\n\t\t\t\t...(this.parser.cfToFirstName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { firstName: \"MISSING_OR_INVALID_FIRST_NAME\" }),\r\n\t\t\t\t// Checking Date validity\r\n\t\t\t\t...(this.parser.cfToBirthDate(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DATE\" }),\r\n\t\t\t\t// Checking Day validity\r\n\t\t\t\t...(this.parser.cfToBirthDay(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DAY\" }),\r\n\t\t\t\t// Checking Month validity\r\n\t\t\t\t...(this.parser.cfToBirthMonth(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_MONTH\" }),\r\n\t\t\t\t// Checking Year validity\r\n\t\t\t\t...(this.parser.cfToBirthYear(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_YEAR\" }),\r\n\t\t\t\t// Checking Gender validity\r\n\t\t\t\t...(this.parser.cfToGender(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { gender: \"MISSING_DAY\" }),\r\n\t\t\t\t// Checking Place validity\r\n\t\t\t\t...(placeCheck ? {} : { place: \"MISSING_OR_INVALID_PLACE\" }),\r\n\t\t\t\t// Checking Place Creation/Expiration vs Birthdate validity\r\n\t\t\t\t...(placeCreationExpirationCheck\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: {\r\n\t\t\t\t\t\t\tplace: \"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE\",\r\n\t\t\t\t\t\t\tdate: \"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE\",\r\n\t\t\t\t\t }),\r\n\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t...(this.codiceFiscale\r\n\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t?.toUpperCase() === CheckDigitizer.checkDigit(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { crc: \"INVALID_CRC_CODE\" }),\r\n\r\n\t\t\t\t// Checking length\r\n\t\t\t\t...(this.hasCRC ? {} : { crc: \"MISSING_CRC_CODE\" }),\r\n\t\t\t}))\r\n\t\t\t.then((errors) => (Object.keys(errors).length ? errors : null));\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic get valid(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.pattern.codiceFiscale(),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale),\r\n\t\t]).then(\r\n\t\t\t([cfPattern, cfToBirthPlace]) =>\r\n\t\t\t\t!(\r\n\t\t\t\t\t// Checking length\r\n\t\t\t\t\t(\r\n\t\t\t\t\t\t!this.hasCRC ||\r\n\t\t\t\t\t\t// Checking form validity\r\n\t\t\t\t\t\t!cfPattern.test(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t\t\tthis.codiceFiscale\r\n\t\t\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t\t\t?.toUpperCase() !==\r\n\t\t\t\t\t\t\tCheckDigitizer.checkDigit(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking Birth date/place validity\r\n\t\t\t\t\t\t!cfToBirthPlace\r\n\t\t\t\t\t)\r\n\t\t\t\t)\r\n\t\t);\r\n\t}\r\n\tpublic get invalid(): Promise {\r\n\t\treturn this.valid.then((isValid) => !!this.codiceFiscale && !isValid);\r\n\t}\r\n}\r\n","import {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport moment from \"moment\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CFMismatchValidator from \"./cf-mismatch-validator.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\n\r\nexport default class Validator {\r\n\tprivate parser: Parser;\r\n\tprivate pattern: Pattern;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n\r\n\tpublic codiceFiscale(codiceFiscale: string): CFMismatchValidator {\r\n\t\treturn new CFMismatchValidator(this.belfioreConnector, codiceFiscale);\r\n\t}\r\n\r\n\tpublic isLastNameValid(lastName: string): boolean {\r\n\t\treturn this.pattern.lastName().test(lastName);\r\n\t}\r\n\tpublic isLastNameInvalid(lastName: string): boolean {\r\n\t\treturn !!lastName && !this.isLastNameValid(lastName);\r\n\t}\r\n\r\n\tpublic isFirstNameValid(firstName: string): boolean {\r\n\t\treturn this.pattern.firstName().test(firstName);\r\n\t}\r\n\tpublic isFirstNameInvalid(firstName: string): boolean {\r\n\t\treturn !!firstName && !this.isFirstNameValid(firstName);\r\n\t}\r\n\r\n\tpublic isBirthDateValid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!DateUtils.parseDate(birthDate);\r\n\t}\r\n\tpublic isBirthDateInvalid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!birthDate && !this.isBirthDateValid(birthDate);\r\n\t}\r\n\r\n\tpublic isGenderValid(gender: Genders | string): boolean {\r\n\t\treturn this.pattern.gender().test(gender);\r\n\t}\r\n\tpublic isGenderInvalid(gender: Genders | string): boolean {\r\n\t\treturn !!gender && !this.isGenderValid(gender);\r\n\t}\r\n\r\n\tpublic async isBirthPlaceValid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\t!!parsedBirthPlace &&\r\n\t\t\t!!(await this.belfioreConnector.findByCode(parsedBirthPlace.belfioreCode))\r\n\t\t);\r\n\t}\r\n\tpublic async isBirthPlaceInvalid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn !!birthPlace && !(await this.isBirthPlaceValid(birthPlace));\r\n\t}\r\n\r\n\tpublic async birthDatePlaceMatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t(!!(await this.belfioreConnector\r\n\t\t\t\t.from(birthDate)\r\n\t\t\t\t.findByCode(parsedPlace.belfioreCode)) ||\r\n\t\t\t\t// Ignoring control for people born before CF introduction\r\n\t\t\t\tmoment(DateUtils.parseDate(birthDate)).isSameOrBefore(\r\n\t\t\t\t\tCF_INTRODUCTION_DATE,\r\n\t\t\t\t\t\"day\"\r\n\t\t\t\t))\r\n\t\t);\r\n\t}\r\n\tpublic async birthDatePlaceMismatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t!(await this.birthDatePlaceMatch(birthDate, birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMatch(birthDate, birthPlace);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMismatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMismatch(birthDate, birthPlace);\r\n\t}\r\n}\r\n","import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport CFMismatchValidator from \"./classes/cf-mismatch-validator.class\";\r\nimport CheckDigitizer from \"./classes/check-digitizer.class\";\r\nimport Gender from \"./classes/gender.class\";\r\nimport Parser from \"./classes/parser.class\";\r\nimport Pattern from \"./classes/pattern.class\";\r\nimport Validator from \"./classes/validator.class\";\r\nimport * as VALIDATOR from \"./const/matcher.const\";\r\nimport * as Matcher from \"./const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\ttype DateDay,\r\n\ttype DateMonth,\r\n\tDateUtils,\r\n\ttype MultiFormatDate,\r\n} from \"./date-utils/\";\r\nimport BirthMonth from \"./enums/birth-month.enum\";\r\nimport CRC from \"./enums/crc.enum\";\r\nimport Omocodes from \"./enums/omocodes.enum\";\r\nimport type Genders from \"./types/genders.type\";\r\nimport IMismatchVerboseErrors from \"./interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport type {\r\n\tBelfiorePlace,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tGenders,\r\n\tMultiFormatDate,\r\n\tIMismatchVerboseErrors,\r\n};\r\n\r\nexport default class CodiceFiscaleUtils {\r\n\tpublic readonly validator: Validator;\r\n\tpublic readonly parser: Parser;\r\n\tpublic readonly pattern: Pattern;\r\n\r\n\tconstructor(public readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.validator = new Validator(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n}\r\n\r\nexport {\r\n\tBirthMonth,\r\n\tCheckDigitizer,\r\n\tCRC,\r\n\tDATE_MATCHER,\r\n\tDateUtils,\r\n\tGender,\r\n\tOmocodes,\r\n\tVALIDATOR,\r\n\tMatcher,\r\n\tCFMismatchValidator,\r\n\tParser,\r\n\tPattern,\r\n\tValidator,\r\n\tCodiceFiscaleUtils,\r\n};\r\n"],"names":["CRC_OFFSET","YEAR","MONTH","DAYS_30_MONTHS","DAYS_31_MONTHS","MONTH_DAY","HOURS","MINUTES","SECONDS","MILLISECONDS","TIMEZONE","TIME","ISO8601_SHORT_DATE","ISO8601_DATE_TIME","DateUtils","parseDate","date","Date","moment","RegExp","test","Array","isArray","length","some","value","isNaN","parsedDate","year","month","day","UTC","isValid","toDate","err","ymdToDate","this","CONSONANT_LIST","VOWEL_LIST","OMOCODE_NUMBER_LIST","OMOCODE_NON_ZERO_NUMBER_LIST","OMOCODE_ZERO_LIST","MONTH_LIST","MONTH_30DAYS_LIST","MONTH_31DAYS_LIST","CITY_CODE_LIST","COUNTRY_CODE_LIST","CF_NAME_MATCHER","CF_SURNAME_MATCHER","CF_FULL_NAME_MATCHER","YEAR_MATCHER","LEAP_YEAR_MATCHER","MONTH_MATCHER","DAY_2X_MATCHER","DAY_3X_MATCHER","DAY_29_MATCHER","DAY_30_MATCHER","DAY_31_MATCHER","DAY_MATCHER","MALE_DAY_MATCHER","FEMALE_DAY_MATCHER","MONTH_DAY_MATCHER","FULL_DATE_MATCHER","MALE_FULL_DATE_MATCHER","FEMALE_FULL_DATE_MATCHER","CITY_CODE_MATCHER","COUNTRY_CODE_MATCHER","BELFIORE_CODE_MATCHER","CHECK_DIGIT","CODICE_FISCALE","PARTIAL_CF_NAME_MATCHER","PARTIAL_CF_FULL_NAME","PARTIAL_YEAR","PARTIAL_MONTH_DAY","PARTIAL_FULL_DATE","PARTIAL_BELFIORE_CODE_MATCHER","PARTIAL_CF","CRC","BirthMonth","CRC$1","CheckDigitizer","checkDigit","codiceFiscale","partialCF","substr","partialCfValue","charValue","evaluateChar","String","fromCharCode","CRC_MOD","CHAR_OFFSET","generator","evaluateCharGenerator","Symbol","iterator","static","index","char","toUpperCase","parseInt","charCodeAt","GenderWeight","BirthMonth$1","Omocodes","GenderWeight$1","Omocodes$1","Gender","getDay","genderDay","plainDay","F","MAX_MONTH_DAY","getGender","toArray","find","gender","genderizeDay","CF_INTRODUCTION_DATE","diacriticRemover","DiacriticRemover","Parser","belfioreConnector","constructor","OMOCODE_BITMAP","cfDeomocode","deomocodedCf","partialCfDeomocode","substring","appyCaseToChar","cfOmocode","omocodeId","omocodedCf","split","i","o","crc","partialCf","slice","join","cfOmocodeId","cfOmocodeBitmap","filter","map","cfToLastName","cfLastNamePart","LASTNAME_OFFSET","lastNameCf","cons","match","vow","matchingLength","JOLLY_CHAR","cfToFirstName","cfFirstNamePart","FIRSTNAME_OFFSET","cfToGender","GENDER_OFFSET","cfGenderPart","genderInt","cfToBirthYear","YEAR_OFFSET","cfBirthYearPart","birthYear","current2DigitsYear","format","century","subtract","cfToBirthMonth","MONTH_OFFSET","cfBirthMonthPart","birthMonth","cfToBirthDay","DAY_OFFSET","cfBirthDayPart","birthDay","cfToBirthDate","cfToBirthPlace","checkBirthDateConsistency","PLACE_OFFSET","cfBirthPlacePart","belfioreCode","birthPlace","findByCode","creationDate","expirationDate","birthDate","isBirthDateAfterCfIntroduction","add","isBefore","isAfter","cfDecode","fiscalCode","undefined","place","personalInfo","firstName","lastName","lastNameToCf","trim","replace","charExtractor","padEnd","firstNameToCf","consonants","yearToCf","parsedYear","monthToCf","dayGenderToCf","genderValue","yearMonthDayToDate","param","parsePlace","verifiedBirthPlace","findByName","dateGenderToCf","getFullYear","getMonth","getDate","placeToCf","dateOrName","nameOrProvince","provinceId","name","province","placeFinder","byProvince","from","foundPlace","encodeCf","dtParams","async","cf","cfPartGenerator","cfValue","checkBitmap","offset","charOmocode","text","CHAR_LIST","charMatcher","partialCodiceFiscale","position","targetChar","counterCaseChar","isUpperCase","isLowerCase","toLowerCase","INVALID_SURNAME","INVALID_NAME","INVALID_DAY","INVALID_GENDER","INVALID_DAY_OR_GENDER","INVALID_YEAR","INVALID_DATE","CfuError","Error","errorCode","super","Object","entries","ErrorMessages","errId","Pattern","parser","cfLastName","matcher","isolatedInsensitiveTailor","cfFirstName","cfYear","deomocode","cfMonth","cfDay","parsedDayM","parsedDayF","cfDayGender","parsedDayGender","cfDateGender","includes","parsedDateGender","parseDeomocode","g","parsedGender","cfPlace","birthDateOrName","placeName","parsedPlace","parsedCf","validator","cfMatcher","toString","LETTER_SET","matcherBy","SEPARATOR_SET","diacriticizer","matchingChars","insensitiveMatcher","diacriticsVowelMatcher","midDiacriticVowelMatcher","endingDiacritcVowelMatcher","divider","diacriticsVowelList","diacriticsConsonantList","chars","DATE_MATCHER.ISO8601_DATE_TIME","dateIso8601","toJSON","diff","padStart","DATE_MATCHER.TIME","DATE_MATCHER.TIMEZONE","c","omocode","n","CFMismatchValidator","pattern","hasLastName","hasFirstName","hasBirthYear","hasBirthDate","DATE_OFFSET","hasGender","hasBirthPlace","hasCRC","matchPersonalInfo","mismatchPersonalInfo","matchLastName","mismatchLastName","matchFirstName","mismatchFirstName","matchBirthDate","parsedCfDate","isSame","mismatchBirthDate","matchGender","mismatchGender","matchBirthPlace","parsedBirthPlace","mismatchBirthPlace","errors","Promise","all","then","placeCheck","placeCreationExpirationCheck","keys","valid","cfPattern","invalid","Validator","isLastNameValid","isLastNameInvalid","isFirstNameValid","isFirstNameInvalid","isBirthDateValid","isBirthDateInvalid","isGenderValid","isGenderInvalid","isBirthPlaceValid","isBirthPlaceInvalid","birthDatePlaceMatch","isSameOrBefore","birthDatePlaceMismatch","birthPlaceDateMatch","birthPlaceDateMismatch","CodiceFiscaleUtils"],"mappings":"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CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACH,CA3BD,CAAKA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CA2BJ,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CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACKC,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACKC,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACtBC,CAAyB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACzBC,GACL,CACKC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,C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"} \ No newline at end of file +{"version":3,"file":"index.mjs","sources":["../src/const/cf-offsets.const.ts","../src/date-utils/date-matcher.const.ts","../src/date-utils/date-utils.class.ts","../src/const/matcher.const.ts","../src/enums/crc.enum.ts","../src/enums/birth-month.enum.ts","../src/classes/check-digitizer.class.ts","../src/functions/generator-wrapper.function.ts","../src/enums/gender-weight.enum.ts","../src/enums/omocodes.enum.ts","../src/classes/gender.class.ts","../src/const/logic.const.ts","../src/classes/parser.class.ts","../src/const/error-messages.const.ts","../src/classes/cfu-error.class.ts","../src/classes/pattern.class.ts","../src/classes/cf-mismatch-validator.class.ts","../src/classes/validator.class.ts","../src/index.ts"],"sourcesContent":["export const LASTNAME_OFFSET = 0;\r\nexport const LASTNAME_SIZE = 3;\r\nexport const FIRSTNAME_OFFSET = 3;\r\nexport const FIRSTNAME_SIZE = 3;\r\nexport const YEAR_OFFSET = 6;\r\nexport const YEAR_SIZE = 2;\r\nexport const MONTH_OFFSET = 8;\r\nexport const MONTH_SIZE = 1;\r\nexport const DAY_OFFSET = 9;\r\nexport const DAY_SIZE = 2;\r\nexport const DATE_OFFSET = YEAR_OFFSET;\r\nexport const DATE_SIZE = YEAR_SIZE + MONTH_SIZE + DAY_SIZE;\r\nexport const GENDER_OFFSET = DAY_OFFSET;\r\nexport const GENDER_SIZE = 1;\r\nexport const PLACE_OFFSET = 11;\r\nexport const PLACE_SIZE = 4;\r\nexport const CRC_OFFSET = 15;\r\nexport const CRC_SIZE = 1;\r\nexport const CF_SIZE =\r\n\tLASTNAME_SIZE + FIRSTNAME_SIZE + DATE_SIZE + PLACE_SIZE + CRC_SIZE;\r\n","const YEAR: string = \"[12][0-9]{3}\";\r\nconst MONTH: string = \"0[1-9]|1[0-2]\";\r\nconst DAY: string = \"0[1-9]|[12][0-9]|3[01]\";\r\nconst LEAP_MONTH: string = \"02\";\r\nconst DAYS_30_MONTHS: string = \"0[469]|11\";\r\nconst DAYS_31_MONTHS: string = \"0[13578]|1[02]\";\r\nconst MONTH_DAY: string = `(?:${MONTH})-(?:0[1-9]|[12]\\\\d)|(?:${DAYS_30_MONTHS})-30|(?:${DAYS_31_MONTHS})-3[01]`;\r\nconst HOURS: string = \"[01]\\\\d|2[0-3]\";\r\nconst MINUTES: string = \"[0-5]\\\\d\";\r\nconst SECONDS: string = MINUTES;\r\nconst MILLISECONDS: string = \"\\\\d{3}\";\r\nconst TIMEZONE: string = `Z|[-+](?:${HOURS})(?::?${MINUTES})?`;\r\nconst TIME: string = `(?:${HOURS})(?::${MINUTES}(?::${SECONDS}(\\\\.${MILLISECONDS})?)?(?:${TIMEZONE})?)?`;\r\nconst ISO8601_SHORT_DATE: string = `${YEAR}-(?:${MONTH_DAY})(?:T${TIME})?`;\r\nconst ISO8601_DATE_TIME: string = `${YEAR}(?:-(?:(?:${MONTH})|(?:${MONTH_DAY})(?:T${TIME})?))?`;\r\n\r\n/**\r\n * Date Matcher consts\r\n * @property {Object} DATE_VALIDATOR\r\n * @property {string} DATE_VALIDATOR.YEAR Matcher for ISO8601 4 digits year (limited to 1000-2999)\r\n * @property {string} DATE_VALIDATOR.MONTH Matcher for ISO8601 2 digits month (01-12)\r\n * @property {string} DATE_VALIDATOR.DAY Matcher for ISO8601 2 digits day (01-31)\r\n * @property {string} DATE_VALIDATOR.LEAP_MONTH Matcher for ISO8601 2 digits leap month\r\n * @property {string} DATE_VALIDATOR.DAYS_30_MONTHS Matcher for ISO8601 2 digits 30 days month\r\n * @property {string} DATE_VALIDATOR.DAYS_31_MONTHS Matcher for ISO8601 2 digits 31 days month\r\n * @property {string} DATE_VALIDATOR.MONTH_DAY Matcher for ISO8601 2 + 2 digits (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.ISO8601_SHORT_DATE Matcher for ISO8601 date: 4+2+2 digits year + (28~31)month + day\r\n * @property {string} DATE_VALIDATOR.HOURS Matcher for ISO8601 2 digits hours (00-23)\r\n * @property {string} DATE_VALIDATOR.MINUTES Matcher for ISO8601 2 digits minutes (00-59)\r\n * @property {string} DATE_VALIDATOR.SECONDS Matcher for ISO8601 2 digits seconds (00-59)\r\n * @property {string} DATE_VALIDATOR.MILLISECONDS Matcher for ISO8601 3 digits milliseconds (000-999)\r\n * @property {string} DATE_VALIDATOR.TIMEZONE Matcher for ISO8601 timezone (Z or ±## or ±##:## or ±####)\r\n * @property {string} DATE_VALIDATOR.TIME Matcher for ISO8601 for time (T## , T##:## , T##:##:## , T##:##:##.###)\r\n * @property {string} DATE_VALIDATOR.ISO8601_DATE_TIME Matcher for ISO8601 date/time format\r\n */\r\nexport {\r\n\tDAY,\r\n\tDAYS_30_MONTHS,\r\n\tDAYS_31_MONTHS,\r\n\tHOURS,\r\n\tISO8601_DATE_TIME,\r\n\tISO8601_SHORT_DATE,\r\n\tLEAP_MONTH,\r\n\tMILLISECONDS,\r\n\tMINUTES,\r\n\tMONTH,\r\n\tMONTH_DAY,\r\n\tSECONDS,\r\n\tTIME,\r\n\tTIMEZONE,\r\n\tYEAR,\r\n};\r\n","import dayjs, { Dayjs } from \"dayjs\";\r\nimport type DateDay from \"./date-day.type\";\r\nimport { ISO8601_DATE_TIME } from \"./date-matcher.const\";\r\nimport type DateMonth from \"./date-month.type\";\r\nimport type MultiFormatDate from \"./multi-format-date.type\";\r\nexport default class DateUtils {\r\n\t/**\r\n\t * Parse a Dated and Gender information to create Date/Gender CF part\r\n\t * @param date Date instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @returns Parsed Date or null if not valid\r\n\t */\r\n\tpublic static parseDate(date?: MultiFormatDate | null): Date | null {\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\tdate instanceof Date ||\r\n\t\t\t\t(typeof date === \"string\" &&\r\n\t\t\t\t\tnew RegExp(`^(?:${ISO8601_DATE_TIME})$`).test(date)) ||\r\n\t\t\t\t(Array.isArray(date) &&\r\n\t\t\t\t\tdate.length &&\r\n\t\t\t\t\t!date.some((value) => typeof value !== \"number\" || isNaN(value)))\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tlet parsedDate: Dayjs;\r\n\t\t\tif (Array.isArray(date)) {\r\n\t\t\t\tconst [year, month = 0, day = 1] = date;\r\n\t\t\t\tif (month >= 0 && month <= 11 && day > 0 && day <= 31) {\r\n\t\t\t\t\tparsedDate = dayjs(Date.UTC(year, month || 0, day || 1));\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tparsedDate = dayjs(date);\r\n\t\t\t}\r\n\t\t\treturn parsedDate.isValid() ? parsedDate.toDate() : null;\r\n\t\t} catch (err) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static ymdToDate(\r\n\t\tyear?: number | null,\r\n\t\tmonth?: DateMonth | null,\r\n\t\tday?: DateDay | null\r\n\t): Date | null {\r\n\t\treturn this.parseDate([year, month, day] as number[]);\r\n\t}\r\n}\r\n","export const CONSONANT_LIST: string = \"B-DF-HJ-NP-TV-Z\";\r\nexport const VOWEL_LIST: string = \"AEIOU\";\r\nexport const OMOCODE_NUMBER_LIST: string = \"\\\\dLMNP-V\";\r\nexport const OMOCODE_NON_ZERO_NUMBER_LIST: string = \"1-9MNP-V\";\r\nexport const OMOCODE_ZERO_LIST: string = \"0L\";\r\nexport const MONTH_LIST: string = \"A-EHLMPR-T\";\r\nexport const MONTH_30DAYS_LIST: string = \"DHPS\";\r\nexport const MONTH_31DAYS_LIST: string = \"ACELMRT\";\r\nexport const CITY_CODE_LIST: string = \"A-M\";\r\nexport const COUNTRY_CODE_LIST: string = \"Z\";\r\n\r\nexport const CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}][${VOWEL_LIST}X]|[${VOWEL_LIST}]X{2}|[${CONSONANT_LIST}]{2}[A-Z]`;\r\nexport const CF_SURNAME_MATCHER: string = CF_NAME_MATCHER;\r\nexport const CF_FULL_NAME_MATCHER: string = `(?:${CF_NAME_MATCHER}){2}`;\r\n\r\nexport const YEAR_MATCHER: string = `[${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const LEAP_YEAR_MATCHER: string =\r\n\t\"[02468LNQSU][048LQU]|[13579MPRTV][26NS]\";\r\nexport const MONTH_MATCHER: string = `[${MONTH_LIST}]`;\r\nexport const DAY_2X_MATCHER: string = \"[26NS]\";\r\nexport const DAY_3X_MATCHER: string = \"[37PT]\";\r\nexport const DAY_29_MATCHER: string = `[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1256MNRS][${OMOCODE_NUMBER_LIST}]`;\r\nexport const DAY_30_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}]`;\r\nexport const DAY_31_MATCHER: string = `[${DAY_3X_MATCHER}][${OMOCODE_ZERO_LIST}1M]`;\r\n\r\nexport const DAY_MATCHER: string = `(?:${DAY_29_MATCHER}|${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MALE_DAY_MATCHER: string = `(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[12MN][${OMOCODE_NUMBER_LIST}]|[3P][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const FEMALE_DAY_MATCHER: string = `(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[56RS][${OMOCODE_NUMBER_LIST}]|[7T][${OMOCODE_ZERO_LIST}1M])`;\r\nexport const MONTH_DAY_MATCHER: string = `${MONTH_MATCHER}(?:${DAY_29_MATCHER})|[${MONTH_30DAYS_LIST}]${DAY_30_MATCHER}|[${MONTH_31DAYS_LIST}]${DAY_31_MATCHER}`;\r\nexport const FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[15MR][${OMOCODE_NUMBER_LIST}]|${DAY_2X_MATCHER}[0-8LMNP-U])|[${MONTH_30DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}[${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_2X_MATCHER}[9V])|(?:${LEAP_YEAR_MATCHER})B${DAY_2X_MATCHER}[9V]`;\r\nexport const MALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[1M][${OMOCODE_NUMBER_LIST}]|[2N][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][3P][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][2N][9V])|(?:${LEAP_YEAR_MATCHER})B[2N][9V]`;\r\nexport const FEMALE_FULL_DATE_MATCHER: string = `${YEAR_MATCHER}(?:${MONTH_MATCHER}(?:[4Q][${OMOCODE_NON_ZERO_NUMBER_LIST}]|[5R][${OMOCODE_NUMBER_LIST}]|[6S][0-8LMNP-U])|[${MONTH_30DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}]|[${MONTH_31DAYS_LIST}][7T][${OMOCODE_ZERO_LIST}1M]|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}][6S][9V])|(?:${LEAP_YEAR_MATCHER})B[6S][9V]`;\r\n\r\nexport const CITY_CODE_MATCHER: string = `[${CITY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}|[${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\nexport const COUNTRY_CODE_MATCHER: string = `${COUNTRY_CODE_LIST}[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2}`;\r\nexport const BELFIORE_CODE_MATCHER: string = `(?:[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]{2})|(?:[${CITY_CODE_LIST}][${OMOCODE_ZERO_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]|[${OMOCODE_ZERO_LIST}][${OMOCODE_NON_ZERO_NUMBER_LIST}]))`;\r\n\r\nexport const CHECK_DIGIT: string = \"[A-Z]\";\r\n\r\nexport const CODICE_FISCALE: string = `${CF_FULL_NAME_MATCHER}(?:${FULL_DATE_MATCHER})(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}`;\r\n\r\nexport const PARTIAL_CF_NAME_MATCHER: string = `[A-Z][${VOWEL_LIST}]?|[${CONSONANT_LIST}]{1,2}`;\r\nexport const PARTIAL_CF_FULL_NAME: string = `(?:${PARTIAL_CF_NAME_MATCHER})|(?:(?:${CF_NAME_MATCHER})(?:${PARTIAL_CF_NAME_MATCHER})?)`;\r\nexport const PARTIAL_YEAR: string = `[${OMOCODE_NUMBER_LIST}]`;\r\nexport const PARTIAL_MONTH_DAY: string = `${MONTH_MATCHER}[${OMOCODE_ZERO_LIST}12456MNQRS]?|[${MONTH_30DAYS_LIST}${MONTH_31DAYS_LIST}]${DAY_3X_MATCHER}`;\r\nexport const PARTIAL_FULL_DATE: string = `${PARTIAL_YEAR}|(?:${YEAR_MATCHER}(?:${PARTIAL_MONTH_DAY})?)`;\r\nexport const PARTIAL_BELFIORE_CODE_MATCHER: string = `[${CITY_CODE_LIST}${COUNTRY_CODE_LIST}](?:[${OMOCODE_NON_ZERO_NUMBER_LIST}][${OMOCODE_NUMBER_LIST}]?)?|[${COUNTRY_CODE_LIST}](?:[${OMOCODE_ZERO_LIST}][${OMOCODE_NUMBER_LIST}]?)?`;\r\n\r\nexport const PARTIAL_CF: string = `${PARTIAL_CF_FULL_NAME}|(?:${CF_FULL_NAME_MATCHER}(?:(?:${PARTIAL_FULL_DATE})|(?:${FULL_DATE_MATCHER})(?:(?:${PARTIAL_BELFIORE_CODE_MATCHER})|(?:${BELFIORE_CODE_MATCHER})${CHECK_DIGIT}?)?)?)?`;\r\n","enum CRC {\r\n \"B\",\r\n \"A\",\r\n \"K\",\r\n \"P\",\r\n \"L\",\r\n \"C\",\r\n \"Q\",\r\n \"D\",\r\n \"R\",\r\n \"E\",\r\n \"V\",\r\n \"O\",\r\n \"S\",\r\n \"F\",\r\n \"T\",\r\n \"G\",\r\n \"U\",\r\n \"H\",\r\n \"M\",\r\n \"I\",\r\n \"N\",\r\n \"J\",\r\n \"W\",\r\n \"Z\",\r\n \"Y\",\r\n \"X\",\r\n}\r\n\r\nexport default CRC;\r\n","enum BirthMonth {\r\n\t\"A\",\r\n\t\"B\",\r\n\t\"C\",\r\n\t\"D\",\r\n\t\"E\",\r\n\t\"H\",\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"P\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n}\r\n\r\nexport default BirthMonth;\r\n","import { CRC_OFFSET, LASTNAME_OFFSET } from \"../const/cf-offsets.const\";\r\nimport { PARTIAL_CF } from \"../const/matcher.const\";\r\nimport CRC from \"../enums/crc.enum\";\r\nimport generatorWrapper from \"../functions/generator-wrapper.function\";\r\nimport type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nimport type CodiceFiscaleCRC from \"../types/codice-fiscale-crc.type\";\r\nclass CheckDigitizer {\r\n\t/**\r\n\t * Evaluate given partial CF to produce last check digit character\r\n\t * @param codiceFiscale Partial or complete Fiscal Code to evaluate to produce last character\r\n\t * @returns 16th CF char\r\n\t */\r\n\tpublic static checkDigit(codiceFiscale: string): CodiceFiscaleCRC | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale === \"string\" &&\r\n\t\t\tnew RegExp(PARTIAL_CF).test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst partialCF = codiceFiscale.substr(LASTNAME_OFFSET, CRC_OFFSET);\r\n\t\t\tlet partialCfValue = 0;\r\n\t\t\tfor (const charValue of this.evaluateChar(partialCF)) {\r\n\t\t\t\tpartialCfValue += charValue as number;\r\n\t\t\t}\r\n\t\t\treturn String.fromCharCode(\r\n\t\t\t\t(partialCfValue % this.CRC_MOD) + this.CHAR_OFFSET\r\n\t\t\t) as CodiceFiscaleCRC;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpublic static evaluateChar(\r\n\t\tpartialCF: string = \"\"\r\n\t): IGeneratorWrapper {\r\n\t\treturn generatorWrapper(this.evaluateCharGenerator(partialCF));\r\n\t}\r\n\r\n\tprivate static CHAR_OFFSET: number = 65;\r\n\tprivate static CRC_MOD: number = 26;\r\n\r\n\t/**\r\n\t * Partial FiscalCode Evaluator\r\n\t * @param Partial Fiscal Code to evaluate\r\n\t * @yields character value odd/even\r\n\t */\r\n\tprivate static *evaluateCharGenerator(partialCF: string = \"\"): Generator {\r\n\t\tif (typeof partialCF === \"string\" && partialCF.length) {\r\n\t\t\tfor (let index = 0; index < partialCF.length; index++) {\r\n\t\t\t\tlet char: string = partialCF[index].toUpperCase();\r\n\t\t\t\tconst isNumber: boolean = /^\\d$/u.test(char);\r\n\t\t\t\tif (isNumber) {\r\n\t\t\t\t\t// Numbers have always (odd/even) the same values of corresponding letters (0-9 => A-J)\r\n\t\t\t\t\tchar = String.fromCharCode(parseInt(char, 10) + this.CHAR_OFFSET);\r\n\t\t\t\t}\r\n\t\t\t\t// Odd/Even are shifted/swapped\r\n\t\t\t\t// array starts from 0, \"Agenzia delle Entrate\" documentation counts the string from 1\r\n\t\t\t\tconst isOdd: boolean = !(index % 2); // Odd according to documentation\r\n\t\t\t\tif (isOdd) {\r\n\t\t\t\t\t// Odd positions\r\n\t\t\t\t\tyield parseInt(CRC[char as any], 10);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Even positions\r\n\t\t\t\t\tyield char.charCodeAt(0) - this.CHAR_OFFSET;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\nexport default CheckDigitizer;\r\n","import type IGeneratorWrapper from \"../interfaces/generator-wrapper.interface\";\r\nexport default function generatorWrapper<\r\n\tT = unknown,\r\n\tTReturn = any,\r\n\tTNext = unknown\r\n>(generator: Generator): IGeneratorWrapper {\r\n\tgenerator[Symbol.iterator] = () => generator;\r\n\treturn generator as IGeneratorWrapper;\r\n}\r\n","enum GenderWeight {\r\n\t\"M\" = 0,\r\n\t\"F\" = 40,\r\n}\r\n\r\nexport default GenderWeight;\r\n","enum Omocodes {\r\n\t\"L\",\r\n\t\"M\",\r\n\t\"N\",\r\n\t\"P\",\r\n\t\"Q\",\r\n\t\"R\",\r\n\t\"S\",\r\n\t\"T\",\r\n\t\"U\",\r\n\t\"V\",\r\n}\r\n\r\nexport default Omocodes;\r\n","import { DateDay } from \"../date-utils/\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport type Genders from \"../types/genders.type\";\r\n\r\nclass Gender {\r\n\tpublic static getDay(genderDay: number): DateDay | null {\r\n\t\tconst plainDay = genderDay % GenderWeight.F;\r\n\t\treturn plainDay > 0 && plainDay <= this.MAX_MONTH_DAY\r\n\t\t\t? (plainDay as DateDay)\r\n\t\t\t: null;\r\n\t}\r\n\r\n\tpublic static getGender(genderDay: number): Genders | null {\r\n\t\treturn (\r\n\t\t\tthis.toArray().find(\r\n\t\t\t\t(gender) =>\r\n\t\t\t\t\tgenderDay >= GenderWeight[gender] &&\r\n\t\t\t\t\tgenderDay <= GenderWeight[gender] + this.MAX_MONTH_DAY\r\n\t\t\t) || null\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static genderizeDay(day: number, gender: Genders): number {\r\n\t\treturn day + GenderWeight[gender];\r\n\t}\r\n\r\n\tpublic static toArray(): Genders[] {\r\n\t\treturn [\"M\", \"F\"];\r\n\t}\r\n\r\n\tprivate static MAX_MONTH_DAY: number = 31;\r\n}\r\n\r\nexport default Gender;\r\n","export const CF_INTRODUCTION_DATE = new Date(\"1973-09-29\");\r\n","import dayjs from \"dayjs\";\r\nimport {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDAY_OFFSET,\r\n\tDAY_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tMONTH_OFFSET,\r\n\tMONTH_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { CF_NAME_MATCHER, CF_SURNAME_MATCHER } from \"../const/matcher.const\";\r\nimport { CONSONANT_LIST, VOWEL_LIST } from \"../const/matcher.const\";\r\nimport { DateDay, DateMonth, DateUtils, MultiFormatDate } from \"../date-utils\";\r\nimport BirthMonth from \"../enums/birth-month.enum\";\r\nimport GenderWeight from \"../enums/gender-weight.enum\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Gender from \"./gender.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Parser {\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {}\r\n\r\n\t/**\r\n\t * Default omocode bitmap\r\n\t */\r\n\tpublic OMOCODE_BITMAP: number = 0b0111011011000000;\r\n\r\n\t/**\r\n\t * Convert omocode CF into plain one\r\n\t * @param codiceFiscale Partial or complete Omocode/Regular CF to parse, starting from LastName\r\n\t * @returns Regular CF w/o omocodes chars\r\n\t */\r\n\tpublic cfDeomocode(codiceFiscale: string): string {\r\n\t\tif (codiceFiscale && codiceFiscale.length <= YEAR_OFFSET) {\r\n\t\t\treturn codiceFiscale;\r\n\t\t}\r\n\t\tconst deomocodedCf = this.partialCfDeomocode(codiceFiscale);\r\n\t\tif (deomocodedCf.length < CRC_OFFSET) {\r\n\t\t\treturn deomocodedCf;\r\n\t\t}\r\n\t\tconst partialDeomocodedCf = deomocodedCf.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tCRC_OFFSET\r\n\t\t);\r\n\t\treturn (\r\n\t\t\tpartialDeomocodedCf +\r\n\t\t\tthis.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(deomocodedCf) || \"\",\r\n\t\t\t\tdeomocodedCf.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic cfOmocode(codiceFiscale: string, omocodeId: number): string {\r\n\t\tif (!omocodeId) {\r\n\t\t\treturn this.cfDeomocode(codiceFiscale);\r\n\t\t}\r\n\t\tconst omocodedCf = codiceFiscale.split(\"\");\r\n\t\t// tslint:disable-next-line: prefer-for-of\r\n\t\tfor (let i = codiceFiscale.length - 1, o = 0; i >= 0; i--) {\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\tif ((2 ** i) & this.OMOCODE_BITMAP) {\r\n\t\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t\tconst charToEncode: boolean = !!(omocodeId & (2 ** o));\r\n\t\t\t\tconst isOmocode: boolean = isNaN(parseInt(omocodedCf[i], 10));\r\n\t\t\t\tif (charToEncode !== isOmocode) {\r\n\t\t\t\t\tconst char: any = omocodedCf[i].toUpperCase();\r\n\t\t\t\t\tomocodedCf[i] = Omocodes[char];\r\n\t\t\t\t}\r\n\t\t\t\to++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst crc = omocodedCf[CRC_OFFSET];\r\n\t\tif (crc) {\r\n\t\t\tconst partialCf = omocodedCf.slice(LASTNAME_OFFSET, CRC_OFFSET).join(\"\");\r\n\t\t\tomocodedCf[CRC_OFFSET] = this.appyCaseToChar(\r\n\t\t\t\tCheckDigitizer.checkDigit(partialCf) || \"\",\r\n\t\t\t\tcrc\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn omocodedCf.join(\"\");\r\n\t}\r\n\r\n\tpublic cfOmocodeId(codiceFiscale: string): number {\r\n\t\tconst cfOmocodeBitmap = codiceFiscale\r\n\t\t\t.split(\"\")\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t.filter((char, index) => (2 ** index) & this.OMOCODE_BITMAP)\r\n\t\t\t.map((char) => (/^[a-z]$/i.test(diacriticRemover[char]) ? 1 : 0))\r\n\t\t\t.join(\"\");\r\n\t\treturn parseInt(cfOmocodeBitmap, 2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible lastName\r\n\t */\r\n\tpublic cfToLastName(codiceFiscale: string): string | null {\r\n\t\tconst cfLastNamePart = codiceFiscale?.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfLastNamePart.length !== LASTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(?:${CF_SURNAME_MATCHER})`, \"iu\").test(cfLastNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst lastNameCf = codiceFiscale.substring(\r\n\t\t\tLASTNAME_OFFSET,\r\n\t\t\tLASTNAME_OFFSET + LASTNAME_SIZE\r\n\t\t);\r\n\r\n\t\tconst [cons = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) || [];\r\n\t\tconst [vow = \"\"] =\r\n\t\t\tlastNameCf.match(new RegExp(`[${VOWEL_LIST}]{1,3}`, \"ig\")) || [];\r\n\r\n\t\tconst matchingLength = cons.length + vow.length;\r\n\r\n\t\tif (\r\n\t\t\tmatchingLength < 2 ||\r\n\t\t\t(matchingLength < 3 && lastNameCf[2].toUpperCase() !== \"X\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (cons.length) {\r\n\t\t\tcase 3:\r\n\t\t\t\treturn (cons + vow).split(\"\").join(this.JOLLY_CHAR) + this.JOLLY_CHAR;\r\n\t\t\tcase 2:\r\n\t\t\t\treturn `${cons[0]}${vow[0]}*${cons[1]}${this.JOLLY_CHAR}`;\r\n\t\t\tcase 1:\r\n\t\t\t\treturn `${cons[0]}${vow}${this.JOLLY_CHAR}`;\r\n\t\t\tdefault:\r\n\t\t\t\treturn `${vow}${vow.length === 3 ? this.JOLLY_CHAR : \"\"}`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Partial/possible firstName\r\n\t */\r\n\tpublic cfToFirstName(codiceFiscale: string): string | null {\r\n\t\tconst cfFirstNamePart = codiceFiscale?.substring(\r\n\t\t\tFIRSTNAME_OFFSET,\r\n\t\t\tFIRSTNAME_OFFSET + FIRSTNAME_SIZE\r\n\t\t);\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcfFirstNamePart?.length !== FIRSTNAME_SIZE ||\r\n\t\t\t!new RegExp(`^(${CF_NAME_MATCHER})$`, \"iu\").test(cfFirstNamePart)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn this.cfToLastName(cfFirstNamePart);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse gender information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Male or female\r\n\t */\r\n\tpublic cfToGender(codiceFiscale: string): Genders | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < GENDER_OFFSET + GENDER_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfGenderPart = codiceFiscale.substring(\r\n\t\t\tGENDER_OFFSET,\r\n\t\t\tGENDER_OFFSET + GENDER_SIZE\r\n\t\t);\r\n\t\tconst genderInt =\r\n\t\t\tparseInt(this.partialCfDeomocode(cfGenderPart, GENDER_OFFSET), 10) * 10;\r\n\t\treturn Gender.getGender(genderInt);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth year information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Year (4 digits)\r\n\t */\r\n\tpublic cfToBirthYear(codiceFiscale: string): number | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < YEAR_OFFSET + YEAR_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst cfBirthYearPart = codiceFiscale.substring(\r\n\t\t\tYEAR_OFFSET,\r\n\t\t\tYEAR_OFFSET + YEAR_SIZE\r\n\t\t);\r\n\t\tconst birthYear: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthYearPart, YEAR_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthYear)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst current2DigitsYear: number = parseInt(dayjs().format(\"YY\"), 10);\r\n\r\n\t\tconst century: number = (birthYear > current2DigitsYear ? 1 : 0) * 100;\r\n\t\treturn dayjs()\r\n\t\t\t.subtract(current2DigitsYear - birthYear + century, \"years\")\r\n\t\t\t.year();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth month information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Month (0...11 - Date notation)\r\n\t */\r\n\tpublic cfToBirthMonth(codiceFiscale: string): DateMonth | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < MONTH_OFFSET + MONTH_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthMonthPart: any = codiceFiscale\r\n\t\t\t.substring(MONTH_OFFSET, MONTH_OFFSET + MONTH_SIZE)\r\n\t\t\t.toUpperCase();\r\n\t\tconst birthMonth = BirthMonth[cfBirthMonthPart];\r\n\t\tif (typeof birthMonth !== \"number\" || birthMonth < 0 || birthMonth > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn birthMonth as DateMonth;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth day information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth day (1..31)\r\n\t */\r\n\tpublic cfToBirthDay(codiceFiscale: string): DateDay | null {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < DAY_OFFSET + DAY_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthDayPart = codiceFiscale.substring(\r\n\t\t\tDAY_OFFSET,\r\n\t\t\tDAY_OFFSET + DAY_SIZE\r\n\t\t);\r\n\t\tconst birthDay: number = parseInt(\r\n\t\t\tthis.partialCfDeomocode(cfBirthDayPart, DAY_OFFSET),\r\n\t\t\t10\r\n\t\t);\r\n\r\n\t\tif (isNaN(birthDay)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn Gender.getDay(birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth date information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @returns Birth Date\r\n\t */\r\n\tpublic cfToBirthDate(codiceFiscale: string): Date | null {\r\n\t\tconst birthDay = this.cfToBirthDay(codiceFiscale);\r\n\t\tif (!birthDay) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthMonth = this.cfToBirthMonth(codiceFiscale);\r\n\t\tif (typeof birthMonth !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst birthYear = this.cfToBirthYear(codiceFiscale);\r\n\r\n\t\treturn DateUtils.ymdToDate(birthYear, birthMonth, birthDay);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse birth place information\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @param checkBirthDateConsistency Ensure birthday is between creation and expiran date of the cf city or country, default value: true\r\n\t * @returns Birth place\r\n\t */\r\n\tpublic async cfToBirthPlace(\r\n\t\tcodiceFiscale: string,\r\n\t\tcheckBirthDateConsistency: boolean = true\r\n\t): Promise {\r\n\t\tif (\r\n\t\t\ttypeof codiceFiscale !== \"string\" ||\r\n\t\t\tcodiceFiscale.length < PLACE_OFFSET + PLACE_SIZE\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfBirthPlacePart = codiceFiscale.substring(\r\n\t\t\tPLACE_OFFSET,\r\n\t\t\tPLACE_OFFSET + PLACE_SIZE\r\n\t\t);\r\n\t\tconst belfioreCode: string = this.partialCfDeomocode(\r\n\t\t\tcfBirthPlacePart,\r\n\t\t\tPLACE_OFFSET\r\n\t\t);\r\n\r\n\t\tconst birthPlace: BelfiorePlace | undefined | null =\r\n\t\t\tawait this.belfioreConnector.findByCode(belfioreCode);\r\n\t\tif (!birthPlace) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst { creationDate, expirationDate } = birthPlace;\r\n\t\tif ((creationDate || expirationDate) && checkBirthDateConsistency) {\r\n\t\t\tconst birthDate = this.cfToBirthDate(codiceFiscale);\r\n\t\t\tconst isBirthDateAfterCfIntroduction = dayjs(CF_INTRODUCTION_DATE)\r\n\t\t\t\t// Adding some tolerance\r\n\t\t\t\t.add(5, \"years\")\r\n\t\t\t\t.isBefore(birthDate, \"day\");\r\n\r\n\t\t\t// Skipping birthDate vs Creation/Expiration check for people born up to 5y after cf introduction\r\n\t\t\tif (birthDate && isBirthDateAfterCfIntroduction) {\r\n\t\t\t\tconst datePlaceConsistency =\r\n\t\t\t\t\t// BirthDay is before expiration date\r\n\t\t\t\t\t(!expirationDate ||\r\n\t\t\t\t\t\tdayjs(birthDate).isBefore(expirationDate, \"day\")) &&\r\n\t\t\t\t\t// BirthDay is after creation date\r\n\t\t\t\t\t(!creationDate || dayjs(birthDate).isAfter(creationDate, \"day\"));\r\n\t\t\t\tif (!datePlaceConsistency) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn birthPlace;\r\n\t}\r\n\r\n\t/**\r\n\t * @param fiscalCode 16 character Codice Fiscale to decode\r\n\t * @returns Decoded CF Info\r\n\t */\r\n\tpublic async cfDecode(fiscalCode: string): Promise {\r\n\t\tconst year = this.cfToBirthYear(fiscalCode) || undefined;\r\n\t\t// 0 is a month\r\n\t\tconst month = this.cfToBirthMonth(fiscalCode) ?? undefined;\r\n\t\tconst day = this.cfToBirthDay(fiscalCode) || undefined;\r\n\t\tconst date = DateUtils.ymdToDate(year, month, day) || undefined;\r\n\t\tconst place = await this.cfToBirthPlace(fiscalCode);\r\n\t\tconst personalInfo: IPersonalInfo = {\r\n\t\t\tfirstName: this.cfToFirstName(fiscalCode) || undefined,\r\n\t\t\tlastName: this.cfToLastName(fiscalCode) || undefined,\r\n\r\n\t\t\tday,\r\n\t\t\tmonth,\r\n\t\t\tyear,\r\n\r\n\t\t\tdate,\r\n\r\n\t\t\tgender: this.cfToGender(fiscalCode) || undefined,\r\n\t\t\tplace: place || undefined,\r\n\r\n\t\t\tomocodeId: this.cfOmocodeId(fiscalCode),\r\n\t\t};\r\n\r\n\t\tif (year && month && day) {\r\n\t\t\tpersonalInfo.date = new Date(Date.UTC(year, month, day));\r\n\t\t}\r\n\r\n\t\treturn personalInfo;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse lastName to cf part\r\n\t * @param lastName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic lastNameToCf(lastName?: string | null): string | null {\r\n\t\tif (!lastName || (lastName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (!/^[A-Z ']{1,32}$/iu.test(diacriticRemover.replace(lastName))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst consonants = this.charExtractor(lastName, CONSONANT_LIST);\r\n\t\tconst vowels = this.charExtractor(lastName, VOWEL_LIST);\r\n\r\n\t\tconst partialCf = (consonants + vowels).padEnd(3, \"X\").substring(0, 3);\r\n\r\n\t\tif (partialCf.length < 3) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn partialCf.toUpperCase();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse firstName to cf part\r\n\t * @param firstName Partial or complete CF to parse\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic firstNameToCf(firstName?: string | null): string | null {\r\n\t\tif (!firstName || (firstName || \"\").trim().length < 2) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst consonants = this.charExtractor(firstName, CONSONANT_LIST);\r\n\t\tif (consonants.length >= 4) {\r\n\t\t\treturn (consonants[0] + consonants.substring(2, 4)).toUpperCase();\r\n\t\t}\r\n\t\treturn this.lastNameToCf(firstName);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse year to cf part\r\n\t * @param year Birth year 2 or 4 digit string, number above 19XX or below 100\r\n\t * @returns partial cf\r\n\t */\r\n\tpublic yearToCf(year: string | number): string | null {\r\n\t\tlet parsedYear: number;\r\n\t\tif (typeof year === \"string\") {\r\n\t\t\tparsedYear = parseInt(year, 10);\r\n\t\t} else {\r\n\t\t\tparsedYear = year;\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\ttypeof parsedYear === \"number\" &&\r\n\t\t\t\t!isNaN(parsedYear) &&\r\n\t\t\t\t(parsedYear >= 1900 || parsedYear < 100)\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${parsedYear}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse month information\r\n\t * @param month Month number 0..11\r\n\t * @returns Birth Month CF code\r\n\t */\r\n\tpublic monthToCf(month: DateMonth | number): string | null {\r\n\t\tif (month < 0 || month > 11) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn BirthMonth[month] || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse day information\r\n\t * @param day Day number 1..31\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth Day CF code\r\n\t */\r\n\tpublic dayGenderToCf(day: DateDay | number, gender: Genders): string | null {\r\n\t\tif (day < 1 || day > 31) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst genderValue = GenderWeight[gender as any];\r\n\t\tif (typeof genderValue !== \"number\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn `0${day + genderValue}`.substr(-2);\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Year, Month, Day to Dated\r\n\t * @param year 4 digits Year\r\n\t * @param month 1 or 2 digits Month 0..11\r\n\t * @param day 1,2 digits Day 1..31\r\n\t * @returns Date or null if provided year/month/day are not valid\r\n\t */\r\n\tpublic yearMonthDayToDate(\r\n\t\tyear: number | null | undefined,\r\n\t\tmonth: DateMonth | null | undefined = 0,\r\n\t\tday: DateDay | null | undefined = 1\r\n\t): Date | null {\r\n\t\tif (\r\n\t\t\t!year ||\r\n\t\t\tyear < 1861 ||\r\n\t\t\t[month, day].some((param) => typeof param !== \"number\")\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst date = dayjs(Date.UTC(year, month || 0, day || 1));\r\n\t\tif (\r\n\t\t\t!date.isValid() ||\r\n\t\t\tdate.year() !== year ||\r\n\t\t\tdate.month() !== month ||\r\n\t\t\tdate.date() !== day\r\n\t\t) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn date.toDate();\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Place information to return city or country details\r\n\t * @param place Belfiore place instance, belfiore code or city/country name\r\n\t * @returns BelfiorePlace instance with the target city or country details\r\n\t */\r\n\tpublic async parsePlace(\r\n\t\tplace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tlet verifiedBirthPlace: BelfiorePlace | null | undefined;\r\n\t\tif (!place) {\r\n\t\t\treturn null;\r\n\t\t} else if (typeof place === \"object\" && place.belfioreCode) {\r\n\t\t\tverifiedBirthPlace = await this.belfioreConnector.findByCode(\r\n\t\t\t\tplace.belfioreCode\r\n\t\t\t);\r\n\t\t} else if (typeof place === \"string\") {\r\n\t\t\tverifiedBirthPlace =\r\n\t\t\t\t(await this.belfioreConnector.findByCode(place)) ||\r\n\t\t\t\t(await this.belfioreConnector.findByName(place));\r\n\t\t}\r\n\t\treturn verifiedBirthPlace || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse Date and Gender information to create Date/Gender CF part\r\n\t * @param date Date instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param gender Gender enum value\r\n\t * @returns Birth date and Gender CF code\r\n\t */\r\n\tpublic dateGenderToCf(date: MultiFormatDate, gender: Genders): string | null {\r\n\t\tconst parsedDate = DateUtils.parseDate(date);\r\n\t\tif (!parsedDate) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst cfYear = this.yearToCf(parsedDate.getFullYear());\r\n\t\tconst cfMonth = this.monthToCf(parsedDate.getMonth());\r\n\t\tconst cfDayGender = this.dayGenderToCf(parsedDate.getDate(), gender);\r\n\r\n\t\treturn `${cfYear}${cfMonth}${cfDayGender}`;\r\n\t}\r\n\r\n\t/**\r\n\t * Parse place name and province to Belfiore code\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\t/**\r\n\t * Parse a Date and Gender information to create Date/Gender CF part\r\n\t * @param birthDate Date instance, ISO8601 date string or array of numbers [year, month, day]\r\n\t * @param cityOrCountryName City or Country name\r\n\t * @param provinceId Province code for cities\r\n\t * @returns Matching place belfiore code, if only once is matching criteria\r\n\t */\r\n\tpublic async placeToCf(\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tcityOrCountryName: string,\r\n\t\tprovinceId?: string\r\n\t): Promise;\r\n\tpublic async placeToCf(\r\n\t\tdateOrName: MultiFormatDate,\r\n\t\tnameOrProvince?: string,\r\n\t\tprovinceId?: string\r\n\t): Promise {\r\n\t\tconst birthDate: Date | null = DateUtils.parseDate(dateOrName);\r\n\t\tlet name: string;\r\n\t\tlet province: string | undefined;\r\n\t\tif (!birthDate && typeof dateOrName === \"string\") {\r\n\t\t\tname = dateOrName;\r\n\t\t\tprovince = nameOrProvince;\r\n\t\t} else if (nameOrProvince) {\r\n\t\t\tname = nameOrProvince;\r\n\t\t\tprovince = provinceId;\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet placeFinder: IBelfioreConnector | undefined = this.belfioreConnector;\r\n\t\tif (province) {\r\n\t\t\tplaceFinder = placeFinder.byProvince(province);\r\n\t\t}\r\n\t\tif (birthDate && placeFinder) {\r\n\t\t\tplaceFinder = placeFinder.from(birthDate);\r\n\t\t}\r\n\t\tif (placeFinder) {\r\n\t\t\tconst foundPlace: BelfiorePlace | null = await new Parser(\r\n\t\t\t\tplaceFinder\r\n\t\t\t).parsePlace(name);\r\n\t\t\tif (foundPlace) {\r\n\t\t\t\treturn foundPlace.belfioreCode;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF\r\n\t * @returns Complete CF\r\n\t */\r\n\tpublic async encodeCf({\r\n\t\tlastName,\r\n\t\tfirstName,\r\n\r\n\t\tyear,\r\n\t\tmonth,\r\n\t\tday,\r\n\t\tdate,\r\n\r\n\t\tgender,\r\n\t\tplace,\r\n\r\n\t\tomocodeId = 0,\r\n\t}: Omit & {\r\n\t\tplace?: BelfiorePlace | string | undefined;\r\n\t}): Promise {\r\n\t\tconst dtParams =\r\n\t\t\tDateUtils.parseDate(date) || this.yearMonthDayToDate(year, month, day);\r\n\t\tif (!(dtParams && lastName && firstName && gender && place)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst generator = [\r\n\t\t\tasync () => this.lastNameToCf(lastName),\r\n\t\t\tasync () => this.firstNameToCf(firstName),\r\n\t\t\tasync () => this.dateGenderToCf(dtParams, gender),\r\n\t\t\tasync () =>\r\n\t\t\t\tawait this.placeToCf(\r\n\t\t\t\t\tdtParams,\r\n\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t),\r\n\t\t];\r\n\t\tlet cf = \"\";\r\n\t\tfor (const cfPartGenerator of generator) {\r\n\t\t\tconst cfValue = await cfPartGenerator();\r\n\t\t\tif (!cfValue) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tcf += cfValue;\r\n\t\t}\r\n\r\n\t\treturn this.cfOmocode(cf, omocodeId);\r\n\t}\r\n\r\n\tprivate JOLLY_CHAR: string = \"*\";\r\n\r\n\tprivate checkBitmap(offset: number): boolean {\r\n\t\t// tslint:disable-next-line: no-bitwise\r\n\t\treturn !!((2 ** offset) & this.OMOCODE_BITMAP);\r\n\t}\r\n\r\n\tprivate charOmocode(char: string, offset: number): string {\r\n\t\tif (/^[A-Z]$/giu.test(char) && this.checkBitmap(offset)) {\r\n\t\t\treturn Omocodes[char.toUpperCase() as any];\r\n\t\t}\r\n\r\n\t\treturn char;\r\n\t}\r\n\r\n\tprivate charExtractor(text: string, CHAR_LIST: string): string {\r\n\t\tconst charMatcher = new RegExp(`[${CHAR_LIST}]{1,24}`, \"ig\");\r\n\t\tconst diacriticFreeText = diacriticRemover.replace(text).trim();\r\n\t\tconst matchingChars = diacriticFreeText.match(charMatcher);\r\n\t\treturn (matchingChars || []).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Convert omocode full or chunk CF into plain one\r\n\t * @param partialCodiceFiscale Partial or complete Omocode/Regular CF to parse\r\n\t * @param offset starting point of the given chunk in the 16 char CF\r\n\t * @returns Regular version w/o omocodes chars of the given chunk\r\n\t */\r\n\tprivate partialCfDeomocode(\r\n\t\tpartialCodiceFiscale: string,\r\n\t\toffset: number = 0\r\n\t): string {\r\n\t\tconst charReplacer = (char: string, position: number) =>\r\n\t\t\tthis.charOmocode(char, position + offset);\r\n\t\treturn partialCodiceFiscale.replace(/[\\dA-Z]/giu, charReplacer);\r\n\t}\r\n\r\n\tprivate appyCaseToChar(targetChar: string, counterCaseChar: string): string {\r\n\t\tif (targetChar && counterCaseChar) {\r\n\t\t\tconst isUpperCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toUpperCase();\r\n\t\t\tconst isLowerCase =\r\n\t\t\t\tcounterCaseChar[0] === counterCaseChar[0].toLowerCase();\r\n\r\n\t\t\tif (isUpperCase && !isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toUpperCase();\r\n\t\t\t} else if (!isUpperCase && isLowerCase) {\r\n\t\t\t\treturn targetChar[0].toLowerCase();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn targetChar[0];\r\n\t}\r\n}\r\n","const INVALID_SURNAME: string =\r\n\t\"Provided lastName is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_NAME: string =\r\n\t\"Provided name is not valid, only letters, diacritics and apostrophe allowed\";\r\nconst INVALID_DAY: string = \"Provided day is not valid\";\r\nconst INVALID_GENDER: string = \"Provided gender is not valid\";\r\nconst INVALID_DAY_OR_GENDER: string =\r\n\t\"Provided day and/or gender are not valid\";\r\nconst INVALID_YEAR: string =\r\n\t\"Provided year is not valid, only 2 or 4 digit numbers are allowed\";\r\nconst INVALID_DATE: string = \"Provided date is not valid\";\r\nconst INVALID_PLACE_NAME: string = \"Proviced City/Country name is not valid\";\r\n\r\nexport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_PLACE_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n};\r\n","import * as ErrorMessages from \"../const/error-messages.const\";\r\n\r\nclass CfuError extends Error {\r\n constructor(errorMessage: string)\r\n constructor(errorCode: string) {\r\n super((Object.entries(ErrorMessages).find(([errId]) => errId === errorCode) || [])[1] || errorCode);\r\n }\r\n}\r\n\r\nexport default CfuError;\r\n","import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport DiacriticRemover from \"@marketto/diacritic-remover\";\r\nimport {\r\n\tINVALID_DATE,\r\n\tINVALID_DAY,\r\n\tINVALID_DAY_OR_GENDER,\r\n\tINVALID_GENDER,\r\n\tINVALID_NAME,\r\n\tINVALID_SURNAME,\r\n\tINVALID_YEAR,\r\n} from \"../const/error-messages.const\";\r\nimport {\r\n\tBELFIORE_CODE_MATCHER,\r\n\tCF_NAME_MATCHER,\r\n\tCF_SURNAME_MATCHER,\r\n\tCHECK_DIGIT,\r\n\tCODICE_FISCALE,\r\n\tCONSONANT_LIST,\r\n\tDAY_MATCHER,\r\n\tFEMALE_DAY_MATCHER,\r\n\tFEMALE_FULL_DATE_MATCHER,\r\n\tFULL_DATE_MATCHER,\r\n\tMALE_DAY_MATCHER,\r\n\tMALE_FULL_DATE_MATCHER,\r\n\tMONTH_MATCHER,\r\n\tVOWEL_LIST,\r\n\tYEAR_MATCHER,\r\n} from \"../const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tDateUtils,\r\n\tMultiFormatDate,\r\n} from \"../date-utils/\";\r\nimport Omocodes from \"../enums/omocodes.enum\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CfuError from \"./cfu-error.class\";\r\nimport Gender from \"./gender.class\";\r\nimport Parser from \"./parser.class\";\r\nimport dayjs from \"dayjs\";\r\n\r\nconst diacriticRemover = new DiacriticRemover();\r\n\r\nexport default class Pattern {\r\n\tprivate parser: Parser;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given lastName or generic\r\n\t * @param lastName Optional lastName to generate validation regexp\r\n\t * @return CF Surname matcher\r\n\t * @throw INVALID_SURNAME\r\n\t */\r\n\tpublic cfLastName(lastName?: string): RegExp {\r\n\t\tlet matcher: string = CF_SURNAME_MATCHER;\r\n\t\tif (lastName) {\r\n\t\t\tif (!this.lastName().test(lastName)) {\r\n\t\t\t\tthrow new CfuError(INVALID_SURNAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.lastNameToCf(lastName) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given name or generic\r\n\t * @param name Optional name to generate validation regexp\r\n\t * @return CF name matcher\r\n\t * @throw INVALID_NAME\r\n\t */\r\n\tpublic cfFirstName(name?: string): RegExp {\r\n\t\tlet matcher: string = CF_NAME_MATCHER;\r\n\t\tif (name) {\r\n\t\t\tif (!this.lastName().test(name)) {\r\n\t\t\t\tthrow new CfuError(INVALID_NAME);\r\n\t\t\t}\r\n\t\t\tmatcher = this.parser.firstNameToCf(name) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param year Optional year to generate validation regexp\r\n\t * @return CF year matcher\r\n\t */\r\n\tpublic cfYear(year?: number): RegExp {\r\n\t\tlet matcher: string = YEAR_MATCHER;\r\n\t\tif (year) {\r\n\t\t\tconst parsedYear = this.parser.yearToCf(year);\r\n\t\t\tif (parsedYear) {\r\n\t\t\t\tmatcher = this.deomocode(parsedYear);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_YEAR);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given month or generic\r\n\t * @param month Optional month to generate validation regexp\r\n\t * @return CF month matcher\r\n\t */\r\n\tpublic cfMonth(month?: DateMonth) {\r\n\t\tlet matcher: string = MONTH_MATCHER;\r\n\t\tif (month) {\r\n\t\t\tmatcher = this.parser.monthToCf(month) || matcher;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given day or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @return CF day matcher\r\n\t */\r\n\tpublic cfDay(day?: DateDay): RegExp {\r\n\t\tlet matcher = DAY_MATCHER;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayM = this.parser.dayGenderToCf(day, \"M\");\r\n\t\t\tconst parsedDayF = this.parser.dayGenderToCf(day, \"F\");\r\n\t\t\tif (parsedDayM && parsedDayF) {\r\n\t\t\t\tconst matcherM: string = this.deomocode(parsedDayM);\r\n\t\t\t\tconst matcherF: string = this.deomocode(parsedDayF);\r\n\t\t\t\tmatcher = `(?:${matcherM})|(?:${matcherF})`;\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param day Optional day to generate validation regexp\r\n\t * @param gender Gender @see Genders\r\n\t * @return CF day and gender matcher\r\n\t */\r\n\tpublic cfDayGender(day?: DateDay, gender?: Genders): RegExp {\r\n\t\tif (!gender) {\r\n\t\t\treturn this.cfDay(day);\r\n\t\t}\r\n\t\tlet matcher;\r\n\t\tif (day) {\r\n\t\t\tconst parsedDayGender = this.parser.dayGenderToCf(day, gender);\r\n\t\t\tif (parsedDayGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDayGender);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new CfuError(INVALID_DAY_OR_GENDER);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tswitch (gender) {\r\n\t\t\t\tcase \"M\":\r\n\t\t\t\t\tmatcher = MALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"F\":\r\n\t\t\t\t\tmatcher = FEMALE_DAY_MATCHER;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Validation regexp for the given year or generic\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param gender @see Genders\r\n\t * @return CF date and gender matcher\r\n\t */\r\n\tpublic cfDateGender(\r\n\t\tdate?: MultiFormatDate | null,\r\n\t\tgender?: Genders | null\r\n\t): RegExp {\r\n\t\tif (date && !DateUtils.parseDate(date)) {\r\n\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t}\r\n\t\tif (gender && !Gender.toArray().includes(gender)) {\r\n\t\t\tthrow new CfuError(INVALID_GENDER);\r\n\t\t}\r\n\t\tlet matcher = FULL_DATE_MATCHER;\r\n\t\tif (date) {\r\n\t\t\tconst parsedDateGender =\r\n\t\t\t\tgender && this.parser.dateGenderToCf(date, gender);\r\n\t\t\tif (parsedDateGender) {\r\n\t\t\t\tmatcher = this.deomocode(parsedDateGender);\r\n\t\t\t} else {\r\n\t\t\t\tconst parseDeomocode = (g: Genders): string => {\r\n\t\t\t\t\tconst parsedGender = this.parser.dateGenderToCf(date, g);\r\n\t\t\t\t\tif (!parsedGender) {\r\n\t\t\t\t\t\tthrow new CfuError(INVALID_DATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn parsedGender && this.deomocode(parsedGender);\r\n\t\t\t\t};\r\n\t\t\t\tmatcher = `(?:${Gender.toArray().map(parseDeomocode).join(\"|\")})`;\r\n\t\t\t}\r\n\t\t} else if (gender === \"M\") {\r\n\t\t\tmatcher = MALE_FULL_DATE_MATCHER;\r\n\t\t} else if (gender === \"F\") {\r\n\t\t\tmatcher = FEMALE_FULL_DATE_MATCHER;\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\t/**\r\n\t * @param date Optional date to generate validation regexp\r\n\t * @param placeName Optional place name to generate validation regexp\r\n\t * @return CF place matcher\r\n\t */\r\n\tpublic async cfPlace(placeName?: string | null): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDate?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise;\r\n\tpublic async cfPlace(\r\n\t\tbirthDateOrName?: MultiFormatDate | null,\r\n\t\tplaceName?: string | null\r\n\t): Promise {\r\n\t\tlet matcher = BELFIORE_CODE_MATCHER;\r\n\t\tif (birthDateOrName) {\r\n\t\t\tconst birthDate: Date | null = DateUtils.parseDate(birthDateOrName);\r\n\r\n\t\t\tif (birthDate && placeName) {\r\n\t\t\t\tconst place: string = placeName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(birthDate, place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t} else if (!birthDate && typeof birthDateOrName === \"string\") {\r\n\t\t\t\tconst place: string = birthDateOrName;\r\n\t\t\t\tconst parsedPlace = await this.parser.placeToCf(place);\r\n\t\t\t\tmatcher = this.deomocode(parsedPlace || \"\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Generates full CF validator based on given optional input or generic\r\n\t * @param personalInfo Input Object\r\n\t * @return CodiceFiscale matcher\r\n\t */\r\n\tpublic async codiceFiscale(\r\n\t\tpersonalInfo?: Omit & {\r\n\t\t\tplace?: BelfiorePlace | string | undefined;\r\n\t\t}\r\n\t): Promise {\r\n\t\tlet matcher = CODICE_FISCALE;\r\n\t\tif (personalInfo) {\r\n\t\t\tconst parsedCf = await this.parser.encodeCf(personalInfo);\r\n\r\n\t\t\tif (parsedCf) {\r\n\t\t\t\tmatcher = this.deomocode(parsedCf);\r\n\t\t\t} else {\r\n\t\t\t\tconst { lastName, firstName, year, month, day, date, gender, place } =\r\n\t\t\t\t\tpersonalInfo;\r\n\t\t\t\tif (\r\n\t\t\t\t\tlastName ||\r\n\t\t\t\t\tfirstName ||\r\n\t\t\t\t\tyear ||\r\n\t\t\t\t\tmonth ||\r\n\t\t\t\t\tday ||\r\n\t\t\t\t\tdate ||\r\n\t\t\t\t\tgender ||\r\n\t\t\t\t\tplace\r\n\t\t\t\t) {\r\n\t\t\t\t\tlet dtParams: Date | null = null;\r\n\t\t\t\t\tif (date) {\r\n\t\t\t\t\t\tdtParams = DateUtils.parseDate(date);\r\n\t\t\t\t\t} else if (year) {\r\n\t\t\t\t\t\tdtParams = this.parser.yearMonthDayToDate(year, month, day);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst generator: (() => Promise)[] = [\r\n\t\t\t\t\t\tasync () => this.cfLastName(lastName),\r\n\t\t\t\t\t\tasync () => this.cfFirstName(firstName),\r\n\t\t\t\t\t\tasync () => this.cfDateGender(dtParams, gender),\r\n\t\t\t\t\t\tasync () =>\r\n\t\t\t\t\t\t\tawait this.cfPlace(\r\n\t\t\t\t\t\t\t\tdtParams,\r\n\t\t\t\t\t\t\t\t(place as BelfiorePlace)?.belfioreCode || (place as string)\r\n\t\t\t\t\t\t\t),\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\tmatcher = \"\";\r\n\t\t\t\t\tfor (const validator of generator) {\r\n\t\t\t\t\t\tconst cfMatcher = (await validator()).toString();\r\n\t\t\t\t\t\tconst match = cfMatcher.match(/\\^(.{1,256})\\$/);\r\n\t\t\t\t\t\tconst cfValue: string | null | undefined = match && match[1];\r\n\r\n\t\t\t\t\t\tif (!cfValue) {\r\n\t\t\t\t\t\t\tthrow new Error(`Unable to handle [${cfMatcher}]`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmatcher += `(?:${cfValue})`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Final addition of CheckDigit\r\n\t\t\t\t\tmatcher += CHECK_DIGIT;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tprivate LETTER_SET: string = `[A-Z${diacriticRemover.matcherBy(\r\n\t\t/^[A-Z]$/iu\r\n\t)}]`;\r\n\tprivate SEPARATOR_SET: string = \"(?:'?\\\\s{0,4})\";\r\n\r\n\t/**\r\n\t * Returns lastName validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic lastName(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = `${this.LETTER_SET}{1,24}`;\r\n\t\tif (codiceFiscale && /^[A-Z]{1,3}/iu.test(codiceFiscale)) {\r\n\t\t\tconst lastNameCf: string = codiceFiscale.substr(0, 3);\r\n\t\t\tconst diacriticizer = (matchingChars: string) =>\r\n\t\t\t\tmatchingChars\r\n\t\t\t\t\t.split(\"\")\r\n\t\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [cons, vow] = [\r\n\t\t\t\t`^[${CONSONANT_LIST}]{1,3}`,\r\n\t\t\t\t`[${VOWEL_LIST}]{1,3}`,\r\n\t\t\t].map((charMatcher) =>\r\n\t\t\t\tdiacriticizer(\r\n\t\t\t\t\t(lastNameCf.match(new RegExp(charMatcher, \"ig\")) || [])[0] || \"\"\r\n\t\t\t\t)\r\n\t\t\t);\r\n\r\n\t\t\tconst diacriticsVowelList: string =\r\n\t\t\t\tVOWEL_LIST +\r\n\t\t\t\tdiacriticRemover.matcherBy(new RegExp(`^[${VOWEL_LIST}]$`, \"ui\"));\r\n\t\t\tconst diacriticsVowelMatcher: string = `[${diacriticsVowelList}]`;\r\n\t\t\tconst midDiacriticVowelMatcher: string = `(?:${diacriticsVowelMatcher}${this.SEPARATOR_SET}){0,24}`;\r\n\t\t\tconst endingDiacritcVowelMatcher: string = `(?:${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${diacriticsVowelMatcher})?`;\r\n\t\t\tswitch (cons.length) {\r\n\t\t\t\tcase 3: {\r\n\t\t\t\t\tconst divider = midDiacriticVowelMatcher;\r\n\t\t\t\t\tmatcher =\r\n\t\t\t\t\t\tdivider +\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}${divider}`) +\r\n\t\t\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{0,24}${this.LETTER_SET})?`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 2: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\t`${vow[0]}${midDiacriticVowelMatcher}${this.SEPARATOR_SET}${cons[0]}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\t`${cons[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tvow.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${midDiacriticVowelMatcher}${cons[1]}`,\r\n\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\t`${this.SEPARATOR_SET}${vow[0]}`,\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 1: {\r\n\t\t\t\t\tconst possibilities = [\r\n\t\t\t\t\t\tvow.slice(0, 2).join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tmidDiacriticVowelMatcher +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t\t`${vow[0]}${this.SEPARATOR_SET}` +\r\n\t\t\t\t\t\t\tcons.join(`${this.SEPARATOR_SET}`) +\r\n\t\t\t\t\t\t\tvow[1],\r\n\t\t\t\t\t\t[cons[0], ...vow.slice(0, 2)].join(`${this.SEPARATOR_SET}`),\r\n\t\t\t\t\t];\r\n\t\t\t\t\tmatcher = `(?:${possibilities.join(\r\n\t\t\t\t\t\t\"|\"\r\n\t\t\t\t\t)})${endingDiacritcVowelMatcher}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tmatcher = `${vow.join(\r\n\t\t\t\t\t\t`${this.SEPARATOR_SET}`\r\n\t\t\t\t\t)}${endingDiacritcVowelMatcher}`;\r\n\t\t\t}\r\n\r\n\t\t\tif (vow?.length + cons?.length < 3) {\r\n\t\t\t\treturn this.isolatedInsensitiveTailor(`\\\\s{0,4}(${matcher})\\\\s{0,4}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`\\\\s{0,4}((?:${matcher})(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24})\\\\s{0,4}`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns name validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic firstName(codiceFiscale?: string): RegExp {\r\n\t\tif (\r\n\t\t\tcodiceFiscale &&\r\n\t\t\tnew RegExp(`^[A-Z]{3}[${CONSONANT_LIST}]{3}`, \"iu\").test(codiceFiscale)\r\n\t\t) {\r\n\t\t\tconst nameCf: string = codiceFiscale.substr(3, 3);\r\n\r\n\t\t\tconst cons: string[] = (\r\n\t\t\t\t(nameCf.match(new RegExp(`^[${CONSONANT_LIST}]{1,3}`, \"ig\")) ||\r\n\t\t\t\t\t[])[0] || \"\"\r\n\t\t\t)\r\n\t\t\t\t.split(\"\")\r\n\t\t\t\t.map((char) => `[${diacriticRemover.insensitiveMatcher[char]}]`);\r\n\r\n\t\t\tconst [diacriticsVowelList, diacriticsConsonantList]: string[] = [\r\n\t\t\t\tVOWEL_LIST,\r\n\t\t\t\tCONSONANT_LIST,\r\n\t\t\t].map(\r\n\t\t\t\t(chars) =>\r\n\t\t\t\t\tchars + diacriticRemover.matcherBy(new RegExp(`^[${chars}]$`, \"ui\"))\r\n\t\t\t);\r\n\r\n\t\t\tconst matcher: string =\r\n\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}${cons[0]}${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}(?:[${diacriticsConsonantList}]${this.SEPARATOR_SET}(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24})?` +\r\n\t\t\t\tcons\r\n\t\t\t\t\t.slice(1, 3)\r\n\t\t\t\t\t.join(\r\n\t\t\t\t\t\t`(?:[${diacriticsVowelList}]{1,24}${this.SEPARATOR_SET}){0,24}`\r\n\t\t\t\t\t) +\r\n\t\t\t\t`(?:${this.SEPARATOR_SET}${this.LETTER_SET}{1,24}){0,24}`;\r\n\r\n\t\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t\t}\r\n\t\treturn this.lastName((codiceFiscale || \"\").substr(3, 3));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns iso8601 date validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic date(codiceFiscale?: string): RegExp {\r\n\t\tlet matcher: string = DATE_MATCHER.ISO8601_DATE_TIME;\r\n\t\tif (codiceFiscale) {\r\n\t\t\tconst parsedDate = this.parser.cfToBirthDate(codiceFiscale);\r\n\t\t\tif (parsedDate) {\r\n\t\t\t\tconst dateIso8601: string = parsedDate.toJSON();\r\n\t\t\t\tif (dayjs().diff(dayjs(parsedDate), \"y\") < 50) {\r\n\t\t\t\t\tconst century: number = parseInt(dateIso8601.substr(0, 2), 10);\r\n\t\t\t\t\tconst centuries: string[] = [century - 1, century].map((year) =>\r\n\t\t\t\t\t\tyear.toString().padStart(2, \"0\")\r\n\t\t\t\t\t);\r\n\t\t\t\t\tmatcher = `(?:${centuries.join(\"|\")})` + dateIso8601.substr(2, 8);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmatcher = dateIso8601.substr(0, 10);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.isolatedInsensitiveTailor(\r\n\t\t\t`${matcher}(?:T${DATE_MATCHER.TIME}(?:${DATE_MATCHER.TIMEZONE})?)?`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns gender validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic gender(codiceFiscale?: string): RegExp {\r\n\t\tconst parsedGender = codiceFiscale && this.parser.cfToGender(codiceFiscale);\r\n\t\tconst matcher: string = parsedGender || `[${Gender.toArray().join(\"\")}]`;\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns place validator based on given cf or generic\r\n\t * @param codiceFiscale Partial or complete CF to parse\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic async place(codiceFiscale?: string): Promise {\r\n\t\tlet matcher: string = \".{1,32}\";\r\n\t\tconst parsedPlace =\r\n\t\t\tcodiceFiscale && (await this.parser.cfToBirthPlace(codiceFiscale));\r\n\r\n\t\tif (parsedPlace) {\r\n\t\t\tconst nameMatcher: string = parsedPlace.name.replace(/./gu, (c) =>\r\n\t\t\t\tdiacriticRemover[c] === c ? c : `[${c}${diacriticRemover[c]}]`\r\n\t\t\t);\r\n\t\t\tmatcher = `(?:(?:${nameMatcher})|${parsedPlace.belfioreCode})`;\r\n\t\t}\r\n\r\n\t\treturn this.isolatedInsensitiveTailor(matcher);\r\n\t}\r\n\r\n\tpublic deomocode(omocode: string): string {\r\n\t\treturn omocode.replace(/\\d/gu, (n: any) => `[${n}${Omocodes[n]}]`);\r\n\t}\r\n\r\n\tprivate isolatedInsensitiveTailor(matcher: string): RegExp {\r\n\t\treturn new RegExp(`^(?:${matcher})$`, \"iu\");\r\n\t}\r\n}\r\n","import dayjs from \"dayjs\";\r\nimport {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport {\r\n\tCRC_OFFSET,\r\n\tCRC_SIZE,\r\n\tDATE_OFFSET,\r\n\tDATE_SIZE,\r\n\tFIRSTNAME_OFFSET,\r\n\tFIRSTNAME_SIZE,\r\n\tGENDER_OFFSET,\r\n\tGENDER_SIZE,\r\n\tLASTNAME_OFFSET,\r\n\tLASTNAME_SIZE,\r\n\tPLACE_OFFSET,\r\n\tPLACE_SIZE,\r\n\tYEAR_OFFSET,\r\n\tYEAR_SIZE,\r\n} from \"../const/cf-offsets.const\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type IPersonalInfo from \"../interfaces/personal-info.interface\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CheckDigitizer from \"./check-digitizer.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport type IMismatchVerboseErrors from \"../interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport default class CFMismatchValidator {\r\n\tprivate pattern: Pattern;\r\n\tprivate parser: Parser;\r\n\tconstructor(\r\n\t\tbelfioreConnector: IBelfioreConnector,\r\n\t\tprivate readonly codiceFiscale: string\r\n\t) {\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t}\r\n\r\n\tprivate get hasLastName() {\r\n\t\treturn this.codiceFiscale?.length >= LASTNAME_OFFSET + LASTNAME_SIZE;\r\n\t}\r\n\r\n\tprivate get hasFirstName() {\r\n\t\treturn this.codiceFiscale?.length >= FIRSTNAME_OFFSET + FIRSTNAME_SIZE;\r\n\t}\r\n\tprivate get hasBirthYear() {\r\n\t\treturn this.codiceFiscale?.length >= YEAR_OFFSET + YEAR_SIZE;\r\n\t}\r\n\tprivate get hasBirthDate() {\r\n\t\treturn this.codiceFiscale?.length >= DATE_OFFSET + DATE_SIZE;\r\n\t}\r\n\tprivate get hasGender() {\r\n\t\treturn this.codiceFiscale?.length >= GENDER_OFFSET + GENDER_SIZE;\r\n\t}\r\n\tprivate get hasBirthPlace() {\r\n\t\treturn this.codiceFiscale?.length >= PLACE_OFFSET + PLACE_SIZE;\r\n\t}\r\n\r\n\tprivate get hasCRC() {\r\n\t\treturn this.codiceFiscale?.length >= CRC_OFFSET + CRC_SIZE;\r\n\t}\r\n\r\n\tpublic async matchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn (await this.pattern.codiceFiscale(personalInfo)).test(\r\n\t\t\tthis.codiceFiscale\r\n\t\t);\r\n\t}\r\n\tpublic async mismatchPersonalInfo(\r\n\t\tpersonalInfo: Omit & {\r\n\t\t\tplace?: string | BelfiorePlace;\r\n\t\t}\r\n\t): Promise {\r\n\t\treturn !!(\r\n\t\t\tthis.codiceFiscale &&\r\n\t\t\tpersonalInfo &&\r\n\t\t\tpersonalInfo.lastName &&\r\n\t\t\tpersonalInfo.firstName &&\r\n\t\t\t(personalInfo.date ||\r\n\t\t\t\t(personalInfo.day && personalInfo.month && personalInfo.year)) &&\r\n\t\t\tpersonalInfo.gender &&\r\n\t\t\tpersonalInfo.place &&\r\n\t\t\t!(await this.matchPersonalInfo(personalInfo))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchLastName(lastName?: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasLastName &&\r\n\t\t\tthis.pattern.lastName(this.codiceFiscale).test(lastName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchLastName(lastName?: string): boolean {\r\n\t\treturn this.hasLastName && !!lastName && !this.matchLastName(lastName);\r\n\t}\r\n\r\n\tpublic matchFirstName(firstName: string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasFirstName &&\r\n\t\t\tthis.pattern.firstName(this.codiceFiscale).test(firstName || \"\")\r\n\t\t);\r\n\t}\r\n\tpublic mismatchFirstName(firstName: string): boolean {\r\n\t\treturn this.hasFirstName && !!firstName && !this.matchFirstName(firstName);\r\n\t}\r\n\r\n\tpublic matchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\tif (this.hasBirthDate) {\r\n\t\t\tconst parsedCfDate = this.parser.cfToBirthDate(this.codiceFiscale);\r\n\t\t\tconst parsedDate = DateUtils.parseDate(birthDate);\r\n\t\t\tif (parsedCfDate && parsedDate) {\r\n\t\t\t\treturn dayjs(parsedCfDate).isSame(parsedDate, \"d\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic mismatchBirthDate(birthDate: MultiFormatDate): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthYear &&\r\n\t\t\t!!DateUtils.parseDate(birthDate) &&\r\n\t\t\t!this.matchBirthDate(birthDate)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic matchGender(gender: Genders | string): boolean {\r\n\t\treturn (\r\n\t\t\tthis.hasGender &&\r\n\t\t\tthis.pattern.gender(this.codiceFiscale).test(gender || \"\")\r\n\t\t);\r\n\t}\r\n\r\n\tpublic mismatchGender(gender: Genders | string): boolean {\r\n\t\treturn this.hasGender && !!gender && !this.matchGender(gender);\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async matchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tif (this.hasBirthPlace && birthPlace) {\r\n\t\t\tconst matcher = await this.pattern.place(this.codiceFiscale);\r\n\t\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\r\n\t\t\treturn !!parsedBirthPlace && matcher.test(parsedBirthPlace?.belfioreCode);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * @param birthPlace BirthPlace, place name or BelfioreCode\r\n\t */\r\n\tpublic async mismatchBirthPlace(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn (\r\n\t\t\tthis.hasBirthPlace &&\r\n\t\t\t!!birthPlace &&\r\n\t\t\t!(await this.matchBirthPlace(birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @param codiceFiscale Complete CF to parse\r\n\t * @return Verbose errors\r\n\t */\r\n\tpublic get errors(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, false),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale, true),\r\n\t\t])\r\n\t\t\t.then(([placeCheck, placeCreationExpirationCheck]) => ({\r\n\t\t\t\t// Checking lastName validity\r\n\t\t\t\t...(this.parser.cfToLastName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { lastName: \"MISSING_OR_INVALID_LAST_NAME\" }),\r\n\t\t\t\t// Checking firstName validity\r\n\t\t\t\t...(this.parser.cfToFirstName(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { firstName: \"MISSING_OR_INVALID_FIRST_NAME\" }),\r\n\t\t\t\t// Checking Date validity\r\n\t\t\t\t...(this.parser.cfToBirthDate(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DATE\" }),\r\n\t\t\t\t// Checking Day validity\r\n\t\t\t\t...(this.parser.cfToBirthDay(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_DAY\" }),\r\n\t\t\t\t// Checking Month validity\r\n\t\t\t\t...(this.parser.cfToBirthMonth(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_MONTH\" }),\r\n\t\t\t\t// Checking Year validity\r\n\t\t\t\t...(this.parser.cfToBirthYear(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { date: \"MISSING_OR_INVALID_YEAR\" }),\r\n\t\t\t\t// Checking Gender validity\r\n\t\t\t\t...(this.parser.cfToGender(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { gender: \"MISSING_DAY\" }),\r\n\t\t\t\t// Checking Place validity\r\n\t\t\t\t...(placeCheck ? {} : { place: \"MISSING_OR_INVALID_PLACE\" }),\r\n\t\t\t\t// Checking Place Creation/Expiration vs Birthdate validity\r\n\t\t\t\t...(placeCreationExpirationCheck\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: {\r\n\t\t\t\t\t\t\tplace: \"PLACE_EXPIRED_OR_NOT_YET_CREATED_ON_BIRTDATE\",\r\n\t\t\t\t\t\t\tdate: \"BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE\",\r\n\t\t\t\t\t }),\r\n\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t...(this.codiceFiscale\r\n\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t?.toUpperCase() === CheckDigitizer.checkDigit(this.codiceFiscale)\r\n\t\t\t\t\t? {}\r\n\t\t\t\t\t: { crc: \"INVALID_CRC_CODE\" }),\r\n\r\n\t\t\t\t// Checking length\r\n\t\t\t\t...(this.hasCRC ? {} : { crc: \"MISSING_CRC_CODE\" }),\r\n\t\t\t}))\r\n\t\t\t.then((errors) => (Object.keys(errors).length ? errors : null));\r\n\t}\r\n\r\n\t/**\r\n\t * Check the given cf validity by form, birth date/place and digit code\r\n\t * @return Generic or specific regular expression\r\n\t */\r\n\tpublic get valid(): Promise {\r\n\t\treturn Promise.all([\r\n\t\t\tthis.pattern.codiceFiscale(),\r\n\t\t\tthis.parser.cfToBirthPlace(this.codiceFiscale),\r\n\t\t]).then(\r\n\t\t\t([cfPattern, cfToBirthPlace]) =>\r\n\t\t\t\t!(\r\n\t\t\t\t\t// Checking length\r\n\t\t\t\t\t(\r\n\t\t\t\t\t\t!this.hasCRC ||\r\n\t\t\t\t\t\t// Checking form validity\r\n\t\t\t\t\t\t!cfPattern.test(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking 16th char check digit validity\r\n\t\t\t\t\t\tthis.codiceFiscale\r\n\t\t\t\t\t\t\t?.substring(CRC_OFFSET, CRC_OFFSET + CRC_SIZE)\r\n\t\t\t\t\t\t\t?.toUpperCase() !==\r\n\t\t\t\t\t\t\tCheckDigitizer.checkDigit(this.codiceFiscale) ||\r\n\t\t\t\t\t\t// Checking Birth date/place validity\r\n\t\t\t\t\t\t!cfToBirthPlace\r\n\t\t\t\t\t)\r\n\t\t\t\t)\r\n\t\t);\r\n\t}\r\n\tpublic get invalid(): Promise {\r\n\t\treturn this.valid.then((isValid) => !!this.codiceFiscale && !isValid);\r\n\t}\r\n}\r\n","import {\r\n\tIBelfioreConnector,\r\n\tBelfiorePlace,\r\n} from \"@marketto/belfiore-connector\";\r\nimport { DateUtils, MultiFormatDate } from \"../date-utils/\";\r\nimport type Genders from \"../types/genders.type\";\r\nimport CFMismatchValidator from \"./cf-mismatch-validator.class\";\r\nimport Parser from \"./parser.class\";\r\nimport Pattern from \"./pattern.class\";\r\nimport { CF_INTRODUCTION_DATE } from \"../const/logic.const\";\r\nimport dayjs from \"dayjs\";\r\n\r\nexport default class Validator {\r\n\tprivate parser: Parser;\r\n\tprivate pattern: Pattern;\r\n\r\n\tconstructor(private readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n\r\n\tpublic codiceFiscale(codiceFiscale: string): CFMismatchValidator {\r\n\t\treturn new CFMismatchValidator(this.belfioreConnector, codiceFiscale);\r\n\t}\r\n\r\n\tpublic isLastNameValid(lastName: string): boolean {\r\n\t\treturn this.pattern.lastName().test(lastName);\r\n\t}\r\n\tpublic isLastNameInvalid(lastName: string): boolean {\r\n\t\treturn !!lastName && !this.isLastNameValid(lastName);\r\n\t}\r\n\r\n\tpublic isFirstNameValid(firstName: string): boolean {\r\n\t\treturn this.pattern.firstName().test(firstName);\r\n\t}\r\n\tpublic isFirstNameInvalid(firstName: string): boolean {\r\n\t\treturn !!firstName && !this.isFirstNameValid(firstName);\r\n\t}\r\n\r\n\tpublic isBirthDateValid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!DateUtils.parseDate(birthDate);\r\n\t}\r\n\tpublic isBirthDateInvalid(birthDate: MultiFormatDate): boolean {\r\n\t\treturn !!birthDate && !this.isBirthDateValid(birthDate);\r\n\t}\r\n\r\n\tpublic isGenderValid(gender: Genders | string): boolean {\r\n\t\treturn this.pattern.gender().test(gender);\r\n\t}\r\n\tpublic isGenderInvalid(gender: Genders | string): boolean {\r\n\t\treturn !!gender && !this.isGenderValid(gender);\r\n\t}\r\n\r\n\tpublic async isBirthPlaceValid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedBirthPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\t!!parsedBirthPlace &&\r\n\t\t\t!!(await this.belfioreConnector.findByCode(parsedBirthPlace.belfioreCode))\r\n\t\t);\r\n\t}\r\n\tpublic async isBirthPlaceInvalid(\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\treturn !!birthPlace && !(await this.isBirthPlaceValid(birthPlace));\r\n\t}\r\n\r\n\tpublic async birthDatePlaceMatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t(!!(await this.belfioreConnector\r\n\t\t\t\t.from(birthDate)\r\n\t\t\t\t.findByCode(parsedPlace.belfioreCode)) ||\r\n\t\t\t\t// Ignoring control for people born before CF introduction\r\n\t\t\t\t!dayjs(DateUtils.parseDate(birthDate)).isAfter(\r\n\t\t\t\t\tCF_INTRODUCTION_DATE,\r\n\t\t\t\t\t\"day\"\r\n\t\t\t\t))\r\n\t\t);\r\n\t}\r\n\tpublic async birthDatePlaceMismatch(\r\n\t\tbirthDate: MultiFormatDate,\r\n\t\tbirthPlace: BelfiorePlace | string\r\n\t): Promise {\r\n\t\tconst parsedPlace = await this.parser.parsePlace(birthPlace);\r\n\t\treturn (\r\n\t\t\tthis.isBirthDateValid(birthDate) &&\r\n\t\t\t!!parsedPlace &&\r\n\t\t\t!(await this.birthDatePlaceMatch(birthDate, birthPlace))\r\n\t\t);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMatch(birthDate, birthPlace);\r\n\t}\r\n\r\n\tpublic async birthPlaceDateMismatch(\r\n\t\tbirthPlace: BelfiorePlace | string,\r\n\t\tbirthDate: MultiFormatDate\r\n\t): Promise {\r\n\t\treturn await this.birthDatePlaceMismatch(birthDate, birthPlace);\r\n\t}\r\n}\r\n","import {\r\n\tBelfiorePlace,\r\n\tIBelfioreConnector,\r\n} from \"@marketto/belfiore-connector\";\r\nimport CFMismatchValidator from \"./classes/cf-mismatch-validator.class\";\r\nimport CheckDigitizer from \"./classes/check-digitizer.class\";\r\nimport Gender from \"./classes/gender.class\";\r\nimport Parser from \"./classes/parser.class\";\r\nimport Pattern from \"./classes/pattern.class\";\r\nimport Validator from \"./classes/validator.class\";\r\nimport * as VALIDATOR from \"./const/matcher.const\";\r\nimport * as Matcher from \"./const/matcher.const\";\r\nimport {\r\n\tDATE_MATCHER,\r\n\ttype DateDay,\r\n\ttype DateMonth,\r\n\tDateUtils,\r\n\ttype MultiFormatDate,\r\n} from \"./date-utils/\";\r\nimport BirthMonth from \"./enums/birth-month.enum\";\r\nimport CRC from \"./enums/crc.enum\";\r\nimport Omocodes from \"./enums/omocodes.enum\";\r\nimport type Genders from \"./types/genders.type\";\r\nimport IMismatchVerboseErrors from \"./interfaces/mismatch-verbose-errors.interface\";\r\n\r\nexport type {\r\n\tBelfiorePlace,\r\n\tDateDay,\r\n\tDateMonth,\r\n\tGenders,\r\n\tMultiFormatDate,\r\n\tIMismatchVerboseErrors,\r\n};\r\n\r\nexport default class CodiceFiscaleUtils {\r\n\tpublic readonly validator: Validator;\r\n\tpublic readonly parser: Parser;\r\n\tpublic readonly pattern: Pattern;\r\n\r\n\tconstructor(public readonly belfioreConnector: IBelfioreConnector) {\r\n\t\tthis.validator = new Validator(belfioreConnector);\r\n\t\tthis.parser = new Parser(belfioreConnector);\r\n\t\tthis.pattern = new Pattern(belfioreConnector);\r\n\t}\r\n}\r\n\r\nexport {\r\n\tBirthMonth,\r\n\tCheckDigitizer,\r\n\tCRC,\r\n\tDATE_MATCHER,\r\n\tDateUtils,\r\n\tGender,\r\n\tOmocodes,\r\n\tVALIDATOR,\r\n\tMatcher,\r\n\tCFMismatchValidator,\r\n\tParser,\r\n\tPattern,\r\n\tValidator,\r\n\tCodiceFiscaleUtils,\r\n};\r\n"],"names":["CRC_OFFSET","YEAR","MONTH","DAYS_30_MONTHS","DAYS_31_MONTHS","MONTH_DAY","HOURS","MINUTES","SECONDS","MILLISECONDS","TIMEZONE","TIME","ISO8601_SHORT_DATE","ISO8601_DATE_TIME","DateUtils","parseDate","date","Date","RegExp","test","Array","isArray","length","some","value","isNaN","parsedDate","year","month","day","dayjs","UTC","isValid","toDate","err","ymdToDate","this","CONSONANT_LIST","VOWEL_LIST","OMOCODE_NUMBER_LIST","OMOCODE_NON_ZERO_NUMBER_LIST","OMOCODE_ZERO_LIST","MONTH_LIST","MONTH_30DAYS_LIST","MONTH_31DAYS_LIST","CITY_CODE_LIST","COUNTRY_CODE_LIST","CF_NAME_MATCHER","CF_SURNAME_MATCHER","CF_FULL_NAME_MATCHER","YEAR_MATCHER","LEAP_YEAR_MATCHER","MONTH_MATCHER","DAY_2X_MATCHER","DAY_3X_MATCHER","DAY_29_MATCHER","DAY_30_MATCHER","DAY_31_MATCHER","DAY_MATCHER","MALE_DAY_MATCHER","FEMALE_DAY_MATCHER","MONTH_DAY_MATCHER","FULL_DATE_MATCHER","MALE_FULL_DATE_MATCHER","FEMALE_FULL_DATE_MATCHER","CITY_CODE_MATCHER","COUNTRY_CODE_MATCHER","BELFIORE_CODE_MATCHER","CHECK_DIGIT","CODICE_FISCALE","PARTIAL_CF_NAME_MATCHER","PARTIAL_CF_FULL_NAME","PARTIAL_YEAR","PARTIAL_MONTH_DAY","PARTIAL_FULL_DATE","PARTIAL_BELFIORE_CODE_MATCHER","PARTIAL_CF","CRC","BirthMonth","CRC$1","CheckDigitizer","checkDigit","codiceFiscale","partialCF","substr","partialCfValue","charValue","evaluateChar","String","fromCharCode","CRC_MOD","CHAR_OFFSET","generator","evaluateCharGenerator","Symbol","iterator","static","index","char","toUpperCase","parseInt","charCodeAt","GenderWeight","BirthMonth$1","Omocodes","GenderWeight$1","Omocodes$1","Gender","getDay","genderDay","plainDay","F","MAX_MONTH_DAY","getGender","toArray","find","gender","genderizeDay","CF_INTRODUCTION_DATE","diacriticRemover","DiacriticRemover","Parser","belfioreConnector","constructor","OMOCODE_BITMAP","cfDeomocode","deomocodedCf","partialCfDeomocode","substring","appyCaseToChar","cfOmocode","omocodeId","omocodedCf","split","i","o","crc","partialCf","slice","join","cfOmocodeId","cfOmocodeBitmap","filter","map","cfToLastName","cfLastNamePart","LASTNAME_OFFSET","lastNameCf","cons","match","vow","matchingLength","JOLLY_CHAR","cfToFirstName","cfFirstNamePart","FIRSTNAME_OFFSET","cfToGender","GENDER_OFFSET","cfGenderPart","genderInt","cfToBirthYear","YEAR_OFFSET","cfBirthYearPart","birthYear","current2DigitsYear","format","century","subtract","cfToBirthMonth","MONTH_OFFSET","cfBirthMonthPart","birthMonth","cfToBirthDay","DAY_OFFSET","cfBirthDayPart","birthDay","cfToBirthDate","cfToBirthPlace","checkBirthDateConsistency","PLACE_OFFSET","cfBirthPlacePart","belfioreCode","birthPlace","findByCode","creationDate","expirationDate","birthDate","isBirthDateAfterCfIntroduction","add","isBefore","isAfter","cfDecode","fiscalCode","undefined","place","personalInfo","firstName","lastName","lastNameToCf","trim","replace","charExtractor","padEnd","firstNameToCf","consonants","yearToCf","parsedYear","monthToCf","dayGenderToCf","genderValue","yearMonthDayToDate","param","parsePlace","verifiedBirthPlace","findByName","dateGenderToCf","getFullYear","getMonth","getDate","placeToCf","dateOrName","nameOrProvince","provinceId","name","province","placeFinder","byProvince","from","foundPlace","encodeCf","dtParams","async","cf","cfPartGenerator","cfValue","checkBitmap","offset","charOmocode","text","CHAR_LIST","charMatcher","partialCodiceFiscale","position","targetChar","counterCaseChar","isUpperCase","isLowerCase","toLowerCase","INVALID_SURNAME","INVALID_NAME","INVALID_DAY","INVALID_GENDER","INVALID_DAY_OR_GENDER","INVALID_YEAR","INVALID_DATE","CfuError","Error","errorCode","super","Object","entries","ErrorMessages","errId","Pattern","parser","cfLastName","matcher","isolatedInsensitiveTailor","cfFirstName","cfYear","deomocode","cfMonth","cfDay","parsedDayM","parsedDayF","cfDayGender","parsedDayGender","cfDateGender","includes","parsedDateGender","parseDeomocode","g","parsedGender","cfPlace","birthDateOrName","placeName","parsedPlace","parsedCf","validator","cfMatcher","toString","LETTER_SET","matcherBy","SEPARATOR_SET","diacriticizer","matchingChars","insensitiveMatcher","diacriticsVowelMatcher","midDiacriticVowelMatcher","endingDiacritcVowelMatcher","divider","diacriticsVowelList","diacriticsConsonantList","chars","DATE_MATCHER.ISO8601_DATE_TIME","dateIso8601","toJSON","diff","padStart","DATE_MATCHER.TIME","DATE_MATCHER.TIMEZONE","c","omocode","n","CFMismatchValidator","pattern","hasLastName","hasFirstName","hasBirthYear","hasBirthDate","DATE_OFFSET","hasGender","hasBirthPlace","hasCRC","matchPersonalInfo","mismatchPersonalInfo","matchLastName","mismatchLastName","matchFirstName","mismatchFirstName","matchBirthDate","parsedCfDate","isSame","mismatchBirthDate","matchGender","mismatchGender","matchBirthPlace","parsedBirthPlace","mismatchBirthPlace","errors","Promise","all","then","placeCheck","placeCreationExpirationCheck","keys","valid","cfPattern","invalid","Validator","isLastNameValid","isLastNameInvalid","isFirstNameValid","isFirstNameInvalid","isBirthDateValid","isBirthDateInvalid","isGenderValid","isGenderInvalid","isBirthPlaceValid","isBirthPlaceInvalid","birthDatePlaceMatch","birthDatePlaceMismatch","birthPlaceDateMatch","birthPlaceDateMismatch","CodiceFiscaleUtils"],"mappings":"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AA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACL,CACKC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAsB,CACtBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,CACzBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACL,2CACKC,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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"} \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 1771e92..e31fc36 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/CFMismatchValidator.html b/docs/classes/CFMismatchValidator.html index 1d04653..09b7331 100644 --- a/docs/classes/CFMismatchValidator.html +++ b/docs/classes/CFMismatchValidator.html @@ -1,2019 +1,33 @@ - - - - - - CFMismatchValidator | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Class CFMismatchValidator

-
- -
-
-
- - - - -
-
-
-
-

Constructors

-
- - - -
-
-
-

Properties

-
- - -
- codiceFiscale: - string -
- -
-
- - -
- parser: - Parser -
- -
-
- - -
- pattern: - Pattern -
- -
-
-
-

Accessors

-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - -
    -
  • - get valid(): Promise<boolean> -
  • -
  • -
    -

    - Check the given cf validity by form, birth date/place and - digit code -

    -
    -

    - Returns Promise<boolean> -

    -

    Generic or specific regular expression

    -
    - -
  • -
-
-
-
-

Methods

-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
-
- -
-
-

- Generated using - TypeDoc -

-
-
- - +CFMismatchValidator | @marketto/codice-fiscale-utils

Constructors

Properties

codiceFiscale: string
parser: Parser
pattern: Pattern

Accessors

Methods

\ No newline at end of file diff --git a/docs/classes/CheckDigitizer.html b/docs/classes/CheckDigitizer.html index ff6f85e..9716923 100644 --- a/docs/classes/CheckDigitizer.html +++ b/docs/classes/CheckDigitizer.html @@ -1,723 +1,12 @@ - - - - - - CheckDigitizer | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Class CheckDigitizer

-
- -
-
-
- - - -
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-
-

Constructors

-
- - - -
-
-
-

Properties

-
- - -
- CHAR_OFFSET: - number = 65 -
- -
-
- - -
- CRC_MOD: - number = 26 -
- -
-
-
-

Methods

-
- - -
    - -
  • -
    -

    - Evaluate given partial CF to produce last check digit - character -

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      - Partial or complete Fiscal Code to evaluate to produce - last character -

      -
      -
      -
    • -
    -
    -

    - Returns null | CodiceFiscaleCRC -

    -

    16th CF char

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - partialCF: - string - = "" -
    • -
    -
    -

    - Returns default<number, 0, void> -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Partial FiscalCode Evaluator

    -
    -
    -

    Parameters

    -
      -
    • - partialCF: - string - = "" -
    • -
    -
    -

    - Returns Generator<unknown, any, unknown> -

    -
    -

    Yields

    -

    character value odd/even

    -
    - -
  • -
-
-
-
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CheckDigitizer | @marketto/codice-fiscale-utils

Constructors

Properties

CHAR_OFFSET: number = 65
CRC_MOD: number = 26

Methods

  • Evaluate given partial CF to produce last check digit character

    +

    Parameters

    • codiceFiscale: string

      Partial or complete Fiscal Code to evaluate to produce last character

      +

    Returns null | CodiceFiscaleCRC

    16th CF char

    +
  • Partial FiscalCode Evaluator

    +

    Parameters

    • partialCF: string = ""

    Returns Generator<unknown, any, unknown>

    Yields

    character value odd/even

    +
\ No newline at end of file diff --git a/docs/classes/CodiceFiscaleUtils.html b/docs/classes/CodiceFiscaleUtils.html index 900cb08..5249062 100644 --- a/docs/classes/CodiceFiscaleUtils.html +++ b/docs/classes/CodiceFiscaleUtils.html @@ -1,6 +1,6 @@ -CodiceFiscaleUtils | @marketto/codice-fiscale-utils

Constructors

constructor +CodiceFiscaleUtils | @marketto/codice-fiscale-utils

Constructors

Properties

belfioreConnector: IBelfioreConnector
parser: Parser
pattern: Pattern
validator: Validator
\ No newline at end of file +

Constructors

Properties

belfioreConnector: IBelfioreConnector
parser: Parser
pattern: Pattern
validator: Validator
\ No newline at end of file diff --git a/docs/classes/DateUtils.html b/docs/classes/DateUtils.html index c014301..36e8708 100644 --- a/docs/classes/DateUtils.html +++ b/docs/classes/DateUtils.html @@ -1,556 +1,7 @@ - - - - - - DateUtils | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Class DateUtils

-
- -
-
-
- - - -
-
-

Constructors

- -
-
-

Methods

- -
-
-
-
-
-
-

Constructors

-
- - - -
-
-
-

Methods

-
- - -
    - -
  • -
    -

    - Parse a Dated and Gender information to create Date/Gender - CF part -

    -
    -
    -

    Parameters

    -
      -
    • - Optional - date: - null | MultiFormatDate -
      -

      - Date or Moment instance, ISO8601 date string or array - of numbers [year, month, day] -

      -
      -
      -
    • -
    -
    -

    - Returns null | Date -

    -

    Parsed Date or null if not valid

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - Optional - year: - null | number -
    • -
    • - Optional - month: - null | DateMonth -
    • -
    • - Optional - day: - null | DateDay -
    • -
    -
    -

    - Returns null | Date -

    - -
  • -
-
-
-
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DateUtils | @marketto/codice-fiscale-utils

Constructors

Methods

Constructors

Methods

  • Parse a Dated and Gender information to create Date/Gender CF part

    +

    Parameters

    • Optional date: null | MultiFormatDate

      Date instance, ISO8601 date string or array of numbers [year, month, day]

      +

    Returns null | Date

    Parsed Date or null if not valid

    +
\ No newline at end of file diff --git a/docs/classes/Gender.html b/docs/classes/Gender.html index 8b60893..b1a0ee7 100644 --- a/docs/classes/Gender.html +++ b/docs/classes/Gender.html @@ -1,699 +1,7 @@ - - - - - - Gender | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Class Gender

-
- -
-
-
- - - -
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-
-

Constructors

-
- - - -
-
-
-

Properties

-
- - -
- MAX_MONTH_DAY: - number = 31 -
- -
-
-
-

Methods

-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
-
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +Gender | @marketto/codice-fiscale-utils

Constructors

Properties

Methods

Constructors

Properties

MAX_MONTH_DAY: number = 31

Methods

\ No newline at end of file diff --git a/docs/classes/Parser.html b/docs/classes/Parser.html index 3bc44de..d19516c 100644 --- a/docs/classes/Parser.html +++ b/docs/classes/Parser.html @@ -1,2974 +1,101 @@ - - - - - - Parser | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Class Parser

-
- -
-
-
- - - - -
-
-
-
-

Constructors

-
- - - -
-
-
-

Properties

-
- - -
- JOLLY_CHAR: - string = "*" -
- -
-
- - -
- OMOCODE_BITMAP: - number = 0b0111011011000000 -
-
-

Default omocode bitmap

-
-
- -
-
- - -
- belfioreConnector: - IBelfioreConnector -
- -
-
-
-

Methods

-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - targetChar: - string -
    • -
    • - counterCaseChar: string -
    • -
    -
    -

    - Returns string -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - fiscalCode: - string -
      -

      16 character Codice Fiscale to decode

      -
      -
      -
    • -
    -
    -

    - Returns Promise<default> -

    -

    Decoded CF Info

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Convert omocode CF into plain one

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      - Partial or complete Omocode/Regular CF to parse, - starting from LastName -

      -
      -
      -
    • -
    -
    -

    - Returns string -

    -

    Regular CF w/o omocodes chars

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
    • -
    • - omocodeId: - number -
    • -
    -
    -

    - Returns string -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
    • -
    -
    -

    - Returns number -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse birth date information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | Date -

    -

    Birth Date

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse birth day information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | DateDay -

    -

    Birth day (1..31)

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse birth month information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | DateMonth -

    -

    Birth Month (0...11 - Date notation)

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse birth place information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    • - checkBirthDateConsistency: boolean = true -
      -

      - Ensure birthday is between creation and expiran date - of the cf city or country, default value: true -

      -
      -
      -
    • -
    -
    -

    - Returns Promise<null | BelfiorePlace> -

    -

    Birth place

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse birth year information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | number -

    -

    Birth Year (4 digits)

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse firstName information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    Partial/possible firstName

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse gender information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | Genders -

    -

    Male or female

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse lastName information

    -
    -
    -

    Parameters

    -
      -
    • - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    Partial/possible lastName

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - text: - string -
    • -
    • - CHAR_LIST: - string -
    • -
    -
    -

    - Returns string -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - char: - string -
    • -
    • - offset: - number -
    • -
    -
    -

    - Returns string -

    - -
  • -
-
-
- - - -
-
- - -
    - -
  • -
    -

    - Parse Date and Gender information to create Date/Gender CF - part -

    -
    -
    -

    Parameters

    -
      -
    • - date: - MultiFormatDate -
      -

      - Date or Moment instance, ISO8601 date string or array - of numbers [year, month, day] -

      -
      -
      -
    • -
    • - gender: - Genders -
      -

      Gender enum value

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    Birth date and Gender CF code

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse day information

    -
    -
    -

    Parameters

    -
      -
    • - day: - number -
      -

      Day number 1..31

      -
      -
      -
    • -
    • - gender: - Genders -
      -

      Gender enum value

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    Birth Day CF code

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Generates full CF

    -
    -
    -

    Parameters

    -
      -
    • - __namedParameters: Omit<default, "place"> & {
          place?: string | BelfiorePlace;
      }
      -
    • -
    -
    -

    - Returns Promise<null | string> -

    -

    Complete CF

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse firstName to cf part

    -
    -
    -

    Parameters

    -
      -
    • - Optional - firstName: - null | string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    partial cf

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse lastName to cf part

    -
    -
    -

    Parameters

    -
      -
    • - Optional - lastName: - null | string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    partial cf

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse month information

    -
    -
    -

    Parameters

    -
      -
    • - month: - number -
      -

      Month number 0..11

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    Birth Month CF code

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    - Parse Place information to return city or country details -

    -
    -
    -

    Parameters

    -
      -
    • - place: - string | BelfiorePlace -
      -

      - Belfiore place instance, belfiore code or city/country - name -

      -
      -
      -
    • -
    -
    -

    - Returns Promise<null | BelfiorePlace> -

    -

    - BelfiorePlace instance with the target city or country details -

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Convert omocode full or chunk CF into plain one

    -
    -
    -

    Parameters

    -
      -
    • - partialCodiceFiscale: string -
      -

      Partial or complete Omocode/Regular CF to parse

      -
      -
      -
    • -
    • - offset: - number = 0 -
      -

      - starting point of the given chunk in the 16 char CF -

      -
      -
      -
    • -
    -
    -

    - Returns string -

    -

    Regular version w/o omocodes chars of the given chunk

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    - Parse a Date and Gender information to create Date/Gender CF - part -

    -
    -
    -

    Parameters

    -
      -
    • - cityOrCountryName: string -
      -

      City or Country name

      -
      -
      -
    • -
    • - Optional - provinceId: - string -
      -

      Province code for cities

      -
      -
      -
    • -
    -
    -

    - Returns Promise<null | string> -

    -

    - Matching place belfiore code, if only once is matching - criteria -

    -
    - -
  • - -
  • -
    -

    Parameters

    -
      -
    • - birthDate: - MultiFormatDate -
    • -
    • - cityOrCountryName: string -
    • -
    • - Optional - provinceId: - string -
    • -
    -
    -

    - Returns Promise<null | string> -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse Year, Month, Day to Dated

    -
    -
    -

    Parameters

    -
      -
    • - year: - undefined | null | number -
      -

      4 digits Year

      -
      -
      -
    • -
    • - month: - undefined | null | DateMonth = 0 -
      -

      1 or 2 digits Month 0..11

      -
      -
      -
    • -
    • - day: - undefined | null | DateDay = 1 -
      -

      1,2 digits Day 1..31

      -
      -
      -
    • -
    -
    -

    - Returns null | Date -

    -

    Date or null if provided year/month/day are not valid

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parse year to cf part

    -
    -
    -

    Parameters

    -
      -
    • - year: - string | number -
      -

      - Birth year 2 or 4 digit string, number above 19XX or - below 100 -

      -
      -
      -
    • -
    -
    -

    - Returns null | string -

    -

    partial cf

    -
    - -
  • -
-
-
-
- -
-
-

- Generated using - TypeDoc -

-
-
- - +Parser | @marketto/codice-fiscale-utils

Constructors

Properties

JOLLY_CHAR: string = "*"
OMOCODE_BITMAP: number = 0b0111011011000000

Default omocode bitmap

+
belfioreConnector: IBelfioreConnector

Methods

  • Parameters

    • targetChar: string
    • counterCaseChar: string

    Returns string

  • Parameters

    • fiscalCode: string

      16 character Codice Fiscale to decode

      +

    Returns Promise<default>

    Decoded CF Info

    +
  • Convert omocode CF into plain one

    +

    Parameters

    • codiceFiscale: string

      Partial or complete Omocode/Regular CF to parse, starting from LastName

      +

    Returns string

    Regular CF w/o omocodes chars

    +
  • Parse birth date information

    +

    Parameters

    • codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns null | Date

    Birth Date

    +
  • Parse birth month information

    +

    Parameters

    • codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns null | DateMonth

    Birth Month (0...11 - Date notation)

    +
  • Parse birth place information

    +

    Parameters

    • codiceFiscale: string

      Partial or complete CF to parse

      +
    • checkBirthDateConsistency: boolean = true

      Ensure birthday is between creation and expiran date of the cf city or country, default value: true

      +

    Returns Promise<null | BelfiorePlace>

    Birth place

    +
  • Parse birth year information

    +

    Parameters

    • codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns null | number

    Birth Year (4 digits)

    +
  • Parse firstName information

    +

    Parameters

    • codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns null | string

    Partial/possible firstName

    +
  • Parse lastName information

    +

    Parameters

    • codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns null | string

    Partial/possible lastName

    +
  • Parse Date and Gender information to create Date/Gender CF part

    +

    Parameters

    • date: MultiFormatDate

      Date instance, ISO8601 date string or array of numbers [year, month, day]

      +
    • gender: Genders

      Gender enum value

      +

    Returns null | string

    Birth date and Gender CF code

    +
  • Parse day information

    +

    Parameters

    • day: number

      Day number 1..31

      +
    • gender: Genders

      Gender enum value

      +

    Returns null | string

    Birth Day CF code

    +
  • Generates full CF

    +

    Parameters

    • __namedParameters: Omit<default, "place"> & {
          place?: string | BelfiorePlace;
      }

    Returns Promise<null | string>

    Complete CF

    +
  • Parse firstName to cf part

    +

    Parameters

    • Optional firstName: null | string

      Partial or complete CF to parse

      +

    Returns null | string

    partial cf

    +
  • Parse lastName to cf part

    +

    Parameters

    • Optional lastName: null | string

      Partial or complete CF to parse

      +

    Returns null | string

    partial cf

    +
  • Parse month information

    +

    Parameters

    • month: number

      Month number 0..11

      +

    Returns null | string

    Birth Month CF code

    +
  • Parse Place information to return city or country details

    +

    Parameters

    • place: string | BelfiorePlace

      Belfiore place instance, belfiore code or city/country name

      +

    Returns Promise<null | BelfiorePlace>

    BelfiorePlace instance with the target city or country details

    +
  • Convert omocode full or chunk CF into plain one

    +

    Parameters

    • partialCodiceFiscale: string

      Partial or complete Omocode/Regular CF to parse

      +
    • offset: number = 0

      starting point of the given chunk in the 16 char CF

      +

    Returns string

    Regular version w/o omocodes chars of the given chunk

    +
  • Parse a Date and Gender information to create Date/Gender CF part

    +

    Parameters

    • cityOrCountryName: string

      City or Country name

      +
    • Optional provinceId: string

      Province code for cities

      +

    Returns Promise<null | string>

    Matching place belfiore code, if only once is matching criteria

    +
  • Parameters

    • birthDate: MultiFormatDate
    • cityOrCountryName: string
    • Optional provinceId: string

    Returns Promise<null | string>

  • Parse Year, Month, Day to Dated

    +

    Parameters

    • year: undefined | null | number

      4 digits Year

      +
    • month: undefined | null | DateMonth = 0

      1 or 2 digits Month 0..11

      +
    • day: undefined | null | DateDay = 1

      1,2 digits Day 1..31

      +

    Returns null | Date

    Date or null if provided year/month/day are not valid

    +
  • Parse year to cf part

    +

    Parameters

    • year: string | number

      Birth year 2 or 4 digit string, number above 19XX or below 100

      +

    Returns null | string

    partial cf

    +
\ No newline at end of file diff --git a/docs/classes/Pattern.html b/docs/classes/Pattern.html index ccd9a35..cbe0fd5 100644 --- a/docs/classes/Pattern.html +++ b/docs/classes/Pattern.html @@ -1,1947 +1,68 @@ - - - - - - Pattern | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Class Pattern

-
- -
-
-
- - - - -
-
-
-
-

Constructors

-
- - - -
-
-
-

Properties

-
- - -
- LETTER_SET: - string = ... -
- -
-
- - -
- SEPARATOR_SET: - string - = "(?:'?\\s{0,4})" -
- -
-
- - -
- belfioreConnector: - IBelfioreConnector -
- -
-
- - -
- parser: - Parser -
- -
-
-
-

Methods

-
- - -
    - -
  • -
    -

    Validation regexp for the given year or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - date: - null | MultiFormatDate -
      -

      Optional date to generate validation regexp

      -
      -
      -
    • -
    • - Optional - gender: - null | Genders -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    CF date and gender matcher

    -
    -

    See

    -

    Genders

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Validation regexp for the given day or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - day: - DateDay -
      -

      Optional day to generate validation regexp

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    CF day matcher

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Validation regexp for the given year or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - day: - DateDay -
      -

      Optional day to generate validation regexp

      -
      -
      -
    • -
    • - Optional - gender: - Genders -
      -

      Gender

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    CF day and gender matcher

    -
    -

    See

    -

    Genders

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Validation regexp for the given name or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - name: - string -
      -

      Optional name to generate validation regexp

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    CF name matcher

    -
    -

    Throw

    -

    INVALID_NAME

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Validation regexp for the given lastName or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - lastName: - string -
      -

      Optional lastName to generate validation regexp

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    CF Surname matcher

    -
    -

    Throw

    -

    INVALID_SURNAME

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Validation regexp for the given month or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - month: - DateMonth -
      -

      Optional month to generate validation regexp

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    CF month matcher

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - Optional - placeName: - null | string -
      -

      Optional place name to generate validation regexp

      -
      -
      -
    • -
    -
    -

    - Returns Promise<RegExp> -

    -

    CF place matcher

    -
    - -
  • - -
  • -
    -

    Parameters

    -
      -
    • - Optional - birthDate: - null | MultiFormatDate -
    • -
    • - Optional - placeName: - null | string -
    • -
    -
    -

    - Returns Promise<RegExp> -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Validation regexp for the given year or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - year: - number -
      -

      Optional year to generate validation regexp

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    CF year matcher

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    - Generates full CF validator based on given optional input or - generic -

    -
    -
    -

    Parameters

    -
      -
    • - Optional - personalInfo: - Omit<default, "place"> & {
          place?: string | BelfiorePlace;
      }
      -
      -

      Input Object

      -
      -
      -
    • -
    -
    -

    - Returns Promise<RegExp> -

    -

    CodiceFiscale matcher

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    - Returns iso8601 date validator based on given cf or generic -

    -
    -
    -

    Parameters

    -
      -
    • - Optional - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    Generic or specific regular expression

    -
    - -
  • -
-
-
- - - -
-
- - -
    - -
  • -
    -

    Returns name validator based on given cf or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    Generic or specific regular expression

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Returns gender validator based on given cf or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    Generic or specific regular expression

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - matcher: - string -
    • -
    -
    -

    - Returns RegExp -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Returns lastName validator based on given cf or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns RegExp -

    -

    Generic or specific regular expression

    -
    - -
  • -
-
-
- - -
    - -
  • -
    -

    Returns place validator based on given cf or generic

    -
    -
    -

    Parameters

    -
      -
    • - Optional - codiceFiscale: - string -
      -

      Partial or complete CF to parse

      -
      -
      -
    • -
    -
    -

    - Returns Promise<RegExp> -

    -

    Generic or specific regular expression

    -
    - -
  • -
-
-
-
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +Pattern | @marketto/codice-fiscale-utils

Constructors

Properties

LETTER_SET: string = ...
SEPARATOR_SET: string = "(?:'?\\s{0,4})"
belfioreConnector: IBelfioreConnector
parser: Parser

Methods

  • Validation regexp for the given year or generic

    +

    Parameters

    • Optional date: null | MultiFormatDate

      Optional date to generate validation regexp

      +
    • Optional gender: null | Genders

    Returns RegExp

    CF date and gender matcher

    +

    See

    Genders

    +
  • Validation regexp for the given day or generic

    +

    Parameters

    • Optional day: DateDay

      Optional day to generate validation regexp

      +

    Returns RegExp

    CF day matcher

    +
  • Validation regexp for the given year or generic

    +

    Parameters

    • Optional day: DateDay

      Optional day to generate validation regexp

      +
    • Optional gender: Genders

      Gender

      +

    Returns RegExp

    CF day and gender matcher

    +

    See

    Genders

    +
  • Validation regexp for the given name or generic

    +

    Parameters

    • Optional name: string

      Optional name to generate validation regexp

      +

    Returns RegExp

    CF name matcher

    +

    Throw

    INVALID_NAME

    +
  • Validation regexp for the given lastName or generic

    +

    Parameters

    • Optional lastName: string

      Optional lastName to generate validation regexp

      +

    Returns RegExp

    CF Surname matcher

    +

    Throw

    INVALID_SURNAME

    +
  • Validation regexp for the given month or generic

    +

    Parameters

    • Optional month: DateMonth

      Optional month to generate validation regexp

      +

    Returns RegExp

    CF month matcher

    +
  • Parameters

    • Optional placeName: null | string

      Optional place name to generate validation regexp

      +

    Returns Promise<RegExp>

    CF place matcher

    +
  • Parameters

    • Optional birthDate: null | MultiFormatDate
    • Optional placeName: null | string

    Returns Promise<RegExp>

  • Validation regexp for the given year or generic

    +

    Parameters

    • Optional year: number

      Optional year to generate validation regexp

      +

    Returns RegExp

    CF year matcher

    +
  • Generates full CF validator based on given optional input or generic

    +

    Parameters

    • Optional personalInfo: Omit<default, "place"> & {
          place?: string | BelfiorePlace;
      }

      Input Object

      +

    Returns Promise<RegExp>

    CodiceFiscale matcher

    +
  • Returns iso8601 date validator based on given cf or generic

    +

    Parameters

    • Optional codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns RegExp

    Generic or specific regular expression

    +
  • Returns name validator based on given cf or generic

    +

    Parameters

    • Optional codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns RegExp

    Generic or specific regular expression

    +
  • Returns gender validator based on given cf or generic

    +

    Parameters

    • Optional codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns RegExp

    Generic or specific regular expression

    +
  • Returns lastName validator based on given cf or generic

    +

    Parameters

    • Optional codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns RegExp

    Generic or specific regular expression

    +
  • Returns place validator based on given cf or generic

    +

    Parameters

    • Optional codiceFiscale: string

      Partial or complete CF to parse

      +

    Returns Promise<RegExp>

    Generic or specific regular expression

    +
\ No newline at end of file diff --git a/docs/classes/Validator-1.html b/docs/classes/Validator-1.html index 5308c6f..78d647c 100644 --- a/docs/classes/Validator-1.html +++ b/docs/classes/Validator-1.html @@ -1,1721 +1,20 @@ - - - - - - Validator | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Class Validator

-
- -
-
-
- - - - -
-
-
-
-

Constructors

-
- - - -
-
-
-

Properties

-
- - -
- belfioreConnector: - IBelfioreConnector -
- -
-
- - -
- parser: - Parser -
- -
-
- - -
- pattern: - Pattern -
- -
-
-
-

Methods

-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - firstName: - string -
    • -
    -
    -

    - Returns boolean -

    - -
  • -
-
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - firstName: - string -
    • -
    -
    -

    - Returns boolean -

    - -
  • -
-
-
- - - -
-
- - - -
-
- - -
    - -
  • -
    -

    Parameters

    -
      -
    • - lastName: - string -
    • -
    -
    -

    - Returns boolean -

    - -
  • -
-
-
- - - -
-
-
- -
-
-

- Generated using - TypeDoc -

-
-
- - +Validator | @marketto/codice-fiscale-utils

Constructors

Properties

belfioreConnector: IBelfioreConnector
parser: Parser
pattern: Pattern

Methods

\ No newline at end of file diff --git a/docs/enums/BirthMonth.html b/docs/enums/BirthMonth.html index fac5037..6cb3972 100644 --- a/docs/enums/BirthMonth.html +++ b/docs/enums/BirthMonth.html @@ -1,713 +1,13 @@ - - - - - - BirthMonth | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Enumeration BirthMonth

-
- -
-
-
- - - -
-
-

Enumeration Members

- -
-
-
-
-
-
-

Enumeration Members

-
- - -
- A: - 0 -
- -
-
- - -
- B: - 1 -
- -
-
- - -
- C: - 2 -
- -
-
- - -
- D: - 3 -
- -
-
- - -
- E: - 4 -
- -
-
- - -
- H: - 5 -
- -
-
- - -
- L: - 6 -
- -
-
- - -
- M: - 7 -
- -
-
- - -
- P: - 8 -
- -
-
- - -
- R: - 9 -
- -
-
- - -
- S: - 10 -
- -
-
- - -
- T: - 11 -
- -
-
-
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +BirthMonth | @marketto/codice-fiscale-utils
\ No newline at end of file diff --git a/docs/enums/CRC.html b/docs/enums/CRC.html index c4f1a90..a45f61e 100644 --- a/docs/enums/CRC.html +++ b/docs/enums/CRC.html @@ -1,1203 +1,27 @@ - - - - - - CRC | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Enumeration CRC

-
- -
-
-
- - - -
-
-

Enumeration Members

- -
-
-
-
-
-
-

Enumeration Members

-
- - -
- A: - 1 -
- -
-
- - -
- B: - 0 -
- -
-
- - -
- C: - 5 -
- -
-
- - -
- D: - 7 -
- -
-
- - -
- E: - 9 -
- -
-
- - -
- F: - 13 -
- -
-
- - -
- G: - 15 -
- -
-
- - -
- H: - 17 -
- -
-
- - -
- I: - 19 -
- -
-
- - -
- J: - 21 -
- -
-
- - -
- K: - 2 -
- -
-
- - -
- L: - 4 -
- -
-
- - -
- M: - 18 -
- -
-
- - -
- N: - 20 -
- -
-
- - -
- O: - 11 -
- -
-
- - -
- P: - 3 -
- -
-
- - -
- Q: - 6 -
- -
-
- - -
- R: - 8 -
- -
-
- - -
- S: - 12 -
- -
-
- - -
- T: - 14 -
- -
-
- - -
- U: - 16 -
- -
-
- - -
- V: - 10 -
- -
-
- - -
- W: - 22 -
- -
-
- - -
- X: - 25 -
- -
-
- - -
- Y: - 24 -
- -
-
- - -
- Z: - 23 -
- -
-
-
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CRC | @marketto/codice-fiscale-utils

Enumeration Members

A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +

Enumeration Members

A: 1
B: 0
C: 5
D: 7
E: 9
F: 13
G: 15
H: 17
I: 19
J: 21
K: 2
L: 4
M: 18
N: 20
O: 11
P: 3
Q: 6
R: 8
S: 12
T: 14
U: 16
V: 10
W: 22
X: 25
Y: 24
Z: 23
\ No newline at end of file diff --git a/docs/enums/Omocodes.html b/docs/enums/Omocodes.html index 37922e9..200c2a0 100644 --- a/docs/enums/Omocodes.html +++ b/docs/enums/Omocodes.html @@ -1,643 +1,11 @@ - - - - - - Omocodes | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Enumeration Omocodes

-
- -
-
-
- - - -
-
-

Enumeration Members

- -
-
-
-
-
-
-

Enumeration Members

-
- - -
- L: - 0 -
- -
-
- - -
- M: - 1 -
- -
-
- - -
- N: - 2 -
- -
-
- - -
- P: - 3 -
- -
-
- - -
- Q: - 4 -
- -
-
- - -
- R: - 5 -
- -
-
- - -
- S: - 6 -
- -
-
- - -
- T: - 7 -
- -
-
- - -
- U: - 8 -
- -
-
- - -
- V: - 9 -
- -
-
-
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +Omocodes | @marketto/codice-fiscale-utils

Enumeration Members

L +M +N +P +Q +R +S +T +U +V +

Enumeration Members

L: 0
M: 1
N: 2
P: 3
Q: 4
R: 5
S: 6
T: 7
U: 8
V: 9
\ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 1560bea..88b8915 100644 --- a/docs/index.html +++ b/docs/index.html @@ -29,7 +29,7 @@

🔧 USAGE

CJS

const CodiceFiscaleUtils = require("@marketto/codice-fiscale-utils");
const codiceFiscaleUtils = new CodiceFiscaleUtils(belfioreConnector);
-

MJS & TypeScript

import CodiceFiscaleUtils from "@marketto/codice-fiscale-utils";
const codiceFiscaleUtils = new CodiceFiscaleUtils(belfioreConnector); +

MJS & TypeScript

import { CodiceFiscaleUtils } from "@marketto/codice-fiscale-utils";
const codiceFiscaleUtils = new CodiceFiscaleUtils(belfioreConnector);

📖 DOCUMENTATION

CodiceFiscaleUtils.parser

Show code examples diff --git a/docs/interfaces/IMismatchVerboseErrors.html b/docs/interfaces/IMismatchVerboseErrors.html index 1c097f2..f2550c0 100644 --- a/docs/interfaces/IMismatchVerboseErrors.html +++ b/docs/interfaces/IMismatchVerboseErrors.html @@ -1,7 +1,7 @@ -IMismatchVerboseErrors | @marketto/codice-fiscale-utils
interface IMismatchVerboseErrors {
    crc?: string;
    date?: string;
    firstName?: string;
    gender?: string;
    lastName?: string;
    place?: string;
}

Properties

crc? +IMismatchVerboseErrors | @marketto/codice-fiscale-utils
interface IMismatchVerboseErrors {
    crc?: string;
    date?: string;
    firstName?: string;
    gender?: string;
    lastName?: string;
    place?: string;
}

Properties

crc?: string
date?: string
firstName?: string
gender?: string
lastName?: string
place?: string
\ No newline at end of file +

Properties

crc?: string
date?: string
firstName?: string
gender?: string
lastName?: string
place?: string
\ No newline at end of file diff --git a/docs/modules/DATE_MATCHER.html b/docs/modules/DATE_MATCHER.html index 35d0d46..fab6e7c 100644 --- a/docs/modules/DATE_MATCHER.html +++ b/docs/modules/DATE_MATCHER.html @@ -1,368 +1,16 @@ - - - - - - DATE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
- -
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DATE_MATCHER | @marketto/codice-fiscale-utils
\ No newline at end of file diff --git a/docs/modules/VALIDATOR.html b/docs/modules/VALIDATOR.html index 162e088..e5e3db5 100644 --- a/docs/modules/VALIDATOR.html +++ b/docs/modules/VALIDATOR.html @@ -1,547 +1,41 @@ - - - - - - VALIDATOR | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
- -
-

- Generated using - TypeDoc -

-
-
- - +VALIDATOR | @marketto/codice-fiscale-utils
\ No newline at end of file diff --git a/docs/types/BelfiorePlace.html b/docs/types/BelfiorePlace.html index daaa9cf..eefbcf5 100644 --- a/docs/types/BelfiorePlace.html +++ b/docs/types/BelfiorePlace.html @@ -1,259 +1 @@ - - - - - - BelfiorePlace | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Type alias BelfiorePlace

-
-
- BelfiorePlace: - IBelfiorePlace | IBelfioreCity | IBelfioreCountry -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +BelfiorePlace | @marketto/codice-fiscale-utils
BelfiorePlace: IBelfiorePlace | IBelfioreCity | IBelfioreCountry
\ No newline at end of file diff --git a/docs/types/DateDay.html b/docs/types/DateDay.html index a842b64..1c21265 100644 --- a/docs/types/DateDay.html +++ b/docs/types/DateDay.html @@ -1,318 +1 @@ - - - - - - DateDay | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Type alias DateDay

-
-
- DateDay: - 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DateDay | @marketto/codice-fiscale-utils
DateDay: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31
\ No newline at end of file diff --git a/docs/types/DateMonth.html b/docs/types/DateMonth.html index f04dd9e..9fd5e04 100644 --- a/docs/types/DateMonth.html +++ b/docs/types/DateMonth.html @@ -1,280 +1 @@ - - - - - - DateMonth | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Type alias DateMonth

-
-
- DateMonth: - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DateMonth | @marketto/codice-fiscale-utils
DateMonth: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
\ No newline at end of file diff --git a/docs/types/Genders.html b/docs/types/Genders.html index 240771a..5eed811 100644 --- a/docs/types/Genders.html +++ b/docs/types/Genders.html @@ -1,260 +1 @@ - - - - - - Genders | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Type alias Genders

-
-
- Genders: - "M" | "F" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +Genders | @marketto/codice-fiscale-utils
Genders: "M" | "F"
\ No newline at end of file diff --git a/docs/types/MultiFormatDate.html b/docs/types/MultiFormatDate.html index 08c250d..8cef394 100644 --- a/docs/types/MultiFormatDate.html +++ b/docs/types/MultiFormatDate.html @@ -1,265 +1 @@ - - - - - - MultiFormatDate | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Type alias MultiFormatDate

-
-
- MultiFormatDate: - string | Date | Moment | number[] -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MultiFormatDate | @marketto/codice-fiscale-utils
MultiFormatDate: string | Date | number[]
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.DAY.html b/docs/variables/DATE_MATCHER.DAY.html index a6dd866..3a6a255 100644 --- a/docs/variables/DATE_MATCHER.DAY.html +++ b/docs/variables/DATE_MATCHER.DAY.html @@ -1,262 +1 @@ - - - - - - DAY | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Variable DAYConst

-
-
- DAY: - string - = "0[1-9]|[12][0-9]|3[01]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAY | @marketto/codice-fiscale-utils
DAY: string = "0[1-9]|[12][0-9]|3[01]"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.DAYS_30_MONTHS.html b/docs/variables/DATE_MATCHER.DAYS_30_MONTHS.html index 21d397b..40c5826 100644 --- a/docs/variables/DATE_MATCHER.DAYS_30_MONTHS.html +++ b/docs/variables/DATE_MATCHER.DAYS_30_MONTHS.html @@ -1,266 +1 @@ - - - - - - DAYS_30_MONTHS | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAYS_30_MONTHSConst -

-
-
- DAYS_30_MONTHS: - string = "0[469]|11" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAYS_30_MONTHS | @marketto/codice-fiscale-utils
DAYS_30_MONTHS: string = "0[469]|11"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.DAYS_31_MONTHS.html b/docs/variables/DATE_MATCHER.DAYS_31_MONTHS.html index 7a7964a..e643eb0 100644 --- a/docs/variables/DATE_MATCHER.DAYS_31_MONTHS.html +++ b/docs/variables/DATE_MATCHER.DAYS_31_MONTHS.html @@ -1,268 +1 @@ - - - - - - DAYS_31_MONTHS | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAYS_31_MONTHSConst -

-
-
- DAYS_31_MONTHS: - string - = "0[13578]|1[02]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAYS_31_MONTHS | @marketto/codice-fiscale-utils
DAYS_31_MONTHS: string = "0[13578]|1[02]"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.HOURS.html b/docs/variables/DATE_MATCHER.HOURS.html index fd53afd..f768ced 100644 --- a/docs/variables/DATE_MATCHER.HOURS.html +++ b/docs/variables/DATE_MATCHER.HOURS.html @@ -1,262 +1 @@ - - - - - - HOURS | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Variable HOURSConst

-
-
- HOURS: - string - = "[01]\\d|2[0-3]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +HOURS | @marketto/codice-fiscale-utils
HOURS: string = "[01]\\d|2[0-3]"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.ISO8601_DATE_TIME.html b/docs/variables/DATE_MATCHER.ISO8601_DATE_TIME.html index 7a17b0f..3136019 100644 --- a/docs/variables/DATE_MATCHER.ISO8601_DATE_TIME.html +++ b/docs/variables/DATE_MATCHER.ISO8601_DATE_TIME.html @@ -1,268 +1 @@ - - - - - - ISO8601_DATE_TIME | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable ISO8601_DATE_TIMEConst -

-
-
- ISO8601_DATE_TIME: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +ISO8601_DATE_TIME | @marketto/codice-fiscale-utils
ISO8601_DATE_TIME: string = ...
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.ISO8601_SHORT_DATE.html b/docs/variables/DATE_MATCHER.ISO8601_SHORT_DATE.html index a4ec8ee..1213b62 100644 --- a/docs/variables/DATE_MATCHER.ISO8601_SHORT_DATE.html +++ b/docs/variables/DATE_MATCHER.ISO8601_SHORT_DATE.html @@ -1,268 +1 @@ - - - - - - ISO8601_SHORT_DATE | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable ISO8601_SHORT_DATEConst -

-
-
- ISO8601_SHORT_DATE: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +ISO8601_SHORT_DATE | @marketto/codice-fiscale-utils
ISO8601_SHORT_DATE: string = ...
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.LEAP_MONTH.html b/docs/variables/DATE_MATCHER.LEAP_MONTH.html index 106353d..4335405 100644 --- a/docs/variables/DATE_MATCHER.LEAP_MONTH.html +++ b/docs/variables/DATE_MATCHER.LEAP_MONTH.html @@ -1,262 +1 @@ - - - - - - LEAP_MONTH | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable LEAP_MONTHConst -

-
-
- LEAP_MONTH: - string = "02" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +LEAP_MONTH | @marketto/codice-fiscale-utils
LEAP_MONTH: string = "02"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.MILLISECONDS.html b/docs/variables/DATE_MATCHER.MILLISECONDS.html index b88e868..aa6901a 100644 --- a/docs/variables/DATE_MATCHER.MILLISECONDS.html +++ b/docs/variables/DATE_MATCHER.MILLISECONDS.html @@ -1,262 +1 @@ - - - - - - MILLISECONDS | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MILLISECONDSConst -

-
-
- MILLISECONDS: - string = "\\d{3}" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MILLISECONDS | @marketto/codice-fiscale-utils
MILLISECONDS: string = "\\d{3}"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.MINUTES.html b/docs/variables/DATE_MATCHER.MINUTES.html index 2228de9..905e286 100644 --- a/docs/variables/DATE_MATCHER.MINUTES.html +++ b/docs/variables/DATE_MATCHER.MINUTES.html @@ -1,262 +1 @@ - - - - - - MINUTES | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MINUTESConst -

-
-
- MINUTES: - string = "[0-5]\\d" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MINUTES | @marketto/codice-fiscale-utils
MINUTES: string = "[0-5]\\d"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.MONTH.html b/docs/variables/DATE_MATCHER.MONTH.html index 4e8ea35..caa49f3 100644 --- a/docs/variables/DATE_MATCHER.MONTH.html +++ b/docs/variables/DATE_MATCHER.MONTH.html @@ -1,262 +1 @@ - - - - - - MONTH | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Variable MONTHConst

-
-
- MONTH: - string - = "0[1-9]|1[0-2]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MONTH | @marketto/codice-fiscale-utils
MONTH: string = "0[1-9]|1[0-2]"
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.MONTH_DAY.html b/docs/variables/DATE_MATCHER.MONTH_DAY.html index f72e6e6..eebeae1 100644 --- a/docs/variables/DATE_MATCHER.MONTH_DAY.html +++ b/docs/variables/DATE_MATCHER.MONTH_DAY.html @@ -1,262 +1 @@ - - - - - - MONTH_DAY | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MONTH_DAYConst -

-
-
- MONTH_DAY: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MONTH_DAY | @marketto/codice-fiscale-utils
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.SECONDS.html b/docs/variables/DATE_MATCHER.SECONDS.html index 18be45b..794864b 100644 --- a/docs/variables/DATE_MATCHER.SECONDS.html +++ b/docs/variables/DATE_MATCHER.SECONDS.html @@ -1,262 +1 @@ - - - - - - SECONDS | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable SECONDSConst -

-
-
- SECONDS: - string = MINUTES -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +SECONDS | @marketto/codice-fiscale-utils
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.TIME.html b/docs/variables/DATE_MATCHER.TIME.html index db5e4a0..4229375 100644 --- a/docs/variables/DATE_MATCHER.TIME.html +++ b/docs/variables/DATE_MATCHER.TIME.html @@ -1,260 +1 @@ - - - - - - TIME | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Variable TIMEConst

-
-
- TIME: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +TIME | @marketto/codice-fiscale-utils
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.TIMEZONE.html b/docs/variables/DATE_MATCHER.TIMEZONE.html index bedd4d6..79323dd 100644 --- a/docs/variables/DATE_MATCHER.TIMEZONE.html +++ b/docs/variables/DATE_MATCHER.TIMEZONE.html @@ -1,262 +1 @@ - - - - - - TIMEZONE | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable TIMEZONEConst -

-
-
- TIMEZONE: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +TIMEZONE | @marketto/codice-fiscale-utils
\ No newline at end of file diff --git a/docs/variables/DATE_MATCHER.YEAR.html b/docs/variables/DATE_MATCHER.YEAR.html index d163589..f90a123 100644 --- a/docs/variables/DATE_MATCHER.YEAR.html +++ b/docs/variables/DATE_MATCHER.YEAR.html @@ -1,260 +1 @@ - - - - - - YEAR | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

Variable YEARConst

-
-
- YEAR: - string = "[12][0-9]{3}" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +YEAR | @marketto/codice-fiscale-utils
YEAR: string = "[12][0-9]{3}"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.BELFIORE_CODE_MATCHER.html b/docs/variables/VALIDATOR.BELFIORE_CODE_MATCHER.html index b71ec07..cb18d7d 100644 --- a/docs/variables/VALIDATOR.BELFIORE_CODE_MATCHER.html +++ b/docs/variables/VALIDATOR.BELFIORE_CODE_MATCHER.html @@ -1,269 +1 @@ - - - - - - BELFIORE_CODE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable BELFIORE_CODE_MATCHERConst -

-
-
- BELFIORE_CODE_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +BELFIORE_CODE_MATCHER | @marketto/codice-fiscale-utils
BELFIORE_CODE_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CF_FULL_NAME_MATCHER.html b/docs/variables/VALIDATOR.CF_FULL_NAME_MATCHER.html index d9facb8..8259038 100644 --- a/docs/variables/VALIDATOR.CF_FULL_NAME_MATCHER.html +++ b/docs/variables/VALIDATOR.CF_FULL_NAME_MATCHER.html @@ -1,269 +1 @@ - - - - - - CF_FULL_NAME_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CF_FULL_NAME_MATCHERConst -

-
-
- CF_FULL_NAME_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CF_FULL_NAME_MATCHER | @marketto/codice-fiscale-utils
CF_FULL_NAME_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CF_NAME_MATCHER.html b/docs/variables/VALIDATOR.CF_NAME_MATCHER.html index d15886d..41d2dc2 100644 --- a/docs/variables/VALIDATOR.CF_NAME_MATCHER.html +++ b/docs/variables/VALIDATOR.CF_NAME_MATCHER.html @@ -1,266 +1 @@ - - - - - - CF_NAME_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CF_NAME_MATCHERConst -

-
-
- CF_NAME_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CF_NAME_MATCHER | @marketto/codice-fiscale-utils
CF_NAME_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CF_SURNAME_MATCHER.html b/docs/variables/VALIDATOR.CF_SURNAME_MATCHER.html index 5c48424..e019540 100644 --- a/docs/variables/VALIDATOR.CF_SURNAME_MATCHER.html +++ b/docs/variables/VALIDATOR.CF_SURNAME_MATCHER.html @@ -1,266 +1 @@ - - - - - - CF_SURNAME_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CF_SURNAME_MATCHERConst -

-
-
- CF_SURNAME_MATCHER: - string = CF_NAME_MATCHER -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CF_SURNAME_MATCHER | @marketto/codice-fiscale-utils
CF_SURNAME_MATCHER: string = CF_NAME_MATCHER
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CHECK_DIGIT.html b/docs/variables/VALIDATOR.CHECK_DIGIT.html index 1f64d0d..7bf3356 100644 --- a/docs/variables/VALIDATOR.CHECK_DIGIT.html +++ b/docs/variables/VALIDATOR.CHECK_DIGIT.html @@ -1,262 +1 @@ - - - - - - CHECK_DIGIT | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CHECK_DIGITConst -

-
-
- CHECK_DIGIT: - string = "[A-Z]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CHECK_DIGIT | @marketto/codice-fiscale-utils
CHECK_DIGIT: string = "[A-Z]"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CITY_CODE_LIST.html b/docs/variables/VALIDATOR.CITY_CODE_LIST.html index ac75aee..a11aecd 100644 --- a/docs/variables/VALIDATOR.CITY_CODE_LIST.html +++ b/docs/variables/VALIDATOR.CITY_CODE_LIST.html @@ -1,264 +1 @@ - - - - - - CITY_CODE_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CITY_CODE_LISTConst -

-
-
- CITY_CODE_LIST: - string = "A-M" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CITY_CODE_LIST | @marketto/codice-fiscale-utils
CITY_CODE_LIST: string = "A-M"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CITY_CODE_MATCHER.html b/docs/variables/VALIDATOR.CITY_CODE_MATCHER.html index ea3cf63..8232d1a 100644 --- a/docs/variables/VALIDATOR.CITY_CODE_MATCHER.html +++ b/docs/variables/VALIDATOR.CITY_CODE_MATCHER.html @@ -1,266 +1 @@ - - - - - - CITY_CODE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CITY_CODE_MATCHERConst -

-
-
- CITY_CODE_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CITY_CODE_MATCHER | @marketto/codice-fiscale-utils
CITY_CODE_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CODICE_FISCALE.html b/docs/variables/VALIDATOR.CODICE_FISCALE.html index 83233e4..ec30794 100644 --- a/docs/variables/VALIDATOR.CODICE_FISCALE.html +++ b/docs/variables/VALIDATOR.CODICE_FISCALE.html @@ -1,264 +1 @@ - - - - - - CODICE_FISCALE | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CODICE_FISCALEConst -

-
-
- CODICE_FISCALE: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CODICE_FISCALE | @marketto/codice-fiscale-utils
CODICE_FISCALE: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.CONSONANT_LIST.html b/docs/variables/VALIDATOR.CONSONANT_LIST.html index 3ffb87c..b9adc4f 100644 --- a/docs/variables/VALIDATOR.CONSONANT_LIST.html +++ b/docs/variables/VALIDATOR.CONSONANT_LIST.html @@ -1,266 +1 @@ - - - - - - CONSONANT_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable CONSONANT_LISTConst -

-
-
- CONSONANT_LIST: - string - = "B-DF-HJ-NP-TV-Z" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +CONSONANT_LIST | @marketto/codice-fiscale-utils
CONSONANT_LIST: string = "B-DF-HJ-NP-TV-Z"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.COUNTRY_CODE_LIST.html b/docs/variables/VALIDATOR.COUNTRY_CODE_LIST.html index 315efbe..2e63a51 100644 --- a/docs/variables/VALIDATOR.COUNTRY_CODE_LIST.html +++ b/docs/variables/VALIDATOR.COUNTRY_CODE_LIST.html @@ -1,266 +1 @@ - - - - - - COUNTRY_CODE_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable COUNTRY_CODE_LISTConst -

-
-
- COUNTRY_CODE_LIST: - string = "Z" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +COUNTRY_CODE_LIST | @marketto/codice-fiscale-utils
COUNTRY_CODE_LIST: string = "Z"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.COUNTRY_CODE_MATCHER.html b/docs/variables/VALIDATOR.COUNTRY_CODE_MATCHER.html index 91d1194..23c3353 100644 --- a/docs/variables/VALIDATOR.COUNTRY_CODE_MATCHER.html +++ b/docs/variables/VALIDATOR.COUNTRY_CODE_MATCHER.html @@ -1,269 +1 @@ - - - - - - COUNTRY_CODE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable COUNTRY_CODE_MATCHERConst -

-
-
- COUNTRY_CODE_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +COUNTRY_CODE_MATCHER | @marketto/codice-fiscale-utils
COUNTRY_CODE_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.DAY_29_MATCHER.html b/docs/variables/VALIDATOR.DAY_29_MATCHER.html index 67be5ca..6935474 100644 --- a/docs/variables/VALIDATOR.DAY_29_MATCHER.html +++ b/docs/variables/VALIDATOR.DAY_29_MATCHER.html @@ -1,264 +1 @@ - - - - - - DAY_29_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAY_29_MATCHERConst -

-
-
- DAY_29_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAY_29_MATCHER | @marketto/codice-fiscale-utils
DAY_29_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.DAY_2X_MATCHER.html b/docs/variables/VALIDATOR.DAY_2X_MATCHER.html index fa40b2a..19fca5e 100644 --- a/docs/variables/VALIDATOR.DAY_2X_MATCHER.html +++ b/docs/variables/VALIDATOR.DAY_2X_MATCHER.html @@ -1,265 +1 @@ - - - - - - DAY_2X_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAY_2X_MATCHERConst -

-
-
- DAY_2X_MATCHER: - string = "[26NS]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAY_2X_MATCHER | @marketto/codice-fiscale-utils
DAY_2X_MATCHER: string = "[26NS]"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.DAY_30_MATCHER.html b/docs/variables/VALIDATOR.DAY_30_MATCHER.html index b0bada1..11dd6a3 100644 --- a/docs/variables/VALIDATOR.DAY_30_MATCHER.html +++ b/docs/variables/VALIDATOR.DAY_30_MATCHER.html @@ -1,264 +1 @@ - - - - - - DAY_30_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAY_30_MATCHERConst -

-
-
- DAY_30_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAY_30_MATCHER | @marketto/codice-fiscale-utils
DAY_30_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.DAY_31_MATCHER.html b/docs/variables/VALIDATOR.DAY_31_MATCHER.html index 0e6d30d..74b5943 100644 --- a/docs/variables/VALIDATOR.DAY_31_MATCHER.html +++ b/docs/variables/VALIDATOR.DAY_31_MATCHER.html @@ -1,264 +1 @@ - - - - - - DAY_31_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAY_31_MATCHERConst -

-
-
- DAY_31_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAY_31_MATCHER | @marketto/codice-fiscale-utils
DAY_31_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.DAY_3X_MATCHER.html b/docs/variables/VALIDATOR.DAY_3X_MATCHER.html index eb4c9de..b228c50 100644 --- a/docs/variables/VALIDATOR.DAY_3X_MATCHER.html +++ b/docs/variables/VALIDATOR.DAY_3X_MATCHER.html @@ -1,265 +1 @@ - - - - - - DAY_3X_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAY_3X_MATCHERConst -

-
-
- DAY_3X_MATCHER: - string = "[37PT]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAY_3X_MATCHER | @marketto/codice-fiscale-utils
DAY_3X_MATCHER: string = "[37PT]"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.DAY_MATCHER.html b/docs/variables/VALIDATOR.DAY_MATCHER.html index e80141b..116e505 100644 --- a/docs/variables/VALIDATOR.DAY_MATCHER.html +++ b/docs/variables/VALIDATOR.DAY_MATCHER.html @@ -1,262 +1 @@ - - - - - - DAY_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable DAY_MATCHERConst -

-
-
- DAY_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +DAY_MATCHER | @marketto/codice-fiscale-utils
DAY_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.FEMALE_DAY_MATCHER.html b/docs/variables/VALIDATOR.FEMALE_DAY_MATCHER.html index 66352e5..b0f92e4 100644 --- a/docs/variables/VALIDATOR.FEMALE_DAY_MATCHER.html +++ b/docs/variables/VALIDATOR.FEMALE_DAY_MATCHER.html @@ -1,266 +1 @@ - - - - - - FEMALE_DAY_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable FEMALE_DAY_MATCHERConst -

-
-
- FEMALE_DAY_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +FEMALE_DAY_MATCHER | @marketto/codice-fiscale-utils
FEMALE_DAY_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.FEMALE_FULL_DATE_MATCHER.html b/docs/variables/VALIDATOR.FEMALE_FULL_DATE_MATCHER.html index 78c7104..ef08fc4 100644 --- a/docs/variables/VALIDATOR.FEMALE_FULL_DATE_MATCHER.html +++ b/docs/variables/VALIDATOR.FEMALE_FULL_DATE_MATCHER.html @@ -1,269 +1 @@ - - - - - - FEMALE_FULL_DATE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable FEMALE_FULL_DATE_MATCHERConst -

-
-
- FEMALE_FULL_DATE_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +FEMALE_FULL_DATE_MATCHER | @marketto/codice-fiscale-utils
FEMALE_FULL_DATE_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.FULL_DATE_MATCHER.html b/docs/variables/VALIDATOR.FULL_DATE_MATCHER.html index 1dc01bb..c31265f 100644 --- a/docs/variables/VALIDATOR.FULL_DATE_MATCHER.html +++ b/docs/variables/VALIDATOR.FULL_DATE_MATCHER.html @@ -1,266 +1 @@ - - - - - - FULL_DATE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable FULL_DATE_MATCHERConst -

-
-
- FULL_DATE_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +FULL_DATE_MATCHER | @marketto/codice-fiscale-utils
FULL_DATE_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.LEAP_YEAR_MATCHER.html b/docs/variables/VALIDATOR.LEAP_YEAR_MATCHER.html index 6ca90c8..cb6a4c5 100644 --- a/docs/variables/VALIDATOR.LEAP_YEAR_MATCHER.html +++ b/docs/variables/VALIDATOR.LEAP_YEAR_MATCHER.html @@ -1,268 +1 @@ - - - - - - LEAP_YEAR_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable LEAP_YEAR_MATCHERConst -

-
-
- LEAP_YEAR_MATCHER: - string - = "[02468LNQSU][048LQU]|[13579MPRTV][26NS]" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +LEAP_YEAR_MATCHER | @marketto/codice-fiscale-utils
LEAP_YEAR_MATCHER: string = "[02468LNQSU][048LQU]|[13579MPRTV][26NS]"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.MALE_DAY_MATCHER.html b/docs/variables/VALIDATOR.MALE_DAY_MATCHER.html index 286146a..5011895 100644 --- a/docs/variables/VALIDATOR.MALE_DAY_MATCHER.html +++ b/docs/variables/VALIDATOR.MALE_DAY_MATCHER.html @@ -1,266 +1 @@ - - - - - - MALE_DAY_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MALE_DAY_MATCHERConst -

-
-
- MALE_DAY_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MALE_DAY_MATCHER | @marketto/codice-fiscale-utils
MALE_DAY_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.MALE_FULL_DATE_MATCHER.html b/docs/variables/VALIDATOR.MALE_FULL_DATE_MATCHER.html index f2b6863..fdc9da1 100644 --- a/docs/variables/VALIDATOR.MALE_FULL_DATE_MATCHER.html +++ b/docs/variables/VALIDATOR.MALE_FULL_DATE_MATCHER.html @@ -1,269 +1 @@ - - - - - - MALE_FULL_DATE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MALE_FULL_DATE_MATCHERConst -

-
-
- MALE_FULL_DATE_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MALE_FULL_DATE_MATCHER | @marketto/codice-fiscale-utils
MALE_FULL_DATE_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.MONTH_30DAYS_LIST.html b/docs/variables/VALIDATOR.MONTH_30DAYS_LIST.html index 0684393..e13bba2 100644 --- a/docs/variables/VALIDATOR.MONTH_30DAYS_LIST.html +++ b/docs/variables/VALIDATOR.MONTH_30DAYS_LIST.html @@ -1,266 +1 @@ - - - - - - MONTH_30DAYS_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MONTH_30DAYS_LISTConst -

-
-
- MONTH_30DAYS_LIST: - string = "DHPS" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MONTH_30DAYS_LIST | @marketto/codice-fiscale-utils
MONTH_30DAYS_LIST: string = "DHPS"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.MONTH_31DAYS_LIST.html b/docs/variables/VALIDATOR.MONTH_31DAYS_LIST.html index f39e647..20a9330 100644 --- a/docs/variables/VALIDATOR.MONTH_31DAYS_LIST.html +++ b/docs/variables/VALIDATOR.MONTH_31DAYS_LIST.html @@ -1,266 +1 @@ - - - - - - MONTH_31DAYS_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MONTH_31DAYS_LISTConst -

-
-
- MONTH_31DAYS_LIST: - string = "ACELMRT" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MONTH_31DAYS_LIST | @marketto/codice-fiscale-utils
MONTH_31DAYS_LIST: string = "ACELMRT"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.MONTH_DAY_MATCHER.html b/docs/variables/VALIDATOR.MONTH_DAY_MATCHER.html index f61dfa4..72c6c79 100644 --- a/docs/variables/VALIDATOR.MONTH_DAY_MATCHER.html +++ b/docs/variables/VALIDATOR.MONTH_DAY_MATCHER.html @@ -1,266 +1 @@ - - - - - - MONTH_DAY_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MONTH_DAY_MATCHERConst -

-
-
- MONTH_DAY_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MONTH_DAY_MATCHER | @marketto/codice-fiscale-utils
MONTH_DAY_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.MONTH_LIST.html b/docs/variables/VALIDATOR.MONTH_LIST.html index 7a9c768..6683c5c 100644 --- a/docs/variables/VALIDATOR.MONTH_LIST.html +++ b/docs/variables/VALIDATOR.MONTH_LIST.html @@ -1,262 +1 @@ - - - - - - MONTH_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MONTH_LISTConst -

-
-
- MONTH_LIST: - string = "A-EHLMPR-T" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MONTH_LIST | @marketto/codice-fiscale-utils
MONTH_LIST: string = "A-EHLMPR-T"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.MONTH_MATCHER.html b/docs/variables/VALIDATOR.MONTH_MATCHER.html index ecead7d..ada14c4 100644 --- a/docs/variables/VALIDATOR.MONTH_MATCHER.html +++ b/docs/variables/VALIDATOR.MONTH_MATCHER.html @@ -1,264 +1 @@ - - - - - - MONTH_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable MONTH_MATCHERConst -

-
-
- MONTH_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +MONTH_MATCHER | @marketto/codice-fiscale-utils
MONTH_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.OMOCODE_NON_ZERO_NUMBER_LIST.html b/docs/variables/VALIDATOR.OMOCODE_NON_ZERO_NUMBER_LIST.html index 5763111..a5666fd 100644 --- a/docs/variables/VALIDATOR.OMOCODE_NON_ZERO_NUMBER_LIST.html +++ b/docs/variables/VALIDATOR.OMOCODE_NON_ZERO_NUMBER_LIST.html @@ -1,270 +1 @@ - - - - - - OMOCODE_NON_ZERO_NUMBER_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable OMOCODE_NON_ZERO_NUMBER_LISTConst -

-
-
- OMOCODE_NON_ZERO_NUMBER_LIST: - string = "1-9MNP-V" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +OMOCODE_NON_ZERO_NUMBER_LIST | @marketto/codice-fiscale-utils
OMOCODE_NON_ZERO_NUMBER_LIST: string = "1-9MNP-V"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.OMOCODE_NUMBER_LIST.html b/docs/variables/VALIDATOR.OMOCODE_NUMBER_LIST.html index cbeaf75..7a48ce7 100644 --- a/docs/variables/VALIDATOR.OMOCODE_NUMBER_LIST.html +++ b/docs/variables/VALIDATOR.OMOCODE_NUMBER_LIST.html @@ -1,269 +1 @@ - - - - - - OMOCODE_NUMBER_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable OMOCODE_NUMBER_LISTConst -

-
-
- OMOCODE_NUMBER_LIST: - string = "\\dLMNP-V" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +OMOCODE_NUMBER_LIST | @marketto/codice-fiscale-utils
OMOCODE_NUMBER_LIST: string = "\\dLMNP-V"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.OMOCODE_ZERO_LIST.html b/docs/variables/VALIDATOR.OMOCODE_ZERO_LIST.html index 066b9b3..6f1e772 100644 --- a/docs/variables/VALIDATOR.OMOCODE_ZERO_LIST.html +++ b/docs/variables/VALIDATOR.OMOCODE_ZERO_LIST.html @@ -1,266 +1 @@ - - - - - - OMOCODE_ZERO_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable OMOCODE_ZERO_LISTConst -

-
-
- OMOCODE_ZERO_LIST: - string = "0L" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +OMOCODE_ZERO_LIST | @marketto/codice-fiscale-utils
OMOCODE_ZERO_LIST: string = "0L"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.PARTIAL_BELFIORE_CODE_MATCHER.html b/docs/variables/VALIDATOR.PARTIAL_BELFIORE_CODE_MATCHER.html index de727d8..abeb7a2 100644 --- a/docs/variables/VALIDATOR.PARTIAL_BELFIORE_CODE_MATCHER.html +++ b/docs/variables/VALIDATOR.PARTIAL_BELFIORE_CODE_MATCHER.html @@ -1,272 +1 @@ - - - - - - - PARTIAL_BELFIORE_CODE_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable PARTIAL_BELFIORE_CODE_MATCHERConst -

-
-
- PARTIAL_BELFIORE_CODE_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +PARTIAL_BELFIORE_CODE_MATCHER | @marketto/codice-fiscale-utils
PARTIAL_BELFIORE_CODE_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.PARTIAL_CF.html b/docs/variables/VALIDATOR.PARTIAL_CF.html index 7a97521..9fcfb27 100644 --- a/docs/variables/VALIDATOR.PARTIAL_CF.html +++ b/docs/variables/VALIDATOR.PARTIAL_CF.html @@ -1,262 +1 @@ - - - - - - PARTIAL_CF | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable PARTIAL_CFConst -

-
-
- PARTIAL_CF: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +PARTIAL_CF | @marketto/codice-fiscale-utils
PARTIAL_CF: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.PARTIAL_CF_FULL_NAME.html b/docs/variables/VALIDATOR.PARTIAL_CF_FULL_NAME.html index 405b2f7..c73c688 100644 --- a/docs/variables/VALIDATOR.PARTIAL_CF_FULL_NAME.html +++ b/docs/variables/VALIDATOR.PARTIAL_CF_FULL_NAME.html @@ -1,269 +1 @@ - - - - - - PARTIAL_CF_FULL_NAME | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable PARTIAL_CF_FULL_NAMEConst -

-
-
- PARTIAL_CF_FULL_NAME: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +PARTIAL_CF_FULL_NAME | @marketto/codice-fiscale-utils
PARTIAL_CF_FULL_NAME: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.PARTIAL_CF_NAME_MATCHER.html b/docs/variables/VALIDATOR.PARTIAL_CF_NAME_MATCHER.html index 5b00572..b57043a 100644 --- a/docs/variables/VALIDATOR.PARTIAL_CF_NAME_MATCHER.html +++ b/docs/variables/VALIDATOR.PARTIAL_CF_NAME_MATCHER.html @@ -1,269 +1 @@ - - - - - - PARTIAL_CF_NAME_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable PARTIAL_CF_NAME_MATCHERConst -

-
-
- PARTIAL_CF_NAME_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +PARTIAL_CF_NAME_MATCHER | @marketto/codice-fiscale-utils
PARTIAL_CF_NAME_MATCHER: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.PARTIAL_FULL_DATE.html b/docs/variables/VALIDATOR.PARTIAL_FULL_DATE.html index 737c814..c08cef2 100644 --- a/docs/variables/VALIDATOR.PARTIAL_FULL_DATE.html +++ b/docs/variables/VALIDATOR.PARTIAL_FULL_DATE.html @@ -1,266 +1 @@ - - - - - - PARTIAL_FULL_DATE | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable PARTIAL_FULL_DATEConst -

-
-
- PARTIAL_FULL_DATE: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +PARTIAL_FULL_DATE | @marketto/codice-fiscale-utils
PARTIAL_FULL_DATE: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.PARTIAL_MONTH_DAY.html b/docs/variables/VALIDATOR.PARTIAL_MONTH_DAY.html index 1d942aa..4192b82 100644 --- a/docs/variables/VALIDATOR.PARTIAL_MONTH_DAY.html +++ b/docs/variables/VALIDATOR.PARTIAL_MONTH_DAY.html @@ -1,266 +1 @@ - - - - - - PARTIAL_MONTH_DAY | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable PARTIAL_MONTH_DAYConst -

-
-
- PARTIAL_MONTH_DAY: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +PARTIAL_MONTH_DAY | @marketto/codice-fiscale-utils
PARTIAL_MONTH_DAY: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.PARTIAL_YEAR.html b/docs/variables/VALIDATOR.PARTIAL_YEAR.html index 6faf8dc..edff1a5 100644 --- a/docs/variables/VALIDATOR.PARTIAL_YEAR.html +++ b/docs/variables/VALIDATOR.PARTIAL_YEAR.html @@ -1,262 +1 @@ - - - - - - PARTIAL_YEAR | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable PARTIAL_YEARConst -

-
-
- PARTIAL_YEAR: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +PARTIAL_YEAR | @marketto/codice-fiscale-utils
PARTIAL_YEAR: string = ...
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.VOWEL_LIST.html b/docs/variables/VALIDATOR.VOWEL_LIST.html index ab333de..9c07acf 100644 --- a/docs/variables/VALIDATOR.VOWEL_LIST.html +++ b/docs/variables/VALIDATOR.VOWEL_LIST.html @@ -1,262 +1 @@ - - - - - - VOWEL_LIST | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable VOWEL_LISTConst -

-
-
- VOWEL_LIST: - string = "AEIOU" -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +VOWEL_LIST | @marketto/codice-fiscale-utils
VOWEL_LIST: string = "AEIOU"
\ No newline at end of file diff --git a/docs/variables/VALIDATOR.YEAR_MATCHER.html b/docs/variables/VALIDATOR.YEAR_MATCHER.html index 465f620..8842380 100644 --- a/docs/variables/VALIDATOR.YEAR_MATCHER.html +++ b/docs/variables/VALIDATOR.YEAR_MATCHER.html @@ -1,262 +1 @@ - - - - - - YEAR_MATCHER | @marketto/codice-fiscale-utils - - - - - - - - - - - -
-
- -
- - -
-
-
-
-
-
- -

- Variable YEAR_MATCHERConst -

-
-
- YEAR_MATCHER: - string = ... -
- -
-
- - -
-
-
-

- Generated using - TypeDoc -

-
-
- - +YEAR_MATCHER | @marketto/codice-fiscale-utils
YEAR_MATCHER: string = ...
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7b32533..b1c9d30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,21 @@ { "name": "@marketto/codice-fiscale-utils", - "version": "3.0.0", + "version": "3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@marketto/codice-fiscale-utils", - "version": "3.0.0", + "version": "3.1.0", "license": "MIT", "dependencies": { "@marketto/diacritic-remover": "^1.0.7", - "moment": "^2.24.0" + "dayjs": "^1.11.13" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", - "@marketto/belfiore-connector": "^2.0.0", - "@marketto/belfiore-connector-embedded": "^1.0.0", + "@marketto/belfiore-connector": "^3.0.0", + "@marketto/belfiore-connector-embedded": "^1.2.0", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@types/chai": "^4.3.16", @@ -52,12 +52,12 @@ }, "../belfiore-connector-embedded": { "name": "@marketto/belfiore-connector-embedded", - "version": "1.1.0", + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "@marketto/belfiore-connector": "^2.0.0", - "moment": "^2.24.0" + "@marketto/belfiore-connector": "^3.0.0", + "dayjs": "^1.11.13" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", @@ -651,13 +651,10 @@ } }, "node_modules/@marketto/belfiore-connector": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@marketto/belfiore-connector/-/belfiore-connector-2.0.0.tgz", - "integrity": "sha512-enSSp+9Cu9OPpx5/cEsYcXQSeBEjHozgexJGrCAB2cGjt/KTvikaXbq9DbEfqXsCW9c2nxFGfIUmxcZFFIe5Hw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@marketto/belfiore-connector/-/belfiore-connector-3.0.0.tgz", + "integrity": "sha512-9UWMZb4Nu+dWMS69NDGaru42MFtAzqu+OybSUvNYBKMFjjjG6xAa+x16hvQXJHxjYK9RzNUwZ4KYdOjl+lJEjA==", "dev": true, - "dependencies": { - "moment": "^2.24.0" - }, "engines": { "node": ">=16.0.0" } @@ -2036,6 +2033,11 @@ "node": "*" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, "node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -4071,6 +4073,7 @@ "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, "engines": { "node": "*" } diff --git a/package.json b/package.json index 459062c..d2beebe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@marketto/codice-fiscale-utils", - "version": "3.0.0", + "version": "3.1.0", "description": "TS & JS utilities to handle Italian Codice Fiscale", "main": "dist/index.js", "module": "dist/index.mjs",