@novha/calc-engines 4.0.0 → 6.0.0

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.
Files changed (98) hide show
  1. package/dist/capital-gains/australia/AustraliaCapitalGainsService.js +3 -0
  2. package/dist/capital-gains/australia/AustraliaCapitalGainsServiceImpl.js +67 -0
  3. package/dist/capital-gains/australia/domain/types.js +3 -0
  4. package/dist/capital-gains/canada/CanadaCapitalGainsService.js +3 -0
  5. package/dist/capital-gains/canada/CanadaCapitalGainsServiceImpl.js +66 -0
  6. package/dist/capital-gains/canada/domain/types.js +3 -0
  7. package/dist/capital-gains/domain/types.js +3 -0
  8. package/dist/capital-gains/france/FranceCapitalGainsService.js +3 -0
  9. package/dist/capital-gains/france/FranceCapitalGainsServiceImpl.js +51 -0
  10. package/dist/capital-gains/france/domain/types.js +3 -0
  11. package/dist/capital-gains/germany/GermanyCapitalGainsService.js +3 -0
  12. package/dist/capital-gains/germany/GermanyCapitalGainsServiceImpl.js +68 -0
  13. package/dist/capital-gains/germany/domain/types.js +3 -0
  14. package/dist/capital-gains/index.js +25 -0
  15. package/dist/capital-gains/south-africa/SouthAfricaCapitalGainsService.js +3 -0
  16. package/dist/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.js +83 -0
  17. package/dist/capital-gains/south-africa/domain/types.js +3 -0
  18. package/dist/capital-gains/uk/UKCapitalGainsService.js +3 -0
  19. package/dist/capital-gains/uk/UKCapitalGainsServiceImpl.js +86 -0
  20. package/dist/capital-gains/uk/domain/types.js +3 -0
  21. package/dist/capital-gains/usa/USACapitalGainsService.js +3 -0
  22. package/dist/capital-gains/usa/USACapitalGainsServiceImpl.js +77 -0
  23. package/dist/capital-gains/usa/domain/types.js +3 -0
  24. package/dist/corporate/index.js +18 -0
  25. package/dist/income-tax/index.js +24 -0
  26. package/dist/index.js +18 -51
  27. package/dist/mortgage/france/FranceMortgageService.js +1 -1
  28. package/dist/mortgage/france/FranceMortgageServiceImpl.js +1 -1
  29. package/dist/mortgage/index.js +25 -0
  30. package/dist/shared/domain/types.js +2 -1
  31. package/dist/types/capital-gains/australia/AustraliaCapitalGainsService.d.ts +4 -0
  32. package/dist/types/capital-gains/australia/AustraliaCapitalGainsServiceImpl.d.ts +10 -0
  33. package/dist/types/capital-gains/australia/domain/types.d.ts +15 -0
  34. package/dist/types/capital-gains/canada/CanadaCapitalGainsService.d.ts +4 -0
  35. package/dist/types/capital-gains/canada/CanadaCapitalGainsServiceImpl.d.ts +10 -0
  36. package/dist/types/capital-gains/canada/domain/types.d.ts +13 -0
  37. package/dist/types/capital-gains/domain/types.d.ts +15 -0
  38. package/dist/types/capital-gains/france/FranceCapitalGainsService.d.ts +4 -0
  39. package/dist/types/capital-gains/france/FranceCapitalGainsServiceImpl.d.ts +9 -0
  40. package/dist/types/capital-gains/france/domain/types.d.ts +7 -0
  41. package/dist/types/capital-gains/germany/GermanyCapitalGainsService.d.ts +4 -0
  42. package/dist/types/capital-gains/germany/GermanyCapitalGainsServiceImpl.d.ts +9 -0
  43. package/dist/types/capital-gains/germany/domain/types.d.ts +8 -0
  44. package/dist/types/capital-gains/index.d.ts +15 -0
  45. package/dist/types/capital-gains/south-africa/SouthAfricaCapitalGainsService.d.ts +4 -0
  46. package/dist/types/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.d.ts +10 -0
  47. package/dist/types/capital-gains/south-africa/domain/types.d.ts +14 -0
  48. package/dist/types/capital-gains/uk/UKCapitalGainsService.d.ts +4 -0
  49. package/dist/types/capital-gains/uk/UKCapitalGainsServiceImpl.d.ts +9 -0
  50. package/dist/types/capital-gains/uk/domain/types.d.ts +10 -0
  51. package/dist/types/capital-gains/usa/USACapitalGainsService.d.ts +4 -0
  52. package/dist/types/capital-gains/usa/USACapitalGainsServiceImpl.d.ts +10 -0
  53. package/dist/types/capital-gains/usa/domain/types.d.ts +26 -0
  54. package/dist/types/corporate/index.d.ts +15 -0
  55. package/dist/types/income-tax/index.d.ts +15 -0
  56. package/dist/types/index.d.ts +4 -42
  57. package/dist/types/mortgage/france/FranceMortgageService.d.ts +1 -1
  58. package/dist/types/mortgage/france/FranceMortgageServiceImpl.d.ts +1 -1
  59. package/dist/types/mortgage/index.d.ts +15 -0
  60. package/dist/types/shared/domain/types.d.ts +2 -1
  61. package/package.json +1 -1
  62. package/src/capital-gains/australia/AustraliaCapitalGainsService.ts +5 -0
  63. package/src/capital-gains/australia/AustraliaCapitalGainsServiceImpl.ts +84 -0
  64. package/src/capital-gains/australia/domain/types.ts +17 -0
  65. package/src/capital-gains/canada/CanadaCapitalGainsService.ts +5 -0
  66. package/src/capital-gains/canada/CanadaCapitalGainsServiceImpl.ts +82 -0
  67. package/src/capital-gains/canada/domain/types.ts +15 -0
  68. package/src/capital-gains/domain/types.ts +15 -0
  69. package/src/capital-gains/france/FranceCapitalGainsService.ts +5 -0
  70. package/src/capital-gains/france/FranceCapitalGainsServiceImpl.ts +58 -0
  71. package/src/capital-gains/france/domain/types.ts +8 -0
  72. package/src/capital-gains/germany/GermanyCapitalGainsService.ts +5 -0
  73. package/src/capital-gains/germany/GermanyCapitalGainsServiceImpl.ts +77 -0
  74. package/src/capital-gains/germany/domain/types.ts +10 -0
  75. package/src/capital-gains/index.ts +72 -0
  76. package/src/capital-gains/south-africa/SouthAfricaCapitalGainsService.ts +5 -0
  77. package/src/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.ts +101 -0
  78. package/src/capital-gains/south-africa/domain/types.ts +16 -0
  79. package/src/capital-gains/uk/UKCapitalGainsService.ts +5 -0
  80. package/src/capital-gains/uk/UKCapitalGainsServiceImpl.ts +98 -0
  81. package/src/capital-gains/uk/domain/types.ts +11 -0
  82. package/src/capital-gains/usa/USACapitalGainsService.ts +5 -0
  83. package/src/capital-gains/usa/USACapitalGainsServiceImpl.ts +96 -0
  84. package/src/capital-gains/usa/domain/types.ts +27 -0
  85. package/src/corporate/index.ts +79 -0
  86. package/src/income-tax/index.ts +72 -0
  87. package/src/index.ts +6 -146
  88. package/src/mortgage/france/FranceMortgageService.ts +1 -1
  89. package/src/mortgage/france/FranceMortgageServiceImpl.ts +1 -1
  90. package/src/mortgage/index.ts +87 -0
  91. package/src/shared/domain/types.ts +1 -0
  92. package/test/australia-capital-gains.test.ts +80 -0
  93. package/test/canada-capital-gains.test.ts +71 -0
  94. package/test/france-capital-gains.test.ts +66 -0
  95. package/test/germany-capital-gains.test.ts +85 -0
  96. package/test/south-africa-capital-gains.test.ts +84 -0
  97. package/test/uk-capital-gains.test.ts +79 -0
  98. package/test/usa-capital-gains.test.ts +88 -0
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhQ2FwaXRhbEdhaW5zU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXBpdGFsLWdhaW5zL2F1c3RyYWxpYS9BdXN0cmFsaWFDYXBpdGFsR2FpbnNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVzdHJhbGlhQ2FwaXRhbEdhaW5zU2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AustraliaCapitalGainsServiceImpl = void 0;
4
+ class AustraliaCapitalGainsServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const gain = this._input.capitalGain;
11
+ if (gain <= 0) {
12
+ return {
13
+ taxableGain: 0,
14
+ capitalGainTax: 0,
15
+ socialContributions: 0,
16
+ totalTax: 0,
17
+ effectiveRate: 0,
18
+ netInvestmentIncomeTax: 0,
19
+ breakdowns: []
20
+ };
21
+ }
22
+ const eligible = this._input.holdingPeriodMonths >= this._rules.cgtDiscountMinMonths;
23
+ const taxableGain = eligible ? gain * (1 - this._rules.cgtDiscount) : gain;
24
+ const otherIncome = this._input.totalTaxableIncome - gain;
25
+ const { tax, breakdowns } = this.applyBrackets(taxableGain, otherIncome, this._rules.taxBrackets);
26
+ return {
27
+ taxableGain,
28
+ capitalGainTax: tax,
29
+ socialContributions: 0,
30
+ netInvestmentIncomeTax: 0,
31
+ totalTax: tax,
32
+ effectiveRate: gain > 0 ? (tax / gain) * 100 : 0,
33
+ breakdowns,
34
+ };
35
+ }
36
+ applyBrackets(taxableGain, otherIncome, brackets) {
37
+ let tax = 0;
38
+ const breakdowns = [];
39
+ let remaining = taxableGain;
40
+ let incomeUsed = otherIncome;
41
+ for (const bracket of brackets) {
42
+ if (remaining <= 0)
43
+ break;
44
+ const upper = bracket.to ?? Infinity;
45
+ if (incomeUsed >= upper)
46
+ continue;
47
+ const bracketStart = Math.max(bracket.from, incomeUsed);
48
+ const bracketSpace = upper - bracketStart;
49
+ const taxable = Math.min(bracketSpace, remaining);
50
+ if (taxable > 0) {
51
+ const bracketTax = taxable * bracket.rate;
52
+ tax += bracketTax;
53
+ remaining -= taxable;
54
+ incomeUsed += taxable;
55
+ breakdowns.push({
56
+ from: `${bracket.from}`,
57
+ to: `${bracket.to ?? 'Above'}`,
58
+ rate: bracket.rate,
59
+ amount: bracketTax,
60
+ });
61
+ }
62
+ }
63
+ return { tax, breakdowns };
64
+ }
65
+ }
66
+ exports.AustraliaCapitalGainsServiceImpl = AustraliaCapitalGainsServiceImpl;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhQ2FwaXRhbEdhaW5zU2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9hdXN0cmFsaWEvQXVzdHJhbGlhQ2FwaXRhbEdhaW5zU2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSxnQ0FBZ0M7SUFJekMsWUFBWSxLQUFZLEVBQUUsS0FBWTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRXJDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTztnQkFDSCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxjQUFjLEVBQUUsQ0FBQztnQkFDakIsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxFQUFFO2FBQ2pCLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1FBQ3JGLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUMxRCxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWxHLE9BQU87WUFDSCxXQUFXO1lBQ1gsY0FBYyxFQUFFLEdBQUc7WUFDbkIsbUJBQW1CLEVBQUUsQ0FBQztZQUN0QixzQkFBc0IsRUFBRSxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxHQUFHO1lBQ2IsYUFBYSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxVQUFVO1NBQ2IsQ0FBQztJQUNOLENBQUM7SUFFTyxhQUFhLENBQ2pCLFdBQW1CLEVBQ25CLFdBQW1CLEVBQ25CLFFBQXNCO1FBRXRCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLE1BQU0sVUFBVSxHQUFnQixFQUFFLENBQUM7UUFDbkMsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzVCLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUU3QixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksU0FBUyxJQUFJLENBQUM7Z0JBQUUsTUFBTTtZQUUxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQztZQUVyQyxJQUFJLFVBQVUsSUFBSSxLQUFLO2dCQUFFLFNBQVM7WUFFbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sWUFBWSxHQUFHLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFbEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzFDLEdBQUcsSUFBSSxVQUFVLENBQUM7Z0JBQ2xCLFNBQVMsSUFBSSxPQUFPLENBQUM7Z0JBQ3JCLFVBQVUsSUFBSSxPQUFPLENBQUM7Z0JBRXRCLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ1osSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRTtvQkFDdkIsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUU7b0JBQzlCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtvQkFDbEIsTUFBTSxFQUFFLFVBQVU7aUJBQ3JCLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0o7QUEvRUQsNEVBK0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtkb3duLCBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5pbXBvcnQgeyBBdXN0cmFsaWFDYXBpdGFsR2FpbnNTZXJ2aWNlIH0gZnJvbSBcIi4vQXVzdHJhbGlhQ2FwaXRhbEdhaW5zU2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXQsIFJ1bGVzLCBUYXhCcmFja2V0IH0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBBdXN0cmFsaWFDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEF1c3RyYWxpYUNhcGl0YWxHYWluc1NlcnZpY2Uge1xuICAgIHByaXZhdGUgX2lucHV0OiBJbnB1dDtcbiAgICBwcml2YXRlIF9ydWxlczogUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogSW5wdXQsIHJ1bGVzOiBSdWxlcykge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQge1xuICAgICAgICBjb25zdCBnYWluID0gdGhpcy5faW5wdXQuY2FwaXRhbEdhaW47XG5cbiAgICAgICAgaWYgKGdhaW4gPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICAgICAgdGF4YWJsZUdhaW46IDAsXG4gICAgICAgICAgICAgICAgY2FwaXRhbEdhaW5UYXg6IDAsXG4gICAgICAgICAgICAgICAgc29jaWFsQ29udHJpYnV0aW9uczogMCwgXG4gICAgICAgICAgICAgICAgdG90YWxUYXg6IDAsXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlUmF0ZTogMCxcbiAgICAgICAgICAgICAgICBuZXRJbnZlc3RtZW50SW5jb21lVGF4OiAwLFxuICAgICAgICAgICAgICAgIGJyZWFrZG93bnM6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSB0aGlzLl9pbnB1dC5ob2xkaW5nUGVyaW9kTW9udGhzID49IHRoaXMuX3J1bGVzLmNndERpc2NvdW50TWluTW9udGhzO1xuICAgICAgICBjb25zdCB0YXhhYmxlR2FpbiA9IGVsaWdpYmxlID8gZ2FpbiAqICgxIC0gdGhpcy5fcnVsZXMuY2d0RGlzY291bnQpIDogZ2FpbjtcblxuICAgICAgICBjb25zdCBvdGhlckluY29tZSA9IHRoaXMuX2lucHV0LnRvdGFsVGF4YWJsZUluY29tZSAtIGdhaW47XG4gICAgICAgIGNvbnN0IHsgdGF4LCBicmVha2Rvd25zIH0gPSB0aGlzLmFwcGx5QnJhY2tldHModGF4YWJsZUdhaW4sIG90aGVySW5jb21lLCB0aGlzLl9ydWxlcy50YXhCcmFja2V0cyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRheGFibGVHYWluLFxuICAgICAgICAgICAgY2FwaXRhbEdhaW5UYXg6IHRheCxcbiAgICAgICAgICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IDAsXG4gICAgICAgICAgICBuZXRJbnZlc3RtZW50SW5jb21lVGF4OiAwLFxuICAgICAgICAgICAgdG90YWxUYXg6IHRheCxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJhdGU6IGdhaW4gPiAwID8gKHRheCAvIGdhaW4pICogMTAwIDogMCxcbiAgICAgICAgICAgIGJyZWFrZG93bnMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseUJyYWNrZXRzKFxuICAgICAgICB0YXhhYmxlR2FpbjogbnVtYmVyLFxuICAgICAgICBvdGhlckluY29tZTogbnVtYmVyLFxuICAgICAgICBicmFja2V0czogVGF4QnJhY2tldFtdLFxuICAgICk6IHsgdGF4OiBudW1iZXI7IGJyZWFrZG93bnM6IEJyZWFrZG93bltdIH0ge1xuICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgY29uc3QgYnJlYWtkb3duczogQnJlYWtkb3duW10gPSBbXTtcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IHRheGFibGVHYWluO1xuICAgICAgICBsZXQgaW5jb21lVXNlZCA9IG90aGVySW5jb21lO1xuXG4gICAgICAgIGZvciAoY29uc3QgYnJhY2tldCBvZiBicmFja2V0cykge1xuICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IEluZmluaXR5O1xuXG4gICAgICAgICAgICBpZiAoaW5jb21lVXNlZCA+PSB1cHBlcikgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRTdGFydCA9IE1hdGgubWF4KGJyYWNrZXQuZnJvbSwgaW5jb21lVXNlZCk7XG4gICAgICAgICAgICBjb25zdCBicmFja2V0U3BhY2UgPSB1cHBlciAtIGJyYWNrZXRTdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHRheGFibGUgPSBNYXRoLm1pbihicmFja2V0U3BhY2UsIHJlbWFpbmluZyk7XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRUYXggPSB0YXhhYmxlICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSBicmFja2V0VGF4O1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSB0YXhhYmxlO1xuICAgICAgICAgICAgICAgIGluY29tZVVzZWQgKz0gdGF4YWJsZTtcblxuICAgICAgICAgICAgICAgIGJyZWFrZG93bnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZyb206IGAke2JyYWNrZXQuZnJvbX1gLFxuICAgICAgICAgICAgICAgICAgICB0bzogYCR7YnJhY2tldC50byA/PyAnQWJvdmUnfWAsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBicmFja2V0VGF4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdGF4LCBicmVha2Rvd25zIH07XG4gICAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9hdXN0cmFsaWEvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFRheEJyYWNrZXQge1xuICAgIGZyb206IG51bWJlcjtcbiAgICB0bzogbnVtYmVyIHwgbnVsbDtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICAgIGNndERpc2NvdW50OiBudW1iZXI7XG4gICAgY2d0RGlzY291bnRNaW5Nb250aHM6IG51bWJlcjtcbiAgICB0YXhCcmFja2V0czogVGF4QnJhY2tldFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElucHV0IHtcbiAgICBjYXBpdGFsR2FpbjogbnVtYmVyO1xuICAgIHRvdGFsVGF4YWJsZUluY29tZTogbnVtYmVyO1xuICAgIGhvbGRpbmdQZXJpb2RNb250aHM6IG51bWJlcjtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhQ2FwaXRhbEdhaW5zU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXBpdGFsLWdhaW5zL2NhbmFkYS9DYW5hZGFDYXBpdGFsR2FpbnNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuYWRhQ2FwaXRhbEdhaW5zU2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CanadaCapitalGainsServiceImpl = void 0;
4
+ class CanadaCapitalGainsServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const gain = this._input.capitalGain;
11
+ if (gain <= 0) {
12
+ return {
13
+ taxableGain: 0,
14
+ capitalGainTax: 0,
15
+ socialContributions: 0,
16
+ netInvestmentIncomeTax: 0,
17
+ totalTax: 0,
18
+ effectiveRate: 0,
19
+ breakdowns: []
20
+ };
21
+ }
22
+ const taxableGain = gain * this._rules.inclusionRate;
23
+ const otherIncome = this._input.totalTaxableIncome - gain;
24
+ const { tax, breakdowns } = this.applyBrackets(taxableGain, otherIncome, this._rules.taxBrackets);
25
+ return {
26
+ taxableGain,
27
+ capitalGainTax: tax,
28
+ socialContributions: 0,
29
+ netInvestmentIncomeTax: 0,
30
+ totalTax: tax,
31
+ effectiveRate: gain > 0 ? (tax / gain) * 100 : 0,
32
+ breakdowns,
33
+ };
34
+ }
35
+ applyBrackets(taxableGain, otherIncome, brackets) {
36
+ let tax = 0;
37
+ const breakdowns = [];
38
+ let remaining = taxableGain;
39
+ let incomeUsed = otherIncome;
40
+ for (const bracket of brackets) {
41
+ if (remaining <= 0)
42
+ break;
43
+ const upper = bracket.to ?? Infinity;
44
+ if (incomeUsed >= upper)
45
+ continue;
46
+ const bracketStart = Math.max(bracket.from, incomeUsed);
47
+ const bracketSpace = upper - bracketStart;
48
+ const taxable = Math.min(bracketSpace, remaining);
49
+ if (taxable > 0) {
50
+ const bracketTax = taxable * bracket.rate;
51
+ tax += bracketTax;
52
+ remaining -= taxable;
53
+ incomeUsed += taxable;
54
+ breakdowns.push({
55
+ from: `${bracket.from}`,
56
+ to: `${bracket.to ?? 'Above'}`,
57
+ rate: bracket.rate,
58
+ amount: bracketTax,
59
+ });
60
+ }
61
+ }
62
+ return { tax, breakdowns };
63
+ }
64
+ }
65
+ exports.CanadaCapitalGainsServiceImpl = CanadaCapitalGainsServiceImpl;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhQ2FwaXRhbEdhaW5zU2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9jYW5hZGEvQ2FuYWRhQ2FwaXRhbEdhaW5zU2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSw2QkFBNkI7SUFJdEMsWUFBWSxLQUFZLEVBQUUsS0FBWTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRXJDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTztnQkFDSCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxjQUFjLEVBQUUsQ0FBQztnQkFDakIsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLFVBQVUsRUFBRSxFQUFFO2FBQ2pCLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQzFELE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEcsT0FBTztZQUNILFdBQVc7WUFDWCxjQUFjLEVBQUUsR0FBRztZQUNuQixtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLHNCQUFzQixFQUFFLENBQUM7WUFDekIsUUFBUSxFQUFFLEdBQUc7WUFDYixhQUFhLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELFVBQVU7U0FDYixDQUFDO0lBQ04sQ0FBQztJQUVPLGFBQWEsQ0FDakIsV0FBbUIsRUFDbkIsV0FBbUIsRUFDbkIsUUFBc0I7UUFFdEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osTUFBTSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFDNUIsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBRTdCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxTQUFTLElBQUksQ0FBQztnQkFBRSxNQUFNO1lBRTFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDO1lBRXJDLElBQUksVUFBVSxJQUFJLEtBQUs7Z0JBQUUsU0FBUztZQUVsQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEQsTUFBTSxZQUFZLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVsRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDZCxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDMUMsR0FBRyxJQUFJLFVBQVUsQ0FBQztnQkFDbEIsU0FBUyxJQUFJLE9BQU8sQ0FBQztnQkFDckIsVUFBVSxJQUFJLE9BQU8sQ0FBQztnQkFFdEIsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDWixJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFO29CQUN2QixFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLE9BQU8sRUFBRTtvQkFDOUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixNQUFNLEVBQUUsVUFBVTtpQkFDckIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDSjtBQTdFRCxzRUE2RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha2Rvd24sIFJlc3VsdCB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IENhbmFkYUNhcGl0YWxHYWluc1NlcnZpY2UgfSBmcm9tIFwiLi9DYW5hZGFDYXBpdGFsR2FpbnNTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJbnB1dCwgUnVsZXMsIFRheEJyYWNrZXQgfSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIENhbmFkYUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsIGltcGxlbWVudHMgQ2FuYWRhQ2FwaXRhbEdhaW5zU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfaW5wdXQ6IElucHV0O1xuICAgIHByaXZhdGUgX3J1bGVzOiBSdWxlcztcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0OiBJbnB1dCwgcnVsZXM6IFJ1bGVzKSB7XG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuX3J1bGVzID0gcnVsZXM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGdhaW4gPSB0aGlzLl9pbnB1dC5jYXBpdGFsR2FpbjtcblxuICAgICAgICBpZiAoZ2FpbiA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRheGFibGVHYWluOiAwLFxuICAgICAgICAgICAgICAgIGNhcGl0YWxHYWluVGF4OiAwLFxuICAgICAgICAgICAgICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IDAsXG4gICAgICAgICAgICAgICAgbmV0SW52ZXN0bWVudEluY29tZVRheDogMCxcbiAgICAgICAgICAgICAgICB0b3RhbFRheDogMCxcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVSYXRlOiAwLFxuICAgICAgICAgICAgICAgIGJyZWFrZG93bnM6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGF4YWJsZUdhaW4gPSBnYWluICogdGhpcy5fcnVsZXMuaW5jbHVzaW9uUmF0ZTtcbiAgICAgICAgY29uc3Qgb3RoZXJJbmNvbWUgPSB0aGlzLl9pbnB1dC50b3RhbFRheGFibGVJbmNvbWUgLSBnYWluO1xuICAgICAgICBjb25zdCB7IHRheCwgYnJlYWtkb3ducyB9ID0gdGhpcy5hcHBseUJyYWNrZXRzKHRheGFibGVHYWluLCBvdGhlckluY29tZSwgdGhpcy5fcnVsZXMudGF4QnJhY2tldHMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXhhYmxlR2FpbixcbiAgICAgICAgICAgIGNhcGl0YWxHYWluVGF4OiB0YXgsXG4gICAgICAgICAgICBzb2NpYWxDb250cmlidXRpb25zOiAwLFxuICAgICAgICAgICAgbmV0SW52ZXN0bWVudEluY29tZVRheDogMCxcbiAgICAgICAgICAgIHRvdGFsVGF4OiB0YXgsXG4gICAgICAgICAgICBlZmZlY3RpdmVSYXRlOiBnYWluID4gMCA/ICh0YXggLyBnYWluKSAqIDEwMCA6IDAsXG4gICAgICAgICAgICBicmVha2Rvd25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlCcmFja2V0cyhcbiAgICAgICAgdGF4YWJsZUdhaW46IG51bWJlcixcbiAgICAgICAgb3RoZXJJbmNvbWU6IG51bWJlcixcbiAgICAgICAgYnJhY2tldHM6IFRheEJyYWNrZXRbXSxcbiAgICApOiB7IHRheDogbnVtYmVyOyBicmVha2Rvd25zOiBCcmVha2Rvd25bXSB9IHtcbiAgICAgICAgbGV0IHRheCA9IDA7XG4gICAgICAgIGNvbnN0IGJyZWFrZG93bnM6IEJyZWFrZG93bltdID0gW107XG4gICAgICAgIGxldCByZW1haW5pbmcgPSB0YXhhYmxlR2FpbjtcbiAgICAgICAgbGV0IGluY29tZVVzZWQgPSBvdGhlckluY29tZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGJyYWNrZXQgb2YgYnJhY2tldHMpIHtcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHVwcGVyID0gYnJhY2tldC50byA/PyBJbmZpbml0eTtcblxuICAgICAgICAgICAgaWYgKGluY29tZVVzZWQgPj0gdXBwZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBicmFja2V0U3RhcnQgPSBNYXRoLm1heChicmFja2V0LmZyb20sIGluY29tZVVzZWQpO1xuICAgICAgICAgICAgY29uc3QgYnJhY2tldFNwYWNlID0gdXBwZXIgLSBicmFja2V0U3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB0YXhhYmxlID0gTWF0aC5taW4oYnJhY2tldFNwYWNlLCByZW1haW5pbmcpO1xuXG4gICAgICAgICAgICBpZiAodGF4YWJsZSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBicmFja2V0VGF4ID0gdGF4YWJsZSAqIGJyYWNrZXQucmF0ZTtcbiAgICAgICAgICAgICAgICB0YXggKz0gYnJhY2tldFRheDtcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gdGF4YWJsZTtcbiAgICAgICAgICAgICAgICBpbmNvbWVVc2VkICs9IHRheGFibGU7XG5cbiAgICAgICAgICAgICAgICBicmVha2Rvd25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBgJHticmFja2V0LmZyb219YCxcbiAgICAgICAgICAgICAgICAgICAgdG86IGAke2JyYWNrZXQudG8gPz8gJ0Fib3ZlJ31gLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiBicmFja2V0LnJhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudDogYnJhY2tldFRheCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHRheCwgYnJlYWtkb3ducyB9O1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9jYW5hZGEvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgICBpbmNsdXNpb25SYXRlOiBudW1iZXI7XG4gICAgdGF4QnJhY2tldHM6IFRheEJyYWNrZXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXhCcmFja2V0IHtcbiAgICBmcm9tOiBudW1iZXI7XG4gICAgdG86IG51bWJlciB8IG51bGw7XG4gICAgcmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElucHV0IHtcbiAgICBjYXBpdGFsR2FpbjogbnVtYmVyO1xuICAgIHRvdGFsVGF4YWJsZUluY29tZTogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQnJlYWtkb3duIHtcbiAgICBmcm9tOiBzdHJpbmc7XG4gICAgdG86IHN0cmluZztcbiAgICByYXRlOiBudW1iZXI7XG4gICAgYW1vdW50OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdCB7XG4gICAgdGF4YWJsZUdhaW46IG51bWJlcjtcbiAgICBjYXBpdGFsR2FpblRheDogbnVtYmVyO1xuICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IG51bWJlcjtcbiAgICB0b3RhbFRheDogbnVtYmVyO1xuICAgIG5ldEludmVzdG1lbnRJbmNvbWVUYXg6IG51bWJlcjtcbiAgICBlZmZlY3RpdmVSYXRlOiBudW1iZXI7XG4gICAgYnJlYWtkb3duczogQnJlYWtkb3duW107XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlQ2FwaXRhbEdhaW5zU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXBpdGFsLWdhaW5zL2ZyYW5jZS9GcmFuY2VDYXBpdGFsR2FpbnNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnJhbmNlQ2FwaXRhbEdhaW5zU2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FranceCapitalGainsServiceImpl = void 0;
4
+ class FranceCapitalGainsServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const gain = this._input.capitalGain;
11
+ if (gain <= 0) {
12
+ return {
13
+ taxableGain: gain,
14
+ capitalGainTax: 0,
15
+ socialContributions: 0,
16
+ netInvestmentIncomeTax: 0,
17
+ totalTax: 0,
18
+ effectiveRate: 0,
19
+ breakdowns: []
20
+ };
21
+ }
22
+ const capitalGainTax = gain * this._rules.flatTaxRate;
23
+ const socialContributions = gain * this._rules.socialContributionsRate;
24
+ const totalTax = capitalGainTax + socialContributions;
25
+ const breakdowns = [
26
+ {
27
+ from: '0',
28
+ to: 'All',
29
+ rate: this._rules.flatTaxRate,
30
+ amount: capitalGainTax,
31
+ },
32
+ {
33
+ from: '0',
34
+ to: 'Social',
35
+ rate: this._rules.socialContributionsRate,
36
+ amount: socialContributions,
37
+ },
38
+ ];
39
+ return {
40
+ taxableGain: gain,
41
+ capitalGainTax,
42
+ socialContributions,
43
+ netInvestmentIncomeTax: 0,
44
+ totalTax,
45
+ effectiveRate: (totalTax / gain) * 100,
46
+ breakdowns,
47
+ };
48
+ }
49
+ }
50
+ exports.FranceCapitalGainsServiceImpl = FranceCapitalGainsServiceImpl;
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlQ2FwaXRhbEdhaW5zU2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9mcmFuY2UvRnJhbmNlQ2FwaXRhbEdhaW5zU2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSw2QkFBNkI7SUFJdEMsWUFBWSxLQUFZLEVBQUUsS0FBWTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRXJDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTztnQkFDSCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3RCLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixVQUFVLEVBQUUsRUFBRTthQUNqQixDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN0RCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1FBQ3ZFLE1BQU0sUUFBUSxHQUFHLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztRQUV0RCxNQUFNLFVBQVUsR0FBZ0I7WUFDNUI7Z0JBQ0ksSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsRUFBRSxFQUFFLEtBQUs7Z0JBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVztnQkFDN0IsTUFBTSxFQUFFLGNBQWM7YUFDekI7WUFDRDtnQkFDSSxJQUFJLEVBQUUsR0FBRztnQkFDVCxFQUFFLEVBQUUsUUFBUTtnQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUI7Z0JBQ3pDLE1BQU0sRUFBRSxtQkFBbUI7YUFDOUI7U0FDSixDQUFDO1FBRUYsT0FBTztZQUNILFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixRQUFRO1lBQ1IsYUFBYSxFQUFFLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUc7WUFDdEMsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFyREQsc0VBcURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtkb3duLCBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5pbXBvcnQgeyBGcmFuY2VDYXBpdGFsR2FpbnNTZXJ2aWNlIH0gZnJvbSBcIi4vRnJhbmNlQ2FwaXRhbEdhaW5zU2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXQsIFJ1bGVzIH0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBGcmFuY2VDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEZyYW5jZUNhcGl0YWxHYWluc1NlcnZpY2Uge1xuICAgIHByaXZhdGUgX2lucHV0OiBJbnB1dDtcbiAgICBwcml2YXRlIF9ydWxlczogUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogSW5wdXQsIHJ1bGVzOiBSdWxlcykge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQge1xuICAgICAgICBjb25zdCBnYWluID0gdGhpcy5faW5wdXQuY2FwaXRhbEdhaW47XG5cbiAgICAgICAgaWYgKGdhaW4gPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXhhYmxlR2FpbjogZ2FpbixcbiAgICAgICAgICAgICAgICBjYXBpdGFsR2FpblRheDogMCxcbiAgICAgICAgICAgICAgICBzb2NpYWxDb250cmlidXRpb25zOiAwLFxuICAgICAgICAgICAgICAgIG5ldEludmVzdG1lbnRJbmNvbWVUYXg6IDAsXG4gICAgICAgICAgICAgICAgdG90YWxUYXg6IDAsXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlUmF0ZTogMCxcbiAgICAgICAgICAgICAgICBicmVha2Rvd25zOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcGl0YWxHYWluVGF4ID0gZ2FpbiAqIHRoaXMuX3J1bGVzLmZsYXRUYXhSYXRlO1xuICAgICAgICBjb25zdCBzb2NpYWxDb250cmlidXRpb25zID0gZ2FpbiAqIHRoaXMuX3J1bGVzLnNvY2lhbENvbnRyaWJ1dGlvbnNSYXRlO1xuICAgICAgICBjb25zdCB0b3RhbFRheCA9IGNhcGl0YWxHYWluVGF4ICsgc29jaWFsQ29udHJpYnV0aW9ucztcblxuICAgICAgICBjb25zdCBicmVha2Rvd25zOiBCcmVha2Rvd25bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tOiAnMCcsXG4gICAgICAgICAgICAgICAgdG86ICdBbGwnLFxuICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMuX3J1bGVzLmZsYXRUYXhSYXRlLFxuICAgICAgICAgICAgICAgIGFtb3VudDogY2FwaXRhbEdhaW5UYXgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206ICcwJyxcbiAgICAgICAgICAgICAgICB0bzogJ1NvY2lhbCcsXG4gICAgICAgICAgICAgICAgcmF0ZTogdGhpcy5fcnVsZXMuc29jaWFsQ29udHJpYnV0aW9uc1JhdGUsXG4gICAgICAgICAgICAgICAgYW1vdW50OiBzb2NpYWxDb250cmlidXRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGF4YWJsZUdhaW46IGdhaW4sXG4gICAgICAgICAgICBjYXBpdGFsR2FpblRheCxcbiAgICAgICAgICAgIHNvY2lhbENvbnRyaWJ1dGlvbnMsXG4gICAgICAgICAgICBuZXRJbnZlc3RtZW50SW5jb21lVGF4OiAwLFxuICAgICAgICAgICAgdG90YWxUYXgsXG4gICAgICAgICAgICBlZmZlY3RpdmVSYXRlOiAodG90YWxUYXggLyBnYWluKSAqIDEwMCxcbiAgICAgICAgICAgIGJyZWFrZG93bnMsXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9mcmFuY2UvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgICBmbGF0VGF4UmF0ZTogbnVtYmVyO1xuICAgIHNvY2lhbENvbnRyaWJ1dGlvbnNSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuICAgIGNhcGl0YWxHYWluOiBudW1iZXI7XG59Il19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9nZXJtYW55L0dlcm1hbnlDYXBpdGFsR2FpbnNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2Uge1xuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQ7XG59XG4iXX0=
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GermanyCapitalGainsServiceImpl = void 0;
4
+ class GermanyCapitalGainsServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const gain = this._input.capitalGain;
11
+ if (gain <= 0) {
12
+ return {
13
+ taxableGain: 0,
14
+ capitalGainTax: 0,
15
+ socialContributions: 0,
16
+ netInvestmentIncomeTax: 0,
17
+ totalTax: 0,
18
+ effectiveRate: 0,
19
+ breakdowns: [],
20
+ };
21
+ }
22
+ const taxableGain = Math.max(0, gain - this._rules.annualExemption);
23
+ if (taxableGain <= 0) {
24
+ return {
25
+ taxableGain: 0,
26
+ capitalGainTax: 0,
27
+ socialContributions: 0,
28
+ netInvestmentIncomeTax: 0,
29
+ totalTax: 0,
30
+ effectiveRate: 0,
31
+ breakdowns: [{
32
+ from: '0',
33
+ to: `${this._rules.annualExemption}`,
34
+ rate: 0,
35
+ amount: 0,
36
+ }],
37
+ };
38
+ }
39
+ const capitalGainTax = taxableGain * this._rules.flatTaxRate;
40
+ const socialContributions = capitalGainTax * this._rules.solidaritySurchargeRate;
41
+ const totalTax = capitalGainTax + socialContributions;
42
+ const breakdowns = [
43
+ {
44
+ from: '0',
45
+ to: 'All',
46
+ rate: this._rules.flatTaxRate,
47
+ amount: capitalGainTax,
48
+ },
49
+ {
50
+ from: 'CGT',
51
+ to: 'Solidarity',
52
+ rate: this._rules.solidaritySurchargeRate,
53
+ amount: socialContributions,
54
+ },
55
+ ];
56
+ return {
57
+ taxableGain,
58
+ capitalGainTax,
59
+ socialContributions,
60
+ netInvestmentIncomeTax: 0,
61
+ totalTax,
62
+ effectiveRate: gain > 0 ? (totalTax / gain) * 100 : 0,
63
+ breakdowns,
64
+ };
65
+ }
66
+ }
67
+ exports.GermanyCapitalGainsServiceImpl = GermanyCapitalGainsServiceImpl;
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NhcGl0YWwtZ2FpbnMvZ2VybWFueS9HZXJtYW55Q2FwaXRhbEdhaW5zU2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSw4QkFBOEI7SUFJdkMsWUFBWSxLQUFZLEVBQUUsS0FBWTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRXJDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTztnQkFDSCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxjQUFjLEVBQUUsQ0FBQztnQkFDakIsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLFVBQVUsRUFBRSxFQUFFO2FBQ2pCLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFcEUsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkIsT0FBTztnQkFDSCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxjQUFjLEVBQUUsQ0FBQztnQkFDakIsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLFVBQVUsRUFBRSxDQUFDO3dCQUNULElBQUksRUFBRSxHQUFHO3dCQUNULEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO3dCQUNwQyxJQUFJLEVBQUUsQ0FBQzt3QkFDUCxNQUFNLEVBQUUsQ0FBQztxQkFDWixDQUFDO2FBQ0wsQ0FBQztRQUNOLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDN0QsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQztRQUNqRixNQUFNLFFBQVEsR0FBRyxjQUFjLEdBQUcsbUJBQW1CLENBQUM7UUFFdEQsTUFBTSxVQUFVLEdBQWdCO1lBQzVCO2dCQUNJLElBQUksRUFBRSxHQUFHO2dCQUNULEVBQUUsRUFBRSxLQUFLO2dCQUNULElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7Z0JBQzdCLE1BQU0sRUFBRSxjQUFjO2FBQ3pCO1lBQ0Q7Z0JBQ0ksSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsRUFBRSxFQUFFLFlBQVk7Z0JBQ2hCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QjtnQkFDekMsTUFBTSxFQUFFLG1CQUFtQjthQUM5QjtTQUNKLENBQUM7UUFFRixPQUFPO1lBQ0gsV0FBVztZQUNYLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixRQUFRO1lBQ1IsYUFBYSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxVQUFVO1NBQ2IsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQXhFRCx3RUF3RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha2Rvd24sIFJlc3VsdCB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IEdlcm1hbnlDYXBpdGFsR2FpbnNTZXJ2aWNlIH0gZnJvbSBcIi4vR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2VcIjtcbmltcG9ydCB7IElucHV0LCBSdWxlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsIGltcGxlbWVudHMgR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2Uge1xuICAgIHByaXZhdGUgX2lucHV0OiBJbnB1dDtcbiAgICBwcml2YXRlIF9ydWxlczogUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogSW5wdXQsIHJ1bGVzOiBSdWxlcykge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQge1xuICAgICAgICBjb25zdCBnYWluID0gdGhpcy5faW5wdXQuY2FwaXRhbEdhaW47XG5cbiAgICAgICAgaWYgKGdhaW4gPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXhhYmxlR2FpbjogMCxcbiAgICAgICAgICAgICAgICBjYXBpdGFsR2FpblRheDogMCxcbiAgICAgICAgICAgICAgICBzb2NpYWxDb250cmlidXRpb25zOiAwLFxuICAgICAgICAgICAgICAgIG5ldEludmVzdG1lbnRJbmNvbWVUYXg6IDAsXG4gICAgICAgICAgICAgICAgdG90YWxUYXg6IDAsXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlUmF0ZTogMCxcbiAgICAgICAgICAgICAgICBicmVha2Rvd25zOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXhhYmxlR2FpbiA9IE1hdGgubWF4KDAsIGdhaW4gLSB0aGlzLl9ydWxlcy5hbm51YWxFeGVtcHRpb24pO1xuXG4gICAgICAgIGlmICh0YXhhYmxlR2FpbiA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRheGFibGVHYWluOiAwLFxuICAgICAgICAgICAgICAgIGNhcGl0YWxHYWluVGF4OiAwLFxuICAgICAgICAgICAgICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IDAsXG4gICAgICAgICAgICAgICAgbmV0SW52ZXN0bWVudEluY29tZVRheDogMCxcbiAgICAgICAgICAgICAgICB0b3RhbFRheDogMCxcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVSYXRlOiAwLFxuICAgICAgICAgICAgICAgIGJyZWFrZG93bnM6IFt7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICcwJyxcbiAgICAgICAgICAgICAgICAgICAgdG86IGAke3RoaXMuX3J1bGVzLmFubnVhbEV4ZW1wdGlvbn1gLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiAwLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FwaXRhbEdhaW5UYXggPSB0YXhhYmxlR2FpbiAqIHRoaXMuX3J1bGVzLmZsYXRUYXhSYXRlO1xuICAgICAgICBjb25zdCBzb2NpYWxDb250cmlidXRpb25zID0gY2FwaXRhbEdhaW5UYXggKiB0aGlzLl9ydWxlcy5zb2xpZGFyaXR5U3VyY2hhcmdlUmF0ZTtcbiAgICAgICAgY29uc3QgdG90YWxUYXggPSBjYXBpdGFsR2FpblRheCArIHNvY2lhbENvbnRyaWJ1dGlvbnM7XG5cbiAgICAgICAgY29uc3QgYnJlYWtkb3duczogQnJlYWtkb3duW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgICAgIHRvOiAnQWxsJyxcbiAgICAgICAgICAgICAgICByYXRlOiB0aGlzLl9ydWxlcy5mbGF0VGF4UmF0ZSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGNhcGl0YWxHYWluVGF4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tOiAnQ0dUJyxcbiAgICAgICAgICAgICAgICB0bzogJ1NvbGlkYXJpdHknLFxuICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMuX3J1bGVzLnNvbGlkYXJpdHlTdXJjaGFyZ2VSYXRlLFxuICAgICAgICAgICAgICAgIGFtb3VudDogc29jaWFsQ29udHJpYnV0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRheGFibGVHYWluLFxuICAgICAgICAgICAgY2FwaXRhbEdhaW5UYXgsXG4gICAgICAgICAgICBzb2NpYWxDb250cmlidXRpb25zLFxuICAgICAgICAgICAgbmV0SW52ZXN0bWVudEluY29tZVRheDogMCxcbiAgICAgICAgICAgIHRvdGFsVGF4LFxuICAgICAgICAgICAgZWZmZWN0aXZlUmF0ZTogZ2FpbiA+IDAgPyAodG90YWxUYXggLyBnYWluKSAqIDEwMCA6IDAsXG4gICAgICAgICAgICBicmVha2Rvd25zLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9nZXJtYW55L2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgICBmbGF0VGF4UmF0ZTogbnVtYmVyO1xuICAgIHNvbGlkYXJpdHlTdXJjaGFyZ2VSYXRlOiBudW1iZXI7XG4gICAgYW5udWFsRXhlbXB0aW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuICAgIGNhcGl0YWxHYWluOiBudW1iZXI7XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GermanyCapitalGainsService = exports.USACapitalGainsService = exports.UKCapitalGainsService = exports.AustraliaCapitalGainsService = exports.SouthAfricaCapitalGainsService = exports.FranceCapitalGainsService = exports.CanadaCapitalGainsService = void 0;
4
+ // Capital Gains - Canada
5
+ const CanadaCapitalGainsServiceImpl_1 = require("./canada/CanadaCapitalGainsServiceImpl");
6
+ Object.defineProperty(exports, "CanadaCapitalGainsService", { enumerable: true, get: function () { return CanadaCapitalGainsServiceImpl_1.CanadaCapitalGainsServiceImpl; } });
7
+ // Capital Gains - France
8
+ const FranceCapitalGainsServiceImpl_1 = require("./france/FranceCapitalGainsServiceImpl");
9
+ Object.defineProperty(exports, "FranceCapitalGainsService", { enumerable: true, get: function () { return FranceCapitalGainsServiceImpl_1.FranceCapitalGainsServiceImpl; } });
10
+ // Capital Gains - South Africa
11
+ const SouthAfricaCapitalGainsServiceImpl_1 = require("./south-africa/SouthAfricaCapitalGainsServiceImpl");
12
+ Object.defineProperty(exports, "SouthAfricaCapitalGainsService", { enumerable: true, get: function () { return SouthAfricaCapitalGainsServiceImpl_1.SouthAfricaCapitalGainsServiceImpl; } });
13
+ // Capital Gains - Australia
14
+ const AustraliaCapitalGainsServiceImpl_1 = require("./australia/AustraliaCapitalGainsServiceImpl");
15
+ Object.defineProperty(exports, "AustraliaCapitalGainsService", { enumerable: true, get: function () { return AustraliaCapitalGainsServiceImpl_1.AustraliaCapitalGainsServiceImpl; } });
16
+ // Capital Gains - UK
17
+ const UKCapitalGainsServiceImpl_1 = require("./uk/UKCapitalGainsServiceImpl");
18
+ Object.defineProperty(exports, "UKCapitalGainsService", { enumerable: true, get: function () { return UKCapitalGainsServiceImpl_1.UKCapitalGainsServiceImpl; } });
19
+ // Capital Gains - USA
20
+ const USACapitalGainsServiceImpl_1 = require("./usa/USACapitalGainsServiceImpl");
21
+ Object.defineProperty(exports, "USACapitalGainsService", { enumerable: true, get: function () { return USACapitalGainsServiceImpl_1.USACapitalGainsServiceImpl; } });
22
+ // Capital Gains - Germany
23
+ const GermanyCapitalGainsServiceImpl_1 = require("./germany/GermanyCapitalGainsServiceImpl");
24
+ Object.defineProperty(exports, "GermanyCapitalGainsService", { enumerable: true, get: function () { return GermanyCapitalGainsServiceImpl_1.GermanyCapitalGainsServiceImpl; } });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsMEZBQW9IO0FBaURoSCwwR0FqRHNDLDZEQUF5QixPQWlEdEM7QUEzQzdCLHlCQUF5QjtBQUN6QiwwRkFBb0g7QUE2Q2hILDBHQTdDc0MsNkRBQXlCLE9BNkN0QztBQXZDN0IsK0JBQStCO0FBQy9CLDBHQUF5STtBQXlDckksK0dBekMyQyx1RUFBOEIsT0F5QzNDO0FBbkNsQyw0QkFBNEI7QUFDNUIsbUdBQWdJO0FBcUM1SCw2R0FyQ3lDLG1FQUE0QixPQXFDekM7QUEvQmhDLHFCQUFxQjtBQUNyQiw4RUFBb0c7QUFpQ2hHLHNHQWpDa0MscURBQXFCLE9BaUNsQztBQTNCekIsc0JBQXNCO0FBQ3RCLGlGQUF3RztBQTZCcEcsdUdBN0JtQyx1REFBc0IsT0E2Qm5DO0FBdkIxQiwwQkFBMEI7QUFDMUIsNkZBQXdIO0FBeUJwSCwyR0F6QnVDLCtEQUEwQixPQXlCdkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDYXBpdGFsIEdhaW5zIC0gQ2FuYWRhXG5pbXBvcnQgeyBDYW5hZGFDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbCBhcyBDYW5hZGFDYXBpdGFsR2FpbnNTZXJ2aWNlIH0gZnJvbSAnLi9jYW5hZGEvQ2FuYWRhQ2FwaXRhbEdhaW5zU2VydmljZUltcGwnO1xuaW1wb3J0IHtcbiAgICBJbnB1dCBhcyBDYW5hZGFDYXBpdGFsR2FpbnNJbnB1dCxcbiAgICBSdWxlcyBhcyBDYW5hZGFDYXBpdGFsR2FpbnNSdWxlc1xufSBmcm9tICcuL2NhbmFkYS9kb21haW4vdHlwZXMnO1xuXG4vLyBDYXBpdGFsIEdhaW5zIC0gRnJhbmNlXG5pbXBvcnQgeyBGcmFuY2VDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbCBhcyBGcmFuY2VDYXBpdGFsR2FpbnNTZXJ2aWNlIH0gZnJvbSAnLi9mcmFuY2UvRnJhbmNlQ2FwaXRhbEdhaW5zU2VydmljZUltcGwnO1xuaW1wb3J0IHtcbiAgICBJbnB1dCBhcyBGcmFuY2VDYXBpdGFsR2FpbnNJbnB1dCxcbiAgICBSdWxlcyBhcyBGcmFuY2VDYXBpdGFsR2FpbnNSdWxlc1xufSBmcm9tICcuL2ZyYW5jZS9kb21haW4vdHlwZXMnO1xuXG4vLyBDYXBpdGFsIEdhaW5zIC0gU291dGggQWZyaWNhXG5pbXBvcnQgeyBTb3V0aEFmcmljYUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsIGFzIFNvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zU2VydmljZSB9IGZyb20gJy4vc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zU2VydmljZUltcGwnO1xuaW1wb3J0IHtcbiAgICBJbnB1dCBhcyBTb3V0aEFmcmljYUNhcGl0YWxHYWluc0lucHV0LFxuICAgIFJ1bGVzIGFzIFNvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zUnVsZXNcbn0gZnJvbSAnLi9zb3V0aC1hZnJpY2EvZG9tYWluL3R5cGVzJztcblxuLy8gQ2FwaXRhbCBHYWlucyAtIEF1c3RyYWxpYVxuaW1wb3J0IHsgQXVzdHJhbGlhQ2FwaXRhbEdhaW5zU2VydmljZUltcGwgYXMgQXVzdHJhbGlhQ2FwaXRhbEdhaW5zU2VydmljZSB9IGZyb20gJy4vYXVzdHJhbGlhL0F1c3RyYWxpYUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7XG4gICAgSW5wdXQgYXMgQXVzdHJhbGlhQ2FwaXRhbEdhaW5zSW5wdXQsXG4gICAgUnVsZXMgYXMgQXVzdHJhbGlhQ2FwaXRhbEdhaW5zUnVsZXNcbn0gZnJvbSAnLi9hdXN0cmFsaWEvZG9tYWluL3R5cGVzJztcblxuLy8gQ2FwaXRhbCBHYWlucyAtIFVLXG5pbXBvcnQgeyBVS0NhcGl0YWxHYWluc1NlcnZpY2VJbXBsIGFzIFVLQ2FwaXRhbEdhaW5zU2VydmljZSB9IGZyb20gJy4vdWsvVUtDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbCc7XG5pbXBvcnQge1xuICAgIElucHV0IGFzIFVLQ2FwaXRhbEdhaW5zSW5wdXQsXG4gICAgUnVsZXMgYXMgVUtDYXBpdGFsR2FpbnNSdWxlc1xufSBmcm9tICcuL3VrL2RvbWFpbi90eXBlcyc7XG5cbi8vIENhcGl0YWwgR2FpbnMgLSBVU0FcbmltcG9ydCB7IFVTQUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsIGFzIFVTQUNhcGl0YWxHYWluc1NlcnZpY2UgfSBmcm9tICcuL3VzYS9VU0FDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbCc7XG5pbXBvcnQge1xuICAgIElucHV0IGFzIFVTQUNhcGl0YWxHYWluc0lucHV0LFxuICAgIFJ1bGVzIGFzIFVTQUNhcGl0YWxHYWluc1J1bGVzXG59IGZyb20gJy4vdXNhL2RvbWFpbi90eXBlcyc7XG5cbi8vIENhcGl0YWwgR2FpbnMgLSBHZXJtYW55XG5pbXBvcnQgeyBHZXJtYW55Q2FwaXRhbEdhaW5zU2VydmljZUltcGwgYXMgR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2UgfSBmcm9tICcuL2dlcm1hbnkvR2VybWFueUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7XG4gICAgSW5wdXQgYXMgR2VybWFueUNhcGl0YWxHYWluc0lucHV0LFxuICAgIFJ1bGVzIGFzIEdlcm1hbnlDYXBpdGFsR2FpbnNSdWxlc1xufSBmcm9tICcuL2dlcm1hbnkvZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IHtcbiAgICBDYW5hZGFDYXBpdGFsR2FpbnNTZXJ2aWNlLFxuICAgIENhbmFkYUNhcGl0YWxHYWluc0lucHV0LFxuICAgIENhbmFkYUNhcGl0YWxHYWluc1J1bGVzLFxuICAgIEZyYW5jZUNhcGl0YWxHYWluc1NlcnZpY2UsXG4gICAgRnJhbmNlQ2FwaXRhbEdhaW5zSW5wdXQsXG4gICAgRnJhbmNlQ2FwaXRhbEdhaW5zUnVsZXMsXG4gICAgU291dGhBZnJpY2FDYXBpdGFsR2FpbnNTZXJ2aWNlLFxuICAgIFNvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zSW5wdXQsXG4gICAgU291dGhBZnJpY2FDYXBpdGFsR2FpbnNSdWxlcyxcbiAgICBBdXN0cmFsaWFDYXBpdGFsR2FpbnNTZXJ2aWNlLFxuICAgIEF1c3RyYWxpYUNhcGl0YWxHYWluc0lucHV0LFxuICAgIEF1c3RyYWxpYUNhcGl0YWxHYWluc1J1bGVzLFxuICAgIFVLQ2FwaXRhbEdhaW5zU2VydmljZSxcbiAgICBVS0NhcGl0YWxHYWluc0lucHV0LFxuICAgIFVLQ2FwaXRhbEdhaW5zUnVsZXMsXG4gICAgVVNBQ2FwaXRhbEdhaW5zU2VydmljZSxcbiAgICBVU0FDYXBpdGFsR2FpbnNJbnB1dCxcbiAgICBVU0FDYXBpdGFsR2FpbnNSdWxlcyxcbiAgICBHZXJtYW55Q2FwaXRhbEdhaW5zU2VydmljZSxcbiAgICBHZXJtYW55Q2FwaXRhbEdhaW5zSW5wdXQsXG4gICAgR2VybWFueUNhcGl0YWxHYWluc1J1bGVzXG59OyJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291dGhBZnJpY2FDYXBpdGFsR2FpbnNTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NhcGl0YWwtZ2FpbnMvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zU2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SouthAfricaCapitalGainsServiceImpl = void 0;
4
+ class SouthAfricaCapitalGainsServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const gain = this._input.capitalGain;
11
+ if (gain <= 0) {
12
+ return {
13
+ taxableGain: 0,
14
+ capitalGainTax: 0,
15
+ socialContributions: 0,
16
+ netInvestmentIncomeTax: 0,
17
+ totalTax: 0,
18
+ effectiveRate: 0,
19
+ breakdowns: []
20
+ };
21
+ }
22
+ const netGain = Math.max(0, gain - this._rules.annualExclusion);
23
+ const taxableGain = netGain * this._rules.inclusionRate;
24
+ if (taxableGain <= 0) {
25
+ return {
26
+ taxableGain: 0,
27
+ capitalGainTax: 0,
28
+ socialContributions: 0,
29
+ netInvestmentIncomeTax: 0,
30
+ totalTax: 0,
31
+ effectiveRate: 0,
32
+ breakdowns: [{
33
+ from: '0',
34
+ to: `${this._rules.annualExclusion}`,
35
+ rate: 0,
36
+ amount: 0,
37
+ }],
38
+ };
39
+ }
40
+ const otherIncome = this._input.totalTaxableIncome - gain;
41
+ const { tax, breakdowns } = this.applyBrackets(taxableGain, otherIncome, this._rules.taxBrackets);
42
+ return {
43
+ taxableGain,
44
+ capitalGainTax: tax,
45
+ socialContributions: 0,
46
+ netInvestmentIncomeTax: 0,
47
+ totalTax: tax,
48
+ effectiveRate: gain > 0 ? (tax / gain) * 100 : 0,
49
+ breakdowns,
50
+ };
51
+ }
52
+ applyBrackets(taxableGain, otherIncome, brackets) {
53
+ let tax = 0;
54
+ const breakdowns = [];
55
+ let remaining = taxableGain;
56
+ let incomeUsed = otherIncome;
57
+ for (const bracket of brackets) {
58
+ if (remaining <= 0)
59
+ break;
60
+ const upper = bracket.to ?? Infinity;
61
+ if (incomeUsed >= upper)
62
+ continue;
63
+ const bracketStart = Math.max(bracket.from, incomeUsed);
64
+ const bracketSpace = upper - bracketStart;
65
+ const taxable = Math.min(bracketSpace, remaining);
66
+ if (taxable > 0) {
67
+ const bracketTax = taxable * bracket.rate;
68
+ tax += bracketTax;
69
+ remaining -= taxable;
70
+ incomeUsed += taxable;
71
+ breakdowns.push({
72
+ from: `${bracket.from}`,
73
+ to: `${bracket.to ?? 'Above'}`,
74
+ rate: bracket.rate,
75
+ amount: bracketTax,
76
+ });
77
+ }
78
+ }
79
+ return { tax, breakdowns };
80
+ }
81
+ }
82
+ exports.SouthAfricaCapitalGainsServiceImpl = SouthAfricaCapitalGainsServiceImpl;
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291dGhBZnJpY2FDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXBpdGFsLWdhaW5zL3NvdXRoLWFmcmljYS9Tb3V0aEFmcmljYUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLE1BQWEsa0NBQWtDO0lBSTNDLFlBQVksS0FBWSxFQUFFLEtBQVk7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVM7UUFDTCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUVyQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNaLE9BQU87Z0JBQ0gsV0FBVyxFQUFFLENBQUM7Z0JBQ2QsY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3RCLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixVQUFVLEVBQUUsRUFBRTthQUNqQixDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUV4RCxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQixPQUFPO2dCQUNILFdBQVcsRUFBRSxDQUFDO2dCQUNkLGNBQWMsRUFBRSxDQUFDO2dCQUNqQixtQkFBbUIsRUFBRSxDQUFDO2dCQUN0QixzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsQ0FBQztnQkFDWCxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsVUFBVSxFQUFFLENBQUM7d0JBQ1QsSUFBSSxFQUFFLEdBQUc7d0JBQ1QsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7d0JBQ3BDLElBQUksRUFBRSxDQUFDO3dCQUNQLE1BQU0sRUFBRSxDQUFDO3FCQUNaLENBQUM7YUFDTCxDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQzFELE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEcsT0FBTztZQUNILFdBQVc7WUFDWCxjQUFjLEVBQUUsR0FBRztZQUNuQixtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLHNCQUFzQixFQUFFLENBQUM7WUFDekIsUUFBUSxFQUFFLEdBQUc7WUFDYixhQUFhLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELFVBQVU7U0FDYixDQUFDO0lBQ04sQ0FBQztJQUVPLGFBQWEsQ0FDakIsV0FBbUIsRUFDbkIsV0FBbUIsRUFDbkIsUUFBc0I7UUFFdEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osTUFBTSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFDNUIsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBRTdCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxTQUFTLElBQUksQ0FBQztnQkFBRSxNQUFNO1lBRTFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDO1lBRXJDLElBQUksVUFBVSxJQUFJLEtBQUs7Z0JBQUUsU0FBUztZQUVsQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEQsTUFBTSxZQUFZLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVsRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDZCxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDMUMsR0FBRyxJQUFJLFVBQVUsQ0FBQztnQkFDbEIsU0FBUyxJQUFJLE9BQU8sQ0FBQztnQkFDckIsVUFBVSxJQUFJLE9BQU8sQ0FBQztnQkFFdEIsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDWixJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFO29CQUN2QixFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLE9BQU8sRUFBRTtvQkFDOUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixNQUFNLEVBQUUsVUFBVTtpQkFDckIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDSjtBQWhHRCxnRkFnR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha2Rvd24sIFJlc3VsdCB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IFNvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zU2VydmljZSB9IGZyb20gXCIuL1NvdXRoQWZyaWNhQ2FwaXRhbEdhaW5zU2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXQsIFJ1bGVzLCBUYXhCcmFja2V0IH0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTb3V0aEFmcmljYUNhcGl0YWxHYWluc1NlcnZpY2VJbXBsIGltcGxlbWVudHMgU291dGhBZnJpY2FDYXBpdGFsR2FpbnNTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9pbnB1dDogSW5wdXQ7XG4gICAgcHJpdmF0ZSBfcnVsZXM6IFJ1bGVzO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IElucHV0LCBydWxlczogUnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZ2FpbiA9IHRoaXMuX2lucHV0LmNhcGl0YWxHYWluO1xuXG4gICAgICAgIGlmIChnYWluIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGF4YWJsZUdhaW46IDAsXG4gICAgICAgICAgICAgICAgY2FwaXRhbEdhaW5UYXg6IDAsXG4gICAgICAgICAgICAgICAgc29jaWFsQ29udHJpYnV0aW9uczogMCxcbiAgICAgICAgICAgICAgICBuZXRJbnZlc3RtZW50SW5jb21lVGF4OiAwLFxuICAgICAgICAgICAgICAgIHRvdGFsVGF4OiAwLFxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJhdGU6IDAsXG4gICAgICAgICAgICAgICAgYnJlYWtkb3duczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXRHYWluID0gTWF0aC5tYXgoMCwgZ2FpbiAtIHRoaXMuX3J1bGVzLmFubnVhbEV4Y2x1c2lvbik7XG4gICAgICAgIGNvbnN0IHRheGFibGVHYWluID0gbmV0R2FpbiAqIHRoaXMuX3J1bGVzLmluY2x1c2lvblJhdGU7XG5cbiAgICAgICAgaWYgKHRheGFibGVHYWluIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGF4YWJsZUdhaW46IDAsXG4gICAgICAgICAgICAgICAgY2FwaXRhbEdhaW5UYXg6IDAsXG4gICAgICAgICAgICAgICAgc29jaWFsQ29udHJpYnV0aW9uczogMCxcbiAgICAgICAgICAgICAgICBuZXRJbnZlc3RtZW50SW5jb21lVGF4OiAwLFxuICAgICAgICAgICAgICAgIHRvdGFsVGF4OiAwLFxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJhdGU6IDAsXG4gICAgICAgICAgICAgICAgYnJlYWtkb3duczogW3tcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgICAgICAgICB0bzogYCR7dGhpcy5fcnVsZXMuYW5udWFsRXhjbHVzaW9ufWAsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlckluY29tZSA9IHRoaXMuX2lucHV0LnRvdGFsVGF4YWJsZUluY29tZSAtIGdhaW47XG4gICAgICAgIGNvbnN0IHsgdGF4LCBicmVha2Rvd25zIH0gPSB0aGlzLmFwcGx5QnJhY2tldHModGF4YWJsZUdhaW4sIG90aGVySW5jb21lLCB0aGlzLl9ydWxlcy50YXhCcmFja2V0cyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRheGFibGVHYWluLFxuICAgICAgICAgICAgY2FwaXRhbEdhaW5UYXg6IHRheCxcbiAgICAgICAgICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IDAsXG4gICAgICAgICAgICBuZXRJbnZlc3RtZW50SW5jb21lVGF4OiAwLFxuICAgICAgICAgICAgdG90YWxUYXg6IHRheCxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJhdGU6IGdhaW4gPiAwID8gKHRheCAvIGdhaW4pICogMTAwIDogMCxcbiAgICAgICAgICAgIGJyZWFrZG93bnMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseUJyYWNrZXRzKFxuICAgICAgICB0YXhhYmxlR2FpbjogbnVtYmVyLFxuICAgICAgICBvdGhlckluY29tZTogbnVtYmVyLFxuICAgICAgICBicmFja2V0czogVGF4QnJhY2tldFtdLFxuICAgICk6IHsgdGF4OiBudW1iZXI7IGJyZWFrZG93bnM6IEJyZWFrZG93bltdIH0ge1xuICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgY29uc3QgYnJlYWtkb3duczogQnJlYWtkb3duW10gPSBbXTtcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IHRheGFibGVHYWluO1xuICAgICAgICBsZXQgaW5jb21lVXNlZCA9IG90aGVySW5jb21lO1xuXG4gICAgICAgIGZvciAoY29uc3QgYnJhY2tldCBvZiBicmFja2V0cykge1xuICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IEluZmluaXR5O1xuXG4gICAgICAgICAgICBpZiAoaW5jb21lVXNlZCA+PSB1cHBlcikgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRTdGFydCA9IE1hdGgubWF4KGJyYWNrZXQuZnJvbSwgaW5jb21lVXNlZCk7XG4gICAgICAgICAgICBjb25zdCBicmFja2V0U3BhY2UgPSB1cHBlciAtIGJyYWNrZXRTdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHRheGFibGUgPSBNYXRoLm1pbihicmFja2V0U3BhY2UsIHJlbWFpbmluZyk7XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRUYXggPSB0YXhhYmxlICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSBicmFja2V0VGF4O1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSB0YXhhYmxlO1xuICAgICAgICAgICAgICAgIGluY29tZVVzZWQgKz0gdGF4YWJsZTtcblxuICAgICAgICAgICAgICAgIGJyZWFrZG93bnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZyb206IGAke2JyYWNrZXQuZnJvbX1gLFxuICAgICAgICAgICAgICAgICAgICB0bzogYCR7YnJhY2tldC50byA/PyAnQWJvdmUnfWAsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBicmFja2V0VGF4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdGF4LCBicmVha2Rvd25zIH07XG4gICAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy9zb3V0aC1hZnJpY2EvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFRheEJyYWNrZXQge1xuICAgIGZyb206IG51bWJlcjtcbiAgICB0bzogbnVtYmVyIHwgbnVsbDtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICAgIGluY2x1c2lvblJhdGU6IG51bWJlcjtcbiAgICBhbm51YWxFeGNsdXNpb246IG51bWJlcjtcbiAgICB0YXhCcmFja2V0czogVGF4QnJhY2tldFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElucHV0IHtcbiAgICBjYXBpdGFsR2FpbjogbnVtYmVyO1xuICAgIHRvdGFsVGF4YWJsZUluY29tZTogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVUtDYXBpdGFsR2FpbnNTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NhcGl0YWwtZ2FpbnMvdWsvVUtDYXBpdGFsR2FpbnNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVUtDYXBpdGFsR2FpbnNTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0O1xufVxuIl19
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UKCapitalGainsServiceImpl = void 0;
4
+ class UKCapitalGainsServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const gain = this._input.capitalGain;
11
+ if (gain <= 0) {
12
+ return {
13
+ taxableGain: 0,
14
+ capitalGainTax: 0,
15
+ socialContributions: 0,
16
+ netInvestmentIncomeTax: 0,
17
+ totalTax: 0,
18
+ effectiveRate: 0,
19
+ breakdowns: []
20
+ };
21
+ }
22
+ const taxableGain = Math.max(0, gain - this._rules.annualExemption);
23
+ if (taxableGain <= 0) {
24
+ return {
25
+ taxableGain: 0,
26
+ capitalGainTax: 0,
27
+ socialContributions: 0,
28
+ netInvestmentIncomeTax: 0,
29
+ totalTax: 0,
30
+ effectiveRate: 0,
31
+ breakdowns: [{
32
+ from: '0',
33
+ to: `${this._rules.annualExemption}`,
34
+ rate: 0,
35
+ amount: 0,
36
+ }],
37
+ };
38
+ }
39
+ const basicRateRemaining = Math.max(0, this._rules.basicRateLimit - this._input.totalTaxableIncome);
40
+ const breakdowns = [];
41
+ let tax = 0;
42
+ if (basicRateRemaining > 0) {
43
+ const basicRateGain = Math.min(taxableGain, basicRateRemaining);
44
+ const basicTax = basicRateGain * this._rules.basicRate;
45
+ tax += basicTax;
46
+ breakdowns.push({
47
+ from: '0',
48
+ to: `${basicRateRemaining}`,
49
+ rate: this._rules.basicRate,
50
+ amount: basicTax,
51
+ });
52
+ const higherRateGain = taxableGain - basicRateGain;
53
+ if (higherRateGain > 0) {
54
+ const higherTax = higherRateGain * this._rules.higherRate;
55
+ tax += higherTax;
56
+ breakdowns.push({
57
+ from: `${basicRateRemaining}`,
58
+ to: 'Above',
59
+ rate: this._rules.higherRate,
60
+ amount: higherTax,
61
+ });
62
+ }
63
+ }
64
+ else {
65
+ const higherTax = taxableGain * this._rules.higherRate;
66
+ tax += higherTax;
67
+ breakdowns.push({
68
+ from: '0',
69
+ to: 'Above',
70
+ rate: this._rules.higherRate,
71
+ amount: higherTax,
72
+ });
73
+ }
74
+ return {
75
+ taxableGain,
76
+ capitalGainTax: tax,
77
+ socialContributions: 0,
78
+ netInvestmentIncomeTax: 0,
79
+ totalTax: tax,
80
+ effectiveRate: gain > 0 ? (tax / gain) * 100 : 0,
81
+ breakdowns,
82
+ };
83
+ }
84
+ }
85
+ exports.UKCapitalGainsServiceImpl = UKCapitalGainsServiceImpl;
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVUtDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXBpdGFsLWdhaW5zL3VrL1VLQ2FwaXRhbEdhaW5zU2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSx5QkFBeUI7SUFJbEMsWUFBWSxLQUFZLEVBQUUsS0FBWTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRXJDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTztnQkFDSCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxjQUFjLEVBQUUsQ0FBQztnQkFDakIsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLFVBQVUsRUFBRSxFQUFFO2FBQ2pCLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFcEUsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkIsT0FBTztnQkFDSCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxjQUFjLEVBQUUsQ0FBQztnQkFDakIsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLFVBQVUsRUFBRSxDQUFDO3dCQUNULElBQUksRUFBRSxHQUFHO3dCQUNULEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO3dCQUNwQyxJQUFJLEVBQUUsQ0FBQzt3QkFDUCxNQUFNLEVBQUUsQ0FBQztxQkFDWixDQUFDO2FBQ0wsQ0FBQztRQUNOLENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNwRyxNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUVaLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUNoRSxNQUFNLFFBQVEsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDdkQsR0FBRyxJQUFJLFFBQVEsQ0FBQztZQUVoQixVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUksRUFBRSxHQUFHO2dCQUNULEVBQUUsRUFBRSxHQUFHLGtCQUFrQixFQUFFO2dCQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUMzQixNQUFNLEVBQUUsUUFBUTthQUNuQixDQUFDLENBQUM7WUFFSCxNQUFNLGNBQWMsR0FBRyxXQUFXLEdBQUcsYUFBYSxDQUFDO1lBQ25ELElBQUksY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNLFNBQVMsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7Z0JBQzFELEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBRWpCLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ1osSUFBSSxFQUFFLEdBQUcsa0JBQWtCLEVBQUU7b0JBQzdCLEVBQUUsRUFBRSxPQUFPO29CQUNYLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7b0JBQzVCLE1BQU0sRUFBRSxTQUFTO2lCQUNwQixDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDdkQsR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUVqQixVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUksRUFBRSxHQUFHO2dCQUNULEVBQUUsRUFBRSxPQUFPO2dCQUNYLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQzVCLE1BQU0sRUFBRSxTQUFTO2FBQ3BCLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPO1lBQ0gsV0FBVztZQUNYLGNBQWMsRUFBRSxHQUFHO1lBQ25CLG1CQUFtQixFQUFFLENBQUM7WUFDdEIsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixRQUFRLEVBQUUsR0FBRztZQUNiLGFBQWEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDO0NBQ0o7QUE3RkQsOERBNkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtkb3duLCBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5pbXBvcnQgeyBVS0NhcGl0YWxHYWluc1NlcnZpY2UgfSBmcm9tIFwiLi9VS0NhcGl0YWxHYWluc1NlcnZpY2VcIjtcbmltcG9ydCB7IElucHV0LCBSdWxlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgVUtDYXBpdGFsR2FpbnNTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIFVLQ2FwaXRhbEdhaW5zU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfaW5wdXQ6IElucHV0O1xuICAgIHByaXZhdGUgX3J1bGVzOiBSdWxlcztcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0OiBJbnB1dCwgcnVsZXM6IFJ1bGVzKSB7XG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuX3J1bGVzID0gcnVsZXM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGdhaW4gPSB0aGlzLl9pbnB1dC5jYXBpdGFsR2FpbjtcblxuICAgICAgICBpZiAoZ2FpbiA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRheGFibGVHYWluOiAwLFxuICAgICAgICAgICAgICAgIGNhcGl0YWxHYWluVGF4OiAwLFxuICAgICAgICAgICAgICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IDAsXG4gICAgICAgICAgICAgICAgbmV0SW52ZXN0bWVudEluY29tZVRheDogMCxcbiAgICAgICAgICAgICAgICB0b3RhbFRheDogMCxcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVSYXRlOiAwLFxuICAgICAgICAgICAgICAgIGJyZWFrZG93bnM6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGF4YWJsZUdhaW4gPSBNYXRoLm1heCgwLCBnYWluIC0gdGhpcy5fcnVsZXMuYW5udWFsRXhlbXB0aW9uKTtcblxuICAgICAgICBpZiAodGF4YWJsZUdhaW4gPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXhhYmxlR2FpbjogMCxcbiAgICAgICAgICAgICAgICBjYXBpdGFsR2FpblRheDogMCxcbiAgICAgICAgICAgICAgICBzb2NpYWxDb250cmlidXRpb25zOiAwLFxuICAgICAgICAgICAgICAgIG5ldEludmVzdG1lbnRJbmNvbWVUYXg6IDAsXG4gICAgICAgICAgICAgICAgdG90YWxUYXg6IDAsXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlUmF0ZTogMCxcbiAgICAgICAgICAgICAgICBicmVha2Rvd25zOiBbe1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiAnMCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiBgJHt0aGlzLl9ydWxlcy5hbm51YWxFeGVtcHRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgcmF0ZTogMCxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2ljUmF0ZVJlbWFpbmluZyA9IE1hdGgubWF4KDAsIHRoaXMuX3J1bGVzLmJhc2ljUmF0ZUxpbWl0IC0gdGhpcy5faW5wdXQudG90YWxUYXhhYmxlSW5jb21lKTtcbiAgICAgICAgY29uc3QgYnJlYWtkb3duczogQnJlYWtkb3duW10gPSBbXTtcbiAgICAgICAgbGV0IHRheCA9IDA7XG5cbiAgICAgICAgaWYgKGJhc2ljUmF0ZVJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2ljUmF0ZUdhaW4gPSBNYXRoLm1pbih0YXhhYmxlR2FpbiwgYmFzaWNSYXRlUmVtYWluaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2ljVGF4ID0gYmFzaWNSYXRlR2FpbiAqIHRoaXMuX3J1bGVzLmJhc2ljUmF0ZTtcbiAgICAgICAgICAgIHRheCArPSBiYXNpY1RheDtcblxuICAgICAgICAgICAgYnJlYWtkb3ducy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmcm9tOiAnMCcsXG4gICAgICAgICAgICAgICAgdG86IGAke2Jhc2ljUmF0ZVJlbWFpbmluZ31gLFxuICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMuX3J1bGVzLmJhc2ljUmF0ZSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGJhc2ljVGF4LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlclJhdGVHYWluID0gdGF4YWJsZUdhaW4gLSBiYXNpY1JhdGVHYWluO1xuICAgICAgICAgICAgaWYgKGhpZ2hlclJhdGVHYWluID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hlclRheCA9IGhpZ2hlclJhdGVHYWluICogdGhpcy5fcnVsZXMuaGlnaGVyUmF0ZTtcbiAgICAgICAgICAgICAgICB0YXggKz0gaGlnaGVyVGF4O1xuXG4gICAgICAgICAgICAgICAgYnJlYWtkb3ducy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYCR7YmFzaWNSYXRlUmVtYWluaW5nfWAsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAnQWJvdmUnLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLl9ydWxlcy5oaWdoZXJSYXRlLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IGhpZ2hlclRheCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlclRheCA9IHRheGFibGVHYWluICogdGhpcy5fcnVsZXMuaGlnaGVyUmF0ZTtcbiAgICAgICAgICAgIHRheCArPSBoaWdoZXJUYXg7XG5cbiAgICAgICAgICAgIGJyZWFrZG93bnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgICAgIHRvOiAnQWJvdmUnLFxuICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMuX3J1bGVzLmhpZ2hlclJhdGUsXG4gICAgICAgICAgICAgICAgYW1vdW50OiBoaWdoZXJUYXgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXhhYmxlR2FpbixcbiAgICAgICAgICAgIGNhcGl0YWxHYWluVGF4OiB0YXgsXG4gICAgICAgICAgICBzb2NpYWxDb250cmlidXRpb25zOiAwLFxuICAgICAgICAgICAgbmV0SW52ZXN0bWVudEluY29tZVRheDogMCxcbiAgICAgICAgICAgIHRvdGFsVGF4OiB0YXgsXG4gICAgICAgICAgICBlZmZlY3RpdmVSYXRlOiBnYWluID4gMCA/ICh0YXggLyBnYWluKSAqIDEwMCA6IDAsXG4gICAgICAgICAgICBicmVha2Rvd25zLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2FwaXRhbC1nYWlucy91ay9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICAgIGFubnVhbEV4ZW1wdGlvbjogbnVtYmVyO1xuICAgIGJhc2ljUmF0ZTogbnVtYmVyO1xuICAgIGhpZ2hlclJhdGU6IG51bWJlcjtcbiAgICBiYXNpY1JhdGVMaW1pdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElucHV0IHtcbiAgICBjYXBpdGFsR2FpbjogbnVtYmVyO1xuICAgIHRvdGFsVGF4YWJsZUluY29tZTogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVNBQ2FwaXRhbEdhaW5zU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXBpdGFsLWdhaW5zL3VzYS9VU0FDYXBpdGFsR2FpbnNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVVNBQ2FwaXRhbEdhaW5zU2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn1cbiJdfQ==