ngx-social-button
Version:
Social login/share buttons for Angular 6, 7, 8
825 lines (809 loc) • 97.1 kB
JavaScript
import { Injectable, Component, Input, Output, EventEmitter, Inject, ViewChild, NgModule, defineInjectable, inject } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { DOCUMENT } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @abstract
*/
class BaseLoginProviderImpl {
constructor() { }
/**
* @param {?} obj
* @param {?} onload
* @return {?}
*/
loadScript(obj, onload) {
if (document.getElementById(obj.name)) {
return;
}
/** @type {?} */
let signInJS = document.createElement('script');
signInJS.async = true;
signInJS.src = obj.url;
signInJS.onload = onload;
if (obj.name === 'linkedin') {
signInJS.async = false;
signInJS.text = ('api_key: ' + obj.id).replace('\'', '');
}
document.head.appendChild(signInJS);
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class SocialUser {
}
class LoginProviderClass {
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FacebookLoginProvider extends BaseLoginProviderImpl {
/**
* @param {?} clientId
*/
constructor(clientId) {
super();
this.clientId = clientId;
this.TYPE = 'facebook';
this.loginProviderObj = new LoginProviderClass();
this.loginProviderObj.id = clientId;
this.loginProviderObj.name = 'facebook';
this.loginProviderObj.url = 'https://connect.facebook.net/en_US/sdk.js';
}
/**
* @return {?}
*/
initialize() {
return new Promise((resolve, reject) => {
this.loadScript(this.loginProviderObj, () => {
FB.init({
appId: this.clientId,
autoLogAppEvents: true,
cookie: true,
xfbml: true,
version: 'v2.8'
});
FB.AppEvents.logPageView();
FB.getLoginStatus(function (response) {
if (response.status === 'connected') {
/** @type {?} */
const accessToken = FB.getAuthResponse()['accessToken'];
FB.api('/me?fields=name,email,picture', (res) => {
resolve(FacebookLoginProvider.drawUser(Object.assign({}, { token: accessToken }, res)));
});
}
});
});
});
}
/**
* @param {?} response
* @return {?}
*/
static drawUser(response) {
/** @type {?} */
let user = new SocialUser();
user.id = response.id;
user.name = response.name;
user.email = response.email;
user.accessToken = response.accessToken;
user.image = 'https://graph.facebook.com/' + response.id + '/picture?type=normal';
return user;
}
/**
* @param {?=} scopes
* @return {?}
*/
signIn(scopes) {
return new Promise((resolve, reject) => {
FB.login((response) => {
console.log("facebook", response);
if (response.authResponse) {
/** @type {?} */
const accessToken = FB.getAuthResponse()['accessToken'];
FB.api('/me?fields=name,email,picture', (res) => {
console.log("me", res);
resolve(FacebookLoginProvider.drawUser(Object.assign({}, { accessToken: accessToken }, res)));
});
}
}, { scope: scopes && scopes.length > 0 ? scopes.join(',') : 'email,public_profile' });
});
}
/**
* @param {?=} share
* @return {?}
*/
sharing(share) {
return new Promise((resolve, reject) => {
FB.ui({
method: 'share',
href: share.href,
hashtag: (share.hashtag && share.hashtag.indexOf('#') >= 0) ? share.hashtag : null
}, function (response) {
console.log(response);
resolve();
});
});
}
/**
* @return {?}
*/
signOut() {
return new Promise((resolve, reject) => {
FB.logout((response) => {
resolve();
});
});
}
}
FacebookLoginProvider.PROVIDER_TYPE = 'facebook';
FacebookLoginProvider.SCOPES = {
EMAIL: 'email',
PUBLIC_PROFILE: 'public_profile'
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class GoogleLoginProvider extends BaseLoginProviderImpl {
/**
* @param {?} clientId
*/
constructor(clientId) {
super();
this.clientId = clientId;
this.loginProviderObj = new LoginProviderClass();
this.TYPE = 'google';
this.loginProviderObj.id = clientId;
this.loginProviderObj.name = 'google';
this.loginProviderObj.url = 'https://apis.google.com/js/platform.js';
}
/**
* @return {?}
*/
initialize() {
return new Promise((resolve, reject) => {
this.loadScript(this.loginProviderObj, () => {
gapi.load('auth2', () => {
this.auth2 = gapi.auth2.init({
client_id: this.clientId,
scope: 'email'
});
this.auth2.then(() => {
if (this.auth2.isSignedIn.get()) {
resolve(this.drawUser());
}
});
});
});
});
}
/**
* @return {?}
*/
drawUser() {
/** @type {?} */
const user = new SocialUser();
/** @type {?} */
const profile = this.auth2.currentUser.get().getBasicProfile();
/** @type {?} */
const authResponseObj = this.auth2.currentUser.get().getAuthResponse(true);
user.id = profile.getId();
user.name = profile.getName();
user.email = profile.getEmail();
user.image = profile.getImageUrl();
user.accessToken = authResponseObj.access_token;
user.idToken = authResponseObj.id_token;
return user;
}
/**
* @param {?=} scopes
* @return {?}
*/
signIn(scopes) {
return new Promise((resolve, reject) => {
/** @type {?} */
const promise = this.auth2.signIn();
promise.then(() => {
resolve(this.drawUser());
}).catch((err) => {
reject(err);
});
});
}
/**
* @return {?}
*/
signOut() {
return new Promise((resolve, reject) => {
this.auth2.signOut().then((err) => {
if (err) {
reject(err);
}
else {
resolve();
}
});
});
}
/**
* @param {?=} share
* @return {?}
*/
sharing(share) {
return new Promise((resolve, reject) => {
resolve();
});
}
}
GoogleLoginProvider.PROVIDER_TYPE = 'google';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class LinkedinLoginProvider extends BaseLoginProviderImpl {
/**
* @param {?} clientId
*/
constructor(clientId) {
super();
this.clientId = clientId;
this.loginProviderObj = new LoginProviderClass();
this.TYPE = 'linkedin';
this.loginProviderObj.id = clientId;
this.loginProviderObj.name = 'linkedin';
this.loginProviderObj.url = 'https://platform.linkedin.com/in.js';
}
/**
* @return {?}
*/
initialize() {
return new Promise((resolve, reject) => {
this.loadScript(this.loginProviderObj, () => {
IN.init({
api_key: this.clientId,
authorize: true,
onLoad: this.onLinkedInLoad()
});
IN.Event.on(IN, 'auth', () => {
if (IN.User.isAuthorized()) {
IN.API.Raw('/people/~:(id,first-name,last-name,email-address,picture-url)').result((res) => {
resolve(this.drawUser(res));
});
}
});
});
});
}
/**
* @return {?}
*/
onLinkedInLoad() {
IN.Event.on(IN, 'systemReady', () => {
IN.User.refresh();
});
}
/**
* @param {?} response
* @return {?}
*/
drawUser(response) {
/** @type {?} */
const user = new SocialUser();
user.id = response.id;
user.name = response.firstName + ' ' + response.lastName;
user.email = response.emailAddress;
user.image = response.pictureUrl;
user.accessToken = IN.ENV.auth.oauth_token;
return user;
}
/**
* @return {?}
*/
signIn() {
return new Promise((resolve, reject) => {
IN.User.authorize(() => {
IN.API.Raw('/people/~:(id,first-name,last-name,email-address,picture-url)').result((res) => {
console.log('linkedin', res);
resolve(this.drawUser(res));
});
});
});
}
/**
* @return {?}
*/
signOut() {
return new Promise((resolve, reject) => {
IN.User.logout((response) => {
resolve();
}, (err) => {
reject(err);
});
});
}
/**
* @param {?=} share
* @return {?}
*/
sharing(share) {
return new Promise((resolve, reject) => {
/** @type {?} */
const payload = {
'comment': share ? share.comment : '',
'visibility': {
'code': 'anyone'
}
};
IN.API.Raw('/people/~/shares?format=json')
.method('POST')
.body(JSON.stringify(payload))
.result(data => {
console.log('linkedin share', data);
resolve();
})
.error(onError => {
console.log('linkedin', onError);
});
});
}
}
LinkedinLoginProvider.PROVIDER_TYPE = 'linkedin';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class SocialServiceConfig {
/**
* @param {?=} providers
*/
constructor(providers) {
this.providers = new Map();
if (providers) {
for (let i = 0; i < providers.length; i++) {
/** @type {?} */
const element = providers[i];
this.providers.set(element.provider.TYPE, element.provider);
}
}
}
/**
* @return {?}
*/
getProviders() {
return this.providers;
}
/**
* @param {?} provider
* @return {?}
*/
addProvider(provider) {
if (!this.providers.get(provider.TYPE)) {
this.providers.set(provider.TYPE, provider);
}
}
/**
* @param {?} clientId
* @return {?}
*/
addFacebook(clientId) {
this.addProvider(new FacebookLoginProvider(clientId));
return this;
}
/**
* @param {?} clientId
* @return {?}
*/
addGoogle(clientId) {
this.addProvider(new GoogleLoginProvider(clientId));
return this;
}
/**
* @param {?} clientId
* @return {?}
*/
addLinkedIn(clientId) {
this.addProvider(new LinkedinLoginProvider(clientId));
return this;
}
}
class SocialService {
/**
* @param {?} config
*/
constructor(config) {
this._user = null;
this._authState = new BehaviorSubject(null);
this.providers = config.getProviders();
this.providers.forEach((provider, key) => {
provider.initialize().then((user) => {
user.provider = key;
this._user = user;
this._authState.next(user);
}).catch((err) => {
// this._authState.next(null);
});
});
}
/**
* @return {?}
*/
get authState() {
return this._authState.asObservable();
}
/**
* @return {?}
*/
isSocialLoggedIn() {
return (this._user != null);
}
/**
* @param {?} providerType
* @param {?=} share
* @return {?}
*/
sharing(providerType, share) {
return new Promise((resolve, reject) => {
/** @type {?} */
let providerObject = this.providers.get(providerType);
if (providerObject) {
providerObject.sharing(share).then(() => {
resolve(true);
});
}
else {
reject(SocialService.LOGIN_PROVIDER_NOT_FOUND);
}
});
}
/**
* @param {?=} share
* @return {?}
*/
facebookSharing(share) {
return this.sharing('facebook', share);
}
/**
* @param {?} providerType
* @param {?=} scopes
* @return {?}
*/
signIn(providerType, scopes) {
return new Promise((resolve, reject) => {
/** @type {?} */
let providerObject = this.providers.get(providerType);
if (providerObject) {
providerObject.signIn(scopes).then((user) => {
user.provider = providerType;
resolve(user);
this._user = user;
this._authState.next(user);
}).catch((err) => {
reject(SocialService.USER_POPUP_CLOSE);
});
}
else {
reject(SocialService.LOGIN_PROVIDER_NOT_FOUND);
}
});
}
/**
* @return {?}
*/
signOut() {
return new Promise((resolve, reject) => {
if (this._user && this._user.provider) {
/** @type {?} */
let providerType = this._user.provider;
/** @type {?} */
let providerObject = this.providers.get(providerType);
providerObject.signOut().then(() => {
this._user = null;
this._authState.next(null);
resolve();
}).catch((err) => {
this._authState.next(null);
});
}
else {
reject(SocialService.LOGIN_PROVIDER_NOT_FOUND);
}
});
}
}
SocialService.LOGIN_PROVIDER_NOT_FOUND = 'Login provider not found';
SocialService.USER_POPUP_CLOSE = 'User close the popup';
SocialService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
SocialService.ctorParameters = () => [
{ type: SocialServiceConfig }
];
/** @nocollapse */ SocialService.ngInjectableDef = defineInjectable({ factory: function SocialService_Factory() { return new SocialService(inject(SocialServiceConfig)); }, token: SocialService, providedIn: "root" });
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FacebookLoginButton {
/**
* @param {?} socialAuthService
*/
constructor(socialAuthService) {
this.socialAuthService = socialAuthService;
this.socialUser = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
socialSignIn() {
this.socialAuthService.signIn('facebook', this.scopes).then((userData) => {
console.log("socialSignIn", userData);
this.socialUser.emit(userData);
}).catch(() => {
this.socialUser.emit(null);
});
}
}
FacebookLoginButton.decorators = [
{ type: Component, args: [{
selector: 'facebook-login-button',
template: `
<button [className]="style == 'round' ? 'social-btn facebook ' : 'button btn-block loginBtn --facebook '"
(click)="socialSignIn()" type="button">
{{style == 'round' ? '': text ? text : 'Login with Facebook'}}</button>
`,
styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`],
},] },
];
/** @nocollapse */
FacebookLoginButton.ctorParameters = () => [
{ type: SocialService }
];
FacebookLoginButton.propDecorators = {
size: [{ type: Input }],
text: [{ type: Input }],
style: [{ type: Input }],
scopes: [{ type: Input }],
socialUser: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class GoogleLoginButton {
/**
* @param {?} socialAuthService
*/
constructor(socialAuthService) {
this.socialAuthService = socialAuthService;
this.socialUser = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
socialSignIn() {
this.socialAuthService.signIn('google', this.scopes).then((userData) => {
this.socialUser.emit(userData);
}).catch(() => {
this.socialUser.emit(null);
});
}
}
GoogleLoginButton.decorators = [
{ type: Component, args: [{
selector: 'google-login-button',
template: `
<button [className]="style == 'round' ? 'social-btn google' : 'button btn-block loginBtn --google'"
(click)="socialSignIn()" type="button">
{{style == 'round' ? '': text ? text : 'Login with Google'}}
</button>
`, styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`],
},] },
];
/** @nocollapse */
GoogleLoginButton.ctorParameters = () => [
{ type: SocialService }
];
GoogleLoginButton.propDecorators = {
size: [{ type: Input }],
style: [{ type: Input }],
text: [{ type: Input }],
scopes: [{ type: Input }],
socialUser: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class LinkedinLoginButton {
/**
* @param {?} socialAuthService
*/
constructor(socialAuthService) {
this.socialAuthService = socialAuthService;
this.socialUser = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
socialSignIn() {
this.socialAuthService.signIn('linkedin', this.scopes).then((userData) => {
this.socialUser.emit(userData);
}).catch(() => {
this.socialUser.emit(null);
});
}
}
LinkedinLoginButton.decorators = [
{ type: Component, args: [{
selector: 'linkedin-login-button',
template: `
<button [className]="style == 'round' ? 'social-btn linkedin' : 'button btn-block loginBtn --linkedin'"
(click)="socialSignIn()" type="button">
{{style == 'round' ? '': text ? text : 'Login with LinkedIn'}}
</button>
`, styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`],
},] },
];
/** @nocollapse */
LinkedinLoginButton.ctorParameters = () => [
{ type: SocialService }
];
LinkedinLoginButton.propDecorators = {
size: [{ type: Input }],
style: [{ type: Input }],
text: [{ type: Input }],
scopes: [{ type: Input }],
socialUser: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class FacebookSharingButton {
/**
* @param {?} socialAuthService
* @param {?} document
*/
constructor(socialAuthService, document) {
this.socialAuthService = socialAuthService;
this.document = document;
this.share = null;
this.response = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
sharing() {
console.log(this.document.location.href);
if (!this.share) {
this.share = { href: this.document.location.href };
}
else if (!this.share.href) {
this.share.href = this.document.location.href;
}
this.socialAuthService.facebookSharing(this.share).then(() => {
this.response.emit(true);
}).catch((err) => {
this.response.emit(false);
});
}
}
FacebookSharingButton.decorators = [
{ type: Component, args: [{
selector: 'facebook-share-button',
template: `
<button class="button btn-block loginBtn --facebook"
(click)="sharing()" type="button">Share</button>
`,
styles: [`.button{font-family:Lato,"Lucida Grande","Lucida Sans Unicode",Tahoma,Sans-Serif;-webkit-appearance:none;display:inline-block;outline:0;border-radius:3px;border:3px solid transparent;cursor:pointer;text-overflow:ellipsis;text-decoration:none!important;font-weight:400!important}.loginBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.loginBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.loginBtn:focus{outline:0}.loginBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.shareBtn{box-sizing:border-box;position:relative;margin:.2em;padding:0 15px 0 46px;border:none;text-align:left;line-height:34px;white-space:nowrap;border-radius:3px;font-size:16px;color:#fff}.shareBtn:before{content:"";box-sizing:border-box;position:absolute;top:0;left:0;width:34px;height:100%}.shareBtn:focus{outline:0}.shareBtn:active{box-shadow:inset 0 0 0 32px rgba(0,0,0,.1)}.--facebook{background-color:#4c69ba;background-image:linear-gradient(#4c69ba,#3b55a0);text-shadow:0 -1px 0 #354c8c}.--facebook:before{border-right:1px solid #364e92;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_facebook.png) 6px 6px no-repeat}.--facebook:focus,.--facebook:hover{background-color:#5b7bd5;background-image:linear-gradient(#5b7bd5,#4864b1)}.--google{background:#dd4b39}.--google:before{border-right:1px solid #bb3f30;background:url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14082/icon_google.png) 6px 6px no-repeat}.--google:focus,.--google:hover{background:#e74b37}.--linkedin{background:#007bb6}.--linkedin:before{border-right:1px solid #007bb6;background:url(https://content.linkedin.com/content/dam/developer/global/en_US/site/img/signin-button.png) -3px -3px no-repeat}.--linkedin:focus,.--linkedin:hover{background:linear-gradient(#007bb6,#4864b1)}.social-btn{width:50px;height:50px;background-size:cover;background-repeat:no-repeat;cursor:pointer;border-radius:10px;border:none}.social-btn.facebook{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/facebook.png)}.social-btn.google{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/google.png)}.social-btn.linkedin{background-image:url(https://raw.githubusercontent.com/JohnnieLi/ngx-social-button/master/assets/LinkedIn.png)}.social-btn.wechat{background-image:url(https://github.com/JohnnieLi/ngx-social-button/blob/master/assets/wechat.png?raw=true)}`],
},] },
];
/** @nocollapse */
FacebookSharingButton.ctorParameters = () => [
{ type: SocialService },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
FacebookSharingButton.propDecorators = {
share: [{ type: Input }],
response: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class LinkedinSharingButton {
/**
* @param {?} socialAuthService
* @param {?} document
*/
constructor(socialAuthService, document) {
this.socialAuthService = socialAuthService;
this.document = document;
this.share = { href: location.href };
this.response = new EventEmitter();
}
/**
* @return {?}
*/
ngAfterViewInit() {
// add linkedin share button script tag to element
this.element.nativeElement.innerHTML = `<script type="IN/Share" data-url="${this.share.href}"></script>`;
// render share button
// window['IN'] && window['IN'].parse();
}
}
LinkedinSharingButton.decorators = [
{ type: Component, args: [{
selector: 'linkedin-share-button',
template: `
<span #element></span>
`,
},] },
];
/** @nocollapse */
LinkedinSharingButton.ctorParameters = () => [
{ type: SocialService },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
LinkedinSharingButton.propDecorators = {
share: [{ type: Input }],
response: [{ type: Output }],
element: [{ type: ViewChild, args: ['element',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class NgxSocialButtonModule {
}
NgxSocialButtonModule.decorators = [
{ type: NgModule, args: [{
imports: [],
declarations: [FacebookLoginButton, GoogleLoginButton,
FacebookSharingButton, LinkedinLoginButton,
LinkedinSharingButton],
exports: [FacebookLoginButton, GoogleLoginButton,
FacebookSharingButton, LinkedinLoginButton,
LinkedinSharingButton]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { SocialServiceConfig, SocialService, FacebookLoginProvider, GoogleLoginProvider, FacebookLoginButton, GoogleLoginButton, LinkedinLoginButton, FacebookSharingButton, NgxSocialButtonModule, LinkedinSharingButton as ɵb, BaseLoginProviderImpl as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNvY2lhbC1idXR0b24uanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9lbnRpdGllcy9iYXNlTG9naW5Qcm92aWRlckltcGwudHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9lbnRpdGllcy91c2VyLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvcHJvdmlkZXJzL2ZhY2Vib29rUHJvdmlkZXIudHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9wcm92aWRlcnMvZ29vZ2xlUHJvdmlkZXIudHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9wcm92aWRlcnMvbGlua2VkaW5Qcm92aWRlci50cyIsIm5nOi8vbmd4LXNvY2lhbC1idXR0b24vbGliL3NvY2lhbC5zZXJ2aWNlLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvYnV0dG9ucy9mYWNlYm9va0xvZ2luQnV0dG9uLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvYnV0dG9ucy9nb29nbGVMb2dpbkJ1dHRvbi50cyIsIm5nOi8vbmd4LXNvY2lhbC1idXR0b24vbGliL2J1dHRvbnMvbGlua2VkaW5Mb2dpbkJ1dHRvbi50cyIsIm5nOi8vbmd4LXNvY2lhbC1idXR0b24vbGliL2J1dHRvbnMvZmFjZWJvb2tTaGFyaW5nQnV0dG9uLnRzIiwibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi9saWIvYnV0dG9ucy9saW5rZWRpblNoYXJpbmdCdXR0b24udHMiLCJuZzovL25neC1zb2NpYWwtYnV0dG9uL2xpYi9uZ3gtc29jaWFsLWJ1dHRvbi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9naW5Qcm92aWRlciB9IGZyb20gJy4vbG9naW5Qcm92aWRlcic7XG5pbXBvcnQgeyBTb2NpYWxVc2VyLCBMb2dpblByb3ZpZGVyQ2xhc3MgfSBmcm9tICcuL3VzZXInO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUxvZ2luUHJvdmlkZXJJbXBsIGltcGxlbWVudHMgTG9naW5Qcm92aWRlciB7XG5cblxuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICBhYnN0cmFjdCBpbml0aWFsaXplKCk6IFByb21pc2U8U29jaWFsVXNlcj47XG4gIGFic3RyYWN0IHNpZ25JbihzY29wZXM/OltzdHJpbmddKTogUHJvbWlzZTxTb2NpYWxVc2VyPjtcbiAgYWJzdHJhY3Qgc2lnbk91dCgpOiBQcm9taXNlPGFueT47XG4gIGFic3RyYWN0IHNoYXJpbmcoc2hhcmU/OmFueSk6UHJvbWlzZTxhbnk+O1xuICBhYnN0cmFjdCBUWVBFOiBzdHJpbmc7XG5cbiAgbG9hZFNjcmlwdChvYmo6IExvZ2luUHJvdmlkZXJDbGFzcywgb25sb2FkOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqLm5hbWUpKSB7IHJldHVybjsgfVxuICAgIGxldCBzaWduSW5KUyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNpZ25JbkpTLmFzeW5jID0gdHJ1ZTtcbiAgICBzaWduSW5KUy5zcmMgPSBvYmoudXJsO1xuICAgIHNpZ25JbkpTLm9ubG9hZCA9IG9ubG9hZDtcbiAgICBpZiAob2JqLm5hbWUgPT09ICdsaW5rZWRpbicpIHtcbiAgICAgIHNpZ25JbkpTLmFzeW5jID0gZmFsc2U7XG4gICAgICBzaWduSW5KUy50ZXh0ID0gKCdhcGlfa2V5OiAnICsgb2JqLmlkKS5yZXBsYWNlKCdcXCcnLCAnJyk7XG4gICAgfVxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2lnbkluSlMpO1xuICB9XG59IiwiZXhwb3J0IGNsYXNzIFNvY2lhbFVzZXIge1xuICAgIHByb3ZpZGVyOiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbWFnZTogc3RyaW5nO1xuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmdcbiAgfVxuICBcbiAgZXhwb3J0IGNsYXNzIExvZ2luUHJvdmlkZXJDbGFzcyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gIH1cbiAgXG4gIGV4cG9ydCBjbGFzcyBMaW5rZWRJblJlc3BvbnNlIHtcbiAgICBlbWFpbEFkZHJlc3M6IHN0cmluZztcbiAgICBmaXJzdE5hbWU6IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xuICAgIGxhc3ROYW1lOiBzdHJpbmc7XG4gICAgcGljdHVyZVVybDogc3RyaW5nO1xuICB9XG4iLCJpbXBvcnQgeyBCYXNlTG9naW5Qcm92aWRlckltcGwgfSBmcm9tICcuLi9lbnRpdGllcy9iYXNlTG9naW5Qcm92aWRlckltcGwnO1xuaW1wb3J0IHsgU29jaWFsVXNlciwgTG9naW5Qcm92aWRlckNsYXNzIH0gZnJvbSAnLi4vZW50aXRpZXMvdXNlcic7XG5cbmRlY2xhcmUgbGV0IEZCOiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBGYWNlYm9va0xvZ2luUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTG9naW5Qcm92aWRlckltcGwge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPVklERVJfVFlQRSA9ICdmYWNlYm9vayc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0NPUEVTID0ge1xuICAgIEVNQUlMIDogJ2VtYWlsJyxcbiAgICBQVUJMSUNfUFJPRklMRTogJ3B1YmxpY19wcm9maWxlJ1xuICB9O1xuXG4gIHB1YmxpYyBUWVBFID0gJ2ZhY2Vib29rJztcbiAgcHVibGljIGxvZ2luUHJvdmlkZXJPYmo6IExvZ2luUHJvdmlkZXJDbGFzcyA9IG5ldyBMb2dpblByb3ZpZGVyQ2xhc3MoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudElkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5pZCA9IGNsaWVudElkO1xuICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5uYW1lID0gJ2ZhY2Vib29rJztcbiAgICB0aGlzLmxvZ2luUHJvdmlkZXJPYmoudXJsID0gJ2h0dHBzOi8vY29ubmVjdC5mYWNlYm9vay5uZXQvZW5fVVMvc2RrLmpzJztcbiAgfVxuXG4gIGluaXRpYWxpemUoKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMubG9hZFNjcmlwdCh0aGlzLmxvZ2luUHJvdmlkZXJPYmosICgpID0+IHtcbiAgICAgICAgICBGQi5pbml0KHtcbiAgICAgICAgICAgIGFwcElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgYXV0b0xvZ0FwcEV2ZW50czogdHJ1ZSxcbiAgICAgICAgICAgIGNvb2tpZTogdHJ1ZSxcbiAgICAgICAgICAgIHhmYm1sOiB0cnVlLFxuICAgICAgICAgICAgdmVyc2lvbjogJ3YyLjgnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgRkIuQXBwRXZlbnRzLmxvZ1BhZ2VWaWV3KCk7XG5cbiAgICAgICAgICBGQi5nZXRMb2dpblN0YXR1cyhmdW5jdGlvbiAocmVzcG9uc2U6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBGQi5nZXRBdXRoUmVzcG9uc2UoKVsnYWNjZXNzVG9rZW4nXTtcbiAgICAgICAgICAgICAgRkIuYXBpKCcvbWU/ZmllbGRzPW5hbWUsZW1haWwscGljdHVyZScsIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoRmFjZWJvb2tMb2dpblByb3ZpZGVyLmRyYXdVc2VyKE9iamVjdC5hc3NpZ24oe30sIHt0b2tlbjogYWNjZXNzVG9rZW59LCByZXMpKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBkcmF3VXNlcihyZXNwb25zZTogYW55KTogU29jaWFsVXNlciB7XG4gICAgbGV0IHVzZXI6IFNvY2lhbFVzZXIgPSBuZXcgU29jaWFsVXNlcigpO1xuICAgIHVzZXIuaWQgPSByZXNwb25zZS5pZDtcbiAgICB1c2VyLm5hbWUgPSByZXNwb25zZS5uYW1lO1xuICAgIHVzZXIuZW1haWwgPSByZXNwb25zZS5lbWFpbDtcbiAgICB1c2VyLmFjY2Vzc1Rva2VuID0gcmVzcG9uc2UuYWNjZXNzVG9rZW47XG4gICAgdXNlci5pbWFnZSA9ICdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8nICsgcmVzcG9uc2UuaWQgKyAnL3BpY3R1cmU/dHlwZT1ub3JtYWwnO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cblxuICBzaWduSW4oc2NvcGVzPzpbc3RyaW5nXSk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBGQi5sb2dpbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcImZhY2Vib29rXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmF1dGhSZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gRkIuZ2V0QXV0aFJlc3BvbnNlKClbJ2FjY2Vzc1Rva2VuJ107XG4gICAgICAgICAgRkIuYXBpKCcvbWU/ZmllbGRzPW5hbWUsZW1haWwscGljdHVyZScsIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJtZVwiLCByZXMpO1xuICAgICAgICAgICAgcmVzb2x2ZShGYWNlYm9va0xvZ2luUHJvdmlkZXIuZHJhd1VzZXIoT2JqZWN0LmFzc2lnbih7fSwge2FjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbn0sIHJlcykpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgeyBzY29wZTogc2NvcGVzICYmIHNjb3Blcy5sZW5ndGggPiAwID8gc2NvcGVzLmpvaW4oJywnKSA6ICdlbWFpbCxwdWJsaWNfcHJvZmlsZScgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzaGFyaW5nKHNoYXJlPzphbnkpOiBQcm9taXNlPGFueT57XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgRkIudWkoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ3NoYXJlJyxcbiAgICAgICAgICAgICAgICBocmVmOiBzaGFyZS5ocmVmLFxuICAgICAgICAgICAgICAgIGhhc2h0YWc6IChzaGFyZS5oYXNodGFnICYmIHNoYXJlLmhhc2h0YWcuaW5kZXhPZignIycpPj0wKT9zaGFyZS5oYXNodGFnIDogIG51bGxcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKHJlc3BvbnNlKXtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG4gIHNpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgRkIubG9nb3V0KChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn0iLCJpbXBvcnQge0Jhc2VMb2dpblByb3ZpZGVySW1wbH0gZnJvbSAnLi4vZW50aXRpZXMvYmFzZUxvZ2luUHJvdmlkZXJJbXBsJztcbmltcG9ydCB7TG9naW5Qcm92aWRlckNsYXNzLCBTb2NpYWxVc2VyfSBmcm9tICcuLi9lbnRpdGllcy91c2VyJztcblxuZGVjbGFyZSBsZXQgZ2FwaTogYW55O1xuXG5leHBvcnQgY2xhc3MgR29vZ2xlTG9naW5Qcm92aWRlciBleHRlbmRzIEJhc2VMb2dpblByb3ZpZGVySW1wbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX1RZUEUgPSAnZ29vZ2xlJztcbiAgICBwdWJsaWMgbG9naW5Qcm92aWRlck9iajogTG9naW5Qcm92aWRlckNsYXNzID0gbmV3IExvZ2luUHJvdmlkZXJDbGFzcygpO1xuICAgIHByaXZhdGUgYXV0aDI6IGFueTtcbiAgICBwdWJsaWMgVFlQRSA9ICdnb29nbGUnO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5pZCA9IGNsaWVudElkO1xuICAgICAgICB0aGlzLmxvZ2luUHJvdmlkZXJPYmoubmFtZSA9ICdnb29nbGUnO1xuICAgICAgICB0aGlzLmxvZ2luUHJvdmlkZXJPYmoudXJsID0gJ2h0dHBzOi8vYXBpcy5nb29nbGUuY29tL2pzL3BsYXRmb3JtLmpzJztcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkU2NyaXB0KHRoaXMubG9naW5Qcm92aWRlck9iaiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGdhcGkubG9hZCgnYXV0aDInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aDIgPSBnYXBpLmF1dGgyLmluaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6ICdlbWFpbCdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoMi50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dGgyLmlzU2lnbmVkSW4uZ2V0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuZHJhd1VzZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRyYXdVc2VyKCk6IFNvY2lhbFVzZXIge1xuICAgICAgICBjb25zdCB1c2VyOiBTb2NpYWxVc2VyID0gbmV3IFNvY2lhbFVzZXIoKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuYXV0aDIuY3VycmVudFVzZXIuZ2V0KCkuZ2V0QmFzaWNQcm9maWxlKCk7XG4gICAgICAgIGNvbnN0IGF1dGhSZXNwb25zZU9iaiA9IHRoaXMuYXV0aDIuY3VycmVudFVzZXIuZ2V0KCkuZ2V0QXV0aFJlc3BvbnNlKHRydWUpO1xuICAgICAgICB1c2VyLmlkID0gcHJvZmlsZS5nZXRJZCgpO1xuICAgICAgICB1c2VyLm5hbWUgPSBwcm9maWxlLmdldE5hbWUoKTtcbiAgICAgICAgdXNlci5lbWFpbCA9IHByb2ZpbGUuZ2V0RW1haWwoKTtcbiAgICAgICAgdXNlci5pbWFnZSA9IHByb2ZpbGUuZ2V0SW1hZ2VVcmwoKTtcbiAgICAgICAgdXNlci5hY2Nlc3NUb2tlbiA9IGF1dGhSZXNwb25zZU9iai5hY2Nlc3NfdG9rZW47XG4gICAgICAgIHVzZXIuaWRUb2tlbiA9IGF1dGhSZXNwb25zZU9iai5pZF90b2tlbjtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgc2lnbkluKHNjb3Blcz86IFtzdHJpbmddKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5hdXRoMi5zaWduSW4oKTtcbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmRyYXdVc2VyKCkpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXV0aDIuc2lnbk91dCgpLnRoZW4oKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNoYXJpbmcoc2hhcmU/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1NvY2lhbFVzZXIsIExvZ2luUHJvdmlkZXJDbGFzcywgTGlua2VkSW5SZXNwb25zZX0gZnJvbSAnLi4vZW50aXRpZXMvdXNlcic7XG5pbXBvcnQge0Jhc2VMb2dpblByb3ZpZGVySW1wbH0gZnJvbSAnLi4vZW50aXRpZXMvYmFzZUxvZ2luUHJvdmlkZXJJbXBsJztcblxuZGVjbGFyZSBsZXQgSU46IGFueTtcblxuZXhwb3J0IGNsYXNzIExpbmtlZGluTG9naW5Qcm92aWRlciBleHRlbmRzIEJhc2VMb2dpblByb3ZpZGVySW1wbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX1RZUEUgPSAnbGlua2VkaW4nO1xuICAgIHB1YmxpYyBsb2dpblByb3ZpZGVyT2JqOiBMb2dpblByb3ZpZGVyQ2xhc3MgPSBuZXcgTG9naW5Qcm92aWRlckNsYXNzKCk7XG4gICAgVFlQRSA9ICdsaW5rZWRpbic7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sb2dpblByb3ZpZGVyT2JqLmlkID0gY2xpZW50SWQ7XG4gICAgICAgIHRoaXMubG9naW5Qcm92aWRlck9iai5uYW1lID0gJ2xpbmtlZGluJztcbiAgICAgICAgdGhpcy5sb2dpblByb3ZpZGVyT2JqLnVybCA9ICdodHRwczovL3BsYXRmb3JtLmxpbmtlZGluLmNvbS9pbi5qcyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPFNvY2lhbFVzZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZFNjcmlwdCh0aGlzLmxvZ2luUHJvdmlkZXJPYmosICgpID0+IHtcbiAgICAgICAgICAgICAgICBJTi5pbml0KHtcbiAgICAgICAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvbkxvYWQ6IHRoaXMub25MaW5rZWRJbkxvYWQoKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgSU4uRXZlbnQub24oSU4sICdhdXRoJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoSU4uVXNlci5pc0F1dGhvcml6ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSU4uQVBJLlJhdyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Blb3BsZS9+OihpZCxmaXJzdC1uYW1lLGxhc3QtbmFtZSxlbWFpbC1hZGRyZXNzLHBpY3R1cmUtdXJsKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICkucmVzdWx0KChyZXM6IExpbmtlZEluUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuZHJhd1VzZXIocmVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25MaW5rZWRJbkxvYWQoKSB7XG4gICAgICAgIElOLkV2ZW50Lm9uKElOLCAnc3lzdGVtUmVhZHknLCAoKSA9PiB7XG4gICAgICAgICAgICBJTi5Vc2VyLnJlZnJlc2goKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZHJhd1VzZXIocmVzcG9uc2U6IExpbmtlZEluUmVzcG9uc2UpOiBTb2NpYWxVc2VyIHtcblxuICAgICAgICBjb25zdCB1c2VyOiBTb2NpYWxVc2VyID0gbmV3IFNvY2lhbFVzZXIoKTtcbiAgICAgICAgdXNlci5pZCA9IHJlc3BvbnNlLmlkO1xuICAgICAgICB1c2VyLm5hbWUgPSByZXNwb25zZS5maXJzdE5hbWUgKyAnICcgKyByZXNwb25zZS5sYXN0TmFtZTtcbiAgICAgICAgdXNlci5lbWFpbCA9IHJlc3BvbnNlLmVtYWlsQWRkcmVzcztcbiAgICAgICAgdXNlci5pbWFnZSA9IHJlc3BvbnNlLnBpY3R1cmVVcmw7XG4gICAgICAgIHVzZXIuYWNjZXNzVG9rZW4gPSBJTi5FTlYuYXV0aC5vYXV0aF90b2tlbjtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgc2lnbkluKCk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgSU4uVXNlci5hdXRob3JpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIElOLkFQSS5SYXcoJy9wZW9wbGUvfjooaWQsZmlyc3QtbmFtZSxsYXN0LW5hbWUsZW1haWwtYWRkcmVzcyxwaWN0dXJlLXVybCknKS5yZXN1bHQoKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbGlua2VkaW4nLCByZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuZHJhd1VzZXIocmVzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbk91dCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgSU4uVXNlci5sb2dvdXQoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIHNoYXJpbmcoc2hhcmU/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAnY29tbWVudCc6IHNoYXJlID8gc2hhcmUuY29tbWVudCA6ICcnLFxuICAgICAgICAgICAgICAgICd2aXNpYmlsaXR5Jzoge1xuICAgICAgICAgICAgICAgICAgICAnY29kZSc6ICdhbnlvbmUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIElOLkFQSS5SYXcoJy9wZW9wbGUvfi9zaGFyZXM/Zm9ybWF0PWpzb24nKVxuICAgICAgICAgICAgICAgIC5tZXRob2QoJ1BPU1QnKVxuICAgICAgICAgICAgICAgIC5ib2R5KEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKVxuICAgICAgICAgICAgICAgIC5yZXN1bHQoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsaW5rZWRpbiBzaGFyZScsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZXJyb3Iob25FcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsaW5rZWRpbicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtMb2dpblBy