right-angled
Version:
Lightweight and easy to use angular data grids. Integrates with your markup and styles rather than generating its own.
252 lines • 29.3 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { filter } from '../../filters/filter.annotation';
import { BehaviorSubject } from 'rxjs';
import * as i0 from "@angular/core";
/**
* Implements {@link Pager} contract and represents behavior of list with pages.
* @note This type is configured to use with {@link FiltersService}.
*/
export class RTPagedPager {
constructor() {
/**
* @inheritdoc
*/
this.appendedOnLoad = false;
/**
* This is both initial value and value which will be applied to {@link pageSize} property on {@link reset} method execution.
*/
this.defaultPageSize = RTPagedPager.settings.defaultPageSize;
/**
* The biggest value that can be applied to {@link pageSize} property.
*/
this.maxPageSize = RTPagedPager.settings.maxPageSize;
/**
* The smallest value that can be applied to {@link pageSize} property.
*/
this.minPageSize = RTPagedPager.settings.minPageSize;
/**
* @inheritdoc
*/
this.totalCount = 0;
/**
* @inheritdoc
*/
this.loadedCount = 0;
/**
* Number of record in remote data source from which data was loaded at last request.
*
* For example, it will be equal to 21 when loads second page of list with page size of 20.
*/
this.displayFrom = 0;
/**
* Number of record in remote data source to which data was loaded at last request.
*
* For example, it will be equal to 40 when loads second page of list with page size of 20. Or it will be equal to total count of available records if records count is less than 40.
*/
this.displayTo = 0;
this.pageNumber$ = new BehaviorSubject(1);
this.pageSize$ = new BehaviorSubject(RTPagedPager.settings.defaultPageSize);
}
/**
* Global settings for properties such as default values and constraints for pager properties.
*
* These settings are static and their values are copied to the properties of the same name for each instance of {@link RTPagedPager} type.
*
* So, changing of this settings will affect all instances of {@link RTPagedPager} type that will be created after such changes.
* If you want to change settings of concrete object you can use it the same name properties.
*/
// tslint:disable-next-line: typedef
static { this.settings = {
/**
* @see {@link RTPagedPager.defaultPageSize}
*/
defaultPageSize: 20,
/**
* @see {@link RTPagedPager.maxPageSize}
*/
maxPageSize: 200,
/**
* @see {@link RTPagedPager.minPageSize}
*/
minPageSize: 1
}; }
/**
* Total pages count computed as {@link totalCount} / {@link pageSize}.
* Used to check correctness of values applied to {@link pageNumber}.
*/
get pageCount() {
return Math.ceil(this.totalCount / this.pageSize$.getValue());
}
/**
* Specifies number of the page that must be loaded on next request.
*
* @note This property is ready to use with {@link FiltersService} since it has {@link filter} annotation.
* @see {@link PagedListRequest.pageNumber}
*/
get pageNumber() {
return this.pageNumber$.getValue();
}
/**
* Executes several checks. For example, it doesn't accept values bigger than {@link pageCount}.
*/
set pageNumber(value) {
const valueStr = (value + '').replace(/[^0-9]/g, '');
let pageNumber = parseInt(valueStr, 10) ? parseInt(valueStr, 10) : 1;
if (pageNumber > this.pageCount) {
pageNumber = this.pageCount;
}
if (pageNumber < 1) {
pageNumber = 1;
}
this.pageNumber$.next(pageNumber);
}
/**
* Specifies size of page that must be loaded on next request.
*
* @note This property is ready to use with {@link FiltersService} since it has {@link filter} annotation.
* @see {@link PagedListRequest.pageSize}
*/
get pageSize() {
return this.pageSize$.getValue();
}
/**
* Executes several checks. For example, it doesn't accept values bigger than {@link maxPageSize}.
*/
set pageSize(value) {
const valueStr = (value + '').replace(/[^0-9]/g, '');
let pageSize = parseInt(valueStr, 10) ? parseInt(valueStr, 10) : this.defaultPageSize;
if (this.totalCount !== 0) {
if (pageSize > this.totalCount) {
pageSize = this.totalCount;
}
if (this.pageNumber * pageSize > this.totalCount) {
pageSize = Math.ceil(this.totalCount / this.pageNumber);
}
}
if (pageSize > this.maxPageSize) {
pageSize = this.maxPageSize;
}
if (pageSize < this.minPageSize || pageSize === 0) {
pageSize = this.defaultPageSize;
}
this.pageSize$.next(pageSize);
}
/**
* @inheritdoc
*/
processResponse(response) {
let alignedResponse;
if (Array.isArray(response)) {
alignedResponse = {
items: response,
loadedCount: response.length,
totalCount: response.length
};
}
else {
alignedResponse = response;
}
this.loadedCount = alignedResponse.loadedCount || (alignedResponse.items && alignedResponse.items.length ? alignedResponse.items.length : 0);
this.totalCount = alignedResponse.totalCount || 0;
const skippedCount = this.pageSize * (this.pageNumber - 1);
this.displayFrom = skippedCount + 1;
this.displayTo = this.displayFrom + this.loadedCount - 1;
}
/**
* Returns `true` if it's possible to move pager to the previous page (e.g. currently pager is not on the first page).
*/
get canMoveBackward() {
return this.pageCount !== 0 && this.pageNumber !== 1;
}
/**
* Returns `true` if it's possible to move pager to the next page (e.g. currently pager is not on the last page).
*/
get canMoveForward() {
return this.pageCount !== 0 && this.pageNumber < this.pageCount;
}
/**
* Sets {@link pageNumber} property to `1` if it's possible.
* @returns `true` if {@link pageNumber} value was changed.
*/
tryMoveToFirstPage() {
if (this.canMoveBackward) {
this.pageNumber = 1;
return true;
}
return false;
}
/**
* Decrements {@link pageNumber} if it's possible.
* @returns `true` if {@link pageNumber} value was changed.
*/
tryMoveToPreviousPage() {
if (this.canMoveBackward) {
this.pageNumber -= 1;
return true;
}
return false;
}
/**
* Increments {@link pageNumber} if it's possible.
* @returns `true` if {@link pageNumber} value was changed.
*/
tryMoveToNextPage() {
if (this.canMoveForward) {
this.pageNumber += 1;
return true;
}
return false;
}
/**
* Sets {@link pageNumber} property to value of {@link pageCount} property if it's possible.
* @returns `true` if {@link pageNumber} value was changed.
*/
tryMoveToLastPage() {
if (this.canMoveForward) {
this.pageNumber = this.pageCount;
return true;
}
return false;
}
/**
* @inheritdoc
*/
reset() {
this.totalCount = 0;
this.loadedCount = 0;
this.pageNumber = 1;
this.pageSize = this.defaultPageSize;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RTPagedPager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RTPagedPager }); }
}
__decorate([
filter({
defaultValue: 0,
parameterName: 'skip',
parseFormatter(rawValue, allValues) {
const skip = isNaN(rawValue) || !rawValue ? 0 : rawValue;
const pageSize = !allValues || isNaN(allValues.take) || !allValues.take ? this.defaultPageSize : allValues.take * 1;
return skip % pageSize === 0 ? skip / pageSize + 1 : 1;
},
serializeFormatter() {
return (this.pageNumber - 1) * this.pageSize;
}
})
], RTPagedPager.prototype, "pageNumber$", void 0);
__decorate([
filter({
defaultValue() {
return this.defaultPageSize;
},
parameterName: 'take',
parseFormatter(rawValue) {
return isNaN(rawValue) || !rawValue ? this.defaultPageSize : rawValue;
}
})
], RTPagedPager.prototype, "pageSize$", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RTPagedPager, decorators: [{
type: Injectable
}], propDecorators: { pageNumber$: [], pageSize$: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtcGFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaWdodC1hbmdsZWQvc3JjL2xpYi9saXN0cy9wcm92aWRlcnMvcGFnZWQtcGFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR3pELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7O0FBRW5EOzs7R0FHRztBQUVILE1BQU0sT0FBTyxZQUFZO0lBRHpCO1FBeUJJOztXQUVHO1FBQ0ksbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDOUI7O1dBRUc7UUFDSSxvQkFBZSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ3ZFOztXQUVHO1FBQ0ksZ0JBQVcsR0FBVyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMvRDs7V0FFRztRQUNJLGdCQUFXLEdBQVcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDL0Q7O1dBRUc7UUFDSSxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCOztXQUVHO1FBQ0ksZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFFdkI7Ozs7V0FJRztRQUNJLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCOzs7O1dBSUc7UUFDSSxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBYWQsZ0JBQVcsR0FBdUIsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFXekQsY0FBUyxHQUF1QixJQUFJLGVBQWUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBd0pyRztJQTNPRzs7Ozs7OztPQU9HO0lBQ0gsb0NBQW9DO2FBQ3RCLGFBQVEsR0FBRztRQUNyQjs7V0FFRztRQUNILGVBQWUsRUFBRSxFQUFFO1FBQ25COztXQUVHO1FBQ0gsV0FBVyxFQUFFLEdBQUc7UUFDaEI7O1dBRUc7UUFDSCxXQUFXLEVBQUUsQ0FBQztLQUNqQixBQWJxQixDQWFwQjtJQStERjs7O09BR0c7SUFDSCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUksSUFBSSxDQUFDLFNBQXFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBUSxJQUFJLENBQUMsV0FBdUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBQ0Q7O09BRUc7SUFDSCxJQUFXLFVBQVUsQ0FBQyxLQUFhO1FBQy9CLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDN0IsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDL0I7UUFDRCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDaEIsVUFBVSxHQUFHLENBQUMsQ0FBQztTQUNsQjtRQUNBLElBQUksQ0FBQyxXQUF1QyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSCxJQUFXLFFBQVE7UUFDZixPQUFRLElBQUksQ0FBQyxTQUFxQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFDRDs7T0FFRztJQUNILElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDN0IsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRXRGLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDNUIsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDOUI7WUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzlDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNEO1NBQ0o7UUFDRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzdCLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQy9DLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQ25DO1FBRUEsSUFBSSxDQUFDLFNBQXFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxRQUFtQztRQUN0RCxJQUFJLGVBQWtDLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3pCLGVBQWUsR0FBRztnQkFDZCxLQUFLLEVBQUUsUUFBUTtnQkFDZixXQUFXLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQzVCLFVBQVUsRUFBRSxRQUFRLENBQUMsTUFBTTthQUNULENBQUM7U0FDMUI7YUFBTTtZQUNILGVBQWUsR0FBRyxRQUFRLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxXQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0ksSUFBSSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRDs7T0FFRztJQUNILElBQVcsZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRDs7T0FFRztJQUNILElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNwRSxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksa0JBQWtCO1FBQ3JCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNEOzs7T0FHRztJQUNJLHFCQUFxQjtRQUN4QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDRDs7O09BR0c7SUFDSSxpQkFBaUI7UUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksaUJBQWlCO1FBQ3BCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDekMsQ0FBQzsrR0EzT1EsWUFBWTttSEFBWixZQUFZOztBQXlFZDtJQVpOLE1BQU0sQ0FBQztRQUNKLFlBQVksRUFBRSxDQUFDO1FBQ2YsYUFBYSxFQUFFLE1BQU07UUFDckIsY0FBYyxDQUFxQixRQUFhLEVBQUUsU0FBYztZQUM1RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNwSCxPQUFPLElBQUksR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxrQkFBa0I7WUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2pELENBQUM7S0FDWSxDQUFDO2lEQUM4QztBQVd6RDtJQVROLE1BQU0sQ0FBQztRQUNKLFlBQVk7WUFDUixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDaEMsQ0FBQztRQUNELGFBQWEsRUFBRSxNQUFNO1FBQ3JCLGNBQWMsQ0FBcUIsUUFBYTtZQUM1QyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzFFLENBQUM7S0FDSixDQUFDOytDQUNnRzs0RkFwRnpGLFlBQVk7a0JBRHhCLFVBQVU7OEJBMEVBLFdBQVcsTUFXWCxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdlciB9IGZyb20gJy4uLy4uL2NvcmUvcGFnZXInO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICcuLi8uLi9maWx0ZXJzL2ZpbHRlci5hbm5vdGF0aW9uJztcclxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS9maWx0ZXItY29uZmlnJztcclxuaW1wb3J0IHsgTGlzdFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY29yZS9saXN0LXJlc3BvbnNlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKipcclxuICogSW1wbGVtZW50cyB7QGxpbmsgUGFnZXJ9IGNvbnRyYWN0IGFuZCByZXByZXNlbnRzIGJlaGF2aW9yIG9mIGxpc3Qgd2l0aCBwYWdlcy5cclxuICogQG5vdGUgVGhpcyB0eXBlIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHdpdGgge0BsaW5rIEZpbHRlcnNTZXJ2aWNlfS5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFJUUGFnZWRQYWdlciBpbXBsZW1lbnRzIFBhZ2VyIHtcclxuICAgIC8qKlxyXG4gICAgICogR2xvYmFsIHNldHRpbmdzIGZvciBwcm9wZXJ0aWVzIHN1Y2ggYXMgZGVmYXVsdCB2YWx1ZXMgYW5kIGNvbnN0cmFpbnRzIGZvciBwYWdlciBwcm9wZXJ0aWVzLlxyXG4gICAgICpcclxuICAgICAqIFRoZXNlIHNldHRpbmdzIGFyZSBzdGF0aWMgYW5kIHRoZWlyIHZhbHVlcyBhcmUgY29waWVkIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzYW1lIG5hbWUgZm9yIGVhY2ggaW5zdGFuY2Ugb2Yge0BsaW5rIFJUUGFnZWRQYWdlcn0gdHlwZS5cclxuICAgICAqXHJcbiAgICAgKiBTbywgY2hhbmdpbmcgb2YgdGhpcyBzZXR0aW5ncyB3aWxsIGFmZmVjdCBhbGwgaW5zdGFuY2VzIG9mIHtAbGluayBSVFBhZ2VkUGFnZXJ9IHR5cGUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYWZ0ZXIgc3VjaCBjaGFuZ2VzLlxyXG4gICAgICogSWYgeW91IHdhbnQgdG8gY2hhbmdlIHNldHRpbmdzIG9mIGNvbmNyZXRlIG9iamVjdCB5b3UgY2FuIHVzZSBpdCB0aGUgc2FtZSBuYW1lIHByb3BlcnRpZXMuXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHlwZWRlZlxyXG4gICAgcHVibGljIHN0YXRpYyBzZXR0aW5ncyA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAc2VlIHtAbGluayBSVFBhZ2VkUGFnZXIuZGVmYXVsdFBhZ2VTaXplfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRlZmF1bHRQYWdlU2l6ZTogMjAsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHNlZSB7QGxpbmsgUlRQYWdlZFBhZ2VyLm1heFBhZ2VTaXplfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1heFBhZ2VTaXplOiAyMDAsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHNlZSB7QGxpbmsgUlRQYWdlZFBhZ2VyLm1pblBhZ2VTaXplfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1pblBhZ2VTaXplOiAxXHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAaW5oZXJpdGRvY1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBwZW5kZWRPbkxvYWQgPSBmYWxzZTtcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBib3RoIGluaXRpYWwgdmFsdWUgYW5kIHZhbHVlIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB7QGxpbmsgcGFnZVNpemV9IHByb3BlcnR5IG9uIHtAbGluayByZXNldH0gbWV0aG9kIGV4ZWN1dGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlZmF1bHRQYWdlU2l6ZTogbnVtYmVyID0gUlRQYWdlZFBhZ2VyLnNldHRpbmdzLmRlZmF1bHRQYWdlU2l6ZTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJpZ2dlc3QgdmFsdWUgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB7QGxpbmsgcGFnZVNpemV9IHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWF4UGFnZVNpemU6IG51bWJlciA9IFJUUGFnZWRQYWdlci5zZXR0aW5ncy5tYXhQYWdlU2l6ZTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNtYWxsZXN0IHZhbHVlIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8ge0BsaW5rIHBhZ2VTaXplfSBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pblBhZ2VTaXplOiBudW1iZXIgPSBSVFBhZ2VkUGFnZXIuc2V0dGluZ3MubWluUGFnZVNpemU7XHJcbiAgICAvKipcclxuICAgICAqIEBpbmhlcml0ZG9jXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b3RhbENvdW50ID0gMDtcclxuICAgIC8qKlxyXG4gICAgICogQGluaGVyaXRkb2NcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRlZENvdW50ID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE51bWJlciBvZiByZWNvcmQgaW4gcmVtb3RlIGRhdGEgc291cmNlIGZyb20gd2hpY2ggZGF0YSB3YXMgbG9hZGVkIGF0IGxhc3QgcmVxdWVzdC5cclxuICAgICAqXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgaXQgd2lsbCBiZSBlcXVhbCB0byAyMSB3aGVuIGxvYWRzIHNlY29uZCBwYWdlIG9mIGxpc3Qgd2l0aCBwYWdlIHNpemUgb2YgMjAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwbGF5RnJvbSA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIE51bWJlciBvZiByZWNvcmQgaW4gcmVtb3RlIGRhdGEgc291cmNlIHRvIHdoaWNoIGRhdGEgd2FzIGxvYWRlZCBhdCBsYXN0IHJlcXVlc3QuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIGV4YW1wbGUsIGl0IHdpbGwgYmUgZXF1YWwgdG8gNDAgd2hlbiBsb2FkcyBzZWNvbmQgcGFnZSBvZiBsaXN0IHdpdGggcGFnZSBzaXplIG9mIDIwLiBPciBpdCB3aWxsIGJlIGVxdWFsIHRvIHRvdGFsIGNvdW50IG9mIGF2YWlsYWJsZSByZWNvcmRzIGlmIHJlY29yZHMgY291bnQgaXMgbGVzcyB0aGFuIDQwLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGxheVRvID0gMDtcclxuICAgIEBmaWx0ZXIoe1xyXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICBwYXJhbWV0ZXJOYW1lOiAnc2tpcCcsXHJcbiAgICAgICAgcGFyc2VGb3JtYXR0ZXIodGhpczogUlRQYWdlZFBhZ2VyLCByYXdWYWx1ZTogYW55LCBhbGxWYWx1ZXM6IGFueSk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNraXAgPSBpc05hTihyYXdWYWx1ZSkgfHwgIXJhd1ZhbHVlID8gMCA6IHJhd1ZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBwYWdlU2l6ZSA9ICFhbGxWYWx1ZXMgfHwgaXNOYU4oYWxsVmFsdWVzLnRha2UpIHx8ICFhbGxWYWx1ZXMudGFrZSA/IHRoaXMuZGVmYXVsdFBhZ2VTaXplIDogYWxsVmFsdWVzLnRha2UgKiAxO1xyXG4gICAgICAgICAgICByZXR1cm4gc2tpcCAlIHBhZ2VTaXplID09PSAwID8gc2tpcCAvIHBhZ2VTaXplICsgMSA6IDE7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXJpYWxpemVGb3JtYXR0ZXIodGhpczogUlRQYWdlZFBhZ2VyKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnBhZ2VOdW1iZXIgLSAxKSAqIHRoaXMucGFnZVNpemU7XHJcbiAgICAgICAgfVxyXG4gICAgfSBhcyBGaWx0ZXJDb25maWcpXHJcbiAgICBwdWJsaWMgcGFnZU51bWJlciQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoMSk7XHJcblxyXG4gICAgQGZpbHRlcih7XHJcbiAgICAgICAgZGVmYXVsdFZhbHVlKHRoaXM6IFJUUGFnZWRQYWdlcik6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRQYWdlU2l6ZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtZXRlck5hbWU6ICd0YWtlJyxcclxuICAgICAgICBwYXJzZUZvcm1hdHRlcih0aGlzOiBSVFBhZ2VkUGFnZXIsIHJhd1ZhbHVlOiBhbnkpOiBudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocmF3VmFsdWUpIHx8ICFyYXdWYWx1ZSA/IHRoaXMuZGVmYXVsdFBhZ2VTaXplIDogcmF3VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuICAgIHB1YmxpYyBwYWdlU2l6ZSQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoUlRQYWdlZFBhZ2VyLnNldHRpbmdzLmRlZmF1bHRQYWdlU2l6ZSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUb3RhbCBwYWdlcyBjb3VudCBjb21wdXRlZCBhcyB7QGxpbmsgdG90YWxDb3VudH0gLyB7QGxpbmsgcGFnZVNpemV9LlxyXG4gICAgICogVXNlZCB0byBjaGVjayBjb3JyZWN0bmVzcyBvZiB2YWx1ZXMgYXBwbGllZCB0byB7QGxpbmsgcGFnZU51bWJlcn0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsQ291bnQgLyAodGhpcy5wYWdlU2l6ZSQgYXMgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4pLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgbnVtYmVyIG9mIHRoZSBwYWdlIHRoYXQgbXVzdCBiZSBsb2FkZWQgb24gbmV4dCByZXF1ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEBub3RlIFRoaXMgcHJvcGVydHkgaXMgcmVhZHkgdG8gdXNlIHdpdGgge0BsaW5rIEZpbHRlcnNTZXJ2aWNlfSBzaW5jZSBpdCBoYXMge0BsaW5rIGZpbHRlcn0gYW5ub3RhdGlvbi5cclxuICAgICAqIEBzZWUge0BsaW5rIFBhZ2VkTGlzdFJlcXVlc3QucGFnZU51bWJlcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYWdlTnVtYmVyKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnBhZ2VOdW1iZXIkIGFzIEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeGVjdXRlcyBzZXZlcmFsIGNoZWNrcy4gRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgYWNjZXB0IHZhbHVlcyBiaWdnZXIgdGhhbiB7QGxpbmsgcGFnZUNvdW50fS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBwYWdlTnVtYmVyKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZVN0ciA9ICh2YWx1ZSArICcnKS5yZXBsYWNlKC9bXjAtOV0vZywgJycpO1xyXG4gICAgICAgIGxldCBwYWdlTnVtYmVyID0gcGFyc2VJbnQodmFsdWVTdHIsIDEwKSA/IHBhcnNlSW50KHZhbHVlU3RyLCAxMCkgOiAxO1xyXG4gICAgICAgIGlmIChwYWdlTnVtYmVyID4gdGhpcy5wYWdlQ291bnQpIHtcclxuICAgICAgICAgICAgcGFnZU51bWJlciA9IHRoaXMucGFnZUNvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFnZU51bWJlciA8IDEpIHtcclxuICAgICAgICAgICAgcGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICh0aGlzLnBhZ2VOdW1iZXIkIGFzIEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KS5uZXh0KHBhZ2VOdW1iZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgc2l6ZSBvZiBwYWdlIHRoYXQgbXVzdCBiZSBsb2FkZWQgb24gbmV4dCByZXF1ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEBub3RlIFRoaXMgcHJvcGVydHkgaXMgcmVhZHkgdG8gdXNlIHdpdGgge0BsaW5rIEZpbHRlcnNTZXJ2aWNlfSBzaW5jZSBpdCBoYXMge0BsaW5rIGZpbHRlcn0gYW5ub3RhdGlvbi5cclxuICAgICAqIEBzZWUge0BsaW5rIFBhZ2VkTGlzdFJlcXVlc3QucGFnZVNpemV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMucGFnZVNpemUkIGFzIEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeGVjdXRlcyBzZXZlcmFsIGNoZWNrcy4gRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgYWNjZXB0IHZhbHVlcyBiaWdnZXIgdGhhbiB7QGxpbmsgbWF4UGFnZVNpemV9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZVN0ciA9ICh2YWx1ZSArICcnKS5yZXBsYWNlKC9bXjAtOV0vZywgJycpO1xyXG4gICAgICAgIGxldCBwYWdlU2l6ZSA9IHBhcnNlSW50KHZhbHVlU3RyLCAxMCkgPyBwYXJzZUludCh2YWx1ZVN0ciwgMTApIDogdGhpcy5kZWZhdWx0UGFnZVNpemU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvdGFsQ291bnQgIT09IDApIHtcclxuICAgICAgICAgICAgaWYgKHBhZ2VTaXplID4gdGhpcy50b3RhbENvdW50KSB7XHJcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IHRoaXMudG90YWxDb3VudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZU51bWJlciAqIHBhZ2VTaXplID4gdGhpcy50b3RhbENvdW50KSB7XHJcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IE1hdGguY2VpbCh0aGlzLnRvdGFsQ291bnQgLyB0aGlzLnBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYWdlU2l6ZSA+IHRoaXMubWF4UGFnZVNpemUpIHtcclxuICAgICAgICAgICAgcGFnZVNpemUgPSB0aGlzLm1heFBhZ2VTaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFnZVNpemUgPCB0aGlzLm1pblBhZ2VTaXplIHx8IHBhZ2VTaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIHBhZ2VTaXplID0gdGhpcy5kZWZhdWx0UGFnZVNpemU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAodGhpcy5wYWdlU2l6ZSQgYXMgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4pLm5leHQocGFnZVNpemUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW5oZXJpdGRvY1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlOiBMaXN0UmVzcG9uc2U8YW55PiB8IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGFsaWduZWRSZXNwb25zZTogTGlzdFJlc3BvbnNlPGFueT47XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XHJcbiAgICAgICAgICAgIGFsaWduZWRSZXNwb25zZSA9IHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zOiByZXNwb25zZSxcclxuICAgICAgICAgICAgICAgIGxvYWRlZENvdW50OiByZXNwb25zZS5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICB0b3RhbENvdW50OiByZXNwb25zZS5sZW5ndGhcclxuICAgICAgICAgICAgfSBhcyBMaXN0UmVzcG9uc2U8YW55PjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbGlnbmVkUmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkZWRDb3VudCA9IGFsaWduZWRSZXNwb25zZS5sb2FkZWRDb3VudCB8fCAoYWxpZ25lZFJlc3BvbnNlLml0ZW1zICYmIGFsaWduZWRSZXNwb25zZS5pdGVtcy5sZW5ndGggPyBhbGlnbmVkUmVzcG9uc2UuaXRlbXMubGVuZ3RoIDogMCk7XHJcbiAgICAgICAgdGhpcy50b3RhbENvdW50ID0gYWxpZ25lZFJlc3BvbnNlLnRvdGFsQ291bnQgfHwgMDtcclxuICAgICAgICBjb25zdCBza2lwcGVkQ291bnQgPSB0aGlzLnBhZ2VTaXplICogKHRoaXMucGFnZU51bWJlciAtIDEpO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUZyb20gPSBza2lwcGVkQ291bnQgKyAxO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVRvID0gdGhpcy5kaXNwbGF5RnJvbSArIHRoaXMubG9hZGVkQ291bnQgLSAxO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBpdCdzIHBvc3NpYmxlIHRvIG1vdmUgcGFnZXIgdG8gdGhlIHByZXZpb3VzIHBhZ2UgKGUuZy4gY3VycmVudGx5IHBhZ2VyIGlzIG5vdCBvbiB0aGUgZmlyc3QgcGFnZSkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2FuTW92ZUJhY2t3YXJkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VDb3VudCAhPT0gMCAmJiB0aGlzLnBhZ2VOdW1iZXIgIT09IDE7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGl0J3MgcG9zc2libGUgdG8gbW92ZSBwYWdlciB0byB0aGUgbmV4dCBwYWdlIChlLmcuIGN1cnJlbnRseSBwYWdlciBpcyBub3Qgb24gdGhlIGxhc3QgcGFnZSkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2FuTW92ZUZvcndhcmQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZUNvdW50ICE9PSAwICYmIHRoaXMucGFnZU51bWJlciA8IHRoaXMucGFnZUNvdW50O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHtAbGluayBwYWdlTnVtYmVyfSBwcm9wZXJ0eSB0byBgMWAgaWYgaXQncyBwb3NzaWJsZS5cclxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB7QGxpbmsgcGFnZU51bWJlcn0gdmFsdWUgd2FzIGNoYW5nZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cnlNb3ZlVG9GaXJzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuTW92ZUJhY2t3YXJkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERlY3JlbWVudHMge0BsaW5rIHBhZ2VOdW1iZXJ9IGlmIGl0J3MgcG9zc2libGUuXHJcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYge0BsaW5rIHBhZ2VOdW1iZXJ9IHZhbHVlIHdhcyBjaGFuZ2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJ5TW92ZVRvUHJldmlvdXNQYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbk1vdmVCYWNrd2FyZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgLT0gMTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5jcmVtZW50cyB7QGxpbmsgcGFnZU51bWJlcn0gaWYgaXQncyBwb3NzaWJsZS5cclxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB7QGxpbmsgcGFnZU51bWJlcn0gdmFsdWUgd2FzIGNoYW5nZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cnlNb3ZlVG9OZXh0UGFnZSgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5Nb3ZlRm9yd2FyZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgKz0gMTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB7QGxpbmsgcGFnZU51bWJlcn0gcHJvcGVydHkgdG8gdmFsdWUgb2Yge0BsaW5rIHBhZ2VDb3VudH0gcHJvcGVydHkgaWYgaXQncyBwb3NzaWJsZS5cclxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB7QGxpbmsgcGFnZU51bWJlcn0gdmFsdWUgd2FzIGNoYW5nZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cnlNb3ZlVG9MYXN0UGFnZSgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5Nb3ZlRm9yd2FyZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgPSB0aGlzLnBhZ2VDb3VudDtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbmhlcml0ZG9jXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSAwO1xyXG4gICAgICAgIHRoaXMubG9hZGVkQ291bnQgPSAwO1xyXG4gICAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZGVmYXVsdFBhZ2VTaXplO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==