UNPKG

@uex/web-extensions

Version:

Uex extensions for Angular 6+ web projects

473 lines 35.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/modules/button/button.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ElementRef } from '@angular/core'; import * as _ from 'lodash'; import { RippleDirective } from './directives/ripple.directive'; /** * Define estilos de botões para elementos. Por razões de acessibilidade, os botões usam um elemento button padrão. * * É uma abstração para os [botões do Bootstrap 4]{\@link https://getbootstrap.com/docs/4.1/components/buttons}, com algumas melhorias e estilos personalizados. * * Demo: {\@link https://gituex.gitlab.io/extensions/web-extensions#components/button} */ export class ButtonComponent extends RippleDirective { /** * @ignore * @param {?} elementRef */ constructor(elementRef) { super(elementRef); this.elementRef = elementRef; /** * Define o atributo "title" de layout que será aplicado ao botão */ this.type = 'button'; this._color = 'primary'; this._mode = 'raised'; this._size = 'default'; this._rounded = false; this._block = false; this._icon_only = false; this._icon_right = false; this._icon_left = false; this._classes = []; this.is_button = false; } /** * Define o modo de layout que será aplicado ao botão * @private * @param {?} mode * @return {?} */ set _setMode(mode) { this._mode = mode; this._updateClasses(); } /** * Define a cor que será aplicada ao botão * @private * @param {?} color * @return {?} */ set _setColor(color) { this._color = color; this._updateClasses(); } /** * Define o tamanho que será aplicado ao botão * @private * @param {?} size * @return {?} */ set _setSize(size) { this._size = size; this._updateClasses(); } /** * Define se será aplicada borda arredondada ao botão * @private * @param {?} rounded * @return {?} */ set _setRounded(rounded) { this._rounded = this._getAttribute(rounded, true); this._updateClasses(); } /** * Define se será aplicada largura "100%" arredondada ao botão * @private * @param {?} block * @return {?} */ set _setBlock(block) { this._block = this._getAttribute(block, true); this._updateClasses(); } /** * Define se o botão deverá se ajustar para receber apenas um icone * @private * @param {?} icon_only * @return {?} */ set _setIconOnly(icon_only) { this._icon_only = this._getAttribute(icon_only, true); this._updateClasses(); } /** * Define se o botão deverá se ajustar para receber um icone a direita * @private * @param {?} icon_right * @return {?} */ set _setIconRight(icon_right) { this._icon_right = this._getAttribute(icon_right, true); this._updateClasses(); } /** * Define se o botão deverá se ajustar para receber um icone a esquerda * @private * @param {?} icon_left * @return {?} */ set _setIconLeft(icon_left) { this._icon_left = this._getAttribute(icon_left, true); this._updateClasses(); } /** * @return {?} */ ngOnInit() { this.is_button = this.elementRef.nativeElement.tagName == 'BUTTON'; this._updateClasses(); } /** * Distância do elemento para o topo do elemento pai mais próximo posicionado com relative * @return {?} */ get offsetTop() { return this.elementRef.nativeElement.offsetTop; } /** * Dispara o gatilho de focus do botão * * @param {?=} has_delay * @return {?} */ focus(has_delay = false) { if (has_delay) { setTimeout((/** * @return {?} */ () => this._doFocus()), 300); } else { this._doFocus(); } } /** * \@internal * @return {?} */ hasRipple() { return !this.no_ripple && !this._isOutline(); } /** * \@internal * @return {?} */ isDarkRipple() { return this.hasRipple() && this._isClear(); } // Modes /** * @private * @return {?} */ _isFab() { return this._mode == 'fab'; } /** * @private * @return {?} */ _isFabFlat() { return this._mode == 'fab-flat'; } /** * @private * @return {?} */ _isClear() { return this._mode == 'clear'; } /** * @private * @return {?} */ _isIcon() { return this._mode == 'icon'; } /** * @private * @return {?} */ _isOutline() { return this._mode == 'outline'; } /** * @private * @return {?} */ _isRaised() { return this._mode == 'raised'; } // Sizes /** * @private * @return {?} */ _isXSmall() { return this._size == 'micro' || this._size == 'xsmall' || this._size == 'xs'; } /** * @private * @return {?} */ _isSmall() { return this._size == 'mini' || this._size == 'small' || this._size == 'sm'; } /** * @private * @return {?} */ _isLarge() { return this._size == 'large' || this._size == 'lg'; } /** * @private * @return {?} */ _isXLarge() { return this._size == 'xlarge' || this._size == 'xl'; } // Miscellaneous /** * @private * @return {?} */ _isRounded() { return this._rounded && !this._isIcon() && !this._isFab() && !this._isFabFlat(); } /** * @private * @return {?} */ _isBlock() { return this._block && !this._isIcon() && !this._isFab() && !this._isFabFlat(); } /** * @private * @return {?} */ _isIconOnly() { return this._icon_only && !this._isIcon() && !this._isFab() && !this._isFabFlat(); } /** * @private * @return {?} */ _isIconRight() { return this._icon_right && !this._isIcon() && !this._isFab() && !this._isFabFlat(); } /** * @private * @return {?} */ _isIconLeft() { return this._icon_left && !this._isIcon() && !this._isFab() && !this._isFabFlat(); } // Colors /** * @private * @return {?} */ _updateClasses() { this._clearClasses(); this._classes.push('btn'); if (this._isFab()) { this._classes.push('btn-fab'); } if (this._isFabFlat()) { this._classes.push('btn-fab-flat'); } if (this._isClear()) { this._classes.push('btn-clear'); } if (this._isIcon()) { this._classes.push('btn-icon'); } if (this._isOutline()) { this._classes.push('btn-outline'); } if (this._isRaised()) { this._classes.push('btn-raised'); } if (this._isRounded()) { this._classes.push('btn-rounded'); } if (this._isBlock()) { this._classes.push('btn-block'); } if (this._isIconOnly()) { this._classes.push('btn-icon-only'); } if (this._isIconRight()) { this._classes.push('btn-icon-right'); } if (this._isIconLeft()) { this._classes.push('btn-icon-left'); } if (this._isXSmall()) { this._classes.push('btn-xs'); } if (this._isSmall()) { this._classes.push('btn-sm'); } if (this._isLarge()) { this._classes.push('btn-lg'); } if (this._isXLarge()) { this._classes.push('btn-xl'); } if (this._color == 'link') { this._classes.push(`btn-${this._color}`); } else { this._classes.push(`btn-${this._isOutline() ? 'outline-' : ''}${this._color || 'default'}`); } this._setClasses(); } /** * @private * @return {?} */ _clearClasses() { if (this._classes) { /** @type {?} */ const current_classes = this.elementRef.nativeElement.className.split(' '); this._classes.forEach((/** * @param {?} _class * @return {?} */ (_class) => { /** @type {?} */ const index = current_classes.indexOf(_class); if (index > -1) { current_classes.splice(index, 1); } })); this._classes = []; this.elementRef.nativeElement.className = current_classes.join(' '); } } /** * @private * @return {?} */ _setClasses() { /** @type {?} */ const current_classes = this.elementRef.nativeElement.className.split(' ').filter((/** * @param {?} i * @return {?} */ (i) => !!i)); this.elementRef.nativeElement.className = _.concat(current_classes, this._classes).join(' '); } /** * @private * @return {?} */ _doFocus() { this.elementRef.nativeElement.focus(); } /** * @private * @template T * @param {?} value * @param {?=} boolean * @return {?} */ _getAttribute(value, boolean = false) { if (boolean) { return (_.isString(value) && value !== 'false') || (_.isBoolean(value) && !!value); } return !!value ? value : null; } } ButtonComponent.decorators = [ { type: Component, args: [{ selector: '[uex-button]', template: "<ng-content></ng-content>\r\n", host: { 'class': 'uex-button', '[attr.type]': 'is_button ? type : null', '[class.with-ripple]': 'hasRipple()', '[class.ripple-dark]': 'isDarkRipple()' } }] } ]; /** @nocollapse */ ButtonComponent.ctorParameters = () => [ { type: ElementRef } ]; ButtonComponent.propDecorators = { type: [{ type: Input, args: ['type',] }], _setMode: [{ type: Input, args: ['mode',] }], _setColor: [{ type: Input, args: ['color',] }], _setSize: [{ type: Input, args: ['size',] }], _setRounded: [{ type: Input, args: ['rounded',] }], _setBlock: [{ type: Input, args: ['block',] }], _setIconOnly: [{ type: Input, args: ['icon-only',] }], _setIconRight: [{ type: Input, args: ['icon-right',] }], _setIconLeft: [{ type: Input, args: ['icon-left',] }] }; if (false) { /** * Define o atributo "title" de layout que será aplicado ao botão * @type {?} */ ButtonComponent.prototype.type; /** * @type {?} * @private */ ButtonComponent.prototype._color; /** * @type {?} * @private */ ButtonComponent.prototype._mode; /** * @type {?} * @private */ ButtonComponent.prototype._size; /** * @type {?} * @private */ ButtonComponent.prototype._rounded; /** * @type {?} * @private */ ButtonComponent.prototype._block; /** * @type {?} * @private */ ButtonComponent.prototype._icon_only; /** * @type {?} * @private */ ButtonComponent.prototype._icon_right; /** * @type {?} * @private */ ButtonComponent.prototype._icon_left; /** * @type {?} * @private */ ButtonComponent.prototype._classes; /** @type {?} */ ButtonComponent.prototype.is_button; /** @type {?} */ ButtonComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1ZXgvd2ViLWV4dGVuc2lvbnMvIiwic291cmNlcyI6WyJsaWIvbW9kdWxlcy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7O0FBbUJoRSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlOzs7OztJQWtGbEQsWUFDUyxVQUFzQjtRQUU3QixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFGWCxlQUFVLEdBQVYsVUFBVSxDQUFZOzs7O1FBOUVoQixTQUFJLEdBQUcsUUFBUSxDQUFDO1FBbUZ2QixXQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ25CLFVBQUssR0FBZSxRQUFRLENBQUM7UUFDN0IsVUFBSyxHQUFlLFNBQVMsQ0FBQztRQUM5QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbkIsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFFOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztJQWJ6QixDQUFDOzs7Ozs7O0lBNUVELElBQ1ksUUFBUSxDQUFDLElBQWdCO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDOzs7Ozs7O0lBS0QsSUFDWSxTQUFTLENBQUMsS0FBYTtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FB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WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUFFO1FBRTNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FBRTtRQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQUU7UUFDekQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUFFO1FBQ2hFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUFFO1FBQ2xFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FBRTtRQUVoRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQUU7UUFDdkQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUFFO1FBQ3RELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FBRTtRQUN0RCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQUU7UUFFdkQsSUFBSSxJQUFJLENBQUMsTUFB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U0FBQyxXQUFXOzs7Ozs7O0lBcEVsQiwrQkFBK0I7Ozs7O0lBbUYvQixpQ0FBMkI7Ozs7O0lBQzNCLGdDQUFxQzs7Ozs7SUFDckMsZ0NBQXNDOzs7OztJQUN0QyxtQ0FBeUI7Ozs7O0lBQ3pCLGlDQUF1Qjs7Ozs7SUFDdkIscUNBQTJCOzs7OztJQUMzQixzQ0FBNEI7Ozs7O0lBQzVCLHFDQUEyQjs7Ozs7SUFFM0IsbUNBQXFDOztJQUVyQyxvQ0FBeUI7O0lBaEJ2QixxQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcblxyXG5pbXBvcnQgeyBSaXBwbGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvcmlwcGxlLmRpcmVjdGl2ZSc7XHJcblxyXG4vKipcclxuICogRGVmaW5lIGVzdGlsb3MgZGUgYm90w7VlcyBwYXJhIGVsZW1lbnRvcy4gUG9yIHJhesO1ZXMgZGUgYWNlc3NpYmlsaWRhZGUsIG9zIGJvdMO1ZXMgdXNhbSB1bSBlbGVtZW50byBidXR0b24gcGFkcsOjby5cclxuICpcclxuICogw4kgdW1hIGFic3RyYcOnw6NvIHBhcmEgb3MgW2JvdMO1ZXMgZG8gQm9vdHN0cmFwIDRde0BsaW5rIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzQuMS9jb21wb25lbnRzL2J1dHRvbnN9LCBjb20gYWxndW1hcyBtZWxob3JpYXMgZSBlc3RpbG9zIHBlcnNvbmFsaXphZG9zLlxyXG4gKlxyXG4gKiBEZW1vOiB7QGxpbmsgaHR0cHM6Ly9naXR1ZXguZ2l0bGFiLmlvL2V4dGVuc2lvbnMvd2ViLWV4dGVuc2lvbnMjY29tcG9uZW50cy9idXR0b259XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1t1ZXgtYnV0dG9uXScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2J1dHRvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgaG9zdDoge1xyXG4gICAgJ2NsYXNzJzogJ3VleC1idXR0b24nLFxyXG4gICAgJ1thdHRyLnR5cGVdJzogJ2lzX2J1dHRvbiA/IHR5cGUgOiBudWxsJyxcclxuICAgICdbY2xhc3Mud2l0aC1yaXBwbGVdJzogJ2hhc1JpcHBsZSgpJyxcclxuICAgICdbY2xhc3MucmlwcGxlLWRhcmtdJzogJ2lzRGFya1JpcHBsZSgpJ1xyXG4gIH1cclxufSlcclxuZXhwb3J0IGNsYXNzIEJ1dHRvbkNvbXBvbmVudCBleHRlbmRzIFJpcHBsZURpcmVjdGl2ZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBvIGF0cmlidXRvIFwidGl0bGVcIiBkZSBsYXlvdXQgcXVlIHNlcsOhIGFwbGljYWRvIGFvIGJvdMOjb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgndHlwZScpIHR5cGUgPSAnYnV0dG9uJztcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIG8gbW9kbyBkZSBsYXlvdXQgcXVlIHNlcsOhIGFwbGljYWRvIGFvIGJvdMOjb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgnbW9kZScpXHJcbiAgcHJpdmF0ZSBzZXQgX3NldE1vZGUobW9kZTogQnV0dG9uTW9kZSkge1xyXG4gICAgdGhpcy5fbW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLl91cGRhdGVDbGFzc2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgYSBjb3IgcXVlIHNlcsOhIGFwbGljYWRhIGFvIGJvdMOjb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgnY29sb3InKVxyXG4gIHByaXZhdGUgc2V0IF9zZXRDb2xvcihjb2xvcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jb2xvciA9IGNvbG9yO1xyXG4gICAgdGhpcy5fdXBkYXRlQ2xhc3NlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIG8gdGFtYW5obyBxdWUgc2Vyw6EgYXBsaWNhZG8gYW8gYm90w6NvXHJcbiAgICovXHJcbiAgQElucHV0KCdzaXplJylcclxuICBwcml2YXRlIHNldCBfc2V0U2l6ZShzaXplOiBCdXR0b25TaXplKSB7XHJcbiAgICB0aGlzLl9zaXplID0gc2l6ZTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBzZSBzZXLDoSBhcGxpY2FkYSBib3JkYSBhcnJlZG9uZGFkYSBhbyBib3TDo29cclxuICAgKi9cclxuICBASW5wdXQoJ3JvdW5kZWQnKVxyXG4gIHByaXZhdGUgc2V0IF9zZXRSb3VuZGVkKHJvdW5kZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3JvdW5kZWQgPSB0aGlzLl9nZXRBdHRyaWJ1dGUocm91bmRlZCwgdHJ1ZSk7XHJcbiAgICB0aGlzLl91cGRhdGVDbGFzc2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgc2Ugc2Vyw6EgYXBsaWNhZGEgbGFyZ3VyYSBcIjEwMCVcIiBhcnJlZG9uZGFkYSBhbyBib3TDo29cclxuICAgKi9cclxuICBASW5wdXQoJ2Jsb2NrJylcclxuICBwcml2YXRlIHNldCBfc2V0QmxvY2soYmxvY2s6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Jsb2NrID0gdGhpcy5fZ2V0QXR0cmlidXRlKGJsb2NrLCB0cnVlKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBzZSBvIGJvdMOjbyBkZXZlcsOhIHNlIGFqdXN0YXIgcGFyYSByZWNlYmVyIGFwZW5hcyB1bSBpY29uZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnaWNvbi1vbmx5JylcclxuICBwcml2YXRlIHNldCBfc2V0SWNvbk9ubHkoaWNvbl9vbmx5OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pY29uX29ubHkgPSB0aGlzLl9nZXRBdHRyaWJ1dGUoaWNvbl9vbmx5LCB0cnVlKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBzZSBvIGJvdMOjbyBkZXZlcsOhIHNlIGFqdXN0YXIgcGFyYSByZWNlYmVyIHVtIGljb25lIGEgZGlyZWl0YVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnaWNvbi1yaWdodCcpXHJcbiAgcHJpdmF0ZSBzZXQgX3NldEljb25SaWdodChpY29uX3JpZ2h0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pY29uX3JpZ2h0ID0gdGhpcy5fZ2V0QXR0cmlidXRlKGljb25fcmlnaHQsIHRydWUpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ2xhc3NlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIHNlIG8gYm90w6NvIGRldmVyw6Egc2UgYWp1c3RhciBwYXJhIHJlY2ViZXIgdW0gaWNvbmUgYSBlc3F1ZXJkYVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnaWNvbi1sZWZ0JylcclxuICBwcml2YXRlIHNldCBfc2V0SWNvbkxlZnQoaWNvbl9sZWZ0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pY29uX2xlZnQgPSB0aGlzLl9nZXRBdHRyaWJ1dGUoaWNvbl9sZWZ0LCB0cnVlKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmXHJcbiAgKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbG9yID0gJ3ByaW1hcnknO1xyXG4gIHByaXZhdGUgX21vZGU6IEJ1dHRvbk1vZGUgPSAncmFpc2VkJztcclxuICBwcml2YXRlIF9zaXplOiBCdXR0b25TaXplID0gJ2RlZmF1bHQnO1xyXG4gIHByaXZhdGUgX3JvdW5kZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9ibG9jayA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2ljb25fb25seSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2ljb25fcmlnaHQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pY29uX2xlZnQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfY2xhc3NlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICBwdWJsaWMgaXNfYnV0dG9uID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaXNfYnV0dG9uID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudGFnTmFtZSA9PSAnQlVUVE9OJztcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3TDom5jaWEgZG8gZWxlbWVudG8gcGFyYSBvIHRvcG8gZG8gZWxlbWVudG8gcGFpIG1haXMgcHLDs3hpbW8gcG9zaWNpb25hZG8gY29tIHJlbGF0aXZlXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBvZmZzZXRUb3AoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXJhIG8gZ2F0aWxobyBkZSBmb2N1cyBkbyBib3TDo29cclxuICAgKlxyXG4gICAqIEBwYXJhbSBbaGFzX2RlbGF5PWZhbHNlXSAtIEFkaWNpb25hIHVtIGRlbGF5IGRlIDMwMG1zIHBhcmEgZGlzcGFyYXIgbyBnYXRpbGhvIGRlcG9pc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBmb2N1cyhoYXNfZGVsYXk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKGhhc19kZWxheSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2RvRm9jdXMoKSwgMzAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RvRm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNSaXBwbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMubm9fcmlwcGxlICYmICF0aGlzLl9pc091dGxpbmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0RhcmtSaXBwbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNSaXBwbGUoKSAmJiB0aGlzLl9pc0NsZWFyKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gTW9kZXNcclxuXHJcbiAgcHJpdmF0ZSBfaXNGYWIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZSA9PSAnZmFiJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzRmFiRmxhdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlID09ICdmYWItZmxhdCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0NsZWFyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGUgPT0gJ2NsZWFyJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzSWNvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlID09ICdpY29uJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzT3V0bGluZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlID09ICdvdXRsaW5lJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzUmFpc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGUgPT0gJ3JhaXNlZCc7XHJcbiAgfVxyXG5cclxuICAvLyBTaXplc1xyXG5cclxuICBwcml2YXRlIF9pc1hTbWFsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zaXplID09ICdtaWNybycgfHwgdGhpcy5fc2l6ZSA9PSAneHNtYWxsJyB8fCB0aGlzLl9zaXplID09ICd4cyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1NtYWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NpemUgPT0gJ21pbmknIHx8IHRoaXMuX3NpemUgPT0gJ3NtYWxsJyB8fCB0aGlzLl9zaXplID09ICdzbSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0xhcmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NpemUgPT0gJ2xhcmdlJyB8fCB0aGlzLl9zaXplID09ICdsZyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1hMYXJnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zaXplID09ICd4bGFyZ2UnIHx8IHRoaXMuX3NpemUgPT0gJ3hsJztcclxuICB9XHJcblxyXG4gIC8vIE1pc2NlbGxhbmVvdXNcclxuXHJcbiAgcHJpdmF0ZSBfaXNSb3VuZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JvdW5kZWQgJiYgIXRoaXMuX2lzSWNvbigpICYmICF0aGlzLl9pc0ZhYigpICYmICF0aGlzLl9pc0ZhYkZsYXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmxvY2sgJiYgIXRoaXMuX2lzSWNvbigpICYmICF0aGlzLl9pc0ZhYigpICYmICF0aGlzLl9pc0ZhYkZsYXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzSWNvbk9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faWNvbl9vbmx5ICYmICF0aGlzLl9pc0ljb24oKSAmJiAhdGhpcy5faXNGYWIoKSAmJiAhdGhpcy5faXNGYWJGbGF0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0ljb25SaWdodCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pY29uX3JpZ2h0ICYmICF0aGlzLl9pc0ljb24oKSAmJiAhdGhpcy5faXNGYWIoKSAmJiAhdGhpcy5faXNGYWJGbGF0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0ljb25MZWZ0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ljb25fbGVmdCAmJiAhdGhpcy5faXNJY29uKCkgJiYgIXRoaXMuX2lzRmFiKCkgJiYgIXRoaXMuX2lzRmFiRmxhdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29sb3JzXHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZUNsYXNzZXMoKSB7XHJcbiAgICB0aGlzLl9jbGVhckNsYXNzZXMoKTtcclxuXHJcbiAgICB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bicpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pc0ZhYigpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLWZhYicpOyB9XHJcbiAgICBpZiAodGhpcy5faXNGYWJGbGF0KCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4tZmFiLWZsYXQnKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzQ2xlYXIoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1jbGVhcicpOyB9XHJcbiAgICBpZiAodGhpcy5faXNJY29uKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4taWNvbicpOyB9XHJcbiAgICBpZiAodGhpcy5faXNPdXRsaW5lKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4tb3V0bGluZScpOyB9XHJcbiAgICBpZiAodGhpcy5faXNSYWlzZWQoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1yYWlzZWQnKTsgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc1JvdW5kZWQoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1yb3VuZGVkJyk7IH1cclxuICAgIGlmICh0aGlzLl9pc0Jsb2NrKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4tYmxvY2snKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzSWNvbk9ubHkoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1pY29uLW9ubHknKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzSWNvblJpZ2h0KCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4taWNvbi1yaWdodCcpOyB9XHJcbiAgICBpZiAodGhpcy5faXNJY29uTGVmdCgpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLWljb24tbGVmdCcpOyB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzWFNtYWxsKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4teHMnKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzU21hbGwoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1zbScpOyB9XHJcbiAgICBpZiAodGhpcy5faXNMYXJnZSgpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLWxnJyk7IH1cclxuICAgIGlmICh0aGlzLl9pc1hMYXJnZSgpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLXhsJyk7IH1cclxuXHJcbiAgICBpZiAodGhpcy5fY29sb3IgPT0gJ2xpbmsnKSB7XHJcbiAgICAgIHRoaXMuX2NsYXNzZXMucHVzaChgYnRuLSR7dGhpcy5fY29sb3J9YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9jbGFzc2VzLnB1c2goYGJ0bi0ke3RoaXMuX2lzT3V0bGluZSgpID8gJ291dGxpbmUtJyA6ICcnfSR7dGhpcy5fY29sb3IgfHwgJ2RlZmF1bHQnfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NldENsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFyQ2xhc3NlcygpIHtcclxuICAgIGlmICh0aGlzLl9jbGFzc2VzKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRfY2xhc3NlcyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpO1xyXG4gICAgICB0aGlzLl9jbGFzc2VzLmZvckVhY2goKF9jbGFzcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudF9jbGFzc2VzLmluZGV4T2YoX2NsYXNzKTtcclxuICAgICAgICBpZiAoaW5kZXggPiAtMSkgeyBjdXJyZW50X2NsYXNzZXMuc3BsaWNlKGluZGV4LCAxKTsgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fY2xhc3NlcyA9IFtdO1xyXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc05hbWUgPSBjdXJyZW50X2NsYXNzZXMuam9pbignICcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0Q2xhc3NlcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRfY2xhc3NlcyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcigoaSkgPT4gISFpKTtcclxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZSA9IF8uY29uY2F0KGN1cnJlbnRfY2xhc3NlcywgdGhpcy5fY2xhc3Nlcykuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZG9Gb2N1cygpIHtcclxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRBdHRyaWJ1dGU8VD4odmFsdWU6IGFueSwgYm9vbGVhbjogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgIGlmIChib29sZWFuKSB7IHJldHVybiAoXy5pc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUgIT09ICdmYWxzZScpIHx8IChfLmlzQm9vbGVhbih2YWx1ZSkgJiYgISF2YWx1ZSk7IH1cclxuICAgIHJldHVybiAhIXZhbHVlID8gdmFsdWUgOiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxudHlwZSBCdXR0b25Nb2RlRGVmYXVsdCA9ICdmbGF0JztcclxudHlwZSBCdXR0b25Nb2RlRmFiID0gJ2ZhYicgfCAnZmFiLWZsYXQnO1xyXG50eXBlIEJ1dHRvbk1vZGVDbGVhciA9ICdjbGVhcic7XHJcbnR5cGUgQnV0dG9uTW9kZUljb24gPSAnaWNvbic7XHJcbnR5cGUgQnV0dG9uTW9kZVJhaXNlZCA9ICdyYWlzZWQnO1xyXG50eXBlIEJ1dHRvbk1vZGVPdXRsaW5lID0gJ291dGxpbmUnO1xyXG5cclxuLyoqXHJcbiAqIE1vZG9zIHN1cG9ydGFkb3MgcGVsbyBib3TDo29cclxuICovXHJcbmV4cG9ydCB0eXBlIEJ1dHRvbk1vZGUgPSBCdXR0b25Nb2RlRGVmYXVsdCB8IEJ1dHRvbk1vZGVGYWIgfCBCdXR0b25Nb2RlQ2xlYXIgfCBCdXR0b25Nb2RlSWNvbiB8IEJ1dHRvbk1vZGVSYWlzZWQgfCBCdXR0b25Nb2RlT3V0bGluZTtcclxuXHJcbnR5cGUgQnV0dG9uU2l6ZURlZmF1bHQgPSAnZGVmYXVsdCc7XHJcbnR5cGUgQnV0dG9uU2l6ZVhTbWFsbCA9ICdtaWNybycgfCAneHNtYWxsJyB8ICd4cyc7XHJcbnR5cGUgQnV0dG9uU2l6ZVNtYWxsID0gJ21pbmknIHwgJ3NtYWxsJyB8ICdzbSc7XHJcbnR5cGUgQnV0dG9uU2l6ZUxhcmdlID0gJ2xhcmdlJyB8ICdsZyc7XHJcbnR5cGUgQnV0dG9uU2l6ZVhMYXJnZSA9ICd4bGFyZ2UnIHwgJ3hsJztcclxuXHJcbi8qKlxyXG4gKiBUYW1hbmhvcyBzdXBvcnRhZG9zIHBlbG8gYm90w6NvXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCdXR0b25TaXplID0gQnV0dG9uU2l6ZURlZmF1bHQgfCBCdXR0b25TaXplWFNtYWxsIHwgQnV0dG9uU2l6ZVNtYWxsIHwgQnV0dG9uU2l6ZUxhcmdlIHwgQnV0dG9uU2l6ZVhMYXJnZTtcclxuIl19