@eui/showcase 15.4.0 → 15.4.1

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 (38) hide show
  1. package/LICENSE +296 -296
  2. package/README.md +26 -26
  3. package/esm2020/eui-showcase.mjs +4 -4
  4. package/esm2020/index.mjs +3 -3
  5. package/esm2020/lib/components/doc-page/doc-page.component.mjs +357 -357
  6. package/esm2020/lib/components/doc-page-code/doc-page-code.component.mjs +27 -27
  7. package/esm2020/lib/components/doc-page-code-fab/doc-page-code-fab.component.mjs +39 -39
  8. package/esm2020/lib/components/doc-page-pattern/doc-page-pattern.component.mjs +114 -114
  9. package/esm2020/lib/components/doc-sample/doc-sample.component.mjs +158 -158
  10. package/esm2020/lib/components/doc-sample-api/doc-sample-api.component.mjs +11 -11
  11. package/esm2020/lib/components/doc-section/doc-section.component.mjs +27 -27
  12. package/esm2020/lib/components/doc-section-code/doc-section-code.component.mjs +106 -106
  13. package/esm2020/lib/components/eui-code-highlighter/eui-code-highlighter.component.mjs +21 -21
  14. package/esm2020/lib/components/index.mjs +13 -13
  15. package/esm2020/lib/components/lorem-ipsum/lorem-ipsum-sample.component.mjs +17 -17
  16. package/esm2020/lib/components/playground/playground.component.mjs +198 -198
  17. package/esm2020/lib/components/playground/stackblitz.files.mjs +210 -210
  18. package/esm2020/lib/eui-showcase.module.mjs +150 -150
  19. package/fesm2015/eui-showcase.mjs +1307 -1307
  20. package/fesm2015/eui-showcase.mjs.map +1 -1
  21. package/fesm2020/eui-showcase.mjs +1309 -1309
  22. package/fesm2020/eui-showcase.mjs.map +1 -1
  23. package/index.d.ts +2 -2
  24. package/lib/components/doc-page/doc-page.component.d.ts +90 -90
  25. package/lib/components/doc-page-code/doc-page-code.component.d.ts +8 -8
  26. package/lib/components/doc-page-code-fab/doc-page-code-fab.component.d.ts +15 -15
  27. package/lib/components/doc-page-pattern/doc-page-pattern.component.d.ts +43 -43
  28. package/lib/components/doc-sample/doc-sample.component.d.ts +45 -45
  29. package/lib/components/doc-sample-api/doc-sample-api.component.d.ts +5 -5
  30. package/lib/components/doc-section/doc-section.component.d.ts +10 -10
  31. package/lib/components/doc-section-code/doc-section-code.component.d.ts +44 -44
  32. package/lib/components/eui-code-highlighter/eui-code-highlighter.component.d.ts +9 -9
  33. package/lib/components/index.d.ts +12 -12
  34. package/lib/components/lorem-ipsum/lorem-ipsum-sample.component.d.ts +6 -6
  35. package/lib/components/playground/playground.component.d.ts +61 -61
  36. package/lib/components/playground/stackblitz.files.d.ts +15 -15
  37. package/lib/eui-showcase.module.d.ts +29 -29
  38. package/package.json +2 -2
