UNPKG

materialize-angular

Version:
428 lines 36.7 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'; export class SliderComponent { /** * @param {?} renderer */ constructor(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 {?} */ ngAfterViewInit() { this.sliderTrack.nativeElement.addEventListener(this.supportedEvents.down, this.actionDown); } /** * @return {?} */ ngAfterContentInit() { this.update(); this.options.changes.subscribe(this.update); } /** * @return {?} */ update() { setTimeout((/** * @return {?} */ () => { this.registerEventOptions(); this.renderPositions(); this.moveToValue(this.value, false); }), 0); } /** * @return {?} */ registerEventOptions() { this.options.forEach((/** * @param {?} option * @return {?} */ option => { option.onClickEmitter.subscribe(this.onOptionClick); })); } /** * @param {?} value * @return {?} */ onOptionClick(value) { this.value = value; this.onChangeEmitter.emit(this.value); this.onChange(this.value); this.moveToValue(this.value, true); } /** * @return {?} */ renderPositions() { /** @type {?} */ const pixelInterval = this.getPixelInterval(); this.removeTicks(); this.options.forEach((/** * @param {?} option * @param {?} index * @return {?} */ (option, index) => { /** @type {?} */ const leftSpace = pixelInterval * index; const { nativeElement } = option.templateRef; this.renderer.setStyle(nativeElement, 'left', `${leftSpace}px`); if (this.showTicks) { /** @type {?} */ const 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 {?} */ removeTicks() { const { nativeElement } = this.sliderTrackInterval; while (nativeElement.firstChild) { this.renderer.removeChild(nativeElement, nativeElement.firstChild); } } /** * @param {?} event * @return {?} */ actionDown(event) { if (!this.disabled) { /** @type {?} */ const 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 {?} */ actionMove(event) { /** @type {?} */ const x = this.getXCoordinate(event, this.supportedEvents.move); this.value = this.getValueFromXCoordinate(x); this.animate(x, false); } /** * @param {?} event * @return {?} */ actionUp(event) { window.removeEventListener(this.supportedEvents.up, this.actionUp); window.removeEventListener(this.supportedEvents.move, this.actionMove); this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', null); /** @type {?} */ const 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 {?} */ moveToValue(value, hasAnimation) { /** @type {?} */ const options = this.options.toArray(); /** @type {?} */ const index = options.findIndex((/** * @param {?} option * @return {?} */ option => option.value === value)); /** @type {?} */ const validatedIndex = index >= 0 ? index : 0; /** @type {?} */ const pixelInterval = this.getPixelInterval(); /** @type {?} */ const nextXCoordinate = validatedIndex * pixelInterval; this.animate(nextXCoordinate, hasAnimation); } /** * @param {?} value * @return {?} */ activeOption(value) { this.options.forEach((/** * @param {?} item * @return {?} */ item => { item.isActive = (item.value === value); })); } /** * @param {?} x * @return {?} */ getValueFromXCoordinate(x) { /** @type {?} */ const index = this.getIndexFromXCoordinate(x); /** @type {?} */ const options = this.options.toArray(); /** @type {?} */ const value = options[index].value; return value; } /** * @param {?} x * @return {?} */ getIndexFromXCoordinate(x) { /** @type {?} */ const pixelInterval = this.getPixelInterval(); if (pixelInterval) { /** @type {?} */ const index = Math.round(x / pixelInterval); if (index >= 0 && index <= this.options.length) { return index; } } return 0; } /** * @param {?} event * @param {?} eventType * @return {?} */ getXCoordinateByEventType(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 {?} */ getXCoordinate(event, eventType) { /** @type {?} */ const rect = this.sliderTrack.nativeElement.getBoundingClientRect(); /** @type {?} */ const xCoordinateEvent = this.getXCoordinateByEventType(event, eventType); /** @type {?} */ const x = xCoordinateEvent - rect.left; if (x < 0) { return 0; } if (x > this.sliderTrack.nativeElement.offsetWidth) { return this.sliderTrack.nativeElement.offsetWidth; } return x; } /** * @return {?} */ getPixelInterval() { /** @type {?} */ const maxOptionsSize = this.options.length - 1; if (maxOptionsSize > 0) { return this.sliderTrack.nativeElement.offsetWidth / maxOptionsSize; } return 0; } /** * @param {?} x * @param {?} hasAnimation * @return {?} */ animate(x, hasAnimation) { this.activeOption(this.value); /** @type {?} */ const transitionDuration = hasAnimation ? null : '0ms'; this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', transitionDuration); this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'left', `${x}px`); } /** * @return {?} */ onFocus() { if (!this.disabled) { this.isFocused = true; this.onTouched(); } } /** * @return {?} */ onBlur() { this.isFocused = false; } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * @param {?} value * @return {?} */ writeValue(value) { setTimeout((/** * @return {?} */ () => { this.value = value; this.moveToValue(value, false); }), 0); } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @param {?} value * @return {?} */ onChange(value) { } /** * @return {?} */ onTouched() { } } 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 {?} */ () => 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 = () => [ { 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 }] }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvc2xpZGVyL3NsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFZaEYsTUFBTSxPQUFPLGVBQWU7Ozs7SUFpQzFCLFlBQW9CLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFaOUIsY0FBUyxHQUFXLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQzNELGFBQVEsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFRLEdBQVksZUFBZSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDMUQsZUFBVSxHQUFZLGVBQWUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQzlELGNBQVMsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM1RCxVQUFLLEdBQXFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBRS9FLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQU12QyxJ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O0lBRUYsa0NBQWtGOztJQUVsRixtREFBOEY7O0lBQzlGLHNDQUFvRTs7SUFDcEUsZ0RBQXdGOztJQUN4Riw4Q0FBb0Y7O0lBRXBGLDBDQUFvRjs7SUFFcEYsb0NBQW9FOztJQUNwRSxtQ0FBbUU7O0lBQ25FLG1DQUFtRTs7SUFDbkUscUNBQXVFOztJQUN2RSxvQ0FBcUU7O0lBQ3JFLGdDQUFzRjs7SUFFdEYsaUNBQXlDOztJQUV6QyxvQ0FBMEI7O0lBQzFCLDBDQUE2Qzs7Ozs7SUFFakMsbUNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IFdvcmt5bGFiLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS93b3JreWxhYi9tYXRlcmlhbGl6ZS1hbmd1bGFyL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHN1cHBvcnRlZEV2ZW50cywgc3VwcG9ydFRvdWNoRXZlbnRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LXN1cHBvcnRlZC1ldmVudHMudXRpbCc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgU2xpZGVyTW9kZWwgfSBmcm9tICcuL3NsaWRlci5tb2RlbCc7XG5pbXBvcnQgeyBTbGlkZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL3NsaWRlci1vcHRpb24vc2xpZGVyLW9wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnRzTW9kZWwgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NvbW1vbi9tb2RlbHMvc3VwcG9ydGVkLWV2ZW50cy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBwcm92aWRlcnM6IFt7XG4gICAgbXVsdGk6IHRydWUsXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpZGVyQ29tcG9uZW50KVxuICB9XSxcbiAgc2VsZWN0b3I6IGAkeyBjb25maWcuY29tcG9uZW50cy5wcmVmaXggfS1zbGlkZXIgfWAsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbGlkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBTbGlkZXJNb2RlbCB7XG4gIHN0YXRpYyByZWFkb25seSB0aWNrQ2xhc3NOYW1lID0gY29uZmlnLmNvbXBvbmVudHMucHJlZml4ICsgJy1zbGlkZXItc3RlcCc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRQcm9wczogU2xpZGVyTW9kZWwgPSB7XG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIHNob3dMYWJlbHM6IHRydWUsXG4gICAgc2hvd1RpY2tzOiBmYWxzZSxcbiAgICB2YWx1ZTogbnVsbFxuICB9O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2xpZGVyT3B0aW9uQ29tcG9uZW50KSBvcHRpb25zOiBRdWVyeUxpc3Q8U2xpZGVyT3B0aW9uQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkKCdzbGlkZXJJbmRpY2F0b3JDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJJbmRpY2F0b3JDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlclRyYWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyVHJhY2s6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlclRyYWNrQmFja2dyb3VuZCcsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlclRyYWNrQmFja2dyb3VuZDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyVHJhY2tJbnRlcnZhbCcsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlclRyYWNrSW50ZXJ2YWw6IEVsZW1lbnRSZWY7XG5cbiAgQE91dHB1dCgnb25DaGFuZ2UnKSBvbkNoYW5nZUVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbD47XG5cbiAgQElucHV0KCkgY2xhc3NOYW1lOiBzdHJpbmcgPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmNsYXNzTmFtZTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmRpc2FibGVkO1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMucmVxdWlyZWQ7XG4gIEBJbnB1dCgpIHNob3dMYWJlbHM6IGJvb2xlYW4gPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLnNob3dMYWJlbHM7XG4gIEBJbnB1dCgpIHNob3dUaWNrczogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuc2hvd1RpY2tzO1xuICBASW5wdXQoKSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwgPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLnZhbHVlO1xuXG4gIHB1YmxpYyBwcmVmaXggPSBjb25maWcuY29tcG9uZW50cy5wcmVmaXg7XG5cbiAgcHVibGljIGlzRm9jdXNlZDogYm9vbGVhbjtcbiAgcHVibGljIHN1cHBvcnRlZEV2ZW50czogU3VwcG9ydGVkRXZlbnRzTW9kZWw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1cHBvcnRlZEV2ZW50cyA9IHN1cHBvcnRlZEV2ZW50cygpO1xuICAgIHRoaXMub25DaGFuZ2VFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgdGhpcy5hY3Rpb25Eb3duID0gdGhpcy5hY3Rpb25Eb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hY3Rpb25Nb3ZlID0gdGhpcy5hY3Rpb25Nb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hY3Rpb25VcCA9IHRoaXMuYWN0aW9uVXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uT3B0aW9uQ2xpY2sgPSB0aGlzLm9uT3B0aW9uQ2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZSA9IHRoaXMudXBkYXRlLmJpbmQodGhpcyk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5yZXNpemUsIHRoaXMudXBkYXRlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5kb3duLCB0aGlzLmFjdGlvbkRvd24pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMuY2hhbmdlcy5zdWJzY3JpYmUodGhpcy51cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlckV2ZW50T3B0aW9ucygpO1xuICAgICAgdGhpcy5yZW5kZXJQb3NpdGlvbnMoKTtcbiAgICAgIHRoaXMubW92ZVRvVmFsdWUodGhpcy52YWx1ZSwgZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcmVnaXN0ZXJFdmVudE9wdGlvbnMoKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgIG9wdGlvbi5vbkNsaWNrRW1pdHRlci5zdWJzY3JpYmUodGhpcy5vbk9wdGlvbkNsaWNrKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uT3B0aW9uQ2xpY2sodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2VFbWl0dGVyLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm1vdmVUb1ZhbHVlKHRoaXMudmFsdWUsIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyUG9zaXRpb25zKCkge1xuICAgIGNvbnN0IHBpeGVsSW50ZXJ2YWwgPSB0aGlzLmdldFBpeGVsSW50ZXJ2YWwoKTtcblxuICAgIHRoaXMucmVtb3ZlVGlja3MoKTtcblxuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBsZWZ0U3BhY2UgPSBwaXhlbEludGVydmFsICogaW5kZXg7XG4gICAgICBjb25zdCB7IG5hdGl2ZUVsZW1lbnQgfSA9IG9wdGlvbi50ZW1wbGF0ZVJlZjtcblxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAkeyBsZWZ0U3BhY2UgfXB4YCk7XG5cbiAgICAgIGlmICh0aGlzLnNob3dUaWNrcykge1xuICAgICAgICBjb25zdCB0aWNrID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRpY2ssICdsZWZ0JywgYCR7IGxlZnRTcGFjZSB9cHhgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aWNrLCBTbGlkZXJDb21wb25lbnQudGlja0NsYXNzTmFtZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXJUcmFja0ludGVydmFsLm5hdGl2ZUVsZW1lbnQsIHRpY2spO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlVGlja3MoKSB7XG4gICAgY29uc3QgeyBuYXRpdmVFbGVtZW50IH0gPSB0aGlzLnNsaWRlclRyYWNrSW50ZXJ2YWw7XG5cbiAgICB3aGlsZSAobmF0aXZlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKG5hdGl2ZUVsZW1lbnQsIG5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uRG93bihldmVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICBjb25zdCB4ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZShldmVudCwgdGhpcy5zdXBwb3J0ZWRFdmVudHMuZG93bik7XG5cbiAgICAgIHRoaXMuYW5pbWF0ZSh4LCB0cnVlKTtcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5zdXBwb3J0ZWRFdmVudHMudXAsIHRoaXMuYWN0aW9uVXApO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5zdXBwb3J0ZWRFdmVudHMubW92ZSwgdGhpcy5hY3Rpb25Nb3ZlKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25Nb3ZlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB4ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZShldmVudCwgdGhpcy5zdXBwb3J0ZWRFdmVudHMubW92ZSk7XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21YQ29vcmRpbmF0ZSh4KTtcbiAgICB0aGlzLmFuaW1hdGUoeCwgZmFsc2UpO1xuICB9XG5cbiAgYWN0aW9uVXAoZXZlbnQ6IGFueSkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLnVwLCB0aGlzLmFjdGlvblVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5tb3ZlLCB0aGlzLmFjdGlvbk1vdmUpO1xuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlckluZGljYXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbkR1cmF0aW9uJywgbnVsbCk7XG5cbiAgICBjb25zdCB4ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZShldmVudCwgdGhpcy5zdXBwb3J0ZWRFdmVudHMudXApO1xuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tWENvb3JkaW5hdGUoeCk7XG4gICAgdGhpcy5vbkNoYW5nZUVtaXR0ZXIuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMubW92ZVRvVmFsdWUodGhpcy52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICBtb3ZlVG9WYWx1ZSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwsIGhhc0FuaW1hdGlvbjogYm9vbGVhbikge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMudG9BcnJheSgpO1xuICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUpO1xuICAgIGNvbnN0IHZhbGlkYXRlZEluZGV4ID0gaW5kZXggPj0gMFxuICAgICAgPyBpbmRleFxuICAgICAgOiAwO1xuICAgIGNvbnN0IHBpeGVsSW50ZXJ2YWwgPSB0aGlzLmdldFBpeGVsSW50ZXJ2YWwoKTtcbiAgICBjb25zdCBuZXh0WENvb3JkaW5hdGUgPSB2YWxpZGF0ZWRJbmRleCAqIHBpeGVsSW50ZXJ2YWw7XG5cbiAgICB0aGlzLmFuaW1hdGUobmV4dFhDb29yZGluYXRlLCBoYXNBbmltYXRpb24pO1xuICB9XG5cbiAgYWN0aXZlT3B0aW9uKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCkge1xuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaXRlbS5pc0FjdGl2ZSA9IChpdGVtLnZhbHVlID09PSB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRWYWx1ZUZyb21YQ29vcmRpbmF0ZSh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXhGcm9tWENvb3JkaW5hdGUoeCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy50b0FycmF5KCk7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW2luZGV4XS52YWx1ZTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGdldEluZGV4RnJvbVhDb29yZGluYXRlKHg6IG51bWJlcikge1xuICAgIGNvbnN0IHBpeGVsSW50ZXJ2YWwgPSB0aGlzLmdldFBpeGVsSW50ZXJ2YWwoKTtcblxuICAgIGlmIChwaXhlbEludGVydmFsKSB7XG4gICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoeCAvIHBpeGVsSW50ZXJ2YWwpO1xuXG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSB0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGdldFhDb29yZGluYXRlQnlFdmVudFR5cGUoZXZlbnQ6IGFueSwgZXZlbnRUeXBlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChzdXBwb3J0VG91Y2hFdmVudHMoKSkge1xuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gdGhpcy5zdXBwb3J0ZWRFdmVudHMudXApIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFg7XG4gIH1cblxuICBnZXRYQ29vcmRpbmF0ZShldmVudDogYW55LCBldmVudFR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeENvb3JkaW5hdGVFdmVudCA9IHRoaXMuZ2V0WENvb3JkaW5hdGVCeUV2ZW50VHlwZShldmVudCwgZXZlbnRUeXBlKTtcbiAgICBjb25zdCB4ID0geENvb3JkaW5hdGVFdmVudCAtIHJlY3QubGVmdDtcblxuICAgIGlmICh4IDwgMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKHggPiB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHg7XG4gIH1cblxuICBnZXRQaXhlbEludGVydmFsKCkge1xuICAgIGNvbnN0IG1heE9wdGlvbnNTaXplID0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAobWF4T3B0aW9uc1NpemUgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zbGlkZXJUcmFjay5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC8gbWF4T3B0aW9uc1NpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBhbmltYXRlKHg6IG51bWJlciwgaGFzQW5pbWF0aW9uOiBib29sZWFuKSB7XG4gICAgdGhpcy5hY3RpdmVPcHRpb24odGhpcy52YWx1ZSk7XG5cbiAgICBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb24gPSBoYXNBbmltYXRpb25cbiAgICAgID8gbnVsbFxuICAgICAgOiAnMG1zJztcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zbGlkZXJJbmRpY2F0b3JDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb25EdXJhdGlvbicsIHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlckluZGljYXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAkeyB4IH1weGApO1xuICB9XG5cbiAgb25Gb2N1cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgdGhpcy5tb3ZlVG9WYWx1ZSh2YWx1ZSwgZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIG9uQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCk6IHZvaWQge31cblxuICBvblRvdWNoZWQoKTogdm9pZCB7fVxufVxuIl19