@senior-gestao-pessoas/payroll-core 9.1.0-4c189107-f538-4deb-9b77-aee8dab91b50 → 9.1.0-5e184124-4e09-4f1a-9bdd-3cc4483b1cbf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/senior-gestao-pessoas-payroll-core.umd.js +997 -0
- package/bundles/senior-gestao-pessoas-payroll-core.umd.js.map +1 -1
- package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js +1 -1
- package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js.map +1 -1
- package/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.d.ts +74 -0
- package/components/historical-pix-account/historical-pix-account.component.d.ts +74 -0
- package/components/historical-pix-account/historical-pix-account.module.d.ts +2 -0
- package/components/historical-pix-account/historical-pix-account.service.d.ts +8 -0
- package/components/historical-pix-account/index.d.ts +3 -0
- package/components/utils/format-utils/format-utils.service.d.ts +33 -0
- package/components/utils/generic-validators.d.ts +24 -0
- package/esm2015/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +312 -0
- package/esm2015/components/historical-pix-account/historical-pix-account.component.js +323 -0
- package/esm2015/components/historical-pix-account/historical-pix-account.module.js +58 -0
- package/esm2015/components/historical-pix-account/historical-pix-account.service.js +20 -0
- package/esm2015/components/historical-pix-account/index.js +4 -0
- package/esm2015/components/utils/format-utils/format-utils.service.js +96 -0
- package/esm2015/components/utils/generic-validators.js +164 -0
- package/esm2015/public_api.js +2 -1
- package/esm2015/senior-gestao-pessoas-payroll-core.js +2 -1
- package/esm5/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +336 -0
- package/esm5/components/historical-pix-account/historical-pix-account.component.js +357 -0
- package/esm5/components/historical-pix-account/historical-pix-account.module.js +61 -0
- package/esm5/components/historical-pix-account/historical-pix-account.service.js +22 -0
- package/esm5/components/historical-pix-account/index.js +4 -0
- package/esm5/components/utils/format-utils/format-utils.service.js +100 -0
- package/esm5/components/utils/generic-validators.js +167 -0
- package/esm5/public_api.js +2 -1
- package/esm5/senior-gestao-pessoas-payroll-core.js +2 -1
- package/fesm2015/senior-gestao-pessoas-payroll-core.js +926 -1
- package/fesm2015/senior-gestao-pessoas-payroll-core.js.map +1 -1
- package/fesm5/senior-gestao-pessoas-payroll-core.js +994 -1
- package/fesm5/senior-gestao-pessoas-payroll-core.js.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/senior-gestao-pessoas-payroll-core.d.ts +1 -0
- package/senior-gestao-pessoas-payroll-core.metadata.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { OnInit, EventEmitter, ChangeDetectorRef, OnDestroy, AfterViewInit } from "@angular/core";
|
|
2
|
+
import { FormGroup, FormBuilder } from "@angular/forms";
|
|
3
|
+
import { NumberLocaleOptions, CustomFieldsComponent } from "@seniorsistemas/angular-components";
|
|
4
|
+
export declare class HistoricalPixAccountFormComponent implements OnInit, OnDestroy, AfterViewInit {
|
|
5
|
+
private formBuilder;
|
|
6
|
+
private cd;
|
|
7
|
+
customFields: CustomFieldsComponent;
|
|
8
|
+
currency: NumberLocaleOptions;
|
|
9
|
+
customEntity: string;
|
|
10
|
+
customService: string;
|
|
11
|
+
withSideBar: boolean;
|
|
12
|
+
isEditMode: boolean;
|
|
13
|
+
paramsForm: FormGroup;
|
|
14
|
+
visibleChange: EventEmitter<boolean>;
|
|
15
|
+
pixAccountItemToList: EventEmitter<any>;
|
|
16
|
+
private _visible;
|
|
17
|
+
private ngUnsubscribe;
|
|
18
|
+
private employeeId;
|
|
19
|
+
private pixAccountList;
|
|
20
|
+
private initialValidatorOfPercentage;
|
|
21
|
+
labelBtnAdd: string;
|
|
22
|
+
pixAccountFormGroup: FormGroup;
|
|
23
|
+
maxValuePercentage: number;
|
|
24
|
+
visibleBtnSave: boolean;
|
|
25
|
+
isView: boolean;
|
|
26
|
+
pixKeyType: string;
|
|
27
|
+
isShowPixKeyFieldValidatorMessage: boolean;
|
|
28
|
+
constructor(formBuilder: FormBuilder, cd: ChangeDetectorRef);
|
|
29
|
+
ngOnInit(): void;
|
|
30
|
+
ngAfterViewInit(): void;
|
|
31
|
+
ngOnDestroy(): void;
|
|
32
|
+
private registerSubjects;
|
|
33
|
+
private createFormGroup;
|
|
34
|
+
onChangePixKeyType(item: any): void;
|
|
35
|
+
onClearPixKeyType(): void;
|
|
36
|
+
visible: boolean;
|
|
37
|
+
isEditAndViewValue: any;
|
|
38
|
+
convertDTOToShowWithCustomFields(data: object): object;
|
|
39
|
+
private configEnableFields;
|
|
40
|
+
close(): void;
|
|
41
|
+
addItem(): void;
|
|
42
|
+
resetForm(): void;
|
|
43
|
+
getBankTableId(): string;
|
|
44
|
+
readonly percentagePlaceholder: string;
|
|
45
|
+
readonly optionsPercentage: object;
|
|
46
|
+
private getOptions;
|
|
47
|
+
/**
|
|
48
|
+
* O Input que recebe a lista do component pai e chama o método de validação passando a lista recebida.
|
|
49
|
+
* @param pixAccountList
|
|
50
|
+
*/
|
|
51
|
+
getListPixAccount: object[];
|
|
52
|
+
/**
|
|
53
|
+
* Recebe a lista de registros já inseridos na tabela adiciona em uma variável os valores que serão usados para
|
|
54
|
+
* a validação dos campos "percentage" e "pixAccount".
|
|
55
|
+
* Quando tem index significa que está em uma edição, os valores na posição do registro da edição (index) não serão adicionados
|
|
56
|
+
* no array de comparação dos validators.
|
|
57
|
+
* @param pixAccountList
|
|
58
|
+
* @param index
|
|
59
|
+
*/
|
|
60
|
+
private setValidatorsAccordingList;
|
|
61
|
+
/**
|
|
62
|
+
* Antes de setar o validator prepara as variáveis necessária para que seja feita a validação do campo.
|
|
63
|
+
*/
|
|
64
|
+
setPixKeyValidators(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Este método calcula as parcentagens que já foram inseridas, e seta a diferença para chegar em
|
|
67
|
+
* 100% na validação do campo "percentage" como um novo maxValue;
|
|
68
|
+
* @param listValue
|
|
69
|
+
*/
|
|
70
|
+
private validatePercentageValid;
|
|
71
|
+
isViewMode: boolean;
|
|
72
|
+
phoneMask(event: any): void;
|
|
73
|
+
setDefaultCpfPixKey(): void;
|
|
74
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { OnInit, ChangeDetectorRef, AfterViewInit, OnDestroy } from "@angular/core";
|
|
2
|
+
import { FormGroup, FormBuilder } from "@angular/forms";
|
|
3
|
+
import { TranslateService } from "@ngx-translate/core";
|
|
4
|
+
import { CustomFieldsComponent, NumberLocaleOptions } from "@seniorsistemas/angular-components";
|
|
5
|
+
export declare class HistoricalPixAccountComponent implements OnInit, OnDestroy, AfterViewInit {
|
|
6
|
+
private translateService;
|
|
7
|
+
private cd;
|
|
8
|
+
private formBuilder;
|
|
9
|
+
customFields: CustomFieldsComponent;
|
|
10
|
+
formGroup: FormGroup;
|
|
11
|
+
fieldFormGroup: string;
|
|
12
|
+
_dateChange: string;
|
|
13
|
+
_displayDateChange: string;
|
|
14
|
+
recordByRow: number;
|
|
15
|
+
showDateChange: boolean;
|
|
16
|
+
msgTooltipAdd: string;
|
|
17
|
+
isEditMode: boolean;
|
|
18
|
+
isViewMode: boolean;
|
|
19
|
+
currency: NumberLocaleOptions;
|
|
20
|
+
customEntity: string;
|
|
21
|
+
customService: string;
|
|
22
|
+
withSideBar: boolean;
|
|
23
|
+
paramsForm: FormGroup;
|
|
24
|
+
private visibleChange;
|
|
25
|
+
private ngUnsubscribe;
|
|
26
|
+
private historicalPixAccountList;
|
|
27
|
+
private orderBy;
|
|
28
|
+
private _visible;
|
|
29
|
+
pixAccountItemInput: object;
|
|
30
|
+
totalRecords: number;
|
|
31
|
+
actionLabel: string;
|
|
32
|
+
loading: boolean;
|
|
33
|
+
parameters: any;
|
|
34
|
+
msgTotalLimitByPercentage: string;
|
|
35
|
+
listData: object[];
|
|
36
|
+
listDataNoPage: object[];
|
|
37
|
+
cols: {
|
|
38
|
+
label: any;
|
|
39
|
+
field: string;
|
|
40
|
+
}[];
|
|
41
|
+
actions: (rowData: any, key: any) => {
|
|
42
|
+
visible: boolean;
|
|
43
|
+
label: any;
|
|
44
|
+
command: () => void;
|
|
45
|
+
}[];
|
|
46
|
+
constructor(translateService: TranslateService, cd: ChangeDetectorRef, formBuilder: FormBuilder);
|
|
47
|
+
ngOnInit(): void;
|
|
48
|
+
private createFormGroup;
|
|
49
|
+
ngOnDestroy(): void;
|
|
50
|
+
ngAfterViewInit(): void;
|
|
51
|
+
onLazyLoad(event?: any): void;
|
|
52
|
+
/**
|
|
53
|
+
* Um Bug de CSS que acontece nas linhas da tabela, que resolve só atualizando qualquer parte do CSS da pagina.
|
|
54
|
+
*/
|
|
55
|
+
private refreshCssInIE11;
|
|
56
|
+
add(): void;
|
|
57
|
+
private deleteAnnuityItem;
|
|
58
|
+
getHistoricalPixAccountList(): object[];
|
|
59
|
+
addItemInList($event: any): void;
|
|
60
|
+
private getNumberPageByIndex;
|
|
61
|
+
private verifyTotalPercentage;
|
|
62
|
+
readonly scopedActions: any;
|
|
63
|
+
readonly recordsMessage: string;
|
|
64
|
+
readonly getTooltipAndDisableButtonAdd: string;
|
|
65
|
+
dateChange: string;
|
|
66
|
+
displayDateChange: string;
|
|
67
|
+
addListData: object[];
|
|
68
|
+
visible: boolean;
|
|
69
|
+
close(): void;
|
|
70
|
+
getFormattedCpfTelephoneNumber(telephoneNumber: string): string;
|
|
71
|
+
getFormattedCpf(cpf: string): string;
|
|
72
|
+
getFormattedCnpj(cnpj: string): string;
|
|
73
|
+
getFormattedPercentage(value: string): string;
|
|
74
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { HttpClientService } from '../shared/http-client.service';
|
|
3
|
+
import { ServiceType } from '../../core/enums/serviceType';
|
|
4
|
+
export declare class HistoricalPixAccountService {
|
|
5
|
+
private http;
|
|
6
|
+
constructor(http: HttpClientService);
|
|
7
|
+
query(path: string, body: object, service?: ServiceType): Observable<any>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare class FormatUtilsService {
|
|
2
|
+
/**
|
|
3
|
+
* Retorna o CPF formatado
|
|
4
|
+
* @param cpf CPF
|
|
5
|
+
*/
|
|
6
|
+
static getFormattedCpf(cpf: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Retorna o CNPJ formatado
|
|
9
|
+
* @param cnpj CNPJ
|
|
10
|
+
*/
|
|
11
|
+
static getFormattedCnpj(cnpj: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Retorna a mascara do CPF/CNPJ
|
|
14
|
+
* @param key Valores possíveis são CPF ou CNPJ
|
|
15
|
+
*/
|
|
16
|
+
static getCpfCnpjMask(key: string): "" | "999.999.999-99" | "99.999.999/9999-99";
|
|
17
|
+
/**
|
|
18
|
+
* Metódo para formatar o número de telefone.
|
|
19
|
+
* @param telephoneNumber String contendo o número de telefone.
|
|
20
|
+
* @returns String formatada com o número de telefone.
|
|
21
|
+
*/
|
|
22
|
+
static getFormattedTelephoneNumber(telephoneNumber: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Metódo para formatar o número de telefone de um campo Input.
|
|
25
|
+
* @param event Evento do Input do campo de telefone.
|
|
26
|
+
*/
|
|
27
|
+
static formatTelephoneInputEvent(event: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Metódo para formatar a porcentagem para 2 casas decimais.
|
|
30
|
+
* @param value Número a ser formatado.
|
|
31
|
+
*/
|
|
32
|
+
static getFormattedPercentage(value: string): string;
|
|
33
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Validators, AbstractControl } from "@angular/forms";
|
|
2
|
+
export declare class GenericValidator {
|
|
3
|
+
constructor();
|
|
4
|
+
/**
|
|
5
|
+
* Valida o CEI (Cadastro específico de INSS) digitado.
|
|
6
|
+
*/
|
|
7
|
+
static isValidCei(control: AbstractControl): Validators;
|
|
8
|
+
/**
|
|
9
|
+
* Valida se o CPF é valido. Deve-se ser informado o cpf sem máscara.
|
|
10
|
+
*/
|
|
11
|
+
static isValidCpf(control: AbstractControl): Validators;
|
|
12
|
+
/**
|
|
13
|
+
* Valida se o CNPJ é valido. Deve-se ser informado o cpf sem máscara.
|
|
14
|
+
*/
|
|
15
|
+
static isValidCnpj(control: AbstractControl): Validators;
|
|
16
|
+
/**
|
|
17
|
+
* Válida o número de telefone da chave PIX.
|
|
18
|
+
*/
|
|
19
|
+
static isValidPhoneNumber(control: AbstractControl): Validators;
|
|
20
|
+
/**
|
|
21
|
+
* Valida o email da chave PIX.
|
|
22
|
+
*/
|
|
23
|
+
static isValidEmail(control: AbstractControl): Validators;
|
|
24
|
+
}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import * as tslib_1 from "tslib";
|
|
2
|
+
import { Component, OnInit, Input, Output, EventEmitter, ChangeDetectorRef, OnDestroy, AfterViewInit, ViewChild, } from "@angular/core";
|
|
3
|
+
import { FormGroup, FormBuilder, Validators, ValidatorFn } from "@angular/forms";
|
|
4
|
+
import { CustomFieldsComponent } from "@seniorsistemas/angular-components";
|
|
5
|
+
import { Subject } from "rxjs";
|
|
6
|
+
import { verifyValidationsForm, configEnabledFields, mountCustomToShow, } from "../../utils/helpers";
|
|
7
|
+
import { GenericValidator } from "../../utils/generic-validators";
|
|
8
|
+
import { FormatUtilsService } from "../../utils/format-utils/format-utils.service";
|
|
9
|
+
let HistoricalPixAccountFormComponent = class HistoricalPixAccountFormComponent {
|
|
10
|
+
constructor(formBuilder, cd) {
|
|
11
|
+
this.formBuilder = formBuilder;
|
|
12
|
+
this.cd = cd;
|
|
13
|
+
this.withSideBar = true;
|
|
14
|
+
this.isEditMode = false;
|
|
15
|
+
this.paramsForm = new FormGroup({});
|
|
16
|
+
this.visibleChange = new EventEmitter();
|
|
17
|
+
this.pixAccountItemToList = new EventEmitter();
|
|
18
|
+
this.ngUnsubscribe = new Subject();
|
|
19
|
+
this.initialValidatorOfPercentage = [Validators.required, Validators.min(0.01)];
|
|
20
|
+
this.labelBtnAdd = "hcm.payroll.employees_add";
|
|
21
|
+
this.maxValuePercentage = 100.00;
|
|
22
|
+
this.visibleBtnSave = true;
|
|
23
|
+
this.isView = false;
|
|
24
|
+
this.isShowPixKeyFieldValidatorMessage = false;
|
|
25
|
+
this.createFormGroup();
|
|
26
|
+
this.registerSubjects();
|
|
27
|
+
}
|
|
28
|
+
ngOnInit() {
|
|
29
|
+
}
|
|
30
|
+
ngAfterViewInit() {
|
|
31
|
+
this.cd.detectChanges();
|
|
32
|
+
}
|
|
33
|
+
ngOnDestroy() {
|
|
34
|
+
this.ngUnsubscribe.next(true);
|
|
35
|
+
this.ngUnsubscribe.unsubscribe();
|
|
36
|
+
}
|
|
37
|
+
registerSubjects() {
|
|
38
|
+
}
|
|
39
|
+
createFormGroup() {
|
|
40
|
+
this.pixAccountFormGroup = this.formBuilder.group({
|
|
41
|
+
id: this.formBuilder.control(null),
|
|
42
|
+
index: this.formBuilder.control(null),
|
|
43
|
+
employee: this.formBuilder.control({ value: { tableId: null }, disabled: true }),
|
|
44
|
+
dateChange: this.formBuilder.control(null),
|
|
45
|
+
pixKeyType: this.formBuilder.control(null, Validators.required),
|
|
46
|
+
pixKey: this.formBuilder.control(null),
|
|
47
|
+
percentage: this.formBuilder.control(null, Validators.compose([
|
|
48
|
+
...this.initialValidatorOfPercentage,
|
|
49
|
+
Validators.max(this.maxValuePercentage),
|
|
50
|
+
])),
|
|
51
|
+
customFields: this.formBuilder.control(null),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
onChangePixKeyType(item) {
|
|
55
|
+
if (item.key) {
|
|
56
|
+
this.pixKeyType = item.key;
|
|
57
|
+
this.isShowPixKeyFieldValidatorMessage = true;
|
|
58
|
+
this.pixAccountFormGroup.get("pixKey").reset();
|
|
59
|
+
this.setPixKeyValidators();
|
|
60
|
+
if (item.key === "CPF") {
|
|
61
|
+
this.setDefaultCpfPixKey();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onClearPixKeyType() {
|
|
66
|
+
this.isShowPixKeyFieldValidatorMessage = false;
|
|
67
|
+
this.pixAccountFormGroup.get("pixKey").reset();
|
|
68
|
+
}
|
|
69
|
+
get visible() {
|
|
70
|
+
return this._visible;
|
|
71
|
+
}
|
|
72
|
+
set visible(value) {
|
|
73
|
+
this._visible = value;
|
|
74
|
+
this.visibleChange.emit(this.visible);
|
|
75
|
+
}
|
|
76
|
+
set isEditAndViewValue(value) {
|
|
77
|
+
this.resetForm();
|
|
78
|
+
this.visibleBtnSave = true;
|
|
79
|
+
if (value && value.currentItem && Object.keys(value.currentItem).length) {
|
|
80
|
+
this.pixAccountFormGroup.patchValue(this.convertDTOToShowWithCustomFields(Object.assign({}, value.currentItem)));
|
|
81
|
+
this.labelBtnAdd = "hcm.payroll.employees_update";
|
|
82
|
+
this.setValidatorsAccordingList(value.listData, value.currentItem["index"]);
|
|
83
|
+
if (!this.isView) {
|
|
84
|
+
this.configEnableFields(value && value["isEditMode"]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.labelBtnAdd = "hcm.payroll.employees_add";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
convertDTOToShowWithCustomFields(data) {
|
|
92
|
+
const obj = Object.assign({}, data);
|
|
93
|
+
obj["customFields"] = mountCustomToShow(obj["customFields"]);
|
|
94
|
+
return obj;
|
|
95
|
+
}
|
|
96
|
+
configEnableFields(isEditMode) {
|
|
97
|
+
this.visibleBtnSave = isEditMode;
|
|
98
|
+
if (this.pixAccountFormGroup.get("pixKeyType").value) {
|
|
99
|
+
this.pixKeyType = this.pixAccountFormGroup.get("pixKeyType").value.key;
|
|
100
|
+
this.setPixKeyValidators();
|
|
101
|
+
if (this.pixKeyType === "TELEPHONE") {
|
|
102
|
+
this.pixAccountFormGroup.get("pixKey").setValue(FormatUtilsService.getFormattedTelephoneNumber(this.pixAccountFormGroup.get("pixKey").value));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
configEnabledFields(this.pixAccountFormGroup, isEditMode, [
|
|
106
|
+
"pixKeyType",
|
|
107
|
+
"pixKey",
|
|
108
|
+
"percentage",
|
|
109
|
+
"customFields",
|
|
110
|
+
], []);
|
|
111
|
+
}
|
|
112
|
+
close() {
|
|
113
|
+
this.resetForm();
|
|
114
|
+
this.visible = false;
|
|
115
|
+
}
|
|
116
|
+
addItem() {
|
|
117
|
+
this.pixAccountFormGroup.updateValueAndValidity();
|
|
118
|
+
verifyValidationsForm.call(this.pixAccountFormGroup);
|
|
119
|
+
if (this.pixAccountFormGroup.valid) {
|
|
120
|
+
if (this.employeeId) {
|
|
121
|
+
this.pixAccountFormGroup.get("employee").setValue({
|
|
122
|
+
tableId: this.employeeId,
|
|
123
|
+
name: "",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
this.pixAccountItemToList.emit(this.pixAccountFormGroup.getRawValue());
|
|
127
|
+
this.visible = false;
|
|
128
|
+
this.resetForm();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
resetForm() {
|
|
132
|
+
this.pixAccountFormGroup.reset();
|
|
133
|
+
this.labelBtnAdd = "hcm.payroll.employees_add";
|
|
134
|
+
if (this.customFields && this.customFields.formGroup)
|
|
135
|
+
this.customFields.formGroup.reset();
|
|
136
|
+
}
|
|
137
|
+
getBankTableId() {
|
|
138
|
+
return this.pixAccountFormGroup.controls.bank.value
|
|
139
|
+
? `'${this.pixAccountFormGroup.controls.bank.value.tableId}'`
|
|
140
|
+
: null;
|
|
141
|
+
}
|
|
142
|
+
get percentagePlaceholder() {
|
|
143
|
+
return `0${this.currency && this.currency.decimalSeparator}00`;
|
|
144
|
+
}
|
|
145
|
+
get optionsPercentage() {
|
|
146
|
+
return Object.assign({}, this.getOptions(), { precision: 2 });
|
|
147
|
+
}
|
|
148
|
+
getOptions() {
|
|
149
|
+
return {
|
|
150
|
+
prefix: "",
|
|
151
|
+
thousands: this.currency.thousandsSeparator,
|
|
152
|
+
decimal: this.currency.decimalSeparator,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* O Input que recebe a lista do component pai e chama o método de validação passando a lista recebida.
|
|
157
|
+
* @param pixAccountList
|
|
158
|
+
*/
|
|
159
|
+
set getListPixAccount(pixAccountList) {
|
|
160
|
+
if (pixAccountList) {
|
|
161
|
+
this.setValidatorsAccordingList(pixAccountList);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.resetForm();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Recebe a lista de registros já inseridos na tabela adiciona em uma variável os valores que serão usados para
|
|
169
|
+
* a validação dos campos "percentage" e "pixAccount".
|
|
170
|
+
* Quando tem index significa que está em uma edição, os valores na posição do registro da edição (index) não serão adicionados
|
|
171
|
+
* no array de comparação dos validators.
|
|
172
|
+
* @param pixAccountList
|
|
173
|
+
* @param index
|
|
174
|
+
*/
|
|
175
|
+
setValidatorsAccordingList(pixAccountList, index = null) {
|
|
176
|
+
this.pixAccountList = pixAccountList && pixAccountList.length ? [...pixAccountList] : [];
|
|
177
|
+
const percentageIncluded = [];
|
|
178
|
+
if (this.pixAccountList && this.pixAccountList.length) {
|
|
179
|
+
this.pixAccountList.filter((field, key) => {
|
|
180
|
+
if (field["percentage"] && key != index) {
|
|
181
|
+
percentageIncluded.push(field["percentage"]);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
this.setPixKeyValidators();
|
|
186
|
+
this.validatePercentageValid(percentageIncluded);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Antes de setar o validator prepara as variáveis necessária para que seja feita a validação do campo.
|
|
190
|
+
*/
|
|
191
|
+
setPixKeyValidators() {
|
|
192
|
+
const genericPixKey = this.pixAccountFormGroup.get("pixKey");
|
|
193
|
+
if (this.pixKeyType) {
|
|
194
|
+
switch (this.pixKeyType) {
|
|
195
|
+
case "TELEPHONE":
|
|
196
|
+
genericPixKey.setValidators(Validators.compose([
|
|
197
|
+
Validators.required, GenericValidator.isValidPhoneNumber,
|
|
198
|
+
]));
|
|
199
|
+
break;
|
|
200
|
+
case "EMAIL":
|
|
201
|
+
genericPixKey.setValidators(Validators.compose([
|
|
202
|
+
Validators.required, GenericValidator.isValidEmail,
|
|
203
|
+
]));
|
|
204
|
+
break;
|
|
205
|
+
case "CPF":
|
|
206
|
+
genericPixKey.setValidators(Validators.compose([
|
|
207
|
+
Validators.required, GenericValidator.isValidCpf,
|
|
208
|
+
]));
|
|
209
|
+
break;
|
|
210
|
+
case "CNPJ":
|
|
211
|
+
genericPixKey.setValidators(Validators.compose([
|
|
212
|
+
Validators.required, GenericValidator.isValidCnpj,
|
|
213
|
+
]));
|
|
214
|
+
break;
|
|
215
|
+
case "RANDOM_KEY":
|
|
216
|
+
genericPixKey.setValidators(Validators.required);
|
|
217
|
+
break;
|
|
218
|
+
default:
|
|
219
|
+
genericPixKey.setValidators(null);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
genericPixKey.enable();
|
|
223
|
+
genericPixKey.updateValueAndValidity();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Este método calcula as parcentagens que já foram inseridas, e seta a diferença para chegar em
|
|
228
|
+
* 100% na validação do campo "percentage" como um novo maxValue;
|
|
229
|
+
* @param listValue
|
|
230
|
+
*/
|
|
231
|
+
validatePercentageValid(listValue) {
|
|
232
|
+
const percentage = this.pixAccountFormGroup.get("percentage");
|
|
233
|
+
this.maxValuePercentage = listValue
|
|
234
|
+
.reduce((currentValue, total) => currentValue - total, 100.00);
|
|
235
|
+
percentage
|
|
236
|
+
.setValidators(Validators.compose([
|
|
237
|
+
...this.initialValidatorOfPercentage,
|
|
238
|
+
Validators.max(this.maxValuePercentage),
|
|
239
|
+
]));
|
|
240
|
+
percentage.updateValueAndValidity();
|
|
241
|
+
}
|
|
242
|
+
set isViewMode(condition) {
|
|
243
|
+
this.isView = !!(condition && !this.withSideBar);
|
|
244
|
+
this.configEnableFields(!this.isView);
|
|
245
|
+
if (!this.isView)
|
|
246
|
+
this.resetForm();
|
|
247
|
+
}
|
|
248
|
+
phoneMask(event) {
|
|
249
|
+
FormatUtilsService.formatTelephoneInputEvent(event);
|
|
250
|
+
}
|
|
251
|
+
setDefaultCpfPixKey() {
|
|
252
|
+
const sheetDocument = this.paramsForm.get("sheetDocument");
|
|
253
|
+
if (sheetDocument) {
|
|
254
|
+
const cpf = sheetDocument.get("cpfNumber").value;
|
|
255
|
+
if (cpf) {
|
|
256
|
+
this.pixAccountFormGroup.get("pixKey").setValue(cpf);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
HistoricalPixAccountFormComponent.ctorParameters = () => [
|
|
262
|
+
{ type: FormBuilder },
|
|
263
|
+
{ type: ChangeDetectorRef }
|
|
264
|
+
];
|
|
265
|
+
tslib_1.__decorate([
|
|
266
|
+
ViewChild(CustomFieldsComponent, { static: true })
|
|
267
|
+
], HistoricalPixAccountFormComponent.prototype, "customFields", void 0);
|
|
268
|
+
tslib_1.__decorate([
|
|
269
|
+
Input()
|
|
270
|
+
], HistoricalPixAccountFormComponent.prototype, "currency", void 0);
|
|
271
|
+
tslib_1.__decorate([
|
|
272
|
+
Input()
|
|
273
|
+
], HistoricalPixAccountFormComponent.prototype, "customEntity", void 0);
|
|
274
|
+
tslib_1.__decorate([
|
|
275
|
+
Input()
|
|
276
|
+
], HistoricalPixAccountFormComponent.prototype, "customService", void 0);
|
|
277
|
+
tslib_1.__decorate([
|
|
278
|
+
Input()
|
|
279
|
+
], HistoricalPixAccountFormComponent.prototype, "withSideBar", void 0);
|
|
280
|
+
tslib_1.__decorate([
|
|
281
|
+
Input()
|
|
282
|
+
], HistoricalPixAccountFormComponent.prototype, "isEditMode", void 0);
|
|
283
|
+
tslib_1.__decorate([
|
|
284
|
+
Input()
|
|
285
|
+
], HistoricalPixAccountFormComponent.prototype, "paramsForm", void 0);
|
|
286
|
+
tslib_1.__decorate([
|
|
287
|
+
Output()
|
|
288
|
+
], HistoricalPixAccountFormComponent.prototype, "visibleChange", void 0);
|
|
289
|
+
tslib_1.__decorate([
|
|
290
|
+
Output()
|
|
291
|
+
], HistoricalPixAccountFormComponent.prototype, "pixAccountItemToList", void 0);
|
|
292
|
+
tslib_1.__decorate([
|
|
293
|
+
Input()
|
|
294
|
+
], HistoricalPixAccountFormComponent.prototype, "visible", null);
|
|
295
|
+
tslib_1.__decorate([
|
|
296
|
+
Input()
|
|
297
|
+
], HistoricalPixAccountFormComponent.prototype, "isEditAndViewValue", null);
|
|
298
|
+
tslib_1.__decorate([
|
|
299
|
+
Input()
|
|
300
|
+
], HistoricalPixAccountFormComponent.prototype, "getListPixAccount", null);
|
|
301
|
+
tslib_1.__decorate([
|
|
302
|
+
Input()
|
|
303
|
+
], HistoricalPixAccountFormComponent.prototype, "isViewMode", null);
|
|
304
|
+
HistoricalPixAccountFormComponent = tslib_1.__decorate([
|
|
305
|
+
Component({
|
|
306
|
+
selector: "pix-account",
|
|
307
|
+
template: "<div id=\"main\">\n <form [formGroup]=\"pixAccountFormGroup\" autocomplete=\"off\">\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <!-- Tipo de chave -->\n <div class=\"ui-md-6 ui-sm-12 required\">\n <label>{{'hcm.payroll.employees_addition_pix_key_type'|translate}}</label>\n <input-rest-auto-complete-enum [dropdown]=\"true\" server=\"payroll\"\n enumeration=\"PixKeyType\"\n placeholder=\"{{'hcm.payroll.select' | translate}}\"\n name=\"pixKeyType\" [form]=\"pixAccountFormGroup\"\n (onSelect)=\"onChangePixKeyType($event)\"\n (onClear)=\"onClearPixKeyType()\"\n id=\"ta-pixKeyType\"></input-rest-auto-complete-enum>\n <s-control-errors [control]=\"pixAccountFormGroup.get('pixKeyType')\"\n [errorMessages]=\"{ required: 'hcm.payroll.required' | translate }\">\n </s-control-errors>\n </div>\n <!--Chave Pix-->\n <div class=\"ui-md-6 ui-sm-12 required\">\n <label>{{'hcm.payroll.employees_addition_pix_key' | translate}}</label>\n <ng-container [ngSwitch]=\"pixKeyType\">\n <input *ngSwitchCase=\"'TELEPHONE'\" only-number\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n (keyup)=\"phoneMask($event)\" maxlength=\"15\"\n placeholder=\"(__) ____-____\">\n <p-inputMask *ngSwitchCase=\"'CPF'\"\n id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n placeholder=\"___.___.___-__\"\n mask=\"999.999.999-99\" [unmask]=\"true\"></p-inputMask>\n <p-inputMask *ngSwitchCase=\"'CNPJ'\"\n id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n placeholder=\"__.___.___/____-__\"\n mask=\"99.999.999/9999-99\" [unmask]=\"true\"></p-inputMask>\n <input *ngSwitchCase=\"'EMAIL'\"\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n placeholder=\"{{'hcm.payroll.employees_addition_email'|translate}}\"/>\n <input *ngSwitchCase=\"'RANDOM_KEY'\"\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"/>\n <input *ngSwitchDefault disabled\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"/>\n </ng-container>\n <s-control-errors *ngIf=\"isShowPixKeyFieldValidatorMessage\" id=\"er-pix-key\"\n [control]=\"pixAccountFormGroup.get('pixKey')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n invalidPhoneNumber: 'hcm.payroll.employees_addition_invalid_phone_number' | translate: { value: pixAccountFormGroup.get('pixKey').value },\n invalidEmail: 'hcm.payroll.employees_addition_email_invalid' | translate,\n cpfNotValid: 'hcm.payroll.employees_addition_cpf_error' | translate,\n cnpjNotValid: 'hcm.payroll.employees_addition_cnpj_error' | translate\n }\">\n </s-control-errors>\n </div>\n <!--Percentual-->\n <div class=\"ui-md-6 ui-sm-12 required\">\n <label id=\"lb-percentage\"\n for=\"ff-percentage\">{{ 'hcm.payroll.historical_bank_account_label_percentage' | translate }}</label>\n <div class=\"ui-inputgroup\">\n <span class=\"ui-inputgroup-addon\">%</span>\n <input pInputText id=\"ff-percentage\" name=\"percentage\"\n formControlName=\"percentage\"\n currencyMask\n [options]=\"optionsPercentage\"\n [placeholder]=\"percentagePlaceholder\"/>\n </div>\n <s-control-errors [control]=\"pixAccountFormGroup.get('percentage')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n maxlength: 'hcm.payroll.error_max_length' | translate: { value: '6' },\n max: 'hcm.payroll.error_max_value_number' | translate: { value: maxValuePercentage },\n min: 'hcm.payroll.error_min_value_number' | translate: { value: '0,01' }\n }\">\n </s-control-errors>\n </div>\n <div class=\"ui-g-12\">\n <p-fieldset\n legend=\"{{ 'hcm.payroll.custom_fields' | translate }}\"\n [attr.data-hidden]=\"!customFields || !customFields.fields.length\"\n >\n <s-custom-fields\n domain=\"hcm\"\n service=\"{{customService}}\"\n entity=\"{{customEntity}}\"\n formControlName=\"customFields\"\n [invalidErrorLabel]=\"'hcm.payroll.employees_invalid_field' | translate\"\n >\n </s-custom-fields>\n </p-fieldset>\n </div>\n </div>\n </div>\n </form>\n\n <div [ngClass]=\"withSideBar ? 'footer' : 'footer-s-border'\">\n <div class=\"form-group\">\n <s-button id=\"btn-save\" label=\"{{ labelBtnAdd | translate}}\" priority=\"primary\"\n (onClick)=\"addItem()\" *ngIf=\"visibleBtnSave && !this.isView\"></s-button>\n <s-button *ngIf=\"withSideBar\" id=\"btn-close\" label=\"{{'hcm.payroll.cancel'|translate}}\" priority=\"secondary\"\n priority=\"link\" (onClick)=\"close()\"></s-button>\n </div>\n </div>\n</div>\n",
|
|
308
|
+
styles: [".refresh{width:100%!important}#table-annuity .col-default-s{width:10%}#table-annuity .col-default-m{width:12%}#table-annuity .col-default-l{width:16%}#table-annuity .col-action{width:10%}#table-annuity .icon-warning{text-align:center!important;color:#ff6d00c7!important}@media screen and (max-width:612px){#table-annuity .col-default-1,#table-annuity .col-default-2{width:16%}#table-annuity .col-default-3{width:26%}#table-annuity .col-icon{width:10%}#table-annuity .col-action{width:27%}}#main{display:-webkit-box;display:flex;height:100%;width:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}#main form{height:100%}#main .footer{border-top:1px solid #ccc;padding-top:15px;margin-top:15px;flex-shrink:0;margin-bottom:-18px}#main .footer-s-border{padding-left:7px;flex-shrink:0;margin-bottom:-18px}"]
|
|
309
|
+
})
|
|
310
|
+
], HistoricalPixAccountFormComponent);
|
|
311
|
+
export { HistoricalPixAccountFormComponent };
|
|
312
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yaWNhbC1waXgtYWNjb3VudC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3ItZ2VzdGFvLXBlc3NvYXMvcGF5cm9sbC1jb3JlLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9oaXN0b3JpY2FsLXBpeC1hY2NvdW50L2hpc3RvcmljYWwtcGl4LWFjY291bnQtZm9ybS9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGFBQWEsRUFDYixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFDSCxxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLGlCQUFpQixHQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBT25GLElBQWEsaUNBQWlDLEdBQTlDLE1BQWEsaUNBQWlDO0lBcUMxQyxZQUNZLFdBQXdCLEVBQ3hCLEVBQXFCO1FBRHJCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBNUIxQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUU1QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBRTVCLGVBQVUsR0FBYyxJQUFJ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SyxDQUFDO1lBQ2pELElBQUcsR0FBRyxFQUFFO2dCQUNKLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3hEO1NBQ0o7SUFDTCxDQUFDO0NBQ0osQ0FBQTs7WUF2UjRCLFdBQVc7WUFDcEIsaUJBQWlCOztBQXJDakM7SUFEQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7dUVBQ2Y7QUFHcEM7SUFEQyxLQUFLLEVBQUU7bUVBQzZCO0FBRXJDO0lBREMsS0FBSyxFQUFFO3VFQUNvQjtBQUU1QjtJQURDLEtBQUssRUFBRTt3RUFDcUI7QUFFN0I7SUFEQyxLQUFLLEVBQUU7c0VBQzJCO0FBRW5DO0lBREMsS0FBSyxFQUFFO3FFQUMyQjtBQUVuQztJQURDLEtBQUssRUFBRTtxRUFDeUM7QUFHakQ7SUFEQyxNQUFNLEVBQUU7d0VBQ2lFO0FBRTFFO0lBREMsTUFBTSxFQUFFOytFQUNnRTtBQTJFekU7SUFEQyxLQUFLLEVBQUU7Z0VBR1A7QUFRRDtJQURDLEtBQUssRUFBRTsyRUFlUDtBQW9GRDtJQURDLEtBQUssRUFBRTswRUFPUDtBQXlGRDtJQURDLEtBQUssRUFBRTttRUFLUDtBQTlTUSxpQ0FBaUM7SUFMN0MsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGFBQWE7UUFDdkIsNm1OQUEyRDs7S0FFOUQsQ0FBQztHQUNXLGlDQUFpQyxDQTZUN0M7U0E3VFksaUNBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgT25EZXN0cm95LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgVmFsaWRhdG9yRm4gfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IE51bWJlckxvY2FsZU9wdGlvbnMsIEN1c3RvbUZpZWxkc0NvbXBvbmVudCB9IGZyb20gXCJAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7XG4gICAgdmVyaWZ5VmFsaWRhdGlvbnNGb3JtLFxuICAgIGNvbmZpZ0VuYWJsZWRGaWVsZHMsXG4gICAgbW91bnRDdXN0b21Ub1Nob3csXG59IGZyb20gXCIuLi8uLi91dGlscy9oZWxwZXJzXCI7XG5pbXBvcnQgeyBHZW5lcmljVmFsaWRhdG9yIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2dlbmVyaWMtdmFsaWRhdG9yc1wiO1xuaW1wb3J0IHsgRm9ybWF0VXRpbHNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Zvcm1hdC11dGlscy9mb3JtYXQtdXRpbHMuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJwaXgtYWNjb3VudFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vaGlzdG9yaWNhbC1waXgtYWNjb3VudC1mb3JtLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuLi9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIEhpc3RvcmljYWxQaXhBY2NvdW50Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkKEN1c3RvbUZpZWxkc0NvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBjdXN0b21GaWVsZHM6IEN1c3RvbUZpZWxkc0NvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGN1cnJlbmN5OiBOdW1iZXJMb2NhbGVPcHRpb25zO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGN1c3RvbUVudGl0eTogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGN1c3RvbVNlcnZpY2U6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aXRoU2lkZUJhcjogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHBhcmFtc0Zvcm06IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHZpc2libGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGl4QWNjb3VudEl0ZW1Ub0xpc3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBwcml2YXRlIF92aXNpYmxlOiBib29sZWFuO1xuICAgIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHJpdmF0ZSBlbXBsb3llZUlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwaXhBY2NvdW50TGlzdDogb2JqZWN0W107XG4gICAgcHJpdmF0ZSBpbml0aWFsVmFsaWRhdG9yT2ZQZXJjZW50YWdlOiBWYWxpZGF0b3JGbltdID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDAuMDEpXTtcblxuXG4gICAgcHVibGljIGxhYmVsQnRuQWRkOiBzdHJpbmcgPSBcImhjbS5wYXlyb2xsLmVtcGxveWVlc19hZGRcIjtcbiAgICBwdWJsaWMgcGl4QWNjb3VudEZvcm1Hcm91cDogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBtYXhWYWx1ZVBlcmNlbnRhZ2U6IG51bWJlciA9IDEwMC4wMDtcbiAgICBwdWJsaWMgdmlzaWJsZUJ0blNhdmU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyBpc1ZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcGl4S2V5VHlwZTogc3RyaW5nO1xuICAgIHB1YmxpYyBpc1Nob3dQaXhLZXlGaWVsZFZhbGlkYXRvck1lc3NhZ2UgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybUdyb3VwKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJqZWN0cygpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclN1YmplY3RzKCk6IHZvaWQge1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRm9ybUdyb3VwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCksXG4gICAgICAgICAgICBpbmRleDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpLFxuICAgICAgICAgICAgZW1wbG95ZWU6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh7IHZhbHVlOiB7IHRhYmxlSWQ6IG51bGwgfSwgZGlzYWJsZWQ6IHRydWUgfSksXG4gICAgICAgICAgICBkYXRlQ2hhbmdlOiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCksXG4gICAgICAgICAgICBwaXhLZXlUeXBlOiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICAgICAgICBwaXhLZXk6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKSxcbiAgICAgICAgICAgIHBlcmNlbnRhZ2U6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuaW5pdGlhbFZhbGlkYXRvck9mUGVyY2VudGFnZSxcbiAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLm1heCh0aGlzLm1heFZhbHVlUGVyY2VudGFnZSksXG4gICAgICAgICAgICBdKSksXG4gICAgICAgICAgICBjdXN0b21GaWVsZHM6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hhbmdlUGl4S2V5VHlwZShpdGVtOiBhbnkpIHtcbiAgICAgICAgaWYgKGl0ZW0ua2V5KSB7XG4gICAgICAgICAgICB0aGlzLnBpeEtleVR5cGUgPSBpdGVtLmtleTtcbiAgICAgICAgICAgIHRoaXMuaXNTaG93UGl4S2V5RmllbGRWYWxpZGF0b3JNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGl4S2V5VmFsaWRhdG9ycygpO1xuXG4gICAgICAgICAgICBpZihpdGVtLmtleSA9PT0gXCJDUEZcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdENwZlBpeEtleSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2xlYXJQaXhLZXlUeXBlKCkge1xuICAgICAgICB0aGlzLmlzU2hvd1BpeEtleUZpZWxkVmFsaWRhdG9yTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5XCIpLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl92aXNpYmxlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRoaXMudmlzaWJsZSk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGlzRWRpdEFuZFZpZXdWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZUJ0blNhdmUgPSB0cnVlO1xuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuY3VycmVudEl0ZW0gJiYgT2JqZWN0LmtleXModmFsdWUuY3VycmVudEl0ZW0pLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLnBhdGNoVmFsdWUodGhpcy5jb252ZXJ0RFRPVG9TaG93V2l0aEN1c3RvbUZpZWxkcyh7Li4udmFsdWUuY3VycmVudEl0ZW19KSk7XG4gICAgICAgICAgICB0aGlzLmxhYmVsQnRuQWRkID0gXCJoY20ucGF5cm9sbC5lbXBsb3llZXNfdXBkYXRlXCI7XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRvcnNBY2NvcmRpbmdMaXN0KHZhbHVlLmxpc3REYXRhLCB2YWx1ZS5jdXJyZW50SXRlbVtcImluZGV4XCJdKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1ZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ0VuYWJsZUZpZWxkcyh2YWx1ZSAmJiB2YWx1ZVtcImlzRWRpdE1vZGVcIl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYWJlbEJ0bkFkZCA9IFwiaGNtLnBheXJvbGwuZW1wbG95ZWVzX2FkZFwiO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgY29udmVydERUT1RvU2hvd1dpdGhDdXN0b21GaWVsZHMoZGF0YTogb2JqZWN0KTogb2JqZWN0IHtcbiAgICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7Li4uIGRhdGF9O1xuICAgICAgICBvYmpbXCJjdXN0b21GaWVsZHNcIl0gPSBtb3VudEN1c3RvbVRvU2hvdyhvYmpbXCJjdXN0b21GaWVsZHNcIl0pO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlnRW5hYmxlRmllbGRzKGlzRWRpdE1vZGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy52aXNpYmxlQnRuU2F2ZSA9IGlzRWRpdE1vZGU7XG5cbiAgICAgICAgaWYodGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLmdldChcInBpeEtleVR5cGVcIikudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucGl4S2V5VHlwZSA9IHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlUeXBlXCIpLnZhbHVlLmtleTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGl4S2V5VmFsaWRhdG9ycygpO1xuXG4gICAgICAgICAgICBpZih0aGlzLnBpeEtleVR5cGUgPT09IFwiVEVMRVBIT05FXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5XCIpLnNldFZhbHVlKEZvcm1hdFV0aWxzU2VydmljZS5nZXRGb3JtYXR0ZWRUZWxlcGhvbmVOdW1iZXIodGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLmdldChcInBpeEtleVwiKS52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRW5hYmxlZEZpZWxkcyh0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAsIGlzRWRpdE1vZGUsIFtcbiAgICAgICAgICAgIFwicGl4S2V5VHlwZVwiLFxuICAgICAgICAgICAgXCJwaXhLZXlcIixcbiAgICAgICAgICAgIFwicGVyY2VudGFnZVwiLFxuICAgICAgICAgICAgXCJjdXN0b21GaWVsZHNcIixcbiAgICAgICAgXSwgW10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEl0ZW0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHZlcmlmeVZhbGlkYXRpb25zRm9ybS5jYWxsKHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cCk7XG5cbiAgICAgICAgaWYgKHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC52YWxpZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZW1wbG95ZWVJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJlbXBsb3llZVwiKS5zZXRWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlSWQ6IHRoaXMuZW1wbG95ZWVJZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEl0ZW1Ub0xpc3QuZW1pdCh0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKSk7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAucmVzZXQoKTtcbiAgICAgICAgdGhpcy5sYWJlbEJ0bkFkZCA9IFwiaGNtLnBheXJvbGwuZW1wbG95ZWVzX2FkZFwiO1xuICAgICAgICBpZiAodGhpcy5jdXN0b21GaWVsZHMgJiYgdGhpcy5jdXN0b21GaWVsZHMuZm9ybUdyb3VwKSB0aGlzLmN1c3RvbUZpZWxkcy5mb3JtR3JvdXAucmVzZXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QmFua1RhYmxlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuY29udHJvbHMuYmFuay52YWx1ZVxuICAgICAgICAgICAgPyBgJyR7IHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5jb250cm9scy5iYW5rLnZhbHVlLnRhYmxlSWQgfSdgXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZ2V0IHBlcmNlbnRhZ2VQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYDAkeyB0aGlzLmN1cnJlbmN5ICYmIHRoaXMuY3VycmVuY3kuZGVjaW1hbFNlcGFyYXRvciB9MDBgO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3B0aW9uc1BlcmNlbnRhZ2UoKTogb2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5nZXRPcHRpb25zKCksIHByZWNpc2lvbjogMiB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9ucygpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJlZml4OiBcIlwiLFxuICAgICAgICAgICAgdGhvdXNhbmRzOiB0aGlzLmN1cnJlbmN5LnRob3VzYW5kc1NlcGFyYXRvcixcbiAgICAgICAgICAgIGRlY2ltYWw6IHRoaXMuY3VycmVuY3kuZGVjaW1hbFNlcGFyYXRvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPIElucHV0IHF1ZSByZWNlYmUgYSBsaXN0YSBkbyBjb21wb25lbnQgcGFpIGUgY2hhbWEgbyBtw6l0b2RvIGRlIHZhbGlkYcOnw6NvIHBhc3NhbmRvIGEgbGlzdGEgcmVjZWJpZGEuXG4gICAgICogQHBhcmFtIHBpeEFjY291bnRMaXN0XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGdldExpc3RQaXhBY2NvdW50KHBpeEFjY291bnRMaXN0OiBvYmplY3RbXSkge1xuICAgICAgICBpZiAocGl4QWNjb3VudExpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdG9yc0FjY29yZGluZ0xpc3QocGl4QWNjb3VudExpc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY2ViZSBhIGxpc3RhIGRlIHJlZ2lzdHJvcyBqw6EgaW5zZXJpZG9zIG5hIHRhYmVsYSBhZGljaW9uYSBlbSB1bWEgdmFyacOhdmVsIG9zIHZhbG9yZXMgcXVlIHNlcsOjbyB1c2Fkb3MgcGFyYVxuICAgICAqIGEgdmFsaWRhw6fDo28gZG9zIGNhbXBvcyBcInBlcmNlbnRhZ2VcIiBlIFwicGl4QWNjb3VudFwiLlxuICAgICAqIFF1YW5kbyB0ZW0gaW5kZXggc2lnbmlmaWNhIHF1ZSBlc3TDoSBlbSB1bWEgZWRpw6fDo28sIG9zIHZhbG9yZXMgbmEgcG9zacOnw6NvIGRvIHJlZ2lzdHJvIGRhIGVkacOnw6NvIChpbmRleCkgbsOjbyBzZXLDo28gYWRpY2lvbmFkb3NcbiAgICAgKiBubyBhcnJheSBkZSBjb21wYXJhw6fDo28gZG9zIHZhbGlkYXRvcnMuXG4gICAgICogQHBhcmFtIHBpeEFjY291bnRMaXN0XG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0b3JzQWNjb3JkaW5nTGlzdChwaXhBY2NvdW50TGlzdDogb2JqZWN0W10sIGluZGV4OiBudW1iZXIgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucGl4QWNjb3VudExpc3QgPSBwaXhBY2NvdW50TGlzdCAmJiBwaXhBY2NvdW50TGlzdC5sZW5ndGggPyBbLi4ucGl4QWNjb3VudExpc3RdIDogW107XG5cbiAgICAgICAgY29uc3QgcGVyY2VudGFnZUluY2x1ZGVkOiBhbnkgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5waXhBY2NvdW50TGlzdCAmJiB0aGlzLnBpeEFjY291bnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50TGlzdC5maWx0ZXIoKGZpZWxkOiBhbnksIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZFtcInBlcmNlbnRhZ2VcIl0gJiYga2V5ICE9IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2VJbmNsdWRlZC5wdXNoKGZpZWxkW1wicGVyY2VudGFnZVwiXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFBpeEtleVZhbGlkYXRvcnMoKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVBlcmNlbnRhZ2VWYWxpZChwZXJjZW50YWdlSW5jbHVkZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFudGVzIGRlIHNldGFyIG8gdmFsaWRhdG9yIHByZXBhcmEgYXMgdmFyacOhdmVpcyBuZWNlc3PDoXJpYSBwYXJhIHF1ZSBzZWphIGZlaXRhIGEgdmFsaWRhw6fDo28gZG8gY2FtcG8uXG4gICAgICovXG4gICAgcHVibGljIHNldFBpeEtleVZhbGlkYXRvcnMoKSB7XG4gICAgICAgIGNvbnN0IGdlbmVyaWNQaXhLZXkgPSB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5XCIpO1xuICAgICAgICBpZiAodGhpcy5waXhLZXlUeXBlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMucGl4S2V5VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJURUxFUEhPTkVcIjpcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY1BpeEtleS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLCBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRQaG9uZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiRU1BSUxcIjpcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY1BpeEtleS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLCBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRFbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQ1BGXCI6XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNQaXhLZXkuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCwgR2VuZXJpY1ZhbGlkYXRvci5pc1ZhbGlkQ3BmLFxuICAgICAgICAgICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDTlBKXCI6XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNQaXhLZXkuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCwgR2VuZXJpY1ZhbGlkYXRvci5pc1ZhbGlkQ25waixcbiAgICAgICAgICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiUkFORE9NX0tFWVwiOlxuICAgICAgICAgICAgICAgICAgICBnZW5lcmljUGl4S2V5LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNQaXhLZXkuc2V0VmFsaWRhdG9ycyhudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdlbmVyaWNQaXhLZXkuZW5hYmxlKCk7XG4gICAgICAgICAgICBnZW5lcmljUGl4S2V5LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0ZSBtw6l0b2RvIGNhbGN1bGEgYXMgcGFyY2VudGFnZW5zIHF1ZSBqw6EgZm9yYW0gaW5zZXJpZGFzLCBlIHNldGEgYSBkaWZlcmVuw6dhIHBhcmEgY2hlZ2FyIGVtXG4gICAgICogMTAwJSBuYSB2YWxpZGHDp8OjbyBkbyBjYW1wbyBcInBlcmNlbnRhZ2VcIiBjb21vIHVtIG5vdm8gbWF4VmFsdWU7XG4gICAgICogQHBhcmFtIGxpc3RWYWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdmFsaWRhdGVQZXJjZW50YWdlVmFsaWQobGlzdFZhbHVlOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLmdldChcInBlcmNlbnRhZ2VcIik7XG4gICAgICAgIHRoaXMubWF4VmFsdWVQZXJjZW50YWdlID0gbGlzdFZhbHVlXG4gICAgICAgICAgICAucmVkdWNlKChjdXJyZW50VmFsdWUsIHRvdGFsKSA9PiBjdXJyZW50VmFsdWUgLSB0b3RhbCxcbiAgICAgICAgICAgICAgICAxMDAuMDAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHBlcmNlbnRhZ2VcbiAgICAgICAgICAgIC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5pbml0aWFsVmFsaWRhdG9yT2ZQZXJjZW50YWdlLFxuICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4KHRoaXMubWF4VmFsdWVQZXJjZW50YWdlKSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgcGVyY2VudGFnZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGlzVmlld01vZGUoY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaXNWaWV3ID0gISEoY29uZGl0aW9uICYmICF0aGlzLndpdGhTaWRlQmFyKTtcbiAgICAgICAgdGhpcy5jb25maWdFbmFibGVGaWVsZHMoIXRoaXMuaXNWaWV3KTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmlldykgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGhvbmVNYXNrKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgRm9ybWF0VXRpbHNTZXJ2aWNlLmZvcm1hdFRlbGVwaG9uZUlucHV0RXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIHNldERlZmF1bHRDcGZQaXhLZXkoKSB7XG4gICAgICAgIGNvbnN0IHNoZWV0RG9jdW1lbnQgPSB0aGlzLnBhcmFtc0Zvcm0uZ2V0KFwic2hlZXREb2N1bWVudFwiKTtcbiAgICAgICAgaWYoc2hlZXREb2N1bWVudCkge1xuICAgICAgICAgICAgY29uc3QgY3BmID0gc2hlZXREb2N1bWVudC5nZXQoXCJjcGZOdW1iZXJcIikudmFsdWU7XG4gICAgICAgICAgICBpZihjcGYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5XCIpLnNldFZhbHVlKGNwZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|