UNPKG

@bloomscorp/ngx-pixel

Version:

An Angular library to simplify the use of a Facebook Pixel. This is directly forked from https://github.com/NielsCodes/ngx-pixel since the library is no longer maintained.

152 lines 17.9 kB
import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core'; import { NavigationEnd } from '@angular/router'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { filter } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; export class PixelService { constructor(config, injectedDocument, platformId, router, rendererFactory) { this.config = config; this.injectedDocument = injectedDocument; this.platformId = platformId; this.router = router; this.rendererFactory = rendererFactory; // DOCUMENT cannot be injected directly as Document type, see https://github.com/angular/angular/issues/20351 // It is therefore injected as any and then cast to Document this.doc = injectedDocument; this.renderer = rendererFactory.createRenderer(null, null); if (router) { // Log page views after router navigation ends router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(event => { if (this.isLoaded()) { this.track('PageView'); } }); } } /** * Initialize the Pixel tracking script * - Adds the script to page's head * - Tracks first page view */ initialize(pixelId = this.config.pixelId) { if (this.isLoaded()) { console.warn('Tried to initialize a Pixel instance while another is already active. Please call `remove()` before initializing a new instance.'); return; } this.config.enabled = true; this.addPixelScript(pixelId); } /** Remove the Pixel tracking script */ remove() { this.removePixelScript(); this.config.enabled = false; } /** * Track a Standard Event as predefined by Facebook * * See {@link https://developers.facebook.com/docs/facebook-pixel/reference Facebook Pixel docs - reference} * @param eventName The name of the event that is being tracked * @param properties Optional properties of the event */ track(eventName, properties) { if (!isPlatformBrowser(this.platformId)) { return; } if (!this.isLoaded()) { console.warn('Tried to track an event without initializing a Pixel instance. Call `initialize()` first.'); return; } if (properties) { fbq('track', eventName, properties); } else { fbq('track', eventName); } } /** * Track a custom Event * * See {@link https://developers.facebook.com/docs/facebook-pixel/implementation/conversion-tracking#custom-conversions Facebook Pixel docs - custom conversions} * @param eventName The name of the event that is being tracked * @param properties Optional properties of the event */ trackCustom(eventName, properties) { if (!isPlatformBrowser(this.platformId)) { return; } if (!this.isLoaded()) { console.warn('Tried to track an event without initializing a Pixel instance. Call `initialize()` first.'); return; } if (properties) { fbq('trackCustom', eventName, properties); } else { fbq('trackCustom', eventName); } } /** * Adds the Facebook Pixel tracking script to the application * @param pixelId The Facebook Pixel ID to use */ addPixelScript(pixelId) { if (!isPlatformBrowser(this.platformId)) { return; } const pixelCode = ` var pixelCode = function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '${pixelId}'); fbq('track', 'PageView');`; const scriptElement = this.renderer.createElement('script'); this.renderer.setAttribute(scriptElement, 'id', 'pixel-script'); this.renderer.setAttribute(scriptElement, 'type', 'text/javascript'); this.renderer.setProperty(scriptElement, 'innerHTML', pixelCode); this.renderer.appendChild(this.doc.head, scriptElement); } /** Remove Facebook Pixel tracking script from the application */ removePixelScript() { if (!isPlatformBrowser(this.platformId)) { return; } const pixelElement = this.doc.getElementById('pixel-script'); if (pixelElement) { pixelElement.remove(); } } /** Checks if the script element is present */ isLoaded() { if (isPlatformBrowser(this.platformId)) { const pixelElement = this.doc.getElementById('pixel-script'); return !!pixelElement; } return false; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PixelService, deps: [{ token: 'config' }, { token: DOCUMENT }, { token: PLATFORM_ID }, { token: i1.Router, optional: true }, { token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PixelService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PixelService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: ['config'] }] }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: i1.Router, decorators: [{ type: Optional }] }, { type: i0.RendererFactory2 }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl4ZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3BpeGVsL3NyYy9saWIvcGl4ZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsYUFBYSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBT3hDLE1BQU0sT0FBTyxZQUFZO0lBS3ZCLFlBQzRCLE1BQTBCLEVBQzFCLGdCQUFxQixFQUNsQixVQUFrQixFQUMzQixNQUFjLEVBQzFCLGVBQWlDO1FBSmYsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFLO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUMxQixvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFHekMsNkdBQTZHO1FBQzdHLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsR0FBRyxHQUFHLGdCQUE0QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFM0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLDhDQUE4QztZQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFlBQVksYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBRXBGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7WUFFSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFFSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQ3RDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxrSUFBa0ksQ0FBQyxDQUFDO1lBQ2pKLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxNQUFNO1FBQ0osSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQ0gsU0FBeUIsRUFDekIsVUFBaUM7UUFFakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkZBQTJGLENBQUMsQ0FBQztZQUMxRyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUVILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsU0FBaUIsRUFBRSxVQUFtQjtRQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQywyRkFBMkYsQ0FBQyxDQUFDO1lBQzFHLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLEdBQUcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHOzs7Ozs7Ozs7bUJBU0gsT0FBTzs4QkFDSSxDQUFDO1FBRzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGlFQUFpRTtJQUN6RCxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCw4Q0FBOEM7SUFDdEMsUUFBUTtRQUNkLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0QsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OEdBdEpVLFlBQVksa0JBTWIsUUFBUSxhQUNSLFFBQVEsYUFDUixXQUFXO2tIQVJWLFlBQVksY0FGWCxNQUFNOzsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBT0ksTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXhlbEV2ZW50TmFtZSwgUGl4ZWxDb25maWd1cmF0aW9uLCBQaXhlbEV2ZW50UHJvcGVydGllcyB9IGZyb20gJy4vcGl4ZWwubW9kZWxzJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIFBMQVRGT1JNX0lELCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5kZWNsYXJlIGNvbnN0IGZicTogYW55O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQaXhlbFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgZG9jOiBEb2N1bWVudDtcbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IFBpeGVsQ29uZmlndXJhdGlvbixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGluamVjdGVkRG9jdW1lbnQ6IGFueSxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyXG4gICkge1xuXG4gICAgLy8gRE9DVU1FTlQgY2Fubm90IGJlIGluamVjdGVkIGRpcmVjdGx5IGFzIERvY3VtZW50IHR5cGUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDM1MVxuICAgIC8vIEl0IGlzIHRoZXJlZm9yZSBpbmplY3RlZCBhcyBhbnkgYW5kIHRoZW4gY2FzdCB0byBEb2N1bWVudFxuICAgIHRoaXMuZG9jID0gaW5qZWN0ZWREb2N1bWVudCBhcyBEb2N1bWVudDtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuXG4gICAgaWYgKHJvdXRlcikge1xuICAgICAgLy8gTG9nIHBhZ2Ugdmlld3MgYWZ0ZXIgcm91dGVyIG5hdmlnYXRpb24gZW5kc1xuICAgICAgcm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuXG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICB0aGlzLnRyYWNrKCdQYWdlVmlldycpO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIFBpeGVsIHRyYWNraW5nIHNjcmlwdFxuICAgKiAtIEFkZHMgdGhlIHNjcmlwdCB0byBwYWdlJ3MgaGVhZFxuICAgKiAtIFRyYWNrcyBmaXJzdCBwYWdlIHZpZXdcbiAgICovXG4gIGluaXRpYWxpemUocGl4ZWxJZCA9IHRoaXMuY29uZmlnLnBpeGVsSWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0xvYWRlZCgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RyaWVkIHRvIGluaXRpYWxpemUgYSBQaXhlbCBpbnN0YW5jZSB3aGlsZSBhbm90aGVyIGlzIGFscmVhZHkgYWN0aXZlLiBQbGVhc2UgY2FsbCBgcmVtb3ZlKClgIGJlZm9yZSBpbml0aWFsaXppbmcgYSBuZXcgaW5zdGFuY2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuYWRkUGl4ZWxTY3JpcHQocGl4ZWxJZCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIHRoZSBQaXhlbCB0cmFja2luZyBzY3JpcHQgKi9cbiAgcmVtb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlUGl4ZWxTY3JpcHQoKTtcbiAgICB0aGlzLmNvbmZpZy5lbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYSBTdGFuZGFyZCBFdmVudCBhcyBwcmVkZWZpbmVkIGJ5IEZhY2Vib29rXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9kb2NzL2ZhY2Vib29rLXBpeGVsL3JlZmVyZW5jZSBGYWNlYm9vayBQaXhlbCBkb2NzIC0gcmVmZXJlbmNlfVxuICAgKiBAcGFyYW0gZXZlbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0aGF0IGlzIGJlaW5nIHRyYWNrZWRcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgT3B0aW9uYWwgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRcbiAgICovXG4gIHRyYWNrKFxuICAgIGV2ZW50TmFtZTogUGl4ZWxFdmVudE5hbWUsXG4gICAgcHJvcGVydGllcz86IFBpeGVsRXZlbnRQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0xvYWRlZCgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RyaWVkIHRvIHRyYWNrIGFuIGV2ZW50IHdpdGhvdXQgaW5pdGlhbGl6aW5nIGEgUGl4ZWwgaW5zdGFuY2UuIENhbGwgYGluaXRpYWxpemUoKWAgZmlyc3QuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIGZicSgndHJhY2snLCBldmVudE5hbWUsIHByb3BlcnRpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYnEoJ3RyYWNrJywgZXZlbnROYW1lKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBhIGN1c3RvbSBFdmVudFxuICAgKlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vZG9jcy9mYWNlYm9vay1waXhlbC9pbXBsZW1lbnRhdGlvbi9jb252ZXJzaW9uLXRyYWNraW5nI2N1c3RvbS1jb252ZXJzaW9ucyBGYWNlYm9vayBQaXhlbCBkb2NzIC0gY3VzdG9tIGNvbnZlcnNpb25zfVxuICAgKiBAcGFyYW0gZXZlbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0aGF0IGlzIGJlaW5nIHRyYWNrZWRcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgT3B0aW9uYWwgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRcbiAgICovXG4gIHRyYWNrQ3VzdG9tKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzTG9hZGVkKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybignVHJpZWQgdG8gdHJhY2sgYW4gZXZlbnQgd2l0aG91dCBpbml0aWFsaXppbmcgYSBQaXhlbCBpbnN0YW5jZS4gQ2FsbCBgaW5pdGlhbGl6ZSgpYCBmaXJzdC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgZmJxKCd0cmFja0N1c3RvbScsIGV2ZW50TmFtZSwgcHJvcGVydGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZicSgndHJhY2tDdXN0b20nLCBldmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBGYWNlYm9vayBQaXhlbCB0cmFja2luZyBzY3JpcHQgdG8gdGhlIGFwcGxpY2F0aW9uXG4gICAqIEBwYXJhbSBwaXhlbElkIFRoZSBGYWNlYm9vayBQaXhlbCBJRCB0byB1c2VcbiAgICovXG4gIHByaXZhdGUgYWRkUGl4ZWxTY3JpcHQocGl4ZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGl4ZWxDb2RlID0gYFxuICAgIHZhciBwaXhlbENvZGUgPSBmdW5jdGlvbihmLGIsZSx2LG4sdCxzKVxuICAgIHtpZihmLmZicSlyZXR1cm47bj1mLmZicT1mdW5jdGlvbigpe24uY2FsbE1ldGhvZD9cbiAgICBuLmNhbGxNZXRob2QuYXBwbHkobixhcmd1bWVudHMpOm4ucXVldWUucHVzaChhcmd1bWVudHMpfTtcbiAgICBpZighZi5fZmJxKWYuX2ZicT1uO24ucHVzaD1uO24ubG9hZGVkPSEwO24udmVyc2lvbj0nMi4wJztcbiAgICBuLnF1ZXVlPVtdO3Q9Yi5jcmVhdGVFbGVtZW50KGUpO3QuYXN5bmM9ITA7XG4gICAgdC5zcmM9djtzPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSlbMF07XG4gICAgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHMpfSh3aW5kb3csIGRvY3VtZW50LCdzY3JpcHQnLFxuICAgICdodHRwczovL2Nvbm5lY3QuZmFjZWJvb2submV0L2VuX1VTL2ZiZXZlbnRzLmpzJyk7XG4gICAgZmJxKCdpbml0JywgJyR7cGl4ZWxJZH0nKTtcbiAgICBmYnEoJ3RyYWNrJywgJ1BhZ2VWaWV3Jyk7YDtcblxuXG4gICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoc2NyaXB0RWxlbWVudCwgJ2lkJywgJ3BpeGVsLXNjcmlwdCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHNjcmlwdEVsZW1lbnQsICd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoc2NyaXB0RWxlbWVudCwgJ2lubmVySFRNTCcsIHBpeGVsQ29kZSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvYy5oZWFkLCBzY3JpcHRFbGVtZW50KTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgRmFjZWJvb2sgUGl4ZWwgdHJhY2tpbmcgc2NyaXB0IGZyb20gdGhlIGFwcGxpY2F0aW9uICovXG4gIHByaXZhdGUgcmVtb3ZlUGl4ZWxTY3JpcHQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBpeGVsRWxlbWVudCA9IHRoaXMuZG9jLmdldEVsZW1lbnRCeUlkKCdwaXhlbC1zY3JpcHQnKTtcbiAgICBpZiAocGl4ZWxFbGVtZW50KSB7XG4gICAgICBwaXhlbEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgc2NyaXB0IGVsZW1lbnQgaXMgcHJlc2VudCAqL1xuICBwcml2YXRlIGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICBjb25zdCBwaXhlbEVsZW1lbnQgPSB0aGlzLmRvYy5nZXRFbGVtZW50QnlJZCgncGl4ZWwtc2NyaXB0Jyk7XG4gICAgICByZXR1cm4gISFwaXhlbEVsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG59XG4iXX0=