@senior-gestao-empresarial/erpx-components 0.0.0-develop-3bab051d

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 (382) hide show
  1. package/bundles/senior-gestao-empresarial-erpx-components.umd.js +37665 -0
  2. package/bundles/senior-gestao-empresarial-erpx-components.umd.js.map +1 -0
  3. package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js +17 -0
  4. package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js.map +1 -0
  5. package/components/breadcrumb/breadcrumb.component.d.ts +21 -0
  6. package/components/breadcrumb/breadcrumb.module.d.ts +2 -0
  7. package/components/breadcrumb/index.d.ts +2 -0
  8. package/components/focus/focus.service.d.ts +4 -0
  9. package/components/lote-serie/erp-lote-serie.component.d.ts +183 -0
  10. package/components/lote-serie/erp-lote-serie.module.d.ts +2 -0
  11. package/components/lote-serie/erp-lote-serie.service.d.ts +137 -0
  12. package/components/lote-serie/index.d.ts +2 -0
  13. package/components/rateio-editor/erp-rateio-editor.component.d.ts +202 -0
  14. package/components/rateio-editor/erp-rateio-editor.converter.d.ts +18 -0
  15. package/components/rateio-editor/erp-rateio-editor.module.d.ts +2 -0
  16. package/components/rateio-editor/erp-rateio-editor.service.d.ts +17 -0
  17. package/components/rateio-editor/erp-rateio-editor.types.d.ts +171 -0
  18. package/components/rateio-editor/index.d.ts +4 -0
  19. package/components/resumo/erp-resumo.component.d.ts +17 -0
  20. package/components/resumo/erp-resumo.module.d.ts +2 -0
  21. package/components/resumo/erp-resumo.service.d.ts +2 -0
  22. package/components/resumo/index.d.ts +2 -0
  23. package/components/tributos/calculators/effective-tax-rate-calculator.d.ts +34 -0
  24. package/components/tributos/calculators/gross-amount-calculator.d.ts +20 -0
  25. package/components/tributos/calculators/tax-amount-calculator.d.ts +54 -0
  26. package/components/tributos/erp-tributos.component.d.ts +215 -0
  27. package/components/tributos/erp-tributos.module.d.ts +2 -0
  28. package/components/tributos/erp-tributos.service.d.ts +10 -0
  29. package/components/tributos/erp-tributos.types.d.ts +286 -0
  30. package/components/tributos/index.d.ts +12 -0
  31. package/components/tributos/mappings/enum-tip-imp-cst-mapping.d.ts +2 -0
  32. package/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.d.ts +15 -0
  33. package/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.d.ts +28 -0
  34. package/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.d.ts +30 -0
  35. package/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.d.ts +22 -0
  36. package/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.d.ts +22 -0
  37. package/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.d.ts +5 -0
  38. package/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.d.ts +5 -0
  39. package/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.d.ts +8 -0
  40. package/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.d.ts +8 -0
  41. package/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.d.ts +5 -0
  42. package/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.d.ts +8 -0
  43. package/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.d.ts +5 -0
  44. package/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.d.ts +6 -0
  45. package/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.d.ts +5 -0
  46. package/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.d.ts +5 -0
  47. package/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.d.ts +8 -0
  48. package/components/tributos/rules/rules.service.d.ts +19 -0
  49. package/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.d.ts +16 -0
  50. package/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.d.ts +12 -0
  51. package/components/tributos/rules/status/registries/purchase-order-status-rules.registry.d.ts +12 -0
  52. package/components/tributos/rules/status/registries/sale-order-status-rules.registry.d.ts +8 -0
  53. package/components/tributos/rules/status/registries/status-rules.registry.d.ts +15 -0
  54. package/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.d.ts +5 -0
  55. package/components/tributos/rules/status/rules/tax-classification-status-rule.d.ts +5 -0
  56. package/components/tributos/rules/status/rules/tax-rate-status-rule.d.ts +5 -0
  57. package/components/tributos/rules/status/rules/taxable-base-status-rule.d.ts +5 -0
  58. package/components/tributos/rules/types/available-fields.d.ts +2 -0
  59. package/components/tributos/rules/types/available-taxes.d.ts +1 -0
  60. package/components/tributos/rules/types/field-calculation-rule-mapping.d.ts +6 -0
  61. package/components/tributos/rules/types/field-rule-mapping.d.ts +6 -0
  62. package/components/tributos/rules/types/field-status-rule-mapping.d.ts +6 -0
  63. package/components/tributos/rules/types/rule-payload.d.ts +9 -0
  64. package/components/tributos/rules/types/schemas/incoming-invoice.schema.d.ts +235 -0
  65. package/components/tributos/rules/types/schemas/outgoing-invoice.schema.d.ts +349 -0
  66. package/components/tributos/rules/types/schemas/purchase-order.schema.d.ts +26 -0
  67. package/components/tributos/rules/types/schemas/sale-order.schema.d.ts +131 -0
  68. package/components/tributos/rules/types/strategies-by-document.d.ts +12 -0
  69. package/components/tributos/rules/types/strategies.d.ts +4 -0
  70. package/components/tributos/rules/types/tax-rule.d.ts +4 -0
  71. package/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.d.ts +20 -0
  72. package/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.d.ts +22 -0
  73. package/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.d.ts +14 -0
  74. package/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.d.ts +14 -0
  75. package/components/tributos/rules/validation/registries/validation-rules.registry.d.ts +15 -0
  76. package/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.d.ts +5 -0
  77. package/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.d.ts +5 -0
  78. package/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.d.ts +5 -0
  79. package/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.d.ts +5 -0
  80. package/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.d.ts +6 -0
  81. package/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.d.ts +6 -0
  82. package/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.d.ts +6 -0
  83. package/components/tributos/services/tax-rounding.service.d.ts +5 -0
  84. package/components/tributos/stores/tax.store.d.ts +10 -0
  85. package/components/tributos/tax-reform-utilities.d.ts +36 -0
  86. package/components/tributos/types/context.d.ts +7 -0
  87. package/components/tributos/types/controllership-incoming-invoice-context.d.ts +5 -0
  88. package/components/tributos/types/controllership-incoming-invoice.d.ts +3 -0
  89. package/components/tributos/types/controllership-outgoing-invoice-context.d.ts +5 -0
  90. package/components/tributos/types/controllership-outgoing-invoice.d.ts +3 -0
  91. package/components/tributos/types/credit-invoice-type.d.ts +1 -0
  92. package/components/tributos/types/debit-invoice-type.d.ts +1 -0
  93. package/components/tributos/types/group.d.ts +6 -0
  94. package/components/tributos/types/incoming-invoice-context.d.ts +5 -0
  95. package/components/tributos/types/incoming-invoice-item.d.ts +4 -0
  96. package/components/tributos/types/incoming-invoice-type.d.ts +1 -0
  97. package/components/tributos/types/incoming-invoice.d.ts +11 -0
  98. package/components/tributos/types/item-type.d.ts +1 -0
  99. package/components/tributos/types/outgoing-Invoice.d.ts +11 -0
  100. package/components/tributos/types/outgoing-invoice-context.d.ts +5 -0
  101. package/components/tributos/types/outgoing-invoice-item.d.ts +4 -0
  102. package/components/tributos/types/outgoing-invoice-type.d.ts +1 -0
  103. package/components/tributos/types/purchase-order-context.d.ts +5 -0
  104. package/components/tributos/types/purchase-order-type.d.ts +1 -0
  105. package/components/tributos/types/purchase-order.d.ts +8 -0
  106. package/components/tributos/types/sale-order-context.d.ts +5 -0
  107. package/components/tributos/types/sale-order-type.d.ts +1 -0
  108. package/components/tributos/types/sale-order.d.ts +8 -0
  109. package/components/tributos/types/tax.d.ts +8 -0
  110. package/components/utils/breakpoints.d.ts +10 -0
  111. package/components/utils/export-utils.d.ts +6 -0
  112. package/components/utils/index.d.ts +3 -0
  113. package/components/utils/loading-context.d.ts +7 -0
  114. package/components/utils/utils.d.ts +4 -0
  115. package/core/entities/entity-service.d.ts +32 -0
  116. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.d.ts +36 -0
  117. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.d.ts +40 -0
  118. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.d.ts +2 -0
  119. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.d.ts +11 -0
  120. package/core/enums/enum-classificacao-tributaria.d.ts +4 -0
  121. package/core/enums/enum-tipo-calculo-imposto.d.ts +5 -0
  122. package/core/enums/enum-tipo-documento-parametros.d.ts +7 -0
  123. package/core/enums/enum-tipo-documento.d.ts +10 -0
  124. package/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.d.ts +5 -0
  125. package/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.d.ts +8 -0
  126. package/esm2015/components/breadcrumb/breadcrumb.component.js +86 -0
  127. package/esm2015/components/breadcrumb/breadcrumb.module.js +17 -0
  128. package/esm2015/components/breadcrumb/index.js +3 -0
  129. package/esm2015/components/focus/focus.service.js +32 -0
  130. package/esm2015/components/lote-serie/erp-lote-serie.component.js +1772 -0
  131. package/esm2015/components/lote-serie/erp-lote-serie.module.js +47 -0
  132. package/esm2015/components/lote-serie/erp-lote-serie.service.js +94 -0
  133. package/esm2015/components/lote-serie/index.js +3 -0
  134. package/esm2015/components/rateio-editor/erp-rateio-editor.component.js +794 -0
  135. package/esm2015/components/rateio-editor/erp-rateio-editor.converter.js +52 -0
  136. package/esm2015/components/rateio-editor/erp-rateio-editor.module.js +40 -0
  137. package/esm2015/components/rateio-editor/erp-rateio-editor.service.js +49 -0
  138. package/esm2015/components/rateio-editor/erp-rateio-editor.types.js +5 -0
  139. package/esm2015/components/rateio-editor/index.js +4 -0
  140. package/esm2015/components/resumo/erp-resumo.component.js +19 -0
  141. package/esm2015/components/resumo/erp-resumo.module.js +25 -0
  142. package/esm2015/components/resumo/erp-resumo.service.js +13 -0
  143. package/esm2015/components/resumo/index.js +2 -0
  144. package/esm2015/components/tributos/calculators/effective-tax-rate-calculator.js +53 -0
  145. package/esm2015/components/tributos/calculators/gross-amount-calculator.js +37 -0
  146. package/esm2015/components/tributos/calculators/tax-amount-calculator.js +87 -0
  147. package/esm2015/components/tributos/erp-tributos.component.js +5176 -0
  148. package/esm2015/components/tributos/erp-tributos.module.js +33 -0
  149. package/esm2015/components/tributos/erp-tributos.service.js +23 -0
  150. package/esm2015/components/tributos/erp-tributos.types.js +268 -0
  151. package/esm2015/components/tributos/index.js +4 -0
  152. package/esm2015/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
  153. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +45 -0
  154. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3102 -0
  155. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4516 -0
  156. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +294 -0
  157. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1464 -0
  158. package/esm2015/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +48 -0
  159. package/esm2015/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +55 -0
  160. package/esm2015/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +83 -0
  161. package/esm2015/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +74 -0
  162. package/esm2015/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +72 -0
  163. package/esm2015/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +244 -0
  164. package/esm2015/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +74 -0
  165. package/esm2015/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +170 -0
  166. package/esm2015/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +100 -0
  167. package/esm2015/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +124 -0
  168. package/esm2015/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +292 -0
  169. package/esm2015/components/tributos/rules/rules.service.js +61 -0
  170. package/esm2015/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1076 -0
  171. package/esm2015/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1317 -0
  172. package/esm2015/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +62 -0
  173. package/esm2015/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +18 -0
  174. package/esm2015/components/tributos/rules/status/registries/status-rules.registry.js +45 -0
  175. package/esm2015/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +39 -0
  176. package/esm2015/components/tributos/rules/status/rules/tax-classification-status-rule.js +94 -0
  177. package/esm2015/components/tributos/rules/status/rules/tax-rate-status-rule.js +61 -0
  178. package/esm2015/components/tributos/rules/status/rules/taxable-base-status-rule.js +65 -0
  179. package/esm2015/components/tributos/rules/types/available-fields.js +1 -0
  180. package/esm2015/components/tributos/rules/types/available-taxes.js +1 -0
  181. package/esm2015/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
  182. package/esm2015/components/tributos/rules/types/field-rule-mapping.js +1 -0
  183. package/esm2015/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
  184. package/esm2015/components/tributos/rules/types/rule-payload.js +1 -0
  185. package/esm2015/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1816 -0
  186. package/esm2015/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2750 -0
  187. package/esm2015/components/tributos/rules/types/schemas/purchase-order.schema.js +150 -0
  188. package/esm2015/components/tributos/rules/types/schemas/sale-order.schema.js +879 -0
  189. package/esm2015/components/tributos/rules/types/strategies-by-document.js +1 -0
  190. package/esm2015/components/tributos/rules/types/strategies.js +1 -0
  191. package/esm2015/components/tributos/rules/types/tax-rule.js +1 -0
  192. package/esm2015/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3606 -0
  193. package/esm2015/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5452 -0
  194. package/esm2015/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +270 -0
  195. package/esm2015/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1392 -0
  196. package/esm2015/components/tributos/rules/validation/registries/validation-rules.registry.js +45 -0
  197. package/esm2015/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +73 -0
  198. package/esm2015/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +78 -0
  199. package/esm2015/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +902 -0
  200. package/esm2015/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +401 -0
  201. package/esm2015/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +719 -0
  202. package/esm2015/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +300 -0
  203. package/esm2015/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +717 -0
  204. package/esm2015/components/tributos/services/tax-rounding.service.js +18 -0
  205. package/esm2015/components/tributos/stores/tax.store.js +19 -0
  206. package/esm2015/components/tributos/tax-reform-utilities.js +243 -0
  207. package/esm2015/components/tributos/types/context.js +1 -0
  208. package/esm2015/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
  209. package/esm2015/components/tributos/types/controllership-incoming-invoice.js +1 -0
  210. package/esm2015/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
  211. package/esm2015/components/tributos/types/controllership-outgoing-invoice.js +1 -0
  212. package/esm2015/components/tributos/types/credit-invoice-type.js +1 -0
  213. package/esm2015/components/tributos/types/debit-invoice-type.js +1 -0
  214. package/esm2015/components/tributos/types/group.js +1 -0
  215. package/esm2015/components/tributos/types/incoming-invoice-context.js +1 -0
  216. package/esm2015/components/tributos/types/incoming-invoice-item.js +1 -0
  217. package/esm2015/components/tributos/types/incoming-invoice-type.js +1 -0
  218. package/esm2015/components/tributos/types/incoming-invoice.js +1 -0
  219. package/esm2015/components/tributos/types/item-type.js +1 -0
  220. package/esm2015/components/tributos/types/outgoing-Invoice.js +1 -0
  221. package/esm2015/components/tributos/types/outgoing-invoice-context.js +1 -0
  222. package/esm2015/components/tributos/types/outgoing-invoice-item.js +1 -0
  223. package/esm2015/components/tributos/types/outgoing-invoice-type.js +1 -0
  224. package/esm2015/components/tributos/types/purchase-order-context.js +1 -0
  225. package/esm2015/components/tributos/types/purchase-order-type.js +1 -0
  226. package/esm2015/components/tributos/types/purchase-order.js +1 -0
  227. package/esm2015/components/tributos/types/sale-order-context.js +1 -0
  228. package/esm2015/components/tributos/types/sale-order-type.js +1 -0
  229. package/esm2015/components/tributos/types/sale-order.js +1 -0
  230. package/esm2015/components/tributos/types/tax.js +2 -0
  231. package/esm2015/components/utils/breakpoints.js +11 -0
  232. package/esm2015/components/utils/export-utils.js +71 -0
  233. package/esm2015/components/utils/index.js +4 -0
  234. package/esm2015/components/utils/loading-context.js +20 -0
  235. package/esm2015/components/utils/utils.js +18 -0
  236. package/esm2015/core/entities/entity-service.js +91 -0
  237. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
  238. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +62 -0
  239. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +24 -0
  240. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +24 -0
  241. package/esm2015/core/enums/enum-classificacao-tributaria.js +6 -0
  242. package/esm2015/core/enums/enum-tipo-calculo-imposto.js +7 -0
  243. package/esm2015/core/enums/enum-tipo-documento-parametros.js +9 -0
  244. package/esm2015/core/enums/enum-tipo-documento.js +12 -0
  245. package/esm2015/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
  246. package/esm2015/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
  247. package/esm2015/locale/fallback.js +56 -0
  248. package/esm2015/public-api.js +8 -0
  249. package/esm2015/senior-gestao-empresarial-erpx-components.js +58 -0
  250. package/esm5/components/breadcrumb/breadcrumb.component.js +91 -0
  251. package/esm5/components/breadcrumb/breadcrumb.module.js +20 -0
  252. package/esm5/components/breadcrumb/index.js +3 -0
  253. package/esm5/components/focus/focus.service.js +35 -0
  254. package/esm5/components/lote-serie/erp-lote-serie.component.js +1830 -0
  255. package/esm5/components/lote-serie/erp-lote-serie.module.js +50 -0
  256. package/esm5/components/lote-serie/erp-lote-serie.service.js +96 -0
  257. package/esm5/components/lote-serie/index.js +3 -0
  258. package/esm5/components/rateio-editor/erp-rateio-editor.component.js +861 -0
  259. package/esm5/components/rateio-editor/erp-rateio-editor.converter.js +68 -0
  260. package/esm5/components/rateio-editor/erp-rateio-editor.module.js +43 -0
  261. package/esm5/components/rateio-editor/erp-rateio-editor.service.js +51 -0
  262. package/esm5/components/rateio-editor/erp-rateio-editor.types.js +5 -0
  263. package/esm5/components/rateio-editor/index.js +4 -0
  264. package/esm5/components/resumo/erp-resumo.component.js +22 -0
  265. package/esm5/components/resumo/erp-resumo.module.js +28 -0
  266. package/esm5/components/resumo/erp-resumo.service.js +16 -0
  267. package/esm5/components/resumo/index.js +2 -0
  268. package/esm5/components/tributos/calculators/effective-tax-rate-calculator.js +58 -0
  269. package/esm5/components/tributos/calculators/gross-amount-calculator.js +39 -0
  270. package/esm5/components/tributos/calculators/tax-amount-calculator.js +91 -0
  271. package/esm5/components/tributos/erp-tributos.component.js +5296 -0
  272. package/esm5/components/tributos/erp-tributos.module.js +36 -0
  273. package/esm5/components/tributos/erp-tributos.service.js +24 -0
  274. package/esm5/components/tributos/erp-tributos.types.js +268 -0
  275. package/esm5/components/tributos/index.js +4 -0
  276. package/esm5/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
  277. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +46 -0
  278. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3104 -0
  279. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4518 -0
  280. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +296 -0
  281. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1466 -0
  282. package/esm5/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +60 -0
  283. package/esm5/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +77 -0
  284. package/esm5/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +92 -0
  285. package/esm5/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +83 -0
  286. package/esm5/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +87 -0
  287. package/esm5/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +286 -0
  288. package/esm5/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +89 -0
  289. package/esm5/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +241 -0
  290. package/esm5/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +118 -0
  291. package/esm5/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +200 -0
  292. package/esm5/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +330 -0
  293. package/esm5/components/tributos/rules/rules.service.js +139 -0
  294. package/esm5/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1078 -0
  295. package/esm5/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1319 -0
  296. package/esm5/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +64 -0
  297. package/esm5/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +19 -0
  298. package/esm5/components/tributos/rules/status/registries/status-rules.registry.js +46 -0
  299. package/esm5/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +43 -0
  300. package/esm5/components/tributos/rules/status/rules/tax-classification-status-rule.js +106 -0
  301. package/esm5/components/tributos/rules/status/rules/tax-rate-status-rule.js +68 -0
  302. package/esm5/components/tributos/rules/status/rules/taxable-base-status-rule.js +72 -0
  303. package/esm5/components/tributos/rules/types/available-fields.js +1 -0
  304. package/esm5/components/tributos/rules/types/available-taxes.js +1 -0
  305. package/esm5/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
  306. package/esm5/components/tributos/rules/types/field-rule-mapping.js +1 -0
  307. package/esm5/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
  308. package/esm5/components/tributos/rules/types/rule-payload.js +1 -0
  309. package/esm5/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1817 -0
  310. package/esm5/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2751 -0
  311. package/esm5/components/tributos/rules/types/schemas/purchase-order.schema.js +151 -0
  312. package/esm5/components/tributos/rules/types/schemas/sale-order.schema.js +880 -0
  313. package/esm5/components/tributos/rules/types/strategies-by-document.js +1 -0
  314. package/esm5/components/tributos/rules/types/strategies.js +1 -0
  315. package/esm5/components/tributos/rules/types/tax-rule.js +1 -0
  316. package/esm5/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3608 -0
  317. package/esm5/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5454 -0
  318. package/esm5/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +272 -0
  319. package/esm5/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1394 -0
  320. package/esm5/components/tributos/rules/validation/registries/validation-rules.registry.js +46 -0
  321. package/esm5/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +77 -0
  322. package/esm5/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +86 -0
  323. package/esm5/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +968 -0
  324. package/esm5/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +433 -0
  325. package/esm5/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +774 -0
  326. package/esm5/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +323 -0
  327. package/esm5/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +772 -0
  328. package/esm5/components/tributos/services/tax-rounding.service.js +23 -0
  329. package/esm5/components/tributos/stores/tax.store.js +26 -0
  330. package/esm5/components/tributos/tax-reform-utilities.js +249 -0
  331. package/esm5/components/tributos/types/context.js +1 -0
  332. package/esm5/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
  333. package/esm5/components/tributos/types/controllership-incoming-invoice.js +1 -0
  334. package/esm5/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
  335. package/esm5/components/tributos/types/controllership-outgoing-invoice.js +1 -0
  336. package/esm5/components/tributos/types/credit-invoice-type.js +1 -0
  337. package/esm5/components/tributos/types/debit-invoice-type.js +1 -0
  338. package/esm5/components/tributos/types/group.js +1 -0
  339. package/esm5/components/tributos/types/incoming-invoice-context.js +1 -0
  340. package/esm5/components/tributos/types/incoming-invoice-item.js +1 -0
  341. package/esm5/components/tributos/types/incoming-invoice-type.js +1 -0
  342. package/esm5/components/tributos/types/incoming-invoice.js +1 -0
  343. package/esm5/components/tributos/types/item-type.js +1 -0
  344. package/esm5/components/tributos/types/outgoing-Invoice.js +1 -0
  345. package/esm5/components/tributos/types/outgoing-invoice-context.js +1 -0
  346. package/esm5/components/tributos/types/outgoing-invoice-item.js +1 -0
  347. package/esm5/components/tributos/types/outgoing-invoice-type.js +1 -0
  348. package/esm5/components/tributos/types/purchase-order-context.js +1 -0
  349. package/esm5/components/tributos/types/purchase-order-type.js +1 -0
  350. package/esm5/components/tributos/types/purchase-order.js +1 -0
  351. package/esm5/components/tributos/types/sale-order-context.js +1 -0
  352. package/esm5/components/tributos/types/sale-order-type.js +1 -0
  353. package/esm5/components/tributos/types/sale-order.js +1 -0
  354. package/esm5/components/tributos/types/tax.js +2 -0
  355. package/esm5/components/utils/breakpoints.js +11 -0
  356. package/esm5/components/utils/export-utils.js +78 -0
  357. package/esm5/components/utils/index.js +4 -0
  358. package/esm5/components/utils/loading-context.js +22 -0
  359. package/esm5/components/utils/utils.js +20 -0
  360. package/esm5/core/entities/entity-service.js +98 -0
  361. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
  362. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +67 -0
  363. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +27 -0
  364. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +27 -0
  365. package/esm5/core/enums/enum-classificacao-tributaria.js +6 -0
  366. package/esm5/core/enums/enum-tipo-calculo-imposto.js +7 -0
  367. package/esm5/core/enums/enum-tipo-documento-parametros.js +9 -0
  368. package/esm5/core/enums/enum-tipo-documento.js +12 -0
  369. package/esm5/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
  370. package/esm5/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
  371. package/esm5/locale/fallback.js +56 -0
  372. package/esm5/public-api.js +8 -0
  373. package/esm5/senior-gestao-empresarial-erpx-components.js +58 -0
  374. package/fesm2015/senior-gestao-empresarial-erpx-components.js +36350 -0
  375. package/fesm2015/senior-gestao-empresarial-erpx-components.js.map +1 -0
  376. package/fesm5/senior-gestao-empresarial-erpx-components.js +37396 -0
  377. package/fesm5/senior-gestao-empresarial-erpx-components.js.map +1 -0
  378. package/locale/fallback.d.ts +55 -0
  379. package/package.json +23 -0
  380. package/public-api.d.ts +7 -0
  381. package/senior-gestao-empresarial-erpx-components.d.ts +57 -0
  382. package/senior-gestao-empresarial-erpx-components.metadata.json +1 -0
@@ -0,0 +1,1830 @@
1
+ import { __assign, __decorate, __values } from "tslib";
2
+ import { Component, Input, ViewChild } from '@angular/core';
3
+ import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
4
+ import { ActivatedRoute } from '@angular/router';
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import { E210DxpLookup, EnumLogicalOperator } from '@senior-gestao-empresarial/angular-components';
7
+ import { ButtonPriority, ButtonSize, EnumColumnFieldType, FieldType, FormField } from '@seniorsistemas/angular-components';
8
+ import * as moment from 'moment';
9
+ import { MessageService } from 'primeng/api';
10
+ import { Table } from 'primeng/table';
11
+ import { Subject } from 'rxjs';
12
+ import { first, map, takeUntil } from 'rxjs/operators';
13
+ import { QuantidadeDisponivelDemandaService } from '../../core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service';
14
+ import { EnumTipoDocumentoParametros } from '../../core/enums/enum-tipo-documento-parametros';
15
+ import { isEmpty, isNotEmpty } from '../utils/utils';
16
+ import { ErpLoteSeriesService, GetUrlInput, GetUrlOutput, ListParams } from './erp-lote-serie.service';
17
+ var ErpLoteSerieComponent = /** @class */ (function () {
18
+ function ErpLoteSerieComponent(translate, route, e210DxpLookup, formBuilder, messageService, batchSeriesService, quantidadeDisponivelDemandaService) {
19
+ this.translate = translate;
20
+ this.route = route;
21
+ this.e210DxpLookup = e210DxpLookup;
22
+ this.formBuilder = formBuilder;
23
+ this.messageService = messageService;
24
+ this.batchSeriesService = batchSeriesService;
25
+ this.quantidadeDisponivelDemandaService = quantidadeDisponivelDemandaService;
26
+ this.blockedFields = false;
27
+ this.showHeader = true;
28
+ this.validateInvalidChars = false;
29
+ this.ButtonPriority = ButtonPriority;
30
+ this.ButtonSize = ButtonSize;
31
+ this.EnumTipoMovimentacao = EnumTipoMovimentacao;
32
+ this.gridData = [];
33
+ this.selection = [];
34
+ this.localeConfig = {};
35
+ this.locale = {};
36
+ this.e200lotLookupSuggestionsObservable = new Subject();
37
+ this.e200lotlookupSearchObservable = new Subject();
38
+ this.e200serLookupSuggestionsObservable = new Subject();
39
+ this.e200serlookupSearchObservable = new Subject();
40
+ this.ngUnsubscribe = new Subject();
41
+ this.quantidadeDisponivelDemandaLookupSuggestionsObservable = new Subject();
42
+ this.quantidadeDisponivelDemandalookupSearchObservable = new Subject();
43
+ this.loteLookupDisplayFields = ['e200lot.codLote'];
44
+ this.serieLookupDisplayFields = ['e200ser.numSep'];
45
+ this.isSerie = false;
46
+ this.qtdAdistribuir = 0;
47
+ this.qtdDistribuida = 0;
48
+ this.qtdRestante = 0;
49
+ this.maxLength = 50;
50
+ this.obrigaValidade = false;
51
+ this.isSaida = false;
52
+ this.disableDataValidade = false;
53
+ this.prefix = 'erpx.lote_serie.';
54
+ this.editingFormGroup = this.formBuilder.group({
55
+ quantidade: [{ value: null, disabled: false }, Validators.compose([Validators.required])]
56
+ });
57
+ this.editingFormFields = [
58
+ new FormField({
59
+ name: 'quantidade',
60
+ size: { sm: 12, md: 12, lg: 12, xl: 12 },
61
+ type: FieldType.Double,
62
+ precision: 15
63
+ })
64
+ ];
65
+ this.sum = function (a, b, positions) {
66
+ var factor = Math.pow(10, positions);
67
+ return (a.toFixed(positions) * factor + b.toFixed(positions) * factor) / factor;
68
+ };
69
+ this.sub = function (a, b, positions) {
70
+ var factor = Math.pow(10, positions);
71
+ return (a.toFixed(positions) * factor - b.toFixed(positions) * factor) / factor;
72
+ };
73
+ }
74
+ ErpLoteSerieComponent.prototype.ngOnChanges = function () {
75
+ var _this = this;
76
+ if (this.loteSerieParams) {
77
+ this.route.data.pipe(takeUntil(this.ngUnsubscribe)).subscribe(function (data) { return _this.onRouteDataChange(data); });
78
+ this.formGroupBatchOrSeries = this.getFormGroupDados();
79
+ this.validaDados();
80
+ this.gridColumns = this.getGridColumns();
81
+ }
82
+ if (this.blockedFields == true)
83
+ this.formGroupBatchOrSeries.disable();
84
+ this.formGroupBatchOrSeries.controls.lote.valueChanges.subscribe(function (value) {
85
+ if (value) {
86
+ if (_this.validateInvalidChars && /\t|\r|\n/g.exec(value)) {
87
+ _this.formGroupBatchOrSeries.controls.lote.setErrors({ existsInvalidChar: true });
88
+ return;
89
+ }
90
+ }
91
+ });
92
+ this.formGroupBatchOrSeries.controls.serie.valueChanges.subscribe(function (value) {
93
+ if (value) {
94
+ if (_this.validateInvalidChars && /\t|\r|\n/g.exec(value)) {
95
+ _this.formGroupBatchOrSeries.controls.serie.setErrors({ existsInvalidChar: true });
96
+ return;
97
+ }
98
+ }
99
+ });
100
+ };
101
+ ErpLoteSerieComponent.prototype.validaDados = function () {
102
+ var _this = this;
103
+ this.processFamilySupplyInfo(this.loteSerieParams.dadosProduto.e012fam);
104
+ if (this.loteSerieParams.tipoControleProduto == 'Serie') {
105
+ this.titleLoteOrSerie = this.translate.instant(this.prefix + "serie_title");
106
+ this.titleGridLoteOrSerie = this.translate.instant(this.prefix + "serie_title_grid");
107
+ this.isSerie = true;
108
+ }
109
+ else {
110
+ this.titleLoteOrSerie = this.translate.instant(this.prefix + "lote_title");
111
+ this.titleGridLoteOrSerie = this.translate.instant(this.prefix + "lote_title_grid");
112
+ this.isSerie = false;
113
+ }
114
+ if (this.loteSerieParams.tipoMovimentacao == 'Entrada') {
115
+ this.batchOrSeriesFields = this.getFieldsEntrada();
116
+ if (this.isSerie) {
117
+ this.formGroupBatchOrSeries.controls.serie.clearValidators();
118
+ this.formGroupBatchOrSeries.controls.serie.setValidators([Validators.required, Validators.maxLength(50)]);
119
+ this.formGroupBatchOrSeries.controls.serie.updateValueAndValidity({ emitEvent: false });
120
+ }
121
+ else {
122
+ this.formGroupBatchOrSeries.controls.lote.clearValidators();
123
+ this.formGroupBatchOrSeries.controls.quantidade.clearValidators();
124
+ this.formGroupBatchOrSeries.controls.lote.setValidators([Validators.required, Validators.maxLength(50)]);
125
+ this.formGroupBatchOrSeries.controls.quantidade.setValidators([Validators.required]);
126
+ this.formGroupBatchOrSeries.controls.lote.updateValueAndValidity({ emitEvent: false });
127
+ this.formGroupBatchOrSeries.controls.quantidade.updateValueAndValidity({ emitEvent: false });
128
+ }
129
+ this.formGroupBatchOrSeries.controls.bulkVisible.valueChanges.subscribe(function (value) {
130
+ if (value) {
131
+ _this.formGroupBatchOrSeries.controls.batchSerieBulk.setValidators([Validators.required]);
132
+ _this.formGroupBatchOrSeries.controls.batchSerieBulk.updateValueAndValidity({ emitEvent: false });
133
+ return;
134
+ }
135
+ _this.formGroupBatchOrSeries.controls.batchSerieBulk.clearValidators();
136
+ _this.formGroupBatchOrSeries.controls.batchSerieBulk.updateValueAndValidity({ emitEvent: false });
137
+ });
138
+ }
139
+ else {
140
+ this.isSaida = true;
141
+ if (this.isSerie) {
142
+ this.formGroupBatchOrSeries.controls.serie.clearValidators();
143
+ this.formGroupBatchOrSeries.controls.serie.setValidators([Validators.required]);
144
+ this.formGroupBatchOrSeries.controls.serie.updateValueAndValidity({ emitEvent: false });
145
+ }
146
+ else {
147
+ this.formGroupBatchOrSeries.controls.lote.clearValidators();
148
+ this.formGroupBatchOrSeries.controls.lote.setValidators([Validators.required]);
149
+ this.formGroupBatchOrSeries.controls.lote.updateValueAndValidity({ emitEvent: false });
150
+ this.formGroupBatchOrSeries.controls.quantidade.clearValidators();
151
+ this.formGroupBatchOrSeries.controls.quantidade.setValidators([Validators.required]);
152
+ this.formGroupBatchOrSeries.controls.quantidade.updateValueAndValidity({ emitEvent: false });
153
+ }
154
+ this.batchOrSeriesFields = this.getFieldsSaida();
155
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
156
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
157
+ }
158
+ this.formGroupBatchOrSeries.controls.dataFabricacao.valueChanges.subscribe(function (val) {
159
+ if (val) {
160
+ _this.formGroupBatchOrSeries.controls.dataValidade.clearValidators();
161
+ _this.formGroupBatchOrSeries.controls.dataValidade.setValidators([]);
162
+ _this.formGroupBatchOrSeries.controls.dataValidade.updateValueAndValidity({ emitEvent: false });
163
+ }
164
+ else {
165
+ _this.formGroupBatchOrSeries.controls.dataValidade.clearValidators();
166
+ _this.formGroupBatchOrSeries.controls.dataValidade.updateValueAndValidity({ emitEvent: false });
167
+ }
168
+ });
169
+ this.qtdDistribuida = 0;
170
+ this.qtdAdistribuir = this.loteSerieParams.quantidadeDistribuir;
171
+ if (this.loteSerieParams.lotesOrSeries) {
172
+ this.gridData = this.loteSerieParams.lotesOrSeries;
173
+ this.qtdDistribuida = this.getQuantidadeDistribuida();
174
+ this.qtdRestante = this.qtdAdistribuir - this.qtdDistribuida;
175
+ }
176
+ else {
177
+ this.qtdRestante = this.qtdAdistribuir;
178
+ }
179
+ };
180
+ ErpLoteSerieComponent.prototype.getFormGroupDados = function () {
181
+ var formGroup = this.formBuilder.group({
182
+ deposito: [{ value: undefined, disabled: false }, Validators.compose([])],
183
+ lote: [{ value: undefined, disabled: false }, Validators.compose([])],
184
+ dataValidade: [{ value: undefined, disabled: false }, Validators.compose([])],
185
+ dataFabricacao: [{ value: undefined, disabled: false }, Validators.compose([])],
186
+ serie: [{ value: undefined, disabled: false }, Validators.compose([])],
187
+ saldo: [{ value: undefined, disabled: true }, Validators.compose([])],
188
+ quantidade: [{ value: undefined, disabled: false }, Validators.compose([])],
189
+ batchSerieBulk: [{ value: undefined, disabled: false }, Validators.compose([])],
190
+ bulkVisible: [{ value: false, disabled: false }, Validators.compose([])]
191
+ });
192
+ return formGroup;
193
+ };
194
+ ErpLoteSerieComponent.prototype.getProp = function (obj, path) {
195
+ return path.split('.').reduce(function (result, prop) { return (result[prop] === undefined ? '' : result[prop]); }, obj);
196
+ };
197
+ ErpLoteSerieComponent.prototype.getFieldsEntrada = function () {
198
+ var _this = this;
199
+ var dadosFieldsEntrada = [];
200
+ if (!this.loteSerieParams.dadosProduto.e205dep) {
201
+ dadosFieldsEntrada = [
202
+ new FormField(__assign(__assign({}, this.e210DxpLookup.mountOptions({
203
+ multiple: false,
204
+ domain: 'erpx_sup',
205
+ service: 'estoque',
206
+ formGroup: 'deposito',
207
+ searchFields: [
208
+ { name: 'e205dep.codDep', type: FieldType.String },
209
+ {
210
+ name: 'e205dep.desDep',
211
+ type: FieldType.String
212
+ },
213
+ { name: 'e205dep.abrDep', type: FieldType.String },
214
+ {
215
+ name: 'e205dep.e070fil.codFil',
216
+ type: FieldType.Integer
217
+ }
218
+ ],
219
+ searchGridFields: [
220
+ { name: 'e205dep.codDep', type: FieldType.String },
221
+ {
222
+ name: 'e205dep.desDep',
223
+ type: FieldType.String
224
+ },
225
+ { name: 'e205dep.abrDep', type: FieldType.String },
226
+ {
227
+ name: 'e205dep.e070fil.codFil',
228
+ type: FieldType.Integer
229
+ },
230
+ { name: 'e205dep.e070fil.nomFil', type: FieldType.String }
231
+ ],
232
+ defaultFilter: [
233
+ { field: 'excluido', operator: EnumLogicalOperator.Eq, values: ['false'] },
234
+ {
235
+ field: 'e070emp.id',
236
+ operator: EnumLogicalOperator.Eq,
237
+ values: [this.loteSerieParams.dadosProduto.e070emp]
238
+ },
239
+ { field: 'sitEst', operator: EnumLogicalOperator.Eq, values: ['VA'] },
240
+ { field: 'e205dep.sitDep', operator: EnumLogicalOperator.Eq, values: ['VA'] },
241
+ {
242
+ field: 'e075der.id',
243
+ operator: EnumLogicalOperator.Eq,
244
+ values: [this.loteSerieParams.dadosProduto.e075der]
245
+ }
246
+ ]
247
+ })), { size: { sm: 12, md: 4, lg: 4, xl: 3 }, visible: function () { return !_this.formGroupBatchOrSeries.controls.bulkVisible.value; } }))
248
+ ];
249
+ }
250
+ dadosFieldsEntrada.push(new FormField({
251
+ name: 'bulkVisible',
252
+ label: this.translate.instant(this.prefix + "bulk_visible"),
253
+ size: { sm: 12, md: 4, lg: 4, xl: 12 },
254
+ type: FieldType.Boolean,
255
+ representedBy: 'switch'
256
+ }), new FormField({
257
+ name: 'batchSerieBulk',
258
+ label: this.translate.instant(this.prefix + "batch_serie_bulk"),
259
+ size: { sm: 12, md: 4, lg: 4, xl: 6 },
260
+ type: FieldType.Text,
261
+ rows: 5,
262
+ onBlur: function (event) { return _this.onBlurValidaLoteorSerie(event.target.value); },
263
+ required: function () { return true; },
264
+ errorMessages: function () { return ({
265
+ existsInvalidChar: _this.translate.instant(_this.prefix + "exists_invalid_char")
266
+ }); },
267
+ visible: function () { return _this.formGroupBatchOrSeries.controls.bulkVisible.value; }
268
+ }), new FormField({
269
+ name: this.isSerie ? 'serie' : 'lote',
270
+ label: this.isSerie ? this.translate.instant(this.prefix + "serie") : this.translate.instant(this.prefix + "lote"),
271
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
272
+ type: FieldType.String,
273
+ onBlur: function (event) { return _this.onBlurValidaLoteorSerie(event.target.value); },
274
+ required: function () { return true; },
275
+ errorMessages: function () { return ({
276
+ existsInvalidChar: _this.translate.instant(_this.prefix + "exists_invalid_char")
277
+ }); },
278
+ visible: function () { return !_this.formGroupBatchOrSeries.controls.bulkVisible.value; }
279
+ }), new FormField({
280
+ name: 'dataFabricacao',
281
+ label: this.translate.instant(this.prefix + "data_fabricacao"),
282
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
283
+ type: FieldType.Date,
284
+ appendTo: 'body',
285
+ visible: function () { return !_this.formGroupBatchOrSeries.controls.bulkVisible.value; }
286
+ }), new FormField({
287
+ name: 'dataValidade',
288
+ label: this.translate.instant(this.prefix + "data_validade"),
289
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
290
+ type: FieldType.Date,
291
+ appendTo: 'body',
292
+ required: function () { return _this.obrigaValidade; },
293
+ visible: function () { return !_this.formGroupBatchOrSeries.controls.bulkVisible.value; }
294
+ }), new FormField({
295
+ name: 'saldo',
296
+ label: this.translate.instant(this.prefix + "saldo"),
297
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
298
+ type: FieldType.Double,
299
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
300
+ visible: function () { return !_this.formGroupBatchOrSeries.controls.bulkVisible.value; }
301
+ }));
302
+ if (!this.isSerie) {
303
+ dadosFieldsEntrada.push(new FormField({
304
+ name: 'quantidade',
305
+ label: this.translate.instant(this.prefix + "quantidade"),
306
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
307
+ type: FieldType.Double,
308
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
309
+ required: function () { return true; },
310
+ onBlur: function () { return _this.onBlurQuantity(); },
311
+ visible: function () { return !_this.formGroupBatchOrSeries.controls.bulkVisible.value; },
312
+ numberLocaleOptions: this.localeConfig.number
313
+ }));
314
+ }
315
+ return dadosFieldsEntrada;
316
+ };
317
+ ErpLoteSerieComponent.prototype.getFieldsSaida = function () {
318
+ var _this = this;
319
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
320
+ var dadosFieldsSaida = [];
321
+ if (!this.loteSerieParams.dadosProduto.e205dep) {
322
+ dadosFieldsSaida = [
323
+ new FormField(__assign(__assign({}, this.e210DxpLookup.mountOptions({
324
+ multiple: false,
325
+ domain: 'erpx_sup',
326
+ service: 'estoque',
327
+ formGroup: 'deposito',
328
+ searchFields: [
329
+ { name: 'e205dep.codDep', type: FieldType.String },
330
+ {
331
+ name: 'e205dep.desDep',
332
+ type: FieldType.String
333
+ },
334
+ { name: 'e205dep.abrDep', type: FieldType.String },
335
+ {
336
+ name: 'e205dep.e070fil.codFil',
337
+ type: FieldType.Integer
338
+ }
339
+ ],
340
+ searchGridFields: [
341
+ { name: 'e205dep.codDep', type: FieldType.String },
342
+ {
343
+ name: 'e205dep.desDep',
344
+ type: FieldType.String
345
+ },
346
+ { name: 'e205dep.abrDep', type: FieldType.String },
347
+ {
348
+ name: 'e205dep.e070fil.codFil',
349
+ type: FieldType.Integer
350
+ },
351
+ { name: 'e205dep.e070fil.nomFil', type: FieldType.String }
352
+ ],
353
+ defaultFilter: [
354
+ { field: 'excluido', operator: EnumLogicalOperator.Eq, values: ['false'] },
355
+ {
356
+ field: 'e070emp.id',
357
+ operator: EnumLogicalOperator.Eq,
358
+ values: [this.loteSerieParams.dadosProduto.e070emp]
359
+ },
360
+ { field: 'sitEst', operator: EnumLogicalOperator.Eq, values: ['VA'] },
361
+ { field: 'e205dep.sitDep', operator: EnumLogicalOperator.Eq, values: ['VA'] },
362
+ {
363
+ field: 'e075der.id',
364
+ operator: EnumLogicalOperator.Eq,
365
+ values: [this.loteSerieParams.dadosProduto.e075der]
366
+ }
367
+ ]
368
+ })), { size: { sm: 12, md: 4, lg: 4, xl: 3 } }))
369
+ ];
370
+ }
371
+ if (this.isSerie) {
372
+ dadosFieldsSaida.push(new FormField({
373
+ name: 'serie',
374
+ label: this.translate.instant(this.prefix + "lookup_e200ser"),
375
+ type: FieldType.Lookup,
376
+ searchTitle: this.translate.instant(this.prefix + "lookup_e200ser_search_title"),
377
+ searchEmptyTitle: this.translate.instant(this.prefix + "nothing_found"),
378
+ filterLabel: this.translate.instant(this.prefix + "filter"),
379
+ clearLabel: this.translate.instant(this.prefix + "clear"),
380
+ cancelLabel: this.translate.instant(this.prefix + "cancel"),
381
+ selectLabel: this.translate.instant(this.prefix + "select"),
382
+ onSelect: function (event) {
383
+ var _a, _b;
384
+ if (((_b = (_a = _this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) !== EnumInvoiceOrigin.V2)
385
+ _this.validaLoteorSerie(event);
386
+ },
387
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
388
+ onSearchRequest: function (event) {
389
+ var _a, _b;
390
+ return ((_b = (_a = _this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) === EnumInvoiceOrigin.V2
391
+ ? _this.onQuantidadeDisponivelDemandaRequest(event)
392
+ : _this.onE200SerSearchRequest(event);
393
+ },
394
+ onLookupRequest: function (value) {
395
+ var _a, _b;
396
+ return ((_b = (_a = _this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) === EnumInvoiceOrigin.V2
397
+ ? _this.onQuantidadeDisponivelDemandaRequest(value)
398
+ : _this.onE200SerLookupRequest(value);
399
+ },
400
+ suggestionsObservable: ((_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) === EnumInvoiceOrigin.V2
401
+ ? this.quantidadeDisponivelDemandaLookupSuggestionsObservable
402
+ : this.e200serLookupSuggestionsObservable,
403
+ searchObservable: ((_d = (_c = this.loteSerieParams) === null || _c === void 0 ? void 0 : _c.invoiceInformation) === null || _d === void 0 ? void 0 : _d.origin) === EnumInvoiceOrigin.V2
404
+ ? this.quantidadeDisponivelDemandalookupSearchObservable
405
+ : this.e200serlookupSearchObservable,
406
+ lookupDisplayField: 'label',
407
+ searchFields: ((_f = (_e = this.loteSerieParams) === null || _e === void 0 ? void 0 : _e.invoiceInformation) === null || _f === void 0 ? void 0 : _f.origin) === EnumInvoiceOrigin.V2
408
+ ? this.getQuantidadeDisponivelDemandaSearchFields()
409
+ : this.getE200SerSearchFields(),
410
+ searchGridFields: ((_h = (_g = this.loteSerieParams) === null || _g === void 0 ? void 0 : _g.invoiceInformation) === null || _h === void 0 ? void 0 : _h.origin) === EnumInvoiceOrigin.V2
411
+ ? this.getQuantidadeDisponivelDemandaSearchGridFields()
412
+ : this.getE200SerSearchGridFields(),
413
+ multiple: ((_k = (_j = this.loteSerieParams) === null || _j === void 0 ? void 0 : _j.invoiceInformation) === null || _k === void 0 ? void 0 : _k.origin) === EnumInvoiceOrigin.V2,
414
+ dataKey: ((_m = (_l = this.loteSerieParams) === null || _l === void 0 ? void 0 : _l.invoiceInformation) === null || _m === void 0 ? void 0 : _m.origin) === EnumInvoiceOrigin.V2 ? 'id' : 'e200ser.id',
415
+ required: function () { return true; }
416
+ }), new FormField({
417
+ name: 'dataFabricacao',
418
+ label: this.translate.instant(this.prefix + "data_fabricacao"),
419
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
420
+ type: FieldType.Date,
421
+ appendTo: 'body',
422
+ visible: function () { return !_this.isDistributeSeriesButtonVisible(); }
423
+ }), new FormField({
424
+ name: 'dataValidade',
425
+ label: this.translate.instant(this.prefix + "data_validade"),
426
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
427
+ type: FieldType.Date,
428
+ appendTo: 'body',
429
+ required: function () { return _this.obrigaValidade; },
430
+ visible: function () { return !_this.isDistributeSeriesButtonVisible(); }
431
+ }), new FormField({
432
+ name: 'saldo',
433
+ label: this.translate.instant(this.prefix + "saldo"),
434
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
435
+ type: FieldType.Double,
436
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
437
+ visible: function () { return !_this.isDistributeSeriesButtonVisible(); }
438
+ }));
439
+ }
440
+ else {
441
+ dadosFieldsSaida.push(((_o = this.loteSerieParams.invoiceInformation) === null || _o === void 0 ? void 0 : _o.origin) === EnumInvoiceOrigin.V2
442
+ ? new FormField({
443
+ name: 'lote',
444
+ label: this.translate.instant(this.prefix + "lookup_e200lot"),
445
+ type: FieldType.Lookup,
446
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
447
+ onSelect: function (event) { return _this.validaLoteorSerie(event); },
448
+ onSearchRequest: function (event) { return _this.onQuantidadeDisponivelDemandaRequest(event); },
449
+ onLookupRequest: function (value) { return _this.onQuantidadeDisponivelDemandaRequest(value); },
450
+ suggestionsObservable: this.quantidadeDisponivelDemandaLookupSuggestionsObservable,
451
+ searchObservable: this.quantidadeDisponivelDemandalookupSearchObservable,
452
+ lookupDisplayField: 'label',
453
+ searchFields: this.getQuantidadeDisponivelDemandaSearchFields(),
454
+ searchGridFields: this.getQuantidadeDisponivelDemandaSearchGridFields(),
455
+ dataKey: 'id',
456
+ required: function () { return true; }
457
+ })
458
+ : new FormField({
459
+ name: 'lote',
460
+ label: this.translate.instant(this.prefix + "lookup_e200lot"),
461
+ type: FieldType.Lookup,
462
+ searchTitle: this.translate.instant(this.prefix + "lookup_e200lot_search_title"),
463
+ searchEmptyTitle: this.translate.instant(this.prefix + "nothing_found"),
464
+ filterLabel: this.translate.instant(this.prefix + "filter"),
465
+ clearLabel: this.translate.instant(this.prefix + "clear"),
466
+ cancelLabel: this.translate.instant(this.prefix + "cancel"),
467
+ selectLabel: this.translate.instant(this.prefix + "select"),
468
+ onSelect: function (event) { return _this.validaLoteorSerie(event); },
469
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
470
+ onSearchRequest: function (event) { return _this.onE200LotSearchRequest(event); },
471
+ onLookupRequest: function (value) { return _this.onE200LotLookupRequest(value); },
472
+ suggestionsObservable: this.e200lotLookupSuggestionsObservable,
473
+ searchObservable: this.e200lotlookupSearchObservable,
474
+ lookupDisplayField: 'label',
475
+ searchFields: this.getE200LotSearchFields(),
476
+ searchGridFields: this.getE200LotSearchGridFields(),
477
+ required: function () { return true; }
478
+ }), new FormField({
479
+ name: 'dataFabricacao',
480
+ label: this.translate.instant(this.prefix + "data_fabricacao"),
481
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
482
+ type: FieldType.Date,
483
+ appendTo: 'body'
484
+ }), new FormField({
485
+ name: 'dataValidade',
486
+ label: this.translate.instant(this.prefix + "data_validade"),
487
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
488
+ type: FieldType.Date,
489
+ appendTo: 'body',
490
+ required: function () { return _this.obrigaValidade; }
491
+ }), new FormField({
492
+ name: 'saldo',
493
+ label: this.translate.instant(this.prefix + "saldo"),
494
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
495
+ type: FieldType.Double,
496
+ scale: this.loteSerieParams.dadosProduto.qtdDec
497
+ }), new FormField({
498
+ name: 'quantidade',
499
+ label: this.translate.instant(this.prefix + "quantidade"),
500
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
501
+ type: FieldType.Double,
502
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
503
+ required: function () { return true; },
504
+ onBlur: function () { return _this.onBlurQuantity(); }
505
+ }));
506
+ }
507
+ return dadosFieldsSaida;
508
+ };
509
+ ErpLoteSerieComponent.prototype.getGridColumns = function () {
510
+ var gridColumns;
511
+ if (this.isSerie) {
512
+ gridColumns = [
513
+ {
514
+ field: 'serie',
515
+ header: this.translate.instant(this.prefix + "serie"),
516
+ attributes: ['codigo'],
517
+ type: EnumColumnFieldType.STRING
518
+ },
519
+ { field: 'dataFabricacao', header: this.translate.instant(this.prefix + "data_fabricacao") },
520
+ { field: 'dataValidade', header: this.translate.instant(this.prefix + "data_validade") }
521
+ ];
522
+ }
523
+ else {
524
+ gridColumns = [
525
+ {
526
+ field: 'lote',
527
+ header: this.translate.instant(this.prefix + "lote"),
528
+ attributes: ['codigo'],
529
+ type: EnumColumnFieldType.STRING
530
+ },
531
+ { field: 'quantidade', header: this.translate.instant(this.prefix + "quantidade") },
532
+ { field: 'dataFabricacao', header: this.translate.instant(this.prefix + "data_fabricacao") },
533
+ { field: 'dataValidade', header: this.translate.instant(this.prefix + "data_validade") }
534
+ ];
535
+ }
536
+ return gridColumns;
537
+ };
538
+ ErpLoteSerieComponent.prototype.getE200LotSearchFields = function () {
539
+ var searchFields = [
540
+ new FormField({
541
+ name: 'e200lot.codLote',
542
+ label: this.translate.instant(this.prefix + "lookup_e200lot_cod_dep"),
543
+ type: FieldType.String
544
+ })
545
+ ];
546
+ return searchFields;
547
+ };
548
+ ErpLoteSerieComponent.prototype.getE200SerSearchFields = function () {
549
+ var searchFields = [
550
+ new FormField({
551
+ name: 'e200ser.numSep',
552
+ label: this.translate.instant(this.prefix + "lookup_e200ser_num_sep"),
553
+ type: FieldType.String
554
+ })
555
+ ];
556
+ return searchFields;
557
+ };
558
+ ErpLoteSerieComponent.prototype.onE200LotSearchRequest = function (event) {
559
+ var _this = this;
560
+ var filterQuery;
561
+ var deposito = '';
562
+ var first = event.first, rows = event.rows, multiSortMeta = event.multiSortMeta, filterData = event.filterData;
563
+ var page = first / rows;
564
+ var displayFields = ['e200lot.codLote'];
565
+ if (this.loteSerieParams.dadosProduto.e205dep) {
566
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
567
+ }
568
+ else {
569
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
570
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
571
+ }
572
+ var orderBy = multiSortMeta
573
+ ? multiSortMeta.map(function (s) { return ({
574
+ field: s.field == 'e200lot.codLote' ? 'e200lot.codLot' : s.field,
575
+ order: s.order == 1 ? 'ASC' : 'DESC'
576
+ }); })
577
+ : [{ field: 'e200lot.codLot', order: 'ASC' }];
578
+ filterQuery = {
579
+ e070emp: {
580
+ id: this.loteSerieParams.dadosProduto.e070emp
581
+ },
582
+ e205dep: {
583
+ id: deposito
584
+ },
585
+ e075der: {
586
+ id: this.loteSerieParams.dadosProduto.e075der
587
+ },
588
+ lotLike: true,
589
+ lotSal: true,
590
+ offset: page,
591
+ lotDis: true,
592
+ size: rows
593
+ };
594
+ if (filterData['e200lot.codLote']) {
595
+ filterQuery.e200lot = [
596
+ {
597
+ codLot: filterData['e200lot.codLote']
598
+ }
599
+ ];
600
+ }
601
+ if (orderBy) {
602
+ filterQuery.orderBy = orderBy;
603
+ }
604
+ this.batchSeriesService
605
+ .listBatch(filterQuery)
606
+ .pipe(takeUntil(this.ngUnsubscribe))
607
+ .pipe(map(function (list) { return ({
608
+ gridData: list.lotes.map(function (item) { return (__assign(__assign({}, item), { label: displayFields.map(function (field) {
609
+ if (field.indexOf('.') > 0)
610
+ return _this.getProp(item, field);
611
+ return item[field];
612
+ }) })); }),
613
+ totalRecords: list.totalElements
614
+ }); }))
615
+ .subscribe(function (data) {
616
+ _this.e200lotlookupSearchObservable.next(data);
617
+ });
618
+ };
619
+ ErpLoteSerieComponent.prototype.getQuantidadeDisponivelDemandaSearchFields = function () {
620
+ return this.isSerie
621
+ ? [
622
+ new FormField({
623
+ name: 'numSep',
624
+ label: this.translate.instant(this.prefix + "lookup_e200ser_num_sep"),
625
+ type: FieldType.String
626
+ })
627
+ ]
628
+ : [
629
+ new FormField({
630
+ name: 'codLot',
631
+ label: this.translate.instant(this.prefix + "lookup_e200lot_cod_dep"),
632
+ type: FieldType.String
633
+ })
634
+ ];
635
+ };
636
+ ErpLoteSerieComponent.prototype.getQuantidadeDisponivelDemandaSearchGridFields = function () {
637
+ return this.isSerie
638
+ ? [
639
+ new FormField({
640
+ name: 'numSep',
641
+ label: this.translate.instant(this.prefix + "lookup_e200ser_num_sep"),
642
+ type: FieldType.String
643
+ }),
644
+ new FormField({
645
+ name: 'datFabSep',
646
+ label: this.translate.instant(this.prefix + "lookup_e200ser_dat_fab"),
647
+ type: FieldType.Date
648
+ }),
649
+ new FormField({
650
+ name: 'datVltSep',
651
+ label: this.translate.instant(this.prefix + "lookup_e200ser_dat_vlt"),
652
+ type: FieldType.Date
653
+ })
654
+ ]
655
+ : [
656
+ new FormField({
657
+ name: 'codLot',
658
+ label: this.translate.instant(this.prefix + "lookup_e200lot_cod_dep"),
659
+ type: FieldType.String
660
+ }),
661
+ new FormField({
662
+ name: 'datFabLot',
663
+ label: this.translate.instant(this.prefix + "lookup_e200lot_dat_fab"),
664
+ type: FieldType.Date
665
+ }),
666
+ new FormField({
667
+ name: 'datVltLot',
668
+ label: this.translate.instant(this.prefix + "lookup_e200lot_dat_vlt"),
669
+ type: FieldType.Date
670
+ }),
671
+ new FormField({
672
+ name: 'qtdDisponivel',
673
+ label: this.translate.instant(this.prefix + "lookup_e200lot_qtd_dis"),
674
+ type: FieldType.Double
675
+ })
676
+ ];
677
+ };
678
+ ErpLoteSerieComponent.prototype.onQuantidadeDisponivelDemandaRequest = function (event) {
679
+ var _this = this;
680
+ var listParams = {
681
+ filterQuery: "idExterno eq '" + this.loteSerieParams.orderInformation.item.id + "' and qtdDisponivel > 0"
682
+ };
683
+ if (this.isSerie) {
684
+ listParams.filterQuery += " and numSep is not null";
685
+ }
686
+ if (this.loteSerieParams.invoiceInformation.origin === EnumInvoiceOrigin.V2) {
687
+ listParams.filterQuery += " and tipoDocumento eq 'PedidoVenda'";
688
+ }
689
+ if (event instanceof String || typeof event === 'string') {
690
+ listParams.page = 0;
691
+ listParams.size = 10;
692
+ listParams.filterQuery += this.isSerie
693
+ ? " and containing(lower(numSep), lower('" + event.replace(/\\/g, '').replace(/'/g, "\\'") + "'))"
694
+ : " and containing(lower(codLot), lower('" + event.replace(/\\/g, '').replace(/'/g, "\\'") + "'))";
695
+ }
696
+ else {
697
+ var filterData = event.filterData, rows = event.rows, multiSortMeta = event.multiSortMeta;
698
+ listParams.page = event.first / rows;
699
+ listParams.sort = multiSortMeta ? multiSortMeta : null;
700
+ if (filterData.codLot !== null && filterData.codLot !== undefined) {
701
+ listParams.filterQuery += " and containing(lower(codLot), lower('" + filterData.codLot
702
+ .replace(/\\/g, '')
703
+ .replace(/'/g, "\\'") + "'))";
704
+ }
705
+ else if (filterData.numSep !== null && filterData.numSep !== undefined) {
706
+ listParams.filterQuery += " and containing(lower(numSep), lower('" + filterData.numSep
707
+ .replace(/\\/g, '')
708
+ .replace(/'/g, "\\'") + "'))";
709
+ }
710
+ }
711
+ this.quantidadeDisponivelDemandaService
712
+ .list(listParams)
713
+ .pipe(takeUntil(this.ngUnsubscribe), map(function (list) { return ({
714
+ gridData: list.contents.map(function (item) { return (__assign(__assign({}, item), { id: _this.isSerie ? item.e200serId : item.e200lotId, label: _this.isSerie ? "" + item.numSep : "" + item.codLot })); }),
715
+ totalRecords: list.totalElements
716
+ }); }))
717
+ .subscribe(function (data) {
718
+ _this.quantidadeDisponivelDemandaLookupSuggestionsObservable.next(data.gridData);
719
+ _this.quantidadeDisponivelDemandalookupSearchObservable.next(data);
720
+ });
721
+ };
722
+ ErpLoteSerieComponent.prototype.onE200SerSearchRequest = function (event) {
723
+ var _this = this;
724
+ var filterQuery;
725
+ var deposito = '';
726
+ var first = event.first, rows = event.rows, multiSortMeta = event.multiSortMeta, filterData = event.filterData;
727
+ var page = first / rows;
728
+ var displayFields = ['e200ser.numSep'];
729
+ if (this.loteSerieParams.dadosProduto.e205dep) {
730
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
731
+ }
732
+ else {
733
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
734
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
735
+ }
736
+ var orderBy = multiSortMeta
737
+ ? multiSortMeta.map(function (s) { return (__assign(__assign({}, s), { order: s.order == 1 ? 'ASC' : 'DESC' })); })
738
+ : [{ field: 'e200ser.numSep', order: 'ASC' }];
739
+ filterQuery = {
740
+ e070emp: {
741
+ id: this.loteSerieParams.dadosProduto.e070emp
742
+ },
743
+ e205dep: {
744
+ id: deposito
745
+ },
746
+ e075der: {
747
+ id: this.loteSerieParams.dadosProduto.e075der
748
+ },
749
+ serLike: true,
750
+ serSal: true,
751
+ offset: page,
752
+ serDis: true,
753
+ size: rows
754
+ };
755
+ if (filterData['e200ser.numSep']) {
756
+ filterQuery.e200ser = [
757
+ {
758
+ numSep: filterData['e200ser.numSep']
759
+ }
760
+ ];
761
+ }
762
+ if (orderBy) {
763
+ filterQuery.orderBy = orderBy;
764
+ }
765
+ this.batchSeriesService
766
+ .listSeries(filterQuery)
767
+ .pipe(takeUntil(this.ngUnsubscribe))
768
+ .pipe(map(function (list) { return ({
769
+ gridData: list.series.map(function (item) { return (__assign(__assign({}, item), { label: displayFields.map(function (field) {
770
+ if (field.indexOf('.') > 0)
771
+ return _this.getProp(item, field);
772
+ return item[field];
773
+ }) })); }),
774
+ totalRecords: list.totalElements
775
+ }); }))
776
+ .subscribe(function (data) {
777
+ _this.e200serlookupSearchObservable.next(data);
778
+ });
779
+ };
780
+ ErpLoteSerieComponent.prototype.removeBatchOrSeries = function (rowData) {
781
+ if (this.blockedFields == false) {
782
+ this.qtdDistribuida -= this.isSerie ? 1 : Number(rowData.quantidade);
783
+ this.qtdRestante += this.isSerie ? 1 : Number(rowData.quantidade);
784
+ this.gridData = this.gridData.filter(function (batchOrSeries) {
785
+ return batchOrSeries.codigo != rowData.codigo;
786
+ });
787
+ this.loteSerieParams.lotesOrSeries = this.gridData;
788
+ }
789
+ };
790
+ ErpLoteSerieComponent.prototype.addBatchOrSeries = function () {
791
+ var e_1, _a;
792
+ var _this = this;
793
+ var _b, _c;
794
+ var codigo;
795
+ var id = '';
796
+ this.validateAllFormFields(this.formGroupBatchOrSeries);
797
+ if (this.formGroupBatchOrSeries.controls.bulkVisible.value) {
798
+ if (isEmpty(this.formGroupBatchOrSeries.controls.batchSerieBulk.value)) {
799
+ return;
800
+ }
801
+ var convertedArray = this.formGroupBatchOrSeries.controls.batchSerieBulk.value.split('\n');
802
+ this.gridData = [];
803
+ this.qtdDistribuida = 0;
804
+ this.qtdAdistribuir = this.loteSerieParams.quantidadeDistribuir;
805
+ this.qtdRestante = 0;
806
+ var linhaAtual_1 = 0;
807
+ if (convertedArray.length == 0) {
808
+ var msgError = this.translate.instant(this.prefix + "invalid_layout");
809
+ this.messageService.add({
810
+ severity: 'error',
811
+ summary: this.translate.instant(this.prefix + "invalid_layout"),
812
+ detail: msgError,
813
+ life: 20000
814
+ });
815
+ this.gridData = [];
816
+ throw msgError;
817
+ }
818
+ convertedArray.forEach(function (value) {
819
+ linhaAtual_1++;
820
+ var currentValue = value.split(';');
821
+ if ((_this.isSerie && currentValue.length > 3) || (!_this.isSerie && currentValue.length > 4)) {
822
+ var msgError = _this.translate.instant(_this.prefix + "invalid_layout");
823
+ _this.messageService.add({
824
+ severity: 'error',
825
+ summary: _this.translate.instant(_this.prefix + "invalid_layout"),
826
+ detail: msgError,
827
+ life: 20000
828
+ });
829
+ _this.gridData = [];
830
+ throw msgError;
831
+ }
832
+ var convertedValue = _this.isSerie
833
+ ? {
834
+ codigo: _this.toCode(currentValue[0], _this.translate.instant(_this.prefix + "codigo_not_informed_batch", { line: linhaAtual_1 })),
835
+ dataFabricacao: _this.toDate(currentValue[1], _this.translate.instant(_this.prefix + "manufacturing_date_invalid_batch", { line: linhaAtual_1 })),
836
+ dataValidade: _this.toDate(currentValue[2], _this.translate.instant(_this.prefix + "validate_date_invalid_batch", { line: linhaAtual_1 })),
837
+ quantidade: 1
838
+ }
839
+ : {
840
+ codigo: _this.toCode(currentValue[0], _this.translate.instant(_this.prefix + "codigo_not_informed_batch", { line: linhaAtual_1 })),
841
+ quantidade: _this.toAmount(currentValue[1], linhaAtual_1),
842
+ dataFabricacao: _this.toDate(currentValue[2], _this.translate.instant(_this.prefix + "manufacturing_date_invalid_batch", { line: linhaAtual_1 })),
843
+ dataValidade: _this.toDate(currentValue[3], _this.translate.instant(_this.prefix + "validate_date_invalid_batch", { line: linhaAtual_1 }))
844
+ };
845
+ // valida se a familia obriga a informar validade
846
+ if (_this.obrigaValidade && !convertedValue.dataValidade) {
847
+ var msgError = _this.translate.instant(_this.prefix + "error_selected_dates_batch", { line: linhaAtual_1 });
848
+ _this.messageService.add({
849
+ severity: 'error',
850
+ summary: _this.translate.instant(_this.prefix + "error_expiry_date"),
851
+ detail: msgError,
852
+ life: 20000
853
+ });
854
+ _this.gridData = [];
855
+ throw msgError;
856
+ }
857
+ // valida se existe código duplicado
858
+ if (_this.gridData.some(function (value) { return value.codigo === convertedValue.codigo; })) {
859
+ var msgError = _this.isSerie
860
+ ? _this.translate.instant(_this.prefix + "duplicated_series_msg_batch", { line: linhaAtual_1 })
861
+ : _this.translate.instant(_this.prefix + "duplicated_batch_msg_batch", { line: linhaAtual_1 });
862
+ _this.messageService.add({
863
+ severity: 'error',
864
+ summary: _this.translate.instant(_this.prefix + "batch_distribution_error"),
865
+ detail: msgError,
866
+ life: 20000
867
+ });
868
+ _this.gridData = [];
869
+ throw msgError;
870
+ }
871
+ // valida se a data de fabricação é maior que a validade
872
+ if (convertedValue.dataValidade &&
873
+ convertedValue.dataFabricacao &&
874
+ convertedValue.dataValidade < convertedValue.dataFabricacao) {
875
+ var msgError = _this.translate.instant(_this.prefix + "expiry_lower_than_manufacturing_batch", { line: linhaAtual_1 });
876
+ _this.messageService.add({
877
+ severity: 'error',
878
+ summary: _this.translate.instant(_this.prefix + "error_selected_dates"),
879
+ detail: msgError,
880
+ life: 20000
881
+ });
882
+ _this.gridData = [];
883
+ throw msgError;
884
+ }
885
+ _this.qtdDistribuida += convertedValue.quantidade;
886
+ // valida se a quantidade distribuida é maior que a quantidade a distribuir
887
+ if (_this.qtdDistribuida > _this.qtdAdistribuir) {
888
+ var msgError = _this.translate.instant(_this.prefix + "invalid_qty_msg_batch", { line: linhaAtual_1 });
889
+ _this.messageService.add({
890
+ severity: 'error',
891
+ summary: _this.translate.instant(_this.prefix + "distribution_error"),
892
+ detail: msgError,
893
+ life: 20000
894
+ });
895
+ _this.gridData = [];
896
+ throw msgError;
897
+ }
898
+ _this.gridData.push(convertedValue);
899
+ _this.qtdRestante = _this.qtdAdistribuir - _this.qtdDistribuida;
900
+ });
901
+ this.loteSerieParams.lotesOrSeries = this.gridData;
902
+ this.formGroupBatchOrSeries.controls.batchSerieBulk.reset();
903
+ this.messageService.clear();
904
+ return;
905
+ }
906
+ if (this.formGroupBatchOrSeries.valid &&
907
+ (this.formGroupBatchOrSeries.controls.serie.value || this.formGroupBatchOrSeries.controls.lote.value)) {
908
+ if (this.isSerie)
909
+ this.formGroupBatchOrSeries.controls.quantidade.patchValue(1);
910
+ if (this.formGroupBatchOrSeries.controls.dataValidade.value &&
911
+ this.formGroupBatchOrSeries.controls.dataFabricacao.value &&
912
+ this.formGroupBatchOrSeries.controls.dataValidade.value < this.formGroupBatchOrSeries.controls.dataFabricacao.value) {
913
+ this.messageService.add({
914
+ severity: 'error',
915
+ summary: this.translate.instant(this.prefix + "error_selected_dates"),
916
+ detail: this.translate.instant(this.prefix + "expiry_lower_than_manufacturing")
917
+ });
918
+ return;
919
+ }
920
+ if (this.obrigaValidade) {
921
+ if (!this.formGroupBatchOrSeries.controls.dataValidade.value) {
922
+ this.messageService.add({
923
+ severity: 'error',
924
+ summary: this.translate.instant(this.prefix + "error_selected_dates"),
925
+ detail: this.translate.instant(this.prefix + "error_expiry_date")
926
+ });
927
+ return;
928
+ }
929
+ }
930
+ var distributedQuantity = this.formGroupBatchOrSeries.get('quantidade').value
931
+ ? Number(this.formGroupBatchOrSeries.get('quantidade').value)
932
+ : 0;
933
+ if (distributedQuantity > 0) {
934
+ if (this.sum(this.qtdDistribuida, distributedQuantity, this.locale.number.scale) > this.qtdAdistribuir) {
935
+ this.messageService.add({
936
+ severity: 'error',
937
+ summary: this.translate.instant(this.prefix + "distribution_error"),
938
+ detail: this.translate.instant(this.prefix + "invalid_qty_msg")
939
+ });
940
+ return;
941
+ }
942
+ }
943
+ else {
944
+ this.messageService.add({
945
+ severity: 'error',
946
+ summary: this.translate.instant(this.prefix + "distribution_error"),
947
+ detail: this.translate.instant(this.prefix + "invalid_qtd")
948
+ });
949
+ return;
950
+ }
951
+ if (this.isSerie) {
952
+ if (this.isSaida) {
953
+ if (this.formGroupBatchOrSeries.controls.serie.value.e200ser) {
954
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.e200ser.numSep;
955
+ id = this.formGroupBatchOrSeries.controls.serie.value.e200ser.id;
956
+ }
957
+ else {
958
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.numSep;
959
+ id = this.formGroupBatchOrSeries.controls.serie.value.id;
960
+ }
961
+ }
962
+ else {
963
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.toUpperCase();
964
+ this.formGroupBatchOrSeries.controls.serie.patchValue(this.formGroupBatchOrSeries.controls.serie.value.toUpperCase());
965
+ }
966
+ }
967
+ else {
968
+ if (this.isSaida) {
969
+ if (this.formGroupBatchOrSeries.controls.lote.value.e200lot) {
970
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.e200lot.codLote;
971
+ id = this.formGroupBatchOrSeries.controls.lote.value.e200lot.id;
972
+ }
973
+ else {
974
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.codLot;
975
+ id = this.formGroupBatchOrSeries.controls.lote.value.id;
976
+ }
977
+ }
978
+ else {
979
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.toUpperCase();
980
+ this.formGroupBatchOrSeries.controls.lote.patchValue(this.formGroupBatchOrSeries.controls.lote.value.toUpperCase());
981
+ }
982
+ }
983
+ if (this.isDuplicateBatchSeries()) {
984
+ if (!this.isSerie) {
985
+ this.messageService.add({
986
+ severity: 'error',
987
+ summary: this.translate.instant(this.prefix + "batch_distribution_error"),
988
+ detail: this.translate.instant(this.prefix + "duplicated_batch_msg")
989
+ });
990
+ }
991
+ else {
992
+ this.messageService.add({
993
+ severity: 'error',
994
+ summary: this.translate.instant(this.prefix + "series_distribution_error"),
995
+ detail: this.translate.instant(this.prefix + "duplicated_series_msg")
996
+ });
997
+ }
998
+ return;
999
+ }
1000
+ var loteOrSerieValues = this.formGroupBatchOrSeries.getRawValue();
1001
+ loteOrSerieValues = this.formatDates(loteOrSerieValues, ['dataFabricacao', 'dataValidade']);
1002
+ if (((_c = (_b = this.loteSerieParams) === null || _b === void 0 ? void 0 : _b.invoiceInformation) === null || _c === void 0 ? void 0 : _c.origin) === EnumInvoiceOrigin.V2 && loteOrSerieValues.serie) {
1003
+ if (Array.isArray(loteOrSerieValues.serie)) {
1004
+ try {
1005
+ for (var _d = __values(loteOrSerieValues.serie), _e = _d.next(); !_e.done; _e = _d.next()) {
1006
+ var value = _e.value;
1007
+ this.gridData.push({
1008
+ id: value.id,
1009
+ codigo: value.numSep,
1010
+ quantidade: value.qtdDisponivel,
1011
+ dataFabricacao: value.datFabSep,
1012
+ dataValidade: value.datVltSep
1013
+ });
1014
+ this.qtdDistribuida = this.sum(this.qtdDistribuida, Number(value.qtdDisponivel), this.locale.number.scale);
1015
+ this.qtdRestante = this.sub(this.qtdRestante, Number(value.qtdDisponivel), this.locale.number.scale);
1016
+ }
1017
+ }
1018
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
1019
+ finally {
1020
+ try {
1021
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
1022
+ }
1023
+ finally { if (e_1) throw e_1.error; }
1024
+ }
1025
+ }
1026
+ else {
1027
+ this.gridData.push({
1028
+ id: loteOrSerieValues.serie.id,
1029
+ codigo: loteOrSerieValues.serie.numSep,
1030
+ quantidade: loteOrSerieValues.serie.qtdDisponivel,
1031
+ dataFabricacao: loteOrSerieValues.serie.datFabSep,
1032
+ dataValidade: loteOrSerieValues.serie.datVltSep
1033
+ });
1034
+ this.qtdDistribuida = this.sum(this.qtdDistribuida, Number(loteOrSerieValues.serie.qtdDisponivel), this.locale.number.scale);
1035
+ this.qtdRestante = this.sub(this.qtdRestante, Number(loteOrSerieValues.serie.qtdDisponivel), this.locale.number.scale);
1036
+ }
1037
+ }
1038
+ else {
1039
+ this.gridData.push({
1040
+ id: id,
1041
+ codigo: codigo,
1042
+ quantidade: loteOrSerieValues.quantidade,
1043
+ dataFabricacao: loteOrSerieValues.dataFabricacao,
1044
+ dataValidade: loteOrSerieValues.dataValidade
1045
+ });
1046
+ this.qtdDistribuida = this.sum(this.qtdDistribuida, Number(loteOrSerieValues.quantidade), this.locale.number.scale);
1047
+ this.qtdRestante = this.sub(this.qtdRestante, Number(loteOrSerieValues.quantidade), this.locale.number.scale);
1048
+ }
1049
+ this.clearBatchSeries();
1050
+ this.loteSerieParams.lotesOrSeries = this.gridData;
1051
+ }
1052
+ else {
1053
+ return this.validateAllFormFields(this.formGroupBatchOrSeries);
1054
+ }
1055
+ };
1056
+ ErpLoteSerieComponent.prototype.toCode = function (currentValue, msgError) {
1057
+ currentValue = String(currentValue).trim().toUpperCase();
1058
+ if (isEmpty(currentValue)) {
1059
+ this.messageService.add({
1060
+ severity: 'error',
1061
+ summary: this.translate.instant(this.prefix + "codigo_not_informed"),
1062
+ detail: msgError,
1063
+ life: 20000
1064
+ });
1065
+ this.gridData = [];
1066
+ throw msgError;
1067
+ }
1068
+ return currentValue;
1069
+ };
1070
+ ErpLoteSerieComponent.prototype.toAmount = function (currentValue, linhaAtual) {
1071
+ var convertedValue = this.toNumber(currentValue);
1072
+ if (!currentValue || (!convertedValue && convertedValue != 0)) {
1073
+ var msgError = this.translate.instant(this.prefix + "amount_not_informed_batch", { line: linhaAtual });
1074
+ this.messageService.add({
1075
+ severity: 'error',
1076
+ summary: this.translate.instant(this.prefix + "amount_not_informed"),
1077
+ detail: msgError,
1078
+ life: 20000
1079
+ });
1080
+ this.gridData = [];
1081
+ throw msgError;
1082
+ }
1083
+ if (String(currentValue).indexOf(this.locale.number.thousandsSeparator) > 0) {
1084
+ var msgError = this.translate.instant(this.prefix + "format_number_invalid_batch", { line: linhaAtual });
1085
+ this.messageService.add({
1086
+ severity: 'error',
1087
+ summary: this.translate.instant(this.prefix + "amount_invalid_batch"),
1088
+ detail: msgError,
1089
+ life: 20000
1090
+ });
1091
+ this.gridData = [];
1092
+ throw msgError;
1093
+ }
1094
+ if (convertedValue <= 0) {
1095
+ var msgError = this.translate.instant(this.prefix + "amount_quantity_that_zero_batch", { line: linhaAtual });
1096
+ this.messageService.add({
1097
+ severity: 'error',
1098
+ summary: this.translate.instant(this.prefix + "amount_invalid_batch"),
1099
+ detail: msgError,
1100
+ life: 20000
1101
+ });
1102
+ this.gridData = [];
1103
+ throw msgError;
1104
+ }
1105
+ var temDecimal = String(convertedValue).split('.');
1106
+ if (temDecimal.length > 1 && this.locale.number.scale != String(convertedValue).split('.')[1].length) {
1107
+ var msgError = this.translate.instant(this.prefix + "invalid_decimals_batch", { line: linhaAtual });
1108
+ this.messageService.add({
1109
+ severity: 'error',
1110
+ summary: this.translate.instant(this.prefix + "amount_invalid_batch"),
1111
+ detail: msgError,
1112
+ life: 20000
1113
+ });
1114
+ this.gridData = [];
1115
+ throw msgError;
1116
+ }
1117
+ return convertedValue;
1118
+ };
1119
+ ErpLoteSerieComponent.prototype.toNumber = function (currentValue) {
1120
+ return isNotEmpty(currentValue)
1121
+ ? Number(currentValue.replace(this.locale.number.thousandsSeparator, '').replace(this.locale.number.decimalSeparator, '.'))
1122
+ : undefined;
1123
+ };
1124
+ ErpLoteSerieComponent.prototype.toDate = function (currentValue, msgError) {
1125
+ if (isNotEmpty(currentValue) && !moment(currentValue.trim(), 'L', true).isValid()) {
1126
+ this.messageService.add({
1127
+ severity: 'error',
1128
+ summary: this.translate.instant(this.prefix + "invalid_date_batch"),
1129
+ detail: msgError,
1130
+ life: 20000
1131
+ });
1132
+ this.gridData = [];
1133
+ throw msgError;
1134
+ }
1135
+ return isNotEmpty(currentValue) ? moment(currentValue.trim(), 'L', true).format('YYYY-MM-DD') : undefined;
1136
+ };
1137
+ ErpLoteSerieComponent.prototype.isDuplicateBatchSeries = function () {
1138
+ var e_2, _a, e_3, _b;
1139
+ var _this = this;
1140
+ var _c, _d, _e, _f, _g, _h;
1141
+ var codigo;
1142
+ if (!this.isSerie) {
1143
+ if (this.isSaida) {
1144
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.e200lot
1145
+ ? this.formGroupBatchOrSeries.controls.lote.value.e200lot.codLote
1146
+ : this.formGroupBatchOrSeries.controls.lote.value.codLot;
1147
+ }
1148
+ else {
1149
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.toUpperCase();
1150
+ }
1151
+ return this.gridData.find(function (element) {
1152
+ if (element.codigo === codigo)
1153
+ return true;
1154
+ return false;
1155
+ });
1156
+ }
1157
+ else {
1158
+ if (this.isSaida && Array.isArray((_e = (_d = (_c = this.formGroupBatchOrSeries) === null || _c === void 0 ? void 0 : _c.controls) === null || _d === void 0 ? void 0 : _d.serie) === null || _e === void 0 ? void 0 : _e.value)) {
1159
+ try {
1160
+ for (var _j = __values((_h = (_g = (_f = this.formGroupBatchOrSeries) === null || _f === void 0 ? void 0 : _f.controls) === null || _g === void 0 ? void 0 : _g.serie) === null || _h === void 0 ? void 0 : _h.value), _k = _j.next(); !_k.done; _k = _j.next()) {
1161
+ var series = _k.value;
1162
+ try {
1163
+ for (var _l = (e_3 = void 0, __values(this.gridData)), _m = _l.next(); !_m.done; _m = _l.next()) {
1164
+ var addedSeries = _m.value;
1165
+ if (series.numSep === addedSeries.codigo)
1166
+ return true;
1167
+ }
1168
+ }
1169
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
1170
+ finally {
1171
+ try {
1172
+ if (_m && !_m.done && (_b = _l.return)) _b.call(_l);
1173
+ }
1174
+ finally { if (e_3) throw e_3.error; }
1175
+ }
1176
+ }
1177
+ }
1178
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
1179
+ finally {
1180
+ try {
1181
+ if (_k && !_k.done && (_a = _j.return)) _a.call(_j);
1182
+ }
1183
+ finally { if (e_2) throw e_2.error; }
1184
+ }
1185
+ return false;
1186
+ }
1187
+ return this.gridData.find(function (element) {
1188
+ if (_this.isSaida) {
1189
+ codigo = _this.formGroupBatchOrSeries.controls.serie.value.e200ser
1190
+ ? _this.formGroupBatchOrSeries.controls.serie.value.e200ser.numSep
1191
+ : _this.formGroupBatchOrSeries.controls.serie.value.numSep;
1192
+ }
1193
+ else {
1194
+ codigo = _this.formGroupBatchOrSeries.controls.serie.value.toUpperCase();
1195
+ }
1196
+ if (element.codigo === codigo)
1197
+ return true;
1198
+ return false;
1199
+ });
1200
+ }
1201
+ };
1202
+ ErpLoteSerieComponent.prototype.clearBatchSeries = function () {
1203
+ this.formGroupBatchOrSeries.reset();
1204
+ if (this.isSaida) {
1205
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
1206
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
1207
+ }
1208
+ else {
1209
+ if (this.blockedFields == false)
1210
+ this.formGroupBatchOrSeries.controls.dataFabricacao.enable();
1211
+ if (!this.disableDataValidade && this.blockedFields == false) {
1212
+ this.formGroupBatchOrSeries.controls.dataValidade.enable();
1213
+ }
1214
+ }
1215
+ };
1216
+ ErpLoteSerieComponent.prototype.validaLoteorSerie = function (event) {
1217
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
1218
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
1219
+ if (!this.isSerie) {
1220
+ this.getDatas(event.codLot ? event.codLot : event.e200lot.codLote);
1221
+ this.consultaSaldoEstoque(event.codLot ? event.codLot : event.e200lot.codLote);
1222
+ }
1223
+ else {
1224
+ this.getDatas(event.numSep ? event.numSep : event.e200ser.numSep);
1225
+ this.consultaSaldoEstoque(event.numSep ? event.numSep : event.e200ser.numSep);
1226
+ }
1227
+ };
1228
+ ErpLoteSerieComponent.prototype.onBlurValidaLoteorSerie = function (value) {
1229
+ // Quando realiza o tab, abre o calendar, por isso é necessário desabilitar antes
1230
+ if (value) {
1231
+ if (this.validateInvalidChars) {
1232
+ var newValue = value.trim();
1233
+ if (value !== newValue) {
1234
+ if (this.loteSerieParams.tipoControleProduto == EnumTipoControleProduto.Serie) {
1235
+ this.formGroupBatchOrSeries.controls.serie.patchValue(newValue);
1236
+ }
1237
+ else {
1238
+ this.formGroupBatchOrSeries.controls.lote.patchValue(newValue);
1239
+ }
1240
+ }
1241
+ }
1242
+ this.getDatas(value.toUpperCase());
1243
+ this.consultaSaldoEstoque(value.toUpperCase());
1244
+ }
1245
+ };
1246
+ ErpLoteSerieComponent.prototype.getDatas = function (value) {
1247
+ var _this = this;
1248
+ this.formGroupBatchOrSeries.controls.dataFabricacao.reset();
1249
+ this.formGroupBatchOrSeries.controls.dataValidade.reset();
1250
+ this.formGroupBatchOrSeries.controls.saldo.reset();
1251
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
1252
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
1253
+ var filterQuery;
1254
+ var deposito = '';
1255
+ if (this.isSerie) {
1256
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1257
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1258
+ }
1259
+ else {
1260
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1261
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1262
+ }
1263
+ filterQuery = {
1264
+ e070emp: {
1265
+ id: this.loteSerieParams.dadosProduto.e070emp
1266
+ },
1267
+ e205dep: {
1268
+ id: deposito
1269
+ },
1270
+ e075der: {
1271
+ id: this.loteSerieParams.dadosProduto.e075der
1272
+ },
1273
+ serLike: false,
1274
+ serSal: true,
1275
+ serDis: true,
1276
+ offset: 0,
1277
+ size: 10,
1278
+ orderBy: [
1279
+ {
1280
+ field: 'e200ser.numSep',
1281
+ order: 'ASC'
1282
+ }
1283
+ ]
1284
+ };
1285
+ if (value) {
1286
+ filterQuery.e200ser = [
1287
+ {
1288
+ numSep: value
1289
+ }
1290
+ ];
1291
+ }
1292
+ this.batchSeriesService
1293
+ .listSeries(filterQuery)
1294
+ .pipe(takeUntil(this.ngUnsubscribe))
1295
+ .subscribe(function (response) {
1296
+ if (response.series.length > 0) {
1297
+ var dates = _this.formatDatesToCalendar(response.series[0], ['datFab', 'datVlt']);
1298
+ if (dates.e200ser.datFab) {
1299
+ _this.formGroupBatchOrSeries.controls.dataFabricacao.patchValue(moment(dates.e200ser.datFab).toDate());
1300
+ }
1301
+ if (dates.e200ser.datVlt) {
1302
+ _this.formGroupBatchOrSeries.controls.dataValidade.patchValue(moment(dates.e200ser.datVlt).toDate());
1303
+ }
1304
+ }
1305
+ else {
1306
+ if (!_this.isSaida) {
1307
+ _this.formGroupBatchOrSeries.controls.dataFabricacao.enable();
1308
+ }
1309
+ if (!_this.disableDataValidade && _this.blockedFields == false && !_this.isSaida)
1310
+ _this.formGroupBatchOrSeries.controls.dataValidade.enable();
1311
+ }
1312
+ });
1313
+ }
1314
+ else {
1315
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1316
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1317
+ }
1318
+ else {
1319
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1320
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1321
+ }
1322
+ filterQuery = {
1323
+ e070emp: {
1324
+ id: this.loteSerieParams.dadosProduto.e070emp
1325
+ },
1326
+ e205dep: {
1327
+ id: deposito
1328
+ },
1329
+ e075der: {
1330
+ id: this.loteSerieParams.dadosProduto.e075der
1331
+ },
1332
+ lotLike: false,
1333
+ lotSal: true,
1334
+ lotDis: true,
1335
+ offset: 0,
1336
+ size: 10,
1337
+ orderBy: [
1338
+ {
1339
+ field: 'e200lot.codLot',
1340
+ order: 'ASC'
1341
+ }
1342
+ ]
1343
+ };
1344
+ if (value) {
1345
+ filterQuery.e200lot = [
1346
+ {
1347
+ codLot: value
1348
+ }
1349
+ ];
1350
+ }
1351
+ this.batchSeriesService
1352
+ .listBatch(filterQuery)
1353
+ .pipe(takeUntil(this.ngUnsubscribe))
1354
+ .subscribe(function (response) {
1355
+ if (response.lotes.length > 0) {
1356
+ var dates = _this.formatDatesToCalendar(response.lotes[0], ['datFab', 'datVlt']);
1357
+ if (dates.e200lot.datFab) {
1358
+ _this.formGroupBatchOrSeries.controls.dataFabricacao.patchValue(moment(dates.e200lot.datFab).toDate());
1359
+ }
1360
+ if (dates.e200lot.datVlt) {
1361
+ _this.formGroupBatchOrSeries.controls.dataValidade.patchValue(moment(dates.e200lot.datVlt).toDate());
1362
+ }
1363
+ }
1364
+ else {
1365
+ if (!_this.isSaida) {
1366
+ _this.formGroupBatchOrSeries.controls.dataFabricacao.enable();
1367
+ }
1368
+ if (!_this.disableDataValidade && _this.blockedFields == false && !_this.isSaida)
1369
+ _this.formGroupBatchOrSeries.controls.dataValidade.enable();
1370
+ }
1371
+ });
1372
+ }
1373
+ };
1374
+ ErpLoteSerieComponent.prototype.processFamilySupplyInfo = function (familyID) {
1375
+ var _this = this;
1376
+ this.batchSeriesService
1377
+ .getProductFamilySupplyInfo(familyID)
1378
+ .pipe(takeUntil(this.ngUnsubscribe))
1379
+ .subscribe(function (response) {
1380
+ var supplyInfo = response.contents[0];
1381
+ _this.obrigaValidade = false;
1382
+ _this.formGroupBatchOrSeries.controls.dataValidade.setValidators([]);
1383
+ switch (supplyInfo === null || supplyInfo === void 0 ? void 0 : supplyInfo.ctrVld) {
1384
+ case 'VO':
1385
+ _this.formGroupBatchOrSeries.controls.dataValidade.clearValidators();
1386
+ _this.formGroupBatchOrSeries.controls.dataValidade.setValidators([Validators.required]);
1387
+ if (_this.blockedFields == false && !_this.isSaida)
1388
+ _this.formGroupBatchOrSeries.controls.dataValidade.enable();
1389
+ _this.obrigaValidade = true;
1390
+ break;
1391
+ case 'VD':
1392
+ _this.formGroupBatchOrSeries.controls.dataValidade.disable();
1393
+ _this.disableDataValidade = true;
1394
+ break;
1395
+ case 'VL':
1396
+ if (_this.blockedFields == false && !_this.isSaida)
1397
+ _this.formGroupBatchOrSeries.controls.dataValidade.enable();
1398
+ break;
1399
+ }
1400
+ });
1401
+ this.formGroupBatchOrSeries.controls.dataValidade.updateValueAndValidity({ emitEvent: false });
1402
+ };
1403
+ ErpLoteSerieComponent.prototype.consultaSaldoEstoque = function (value) {
1404
+ var _this = this;
1405
+ var balancePayload = {};
1406
+ if (this.isSerie) {
1407
+ balancePayload = {
1408
+ e205dep: {
1409
+ id: this.loteSerieParams.dadosProduto.e205dep
1410
+ ? this.loteSerieParams.dadosProduto.e205dep
1411
+ : this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id
1412
+ },
1413
+ e075der: { id: this.loteSerieParams.dadosProduto.e075der },
1414
+ e200ser: { numSep: value }
1415
+ };
1416
+ }
1417
+ else {
1418
+ balancePayload = {
1419
+ e205dep: {
1420
+ id: this.loteSerieParams.dadosProduto.e205dep
1421
+ ? this.loteSerieParams.dadosProduto.e205dep
1422
+ : this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id
1423
+ },
1424
+ e075der: { id: this.loteSerieParams.dadosProduto.e075der },
1425
+ e200lot: { codLot: value }
1426
+ };
1427
+ }
1428
+ this.batchSeriesService
1429
+ .consultarSaldoEstoque(balancePayload)
1430
+ .pipe(takeUntil(this.ngUnsubscribe))
1431
+ .subscribe(function (response) {
1432
+ if (!response.saldo) {
1433
+ _this.formGroupBatchOrSeries.controls.saldo.patchValue(0);
1434
+ }
1435
+ else {
1436
+ _this.formGroupBatchOrSeries.controls.saldo.patchValue(response.saldo);
1437
+ }
1438
+ });
1439
+ };
1440
+ ErpLoteSerieComponent.prototype.getQuantidadeDistribuida = function () {
1441
+ var _this = this;
1442
+ var qtd = 0;
1443
+ this.loteSerieParams.lotesOrSeries.forEach(function (val) {
1444
+ if (!_this.isSerie)
1445
+ qtd = _this.sum(qtd, Number(val.quantidade), _this.locale.number.scale);
1446
+ else
1447
+ qtd = _this.sum(qtd, 1, _this.locale.number.scale);
1448
+ });
1449
+ return qtd;
1450
+ };
1451
+ ErpLoteSerieComponent.prototype.validateAllFormFields = function (formGroup) {
1452
+ var _this = this;
1453
+ Object.keys(formGroup.controls).forEach(function (field) {
1454
+ var control = formGroup.get(field);
1455
+ if (control instanceof FormControl)
1456
+ control.markAsDirty({ onlySelf: true });
1457
+ else if (control instanceof FormGroup)
1458
+ _this.validateAllFormFields(control);
1459
+ });
1460
+ };
1461
+ ErpLoteSerieComponent.prototype.onRouteDataChange = function (data) {
1462
+ this.localeConfig = data.localeConfig;
1463
+ this.locale = this.localeConfig;
1464
+ this.locale.number.scale = this.loteSerieParams.dadosProduto.qtdDec ? this.loteSerieParams.dadosProduto.qtdDec : 0;
1465
+ };
1466
+ ErpLoteSerieComponent.prototype.getE200LotSearchGridFields = function () {
1467
+ var searchGridFields = [
1468
+ new FormField({
1469
+ name: 'e200lot.codLote',
1470
+ label: this.translate.instant(this.prefix + "lookup_e200lot_cod_dep"),
1471
+ type: FieldType.String
1472
+ }),
1473
+ new FormField({
1474
+ name: 'e200lot.datFab',
1475
+ label: this.translate.instant(this.prefix + "lookup_e200lot_dat_fab"),
1476
+ type: FieldType.Date
1477
+ }),
1478
+ new FormField({
1479
+ name: 'e200lot.datVlt',
1480
+ label: this.translate.instant(this.prefix + "lookup_e200lot_dat_vlt"),
1481
+ type: FieldType.Date
1482
+ }),
1483
+ new FormField({
1484
+ name: 'qtdDis',
1485
+ label: this.translate.instant(this.prefix + "lookup_e200lot_qtd_dis"),
1486
+ type: FieldType.Double
1487
+ })
1488
+ ];
1489
+ return searchGridFields;
1490
+ };
1491
+ ErpLoteSerieComponent.prototype.getE200SerSearchGridFields = function () {
1492
+ var searchGridFields = [
1493
+ new FormField({
1494
+ name: 'e200ser.numSep',
1495
+ label: this.translate.instant(this.prefix + "lookup_e200ser_num_sep"),
1496
+ type: FieldType.String
1497
+ }),
1498
+ new FormField({
1499
+ name: 'e200ser.datFab',
1500
+ label: this.translate.instant(this.prefix + "lookup_e200ser_dat_fab"),
1501
+ type: FieldType.Date
1502
+ }),
1503
+ new FormField({
1504
+ name: 'e200ser.datVlt',
1505
+ label: this.translate.instant(this.prefix + "lookup_e200ser_dat_vlt"),
1506
+ type: FieldType.Date
1507
+ }),
1508
+ new FormField({
1509
+ name: 'qtdDis',
1510
+ label: this.translate.instant(this.prefix + "lookup_e200ser_qtd_dis"),
1511
+ type: FieldType.Double
1512
+ })
1513
+ ];
1514
+ return searchGridFields;
1515
+ };
1516
+ ErpLoteSerieComponent.prototype.onE200LotLookupRequest = function (value) {
1517
+ var _this = this;
1518
+ var deposito = '';
1519
+ var displayFields = this.loteLookupDisplayFields;
1520
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1521
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1522
+ }
1523
+ else {
1524
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1525
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1526
+ }
1527
+ var filterQuery = {
1528
+ e070emp: {
1529
+ id: this.loteSerieParams.dadosProduto.e070emp
1530
+ },
1531
+ e205dep: {
1532
+ id: deposito
1533
+ },
1534
+ e075der: {
1535
+ id: this.loteSerieParams.dadosProduto.e075der
1536
+ },
1537
+ lotLike: true,
1538
+ lotSal: true,
1539
+ lotDis: true,
1540
+ offset: 0,
1541
+ size: 10,
1542
+ orderBy: [
1543
+ {
1544
+ field: 'e200lot.codLot',
1545
+ order: 'ASC'
1546
+ }
1547
+ ]
1548
+ };
1549
+ if (value) {
1550
+ filterQuery.e200lot = [
1551
+ {
1552
+ codLot: value
1553
+ }
1554
+ ];
1555
+ }
1556
+ this.batchSeriesService
1557
+ .listBatch(filterQuery)
1558
+ .pipe(takeUntil(this.ngUnsubscribe))
1559
+ .pipe(map(function (list) { return (__assign(__assign({}, list), { lotes: list.lotes.map(function (item) { return (__assign(__assign({}, item), { label: displayFields.map(function (field) {
1560
+ if (field.indexOf('.') > 0)
1561
+ return _this.getProp(item, field);
1562
+ return item[field];
1563
+ }) })); }) })); }))
1564
+ .subscribe(function (list) {
1565
+ _this.e200lotLookupSuggestionsObservable.next(list.lotes);
1566
+ });
1567
+ };
1568
+ ErpLoteSerieComponent.prototype.onE200SerLookupRequest = function (value) {
1569
+ var _this = this;
1570
+ var deposito = '';
1571
+ var displayFields = this.serieLookupDisplayFields;
1572
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1573
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1574
+ }
1575
+ else {
1576
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1577
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1578
+ }
1579
+ var filterQuery = {
1580
+ e070emp: {
1581
+ id: this.loteSerieParams.dadosProduto.e070emp
1582
+ },
1583
+ e205dep: {
1584
+ id: deposito
1585
+ },
1586
+ e075der: {
1587
+ id: this.loteSerieParams.dadosProduto.e075der
1588
+ },
1589
+ serLike: true,
1590
+ serSal: true,
1591
+ serDis: true,
1592
+ offset: 0,
1593
+ size: 10,
1594
+ orderBy: [
1595
+ {
1596
+ field: 'e200ser.numSep',
1597
+ order: 'ASC'
1598
+ }
1599
+ ]
1600
+ };
1601
+ if (value) {
1602
+ filterQuery.e200ser = [
1603
+ {
1604
+ numSep: value
1605
+ }
1606
+ ];
1607
+ }
1608
+ this.batchSeriesService
1609
+ .listSeries(filterQuery)
1610
+ .pipe(takeUntil(this.ngUnsubscribe))
1611
+ .pipe(map(function (list) { return (__assign(__assign({}, list), { series: list.series.map(function (item) { return (__assign(__assign({}, item), { label: displayFields.map(function (field) {
1612
+ if (field.indexOf('.') > 0)
1613
+ return _this.getProp(item, field);
1614
+ return item[field];
1615
+ }) })); }) })); }))
1616
+ .subscribe(function (list) {
1617
+ _this.e200serLookupSuggestionsObservable.next(list.series);
1618
+ });
1619
+ };
1620
+ ErpLoteSerieComponent.prototype.formatDates = function (requestBody, properties) {
1621
+ return Object.keys(requestBody).reduce(function (prev, value) {
1622
+ if (properties.indexOf(value) > -1 && requestBody[value]) {
1623
+ prev[value] = moment(requestBody[value]).format('YYYY-MM-DD');
1624
+ }
1625
+ else {
1626
+ prev[value] = requestBody[value];
1627
+ }
1628
+ return prev;
1629
+ }, {});
1630
+ };
1631
+ ErpLoteSerieComponent.prototype.formatDatesToCalendar = function (requestBody, properties) {
1632
+ return Object.keys(requestBody).reduce(function (prev, value) {
1633
+ if (properties.indexOf(value) > -1 && requestBody[value]) {
1634
+ if (requestBody[value] != undefined && requestBody[value] != null) {
1635
+ prev[value] = moment(requestBody[value]).toDate();
1636
+ }
1637
+ else {
1638
+ prev[value] = '';
1639
+ }
1640
+ }
1641
+ else {
1642
+ prev[value] = requestBody[value];
1643
+ }
1644
+ return prev;
1645
+ }, {});
1646
+ };
1647
+ ErpLoteSerieComponent.prototype.translateHtml = function (text, value, shortcut) {
1648
+ if (value === void 0) { value = null; }
1649
+ if (shortcut === void 0) { shortcut = null; }
1650
+ var ret = this.translate.instant("" + this.prefix + text, { value: value });
1651
+ return shortcut ? ret + " " + shortcut : ret;
1652
+ };
1653
+ ErpLoteSerieComponent.prototype.onDistributeSeries = function () {
1654
+ var _this = this;
1655
+ var _a, _b;
1656
+ this.batchSeriesService
1657
+ .obterNecessidades({
1658
+ e070empId: this.loteSerieParams.invoiceInformation.company.id,
1659
+ e070filId: this.loteSerieParams.invoiceInformation.branch.id,
1660
+ itensId: [this.loteSerieParams.invoiceInformation.item.product.id],
1661
+ tipo: EnumTipoDocumentoParametros.PedidoVenda,
1662
+ documentoId: null,
1663
+ numeroDocumentoPai: [(_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.orderInformation) === null || _b === void 0 ? void 0 : _b.number.toString()],
1664
+ dataInicial: null,
1665
+ dataFinal: null,
1666
+ situacao: null,
1667
+ codigoDemanda: null,
1668
+ somenteUrgentes: false,
1669
+ pageRequest: {
1670
+ offset: 0,
1671
+ size: 10
1672
+ }
1673
+ })
1674
+ .pipe(first())
1675
+ .subscribe(function (_a) {
1676
+ var necessidades = _a.necessidades;
1677
+ var _b, _c;
1678
+ var itemId = (_c = (_b = _this.loteSerieParams) === null || _b === void 0 ? void 0 : _b.orderInformation) === null || _c === void 0 ? void 0 : _c.item.id;
1679
+ var atendimento = necessidades.find(function (necessidade) { var _a; return ((_a = necessidade.documento) === null || _a === void 0 ? void 0 : _a.idExterno) === itemId; });
1680
+ var getUrlInput = {
1681
+ identifiers: [
1682
+ {
1683
+ domainName: 'erpx_sup',
1684
+ serviceName: 'demandas',
1685
+ appName: 'erpx-sup-demandas',
1686
+ route: "demandas/atendimentos/" + atendimento.id + "?isSeriesDistributionVisible=true"
1687
+ }
1688
+ ]
1689
+ };
1690
+ _this.batchSeriesService
1691
+ .getUrl(getUrlInput)
1692
+ .pipe(first())
1693
+ .subscribe(function (getUrlOutput) {
1694
+ window.open("" + getUrlOutput.frontends[0].embeddedURL, '_blank');
1695
+ });
1696
+ });
1697
+ };
1698
+ ErpLoteSerieComponent.prototype.onDelete = function () {
1699
+ var _this = this;
1700
+ this.selection.forEach(function (value) { return _this.removeBatchOrSeries(value); });
1701
+ this.selection = [];
1702
+ };
1703
+ ErpLoteSerieComponent.prototype.isDistributeSeriesButtonVisible = function () {
1704
+ var _a, _b, _c, _d, _e, _f;
1705
+ return (((_d = (_c = (_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.item) === null || _c === void 0 ? void 0 : _c.product) === null || _d === void 0 ? void 0 : _d.isSerialControlled) &&
1706
+ ((_f = (_e = this.loteSerieParams) === null || _e === void 0 ? void 0 : _e.invoiceInformation) === null || _f === void 0 ? void 0 : _f.origin) === EnumInvoiceOrigin.V2);
1707
+ };
1708
+ ErpLoteSerieComponent.prototype.onBlurQuantity = function () {
1709
+ if (!this.isSaida)
1710
+ return;
1711
+ var quantity = Number(this.formGroupBatchOrSeries.controls.quantidade.value);
1712
+ var balance = Number(this.formGroupBatchOrSeries.controls.saldo.value);
1713
+ if (quantity > balance)
1714
+ this.messageService.add({
1715
+ severity: 'warn',
1716
+ summary: this.translate.instant(this.prefix + "warn"),
1717
+ detail: this.translate.instant(this.prefix + "invalid_batch_distribution_quantity")
1718
+ });
1719
+ };
1720
+ ErpLoteSerieComponent.prototype.getMenuOptionsPerRow = function (rowData) {
1721
+ var _this = this;
1722
+ return [
1723
+ {
1724
+ label: this.translate.instant(this.prefix + "edit"),
1725
+ command: function () {
1726
+ var _a;
1727
+ _this.table.editingRowKeys = (_a = {}, _a[rowData.codigo] = true, _a);
1728
+ var formField = _this.editingFormFields.find(function (field) { return field.name === 'quantidade'; });
1729
+ formField.scale = _this.loteSerieParams.dadosProduto.qtdDec;
1730
+ _this.editingFormGroup.get('quantidade').setValue(rowData.quantidade);
1731
+ }
1732
+ },
1733
+ {
1734
+ label: this.translate.instant(this.prefix + "deleted_message_title"),
1735
+ command: function () { return _this.removeBatchOrSeries(rowData); }
1736
+ }
1737
+ ];
1738
+ };
1739
+ ErpLoteSerieComponent.prototype.onCancelEdit = function (rowData) {
1740
+ var _a;
1741
+ this.table.editingRowKeys = (_a = {}, _a[rowData.codigo] = false, _a);
1742
+ };
1743
+ ErpLoteSerieComponent.prototype.onSaveEdit = function (rowData) {
1744
+ var _a;
1745
+ this.validateAllFormFields(this.editingFormGroup);
1746
+ if (this.editingFormGroup.invalid)
1747
+ return;
1748
+ var quantity = Number(this.editingFormGroup.get('quantidade').value);
1749
+ if (quantity === 0) {
1750
+ this.messageService.add({
1751
+ severity: 'error',
1752
+ summary: this.translate.instant(this.prefix + "distribution_error"),
1753
+ detail: this.translate.instant(this.prefix + "invalid_qtd")
1754
+ });
1755
+ return;
1756
+ }
1757
+ var distributedQuantity = this.qtdDistribuida - Number(rowData.quantidade) + quantity;
1758
+ if (distributedQuantity > this.qtdAdistribuir) {
1759
+ this.messageService.add({
1760
+ severity: 'error',
1761
+ summary: this.translate.instant(this.prefix + "distribution_error"),
1762
+ detail: this.translate.instant(this.prefix + "invalid_qty_msg"),
1763
+ sticky: true
1764
+ });
1765
+ return;
1766
+ }
1767
+ this.qtdDistribuida = distributedQuantity;
1768
+ this.qtdRestante = this.qtdAdistribuir - this.qtdDistribuida;
1769
+ this.table.editingRowKeys = __assign(__assign({}, this.table.editingRowKeys), (_a = {}, _a[rowData.codigo] = false, _a));
1770
+ rowData.quantidade = quantity;
1771
+ };
1772
+ ErpLoteSerieComponent.ctorParameters = function () { return [
1773
+ { type: TranslateService },
1774
+ { type: ActivatedRoute },
1775
+ { type: E210DxpLookup },
1776
+ { type: FormBuilder },
1777
+ { type: MessageService },
1778
+ { type: ErpLoteSeriesService },
1779
+ { type: QuantidadeDisponivelDemandaService }
1780
+ ]; };
1781
+ __decorate([
1782
+ Input()
1783
+ ], ErpLoteSerieComponent.prototype, "loteSerieParams", void 0);
1784
+ __decorate([
1785
+ Input()
1786
+ ], ErpLoteSerieComponent.prototype, "blockedFields", void 0);
1787
+ __decorate([
1788
+ Input()
1789
+ ], ErpLoteSerieComponent.prototype, "showHeader", void 0);
1790
+ __decorate([
1791
+ Input()
1792
+ ], ErpLoteSerieComponent.prototype, "validateInvalidChars", void 0);
1793
+ __decorate([
1794
+ ViewChild(Table)
1795
+ ], ErpLoteSerieComponent.prototype, "table", void 0);
1796
+ ErpLoteSerieComponent = __decorate([
1797
+ Component({
1798
+ selector: 'erp-lote-serie',
1799
+ template: "<form [formGroup]=\"formGroupBatchOrSeries\" autocomplete=\"off\">\n <div class=\"sds-section-title\" *ngIf=\"showHeader\">{{ titleLoteOrSerie }}</div>\n <div>\n <s-dynamic-form\n [fields]=\"batchOrSeriesFields\"\n [form]=\"formGroupBatchOrSeries\"\n [errorMessages]=\"{\n required: translateHtml('error_required'),\n maxlength: translateHtml('error_max_length', maxLength),\n max: translateHtml('error_max_length'),\n minDataValidade: translateHtml('minDataValidade'),\n existsInvalidChar: translateHtml('exists_invalid_char')\n }\"\n >\n </s-dynamic-form>\n </div>\n\n <br />\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <s-button id=\"add-button\" type=\"submit\" [disabled]=\"blockedFields\" [label]=\"translateHtml('add')\" (click)=\"addBatchOrSeries()\">\n </s-button>\n <s-button *ngIf=\"isDistributeSeriesButtonVisible()\" [label]=\"translateHtml('distribute_series')\" (click)=\"onDistributeSeries()\">\n </s-button>\n </div>\n </div>\n</form>\n\n<div class=\"sds-section-title\">Totais</div>\n\n<div class=\"ui-g custom-stats\">\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#0C9348\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"translateHtml('totalizador_1_title')\"\n [value]=\"qtdAdistribuir | localizedNumber: locale.number.scale | async\"\n >\n </s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#428BCA\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"translateHtml('totalizador_2_title')\"\n [value]=\"qtdDistribuida | localizedNumber: locale.number.scale | async\"\n >\n </s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#C13018\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"translateHtml('totalizador_3_title')\"\n [value]=\"qtdRestante | localizedNumber: locale.number.scale | async\"\n >\n </s-stats-card>\n </div>\n</div>\n\n<div class=\"sds-section-title\">{{ titleGridLoteOrSerie }}</div>\n\n<s-empty-state\n id=\"my-empty-state\"\n *ngIf=\"!gridData.length\"\n iconClass=\"far fa-dollar-sign\"\n [title]=\"translateHtml('no_distributions_yet')\"\n [description]=\"translateHtml('no_distributions_description')\"\n>\n</s-empty-state>\n\n<div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <div class=\"ui-g-6\" *ngIf=\"gridData.length\">\n <s-button\n [label]=\"translateHtml('deleted_message_title')\"\n [title]=\"translateHtml('deleted_message_title')\"\n (onClick)=\"onDelete()\"\n [priority]=\"ButtonPriority.Secondary\"\n [disabled]=\"blockedFields || !selection.length\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"ui-g-12\">\n <p-table\n #tableLoteSerie\n *ngIf=\"gridData.length\"\n [value]=\"gridData\"\n [columns]=\"gridColumns\"\n dataKey=\"codigo\"\n [scrollable]=\"true\"\n [resizableColumns]=\"true\"\n [totalRecords]=\"gridData.length\"\n [rowsPerPageOptions]=\"[10, 20, 50, 100]\"\n [(selection)]=\"selection\"\n [paginator]=\"true\"\n [rows]=\"10\"\n editMode=\"row\"\n >\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th id=\"tableHeaderCheckbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <th *ngFor=\"let col of columns\" style=\"width: 170px\" pResizableColumn>\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n </div>\n </th>\n <th style=\"width: 170px\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">\n {{ translateHtml('actions') }}\n </span>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-columns let-editing=\"editing\">\n <tr [pEditableRow]=\"rowData\">\n <td style=\"width: 50px\">\n <p-tableCheckbox [value]=\"rowData\"></p-tableCheckbox>\n </td>\n <td style=\"width: 170px\">\n <span>{{ rowData.codigo }}</span>\n </td>\n <td *ngIf=\"!isSerie\" style=\"width: 170px\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <s-dynamic-form\n [form]=\"editingFormGroup\"\n [fields]=\"editingFormFields\"\n [errorMessages]=\"{\n required: translateHtml('error_required')\n }\"\n ></s-dynamic-form>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{\n rowData.quantidade\n | numeric\n : {\n numberFormatOptions: {\n style: 'decimal',\n minimumFractionDigits: loteSerieParams.dadosProduto.qtdDec || 0\n }\n }\n | async\n }}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 170px\">\n <span>{{ rowData.dataFabricacao | localizedDate: 'L' | async }}</span>\n </td>\n <td style=\"width: 170px\">\n <span>{{ rowData.dataValidade | localizedDate: 'L' | async }}</span>\n </td>\n <td style=\"width: 170px\">\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <s-button\n *ngIf=\"!editing\"\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n [disabled]=\"blockedFields\"\n [label]=\"translateHtml('actions')\"\n [menuOptions]=\"getMenuOptionsPerRow(rowData)\"\n >\n </s-button>\n <s-button\n *ngIf=\"editing\"\n iconClass=\"fa fa-check\"\n [auxiliary]=\"true\"\n [size]=\"ButtonSize.Small\"\n (onClick)=\"onSaveEdit(rowData)\"\n ></s-button>\n <s-button\n *ngIf=\"editing\"\n [priority]=\"ButtonPriority.Default\"\n iconClass=\"fa fa-times\"\n [auxiliary]=\"true\"\n [size]=\"ButtonSize.Small\"\n (onClick)=\"onCancelEdit(rowData)\"\n ></s-button>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <s-table-paging\n [table]=\"tableLoteSerie\"\n [totalRecords]=\"gridData.length\"\n [exportFileName]=\"translateHtml('total_records', gridData.length)\"\n >\n </s-table-paging>\n </ng-template>\n </p-table>\n </div>\n</div>\n"
1800
+ })
1801
+ ], ErpLoteSerieComponent);
1802
+ return ErpLoteSerieComponent;
1803
+ }());
1804
+ export { ErpLoteSerieComponent };
1805
+ /** Enum para tipo de movimento */
1806
+ export var EnumTipoMovimentacao;
1807
+ (function (EnumTipoMovimentacao) {
1808
+ /** Tipo movimentação igual a Entrada */
1809
+ EnumTipoMovimentacao["Entrada"] = "Entrada";
1810
+ /** Tipo movimentação igual a Saída */
1811
+ EnumTipoMovimentacao["Saida"] = "Saida";
1812
+ })(EnumTipoMovimentacao || (EnumTipoMovimentacao = {}));
1813
+ /** Enum para tipo de controle de produto */
1814
+ export var EnumTipoControleProduto;
1815
+ (function (EnumTipoControleProduto) {
1816
+ /** Tipo de controle igual a Lote */
1817
+ EnumTipoControleProduto["Lote"] = "Lote";
1818
+ /** Tipo de controle igual a Série */
1819
+ EnumTipoControleProduto["Serie"] = "Serie";
1820
+ })(EnumTipoControleProduto || (EnumTipoControleProduto = {}));
1821
+ export var EnumInvoiceOrigin;
1822
+ (function (EnumInvoiceOrigin) {
1823
+ EnumInvoiceOrigin["V1"] = "V1";
1824
+ EnumInvoiceOrigin["V2"] = "V2";
1825
+ EnumInvoiceOrigin["V3"] = "V3";
1826
+ EnumInvoiceOrigin["V4"] = "V4";
1827
+ EnumInvoiceOrigin["V5"] = "V5";
1828
+ EnumInvoiceOrigin["V99"] = "V99";
1829
+ })(EnumInvoiceOrigin || (EnumInvoiceOrigin = {}));
1830
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLWxvdGUtc2VyaWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvZXJweC1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9sb3RlLXNlcmllL2VycC1sb3RlLXNlcmllLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ25HLE9BQU8sRUFDSCxjQUFjLEVBQ2QsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixTQUFTLEVBQ1QsU0FBUyxFQUVaLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUZBQXlGLENBQUM7QUFDN0ksT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDOUYsT0FBTyxFQUFFLE9BQU8sRUFB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eyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBFMjEwRHhwTG9va3VwLCBFbnVtTG9naWNhbE9wZXJhdG9yIH0gZnJvbSAnQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gICAgQnV0dG9uUHJpb3JpdHksXG4gICAgQnV0dG9uU2l6ZSxcbiAgICBFbnVtQ29sdW1uRmllbGRUeXBlLFxuICAgIEZpZWxkVHlwZSxcbiAgICBGb3JtRmllbGQsXG4gICAgVGllcmVkTWVudUl0ZW1EYXRhXG59IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBRdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGEgfSBmcm9tICcuLi8uLi9jb3JlL2VudGl0aWVzL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhJztcbmltcG9ydCB7IFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2VudGl0aWVzL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW51bVRpcG9Eb2N1bWVudG9QYXJhbWV0cm9zIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9lbnVtLXRpcG8tZG9jdW1lbnRvLXBhcmFtZXRyb3MnO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNOb3RFbXB0eSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7IEVycExvdGVTZXJpZXNTZXJ2aWNlLCBHZXRVcmxJbnB1dCwgR2V0VXJsT3V0cHV0LCBMaXN0UGFyYW1zIH0gZnJvbSAnLi9lcnAtbG90ZS1zZXJpZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcnAtbG90ZS1zZXJpZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VycC1sb3RlLXNlcmllLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBFcnBMb3RlU2VyaWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIGxvdGVTZXJpZVBhcmFtczogTG90ZVNlcmllUGFyYW1zO1xuICAgIEBJbnB1dCgpIGJsb2NrZWRGaWVsZHMgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzaG93SGVhZGVyID0gdHJ1ZTtcbiAgICBASW5wdXQoKSB2YWxpZGF0ZUludmFsaWRDaGFycyA9IGZhbHNlO1xuXG4gICAgQFZpZXdDaGlsZChUYWJsZSlcbiAgICByZWFkb25seSB0YWJsZTogVGFibGU7XG5cbiAgICByZWFkb25seSBCdXR0b25Qcmlvcml0eSA9IEJ1dHRvblByaW9yaXR5O1xuICAgIHJlYWRvbmx5IEJ1dHRvblNpemUgPSBCdXR0b25TaXplO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IEVudW1UaXBvTW92aW1lbnRhY2FvID0gRW51bVRpcG9Nb3ZpbWVudGFjYW87XG5cbiAgICBwdWJsaWMgZ3JpZERhdGE6IGFueSA9IFtdO1xuICAgIHB1YmxpYyBzZWxlY3Rpb246IGFueSA9IFtdO1xuICAgIHB1YmxpYyBncmlkQ29sdW1uczogYW55W107XG4gICAgcHVibGljIGxvY2FsZUNvbmZpZzogYW55ID0ge307XG4gICAgcHVibGljIGxvY2FsZTogYW55ID0ge307XG5cbiAgICBwcml2YXRlIGUyMDBsb3RMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBlMjAwbG90bG9va3VwU2VhcmNoT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIGUyMDBzZXJMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBlMjAwc2VybG9va3VwU2VhcmNoT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICBwcml2YXRlIHF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYUxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYT4oKTtcbiAgICBwcml2YXRlIHF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYWxvb2t1cFNlYXJjaE9ic2VydmFibGUgPSBuZXcgU3ViamVjdDxRdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGE+KCk7XG5cbiAgICBwdWJsaWMgZm9ybUdyb3VwQmF0Y2hPclNlcmllczogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBiYXRjaE9yU2VyaWVzRmllbGRzOiBhbnlbXTtcbiAgICBwdWJsaWMgbG90ZUxvb2t1cERpc3BsYXlGaWVsZHMgPSBbJ2UyMDBsb3QuY29kTG90ZSddO1xuICAgIHB1YmxpYyBzZXJpZUxvb2t1cERpc3BsYXlGaWVsZHMgPSBbJ2UyMDBzZXIubnVtU2VwJ107XG5cbiAgICBwdWJsaWMgdGl0bGVMb3RlT3JTZXJpZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0aXRsZUdyaWRMb3RlT3JTZXJpZTogc3RyaW5nO1xuICAgIHB1YmxpYyBpc1NlcmllID0gZmFsc2U7XG4gICAgcHVibGljIHF0ZEFkaXN0cmlidWlyID0gMDtcbiAgICBwdWJsaWMgcXRkRGlzdHJpYnVpZGEgPSAwO1xuICAgIHB1YmxpYyBxdGRSZXN0YW50ZSA9IDA7XG4gICAgcHVibGljIG1heExlbmd0aCA9IDUwO1xuICAgIHB1YmxpYyBvYnJpZ2FWYWxpZGFkZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1NhaWRhID0gZmFsc2U7XG4gICAgcHVibGljIGRpc2FibGVEYXRhVmFsaWRhZGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgcHJlZml4ID0gJ2VycHgubG90ZV9zZXJpZS4nO1xuXG4gICAgZWRpdGluZ0Zvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICBxdWFudGlkYWRlOiBbeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXVxuICAgIH0pO1xuXG4gICAgZWRpdGluZ0Zvcm1GaWVsZHM6IEZvcm1GaWVsZFtdID0gW1xuICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgIG5hbWU6ICdxdWFudGlkYWRlJyxcbiAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sXG4gICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiAxNVxuICAgICAgICB9KVxuICAgIF07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGUyMTBEeHBMb29rdXA6IEUyMTBEeHBMb29rdXAsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBiYXRjaFNlcmllc1NlcnZpY2U6IEVycExvdGVTZXJpZXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlcnZpY2U6IFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlLmRhdGEucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHRoaXMub25Sb3V0ZURhdGFDaGFuZ2UoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzID0gdGhpcy5nZXRGb3JtR3JvdXBEYWRvcygpO1xuICAgICAgICAgICAgdGhpcy52YWxpZGFEYWRvcygpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQ29sdW1ucyA9IHRoaXMuZ2V0R3JpZENvbHVtbnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJsb2NrZWRGaWVsZHMgPT0gdHJ1ZSkgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmRpc2FibGUoKTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVJbnZhbGlkQ2hhcnMgJiYgL1xcdHxcXHJ8XFxuL2cuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUuc2V0RXJyb3JzKHsgZXhpc3RzSW52YWxpZENoYXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVJbnZhbGlkQ2hhcnMgJiYgL1xcdHxcXHJ8XFxuL2cuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnNldEVycm9ycyh7IGV4aXN0c0ludmFsaWRDaGFyOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYURhZG9zKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NGYW1pbHlTdXBwbHlJbmZvKHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDEyZmFtKTtcblxuICAgICAgICBpZiAodGhpcy5sb3RlU2VyaWVQYXJhbXMudGlwb0NvbnRyb2xlUHJvZHV0byA9PSAnU2VyaWUnKSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlTG90ZU9yU2VyaWUgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNlcmllX3RpdGxlYCk7XG4gICAgICAgICAgICB0aGlzLnRpdGxlR3JpZExvdGVPclNlcmllID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1zZXJpZV90aXRsZV9ncmlkYCk7XG4gICAgICAgICAgICB0aGlzLmlzU2VyaWUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aXRsZUxvdGVPclNlcmllID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb3RlX3RpdGxlYCk7XG4gICAgICAgICAgICB0aGlzLnRpdGxlR3JpZExvdGVPclNlcmllID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb3RlX3RpdGxlX2dyaWRgKTtcbiAgICAgICAgICAgIHRoaXMuaXNTZXJpZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLnRpcG9Nb3ZpbWVudGFjYW8gPT0gJ0VudHJhZGEnKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoT3JTZXJpZXNGaWVsZHMgPSB0aGlzLmdldEZpZWxkc0VudHJhZGEoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMucXVhbnRpZGFkZS5jbGVhclZhbGlkYXRvcnMoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnF1YW50aWRhZGUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnF1YW50aWRhZGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJhdGNoU2VyaWVCdWxrLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5iYXRjaFNlcmllQnVsay51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc1NhaWRhID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5xdWFudGlkYWRlLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5xdWFudGlkYWRlLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMucXVhbnRpZGFkZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmF0Y2hPclNlcmllc0ZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzU2FpZGEoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5kaXNhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmRpc2FibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWwpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuc2V0VmFsaWRhdG9ycyhbXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhID0gMDtcbiAgICAgICAgdGhpcy5xdGRBZGlzdHJpYnVpciA9IHRoaXMubG90ZVNlcmllUGFyYW1zLnF1YW50aWRhZGVEaXN0cmlidWlyO1xuXG4gICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy5sb3Rlc09yU2VyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMubG90ZXNPclNlcmllcztcbiAgICAgICAgICAgIHRoaXMucXRkRGlzdHJpYnVpZGEgPSB0aGlzLmdldFF1YW50aWRhZGVEaXN0cmlidWlkYSgpO1xuICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMucXRkQWRpc3RyaWJ1aXIgLSB0aGlzLnF0ZERpc3RyaWJ1aWRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMucXRkQWRpc3RyaWJ1aXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm1Hcm91cERhZG9zKCkge1xuICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGRlcG9zaXRvOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBsb3RlOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBkYXRhVmFsaWRhZGU6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGRhdGFGYWJyaWNhY2FvOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBzZXJpZTogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgc2FsZG86IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgcXVhbnRpZGFkZTogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgYmF0Y2hTZXJpZUJ1bGs6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGJ1bGtWaXNpYmxlOiBbeyB2YWx1ZTogZmFsc2UsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybUdyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQcm9wKG9iajogYW55LCBwYXRoOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKHJlc3VsdDogYW55LCBwcm9wOiBhbnkpID0+IChyZXN1bHRbcHJvcF0gPT09IHVuZGVmaW5lZCA/ICcnIDogcmVzdWx0W3Byb3BdKSwgb2JqKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpZWxkc0VudHJhZGEoKSB7XG4gICAgICAgIGxldCBkYWRvc0ZpZWxkc0VudHJhZGE6IGFueVtdID0gW107XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcCkge1xuICAgICAgICAgICAgZGFkb3NGaWVsZHNFbnRyYWRhID0gW1xuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmUyMTBEeHBMb29rdXAubW91bnRPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogJ2VycHhfc3VwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U6ICdlc3RvcXVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogJ2RlcG9zaXRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2UyMDVkZXAuY29kRGVwJywgdHlwZTogRmllbGRUeXBlLlN0cmluZyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2UyMDVkZXAuZGVzRGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5hYnJEZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5lMDcwZmlsLmNvZEZpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoR3JpZEZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2UyMDVkZXAuY29kRGVwJywgdHlwZTogRmllbGRUeXBlLlN0cmluZyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2UyMDVkZXAuZGVzRGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5hYnJEZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5lMDcwZmlsLmNvZEZpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdlMjA1ZGVwLmUwNzBmaWwubm9tRmlsJywgdHlwZTogRmllbGRUeXBlLlN0cmluZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ2V4Y2x1aWRvJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogWydmYWxzZSddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UwNzBlbXAuaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzBlbXBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnc2l0RXN0Jywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogWydWQSddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ2UyMDVkZXAuc2l0RGVwJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogWydWQSddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UwNzVkZXIuaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzVkZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGFkb3NGaWVsZHNFbnRyYWRhLnB1c2goXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYnVsa1Zpc2libGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWJ1bGtfdmlzaWJsZWApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAxMiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Cb29sZWFuLFxuICAgICAgICAgICAgICAgIHJlcHJlc2VudGVkQnk6ICdzd2l0Y2gnXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdiYXRjaFNlcmllQnVsaycsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YmF0Y2hfc2VyaWVfYnVsa2ApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiA2IH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlRleHQsXG4gICAgICAgICAgICAgICAgcm93czogNSxcbiAgICAgICAgICAgICAgICBvbkJsdXI6IChldmVudDogYW55KSA9PiB0aGlzLm9uQmx1clZhbGlkYUxvdGVvclNlcmllKGV2ZW50LnRhcmdldC52YWx1ZSksXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlczogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzSW52YWxpZENoYXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXhpc3RzX2ludmFsaWRfY2hhcmApXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJ1bGtWaXNpYmxlLnZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuaXNTZXJpZSA/ICdzZXJpZScgOiAnbG90ZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuaXNTZXJpZSA/IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9c2VyaWVgKSA6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG90ZWApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgICAgICBvbkJsdXI6IChldmVudDogYW55KSA9PiB0aGlzLm9uQmx1clZhbGlkYUxvdGVvclNlcmllKGV2ZW50LnRhcmdldC52YWx1ZSksXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlczogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzSW52YWxpZENoYXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXhpc3RzX2ludmFsaWRfY2hhcmApXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YUZhYnJpY2FjYW8nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfZmFicmljYWNhb2ApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGUsXG4gICAgICAgICAgICAgICAgYXBwZW5kVG86ICdib2R5JyxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoKSA9PiAhdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJ1bGtWaXNpYmxlLnZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhVmFsaWRhZGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfdmFsaWRhZGVgKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlLFxuICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRoaXMub2JyaWdhVmFsaWRhZGUsXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnc2FsZG8nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNhbGRvYCksXG4gICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgICAgIHNjYWxlOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8ucXRkRGVjLFxuICAgICAgICAgICAgICAgIHZpc2libGU6ICgpID0+ICF0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYnVsa1Zpc2libGUudmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzU2VyaWUpIHtcbiAgICAgICAgICAgIGRhZG9zRmllbGRzRW50cmFkYS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAncXVhbnRpZGFkZScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXF1YW50aWRhZGVgKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5xdGREZWMsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvbkJsdXI6ICgpID0+IHRoaXMub25CbHVyUXVhbnRpdHkoKSxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyTG9jYWxlT3B0aW9uczogdGhpcy5sb2NhbGVDb25maWcubnVtYmVyXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGFkb3NGaWVsZHNFbnRyYWRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmllbGRzU2FpZGEoKSB7XG4gICAgICAgIGxldCBkYWRvc0ZpZWxkc1NhaWRhOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXApIHtcbiAgICAgICAgICAgIGRhZG9zRmllbGRzU2FpZGEgPSBbXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZTIxMER4cExvb2t1cC5tb3VudE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluOiAnZXJweF9zdXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZTogJ2VzdG9xdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiAnZGVwb3NpdG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5jb2REZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5kZXNEZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdlMjA1ZGVwLmFickRlcCcsIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlMjA1ZGVwLmUwNzBmaWwuY29kRmlsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkludGVnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hHcmlkRmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5jb2REZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5kZXNEZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdlMjA1ZGVwLmFickRlcCcsIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlMjA1ZGVwLmUwNzBmaWwuY29kRmlsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkludGVnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2UyMDVkZXAuZTA3MGZpbC5ub21GaWwnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZXhjbHVpZG8nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ2ZhbHNlJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnZTA3MGVtcC5pZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFt0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3MGVtcF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzaXRFc3QnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZTIwNWRlcC5zaXREZXAnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnZTA3NWRlci5pZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFt0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlcl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICBkYWRvc0ZpZWxkc1NhaWRhLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzZXJpZScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyYCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Mb29rdXAsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX3NlYXJjaF90aXRsZWApLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hFbXB0eVRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fW5vdGhpbmdfZm91bmRgKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyTGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZmlsdGVyYCksXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Y2xlYXJgKSxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsTGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Y2FuY2VsYCksXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdExhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNlbGVjdGApLFxuICAgICAgICAgICAgICAgICAgICBvblNlbGVjdDogKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gIT09IEVudW1JbnZvaWNlT3JpZ2luLlYyKSB0aGlzLnZhbGlkYUxvdGVvclNlcmllKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgb25TZWFyY2hSZXF1ZXN0OiAoZXZlbnQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMub25RdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFSZXF1ZXN0KGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vbkUyMDBTZXJTZWFyY2hSZXF1ZXN0KGV2ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgb25Mb29rdXBSZXF1ZXN0OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMub25RdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFSZXF1ZXN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vbkUyMDBTZXJMb29rdXBSZXF1ZXN0KHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNPYnNlcnZhYmxlOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3RlU2VyaWVQYXJhbXM/Lmludm9pY2VJbmZvcm1hdGlvbj8ub3JpZ2luID09PSBFbnVtSW52b2ljZU9yaWdpbi5WMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5xdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZTIwMHNlckxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoT2JzZXJ2YWJsZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhbG9va3VwU2VhcmNoT2JzZXJ2YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5lMjAwc2VybG9va3VwU2VhcmNoT2JzZXJ2YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkOiAnbGFiZWwnLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZHM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlYXJjaEZpZWxkcygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdldEUyMDBTZXJTZWFyY2hGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoR3JpZEZpZWxkczpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZ2V0UXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VhcmNoR3JpZEZpZWxkcygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdldEUyMDBTZXJTZWFyY2hHcmlkRmllbGRzKCksXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyLFxuICAgICAgICAgICAgICAgICAgICBkYXRhS2V5OiB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyID8gJ2lkJyA6ICdlMjAwc2VyLmlkJyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWVcbiAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YUZhYnJpY2FjYW8nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX2ZhYnJpY2FjYW9gKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICgpID0+ICF0aGlzLmlzRGlzdHJpYnV0ZVNlcmllc0J1dHRvblZpc2libGUoKVxuICAgICAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhVmFsaWRhZGUnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX3ZhbGlkYWRlYCksXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbzogJ2JvZHknLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdGhpcy5vYnJpZ2FWYWxpZGFkZSxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuaXNEaXN0cmlidXRlU2VyaWVzQnV0dG9uVmlzaWJsZSgpXG4gICAgICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NhbGRvJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9c2FsZG9gKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5xdGREZWMsXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICgpID0+ICF0aGlzLmlzRGlzdHJpYnV0ZVNlcmllc0J1dHRvblZpc2libGUoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGFkb3NGaWVsZHNTYWlkYS5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbj8ub3JpZ2luID09PSBFbnVtSW52b2ljZU9yaWdpbi5WMlxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbG90ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwbG90YCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Mb29rdXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0OiAoZXZlbnQpID0+IHRoaXMudmFsaWRhTG90ZW9yU2VyaWUoZXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlYXJjaFJlcXVlc3Q6IChldmVudCkgPT4gdGhpcy5vblF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVJlcXVlc3QoZXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkxvb2t1cFJlcXVlc3Q6ICh2YWx1ZTogc3RyaW5nKSA9PiB0aGlzLm9uUXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhUmVxdWVzdCh2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zT2JzZXJ2YWJsZTogdGhpcy5xdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9ic2VydmFibGU6IHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhbG9va3VwU2VhcmNoT2JzZXJ2YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkOiAnbGFiZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZHM6IHRoaXMuZ2V0UXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VhcmNoRmllbGRzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEdyaWRGaWVsZHM6IHRoaXMuZ2V0UXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VhcmNoR3JpZEZpZWxkcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhS2V5OiAnaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsb3RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkxvb2t1cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3Rfc2VhcmNoX3RpdGxlYCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEVtcHR5VGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bm90aGluZ19mb3VuZGApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1maWx0ZXJgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jbGVhcmApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jYW5jZWxgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9c2VsZWN0YCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy52YWxpZGFMb3Rlb3JTZXJpZShldmVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VhcmNoUmVxdWVzdDogKGV2ZW50OiBhbnkpID0+IHRoaXMub25FMjAwTG90U2VhcmNoUmVxdWVzdChldmVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9va3VwUmVxdWVzdDogKHZhbHVlOiBzdHJpbmcpID0+IHRoaXMub25FMjAwTG90TG9va3VwUmVxdWVzdCh2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zT2JzZXJ2YWJsZTogdGhpcy5lMjAwbG90TG9va3VwU3VnZ2VzdGlvbnNPYnNlcnZhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPYnNlcnZhYmxlOiB0aGlzLmUyMDBsb3Rsb29rdXBTZWFyY2hPYnNlcnZhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBEaXNwbGF5RmllbGQ6ICdsYWJlbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEZpZWxkczogdGhpcy5nZXRFMjAwTG90U2VhcmNoRmllbGRzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEdyaWRGaWVsZHM6IHRoaXMuZ2V0RTIwMExvdFNlYXJjaEdyaWRGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YUZhYnJpY2FjYW8nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX2ZhYnJpY2FjYW9gKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keSdcbiAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YVZhbGlkYWRlJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGF0YV92YWxpZGFkZWApLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG86ICdib2R5JyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRoaXMub2JyaWdhVmFsaWRhZGVcbiAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2FsZG8nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1zYWxkb2ApLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlY1xuICAgICAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdxdWFudGlkYWRlJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9cXVhbnRpZGFkZWApLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlYyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG9uQmx1cjogKCkgPT4gdGhpcy5vbkJsdXJRdWFudGl0eSgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhZG9zRmllbGRzU2FpZGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcmlkQ29sdW1ucygpIHtcbiAgICAgICAgbGV0IGdyaWRDb2x1bW5zOiBhbnk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgZ3JpZENvbHVtbnMgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3NlcmllJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNlcmllYCksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFsnY29kaWdvJ10sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEVudW1Db2x1bW5GaWVsZFR5cGUuU1RSSU5HXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZGF0YUZhYnJpY2FjYW8nLCBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGF0YV9mYWJyaWNhY2FvYCkgfSxcbiAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZGF0YVZhbGlkYWRlJywgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfdmFsaWRhZGVgKSB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JpZENvbHVtbnMgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2xvdGUnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG90ZWApLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbJ2NvZGlnbyddLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBFbnVtQ29sdW1uRmllbGRUeXBlLlNUUklOR1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBmaWVsZDogJ3F1YW50aWRhZGUnLCBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9cXVhbnRpZGFkZWApIH0sXG4gICAgICAgICAgICAgICAgeyBmaWVsZDogJ2RhdGFGYWJyaWNhY2FvJywgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfZmFicmljYWNhb2ApIH0sXG4gICAgICAgICAgICAgICAgeyBmaWVsZDogJ2RhdGFWYWxpZGFkZScsIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX3ZhbGlkYWRlYCkgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncmlkQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RTIwMExvdFNlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuY29kTG90ZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfY29kX2RlcGApLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHNlYXJjaEZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RTIwMFNlclNlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMHNlcl9udW1fc2VwYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gc2VhcmNoRmllbGRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FMjAwTG90U2VhcmNoUmVxdWVzdChldmVudDogYW55KSB7XG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeTogYW55O1xuICAgICAgICBsZXQgZGVwb3NpdG8gPSAnJztcbiAgICAgICAgY29uc3QgeyBmaXJzdCwgcm93cywgbXVsdGlTb3J0TWV0YSwgZmlsdGVyRGF0YSB9ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBmaXJzdCAvIHJvd3M7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZHMgPSBbJ2UyMDBsb3QuY29kTG90ZSddO1xuXG4gICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcCkge1xuICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUpXG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZGVyQnk6IGFueSA9IG11bHRpU29ydE1ldGFcbiAgICAgICAgICAgID8gbXVsdGlTb3J0TWV0YS5tYXAoKHM6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkOiBzLmZpZWxkID09ICdlMjAwbG90LmNvZExvdGUnID8gJ2UyMDBsb3QuY29kTG90JyA6IHMuZmllbGQsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogcy5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQydcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IFt7IGZpZWxkOiAnZTIwMGxvdC5jb2RMb3QnLCBvcmRlcjogJ0FTQycgfV07XG5cbiAgICAgICAgZmlsdGVyUXVlcnkgPSB7XG4gICAgICAgICAgICBlMDcwZW1wOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDcwZW1wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZTIwNWRlcDoge1xuICAgICAgICAgICAgICAgIGlkOiBkZXBvc2l0b1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUwNzVkZXI6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzVkZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb3RMaWtlOiB0cnVlLFxuICAgICAgICAgICAgbG90U2FsOiB0cnVlLFxuICAgICAgICAgICAgb2Zmc2V0OiBwYWdlLFxuICAgICAgICAgICAgbG90RGlzOiB0cnVlLFxuICAgICAgICAgICAgc2l6ZTogcm93c1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChmaWx0ZXJEYXRhWydlMjAwbG90LmNvZExvdGUnXSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMGxvdCA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvZExvdDogZmlsdGVyRGF0YVsnZTIwMGxvdC5jb2RMb3RlJ11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9yZGVyQnkpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5Lm9yZGVyQnkgPSBvcmRlckJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0QmF0Y2goZmlsdGVyUXVlcnkpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBncmlkRGF0YTogbGlzdC5sb3Rlcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZGlzcGxheUZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gMCkgcmV0dXJuIHRoaXMuZ2V0UHJvcChpdGVtLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbFJlY29yZHM6IGxpc3QudG90YWxFbGVtZW50c1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lMjAwbG90bG9va3VwU2VhcmNoT2JzZXJ2YWJsZS5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlYXJjaEZpZWxkcygpOiBGb3JtRmllbGRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VyaWVcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ251bVNlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBzZXJfbnVtX3NlcGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NvZExvdCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfY29kX2RlcGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlYXJjaEdyaWRGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VyaWVcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ251bVNlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBzZXJfbnVtX3NlcGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdEZhYlNlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBzZXJfZGF0X2ZhYmApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRWbHRTZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX2RhdF92bHRgKSxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29kTG90JyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9jb2RfZGVwYCksXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0RmFiTG90JyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9kYXRfZmFiYCksXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGVcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdFZsdExvdCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfZGF0X3ZsdGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdxdGREaXNwb25pdmVsJyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9xdGRfZGlzYCksXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhUmVxdWVzdChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RQYXJhbXM6IExpc3RQYXJhbXMgPSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeTogYGlkRXh0ZXJubyBlcSAnJHt0aGlzLmxvdGVTZXJpZVBhcmFtcy5vcmRlckluZm9ybWF0aW9uLml0ZW0uaWR9JyBhbmQgcXRkRGlzcG9uaXZlbCA+IDBgXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgbGlzdFBhcmFtcy5maWx0ZXJRdWVyeSArPSBgIGFuZCBudW1TZXAgaXMgbm90IG51bGxgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbi5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyKSB7XG4gICAgICAgICAgICBsaXN0UGFyYW1zLmZpbHRlclF1ZXJ5ICs9IGAgYW5kIHRpcG9Eb2N1bWVudG8gZXEgJ1BlZGlkb1ZlbmRhJ2A7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbGlzdFBhcmFtcy5wYWdlID0gMDtcbiAgICAgICAgICAgIGxpc3RQYXJhbXMuc2l6ZSA9IDEwO1xuICAgICAgICAgICAgbGlzdFBhcmFtcy5maWx0ZXJRdWVyeSArPSB0aGlzLmlzU2VyaWVcbiAgICAgICAgICAgICAgICA/IGAgYW5kIGNvbnRhaW5pbmcobG93ZXIobnVtU2VwKSwgbG93ZXIoJyR7ZXZlbnQucmVwbGFjZSgvXFxcXC9nLCAnJykucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWBcbiAgICAgICAgICAgICAgICA6IGAgYW5kIGNvbnRhaW5pbmcobG93ZXIoY29kTG90KSwgbG93ZXIoJyR7ZXZlbnQucmVwbGFjZSgvXFxcXC9nLCAnJykucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGZpbHRlckRhdGEsIHJvd3MsIG11bHRpU29ydE1ldGEgfSA9IGV2ZW50O1xuXG4gICAgICAgICAgICBsaXN0UGFyYW1zLnBhZ2UgPSBldmVudC5maXJzdCAvIHJvd3M7XG4gICAgICAgICAgICBsaXN0UGFyYW1zLnNvcnQgPSBtdWx0aVNvcnRNZXRhID8gbXVsdGlTb3J0TWV0YSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaWx0ZXJEYXRhLmNvZExvdCAhPT0gbnVsbCAmJiBmaWx0ZXJEYXRhLmNvZExvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGlzdFBhcmFtcy5maWx0ZXJRdWVyeSArPSBgIGFuZCBjb250YWluaW5nKGxvd2VyKGNvZExvdCksIGxvd2VyKCcke2ZpbHRlckRhdGEuY29kTG90XG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckRhdGEubnVtU2VwICE9PSBudWxsICYmIGZpbHRlckRhdGEubnVtU2VwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0UGFyYW1zLmZpbHRlclF1ZXJ5ICs9IGAgYW5kIGNvbnRhaW5pbmcobG93ZXIobnVtU2VwKSwgbG93ZXIoJyR7ZmlsdGVyRGF0YS5udW1TZXBcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJycpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VydmljZVxuICAgICAgICAgICAgLmxpc3QobGlzdFBhcmFtcylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBncmlkRGF0YTogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pc1NlcmllID8gaXRlbS5lMjAwc2VySWQgOiBpdGVtLmUyMDBsb3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmlzU2VyaWUgPyBgJHtpdGVtLm51bVNlcH1gIDogYCR7aXRlbS5jb2RMb3R9YFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUmVjb3JkczogbGlzdC50b3RhbEVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYUxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZS5uZXh0KGRhdGEuZ3JpZERhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhbG9va3VwU2VhcmNoT2JzZXJ2YWJsZS5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkUyMDBTZXJTZWFyY2hSZXF1ZXN0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IGZpbHRlclF1ZXJ5OiBhbnk7XG4gICAgICAgIGxldCBkZXBvc2l0byA9ICcnO1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IFsnZTIwMHNlci5udW1TZXAnXTtcblxuICAgICAgICBpZiAodGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXApIHtcbiAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlKVxuICAgICAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlLmUyMDVkZXAuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcmRlckJ5OiBhbnkgPSBtdWx0aVNvcnRNZXRhXG4gICAgICAgICAgICA/IG11bHRpU29ydE1ldGEubWFwKChzOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5zLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHMub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiBbeyBmaWVsZDogJ2UyMDBzZXIubnVtU2VwJywgb3JkZXI6ICdBU0MnIH1dO1xuXG4gICAgICAgIGZpbHRlclF1ZXJ5ID0ge1xuICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3MGVtcFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICBpZDogZGVwb3NpdG9cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDc1ZGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyTGlrZTogdHJ1ZSxcbiAgICAgICAgICAgIHNlclNhbDogdHJ1ZSxcbiAgICAgICAgICAgIG9mZnNldDogcGFnZSxcbiAgICAgICAgICAgIHNlckRpczogdHJ1ZSxcbiAgICAgICAgICAgIHNpemU6IHJvd3NcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZmlsdGVyRGF0YVsnZTIwMHNlci5udW1TZXAnXSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMHNlciA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG51bVNlcDogZmlsdGVyRGF0YVsnZTIwMHNlci5udW1TZXAnXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3JkZXJCeSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJhdGNoU2VyaWVzU2VydmljZVxuICAgICAgICAgICAgLmxpc3RTZXJpZXMoZmlsdGVyUXVlcnkpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBncmlkRGF0YTogbGlzdC5zZXJpZXMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGRpc3BsYXlGaWVsZHMubWFwKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IDApIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxSZWNvcmRzOiBsaXN0LnRvdGFsRWxlbWVudHNcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZTIwMHNlcmxvb2t1cFNlYXJjaE9ic2VydmFibGUubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVCYXRjaE9yU2VyaWVzKHJvd0RhdGE6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhIC09IHRoaXMuaXNTZXJpZSA/IDEgOiBOdW1iZXIocm93RGF0YS5xdWFudGlkYWRlKTtcbiAgICAgICAgICAgIHRoaXMucXRkUmVzdGFudGUgKz0gdGhpcy5pc1NlcmllID8gMSA6IE51bWJlcihyb3dEYXRhLnF1YW50aWRhZGUpO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gdGhpcy5ncmlkRGF0YS5maWx0ZXIoKGJhdGNoT3JTZXJpZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBiYXRjaE9yU2VyaWVzLmNvZGlnbyAhPSByb3dEYXRhLmNvZGlnbztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcy5sb3Rlc09yU2VyaWVzID0gdGhpcy5ncmlkRGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3VtID0gKGEsIGIsIHBvc2l0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcG9zaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIChhLnRvRml4ZWQocG9zaXRpb25zKSAqIGZhY3RvciArIGIudG9GaXhlZChwb3NpdGlvbnMpICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICB9O1xuICAgIHByaXZhdGUgc3ViID0gKGEsIGIsIHBvc2l0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcG9zaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIChhLnRvRml4ZWQocG9zaXRpb25zKSAqIGZhY3RvciAtIGIudG9GaXhlZChwb3NpdGlvbnMpICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICB9O1xuXG4gICAgcHVibGljIGFkZEJhdGNoT3JTZXJpZXMoKSB7XG4gICAgICAgIGxldCBjb2RpZ286IHN0cmluZztcbiAgICAgICAgbGV0IGlkID0gJyc7XG5cbiAgICAgICAgdGhpcy52YWxpZGF0ZUFsbEZvcm1GaWVsZHModGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzKTtcblxuICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJ1bGtWaXNpYmxlLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkQXJyYXkgPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsudmFsdWUuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSA9IDA7XG4gICAgICAgICAgICB0aGlzLnF0ZEFkaXN0cmlidWlyID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMucXVhbnRpZGFkZURpc3RyaWJ1aXI7XG4gICAgICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gMDtcbiAgICAgICAgICAgIGxldCBsaW5oYUF0dWFsID0gMDtcbiAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRBcnJheS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZ0Vycm9yID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1pbnZhbGlkX2xheW91dGApO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9aW52YWxpZF9sYXlvdXRgKSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtc2dFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gW107XG4gICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb252ZXJ0ZWRBcnJheS5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGluaGFBdHVhbCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlLnNwbGl0KCc7Jyk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmlzU2VyaWUgJiYgY3VycmVudFZhbHVlLmxlbmd0aCA+IDMpIHx8ICghdGhpcy5pc1NlcmllICYmIGN1cnJlbnRWYWx1ZS5sZW5ndGggPiA0KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9aW52YWxpZF9sYXlvdXRgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfbGF5b3V0YCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlOiBCdWxrSW1wb3J0ID0gdGhpcy5pc1NlcmllXG4gICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ286IHRoaXMudG9Db2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jb2RpZ29fbm90X2luZm9ybWVkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGYWJyaWNhY2FvOiB0aGlzLnRvRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bWFudWZhY3R1cmluZ19kYXRlX2ludmFsaWRfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVZhbGlkYWRlOiB0aGlzLnRvRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9dmFsaWRhdGVfZGF0ZV9pbnZhbGlkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IDFcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ286IHRoaXMudG9Db2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jb2RpZ29fbm90X2luZm9ybWVkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IHRoaXMudG9BbW91bnQoY3VycmVudFZhbHVlWzFdLCBsaW5oYUF0dWFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZhYnJpY2FjYW86IHRoaXMudG9EYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1tYW51ZmFjdHVyaW5nX2RhdGVfaW52YWxpZF9iYXRjaGAsIHsgbGluZTogbGluaGFBdHVhbCB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVmFsaWRhZGU6IHRoaXMudG9EYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH12YWxpZGF0ZV9kYXRlX2ludmFsaWRfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyB2YWxpZGEgc2UgYSBmYW1pbGlhIG9icmlnYSBhIGluZm9ybWFyIHZhbGlkYWRlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JyaWdhVmFsaWRhZGUgJiYgIWNvbnZlcnRlZFZhbHVlLmRhdGFWYWxpZGFkZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXJyb3Jfc2VsZWN0ZWRfZGF0ZXNfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9leHBpcnlfZGF0ZWApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtc2dFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB2YWxpZGEgc2UgZXhpc3RlIGPDs2RpZ28gZHVwbGljYWRvXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZERhdGEuc29tZSgodmFsdWU6IEJ1bGtJbXBvcnQpID0+IHZhbHVlLmNvZGlnbyA9PT0gY29udmVydGVkVmFsdWUuY29kaWdvKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMuaXNTZXJpZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWR1cGxpY2F0ZWRfc2VyaWVzX21zZ19iYXRjaGAsIHsgbGluZTogbGluaGFBdHVhbCB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWR1cGxpY2F0ZWRfYmF0Y2hfbXNnX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YmF0Y2hfZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHZhbGlkYSBzZSBhIGRhdGEgZGUgZmFicmljYcOnw6NvIMOpIG1haW9yIHF1ZSBhIHZhbGlkYWRlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZS5kYXRhVmFsaWRhZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkVmFsdWUuZGF0YUZhYnJpY2FjYW8gJiZcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkVmFsdWUuZGF0YVZhbGlkYWRlIDwgY29udmVydGVkVmFsdWUuZGF0YUZhYnJpY2FjYW9cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnRXJyb3IgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWV4cGlyeV9sb3dlcl90aGFuX21hbnVmYWN0dXJpbmdfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9zZWxlY3RlZF9kYXRlc2ApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtc2dFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhICs9IGNvbnZlcnRlZFZhbHVlLnF1YW50aWRhZGU7XG4gICAgICAgICAgICAgICAgLy8gdmFsaWRhIHNlIGEgcXVhbnRpZGFkZSBkaXN0cmlidWlkYSDDqSBtYWlvciBxdWUgYSBxdWFudGlkYWRlIGEgZGlzdHJpYnVpclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF0ZERpc3RyaWJ1aWRhID4gdGhpcy5xdGRBZGlzdHJpYnVpcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9aW52YWxpZF9xdHlfbXNnX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaChjb252ZXJ0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMucXRkQWRpc3RyaWJ1aXIgLSB0aGlzLnF0ZERpc3RyaWJ1aWRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcy5sb3Rlc09yU2VyaWVzID0gdGhpcy5ncmlkRGF0YTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5iYXRjaFNlcmllQnVsay5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5jbGVhcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLnZhbGlkICYmXG4gICAgICAgICAgICAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlIHx8IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VyaWUpIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5xdWFudGlkYWRlLnBhdGNoVmFsdWUoMSk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnZhbHVlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFGYWJyaWNhY2FvLnZhbHVlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS52YWx1ZSA8IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9zZWxlY3RlZF9kYXRlc2ApLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXhwaXJ5X2xvd2VyX3RoYW5fbWFudWZhY3R1cmluZ2ApXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vYnJpZ2FWYWxpZGFkZSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXJyb3Jfc2VsZWN0ZWRfZGF0ZXNgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9leHBpcnlfZGF0ZWApXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXN0cmlidXRlZFF1YW50aXR5ID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmdldCgncXVhbnRpZGFkZScpLnZhbHVlXG4gICAgICAgICAgICAgICAgPyBOdW1iZXIodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmdldCgncXVhbnRpZGFkZScpLnZhbHVlKVxuICAgICAgICAgICAgICAgIDogMDtcblxuICAgICAgICAgICAgaWYgKGRpc3RyaWJ1dGVkUXVhbnRpdHkgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VtKHRoaXMucXRkRGlzdHJpYnVpZGEsIGRpc3RyaWJ1dGVkUXVhbnRpdHksIHRoaXMubG9jYWxlLm51bWJlci5zY2FsZSkgPiB0aGlzLnF0ZEFkaXN0cmlidWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kaXN0cmlidXRpb25fZXJyb3JgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1pbnZhbGlkX3F0eV9tc2dgKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kaXN0cmlidXRpb25fZXJyb3JgKSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfcXRkYClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VyaWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUudmFsdWUuZTIwMHNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLmUyMDBzZXIubnVtU2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUudmFsdWUuZTIwMHNlci5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnbyA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS5udW1TZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGlnbyA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUucGF0Y2hWYWx1ZSh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUudmFsdWUudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS5lMjAwbG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS5lMjAwbG90LmNvZExvdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmUyMDBsb3QuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS5jb2RMb3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUucGF0Y2hWYWx1ZSh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHVwbGljYXRlQmF0Y2hTZXJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1iYXRjaF9kaXN0cmlidXRpb25fZXJyb3JgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kdXBsaWNhdGVkX2JhdGNoX21zZ2ApXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1zZXJpZXNfZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZHVwbGljYXRlZF9zZXJpZXNfbXNnYClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxvdGVPclNlcmllVmFsdWVzID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmdldFJhd1ZhbHVlKCk7XG5cbiAgICAgICAgICAgIGxvdGVPclNlcmllVmFsdWVzID0gdGhpcy5mb3JtYXREYXRlcyhsb3RlT3JTZXJpZVZhbHVlcywgWydkYXRhRmFicmljYWNhbycsICdkYXRhVmFsaWRhZGUnXSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyICYmIGxvdGVPclNlcmllVmFsdWVzLnNlcmllKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHZhbHVlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnbzogdmFsdWUubnVtU2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IHZhbHVlLnF0ZERpc3Bvbml2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZhYnJpY2FjYW86IHZhbHVlLmRhdEZhYlNlcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVmFsaWRhZGU6IHZhbHVlLmRhdFZsdFNlcFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhID0gdGhpcy5zdW0odGhpcy5xdGREaXN0cmlidWlkYSwgTnVtYmVyKHZhbHVlLnF0ZERpc3Bvbml2ZWwpLCB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMuc3ViKHRoaXMucXRkUmVzdGFudGUsIE51bWJlcih2YWx1ZS5xdGREaXNwb25pdmVsKSwgdGhpcy5sb2NhbGUubnVtYmVyLnNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ286IGxvdGVPclNlcmllVmFsdWVzLnNlcmllLm51bVNlcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IGxvdGVPclNlcmllVmFsdWVzLnNlcmllLnF0ZERpc3Bvbml2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmFicmljYWNhbzogbG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUuZGF0RmFiU2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVZhbGlkYWRlOiBsb3RlT3JTZXJpZVZhbHVlcy5zZXJpZS5kYXRWbHRTZXBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSA9IHRoaXMuc3VtKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihsb3RlT3JTZXJpZVZhbHVlcy5zZXJpZS5xdGREaXNwb25pdmVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlLm51bWJlci5zY2FsZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gdGhpcy5zdWIodGhpcy5xdGRSZXN0YW50ZSwgTnVtYmVyKGxvdGVPclNlcmllVmFsdWVzLnNlcmllLnF0ZERpc3Bvbml2ZWwpLCB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkRGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RpZ286IGNvZGlnbyxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpZGFkZTogbG90ZU9yU2VyaWVWYWx1ZXMucXVhbnRpZGFkZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YUZhYnJpY2FjYW86IGxvdGVPclNlcmllVmFsdWVzLmRhdGFGYWJyaWNhY2FvLFxuICAgICAgICAgICAgICAgICAgICBkYXRhVmFsaWRhZGU6IGxvdGVPclNlcmllVmFsdWVzLmRhdGFWYWxpZGFkZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSA9IHRoaXMuc3VtKHRoaXMucXRkRGlzdHJpYnVpZGEsIE51bWJlcihsb3RlT3JTZXJpZVZhbHVlcy5xdWFudGlkYWRlKSwgdGhpcy5sb2NhbGUubnVtYmVyLnNjYWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gdGhpcy5zdWIodGhpcy5xdGRSZXN0YW50ZSwgTnVtYmVyKGxvdGVPclNlcmllVmFsdWVzLnF1YW50aWRhZGUpLCB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFyQmF0Y2hTZXJpZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zLmxvdGVzT3JTZXJpZXMgPSB0aGlzLmdyaWREYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBbGxGb3JtRmllbGRzKHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvQ29kZShjdXJyZW50VmFsdWU6IHN0cmluZywgbXNnRXJyb3I6IHN0cmluZykge1xuICAgICAgICBjdXJyZW50VmFsdWUgPSBTdHJpbmcoY3VycmVudFZhbHVlKS50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGlzRW1wdHkoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Y29kaWdvX25vdF9pbmZvcm1lZGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvQW1vdW50KGN1cnJlbnRWYWx1ZTogc3RyaW5nLCBsaW5oYUF0dWFsOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSB0aGlzLnRvTnVtYmVyKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8ICghY29udmVydGVkVmFsdWUgJiYgY29udmVydGVkVmFsdWUgIT0gMCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZ0Vycm9yID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1hbW91bnRfbm90X2luZm9ybWVkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YW1vdW50X25vdF9pbmZvcm1lZGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFN0cmluZyhjdXJyZW50VmFsdWUpLmluZGV4T2YodGhpcy5sb2NhbGUubnVtYmVyLnRob3VzYW5kc1NlcGFyYXRvcikgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Zm9ybWF0X251bWJlcl9pbnZhbGlkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YW1vdW50X2ludmFsaWRfYmF0Y2hgKSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnZlcnRlZFZhbHVlIDw9IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZ0Vycm9yID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1hbW91bnRfcXVhbnRpdHlfdGhhdF96ZXJvX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YW1vdW50X2ludmFsaWRfYmF0Y2hgKSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRlbURlY2ltYWwgPSBTdHJpbmcoY29udmVydGVkVmFsdWUpLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgaWYgKHRlbURlY2ltYWwubGVuZ3RoID4gMSAmJiB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUgIT0gU3RyaW5nKGNvbnZlcnRlZFZhbHVlKS5zcGxpdCgnLicpWzFdLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbXNnRXJyb3IgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfZGVjaW1hbHNfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1hbW91bnRfaW52YWxpZF9iYXRjaGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9OdW1iZXIoY3VycmVudFZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGlzTm90RW1wdHkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgPyBOdW1iZXIoY3VycmVudFZhbHVlLnJlcGxhY2UodGhpcy5sb2NhbGUubnVtYmVyLnRob3VzYW5kc1NlcGFyYXRvciwgJycpLnJlcGxhY2UodGhpcy5sb2NhbGUubnVtYmVyLmRlY2ltYWxTZXBhcmF0b3IsICcuJykpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvRGF0ZShjdXJyZW50VmFsdWU6IHN0cmluZywgbXNnRXJyb3I6IHN0cmluZykge1xuICAgICAgICBpZiAoaXNOb3RFbXB0eShjdXJyZW50VmFsdWUpICYmICFtb21lbnQoY3VycmVudFZhbHVlLnRyaW0oKSwgJ0wnLCB0cnVlKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfZGF0ZV9iYXRjaGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTm90RW1wdHkoY3VycmVudFZhbHVlKSA/IG1vbWVudChjdXJyZW50VmFsdWUudHJpbSgpLCAnTCcsIHRydWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEdXBsaWNhdGVCYXRjaFNlcmllcygpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGNvZGlnbzogc3RyaW5nO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudmFsdWUuZTIwMGxvdFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmUyMDBsb3QuY29kTG90ZVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmNvZExvdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhLmZpbmQoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNvZGlnbyA9PT0gY29kaWdvKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTYWlkYSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcz8uY29udHJvbHM/LnNlcmllPy52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlcmllcyBvZiB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXM/LmNvbnRyb2xzPy5zZXJpZT8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhZGRlZFNlcmllcyBvZiB0aGlzLmdyaWREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWVzLm51bVNlcCA9PT0gYWRkZWRTZXJpZXMuY29kaWdvKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhLmZpbmQoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2FpZGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLmUyMDBzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLmUyMDBzZXIubnVtU2VwXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS5udW1TZXA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY29kaWdvID09PSBjb2RpZ28pIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyQmF0Y2hTZXJpZXMoKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5yZXNldCgpO1xuICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YUZhYnJpY2FjYW8uZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5kaXNhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlKSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YUZhYnJpY2FjYW8uZW5hYmxlKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZURhdGFWYWxpZGFkZSAmJiB0aGlzLmJsb2NrZWRGaWVsZHMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGFMb3Rlb3JTZXJpZShldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuZGlzYWJsZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICB0aGlzLmdldERhdGFzKGV2ZW50LmNvZExvdCA/IGV2ZW50LmNvZExvdCA6IGV2ZW50LmUyMDBsb3QuY29kTG90ZSk7XG4gICAgICAgICAgICB0aGlzLmNvbnN1bHRhU2FsZG9Fc3RvcXVlKGV2ZW50LmNvZExvdCA/IGV2ZW50LmNvZExvdCA6IGV2ZW50LmUyMDBsb3QuY29kTG90ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldERhdGFzKGV2ZW50Lm51bVNlcCA/IGV2ZW50Lm51bVNlcCA6IGV2ZW50LmUyMDBzZXIubnVtU2VwKTtcbiAgICAgICAgICAgIHRoaXMuY29uc3VsdGFTYWxkb0VzdG9xdWUoZXZlbnQubnVtU2VwID8gZXZlbnQubnVtU2VwIDogZXZlbnQuZTIwMHNlci5udW1TZXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJsdXJWYWxpZGFMb3Rlb3JTZXJpZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIC8vIFF1YW5kbyByZWFsaXphIG8gdGFiLCBhYnJlIG8gY2FsZW5kYXIsIHBvciBpc3NvIMOpIG5lY2Vzc8OhcmlvIGRlc2FiaWxpdGFyIGFudGVzXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVJbnZhbGlkQ2hhcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy50aXBvQ29udHJvbGVQcm9kdXRvID09IEVudW1UaXBvQ29udHJvbGVQcm9kdXRvLlNlcmllKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUucGF0Y2hWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS5wYXRjaFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YXModmFsdWUudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICB0aGlzLmNvbnN1bHRhU2FsZG9Fc3RvcXVlKHZhbHVlLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRhcyh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5yZXNldCgpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zYWxkby5yZXNldCgpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YUZhYnJpY2FjYW8uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmRpc2FibGUoKTtcblxuICAgICAgICBsZXQgZmlsdGVyUXVlcnk6IGFueTtcbiAgICAgICAgbGV0IGRlcG9zaXRvID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwKSB7XG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kZXBvc2l0by52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsdGVyUXVlcnkgPSB7XG4gICAgICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzBlbXBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGRlcG9zaXRvXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlclxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VyTGlrZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VyU2FsOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlckRpczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgICAgICAgICAgb3JkZXJCeTogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnQVNDJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMHNlciA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2VwOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgICAgICAubGlzdFNlcmllcyhmaWx0ZXJRdWVyeSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmZvcm1hdERhdGVzVG9DYWxlbmRhcihyZXNwb25zZS5zZXJpZXNbMF0sIFsnZGF0RmFiJywgJ2RhdFZsdCddKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGVzLmUyMDBzZXIuZGF0RmFiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFGYWJyaWNhY2FvLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBzZXIuZGF0RmFiKS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZXMuZTIwMHNlci5kYXRWbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBzZXIuZGF0Vmx0KS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTYWlkYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEYXRhVmFsaWRhZGUgJiYgdGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlICYmICF0aGlzLmlzU2FpZGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwKSB7XG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kZXBvc2l0by52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsdGVyUXVlcnkgPSB7XG4gICAgICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzBlbXBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGRlcG9zaXRvXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlclxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbG90TGlrZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbG90U2FsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvdERpczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgICAgICAgICAgb3JkZXJCeTogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UyMDBsb3QuY29kTG90JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnQVNDJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMGxvdCA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kTG90OiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgICAgICAubGlzdEJhdGNoKGZpbHRlclF1ZXJ5KVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxvdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVzID0gdGhpcy5mb3JtYXREYXRlc1RvQ2FsZW5kYXIocmVzcG9uc2UubG90ZXNbMF0sIFsnZGF0RmFiJywgJ2RhdFZsdCddKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGVzLmUyMDBsb3QuZGF0RmFiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFGYWJyaWNhY2FvLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBsb3QuZGF0RmFiKS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZXMuZTIwMGxvdC5kYXRWbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBsb3QuZGF0Vmx0KS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTYWlkYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEYXRhVmFsaWRhZGUgJiYgdGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlICYmICF0aGlzLmlzU2FpZGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRmFtaWx5U3VwcGx5SW5mbyhmYW1pbHlJRDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYmF0Y2hTZXJpZXNTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdEZhbWlseVN1cHBseUluZm8oZmFtaWx5SUQpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdXBwbHlJbmZvID0gcmVzcG9uc2UuY29udGVudHNbMF07XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9icmlnYVZhbGlkYWRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5zZXRWYWxpZGF0b3JzKFtdKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoc3VwcGx5SW5mbz8uY3RyVmxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1ZPJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJsb2NrZWRGaWVsZHMgPT0gZmFsc2UgJiYgIXRoaXMuaXNTYWlkYSkgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JyaWdhVmFsaWRhZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1ZEJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuZGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlRGF0YVZhbGlkYWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdWTCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlICYmICF0aGlzLmlzU2FpZGEpIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdWx0YVNhbGRvRXN0b3F1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBiYWxhbmNlUGF5bG9hZCA9IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmlzU2VyaWUpIHtcbiAgICAgICAgICAgIGJhbGFuY2VQYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kZXBvc2l0by52YWx1ZS5lMjA1ZGVwLmlkXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlMDc1ZGVyOiB7IGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlciB9LFxuICAgICAgICAgICAgICAgIGUyMDBzZXI6IHsgbnVtU2VwOiB2YWx1ZSB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFsYW5jZVBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgZTIwNWRlcDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlLmUyMDVkZXAuaWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUwNzVkZXI6IHsgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDc1ZGVyIH0sXG4gICAgICAgICAgICAgICAgZTIwMGxvdDogeyBjb2RMb3Q6IHZhbHVlIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJhdGNoU2VyaWVzU2VydmljZVxuICAgICAgICAgICAgLmNvbnN1bHRhclNhbGRvRXN0b3F1ZShiYWxhbmNlUGF5bG9hZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uuc2FsZG8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNhbGRvLnBhdGNoVmFsdWUoMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNhbGRvLnBhdGNoVmFsdWUocmVzcG9uc2Uuc2FsZG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRRdWFudGlkYWRlRGlzdHJpYnVpZGEoKSB7XG4gICAgICAgIGxldCBxdGQgPSAwO1xuXG4gICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zLmxvdGVzT3JTZXJpZXMuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1NlcmllKSBxdGQgPSB0aGlzLnN1bShxdGQsIE51bWJlcih2YWwucXVhbnRpZGFkZSksIHRoaXMubG9jYWxlLm51bWJlci5zY2FsZSk7XG4gICAgICAgICAgICBlbHNlIHF0ZCA9IHRoaXMuc3VtKHF0ZCwgMSwgdGhpcy5sb2NhbGUubnVtYmVyLnNjYWxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHF0ZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlQWxsRm9ybUZpZWxkcyhmb3JtR3JvdXA6IEZvcm1Hcm91cCkge1xuICAgICAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSBjb250cm9sLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB0aGlzLnZhbGlkYXRlQWxsRm9ybUZpZWxkcyhjb250cm9sKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm91dGVEYXRhQ2hhbmdlKGRhdGE6IGFueSkge1xuICAgICAgICB0aGlzLmxvY2FsZUNvbmZpZyA9IGRhdGEubG9jYWxlQ29uZmlnO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlQ29uZmlnO1xuICAgICAgICB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUgPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8ucXRkRGVjID8gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlYyA6IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEUyMDBMb3RTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICBjb25zdCBzZWFyY2hHcmlkRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuY29kTG90ZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfY29kX2RlcGApLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuZGF0RmFiJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9kYXRfZmFiYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuZGF0Vmx0JyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9kYXRfdmx0YCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3F0ZERpcycsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfcXRkX2Rpc2ApLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Eb3VibGVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHNlYXJjaEdyaWRGaWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEUyMDBTZXJTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICBjb25zdCBzZWFyY2hHcmlkRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMHNlcl9udW1fc2VwYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZTIwMHNlci5kYXRGYWInLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX2RhdF9mYWJgKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZTIwMHNlci5kYXRWbHQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX2RhdF92bHRgKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAncXRkRGlzJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMHNlcl9xdGRfZGlzYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gc2VhcmNoR3JpZEZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgb25FMjAwTG90TG9va3VwUmVxdWVzdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBkZXBvc2l0byA9ICcnO1xuICAgICAgICBjb25zdCBkaXNwbGF5RmllbGRzID0gdGhpcy5sb3RlTG9va3VwRGlzcGxheUZpZWxkcztcblxuICAgICAgICBpZiAodGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXApIHtcbiAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlKVxuICAgICAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlLmUyMDVkZXAuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJRdWVyeTogYW55ID0ge1xuICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3MGVtcFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICBpZDogZGVwb3NpdG9cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDc1ZGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG90TGlrZTogdHJ1ZSxcbiAgICAgICAgICAgIGxvdFNhbDogdHJ1ZSxcbiAgICAgICAgICAgIGxvdERpczogdHJ1ZSxcbiAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIHNpemU6IDEwLFxuICAgICAgICAgICAgb3JkZXJCeTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdlMjAwbG90LmNvZExvdCcsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnQVNDJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5LmUyMDBsb3QgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb2RMb3Q6IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmF0Y2hTZXJpZXNTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdEJhdGNoKGZpbHRlclF1ZXJ5KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubGlzdCxcbiAgICAgICAgICAgICAgICAgICAgbG90ZXM6IGxpc3QubG90ZXMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGRpc3BsYXlGaWVsZHMubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCcuJykgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZTIwMGxvdExvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZS5uZXh0KGxpc3QubG90ZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRTIwMFNlckxvb2t1cFJlcXVlc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgZGVwb3NpdG8gPSAnJztcbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IHRoaXMuc2VyaWVMb29rdXBEaXNwbGF5RmllbGRzO1xuXG4gICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcCkge1xuICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUpXG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlclF1ZXJ5OiBhbnkgPSB7XG4gICAgICAgICAgICBlMDcwZW1wOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDcwZW1wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZTIwNWRlcDoge1xuICAgICAgICAgICAgICAgIGlkOiBkZXBvc2l0b1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUwNzVkZXI6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzVkZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXJMaWtlOiB0cnVlLFxuICAgICAgICAgICAgc2VyU2FsOiB0cnVlLFxuICAgICAgICAgICAgc2VyRGlzOiB0cnVlLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgICAgICBvcmRlckJ5OiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6ICdBU0MnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMHNlciA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG51bVNlcDogdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0U2VyaWVzKGZpbHRlclF1ZXJ5KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubGlzdCxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWVzOiBsaXN0LnNlcmllcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZGlzcGxheUZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IDApIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lMjAwc2VyTG9va3VwU3VnZ2VzdGlvbnNPYnNlcnZhYmxlLm5leHQobGlzdC5zZXJpZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZvcm1hdERhdGVzKHJlcXVlc3RCb2R5OiBhbnksIHByb3BlcnRpZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXF1ZXN0Qm9keSkucmVkdWNlKChwcmV2OiBhbnksIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmluZGV4T2YodmFsdWUpID4gLTEgJiYgcmVxdWVzdEJvZHlbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgcHJldlt2YWx1ZV0gPSBtb21lbnQocmVxdWVzdEJvZHlbdmFsdWVdKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldlt2YWx1ZV0gPSByZXF1ZXN0Qm9keVt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JtYXREYXRlc1RvQ2FsZW5kYXIocmVxdWVzdEJvZHk6IGFueSwgcHJvcGVydGllczogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcXVlc3RCb2R5KS5yZWR1Y2UoKHByZXY6IGFueSwgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaW5kZXhPZih2YWx1ZSkgPiAtMSAmJiByZXF1ZXN0Qm9keVt2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdEJvZHlbdmFsdWVdICE9IHVuZGVmaW5lZCAmJiByZXF1ZXN0Qm9keVt2YWx1ZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2W3ZhbHVlXSA9IG1vbWVudChyZXF1ZXN0Qm9keVt2YWx1ZV0pLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbdmFsdWVdID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2W3ZhbHVlXSA9IHJlcXVlc3RCb2R5W3ZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zbGF0ZUh0bWwodGV4dDogc3RyaW5nLCB2YWx1ZTogYW55ID0gbnVsbCwgc2hvcnRjdXQ6IHN0cmluZyA9IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZXQgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fSR7dGV4dH1gLCB7IHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHNob3J0Y3V0ID8gYCR7cmV0fSAke3Nob3J0Y3V0fWAgOiByZXQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGlzdHJpYnV0ZVNlcmllcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgIC5vYnRlck5lY2Vzc2lkYWRlcyh7XG4gICAgICAgICAgICAgICAgZTA3MGVtcElkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5pbnZvaWNlSW5mb3JtYXRpb24uY29tcGFueS5pZCxcbiAgICAgICAgICAgICAgICBlMDcwZmlsSWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbi5icmFuY2guaWQsXG4gICAgICAgICAgICAgICAgaXRlbnNJZDogW3RoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbi5pdGVtLnByb2R1Y3QuaWRdLFxuICAgICAgICAgICAgICAgIHRpcG86IEVudW1UaXBvRG9jdW1lbnRvUGFyYW1ldHJvcy5QZWRpZG9WZW5kYSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudG9JZDogbnVsbCxcbiAgICAgICAgICAgICAgICBudW1lcm9Eb2N1bWVudG9QYWk6IFt0aGlzLmxvdGVTZXJpZVBhcmFtcz8ub3JkZXJJbmZvcm1hdGlvbj8ubnVtYmVyLnRvU3RyaW5nKCldLFxuICAgICAgICAgICAgICAgIGRhdGFJbmljaWFsOiBudWxsLFxuICAgICAgICAgICAgICAgIGRhdGFGaW5hbDogbnVsbCxcbiAgICAgICAgICAgICAgICBzaXR1YWNhbzogbnVsbCxcbiAgICAgICAgICAgICAgICBjb2RpZ29EZW1hbmRhOiBudWxsLFxuICAgICAgICAgICAgICAgIHNvbWVudGVVcmdlbnRlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcGFnZVJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAxMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBuZWNlc3NpZGFkZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IHRoaXMubG90ZVNlcmllUGFyYW1zPy5vcmRlckluZm9ybWF0aW9uPy5pdGVtLmlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0ZW5kaW1lbnRvID0gbmVjZXNzaWRhZGVzLmZpbmQoKG5lY2Vzc2lkYWRlKSA9PiBuZWNlc3NpZGFkZS5kb2N1bWVudG8/LmlkRXh0ZXJubyA9PT0gaXRlbUlkKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGdldFVybElucHV0OiBHZXRVcmxJbnB1dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5OYW1lOiAnZXJweF9zdXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lOiAnZGVtYW5kYXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6ICdlcnB4LXN1cC1kZW1hbmRhcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGU6IGBkZW1hbmRhcy9hdGVuZGltZW50b3MvJHthdGVuZGltZW50by5pZH0/aXNTZXJpZXNEaXN0cmlidXRpb25WaXNpYmxlPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldFVybChnZXRVcmxJbnB1dClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZ2V0VXJsT3V0cHV0OiBHZXRVcmxPdXRwdXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGAke2dldFVybE91dHB1dC5mcm9udGVuZHNbMF0uZW1iZWRkZWRVUkx9YCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRlbGV0ZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaCgodmFsdWUpID0+IHRoaXMucmVtb3ZlQmF0Y2hPclNlcmllcyh2YWx1ZSkpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0Rpc3RyaWJ1dGVTZXJpZXNCdXR0b25WaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5sb3RlU2VyaWVQYXJhbXM/Lmludm9pY2VJbmZvcm1hdGlvbj8uaXRlbT8ucHJvZHVjdD8uaXNTZXJpYWxDb250cm9sbGVkICYmXG4gICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJsdXJRdWFudGl0eSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2FpZGEpIHJldHVybjtcblxuICAgICAgICBjb25zdCBxdWFudGl0eSA9IE51bWJlcih0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMucXVhbnRpZGFkZS52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSBOdW1iZXIodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNhbGRvLnZhbHVlKTtcblxuICAgICAgICBpZiAocXVhbnRpdHkgPiBiYWxhbmNlKVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH13YXJuYCksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfYmF0Y2hfZGlzdHJpYnV0aW9uX3F1YW50aXR5YClcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE1lbnVPcHRpb25zUGVyUm93KHJvd0RhdGEpOiBUaWVyZWRNZW51SXRlbURhdGFbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZWRpdGApLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZS5lZGl0aW5nUm93S2V5cyA9IHsgW3Jvd0RhdGEuY29kaWdvXTogdHJ1ZSB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuZWRpdGluZ0Zvcm1GaWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLm5hbWUgPT09ICdxdWFudGlkYWRlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLnNjYWxlID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlYztcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmdGb3JtR3JvdXAuZ2V0KCdxdWFudGlkYWRlJykuc2V0VmFsdWUocm93RGF0YS5xdWFudGlkYWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRlbGV0ZWRfbWVzc2FnZV90aXRsZWApLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMucmVtb3ZlQmF0Y2hPclNlcmllcyhyb3dEYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIG9uQ2FuY2VsRWRpdChyb3dEYXRhKSB7XG4gICAgICAgIHRoaXMudGFibGUuZWRpdGluZ1Jvd0tleXMgPSB7IFtyb3dEYXRhLmNvZGlnb106IGZhbHNlIH07XG4gICAgfVxuXG4gICAgb25TYXZlRWRpdChyb3dEYXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVBbGxGb3JtRmllbGRzKHRoaXMuZWRpdGluZ0Zvcm1Hcm91cCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWRpdGluZ0Zvcm1Hcm91cC5pbnZhbGlkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBOdW1iZXIodGhpcy5lZGl0aW5nRm9ybUdyb3VwLmdldCgncXVhbnRpZGFkZScpLnZhbHVlKTtcblxuICAgICAgICBpZiAocXVhbnRpdHkgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRpc3RyaWJ1dGlvbl9lcnJvcmApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1pbnZhbGlkX3F0ZGApXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdHJpYnV0ZWRRdWFudGl0eSA9IHRoaXMucXRkRGlzdHJpYnVpZGEgLSBOdW1iZXIocm93RGF0YS5xdWFudGlkYWRlKSArIHF1YW50aXR5O1xuXG4gICAgICAgIGlmIChkaXN0cmlidXRlZFF1YW50aXR5ID4gdGhpcy5xdGRBZGlzdHJpYnVpcikge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfcXR5X21zZ2ApLFxuICAgICAgICAgICAgICAgIHN0aWNreTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXRkRGlzdHJpYnVpZGEgPSBkaXN0cmlidXRlZFF1YW50aXR5O1xuICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gdGhpcy5xdGRBZGlzdHJpYnVpciAtIHRoaXMucXRkRGlzdHJpYnVpZGE7XG5cbiAgICAgICAgdGhpcy50YWJsZS5lZGl0aW5nUm93S2V5cyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMudGFibGUuZWRpdGluZ1Jvd0tleXMsXG4gICAgICAgICAgICBbcm93RGF0YS5jb2RpZ29dOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJvd0RhdGEucXVhbnRpZGFkZSA9IHF1YW50aXR5O1xuICAgIH1cbn1cblxuLypQYXLDom1ldHJvcyBwYXJhIHV0aWxpemFyIG8gY29tcG9uZW50ZSBkZSBsb3RlLXPDqXJpZSAqL1xuZXhwb3J0IGludGVyZmFjZSBMb3RlU2VyaWVQYXJhbXMge1xuICAgIC8qIEluZm9ybWEgc2UgYSBtb3ZpbWVudGHDp8OjbyDDqSBkbyB0aXBvIGVudHJhZGEgb3Ugc2FpZGEuICovXG4gICAgdGlwb01vdmltZW50YWNhbzogRW51bVRpcG9Nb3ZpbWVudGFjYW87XG5cbiAgICAvKiBJbmZvcm1hIHNlIG8gcHJvZHV0byDDqSBjb250cm9sYWRvIHBvciBsb3RlIG91IHPDqXJpZS4gKi9cbiAgICB0aXBvQ29udHJvbGVQcm9kdXRvOiBFbnVtVGlwb0NvbnRyb2xlUHJvZHV0bztcblxuICAgIC8qIEluZm9ybWEgYSBxdWFudGlkYWRlIGEgc2VyIGRpc3RyaWJ1w61kYS4gKi9cbiAgICBxdWFudGlkYWRlRGlzdHJpYnVpcjogbnVtYmVyO1xuXG4gICAgLyogSW5mb3JtYSBvcyBkYWRvcyBkbyBwcm9kdXRvLiAqL1xuICAgIGRhZG9zUHJvZHV0bzogRGFkb3NQcm9kdXRvO1xuXG4gICAgLyogSW5mb3JtYSBvcyBsb3RlcyBvdSBzw6lyaWVzIGphIGRpc3RyaWJ1w61kb3MuKi9cbiAgICBsb3Rlc09yU2VyaWVzPzogQXJyYXk8TG90ZXNPclNlcmllcz47XG5cbiAgICAvKiBJbmZvcm1hw6fDtWVzIGRhIG5vdGEgLiovXG4gICAgaW52b2ljZUluZm9ybWF0aW9uPzogSW52b2ljZUluZm9ybWF0aW9uO1xuXG4gICAgLyogSW5mb3JtYcOnw7VlcyBkbyBwZWRpZG8gZGUgdmVuZGEgLiovXG4gICAgb3JkZXJJbmZvcm1hdGlvbj86IE9yZGVySW5mb3JtYXRpb247XG59XG5cbi8qKiBFbnVtIHBhcmEgdGlwbyBkZSBtb3ZpbWVudG8gKi9cbmV4cG9ydCBlbnVtIEVudW1UaXBvTW92aW1lbnRhY2FvIHtcbiAgICAvKiogVGlwbyBtb3ZpbWVudGHDp8OjbyBpZ3VhbCBhIEVudHJhZGEgKi9cbiAgICBFbnRyYWRhID0gJ0VudHJhZGEnLFxuICAgIC8qKiBUaXBvIG1vdmltZW50YcOnw6NvIGlndWFsIGEgU2HDrWRhICovXG4gICAgU2FpZGEgPSAnU2FpZGEnXG59XG5cbi8qKiBFbnVtIHBhcmEgdGlwbyBkZSBjb250cm9sZSBkZSBwcm9kdXRvICovXG5leHBvcnQgZW51bSBFbnVtVGlwb0NvbnRyb2xlUHJvZHV0byB7XG4gICAgLyoqIFRpcG8gZGUgY29udHJvbGUgaWd1YWwgYSBMb3RlICovXG4gICAgTG90ZSA9ICdMb3RlJyxcbiAgICAvKiogVGlwbyBkZSBjb250cm9sZSBpZ3VhbCBhIFPDqXJpZSAqL1xuICAgIFNlcmllID0gJ1NlcmllJ1xufVxuXG4vKiogSW50ZXJmYWNlIHBhcmEgZGFkb3MgZG8gcHJvZHV0byAqL1xuZXhwb3J0IGludGVyZmFjZSBEYWRvc1Byb2R1dG8ge1xuICAgIC8qKiBJRCBkbyBwcm9kdXRvICovXG4gICAgZTA3NWRlcjogc3RyaW5nO1xuXG4gICAgLyoqIElEIGRvIGRlcMOzc2l0byAqL1xuICAgIGUyMDVkZXA/OiBzdHJpbmc7XG5cbiAgICAvKiogSUQgZGEgZmFtw61saWEgZG8gcHJvZHV0byAqL1xuICAgIGUwMTJmYW06IHN0cmluZztcblxuICAgIC8qKiBFbnRpZGFkZSBlbXByZXNhICovXG4gICAgZTA3MGVtcDogc3RyaW5nO1xuXG4gICAgLyoqIFF1YW50aWRhZGUgZGUgY2FzYXMgZGVjaW1haXMgKi9cbiAgICBxdGREZWM/OiBudW1iZXI7XG59XG5cbi8qKiBJbnRlcmZhY2UgcGFyYSBkYWRvcyBkYSBncmlkIGRvcyBsb3Rlcy9zw6lyaWVzIGRpc3RyaWJ1w61kb3MgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG90ZXNPclNlcmllcyB7XG4gICAgLyoqIElEIGRvIExvdGUgb3UgU8OpcmllICovXG4gICAgaWQ/OiBzdHJpbmc7XG5cbiAgICAvKiogQ8OzZGlnbyBkbyBMb3RlIG91IFPDqXJpZSAqL1xuICAgIGNvZGlnbzogc3RyaW5nO1xuXG4gICAgLyoqIERhdGEgZGUgdmFsaWRhZGUgZG8gbG90ZS9zw6lyaWUgKi9cbiAgICBkYXRhVmFsaWRhZGU/OiBzdHJpbmc7XG5cbiAgICAvKiogRGF0YSBkZSBmYWJyaWNhw6fDo28gZG8gbG90ZS9zw6lyaWUgKi9cbiAgICBkYXRhRmFicmljYWNhbz86IHN0cmluZztcblxuICAgIC8qKiBRdWFudGlkYWRlICoqL1xuICAgIHF1YW50aWRhZGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBlbnVtIEVudW1JbnZvaWNlT3JpZ2luIHtcbiAgICBWMSA9ICdWMScsXG4gICAgVjIgPSAnVjInLFxuICAgIFYzID0gJ1YzJyxcbiAgICBWNCA9ICdWNCcsXG4gICAgVjUgPSAnVjUnLFxuICAgIFY5OSA9ICdWOTknXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2ljZUl0ZW0ge1xuICAgIHByb2R1Y3Q6IHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgaXNTZXJpYWxDb250cm9sbGVkOiBib29sZWFuO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2ljZUluZm9ybWF0aW9uIHtcbiAgICBjb21wYW55OiB7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgfTtcbiAgICBicmFuY2g6IHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICB9O1xuICAgIG9yaWdpbjogRW51bUludm9pY2VPcmlnaW47XG4gICAgaXRlbT86IEludm9pY2VJdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZGVySXRlbSB7XG4gICAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmRlckluZm9ybWF0aW9uIHtcbiAgICBudW1iZXI6IG51bWJlcjtcbiAgICBpdGVtOiBPcmRlckl0ZW07XG59XG5cbmludGVyZmFjZSBCdWxrSW1wb3J0IHtcbiAgICBjb2RpZ286IHN0cmluZztcbiAgICBkYXRhRmFicmljYWNhbzogc3RyaW5nO1xuICAgIGRhdGFWYWxpZGFkZTogc3RyaW5nO1xuICAgIHF1YW50aWRhZGU/OiBudW1iZXI7XG59XG4iXX0=