@flosportsinc/ng-video-autoplay
Version:
Simple way to ensure videos autoplay even if they need to be muted first.
345 lines • 24.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Input, Renderer2, ContentChildren, QueryList } from '@angular/core';
import { share, takeUntil, map, flatMap, filter, tap, take } from 'rxjs/operators';
import { fromEvent, Subject } from 'rxjs';
import { maybe, either } from 'typescript-monads';
/**
* @record
*/
function VideoHaltStatus() { }
if (false) {
/** @type {?} */
VideoHaltStatus.prototype.videoElement;
/** @type {?} */
VideoHaltStatus.prototype.halted;
}
// tslint:disable:no-object-mutation
/** @type {?} */
const filterHalted = (/**
* @param {?} source
* @return {?}
*/
(source) => source.pipe(filter((/**
* @param {?} res
* @return {?}
*/
res => res.halted === true))));
const ɵ0 = filterHalted;
/** @type {?} */
const tryPlayVideoAsIs = (/**
* @param {?} source
* @return {?}
*/
(source) => source.pipe(flatMap((/**
* @param {?} videoElement
* @return {?}
*/
videoElement => videoElement.play()
.then((/**
* @return {?}
*/
() => ({ videoElement, halted: false })))
.catch((/**
* @return {?}
*/
() => ({ videoElement, halted: true }))))), filterHalted));
const ɵ1 = tryPlayVideoAsIs;
/** @type {?} */
const tryPlayVideoMuted = (/**
* @param {?} source
* @return {?}
*/
(source) => source.pipe(map((/**
* @param {?} res
* @return {?}
*/
res => {
res.videoElement.muted = true;
res.videoElement.volume = 0;
return res.videoElement;
})), tryPlayVideoAsIs))
// 1) attempt to play as-is (including autoplay + unmuted)
// 2) attempt to play muted, showing unmite button
// 3) show click to play
;
const ɵ2 = tryPlayVideoMuted;
// 1) attempt to play as-is (including autoplay + unmuted)
// 2) attempt to play muted, showing unmite button
// 3) show click to play
export class FloVideoAutoplayDirective {
/**
* @param {?} elmRef
* @param {?} rd
*/
constructor(elmRef, rd) {
this.elmRef = elmRef;
this.rd = rd;
this.floVideoAutoplay = true;
this.floVideoAutoplayIndex = 0;
this.onDestroySource = new Subject();
this.onDestroy = this.onDestroySource.pipe(share());
this.canExecute = (/**
* @return {?}
*/
() => this.floVideoAutoplay === true || this.floVideoAutoplay === '');
this.maybeVideoElement = (/**
* @return {?}
*/
() => maybe(this.elmRef.nativeElement).filter((/**
* @param {?} e
* @return {?}
*/
e => e.nodeName === 'VIDEO')));
this.maybeUnmuteActionRef = (/**
* @return {?}
*/
() => maybe(this.floVideoAutoplayClickUnmuteRef).filter((/**
* @param {?} a
* @return {?}
*/
a => (/** @type {?} */ (a)) !== '')));
this.maybePlayActionRef = (/**
* @return {?}
*/
() => maybe(this.floVideoAutoplayClickPlayRef).filter((/**
* @param {?} a
* @return {?}
*/
a => (/** @type {?} */ (a)) !== '')));
this.hideRef = (/**
* @param {?} ref
* @return {?}
*/
(ref) => this.rd.setStyle(ref, 'display', 'none'));
this.showRef = (/**
* @param {?} ref
* @return {?}
*/
(ref) => this.rd.setStyle(ref, 'display', 'block'));
this.volumeChange = (/**
* @param {?} videoElement
* @return {?}
*/
(videoElement) => fromEvent(videoElement, 'volumechange', { passive: true }).pipe(map((/**
* @param {?} evt
* @return {?}
*/
evt => (/** @type {?} */ (evt.target)))), share(), takeUntil(this.onDestroy)));
this.initOnVideo = (/**
* @param {?} videoElement
* @return {?}
*/
(videoElement) => fromEvent(videoElement, 'loadstart').pipe(tap((/**
* @return {?}
*/
() => videoElement.setAttribute('autoplay', 'true'))), map((/**
* @param {?} evt
* @return {?}
*/
evt => (/** @type {?} */ (evt.target)))), tryPlayVideoAsIs, tryPlayVideoMuted, take(1)).subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
res.videoElement.preload = 'none';
res.videoElement.muted = false;
res.videoElement.volume = 1;
this.maybePlayActionRef().tapSome(this.showRef);
})));
this.runUnmuteSequence = (/**
* @param {?} actionRef
* @return {?}
*/
(actionRef) => (/**
* @param {?} runOnce
* @return {?}
*/
(runOnce) => (/**
* @param {?} videoElement
* @return {?}
*/
(videoElement) => {
videoElement.setAttribute('autoplay', 'true');
fromEvent(actionRef, 'click').pipe(takeUntil(this.onDestroy)).subscribe((/**
* @return {?}
*/
() => {
videoElement.muted = false;
videoElement.volume = 1;
}));
this.volumeChange(videoElement).pipe(filter((/**
* @param {?} v
* @return {?}
*/
v => !v.muted || v.volume > 0)), takeUntil(this.onDestroy))
.subscribe((/**
* @return {?}
*/
() => this.hideRef(actionRef)));
/** @type {?} */
const showRef = this.volumeChange(videoElement).pipe(filter((/**
* @param {?} v
* @return {?}
*/
v => v.muted || v.volume <= 0)));
(runOnce ? showRef.pipe(take(1)) : showRef).subscribe((/**
* @return {?}
*/
() => this.showRef(actionRef)));
})));
}
/**
* @return {?}
*/
ngAfterContentInit() {
if (!this.canExecute()) {
return;
}
this.maybeVideoElement().tapSome(this.initOnVideo);
this.videos.map((/**
* @param {?} a
* @return {?}
*/
a => a.nativeElement)).forEach(this.initOnVideo);
this.maybeUnmuteActionRef().tapSome((/**
* @param {?} ref
* @return {?}
*/
ref => {
this.hideRef(ref);
either(this.maybeVideoElement().valueOrUndefined(), maybe(this.videos.toArray()[this.floVideoAutoplayIndex]).map((/**
* @param {?} a
* @return {?}
*/
a => a.nativeElement)).valueOrUndefined())
.tap({
left: this.runUnmuteSequence(ref)(false),
right: this.runUnmuteSequence(ref)(true)
});
}));
this.maybePlayActionRef().tapSome((/**
* @param {?} actionRef
* @return {?}
*/
actionRef => {
this.hideRef(actionRef);
fromEvent(actionRef, 'click').pipe(takeUntil(this.onDestroy)).subscribe((/**
* @return {?}
*/
() => {
this.hideRef(actionRef);
this.maybeVideoElement().tapSome((/**
* @param {?} v
* @return {?}
*/
v => v.play()));
}));
}));
}
/**
* @return {?}
*/
ngOnDestroy() {
this.onDestroySource.next();
this.onDestroySource.complete();
}
}
FloVideoAutoplayDirective.decorators = [
{ type: Directive, args: [{
selector: '[floVideoAutoplay]'
},] }
];
/** @nocollapse */
FloVideoAutoplayDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
FloVideoAutoplayDirective.propDecorators = {
floVideoAutoplay: [{ type: Input }],
floVideoAutoplayClickUnmuteRef: [{ type: Input }],
floVideoAutoplayClickPlayRef: [{ type: Input }],
floVideoAutoplayIndex: [{ type: Input }],
videos: [{ type: ContentChildren, args: ['floVideoAutoplay', { descendants: true },] }]
};
if (false) {
/** @type {?} */
FloVideoAutoplayDirective.prototype.floVideoAutoplay;
/** @type {?} */
FloVideoAutoplayDirective.prototype.floVideoAutoplayClickUnmuteRef;
/** @type {?} */
FloVideoAutoplayDirective.prototype.floVideoAutoplayClickPlayRef;
/** @type {?} */
FloVideoAutoplayDirective.prototype.floVideoAutoplayIndex;
/** @type {?} */
FloVideoAutoplayDirective.prototype.videos;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.onDestroySource;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.onDestroy;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.canExecute;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.maybeVideoElement;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.maybeUnmuteActionRef;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.maybePlayActionRef;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.hideRef;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.showRef;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.volumeChange;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.initOnVideo;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.runUnmuteSequence;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.elmRef;
/**
* @type {?}
* @private
*/
FloVideoAutoplayDirective.prototype.rd;
}
export { ɵ0, ɵ1, ɵ2 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlkZW8tYXV0b3BsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZsb3Nwb3J0c2luYy9uZy12aWRlby1hdXRvcGxheS8iLCJzb3VyY2VzIjpbImxpYi9uZy12aWRlby1hdXRvcGxheS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQStCLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDaEksT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7Ozs7QUFFakQsOEJBR0M7OztJQUZDLHVDQUF1Qzs7SUFDdkMsaUNBQXdCOzs7O01BSXBCLFlBQVk7Ozs7QUFDaEIsQ0FBQyxNQUFtQyxFQUFFLEVBQUUsQ0FDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNOzs7O0FBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksRUFBQyxDQUFDLENBQUE7OztNQUU3QyxnQkFBZ0I7Ozs7QUFDcEIsQ0FBQyxNQUFvQyxFQUFFLEVBQUUsQ0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPOzs7O0FBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0tBQ3BELElBQUk7OztBQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUM7S0FDN0MsS0FBSzs7O0FBQUMsR0FBRyxFQUFF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QVMsU0FBUzs7OytCQXFDN0MsS0FBSzs2Q0FDTCxLQUFLOzJDQUNMLEtBQUs7b0NBQ0wsS0FBSztxQkFFTCxlQUFlLFNBQUMsa0JBQWtCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFOzs7O0lBTDFELHFEQUFnRDs7SUFDaEQsbUVBQXFFOztJQUNyRSxpRUFBbUU7O0lBQ25FLDBEQUFrRDs7SUFFbEQsMkNBQTJIOzs7OztJQUUzSCxvREFBZ0Q7Ozs7O0lBQ2hELDhDQUErRDs7Ozs7SUFDL0QsK0NBQWtHOzs7OztJQUNsRyxzREFBK0c7Ozs7O0lBQy9HLHlEQUFxSDs7Ozs7SUFDckgsdURBQWlIOzs7OztJQUVqSCw0Q0FBeUY7Ozs7O0lBQ3pGLDRDQUEwRjs7Ozs7SUFFMUYsaURBSThCOzs7OztJQUU5QixnREFZSTs7Ozs7SUFJSixzREFXQzs7Ozs7SUFiVywyQ0FBNEM7Ozs7O0lBQUUsdUNBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgUmVuZGVyZXIyLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IHNoYXJlLCB0YWtlVW50aWwsIG1hcCwgZmxhdE1hcCwgZmlsdGVyLCB0YXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXliZSwgZWl0aGVyIH0gZnJvbSAndHlwZXNjcmlwdC1tb25hZHMnXG5cbmludGVyZmFjZSBWaWRlb0hhbHRTdGF0dXMge1xuICByZWFkb25seSB2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnRcbiAgcmVhZG9ubHkgaGFsdGVkOiBib29sZWFuXG59XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLW9iamVjdC1tdXRhdGlvblxuY29uc3QgZmlsdGVySGFsdGVkID1cbiAgKHNvdXJjZTogT2JzZXJ2YWJsZTxWaWRlb0hhbHRTdGF0dXM+KSA9PlxuICAgIHNvdXJjZS5waXBlKGZpbHRlcihyZXMgPT4gcmVzLmhhbHRlZCA9PT0gdHJ1ZSkpXG5cbmNvbnN0IHRyeVBsYXlWaWRlb0FzSXMgPVxuICAoc291cmNlOiBPYnNlcnZhYmxlPEhUTUxWaWRlb0VsZW1lbnQ+KSA9PlxuICAgIHNvdXJjZS5waXBlKGZsYXRNYXAodmlkZW9FbGVtZW50ID0+IHZpZGVvRWxlbWVudC5wbGF5KClcbiAgICAgIC50aGVuKCgpID0+ICh7IHZpZGVvRWxlbWVudCwgaGFsdGVkOiBmYWxzZSB9KSlcbiAgICAgIC5jYXRjaCgoKSA9PiAoeyB2aWRlb0VsZW1lbnQsIGhhbHRlZDogdHJ1ZSB9KSlcbiAgICApLCBmaWx0ZXJIYWx0ZWQpXG5cbmNvbnN0IHRyeVBsYXlWaWRlb011dGVkID1cbiAgKHNvdXJjZTogT2JzZXJ2YWJsZTxWaWRlb0hhbHRTdGF0dXM+KSA9PlxuICAgIHNvdXJjZS5waXBlKG1hcChyZXMgPT4ge1xuICAgICAgcmVzLnZpZGVvRWxlbWVudC5tdXRlZCA9IHRydWVcbiAgICAgIHJlcy52aWRlb0VsZW1lbnQudm9sdW1lID0gMFxuICAgICAgcmV0dXJuIHJlcy52aWRlb0VsZW1lbnRcbiAgICB9KSwgdHJ5UGxheVZpZGVvQXNJcylcblxuLy8gMSkgYXR0ZW1wdCB0byBwbGF5IGFzLWlzIChpbmNsdWRpbmcgYXV0b3BsYXkgKyB1bm11dGVkKVxuLy8gMikgYXR0ZW1wdCB0byBwbGF5IG11dGVkLCBzaG93aW5nIHVubWl0ZSBidXR0b25cbi8vIDMpIHNob3cgY2xpY2sgdG8gcGxheVxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Zsb1ZpZGVvQXV0b3BsYXldJ1xufSlcbmV4cG9ydCBjbGFzcyBGbG9WaWRlb0F1dG9wbGF5RGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5IGZsb1ZpZGVvQXV0b3BsYXkgPSB0cnVlXG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seSBmbG9WaWRlb0F1dG9wbGF5Q2xpY2tVbm11dGVSZWY/OiBIVE1MRWxlbWVudFxuICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHkgZmxvVmlkZW9BdXRvcGxheUNsaWNrUGxheVJlZj86IEhUTUxFbGVtZW50XG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seSBmbG9WaWRlb0F1dG9wbGF5SW5kZXggPSAwXG5cbiAgQENvbnRlbnRDaGlsZHJlbignZmxvVmlkZW9BdXRvcGxheScsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgcHVibGljIHJlYWRvbmx5IHZpZGVvczogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4+XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkRlc3Ryb3lTb3VyY2UgPSBuZXcgU3ViamVjdCgpXG4gIHByaXZhdGUgcmVhZG9ubHkgb25EZXN0cm95ID0gdGhpcy5vbkRlc3Ryb3lTb3VyY2UucGlwZShzaGFyZSgpKVxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkV4ZWN1dGUgPSAoKSA9PiB0aGlzLmZsb1ZpZGVvQXV0b3BsYXkgPT09IHRydWUgfHwgdGhpcy5mbG9WaWRlb0F1dG9wbGF5ID09PSAnJ1xuICBwcml2YXRlIHJlYWRvbmx5IG1heWJlVmlkZW9FbGVtZW50ID0gKCkgPT4gbWF5YmUodGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudCkuZmlsdGVyKGUgPT4gZS5ub2RlTmFtZSA9PT0gJ1ZJREVPJylcbiAgcHJpdmF0ZSByZWFkb25seSBtYXliZVVubXV0ZUFjdGlvblJlZiA9ICgpID0+IG1heWJlKHRoaXMuZmxvVmlkZW9BdXRvcGxheUNsaWNrVW5tdXRlUmVmKS5maWx0ZXIoYSA9PiBhIGFzIGFueSAhPT0gJycpXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF5YmVQbGF5QWN0aW9uUmVmID0gKCkgPT4gbWF5YmUodGhpcy5mbG9WaWRlb0F1dG9wbGF5Q2xpY2tQbGF5UmVmKS5maWx0ZXIoYSA9PiBhIGFzIGFueSAhPT0gJycpXG5cbiAgcHJpdmF0ZSByZWFkb25seSBoaWRlUmVmID0gKHJlZjogSFRNTEVsZW1lbnQpID0+IHRoaXMucmQuc2V0U3R5bGUocmVmLCAnZGlzcGxheScsICdub25lJylcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93UmVmID0gKHJlZjogSFRNTEVsZW1lbnQpID0+IHRoaXMucmQuc2V0U3R5bGUocmVmLCAnZGlzcGxheScsICdibG9jaycpXG5cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVDaGFuZ2UgPSAodmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50KSA9PlxuICAgIGZyb21FdmVudCh2aWRlb0VsZW1lbnQsICd2b2x1bWVjaGFuZ2UnLCB7IHBhc3NpdmU6IHRydWUgfSkucGlwZShcbiAgICAgIG1hcChldnQgPT4gZXZ0LnRhcmdldCBhcyBIVE1MVmlkZW9FbGVtZW50KSxcbiAgICAgIHNoYXJlKCksXG4gICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdE9uVmlkZW8gPSAodmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50KSA9PlxuICAgIGZyb21FdmVudCh2aWRlb0VsZW1lbnQsICdsb2Fkc3RhcnQnKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHZpZGVvRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJ3RydWUnKSksXG4gICAgICBtYXAoZXZ0ID0+IGV2dC50YXJnZXQgYXMgSFRNTFZpZGVvRWxlbWVudCksXG4gICAgICB0cnlQbGF5VmlkZW9Bc0lzLFxuICAgICAgdHJ5UGxheVZpZGVvTXV0ZWQsXG4gICAgICB0YWtlKDEpXG4gICAgKS5zdWJzY3JpYmUocmVzID0+IHsgLy8gY291bGQgbm90IGF1dG9wbGF5LCBtdXN0IGNsaWNrIHRvIHBsYXlcbiAgICAgIHJlcy52aWRlb0VsZW1lbnQucHJlbG9hZCA9ICdub25lJ1xuICAgICAgcmVzLnZpZGVvRWxlbWVudC5tdXRlZCA9IGZhbHNlXG4gICAgICByZXMudmlkZW9FbGVtZW50LnZvbHVtZSA9IDFcbiAgICAgIHRoaXMubWF5YmVQbGF5QWN0aW9uUmVmKCkudGFwU29tZSh0aGlzLnNob3dSZWYpXG4gICAgfSlcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsbVJlZjogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiwgcHJpdmF0ZSByZDogUmVuZGVyZXIyKSB7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHJ1blVubXV0ZVNlcXVlbmNlID0gKGFjdGlvblJlZjogSFRNTEVsZW1lbnQpID0+IChydW5PbmNlOiBib29sZWFuKSA9PiAodmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50KSA9PiB7XG4gICAgdmlkZW9FbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b3BsYXknLCAndHJ1ZScpXG4gICAgZnJvbUV2ZW50KGFjdGlvblJlZiwgJ2NsaWNrJykucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdmlkZW9FbGVtZW50Lm11dGVkID0gZmFsc2VcbiAgICAgIHZpZGVvRWxlbWVudC52b2x1bWUgPSAxXG4gICAgfSlcblxuICAgIHRoaXMudm9sdW1lQ2hhbmdlKHZpZGVvRWxlbWVudCkucGlwZShmaWx0ZXIodiA9PiAhdi5tdXRlZCB8fCB2LnZvbHVtZSA+IDApLCB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGVSZWYoYWN0aW9uUmVmKSlcbiAgICBjb25zdCBzaG93UmVmID0gdGhpcy52b2x1bWVDaGFuZ2UodmlkZW9FbGVtZW50KS5waXBlKGZpbHRlcih2ID0+IHYubXV0ZWQgfHwgdi52b2x1bWUgPD0gMCkpO1xuICAgIChydW5PbmNlID8gc2hvd1JlZi5waXBlKHRha2UoMSkpIDogc2hvd1JlZikuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2hvd1JlZihhY3Rpb25SZWYpKVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICghdGhpcy5jYW5FeGVjdXRlKCkpIHsgcmV0dXJuIH1cblxuICAgIHRoaXMubWF5YmVWaWRlb0VsZW1lbnQoKS50YXBTb21lKHRoaXMuaW5pdE9uVmlkZW8pXG4gICAgdGhpcy52aWRlb3MubWFwKGEgPT4gYS5uYXRpdmVFbGVtZW50KS5mb3JFYWNoKHRoaXMuaW5pdE9uVmlkZW8pXG5cbiAgICB0aGlzLm1heWJlVW5tdXRlQWN0aW9uUmVmKCkudGFwU29tZShyZWYgPT4ge1xuICAgICAgdGhpcy5oaWRlUmVmKHJlZilcblxuICAgICAgZWl0aGVyKHRoaXMubWF5YmVWaWRlb0VsZW1lbnQoKS52YWx1ZU9yVW5kZWZpbmVkKCksXG4gICAgICAgIG1heWJlKHRoaXMudmlkZW9zLnRvQXJyYXkoKVt0aGlzLmZsb1ZpZGVvQXV0b3BsYXlJbmRleF0pLm1hcChhID0+IGEubmF0aXZlRWxlbWVudCkudmFsdWVPclVuZGVmaW5lZCgpKVxuICAgICAgICAudGFwKHtcbiAgICAgICAgICBsZWZ0OiB0aGlzLnJ1blVubXV0ZVNlcXVlbmNlKHJlZikoZmFsc2UpLFxuICAgICAgICAgIHJpZ2h0OiB0aGlzLnJ1blVubXV0ZVNlcXVlbmNlKHJlZikodHJ1ZSlcbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgdGhpcy5tYXliZVBsYXlBY3Rpb25SZWYoKS50YXBTb21lKGFjdGlvblJlZiA9PiB7XG4gICAgICB0aGlzLmhpZGVSZWYoYWN0aW9uUmVmKVxuXG4gICAgICBmcm9tRXZlbnQoYWN0aW9uUmVmLCAnY2xpY2snKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZVJlZihhY3Rpb25SZWYpXG4gICAgICAgIHRoaXMubWF5YmVWaWRlb0VsZW1lbnQoKS50YXBTb21lKHYgPT4gdi5wbGF5KCkpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uRGVzdHJveVNvdXJjZS5uZXh0KClcbiAgICB0aGlzLm9uRGVzdHJveVNvdXJjZS5jb21wbGV0ZSgpXG4gIH1cbn1cbiJdfQ==