@merchi/sdk 1.40.2 → 1.42.1

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 (171) hide show
  1. package/dist/entities/cart.js +40 -0
  2. package/dist/entities/cart.test.js +21 -0
  3. package/dist/entities/domain.js +4 -0
  4. package/dist/entities/domain.test.js +10 -0
  5. package/dist/entities/invoice.js +4 -0
  6. package/dist/entities/job.js +40 -0
  7. package/dist/entities/job.test.js +25 -0
  8. package/dist/entity.js +6 -0
  9. package/dist/request.js +11 -3
  10. package/dist/request.test.js +21 -2
  11. package/package.json +1 -1
  12. package/src/entities/cart.test.ts +23 -0
  13. package/src/entities/cart.ts +30 -0
  14. package/src/entities/domain.test.ts +14 -0
  15. package/src/entities/domain.ts +3 -0
  16. package/src/entities/invoice.ts +3 -0
  17. package/src/entities/job.test.ts +27 -0
  18. package/src/entities/job.ts +30 -0
  19. package/src/entity.ts +8 -0
  20. package/src/request.test.ts +23 -2
  21. package/src/request.ts +12 -3
  22. package/.turbo/turbo-test.log +0 -849
  23. package/coverage/clover.xml +0 -5057
  24. package/coverage/coverage-final.json +0 -133
  25. package/coverage/lcov-report/base.css +0 -224
  26. package/coverage/lcov-report/block-navigation.js +0 -87
  27. package/coverage/lcov-report/favicon.png +0 -0
  28. package/coverage/lcov-report/index.html +0 -191
  29. package/coverage/lcov-report/prettify.css +0 -1
  30. package/coverage/lcov-report/prettify.js +0 -2
  31. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  32. package/coverage/lcov-report/sorter.js +0 -210
  33. package/coverage/lcov-report/src/constants/auto_assign_production_on_actions.ts.html +0 -103
  34. package/coverage/lcov-report/src/constants/call_to_actions.ts.html +0 -127
  35. package/coverage/lcov-report/src/constants/discount_types.ts.html +0 -100
  36. package/coverage/lcov-report/src/constants/domain_types.ts.html +0 -121
  37. package/coverage/lcov-report/src/constants/errors.ts.html +0 -181
  38. package/coverage/lcov-report/src/constants/event_types.ts.html +0 -100
  39. package/coverage/lcov-report/src/constants/field_types.ts.html +0 -133
  40. package/coverage/lcov-report/src/constants/index.html +0 -551
  41. package/coverage/lcov-report/src/constants/index.ts.html +0 -238
  42. package/coverage/lcov-report/src/constants/input_types.ts.html +0 -124
  43. package/coverage/lcov-report/src/constants/inventory_statuses.ts.html +0 -103
  44. package/coverage/lcov-report/src/constants/invoice_types.ts.html +0 -100
  45. package/coverage/lcov-report/src/constants/item_types.ts.html +0 -100
  46. package/coverage/lcov-report/src/constants/job/drafting_status.ts.html +0 -106
  47. package/coverage/lcov-report/src/constants/job/index.html +0 -176
  48. package/coverage/lcov-report/src/constants/job/payment_status.ts.html +0 -106
  49. package/coverage/lcov-report/src/constants/job/production_status.ts.html +0 -121
  50. package/coverage/lcov-report/src/constants/job/shipment_status.ts.html +0 -118
  51. package/coverage/lcov-report/src/constants/job/supply_chain_request_status.ts.html +0 -103
  52. package/coverage/lcov-report/src/constants/job_priorities.ts.html +0 -103
  53. package/coverage/lcov-report/src/constants/job_status.ts.html +0 -232
  54. package/coverage/lcov-report/src/constants/job_types.ts.html +0 -133
  55. package/coverage/lcov-report/src/constants/notification_sections.ts.html +0 -124
  56. package/coverage/lcov-report/src/constants/notification_types.ts.html +0 -385
  57. package/coverage/lcov-report/src/constants/notification_urgencies.ts.html +0 -106
  58. package/coverage/lcov-report/src/constants/payment_types.ts.html +0 -115
  59. package/coverage/lcov-report/src/constants/platform.ts.html +0 -103
  60. package/coverage/lcov-report/src/constants/product_types.ts.html +0 -163
  61. package/coverage/lcov-report/src/constants/rights.ts.html +0 -100
  62. package/coverage/lcov-report/src/constants/robots_meta_directives.ts.html +0 -118
  63. package/coverage/lcov-report/src/constants/roles.ts.html +0 -223
  64. package/coverage/lcov-report/src/constants/shipment_companies.ts.html +0 -142
  65. package/coverage/lcov-report/src/constants/shipment_services.ts.html +0 -94
  66. package/coverage/lcov-report/src/constants/system_roles.ts.html +0 -94
  67. package/coverage/lcov-report/src/constants/theme_status.ts.html +0 -100
  68. package/coverage/lcov-report/src/constants/user_types.ts.html +0 -136
  69. package/coverage/lcov-report/src/constants/white_label_accessibilities.ts.html +0 -103
  70. package/coverage/lcov-report/src/cookie.ts.html +0 -133
  71. package/coverage/lcov-report/src/entities/address.ts.html +0 -280
  72. package/coverage/lcov-report/src/entities/agent_conversation.ts.html +0 -202
  73. package/coverage/lcov-report/src/entities/agent_skill.ts.html +0 -382
  74. package/coverage/lcov-report/src/entities/agent_skill_approval.ts.html +0 -163
  75. package/coverage/lcov-report/src/entities/agent_skill_version.ts.html +0 -277
  76. package/coverage/lcov-report/src/entities/agent_token_usage.ts.html +0 -349
  77. package/coverage/lcov-report/src/entities/assignment.ts.html +0 -382
  78. package/coverage/lcov-report/src/entities/automatic_payment_relationship.ts.html +0 -172
  79. package/coverage/lcov-report/src/entities/bank.ts.html +0 -220
  80. package/coverage/lcov-report/src/entities/cart.ts.html +0 -391
  81. package/coverage/lcov-report/src/entities/cart_item.ts.html +0 -340
  82. package/coverage/lcov-report/src/entities/cart_shipment_group.ts.html +0 -148
  83. package/coverage/lcov-report/src/entities/cart_shipment_quote.ts.html +0 -184
  84. package/coverage/lcov-report/src/entities/category.ts.html +0 -262
  85. package/coverage/lcov-report/src/entities/company.ts.html +0 -1276
  86. package/coverage/lcov-report/src/entities/company_invitation.ts.html +0 -184
  87. package/coverage/lcov-report/src/entities/country_tax.ts.html +0 -223
  88. package/coverage/lcov-report/src/entities/discount.ts.html +0 -235
  89. package/coverage/lcov-report/src/entities/discount_group.ts.html +0 -214
  90. package/coverage/lcov-report/src/entities/domain.ts.html +0 -3349
  91. package/coverage/lcov-report/src/entities/domain_chat_settings.ts.html +0 -331
  92. package/coverage/lcov-report/src/entities/domain_invitation.ts.html +0 -193
  93. package/coverage/lcov-report/src/entities/domain_tag.ts.html +0 -211
  94. package/coverage/lcov-report/src/entities/draft.ts.html +0 -322
  95. package/coverage/lcov-report/src/entities/draft_comment.ts.html +0 -274
  96. package/coverage/lcov-report/src/entities/draft_preview.ts.html +0 -196
  97. package/coverage/lcov-report/src/entities/draft_preview_layer.ts.html +0 -148
  98. package/coverage/lcov-report/src/entities/draft_template.ts.html +0 -328
  99. package/coverage/lcov-report/src/entities/email_address.ts.html +0 -157
  100. package/coverage/lcov-report/src/entities/email_counter.ts.html +0 -145
  101. package/coverage/lcov-report/src/entities/enrolled_domain.ts.html +0 -205
  102. package/coverage/lcov-report/src/entities/exchange_rate.ts.html +0 -151
  103. package/coverage/lcov-report/src/entities/file.ts.html +0 -580
  104. package/coverage/lcov-report/src/entities/index.html +0 -1271
  105. package/coverage/lcov-report/src/entities/internal_tag.ts.html +0 -238
  106. package/coverage/lcov-report/src/entities/inventory.ts.html +0 -274
  107. package/coverage/lcov-report/src/entities/inventory_group.ts.html +0 -193
  108. package/coverage/lcov-report/src/entities/inventory_unit_variation.ts.html +0 -172
  109. package/coverage/lcov-report/src/entities/invoice.ts.html +0 -661
  110. package/coverage/lcov-report/src/entities/item.ts.html +0 -262
  111. package/coverage/lcov-report/src/entities/job.ts.html +0 -1288
  112. package/coverage/lcov-report/src/entities/job_comment.ts.html +0 -244
  113. package/coverage/lcov-report/src/entities/job_note.ts.html +0 -205
  114. package/coverage/lcov-report/src/entities/job_operation_log.ts.html +0 -208
  115. package/coverage/lcov-report/src/entities/matching_inventory.ts.html +0 -172
  116. package/coverage/lcov-report/src/entities/notification.ts.html +0 -403
  117. package/coverage/lcov-report/src/entities/payment.ts.html +0 -316
  118. package/coverage/lcov-report/src/entities/payment_device.ts.html +0 -175
  119. package/coverage/lcov-report/src/entities/phone_number.ts.html +0 -193
  120. package/coverage/lcov-report/src/entities/product.ts.html +0 -1543
  121. package/coverage/lcov-report/src/entities/product_form.ts.html +0 -238
  122. package/coverage/lcov-report/src/entities/product_form_version.ts.html +0 -238
  123. package/coverage/lcov-report/src/entities/product_review.ts.html +0 -748
  124. package/coverage/lcov-report/src/entities/production_comment.ts.html +0 -244
  125. package/coverage/lcov-report/src/entities/quote.ts.html +0 -505
  126. package/coverage/lcov-report/src/entities/quote_item.ts.html +0 -298
  127. package/coverage/lcov-report/src/entities/reminder.ts.html +0 -307
  128. package/coverage/lcov-report/src/entities/session.ts.html +0 -169
  129. package/coverage/lcov-report/src/entities/shipment.ts.html +0 -673
  130. package/coverage/lcov-report/src/entities/shipment_item.ts.html +0 -130
  131. package/coverage/lcov-report/src/entities/shipment_item_fulfillment.ts.html +0 -130
  132. package/coverage/lcov-report/src/entities/shipment_log.ts.html +0 -196
  133. package/coverage/lcov-report/src/entities/shipment_method.ts.html +0 -268
  134. package/coverage/lcov-report/src/entities/shipment_method_variation.ts.html +0 -202
  135. package/coverage/lcov-report/src/entities/short_url.ts.html +0 -193
  136. package/coverage/lcov-report/src/entities/subscription_plan.ts.html +0 -304
  137. package/coverage/lcov-report/src/entities/supply_domain.ts.html +0 -166
  138. package/coverage/lcov-report/src/entities/support_conversation.ts.html +0 -280
  139. package/coverage/lcov-report/src/entities/support_message.ts.html +0 -175
  140. package/coverage/lcov-report/src/entities/system_role.ts.html +0 -136
  141. package/coverage/lcov-report/src/entities/theme.ts.html +0 -331
  142. package/coverage/lcov-report/src/entities/theme_css_setting.ts.html +0 -154
  143. package/coverage/lcov-report/src/entities/user.ts.html +0 -1369
  144. package/coverage/lcov-report/src/entities/user_company.ts.html +0 -166
  145. package/coverage/lcov-report/src/entities/variation.ts.html +0 -277
  146. package/coverage/lcov-report/src/entities/variation_field.ts.html +0 -889
  147. package/coverage/lcov-report/src/entities/variation_fields_option.ts.html +0 -406
  148. package/coverage/lcov-report/src/entities/variation_option.ts.html +0 -259
  149. package/coverage/lcov-report/src/entities/variations_group.ts.html +0 -208
  150. package/coverage/lcov-report/src/entity.ts.html +0 -3379
  151. package/coverage/lcov-report/src/index.html +0 -221
  152. package/coverage/lcov-report/src/index.ts.html +0 -652
  153. package/coverage/lcov-report/src/merchi.ts.html +0 -1420
  154. package/coverage/lcov-report/src/pricing/discount.ts.html +0 -136
  155. package/coverage/lcov-report/src/pricing/estimate.ts.html +0 -1015
  156. package/coverage/lcov-report/src/pricing/index.html +0 -206
  157. package/coverage/lcov-report/src/pricing/index.ts.html +0 -106
  158. package/coverage/lcov-report/src/pricing/inventory.ts.html +0 -352
  159. package/coverage/lcov-report/src/pricing/matrix.ts.html +0 -736
  160. package/coverage/lcov-report/src/pricing/round.ts.html +0 -166
  161. package/coverage/lcov-report/src/pricing/visibility.ts.html +0 -418
  162. package/coverage/lcov-report/src/request.ts.html +0 -673
  163. package/coverage/lcov-report/src/test_util.ts.html +0 -139
  164. package/coverage/lcov-report/src/toasts.ts.html +0 -187
  165. package/coverage/lcov-report/src/util/float.ts.html +0 -121
  166. package/coverage/lcov-report/src/util/index.html +0 -161
  167. package/coverage/lcov-report/src/util/index.ts.html +0 -106
  168. package/coverage/lcov-report/src/util/query_string.ts.html +0 -124
  169. package/coverage/lcov-report/src/util/validation.ts.html +0 -91
  170. package/coverage/lcov-report/src/uuid.ts.html +0 -109
  171. package/coverage/lcov.info +0 -7758
