@eggjs/core 6.5.0 → 6.6.0-beta.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.
Files changed (87) hide show
  1. package/README.md +1 -5
  2. package/dist/base_context_class.d.ts +21 -0
  3. package/dist/base_context_class.js +40 -0
  4. package/dist/egg.d.ts +248 -0
  5. package/dist/egg.js +358 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.js +12 -0
  8. package/dist/lifecycle.d.ts +84 -0
  9. package/dist/lifecycle.js +280 -0
  10. package/dist/loader/context_loader.d.ts +39 -0
  11. package/dist/loader/context_loader.js +79 -0
  12. package/dist/loader/egg_loader.d.ts +374 -0
  13. package/dist/loader/egg_loader.js +1184 -0
  14. package/dist/loader/file_loader.d.ts +105 -0
  15. package/dist/loader/file_loader.js +198 -0
  16. package/dist/singleton.d.ts +33 -0
  17. package/dist/singleton.js +107 -0
  18. package/{src/types.ts → dist/types.d.ts} +7 -7
  19. package/dist/utils/index.d.ts +19 -0
  20. package/dist/utils/index.js +103 -0
  21. package/dist/utils/sequencify.d.ts +16 -0
  22. package/dist/utils/sequencify.js +46 -0
  23. package/dist/utils/timing.d.ts +24 -0
  24. package/dist/utils/timing.js +85 -0
  25. package/package.json +34 -72
  26. package/dist/commonjs/base_context_class.d.ts +0 -16
  27. package/dist/commonjs/base_context_class.js +0 -41
  28. package/dist/commonjs/egg.d.ts +0 -246
  29. package/dist/commonjs/egg.js +0 -401
  30. package/dist/commonjs/index.d.ts +0 -12
  31. package/dist/commonjs/index.js +0 -32
  32. package/dist/commonjs/lifecycle.d.ts +0 -78
  33. package/dist/commonjs/lifecycle.js +0 -315
  34. package/dist/commonjs/loader/context_loader.d.ts +0 -35
  35. package/dist/commonjs/loader/context_loader.js +0 -110
  36. package/dist/commonjs/loader/egg_loader.d.ts +0 -369
  37. package/dist/commonjs/loader/egg_loader.js +0 -1558
  38. package/dist/commonjs/loader/file_loader.d.ts +0 -100
  39. package/dist/commonjs/loader/file_loader.js +0 -260
  40. package/dist/commonjs/package.json +0 -3
  41. package/dist/commonjs/singleton.d.ts +0 -29
  42. package/dist/commonjs/singleton.js +0 -124
  43. package/dist/commonjs/types.d.ts +0 -53
  44. package/dist/commonjs/types.js +0 -3
  45. package/dist/commonjs/utils/index.d.ts +0 -17
  46. package/dist/commonjs/utils/index.js +0 -117
  47. package/dist/commonjs/utils/sequencify.d.ts +0 -13
  48. package/dist/commonjs/utils/sequencify.js +0 -64
  49. package/dist/commonjs/utils/timing.d.ts +0 -21
  50. package/dist/commonjs/utils/timing.js +0 -106
  51. package/dist/esm/base_context_class.d.ts +0 -16
  52. package/dist/esm/base_context_class.js +0 -37
  53. package/dist/esm/egg.d.ts +0 -246
  54. package/dist/esm/egg.js +0 -388
  55. package/dist/esm/index.d.ts +0 -12
  56. package/dist/esm/index.js +0 -12
  57. package/dist/esm/lifecycle.d.ts +0 -78
  58. package/dist/esm/lifecycle.js +0 -308
  59. package/dist/esm/loader/context_loader.d.ts +0 -35
  60. package/dist/esm/loader/context_loader.js +0 -102
  61. package/dist/esm/loader/egg_loader.d.ts +0 -369
  62. package/dist/esm/loader/egg_loader.js +0 -1551
  63. package/dist/esm/loader/file_loader.d.ts +0 -100
  64. package/dist/esm/loader/file_loader.js +0 -253
  65. package/dist/esm/package.json +0 -3
  66. package/dist/esm/singleton.d.ts +0 -29
  67. package/dist/esm/singleton.js +0 -117
  68. package/dist/esm/types.d.ts +0 -53
  69. package/dist/esm/types.js +0 -2
  70. package/dist/esm/utils/index.d.ts +0 -17
  71. package/dist/esm/utils/index.js +0 -112
  72. package/dist/esm/utils/sequencify.d.ts +0 -13
  73. package/dist/esm/utils/sequencify.js +0 -61
  74. package/dist/esm/utils/timing.d.ts +0 -21
  75. package/dist/esm/utils/timing.js +0 -99
  76. package/dist/package.json +0 -4
  77. package/src/base_context_class.ts +0 -39
  78. package/src/egg.ts +0 -617
  79. package/src/index.ts +0 -14
  80. package/src/lifecycle.ts +0 -438
  81. package/src/loader/context_loader.ts +0 -123
  82. package/src/loader/egg_loader.ts +0 -1984
  83. package/src/loader/file_loader.ts +0 -349
  84. package/src/singleton.ts +0 -187
  85. package/src/utils/index.ts +0 -132
  86. package/src/utils/sequencify.ts +0 -105
  87. package/src/utils/timing.ts +0 -128
