@cloukit/pagination
Version:
518 lines (508 loc) • 48.8 kB
JavaScript
import { CloukitComponentTheme, CloukitThemeService, UiElement } from '@cloukit/theme';
import { EventEmitter, Component, Input, Output, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/*!
* @license MIT
* Copyright (c) 2017 Bernhard Grünewaldt - codeclou.io
* https://github.com/cloukit/legal
*/
class PaginationButtonClickEvent {
/**
* @param {?} type
* @param {?} page
*/
constructor(type, page) {
this.type = type;
this.page = page;
}
}
/** @enum {number} */
const PaginationButtonType = {
normal: 1,
previous: 2,
next: 3,
};
PaginationButtonType[PaginationButtonType.normal] = 'normal';
PaginationButtonType[PaginationButtonType.previous] = 'previous';
PaginationButtonType[PaginationButtonType.next] = 'next';
class PaginationItem {
/**
* @param {?} page
* @param {?} isActive
* @param {?} isFiller
* @param {?} label
*/
constructor(page, isActive, isFiller, label) {
this.page = page;
this.isActive = isActive;
this.isFiller = isFiller;
this.label = label;
}
}
class Ui {
}
Ui.elements = {
filler: 'filler',
button: 'button',
wrapper: 'wrapper',
};
Ui.states = {
normal: 'normal',
active: 'active',
disabled: 'disabled',
};
Ui.modifier = {
base: 'base',
hover: 'hover',
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class CloukitPaginationComponentThemeDefault extends CloukitComponentTheme {
constructor() {
super();
//
// WRAPPER
//
this.buildStyle(Ui.elements.wrapper, Ui.states.normal, Ui.modifier.base)
.withStyles((/** @type {?} */ ({
display: 'flex',
})));
//
// BUTTON
//
this.buildStyle(Ui.elements.button, Ui.states.normal, Ui.modifier.base)
.withStyles((/** @type {?} */ ({
alignSelf: 'center',
display: 'inline-flex',
flexWrap: 'nowrap',
maxWidth: '100%',
color: '#0052cc',
textDecoration: 'none',
fontStyle: 'normal',
fontSize: 'inherit',
margin: 0,
outline: 'none',
textAlign: 'center',
userSelect: 'none',
verticalAlign: 'middle',
whiteSpace: 'nowrap',
boxSizing: 'border-box',
padding: '2px 6px 3px',
border: 0,
backgroundColor: 'transparent',
cursor: 'pointer',
})));
this.buildStyle(Ui.elements.button, Ui.states.active, Ui.modifier.base)
.inheritFrom(Ui.elements.button, Ui.states.normal, Ui.modifier.base)
.withStyles((/** @type {?} */ ({
backgroundColor: '#0052cc',
color: '#ffffff',
cursor: 'default',
})));
this.buildStyle(Ui.elements.button, Ui.states.normal, Ui.modifier.hover)
.inheritFrom(Ui.elements.button, Ui.states.normal, Ui.modifier.base)
.withStyles((/** @type {?} */ ({
textDecoration: 'underline',
})));
this.buildStyle(Ui.elements.button, Ui.states.disabled, Ui.modifier.base)
.inheritFrom(Ui.elements.button, Ui.states.normal, Ui.modifier.base)
.withStyles((/** @type {?} */ ({
color: '#777',
cursor: 'not-allowed',
})));
//
// FILLER
//
this.buildStyle(Ui.elements.filler, Ui.states.normal, Ui.modifier.base)
.inheritFrom(Ui.elements.button, Ui.states.normal, Ui.modifier.base)
.withStyles((/** @type {?} */ ({
color: '#555',
cursor: 'default',
})));
this.buildStyle(Ui.elements.filler, Ui.states.disabled, Ui.modifier.base)
.inheritFrom(Ui.elements.filler, Ui.states.normal, Ui.modifier.base)
.withStyles((/** @type {?} */ ({
color: '#efefef',
cursor: 'not-allowed',
})));
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
//
// HELPER FUNCTIONS
//
/** @type {?} */
const createFiller = () => new PaginationItem(-1, false, true, '...');
/** @type {?} */
const createAnItem = (page, active) => new PaginationItem(page, active, false, `${page}`);
/**
* Provides the pages with a total of seven. See Unit Test.
* Examples:
* CASE 1: 1 2 3 *4* 5 6 7
* 1 2 3 *4* 5
* CASE 2: 1 2 3 *4* 5 .. 50
* CASE 3: 1 .. 46 *47* 48 49 50
* CASE 4: 1 .. 49 *50* 51 .. 90
* @type {?}
*/
const calculatePaginationItems = (total, current) => {
/** @type {?} */
const paginationItems = [];
if (total === undefined || total === null || current === undefined || current === null) {
return paginationItems;
}
//
// CASE 1: Total is smaller or equal seven
//
if (total <= 7) {
for (let i = 1; i <= total; i++) {
paginationItems.push(new PaginationItem(i, current === i, false, `${i}`));
}
}
else
//
// CASE 2: Total is greater than seven AND page is in range of [1-4]
//
if (total > 7 && current <= 4) {
for (let i = 1; i <= 5; i++) {
paginationItems.push(createAnItem(i, current === i));
}
paginationItems.push(createFiller());
paginationItems.push(createAnItem(total, false));
}
else
//
// CASE 3: Total is greater than seven AND page is greater than four AND page is near total
//
if (total > 7 && current > 4 && current + 3 >= total) {
paginationItems.push(createAnItem(1, false));
paginationItems.push(createFiller());
for (let i = total - 4; i <= total; i++) {
paginationItems.push(createAnItem(i, current === i));
}
}
else
//
// CASE 4: Total is greater than seven AND page is greater than four
//
if (total > 7 && current > 4) {
paginationItems.push(createAnItem(1, false));
paginationItems.push(createFiller());
paginationItems.push(createAnItem(current - 1, false));
paginationItems.push(createAnItem(current, true));
paginationItems.push(createAnItem(current + 1, false));
paginationItems.push(createFiller());
paginationItems.push(createAnItem(total, false));
}
//
// END
//
return paginationItems;
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* Pagination Component.
*
* Just use this inside your templates:
*
* ```html
* <cloukit-pagination ...></cloukit-pagination>
* ```
*/
class CloukitPaginationComponent {
/**
* @param {?} themeService
*/
constructor(themeService) {
this.themeService = themeService;
/**
* External way to disable the whole pagination e.g.
* during loading external data
*/
this.disabled = false;
/**
* Event emitted, when page is clicked.
*/
this.onPageSelect = new EventEmitter();
this.PaginationButtonType = PaginationButtonType;
this.state = {
pages: []
};
this.themeSelected = this.themeService.getComponentTheme('pagination');
}
/**
* @param {?} element
* @return {?}
*/
getStyle(element) {
/** @type {?} */
const style = this.themeSelected.getStyle(element, 'normal', 'base');
return this.themeService.prefixStyle(style);
}
/**
* \@overrides OnChanges
* @hidden
* @return {?}
*/
ngOnChanges() {
if (this.theme !== undefined && this.theme !== null) {
this.themeSelected = this.themeService.getComponentTheme(this.theme);
if (this.themeSelected === null) {
console.log(`WARN: requested theme ${this.theme} does not exist. Falling back to default theme for pagination.`);
this.themeSelected = this.themeService.getComponentTheme('pagination');
}
}
this.state.pages = calculatePaginationItems(this.total, this.current);
}
/**
* @param {?} event
* @return {?}
*/
selectPage(event) {
if (event.type === PaginationButtonType['previous'] &&
this.isPreviousPossible()) {
this.onPageSelect.emit(this.current - 1);
}
else if (event.type === PaginationButtonType['next'] &&
this.isNextPossible()) {
this.onPageSelect.emit(this.current + 1);
}
else if (event.type === PaginationButtonType['normal']) {
this.onPageSelect.emit(event.page);
}
}
/**
* @return {?}
*/
previousDummyPaginationItem() {
/** @type {?} */
let label = 'Prev';
if (this.labelPrev !== undefined && this.labelPrev !== null) {
label = this.labelPrev;
}
return new PaginationItem(-1, false, false, label);
}
/**
* @return {?}
*/
nextDummyPaginationItem() {
/** @type {?} */
let label = 'Next';
if (this.labelNext !== undefined && this.labelNext !== null) {
label = this.labelNext;
}
return new PaginationItem(-1, false, false, label);
}
/**
* @return {?}
*/
isPreviousPossible() {
return this.current > 1;
}
/**
* @return {?}
*/
isNextPossible() {
return this.current < this.total;
}
}
CloukitPaginationComponent.decorators = [
{ type: Component, args: [{
selector: 'cloukit-pagination',
template: `
<div [ngStyle]="getStyle('wrapper').style">
<cloukit-pagination-button
[disabled]="!isPreviousPossible() || disabled"
[paginationItem]="previousDummyPaginationItem()"
[themeSelected]="themeSelected"
[type]="PaginationButtonType['previous']"
(clicked)="selectPage($event)"
></cloukit-pagination-button>
<cloukit-pagination-button
*ngFor="let page of state.pages"
[disabled]="disabled"
[paginationItem]="page"
[themeSelected]="themeSelected"
[type]="PaginationButtonType['normal']"
(clicked)="selectPage($event)"
></cloukit-pagination-button>
<cloukit-pagination-button
[disabled]="!isNextPossible() || disabled"
[paginationItem]="nextDummyPaginationItem()"
[themeSelected]="themeSelected"
[type]="PaginationButtonType['next']"
(clicked)="selectPage($event)"
></cloukit-pagination-button>
</div>`
}] }
];
/** @nocollapse */
CloukitPaginationComponent.ctorParameters = () => [
{ type: CloukitThemeService }
];
CloukitPaginationComponent.propDecorators = {
theme: [{ type: Input }],
total: [{ type: Input }],
current: [{ type: Input }],
disabled: [{ type: Input }],
labelNext: [{ type: Input }],
labelPrev: [{ type: Input }],
onPageSelect: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class CloukitPaginationButtonComponent {
/**
* @param {?} themeService
*/
constructor(themeService) {
this.themeService = themeService;
this.clicked = new EventEmitter();
this.isMouseStillOver = false;
}
/**
* @param {?} pageItem
* @return {?}
*/
static transform(pageItem) {
if (pageItem === undefined || pageItem === null) {
return new UiElement(Ui.elements.filler, Ui.states.disabled, Ui.modifier.base);
}
/** @type {?} */
const uiElement = pageItem.isFiller ? Ui.elements.filler : Ui.elements.button;
/** @type {?} */
const uiState = pageItem.isActive ? Ui.states.active : Ui.states.normal;
return new UiElement(uiElement, uiState, Ui.modifier.base);
}
/**
* @return {?}
*/
updateStyle() {
/** @type {?} */
const style = this.themeSelected.getUiStyle(this.ui);
if (style !== null) {
this.style = this.themeService.prefixStyle(style);
}
}
/**
* @return {?}
*/
ngOnChanges() {
// retain mouseEnter and mouseLeave modifier changes!
/** @type {?} */
let modifier = null;
if (this.ui !== null && this.ui !== undefined) {
modifier = this.ui.modifier;
}
this.ui = CloukitPaginationButtonComponent.transform(this.paginationItem);
if (modifier !== null && this.isMouseStillOver) {
this.ui.modifier = modifier;
}
if (this.disabled === true) {
this.ui.state = Ui.states.disabled;
this.ui.modifier = Ui.modifier.base;
}
this.updateStyle();
}
/**
* @return {?}
*/
mouseEnter() {
this.ui.modifier = Ui.modifier.hover;
this.isMouseStillOver = true;
this.updateStyle();
}
/**
* @return {?}
*/
mouseLeave() {
this.ui.modifier = Ui.modifier.base;
this.isMouseStillOver = false;
this.updateStyle();
}
/**
* @return {?}
*/
doClick() {
if (!this.paginationItem.isFiller) {
this.clicked.emit(new PaginationButtonClickEvent(this.type, this.paginationItem.page));
}
}
}
CloukitPaginationButtonComponent.decorators = [
{ type: Component, args: [{
selector: 'cloukit-pagination-button',
template: `
<button
type="button"
[disabled]="disabled"
[ngStyle]="style?.style"
(click)="doClick()"
(mouseenter)="mouseEnter()"
(mouseleave)="mouseLeave()"
>
{{paginationItem.label}}
</button>`
}] }
];
/** @nocollapse */
CloukitPaginationButtonComponent.ctorParameters = () => [
{ type: CloukitThemeService }
];
CloukitPaginationButtonComponent.propDecorators = {
disabled: [{ type: Input }],
type: [{ type: Input }],
paginationItem: [{ type: Input }],
themeSelected: [{ type: Input }],
clicked: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class CloukitPaginationModule {
/**
* @param {?} themeService
*/
constructor(themeService) {
this.themeService = themeService;
if (this.themeService.getComponentTheme('pagination') === null) {
this.themeService.registerComponentTheme('pagination', new CloukitPaginationComponentThemeDefault());
}
}
}
CloukitPaginationModule.decorators = [
{ type: NgModule, args: [{
imports: [CommonModule],
exports: [CloukitPaginationComponent],
declarations: [CloukitPaginationComponent, CloukitPaginationButtonComponent],
},] }
];
/** @nocollapse */
CloukitPaginationModule.ctorParameters = () => [
{ type: CloukitThemeService }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
export { CloukitPaginationComponentThemeDefault, CloukitPaginationComponent, CloukitPaginationModule, PaginationButtonClickEvent, PaginationButtonType, PaginationItem, Ui, CloukitPaginationButtonComponent, calculatePaginationItems, createFiller };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWtpdC1wYWdpbmF0aW9uLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AY2xvdWtpdC9wYWdpbmF0aW9uL2xpYi9wYWdpbmF0aW9uLm1vZGVsLnRzIiwibmc6Ly9AY2xvdWtpdC9wYWdpbmF0aW9uL2xpYi9wYWdpbmF0aW9uLnRoZW1lLnRzIiwibmc6Ly9AY2xvdWtpdC9wYWdpbmF0aW9uL2xpYi9sb2dpYy9wYWdpbmF0aW9uLWhlbHBlci50cyIsIm5nOi8vQGNsb3VraXQvcGFnaW5hdGlvbi9saWIvcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCJuZzovL0BjbG91a2l0L3BhZ2luYXRpb24vbGliL2NoaWxkcmVuL3BhZ2luYXRpb24tYnV0dG9uLmNvbXBvbmVudC50cyIsIm5nOi8vQGNsb3VraXQvcGFnaW5hdGlvbi9saWIvcGFnaW5hdGlvbi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZSBNSVRcbiAqIENvcHlyaWdodCAoYykgMjAxNyBCZXJuaGFyZCBHcsODwrxuZXdhbGR0IC0gY29kZWNsb3UuaW9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91a2l0L2xlZ2FsXG4gKi9cblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25CdXR0b25DbGlja0V2ZW50IHtcbiAgY29uc3RydWN0b3IocHVibGljIHR5cGU6IFBhZ2luYXRpb25CdXR0b25UeXBlLCBwdWJsaWMgcGFnZTogbnVtYmVyKSB7fVxufVxuXG5leHBvcnQgZW51bSBQYWdpbmF0aW9uQnV0dG9uVHlwZSB7XG4gIG5vcm1hbCA9IDEsXG4gIHByZXZpb3VzID0gMixcbiAgbmV4dCA9IDMsXG59XG5cbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uSXRlbSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBwYWdlOiBudW1iZXIsXG4gICAgcHVibGljIGlzQWN0aXZlOiBib29sZWFuLFxuICAgIHB1YmxpYyBpc0ZpbGxlcjogYm9vbGVhbixcbiAgICBwdWJsaWMgbGFiZWw6IHN0cmluZykge31cbn1cblxuZXhwb3J0IGNsYXNzIFVpIHtcbiAgcHVibGljIHN0YXRpYyBlbGVtZW50czogYW55ID0ge1xuICAgIGZpbGxlcjogJ2ZpbGxlcicsXG4gICAgYnV0dG9uOiAnYnV0dG9uJyxcbiAgICB3cmFwcGVyOiAnd3JhcHBlcicsXG4gIH07XG4gIHB1YmxpYyBzdGF0aWMgc3RhdGVzOiBhbnkgPSB7XG4gICAgbm9ybWFsOiAnbm9ybWFsJyxcbiAgICBhY3RpdmU6ICdhY3RpdmUnLFxuICAgIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICB9O1xuICBwdWJsaWMgc3RhdGljIG1vZGlmaWVyOiBhbnkgPSB7XG4gICAgYmFzZTogJ2Jhc2UnLFxuICAgIGhvdmVyOiAnaG92ZXInLFxuICB9O1xufVxuIiwiLyohXG4gKiBAbGljZW5zZSBNSVRcbiAqIENvcHlyaWdodCAoYykgMjAxNyBCZXJuaGFyZCBHcsODwrxuZXdhbGR0IC0gY29kZWNsb3UuaW9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91a2l0L2xlZ2FsXG4gKi9cbmltcG9ydCB7IENsb3VraXRCYXNlQ3NzRGVmaW5pdGlvbnMsIENsb3VraXRDb21wb25lbnRUaGVtZSB9IGZyb20gJ0BjbG91a2l0L3RoZW1lJztcbmltcG9ydCB7IFVpIH0gZnJvbSAnLi9wYWdpbmF0aW9uLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIENsb3VraXRQYWdpbmF0aW9uQ29tcG9uZW50VGhlbWVEZWZhdWx0IGV4dGVuZHMgQ2xvdWtpdENvbXBvbmVudFRoZW1lIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vXG4gICAgLy8gV1JBUFBFUlxuICAgIC8vXG4gICAgdGhpcy5idWlsZFN0eWxlKFVpLmVsZW1lbnRzLndyYXBwZXIsIFVpLnN0YXRlcy5ub3JtYWwsIFVpLm1vZGlmaWVyLmJhc2UpXG4gICAgICAud2l0aFN0eWxlcyg8Q2xvdWtpdEJhc2VDc3NEZWZpbml0aW9ucz57XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIH0pO1xuXG4gICAgLy9cbiAgICAvLyBCVVRUT05cbiAgICAvL1xuICAgIHRoaXMuYnVpbGRTdHlsZShVaS5lbGVtZW50cy5idXR0b24sIFVpLnN0YXRlcy5ub3JtYWwsIFVpLm1vZGlmaWVyLmJhc2UpXG4gICAgICAud2l0aFN0eWxlcyg8Q2xvdWtpdEJhc2VDc3NEZWZpbml0aW9ucz57XG4gICAgICAgIGFsaWduU2VsZjogJ2NlbnRlcicsXG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgIGZsZXhXcmFwOiAnbm93cmFwJyxcbiAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgY29sb3I6ICcjMDA1MmNjJyxcbiAgICAgICAgdGV4dERlY29yYXRpb246ICdub25lJyxcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgcGFkZGluZzogJzJweCA2cHggM3B4JyxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgfSk7XG5cbiAgICB0aGlzLmJ1aWxkU3R5bGUoVWkuZWxlbWVudHMuYnV0dG9uLCBVaS5zdGF0ZXMuYWN0aXZlLCBVaS5tb2RpZmllci5iYXNlKVxuICAgICAgLmluaGVyaXRGcm9tKFVpLmVsZW1lbnRzLmJ1dHRvbiwgVWkuc3RhdGVzLm5vcm1hbCwgVWkubW9kaWZpZXIuYmFzZSlcbiAgICAgIC53aXRoU3R5bGVzKDxDbG91a2l0QmFzZUNzc0RlZmluaXRpb25zPntcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzAwNTJjYycsXG4gICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsXG4gICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgfSk7XG5cbiAgICB0aGlzLmJ1aWxkU3R5bGUoVWkuZWxlbWVudHMuYnV0dG9uLCBVaS5zdGF0ZXMubm9ybWFsLCBVaS5tb2RpZmllci5ob3ZlcilcbiAgICAgIC5pbmhlcml0RnJvbShVaS5lbGVtZW50cy5idXR0b24sIFVpLnN0YXRlcy5ub3JtYWwsIFVpLm1vZGlmaWVyLmJhc2UpXG4gICAgICAud2l0aFN0eWxlcyg8Q2xvdWtpdEJhc2VDc3NEZWZpbml0aW9ucz57XG4gICAgICAgIHRleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJyxcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZFN0eWxlKFVpLmVsZW1lbnRzLmJ1dHRvbiwgVWkuc3RhdGVzLmRpc2FibGVkLCBVaS5tb2RpZmllci5iYXNlKVxuICAgICAgLmluaGVyaXRGcm9tKFVpLmVsZW1lbnRzLmJ1dHRvbiwgVWkuc3RhdGVzLm5vcm1hbCwgVWkubW9kaWZpZXIuYmFzZSlcbiAgICAgIC53aXRoU3R5bGVzKDxDbG91a2l0QmFzZUNzc0RlZmluaXRpb25zPntcbiAgICAgICAgY29sb3I6ICcjNzc3JyxcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIEZJTExFUlxuICAgIC8vXG4gICAgdGhpcy5idWlsZFN0eWxlKFVpLmVsZW1lbnRzLmZpbGxlciwgVWkuc3RhdGVzLm5vcm1hbCwgVWkubW9kaWZpZXIuYmFzZSlcbiAgICAgIC5pbmhlcml0RnJvbShVaS5lbGVtZW50cy5idXR0b24sIFVpLnN0YXRlcy5ub3JtYWwsIFVpLm1vZGlmaWVyLmJhc2UpXG4gICAgICAud2l0aFN0eWxlcyg8Q2xvdWtpdEJhc2VDc3NEZWZpbml0aW9ucz57XG4gICAgICAgIGNvbG9yOiAnIzU1NScsXG4gICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgfSk7XG5cbiAgICB0aGlzLmJ1aWxkU3R5bGUoVWkuZWxlbWVudHMuZmlsbGVyLCBVaS5zdGF0ZXMuZGlzYWJsZWQsIFVpLm1vZGlmaWVyLmJhc2UpXG4gICAgICAuaW5oZXJpdEZyb20oVWkuZWxlbWVudHMuZmlsbGVyLCBVaS5zdGF0ZXMubm9ybWFsLCBVaS5tb2RpZmllci5iYXNlKVxuICAgICAgLndpdGhTdHlsZXMoPENsb3VraXRCYXNlQ3NzRGVmaW5pdGlvbnM+e1xuICAgICAgICBjb2xvcjogJyNlZmVmZWYnLFxuICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCcsXG4gICAgICB9KTtcbiAgfVxuXG59XG5cbiIsIi8qIVxuICogQGxpY2Vuc2UgTUlUXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgQmVybmhhcmQgR3LDg8K8bmV3YWxkdCAtIGNvZGVjbG91LmlvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2xvdWtpdC9sZWdhbFxuICovXG5pbXBvcnQgeyBQYWdpbmF0aW9uSXRlbSB9IGZyb20gJy4uL3BhZ2luYXRpb24ubW9kZWwnO1xuXG4vL1xuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy9cbmNvbnN0IGNyZWF0ZUZpbGxlciA9ICgpID0+IG5ldyBQYWdpbmF0aW9uSXRlbSgtMSwgZmFsc2UsIHRydWUsICcuLi4nKTtcbmNvbnN0IGNyZWF0ZUFuSXRlbSA9IChwYWdlOiBudW1iZXIsIGFjdGl2ZTogYm9vbGVhbikgPT4gbmV3IFBhZ2luYXRpb25JdGVtKHBhZ2UsIGFjdGl2ZSwgZmFsc2UsIGAke3BhZ2V9YCk7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIHBhZ2VzIHdpdGggYSB0b3RhbCBvZiBzZXZlbi4gU2VlIFVuaXQgVGVzdC5cbiAqIEV4YW1wbGVzOlxuICogICBDQVNFIDE6ICAxICAgMiAgIDMgICAqNCogICA1ICAgNiAgIDdcbiAqICAgICAgICAgICAgMSAgIDIgICAzICAgKjQqICAgNVxuICogICBDQVNFIDI6ICAxICAgMiAgIDMgICAqNCogICA1ICAgLi4gIDUwXG4gKiAgIENBU0UgMzogIDEgICAuLiAgNDYgICo0NyogIDQ4ICA0OSAgNTBcbiAqICAgQ0FTRSA0OiAgMSAgIC4uICA0OSAgKjUwKiAgNTEgIC4uICA5MFxuICovXG5jb25zdCBjYWxjdWxhdGVQYWdpbmF0aW9uSXRlbXMgPSAodG90YWw6IG51bWJlciwgY3VycmVudDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHBhZ2luYXRpb25JdGVtczogUGFnaW5hdGlvbkl0ZW1bXSA9IFtdO1xuICBpZiAodG90YWwgPT09IHVuZGVmaW5lZCB8fCB0b3RhbCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQgfHwgY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBwYWdpbmF0aW9uSXRlbXM7XG4gIH1cbiAgLy9cbiAgLy8gQ0FTRSAxOiBUb3RhbCBpcyBzbWFsbGVyIG9yIGVxdWFsIHNldmVuXG4gIC8vXG4gIGlmICh0b3RhbCA8PSA3KSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWw7IGkrKykge1xuICAgICAgcGFnaW5hdGlvbkl0ZW1zLnB1c2gobmV3IFBhZ2luYXRpb25JdGVtKGksIGN1cnJlbnQgPT09IGksIGZhbHNlLCBgJHtpfWApKTtcbiAgICB9XG4gIH0gZWxzZVxuICAvL1xuICAvLyBDQVNFIDI6IFRvdGFsIGlzIGdyZWF0ZXIgdGhhbiBzZXZlbiBBTkQgcGFnZSBpcyBpbiByYW5nZSBvZiBbMS00XVxuICAvL1xuICBpZiAodG90YWwgPiA3ICYmIGN1cnJlbnQgPD0gNCkge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDU7IGkrKykge1xuICAgICAgcGFnaW5hdGlvbkl0ZW1zLnB1c2goY3JlYXRlQW5JdGVtKGksIGN1cnJlbnQgPT09IGkpKTtcbiAgICB9XG4gICAgcGFnaW5hdGlvbkl0ZW1zLnB1c2goY3JlYXRlRmlsbGVyKCkpO1xuICAgIHBhZ2luYXRpb25JdGVtcy5wdXNoKGNyZWF0ZUFuSXRlbSh0b3RhbCwgZmFsc2UpKTtcbiAgfSBlbHNlXG4gIC8vXG4gIC8vIENBU0UgMzogVG90YWwgaXMgZ3JlYXRlciB0aGFuIHNldmVuIEFORCBwYWdlIGlzIGdyZWF0ZXIgdGhhbiBmb3VyIEFORCBwYWdlIGlzIG5lYXIgdG90YWxcbiAgLy9cbiAgaWYgKHRvdGFsID4gNyAmJiBjdXJyZW50ID4gNCAmJiBjdXJyZW50ICsgMyA+PSB0b3RhbCkge1xuICAgIHBhZ2luYXRpb25JdGVtcy5wdXNoKGNyZWF0ZUFuSXRlbSgxLCBmYWxzZSkpO1xuICAgIHBhZ2luYXRpb25JdGVtcy5wdXNoKGNyZWF0ZUZpbGxlcigpKTtcbiAgICBmb3IgKGxldCBpID0gdG90YWwgLSA0OyBpIDw9IHRvdGFsOyBpKyspIHtcbiAgICAgIHBhZ2luYXRpb25JdGVtcy5wdXNoKGNyZWF0ZUFuSXRlbShpLCBjdXJyZW50ID09PSBpKSk7XG4gICAgfVxuICB9IGVsc2VcbiAgLy9cbiAgLy8gQ0FTRSA0OiBUb3RhbCBpcyBncmVhdGVyIHRoYW4gc2V2ZW4gQU5EIHBhZ2UgaXMgZ3JlYXRlciB0aGFuIGZvdXJcbiAgLy9cbiAgaWYgKHRvdGFsID4gNyAmJiBjdXJyZW50ID4gNCkge1xuICAgIHBhZ2luYXRpb25JdGVtcy5wdXNoKGNyZWF0ZUFuSXRlbSgxLCBmYWxzZSkpO1xuICAgIHBhZ2luYXRpb25JdGVtcy5wdXNoKGNyZWF0ZUZpbGxlcigpKTtcbiAgICBwYWdpbmF0aW9uSXRlbXMucHVzaChjcmVhdGVBbkl0ZW0oY3VycmVudCAtIDEsIGZhbHNlKSk7XG4gICAgcGFnaW5hdGlvbkl0ZW1zLnB1c2goY3JlYXRlQW5JdGVtKGN1cnJlbnQsIHRydWUpKTtcbiAgICBwYWdpbmF0aW9uSXRlbXMucHVzaChjcmVhdGVBbkl0ZW0oY3VycmVudCArIDEsIGZhbHNlKSk7XG4gICAgcGFnaW5hdGlvbkl0ZW1zLnB1c2goY3JlYXRlRmlsbGVyKCkpO1xuICAgIHBhZ2luYXRpb25JdGVtcy5wdXNoKGNyZWF0ZUFuSXRlbSh0b3RhbCwgZmFsc2UpKTtcbiAgfVxuICAvL1xuICAvLyBFTkRcbiAgLy9cbiAgcmV0dXJuIHBhZ2luYXRpb25JdGVtcztcbn07XG5cbmV4cG9ydCB7IGNhbGN1bGF0ZVBhZ2luYXRpb25JdGVtcywgY3JlYXRlRmlsbGVyIH07XG4iLCIvKiFcbiAqIEBsaWNlbnNlIE1JVFxuICogQ29weXJpZ2h0IChjKSAyMDE3IEJlcm5oYXJkIEdyw4PCvG5ld2FsZHQgLSBjb2RlY2xvdS5pb1xuICogaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VraXQvbGVnYWxcbiAqL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ2xvdWtpdENvbXBvbmVudFRoZW1lLCBDbG91a2l0U3RhdGVmdWxBbmRNb2RpZmllckF3YXJlRWxlbWVudFRoZW1lU3R5bGVEZWZpbml0aW9uLFxuICBDbG91a2l0VGhlbWVTZXJ2aWNlLFxufSBmcm9tICdAY2xvdWtpdC90aGVtZSc7XG5pbXBvcnQgeyBjYWxjdWxhdGVQYWdpbmF0aW9uSXRlbXMgfSBmcm9tICcuL2xvZ2ljL3BhZ2luYXRpb24taGVscGVyJztcbmltcG9ydCB7IFBhZ2luYXRpb25CdXR0b25DbGlja0V2ZW50LCBQYWdpbmF0aW9uQnV0dG9uVHlwZSwgUGFnaW5hdGlvbkl0ZW0gfSBmcm9tICcuL3BhZ2luYXRpb24ubW9kZWwnO1xuXG4vKipcbiAqIFBhZ2luYXRpb24gQ29tcG9uZW50LlxuICpcbiAqIEp1c3QgdXNlIHRoaXMgaW5zaWRlIHlvdXIgdGVtcGxhdGVzOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxjbG91a2l0LXBhZ2luYXRpb24gLi4uPjwvY2xvdWtpdC1wYWdpbmF0aW9uPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsb3VraXQtcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlOiBgXG4gIDxkaXYgW25nU3R5bGVdPVwiZ2V0U3R5bGUoJ3dyYXBwZXInKS5zdHlsZVwiPlxuICAgIDxjbG91a2l0LXBhZ2luYXRpb24tYnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPVwiIWlzUHJldmlvdXNQb3NzaWJsZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgIFtwYWdpbmF0aW9uSXRlbV09XCJwcmV2aW91c0R1bW15UGFnaW5hdGlvbkl0ZW0oKVwiXG4gICAgICBbdGhlbWVTZWxlY3RlZF09XCJ0aGVtZVNlbGVjdGVkXCJcbiAgICAgIFt0eXBlXT1cIlBhZ2luYXRpb25CdXR0b25UeXBlWydwcmV2aW91cyddXCJcbiAgICAgIChjbGlja2VkKT1cInNlbGVjdFBhZ2UoJGV2ZW50KVwiXG4gICAgPjwvY2xvdWtpdC1wYWdpbmF0aW9uLWJ1dHRvbj5cbiAgICA8Y2xvdWtpdC1wYWdpbmF0aW9uLWJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IHBhZ2Ugb2Ygc3RhdGUucGFnZXNcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtwYWdpbmF0aW9uSXRlbV09XCJwYWdlXCJcbiAgICAgIFt0aGVtZVNlbGVjdGVkXT1cInRoZW1lU2VsZWN0ZWRcIlxuICAgICAgW3R5cGVdPVwiUGFnaW5hdGlvbkJ1dHRvblR5cGVbJ25vcm1hbCddXCJcbiAgICAgIChjbGlja2VkKT1cInNlbGVjdFBhZ2UoJGV2ZW50KVwiXG4gICAgPjwvY2xvdWtpdC1wYWdpbmF0aW9uLWJ1dHRvbj5cbiAgICA8Y2xvdWtpdC1wYWdpbmF0aW9uLWJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cIiFpc05leHRQb3NzaWJsZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgIFtwYWdpbmF0aW9uSXRlbV09XCJuZXh0RHVtbXlQYWdpbmF0aW9uSXRlbSgpXCJcbiAgICAgIFt0aGVtZVNlbGVjdGVkXT1cInRoZW1lU2VsZWN0ZWRcIlxuICAgICAgW3R5cGVdPVwiUGFnaW5hdGlvbkJ1dHRvblR5cGVbJ25leHQnXVwiXG4gICAgICAoY2xpY2tlZCk9XCJzZWxlY3RQYWdlKCRldmVudClcIlxuICAgID48L2Nsb3VraXQtcGFnaW5hdGlvbi1idXR0b24+XG4gIDwvZGl2PmAsXG4gIHN0eWxlczogWyBdLFxufSlcbmV4cG9ydCBjbGFzcyBDbG91a2l0UGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHRoZW1lIHNlbGVjdG9yLiBPbmx5IHVzZSBgdGhlbWVgIHdoZW4geW91IGhhdmUgcmVnaXN0ZXJlZCBhIHZhbGlkIHRoZW1lXG4gICAqIHZpYSB0aGUgYENsb3VraXRUaGVtZVNlcnZpY2VgIGZyb20gW2BAY2xvdWtpdC90aGVtZWBde0BsaW5rIGh0dHBzOi8vY2xvdWtpdC5naXRodWIuaW8vIy9jb21wb25lbnQvdGhlbWV9LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRoZW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiB0b3RhbCBQYWdlc1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRvdGFsOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgUGFnZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGN1cnJlbnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogRXh0ZXJuYWwgd2F5IHRvIGRpc2FibGUgdGhlIHdob2xlIHBhZ2luYXRpb24gZS5nLlxuICAgKiBkdXJpbmcgbG9hZGluZyBleHRlcm5hbCBkYXRhXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgTGFiZWwgZm9yIHRoZSBcIk5leHRcIiBidXR0b24sIGRlZmF1bHRzIHRvIFwiTmV4dFwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbGFiZWxOZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIExhYmVsIGZvciB0aGUgXCJQcmV2aW91c1wiIGJ1dHRvbiwgZGVmYXVsdHMgdG8gXCJQcmV2XCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsYWJlbFByZXY6IHN0cmluZztcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCwgd2hlbiBwYWdlIGlzIGNsaWNrZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIHB1YmxpYyBvblBhZ2VTZWxlY3Q6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIElOVEVSTkFMIFZBUklBQkxFU1xuICBwdWJsaWMgdGhlbWVTZWxlY3RlZDogQ2xvdWtpdENvbXBvbmVudFRoZW1lO1xuICBwdWJsaWMgUGFnaW5hdGlvbkJ1dHRvblR5cGUgPSBQYWdpbmF0aW9uQnV0dG9uVHlwZTtcbiAgcHVibGljIHN0YXRlID0ge1xuICAgIHBhZ2VzOiBbXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBDbG91a2l0VGhlbWVTZXJ2aWNlKSB7XG4gICAgdGhpcy50aGVtZVNlbGVjdGVkID0gdGhpcy50aGVtZVNlcnZpY2UuZ2V0Q29tcG9uZW50VGhlbWUoJ3BhZ2luYXRpb24nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHlsZShlbGVtZW50OiBzdHJpbmcpOiBDbG91a2l0U3RhdGVmdWxBbmRNb2RpZmllckF3YXJlRWxlbWVudFRoZW1lU3R5bGVEZWZpbml0aW9uIHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMudGhlbWVTZWxlY3RlZC5nZXRTdHlsZShlbGVtZW50LCAnbm9ybWFsJywgJ2Jhc2UnKTtcbiAgICByZXR1cm4gdGhpcy50aGVtZVNlcnZpY2UucHJlZml4U3R5bGUoc3R5bGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvdmVycmlkZXMgT25DaGFuZ2VzXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICh0aGlzLnRoZW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy50aGVtZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy50aGVtZVNlbGVjdGVkID0gdGhpcy50aGVtZVNlcnZpY2UuZ2V0Q29tcG9uZW50VGhlbWUodGhpcy50aGVtZSk7XG4gICAgICBpZiAodGhpcy50aGVtZVNlbGVjdGVkID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXQVJOOiByZXF1ZXN0ZWQgdGhlbWUgJHt0aGlzLnRoZW1lfSBkb2VzIG5vdCBleGlzdC4gRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgdGhlbWUgZm9yIHBhZ2luYXRpb24uYCk7XG4gICAgICAgIHRoaXMudGhlbWVTZWxlY3RlZCA9IHRoaXMudGhlbWVTZXJ2aWNlLmdldENvbXBvbmVudFRoZW1lKCdwYWdpbmF0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhdGUucGFnZXMgPSBjYWxjdWxhdGVQYWdpbmF0aW9uSXRlbXModGhpcy50b3RhbCwgdGhpcy5jdXJyZW50KTtcbiAgfVxuXG4gIHNlbGVjdFBhZ2UoZXZlbnQ6IFBhZ2luYXRpb25CdXR0b25DbGlja0V2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFBhZ2luYXRpb25CdXR0b25UeXBlWydwcmV2aW91cyddICYmXG4gICAgICB0aGlzLmlzUHJldmlvdXNQb3NzaWJsZSgpKSB7XG4gICAgICB0aGlzLm9uUGFnZVNlbGVjdC5lbWl0KHRoaXMuY3VycmVudCAtIDEpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gUGFnaW5hdGlvbkJ1dHRvblR5cGVbJ25leHQnXSAmJlxuICAgICAgdGhpcy5pc05leHRQb3NzaWJsZSgpKSB7XG4gICAgICB0aGlzLm9uUGFnZVNlbGVjdC5lbWl0KHRoaXMuY3VycmVudCArIDEpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gUGFnaW5hdGlvbkJ1dHRvblR5cGVbJ25vcm1hbCddKSB7XG4gICAgICB0aGlzLm9uUGFnZVNlbGVjdC5lbWl0KGV2ZW50LnBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByZXZpb3VzRHVtbXlQYWdpbmF0aW9uSXRlbSgpIHtcbiAgICBsZXQgbGFiZWwgPSAnUHJldic7XG4gICAgaWYgKHRoaXMubGFiZWxQcmV2ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5sYWJlbFByZXYgIT09IG51bGwpIHtcbiAgICAgIGxhYmVsID0gdGhpcy5sYWJlbFByZXY7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkl0ZW0oLTEsIGZhbHNlLCBmYWxzZSwgbGFiZWwpO1xuICB9XG5cbiAgbmV4dER1bW15UGFnaW5hdGlvbkl0ZW0oKSB7XG4gICAgbGV0IGxhYmVsID0gJ05leHQnO1xuICAgIGlmICh0aGlzLmxhYmVsTmV4dCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGFiZWxOZXh0ICE9PSBudWxsKSB7XG4gICAgICBsYWJlbCA9IHRoaXMubGFiZWxOZXh0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFBhZ2luYXRpb25JdGVtKC0xLCBmYWxzZSwgZmFsc2UsIGxhYmVsKTtcbiAgfVxuXG4gIGlzUHJldmlvdXNQb3NzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50ID4gMTtcbiAgfVxuXG4gIGlzTmV4dFBvc3NpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPCB0aGlzLnRvdGFsO1xuICB9XG5cbn1cblxuIiwiLyohXG4gKiBAbGljZW5zZSBNSVRcbiAqIENvcHlyaWdodCAoYykgMjAxNyBCZXJuaGFyZCBHcsODwrxuZXdhbGR0IC0gY29kZWNsb3UuaW9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91a2l0L2xlZ2FsXG4gKi9cbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsb3VraXRDb21wb25lbnRUaGVtZSwgQ2xvdWtpdFRoZW1lU2VydmljZSwgVWlFbGVtZW50IH0gZnJvbSAnQGNsb3VraXQvdGhlbWUnO1xuaW1wb3J0IHsgVWkgfSBmcm9tICcuLi9wYWdpbmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IFBhZ2luYXRpb25CdXR0b25DbGlja0V2ZW50LCBQYWdpbmF0aW9uQnV0dG9uVHlwZSwgUGFnaW5hdGlvbkl0ZW0gfSBmcm9tICcuLi9wYWdpbmF0aW9uLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xvdWtpdC1wYWdpbmF0aW9uLWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW25nU3R5bGVdPVwic3R5bGU/LnN0eWxlXCJcbiAgICAgIChjbGljayk9XCJkb0NsaWNrKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VFbnRlcigpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoKVwiXG4gICAgPlxuICAgICAge3twYWdpbmF0aW9uSXRlbS5sYWJlbH19XG4gICAgPC9idXR0b24+YCxcbiAgc3R5bGVzOiBbIF0sXG59KVxuZXhwb3J0IGNsYXNzIENsb3VraXRQYWdpbmF0aW9uQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHR5cGU6IFBhZ2luYXRpb25CdXR0b25UeXBlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYWdpbmF0aW9uSXRlbTogUGFnaW5hdGlvbkl0ZW07XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRoZW1lU2VsZWN0ZWQ6IENsb3VraXRDb21wb25lbnRUaGVtZTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxQYWdpbmF0aW9uQnV0dG9uQ2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy9cbiAgLy8gSU5URVJOQUxcbiAgLy9cbiAgcHJpdmF0ZSB1aTogVWlFbGVtZW50O1xuICBwdWJsaWMgc3R5bGU6IGFueTtcbiAgcHJpdmF0ZSBpc01vdXNlU3RpbGxPdmVyID0gZmFsc2U7XG5cbiAgcHVibGljIHN0YXRpYyB0cmFuc2Zvcm0ocGFnZUl0ZW06IFBhZ2luYXRpb25JdGVtKTogVWlFbGVtZW50IHtcbiAgICBpZiAocGFnZUl0ZW0gPT09IHVuZGVmaW5lZCB8fCBwYWdlSXRlbSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBVaUVsZW1lbnQoVWkuZWxlbWVudHMuZmlsbGVyLCBVaS5zdGF0ZXMuZGlzYWJsZWQsIFVpLm1vZGlmaWVyLmJhc2UpO1xuICAgIH1cbiAgICBjb25zdCB1aUVsZW1lbnQgPSBwYWdlSXRlbS5pc0ZpbGxlciA/IFVpLmVsZW1lbnRzLmZpbGxlciA6IFVpLmVsZW1lbnRzLmJ1dHRvbjtcbiAgICBjb25zdCB1aVN0YXRlID0gcGFnZUl0ZW0uaXNBY3RpdmUgPyBVaS5zdGF0ZXMuYWN0aXZlIDogVWkuc3RhdGVzLm5vcm1hbDtcbiAgICByZXR1cm4gbmV3IFVpRWxlbWVudCh1aUVsZW1lbnQsIHVpU3RhdGUsIFVpLm1vZGlmaWVyLmJhc2UpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aGVtZVNlcnZpY2U6IENsb3VraXRUaGVtZVNlcnZpY2UpIHtcbiAgfVxuXG4gIHVwZGF0ZVN0eWxlKCkge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy50aGVtZVNlbGVjdGVkLmdldFVpU3R5bGUodGhpcy51aSk7XG4gICAgaWYgKHN0eWxlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0eWxlID0gdGhpcy50aGVtZVNlcnZpY2UucHJlZml4U3R5bGUoc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIC8vIHJldGFpbiBtb3VzZUVudGVyIGFuZCBtb3VzZUxlYXZlIG1vZGlmaWVyIGNoYW5nZXMhXG4gICAgbGV0IG1vZGlmaWVyOiBzdHJpbmcgPSBudWxsO1xuICAgIGlmICh0aGlzLnVpICE9PSBudWxsICYmIHRoaXMudWkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW9kaWZpZXIgPSB0aGlzLnVpLm1vZGlmaWVyO1xuICAgIH1cbiAgICB0aGlzLnVpID0gQ2xvdWtpdFBhZ2luYXRpb25CdXR0b25Db21wb25lbnQudHJhbnNmb3JtKHRoaXMucGFnaW5hdGlvbkl0ZW0pO1xuICAgIGlmIChtb2RpZmllciAhPT0gbnVsbCAmJiB0aGlzLmlzTW91c2VTdGlsbE92ZXIpIHtcbiAgICAgIHRoaXMudWkubW9kaWZpZXIgPSBtb2RpZmllcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudWkuc3RhdGUgPSBVaS5zdGF0ZXMuZGlzYWJsZWQ7XG4gICAgICB0aGlzLnVpLm1vZGlmaWVyID0gVWkubW9kaWZpZXIuYmFzZTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdHlsZSgpO1xuICB9XG5cbiAgcHVibGljIG1vdXNlRW50ZXIoKSB7XG4gICAgdGhpcy51aS5tb2RpZmllciA9IFVpLm1vZGlmaWVyLmhvdmVyO1xuICAgIHRoaXMuaXNNb3VzZVN0aWxsT3ZlciA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVTdHlsZSgpO1xuICB9XG5cbiAgcHVibGljIG1vdXNlTGVhdmUoKSB7XG4gICAgdGhpcy51aS5tb2RpZmllciA9IFVpLm1vZGlmaWVyLmJhc2U7XG4gICAgdGhpcy5pc01vdXNlU3RpbGxPdmVyID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVTdHlsZSgpO1xuICB9XG5cbiAgcHVibGljIGRvQ2xpY2soKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRpb25JdGVtLmlzRmlsbGVyKSB7XG4gICAgICB0aGlzLmNsaWNrZWQuZW1pdChuZXcgUGFnaW5hdGlvbkJ1dHRvbkNsaWNrRXZlbnQodGhpcy50eXBlLCB0aGlzLnBhZ2luYXRpb25JdGVtLnBhZ2UpKTtcbiAgICB9XG4gIH1cblxuXG5cbn1cblxuIiwiLyohXG4gKiBAbGljZW5zZSBNSVRcbiAqIENvcHlyaWdodCAoYykgMjAxNyBCZXJuaGFyZCBHcsODwrxuZXdhbGR0IC0gY29kZWNsb3UuaW9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91a2l0L2xlZ2FsXG4gKi9cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2xvdWtpdFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IENsb3VraXRUaGVtZVNlcnZpY2UgfSBmcm9tICdAY2xvdWtpdC90aGVtZSc7XG5pbXBvcnQgeyBDbG91a2l0UGFnaW5hdGlvbkNvbXBvbmVudFRoZW1lRGVmYXVsdCB9IGZyb20gJy4vcGFnaW5hdGlvbi50aGVtZSc7XG5pbXBvcnQgeyBDbG91a2l0UGFnaW5hdGlvbkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vY2hpbGRyZW4vcGFnaW5hdGlvbi1idXR0b24uY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogWyBDb21tb25Nb2R1bGUgXSxcbiAgZXhwb3J0czogWyBDbG91a2l0UGFnaW5hdGlvbkNvbXBvbmVudCBdLFxuICBkZWNsYXJhdGlvbnM6IFsgQ2xvdWtpdFBhZ2luYXRpb25Db21wb25lbnQsIENsb3VraXRQYWdpbmF0aW9uQnV0dG9uQ29tcG9uZW50IF0sXG59KVxuZXhwb3J0IGNsYXNzIENsb3VraXRQYWdpbmF0aW9uTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aGVtZVNlcnZpY2U6IENsb3VraXRUaGVtZVNlcnZpY2UpIHtcbiAgICBpZiAodGhpcy50aGVtZVNlcnZpY2UuZ2V0Q29tcG9uZW50VGhlbWUoJ3BhZ2luYXRpb24nKSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy50aGVtZVNlcnZpY2UucmVnaXN0ZXJDb21wb25lbnRUaGVtZSgncGFnaW5hdGlvbicsIG5ldyBDbG91a2l0UGFnaW5hdGlvbkNvbXBvbmVudFRoZW1lRGVmYXVsdCgpKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBTUEsTUFBYSwwQkFBMEI7Ozs7O0lBQ3JDLFlBQW1CLElBQTBCLEVBQVMsSUFBWTtRQUEvQyxTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUFTLFNBQUksR0FBSixJQUFJLENBQVE7S0FBSTtDQUN2RTs7O0lBR0MsU0FBVTtJQUNWLFdBQVk7SUFDWixPQUFROzs7OztBQUdWLE1BQWEsY0FBYzs7Ozs7OztJQUN6QixZQUNTLElBQVksRUFDWixRQUFpQixFQUNqQixRQUFpQixFQUNqQixLQUFhO1FBSGIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixVQUFLLEdBQUwsS0FBSyxDQUFRO0tBQUk7Q0FDM0I7TUFFWSxFQUFFOztBQUNDLFdBQVEsR0FBUTtJQUM1QixNQUFNLEVBQUUsUUFBUTtJQUNoQixNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztDQUNuQixDQUFDO0FBQ1ksU0FBTSxHQUFRO0lBQzFCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFFBQVEsRUFBRSxVQUFVO0NBQ3JCLENBQUM7QUFDWSxXQUFRLEdBQVE7SUFDNUIsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsT0FBTztDQUNmLENBQUM7Ozs7OztNQzlCUyxzQ0FBdUMsU0FBUSxxQkFBcUI7SUFFL0U7UUFDRSxLQUFLLEVBQUUsQ0FBQzs7OztRQUlSLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDckUsVUFBVSxvQkFBNEI7WUFDckMsT0FBTyxFQUFF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