@sumaris-net/ngx-components 1.21.0-beta9 → 1.21.2
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/bundles/sumaris-net.ngx-components.umd.js +594 -1227
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +12 -0
- package/esm2015/public_api.js +3 -8
- package/esm2015/src/app/core/account/account.js +2 -2
- package/esm2015/src/app/core/auth/form/form-auth.js +4 -2
- package/esm2015/src/app/core/form/editor.class.js +64 -20
- package/esm2015/src/app/core/form/entity-editor-modal.class.js +20 -15
- package/esm2015/src/app/core/form/entity-editor.class.js +21 -12
- package/esm2015/src/app/core/form/form.class.js +68 -35
- package/esm2015/src/app/core/graphql/graphql.service.js +5 -3
- package/esm2015/src/app/core/icon/icon.component.js +2 -5
- package/esm2015/src/app/core/menu/menu.component.js +2 -2
- package/esm2015/src/app/core/services/local-settings.service.js +2 -2
- package/esm2015/src/app/core/table/table.class.js +26 -27
- package/esm2015/src/app/shared/functions.js +1 -60
- package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +5 -4
- package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +10 -7
- package/esm2015/src/app/shared/material/chips/material.chips.js +3 -2
- package/esm2015/src/app/shared/material/chips/testing/chips.test.js +3 -2
- package/esm2015/src/app/shared/material/datetime/material.date.js +3 -2
- package/esm2015/src/app/shared/material/datetime/material.datetime.js +3 -2
- package/esm2015/src/app/shared/observables.js +13 -7
- package/esm2015/src/app/shared/pipes/arrays.pipe.js +1 -1
- package/esm2015/src/app/shared/pipes/form.pipes.js +4 -6
- package/esm2015/src/app/shared/pipes/highlight.pipe.js +4 -4
- package/esm2015/src/app/shared/pipes/string.pipes.js +7 -18
- package/esm2015/src/app/shared/services/memory-entity-service.class.js +13 -1
- package/esm2015/src/app/shared/services.js +61 -0
- package/esm2015/src/app/shared/types.js +1 -1
- package/esm2015/src/app/social/social.errors.js +2 -5
- package/esm2015/src/app/social/social.module.js +15 -10
- package/esm2015/src/app/social/user-event/user-event.model.js +2 -58
- package/esm2015/src/app/social/user-event/user-event.service.js +167 -295
- package/esm2015/src/app/social/user-event/user-events.table.js +12 -17
- package/esm2015/sumaris-net.ngx-components.js +6 -8
- package/fesm2015/sumaris-net.ngx-components.js +479 -1015
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +3 -2
- package/public_api.d.ts +2 -7
- package/src/app/core/auth/form/form-auth.d.ts +1 -1
- package/src/app/core/form/editor.class.d.ts +39 -12
- package/src/app/core/form/entity-editor-modal.class.d.ts +4 -3
- package/src/app/core/form/entity-editor.class.d.ts +10 -5
- package/src/app/core/form/form.class.d.ts +32 -19
- package/src/app/core/icon/icon.component.d.ts +4 -4
- package/src/app/core/table/table.class.d.ts +21 -14
- package/src/app/shared/functions.d.ts +0 -9
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +1 -2
- package/src/app/shared/material/badge/badge-icon.test.d.ts +1 -1
- package/src/app/shared/observables.d.ts +1 -0
- package/src/app/shared/pipes/form.pipes.d.ts +1 -2
- package/src/app/shared/services/memory-entity-service.class.d.ts +6 -0
- package/src/app/shared/services.d.ts +9 -0
- package/src/app/shared/types.d.ts +0 -4
- package/src/app/social/social.errors.d.ts +0 -3
- package/src/app/social/social.module.d.ts +0 -8
- package/src/app/social/user-event/user-event.model.d.ts +6 -51
- package/src/app/social/user-event/user-event.service.d.ts +51 -79
- package/src/app/social/user-event/user-events.table.d.ts +6 -6
- package/src/assets/i18n/en-US.json +2 -15
- package/src/assets/i18n/en.json +2 -15
- package/src/assets/i18n/fr.json +1 -14
- package/src/theme/_ngx-components.scss +0 -7
- package/sumaris-net.ngx-components.d.ts +5 -7
- package/sumaris-net.ngx-components.metadata.json +1 -1
- package/esm2015/src/app/social/job/job.model.js +0 -24
- package/esm2015/src/app/social/job/job.module.js +0 -25
- package/esm2015/src/app/social/job/job.service.js +0 -53
- package/esm2015/src/app/social/job/progression/job-progression.component.js +0 -192
- package/esm2015/src/app/social/job/progression/job-progression.list.js +0 -20
- package/esm2015/src/app/social/message/message.module.js +0 -25
- package/esm2015/src/app/social/user-event/notification/user-event-notification.component.js +0 -92
- package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +0 -39
- package/esm2015/src/app/social/user-event/user-event.module.js +0 -28
- package/src/app/social/job/job.model.d.ts +0 -32
- package/src/app/social/job/job.module.d.ts +0 -2
- package/src/app/social/job/job.service.d.ts +0 -23
- package/src/app/social/job/progression/job-progression.component.d.ts +0 -43
- package/src/app/social/job/progression/job-progression.list.d.ts +0 -12
- package/src/app/social/message/message.module.d.ts +0 -2
- package/src/app/social/user-event/notification/user-event-notification.component.d.ts +0 -25
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -20
- package/src/app/social/user-event/user-event.module.d.ts +0 -2
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import {
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
3
3
|
import { gql } from '@apollo/client/core';
|
|
4
4
|
import { SocialErrorCodes } from '../social.errors';
|
|
5
5
|
import { AccountService } from '../../core/services/account.service';
|
|
6
6
|
import { GraphqlService } from '../../core/graphql/graphql.service';
|
|
7
|
-
import {
|
|
8
|
-
import { UserEvent,
|
|
7
|
+
import { of } from 'rxjs';
|
|
8
|
+
import { UserEvent, UserEventTypes } from './user-event.model';
|
|
9
9
|
import { UserEventFragments } from './user-event.fragments';
|
|
10
10
|
import { map } from 'rxjs/operators';
|
|
11
|
-
import { isEmptyArray, isNil,
|
|
11
|
+
import { isEmptyArray, isNil, isNilOrBlank, toNumber } from '../../shared/functions';
|
|
12
12
|
import { Toasts } from '../../shared/toast/toasts';
|
|
13
13
|
import { ToastController } from '@ionic/angular';
|
|
14
14
|
import { TranslateService } from '@ngx-translate/core';
|
|
@@ -16,192 +16,144 @@ import { NetworkService } from '../../core/services/network.service';
|
|
|
16
16
|
import { BaseGraphqlService } from '../../core/services/base-graphql-service.class';
|
|
17
17
|
import { Entity, EntityUtils } from '../../core/services/model/entity.model';
|
|
18
18
|
import { Environment, ENVIRONMENT } from '../../../environments/environment.class';
|
|
19
|
-
import {
|
|
20
|
-
import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
import { EntityFilter } from '../../core/services/model/filter.model';
|
|
20
|
+
import { EntityClass } from '../../core/services/model/entity.decorators';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "../../core/graphql/graphql.service";
|
|
23
|
+
import * as i2 from "../../core/services/account.service";
|
|
24
|
+
import * as i3 from "../../core/services/network.service";
|
|
25
|
+
import * as i4 from "@ngx-translate/core";
|
|
26
|
+
import * as i5 from "@ionic/angular";
|
|
27
|
+
import * as i6 from "../../../environments/environment.class";
|
|
28
|
+
// @dynamic
|
|
29
|
+
let UserEventFilter = class UserEventFilter extends EntityFilter {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.issuer = null;
|
|
33
|
+
this.recipient = null;
|
|
34
|
+
}
|
|
35
|
+
fromObject(source, opts) {
|
|
36
|
+
super.fromObject(source, opts);
|
|
37
|
+
this.issuer = source.issuer;
|
|
38
|
+
this.recipient = source.recipient;
|
|
39
|
+
}
|
|
40
|
+
buildFilter() {
|
|
41
|
+
const filterFns = super.buildFilter();
|
|
42
|
+
// issuer
|
|
43
|
+
if (this.issuer) {
|
|
44
|
+
filterFns.push(t => (t.issuer === this.issuer));
|
|
45
|
+
}
|
|
46
|
+
if (this.recipient) {
|
|
47
|
+
filterFns.push(t => (t.recipient === this.recipient));
|
|
48
|
+
}
|
|
49
|
+
return filterFns;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
UserEventFilter = __decorate([
|
|
53
|
+
EntityClass({ typename: 'UserEventFilterVO' })
|
|
54
|
+
], UserEventFilter);
|
|
55
|
+
export { UserEventFilter };
|
|
56
|
+
const SaveQuery = gql `
|
|
57
|
+
mutation SaveUserEvent($data: UserEventVOInput){
|
|
58
|
+
data: saveUserEvent(userEvent: $data){
|
|
59
|
+
...UserEventFragment
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
${UserEventFragments.userEvent}
|
|
63
|
+
`;
|
|
64
|
+
const LoadAllQuery = gql `
|
|
65
|
+
query UserEvents($filter: UserEventFilterVOInput, $page: PageInput){
|
|
66
|
+
data: userEvents(filter: $filter, page: $page){
|
|
67
|
+
...LightUserEventFragment
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
${UserEventFragments.lightUserEvent}
|
|
71
|
+
`;
|
|
72
|
+
const DeleteByIdsMutation = gql `
|
|
73
|
+
mutation DeleteUserEvents($ids:[Int]){
|
|
74
|
+
deleteUserEvents(ids: $ids)
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
const LoadAllWithContentQuery = gql `
|
|
78
|
+
query UserEventsWithContent($filter: UserEventFilterVOInput, $page: PageInput){
|
|
79
|
+
data: userEvents(filter: $filter, page: $page){
|
|
80
|
+
...UserEventFragment
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
${UserEventFragments.userEvent}
|
|
84
|
+
`;
|
|
85
|
+
export class UserEventService extends BaseGraphqlService {
|
|
86
|
+
constructor(graphql, accountService, network, translate, toastController, environment) {
|
|
25
87
|
super(graphql, environment);
|
|
26
88
|
this.graphql = graphql;
|
|
27
89
|
this.accountService = accountService;
|
|
28
90
|
this.network = network;
|
|
29
91
|
this.translate = translate;
|
|
30
|
-
this.
|
|
31
|
-
this.mutations = mutations;
|
|
32
|
-
this.subscriptions = subscriptions;
|
|
92
|
+
this.toastController = toastController;
|
|
33
93
|
this.environment = environment;
|
|
34
|
-
this.
|
|
35
|
-
this._subscriptions = new Subscription();
|
|
36
|
-
this.listeners = [];
|
|
37
|
-
this._logPrefix = '[user-event-service] ';
|
|
94
|
+
this._userEventActions = [];
|
|
38
95
|
// For DEV only
|
|
39
|
-
this._debug =
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
ngOnDestroy() {
|
|
53
|
-
this._subscriptions.unsubscribe();
|
|
54
|
-
}
|
|
96
|
+
this._debug = environment && !environment.production;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
*
|
|
100
|
+
* @param offset
|
|
101
|
+
* @param size
|
|
102
|
+
* @param sortBy
|
|
103
|
+
* @param sortDirection
|
|
104
|
+
* @param filter
|
|
105
|
+
* @param options
|
|
106
|
+
* @deprecated use watchPage() instead
|
|
107
|
+
*/
|
|
55
108
|
watchAll(offset, size, sortBy, sortDirection, filter, options) {
|
|
56
109
|
return this.watchPage({ offset, size, sortBy, sortDirection }, filter, options);
|
|
57
110
|
}
|
|
58
111
|
watchPage(page, filter, options) {
|
|
59
|
-
var _a;
|
|
60
112
|
let now = this._debug && Date.now();
|
|
61
113
|
//if (this._debug)
|
|
62
|
-
console.debug(
|
|
114
|
+
console.debug('[user-event-service] Loading user events...', filter);
|
|
63
115
|
filter = this.asFilter(filter);
|
|
64
116
|
// Force recipient to current issuer, if not admin and not specified
|
|
65
|
-
if (
|
|
66
|
-
const recipient = this.
|
|
67
|
-
if (
|
|
117
|
+
if (isNilOrBlank(filter.recipient) || !this.accountService.isAdmin()) {
|
|
118
|
+
const recipient = this.accountService.account.pubkey;
|
|
119
|
+
if (recipient !== filter.recipient) {
|
|
68
120
|
console.warn('[user-events-service] Force user event filter.recipient=' + recipient);
|
|
69
|
-
filter.
|
|
121
|
+
filter.recipient = recipient;
|
|
70
122
|
}
|
|
71
123
|
}
|
|
72
|
-
const withContent =
|
|
124
|
+
const withContent = options && options.withContent === true;
|
|
73
125
|
return this.mutableWatchQuery({
|
|
74
126
|
queryName: withContent ? 'LoadAllWithContent' : 'LoadAll',
|
|
75
|
-
query: withContent ?
|
|
127
|
+
query: withContent ? LoadAllWithContentQuery : LoadAllQuery,
|
|
76
128
|
variables: {
|
|
77
|
-
page: Object.assign(Object.assign({ sortBy: '
|
|
78
|
-
// @ts-ignore
|
|
79
|
-
sortDirection: (page.sortDirection || 'desc').toUpperCase() }),
|
|
129
|
+
page: Object.assign(Object.assign({ sortBy: 'updateDate' }, page), { sortDirection: (page.sortDirection || 'DESC').toUpperCase() }),
|
|
80
130
|
filter: filter && filter.asPodObject()
|
|
81
131
|
},
|
|
82
132
|
arrayFieldName: 'data',
|
|
83
133
|
error: { code: SocialErrorCodes.LOAD_USER_EVENTS_ERROR, message: 'SOCIAL.ERROR.LOAD_USER_EVENTS_ERROR' },
|
|
84
|
-
fetchPolicy:
|
|
134
|
+
fetchPolicy: options && options.fetchPolicy || undefined
|
|
85
135
|
})
|
|
86
136
|
.pipe(map(res => {
|
|
87
|
-
const data =
|
|
137
|
+
const data = res && (res.data || []).map(UserEvent.fromObject);
|
|
88
138
|
if (now) {
|
|
89
|
-
console.debug(
|
|
139
|
+
console.debug(`[user-event-service] ${data.length} user events loaded in ${Date.now() - now}ms`);
|
|
90
140
|
now = null;
|
|
91
141
|
}
|
|
92
|
-
const unreadCount = this.unreadEvents(data);
|
|
93
142
|
return {
|
|
94
143
|
data,
|
|
95
|
-
total:
|
|
144
|
+
total: res && toNumber(res.total, data.length)
|
|
96
145
|
};
|
|
97
146
|
}));
|
|
98
147
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const withContent = !!entity.content;
|
|
103
|
-
// Add user event locally
|
|
104
|
-
this.insertIntoMutableCachedQueries(this.graphql.cache, {
|
|
105
|
-
query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,
|
|
106
|
-
data: entity
|
|
107
|
-
});
|
|
108
|
-
// Update count
|
|
109
|
-
this._count$.next(this._count$.value + 1);
|
|
110
|
-
}
|
|
111
|
-
count(filter, options) {
|
|
112
|
-
var _a;
|
|
113
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
114
|
-
if (!((_a = this.queries) === null || _a === void 0 ? void 0 : _a.count)) {
|
|
115
|
-
console.warn(`${this._logPrefix}Query 'count' not provided, skip.`);
|
|
116
|
-
return undefined;
|
|
117
|
-
}
|
|
118
|
-
if (!filter)
|
|
119
|
-
throw new Error(`Missing argument 'filter'`);
|
|
120
|
-
filter = this.asFilter(filter);
|
|
121
|
-
if (this._debug)
|
|
122
|
-
console.debug(`${this._logPrefix}Counting user events with filter:`, filter);
|
|
123
|
-
const res = yield this.graphql.query({
|
|
124
|
-
query: this.queries.count,
|
|
125
|
-
variables: {
|
|
126
|
-
filter: filter.asPodObject()
|
|
127
|
-
},
|
|
128
|
-
error: { code: SocialErrorCodes.COUNT_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.COUNT_USER_EVENT_ERROR' },
|
|
129
|
-
fetchPolicy: (options === null || options === void 0 ? void 0 : options.fetchPolicy) || 'network-only'
|
|
130
|
-
});
|
|
131
|
-
return res.total;
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
listenChanges(filter, options) {
|
|
135
|
-
var _a;
|
|
136
|
-
if (!((_a = this.subscriptions) === null || _a === void 0 ? void 0 : _a.listenChanges)) {
|
|
137
|
-
console.warn(`${this._logPrefix}Subscription query 'listenChanges' not provided, skip.`);
|
|
138
|
-
return of();
|
|
139
|
-
}
|
|
140
|
-
if (!filter)
|
|
141
|
-
throw new Error(`Missing argument 'filter'`);
|
|
142
|
-
filter = this.asFilter(filter);
|
|
143
|
-
const withContent = (options === null || options === void 0 ? void 0 : options.withContent) === true;
|
|
144
|
-
if (this._debug)
|
|
145
|
-
console.debug(`${this._logPrefix}[WS] Listening changes for user events with filter:`, filter);
|
|
146
|
-
return this.graphql.subscribe({
|
|
147
|
-
query: this.subscriptions.listenChanges,
|
|
148
|
-
fetchPolicy: options === null || options === void 0 ? void 0 : options.fetchPolicy,
|
|
149
|
-
variables: { filter: filter.asPodObject(), interval: toNumber(options === null || options === void 0 ? void 0 : options.interval, 10) },
|
|
150
|
-
error: {
|
|
151
|
-
code: SocialErrorCodes.SUBSCRIBE_USER_EVENTS_ERROR,
|
|
152
|
-
message: 'SOCIAL.ERROR.SUBSCRIBE_USER_EVENTS_ERROR'
|
|
153
|
-
}
|
|
154
|
-
}).pipe(map(({ data }) => {
|
|
155
|
-
if (data && this._debug)
|
|
156
|
-
console.debug(`${this._logPrefix}Received new user events:`, data);
|
|
157
|
-
const updatedData = data === null || data === void 0 ? void 0 : data.map(this.processUserEvent);
|
|
158
|
-
// Update cache
|
|
159
|
-
this.insertIntoMutableCachedQueries(this.graphql.cache, {
|
|
160
|
-
query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,
|
|
161
|
-
data: updatedData
|
|
162
|
-
});
|
|
163
|
-
// update count
|
|
164
|
-
this._count$.next(this.unreadEvents(updatedData));
|
|
165
|
-
return updatedData;
|
|
166
|
-
}));
|
|
167
|
-
}
|
|
168
|
-
delete(entity) {
|
|
169
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
170
|
-
if (!entity)
|
|
171
|
-
return; // skip
|
|
172
|
-
yield this.deleteAll([entity]);
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
deleteAll(entities, opts) {
|
|
176
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
177
|
-
const ids = entities && entities
|
|
178
|
-
.map(t => t.id);
|
|
179
|
-
if (isEmptyArray(ids))
|
|
180
|
-
return; // stop, if nothing else to do
|
|
181
|
-
const now = Date.now();
|
|
182
|
-
if (this._debug)
|
|
183
|
-
console.debug(`${this._logPrefix}Deleting events... ids:`, ids);
|
|
184
|
-
yield this.graphql.mutate({
|
|
185
|
-
mutation: this.mutations.deleteByIds,
|
|
186
|
-
variables: {
|
|
187
|
-
ids
|
|
188
|
-
},
|
|
189
|
-
update: (proxy) => {
|
|
190
|
-
// Remove from caches
|
|
191
|
-
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
192
|
-
query: this.queries.loadAll,
|
|
193
|
-
ids
|
|
194
|
-
});
|
|
195
|
-
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
196
|
-
query: this.queries.loadAllWithContent,
|
|
197
|
-
ids
|
|
198
|
-
});
|
|
199
|
-
if (this._debug)
|
|
200
|
-
console.debug(`${this._logPrefix}Events deleted in ${Date.now() - now}ms`);
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
});
|
|
148
|
+
saveAll(data, options) {
|
|
149
|
+
return Promise.all(data
|
|
150
|
+
.map(entity => this.save(entity, options)));
|
|
204
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Save a userEvent entity
|
|
154
|
+
*
|
|
155
|
+
* @param entity
|
|
156
|
+
*/
|
|
205
157
|
save(entity, options) {
|
|
206
158
|
return __awaiter(this, void 0, void 0, function* () {
|
|
207
159
|
this.fillDefaultProperties(entity);
|
|
@@ -210,9 +162,9 @@ export class AbstractUserEventService extends BaseGraphqlService {
|
|
|
210
162
|
const json = entity.asObject();
|
|
211
163
|
const now = Date.now();
|
|
212
164
|
if (this._debug)
|
|
213
|
-
console.debug(
|
|
165
|
+
console.debug(`[user-event-service] Saving user event...`, json);
|
|
214
166
|
yield this.graphql.mutate({
|
|
215
|
-
mutation:
|
|
167
|
+
mutation: SaveQuery,
|
|
216
168
|
variables: {
|
|
217
169
|
data: json
|
|
218
170
|
},
|
|
@@ -222,16 +174,16 @@ export class AbstractUserEventService extends BaseGraphqlService {
|
|
|
222
174
|
const savedEntity = data && data.data;
|
|
223
175
|
if (savedEntity) {
|
|
224
176
|
if (this._debug)
|
|
225
|
-
console.debug(
|
|
177
|
+
console.debug(`[user-event-service] User event saved in ${Date.now() - now}ms`, entity);
|
|
226
178
|
this.copyIdAndUpdateDate(savedEntity, entity);
|
|
227
179
|
// Add to cache
|
|
228
180
|
if (isNew) {
|
|
229
181
|
this.insertIntoMutableCachedQueries(proxy, {
|
|
230
|
-
query:
|
|
182
|
+
query: LoadAllQuery,
|
|
231
183
|
data: Object.assign(Object.assign({}, savedEntity), { content: null })
|
|
232
184
|
});
|
|
233
185
|
this.insertIntoMutableCachedQueries(proxy, {
|
|
234
|
-
query:
|
|
186
|
+
query: LoadAllWithContentQuery,
|
|
235
187
|
data: savedEntity
|
|
236
188
|
});
|
|
237
189
|
}
|
|
@@ -241,144 +193,63 @@ export class AbstractUserEventService extends BaseGraphqlService {
|
|
|
241
193
|
return entity;
|
|
242
194
|
});
|
|
243
195
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
196
|
+
/**
|
|
197
|
+
* Save many trips
|
|
198
|
+
*
|
|
199
|
+
* @param entities
|
|
200
|
+
* @param opts
|
|
201
|
+
*/
|
|
202
|
+
deleteAll(entities, opts) {
|
|
249
203
|
return __awaiter(this, void 0, void 0, function* () {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
if (
|
|
253
|
-
|
|
254
|
-
|
|
204
|
+
const ids = entities && entities
|
|
205
|
+
.map(t => t.id);
|
|
206
|
+
if (isEmptyArray(ids))
|
|
207
|
+
return; // stop, if nothing else to do
|
|
208
|
+
const now = Date.now();
|
|
209
|
+
if (this._debug)
|
|
210
|
+
console.debug('[user-event-service] Deleting events... ids:', ids);
|
|
211
|
+
yield this.graphql.mutate({
|
|
212
|
+
mutation: DeleteByIdsMutation,
|
|
213
|
+
variables: {
|
|
214
|
+
ids
|
|
215
|
+
},
|
|
216
|
+
update: (proxy) => {
|
|
217
|
+
// Remove from caches
|
|
218
|
+
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
219
|
+
query: LoadAllQuery,
|
|
220
|
+
ids
|
|
221
|
+
});
|
|
222
|
+
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
223
|
+
query: LoadAllWithContentQuery,
|
|
224
|
+
ids
|
|
225
|
+
});
|
|
226
|
+
if (this._debug)
|
|
227
|
+
console.debug(`[user-event-service] Events deleted in ${Date.now() - now}ms`);
|
|
255
228
|
}
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
// Use default
|
|
259
|
-
yield this.defaultMarkAsRead(entity);
|
|
260
|
-
}
|
|
229
|
+
});
|
|
261
230
|
});
|
|
262
231
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
/* -- protected methods -- */
|
|
269
|
-
processUserEvent(source) {
|
|
270
|
-
// Convert json source to IUserEvent
|
|
271
|
-
let target = this.fromObject(source);
|
|
272
|
-
// Get listeners
|
|
273
|
-
const listeners = (this.listeners || []).filter(listener => listener.onReceived).filter(listener => listener.accept(target));
|
|
274
|
-
for (const listener of listeners) {
|
|
275
|
-
if (target) {
|
|
276
|
-
target = listener.onReceived(target);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
if (this._debug)
|
|
280
|
-
console.debug(`${this._logPrefix}Event has been rejected by a listener`, source);
|
|
281
|
-
break;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
return target;
|
|
285
|
-
}
|
|
286
|
-
defaultMarkAsRead(userEvent) {
|
|
232
|
+
/**
|
|
233
|
+
* Delete userEvent entities
|
|
234
|
+
*/
|
|
235
|
+
delete(data) {
|
|
287
236
|
return __awaiter(this, void 0, void 0, function* () {
|
|
288
|
-
if (!
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
userEvent.readDate = moment();
|
|
292
|
-
if (!userEvent.id || userEvent.id < 0) {
|
|
293
|
-
if (this._debug)
|
|
294
|
-
console.debug(`${this._logPrefix}Save local user event`);
|
|
295
|
-
// TODO !!!!!!!!!!!!!
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
yield this.save(userEvent);
|
|
299
|
-
}
|
|
237
|
+
if (!data)
|
|
238
|
+
return; // skip
|
|
239
|
+
yield this.deleteAll([data]);
|
|
300
240
|
});
|
|
301
241
|
}
|
|
302
|
-
|
|
303
|
-
//
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
};
|
|
242
|
+
listenChanges(id, options) {
|
|
243
|
+
// TODO
|
|
244
|
+
console.warn('TODO: implement listen changes on user events');
|
|
245
|
+
return of();
|
|
307
246
|
}
|
|
308
|
-
|
|
309
|
-
|
|
247
|
+
registerAction(definition) {
|
|
248
|
+
console.info(`[user-event-service] Registering action ${definition.name} for ${definition.__typename}`);
|
|
249
|
+
this._userEventActions.push(definition);
|
|
310
250
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
unreadEvents(events) {
|
|
314
|
-
// default calculation on unread events from a list
|
|
315
|
-
if (isEmptyArray(events))
|
|
316
|
-
return undefined;
|
|
317
|
-
const lastReadDate = events
|
|
318
|
-
.filter(event => isNotNil(event.readDate))
|
|
319
|
-
.reduce((lastDate, event) => DateUtils.max(lastDate, event.readDate), undefined);
|
|
320
|
-
return events
|
|
321
|
-
.filter(event => event.creationDate.isSameOrAfter(lastReadDate)).length;
|
|
322
|
-
}
|
|
323
|
-
copyIdAndUpdateDate(source, target) {
|
|
324
|
-
EntityUtils.copyIdAndUpdateDate(source, target);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
AbstractUserEventService.decorators = [
|
|
328
|
-
{ type: Directive }
|
|
329
|
-
];
|
|
330
|
-
AbstractUserEventService.ctorParameters = () => [
|
|
331
|
-
{ type: GraphqlService },
|
|
332
|
-
{ type: AccountService },
|
|
333
|
-
{ type: NetworkService },
|
|
334
|
-
{ type: TranslateService },
|
|
335
|
-
{ type: undefined },
|
|
336
|
-
{ type: undefined },
|
|
337
|
-
{ type: undefined },
|
|
338
|
-
{ type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
|
|
339
|
-
];
|
|
340
|
-
const userEventQueries = {
|
|
341
|
-
loadAll: gql `
|
|
342
|
-
query UserEvents($filter: UserEventFilterVOInput, $page: PageInput){
|
|
343
|
-
data: userEvents(filter: $filter, page: $page){
|
|
344
|
-
...LightUserEventFragment
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
${UserEventFragments.lightUserEvent}
|
|
348
|
-
`,
|
|
349
|
-
loadAllWithContent: gql `
|
|
350
|
-
query UserEventsWithContent($filter: UserEventFilterVOInput, $page: PageInput){
|
|
351
|
-
data: userEvents(filter: $filter, page: $page){
|
|
352
|
-
...UserEventFragment
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
${UserEventFragments.userEvent}
|
|
356
|
-
`
|
|
357
|
-
};
|
|
358
|
-
const userEventMutations = {
|
|
359
|
-
deleteByIds: gql `
|
|
360
|
-
mutation DeleteUserEvents($ids:[Int]){
|
|
361
|
-
deleteUserEvents(ids: $ids)
|
|
362
|
-
}
|
|
363
|
-
`,
|
|
364
|
-
save: gql `
|
|
365
|
-
mutation SaveUserEvent($data: UserEventVOInput){
|
|
366
|
-
data: saveUserEvent(userEvent: $data){
|
|
367
|
-
...UserEventFragment
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
${UserEventFragments.userEvent}
|
|
371
|
-
`
|
|
372
|
-
};
|
|
373
|
-
export class UserEventService extends AbstractUserEventService {
|
|
374
|
-
constructor(graphql, accountService, network, translate, toastController, environment) {
|
|
375
|
-
super(graphql, accountService, network, translate, userEventQueries, userEventMutations, undefined, environment);
|
|
376
|
-
this.graphql = graphql;
|
|
377
|
-
this.accountService = accountService;
|
|
378
|
-
this.network = network;
|
|
379
|
-
this.translate = translate;
|
|
380
|
-
this.toastController = toastController;
|
|
381
|
-
this.environment = environment;
|
|
251
|
+
getActionsByTypename(typename) {
|
|
252
|
+
return this._userEventActions.filter(def => def.__typename === typename);
|
|
382
253
|
}
|
|
383
254
|
showToastErrorWithContext(opts) {
|
|
384
255
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -442,16 +313,13 @@ export class UserEventService extends AbstractUserEventService {
|
|
|
442
313
|
}
|
|
443
314
|
sendDataForDebug(data) {
|
|
444
315
|
const userEvent = new UserEvent();
|
|
445
|
-
userEvent.
|
|
316
|
+
userEvent.eventType = UserEventTypes.DEBUG_DATA;
|
|
446
317
|
userEvent.content = this.convertObjectToString(data);
|
|
447
318
|
return this.save(userEvent);
|
|
448
319
|
}
|
|
449
320
|
asFilter(filter) {
|
|
450
321
|
return UserEventFilter.fromObject(filter);
|
|
451
322
|
}
|
|
452
|
-
fromObject(source) {
|
|
453
|
-
return UserEvent.fromObject(source);
|
|
454
|
-
}
|
|
455
323
|
/* -- protected methods -- */
|
|
456
324
|
convertObjectToString(data) {
|
|
457
325
|
if (typeof data === 'string') {
|
|
@@ -480,9 +348,13 @@ export class UserEventService extends AbstractUserEventService {
|
|
|
480
348
|
// TODO: compute sign
|
|
481
349
|
console.warn('TODO: sign user event before sending');
|
|
482
350
|
}
|
|
351
|
+
copyIdAndUpdateDate(source, target) {
|
|
352
|
+
EntityUtils.copyIdAndUpdateDate(source, target);
|
|
353
|
+
}
|
|
483
354
|
}
|
|
355
|
+
UserEventService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(i0.ɵɵinject(i1.GraphqlService), i0.ɵɵinject(i2.AccountService), i0.ɵɵinject(i3.NetworkService), i0.ɵɵinject(i4.TranslateService), i0.ɵɵinject(i5.ToastController), i0.ɵɵinject(i6.ENVIRONMENT, 8)); }, token: UserEventService, providedIn: "root" });
|
|
484
356
|
UserEventService.decorators = [
|
|
485
|
-
{ type: Injectable }
|
|
357
|
+
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
486
358
|
];
|
|
487
359
|
UserEventService.ctorParameters = () => [
|
|
488
360
|
{ type: GraphqlService },
|
|
@@ -492,4 +364,4 @@ UserEventService.ctorParameters = () => [
|
|
|
492
364
|
{ type: ToastController },
|
|
493
365
|
{ type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
|
|
494
366
|
];
|
|
495
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC91c2VyLWV2ZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBZSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRSxPQUFPLEVBQWdDLFNBQVMsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHNUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDcEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssY0FBYyxNQUFNLFFBQVEsQ0FBQztBQUd6QyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFFOUIsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQThCLGtCQUFrQixDQUFDLENBQUM7QUFzRHpHLE1BQU0sT0FBZ0Isd0JBR3BCLFNBQVEsa0JBQXdCO0lBV2hDLFlBQ1ksT0FBdUIsRUFDdkIsY0FBOEIsRUFDOUIsT0FBdUIsRUFDdkIsU0FBMkIsRUFDM0IsT0FBMEIsRUFDMUIsU0FBOEIsRUFDOUIsYUFBc0MsRUFDTCxXQUF3QjtRQUVuRSxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBVGxCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFxQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBeUI7UUFDTCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWhCN0QsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxjQUFTLEdBQTRCLEVBQUUsQ0FBQztRQWlCaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQztRQUMxQyxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFDLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxVQUFVLENBQUEsQ0FBQztRQUV2QyxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBUyxFQUFFO1lBQ2xFLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUNyRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsWUFBWSxLQUFLLHVCQUF1QixDQUFDLENBQUM7YUFDM0U7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7SUFFTixDQUFDO0lBNUJELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQTRCRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBTUQsUUFBUSxDQUFDLE1BQWMsRUFBRSxJQUFZLEVBQUUsTUFBZSxFQUFFLGFBQTZCLEVBQUUsTUFBbUIsRUFBRSxPQUFZO1FBQ3RILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVUsRUFDVixNQUFtQixFQUNuQixPQUFZOztRQUVwQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxrQkFBa0I7UUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxFLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9CLG9FQUFvRTtRQUNwRSxJQUFJLFlBQVksQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3RFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFDLElBQUksUUFBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsVUFBVSwwQ0FBRSxRQUFRLENBQUMsU0FBUyxFQUFDLEVBQUU7Z0JBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMERBQTBELEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ3JGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNqQztTQUNGO1FBRUQsTUFBTSxXQUFXLEdBQUcsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVyxNQUFLLElBQUksQ0FBQztRQUVsRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBNkM7WUFDeEUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO1lBQzNFLFNBQVMsRUFBRTtnQkFDVCxJQUFJLGdDQUNGLE1BQU0sRUFBRSxjQUFjLElBQ25CLElBQUk7b0JBQ1AsYUFBYTtvQkFDYixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUM1RDtnQkFDRCxNQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7YUFDdkM7WUFDRCxjQUFjLEVBQUUsTUFBTTtZQUN0QixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLHFDQUFxQyxFQUFFO1lBQ3hHLFdBQVcsRUFBRSxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLEtBQUksYUFBYTtTQUNuRCxDQUFDO2FBQ0MsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNSLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsSUFBSSxLQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUUxRCxJQUFJLEdBQUcsRUFBRTtnQkFDUCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSwwQkFBMEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzlGLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDWjtZQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsT0FBTztnQkFDTCxJQUFJO2dCQUNKLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLEtBQUssRUFBRSxXQUFXLENBQUM7YUFDekMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQsR0FBRyxDQUFDLE1BQVM7UUFFWCwyQ0FBMkM7UUFFM0MsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV2QyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUVyQyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLDhCQUE4QixDQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFDbEI7WUFDRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87WUFDM0UsSUFBSSxFQUFFLE1BQU07U0FDYixDQUNGLENBQUM7UUFFRixlQUFlO1FBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVLLEtBQUssQ0FBQyxNQUFrQixFQUFFLE9BQXdDOzs7WUFFdEUsSUFBSSxRQUFDLElBQUksQ0FBQyxPQUFPLDBDQUFFLEtBQUssQ0FBQSxFQUFFO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsbUNBQW1DLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFFRCxJQUFJLENBQUMsTUFBTTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDMUQsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFL0IsSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFOUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBcUI7Z0JBQ3ZELEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7Z0JBQ3pCLFNBQVMsRUFBRTtvQkFDVCxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtpQkFDN0I7Z0JBQ0QsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRTtnQkFDeEcsV0FBVyxFQUFFLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFdBQVcsS0FBSSxjQUFjO2FBQ3BELENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQzs7S0FDbEI7SUFFRCxhQUFhLENBQUMsTUFBa0IsRUFBRSxPQUFnRTs7UUFFaEcsSUFBSSxRQUFDLElBQUksQ0FBQyxhQUFhLDBDQUFFLGFBQWEsQ0FBQSxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSx3REFBd0QsQ0FBQyxDQUFDO1lBQ3pGLE9BQU8sRUFBRSxFQUFFLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFELE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9CLE1BQU0sV0FBVyxHQUFHLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFdBQVcsTUFBSyxJQUFJLENBQUM7UUFFbEQsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxxREFBcUQsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVoSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFxRDtZQUNoRixLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhO1lBQ3ZDLFdBQVcsRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVztZQUNqQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN0RixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLGdCQUFnQixDQUFDLDJCQUEyQjtnQkFDbEQsT0FBTyxFQUFFLDBDQUEwQzthQUNwRDtTQUNGLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQ2IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVGLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckQsZUFBZTtZQUNmLElBQUksQ0FBQyw4QkFBOEIsQ0FDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQ2xCO2dCQUNFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDM0UsSUFBSSxFQUFFLFdBQVc7YUFDbEIsQ0FDRixDQUFDO1lBQ0YsZUFBZTtZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNsRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQ0YsQ0FDRixDQUFDO0lBRUosQ0FBQztJQUVLLE1BQU0sQ0FBQyxNQUFTOztZQUNwQixJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLENBQUMsT0FBTztZQUM1QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7S0FBQTtJQUVLLFNBQVMsQ0FBQyxRQUFhLEVBQUUsSUFBVTs7WUFDdkMsTUFBTSxHQUFHLEdBQUcsUUFBUSxJQUFJLFFBQVE7aUJBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUM7Z0JBQUUsT0FBTyxDQUFDLDhCQUE4QjtZQUU3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUseUJBQXlCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFakYsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBTTtnQkFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVztnQkFDcEMsU0FBUyxFQUFFO29CQUNULEdBQUc7aUJBQ0o7Z0JBQ0QsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2hCLHFCQUFxQjtvQkFDckIsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLEtBQUssRUFBRTt3QkFDOUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzt3QkFDM0IsR0FBRztxQkFDSixDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLEtBQUssRUFBRTt3QkFDOUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO3dCQUN0QyxHQUFHO3FCQUNKLENBQUMsQ0FBQztvQkFFSCxJQUFJLElBQUksQ0FBQyxNQUFNO3dCQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxxQkFBcUIsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzlGLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFSyxJQUFJLENBQUMsTUFBUyxFQUFFLE9BQWtDOztZQUN0RCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFbkMsc0JBQXNCO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUvRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFnQjtnQkFDdkMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTtnQkFDN0IsU0FBUyxFQUFFO29CQUNULElBQUksRUFBRSxJQUFJO2lCQUNYO2dCQUNELEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUU7Z0JBQ3RHLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7b0JBQzFCLGdCQUFnQjtvQkFDaEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ3RDLElBQUksV0FBVyxFQUFFO3dCQUNmLElBQUksSUFBSSxDQUFDLE1BQU07NEJBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLHVCQUF1QixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7d0JBQ3RHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7d0JBRTlDLGVBQWU7d0JBQ2YsSUFBSSxLQUFLLEVBQUU7NEJBQ1QsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEtBQUssRUFBRTtnQ0FDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztnQ0FDM0IsSUFBSSxrQ0FDQyxXQUFXLEtBQ2QsT0FBTyxFQUFFLElBQUksR0FDZDs2QkFDRixDQUFDLENBQUM7NEJBQ0gsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEtBQUssRUFBRTtnQ0FDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO2dDQUN0QyxJQUFJLEVBQUUsV0FBVzs2QkFDbEIsQ0FBQyxDQUFDO3lCQUNKO3FCQUNGO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7WUFFSCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQUE7SUFFRCxPQUFPLENBQUMsSUFBUyxFQUFFLElBQVU7UUFDM0IsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUk7YUFDcEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFSyxVQUFVLENBQUMsTUFBUzs7WUFDeEIsdUJBQXVCO1lBQ3ZCLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqSSxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFCLEtBQUssTUFBTSxRQUFRLElBQUksZUFBZSxFQUFFO29CQUN0QyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7aUJBQU07Z0JBQ0wsY0FBYztnQkFDZCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN0QztRQUNILENBQUM7S0FBQTtJQUVELGdCQUFnQixDQUFDLFFBQStCO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCw2QkFBNkI7SUFFbkIsZ0JBQWdCLENBQUMsTUFBVztRQUNwQyxvQ0FBb0M7UUFDcEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyQyxnQkFBZ0I7UUFDaEIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDNUgsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7WUFDaEMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsSUFBSSxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsdUNBQXVDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2xHLE1BQU07YUFDUDtTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVlLGlCQUFpQixDQUFDLFNBQVk7O1lBQzVDLElBQUksQ0FBQyxTQUFTO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSx1QkFBdUIsQ0FBQyxDQUFDO1lBRTNFLGdCQUFnQjtZQUNoQixTQUFTLENBQUMsUUFBUSxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBRTlCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSx1QkFBdUIsQ0FBQyxDQUFDO2dCQUMxRSxxQkFBcUI7YUFDdEI7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzVCO1FBQ0gsQ0FBQztLQUFBO0lBRVMsYUFBYTtRQUNyQixhQUFhO1FBQ2IsT0FBVTtZQUNSLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3RDLENBQUM7SUFDSixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNDLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxNQUFTO0lBQ3pDLENBQUM7SUFFUyxZQUFZLENBQUMsTUFBVztRQUNoQyxtREFBbUQ7UUFDbkQsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsTUFBTTthQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3pDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFtQixDQUFDLENBQUM7UUFDN0YsT0FBTyxNQUFNO2FBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDNUUsQ0FBQztJQUVTLG1CQUFtQixDQUFDLE1BQVMsRUFBRSxNQUFTO1FBQ2hELFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQzs7O1lBcFdGLFNBQVM7OztZQTNFRCxjQUFjO1lBRGQsY0FBYztZQWFkLGNBQWM7WUFEZCxnQkFBZ0I7Ozs7WUFJaEIsV0FBVyx1QkFtRmYsUUFBUSxZQUFJLE1BQU0sU0FBQyxXQUFXOztBQWtWbkMsTUFBTSxnQkFBZ0IsR0FBc0I7SUFDMUMsT0FBTyxFQUFFLEdBQUcsQ0FBQTs7Ozs7O01BTVIsa0JBQWtCLENBQUMsY0FBYztHQUNwQztJQUVELGtCQUFrQixFQUFFLEdBQUcsQ0FBQTs7Ozs7O01BTW5CLGtCQUFrQixDQUFDLFNBQVM7R0FDL0I7Q0FDRixDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBd0I7SUFDOUMsV0FBVyxFQUFFLEdBQUcsQ0FBQTs7OztHQUlmO0lBRUQsSUFBSSxFQUFFLEdBQUcsQ0FBQTs7Ozs7O01BTUwsa0JBQWtCLENBQUMsU0FBUztHQUMvQjtDQUNGLENBQUM7QUFJRixNQUFNLE9BQU8sZ0JBQ1gsU0FBUSx3QkFBb0Q7SUFFNUQsWUFDWSxPQUF1QixFQUN2QixjQUE4QixFQUM5QixPQUF1QixFQUN2QixTQUEyQixFQUMzQixlQUFnQyxFQUNDLFdBQXdCO1FBRW5FLEtBQUssQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBUHZHLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUdyRSxDQUFDO0lBRUsseUJBQXlCLENBQUMsSUFJL0I7O1lBRUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9FLDZCQUE2QjtZQUM3QixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTtnQkFDM0MsT0FBTyxHQUFHLCtCQUErQixDQUFDO2FBQzNDO1lBRUQscUNBQXFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzNDLE9BQU87YUFDUjtZQUVELGdFQUFnRTtZQUNoRSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFMUMsc0JBQXNCO1lBQ3RCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzdEO1lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUMvQixJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUUsS0FBSztnQkFDZixPQUFPLEVBQUUsT0FBTyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLE1BQU07Z0JBQy9GLE9BQU8sRUFBRSxDQUFDO3dCQUNSLElBQUksRUFBRSxLQUFLO3dCQUNYLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDL0MsSUFBSSxFQUFFLE1BQU07cUJBQ2IsQ0FBQzthQUNILENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUFFLE9BQU87WUFFeEMsa0JBQWtCO1lBQ2xCLElBQUk7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBRXhELHVCQUF1QjtnQkFDdkIsSUFBSSxPQUFPLEdBQVEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3hDLElBQUksT0FBTyxPQUFPLEtBQUssVUFBVSxFQUFFO29CQUNqQyxPQUFPLEdBQUcsT0FBTyxFQUFFLENBQUM7aUJBQ3JCO2dCQUNELElBQUksT0FBTyxZQUFZLE9BQU8sRUFBRTtvQkFDOUIsT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDO2lCQUN6QjtnQkFFRCxtQkFBbUI7Z0JBQ25CLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDO29CQUM1QyxPQUFPO29CQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVM7b0JBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDO2lCQUM3QyxDQUFDLENBQUM7Z0JBRUgsT0FBTyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDYixJQUFJLEVBQUUsTUFBTTtvQkFDWixPQUFPLEVBQUUsc0JBQXNCO29CQUMvQixlQUFlLEVBQUUsSUFBSTtpQkFDdEIsQ0FBQyxDQUFDO2FBQ0o7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZEO1FBQ0gsQ0FBQztLQUFBO0lBRUQsZ0JBQWdCLENBQUMsSUFBUztRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQztRQUMzQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFnQztRQUN2QyxPQUFPLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFXO1FBQ3BCLE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsNkJBQTZCO0lBRW5CLHFCQUFxQixDQUFDLElBQVM7UUFDdkMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELGdDQUFnQzthQUMzQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNqQyxJQUFJLElBQUksWUFBWSxNQUFNLEVBQUU7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDaEc7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCO1NBQ0Y7SUFDSCxDQUFDO0lBRWUsU0FBUyxDQUFVLElBQXNCOztZQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ2xHLE9BQU8sTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RSxDQUFDO0tBQUE7SUFFUyxxQkFBcUIsQ0FBQyxNQUFpQjtRQUMvQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUVuRCwyQ0FBMkM7UUFDM0MscUJBQXFCO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN2RCxDQUFDOzs7WUEvSEYsVUFBVTs7O1lBMWRGLGNBQWM7WUFEZCxjQUFjO1lBYWQsY0FBYztZQURkLGdCQUFnQjtZQURoQixlQUFlO1lBS2YsV0FBVyx1QkFxZGYsUUFBUSxZQUFJLE1BQU0sU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGZXRjaFBvbGljeSwgZ3FsIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBTb2NpYWxFcnJvckNvZGVzIH0gZnJvbSAnLi4vc29jaWFsLmVycm9ycyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IEdyYXBocWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9ncmFwaHFsL2dyYXBocWwuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElVc2VyRXZlbnQsIElVc2VyRXZlbnRGaWx0ZXIsIFVzZXJFdmVudCwgVXNlckV2ZW50RmlsdGVyLCBVc2VyRXZlbnRUeXBlcyB9IGZyb20gJy4vdXNlci1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBVc2VyRXZlbnRGcmFnbWVudHMgfSBmcm9tICcuL3VzZXItZXZlbnQuZnJhZ21lbnRzJztcbmltcG9ydCB7IFNvcnREaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRW50aXR5U2VydmljZUxvYWRPcHRpb25zLCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0LCBQYWdlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90TmlsLCB0b051bWJlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBPdmVybGF5RXZlbnREZXRhaWwgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VHcmFwaHFsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvYmFzZS1ncmFwaHFsLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlVdGlscyB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5leHBvcnQgY29uc3QgVXNlckV2ZW50U2VydmljZVRva2VuID0gbmV3IEluamVjdGlvblRva2VuPElVc2VyRXZlbnRTZXJ2aWNlPGFueSwgYW55Pj4oJ1VzZXJFdmVudFNlcnZpY2UnKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFVzZXJFdmVudFdhdGNoT3B0aW9ucyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyB7XG4gIHdpdGhDb250ZW50PzogYm9vbGVhbjsgLy8gRGVmYXVsdCB0byBmYWxzZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIFVzZXJFdmVudEFjdGlvbkRlZmluaXRpb24gZXh0ZW5kcyBVc2VyRXZlbnRBY3Rpb24ge1xuLy8gICBfX3R5cGVuYW1lOiBzdHJpbmc7XG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJFdmVudFF1ZXJpZXMge1xuICBsb2FkQWxsOiBhbnk7XG4gIGxvYWRBbGxXaXRoQ29udGVudDogYW55O1xuICBjb3VudD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckV2ZW50TXV0YXRpb25zIHtcbiAgc2F2ZTogYW55O1xuICBkZWxldGVCeUlkczogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRTdWJzY3JpcHRpb25zIHtcbiAgbGlzdGVuQ2hhbmdlczogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRMaXN0ZW5lcjxFIGV4dGVuZHMgSVVzZXJFdmVudDxFPj4ge1xuICBhY2NlcHQ6IChFKSA9PiBib29sZWFuO1xuICBvblJlY2VpdmVkPzogKEUpID0+IEUgfCB1bmRlZmluZWQ7XG4gIG9uUmVhZD86IChFKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRTZXJ2aWNlPEUgZXh0ZW5kcyBJVXNlckV2ZW50PEU+LFxuICBGIGV4dGVuZHMgSVVzZXJFdmVudEZpbHRlcjxFPixcbiAgV08gZXh0ZW5kcyBVc2VyRXZlbnRXYXRjaE9wdGlvbnMgPSBVc2VyRXZlbnRXYXRjaE9wdGlvbnM+XG4gIGV4dGVuZHMgSUVudGl0aWVzU2VydmljZTxFLCBGLCBXTz4ge1xuXG4gIHVzZXJFdmVudENvdW50OiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgYWRkKGVudGl0eTogRSk7XG5cbiAgY291bnQoZmlsdGVyOiBQYXJ0aWFsPEY+LCBvcHRpb25zPzogeyBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5OyB9KTogUHJvbWlzZTxudW1iZXI+O1xuXG4gIGxpc3RlbkNoYW5nZXMoZmlsdGVyOiBQYXJ0aWFsPEY+LCBvcHRpb25zPzogV08gJiB7IGludGVydmFsPzogbnVtYmVyOyBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5OyB9KTogT2JzZXJ2YWJsZTxFW10+O1xuXG4gIHNhdmUoZW50aXR5OiBFLCBvcHRpb25zPzogRW50aXR5U2VydmljZUxvYWRPcHRpb25zKTogUHJvbWlzZTxFPjtcblxuICBkZWxldGUoZW50aXR5OiBFKTogUHJvbWlzZTxhbnk+O1xuXG4gIG1hcmtBc1JlYWQoZW50aXR5OiBFKTtcblxufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFVzZXJFdmVudFNlcnZpY2U8RSBleHRlbmRzIElVc2VyRXZlbnQ8RSwgYW55PixcbiAgRiBleHRlbmRzIElVc2VyRXZlbnRGaWx0ZXI8RSwgYW55PixcbiAgV08gZXh0ZW5kcyBVc2VyRXZlbnRXYXRjaE9wdGlvbnMgPSBVc2VyRXZlbnRXYXRjaE9wdGlvbnM+XG4gIGV4dGVuZHMgQmFzZUdyYXBocWxTZXJ2aWNlPEUsIEY+XG4gIGltcGxlbWVudHMgSVVzZXJFdmVudFNlcnZpY2U8RSwgRiwgV08+LCBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgX2NvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgbGlzdGVuZXJzOiBJVXNlckV2ZW50TGlzdGVuZXI8RT5bXSA9IFtdO1xuXG4gIGdldCB1c2VyRXZlbnRDb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jb3VudCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGdyYXBocWw6IEdyYXBocWxTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHF1ZXJpZXM6IElVc2VyRXZlbnRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBtdXRhdGlvbnM6IElVc2VyRXZlbnRNdXRhdGlvbnMsXG4gICAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbnM6IElVc2VyRXZlbnRTdWJzY3JpcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRcbiAgKSB7XG4gICAgc3VwZXIoZ3JhcGhxbCwgZW52aXJvbm1lbnQpO1xuICAgIHRoaXMuX2xvZ1ByZWZpeCA9ICdbdXNlci1ldmVudC1zZXJ2aWNlXSAnO1xuICAgIC8vIEZvciBERVYgb25seVxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50Py5wcm9kdWN0aW9uO1xuXG4gICAgLy8gbGlzdGVuIGxvZ2luL2xvZ291dFxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKGFjY291bnRTZXJ2aWNlLm9uTG9naW4uc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvdW50ID0gYXdhaXQgdGhpcy5jb3VudCh0aGlzLmRlZmF1bHRGaWx0ZXIoKSk7XG4gICAgICBpZiAoY291bnQgJiYgdGhpcy5fZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9UmVjZWl2ZWQgJHtjb3VudH0gdW5yZWFkIG5vdGlmaWNhdGlvbnNgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvdW50JC5uZXh0KGNvdW50KTtcbiAgICB9KSk7XG5cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFic3RyYWN0IGFzRmlsdGVyKGZpbHRlcjogUGFydGlhbDxGPik6IEY7XG5cbiAgYWJzdHJhY3QgZnJvbU9iamVjdChzb3VyY2U6IGFueSk6IEU7XG5cbiAgd2F0Y2hBbGwob2Zmc2V0OiBudW1iZXIsIHNpemU6IG51bWJlciwgc29ydEJ5Pzogc3RyaW5nLCBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbiwgZmlsdGVyPzogUGFydGlhbDxGPiwgb3B0aW9ucz86IFdPKTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PEU+PiB7XG4gICAgcmV0dXJuIHRoaXMud2F0Y2hQYWdlKDxQYWdlPnsgb2Zmc2V0LCBzaXplLCBzb3J0QnksIHNvcnREaXJlY3Rpb24gfSwgZmlsdGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIHdhdGNoUGFnZShwYWdlOiBQYWdlLFxuICAgICAgICAgICAgZmlsdGVyPzogUGFydGlhbDxGPixcbiAgICAgICAgICAgIG9wdGlvbnM/OiBXTyk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxFPj4ge1xuXG4gICAgbGV0IG5vdyA9IHRoaXMuX2RlYnVnICYmIERhdGUubm93KCk7XG4gICAgLy9pZiAodGhpcy5fZGVidWcpXG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9TG9hZGluZyB1c2VyIGV2ZW50cy4uLmAsIGZpbHRlcik7XG5cbiAgICBmaWx0ZXIgPSB0aGlzLmFzRmlsdGVyKGZpbHRlcik7XG5cbiAgICAvLyBGb3JjZSByZWNpcGllbnQgdG8gY3VycmVudCBpc3N1ZXIsIGlmIG5vdCBhZG1pbiBhbmQgbm90IHNwZWNpZmllZFxuICAgIGlmIChpc0VtcHR5QXJyYXkoZmlsdGVyPy5yZWNpcGllbnRzKSB8fCAhdGhpcy5hY2NvdW50U2VydmljZS5pc0FkbWluKCkpIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHRoaXMuZGVmYXVsdFJlY2lwaWVudCgpO1xuICAgICAgaWYgKCFmaWx0ZXI/LnJlY2lwaWVudHM/LmluY2x1ZGVzKHJlY2lwaWVudCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdXNlci1ldmVudHMtc2VydmljZV0gRm9yY2UgdXNlciBldmVudCBmaWx0ZXIucmVjaXBpZW50PScgKyByZWNpcGllbnQpO1xuICAgICAgICBmaWx0ZXIucmVjaXBpZW50cyA9IFtyZWNpcGllbnRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhDb250ZW50ID0gb3B0aW9ucz8ud2l0aENvbnRlbnQgPT09IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5tdXRhYmxlV2F0Y2hRdWVyeTxMb2FkUmVzdWx0PEU+LCB7IGZpbHRlcjogYW55LCBwYWdlOiBQYWdlIH0+KHtcbiAgICAgIHF1ZXJ5TmFtZTogd2l0aENvbnRlbnQgPyAnTG9hZEFsbFdpdGhDb250ZW50JyA6ICdMb2FkQWxsJyxcbiAgICAgIHF1ZXJ5OiB3aXRoQ29udGVudCA/IHRoaXMucXVlcmllcy5sb2FkQWxsV2l0aENvbnRlbnQgOiB0aGlzLnF1ZXJpZXMubG9hZEFsbCxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgc29ydEJ5OiAnY3JlYXRpb25EYXRlJyxcbiAgICAgICAgICAuLi5wYWdlLFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzb3J0RGlyZWN0aW9uOiAocGFnZS5zb3J0RGlyZWN0aW9uIHx8ICdkZXNjJykudG9VcHBlckNhc2UoKSxcbiAgICAgICAgfSxcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIgJiYgZmlsdGVyLmFzUG9kT2JqZWN0KClcbiAgICAgIH0sXG4gICAgICBhcnJheUZpZWxkTmFtZTogJ2RhdGEnLFxuICAgICAgZXJyb3I6IHsgY29kZTogU29jaWFsRXJyb3JDb2Rlcy5MT0FEX1VTRVJfRVZFTlRTX0VSUk9SLCBtZXNzYWdlOiAnU09DSUFMLkVSUk9SLkxPQURfVVNFUl9FVkVOVFNfRVJST1InIH0sXG4gICAgICBmZXRjaFBvbGljeTogb3B0aW9ucz8uZmV0Y2hQb2xpY3kgfHwgXCJjYWNoZS1maXJzdFwiXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gKHJlcz8uZGF0YSB8fCBbXSkubWFwKHRoaXMucHJvY2Vzc1VzZXJFdmVudCk7XG5cbiAgICAgICAgICBpZiAobm93KSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH0ke2RhdGEubGVuZ3RofSB1c2VyIGV2ZW50cyBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG4gICAgICAgICAgICBub3cgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB1bnJlYWRDb3VudCA9IHRoaXMudW5yZWFkRXZlbnRzKGRhdGEpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgdG90YWw6IHRvTnVtYmVyKHJlcz8udG90YWwsIHVucmVhZENvdW50KVxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgYWRkKGVudGl0eTogRSkge1xuXG4gICAgLy8gVE9ETyBzZXQgYW4gaWQgISEhISEhISEhISEhISEhISEhISEhISEhIVxuXG4gICAgZW50aXR5ID0gdGhpcy5wcm9jZXNzVXNlckV2ZW50KGVudGl0eSk7XG5cbiAgICBjb25zdCB3aXRoQ29udGVudCA9ICEhZW50aXR5LmNvbnRlbnQ7XG5cbiAgICAvLyBBZGQgdXNlciBldmVudCBsb2NhbGx5XG4gICAgdGhpcy5pbnNlcnRJbnRvTXV0YWJsZUNhY2hlZFF1ZXJpZXMoXG4gICAgICB0aGlzLmdyYXBocWwuY2FjaGUsXG4gICAgICB7XG4gICAgICAgIHF1ZXJ5OiB3aXRoQ29udGVudCA/IHRoaXMucXVlcmllcy5sb2FkQWxsV2l0aENvbnRlbnQgOiB0aGlzLnF1ZXJpZXMubG9hZEFsbCxcbiAgICAgICAgZGF0YTogZW50aXR5XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBjb3VudFxuICAgIHRoaXMuX2NvdW50JC5uZXh0KHRoaXMuX2NvdW50JC52YWx1ZSArIDEpO1xuICB9XG5cbiAgYXN5bmMgY291bnQoZmlsdGVyOiBQYXJ0aWFsPEY+LCBvcHRpb25zPzogeyBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5OyB9KTogUHJvbWlzZTxudW1iZXI+IHtcblxuICAgIGlmICghdGhpcy5xdWVyaWVzPy5jb3VudCkge1xuICAgICAgY29uc29sZS53YXJuKGAke3RoaXMuX2xvZ1ByZWZpeH1RdWVyeSAnY291bnQnIG5vdCBwcm92aWRlZCwgc2tpcC5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFmaWx0ZXIpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhcmd1bWVudCAnZmlsdGVyJ2ApO1xuICAgIGZpbHRlciA9IHRoaXMuYXNGaWx0ZXIoZmlsdGVyKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9Q291bnRpbmcgdXNlciBldmVudHMgd2l0aCBmaWx0ZXI6YCwgZmlsdGVyKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IHRvdGFsOiBudW1iZXI7IH0+KHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXMuY291bnQsXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIuYXNQb2RPYmplY3QoKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiB7IGNvZGU6IFNvY2lhbEVycm9yQ29kZXMuQ09VTlRfVVNFUl9FVkVOVF9FUlJPUiwgbWVzc2FnZTogJ1NPQ0lBTC5FUlJPUi5DT1VOVF9VU0VSX0VWRU5UX0VSUk9SJyB9LFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdGlvbnM/LmZldGNoUG9saWN5IHx8ICduZXR3b3JrLW9ubHknXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy50b3RhbDtcbiAgfVxuXG4gIGxpc3RlbkNoYW5nZXMoZmlsdGVyOiBQYXJ0aWFsPEY+LCBvcHRpb25zPzogV08gJiB7IGludGVydmFsPzogbnVtYmVyOyBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5OyB9KTogT2JzZXJ2YWJsZTxFW10+IHtcblxuICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zPy5saXN0ZW5DaGFuZ2VzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5fbG9nUHJlZml4fVN1YnNjcmlwdGlvbiBxdWVyeSAnbGlzdGVuQ2hhbmdlcycgbm90IHByb3ZpZGVkLCBza2lwLmApO1xuICAgICAgcmV0dXJuIG9mKCk7XG4gICAgfVxuXG4gICAgaWYgKCFmaWx0ZXIpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhcmd1bWVudCAnZmlsdGVyJ2ApO1xuICAgIGZpbHRlciA9IHRoaXMuYXNGaWx0ZXIoZmlsdGVyKTtcblxuICAgIGNvbnN0IHdpdGhDb250ZW50ID0gb3B0aW9ucz8ud2l0aENvbnRlbnQgPT09IHRydWU7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVtXU10gTGlzdGVuaW5nIGNoYW5nZXMgZm9yIHVzZXIgZXZlbnRzIHdpdGggZmlsdGVyOmAsIGZpbHRlcik7XG5cbiAgICByZXR1cm4gdGhpcy5ncmFwaHFsLnN1YnNjcmliZTx7IGRhdGE6IGFueVtdIH0sIHsgZmlsdGVyOiBhbnksIGludGVydmFsOiBudW1iZXIgfT4oe1xuICAgICAgcXVlcnk6IHRoaXMuc3Vic2NyaXB0aW9ucy5saXN0ZW5DaGFuZ2VzLFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdGlvbnM/LmZldGNoUG9saWN5LFxuICAgICAgdmFyaWFibGVzOiB7IGZpbHRlcjogZmlsdGVyLmFzUG9kT2JqZWN0KCksIGludGVydmFsOiB0b051bWJlcihvcHRpb25zPy5pbnRlcnZhbCwgMTApIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBTb2NpYWxFcnJvckNvZGVzLlNVQlNDUklCRV9VU0VSX0VWRU5UU19FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ1NPQ0lBTC5FUlJPUi5TVUJTQ1JJQkVfVVNFUl9FVkVOVFNfRVJST1InXG4gICAgICB9XG4gICAgfSkucGlwZShcbiAgICAgIG1hcCgoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSAmJiB0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9UmVjZWl2ZWQgbmV3IHVzZXIgZXZlbnRzOmAsIGRhdGEpO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gZGF0YT8ubWFwKHRoaXMucHJvY2Vzc1VzZXJFdmVudCk7XG4gICAgICAgICAgLy8gVXBkYXRlIGNhY2hlXG4gICAgICAgICAgdGhpcy5pbnNlcnRJbnRvTXV0YWJsZUNhY2hlZFF1ZXJpZXMoXG4gICAgICAgICAgICB0aGlzLmdyYXBocWwuY2FjaGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHF1ZXJ5OiB3aXRoQ29udGVudCA/IHRoaXMucXVlcmllcy5sb2FkQWxsV2l0aENvbnRlbnQgOiB0aGlzLnF1ZXJpZXMubG9hZEFsbCxcbiAgICAgICAgICAgICAgZGF0YTogdXBkYXRlZERhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIHVwZGF0ZSBjb3VudFxuICAgICAgICAgIHRoaXMuX2NvdW50JC5uZXh0KHRoaXMudW5yZWFkRXZlbnRzKHVwZGF0ZWREYXRhKSk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWREYXRhO1xuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcblxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGVudGl0eTogRSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFlbnRpdHkpIHJldHVybjsgLy8gc2tpcFxuICAgIGF3YWl0IHRoaXMuZGVsZXRlQWxsKFtlbnRpdHldKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChlbnRpdGllczogRVtdLCBvcHRzPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZHMgPSBlbnRpdGllcyAmJiBlbnRpdGllc1xuICAgICAgLm1hcCh0ID0+IHQuaWQpO1xuICAgIGlmIChpc0VtcHR5QXJyYXkoaWRzKSkgcmV0dXJuOyAvLyBzdG9wLCBpZiBub3RoaW5nIGVsc2UgdG8gZG9cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1EZWxldGluZyBldmVudHMuLi4gaWRzOmAsIGlkcyk7XG5cbiAgICBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPGFueT4oe1xuICAgICAgbXV0YXRpb246IHRoaXMubXV0YXRpb25zLmRlbGV0ZUJ5SWRzLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkc1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogKHByb3h5KSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlc1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21NdXRhYmxlQ2FjaGVkUXVlcmllc0J5SWRzKHByb3h5LCB7XG4gICAgICAgICAgcXVlcnk6IHRoaXMucXVlcmllcy5sb2FkQWxsLFxuICAgICAgICAgIGlkc1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tTXV0YWJsZUNhY2hlZFF1ZXJpZXNCeUlkcyhwcm94eSwge1xuICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXMubG9hZEFsbFdpdGhDb250ZW50LFxuICAgICAgICAgIGlkc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUV2ZW50cyBkZWxldGVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShlbnRpdHk6IEUsIG9wdGlvbnM/OiBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMpOiBQcm9taXNlPEU+IHtcbiAgICB0aGlzLmZpbGxEZWZhdWx0UHJvcGVydGllcyhlbnRpdHkpO1xuXG4gICAgLy8gVHJhbnNmb3JtIGludG8ganNvblxuICAgIGNvbnN0IGlzTmV3ID0gaXNOaWwoZW50aXR5LmlkKTtcbiAgICBjb25zdCBqc29uID0gZW50aXR5LmFzT2JqZWN0KCk7XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9U2F2aW5nIHVzZXIgZXZlbnQuLi5gLCBqc29uKTtcblxuICAgIGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgbXV0YXRpb246IHRoaXMubXV0YXRpb25zLnNhdmUsXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZGF0YToganNvblxuICAgICAgfSxcbiAgICAgIGVycm9yOiB7IGNvZGU6IFNvY2lhbEVycm9yQ29kZXMuU0FWRV9VU0VSX0VWRU5UX0VSUk9SLCBtZXNzYWdlOiAnU09DSUFMLkVSUk9SLlNBVkVfVVNFUl9FVkVOVF9FUlJPUicgfSxcbiAgICAgIHVwZGF0ZTogKHByb3h5LCB7IGRhdGEgfSkgPT4ge1xuICAgICAgICAvLyBVcGRhdGUgZW50aXR5XG4gICAgICAgIGNvbnN0IHNhdmVkRW50aXR5ID0gZGF0YSAmJiBkYXRhLmRhdGE7XG4gICAgICAgIGlmIChzYXZlZEVudGl0eSkge1xuICAgICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9VXNlciBldmVudCBzYXZlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgLCBlbnRpdHkpO1xuICAgICAgICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShzYXZlZEVudGl0eSwgZW50aXR5KTtcblxuICAgICAgICAgIC8vIEFkZCB0byBjYWNoZVxuICAgICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbnRvTXV0YWJsZUNhY2hlZFF1ZXJpZXMocHJveHksIHtcbiAgICAgICAgICAgICAgcXVlcnk6IHRoaXMucXVlcmllcy5sb2FkQWxsLFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgLi4uc2F2ZWRFbnRpdHksXG4gICAgICAgICAgICAgICAgY29udGVudDogbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW50b011dGFibGVDYWNoZWRRdWVyaWVzKHByb3h5LCB7XG4gICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXMubG9hZEFsbFdpdGhDb250ZW50LFxuICAgICAgICAgICAgICBkYXRhOiBzYXZlZEVudGl0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgc2F2ZUFsbChkYXRhOiBFW10sIG9wdHM/OiBhbnkpOiBQcm9taXNlPEVbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChkYXRhXG4gICAgICAubWFwKGVudGl0eSA9PiB0aGlzLnNhdmUoZW50aXR5LCBvcHRzKSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbWFya0FzUmVhZChlbnRpdHk6IEUpIHtcbiAgICAvLyBHZXQgb25SZWFkIGxpc3RlbmVyc1xuICAgIGNvbnN0IG9uUmVhZExpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyB8fCBbXSkuZmlsdGVyKGxpc3RlbmVyID0+ICEhbGlzdGVuZXIub25SZWFkKS5maWx0ZXIobGlzdGVuZXIgPT4gbGlzdGVuZXIuYWNjZXB0KGVudGl0eSkpO1xuICAgIGlmIChvblJlYWRMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIG9uUmVhZExpc3RlbmVycykge1xuICAgICAgICBhd2FpdCBsaXN0ZW5lci5vblJlYWQoZW50aXR5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIGRlZmF1bHRcbiAgICAgIGF3YWl0IHRoaXMuZGVmYXVsdE1hcmtBc1JlYWQoZW50aXR5KTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyOiBJVXNlckV2ZW50TGlzdGVuZXI8RT4pIHtcbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzKSB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc1VzZXJFdmVudChzb3VyY2U6IGFueSk6IEUge1xuICAgIC8vIENvbnZlcnQganNvbiBzb3VyY2UgdG8gSVVzZXJFdmVudFxuICAgIGxldCB0YXJnZXQgPSB0aGlzLmZyb21PYmplY3Qoc291cmNlKTtcblxuICAgIC8vIEdldCBsaXN0ZW5lcnNcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSAodGhpcy5saXN0ZW5lcnMgfHwgW10pLmZpbHRlcihsaXN0ZW5lciA9PiBsaXN0ZW5lci5vblJlY2VpdmVkKS5maWx0ZXIobGlzdGVuZXIgPT4gbGlzdGVuZXIuYWNjZXB0KHRhcmdldCkpXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gbGlzdGVuZXIub25SZWNlaXZlZCh0YXJnZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1FdmVudCBoYXMgYmVlbiByZWplY3RlZCBieSBhIGxpc3RlbmVyYCwgc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBkZWZhdWx0TWFya0FzUmVhZCh1c2VyRXZlbnQ6IEUpIHtcbiAgICBpZiAoIXVzZXJFdmVudCkgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH1JbnZhbGlkIGV2ZW50IHRvIHNhdmVgKTtcblxuICAgIC8vIHNldCByZWFkIGRhdGVcbiAgICB1c2VyRXZlbnQucmVhZERhdGUgPSBtb21lbnQoKTtcblxuICAgIGlmICghdXNlckV2ZW50LmlkIHx8IHVzZXJFdmVudC5pZCA8IDApIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9U2F2ZSBsb2NhbCB1c2VyIGV2ZW50YCk7XG4gICAgICAvLyBUT0RPICEhISEhISEhISEhISFcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKHVzZXJFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRGaWx0ZXIoKTogRiB7XG4gICAgLy8gQnkgZGVmYXVsdFxuICAgIHJldHVybiA8Rj57XG4gICAgICByZWNpcGllbnRzOiBbdGhpcy5kZWZhdWx0UmVjaXBpZW50KCldXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0UmVjaXBpZW50KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudFNlcnZpY2UucGVyc29uLnB1YmtleTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWxsRGVmYXVsdFByb3BlcnRpZXMoZW50aXR5OiBFKSB7XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5yZWFkRXZlbnRzKGV2ZW50czogRVtdKTogbnVtYmVyIHtcbiAgICAvLyBkZWZhdWx0IGNhbGN1bGF0aW9uIG9uIHVucmVhZCBldmVudHMgZnJvbSBhIGxpc3RcbiAgICBpZiAoaXNFbXB0eUFycmF5KGV2ZW50cykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFzdFJlYWREYXRlID0gZXZlbnRzXG4gICAgICAuZmlsdGVyKGV2ZW50ID0+IGlzTm90TmlsKGV2ZW50LnJlYWREYXRlKSlcbiAgICAgIC5yZWR1Y2UoKGxhc3REYXRlLCBldmVudCkgPT4gRGF0ZVV0aWxzLm1heChsYXN0RGF0ZSwgZXZlbnQucmVhZERhdGUpLCB1bmRlZmluZWQgYXMgTW9tZW50KTtcbiAgICByZXR1cm4gZXZlbnRzXG4gICAgICAuZmlsdGVyKGV2ZW50ID0+IGV2ZW50LmNyZWF0aW9uRGF0ZS5pc1NhbWVPckFmdGVyKGxhc3RSZWFkRGF0ZSkpLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb3B5SWRBbmRVcGRhdGVEYXRlKHNvdXJjZTogRSwgdGFyZ2V0OiBFKSB7XG4gICAgRW50aXR5VXRpbHMuY29weUlkQW5kVXBkYXRlRGF0ZShzb3VyY2UsIHRhcmdldCk7XG4gIH1cblxufVxuXG5cbmNvbnN0IHVzZXJFdmVudFF1ZXJpZXM6IElVc2VyRXZlbnRRdWVyaWVzID0ge1xuICBsb2FkQWxsOiBncWxgXG4gICAgcXVlcnkgVXNlckV2ZW50cygkZmlsdGVyOiBVc2VyRXZlbnRGaWx0ZXJWT0lucHV0LCAkcGFnZTogUGFnZUlucHV0KXtcbiAgICAgIGRhdGE6IHVzZXJFdmVudHMoZmlsdGVyOiAkZmlsdGVyLCBwYWdlOiAkcGFnZSl7XG4gICAgICAgIC4uLkxpZ2h0VXNlckV2ZW50RnJhZ21lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgJHtVc2VyRXZlbnRGcmFnbWVudHMubGlnaHRVc2VyRXZlbnR9XG4gIGAsXG5cbiAgbG9hZEFsbFdpdGhDb250ZW50OiBncWxgXG4gICAgcXVlcnkgVXNlckV2ZW50c1dpdGhDb250ZW50KCRmaWx0ZXI6IFVzZXJFdmVudEZpbHRlclZPSW5wdXQsICRwYWdlOiBQYWdlSW5wdXQpe1xuICAgICAgZGF0YTogdXNlckV2ZW50cyhmaWx0ZXI6ICRmaWx0ZXIsIHBhZ2U6ICRwYWdlKXtcbiAgICAgICAgLi4uVXNlckV2ZW50RnJhZ21lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgJHtVc2VyRXZlbnRGcmFnbWVudHMudXNlckV2ZW50fVxuICBgXG59O1xuXG5jb25zdCB1c2VyRXZlbnRNdXRhdGlvbnM6IElVc2VyRXZlbnRNdXRhdGlvbnMgPSB7XG4gIGRlbGV0ZUJ5SWRzOiBncWxgXG4gICAgbXV0YXRpb24gRGVsZXRlVXNlckV2ZW50cygkaWRzOltJbnRdKXtcbiAgICAgIGRlbGV0ZVVzZXJFdmVudHMoaWRzOiAkaWRzKVxuICAgIH1cbiAgYCxcblxuICBzYXZlOiBncWxgXG4gICAgbXV0YXRpb24gU2F2ZVVzZXJFdmVudCgkZGF0YTogVXNlckV2ZW50Vk9JbnB1dCl7XG4gICAgICBkYXRhOiBzYXZlVXNlckV2ZW50KHVzZXJFdmVudDogJGRhdGEpe1xuICAgICAgICAuLi5Vc2VyRXZlbnRGcmFnbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAke1VzZXJFdmVudEZyYWdtZW50cy51c2VyRXZlbnR9XG4gIGBcbn07XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJFdmVudFNlcnZpY2VcbiAgZXh0ZW5kcyBBYnN0cmFjdFVzZXJFdmVudFNlcnZpY2U8VXNlckV2ZW50LCBVc2VyRXZlbnRGaWx0ZXI+IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZ3JhcGhxbDogR3JhcGhxbFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihncmFwaHFsLCBhY2NvdW50U2VydmljZSwgbmV0d29yaywgdHJhbnNsYXRlLCB1c2VyRXZlbnRRdWVyaWVzLCB1c2VyRXZlbnRNdXRhdGlvbnMsIHVuZGVmaW5lZCwgZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgYXN5bmMgc2hvd1RvYXN0RXJyb3JXaXRoQ29udGV4dChvcHRzOiB7XG4gICAgZXJyb3I/OiBhbnk7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb250ZXh0OiBhbnkgfCAoKCkgPT4gYW55KSB8IFByb21pc2U8YW55PjtcbiAgfSkge1xuXG4gICAgbGV0IG1lc3NhZ2UgPSBvcHRzLm1lc3NhZ2UgfHwgKG9wdHMuZXJyb3IgJiYgb3B0cy5lcnJvci5tZXNzYWdlIHx8IG9wdHMuZXJyb3IpO1xuXG4gICAgLy8gTWFrZSBzdXJlIG1lc3NhZ2UgYSBzdHJpbmdcbiAgICBpZiAoIW1lc3NhZ2UgfHwgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gJ0VSUk9SLlVOS05PV05fVEVDSE5JQ0FMX0VSUk9SJztcbiAgICB9XG5cbiAgICAvLyBJZiBvZmZsaW5lLCBkaXNwbGF5IGEgc2ltcGxlIGFsZXJ0XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2UsIHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNsYXRlIHRoZSBtZXNzYWdlICh0byBiZSBhYmxlIHRvIGV4dHJhY3QgZGV0YWlscyBjb250ZW50KVxuICAgIG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG1lc3NhZ2UpO1xuXG4gICAgLy8gQ2xlYW4gZGV0YWlscyBwYXJ0c1xuICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UuaW5kZXhPZignPHNtYWxsPicpICE9PSAtMSkge1xuICAgICAgbWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyKDAsIG1lc3NhZ2UuaW5kZXhPZignPHNtYWxsPicpIC0gMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIGR1cmF0aW9uOiAxNTAwMCxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgKyAnPGJyLz48YnIvPjxiPicgKyB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDT05GSVJNLlNFTkRfREVCVUdfREFUQScpICsgJzwvYj4nLFxuICAgICAgYnV0dG9uczogW3tcbiAgICAgICAgaWNvbjogJ2J1ZycsXG4gICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTU1PTi5CVE5fU0VORCcpLFxuICAgICAgICByb2xlOiAnc2VuZCdcbiAgICAgIH1dXG4gICAgfSk7XG4gICAgaWYgKCFyZXMgfHwgcmVzLnJvbGUgIT09ICdzZW5kJykgcmV0dXJuO1xuXG4gICAgLy8gU2VuZCBkZWJ1ZyBkYXRhXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnU2VuZGluZyBkZWJ1ZyBkYXRhLi4uJyk7XG5cbiAgICAgIC8vIENhbGwgY29udGVudCBmYWN0b3J5XG4gICAgICBsZXQgY29udGV4dDogYW55ID0gb3B0cyAmJiBvcHRzLmNvbnRleHQ7XG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBjb250ZXh0ID0gYXdhaXQgY29udGV4dDtcbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZVxuICAgICAgY29uc3QgdXNlckV2ZW50ID0gYXdhaXQgdGhpcy5zZW5kRGF0YUZvckRlYnVnKHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZXJyb3I6IG9wdHMuZXJyb3IgfHwgdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnZlcnRPYmplY3RUb1N0cmluZyhjb250ZXh0KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUuaW5mbygnRGVidWcgZGF0YSBzdWNjZXNzZnVsbHkgc2VudCB0byBhZG1pbicsIHVzZXJFdmVudCk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgbWVzc2FnZTogJ0lORk8uREVCVUdfREFUQV9TRU5EJyxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIHNlbmRpbmcgZGVidWcgZGF0YTonLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHNlbmREYXRhRm9yRGVidWcoZGF0YTogYW55KTogUHJvbWlzZTxVc2VyRXZlbnQ+IHtcbiAgICBjb25zdCB1c2VyRXZlbnQgPSBuZXcgVXNlckV2ZW50KCk7XG4gICAgdXNlckV2ZW50LnR5cGUgPSBVc2VyRXZlbnRUeXBlcy5ERUJVR19EQVRBO1xuICAgIHVzZXJFdmVudC5jb250ZW50ID0gdGhpcy5jb252ZXJ0T2JqZWN0VG9TdHJpbmcoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZSh1c2VyRXZlbnQpO1xuICB9XG5cbiAgYXNGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPFVzZXJFdmVudEZpbHRlcj4pOiBVc2VyRXZlbnRGaWx0ZXIge1xuICAgIHJldHVybiBVc2VyRXZlbnRGaWx0ZXIuZnJvbU9iamVjdChmaWx0ZXIpO1xuICB9XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSk6IFVzZXJFdmVudCB7XG4gICAgcmV0dXJuIFVzZXJFdmVudC5mcm9tT2JqZWN0KHNvdXJjZSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBjb252ZXJ0T2JqZWN0VG9TdHJpbmcoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLy8gU2VyaWFsaXplIGNvbnRlbnQgaW50byBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRW50aXR5KSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLmFzT2JqZWN0KHsga2VlcFR5cGVuYW1lOiB0cnVlLCBrZWVwTG9jYWxJZDogdHJ1ZSwgbWluaWZ5OiBmYWxzZSB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNob3dUb2FzdDxUID0gYW55PihvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxPdmVybGF5RXZlbnREZXRhaWw8VD4+IHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWxsRGVmYXVsdFByb3BlcnRpZXMoZW50aXR5OiBVc2VyRXZlbnQpIHtcbiAgICBlbnRpdHkuaXNzdWVyID0gdGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50LnB1YmtleTtcblxuICAgIC8vIFRPRE86IGNvbXB1dGUgaGFzaCAodXNpbmcgY3J5cHRvU2VydmljZSlcbiAgICAvLyBUT0RPOiBjb21wdXRlIHNpZ25cbiAgICBjb25zb2xlLndhcm4oJ1RPRE86IHNpZ24gdXNlciBldmVudCBiZWZvcmUgc2VuZGluZycpO1xuICB9XG5cbn1cbiJdfQ==
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC91c2VyLWV2ZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNsRSxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQW1CLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRzFELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuQyxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDbkYsT0FBTyxFQUFtQixNQUFNLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxNQUFNLEVBQUUs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VUFBVSxTQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7O1lBMUZ4QixjQUFjO1lBRGQsY0FBYztZQWFkLGNBQWM7WUFEZCxnQkFBZ0I7WUFEaEIsZUFBZTtZQUtmLFdBQVcsdUJBd0ZkLFFBQVEsWUFBSSxNQUFNLFNBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2dxbH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge1NvY2lhbEVycm9yQ29kZXN9IGZyb20gJy4uL3NvY2lhbC5lcnJvcnMnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHtHcmFwaHFsU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9ncmFwaHFsL2dyYXBocWwuc2VydmljZSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7VXNlckV2ZW50LCBVc2VyRXZlbnRBY3Rpb24sIFVzZXJFdmVudFR5cGVzfSBmcm9tICcuL3VzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHtVc2VyRXZlbnRGcmFnbWVudHN9IGZyb20gJy4vdXNlci1ldmVudC5mcmFnbWVudHMnO1xuaW1wb3J0IHtTb3J0RGlyZWN0aW9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7RW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLCBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMsIEZpbHRlckZuLCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0LCBQYWdlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbCwgaXNOaWxPckJsYW5rLCB0b051bWJlcn0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1Nob3dUb2FzdE9wdGlvbnMsIFRvYXN0c30gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQge092ZXJsYXlFdmVudERldGFpbH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHtUb2FzdENvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge05ldHdvcmtTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQge0Jhc2VHcmFwaHFsU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9iYXNlLWdyYXBocWwtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge0VudGl0eSwgRW50aXR5VXRpbHN9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RW52aXJvbm1lbnQsIEVOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtFbnRpdHlGaWx0ZXJ9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7RW50aXR5Q2xhc3N9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5LmRlY29yYXRvcnMnO1xuXG4vLyBAZHluYW1pY1xuQEVudGl0eUNsYXNzKHt0eXBlbmFtZTogJ1VzZXJFdmVudEZpbHRlclZPJ30pXG5leHBvcnQgY2xhc3MgVXNlckV2ZW50RmlsdGVyIGV4dGVuZHMgRW50aXR5RmlsdGVyPFVzZXJFdmVudEZpbHRlciwgVXNlckV2ZW50PiB7XG5cbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkgPT4gVXNlckV2ZW50RmlsdGVyO1xuXG4gIGlzc3Vlcjogc3RyaW5nID0gbnVsbDtcbiAgcmVjaXBpZW50OiBzdHJpbmcgPSBudWxsO1xuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnksIG9wdHM/OiBhbnkpIHtcbiAgICBzdXBlci5mcm9tT2JqZWN0KHNvdXJjZSwgb3B0cyk7XG4gICAgdGhpcy5pc3N1ZXIgPSBzb3VyY2UuaXNzdWVyO1xuICAgIHRoaXMucmVjaXBpZW50ID0gc291cmNlLnJlY2lwaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEZpbHRlcigpOiBGaWx0ZXJGbjxVc2VyRXZlbnQ+W10ge1xuICAgIGNvbnN0IGZpbHRlckZucyA9IHN1cGVyLmJ1aWxkRmlsdGVyKCk7XG5cbiAgICAvLyBpc3N1ZXJcbiAgICBpZiAodGhpcy5pc3N1ZXIpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gKHQuaXNzdWVyID09PSB0aGlzLmlzc3VlcikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWNpcGllbnQpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gKHQucmVjaXBpZW50ID09PSB0aGlzLnJlY2lwaWVudCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJGbnM7XG4gIH1cbn1cblxuY29uc3QgU2F2ZVF1ZXJ5OiBhbnkgPSBncWxgXG4gIG11dGF0aW9uIFNhdmVVc2VyRXZlbnQoJGRhdGE6IFVzZXJFdmVudFZPSW5wdXQpe1xuICAgIGRhdGE6IHNhdmVVc2VyRXZlbnQodXNlckV2ZW50OiAkZGF0YSl7XG4gICAgICAuLi5Vc2VyRXZlbnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke1VzZXJFdmVudEZyYWdtZW50cy51c2VyRXZlbnR9XG5gO1xuXG5jb25zdCBMb2FkQWxsUXVlcnk6IGFueSA9IGdxbGBcbiAgcXVlcnkgVXNlckV2ZW50cygkZmlsdGVyOiBVc2VyRXZlbnRGaWx0ZXJWT0lucHV0LCAkcGFnZTogUGFnZUlucHV0KXtcbiAgICBkYXRhOiB1c2VyRXZlbnRzKGZpbHRlcjogJGZpbHRlciwgcGFnZTogJHBhZ2Upe1xuICAgICAgLi4uTGlnaHRVc2VyRXZlbnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke1VzZXJFdmVudEZyYWdtZW50cy5saWdodFVzZXJFdmVudH1cbmA7XG5cbmNvbnN0IERlbGV0ZUJ5SWRzTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gRGVsZXRlVXNlckV2ZW50cygkaWRzOltJbnRdKXtcbiAgICBkZWxldGVVc2VyRXZlbnRzKGlkczogJGlkcylcbiAgfVxuYDtcblxuY29uc3QgTG9hZEFsbFdpdGhDb250ZW50UXVlcnk6IGFueSA9IGdxbGBcbiAgcXVlcnkgVXNlckV2ZW50c1dpdGhDb250ZW50KCRmaWx0ZXI6IFVzZXJFdmVudEZpbHRlclZPSW5wdXQsICRwYWdlOiBQYWdlSW5wdXQpe1xuICAgIGRhdGE6IHVzZXJFdmVudHMoZmlsdGVyOiAkZmlsdGVyLCBwYWdlOiAkcGFnZSl7XG4gICAgICAuLi5Vc2VyRXZlbnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke1VzZXJFdmVudEZyYWdtZW50cy51c2VyRXZlbnR9XG5gO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVXNlckV2ZW50V2F0Y2hPcHRpb25zIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zIHtcbiAgd2l0aENvbnRlbnQ/OiBib29sZWFuOyAvLyBEZWZhdWx0IHRvIGZhbHNlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckV2ZW50QWN0aW9uRGVmaW5pdGlvbiBleHRlbmRzIFVzZXJFdmVudEFjdGlvbjxhbnk+IHtcbiAgX190eXBlbmFtZTogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRTZXJ2aWNlXG4gIGV4dGVuZHMgQmFzZUdyYXBocWxTZXJ2aWNlPFVzZXJFdmVudCwgVXNlckV2ZW50RmlsdGVyPlxuICBpbXBsZW1lbnRzIElFbnRpdGllc1NlcnZpY2U8VXNlckV2ZW50LCBVc2VyRXZlbnRGaWx0ZXIsIFVzZXJFdmVudFdhdGNoT3B0aW9ucz4ge1xuXG4gIHByaXZhdGUgX3VzZXJFdmVudEFjdGlvbnM6IFVzZXJFdmVudEFjdGlvbkRlZmluaXRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBncmFwaHFsOiBHcmFwaHFsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBuZXR3b3JrOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKGdyYXBocWwsIGVudmlyb25tZW50KTtcblxuICAgIC8vIEZvciBERVYgb25seVxuICAgIHRoaXMuX2RlYnVnID0gZW52aXJvbm1lbnQgJiYgIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9mZnNldFxuICAgKiBAcGFyYW0gc2l6ZVxuICAgKiBAcGFyYW0gc29ydEJ5XG4gICAqIEBwYXJhbSBzb3J0RGlyZWN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHdhdGNoUGFnZSgpIGluc3RlYWRcbiAgICovXG4gIHdhdGNoQWxsKG9mZnNldDogbnVtYmVyLFxuICAgICAgICAgICBzaXplOiBudW1iZXIsXG4gICAgICAgICAgIHNvcnRCeT86IHN0cmluZyxcbiAgICAgICAgICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgICAgICAgIGZpbHRlcj86IFVzZXJFdmVudEZpbHRlcixcbiAgICAgICAgICAgb3B0aW9ucz86IFVzZXJFdmVudFdhdGNoT3B0aW9ucyk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxVc2VyRXZlbnQ+PiB7XG4gICAgcmV0dXJuIHRoaXMud2F0Y2hQYWdlKDxQYWdlPntvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbn0sIGZpbHRlciwgb3B0aW9ucyk7XG4gIH1cblxuICB3YXRjaFBhZ2UocGFnZTogUGFnZSxcbiAgICAgICAgICAgIGZpbHRlcj86IFBhcnRpYWw8VXNlckV2ZW50RmlsdGVyPixcbiAgICAgICAgICAgIG9wdGlvbnM/OiBVc2VyRXZlbnRXYXRjaE9wdGlvbnMpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VXNlckV2ZW50Pj4ge1xuXG4gICAgbGV0IG5vdyA9IHRoaXMuX2RlYnVnICYmIERhdGUubm93KCk7XG4gICAgLy9pZiAodGhpcy5fZGVidWcpXG4gICAgY29uc29sZS5kZWJ1ZygnW3VzZXItZXZlbnQtc2VydmljZV0gTG9hZGluZyB1c2VyIGV2ZW50cy4uLicsIGZpbHRlcik7XG5cbiAgICBmaWx0ZXIgPSB0aGlzLmFzRmlsdGVyKGZpbHRlcik7XG5cbiAgICAvLyBGb3JjZSByZWNpcGllbnQgdG8gY3VycmVudCBpc3N1ZXIsIGlmIG5vdCBhZG1pbiBhbmQgbm90IHNwZWNpZmllZFxuICAgIGlmIChpc05pbE9yQmxhbmsoZmlsdGVyLnJlY2lwaWVudCkgfHwgIXRoaXMuYWNjb3VudFNlcnZpY2UuaXNBZG1pbigpKSB7XG4gICAgICBjb25zdCByZWNpcGllbnQgPSB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQucHVia2V5O1xuICAgICAgaWYgKHJlY2lwaWVudCAhPT0gZmlsdGVyLnJlY2lwaWVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t1c2VyLWV2ZW50cy1zZXJ2aWNlXSBGb3JjZSB1c2VyIGV2ZW50IGZpbHRlci5yZWNpcGllbnQ9JyArIHJlY2lwaWVudCk7XG4gICAgICAgIGZpbHRlci5yZWNpcGllbnQgPSByZWNpcGllbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0aENvbnRlbnQgPSBvcHRpb25zICYmIG9wdGlvbnMud2l0aENvbnRlbnQgPT09IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5tdXRhYmxlV2F0Y2hRdWVyeTxMb2FkUmVzdWx0PGFueT4+KHtcbiAgICAgIHF1ZXJ5TmFtZTogd2l0aENvbnRlbnQgPyAnTG9hZEFsbFdpdGhDb250ZW50JyA6ICdMb2FkQWxsJyxcbiAgICAgIHF1ZXJ5OiB3aXRoQ29udGVudCA/IExvYWRBbGxXaXRoQ29udGVudFF1ZXJ5IDogTG9hZEFsbFF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBzb3J0Qnk6ICd1cGRhdGVEYXRlJyxcbiAgICAgICAgICAuLi5wYWdlLFxuICAgICAgICAgIHNvcnREaXJlY3Rpb246IChwYWdlLnNvcnREaXJlY3Rpb24gfHwgJ0RFU0MnKS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IGZpbHRlciAmJiBmaWx0ZXIuYXNQb2RPYmplY3QoKVxuICAgICAgfSxcbiAgICAgIGFycmF5RmllbGROYW1lOiAnZGF0YScsXG4gICAgICBlcnJvcjoge2NvZGU6IFNvY2lhbEVycm9yQ29kZXMuTE9BRF9VU0VSX0VWRU5UU19FUlJPUiwgbWVzc2FnZTogJ1NPQ0lBTC5FUlJPUi5MT0FEX1VTRVJfRVZFTlRTX0VSUk9SJ30sXG4gICAgICBmZXRjaFBvbGljeTogb3B0aW9ucyAmJiBvcHRpb25zLmZldGNoUG9saWN5IHx8IHVuZGVmaW5lZFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlcyAmJiAocmVzLmRhdGEgfHwgW10pLm1hcChVc2VyRXZlbnQuZnJvbU9iamVjdCk7XG5cbiAgICAgICAgICBpZiAobm93KSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1zZXJ2aWNlXSAke2RhdGEubGVuZ3RofSB1c2VyIGV2ZW50cyBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG4gICAgICAgICAgICBub3cgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHRvdGFsOiByZXMgJiYgdG9OdW1iZXIocmVzLnRvdGFsLCBkYXRhLmxlbmd0aClcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHNhdmVBbGwoZGF0YTogVXNlckV2ZW50W10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPFVzZXJFdmVudFtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGRhdGFcbiAgICAgIC5tYXAoZW50aXR5ID0+IHRoaXMuc2F2ZShlbnRpdHksIG9wdGlvbnMpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIHVzZXJFdmVudCBlbnRpdHlcbiAgICpcbiAgICogQHBhcmFtIGVudGl0eVxuICAgKi9cbiAgYXN5bmMgc2F2ZShlbnRpdHk6IFVzZXJFdmVudCwgb3B0aW9ucz86IEVudGl0eVNlcnZpY2VMb2FkT3B0aW9ucyk6IFByb21pc2U8VXNlckV2ZW50PiB7XG5cbiAgICB0aGlzLmZpbGxEZWZhdWx0UHJvcGVydGllcyhlbnRpdHkpO1xuXG4gICAgLy8gVHJhbnNmb3JtIGludG8ganNvblxuICAgIGNvbnN0IGlzTmV3ID0gaXNOaWwoZW50aXR5LmlkKTtcbiAgICBjb25zdCBqc29uID0gZW50aXR5LmFzT2JqZWN0KCk7XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtc2VydmljZV0gU2F2aW5nIHVzZXIgZXZlbnQuLi5gLCBqc29uKTtcblxuICAgIGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgbXV0YXRpb246IFNhdmVRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBkYXRhOiBqc29uXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHsgY29kZTogU29jaWFsRXJyb3JDb2Rlcy5TQVZFX1VTRVJfRVZFTlRfRVJST1IsIG1lc3NhZ2U6ICdTT0NJQUwuRVJST1IuU0FWRV9VU0VSX0VWRU5UX0VSUk9SJyB9LFxuICAgICAgdXBkYXRlOiAocHJveHksIHtkYXRhfSkgPT4ge1xuICAgICAgICAvLyBVcGRhdGUgZW50aXR5XG4gICAgICAgIGNvbnN0IHNhdmVkRW50aXR5ID0gZGF0YSAmJiBkYXRhLmRhdGE7XG4gICAgICAgIGlmIChzYXZlZEVudGl0eSkge1xuICAgICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtc2VydmljZV0gVXNlciBldmVudCBzYXZlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgLCBlbnRpdHkpO1xuICAgICAgICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShzYXZlZEVudGl0eSwgZW50aXR5KTtcblxuICAgICAgICAgIC8vIEFkZCB0byBjYWNoZVxuICAgICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbnRvTXV0YWJsZUNhY2hlZFF1ZXJpZXMocHJveHkse1xuICAgICAgICAgICAgICBxdWVyeTogTG9hZEFsbFF1ZXJ5LFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgLi4uc2F2ZWRFbnRpdHksXG4gICAgICAgICAgICAgICAgY29udGVudDogbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW50b011dGFibGVDYWNoZWRRdWVyaWVzKHByb3h5LHtcbiAgICAgICAgICAgICAgcXVlcnk6IExvYWRBbGxXaXRoQ29udGVudFF1ZXJ5LFxuICAgICAgICAgICAgICBkYXRhOiBzYXZlZEVudGl0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBTYXZlIG1hbnkgdHJpcHNcbiAgICpcbiAgICogQHBhcmFtIGVudGl0aWVzXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGwoZW50aXRpZXM6IFVzZXJFdmVudFtdLCBvcHRzPzoge1xuICAgIHRyYXNoPzogYm9vbGVhbjsgLy8gVHJ1ZSBieSBkZWZhdWx0XG4gIH0pOiBQcm9taXNlPGFueT4ge1xuXG4gICAgY29uc3QgaWRzID0gZW50aXRpZXMgJiYgZW50aXRpZXNcbiAgICAgIC5tYXAodCA9PiB0LmlkKTtcbiAgICBpZiAoaXNFbXB0eUFycmF5KGlkcykpIHJldHVybjsgLy8gc3RvcCwgaWYgbm90aGluZyBlbHNlIHRvIGRvXG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3VzZXItZXZlbnQtc2VydmljZV0gRGVsZXRpbmcgZXZlbnRzLi4uIGlkczonLCBpZHMpO1xuXG4gICAgYXdhaXQgdGhpcy5ncmFwaHFsLm11dGF0ZTxhbnk+KHtcbiAgICAgIG11dGF0aW9uOiBEZWxldGVCeUlkc011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkc1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogKHByb3h5KSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlc1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21NdXRhYmxlQ2FjaGVkUXVlcmllc0J5SWRzKHByb3h5LCB7XG4gICAgICAgICAgcXVlcnk6IExvYWRBbGxRdWVyeSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbU11dGFibGVDYWNoZWRRdWVyaWVzQnlJZHMocHJveHksIHtcbiAgICAgICAgICBxdWVyeTogTG9hZEFsbFdpdGhDb250ZW50UXVlcnksXG4gICAgICAgICAgaWRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtc2VydmljZV0gRXZlbnRzIGRlbGV0ZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHVzZXJFdmVudCBlbnRpdGllc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGRhdGE6IFVzZXJFdmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm47IC8vIHNraXBcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbChbZGF0YV0pO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcyhpZDogbnVtYmVyLCBvcHRpb25zPzogYW55KTogT2JzZXJ2YWJsZTxVc2VyRXZlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUT0RPXG4gICAgY29uc29sZS53YXJuKCdUT0RPOiBpbXBsZW1lbnQgbGlzdGVuIGNoYW5nZXMgb24gdXNlciBldmVudHMnKTtcbiAgICByZXR1cm4gb2YoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyQWN0aW9uKGRlZmluaXRpb246IFVzZXJFdmVudEFjdGlvbkRlZmluaXRpb24pIHtcbiAgICBjb25zb2xlLmluZm8oYFt1c2VyLWV2ZW50LXNlcnZpY2VdIFJlZ2lzdGVyaW5nIGFjdGlvbiAke2RlZmluaXRpb24ubmFtZX0gZm9yICR7ZGVmaW5pdGlvbi5fX3R5cGVuYW1lfWApO1xuICAgIHRoaXMuX3VzZXJFdmVudEFjdGlvbnMucHVzaChkZWZpbml0aW9uKTtcbiAgfVxuXG4gIGdldEFjdGlvbnNCeVR5cGVuYW1lKHR5cGVuYW1lOiBzdHJpbmcpOiBVc2VyRXZlbnRBY3Rpb248YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckV2ZW50QWN0aW9ucy5maWx0ZXIoZGVmID0+IGRlZi5fX3R5cGVuYW1lID09PSB0eXBlbmFtZSk7XG4gIH1cblxuICBhc3luYyBzaG93VG9hc3RFcnJvcldpdGhDb250ZXh0KG9wdHM6IHtcbiAgICBlcnJvcj86IGFueTtcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIGNvbnRleHQ6IGFueSB8ICgoKSA9PiBhbnkpIHwgUHJvbWlzZTxhbnk+O30pIHtcblxuICAgIGxldCBtZXNzYWdlID0gb3B0cy5tZXNzYWdlIHx8IChvcHRzLmVycm9yICYmIG9wdHMuZXJyb3IubWVzc2FnZSB8fCBvcHRzLmVycm9yKTtcblxuICAgIC8vIE1ha2Ugc3VyZSBtZXNzYWdlIGEgc3RyaW5nXG4gICAgaWYgKCFtZXNzYWdlIHx8IHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5VTktOT1dOX1RFQ0hOSUNBTF9FUlJPUic7XG4gICAgfVxuXG4gICAgLy8gSWYgb2ZmbGluZSwgZGlzcGxheSBhIHNpbXBsZSBhbGVydFxuICAgIGlmICh0aGlzLm5ldHdvcmsub2ZmbGluZSkge1xuICAgICAgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2UsIHR5cGU6ICdlcnJvcid9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIG1lc3NhZ2UgKHRvIGJlIGFibGUgdG8gZXh0cmFjdCBkZXRhaWxzIGNvbnRlbnQpXG4gICAgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQobWVzc2FnZSk7XG5cbiAgICAvLyBDbGVhbiBkZXRhaWxzIHBhcnRzXG4gICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5pbmRleE9mKCc8c21hbGw+JykgIT09IC0xKSB7XG4gICAgICBtZXNzYWdlID0gbWVzc2FnZS5zdWJzdHIoMCwgbWVzc2FnZS5pbmRleE9mKCc8c21hbGw+JykgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgZHVyYXRpb246IDE1MDAwLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSArICc8YnIvPjxici8+PGI+JyArIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTkZJUk0uU0VORF9ERUJVR19EQVRBJykgKyAnPC9iPicsXG4gICAgICBidXR0b25zOiBbe1xuICAgICAgICBpY29uOiAnYnVnJyxcbiAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ09NTU9OLkJUTl9TRU5EJyksXG4gICAgICAgIHJvbGU6ICdzZW5kJ1xuICAgICAgfV1cbiAgICB9KTtcbiAgICBpZiAoIXJlcyB8fCByZXMucm9sZSAhPT0gJ3NlbmQnKSByZXR1cm47XG5cbiAgICAvLyBTZW5kIGRlYnVnIGRhdGFcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdTZW5kaW5nIGRlYnVnIGRhdGEuLi4nKTtcblxuICAgICAgLy8gQ2FsbCBjb250ZW50IGZhY3RvcnlcbiAgICAgIGxldCBjb250ZXh0OiBhbnkgPSBvcHRzICYmIG9wdHMuY29udGV4dDtcbiAgICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dCgpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGNvbnRleHQgPSBhd2FpdCBjb250ZXh0O1xuICAgICAgfVxuXG4gICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlXG4gICAgICBjb25zdCB1c2VyRXZlbnQgPSBhd2FpdCB0aGlzLnNlbmREYXRhRm9yRGVidWcoe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBlcnJvcjogb3B0cy5lcnJvciB8fCB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuY29udmVydE9iamVjdFRvU3RyaW5nKGNvbnRleHQpXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5pbmZvKCdEZWJ1ZyBkYXRhIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFkbWluJywgdXNlckV2ZW50KTtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICBtZXNzYWdlOiAnSU5GTy5ERUJVR19EQVRBX1NFTkQnLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBzZW5kaW5nIGRlYnVnIGRhdGE6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBzZW5kRGF0YUZvckRlYnVnKGRhdGE6IGFueSk6IFByb21pc2U8VXNlckV2ZW50PiB7XG4gICAgY29uc3QgdXNlckV2ZW50ID0gbmV3IFVzZXJFdmVudCgpO1xuICAgIHVzZXJFdmVudC5ldmVudFR5cGUgPSBVc2VyRXZlbnRUeXBlcy5ERUJVR19EQVRBO1xuICAgIHVzZXJFdmVudC5jb250ZW50ID0gdGhpcy5jb252ZXJ0T2JqZWN0VG9TdHJpbmcoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZSh1c2VyRXZlbnQpO1xuICB9XG5cbiAgYXNGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPFVzZXJFdmVudEZpbHRlcj4pOiBVc2VyRXZlbnRGaWx0ZXIge1xuICAgIHJldHVybiBVc2VyRXZlbnRGaWx0ZXIuZnJvbU9iamVjdChmaWx0ZXIpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY29udmVydE9iamVjdFRvU3RyaW5nKGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyl7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLy8gU2VyaWFsaXplIGNvbnRlbnQgaW50byBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpe1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEuYXNPYmplY3Qoe2tlZXBUeXBlbmFtZTogdHJ1ZSwga2VlcExvY2FsSWQ6IHRydWUsIG1pbmlmeTogZmFsc2V9KSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93VG9hc3Q8VD1hbnk+KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpOiBQcm9taXNlPE92ZXJsYXlFdmVudERldGFpbDxUPj4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50XFwncyBjb25zdHJ1Y3RvcicpO1xuICAgIHJldHVybiBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpbGxEZWZhdWx0UHJvcGVydGllcyhlbnRpdHk6IFVzZXJFdmVudCkge1xuICAgIGVudGl0eS5pc3N1ZXIgPSB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQucHVia2V5O1xuXG4gICAgLy8gVE9ETzogY29tcHV0ZSBoYXNoICh1c2luZyBjcnlwdG9TZXJ2aWNlKVxuICAgIC8vIFRPRE86IGNvbXB1dGUgc2lnblxuICAgIGNvbnNvbGUud2FybignVE9ETzogc2lnbiB1c2VyIGV2ZW50IGJlZm9yZSBzZW5kaW5nJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29weUlkQW5kVXBkYXRlRGF0ZShzb3VyY2U6IFVzZXJFdmVudCwgdGFyZ2V0OiBVc2VyRXZlbnQpIHtcbiAgICBFbnRpdHlVdGlscy5jb3B5SWRBbmRVcGRhdGVEYXRlKHNvdXJjZSwgdGFyZ2V0KTtcbiAgfVxufVxuIl19
|