ng6-text-restrictions
Version:
This is a project for restrict the use of caracteres in forms inputs.
304 lines (295 loc) • 21.1 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms')) :
typeof define === 'function' && define.amd ? define('ng6-text-restrictions', ['exports', '@angular/core', '@angular/forms'], factory) :
(factory((global['ng6-text-restrictions'] = {}),global.ng.core,global.ng.forms));
}(this, (function (exports,core,forms) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var AlphaMxDirective = (function () {
function AlphaMxDirective(ngControl) {
this.ngControl = ngControl;
/**
* Expreción regular que se evalua
*/
this.ALPHA_MX = '^([A-Za-záéíóúñüÁÉÍÓÚÑÜ ])+$';
/**
* Nuevo objeto RegExp
*/
this.regExp = new RegExp(this.ALPHA_MX);
}
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* @memberof AlphaMxDirective
*/
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
AlphaMxDirective.prototype.onModelChange = /**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
this.onInputChange(event, false);
};
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* @memberof AlphaMxDirective
*/
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
AlphaMxDirective.prototype.keydownBackspace = /**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
this.onInputChange(event.target.value, true);
};
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* @memberof AlphaMxDirective
*/
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
AlphaMxDirective.prototype.onInputChange = /**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
function (event, backSpace) {
/** @type {?} */
var newVal;
if (backSpace) {
newVal = event;
this.ngControl.valueAccessor.writeValue(newVal);
}
else {
if ((this.regExp.test(event))) {
this.ngControl.valueAccessor.writeValue(event);
}
else {
newVal = event.replace(/[^A-Za-záéíóúñüÁÉÍÓÚÑÜ\s]/g, '');
this.ngControl.valueAccessor.writeValue(newVal);
}
}
};
AlphaMxDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[alhAlphaMx]'
},] },
];
/** @nocollapse */
AlphaMxDirective.ctorParameters = function () {
return [
{ type: forms.NgControl }
];
};
AlphaMxDirective.propDecorators = {
onModelChange: [{ type: core.HostListener, args: ['ngModelChange', ['$event'],] }],
keydownBackspace: [{ type: core.HostListener, args: ['keydown.backspace', ['$event'],] }]
};
return AlphaMxDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var DigitDirective = (function () {
function DigitDirective(ngControl) {
this.ngControl = ngControl;
/**
* Expreción regular que se evalua
*/
this.DIGIT = '^[0-9]*$';
/**
* Nuevo objeto RegExp
*/
this.regExp = new RegExp(this.DIGIT);
}
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* @memberof AlphaMxDirective
*/
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
DigitDirective.prototype.onModelChange = /**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
if (event !== null) {
this.onInputChange(event, false);
}
else {
this.ngControl.valueAccessor.writeValue(this.valorActual);
}
};
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* @memberof AlphaMxDirective
*/
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
DigitDirective.prototype.keydownBackspace = /**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
this.onInputChange(event.target.value, true);
};
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* @memberof AlphaMxDirective
*/
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
DigitDirective.prototype.onInputChange = /**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
function (event, backSpace) {
/** @type {?} */
var newVal;
if (backSpace) {
newVal = event;
this.ngControl.valueAccessor.writeValue(newVal);
}
else {
if ((this.regExp.test(event))) {
this.valorActual = event;
this.ngControl.valueAccessor.writeValue(this.valorActual);
}
else {
newVal = event.replace(/[^0-9]/g, '');
this.ngControl.valueAccessor.writeValue(newVal);
}
}
};
DigitDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[alhDigit]'
},] },
];
/** @nocollapse */
DigitDirective.ctorParameters = function () {
return [
{ type: forms.NgControl }
];
};
DigitDirective.propDecorators = {
onModelChange: [{ type: core.HostListener, args: ['ngModelChange', ['$event'],] }],
keydownBackspace: [{ type: core.HostListener, args: ['keydown.backspace', ['$event'],] }]
};
return DigitDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var Ng6TextRestrictionsModule = (function () {
function Ng6TextRestrictionsModule() {
}
Ng6TextRestrictionsModule.decorators = [
{ type: core.NgModule, args: [{
imports: [],
declarations: [
AlphaMxDirective,
DigitDirective,
],
exports: [
AlphaMxDirective,
DigitDirective,
]
},] },
];
return Ng6TextRestrictionsModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
exports.AlphaMxDirective = AlphaMxDirective;
exports.DigitDirective = DigitDirective;
exports.Ng6TextRestrictionsModule = Ng6TextRestrictionsModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmc2LXRleHQtcmVzdHJpY3Rpb25zLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmc2LXRleHQtcmVzdHJpY3Rpb25zL2xpYi9hbHBoYS1teC9hbHBoYS1teC5kaXJlY3RpdmUudHMiLCJuZzovL25nNi10ZXh0LXJlc3RyaWN0aW9ucy9saWIvZGlnaXQvZGlnaXQuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZzYtdGV4dC1yZXN0cmljdGlvbnMvbGliL25nNi10ZXh0LXJlc3RyaWN0aW9ucy5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYWxoQWxwaGFNeF0nXG59KVxuZXhwb3J0IGNsYXNzIEFscGhhTXhEaXJlY3RpdmUge1xuXG4gIC8qKiBFeHByZWNpw4PCs24gcmVndWxhciBxdWUgc2UgZXZhbHVhICovXG4gIHB1YmxpYyBBTFBIQV9NWCA9ICdeKFtBLVphLXrDg8Khw4PCqcODwq3Dg8Kzw4PCusODwrHDg8K8w4PCgcODwonDg8KNw4PCk8ODwprDg8KRw4PCnCBdKSskJztcbiAgLyoqICBOdWV2byBvYmpldG8gUmVnRXhwICovXG4gIHJlZ0V4cCA9IG5ldyBSZWdFeHAodGhpcy5BTFBIQV9NWCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ0NvbnRyb2w6IE5nQ29udHJvbFxuICApIHsgfVxuXG4gIC8qKlxuICAgKiBNYW5lamEgZXZlbnRvIGRlIGNhbWJpbyBlbiBlbCBpbnB1dCB5IHNlIGVqZWN1dGEgbGEgZnVuY2lvbiBvbklucHV0Q2hhbmdlLlxuICAgKiB7Kn0gZXZlbnQgVmFsb3IgZGUgaW5wdXRcbiAgICogQG1lbWJlcm9mIEFscGhhTXhEaXJlY3RpdmVcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ25nTW9kZWxDaGFuZ2UnLCBbJyRldmVudCddKVxuICBvbk1vZGVsQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlKGV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGVsIGV2ZW50byBkZSB0ZWNsYSBkZSByZXRyb2Nlc28gZW52aWFuZG8gdHJ1ZSBjb21vIHNlZ3VuZG8gcGFyYW1ldHJvLlxuICAgKiB7Kn0gZXZlbnQgRXZlbnRvIGRlIHRlY2xhIGRlIHJldHJvY2Vzb1xuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5iYWNrc3BhY2UnLCBbJyRldmVudCddKVxuICBrZXlkb3duQmFja3NwYWNlKGV2ZW50KSB7XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhIGxvcyBwYXJhbWV0cm9zIGNvbiBSZWdFeHAgeSBhY3R1YWxpemEgZWwgY29udGVuaWRvIGRlbCBpbnB1dFxuICAgKiBwb3IgbWVkaW8gZGUgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IsIHNpIGVsIHZhbG9yIG5vIGVzIHZhbGlkbyBzZSByZW1wbGF6YVxuICAgKiBlbCBjb250ZW5pZG8gY29uIGxhIGZ1bmNpb24gcmVwbGFjZS5cbiAgICogeyp9IGV2ZW50IFZhbG9yIHF1ZSBzZSBvYnRpZW5lIGRlbCBpbnB1dC5cbiAgICogeyp9IGJhY2tTcGFjZSBCYW5kZXJhIHZhbG9yIHRydWUgc2kgZWwgZXZlbnRvIGVzIGRlc2F0YWRvIHBvciBlc3RhIHRlY2xhLlxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgb25JbnB1dENoYW5nZShldmVudCwgYmFja1NwYWNlKSB7XG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nO1xuICAgIGlmIChiYWNrU3BhY2UpIHtcbiAgICAgIG5ld1ZhbCA9IGV2ZW50O1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgodGhpcy5yZWdFeHAudGVzdChldmVudCkpKSB7XG4gICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdWYWwgPSBldmVudC5yZXBsYWNlKC9bXkEtWmEtesODwqHDg8Kpw4PCrcODwrPDg8K6w4PCscODwrzDg8KBw4PCicODwo3Dg8KTw4PCmsODwpHDg8KcXFxzXS9nLCAnJyk7XG4gICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZShuZXdWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYWxoRGlnaXRdJ1xufSlcbmV4cG9ydCBjbGFzcyBEaWdpdERpcmVjdGl2ZSB7XG5cbiAgLyoqIEV4cHJlY2nDg8KzbiByZWd1bGFyIHF1ZSBzZSBldmFsdWEgKi9cbiAgcHVibGljIERJR0lUID0gJ15bMC05XSokJztcblxuICAvKiogIE51ZXZvIG9iamV0byBSZWdFeHAgKi9cbiAgcmVnRXhwID0gbmV3IFJlZ0V4cCh0aGlzLkRJR0lUKTtcblxuICAvKiogVmFsb3IgaW5ncmVzYWRvIGVuIGVsIGlucHV0ICovXG4gIHZhbG9yQWN0dWFsOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ0NvbnRyb2w6IE5nQ29udHJvbFxuICApIHsgfVxuXG4gIC8qKlxuICAgKiBNYW5lamEgZXZlbnRvIGRlIGNhbWJpbyBlbiBlbCBpbnB1dCB5IHNlIGVqZWN1dGEgbGEgZnVuY2lvbiBvbklucHV0Q2hhbmdlLlxuICAgKiB7Kn0gZXZlbnQgVmFsb3IgZGUgaW5wdXRcbiAgICogQG1lbWJlcm9mIEFscGhhTXhEaXJlY3RpdmVcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ25nTW9kZWxDaGFuZ2UnLCBbJyRldmVudCddKVxuICBvbk1vZGVsQ2hhbmdlKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoZXZlbnQsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUodGhpcy52YWxvckFjdHVhbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBlbCBldmVudG8gZGUgdGVjbGEgZGUgcmV0cm9jZXNvIGVudmlhbmRvIHRydWUgY29tbyBzZWd1bmRvIHBhcmFtZXRyby5cbiAgICogeyp9IGV2ZW50IEV2ZW50byBkZSB0ZWNsYSBkZSByZXRyb2Nlc29cbiAgICogQG1lbWJlcm9mIEFscGhhTXhEaXJlY3RpdmVcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYmFja3NwYWNlJywgWyckZXZlbnQnXSlcbiAga2V5ZG93bkJhY2tzcGFjZShldmVudCkge1xuICAgIHRoaXMub25JbnB1dENoYW5nZShldmVudC50YXJnZXQudmFsdWUsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YSBsb3MgcGFyYW1ldHJvcyBjb24gUmVnRXhwIHkgYWN0dWFsaXphIGVsIGNvbnRlbmlkbyBkZWwgaW5wdXRcbiAgICogcG9yIG1lZGlvIGRlIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yLCBzaSBlbCB2YWxvciBubyBlcyB2YWxpZG8gc2UgcmVtcGxhemFcbiAgICogZWwgY29udGVuaWRvIGNvbiBsYSBmdW5jaW9uIHJlcGxhY2UuXG4gICAqIHsqfSBldmVudCBWYWxvciBxdWUgc2Ugb2J0aWVuZSBkZWwgaW5wdXQuXG4gICAqIHsqfSBiYWNrU3BhY2UgQmFuZGVyYSB2YWxvciB0cnVlIHNpIGVsIGV2ZW50byBlcyBkZXNhdGFkbyBwb3IgZXN0YSB0ZWNsYS5cbiAgICogQG1lbWJlcm9mIEFscGhhTXhEaXJlY3RpdmVcbiAgICovXG4gIG9uSW5wdXRDaGFuZ2UoZXZlbnQsIGJhY2tTcGFjZSkge1xuICAgIGxldCBuZXdWYWw6IHN0cmluZztcbiAgICBpZiAoYmFja1NwYWNlKSB7XG4gICAgICBuZXdWYWwgPSBldmVudDtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZShuZXdWYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKHRoaXMucmVnRXhwLnRlc3QoZXZlbnQpKSkge1xuICAgICAgICB0aGlzLnZhbG9yQWN0dWFsID0gZXZlbnQ7XG4gICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZSh0aGlzLnZhbG9yQWN0dWFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbCA9IGV2ZW50LnJlcGxhY2UoL1teMC05XS9nLCAnJyk7XG4gICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZShuZXdWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaWdpdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlnaXQvZGlnaXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFscGhhTXhEaXJlY3RpdmUgfSBmcm9tICcuL2FscGhhLW14L2FscGhhLW14LmRpcmVjdGl2ZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgQWxwaGFNeERpcmVjdGl2ZSxcbiAgICBEaWdpdERpcmVjdGl2ZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEFscGhhTXhEaXJlY3RpdmUsXG4gICAgRGlnaXREaXJlY3RpdmUsXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmc2VGV4dFJlc3RyaWN0aW9uc01vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJEaXJlY3RpdmUiLCJOZ0NvbnRyb2wiLCJIb3N0TGlzdGVuZXIiLCJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBY0UsMEJBQ1U7WUFBQSxjQUFTLEdBQVQsU0FBUzs7Ozs0QkFMRCw4QkFBOEI7Ozs7MEJBRXZDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7U0FJN0I7Ozs7Ozs7Ozs7Ozs7UUFRTCx3Q0FBYTs7Ozs7OztZQURiLFVBQ2MsS0FBSztnQkFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDbEM7Ozs7Ozs7Ozs7Ozs7UUFRRCwyQ0FBZ0I7Ozs7Ozs7WUFEaEIsVUFDaUIsS0FBSztnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFVRCx3Q0FBYTs7Ozs7Ozs7Ozs7WUFBYixVQUFjLEtBQUssRUFBRSxTQUFTOztnQkFDNUIsSUFBSSxNQUFNLENBQVM7Z0JBQ25CLElBQUksU0FBUyxFQUFFO29CQUNiLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNqRDtxQkFBTTtvQkFDTCxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO3dCQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2hEO3lCQUFNO3dCQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RCxJ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