@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.
- package/bundles/senior-gestao-empresarial-erpx-components.umd.js +37665 -0
- package/bundles/senior-gestao-empresarial-erpx-components.umd.js.map +1 -0
- package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js +17 -0
- package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js.map +1 -0
- package/components/breadcrumb/breadcrumb.component.d.ts +21 -0
- package/components/breadcrumb/breadcrumb.module.d.ts +2 -0
- package/components/breadcrumb/index.d.ts +2 -0
- package/components/focus/focus.service.d.ts +4 -0
- package/components/lote-serie/erp-lote-serie.component.d.ts +183 -0
- package/components/lote-serie/erp-lote-serie.module.d.ts +2 -0
- package/components/lote-serie/erp-lote-serie.service.d.ts +137 -0
- package/components/lote-serie/index.d.ts +2 -0
- package/components/rateio-editor/erp-rateio-editor.component.d.ts +202 -0
- package/components/rateio-editor/erp-rateio-editor.converter.d.ts +18 -0
- package/components/rateio-editor/erp-rateio-editor.module.d.ts +2 -0
- package/components/rateio-editor/erp-rateio-editor.service.d.ts +17 -0
- package/components/rateio-editor/erp-rateio-editor.types.d.ts +171 -0
- package/components/rateio-editor/index.d.ts +4 -0
- package/components/resumo/erp-resumo.component.d.ts +17 -0
- package/components/resumo/erp-resumo.module.d.ts +2 -0
- package/components/resumo/erp-resumo.service.d.ts +2 -0
- package/components/resumo/index.d.ts +2 -0
- package/components/tributos/calculators/effective-tax-rate-calculator.d.ts +34 -0
- package/components/tributos/calculators/gross-amount-calculator.d.ts +20 -0
- package/components/tributos/calculators/tax-amount-calculator.d.ts +54 -0
- package/components/tributos/erp-tributos.component.d.ts +215 -0
- package/components/tributos/erp-tributos.module.d.ts +2 -0
- package/components/tributos/erp-tributos.service.d.ts +10 -0
- package/components/tributos/erp-tributos.types.d.ts +286 -0
- package/components/tributos/index.d.ts +12 -0
- package/components/tributos/mappings/enum-tip-imp-cst-mapping.d.ts +2 -0
- package/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.d.ts +15 -0
- package/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.d.ts +28 -0
- package/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.d.ts +30 -0
- package/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.d.ts +22 -0
- package/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.d.ts +22 -0
- package/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.d.ts +5 -0
- package/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.d.ts +5 -0
- package/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.d.ts +8 -0
- package/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.d.ts +8 -0
- package/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.d.ts +5 -0
- package/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.d.ts +8 -0
- package/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.d.ts +5 -0
- package/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.d.ts +6 -0
- package/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.d.ts +5 -0
- package/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.d.ts +5 -0
- package/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.d.ts +8 -0
- package/components/tributos/rules/rules.service.d.ts +19 -0
- package/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.d.ts +16 -0
- package/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.d.ts +12 -0
- package/components/tributos/rules/status/registries/purchase-order-status-rules.registry.d.ts +12 -0
- package/components/tributos/rules/status/registries/sale-order-status-rules.registry.d.ts +8 -0
- package/components/tributos/rules/status/registries/status-rules.registry.d.ts +15 -0
- package/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.d.ts +5 -0
- package/components/tributos/rules/status/rules/tax-classification-status-rule.d.ts +5 -0
- package/components/tributos/rules/status/rules/tax-rate-status-rule.d.ts +5 -0
- package/components/tributos/rules/status/rules/taxable-base-status-rule.d.ts +5 -0
- package/components/tributos/rules/types/available-fields.d.ts +2 -0
- package/components/tributos/rules/types/available-taxes.d.ts +1 -0
- package/components/tributos/rules/types/field-calculation-rule-mapping.d.ts +6 -0
- package/components/tributos/rules/types/field-rule-mapping.d.ts +6 -0
- package/components/tributos/rules/types/field-status-rule-mapping.d.ts +6 -0
- package/components/tributos/rules/types/rule-payload.d.ts +9 -0
- package/components/tributos/rules/types/schemas/incoming-invoice.schema.d.ts +235 -0
- package/components/tributos/rules/types/schemas/outgoing-invoice.schema.d.ts +349 -0
- package/components/tributos/rules/types/schemas/purchase-order.schema.d.ts +26 -0
- package/components/tributos/rules/types/schemas/sale-order.schema.d.ts +131 -0
- package/components/tributos/rules/types/strategies-by-document.d.ts +12 -0
- package/components/tributos/rules/types/strategies.d.ts +4 -0
- package/components/tributos/rules/types/tax-rule.d.ts +4 -0
- package/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.d.ts +20 -0
- package/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.d.ts +22 -0
- package/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.d.ts +14 -0
- package/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.d.ts +14 -0
- package/components/tributos/rules/validation/registries/validation-rules.registry.d.ts +15 -0
- package/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.d.ts +5 -0
- package/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.d.ts +5 -0
- package/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.d.ts +5 -0
- package/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.d.ts +5 -0
- package/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.d.ts +6 -0
- package/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.d.ts +6 -0
- package/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.d.ts +6 -0
- package/components/tributos/services/tax-rounding.service.d.ts +5 -0
- package/components/tributos/stores/tax.store.d.ts +10 -0
- package/components/tributos/tax-reform-utilities.d.ts +36 -0
- package/components/tributos/types/context.d.ts +7 -0
- package/components/tributos/types/controllership-incoming-invoice-context.d.ts +5 -0
- package/components/tributos/types/controllership-incoming-invoice.d.ts +3 -0
- package/components/tributos/types/controllership-outgoing-invoice-context.d.ts +5 -0
- package/components/tributos/types/controllership-outgoing-invoice.d.ts +3 -0
- package/components/tributos/types/credit-invoice-type.d.ts +1 -0
- package/components/tributos/types/debit-invoice-type.d.ts +1 -0
- package/components/tributos/types/group.d.ts +6 -0
- package/components/tributos/types/incoming-invoice-context.d.ts +5 -0
- package/components/tributos/types/incoming-invoice-item.d.ts +4 -0
- package/components/tributos/types/incoming-invoice-type.d.ts +1 -0
- package/components/tributos/types/incoming-invoice.d.ts +11 -0
- package/components/tributos/types/item-type.d.ts +1 -0
- package/components/tributos/types/outgoing-Invoice.d.ts +11 -0
- package/components/tributos/types/outgoing-invoice-context.d.ts +5 -0
- package/components/tributos/types/outgoing-invoice-item.d.ts +4 -0
- package/components/tributos/types/outgoing-invoice-type.d.ts +1 -0
- package/components/tributos/types/purchase-order-context.d.ts +5 -0
- package/components/tributos/types/purchase-order-type.d.ts +1 -0
- package/components/tributos/types/purchase-order.d.ts +8 -0
- package/components/tributos/types/sale-order-context.d.ts +5 -0
- package/components/tributos/types/sale-order-type.d.ts +1 -0
- package/components/tributos/types/sale-order.d.ts +8 -0
- package/components/tributos/types/tax.d.ts +8 -0
- package/components/utils/breakpoints.d.ts +10 -0
- package/components/utils/export-utils.d.ts +6 -0
- package/components/utils/index.d.ts +3 -0
- package/components/utils/loading-context.d.ts +7 -0
- package/components/utils/utils.d.ts +4 -0
- package/core/entities/entity-service.d.ts +32 -0
- package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.d.ts +36 -0
- package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.d.ts +40 -0
- package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.d.ts +2 -0
- package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.d.ts +11 -0
- package/core/enums/enum-classificacao-tributaria.d.ts +4 -0
- package/core/enums/enum-tipo-calculo-imposto.d.ts +5 -0
- package/core/enums/enum-tipo-documento-parametros.d.ts +7 -0
- package/core/enums/enum-tipo-documento.d.ts +10 -0
- package/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.d.ts +5 -0
- package/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.d.ts +8 -0
- package/esm2015/components/breadcrumb/breadcrumb.component.js +86 -0
- package/esm2015/components/breadcrumb/breadcrumb.module.js +17 -0
- package/esm2015/components/breadcrumb/index.js +3 -0
- package/esm2015/components/focus/focus.service.js +32 -0
- package/esm2015/components/lote-serie/erp-lote-serie.component.js +1772 -0
- package/esm2015/components/lote-serie/erp-lote-serie.module.js +47 -0
- package/esm2015/components/lote-serie/erp-lote-serie.service.js +94 -0
- package/esm2015/components/lote-serie/index.js +3 -0
- package/esm2015/components/rateio-editor/erp-rateio-editor.component.js +794 -0
- package/esm2015/components/rateio-editor/erp-rateio-editor.converter.js +52 -0
- package/esm2015/components/rateio-editor/erp-rateio-editor.module.js +40 -0
- package/esm2015/components/rateio-editor/erp-rateio-editor.service.js +49 -0
- package/esm2015/components/rateio-editor/erp-rateio-editor.types.js +5 -0
- package/esm2015/components/rateio-editor/index.js +4 -0
- package/esm2015/components/resumo/erp-resumo.component.js +19 -0
- package/esm2015/components/resumo/erp-resumo.module.js +25 -0
- package/esm2015/components/resumo/erp-resumo.service.js +13 -0
- package/esm2015/components/resumo/index.js +2 -0
- package/esm2015/components/tributos/calculators/effective-tax-rate-calculator.js +53 -0
- package/esm2015/components/tributos/calculators/gross-amount-calculator.js +37 -0
- package/esm2015/components/tributos/calculators/tax-amount-calculator.js +87 -0
- package/esm2015/components/tributos/erp-tributos.component.js +5176 -0
- package/esm2015/components/tributos/erp-tributos.module.js +33 -0
- package/esm2015/components/tributos/erp-tributos.service.js +23 -0
- package/esm2015/components/tributos/erp-tributos.types.js +268 -0
- package/esm2015/components/tributos/index.js +4 -0
- package/esm2015/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
- package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +45 -0
- package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3102 -0
- package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4516 -0
- package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +294 -0
- package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1464 -0
- package/esm2015/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +48 -0
- package/esm2015/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +55 -0
- package/esm2015/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +83 -0
- package/esm2015/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +74 -0
- package/esm2015/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +72 -0
- package/esm2015/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +244 -0
- package/esm2015/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +74 -0
- package/esm2015/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +170 -0
- package/esm2015/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +100 -0
- package/esm2015/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +124 -0
- package/esm2015/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +292 -0
- package/esm2015/components/tributos/rules/rules.service.js +61 -0
- package/esm2015/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1076 -0
- package/esm2015/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1317 -0
- package/esm2015/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +62 -0
- package/esm2015/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +18 -0
- package/esm2015/components/tributos/rules/status/registries/status-rules.registry.js +45 -0
- package/esm2015/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +39 -0
- package/esm2015/components/tributos/rules/status/rules/tax-classification-status-rule.js +94 -0
- package/esm2015/components/tributos/rules/status/rules/tax-rate-status-rule.js +61 -0
- package/esm2015/components/tributos/rules/status/rules/taxable-base-status-rule.js +65 -0
- package/esm2015/components/tributos/rules/types/available-fields.js +1 -0
- package/esm2015/components/tributos/rules/types/available-taxes.js +1 -0
- package/esm2015/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
- package/esm2015/components/tributos/rules/types/field-rule-mapping.js +1 -0
- package/esm2015/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
- package/esm2015/components/tributos/rules/types/rule-payload.js +1 -0
- package/esm2015/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1816 -0
- package/esm2015/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2750 -0
- package/esm2015/components/tributos/rules/types/schemas/purchase-order.schema.js +150 -0
- package/esm2015/components/tributos/rules/types/schemas/sale-order.schema.js +879 -0
- package/esm2015/components/tributos/rules/types/strategies-by-document.js +1 -0
- package/esm2015/components/tributos/rules/types/strategies.js +1 -0
- package/esm2015/components/tributos/rules/types/tax-rule.js +1 -0
- package/esm2015/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3606 -0
- package/esm2015/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5452 -0
- package/esm2015/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +270 -0
- package/esm2015/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1392 -0
- package/esm2015/components/tributos/rules/validation/registries/validation-rules.registry.js +45 -0
- package/esm2015/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +73 -0
- package/esm2015/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +78 -0
- package/esm2015/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +902 -0
- package/esm2015/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +401 -0
- package/esm2015/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +719 -0
- package/esm2015/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +300 -0
- package/esm2015/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +717 -0
- package/esm2015/components/tributos/services/tax-rounding.service.js +18 -0
- package/esm2015/components/tributos/stores/tax.store.js +19 -0
- package/esm2015/components/tributos/tax-reform-utilities.js +243 -0
- package/esm2015/components/tributos/types/context.js +1 -0
- package/esm2015/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
- package/esm2015/components/tributos/types/controllership-incoming-invoice.js +1 -0
- package/esm2015/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
- package/esm2015/components/tributos/types/controllership-outgoing-invoice.js +1 -0
- package/esm2015/components/tributos/types/credit-invoice-type.js +1 -0
- package/esm2015/components/tributos/types/debit-invoice-type.js +1 -0
- package/esm2015/components/tributos/types/group.js +1 -0
- package/esm2015/components/tributos/types/incoming-invoice-context.js +1 -0
- package/esm2015/components/tributos/types/incoming-invoice-item.js +1 -0
- package/esm2015/components/tributos/types/incoming-invoice-type.js +1 -0
- package/esm2015/components/tributos/types/incoming-invoice.js +1 -0
- package/esm2015/components/tributos/types/item-type.js +1 -0
- package/esm2015/components/tributos/types/outgoing-Invoice.js +1 -0
- package/esm2015/components/tributos/types/outgoing-invoice-context.js +1 -0
- package/esm2015/components/tributos/types/outgoing-invoice-item.js +1 -0
- package/esm2015/components/tributos/types/outgoing-invoice-type.js +1 -0
- package/esm2015/components/tributos/types/purchase-order-context.js +1 -0
- package/esm2015/components/tributos/types/purchase-order-type.js +1 -0
- package/esm2015/components/tributos/types/purchase-order.js +1 -0
- package/esm2015/components/tributos/types/sale-order-context.js +1 -0
- package/esm2015/components/tributos/types/sale-order-type.js +1 -0
- package/esm2015/components/tributos/types/sale-order.js +1 -0
- package/esm2015/components/tributos/types/tax.js +2 -0
- package/esm2015/components/utils/breakpoints.js +11 -0
- package/esm2015/components/utils/export-utils.js +71 -0
- package/esm2015/components/utils/index.js +4 -0
- package/esm2015/components/utils/loading-context.js +20 -0
- package/esm2015/components/utils/utils.js +18 -0
- package/esm2015/core/entities/entity-service.js +91 -0
- package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
- package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +62 -0
- package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +24 -0
- package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +24 -0
- package/esm2015/core/enums/enum-classificacao-tributaria.js +6 -0
- package/esm2015/core/enums/enum-tipo-calculo-imposto.js +7 -0
- package/esm2015/core/enums/enum-tipo-documento-parametros.js +9 -0
- package/esm2015/core/enums/enum-tipo-documento.js +12 -0
- package/esm2015/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
- package/esm2015/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
- package/esm2015/locale/fallback.js +56 -0
- package/esm2015/public-api.js +8 -0
- package/esm2015/senior-gestao-empresarial-erpx-components.js +58 -0
- package/esm5/components/breadcrumb/breadcrumb.component.js +91 -0
- package/esm5/components/breadcrumb/breadcrumb.module.js +20 -0
- package/esm5/components/breadcrumb/index.js +3 -0
- package/esm5/components/focus/focus.service.js +35 -0
- package/esm5/components/lote-serie/erp-lote-serie.component.js +1830 -0
- package/esm5/components/lote-serie/erp-lote-serie.module.js +50 -0
- package/esm5/components/lote-serie/erp-lote-serie.service.js +96 -0
- package/esm5/components/lote-serie/index.js +3 -0
- package/esm5/components/rateio-editor/erp-rateio-editor.component.js +861 -0
- package/esm5/components/rateio-editor/erp-rateio-editor.converter.js +68 -0
- package/esm5/components/rateio-editor/erp-rateio-editor.module.js +43 -0
- package/esm5/components/rateio-editor/erp-rateio-editor.service.js +51 -0
- package/esm5/components/rateio-editor/erp-rateio-editor.types.js +5 -0
- package/esm5/components/rateio-editor/index.js +4 -0
- package/esm5/components/resumo/erp-resumo.component.js +22 -0
- package/esm5/components/resumo/erp-resumo.module.js +28 -0
- package/esm5/components/resumo/erp-resumo.service.js +16 -0
- package/esm5/components/resumo/index.js +2 -0
- package/esm5/components/tributos/calculators/effective-tax-rate-calculator.js +58 -0
- package/esm5/components/tributos/calculators/gross-amount-calculator.js +39 -0
- package/esm5/components/tributos/calculators/tax-amount-calculator.js +91 -0
- package/esm5/components/tributos/erp-tributos.component.js +5296 -0
- package/esm5/components/tributos/erp-tributos.module.js +36 -0
- package/esm5/components/tributos/erp-tributos.service.js +24 -0
- package/esm5/components/tributos/erp-tributos.types.js +268 -0
- package/esm5/components/tributos/index.js +4 -0
- package/esm5/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
- package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +46 -0
- package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3104 -0
- package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4518 -0
- package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +296 -0
- package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1466 -0
- package/esm5/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +60 -0
- package/esm5/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +77 -0
- package/esm5/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +92 -0
- package/esm5/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +83 -0
- package/esm5/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +87 -0
- package/esm5/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +286 -0
- package/esm5/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +89 -0
- package/esm5/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +241 -0
- package/esm5/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +118 -0
- package/esm5/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +200 -0
- package/esm5/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +330 -0
- package/esm5/components/tributos/rules/rules.service.js +139 -0
- package/esm5/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1078 -0
- package/esm5/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1319 -0
- package/esm5/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +64 -0
- package/esm5/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +19 -0
- package/esm5/components/tributos/rules/status/registries/status-rules.registry.js +46 -0
- package/esm5/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +43 -0
- package/esm5/components/tributos/rules/status/rules/tax-classification-status-rule.js +106 -0
- package/esm5/components/tributos/rules/status/rules/tax-rate-status-rule.js +68 -0
- package/esm5/components/tributos/rules/status/rules/taxable-base-status-rule.js +72 -0
- package/esm5/components/tributos/rules/types/available-fields.js +1 -0
- package/esm5/components/tributos/rules/types/available-taxes.js +1 -0
- package/esm5/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
- package/esm5/components/tributos/rules/types/field-rule-mapping.js +1 -0
- package/esm5/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
- package/esm5/components/tributos/rules/types/rule-payload.js +1 -0
- package/esm5/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1817 -0
- package/esm5/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2751 -0
- package/esm5/components/tributos/rules/types/schemas/purchase-order.schema.js +151 -0
- package/esm5/components/tributos/rules/types/schemas/sale-order.schema.js +880 -0
- package/esm5/components/tributos/rules/types/strategies-by-document.js +1 -0
- package/esm5/components/tributos/rules/types/strategies.js +1 -0
- package/esm5/components/tributos/rules/types/tax-rule.js +1 -0
- package/esm5/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3608 -0
- package/esm5/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5454 -0
- package/esm5/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +272 -0
- package/esm5/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1394 -0
- package/esm5/components/tributos/rules/validation/registries/validation-rules.registry.js +46 -0
- package/esm5/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +77 -0
- package/esm5/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +86 -0
- package/esm5/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +968 -0
- package/esm5/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +433 -0
- package/esm5/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +774 -0
- package/esm5/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +323 -0
- package/esm5/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +772 -0
- package/esm5/components/tributos/services/tax-rounding.service.js +23 -0
- package/esm5/components/tributos/stores/tax.store.js +26 -0
- package/esm5/components/tributos/tax-reform-utilities.js +249 -0
- package/esm5/components/tributos/types/context.js +1 -0
- package/esm5/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
- package/esm5/components/tributos/types/controllership-incoming-invoice.js +1 -0
- package/esm5/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
- package/esm5/components/tributos/types/controllership-outgoing-invoice.js +1 -0
- package/esm5/components/tributos/types/credit-invoice-type.js +1 -0
- package/esm5/components/tributos/types/debit-invoice-type.js +1 -0
- package/esm5/components/tributos/types/group.js +1 -0
- package/esm5/components/tributos/types/incoming-invoice-context.js +1 -0
- package/esm5/components/tributos/types/incoming-invoice-item.js +1 -0
- package/esm5/components/tributos/types/incoming-invoice-type.js +1 -0
- package/esm5/components/tributos/types/incoming-invoice.js +1 -0
- package/esm5/components/tributos/types/item-type.js +1 -0
- package/esm5/components/tributos/types/outgoing-Invoice.js +1 -0
- package/esm5/components/tributos/types/outgoing-invoice-context.js +1 -0
- package/esm5/components/tributos/types/outgoing-invoice-item.js +1 -0
- package/esm5/components/tributos/types/outgoing-invoice-type.js +1 -0
- package/esm5/components/tributos/types/purchase-order-context.js +1 -0
- package/esm5/components/tributos/types/purchase-order-type.js +1 -0
- package/esm5/components/tributos/types/purchase-order.js +1 -0
- package/esm5/components/tributos/types/sale-order-context.js +1 -0
- package/esm5/components/tributos/types/sale-order-type.js +1 -0
- package/esm5/components/tributos/types/sale-order.js +1 -0
- package/esm5/components/tributos/types/tax.js +2 -0
- package/esm5/components/utils/breakpoints.js +11 -0
- package/esm5/components/utils/export-utils.js +78 -0
- package/esm5/components/utils/index.js +4 -0
- package/esm5/components/utils/loading-context.js +22 -0
- package/esm5/components/utils/utils.js +20 -0
- package/esm5/core/entities/entity-service.js +98 -0
- package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
- package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +67 -0
- package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +27 -0
- package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +27 -0
- package/esm5/core/enums/enum-classificacao-tributaria.js +6 -0
- package/esm5/core/enums/enum-tipo-calculo-imposto.js +7 -0
- package/esm5/core/enums/enum-tipo-documento-parametros.js +9 -0
- package/esm5/core/enums/enum-tipo-documento.js +12 -0
- package/esm5/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
- package/esm5/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
- package/esm5/locale/fallback.js +56 -0
- package/esm5/public-api.js +8 -0
- package/esm5/senior-gestao-empresarial-erpx-components.js +58 -0
- package/fesm2015/senior-gestao-empresarial-erpx-components.js +36350 -0
- package/fesm2015/senior-gestao-empresarial-erpx-components.js.map +1 -0
- package/fesm5/senior-gestao-empresarial-erpx-components.js +37396 -0
- package/fesm5/senior-gestao-empresarial-erpx-components.js.map +1 -0
- package/locale/fallback.d.ts +55 -0
- package/package.json +23 -0
- package/public-api.d.ts +7 -0
- package/senior-gestao-empresarial-erpx-components.d.ts +57 -0
- 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=
|