@sumaris-net/ngx-components 18.14.1 → 18.14.3
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/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +64 -121
- package/esm2022/src/app/social/feed/discourse/discourse-feed.service.mjs +10 -22
- package/fesm2022/sumaris-net.ngx-components.mjs +72 -139
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/rx-state/rx-state.decorators.d.ts +1 -17
- package/src/app/social/feed/discourse/discourse-feed.service.d.ts +2 -2
|
@@ -14,22 +14,16 @@ class DecoratorUtils {
|
|
|
14
14
|
static createPropertyName(prefix, propertyKey) {
|
|
15
15
|
return `${prefix}${this.capitalize(propertyKey)}`;
|
|
16
16
|
}
|
|
17
|
-
static validateStateProperty(target,
|
|
18
|
-
if (!production &&
|
|
19
|
-
|
|
20
|
-
if (!${stateVarName}) {
|
|
21
|
-
throw new Error('Missing state! Please add a RxState in class: ' + this.constructor.name);
|
|
17
|
+
static validateStateProperty(target, stateObject) {
|
|
18
|
+
if (!production && !stateObject) {
|
|
19
|
+
throw new Error(`Missing state! Please add a RxState in class: ${target.constructor.name}`);
|
|
22
20
|
}
|
|
23
|
-
`;
|
|
24
|
-
}
|
|
25
|
-
return '';
|
|
26
21
|
}
|
|
27
22
|
}
|
|
28
23
|
const STATE_VAR_NAME_KEY = '__stateName';
|
|
29
24
|
const DEFAULT_STATE_VAR_NAME = '_state';
|
|
30
25
|
/**
|
|
31
26
|
* Decorator to register the RxState property in a component
|
|
32
|
-
* Must be used once per class hierarchy
|
|
33
27
|
*/
|
|
34
28
|
export function RxStateRegister() {
|
|
35
29
|
return function (target, key) {
|
|
@@ -46,49 +40,36 @@ export function RxStateRegister() {
|
|
|
46
40
|
}
|
|
47
41
|
/**
|
|
48
42
|
* Decorator for RxState properties with getter/setter access
|
|
49
|
-
* Creates reactive properties that sync with RxState
|
|
50
43
|
*/
|
|
51
44
|
export function RxStateProperty(statePropertyName, projectValueReducer) {
|
|
52
45
|
return function (target, key) {
|
|
53
|
-
// Vérification de type au runtime (optionnelle)
|
|
54
|
-
const descriptor = Object.getOwnPropertyDescriptor(target, key);
|
|
55
|
-
if (descriptor && typeof descriptor.value !== 'undefined') {
|
|
56
|
-
// On peut ajouter ici des vérifications de type runtime si nécessaire
|
|
57
|
-
}
|
|
58
46
|
const finalStatePropertyName = statePropertyName || key;
|
|
59
47
|
const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || DEFAULT_STATE_VAR_NAME;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
const setMethodName = DecoratorUtils.createMethodName('_set', key);
|
|
64
|
-
const reducerMethodName = DecoratorUtils.createMethodName('_reduce', key);
|
|
65
|
-
// State validation (only in development)
|
|
66
|
-
const stateValidation = DecoratorUtils.validateStateProperty(target, stateObject);
|
|
67
|
-
// Create reducer logic
|
|
68
|
-
const reducerLogic = projectValueReducer ? `(state) => this.${reducerMethodName}(state, value)` : '() => value';
|
|
69
|
-
// Create dynamic methods using Function constructor for better performance
|
|
70
|
-
const getter = new Function(`
|
|
71
|
-
return function ${getMethodName}() {
|
|
72
|
-
${stateValidation}
|
|
73
|
-
return ${stateObject}.get('${finalStatePropertyName}');
|
|
74
|
-
}
|
|
75
|
-
`)();
|
|
76
|
-
const setter = new Function(`
|
|
77
|
-
return function ${setMethodName}(value) {
|
|
78
|
-
${stateValidation}
|
|
79
|
-
${stateObject}.set('${finalStatePropertyName}', ${reducerLogic});
|
|
80
|
-
}
|
|
81
|
-
`)();
|
|
82
|
-
// Attach methods to prototype
|
|
83
|
-
target[getMethodName] = getter;
|
|
84
|
-
target[setMethodName] = setter;
|
|
85
|
-
if (projectValueReducer) {
|
|
86
|
-
target[reducerMethodName] = projectValueReducer;
|
|
87
|
-
}
|
|
48
|
+
// Create unique property names to avoid conflicts
|
|
49
|
+
const privateValueKey = `__${key}_value`;
|
|
50
|
+
const privateInitializedKey = `__${key}_initialized`;
|
|
88
51
|
// Define property with getter/setter
|
|
89
52
|
Object.defineProperty(target, key, {
|
|
90
|
-
get:
|
|
91
|
-
|
|
53
|
+
get: function () {
|
|
54
|
+
const stateObject = stateVarName ? this[stateVarName] : this;
|
|
55
|
+
DecoratorUtils.validateStateProperty(target, stateObject);
|
|
56
|
+
if (!this[privateInitializedKey]) {
|
|
57
|
+
this[privateValueKey] = stateObject.get(finalStatePropertyName);
|
|
58
|
+
this[privateInitializedKey] = true;
|
|
59
|
+
}
|
|
60
|
+
return this[privateValueKey];
|
|
61
|
+
},
|
|
62
|
+
set: function (value) {
|
|
63
|
+
const stateObject = stateVarName ? this[stateVarName] : this;
|
|
64
|
+
DecoratorUtils.validateStateProperty(target, stateObject);
|
|
65
|
+
this[privateValueKey] = value;
|
|
66
|
+
if (projectValueReducer) {
|
|
67
|
+
stateObject.set(finalStatePropertyName, (state) => projectValueReducer(state, value));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
stateObject.set(finalStatePropertyName, () => value);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
92
73
|
enumerable: true,
|
|
93
74
|
configurable: true,
|
|
94
75
|
});
|
|
@@ -100,118 +81,80 @@ export function RxStateProperty(statePropertyName, projectValueReducer) {
|
|
|
100
81
|
}
|
|
101
82
|
/**
|
|
102
83
|
* Decorator for RxState observable selectors
|
|
103
|
-
* Creates observable properties that select from RxState
|
|
104
|
-
*
|
|
105
|
-
* ⚠️ IMPORTANT: La propriété décorée DOIT être typée comme Observable<T>
|
|
106
|
-
*
|
|
107
|
-
* @example
|
|
108
|
-
* ```typescript
|
|
109
|
-
* @RxStateSelect()
|
|
110
|
-
* protected pmfms$: Observable<IPmfm[]>; // ✅ Correct
|
|
111
|
-
*
|
|
112
|
-
* @RxStateSelect()
|
|
113
|
-
* protected badProperty: boolean; // ❌ TypeScript Error
|
|
114
|
-
* ```
|
|
115
84
|
*/
|
|
116
85
|
export function RxStateSelect(statePropertyName, opts) {
|
|
117
86
|
return function (target, key) {
|
|
118
|
-
//
|
|
87
|
+
// Convention check
|
|
119
88
|
if (!production && !key.endsWith('$')) {
|
|
120
89
|
console.warn(`[RxStateSelect] Convention: Property ${target.constructor?.name}.${key} should end with '$' to indicate it's an Observable`);
|
|
121
90
|
}
|
|
122
|
-
// Determine state property name
|
|
91
|
+
// Determine state property name
|
|
123
92
|
const finalStatePropertyName = statePropertyName || key.replace(/\$$/, '');
|
|
124
93
|
// Determine state object
|
|
125
94
|
const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || opts?.stateName || DEFAULT_STATE_VAR_NAME;
|
|
126
|
-
const stateObject = stateVarName ? `this.${stateVarName}` : 'this';
|
|
127
95
|
// Create cache property name
|
|
128
|
-
const cachePropertyName = `
|
|
129
|
-
// Generate method name
|
|
130
|
-
const getMethodName = DecoratorUtils.createMethodName('_get', key.replace(/\$$/, '') + '$');
|
|
131
|
-
// Create observable selector logic
|
|
132
|
-
const observableSelector = finalStatePropertyName === '$'
|
|
133
|
-
? `${stateObject}.$`
|
|
134
|
-
: finalStatePropertyName.includes('.')
|
|
135
|
-
? `${stateObject}.select('${finalStatePropertyName.split('.').join("', '")}')`
|
|
136
|
-
: `${stateObject}.select('${finalStatePropertyName}')`;
|
|
137
|
-
// State validation
|
|
138
|
-
const stateValidation = DecoratorUtils.validateStateProperty(target, stateObject);
|
|
139
|
-
// Create getter with caching
|
|
140
|
-
const getter = new Function(`
|
|
141
|
-
return function ${getMethodName}() {
|
|
142
|
-
${stateValidation}
|
|
143
|
-
if (!this.${cachePropertyName}) {
|
|
144
|
-
this.${cachePropertyName} = ${observableSelector};
|
|
145
|
-
}
|
|
146
|
-
return this.${cachePropertyName};
|
|
147
|
-
}
|
|
148
|
-
`)();
|
|
149
|
-
// Attach method to prototype
|
|
150
|
-
target[getMethodName] = getter;
|
|
96
|
+
const cachePropertyName = `__${key}_cache`;
|
|
151
97
|
// Define property with getter only
|
|
152
98
|
Object.defineProperty(target, key, {
|
|
153
|
-
get:
|
|
99
|
+
get: function () {
|
|
100
|
+
const stateObject = stateVarName ? this[stateVarName] : this;
|
|
101
|
+
DecoratorUtils.validateStateProperty(target, stateObject);
|
|
102
|
+
if (!this[cachePropertyName]) {
|
|
103
|
+
if (finalStatePropertyName === '$') {
|
|
104
|
+
this[cachePropertyName] = stateObject.$;
|
|
105
|
+
}
|
|
106
|
+
else if (finalStatePropertyName.includes('.')) {
|
|
107
|
+
const path = finalStatePropertyName.split('.');
|
|
108
|
+
this[cachePropertyName] = stateObject.select(...path);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this[cachePropertyName] = stateObject.select(finalStatePropertyName);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return this[cachePropertyName];
|
|
115
|
+
},
|
|
154
116
|
enumerable: true,
|
|
155
117
|
configurable: false,
|
|
156
118
|
});
|
|
157
119
|
// Development logging
|
|
158
120
|
if (!production) {
|
|
159
|
-
console.debug(`[RxStateSelect] ${target.constructor?.name}.${key} -> ${
|
|
121
|
+
console.debug(`[RxStateSelect] ${target.constructor?.name}.${key} -> state.select('${finalStatePropertyName}')`);
|
|
160
122
|
}
|
|
161
123
|
};
|
|
162
124
|
}
|
|
163
125
|
/**
|
|
164
126
|
* Utility decorator to create computed observables from state
|
|
165
|
-
*
|
|
166
|
-
* ⚠️ IMPORTANT: La propriété décorée DOIT être typée comme Observable<T>
|
|
167
127
|
*/
|
|
168
128
|
export function RxStateComputed(dependencies, computeFn, opts) {
|
|
169
129
|
return function (target, key) {
|
|
170
|
-
//
|
|
130
|
+
// Convention check
|
|
171
131
|
if (!production && !key.endsWith('$')) {
|
|
172
132
|
console.warn(`[RxStateComputed] Convention: Property ${target.constructor?.name}.${key} should end with '$' to indicate it's an Observable`);
|
|
173
133
|
}
|
|
174
134
|
const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || opts?.stateName || DEFAULT_STATE_VAR_NAME;
|
|
175
|
-
const
|
|
176
|
-
const cachePropertyName = `_${key}`;
|
|
177
|
-
const getMethodName = DecoratorUtils.createMethodName('_get', key.replace(/\$$/, '') + '$');
|
|
178
|
-
const computeMethodName = DecoratorUtils.createMethodName('_compute', key);
|
|
179
|
-
const keyCompareMapPropertyName = DecoratorUtils.createPropertyName(`_compareMap`, key);
|
|
180
|
-
// State validation
|
|
181
|
-
const stateValidation = DecoratorUtils.validateStateProperty(target, stateObject);
|
|
182
|
-
// Create dependencies array as string for code generation
|
|
183
|
-
const dependenciesStr = dependencies.map((dep) => `'${dep}'`).join(', ');
|
|
184
|
-
// Create the compute method as string, for code generation
|
|
185
|
-
const computeMethodNameStr = computeFn ? `, (slice) => this.${computeMethodName}(slice)` : '';
|
|
186
|
-
// Create the comparator map function as string, for code generation
|
|
187
|
-
const keyCompareMapStr = opts?.keyCompareMap ? `, this.${keyCompareMapPropertyName}` : '';
|
|
188
|
-
// Create getter with caching using RxState's native multi-select + pipe(map())
|
|
189
|
-
const getter = new Function(`
|
|
190
|
-
return function ${getMethodName}() {
|
|
191
|
-
${stateValidation}
|
|
192
|
-
if (!this.${cachePropertyName}) {
|
|
193
|
-
const { map } = require('rxjs/operators');
|
|
194
|
-
this.${cachePropertyName} = ${stateObject}.select([${dependenciesStr}]${computeMethodNameStr}${keyCompareMapStr});
|
|
195
|
-
}
|
|
196
|
-
return this.${cachePropertyName};
|
|
197
|
-
}
|
|
198
|
-
`)();
|
|
199
|
-
// Attach compute method, optional keyCompareMap with unique name, and getter to prototype
|
|
200
|
-
if (computeFn)
|
|
201
|
-
target[computeMethodName] = computeFn;
|
|
202
|
-
if (opts?.keyCompareMap)
|
|
203
|
-
target[keyCompareMapPropertyName] = opts.keyCompareMap;
|
|
204
|
-
target[getMethodName] = getter;
|
|
135
|
+
const cachePropertyName = `__${key}_cache`;
|
|
205
136
|
// Define property with getter only
|
|
206
137
|
Object.defineProperty(target, key, {
|
|
207
|
-
get:
|
|
138
|
+
get: function () {
|
|
139
|
+
const stateObject = stateVarName ? this[stateVarName] : this;
|
|
140
|
+
DecoratorUtils.validateStateProperty(target, stateObject);
|
|
141
|
+
if (!this[cachePropertyName]) {
|
|
142
|
+
let observable = stateObject.select(dependencies, opts?.keyCompareMap);
|
|
143
|
+
if (computeFn) {
|
|
144
|
+
const { map } = require('rxjs/operators');
|
|
145
|
+
observable = observable.pipe(map(computeFn));
|
|
146
|
+
}
|
|
147
|
+
this[cachePropertyName] = observable;
|
|
148
|
+
}
|
|
149
|
+
return this[cachePropertyName];
|
|
150
|
+
},
|
|
208
151
|
enumerable: true,
|
|
209
152
|
configurable: false,
|
|
210
153
|
});
|
|
211
154
|
// Development logging
|
|
212
155
|
if (!production) {
|
|
213
|
-
console.debug(`[RxStateComputed] ${target.constructor?.name}.${key} ->
|
|
156
|
+
console.debug(`[RxStateComputed] ${target.constructor?.name}.${key} -> state.select([${dependencies.map((d) => `'${d}'`).join(', ')}])`);
|
|
214
157
|
}
|
|
215
158
|
};
|
|
216
159
|
}
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtc3RhdGUuZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3J4LXN0YXRlL3J4LXN0YXRlLmRlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF1QixPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDdkIsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLENBQUM7QUFRRCx5QkFBeUI7QUFDekIsTUFBTSxjQUFjO0lBQ2xCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBVztRQUMzQixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtRQUN6RCxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtRQUMzRCxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQVcsRUFBRSxZQUFvQjtRQUM1RCxJQUFJLENBQUMsVUFBVSxJQUFJLFlBQVksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMzQyxPQUFPO2VBQ0UsWUFBWTs7O09BR3BCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0NBQ0Y7QUFFRCxNQUFNLGtCQUFrQixHQUFHLGFB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c0I7UUFDdEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQ1gscUJBQXFCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEdBQWEsT0FBTyxXQUFXLFlBQVksZUFBZSx5QkFBeUIsQ0FDckksQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUHJvamVjdFZhbHVlUmVkdWNlciwgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcblxubGV0IHByb2R1Y3Rpb24gPSBmYWxzZTtcbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVSeFN0YXRlUHJvZE1vZGUoKSB7XG4gIHByb2R1Y3Rpb24gPSB0cnVlO1xufVxuXG5kZWNsYXJlIHR5cGUgQ29uc3RydWN0b3I8VCA9IGFueT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG50eXBlIE9ic2VydmFibGVQcm9wZXJ0eURlY29yYXRvcjxUPiA9IDxLIGV4dGVuZHMgUHJvcGVydHlLZXk+KHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogSykgPT4gdm9pZDtcblxudHlwZSBTdGF0ZVByb3BlcnR5RGVjb3JhdG9yPFQ+ID0gPEsgZXh0ZW5kcyBQcm9wZXJ0eUtleT4odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBLKSA9PiB2b2lkO1xuXG4vLyBVdGlsaXR5IGZvciBkZWNvcmF0b3JzXG5jbGFzcyBEZWNvcmF0b3JVdGlscyB7XG4gIHN0YXRpYyBjYXBpdGFsaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1ldGhvZE5hbWUocHJlZml4OiBzdHJpbmcsIHByb3BlcnR5S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHt0aGlzLmNhcGl0YWxpemUocHJvcGVydHlLZXkpfWA7XG4gIH1cbiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5TmFtZShwcmVmaXg6IHN0cmluZywgcHJvcGVydHlLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3RoaXMuY2FwaXRhbGl6ZShwcm9wZXJ0eUtleSl9YDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0OiBhbnksIHN0YXRlVmFyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXByb2R1Y3Rpb24gJiYgc3RhdGVWYXJOYW1lICE9PSAndGhpcycpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIGlmICghJHtzdGF0ZVZhck5hbWV9KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHN0YXRlISBQbGVhc2UgYWRkIGEgUnhTdGF0ZSBpbiBjbGFzczogJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5jb25zdCBTVEFURV9WQVJfTkFNRV9LRVkgPSAnX19zdGF0ZU5hbWUnO1xuY29uc3QgREVGQVVMVF9TVEFURV9WQVJfTkFNRSA9ICdfc3RhdGUnO1xuXG4vKipcbiAqIERlY29yYXRvciB0byByZWdpc3RlciB0aGUgUnhTdGF0ZSBwcm9wZXJ0eSBpbiBhIGNvbXBvbmVudFxuICogTXVzdCBiZSB1c2VkIG9uY2UgcGVyIGNsYXNzIGhpZXJhcmNoeVxuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZVJlZ2lzdGVyKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4sIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRhcmdldFtTVEFURV9WQVJfTkFNRV9LRVldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBAUnhTdGF0ZVJlZ2lzdGVyKCkgaW4gY2xhc3MgaGllcmFyY2h5LiBGb3VuZDogJHt0YXJnZXRbU1RBVEVfVkFSX05BTUVfS0VZXX0gYW5kICR7a2V5fWApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIFNUQVRFX1ZBUl9OQU1FX0tFWSwge1xuICAgICAgdmFsdWU6IGtleSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIFJ4U3RhdGUgcHJvcGVydGllcyB3aXRoIGdldHRlci9zZXR0ZXIgYWNjZXNzXG4gKiBDcmVhdGVzIHJlYWN0aXZlIHByb3BlcnRpZXMgdGhhdCBzeW5jIHdpdGggUnhTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZVByb3BlcnR5PFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55LCBWIGV4dGVuZHMgVFtLXSA9IGFueT4oXG4gIHN0YXRlUHJvcGVydHlOYW1lPzogc3RyaW5nIHwgSyxcbiAgcHJvamVjdFZhbHVlUmVkdWNlcj86IFByb2plY3RWYWx1ZVJlZHVjZXI8VCwgSywgVj5cbik6IFN0YXRlUHJvcGVydHlEZWNvcmF0b3I8Vj4ge1xuICByZXR1cm4gZnVuY3Rpb24gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4odGFyZ2V0OiBhbnksIGtleTogUCkge1xuICAgIC8vIFbDqXJpZmljYXRpb24gZGUgdHlwZSBhdSBydW50aW1lIChvcHRpb25uZWxsZSlcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBPbiBwZXV0IGFqb3V0ZXIgaWNpIGRlcyB2w6lyaWZpY2F0aW9ucyBkZSB0eXBlIHJ1bnRpbWUgc2kgbsOpY2Vzc2FpcmVcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFN0YXRlUHJvcGVydHlOYW1lID0gKHN0YXRlUHJvcGVydHlOYW1lIGFzIHN0cmluZykgfHwgKGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IHN0YXRlVmFyTmFtZSA9IHRhcmdldCBpbnN0YW5jZW9mIFJ4U3RhdGUgPyBudWxsIDogdGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV0gfHwgREVGQVVMVF9TVEFURV9WQVJfTkFNRTtcbiAgICBjb25zdCBzdGF0ZU9iamVjdCA9IHN0YXRlVmFyTmFtZSA/IGB0aGlzLiR7c3RhdGVWYXJOYW1lfWAgOiAndGhpcyc7XG5cbiAgICAvLyBHZW5lcmF0ZSBtZXRob2QgbmFtZXNcbiAgICBjb25zdCBnZXRNZXRob2ROYW1lID0gRGVjb3JhdG9yVXRpbHMuY3JlYXRlTWV0aG9kTmFtZSgnX2dldCcsIGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IHNldE1ldGhvZE5hbWUgPSBEZWNvcmF0b3JVdGlscy5jcmVhdGVNZXRob2ROYW1lKCdfc2V0Jywga2V5IGFzIHN0cmluZyk7XG4gICAgY29uc3QgcmVkdWNlck1ldGhvZE5hbWUgPSBEZWNvcmF0b3JVdGlscy5jcmVhdGVNZXRob2ROYW1lKCdfcmVkdWNlJywga2V5IGFzIHN0cmluZyk7XG5cbiAgICAvLyBTdGF0ZSB2YWxpZGF0aW9uIChvbmx5IGluIGRldmVsb3BtZW50KVxuICAgIGNvbnN0IHN0YXRlVmFsaWRhdGlvbiA9IERlY29yYXRvclV0aWxzLnZhbGlkYXRlU3RhdGVQcm9wZXJ0eSh0YXJnZXQsIHN0YXRlT2JqZWN0KTtcblxuICAgIC8vIENyZWF0ZSByZWR1Y2VyIGxvZ2ljXG4gICAgY29uc3QgcmVkdWNlckxvZ2ljID0gcHJvamVjdFZhbHVlUmVkdWNlciA/IGAoc3RhdGUpID0+IHRoaXMuJHtyZWR1Y2VyTWV0aG9kTmFtZX0oc3RhdGUsIHZhbHVlKWAgOiAnKCkgPT4gdmFsdWUnO1xuXG4gICAgLy8gQ3JlYXRlIGR5bmFtaWMgbWV0aG9kcyB1c2luZyBGdW5jdGlvbiBjb25zdHJ1Y3RvciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgY29uc3QgZ2V0dGVyID0gbmV3IEZ1bmN0aW9uKGBcbiAgICAgIHJldHVybiBmdW5jdGlvbiAke2dldE1ldGhvZE5hbWV9KCkge1xuICAgICAgICAke3N0YXRlVmFsaWRhdGlvbn1cbiAgICAgICAgcmV0dXJuICR7c3RhdGVPYmplY3R9LmdldCgnJHtmaW5hbFN0YXRlUHJvcGVydHlOYW1lfScpO1xuICAgICAgfVxuICAgIGApKCk7XG5cbiAgICBjb25zdCBzZXR0ZXIgPSBuZXcgRnVuY3Rpb24oYFxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICR7c2V0TWV0aG9kTmFtZX0odmFsdWUpIHtcbiAgICAgICAgJHtzdGF0ZVZhbGlkYXRpb259XG4gICAgICAgICR7c3RhdGVPYmplY3R9LnNldCgnJHtmaW5hbFN0YXRlUHJvcGVydHlOYW1lfScsICR7cmVkdWNlckxvZ2ljfSk7XG4gICAgICB9XG4gICAgYCkoKTtcblxuICAgIC8vIEF0dGFjaCBtZXRob2RzIHRvIHByb3RvdHlwZVxuICAgIHRhcmdldFtnZXRNZXRob2ROYW1lXSA9IGdldHRlcjtcbiAgICB0YXJnZXRbc2V0TWV0aG9kTmFtZV0gPSBzZXR0ZXI7XG4gICAgaWYgKHByb2plY3RWYWx1ZVJlZHVjZXIpIHtcbiAgICAgIHRhcmdldFtyZWR1Y2VyTWV0aG9kTmFtZV0gPSBwcm9qZWN0VmFsdWVSZWR1Y2VyO1xuICAgIH1cblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlci9zZXR0ZXJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGdldDogZ2V0dGVyLFxuICAgICAgc2V0OiBzZXR0ZXIsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gRGV2ZWxvcG1lbnQgbG9nZ2luZ1xuICAgIGlmICghcHJvZHVjdGlvbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW1J4U3RhdGVQcm9wZXJ0eV0gJHt0YXJnZXQuY29uc3RydWN0b3I/Lm5hbWV9LiR7a2V5IGFzIHN0cmluZ30gLT4gc3RhdGUuJHtmaW5hbFN0YXRlUHJvcGVydHlOYW1lfWApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIFJ4U3RhdGUgb2JzZXJ2YWJsZSBzZWxlY3RvcnNcbiAqIENyZWF0ZXMgb2JzZXJ2YWJsZSBwcm9wZXJ0aWVzIHRoYXQgc2VsZWN0IGZyb20gUnhTdGF0ZVxuICpcbiAqIOKaoO+4jyBJTVBPUlRBTlQ6IExhIHByb3ByacOpdMOpIGTDqWNvcsOpZSBET0lUIMOqdHJlIHR5cMOpZSBjb21tZSBPYnNlcnZhYmxlPFQ+XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBSeFN0YXRlU2VsZWN0KClcbiAqIHByb3RlY3RlZCBwbWZtcyQ6IE9ic2VydmFibGU8SVBtZm1bXT47IC8vIOKchSBDb3JyZWN0XG4gKlxuICogQFJ4U3RhdGVTZWxlY3QoKVxuICogcHJvdGVjdGVkIGJhZFByb3BlcnR5OiBib29sZWFuOyAvLyDinYwgVHlwZVNjcmlwdCBFcnJvclxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSeFN0YXRlU2VsZWN0PFQgPSBhbnksIFIgPSBUW2tleW9mIFRdPihcbiAgc3RhdGVQcm9wZXJ0eU5hbWU/OiBzdHJpbmcgfCBrZXlvZiBUIHwgJyQnLFxuICBvcHRzPzoge1xuICAgIHN0YXRlTmFtZT86IHN0cmluZztcbiAgfVxuKTogT2JzZXJ2YWJsZVByb3BlcnR5RGVjb3JhdG9yPE9ic2VydmFibGU8Uj4+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxQIGV4dGVuZHMgUHJvcGVydHlLZXk+KHRhcmdldDogYW55LCBrZXk6IFApIHtcbiAgICAvLyBWw6lyaWZpY2F0aW9uIHNpbXBsZSBiYXPDqWUgc3VyIGxhIGNvbnZlbnRpb24gKG9wdGlvbm5lbGxlKVxuICAgIGlmICghcHJvZHVjdGlvbiAmJiAhKGtleSBhcyBzdHJpbmcpLmVuZHNXaXRoKCckJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtSeFN0YXRlU2VsZWN0XSBDb252ZW50aW9uOiBQcm9wZXJ0eSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSBzaG91bGQgZW5kIHdpdGggJyQnIHRvIGluZGljYXRlIGl0J3MgYW4gT2JzZXJ2YWJsZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHN0YXRlIHByb3BlcnR5IG5hbWUgKHJlbW92ZSB0cmFpbGluZyAkIGlmIHByZXNlbnQpXG4gICAgY29uc3QgZmluYWxTdGF0ZVByb3BlcnR5TmFtZSA9IChzdGF0ZVByb3BlcnR5TmFtZSBhcyBzdHJpbmcpIHx8IChrZXkgYXMgc3RyaW5nKS5yZXBsYWNlKC9cXCQkLywgJycpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHN0YXRlIG9iamVjdFxuICAgIGNvbnN0IHN0YXRlVmFyTmFtZSA9IHRhcmdldCBpbnN0YW5jZW9mIFJ4U3RhdGUgPyBudWxsIDogdGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV0gfHwgb3B0cz8uc3RhdGVOYW1lIHx8IERFRkFVTFRfU1RBVEVfVkFSX05BTUU7XG4gICAgY29uc3Qgc3RhdGVPYmplY3QgPSBzdGF0ZVZhck5hbWUgPyBgdGhpcy4ke3N0YXRlVmFyTmFtZX1gIDogJ3RoaXMnO1xuXG4gICAgLy8gQ3JlYXRlIGNhY2hlIHByb3BlcnR5IG5hbWVcbiAgICBjb25zdCBjYWNoZVByb3BlcnR5TmFtZSA9IGBfJHtrZXkgYXMgc3RyaW5nfWA7XG5cbiAgICAvLyBHZW5lcmF0ZSBtZXRob2QgbmFtZVxuICAgIGNvbnN0IGdldE1ldGhvZE5hbWUgPSBEZWNvcmF0b3JVdGlscy5jcmVhdGVNZXRob2ROYW1lKCdfZ2V0JywgKGtleSBhcyBzdHJpbmcpLnJlcGxhY2UoL1xcJCQvLCAnJykgKyAnJCcpO1xuXG4gICAgLy8gQ3JlYXRlIG9ic2VydmFibGUgc2VsZWN0b3IgbG9naWNcbiAgICBjb25zdCBvYnNlcnZhYmxlU2VsZWN0b3IgPVxuICAgICAgZmluYWxTdGF0ZVByb3BlcnR5TmFtZSA9PT0gJyQnXG4gICAgICAgID8gYCR7c3RhdGVPYmplY3R9LiRgXG4gICAgICAgIDogZmluYWxTdGF0ZVByb3BlcnR5TmFtZS5pbmNsdWRlcygnLicpXG4gICAgICAgICAgPyBgJHtzdGF0ZU9iamVjdH0uc2VsZWN0KCcke2ZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUuc3BsaXQoJy4nKS5qb2luKFwiJywgJ1wiKX0nKWBcbiAgICAgICAgICA6IGAke3N0YXRlT2JqZWN0fS5zZWxlY3QoJyR7ZmluYWxTdGF0ZVByb3BlcnR5TmFtZX0nKWA7XG5cbiAgICAvLyBTdGF0ZSB2YWxpZGF0aW9uXG4gICAgY29uc3Qgc3RhdGVWYWxpZGF0aW9uID0gRGVjb3JhdG9yVXRpbHMudmFsaWRhdGVTdGF0ZVByb3BlcnR5KHRhcmdldCwgc3RhdGVPYmplY3QpO1xuXG4gICAgLy8gQ3JlYXRlIGdldHRlciB3aXRoIGNhY2hpbmdcbiAgICBjb25zdCBnZXR0ZXIgPSBuZXcgRnVuY3Rpb24oYFxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICR7Z2V0TWV0aG9kTmFtZX0oKSB7XG4gICAgICAgICR7c3RhdGVWYWxpZGF0aW9ufVxuICAgICAgICBpZiAoIXRoaXMuJHtjYWNoZVByb3BlcnR5TmFtZX0pIHtcbiAgICAgICAgICB0aGlzLiR7Y2FjaGVQcm9wZXJ0eU5hbWV9ID0gJHtvYnNlcnZhYmxlU2VsZWN0b3J9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiR7Y2FjaGVQcm9wZXJ0eU5hbWV9O1xuICAgICAgfVxuICAgIGApKCk7XG5cbiAgICAvLyBBdHRhY2ggbWV0aG9kIHRvIHByb3RvdHlwZVxuICAgIHRhcmdldFtnZXRNZXRob2ROYW1lXSA9IGdldHRlcjtcblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlciBvbmx5XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBnZXQ6IGdldHRlcixcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gRGV2ZWxvcG1lbnQgbG9nZ2luZ1xuICAgIGlmICghcHJvZHVjdGlvbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW1J4U3RhdGVTZWxlY3RdICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IC0+ICR7b2JzZXJ2YWJsZVNlbGVjdG9yfWApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGRlY29yYXRvciB0byBjcmVhdGUgY29tcHV0ZWQgb2JzZXJ2YWJsZXMgZnJvbSBzdGF0ZVxuICpcbiAqIOKaoO+4jyBJTVBPUlRBTlQ6IExhIHByb3ByacOpdMOpIGTDqWNvcsOpZSBET0lUIMOqdHJlIHR5cMOpZSBjb21tZSBPYnNlcnZhYmxlPFQ+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSeFN0YXRlQ29tcHV0ZWQ8VCA9IGFueSwgSyBleHRlbmRzIGtleW9mIFQgPSBhbnksIFIgPSBhbnk+KFxuICBkZXBlbmRlbmNpZXM6IEtbXSxcbiAgY29tcHV0ZUZuPzogKHNsaWNlOiBQaWNrPFQsIEs+KSA9PiBSLFxuICBvcHRzPzoge1xuICAgIHN0YXRlTmFtZT86IHN0cmluZztcbiAgICBrZXlDb21wYXJlTWFwPzogYW55O1xuICB9XG4pOiBPYnNlcnZhYmxlUHJvcGVydHlEZWNvcmF0b3I8T2JzZXJ2YWJsZTxSPj4ge1xuICByZXR1cm4gZnVuY3Rpb24gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4odGFyZ2V0OiBhbnksIGtleTogUCkge1xuICAgIC8vIFbDqXJpZmljYXRpb24gc2ltcGxlIGJhc8OpZSBzdXIgbGEgY29udmVudGlvbiAob3B0aW9ubmVsbGUpXG4gICAgaWYgKCFwcm9kdWN0aW9uICYmICEoa2V5IGFzIHN0cmluZykuZW5kc1dpdGgoJyQnKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1J4U3RhdGVDb21wdXRlZF0gQ29udmVudGlvbjogUHJvcGVydHkgJHt0YXJnZXQuY29uc3RydWN0b3I/Lm5hbWV9LiR7a2V5IGFzIHN0cmluZ30gc2hvdWxkIGVuZCB3aXRoICckJyB0byBpbmRpY2F0ZSBpdCdzIGFuIE9ic2VydmFibGVgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZVZhck5hbWUgPSB0YXJnZXQgaW5zdGFuY2VvZiBSeFN0YXRlID8gbnVsbCA6IHRhcmdldFtTVEFURV9WQVJfTkFNRV9LRVldIHx8IG9wdHM/LnN0YXRlTmFtZSB8fCBERUZBVUxUX1NUQVRFX1ZBUl9OQU1FO1xuICAgIGNvbnN0IHN0YXRlT2JqZWN0ID0gc3RhdGVWYXJOYW1lID8gYHRoaXMuJHtzdGF0ZVZhck5hbWV9YCA6ICd0aGlzJztcblxuICAgIGNvbnN0IGNhY2hlUHJvcGVydHlOYW1lID0gYF8ke2tleSBhcyBzdHJpbmd9YDtcbiAgICBjb25zdCBnZXRNZXRob2ROYW1lID0gRGVjb3JhdG9yVXRpbHMuY3JlYXRlTWV0aG9kTmFtZSgnX2dldCcsIChrZXkgYXMgc3RyaW5nKS5yZXBsYWNlKC9cXCQkLywgJycpICsgJyQnKTtcbiAgICBjb25zdCBjb21wdXRlTWV0aG9kTmFtZSA9IERlY29yYXRvclV0aWxzLmNyZWF0ZU1ldGhvZE5hbWUoJ19jb21wdXRlJywga2V5IGFzIHN0cmluZyk7XG4gICAgY29uc3Qga2V5Q29tcGFyZU1hcFByb3BlcnR5TmFtZSA9IERlY29yYXRvclV0aWxzLmNyZWF0ZVByb3BlcnR5TmFtZShgX2NvbXBhcmVNYXBgLCBrZXkgYXMgc3RyaW5nKTtcblxuICAgIC8vIFN0YXRlIHZhbGlkYXRpb25cbiAgICBjb25zdCBzdGF0ZVZhbGlkYXRpb24gPSBEZWNvcmF0b3JVdGlscy52YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0LCBzdGF0ZU9iamVjdCk7XG5cbiAgICAvLyBDcmVhdGUgZGVwZW5kZW5jaWVzIGFycmF5IGFzIHN0cmluZyBmb3IgY29kZSBnZW5lcmF0aW9uXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzU3RyID0gZGVwZW5kZW5jaWVzLm1hcCgoZGVwKSA9PiBgJyR7ZGVwIGFzIHN0cmluZ30nYCkuam9pbignLCAnKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgY29tcHV0ZSBtZXRob2QgYXMgc3RyaW5nLCBmb3IgY29kZSBnZW5lcmF0aW9uXG4gICAgY29uc3QgY29tcHV0ZU1ldGhvZE5hbWVTdHIgPSBjb21wdXRlRm4gPyBgLCAoc2xpY2UpID0+IHRoaXMuJHtjb21wdXRlTWV0aG9kTmFtZX0oc2xpY2UpYCA6ICcnO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wYXJhdG9yIG1hcCBmdW5jdGlvbiBhcyBzdHJpbmcsIGZvciBjb2RlIGdlbmVyYXRpb25cbiAgICBjb25zdCBrZXlDb21wYXJlTWFwU3RyID0gb3B0cz8ua2V5Q29tcGFyZU1hcCA/IGAsIHRoaXMuJHtrZXlDb21wYXJlTWFwUHJvcGVydHlOYW1lfWAgOiAnJztcblxuICAgIC8vIENyZWF0ZSBnZXR0ZXIgd2l0aCBjYWNoaW5nIHVzaW5nIFJ4U3RhdGUncyBuYXRpdmUgbXVsdGktc2VsZWN0ICsgcGlwZShtYXAoKSlcbiAgICBjb25zdCBnZXR0ZXIgPSBuZXcgRnVuY3Rpb24oYFxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICR7Z2V0TWV0aG9kTmFtZX0oKSB7XG4gICAgICAgICR7c3RhdGVWYWxpZGF0aW9ufVxuICAgICAgICBpZiAoIXRoaXMuJHtjYWNoZVByb3BlcnR5TmFtZX0pIHtcbiAgICAgICAgICBjb25zdCB7IG1hcCB9ID0gcmVxdWlyZSgncnhqcy9vcGVyYXRvcnMnKTtcbiAgICAgICAgICB0aGlzLiR7Y2FjaGVQcm9wZXJ0eU5hbWV9ID0gJHtzdGF0ZU9iamVjdH0uc2VsZWN0KFske2RlcGVuZGVuY2llc1N0cn1dJHtjb21wdXRlTWV0aG9kTmFtZVN0cn0ke2tleUNvbXBhcmVNYXBTdHJ9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4ke2NhY2hlUHJvcGVydHlOYW1lfTtcbiAgICAgIH1cbiAgICBgKSgpO1xuXG4gICAgLy8gQXR0YWNoIGNvbXB1dGUgbWV0aG9kLCBvcHRpb25hbCBrZXlDb21wYXJlTWFwIHdpdGggdW5pcXVlIG5hbWUsIGFuZCBnZXR0ZXIgdG8gcHJvdG90eXBlXG4gICAgaWYgKGNvbXB1dGVGbikgdGFyZ2V0W2NvbXB1dGVNZXRob2ROYW1lXSA9IGNvbXB1dGVGbjtcbiAgICBpZiAob3B0cz8ua2V5Q29tcGFyZU1hcCkgdGFyZ2V0W2tleUNvbXBhcmVNYXBQcm9wZXJ0eU5hbWVdID0gb3B0cy5rZXlDb21wYXJlTWFwO1xuICAgIHRhcmdldFtnZXRNZXRob2ROYW1lXSA9IGdldHRlcjtcblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlciBvbmx5XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBnZXQ6IGdldHRlcixcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gRGV2ZWxvcG1lbnQgbG9nZ2luZ1xuICAgIGlmICghcHJvZHVjdGlvbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgYFtSeFN0YXRlQ29tcHV0ZWRdICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IC0+ICR7c3RhdGVPYmplY3R9LnNlbGVjdChbJHtkZXBlbmRlbmNpZXNTdHJ9XSkucGlwZShtYXAoY29tcHV0ZUZuKSlgXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtc3RhdGUuZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3J4LXN0YXRlL3J4LXN0YXRlLmRlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF1QixPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDdkIsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLENBQUM7QUFPRCx5QkFBeUI7QUFDekIsTUFBTSxjQUFjO0lBQ2xCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBVztRQUMzQixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtRQUN6RCxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtRQUMzRCxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQVcsRUFBRSxXQUFnQjtRQUN4RCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFN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cEIsQ0FBQyxDQUFDO1FBRUgsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsS0FBSyxDQUNYLHFCQUFxQixNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxHQUFhLHFCQUFxQixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQzlJLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByb2plY3RWYWx1ZVJlZHVjZXIsIFJ4U3RhdGUgfSBmcm9tICdAcngtYW5ndWxhci9zdGF0ZSc7XG5cbmxldCBwcm9kdWN0aW9uID0gZmFsc2U7XG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlUnhTdGF0ZVByb2RNb2RlKCkge1xuICBwcm9kdWN0aW9uID0gdHJ1ZTtcbn1cblxuZGVjbGFyZSB0eXBlIENvbnN0cnVjdG9yPFQgPSBhbnk+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxudHlwZSBPYnNlcnZhYmxlUHJvcGVydHlEZWNvcmF0b3I8VD4gPSA8SyBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IEspID0+IHZvaWQ7XG50eXBlIFN0YXRlUHJvcGVydHlEZWNvcmF0b3I8VD4gPSA8SyBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IEspID0+IHZvaWQ7XG5cbi8vIFV0aWxpdHkgZm9yIGRlY29yYXRvcnNcbmNsYXNzIERlY29yYXRvclV0aWxzIHtcbiAgc3RhdGljIGNhcGl0YWxpemUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlTWV0aG9kTmFtZShwcmVmaXg6IHN0cmluZywgcHJvcGVydHlLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3RoaXMuY2FwaXRhbGl6ZShwcm9wZXJ0eUtleSl9YDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU5hbWUocHJlZml4OiBzdHJpbmcsIHByb3BlcnR5S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHt0aGlzLmNhcGl0YWxpemUocHJvcGVydHlLZXkpfWA7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVTdGF0ZVByb3BlcnR5KHRhcmdldDogYW55LCBzdGF0ZU9iamVjdDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFwcm9kdWN0aW9uICYmICFzdGF0ZU9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHN0YXRlISBQbGVhc2UgYWRkIGEgUnhTdGF0ZSBpbiBjbGFzczogJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgU1RBVEVfVkFSX05BTUVfS0VZID0gJ19fc3RhdGVOYW1lJztcbmNvbnN0IERFRkFVTFRfU1RBVEVfVkFSX05BTUUgPSAnX3N0YXRlJztcblxuLyoqXG4gKiBEZWNvcmF0b3IgdG8gcmVnaXN0ZXIgdGhlIFJ4U3RhdGUgcHJvcGVydHkgaW4gYSBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJ4U3RhdGVSZWdpc3RlcigpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZykge1xuICAgIGlmICh0YXJnZXRbU1RBVEVfVkFSX05BTUVfS0VZXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgQFJ4U3RhdGVSZWdpc3RlcigpIGluIGNsYXNzIGhpZXJhcmNoeS4gRm91bmQ6ICR7dGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV19IGFuZCAke2tleX1gKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBTVEFURV9WQVJfTkFNRV9LRVksIHtcbiAgICAgIHZhbHVlOiBrZXksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBSeFN0YXRlIHByb3BlcnRpZXMgd2l0aCBnZXR0ZXIvc2V0dGVyIGFjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZVByb3BlcnR5PFQgZXh0ZW5kcyBvYmplY3QgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55LCBWIGV4dGVuZHMgVFtLXSA9IGFueT4oXG4gIHN0YXRlUHJvcGVydHlOYW1lPzogc3RyaW5nIHwgSyxcbiAgcHJvamVjdFZhbHVlUmVkdWNlcj86IFByb2plY3RWYWx1ZVJlZHVjZXI8VCwgSywgVj5cbik6IFN0YXRlUHJvcGVydHlEZWNvcmF0b3I8Vj4ge1xuICByZXR1cm4gZnVuY3Rpb24gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4odGFyZ2V0OiBhbnksIGtleTogUCkge1xuICAgIGNvbnN0IGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgPSAoc3RhdGVQcm9wZXJ0eU5hbWUgYXMgc3RyaW5nKSB8fCAoa2V5IGFzIHN0cmluZyk7XG4gICAgY29uc3Qgc3RhdGVWYXJOYW1lID0gdGFyZ2V0IGluc3RhbmNlb2YgUnhTdGF0ZSA/IG51bGwgOiB0YXJnZXRbU1RBVEVfVkFSX05BTUVfS0VZXSB8fCBERUZBVUxUX1NUQVRFX1ZBUl9OQU1FO1xuXG4gICAgLy8gQ3JlYXRlIHVuaXF1ZSBwcm9wZXJ0eSBuYW1lcyB0byBhdm9pZCBjb25mbGljdHNcbiAgICBjb25zdCBwcml2YXRlVmFsdWVLZXkgPSBgX18ke2tleSBhcyBzdHJpbmd9X3ZhbHVlYDtcbiAgICBjb25zdCBwcml2YXRlSW5pdGlhbGl6ZWRLZXkgPSBgX18ke2tleSBhcyBzdHJpbmd9X2luaXRpYWxpemVkYDtcblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlci9zZXR0ZXJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGF0ZU9iamVjdDogUnhTdGF0ZTxUPiA9IHN0YXRlVmFyTmFtZSA/IHRoaXNbc3RhdGVWYXJOYW1lXSA6IHRoaXM7XG4gICAgICAgIERlY29yYXRvclV0aWxzLnZhbGlkYXRlU3RhdGVQcm9wZXJ0eSh0YXJnZXQsIHN0YXRlT2JqZWN0KTtcblxuICAgICAgICBpZiAoIXRoaXNbcHJpdmF0ZUluaXRpYWxpemVkS2V5XSkge1xuICAgICAgICAgIHRoaXNbcHJpdmF0ZVZhbHVlS2V5XSA9IHN0YXRlT2JqZWN0LmdldChmaW5hbFN0YXRlUHJvcGVydHlOYW1lIGFzIGtleW9mIFQpO1xuICAgICAgICAgIHRoaXNbcHJpdmF0ZUluaXRpYWxpemVkS2V5XSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1twcml2YXRlVmFsdWVLZXldIGFzIFY7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWU6IFYpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVPYmplY3Q6IFJ4U3RhdGU8VD4gPSBzdGF0ZVZhck5hbWUgPyB0aGlzW3N0YXRlVmFyTmFtZV0gOiB0aGlzO1xuICAgICAgICBEZWNvcmF0b3JVdGlscy52YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0LCBzdGF0ZU9iamVjdCk7XG5cbiAgICAgICAgdGhpc1twcml2YXRlVmFsdWVLZXldID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHByb2plY3RWYWx1ZVJlZHVjZXIpIHtcbiAgICAgICAgICBzdGF0ZU9iamVjdC5zZXQoZmluYWxTdGF0ZVByb3BlcnR5TmFtZSBhcyBrZXlvZiBULCAoc3RhdGU6IFQpID0+IHByb2plY3RWYWx1ZVJlZHVjZXIoc3RhdGUsIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGVPYmplY3Quc2V0KGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgYXMga2V5b2YgVCwgKCkgPT4gdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIERldmVsb3BtZW50IGxvZ2dpbmdcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtSeFN0YXRlUHJvcGVydHldICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IC0+IHN0YXRlLiR7ZmluYWxTdGF0ZVByb3BlcnR5TmFtZX1gKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBSeFN0YXRlIG9ic2VydmFibGUgc2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSeFN0YXRlU2VsZWN0PFQgPSBhbnksIFIgPSBUW2tleW9mIFRdPihcbiAgc3RhdGVQcm9wZXJ0eU5hbWU/OiBzdHJpbmcgfCBrZXlvZiBUIHwgJyQnLFxuICBvcHRzPzoge1xuICAgIHN0YXRlTmFtZT86IHN0cmluZztcbiAgfVxuKTogT2JzZXJ2YWJsZVByb3BlcnR5RGVjb3JhdG9yPE9ic2VydmFibGU8Uj4+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxQIGV4dGVuZHMgUHJvcGVydHlLZXk+KHRhcmdldDogYW55LCBrZXk6IFApIHtcbiAgICAvLyBDb252ZW50aW9uIGNoZWNrXG4gICAgaWYgKCFwcm9kdWN0aW9uICYmICEoa2V5IGFzIHN0cmluZykuZW5kc1dpdGgoJyQnKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1J4U3RhdGVTZWxlY3RdIENvbnZlbnRpb246IFByb3BlcnR5ICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IHNob3VsZCBlbmQgd2l0aCAnJCcgdG8gaW5kaWNhdGUgaXQncyBhbiBPYnNlcnZhYmxlYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgc3RhdGUgcHJvcGVydHkgbmFtZVxuICAgIGNvbnN0IGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgPSAoc3RhdGVQcm9wZXJ0eU5hbWUgYXMgc3RyaW5nKSB8fCAoa2V5IGFzIHN0cmluZykucmVwbGFjZSgvXFwkJC8sICcnKTtcblxuICAgIC8vIERldGVybWluZSBzdGF0ZSBvYmplY3RcbiAgICBjb25zdCBzdGF0ZVZhck5hbWUgPSB0YXJnZXQgaW5zdGFuY2VvZiBSeFN0YXRlID8gbnVsbCA6IHRhcmdldFtTVEFURV9WQVJfTkFNRV9LRVldIHx8IG9wdHM/LnN0YXRlTmFtZSB8fCBERUZBVUxUX1NUQVRFX1ZBUl9OQU1FO1xuXG4gICAgLy8gQ3JlYXRlIGNhY2hlIHByb3BlcnR5IG5hbWVcbiAgICBjb25zdCBjYWNoZVByb3BlcnR5TmFtZSA9IGBfXyR7a2V5IGFzIHN0cmluZ31fY2FjaGVgO1xuXG4gICAgLy8gRGVmaW5lIHByb3BlcnR5IHdpdGggZ2V0dGVyIG9ubHlcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGF0ZU9iamVjdCA9IHN0YXRlVmFyTmFtZSA/IHRoaXNbc3RhdGVWYXJOYW1lXSA6IHRoaXM7XG4gICAgICAgIERlY29yYXRvclV0aWxzLnZhbGlkYXRlU3RhdGVQcm9wZXJ0eSh0YXJnZXQsIHN0YXRlT2JqZWN0KTtcblxuICAgICAgICBpZiAoIXRoaXNbY2FjaGVQcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgaWYgKGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgPT09ICckJykge1xuICAgICAgICAgICAgdGhpc1tjYWNoZVByb3BlcnR5TmFtZV0gPSBzdGF0ZU9iamVjdC4kO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmluYWxTdGF0ZVByb3BlcnR5TmFtZS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZmluYWxTdGF0ZVByb3BlcnR5TmFtZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgdGhpc1tjYWNoZVByb3BlcnR5TmFtZV0gPSBzdGF0ZU9iamVjdC5zZWxlY3QoLi4ucGF0aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXNbY2FjaGVQcm9wZXJ0eU5hbWVdID0gc3RhdGVPYmplY3Quc2VsZWN0KGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzW2NhY2hlUHJvcGVydHlOYW1lXTtcbiAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIERldmVsb3BtZW50IGxvZ2dpbmdcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtSeFN0YXRlU2VsZWN0XSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSAtPiBzdGF0ZS5zZWxlY3QoJyR7ZmluYWxTdGF0ZVByb3BlcnR5TmFtZX0nKWApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGRlY29yYXRvciB0byBjcmVhdGUgY29tcHV0ZWQgb2JzZXJ2YWJsZXMgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZUNvbXB1dGVkPFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55LCBSID0gYW55PihcbiAgZGVwZW5kZW5jaWVzOiBLW10sXG4gIGNvbXB1dGVGbj86IChzbGljZTogUGljazxULCBLPikgPT4gUixcbiAgb3B0cz86IHtcbiAgICBzdGF0ZU5hbWU/OiBzdHJpbmc7XG4gICAga2V5Q29tcGFyZU1hcD86IGFueTtcbiAgfVxuKTogT2JzZXJ2YWJsZVByb3BlcnR5RGVjb3JhdG9yPE9ic2VydmFibGU8Uj4+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxQIGV4dGVuZHMgUHJvcGVydHlLZXk+KHRhcmdldDogYW55LCBrZXk6IFApIHtcbiAgICAvLyBDb252ZW50aW9uIGNoZWNrXG4gICAgaWYgKCFwcm9kdWN0aW9uICYmICEoa2V5IGFzIHN0cmluZykuZW5kc1dpdGgoJyQnKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1J4U3RhdGVDb21wdXRlZF0gQ29udmVudGlvbjogUHJvcGVydHkgJHt0YXJnZXQuY29uc3RydWN0b3I/Lm5hbWV9LiR7a2V5IGFzIHN0cmluZ30gc2hvdWxkIGVuZCB3aXRoICckJyB0byBpbmRpY2F0ZSBpdCdzIGFuIE9ic2VydmFibGVgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlVmFyTmFtZSA9IHRhcmdldCBpbnN0YW5jZW9mIFJ4U3RhdGUgPyBudWxsIDogdGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV0gfHwgb3B0cz8uc3RhdGVOYW1lIHx8IERFRkFVTFRfU1RBVEVfVkFSX05BTUU7XG4gICAgY29uc3QgY2FjaGVQcm9wZXJ0eU5hbWUgPSBgX18ke2tleSBhcyBzdHJpbmd9X2NhY2hlYDtcblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlciBvbmx5XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVPYmplY3QgPSBzdGF0ZVZhck5hbWUgPyB0aGlzW3N0YXRlVmFyTmFtZV0gOiB0aGlzO1xuICAgICAgICBEZWNvcmF0b3JVdGlscy52YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0LCBzdGF0ZU9iamVjdCk7XG5cbiAgICAgICAgaWYgKCF0aGlzW2NhY2hlUHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgIGxldCBvYnNlcnZhYmxlID0gc3RhdGVPYmplY3Quc2VsZWN0KGRlcGVuZGVuY2llcywgb3B0cz8ua2V5Q29tcGFyZU1hcCk7XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZUZuKSB7XG4gICAgICAgICAgICBjb25zdCB7IG1hcCB9ID0gcmVxdWlyZSgncnhqcy9vcGVyYXRvcnMnKTtcbiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlLnBpcGUobWFwKGNvbXB1dGVGbikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXNbY2FjaGVQcm9wZXJ0eU5hbWVdID0gb2JzZXJ2YWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzW2NhY2hlUHJvcGVydHlOYW1lXTtcbiAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIERldmVsb3BtZW50IGxvZ2dpbmdcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIGBbUnhTdGF0ZUNvbXB1dGVkXSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSAtPiBzdGF0ZS5zZWxlY3QoWyR7ZGVwZW5kZW5jaWVzLm1hcCgoZCkgPT4gYCcke2QgYXMgc3RyaW5nfSdgKS5qb2luKCcsICcpfV0pYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG4iXX0=
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
1
|
import { Inject, inject, Injectable, Optional } from '@angular/core';
|
|
3
2
|
import { Promise } from '@rx-angular/cdk/zone-less/browser';
|
|
4
3
|
import { DiscourseUtils } from './discourse.utils';
|
|
@@ -9,7 +8,6 @@ import { from, switchMap } from 'rxjs';
|
|
|
9
8
|
import { filter, map, mergeMap } from 'rxjs/operators';
|
|
10
9
|
import { StartableService } from '../../../shared/services/startable-service.class';
|
|
11
10
|
import { NetworkService } from '../../../core/services/network.service';
|
|
12
|
-
import { RxStateProperty, RxStateSelect } from '../../../shared/rx-state/rx-state.decorators';
|
|
13
11
|
import { RxState } from '@rx-angular/state';
|
|
14
12
|
import { ENVIRONMENT } from '../../../../environments/environment.class';
|
|
15
13
|
import { UrlUtils } from '../../../shared/file/url.utils';
|
|
@@ -23,10 +21,14 @@ export class DiscourseFeedService extends StartableService {
|
|
|
23
21
|
_logPrefix = '[discourse-feed-service] ';
|
|
24
22
|
_state = new RxState();
|
|
25
23
|
network = inject(NetworkService);
|
|
26
|
-
locale
|
|
27
|
-
feedUrls
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
locale$ = this._state.select('locale');
|
|
25
|
+
feedUrls$ = this._state.select('feedUrls');
|
|
26
|
+
get feedUrls() {
|
|
27
|
+
return this._state.get('feedUrls');
|
|
28
|
+
}
|
|
29
|
+
set feedUrls(urls) {
|
|
30
|
+
this._state.set('feedUrls', () => urls);
|
|
31
|
+
}
|
|
30
32
|
constructor(settings, environment) {
|
|
31
33
|
super(settings);
|
|
32
34
|
this.settings = settings;
|
|
@@ -39,10 +41,8 @@ export class DiscourseFeedService extends StartableService {
|
|
|
39
41
|
}
|
|
40
42
|
async ngOnStart() {
|
|
41
43
|
await this.settings.ready();
|
|
42
|
-
console.debug(`${this._logPrefix}Service started`, this.settings.locale, this.feedUrls);
|
|
43
44
|
return {
|
|
44
45
|
locale: this.settings.locale,
|
|
45
|
-
feedUrls: this.feedUrls,
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
48
|
watchAll(opts) {
|
|
@@ -155,18 +155,6 @@ export class DiscourseFeedService extends StartableService {
|
|
|
155
155
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiscourseFeedService, deps: [{ token: i1.LocalSettingsService }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
156
156
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiscourseFeedService, providedIn: 'root' });
|
|
157
157
|
}
|
|
158
|
-
__decorate([
|
|
159
|
-
RxStateSelect()
|
|
160
|
-
], DiscourseFeedService.prototype, "locale$", void 0);
|
|
161
|
-
__decorate([
|
|
162
|
-
RxStateSelect()
|
|
163
|
-
], DiscourseFeedService.prototype, "feedUrls$", void 0);
|
|
164
|
-
__decorate([
|
|
165
|
-
RxStateProperty()
|
|
166
|
-
], DiscourseFeedService.prototype, "locale", void 0);
|
|
167
|
-
__decorate([
|
|
168
|
-
RxStateProperty()
|
|
169
|
-
], DiscourseFeedService.prototype, "feedUrls", void 0);
|
|
170
158
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiscourseFeedService, decorators: [{
|
|
171
159
|
type: Injectable,
|
|
172
160
|
args: [{ providedIn: 'root' }]
|
|
@@ -175,5 +163,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
175
163
|
}, {
|
|
176
164
|
type: Inject,
|
|
177
165
|
args: [ENVIRONMENT]
|
|
178
|
-
}] }]
|
|
179
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY291cnNlLWZlZWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL2ZlZWQvZGlzY291cnNlL2Rpc2NvdXJzZS1mZWVkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLFlBQVksTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFZLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUcsT0FBTyxFQUFFLElBQUksRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDcEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFOUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV0RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFTMUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGdCQUEy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ZCxDQUFDO3dHQTdMVSxvQkFBb0Isc0RBZVQsV0FBVzs0R0FmdEIsb0JBQW9CLGNBRFAsTUFBTTs7QUFRYjtJQUFoQixhQUFhLEVBQUU7cURBQTZCO0FBQzVCO0lBQWhCLGFBQWEsRUFBRTt1REFBaUM7QUFFOUI7SUFBbEIsZUFBZSxFQUFFO29EQUFnQjtBQUNmO0lBQWxCLGVBQWUsRUFBRTtzREFBb0I7NEZBWDNCLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQWdCN0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXO3lDQVJoQixPQUFPLE1BQ1AsU0FBUyxNQUVQLE1BQU0sTUFDTixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBpbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFByb21pc2UgfSBmcm9tICdAcngtYW5ndWxhci9jZGsvem9uZS1sZXNzL2Jyb3dzZXInO1xuaW1wb3J0IHsgRGlzY291cnNlVXRpbHMgfSBmcm9tICcuL2Rpc2NvdXJzZS51dGlscyc7XG5pbXBvcnQgRGlzY291cnNlQVBJIGZyb20gJ2Rpc2NvdXJzZTInO1xuaW1wb3J0IHsgSnNvbkZlZWQsIEpzb25GZWVkVXRpbHMgfSBmcm9tICcuLi9mZWVkLm1vZGVsJztcbmltcG9ydCB7IGZpcnN0QXJyYXlWYWx1ZSwgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnhTdGF0ZVByb3BlcnR5LCBSeFN0YXRlU2VsZWN0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3J4LXN0YXRlL3J4LXN0YXRlLmRlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IEVOVklST05NRU5ULCBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBMb2FkUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IFVybFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ZpbGUvdXJsLnV0aWxzJztcbmltcG9ydCB7IElGZWVkU2VydmljZSB9IGZyb20gJy4uL2ZlZWQuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY291cnNlRmVlZFNlcnZpY2VTdGF0ZSB7XG4gIGxvY2FsZTogc3RyaW5nO1xuICBmZWVkVXJscz86IHN0cmluZ1tdO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIERpc2NvdXJzZUZlZWRTZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZTxEaXNjb3Vyc2VGZWVkU2VydmljZVN0YXRlPiBpbXBsZW1lbnRzIElGZWVkU2VydmljZSB7XG4gIHByaXZhdGUgZGlzY291cnNlQXBpcyA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3Vyc2VBUEk+KCk7XG4gIHByaXZhdGUgX2xvZ1ByZWZpeCA9ICdbZGlzY291cnNlLWZlZWQtc2VydmljZV0gJztcblxuICBwcml2YXRlIF9zdGF0ZSA9IG5ldyBSeFN0YXRlPERpc2NvdXJzZUZlZWRTZXJ2aWNlU3RhdGU+KCk7XG4gIHByaXZhdGUgbmV0d29yayA9IGluamVjdChOZXR3b3JrU2VydmljZSk7XG5cbiAgQFJ4U3RhdGVTZWxlY3QoKSBsb2NhbGUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIEBSeFN0YXRlU2VsZWN0KCkgZmVlZFVybHMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcblxuICBAUnhTdGF0ZVByb3BlcnR5KCkgbG9jYWxlOiBzdHJpbmc7XG4gIEBSeFN0YXRlUHJvcGVydHkoKSBmZWVkVXJsczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihzZXR0aW5ncyk7XG5cbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2Rpc2NvdXJzZS1mZWVkLXNlcnZpY2VdIENyZWF0aW5nIHNlcnZpY2UnKTtcblxuICAgIHRoaXMuX3N0YXRlLmNvbm5lY3QoJ2xvY2FsZScsIHRoaXMuc2V0dGluZ3MubG9jYWxlJCk7XG5cbiAgICB0aGlzLl9zdGF0ZS5jb25uZWN0KFxuICAgICAgJ2ZlZWRVcmxzJyxcbiAgICAgIHRoaXMubG9jYWxlJC5waXBlKFxuICAgICAgICBmaWx0ZXIoaXNOb3ROaWxPckJsYW5rKSxcbiAgICAgICAgbWFwKChsb2NhbGUpID0+IChsb2NhbGUgJiYgZW52aXJvbm1lbnQuZmVlZD8uanNvbkZlZWQ/Lltsb2NhbGVdKSA/PyBbXSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPERpc2NvdXJzZUZlZWRTZXJ2aWNlU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnJlYWR5KCk7XG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9U2VydmljZSBzdGFydGVkYCwgdGhpcy5zZXR0aW5ncy5sb2NhbGUsIHRoaXMuZmVlZFVybHMpO1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IHRoaXMuc2V0dGluZ3MubG9jYWxlLFxuICAgICAgZmVlZFVybHM6IHRoaXMuZmVlZFVybHMsXG4gICAgfTtcbiAgfVxuXG4gIHdhdGNoQWxsKG9wdHM/OiB7IG1heEFnZUluTW9udGhzPzogbnVtYmVyOyBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyIH0pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8SnNvbkZlZWQ+PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMuc3RhcnQoKSkucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy53YXRjaEFsbChvcHRzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZWVkVXJscyQucGlwZShcbiAgICAgIGZpbHRlcihpc05vdEVtcHR5QXJyYXkpLFxuICAgICAgbWVyZ2VNYXAoKHVybHMpID0+IHRoaXMubG9hZEFsbCh1cmxzLCBvcHRzKSlcbiAgICApO1xuICB9XG5cbiAgZ2V0SG9tZVVybChmZWVkPzogSnNvbkZlZWQpIHtcbiAgICBjb25zdCBmZWVkVXJsID0gZmVlZD8uZmVlZF91cmwgPz8gZmlyc3RBcnJheVZhbHVlKHRoaXMuZmVlZFVybHMpO1xuICAgIHJldHVybiBmZWVkVXJsID8gVXJsVXRpbHMuZ2V0Um9vdFVybChmZWVkVXJsKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFRhZ1VybChmZWVkOiBKc29uRmVlZCwgdGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZmVlZCB8fCAhdGFnKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nICdmZWVkJyBvciAndGFnJyBhcmd1bWVudFwiKTtcbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRIb21lVXJsKGZlZWQpO1xuICAgIHJldHVybiBmZWVkLnRhZ190ZW1wbGF0ZT8ucmVwbGFjZSgne3RhZ30nLCB0YWcpID8/IGJhc2VVcmwgKyAnL3RhZy8nICsgdGFnO1xuICB9XG5cbiAgYXN5bmMgbG9hZChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRzPzoge1xuICAgICAgbG9jYWxlPzogc3RyaW5nO1xuICAgICAgbWF4QWdlSW5Nb250aHM/OiBudW1iZXI7XG4gICAgICBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgLy8gSW50ZXJuYWwgb3B0aW9ucyAoZm9yIHJlY3Vyc2l2ZSBjYWxscylcbiAgICAgIGNsb3NlQXBpcz86IGJvb2xlYW47XG4gICAgICBkZXB0aD86IG51bWJlcjtcbiAgICB9XG4gICk6IFByb21pc2U8SnNvbkZlZWQ+IHtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMubG9hZEFsbChbdXJsXSwgb3B0cyk7XG4gICAgcmV0dXJuIGRhdGE/LlswXTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRBbGwoXG4gICAgdXJscz86IHN0cmluZ1tdLFxuICAgIG9wdHM/OiB7XG4gICAgICBsb2NhbGU/OiBzdHJpbmc7XG4gICAgICBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjtcbiAgICAgIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gICAgICAvLyBJbnRlcm5hbCBvcHRpb25zIChmb3IgcmVjdXJzaXZlIGNhbGxzKVxuICAgICAgY2xvc2VBcGlzPzogYm9vbGVhbjtcbiAgICAgIGRlcHRoPzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxMb2FkUmVzdWx0PEpzb25GZWVkPj4ge1xuICAgIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICB1cmxzID0gdXJscyA/PyB0aGlzLmZlZWRVcmxzO1xuICAgIG9wdHMgPSB7XG4gICAgICBtYXhBZ2VJbk1vbnRoczogb3B0cz8ubWF4QWdlSW5Nb250aHMgPz8gdGhpcy5lbnZpcm9ubWVudC5mZWVkPy5tYXhBZ2VJbk1vbnRocyxcbiAgICAgIG1heENvbnRlbnRMZW5ndGg6IG9wdHM/Lm1heENvbnRlbnRMZW5ndGggPz8gdGhpcy5lbnZpcm9ubWVudC5mZWVkPy5tYXhDb250ZW50TGVuZ3RoLFxuICAgICAgbG9jYWxlOiB0aGlzLnNldHRpbmdzLmxvY2FsZSxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgY2xvc2VBcGlzOiB0cnVlLFxuICAgICAgLi4ub3B0cyxcbiAgICB9O1xuICAgIGNvbnN0IGZlZWRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAodXJscyB8fCBbXSkubWFwKGFzeW5jICh1cmwpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBHZXQgSlNPTlxuICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLm5ldHdvcmsuZmV0Y2godXJsKTtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1Mb2FkZWQgSlNPTiBmcm9tICR7dXJsfWAsIGpzb24pO1xuICAgICAgICAgIGlmIChKc29uRmVlZFV0aWxzLmlzSnNvbkZlZWQoanNvbikpIHtcbiAgICAgICAgICAgIC8vIE1pZ3JhdGUgb2xkIHZlcnNpb25cbiAgICAgICAgICAgIGxldCBmZWVkID0gSnNvbkZlZWRVdGlscy5taWdyYXRlRmVlZChqc29uKTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBpdGVtcyAoZS5nLiB1c2luZyBmZWVkLm5leHRfdXJsKVxuICAgICAgICAgICAgZmVlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZUZlZWRJdGVtcyhmZWVkLCB7IC4uLm9wdHMsIGRlcHRoOiBvcHRzPy5kZXB0aCA/PyAwIH0pO1xuXG4gICAgICAgICAgICAvLyBUcnVuY2F0ZSBodG1sXG4gICAgICAgICAgICBKc29uRmVlZFV0aWxzLnRydW5jYXRlRmVlZEl0ZW1zSHRtbChmZWVkLCBvcHRzKTtcblxuICAgICAgICAgICAgcmV0dXJuIGlzTm90RW1wdHlBcnJheShmZWVkPy5pdGVtcykgPyBbZmVlZF0gOiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgZGlzY291cnNlXG4gICAgICAgICAgaWYgKERpc2NvdXJzZVV0aWxzLmlzRGlzY291cnNlT2JqZWN0KGpzb24pKSB7XG4gICAgICAgICAgICBjb25zdCBhcGkgPSB0aGlzLmdldE9yQ3JlYXRlRGlzY291cnNlQXBpKHVybCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgRGlzY291cnNlVXRpbHMuZ2V0RmVlZHNCeVVybCh1cmwsIHsgLi4ub3B0cywgYXBpIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnI/LnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH0gRXJyb3Igd2hpbGUgZmV0Y2hpbmcgZmVlZCBhdCAke3VybH0uIDQwNCAoTm90IGZvdW5kKWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH0gRXJyb3Igd2hpbGUgZmV0Y2hpbmcgZmVlZCBhdCAke3VybH1gLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgaWYgKG9wdHM/LmNsb3NlQXBpcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuY2xvc2VBcGlzKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGZlZWRzLmZsYXQoKTtcblxuICAgIHJldHVybiB7IGRhdGEsIHRvdGFsOiBkYXRhLmxlbmd0aCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE9yQ3JlYXRlRGlzY291cnNlQXBpKHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IERpc2NvdXJzZVV0aWxzLmdldERpc2NvdXJzZUJhc2VVcmwodXJsKTtcbiAgICBsZXQgYXBpID0gdGhpcy5kaXNjb3Vyc2VBcGlzLmdldChiYXNlVXJsKTtcbiAgICBpZiAoIWFwaSkge1xuICAgICAgYXBpID0gbmV3IERpc2NvdXJzZUFQSShiYXNlVXJsKTtcbiAgICAgIHRoaXMuZGlzY291cnNlQXBpcy5zZXQoYmFzZVVybCwgYXBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwaTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFwaXMoKSB7XG4gICAgdGhpcy5kaXNjb3Vyc2VBcGlzLmNsZWFyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUZlZWRJdGVtcyhqc29uOiBKc29uRmVlZCwgb3B0cz86IHsgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjsgZGVwdGg/OiBudW1iZXIgfSk6IFByb21pc2U8SnNvbkZlZWQ+IHtcbiAgICBpZiAoIWpzb24pIHJldHVybiBqc29uO1xuXG4gICAgLy8gTG9hZCBpdGVtc1xuICAgIGlmIChpc0VtcHR5QXJyYXkoanNvbi5pdGVtcykgJiYgaXNOb3ROaWxPckJsYW5rKGpzb24ubmV4dF91cmwpKSB7XG4gICAgICBjb25zdCBkZXB0aCA9IG9wdHM/LmRlcHRoID8/IDA7XG4gICAgICBpZiAoZGVwdGggPj0gMykge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5fbG9nUHJlZml4fU1heCBkZXB0aCByZWFjaGVkICgke2RlcHRofSkgZm9yICR7anNvbi5mZWVkX3VybH1gKTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgaXRlbXNcbiAgICAgIGNvbnN0IGZlZWQgPSBhd2FpdCB0aGlzLmxvYWQoanNvbi5uZXh0X3VybCwgeyAuLi5vcHRzLCBjbG9zZUFwaXM6IGZhbHNlLCBkZXB0aDogZGVwdGggKyAxIH0pO1xuXG4gICAgICBpZiAoaXNFbXB0eUFycmF5KGZlZWQ/Lml0ZW1zKSkge1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgIH1cblxuICAgICAgLy8gTWVyZ2Ugd2l0aCB0aGUgaW5wdXQganNvblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uanNvbixcbiAgICAgICAgdGl0bGU6IGpzb24udGl0bGUgPz8gZmVlZC50aXRsZSxcbiAgICAgICAgaG9tZV9wYWdlX3VybDoganNvbi5ob21lX3BhZ2VfdXJsID8/IGZlZWQuaG9tZV9wYWdlX3VybCxcbiAgICAgICAgYXV0aG9yczogaXNOb3RFbXB0eUFycmF5KGpzb24uYXV0aG9ycykgPyBqc29uLmF1dGhvcnMgOiBmZWVkLmF1dGhvcnMsXG4gICAgICAgIGl0ZW1zOiBmZWVkLml0ZW1zLFxuICAgICAgICB0YWdfdGVtcGxhdGU6IGpzb24udGFnX3RlbXBsYXRlID8/IGZlZWQudGFnX3RlbXBsYXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxufVxuIl19
|
|
166
|
+
}] }] });
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY291cnNlLWZlZWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL2ZlZWQvZGlzY291cnNlL2Rpc2NvdXJzZS1mZWVkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sWUFBWSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsSUFBSSxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFeEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV0RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFTMUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGdCQUEyQztJQWtCekU7SUFDbUM7SUFsQnJDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJ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Q0FBQyxZQUFZO2FBQ3JELENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO3dHQS9MVSxvQkFBb0Isc0RBbUJULFdBQVc7NEdBbkJ0QixvQkFBb0IsY0FEUCxNQUFNOzs0RkFDbkIsb0JBQW9CO2tCQURoQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBb0I3QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIGluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUHJvbWlzZSB9IGZyb20gJ0ByeC1hbmd1bGFyL2Nkay96b25lLWxlc3MvYnJvd3Nlcic7XG5pbXBvcnQgeyBEaXNjb3Vyc2VVdGlscyB9IGZyb20gJy4vZGlzY291cnNlLnV0aWxzJztcbmltcG9ydCBEaXNjb3Vyc2VBUEkgZnJvbSAnZGlzY291cnNlMic7XG5pbXBvcnQgeyBKc29uRmVlZCwgSnNvbkZlZWRVdGlscyB9IGZyb20gJy4uL2ZlZWQubW9kZWwnO1xuaW1wb3J0IHsgZmlyc3RBcnJheVZhbHVlLCBpc0VtcHR5QXJyYXksIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN0YXJ0YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBSeFN0YXRlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgRU5WSVJPTk1FTlQsIEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IExvYWRSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgVXJsVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZmlsZS91cmwudXRpbHMnO1xuaW1wb3J0IHsgSUZlZWRTZXJ2aWNlIH0gZnJvbSAnLi4vZmVlZC5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBEaXNjb3Vyc2VGZWVkU2VydmljZVN0YXRlIHtcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIGZlZWRVcmxzPzogc3RyaW5nW107XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRGlzY291cnNlRmVlZFNlcnZpY2UgZXh0ZW5kcyBTdGFydGFibGVTZXJ2aWNlPERpc2NvdXJzZUZlZWRTZXJ2aWNlU3RhdGU+IGltcGxlbWVudHMgSUZlZWRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBkaXNjb3Vyc2VBcGlzID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvdXJzZUFQST4oKTtcbiAgcHJpdmF0ZSBfbG9nUHJlZml4ID0gJ1tkaXNjb3Vyc2UtZmVlZC1zZXJ2aWNlXSAnO1xuXG4gIHByaXZhdGUgX3N0YXRlID0gbmV3IFJ4U3RhdGU8RGlzY291cnNlRmVlZFNlcnZpY2VTdGF0ZT4oKTtcbiAgcHJpdmF0ZSBuZXR3b3JrID0gaW5qZWN0KE5ldHdvcmtTZXJ2aWNlKTtcblxuICBsb2NhbGUkID0gdGhpcy5fc3RhdGUuc2VsZWN0KCdsb2NhbGUnKTtcbiAgZmVlZFVybHMkID0gdGhpcy5fc3RhdGUuc2VsZWN0KCdmZWVkVXJscycpO1xuXG4gIGdldCBmZWVkVXJscygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldCgnZmVlZFVybHMnKTtcbiAgfVxuICBzZXQgZmVlZFVybHModXJsczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9zdGF0ZS5zZXQoJ2ZlZWRVcmxzJywgKCkgPT4gdXJscyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKHNldHRpbmdzKTtcblxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbZGlzY291cnNlLWZlZWQtc2VydmljZV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgdGhpcy5fc3RhdGUuY29ubmVjdCgnbG9jYWxlJywgdGhpcy5zZXR0aW5ncy5sb2NhbGUkKTtcblxuICAgIHRoaXMuX3N0YXRlLmNvbm5lY3QoXG4gICAgICAnZmVlZFVybHMnLFxuICAgICAgdGhpcy5sb2NhbGUkLnBpcGUoXG4gICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICBtYXAoKGxvY2FsZSkgPT4gKGxvY2FsZSAmJiBlbnZpcm9ubWVudC5mZWVkPy5qc29uRmVlZD8uW2xvY2FsZV0pID8/IFtdKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8RGlzY291cnNlRmVlZFNlcnZpY2VTdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MucmVhZHkoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYWxlOiB0aGlzLnNldHRpbmdzLmxvY2FsZSxcbiAgICB9O1xuICB9XG5cbiAgd2F0Y2hBbGwob3B0cz86IHsgbWF4QWdlSW5Nb250aHM/OiBudW1iZXI7IG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXIgfSk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxKc29uRmVlZD4+IHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgcmV0dXJuIGZyb20odGhpcy5zdGFydCgpKS5waXBlKHN3aXRjaE1hcCgoKSA9PiB0aGlzLndhdGNoQWxsKG9wdHMpKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZlZWRVcmxzJC5waXBlKFxuICAgICAgZmlsdGVyKGlzTm90RW1wdHlBcnJheSksXG4gICAgICBtZXJnZU1hcCgodXJscykgPT4gdGhpcy5sb2FkQWxsKHVybHMsIG9wdHMpKVxuICAgICk7XG4gIH1cblxuICBnZXRIb21lVXJsKGZlZWQ/OiBKc29uRmVlZCkge1xuICAgIGNvbnN0IGZlZWRVcmwgPSBmZWVkPy5mZWVkX3VybCA/PyBmaXJzdEFycmF5VmFsdWUodGhpcy5mZWVkVXJscyk7XG4gICAgcmV0dXJuIGZlZWRVcmwgPyBVcmxVdGlscy5nZXRSb290VXJsKGZlZWRVcmwpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0VGFnVXJsKGZlZWQ6IEpzb25GZWVkLCB0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFmZWVkIHx8ICF0YWcpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgJ2ZlZWQnIG9yICd0YWcnIGFyZ3VtZW50XCIpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEhvbWVVcmwoZmVlZCk7XG4gICAgcmV0dXJuIGZlZWQudGFnX3RlbXBsYXRlPy5yZXBsYWNlKCd7dGFnfScsIHRhZykgPz8gYmFzZVVybCArICcvdGFnLycgKyB0YWc7XG4gIH1cblxuICBhc3luYyBsb2FkKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdHM/OiB7XG4gICAgICBsb2NhbGU/OiBzdHJpbmc7XG4gICAgICBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjtcbiAgICAgIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gICAgICAvLyBJbnRlcm5hbCBvcHRpb25zIChmb3IgcmVjdXJzaXZlIGNhbGxzKVxuICAgICAgY2xvc2VBcGlzPzogYm9vbGVhbjtcbiAgICAgIGRlcHRoPzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxKc29uRmVlZD4ge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5sb2FkQWxsKFt1cmxdLCBvcHRzKTtcbiAgICByZXR1cm4gZGF0YT8uWzBdO1xuICB9XG5cbiAgYXN5bmMgbG9hZEFsbChcbiAgICB1cmxzPzogc3RyaW5nW10sXG4gICAgb3B0cz86IHtcbiAgICAgIGxvY2FsZT86IHN0cmluZztcbiAgICAgIG1heEFnZUluTW9udGhzPzogbnVtYmVyO1xuICAgICAgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgICAgIC8vIEludGVybmFsIG9wdGlvbnMgKGZvciByZWN1cnNpdmUgY2FsbHMpXG4gICAgICBjbG9zZUFwaXM/OiBib29sZWFuO1xuICAgICAgZGVwdGg/OiBudW1iZXI7XG4gICAgfVxuICApOiBQcm9taXNlPExvYWRSZXN1bHQ8SnNvbkZlZWQ+PiB7XG4gICAgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIHVybHMgPSB1cmxzID8/IHRoaXMuZmVlZFVybHM7XG4gICAgb3B0cyA9IHtcbiAgICAgIG1heEFnZUluTW9udGhzOiBvcHRzPy5tYXhBZ2VJbk1vbnRocyA/PyB0aGlzLmVudmlyb25tZW50LmZlZWQ/Lm1heEFnZUluTW9udGhzLFxuICAgICAgbWF4Q29udGVudExlbmd0aDogb3B0cz8ubWF4Q29udGVudExlbmd0aCA/PyB0aGlzLmVudmlyb25tZW50LmZlZWQ/Lm1heENvbnRlbnRMZW5ndGgsXG4gICAgICBsb2NhbGU6IHRoaXMuc2V0dGluZ3MubG9jYWxlLFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBjbG9zZUFwaXM6IHRydWUsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG4gICAgY29uc3QgZmVlZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICh1cmxzIHx8IFtdKS5tYXAoYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEdldCBKU09OXG4gICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHRoaXMubmV0d29yay5mZXRjaCh1cmwpO1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUxvYWRlZCBKU09OIGZyb20gJHt1cmx9YCwganNvbik7XG4gICAgICAgICAgaWYgKEpzb25GZWVkVXRpbHMuaXNKc29uRmVlZChqc29uKSkge1xuICAgICAgICAgICAgLy8gTWlncmF0ZSBvbGQgdmVyc2lvblxuICAgICAgICAgICAgbGV0IGZlZWQgPSBKc29uRmVlZFV0aWxzLm1pZ3JhdGVGZWVkKGpzb24pO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIGl0ZW1zIChlLmcuIHVzaW5nIGZlZWQubmV4dF91cmwpXG4gICAgICAgICAgICBmZWVkID0gYXdhaXQgdGhpcy5yZXNvbHZlRmVlZEl0ZW1zKGZlZWQsIHsgLi4ub3B0cywgZGVwdGg6IG9wdHM/LmRlcHRoID8/IDAgfSk7XG5cbiAgICAgICAgICAgIC8vIFRydW5jYXRlIGh0bWxcbiAgICAgICAgICAgIEpzb25GZWVkVXRpbHMudHJ1bmNhdGVGZWVkSXRlbXNIdG1sKGZlZWQsIG9wdHMpO1xuXG4gICAgICAgICAgICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KGZlZWQ/Lml0ZW1zKSA/IFtmZWVkXSA6IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdldCBkaXNjb3Vyc2VcbiAgICAgICAgICBpZiAoRGlzY291cnNlVXRpbHMuaXNEaXNjb3Vyc2VPYmplY3QoanNvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGFwaSA9IHRoaXMuZ2V0T3JDcmVhdGVEaXNjb3Vyc2VBcGkodXJsKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBEaXNjb3Vyc2VVdGlscy5nZXRGZWVkc0J5VXJsKHVybCwgeyAuLi5vcHRzLCBhcGkgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbG9nUHJlZml4fSBFcnJvciB3aGlsZSBmZXRjaGluZyBmZWVkIGF0ICR7dXJsfS4gNDA0IChOb3QgZm91bmQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbG9nUHJlZml4fSBFcnJvciB3aGlsZSBmZXRjaGluZyBmZWVkIGF0ICR7dXJsfWAsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAob3B0cz8uY2xvc2VBcGlzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5jbG9zZUFwaXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gZmVlZHMuZmxhdCgpO1xuXG4gICAgcmV0dXJuIHsgZGF0YSwgdG90YWw6IGRhdGEubGVuZ3RoIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0T3JDcmVhdGVEaXNjb3Vyc2VBcGkodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gRGlzY291cnNlVXRpbHMuZ2V0RGlzY291cnNlQmFzZVVybCh1cmwpO1xuICAgIGxldCBhcGkgPSB0aGlzLmRpc2NvdXJzZUFwaXMuZ2V0KGJhc2VVcmwpO1xuICAgIGlmICghYXBpKSB7XG4gICAgICBhcGkgPSBuZXcgRGlzY291cnNlQVBJKGJhc2VVcmwpO1xuICAgICAgdGhpcy5kaXNjb3Vyc2VBcGlzLnNldChiYXNlVXJsLCBhcGkpO1xuICAgIH1cbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsb3NlQXBpcygpIHtcbiAgICB0aGlzLmRpc2NvdXJzZUFwaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZXNvbHZlRmVlZEl0ZW1zKGpzb246IEpzb25GZWVkLCBvcHRzPzogeyBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyOyBkZXB0aD86IG51bWJlciB9KTogUHJvbWlzZTxKc29uRmVlZD4ge1xuICAgIGlmICghanNvbikgcmV0dXJuIGpzb247XG5cbiAgICAvLyBMb2FkIGl0ZW1zXG4gICAgaWYgKGlzRW1wdHlBcnJheShqc29uLml0ZW1zKSAmJiBpc05vdE5pbE9yQmxhbmsoanNvbi5uZXh0X3VybCkpIHtcbiAgICAgIGNvbnN0IGRlcHRoID0gb3B0cz8uZGVwdGggPz8gMDtcbiAgICAgIGlmIChkZXB0aCA+PSAzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9TWF4IGRlcHRoIHJlYWNoZWQgKCR7ZGVwdGh9KSBmb3IgJHtqc29uLmZlZWRfdXJsfWApO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCBpdGVtc1xuICAgICAgY29uc3QgZmVlZCA9IGF3YWl0IHRoaXMubG9hZChqc29uLm5leHRfdXJsLCB7IC4uLm9wdHMsIGNsb3NlQXBpczogZmFsc2UsIGRlcHRoOiBkZXB0aCArIDEgfSk7XG5cbiAgICAgIGlmIChpc0VtcHR5QXJyYXkoZmVlZD8uaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBNZXJnZSB3aXRoIHRoZSBpbnB1dCBqc29uXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5qc29uLFxuICAgICAgICB0aXRsZToganNvbi50aXRsZSA/PyBmZWVkLnRpdGxlLFxuICAgICAgICBob21lX3BhZ2VfdXJsOiBqc29uLmhvbWVfcGFnZV91cmwgPz8gZmVlZC5ob21lX3BhZ2VfdXJsLFxuICAgICAgICBhdXRob3JzOiBpc05vdEVtcHR5QXJyYXkoanNvbi5hdXRob3JzKSA/IGpzb24uYXV0aG9ycyA6IGZlZWQuYXV0aG9ycyxcbiAgICAgICAgaXRlbXM6IGZlZWQuaXRlbXMsXG4gICAgICAgIHRhZ190ZW1wbGF0ZToganNvbi50YWdfdGVtcGxhdGUgPz8gZmVlZC50YWdfdGVtcGxhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBqc29uO1xuICB9XG59XG4iXX0=
|