UNPKG

ngx-animating-datepicker

Version:

An Animating Datepicker for Angular 2+, for some smooth date picking :).

233 lines 19.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core'; export class NavigationComponent { constructor() { this.previousClick = new EventEmitter(); this.nextClick = new EventEmitter(); this.subNavigationClick = new EventEmitter(); this.monthFormat = 'long'; // "narrow", "short", "long"; this.animate = false; this.initialised = false; this.subNavigationOpen = false; } // "narrow", "short", "long"; /** * @private * @param {?} language * @return {?} */ set language(language) { this.formatMonth = new Intl.DateTimeFormat(language, { month: this.monthFormat }); this._language = language; if (this.initialised) { this.titles = this.createNavigationItems(this._totalYearMonth); } } /** * @private * @return {?} */ get language() { return this._language; } /** * @param {?} totalYearMonth * @return {?} */ set totalYearMonth(totalYearMonth) { this._totalYearMonth = totalYearMonth; this.titles = this.createNavigationItems(totalYearMonth); } /** * @return {?} */ ngOnInit() { this.initialised = true; } /** * @param {?} title * @return {?} */ onMonthClick(title) { /** @type {?} */ const monthArray = this.createMonthArray(title); /** @type {?} */ const formatMonth = new Intl.DateTimeFormat(this.language, { month: 'short' }); this.navigationItems = this.createNavigationItems(monthArray, true, formatMonth); this.toggleSubNavigation(); } /** * @param {?} title * @return {?} */ onYearClick(title) { this.navigationItems = this.createYearArray(title); this.toggleSubNavigation(); } /** * @return {?} */ toggleSubNavigation() { this.subNavigationOpen = !this.subNavigationOpen; } /** * Sets the title * * @param {?} totalMonthYear * @param {?=} monthType * @param {?=} formatMonth * @return {?} NavigationItem[] */ createNavigationItems(totalMonthYear, monthType = true, formatMonth = null) { /** @type {?} */ const _formatMonth = formatMonth || this.formatMonth; // TODO: copy the object / remove the reference return ((/** @type {?} */ (totalMonthYear))).map(s => { /** @type {?} */ const date = new Date(s.year, s.month); s.navigationTitle = monthType ? _formatMonth.format(date) : s.year; return s; }); } /** * @param {?} navigationItem * @return {?} */ createMonthArray(navigationItem) { /** @type {?} */ const months = []; /** @type {?} */ const currentYear = navigationItem.year; for (let i = 0; i < 11; i++) { months.push({ month: i, year: currentYear }); } return months; } /** * Create an array of navigation items with year as label * * @param {?} navigationItem * @return {?} NavigationItem[] */ createYearArray(navigationItem) { /** @type {?} */ const currentYear = navigationItem.year; /** @type {?} */ const years = [Object.assign({}, navigationItem, { navigationTitle: currentYear })]; for (let i = 0; i < 5; i++) { years.unshift(Object.assign({}, navigationItem, { navigationTitle: currentYear - (i + 1) })); years.push(Object.assign({}, navigationItem, { navigationTitle: currentYear + (i + 1) })); } return years; } /** * @param {?} date * @return {?} */ onSubNavigationClick(date) { this.subNavigationClick.emit(date); } /** * Emits previous click event * @return {?} */ previous() { this.previousClick.emit(); } /** * Emits next click event * @return {?} */ next() { this.nextClick.emit(); } } NavigationComponent.decorators = [ { type: Component, args: [{ selector: 'aa-navigation', template: `<button *ngIf="!hideNavigation" class="navigation__button is-previous" (click)="previous()"></button> <div class="navigation__title-wrapper" [ngStyle]="{ 'transform': 'translateX(' + translateX + '%)', 'transition': transition, 'left.%': leftPosition }"> <div *ngFor="let title of titles" class="navigation__title" [ngStyle]="{ 'width.%': (100 / titles.length) }" ><span (click)="onMonthClick(title)">{{title.navigationTitle}}</span>&nbsp;<span (click)="onYearClick(title)">{{title.year}}</span></div> </div> <button *ngIf="!hideNavigation" class="navigation__button is-next" (click)="next()"></button>`, styles: [`:host{display:block;padding:10px;height:52px}:host::after,:host::before{content:' ';display:table}:host::after{clear:both}:host .navigation__title-wrapper{position:absolute;left:0;width:100%}:host .navigation__title{width:100%;font-weight:700;text-align:center;float:left;line-height:2.2rem}:host .navigation__button{padding:0;border:1px solid #c0c0be;outline:0;font-style:inherit;cursor:pointer;position:relative;z-index:1;background-color:#fff;text-align:center;width:32px;height:32px;border-radius:4px}:host .navigation__button:hover{border-color:#8e8d8a}:host .navigation__button.is-previous{float:left}:host .navigation__button.is-previous::after{content:'<'}:host .navigation__button.is-next{float:right}:host .navigation__button.is-next::before{content:'>'}:host.is-animate .navigation__title-wrapper{width:200%}`] },] }, ]; NavigationComponent.propDecorators = { previousClick: [{ type: Output }], nextClick: [{ type: Output }], subNavigationClick: [{ type: Output }], monthFormat: [{ type: Input }], language: [{ type: Input }], totalYearMonth: [{ type: Input }], transition: [{ type: Input }], translateX: [{ type: Input }], leftPosition: [{ type: Input }], hideNavigation: [{ type: Input }], animate: [{ type: HostBinding, args: ['class.is-animate',] }, { type: Input }] }; if (false) { /** @type {?} */ NavigationComponent.prototype.previousClick; /** @type {?} */ NavigationComponent.prototype.nextClick; /** @type {?} */ NavigationComponent.prototype.subNavigationClick; /** * @type {?} * @private */ NavigationComponent.prototype.monthFormat; /** * @type {?} * @private */ NavigationComponent.prototype._totalYearMonth; /** @type {?} */ NavigationComponent.prototype.transition; /** @type {?} */ NavigationComponent.prototype.translateX; /** @type {?} */ NavigationComponent.prototype.leftPosition; /** @type {?} */ NavigationComponent.prototype.hideNavigation; /** @type {?} */ NavigationComponent.prototype.animate; /** * @type {?} * @private */ NavigationComponent.prototype._language; /** * @type {?} * @private */ NavigationComponent.prototype.initialised; /** * @type {?} * @private */ NavigationComponent.prototype.formatMonth; /** * @type {?} * @private */ NavigationComponent.prototype.subNavigationOpen; /** @type {?} */ NavigationComponent.prototype.navigationItems; /** @type {?} */ NavigationComponent.prototype.titles; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYW5pbWF0aW5nLWRhdGVwaWNrZXIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQXFCMUYsTUFBTTtJQWxCTjtRQW1Ca0Isa0JBQWEsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2RCxjQUFTLEdBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkQsdUJBQWtCLEdBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUQsZ0JBQVcsR0FBRyxNQUFNLENBQUMsQ0FBRSw2QkFBNkI7UUE4QjlELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFHZixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7SUF3Rm5DLENBQUM7Ozs7Ozs7SUF6SEEsSUFDWSxRQUFRLENBQUMsUUFBZ0I7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDL0Q7SUFDRixDQUFDOzs7OztJQUVELElBQVksUUFBUTtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDdkIsQ0FBQzs7Ozs7SUFHRCxJQUNXLGNB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QUFvQixDQUFDLElBQVU7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDOzs7OztJQUtELFFBQVE7UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBS0QsSUFBSTtRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7O1lBaEpELFNBQVMsU0FBQztnQkFDVixRQUFRLEVBQUUsZUFBZTtnQkFDekIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7OzhGQWFtRjtnQkFDN0YsTUFBTSxFQUFFLENBQUMscXpCQUFxekIsQ0FBQzthQUMvekI7Ozs0QkFFQyxNQUFNO3dCQUNOLE1BQU07aUNBQ04sTUFBTTswQkFDTixLQUFLO3VCQUVMLEtBQUs7NkJBZUwsS0FBSzt5QkFNTCxLQUFLO3lCQUNMLEtBQUs7MkJBQ0wsS0FBSzs2QkFDTCxLQUFLO3NCQUVMLFdBQVcsU0FBQyxrQkFBa0IsY0FDOUIsS0FBSzs7OztJQWhDTiw0Q0FBd0U7O0lBQ3hFLHdDQUFvRTs7SUFDcEUsaURBQTZFOzs7OztJQUM3RSwwQ0FBc0M7Ozs7O0lBZ0J0Qyw4Q0FBcUM7O0lBT3JDLHlDQUFtQzs7SUFDbkMseUNBQW1DOztJQUNuQywyQ0FBcUM7O0lBQ3JDLDZDQUF3Qzs7SUFFeEMsc0NBRXVCOzs7OztJQUV2Qix3Q0FBMEI7Ozs7O0lBQzFCLDBDQUE0Qjs7Ozs7SUFDNUIsMENBQXlDOzs7OztJQUN6QyxnREFBa0M7O0lBQ2xDLDhDQUF5Qzs7SUFDekMscUNBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1llYXJNb250aCwgTmF2aWdhdGlvbkl0ZW19IGZyb20gJy4uLy4uL21vZGVscy9kYXRlcGlja2VyLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnYWEtbmF2aWdhdGlvbicsXG5cdHRlbXBsYXRlOiBgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlTmF2aWdhdGlvblwiIGNsYXNzPVwibmF2aWdhdGlvbl9fYnV0dG9uIGlzLXByZXZpb3VzXCIgKGNsaWNrKT1cInByZXZpb3VzKClcIj48L2J1dHRvbj5cbjxkaXYgY2xhc3M9XCJuYXZpZ2F0aW9uX190aXRsZS13cmFwcGVyXCIgW25nU3R5bGVdPVwie1xuICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIHRyYW5zbGF0ZVggKyAnJSknLFxuICAndHJhbnNpdGlvbic6IHRyYW5zaXRpb24sXG4gICdsZWZ0LiUnOiBsZWZ0UG9zaXRpb25cbn1cIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0aXRsZSBvZiB0aXRsZXNcIlxuICAgICAgICAgY2xhc3M9XCJuYXZpZ2F0aW9uX190aXRsZVwiXG4gICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgJ3dpZHRoLiUnOiAoMTAwIC8gdGl0bGVzLmxlbmd0aClcbiAgICAgICAgfVwiXG4gICAgPjxzcGFuIChjbGljayk9XCJvbk1vbnRoQ2xpY2sodGl0bGUpXCI+e3t0aXRsZS5uYXZpZ2F0aW9uVGl0bGV9fTwvc3Bhbj4mbmJzcDs8c3BhbiAoY2xpY2spPVwib25ZZWFyQ2xpY2sodGl0bGUpXCI+e3t0aXRsZS55ZWFyfX08L3NwYW4+PC9kaXY+XG48L2Rpdj5cbjxidXR0b24gKm5nSWY9XCIhaGlkZU5hdmlnYXRpb25cIiBjbGFzcz1cIm5hdmlnYXRpb25fX2J1dHRvbiBpcy1uZXh0XCIgKGNsaWNrKT1cIm5leHQoKVwiPjwvYnV0dG9uPmAsXG5cdHN0eWxlczogW2A6aG9zdHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MTBweDtoZWlnaHQ6NTJweH06aG9zdDo6YWZ0ZXIsOmhvc3Q6OmJlZm9yZXtjb250ZW50OicgJztkaXNwbGF5OnRhYmxlfTpob3N0OjphZnRlcntjbGVhcjpib3RofTpob3N0IC5uYXZpZ2F0aW9uX190aXRsZS13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlfTpob3N0IC5uYXZpZ2F0aW9uX190aXRsZXt3aWR0aDoxMDAlO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWFsaWduOmNlbnRlcjtmbG9hdDpsZWZ0O2xpbmUtaGVpZ2h0OjIuMnJlbX06aG9zdCAubmF2aWdhdGlvbl9fYnV0dG9ue3BhZGRpbmc6MDtib3JkZXI6MXB4IHNvbGlkICNjMGMwYmU7b3V0bGluZTowO2ZvbnQtc3R5bGU6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjE7YmFja2dyb3VuZC1jb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOjMycHg7aGVpZ2h0OjMycHg7Ym9yZGVyLXJhZGl1czo0cHh9Omhvc3QgLm5hdmlnYXRpb25fX2J1dHRvbjpob3Zlcntib3JkZXItY29sb3I6IzhlOGQ4YX06aG9zdCAubmF2aWdhdGlvbl9fYnV0dG9uLmlzLXByZXZpb3Vze2Zsb2F0OmxlZnR9Omhvc3QgLm5hdmlnYXRpb25fX2J1dHRvbi5pcy1wcmV2aW91czo6YWZ0ZXJ7Y29udGVudDonPCd9Omhvc3QgLm5hdmlnYXRpb25fX2J1dHRvbi5pcy1uZXh0e2Zsb2F0OnJpZ2h0fTpob3N0IC5uYXZpZ2F0aW9uX19idXR0b24uaXMtbmV4dDo6YmVmb3Jle2NvbnRlbnQ6Jz4nfTpob3N0LmlzLWFuaW1hdGUgLm5hdmlnYXRpb25fX3RpdGxlLXdyYXBwZXJ7d2lkdGg6MjAwJX1gXVxufSlcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblx0QE91dHB1dCgpIHB1YmxpYyBwcmV2aW91c0NsaWNrOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBwdWJsaWMgbmV4dENsaWNrOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBwdWJsaWMgc3ViTmF2aWdhdGlvbkNsaWNrOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBJbnB1dCgpIHByaXZhdGUgbW9udGhGb3JtYXQgPSAnbG9uZyc7IFx0Ly8gXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIjtcblxuXHRASW5wdXQoKVxuXHRwcml2YXRlIHNldCBsYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5mb3JtYXRNb250aCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxhbmd1YWdlLCB7bW9udGg6IHRoaXMubW9udGhGb3JtYXR9KTtcblx0XHR0aGlzLl9sYW5ndWFnZSA9IGxhbmd1YWdlO1xuXG5cdFx0aWYgKHRoaXMuaW5pdGlhbGlzZWQpIHtcblx0XHRcdHRoaXMudGl0bGVzID0gdGhpcy5jcmVhdGVOYXZpZ2F0aW9uSXRlbXModGhpcy5fdG90YWxZZWFyTW9udGgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0IGxhbmd1YWdlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX2xhbmd1YWdlO1xuXHR9XG5cblx0cHJpdmF0ZSBfdG90YWxZZWFyTW9udGg6IFllYXJNb250aFtdO1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgc2V0IHRvdGFsWWVhck1vbnRoKHRvdGFsWWVhck1vbnRoOiBZZWFyTW9udGhbXSkge1xuXHRcdHRoaXMuX3RvdGFsWWVhck1vbnRoID0gdG90YWxZZWFyTW9udGg7XG5cdFx0dGhpcy50aXRsZXMgPSB0aGlzLmNyZWF0ZU5hdmlnYXRpb25JdGVtcyh0b3RhbFllYXJNb250aCk7XG5cdH1cblxuXHRASW5wdXQoKSBwdWJsaWMgdHJhbnNpdGlvbjogc3RyaW5nO1xuXHRASW5wdXQoKSBwdWJsaWMgdHJhbnNsYXRlWDogbnVtYmVyO1xuXHRASW5wdXQoKSBwdWJsaWMgbGVmdFBvc2l0aW9uOiBudW1iZXI7XG5cdEBJbnB1dCgpIHB1YmxpYyBoaWRlTmF2aWdhdGlvbjogYm9vbGVhbjtcblxuXHRASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLWFuaW1hdGUnKVxuXHRASW5wdXQoKVxuXHRwdWJsaWMgYW5pbWF0ZSA9IGZhbHNlO1xuXG5cdHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XG5cdHByaXZhdGUgaW5pdGlhbGlzZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBmb3JtYXRNb250aDogSW50bC5EYXRlVGltZUZvcm1hdDtcblx0cHJpdmF0ZSBzdWJOYXZpZ2F0aW9uT3BlbiA9IGZhbHNlO1xuXHRwdWJsaWMgbmF2aWdhdGlvbkl0ZW1zOiBOYXZpZ2F0aW9uSXRlbVtdO1xuXHRwdWJsaWMgdGl0bGVzOiBOYXZpZ2F0aW9uSXRlbVtdO1xuXG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMuaW5pdGlhbGlzZWQgPSB0cnVlO1xuXHR9XG5cblx0b25Nb250aENsaWNrKHRpdGxlOiBOYXZpZ2F0aW9uSXRlbSkge1xuXHRcdGNvbnN0IG1vbnRoQXJyYXkgPSB0aGlzLmNyZWF0ZU1vbnRoQXJyYXkodGl0bGUpO1xuXHRcdGNvbnN0IGZvcm1hdE1vbnRoID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sYW5ndWFnZSwge21vbnRoOiAnc2hvcnQnfSk7XG5cdFx0dGhpcy5uYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmNyZWF0ZU5hdmlnYXRpb25JdGVtcyhtb250aEFycmF5LCB0cnVlLCBmb3JtYXRNb250aCk7XG5cdFx0dGhpcy50b2dnbGVTdWJOYXZpZ2F0aW9uKCk7XG5cdH1cblxuXHRvblllYXJDbGljayh0aXRsZTogTmF2aWdhdGlvbkl0ZW0pIHtcblx0XHR0aGlzLm5hdmlnYXRpb25JdGVtcyA9IHRoaXMuY3JlYXRlWWVhckFycmF5KHRpdGxlKTtcblx0XHR0aGlzLnRvZ2dsZVN1Yk5hdmlnYXRpb24oKTtcblx0fVxuXG5cdHRvZ2dsZVN1Yk5hdmlnYXRpb24oKSB7XG5cdFx0dGhpcy5zdWJOYXZpZ2F0aW9uT3BlbiA9ICF0aGlzLnN1Yk5hdmlnYXRpb25PcGVuO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHRpdGxlXG5cdCAqXG5cdCAqIEBwYXJhbSB0b3RhbE1vbnRoWWVhclxuXHQgKiBAcGFyYW0gbW9udGhUeXBlXG5cdCAqIEBwYXJhbSBmb3JtYXRNb250aFxuXHQgKiBAcmV0dXJucyBOYXZpZ2F0aW9uSXRlbVtdXG5cdCAqL1xuXHRjcmVhdGVOYXZpZ2F0aW9uSXRlbXModG90YWxNb250aFllYXI6IFllYXJNb250aFtdLCBtb250aFR5cGUgPSB0cnVlLCBmb3JtYXRNb250aCA9IG51bGwpOiBOYXZpZ2F0aW9uSXRlbVtdIHtcblx0XHRjb25zdCBfZm9ybWF0TW9udGggPSBmb3JtYXRNb250aCB8fCB0aGlzLmZvcm1hdE1vbnRoO1xuXG5cdFx0Ly8gVE9ETzogY29weSB0aGUgb2JqZWN0IC8gcmVtb3ZlIHRoZSByZWZlcmVuY2Vcblx0XHRyZXR1cm4gKDxOYXZpZ2F0aW9uSXRlbVtdPnRvdGFsTW9udGhZZWFyKS5tYXAocyA9PiB7XG5cdFx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUocy55ZWFyLCBzLm1vbnRoKTtcblx0XHRcdHMubmF2aWdhdGlvblRpdGxlID0gbW9udGhUeXBlID8gX2Zvcm1hdE1vbnRoLmZvcm1hdChkYXRlKSA6IHMueWVhcjtcblx0XHRcdHJldHVybiBzO1xuXHRcdH0pO1xuXHR9XG5cblx0Y3JlYXRlTW9udGhBcnJheShuYXZpZ2F0aW9uSXRlbTogTmF2aWdhdGlvbkl0ZW0pIHtcblx0XHRjb25zdCBtb250aHMgPSBbXSxcblx0XHRcdGN1cnJlbnRZZWFyID0gbmF2aWdhdGlvbkl0ZW0ueWVhcjtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDExOyBpKyspIHtcblx0XHRcdG1vbnRocy5wdXNoKHttb250aDogaSwgeWVhcjogY3VycmVudFllYXJ9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbW9udGhzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhbiBhcnJheSBvZiBuYXZpZ2F0aW9uIGl0ZW1zIHdpdGggeWVhciBhcyBsYWJlbFxuXHQgKlxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvbkl0ZW1cblx0ICogQHJldHVybnMgTmF2aWdhdGlvbkl0ZW1bXVxuXHQgKi9cblx0Y3JlYXRlWWVhckFycmF5KG5hdmlnYXRpb25JdGVtOiBOYXZpZ2F0aW9uSXRlbSk6IE5hdmlnYXRpb25JdGVtW10ge1xuXHRcdGNvbnN0IGN1cnJlbnRZZWFyID0gbmF2aWdhdGlvbkl0ZW0ueWVhcixcblx0XHRcdHllYXJzID0gW3suLi5uYXZpZ2F0aW9uSXRlbSwgbmF2aWdhdGlvblRpdGxlOiBjdXJyZW50WWVhcn1dO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcblx0XHRcdHllYXJzLnVuc2hpZnQoey4uLm5hdmlnYXRpb25JdGVtLCBuYXZpZ2F0aW9uVGl0bGU6IGN1cnJlbnRZZWFyIC0gKGkgKyAxKX0pO1xuXHRcdFx0eWVhcnMucHVzaCh7Li4ubmF2aWdhdGlvbkl0ZW0sIG5hdmlnYXRpb25UaXRsZTogY3VycmVudFllYXIgKyAoaSArIDEpfSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHllYXJzO1xuXHR9XG5cblx0b25TdWJOYXZpZ2F0aW9uQ2xpY2soZGF0ZTogRGF0ZSkge1xuXHRcdHRoaXMuc3ViTmF2aWdhdGlvbkNsaWNrLmVtaXQoZGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRW1pdHMgcHJldmlvdXMgY2xpY2sgZXZlbnRcblx0ICovXG5cdHByZXZpb3VzKCk6IHZvaWQge1xuXHRcdHRoaXMucHJldmlvdXNDbGljay5lbWl0KCk7XG5cdH1cblxuXHQvKipcblx0ICogRW1pdHMgbmV4dCBjbGljayBldmVudFxuXHQgKi9cblx0bmV4dCgpOiB2b2lkIHtcblx0XHR0aGlzLm5leHRDbGljay5lbWl0KCk7XG5cdH1cbn1cbiJdfQ==