@dereekb/dbx-analytics 12.6.21 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/dereekb-dbx-analytics.mjs +53 -63
- package/fesm2022/dereekb-dbx-analytics.mjs.map +1 -1
- package/package.json +9 -11
- package/types/dereekb-dbx-analytics.d.ts +257 -0
- package/esm2022/dereekb-dbx-analytics.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/lib/action/analytics.action.directive.mjs +0 -56
- package/esm2022/lib/action/analytics.module.mjs +0 -19
- package/esm2022/lib/action/index.mjs +0 -3
- package/esm2022/lib/analytics/analytics.mjs +0 -2
- package/esm2022/lib/analytics/analytics.providers.mjs +0 -23
- package/esm2022/lib/analytics/analytics.service.mjs +0 -205
- package/esm2022/lib/analytics/analytics.stream.mjs +0 -22
- package/esm2022/lib/analytics/index.mjs +0 -5
- package/esm2022/lib/index.mjs +0 -4
- package/esm2022/lib/providers/index.mjs +0 -2
- package/esm2022/lib/providers/segment/index.mjs +0 -4
- package/esm2022/lib/providers/segment/segment.listener.service.mjs +0 -99
- package/esm2022/lib/providers/segment/segment.providers.mjs +0 -29
- package/esm2022/lib/providers/segment/segment.service.mjs +0 -64
- package/index.d.ts +0 -1
- package/lib/action/analytics.action.directive.d.ts +0 -28
- package/lib/action/analytics.module.d.ts +0 -10
- package/lib/action/index.d.ts +0 -2
- package/lib/analytics/analytics.d.ts +0 -25
- package/lib/analytics/analytics.providers.d.ts +0 -16
- package/lib/analytics/analytics.service.d.ts +0 -100
- package/lib/analytics/analytics.stream.d.ts +0 -26
- package/lib/analytics/index.d.ts +0 -4
- package/lib/index.d.ts +0 -3
- package/lib/providers/index.d.ts +0 -1
- package/lib/providers/segment/index.d.ts +0 -3
- package/lib/providers/segment/segment.listener.service.d.ts +0 -16
- package/lib/providers/segment/segment.providers.d.ts +0 -17
- package/lib/providers/segment/segment.service.d.ts +0 -27
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injector, EnvironmentProviders, InjectionToken } from '@angular/core';
|
|
3
|
+
import * as rxjs from 'rxjs';
|
|
4
|
+
import { Observable, BehaviorSubject, Subscription } from 'rxjs';
|
|
5
|
+
import { DbxActionContextStoreSourceInstance } from '@dereekb/dbx-core';
|
|
6
|
+
import { PrimativeKey, Maybe, Destroyable, ReadableError } from '@dereekb/util';
|
|
7
|
+
import { AbstractAsyncWindowLoadedService } from '@dereekb/browser';
|
|
8
|
+
|
|
9
|
+
type DbxAnalyticsEventName = string;
|
|
10
|
+
type DbxAnalyticsUserId = string;
|
|
11
|
+
interface DbxAnalyticsUserProperties {
|
|
12
|
+
readonly [key: string]: PrimativeKey | boolean;
|
|
13
|
+
}
|
|
14
|
+
interface DbxAnalyticsUser {
|
|
15
|
+
readonly user: DbxAnalyticsUserId;
|
|
16
|
+
readonly properties?: DbxAnalyticsUserProperties;
|
|
17
|
+
}
|
|
18
|
+
interface DbxAnalyticsEventData {
|
|
19
|
+
readonly [key: string]: PrimativeKey | boolean;
|
|
20
|
+
}
|
|
21
|
+
interface DbxAnalyticsEvent {
|
|
22
|
+
readonly name?: DbxAnalyticsEventName;
|
|
23
|
+
readonly value?: number;
|
|
24
|
+
readonly data?: DbxAnalyticsEventData;
|
|
25
|
+
}
|
|
26
|
+
interface DbxUserAnalyticsEvent extends DbxAnalyticsEvent {
|
|
27
|
+
readonly user?: Maybe<DbxAnalyticsUser>;
|
|
28
|
+
}
|
|
29
|
+
type NewUserRegistrationMethod = 'facebook' | 'google' | 'email' | string;
|
|
30
|
+
interface NewUserAnalyticsEventData extends DbxAnalyticsEventData {
|
|
31
|
+
method: NewUserRegistrationMethod;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare enum DbxAnalyticsStreamEventType {
|
|
35
|
+
PageView = 0,
|
|
36
|
+
/**
|
|
37
|
+
* Emitted any time the user value changes.
|
|
38
|
+
*
|
|
39
|
+
* Can emit when the user goes from defined to undefined.
|
|
40
|
+
*/
|
|
41
|
+
UserChange = 1,
|
|
42
|
+
/**
|
|
43
|
+
* Emitted any time the user id changes.
|
|
44
|
+
*/
|
|
45
|
+
UserIdChange = 2,
|
|
46
|
+
NewUserEvent = 3,
|
|
47
|
+
UserLoginEvent = 4,
|
|
48
|
+
UserLogoutEvent = 5,
|
|
49
|
+
UserPropertiesEvent = 6,
|
|
50
|
+
Event = 7
|
|
51
|
+
}
|
|
52
|
+
interface DbxAnalyticsStreamEvent {
|
|
53
|
+
readonly type: DbxAnalyticsStreamEventType;
|
|
54
|
+
readonly user?: Maybe<DbxAnalyticsUser>;
|
|
55
|
+
readonly event?: DbxUserAnalyticsEvent;
|
|
56
|
+
readonly userId?: DbxAnalyticsUserId;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
declare abstract class DbxAnalyticsEventEmitterService {
|
|
60
|
+
abstract sendNewUserEvent(user: DbxAnalyticsUser, data: NewUserAnalyticsEventData): void;
|
|
61
|
+
abstract sendUserLoginEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
|
|
62
|
+
abstract sendUserLogoutEvent(data?: DbxAnalyticsEventData): void;
|
|
63
|
+
abstract sendUserPropertiesEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
|
|
64
|
+
abstract sendEventData(name: DbxAnalyticsEventName, data?: DbxAnalyticsEventData): void;
|
|
65
|
+
abstract sendEvent(event: DbxAnalyticsEvent): void;
|
|
66
|
+
abstract sendPageView(page?: string): void;
|
|
67
|
+
}
|
|
68
|
+
declare abstract class DbxAnalyticsEventStreamService {
|
|
69
|
+
abstract readonly events$: Observable<DbxAnalyticsStreamEvent>;
|
|
70
|
+
}
|
|
71
|
+
declare abstract class DbxAnalyticsUserSource {
|
|
72
|
+
abstract readonly analyticsUser$: Observable<Maybe<DbxAnalyticsUser>>;
|
|
73
|
+
}
|
|
74
|
+
declare abstract class DbxAnalyticsServiceListener {
|
|
75
|
+
abstract listenToService(service: DbxAnalyticsService): void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Abstract AnalyticsServiceListener implementation.
|
|
79
|
+
*/
|
|
80
|
+
declare abstract class AbstractDbxAnalyticsServiceListener implements DbxAnalyticsServiceListener, Destroyable {
|
|
81
|
+
private _sub;
|
|
82
|
+
protected _analytics: BehaviorSubject<Maybe<DbxAnalyticsService>>;
|
|
83
|
+
readonly analytics$: Observable<DbxAnalyticsService>;
|
|
84
|
+
readonly analyticsEvents$: Observable<DbxAnalyticsStreamEvent>;
|
|
85
|
+
listenToService(service: DbxAnalyticsService): void;
|
|
86
|
+
protected abstract _initializeServiceSubscription(): Subscription | false;
|
|
87
|
+
destroy(): void;
|
|
88
|
+
}
|
|
89
|
+
declare abstract class DbxAnalyticsServiceConfiguration {
|
|
90
|
+
readonly listeners: DbxAnalyticsServiceListener[];
|
|
91
|
+
readonly isProduction?: boolean;
|
|
92
|
+
readonly logEvents?: boolean;
|
|
93
|
+
readonly userSource?: DbxAnalyticsUserSource;
|
|
94
|
+
}
|
|
95
|
+
interface DbxAnalyticsStreamEventAnalyticsEventWrapper extends DbxAnalyticsStreamEvent {
|
|
96
|
+
readonly event: DbxUserAnalyticsEvent;
|
|
97
|
+
readonly type: DbxAnalyticsStreamEventType;
|
|
98
|
+
readonly user: Maybe<DbxAnalyticsUser>;
|
|
99
|
+
readonly userId: string | undefined;
|
|
100
|
+
}
|
|
101
|
+
declare function dbxAnalyticsStreamEventAnalyticsEventWrapper(event: DbxUserAnalyticsEvent, type?: DbxAnalyticsStreamEventType): {
|
|
102
|
+
event: DbxUserAnalyticsEvent;
|
|
103
|
+
type: DbxAnalyticsStreamEventType;
|
|
104
|
+
user: Maybe<DbxAnalyticsUser>;
|
|
105
|
+
userId: string | undefined;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Primary analytics service that emits analytics events that components can listen to.
|
|
109
|
+
*/
|
|
110
|
+
declare class DbxAnalyticsService implements DbxAnalyticsEventStreamService, DbxAnalyticsEventEmitterService, Destroyable {
|
|
111
|
+
private readonly _config;
|
|
112
|
+
static readonly USER_REGISTRATION_EVENT_NAME = "User Registered";
|
|
113
|
+
static readonly USER_LOGIN_EVENT_NAME = "User Login";
|
|
114
|
+
static readonly USER_LOGOUT_EVENT_NAME = "User Logout";
|
|
115
|
+
static readonly USER_PROPERTIES_EVENT_NAME = "User Properties";
|
|
116
|
+
private _subject;
|
|
117
|
+
readonly events$: Observable<DbxAnalyticsStreamEvent>;
|
|
118
|
+
private _userSource;
|
|
119
|
+
readonly user$: Observable<Maybe<DbxAnalyticsUser>>;
|
|
120
|
+
private _userSourceSub;
|
|
121
|
+
private _userIdEventSub;
|
|
122
|
+
private _loggerSub;
|
|
123
|
+
constructor();
|
|
124
|
+
/**
|
|
125
|
+
* Sets the user directly, overridding the UserSource.
|
|
126
|
+
*/
|
|
127
|
+
setUser(user: Maybe<DbxAnalyticsUser>): void;
|
|
128
|
+
setUserSource(source: DbxAnalyticsUserSource): void;
|
|
129
|
+
/**
|
|
130
|
+
* Sends an event.
|
|
131
|
+
*/
|
|
132
|
+
sendNewUserEvent(user: DbxAnalyticsUser, data: NewUserAnalyticsEventData): void;
|
|
133
|
+
sendUserLoginEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
|
|
134
|
+
sendUserLogoutEvent(data?: DbxAnalyticsEventData, clearUser?: boolean): void;
|
|
135
|
+
sendUserPropertiesEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
|
|
136
|
+
sendEventData(name: DbxAnalyticsEventName, data?: DbxAnalyticsEventData): void;
|
|
137
|
+
sendEventType(eventType: DbxAnalyticsEventName): void;
|
|
138
|
+
sendEvent(event: DbxAnalyticsEvent): void;
|
|
139
|
+
sendPageView(page?: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* Sends the next event.
|
|
142
|
+
*
|
|
143
|
+
* @param event
|
|
144
|
+
* @param type
|
|
145
|
+
* @param userOverride Uses this user if set as null or an override value. If undefined the current analytics user is used.
|
|
146
|
+
*/
|
|
147
|
+
protected sendNextEvent(event: DbxAnalyticsEvent | undefined, type: DbxAnalyticsStreamEventType, userOverride?: Maybe<DbxAnalyticsUser>): void;
|
|
148
|
+
protected nextEvent(event: DbxUserAnalyticsEvent, type: DbxAnalyticsStreamEventType): void;
|
|
149
|
+
private _init;
|
|
150
|
+
destroy(): void;
|
|
151
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsService, never>;
|
|
152
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DbxAnalyticsService>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* DbxActionAnalyticsDirective config
|
|
157
|
+
*/
|
|
158
|
+
interface DbxActionAnalyticsConfig<T = unknown, O = unknown> {
|
|
159
|
+
readonly onTriggered?: (service: DbxAnalyticsService) => void;
|
|
160
|
+
readonly onReady?: (service: DbxAnalyticsService, value: T) => void;
|
|
161
|
+
readonly onSuccess?: (service: DbxAnalyticsService, result: Maybe<O>, value: T) => void;
|
|
162
|
+
readonly onError?: (service: DbxAnalyticsService, error: Maybe<ReadableError>) => void;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Used to listen to an ActionContext and send analytical events based on action events.
|
|
166
|
+
*/
|
|
167
|
+
declare class DbxActionAnalyticsDirective<T, O> {
|
|
168
|
+
readonly source: DbxActionContextStoreSourceInstance<T, O>;
|
|
169
|
+
readonly analyticsService: DbxAnalyticsService;
|
|
170
|
+
readonly config: i0.InputSignal<Maybe<DbxActionAnalyticsConfig<T, O>>>;
|
|
171
|
+
readonly config$: Observable<DbxActionAnalyticsConfig<T, O>>;
|
|
172
|
+
constructor();
|
|
173
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DbxActionAnalyticsDirective<any, any>, never>;
|
|
174
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<DbxActionAnalyticsDirective<any, any>, "[dbxActionAnalytics]", never, { "config": { "alias": "dbxActionAnalytics"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @deprecated The exported DbxActionAnalyticsDirective is now a standalone component. Import that instead.
|
|
179
|
+
*/
|
|
180
|
+
declare class DbxAnalyticsActionModule {
|
|
181
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsActionModule, never>;
|
|
182
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<DbxAnalyticsActionModule, never, [typeof DbxActionAnalyticsDirective], [typeof DbxActionAnalyticsDirective]>;
|
|
183
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<DbxAnalyticsActionModule>;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
type DbxAnalyticsServiceConfigurationFactory = (injector: Injector) => DbxAnalyticsServiceConfiguration;
|
|
187
|
+
/**
|
|
188
|
+
* Configuration for provideDbxAnalyticsService()
|
|
189
|
+
*/
|
|
190
|
+
interface ProvideDbxAnalyticsConfig {
|
|
191
|
+
readonly dbxAnalyticsServiceConfigurationFactory: DbxAnalyticsServiceConfigurationFactory;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Creates a EnvironmentProviders that provides a DbxAnalyticsService.
|
|
195
|
+
*
|
|
196
|
+
* @param config Configuration
|
|
197
|
+
* @returns EnvironmentProviders
|
|
198
|
+
*/
|
|
199
|
+
declare function provideDbxAnalyticsService(config: ProvideDbxAnalyticsConfig): EnvironmentProviders;
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* DbxAnalyticsServiceListener adapter for Segment.
|
|
203
|
+
*/
|
|
204
|
+
declare class DbxAnalyticsSegmentServiceListener extends AbstractDbxAnalyticsServiceListener {
|
|
205
|
+
private readonly _segmentApi;
|
|
206
|
+
constructor();
|
|
207
|
+
protected _initializeServiceSubscription(): rxjs.Subscription;
|
|
208
|
+
protected handleStreamEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: DbxAnalyticsStreamEvent): void;
|
|
209
|
+
protected updateWithNewUserEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: DbxAnalyticsStreamEvent): void;
|
|
210
|
+
protected updateWithEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: DbxAnalyticsStreamEvent, name?: string): void;
|
|
211
|
+
private changeUser;
|
|
212
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsSegmentServiceListener, never>;
|
|
213
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DbxAnalyticsSegmentServiceListener>;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
declare const PRELOAD_SEGMENT_TOKEN: InjectionToken<string>;
|
|
217
|
+
declare class DbxAnalyticsSegmentApiServiceConfig {
|
|
218
|
+
writeKey: string;
|
|
219
|
+
logging: boolean;
|
|
220
|
+
active: boolean;
|
|
221
|
+
constructor(writeKey: string);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Segment API Service used for waiting/retrieving the segment API from window when initialized.
|
|
225
|
+
*
|
|
226
|
+
* This requires some setup in index.html.
|
|
227
|
+
*/
|
|
228
|
+
declare class DbxAnalyticsSegmentApiService extends AbstractAsyncWindowLoadedService<SegmentAnalytics.AnalyticsJS> {
|
|
229
|
+
private readonly _config;
|
|
230
|
+
static readonly SEGMENT_API_WINDOW_KEY = "analytics";
|
|
231
|
+
static readonly SEGMENT_READY_KEY = "SegmentReady";
|
|
232
|
+
constructor();
|
|
233
|
+
get config(): DbxAnalyticsSegmentApiServiceConfig;
|
|
234
|
+
protected _prepareCompleteLoadingService(): Promise<void>;
|
|
235
|
+
protected _initService(service: SegmentAnalytics.AnalyticsJS): Promise<SegmentAnalytics.AnalyticsJS>;
|
|
236
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsSegmentApiService, never>;
|
|
237
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DbxAnalyticsSegmentApiService>;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
type DbxAnalyticsSegmentApiServiceConfigFactory = (injector: Injector) => DbxAnalyticsSegmentApiServiceConfig;
|
|
241
|
+
/**
|
|
242
|
+
* Configuration for provideDbxAnalyticsSegmentApiService()
|
|
243
|
+
*/
|
|
244
|
+
interface ProvideDbxAnalyticsSegmentModuleConfig {
|
|
245
|
+
readonly preloadSegmentToken?: boolean;
|
|
246
|
+
readonly dbxAnalyticsSegmentApiServiceConfigFactory: DbxAnalyticsSegmentApiServiceConfigFactory;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Creates a EnvironmentProviders that provides a DbxAnalyticsSegmentApiService.
|
|
250
|
+
*
|
|
251
|
+
* @param config Configuration
|
|
252
|
+
* @returns EnvironmentProviders
|
|
253
|
+
*/
|
|
254
|
+
declare function provideDbxAnalyticsSegmentApiService(config: ProvideDbxAnalyticsSegmentModuleConfig): EnvironmentProviders;
|
|
255
|
+
|
|
256
|
+
export { AbstractDbxAnalyticsServiceListener, DbxActionAnalyticsDirective, DbxAnalyticsActionModule, DbxAnalyticsEventEmitterService, DbxAnalyticsEventStreamService, DbxAnalyticsSegmentApiService, DbxAnalyticsSegmentApiServiceConfig, DbxAnalyticsSegmentServiceListener, DbxAnalyticsService, DbxAnalyticsServiceConfiguration, DbxAnalyticsServiceListener, DbxAnalyticsStreamEventType, DbxAnalyticsUserSource, PRELOAD_SEGMENT_TOKEN, dbxAnalyticsStreamEventAnalyticsEventWrapper, provideDbxAnalyticsSegmentApiService, provideDbxAnalyticsService };
|
|
257
|
+
export type { DbxActionAnalyticsConfig, DbxAnalyticsEvent, DbxAnalyticsEventData, DbxAnalyticsEventName, DbxAnalyticsSegmentApiServiceConfigFactory, DbxAnalyticsServiceConfigurationFactory, DbxAnalyticsStreamEvent, DbxAnalyticsStreamEventAnalyticsEventWrapper, DbxAnalyticsUser, DbxAnalyticsUserId, DbxAnalyticsUserProperties, DbxUserAnalyticsEvent, NewUserAnalyticsEventData, NewUserRegistrationMethod, ProvideDbxAnalyticsConfig, ProvideDbxAnalyticsSegmentModuleConfig };
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyZWVrYi1kYngtYW5hbHl0aWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWFuYWx5dGljcy9zcmMvZGVyZWVrYi1kYngtYW5hbHl0aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
package/esm2022/index.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export * from './lib';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliJztcbiJdfQ==
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { filterMaybe } from '@dereekb/rxjs';
|
|
2
|
-
import { switchMap, tap, shareReplay, merge, of } from 'rxjs';
|
|
3
|
-
import { Directive, inject, input } from '@angular/core';
|
|
4
|
-
import { DbxActionContextStoreSourceInstance, AbstractSubscriptionDirective } from '@dereekb/dbx-core';
|
|
5
|
-
import { DbxAnalyticsService } from '../analytics/analytics.service';
|
|
6
|
-
import { toObservable } from '@angular/core/rxjs-interop';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
/**
|
|
9
|
-
* Used to listen to an ActionContext and send analytical events based on action events.
|
|
10
|
-
*/
|
|
11
|
-
export class DbxActionAnalyticsDirective extends AbstractSubscriptionDirective {
|
|
12
|
-
source = inject((DbxActionContextStoreSourceInstance), { host: true });
|
|
13
|
-
analyticsService = inject(DbxAnalyticsService);
|
|
14
|
-
config = input(undefined, { alias: 'dbxActionAnalytics' });
|
|
15
|
-
config$ = toObservable(this.config).pipe(filterMaybe(), shareReplay(1));
|
|
16
|
-
ngOnInit() {
|
|
17
|
-
this.sub = this.config$
|
|
18
|
-
.pipe(switchMap(({ onTriggered, onReady, onSuccess, onError }) => {
|
|
19
|
-
const triggerObs = [];
|
|
20
|
-
if (onTriggered) {
|
|
21
|
-
triggerObs.push(this.source.triggered$.pipe(tap(() => onTriggered(this.analyticsService))));
|
|
22
|
-
}
|
|
23
|
-
if (onReady) {
|
|
24
|
-
triggerObs.push(this.source.valueReady$.pipe(tap((value) => onReady(this.analyticsService, value))));
|
|
25
|
-
}
|
|
26
|
-
if (onSuccess) {
|
|
27
|
-
triggerObs.push(this.source.successPair$.pipe(tap(({ result, value }) => onSuccess(this.analyticsService, result, value))));
|
|
28
|
-
}
|
|
29
|
-
if (onError) {
|
|
30
|
-
triggerObs.push(this.source.error$.pipe(filterMaybe(), tap((error) => onError(this.analyticsService, error))));
|
|
31
|
-
}
|
|
32
|
-
if (triggerObs.length) {
|
|
33
|
-
return merge(...triggerObs);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
return of();
|
|
37
|
-
}
|
|
38
|
-
}))
|
|
39
|
-
.subscribe();
|
|
40
|
-
}
|
|
41
|
-
ngOnDestroy() {
|
|
42
|
-
this.source.lockSet.onNextUnlock(() => {
|
|
43
|
-
super.ngOnDestroy();
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxActionAnalyticsDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
47
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: DbxActionAnalyticsDirective, isStandalone: true, selector: "[dbxActionAnalytics]", inputs: { config: { classPropertyName: "config", publicName: "dbxActionAnalytics", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0 });
|
|
48
|
-
}
|
|
49
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxActionAnalyticsDirective, decorators: [{
|
|
50
|
-
type: Directive,
|
|
51
|
-
args: [{
|
|
52
|
-
selector: '[dbxActionAnalytics]',
|
|
53
|
-
standalone: true
|
|
54
|
-
}]
|
|
55
|
-
}] });
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLmFjdGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9uL2FuYWx5dGljcy5hY3Rpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBWTFEOztHQUVHO0FBS0gsTUFBTSxPQUFPLDJCQUFrQyxTQUFRLDZCQUE2QjtJQUN6RSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUEsbUNBQXlDLENBQUEsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sR0FBRyxLQUFLLENBQXdDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDbEcsT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpGLFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ3BCLElBQUksQ0FDSCxTQUFTLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDekQsTUFBTSxVQUFVLEdBQTBCLEVBQUUsQ0FBQztZQUU3QyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLENBQUM7WUFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RyxDQUFDO1lBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUgsQ0FBQztZQUVELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osVUFBVSxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JCLFdBQVcsRUFBRSxFQUNiLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUN0RCxDQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDOUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRVEsV0FBVztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBaERVLDJCQUEyQjs0RkFBM0IsMkJBQTJCOzs0RkFBM0IsMkJBQTJCO2tCQUp2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbHRlck1heWJlIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCwgc2hhcmVSZXBsYXksIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGJ4QWN0aW9uQ29udGV4dFN0b3JlU291cmNlSW5zdGFuY2UsIEFic3RyYWN0U3Vic2NyaXB0aW9uRGlyZWN0aXZlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgRGJ4QW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uL2FuYWx5dGljcy9hbmFseXRpY3Muc2VydmljZSc7XG5pbXBvcnQgeyBNYXliZSwgUmVhZGFibGVFcnJvciB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG4vKipcbiAqIERieEFjdGlvbkFuYWx5dGljc0RpcmVjdGl2ZSBjb25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYnhBY3Rpb25BbmFseXRpY3NDb25maWc8VCA9IHVua25vd24sIE8gPSB1bmtub3duPiB7XG4gIG9uVHJpZ2dlcmVkPzogKHNlcnZpY2U6IERieEFuYWx5dGljc1NlcnZpY2UpID0+IHZvaWQ7XG4gIG9uUmVhZHk/OiAoc2VydmljZTogRGJ4QW5hbHl0aWNzU2VydmljZSwgdmFsdWU6IFQpID0+IHZvaWQ7XG4gIG9uU3VjY2Vzcz86IChzZXJ2aWNlOiBEYnhBbmFseXRpY3NTZXJ2aWNlLCByZXN1bHQ6IE1heWJlPE8+LCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgb25FcnJvcj86IChzZXJ2aWNlOiBEYnhBbmFseXRpY3NTZXJ2aWNlLCBlcnJvcjogTWF5YmU8UmVhZGFibGVFcnJvcj4pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogVXNlZCB0byBsaXN0ZW4gdG8gYW4gQWN0aW9uQ29udGV4dCBhbmQgc2VuZCBhbmFseXRpY2FsIGV2ZW50cyBiYXNlZCBvbiBhY3Rpb24gZXZlbnRzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZGJ4QWN0aW9uQW5hbHl0aWNzXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRGJ4QWN0aW9uQW5hbHl0aWNzRGlyZWN0aXZlPFQsIE8+IGV4dGVuZHMgQWJzdHJhY3RTdWJzY3JpcHRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IHNvdXJjZSA9IGluamVjdChEYnhBY3Rpb25Db250ZXh0U3RvcmVTb3VyY2VJbnN0YW5jZTxULCBPPiwgeyBob3N0OiB0cnVlIH0pO1xuICByZWFkb25seSBhbmFseXRpY3NTZXJ2aWNlID0gaW5qZWN0KERieEFuYWx5dGljc1NlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0PE1heWJlPERieEFjdGlvbkFuYWx5dGljc0NvbmZpZzxULCBPPj4+KHVuZGVmaW5lZCwgeyBhbGlhczogJ2RieEFjdGlvbkFuYWx5dGljcycgfSk7XG4gIHJlYWRvbmx5IGNvbmZpZyQgPSB0b09ic2VydmFibGUodGhpcy5jb25maWcpLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViID0gdGhpcy5jb25maWckXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCh7IG9uVHJpZ2dlcmVkLCBvblJlYWR5LCBvblN1Y2Nlc3MsIG9uRXJyb3IgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJPYnM6IE9ic2VydmFibGU8dW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICAgICAgaWYgKG9uVHJpZ2dlcmVkKSB7XG4gICAgICAgICAgICB0cmlnZ2VyT2JzLnB1c2godGhpcy5zb3VyY2UudHJpZ2dlcmVkJC5waXBlKHRhcCgoKSA9PiBvblRyaWdnZXJlZCh0aGlzLmFuYWx5dGljc1NlcnZpY2UpKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvblJlYWR5KSB7XG4gICAgICAgICAgICB0cmlnZ2VyT2JzLnB1c2godGhpcy5zb3VyY2UudmFsdWVSZWFkeSQucGlwZSh0YXAoKHZhbHVlKSA9PiBvblJlYWR5KHRoaXMuYW5hbHl0aWNzU2VydmljZSwgdmFsdWUpKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRyaWdnZXJPYnMucHVzaCh0aGlzLnNvdXJjZS5zdWNjZXNzUGFpciQucGlwZSh0YXAoKHsgcmVzdWx0LCB2YWx1ZSB9KSA9PiBvblN1Y2Nlc3ModGhpcy5hbmFseXRpY3NTZXJ2aWNlLCByZXN1bHQsIHZhbHVlKSkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob25FcnJvcikge1xuICAgICAgICAgICAgdHJpZ2dlck9icy5wdXNoKFxuICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5lcnJvciQucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXJNYXliZSgpLFxuICAgICAgICAgICAgICAgIHRhcCgoZXJyb3IpID0+IG9uRXJyb3IodGhpcy5hbmFseXRpY3NTZXJ2aWNlLCBlcnJvcikpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJPYnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoLi4udHJpZ2dlck9icyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc291cmNlLmxvY2tTZXQub25OZXh0VW5sb2NrKCgpID0+IHtcbiAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { DbxActionAnalyticsDirective } from './analytics.action.directive';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* @deprecated The exported DbxActionAnalyticsDirective is now a standalone component. Import that instead.
|
|
6
|
-
*/
|
|
7
|
-
export class DbxAnalyticsActionModule {
|
|
8
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
9
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule, imports: [DbxActionAnalyticsDirective], exports: [DbxActionAnalyticsDirective] });
|
|
10
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule });
|
|
11
|
-
}
|
|
12
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule, decorators: [{
|
|
13
|
-
type: NgModule,
|
|
14
|
-
args: [{
|
|
15
|
-
imports: [DbxActionAnalyticsDirective],
|
|
16
|
-
exports: [DbxActionAnalyticsDirective]
|
|
17
|
-
}]
|
|
18
|
-
}] });
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb24vYW5hbHl0aWNzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQUUzRTs7R0FFRztBQUtILE1BQU0sT0FBTyx3QkFBd0I7d0dBQXhCLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLFlBSHpCLDJCQUEyQixhQUMzQiwyQkFBMkI7eUdBRTFCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFKcEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztvQkFDdEMsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERieEFjdGlvbkFuYWx5dGljc0RpcmVjdGl2ZSB9IGZyb20gJy4vYW5hbHl0aWNzLmFjdGlvbi5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFRoZSBleHBvcnRlZCBEYnhBY3Rpb25BbmFseXRpY3NEaXJlY3RpdmUgaXMgbm93IGEgc3RhbmRhbG9uZSBjb21wb25lbnQuIEltcG9ydCB0aGF0IGluc3RlYWQuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtEYnhBY3Rpb25BbmFseXRpY3NEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbRGJ4QWN0aW9uQW5hbHl0aWNzRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBEYnhBbmFseXRpY3NBY3Rpb25Nb2R1bGUge31cbiJdfQ==
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from './analytics.action.directive';
|
|
2
|
-
export * from './analytics.module';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmFjdGlvbi5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9hbmFseXRpY3MubW9kdWxlJztcbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWFuYWx5dGljcy9zcmMvbGliL2FuYWx5dGljcy9hbmFseXRpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWF5YmUsIHR5cGUgUHJpbWF0aXZlS2V5IH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5cbmV4cG9ydCB0eXBlIERieEFuYWx5dGljc0V2ZW50TmFtZSA9IHN0cmluZztcbmV4cG9ydCB0eXBlIERieEFuYWx5dGljc1VzZXJJZCA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBEYnhBbmFseXRpY3NVc2VyUHJvcGVydGllcyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFByaW1hdGl2ZUtleSB8IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4QW5hbHl0aWNzVXNlciB7XG4gIHJlYWRvbmx5IHVzZXI6IERieEFuYWx5dGljc1VzZXJJZDtcbiAgcmVhZG9ubHkgcHJvcGVydGllcz86IERieEFuYWx5dGljc1VzZXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERieEFuYWx5dGljc0V2ZW50RGF0YSB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFByaW1hdGl2ZUtleSB8IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4QW5hbHl0aWNzRXZlbnQge1xuICByZWFkb25seSBuYW1lPzogRGJ4QW5hbHl0aWNzRXZlbnROYW1lO1xuICByZWFkb25seSB2YWx1ZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgZGF0YT86IERieEFuYWx5dGljc0V2ZW50RGF0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYnhVc2VyQW5hbHl0aWNzRXZlbnQgZXh0ZW5kcyBEYnhBbmFseXRpY3NFdmVudCB7XG4gIHJlYWRvbmx5IHVzZXI/OiBNYXliZTxEYnhBbmFseXRpY3NVc2VyPjtcbn1cblxuLy8gTUFSSzogTmV3IFVzZXJcbmV4cG9ydCB0eXBlIE5ld1VzZXJSZWdpc3RyYXRpb25NZXRob2QgPSAnZmFjZWJvb2snIHwgJ2dvb2dsZScgfCAnZW1haWwnIHwgc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ld1VzZXJBbmFseXRpY3NFdmVudERhdGEgZXh0ZW5kcyBEYnhBbmFseXRpY3NFdmVudERhdGEge1xuICBtZXRob2Q6IE5ld1VzZXJSZWdpc3RyYXRpb25NZXRob2Q7XG59XG4iXX0=
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Injector, makeEnvironmentProviders } from '@angular/core';
|
|
2
|
-
import { DbxAnalyticsServiceConfiguration, DbxAnalyticsService } from './analytics.service';
|
|
3
|
-
/**
|
|
4
|
-
* Creates a EnvironmentProviders that provides a DbxAnalyticsService.
|
|
5
|
-
*
|
|
6
|
-
* @param config Configuration
|
|
7
|
-
* @returns EnvironmentProviders
|
|
8
|
-
*/
|
|
9
|
-
export function provideDbxAnalyticsService(config) {
|
|
10
|
-
const { dbxAnalyticsServiceConfigurationFactory } = config;
|
|
11
|
-
const providers = [
|
|
12
|
-
// configuration
|
|
13
|
-
{
|
|
14
|
-
provide: DbxAnalyticsServiceConfiguration,
|
|
15
|
-
useFactory: dbxAnalyticsServiceConfigurationFactory,
|
|
16
|
-
deps: [Injector]
|
|
17
|
-
},
|
|
18
|
-
// service
|
|
19
|
-
DbxAnalyticsService
|
|
20
|
-
];
|
|
21
|
-
return makeEnvironmentProviders(providers);
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLnByb3ZpZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1hbmFseXRpY3Mvc3JjL2xpYi9hbmFseXRpY3MvYW5hbHl0aWNzLnByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTZCLFFBQVEsRUFBaUIsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLGdDQUFnQyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFXNUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsTUFBaUM7SUFDMUUsTUFBTSxFQUFFLHVDQUF1QyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTNELE1BQU0sU0FBUyxHQUFlO1FBQzVCLGdCQUFnQjtRQUNoQjtZQUNFLE9BQU8sRUFBRSxnQ0FBZ0M7WUFDekMsVUFBVSxFQUFFLHVDQUF1QztZQUNuRCxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDakI7UUFDRCxVQUFVO1FBQ1YsbUJBQW1CO0tBQ3BCLENBQUM7SUFFRixPQUFPLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEVudmlyb25tZW50UHJvdmlkZXJzLCBJbmplY3RvciwgdHlwZSBQcm92aWRlciwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbiwgRGJ4QW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4vYW5hbHl0aWNzLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbkZhY3RvcnkgPSAoaW5qZWN0b3I6IEluamVjdG9yKSA9PiBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwcm92aWRlRGJ4QW5hbHl0aWNzU2VydmljZSgpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZURieEFuYWx5dGljc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGRieEFuYWx5dGljc1NlcnZpY2VDb25maWd1cmF0aW9uRmFjdG9yeTogRGJ4QW5hbHl0aWNzU2VydmljZUNvbmZpZ3VyYXRpb25GYWN0b3J5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBFbnZpcm9ubWVudFByb3ZpZGVycyB0aGF0IHByb3ZpZGVzIGEgRGJ4QW5hbHl0aWNzU2VydmljZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEVudmlyb25tZW50UHJvdmlkZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGJ4QW5hbHl0aWNzU2VydmljZShjb25maWc6IFByb3ZpZGVEYnhBbmFseXRpY3NDb25maWcpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIGNvbnN0IHsgZGJ4QW5hbHl0aWNzU2VydmljZUNvbmZpZ3VyYXRpb25GYWN0b3J5IH0gPSBjb25maWc7XG5cbiAgY29uc3QgcHJvdmlkZXJzOiBQcm92aWRlcltdID0gW1xuICAgIC8vIGNvbmZpZ3VyYXRpb25cbiAgICB7XG4gICAgICBwcm92aWRlOiBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbixcbiAgICAgIHVzZUZhY3Rvcnk6IGRieEFuYWx5dGljc1NlcnZpY2VDb25maWd1cmF0aW9uRmFjdG9yeSxcbiAgICAgIGRlcHM6IFtJbmplY3Rvcl1cbiAgICB9LFxuICAgIC8vIHNlcnZpY2VcbiAgICBEYnhBbmFseXRpY3NTZXJ2aWNlXG4gIF07XG5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhwcm92aWRlcnMpO1xufVxuIl19
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { Subject, BehaviorSubject, of, first, shareReplay, switchMap, distinctUntilChanged } from 'rxjs';
|
|
2
|
-
import { Inject, Injectable, Optional, inject } from '@angular/core';
|
|
3
|
-
import { SubscriptionObject, filterMaybe } from '@dereekb/rxjs';
|
|
4
|
-
import { DbxAnalyticsStreamEventType } from './analytics.stream';
|
|
5
|
-
import { safeCompareEquality } from '@dereekb/util';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class DbxAnalyticsEventEmitterService {
|
|
8
|
-
}
|
|
9
|
-
export class DbxAnalyticsEventStreamService {
|
|
10
|
-
}
|
|
11
|
-
export class DbxAnalyticsUserSource {
|
|
12
|
-
}
|
|
13
|
-
export class DbxAnalyticsServiceListener {
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Abstract AnalyticsServiceListener implementation.
|
|
17
|
-
*/
|
|
18
|
-
export class AbstractDbxAnalyticsServiceListener {
|
|
19
|
-
_sub = new SubscriptionObject();
|
|
20
|
-
_analytics = new BehaviorSubject(undefined);
|
|
21
|
-
analytics$ = this._analytics.pipe(filterMaybe(), shareReplay(1));
|
|
22
|
-
analyticsEvents$ = this.analytics$.pipe(switchMap((x) => x.events$), shareReplay(1));
|
|
23
|
-
// MARK: AnalyticsServiceListener
|
|
24
|
-
listenToService(service) {
|
|
25
|
-
this._analytics.next(service);
|
|
26
|
-
const sub = this._initializeServiceSubscription();
|
|
27
|
-
if (sub !== false) {
|
|
28
|
-
this._sub.subscription = sub;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
// MARK: Destroy
|
|
32
|
-
destroy() {
|
|
33
|
-
this._analytics.complete();
|
|
34
|
-
this._sub.destroy();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
export class DbxAnalyticsServiceConfiguration {
|
|
38
|
-
listeners = [];
|
|
39
|
-
isProduction;
|
|
40
|
-
logEvents;
|
|
41
|
-
userSource;
|
|
42
|
-
}
|
|
43
|
-
export function dbxAnalyticsStreamEventAnalyticsEventWrapper(event, type = DbxAnalyticsStreamEventType.Event) {
|
|
44
|
-
const { user } = event;
|
|
45
|
-
const userId = user ? user.user : undefined;
|
|
46
|
-
return {
|
|
47
|
-
event,
|
|
48
|
-
type,
|
|
49
|
-
user,
|
|
50
|
-
userId
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Primary analytics service that emits analytics events that components can listen to.
|
|
55
|
-
*/
|
|
56
|
-
export class DbxAnalyticsService {
|
|
57
|
-
_config = inject(DbxAnalyticsServiceConfiguration);
|
|
58
|
-
// TODO: Make these configurable.
|
|
59
|
-
static USER_REGISTRATION_EVENT_NAME = 'User Registered';
|
|
60
|
-
static USER_LOGIN_EVENT_NAME = 'User Login';
|
|
61
|
-
static USER_LOGOUT_EVENT_NAME = 'User Logout';
|
|
62
|
-
static USER_PROPERTIES_EVENT_NAME = 'User Properties';
|
|
63
|
-
_subject = new Subject();
|
|
64
|
-
events$ = this._subject.asObservable();
|
|
65
|
-
_userSource = new BehaviorSubject(undefined);
|
|
66
|
-
user$ = this._userSource.pipe(switchMap((x) => (x ? x.analyticsUser$ : of(undefined))), shareReplay(1));
|
|
67
|
-
_userSourceSub = new SubscriptionObject();
|
|
68
|
-
_userIdEventSub = new SubscriptionObject();
|
|
69
|
-
_loggerSub = new SubscriptionObject();
|
|
70
|
-
constructor(userSource) {
|
|
71
|
-
this._init();
|
|
72
|
-
userSource = userSource || this._config.userSource;
|
|
73
|
-
if (userSource) {
|
|
74
|
-
this.setUserSource(userSource);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// MARK: Source
|
|
78
|
-
/**
|
|
79
|
-
* Sets the user directly, overridding the UserSource.
|
|
80
|
-
*/
|
|
81
|
-
setUser(user) {
|
|
82
|
-
let source;
|
|
83
|
-
if (user) {
|
|
84
|
-
source = { analyticsUser$: of(user) };
|
|
85
|
-
}
|
|
86
|
-
this._userSource.next(source);
|
|
87
|
-
if (this._userSource.value) {
|
|
88
|
-
console.warn('DbxAnalyticsService has a userSource that is set. Source is now overridden by setUser() value.');
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
setUserSource(source) {
|
|
92
|
-
this._userSource.next(source);
|
|
93
|
-
}
|
|
94
|
-
// MARK: AnalyticsEventEmitterService
|
|
95
|
-
/**
|
|
96
|
-
* Sends an event.
|
|
97
|
-
*/
|
|
98
|
-
sendNewUserEvent(user, data) {
|
|
99
|
-
this.sendNextEvent({
|
|
100
|
-
name: DbxAnalyticsService.USER_REGISTRATION_EVENT_NAME,
|
|
101
|
-
data
|
|
102
|
-
}, DbxAnalyticsStreamEventType.NewUserEvent, user);
|
|
103
|
-
}
|
|
104
|
-
sendUserLoginEvent(user, data) {
|
|
105
|
-
this.sendNextEvent({
|
|
106
|
-
name: DbxAnalyticsService.USER_LOGIN_EVENT_NAME,
|
|
107
|
-
data
|
|
108
|
-
}, DbxAnalyticsStreamEventType.UserLoginEvent, user);
|
|
109
|
-
}
|
|
110
|
-
sendUserLogoutEvent(data, clearUser = true) {
|
|
111
|
-
this.sendNextEvent({
|
|
112
|
-
name: DbxAnalyticsService.USER_LOGOUT_EVENT_NAME,
|
|
113
|
-
data
|
|
114
|
-
}, DbxAnalyticsStreamEventType.UserLogoutEvent);
|
|
115
|
-
if (clearUser) {
|
|
116
|
-
this.setUser(undefined);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
sendUserPropertiesEvent(user, data) {
|
|
120
|
-
this.sendNextEvent({
|
|
121
|
-
name: DbxAnalyticsService.USER_PROPERTIES_EVENT_NAME,
|
|
122
|
-
data
|
|
123
|
-
}, DbxAnalyticsStreamEventType.UserPropertiesEvent, user);
|
|
124
|
-
}
|
|
125
|
-
sendEventData(name, data) {
|
|
126
|
-
return this.sendEvent({
|
|
127
|
-
name,
|
|
128
|
-
data
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
sendEventType(eventType) {
|
|
132
|
-
this.sendNextEvent({
|
|
133
|
-
name: eventType
|
|
134
|
-
}, DbxAnalyticsStreamEventType.Event);
|
|
135
|
-
}
|
|
136
|
-
sendEvent(event) {
|
|
137
|
-
this.sendNextEvent(event, DbxAnalyticsStreamEventType.Event);
|
|
138
|
-
}
|
|
139
|
-
sendPageView(page) {
|
|
140
|
-
this.sendNextEvent({
|
|
141
|
-
name: page
|
|
142
|
-
}, DbxAnalyticsStreamEventType.PageView);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Sends the next event.
|
|
146
|
-
*
|
|
147
|
-
* @param event
|
|
148
|
-
* @param type
|
|
149
|
-
* @param userOverride Uses this user if set as null or an override value. If undefined the current analytics user is used.
|
|
150
|
-
*/
|
|
151
|
-
sendNextEvent(event = {}, type, userOverride) {
|
|
152
|
-
this.user$.pipe(first()).subscribe((analyticsUser) => {
|
|
153
|
-
const user = userOverride !== undefined ? userOverride : analyticsUser;
|
|
154
|
-
const analyticsEvent = { ...event, user };
|
|
155
|
-
this.nextEvent(analyticsEvent, type);
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
nextEvent(event, type) {
|
|
159
|
-
const wrapper = dbxAnalyticsStreamEventAnalyticsEventWrapper(event, type);
|
|
160
|
-
this._subject.next(wrapper);
|
|
161
|
-
}
|
|
162
|
-
// MARK: Internal
|
|
163
|
-
_init() {
|
|
164
|
-
if (this._config.isProduction) {
|
|
165
|
-
// Initialize listeners.
|
|
166
|
-
this._config.listeners.forEach((listener) => {
|
|
167
|
-
listener.listenToService(this);
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
console.warn('AnalyticsService: Analytics not in production mode. All analytics events are ignored.');
|
|
172
|
-
}
|
|
173
|
-
if (this._config.logEvents || !this._config.isProduction) {
|
|
174
|
-
console.log('AnalyticsService: Log analytics events enabled.');
|
|
175
|
-
// Create a new subscription
|
|
176
|
-
this._loggerSub.subscription = this._subject.subscribe((x) => {
|
|
177
|
-
console.log(`AnalyticsService: Analytics Event - ${DbxAnalyticsStreamEventType[x.type]} | User: ${x.userId} | Data: ${JSON.stringify(x.event)}.`);
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
this._userSourceSub.subscription = this.user$.subscribe((user) => {
|
|
181
|
-
this.sendNextEvent({}, DbxAnalyticsStreamEventType.UserChange, user ?? null);
|
|
182
|
-
});
|
|
183
|
-
this._userIdEventSub.subscription = this.user$.pipe(distinctUntilChanged((a, b) => safeCompareEquality(a, b, (x, y) => x.user === y.user))).subscribe((user) => {
|
|
184
|
-
this.sendNextEvent({}, DbxAnalyticsStreamEventType.UserIdChange, user ?? null);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
destroy() {
|
|
188
|
-
this._subject.complete();
|
|
189
|
-
this._userSource.complete();
|
|
190
|
-
this._userSourceSub.destroy();
|
|
191
|
-
this._userIdEventSub.destroy();
|
|
192
|
-
this._loggerSub.destroy();
|
|
193
|
-
}
|
|
194
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsService, deps: [{ token: DbxAnalyticsUserSource, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
195
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsService });
|
|
196
|
-
}
|
|
197
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsService, decorators: [{
|
|
198
|
-
type: Injectable
|
|
199
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
200
|
-
type: Optional
|
|
201
|
-
}, {
|
|
202
|
-
type: Inject,
|
|
203
|
-
args: [DbxAnalyticsUserSource]
|
|
204
|
-
}] }] });
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9saWIvYW5hbHl0aWNzL2FuYWx5dGljcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBZ0IsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkksT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE9BQU8sRUFBMkIsMkJBQTJCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRixPQUFPLEVBQXNCLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUV4RSxNQUFNLE9BQWdCLCtCQUErQjtDQVFwRDtBQUVELE1BQU0sT0FBZ0IsOEJBQThCO0NBRW5EO0FBRUQsTUFBTSxPQUFnQixzQkFBc0I7Q0FFM0M7QUFFRCxNQUFNLE9BQWdCLDJCQUEyQjtDQUVoRDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixtQ0FBbUM7SUFDL0MsSUFBSSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixVQUFVLEdBQUcsSUFBSSxlQUFlLENBQTZCLFNBQVMsQ0FBQyxDQUFDO0lBRXpFLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDOUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUs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ZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBvZiwgU3Vic2NyaXB0aW9uLCBmaXJzdCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uT2JqZWN0LCBmaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGJ4QW5hbHl0aWNzRXZlbnQsIERieEFuYWx5dGljc0V2ZW50RGF0YSwgRGJ4QW5hbHl0aWNzRXZlbnROYW1lLCBEYnhBbmFseXRpY3NVc2VyLCBOZXdVc2VyQW5hbHl0aWNzRXZlbnREYXRhLCBEYnhVc2VyQW5hbHl0aWNzRXZlbnQgfSBmcm9tICcuL2FuYWx5dGljcyc7XG5pbXBvcnQgeyBEYnhBbmFseXRpY3NTdHJlYW1FdmVudCwgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlIH0gZnJvbSAnLi9hbmFseXRpY3Muc3RyZWFtJztcbmltcG9ydCB7IE1heWJlLCBEZXN0cm95YWJsZSwgc2FmZUNvbXBhcmVFcXVhbGl0eSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGJ4QW5hbHl0aWNzRXZlbnRFbWl0dGVyU2VydmljZSB7XG4gIGFic3RyYWN0IHNlbmROZXdVc2VyRXZlbnQodXNlcjogRGJ4QW5hbHl0aWNzVXNlciwgZGF0YTogTmV3VXNlckFuYWx5dGljc0V2ZW50RGF0YSk6IHZvaWQ7XG4gIGFic3RyYWN0IHNlbmRVc2VyTG9naW5FdmVudCh1c2VyOiBEYnhBbmFseXRpY3NVc2VyLCBkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZDtcbiAgYWJzdHJhY3Qgc2VuZFVzZXJMb2dvdXRFdmVudChkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZDtcbiAgYWJzdHJhY3Qgc2VuZFVzZXJQcm9wZXJ0aWVzRXZlbnQodXNlcjogRGJ4QW5hbHl0aWNzVXNlciwgZGF0YT86IERieEFuYWx5dGljc0V2ZW50RGF0YSk6IHZvaWQ7XG4gIGFic3RyYWN0IHNlbmRFdmVudERhdGEobmFtZTogRGJ4QW5hbHl0aWNzRXZlbnROYW1lLCBkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZDtcbiAgYWJzdHJhY3Qgc2VuZEV2ZW50KGV2ZW50OiBEYnhBbmFseXRpY3NFdmVudCk6IHZvaWQ7XG4gIGFic3RyYWN0IHNlbmRQYWdlVmlldyhwYWdlPzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERieEFuYWx5dGljc0V2ZW50U3RyZWFtU2VydmljZSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGV2ZW50cyQ6IE9ic2VydmFibGU8RGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGJ4QW5hbHl0aWNzVXNlclNvdXJjZSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGFuYWx5dGljc1VzZXIkOiBPYnNlcnZhYmxlPE1heWJlPERieEFuYWx5dGljc1VzZXI+Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERieEFuYWx5dGljc1NlcnZpY2VMaXN0ZW5lciB7XG4gIHB1YmxpYyBhYnN0cmFjdCBsaXN0ZW5Ub1NlcnZpY2Uoc2VydmljZTogRGJ4QW5hbHl0aWNzU2VydmljZSk6IHZvaWQ7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQW5hbHl0aWNzU2VydmljZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYnhBbmFseXRpY3NTZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBEYnhBbmFseXRpY3NTZXJ2aWNlTGlzdGVuZXIsIERlc3Ryb3lhYmxlIHtcbiAgcHJpdmF0ZSBfc3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcm90ZWN0ZWQgX2FuYWx5dGljcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8RGJ4QW5hbHl0aWNzU2VydmljZT4+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgYW5hbHl0aWNzJCA9IHRoaXMuX2FuYWx5dGljcy5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgYW5hbHl0aWNzRXZlbnRzJCA9IHRoaXMuYW5hbHl0aWNzJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoeCkgPT4geC5ldmVudHMkKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IEFuYWx5dGljc1NlcnZpY2VMaXN0ZW5lclxuICBsaXN0ZW5Ub1NlcnZpY2Uoc2VydmljZTogRGJ4QW5hbHl0aWNzU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMuX2FuYWx5dGljcy5uZXh0KHNlcnZpY2UpO1xuICAgIGNvbnN0IHN1YiA9IHRoaXMuX2luaXRpYWxpemVTZXJ2aWNlU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBpZiAoc3ViICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5fc3ViLnN1YnNjcmlwdGlvbiA9IHN1YjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2luaXRpYWxpemVTZXJ2aWNlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB8IGZhbHNlO1xuXG4gIC8vIE1BUks6IERlc3Ryb3lcbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9hbmFseXRpY3MuY29tcGxldGUoKTtcbiAgICB0aGlzLl9zdWIuZGVzdHJveSgpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbiB7XG4gIHJlYWRvbmx5IGxpc3RlbmVyczogRGJ4QW5hbHl0aWNzU2VydmljZUxpc3RlbmVyW10gPSBbXTtcbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbG9nRXZlbnRzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdXNlclNvdXJjZT86IERieEFuYWx5dGljc1VzZXJTb3VyY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRBbmFseXRpY3NFdmVudFdyYXBwZXIgZXh0ZW5kcyBEYnhBbmFseXRpY3NTdHJlYW1FdmVudCB7XG4gIHJlYWRvbmx5IGV2ZW50OiBEYnhVc2VyQW5hbHl0aWNzRXZlbnQ7XG4gIHJlYWRvbmx5IHR5cGU6IERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZTtcbiAgcmVhZG9ubHkgdXNlcjogTWF5YmU8RGJ4QW5hbHl0aWNzVXNlcj47XG4gIHJlYWRvbmx5IHVzZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRBbmFseXRpY3NFdmVudFdyYXBwZXIoZXZlbnQ6IERieFVzZXJBbmFseXRpY3NFdmVudCwgdHlwZTogRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlID0gRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlLkV2ZW50KSB7XG4gIGNvbnN0IHsgdXNlciB9ID0gZXZlbnQ7XG4gIGNvbnN0IHVzZXJJZCA9IHVzZXIgPyB1c2VyLnVzZXIgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudCxcbiAgICB0eXBlLFxuICAgIHVzZXIsXG4gICAgdXNlcklkXG4gIH07XG59XG5cbi8qKlxuICogUHJpbWFyeSBhbmFseXRpY3Mgc2VydmljZSB0aGF0IGVtaXRzIGFuYWx5dGljcyBldmVudHMgdGhhdCBjb21wb25lbnRzIGNhbiBsaXN0ZW4gdG8uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYnhBbmFseXRpY3NTZXJ2aWNlIGltcGxlbWVudHMgRGJ4QW5hbHl0aWNzRXZlbnRTdHJlYW1TZXJ2aWNlLCBEYnhBbmFseXRpY3NFdmVudEVtaXR0ZXJTZXJ2aWNlLCBEZXN0cm95YWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZyA9IGluamVjdChEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbik7XG5cbiAgLy8gVE9ETzogTWFrZSB0aGVzZSBjb25maWd1cmFibGUuXG4gIHN0YXRpYyByZWFkb25seSBVU0VSX1JFR0lTVFJBVElPTl9FVkVOVF9OQU1FID0gJ1VzZXIgUmVnaXN0ZXJlZCc7XG4gIHN0YXRpYyByZWFkb25seSBVU0VSX0xPR0lOX0VWRU5UX05BTUUgPSAnVXNlciBMb2dpbic7XG4gIHN0YXRpYyByZWFkb25seSBVU0VSX0xPR09VVF9FVkVOVF9OQU1FID0gJ1VzZXIgTG9nb3V0JztcbiAgc3RhdGljIHJlYWRvbmx5IFVTRVJfUFJPUEVSVElFU19FVkVOVF9OQU1FID0gJ1VzZXIgUHJvcGVydGllcyc7XG5cbiAgcHJpdmF0ZSBfc3ViamVjdCA9IG5ldyBTdWJqZWN0PERieEFuYWx5dGljc1N0cmVhbUV2ZW50PigpO1xuICByZWFkb25seSBldmVudHMkID0gdGhpcy5fc3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIF91c2VyU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxEYnhBbmFseXRpY3NVc2VyU291cmNlPj4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSB1c2VyJCA9IHRoaXMuX3VzZXJTb3VyY2UucGlwZShcbiAgICBzd2l0Y2hNYXAoKHgpID0+ICh4ID8geC5hbmFseXRpY3NVc2VyJCA6IG9mKHVuZGVmaW5lZCkpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHByaXZhdGUgX3VzZXJTb3VyY2VTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX3VzZXJJZEV2ZW50U3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIF9sb2dnZXJTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChEYnhBbmFseXRpY3NVc2VyU291cmNlKSB1c2VyU291cmNlPzogTWF5YmU8RGJ4QW5hbHl0aWNzVXNlclNvdXJjZT4pIHtcbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICB1c2VyU291cmNlID0gdXNlclNvdXJjZSB8fCB0aGlzLl9jb25maWcudXNlclNvdXJjZTtcbiAgICBpZiAodXNlclNvdXJjZSkge1xuICAgICAgdGhpcy5zZXRVc2VyU291cmNlKHVzZXJTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1BUks6IFNvdXJjZVxuICAvKipcbiAgICogU2V0cyB0aGUgdXNlciBkaXJlY3RseSwgb3ZlcnJpZGRpbmcgdGhlIFVzZXJTb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgc2V0VXNlcih1c2VyOiBNYXliZTxEYnhBbmFseXRpY3NVc2VyPik6IHZvaWQge1xuICAgIGxldCBzb3VyY2U6IE1heWJlPERieEFuYWx5dGljc1VzZXJTb3VyY2U+O1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHNvdXJjZSA9IHsgYW5hbHl0aWNzVXNlciQ6IG9mKHVzZXIpIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdXNlclNvdXJjZS5uZXh0KHNvdXJjZSk7XG5cbiAgICBpZiAodGhpcy5fdXNlclNvdXJjZS52YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdEYnhBbmFseXRpY3NTZXJ2aWNlIGhhcyBhIHVzZXJTb3VyY2UgdGhhdCBpcyBzZXQuIFNvdXJjZSBpcyBub3cgb3ZlcnJpZGRlbiBieSBzZXRVc2VyKCkgdmFsdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFVzZXJTb3VyY2Uoc291cmNlOiBEYnhBbmFseXRpY3NVc2VyU291cmNlKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlclNvdXJjZS5uZXh0KHNvdXJjZSk7XG4gIH1cblxuICAvLyBNQVJLOiBBbmFseXRpY3NFdmVudEVtaXR0ZXJTZXJ2aWNlXG4gIC8qKlxuICAgKiBTZW5kcyBhbiBldmVudC5cbiAgICovXG4gIHB1YmxpYyBzZW5kTmV3VXNlckV2ZW50KHVzZXI6IERieEFuYWx5dGljc1VzZXIsIGRhdGE6IE5ld1VzZXJBbmFseXRpY3NFdmVudERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnNlbmROZXh0RXZlbnQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IERieEFuYWx5dGljc1NlcnZpY2UuVVNFUl9SRUdJU1RSQVRJT05fRVZFTlRfTkFNRSxcbiAgICAgICAgZGF0YVxuICAgICAgfSxcbiAgICAgIERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZS5OZXdVc2VyRXZlbnQsXG4gICAgICB1c2VyXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kVXNlckxvZ2luRXZlbnQodXNlcjogRGJ4QW5hbHl0aWNzVXNlciwgZGF0YT86IERieEFuYWx5dGljc0V2ZW50RGF0YSk6IHZvaWQge1xuICAgIHRoaXMuc2VuZE5leHRFdmVudChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogRGJ4QW5hbHl0aWNzU2VydmljZS5VU0VSX0xPR0lOX0VWRU5UX05BTUUsXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuVXNlckxvZ2luRXZlbnQsXG4gICAgICB1c2VyXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kVXNlckxvZ291dEV2ZW50KGRhdGE/OiBEYnhBbmFseXRpY3NFdmVudERhdGEsIGNsZWFyVXNlciA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLnNlbmROZXh0RXZlbnQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IERieEFuYWx5dGljc1NlcnZpY2UuVVNFUl9MT0dPVVRfRVZFTlRfTkFNRSxcbiAgICAgICAgZGF0YVxuICAgICAgfSxcbiAgICAgIERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZS5Vc2VyTG9nb3V0RXZlbnRcbiAgICApO1xuXG4gICAgaWYgKGNsZWFyVXNlcikge1xuICAgICAgdGhpcy5zZXRVc2VyKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbmRVc2VyUHJvcGVydGllc0V2ZW50KHVzZXI6IERieEFuYWx5dGljc1VzZXIsIGRhdGE/OiBEYnhBbmFseXRpY3NFdmVudERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnNlbmROZXh0RXZlbnQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IERieEFuYWx5dGljc1NlcnZpY2UuVVNFUl9QUk9QRVJUSUVTX0VWRU5UX05BTUUsXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuVXNlclByb3BlcnRpZXNFdmVudCxcbiAgICAgIHVzZXJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNlbmRFdmVudERhdGEobmFtZTogRGJ4QW5hbHl0aWNzRXZlbnROYW1lLCBkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgIG5hbWUsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZEV2ZW50VHlwZShldmVudFR5cGU6IERieEFuYWx5dGljc0V2ZW50TmFtZSk6IHZvaWQge1xuICAgIHRoaXMuc2VuZE5leHRFdmVudChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogZXZlbnRUeXBlXG4gICAgICB9LFxuICAgICAgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlLkV2ZW50XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kRXZlbnQoZXZlbnQ6IERieEFuYWx5dGljc0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZW5kTmV4dEV2ZW50KGV2ZW50LCBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuRXZlbnQpO1xuICB9XG5cbiAgcHVibGljIHNlbmRQYWdlVmlldyhwYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZW5kTmV4dEV2ZW50KFxuICAgICAge1xuICAgICAgICBuYW1lOiBwYWdlXG4gICAgICB9LFxuICAgICAgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlLlBhZ2VWaWV3XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgbmV4dCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSB1c2VyT3ZlcnJpZGUgVXNlcyB0aGlzIHVzZXIgaWYgc2V0IGFzIG51bGwgb3IgYW4gb3ZlcnJpZGUgdmFsdWUuIElmIHVuZGVmaW5lZCB0aGUgY3VycmVudCBhbmFseXRpY3MgdXNlciBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNlbmROZXh0RXZlbnQoZXZlbnQ6IERieEFuYWx5dGljc0V2ZW50ID0ge30sIHR5cGU6IERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZSwgdXNlck92ZXJyaWRlPzogTWF5YmU8RGJ4QW5hbHl0aWNzVXNlcj4pOiB2b2lkIHtcbiAgICB0aGlzLnVzZXIkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChhbmFseXRpY3NVc2VyKSA9PiB7XG4gICAgICBjb25zdCB1c2VyOiBNYXliZTxEYnhBbmFseXRpY3NVc2VyPiA9IHVzZXJPdmVycmlkZSAhPT0gdW5kZWZpbmVkID8gdXNlck92ZXJyaWRlIDogYW5hbHl0aWNzVXNlcjtcbiAgICAgIGNvbnN0IGFuYWx5dGljc0V2ZW50OiBEYnhVc2VyQW5hbHl0aWNzRXZlbnQgPSB7IC4uLmV2ZW50LCB1c2VyIH07XG4gICAgICB0aGlzLm5leHRFdmVudChhbmFseXRpY3NFdmVudCwgdHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV4dEV2ZW50KGV2ZW50OiBEYnhVc2VyQW5hbHl0aWNzRXZlbnQsIHR5cGU6IERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBkYnhBbmFseXRpY3NTdHJlYW1FdmVudEFuYWx5dGljc0V2ZW50V3JhcHBlcihldmVudCwgdHlwZSk7XG4gICAgdGhpcy5fc3ViamVjdC5uZXh0KHdyYXBwZXIpO1xuICB9XG5cbiAgLy8gTUFSSzogSW50ZXJuYWxcbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmlzUHJvZHVjdGlvbikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBsaXN0ZW5lcnMuXG4gICAgICB0aGlzLl9jb25maWcubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyLmxpc3RlblRvU2VydmljZSh0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0FuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljcyBub3QgaW4gcHJvZHVjdGlvbiBtb2RlLiBBbGwgYW5hbHl0aWNzIGV2ZW50cyBhcmUgaWdub3JlZC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmxvZ0V2ZW50cyB8fCAhdGhpcy5fY29uZmlnLmlzUHJvZHVjdGlvbikge1xuICAgICAgY29uc29sZS5sb2coJ0FuYWx5dGljc1NlcnZpY2U6IExvZyBhbmFseXRpY3MgZXZlbnRzIGVuYWJsZWQuJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdWJzY3JpcHRpb25cbiAgICAgIHRoaXMuX2xvZ2dlclN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLl9zdWJqZWN0LnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgQW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzIEV2ZW50IC0gJHtEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGVbeC50eXBlXX0gfCBVc2VyOiAke3gudXNlcklkfSB8IERhdGE6ICR7SlNPTi5zdHJpbmdpZnkoeC5ldmVudCl9LmApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXNlclNvdXJjZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnVzZXIkLnN1YnNjcmliZSgodXNlcikgPT4ge1xuICAgICAgdGhpcy5zZW5kTmV4dEV2ZW50KHt9LCBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuVXNlckNoYW5nZSwgdXNlciA/PyBudWxsKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3VzZXJJZEV2ZW50U3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudXNlciQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gc2FmZUNvbXBhcmVFcXVhbGl0eShhLCBiLCAoeCwgeSkgPT4geC51c2VyID09PSB5LnVzZXIpKSkuc3Vic2NyaWJlKCh1c2VyKSA9PiB7XG4gICAgICB0aGlzLnNlbmROZXh0RXZlbnQoe30sIERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZS5Vc2VySWRDaGFuZ2UsIHVzZXIgPz8gbnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YmplY3QuY29tcGxldGUoKTtcbiAgICB0aGlzLl91c2VyU291cmNlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fdXNlclNvdXJjZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fdXNlcklkRXZlbnRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2xvZ2dlclN1Yi5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
|