xui
Version:
xUI Components for Angular
147 lines • 14.4 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Host, HostListener, Input, Optional, Output } from '@angular/core';
import { BUTTON_MODULE, WithConfig, XuiConfigService } from '../config';
import { delay, InputBoolean, InputNumber } from '../utils';
import { ButtonGroupComponent } from './button-group.component';
import * as i0 from "@angular/core";
import * as i1 from "../config";
import * as i2 from "./button-group.component";
import * as i3 from "@angular/common";
export class ButtonComponent {
constructor(
// TODO: Anchor for popover; consider removing it and refactoring
elementRef, configService, group, cdr) {
this.elementRef = elementRef;
this.configService = configService;
this.group = group;
this.cdr = cdr;
this._moduleName = BUTTON_MODULE;
this.state = 0;
this.shine = false;
this.disabled = false;
this.stateDelay = 5000;
// Used to emit event when user interacts with button with spacebar or enter
// eslint-disable-next-line @angular-eslint/no-output-native
this.click = new EventEmitter();
}
get styles() {
const config = this.configService.getConfigForComponent(BUTTON_MODULE);
const ret = {
'x-button': true,
'x-button--non-idle': this.state != 0,
'x-button--loading': this.state == 1,
'x-button--succeeded': this.state == 2,
'x-button--failed': this.state === 3
};
ret[`x-button-${this.size ?? this.group?.size ?? config?.size ?? 'medium'}`] = true;
ret[`x-button-${this.type ?? this.group?.type ?? config?.type ?? 'normal'}`] = true;
ret[`x-button-${this.color ?? this.group?.color ?? config?.color ?? 'primary'}`] = true;
return ret;
}
async _onAsync(event) {
event?.preventDefault();
event?.stopPropagation();
if (this.disabled) {
return;
}
this.click.emit(event);
if (!this.onClick) {
return;
}
this.state = 1;
try {
this.state = (await this.onClick()) ? 2 : 3;
}
catch {
this.state = 2;
}
this.cdr.markForCheck();
await delay(5000);
this.state = 0;
this.cdr.markForCheck();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: ButtonComponent, deps: [{ token: i0.ElementRef }, { token: i1.XuiConfigService }, { token: i2.ButtonGroupComponent, host: true, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.1", type: ButtonComponent, selector: "xui-button", inputs: { type: "type", size: "size", color: "color", shine: "shine", disabled: "disabled", onClick: "onClick", stateDelay: "stateDelay" }, outputs: { click: "click" }, host: { listeners: { "keydown.enter": "_onAsync($event)", "keydown.space": "_onAsync($event)" } }, ngImport: i0, template: `
<div
[ngClass]="styles"
[attr.disabled]="disabled || null"
[tabindex]="disabled ? -1 : 0"
(click)="_onAsync($event)"
>
<div class="x-button-content">
<ng-content></ng-content>
</div>
<div class="x-button-state-image"></div>
<div class="x-button-shine" *ngIf="shine && !disabled">
<div class="x-button-shine-inner">
<div class="x-button-shine-element"></div>
</div>
</div>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], ButtonComponent.prototype, "shine", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], ButtonComponent.prototype, "disabled", void 0);
__decorate([
InputNumber(),
WithConfig(),
__metadata("design:type", Object)
], ButtonComponent.prototype, "stateDelay", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: ButtonComponent, decorators: [{
type: Component,
args: [{
selector: 'xui-button',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div
[ngClass]="styles"
[attr.disabled]="disabled || null"
[tabindex]="disabled ? -1 : 0"
(click)="_onAsync($event)"
>
<div class="x-button-content">
<ng-content></ng-content>
</div>
<div class="x-button-state-image"></div>
<div class="x-button-shine" *ngIf="shine && !disabled">
<div class="x-button-shine-inner">
<div class="x-button-shine-element"></div>
</div>
</div>
</div>
`
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.XuiConfigService }, { type: i2.ButtonGroupComponent, decorators: [{
type: Optional
}, {
type: Host
}] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { type: [{
type: Input
}], size: [{
type: Input
}], color: [{
type: Input
}], shine: [{
type: Input
}], disabled: [{
type: Input
}], onClick: [{
type: Input
}], stateDelay: [{
type: Input
}], click: [{
type: Output
}], _onAsync: [{
type: HostListener,
args: ['keydown.enter', ['$event']]
}, {
type: HostListener,
args: ['keydown.space', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osSUFBSSxFQUNKLFlBQVksRUFDWixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBd0JoRSxNQUFNLE9BQU8sZUFBZTtJQW1CMUI7SUFDRSxpRUFBaUU7SUFDMUQsVUFBc0IsRUFDckIsYUFBK0IsRUFDWCxLQUEyQixFQUMvQyxHQUFzQjtRQUh2QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3JCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUNYLFVBQUssR0FBTCxLQUFLLENBQXNCO1FBQy9DLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBckJmLGdCQUFXLEdBQUcsYUFBYSxDQUFDO1FBRTdDLFVBQUssR0FBa0IsQ0FBQyxDQUFDO1FBS0EsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNkLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFSixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRXhELDRFQUE0RTtRQUM1RSw0REFBNEQ7UUFDekMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFRcEQsQ0FBQztJQUVKLElBQUksTUFBTTtRQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkUsTUFBTSxHQUFHLEdBQWlDO1lBQ3hDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQztZQUNyQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUM7WUFDcEMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDO1lBQ3RDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQztTQUNyQyxDQUFDO1FBRUYsR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3BGLEdBQUcsQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNwRixHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLE1BQU0sRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFeEYsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBSUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFrQztRQUMvQyxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDeEIsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVmLElBQUk7WUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0M7UUFBQyxNQUFNO1lBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDaEI7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzhHQXhFVSxlQUFlO2tHQUFmLGVBQWUsOFRBbkJoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQlQ7O0FBWXdCO0lBQWYsWUFBWSxFQUFFOzs4Q0FBZTtBQUNkO0lBQWYsWUFBWSxFQUFFOztpREFBa0I7QUFFSjtJQUE1QixXQUFXLEVBQUU7SUFBRSxVQUFVLEVBQUU7O21EQUFtQjsyRkFiN0MsZUFBZTtrQkF0QjNCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUO2lCQUNGOzswQkF3QkksUUFBUTs7MEJBQUksSUFBSTs0RUFoQlYsSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ21CLEtBQUs7c0JBQTdCLEtBQUs7Z0JBQ21CLFFBQVE7c0JBQWhDLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNnQyxVQUFVO3NCQUEvQyxLQUFLO2dCQUlhLEtBQUs7c0JBQXZCLE1BQU07Z0JBNkJELFFBQVE7c0JBRmIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUN4QyxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0LFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQlVUVE9OX01PRFVMRSwgV2l0aENvbmZpZywgWHVpQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBkZWxheSwgSW5wdXRCb29sZWFuLCBJbnB1dE51bWJlciB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IEJ1dHRvbkNvbG9yLCBCdXR0b25TaXplLCBCdXR0b25UeXBlIH0gZnJvbSAnLi9idXR0b24udHlwZXMnO1xuaW1wb3J0IHsgQnV0dG9uR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2J1dHRvbi1ncm91cC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4dWktYnV0dG9uJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgW25nQ2xhc3NdPVwic3R5bGVzXCJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIlxuICAgICAgW3RhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgIChjbGljayk9XCJfb25Bc3luYygkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwieC1idXR0b24tY29udGVudFwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ4LWJ1dHRvbi1zdGF0ZS1pbWFnZVwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIngtYnV0dG9uLXNoaW5lXCIgKm5nSWY9XCJzaGluZSAmJiAhZGlzYWJsZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIngtYnV0dG9uLXNoaW5lLWlubmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIngtYnV0dG9uLXNoaW5lLWVsZW1lbnRcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBCdXR0b25Db21wb25lbnQge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfc2hpbmU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21vZHVsZU5hbWUgPSBCVVRUT05fTU9EVUxFO1xuXG4gIHN0YXRlOiAwIHwgMSB8IDIgfCAzID0gMDtcblxuICBASW5wdXQoKSB0eXBlPzogQnV0dG9uVHlwZTtcbiAgQElucHV0KCkgc2l6ZT86IEJ1dHRvblNpemU7XG4gIEBJbnB1dCgpIGNvbG9yPzogQnV0dG9uQ29sb3I7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaGluZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgb25DbGljaz86ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIEBXaXRoQ29uZmlnKCkgc3RhdGVEZWxheSA9IDUwMDA7XG5cbiAgLy8gVXNlZCB0byBlbWl0IGV2ZW50IHdoZW4gdXNlciBpbnRlcmFjdHMgd2l0aCBidXR0b24gd2l0aCBzcGFjZWJhciBvciBlbnRlclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRPRE86IEFuY2hvciBmb3IgcG9wb3ZlcjsgY29uc2lkZXIgcmVtb3ZpbmcgaXQgYW5kIHJlZmFjdG9yaW5nXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBYdWlDb25maWdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgcHJpdmF0ZSBncm91cDogQnV0dG9uR3JvdXBDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBnZXQgc3R5bGVzKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoQlVUVE9OX01PRFVMRSk7XG4gICAgY29uc3QgcmV0OiB7IFtrbGFzczogc3RyaW5nXTogYm9vbGVhbiB9ID0ge1xuICAgICAgJ3gtYnV0dG9uJzogdHJ1ZSxcbiAgICAgICd4LWJ1dHRvbi0tbm9uLWlkbGUnOiB0aGlzLnN0YXRlICE9IDAsXG4gICAgICAneC1idXR0b24tLWxvYWRpbmcnOiB0aGlzLnN0YXRlID09IDEsXG4gICAgICAneC1idXR0b24tLXN1Y2NlZWRlZCc6IHRoaXMuc3RhdGUgPT0gMixcbiAgICAgICd4LWJ1dHRvbi0tZmFpbGVkJzogdGhpcy5zdGF0ZSA9PT0gM1xuICAgIH07XG5cbiAgICByZXRbYHgtYnV0dG9uLSR7dGhpcy5zaXplID8/IHRoaXMuZ3JvdXA/LnNpemUgPz8gY29uZmlnPy5zaXplID8/ICdtZWRpdW0nfWBdID0gdHJ1ZTtcbiAgICByZXRbYHgtYnV0dG9uLSR7dGhpcy50eXBlID8/IHRoaXMuZ3JvdXA/LnR5cGUgPz8gY29uZmlnPy50eXBlID8/ICdub3JtYWwnfWBdID0gdHJ1ZTtcbiAgICByZXRbYHgtYnV0dG9uLSR7dGhpcy5jb2xvciA/PyB0aGlzLmdyb3VwPy5jb2xvciA/PyBjb25maWc/LmNvbG9yID8/ICdwcmltYXJ5J31gXSA9IHRydWU7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uc3BhY2UnLCBbJyRldmVudCddKVxuICBhc3luYyBfb25Bc3luYyhldmVudD86IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KSB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrLmVtaXQoZXZlbnQpO1xuXG4gICAgaWYgKCF0aGlzLm9uQ2xpY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gMTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0YXRlID0gKGF3YWl0IHRoaXMub25DbGljaygpKSA/IDIgOiAzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5zdGF0ZSA9IDI7XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgdGhpcy5zdGF0ZSA9IDA7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==