@@ -1,198 +1,198 @@
1
- import { Component, ElementRef, Input, ViewChild } from '@angular/core';
2
- import sdk from '@stackblitz/sdk';
3
- import { lastValueFrom } from 'rxjs';
4
- import { angularJsonFile, indexHtmlFile, mainFile, PACKAGE_JSON, polyfillsFile, tsConfig } from './stackblitz.files';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@eui/core";
7
- import * as i2 from "@angular/common/http";
8
- import * as i3 from "@eui/components/eui-block-content";
9
- export class PlaygroundComponent {
10
- constructor(renderer, elementRef, appShell, http) {
11
- this.renderer = renderer;
12
- this.elementRef = elementRef;
13
- this.appShell = appShell;
14
- this.http = http;
15
- this.title = 'eUI Playground';
16
- this.activated = false;
17
- this.isLoaded = false;
18
- }
19
- ngOnChanges(changes) {
20
- if (changes.activated) {
21
- if (changes.activated.currentValue) {
22
- this.initStackblitz();
23
- }
24
- else {
25
- this.isLoaded = false;
26
- }
27
- }
28
- }
29
- initStackblitz() {
30
- this.getStackblitzDependencies()
31
- .then((deps) => {
32
- const { dependencies, devDependencies } = deps;
33
- const { selector } = this.extractComponentMetadata(this.typescriptContent);
34
- const moduleName = this.extractModuleName(this.typescriptContent);
35
- return sdk.embedProject('stackblitz', {
36
- title: this.title,
37
- description: `An eUI example for the ${this.title}.`,
38
- template: 'angular-cli',
39
- files: {
40
- 'src/component.html': this.htmlContent,
41
- 'src/component.ts': this.appendVitalNgModules(this.typescriptContent),
42
- // 'src/app.module.ts': moduleFile(className, this.modules),
43
- 'src/main.ts': mainFile(moduleName),
44
- 'src/polyfills.ts': polyfillsFile,
45
- 'src/index.html': indexHtmlFile(selector),
46
- 'angular.json': angularJsonFile,
47
- 'package.json': JSON.stringify({
48
- ...PACKAGE_JSON,
49
- dependencies,
50
- devDependencies,
51
- }, null, 2),
52
- 'tsconfig.json': tsConfig,
53
- },
54
- settings: {
55
- compile: {
56
- trigger: 'auto',
57
- clearConsole: false,
58
- },
59
- },
60
- dependencies,
61
- }, {
62
- openFile: ['component.ts'],
63
- height: 500,
64
- });
65
- })
66
- .then((instance) => {
67
- this.stackblitzInstance = instance;
68
- this.isLoaded = true;
69
- });
70
- }
71
- /**
72
- * Retrieve only the dependencies that stackblitz will need filtered from @eui/deps-base
73
- *
74
- * @private
75
- */
76
- getStackblitzDependencies() {
77
- // a list of dependencies only stackblitz needs
78
- const stackblitzDependencies = [
79
- '@angular/animations',
80
- '@angular/cdk',
81
- '@angular/common',
82
- '@angular/compiler',
83
- '@angular/core',
84
- '@angular/forms',
85
- '@angular/material',
86
- '@angular/material-moment-adapter',
87
- '@angular/platform-browser',
88
- '@angular/platform-browser-dynamic',
89
- '@angular/router',
90
- '@eui/base',
91
- '@eui/components',
92
- '@eui/core',
93
- '@eui/styles',
94
- '@eui/styles-base',
95
- '@ngrx/effects',
96
- '@ngrx/store',
97
- '@ngx-translate/core',
98
- 'localforage',
99
- 'lodash-es',
100
- 'reselect',
101
- 'rxjs',
102
- 'tslib',
103
- 'zone.js',
104
- ];
105
- const stackblitzDevDependencies = ['@angular-devkit/build-angular', '@angular/cli', '@angular/compiler-cli', 'typescript'];
106
- return this.getCurrentShowcaseEuiVersion()
107
- .then((version) => this.retrievePackageDependencies(version))
108
- .then((dependencies) => {
109
- // filter dependencies to only what stackblitz needs
110
- let filteredArr = Object.entries(dependencies).filter((v) => stackblitzDependencies.find((s) => s === v[0]));
111
- const filteredObj = Object.fromEntries(filteredArr);
112
- const extraDependencies = {
113
- uuid: '8.3.2',
114
- 'ngx-device-detector': '3.0.0',
115
- 'ngx-moment': '~6.0.0',
116
- 'ngx-mask': '^14.0.0',
117
- 'cleave.js': '^1.6.0',
118
- moment: '^2.19.3',
119
- extend: '^3.0.2',
120
- };
121
- // filter devDependencies to only what stackblitz needs
122
- filteredArr = Object.entries(dependencies).filter((v) => stackblitzDevDependencies.find((s) => s === v[0]));
123
- dependencies = { ...extraDependencies, ...filteredObj };
124
- const devDependencies = Object.fromEntries(filteredArr);
125
- return { dependencies, devDependencies };
126
- });
127
- }
128
- /**
129
- * Retrieve the dependencies from the package.json file of @eui/deps-base for the given version.
130
- *
131
- * @param version
132
- * @private
133
- */
134
- retrievePackageDependencies(version) {
135
- return fetch(`https://unpkg.com/@eui/deps-base@${version}/package.json`)
136
- .then((response) => response.json())
137
- .then((pkg) => pkg?.dependencies);
138
- }
139
- /**
140
- * Retrieve the eUI version used to build the showcase from application app-metadata.json
141
- *
142
- * @private
143
- */
144
- getCurrentShowcaseEuiVersion() {
145
- return lastValueFrom(this.http.get('assets/app-metadata.json', { responseType: 'json' })).then((res) => res?.appVersion || 'latest');
146
- }
147
- /**
148
- * extract the name of the component class name and selector name from the typescript content
149
- *
150
- * @param contents
151
- * @private
152
- */
153
- extractComponentMetadata(contents) {
154
- const className = contents.match(/export class ([\w\d]+)/);
155
- const selectorName = contents.match(/selector: '([\w\d-]+)'/);
156
- return {
157
- className: className ? className[1] : '',
158
- selector: selectorName ? selectorName[1] : '',
159
- };
160
- }
161
- /**
162
- * extract module class name from the typescript content
163
- *
164
- * @param contents
165
- * @private
166
- */
167
- extractModuleName(contents) {
168
- const moduleClass = contents.match(/export class (\w+Module)/);
169
- return moduleClass ? moduleClass[1] : '';
170
- }
171
- appendVitalNgModules(contents) {
172
- // const imports = contents.match(/imports: \[([\s\S]*?)\]/);
173
- // appends BrowserModule to imports
174
- contents = contents.replace(/imports: \[([\s\S]*?)\]/, `imports: [BrowserModule, $1]`);
175
- // appends import of BrowserModule
176
- return `import { BrowserModule } from '@angular/platform-browser';\n${contents}`;
177
- }
178
- }
179
- /** @nocollapse */ PlaygroundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.UxAppShellService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
180
- /** @nocollapse */ PlaygroundComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: PlaygroundComponent, selector: "eui-playground", inputs: { title: "title", htmlContent: "htmlContent", typescriptContent: "typescriptContent", activated: "activated", modules: "modules" }, viewQueries: [{ propertyName: "stackblitzElWrapper", first: true, predicate: ["container"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<eui-block-content [isBlocked]=\"!isLoaded\">\n <iframe #container id=\"stackblitz\"></iframe>\n</eui-block-content>\n", dependencies: [{ kind: "component", type: i3.EuiBlockContentComponent, selector: "eui-block-content", inputs: ["isBlocked"] }] });
181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, decorators: [{
182
- type: Component,
183
- args: [{ selector: 'eui-playground', template: "<eui-block-content [isBlocked]=\"!isLoaded\">\n <iframe #container id=\"stackblitz\"></iframe>\n</eui-block-content>\n" }]
184
- }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.UxAppShellService }, { type: i2.HttpClient }]; }, propDecorators: { title: [{
185
- type: Input
186
- }], htmlContent: [{
187
- type: Input
188
- }], typescriptContent: [{
189
- type: Input
190
- }], activated: [{
191
- type: Input
192
- }], modules: [{
193
- type: Input
194
- }], stackblitzElWrapper: [{
195
- type: ViewChild,
196
- args: ['container', { read: ElementRef, static: true }]
197
- }] } });
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWdyb3VuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGxheWdyb3VuZC9wbGF5Z3JvdW5kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wbGF5Z3JvdW5kL3BsYXlncm91bmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0csT0FBTyxHQUFnQyxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBTXJILE1BQU0sT0FBTyxtQkFBbUI7SUFpQjVCLFlBQ1ksUUFBbUIsRUFDbkIsVUFBc0IsRUFDdEIsUUFBMkIsRUFDM0IsSUFBZ0I7UUFIaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBQzNCLFNBQUksR0FBSixJQUFJLENBQVk7UUFuQnJCLFVBQUssR0FBRyxnQkFBZ0IsQ0FBQztRQU16QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFXckIsQ0FBQztJQUVKLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNI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QUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3ZGLGtDQUFrQztRQUNsQyxPQUFPLCtEQUErRCxRQUFRLEVBQUUsQ0FBQztJQUNyRixDQUFDOzttSUEvTVEsbUJBQW1CO3VIQUFuQixtQkFBbUIsK1JBWUksVUFBVSxnRUN2QjlDLDJIQUdBOzJGRFFhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDSSxnQkFBZ0I7a0xBS25CLEtBQUs7c0JBRFgsS0FBSztnQkFHQyxXQUFXO3NCQURqQixLQUFLO2dCQUdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFHQyxTQUFTO3NCQURmLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUlFLG1CQUFtQjtzQkFEMUIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVeEFwcFNoZWxsU2VydmljZSB9IGZyb20gJ0BldWkvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHNkaywgeyBQcm9qZWN0RGVwZW5kZW5jaWVzLCBWTSB9IGZyb20gJ0BzdGFja2JsaXR6L3Nkayc7XG5pbXBvcnQgeyBsYXN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBhbmd1bGFySnNvbkZpbGUsIGluZGV4SHRtbEZpbGUsIG1haW5GaWxlLCBQQUNLQUdFX0pTT04sIHBvbHlmaWxsc0ZpbGUsIHRzQ29uZmlnIH0gZnJvbSAnLi9zdGFja2JsaXR6LmZpbGVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdldWktcGxheWdyb3VuZCcsXG4gICAgdGVtcGxhdGVVcmw6IGBwbGF5Z3JvdW5kLmNvbXBvbmVudC5odG1sYCxcbn0pXG5leHBvcnQgY2xhc3MgUGxheWdyb3VuZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdGl0bGUgPSAnZVVJIFBsYXlncm91bmQnO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGh0bWxDb250ZW50OiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHlwZXNjcmlwdENvbnRlbnQ6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtb2R1bGVzOiBbeyBuYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9XTtcbiAgICBwdWJsaWMgaXNMb2FkZWQgPSBmYWxzZTtcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgc3RhY2tibGl0ekVsV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MSUZyYW1lRWxlbWVudD47XG4gICAgLyoqIGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHN0YWNrYmxpdHogVk0gb2JqZWN0ICovXG4gICAgcHJpdmF0ZSBzdGFja2JsaXR6SW5zdGFuY2U6IFZNO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGFwcFNoZWxsOiBVeEFwcFNoZWxsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XG4gICAgKSB7fVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5hY3RpdmF0ZWQpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmFjdGl2YXRlZC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTdGFja2JsaXR6KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFN0YWNrYmxpdHooKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0U3RhY2tibGl0ekRlcGVuZGVuY2llcygpXG4gICAgICAgICAgICAudGhlbigoZGVwcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMgfSA9IGRlcHM7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3RvciB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50TWV0YWRhdGEodGhpcy50eXBlc2NyaXB0Q29udGVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IHRoaXMuZXh0cmFjdE1vZHVsZU5hbWUodGhpcy50eXBlc2NyaXB0Q29udGVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNkay5lbWJlZFByb2plY3QoXG4gICAgICAgICAgICAgICAgICAgICdzdGFja2JsaXR6JyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYEFuIGVVSSBleGFtcGxlIGZvciB0aGUgJHt0aGlzLnRpdGxlfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdhbmd1bGFyLWNsaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29tcG9uZW50Lmh0bWwnOiB0aGlzLmh0bWxDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29tcG9uZW50LnRzJzogdGhpcy5hcHBlbmRWaXRhbE5nTW9kdWxlcyh0aGlzLnR5cGVzY3JpcHRDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnc3JjL2FwcC5tb2R1bGUudHMnOiBtb2R1bGVGaWxlKGNsYXNzTmFtZSwgdGhpcy5tb2R1bGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL21haW4udHMnOiBtYWluRmlsZShtb2R1bGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL3BvbHlmaWxscy50cyc6IHBvbHlmaWxsc0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9pbmRleC5odG1sJzogaW5kZXhIdG1sRmlsZShzZWxlY3RvciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuZ3VsYXIuanNvbic6IGFuZ3VsYXJKc29uRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFja2FnZS5qc29uJzogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLlBBQ0tBR0VfSlNPTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RzY29uZmlnLmpzb24nOiB0c0NvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogJ2F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckNvbnNvbGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuRmlsZTogWydjb21wb25lbnQudHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTAwLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoaW5zdGFuY2U6IFZNKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFja2JsaXR6SW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIG9ubHkgdGhlIGRlcGVuZGVuY2llcyB0aGF0IHN0YWNrYmxpdHogd2lsbCBuZWVkIGZpbHRlcmVkIGZyb20gQGV1aS9kZXBzLWJhc2VcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTdGFja2JsaXR6RGVwZW5kZW5jaWVzKCk6IFByb21pc2U8e1xuICAgICAgICBkZXBlbmRlbmNpZXM6IFByb2plY3REZXBlbmRlbmNpZXM7XG4gICAgICAgIGRldkRlcGVuZGVuY2llczogUHJvamVjdERlcGVuZGVuY2llcztcbiAgICB9PiB7XG4gICAgICAgIC8vIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgb25seSBzdGFja2JsaXR6IG5lZWRzXG4gICAgICAgIGNvbnN0IHN0YWNrYmxpdHpEZXBlbmRlbmNpZXMgPSBbXG4gICAgICAgICAgICAnQGFuZ3VsYXIvYW5pbWF0aW9ucycsXG4gICAgICAgICAgICAnQGFuZ3VsYXIvY2RrJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9jb21tb24nLFxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2NvbXBpbGVyJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9jb3JlJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9mb3JtcycsXG4gICAgICAgICAgICAnQGFuZ3VsYXIvbWF0ZXJpYWwnLFxuICAgICAgICAgICAgJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnLFxuICAgICAgICAgICAgJ0Bhbmd1bGFyL3JvdXRlcicsXG4gICAgICAgICAgICAnQGV1aS9iYXNlJyxcbiAgICAgICAgICAgICdAZXVpL2NvbXBvbmVudHMnLFxuICAgICAgICAgICAgJ0BldWkvY29yZScsXG4gICAgICAgICAgICAnQGV1aS9zdHlsZXMnLFxuICAgICAgICAgICAgJ0BldWkvc3R5bGVzLWJhc2UnLFxuICAgICAgICAgICAgJ0BuZ3J4L2VmZmVjdHMnLFxuICAgICAgICAgICAgJ0BuZ3J4L3N0b3JlJyxcbiAgICAgICAgICAgICdAbmd4LXRyYW5zbGF0ZS9jb3JlJyxcbiAgICAgICAgICAgICdsb2NhbGZvcmFnZScsXG4gICAgICAgICAgICAnbG9kYXNoLWVzJyxcbiAgICAgICAgICAgICdyZXNlbGVjdCcsXG4gICAgICAgICAgICAncnhqcycsXG4gICAgICAgICAgICAndHNsaWInLFxuICAgICAgICAgICAgJ3pvbmUuanMnLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHN0YWNrYmxpdHpEZXZEZXBlbmRlbmNpZXMgPSBbJ0Bhbmd1bGFyLWRldmtpdC9idWlsZC1hbmd1bGFyJywgJ0Bhbmd1bGFyL2NsaScsICdAYW5ndWxhci9jb21waWxlci1jbGknLCAndHlwZXNjcmlwdCddO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRTaG93Y2FzZUV1aVZlcnNpb24oKVxuICAgICAgICAgICAgLnRoZW4oKHZlcnNpb24pID0+IHRoaXMucmV0cmlldmVQYWNrYWdlRGVwZW5kZW5jaWVzKHZlcnNpb24pKVxuICAgICAgICAgICAgLnRoZW4oKGRlcGVuZGVuY2llcykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBkZXBlbmRlbmNpZXMgdG8gb25seSB3aGF0IHN0YWNrYmxpdHogbmVlZHNcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRBcnIgPSBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpLmZpbHRlcigodikgPT4gc3RhY2tibGl0ekRlcGVuZGVuY2llcy5maW5kKChzKSA9PiBzID09PSB2WzBdKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRPYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZmlsdGVyZWRBcnIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJhRGVwZW5kZW5jaWVzID0ge1xuICAgICAgICAgICAgICAgICAgICB1dWlkOiAnOC4zLjInLFxuICAgICAgICAgICAgICAgICAgICAnbmd4LWRldmljZS1kZXRlY3Rvcic6ICczLjAuMCcsXG4gICAgICAgICAgICAgICAgICAgICduZ3gtbW9tZW50JzogJ342LjAuMCcsXG4gICAgICAgICAgICAgICAgICAgICduZ3gtbWFzayc6ICdeMTQuMC4wJyxcbiAgICAgICAgICAgICAgICAgICAgJ2NsZWF2ZS5qcyc6ICdeMS42LjAnLFxuICAgICAgICAgICAgICAgICAgICBtb21lbnQ6ICdeMi4xOS4zJyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kOiAnXjMuMC4yJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBkZXZEZXBlbmRlbmNpZXMgdG8gb25seSB3aGF0IHN0YWNrYmxpdHogbmVlZHNcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZEFyciA9IE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykuZmlsdGVyKCh2KSA9PiBzdGFja2JsaXR6RGV2RGVwZW5kZW5jaWVzLmZpbmQoKHMpID0+IHMgPT09IHZbMF0pKTtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSB7IC4uLmV4dHJhRGVwZW5kZW5jaWVzLCAuLi5maWx0ZXJlZE9iaiB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IE9iamVjdC5mcm9tRW50cmllcyhmaWx0ZXJlZEFycik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcyB9O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBAZXVpL2RlcHMtYmFzZSBmb3IgdGhlIGdpdmVuIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXRyaWV2ZVBhY2thZ2VEZXBlbmRlbmNpZXModmVyc2lvbik6IFByb21pc2U8UHJvamVjdERlcGVuZGVuY2llcz4ge1xuICAgICAgICByZXR1cm4gZmV0Y2goYGh0dHBzOi8vdW5wa2cuY29tL0BldWkvZGVwcy1iYXNlQCR7dmVyc2lvbn0vcGFja2FnZS5qc29uYClcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgICAgICAgLnRoZW4oKHBrZykgPT4gcGtnPy5kZXBlbmRlbmNpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIHRoZSBlVUkgdmVyc2lvbiB1c2VkIHRvIGJ1aWxkIHRoZSBzaG93Y2FzZSBmcm9tIGFwcGxpY2F0aW9uIGFwcC1tZXRhZGF0YS5qc29uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q3VycmVudFNob3djYXNlRXVpVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbGFzdFZhbHVlRnJvbSh0aGlzLmh0dHAuZ2V0PGFueT4oJ2Fzc2V0cy9hcHAtbWV0YWRhdGEuanNvbicsIHsgcmVzcG9uc2VUeXBlOiAnanNvbicgfSkpLnRoZW4oXG4gICAgICAgICAgICAocmVzKSA9PiByZXM/LmFwcFZlcnNpb24gfHwgJ2xhdGVzdCdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHRyYWN0IHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3MgbmFtZSBhbmQgc2VsZWN0b3IgbmFtZSBmcm9tIHRoZSB0eXBlc2NyaXB0IGNvbnRlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZW50c1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50TWV0YWRhdGEoY29udGVudHM6IHN0cmluZyk6IHtcbiAgICAgICAgc2VsZWN0b3I6IHN0cmluZztcbiAgICAgICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgfSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNvbnRlbnRzLm1hdGNoKC9leHBvcnQgY2xhc3MgKFtcXHdcXGRdKykvKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JOYW1lID0gY29udGVudHMubWF0Y2goL3NlbGVjdG9yOiAnKFtcXHdcXGQtXSspJy8pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUgPyBjbGFzc05hbWVbMV0gOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3Rvck5hbWUgPyBzZWxlY3Rvck5hbWVbMV0gOiAnJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHRyYWN0IG1vZHVsZSBjbGFzcyBuYW1lIGZyb20gdGhlIHR5cGVzY3JpcHQgY29udGVudFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRlbnRzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RNb2R1bGVOYW1lKGNvbnRlbnRzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtb2R1bGVDbGFzcyA9IGNvbnRlbnRzLm1hdGNoKC9leHBvcnQgY2xhc3MgKFxcdytNb2R1bGUpLyk7XG4gICAgICAgIHJldHVybiBtb2R1bGVDbGFzcyA/IG1vZHVsZUNsYXNzWzFdIDogJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmRWaXRhbE5nTW9kdWxlcyhjb250ZW50czogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gY29uc3QgaW1wb3J0cyA9IGNvbnRlbnRzLm1hdGNoKC9pbXBvcnRzOiBcXFsoW1xcc1xcU10qPylcXF0vKTtcbiAgICAgICAgLy8gYXBwZW5kcyBCcm93c2VyTW9kdWxlIHRvIGltcG9ydHNcbiAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlKC9pbXBvcnRzOiBcXFsoW1xcc1xcU10qPylcXF0vLCBgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGUsICQxXWApO1xuICAgICAgICAvLyBhcHBlbmRzIGltcG9ydCBvZiBCcm93c2VyTW9kdWxlXG4gICAgICAgIHJldHVybiBgaW1wb3J0IHsgQnJvd3Nlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xcbiR7Y29udGVudHN9YDtcbiAgICB9XG59XG4iLCI8ZXVpLWJsb2NrLWNvbnRlbnQgW2lzQmxvY2tlZF09XCIhaXNMb2FkZWRcIj5cbiAgICA8aWZyYW1lICNjb250YWluZXIgaWQ9XCJzdGFja2JsaXR6XCI+PC9pZnJhbWU+XG48L2V1aS1ibG9jay1jb250ZW50PlxuIl19
1
+ import { Component, ElementRef, Input, ViewChild } from '@angular/core';
2
+ import sdk from '@stackblitz/sdk';
3
+ import { lastValueFrom } from 'rxjs';
4
+ import { angularJsonFile, indexHtmlFile, mainFile, PACKAGE_JSON, polyfillsFile, tsConfig } from './stackblitz.files';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@eui/core";
7
+ import * as i2 from "@angular/common/http";
8
+ import * as i3 from "@eui/components/eui-block-content";
9
+ export class PlaygroundComponent {
10
+ constructor(renderer, elementRef, appShell, http) {
11
+ this.renderer = renderer;
12
+ this.elementRef = elementRef;
13
+ this.appShell = appShell;
14
+ this.http = http;
15
+ this.title = 'eUI Playground';
16
+ this.activated = false;
17
+ this.isLoaded = false;
18
+ }
19
+ ngOnChanges(changes) {
20
+ if (changes.activated) {
21
+ if (changes.activated.currentValue) {
22
+ this.initStackblitz();
23
+ }
24
+ else {
25
+ this.isLoaded = false;
26
+ }
27
+ }
28
+ }
29
+ initStackblitz() {
30
+ this.getStackblitzDependencies()
31
+ .then((deps) => {
32
+ const { dependencies, devDependencies } = deps;
33
+ const { selector } = this.extractComponentMetadata(this.typescriptContent);
34
+ const moduleName = this.extractModuleName(this.typescriptContent);
35
+ return sdk.embedProject('stackblitz', {
36
+ title: this.title,
37
+ description: `An eUI example for the ${this.title}.`,
38
+ template: 'angular-cli',
39
+ files: {
40
+ 'src/component.html': this.htmlContent,
41
+ 'src/component.ts': this.appendVitalNgModules(this.typescriptContent),
42
+ // 'src/app.module.ts': moduleFile(className, this.modules),
43
+ 'src/main.ts': mainFile(moduleName),
44
+ 'src/polyfills.ts': polyfillsFile,
45
+ 'src/index.html': indexHtmlFile(selector),
46
+ 'angular.json': angularJsonFile,
47
+ 'package.json': JSON.stringify({
48
+ ...PACKAGE_JSON,
49
+ dependencies,
50
+ devDependencies,
51
+ }, null, 2),
52
+ 'tsconfig.json': tsConfig,
53
+ },
54
+ settings: {
55
+ compile: {
56
+ trigger: 'auto',
57
+ clearConsole: false,
58
+ },
59
+ },
60
+ dependencies,
61
+ }, {
62
+ openFile: ['component.ts'],
63
+ height: 500,
64
+ });
65
+ })
66
+ .then((instance) => {
67
+ this.stackblitzInstance = instance;
68
+ this.isLoaded = true;
69
+ });
70
+ }
71
+ /**
72
+ * Retrieve only the dependencies that stackblitz will need filtered from @eui/deps-base
73
+ *
74
+ * @private
75
+ */
76
+ getStackblitzDependencies() {
77
+ // a list of dependencies only stackblitz needs
78
+ const stackblitzDependencies = [
79
+ '@angular/animations',
80
+ '@angular/cdk',
81
+ '@angular/common',
82
+ '@angular/compiler',
83
+ '@angular/core',
84
+ '@angular/forms',
85
+ '@angular/material',
86
+ '@angular/material-moment-adapter',
87
+ '@angular/platform-browser',
88
+ '@angular/platform-browser-dynamic',
89
+ '@angular/router',
90
+ '@eui/base',
91
+ '@eui/components',
92
+ '@eui/core',
93
+ '@eui/styles',
94
+ '@eui/styles-base',
95
+ '@ngrx/effects',
96
+ '@ngrx/store',
97
+ '@ngx-translate/core',
98
+ 'localforage',
99
+ 'lodash-es',
100
+ 'reselect',
101
+ 'rxjs',
102
+ 'tslib',
103
+ 'zone.js',
104
+ ];
105
+ const stackblitzDevDependencies = ['@angular-devkit/build-angular', '@angular/cli', '@angular/compiler-cli', 'typescript'];
106
+ return this.getCurrentShowcaseEuiVersion()
107
+ .then((version) => this.retrievePackageDependencies(version))
108
+ .then((dependencies) => {
109
+ // filter dependencies to only what stackblitz needs
110
+ let filteredArr = Object.entries(dependencies).filter((v) => stackblitzDependencies.find((s) => s === v[0]));
111
+ const filteredObj = Object.fromEntries(filteredArr);
112
+ const extraDependencies = {
113
+ uuid: '8.3.2',
114
+ 'ngx-device-detector': '3.0.0',
115
+ 'ngx-moment': '~6.0.0',
116
+ 'ngx-mask': '^14.0.0',
117
+ 'cleave.js': '^1.6.0',
118
+ moment: '^2.19.3',
119
+ extend: '^3.0.2',
120
+ };
121
+ // filter devDependencies to only what stackblitz needs
122
+ filteredArr = Object.entries(dependencies).filter((v) => stackblitzDevDependencies.find((s) => s === v[0]));
123
+ dependencies = { ...extraDependencies, ...filteredObj };
124
+ const devDependencies = Object.fromEntries(filteredArr);
125
+ return { dependencies, devDependencies };
126
+ });
127
+ }
128
+ /**
129
+ * Retrieve the dependencies from the package.json file of @eui/deps-base for the given version.
130
+ *
131
+ * @param version
132
+ * @private
133
+ */
134
+ retrievePackageDependencies(version) {
135
+ return fetch(`https://unpkg.com/@eui/deps-base@${version}/package.json`)
136
+ .then((response) => response.json())
137
+ .then((pkg) => pkg?.dependencies);
138
+ }
139
+ /**
140
+ * Retrieve the eUI version used to build the showcase from application app-metadata.json
141
+ *
142
+ * @private
143
+ */
144
+ getCurrentShowcaseEuiVersion() {
145
+ return lastValueFrom(this.http.get('assets/app-metadata.json', { responseType: 'json' })).then((res) => res?.appVersion || 'latest');
146
+ }
147
+ /**
148
+ * extract the name of the component class name and selector name from the typescript content
149
+ *
150
+ * @param contents
151
+ * @private
152
+ */
153
+ extractComponentMetadata(contents) {
154
+ const className = contents.match(/export class ([\w\d]+)/);
155
+ const selectorName = contents.match(/selector: '([\w\d-]+)'/);
156
+ return {
157
+ className: className ? className[1] : '',
158
+ selector: selectorName ? selectorName[1] : '',
159
+ };
160
+ }
161
+ /**
162
+ * extract module class name from the typescript content
163
+ *
164
+ * @param contents
165
+ * @private
166
+ */
167
+ extractModuleName(contents) {
168
+ const moduleClass = contents.match(/export class (\w+Module)/);
169
+ return moduleClass ? moduleClass[1] : '';
170
+ }
171
+ appendVitalNgModules(contents) {
172
+ // const imports = contents.match(/imports: \[([\s\S]*?)\]/);
173
+ // appends BrowserModule to imports
174
+ contents = contents.replace(/imports: \[([\s\S]*?)\]/, `imports: [BrowserModule, $1]`);
175
+ // appends import of BrowserModule
176
+ return `import { BrowserModule } from '@angular/platform-browser';\n${contents}`;
177
+ }
178
+ }
179
+ /** @nocollapse */ PlaygroundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.UxAppShellService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
180
+ /** @nocollapse */ PlaygroundComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: PlaygroundComponent, selector: "eui-playground", inputs: { title: "title", htmlContent: "htmlContent", typescriptContent: "typescriptContent", activated: "activated", modules: "modules" }, viewQueries: [{ propertyName: "stackblitzElWrapper", first: true, predicate: ["container"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<eui-block-content [isBlocked]=\"!isLoaded\">\r\n <iframe #container id=\"stackblitz\"></iframe>\r\n</eui-block-content>\r\n", dependencies: [{ kind: "component", type: i3.EuiBlockContentComponent, selector: "eui-block-content", inputs: ["isBlocked"] }] });
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, decorators: [{
182
+ type: Component,
183
+ args: [{ selector: 'eui-playground', template: "<eui-block-content [isBlocked]=\"!isLoaded\">\r\n <iframe #container id=\"stackblitz\"></iframe>\r\n</eui-block-content>\r\n" }]
184
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.UxAppShellService }, { type: i2.HttpClient }]; }, propDecorators: { title: [{
185
+ type: Input
186
+ }], htmlContent: [{
187
+ type: Input
188
+ }], typescriptContent: [{
189
+ type: Input
190
+ }], activated: [{
191
+ type: Input
192
+ }], modules: [{
193
+ type: Input
194
+ }], stackblitzElWrapper: [{
195
+ type: ViewChild,
196
+ args: ['container', { read: ElementRef, static: true }]
197
+ }] } });
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWdyb3VuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGxheWdyb3VuZC9wbGF5Z3JvdW5kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wbGF5Z3JvdW5kL3BsYXlncm91bmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0csT0FBTyxHQUFnQyxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBTXJILE1BQU0sT0FBTyxtQkFBbUI7SUFpQjVCLFlBQ1ksUUFBbUIsRUFDbkIsVUFBc0IsRUFDdEIsUUFBMkIsRUFDM0IsSUFBZ0I7UUFIaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBQzNCLFNBQUksR0FBSixJQUFJLENBQVk7UUFuQnJCLFVBQUssR0FBRyxnQkFBZ0IsQ0FBQztRQU16QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFXckIsQ0FBQztJQUVKLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNI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QUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3ZGLGtDQUFrQztRQUNsQyxPQUFPLCtEQUErRCxRQUFRLEVBQUUsQ0FBQztJQUNyRixDQUFDOzttSUEvTVEsbUJBQW1CO3VIQUFuQixtQkFBbUIsK1JBWUksVUFBVSxnRUN2QjlDLGlJQUdBOzJGRFFhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDSSxnQkFBZ0I7a0xBS25CLEtBQUs7c0JBRFgsS0FBSztnQkFHQyxXQUFXO3NCQURqQixLQUFLO2dCQUdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFHQyxTQUFTO3NCQURmLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUlFLG1CQUFtQjtzQkFEMUIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFV4QXBwU2hlbGxTZXJ2aWNlIH0gZnJvbSAnQGV1aS9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHNkaywgeyBQcm9qZWN0RGVwZW5kZW5jaWVzLCBWTSB9IGZyb20gJ0BzdGFja2JsaXR6L3Nkayc7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgYW5ndWxhckpzb25GaWxlLCBpbmRleEh0bWxGaWxlLCBtYWluRmlsZSwgUEFDS0FHRV9KU09OLCBwb2x5ZmlsbHNGaWxlLCB0c0NvbmZpZyB9IGZyb20gJy4vc3RhY2tibGl0ei5maWxlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZXVpLXBsYXlncm91bmQnLFxyXG4gICAgdGVtcGxhdGVVcmw6IGBwbGF5Z3JvdW5kLmNvbXBvbmVudC5odG1sYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYXlncm91bmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0aXRsZSA9ICdlVUkgUGxheWdyb3VuZCc7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGh0bWxDb250ZW50OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHR5cGVzY3JpcHRDb250ZW50OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGFjdGl2YXRlZCA9IGZhbHNlO1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBtb2R1bGVzOiBbeyBuYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9XTtcclxuICAgIHB1YmxpYyBpc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgc3RhY2tibGl0ekVsV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MSUZyYW1lRWxlbWVudD47XHJcbiAgICAvKiogaW5zdGFuY2UgdGhhdCBob2xkcyB0aGUgc3RhY2tibGl0eiBWTSBvYmplY3QgKi9cclxuICAgIHByaXZhdGUgc3RhY2tibGl0ekluc3RhbmNlOiBWTTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgYXBwU2hlbGw6IFV4QXBwU2hlbGxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5hY3RpdmF0ZWQpIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXMuYWN0aXZhdGVkLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U3RhY2tibGl0eigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFN0YWNrYmxpdHooKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nZXRTdGFja2JsaXR6RGVwZW5kZW5jaWVzKClcclxuICAgICAgICAgICAgLnRoZW4oKGRlcHMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMgfSA9IGRlcHM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlbGVjdG9yIH0gPSB0aGlzLmV4dHJhY3RDb21wb25lbnRNZXRhZGF0YSh0aGlzLnR5cGVzY3JpcHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSB0aGlzLmV4dHJhY3RNb2R1bGVOYW1lKHRoaXMudHlwZXNjcmlwdENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNkay5lbWJlZFByb2plY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgJ3N0YWNrYmxpdHonLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQW4gZVVJIGV4YW1wbGUgZm9yIHRoZSAke3RoaXMudGl0bGV9LmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnYW5ndWxhci1jbGknLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb21wb25lbnQuaHRtbCc6IHRoaXMuaHRtbENvbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvbXBvbmVudC50cyc6IHRoaXMuYXBwZW5kVml0YWxOZ01vZHVsZXModGhpcy50eXBlc2NyaXB0Q29udGVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnc3JjL2FwcC5tb2R1bGUudHMnOiBtb2R1bGVGaWxlKGNsYXNzTmFtZSwgdGhpcy5tb2R1bGVzKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvbWFpbi50cyc6IG1haW5GaWxlKG1vZHVsZU5hbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9wb2x5ZmlsbHMudHMnOiBwb2x5ZmlsbHNGaWxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9pbmRleC5odG1sJzogaW5kZXhIdG1sRmlsZShzZWxlY3RvciksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5ndWxhci5qc29uJzogYW5ndWxhckpzb25GaWxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UuanNvbic6IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uUEFDS0FHRV9KU09OLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlcGVuZGVuY2llcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0c2NvbmZpZy5qc29uJzogdHNDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogJ2F1dG8nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQ29uc29sZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5GaWxlOiBbJ2NvbXBvbmVudC50cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDUwMCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbigoaW5zdGFuY2U6IFZNKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrYmxpdHpJbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgb25seSB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgc3RhY2tibGl0eiB3aWxsIG5lZWQgZmlsdGVyZWQgZnJvbSBAZXVpL2RlcHMtYmFzZVxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0U3RhY2tibGl0ekRlcGVuZGVuY2llcygpOiBQcm9taXNlPHtcclxuICAgICAgICBkZXBlbmRlbmNpZXM6IFByb2plY3REZXBlbmRlbmNpZXM7XHJcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzOiBQcm9qZWN0RGVwZW5kZW5jaWVzO1xyXG4gICAgfT4ge1xyXG4gICAgICAgIC8vIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgb25seSBzdGFja2JsaXR6IG5lZWRzXHJcbiAgICAgICAgY29uc3Qgc3RhY2tibGl0ekRlcGVuZGVuY2llcyA9IFtcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnLFxyXG4gICAgICAgICAgICAnQGFuZ3VsYXIvY2RrJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2NvbW1vbicsXHJcbiAgICAgICAgICAgICdAYW5ndWxhci9jb21waWxlcicsXHJcbiAgICAgICAgICAgICdAYW5ndWxhci9jb3JlJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2Zvcm1zJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL21hdGVyaWFsJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInLFxyXG4gICAgICAgICAgICAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL3JvdXRlcicsXHJcbiAgICAgICAgICAgICdAZXVpL2Jhc2UnLFxyXG4gICAgICAgICAgICAnQGV1aS9jb21wb25lbnRzJyxcclxuICAgICAgICAgICAgJ0BldWkvY29yZScsXHJcbiAgICAgICAgICAgICdAZXVpL3N0eWxlcycsXHJcbiAgICAgICAgICAgICdAZXVpL3N0eWxlcy1iYXNlJyxcclxuICAgICAgICAgICAgJ0BuZ3J4L2VmZmVjdHMnLFxyXG4gICAgICAgICAgICAnQG5ncngvc3RvcmUnLFxyXG4gICAgICAgICAgICAnQG5neC10cmFuc2xhdGUvY29yZScsXHJcbiAgICAgICAgICAgICdsb2NhbGZvcmFnZScsXHJcbiAgICAgICAgICAgICdsb2Rhc2gtZXMnLFxyXG4gICAgICAgICAgICAncmVzZWxlY3QnLFxyXG4gICAgICAgICAgICAncnhqcycsXHJcbiAgICAgICAgICAgICd0c2xpYicsXHJcbiAgICAgICAgICAgICd6b25lLmpzJyxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBjb25zdCBzdGFja2JsaXR6RGV2RGVwZW5kZW5jaWVzID0gWydAYW5ndWxhci1kZXZraXQvYnVpbGQtYW5ndWxhcicsICdAYW5ndWxhci9jbGknLCAnQGFuZ3VsYXIvY29tcGlsZXItY2xpJywgJ3R5cGVzY3JpcHQnXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNob3djYXNlRXVpVmVyc2lvbigpXHJcbiAgICAgICAgICAgIC50aGVuKCh2ZXJzaW9uKSA9PiB0aGlzLnJldHJpZXZlUGFja2FnZURlcGVuZGVuY2llcyh2ZXJzaW9uKSlcclxuICAgICAgICAgICAgLnRoZW4oKGRlcGVuZGVuY2llcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGRlcGVuZGVuY2llcyB0byBvbmx5IHdoYXQgc3RhY2tibGl0eiBuZWVkc1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkQXJyID0gT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKS5maWx0ZXIoKHYpID0+IHN0YWNrYmxpdHpEZXBlbmRlbmNpZXMuZmluZCgocykgPT4gcyA9PT0gdlswXSkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRPYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZmlsdGVyZWRBcnIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXh0cmFEZXBlbmRlbmNpZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXVpZDogJzguMy4yJyxcclxuICAgICAgICAgICAgICAgICAgICAnbmd4LWRldmljZS1kZXRlY3Rvcic6ICczLjAuMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJ25neC1tb21lbnQnOiAnfjYuMC4wJyxcclxuICAgICAgICAgICAgICAgICAgICAnbmd4LW1hc2snOiAnXjE0LjAuMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NsZWF2ZS5qcyc6ICdeMS42LjAnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbWVudDogJ14yLjE5LjMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZDogJ14zLjAuMicsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGRldkRlcGVuZGVuY2llcyB0byBvbmx5IHdoYXQgc3RhY2tibGl0eiBuZWVkc1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRBcnIgPSBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpLmZpbHRlcigodikgPT4gc3RhY2tibGl0ekRldkRlcGVuZGVuY2llcy5maW5kKChzKSA9PiBzID09PSB2WzBdKSk7XHJcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSB7IC4uLmV4dHJhRGVwZW5kZW5jaWVzLCAuLi5maWx0ZXJlZE9iaiB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKGZpbHRlcmVkQXJyKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcyB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgb2YgQGV1aS9kZXBzLWJhc2UgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2ZXJzaW9uXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJldHJpZXZlUGFja2FnZURlcGVuZGVuY2llcyh2ZXJzaW9uKTogUHJvbWlzZTxQcm9qZWN0RGVwZW5kZW5jaWVzPiB7XHJcbiAgICAgICAgcmV0dXJuIGZldGNoKGBodHRwczovL3VucGtnLmNvbS9AZXVpL2RlcHMtYmFzZUAke3ZlcnNpb259L3BhY2thZ2UuanNvbmApXHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxyXG4gICAgICAgICAgICAudGhlbigocGtnKSA9PiBwa2c/LmRlcGVuZGVuY2llcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZVVJIHZlcnNpb24gdXNlZCB0byBidWlsZCB0aGUgc2hvd2Nhc2UgZnJvbSBhcHBsaWNhdGlvbiBhcHAtbWV0YWRhdGEuanNvblxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFNob3djYXNlRXVpVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8YW55PignYXNzZXRzL2FwcC1tZXRhZGF0YS5qc29uJywgeyByZXNwb25zZVR5cGU6ICdqc29uJyB9KSkudGhlbihcclxuICAgICAgICAgICAgKHJlcykgPT4gcmVzPy5hcHBWZXJzaW9uIHx8ICdsYXRlc3QnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lIGFuZCBzZWxlY3RvciBuYW1lIGZyb20gdGhlIHR5cGVzY3JpcHQgY29udGVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50c1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50TWV0YWRhdGEoY29udGVudHM6IHN0cmluZyk6IHtcclxuICAgICAgICBzZWxlY3Rvcjogc3RyaW5nO1xyXG4gICAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xyXG4gICAgfSB7XHJcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gY29udGVudHMubWF0Y2goL2V4cG9ydCBjbGFzcyAoW1xcd1xcZF0rKS8pO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yTmFtZSA9IGNvbnRlbnRzLm1hdGNoKC9zZWxlY3RvcjogJyhbXFx3XFxkLV0rKScvKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSA/IGNsYXNzTmFtZVsxXSA6ICcnLFxyXG4gICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3JOYW1lID8gc2VsZWN0b3JOYW1lWzFdIDogJycsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGV4dHJhY3QgbW9kdWxlIGNsYXNzIG5hbWUgZnJvbSB0aGUgdHlwZXNjcmlwdCBjb250ZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV4dHJhY3RNb2R1bGVOYW1lKGNvbnRlbnRzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZUNsYXNzID0gY29udGVudHMubWF0Y2goL2V4cG9ydCBjbGFzcyAoXFx3K01vZHVsZSkvKTtcclxuICAgICAgICByZXR1cm4gbW9kdWxlQ2xhc3MgPyBtb2R1bGVDbGFzc1sxXSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwZW5kVml0YWxOZ01vZHVsZXMoY29udGVudHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgLy8gY29uc3QgaW1wb3J0cyA9IGNvbnRlbnRzLm1hdGNoKC9pbXBvcnRzOiBcXFsoW1xcc1xcU10qPylcXF0vKTtcclxuICAgICAgICAvLyBhcHBlbmRzIEJyb3dzZXJNb2R1bGUgdG8gaW1wb3J0c1xyXG4gICAgICAgIGNvbnRlbnRzID0gY29udGVudHMucmVwbGFjZSgvaW1wb3J0czogXFxbKFtcXHNcXFNdKj8pXFxdLywgYGltcG9ydHM6IFtCcm93c2VyTW9kdWxlLCAkMV1gKTtcclxuICAgICAgICAvLyBhcHBlbmRzIGltcG9ydCBvZiBCcm93c2VyTW9kdWxlXHJcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XFxuJHtjb250ZW50c31gO1xyXG4gICAgfVxyXG59XHJcbiIsIjxldWktYmxvY2stY29udGVudCBbaXNCbG9ja2VkXT1cIiFpc0xvYWRlZFwiPlxyXG4gICAgPGlmcmFtZSAjY29udGFpbmVyIGlkPVwic3RhY2tibGl0elwiPjwvaWZyYW1lPlxyXG48L2V1aS1ibG9jay1jb250ZW50PlxyXG4iXX0=