truly-ui
Version:
Web Components for Desktop Applications.
123 lines • 15.6 kB
JavaScript
import { Directive, HostListener, Inject, Input, Optional, ContentChild } from '@angular/core';
import { CURRENCY_MASK_CONFIG } from './currency-mask.config';
import { CurrencyHandler } from './currency.handler';
import { NgModel } from '@angular/forms';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "../../input";
export class CurrencyDirective {
constructor(currencyConfig, inputCurrency, keyValueDiffers) {
this.currencyConfig = currencyConfig;
this.inputCurrency = inputCurrency;
this.keyValueDiffers = keyValueDiffers;
this.currencyOptions = {};
this.subscription = new Subscription();
this.optionsTemplate = {
align: 'right',
allowNegative: true,
allowZero: true,
decimal: '.',
precision: 2,
prefix: '$ ',
suffix: '',
thousands: ',',
nullable: false
};
if (currencyConfig) {
this.optionsTemplate = currencyConfig;
}
this.keyValueDiffer = keyValueDiffers.find({}).create();
}
ngAfterContentInit() {
this.inputCurrency.textAlign = this.currencyOptions.align ? this.currencyOptions.align : this.optionsTemplate.align;
this.inputHandler.setOnModelChange(this.inputCurrency.propagateChange);
this.inputHandler.setOnModelTouched(this.inputCurrency.propagateTouched);
}
ngAfterViewInit() {
setTimeout(() => {
if (this.inputHandler.inputService.rawValue) {
this.inputHandler.inputService.rawValue = this.inputHandler.inputService.applyMask(true, this.inputHandler.inputService.rawValue);
}
});
}
ngDoCheck() {
if (this.keyValueDiffer.diff(this.currencyOptions)) {
this.inputCurrency.textAlign = this.currencyOptions.align ? this.currencyOptions.align : this.optionsTemplate.align;
this.inputHandler.updateOptions(Object.assign({}, this.optionsTemplate, this.currencyOptions));
}
}
ngOnInit() {
this.inputHandler = new CurrencyHandler(this.inputCurrency.input.nativeElement, Object.assign({}, this.optionsTemplate, this.currencyOptions));
}
handleBlur(event) {
this.inputHandler.getOnModelTouched().apply(event);
}
handleCut(event) {
if (!this.isChromeAndroid()) {
this.inputHandler.handleCut(event);
}
}
handleInput(event) {
if (this.isChromeAndroid()) {
this.inputHandler.handleInput(event);
}
}
handleKeydown(event) {
if (!this.isChromeAndroid()) {
this.inputHandler.handleKeydown(event);
}
}
handleKeypress(event) {
if (!this.isChromeAndroid()) {
this.inputHandler.handleKeypress(event);
}
}
handlePaste(event) {
if (!this.isChromeAndroid()) {
this.inputHandler.handlePaste(event);
}
}
isChromeAndroid() {
return /chrome/i.test(navigator.userAgent) && /android/i.test(navigator.userAgent);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
/** @nocollapse */ CurrencyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrencyDirective, deps: [{ token: CURRENCY_MASK_CONFIG, optional: true }, { token: i1.TlInput }, { token: i0.KeyValueDiffers }], target: i0.ɵɵFactoryTarget.Directive });
/** @nocollapse */ CurrencyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: CurrencyDirective, selector: "[currency][ngModel],[currency][formControlName]", inputs: { currencyOptions: "currencyOptions" }, host: { listeners: { "blur": "handleBlur($event)", "cut": "handleCut($event)", "input": "handleInput($event)", "keydown": "handleKeydown($event)", "keypress": "handleKeypress($event)", "paste": "handlePaste($event)" } }, queries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrencyDirective, decorators: [{
type: Directive,
args: [{
selector: '[currency][ngModel],[currency][formControlName]',
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [CURRENCY_MASK_CONFIG]
}] }, { type: i1.TlInput }, { type: i0.KeyValueDiffers }]; }, propDecorators: { currencyOptions: [{
type: Input
}], model: [{
type: ContentChild,
args: [NgModel, { static: true }]
}], handleBlur: [{
type: HostListener,
args: ['blur', ['$event']]
}], handleCut: [{
type: HostListener,
args: ['cut', ['$event']]
}], handleInput: [{
type: HostListener,
args: ['input', ['$event']]
}], handleKeydown: [{
type: HostListener,
args: ['keydown', ['$event']]
}], handleKeypress: [{
type: HostListener,
args: ['keypress', ['$event']]
}], handlePaste: [{
type: HostListener,
args: ['paste', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3kuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZGlyZWN0aXZlcy9jdXJyZW5jeS9jdXJyZW5jeS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUdOLEtBQUssRUFFTCxRQUFRLEVBQUUsWUFBWSxFQUN2QixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQWtCLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFLbEMsTUFBTSxPQUFPLGlCQUFpQjtJQXdCNUIsWUFBaUUsY0FBOEIsRUFDMUUsYUFBc0IsRUFDdEIsZUFBZ0M7UUFGWSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDMUUsa0JBQWEsR0FBYixhQUFhLENBQVM7UUFDdEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBeEI1QyxvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQU0zQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJbkMsb0JBQWUsR0FBRztZQUN2QixLQUFLLEVBQUUsT0FBTztZQUNkLGFBQWEsRUFBRSxJQUFJO1lBQ25CLFNBQVMsRUFBRSxJQUFJO1lBQ2YsT0FBTyxFQUFFLEdBQUc7WUFDWixTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLEVBQUU7WUFDVixTQUFTLEVBQUUsR0FBRztZQUNkLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFLQSxJQUFLLGNBQWMsRUFBRztZQUNwQixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztTQUN2QztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBRSxFQUFFLENBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDcEgsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBRSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBRSxDQUFDO0lBQzdFLENBQUM7SUFFRCxlQUFlO1FBQ2IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFHO2dCQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUUsQ0FBQzthQUNySTtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxlQUFlLENBQUUsRUFBRztZQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQ3BILElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFRLE1BQU8sQ0FBQyxNQUFNLENBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBRSxDQUFFLENBQUM7U0FDM0c7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUN2RSxNQUFPLENBQUMsTUFBTSxDQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUUsQ0FBRSxDQUFDO0lBQzdFLENBQUM7SUFHRCxVQUFVLENBQUUsS0FBVTtRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUMsS0FBSyxDQUFFLEtBQUssQ0FBRSxDQUFDO0lBQ3ZELENBQUM7SUFHRCxTQUFTLENBQUUsS0FBVTtRQUNuQixJQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFHO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFFLEtBQUssQ0FBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUdELFdBQVcsQ0FBRSxLQUFVO1FBQ3JCLElBQUssSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFHO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFFLEtBQUssQ0FBRSxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUdELGFBQWEsQ0FBRSxLQUFVO1FBQ3ZCLElBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUc7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUUsS0FBSyxDQUFFLENBQUM7U0FDMUM7SUFDSCxDQUFDO0lBR0QsY0FBYyxDQUFFLEtBQVU7UUFDeEIsSUFBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRztZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBRSxLQUFLLENBQUUsQ0FBQztTQUMzQztJQUNILENBQUM7SUFHRCxXQUFXLENBQUUsS0FBVTtRQUNyQixJQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFHO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFFLEtBQUssQ0FBRSxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBRSxDQUFDO0lBQ3pGLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDOztrSUF6R1UsaUJBQWlCLGtCQXdCTSxvQkFBb0I7c0hBeEIzQyxpQkFBaUIsdVlBSWIsT0FBTzs0RkFKWCxpQkFBaUI7a0JBSDdCLFNBQVM7bUJBQUU7b0JBQ1YsUUFBUSxFQUFFLGlEQUFpRDtpQkFDNUQ7OzBCQXlCZSxRQUFROzswQkFBSSxNQUFNOzJCQUFFLG9CQUFvQjtnR0F0QjdDLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRW9DLEtBQUs7c0JBQTlDLFlBQVk7dUJBQUUsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkF3RHRDLFVBQVU7c0JBRFQsWUFBWTt1QkFBRSxNQUFNLEVBQUUsQ0FBRSxRQUFRLENBQUU7Z0JBTW5DLFNBQVM7c0JBRFIsWUFBWTt1QkFBRSxLQUFLLEVBQUUsQ0FBRSxRQUFRLENBQUU7Z0JBUWxDLFdBQVc7c0JBRFYsWUFBWTt1QkFBRSxPQUFPLEVBQUUsQ0FBRSxRQUFRLENBQUU7Z0JBUXBDLGFBQWE7c0JBRFosWUFBWTt1QkFBRSxTQUFTLEVBQUUsQ0FBRSxRQUFRLENBQUU7Z0JBUXRDLGNBQWM7c0JBRGIsWUFBWTt1QkFBRSxVQUFVLEVBQUUsQ0FBRSxRQUFRLENBQUU7Z0JBUXZDLFdBQVc7c0JBRFYsWUFBWTt1QkFBRSxPQUFPLEVBQUUsQ0FBRSxRQUFRLENBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIERvQ2hlY2ssXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCwgQ29udGVudENoaWxkLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEN1cnJlbmN5Q29uZmlnLCBDVVJSRU5DWV9NQVNLX0NPTkZJRyB9IGZyb20gJy4vY3VycmVuY3ktbWFzay5jb25maWcnO1xuaW1wb3J0IHsgQ3VycmVuY3lIYW5kbGVyIH0gZnJvbSAnLi9jdXJyZW5jeS5oYW5kbGVyJztcbmltcG9ydCB7IFRsSW5wdXQgfSBmcm9tICcuLi8uLi9pbnB1dCc7XG5pbXBvcnQge05nTW9kZWx9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogJ1tjdXJyZW5jeV1bbmdNb2RlbF0sW2N1cnJlbmN5XVtmb3JtQ29udHJvbE5hbWVdJyxcbn0gKVxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5RGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIGN1cnJlbmN5T3B0aW9uczogYW55ID0ge307XG5cbiAgQENvbnRlbnRDaGlsZCggTmdNb2RlbCwge3N0YXRpYzogdHJ1ZX0gICkgbW9kZWw6IE5nTW9kZWw7XG5cbiAgcHVibGljIGlucHV0SGFuZGxlcjogQ3VycmVuY3lIYW5kbGVyO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHB1YmxpYyBrZXlWYWx1ZURpZmZlcjogS2V5VmFsdWVEaWZmZXI8YW55LCBhbnk+O1xuXG4gIHB1YmxpYyBvcHRpb25zVGVtcGxhdGUgPSB7XG4gICAgYWxpZ246ICdyaWdodCcsXG4gICAgYWxsb3dOZWdhdGl2ZTogdHJ1ZSxcbiAgICBhbGxvd1plcm86IHRydWUsXG4gICAgZGVjaW1hbDogJy4nLFxuICAgIHByZWNpc2lvbjogMixcbiAgICBwcmVmaXg6ICckICcsXG4gICAgc3VmZml4OiAnJyxcbiAgICB0aG91c2FuZHM6ICcsJyxcbiAgICBudWxsYWJsZTogZmFsc2VcbiAgfTtcblxuICBjb25zdHJ1Y3RvciggQE9wdGlvbmFsKCkgQEluamVjdCggQ1VSUkVOQ1lfTUFTS19DT05GSUcgKSBwcml2YXRlIGN1cnJlbmN5Q29uZmlnOiBDdXJyZW5jeUNvbmZpZyxcbiAgICAgICAgICAgICAgIHByaXZhdGUgaW5wdXRDdXJyZW5jeTogVGxJbnB1dCxcbiAgICAgICAgICAgICAgIHByaXZhdGUga2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMgKSB7XG4gICAgaWYgKCBjdXJyZW5jeUNvbmZpZyApIHtcbiAgICAgIHRoaXMub3B0aW9uc1RlbXBsYXRlID0gY3VycmVuY3lDb25maWc7XG4gICAgfVxuICAgIHRoaXMua2V5VmFsdWVEaWZmZXIgPSBrZXlWYWx1ZURpZmZlcnMuZmluZCgge30gKS5jcmVhdGUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmlucHV0Q3VycmVuY3kudGV4dEFsaWduID0gdGhpcy5jdXJyZW5jeU9wdGlvbnMuYWxpZ24gPyB0aGlzLmN1cnJlbmN5T3B0aW9ucy5hbGlnbiA6IHRoaXMub3B0aW9uc1RlbXBsYXRlLmFsaWduO1xuICAgIHRoaXMuaW5wdXRIYW5kbGVyLnNldE9uTW9kZWxDaGFuZ2UoIHRoaXMuaW5wdXRDdXJyZW5jeS5wcm9wYWdhdGVDaGFuZ2UgKTtcbiAgICB0aGlzLmlucHV0SGFuZGxlci5zZXRPbk1vZGVsVG91Y2hlZCggdGhpcy5pbnB1dEN1cnJlbmN5LnByb3BhZ2F0ZVRvdWNoZWQgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICggdGhpcy5pbnB1dEhhbmRsZXIuaW5wdXRTZXJ2aWNlLnJhd1ZhbHVlICkge1xuICAgICAgICB0aGlzLmlucHV0SGFuZGxlci5pbnB1dFNlcnZpY2UucmF3VmFsdWUgPSB0aGlzLmlucHV0SGFuZGxlci5pbnB1dFNlcnZpY2UuYXBwbHlNYXNrKCB0cnVlLCB0aGlzLmlucHV0SGFuZGxlci5pbnB1dFNlcnZpY2UucmF3VmFsdWUgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAoIHRoaXMua2V5VmFsdWVEaWZmZXIuZGlmZiggdGhpcy5jdXJyZW5jeU9wdGlvbnMgKSApIHtcbiAgICAgIHRoaXMuaW5wdXRDdXJyZW5jeS50ZXh0QWxpZ24gPSB0aGlzLmN1cnJlbmN5T3B0aW9ucy5hbGlnbiA/IHRoaXMuY3VycmVuY3lPcHRpb25zLmFsaWduIDogdGhpcy5vcHRpb25zVGVtcGxhdGUuYWxpZ247XG4gICAgICB0aGlzLmlucHV0SGFuZGxlci51cGRhdGVPcHRpb25zKCAoPGFueT5PYmplY3QpLmFzc2lnbigge30sIHRoaXMub3B0aW9uc1RlbXBsYXRlLCB0aGlzLmN1cnJlbmN5T3B0aW9ucyApICk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbnB1dEhhbmRsZXIgPSBuZXcgQ3VycmVuY3lIYW5kbGVyKCB0aGlzLmlucHV0Q3VycmVuY3kuaW5wdXQubmF0aXZlRWxlbWVudCxcbiAgICAgICg8YW55Pk9iamVjdCkuYXNzaWduKCB7fSwgdGhpcy5vcHRpb25zVGVtcGxhdGUsIHRoaXMuY3VycmVuY3lPcHRpb25zICkgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoICdibHVyJywgWyAnJGV2ZW50JyBdIClcbiAgaGFuZGxlQmx1ciggZXZlbnQ6IGFueSApIHtcbiAgICB0aGlzLmlucHV0SGFuZGxlci5nZXRPbk1vZGVsVG91Y2hlZCgpLmFwcGx5KCBldmVudCApO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lciggJ2N1dCcsIFsgJyRldmVudCcgXSApXG4gIGhhbmRsZUN1dCggZXZlbnQ6IGFueSApIHtcbiAgICBpZiAoICF0aGlzLmlzQ2hyb21lQW5kcm9pZCgpICkge1xuICAgICAgdGhpcy5pbnB1dEhhbmRsZXIuaGFuZGxlQ3V0KCBldmVudCApO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoICdpbnB1dCcsIFsgJyRldmVudCcgXSApXG4gIGhhbmRsZUlucHV0KCBldmVudDogYW55ICkge1xuICAgIGlmICggdGhpcy5pc0Nocm9tZUFuZHJvaWQoKSApIHtcbiAgICAgIHRoaXMuaW5wdXRIYW5kbGVyLmhhbmRsZUlucHV0KCBldmVudCApO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoICdrZXlkb3duJywgWyAnJGV2ZW50JyBdIClcbiAgaGFuZGxlS2V5ZG93biggZXZlbnQ6IGFueSApIHtcbiAgICBpZiAoICF0aGlzLmlzQ2hyb21lQW5kcm9pZCgpICkge1xuICAgICAgdGhpcy5pbnB1dEhhbmRsZXIuaGFuZGxlS2V5ZG93biggZXZlbnQgKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCAna2V5cHJlc3MnLCBbICckZXZlbnQnIF0gKVxuICBoYW5kbGVLZXlwcmVzcyggZXZlbnQ6IGFueSApIHtcbiAgICBpZiAoICF0aGlzLmlzQ2hyb21lQW5kcm9pZCgpICkge1xuICAgICAgdGhpcy5pbnB1dEhhbmRsZXIuaGFuZGxlS2V5cHJlc3MoIGV2ZW50ICk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lciggJ3Bhc3RlJywgWyAnJGV2ZW50JyBdIClcbiAgaGFuZGxlUGFzdGUoIGV2ZW50OiBhbnkgKSB7XG4gICAgaWYgKCAhdGhpcy5pc0Nocm9tZUFuZHJvaWQoKSApIHtcbiAgICAgIHRoaXMuaW5wdXRIYW5kbGVyLmhhbmRsZVBhc3RlKCBldmVudCApO1xuICAgIH1cbiAgfVxuXG4gIGlzQ2hyb21lQW5kcm9pZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL2Nocm9tZS9pLnRlc3QoIG5hdmlnYXRvci51c2VyQWdlbnQgKSAmJiAvYW5kcm9pZC9pLnRlc3QoIG5hdmlnYXRvci51c2VyQWdlbnQgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxufVxuIl19