ftable
Version:
Angular 6/7 Tables
184 lines (182 loc) • 24.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component } from '@angular/core';
import { EventEmitter } from '@angular/core';
import { Output } from '@angular/core';
import { Input } from '@angular/core';
import { ViewChild, ElementRef } from '@angular/core';
export class DateFFilterComponent {
constructor() {
this.filter = new EventEmitter();
this.minDay = '';
this.minMonth = '';
this.minYear = '';
this.maxDay = '';
this.maxMonth = '';
this.maxYear = '';
}
/**
* @param {?} mode
* @param {?} max
* @param {?} event
* @return {?}
*/
onKeyUp(mode, max, event) {
// Ignore if Delete or Backspace
if (event.keyCode !== 8 && event.keyCode !== 46) {
// filter letters and Trim
this[mode] = this[mode].match(/[0-9]*/).join('').substring(0, max);
// Move focus for UX
if (mode === 'minDay' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMinMonthRef.nativeElement.focus();
}
else if (mode === 'minMonth' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMinYearRef.nativeElement.focus();
}
else if (mode === 'minYear' && (this[mode].length === 4 || event.keyCode === 39)) {
this._elMaxDayRef.nativeElement.focus();
}
else if (mode === 'maxDay' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMaxMonthRef.nativeElement.focus();
}
else if (mode === 'maxMonth' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMaxYearRef.nativeElement.focus();
}
else if (mode === 'maxYear' && (this[mode].length === 4 || event.keyCode === 39)) {
this._elMinDayRef.nativeElement.focus();
}
}
if (this.source === 'frontend') {
/** @type {?} */
const fn = function (name, minDay, minMonth, minYear, maxDay, maxMonth, maxYear) {
return d => {
return ((/** @type {?} */ (d))).filter(x => {
console.log(name, minDay, minMonth, minYear, maxDay, maxMonth, maxYear);
/** @type {?} */
const date = new Date(x[name]);
return (minDay.length > 0 ? Number(minDay) <= date.getDate() : true) &&
(minMonth.length > 0 ? Number(minMonth) <= date.getMonth() + 1 : true) &&
(minYear.length > 0 ? Number(minYear) <= date.getFullYear() : true) &&
(maxDay.length > 0 ? Number(maxDay) >= date.getDate() : true) &&
(maxMonth.length > 0 ? Number(maxMonth) >= date.getMonth() + 1 : true) &&
(maxYear.length > 0 ? Number(maxYear) >= date.getFullYear() : true);
});
};
};
this.filter.emit({ columnName: this.columnName, type: 'date', apply: fn(this.columnName, this.minDay, this.minMonth, this.minYear, this.maxDay, this.maxMonth, this.maxYear) });
}
else {
/** @type {?} */
var result = { minDay: this.minDay, minMonth: this.minMonth, minYear: this.minYear, maxDay: this.maxDay, maxMonth: this.maxMonth, maxYear: this.maxYear };
this.filter.emit({ columnName: this.columnName, type: 'date', apply: result });
}
}
/**
* @return {?}
*/
reset() {
this.minDay = '';
this.minMonth = '';
this.minYear = '';
this.maxDay = '';
this.maxMonth = '';
this.maxYear = '';
this.filter.emit({ columnName: this.columnName, apply: null });
}
}
DateFFilterComponent.decorators = [
{ type: Component, args: [{
template: `
<table class='ft-ffilter-table ft-ffilter-date-table'>
<tr class='ft-ffilter-column'>
<td class='ft-ffilter-row ft-ffilter-dd-row'>
<input class="ft-i ft-i-ffilter ft-i-ffilter-day" type='text' placeholder='dd' [(ngModel)]='minDay' (keyup)='onKeyUp("minDay", 2, $event)' #minDayRef />
</td>
<td class='ft-ffilter-row ft-ffilter-mm-row'>
<input class="ft-i ft-i-ffilter ft-i-ffilter-month" type='text' placeholder='mm' [(ngModel)]='minMonth' (keyup)='onKeyUp("minMonth", 2, $event)' #minMonthRef />
</td>
<td class='ft-ffilter-row ft-ffilter-yyyy-row'>
<input class="ft-i ft-i-ffilter ft-i-ffilter-year" type='text' placeholder='yyyy' [(ngModel)]='minYear' (keyup)='onKeyUp("minYear", 4, $event)' #minYearRef />
</td>
</tr>
<tr class='ft-ffilter-column'>
<td class='ft-ffilter-row ft-ffilter-dd-row'>
<input class="ft-i ft-i-ffilter ft-i-ffilter-day" type='text' placeholder='dd' [(ngModel)]='maxDay' (keyup)='onKeyUp("maxDay" , 2, $event)' #maxDayRef />
</td>
<td class='ft-ffilter-row ft-ffilter-mm-row'>
<input class="ft-i ft-i-ffilter ft-i-ffilter-month" type='text' placeholder='mm' [(ngModel)]='maxMonth' (keyup)='onKeyUp("maxMonth", 2, $event)' #maxMonthRef />
</td>
<td class='ft-ffilter-row ft-ffilter-yyyy-row'>
<input class="ft-i ft-i-ffilter ft-i-ffilter-year" type='text' placeholder='yyyy' [(ngModel)]='maxYear' (keyup)='onKeyUp("maxYear", 4, $event)' #maxYearRef />
</td>
</tr>
</table>
<!--
<div class='ft-ffilter'>
<div class="ft-filter-date ft-div1-ffilter">
<input class="ft-i ft-i-filter ft-i-filter-day" type='text' placeholder='dd' [(ngModel)]='minDay' (keyup)='onKeyUp("minDay", 2, $event)' #minDayRef />
<input class="ft-i ft-i-filter ft-i-filter-month" type='text' placeholder='mm' [(ngModel)]='minMonth' (keyup)='onKeyUp("minMonth", 2, $event)' #minMonthRef />
<input class="ft-i ft-i-filter ft-i-filter-year" type='text' placeholder='yyyy' [(ngModel)]='minYear' (keyup)='onKeyUp("minYear", 4, $event)' #minYearRef />
</div>
<div class="ft-filter-date ft-div2-ffilter">
<input class="ft-i ft-i-filter ft-i-filter-day" type='text' placeholder='dd' [(ngModel)]='maxDay' (keyup)='onKeyUp("maxDay" , 2, $event)' #maxDayRef />
<input class="ft-i ft-i-filter ft-i-filter-month" type='text' placeholder='mm' [(ngModel)]='maxMonth' (keyup)='onKeyUp("maxMonth", 2, $event)' #maxMonthRef />
<input class="ft-i ft-i-filter ft-i-filter-year" type='text' placeholder='yyyy' [(ngModel)]='maxYear' (keyup)='onKeyUp("maxYear", 4, $event)' #maxYearRef />
</div>
</div>
-->
`,
styles: [`
:host { flex:1;
}`]
}] }
];
DateFFilterComponent.propDecorators = {
_elMinDayRef: [{ type: ViewChild, args: ["minDayRef",] }],
_elMinMonthRef: [{ type: ViewChild, args: ["minMonthRef",] }],
_elMinYearRef: [{ type: ViewChild, args: ["minYearRef",] }],
_elMaxDayRef: [{ type: ViewChild, args: ["maxDayRef",] }],
_elMaxMonthRef: [{ type: ViewChild, args: ["maxMonthRef",] }],
_elMaxYearRef: [{ type: ViewChild, args: ["maxYearRef",] }],
source: [{ type: Input }],
otherData: [{ type: Input }],
columnName: [{ type: Input }],
filter: [{ type: Output }]
};
if (false) {
/** @type {?} */
DateFFilterComponent.prototype._elMinDayRef;
/** @type {?} */
DateFFilterComponent.prototype._elMinMonthRef;
/** @type {?} */
DateFFilterComponent.prototype._elMinYearRef;
/** @type {?} */
DateFFilterComponent.prototype._elMaxDayRef;
/** @type {?} */
DateFFilterComponent.prototype._elMaxMonthRef;
/** @type {?} */
DateFFilterComponent.prototype._elMaxYearRef;
/** @type {?} */
DateFFilterComponent.prototype.source;
/** @type {?} */
DateFFilterComponent.prototype.otherData;
/** @type {?} */
DateFFilterComponent.prototype.columnName;
/** @type {?} */
DateFFilterComponent.prototype.filter;
/** @type {?} */
DateFFilterComponent.prototype.minDay;
/** @type {?} */
DateFFilterComponent.prototype.minMonth;
/** @type {?} */
DateFFilterComponent.prototype.minYear;
/** @type {?} */
DateFFilterComponent.prototype.maxDay;
/** @type {?} */
DateFFilterComponent.prototype.maxMonth;
/** @type {?} */
DateFFilterComponent.prototype.maxYear;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZWZmaWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZnRhYmxlLyIsInNvdXJjZXMiOlsibGliL2ZmaWx0ZXIvZmlsdGVycy9kYXRlZmZpbHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFvRHRELE1BQU0sT0FBTyxvQkFBb0I7SUFoRGpDO1FBOERZLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUd2RCxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLFlBQU8sR0FBRyxFQUFFLENBQUM7SUE4RHRCLENBQUM7Ozs7Ozs7SUE1REMsT0FBTyxDQUFDLElBQVksRUFBRSxHQUFXLEVBQUUsS0FBSztRQUN0QyxnQ0FBZ0M7UUFDaEMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLEVBQUUsRUFBRTtZQUMvQywwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFbkUsb0JBQW9CO1lBQ3BCLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQzFFLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzNDO2lCQUNJLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzFDO2lCQUNJLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3pDO2lCQUNJLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQy9FLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzNDO2lCQUNJLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzFDO2lCQUNJLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3pDO1NBQ0Y7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFOztrQkFDeEIsRUFBRSxHQUFHLFVBQVUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTztnQkFDN0UsT0FBTyxDQUFDLENBQUMsRUFBRTtvQkFDVCxPQUFPLENBQUMsbUJBQU8sQ0FBQyxFQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7OzhCQUNsRSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDbEUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDdEUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUNuRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQzdELENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQ3RFLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUN2RSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNqTDthQUFNOztnQkFDRCxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN6SixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDaEY7SUFFSCxDQUFDOzs7O0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQzs7O1lBbklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUNUO3lCQUNROztJQUVQO2FBQ0g7OzsyQkFHRSxTQUFTLFNBQUMsV0FBVzs2QkFDckIsU0FBUyxTQUFDLGFBQWE7NEJBQ3ZCLFNBQVMsU0FBQyxZQUFZOzJCQUV0QixTQUFTLFNBQUMsV0FBVzs2QkFDckIsU0FBUyxTQUFDLGFBQWE7NEJBQ3ZCLFNBQVMsU0FBQyxZQUFZO3FCQUd0QixLQUFLO3dCQUNMLEtBQUs7eUJBQ0wsS0FBSztxQkFFTCxNQUFNOzs7O0lBYlAsNENBQWlEOztJQUNqRCw4Q0FBcUQ7O0lBQ3JELDZDQUFtRDs7SUFFbkQsNENBQWlEOztJQUNqRCw4Q0FBcUQ7O0lBQ3JELDZDQUFtRDs7SUFHbkQsc0NBQStCOztJQUMvQix5Q0FBK0I7O0lBQy9CLDBDQUFtQzs7SUFFbkMsc0NBQThEOztJQUc5RCxzQ0FBbUI7O0lBQ25CLHdDQUFxQjs7SUFDckIsdUNBQW9COztJQUNwQixzQ0FBbUI7O0lBQ25CLHdDQUFxQjs7SUFDckIsdUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBGRmlsdGVyQmFzZSB9IGZyb20gJy4vZmZpbHRlci5iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiBgXHJcblxyXG4gIDx0YWJsZSBjbGFzcz0nZnQtZmZpbHRlci10YWJsZSBmdC1mZmlsdGVyLWRhdGUtdGFibGUnPlxyXG4gIDx0ciBjbGFzcz0nZnQtZmZpbHRlci1jb2x1bW4nPlxyXG4gICAgICA8dGQgY2xhc3M9J2Z0LWZmaWx0ZXItcm93ICBmdC1mZmlsdGVyLWRkLXJvdyc+XHJcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmdC1pIGZ0LWktZmZpbHRlciBmdC1pLWZmaWx0ZXItZGF5XCIgdHlwZT0ndGV4dCcgIHBsYWNlaG9sZGVyPSdkZCcgICAgWyhuZ01vZGVsKV09J21pbkRheScgICAoa2V5dXApPSdvbktleVVwKFwibWluRGF5XCIsICAgMiwgJGV2ZW50KScgICNtaW5EYXlSZWYgLz5cclxuICAgICAgPC90ZD5cclxuICAgICAgPHRkIGNsYXNzPSdmdC1mZmlsdGVyLXJvdyAgZnQtZmZpbHRlci1tbS1yb3cnPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZnQtaSBmdC1pLWZmaWx0ZXIgZnQtaS1mZmlsdGVyLW1vbnRoXCIgdHlwZT0ndGV4dCcgIHBsYWNlaG9sZGVyPSdtbScgICAgWyhuZ01vZGVsKV09J21pbk1vbnRoJyAoa2V5dXApPSdvbktleVVwKFwibWluTW9udGhcIiwgMiwgJGV2ZW50KScgI21pbk1vbnRoUmVmIC8+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgIDx0ZCBjbGFzcz0nZnQtZmZpbHRlci1yb3cgIGZ0LWZmaWx0ZXIteXl5eS1yb3cnPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZnQtaSBmdC1pLWZmaWx0ZXIgZnQtaS1mZmlsdGVyLXllYXJcIiB0eXBlPSd0ZXh0JyAgcGxhY2Vob2xkZXI9J3l5eXknICBbKG5nTW9kZWwpXT0nbWluWWVhcicgIChrZXl1cCk9J29uS2V5VXAoXCJtaW5ZZWFyXCIsICA0LCAkZXZlbnQpJyAgICNtaW5ZZWFyUmVmIC8+XHJcbiAgICAgIDwvdGQ+XHJcbiAgPC90cj5cclxuICA8dHIgY2xhc3M9J2Z0LWZmaWx0ZXItY29sdW1uJz5cclxuICAgICAgPHRkIGNsYXNzPSdmdC1mZmlsdGVyLXJvdyAgZnQtZmZpbHRlci1kZC1yb3cnPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZnQtaSBmdC1pLWZmaWx0ZXIgZnQtaS1mZmlsdGVyLWRheVwiIHR5cGU9J3RleHQnICBwbGFjZWhvbGRlcj0nZGQnICAgIFsobmdNb2RlbCldPSdtYXhEYXknICAgKGtleXVwKT0nb25LZXlVcChcIm1heERheVwiICwgIDIsICRldmVudCknICAjbWF4RGF5UmVmIC8+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgIDx0ZCBjbGFzcz0nZnQtZmZpbHRlci1yb3cgIGZ0LWZmaWx0ZXItbW0tcm93Jz5cclxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZ0LWkgZnQtaS1mZmlsdGVyIGZ0LWktZmZpbHRlci1tb250aFwiIHR5cGU9J3RleHQnICBwbGFjZWhvbGRlcj0nbW0nICAgIFsobmdNb2RlbCldPSdtYXhNb250aCcgKGtleXVwKT0nb25LZXlVcChcIm1heE1vbnRoXCIsIDIsICRldmVudCknICAjbWF4TW9udGhSZWYgLz5cclxuICAgICAgPC90ZD5cclxuICAgICAgPHRkIGNsYXNzPSdmdC1mZmlsdGVyLXJvdyAgZnQtZmZpbHRlci15eXl5LXJvdyc+XHJcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmdC1pIGZ0LWktZmZpbHRlciBmdC1pLWZmaWx0ZXIteWVhclwiIHR5cGU9J3RleHQnICBwbGFjZWhvbGRlcj0neXl5eScgIFsobmdNb2RlbCldPSdtYXhZZWFyJyAgKGtleXVwKT0nb25LZXlVcChcIm1heFllYXJcIiwgIDQsICRldmVudCknICAjbWF4WWVhclJlZiAvPlxyXG4gICAgICA8L3RkPlxyXG4gIDwvdHI+XHJcbjwvdGFibGU+XHJcbiAgPCEtLVxyXG4gIDxkaXYgY2xhc3M9J2Z0LWZmaWx0ZXInPlxyXG4gICAgPGRpdiBjbGFzcz1cImZ0LWZpbHRlci1kYXRlIGZ0LWRpdjEtZmZpbHRlclwiPlxyXG4gICAgPGlucHV0IGNsYXNzPVwiZnQtaSBmdC1pLWZpbHRlciBmdC1pLWZpbHRlci1kYXlcIiB0eXBlPSd0ZXh0JyAgcGxhY2Vob2xkZXI9J2RkJyAgICBbKG5nTW9kZWwpXT0nbWluRGF5JyAgIChrZXl1cCk9J29uS2V5VXAoXCJtaW5EYXlcIiwgICAyLCAkZXZlbnQpJyAgI21pbkRheVJlZiAvPlxyXG4gICAgPGlucHV0IGNsYXNzPVwiZnQtaSBmdC1pLWZpbHRlciBmdC1pLWZpbHRlci1tb250aFwiIHR5cGU9J3RleHQnICBwbGFjZWhvbGRlcj0nbW0nICAgIFsobmdNb2RlbCldPSdtaW5Nb250aCcgKGtleXVwKT0nb25LZXlVcChcIm1pbk1vbnRoXCIsIDIsICRldmVudCknICNtaW5Nb250aFJlZiAvPlxyXG4gICAgPGlucHV0IGNsYXNzPVwiZnQtaSBmdC1pLWZpbHRlciBmdC1pLWZpbHRlci15ZWFyXCIgdHlwZT0ndGV4dCcgIHBsYWNlaG9sZGVyPSd5eXl5JyAgWyhuZ01vZGVsKV09J21pblllYXInICAoa2V5dXApPSdvbktleVVwKFwibWluWWVhclwiLCAgNCwgJGV2ZW50KScgICAjbWluWWVhclJlZiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZnQtZmlsdGVyLWRhdGUgZnQtZGl2Mi1mZmlsdGVyXCI+XHJcbiAgICA8aW5wdXQgY2xhc3M9XCJmdC1pIGZ0LWktZmlsdGVyIGZ0LWktZmlsdGVyLWRheVwiIHR5cGU9J3RleHQnICBwbGFjZWhvbGRlcj0nZGQnICAgIFsobmdNb2RlbCldPSdtYXhEYXknICAgKGtleXVwKT0nb25LZXlVcChcIm1heERheVwiICwgIDIsICRldmVudCknICAjbWF4RGF5UmVmIC8+XHJcbiAgICA8aW5wdXQgY2xhc3M9XCJmdC1pIGZ0LWktZmlsdGVyIGZ0LWktZmlsdGVyLW1vbnRoXCIgdHlwZT0ndGV4dCcgIHBsYWNlaG9sZGVyPSdtbScgICAgWyhuZ01vZGVsKV09J21heE1vbnRoJyAoa2V5dXApPSdvbktleVVwKFwibWF4TW9udGhcIiwgMiwgJGV2ZW50KScgICNtYXhNb250aFJlZiAvPlxyXG4gICAgPGlucHV0IGNsYXNzPVwiZnQtaSBmdC1pLWZpbHRlciBmdC1pLWZpbHRlci15ZWFyXCIgdHlwZT0ndGV4dCcgIHBsYWNlaG9sZGVyPSd5eXl5JyAgWyhuZ01vZGVsKV09J21heFllYXInICAoa2V5dXApPSdvbktleVVwKFwibWF4WWVhclwiLCAgNCwgJGV2ZW50KScgICNtYXhZZWFyUmVmIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgLS0+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgOmhvc3QgeyBmbGV4OjE7XHJcbiAgfWBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZUZGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBGRmlsdGVyQmFzZSB7XHJcbiAgQFZpZXdDaGlsZChcIm1pbkRheVJlZlwiKSBfZWxNaW5EYXlSZWY6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcIm1pbk1vbnRoUmVmXCIpIF9lbE1pbk1vbnRoUmVmOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoXCJtaW5ZZWFyUmVmXCIpIF9lbE1pblllYXJSZWY6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJtYXhEYXlSZWZcIikgX2VsTWF4RGF5UmVmOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoXCJtYXhNb250aFJlZlwiKSBfZWxNYXhNb250aFJlZjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKFwibWF4WWVhclJlZlwiKSBfZWxNYXhZZWFyUmVmOiBFbGVtZW50UmVmO1xyXG5cclxuXHJcbiAgQElucHV0KCkgcHVibGljIHNvdXJjZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBvdGhlckRhdGE6IGFueTtcclxuICBASW5wdXQoKSBwdWJsaWMgY29sdW1uTmFtZTogc3RyaW5nO1xyXG5cclxuICBAT3V0cHV0KCkgZmlsdGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHJcbiAgcHVibGljIG1pbkRheSA9ICcnO1xyXG4gIHB1YmxpYyBtaW5Nb250aCA9ICcnO1xyXG4gIHB1YmxpYyBtaW5ZZWFyID0gJyc7XHJcbiAgcHVibGljIG1heERheSA9ICcnO1xyXG4gIHB1YmxpYyBtYXhNb250aCA9ICcnO1xyXG4gIHB1YmxpYyBtYXhZZWFyID0gJyc7XHJcblxyXG4gIG9uS2V5VXAobW9kZTogc3RyaW5nLCBtYXg6IG51bWJlciwgZXZlbnQpIHtcclxuICAgIC8vIElnbm9yZSBpZiBEZWxldGUgb3IgQmFja3NwYWNlXHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gOCAmJiBldmVudC5rZXlDb2RlICE9PSA0Nikge1xyXG4gICAgICAvLyBmaWx0ZXIgbGV0dGVycyBhbmQgVHJpbVxyXG4gICAgICB0aGlzW21vZGVdID0gdGhpc1ttb2RlXS5tYXRjaCgvWzAtOV0qLykuam9pbignJykuc3Vic3RyaW5nKDAsIG1heCk7XHJcblxyXG4gICAgICAvLyBNb3ZlIGZvY3VzIGZvciBVWFxyXG4gICAgICBpZiAobW9kZSA9PT0gJ21pbkRheScgJiYgKHRoaXNbbW9kZV0ubGVuZ3RoID09PSAyIHx8IGV2ZW50LmtleUNvZGUgPT09IDM5KSkge1xyXG4gICAgICAgIHRoaXMuX2VsTWluTW9udGhSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG1vZGUgPT09ICdtaW5Nb250aCcgJiYgKHRoaXNbbW9kZV0ubGVuZ3RoID09PSAyIHx8IGV2ZW50LmtleUNvZGUgPT09IDM5KSkge1xyXG4gICAgICAgIHRoaXMuX2VsTWluWWVhclJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobW9kZSA9PT0gJ21pblllYXInICYmICh0aGlzW21vZGVdLmxlbmd0aCA9PT0gNCB8fCBldmVudC5rZXlDb2RlID09PSAzOSkpIHtcclxuICAgICAgICB0aGlzLl9lbE1heERheVJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobW9kZSA9PT0gJ21heERheScgJiYgKHRoaXNbbW9kZV0ubGVuZ3RoID09PSAyIHx8IGV2ZW50LmtleUNvZGUgPT09IDM5KSkge1xyXG4gICAgICAgIHRoaXMuX2VsTWF4TW9udGhSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG1vZGUgPT09ICdtYXhNb250aCcgJiYgKHRoaXNbbW9kZV0ubGVuZ3RoID09PSAyIHx8IGV2ZW50LmtleUNvZGUgPT09IDM5KSkge1xyXG4gICAgICAgIHRoaXMuX2VsTWF4WWVhclJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobW9kZSA9PT0gJ21heFllYXInICYmICh0aGlzW21vZGVdLmxlbmd0aCA9PT0gNCB8fCBldmVudC5rZXlDb2RlID09PSAzOSkpIHtcclxuICAgICAgICB0aGlzLl9lbE1pbkRheVJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zb3VyY2UgPT09ICdmcm9udGVuZCcpIHtcclxuICAgICAgY29uc3QgZm4gPSBmdW5jdGlvbiAobmFtZSwgbWluRGF5LCBtaW5Nb250aCwgbWluWWVhciwgbWF4RGF5LCBtYXhNb250aCwgbWF4WWVhcikge1xyXG4gICAgICAgIHJldHVybiBkID0+IHtcclxuICAgICAgICAgIHJldHVybiAoPGFueVtdPmQpLmZpbHRlcih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSwgbWluRGF5LCBtaW5Nb250aCwgbWluWWVhciwgbWF4RGF5LCBtYXhNb250aCwgbWF4WWVhcik7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh4W25hbWVdKTtcclxuICAgICAgICAgICAgcmV0dXJuIChtaW5EYXkubGVuZ3RoID4gMCA/IE51bWJlcihtaW5EYXkpIDw9IGRhdGUuZ2V0RGF0ZSgpIDogdHJ1ZSkgJiZcclxuICAgICAgICAgICAgICAobWluTW9udGgubGVuZ3RoID4gMCA/IE51bWJlcihtaW5Nb250aCkgPD0gZGF0ZS5nZXRNb250aCgpICsgMSA6IHRydWUpICYmXHJcbiAgICAgICAgICAgICAgKG1pblllYXIubGVuZ3RoID4gMCA/IE51bWJlcihtaW5ZZWFyKSA8PSBkYXRlLmdldEZ1bGxZZWFyKCkgOiB0cnVlKSAmJlxyXG4gICAgICAgICAgICAgIChtYXhEYXkubGVuZ3RoID4gMCA/IE51bWJlcihtYXhEYXkpID49IGRhdGUuZ2V0RGF0ZSgpIDogdHJ1ZSkgJiZcclxuICAgICAgICAgICAgICAobWF4TW9udGgubGVuZ3RoID4gMCA/IE51bWJlcihtYXhNb250aCkgPj0gZGF0ZS5nZXRNb250aCgpICsgMSA6IHRydWUpICYmXHJcbiAgICAgICAgICAgICAgKG1heFllYXIubGVuZ3RoID4gMCA/IE51bWJlcihtYXhZZWFyKSA+PSBkYXRlLmdldEZ1bGxZZWFyKCkgOiB0cnVlKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lOiB0aGlzLmNvbHVtbk5hbWUsIHR5cGU6ICdkYXRlJywgYXBwbHk6IGZuKHRoaXMuY29sdW1uTmFtZSwgdGhpcy5taW5EYXksIHRoaXMubWluTW9udGgsIHRoaXMubWluWWVhciwgdGhpcy5tYXhEYXksIHRoaXMubWF4TW9udGgsIHRoaXMubWF4WWVhcikgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgcmVzdWx0ID0geyBtaW5EYXk6IHRoaXMubWluRGF5LCBtaW5Nb250aDogdGhpcy5taW5Nb250aCwgbWluWWVhcjogdGhpcy5taW5ZZWFyLCBtYXhEYXk6IHRoaXMubWF4RGF5LCBtYXhNb250aDogdGhpcy5tYXhNb250aCwgbWF4WWVhcjogdGhpcy5tYXhZZWFyIH07XHJcbiAgICAgIHRoaXMuZmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lOiB0aGlzLmNvbHVtbk5hbWUsIHR5cGU6ICdkYXRlJywgYXBwbHk6IHJlc3VsdCB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIHRoaXMubWluRGF5ID0gJyc7XHJcbiAgICB0aGlzLm1pbk1vbnRoID0gJyc7XHJcbiAgICB0aGlzLm1pblllYXIgPSAnJztcclxuICAgIHRoaXMubWF4RGF5ID0gJyc7XHJcbiAgICB0aGlzLm1heE1vbnRoID0gJyc7XHJcbiAgICB0aGlzLm1heFllYXIgPSAnJztcclxuICAgIHRoaXMuZmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lOiB0aGlzLmNvbHVtbk5hbWUsIGFwcGx5OiBudWxsIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=