@novha/calc-engines 1.6.2 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -39,12 +39,19 @@ class FranceMortgageServiceImpl {
39
39
  maxMonthlyPayment -= monthlyInsuranceCost;
40
40
  }
41
41
  const maxLoanAmount = this.calculateLoanAmount(maxMonthlyPayment, stressedRate, loanDurationYears);
42
- const amortizationSchedule = this.calculateAmortizationSchedule(requiredLoanAmount, this._input.annualInterestRate, loanDurationYears);
42
+ const monthlyPayment = this.calculateMonthlyPayment(requiredLoanAmount, this._input.annualInterestRate, loanDurationYears);
43
+ const totalPaid = monthlyPayment * loanDurationYears * 12;
44
+ const totalInterestPaid = totalPaid - requiredLoanAmount;
45
+ const amortizationSchedule = this.calculateAmortizationSchedule(requiredLoanAmount, this._input.annualInterestRate, loanDurationYears, monthlyPayment);
43
46
  return {
47
+ loanAmount: requiredLoanAmount,
48
+ totalPaid,
49
+ totalInterestPaid,
50
+ monthlyPayment,
51
+ requiredLoanAmount,
44
52
  maxMonthlyPayment,
45
53
  maxLoanAmount,
46
54
  totalProjectCost,
47
- requiredLoanAmount,
48
55
  loanDurationYears,
49
56
  debtRatio: debtRatio,
50
57
  monthlyInsuranceCost,
@@ -52,14 +59,21 @@ class FranceMortgageServiceImpl {
52
59
  amortizationSchedule
53
60
  };
54
61
  }
