ng-pli-commons 0.0.1908 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/backoffice.commons.component.mjs +40 -0
- package/esm2022/lib/components/common.lists.component.mjs +194 -0
- package/{esm2020 → esm2022}/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -23
- package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
- package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
- package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
- package/esm2022/lib/components/configuration.commons.component.mjs +40 -0
- package/{esm2020 → esm2022}/lib/components/dashboard.commons.component.mjs +84 -84
- package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
- package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
- package/esm2022/lib/components/frontoffice.commons.component.mjs +86 -0
- package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
- package/{esm2020 → esm2022}/lib/components/pdf-config/pdf-config.component.mjs +170 -170
- package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +223 -0
- package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
- package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
- package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
- package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
- package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +199 -0
- package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
- package/esm2022/lib/components/token/token.component.mjs +1006 -0
- package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
- package/{esm2020 → esm2022}/lib/directives/currency-colfuturo-formatter.directive.mjs +47 -47
- package/{esm2020 → esm2022}/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +34 -34
- package/esm2022/lib/ng-pli-commons.module.mjs +387 -0
- package/{esm2020 → esm2022}/lib/ng-pli-commons.service.mjs +14 -14
- package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +35 -0
- package/{esm2020 → esm2022}/lib/pipes/currency-decimal-colfuturo.pipe.mjs +36 -36
- package/{esm2020 → esm2022}/lib/pipes/currency-print-colfuturo.pipe.mjs +33 -33
- package/esm2022/lib/pipes/thousands.pipe.mjs +60 -0
- package/{esm2020 → esm2022}/lib/services/application-fill-percentage.service.mjs +30 -30
- package/{esm2020 → esm2022}/lib/services/application-tag.service.mjs +56 -56
- package/{esm2020 → esm2022}/lib/services/application.service.mjs +247 -247
- package/esm2022/lib/services/authentication.service.mjs +133 -0
- package/{esm2020 → esm2022}/lib/services/blocked-beneficiary.service.mjs +42 -42
- package/esm2022/lib/services/budget-application.service.mjs +265 -0
- package/{esm2020 → esm2022}/lib/services/budget-simulation.service.mjs +61 -61
- package/esm2022/lib/services/budget.service.mjs +205 -0
- package/{esm2020 → esm2022}/lib/services/closure-wallet.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/cnf-correspondence-document-manager.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/committee-money.service.mjs +44 -44
- package/{esm2020 → esm2022}/lib/services/committee-pdf.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/committee-snapshot.service.mjs +60 -60
- package/{esm2020 → esm2022}/lib/services/common-info.service.mjs +51 -51
- package/esm2022/lib/services/common.service.mjs +291 -0
- package/esm2022/lib/services/configuration-document.service.mjs +297 -0
- package/{esm2020 → esm2022}/lib/services/configuration-minisite.service.mjs +26 -26
- package/{esm2020 → esm2022}/lib/services/configuration.service.mjs +53 -53
- package/{esm2020 → esm2022}/lib/services/correspondence-document-category.service.mjs +31 -31
- package/{esm2020 → esm2022}/lib/services/correspondence-manager.service.mjs +67 -67
- package/{esm2020 → esm2022}/lib/services/credit-score.service.mjs +48 -48
- package/{esm2020 → esm2022}/lib/services/credit-study.service.mjs +292 -292
- package/{esm2020 → esm2022}/lib/services/cube.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/data-form-history.service.mjs +25 -25
- package/{esm2020 → esm2022}/lib/services/data-form.service.mjs +176 -176
- package/{esm2020 → esm2022}/lib/services/data-letter-segmentation.service.mjs +64 -64
- package/{esm2020 → esm2022}/lib/services/document-analysis-auto.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/document-history.service.mjs +43 -43
- package/{esm2020 → esm2022}/lib/services/document-management.service.mjs +57 -57
- package/{esm2020 → esm2022}/lib/services/document-validation-attempt.service.mjs +32 -32
- package/{esm2020 → esm2022}/lib/services/document.service.mjs +131 -131
- package/esm2022/lib/services/documentary.type.service.mjs +69 -0
- package/{esm2020 → esm2022}/lib/services/email.service.mjs +30 -30
- package/{esm2020 → esm2022}/lib/services/evaluation.service.mjs +181 -181
- package/{esm2020 → esm2022}/lib/services/export-excel.service.mjs +32 -32
- package/esm2022/lib/services/file.service.mjs +153 -0
- package/{esm2020 → esm2022}/lib/services/form.service.mjs +112 -112
- package/{esm2020 → esm2022}/lib/services/gic-client-disbursement-metadata.service.mjs +31 -31
- package/{esm2020 → esm2022}/lib/services/gic-client.service.mjs +49 -49
- package/{esm2020 → esm2022}/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -31
- package/{esm2020 → esm2022}/lib/services/gic-cnf-closing-date.service.mjs +34 -34
- package/{esm2020 → esm2022}/lib/services/gic-cnf-maintenance.service.mjs +30 -30
- package/{esm2020 → esm2022}/lib/services/gic-collection.service.mjs +53 -53
- package/{esm2020 → esm2022}/lib/services/gic-disbursement.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/gic-extract.service.mjs +41 -41
- package/{esm2020 → esm2022}/lib/services/gic-log.service.mjs +41 -41
- package/{esm2020 → esm2022}/lib/services/gic-payment-application.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/services/gic-payment-plan-cube.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/gic-payment-plan.service.mjs +32 -32
- package/{esm2020 → esm2022}/lib/services/gic-trm.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/global.show.task.service.mjs +37 -37
- package/{esm2020 → esm2022}/lib/services/guarantee-document.service.mjs +52 -52
- package/{esm2020 → esm2022}/lib/services/guarantee-enrollment.service.mjs +37 -37
- package/esm2022/lib/services/guarantee.service.mjs +128 -0
- package/{esm2020 → esm2022}/lib/services/hash.service.mjs +36 -36
- package/{esm2020 → esm2022}/lib/services/import-data.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/import-excel-gic.service.mjs +45 -45
- package/{esm2020 → esm2022}/lib/services/initial-configuration-gic-parameters.service.mjs +51 -51
- package/{esm2020 → esm2022}/lib/services/initial-record.service.mjs +51 -51
- package/{esm2020 → esm2022}/lib/services/integration-ado.service.mjs +54 -54
- package/{esm2020 → esm2022}/lib/services/interaction-application-user.service.mjs +81 -81
- package/{esm2020 → esm2022}/lib/services/interest-adjustment.service.mjs +34 -34
- package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
- package/{esm2020 → esm2022}/lib/services/legalization.service.mjs +150 -150
- package/{esm2020 → esm2022}/lib/services/letter-campaing.service.mjs +49 -49
- package/{esm2020 → esm2022}/lib/services/letter-task-mapping.service.mjs +40 -40
- package/{esm2020 → esm2022}/lib/services/log.service.mjs +41 -41
- package/{esm2020 → esm2022}/lib/services/maintenance.service.mjs +66 -66
- package/{esm2020 → esm2022}/lib/services/master-category.service.mjs +66 -66
- package/{esm2020 → esm2022}/lib/services/master-program.service.mjs +78 -78
- package/{esm2020 → esm2022}/lib/services/master-university.service.mjs +68 -68
- package/{esm2020 → esm2022}/lib/services/migration-plis.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/migration-survey-queue.service.mjs +24 -24
- package/{esm2020 → esm2022}/lib/services/page.service.mjs +38 -38
- package/{esm2020 → esm2022}/lib/services/partner-system.service.mjs +30 -30
- package/{esm2020 → esm2022}/lib/services/partner.service.mjs +34 -34
- package/{esm2020 → esm2022}/lib/services/pdf-analyzer.service.mjs +33 -33
- package/{esm2020 → esm2022}/lib/services/people-master.service.mjs +42 -42
- package/{esm2020 → esm2022}/lib/services/permission.service.mjs +29 -29
- package/{esm2020 → esm2022}/lib/services/pli-cnf-acuity-fields.service.mjs +34 -34
- package/{esm2020 → esm2022}/lib/services/pli-cnf-app-card-filter.service.mjs +40 -40
- package/{esm2020 → esm2022}/lib/services/pli-cnf-appointment-type.service.mjs +41 -41
- package/{esm2020 → esm2022}/lib/services/pli-cnf-budget-program-type.service.mjs +54 -54
- package/{esm2020 → esm2022}/lib/services/pli-cnf-budget.service.mjs +31 -31
- package/{esm2020 → esm2022}/lib/services/pli-cnf-cloning.service.mjs +27 -27
- package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -47
- package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -30
- package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -42
- package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -42
- package/{esm2020 → esm2022}/lib/services/pli-cnf-committee.service.mjs +51 -51
- package/{esm2020 → esm2022}/lib/services/pli-cnf-config-minisite.service.mjs +90 -90
- package/{esm2020 → esm2022}/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -41
- package/{esm2020 → esm2022}/lib/services/pli-cnf-document-management.service.mjs +40 -40
- package/{esm2020 → esm2022}/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -52
- package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -31
- package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
- package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-template.service.mjs +95 -95
- package/{esm2020 → esm2022}/lib/services/pli-cnf-form-edit.service.mjs +68 -68
- package/{esm2020 → esm2022}/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -46
- package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -40
- package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-token.service.mjs +42 -42
- package/{esm2020 → esm2022}/lib/services/pli-cnf-header.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/pli-cnf-indicator.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/pli-cnf-information-system.service.mjs +24 -24
- package/{esm2020 → esm2022}/lib/services/pli-cnf-interaction.service.mjs +78 -78
- package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template-type.service.mjs +29 -29
- package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template.service.mjs +48 -48
- package/{esm2020 → esm2022}/lib/services/pli-cnf-look-and-feel.service.mjs +28 -28
- package/{esm2020 → esm2022}/lib/services/pli-cnf-mail.service.mjs +30 -30
- package/{esm2020 → esm2022}/lib/services/pli-cnf-menu-form.service.mjs +34 -34
- package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +33 -33
- package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -47
- package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -44
- package/{esm2020 → esm2022}/lib/services/pli-cnf-page-section-form.service.mjs +66 -66
- package/{esm2020 → esm2022}/lib/services/pli-cnf-page-sub-process.service.mjs +25 -25
- package/{esm2020 → esm2022}/lib/services/pli-cnf-pdfs.service.mjs +31 -31
- package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-form.service.mjs +40 -40
- package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-user.service.mjs +49 -49
- package/{esm2020 → esm2022}/lib/services/pli-cnf-project-summary.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/pli-cnf-scenario.service.mjs +47 -47
- package/{esm2020 → esm2022}/lib/services/pli-cnf-segmentation.service.mjs +72 -72
- package/{esm2020 → esm2022}/lib/services/pli-cnf-snapshot-token.service.mjs +42 -42
- package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -74
- package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow.service.mjs +56 -56
- package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document-category.service.mjs +47 -47
- package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document.service.mjs +56 -56
- package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-document.service.mjs +37 -37
- package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-pdf.service.mjs +34 -34
- package/{esm2020 → esm2022}/lib/services/pli-cnf-survey.service.mjs +46 -46
- package/{esm2020 → esm2022}/lib/services/pli-cnf-task-group.service.mjs +33 -33
- package/{esm2020 → esm2022}/lib/services/pli-cnf-text-category.service.mjs +38 -38
- package/{esm2020 → esm2022}/lib/services/pli-cnf-text-option.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/pli-cnf-text.service.mjs +62 -62
- package/{esm2020 → esm2022}/lib/services/pli-cnf-type-text.service.mjs +45 -45
- package/{esm2020 → esm2022}/lib/services/pli-cnf-university-article.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/pli-cnf-user-calendar.service.mjs +36 -36
- package/{esm2020 → esm2022}/lib/services/pli-cnf-user-workspace.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/services/pli-cnf-valpro-keys.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -31
- package/{esm2020 → esm2022}/lib/services/pli-message-type.service.mjs +40 -40
- package/{esm2020 → esm2022}/lib/services/pli-multiple-value-filter.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/pli-promocion-username.service.mjs +57 -57
- package/{esm2020 → esm2022}/lib/services/pli-seg-action-user.service.mjs +37 -37
- package/{esm2020 → esm2022}/lib/services/pli-segmentation.service.mjs +130 -130
- package/{esm2020 → esm2022}/lib/services/pli-tag-assignment.service.mjs +36 -36
- package/{esm2020 → esm2022}/lib/services/pli-tag.service.mjs +55 -55
- package/{esm2020 → esm2022}/lib/services/pli-user.service.mjs +51 -51
- package/{esm2020 → esm2022}/lib/services/plis-beneficiario.service.mjs +29 -29
- package/{esm2020 → esm2022}/lib/services/plis-estatus-change.service.mjs +30 -30
- package/esm2022/lib/services/ppp.service.mjs +360 -0
- package/{esm2020 → esm2022}/lib/services/profile.service.mjs +60 -60
- package/esm2022/lib/services/progress-bar.service.mjs +40 -0
- package/{esm2020 → esm2022}/lib/services/promotion-score.service.mjs +44 -44
- package/{esm2020 → esm2022}/lib/services/registry-identifier.service.mjs +39 -39
- package/{esm2020 → esm2022}/lib/services/return-refund.service.mjs +53 -53
- package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
- package/{esm2020 → esm2022}/lib/services/segmentation-user-service.service.mjs +90 -90
- package/{esm2020 → esm2022}/lib/services/segmentation.service.mjs +31 -31
- package/esm2022/lib/services/send-application.service.mjs +492 -0
- package/{esm2020 → esm2022}/lib/services/sesion-form.service.mjs +31 -31
- package/{esm2020 → esm2022}/lib/services/sesion.service.mjs +48 -48
- package/{esm2020 → esm2022}/lib/services/spinner.service.mjs +16 -16
- package/{esm2020 → esm2022}/lib/services/sponsorship-letter.service.mjs +68 -68
- package/{esm2020 → esm2022}/lib/services/status.service.mjs +100 -100
- package/{esm2020 → esm2022}/lib/services/summary-budget.service.mjs +24 -24
- package/{esm2020 → esm2022}/lib/services/survey-metadata.service.mjs +28 -28
- package/{esm2020 → esm2022}/lib/services/survey-queue.service.mjs +24 -24
- package/{esm2020 → esm2022}/lib/services/survey.service.mjs +52 -52
- package/{esm2020 → esm2022}/lib/services/tasa.cambio.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/services/token-transformation.service.mjs +62 -62
- package/esm2022/lib/services/token.service.mjs +1345 -0
- package/{esm2020 → esm2022}/lib/services/university.service.mjs +50 -50
- package/esm2022/lib/services/upload-documents.service.mjs +60 -0
- package/{esm2020 → esm2022}/lib/services/user.service.mjs +28 -28
- package/{esm2020 → esm2022}/lib/services/visualization-committee.service.mjs +84 -84
- package/esm2022/lib/utils/custom-validator.mjs +95 -0
- package/esm2022/lib/utils/form-util.mjs +35 -0
- package/esm2022/lib/utils/formio-util.mjs +582 -0
- package/{esm2020 → esm2022}/lib/utils/version-commons.mjs +9 -9
- package/{esm2020 → esm2022}/ng-pli-commons.mjs +4 -4
- package/{esm2020 → esm2022}/public-api.mjs +214 -214
- package/{esm2020 → esm2022}/version.mjs +29 -29
- package/{fesm2020 → fesm2022}/ng-pli-commons.mjs +16724 -16725
- package/fesm2022/ng-pli-commons.mjs.map +1 -0
- package/{ng-pli-commons.d.ts → index.d.ts} +5 -5
- package/lib/components/backoffice.commons.component.d.ts +15 -15
- package/lib/components/common.lists.component.d.ts +61 -61
- package/lib/components/configuration-token/configuration-token-subject.service.d.ts +10 -10
- package/lib/components/configuration-token/configuration-token.component.d.ts +124 -124
- package/lib/components/configuration-token/guarantee-token/guarantee-token.component.d.ts +33 -33
- package/lib/components/configuration-token/snapshot-token/snapshot-token.component.d.ts +37 -37
- package/lib/components/configuration.commons.component.d.ts +15 -15
- package/lib/components/dashboard.commons.component.d.ts +39 -39
- package/lib/components/dynamic-filter/dynamic-filter.component.d.ts +50 -50
- package/lib/components/excel-to-json/excel-to-json.component.d.ts +12 -12
- package/lib/components/frontoffice.commons.component.d.ts +26 -26
- package/lib/components/pdf-analyzer/pdf-analyzer.component.d.ts +36 -36
- package/lib/components/pdf-config/pdf-config.component.d.ts +78 -78
- package/lib/components/pdf-generator/pdf-generator.component.d.ts +69 -69
- package/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.d.ts +114 -114
- package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +147 -147
- package/lib/components/progress-bar/progress-bar.component.d.ts +30 -30
- package/lib/components/segmentation-tokens/segmentation-tokens.component.d.ts +48 -48
- package/lib/components/select-ppp/select-ppp.component.d.ts +42 -42
- package/lib/components/show-hide-columns/show-hide-columns-table.component.d.ts +39 -39
- package/lib/components/token/token.component.d.ts +99 -99
- package/lib/components/tokens-calculator/tokens-calculator.component.d.ts +37 -37
- package/lib/directives/currency-colfuturo-formatter.directive.d.ts +14 -14
- package/lib/directives/currency-decimal-colfuturo-formatter.directive.d.ts +13 -13
- package/lib/ng-pli-commons.module.d.ts +47 -47
- package/lib/ng-pli-commons.service.d.ts +6 -6
- package/lib/pipes/currency-colfuturo.pipe.d.ts +12 -12
- package/lib/pipes/currency-decimal-colfuturo.pipe.d.ts +11 -11
- package/lib/pipes/currency-print-colfuturo.pipe.d.ts +11 -11
- package/lib/pipes/thousands.pipe.d.ts +9 -9
- package/lib/services/application-fill-percentage.service.d.ts +15 -15
- package/lib/services/application-tag.service.d.ts +23 -23
- package/lib/services/application.service.d.ts +107 -107
- package/lib/services/authentication.service.d.ts +45 -45
- package/lib/services/blocked-beneficiary.service.d.ts +17 -17
- package/lib/services/budget-application.service.d.ts +52 -52
- package/lib/services/budget-simulation.service.d.ts +32 -32
- package/lib/services/budget.service.d.ts +65 -65
- package/lib/services/closure-wallet.service.d.ts +16 -16
- package/lib/services/cnf-correspondence-document-manager.service.d.ts +14 -14
- package/lib/services/committee-money.service.d.ts +12 -12
- package/lib/services/committee-pdf.service.d.ts +13 -13
- package/lib/services/committee-snapshot.service.d.ts +24 -24
- package/lib/services/common-info.service.d.ts +30 -30
- package/lib/services/common.service.d.ts +103 -103
- package/lib/services/configuration-document.service.d.ts +84 -84
- package/lib/services/configuration-minisite.service.d.ts +13 -13
- package/lib/services/configuration.service.d.ts +15 -15
- package/lib/services/correspondence-document-category.service.d.ts +12 -12
- package/lib/services/correspondence-manager.service.d.ts +21 -21
- package/lib/services/credit-score.service.d.ts +14 -14
- package/lib/services/credit-study.service.d.ts +52 -52
- package/lib/services/cube.service.d.ts +14 -14
- package/lib/services/data-form-history.service.d.ts +13 -13
- package/lib/services/data-form.service.d.ts +82 -82
- package/lib/services/data-letter-segmentation.service.d.ts +20 -20
- package/lib/services/document-analysis-auto.service.d.ts +14 -14
- package/lib/services/document-history.service.d.ts +18 -18
- package/lib/services/document-management.service.d.ts +22 -22
- package/lib/services/document-validation-attempt.service.d.ts +13 -13
- package/lib/services/document.service.d.ts +51 -51
- package/lib/services/documentary.type.service.d.ts +23 -23
- package/lib/services/email.service.d.ts +15 -15
- package/lib/services/evaluation.service.d.ts +58 -58
- package/lib/services/export-excel.service.d.ts +8 -8
- package/lib/services/file.service.d.ts +63 -63
- package/lib/services/form.service.d.ts +39 -39
- package/lib/services/gic-client-disbursement-metadata.service.d.ts +12 -12
- package/lib/services/gic-client.service.d.ts +20 -20
- package/lib/services/gic-cnf-bankvision-transaction.service.d.ts +13 -13
- package/lib/services/gic-cnf-closing-date.service.d.ts +15 -15
- package/lib/services/gic-cnf-maintenance.service.d.ts +13 -13
- package/lib/services/gic-collection.service.d.ts +19 -19
- package/lib/services/gic-disbursement.service.d.ts +16 -16
- package/lib/services/gic-extract.service.d.ts +15 -15
- package/lib/services/gic-log.service.d.ts +17 -17
- package/lib/services/gic-payment-application.service.d.ts +15 -15
- package/lib/services/gic-payment-plan-cube.service.d.ts +13 -13
- package/lib/services/gic-payment-plan.service.d.ts +19 -19
- package/lib/services/gic-trm.service.d.ts +14 -14
- package/lib/services/global.show.task.service.d.ts +20 -20
- package/lib/services/guarantee-document.service.d.ts +17 -17
- package/lib/services/guarantee-enrollment.service.d.ts +14 -14
- package/lib/services/guarantee.service.d.ts +34 -34
- package/lib/services/hash.service.d.ts +18 -18
- package/lib/services/import-data.service.d.ts +14 -14
- package/lib/services/import-excel-gic.service.d.ts +22 -22
- package/lib/services/initial-configuration-gic-parameters.service.d.ts +19 -19
- package/lib/services/initial-record.service.d.ts +24 -24
- package/lib/services/integration-ado.service.d.ts +15 -15
- package/lib/services/interaction-application-user.service.d.ts +28 -28
- package/lib/services/interest-adjustment.service.d.ts +16 -16
- package/lib/services/keys-assignation.service.d.ts +33 -33
- package/lib/services/legalization.service.d.ts +46 -46
- package/lib/services/letter-campaing.service.d.ts +24 -24
- package/lib/services/letter-task-mapping.service.d.ts +22 -22
- package/lib/services/log.service.d.ts +17 -17
- package/lib/services/maintenance.service.d.ts +23 -23
- package/lib/services/master-category.service.d.ts +40 -40
- package/lib/services/master-program.service.d.ts +45 -45
- package/lib/services/master-university.service.d.ts +40 -40
- package/lib/services/migration-plis.service.d.ts +14 -14
- package/lib/services/migration-survey-queue.service.d.ts +12 -12
- package/lib/services/page.service.d.ts +18 -18
- package/lib/services/partner-system.service.d.ts +13 -13
- package/lib/services/partner.service.d.ts +17 -17
- package/lib/services/pdf-analyzer.service.d.ts +11 -11
- package/lib/services/people-master.service.d.ts +14 -14
- package/lib/services/permission.service.d.ts +14 -14
- package/lib/services/pli-cnf-acuity-fields.service.d.ts +14 -14
- package/lib/services/pli-cnf-app-card-filter.service.d.ts +20 -20
- package/lib/services/pli-cnf-appointment-type.service.d.ts +16 -16
- package/lib/services/pli-cnf-budget-program-type.service.d.ts +18 -18
- package/lib/services/pli-cnf-budget.service.d.ts +13 -13
- package/lib/services/pli-cnf-cloning.service.d.ts +12 -12
- package/lib/services/pli-cnf-committee-pdf-config-table-config.service.d.ts +19 -19
- package/lib/services/pli-cnf-committee-pdf-gen-status.service.d.ts +13 -13
- package/lib/services/pli-cnf-committee-valpro-columns.service.d.ts +15 -15
- package/lib/services/pli-cnf-committee-visualization-mode.service.d.ts +17 -17
- package/lib/services/pli-cnf-committee.service.d.ts +21 -21
- package/lib/services/pli-cnf-config-minisite.service.d.ts +26 -26
- package/lib/services/pli-cnf-configuration-credit-study.service.d.ts +16 -16
- package/lib/services/pli-cnf-document-management.service.d.ts +15 -15
- package/lib/services/pli-cnf-dynamic-keys-assign.service.d.ts +21 -21
- package/lib/services/pli-cnf-evaluation-task-mailing.service.d.ts +13 -13
- package/lib/services/pli-cnf-evaluation-task.service.d.ts +35 -35
- package/lib/services/pli-cnf-evaluation-template.service.d.ts +44 -44
- package/lib/services/pli-cnf-form-edit.service.d.ts +29 -29
- package/lib/services/pli-cnf-form-multiaplicacion.service.d.ts +21 -21
- package/lib/services/pli-cnf-guarantee-documents-template.service.d.ts +17 -17
- package/lib/services/pli-cnf-guarantee-token.service.d.ts +16 -16
- package/lib/services/pli-cnf-header.service.d.ts +18 -18
- package/lib/services/pli-cnf-indicator.service.d.ts +20 -20
- package/lib/services/pli-cnf-information-system.service.d.ts +12 -12
- package/lib/services/pli-cnf-interaction.service.d.ts +31 -31
- package/lib/services/pli-cnf-letter-template-type.service.d.ts +15 -15
- package/lib/services/pli-cnf-letter-template.service.d.ts +22 -22
- package/lib/services/pli-cnf-look-and-feel.service.d.ts +13 -13
- package/lib/services/pli-cnf-mail.service.d.ts +13 -13
- package/lib/services/pli-cnf-menu-form.service.d.ts +16 -16
- package/lib/services/pli-cnf-migration-plis-field-budget.service.d.ts +14 -14
- package/lib/services/pli-cnf-migration-plis-field.service.d.ts +17 -17
- package/lib/services/pli-cnf-migration-status-plis.service.d.ts +17 -17
- package/lib/services/pli-cnf-page-section-form.service.d.ts +24 -24
- package/lib/services/pli-cnf-page-sub-process.service.d.ts +12 -12
- package/lib/services/pli-cnf-pdfs.service.d.ts +14 -14
- package/lib/services/pli-cnf-profile-form.service.d.ts +20 -20
- package/lib/services/pli-cnf-profile-user.service.d.ts +24 -24
- package/lib/services/pli-cnf-project-summary.service.d.ts +16 -16
- package/lib/services/pli-cnf-scenario.service.d.ts +23 -23
- package/lib/services/pli-cnf-segmentation.service.d.ts +32 -32
- package/lib/services/pli-cnf-snapshot-token.service.d.ts +16 -16
- package/lib/services/pli-cnf-status-flow-interaction.service.d.ts +28 -28
- package/lib/services/pli-cnf-status-flow.service.d.ts +26 -26
- package/lib/services/pli-cnf-support-document-category.service.d.ts +17 -17
- package/lib/services/pli-cnf-support-document.service.d.ts +23 -23
- package/lib/services/pli-cnf-survey-document.service.d.ts +16 -16
- package/lib/services/pli-cnf-survey-pdf.service.d.ts +15 -15
- package/lib/services/pli-cnf-survey.service.d.ts +19 -19
- package/lib/services/pli-cnf-task-group.service.d.ts +15 -15
- package/lib/services/pli-cnf-text-category.service.d.ts +15 -15
- package/lib/services/pli-cnf-text-option.service.d.ts +15 -15
- package/lib/services/pli-cnf-text.service.d.ts +21 -21
- package/lib/services/pli-cnf-type-text.service.d.ts +16 -16
- package/lib/services/pli-cnf-university-article.service.d.ts +20 -20
- package/lib/services/pli-cnf-user-calendar.service.d.ts +16 -16
- package/lib/services/pli-cnf-user-workspace.service.d.ts +18 -18
- package/lib/services/pli-cnf-valpro-keys.service.d.ts +18 -18
- package/lib/services/pli-cnf-workspace-segmentation.service.d.ts +16 -16
- package/lib/services/pli-message-type.service.d.ts +15 -15
- package/lib/services/pli-multiple-value-filter.service.d.ts +17 -17
- package/lib/services/pli-promocion-username.service.d.ts +26 -26
- package/lib/services/pli-seg-action-user.service.d.ts +20 -20
- package/lib/services/pli-segmentation.service.d.ts +48 -48
- package/lib/services/pli-tag-assignment.service.d.ts +15 -15
- package/lib/services/pli-tag.service.d.ts +21 -21
- package/lib/services/pli-user.service.d.ts +24 -24
- package/lib/services/plis-beneficiario.service.d.ts +10 -10
- package/lib/services/plis-estatus-change.service.d.ts +13 -13
- package/lib/services/ppp.service.d.ts +77 -77
- package/lib/services/profile.service.d.ts +26 -26
- package/lib/services/progress-bar.service.d.ts +14 -14
- package/lib/services/promotion-score.service.d.ts +14 -14
- package/lib/services/registry-identifier.service.d.ts +16 -16
- package/lib/services/return-refund.service.d.ts +20 -20
- package/lib/services/segmentation-tokens.service.d.ts +22 -22
- package/lib/services/segmentation-user-service.service.d.ts +26 -26
- package/lib/services/segmentation.service.d.ts +16 -16
- package/lib/services/send-application.service.d.ts +71 -71
- package/lib/services/sesion-form.service.d.ts +16 -16
- package/lib/services/sesion.service.d.ts +27 -27
- package/lib/services/spinner.service.d.ts +6 -6
- package/lib/services/sponsorship-letter.service.d.ts +34 -34
- package/lib/services/status.service.d.ts +31 -31
- package/lib/services/summary-budget.service.d.ts +11 -11
- package/lib/services/survey-metadata.service.d.ts +13 -13
- package/lib/services/survey-queue.service.d.ts +12 -12
- package/lib/services/survey.service.d.ts +17 -17
- package/lib/services/tasa.cambio.service.d.ts +14 -14
- package/lib/services/token-transformation.service.d.ts +19 -19
- package/lib/services/token.service.d.ts +270 -270
- package/lib/services/university.service.d.ts +28 -28
- package/lib/services/upload-documents.service.d.ts +21 -21
- package/lib/services/user.service.d.ts +12 -12
- package/lib/services/visualization-committee.service.d.ts +32 -32
- package/lib/utils/custom-validator.d.ts +19 -19
- package/lib/utils/form-util.d.ts +11 -11
- package/lib/utils/formio-util.d.ts +105 -105
- package/lib/utils/version-commons.d.ts +4 -4
- package/package.json +10 -16
- package/public-api.d.ts +210 -210
- package/version.d.ts +25 -25
- package/esm2020/lib/components/backoffice.commons.component.mjs +0 -40
- package/esm2020/lib/components/common.lists.component.mjs +0 -194
- package/esm2020/lib/components/configuration-token/configuration-token.component.mjs +0 -665
- package/esm2020/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
- package/esm2020/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
- package/esm2020/lib/components/configuration.commons.component.mjs +0 -40
- package/esm2020/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
- package/esm2020/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
- package/esm2020/lib/components/frontoffice.commons.component.mjs +0 -86
- package/esm2020/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
- package/esm2020/lib/components/pdf-generator/pdf-generator.component.mjs +0 -223
- package/esm2020/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
- package/esm2020/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
- package/esm2020/lib/components/progress-bar/progress-bar.component.mjs +0 -92
- package/esm2020/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
- package/esm2020/lib/components/select-ppp/select-ppp.component.mjs +0 -199
- package/esm2020/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
- package/esm2020/lib/components/token/token.component.mjs +0 -1006
- package/esm2020/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
- package/esm2020/lib/ng-pli-commons.module.mjs +0 -390
- package/esm2020/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
- package/esm2020/lib/pipes/thousands.pipe.mjs +0 -60
- package/esm2020/lib/services/authentication.service.mjs +0 -133
- package/esm2020/lib/services/budget-application.service.mjs +0 -265
- package/esm2020/lib/services/budget.service.mjs +0 -205
- package/esm2020/lib/services/common.service.mjs +0 -291
- package/esm2020/lib/services/configuration-document.service.mjs +0 -297
- package/esm2020/lib/services/documentary.type.service.mjs +0 -69
- package/esm2020/lib/services/file.service.mjs +0 -153
- package/esm2020/lib/services/guarantee.service.mjs +0 -128
- package/esm2020/lib/services/keys-assignation.service.mjs +0 -127
- package/esm2020/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
- package/esm2020/lib/services/ppp.service.mjs +0 -360
- package/esm2020/lib/services/progress-bar.service.mjs +0 -40
- package/esm2020/lib/services/segmentation-tokens.service.mjs +0 -43
- package/esm2020/lib/services/send-application.service.mjs +0 -492
- package/esm2020/lib/services/token.service.mjs +0 -1345
- package/esm2020/lib/services/upload-documents.service.mjs +0 -60
- package/esm2020/lib/utils/custom-validator.mjs +0 -95
- package/esm2020/lib/utils/form-util.mjs +0 -35
- package/esm2020/lib/utils/formio-util.mjs +0 -580
- package/fesm2015/ng-pli-commons.mjs +0 -17373
- package/fesm2015/ng-pli-commons.mjs.map +0 -1
- package/fesm2020/ng-pli-commons.mjs.map +0 -1
|
@@ -0,0 +1,1006 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { UtilString, ETipoPresupuesto, PliUsuario, AuthenticationUtil, DateUtil } from 'ng-pli-util';
|
|
3
|
+
import { TokenService } from '../../services/token.service';
|
|
4
|
+
import 'jquery';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "../../services/token.service";
|
|
8
|
+
import * as i3 from "ngx-toastr";
|
|
9
|
+
import * as i4 from "../../services/authentication.service";
|
|
10
|
+
export class TokenComponent {
|
|
11
|
+
constructor(currencyPipe, tokenService, toastrService, authenticationService) {
|
|
12
|
+
this.currencyPipe = currencyPipe;
|
|
13
|
+
this.tokenService = tokenService;
|
|
14
|
+
this.toastrService = toastrService;
|
|
15
|
+
this.authenticationService = authenticationService;
|
|
16
|
+
/** It notifies the html is generated*/
|
|
17
|
+
this.onGenerate = new EventEmitter();
|
|
18
|
+
/** It enables the visualization of destination */
|
|
19
|
+
this.enableDestination = false;
|
|
20
|
+
}
|
|
21
|
+
ngOnInit() {
|
|
22
|
+
this.lTokenCalculated = null;
|
|
23
|
+
this.lFormFieldsToken = null;
|
|
24
|
+
this.budgetDtoPrimary = null;
|
|
25
|
+
this.budgetDtoSecundary = null;
|
|
26
|
+
this.evaluation = null;
|
|
27
|
+
}
|
|
28
|
+
/** It manages the change of the every @Input */
|
|
29
|
+
ngOnChanges(changes) {
|
|
30
|
+
// Every time that input values change, call new verification code
|
|
31
|
+
this.uniqueVerificationCode = null;
|
|
32
|
+
const template = changes.template;
|
|
33
|
+
const data = changes.data;
|
|
34
|
+
if (template && template.currentValue) {
|
|
35
|
+
this.template = template.currentValue;
|
|
36
|
+
}
|
|
37
|
+
if (data && data.currentValue) {
|
|
38
|
+
this.data = data.currentValue;
|
|
39
|
+
this.promCodigo = this.data.promCodigo;
|
|
40
|
+
}
|
|
41
|
+
if (this.data) {
|
|
42
|
+
this.budgetDtoPrimary = this.data.budgetDtoPrimary ? this.data.budgetDtoPrimary : null;
|
|
43
|
+
this.budgetDtoSecundary = this.data.budgetDtoSecundary
|
|
44
|
+
? this.data.budgetDtoSecundary
|
|
45
|
+
: null;
|
|
46
|
+
this.evaluation = this.data.evaluation;
|
|
47
|
+
}
|
|
48
|
+
if (this.data && this.template && this.promCodigo) {
|
|
49
|
+
const self = this;
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
self.init();
|
|
52
|
+
}, 300);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** It initializes the process of translation */
|
|
56
|
+
init() {
|
|
57
|
+
this.translateTokens(this.template, this.data.dataFormByForm);
|
|
58
|
+
}
|
|
59
|
+
translateCategory(categoryName) {
|
|
60
|
+
const languageByDefault = 'en';
|
|
61
|
+
// If don't find the lang, get in en.
|
|
62
|
+
let categoryNameByDef = categoryName;
|
|
63
|
+
if (categoryName && this.data.categories && this.data.idioma) {
|
|
64
|
+
// If the locale select is es, this is the dafult category language
|
|
65
|
+
if (this.data.idioma.locale === 'es') {
|
|
66
|
+
return categoryName;
|
|
67
|
+
}
|
|
68
|
+
for (const category of this.data.categories) {
|
|
69
|
+
if (category.listaRubroIdioma && category.rubRubro === categoryName) {
|
|
70
|
+
for (const language of category.listaRubroIdioma) {
|
|
71
|
+
if (language.rubiIdioma === this.data.idioma.locale) {
|
|
72
|
+
return language.rubiTraduccion;
|
|
73
|
+
}
|
|
74
|
+
if (language.rubiIdioma === languageByDefault) {
|
|
75
|
+
categoryNameByDef = language.rubiTraduccion;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return categoryNameByDef;
|
|
83
|
+
}
|
|
84
|
+
translateTokens(html, listData) {
|
|
85
|
+
this.alreadyCallReplaceTokens = false;
|
|
86
|
+
const lTokens = this.getListTokens(html);
|
|
87
|
+
if (!lTokens || Object.keys(lTokens).length === 0) {
|
|
88
|
+
this.template = html;
|
|
89
|
+
}
|
|
90
|
+
this.callListTokens(lTokens, html, listData);
|
|
91
|
+
}
|
|
92
|
+
callListTokens(lTokens, html, listData) {
|
|
93
|
+
if (lTokens[TokenService.TOKEN_LABEL_CALCULATED] &&
|
|
94
|
+
Object.keys(lTokens[TokenService.TOKEN_LABEL_CALCULATED]).length > 0) {
|
|
95
|
+
if (this.lTokenCalculated) {
|
|
96
|
+
this.validateListTokens(lTokens, html, listData);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.tokenService.getListByPromCodigo(this.promCodigo).subscribe((lTokenCalculated) => {
|
|
100
|
+
this.lTokenCalculated = lTokenCalculated;
|
|
101
|
+
this.validateListTokens(lTokens, html, listData);
|
|
102
|
+
}, (error) => {
|
|
103
|
+
console.error('Error callListTokens -getListByPromCodigo', error);
|
|
104
|
+
this.toastrService.error('Error generando carta');
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.validateListTokens(lTokens, html, listData);
|
|
110
|
+
}
|
|
111
|
+
if (lTokens[TokenService.TOKEN_LABEL_FORM] &&
|
|
112
|
+
Object.keys(lTokens[TokenService.TOKEN_LABEL_FORM]).length > 0) {
|
|
113
|
+
if (this.lFormFieldsToken) {
|
|
114
|
+
this.validateListTokens(lTokens, html, listData);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
this.tokenService.getFormFieldsByPromCode(this.promCodigo).then((lFormFieldsToken) => {
|
|
118
|
+
this.lFormFieldsToken = lFormFieldsToken;
|
|
119
|
+
this.validateListTokens(lTokens, html, listData);
|
|
120
|
+
}, (error) => {
|
|
121
|
+
console.error('Error callListTokens -getFormFieldsByPromCode', error);
|
|
122
|
+
this.toastrService.error('Error generando carta');
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
this.validateListTokens(lTokens, html, listData);
|
|
128
|
+
}
|
|
129
|
+
if (lTokens[TokenService.TOKEN_LABEL_STATIC] &&
|
|
130
|
+
Object.keys(lTokens[TokenService.TOKEN_LABEL_STATIC]).length > 0) {
|
|
131
|
+
if (this.uniqueVerificationCode !== null) {
|
|
132
|
+
this.validateListTokens(lTokens, html, listData);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const tokenVerificationCode = lTokens[TokenService.TOKEN_LABEL_STATIC].find((token) => {
|
|
136
|
+
const subToken = token.key
|
|
137
|
+
.replace('{', '')
|
|
138
|
+
.replace('}', '')
|
|
139
|
+
.split('_');
|
|
140
|
+
return (subToken[1].toLowerCase() ==
|
|
141
|
+
TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION.toLowerCase());
|
|
142
|
+
});
|
|
143
|
+
// Only if the static token is the unique verification code
|
|
144
|
+
if (tokenVerificationCode && Object.keys(tokenVerificationCode).length > 0) {
|
|
145
|
+
let pliUsuarioObject = AuthenticationUtil.getPliUsuario();
|
|
146
|
+
if (!pliUsuarioObject) {
|
|
147
|
+
this.uniqueVerificationCode = '';
|
|
148
|
+
console.error('No se logro consultar el usuario para consultar el token', pliUsuarioObject);
|
|
149
|
+
this.validateListTokens(lTokens, html, listData);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const pliUsuario = Object.assign(new PliUsuario(), JSON.parse(JSON.stringify(pliUsuarioObject)));
|
|
153
|
+
this.authenticationService.getTokenByLogin(pliUsuario.usuLogin).subscribe((sesion) => {
|
|
154
|
+
// Try to get the unique verification code with the default value of sesion if is not a valid value
|
|
155
|
+
const sesionValue = sesion ? sesion.sesion : '1';
|
|
156
|
+
this.getUniqueVerificationCode(pliUsuario.usuLogin, sesionValue, lTokens, html, listData);
|
|
157
|
+
}, (error) => {
|
|
158
|
+
console.error('Error consultando el login en PLIS, getTokenByLogin', error);
|
|
159
|
+
// Try to get the unique verification code with the default value of sesion
|
|
160
|
+
this.getUniqueVerificationCode(pliUsuario.usuLogin, '1', lTokens, html, listData);
|
|
161
|
+
//this.toastrService.error("Error generando carta");
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.uniqueVerificationCode = '';
|
|
167
|
+
this.validateListTokens(lTokens, html, listData);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.validateListTokens(lTokens, html, listData);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get the unique verification code and call validateListTokens method
|
|
177
|
+
*/
|
|
178
|
+
getUniqueVerificationCode(usuLogin, sesion, lTokens, html, listData) {
|
|
179
|
+
this.tokenService.getUniqueVerificationCode(usuLogin, sesion).subscribe((uniqueCodeValue) => {
|
|
180
|
+
const uniqueCode = uniqueCodeValue.codigoUnico;
|
|
181
|
+
this.uniqueVerificationCode =
|
|
182
|
+
uniqueCode.substring(0, 4) + ' ' + uniqueCode.substring(4, 8);
|
|
183
|
+
this.validateListTokens(lTokens, html, listData);
|
|
184
|
+
}, (error) => {
|
|
185
|
+
console.error('Error callListTokens -getListByPromCodigo', error);
|
|
186
|
+
this.toastrService.error('Error generando carta');
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
validateListTokens(lTokens, html, listData) {
|
|
190
|
+
let finishLoadListForm = false;
|
|
191
|
+
let finishLoadListCalculated = false;
|
|
192
|
+
let finishLoadListStatic = false;
|
|
193
|
+
const finishLoadListBudget = true;
|
|
194
|
+
if (lTokens[TokenService.TOKEN_LABEL_FORM] &&
|
|
195
|
+
lTokens[TokenService.TOKEN_LABEL_FORM].length > 0) {
|
|
196
|
+
finishLoadListForm = this.lFormFieldsToken ? true : false;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
finishLoadListForm = true;
|
|
200
|
+
}
|
|
201
|
+
if (lTokens[TokenService.TOKEN_LABEL_CALCULATED] &&
|
|
202
|
+
lTokens[TokenService.TOKEN_LABEL_CALCULATED].length > 0) {
|
|
203
|
+
finishLoadListCalculated = this.lTokenCalculated ? true : false;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
finishLoadListCalculated = true;
|
|
207
|
+
}
|
|
208
|
+
if (lTokens[TokenService.TOKEN_LABEL_STATIC] &&
|
|
209
|
+
lTokens[TokenService.TOKEN_LABEL_STATIC].length > 0) {
|
|
210
|
+
finishLoadListStatic = this.uniqueVerificationCode !== null ? true : false;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
finishLoadListStatic = true;
|
|
214
|
+
}
|
|
215
|
+
if (finishLoadListForm &&
|
|
216
|
+
finishLoadListBudget &&
|
|
217
|
+
finishLoadListStatic &&
|
|
218
|
+
finishLoadListCalculated &&
|
|
219
|
+
!this.alreadyCallReplaceTokens) {
|
|
220
|
+
this.alreadyCallReplaceTokens = true;
|
|
221
|
+
this.replaceTokensWithData(lTokens, html, listData);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
replaceTokensWithData(lTokens, html, listData) {
|
|
225
|
+
const lDataOrg = [];
|
|
226
|
+
const lFormFieldsTokenOrg = [];
|
|
227
|
+
if ((lTokens[TokenService.TOKEN_LABEL_FORM] ||
|
|
228
|
+
lTokens[TokenService.TOKEN_LABEL_CALCULATED]) &&
|
|
229
|
+
listData) {
|
|
230
|
+
for (const dataForm in listData) {
|
|
231
|
+
lDataOrg[dataForm.toLowerCase()] = listData[dataForm];
|
|
232
|
+
}
|
|
233
|
+
if (this.lFormFieldsToken) {
|
|
234
|
+
for (const formFieldToken of this.lFormFieldsToken) {
|
|
235
|
+
for (const valuesField of formFieldToken.value) {
|
|
236
|
+
const keyToken = '${' + formFieldToken.title.key + '_' + valuesField.key + '}';
|
|
237
|
+
lFormFieldsTokenOrg[keyToken] = valuesField;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const lTokensCalculated = [];
|
|
243
|
+
if (lTokens[TokenService.TOKEN_LABEL_CALCULATED]) {
|
|
244
|
+
if (this.lTokenCalculated) {
|
|
245
|
+
for (const tokenCal of this.lTokenCalculated) {
|
|
246
|
+
lTokensCalculated[UtilString.replaceAccentSpacesOthers(tokenCal.name)] =
|
|
247
|
+
tokenCal;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
let typeToken;
|
|
252
|
+
const tokenTypeTranslated = [];
|
|
253
|
+
for (typeToken in lTokens) {
|
|
254
|
+
if (!lTokens[typeToken]) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const tokensType = lTokens[typeToken];
|
|
258
|
+
tokenTypeTranslated[typeToken] = [];
|
|
259
|
+
for (const token of tokensType) {
|
|
260
|
+
let tokenTranslated = null;
|
|
261
|
+
const subToken = token.key.replace('{', '').replace('}', '').split('_');
|
|
262
|
+
switch (typeToken) {
|
|
263
|
+
case TokenService.TOKEN_LABEL_FORM: // Form
|
|
264
|
+
let valueData = null;
|
|
265
|
+
const dataOrgKey = subToken[1].toLowerCase();
|
|
266
|
+
// Put this key because there no other way to differentiate the same key in differents forms
|
|
267
|
+
const dataOrgKeyByForm = subToken[0].substring(1) + '_' + subToken[1].toLowerCase();
|
|
268
|
+
const dataOrgValue = lDataOrg.hasOwnProperty(dataOrgKey)
|
|
269
|
+
? lDataOrg[dataOrgKey]
|
|
270
|
+
: lDataOrg.hasOwnProperty(dataOrgKeyByForm)
|
|
271
|
+
? lDataOrg[dataOrgKeyByForm]
|
|
272
|
+
: null;
|
|
273
|
+
// const dataOrgValueByForm = lDataOrg[dataOrgKeyByForm];
|
|
274
|
+
if (subToken.length === 3 &&
|
|
275
|
+
typeof dataOrgValue !== 'undefined' &&
|
|
276
|
+
dataOrgValue !== null &&
|
|
277
|
+
dataOrgValue.hasOwnProperty(subToken[2])) {
|
|
278
|
+
valueData = dataOrgValue[subToken[2]];
|
|
279
|
+
}
|
|
280
|
+
else if (subToken.length === 2 &&
|
|
281
|
+
typeof dataOrgValue !== 'undefined' &&
|
|
282
|
+
dataOrgValue !== null) {
|
|
283
|
+
valueData = dataOrgValue;
|
|
284
|
+
if (lFormFieldsTokenOrg[token.key]) {
|
|
285
|
+
valueData = this.tokenService.getValueFromFormField(lFormFieldsTokenOrg[token.key], valueData);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
valueData = valueData ? valueData : '';
|
|
289
|
+
tokenTranslated = valueData;
|
|
290
|
+
html = this.tokenService.replaceToken(html, token.value, valueData);
|
|
291
|
+
break;
|
|
292
|
+
case TokenService.TOKEN_LABEL_BUDGET: //Budget
|
|
293
|
+
const budgetResolveToken = this.resolveBudgetToken(html, token, subToken);
|
|
294
|
+
html = budgetResolveToken.html;
|
|
295
|
+
tokenTranslated = budgetResolveToken.value;
|
|
296
|
+
break;
|
|
297
|
+
case TokenService.TOKEN_LABEL_TASKL: //Task
|
|
298
|
+
const taskResolveToken = this.resolveTaskoken(html, token, subToken);
|
|
299
|
+
html = taskResolveToken.html;
|
|
300
|
+
tokenTranslated = taskResolveToken.value;
|
|
301
|
+
break;
|
|
302
|
+
case TokenService.TOKEN_LABEL_STATIC: //Static
|
|
303
|
+
const staticResolveToken = this.resolveStaticToken(html, token, subToken);
|
|
304
|
+
html = staticResolveToken.html;
|
|
305
|
+
tokenTranslated = staticResolveToken.value;
|
|
306
|
+
break;
|
|
307
|
+
case TokenService.TOKEN_LABEL_CALCULATED: //Calculated
|
|
308
|
+
// Replaces de tokens of the formula
|
|
309
|
+
const tokenName = lTokensCalculated[subToken[1]].name;
|
|
310
|
+
let formula = lTokensCalculated[subToken[1]].formula;
|
|
311
|
+
try {
|
|
312
|
+
//AQUI
|
|
313
|
+
formula = this.tokenService.replaceTokensFromListObject(tokenName, formula, lDataOrg);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
formula = null;
|
|
317
|
+
console.error(error.error ? error.error : error);
|
|
318
|
+
this.toastrService.warning(error.message, error.tittle);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
// Try to evaluate the formula
|
|
322
|
+
let result = null;
|
|
323
|
+
if (formula !== null) {
|
|
324
|
+
try {
|
|
325
|
+
result = formula.startsWith('file://')
|
|
326
|
+
? "<img width='250px' height='auto' src='" + formula + "'/>"
|
|
327
|
+
: eval(formula);
|
|
328
|
+
}
|
|
329
|
+
catch (e) {
|
|
330
|
+
console.error('Error evaluating the formula.', lTokensCalculated, subToken, e);
|
|
331
|
+
this.toastrService.error('No se logro evaluar la formular del token ' + tokenName, 'Error!');
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
if (result !== null) {
|
|
335
|
+
html = this.tokenService.replaceToken(html, token.value, result);
|
|
336
|
+
tokenTranslated = result;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
tokenTypeTranslated[typeToken][token.key] = tokenTranslated;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
this.onGenerate.emit({
|
|
345
|
+
html: html,
|
|
346
|
+
tokenTypeTranslated: tokenTypeTranslated
|
|
347
|
+
});
|
|
348
|
+
// }
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Try to find the budget info to translate the token.
|
|
352
|
+
* @param html
|
|
353
|
+
* @param token
|
|
354
|
+
* @param subToken
|
|
355
|
+
*/
|
|
356
|
+
resolveBudgetToken(html, token, subToken) {
|
|
357
|
+
let tpresCodigo = Number(subToken[1]);
|
|
358
|
+
let tokenValue = subToken[2];
|
|
359
|
+
let budgetDto = null;
|
|
360
|
+
let idTotalBudget = null;
|
|
361
|
+
if (this.budgetDtoPrimary &&
|
|
362
|
+
this.budgetDtoPrimary.budget &&
|
|
363
|
+
tpresCodigo == ETipoPresupuesto.PRIMARY) {
|
|
364
|
+
budgetDto = this.budgetDtoPrimary;
|
|
365
|
+
idTotalBudget = 'pli-token-principal-budget-total-summary';
|
|
366
|
+
}
|
|
367
|
+
else if (this.budgetDtoSecundary &&
|
|
368
|
+
this.budgetDtoSecundary.budget &&
|
|
369
|
+
tpresCodigo == ETipoPresupuesto.SECONDARY) {
|
|
370
|
+
budgetDto = this.budgetDtoSecundary;
|
|
371
|
+
idTotalBudget = 'pli-token-secundary-budget-total-summary';
|
|
372
|
+
}
|
|
373
|
+
if (budgetDto === null || !budgetDto.budget) {
|
|
374
|
+
console.error('No se logro encontrar el presupuesto del token.', token, this.budgetDtoPrimary, this.budgetDtoSecundary);
|
|
375
|
+
return {
|
|
376
|
+
html: html,
|
|
377
|
+
value: null
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
let valueData = null;
|
|
381
|
+
const applicationProcess = tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT ||
|
|
382
|
+
tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS ||
|
|
383
|
+
tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING;
|
|
384
|
+
const legalizationProcess = tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT ||
|
|
385
|
+
tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS ||
|
|
386
|
+
tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING;
|
|
387
|
+
if (tokenValue == TokenService.BUDGET_TOKENS_KEY_TOTAL_AMOUNT) {
|
|
388
|
+
valueData =
|
|
389
|
+
budgetDto.budget && budgetDto.budget.summary
|
|
390
|
+
? this.currencyPipe.transform(budgetDto.budget.summary.budgetTotal, 'default', '', '1.0-0')
|
|
391
|
+
: 0;
|
|
392
|
+
}
|
|
393
|
+
else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_RESUME_CATEGORY_YEAR) {
|
|
394
|
+
// this.addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto);
|
|
395
|
+
this.addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto);
|
|
396
|
+
const pliTokenTotalBudget = document.getElementById(idTotalBudget);
|
|
397
|
+
if (pliTokenTotalBudget) {
|
|
398
|
+
valueData = this.removeCommentsHtml(pliTokenTotalBudget.innerHTML);
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
console.log('pliTokenTotalBudget - NULL', pliTokenTotalBudget);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_FECHA_FINANCING_START) {
|
|
405
|
+
valueData =
|
|
406
|
+
budgetDto.budget && budgetDto.budget.financingStart
|
|
407
|
+
? budgetDto.budget.financingStart
|
|
408
|
+
: '';
|
|
409
|
+
html = this.tokenService.replaceToken(html, token.value, valueData, this.data?.idioma?.locale);
|
|
410
|
+
}
|
|
411
|
+
else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_FECHA_FINANCING_END) {
|
|
412
|
+
valueData =
|
|
413
|
+
budgetDto.budget && budgetDto.budget.financingEnd
|
|
414
|
+
? budgetDto.budget.financingEnd
|
|
415
|
+
: '';
|
|
416
|
+
html = this.tokenService.replaceToken(html, token.value, valueData, this.data?.idioma?.locale);
|
|
417
|
+
}
|
|
418
|
+
else if (tokenValue == TokenService.BUDGET_TOKENS_DURATION_STUDIES) {
|
|
419
|
+
valueData =
|
|
420
|
+
budgetDto.budget && budgetDto.budget.studyStart && budgetDto.budget.studyEnd
|
|
421
|
+
? DateUtil.elapsedMonths(budgetDto.budget.studyStart, budgetDto.budget.studyEnd) + 1
|
|
422
|
+
: '';
|
|
423
|
+
}
|
|
424
|
+
else if (tokenValue == TokenService.BUDGET_TOKENS_FINANCING_DURATION) {
|
|
425
|
+
valueData =
|
|
426
|
+
budgetDto.budget && budgetDto.budget.financingEnd && budgetDto.budget.financingStart
|
|
427
|
+
? DateUtil.elapsedMonths(budgetDto.budget.financingStart, budgetDto.budget.financingEnd) + 1
|
|
428
|
+
: '';
|
|
429
|
+
}
|
|
430
|
+
else if (tokenValue == TokenService.LEGALIZATION_OR_APPLICATION_TOTAL_FINANCING) {
|
|
431
|
+
// JMP - Mantis 6674 - Add logic to legalization or application total financing
|
|
432
|
+
if (this.data &&
|
|
433
|
+
this.data.dataFormApplication &&
|
|
434
|
+
this.data.dataFormApplication.budget) {
|
|
435
|
+
const budget = this.data.dataFormApplication.budget;
|
|
436
|
+
if (budget.legalizationProcess && budget.legalizationProcess.totalFinancing) {
|
|
437
|
+
const totalFinancing = Number(budget.legalizationProcess.totalFinancing);
|
|
438
|
+
valueData = totalFinancing * 1.003;
|
|
439
|
+
}
|
|
440
|
+
else if (budget.applicationProcess && budget.applicationProcess.totalFinancing) {
|
|
441
|
+
valueData = Number(budget.applicationProcess.totalFinancing);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
else if ((applicationProcess || legalizationProcess) &&
|
|
446
|
+
this.data &&
|
|
447
|
+
this.data.dataFormApplication &&
|
|
448
|
+
this.data.dataFormApplication.budget) {
|
|
449
|
+
// Get the total budget amount depend of the process
|
|
450
|
+
const appBudgetTotal = applicationProcess
|
|
451
|
+
? this.data.dataFormApplication.budget.applicationProcess
|
|
452
|
+
: this.data.dataFormApplication.budget.legalizationProcess;
|
|
453
|
+
if (appBudgetTotal != undefined && appBudgetTotal != null) {
|
|
454
|
+
// no matter the process, the class is the same
|
|
455
|
+
switch (tokenValue) {
|
|
456
|
+
case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT:
|
|
457
|
+
case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT:
|
|
458
|
+
valueData = appBudgetTotal.totalAmount;
|
|
459
|
+
break;
|
|
460
|
+
case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS:
|
|
461
|
+
case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS:
|
|
462
|
+
valueData = appBudgetTotal.totalOwnFunds;
|
|
463
|
+
break;
|
|
464
|
+
case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING:
|
|
465
|
+
case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING:
|
|
466
|
+
valueData = appBudgetTotal.totalFinancing;
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_INSURANCE_AMOUNT) {
|
|
472
|
+
let totalFinancing = this.data.dataFormApplication.budget.legalizationProcess &&
|
|
473
|
+
this.data.dataFormApplication.budget.legalizationProcess.totalFinancing;
|
|
474
|
+
totalFinancing =
|
|
475
|
+
totalFinancing == undefined || totalFinancing == null ? 0 : Number(totalFinancing);
|
|
476
|
+
// let totalInsuranceAmount = this.data.dataFormApplication.totalInsuranceAmount;
|
|
477
|
+
// totalInsuranceAmount =
|
|
478
|
+
// totalInsuranceAmount == undefined || totalInsuranceAmount == null
|
|
479
|
+
// ? 0
|
|
480
|
+
// : Number(totalInsuranceAmount);
|
|
481
|
+
valueData = totalFinancing * 1.003;
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
// When the token can't be resolve
|
|
485
|
+
console.error('resolveBudgetToken -No se logro resolver el token de tipo presupuesto');
|
|
486
|
+
}
|
|
487
|
+
valueData = valueData === null ? '' : valueData;
|
|
488
|
+
html = this.tokenService.replaceToken(html, token.value, valueData);
|
|
489
|
+
return {
|
|
490
|
+
html: html,
|
|
491
|
+
value: valueData
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
resolveTaskoken(html, token, subToken) {
|
|
495
|
+
let valueTask = null;
|
|
496
|
+
if (subToken.length > 2) {
|
|
497
|
+
let taskId = Number(subToken[2]);
|
|
498
|
+
let task = this.evaluation.tasks.find((t) => t.idTask == taskId);
|
|
499
|
+
valueTask = task.result;
|
|
500
|
+
}
|
|
501
|
+
html = this.tokenService.replaceToken(html, token.value, valueTask);
|
|
502
|
+
return {
|
|
503
|
+
html: html,
|
|
504
|
+
value: valueTask
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
resolveStaticToken(html, token, subToken) {
|
|
508
|
+
let valueReplace = null;
|
|
509
|
+
if (subToken[1].toLowerCase() ==
|
|
510
|
+
TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION.toLowerCase()) {
|
|
511
|
+
valueReplace = this.uniqueVerificationCode;
|
|
512
|
+
html = this.tokenService.replaceToken(html, token.value, this.uniqueVerificationCode);
|
|
513
|
+
}
|
|
514
|
+
else if (subToken[1].toLowerCase() ==
|
|
515
|
+
TokenService.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO.toLowerCase()) {
|
|
516
|
+
// if (this.data.dataDestination) {
|
|
517
|
+
html = this.resolveStaticTokensKeyAQuienVaDirigido(html, token.value);
|
|
518
|
+
valueReplace = '';
|
|
519
|
+
// }
|
|
520
|
+
}
|
|
521
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_LETTER_SIGN.toLowerCase()) {
|
|
522
|
+
html = this.resolveStaticTokensKeySign(html, token.value, subToken);
|
|
523
|
+
valueReplace = '';
|
|
524
|
+
}
|
|
525
|
+
else if (subToken[1].toLowerCase() ==
|
|
526
|
+
TokenService.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO.toLowerCase()) {
|
|
527
|
+
// if (this.data.dataDestination) {
|
|
528
|
+
html = this.resolveStaticTokensKeySaludoComplementario(html, token.value);
|
|
529
|
+
valueReplace = '';
|
|
530
|
+
// }
|
|
531
|
+
}
|
|
532
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_FECHA_ACTUAL.toLowerCase()) {
|
|
533
|
+
valueReplace = new Date();
|
|
534
|
+
html = this.tokenService.replaceToken(html, token.value, new Date());
|
|
535
|
+
}
|
|
536
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PATROCINADOR.toLowerCase()) {
|
|
537
|
+
const patNombre = this.data.pliPromocion &&
|
|
538
|
+
this.data.pliPromocion.pliPrograma &&
|
|
539
|
+
this.data.pliPromocion.pliPrograma.pliPatrocinador
|
|
540
|
+
? this.data.pliPromocion.pliPrograma.pliPatrocinador.patNombre
|
|
541
|
+
: '';
|
|
542
|
+
valueReplace = patNombre;
|
|
543
|
+
html = this.tokenService.replaceToken(html, token.value, patNombre);
|
|
544
|
+
}
|
|
545
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PROGRAMA.toLowerCase()) {
|
|
546
|
+
const progNombre = this.data.pliPromocion && this.data.pliPromocion.pliPrograma
|
|
547
|
+
? this.data.pliPromocion.pliPrograma.progNombre
|
|
548
|
+
: '';
|
|
549
|
+
valueReplace = progNombre;
|
|
550
|
+
html = this.tokenService.replaceToken(html, token.value, progNombre);
|
|
551
|
+
}
|
|
552
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PROMOCION.toLowerCase()) {
|
|
553
|
+
const promNombre = this.data.pliPromocion ? this.data.pliPromocion.promNombre : '';
|
|
554
|
+
valueReplace = promNombre;
|
|
555
|
+
html = this.tokenService.replaceToken(html, token.value, promNombre);
|
|
556
|
+
}
|
|
557
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_ANIO_PROMOCION.toLowerCase()) {
|
|
558
|
+
const anioPromocion = this.data.pliPromocion && this.data.pliPromocion.promAnio
|
|
559
|
+
? this.data.pliPromocion.promAnio
|
|
560
|
+
: 0;
|
|
561
|
+
valueReplace = anioPromocion;
|
|
562
|
+
html = this.tokenService.replaceToken(html, token.value, anioPromocion);
|
|
563
|
+
}
|
|
564
|
+
else if (subToken[1].toLowerCase() ==
|
|
565
|
+
TokenService.STATIC_TOKENS_KEY_ISO_MONEDA_BASE.toLowerCase()) {
|
|
566
|
+
const baseCurrency = this.data.budgetDtoPrimary && this.data.budgetDtoPrimary.budget
|
|
567
|
+
? this.data.budgetDtoPrimary.budget.baseCurrency
|
|
568
|
+
: this.data.budgetDtoSecundary && this.data.budgetDtoSecundary.budget
|
|
569
|
+
? this.data.budgetDtoSecundary.budget.baseCurrency
|
|
570
|
+
: '';
|
|
571
|
+
valueReplace = baseCurrency;
|
|
572
|
+
html = this.tokenService.replaceToken(html, token.value, baseCurrency);
|
|
573
|
+
}
|
|
574
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_STATUS_NAME.toLowerCase()) {
|
|
575
|
+
const statusName = this.data.dataFormApplication &&
|
|
576
|
+
UtilString.isValid(this.data.dataFormApplication.stateName)
|
|
577
|
+
? this.data.dataFormApplication.stateName
|
|
578
|
+
: '';
|
|
579
|
+
valueReplace = statusName;
|
|
580
|
+
html = this.tokenService.replaceToken(html, token.value, statusName);
|
|
581
|
+
}
|
|
582
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_USER_INITIALS.toLowerCase()) {
|
|
583
|
+
const pliUser = AuthenticationUtil.getPliUser();
|
|
584
|
+
valueReplace = UtilString.initialLetters(pliUser.firstname + ' ' + pliUser.lastname);
|
|
585
|
+
html = this.tokenService.replaceToken(html, token.value, valueReplace);
|
|
586
|
+
}
|
|
587
|
+
else if (subToken[1].toLowerCase() ==
|
|
588
|
+
TokenService.STATIC_TOKENS_KEY_NUMBER_APPLICATION.toLowerCase()) {
|
|
589
|
+
const number = this.data.dataFormApplication && this.data.dataFormApplication.number
|
|
590
|
+
? this.data.dataFormApplication.number
|
|
591
|
+
: null;
|
|
592
|
+
valueReplace = number;
|
|
593
|
+
html = this.tokenService.replaceToken(html, token.value, number);
|
|
594
|
+
}
|
|
595
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_COMMITTEE_NAME.toLowerCase()) {
|
|
596
|
+
const comiteNombre = this.data.dataFormByForm && this.data.dataFormByForm.comiteNombre
|
|
597
|
+
? this.data.dataFormByForm.comiteNombre
|
|
598
|
+
: null;
|
|
599
|
+
valueReplace = comiteNombre;
|
|
600
|
+
html = this.tokenService.replaceToken(html, token.value, comiteNombre);
|
|
601
|
+
}
|
|
602
|
+
else if (subToken[1].toLowerCase() ==
|
|
603
|
+
TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION.toLowerCase()) {
|
|
604
|
+
const comiteSegmentacion = this.data.dataFormByForm &&
|
|
605
|
+
this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION]
|
|
606
|
+
? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION]
|
|
607
|
+
: null;
|
|
608
|
+
valueReplace = comiteSegmentacion;
|
|
609
|
+
html = this.tokenService.replaceToken(html, token.value, comiteSegmentacion);
|
|
610
|
+
}
|
|
611
|
+
else if (subToken[1].toLowerCase() ==
|
|
612
|
+
TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION.toLowerCase()) {
|
|
613
|
+
const comiteAgrupacion = this.data.dataFormByForm &&
|
|
614
|
+
this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION]
|
|
615
|
+
? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION]
|
|
616
|
+
: null;
|
|
617
|
+
valueReplace = comiteAgrupacion;
|
|
618
|
+
html = this.tokenService.replaceToken(html, token.value, comiteAgrupacion);
|
|
619
|
+
}
|
|
620
|
+
else if (subToken[1].toLowerCase() ==
|
|
621
|
+
TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE.toLowerCase()) {
|
|
622
|
+
let cutLineDate = this.data.dataFormByForm &&
|
|
623
|
+
this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE]
|
|
624
|
+
? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE]
|
|
625
|
+
: null;
|
|
626
|
+
if (cutLineDate instanceof Date) {
|
|
627
|
+
cutLineDate = cutLineDate.toString();
|
|
628
|
+
}
|
|
629
|
+
valueReplace = cutLineDate;
|
|
630
|
+
html = this.tokenService.replaceToken(html, token.value, cutLineDate);
|
|
631
|
+
}
|
|
632
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_TOTAL_WEIGHTED.toLowerCase()) {
|
|
633
|
+
let bestScenarioValue = '';
|
|
634
|
+
if (this.evaluation && this.evaluation.scenarios) {
|
|
635
|
+
let bestScenario = this.evaluation.scenarios.filter((s) => s.best)[0];
|
|
636
|
+
if (bestScenario) {
|
|
637
|
+
bestScenarioValue = bestScenario.result;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
html = this.tokenService.replaceToken(html, token.value, bestScenarioValue);
|
|
641
|
+
}
|
|
642
|
+
else if (subToken[1].toLowerCase() ==
|
|
643
|
+
TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY.toLowerCase()) {
|
|
644
|
+
const userTypeCreditStudy = this.data.dataFormByForm &&
|
|
645
|
+
this.data.dataFormByForm[TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY]
|
|
646
|
+
? this.data.dataFormByForm[TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY]
|
|
647
|
+
: null;
|
|
648
|
+
valueReplace = userTypeCreditStudy;
|
|
649
|
+
html = this.tokenService.replaceToken(html, token.value, userTypeCreditStudy);
|
|
650
|
+
}
|
|
651
|
+
else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_BEN_CODIGO.toLowerCase()) {
|
|
652
|
+
valueReplace = this.data.dataFormApplication.benCodigo;
|
|
653
|
+
html = this.tokenService.replaceToken(html, token.value, this.data.dataFormApplication.benCodigo);
|
|
654
|
+
}
|
|
655
|
+
else {
|
|
656
|
+
// Don't find the token
|
|
657
|
+
console.error('No se encontro el token', token);
|
|
658
|
+
html = this.tokenService.replaceToken(html, token.value, '');
|
|
659
|
+
}
|
|
660
|
+
return {
|
|
661
|
+
html: html,
|
|
662
|
+
value: valueReplace
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Find all the tokens present in the HTML text. Organize this tokens in four categories.
|
|
667
|
+
* @param html Text of the html
|
|
668
|
+
*/
|
|
669
|
+
getListTokens(html) {
|
|
670
|
+
// let strings: string[] = html.split(" ");
|
|
671
|
+
let tokens = this.tokenService.getListTokensByString(html);
|
|
672
|
+
let tokensCategory = [];
|
|
673
|
+
for (let infoToken of tokens) {
|
|
674
|
+
if (infoToken) {
|
|
675
|
+
const keyType = TokenService.getKeyType(infoToken.key.replace('{', '').replace('}', ''));
|
|
676
|
+
if (keyType) {
|
|
677
|
+
switch (keyType) {
|
|
678
|
+
case 1: // Form
|
|
679
|
+
if (!tokensCategory[TokenService.TOKEN_LABEL_FORM]) {
|
|
680
|
+
tokensCategory[TokenService.TOKEN_LABEL_FORM] = [];
|
|
681
|
+
}
|
|
682
|
+
tokensCategory[TokenService.TOKEN_LABEL_FORM].push(infoToken);
|
|
683
|
+
break;
|
|
684
|
+
case 2: //Budget
|
|
685
|
+
if (!tokensCategory[TokenService.TOKEN_LABEL_BUDGET]) {
|
|
686
|
+
tokensCategory[TokenService.TOKEN_LABEL_BUDGET] = [];
|
|
687
|
+
}
|
|
688
|
+
tokensCategory[TokenService.TOKEN_LABEL_BUDGET].push(infoToken);
|
|
689
|
+
break;
|
|
690
|
+
case 3: //Static
|
|
691
|
+
if (!tokensCategory[TokenService.TOKEN_LABEL_STATIC]) {
|
|
692
|
+
tokensCategory[TokenService.TOKEN_LABEL_STATIC] = [];
|
|
693
|
+
}
|
|
694
|
+
tokensCategory[TokenService.TOKEN_LABEL_STATIC].push(infoToken);
|
|
695
|
+
break;
|
|
696
|
+
case 4: //Calculated
|
|
697
|
+
if (!tokensCategory[TokenService.TOKEN_LABEL_CALCULATED]) {
|
|
698
|
+
tokensCategory[TokenService.TOKEN_LABEL_CALCULATED] = [];
|
|
699
|
+
}
|
|
700
|
+
tokensCategory[TokenService.TOKEN_LABEL_CALCULATED].push(infoToken);
|
|
701
|
+
break;
|
|
702
|
+
case 5: //Task
|
|
703
|
+
if (!tokensCategory[TokenService.TOKEN_LABEL_TASKL]) {
|
|
704
|
+
tokensCategory[TokenService.TOKEN_LABEL_TASKL] = [];
|
|
705
|
+
}
|
|
706
|
+
tokensCategory[TokenService.TOKEN_LABEL_TASKL].push(infoToken);
|
|
707
|
+
break;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
return tokensCategory;
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* It resolves the static token destination
|
|
716
|
+
* @param stringText
|
|
717
|
+
* @param token
|
|
718
|
+
* @param dataValue
|
|
719
|
+
*/
|
|
720
|
+
resolveStaticTokensKeyAQuienVaDirigido(stringText, tokenValue) {
|
|
721
|
+
// if (this.data.dataDestination) {
|
|
722
|
+
this.enableDestination = true;
|
|
723
|
+
this.addInfoTokenDestination();
|
|
724
|
+
const pliTokenDestination = document.getElementById('pli-token-destination');
|
|
725
|
+
let html = '';
|
|
726
|
+
if (pliTokenDestination && pliTokenDestination.innerHTML.length > 0) {
|
|
727
|
+
html = this.removeCommentsHtml(pliTokenDestination.innerHTML);
|
|
728
|
+
}
|
|
729
|
+
return this.tokenService.replaceToken(stringText, tokenValue, html);
|
|
730
|
+
// }
|
|
731
|
+
// return stringText;
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
*
|
|
735
|
+
*/
|
|
736
|
+
addInfoTokenDestination() {
|
|
737
|
+
let pliTokenDestination = $('#pli-token-destination');
|
|
738
|
+
pliTokenDestination.empty();
|
|
739
|
+
if (this.data.dataDestination) {
|
|
740
|
+
let destinationInfo = $('<div></div>');
|
|
741
|
+
if (this.data.dataDestination.text) {
|
|
742
|
+
let valueInfo = $('<div></div>').text(this.data.dataDestination.text);
|
|
743
|
+
destinationInfo.append(valueInfo);
|
|
744
|
+
}
|
|
745
|
+
if (this.data.dataDestination.title) {
|
|
746
|
+
let valueInfo = $('<div></div>').text(this.data.dataDestination.title);
|
|
747
|
+
destinationInfo.append(valueInfo);
|
|
748
|
+
}
|
|
749
|
+
if (this.data.dataDestination.name || this.data.dataDestination.lastName) {
|
|
750
|
+
let valueInfoName = this.data.dataDestination.name
|
|
751
|
+
? this.data.dataDestination.name + ' '
|
|
752
|
+
: '';
|
|
753
|
+
valueInfoName += this.data.dataDestination.lastName
|
|
754
|
+
? this.data.dataDestination.lastName
|
|
755
|
+
: '';
|
|
756
|
+
let valueInfo = $('<div></div>').append('<strong>' + valueInfoName + '</strong>');
|
|
757
|
+
destinationInfo.append(valueInfo);
|
|
758
|
+
}
|
|
759
|
+
if (this.data.dataDestination.cargo) {
|
|
760
|
+
let valueInfo = $('<div></div>').text(this.data.dataDestination.cargo);
|
|
761
|
+
destinationInfo.append(valueInfo);
|
|
762
|
+
}
|
|
763
|
+
if (this.data.dataDestination.occupation) {
|
|
764
|
+
let valueInfo = $('<div></div>').text(this.data.dataDestination.occupation);
|
|
765
|
+
destinationInfo.append(valueInfo);
|
|
766
|
+
}
|
|
767
|
+
if (this.data.dataDestination.company) {
|
|
768
|
+
let valueInfo = $('<div></div>').text(this.data.dataDestination.company);
|
|
769
|
+
destinationInfo.append(valueInfo);
|
|
770
|
+
}
|
|
771
|
+
if (this.data.dataDestination.address || this.data.dataDestination.addressDetails) {
|
|
772
|
+
let valueInfoName = this.data.dataDestination.address
|
|
773
|
+
? this.data.dataDestination.address + ' '
|
|
774
|
+
: '';
|
|
775
|
+
valueInfoName += this.data.dataDestination.addressDetails
|
|
776
|
+
? this.data.dataDestination.addressDetails
|
|
777
|
+
: '';
|
|
778
|
+
let valueInfo = $('<div></div>').text(valueInfoName);
|
|
779
|
+
destinationInfo.append(valueInfo);
|
|
780
|
+
}
|
|
781
|
+
if (this.data.dataDestination.city || this.data.dataDestination.country) {
|
|
782
|
+
let valueInfoName = this.data.dataDestination.city
|
|
783
|
+
? this.data.dataDestination.city
|
|
784
|
+
: '';
|
|
785
|
+
valueInfoName +=
|
|
786
|
+
this.data.dataDestination.city && this.data.dataDestination.country ? ', ' : '';
|
|
787
|
+
valueInfoName += this.data.dataDestination.country
|
|
788
|
+
? this.data.dataDestination.country
|
|
789
|
+
: '';
|
|
790
|
+
let valueInfo = $('<div></div>').text(valueInfoName);
|
|
791
|
+
destinationInfo.append(valueInfo);
|
|
792
|
+
}
|
|
793
|
+
pliTokenDestination.append(destinationInfo);
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* It resolves the static token destination
|
|
798
|
+
* @param stringText
|
|
799
|
+
* @param token
|
|
800
|
+
* @param dataValue
|
|
801
|
+
*/
|
|
802
|
+
resolveStaticTokensKeySaludoComplementario(stringText, tokenValue) {
|
|
803
|
+
// if (this.data.dataDestination) {
|
|
804
|
+
this.enableDestination = true;
|
|
805
|
+
this.addInfoTokenSaludoComplementario();
|
|
806
|
+
const pliTokenDestination = document.getElementById('pli-token-complementary-greeting');
|
|
807
|
+
let html = '';
|
|
808
|
+
if (pliTokenDestination) {
|
|
809
|
+
html = this.removeCommentsHtml(pliTokenDestination.innerHTML);
|
|
810
|
+
}
|
|
811
|
+
return this.tokenService.replaceToken(stringText, tokenValue, html);
|
|
812
|
+
// }
|
|
813
|
+
// return stringText;
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
*
|
|
817
|
+
*/
|
|
818
|
+
addInfoTokenSaludoComplementario() {
|
|
819
|
+
let pliTokenDestination = $('#pli-token-complementary-greeting');
|
|
820
|
+
pliTokenDestination.empty();
|
|
821
|
+
if (this.data.dataDestination) {
|
|
822
|
+
let destinationInfo = $('<div></div>');
|
|
823
|
+
if (this.data.dataDestination.greeting) {
|
|
824
|
+
destinationInfo.html(this.data.dataDestination.greeting);
|
|
825
|
+
}
|
|
826
|
+
if (this.data.dataDestination.title) {
|
|
827
|
+
const valueText = (destinationInfo.html().length == 0 ? '' : ' ') +
|
|
828
|
+
this.data.dataDestination.title;
|
|
829
|
+
destinationInfo.html(destinationInfo.html() + valueText);
|
|
830
|
+
}
|
|
831
|
+
if (this.data.dataDestination.lastName) {
|
|
832
|
+
let valueInfoName = this.data.dataDestination.lastName
|
|
833
|
+
? this.data.dataDestination.lastName
|
|
834
|
+
: '';
|
|
835
|
+
const valueText = (destinationInfo.html().length == 0 ? '' : ' ') +
|
|
836
|
+
'<strong>' +
|
|
837
|
+
valueInfoName +
|
|
838
|
+
'</strong>';
|
|
839
|
+
destinationInfo.html(destinationInfo.html() + valueText);
|
|
840
|
+
}
|
|
841
|
+
pliTokenDestination.append(destinationInfo);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
removeCommentsHtml(html) {
|
|
845
|
+
return html ? html.replace(/<!--[\s\S]*?-->/g, '') : html;
|
|
846
|
+
}
|
|
847
|
+
resolveStaticTokensKeySign(html, tokenValue, subToken) {
|
|
848
|
+
let container = $('<div></div>');
|
|
849
|
+
let img = $('<img id="' + TokenService.SIGN_LETTER_TAG_ID + '">');
|
|
850
|
+
img.attr('src', '');
|
|
851
|
+
if (subToken.length > 2) {
|
|
852
|
+
img.attr('width', subToken[2].toString());
|
|
853
|
+
}
|
|
854
|
+
if (subToken.length > 3) {
|
|
855
|
+
img.attr('height', subToken[3].toString());
|
|
856
|
+
}
|
|
857
|
+
if (subToken.length > 4) {
|
|
858
|
+
img.attr('name', subToken[4].toString());
|
|
859
|
+
}
|
|
860
|
+
container.append(img);
|
|
861
|
+
// return container.html();
|
|
862
|
+
return this.tokenService.replaceToken(html, tokenValue, container.html());
|
|
863
|
+
}
|
|
864
|
+
getRubroLabel() {
|
|
865
|
+
return this.data.idioma.locale === 'es'
|
|
866
|
+
? 'Rubro'
|
|
867
|
+
: this.data.idioma.locale === 'de'
|
|
868
|
+
? 'Posten'
|
|
869
|
+
: 'Item';
|
|
870
|
+
}
|
|
871
|
+
getTotalLabel() {
|
|
872
|
+
return this.data.idioma.locale === 'es'
|
|
873
|
+
? 'Total'
|
|
874
|
+
: this.data.idioma.locale === 'de'
|
|
875
|
+
? 'Gesamt'
|
|
876
|
+
: this.data.idioma.locale === 'fr'
|
|
877
|
+
? 'Total'
|
|
878
|
+
: this.data.idioma.locale === 'it'
|
|
879
|
+
? 'Totale'
|
|
880
|
+
: 'Item';
|
|
881
|
+
}
|
|
882
|
+
getYearLabel() {
|
|
883
|
+
return this.data.idioma.locale === 'es'
|
|
884
|
+
? 'Año'
|
|
885
|
+
: this.data.idioma.locale === 'de'
|
|
886
|
+
? 'Jahr'
|
|
887
|
+
: this.data.idioma.locale === 'fr'
|
|
888
|
+
? 'Année'
|
|
889
|
+
: this.data.idioma.locale === 'it'
|
|
890
|
+
? 'Anno'
|
|
891
|
+
: 'Year';
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
*
|
|
895
|
+
*/
|
|
896
|
+
addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto) {
|
|
897
|
+
if (tpresCodigo == ETipoPresupuesto.PRIMARY) {
|
|
898
|
+
}
|
|
899
|
+
else {
|
|
900
|
+
}
|
|
901
|
+
let resumeCategoryYearContent = $('#' + idTotalBudget);
|
|
902
|
+
resumeCategoryYearContent.empty();
|
|
903
|
+
if (budgetDto && budgetDto.budget && budgetDto.budget.summary) {
|
|
904
|
+
const summary = budgetDto.budget.summary;
|
|
905
|
+
const table = $('<table></table>');
|
|
906
|
+
table.css('border-spacing', '2px');
|
|
907
|
+
table.css('border-collapse', 'collapse');
|
|
908
|
+
//thead
|
|
909
|
+
const thead = $('<thead>').appendTo(table);
|
|
910
|
+
const thRubro = $('<th>', { html: this.getRubroLabel() }).appendTo(thead);
|
|
911
|
+
thRubro.css('text-align', 'center');
|
|
912
|
+
thRubro.css('border', '1px solid black');
|
|
913
|
+
thRubro.css('color', 'white');
|
|
914
|
+
thRubro.css('background-color', 'grey');
|
|
915
|
+
let iteracionAnio = 0;
|
|
916
|
+
for (const year of summary.years) {
|
|
917
|
+
const thYear = $('<th>', { html: this.getYearLabel() + ++iteracionAnio }).appendTo(thead);
|
|
918
|
+
thYear.css('text-align', 'center');
|
|
919
|
+
thYear.css('border', '1px solid black');
|
|
920
|
+
thYear.css('color', 'white');
|
|
921
|
+
thYear.css('background-color', 'grey');
|
|
922
|
+
thYear.css('width', '80px');
|
|
923
|
+
}
|
|
924
|
+
const totalLabel = ' ' + this.getTotalLabel() + summary.baseCurrency + ' ';
|
|
925
|
+
const thTotal = $('<th>', { html: totalLabel }).appendTo(thead);
|
|
926
|
+
thTotal.css('text-align', 'center');
|
|
927
|
+
thTotal.css('border', '1px solid black');
|
|
928
|
+
thTotal.css('color', 'white');
|
|
929
|
+
thTotal.css('background-color', 'grey');
|
|
930
|
+
thTotal.css('width', '80px');
|
|
931
|
+
//tbody
|
|
932
|
+
let tbody = $('<tbody>').appendTo(table);
|
|
933
|
+
for (let iCat = 0; iCat < summary.categories.length; iCat++) {
|
|
934
|
+
const tr = $('<tr>').appendTo(tbody);
|
|
935
|
+
const category = summary.categories[iCat];
|
|
936
|
+
const rubroLabel = ' ' +
|
|
937
|
+
this.translateCategory(category.category) +
|
|
938
|
+
' ';
|
|
939
|
+
const tdRubro = $('<td>', { html: rubroLabel }).appendTo(tr);
|
|
940
|
+
tdRubro.css('text-align', 'left');
|
|
941
|
+
tdRubro.css('border', '1px solid black');
|
|
942
|
+
tdRubro.css('font-weight', 'bold');
|
|
943
|
+
for (const year of category.years) {
|
|
944
|
+
const yearTotal = year.total == 0
|
|
945
|
+
? '-'
|
|
946
|
+
: this.currencyPipe.transform(year.total, 'default', '', '1.0-0');
|
|
947
|
+
const yearLabelTotal = ' ' + yearTotal + ' ';
|
|
948
|
+
const tdYear = $('<td>', { html: yearLabelTotal }).appendTo(tr);
|
|
949
|
+
tdYear.css('text-align', 'right');
|
|
950
|
+
tdYear.css('border', '1px solid black');
|
|
951
|
+
}
|
|
952
|
+
const categoryTotal = category.total == 0
|
|
953
|
+
? '-'
|
|
954
|
+
: this.currencyPipe.transform(category.total, 'default', '', '1.0-0');
|
|
955
|
+
const categoryLabelTotal = ' ' + categoryTotal + ' ';
|
|
956
|
+
const tdTotal = $('<td>', { html: categoryLabelTotal }).appendTo(tr);
|
|
957
|
+
tdTotal.css('text-align', 'right');
|
|
958
|
+
tdTotal.css('border', '1px solid black');
|
|
959
|
+
tdTotal.css('font-weight', 'bold');
|
|
960
|
+
}
|
|
961
|
+
const trFinal = $('<tr>').appendTo(tbody);
|
|
962
|
+
const baseCurrency = this.getTotalLabel() + ' ' + summary.baseCurrency + ' ';
|
|
963
|
+
const tdFinalTotalBC = $('<td>', { html: baseCurrency }).appendTo(trFinal);
|
|
964
|
+
tdFinalTotalBC.css('text-align', 'right');
|
|
965
|
+
tdFinalTotalBC.css('border', '1px solid black');
|
|
966
|
+
tdFinalTotalBC.css('color', 'white');
|
|
967
|
+
tdFinalTotalBC.css('background-color', 'grey');
|
|
968
|
+
let budgetTotal = 0;
|
|
969
|
+
for (const year of summary.years) {
|
|
970
|
+
const yearTotal = year.total == 0
|
|
971
|
+
? '-'
|
|
972
|
+
: this.currencyPipe.transform(year.total, 'default', '', '1.0-0');
|
|
973
|
+
const yearLabelTotal = yearTotal + ' ';
|
|
974
|
+
const tdYear = $('<td>', { html: yearLabelTotal }).appendTo(trFinal);
|
|
975
|
+
tdYear.css('text-align', 'right');
|
|
976
|
+
tdYear.css('border', '1px solid black');
|
|
977
|
+
tdYear.css('color', 'white');
|
|
978
|
+
tdYear.css('background-color', 'grey');
|
|
979
|
+
budgetTotal += year.total;
|
|
980
|
+
}
|
|
981
|
+
const totalBaseCurrency = budgetTotal == 0
|
|
982
|
+
? '-'
|
|
983
|
+
: this.currencyPipe.transform(budgetTotal, 'default', '', '1.0-0');
|
|
984
|
+
const totalLabelBaseCurrency = ' ' + totalBaseCurrency + ' ';
|
|
985
|
+
const tdFinalTotal = $('<td>', { html: totalLabelBaseCurrency }).appendTo(trFinal);
|
|
986
|
+
tdFinalTotal.css('text-align', 'right');
|
|
987
|
+
tdFinalTotal.css('border', '1px solid black');
|
|
988
|
+
tdFinalTotal.css('color', 'white');
|
|
989
|
+
tdFinalTotal.css('background-color', 'grey');
|
|
990
|
+
resumeCategoryYearContent.append(table);
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenComponent, deps: [{ token: i1.CurrencyPipe }, { token: i2.TokenService }, { token: i3.ToastrService }, { token: i4.AuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
994
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TokenComponent, selector: "pli-token", inputs: { template: "template", data: "data" }, outputs: { onGenerate: "onGenerate" }, usesOnChanges: true, ngImport: i0, template: "<div style=\"display: none;\" id=\"pli-token-destination\">\r\n\t<!-- <div *ngIf=\"data != undefined && data.dataDestination != undefined\">\r\n\r\n <div *ngIf=\"data.dataDestination.text != undefined\">\r\n {{data.dataDestination.text}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.title != undefined\">\r\n {{data.dataDestination.title}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.name != undefined || data.dataDestination.lastName != undefined\">\r\n <strong>{{data.dataDestination.name}} {{data.dataDestination.lastName}}</strong>\r\n </div>\r\n <div *ngIf=\"data.dataDestination.cargo != undefined\">\r\n {{data.dataDestination.cargo}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.occupation != undefined\">\r\n {{data.dataDestination.occupation}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.company != undefined\">\r\n {{data.dataDestination.company}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.address != undefined || data.dataDestination.addressDetails != undefined \">\r\n {{data.dataDestination.address}} {{data.dataDestination.addressDetails}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.city != undefined || data.dataDestination.country != undefined \">\r\n {{data.dataDestination.city}}<span *ngIf=\"data.dataDestination.city != undefined && data.dataDestination.country != undefined\">,</span>{{data.dataDestination.country}}\r\n </div>\r\n\r\n </div> -->\r\n</div>\r\n<!-- Complementary greeting-->\r\n<div style=\"display: none;\" id=\"pli-token-complementary-greeting\">\r\n\t<!-- <div\r\n\t\t*ngIf=\"\r\n\t\t\tdata != undefined &&\r\n\t\t\tdata.dataDestination != undefined &&\r\n\t\t\tdata.dataDestination.targetId == 2 &&\r\n\t\t\tdata.dataDestination.greeting != undefined\r\n\t\t\"\r\n\t>\r\n\t\t{{ data.dataDestination.greeting\r\n\t\t}}<span *ngIf=\"data.dataDestination.title != undefined\"\r\n\t\t\t> {{ data.dataDestination.title }}</span\r\n\t\t><span *ngIf=\"data.dataDestination.lastName != undefined\"\r\n\t\t\t> {{ data.dataDestination.lastName }}</span\r\n\t\t>:\r\n\t</div>-->\r\n</div>\r\n\r\n<!-- Primary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-principal-budget-total-summary\">\r\n\t<!-- <div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoPrimary !== null &&\r\n\t\t\t\tbudgetDtoPrimary.budget &&\r\n\t\t\t\tbudgetDtoPrimary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px;border-collapse: collapse;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width:80px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width: 110px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoPrimary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold;text-align: left;border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right;border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }}) \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoPrimary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoPrimary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div> -->\r\n</div>\r\n<!-- Secundary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-secundary-budget-total-summary\">\r\n\t<div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoSecundary !== null &&\r\n\t\t\t\tbudgetDtoSecundary.budget &&\r\n\t\t\t\tbudgetDtoSecundary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px; border-collapse: collapse; width: 100%;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 80px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 110px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoSecundary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: left; border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right; border: 1px solid black;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right; border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }}) \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoSecundary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoSecundary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }] }); }
|
|
995
|
+
}
|
|
996
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenComponent, decorators: [{
|
|
997
|
+
type: Component,
|
|
998
|
+
args: [{ selector: 'pli-token', template: "<div style=\"display: none;\" id=\"pli-token-destination\">\r\n\t<!-- <div *ngIf=\"data != undefined && data.dataDestination != undefined\">\r\n\r\n <div *ngIf=\"data.dataDestination.text != undefined\">\r\n {{data.dataDestination.text}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.title != undefined\">\r\n {{data.dataDestination.title}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.name != undefined || data.dataDestination.lastName != undefined\">\r\n <strong>{{data.dataDestination.name}} {{data.dataDestination.lastName}}</strong>\r\n </div>\r\n <div *ngIf=\"data.dataDestination.cargo != undefined\">\r\n {{data.dataDestination.cargo}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.occupation != undefined\">\r\n {{data.dataDestination.occupation}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.company != undefined\">\r\n {{data.dataDestination.company}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.address != undefined || data.dataDestination.addressDetails != undefined \">\r\n {{data.dataDestination.address}} {{data.dataDestination.addressDetails}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.city != undefined || data.dataDestination.country != undefined \">\r\n {{data.dataDestination.city}}<span *ngIf=\"data.dataDestination.city != undefined && data.dataDestination.country != undefined\">,</span>{{data.dataDestination.country}}\r\n </div>\r\n\r\n </div> -->\r\n</div>\r\n<!-- Complementary greeting-->\r\n<div style=\"display: none;\" id=\"pli-token-complementary-greeting\">\r\n\t<!-- <div\r\n\t\t*ngIf=\"\r\n\t\t\tdata != undefined &&\r\n\t\t\tdata.dataDestination != undefined &&\r\n\t\t\tdata.dataDestination.targetId == 2 &&\r\n\t\t\tdata.dataDestination.greeting != undefined\r\n\t\t\"\r\n\t>\r\n\t\t{{ data.dataDestination.greeting\r\n\t\t}}<span *ngIf=\"data.dataDestination.title != undefined\"\r\n\t\t\t> {{ data.dataDestination.title }}</span\r\n\t\t><span *ngIf=\"data.dataDestination.lastName != undefined\"\r\n\t\t\t> {{ data.dataDestination.lastName }}</span\r\n\t\t>:\r\n\t</div>-->\r\n</div>\r\n\r\n<!-- Primary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-principal-budget-total-summary\">\r\n\t<!-- <div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoPrimary !== null &&\r\n\t\t\t\tbudgetDtoPrimary.budget &&\r\n\t\t\t\tbudgetDtoPrimary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px;border-collapse: collapse;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width:80px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width: 110px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoPrimary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold;text-align: left;border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right;border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }}) \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoPrimary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoPrimary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div> -->\r\n</div>\r\n<!-- Secundary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-secundary-budget-total-summary\">\r\n\t<div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoSecundary !== null &&\r\n\t\t\t\tbudgetDtoSecundary.budget &&\r\n\t\t\t\tbudgetDtoSecundary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px; border-collapse: collapse; width: 100%;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 80px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 110px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoSecundary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: left; border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right; border: 1px solid black;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right; border: 1px solid black;\">\r\n\t\t\t\t\t\t {{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }}) \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoSecundary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoSecundary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}} \r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</div>\r\n" }]
|
|
999
|
+
}], ctorParameters: () => [{ type: i1.CurrencyPipe }, { type: i2.TokenService }, { type: i3.ToastrService }, { type: i4.AuthenticationService }], propDecorators: { template: [{
|
|
1000
|
+
type: Input
|
|
1001
|
+
}], data: [{
|
|
1002
|
+
type: Input
|
|
1003
|
+
}], onGenerate: [{
|
|
1004
|
+
type: Output
|
|
1005
|
+
}] } });
|
|
1006
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcGxpLWNvbW1vbnMvc3JjL2xpYi9jb21wb25lbnRzL3Rva2VuL3Rva2VuLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvY29tcG9uZW50cy90b2tlbi90b2tlbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUlaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixVQUFVLEVBSVYsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFFVixrQkFBa0IsRUFHbEIsUUFBUSxFQUVSLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc1RCxPQUFPLFFBQVEsQ0FBQzs7Ozs7O0FBT2hCLE1BQU0sT0FBTyxjQUFjO0lBNkIxQixZQUNTLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLHFCQUE0QztRQUg1QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBNUJyRCx1Q0FBdUM7UUFDN0IsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRWxFLGtEQUFrRDtRQUNsRCxzQkFBaUIsR0FBWSxLQUFLLENBQUM7SUF5QmhDLENBQUM7SUFFSixRQUFRO1FBQ1AsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FB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QUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkYsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUM5QyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuQyxZQUFZLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0YsQ0FBQzsrR0FwcENXLGNBQWM7bUdBQWQsY0FBYyw2SkNuQzNCLHUvU0FpUUE7OzRGRDlOYSxjQUFjO2tCQUwxQixTQUFTOytCQUNDLFdBQVc7NEtBTVosUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcblx0Q29tcG9uZW50LFxyXG5cdE9uSW5pdCxcclxuXHRJbnB1dCxcclxuXHRPdXRwdXQsXHJcblx0RXZlbnRFbWl0dGVyLFxyXG5cdE9uQ2hhbmdlcyxcclxuXHRTaW1wbGVDaGFuZ2VzLFxyXG5cdFNpbXBsZUNoYW5nZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG5cdFV0aWxTdHJpbmcsXHJcblx0RGF0YVRvVHJhbnNsYXRlVG9rZW4sXHJcblx0VG9rZW4sXHJcblx0QnVkZ2V0RHRvLFxyXG5cdEVUaXBvUHJlc3VwdWVzdG8sXHJcblx0UGxpVXN1YXJpbyxcclxuXHRzZXNpb24sXHJcblx0QXV0aGVudGljYXRpb25VdGlsLFxyXG5cdFBsaVVzZXIsXHJcblx0QXBwbGljYXRpb25CdWRnZXRUb3RhbCxcclxuXHREYXRlVXRpbCxcclxuXHRFdmFsdWF0aW9uXHJcbn0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b2tlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0ICdqcXVlcnknO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdwbGktdG9rZW4nLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi90b2tlbi5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vdG9rZW4uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb2tlbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHQvKiogSXQgY29udGFpbnMgdGhlIHRlbXBsYXRlIGh0bWwgdG8gdHJhbnNsYXRlICovXHJcblx0QElucHV0KCkgdGVtcGxhdGU6IHN0cmluZztcclxuXHQvKiogSXQgY29udGFpbnMgdGhlIGRhdGEgdG8gaW1wbGVtZW50ICovXHJcblx0QElucHV0KCkgZGF0YTogRGF0YVRvVHJhbnNsYXRlVG9rZW47XHJcblx0LyoqIEl0IG5vdGlmaWVzIHRoZSBodG1sIGlzIGdlbmVyYXRlZCovXHJcblx0QE91dHB1dCgpIG9uR2VuZXJhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKiBJdCBlbmFibGVzIHRoZSB2aXN1YWxpemF0aW9uIG9mIGRlc3RpbmF0aW9uICovXHJcblx0ZW5hYmxlRGVzdGluYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqIEl0IGNvbnRhaW5zIHRoZSBwcm9tIGNvZGUgKi9cclxuXHRwcm9tQ29kaWdvOiBudW1iZXI7XHJcblxyXG5cdC8qKiAqL1xyXG5cdGxUb2tlbkNhbGN1bGF0ZWQ6IFRva2VuW107XHJcblx0LyoqICovXHJcblx0bEZvcm1GaWVsZHNUb2tlbjogYW55W107XHJcblx0LyoqICovXHJcblx0dW5pcXVlVmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nO1xyXG5cdC8qKiAqL1xyXG5cdGJ1ZGdldER0b1ByaW1hcnk6IEJ1ZGdldER0bztcclxuXHQvKiogKi9cclxuXHRidWRnZXREdG9TZWN1bmRhcnk6IEJ1ZGdldER0bztcclxuXHQvKiogQXMgdGhlIGxpc3Qgb2YgdG9rZW4gYXJlIGxvYWRlZCBkeW5hbWljYWxseSwgdGhpcyBtYW5hZ2UgdGhhdCBvbmx5IHJlcGxhY2UgdGhlIGluZm8gb25jZS4gKi9cclxuXHRhbHJlYWR5Q2FsbFJlcGxhY2VUb2tlbnM6IGJvb2xlYW47XHJcblxyXG5cdGV2YWx1YXRpb246IEV2YWx1YXRpb247XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSxcclxuXHRcdHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGF1dGhlbnRpY2F0aW9uU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlXHJcblx0KSB7fVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMubFRva2VuQ2FsY3VsYXRlZCA9IG51bGw7XHJcblx0XHR0aGlzLmxGb3JtRmllbGRzVG9rZW4gPSBudWxsO1xyXG5cdFx0dGhpcy5idWRnZXREdG9QcmltYXJ5ID0gbnVsbDtcclxuXHRcdHRoaXMuYnVkZ2V0RHRvU2VjdW5kYXJ5ID0gbnVsbDtcclxuXHRcdHRoaXMuZXZhbHVhdGlvbiA9IG51bGw7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgbWFuYWdlcyB0aGUgY2hhbmdlIG9mIHRoZSBldmVyeSBASW5wdXQgKi9cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcblx0XHQvLyBFdmVyeSB0aW1lIHRoYXQgaW5wdXQgdmFsdWVzIGNoYW5nZSwgY2FsbCBuZXcgdmVyaWZpY2F0aW9uIGNvZGVcclxuXHRcdHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZSA9IG51bGw7XHJcblx0XHRjb25zdCB0ZW1wbGF0ZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy50ZW1wbGF0ZTtcclxuXHRcdGNvbnN0IGRhdGE6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuZGF0YTtcclxuXHJcblx0XHRpZiAodGVtcGxhdGUgJiYgdGVtcGxhdGUuY3VycmVudFZhbHVlKSB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZS5jdXJyZW50VmFsdWU7XHJcblx0XHR9XHJcblx0XHRpZiAoZGF0YSAmJiBkYXRhLmN1cnJlbnRWYWx1ZSkge1xyXG5cdFx0XHR0aGlzLmRhdGEgPSBkYXRhLmN1cnJlbnRWYWx1ZTtcclxuXHRcdFx0dGhpcy5wcm9tQ29kaWdvID0gdGhpcy5kYXRhLnByb21Db2RpZ287XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5kYXRhKSB7XHJcblx0XHRcdHRoaXMuYnVkZ2V0RHRvUHJpbWFyeSA9IHRoaXMuZGF0YS5idWRnZXREdG9QcmltYXJ5ID8gdGhpcy5kYXRhLmJ1ZGdldER0b1ByaW1hcnkgOiBudWxsO1xyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeSA9IHRoaXMuZGF0YS5idWRnZXREdG9TZWN1bmRhcnlcclxuXHRcdFx0XHQ/IHRoaXMuZGF0YS5idWRnZXREdG9TZWN1bmRhcnlcclxuXHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdHRoaXMuZXZhbHVhdGlvbiA9IHRoaXMuZGF0YS5ldmFsdWF0aW9uO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuZGF0YSAmJiB0aGlzLnRlbXBsYXRlICYmIHRoaXMucHJvbUNvZGlnbykge1xyXG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0c2VsZi5pbml0KCk7XHJcblx0XHRcdH0sIDMwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKiBJdCBpbml0aWFsaXplcyB0aGUgcHJvY2VzcyBvZiB0cmFuc2xhdGlvbiAqL1xyXG5cdHByaXZhdGUgaW5pdCgpIHtcclxuXHRcdHRoaXMudHJhbnNsYXRlVG9rZW5zKHRoaXMudGVtcGxhdGUsIHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybSk7XHJcblx0fVxyXG5cclxuXHR0cmFuc2xhdGVDYXRlZ29yeShjYXRlZ29yeU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBsYW5ndWFnZUJ5RGVmYXVsdCA9ICdlbic7XHJcblx0XHQvLyBJZiBkb24ndCBmaW5kIHRoZSBsYW5nLCBnZXQgaW4gZW4uXHJcblx0XHRsZXQgY2F0ZWdvcnlOYW1lQnlEZWY6IHN0cmluZyA9IGNhdGVnb3J5TmFtZTtcclxuXHRcdGlmIChjYXRlZ29yeU5hbWUgJiYgdGhpcy5kYXRhLmNhdGVnb3JpZXMgJiYgdGhpcy5kYXRhLmlkaW9tYSkge1xyXG5cdFx0XHQvLyBJZiB0aGUgbG9jYWxlIHNlbGVjdCBpcyBlcywgdGhpcyBpcyB0aGUgZGFmdWx0IGNhdGVnb3J5IGxhbmd1YWdlXHJcblx0XHRcdGlmICh0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2VzJykge1xyXG5cdFx0XHRcdHJldHVybiBjYXRlZ29yeU5hbWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLmRhdGEuY2F0ZWdvcmllcykge1xyXG5cdFx0XHRcdGlmIChjYXRlZ29yeS5saXN0YVJ1YnJvSWRpb21hICYmIGNhdGVnb3J5LnJ1YlJ1YnJvID09PSBjYXRlZ29yeU5hbWUpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3QgbGFuZ3VhZ2Ugb2YgY2F0ZWdvcnkubGlzdGFSdWJyb0lkaW9tYSkge1xyXG5cdFx0XHRcdFx0XHRpZiAobGFuZ3VhZ2UucnViaUlkaW9tYSA9PT0gdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbGFuZ3VhZ2UucnViaVRyYWR1Y2Npb247XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGxhbmd1YWdlLnJ1YmlJZGlvbWEgPT09IGxhbmd1YWdlQnlEZWZhdWx0KSB7XHJcblx0XHRcdFx0XHRcdFx0Y2F0ZWdvcnlOYW1lQnlEZWYgPSBsYW5ndWFnZS5ydWJpVHJhZHVjY2lvbjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gY2F0ZWdvcnlOYW1lQnlEZWY7XHJcblx0fVxyXG5cclxuXHR0cmFuc2xhdGVUb2tlbnMoaHRtbDogc3RyaW5nLCBsaXN0RGF0YTogYW55KSB7XHJcblx0XHR0aGlzLmFscmVhZHlDYWxsUmVwbGFjZVRva2VucyA9IGZhbHNlO1xyXG5cdFx0Y29uc3QgbFRva2VuczogYW55W10gPSB0aGlzLmdldExpc3RUb2tlbnMoaHRtbCk7XHJcblx0XHRpZiAoIWxUb2tlbnMgfHwgT2JqZWN0LmtleXMobFRva2VucykubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGUgPSBodG1sO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5jYWxsTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0fVxyXG5cclxuXHRjYWxsTGlzdFRva2VucyhsVG9rZW5zOiBhbnlbXSwgaHRtbDogc3RyaW5nLCBsaXN0RGF0YTogYW55KSB7XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdICYmXHJcblx0XHRcdE9iamVjdC5rZXlzKGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdKS5sZW5ndGggPiAwXHJcblx0XHQpIHtcclxuXHRcdFx0aWYgKHRoaXMubFRva2VuQ2FsY3VsYXRlZCkge1xyXG5cdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRva2VuU2VydmljZS5nZXRMaXN0QnlQcm9tQ29kaWdvKHRoaXMucHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdFx0KGxUb2tlbkNhbGN1bGF0ZWQ6IFRva2VuW10pID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5sVG9rZW5DYWxjdWxhdGVkID0gbFRva2VuQ2FsY3VsYXRlZDtcclxuXHRcdFx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciBjYWxsTGlzdFRva2VucyAtZ2V0TGlzdEJ5UHJvbUNvZGlnbycsIGVycm9yKTtcclxuXHRcdFx0XHRcdFx0dGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKCdFcnJvciBnZW5lcmFuZG8gY2FydGEnKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dICYmXHJcblx0XHRcdE9iamVjdC5rZXlzKGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dKS5sZW5ndGggPiAwXHJcblx0XHQpIHtcclxuXHRcdFx0aWYgKHRoaXMubEZvcm1GaWVsZHNUb2tlbikge1xyXG5cdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRva2VuU2VydmljZS5nZXRGb3JtRmllbGRzQnlQcm9tQ29kZSh0aGlzLnByb21Db2RpZ28pLnRoZW4oXHJcblx0XHRcdFx0XHQobEZvcm1GaWVsZHNUb2tlbjogYW55W10pID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5sRm9ybUZpZWxkc1Rva2VuID0gbEZvcm1GaWVsZHNUb2tlbjtcclxuXHRcdFx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciBjYWxsTGlzdFRva2VucyAtZ2V0Rm9ybUZpZWxkc0J5UHJvbUNvZGUnLCBlcnJvcik7XHJcblx0XHRcdFx0XHRcdHRoaXMudG9hc3RyU2VydmljZS5lcnJvcignRXJyb3IgZ2VuZXJhbmRvIGNhcnRhJyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHRsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdICYmXHJcblx0XHRcdE9iamVjdC5rZXlzKGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10pLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAodGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlICE9PSBudWxsKSB7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnN0IHRva2VuVmVyaWZpY2F0aW9uQ29kZTogYW55W10gPSBsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdLmZpbmQoXHJcblx0XHRcdFx0XHQodG9rZW4pID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3ViVG9rZW46IHN0cmluZ1tdID0gdG9rZW4ua2V5XHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoJ3snLCAnJylcclxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgnfScsICcnKVxyXG5cdFx0XHRcdFx0XHRcdC5zcGxpdCgnXycpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0XHRcdFx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQ09ESUdPX1ZFUklGSUNBQ0lPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBPbmx5IGlmIHRoZSBzdGF0aWMgdG9rZW4gaXMgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZVxyXG5cdFx0XHRcdGlmICh0b2tlblZlcmlmaWNhdGlvbkNvZGUgJiYgT2JqZWN0LmtleXModG9rZW5WZXJpZmljYXRpb25Db2RlKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRsZXQgcGxpVXN1YXJpb09iamVjdCA9IEF1dGhlbnRpY2F0aW9uVXRpbC5nZXRQbGlVc3VhcmlvKCk7XHJcblx0XHRcdFx0XHRpZiAoIXBsaVVzdWFyaW9PYmplY3QpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlID0gJyc7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0J05vIHNlIGxvZ3JvIGNvbnN1bHRhciBlbCB1c3VhcmlvIHBhcmEgY29uc3VsdGFyIGVsIHRva2VuJyxcclxuXHRcdFx0XHRcdFx0XHRwbGlVc3VhcmlvT2JqZWN0XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBsaVVzdWFyaW86IFBsaVVzdWFyaW8gPSBPYmplY3QuYXNzaWduKFxyXG5cdFx0XHRcdFx0XHRcdG5ldyBQbGlVc3VhcmlvKCksXHJcblx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwbGlVc3VhcmlvT2JqZWN0KSlcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0dGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UuZ2V0VG9rZW5CeUxvZ2luKHBsaVVzdWFyaW8udXN1TG9naW4pLnN1YnNjcmliZShcclxuXHRcdFx0XHRcdFx0XHQoc2VzaW9uOiBzZXNpb24pID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIFRyeSB0byBnZXQgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHNlc2lvbiBpZiBpcyBub3QgYSB2YWxpZCB2YWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VzaW9uVmFsdWUgPSBzZXNpb24gPyBzZXNpb24uc2VzaW9uIDogJzEnO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwbGlVc3VhcmlvLnVzdUxvZ2luLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzZXNpb25WYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bFRva2VucyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aHRtbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdERhdGFcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHQoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdFcnJvciBjb25zdWx0YW5kbyBlbCBsb2dpbiBlbiBQTElTLCBnZXRUb2tlbkJ5TG9naW4nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvclxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIFRyeSB0byBnZXQgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHNlc2lvblxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwbGlVc3VhcmlvLnVzdUxvZ2luLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnMScsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxUb2tlbnMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGh0bWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3REYXRhXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly90aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IoXCJFcnJvciBnZW5lcmFuZG8gY2FydGFcIik7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUgPSAnJztcclxuXHRcdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCB0aGUgdW5pcXVlIHZlcmlmaWNhdGlvbiBjb2RlIGFuZCBjYWxsIHZhbGlkYXRlTGlzdFRva2VucyBtZXRob2RcclxuXHQgKi9cclxuXHRnZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKFxyXG5cdFx0dXN1TG9naW46IHN0cmluZyxcclxuXHRcdHNlc2lvbjogc3RyaW5nLFxyXG5cdFx0bFRva2VuczogYW55W10sXHJcblx0XHRodG1sOiBzdHJpbmcsXHJcblx0XHRsaXN0RGF0YTogYW55XHJcblx0KSB7XHJcblx0XHR0aGlzLnRva2VuU2VydmljZS5nZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKHVzdUxvZ2luLCBzZXNpb24pLnN1YnNjcmliZShcclxuXHRcdFx0KHVuaXF1ZUNvZGVWYWx1ZTogYW55KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdW5pcXVlQ29kZTogc3RyaW5nID0gdW5pcXVlQ29kZVZhbHVlLmNvZGlnb1VuaWNvO1xyXG5cdFx0XHRcdHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZSA9XHJcblx0XHRcdFx0XHR1bmlxdWVDb2RlLnN1YnN0cmluZygwLCA0KSArICcgJyArIHVuaXF1ZUNvZGUuc3Vic3RyaW5nKDQsIDgpO1xyXG5cdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3IgY2FsbExpc3RUb2tlbnMgLWdldExpc3RCeVByb21Db2RpZ28nLCBlcnJvcik7XHJcblx0XHRcdFx0dGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKCdFcnJvciBnZW5lcmFuZG8gY2FydGEnKTtcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zOiBhbnlbXSwgaHRtbDogc3RyaW5nLCBsaXN0RGF0YTogYW55KSB7XHJcblx0XHRsZXQgZmluaXNoTG9hZExpc3RGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblx0XHRsZXQgZmluaXNoTG9hZExpc3RDYWxjdWxhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblx0XHRsZXQgZmluaXNoTG9hZExpc3RTdGF0aWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdGNvbnN0IGZpbmlzaExvYWRMaXN0QnVkZ2V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHRcdGlmIChcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0gJiZcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0ubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0Rm9ybSA9IHRoaXMubEZvcm1GaWVsZHNUb2tlbiA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0Rm9ybSA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdICYmXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdENhbGN1bGF0ZWQgPSB0aGlzLmxUb2tlbkNhbGN1bGF0ZWQgPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdENhbGN1bGF0ZWQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHRsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdICYmXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10ubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0U3RhdGljID0gdGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlICE9PSBudWxsID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RTdGF0aWMgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdEZvcm0gJiZcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RCdWRnZXQgJiZcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RTdGF0aWMgJiZcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RDYWxjdWxhdGVkICYmXHJcblx0XHRcdCF0aGlzLmFscmVhZHlDYWxsUmVwbGFjZVRva2Vuc1xyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMuYWxyZWFkeUNhbGxSZXBsYWNlVG9rZW5zID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5yZXBsYWNlVG9rZW5zV2l0aERhdGEobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmVwbGFjZVRva2Vuc1dpdGhEYXRhKGxUb2tlbnM6IGFueVtdLCBodG1sOiBzdHJpbmcsIGxpc3REYXRhOiBhbnkpIHtcclxuXHRcdGNvbnN0IGxEYXRhT3JnOiBhbnlbXSA9IFtdO1xyXG5cdFx0Y29uc3QgbEZvcm1GaWVsZHNUb2tlbk9yZzogYW55W10gPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0KGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dIHx8XHJcblx0XHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0pICYmXHJcblx0XHRcdGxpc3REYXRhXHJcblx0XHQpIHtcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhRm9ybSBpbiBsaXN0RGF0YSkge1xyXG5cdFx0XHRcdGxEYXRhT3JnW2RhdGFGb3JtLnRvTG93ZXJDYXNlKCldID0gbGlzdERhdGFbZGF0YUZvcm1dO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmxGb3JtRmllbGRzVG9rZW4pIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGZvcm1GaWVsZFRva2VuIG9mIHRoaXMubEZvcm1GaWVsZHNUb2tlbikge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB2YWx1ZXNGaWVsZCBvZiBmb3JtRmllbGRUb2tlbi52YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBrZXlUb2tlbjogc3RyaW5nID1cclxuXHRcdFx0XHRcdFx0XHQnJHsnICsgZm9ybUZpZWxkVG9rZW4udGl0bGUua2V5ICsgJ18nICsgdmFsdWVzRmllbGQua2V5ICsgJ30nO1xyXG5cdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuT3JnW2tleVRva2VuXSA9IHZhbHVlc0ZpZWxkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Y29uc3QgbFRva2Vuc0NhbGN1bGF0ZWQ6IGFueVtdID0gW107XHJcblx0XHRpZiAobFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0pIHtcclxuXHRcdFx0aWYgKHRoaXMubFRva2VuQ2FsY3VsYXRlZCkge1xyXG5cdFx0XHRcdGZvciAoY29uc3QgdG9rZW5DYWwgb2YgdGhpcy5sVG9rZW5DYWxjdWxhdGVkKSB7XHJcblx0XHRcdFx0XHRsVG9rZW5zQ2FsY3VsYXRlZFtVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnModG9rZW5DYWwubmFtZSldID1cclxuXHRcdFx0XHRcdFx0dG9rZW5DYWw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRsZXQgdHlwZVRva2VuOiBhbnk7XHJcblx0XHRjb25zdCB0b2tlblR5cGVUcmFuc2xhdGVkOiBhbnkgPSBbXTtcclxuXHRcdGZvciAodHlwZVRva2VuIGluIGxUb2tlbnMpIHtcclxuXHRcdFx0aWYgKCFsVG9rZW5zW3R5cGVUb2tlbl0pIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCB0b2tlbnNUeXBlOiBhbnlbXSA9IGxUb2tlbnNbdHlwZVRva2VuXTtcclxuXHRcdFx0dG9rZW5UeXBlVHJhbnNsYXRlZFt0eXBlVG9rZW5dID0gW107XHJcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zVHlwZSkge1xyXG5cdFx0XHRcdGxldCB0b2tlblRyYW5zbGF0ZWQgPSBudWxsO1xyXG5cdFx0XHRcdGNvbnN0IHN1YlRva2VuOiBzdHJpbmdbXSA9IHRva2VuLmtleS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJykuc3BsaXQoJ18nKTtcclxuXHRcdFx0XHRzd2l0Y2ggKHR5cGVUb2tlbikge1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STTogLy8gRm9ybVxyXG5cdFx0XHRcdFx0XHRsZXQgdmFsdWVEYXRhID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YU9yZ0tleSA9IHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRcdC8vIFB1dCB0aGlzIGtleSBiZWNhdXNlIHRoZXJlIG5vIG90aGVyIHdheSB0byBkaWZmZXJlbnRpYXRlIHRoZSBzYW1lIGtleSBpbiBkaWZmZXJlbnRzIGZvcm1zXHJcblx0XHRcdFx0XHRcdGNvbnN0IGRhdGFPcmdLZXlCeUZvcm0gPVxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuWzBdLnN1YnN0cmluZygxKSArICdfJyArIHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGRhdGFPcmdWYWx1ZSA9IGxEYXRhT3JnLmhhc093blByb3BlcnR5KGRhdGFPcmdLZXkpXHJcblx0XHRcdFx0XHRcdFx0PyBsRGF0YU9yZ1tkYXRhT3JnS2V5XVxyXG5cdFx0XHRcdFx0XHRcdDogbERhdGFPcmcuaGFzT3duUHJvcGVydHkoZGF0YU9yZ0tleUJ5Rm9ybSlcclxuXHRcdFx0XHRcdFx0XHQ/IGxEYXRhT3JnW2RhdGFPcmdLZXlCeUZvcm1dXHJcblx0XHRcdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zdCBkYXRhT3JnVmFsdWVCeUZvcm0gPSBsRGF0YU9yZ1tkYXRhT3JnS2V5QnlGb3JtXTtcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuLmxlbmd0aCA9PT0gMyAmJlxyXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhT3JnVmFsdWUgIT09ICd1bmRlZmluZWQnICYmXHJcblx0XHRcdFx0XHRcdFx0ZGF0YU9yZ1ZhbHVlICE9PSBudWxsICYmXHJcblx0XHRcdFx0XHRcdFx0ZGF0YU9yZ1ZhbHVlLmhhc093blByb3BlcnR5KHN1YlRva2VuWzJdKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZURhdGEgPSBkYXRhT3JnVmFsdWVbc3ViVG9rZW5bMl1dO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuLmxlbmd0aCA9PT0gMiAmJlxyXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhT3JnVmFsdWUgIT09ICd1bmRlZmluZWQnICYmXHJcblx0XHRcdFx0XHRcdFx0ZGF0YU9yZ1ZhbHVlICE9PSBudWxsXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IGRhdGFPcmdWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRpZiAobEZvcm1GaWVsZHNUb2tlbk9yZ1t0b2tlbi5rZXldKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZURhdGEgPSB0aGlzLnRva2VuU2VydmljZS5nZXRWYWx1ZUZyb21Gb3JtRmllbGQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5PcmdbdG9rZW4ua2V5XSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWVEYXRhXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR2YWx1ZURhdGEgPSB2YWx1ZURhdGEgPyB2YWx1ZURhdGEgOiAnJztcclxuXHRcdFx0XHRcdFx0dG9rZW5UcmFuc2xhdGVkID0gdmFsdWVEYXRhO1xyXG5cdFx0XHRcdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCB2YWx1ZURhdGEpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0JVREdFVDogLy9CdWRnZXRcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnVkZ2V0UmVzb2x2ZVRva2VuID0gdGhpcy5yZXNvbHZlQnVkZ2V0VG9rZW4oaHRtbCwgdG9rZW4sIHN1YlRva2VuKTtcclxuXHRcdFx0XHRcdFx0aHRtbCA9IGJ1ZGdldFJlc29sdmVUb2tlbi5odG1sO1xyXG5cdFx0XHRcdFx0XHR0b2tlblRyYW5zbGF0ZWQgPSBidWRnZXRSZXNvbHZlVG9rZW4udmFsdWU7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0w6IC8vVGFza1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0YXNrUmVzb2x2ZVRva2VuID0gdGhpcy5yZXNvbHZlVGFza29rZW4oaHRtbCwgdG9rZW4sIHN1YlRva2VuKTtcclxuXHRcdFx0XHRcdFx0aHRtbCA9IHRhc2tSZXNvbHZlVG9rZW4uaHRtbDtcclxuXHRcdFx0XHRcdFx0dG9rZW5UcmFuc2xhdGVkID0gdGFza1Jlc29sdmVUb2tlbi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUM6IC8vU3RhdGljXHJcblx0XHRcdFx0XHRcdGNvbnN0IHN0YXRpY1Jlc29sdmVUb2tlbiA9IHRoaXMucmVzb2x2ZVN0YXRpY1Rva2VuKGh0bWwsIHRva2VuLCBzdWJUb2tlbik7XHJcblx0XHRcdFx0XHRcdGh0bWwgPSBzdGF0aWNSZXNvbHZlVG9rZW4uaHRtbDtcclxuXHRcdFx0XHRcdFx0dG9rZW5UcmFuc2xhdGVkID0gc3RhdGljUmVzb2x2ZVRva2VuLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURUQ6IC8vQ2FsY3VsYXRlZFxyXG5cdFx0XHRcdFx0XHQvLyBSZXBsYWNlcyBkZSB0b2tlbnMgb2YgdGhlIGZvcm11bGFcclxuXHRcdFx0XHRcdFx0Y29uc3QgdG9rZW5OYW1lOiBzdHJpbmcgPSBsVG9rZW5zQ2FsY3VsYXRlZFtzdWJUb2tlblsxXV0ubmFtZTtcclxuXHRcdFx0XHRcdFx0bGV0IGZvcm11bGE6IHN0cmluZyA9IGxUb2tlbnNDYWxjdWxhdGVkW3N1YlRva2VuWzFdXS5mb3JtdWxhO1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdC8vQVFVSVxyXG5cdFx0XHRcdFx0XHRcdGZvcm11bGEgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QoXHJcblx0XHRcdFx0XHRcdFx0XHR0b2tlbk5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtdWxhLFxyXG5cdFx0XHRcdFx0XHRcdFx0bERhdGFPcmdcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdGZvcm11bGEgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IuZXJyb3IgPyBlcnJvci5lcnJvciA6IGVycm9yKTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnRvYXN0clNlcnZpY2Uud2FybmluZyhlcnJvci5tZXNzYWdlLCBlcnJvci50aXR0bGUpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQvLyBUcnkgdG8gZXZhbHVhdGUgdGhlIGZvcm11bGFcclxuXHRcdFx0XHRcdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0aWYgKGZvcm11bGEgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0ID0gZm9ybXVsYS5zdGFydHNXaXRoKCdmaWxlOi8vJylcclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcIjxpbWcgd2lkdGg9JzI1MHB4JyBoZWlnaHQ9J2F1dG8nIHNyYz0nXCIgKyBmb3JtdWxhICsgXCInLz5cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IGV2YWwoZm9ybXVsYSk7XHJcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0J0Vycm9yIGV2YWx1YXRpbmcgdGhlIGZvcm11bGEuJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bFRva2Vuc0NhbGN1bGF0ZWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN1YlRva2VuLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnTm8gc2UgbG9ncm8gZXZhbHVhciBsYSBmb3JtdWxhciBkZWwgdG9rZW4gJyArIHRva2VuTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0J0Vycm9yISdcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGlmIChyZXN1bHQgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHJlc3VsdCk7XHJcblx0XHRcdFx0XHRcdFx0XHR0b2tlblRyYW5zbGF0ZWQgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0b2tlblR5cGVUcmFuc2xhdGVkW3R5cGVUb2tlbl1bdG9rZW4ua2V5XSA9IHRva2VuVHJhbnNsYXRlZDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0dGhpcy5vbkdlbmVyYXRlLmVtaXQoe1xyXG5cdFx0XHRodG1sOiBodG1sLFxyXG5cdFx0XHR0b2tlblR5cGVUcmFuc2xhdGVkOiB0b2tlblR5cGVUcmFuc2xhdGVkXHJcblx0XHR9KTtcclxuXHRcdC8vIH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyeSB0byBmaW5kIHRoZSBidWRnZXQgaW5mbyB0byB0cmFuc2xhdGUgdGhlIHRva2VuLlxyXG5cdCAqIEBwYXJhbSBodG1sXHJcblx0ICogQHBhcmFtIHRva2VuXHJcblx0ICogQHBhcmFtIHN1YlRva2VuXHJcblx0ICovXHJcblx0cmVzb2x2ZUJ1ZGdldFRva2VuKGh0bWw6IHN0cmluZywgdG9rZW46IGFueSwgc3ViVG9rZW46IHN0cmluZ1tdKTogYW55IHtcclxuXHRcdGxldCB0cHJlc0NvZGlnbzogbnVtYmVyID0gTnVtYmVyKHN1YlRva2VuWzFdKTtcclxuXHRcdGxldCB0b2tlblZhbHVlOiBzdHJpbmcgPSBzdWJUb2tlblsyXTtcclxuXHRcdGxldCBidWRnZXREdG86IEJ1ZGdldER0byA9IG51bGw7XHJcblx0XHRsZXQgaWRUb3RhbEJ1ZGdldDogc3RyaW5nID0gbnVsbDtcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5idWRnZXREdG9QcmltYXJ5ICYmXHJcblx0XHRcdHRoaXMuYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQgJiZcclxuXHRcdFx0dHByZXNDb2RpZ28gPT0gRVRpcG9QcmVzdXB1ZXN0by5QUklNQVJZXHJcblx0XHQpIHtcclxuXHRcdFx0YnVkZ2V0RHRvID0gdGhpcy5idWRnZXREdG9QcmltYXJ5O1xyXG5cdFx0XHRpZFRvdGFsQnVkZ2V0ID0gJ3BsaS10b2tlbi1wcmluY2lwYWwtYnVkZ2V0LXRvdGFsLXN1bW1hcnknO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0dGhpcy5idWRnZXREdG9TZWN1bmRhcnkgJiZcclxuXHRcdFx0dGhpcy5idWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0ICYmXHJcblx0XHRcdHRwcmVzQ29kaWdvID09IEVUaXBvUHJlc3VwdWVzdG8uU0VDT05EQVJZXHJcblx0XHQpIHtcclxuXHRcdFx0YnVkZ2V0RHRvID0gdGhpcy5idWRnZXREdG9TZWN1bmRhcnk7XHJcblx0XHRcdGlkVG90YWxCdWRnZXQgPSAncGxpLXRva2VuLXNlY3VuZGFyeS1idWRnZXQtdG90YWwtc3VtbWFyeSc7XHJcblx0XHR9XHJcblx0XHRpZiAoYnVkZ2V0RHRvID09PSBudWxsIHx8ICFidWRnZXREdG8uYnVkZ2V0KSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0J05vIHNlIGxvZ3JvIGVuY29udHJhciBlbCBwcmVzdXB1ZXN0byBkZWwgdG9rZW4uJyxcclxuXHRcdFx0XHR0b2tlbixcclxuXHRcdFx0XHR0aGlzLmJ1ZGdldER0b1ByaW1hcnksXHJcblx0XHRcdFx0dGhpcy5idWRnZXREdG9TZWN1bmRhcnlcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRodG1sOiBodG1sLFxyXG5cdFx0XHRcdHZhbHVlOiBudWxsXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHRsZXQgdmFsdWVEYXRhID0gbnVsbDtcclxuXHRcdGNvbnN0IGFwcGxpY2F0aW9uUHJvY2VzcyA9XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfQU1PVU5UIHx8XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUyB8fFxyXG5cdFx0XHR0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX0ZJTkFOQ0lORztcclxuXHRcdGNvbnN0IGxlZ2FsaXphdGlvblByb2Nlc3MgPVxyXG5cdFx0XHR0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9BTU9VTlQgfHxcclxuXHRcdFx0dG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUyB8fFxyXG5cdFx0XHR0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc7XHJcblxyXG5cdFx0aWYgKHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX1RPVEFMX0FNT1VOVCkge1xyXG5cdFx0XHR2YWx1ZURhdGEgPVxyXG5cdFx0XHRcdGJ1ZGdldER0by5idWRnZXQgJiYgYnVkZ2V0RHRvLmJ1ZGdldC5zdW1tYXJ5XHJcblx0XHRcdFx0XHQ/IHRoaXMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShcclxuXHRcdFx0XHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0LnN1bW1hcnkuYnVkZ2V0VG90YWwsXHJcblx0XHRcdFx0XHRcdFx0J2RlZmF1bHQnLFxyXG5cdFx0XHRcdFx0XHRcdCcnLFxyXG5cdFx0XHRcdFx0XHRcdCcxLjAtMCdcclxuXHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0OiAwO1xyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9SRVNVTUVfQ0FURUdPUllfWUVBUikge1xyXG5cdFx0XHQvLyB0aGlzLmFkZEluZm9Ub2tlblJlc3VtZUNhdGVnb3J5WWVhcih0cHJlc0NvZGlnbywgaWRUb3RhbEJ1ZGdldCwgYnVkZ2V0RHRvKTtcclxuXHRcdFx0dGhpcy5hZGRJbmZvVG9rZW5SZXN1bWVDYXRlZ29yeVllYXIodHByZXNDb2RpZ28sIGlkVG90YWxCdWRnZXQsIGJ1ZGdldER0byk7XHJcblx0XHRcdGNvbnN0IHBsaVRva2VuVG90YWxCdWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZFRvdGFsQnVkZ2V0KTtcclxuXHRcdFx0aWYgKHBsaVRva2VuVG90YWxCdWRnZXQpIHtcclxuXHRcdFx0XHR2YWx1ZURhdGEgPSB0aGlzLnJlbW92ZUNvbW1lbnRzSHRtbChwbGlUb2tlblRvdGFsQnVkZ2V0LmlubmVySFRNTCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ3BsaVRva2VuVG90YWxCdWRnZXQgLSBOVUxMJywgcGxpVG9rZW5Ub3RhbEJ1ZGdldCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfRkVDSEFfRklOQU5DSU5HX1NUQVJUKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ1N0YXJ0XHJcblx0XHRcdFx0XHQ/IGJ1ZGdldER0by5idWRnZXQuZmluYW5jaW5nU3RhcnRcclxuXHRcdFx0XHRcdDogJyc7XHJcblxyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKFxyXG5cdFx0XHRcdGh0bWwsXHJcblx0XHRcdFx0dG9rZW4udmFsdWUsXHJcblx0XHRcdFx0dmFsdWVEYXRhLFxyXG5cdFx0XHRcdHRoaXMuZGF0YT8uaWRpb21hPy5sb2NhbGVcclxuXHRcdFx0KTtcclxuXHRcdH0gZWxzZSBpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfRkVDSEFfRklOQU5DSU5HX0VORCkge1xyXG5cdFx0XHR2YWx1ZURhdGEgPVxyXG5cdFx0XHRcdGJ1ZGdldER0by5idWRnZXQgJiYgYnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdFbmRcclxuXHRcdFx0XHRcdD8gYnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdFbmRcclxuXHRcdFx0XHRcdDogJyc7XHJcblxyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKFxyXG5cdFx0XHRcdGh0bWwsXHJcblx0XHRcdFx0dG9rZW4udmFsdWUsXHJcblx0XHRcdFx0dmFsdWVEYXRhLFxyXG5cdFx0XHRcdHRoaXMuZGF0YT8uaWRpb21hPy5sb2NhbGVcclxuXHRcdFx0KTtcclxuXHRcdH0gZWxzZSBpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19EVVJBVElPTl9TVFVESUVTKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LnN0dWR5U3RhcnQgJiYgYnVkZ2V0RHRvLmJ1ZGdldC5zdHVkeUVuZFxyXG5cdFx0XHRcdFx0PyBEYXRlVXRpbC5lbGFwc2VkTW9udGhzKFxyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0by5idWRnZXQuc3R1ZHlTdGFydCxcclxuXHRcdFx0XHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0LnN0dWR5RW5kXHJcblx0XHRcdFx0XHQgICkgKyAxXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0ZJTkFOQ0lOR19EVVJBVElPTikge1xyXG5cdFx0XHR2YWx1ZURhdGEgPVxyXG5cdFx0XHRcdGJ1ZGdldER0by5idWRnZXQgJiYgYnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdFbmQgJiYgYnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdTdGFydFxyXG5cdFx0XHRcdFx0PyBEYXRlVXRpbC5lbGFwc2VkTW9udGhzKFxyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0by5idWRnZXQuZmluYW5jaW5nU3RhcnQsXHJcblx0XHRcdFx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdFbmRcclxuXHRcdFx0XHRcdCAgKSArIDFcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHR9IGVsc2UgaWYgKHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkxFR0FMSVpBVElPTl9PUl9BUFBMSUNBVElPTl9UT1RBTF9GSU5BTkNJTkcpIHtcclxuXHRcdFx0Ly8gSk1QIC0gTWFudGlzIDY2NzQgLSBBZGQgbG9naWMgdG8gbGVnYWxpemF0aW9uIG9yIGFwcGxpY2F0aW9uIHRvdGFsIGZpbmFuY2luZ1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5kYXRhICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5idWRnZXRcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0Y29uc3QgYnVkZ2V0ID0gdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0O1xyXG5cclxuXHRcdFx0XHRpZiAoYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3MgJiYgYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3MudG90YWxGaW5hbmNpbmcpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHRvdGFsRmluYW5jaW5nID0gTnVtYmVyKGJ1ZGdldC5sZWdhbGl6YXRpb25Qcm9jZXNzLnRvdGFsRmluYW5jaW5nKTtcclxuXHRcdFx0XHRcdHZhbHVlRGF0YSA9IHRvdGFsRmluYW5jaW5nICogMS4wMDM7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChidWRnZXQuYXBwbGljYXRpb25Qcm9jZXNzICYmIGJ1ZGdldC5hcHBsaWNhdGlvblByb2Nlc3MudG90YWxGaW5hbmNpbmcpIHtcclxuXHRcdFx0XHRcdHZhbHVlRGF0YSA9IE51bWJlcihidWRnZXQuYXBwbGljYXRpb25Qcm9jZXNzLnRvdGFsRmluYW5jaW5nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdChhcHBsaWNhdGlvblByb2Nlc3MgfHwgbGVnYWxpemF0aW9uUHJvY2VzcykgJiZcclxuXHRcdFx0dGhpcy5kYXRhICYmXHJcblx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uICYmXHJcblx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJ1ZGdldFxyXG5cdFx0KSB7XHJcblx0XHRcdC8vIEdldCB0aGUgdG90YWwgYnVkZ2V0IGFtb3VudCBkZXBlbmQgb2YgdGhlIHByb2Nlc3NcclxuXHRcdFx0Y29uc3QgYXBwQnVkZ2V0VG90YWw6IEFwcGxpY2F0aW9uQnVkZ2V0VG90YWwgPSBhcHBsaWNhdGlvblByb2Nlc3NcclxuXHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJ1ZGdldC5hcHBsaWNhdGlvblByb2Nlc3NcclxuXHRcdFx0XHQ6IHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJ1ZGdldC5sZWdhbGl6YXRpb25Qcm9jZXNzO1xyXG5cdFx0XHRpZiAoYXBwQnVkZ2V0VG90YWwgIT0gdW5kZWZpbmVkICYmIGFwcEJ1ZGdldFRvdGFsICE9IG51bGwpIHtcclxuXHRcdFx0XHQvLyBubyBtYXR0ZXIgdGhlIHByb2Nlc3MsIHRoZSBjbGFzcyBpcyB0aGUgc2FtZVxyXG5cdFx0XHRcdHN3aXRjaCAodG9rZW5WYWx1ZSkge1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9BTU9VTlQ6XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9BTU9VTlQ6XHJcblx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IGFwcEJ1ZGdldFRvdGFsLnRvdGFsQW1vdW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzpcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX09XTl9GT1VORFM6XHJcblx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IGFwcEJ1ZGdldFRvdGFsLnRvdGFsT3duRnVuZHM7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6XHJcblx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IGFwcEJ1ZGdldFRvdGFsLnRvdGFsRmluYW5jaW5nO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfSU5TVVJBTkNFX0FNT1VOVCkge1xyXG5cdFx0XHRsZXQgdG90YWxGaW5hbmNpbmcgPVxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJ1ZGdldC5sZWdhbGl6YXRpb25Qcm9jZXNzICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3MudG90YWxGaW5hbmNpbmc7XHJcblx0XHRcdHRvdGFsRmluYW5jaW5nID1cclxuXHRcdFx0XHR0b3RhbEZpbmFuY2luZyA9PSB1bmRlZmluZWQgfHwgdG90YWxGaW5hbmNpbmcgPT0gbnVsbCA/IDAgOiBOdW1iZXIodG90YWxGaW5hbmNpbmcpO1xyXG5cdFx0XHQvLyBsZXQgdG90YWxJbnN1cmFuY2VBbW91bnQgPSB0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi50b3RhbEluc3VyYW5jZUFtb3VudDtcclxuXHRcdFx0Ly8gdG90YWxJbnN1cmFuY2VBbW91bnQgPVxyXG5cdFx0XHQvLyBcdHRvdGFsSW5zdXJhbmNlQW1vdW50ID09IHVuZGVmaW5lZCB8fCB0b3RhbEluc3VyYW5jZUFtb3VudCA9PSBudWxsXHJcblx0XHRcdC8vIFx0XHQ/IDBcclxuXHRcdFx0Ly8gXHRcdDogTnVtYmVyKHRvdGFsSW5zdXJhbmNlQW1vdW50KTtcclxuXHRcdFx0dmFsdWVEYXRhID0gdG90YWxGaW5hbmNpbmcgKiAxLjAwMztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFdoZW4gdGhlIHRva2VuIGNhbid0IGJlIHJlc29sdmVcclxuXHRcdFx0Y29uc29sZS5lcnJvcigncmVzb2x2ZUJ1ZGdldFRva2VuIC1ObyBzZSBsb2dybyByZXNvbHZlciBlbCB0b2tlbiBkZSB0aXBvIHByZXN1cHVlc3RvJyk7XHJcblx0XHR9XHJcblx0XHR2YWx1ZURhdGEgPSB2YWx1ZURhdGEgPT09IG51bGwgPyAnJyA6IHZhbHVlRGF0YTtcclxuXHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHZhbHVlRGF0YSk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRodG1sOiBodG1sLFxyXG5cdFx0XHR2YWx1ZTogdmFsdWVEYXRhXHJcblx0XHR9O1xyXG5cdH1cclxuXHRyZXNvbHZlVGFza29rZW4oaHRtbDogc3RyaW5nLCB0b2tlbjogYW55LCBzdWJUb2tlbjogc3RyaW5nW10pOiBhbnkge1xyXG5cdFx0bGV0IHZhbHVlVGFzayA9IG51bGw7XHJcblx0XHRpZiAoc3ViVG9rZW4ubGVuZ3RoID4gMikge1xyXG5cdFx0XHRsZXQgdGFza0lkID0gTnVtYmVyKHN1YlRva2VuWzJdKTtcclxuXHRcdFx0bGV0IHRhc2sgPSB0aGlzLmV2YWx1YXRpb24udGFza3MuZmluZCgodCkgPT4gdC5pZFRhc2sgPT0gdGFza0lkKTtcclxuXHRcdFx0dmFsdWVUYXNrID0gdGFzay5yZXN1bHQ7XHJcblx0XHR9XHJcblx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCB2YWx1ZVRhc2spO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0aHRtbDogaHRtbCxcclxuXHRcdFx0dmFsdWU6IHZhbHVlVGFza1xyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdHJlc29sdmVTdGF0aWNUb2tlbihodG1sOiBzdHJpbmcsIHRva2VuOiBhbnksIHN1YlRva2VuOiBzdHJpbmdbXSk6IGFueSB7XHJcblx0XHRsZXQgdmFsdWVSZXBsYWNlOiBhbnkgPSBudWxsO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9DT0RJR09fVkVSSUZJQ0FDSU9OLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSB0aGlzLnVuaXF1ZVZlcmlmaWNhdGlvbkNvZGU7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9BX1FVSUVOX1ZBX0RJUklHSURPLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHQvLyBpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbikge1xyXG5cdFx0XHRodG1sID0gdGhpcy5yZXNvbHZlU3RhdGljVG9rZW5zS2V5QVF1aWVuVmFEaXJpZ2lkbyhodG1sLCB0b2tlbi52YWx1ZSk7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9ICcnO1xyXG5cdFx0XHQvLyB9XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9MRVRURVJfU0lHTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0aHRtbCA9IHRoaXMucmVzb2x2ZVN0YXRpY1Rva2Vuc0tleVNpZ24oaHRtbCwgdG9rZW4udmFsdWUsIHN1YlRva2VuKTtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gJyc7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9TQUxVRE9fQ09NUExFTUVOVEFSSU8udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdC8vIGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uKSB7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnJlc29sdmVTdGF0aWNUb2tlbnNLZXlTYWx1ZG9Db21wbGVtZW50YXJpbyhodG1sLCB0b2tlbi52YWx1ZSk7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9ICcnO1xyXG5cdFx0XHQvLyB9XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9GRUNIQV9BQ1RVQUwudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IG5ldyBEYXRlKCk7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIG5ldyBEYXRlKCkpO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PSBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBwYXROb21icmUgPVxyXG5cdFx0XHRcdHRoaXMuZGF0YS5wbGlQcm9tb2Npb24gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnBsaVByb2dyYW1hICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLnBsaVByb21vY2lvbi5wbGlQcm9ncmFtYS5wbGlQYXRyb2NpbmFkb3JcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLnBsaVByb21vY2lvbi5wbGlQcm9ncmFtYS5wbGlQYXRyb2NpbmFkb3IucGF0Tm9tYnJlXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBwYXROb21icmU7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHBhdE5vbWJyZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QUk9HUkFNQS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgcHJvZ05vbWJyZSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLnBsaVByb21vY2lvbiAmJiB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnBsaVByb2dyYW1hXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5wbGlQcm9tb2Npb24ucGxpUHJvZ3JhbWEucHJvZ05vbWJyZVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gcHJvZ05vbWJyZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgcHJvZ05vbWJyZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QUk9NT0NJT04udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IHByb21Ob21icmUgPSB0aGlzLmRhdGEucGxpUHJvbW9jaW9uID8gdGhpcy5kYXRhLnBsaVByb21vY2lvbi5wcm9tTm9tYnJlIDogJyc7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IHByb21Ob21icmU7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHByb21Ob21icmUpO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PSBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQU5JT19QUk9NT0NJT04udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IGFuaW9Qcm9tb2Npb24gPVxyXG5cdFx0XHRcdHRoaXMuZGF0YS5wbGlQcm9tb2Npb24gJiYgdGhpcy5kYXRhLnBsaVByb21vY2lvbi5wcm9tQW5pb1xyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnByb21BbmlvXHJcblx0XHRcdFx0XHQ6IDA7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGFuaW9Qcm9tb2Npb247XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGFuaW9Qcm9tb2Npb24pO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PVxyXG5cdFx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfSVNPX01PTkVEQV9CQVNFLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBiYXNlQ3VycmVuY3kgPVxyXG5cdFx0XHRcdHRoaXMuZGF0YS5idWRnZXREdG9QcmltYXJ5ICYmIHRoaXMuZGF0YS5idWRnZXREdG9QcmltYXJ5LmJ1ZGdldFxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuYmFzZUN1cnJlbmN5XHJcblx0XHRcdFx0XHQ6IHRoaXMuZGF0YS5idWRnZXREdG9TZWN1bmRhcnkgJiYgdGhpcy5kYXRhLmJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXRcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuYmFzZUN1cnJlbmN5XHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBiYXNlQ3VycmVuY3k7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGJhc2VDdXJyZW5jeSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9TVEFUVVNfTkFNRS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3Qgc3RhdHVzTmFtZSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24gJiZcclxuXHRcdFx0XHRVdGlsU3RyaW5nLmlzVmFsaWQodGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uc3RhdGVOYW1lKVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5zdGF0ZU5hbWVcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IHN0YXR1c05hbWU7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHN0YXR1c05hbWUpO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PSBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfVVNFUl9JTklUSUFMUy50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgcGxpVXNlcjogUGxpVXNlciA9IEF1dGhlbnRpY2F0aW9uVXRpbC5nZXRQbGlVc2VyKCk7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IFV0aWxTdHJpbmcuaW5pdGlhbExldHRlcnMocGxpVXNlci5maXJzdG5hbWUgKyAnICcgKyBwbGlVc2VyLmxhc3RuYW1lKTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgdmFsdWVSZXBsYWNlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX05VTUJFUl9BUFBMSUNBVElPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgbnVtYmVyID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbiAmJiB0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5udW1iZXJcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24ubnVtYmVyXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IG51bWJlcjtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgbnVtYmVyKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX05BTUUudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IGNvbWl0ZU5vbWJyZSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtICYmIHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybS5jb21pdGVOb21icmVcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtLmNvbWl0ZU5vbWJyZVxyXG5cdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBjb21pdGVOb21icmU7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGNvbWl0ZU5vbWJyZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9TRUdNRU5UQVRJT04udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IGNvbWl0ZVNlZ21lbnRhY2lvbiA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9TRUdNRU5UQVRJT05dXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybVtUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfU0VHTUVOVEFUSU9OXVxyXG5cdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBjb21pdGVTZWdtZW50YWNpb247XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGNvbWl0ZVNlZ21lbnRhY2lvbik7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9BR0dSVVBBVElPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgY29taXRlQWdydXBhY2lvbiA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9BR0dSVVBBVElPTl1cclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9BR0dSVVBBVElPTl1cclxuXHRcdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gY29taXRlQWdydXBhY2lvbjtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgY29taXRlQWdydXBhY2lvbik7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEUudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBjdXRMaW5lRGF0ZSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEVdXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybVtUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfQ1VUTElORV9EQVRFXVxyXG5cdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHRpZiAoY3V0TGluZURhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcblx0XHRcdFx0Y3V0TGluZURhdGUgPSBjdXRMaW5lRGF0ZS50b1N0cmluZygpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGN1dExpbmVEYXRlO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBjdXRMaW5lRGF0ZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1RPVEFMX1dFSUdIVEVELnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRsZXQgYmVzdFNjZW5hcmlvVmFsdWU6IGFueSA9ICcnO1xyXG5cdFx0XHRpZiAodGhpcy5ldmFsdWF0aW9uICYmIHRoaXMuZXZhbHVhdGlvbi5zY2VuYXJpb3MpIHtcclxuXHRcdFx0XHRsZXQgYmVzdFNjZW5hcmlvID0gdGhpcy5ldmFsdWF0aW9uLnNjZW5hcmlvcy5maWx0ZXIoKHMpID0+IHMuYmVzdClbMF07XHJcblx0XHRcdFx0aWYgKGJlc3RTY2VuYXJpbykge1xyXG5cdFx0XHRcdFx0YmVzdFNjZW5hcmlvVmFsdWUgPSBiZXN0U2NlbmFyaW8ucmVzdWx0O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBiZXN0U2NlbmFyaW9WYWx1ZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFkudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IHVzZXJUeXBlQ3JlZGl0U3R1ZHkgPVxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybSAmJlxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybVtUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZXVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWV1cclxuXHRcdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gdXNlclR5cGVDcmVkaXRTdHVkeTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgdXNlclR5cGVDcmVkaXRTdHVkeSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0JFTl9DT0RJR08udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJlbkNvZGlnbztcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihcclxuXHRcdFx0XHRodG1sLFxyXG5cdFx0XHRcdHRva2VuLnZhbHVlLFxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJlbkNvZGlnb1xyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRG9uJ3QgZmluZCB0aGUgdG9rZW5cclxuXHRcdFx0Y29uc29sZS5lcnJvcignTm8gc2UgZW5jb250cm8gZWwgdG9rZW4nLCB0b2tlbik7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsICcnKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGh0bWw6IGh0bWwsXHJcblx0XHRcdHZhbHVlOiB2YWx1ZVJlcGxhY2VcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGaW5kIGFsbCB0aGUgdG9rZW5zIHByZXNlbnQgaW4gdGhlIEhUTUwgdGV4dC4gT3JnYW5pemUgdGhpcyB0b2tlbnMgaW4gZm91ciBjYXRlZ29yaWVzLlxyXG5cdCAqIEBwYXJhbSBodG1sIFRleHQgb2YgdGhlIGh0bWxcclxuXHQgKi9cclxuXHRnZXRMaXN0VG9rZW5zKGh0bWw6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdC8vIGxldCBzdHJpbmdzOiBzdHJpbmdbXSA9IGh0bWwuc3BsaXQoXCIgXCIpO1xyXG5cdFx0bGV0IHRva2VuczogYW55W10gPSB0aGlzLnRva2VuU2VydmljZS5nZXRMaXN0VG9rZW5zQnlTdHJpbmcoaHRtbCk7XHJcblx0XHRsZXQgdG9rZW5zQ2F0ZWdvcnk6IGFueVtdID0gW107XHJcblx0XHRmb3IgKGxldCBpbmZvVG9rZW4gb2YgdG9rZW5zKSB7XHJcblx0XHRcdGlmIChpbmZvVG9rZW4pIHtcclxuXHRcdFx0XHRjb25zdCBrZXlUeXBlOiBudW1iZXIgPSBUb2tlblNlcnZpY2UuZ2V0S2V5VHlwZShcclxuXHRcdFx0XHRcdGluZm9Ub2tlbi5rZXkucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCd9JywgJycpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoa2V5VHlwZSkge1xyXG5cdFx0XHRcdFx0c3dpdGNoIChrZXlUeXBlKSB7XHJcblx0XHRcdFx0XHRcdGNhc2UgMTogLy8gRm9ybVxyXG5cdFx0XHRcdFx0XHRcdGlmICghdG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dLnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSAyOiAvL0J1ZGdldFxyXG5cdFx0XHRcdFx0XHRcdGlmICghdG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0JVREdFVF0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9CVURHRVRdID0gW107XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9CVURHRVRdLnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSAzOiAvL1N0YXRpY1xyXG5cdFx0XHRcdFx0XHRcdGlmICghdG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdID0gW107XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdLnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSA0OiAvL0NhbGN1bGF0ZWRcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdID0gW107XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEXS5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgNTogLy9UYXNrXHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0xdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0xdID0gW107XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTF0ucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRva2Vuc0NhdGVnb3J5O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmVzb2x2ZXMgdGhlIHN0YXRpYyB0b2tlbiBkZXN0aW5hdGlvblxyXG5cdCAqIEBwYXJhbSBzdHJpbmdUZXh0XHJcblx0ICogQHBhcmFtIHRva2VuXHJcblx0ICogQHBhcmFtIGRhdGFWYWx1ZVxyXG5cdCAqL1xyXG5cdHJlc29sdmVTdGF0aWNUb2tlbnNLZXlBUXVpZW5WYURpcmlnaWRvKHN0cmluZ1RleHQ6IHN0cmluZywgdG9rZW5WYWx1ZTogYW55KTogc3RyaW5nIHtcclxuXHRcdC8vIGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uKSB7XHJcblx0XHR0aGlzLmVuYWJsZURlc3RpbmF0aW9uID0gdHJ1ZTtcclxuXHRcdHRoaXMuYWRkSW5mb1Rva2VuRGVzdGluYXRpb24oKTtcclxuXHRcdGNvbnN0IHBsaVRva2VuRGVzdGluYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGxpLXRva2VuLWRlc3RpbmF0aW9uJyk7XHJcblx0XHRsZXQgaHRtbCA9ICcnO1xyXG5cdFx0aWYgKHBsaVRva2VuRGVzdGluYXRpb24gJiYgcGxpVG9rZW5EZXN0aW5hdGlvbi5pbm5lckhUTUwubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRodG1sID0gdGhpcy5yZW1vdmVDb21tZW50c0h0bWwocGxpVG9rZW5EZXN0aW5hdGlvbi5pbm5lckhUTUwpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihzdHJpbmdUZXh0LCB0b2tlblZhbHVlLCBodG1sKTtcclxuXHRcdC8vIH1cclxuXHRcdC8vIHJldHVybiBzdHJpbmdUZXh0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICpcclxuXHQgKi9cclxuXHRhZGRJbmZvVG9rZW5EZXN0aW5hdGlvbigpIHtcclxuXHRcdGxldCBwbGlUb2tlbkRlc3RpbmF0aW9uID0gJCgnI3BsaS10b2tlbi1kZXN0aW5hdGlvbicpO1xyXG5cdFx0cGxpVG9rZW5EZXN0aW5hdGlvbi5lbXB0eSgpO1xyXG5cdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24pIHtcclxuXHRcdFx0bGV0IGRlc3RpbmF0aW9uSW5mbyA9ICQoJzxkaXY+PC9kaXY+Jyk7XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLnRleHQpIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS50ZXh0KHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24udGV4dCk7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlKSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykudGV4dCh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlKTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubmFtZSB8fCB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lKSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mb05hbWUgPSB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLm5hbWVcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5uYW1lICsgJyAnXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdHZhbHVlSW5mb05hbWUgKz0gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLmFwcGVuZCgnPHN0cm9uZz4nICsgdmFsdWVJbmZvTmFtZSArICc8L3N0cm9uZz4nKTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY2FyZ28pIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS50ZXh0KHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY2FyZ28pO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5vY2N1cGF0aW9uKSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykudGV4dCh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLm9jY3VwYXRpb24pO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jb21wYW55KSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykudGV4dCh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNvbXBhbnkpO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzIHx8IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzc0RldGFpbHMpIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvTmFtZSA9IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzc1xyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3MgKyAnICdcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0dmFsdWVJbmZvTmFtZSArPSB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3NEZXRhaWxzXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzc0RldGFpbHNcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykudGV4dCh2YWx1ZUluZm9OYW1lKTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY2l0eSB8fCB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNvdW50cnkpIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvTmFtZSA9IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY2l0eVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNpdHlcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0dmFsdWVJbmZvTmFtZSArPVxyXG5cdFx0XHRcdFx0dGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jaXR5ICYmIHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY291bnRyeSA/ICcsICcgOiAnJztcclxuXHRcdFx0XHR2YWx1ZUluZm9OYW1lICs9IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY291bnRyeVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNvdW50cnlcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykudGV4dCh2YWx1ZUluZm9OYW1lKTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0cGxpVG9rZW5EZXN0aW5hdGlvbi5hcHBlbmQoZGVzdGluYXRpb25JbmZvKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJlc29sdmVzIHRoZSBzdGF0aWMgdG9rZW4gZGVzdGluYXRpb25cclxuXHQgKiBAcGFyYW0gc3RyaW5nVGV4dFxyXG5cdCAqIEBwYXJhbSB0b2tlblxyXG5cdCAqIEBwYXJhbSBkYXRhVmFsdWVcclxuXHQgKi9cclxuXHRyZXNvbHZlU3RhdGljVG9rZW5zS2V5U2FsdWRvQ29tcGxlbWVudGFyaW8oc3RyaW5nVGV4dDogc3RyaW5nLCB0b2tlblZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0Ly8gaWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24pIHtcclxuXHRcdHRoaXMuZW5hYmxlRGVzdGluYXRpb24gPSB0cnVlO1xyXG5cdFx0dGhpcy5hZGRJbmZvVG9rZW5TYWx1ZG9Db21wbGVtZW50YXJpbygpO1xyXG5cdFx0Y29uc3QgcGxpVG9rZW5EZXN0aW5hdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGktdG9rZW4tY29tcGxlbWVudGFyeS1ncmVldGluZycpO1xyXG5cdFx0bGV0IGh0bWwgPSAnJztcclxuXHRcdGlmIChwbGlUb2tlbkRlc3RpbmF0aW9uKSB7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnJlbW92ZUNvbW1lbnRzSHRtbChwbGlUb2tlbkRlc3RpbmF0aW9uLmlubmVySFRNTCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKHN0cmluZ1RleHQsIHRva2VuVmFsdWUsIGh0bWwpO1xyXG5cdFx0Ly8gfVxyXG5cdFx0Ly8gcmV0dXJuIHN0cmluZ1RleHQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKlxyXG5cdCAqL1xyXG5cdGFkZEluZm9Ub2tlblNhbHVkb0NvbXBsZW1lbnRhcmlvKCkge1xyXG5cdFx0bGV0IHBsaVRva2VuRGVzdGluYXRpb24gPSAkKCcjcGxpLXRva2VuLWNvbXBsZW1lbnRhcnktZ3JlZXRpbmcnKTtcclxuXHRcdHBsaVRva2VuRGVzdGluYXRpb24uZW1wdHkoKTtcclxuXHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uKSB7XHJcblx0XHRcdGxldCBkZXN0aW5hdGlvbkluZm8gPSAkKCc8ZGl2PjwvZGl2PicpO1xyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5ncmVldGluZykge1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5odG1sKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uZ3JlZXRpbmcpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlKSB7XHJcblx0XHRcdFx0Y29uc3QgdmFsdWVUZXh0ID1cclxuXHRcdFx0XHRcdChkZXN0aW5hdGlvbkluZm8uaHRtbCgpLmxlbmd0aCA9PSAwID8gJycgOiAnICcpICtcclxuXHRcdFx0XHRcdHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGU7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmh0bWwoZGVzdGluYXRpb25JbmZvLmh0bWwoKSArIHZhbHVlVGV4dCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWUpIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvTmFtZSA9IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWVcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHRjb25zdCB2YWx1ZVRleHQgPVxyXG5cdFx0XHRcdFx0KGRlc3RpbmF0aW9uSW5mby5odG1sKCkubGVuZ3RoID09IDAgPyAnJyA6ICcgJykgK1xyXG5cdFx0XHRcdFx0JzxzdHJvbmc+JyArXHJcblx0XHRcdFx0XHR2YWx1ZUluZm9OYW1lICtcclxuXHRcdFx0XHRcdCc8L3N0cm9uZz4nO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5odG1sKGRlc3RpbmF0aW9uSW5mby5odG1sKCkgKyB2YWx1ZVRleHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHBsaVRva2VuRGVzdGluYXRpb24uYXBwZW5kKGRlc3RpbmF0aW9uSW5mbyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlbW92ZUNvbW1lbnRzSHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGh0bWwgPyBodG1sLnJlcGxhY2UoLzwhLS1bXFxzXFxTXSo/LS0+L2csICcnKSA6IGh0bWw7XHJcblx0fVxyXG5cclxuXHRyZXNvbHZlU3RhdGljVG9rZW5zS2V5U2lnbihodG1sLCB0b2tlblZhbHVlOiBhbnksIHN1YlRva2VuOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcblx0XHRsZXQgY29udGFpbmVyID0gJCgnPGRpdj48L2Rpdj4nKTtcclxuXHRcdGxldCBpbWcgPSAkKCc8aW1nIGlkPVwiJyArIFRva2VuU2VydmljZS5TSUdOX0xFVFRFUl9UQUdfSUQgKyAnXCI+Jyk7XHJcblx0XHRpbWcuYXR0cignc3JjJywgJycpO1xyXG5cdFx0aWYgKHN1YlRva2VuLmxlbmd0aCA+IDIpIHtcclxuXHRcdFx0aW1nLmF0dHIoJ3dpZHRoJywgc3ViVG9rZW5bMl0udG9TdHJpbmcoKSk7XHJcblx0XHR9XHJcblx0XHRpZiAoc3ViVG9rZW4ubGVuZ3RoID4gMykge1xyXG5cdFx0XHRpbWcuYXR0cignaGVpZ2h0Jywgc3ViVG9rZW5bM10udG9TdHJpbmcoKSk7XHJcblx0XHR9XHJcblx0XHRpZiAoc3ViVG9rZW4ubGVuZ3RoID4gNCkge1xyXG5cdFx0XHRpbWcuYXR0cignbmFtZScsIHN1YlRva2VuWzRdLnRvU3RyaW5nKCkpO1xyXG5cdFx0fVxyXG5cdFx0Y29udGFpbmVyLmFwcGVuZChpbWcpO1xyXG5cdFx0Ly8gcmV0dXJuIGNvbnRhaW5lci5odG1sKCk7XHJcblx0XHRyZXR1cm4gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuVmFsdWUsIGNvbnRhaW5lci5odG1sKCkpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRSdWJyb0xhYmVsKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdlcydcclxuXHRcdFx0PyAnUnVicm8nXHJcblx0XHRcdDogdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdkZSdcclxuXHRcdFx0PyAnUG9zdGVuJ1xyXG5cdFx0XHQ6ICdJdGVtJztcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0VG90YWxMYWJlbCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZXMnXHJcblx0XHRcdD8gJ1RvdGFsJ1xyXG5cdFx0XHQ6IHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZGUnXHJcblx0XHRcdD8gJ0dlc2FtdCdcclxuXHRcdFx0OiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2ZyJ1xyXG5cdFx0XHQ/ICdUb3RhbCdcclxuXHRcdFx0OiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2l0J1xyXG5cdFx0XHQ/ICdUb3RhbGUnXHJcblx0XHRcdDogJ0l0ZW0nO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRZZWFyTGFiZWwoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2VzJ1xyXG5cdFx0XHQ/ICdBw7FvJ1xyXG5cdFx0XHQ6IHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZGUnXHJcblx0XHRcdD8gJ0phaHInXHJcblx0XHRcdDogdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdmcidcclxuXHRcdFx0PyAnQW5uw6llJ1xyXG5cdFx0XHQ6IHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnaXQnXHJcblx0XHRcdD8gJ0Fubm8nXHJcblx0XHRcdDogJ1llYXInO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICpcclxuXHQgKi9cclxuXHRhZGRJbmZvVG9rZW5SZXN1bWVDYXRlZ29yeVllYXIoXHJcblx0XHR0cHJlc0NvZGlnbzogbnVtYmVyLFxyXG5cdFx0aWRUb3RhbEJ1ZGdldDogc3RyaW5nLFxyXG5cdFx0YnVkZ2V0RHRvOiBCdWRnZXREdG9cclxuXHQpIHtcclxuXHRcdGlmICh0cHJlc0NvZGlnbyA9PSBFVGlwb1ByZXN1cHVlc3RvLlBSSU1BUlkpIHtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHR9XHJcblx0XHRsZXQgcmVzdW1lQ2F0ZWdvcnlZZWFyQ29udGVudCA9ICQoJyMnICsgaWRUb3RhbEJ1ZGdldCk7XHJcblx0XHRyZXN1bWVDYXRlZ29yeVllYXJDb250ZW50LmVtcHR5KCk7XHJcblx0XHRpZiAoYnVkZ2V0RHRvICYmIGJ1ZGdldER0by5idWRnZXQgJiYgYnVkZ2V0RHRvLmJ1ZGdldC5zdW1tYXJ5KSB7XHJcblx0XHRcdGNvbnN0IHN1bW1hcnkgPSBidWRnZXREdG8uYnVkZ2V0LnN1bW1hcnk7XHJcblx0XHRcdGNvbnN0IHRhYmxlID0gJCgnPHRhYmxlPjwvdGFibGU+Jyk7XHJcblx0XHRcdHRhYmxlLmNzcygnYm9yZGVyLXNwYWNpbmcnLCAnMnB4Jyk7XHJcblx0XHRcdHRhYmxlLmNzcygnYm9yZGVyLWNvbGxhcHNlJywgJ2NvbGxhcHNlJyk7XHJcblx0XHRcdC8vdGhlYWRcclxuXHRcdFx0Y29uc3QgdGhlYWQgPSAkKCc8dGhlYWQ+JykuYXBwZW5kVG8odGFibGUpO1xyXG5cdFx0XHRjb25zdCB0aFJ1YnJvID0gJCgnPHRoPicsIHsgaHRtbDogdGhpcy5nZXRSdWJyb0xhYmVsKCkgfSkuYXBwZW5kVG8odGhlYWQpO1xyXG5cdFx0XHR0aFJ1YnJvLmNzcygndGV4dC1hbGlnbicsICdjZW50ZXInKTtcclxuXHRcdFx0dGhSdWJyby5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0dGhSdWJyby5jc3MoJ2NvbG9yJywgJ3doaXRlJyk7XHJcblx0XHRcdHRoUnVicm8uY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2dyZXknKTtcclxuXHRcdFx0bGV0IGl0ZXJhY2lvbkFuaW8gPSAwO1xyXG5cdFx0XHRmb3IgKGNvbnN0IHllYXIgb2Ygc3VtbWFyeS55ZWFycykge1xyXG5cdFx0XHRcdGNvbnN0IHRoWWVhciA9ICQoJzx0aD4nLCB7IGh0bWw6IHRoaXMuZ2V0WWVhckxhYmVsKCkgKyArK2l0ZXJhY2lvbkFuaW8gfSkuYXBwZW5kVG8oXHJcblx0XHRcdFx0XHR0aGVhZFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0dGhZZWFyLmNzcygndGV4dC1hbGlnbicsICdjZW50ZXInKTtcclxuXHRcdFx0XHR0aFllYXIuY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdFx0dGhZZWFyLmNzcygnY29sb3InLCAnd2hpdGUnKTtcclxuXHRcdFx0XHR0aFllYXIuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2dyZXknKTtcclxuXHRcdFx0XHR0aFllYXIuY3NzKCd3aWR0aCcsICc4MHB4Jyk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgdG90YWxMYWJlbCA9ICcmbmJzcDsnICsgdGhpcy5nZXRUb3RhbExhYmVsKCkgKyBzdW1tYXJ5LmJhc2VDdXJyZW5jeSArICcmbmJzcDsnO1xyXG5cdFx0XHRjb25zdCB0aFRvdGFsID0gJCgnPHRoPicsIHsgaHRtbDogdG90YWxMYWJlbCB9KS5hcHBlbmRUbyh0aGVhZCk7XHJcblx0XHRcdHRoVG90YWwuY3NzKCd0ZXh0LWFsaWduJywgJ2NlbnRlcicpO1xyXG5cdFx0XHR0aFRvdGFsLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHR0aFRvdGFsLmNzcygnY29sb3InLCAnd2hpdGUnKTtcclxuXHRcdFx0dGhUb3RhbC5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnZ3JleScpO1xyXG5cdFx0XHR0aFRvdGFsLmNzcygnd2lkdGgnLCAnODBweCcpO1xyXG5cdFx0XHQvL3Rib2R5XHJcblx0XHRcdGxldCB0Ym9keSA9ICQoJzx0Ym9keT4nKS5hcHBlbmRUbyh0YWJsZSk7XHJcblx0XHRcdGZvciAobGV0IGlDYXQgPSAwOyBpQ2F0IDwgc3VtbWFyeS5jYXRlZ29yaWVzLmxlbmd0aDsgaUNhdCsrKSB7XHJcblx0XHRcdFx0Y29uc3QgdHIgPSAkKCc8dHI+JykuYXBwZW5kVG8odGJvZHkpO1xyXG5cdFx0XHRcdGNvbnN0IGNhdGVnb3J5ID0gc3VtbWFyeS5jYXRlZ29yaWVzW2lDYXRdO1xyXG5cdFx0XHRcdGNvbnN0IHJ1YnJvTGFiZWwgPVxyXG5cdFx0XHRcdFx0JyZuYnNwOyZuYnNwOycgK1xyXG5cdFx0XHRcdFx0dGhpcy50cmFuc2xhdGVDYXRlZ29yeShjYXRlZ29yeS5jYXRlZ29yeSkgK1xyXG5cdFx0XHRcdFx0JyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyc7XHJcblx0XHRcdFx0Y29uc3QgdGRSdWJybyA9ICQoJzx0ZD4nLCB7IGh0bWw6IHJ1YnJvTGFiZWwgfSkuYXBwZW5kVG8odHIpO1xyXG5cdFx0XHRcdHRkUnVicm8uY3NzKCd0ZXh0LWFsaWduJywgJ2xlZnQnKTtcclxuXHRcdFx0XHR0ZFJ1YnJvLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHRcdHRkUnVicm8uY3NzKCdmb250LXdlaWdodCcsICdib2xkJyk7XHJcblx0XHRcdFx0Zm9yIChjb25zdCB5ZWFyIG9mIGNhdGVnb3J5LnllYXJzKSB7XHJcblx0XHRcdFx0XHRjb25zdCB5ZWFyVG90YWwgPVxyXG5cdFx0XHRcdFx0XHR5ZWFyLnRvdGFsID09IDBcclxuXHRcdFx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0XHRcdDogdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKHllYXIudG90YWwsICdkZWZhdWx0JywgJycsICcxLjAtMCcpO1xyXG5cdFx0XHRcdFx0Y29uc3QgeWVhckxhYmVsVG90YWwgPSAnJm5ic3A7Jm5ic3A7JyArIHllYXJUb3RhbCArICcmbmJzcDsmbmJzcDsnO1xyXG5cdFx0XHRcdFx0Y29uc3QgdGRZZWFyID0gJCgnPHRkPicsIHsgaHRtbDogeWVhckxhYmVsVG90YWwgfSkuYXBwZW5kVG8odHIpO1xyXG5cdFx0XHRcdFx0dGRZZWFyLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpO1xyXG5cdFx0XHRcdFx0dGRZZWFyLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBjYXRlZ29yeVRvdGFsID1cclxuXHRcdFx0XHRcdGNhdGVnb3J5LnRvdGFsID09IDBcclxuXHRcdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdFx0OiB0aGlzLmN1cnJlbmN5UGlwZS50cmFuc2Zvcm0oY2F0ZWdvcnkudG90YWwsICdkZWZhdWx0JywgJycsICcxLjAtMCcpO1xyXG5cdFx0XHRcdGNvbnN0IGNhdGVnb3J5TGFiZWxUb3RhbCA9ICcmbmJzcDsmbmJzcDsnICsgY2F0ZWdvcnlUb3RhbCArICcmbmJzcDsmbmJzcDsnO1xyXG5cdFx0XHRcdGNvbnN0IHRkVG90YWwgPSAkKCc8dGQ+JywgeyBodG1sOiBjYXRlZ29yeUxhYmVsVG90YWwgfSkuYXBwZW5kVG8odHIpO1xyXG5cdFx0XHRcdHRkVG90YWwuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0Jyk7XHJcblx0XHRcdFx0dGRUb3RhbC5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0XHR0ZFRvdGFsLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IHRyRmluYWwgPSAkKCc8dHI+JykuYXBwZW5kVG8odGJvZHkpO1xyXG5cdFx0XHRjb25zdCBiYXNlQ3VycmVuY3kgPSB0aGlzLmdldFRvdGFsTGFiZWwoKSArICcgJyArIHN1bW1hcnkuYmFzZUN1cnJlbmN5ICsgJyZuYnNwOyZuYnNwOyc7XHJcblx0XHRcdGNvbnN0IHRkRmluYWxUb3RhbEJDID0gJCgnPHRkPicsIHsgaHRtbDogYmFzZUN1cnJlbmN5IH0pLmFwcGVuZFRvKHRyRmluYWwpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWxCQy5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsQkMuY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdHRkRmluYWxUb3RhbEJDLmNzcygnY29sb3InLCAnd2hpdGUnKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsQkMuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2dyZXknKTtcclxuXHRcdFx0bGV0IGJ1ZGdldFRvdGFsID0gMDtcclxuXHRcdFx0Zm9yIChjb25zdCB5ZWFyIG9mIHN1bW1hcnkueWVhcnMpIHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyVG90YWwgPVxyXG5cdFx0XHRcdFx0eWVhci50b3RhbCA9PSAwXHJcblx0XHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHRcdDogdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKHllYXIudG90YWwsICdkZWZhdWx0JywgJycsICcxLjAtMCcpO1xyXG5cdFx0XHRcdGNvbnN0IHllYXJMYWJlbFRvdGFsID0geWVhclRvdGFsICsgJyZuYnNwOyZuYnNwOyc7XHJcblx0XHRcdFx0Y29uc3QgdGRZZWFyID0gJCgnPHRkPicsIHsgaHRtbDogeWVhckxhYmVsVG90YWwgfSkuYXBwZW5kVG8odHJGaW5hbCk7XHJcblx0XHRcdFx0dGRZZWFyLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpO1xyXG5cdFx0XHRcdHRkWWVhci5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0XHR0ZFllYXIuY3NzKCdjb2xvcicsICd3aGl0ZScpO1xyXG5cdFx0XHRcdHRkWWVhci5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnZ3JleScpO1xyXG5cdFx0XHRcdGJ1ZGdldFRvdGFsICs9IHllYXIudG90YWw7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgdG90YWxCYXNlQ3VycmVuY3kgPVxyXG5cdFx0XHRcdGJ1ZGdldFRvdGFsID09IDBcclxuXHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHQ6IHRoaXMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShidWRnZXRUb3RhbCwgJ2RlZmF1bHQnLCAnJywgJzEuMC0wJyk7XHJcblx0XHRcdGNvbnN0IHRvdGFsTGFiZWxCYXNlQ3VycmVuY3kgPSAnJm5ic3A7Jm5ic3A7JyArIHRvdGFsQmFzZUN1cnJlbmN5ICsgJyZuYnNwOyZuYnNwOyc7XHJcblx0XHRcdGNvbnN0IHRkRmluYWxUb3RhbCA9ICQoJzx0ZD4nLCB7IGh0bWw6IHRvdGFsTGFiZWxCYXNlQ3VycmVuY3kgfSkuYXBwZW5kVG8odHJGaW5hbCk7XHJcblx0XHRcdHRkRmluYWxUb3RhbC5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWwuY3NzKCdjb2xvcicsICd3aGl0ZScpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWwuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2dyZXknKTtcclxuXHRcdFx0cmVzdW1lQ2F0ZWdvcnlZZWFyQ29udGVudC5hcHBlbmQodGFibGUpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCI8ZGl2IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBpZD1cInBsaS10b2tlbi1kZXN0aW5hdGlvblwiPlxyXG5cdDwhLS0gPGRpdiAqbmdJZj1cImRhdGEgIT0gdW5kZWZpbmVkICYmIGRhdGEuZGF0YURlc3RpbmF0aW9uICE9IHVuZGVmaW5lZFwiPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24udGV4dCAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi50ZXh0fX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGUgIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgIHt7ZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5uYW1lICE9IHVuZGVmaW5lZCB8fCBkYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZSAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPHN0cm9uZz57e2RhdGEuZGF0YURlc3RpbmF0aW9uLm5hbWV9fSB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lfX08L3N0cm9uZz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24uY2FyZ28gIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgIHt7ZGF0YS5kYXRhRGVzdGluYXRpb24uY2FyZ299fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5vY2N1cGF0aW9uICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLm9jY3VwYXRpb259fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5jb21wYW55ICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLmNvbXBhbnl9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzICE9IHVuZGVmaW5lZCB8fCBkYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzRGV0YWlscyAhPSB1bmRlZmluZWQgXCI+XHJcbiAgICAgICAgICAgIHt7ZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzc319IHt7ZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzc0RldGFpbHN9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5jaXR5ICE9IHVuZGVmaW5lZCB8fCBkYXRhLmRhdGFEZXN0aW5hdGlvbi5jb3VudHJ5ICE9IHVuZGVmaW5lZCBcIj5cclxuICAgICAgICAgICAge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5jaXR5fX08c3BhbiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLmNpdHkgIT0gdW5kZWZpbmVkICYmIGRhdGEuZGF0YURlc3RpbmF0aW9uLmNvdW50cnkgIT0gdW5kZWZpbmVkXCI+LDwvc3Bhbj57e2RhdGEuZGF0YURlc3RpbmF0aW9uLmNvdW50cnl9fVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PiAtLT5cclxuPC9kaXY+XHJcbjwhLS0gQ29tcGxlbWVudGFyeSBncmVldGluZy0tPlxyXG48ZGl2IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBpZD1cInBsaS10b2tlbi1jb21wbGVtZW50YXJ5LWdyZWV0aW5nXCI+XHJcblx0PCEtLSA8ZGl2XHJcblx0XHQqbmdJZj1cIlxyXG5cdFx0XHRkYXRhICE9IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRkYXRhLmRhdGFEZXN0aW5hdGlvbiAhPSB1bmRlZmluZWQgJiZcclxuXHRcdFx0ZGF0YS5kYXRhRGVzdGluYXRpb24udGFyZ2V0SWQgPT0gMiAmJlxyXG5cdFx0XHRkYXRhLmRhdGFEZXN0aW5hdGlvbi5ncmVldGluZyAhPSB1bmRlZmluZWRcclxuXHRcdFwiXHJcblx0PlxyXG5cdFx0e3sgZGF0YS5kYXRhRGVzdGluYXRpb24uZ3JlZXRpbmdcclxuXHRcdH19PHNwYW4gKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZSAhPSB1bmRlZmluZWRcIlxyXG5cdFx0XHQ+Jm5ic3A7e3sgZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGUgfX08L3NwYW5cclxuXHRcdD48c3BhbiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lICE9IHVuZGVmaW5lZFwiXHJcblx0XHRcdD4mbmJzcDt7eyBkYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZSB9fTwvc3BhblxyXG5cdFx0PjpcclxuXHQ8L2Rpdj4tLT5cclxuPC9kaXY+XHJcblxyXG48IS0tIFByaW1hcnkgYnVkZ2V0IHRvdGFsIHN1bW1hcnkgJHtwcmVzdXB1ZXN0b18yODhfcmVzdW1lQ2F0ZWdvcnlZZWFyfSAtLT5cclxuPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgaWQ9XCJwbGktdG9rZW4tcHJpbmNpcGFsLWJ1ZGdldC10b3RhbC1zdW1tYXJ5XCI+XHJcblx0PCEtLSA8ZGl2PlxyXG5cdFx0PHRhYmxlXHJcblx0XHRcdCpuZ0lmPVwiXHJcblx0XHRcdFx0YnVkZ2V0RHRvUHJpbWFyeSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0ICYmXHJcblx0XHRcdFx0YnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeVxyXG5cdFx0XHRcIlxyXG5cdFx0XHRzdHlsZT1cImJvcmRlci1zcGFjaW5nOiAycHg7Ym9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcIlxyXG5cdFx0PlxyXG5cdFx0XHQ8dGhlYWQ+XHJcblx0XHRcdFx0PHRyIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7XCI+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGNvbG9yOiB3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1wiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdFJ1YnJvXHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdCpuZ0Zvcj1cImxldCB5ZWFyIG9mIGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnkueWVhcnNcIlxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgY29sb3I6IHdoaXRlO2JhY2tncm91bmQtY29sb3I6IGdyZXk7IHdpZHRoOjgwcHg7XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0e3sgeWVhci55ZWFyTnVtYmVyIH19XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBjb2xvcjogd2hpdGU7YmFja2dyb3VuZC1jb2xvcjogZ3JleTsgd2lkdGg6IDExMHB4O1wiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdFRvdGFsICh7eyBidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJhc2VDdXJyZW5jeSB9fSlcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PC90cj5cclxuXHRcdFx0PC90aGVhZD5cclxuXHRcdFx0PHRib2R5PlxyXG5cdFx0XHRcdDx0clxyXG5cdFx0XHRcdFx0Km5nRm9yPVwiXHJcblx0XHRcdFx0XHRcdGxldCBjYXRlZ29yeSBvZiBidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5LmNhdGVnb3JpZXM7XHJcblx0XHRcdFx0XHRcdGxldCBpQ2F0ID0gaW5kZXhcclxuXHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7dGV4dC1hbGlnbjogbGVmdDtib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIj5cclxuXHRcdFx0XHRcdFx0Jm5ic3A7Jm5ic3A7e3tcclxuXHRcdFx0XHRcdFx0XHR0cmFuc2xhdGVDYXRlZ29yeShjYXRlZ29yeS5jYXRlZ29yeSlcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHllYXIgb2YgY2F0ZWdvcnkueWVhcnNcIlxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHQmbmJzcDsmbmJzcDt7e1xyXG5cdFx0XHRcdFx0XHRcdHllYXIudG90YWwgPT0gMCA/ICctJyA6ICh5ZWFyLnRvdGFsIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiByaWdodDtib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIj5cclxuXHRcdFx0XHRcdFx0Jm5ic3A7Jm5ic3A7e3tcclxuXHRcdFx0XHRcdFx0XHRjYXRlZ29yeS50b3RhbCA9PSAwXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0XHRcdFx0OiAoY2F0ZWdvcnkudG90YWwgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0PHRyIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7XCI+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgY29sb3I6IHdoaXRlO2JhY2tncm91bmQtY29sb3I6IGdyZXk7XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0VG90YWwgKHt7IGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnkuYmFzZUN1cnJlbmN5IH19KSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgeWVhciBvZiBidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5LnllYXJzXCJcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgY29sb3I6IHdoaXRlO2JhY2tncm91bmQtY29sb3I6IGdyZXk7IFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdHt7XHJcblx0XHRcdFx0XHRcdFx0eWVhci50b3RhbCA9PSAwID8gJy0nIDogKHllYXIudG90YWwgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGNvbG9yOiB3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1wiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdHt7XHJcblx0XHRcdFx0XHRcdFx0YnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbCA9PSAwXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbFxyXG5cdFx0XHRcdFx0XHRcdFx0ICB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PC90cj5cclxuXHRcdFx0PC90Ym9keT5cclxuXHRcdDwvdGFibGU+XHJcblx0PC9kaXY+IC0tPlxyXG48L2Rpdj5cclxuPCEtLSBTZWN1bmRhcnkgYnVkZ2V0IHRvdGFsIHN1bW1hcnkgJHtwcmVzdXB1ZXN0b18yODhfcmVzdW1lQ2F0ZWdvcnlZZWFyfSAtLT5cclxuPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgaWQ9XCJwbGktdG9rZW4tc2VjdW5kYXJ5LWJ1ZGdldC10b3RhbC1zdW1tYXJ5XCI+XHJcblx0PGRpdj5cclxuXHRcdDx0YWJsZVxyXG5cdFx0XHQqbmdJZj1cIlxyXG5cdFx0XHRcdGJ1ZGdldER0b1NlY3VuZGFyeSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQgJiZcclxuXHRcdFx0XHRidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnlcclxuXHRcdFx0XCJcclxuXHRcdFx0c3R5bGU9XCJib3JkZXItc3BhY2luZzogMnB4OyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogMTAwJTtcIlxyXG5cdFx0PlxyXG5cdFx0XHQ8dGhlYWQ+XHJcblx0XHRcdFx0PHRyIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7XCI+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJcclxuXHRcdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XHJcblx0XHRcdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcblx0XHRcdFx0XHRcdFx0Y29sb3I6IHdoaXRlO1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IGdyZXk7XHJcblx0XHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdFJ1YnJvXHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdCpuZ0Zvcj1cImxldCB5ZWFyIG9mIGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeS55ZWFyc1wiXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwiXHJcblx0XHRcdFx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdFx0XHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiB3aGl0ZTtcclxuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1xyXG5cdFx0XHRcdFx0XHRcdHdpZHRoOiA4MHB4O1xyXG5cdFx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHR7eyB5ZWFyLnllYXJOdW1iZXIgfX1cclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJcclxuXHRcdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XHJcblx0XHRcdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcblx0XHRcdFx0XHRcdFx0Y29sb3I6IHdoaXRlO1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IGdyZXk7XHJcblx0XHRcdFx0XHRcdFx0d2lkdGg6IDExMHB4O1xyXG5cdFx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRUb3RhbCAoe3sgYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJhc2VDdXJyZW5jeSB9fSlcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PC90cj5cclxuXHRcdFx0PC90aGVhZD5cclxuXHRcdFx0PHRib2R5PlxyXG5cdFx0XHRcdDx0clxyXG5cdFx0XHRcdFx0Km5nRm9yPVwiXHJcblx0XHRcdFx0XHRcdGxldCBjYXRlZ29yeSBvZiBidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnkuY2F0ZWdvcmllcztcclxuXHRcdFx0XHRcdFx0bGV0IGlDYXQgPSBpbmRleFxyXG5cdFx0XHRcdFx0XCJcclxuXHRcdFx0XHQ+XHJcblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogbGVmdDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XCI+XHJcblx0XHRcdFx0XHRcdCZuYnNwOyZuYnNwO3t7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNsYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkuY2F0ZWdvcnkpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdCpuZ0Zvcj1cImxldCB5ZWFyIG9mIGNhdGVnb3J5LnllYXJzXCJcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0Jm5ic3A7Jm5ic3A7e3tcclxuXHRcdFx0XHRcdFx0XHR5ZWFyLnRvdGFsID09IDAgPyAnLScgOiAoeWVhci50b3RhbCB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogcmlnaHQ7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQmbmJzcDsmbmJzcDt7e1xyXG5cdFx0XHRcdFx0XHRcdGNhdGVnb3J5LnRvdGFsID09IDBcclxuXHRcdFx0XHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHRcdFx0XHQ6IChjYXRlZ29yeS50b3RhbCB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHQ8dHIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDtcIj5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cIlxyXG5cdFx0XHRcdFx0XHRcdHRleHQtYWxpZ246IHJpZ2h0O1xyXG5cdFx0XHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiB3aGl0ZTtcclxuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1xyXG5cdFx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRUb3RhbCAoe3sgYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJhc2VDdXJyZW5jeSB9fSkmbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHllYXIgb2YgYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5LnllYXJzXCJcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJcclxuXHRcdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiByaWdodDtcclxuXHRcdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCBibGFjaztcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogd2hpdGU7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcclxuXHRcdFx0XHRcdFx0XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0e3tcclxuXHRcdFx0XHRcdFx0XHR5ZWFyLnRvdGFsID09IDAgPyAnLScgOiAoeWVhci50b3RhbCB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJcclxuXHRcdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiByaWdodDtcclxuXHRcdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCBibGFjaztcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogd2hpdGU7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcclxuXHRcdFx0XHRcdFx0XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0e3tcclxuXHRcdFx0XHRcdFx0XHRidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnkuYnVkZ2V0VG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdFx0XHRcdDogKGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbFxyXG5cdFx0XHRcdFx0XHRcdFx0ICB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PC90cj5cclxuXHRcdFx0PC90Ym9keT5cclxuXHRcdDwvdGFibGU+XHJcblx0PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|