@@ -1,308 +0,0 @@
1
- import assert from 'node:assert';
2
- import { EventEmitter } from 'node:events';
3
- import { debuglog, format } from 'node:util';
4
- import { isClass } from 'is-type-of';
5
- import { Ready as ReadyObject } from 'get-ready';
6
- import { Ready } from 'ready-callback';
7
- import { EggConsoleLogger } from 'egg-logger';
8
- import utils from './utils/index.js';
9
- const debug = debuglog('@eggjs/core/lifecycle');
10
- export class Lifecycle extends EventEmitter {
11
- #init;
12
- #readyObject;
13
- #bootHooks;
14
- #boots;
15
- #isClosed;
16
- #closeFunctionSet;
17
- loadReady;
18
- bootReady;
19
- options;
20
- readyTimeout;
21
- constructor(options) {
22
- super();
23
- options.logger = options.logger ?? new EggConsoleLogger();
24
- this.options = options;
25
- this.#readyObject = new ReadyObject();
26
- this.#bootHooks = [];
27
- this.#boots = [];
28
- this.#closeFunctionSet = new Set();
29
- this.#isClosed = false;
30
- this.#init = false;
31
- this.timing.start(`${this.options.app.type} Start`);
32
- // get app timeout from env or use default timeout 10 second
33
- const eggReadyTimeoutEnv = Number.parseInt(process.env.EGG_READY_TIMEOUT_ENV || '10000');
34
- assert(Number.isInteger(eggReadyTimeoutEnv), `process.env.EGG_READY_TIMEOUT_ENV ${process.env.EGG_READY_TIMEOUT_ENV} should be able to parseInt.`);
35
- this.readyTimeout = eggReadyTimeoutEnv;
36
- this.#initReady();
37
- this.on('ready_stat', data => {
38
- this.logger.info('[@eggjs/core/lifecycle:ready_stat] end ready task %s, remain %j', data.id, data.remain);
39
- }).on('ready_timeout', id => {
40
- this.logger.warn('[@eggjs/core/lifecycle:ready_timeout] %s seconds later %s was still unable to finish.', this.readyTimeout / 1000, id);
41
- });
42
- this.ready(err => {
43
- this.triggerDidReady(err);
44
- debug('app ready');
45
- this.timing.end(`${this.options.app.type} Start`);
46
- });
47
- }
48
- ready(flagOrFunction) {
49
- if (flagOrFunction === undefined) {
50
- return this.#readyObject.ready();
51
- }
52
- return this.#readyObject.ready(flagOrFunction);
53
- }
54
- get app() {
55
- return this.options.app;
56
- }
57
- get logger() {
58
- return this.options.logger;
59
- }
60
- get timing() {
61
- return this.app.timing;
62
- }
63
- legacyReadyCallback(name, opt) {
64
- const timingKeyPrefix = 'readyCallback';
65
- const timing = this.timing;
66
- const cb = this.loadReady.readyCallback(name, opt);
67
- const timingKey = `${timingKeyPrefix} in ` +
68
- utils.getResolvedFilename(name, this.app.baseDir);
69
- this.timing.start(timingKey);
70
- debug('register legacyReadyCallback');
71
- return function legacyReadyCallback(...args) {
72
- timing.end(timingKey);
73
- debug('end legacyReadyCallback');
74
- cb(...args);
75
- };
76
- }
77
- addBootHook(bootHootOrBootClass) {
78
- assert(this.#init === false, 'do not add hook when lifecycle has been initialized');
79
- this.#bootHooks.push(bootHootOrBootClass);
80
- }
81
- addFunctionAsBootHook(hook, fullPath) {
82
- assert(this.#init === false, 'do not add hook when lifecycle has been initialized');
83
- // app.js is exported as a function
84
- // call this function in configDidLoad
85
- class Boot {
86
- static fullPath;
87
- app;
88
- constructor(app) {
89
- this.app = app;
90
- }
91
- configDidLoad() {
92
- hook(this.app);
93
- }
94
- }
95
- Boot.fullPath = fullPath;
96
- this.#bootHooks.push(Boot);
97
- }
98
- /**
99
- * init boots and trigger config did config
100
- */
101
- init() {
102
- debug('%s init lifecycle', this.app.type);
103
- assert(this.#init === false, 'lifecycle have been init');
104
- this.#init = true;
105
- this.#boots = this.#bootHooks.map(BootHootOrBootClass => {
106
- let instance = BootHootOrBootClass;
107
- if (isClass(BootHootOrBootClass)) {
108
- instance = new BootHootOrBootClass(this.app);
109
- if (!instance.fullPath && 'fullPath' in BootHootOrBootClass) {
110
- instance.fullPath = BootHootOrBootClass.fullPath;
111
- }
112
- }
113
- debug('[init] add boot instance: %o', instance.fullPath);
114
- return instance;
115
- });
116
- }
117
- registerBeforeStart(scope, name) {
118
- debug('%s add registerBeforeStart, name: %o', this.options.app.type, name);
119
- this.#registerReadyCallback({
120
- scope,
121
- ready: this.loadReady,
122
- timingKeyPrefix: 'Before Start',
123
- scopeFullName: name,
124
- });
125
- }
126
- registerBeforeClose(fn, fullPath) {
127
- assert(typeof fn === 'function', 'argument should be function');
128
- assert(this.#isClosed === false, 'app has been closed');
129
- if (fullPath) {
130
- fn.fullPath = fullPath;
131
- }
132
- this.#closeFunctionSet.add(fn);
133
- debug('%s register beforeClose at %o, count: %d', this.app.type, fullPath, this.#closeFunctionSet.size);
134
- }
135
- async close() {
136
- // close in reverse order: first created, last closed
137
- const closeFns = Array.from(this.#closeFunctionSet);
138
- debug('%s start trigger %d beforeClose functions', this.app.type, closeFns.length);
139
- for (const fn of closeFns.reverse()) {
140
- debug('%s trigger beforeClose at %o', this.app.type, fn.fullPath);
141
- await utils.callFn(fn);
142
- this.#closeFunctionSet.delete(fn);
143
- }
144
- // Be called after other close callbacks
145
- this.app.emit('close');
146
- this.removeAllListeners();
147
- this.app.removeAllListeners();
148
- this.#isClosed = true;
149
- debug('%s closed', this.app.type);
150
- }
151
- triggerConfigWillLoad() {
152
- debug('trigger configWillLoad start');
153
- for (const boot of this.#boots) {
154
- if (typeof boot.configWillLoad === 'function') {
155
- debug('trigger configWillLoad at %o', boot.fullPath);
156
- boot.configWillLoad();
157
- }
158
- }
159
- debug('trigger configWillLoad end');
160
- this.triggerConfigDidLoad();
161
- }
162
- triggerConfigDidLoad() {
163
- debug('trigger configDidLoad start');
164
- for (const boot of this.#boots) {
165
- if (typeof boot.configDidLoad === 'function') {
166
- debug('trigger configDidLoad at %o', boot.fullPath);
167
- boot.configDidLoad();
168
- }
169
- // function boot hook register after configDidLoad trigger
170
- if (typeof boot.beforeClose === 'function') {
171
- const beforeClose = boot.beforeClose.bind(boot);
172
- this.registerBeforeClose(beforeClose, boot.fullPath);
173
- }
174
- }
175
- debug('trigger configDidLoad end');
176
- this.triggerDidLoad();
177
- }
178
- triggerDidLoad() {
179
- debug('trigger didLoad start');
180
- debug('loadReady start');
181
- this.loadReady.start();
182
- for (const boot of this.#boots) {
183
- if (typeof boot.didLoad === 'function') {
184
- const didLoad = boot.didLoad.bind(boot);
185
- this.#registerReadyCallback({
186
- scope: didLoad,
187
- ready: this.loadReady,
188
- timingKeyPrefix: 'Did Load',
189
- scopeFullName: boot.fullPath + ':didLoad',
190
- });
191
- }
192
- }
193
- }
194
- triggerWillReady() {
195
- debug('trigger willReady start');
196
- debug('bootReady start');
197
- this.bootReady.start();
198
- for (const boot of this.#boots) {
199
- if (typeof boot.willReady === 'function') {
200
- const willReady = boot.willReady.bind(boot);
201
- this.#registerReadyCallback({
202
- scope: willReady,
203
- ready: this.bootReady,
204
- timingKeyPrefix: 'Will Ready',
205
- scopeFullName: boot.fullPath + ':willReady',
206
- });
207
- }
208
- }
209
- }
210
- triggerDidReady(err) {
211
- debug('trigger didReady start');
212
- return (async () => {
213
- for (const boot of this.#boots) {
214
- if (typeof boot.didReady === 'function') {
215
- debug('trigger didReady at %o', boot.fullPath);
216
- try {
217
- await boot.didReady(err);
218
- }
219
- catch (err) {
220
- debug('trigger didReady error at %o, error: %s', boot.fullPath, err);
221
- this.emit('error', err);
222
- }
223
- }
224
- }
225
- debug('trigger didReady end');
226
- })();
227
- }
228
- triggerServerDidReady() {
229
- debug('trigger serverDidReady start');
230
- return (async () => {
231
- for (const boot of this.#boots) {
232
- if (typeof boot.serverDidReady !== 'function') {
233
- continue;
234
- }
235
- debug('trigger serverDidReady at %o', boot.fullPath);
236
- try {
237
- await boot.serverDidReady();
238
- }
239
- catch (err) {
240
- debug('trigger serverDidReady error at %o, error: %s', boot.fullPath, err);
241
- this.emit('error', err);
242
- }
243
- }
244
- debug('trigger serverDidReady end');
245
- })();
246
- }
247
- #initReady() {
248
- debug('loadReady init');
249
- this.loadReady = new Ready({ timeout: this.readyTimeout, lazyStart: true });
250
- this.#delegateReadyEvent(this.loadReady);
251
- this.loadReady.ready((err) => {
252
- debug('loadReady end, err: %o', err);
253
- debug('trigger didLoad end');
254
- if (err) {
255
- this.ready(err);
256
- }
257
- else {
258
- this.triggerWillReady();
259
- }
260
- });
261
- debug('bootReady init');
262
- this.bootReady = new Ready({ timeout: this.readyTimeout, lazyStart: true });
263
- this.#delegateReadyEvent(this.bootReady);
264
- this.bootReady.ready((err) => {
265
- debug('bootReady end, err: %o', err);
266
- debug('trigger willReady end');
267
- this.ready(err || true);
268
- });
269
- }
270
- #delegateReadyEvent(ready) {
271
- ready.once('error', (err) => ready.ready(err));
272
- ready.on('ready_timeout', (id) => this.emit('ready_timeout', id));
273
- ready.on('ready_stat', (data) => this.emit('ready_stat', data));
274
- ready.on('error', (err) => this.emit('error', err));
275
- }
276
- #registerReadyCallback(args) {
277
- const { scope, ready, timingKeyPrefix, scopeFullName } = args;
278
- if (typeof scope !== 'function') {
279
- throw new TypeError('boot only support function');
280
- }
281
- // get filename from stack if scopeFullName is undefined
282
- const name = scopeFullName || utils.getCalleeFromStack(true, 4);
283
- const timingKey = `${timingKeyPrefix} in ` +
284
- utils.getResolvedFilename(name, this.app.baseDir);
285
- this.timing.start(timingKey);
286
- debug('[registerReadyCallback] start name: %o', name);
287
- const done = ready.readyCallback(name);
288
- // ensure scope executes after load completed
289
- process.nextTick(async () => {
290
- try {
291
- await utils.callFn(scope);
292
- debug('[registerReadyCallback] end name: %o', name);
293
- done();
294
- this.timing.end(timingKey);
295
- }
296
- catch (e) {
297
- let err = e;
298
- // avoid non-stringify error: TypeError: Cannot convert object to primitive value
299
- if (!(err instanceof Error)) {
300
- err = new Error(format('%s', err));
301
- }
302
- done(err);
303
- this.timing.end(timingKey);
304
- }
305
- });
306
- }
307
- }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpZmVjeWNsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLElBQUksV0FBVyxFQUF5QixNQUFNLFdBQVcsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTlDLE9BQU8sS0FBSyxNQUFNLGtCQUFrQixDQUFDO0FBSXJDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBc0RoRCxNQUFNLE9BQU8sU0FBVSxTQUFRLFlBQVk7SUFDekMsS0FBSyxDQUFVO0lBQ2YsWUFBWSxDQUFjO0lBQzFCLFVBQVUsQ0FBcUM7SUFDL0MsTUFBTSxDQUFtQjtJQUN6QixTQUFTLENBQVU7SUFDbkIsaUJBQWlCLENBQXVCO0lBQ3hDLFNBQVMsQ0FBUTtJQUNqQixTQUFTLENBQVE7SUFDakIsT0FBTyxDQUFtQjtJQUMxQixZQUFZLENBQVM7SUFFckIsWUFBWSxPQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUNSLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUEyQixDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxH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
@@ -1,35 +0,0 @@
1
- import { FileLoader, type FileLoaderOptions } from './file_loader.js';
2
- import type { Context } from '../egg.js';
3
- export interface ClassLoaderOptions {
4
- ctx: Context;
5
- properties: any;
6
- }
7
- export declare class ClassLoader {
8
- #private;
9
- readonly _cache: Map<any, any>;
10
- _ctx: Context;
11
- constructor(options: ClassLoaderOptions);
12
- }
13
- export interface ContextLoaderOptions extends Omit<FileLoaderOptions, 'target'> {
14
- /** required inject */
15
- inject: Record<string, any>;
16
- /** property name defined to target */
17
- property: string | symbol;
18
- /** determine the field name of inject object. */
19
- fieldClass?: string;
20
- }
21
- /**
22
- * Same as {@link FileLoader}, but it will attach file to `inject[fieldClass]`.
23
- * The exports will be lazy loaded, such as `ctx.group.repository`.
24
- * @augments FileLoader
25
- * @since 1.0.0
26
- */
27
- export declare class ContextLoader extends FileLoader {
28
- #private;
29
- /**
30
- * @class
31
- * @param {Object} options - options same as {@link FileLoader}
32
- * @param {String} options.fieldClass - determine the field name of inject object.
33
- */
34
- constructor(options: ContextLoaderOptions);
35
- }
@@ -1,102 +0,0 @@
1
- import assert from 'node:assert';
2
- import { isClass, isPrimitive } from 'is-type-of';
3
- import { FileLoader, EXPORTS } from './file_loader.js';
4
- const CLASS_LOADER = Symbol('classLoader');
5
- export class ClassLoader {
6
- _cache = new Map();
7
- _ctx;
8
- constructor(options) {
9
- assert(options.ctx, 'options.ctx is required');
10
- const properties = options.properties;
11
- this._ctx = options.ctx;
12
- for (const property in properties) {
13
- this.#defineProperty(property, properties[property]);
14
- }
15
- }
16
- #defineProperty(property, values) {
17
- Object.defineProperty(this, property, {
18
- get() {
19
- let instance = this._cache.get(property);
20
- if (!instance) {
21
- instance = getInstance(values, this._ctx);
22
- this._cache.set(property, instance);
23
- }
24
- return instance;
25
- },
26
- });
27
- }
28
- }
29
- /**
30
- * Same as {@link FileLoader}, but it will attach file to `inject[fieldClass]`.
31
- * The exports will be lazy loaded, such as `ctx.group.repository`.
32
- * @augments FileLoader
33
- * @since 1.0.0
34
- */
35
- export class ContextLoader extends FileLoader {
36
- #inject;
37
- /**
38
- * @class
39
- * @param {Object} options - options same as {@link FileLoader}
40
- * @param {String} options.fieldClass - determine the field name of inject object.
41
- */
42
- constructor(options) {
43
- assert(options.property, 'options.property is required');
44
- assert(options.inject, 'options.inject is required');
45
- const target = {};
46
- if (options.fieldClass) {
47
- options.inject[options.fieldClass] = target;
48
- }
49
- super({
50
- ...options,
51
- target,
52
- });
53
- this.#inject = this.options.inject;
54
- const app = this.#inject;
55
- const property = options.property;
56
- // define ctx.service
57
- Object.defineProperty(app.context, property, {
58
- get() {
59
- // oxlint-disable-next-line unicorn/no-this-assignment, typescript/no-this-alias
60
- const ctx = this;
61
- // distinguish property cache,
62
- // cache's lifecycle is the same with this context instance
63
- // e.x. ctx.service1 and ctx.service2 have different cache
64
- if (!ctx[CLASS_LOADER]) {
65
- ctx[CLASS_LOADER] = new Map();
66
- }
67
- const classLoader = ctx[CLASS_LOADER];
68
- let instance = classLoader.get(property);
69
- if (!instance) {
70
- instance = getInstance(target, ctx);
71
- classLoader.set(property, instance);
72
- }
73
- return instance;
74
- },
75
- });
76
- }
77
- }
78
- function getInstance(values, ctx) {
79
- // it's a directory when it has no exports
80
- // then use ClassLoader
81
- const Class = values[EXPORTS] ? values : null;
82
- let instance;
83
- if (Class) {
84
- if (isClass(Class)) {
85
- instance = new Class(ctx);
86
- }
87
- else {
88
- // it's just an object
89
- instance = Class;
90
- }
91
- // Can't set property to primitive, so check again
92
- // e.x. module.exports = 1;
93
- }
94
- else if (isPrimitive(values)) {
95
- instance = values;
96
- }
97
- else {
98
- instance = new ClassLoader({ ctx, properties: values });
99
- }
100
- return instance;
101
- }
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dF9sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbG9hZGVyL2NvbnRleHRfbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBMEIsTUFBTSxrQkFBa0IsQ0FBQztBQUcvRSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFPM0MsTUFBTSxPQUFPLFdBQVc7SUFDYixNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQVU7SUFFZCxZQUFZLE9BQTJCO1FBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDL0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFFeEIsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxRQUFnQixFQUFFLE1BQVc7UUFDM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3BDLEdBQUc7Z0JBQ0QsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMs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