UNPKG

@scriptloom/ngx-media-query

Version:

A convenient media query service for building responsive Angular components.

227 lines 31.6 kB
import { Directive } from '@angular/core'; import { Store } from '@ngrx/store'; import { addMediaQuery, selectMediaQuery, } from './media-queries.actions'; import { screenWidthLg, screenWidthMd, screenWidthSm, screenWidthXl, screenWidthXs } from './media-queries.models'; export class MediaQueriesDirective { constructor(store) { this.store = store; // screen this.screenQuery = window.matchMedia('screen'); this.screenQueryListener = () => { }; // xs this.upperXsQuery = window.matchMedia('(max-width: 599px)'); this.xsQueryListener = this.screenXsConditional(); // sm this.lowerSmQuery = window.matchMedia('(min-width: 600px)'); this.upperSmQuery = window.matchMedia('(max-width: 959px)'); this.smQueryListener = this.screenSmConditional(); // md this.lowerMdQuery = window.matchMedia('(min-width: 960px)'); this.upperMdQuery = window.matchMedia('(max-width: 1279px)'); this.mdQueryListener = this.screenMdConditional(); // lg this.lowerLgQuery = window.matchMedia('(min-width: 1280px)'); this.upperLgQuery = window.matchMedia('(max-width: 1919px)'); this.lgQueryListener = this.screenLgConditional(); // xl this.lowerXlQuery = window.matchMedia('(min-width: 1920px)'); this.upperXlQuery = window.matchMedia('(max-width: 5000px)'); this.xlQueryListener = this.screenXlConditional(); } ngOnInit() { if (typeof window.matchMedia('(min-width: 0px)').addEventListener !== 'undefined') { // screen this.screenQuery.addEventListener('change', this.screenQueryListener); // xs this.upperXsQuery.addEventListener('change', this.xsQueryListener); // sm this.lowerSmQuery.addEventListener('change', this.smQueryListener); this.upperSmQuery.addEventListener('change', this.smQueryListener); // md this.lowerMdQuery.addEventListener('change', this.mdQueryListener); this.upperMdQuery.addEventListener('change', this.mdQueryListener); // lg this.lowerLgQuery.addEventListener('change', this.lgQueryListener); this.upperLgQuery.addEventListener('change', this.lgQueryListener); // xl this.lowerXlQuery.addEventListener('change', this.xlQueryListener); this.upperXlQuery.addEventListener('change', this.xlQueryListener); } else { // As of July 4, 2020 it is expect Safari does not implement // MediaQueryList.addEventListener and so MediaQueryList.addListener // is used if the MediaQueryList.addEventListener is not found. See: // https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList. // screen this.screenQuery.addListener(this.screenQueryListener); // xs this.upperXsQuery.addListener(this.xsQueryListener); // sm this.lowerSmQuery.addListener(this.smQueryListener); this.upperSmQuery.addListener(this.smQueryListener); // md this.lowerMdQuery.addListener(this.mdQueryListener); this.upperMdQuery.addListener(this.mdQueryListener); // lg this.lowerLgQuery.addListener(this.lgQueryListener); this.upperLgQuery.addListener(this.lgQueryListener); // xl this.lowerXlQuery.addListener(this.xlQueryListener); this.upperXlQuery.addListener(this.xlQueryListener); } // initialize states this.initializeState(); } ngOnDestroy() { if (typeof window.matchMedia('(min-width: 0px)').removeEventListener !== 'undefined') { // screen this.screenQuery.removeEventListener('change', this.screenQueryListener); // xs this.upperXsQuery.removeEventListener('change', this.xsQueryListener); // sm this.lowerSmQuery.removeEventListener('change', this.smQueryListener); this.upperSmQuery.removeEventListener('change', this.smQueryListener); // md this.lowerMdQuery.removeEventListener('change', this.mdQueryListener); this.upperMdQuery.removeEventListener('change', this.mdQueryListener); // lg this.lowerLgQuery.removeEventListener('change', this.lgQueryListener); this.upperLgQuery.removeEventListener('change', this.lgQueryListener); // xl this.lowerXlQuery.removeEventListener('change', this.xlQueryListener); this.upperXlQuery.removeEventListener('change', this.xlQueryListener); } else { // As of July 4, 2020 it is expect Safari does not implement // MediaQueryList.removeEventListener and so MediaQueryList.removeListener // is used if the MediaQueryList.removeEventListener is not found. See: // https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList // screen this.screenQuery.removeListener(this.screenQueryListener); // xs this.upperXsQuery.removeListener(this.xsQueryListener); // sm this.lowerSmQuery.removeListener(this.smQueryListener); this.upperSmQuery.removeListener(this.smQueryListener); // md this.lowerMdQuery.removeListener(this.mdQueryListener); this.upperMdQuery.removeListener(this.mdQueryListener); // lg this.lowerLgQuery.removeListener(this.lgQueryListener); this.upperLgQuery.removeListener(this.lgQueryListener); // xl this.lowerXlQuery.removeListener(this.xlQueryListener); this.upperXlQuery.removeListener(this.xlQueryListener); } } dispatchMediaQuery() { const id = new Date().getTime().toString(); this.store.dispatch(addMediaQuery({ mediaQuery: { id, query: this.currentMediaQuery, } })); this.store.dispatch(selectMediaQuery({ id })); } // Class methods. // xs screenXsConditional() { return () => { if (this.screenQuery.matches && this.upperXsQuery.matches) { this.notifyStoreScreenWidthXs(); } }; } notifyStoreScreenWidthXs() { this.currentMediaQuery = screenWidthXs; this.dispatchMediaQuery(); } // sm screenSmConditional() { return () => { if (this.screenQuery.matches && this.lowerSmQuery.matches && this.upperSmQuery.matches) { this.notifyStoreScreenWidthSm(); } }; } notifyStoreScreenWidthSm() { this.currentMediaQuery = screenWidthSm; this.dispatchMediaQuery(); } // md screenMdConditional() { return () => { if (this.screenQuery.matches && this.lowerMdQuery.matches && this.upperMdQuery.matches) { this.notifyStoreScreenWidthMd(); } }; } notifyStoreScreenWidthMd() { this.currentMediaQuery = screenWidthMd; this.dispatchMediaQuery(); } // lg screenLgConditional() { return () => { if (this.screenQuery.matches && this.lowerLgQuery.matches && this.upperLgQuery.matches) { this.notifyStoreScreenWidthLg(); } }; } notifyStoreScreenWidthLg() { this.currentMediaQuery = screenWidthLg; this.dispatchMediaQuery(); } // xl screenXlConditional() { return () => { if (this.screenQuery.matches && this.lowerXlQuery.matches && this.upperXlQuery.matches) { this.notifyStoreScreenWidthXl(); } }; } notifyStoreScreenWidthXl() { this.currentMediaQuery = screenWidthXl; this.dispatchMediaQuery(); } initializeState() { // Initialize the store with a MediaQueryStateInterface // reflecting the size of current user's screen. // Since the media events will not have fired on initialization, // we set the starting state using the window object. if (window.screen && window.innerWidth < 600) { this.notifyStoreScreenWidthXs(); } else if (window.screen && window.innerWidth < 960 && window.innerWidth >= 600) { this.notifyStoreScreenWidthSm(); } else if (window.screen && window.innerWidth < 1280 && window.innerWidth >= 960) { this.notifyStoreScreenWidthMd(); } else if (window.screen && window.innerWidth < 1920 && window.innerWidth >= 960) { this.notifyStoreScreenWidthLg(); } else if (window.screen) { this.notifyStoreScreenWidthXl(); } } } MediaQueriesDirective.decorators = [ { type: Directive, args: [{ selector: '[libNgxMediaQuery]' },] } ]; MediaQueriesDirective.ctorParameters = () => [ { type: Store } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWEtcXVlcmllcy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvamFtZXMvV2Vic3Rvcm1Qcm9qZWN0cy9saWItbmd4L3Byb2plY3RzL25neC1tZWRpYS1xdWVyeS9zcmMvIiwic291cmNlcyI6WyJsaWIvc3RvcmUvbWVkaWEtcXVlcmllcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsYUFBYSxFQUFFLGdCQUFnQixHQUNoQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFFTCxhQUFhLEVBQ2IsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsYUFBYSxFQUNkLE1BQU0sd0JBQXdCLENBQUM7QUFLaEMsTUFBTSxPQUFPLHFCQUFxQjtJQTRCaEMsWUFDVSxLQUFZO1FBQVosVUFBSyxHQUFMLEtBQUssQ0FBTztRQUVwQixTQUFTO1FBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDcEMsS0FBSztRQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDbEQsS0FBSztRQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxlQUFlLEdB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eEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7WUE5UEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7YUFDL0I7OztZQWZRLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7XG4gIGFkZE1lZGlhUXVlcnksIHNlbGVjdE1lZGlhUXVlcnksXG59IGZyb20gJy4vbWVkaWEtcXVlcmllcy5hY3Rpb25zJztcbmltcG9ydCB7XG4gIE1lZGlhUXVlcnksXG4gIHNjcmVlbldpZHRoTGcsXG4gIHNjcmVlbldpZHRoTWQsXG4gIHNjcmVlbldpZHRoU20sXG4gIHNjcmVlbldpZHRoWGwsXG4gIHNjcmVlbldpZHRoWHNcbn0gZnJvbSAnLi9tZWRpYS1xdWVyaWVzLm1vZGVscyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tsaWJOZ3hNZWRpYVF1ZXJ5XSdcbn0pXG5leHBvcnQgY2xhc3MgTWVkaWFRdWVyaWVzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8vIG1lZGlhUXVlcnlcbiAgY3VycmVudE1lZGlhUXVlcnk6IE1lZGlhUXVlcnk7XG5cbiAgLy8gc2NyZWVuXG4gIHNjcmVlblF1ZXJ5OiBNZWRpYVF1ZXJ5TGlzdDtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JlZW5RdWVyeUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuICAvLyB4c1xuICB1cHBlclhzUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xuICBwcml2YXRlIHJlYWRvbmx5IHhzUXVlcnlMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgLy8gc21cbiAgbG93ZXJTbVF1ZXJ5OiBNZWRpYVF1ZXJ5TGlzdDtcbiAgdXBwZXJTbVF1ZXJ5OiBNZWRpYVF1ZXJ5TGlzdDtcbiAgcHJpdmF0ZSByZWFkb25seSBzbVF1ZXJ5TGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIC8vIG1kXG4gIGxvd2VyTWRRdWVyeTogTWVkaWFRdWVyeUxpc3Q7XG4gIHVwcGVyTWRRdWVyeTogTWVkaWFRdWVyeUxpc3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWRRdWVyeUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuICAvLyBsZ1xuICBsb3dlckxnUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xuICB1cHBlckxnUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xuICBwcml2YXRlIHJlYWRvbmx5IGxnUXVlcnlMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgLy8geGxcbiAgbG93ZXJYbFF1ZXJ5OiBNZWRpYVF1ZXJ5TGlzdDtcbiAgdXBwZXJYbFF1ZXJ5OiBNZWRpYVF1ZXJ5TGlzdDtcbiAgcHJpdmF0ZSByZWFkb25seSB4bFF1ZXJ5TGlzdGVuZXI6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXG4gICkge1xuICAgIC8vIHNjcmVlblxuICAgIHRoaXMuc2NyZWVuUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnc2NyZWVuJyk7XG4gICAgdGhpcy5zY3JlZW5RdWVyeUxpc3RlbmVyID0gKCkgPT4ge307XG4gICAgLy8geHNcbiAgICB0aGlzLnVwcGVyWHNRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA1OTlweCknKTtcbiAgICB0aGlzLnhzUXVlcnlMaXN0ZW5lciA9IHRoaXMuc2NyZWVuWHNDb25kaXRpb25hbCgpO1xuICAgIC8vIHNtXG4gICAgdGhpcy5sb3dlclNtUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogNjAwcHgpJyk7XG4gICAgdGhpcy51cHBlclNtUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogOTU5cHgpJyk7XG4gICAgdGhpcy5zbVF1ZXJ5TGlzdGVuZXIgPSB0aGlzLnNjcmVlblNtQ29uZGl0aW9uYWwoKTtcbiAgICAvLyBtZFxuICAgIHRoaXMubG93ZXJNZFF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtaW4td2lkdGg6IDk2MHB4KScpO1xuICAgIHRoaXMudXBwZXJNZFF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDEyNzlweCknKTtcbiAgICB0aGlzLm1kUXVlcnlMaXN0ZW5lciA9IHRoaXMuc2NyZWVuTWRDb25kaXRpb25hbCgpO1xuICAgIC8vIGxnXG4gICAgdGhpcy5sb3dlckxnUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogMTI4MHB4KScpO1xuICAgIHRoaXMudXBwZXJMZ1F1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDE5MTlweCknKTtcbiAgICB0aGlzLmxnUXVlcnlMaXN0ZW5lciA9IHRoaXMuc2NyZWVuTGdDb25kaXRpb25hbCgpO1xuICAgIC8vIHhsXG4gICAgdGhpcy5sb3dlclhsUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogMTkyMHB4KScpO1xuICAgIHRoaXMudXBwZXJYbFF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDUwMDBweCknKTtcbiAgICB0aGlzLnhsUXVlcnlMaXN0ZW5lciA9IHRoaXMuc2NyZWVuWGxDb25kaXRpb25hbCgpO1xuICB9XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhKCcobWluLXdpZHRoOiAwcHgpJykuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIHNjcmVlblxuICAgICAgdGhpcy5zY3JlZW5RdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnNjcmVlblF1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8geHNcbiAgICAgIHRoaXMudXBwZXJYc1F1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMueHNRdWVyeUxpc3RlbmVyKTtcbiAgICAgIC8vIHNtXG4gICAgICB0aGlzLmxvd2VyU21RdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnNtUXVlcnlMaXN0ZW5lcik7XG4gICAgICB0aGlzLnVwcGVyU21RdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnNtUXVlcnlMaXN0ZW5lcik7XG4gICAgICAvLyBtZFxuICAgICAgdGhpcy5sb3dlck1kUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5tZFF1ZXJ5TGlzdGVuZXIpO1xuICAgICAgdGhpcy51cHBlck1kUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5tZFF1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8gbGdcbiAgICAgIHRoaXMubG93ZXJMZ1F1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMubGdRdWVyeUxpc3RlbmVyKTtcbiAgICAgIHRoaXMudXBwZXJMZ1F1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMubGdRdWVyeUxpc3RlbmVyKTtcbiAgICAgIC8vIHhsXG4gICAgICB0aGlzLmxvd2VyWGxRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnhsUXVlcnlMaXN0ZW5lcik7XG4gICAgICB0aGlzLnVwcGVyWGxRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnhsUXVlcnlMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFzIG9mIEp1bHkgNCwgMjAyMCBpdCBpcyBleHBlY3QgU2FmYXJpIGRvZXMgbm90IGltcGxlbWVudFxuICAgICAgLy8gTWVkaWFRdWVyeUxpc3QuYWRkRXZlbnRMaXN0ZW5lciBhbmQgc28gTWVkaWFRdWVyeUxpc3QuYWRkTGlzdGVuZXJcbiAgICAgIC8vIGlzIHVzZWQgaWYgdGhlIE1lZGlhUXVlcnlMaXN0LmFkZEV2ZW50TGlzdGVuZXIgaXMgbm90IGZvdW5kLiBTZWU6XG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTWVkaWFRdWVyeUxpc3QuXG5cbiAgICAgIC8vIHNjcmVlblxuICAgICAgdGhpcy5zY3JlZW5RdWVyeS5hZGRMaXN0ZW5lcih0aGlzLnNjcmVlblF1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8geHNcbiAgICAgIHRoaXMudXBwZXJYc1F1ZXJ5LmFkZExpc3RlbmVyKHRoaXMueHNRdWVyeUxpc3RlbmVyKTtcbiAgICAgIC8vIHNtXG4gICAgICB0aGlzLmxvd2VyU21RdWVyeS5hZGRMaXN0ZW5lcih0aGlzLnNtUXVlcnlMaXN0ZW5lcik7XG4gICAgICB0aGlzLnVwcGVyU21RdWVyeS5hZGRMaXN0ZW5lcih0aGlzLnNtUXVlcnlMaXN0ZW5lcik7XG4gICAgICAvLyBtZFxuICAgICAgdGhpcy5sb3dlck1kUXVlcnkuYWRkTGlzdGVuZXIodGhpcy5tZFF1ZXJ5TGlzdGVuZXIpO1xuICAgICAgdGhpcy51cHBlck1kUXVlcnkuYWRkTGlzdGVuZXIodGhpcy5tZFF1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8gbGdcbiAgICAgIHRoaXMubG93ZXJMZ1F1ZXJ5LmFkZExpc3RlbmVyKHRoaXMubGdRdWVyeUxpc3RlbmVyKTtcbiAgICAgIHRoaXMudXBwZXJMZ1F1ZXJ5LmFkZExpc3RlbmVyKHRoaXMubGdRdWVyeUxpc3RlbmVyKTtcbiAgICAgIC8vIHhsXG4gICAgICB0aGlzLmxvd2VyWGxRdWVyeS5hZGRMaXN0ZW5lcih0aGlzLnhsUXVlcnlMaXN0ZW5lcik7XG4gICAgICB0aGlzLnVwcGVyWGxRdWVyeS5hZGRMaXN0ZW5lcih0aGlzLnhsUXVlcnlMaXN0ZW5lcik7XG4gICAgfVxuICAgIC8vIGluaXRpYWxpemUgc3RhdGVzXG4gICAgdGhpcy5pbml0aWFsaXplU3RhdGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEoJyhtaW4td2lkdGg6IDBweCknKS5yZW1vdmVFdmVudExpc3RlbmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gc2NyZWVuXG4gICAgICB0aGlzLnNjcmVlblF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuc2NyZWVuUXVlcnlMaXN0ZW5lcik7XG4gICAgICAvLyB4c1xuICAgICAgdGhpcy51cHBlclhzUXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy54c1F1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8gc21cbiAgICAgIHRoaXMubG93ZXJTbVF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuc21RdWVyeUxpc3RlbmVyKTtcbiAgICAgIHRoaXMudXBwZXJTbVF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuc21RdWVyeUxpc3RlbmVyKTtcbiAgICAgIC8vIG1kXG4gICAgICB0aGlzLmxvd2VyTWRRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLm1kUXVlcnlMaXN0ZW5lcik7XG4gICAgICB0aGlzLnVwcGVyTWRRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLm1kUXVlcnlMaXN0ZW5lcik7XG4gICAgICAvLyBsZ1xuICAgICAgdGhpcy5sb3dlckxnUXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5sZ1F1ZXJ5TGlzdGVuZXIpO1xuICAgICAgdGhpcy51cHBlckxnUXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5sZ1F1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8geGxcbiAgICAgIHRoaXMubG93ZXJYbFF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMueGxRdWVyeUxpc3RlbmVyKTtcbiAgICAgIHRoaXMudXBwZXJYbFF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMueGxRdWVyeUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXMgb2YgSnVseSA0LCAyMDIwIGl0IGlzIGV4cGVjdCBTYWZhcmkgZG9lcyBub3QgaW1wbGVtZW50XG4gICAgICAvLyBNZWRpYVF1ZXJ5TGlzdC5yZW1vdmVFdmVudExpc3RlbmVyIGFuZCBzbyBNZWRpYVF1ZXJ5TGlzdC5yZW1vdmVMaXN0ZW5lclxuICAgICAgLy8gaXMgdXNlZCBpZiB0aGUgTWVkaWFRdWVyeUxpc3QucmVtb3ZlRXZlbnRMaXN0ZW5lciBpcyBub3QgZm91bmQuIFNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NZWRpYVF1ZXJ5TGlzdFxuICAgICAgLy8gc2NyZWVuXG4gICAgICB0aGlzLnNjcmVlblF1ZXJ5LnJlbW92ZUxpc3RlbmVyKHRoaXMuc2NyZWVuUXVlcnlMaXN0ZW5lcik7XG4gICAgICAvLyB4c1xuICAgICAgdGhpcy51cHBlclhzUXVlcnkucmVtb3ZlTGlzdGVuZXIodGhpcy54c1F1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8gc21cbiAgICAgIHRoaXMubG93ZXJTbVF1ZXJ5LnJlbW92ZUxpc3RlbmVyKHRoaXMuc21RdWVyeUxpc3RlbmVyKTtcbiAgICAgIHRoaXMudXBwZXJTbVF1ZXJ5LnJlbW92ZUxpc3RlbmVyKHRoaXMuc21RdWVyeUxpc3RlbmVyKTtcbiAgICAgIC8vIG1kXG4gICAgICB0aGlzLmxvd2VyTWRRdWVyeS5yZW1vdmVMaXN0ZW5lcih0aGlzLm1kUXVlcnlMaXN0ZW5lcik7XG4gICAgICB0aGlzLnVwcGVyTWRRdWVyeS5yZW1vdmVMaXN0ZW5lcih0aGlzLm1kUXVlcnlMaXN0ZW5lcik7XG4gICAgICAvLyBsZ1xuICAgICAgdGhpcy5sb3dlckxnUXVlcnkucmVtb3ZlTGlzdGVuZXIodGhpcy5sZ1F1ZXJ5TGlzdGVuZXIpO1xuICAgICAgdGhpcy51cHBlckxnUXVlcnkucmVtb3ZlTGlzdGVuZXIodGhpcy5sZ1F1ZXJ5TGlzdGVuZXIpO1xuICAgICAgLy8geGxcbiAgICAgIHRoaXMubG93ZXJYbFF1ZXJ5LnJlbW92ZUxpc3RlbmVyKHRoaXMueGxRdWVyeUxpc3RlbmVyKTtcbiAgICAgIHRoaXMudXBwZXJYbFF1ZXJ5LnJlbW92ZUxpc3RlbmVyKHRoaXMueGxRdWVyeUxpc3RlbmVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoTWVkaWFRdWVyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChhZGRNZWRpYVF1ZXJ5KHtcbiAgICAgIG1lZGlhUXVlcnk6IHtcbiAgICAgICAgaWQsXG4gICAgICAgIHF1ZXJ5OiB0aGlzLmN1cnJlbnRNZWRpYVF1ZXJ5LFxuICAgICAgfVxuICAgIH0pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNlbGVjdE1lZGlhUXVlcnkoeyBpZCB9KSk7XG4gIH1cblxuICAvLyBDbGFzcyBtZXRob2RzLlxuXG4gIC8vIHhzXG4gIHNjcmVlblhzQ29uZGl0aW9uYWwoKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjcmVlblF1ZXJ5Lm1hdGNoZXNcbiAgICAgICAgJiYgdGhpcy51cHBlclhzUXVlcnkubWF0Y2hlcykge1xuICAgICAgICB0aGlzLm5vdGlmeVN0b3JlU2NyZWVuV2lkdGhYcygpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVN0b3JlU2NyZWVuV2lkdGhYcygpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYVF1ZXJ5ID0gc2NyZWVuV2lkdGhYcztcbiAgICB0aGlzLmRpc3BhdGNoTWVkaWFRdWVyeSgpO1xuICB9XG5cbiAgLy8gc21cbiAgc2NyZWVuU21Db25kaXRpb25hbCgpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2NyZWVuUXVlcnkubWF0Y2hlc1xuICAgICAgICAmJiB0aGlzLmxvd2VyU21RdWVyeS5tYXRjaGVzXG4gICAgICAgICYmIHRoaXMudXBwZXJTbVF1ZXJ5Lm1hdGNoZXMpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlTdG9yZVNjcmVlbldpZHRoU20oKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTdG9yZVNjcmVlbldpZHRoU20oKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWFRdWVyeSA9IHNjcmVlbldpZHRoU207XG4gICAgdGhpcy5kaXNwYXRjaE1lZGlhUXVlcnkoKTtcbiAgfVxuXG4gIC8vIG1kXG4gIHNjcmVlbk1kQ29uZGl0aW9uYWwoKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjcmVlblF1ZXJ5Lm1hdGNoZXNcbiAgICAgICAgJiYgdGhpcy5sb3dlck1kUXVlcnkubWF0Y2hlc1xuICAgICAgICAmJiB0aGlzLnVwcGVyTWRRdWVyeS5tYXRjaGVzKSB7XG4gICAgICAgIHRoaXMubm90aWZ5U3RvcmVTY3JlZW5XaWR0aE1kKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5U3RvcmVTY3JlZW5XaWR0aE1kKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudE1lZGlhUXVlcnkgPSBzY3JlZW5XaWR0aE1kO1xuICAgIHRoaXMuZGlzcGF0Y2hNZWRpYVF1ZXJ5KCk7XG4gIH1cblxuICAvLyBsZ1xuICBzY3JlZW5MZ0NvbmRpdGlvbmFsKCk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zY3JlZW5RdWVyeS5tYXRjaGVzXG4gICAgICAgICYmIHRoaXMubG93ZXJMZ1F1ZXJ5Lm1hdGNoZXNcbiAgICAgICAgJiYgdGhpcy51cHBlckxnUXVlcnkubWF0Y2hlcykge1xuICAgICAgICB0aGlzLm5vdGlmeVN0b3JlU2NyZWVuV2lkdGhMZygpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVN0b3JlU2NyZWVuV2lkdGhMZygpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYVF1ZXJ5ID0gc2NyZWVuV2lkdGhMZztcbiAgICB0aGlzLmRpc3BhdGNoTWVkaWFRdWVyeSgpO1xuICB9XG5cbiAgLy8geGxcbiAgc2NyZWVuWGxDb25kaXRpb25hbCgpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2NyZWVuUXVlcnkubWF0Y2hlc1xuICAgICAgICAmJiB0aGlzLmxvd2VyWGxRdWVyeS5tYXRjaGVzXG4gICAgICAgICYmIHRoaXMudXBwZXJYbFF1ZXJ5Lm1hdGNoZXMpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlTdG9yZVNjcmVlbldpZHRoWGwoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTdG9yZVNjcmVlbldpZHRoWGwoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWFRdWVyeSA9IHNjcmVlbldpZHRoWGw7XG4gICAgdGhpcy5kaXNwYXRjaE1lZGlhUXVlcnkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVN0YXRlKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWxpemUgdGhlIHN0b3JlIHdpdGggYSBNZWRpYVF1ZXJ5U3RhdGVJbnRlcmZhY2VcbiAgICAvLyByZWZsZWN0aW5nIHRoZSBzaXplIG9mIGN1cnJlbnQgdXNlcidzIHNjcmVlbi5cbiAgICAvLyBTaW5jZSB0aGUgbWVkaWEgZXZlbnRzIHdpbGwgbm90IGhhdmUgZmlyZWQgb24gaW5pdGlhbGl6YXRpb24sXG4gICAgLy8gd2Ugc2V0IHRoZSBzdGFydGluZyBzdGF0ZSB1c2luZyB0aGUgd2luZG93IG9iamVjdC5cbiAgICBpZiAod2luZG93LnNjcmVlbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDYwMCkge1xuICAgICAgdGhpcy5ub3RpZnlTdG9yZVNjcmVlbldpZHRoWHMoKTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5zY3JlZW4gJiYgd2luZG93LmlubmVyV2lkdGggPCA5NjAgJiYgd2luZG93LmlubmVyV2lkdGggPj0gNjAwKSB7XG4gICAgICB0aGlzLm5vdGlmeVN0b3JlU2NyZWVuV2lkdGhTbSgpO1xuICAgIH0gZWxzZSBpZiAod2luZG93LnNjcmVlbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDEyODAgJiYgd2luZG93LmlubmVyV2lkdGggPj0gOTYwKSB7XG4gICAgICB0aGlzLm5vdGlmeVN0b3JlU2NyZWVuV2lkdGhNZCgpO1xuICAgIH0gZWxzZSBpZiAod2luZG93LnNjcmVlbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDE5MjAgJiYgd2luZG93LmlubmVyV2lkdGggPj0gOTYwKSB7XG4gICAgICB0aGlzLm5vdGlmeVN0b3JlU2NyZWVuV2lkdGhMZygpO1xuICAgIH0gZWxzZSBpZiAod2luZG93LnNjcmVlbikge1xuICAgICAgdGhpcy5ub3RpZnlTdG9yZVNjcmVlbldpZHRoWGwoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==