ng-pli-commons 1.0.113 → 1.0.116
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/fesm2022/ng-pli-commons.mjs +697 -684
- package/fesm2022/ng-pli-commons.mjs.map +1 -1
- package/package.json +3 -7
- package/esm2022/lib/components/backoffice.commons.component.mjs +0 -40
- package/esm2022/lib/components/common.lists.component.mjs +0 -176
- package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +0 -23
- package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +0 -665
- package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
- package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
- package/esm2022/lib/components/configuration.commons.component.mjs +0 -40
- package/esm2022/lib/components/dashboard.commons.component.mjs +0 -84
- package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
- package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
- package/esm2022/lib/components/frontoffice.commons.component.mjs +0 -88
- package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
- package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +0 -170
- package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +0 -207
- package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
- package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
- package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +0 -92
- package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
- package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +0 -200
- package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
- package/esm2022/lib/components/token/token.component.mjs +0 -1047
- package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
- package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +0 -47
- package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +0 -34
- package/esm2022/lib/ng-pli-commons.module.mjs +0 -385
- package/esm2022/lib/ng-pli-commons.service.mjs +0 -14
- package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
- package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +0 -36
- package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +0 -33
- package/esm2022/lib/pipes/thousands.pipe.mjs +0 -60
- package/esm2022/lib/services/application-fill-percentage.service.mjs +0 -30
- package/esm2022/lib/services/application-pdf-form.service.mjs +0 -27
- package/esm2022/lib/services/application-tag.service.mjs +0 -56
- package/esm2022/lib/services/application.service.mjs +0 -253
- package/esm2022/lib/services/assign-task.service.mjs +0 -30
- package/esm2022/lib/services/authentication.service.mjs +0 -133
- package/esm2022/lib/services/blocked-beneficiary.service.mjs +0 -42
- package/esm2022/lib/services/budget-application.service.mjs +0 -265
- package/esm2022/lib/services/budget-setup.service.mjs +0 -26
- package/esm2022/lib/services/budget-simulation.service.mjs +0 -65
- package/esm2022/lib/services/budget.service.mjs +0 -205
- package/esm2022/lib/services/closure-wallet.service.mjs +0 -39
- package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +0 -39
- package/esm2022/lib/services/codebtors.service.mjs +0 -28
- package/esm2022/lib/services/committee-assistant.service.mjs +0 -55
- package/esm2022/lib/services/committee-money.service.mjs +0 -44
- package/esm2022/lib/services/committee-pdf.service.mjs +0 -27
- package/esm2022/lib/services/committee-snapshot.service.mjs +0 -60
- package/esm2022/lib/services/common-info.service.mjs +0 -51
- package/esm2022/lib/services/common.service.mjs +0 -285
- package/esm2022/lib/services/configuration-document.service.mjs +0 -297
- package/esm2022/lib/services/configuration-minisite.service.mjs +0 -26
- package/esm2022/lib/services/configuration.service.mjs +0 -53
- package/esm2022/lib/services/correspondence-document-category.service.mjs +0 -31
- package/esm2022/lib/services/correspondence-manager.service.mjs +0 -67
- package/esm2022/lib/services/credit-score.service.mjs +0 -48
- package/esm2022/lib/services/credit-study.service.mjs +0 -292
- package/esm2022/lib/services/cube.service.mjs +0 -27
- package/esm2022/lib/services/data-form-history.service.mjs +0 -25
- package/esm2022/lib/services/data-form.service.mjs +0 -176
- package/esm2022/lib/services/data-letter-segmentation.service.mjs +0 -64
- package/esm2022/lib/services/document-analysis-auto.service.mjs +0 -27
- package/esm2022/lib/services/document-history.service.mjs +0 -43
- package/esm2022/lib/services/document-management.service.mjs +0 -57
- package/esm2022/lib/services/document-process.service.mjs +0 -27
- package/esm2022/lib/services/document-validation-attempt.service.mjs +0 -32
- package/esm2022/lib/services/document.service.mjs +0 -144
- package/esm2022/lib/services/documentary.type.service.mjs +0 -69
- package/esm2022/lib/services/email.service.mjs +0 -30
- package/esm2022/lib/services/evaluation.service.mjs +0 -181
- package/esm2022/lib/services/export-excel.service.mjs +0 -32
- package/esm2022/lib/services/file.service.mjs +0 -153
- package/esm2022/lib/services/form.service.mjs +0 -112
- package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +0 -31
- package/esm2022/lib/services/gic-client.service.mjs +0 -49
- package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +0 -31
- package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +0 -34
- package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +0 -30
- package/esm2022/lib/services/gic-collection.service.mjs +0 -53
- package/esm2022/lib/services/gic-disbursement.service.mjs +0 -39
- package/esm2022/lib/services/gic-extract.service.mjs +0 -41
- package/esm2022/lib/services/gic-log.service.mjs +0 -41
- package/esm2022/lib/services/gic-payment-application.service.mjs +0 -35
- package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +0 -27
- package/esm2022/lib/services/gic-payment-plan.service.mjs +0 -32
- package/esm2022/lib/services/gic-trm.service.mjs +0 -27
- package/esm2022/lib/services/global.show.task.service.mjs +0 -37
- package/esm2022/lib/services/guarantee-document.service.mjs +0 -52
- package/esm2022/lib/services/guarantee-enrollment.service.mjs +0 -37
- package/esm2022/lib/services/guarantee.service.mjs +0 -128
- package/esm2022/lib/services/guarantees-summary-service.mjs +0 -26
- package/esm2022/lib/services/hash.service.mjs +0 -36
- package/esm2022/lib/services/import-data.service.mjs +0 -27
- package/esm2022/lib/services/import-excel-gic.service.mjs +0 -53
- package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +0 -51
- package/esm2022/lib/services/initial-record.service.mjs +0 -51
- package/esm2022/lib/services/integration-ado.service.mjs +0 -54
- package/esm2022/lib/services/interaction-application-user.service.mjs +0 -81
- package/esm2022/lib/services/interest-adjustment.service.mjs +0 -34
- package/esm2022/lib/services/keys-assignation.service.mjs +0 -127
- package/esm2022/lib/services/legalization.service.mjs +0 -150
- package/esm2022/lib/services/letter-campaing.service.mjs +0 -49
- package/esm2022/lib/services/letter-task-mapping.service.mjs +0 -40
- package/esm2022/lib/services/log.service.mjs +0 -41
- package/esm2022/lib/services/maintenance.service.mjs +0 -86
- package/esm2022/lib/services/master-category.service.mjs +0 -66
- package/esm2022/lib/services/master-program.service.mjs +0 -78
- package/esm2022/lib/services/master-university.service.mjs +0 -79
- package/esm2022/lib/services/migration-plis.service.mjs +0 -27
- package/esm2022/lib/services/migration-survey-queue.service.mjs +0 -24
- package/esm2022/lib/services/openkm-document.service.mjs +0 -27
- package/esm2022/lib/services/page.service.mjs +0 -38
- package/esm2022/lib/services/partner-system.service.mjs +0 -30
- package/esm2022/lib/services/partner.service.mjs +0 -34
- package/esm2022/lib/services/pdf-analyzer.service.mjs +0 -33
- package/esm2022/lib/services/people-master.service.mjs +0 -42
- package/esm2022/lib/services/permission.service.mjs +0 -29
- package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +0 -41
- package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +0 -54
- package/esm2022/lib/services/pli-cnf-budget.service.mjs +0 -31
- package/esm2022/lib/services/pli-cnf-cloning.service.mjs +0 -27
- package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +0 -30
- package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-committee.service.mjs +0 -66
- package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +0 -90
- package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +0 -41
- package/esm2022/lib/services/pli-cnf-document-management.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +0 -52
- package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +0 -31
- package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
- package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +0 -95
- package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +0 -68
- package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +0 -46
- package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-header.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-indicator.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-information-system.service.mjs +0 -24
- package/esm2022/lib/services/pli-cnf-interaction.service.mjs +0 -78
- package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +0 -29
- package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +0 -48
- package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +0 -28
- package/esm2022/lib/services/pli-cnf-mail.service.mjs +0 -30
- package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +0 -44
- package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +0 -66
- package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +0 -25
- package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +0 -31
- package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +0 -49
- package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-scenario.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +0 -72
- package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +0 -74
- package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +0 -56
- package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-support-document.service.mjs +0 -56
- package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +0 -37
- package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-survey.service.mjs +0 -46
- package/esm2022/lib/services/pli-cnf-task-group.service.mjs +0 -33
- package/esm2022/lib/services/pli-cnf-text-category.service.mjs +0 -38
- package/esm2022/lib/services/pli-cnf-text-option.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-text.service.mjs +0 -62
- package/esm2022/lib/services/pli-cnf-type-text.service.mjs +0 -45
- package/esm2022/lib/services/pli-cnf-university-article.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +0 -36
- package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +0 -35
- package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +0 -35
- package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +0 -31
- package/esm2022/lib/services/pli-message-type.service.mjs +0 -40
- package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +0 -39
- package/esm2022/lib/services/pli-promocion-username.service.mjs +0 -57
- package/esm2022/lib/services/pli-seg-action-user.service.mjs +0 -37
- package/esm2022/lib/services/pli-segmentation.service.mjs +0 -130
- package/esm2022/lib/services/pli-tag-assignment.service.mjs +0 -36
- package/esm2022/lib/services/pli-tag.service.mjs +0 -55
- package/esm2022/lib/services/pli-user.service.mjs +0 -51
- package/esm2022/lib/services/plis-beneficiario.service.mjs +0 -29
- package/esm2022/lib/services/plis-estatus-change.service.mjs +0 -30
- package/esm2022/lib/services/post-selection.service.mjs +0 -25
- package/esm2022/lib/services/ppp.service.mjs +0 -360
- package/esm2022/lib/services/profile.service.mjs +0 -60
- package/esm2022/lib/services/progress-bar.service.mjs +0 -40
- package/esm2022/lib/services/promotion-score.service.mjs +0 -44
- package/esm2022/lib/services/registry-identifier.service.mjs +0 -49
- package/esm2022/lib/services/return-refund.service.mjs +0 -53
- package/esm2022/lib/services/segmentation-tokens.service.mjs +0 -43
- package/esm2022/lib/services/segmentation-user-service.service.mjs +0 -94
- package/esm2022/lib/services/segmentation.service.mjs +0 -31
- package/esm2022/lib/services/send-application.service.mjs +0 -484
- package/esm2022/lib/services/sesion-form.service.mjs +0 -31
- package/esm2022/lib/services/sesion.service.mjs +0 -48
- package/esm2022/lib/services/spinner.service.mjs +0 -16
- package/esm2022/lib/services/sponsorship-letter.service.mjs +0 -68
- package/esm2022/lib/services/status.service.mjs +0 -104
- package/esm2022/lib/services/summary-budget.service.mjs +0 -24
- package/esm2022/lib/services/survey-metadata.service.mjs +0 -28
- package/esm2022/lib/services/survey-queue.service.mjs +0 -24
- package/esm2022/lib/services/survey.service.mjs +0 -52
- package/esm2022/lib/services/tag-management.service.mjs +0 -58
- package/esm2022/lib/services/tasa.cambio.service.mjs +0 -35
- package/esm2022/lib/services/token-transformation.service.mjs +0 -62
- package/esm2022/lib/services/token.service.mjs +0 -1439
- package/esm2022/lib/services/university.service.mjs +0 -50
- package/esm2022/lib/services/upload-documents.service.mjs +0 -60
- package/esm2022/lib/services/user.service.mjs +0 -28
- package/esm2022/lib/services/visualization-committee.service.mjs +0 -91
- package/esm2022/lib/utils/custom-validator.mjs +0 -95
- package/esm2022/lib/utils/form-util.mjs +0 -35
- package/esm2022/lib/utils/formio-util.mjs +0 -582
- package/esm2022/lib/utils/version-commons.mjs +0 -10
- package/esm2022/ng-pli-commons.mjs +0 -5
- package/esm2022/public-api.mjs +0 -226
- package/esm2022/version.mjs +0 -29
|
@@ -1,484 +0,0 @@
|
|
|
1
|
-
import { Injectable, Inject } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { SendApplication, ETipoPresupuesto, EBudgetBuildType, EBudgetError, Document, EDocumentState, Email, InteractionApplicationUser, ETypeStaticInteraction, AuthenticationUtil, ECnfPageSection } from 'ng-pli-util';
|
|
4
|
-
import { FormioUtil } from '../utils/formio-util';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "./token.service";
|
|
7
|
-
import * as i2 from "./email.service";
|
|
8
|
-
import * as i3 from "./interaction-application-user.service";
|
|
9
|
-
export class SendApplicationService {
|
|
10
|
-
constructor(environment, tokenService, emailService, interactionApplicationUserService) {
|
|
11
|
-
this.environment = environment;
|
|
12
|
-
this.tokenService = tokenService;
|
|
13
|
-
this.emailService = emailService;
|
|
14
|
-
this.interactionApplicationUserService = interactionApplicationUserService;
|
|
15
|
-
/** This observable allows to get the porcentage */
|
|
16
|
-
this.percentageSubject = new BehaviorSubject(0);
|
|
17
|
-
}
|
|
18
|
-
/** It has an observable to notify if the percentage is changed */
|
|
19
|
-
onChangePercentage() {
|
|
20
|
-
return this.percentageSubject.asObservable();
|
|
21
|
-
}
|
|
22
|
-
/** it defines the value for percentage */
|
|
23
|
-
setPercentage(current, total) {
|
|
24
|
-
if (current && total) {
|
|
25
|
-
const percentage = (current / total) * 100;
|
|
26
|
-
this.percentageSubject.next(percentage);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
this.resetPercentage();
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/** it resets the percentage */
|
|
33
|
-
resetPercentage() {
|
|
34
|
-
this.percentageSubject.next(0);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* It send email masively
|
|
38
|
-
* @param application
|
|
39
|
-
* @param i current idnex
|
|
40
|
-
* @param length length
|
|
41
|
-
* @param sendApplication
|
|
42
|
-
*/
|
|
43
|
-
sendEmailMassively(application) {
|
|
44
|
-
let email = new Email();
|
|
45
|
-
email.addTo('pruebaconvo@ben.colfuturo.org');
|
|
46
|
-
// uncomment when the environment
|
|
47
|
-
email.setSubject('Envío de solicitud ' + application.id);
|
|
48
|
-
email.setBody('Cordial saludo, <br/>Hemos enviado la solicitud ' + application.id);
|
|
49
|
-
return this.emailService.send(email);
|
|
50
|
-
}
|
|
51
|
-
/** Send email application */
|
|
52
|
-
sendEmail(application) {
|
|
53
|
-
let email = new Email();
|
|
54
|
-
email.addTo('pruebaconvo@ben.colfuturo.org');
|
|
55
|
-
// uncomment when the environment
|
|
56
|
-
email.setSubject('Envío de solicitud ' + application.id);
|
|
57
|
-
email.setBody('Cordial saludo, <br/>Has enviado la solicitud ' + application.id);
|
|
58
|
-
return this.emailService.send(email);
|
|
59
|
-
}
|
|
60
|
-
/** It saves the interaction */
|
|
61
|
-
saveInteraction(applicationId, promCodigo, pliCnfStatusFlowInteraction, observation) {
|
|
62
|
-
let interactionAppUser = new InteractionApplicationUser();
|
|
63
|
-
interactionAppUser.applicationId = applicationId;
|
|
64
|
-
interactionAppUser.promCodigo = promCodigo;
|
|
65
|
-
if (pliCnfStatusFlowInteraction.pliCnfInteraction &&
|
|
66
|
-
pliCnfStatusFlowInteraction.pliCnfInteraction.id)
|
|
67
|
-
interactionAppUser.pliCnfInteractionId =
|
|
68
|
-
pliCnfStatusFlowInteraction.pliCnfInteraction.id;
|
|
69
|
-
if (pliCnfStatusFlowInteraction.pliCnfStatusFlow &&
|
|
70
|
-
pliCnfStatusFlowInteraction.pliCnfStatusFlow.id)
|
|
71
|
-
interactionAppUser.pliCnfStatusFlowId = pliCnfStatusFlowInteraction.pliCnfStatusFlow.id;
|
|
72
|
-
if (pliCnfStatusFlowInteraction.id)
|
|
73
|
-
interactionAppUser.pliCnfStatusFlowInteractionId = pliCnfStatusFlowInteraction.id;
|
|
74
|
-
interactionAppUser.interactionStaticId = ETypeStaticInteraction.SEND_APPLICATION;
|
|
75
|
-
interactionAppUser.pliUserId = AuthenticationUtil.getPliUsuario()
|
|
76
|
-
? AuthenticationUtil.getPliUsuario().usuCodigo
|
|
77
|
-
: null;
|
|
78
|
-
interactionAppUser.positive = true;
|
|
79
|
-
interactionAppUser.observation = observation ? observation : 'Envío de solicitud';
|
|
80
|
-
return this.interactionApplicationUserService.save(interactionAppUser);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* It validates the data
|
|
84
|
-
* @param listApplication
|
|
85
|
-
* @param listForm
|
|
86
|
-
* @param listDataForm
|
|
87
|
-
* @param listBudgetSetting
|
|
88
|
-
* @param listBudget
|
|
89
|
-
* @param listConfigurationDocument
|
|
90
|
-
* @param listDocument
|
|
91
|
-
* @param validateJustRequired eg. when the screern require get just require documents (send application)
|
|
92
|
-
*/
|
|
93
|
-
validate(listTotalStatus, listApplication, listForm, listDataForm, listBudgetSetting, listBudget, listConfigurationDocument, listDocument, callback, validateJustRequired, validateSummarizedBudget) {
|
|
94
|
-
let listSendApplication = [];
|
|
95
|
-
// reset percentage
|
|
96
|
-
// this.resetPercentage();
|
|
97
|
-
if (listApplication && listApplication.length > 0) {
|
|
98
|
-
// iterate over listApplication
|
|
99
|
-
for (let i = 0; i < listApplication.length; i++) {
|
|
100
|
-
// define application
|
|
101
|
-
const application = listApplication[i];
|
|
102
|
-
// create send application object
|
|
103
|
-
let sendApplication = new SendApplication();
|
|
104
|
-
// define applicationId
|
|
105
|
-
sendApplication.applicationId = application.id;
|
|
106
|
-
let currentStatus = [];
|
|
107
|
-
if (listTotalStatus &&
|
|
108
|
-
listTotalStatus.length &&
|
|
109
|
-
application.stateId &&
|
|
110
|
-
listForm &&
|
|
111
|
-
listForm.length)
|
|
112
|
-
// get the list page section according to statusId
|
|
113
|
-
for (const status of listTotalStatus)
|
|
114
|
-
if (status.id == application.stateId) {
|
|
115
|
-
currentStatus = status;
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
// define the listForm that can be valdiated according to status
|
|
119
|
-
const listFormActivated = this.getListFormsByStatus(currentStatus, listForm);
|
|
120
|
-
// get validated list form
|
|
121
|
-
sendApplication.listValidatedForm = this.getValidatedFormList(listFormActivated, listDataForm, sendApplication.applicationId);
|
|
122
|
-
// get validated list budget
|
|
123
|
-
if (!validateSummarizedBudget) {
|
|
124
|
-
sendApplication.listValidatedBudget = this.getValidatedBudget(listBudgetSetting, listBudget, sendApplication.applicationId, currentStatus);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
sendApplication.listValidatedBudget = this.getValidatedBudgetSummarized(listBudgetSetting, listBudget, sendApplication.applicationId, currentStatus);
|
|
128
|
-
}
|
|
129
|
-
// get validated list document
|
|
130
|
-
sendApplication.listValidatedDocument = this.getValidatedDocument(currentStatus, listConfigurationDocument, listDocument, application, listDataForm, validateJustRequired);
|
|
131
|
-
// resolve validation - no listValidatedDoc - listValidatedBudget - listValidatedForm
|
|
132
|
-
sendApplication.validation =
|
|
133
|
-
!sendApplication.listValidatedDocument.length &&
|
|
134
|
-
!sendApplication.listValidatedBudget.length &&
|
|
135
|
-
!sendApplication.listValidatedForm.length;
|
|
136
|
-
// add to array
|
|
137
|
-
listSendApplication.push(sendApplication);
|
|
138
|
-
// call callback
|
|
139
|
-
if (callback)
|
|
140
|
-
callback(sendApplication, application, i, listApplication.length);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return listSendApplication;
|
|
144
|
-
}
|
|
145
|
-
/** it returns the forms that are activated according to status */
|
|
146
|
-
getListFormsByStatus(currentStatus, listForm) {
|
|
147
|
-
let listActivatedForm = [];
|
|
148
|
-
let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
|
|
149
|
-
if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
|
|
150
|
-
// fill the list activated form
|
|
151
|
-
for (const form of listForm)
|
|
152
|
-
for (const section of listPliCnfStatusPageSection)
|
|
153
|
-
if (section.idForm == form.id) {
|
|
154
|
-
listActivatedForm.push(form);
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
return listActivatedForm;
|
|
158
|
-
}
|
|
159
|
-
/** it returns the validated document list */
|
|
160
|
-
getValidatedDocument(currentStatus, listConfigurationDocument, listDocument, application, listDataForm, validateJustRequired) {
|
|
161
|
-
let listValidatedDocument = [];
|
|
162
|
-
if (listConfigurationDocument) {
|
|
163
|
-
// it contains the documents that are visible
|
|
164
|
-
let listConfigurationDocumentVisible = [];
|
|
165
|
-
//checkIfShouldValidate
|
|
166
|
-
let shouldValidateDocuments = false;
|
|
167
|
-
let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
|
|
168
|
-
if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
|
|
169
|
-
for (const section of listPliCnfStatusPageSection)
|
|
170
|
-
if (section.pliCnfPageSection)
|
|
171
|
-
switch (section.pliCnfPageSection.keyLabel) {
|
|
172
|
-
case 'documentos': {
|
|
173
|
-
shouldValidateDocuments = true;
|
|
174
|
-
break;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
if (!shouldValidateDocuments)
|
|
178
|
-
return listValidatedDocument;
|
|
179
|
-
// resolve the configuration that is visible
|
|
180
|
-
if (listConfigurationDocument) {
|
|
181
|
-
for (const configurationDocument of listConfigurationDocument) {
|
|
182
|
-
let visible = true;
|
|
183
|
-
if (configurationDocument.formula && configurationDocument.formula.length) {
|
|
184
|
-
let formula = '';
|
|
185
|
-
try {
|
|
186
|
-
let data = { statusname: application.stateName };
|
|
187
|
-
if (listDataForm)
|
|
188
|
-
for (const dataForm of listDataForm)
|
|
189
|
-
for (const property in dataForm.data)
|
|
190
|
-
data[property.toLowerCase()] = dataForm.data[property];
|
|
191
|
-
formula = this.tokenService.replaceTokensFromListObject(configurationDocument.name, configurationDocument.formula, data);
|
|
192
|
-
let result = eval(formula);
|
|
193
|
-
if (result !== true) {
|
|
194
|
-
visible = false;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
visible = false;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
if (visible) {
|
|
202
|
-
listConfigurationDocumentVisible.push(configurationDocument);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
// resolve the list of documents
|
|
207
|
-
if (listConfigurationDocumentVisible) {
|
|
208
|
-
for (let i = 0; i < listConfigurationDocumentVisible.length; i++) {
|
|
209
|
-
let configurationDocument = listConfigurationDocumentVisible[i];
|
|
210
|
-
let document = this.getDocumentByConfigurationId(configurationDocument.id, listDocument, application.id);
|
|
211
|
-
if (validateJustRequired) {
|
|
212
|
-
if ((!document ||
|
|
213
|
-
(document && document.listArchive.length == 0) ||
|
|
214
|
-
this.automaticDocumentsValidated(configurationDocument, listDataForm, document)) &&
|
|
215
|
-
configurationDocument.required) {
|
|
216
|
-
this.fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
if (document) {
|
|
221
|
-
if (document.state == EDocumentState.PENDIENTE) {
|
|
222
|
-
listValidatedDocument.push(document);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
this.fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return listValidatedDocument;
|
|
233
|
-
}
|
|
234
|
-
fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument) {
|
|
235
|
-
let document = new Document();
|
|
236
|
-
document.applicationId = application.id;
|
|
237
|
-
document.promCodigo = configurationDocument.promCodigo;
|
|
238
|
-
document.state = EDocumentState.PENDIENTE;
|
|
239
|
-
document.configurationDocumentId = configurationDocument.id;
|
|
240
|
-
document.listArchive = [];
|
|
241
|
-
listValidatedDocument.push(document);
|
|
242
|
-
}
|
|
243
|
-
/** It gets document by configuration Id */
|
|
244
|
-
getDocumentByConfigurationId(configurationDocumentId, list, applicationId) {
|
|
245
|
-
if (list)
|
|
246
|
-
for (const document of list)
|
|
247
|
-
if (document.configurationDocumentId === configurationDocumentId &&
|
|
248
|
-
document.applicationId === applicationId)
|
|
249
|
-
return document;
|
|
250
|
-
return null;
|
|
251
|
-
}
|
|
252
|
-
/** get the budget application by type budget and budget setup id */
|
|
253
|
-
getValidatedBudgetApplication(budgetSetting, typeBudget, listBudget, applicationId) {
|
|
254
|
-
if (listBudget)
|
|
255
|
-
for (const budget of listBudget)
|
|
256
|
-
if (budget.tag == typeBudget &&
|
|
257
|
-
budgetSetting.cpreCodigo == budget.budgetSetupId &&
|
|
258
|
-
budget.applicationId == applicationId) {
|
|
259
|
-
return this.validateBudget(budget, budgetSetting, typeBudget);
|
|
260
|
-
}
|
|
261
|
-
return this.validateBudget(null, budgetSetting, typeBudget);
|
|
262
|
-
}
|
|
263
|
-
/** It validates the budget */
|
|
264
|
-
validateBudget(budget, budgetSetting, type) {
|
|
265
|
-
if (!budget || !budget.summary || !budget.summary.budgetTotal)
|
|
266
|
-
// validate if there is a budget object
|
|
267
|
-
return {
|
|
268
|
-
budget: budget,
|
|
269
|
-
type: type,
|
|
270
|
-
budgetSetting: budgetSetting,
|
|
271
|
-
error: EBudgetError.NO_OBJECT
|
|
272
|
-
};
|
|
273
|
-
else if ((type === EBudgetBuildType.financing || type === EBudgetBuildType.mixed) &&
|
|
274
|
-
budget.summary.budgetTotal > budgetSetting.cpreMontoTotal)
|
|
275
|
-
// validate if amount total overcomes the maximum
|
|
276
|
-
return {
|
|
277
|
-
budget: budget,
|
|
278
|
-
type: type,
|
|
279
|
-
budgetSetting: budgetSetting,
|
|
280
|
-
error: EBudgetError.OVERCOME_MAXIMUM_AMOUNT
|
|
281
|
-
};
|
|
282
|
-
else if (type === EBudgetBuildType.financing &&
|
|
283
|
-
(!budget.financingStart || !budget.financingEnd))
|
|
284
|
-
// validate if financing dates are defined
|
|
285
|
-
return {
|
|
286
|
-
budget: budget,
|
|
287
|
-
type: type,
|
|
288
|
-
budgetSetting: budgetSetting,
|
|
289
|
-
error: EBudgetError.FINANCING_DATES
|
|
290
|
-
};
|
|
291
|
-
return null;
|
|
292
|
-
}
|
|
293
|
-
validateSummarizedBudget(budgetSetting, type, budget) {
|
|
294
|
-
if (!budget || !budget.summary || !budget.summary.budgetTotal) {
|
|
295
|
-
// validate if there is a budget object
|
|
296
|
-
return {
|
|
297
|
-
budget: budget,
|
|
298
|
-
type: type,
|
|
299
|
-
budgetSetting: budgetSetting,
|
|
300
|
-
error: EBudgetError.NO_OBJECT
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
return null;
|
|
304
|
-
}
|
|
305
|
-
validateCompleteBudget(listBudgetSetting, listBudget, applicationId) {
|
|
306
|
-
return this.getValidatedBudget(listBudgetSetting, listBudget, applicationId);
|
|
307
|
-
}
|
|
308
|
-
/** it returns the validated budget list */
|
|
309
|
-
getValidatedBudget(listBudgetSetting, listBudget, applicationId, currentStatus) {
|
|
310
|
-
let listValidatedBudget = [];
|
|
311
|
-
if (listBudgetSetting) {
|
|
312
|
-
let shouldValidateTotalBudget = false;
|
|
313
|
-
let shouldValidateFinancingBudget = false;
|
|
314
|
-
if (currentStatus) {
|
|
315
|
-
let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
|
|
316
|
-
if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
|
|
317
|
-
for (const section of listPliCnfStatusPageSection)
|
|
318
|
-
if (section.pliCnfPageSection)
|
|
319
|
-
switch (section.pliCnfPageSection.keyLabel) {
|
|
320
|
-
case 'presupuesto.total': {
|
|
321
|
-
shouldValidateTotalBudget = true;
|
|
322
|
-
break;
|
|
323
|
-
}
|
|
324
|
-
case 'presupuesto.financiacion': {
|
|
325
|
-
shouldValidateFinancingBudget = true;
|
|
326
|
-
break;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
shouldValidateTotalBudget = true;
|
|
332
|
-
shouldValidateFinancingBudget = true;
|
|
333
|
-
}
|
|
334
|
-
// iterate over listBudgetSetting
|
|
335
|
-
for (const budgetSetting of listBudgetSetting) {
|
|
336
|
-
// skip general budget
|
|
337
|
-
if (budgetSetting.pliTipoPresupuesto.tpresCodigo == ETipoPresupuesto.GENERAL)
|
|
338
|
-
continue;
|
|
339
|
-
// budget total
|
|
340
|
-
const budgetDataTotal = this.getValidatedBudgetApplication(budgetSetting, EBudgetBuildType.total, listBudget, applicationId);
|
|
341
|
-
if (budgetDataTotal && shouldValidateTotalBudget)
|
|
342
|
-
listValidatedBudget.push(budgetDataTotal);
|
|
343
|
-
// if it has own funds, so it validates total and financing
|
|
344
|
-
if (budgetSetting.cpreEsFondosPropios) {
|
|
345
|
-
const budgetDataFinancing = this.getValidatedBudgetApplication(budgetSetting, EBudgetBuildType.financing, listBudget, applicationId);
|
|
346
|
-
if (budgetDataFinancing && shouldValidateFinancingBudget)
|
|
347
|
-
listValidatedBudget.push(budgetDataFinancing);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
return listValidatedBudget;
|
|
352
|
-
}
|
|
353
|
-
/** It returns the validated form list */
|
|
354
|
-
getValidatedFormList(listForm, listDataForm, applicationId) {
|
|
355
|
-
let listValidatedForm = [];
|
|
356
|
-
if (listForm) {
|
|
357
|
-
// iterate over listform
|
|
358
|
-
for (const form of listForm) {
|
|
359
|
-
// get errors by formId and ApplicationId
|
|
360
|
-
const errors = this.getErrorsByFormIdAndApplicationId(listDataForm, form.id, applicationId);
|
|
361
|
-
if (errors && errors.length) {
|
|
362
|
-
const components = FormioUtil.getComponents(form.components);
|
|
363
|
-
// generate the error components according to errors
|
|
364
|
-
let errorComponent = [];
|
|
365
|
-
for (const error of errors) {
|
|
366
|
-
if (error && error.component && error.component.key && components) {
|
|
367
|
-
for (const component of components) {
|
|
368
|
-
if (component.key == error.component.key) {
|
|
369
|
-
errorComponent.push(component);
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
if (errorComponent && errorComponent.length) {
|
|
376
|
-
// organizing by panels
|
|
377
|
-
const panels = FormioUtil.getFormattedComponentsByPanel(errorComponent);
|
|
378
|
-
// add to listValidatedForm
|
|
379
|
-
listValidatedForm.push({
|
|
380
|
-
id: form.id,
|
|
381
|
-
name: form.title,
|
|
382
|
-
panels: panels,
|
|
383
|
-
toggle: false
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
// verify if data is completed
|
|
389
|
-
// get data by form id and app id
|
|
390
|
-
const data = this.getDataByFormIdAndApplicationId(listDataForm, form.id, applicationId);
|
|
391
|
-
// get components are required according to data
|
|
392
|
-
const components = FormioUtil.getRequiredComponentsByData(form.components, data);
|
|
393
|
-
if (components && components.length) {
|
|
394
|
-
// organizing by panels
|
|
395
|
-
const panels = FormioUtil.getFormattedComponentsByPanel(components);
|
|
396
|
-
// add to listValidatedForm
|
|
397
|
-
listValidatedForm.push({
|
|
398
|
-
id: form.id,
|
|
399
|
-
name: form.title,
|
|
400
|
-
panels: panels,
|
|
401
|
-
toggle: false
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
return listValidatedForm;
|
|
408
|
-
}
|
|
409
|
-
/** It returns the data by formId and ApplicationId */
|
|
410
|
-
getErrorsByFormIdAndApplicationId(listDataForm, formId, applicationId) {
|
|
411
|
-
if (listDataForm && formId && applicationId)
|
|
412
|
-
for (const data of listDataForm)
|
|
413
|
-
if (data.formId == formId && data.applicationId == applicationId)
|
|
414
|
-
return data.errors;
|
|
415
|
-
return null;
|
|
416
|
-
}
|
|
417
|
-
/** It returns the data by formId and ApplicationId */
|
|
418
|
-
getDataByFormIdAndApplicationId(listDataForm, formId, applicationId) {
|
|
419
|
-
if (listDataForm && formId && applicationId)
|
|
420
|
-
for (const data of listDataForm)
|
|
421
|
-
if (data.formId == formId && data.applicationId == applicationId)
|
|
422
|
-
return data.data;
|
|
423
|
-
return null;
|
|
424
|
-
}
|
|
425
|
-
getValidatedBudgetSummarized(listBudgetSetting, listBudget, applicationId, currentStatus) {
|
|
426
|
-
let listValidatedBudget = [];
|
|
427
|
-
if (listBudgetSetting) {
|
|
428
|
-
let shouldValidateTotalBudget = false;
|
|
429
|
-
if (currentStatus) {
|
|
430
|
-
let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
|
|
431
|
-
if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
|
|
432
|
-
for (const section of listPliCnfStatusPageSection)
|
|
433
|
-
if (section.pliCnfPageSection)
|
|
434
|
-
switch (section.pliCnfPageSection.keyLabel) {
|
|
435
|
-
case ECnfPageSection.presupuestoResumido: {
|
|
436
|
-
shouldValidateTotalBudget = true;
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
shouldValidateTotalBudget = true;
|
|
443
|
-
}
|
|
444
|
-
const budgetDataTotal = this.validateSummarizedBudget(listBudgetSetting[0], EBudgetBuildType.total, listBudget[0]);
|
|
445
|
-
if (budgetDataTotal && shouldValidateTotalBudget)
|
|
446
|
-
listValidatedBudget.push(budgetDataTotal);
|
|
447
|
-
}
|
|
448
|
-
return listValidatedBudget;
|
|
449
|
-
}
|
|
450
|
-
automaticDocumentsValidated(configDocument, listDataForm, document) {
|
|
451
|
-
if (configDocument.formulaValidateMultiple &&
|
|
452
|
-
configDocument.formulaValidateMultiple.length > 0) {
|
|
453
|
-
let data = { statusname: '' };
|
|
454
|
-
if (listDataForm)
|
|
455
|
-
for (const dataForm of listDataForm)
|
|
456
|
-
for (const property in dataForm.data)
|
|
457
|
-
data[property.toLowerCase()] = dataForm.data[property];
|
|
458
|
-
let formula = this.tokenService.replaceTokensFromListObject(configDocument.name, configDocument.formulaValidateMultiple, data);
|
|
459
|
-
let result = eval(formula);
|
|
460
|
-
if (result) {
|
|
461
|
-
let resultArray = JSON.parse(result);
|
|
462
|
-
if (resultArray && resultArray.length > 0) {
|
|
463
|
-
//Then document must have archives
|
|
464
|
-
if (!document || document.listArchive.length !== resultArray.length) {
|
|
465
|
-
return true;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
return false;
|
|
471
|
-
}
|
|
472
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendApplicationService, deps: [{ token: 'environment' }, { token: i1.TokenService }, { token: i2.EmailService }, { token: i3.InteractionApplicationUserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
473
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendApplicationService, providedIn: 'root' }); }
|
|
474
|
-
}
|
|
475
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendApplicationService, decorators: [{
|
|
476
|
-
type: Injectable,
|
|
477
|
-
args: [{
|
|
478
|
-
providedIn: 'root'
|
|
479
|
-
}]
|
|
480
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
481
|
-
type: Inject,
|
|
482
|
-
args: ['environment']
|
|
483
|
-
}] }, { type: i1.TokenService }, { type: i2.EmailService }, { type: i3.InteractionApplicationUserService }] });
|
|
484
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1hcHBsaWNhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcGxpLWNvbW1vbnMvc3JjL2xpYi9zZXJ2aWNlcy9zZW5kLWFwcGxpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUluRCxPQUFPLEVBSU4sZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxFQUNMLDBCQUEwQixFQUUxQixzQkFBc0IsRUFHdEIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7O0FBS2xELE1BQU0sT0FBTyxzQkFBc0I7SUFJbEMsWUFDZ0MsV0FBVyxFQUNsQyxZQUEwQixFQUMxQixZQUEwQixFQUMxQixpQ0FBb0U7UUFIN0MsZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsc0NBQWlDLEdBQWpDLGlDQUFpQyxDQUFtQztRQVA3RSxtREFBbUQ7UUFDM0Msc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFPeEQsQ0FBQztJQUVKLG1FQUFtRTtJQUM1RCxrQkFBa0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELDBDQUEwQztJQUNuQyxhQUFhLENBQUMsT0FBZSxFQUFFLEtBQWE7UUFDbEQsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFF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Q0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFckMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0Msa0NBQWtDO29CQUNsQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDckUsT0FBTyxJQUFJLENBQUM7b0JBQ2IsQ0FBQztnQkFDRixDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7K0dBMW5CVyxzQkFBc0Isa0JBS3pCLGFBQWE7bUhBTFYsc0JBQXNCLGNBRnRCLE1BQU07OzRGQUVOLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQU1FLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW1haWxTZXJ2aWNlIH0gZnJvbSAnLi9lbWFpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi1hcHBsaWNhdGlvbi11c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG5cdEFwcGxpY2F0aW9uLFxyXG5cdEJ1ZGdldERhdGEsXHJcblx0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFNlbmRBcHBsaWNhdGlvbixcclxuXHRFVGlwb1ByZXN1cHVlc3RvLFxyXG5cdEVCdWRnZXRCdWlsZFR5cGUsXHJcblx0RUJ1ZGdldEVycm9yLFxyXG5cdERvY3VtZW50LFxyXG5cdEVEb2N1bWVudFN0YXRlLFxyXG5cdEVtYWlsLFxyXG5cdEludGVyYWN0aW9uQXBwbGljYXRpb25Vc2VyLFxyXG5cdFBsaUNuZlN0YXR1c0Zsb3dJbnRlcmFjdGlvbixcclxuXHRFVHlwZVN0YXRpY0ludGVyYWN0aW9uLFxyXG5cdFBsaUNuZlN0YXR1cyxcclxuXHRQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbixcclxuXHRBdXRoZW50aWNhdGlvblV0aWwsXHJcblx0RUNuZlBhZ2VTZWN0aW9uXHJcbn0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBGb3JtaW9VdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9ybWlvLXV0aWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VuZEFwcGxpY2F0aW9uU2VydmljZSB7XHJcblx0LyoqIFRoaXMgb2JzZXJ2YWJsZSBhbGxvd3MgdG8gZ2V0IHRoZSBwb3JjZW50YWdlICovXHJcblx0cHJpdmF0ZSBwZXJjZW50YWdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQsXHJcblx0XHRwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBlbWFpbFNlcnZpY2U6IEVtYWlsU2VydmljZSxcclxuXHRcdHByaXZhdGUgaW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlOiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlclNlcnZpY2VcclxuXHQpIHt9XHJcblxyXG5cdC8qKiAgSXQgaGFzIGFuIG9ic2VydmFibGUgdG8gbm90aWZ5IGlmIHRoZSBwZXJjZW50YWdlIGlzIGNoYW5nZWQgKi9cclxuXHRwdWJsaWMgb25DaGFuZ2VQZXJjZW50YWdlKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5wZXJjZW50YWdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKiBpdCBkZWZpbmVzIHRoZSB2YWx1ZSBmb3IgcGVyY2VudGFnZSAqL1xyXG5cdHB1YmxpYyBzZXRQZXJjZW50YWdlKGN1cnJlbnQ6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xyXG5cdFx0aWYgKGN1cnJlbnQgJiYgdG90YWwpIHtcclxuXHRcdFx0Y29uc3QgcGVyY2VudGFnZSA9IChjdXJyZW50IC8gdG90YWwpICogMTAwO1xyXG5cdFx0XHR0aGlzLnBlcmNlbnRhZ2VTdWJqZWN0Lm5leHQocGVyY2VudGFnZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnJlc2V0UGVyY2VudGFnZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJlc2V0cyB0aGUgcGVyY2VudGFnZSAqL1xyXG5cdHB1YmxpYyByZXNldFBlcmNlbnRhZ2UoKSB7XHJcblx0XHR0aGlzLnBlcmNlbnRhZ2VTdWJqZWN0Lm5leHQoMCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCBzZW5kIGVtYWlsIG1hc2l2ZWx5XHJcblx0ICogQHBhcmFtIGFwcGxpY2F0aW9uXHJcblx0ICogQHBhcmFtIGkgY3VycmVudCBpZG5leFxyXG5cdCAqIEBwYXJhbSBsZW5ndGggbGVuZ3RoXHJcblx0ICogQHBhcmFtIHNlbmRBcHBsaWNhdGlvblxyXG5cdCAqL1xyXG5cdHNlbmRFbWFpbE1hc3NpdmVseShhcHBsaWNhdGlvbjogQXBwbGljYXRpb24pIHtcclxuXHRcdGxldCBlbWFpbDogRW1haWwgPSBuZXcgRW1haWwoKTtcclxuXHRcdGVtYWlsLmFkZFRvKCdwcnVlYmFjb252b0BiZW4uY29sZnV0dXJvLm9yZycpO1xyXG5cdFx0Ly8gdW5jb21tZW50IHdoZW4gdGhlIGVudmlyb25tZW50XHJcblx0XHRlbWFpbC5zZXRTdWJqZWN0KCdFbnbDrW8gZGUgc29saWNpdHVkICcgKyBhcHBsaWNhdGlvbi5pZCk7XHJcblx0XHRlbWFpbC5zZXRCb2R5KCdDb3JkaWFsIHNhbHVkbywgPGJyLz5IZW1vcyBlbnZpYWRvIGxhIHNvbGljaXR1ZCAnICsgYXBwbGljYXRpb24uaWQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuZW1haWxTZXJ2aWNlLnNlbmQoZW1haWwpO1xyXG5cdH1cclxuXHJcblx0LyoqIFNlbmQgZW1haWwgYXBwbGljYXRpb24gKi9cclxuXHRzZW5kRW1haWwoYXBwbGljYXRpb246IEFwcGxpY2F0aW9uKSB7XHJcblx0XHRsZXQgZW1haWw6IEVtYWlsID0gbmV3IEVtYWlsKCk7XHJcblx0XHRlbWFpbC5hZGRUbygncHJ1ZWJhY29udm9AYmVuLmNvbGZ1dHVyby5vcmcnKTtcclxuXHRcdC8vIHVuY29tbWVudCB3aGVuIHRoZSBlbnZpcm9ubWVudFxyXG5cdFx0ZW1haWwuc2V0U3ViamVjdCgnRW52w61vIGRlIHNvbGljaXR1ZCAnICsgYXBwbGljYXRpb24uaWQpO1xyXG5cdFx0ZW1haWwuc2V0Qm9keSgnQ29yZGlhbCBzYWx1ZG8sIDxici8+SGFzIGVudmlhZG8gbGEgc29saWNpdHVkICcgKyBhcHBsaWNhdGlvbi5pZCk7XHJcblx0XHRyZXR1cm4gdGhpcy5lbWFpbFNlcnZpY2Uuc2VuZChlbWFpbCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgc2F2ZXMgdGhlIGludGVyYWN0aW9uICovXHJcblx0c2F2ZUludGVyYWN0aW9uKFxyXG5cdFx0YXBwbGljYXRpb25JZDogc3RyaW5nLFxyXG5cdFx0cHJvbUNvZGlnbzogbnVtYmVyLFxyXG5cdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uOiBQbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24sXHJcblx0XHRvYnNlcnZhdGlvbj86IHN0cmluZ1xyXG5cdCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgaW50ZXJhY3Rpb25BcHBVc2VyOiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlciA9IG5ldyBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlcigpO1xyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLmFwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbklkO1xyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLnByb21Db2RpZ28gPSBwcm9tQ29kaWdvO1xyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZkludGVyYWN0aW9uICYmXHJcblx0XHRcdHBsaUNuZlN0YXR1c0Zsb3dJbnRlcmFjdGlvbi5wbGlDbmZJbnRlcmFjdGlvbi5pZFxyXG5cdFx0KVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mSW50ZXJhY3Rpb25JZCA9XHJcblx0XHRcdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZkludGVyYWN0aW9uLmlkO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24ucGxpQ25mU3RhdHVzRmxvdyAmJlxyXG5cdFx0XHRwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24ucGxpQ25mU3RhdHVzRmxvdy5pZFxyXG5cdFx0KVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mU3RhdHVzRmxvd0lkID0gcGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZlN0YXR1c0Zsb3cuaWQ7XHJcblx0XHRpZiAocGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLmlkKVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uSWQgPSBwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24uaWQ7XHJcblxyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLmludGVyYWN0aW9uU3RhdGljSWQgPSBFVHlwZVN0YXRpY0ludGVyYWN0aW9uLlNFTkRfQVBQTElDQVRJT047XHJcblx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpVXNlcklkID0gQXV0aGVudGljYXRpb25VdGlsLmdldFBsaVVzdWFyaW8oKVxyXG5cdFx0XHQ/IEF1dGhlbnRpY2F0aW9uVXRpbC5nZXRQbGlVc3VhcmlvKCkudXN1Q29kaWdvXHJcblx0XHRcdDogbnVsbDtcclxuXHRcdGludGVyYWN0aW9uQXBwVXNlci5wb3NpdGl2ZSA9IHRydWU7XHJcblx0XHRpbnRlcmFjdGlvbkFwcFVzZXIub2JzZXJ2YXRpb24gPSBvYnNlcnZhdGlvbiA/IG9ic2VydmF0aW9uIDogJ0VudsOtbyBkZSBzb2xpY2l0dWQnO1xyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlLnNhdmUoaW50ZXJhY3Rpb25BcHBVc2VyKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHZhbGlkYXRlcyB0aGUgZGF0YVxyXG5cdCAqIEBwYXJhbSBsaXN0QXBwbGljYXRpb25cclxuXHQgKiBAcGFyYW0gbGlzdEZvcm1cclxuXHQgKiBAcGFyYW0gbGlzdERhdGFGb3JtXHJcblx0ICogQHBhcmFtIGxpc3RCdWRnZXRTZXR0aW5nXHJcblx0ICogQHBhcmFtIGxpc3RCdWRnZXRcclxuXHQgKiBAcGFyYW0gbGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudFxyXG5cdCAqIEBwYXJhbSBsaXN0RG9jdW1lbnRcclxuXHQgKiBAcGFyYW0gdmFsaWRhdGVKdXN0UmVxdWlyZWQgZWcuIHdoZW4gdGhlIHNjcmVlcm4gcmVxdWlyZSBnZXQganVzdCByZXF1aXJlIGRvY3VtZW50cyAoc2VuZCBhcHBsaWNhdGlvbilcclxuXHQgKi9cclxuXHRwdWJsaWMgdmFsaWRhdGUoXHJcblx0XHRsaXN0VG90YWxTdGF0dXM6IFBsaUNuZlN0YXR1c1tdLFxyXG5cdFx0bGlzdEFwcGxpY2F0aW9uOiBBcHBsaWNhdGlvbltdLFxyXG5cdFx0bGlzdEZvcm06IGFueVtdLFxyXG5cdFx0bGlzdERhdGFGb3JtOiBhbnlbXSxcclxuXHRcdGxpc3RCdWRnZXRTZXR0aW5nOiBhbnlbXSxcclxuXHRcdGxpc3RCdWRnZXQ6IEJ1ZGdldERhdGFbXSxcclxuXHRcdGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnQ6IENvbmZpZ3VyYXRpb25Eb2N1bWVudFtdLFxyXG5cdFx0bGlzdERvY3VtZW50OiBEb2N1bWVudFtdLFxyXG5cdFx0Y2FsbGJhY2s6IGFueSxcclxuXHRcdHZhbGlkYXRlSnVzdFJlcXVpcmVkOiBib29sZWFuLFxyXG5cdFx0dmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0PzogYm9vbGVhblxyXG5cdCk6IEFycmF5PFNlbmRBcHBsaWNhdGlvbj4ge1xyXG5cdFx0bGV0IGxpc3RTZW5kQXBwbGljYXRpb246IEFycmF5PFNlbmRBcHBsaWNhdGlvbj4gPSBbXTtcclxuXHRcdC8vIHJlc2V0IHBlcmNlbnRhZ2VcclxuXHRcdC8vIHRoaXMucmVzZXRQZXJjZW50YWdlKCk7XHJcblx0XHRpZiAobGlzdEFwcGxpY2F0aW9uICYmIGxpc3RBcHBsaWNhdGlvbi5sZW5ndGggPiAwKSB7XHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBsaXN0QXBwbGljYXRpb25cclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0QXBwbGljYXRpb24ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHQvLyBkZWZpbmUgYXBwbGljYXRpb25cclxuXHRcdFx0XHRjb25zdCBhcHBsaWNhdGlvbiA9IGxpc3RBcHBsaWNhdGlvbltpXTtcclxuXHRcdFx0XHQvLyBjcmVhdGUgc2VuZCBhcHBsaWNhdGlvbiBvYmplY3RcclxuXHRcdFx0XHRsZXQgc2VuZEFwcGxpY2F0aW9uOiBTZW5kQXBwbGljYXRpb24gPSBuZXcgU2VuZEFwcGxpY2F0aW9uKCk7XHJcblx0XHRcdFx0Ly8gZGVmaW5lIGFwcGxpY2F0aW9uSWRcclxuXHRcdFx0XHRzZW5kQXBwbGljYXRpb24uYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uLmlkO1xyXG5cclxuXHRcdFx0XHRsZXQgY3VycmVudFN0YXR1czogYW55ID0gW107XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0bGlzdFRvdGFsU3RhdHVzICYmXHJcblx0XHRcdFx0XHRsaXN0VG90YWxTdGF0dXMubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRhcHBsaWNhdGlvbi5zdGF0ZUlkICYmXHJcblx0XHRcdFx0XHRsaXN0Rm9ybSAmJlxyXG5cdFx0XHRcdFx0bGlzdEZvcm0ubGVuZ3RoXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0Ly8gZ2V0IHRoZSBsaXN0IHBhZ2Ugc2VjdGlvbiBhY2NvcmRpbmcgdG8gc3RhdHVzSWRcclxuXHRcdFx0XHRcdGZvciAoY29uc3Qgc3RhdHVzIG9mIGxpc3RUb3RhbFN0YXR1cylcclxuXHRcdFx0XHRcdFx0aWYgKHN0YXR1cy5pZCA9PSBhcHBsaWNhdGlvbi5zdGF0ZUlkKSB7XHJcblx0XHRcdFx0XHRcdFx0Y3VycmVudFN0YXR1cyA9IHN0YXR1cztcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBkZWZpbmUgdGhlIGxpc3RGb3JtIHRoYXQgY2FuIGJlIHZhbGRpYXRlZCBhY2NvcmRpbmcgdG8gc3RhdHVzXHJcblx0XHRcdFx0Y29uc3QgbGlzdEZvcm1BY3RpdmF0ZWQgPSB0aGlzLmdldExpc3RGb3Jtc0J5U3RhdHVzKGN1cnJlbnRTdGF0dXMsIGxpc3RGb3JtKTtcclxuXHRcdFx0XHQvLyBnZXQgdmFsaWRhdGVkIGxpc3QgZm9ybVxyXG5cdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkRm9ybSA9IHRoaXMuZ2V0VmFsaWRhdGVkRm9ybUxpc3QoXHJcblx0XHRcdFx0XHRsaXN0Rm9ybUFjdGl2YXRlZCxcclxuXHRcdFx0XHRcdGxpc3REYXRhRm9ybSxcclxuXHRcdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5hcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0Ly8gZ2V0IHZhbGlkYXRlZCBsaXN0IGJ1ZGdldFxyXG5cdFx0XHRcdGlmICghdmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0KSB7XHJcblx0XHRcdFx0XHRzZW5kQXBwbGljYXRpb24ubGlzdFZhbGlkYXRlZEJ1ZGdldCA9IHRoaXMuZ2V0VmFsaWRhdGVkQnVkZ2V0KFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0U2V0dGluZyxcclxuXHRcdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQsXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRTdGF0dXNcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkQnVkZ2V0ID0gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXRTdW1tYXJpemVkKFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0U2V0dGluZyxcclxuXHRcdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQsXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRTdGF0dXNcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBnZXQgdmFsaWRhdGVkIGxpc3QgZG9jdW1lbnRcclxuXHRcdFx0XHRzZW5kQXBwbGljYXRpb24ubGlzdFZhbGlkYXRlZERvY3VtZW50ID0gdGhpcy5nZXRWYWxpZGF0ZWREb2N1bWVudChcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGF0dXMsXHJcblx0XHRcdFx0XHRsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0XHRcdFx0bGlzdERvY3VtZW50LFxyXG5cdFx0XHRcdFx0YXBwbGljYXRpb24sXHJcblx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHR2YWxpZGF0ZUp1c3RSZXF1aXJlZFxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdC8vIHJlc29sdmUgdmFsaWRhdGlvbiAtIG5vIGxpc3RWYWxpZGF0ZWREb2MgLSAgbGlzdFZhbGlkYXRlZEJ1ZGdldCAtIGxpc3RWYWxpZGF0ZWRGb3JtXHJcblx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLnZhbGlkYXRpb24gPVxyXG5cdFx0XHRcdFx0IXNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkRG9jdW1lbnQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHQhc2VuZEFwcGxpY2F0aW9uLmxpc3RWYWxpZGF0ZWRCdWRnZXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHQhc2VuZEFwcGxpY2F0aW9uLmxpc3RWYWxpZGF0ZWRGb3JtLmxlbmd0aDtcclxuXHRcdFx0XHQvLyBhZGQgdG8gYXJyYXlcclxuXHRcdFx0XHRsaXN0U2VuZEFwcGxpY2F0aW9uLnB1c2goc2VuZEFwcGxpY2F0aW9uKTtcclxuXHRcdFx0XHQvLyBjYWxsIGNhbGxiYWNrXHJcblx0XHRcdFx0aWYgKGNhbGxiYWNrKSBjYWxsYmFjayhzZW5kQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uLCBpLCBsaXN0QXBwbGljYXRpb24ubGVuZ3RoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RTZW5kQXBwbGljYXRpb247XHJcblx0fVxyXG5cclxuXHQvKiogaXQgcmV0dXJucyB0aGUgZm9ybXMgdGhhdCBhcmUgYWN0aXZhdGVkIGFjY29yZGluZyB0byBzdGF0dXMgKi9cclxuXHRnZXRMaXN0Rm9ybXNCeVN0YXR1cyhjdXJyZW50U3RhdHVzOiBQbGlDbmZTdGF0dXMsIGxpc3RGb3JtOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdGxldCBsaXN0QWN0aXZhdGVkRm9ybTogYW55W10gPSBbXTtcclxuXHRcdGxldCBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb246IFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uW10gPVxyXG5cdFx0XHRjdXJyZW50U3RhdHVzLmxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjtcclxuXHRcdGlmIChsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24gJiYgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uLmxlbmd0aClcclxuXHRcdFx0Ly8gZmlsbCB0aGUgbGlzdCBhY3RpdmF0ZWQgZm9ybVxyXG5cdFx0XHRmb3IgKGNvbnN0IGZvcm0gb2YgbGlzdEZvcm0pXHJcblx0XHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdGlmIChzZWN0aW9uLmlkRm9ybSA9PSBmb3JtLmlkKSB7XHJcblx0XHRcdFx0XHRcdGxpc3RBY3RpdmF0ZWRGb3JtLnB1c2goZm9ybSk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RBY3RpdmF0ZWRGb3JtO1xyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBkb2N1bWVudCBsaXN0ICovXHJcblx0Z2V0VmFsaWRhdGVkRG9jdW1lbnQoXHJcblx0XHRjdXJyZW50U3RhdHVzOiBhbnksXHJcblx0XHRsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0bGlzdERvY3VtZW50LFxyXG5cdFx0YXBwbGljYXRpb246IEFwcGxpY2F0aW9uLFxyXG5cdFx0bGlzdERhdGFGb3JtLFxyXG5cdFx0dmFsaWRhdGVKdXN0UmVxdWlyZWQ6IGJvb2xlYW5cclxuXHQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZERvY3VtZW50ID0gW107XHJcblx0XHRpZiAobGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudCkge1xyXG5cdFx0XHQvLyBpdCBjb250YWlucyB0aGUgZG9jdW1lbnRzIHRoYXQgYXJlIHZpc2libGVcclxuXHRcdFx0bGV0IGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlID0gW107XHJcblxyXG5cdFx0XHQvL2NoZWNrSWZTaG91bGRWYWxpZGF0ZVxyXG5cdFx0XHRsZXQgc2hvdWxkVmFsaWRhdGVEb2N1bWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdFx0bGV0IGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjogUGxpQ25mU3RhdHVzUGFnZVNlY3Rpb25bXSA9XHJcblx0XHRcdFx0Y3VycmVudFN0YXR1cy5saXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb247XHJcblx0XHRcdGlmIChsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24gJiYgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uLmxlbmd0aClcclxuXHRcdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2YgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uKVxyXG5cdFx0XHRcdFx0aWYgKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24pXHJcblx0XHRcdFx0XHRcdHN3aXRjaCAoc2VjdGlvbi5wbGlDbmZQYWdlU2VjdGlvbi5rZXlMYWJlbCkge1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50b3MnOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRzaG91bGRWYWxpZGF0ZURvY3VtZW50cyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0aWYgKCFzaG91bGRWYWxpZGF0ZURvY3VtZW50cykgcmV0dXJuIGxpc3RWYWxpZGF0ZWREb2N1bWVudDtcclxuXHJcblx0XHRcdC8vIHJlc29sdmUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBpcyB2aXNpYmxlXHJcblx0XHRcdGlmIChsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50KSB7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBjb25maWd1cmF0aW9uRG9jdW1lbnQgb2YgbGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudCkge1xyXG5cdFx0XHRcdFx0bGV0IHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdFx0XHRcdFx0aWYgKGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5mb3JtdWxhICYmIGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5mb3JtdWxhLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRsZXQgZm9ybXVsYSA9ICcnO1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRhID0geyBzdGF0dXNuYW1lOiBhcHBsaWNhdGlvbi5zdGF0ZU5hbWUgfTtcclxuXHRcdFx0XHRcdFx0XHRpZiAobGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBkYXRhRm9ybSBvZiBsaXN0RGF0YUZvcm0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHkgaW4gZGF0YUZvcm0uZGF0YSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5LnRvTG93ZXJDYXNlKCldID0gZGF0YUZvcm0uZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdFx0Zm9ybXVsYSA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LmZvcm11bGEsXHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgcmVzdWx0ID0gZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0ICE9PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2aXNpYmxlID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdHZpc2libGUgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHZpc2libGUpIHtcclxuXHRcdFx0XHRcdFx0bGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudFZpc2libGUucHVzaChjb25maWd1cmF0aW9uRG9jdW1lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gcmVzb2x2ZSB0aGUgbGlzdCBvZiBkb2N1bWVudHNcclxuXHRcdFx0aWYgKGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlKSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50VmlzaWJsZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0bGV0IGNvbmZpZ3VyYXRpb25Eb2N1bWVudCA9IGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlW2ldO1xyXG5cdFx0XHRcdFx0bGV0IGRvY3VtZW50OiBEb2N1bWVudCA9IHRoaXMuZ2V0RG9jdW1lbnRCeUNvbmZpZ3VyYXRpb25JZChcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LmlkLFxyXG5cdFx0XHRcdFx0XHRsaXN0RG9jdW1lbnQsXHJcblx0XHRcdFx0XHRcdGFwcGxpY2F0aW9uLmlkXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKHZhbGlkYXRlSnVzdFJlcXVpcmVkKSB7XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHQoIWRvY3VtZW50IHx8XHJcblx0XHRcdFx0XHRcdFx0XHQoZG9jdW1lbnQgJiYgZG9jdW1lbnQubGlzdEFyY2hpdmUubGVuZ3RoID09IDApIHx8XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF1dG9tYXRpY0RvY3VtZW50c1ZhbGlkYXRlZChcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvY3VtZW50XHJcblx0XHRcdFx0XHRcdFx0XHQpKSAmJlxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5yZXF1aXJlZFxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZpbGxMaXN0VmFsaWRhdGVEb2N1bWVudERlZmF1bHQoXHJcblx0XHRcdFx0XHRcdFx0XHRsaXN0VmFsaWRhdGVkRG9jdW1lbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRhcHBsaWNhdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGlmIChkb2N1bWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChkb2N1bWVudC5zdGF0ZSA9PSBFRG9jdW1lbnRTdGF0ZS5QRU5ESUVOVEUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWREb2N1bWVudC5wdXNoKGRvY3VtZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5maWxsTGlzdFZhbGlkYXRlRG9jdW1lbnREZWZhdWx0KFxyXG5cdFx0XHRcdFx0XHRcdFx0bGlzdFZhbGlkYXRlZERvY3VtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0YXBwbGljYXRpb24sXHJcblx0XHRcdFx0XHRcdFx0XHRjb25maWd1cmF0aW9uRG9jdW1lbnRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbGlzdFZhbGlkYXRlZERvY3VtZW50O1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBmaWxsTGlzdFZhbGlkYXRlRG9jdW1lbnREZWZhdWx0KFxyXG5cdFx0bGlzdFZhbGlkYXRlZERvY3VtZW50LFxyXG5cdFx0YXBwbGljYXRpb24sXHJcblx0XHRjb25maWd1cmF0aW9uRG9jdW1lbnRcclxuXHQpIHtcclxuXHRcdGxldCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpO1xyXG5cdFx0ZG9jdW1lbnQuYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uLmlkO1xyXG5cdFx0ZG9jdW1lbnQucHJvbUNvZGlnbyA9IGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5wcm9tQ29kaWdvO1xyXG5cdFx0ZG9jdW1lbnQuc3RhdGUgPSBFRG9jdW1lbnRTdGF0ZS5QRU5ESUVOVEU7XHJcblx0XHRkb2N1bWVudC5jb25maWd1cmF0aW9uRG9jdW1lbnRJZCA9IGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5pZDtcclxuXHRcdGRvY3VtZW50Lmxpc3RBcmNoaXZlID0gW107XHJcblx0XHRsaXN0VmFsaWRhdGVkRG9jdW1lbnQucHVzaChkb2N1bWVudCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgZ2V0cyBkb2N1bWVudCBieSBjb25maWd1cmF0aW9uIElkICovXHJcblx0cHJpdmF0ZSBnZXREb2N1bWVudEJ5Q29uZmlndXJhdGlvbklkKFxyXG5cdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50SWQ6IG51bWJlcixcclxuXHRcdGxpc3Q6IEFycmF5PERvY3VtZW50PixcclxuXHRcdGFwcGxpY2F0aW9uSWQ6IHN0cmluZ1xyXG5cdCk6IERvY3VtZW50IHtcclxuXHRcdGlmIChsaXN0KVxyXG5cdFx0XHRmb3IgKGNvbnN0IGRvY3VtZW50IG9mIGxpc3QpXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZG9jdW1lbnQuY29uZmlndXJhdGlvbkRvY3VtZW50SWQgPT09IGNvbmZpZ3VyYXRpb25Eb2N1bWVudElkICYmXHJcblx0XHRcdFx0XHRkb2N1bWVudC5hcHBsaWNhdGlvbklkID09PSBhcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0cmV0dXJuIGRvY3VtZW50O1xyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqIGdldCB0aGUgYnVkZ2V0IGFwcGxpY2F0aW9uIGJ5IHR5cGUgYnVkZ2V0IGFuZCBidWRnZXQgc2V0dXAgaWQgKi9cclxuXHRwcml2YXRlIGdldFZhbGlkYXRlZEJ1ZGdldEFwcGxpY2F0aW9uKFxyXG5cdFx0YnVkZ2V0U2V0dGluZzogYW55LFxyXG5cdFx0dHlwZUJ1ZGdldDogYW55LFxyXG5cdFx0bGlzdEJ1ZGdldDogQnVkZ2V0RGF0YVtdLFxyXG5cdFx0YXBwbGljYXRpb25JZFxyXG5cdCk6IGFueSB7XHJcblx0XHRpZiAobGlzdEJ1ZGdldClcclxuXHRcdFx0Zm9yIChjb25zdCBidWRnZXQgb2YgbGlzdEJ1ZGdldClcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRidWRnZXQudGFnID09IHR5cGVCdWRnZXQgJiZcclxuXHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcuY3ByZUNvZGlnbyA9PSBidWRnZXQuYnVkZ2V0U2V0dXBJZCAmJlxyXG5cdFx0XHRcdFx0YnVkZ2V0LmFwcGxpY2F0aW9uSWQgPT0gYXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVCdWRnZXQoYnVkZ2V0LCBidWRnZXRTZXR0aW5nLCB0eXBlQnVkZ2V0KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVCdWRnZXQobnVsbCwgYnVkZ2V0U2V0dGluZywgdHlwZUJ1ZGdldCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgdmFsaWRhdGVzIHRoZSBidWRnZXQgKi9cclxuXHRwcml2YXRlIHZhbGlkYXRlQnVkZ2V0KGJ1ZGdldDogYW55LCBidWRnZXRTZXR0aW5nOiBhbnksIHR5cGU6IGFueSkge1xyXG5cdFx0aWYgKCFidWRnZXQgfHwgIWJ1ZGdldC5zdW1tYXJ5IHx8ICFidWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbClcclxuXHRcdFx0Ly8gdmFsaWRhdGUgaWYgdGhlcmUgaXMgYSBidWRnZXQgb2JqZWN0XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuTk9fT0JKRUNUXHJcblx0XHRcdH07XHJcblx0XHRlbHNlIGlmIChcclxuXHRcdFx0KHR5cGUgPT09IEVCdWRnZXRCdWlsZFR5cGUuZmluYW5jaW5nIHx8IHR5cGUgPT09IEVCdWRnZXRCdWlsZFR5cGUubWl4ZWQpICYmXHJcblx0XHRcdGJ1ZGdldC5zdW1tYXJ5LmJ1ZGdldFRvdGFsID4gYnVkZ2V0U2V0dGluZy5jcHJlTW9udG9Ub3RhbFxyXG5cdFx0KVxyXG5cdFx0XHQvLyB2YWxpZGF0ZSBpZiBhbW91bnQgdG90YWwgb3ZlcmNvbWVzIHRoZSBtYXhpbXVtXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuT1ZFUkNPTUVfTUFYSU1VTV9BTU9VTlRcclxuXHRcdFx0fTtcclxuXHRcdGVsc2UgaWYgKFxyXG5cdFx0XHR0eXBlID09PSBFQnVkZ2V0QnVpbGRUeXBlLmZpbmFuY2luZyAmJlxyXG5cdFx0XHQoIWJ1ZGdldC5maW5hbmNpbmdTdGFydCB8fCAhYnVkZ2V0LmZpbmFuY2luZ0VuZClcclxuXHRcdClcclxuXHRcdFx0Ly8gdmFsaWRhdGUgaWYgZmluYW5jaW5nIGRhdGVzIGFyZSBkZWZpbmVkXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuRklOQU5DSU5HX0RBVEVTXHJcblx0XHRcdH07XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0KGJ1ZGdldFNldHRpbmc6IGFueSwgdHlwZTogYW55LCBidWRnZXQ6IGFueSkge1xyXG5cdFx0aWYgKCFidWRnZXQgfHwgIWJ1ZGdldC5zdW1tYXJ5IHx8ICFidWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbCkge1xyXG5cdFx0XHQvLyB2YWxpZGF0ZSBpZiB0aGVyZSBpcyBhIGJ1ZGdldCBvYmplY3RcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRidWRnZXQ6IGJ1ZGdldCxcclxuXHRcdFx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0XHRcdGJ1ZGdldFNldHRpbmc6IGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0ZXJyb3I6IEVCdWRnZXRFcnJvci5OT19PQkpFQ1RcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdHZhbGlkYXRlQ29tcGxldGVCdWRnZXQobGlzdEJ1ZGdldFNldHRpbmcsIGxpc3RCdWRnZXQsIGFwcGxpY2F0aW9uSWQpOiBhbnlbXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXQobGlzdEJ1ZGdldFNldHRpbmcsIGxpc3RCdWRnZXQsIGFwcGxpY2F0aW9uSWQpO1xyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBidWRnZXQgbGlzdCAqL1xyXG5cdHByaXZhdGUgZ2V0VmFsaWRhdGVkQnVkZ2V0KFxyXG5cdFx0bGlzdEJ1ZGdldFNldHRpbmcsXHJcblx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0YXBwbGljYXRpb25JZCxcclxuXHRcdGN1cnJlbnRTdGF0dXM/XHJcblx0KTogYW55W10ge1xyXG5cdFx0bGV0IGxpc3RWYWxpZGF0ZWRCdWRnZXQ6IGFueVtdID0gW107XHJcblx0XHRpZiAobGlzdEJ1ZGdldFNldHRpbmcpIHtcclxuXHRcdFx0bGV0IHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdFx0bGV0IHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0OiBib29sZWFuID0gZmFsc2U7XHJcblx0XHRcdGlmIChjdXJyZW50U3RhdHVzKSB7XHJcblx0XHRcdFx0bGV0IGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjogUGxpQ25mU3RhdHVzUGFnZVNlY3Rpb25bXSA9XHJcblx0XHRcdFx0XHRjdXJyZW50U3RhdHVzLmxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjtcclxuXHRcdFx0XHRpZiAobGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uICYmIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbi5sZW5ndGgpXHJcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2YgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uKVxyXG5cdFx0XHRcdFx0XHRpZiAoc2VjdGlvbi5wbGlDbmZQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24ua2V5TGFiZWwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3ByZXN1cHVlc3RvLnRvdGFsJzoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaG91bGRWYWxpZGF0ZVRvdGFsQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlICdwcmVzdXB1ZXN0by5maW5hbmNpYWNpb24nOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQgPSB0cnVlO1xyXG5cdFx0XHRcdHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGxpc3RCdWRnZXRTZXR0aW5nXHJcblx0XHRcdGZvciAoY29uc3QgYnVkZ2V0U2V0dGluZyBvZiBsaXN0QnVkZ2V0U2V0dGluZykge1xyXG5cdFx0XHRcdC8vIHNraXAgZ2VuZXJhbCBidWRnZXRcclxuXHRcdFx0XHRpZiAoYnVkZ2V0U2V0dGluZy5wbGlUaXBvUHJlc3VwdWVzdG8udHByZXNDb2RpZ28gPT0gRVRpcG9QcmVzdXB1ZXN0by5HRU5FUkFMKVxyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0Ly8gYnVkZ2V0IHRvdGFsXHJcblx0XHRcdFx0Y29uc3QgYnVkZ2V0RGF0YVRvdGFsID0gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXRBcHBsaWNhdGlvbihcclxuXHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0XHRFQnVkZ2V0QnVpbGRUeXBlLnRvdGFsLFxyXG5cdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdGFwcGxpY2F0aW9uSWRcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGlmIChidWRnZXREYXRhVG90YWwgJiYgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldClcclxuXHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRCdWRnZXQucHVzaChidWRnZXREYXRhVG90YWwpO1xyXG5cdFx0XHRcdC8vIGlmIGl0IGhhcyBvd24gZnVuZHMsIHNvIGl0IHZhbGlkYXRlcyB0b3RhbCBhbmQgZmluYW5jaW5nXHJcblx0XHRcdFx0aWYgKGJ1ZGdldFNldHRpbmcuY3ByZUVzRm9uZG9zUHJvcGlvcykge1xyXG5cdFx0XHRcdFx0Y29uc3QgYnVkZ2V0RGF0YUZpbmFuY2luZyA9IHRoaXMuZ2V0VmFsaWRhdGVkQnVkZ2V0QXBwbGljYXRpb24oXHJcblx0XHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0XHRcdEVCdWRnZXRCdWlsZFR5cGUuZmluYW5jaW5nLFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0XHRcdFx0XHRhcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKGJ1ZGdldERhdGFGaW5hbmNpbmcgJiYgc2hvdWxkVmFsaWRhdGVGaW5hbmNpbmdCdWRnZXQpXHJcblx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRCdWRnZXQucHVzaChidWRnZXREYXRhRmluYW5jaW5nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBsaXN0VmFsaWRhdGVkQnVkZ2V0O1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBmb3JtIGxpc3QgKi9cclxuXHRwcml2YXRlIGdldFZhbGlkYXRlZEZvcm1MaXN0KGxpc3RGb3JtLCBsaXN0RGF0YUZvcm0sIGFwcGxpY2F0aW9uSWQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZEZvcm06IGFueVtdID0gW107XHJcblx0XHRpZiAobGlzdEZvcm0pIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGxpc3Rmb3JtXHJcblx0XHRcdGZvciAoY29uc3QgZm9ybSBvZiBsaXN0Rm9ybSkge1xyXG5cdFx0XHRcdC8vIGdldCBlcnJvcnMgYnkgZm9ybUlkIGFuZCBBcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0Y29uc3QgZXJyb3JzID0gdGhpcy5nZXRFcnJvcnNCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQoXHJcblx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHRmb3JtLmlkLFxyXG5cdFx0XHRcdFx0YXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgY29tcG9uZW50cyA9IEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50cyhmb3JtLmNvbXBvbmVudHMpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGdlbmVyYXRlIHRoZSBlcnJvciBjb21wb25lbnRzIGFjY29yZGluZyB0byBlcnJvcnNcclxuXHRcdFx0XHRcdGxldCBlcnJvckNvbXBvbmVudCA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVycm9yICYmIGVycm9yLmNvbXBvbmVudCAmJiBlcnJvci5jb21wb25lbnQua2V5ICYmIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50LmtleSA9PSBlcnJvci5jb21wb25lbnQua2V5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ29tcG9uZW50LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKGVycm9yQ29tcG9uZW50ICYmIGVycm9yQ29tcG9uZW50Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHQvLyBvcmdhbml6aW5nIGJ5IHBhbmVsc1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYW5lbHMgPSBGb3JtaW9VdGlsLmdldEZvcm1hdHRlZENvbXBvbmVudHNCeVBhbmVsKGVycm9yQ29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIHRvIGxpc3RWYWxpZGF0ZWRGb3JtXHJcblx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRGb3JtLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdGlkOiBmb3JtLmlkLFxyXG5cdFx0XHRcdFx0XHRcdG5hbWU6IGZvcm0udGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0cGFuZWxzOiBwYW5lbHMsXHJcblx0XHRcdFx0XHRcdFx0dG9nZ2xlOiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gdmVyaWZ5IGlmIGRhdGEgaXMgY29tcGxldGVkXHJcblx0XHRcdFx0XHQvLyBnZXQgZGF0YSBieSBmb3JtIGlkIGFuZCBhcHAgaWRcclxuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQoXHJcblx0XHRcdFx0XHRcdGxpc3REYXRhRm9ybSxcclxuXHRcdFx0XHRcdFx0Zm9ybS5pZCxcclxuXHRcdFx0XHRcdFx0YXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdC8vIGdldCBjb21wb25lbnRzIGFyZSByZXF1aXJlZCBhY2NvcmRpbmcgdG8gZGF0YVxyXG5cdFx0XHRcdFx0Y29uc3QgY29tcG9uZW50cyA9IEZvcm1pb1V0aWwuZ2V0UmVxdWlyZWRDb21wb25lbnRzQnlEYXRhKFxyXG5cdFx0XHRcdFx0XHRmb3JtLmNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdGRhdGFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHQvLyBvcmdhbml6aW5nIGJ5IHBhbmVsc1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYW5lbHMgPSBGb3JtaW9VdGlsLmdldEZvcm1hdHRlZENvbXBvbmVudHNCeVBhbmVsKGNvbXBvbmVudHMpO1xyXG5cdFx0XHRcdFx0XHQvLyBhZGQgdG8gbGlzdFZhbGlkYXRlZEZvcm1cclxuXHRcdFx0XHRcdFx0bGlzdFZhbGlkYXRlZEZvcm0ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0aWQ6IGZvcm0uaWQsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogZm9ybS50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRwYW5lbHM6IHBhbmVscyxcclxuXHRcdFx0XHRcdFx0XHR0b2dnbGU6IGZhbHNlXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RWYWxpZGF0ZWRGb3JtO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIGRhdGEgYnkgZm9ybUlkIGFuZCBBcHBsaWNhdGlvbklkICovXHJcblx0cHJpdmF0ZSBnZXRFcnJvcnNCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQobGlzdERhdGFGb3JtLCBmb3JtSWQsIGFwcGxpY2F0aW9uSWQpOiBhbnkge1xyXG5cdFx0aWYgKGxpc3REYXRhRm9ybSAmJiBmb3JtSWQgJiYgYXBwbGljYXRpb25JZClcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhIG9mIGxpc3REYXRhRm9ybSlcclxuXHRcdFx0XHRpZiAoZGF0YS5mb3JtSWQgPT0gZm9ybUlkICYmIGRhdGEuYXBwbGljYXRpb25JZCA9PSBhcHBsaWNhdGlvbklkKVxyXG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuZXJyb3JzO1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgZGF0YSBieSBmb3JtSWQgYW5kIEFwcGxpY2F0aW9uSWQgKi9cclxuXHRwcml2YXRlIGdldERhdGFCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQobGlzdERhdGFGb3JtLCBmb3JtSWQsIGFwcGxpY2F0aW9uSWQpOiBhbnkge1xyXG5cdFx0aWYgKGxpc3REYXRhRm9ybSAmJiBmb3JtSWQgJiYgYXBwbGljYXRpb25JZClcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhIG9mIGxpc3REYXRhRm9ybSlcclxuXHRcdFx0XHRpZiAoZGF0YS5mb3JtSWQgPT0gZm9ybUlkICYmIGRhdGEuYXBwbGljYXRpb25JZCA9PSBhcHBsaWNhdGlvbklkKSByZXR1cm4gZGF0YS5kYXRhO1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHRnZXRWYWxpZGF0ZWRCdWRnZXRTdW1tYXJpemVkKFxyXG5cdFx0bGlzdEJ1ZGdldFNldHRpbmcsXHJcblx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0YXBwbGljYXRpb25JZCxcclxuXHRcdGN1cnJlbnRTdGF0dXNcclxuXHQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZEJ1ZGdldDogYW55W10gPSBbXTtcclxuXHRcdGlmIChsaXN0QnVkZ2V0U2V0dGluZykge1xyXG5cdFx0XHRsZXQgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdFx0XHRpZiAoY3VycmVudFN0YXR1cykge1xyXG5cdFx0XHRcdGxldCBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb246IFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uW10gPVxyXG5cdFx0XHRcdFx0Y3VycmVudFN0YXR1cy5saXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb247XHJcblx0XHRcdFx0aWYgKGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbiAmJiBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24ubGVuZ3RoKVxyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdFx0aWYgKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24pXHJcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChzZWN0aW9uLnBsaUNuZlBhZ2VTZWN0aW9uLmtleUxhYmVsKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIEVDbmZQYWdlU2VjdGlvbi5wcmVzdXB1ZXN0b1Jlc3VtaWRvOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldCA9IHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgYnVkZ2V0RGF0YVRvdGFsID0gdGhpcy52YWxpZGF0ZVN1bW1hcml6ZWRCdWRnZXQoXHJcblx0XHRcdFx0bGlzdEJ1ZGdldFNldHRpbmdbMF0sXHJcblx0XHRcdFx0RUJ1ZGdldEJ1aWxkVHlwZS50b3RhbCxcclxuXHRcdFx0XHRsaXN0QnVkZ2V0WzBdXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChidWRnZXREYXRhVG90YWwgJiYgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldClcclxuXHRcdFx0XHRsaXN0VmFsaWRhdGVkQnVkZ2V0LnB1c2goYnVkZ2V0RGF0YVRvdGFsKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBsaXN0VmFsaWRhdGVkQnVkZ2V0O1xyXG5cdH1cclxuXHJcblx0YXV0b21hdGljRG9jdW1lbnRzVmFsaWRhdGVkKFxyXG5cdFx0Y29uZmlnRG9jdW1lbnQ6IENvbmZpZ3VyYXRpb25Eb2N1bWVudCxcclxuXHRcdGxpc3REYXRhRm9ybTogYW55W10sXHJcblx0XHRkb2N1bWVudDogRG9jdW1lbnRcclxuXHQpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUgJiZcclxuXHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBkYXRhID0geyBzdGF0dXNuYW1lOiAnJyB9O1xyXG5cdFx0XHRpZiAobGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdGZvciAoY29uc3QgZGF0YUZvcm0gb2YgbGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eSBpbiBkYXRhRm9ybS5kYXRhKVxyXG5cdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5LnRvTG93ZXJDYXNlKCldID0gZGF0YUZvcm0uZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdGxldCBmb3JtdWxhID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0KFxyXG5cdFx0XHRcdGNvbmZpZ0RvY3VtZW50Lm5hbWUsXHJcblx0XHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUsXHJcblx0XHRcdFx0ZGF0YVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgcmVzdWx0ID0gZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdGxldCByZXN1bHRBcnJheSA9IEpTT04ucGFyc2UocmVzdWx0KTtcclxuXHJcblx0XHRcdFx0aWYgKHJlc3VsdEFycmF5ICYmIHJlc3VsdEFycmF5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdC8vVGhlbiBkb2N1bWVudCBtdXN0IGhhdmUgYXJjaGl2ZXNcclxuXHRcdFx0XHRcdGlmICghZG9jdW1lbnQgfHwgZG9jdW1lbnQubGlzdEFyY2hpdmUubGVuZ3RoICE9PSByZXN1bHRBcnJheS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiJdfQ==
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Injectable, Inject } from '@angular/core';
|
|
2
|
-
import { HttpHeaders, HttpParams } from '@angular/common/http';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common/http";
|
|
5
|
-
export class SesionFormService {
|
|
6
|
-
constructor(environment, httpClient) {
|
|
7
|
-
this.environment = environment;
|
|
8
|
-
this.httpClient = httpClient;
|
|
9
|
-
this.headerJson = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
|
|
10
|
-
}
|
|
11
|
-
/** It returns the list of form by prom codigo */
|
|
12
|
-
getByPromCodigo(promCodigo) {
|
|
13
|
-
return this.httpClient.get(this.environment.host.backend.configuration + 'sesionForm/getByPromCodigo', { params: new HttpParams().set('promCodigo', promCodigo.toString()) });
|
|
14
|
-
}
|
|
15
|
-
/** It saves a form */
|
|
16
|
-
save(sesionForm) {
|
|
17
|
-
return this.httpClient.post(this.environment.host.backend.configuration + 'sesionForm/save', sesionForm, this.headerJson);
|
|
18
|
-
}
|
|
19
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SesionFormService, deps: [{ token: 'environment' }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
20
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SesionFormService, providedIn: 'root' }); }
|
|
21
|
-
}
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SesionFormService, decorators: [{
|
|
23
|
-
type: Injectable,
|
|
24
|
-
args: [{
|
|
25
|
-
providedIn: 'root'
|
|
26
|
-
}]
|
|
27
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
28
|
-
type: Inject,
|
|
29
|
-
args: ['environment']
|
|
30
|
-
}] }, { type: i1.HttpClient }] });
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VzaW9uLWZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvc2VzaW9uLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFPM0UsTUFBTSxPQUFPLGlCQUFpQjtJQUU3QixZQUEyQyxXQUFXLEVBQVUsVUFBc0I7UUFBM0MsZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRDlFLGVBQVUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNELENBQUM7SUFFMUYsaURBQWlEO0lBQ2pELGVBQWUsQ0FBQyxVQUFrQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLDRCQUE0QixFQUMxRSxFQUFFLE1BQU0sRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FDckUsQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsSUFBSSxDQUFDLFVBQXNCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLEVBQy9ELFVBQVUsRUFDVixJQUFJLENBQUMsVUFBVSxDQUNmLENBQUM7SUFDSCxDQUFDOytHQW5CVyxpQkFBaUIsa0JBRVQsYUFBYTttSEFGckIsaUJBQWlCLGNBRmpCLE1BQU07OzRGQUVOLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQUdhLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTZXNpb25Gb3JtIH0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VzaW9uRm9ybVNlcnZpY2Uge1xyXG5cdHByaXZhdGUgaGVhZGVySnNvbiA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG5cdGNvbnN0cnVjdG9yKEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudCwgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgbGlzdCBvZiBmb3JtIGJ5IHByb20gY29kaWdvICovXHJcblx0Z2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ286IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICdzZXNpb25Gb3JtL2dldEJ5UHJvbUNvZGlnbycsXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgncHJvbUNvZGlnbycsIHByb21Db2RpZ28udG9TdHJpbmcoKSkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBzYXZlcyBhIGZvcm0gKi9cclxuXHRzYXZlKHNlc2lvbkZvcm06IFNlc2lvbkZvcm0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Nlc2lvbkZvcm0vc2F2ZScsXHJcblx0XHRcdHNlc2lvbkZvcm0sXHJcblx0XHRcdHRoaXMuaGVhZGVySnNvblxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIl19
|