55
- calculateAmortizationSchedule(loanAmount, annualRate, years) {
62
+ calculateMonthlyPayment(principal, annualRate, years) {
63
+ const monthlyRate = annualRate / 100 / 12;
64
+ const payments = years * 12;
65
+ if (monthlyRate === 0) {
66
+ return payments === 0 ? 0 : principal / payments;
67
+ }
68
+ return (principal *
69
+ (monthlyRate / (1 - Math.pow(1 + monthlyRate, -payments))));
70
+ }
71
+ calculateAmortizationSchedule(loanAmount, annualRate, years, monthlyPayment) {
56
72
  const monthlyRate = annualRate / 100 / 12;
57
73
  const totalPayments = years * 12;
58
- if (monthlyRate === 0 || loanAmount <= 0) {
74
+ if (monthlyRate === 0 || loanAmount <= 0 || monthlyPayment <= 0) {
59
75
  return [];
60
76
  }
61
- const monthlyPayment = (loanAmount * monthlyRate) /
62
- (1 - Math.pow(1 + monthlyRate, -totalPayments));
63
77
  const schedule = [];
64
78
  let balance = loanAmount;
65
79
  for (let year = 1; year <= years; year++) {
@@ -102,10 +116,14 @@ class FranceMortgageServiceImpl {
102
116
  loanDurationYears: 0,
103
117
  debtRatio: 0,
104
118
  monthlyInsuranceCost: 0,
119
+ loanAmount: 0,
120
+ monthlyPayment: 0,
121
+ totalInterestPaid: 0,
122
+ totalPaid: 0,
105
123
  isEligible: false,
106
124
  amortizationSchedule: []
107
125
  };
108
126
  }
109
127
  }
110
128
  exports.FranceMortgageServiceImpl = FranceMortgageServiceImpl;
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb3J0Z2FnZS9mcmFuY2UvRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLHlCQUF5QjtJQUlsQyxZQUFZLEtBQW9CLEVBQUUsS0FBb0I7UUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVM7UUFFTCxJQUNJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYztZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0I7WUFDbkQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUNqQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FDWCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU87WUFDM0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVk7WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBRW5DLE1BQU0saUJBQWlCLEdBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTztZQUM1RixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FB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LEVBQUUsVUFBa0IsRUFBRSxLQUFhO1FBQ2pGLE1BQU0sV0FBVyxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7UUFFNUIsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEIsT0FBTyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxPQUFPLENBQ0gsY0FBYztZQUNkLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FDN0QsQ0FBQztJQUNOLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUN6QyxPQUFPO1lBQ0gsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixhQUFhLEVBQUUsQ0FBQztZQUNoQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNyQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxXQUFXO1lBQzNELGlCQUFpQixFQUFFLENBQUM7WUFDcEIsU0FBUyxFQUFFLENBQUM7WUFDWixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLG9CQUFvQixFQUFFLEVBQUU7U0FDM0IsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQTNKRCw4REEySkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGcmFuY2VNb3J0Z2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBNb3J0Z2FnZVJ1bGVzLCBNb3J0Z2FnZUlucHV0LCBNb3J0Z2FnZU91dHB1dCwgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtIH0gZnJvbSAnLi9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEZyYW5jZU1vcnRnYWdlU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfaW5wdXQ6IE1vcnRnYWdlSW5wdXQ7XG4gICAgcHJpdmF0ZSBfcnVsZXM6IE1vcnRnYWdlUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogTW9ydGdhZ2VJbnB1dCwgcnVsZXM6IE1vcnRnYWdlUnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoKTogTW9ydGdhZ2VPdXRwdXQge1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LmlzRmlyc3RUaW1lQnV5ZXIgJiZcbiAgICAgICAgICAgIHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyICYmXG4gICAgICAgICAgICB0aGlzLl9ydWxlcy5maXJzdFRpbWVCdXllci5yZXF1aXJlc1ByaW1hcnlSZXNpZGVuY2UgJiZcbiAgICAgICAgICAgICF0aGlzLl9pbnB1dC5pc1ByaW1hcnlSZXNpZGVuY2VcbiAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZWxpZ2libGVSZXN1bHQodGhpcy5faW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVidFJhdGlvID1cbiAgICAgICAgICAgIHRoaXMuX2lucHV0LmlzRmlyc3RUaW1lQnV5ZXIgJiYgdGhpcy5fcnVsZXMuZmlyc3RUaW1lQnV5ZXIgJiZ0aGlzLl9ydWxlcy5maXJzdFRpbWVCdXllci5lbmFibGVkXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9ydWxlcy5maXJzdFRpbWVCdXllci5tYXhEZWJ0UmF0aW9cbiAgICAgICAgICAgICAgICA6IHRoaXMuX3J1bGVzLm1heERlYnRSYXRpbztcblxuICAgICAgICBjb25zdCBsb2FuRHVyYXRpb25ZZWFycyA9XG4gICAgICAgICAgICB0aGlzLl9pbnB1dC5pc0ZpcnN0VGltZUJ1eWVyICYmIHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyICYmIHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyLmVuYWJsZWRcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyLm1heExvYW5EdXJhdGlvblllYXJzXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9pbnB1dC5pc05ld0J1aWxkXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9ydWxlcy5tYXhMb2FuRHVyYXRpb25OZXdCdWlsZFllYXJzXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9ydWxlcy5tYXhMb2FuRHVyYXRpb25ZZWFycztcblxuICAgICAgICBjb25zdCBtaW5Eb3duUGF5bWVudCA9IHRoaXMuX2lucHV0LnByb3BlcnR5UHJpY2UgKiB0aGlzLl9ydWxlcy5taW5Eb3duUGF5bWVudFJhdGU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lucHV0LmRvd25QYXltZW50IDwgbWluRG93blBheW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZWxpZ2libGVSZXN1bHQodGhpcy5faW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm90YXJ5UmF0ZSA9IHRoaXMuX2lucHV0LmlzTmV3QnVpbGRcbiAgICAgICAgPyB0aGlzLl9ydWxlcy5mZWVzLm5vdGFyeVJhdGVOZXdQcm9wZXJ0eVxuICAgICAgICA6IHRoaXMuX3J1bGVzLmZlZXMubm90YXJ5UmF0ZU9sZFByb3BlcnR5O1xuXG4gICAgICAgIGNvbnN0IG5vdGFyeUZlZXMgPSB0aGlzLl9pbnB1dC5wcm9wZXJ0eVByaWNlICogbm90YXJ5UmF0ZTtcbiAgICAgICAgY29uc3QgYmFua0ZlZXMgPSB0aGlzLl9pbnB1dC5wcm9wZXJ0eVByaWNlICogdGhpcy5fcnVsZXMuZmVlcy5iYW5rRmVlc1JhdGU7XG4gICAgICAgIGNvbnN0IHRvdGFsUHJvamVjdENvc3QgPSB0aGlzLl9pbnB1dC5wcm9wZXJ0eVByaWNlICsgbm90YXJ5RmVlcyArIGJhbmtGZWVzO1xuICAgICAgICBjb25zdCByZXF1aXJlZExvYW5BbW91bnQgPSB0b3RhbFByb2plY3RDb3N0IC0gdGhpcy5faW5wdXQuZG93blBheW1lbnQ7XG4gICAgICAgIGNvbnN0IHN0cmVzc2VkUmF0ZSA9IHRoaXMuX2lucHV0LmFubnVhbEludGVyZXN0UmF0ZSArIHRoaXMuX3J1bGVzLnN0cmVzc1Rlc3QuaW50ZXJlc3RSYXRlQnVmZmVyO1xuXG4gICAgICAgIGNvbnN0IG1vbnRobHlJbnN1cmFuY2VDb3N0ID0gKHJlcXVpcmVkTG9hbkFtb3VudCAqIHRoaXMuX3J1bGVzLmluc3VyYW5jZS5hdmVyYWdlUmF0ZSkgLyAxMjtcblxuICAgICAgICBsZXQgbWF4TW9udGhseVBheW1lbnQgPSB0aGlzLl9pbnB1dC5uZXRNb250aGx5SW5jb21lICogZGVidFJhdGlvO1xuXG4gICAgICAgIGlmICh0aGlzLl9ydWxlcy5pbnN1cmFuY2UuaW5jbHVkZWRJbkRlYnRSYXRpbykge1xuICAgICAgICAgICAgbWF4TW9udGhseVBheW1lbnQgLT0gbW9udGhseUluc3VyYW5jZUNvc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhMb2FuQW1vdW50ID0gdGhpcy5jYWxjdWxhdGVMb2FuQW1vdW50KFxuICAgICAgICAgICAgbWF4TW9udGhseVBheW1lbnQsXG4gICAgICAgICAgICBzdHJlc3NlZFJhdGUsXG4gICAgICAgICAgICBsb2FuRHVyYXRpb25ZZWFyc1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGFtb3J0aXphdGlvblNjaGVkdWxlID0gdGhpcy5jYWxjdWxhdGVBbW9ydGl6YXRpb25TY2hlZHVsZShcbiAgICAgICAgICAgIHJlcXVpcmVkTG9hbkFtb3VudCxcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LmFubnVhbEludGVyZXN0UmF0ZSxcbiAgICAgICAgICAgIGxvYW5EdXJhdGlvblllYXJzXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1heE1vbnRobHlQYXltZW50LFxuICAgICAgICAgICAgbWF4TG9hbkFtb3VudCxcbiAgICAgICAgICAgIHRvdGFsUHJvamVjdENvc3QsXG4gICAgICAgICAgICByZXF1aXJlZExvYW5BbW91bnQsXG4gICAgICAgICAgICBsb2FuRHVyYXRpb25ZZWFycyxcbiAgICAgICAgICAgIGRlYnRSYXRpbzogZGVidFJhdGlvLFxuICAgICAgICAgICAgbW9udGhseUluc3VyYW5jZUNvc3QsXG4gICAgICAgICAgICBpc0VsaWdpYmxlOiBtYXhMb2FuQW1vdW50ID49IHJlcXVpcmVkTG9hbkFtb3VudCxcbiAgICAgICAgICAgIGFtb3J0aXphdGlvblNjaGVkdWxlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVBbW9ydGl6YXRpb25TY2hlZHVsZShcbiAgICAgICAgbG9hbkFtb3VudDogbnVtYmVyLFxuICAgICAgICBhbm51YWxSYXRlOiBudW1iZXIsXG4gICAgICAgIHllYXJzOiBudW1iZXJcbiAgICApOiBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlSYXRlID0gYW5udWFsUmF0ZSAvIDEwMCAvIDEyO1xuICAgICAgICBjb25zdCB0b3RhbFBheW1lbnRzID0geWVhcnMgKiAxMjtcblxuICAgICAgICBpZiAobW9udGhseVJhdGUgPT09IDAgfHwgbG9hbkFtb3VudCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb250aGx5UGF5bWVudCA9XG4gICAgICAgICAgICAobG9hbkFtb3VudCAqIG1vbnRobHlSYXRlKSAvXG4gICAgICAgICAgICAoMSAtIE1hdGgucG93KDEgKyBtb250aGx5UmF0ZSwgLXRvdGFsUGF5bWVudHMpKTtcblxuICAgICAgICBjb25zdCBzY2hlZHVsZTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW10gPSBbXTtcbiAgICAgICAgbGV0IGJhbGFuY2UgPSBsb2FuQW1vdW50O1xuXG4gICAgICAgIGZvciAobGV0IHllYXIgPSAxOyB5ZWFyIDw9IHllYXJzOyB5ZWFyKyspIHtcbiAgICAgICAgICAgIGxldCB5ZWFybHlQcmluY2lwYWwgPSAwO1xuICAgICAgICAgICAgbGV0IHllYXJseUludGVyZXN0ID0gMDtcblxuICAgICAgICAgICAgY29uc3QgcGF5bWVudHNJblllYXIgPSBNYXRoLm1pbigxMiwgdG90YWxQYXltZW50cyAtICh5ZWFyIC0gMSkgKiAxMik7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG1vbnRoID0gMTsgbW9udGggPD0gcGF5bWVudHNJblllYXI7IG1vbnRoKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmVzdFBheW1lbnQgPSBiYWxhbmNlICogbW9udGhseVJhdGU7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbmNpcGFsUGF5bWVudCA9IG1vbnRobHlQYXltZW50IC0gaW50ZXJlc3RQYXltZW50O1xuXG4gICAgICAgICAgICAgICAgeWVhcmx5SW50ZXJlc3QgKz0gaW50ZXJlc3RQYXltZW50O1xuICAgICAgICAgICAgICAgIHllYXJseVByaW5jaXBhbCArPSBwcmluY2lwYWxQYXltZW50O1xuICAgICAgICAgICAgICAgIGJhbGFuY2UgLT0gcHJpbmNpcGFsUGF5bWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NoZWR1bGUucHVzaCh7XG4gICAgICAgICAgICAgICAgeWVhcixcbiAgICAgICAgICAgICAgICBwcmluY2lwYWw6IHllYXJseVByaW5jaXBhbCxcbiAgICAgICAgICAgICAgICBpbnRlcmVzdDogeWVhcmx5SW50ZXJlc3QsXG4gICAgICAgICAgICAgICAgYmFsYW5jZTogTWF0aC5tYXgoMCwgYmFsYW5jZSlcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYmFsYW5jZSA8PSAwKSBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzY2hlZHVsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUxvYW5BbW91bnQobW9udGhseVBheW1lbnQ6IG51bWJlciwgYW5udWFsUmF0ZTogbnVtYmVyLCB5ZWFyczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW9udGhseVJhdGUgPSBhbm51YWxSYXRlIC8gMTAwIC8gMTI7XG4gICAgICAgIGNvbnN0IHBheW1lbnRzID0geWVhcnMgKiAxMjtcblxuICAgICAgICBpZiAobW9udGhseVJhdGUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtb250aGx5UGF5bWVudCAqIHBheW1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG1vbnRobHlQYXltZW50ICpcbiAgICAgICAgICAgICgoMSAtIE1hdGgucG93KDEgKyBtb250aGx5UmF0ZSwgLXBheW1lbnRzKSkgLyBtb250aGx5UmF0ZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluZWxpZ2libGVSZXN1bHQoaW5wdXQ6IE1vcnRnYWdlSW5wdXQpOiBNb3J0Z2FnZU91dHB1dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXhNb250aGx5UGF5bWVudDogMCxcbiAgICAgICAgICAgIG1heExvYW5BbW91bnQ6IDAsXG4gICAgICAgICAgICB0b3RhbFByb2plY3RDb3N0OiBpbnB1dC5wcm9wZXJ0eVByaWNlLFxuICAgICAgICAgICAgcmVxdWlyZWRMb2FuQW1vdW50OiBpbnB1dC5wcm9wZXJ0eVByaWNlIC0gaW5wdXQuZG93blBheW1lbnQsXG4gICAgICAgICAgICBsb2FuRHVyYXRpb25ZZWFyczogMCxcbiAgICAgICAgICAgIGRlYnRSYXRpbzogMCxcbiAgICAgICAgICAgIG1vbnRobHlJbnN1cmFuY2VDb3N0OiAwLFxuICAgICAgICAgICAgaXNFbGlnaWJsZTogZmFsc2UsXG4gICAgICAgICAgICBhbW9ydGl6YXRpb25TY2hlZHVsZTogW11cbiAgICAgICAgfTtcbiAgICB9XG59Il19
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb3J0Z2FnZS9mcmFuY2UvRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLHlCQUF5QjtJQUlsQyxZQUFZLEtBQW9CLEVBQUUsS0FBb0I7UUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVM7UUFFTCxJQUNJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYztZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0I7WUFDbkQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUNqQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FDWCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU87WUFDM0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVk7WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBRW5DLE1BQU0saUJBQWlCLEdBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTztZQUM1RixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FB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QUNOLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUN6QyxPQUFPO1lBQ0gsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixhQUFhLEVBQUUsQ0FBQztZQUNoQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNyQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxXQUFXO1lBQzNELGlCQUFpQixFQUFFLENBQUM7WUFDcEIsU0FBUyxFQUFFLENBQUM7WUFDWixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsY0FBYyxFQUFFLENBQUM7WUFDakIsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixTQUFTLEVBQUUsQ0FBQztZQUNaLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLG9CQUFvQixFQUFFLEVBQUU7U0FDM0IsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQXhMRCw4REF3TEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGcmFuY2VNb3J0Z2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBNb3J0Z2FnZVJ1bGVzLCBNb3J0Z2FnZUlucHV0LCBNb3J0Z2FnZU91dHB1dCwgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtIH0gZnJvbSAnLi9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEZyYW5jZU1vcnRnYWdlU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfaW5wdXQ6IE1vcnRnYWdlSW5wdXQ7XG4gICAgcHJpdmF0ZSBfcnVsZXM6IE1vcnRnYWdlUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogTW9ydGdhZ2VJbnB1dCwgcnVsZXM6IE1vcnRnYWdlUnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoKTogTW9ydGdhZ2VPdXRwdXQge1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LmlzRmlyc3RUaW1lQnV5ZXIgJiZcbiAgICAgICAgICAgIHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyICYmXG4gICAgICAgICAgICB0aGlzLl9ydWxlcy5maXJzdFRpbWVCdXllci5yZXF1aXJlc1ByaW1hcnlSZXNpZGVuY2UgJiZcbiAgICAgICAgICAgICF0aGlzLl9pbnB1dC5pc1ByaW1hcnlSZXNpZGVuY2VcbiAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZWxpZ2libGVSZXN1bHQodGhpcy5faW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVidFJhdGlvID1cbiAgICAgICAgICAgIHRoaXMuX2lucHV0LmlzRmlyc3RUaW1lQnV5ZXIgJiYgdGhpcy5fcnVsZXMuZmlyc3RUaW1lQnV5ZXIgJiZ0aGlzLl9ydWxlcy5maXJzdFRpbWVCdXllci5lbmFibGVkXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9ydWxlcy5maXJzdFRpbWVCdXllci5tYXhEZWJ0UmF0aW9cbiAgICAgICAgICAgICAgICA6IHRoaXMuX3J1bGVzLm1heERlYnRSYXRpbztcblxuICAgICAgICBjb25zdCBsb2FuRHVyYXRpb25ZZWFycyA9XG4gICAgICAgICAgICB0aGlzLl9pbnB1dC5pc0ZpcnN0VGltZUJ1eWVyICYmIHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyICYmIHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyLmVuYWJsZWRcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3J1bGVzLmZpcnN0VGltZUJ1eWVyLm1heExvYW5EdXJhdGlvblllYXJzXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9pbnB1dC5pc05ld0J1aWxkXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9ydWxlcy5tYXhMb2FuRHVyYXRpb25OZXdCdWlsZFllYXJzXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9ydWxlcy5tYXhMb2FuRHVyYXRpb25ZZWFycztcblxuICAgICAgICBjb25zdCBtaW5Eb3duUGF5bWVudCA9IHRoaXMuX2lucHV0LnByb3BlcnR5UHJpY2UgKiB0aGlzLl9ydWxlcy5taW5Eb3duUGF5bWVudFJhdGU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lucHV0LmRvd25QYXltZW50IDwgbWluRG93blBheW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZWxpZ2libGVSZXN1bHQodGhpcy5faW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm90YXJ5UmF0ZSA9IHRoaXMuX2lucHV0LmlzTmV3QnVpbGRcbiAgICAgICAgPyB0aGlzLl9ydWxlcy5mZWVzLm5vdGFyeVJhdGVOZXdQcm9wZXJ0eVxuICAgICAgICA6IHRoaXMuX3J1bGVzLmZlZXMubm90YXJ5UmF0ZU9sZFByb3BlcnR5O1xuXG4gICAgICAgIGNvbnN0IG5vdGFyeUZlZXMgPSB0aGlzLl9pbnB1dC5wcm9wZXJ0eVByaWNlICogbm90YXJ5UmF0ZTtcbiAgICAgICAgY29uc3QgYmFua0ZlZXMgPSB0aGlzLl9pbnB1dC5wcm9wZXJ0eVByaWNlICogdGhpcy5fcnVsZXMuZmVlcy5iYW5rRmVlc1JhdGU7XG4gICAgICAgIGNvbnN0IHRvdGFsUHJvamVjdENvc3QgPSB0aGlzLl9pbnB1dC5wcm9wZXJ0eVByaWNlICsgbm90YXJ5RmVlcyArIGJhbmtGZWVzO1xuICAgICAgICBjb25zdCByZXF1aXJlZExvYW5BbW91bnQgPSB0b3RhbFByb2plY3RDb3N0IC0gdGhpcy5faW5wdXQuZG93blBheW1lbnQ7XG4gICAgICAgIGNvbnN0IHN0cmVzc2VkUmF0ZSA9IHRoaXMuX2lucHV0LmFubnVhbEludGVyZXN0UmF0ZSArIHRoaXMuX3J1bGVzLnN0cmVzc1Rlc3QuaW50ZXJlc3RSYXRlQnVmZmVyO1xuXG4gICAgICAgIGNvbnN0IG1vbnRobHlJbnN1cmFuY2VDb3N0ID0gKHJlcXVpcmVkTG9hbkFtb3VudCAqIHRoaXMuX3J1bGVzLmluc3VyYW5jZS5hdmVyYWdlUmF0ZSkgLyAxMjtcblxuICAgICAgICBsZXQgbWF4TW9udGhseVBheW1lbnQgPSB0aGlzLl9pbnB1dC5uZXRNb250aGx5SW5jb21lICogZGVidFJhdGlvO1xuXG4gICAgICAgIGlmICh0aGlzLl9ydWxlcy5pbnN1cmFuY2UuaW5jbHVkZWRJbkRlYnRSYXRpbykge1xuICAgICAgICAgICAgbWF4TW9udGhseVBheW1lbnQgLT0gbW9udGhseUluc3VyYW5jZUNvc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhMb2FuQW1vdW50ID0gdGhpcy5jYWxjdWxhdGVMb2FuQW1vdW50KFxuICAgICAgICAgICAgbWF4TW9udGhseVBheW1lbnQsXG4gICAgICAgICAgICBzdHJlc3NlZFJhdGUsXG4gICAgICAgICAgICBsb2FuRHVyYXRpb25ZZWFyc1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG1vbnRobHlQYXltZW50ID0gdGhpcy5jYWxjdWxhdGVNb250aGx5UGF5bWVudChcbiAgICAgICAgICAgIHJlcXVpcmVkTG9hbkFtb3VudCxcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LmFubnVhbEludGVyZXN0UmF0ZSxcbiAgICAgICAgICAgIGxvYW5EdXJhdGlvblllYXJzXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdG90YWxQYWlkID0gbW9udGhseVBheW1lbnQgKiBsb2FuRHVyYXRpb25ZZWFycyAqIDEyO1xuICAgICAgICBjb25zdCB0b3RhbEludGVyZXN0UGFpZCA9IHRvdGFsUGFpZCAtIHJlcXVpcmVkTG9hbkFtb3VudDtcblxuICAgICAgICBjb25zdCBhbW9ydGl6YXRpb25TY2hlZHVsZSA9IHRoaXMuY2FsY3VsYXRlQW1vcnRpemF0aW9uU2NoZWR1bGUoXG4gICAgICAgICAgICByZXF1aXJlZExvYW5BbW91bnQsXG4gICAgICAgICAgICB0aGlzLl9pbnB1dC5hbm51YWxJbnRlcmVzdFJhdGUsXG4gICAgICAgICAgICBsb2FuRHVyYXRpb25ZZWFycyxcbiAgICAgICAgICAgIG1vbnRobHlQYXltZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvYW5BbW91bnQ6IHJlcXVpcmVkTG9hbkFtb3VudCxcbiAgICAgICAgICAgIHRvdGFsUGFpZCxcbiAgICAgICAgICAgIHRvdGFsSW50ZXJlc3RQYWlkLFxuICAgICAgICAgICAgbW9udGhseVBheW1lbnQsXG4gICAgICAgICAgICByZXF1aXJlZExvYW5BbW91bnQsXG4gICAgICAgICAgICBtYXhNb250aGx5UGF5bWVudCxcbiAgICAgICAgICAgIG1heExvYW5BbW91bnQsXG4gICAgICAgICAgICB0b3RhbFByb2plY3RDb3N0LFxuICAgICAgICAgICAgbG9hbkR1cmF0aW9uWWVhcnMsXG4gICAgICAgICAgICBkZWJ0UmF0aW86IGRlYnRSYXRpbyxcbiAgICAgICAgICAgIG1vbnRobHlJbnN1cmFuY2VDb3N0LFxuICAgICAgICAgICAgaXNFbGlnaWJsZTogbWF4TG9hbkFtb3VudCA+PSByZXF1aXJlZExvYW5BbW91bnQsXG4gICAgICAgICAgICBhbW9ydGl6YXRpb25TY2hlZHVsZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlTW9udGhseVBheW1lbnQocHJpbmNpcGFsOiBudW1iZXIsIGFubnVhbFJhdGU6IG51bWJlciwgeWVhcnM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlSYXRlID0gYW5udWFsUmF0ZSAvIDEwMCAvIDEyO1xuICAgICAgICBjb25zdCBwYXltZW50cyA9IHllYXJzICogMTI7XG5cbiAgICAgICAgaWYgKG1vbnRobHlSYXRlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF5bWVudHMgPT09IDAgPyAwIDogcHJpbmNpcGFsIC8gcGF5bWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcHJpbmNpcGFsICpcbiAgICAgICAgICAgIChtb250aGx5UmF0ZSAvICgxIC0gTWF0aC5wb3coMSArIG1vbnRobHlSYXRlLCAtcGF5bWVudHMpKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFtb3J0aXphdGlvblNjaGVkdWxlKFxuICAgICAgICBsb2FuQW1vdW50OiBudW1iZXIsXG4gICAgICAgIGFubnVhbFJhdGU6IG51bWJlcixcbiAgICAgICAgeWVhcnM6IG51bWJlcixcbiAgICAgICAgbW9udGhseVBheW1lbnQ6IG51bWJlclxuICAgICk6IEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbVtdIHtcbiAgICAgICAgY29uc3QgbW9udGhseVJhdGUgPSBhbm51YWxSYXRlIC8gMTAwIC8gMTI7XG4gICAgICAgIGNvbnN0IHRvdGFsUGF5bWVudHMgPSB5ZWFycyAqIDEyO1xuXG4gICAgICAgIGlmIChtb250aGx5UmF0ZSA9PT0gMCB8fCBsb2FuQW1vdW50IDw9IDAgfHwgbW9udGhseVBheW1lbnQgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZWR1bGU6IEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbVtdID0gW107XG4gICAgICAgIGxldCBiYWxhbmNlID0gbG9hbkFtb3VudDtcblxuICAgICAgICBmb3IgKGxldCB5ZWFyID0gMTsgeWVhciA8PSB5ZWFyczsgeWVhcisrKSB7XG4gICAgICAgICAgICBsZXQgeWVhcmx5UHJpbmNpcGFsID0gMDtcbiAgICAgICAgICAgIGxldCB5ZWFybHlJbnRlcmVzdCA9IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHBheW1lbnRzSW5ZZWFyID0gTWF0aC5taW4oMTIsIHRvdGFsUGF5bWVudHMgLSAoeWVhciAtIDEpICogMTIpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBtb250aCA9IDE7IG1vbnRoIDw9IHBheW1lbnRzSW5ZZWFyOyBtb250aCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJlc3RQYXltZW50ID0gYmFsYW5jZSAqIG1vbnRobHlSYXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByaW5jaXBhbFBheW1lbnQgPSBtb250aGx5UGF5bWVudCAtIGludGVyZXN0UGF5bWVudDtcblxuICAgICAgICAgICAgICAgIHllYXJseUludGVyZXN0ICs9IGludGVyZXN0UGF5bWVudDtcbiAgICAgICAgICAgICAgICB5ZWFybHlQcmluY2lwYWwgKz0gcHJpbmNpcGFsUGF5bWVudDtcbiAgICAgICAgICAgICAgICBiYWxhbmNlIC09IHByaW5jaXBhbFBheW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjaGVkdWxlLnB1c2goe1xuICAgICAgICAgICAgICAgIHllYXIsXG4gICAgICAgICAgICAgICAgcHJpbmNpcGFsOiB5ZWFybHlQcmluY2lwYWwsXG4gICAgICAgICAgICAgICAgaW50ZXJlc3Q6IHllYXJseUludGVyZXN0LFxuICAgICAgICAgICAgICAgIGJhbGFuY2U6IE1hdGgubWF4KDAsIGJhbGFuY2UpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGJhbGFuY2UgPD0gMCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NoZWR1bGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVMb2FuQW1vdW50KG1vbnRobHlQYXltZW50OiBudW1iZXIsIGFubnVhbFJhdGU6IG51bWJlciwgeWVhcnM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlSYXRlID0gYW5udWFsUmF0ZSAvIDEwMCAvIDEyO1xuICAgICAgICBjb25zdCBwYXltZW50cyA9IHllYXJzICogMTI7XG5cbiAgICAgICAgaWYgKG1vbnRobHlSYXRlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9udGhseVBheW1lbnQgKiBwYXltZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBtb250aGx5UGF5bWVudCAqXG4gICAgICAgICAgICAoKDEgLSBNYXRoLnBvdygxICsgbW9udGhseVJhdGUsIC1wYXltZW50cykpIC8gbW9udGhseVJhdGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmVsaWdpYmxlUmVzdWx0KGlucHV0OiBNb3J0Z2FnZUlucHV0KTogTW9ydGdhZ2VPdXRwdXQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF4TW9udGhseVBheW1lbnQ6IDAsXG4gICAgICAgICAgICBtYXhMb2FuQW1vdW50OiAwLFxuICAgICAgICAgICAgdG90YWxQcm9qZWN0Q29zdDogaW5wdXQucHJvcGVydHlQcmljZSxcbiAgICAgICAgICAgIHJlcXVpcmVkTG9hbkFtb3VudDogaW5wdXQucHJvcGVydHlQcmljZSAtIGlucHV0LmRvd25QYXltZW50LFxuICAgICAgICAgICAgbG9hbkR1cmF0aW9uWWVhcnM6IDAsXG4gICAgICAgICAgICBkZWJ0UmF0aW86IDAsXG4gICAgICAgICAgICBtb250aGx5SW5zdXJhbmNlQ29zdDogMCxcbiAgICAgICAgICAgIGxvYW5BbW91bnQ6IDAsXG4gICAgICAgICAgICBtb250aGx5UGF5bWVudDogMCxcbiAgICAgICAgICAgIHRvdGFsSW50ZXJlc3RQYWlkOiAwLFxuICAgICAgICAgICAgdG90YWxQYWlkOiAwLFxuICAgICAgICAgICAgaXNFbGlnaWJsZTogZmFsc2UsXG4gICAgICAgICAgICBhbW9ydGl6YXRpb25TY2hlZHVsZTogW11cbiAgICAgICAgfTtcbiAgICB9XG59Il19
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9ydGdhZ2UvZnJhbmNlL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVJ1bGVzIHtcbiAgICBtYXhEZWJ0UmF0aW86IG51bWJlcjtcbiAgICBtYXhMb2FuRHVyYXRpb25ZZWFyczogbnVtYmVyO1xuICAgIG1heExvYW5EdXJhdGlvbk5ld0J1aWxkWWVhcnM6IG51bWJlcjtcbiAgICBtaW5Eb3duUGF5bWVudFJhdGU6IG51bWJlcjtcblxuICAgIGZpcnN0VGltZUJ1eWVyPzogRmlyc3RUaW1lQnV5ZXJSdWxlcztcblxuICAgIGluc3VyYW5jZTogTW9ydGdhZ2VJbnN1cmFuY2VSdWxlcztcbiAgICBmZWVzOiBNb3J0Z2FnZUZlZXNSdWxlcztcbiAgICBzdHJlc3NUZXN0OiBTdHJlc3NUZXN0UnVsZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlyc3RUaW1lQnV5ZXJSdWxlcyB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBtYXhEZWJ0UmF0aW86IG51bWJlcjtcbiAgICBtYXhMb2FuRHVyYXRpb25ZZWFyczogbnVtYmVyO1xuICAgIHF1b3RhRGlzY2xhaW1lcjogc3RyaW5nO1xuICAgIHJlcXVpcmVzUHJpbWFyeVJlc2lkZW5jZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUluc3VyYW5jZVJ1bGVzIHtcbiAgICBhdmVyYWdlUmF0ZTogbnVtYmVyO1xuICAgIGluY2x1ZGVkSW5EZWJ0UmF0aW86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VGZWVzUnVsZXMge1xuICBub3RhcnlSYXRlT2xkUHJvcGVydHk6IG51bWJlcjtcbiAgbm90YXJ5UmF0ZU5ld1Byb3BlcnR5OiBudW1iZXI7XG4gIGJhbmtGZWVzUmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVzc1Rlc3RSdWxlcyB7XG4gICAgaW50ZXJlc3RSYXRlQnVmZmVyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtIHtcbiAgICB5ZWFyOiBudW1iZXI7XG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgaW50ZXJlc3Q6IG51bWJlcjtcbiAgICBiYWxhbmNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnB1dCB7XG4gICAgcHJvcGVydHlQcmljZTogbnVtYmVyO1xuICAgIGRvd25QYXltZW50OiBudW1iZXI7XG4gICAgbmV0TW9udGhseUluY29tZTogbnVtYmVyO1xuICAgIGxvYW5EdXJhdGlvblllYXJzOiBudW1iZXI7XG4gICAgYW5udWFsSW50ZXJlc3RSYXRlOiBudW1iZXI7XG4gICAgaXNQcmltYXJ5UmVzaWRlbmNlOiBib29sZWFuO1xuICAgIGlzRmlyc3RUaW1lQnV5ZXI6IGJvb2xlYW47XG4gICAgaXNOZXdCdWlsZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZU91dHB1dCB7XG4gICAgbWF4TW9udGhseVBheW1lbnQ6IG51bWJlcjtcbiAgICBtYXhMb2FuQW1vdW50OiBudW1iZXI7XG4gICAgbG9hbkR1cmF0aW9uWWVhcnM6IG51bWJlcjtcbiAgICBkZWJ0UmF0aW86IG51bWJlcjtcbiAgICB0b3RhbFByb2plY3RDb3N0OiBudW1iZXI7XG4gICAgcmVxdWlyZWRMb2FuQW1vdW50OiBudW1iZXI7XG4gICAgbW9udGhseUluc3VyYW5jZUNvc3Q6IG51bWJlcjtcbiAgICBpc0VsaWdpYmxlOiBib29sZWFuO1xuICAgIGFtb3J0aXphdGlvblNjaGVkdWxlOiBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1bXTtcbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9ydGdhZ2UvZnJhbmNlL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVJ1bGVzIHtcbiAgICBtYXhEZWJ0UmF0aW86IG51bWJlcjtcbiAgICBtYXhMb2FuRHVyYXRpb25ZZWFyczogbnVtYmVyO1xuICAgIG1heExvYW5EdXJhdGlvbk5ld0J1aWxkWWVhcnM6IG51bWJlcjtcbiAgICBtaW5Eb3duUGF5bWVudFJhdGU6IG51bWJlcjtcblxuICAgIGZpcnN0VGltZUJ1eWVyPzogRmlyc3RUaW1lQnV5ZXJSdWxlcztcblxuICAgIGluc3VyYW5jZTogTW9ydGdhZ2VJbnN1cmFuY2VSdWxlcztcbiAgICBmZWVzOiBNb3J0Z2FnZUZlZXNSdWxlcztcbiAgICBzdHJlc3NUZXN0OiBTdHJlc3NUZXN0UnVsZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlyc3RUaW1lQnV5ZXJSdWxlcyB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBtYXhEZWJ0UmF0aW86IG51bWJlcjtcbiAgICBtYXhMb2FuRHVyYXRpb25ZZWFyczogbnVtYmVyO1xuICAgIHF1b3RhRGlzY2xhaW1lcjogc3RyaW5nO1xuICAgIHJlcXVpcmVzUHJpbWFyeVJlc2lkZW5jZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUluc3VyYW5jZVJ1bGVzIHtcbiAgICBhdmVyYWdlUmF0ZTogbnVtYmVyO1xuICAgIGluY2x1ZGVkSW5EZWJ0UmF0aW86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VGZWVzUnVsZXMge1xuICBub3RhcnlSYXRlT2xkUHJvcGVydHk6IG51bWJlcjtcbiAgbm90YXJ5UmF0ZU5ld1Byb3BlcnR5OiBudW1iZXI7XG4gIGJhbmtGZWVzUmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVzc1Rlc3RSdWxlcyB7XG4gICAgaW50ZXJlc3RSYXRlQnVmZmVyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtIHtcbiAgICB5ZWFyOiBudW1iZXI7XG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgaW50ZXJlc3Q6IG51bWJlcjtcbiAgICBiYWxhbmNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnB1dCB7XG4gICAgcHJvcGVydHlQcmljZTogbnVtYmVyO1xuICAgIGRvd25QYXltZW50OiBudW1iZXI7XG4gICAgbmV0TW9udGhseUluY29tZTogbnVtYmVyO1xuICAgIGxvYW5EdXJhdGlvblllYXJzOiBudW1iZXI7XG4gICAgYW5udWFsSW50ZXJlc3RSYXRlOiBudW1iZXI7XG4gICAgaXNQcmltYXJ5UmVzaWRlbmNlOiBib29sZWFuO1xuICAgIGlzRmlyc3RUaW1lQnV5ZXI6IGJvb2xlYW47XG4gICAgaXNOZXdCdWlsZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZU91dHB1dCB7XG4gICAgbG9hbkFtb3VudDogbnVtYmVyO1xuICAgIHRvdGFsUGFpZDogbnVtYmVyO1xuICAgIG1vbnRobHlQYXltZW50OiBudW1iZXI7XG4gICAgdG90YWxJbnRlcmVzdFBhaWQ6IG51bWJlcjtcbiAgICBtYXhNb250aGx5UGF5bWVudDogbnVtYmVyO1xuICAgIG1heExvYW5BbW91bnQ6IG51bWJlcjtcbiAgICBsb2FuRHVyYXRpb25ZZWFyczogbnVtYmVyO1xuICAgIGRlYnRSYXRpbzogbnVtYmVyO1xuICAgIHRvdGFsUHJvamVjdENvc3Q6IG51bWJlcjtcbiAgICByZXF1aXJlZExvYW5BbW91bnQ6IG51bWJlcjtcbiAgICBtb250aGx5SW5zdXJhbmNlQ29zdDogbnVtYmVyO1xuICAgIGlzRWxpZ2libGU6IGJvb2xlYW47XG4gICAgYW1vcnRpemF0aW9uU2NoZWR1bGU6IEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbVtdO1xufVxuIl19
@@ -5,6 +5,7 @@ export declare class FranceMortgageServiceImpl implements FranceMortgageService
5
5
  private _rules;
6
6
  constructor(input: MortgageInput, rules: MortgageRules);
7
7
  calculate(): MortgageOutput;
8
+ private calculateMonthlyPayment;
8
9
  private calculateAmortizationSchedule;
9
10
  private calculateLoanAmount;
10
11
  private ineligibleResult;
@@ -44,6 +44,10 @@ export interface MortgageInput {
44
44
  isNewBuild: boolean;
45
45
  }
46
46
  export interface MortgageOutput {
47
+ loanAmount: number;
48
+ totalPaid: number;
49
+ monthlyPayment: number;
50
+ totalInterestPaid: number;
47
51
  maxMonthlyPayment: number;
48
52
  maxLoanAmount: number;
49
53
  loanDurationYears: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novha/calc-engines",
3
- "version": "1.6.2",
3
+ "version": "1.6.3",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "scripts": {
@@ -63,17 +63,31 @@ export class FranceMortgageServiceImpl implements FranceMortgageService {
63
63
  loanDurationYears
64
64
  );
65
65
 
66
- const amortizationSchedule = this.calculateAmortizationSchedule(
66
+ const monthlyPayment = this.calculateMonthlyPayment(
67
67
  requiredLoanAmount,
68
68
  this._input.annualInterestRate,
69
69
  loanDurationYears
70
70
  );
71
71
 
72
+ const totalPaid = monthlyPayment * loanDurationYears * 12;
73
+ const totalInterestPaid = totalPaid - requiredLoanAmount;
74
+
75
+ const amortizationSchedule = this.calculateAmortizationSchedule(
76
+ requiredLoanAmount,
77
+ this._input.annualInterestRate,
78
+ loanDurationYears,
79
+ monthlyPayment
80
+ );
81
+
72
82
  return {
83
+ loanAmount: requiredLoanAmount,
84
+ totalPaid,
85
+ totalInterestPaid,
86
+ monthlyPayment,
87
+ requiredLoanAmount,
73
88
  maxMonthlyPayment,
74
89
  maxLoanAmount,
75
90
  totalProjectCost,
76
- requiredLoanAmount,
77
91
  loanDurationYears,
78
92
  debtRatio: debtRatio,
79
93
  monthlyInsuranceCost,
@@ -82,22 +96,33 @@ export class FranceMortgageServiceImpl implements FranceMortgageService {
82
96
  };
83
97
  }
84
98
 
99
+ private calculateMonthlyPayment(principal: number, annualRate: number, years: number): number {
100
+ const monthlyRate = annualRate / 100 / 12;
101
+ const payments = years * 12;
102
+
103
+ if (monthlyRate === 0) {
104
+ return payments === 0 ? 0 : principal / payments;
105
+ }
106
+
107
+ return (
108
+ principal *
109
+ (monthlyRate / (1 - Math.pow(1 + monthlyRate, -payments)))
110
+ );
111
+ }
112
+
85
113
  private calculateAmortizationSchedule(
86
114
  loanAmount: number,
87
115
  annualRate: number,
88
- years: number
116
+ years: number,
117
+ monthlyPayment: number
89
118
  ): AmortizationScheduleItem[] {
90
119
  const monthlyRate = annualRate / 100 / 12;
91
120
  const totalPayments = years * 12;
92
121
 
93
- if (monthlyRate === 0 || loanAmount <= 0) {
122
+ if (monthlyRate === 0 || loanAmount <= 0 || monthlyPayment <= 0) {
94
123
  return [];
95
124
  }
96
125
 
97
- const monthlyPayment =
98
- (loanAmount * monthlyRate) /
99
- (1 - Math.pow(1 + monthlyRate, -totalPayments));
100
-
101
126
  const schedule: AmortizationScheduleItem[] = [];
102
127
  let balance = loanAmount;
103
128
 
@@ -152,6 +177,10 @@ export class FranceMortgageServiceImpl implements FranceMortgageService {
152
177
  loanDurationYears: 0,
153
178
  debtRatio: 0,
154
179
  monthlyInsuranceCost: 0,
180
+ loanAmount: 0,
181
+ monthlyPayment: 0,
182
+ totalInterestPaid: 0,
183
+ totalPaid: 0,
155
184
  isEligible: false,
156
185
  amortizationSchedule: []
157
186
  };
@@ -53,6 +53,10 @@ export interface MortgageInput {
53
53
  }
54
54
 
55
55
  export interface MortgageOutput {
56
+ loanAmount: number;
57
+ totalPaid: number;
58
+ monthlyPayment: number;
59
+ totalInterestPaid: number;
56
60
  maxMonthlyPayment: number;
57
61
  maxLoanAmount: number;
58
62
  loanDurationYears: number;