UNPKG

ngm-masonry

Version:

Angular Module for displaying a feed of items in a masonry layout using https://github.com/glebmlk/ngx-masonry

238 lines 19.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { isPlatformBrowser } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, PLATFORM_ID, } from '@angular/core'; /** @type {?} */ var imagesLoaded; /** @type {?} */ var masonryConstructor; var NgmMasonryComponent = /** @class */ (function () { function NgmMasonryComponent(platformId, element, ngZone, changeDetectorRef) { this.platformId = platformId; this.element = element; this.ngZone = ngZone; this.changeDetectorRef = changeDetectorRef; // Inputs this.options = {}; this.useImagesLoaded = false; this.updateLayout = false; // Outputs this.layoutComplete = new EventEmitter(); this.removeComplete = new EventEmitter(); } /** * @return {?} */ NgmMasonryComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.ngZone.runOutsideAngular(function () { if (_this.useImagesLoaded && imagesLoaded === undefined) { imagesLoaded = require('imagesloaded'); } if (isPlatformBrowser(_this.platformId) && masonryConstructor === undefined) { masonryConstructor = require('masonry-layout'); } // Create masonry options object if (!_this.options) { _this.options = {}; } // Set default itemSelector if (!_this.options.itemSelector) { _this.options.itemSelector = '[ngmMasonryItem], ngmMasonryItem'; } if (isPlatformBrowser(_this.platformId)) { // Initialize Masonry _this._msnry = new masonryConstructor(_this.element.nativeElement, _this.options); // Bind to events _this._msnry.on('layoutComplete', function (items) { _this.layoutComplete.emit(items); _this.changeDetectorRef.markForCheck(); }); _this._msnry.on('removeComplete', function (items) { _this.removeComplete.emit(items); _this.changeDetectorRef.markForCheck(); }); } }); }; /** * @param {?} changes * @return {?} */ NgmMasonryComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { // only update layout if it's not the first change if (changes.updateLayout) { if (!changes.updateLayout.firstChange) { this.layout(); } } }; /** * @return {?} */ NgmMasonryComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this._msnry) { this._msnry.destroy(); } }; /** * @return {?} */ NgmMasonryComponent.prototype.layout = /** * @return {?} */ function () { var _this = this; requestAnimationFrame(function () { _this._msnry.layout(); _this.changeDetectorRef.markForCheck(); }); }; /** * @return {?} */ NgmMasonryComponent.prototype.reloadItems = /** * @return {?} */ function () { var _this = this; requestAnimationFrame(function () { _this._msnry.reloadItems(); _this.changeDetectorRef.markForCheck(); }); }; // public add(element: HTMLElement, prepend: boolean = false) { // public add(element: HTMLElement, prepend: boolean = false) { /** * @param {?} element * @return {?} */ NgmMasonryComponent.prototype.add = // public add(element: HTMLElement, prepend: boolean = false) { /** * @param {?} element * @return {?} */ function (element) { var _this = this; this.ngZone.runOutsideAngular(function () { /** @type {?} */ var isFirstItem = false; // Check if first item if (_this._msnry.items.length === 0) { isFirstItem = true; } if (_this.useImagesLoaded) { imagesLoaded(element, function (instance) { _this.element.nativeElement.appendChild(element); // Tell Masonry that a child element has been added setTimeout(function () { _this._msnry.appended(element); _this.changeDetectorRef.markForCheck(); }); // layout if first item if (isFirstItem) { _this.layout(); } }); _this.element.nativeElement.removeChild(element); } else { // Tell Masonry that a child element has been added setTimeout(function () { _this._msnry.appended(element); _this.changeDetectorRef.markForCheck(); }); // layout if first item if (isFirstItem) { _this.layout(); } } }); }; /** * @param {?} element * @return {?} */ NgmMasonryComponent.prototype.remove = /** * @param {?} element * @return {?} */ function (element) { // Tell Masonry that a child element has been removed this._msnry.remove(element); // Layout items this.layout(); }; NgmMasonryComponent.decorators = [ { type: Component, args: [{ selector: '[ngm-masonry], ngm-masonry', template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, styles: ["\n :host {\n display: block;\n }\n "] }] } ]; /** @nocollapse */ NgmMasonryComponent.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: ElementRef }, { type: NgZone }, { type: ChangeDetectorRef } ]; }; NgmMasonryComponent.propDecorators = { options: [{ type: Input }], useImagesLoaded: [{ type: Input }], updateLayout: [{ type: Input }], layoutComplete: [{ type: Output }], removeComplete: [{ type: Output }] }; return NgmMasonryComponent; }()); export { NgmMasonryComponent }; if (false) { /** @type {?} */ NgmMasonryComponent.prototype._msnry; /** @type {?} */ NgmMasonryComponent.prototype.options; /** @type {?} */ NgmMasonryComponent.prototype.useImagesLoaded; /** @type {?} */ NgmMasonryComponent.prototype.updateLayout; /** @type {?} */ NgmMasonryComponent.prototype.layoutComplete; /** @type {?} */ NgmMasonryComponent.prototype.removeComplete; /** * @type {?} * @private */ NgmMasonryComponent.prototype.platformId; /** * @type {?} * @private */ NgmMasonryComponent.prototype.element; /** * @type {?} * @private */ NgmMasonryComponent.prototype.ngZone; /** * @type {?} * @private */ NgmMasonryComponent.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdtLW1hc29ucnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmdtLW1hc29ucnkvIiwic291cmNlcyI6WyJuZ20tbWFzb25yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEdBRWQsTUFBTSxlQUFlLENBQUM7O0lBR25CLFlBQWlCOztJQUNqQixrQkFBdUI7QUFJM0I7SUFhSSw2QkFDMEMsVUFBZSxFQUNwQyxPQUFtQixFQUNuQixNQUFjLEVBQ2QsaUJBQW9DO1FBSGYsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COztRQU16QyxZQUFPLEdBQXVCLEVBQUUsQ0FBQztRQUNqQyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUN4QyxpQkFBWSxHQUFZLEtBQUssQ0FBQzs7UUFHN0IsbUJBQWMsR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNoRSxtQkFBYyxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO0lBWHZFLENBQUM7Ozs7SUFhSixzQ0FBUTs7O0lBQVI7UUFBQSxpQkFzQ0M7UUFyQ0csSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUMxQixJQUFJLEtBQUksQ0FBQyxlQUFlLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDcEQsWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUMxQztZQUVELElBQUksaUJBQWlCLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FB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LE1BQU07Z0JBTk4saUJBQWlCOzs7MEJBNENoQixLQUFLO2tDQUNMLEtBQUs7K0JBQ0wsS0FBSztpQ0FHTCxNQUFNO2lDQUNOLE1BQU07O0lBd0hYLDBCQUFDO0NBQUEsQUFySkQsSUFxSkM7U0F6SVksbUJBQW1COzs7SUFRNUIscUNBQW1COztJQUduQixzQ0FBaUQ7O0lBQ2pELDhDQUFpRDs7SUFDakQsMkNBQXVDOztJQUd2Qyw2Q0FBMEU7O0lBQzFFLDZDQUEwRTs7Ozs7SUFmdEUseUNBQXFEOzs7OztJQUNyRCxzQ0FBb0M7Ozs7O0lBQ3BDLHFDQUErQjs7Ozs7SUFDL0IsZ0RBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIHZhciByZXF1aXJlOiBhbnk7XG5sZXQgaW1hZ2VzTG9hZGVkOiBhbnk7XG5sZXQgbWFzb25yeUNvbnN0cnVjdG9yOiBhbnk7XG5cbmltcG9ydCB7SU5nbU1hc29ucnlPcHRpb25zfSBmcm9tICcuL25nbS1tYXNvbnJ5LW9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1tuZ20tbWFzb25yeV0sIG5nbS1tYXNvbnJ5JyxcbiAgICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmdtTWFzb25yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgX21zbnJ5OiBhbnk7XG5cbiAgICAvLyBJbnB1dHNcbiAgICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogSU5nbU1hc29ucnlPcHRpb25zID0ge307XG4gICAgQElucHV0KCkgcHVibGljIHVzZUltYWdlc0xvYWRlZDogQm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHVwZGF0ZUxheW91dDogQm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gT3V0cHV0c1xuICAgIEBPdXRwdXQoKSBsYXlvdXRDb21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZUNvbXBsZXRlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VJbWFnZXNMb2FkZWQgJiYgaW1hZ2VzTG9hZGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpbWFnZXNMb2FkZWQgPSByZXF1aXJlKCdpbWFnZXNsb2FkZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgbWFzb25yeUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtYXNvbnJ5Q29uc3RydWN0b3IgPSByZXF1aXJlKCdtYXNvbnJ5LWxheW91dCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgbWFzb25yeSBvcHRpb25zIG9iamVjdFxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHQgaXRlbVNlbGVjdG9yXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtU2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yID0gJ1tuZ21NYXNvbnJ5SXRlbV0sIG5nbU1hc29ucnlJdGVtJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIE1hc29ucnlcbiAgICAgICAgICAgICAgICB0aGlzLl9tc25yeSA9IG5ldyBtYXNvbnJ5Q29uc3RydWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIEJpbmQgdG8gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5fbXNucnkub24oJ2xheW91dENvbXBsZXRlJywgKGl0ZW1zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb21wbGV0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tc25yeS5vbigncmVtb3ZlQ29tcGxldGUnLCAoaXRlbXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNvbXBsZXRlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIGxheW91dCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgY2hhbmdlXG4gICAgICAgIGlmIChjaGFuZ2VzLnVwZGF0ZUxheW91dCkge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2VzLnVwZGF0ZUxheW91dC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21zbnJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9tc25yeS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGF5b3V0KCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbXNucnkubGF5b3V0KCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkSXRlbXMoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tc25yeS5yZWxvYWRJdGVtcygpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcHVibGljIGFkZChlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlcGVuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgcHVibGljIGFkZChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNGaXJzdEl0ZW0gPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlyc3QgaXRlbVxuICAgICAgICAgICAgaWYgKHRoaXMuX21zbnJ5Lml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlzRmlyc3RJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudXNlSW1hZ2VzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VzTG9hZGVkKGVsZW1lbnQsIChpbnN0YW5jZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgTWFzb25yeSB0aGF0IGEgY2hpbGQgZWxlbWVudCBoYXMgYmVlbiBhZGRlZFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zbnJ5LmFwcGVuZGVkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0IGlmIGZpcnN0IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3RJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21zbnJ5LmFwcGVuZGVkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gbGF5b3V0IGlmIGZpcnN0IGl0ZW1cbiAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWRcbiAgICAgICAgdGhpcy5fbXNucnkucmVtb3ZlKGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIExheW91dCBpdGVtc1xuICAgICAgICB0aGlzLmxheW91dCgpO1xuICAgIH1cbn1cbiJdfQ==