@@ -1,1015 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/pricing/estimate.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pricing</a> estimate.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">98.36% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>180/183</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">88.07% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>96/109</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>23/23</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>136/136</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line medium'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">4x</span>
381
- <span class="cline-any cline-yes">4x</span>
382
- <span class="cline-any cline-yes">4x</span>
383
- <span class="cline-any cline-yes">4x</span>
384
- <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-yes">103x</span>
389
- <span class="cline-any cline-yes">103x</span>
390
- <span class="cline-any cline-neutral">&nbsp;</span>
391
- <span class="cline-any cline-neutral">&nbsp;</span>
392
- <span class="cline-any cline-neutral">&nbsp;</span>
393
- <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-yes">8x</span>
396
- <span class="cline-any cline-yes">14x</span>
397
- <span class="cline-any cline-yes">7x</span>
398
- <span class="cline-any cline-yes">7x</span>
399
- <span class="cline-any cline-yes">7x</span>
400
- <span class="cline-any cline-yes">7x</span>
401
- <span class="cline-any cline-yes">7x</span>
402
- <span class="cline-any cline-yes">7x</span>
403
- <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-neutral">&nbsp;</span>
406
- <span class="cline-any cline-yes">83x</span>
407
- <span class="cline-any cline-yes">83x</span>
408
- <span class="cline-any cline-yes">83x</span>
409
- <span class="cline-any cline-yes">1x</span>
410
- <span class="cline-any cline-neutral">&nbsp;</span>
411
- <span class="cline-any cline-yes">83x</span>
412
- <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-neutral">&nbsp;</span>
414
- <span class="cline-any cline-neutral">&nbsp;</span>
415
- <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-yes">42x</span>
419
- <span class="cline-any cline-yes">42x</span>
420
- <span class="cline-any cline-yes">14x</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-yes">42x</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-neutral">&nbsp;</span>
426
- <span class="cline-any cline-neutral">&nbsp;</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-yes">42x</span>
430
- <span class="cline-any cline-yes">42x</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-yes">42x</span>
433
- <span class="cline-any cline-yes">15x</span>
434
- <span class="cline-any cline-yes">2x</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-yes">14x</span>
437
- <span class="cline-any cline-yes">14x</span>
438
- <span class="cline-any cline-yes">14x</span>
439
- <span class="cline-any cline-neutral">&nbsp;</span>
440
- <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-yes">27x</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-yes">43x</span>
444
- <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-yes">45x</span>
448
- <span class="cline-any cline-yes">32x</span>
449
- <span class="cline-any cline-yes">21x</span>
450
- <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-yes">11x</span>
454
- <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-neutral">&nbsp;</span>
459
- <span class="cline-any cline-neutral">&nbsp;</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-yes">8x</span>
467
- <span class="cline-any cline-yes">8x</span>
468
- <span class="cline-any cline-yes">8x</span>
469
- <span class="cline-any cline-yes">1x</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-yes">7x</span>
472
- <span class="cline-any cline-yes">7x</span>
473
- <span class="cline-any cline-neutral">&nbsp;</span>
474
- <span class="cline-any cline-neutral">&nbsp;</span>
475
- <span class="cline-any cline-neutral">&nbsp;</span>
476
- <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-neutral">&nbsp;</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">7x</span>
480
- <span class="cline-any cline-neutral">&nbsp;</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-yes">7x</span>
487
- <span class="cline-any cline-neutral">&nbsp;</span>
488
- <span class="cline-any cline-neutral">&nbsp;</span>
489
- <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-neutral">&nbsp;</span>
492
- <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-yes">7x</span>
495
- <span class="cline-any cline-neutral">&nbsp;</span>
496
- <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-yes">7x</span>
503
- <span class="cline-any cline-neutral">&nbsp;</span>
504
- <span class="cline-any cline-yes">7x</span>
505
- <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-neutral">&nbsp;</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-yes">7x</span>
510
- <span class="cline-any cline-yes">7x</span>
511
- <span class="cline-any cline-yes">7x</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-yes">7x</span>
514
- <span class="cline-any cline-yes">7x</span>
515
- <span class="cline-any cline-yes">7x</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-yes">7x</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-yes">53x</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-yes">53x</span>
528
- <span class="cline-any cline-yes">8x</span>
529
- <span class="cline-any cline-neutral">&nbsp;</span>
530
- <span class="cline-any cline-yes">45x</span>
531
- <span class="cline-any cline-yes">17x</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-yes">29x</span>
534
- <span class="cline-any cline-yes">28x</span>
535
- <span class="cline-any cline-yes">19x</span>
536
- <span class="cline-any cline-yes">19x</span>
537
- <span class="cline-any cline-yes">19x</span>
538
- <span class="cline-any cline-yes">26x</span>
539
- <span class="cline-any cline-yes">26x</span>
540
- <span class="cline-any cline-yes">26x</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-yes">20x</span>
543
- <span class="cline-any cline-yes">20x</span>
544
- <span class="cline-any cline-yes">20x</span>
545
- <span class="cline-any cline-yes">19x</span>
546
- <span class="cline-any cline-yes">19x</span>
547
- <span class="cline-any cline-yes">20x</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-yes">19x</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-yes">9x</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-yes">4x</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-yes">83x</span>
562
- <span class="cline-any cline-yes">1x</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-yes">82x</span>
566
- <span class="cline-any cline-yes">82x</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-yes">82x</span>
577
- <span class="cline-any cline-yes">82x</span>
578
- <span class="cline-any cline-yes">49x</span>
579
- <span class="cline-any cline-yes">49x</span>
580
- <span class="cline-any cline-yes">28x</span>
581
- <span class="cline-any cline-yes">28x</span>
582
- <span class="cline-any cline-yes">28x</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-yes">28x</span>
585
- <span class="cline-any cline-yes">49x</span>
586
- <span class="cline-any cline-yes">49x</span>
587
- <span class="cline-any cline-yes">49x</span>
588
- <span class="cline-any cline-yes">49x</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-yes">49x</span>
593
- <span class="cline-any cline-yes">13x</span>
594
- <span class="cline-any cline-yes">13x</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-yes">36x</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-yes">36x</span>
605
- <span class="cline-any cline-yes">36x</span>
606
- <span class="cline-any cline-yes">20x</span>
607
- <span class="cline-any cline-yes">18x</span>
608
- <span class="cline-any cline-yes">18x</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-yes">36x</span>
611
- <span class="cline-any cline-yes">36x</span>
612
- <span class="cline-any cline-yes">36x</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-yes">28x</span>
616
- <span class="cline-any cline-yes">48x</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-yes">28x</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-yes">28x</span>
627
- <span class="cline-any cline-yes">3x</span>
628
- <span class="cline-any cline-yes">2x</span>
629
- <span class="cline-any cline-yes">4x</span>
630
- <span class="cline-any cline-yes">2x</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-yes">54x</span>
634
- <span class="cline-any cline-yes">54x</span>
635
- <span class="cline-any cline-yes">54x</span>
636
- <span class="cline-any cline-yes">54x</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-yes">54x</span>
640
- <span class="cline-any cline-yes">54x</span>
641
- <span class="cline-any cline-yes">35x</span>
642
- <span class="cline-any cline-yes">33x</span>
643
- <span class="cline-any cline-yes">33x</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-yes">82x</span>
651
- <span class="cline-any cline-yes">82x</span>
652
- <span class="cline-any cline-yes">5x</span>
653
- <span class="cline-any cline-yes">1x</span>
654
- <span class="cline-any cline-yes">3x</span>
655
- <span class="cline-any cline-yes">2x</span>
656
- <span class="cline-any cline-yes">2x</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-yes">4x</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-yes">82x</span>
669
- <span class="cline-any cline-yes">82x</span>
670
- <span class="cline-any cline-yes">82x</span>
671
- <span class="cline-any cline-yes">82x</span>
672
- <span class="cline-any cline-yes">82x</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-yes">49x</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
687
- PricingRules, PricingField, PricingOption, Selections, FieldSelection,
688
- QuoteResult, UnsupportedResult, DiscountGroup,
689
- } from './types.js';
690
- import { applyDiscount } from './discount.js';
691
- import { roundHalfEven } from './round.js';
692
- import { resolveVisibleFields } from './visibility.js';
693
- import { FieldType } from '../constants/field_types.js';
694
- &nbsp;
695
- /** Form inputs often supply quantities as strings. Coerce before any arithmetic
696
- * so `reduce((a,b)=&gt;a+b)` cannot concatenate ("100"+"1" → "01001" → 1001). */
697
- function toQuantity(value: unknown): number {
698
- const n = Number(value);
699
- return Number.isFinite(n) ? n : 0;
700
- }
701
- &nbsp;
702
- function parseAreaMm(
703
- value: string | number | null | undefined
704
- ): { heightMm: number; widthMm: number } | null {
705
- if (value === undefined || value === null || value === '') return null;
706
- const parts = String(value).split(',').map((p) =&gt; p.trim());
707
- <span class="missing-if-branch" title="if path not taken" >I</span>if (parts.length !== 2) <span class="cstat-no" title="statement not covered" >return null;</span>
708
- const heightMm = Number(parts[0]);
709
- const widthMm = Number(parts[1]);
710
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!Number.isFinite(heightMm) || !Number.isFinite(widthMm)) <span class="cstat-no" title="statement not covered" >return null;</span>
711
- <span class="missing-if-branch" title="if path not taken" >I</span>if (heightMm &lt;= 0 || widthMm &lt;= 0) <span class="cstat-no" title="statement not covered" >return null;</span>
712
- return { heightMm, widthMm };
713
- }
714
- &nbsp;
715
- function unitPriceAt(rules: PricingRules, qty: number): number {
716
- let unitPrice = applyDiscount(rules.product.unitPrice, qty, rules.product.discountGroup);
717
- const mop = rules.product.minimumPrice;
718
- if (qty &gt; 0 &amp;&amp; mop &amp;&amp; unitPrice * qty &lt; mop) {
719
- unitPrice = mop / qty;
720
- }
721
- return unitPrice;
722
- }
723
- &nbsp;
724
- function variationSetupCost(
725
- source: { variationCost: number; variationCostDiscountGroup: DiscountGroup | null },
726
- totalQty: number
727
- ): number {
728
- let cost = source.variationCost;
729
- if (source.variationCostDiscountGroup) {
730
- cost = applyDiscount(cost, totalQty, source.variationCostDiscountGroup);
731
- }
732
- return roundHalfEven(cost, 3);
733
- }
734
- &nbsp;
735
- function variationUnitCosts(
736
- source: { variationUnitCost: number; variationUnitCostDiscountGroup: DiscountGroup | null },
737
- groupQuantities: number[]
738
- ): number[] {
739
- const uc = source.variationUnitCost;
740
- const group = source.variationUnitCostDiscountGroup;
741
- let list: number[];
742
- if (group) {
743
- if (group.groupRestricted) {
744
- list = groupQuantities.map((q) =&gt; applyDiscount(uc, q, group));
745
- } else {
746
- const total = groupQuantities.reduce((a, b) =&gt; a + b, 0);
747
- const discounted = applyDiscount(uc, total, group);
748
- list = groupQuantities.map(() =&gt; discounted);
749
- }
750
- } else {
751
- list = groupQuantities.map(() =&gt; uc);
752
- }
753
- return list.map((c) =&gt; roundHalfEven(c, 3));
754
- }
755
- &nbsp;
756
- function isEmpty(field: PricingField, sel: FieldSelection | undefined): boolean {
757
- if (!sel) return true;
758
- if (field.isSelectable) {
759
- return !sel.selectedOptionIds || sel.selectedOptionIds.length === 0;
760
- }
761
- // Server `is_empty` non-selectable branch is `return not self.value`, so
762
- // numeric 0 is empty (but string '0' stays non-empty, since `not '0'` is False).
763
- return (
764
- sel.value === undefined ||
765
- sel.value === null ||
766
- sel.value === '' ||
767
- sel.value === 0
768
- );
769
- }
770
- &nbsp;
771
- function areaCostFactor(
772
- field: PricingField,
773
- sel: FieldSelection | undefined,
774
- groupQuantities: number[]
775
- ): { setup: number; unitList: number[] } {
776
- const n = groupQuantities.length;
777
- const parsed = parseAreaMm(sel<span class="branch-0 cbranch-no" title="branch not covered" >?.v</span>alue ?? <span class="branch-1 cbranch-no" title="branch not covered" >null)</span>;
778
- if (!parsed) {
779
- return { setup: 0, unitList: new Array(n).fill(0) };
780
- }
781
- const totalQty = groupQuantities.reduce((a, b) =&gt; a + b, 0);
782
- const heightSetup = variationSetupCost(
783
- {
784
- variationCost: field.heightVariationCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
785
- variationCostDiscountGroup: field.heightVariationCostDiscountGroup ?? null,
786
- },
787
- totalQty
788
- );
789
- const widthSetup = variationSetupCost(
790
- {
791
- variationCost: field.widthVariationCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
792
- variationCostDiscountGroup: field.widthVariationCostDiscountGroup ?? null,
793
- },
794
- totalQty
795
- );
796
- const heightUcs = variationUnitCosts(
797
- {
798
- variationUnitCost: field.heightVariationUnitCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
799
- variationUnitCostDiscountGroup:
800
- field.heightVariationUnitCostDiscountGroup ?? null,
801
- },
802
- groupQuantities
803
- );
804
- const widthUcs = variationUnitCosts(
805
- {
806
- variationUnitCost: field.widthVariationUnitCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
807
- variationUnitCostDiscountGroup:
808
- field.widthVariationUnitCostDiscountGroup ?? null,
809
- },
810
- groupQuantities
811
- );
812
- const areaUnit = (field.areaUnit || 'mm').toLowerCase();
813
- const mmPerUnit =
814
- areaUnit === 'm' ? <span class="branch-0 cbranch-no" title="branch not covered" >1000</span>
815
- : areaUnit === 'cm' ? <span class="branch-0 cbranch-no" title="branch not covered" >10</span>
816
- : areaUnit === 'in' || areaUnit === 'inch' || areaUnit === 'inches' ? <span class="branch-0 cbranch-no" title="branch not covered" >25.4</span>
817
- : areaUnit === 'ft' || areaUnit === 'foot' || areaUnit === 'feet' ? <span class="branch-0 cbranch-no" title="branch not covered" >304.8</span>
818
- : 1;
819
- const heightU = parsed.heightMm / mmPerUnit;
820
- const widthU = parsed.widthMm / mmPerUnit;
821
- const area = heightU * widthU;
822
- // onceOff/unit = rateH × rateW × height_u × width_u (in field areaUnit)
823
- const setup = roundHalfEven(heightSetup * widthSetup * area, 3);
824
- const unitList = heightUcs.map((hu, i) =&gt;
825
- roundHalfEven(hu * widthUcs[i] * area, 3)
826
- );
827
- return { setup, unitList };
828
- }
829
- &nbsp;
830
- function costFactor(
831
- field: PricingField,
832
- sel: FieldSelection | undefined,
833
- groupQuantities: number[]
834
- ): { setup: number; unitList: number[] } {
835
- const n = groupQuantities.length;
836
- // Coerce: JSON/APIs occasionally deliver fieldType as a string.
837
- if (Number(field.fieldType) === FieldType.AREA) {
838
- return areaCostFactor(field, sel, groupQuantities);
839
- }
840
- if (isEmpty(field, sel)) {
841
- return { setup: 0, unitList: new Array(n).fill(0) };
842
- }
843
- const totalQty = groupQuantities.reduce((a, b) =&gt; a + b, 0);
844
- if (field.isSelectable) {
845
- let setup = 0;
846
- const unitList = new Array(n).fill(0);
847
- const optById = new Map&lt;number, PricingOption&gt;();
848
- for (const o of field.options) {
849
- optById.set(o.id, o);
850
- if (o.originalId != null) optById.set(o.originalId, o);
851
- }
852
- for (const optId of sel!.selectedOptionIds!) {
853
- const opt = optById.get(optId);
854
- if (!opt) continue;
855
- setup += variationSetupCost(opt, totalQty);
856
- const ucs = variationUnitCosts(opt, groupQuantities);
857
- for (let i = 0; i &lt; n; i++) unitList[i] += ucs[i];
858
- }
859
- return { setup, unitList };
860
- }
861
- return {
862
- setup: variationSetupCost(field, totalQty),
863
- unitList: variationUnitCosts(field, groupQuantities),
864
- };
865
- }
866
- &nbsp;
867
- export function estimateQuote(
868
- rules: PricingRules,
869
- selections: Selections
870
- ): QuoteResult | UnsupportedResult {
871
- if (rules.unsupported) {
872
- return { unsupported: rules.unsupported };
873
- }
874
- &nbsp;
875
- const groupCosts: number[] = [];
876
- let cost = 0;
877
- let costPerUnit: number;
878
- let groupQuantities: number[];
879
- &nbsp;
880
- // Mirror the server's `update_group_variations_cost_and_job_cost`
881
- // (jobs.py ~3321): the group-vs-single branch keys off whether the *job*
882
- // actually has variation groups (`if self.variations_groups:`), NOT the
883
- // product's `hasGroups` capability. A group-capable product with no groups
884
- // submitted is priced as a single non-group job (the server's `else` branch
885
- // sets `group_quantities = [self.quantity or 0]`).
886
- const groups = selections.groups || [];
887
- if (groups.length &gt; 0) {
888
- groupQuantities = groups.map((g) =&gt; toQuantity(g.quantity));
889
- const totalQty = groupQuantities.reduce((a, b) =&gt; a + b, 0);
890
- const restricted = Boolean(rules.product.discountGroup?.groupRestricted);
891
- const baseUnitPrice = unitPriceAt(rules, totalQty);
892
- const perGroupCpu: number[] = [];
893
- &nbsp;
894
- for (let gi = 0; gi &lt; groups.length; gi++) {
895
- const group = groups[gi];
896
- const gQty = groupQuantities[gi];
897
- const cpu = restricted ? unitPriceAt(rules, gQty) : baseUnitPrice;
898
- perGroupCpu.push(cpu);
899
- // Server `VariationsGroups.update_cost` (variations_groups.py ~238):
900
- // `if not self.quantity: self.group_cost = 0; return` — a zero-qty group
901
- // contributes exactly 0 and adds NO field/variation costs.
902
- if (!gQty) {
903
- groupCosts.push(0);
904
- continue;
905
- }
906
- // A group's field visibility is scoped to that group's own selections
907
- // plus the job-level (independent) selections — NOT other groups'
908
- // (server `VariationsGroups.selected_options` = group.variations +
909
- // job.variations, variations_groups.py ~252).
910
- const groupVisible = resolveVisibleFields(rules, {
911
- fieldValues: selections.fieldValues,
912
- groups: [group],
913
- });
914
- let groupVariationCost = 0;
915
- for (const field of rules.groupFields) {
916
- if (!groupVisible.has(field.id)) continue;
917
- const { setup, unitList } = costFactor(field, group.fieldValues[field.id], [gQty]);
918
- groupVariationCost += setup + unitList[0] * gQty;
919
- }
920
- const groupCost = gQty * cpu + groupVariationCost;
921
- groupCosts.push(groupCost);
922
- cost += groupCost;
923
- }
924
- &nbsp;
925
- costPerUnit = totalQty &gt; 0
926
- ? perGroupCpu.reduce((acc, cpu, i) =&gt; acc + cpu * groupQuantities[i], 0) / totalQty
927
- : baseUnitPrice;
928
- &nbsp;
929
- // Independent (job-level) field visibility is scoped to independent
930
- // selections only (server `Jobs.selected_options` = job.variations,
931
- // jobs.py ~1392), so other groups' selections never reveal them.
932
- const independentVisible = resolveVisibleFields(rules, {
933
- quantity: selections.quantity,
934
- fieldValues: selections.fieldValues,
935
- });
936
- for (const field of rules.fields) {
937
- if (!independentVisible.has(field.id)) continue;
938
- const { setup, unitList } = costFactor(field, selections.fieldValues[field.id], groupQuantities);
939
- const unitTotal = unitList.reduce((acc, uc, i) =&gt; acc + uc * groupQuantities[i], 0);
940
- cost += setup + unitTotal;
941
- }
942
- } else {
943
- const qty = toQuantity(selections.quantity);
944
- groupQuantities = [qty];
945
- costPerUnit = unitPriceAt(rules, qty);
946
- cost = costPerUnit * qty;
947
- // No groups: single-job scope (resolveVisibleFields with no groups uses
948
- // only the top-level selections and considers only independent fields).
949
- const visible = resolveVisibleFields(rules, selections);
950
- for (const field of rules.fields) {
951
- if (!visible.has(field.id)) continue;
952
- const { setup, unitList } = costFactor(field, selections.fieldValues[field.id], groupQuantities);
953
- cost += setup + unitList[0] * qty;
954
- }
955
- }
956
- &nbsp;
957
- // Server `Jobs.apply_product_setup_price`: product setup fee once per job,
958
- // or once per non-empty group when setupPerGroup is true. With no groups the
959
- // job is a single group, so setup is charged once either way.
960
- const setupPrice = rules.product.setupPrice || 0;
961
- if (setupPrice) {
962
- if (groups.length &gt; 0 &amp;&amp; rules.product.setupPerGroup) {
963
- for (let gi = 0; gi &lt; groups.length; gi++) {
964
- if (!groupQuantities[gi]) continue;
965
- groupCosts[gi] += setupPrice;
966
- cost += setupPrice;
967
- }
968
- } else {
969
- cost += setupPrice;
970
- }
971
- }
972
- &nbsp;
973
- // Server `Jobs.update_cost` (jobs.py ~3452-3454) accumulates `self.cost` at
974
- // full precision and computes `self.tax_amount = tax(self.cost, ...)` on the
975
- // UNROUNDED cost (money_protocol.py `tax` does NOT round). `cost` and
976
- // `taxAmount` are then rounded INDEPENDENTLY at serialization to 2dp
977
- // (jobs.py ~2169-2171). So tax must be derived from the unrounded cost.
978
- const unroundedCost = cost;
979
- const roundedCost = roundHalfEven(unroundedCost, 2);
980
- const unroundedTax = (unroundedCost * rules.taxPercent) / 100;
981
- const taxAmount = roundHalfEven(unroundedTax, 2);
982
- return {
983
- costPerUnit: roundHalfEven(costPerUnit, 3),
984
- cost: roundedCost,
985
- taxAmount,
986
- // `totalCost` mirrors `Jobs.all_total_cost` = `self.cost + self.tax_amount`
987
- // (jobs.py ~1724), serialized UNROUNDED at jobs.py ~1899. We round to 3dp to
988
- // strip float noise while matching the server's effective Numeric scale.
989
- totalCost: roundHalfEven(unroundedCost + unroundedTax, 3),
990
- // `result["groupCost"] = self.group_cost` is serialized UNROUNDED
991
- // (variations_groups.py ~154); round to 3dp to match the Numeric scale.
992
- groupCosts: groupCosts.map((c) =&gt; roundHalfEven(c, 3)),
993
- currency: rules.currency,
994
- };
995
- }
996
- &nbsp;</pre></td></tr></table></pre>
997
-
998
- <div class='push'></div><!-- for sticky footer -->
999
- </div><!-- /wrapper -->
1000
- <div class='footer quiet pad2 space-top1 center small'>
1001
- Code coverage generated by
1002
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1003
- at 2026-09-17T00:23:15.194Z
1004
- </div>
1005
- <script src="../../prettify.js"></script>
1006
- <script>
1007
- window.onload = function () {
1008
- prettyPrint();
1009
- };
1010
- </script>
1011
- <script src="../../sorter.js"></script>
1012
- <script src="../../block-navigation.js"></script>
1013
- </body>
1014
- </html>
1015
-