@blox/material
Version:
Material Components for Angular
157 lines • 24.6 kB
JavaScript
import { ContentChildren, Directive, ElementRef, HostBinding, Renderer2, Inject } from '@angular/core';
import { MDCTabScrollerFoundation, util } from '@material/tab-scroller';
import { events, ponyfill } from '@material/dom';
import { MdcEventRegistry } from '../../utils/mdc.event.registry';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { DOCUMENT } from '@angular/common';
import { AbstractMdcTabDirective } from './mdc.tab.directive';
/**
* Directive for a the scroll content of an `mdcTabScrollerArea`. This directive must wrap the
* `mdcTab` directives for each of the tabs.
*/
export class MdcTabScrollerContentDirective {
constructor(_el) {
this._el = _el;
/** @internal */
this._cls = true;
}
}
MdcTabScrollerContentDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcTabScrollerContent]'
},] }
];
MdcTabScrollerContentDirective.ctorParameters = () => [
{ type: ElementRef }
];
MdcTabScrollerContentDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-tab-scroller__scroll-content',] }]
};
/**
* Directive for a the scroll area of an `mdcTabScroller`. This directive should have exactly one
* `mdcTabScrollerContent` child directive.
*/
export class MdcTabScrollerAreaDirective {
constructor(_el) {
this._el = _el;
/** @internal */
this._cls = true;
}
}
MdcTabScrollerAreaDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcTabScrollerArea]'
},] }
];
MdcTabScrollerAreaDirective.ctorParameters = () => [
{ type: ElementRef }
];
MdcTabScrollerAreaDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-tab-scroller__scroll-area',] }]
};
/**
* Directive for a scrollable tab bar. This directive should have exactly one
* `mdcTabScrollerArea` child directive.
*/
export class MdcTabScrollerDirective {
constructor(_rndr, _el, registry, doc) {
this._rndr = _rndr;
this._el = _el;
this.registry = registry;
/** @internal */
this._cls = true;
this.onDestroy$ = new Subject();
this._adapter = {
eventTargetMatchesSelector: (target, selector) => ponyfill.matches(target, selector),
addClass: (name) => this._rndr.addClass(this._el.nativeElement, name),
removeClass: (name) => this._rndr.removeClass(this._el.nativeElement, name),
addScrollAreaClass: (name) => this._rndr.addClass(this._area._el.nativeElement, name),
setScrollAreaStyleProperty: (name, value) => this._rndr.setStyle(this._area._el.nativeElement, name, value),
setScrollContentStyleProperty: (name, value) => this._rndr.setStyle(this._content._el.nativeElement, name, value),
getScrollContentStyleValue: (name) => getComputedStyle(this._content._el.nativeElement).getPropertyValue(name),
setScrollAreaScrollLeft: (scrollX) => this._area._el.nativeElement.scrollLeft = scrollX,
getScrollAreaScrollLeft: () => this._area._el.nativeElement.scrollLeft,
getScrollContentOffsetWidth: () => this._content._el.nativeElement.offsetWidth,
getScrollAreaOffsetWidth: () => this._area._el.nativeElement.offsetWidth,
computeScrollAreaClientRect: () => this._area._el.nativeElement.getBoundingClientRect(),
computeScrollContentClientRect: () => this._content._el.nativeElement.getBoundingClientRect(),
computeHorizontalScrollbarHeight: () => util.computeHorizontalScrollbarHeight(this.document)
};
/** @internal */
this._foundation = null;
this._handleInteraction = () => this._foundation.handleInteraction();
this._handleTransitionEnd = (evt) => this._foundation.handleTransitionEnd(evt);
this.document = doc; // work around ngc issue https://github.com/angular/angular/issues/20351
}
ngAfterContentInit() {
let initializer = () => {
this.destroyFoundation();
if (this._content && this._area)
this.initFoundation();
};
initializer();
this._contents.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer);
this._areas.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer);
}
ngOnDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
this.destroyFoundation();
}
initFoundation() {
this._foundation = new MDCTabScrollerFoundation(this._adapter);
this._foundation.init();
// manual registration of event listeners, because we need applyPassive, which is not (yet)
// supported by angular bindings:
this.registry.listen(this._rndr, 'wheel', this._handleInteraction, this._area._el, events.applyPassive());
this.registry.listen(this._rndr, 'touchstart', this._handleInteraction, this._area._el, events.applyPassive());
this.registry.listen(this._rndr, 'pointerdown', this._handleInteraction, this._area._el, events.applyPassive());
this.registry.listen(this._rndr, 'mousedown', this._handleInteraction, this._area._el, events.applyPassive());
this.registry.listen(this._rndr, 'keydown', this._handleInteraction, this._area._el, events.applyPassive());
this.registry.listen(this._rndr, 'transitionend', this._handleTransitionEnd, this._content._el);
}
destroyFoundation() {
let destroy = this._foundation != null;
if (destroy) {
this.registry.unlisten('wheel', this._handleInteraction);
this.registry.unlisten('touchstart', this._handleInteraction);
this.registry.unlisten('pointerdown', this._handleInteraction);
this.registry.unlisten('mousedown', this._handleInteraction);
this.registry.unlisten('keydown', this._handleInteraction);
this.registry.unlisten('transitionend', this._handleTransitionEnd);
this._foundation.destroy();
}
this._foundation = null;
return destroy;
}
/** @internal */
_getScrollContentWidth() {
return this._adapter.getScrollContentOffsetWidth();
}
get _area() {
return this._areas && this._areas.length > 0 ? this._areas.first : null;
}
get _content() {
return this._contents && this._contents.length > 0 ? this._contents.first : null;
}
}
MdcTabScrollerDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcTabScroller]'
},] }
];
MdcTabScrollerDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef },
{ type: MdcEventRegistry },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
MdcTabScrollerDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-tab-scroller',] }],
_areas: [{ type: ContentChildren, args: [MdcTabScrollerAreaDirective,] }],
_contents: [{ type: ContentChildren, args: [MdcTabScrollerContentDirective, { descendants: true },] }],
_tabs: [{ type: ContentChildren, args: [AbstractMdcTabDirective, { descendants: true },] }]
};
export const TAB_SCROLLER_DIRECTIVES = [MdcTabScrollerContentDirective, MdcTabScrollerAreaDirective, MdcTabScrollerDirective];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnRhYi5zY3JvbGxlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90YWIvbWRjLnRhYi5zY3JvbGxlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixlQUFlLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDN0QsV0FBVyxFQUFhLFNBQVMsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUF5QixJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQ7OztHQUdHO0FBSUgsTUFBTSxPQUFPLDhCQUE4QjtJQUl2QyxZQUFtQixHQUFlO1FBQWYsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUhsQyxnQkFBZ0I7UUFDZ0QsU0FBSSxHQUFHLElBQUksQ0FBQztJQUV2QyxDQUFDOzs7WUFQekMsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSx5QkFBeUI7YUFDdEM7OztZQWhCc0QsVUFBVTs7O21CQW1CNUQsV0FBVyxTQUFDLHdDQUF3Qzs7QUFLekQ7OztHQUdHO0FBSUgsTUFBTSxPQUFPLDJCQUEyQjtJQUlwQyxZQUFtQixHQUFlO1FBQWYsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUhsQyxnQkFBZ0I7UUFDNkMsU0FBSSxH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LENBQUM7SUFDNUUsQ0FBQztJQUVELElBQVksUUFBUTtRQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JGLENBQUM7OztZQWhHSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGtCQUFrQjthQUMvQjs7O1lBM0MyQixTQUFTO1lBRGtCLFVBQVU7WUFJeEQsZ0JBQWdCOzRDQXVFK0UsTUFBTSxTQUFDLFFBQVE7OzttQkE1QmxILFdBQVcsU0FBQyx3QkFBd0I7cUJBR3BDLGVBQWUsU0FBQywyQkFBMkI7d0JBRTNDLGVBQWUsU0FBQyw4QkFBOEIsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7b0JBRW5FLGVBQWUsU0FBQyx1QkFBdUIsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7O0FBdUZqRSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLDhCQUE4QixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb250ZW50Q2hpbGRyZW4sIERpcmVjdGl2ZSwgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZywgT25EZXN0cm95LCBSZW5kZXJlcjIsIFF1ZXJ5TGlzdCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNRENUYWJTY3JvbGxlckZvdW5kYXRpb24sIE1EQ1RhYlNjcm9sbGVyQWRhcHRlciwgdXRpbCB9IGZyb20gJ0BtYXRlcmlhbC90YWItc2Nyb2xsZXInO1xuaW1wb3J0IHsgZXZlbnRzLCBwb255ZmlsbCB9IGZyb20gJ0BtYXRlcmlhbC9kb20nO1xuaW1wb3J0IHsgTWRjRXZlbnRSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL21kYy5ldmVudC5yZWdpc3RyeSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZSB9IGZyb20gJy4vbWRjLnRhYi5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgYSB0aGUgc2Nyb2xsIGNvbnRlbnQgb2YgYW4gYG1kY1RhYlNjcm9sbGVyQXJlYWAuIFRoaXMgZGlyZWN0aXZlIG11c3Qgd3JhcCB0aGVcbiAqIGBtZGNUYWJgIGRpcmVjdGl2ZXMgZm9yIGVhY2ggb2YgdGhlIHRhYnMuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY1RhYlNjcm9sbGVyQ29udGVudF0nXG59KVxuZXhwb3J0IGNsYXNzIE1kY1RhYlNjcm9sbGVyQ29udGVudERpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXRhYi1zY3JvbGxlcl9fc2Nyb2xsLWNvbnRlbnQnKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBfZWw6IEVsZW1lbnRSZWYpIHt9XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBhIHRoZSBzY3JvbGwgYXJlYSBvZiBhbiBgbWRjVGFiU2Nyb2xsZXJgLiBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZVxuICogYG1kY1RhYlNjcm9sbGVyQ29udGVudGAgY2hpbGQgZGlyZWN0aXZlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNUYWJTY3JvbGxlckFyZWFdJ1xufSlcbmV4cG9ydCBjbGFzcyBNZGNUYWJTY3JvbGxlckFyZWFEaXJlY3RpdmUge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy10YWItc2Nyb2xsZXJfX3Njcm9sbC1hcmVhJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgX2VsOiBFbGVtZW50UmVmKSB7fVxufVxuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgYSBzY3JvbGxhYmxlIHRhYiBiYXIuIFRoaXMgZGlyZWN0aXZlIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lXG4gKiBgbWRjVGFiU2Nyb2xsZXJBcmVhYCBjaGlsZCBkaXJlY3RpdmUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY1RhYlNjcm9sbGVyXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiU2Nyb2xsZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy10YWItc2Nyb2xsZXInKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbiAgICBwcml2YXRlIG9uRGVzdHJveSQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oTWRjVGFiU2Nyb2xsZXJBcmVhRGlyZWN0aXZlKSBfYXJlYXM/OiBRdWVyeUxpc3Q8TWRjVGFiU2Nyb2xsZXJBcmVhRGlyZWN0aXZlPjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZGNUYWJTY3JvbGxlckNvbnRlbnREaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9jb250ZW50cz86IFF1ZXJ5TGlzdDxNZGNUYWJTY3JvbGxlckNvbnRlbnREaXJlY3RpdmU+O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKEFic3RyYWN0TWRjVGFiRGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBfdGFicz86IFF1ZXJ5TGlzdDxBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZT47XG4gICAgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQ7XG4gICAgcHJpdmF0ZSBfYWRhcHRlcjogTURDVGFiU2Nyb2xsZXJBZGFwdGVyID0ge1xuICAgICAgICBldmVudFRhcmdldE1hdGNoZXNTZWxlY3RvcjogKHRhcmdldCwgc2VsZWN0b3IpID0+IHBvbnlmaWxsLm1hdGNoZXModGFyZ2V0IGFzIEVsZW1lbnQsIHNlbGVjdG9yKSxcbiAgICAgICAgYWRkQ2xhc3M6IChuYW1lKSA9PiB0aGlzLl9ybmRyLmFkZENsYXNzKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQsIG5hbWUpLFxuICAgICAgICByZW1vdmVDbGFzczogKG5hbWUpID0+IHRoaXMuX3JuZHIucmVtb3ZlQ2xhc3ModGhpcy5fZWwubmF0aXZlRWxlbWVudCwgbmFtZSksXG4gICAgICAgIGFkZFNjcm9sbEFyZWFDbGFzczogKG5hbWUpID0+IHRoaXMuX3JuZHIuYWRkQ2xhc3ModGhpcy5fYXJlYSEuX2VsLm5hdGl2ZUVsZW1lbnQsIG5hbWUpLFxuICAgICAgICBzZXRTY3JvbGxBcmVhU3R5bGVQcm9wZXJ0eTogKG5hbWUsIHZhbHVlKSA9PiB0aGlzLl9ybmRyLnNldFN0eWxlKHRoaXMuX2FyZWEhLl9lbC5uYXRpdmVFbGVtZW50LCBuYW1lLCB2YWx1ZSksXG4gICAgICAgIHNldFNjcm9sbENvbnRlbnRTdHlsZVByb3BlcnR5OiAobmFtZSwgdmFsdWUpID0+IHRoaXMuX3JuZHIuc2V0U3R5bGUodGhpcy5fY29udGVudCEuX2VsLm5hdGl2ZUVsZW1lbnQsIG5hbWUsIHZhbHVlKSxcbiAgICAgICAgZ2V0U2Nyb2xsQ29udGVudFN0eWxlVmFsdWU6IChuYW1lKSA9PiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2NvbnRlbnQhLl9lbC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpLFxuICAgICAgICBzZXRTY3JvbGxBcmVhU2Nyb2xsTGVmdDogKHNjcm9sbFgpID0+IHRoaXMuX2FyZWEhLl9lbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxYLFxuICAgICAgICBnZXRTY3JvbGxBcmVhU2Nyb2xsTGVmdDogKCkgPT4gdGhpcy5fYXJlYSEuX2VsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgICAgZ2V0U2Nyb2xsQ29udGVudE9mZnNldFdpZHRoOiAoKSA9PiB0aGlzLl9jb250ZW50IS5fZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgZ2V0U2Nyb2xsQXJlYU9mZnNldFdpZHRoOiAoKSA9PiB0aGlzLl9hcmVhIS5fZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgY29tcHV0ZVNjcm9sbEFyZWFDbGllbnRSZWN0OiAoKSA9PiB0aGlzLl9hcmVhIS5fZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgY29tcHV0ZVNjcm9sbENvbnRlbnRDbGllbnRSZWN0OiAoKSA9PiB0aGlzLl9jb250ZW50IS5fZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgY29tcHV0ZUhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQ6ICgpID0+IHV0aWwuY29tcHV0ZUhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQodGhpcy5kb2N1bWVudClcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZm91bmRhdGlvbjogTURDVGFiU2Nyb2xsZXJGb3VuZGF0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9ybmRyOiBSZW5kZXJlcjIsIHByaXZhdGUgX2VsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlZ2lzdHJ5OiBNZGNFdmVudFJlZ2lzdHJ5LCBASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jIGFzIERvY3VtZW50OyAvLyB3b3JrIGFyb3VuZCBuZ2MgaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjAzNTFcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIGxldCBpbml0aWFsaXplciA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUZvdW5kYXRpb24oKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb250ZW50ICYmIHRoaXMuX2FyZWEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Rm91bmRhdGlvbigpO1xuICAgICAgICB9O1xuICAgICAgICBpbml0aWFsaXplcigpO1xuICAgICAgICB0aGlzLl9jb250ZW50cyEuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKS5zdWJzY3JpYmUoaW5pdGlhbGl6ZXIpO1xuICAgICAgICB0aGlzLl9hcmVhcyEuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKS5zdWJzY3JpYmUoaW5pdGlhbGl6ZXIpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95Rm91bmRhdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZvdW5kYXRpb24oKSB7XG4gICAgICAgIHRoaXMuX2ZvdW5kYXRpb24gPSBuZXcgTURDVGFiU2Nyb2xsZXJGb3VuZGF0aW9uKHRoaXMuX2FkYXB0ZXIpO1xuICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmluaXQoKTtcbiAgICAgICAgLy8gbWFudWFsIHJlZ2lzdHJhdGlvbiBvZiBldmVudCBsaXN0ZW5lcnMsIGJlY2F1c2Ugd2UgbmVlZCBhcHBseVBhc3NpdmUsIHdoaWNoIGlzIG5vdCAoeWV0KVxuICAgICAgICAvLyBzdXBwb3J0ZWQgYnkgYW5ndWxhciBiaW5kaW5nczpcbiAgICAgICAgdGhpcy5yZWdpc3RyeS5saXN0ZW4odGhpcy5fcm5kciwgJ3doZWVsJywgdGhpcy5faGFuZGxlSW50ZXJhY3Rpb24sIHRoaXMuX2FyZWEhLl9lbCwgZXZlbnRzLmFwcGx5UGFzc2l2ZSgpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeS5saXN0ZW4odGhpcy5fcm5kciwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVJbnRlcmFjdGlvbiwgdGhpcy5fYXJlYSEuX2VsLCBldmVudHMuYXBwbHlQYXNzaXZlKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5Lmxpc3Rlbih0aGlzLl9ybmRyLCAncG9pbnRlcmRvd24nLCB0aGlzLl9oYW5kbGVJbnRlcmFjdGlvbiwgdGhpcy5fYXJlYSEuX2VsLCBldmVudHMuYXBwbHlQYXNzaXZlKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5Lmxpc3Rlbih0aGlzLl9ybmRyLCAnbW91c2Vkb3duJywgdGhpcy5faGFuZGxlSW50ZXJhY3Rpb24sIHRoaXMuX2FyZWEhLl9lbCwgZXZlbnRzLmFwcGx5UGFzc2l2ZSgpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeS5saXN0ZW4odGhpcy5fcm5kciwgJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVJbnRlcmFjdGlvbiwgdGhpcy5fYXJlYSEuX2VsLCBldmVudHMuYXBwbHlQYXNzaXZlKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5Lmxpc3Rlbih0aGlzLl9ybmRyLCAndHJhbnNpdGlvbmVuZCcsIHRoaXMuX2hhbmRsZVRyYW5zaXRpb25FbmQsIHRoaXMuX2NvbnRlbnQhLl9lbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95Rm91bmRhdGlvbigpIHtcbiAgICAgICAgbGV0IGRlc3Ryb3kgPSB0aGlzLl9mb3VuZGF0aW9uICE9IG51bGw7XG4gICAgICAgIGlmIChkZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LnVubGlzdGVuKCd3aGVlbCcsIHRoaXMuX2hhbmRsZUludGVyYWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnkudW5saXN0ZW4oJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVJbnRlcmFjdGlvbik7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LnVubGlzdGVuKCdwb2ludGVyZG93bicsIHRoaXMuX2hhbmRsZUludGVyYWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnkudW5saXN0ZW4oJ21vdXNlZG93bicsIHRoaXMuX2hhbmRsZUludGVyYWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnkudW5saXN0ZW4oJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVJbnRlcmFjdGlvbik7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LnVubGlzdGVuKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5faGFuZGxlVHJhbnNpdGlvbkVuZCk7XG4gICAgICAgICAgICB0aGlzLl9mb3VuZGF0aW9uIS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm91bmRhdGlvbiA9IG51bGw7XG4gICAgICAgIHJldHVybiBkZXN0cm95O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUludGVyYWN0aW9uID0gKCkgPT4gdGhpcy5fZm91bmRhdGlvbiEuaGFuZGxlSW50ZXJhY3Rpb24oKTtcbiAgICBwcml2YXRlIF9oYW5kbGVUcmFuc2l0aW9uRW5kID0gKGV2dDogRXZlbnQpID0+IHRoaXMuX2ZvdW5kYXRpb24hLmhhbmRsZVRyYW5zaXRpb25FbmQoZXZ0KTtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZ2V0U2Nyb2xsQ29udGVudFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRTY3JvbGxDb250ZW50T2Zmc2V0V2lkdGgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBfYXJlYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FyZWFzICYmIHRoaXMuX2FyZWFzLmxlbmd0aCA+IDAgPyB0aGlzLl9hcmVhcy5maXJzdCA6IG51bGw7XG4gICAgfVxuICAgIFxuICAgIHByaXZhdGUgZ2V0IF9jb250ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudHMgJiYgdGhpcy5fY29udGVudHMubGVuZ3RoID4gMCA/IHRoaXMuX2NvbnRlbnRzLmZpcnN0IDogbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBUQUJfU0NST0xMRVJfRElSRUNUSVZFUyA9IFtNZGNUYWJTY3JvbGxlckNvbnRlbnREaXJlY3RpdmUsIE1kY1RhYlNjcm9sbGVyQXJlYURpcmVjdGl2ZSwgTWRjVGFiU2Nyb2xsZXJEaXJlY3RpdmVdO1xuIl19