ngx-teximate
Version:
Angular text animations component
306 lines • 21.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, NgZone, ElementRef, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { style, query, stagger, useAnimation, AnimationBuilder } from '@angular/animations';
import { BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
var Teximate = /** @class */ (function () {
function Teximate(animationBuilder, zone, el) {
this.animationBuilder = animationBuilder;
this.zone = zone;
this.el = el;
/**
* Stream that emits when animation is started
*/
this.playEmitter = new EventEmitter();
/**
* Stream that emits when animation is done
*/
this.finishEmitter = new EventEmitter();
/**
* Teximate animations
*/
this.players = new Map();
/**
* Teximate state
*/
this._state = new BehaviorSubject('');
this.state = this._state.pipe(map(function (text) { return teximateFactory(text); }));
}
Object.defineProperty(Teximate.prototype, "setText", {
/** Set animated text */
set: /**
* Set animated text
* @param {?} text
* @return {?}
*/
function (text) {
this._state.next(text);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Teximate.prototype, "isPlaying", {
get: /**
* @return {?}
*/
function () {
return this._isPlaying;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Teximate.prototype, "enterPlayer", {
get: /**
* @return {?}
*/
function () {
return this.players.get('enter');
},
enumerable: true,
configurable: true
});
Object.defineProperty(Teximate.prototype, "leavePlayer", {
get: /**
* @return {?}
*/
function () {
return this.players.get('leave');
},
enumerable: true,
configurable: true
});
Object.defineProperty(Teximate.prototype, "defaultPlayer", {
get: /**
* @return {?}
*/
function () {
return this.players.get('default');
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
Teximate.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this._isViewInit = true;
this.updateAnimations(true);
};
/**
* @return {?}
*/
Teximate.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
if (this._isViewInit) {
this.updateAnimations();
}
};
/**
* @return {?}
*/
Teximate.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
// TODO: Use players.forEach to destroy players
if (this.players.has('enter')) {
this.players.get('enter').destroy();
}
if (this.players.has('leave')) {
this.players.get('leave').destroy();
}
if (this.players.has('default')) {
this.players.get('default').destroy();
}
};
/**
* Register a new animation
*/
/**
* Register a new animation
* @param {?} config
* @return {?}
*/
Teximate.prototype.registerAnimation = /**
* Register a new animation
* @param {?} config
* @return {?}
*/
function (config) {
var _this = this;
/** @type {?} */
var player = this.buildAnimation(config).create(this.el.nativeElement);
/** TODO: Investigate why onStart and onDone fire only once */
player.onStart(function () {
_this._isPlaying = true;
_this.playEmitter.emit(config.id);
});
player.onDone(function () {
_this._isPlaying = false;
_this.finishEmitter.emit(config.id);
});
return this.players.set(config.id, player).get(config.id);
};
/**
* @param {?=} autoPlayEnter
* @return {?}
*/
Teximate.prototype.updateAnimations = /**
* @param {?=} autoPlayEnter
* @return {?}
*/
function (autoPlayEnter) {
var _this = this;
this.zone.runOutsideAngular(function () {
if (_this.enter) {
/** @type {?} */
var enterPlayer = _this.registerAnimation(tslib_1.__assign({}, _this.enter, { id: 'enter', isEnter: true }));
if (autoPlayEnter) {
enterPlayer.play();
}
}
if (_this.leave) {
_this.registerAnimation(tslib_1.__assign({}, _this.leave, { id: 'leave' }));
}
if (_this.animation) {
_this.registerAnimation(tslib_1.__assign({ id: 'default' }, _this.animation));
}
});
};
/**
* Build animation
*/
/**
* Build animation
* @param {?} config
* @return {?}
*/
Teximate.prototype.buildAnimation = /**
* Build animation
* @param {?} config
* @return {?}
*/
function (config) {
/** TODO: Use ':enter' and ':leave' for enter and leave animations */
return this.animationBuilder.build([
query(".teximate-" + config.type, [
// This is a workaround for enter animation to work
style({ opacity: config.isEnter ? 0 : 1 }),
stagger(config.delay, [useAnimation(config.animation)])
])
]);
};
Teximate.decorators = [
{ type: Component, args: [{
selector: 'teximate',
host: {
'aria-label': 'text'
},
template: "<p *ngFor=\"let paragraph of state | async; index as i\"\r\n class=\"teximate-paragraph teximate-paragraph-{{i}}\">\r\n\r\n <span *ngFor=\"let word of paragraph; index as j\"\r\n class=\"teximate-word teximate-word-{{j}}\">\r\n\r\n <span *ngFor=\"let letter of word; index as k\"\r\n class=\"teximate-letter teximate-letter-{{k}}\">\r\n {{letter}}\r\n </span>\r\n </span>\r\n</p>\r\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".teximate-letter,.teximate-word{display:inline-block}.teximate-word{margin-right:8px}"]
}] }
];
/** @nocollapse */
Teximate.ctorParameters = function () { return [
{ type: AnimationBuilder },
{ type: NgZone },
{ type: ElementRef }
]; };
Teximate.propDecorators = {
setText: [{ type: Input, args: ['text',] }],
enter: [{ type: Input }],
leave: [{ type: Input }],
animation: [{ type: Input }],
playEmitter: [{ type: Output, args: ['play',] }],
finishEmitter: [{ type: Output, args: ['finish',] }]
};
return Teximate;
}());
export { Teximate };
if (false) {
/**
* Animation that triggers on init
* @type {?}
*/
Teximate.prototype.enter;
/**
* Animation that triggers on destroy
* @type {?}
*/
Teximate.prototype.leave;
/**
* Animation that triggers with the play() function
* @type {?}
*/
Teximate.prototype.animation;
/**
* Stream that emits when animation is started
* @type {?}
*/
Teximate.prototype.playEmitter;
/**
* Stream that emits when animation is done
* @type {?}
*/
Teximate.prototype.finishEmitter;
/**
* Teximate animations
* @type {?}
*/
Teximate.prototype.players;
/**
* Teximate state
* @type {?}
*/
Teximate.prototype._state;
/** @type {?} */
Teximate.prototype.state;
/**
* Teximate playing state
* @type {?}
*/
Teximate.prototype._isPlaying;
/** @type {?} */
Teximate.prototype._isViewInit;
/** @type {?} */
Teximate.prototype.animationBuilder;
/** @type {?} */
Teximate.prototype.zone;
/** @type {?} */
Teximate.prototype.el;
}
/**
* Convert text string into a workable text
* @param {?} text
* @return {?}
*/
export function teximateFactory(text) {
/** @type {?} */
var paragraphs = [];
// Split text into paragraphs
text.split('\n').map(function (paragraph) {
/** @type {?} */
var words = [];
// Split paragraph into words
paragraph
.split(' ')
.filter(function (word) { return word !== ''; })
.map(function (word) {
// Split word into letters
return words.push(word.split(/(?!$)/u));
});
paragraphs.push(words);
});
return paragraphs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4aW1hdGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdGV4aW1hdGUvIiwic291cmNlcyI6WyJsaWIvdGV4aW1hdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBSU4sTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osdUJBQXVCLEVBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE9BQU8sRUFDUCxZQUFZLEVBRVosZ0JBQWdCLEVBRWpCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckM7SUEwREUsa0JBQW9CLGdCQUFrQyxFQUFVLElBQVksRUFBVSxFQUFjO1FBQWhGLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTs7OztRQWhDcEYsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBRy9CLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQUdyRCxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7Ozs7UUFHckMsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBd0IvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQVksSUFBSyxPQUFBLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBckIsQ0FBcUIsQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQWhERCxzQkFBbUIsNkJBQU87UUFEMUIsd0JBQXdCOzs7Ozs7UUFDeEIsVUFBMkIsSUFBWTtZQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQTRCRCxzQkFBSSwrQkFBUzs7OztRQUFiO1lBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBRUQsc0JBQUksaUNBQVc7Ozs7UUFBZjtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxpQ0FBVzs7OztRQUFmO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLG1DQUFhOzs7O1FBQWpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxDQUFDOzs7T0FBQTs7OztJQU1ELGtDQUFlOzs7SUFBZjtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDOzs7O0lBRUQsOEJBQVc7OztJQUFYO1FBQ0UsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQzs7OztJQUVELDhCQUFXOzs7SUFBWDtRQUNFLCtDQUErQztRQUMvQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7Ozs7OztJQUNILG9DQUFpQjs7Ozs7SUFBakIsVUFBa0IsTUFBcUI7UUFBdkMsaUJBWUM7O1lBWE8sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQ3hFLDhEQUE4RDtRQUM5RCxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ2IsS0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsS0FBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNaLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7Ozs7O0lBRU8sbUNBQWdCOzs7O0lBQXhCLFVBQXlCLGFBQXVCO1FBQWhELGlCQWVDO1FBZEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUMxQixJQUFJLEtBQUksQ0FBQyxLQUFLLEVBQUU7O29CQUNSLFdBQVcsR0FBRyxLQUFJLENBQUMsaUJBQWlCLHNCQUFLLEtBQUksQ0FBQyxLQUFLLElBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFFO2dCQUN2RixJQUFJLGFBQWEsRUFBRTtvQkFDakIsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNwQjthQUNGO1lBQ0QsSUFBSSxLQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNkLEtBQUksQ0FBQyxpQkFBaUIsc0JBQUssS0FBSSxDQUFDLEtBQUssSUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFFLENBQUM7YUFDdEQ7WUFDRCxJQUFJLEtBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLEtBQUksQ0FBQyxpQkFBaUIsb0JBQUUsRUFBRSxFQUFFLFNBQVMsSUFBSyxLQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDNUQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0ssaUNBQWM7Ozs7O0lBQXRCLFVBQXVCLE1BQXFCO1FBQzFDLHFFQUFxRTtRQUNyRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDakMsS0FBSyxDQUNILGVBQWEsTUFBTSxDQUFDLElBQU0sRUFDMUI7Z0JBQ0UsbURBQW1EO2dCQUNuRCxLQUFLLENBQUMsRUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDeEQsQ0FDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O2dCQXZJRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLElBQUksRUFBRTt3QkFDSixZQUFZLEVBQUUsTUFBTTtxQkFDckI7b0JBQ0Qsc2JBQThCO29CQUU5QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7aUJBQ2hEOzs7O2dCQWZDLGdCQUFnQjtnQkFYaEIsTUFBTTtnQkFDTixVQUFVOzs7MEJBNkJULEtBQUssU0FBQyxNQUFNO3dCQUtaLEtBQUs7d0JBR0wsS0FBSzs0QkFHTCxLQUFLOzhCQUdMLE1BQU0sU0FBQyxNQUFNO2dDQUdiLE1BQU0sU0FBQyxRQUFROztJQTJHbEIsZUFBQztDQUFBLEFBeElELElBd0lDO1NBL0hZLFFBQVE7Ozs7OztJQVFuQix5QkFBOEI7Ozs7O0lBRzlCLHlCQUE4Qjs7Ozs7SUFHOUIsNkJBQWtDOzs7OztJQUdsQywrQkFBaUQ7Ozs7O0lBR2pELGlDQUFxRDs7Ozs7SUFHckQsMkJBQTZDOzs7OztJQUc3QywwQkFBaUQ7O0lBQ2pELHlCQUFnQzs7Ozs7SUFHaEMsOEJBQTRCOztJQUM1QiwrQkFBNkI7O0lBa0JqQixvQ0FBMEM7O0lBQUUsd0JBQW9COztJQUFFLHNCQUFzQjs7Ozs7OztBQWlGdEcsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZOztRQUNwQyxVQUFVLEdBQWlCLEVBQUU7SUFDbkMsNkJBQTZCO0lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsU0FBaUI7O1lBQy9CLEtBQUssR0FBZSxFQUFFO1FBQzVCLDZCQUE2QjtRQUM3QixTQUFTO2FBQ04sS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNWLE1BQU0sQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksS0FBSyxFQUFFLEVBQVgsQ0FBVyxDQUFDO2FBQzNCLEdBQUcsQ0FBQyxVQUFDLElBQVk7WUFDaEIsMEJBQTBCO1lBQzFCLE9BQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQWhDLENBQWdDLENBQ2pDLENBQUM7UUFDSixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE5nWm9uZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIHN0eWxlLFxuICBxdWVyeSxcbiAgc3RhZ2dlcixcbiAgdXNlQW5pbWF0aW9uLFxuICBBbmltYXRpb25QbGF5ZXIsXG4gIEFuaW1hdGlvbkJ1aWxkZXIsXG4gIEFuaW1hdGlvbkZhY3Rvcnlcbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRleHRBbmltYXRpb24gfSBmcm9tICcuL3RleGltYXRlLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGV4aW1hdGUnLFxuICBob3N0OiB7XG4gICAgJ2FyaWEtbGFiZWwnOiAndGV4dCdcbiAgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleGltYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90ZXhpbWF0ZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRleGltYXRlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIC8qKiBTZXQgYW5pbWF0ZWQgdGV4dCAqL1xuICBASW5wdXQoJ3RleHQnKSBzZXQgc2V0VGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zdGF0ZS5uZXh0KHRleHQpO1xuICB9XG5cbiAgLyoqIEFuaW1hdGlvbiB0aGF0IHRyaWdnZXJzIG9uIGluaXQgKi9cbiAgQElucHV0KCkgZW50ZXI6IFRleHRBbmltYXRpb247XG5cbiAgLyoqIEFuaW1hdGlvbiB0aGF0IHRyaWdnZXJzIG9uIGRlc3Ryb3kgKi9cbiAgQElucHV0KCkgbGVhdmU6IFRleHRBbmltYXRpb247XG5cbiAgLyoqIEFuaW1hdGlvbiB0aGF0IHRyaWdnZXJzIHdpdGggdGhlIHBsYXkoKSBmdW5jdGlvbiAqL1xuICBASW5wdXQoKSBhbmltYXRpb246IFRleHRBbmltYXRpb247XG5cbiAgLyoqIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gYW5pbWF0aW9uIGlzIHN0YXJ0ZWQgKi9cbiAgQE91dHB1dCgncGxheScpIHBsYXlFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGFuaW1hdGlvbiBpcyBkb25lICovXG4gIEBPdXRwdXQoJ2ZpbmlzaCcpIGZpbmlzaEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqIFRleGltYXRlIGFuaW1hdGlvbnMgKi9cbiAgcGxheWVycyA9IG5ldyBNYXA8c3RyaW5nLCBBbmltYXRpb25QbGF5ZXI+KCk7XG5cbiAgLyoqIFRleGltYXRlIHN0YXRlICovXG4gIHByaXZhdGUgX3N0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgc3RhdGU6IE9ic2VydmFibGU8c3RyaW5nW11bXVtdPjtcblxuICAvKiogVGV4aW1hdGUgcGxheWluZyBzdGF0ZSAqL1xuICBwcml2YXRlIF9pc1BsYXlpbmc6IGJvb2xlYW47XG4gIHByaXZhdGUgX2lzVmlld0luaXQ6IGJvb2xlYW47XG5cbiAgZ2V0IGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faXNQbGF5aW5nO1xuICB9XG5cbiAgZ2V0IGVudGVyUGxheWVyKCk6IEFuaW1hdGlvblBsYXllciB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVycy5nZXQoJ2VudGVyJyk7XG4gIH1cblxuICBnZXQgbGVhdmVQbGF5ZXIoKTogQW5pbWF0aW9uUGxheWVyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXJzLmdldCgnbGVhdmUnKTtcbiAgfVxuXG4gIGdldCBkZWZhdWx0UGxheWVyKCk6IEFuaW1hdGlvblBsYXllciB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVycy5nZXQoJ2RlZmF1bHQnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5pbWF0aW9uQnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlciwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5fc3RhdGUucGlwZShtYXAoKHRleHQ6IHN0cmluZykgPT4gdGV4aW1hdGVGYWN0b3J5KHRleHQpKSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5faXNWaWV3SW5pdCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVBbmltYXRpb25zKHRydWUpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMuX2lzVmlld0luaXQpIHtcbiAgICAgIHRoaXMudXBkYXRlQW5pbWF0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIFRPRE86IFVzZSBwbGF5ZXJzLmZvckVhY2ggdG8gZGVzdHJveSBwbGF5ZXJzXG4gICAgaWYgKHRoaXMucGxheWVycy5oYXMoJ2VudGVyJykpIHtcbiAgICAgIHRoaXMucGxheWVycy5nZXQoJ2VudGVyJykuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbGF5ZXJzLmhhcygnbGVhdmUnKSkge1xuICAgICAgdGhpcy5wbGF5ZXJzLmdldCgnbGVhdmUnKS5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBsYXllcnMuaGFzKCdkZWZhdWx0JykpIHtcbiAgICAgIHRoaXMucGxheWVycy5nZXQoJ2RlZmF1bHQnKS5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbmV3IGFuaW1hdGlvblxuICAgKi9cbiAgcmVnaXN0ZXJBbmltYXRpb24oY29uZmlnOiBUZXh0QW5pbWF0aW9uKTogQW5pbWF0aW9uUGxheWVyIHtcbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLmJ1aWxkQW5pbWF0aW9uKGNvbmZpZykuY3JlYXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgLyoqIFRPRE86IEludmVzdGlnYXRlIHdoeSBvblN0YXJ0IGFuZCBvbkRvbmUgZmlyZSBvbmx5IG9uY2UgKi9cbiAgICBwbGF5ZXIub25TdGFydCgoKSA9PiB7XG4gICAgICB0aGlzLl9pc1BsYXlpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wbGF5RW1pdHRlci5lbWl0KGNvbmZpZy5pZCk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uRG9uZSgoKSA9PiB7XG4gICAgICB0aGlzLl9pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuZmluaXNoRW1pdHRlci5lbWl0KGNvbmZpZy5pZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucGxheWVycy5zZXQoY29uZmlnLmlkLCBwbGF5ZXIpLmdldChjb25maWcuaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBbmltYXRpb25zKGF1dG9QbGF5RW50ZXI/OiBib29sZWFuKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmVudGVyKSB7XG4gICAgICAgIGNvbnN0IGVudGVyUGxheWVyID0gdGhpcy5yZWdpc3RlckFuaW1hdGlvbih7Li4udGhpcy5lbnRlciwgaWQ6ICdlbnRlcicsIGlzRW50ZXI6IHRydWV9KTtcbiAgICAgICAgaWYgKGF1dG9QbGF5RW50ZXIpIHtcbiAgICAgICAgICBlbnRlclBsYXllci5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxlYXZlKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJBbmltYXRpb24oey4uLnRoaXMubGVhdmUsIGlkOiAnbGVhdmUnfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckFuaW1hdGlvbih7aWQ6ICdkZWZhdWx0JywgLi4udGhpcy5hbmltYXRpb259KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbmltYXRpb25cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBbmltYXRpb24oY29uZmlnOiBUZXh0QW5pbWF0aW9uKTogQW5pbWF0aW9uRmFjdG9yeSB7XG4gICAgLyoqIFRPRE86IFVzZSAnOmVudGVyJyBhbmQgJzpsZWF2ZScgZm9yIGVudGVyIGFuZCBsZWF2ZSBhbmltYXRpb25zICovXG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uQnVpbGRlci5idWlsZChbXG4gICAgICBxdWVyeShcbiAgICAgICAgYC50ZXhpbWF0ZS0ke2NvbmZpZy50eXBlfWAsXG4gICAgICAgIFtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgZW50ZXIgYW5pbWF0aW9uIHRvIHdvcmtcbiAgICAgICAgICBzdHlsZSh7b3BhY2l0eTogY29uZmlnLmlzRW50ZXIgPyAwIDogMX0pLFxuICAgICAgICAgIHN0YWdnZXIoY29uZmlnLmRlbGF5LCBbdXNlQW5pbWF0aW9uKGNvbmZpZy5hbmltYXRpb24pXSlcbiAgICAgICAgXVxuICAgICAgKVxuICAgIF0pO1xuICB9XG59XG5cbi8qKiBDb252ZXJ0IHRleHQgc3RyaW5nIGludG8gYSB3b3JrYWJsZSB0ZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gdGV4aW1hdGVGYWN0b3J5KHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdW11bXSB7XG4gIGNvbnN0IHBhcmFncmFwaHM6IHN0cmluZ1tdW11bXSA9IFtdO1xuICAvLyBTcGxpdCB0ZXh0IGludG8gcGFyYWdyYXBoc1xuICB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAoKHBhcmFncmFwaDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgd29yZHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgICAvLyBTcGxpdCBwYXJhZ3JhcGggaW50byB3b3Jkc1xuICAgIHBhcmFncmFwaFxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5maWx0ZXIod29yZCA9PiB3b3JkICE9PSAnJylcbiAgICAgIC5tYXAoKHdvcmQ6IHN0cmluZykgPT5cbiAgICAgICAgLy8gU3BsaXQgd29yZCBpbnRvIGxldHRlcnNcbiAgICAgICAgd29yZHMucHVzaCh3b3JkLnNwbGl0KC8oPyEkKS91KSlcbiAgICAgICk7XG4gICAgcGFyYWdyYXBocy5wdXNoKHdvcmRzKTtcbiAgfSk7XG4gIHJldHVybiBwYXJhZ3JhcGhzO1xufVxuIl19