UNPKG

materialize-angular

Version:
529 lines 39.8 kB
/** * @fileoverview added by tsickle * Generated from: app/completed-components/slider/slider.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Workylab. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE */ import { Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Input, Output, QueryList, Renderer2, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { supportedEvents, supportTouchEvents } from '../../utils/get-supported-events.util'; import { config } from '../../config'; import { SliderOptionComponent } from './slider-option/slider-option.component'; var SliderComponent = /** @class */ (function () { function SliderComponent(renderer) { this.renderer = renderer; this.className = SliderComponent.defaultProps.className; this.disabled = SliderComponent.defaultProps.disabled; this.required = SliderComponent.defaultProps.required; this.showLabels = SliderComponent.defaultProps.showLabels; this.showTicks = SliderComponent.defaultProps.showTicks; this.value = SliderComponent.defaultProps.value; this.prefix = config.components.prefix; this.isFocused = false; this.supportedEvents = supportedEvents(); this.onChangeEmitter = new EventEmitter(); this.actionDown = this.actionDown.bind(this); this.actionMove = this.actionMove.bind(this); this.actionUp = this.actionUp.bind(this); this.onOptionClick = this.onOptionClick.bind(this); this.update = this.update.bind(this); window.addEventListener(this.supportedEvents.resize, this.update); } /** * @return {?} */ SliderComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.sliderTrack.nativeElement.addEventListener(this.supportedEvents.down, this.actionDown); }; /** * @return {?} */ SliderComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { this.update(); this.options.changes.subscribe(this.update); }; /** * @return {?} */ SliderComponent.prototype.update = /** * @return {?} */ function () { var _this = this; setTimeout((/** * @return {?} */ function () { _this.registerEventOptions(); _this.renderPositions(); _this.moveToValue(_this.value, false); }), 0); }; /** * @return {?} */ SliderComponent.prototype.registerEventOptions = /** * @return {?} */ function () { var _this = this; this.options.forEach((/** * @param {?} option * @return {?} */ function (option) { option.onClickEmitter.subscribe(_this.onOptionClick); })); }; /** * @param {?} value * @return {?} */ SliderComponent.prototype.onOptionClick = /** * @param {?} value * @return {?} */ function (value) { this.value = value; this.onChangeEmitter.emit(this.value); this.onChange(this.value); this.moveToValue(this.value, true); }; /** * @return {?} */ SliderComponent.prototype.renderPositions = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var pixelInterval = this.getPixelInterval(); this.removeTicks(); this.options.forEach((/** * @param {?} option * @param {?} index * @return {?} */ function (option, index) { /** @type {?} */ var leftSpace = pixelInterval * index; var nativeElement = option.templateRef.nativeElement; _this.renderer.setStyle(nativeElement, 'left', leftSpace + "px"); if (_this.showTicks) { /** @type {?} */ var tick = _this.renderer.createElement('div'); _this.renderer.setStyle(tick, 'left', leftSpace + "px"); _this.renderer.addClass(tick, SliderComponent.tickClassName); _this.renderer.appendChild(_this.sliderTrackInterval.nativeElement, tick); } })); }; /** * @return {?} */ SliderComponent.prototype.removeTicks = /** * @return {?} */ function () { var nativeElement = this.sliderTrackInterval.nativeElement; while (nativeElement.firstChild) { this.renderer.removeChild(nativeElement, nativeElement.firstChild); } }; /** * @param {?} event * @return {?} */ SliderComponent.prototype.actionDown = /** * @param {?} event * @return {?} */ function (event) { if (!this.disabled) { /** @type {?} */ var x = this.getXCoordinate(event, this.supportedEvents.down); this.animate(x, true); window.addEventListener(this.supportedEvents.up, this.actionUp); window.addEventListener(this.supportedEvents.move, this.actionMove); } }; /** * @param {?} event * @return {?} */ SliderComponent.prototype.actionMove = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var x = this.getXCoordinate(event, this.supportedEvents.move); this.value = this.getValueFromXCoordinate(x); this.animate(x, false); }; /** * @param {?} event * @return {?} */ SliderComponent.prototype.actionUp = /** * @param {?} event * @return {?} */ function (event) { window.removeEventListener(this.supportedEvents.up, this.actionUp); window.removeEventListener(this.supportedEvents.move, this.actionMove); this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', null); /** @type {?} */ var x = this.getXCoordinate(event, this.supportedEvents.up); this.value = this.getValueFromXCoordinate(x); this.onChangeEmitter.emit(this.value); this.onChange(this.value); this.moveToValue(this.value, true); }; /** * @param {?} value * @param {?} hasAnimation * @return {?} */ SliderComponent.prototype.moveToValue = /** * @param {?} value * @param {?} hasAnimation * @return {?} */ function (value, hasAnimation) { /** @type {?} */ var options = this.options.toArray(); /** @type {?} */ var index = options.findIndex((/** * @param {?} option * @return {?} */ function (option) { return option.value === value; })); /** @type {?} */ var validatedIndex = index >= 0 ? index : 0; /** @type {?} */ var pixelInterval = this.getPixelInterval(); /** @type {?} */ var nextXCoordinate = validatedIndex * pixelInterval; this.animate(nextXCoordinate, hasAnimation); }; /** * @param {?} value * @return {?} */ SliderComponent.prototype.activeOption = /** * @param {?} value * @return {?} */ function (value) { this.options.forEach((/** * @param {?} item * @return {?} */ function (item) { item.isActive = (item.value === value); })); }; /** * @param {?} x * @return {?} */ SliderComponent.prototype.getValueFromXCoordinate = /** * @param {?} x * @return {?} */ function (x) { /** @type {?} */ var index = this.getIndexFromXCoordinate(x); /** @type {?} */ var options = this.options.toArray(); /** @type {?} */ var value = options[index].value; return value; }; /** * @param {?} x * @return {?} */ SliderComponent.prototype.getIndexFromXCoordinate = /** * @param {?} x * @return {?} */ function (x) { /** @type {?} */ var pixelInterval = this.getPixelInterval(); if (pixelInterval) { /** @type {?} */ var index = Math.round(x / pixelInterval); if (index >= 0 && index <= this.options.length) { return index; } } return 0; }; /** * @param {?} event * @param {?} eventType * @return {?} */ SliderComponent.prototype.getXCoordinateByEventType = /** * @param {?} event * @param {?} eventType * @return {?} */ function (event, eventType) { if (supportTouchEvents()) { if (eventType === this.supportedEvents.up) { return event.changedTouches[0].clientX; } return event.touches[0].clientX; } return event.clientX; }; /** * @param {?} event * @param {?} eventType * @return {?} */ SliderComponent.prototype.getXCoordinate = /** * @param {?} event * @param {?} eventType * @return {?} */ function (event, eventType) { /** @type {?} */ var rect = this.sliderTrack.nativeElement.getBoundingClientRect(); /** @type {?} */ var xCoordinateEvent = this.getXCoordinateByEventType(event, eventType); /** @type {?} */ var x = xCoordinateEvent - rect.left; if (x < 0) { return 0; } if (x > this.sliderTrack.nativeElement.offsetWidth) { return this.sliderTrack.nativeElement.offsetWidth; } return x; }; /** * @return {?} */ SliderComponent.prototype.getPixelInterval = /** * @return {?} */ function () { /** @type {?} */ var maxOptionsSize = this.options.length - 1; if (maxOptionsSize > 0) { return this.sliderTrack.nativeElement.offsetWidth / maxOptionsSize; } return 0; }; /** * @param {?} x * @param {?} hasAnimation * @return {?} */ SliderComponent.prototype.animate = /** * @param {?} x * @param {?} hasAnimation * @return {?} */ function (x, hasAnimation) { this.activeOption(this.value); /** @type {?} */ var transitionDuration = hasAnimation ? null : '0ms'; this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', transitionDuration); this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'left', x + "px"); }; /** * @return {?} */ SliderComponent.prototype.onFocus = /** * @return {?} */ function () { if (!this.disabled) { this.isFocused = true; this.onTouched(); } }; /** * @return {?} */ SliderComponent.prototype.onBlur = /** * @return {?} */ function () { this.isFocused = false; }; /** * @param {?} isDisabled * @return {?} */ SliderComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { this.disabled = isDisabled; }; /** * @param {?} value * @return {?} */ SliderComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { var _this = this; setTimeout((/** * @return {?} */ function () { _this.value = value; _this.moveToValue(value, false); }), 0); }; /** * @param {?} fn * @return {?} */ SliderComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ SliderComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * @param {?} value * @return {?} */ SliderComponent.prototype.onChange = /** * @param {?} value * @return {?} */ function (value) { }; /** * @return {?} */ SliderComponent.prototype.onTouched = /** * @return {?} */ function () { }; SliderComponent.tickClassName = config.components.prefix + '-slider-step'; SliderComponent.defaultProps = { className: '', disabled: false, required: false, showLabels: true, showTicks: false, value: null }; SliderComponent.decorators = [ { type: Component, args: [{ providers: [{ multi: true, provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return SliderComponent; })) }], selector: config.components.prefix + "-slider }", template: "<div [ngClass]=\"[prefix + '-slider', className]\" [class.focused]=\"isFocused\" [class.disabled]=\"disabled\">\n\n <div [ngClass]=\"prefix + '-slider-track-container'\" #sliderTrack [tabindex]=\"disabled ? '-1' : '0'\" (focus)=\"onFocus()\" (blur)=\"onBlur()\">\n <div #sliderTrackInterval></div>\n\n <div [ngClass]=\"prefix + '-slider-track'\" #sliderTrackBackground></div>\n\n <div [ngClass]=\"prefix + '-slider-indicator-container'\" #sliderIndicatorContainer>\n <ng-content select=\"materialize-slider-indicator\"></ng-content>\n </div>\n </div>\n\n <div [ngClass]=\"prefix + '-slider-labels-container'\" *ngIf=\"showLabels\">\n <ng-content select=\"materialize-slider-option\"></ng-content>\n </div>\n</div>\n" }] } ]; /** @nocollapse */ SliderComponent.ctorParameters = function () { return [ { type: Renderer2 } ]; }; SliderComponent.propDecorators = { options: [{ type: ContentChildren, args: [SliderOptionComponent,] }], sliderIndicatorContainer: [{ type: ViewChild, args: ['sliderIndicatorContainer', { static: true },] }], sliderTrack: [{ type: ViewChild, args: ['sliderTrack', { static: true },] }], sliderTrackBackground: [{ type: ViewChild, args: ['sliderTrackBackground', { static: true },] }], sliderTrackInterval: [{ type: ViewChild, args: ['sliderTrackInterval', { static: true },] }], onChangeEmitter: [{ type: Output, args: ['onChange',] }], className: [{ type: Input }], disabled: [{ type: Input }], required: [{ type: Input }], showLabels: [{ type: Input }], showTicks: [{ type: Input }], value: [{ type: Input }] }; return SliderComponent; }()); export { SliderComponent }; if (false) { /** @type {?} */ SliderComponent.tickClassName; /** @type {?} */ SliderComponent.defaultProps; /** @type {?} */ SliderComponent.prototype.options; /** @type {?} */ SliderComponent.prototype.sliderIndicatorContainer; /** @type {?} */ SliderComponent.prototype.sliderTrack; /** @type {?} */ SliderComponent.prototype.sliderTrackBackground; /** @type {?} */ SliderComponent.prototype.sliderTrackInterval; /** @type {?} */ SliderComponent.prototype.onChangeEmitter; /** @type {?} */ SliderComponent.prototype.className; /** @type {?} */ SliderComponent.prototype.disabled; /** @type {?} */ SliderComponent.prototype.required; /** @type {?} */ SliderComponent.prototype.showLabels; /** @type {?} */ SliderComponent.prototype.showTicks; /** @type {?} */ SliderComponent.prototype.value; /** @type {?} */ SliderComponent.prototype.prefix; /** @type {?} */ SliderComponent.prototype.isFocused; /** @type {?} */ SliderComponent.prototype.supportedEvents; /** * @type {?} * @private */ SliderComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvc2xpZGVyL3NsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFHaEY7SUEwQ0UseUJBQW9CLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFaOUIsY0FBUyxHQUFXLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQzNELGFBQVEsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFRLEdBQVksZUFBZSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDMUQsZUFBVSxHQUFZLGVBQWUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQzlELGNBQVMsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM1RCxVQUFLLEdBQXFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBRS9FLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQU12QyxJQUFJLENBQUMsU0FBUyxHQUFH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Q25ELFNBQVMsU0FBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7a0NBRWpELE1BQU0sU0FBQyxVQUFVOzRCQUVqQixLQUFLOzJCQUNMLEtBQUs7MkJBQ0wsS0FBSzs2QkFDTCxLQUFLOzRCQUNMLEtBQUs7d0JBQ0wsS0FBSzs7SUE2T1Isc0JBQUM7Q0FBQSxBQWhSRCxJQWdSQztTQXZRWSxlQUFlOzs7SUFDMUIsOEJBQTBFOztJQUUxRSw2QkFPRTs7SUFFRixrQ0FBa0Y7O0lBRWxGLG1EQUE4Rjs7SUFDOUYsc0NBQW9FOztJQUNwRSxnREFBd0Y7O0lBQ3hGLDhDQUFvRjs7SUFFcEYsMENBQW9GOztJQUVwRixvQ0FBb0U7O0lBQ3BFLG1DQUFtRTs7SUFDbkUsbUNBQW1FOztJQUNuRSxxQ0FBdUU7O0lBQ3ZFLG9DQUFxRTs7SUFDckUsZ0NBQXNGOztJQUV0RixpQ0FBeUM7O0lBRXpDLG9DQUEwQjs7SUFDMUIsMENBQTZDOzs7OztJQUVqQyxtQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgc3VwcG9ydGVkRXZlbnRzLCBzdXBwb3J0VG91Y2hFdmVudHMgfSBmcm9tICcuLi8uLi91dGlscy9nZXQtc3VwcG9ydGVkLWV2ZW50cy51dGlsJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBTbGlkZXJNb2RlbCB9IGZyb20gJy4vc2xpZGVyLm1vZGVsJztcbmltcG9ydCB7IFNsaWRlck9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2xpZGVyLW9wdGlvbi9zbGlkZXItb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRFdmVudHNNb2RlbCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY29tbW9uL21vZGVscy9zdXBwb3J0ZWQtZXZlbnRzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHByb3ZpZGVyczogW3tcbiAgICBtdWx0aTogdHJ1ZSxcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpXG4gIH1dLFxuICBzZWxlY3RvcjogYCR7IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeCB9LXNsaWRlciB9YCxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFNsaWRlck1vZGVsIHtcbiAgc3RhdGljIHJlYWRvbmx5IHRpY2tDbGFzc05hbWUgPSBjb25maWcuY29tcG9uZW50cy5wcmVmaXggKyAnLXNsaWRlci1zdGVwJztcblxuICBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFByb3BzOiBTbGlkZXJNb2RlbCA9IHtcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgc2hvd0xhYmVsczogdHJ1ZSxcbiAgICBzaG93VGlja3M6IGZhbHNlLFxuICAgIHZhbHVlOiBudWxsXG4gIH07XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTbGlkZXJPcHRpb25Db21wb25lbnQpIG9wdGlvbnM6IFF1ZXJ5TGlzdDxTbGlkZXJPcHRpb25Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3NsaWRlckluZGljYXRvckNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlckluZGljYXRvckNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyVHJhY2snLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJUcmFjazogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyVHJhY2tCYWNrZ3JvdW5kJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyVHJhY2tCYWNrZ3JvdW5kOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzbGlkZXJUcmFja0ludGVydmFsJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyVHJhY2tJbnRlcnZhbDogRWxlbWVudFJlZjtcblxuICBAT3V0cHV0KCdvbkNoYW5nZScpIG9uQ2hhbmdlRW1pdHRlcjogRXZlbnRFbWl0dGVyPG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsPjtcblxuICBASW5wdXQoKSBjbGFzc05hbWU6IHN0cmluZyA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuY2xhc3NOYW1lO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuZGlzYWJsZWQ7XG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gU2xpZGVyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5yZXF1aXJlZDtcbiAgQElucHV0KCkgc2hvd0xhYmVsczogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuc2hvd0xhYmVscztcbiAgQElucHV0KCkgc2hvd1RpY2tzOiBib29sZWFuID0gU2xpZGVyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5zaG93VGlja3M7XG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMudmFsdWU7XG5cbiAgcHVibGljIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeDtcblxuICBwdWJsaWMgaXNGb2N1c2VkOiBib29sZWFuO1xuICBwdWJsaWMgc3VwcG9ydGVkRXZlbnRzOiBTdXBwb3J0ZWRFdmVudHNNb2RlbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3VwcG9ydGVkRXZlbnRzID0gc3VwcG9ydGVkRXZlbnRzKCk7XG4gICAgdGhpcy5vbkNoYW5nZUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICB0aGlzLmFjdGlvbkRvd24gPSB0aGlzLmFjdGlvbkRvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGlvbk1vdmUgPSB0aGlzLmFjdGlvbk1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGlvblVwID0gdGhpcy5hY3Rpb25VcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25PcHRpb25DbGljayA9IHRoaXMub25PcHRpb25DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMudXBkYXRlID0gdGhpcy51cGRhdGUuYmluZCh0aGlzKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLnJlc2l6ZSwgdGhpcy51cGRhdGUpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLmRvd24sIHRoaXMuYWN0aW9uRG93bik7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIHRoaXMub3B0aW9ucy5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLnVwZGF0ZSk7XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnRPcHRpb25zKCk7XG4gICAgICB0aGlzLnJlbmRlclBvc2l0aW9ucygpO1xuICAgICAgdGhpcy5tb3ZlVG9WYWx1ZSh0aGlzLnZhbHVlLCBmYWxzZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZWdpc3RlckV2ZW50T3B0aW9ucygpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgb3B0aW9uLm9uQ2xpY2tFbWl0dGVyLnN1YnNjcmliZSh0aGlzLm9uT3B0aW9uQ2xpY2spO1xuICAgIH0pO1xuICB9XG5cbiAgb25PcHRpb25DbGljayh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZUVtaXR0ZXIuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMubW92ZVRvVmFsdWUodGhpcy52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXJQb3NpdGlvbnMoKSB7XG4gICAgY29uc3QgcGl4ZWxJbnRlcnZhbCA9IHRoaXMuZ2V0UGl4ZWxJbnRlcnZhbCgpO1xuXG4gICAgdGhpcy5yZW1vdmVUaWNrcygpO1xuXG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2goKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGxlZnRTcGFjZSA9IHBpeGVsSW50ZXJ2YWwgKiBpbmRleDtcbiAgICAgIGNvbnN0IHsgbmF0aXZlRWxlbWVudCB9ID0gb3B0aW9uLnRlbXBsYXRlUmVmO1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7IGxlZnRTcGFjZSB9cHhgKTtcblxuICAgICAgaWYgKHRoaXMuc2hvd1RpY2tzKSB7XG4gICAgICAgIGNvbnN0IHRpY2sgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGljaywgJ2xlZnQnLCBgJHsgbGVmdFNwYWNlIH1weGApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRpY2ssIFNsaWRlckNvbXBvbmVudC50aWNrQ2xhc3NOYW1lKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnNsaWRlclRyYWNrSW50ZXJ2YWwubmF0aXZlRWxlbWVudCwgdGljayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVUaWNrcygpIHtcbiAgICBjb25zdCB7IG5hdGl2ZUVsZW1lbnQgfSA9IHRoaXMuc2xpZGVyVHJhY2tJbnRlcnZhbDtcblxuICAgIHdoaWxlIChuYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQobmF0aXZlRWxlbWVudCwgbmF0aXZlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25Eb3duKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGNvbnN0IHggPSB0aGlzLmdldFhDb29yZGluYXRlKGV2ZW50LCB0aGlzLnN1cHBvcnRlZEV2ZW50cy5kb3duKTtcblxuICAgICAgdGhpcy5hbmltYXRlKHgsIHRydWUpO1xuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy51cCwgdGhpcy5hY3Rpb25VcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5tb3ZlLCB0aGlzLmFjdGlvbk1vdmUpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvbk1vdmUoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHggPSB0aGlzLmdldFhDb29yZGluYXRlKGV2ZW50LCB0aGlzLnN1cHBvcnRlZEV2ZW50cy5tb3ZlKTtcblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbVhDb29yZGluYXRlKHgpO1xuICAgIHRoaXMuYW5pbWF0ZSh4LCBmYWxzZSk7XG4gIH1cblxuICBhY3Rpb25VcChldmVudDogYW55KSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5zdXBwb3J0ZWRFdmVudHMudXAsIHRoaXMuYWN0aW9uVXApO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLm1vdmUsIHRoaXMuYWN0aW9uTW92ZSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2xpZGVySW5kaWNhdG9yQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uRHVyYXRpb24nLCBudWxsKTtcblxuICAgIGNvbnN0IHggPSB0aGlzLmdldFhDb29yZGluYXRlKGV2ZW50LCB0aGlzLnN1cHBvcnRlZEV2ZW50cy51cCk7XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21YQ29vcmRpbmF0ZSh4KTtcbiAgICB0aGlzLm9uQ2hhbmdlRW1pdHRlci5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5tb3ZlVG9WYWx1ZSh0aGlzLnZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIG1vdmVUb1ZhbHVlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCwgaGFzQW5pbWF0aW9uOiBib29sZWFuKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy50b0FycmF5KCk7XG4gICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZSk7XG4gICAgY29uc3QgdmFsaWRhdGVkSW5kZXggPSBpbmRleCA+PSAwXG4gICAgICA/IGluZGV4XG4gICAgICA6IDA7XG4gICAgY29uc3QgcGl4ZWxJbnRlcnZhbCA9IHRoaXMuZ2V0UGl4ZWxJbnRlcnZhbCgpO1xuICAgIGNvbnN0IG5leHRYQ29vcmRpbmF0ZSA9IHZhbGlkYXRlZEluZGV4ICogcGl4ZWxJbnRlcnZhbDtcblxuICAgIHRoaXMuYW5pbWF0ZShuZXh0WENvb3JkaW5hdGUsIGhhc0FuaW1hdGlvbik7XG4gIH1cblxuICBhY3RpdmVPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLmlzQWN0aXZlID0gKGl0ZW0udmFsdWUgPT09IHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFZhbHVlRnJvbVhDb29yZGluYXRlKHg6IG51bWJlcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJbmRleEZyb21YQ29vcmRpbmF0ZSh4KTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnRvQXJyYXkoKTtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbaW5kZXhdLnZhbHVlO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZ2V0SW5kZXhGcm9tWENvb3JkaW5hdGUoeDogbnVtYmVyKSB7XG4gICAgY29uc3QgcGl4ZWxJbnRlcnZhbCA9IHRoaXMuZ2V0UGl4ZWxJbnRlcnZhbCgpO1xuXG4gICAgaWYgKHBpeGVsSW50ZXJ2YWwpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCh4IC8gcGl4ZWxJbnRlcnZhbCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDw9IHRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZ2V0WENvb3JkaW5hdGVCeUV2ZW50VHlwZShldmVudDogYW55LCBldmVudFR5cGU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHN1cHBvcnRUb3VjaEV2ZW50cygpKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSB0aGlzLnN1cHBvcnRlZEV2ZW50cy51cCkge1xuICAgICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQuY2xpZW50WDtcbiAgfVxuXG4gIGdldFhDb29yZGluYXRlKGV2ZW50OiBhbnksIGV2ZW50VHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4Q29vcmRpbmF0ZUV2ZW50ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZUJ5RXZlbnRUeXBlKGV2ZW50LCBldmVudFR5cGUpO1xuICAgIGNvbnN0IHggPSB4Q29vcmRpbmF0ZUV2ZW50IC0gcmVjdC5sZWZ0O1xuXG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoeCA+IHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4geDtcbiAgfVxuXG4gIGdldFBpeGVsSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgbWF4T3B0aW9uc1NpemUgPSB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMTtcblxuICAgIGlmIChtYXhPcHRpb25zU2l6ZSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLyBtYXhPcHRpb25zU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGFuaW1hdGUoeDogbnVtYmVyLCBoYXNBbmltYXRpb246IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFjdGl2ZU9wdGlvbih0aGlzLnZhbHVlKTtcblxuICAgIGNvbnN0IHRyYW5zaXRpb25EdXJhdGlvbiA9IGhhc0FuaW1hdGlvblxuICAgICAgPyBudWxsXG4gICAgICA6ICcwbXMnO1xuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlckluZGljYXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbkR1cmF0aW9uJywgdHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2xpZGVySW5kaWNhdG9yQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7IHggfXB4YCk7XG4gIH1cblxuICBvbkZvY3VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICB0aGlzLm1vdmVUb1ZhbHVlKHZhbHVlLCBmYWxzZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgb25DaGFuZ2UodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKTogdm9pZCB7fVxuXG4gIG9uVG91Y2hlZCgpOiB2b2lkIHt9XG59XG4iXX0=