@foss.global/codefeed 1.6.5 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist_ts/index.js CHANGED
@@ -1,37 +1,263 @@
1
- import * as plugins from './codefeed.plugins.js';
1
+ import * as plugins from './plugins.js';
2
2
  export class CodeFeed {
3
- constructor(baseUrl, token, lastRunTimestamp) {
4
- this.npmRegistry = new plugins.smartnpm.NpmRegistry();
5
- this.smartxmlInstance = new plugins.smartxml.SmartXml();
3
+ constructor(baseUrl, token, lastRunTimestamp, options) {
4
+ this.pageLimit = 50;
5
+ // Raw changelog content for the current repository
6
+ this.changelogContent = '';
7
+ // In-memory stateful cache of commits
8
+ this.enableCache = false;
9
+ this.cache = [];
10
+ // enable or disable npm publishedOnNpm checks (true by default)
11
+ this.enableNpmCheck = true;
12
+ // return only tagged commits (false by default)
13
+ this.enableTaggedOnly = false;
6
14
  this.baseUrl = baseUrl;
7
15
  this.token = token;
8
16
  this.lastRunTimestamp =
9
- lastRunTimestamp || new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
17
+ lastRunTimestamp ?? new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
18
+ // configure stateful caching
19
+ this.enableCache = options?.enableCache ?? false;
20
+ this.cacheWindowMs = options?.cacheWindowMs;
21
+ this.enableNpmCheck = options?.enableNpmCheck ?? true;
22
+ this.enableTaggedOnly = options?.taggedOnly ?? false;
23
+ this.orgAllowlist = options?.orgAllowlist;
24
+ this.orgDenylist = options?.orgDenylist;
25
+ this.repoAllowlist = options?.repoAllowlist;
26
+ this.repoDenylist = options?.repoDenylist;
27
+ this.untilTimestamp = options?.untilTimestamp;
28
+ this.verbose = options?.verbose ?? false;
29
+ this.cache = [];
30
+ this.provider = options?.provider ?? this.createDefaultProvider();
10
31
  console.log('CodeFeed initialized with last run timestamp:', this.lastRunTimestamp);
11
32
  }
33
+ /**
34
+ * Fetch all new commits (since lastRunTimestamp) across all orgs and repos.
35
+ */
36
+ async fetchAllCommitsFromInstance() {
37
+ // Controlled concurrency with AsyncExecutionStack
38
+ const stack = new plugins.lik.AsyncExecutionStack();
39
+ stack.setNonExclusiveMaxConcurrency(20);
40
+ // determine since timestamp for this run (stateful caching)
41
+ let effectiveSince = this.lastRunTimestamp;
42
+ if (this.enableCache && this.cache.length > 0) {
43
+ // use newest timestamp in cache to fetch only tail
44
+ effectiveSince = this.cache.reduce((max, c) => (c.timestamp > max ? c.timestamp : max), effectiveSince);
45
+ }
46
+ // 1) get all organizations
47
+ let orgs = await this.provider.listOrganizations();
48
+ // apply allow/deny filters
49
+ if (this.orgAllowlist && this.orgAllowlist.length > 0) {
50
+ orgs = orgs.filter((o) => this.orgAllowlist.includes(o));
51
+ }
52
+ if (this.orgDenylist && this.orgDenylist.length > 0) {
53
+ orgs = orgs.filter((o) => !this.orgDenylist.includes(o));
54
+ }
55
+ // 2) fetch repos per org in parallel
56
+ const repoLists = await Promise.all(orgs.map((org) => stack.getNonExclusiveExecutionSlot(() => this.provider.listRepositoriesForOrg(org))));
57
+ // flatten to [{ owner, name }]
58
+ let allRepos = orgs.flatMap((org, i) => repoLists[i].map((r) => ({ owner: org, name: r.name })));
59
+ // apply repo allow/deny filters using slug "org/repo"
60
+ if (this.repoAllowlist && this.repoAllowlist.length > 0) {
61
+ const allow = new Set(this.repoAllowlist.map((s) => s.toLowerCase()));
62
+ allRepos = allRepos.filter(({ owner, name }) => allow.has(`${owner}/${name}`.toLowerCase()));
63
+ }
64
+ if (this.repoDenylist && this.repoDenylist.length > 0) {
65
+ const deny = new Set(this.repoDenylist.map((s) => s.toLowerCase()));
66
+ allRepos = allRepos.filter(({ owner, name }) => !deny.has(`${owner}/${name}`.toLowerCase()));
67
+ }
68
+ // 3) probe latest commit per repo and fetch full list only if new commits exist
69
+ const commitJobs = allRepos.map(({ owner, name }) => stack.getNonExclusiveExecutionSlot(async () => {
70
+ try {
71
+ const latestCommit = await this.provider.getLatestCommitForRepo(owner, name);
72
+ // If no commits or no new commits since last run, skip
73
+ if (!latestCommit ||
74
+ new Date(latestCommit.commit.author.date).getTime() <= new Date(effectiveSince).getTime()) {
75
+ return { owner, name, commits: [] };
76
+ }
77
+ // 3b) Fetch commits since last run
78
+ const commits = await this.provider.listCommitsForRepo(owner, name, effectiveSince);
79
+ return { owner, name, commits };
80
+ }
81
+ catch (e) {
82
+ console.error(`Failed to fetch commits for ${owner}/${name}:`, e.message);
83
+ return { owner, name, commits: [] };
84
+ }
85
+ }));
86
+ const commitResults = await Promise.all(commitJobs);
87
+ // 4) build new commit entries with tagging, npm and changelog support
88
+ const newResults = [];
89
+ let reposWithNewCommits = 0;
90
+ for (const { owner, name, commits } of commitResults) {
91
+ // skip repos with no new commits
92
+ if (commits.length === 0) {
93
+ this.changelogContent = '';
94
+ continue;
95
+ }
96
+ reposWithNewCommits++;
97
+ // load changelog for this repo
98
+ this.changelogContent = await this.provider.readChangelogForRepo(owner, name);
99
+ // fetch tags for this repo
100
+ let taggedShas;
101
+ let tagNameBySha;
102
+ try {
103
+ const tagInfo = await this.provider.listTagsForRepo(owner, name);
104
+ taggedShas = tagInfo.shas;
105
+ tagNameBySha = tagInfo.map;
106
+ }
107
+ catch (e) {
108
+ console.error(`Failed to fetch tags for ${owner}/${name}:`, e.message);
109
+ taggedShas = new Set();
110
+ tagNameBySha = new Map();
111
+ }
112
+ // fetch npm package info only if any new commits correspond to a tag
113
+ const hasTaggedCommit = commits.some((c) => taggedShas.has(c.sha));
114
+ let pkgInfo = null;
115
+ if (hasTaggedCommit && this.enableNpmCheck) {
116
+ try {
117
+ const npmRegistry = await this.getNpmRegistry();
118
+ pkgInfo = await npmRegistry.getPackageInfo(`@${owner}/${name}`);
119
+ }
120
+ catch (e) {
121
+ console.error(`Failed to fetch package info for ${owner}/${name}:`, e.message);
122
+ pkgInfo = null;
123
+ }
124
+ }
125
+ // build commit entries
126
+ for (const c of commits) {
127
+ const isTagged = taggedShas.has(c.sha);
128
+ // derive version from tag name if present (strip leading 'v')
129
+ let versionFromTag;
130
+ if (isTagged) {
131
+ const tagName = tagNameBySha.get(c.sha);
132
+ if (tagName) {
133
+ versionFromTag = tagName.startsWith('v') ? tagName.substring(1) : tagName;
134
+ }
135
+ }
136
+ const publishedOnNpm = isTagged && pkgInfo && versionFromTag
137
+ ? pkgInfo.allVersions.some((v) => v.version === versionFromTag)
138
+ : false;
139
+ let changelogEntry;
140
+ if (this.changelogContent) {
141
+ if (versionFromTag) {
142
+ changelogEntry = this.getChangelogForVersion(versionFromTag);
143
+ }
144
+ }
145
+ // optionally enforce an upper bound on commit timestamps
146
+ if (this.untilTimestamp) {
147
+ const ts = new Date(c.commit.author.date).getTime();
148
+ if (ts > new Date(this.untilTimestamp).getTime()) {
149
+ continue;
150
+ }
151
+ }
152
+ newResults.push({
153
+ baseUrl: this.baseUrl,
154
+ org: owner,
155
+ repo: name,
156
+ timestamp: c.commit.author.date,
157
+ prettyAgoTime: plugins.smarttime.getMilliSecondsAsHumanReadableAgoTime(new Date(c.commit.author.date).getTime()),
158
+ hash: c.sha,
159
+ commitMessage: c.commit.message,
160
+ tagged: isTagged,
161
+ publishedOnNpm,
162
+ changelog: changelogEntry,
163
+ });
164
+ }
165
+ }
166
+ // if caching is enabled, merge into in-memory cache and return full cache
167
+ if (this.enableCache) {
168
+ const existingHashes = new Set(this.cache.map((c) => c.hash));
169
+ const uniqueNew = newResults.filter((c) => !existingHashes.has(c.hash));
170
+ this.cache.push(...uniqueNew);
171
+ // trim commits older than window
172
+ if (this.cacheWindowMs !== undefined) {
173
+ const cutoff = Date.now() - this.cacheWindowMs;
174
+ this.cache = this.cache.filter((c) => new Date(c.timestamp).getTime() >= cutoff);
175
+ }
176
+ // advance lastRunTimestamp to now
177
+ this.lastRunTimestamp = new Date().toISOString();
178
+ // sort descending by timestamp
179
+ this.cache.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
180
+ // apply tagged-only filter if requested
181
+ if (this.enableTaggedOnly) {
182
+ return this.cache.filter((c) => c.tagged === true);
183
+ }
184
+ if (this.verbose) {
185
+ console.log(`[CodeFeed] orgs=${orgs.length} repos=${allRepos.length} reposWithNew=${reposWithNewCommits} commits=${this.cache.length} (cached)`);
186
+ }
187
+ return this.cache;
188
+ }
189
+ // no caching: apply tagged-only filter if requested
190
+ // sort and dedupe
191
+ const seen = new Set();
192
+ const unique = newResults.filter((c) => {
193
+ if (seen.has(c.hash))
194
+ return false;
195
+ seen.add(c.hash);
196
+ return true;
197
+ });
198
+ unique.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
199
+ const result = this.enableTaggedOnly ? unique.filter((c) => c.tagged === true) : unique;
200
+ if (this.verbose) {
201
+ console.log(`[CodeFeed] orgs=${orgs.length} repos=${allRepos.length} reposWithNew=${reposWithNewCommits} commits=${result.length}`);
202
+ }
203
+ return result;
204
+ }
12
205
  /**
13
206
  * Load the changelog directly from the Gitea repository.
14
207
  */
15
- async loadChangelogFromRepo(owner, repo) {
16
- const url = `/api/v1/repos/${owner}/${repo}/contents/changelog.md`;
208
+ createDefaultProvider() {
209
+ return {
210
+ listOrganizations: () => this.fetchAllOrganizations(),
211
+ listRepositoriesForOrg: (org) => this.fetchRepositoriesForOrg(org),
212
+ getLatestCommitForRepo: (owner, repo) => this.fetchLatestCommitForRepo(owner, repo),
213
+ listCommitsForRepo: (owner, repo, sinceTimestamp) => this.fetchRecentCommitsForRepo(owner, repo, sinceTimestamp),
214
+ listTagsForRepo: (owner, repo) => this.fetchTags(owner, repo),
215
+ readChangelogForRepo: async (owner, repo) => {
216
+ await this.loadChangelogFromRepo(owner, repo);
217
+ return this.changelogContent;
218
+ },
219
+ };
220
+ }
221
+ createAuthHeaders() {
17
222
  const headers = {};
18
223
  if (this.token) {
19
- headers['Authorization'] = `token ${this.token}`;
224
+ headers.Authorization = `token ${this.token}`;
20
225
  }
21
- const response = await this.fetchFunction(url, { headers });
22
- if (!response.ok) {
23
- console.error(`Could not fetch CHANGELOG.md from ${owner}/${repo}: ${response.status} ${response.statusText}`);
24
- this.changelogContent = '';
25
- return;
226
+ return headers;
227
+ }
228
+ async getNpmRegistry() {
229
+ if (!this.npmRegistry) {
230
+ const smartnpm = await plugins.getSmartnpm();
231
+ this.npmRegistry = new smartnpm.NpmRegistry();
26
232
  }
27
- const data = await response.json();
28
- if (!data.content) {
29
- console.warn(`No content field found in response for ${owner}/${repo}/changelog.md`);
30
- this.changelogContent = '';
31
- return;
233
+ return this.npmRegistry;
234
+ }
235
+ async loadChangelogFromRepo(owner, repo) {
236
+ const headers = this.createAuthHeaders();
237
+ const candidates = [
238
+ 'CHANGELOG.md',
239
+ 'changelog.md',
240
+ 'Changelog.md',
241
+ 'docs/CHANGELOG.md',
242
+ ];
243
+ for (const path of candidates) {
244
+ const url = `/api/v1/repos/${owner}/${repo}/contents/${encodeURIComponent(path)}`;
245
+ const response = await this.fetchFunction(url, { headers });
246
+ if (!response.ok) {
247
+ continue;
248
+ }
249
+ try {
250
+ const data = await response.json();
251
+ if (data && data.content) {
252
+ this.changelogContent = Buffer.from(data.content, 'base64').toString('utf8');
253
+ return;
254
+ }
255
+ }
256
+ catch {
257
+ // continue trying others
258
+ }
32
259
  }
33
- const decodedContent = Buffer.from(data.content, 'base64').toString('utf8');
34
- this.changelogContent = decodedContent;
260
+ this.changelogContent = '';
35
261
  }
36
262
  /**
37
263
  * Parse the changelog to find the entry for a given version.
@@ -62,234 +288,133 @@ export class CodeFeed {
62
288
  }
63
289
  return changelogLines.join('\n').trim();
64
290
  }
65
- async fetchAllOrganizations() {
66
- const url = `/api/v1/orgs`;
67
- const response = await this.fetchFunction(url, {
68
- headers: this.token ? { Authorization: `token ${this.token}` } : {},
69
- });
70
- if (!response.ok) {
71
- throw new Error(`Failed to fetch organizations: ${response.statusText}`);
72
- }
73
- const data = await response.json();
74
- return data.map((org) => org.username);
75
- }
76
- async fetchOrgRssFeed(optionsArg) {
77
- let rssUrl;
78
- if (optionsArg.orgName && !optionsArg.repoName) {
79
- rssUrl = `/${optionsArg.orgName}.atom`;
80
- }
81
- else if (optionsArg.orgName && optionsArg.repoName) {
82
- rssUrl = `/${optionsArg.orgName}/${optionsArg.repoName}.atom`;
83
- }
84
- else {
85
- throw new Error('Invalid arguments provided to fetchOrgRssFeed.');
86
- }
87
- const response = await this.fetchFunction(rssUrl, {});
88
- if (!response.ok) {
89
- throw new Error(`Failed to fetch RSS feed for organization ${optionsArg.orgName}/${optionsArg.repoName}: ${response.statusText}`);
90
- }
91
- const rssText = await response.text();
92
- const rssData = this.smartxmlInstance.parseXmlToObject(rssText);
93
- return rssData.feed.entry || [];
94
- }
95
- async hasNewActivity(optionsArg) {
96
- const entries = await this.fetchOrgRssFeed(optionsArg);
97
- return entries.some((entry) => {
98
- const updated = new Date(entry.updated);
99
- return updated > new Date(this.lastRunTimestamp);
100
- });
101
- }
102
- async fetchAllRepositories() {
291
+ /**
292
+ * Fetch all tags for a given repo and return the set of tagged commit SHAs
293
+ */
294
+ async fetchTags(owner, repo) {
295
+ const taggedShas = new Set();
296
+ const tagNameBySha = new Map();
103
297
  let page = 1;
104
- const allRepos = [];
105
298
  while (true) {
106
- const url = `/api/v1/repos/search?limit=50&page=${page.toString()}`;
299
+ const url = `/api/v1/repos/${owner}/${repo}/tags?limit=${this.pageLimit}&page=${page}`;
107
300
  const resp = await this.fetchFunction(url, {
108
- headers: this.token ? { Authorization: `token ${this.token}` } : {},
301
+ headers: this.createAuthHeaders(),
109
302
  });
110
303
  if (!resp.ok) {
111
- throw new Error(`Failed to fetch repositories: ${resp.statusText}`);
304
+ console.error(`Failed to fetch tags for ${owner}/${repo}: ${resp.status} ${resp.statusText}`);
305
+ return { shas: taggedShas, map: tagNameBySha };
112
306
  }
113
307
  const data = await resp.json();
114
- allRepos.push(...data.data);
115
- if (data.data.length < 50) {
308
+ if (data.length === 0)
116
309
  break;
310
+ for (const t of data) {
311
+ const sha = t.commit?.sha;
312
+ if (sha) {
313
+ taggedShas.add(sha);
314
+ if (t.name)
315
+ tagNameBySha.set(sha, t.name);
316
+ }
117
317
  }
318
+ if (data.length < this.pageLimit)
319
+ break;
118
320
  page++;
119
321
  }
120
- return allRepos;
322
+ return { shas: taggedShas, map: tagNameBySha };
121
323
  }
122
- async fetchTags(owner, repo) {
324
+ async fetchLatestCommitForRepo(owner, repo) {
325
+ const resp = await this.fetchFunction(`/api/v1/repos/${owner}/${repo}/commits?limit=1`, { headers: this.createAuthHeaders() });
326
+ if (!resp.ok) {
327
+ throw new Error(`Probe failed for ${owner}/${repo}: ${resp.statusText}`);
328
+ }
329
+ const data = await resp.json();
330
+ return data[0];
331
+ }
332
+ async fetchAllOrganizations() {
333
+ const headers = this.createAuthHeaders();
123
334
  let page = 1;
124
- const tags = [];
335
+ const orgs = [];
125
336
  while (true) {
126
- const url = `/api/v1/repos/${owner}/${repo}/tags?limit=50&page=${page.toString()}`;
127
- const resp = await this.fetchFunction(url, {
128
- headers: this.token ? { Authorization: `token ${this.token}` } : {},
129
- });
337
+ const resp = await this.fetchFunction(`/api/v1/orgs?limit=${this.pageLimit}&page=${page}`, { headers });
130
338
  if (!resp.ok) {
131
- console.error(`Failed to fetch tags for ${owner}/${repo}: ${resp.status} ${resp.statusText} at ${url}`);
132
- throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${resp.statusText}`);
339
+ throw new Error(`Failed to fetch organizations: ${resp.status} ${resp.statusText}`);
133
340
  }
134
341
  const data = await resp.json();
135
- tags.push(...data);
136
- if (data.length < 50) {
342
+ if (data.length === 0)
343
+ break;
344
+ orgs.push(...data.map((o) => o.username));
345
+ if (data.length < this.pageLimit)
137
346
  break;
138
- }
139
347
  page++;
140
348
  }
141
- const taggedCommitShas = new Set();
142
- for (const t of tags) {
143
- if (t.commit?.sha) {
144
- taggedCommitShas.add(t.commit.sha);
349
+ return orgs;
350
+ }
351
+ async fetchRepositoriesForOrg(org) {
352
+ const headers = this.createAuthHeaders();
353
+ let page = 1;
354
+ const repos = [];
355
+ while (true) {
356
+ const resp = await this.fetchFunction(`/api/v1/orgs/${org}/repos?limit=${this.pageLimit}&page=${page}`, { headers });
357
+ if (!resp.ok) {
358
+ throw new Error(`Failed to fetch repositories for ${org}: ${resp.status} ${resp.statusText}`);
145
359
  }
360
+ const data = await resp.json();
361
+ if (data.length === 0)
362
+ break;
363
+ repos.push(...data);
364
+ if (data.length < this.pageLimit)
365
+ break;
366
+ page++;
146
367
  }
147
- return taggedCommitShas;
368
+ return repos;
148
369
  }
149
- async fetchRecentCommitsForRepo(owner, repo) {
150
- const commitTimeframe = new Date(Date.now() - (7 * 24 * 60 * 60 * 1000));
370
+ async fetchRecentCommitsForRepo(owner, repo, sinceTimestamp) {
371
+ const since = sinceTimestamp ?? this.lastRunTimestamp;
372
+ const headers = this.createAuthHeaders();
151
373
  let page = 1;
152
- const recentCommits = [];
374
+ const commits = [];
153
375
  while (true) {
154
- const url = `/api/v1/repos/${owner}/${repo}/commits?limit=50&page=${page.toString()}`;
155
- const resp = await this.fetchFunction(url, {
156
- headers: this.token ? { Authorization: `token ${this.token}` } : {},
157
- });
376
+ const url = `/api/v1/repos/${owner}/${repo}/commits?since=${encodeURIComponent(since)}&limit=${this.pageLimit}&page=${page}`;
377
+ const resp = await this.fetchFunction(url, { headers });
158
378
  if (!resp.ok) {
159
- console.error(`Failed to fetch commits for ${owner}/${repo}: ${resp.status} ${resp.statusText} at ${url}`);
160
- throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`);
379
+ throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.status} ${resp.statusText}`);
161
380
  }
162
381
  const data = await resp.json();
163
- if (data.length === 0) {
382
+ if (data.length === 0)
383
+ break;
384
+ commits.push(...data);
385
+ if (data.length < this.pageLimit)
164
386
  break;
165
- }
166
- for (const commit of data) {
167
- const commitDate = new Date(commit.commit.author.date);
168
- if (commitDate > commitTimeframe) {
169
- recentCommits.push(commit);
170
- }
171
- else {
172
- return recentCommits;
173
- }
174
- }
175
387
  page++;
176
388
  }
177
- return recentCommits;
389
+ return commits;
178
390
  }
179
- async fetchAllCommitsFromInstance() {
180
- const orgs = await this.fetchAllOrganizations();
181
- console.log(`Found ${orgs.length} organizations`);
182
- let allCommits = [];
183
- for (const orgName of orgs) {
184
- console.log(`Checking activity for organization: ${orgName}`);
391
+ async fetchFunction(urlArg, optionsArg = {}) {
392
+ const maxAttempts = 4;
393
+ let attempt = 0;
394
+ let lastError;
395
+ while (attempt < maxAttempts) {
185
396
  try {
186
- const hasActivity = await this.hasNewActivity({
187
- orgName,
188
- });
189
- if (!hasActivity) {
190
- console.log(`No new activity for organization: ${orgName}`);
397
+ const resp = await fetch(`${this.baseUrl}${urlArg}`, optionsArg);
398
+ // retry on 429 and 5xx
399
+ if (resp.status === 429 || resp.status >= 500) {
400
+ const retryAfter = Number(resp.headers.get('retry-after'));
401
+ const backoffMs = retryAfter
402
+ ? retryAfter * 1000
403
+ : Math.min(32000, 1000 * Math.pow(2, attempt)) + Math.floor(Math.random() * 250);
404
+ await new Promise((r) => setTimeout(r, backoffMs));
405
+ attempt++;
191
406
  continue;
192
407
  }
408
+ return resp;
193
409
  }
194
- catch (error) {
195
- console.error(`Error fetching activity for organization ${orgName}:`, error.message);
196
- continue;
197
- }
198
- console.log(`New activity detected for organization: ${orgName}. Processing repositories...`);
199
- const repos = await this.fetchAllRepositories();
200
- for (const r of repos.filter((repo) => repo.owner.login === orgName)) {
201
- try {
202
- const hasActivity = await this.hasNewActivity({
203
- orgName,
204
- repoName: r.name,
205
- });
206
- if (!hasActivity) {
207
- console.log(`No new activity for repository: ${orgName}/${r.name}`);
208
- continue;
209
- }
210
- }
211
- catch (error) {
212
- console.error(`Error fetching activity for repository ${orgName}/${r.name}:`, error.message);
213
- continue;
214
- }
215
- const org = r.owner.login;
216
- const repo = r.name;
217
- console.log(`Processing repository ${org}/${repo}`);
218
- try {
219
- const taggedCommitShas = await this.fetchTags(org, repo);
220
- const commits = await this.fetchRecentCommitsForRepo(org, repo);
221
- // Load the changelog from this repo.
222
- await this.loadChangelogFromRepo(org, repo);
223
- const commitResults = commits.map((c) => {
224
- const commit = {
225
- baseUrl: this.baseUrl,
226
- org,
227
- repo,
228
- timestamp: c.commit.author.date,
229
- prettyAgoTime: plugins.smarttime.getMilliSecondsAsHumanReadableAgoTime(new Date(c.commit.author.date).getTime()),
230
- hash: c.sha,
231
- commitMessage: c.commit.message,
232
- tagged: taggedCommitShas.has(c.sha),
233
- publishedOnNpm: false,
234
- changelog: undefined,
235
- };
236
- return commit;
237
- });
238
- if (commitResults.length > 0) {
239
- try {
240
- const packageInfo = await this.npmRegistry.getPackageInfo(`@${org}/${repo}`);
241
- for (const commitResult of commitResults.filter((c) => c.tagged)) {
242
- const versionCandidate = commitResult.commitMessage.replace('\n', '').trim();
243
- const correspondingVersion = packageInfo.allVersions.find((versionArg) => {
244
- return versionArg.version === versionCandidate;
245
- });
246
- if (correspondingVersion) {
247
- commitResult.publishedOnNpm = true;
248
- }
249
- }
250
- }
251
- catch (error) {
252
- console.error(`Failed to fetch package info for ${org}/${repo}:`, error.message);
253
- }
254
- try {
255
- for (const commitResult of commitResults.filter((c) => c.tagged)) {
256
- const versionCandidate = commitResult.commitMessage.replace('\n', '').trim();
257
- const changelogEntry = this.getChangelogForVersion(versionCandidate);
258
- if (changelogEntry) {
259
- commitResult.changelog = changelogEntry;
260
- }
261
- }
262
- }
263
- catch (error) {
264
- console.error(`Failed to fetch changelog info for ${org}/${repo}:`, error.message);
265
- }
266
- }
267
- allCommits.push(...commitResults);
268
- }
269
- catch (error) {
270
- console.error(`Skipping repository ${org}/${repo} due to error:`, error.message);
271
- }
410
+ catch (e) {
411
+ lastError = e;
412
+ const backoffMs = Math.min(32000, 1000 * Math.pow(2, attempt)) + Math.floor(Math.random() * 250);
413
+ await new Promise((r) => setTimeout(r, backoffMs));
414
+ attempt++;
272
415
  }
273
416
  }
274
- console.log(`Processed ${allCommits.length} commits in total.`);
275
- allCommits = allCommits
276
- .filter((commitArg) => commitArg.tagged)
277
- .sort((a, b) => b.timestamp.localeCompare(a.timestamp));
278
- console.log(`Filtered to ${allCommits.length} commits with tagged statuses.`);
279
- for (const c of allCommits) {
280
- console.log(` ==========================================================================
281
- ${c.prettyAgoTime} ago:
282
- ${c.org}/${c.repo}
283
- ${c.commitMessage}
284
- Published on npm: ${c.publishedOnNpm}
285
- ${c.changelog ? `Changelog:\n${c.changelog}\n` : ''}
286
- `);
287
- }
288
- return allCommits;
289
- }
290
- async fetchFunction(urlArg, optionsArg) {
291
- const response = await fetch(`${this.baseUrl}${urlArg}`, optionsArg);
292
- return response;
417
+ throw new Error(`fetchFunction failed after retries for ${urlArg}: ${lastError?.message ?? 'unknown error'}`);
293
418
  }
294
419
  }
295
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBRWpELE1BQU0sT0FBTyxRQUFRO0lBUW5CLFlBQVksT0FBZSxFQUFFLEtBQWMsRUFBRSxnQkFBeUI7UUFMOUQsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakQscUJBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBS3pELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0I7WUFDbkIsZ0JBQWdCLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsSUFBWTtRQUM3RCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsS0FBSyxJQUFJLElBQUksd0JBQXdCLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFD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
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLE9BQU8sUUFBUTtJQXlCbkIsWUFDRSxPQUFlLEVBQ2YsS0FBYyxFQUNkLGdCQUF5QixFQUN6QixPQUE2QztRQXpCdkMsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUN2QixtREFBbUQ7UUFDM0MscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBRXRDLHNDQUFzQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3QixVQUFLLEdBQXVDLEVBQUUsQ0FBQztRQUV2RCxnRUFBZ0U7UUFDeEQsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDdkMsZ0RBQWdEO1FBQ3hDLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQWV4QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCO1lBQ25CLGdCQUFnQixJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkYsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxFQUFFLFdBQVcsSUFBSSxLQUFLLENBQUM7UUFDakQsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUM7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDO1FBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxFQUFFLFlBQVksQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sRUFBRSxXQUFXLENBQUM7UUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxFQUFFLFlBQVksQ0FBQztRQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sRUFBRSxjQUFjLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsMkJBQTJCO1FBQ3RDLGtEQUFrRDtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNwRCxLQUFLLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsNERBQTREO1FBQzVELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsbURBQW1EO1lBQ25ELGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDaEMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFDbkQsY0FBYyxDQUNmLENBQUM7UUFDSixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ25ELDJCQUEyQjtRQUMzQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDZixLQUFLLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNwRixDQUNGLENBQUM7UUFDRiwrQkFBK0I7UUFDL0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNyQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDeEQsQ0FBQztRQUNGLHNEQUFzRDtRQUN0RCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFFRCxnRkFBZ0Y7UUFDaEYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FDbEQsS0FBSyxDQUFDLDRCQUE0QixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzVDLElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3RSx1REFBdUQ7Z0JBQ3ZELElBQ0UsQ0FBQyxZQUFZO29CQUNiLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUN6RixDQUFDO29CQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsQ0FBQztnQkFDRCxtQ0FBbUM7Z0JBQ25DLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FDcEQsS0FBSyxFQUNMLElBQUksRUFDSixjQUFjLENBQ2YsQ0FBQztnQkFDRixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsS0FBSyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBELHNFQUFzRTtRQUN0RSxNQUFNLFVBQVUsR0FBdUMsRUFBRSxDQUFDO1FBQzFELElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDckQsaUNBQWlDO1lBQ2pDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztnQkFDM0IsU0FBUztZQUNYLENBQUM7WUFDRCxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLCtCQUErQjtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5RSwyQkFBMkI7WUFDM0IsSUFBSSxVQUF1QixDQUFDO1lBQzVCLElBQUksWUFBaUMsQ0FBQztZQUN0QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pFLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUMxQixZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM3QixDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkUsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7Z0JBQy9CLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztZQUMzQyxDQUFDO1lBQ0QscUVBQXFFO1lBQ3JFLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxPQUFPLEdBQXVELElBQUksQ0FBQztZQUN2RSxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQztvQkFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDaEQsT0FBTyxHQUFHLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEtBQUssSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQy9FLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDO1lBQ0QsdUJBQXVCO1lBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2Qyw4REFBOEQ7Z0JBQzlELElBQUksY0FBa0MsQ0FBQztnQkFDdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDWixjQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUM1RSxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxJQUFJLE9BQU8sSUFBSSxjQUFjO29CQUMxRCxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssY0FBYyxDQUFDO29CQUMvRCxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNWLElBQUksY0FBa0MsQ0FBQztnQkFDdkMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxjQUFjLEVBQUUsQ0FBQzt3QkFDbkIsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDL0QsQ0FBQztnQkFDSCxDQUFDO2dCQUNELHlEQUF5RDtnQkFDekQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNwRCxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzt3QkFDakQsU0FBUztvQkFDWCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLEdBQUcsRUFBRSxLQUFLO29CQUNWLElBQUksRUFBRSxJQUFJO29CQUNWLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJO29CQUMvQixhQUFhLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FDcEUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQ3pDO29CQUNELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRztvQkFDWCxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUMvQixNQUFNLEVBQUUsUUFBUTtvQkFDaEIsY0FBYztvQkFDZCxTQUFTLEVBQUUsY0FBYztpQkFDMUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFDRCwwRUFBMEU7UUFDMUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLGlDQUFpQztZQUNqQyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELGtDQUFrQztZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRCwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRSx3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsbUJBQW1CLElBQUksQ0FBQyxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQU0saUJBQWlCLG1CQUFtQixZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQ3BJLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFDRCxvREFBb0Q7UUFDcEQsa0JBQWtCO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBTSxpQkFBaUIsbUJBQW1CLFlBQVksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUN2SCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNLLHFCQUFxQjtRQUMzQixPQUFPO1lBQ0wsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ3JELHNCQUFzQixFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDO1lBQ2xFLHNCQUFzQixFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDbkYsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDO1lBQ2hILGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztZQUM3RCxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUMxQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQUMsS0FBYSxFQUFFLElBQVk7UUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekMsTUFBTSxVQUFVLEdBQUc7WUFDakIsY0FBYztZQUNkLGNBQWM7WUFDZCxjQUFjO1lBQ2QsbUJBQW1CO1NBQ3BCLENBQUM7UUFDRixLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixLQUFLLElBQUksSUFBSSxhQUFhLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzdFLE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AseUJBQXlCO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxzQkFBc0IsQ0FBQyxPQUFlO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEYsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixNQUFNO1lBQ1IsQ0FBQztZQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBQ0Q7O09BRUc7SUFDSyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixLQUFLLElBQUksSUFBSSxlQUFlLElBQUksQ0FBQyxTQUFTLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDdkYsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRTtnQkFDekMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRTthQUNsQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDOUYsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQ2pELENBQUM7WUFDRCxNQUFNLElBQUksR0FBOEIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsTUFBTTtZQUM3QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNyQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztnQkFDMUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDUixVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwQixJQUFJLENBQUMsQ0FBQyxJQUFJO3dCQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVM7Z0JBQUUsTUFBTTtZQUN4QyxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVPLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxLQUFhLEVBQUUsSUFBWTtRQUNoRSxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQ25DLGlCQUFpQixLQUFLLElBQUksSUFBSSxrQkFBa0IsRUFDaEQsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FDdEMsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLElBQUksR0FBaUMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUI7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLFNBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3hHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN0RixDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQTJCLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE1BQU07WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUztnQkFBRSxNQUFNO1lBQ3hDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxHQUFXO1FBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLE1BQU0sS0FBSyxHQUFxQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDckgsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxHQUFHLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNoRyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQXFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE1BQU07WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3BCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUztnQkFBRSxNQUFNO1lBQ3hDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FDckMsS0FBYSxFQUNiLElBQVksRUFDWixjQUF1QjtRQUV2QixNQUFNLEtBQUssR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLE1BQU0sT0FBTyxHQUFpQyxFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixLQUFLLElBQUksSUFBSSxrQkFBa0Isa0JBQWtCLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsU0FBUyxJQUFJLEVBQUUsQ0FBQztZQUM3SCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQWlDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE1BQU07WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUztnQkFBRSxNQUFNO1lBQ3hDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUN4QixNQUFjLEVBQ2QsYUFBMEIsRUFBRTtRQUU1QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksU0FBYyxDQUFDO1FBQ25CLE9BQU8sT0FBTyxHQUFHLFdBQVcsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2pFLHVCQUF1QjtnQkFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUM5QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztvQkFDM0QsTUFBTSxTQUFTLEdBQUcsVUFBVTt3QkFDMUIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJO3dCQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ25GLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDbkQsT0FBTyxFQUFFLENBQUM7b0JBQ1YsU0FBUztnQkFDWCxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2hCLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ2pHLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLE1BQU0sS0FBSyxTQUFTLEVBQUUsT0FBTyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDaEgsQ0FBQztDQUNGIn0=