UNPKG

said-ngx-paypal

Version:
408 lines 36.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, } from '@angular/core'; import { Subject } from 'rxjs'; import { PayPalScriptService } from '../services/paypal-script.service'; export class NgxPaypalComponent { /** * @param {?} paypalScriptService * @param {?} cdr * @param {?} ngZone */ constructor(paypalScriptService, cdr, ngZone) { this.paypalScriptService = paypalScriptService; this.cdr = cdr; this.ngZone = ngZone; /** * If enabled, paypal SDK script will be loaded. Useful if you want to have multiple PayPal components on the same page * sharing base configuration. In such a case only a single component may register script. */ this.registerScript = true; /** * Emitted when paypal script is loaded */ this.scriptLoaded = new EventEmitter(); this.scriptLoadError = new EventEmitter(); this.ngUnsubscribe = new Subject(); /** * Flag that indicates if paypal should be initialized (required for handling script load events and availability of DOM element) */ this.initializePayPal = true; } /** * @param {?} content * @return {?} */ set payPalButtonContainer(content) { this.payPalButtonContainerElem = content; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (!this.payPalButtonContainerId) { this.payPalButtonContainerId = this.generateElementId(); } // first time config setup /** @type {?} */ const config = this.config; if (changes.config.isFirstChange()) { if (config && this.registerScript) { this.initPayPalScript(config, (/** * @param {?} payPal * @return {?} */ (payPal) => { // store reference to paypal global script this.payPal = payPal; this.doPayPalCheck(); })); } } // changes to config if (!changes.config.isFirstChange()) { this.reinitialize(config); } } /** * @return {?} */ ngOnDestroy() { this.paypalScriptService.destroyPayPalScript(); this.ngUnsubscribe.next(); this.ngUnsubscribe.complete(); } /** * @return {?} */ ngAfterViewInit() { this.doPayPalCheck(); } /** * @param {?} payPal * @return {?} */ customInit(payPal) { this.payPal = payPal; this.doPayPalCheck(); } /** * @param {?} config * @return {?} */ reinitialize(config) { this.config = config; this.payPal = undefined; this.paypalScriptService.destroyPayPalScript(); this.payPalButtonContainerId = this.generateElementId(); this.initializePayPal = true; if (this.payPalButtonContainerElem) { while (this.payPalButtonContainerElem.nativeElement.firstChild) { this.payPalButtonContainerElem.nativeElement.removeChild(this.payPalButtonContainerElem.nativeElement.firstChild); } } this.cdr.detectChanges(); if (this.config) { if (!this.payPal) { this.initPayPalScript(this.config, (/** * @param {?} payPal * @return {?} */ (payPal) => { // store reference to paypal global script this.payPal = payPal; this.doPayPalCheck(); })); } else { this.doPayPalCheck(); } } } /** * @private * @return {?} */ doPayPalCheck() { if (this.initializePayPal && this.config && this.payPal && this.payPalButtonContainerElem) { // make sure that id is also set if (this.payPalButtonContainerElem.nativeElement.id) { this.initializePayPal = false; this.initPayPal(this.config, this.payPal); } } } /** * @private * @param {?} config * @param {?} initPayPal * @return {?} */ initPayPalScript(config, initPayPal) { this.paypalScriptService.registerPayPalScript({ clientId: config.clientId, commit: config.advanced && config.advanced.commit ? config.advanced.commit : undefined, currency: config.currency, extraParams: config.advanced && config.advanced.extraQueryParams ? config.advanced.extraQueryParams : [] }, (/** * @param {?} paypal * @return {?} */ (paypal) => { this.scriptLoaded.next(paypal); initPayPal(paypal); }), (/** * @param {?} scriptSrc * @return {?} */ (scriptSrc) => { this.scriptLoadError.emit(scriptSrc); })); } /** * @private * @return {?} */ generateElementId() { return `ngx-captcha-id-${new Date().valueOf()}`; } /** * @private * @param {?} config * @param {?} paypal * @return {?} */ initPayPal(config, paypal) { // Running outside angular zone prevents infinite ngDoCheck lifecycle calls this.ngZone.runOutsideAngular((/** * @return {?} */ () => { // https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page paypal.Buttons({ style: config.style, createOrder: (/** * @param {?} data * @param {?} actions * @return {?} */ (data, actions) => { return this.ngZone.run((/** * @return {?} */ () => { if (config.createOrderOnClient && config.createOrderOnServer) { throw Error(`Both 'createOrderOnClient' and 'createOrderOnServer' are defined. Please choose one or the other.`); } if (!config.createOrderOnClient && !config.createOrderOnServer) { throw Error(`Neither 'createOrderOnClient' or 'createOrderOnServer' are defined. Please define one of these to create order.`); } if (config.createOrderOnClient) { return actions.order.create(config.createOrderOnClient(data)); } if (config.createOrderOnServer) { return config.createOrderOnServer(data); } throw Error(`Invalid state for 'createOrder'.`); })); }), onApprove: (/** * @param {?} data * @param {?} actions * @return {?} */ (data, actions) => { return this.ngZone.run((/** * @return {?} */ () => { if (config.onApprove) { config.onApprove(data, actions); } // capture on server if (config.authorizeOnServer) { return config.authorizeOnServer(data, actions); } // capture on client /** @type {?} */ const onClientAuthorization = config.onClientAuthorization; if (onClientAuthorization) { actions.order.capture().then((/** * @param {?} details * @return {?} */ (details) => { onClientAuthorization(details); })); return; } })); }), onError: (/** * @param {?} error * @return {?} */ (error) => { this.ngZone.run((/** * @return {?} */ () => { if (config.onError) { config.onError(error); } })); }), onCancel: (/** * @param {?} data * @param {?} actions * @return {?} */ (data, actions) => { this.ngZone.run((/** * @return {?} */ () => { if (config.onCancel) { config.onCancel(data, actions); } })); }), onShippingChange: (/** * @param {?} data * @param {?} actions * @return {?} */ (data, actions) => { return this.ngZone.run((/** * @return {?} */ () => { if (config.onShippingChange) { return config.onShippingChange(data, actions); } })); }), onClick: (/** * @param {?} data * @param {?} actions * @return {?} */ (data, actions) => { this.ngZone.run((/** * @return {?} */ () => { if (config.onClick) { config.onClick(data, actions); } })); }), onInit: (/** * @param {?} data * @param {?} actions * @return {?} */ (data, actions) => { this.ngZone.run((/** * @return {?} */ () => { if (config.onInit) { config.onInit(data, actions); } })); }) }).render(`#${this.payPalButtonContainerId}`); })); } } NgxPaypalComponent.decorators = [ { type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngx-paypal', template: ` <div #payPalButtonContainer [id]="payPalButtonContainerId"></div> ` }] } ]; /** @nocollapse */ NgxPaypalComponent.ctorParameters = () => [ { type: PayPalScriptService }, { type: ChangeDetectorRef }, { type: NgZone } ]; NgxPaypalComponent.propDecorators = { config: [{ type: Input }], registerScript: [{ type: Input }], scriptLoaded: [{ type: Output }], scriptLoadError: [{ type: Output }], payPalButtonContainer: [{ type: ViewChild, args: ['payPalButtonContainer', { static: false },] }] }; if (false) { /** * Configuration for paypal. * @type {?} */ NgxPaypalComponent.prototype.config; /** * If enabled, paypal SDK script will be loaded. Useful if you want to have multiple PayPal components on the same page * sharing base configuration. In such a case only a single component may register script. * @type {?} */ NgxPaypalComponent.prototype.registerScript; /** * Emitted when paypal script is loaded * @type {?} */ NgxPaypalComponent.prototype.scriptLoaded; /** @type {?} */ NgxPaypalComponent.prototype.scriptLoadError; /** * Id of the element where PayPal button will be rendered * @type {?} */ NgxPaypalComponent.prototype.payPalButtonContainerId; /** * @type {?} * @private */ NgxPaypalComponent.prototype.ngUnsubscribe; /** * @type {?} * @private */ NgxPaypalComponent.prototype.payPalButtonContainerElem; /** * Flag that indicates if paypal should be initialized (required for handling script load events and availability of DOM element) * @type {?} * @private */ NgxPaypalComponent.prototype.initializePayPal; /** * Reference to PayPal global API * @type {?} * @private */ NgxPaypalComponent.prototype.payPal; /** * @type {?} * @private */ NgxPaypalComponent.prototype.paypalScriptService; /** * @type {?} * @private */ NgxPaypalComponent.prototype.cdr; /** * @type {?} * @private */ NgxPaypalComponent.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5cGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NhaWQtbmd4LXBheXBhbC8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3BheXBhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZS9CLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBU3hFLE1BQU0sT0FBTyxrQkFBa0I7Ozs7OztJQXlDM0IsWUFDWSxtQkFBd0MsRUFDeEMsR0FBc0IsRUFDdEIsTUFBYztRQUZkLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTs7Ozs7UUFqQ2pCLG1CQUFjLEdBQVksSUFBSSxDQUFDOzs7O1FBSzlCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN2QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFPdEMsa0JBQWEsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQzs7OztRQVU1RCxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7SUFZekMsQ0FBQzs7Ozs7SUFuQkQsSUFBMkQscUJBQXFCLENBQUMsT0FBbUI7UUFDaEcsSUFBSSxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQztJQUM3QyxDQUFDOzs7OztJQW1CRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUMvQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlCQUFp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Q0FBaUQ7O0lBQ2pELDZDQUF1RDs7Ozs7SUFLdkQscURBQXdDOzs7OztJQUV4QywyQ0FBb0U7Ozs7O0lBRXBFLHVEQUErQzs7Ozs7O0lBUS9DLDhDQUF5Qzs7Ozs7O0lBS3pDLG9DQUFvQjs7Ozs7SUFHaEIsaURBQWdEOzs7OztJQUNoRCxpQ0FBOEI7Ozs7O0lBQzlCLG9DQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE5nWm9uZSxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE91dHB1dCxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBJQ2FuY2VsQ2FsbGJhY2tEYXRhLFxyXG4gICAgSUNsaWVudEF1dGhvcml6ZUNhbGxiYWNrRGF0YSxcclxuICAgIElDcmVhdGVPcmRlckNhbGxiYWNrQWN0aW9ucyxcclxuICAgIElJbml0Q2FsbGJhY2tEYXRhLFxyXG4gICAgSU9uQXBwcm92ZUNhbGxiYWNrQWN0aW9ucyxcclxuICAgIElPbkFwcHJvdmVDYWxsYmFja0RhdGEsXHJcbiAgICBJT25DbGlja0NhbGxiYWNrQWN0aW9ucyxcclxuICAgIElPbkluaXRDYWxsYmFja0FjdGlvbnMsXHJcbiAgICBJT25TaGlwcGluZ0NoYW5nZUFjdGlvbnMsXHJcbiAgICBJT25TaGlwcGluZ0NoYW5nZURhdGEsXHJcbiAgICBJUGF5UGFsQ29uZmlnLFxyXG59IGZyb20gJy4uL21vZGVscy9wYXlwYWwtbW9kZWxzJztcclxuaW1wb3J0IHsgUGF5UGFsU2NyaXB0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BheXBhbC1zY3JpcHQuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgc2VsZWN0b3I6ICduZ3gtcGF5cGFsJyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2ICNwYXlQYWxCdXR0b25Db250YWluZXIgW2lkXT1cInBheVBhbEJ1dHRvbkNvbnRhaW5lcklkXCI+PC9kaXY+XHJcbiAgICBgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hQYXlwYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBwYXlwYWwuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGNvbmZpZz86IElQYXlQYWxDb25maWc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBlbmFibGVkLCBwYXlwYWwgU0RLIHNjcmlwdCB3aWxsIGJlIGxvYWRlZC4gVXNlZnVsIGlmIHlvdSB3YW50IHRvIGhhdmUgbXVsdGlwbGUgUGF5UGFsIGNvbXBvbmVudHMgb24gdGhlIHNhbWUgcGFnZVxyXG4gICAgICogc2hhcmluZyBiYXNlIGNvbmZpZ3VyYXRpb24uIEluIHN1Y2ggYSBjYXNlIG9ubHkgYSBzaW5nbGUgY29tcG9uZW50IG1heSByZWdpc3RlciBzY3JpcHQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHJlZ2lzdGVyU2NyaXB0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXR0ZWQgd2hlbiBwYXlwYWwgc2NyaXB0IGlzIGxvYWRlZFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgc2NyaXB0TG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgc2NyaXB0TG9hZEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBvZiB0aGUgZWxlbWVudCB3aGVyZSBQYXlQYWwgYnV0dG9uIHdpbGwgYmUgcmVuZGVyZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBheVBhbEJ1dHRvbkNvbnRhaW5lcklkPzogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBwYXlQYWxCdXR0b25Db250YWluZXJFbGVtPzogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3BheVBhbEJ1dHRvbkNvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSBzZXQgcGF5UGFsQnV0dG9uQ29udGFpbmVyKGNvbnRlbnQ6IEVsZW1lbnRSZWYpIHtcclxuICAgICAgICB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0gPSBjb250ZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmxhZyB0aGF0IGluZGljYXRlcyBpZiBwYXlwYWwgc2hvdWxkIGJlIGluaXRpYWxpemVkIChyZXF1aXJlZCBmb3IgaGFuZGxpbmcgc2NyaXB0IGxvYWQgZXZlbnRzIGFuZCBhdmFpbGFiaWxpdHkgb2YgRE9NIGVsZW1lbnQpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVBheVBhbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZlcmVuY2UgdG8gUGF5UGFsIGdsb2JhbCBBUElcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwYXlQYWw6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHBheXBhbFNjcmlwdFNlcnZpY2U6IFBheVBhbFNjcmlwdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVySWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJJZCA9IHRoaXMuZ2VuZXJhdGVFbGVtZW50SWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZpcnN0IHRpbWUgY29uZmlnIHNldHVwXHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzLmNvbmZpZy5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiB0aGlzLnJlZ2lzdGVyU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYXlQYWxTY3JpcHQoY29uZmlnLCAocGF5UGFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgcmVmZXJlbmNlIHRvIHBheXBhbCBnbG9iYWwgc2NyaXB0XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXlQYWwgPSBwYXlQYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hhbmdlcyB0byBjb25maWdcclxuICAgICAgICBpZiAoIWNoYW5nZXMuY29uZmlnLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlaW5pdGlhbGl6ZShjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBheXBhbFNjcmlwdFNlcnZpY2UuZGVzdHJveVBheVBhbFNjcmlwdCgpO1xyXG4gICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZG9QYXlQYWxDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUluaXQocGF5UGFsOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBheVBhbCA9IHBheVBhbDtcclxuICAgICAgICB0aGlzLmRvUGF5UGFsQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICByZWluaXRpYWxpemUoY29uZmlnOiBJUGF5UGFsQ29uZmlnIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgdGhpcy5wYXlQYWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wYXlwYWxTY3JpcHRTZXJ2aWNlLmRlc3Ryb3lQYXlQYWxTY3JpcHQoKTtcclxuICAgICAgICB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lcklkID0gdGhpcy5nZW5lcmF0ZUVsZW1lbnRJZCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVBheVBhbCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0pIHtcclxuICAgICAgICAgICAgd2hpbGUgKHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMucGF5UGFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYXlQYWxTY3JpcHQodGhpcy5jb25maWcsIChwYXlQYWwpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgcmVmZXJlbmNlIHRvIHBheXBhbCBnbG9iYWwgc2NyaXB0XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXlQYWwgPSBwYXlQYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG9QYXlQYWxDaGVjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIGRvUGF5UGFsQ2hlY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZVBheVBhbCAmJiB0aGlzLmNvbmZpZyAmJiB0aGlzLnBheVBhbCAmJiB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0pIHtcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgaWQgaXMgYWxzbyBzZXRcclxuICAgICAgICAgICAgaWYgKHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LmlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQYXlQYWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBheVBhbCh0aGlzLmNvbmZpZywgdGhpcy5wYXlQYWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFBheVBhbFNjcmlwdChjb25maWc6IElQYXlQYWxDb25maWcsIGluaXRQYXlQYWw6IChwYXlwYWw6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF5cGFsU2NyaXB0U2VydmljZS5yZWdpc3RlclBheVBhbFNjcmlwdCh7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiBjb25maWcuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGNvbW1pdDogY29uZmlnLmFkdmFuY2VkICYmIGNvbmZpZy5hZHZhbmNlZC5jb21taXQgPyBjb25maWcuYWR2YW5jZWQuY29tbWl0IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjdXJyZW5jeTogY29uZmlnLmN1cnJlbmN5LFxyXG4gICAgICAgICAgICBleHRyYVBhcmFtczogY29uZmlnLmFkdmFuY2VkICYmIGNvbmZpZy5hZHZhbmNlZC5leHRyYVF1ZXJ5UGFyYW1zID8gY29uZmlnLmFkdmFuY2VkLmV4dHJhUXVlcnlQYXJhbXMgOiBbXVxyXG4gICAgICAgIH0sIChwYXlwYWwpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JpcHRMb2FkZWQubmV4dChwYXlwYWwpO1xyXG4gICAgICAgICAgICBpbml0UGF5UGFsKHBheXBhbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIChzY3JpcHRTcmM6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcmlwdExvYWRFcnJvci5lbWl0KHNjcmlwdFNyYyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlRWxlbWVudElkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGBuZ3gtY2FwdGNoYS1pZC0ke25ldyBEYXRlKCkudmFsdWVPZigpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UGF5UGFsKGNvbmZpZzogSVBheVBhbENvbmZpZywgcGF5cGFsOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAvLyBSdW5uaW5nIG91dHNpZGUgYW5ndWxhciB6b25lIHByZXZlbnRzIGluZmluaXRlIG5nRG9DaGVjayBsaWZlY3ljbGUgY2FsbHNcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLnBheXBhbC5jb20vZG9jcy9jaGVja291dC9pbnRlZ3JhdGUvIzItYWRkLXRoZS1wYXlwYWwtc2NyaXB0LXRvLXlvdXItd2ViLXBhZ2VcclxuICAgICAgICAgICAgcGF5cGFsLkJ1dHRvbnMoe1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IGNvbmZpZy5zdHlsZSxcclxuICAgICAgICAgICAgICAgIGNyZWF0ZU9yZGVyOiAoZGF0YTogYW55LCBhY3Rpb25zOiBJQ3JlYXRlT3JkZXJDYWxsYmFja0FjdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jcmVhdGVPcmRlck9uQ2xpZW50ICYmIGNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgQm90aCAnY3JlYXRlT3JkZXJPbkNsaWVudCcgYW5kICdjcmVhdGVPcmRlck9uU2VydmVyJyBhcmUgZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGNob29zZSBvbmUgb3IgdGhlIG90aGVyLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5jcmVhdGVPcmRlck9uQ2xpZW50ICYmICFjb25maWcuY3JlYXRlT3JkZXJPblNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE5laXRoZXIgJ2NyZWF0ZU9yZGVyT25DbGllbnQnIG9yICdjcmVhdGVPcmRlck9uU2VydmVyJyBhcmUgZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGRlZmluZSBvbmUgb2YgdGhlc2UgdG8gY3JlYXRlIG9yZGVyLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmNyZWF0ZU9yZGVyT25DbGllbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLm9yZGVyLmNyZWF0ZShjb25maWcuY3JlYXRlT3JkZXJPbkNsaWVudChkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuY3JlYXRlT3JkZXJPblNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBzdGF0ZSBmb3IgJ2NyZWF0ZU9yZGVyJy5gKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgb25BcHByb3ZlOiAoZGF0YTogSU9uQXBwcm92ZUNhbGxiYWNrRGF0YSwgYWN0aW9uczogSU9uQXBwcm92ZUNhbGxiYWNrQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uQXBwcm92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9uQXBwcm92ZShkYXRhLCBhY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBvbiBzZXJ2ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRob3JpemVPblNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5hdXRob3JpemVPblNlcnZlcihkYXRhLCBhY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBvbiBjbGllbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25DbGllbnRBdXRob3JpemF0aW9uID0gY29uZmlnLm9uQ2xpZW50QXV0aG9yaXphdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uQ2xpZW50QXV0aG9yaXphdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5vcmRlci5jYXB0dXJlKCkudGhlbigoZGV0YWlsczogSUNsaWVudEF1dGhvcml6ZUNhbGxiYWNrRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpZW50QXV0aG9yaXphdGlvbihkZXRhaWxzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6IChkYXRhOiBJQ2FuY2VsQ2FsbGJhY2tEYXRhLCBhY3Rpb25zOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uQ2FuY2VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25DYW5jZWwoZGF0YSwgYWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvblNoaXBwaW5nQ2hhbmdlOiAoZGF0YTogSU9uU2hpcHBpbmdDaGFuZ2VEYXRhLCBhY3Rpb25zOiBJT25TaGlwcGluZ0NoYW5nZUFjdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vblNoaXBwaW5nQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLm9uU2hpcHBpbmdDaGFuZ2UoZGF0YSwgYWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoZGF0YTogYW55LCBhY3Rpb25zOiBJT25DbGlja0NhbGxiYWNrQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25DbGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9uQ2xpY2soZGF0YSwgYWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkluaXQ6IChkYXRhOiBJSW5pdENhbGxiYWNrRGF0YSwgYWN0aW9uczogSU9uSW5pdENhbGxiYWNrQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25Jbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25Jbml0KGRhdGEsIGFjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnJlbmRlcihgIyR7dGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJJZH1gKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbiJdfQ==