@theia/core 1.25.0-next.7 → 1.25.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/README.md +3 -3
- package/lib/browser/browser.d.ts +3 -0
- package/lib/browser/browser.d.ts.map +1 -1
- package/lib/browser/browser.js +51 -1
- package/lib/browser/browser.js.map +1 -1
- package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
- package/lib/browser/common-frontend-contribution.js +59 -10
- package/lib/browser/common-frontend-contribution.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.d.ts +13 -0
- package/lib/browser/preferences/preference-validation-service.d.ts.map +1 -1
- package/lib/browser/preferences/preference-validation-service.js +92 -7
- package/lib/browser/preferences/preference-validation-service.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.spec.js +58 -0
- package/lib/browser/preferences/preference-validation-service.spec.js.map +1 -1
- package/lib/browser/preloader.d.ts +2 -0
- package/lib/browser/preloader.d.ts.map +1 -0
- package/lib/browser/{nls-loader.js → preloader.js} +25 -6
- package/lib/browser/preloader.js.map +1 -0
- package/lib/browser/quick-input/quick-pick-service-impl.d.ts +1 -1
- package/lib/browser/quick-input/quick-pick-service-impl.d.ts.map +1 -1
- package/lib/browser/quick-input/quick-pick-service-impl.js.map +1 -1
- package/lib/browser/resource-context-key.js +2 -3
- package/lib/browser/resource-context-key.js.map +1 -1
- package/lib/browser/saveable.d.ts +6 -1
- package/lib/browser/saveable.d.ts.map +1 -1
- package/lib/browser/saveable.js.map +1 -1
- package/lib/browser/shell/application-shell.d.ts.map +1 -1
- package/lib/browser/shell/application-shell.js +1 -0
- package/lib/browser/shell/application-shell.js.map +1 -1
- package/lib/browser/status-bar/status-bar.d.ts +2 -0
- package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
- package/lib/browser/status-bar/status-bar.js +2 -1
- package/lib/browser/status-bar/status-bar.js.map +1 -1
- package/lib/browser/tree/tree-widget.d.ts +1 -1
- package/lib/browser/tree/tree-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-widget.js +18 -7
- package/lib/browser/tree/tree-widget.js.map +1 -1
- package/lib/browser/widget-decoration.d.ts +11 -0
- package/lib/browser/widget-decoration.d.ts.map +1 -1
- package/lib/browser/widget-decoration.js +7 -0
- package/lib/browser/widget-decoration.js.map +1 -1
- package/lib/browser/widgets/select-component.d.ts +52 -0
- package/lib/browser/widgets/select-component.d.ts.map +1 -0
- package/lib/browser/widgets/select-component.js +287 -0
- package/lib/browser/widgets/select-component.js.map +1 -0
- package/lib/common/application-protocol.d.ts +3 -0
- package/lib/common/application-protocol.d.ts.map +1 -1
- package/lib/common/disposable.d.ts +1 -0
- package/lib/common/disposable.d.ts.map +1 -1
- package/lib/common/disposable.js +12 -4
- package/lib/common/disposable.js.map +1 -1
- package/lib/common/disposable.spec.d.ts +2 -0
- package/lib/common/disposable.spec.d.ts.map +1 -0
- package/lib/common/disposable.spec.js +31 -0
- package/lib/common/disposable.spec.js.map +1 -0
- package/lib/common/i18n/localization.d.ts +7 -5
- package/lib/common/i18n/localization.d.ts.map +1 -1
- package/lib/common/i18n/localization.js.map +1 -1
- package/lib/common/json-schema.d.ts +1 -0
- package/lib/common/json-schema.d.ts.map +1 -1
- package/lib/common/nls.js +24 -4
- package/lib/common/nls.js.map +1 -1
- package/lib/common/os.d.ts +5 -0
- package/lib/common/os.d.ts.map +1 -1
- package/lib/common/os.js +5 -0
- package/lib/common/os.js.map +1 -1
- package/lib/common/path.d.ts +20 -17
- package/lib/common/path.d.ts.map +1 -1
- package/lib/common/path.js +37 -0
- package/lib/common/path.js.map +1 -1
- package/lib/common/path.spec.js +37 -0
- package/lib/common/path.spec.js.map +1 -1
- package/lib/common/quick-pick-service.d.ts +1 -1
- package/lib/common/quick-pick-service.d.ts.map +1 -1
- package/lib/common/quick-pick-service.js +0 -15
- package/lib/common/quick-pick-service.js.map +1 -1
- package/lib/common/selection-service.d.ts +7 -0
- package/lib/common/selection-service.d.ts.map +1 -1
- package/lib/common/selection-service.js +5 -0
- package/lib/common/selection-service.js.map +1 -1
- package/lib/common/uri.d.ts +12 -1
- package/lib/common/uri.d.ts.map +1 -1
- package/lib/common/uri.js +14 -0
- package/lib/common/uri.js.map +1 -1
- package/lib/electron-browser/menu/electron-menu-contribution.d.ts +1 -0
- package/lib/electron-browser/menu/electron-menu-contribution.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-menu-contribution.js +10 -4
- package/lib/electron-browser/menu/electron-menu-contribution.js.map +1 -1
- package/lib/electron-common/electron-token.d.ts +3 -3
- package/lib/electron-common/electron-token.d.ts.map +1 -1
- package/lib/electron-common/electron-token.js +4 -3
- package/lib/electron-common/electron-token.js.map +1 -1
- package/lib/node/backend-application-module.d.ts.map +1 -1
- package/lib/node/backend-application-module.js +3 -0
- package/lib/node/backend-application-module.js.map +1 -1
- package/lib/node/i18n/localization-backend-contribution.js +1 -1
- package/lib/node/i18n/localization-backend-contribution.js.map +1 -1
- package/lib/node/i18n/localization-contribution.d.ts +4 -3
- package/lib/node/i18n/localization-contribution.d.ts.map +1 -1
- package/lib/node/i18n/localization-contribution.js +15 -10
- package/lib/node/i18n/localization-contribution.js.map +1 -1
- package/lib/node/i18n/localization-provider.d.ts +2 -2
- package/lib/node/i18n/localization-provider.d.ts.map +1 -1
- package/lib/node/i18n/localization-provider.js +9 -4
- package/lib/node/i18n/localization-provider.js.map +1 -1
- package/lib/node/os-backend-application-contribution.d.ts +6 -0
- package/lib/node/os-backend-application-contribution.d.ts.map +1 -0
- package/lib/node/os-backend-application-contribution.js +38 -0
- package/lib/node/os-backend-application-contribution.js.map +1 -0
- package/package.json +5 -5
- package/src/browser/browser.ts +62 -0
- package/src/browser/common-frontend-contribution.ts +68 -10
- package/src/browser/preferences/preference-validation-service.spec.ts +59 -0
- package/src/browser/preferences/preference-validation-service.ts +85 -8
- package/src/browser/{nls-loader.ts → preloader.ts} +26 -4
- package/src/browser/quick-input/quick-pick-service-impl.ts +2 -2
- package/src/browser/resource-context-key.ts +2 -2
- package/src/browser/saveable.ts +3 -1
- package/src/browser/shell/application-shell.ts +1 -0
- package/src/browser/status-bar/status-bar.tsx +4 -1
- package/src/browser/style/select-component.css +96 -0
- package/src/browser/style/tree.css +6 -0
- package/src/browser/style/view-container.css +2 -2
- package/src/browser/tree/tree-widget.tsx +21 -9
- package/src/browser/widget-decoration.ts +14 -0
- package/src/browser/widgets/select-component.tsx +340 -0
- package/src/common/application-protocol.ts +3 -0
- package/src/common/disposable.spec.ts +30 -0
- package/src/common/disposable.ts +15 -4
- package/src/common/i18n/localization.ts +6 -3
- package/src/common/json-schema.ts +1 -0
- package/src/common/nls.ts +25 -4
- package/src/common/os.ts +6 -0
- package/src/common/path.spec.ts +44 -0
- package/src/common/path.ts +40 -0
- package/src/common/quick-pick-service.ts +1 -17
- package/src/common/selection-service.ts +8 -2
- package/src/common/uri.ts +26 -1
- package/src/electron-browser/menu/electron-menu-contribution.ts +11 -4
- package/src/electron-common/electron-token.ts +4 -3
- package/src/node/backend-application-module.ts +4 -0
- package/src/node/i18n/localization-backend-contribution.ts +1 -1
- package/src/node/i18n/localization-contribution.ts +21 -13
- package/src/node/i18n/localization-provider.ts +12 -7
- package/src/node/os-backend-application-contribution.ts +30 -0
- package/lib/browser/nls-loader.d.ts +0 -2
- package/lib/browser/nls-loader.d.ts.map +0 -1
- package/lib/browser/nls-loader.js.map +0 -1
package/src/common/uri.ts
CHANGED
|
@@ -17,7 +17,11 @@
|
|
|
17
17
|
import { URI as Uri } from 'vscode-uri';
|
|
18
18
|
import { Path } from './path';
|
|
19
19
|
|
|
20
|
-
export
|
|
20
|
+
export class URI {
|
|
21
|
+
|
|
22
|
+
public static fromComponents(components: UriComponents): URI {
|
|
23
|
+
return new URI(Uri.revive(components));
|
|
24
|
+
}
|
|
21
25
|
|
|
22
26
|
private readonly codeUri: Uri;
|
|
23
27
|
private _path: Path | undefined;
|
|
@@ -245,4 +249,25 @@ export default class URI {
|
|
|
245
249
|
private hasSameOrigin(uri: URI): boolean {
|
|
246
250
|
return (this.authority === uri.authority) && (this.scheme === uri.scheme);
|
|
247
251
|
}
|
|
252
|
+
|
|
253
|
+
toComponents(): UriComponents {
|
|
254
|
+
return {
|
|
255
|
+
scheme: this.scheme,
|
|
256
|
+
authority: this.authority,
|
|
257
|
+
path: this.path.toString(),
|
|
258
|
+
query: this.query,
|
|
259
|
+
fragment: this.fragment
|
|
260
|
+
};
|
|
261
|
+
}
|
|
248
262
|
}
|
|
263
|
+
|
|
264
|
+
export interface UriComponents {
|
|
265
|
+
scheme: string;
|
|
266
|
+
authority: string;
|
|
267
|
+
path: string;
|
|
268
|
+
query: string;
|
|
269
|
+
fragment: string;
|
|
270
|
+
external?: string;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export default URI;
|
|
@@ -101,10 +101,7 @@ export class ElectronMenuContribution extends BrowserMenuBarContribution impleme
|
|
|
101
101
|
override onStart(app: FrontendApplication): void {
|
|
102
102
|
this.handleTitleBarStyling(app);
|
|
103
103
|
if (isOSX) {
|
|
104
|
-
|
|
105
|
-
// OSX only has one menu bar for all windows, so we need to swap
|
|
106
|
-
// between them as the user switches windows.
|
|
107
|
-
electronRemote.getCurrentWindow().on('focus', () => this.setMenu(app));
|
|
104
|
+
this.attachWindowFocusListener(app);
|
|
108
105
|
}
|
|
109
106
|
// Make sure the application menu is complete, once the frontend application is ready.
|
|
110
107
|
// https://github.com/theia-ide/theia/issues/5100
|
|
@@ -125,6 +122,16 @@ export class ElectronMenuContribution extends BrowserMenuBarContribution impleme
|
|
|
125
122
|
});
|
|
126
123
|
}
|
|
127
124
|
|
|
125
|
+
protected attachWindowFocusListener(app: FrontendApplication): void {
|
|
126
|
+
// OSX: Recreate the menus when changing windows.
|
|
127
|
+
// OSX only has one menu bar for all windows, so we need to swap
|
|
128
|
+
// between them as the user switches windows.
|
|
129
|
+
const targetWindow = electronRemote.getCurrentWindow();
|
|
130
|
+
const callback = () => this.setMenu(app);
|
|
131
|
+
targetWindow.on('focus', callback);
|
|
132
|
+
window.addEventListener('unload', () => targetWindow.off('focus', callback));
|
|
133
|
+
}
|
|
134
|
+
|
|
128
135
|
handleTitleBarStyling(app: FrontendApplication): void {
|
|
129
136
|
this.hideTopPanel(app);
|
|
130
137
|
electron.ipcRenderer.on(TitleBarStyleAtStartup, (_event, style: string) => {
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
* This token is unique
|
|
18
|
+
* This token is unique to the current running instance. It is used by the backend
|
|
19
19
|
* to make sure it is an electron browser window that is connecting to its services.
|
|
20
20
|
*
|
|
21
|
-
* The identifier is a string, which makes it usable as a key for cookies
|
|
21
|
+
* The identifier is a string, which makes it usable as a key for cookies, environments, etc.
|
|
22
22
|
*/
|
|
23
|
-
|
|
23
|
+
// Note that it needs to be uppercase for it to work properly in Windows environments.
|
|
24
|
+
export const ElectronSecurityToken: string = 'THEIA_ELECTRON_TOKEN';
|
|
24
25
|
export interface ElectronSecurityToken {
|
|
25
26
|
value: string;
|
|
26
27
|
};
|
|
@@ -36,6 +36,7 @@ import { ContributionFilterRegistry, ContributionFilterRegistryImpl } from '../c
|
|
|
36
36
|
import { EnvironmentUtils } from './environment-utils';
|
|
37
37
|
import { ProcessUtils } from './process-utils';
|
|
38
38
|
import { bindNodeStopwatch, bindBackendStopwatchServer } from './performance';
|
|
39
|
+
import { OSBackendApplicationContribution } from './os-backend-application-contribution';
|
|
39
40
|
|
|
40
41
|
decorate(injectable(), ApplicationPackage);
|
|
41
42
|
|
|
@@ -111,6 +112,9 @@ export const backendApplicationModule = new ContainerModule(bind => {
|
|
|
111
112
|
bind(EnvironmentUtils).toSelf().inSingletonScope();
|
|
112
113
|
bind(ProcessUtils).toSelf().inSingletonScope();
|
|
113
114
|
|
|
115
|
+
bind(OSBackendApplicationContribution).toSelf().inSingletonScope();
|
|
116
|
+
bind(BackendApplicationContribution).toService(OSBackendApplicationContribution);
|
|
117
|
+
|
|
114
118
|
bindNodeStopwatch(bind);
|
|
115
119
|
bindBackendStopwatchServer(bind);
|
|
116
120
|
});
|
|
@@ -36,7 +36,7 @@ export class LocalizationBackendContribution implements BackendApplicationContri
|
|
|
36
36
|
configure(app: express.Application): void {
|
|
37
37
|
app.get('/i18n/:locale', (req, res) => {
|
|
38
38
|
let locale = req.params.locale;
|
|
39
|
-
locale = this.localizationProvider.getAvailableLanguages().
|
|
39
|
+
locale = this.localizationProvider.getAvailableLanguages().some(e => e.languageId === locale) ? locale : 'en';
|
|
40
40
|
this.localizationProvider.setCurrentLanguage(locale);
|
|
41
41
|
res.send(this.localizationProvider.loadLocalization(locale));
|
|
42
42
|
});
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import * as fs from 'fs-extra';
|
|
18
18
|
import { inject, injectable, named } from 'inversify';
|
|
19
19
|
import { ContributionProvider } from '../../common';
|
|
20
|
-
import { Localization } from '../../common/i18n/localization';
|
|
20
|
+
import { LanguageInfo, Localization } from '../../common/i18n/localization';
|
|
21
21
|
import { LocalizationProvider } from './localization-provider';
|
|
22
22
|
|
|
23
23
|
export const LocalizationContribution = Symbol('LocalizationContribution');
|
|
@@ -45,16 +45,12 @@ export class LocalizationRegistry {
|
|
|
45
45
|
this.localizationProvider.addLocalizations(localization);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
registerLocalizationFromRequire(locale: string, required: unknown): void {
|
|
48
|
+
registerLocalizationFromRequire(locale: string | LanguageInfo, required: unknown): void {
|
|
49
49
|
const translations = this.flattenTranslations(required);
|
|
50
|
-
|
|
51
|
-
languageId: locale,
|
|
52
|
-
translations
|
|
53
|
-
};
|
|
54
|
-
this.registerLocalization(localization);
|
|
50
|
+
this.registerLocalization(this.createLocalization(locale, translations));
|
|
55
51
|
}
|
|
56
52
|
|
|
57
|
-
async registerLocalizationFromFile(localizationPath: string, locale?: string): Promise<void> {
|
|
53
|
+
async registerLocalizationFromFile(localizationPath: string, locale?: string | LanguageInfo): Promise<void> {
|
|
58
54
|
if (!locale) {
|
|
59
55
|
locale = this.identifyLocale(localizationPath);
|
|
60
56
|
}
|
|
@@ -63,11 +59,23 @@ export class LocalizationRegistry {
|
|
|
63
59
|
}
|
|
64
60
|
const translationJson = await fs.readJson(localizationPath);
|
|
65
61
|
const translations = this.flattenTranslations(translationJson);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
62
|
+
this.registerLocalization(this.createLocalization(locale, translations));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
protected createLocalization(locale: string | LanguageInfo, translations: Record<string, string>): Localization {
|
|
66
|
+
let localization: Localization;
|
|
67
|
+
if (typeof locale === 'string') {
|
|
68
|
+
localization = {
|
|
69
|
+
languageId: locale,
|
|
70
|
+
translations
|
|
71
|
+
};
|
|
72
|
+
} else {
|
|
73
|
+
localization = {
|
|
74
|
+
...locale,
|
|
75
|
+
translations
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return localization;
|
|
71
79
|
}
|
|
72
80
|
|
|
73
81
|
protected flattenTranslations(localization: unknown): Record<string, string> {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { injectable } from 'inversify';
|
|
18
|
-
import { Localization } from '../../common/i18n/localization';
|
|
18
|
+
import { LanguageInfo, Localization } from '../../common/i18n/localization';
|
|
19
19
|
|
|
20
20
|
@injectable()
|
|
21
21
|
export class LocalizationProvider {
|
|
@@ -29,11 +29,11 @@ export class LocalizationProvider {
|
|
|
29
29
|
if (!merged) {
|
|
30
30
|
this.localizations.set(localization.languageId, merged = {
|
|
31
31
|
languageId: localization.languageId,
|
|
32
|
-
languageName: localization.languageName,
|
|
33
|
-
localizedLanguageName: localization.localizedLanguageName,
|
|
34
32
|
translations: {}
|
|
35
33
|
});
|
|
36
34
|
}
|
|
35
|
+
merged.languageName = merged.languageName || localization.languageName;
|
|
36
|
+
merged.localizedLanguageName = merged.localizedLanguageName || localization.localizedLanguageName;
|
|
37
37
|
merged.languagePack = merged.languagePack || localization.languagePack;
|
|
38
38
|
Object.assign(merged.translations, localization.translations);
|
|
39
39
|
}
|
|
@@ -47,14 +47,19 @@ export class LocalizationProvider {
|
|
|
47
47
|
return this.currentLanguage;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
getAvailableLanguages(all?: boolean):
|
|
51
|
-
const languageIds:
|
|
50
|
+
getAvailableLanguages(all?: boolean): LanguageInfo[] {
|
|
51
|
+
const languageIds: LanguageInfo[] = [];
|
|
52
52
|
for (const localization of this.localizations.values()) {
|
|
53
53
|
if (all || localization.languagePack) {
|
|
54
|
-
languageIds.push(
|
|
54
|
+
languageIds.push({
|
|
55
|
+
languageId: localization.languageId,
|
|
56
|
+
languageName: localization.languageName,
|
|
57
|
+
languagePack: localization.languagePack,
|
|
58
|
+
localizedLanguageName: localization.localizedLanguageName
|
|
59
|
+
});
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
|
-
return languageIds.sort((a, b) => a.localeCompare(b));
|
|
62
|
+
return languageIds.sort((a, b) => a.languageId.localeCompare(b.languageId));
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
loadLocalization(languageId: string): Localization {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2022 TypeFox and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import * as express from 'express';
|
|
18
|
+
import { injectable } from 'inversify';
|
|
19
|
+
import { BackendApplicationContribution } from './backend-application';
|
|
20
|
+
import { OS } from '../common/os';
|
|
21
|
+
|
|
22
|
+
@injectable()
|
|
23
|
+
export class OSBackendApplicationContribution implements BackendApplicationContribution {
|
|
24
|
+
|
|
25
|
+
configure(app: express.Application): void {
|
|
26
|
+
app.get('/os', (_, res) => {
|
|
27
|
+
res.send(OS.type());
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nls-loader.d.ts","sourceRoot":"","sources":["../../src/browser/nls-loader.ts"],"names":[],"mappings":"AAoBA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYtD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nls-loader.js","sourceRoot":"","sources":["../../src/browser/nls-loader.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;;;AAEhF,uCAAoC;AACpC,yCAAsC;AACtC,iGAA2F;AAEpF,KAAK,UAAU,gBAAgB;IAClC,MAAM,aAAa,GAAG,wEAAiC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC;IAC5E,IAAI,aAAa,IAAI,CAAC,SAAG,CAAC,MAAM,EAAE;QAC9B,MAAM,CAAC,MAAM,CAAC,SAAG,EAAE;YACf,MAAM,EAAE,aAAa;SACxB,CAAC,CAAC;KACN;IACD,IAAI,SAAG,CAAC,MAAM,EAAE;QACZ,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAG,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC;QACvF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,SAAG,CAAC,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;KAC5C;AACL,CAAC;AAZD,4CAYC"}
|