@dotglitch/ngx-common 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +24 -0
  2. package/components/dynamic-html/dynamic-html.component.d.ts +15 -0
  3. package/components/dynamic-html/dynamic-html.module.d.ts +10 -0
  4. package/components/dynamic-html/dynamic-html.service.d.ts +18 -0
  5. package/components/dynamic-html/types.d.ts +12 -0
  6. package/components/lazy-loader/lazy-loader.component.d.ts +146 -0
  7. package/components/lazy-loader/lazy-loader.module.d.ts +10 -0
  8. package/components/lazy-loader/lazy-loader.service.d.ts +71 -0
  9. package/components/lazy-loader/types.d.ts +142 -0
  10. package/components/menu/menu.component.d.ts +52 -0
  11. package/components/tooltip/tooltip.component.d.ts +35 -0
  12. package/directives/menu.directive.d.ts +27 -0
  13. package/directives/tooltip.directive.d.ts +26 -0
  14. package/directives/utils.d.ts +8 -0
  15. package/esm2020/components/dynamic-html/dynamic-html.component.mjs +43 -0
  16. package/esm2020/components/dynamic-html/dynamic-html.module.mjs +27 -0
  17. package/esm2020/components/dynamic-html/dynamic-html.service.mjs +66 -0
  18. package/esm2020/components/dynamic-html/types.mjs +7 -0
  19. package/esm2020/components/lazy-loader/lazy-loader.component.mjs +360 -0
  20. package/esm2020/components/lazy-loader/lazy-loader.module.mjs +29 -0
  21. package/esm2020/components/lazy-loader/lazy-loader.service.mjs +215 -0
  22. package/esm2020/components/lazy-loader/types.mjs +26 -0
  23. package/esm2020/components/menu/menu.component.mjs +316 -0
  24. package/esm2020/components/tooltip/tooltip.component.mjs +135 -0
  25. package/esm2020/directives/menu.directive.mjs +112 -0
  26. package/esm2020/directives/tooltip.directive.mjs +92 -0
  27. package/esm2020/directives/utils.mjs +120 -0
  28. package/esm2020/dotglitch-ngx-common.mjs +5 -0
  29. package/esm2020/pipes/html-bypass.pipe.mjs +27 -0
  30. package/esm2020/pipes/resource-bypass.pipe.mjs +27 -0
  31. package/esm2020/pipes/script-bypass.pipe.mjs +27 -0
  32. package/esm2020/pipes/style-bypass.pipe.mjs +27 -0
  33. package/esm2020/pipes/url-bypass.pipe.mjs +27 -0
  34. package/esm2020/public-api.mjs +39 -0
  35. package/esm2020/services/dependency.service.mjs +55 -0
  36. package/esm2020/services/dialog.service.mjs +66 -0
  37. package/esm2020/services/fetch.service.mjs +71 -0
  38. package/esm2020/services/keyboard.service.mjs +128 -0
  39. package/esm2020/types/menu.mjs +2 -0
  40. package/esm2020/types/popup.mjs +2 -0
  41. package/esm2020/utils/index.mjs +39 -0
  42. package/fesm2015/dotglitch-ngx-common.mjs +1997 -0
  43. package/fesm2015/dotglitch-ngx-common.mjs.map +1 -0
  44. package/fesm2020/dotglitch-ngx-common.mjs +1977 -0
  45. package/fesm2020/dotglitch-ngx-common.mjs.map +1 -0
  46. package/index.d.ts +5 -0
  47. package/package.json +60 -0
  48. package/pipes/html-bypass.pipe.d.ts +16 -0
  49. package/pipes/resource-bypass.pipe.d.ts +16 -0
  50. package/pipes/script-bypass.pipe.d.ts +16 -0
  51. package/pipes/style-bypass.pipe.d.ts +16 -0
  52. package/pipes/url-bypass.pipe.d.ts +16 -0
  53. package/public-api.d.ts +34 -0
  54. package/services/dependency.service.d.ts +19 -0
  55. package/services/dialog.service.d.ts +41 -0
  56. package/services/fetch.service.d.ts +28 -0
  57. package/services/keyboard.service.d.ts +79 -0
  58. package/types/menu.d.ts +90 -0
  59. package/types/popup.d.ts +27 -0
  60. package/utils/index.d.ts +19 -0
@@ -0,0 +1,215 @@
1
+ import { Inject, Injectable, InjectionToken } from '@angular/core';
2
+ import { ComponentResolveStrategy } from './types';
3
+ import { stringToSlug, Logger } from '../../utils';
4
+ import * as i0 from "@angular/core";
5
+ // Monkey-patch the type of these symbols.
6
+ const $id = Symbol("id");
7
+ const $group = Symbol("group");
8
+ export const NGX_LAZY_LOADER_CONFIG = new InjectionToken('config');
9
+ export class LazyLoaderService {
10
+ get err() { return LazyLoaderService.config.logger.err; }
11
+ get log() { return LazyLoaderService.config.logger.log; }
12
+ get warn() { return LazyLoaderService.config.logger.warn; }
13
+ constructor(config = {}) {
14
+ // Ensure this is singleton and works regardless of special instancing requirements.
15
+ LazyLoaderService.configure(config);
16
+ }
17
+ static configure(config) {
18
+ const { log, warn, err } = Logger("ngx-lazy-loader", "#009688");
19
+ this.config = {
20
+ componentResolveStrategy: ComponentResolveStrategy.PickFirst,
21
+ logger: {
22
+ log,
23
+ warn,
24
+ err
25
+ },
26
+ ...config
27
+ };
28
+ config.entries?.forEach(e => this.addComponentToRegistry(e));
29
+ // If a custom resolution strategy is provided but no resolution function is passed,
30
+ // we throw an error
31
+ if (this.config.componentResolveStrategy == ComponentResolveStrategy.Custom &&
32
+ !this.config.customResolver) {
33
+ throw new Error("Cannot initialize. Configuration specifies a custom resolve matcher but none was provided");
34
+ }
35
+ if (this.config.loaderDistractorComponent && this.config.loaderDistractorTemplate)
36
+ throw new Error("Cannot have both a Component and Template for Distractor view.");
37
+ if (this.config.errorComponent && this.config.errorTemplate)
38
+ throw new Error("Cannot have both a Component and Template for Error view.");
39
+ if (this.config.notFoundComponent && this.config.notFoundTemplate)
40
+ throw new Error("Cannot have both a Component and Template for NotFound view.");
41
+ }
42
+ static addComponentToRegistry(registration) {
43
+ if (!registration)
44
+ throw new Error("Cannot add <undefined> component into registry.");
45
+ // Clone the object into our repository and transfer the id into a standardized slug format
46
+ const id = stringToSlug(registration.id ?? Date.now().toString()); // purge non-basic ASCII chars
47
+ const group = registration.group || "default";
48
+ registration[$id] = id;
49
+ registration[$group] = id;
50
+ if (!this.registry[group])
51
+ this.registry[group] = [];
52
+ // Check if we already have a registration for the component
53
+ // if (this.registry[group] && typeof this.registry[group]['load'] == "function") {
54
+ // // Warn the developer that the state is problematic
55
+ // this.config.logger.warn(
56
+ // `A previous entry already exists for ${id}! The old registration will be overridden.` +
57
+ // `Please ensure you use groups if you intend to have duplicate component ids. ` +
58
+ // `If this was intentional, first remove the old component from the registry before adding a new instance`
59
+ // );
60
+ // // If we're in dev mode, break the loader surface
61
+ // if (isDevMode())
62
+ // return;
63
+ // }
64
+ this.registry[group].push(registration);
65
+ }
66
+ /**
67
+ * Register an Angular component
68
+ * @param id identifier that is used to resolve the component
69
+ * @param group
70
+ * @param component Angular Component Class constructor
71
+ */
72
+ registerComponent(args) {
73
+ if (this.isComponentRegistered(args.id, args.group)) {
74
+ this.log(`Will not re-register component '${args.id}' in group '${args.group || 'default'}' `);
75
+ return;
76
+ }
77
+ LazyLoaderService.addComponentToRegistry({
78
+ id: stringToSlug(args.id),
79
+ matcher: args.matcher,
80
+ group: stringToSlug(args.group || "default"),
81
+ load: args.load || (() => args.component)
82
+ });
83
+ }
84
+ /**
85
+ *
86
+ * @param id
87
+ * @param group
88
+ */
89
+ unregisterComponent(id, group = "default") {
90
+ const _id = stringToSlug(id);
91
+ const _group = stringToSlug(group);
92
+ if (!this.resolveRegistrationEntry(id, group))
93
+ throw new Error("Cannot unregister component ${}! Component is not present in registry");
94
+ // TODO: handle clearing running instances
95
+ delete LazyLoaderService.registry[_group][_id];
96
+ }
97
+ /**
98
+ * Get the registration entry for a component.
99
+ * Returns null if component is not in the registry.
100
+ */
101
+ resolveRegistrationEntry(value, group = "default") {
102
+ const _id = stringToSlug(value);
103
+ const _group = stringToSlug(group);
104
+ const targetGroup = (LazyLoaderService.registry[_group] || []);
105
+ let items = targetGroup.filter(t => {
106
+ if (!t)
107
+ return false;
108
+ // No matcher, check id
109
+ if (!t.matcher)
110
+ return t[$id] == _id;
111
+ // Matcher is regex
112
+ if (t.matcher instanceof RegExp)
113
+ return t.matcher.test(_id) || t.matcher.test(value);
114
+ // Matcher is string => regex
115
+ if (typeof t.matcher == 'string') {
116
+ const rx = new RegExp(t.matcher, 'ui');
117
+ return rx.test(_id) || rx.test(value);
118
+ }
119
+ // Matcher is array
120
+ if (Array.isArray(t.matcher)) {
121
+ return !!t.matcher.find(e => stringToSlug(e) == _id);
122
+ }
123
+ // Custom matcher function
124
+ if (typeof t.matcher == "function")
125
+ return t.matcher(_id);
126
+ return false;
127
+ });
128
+ if (items.length > 1) {
129
+ this.warn("Resolved multiple components for the provided `[component]` binding. This may cause UI conflicts.");
130
+ }
131
+ if (items.length == 0) {
132
+ return null;
133
+ }
134
+ const out = items[0];
135
+ if (out.matcher instanceof RegExp) {
136
+ const result = _id.match(out.matcher) || value.match(out.matcher);
137
+ return {
138
+ entry: out,
139
+ matchGroups: result?.groups
140
+ };
141
+ }
142
+ return { entry: out };
143
+ }
144
+ /**
145
+ * Check if a component is currently registered
146
+ * Can be used to validate regex matchers and aliases.
147
+ */
148
+ isComponentRegistered(value, group = "default") {
149
+ return !!this.resolveRegistrationEntry(value, group);
150
+ }
151
+ /**
152
+ *
153
+ * @param bundle
154
+ * @returns The component `Object` if a component was resolved, `null` if no component was found
155
+ * `false` if the specified strategy was an invalid selection
156
+ */
157
+ resolveComponent(id, group, modules) {
158
+ switch (LazyLoaderService.config.componentResolveStrategy) {
159
+ case ComponentResolveStrategy.PickFirst: {
160
+ return modules[0];
161
+ }
162
+ // Exact id -> classname match
163
+ case ComponentResolveStrategy.MatchIdToClassName: {
164
+ const matches = modules
165
+ .filter(k => k.name == id);
166
+ if (matches.length == 0)
167
+ return null;
168
+ return matches[0];
169
+ }
170
+ // Fuzzy id -> classname match
171
+ case ComponentResolveStrategy.FuzzyIdClassName: {
172
+ const _id = id.replace(/[^a-z0-9_\-]/ig, '');
173
+ if (_id.length == 0) {
174
+ LazyLoaderService.config.logger.err("Fuzzy classname matching stripped all symbols from the ID specified!");
175
+ return false;
176
+ }
177
+ const rx = new RegExp(`^${id}(component|module)?$`, "i");
178
+ const matches = modules
179
+ .filter(mod => {
180
+ let kid = mod.name.replace(/[^a-z0-9_\-]/ig, '');
181
+ return rx.test(kid);
182
+ });
183
+ if (matches.length > 1) {
184
+ LazyLoaderService.config.logger.err("Fuzzy classname matching resolved multiple targets!");
185
+ return false;
186
+ }
187
+ if (matches.length == 0) {
188
+ LazyLoaderService.config.logger.err("Fuzzy classname matching resolved no targets!");
189
+ return null;
190
+ }
191
+ return matches[0];
192
+ }
193
+ case ComponentResolveStrategy.Custom: {
194
+ return LazyLoaderService.config.customResolver(modules);
195
+ }
196
+ default: {
197
+ return false;
198
+ }
199
+ }
200
+ }
201
+ }
202
+ // A proxied registry that mutates reference keys
203
+ LazyLoaderService.registry = {};
204
+ LazyLoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyLoaderService, deps: [{ token: NGX_LAZY_LOADER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
205
+ LazyLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyLoaderService, providedIn: 'root' });
206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyLoaderService, decorators: [{
207
+ type: Injectable,
208
+ args: [{
209
+ providedIn: 'root'
210
+ }]
211
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
212
+ type: Inject,
213
+ args: [NGX_LAZY_LOADER_CONFIG]
214
+ }] }]; } });
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1sb2FkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9sYXp5LWxvYWRlci9sYXp5LWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQTRELHdCQUF3QixFQUFnRCxNQUFNLFNBQVMsQ0FBQztBQUMzSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFFbkQsMENBQTBDO0FBQzFDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQWtCLENBQUM7QUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBa0IsQ0FBQztBQUVoRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFLeEYsTUFBTSxPQUFPLGlCQUFpQjtJQUMxQixJQUFZLEdBQUcsS0FBSyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRSxJQUFZLEdBQUcsS0FBSyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRSxJQUFZLElBQUksS0FBSyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQVNuRSxZQUE0QyxTQUE4QixFQUFFO1FBQ3hFLG9GQUFvRjtRQUNwRixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBMkI7UUFDaEQsTUFBTSxFQUFF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QUFNLENBQUMsY0FBYyxDQUFDLE9BQWMsQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsT0FBTyxDQUFDLENBQUM7Z0JBQ0wsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjtJQUNMLENBQUM7O0FBclBELGlEQUFpRDtBQUNsQywwQkFBUSxHQUVuQixFQUFFLENBQUM7OEdBUkUsaUJBQWlCLGtCQVlOLHNCQUFzQjtrSEFaakMsaUJBQWlCLGNBRmQsTUFBTTsyRkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFhZ0IsTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21waWxlZENvbXBvbmVudCwgQ29tcGlsZWRNb2R1bGUsIENvbXBvbmVudFJlZ2lzdHJhdGlvbiwgQ29tcG9uZW50UmVzb2x2ZVN0cmF0ZWd5LCBEeW5hbWljUmVnaXN0cmF0aW9uQXJncywgTmd4TGF6eUxvYWRlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgc3RyaW5nVG9TbHVnLCBMb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbi8vIE1vbmtleS1wYXRjaCB0aGUgdHlwZSBvZiB0aGVzZSBzeW1ib2xzLlxuY29uc3QgJGlkID0gU3ltYm9sKFwiaWRcIikgYXMgYW55IGFzIHN0cmluZztcbmNvbnN0ICRncm91cCA9IFN5bWJvbChcImdyb3VwXCIpIGFzIGFueSBhcyBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBOR1hfTEFaWV9MT0FERVJfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPE5neExhenlMb2FkZXJDb25maWc+KCdjb25maWcnKTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBMYXp5TG9hZGVyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBnZXQgZXJyKCkgeyByZXR1cm4gTGF6eUxvYWRlclNlcnZpY2UuY29uZmlnLmxvZ2dlci5lcnI7IH1cbiAgICBwcml2YXRlIGdldCBsb2coKSB7IHJldHVybiBMYXp5TG9hZGVyU2VydmljZS5jb25maWcubG9nZ2VyLmxvZzsgfVxuICAgIHByaXZhdGUgZ2V0IHdhcm4oKSB7IHJldHVybiBMYXp5TG9hZGVyU2VydmljZS5jb25maWcubG9nZ2VyLndhcm47IH1cblxuICAgIC8vIEEgcHJveGllZCByZWdpc3RyeSB0aGF0IG11dGF0ZXMgcmVmZXJlbmNlIGtleXNcbiAgICBwcml2YXRlIHN0YXRpYyByZWdpc3RyeToge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBDb21wb25lbnRSZWdpc3RyYXRpb25bXTtcbiAgICB9ID0ge307XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbmZpZzogTmd4TGF6eUxvYWRlckNvbmZpZztcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoTkdYX0xBWllfTE9BREVSX0NPTkZJRykgY29uZmlnOiBOZ3hMYXp5TG9hZGVyQ29uZmlnID0ge30pIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoaXMgaXMgc2luZ2xldG9uIGFuZCB3b3JrcyByZWdhcmRsZXNzIG9mIHNwZWNpYWwgaW5zdGFuY2luZyByZXF1aXJlbWVudHMuXG4gICAgICAgIExhenlMb2FkZXJTZXJ2aWNlLmNvbmZpZ3VyZShjb25maWcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvbmZpZ3VyZShjb25maWc6IE5neExhenlMb2FkZXJDb25maWcpIHtcbiAgICAgICAgY29uc3QgeyBsb2csIHdhcm4sIGVyciB9ID0gTG9nZ2VyKFwibmd4LWxhenktbG9hZGVyXCIsIFwiIzAwOTY4OFwiKTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlc29sdmVTdHJhdGVneTogQ29tcG9uZW50UmVzb2x2ZVN0cmF0ZWd5LlBpY2tGaXJzdCxcbiAgICAgICAgICAgIGxvZ2dlcjoge1xuICAgICAgICAgICAgICAgIGxvZyxcbiAgICAgICAgICAgICAgICB3YXJuLFxuICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbmZpZy5lbnRyaWVzPy5mb3JFYWNoKGUgPT4gdGhpcy5hZGRDb21wb25lbnRUb1JlZ2lzdHJ5KGUpKVxuXG4gICAgICAgIC8vIElmIGEgY3VzdG9tIHJlc29sdXRpb24gc3RyYXRlZ3kgaXMgcHJvdmlkZWQgYnV0IG5vIHJlc29sdXRpb24gZnVuY3Rpb24gaXMgcGFzc2VkLFxuICAgICAgICAvLyB3ZSB0aHJvdyBhbiBlcnJvclxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5jb21wb25lbnRSZXNvbHZlU3RyYXRlZ3kgPT0gQ29tcG9uZW50UmVzb2x2ZVN0cmF0ZWd5LkN1c3RvbSAmJlxuICAgICAgICAgICAgIXRoaXMuY29uZmlnLmN1c3RvbVJlc29sdmVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUuIENvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIGEgY3VzdG9tIHJlc29sdmUgbWF0Y2hlciBidXQgbm9uZSB3YXMgcHJvdmlkZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcubG9hZGVyRGlzdHJhY3RvckNvbXBvbmVudCAmJiB0aGlzLmNvbmZpZy5sb2FkZXJEaXN0cmFjdG9yVGVtcGxhdGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSBib3RoIGEgQ29tcG9uZW50IGFuZCBUZW1wbGF0ZSBmb3IgRGlzdHJhY3RvciB2aWV3LlwiKVxuICAgICAgICBpZiAodGhpcy5jb25maWcuZXJyb3JDb21wb25lbnQgJiYgdGhpcy5jb25maWcuZXJyb3JUZW1wbGF0ZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlIGJvdGggYSBDb21wb25lbnQgYW5kIFRlbXBsYXRlIGZvciBFcnJvciB2aWV3LlwiKVxuICAgICAgICBpZiAodGhpcy5jb25maWcubm90Rm91bmRDb21wb25lbnQgJiYgdGhpcy5jb25maWcubm90Rm91bmRUZW1wbGF0ZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlIGJvdGggYSBDb21wb25lbnQgYW5kIFRlbXBsYXRlIGZvciBOb3RGb3VuZCB2aWV3LlwiKVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkQ29tcG9uZW50VG9SZWdpc3RyeShyZWdpc3RyYXRpb246IENvbXBvbmVudFJlZ2lzdHJhdGlvbikge1xuICAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhZGQgPHVuZGVmaW5lZD4gY29tcG9uZW50IGludG8gcmVnaXN0cnkuXCIpO1xuXG4gICAgICAgIC8vIENsb25lIHRoZSBvYmplY3QgaW50byBvdXIgcmVwb3NpdG9yeSBhbmQgdHJhbnNmZXIgdGhlIGlkIGludG8gYSBzdGFuZGFyZGl6ZWQgc2x1ZyBmb3JtYXRcblxuICAgICAgICBjb25zdCBpZCA9IHN0cmluZ1RvU2x1ZyhyZWdpc3RyYXRpb24uaWQgPz8gRGF0ZS5ub3coKS50b1N0cmluZygpKTsgLy8gcHVyZ2Ugbm9uLWJhc2ljIEFTQ0lJIGNoYXJzXG4gICAgICAgIGNvbnN0IGdyb3VwID0gcmVnaXN0cmF0aW9uLmdyb3VwIHx8IFwiZGVmYXVsdFwiO1xuXG4gICAgICAgIHJlZ2lzdHJhdGlvblskaWRdID0gaWQ7XG4gICAgICAgIHJlZ2lzdHJhdGlvblskZ3JvdXBdID0gaWQ7XG5cblxuICAgICAgICBpZiAoIXRoaXMucmVnaXN0cnlbZ3JvdXBdKVxuICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtncm91cF0gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSByZWdpc3RyYXRpb24gZm9yIHRoZSBjb21wb25lbnRcbiAgICAgICAgLy8gaWYgKHRoaXMucmVnaXN0cnlbZ3JvdXBdICYmIHR5cGVvZiB0aGlzLnJlZ2lzdHJ5W2dyb3VwXVsnbG9hZCddID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyAgICAgLy8gV2FybiB0aGUgZGV2ZWxvcGVyIHRoYXQgdGhlIHN0YXRlIGlzIHByb2JsZW1hdGljXG4gICAgICAgIC8vICAgICB0aGlzLmNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgLy8gICAgICAgICBgQSBwcmV2aW91cyBlbnRyeSBhbHJlYWR5IGV4aXN0cyBmb3IgJHtpZH0hIFRoZSBvbGQgcmVnaXN0cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbi5gICtcbiAgICAgICAgLy8gICAgICAgICBgUGxlYXNlIGVuc3VyZSB5b3UgdXNlIGdyb3VwcyBpZiB5b3UgaW50ZW5kIHRvIGhhdmUgZHVwbGljYXRlIGNvbXBvbmVudCBpZHMuIGAgK1xuICAgICAgICAvLyAgICAgICAgIGBJZiB0aGlzIHdhcyBpbnRlbnRpb25hbCwgZmlyc3QgcmVtb3ZlIHRoZSBvbGQgY29tcG9uZW50IGZyb20gdGhlIHJlZ2lzdHJ5IGJlZm9yZSBhZGRpbmcgYSBuZXcgaW5zdGFuY2VgXG4gICAgICAgIC8vICAgICApO1xuXG4gICAgICAgIC8vICAgICAvLyBJZiB3ZSdyZSBpbiBkZXYgbW9kZSwgYnJlYWsgdGhlIGxvYWRlciBzdXJmYWNlXG4gICAgICAgIC8vICAgICBpZiAoaXNEZXZNb2RlKCkpXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5yZWdpc3RyeVtncm91cF0ucHVzaChyZWdpc3RyYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGFuIEFuZ3VsYXIgY29tcG9uZW50XG4gICAgICogQHBhcmFtIGlkIGlkZW50aWZpZXIgdGhhdCBpcyB1c2VkIHRvIHJlc29sdmUgdGhlIGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSBncm91cFxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQW5ndWxhciBDb21wb25lbnQgQ2xhc3MgY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJDb21wb25lbnQ8VCBleHRlbmRzIHsgbmV3KC4uLmFyZ3M6IGFueVtdKTogSW5zdGFuY2VUeXBlPFQ+OyB9PihhcmdzOiBEeW5hbWljUmVnaXN0cmF0aW9uQXJnczxUPikge1xuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudFJlZ2lzdGVyZWQoYXJncy5pZCwgYXJncy5ncm91cCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBXaWxsIG5vdCByZS1yZWdpc3RlciBjb21wb25lbnQgJyR7YXJncy5pZH0nIGluIGdyb3VwICcke2FyZ3MuZ3JvdXAgfHwgJ2RlZmF1bHQnfScgYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBMYXp5TG9hZGVyU2VydmljZS5hZGRDb21wb25lbnRUb1JlZ2lzdHJ5KHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmdUb1NsdWcoYXJncy5pZCksXG4gICAgICAgICAgICBtYXRjaGVyOiBhcmdzLm1hdGNoZXIsXG4gICAgICAgICAgICBncm91cDogc3RyaW5nVG9TbHVnKGFyZ3MuZ3JvdXAgfHwgXCJkZWZhdWx0XCIpLFxuICAgICAgICAgICAgbG9hZDogYXJncy5sb2FkIHx8ICgoKSA9PiBhcmdzLmNvbXBvbmVudClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWRcbiAgICAgKiBAcGFyYW0gZ3JvdXBcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5yZWdpc3RlckNvbXBvbmVudChpZDogc3RyaW5nLCBncm91cCA9IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIGNvbnN0IF9pZCA9IHN0cmluZ1RvU2x1ZyhpZCk7XG4gICAgICAgIGNvbnN0IF9ncm91cCA9IHN0cmluZ1RvU2x1Zyhncm91cCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdmVSZWdpc3RyYXRpb25FbnRyeShpZCwgZ3JvdXApKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVucmVnaXN0ZXIgY29tcG9uZW50ICR7fSEgQ29tcG9uZW50IGlzIG5vdCBwcmVzZW50IGluIHJlZ2lzdHJ5XCIpXG5cbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIGNsZWFyaW5nIHJ1bm5pbmcgaW5zdGFuY2VzXG4gICAgICAgIGRlbGV0ZSBMYXp5TG9hZGVyU2VydmljZS5yZWdpc3RyeVtfZ3JvdXBdW19pZF07XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlZ2lzdHJhdGlvbiBlbnRyeSBmb3IgYSBjb21wb25lbnQuXG4gICAgICogUmV0dXJucyBudWxsIGlmIGNvbXBvbmVudCBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlUmVnaXN0cmF0aW9uRW50cnkodmFsdWU6IHN0cmluZywgZ3JvdXAgPSBcImRlZmF1bHRcIikge1xuICAgICAgICBjb25zdCBfaWQgPSBzdHJpbmdUb1NsdWcodmFsdWUpO1xuICAgICAgICBjb25zdCBfZ3JvdXAgPSBzdHJpbmdUb1NsdWcoZ3JvdXApO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldEdyb3VwID0gKExhenlMb2FkZXJTZXJ2aWNlLnJlZ2lzdHJ5W19ncm91cF0gfHwgW10pO1xuXG4gICAgICAgIGxldCBpdGVtcyA9IHRhcmdldEdyb3VwLmZpbHRlcih0ID0+IHtcbiAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBObyBtYXRjaGVyLCBjaGVjayBpZFxuICAgICAgICAgICAgaWYgKCF0Lm1hdGNoZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRbJGlkXSA9PSBfaWQ7XG5cbiAgICAgICAgICAgIC8vIE1hdGNoZXIgaXMgcmVnZXhcbiAgICAgICAgICAgIGlmICh0Lm1hdGNoZXIgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQubWF0Y2hlci50ZXN0KF9pZCkgfHwgdC5tYXRjaGVyLnRlc3QodmFsdWUpO1xuXG4gICAgICAgICAgICAvLyBNYXRjaGVyIGlzIHN0cmluZyA9PiByZWdleFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0Lm1hdGNoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByeCA9IG5ldyBSZWdFeHAodC5tYXRjaGVyLCAndWknKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcngudGVzdChfaWQpIHx8IHJ4LnRlc3QodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNYXRjaGVyIGlzIGFycmF5XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0Lm1hdGNoZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhdC5tYXRjaGVyLmZpbmQoZSA9PiBzdHJpbmdUb1NsdWcoZSkgPT0gX2lkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3VzdG9tIG1hdGNoZXIgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdC5tYXRjaGVyID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5tYXRjaGVyKF9pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMud2FybihcIlJlc29sdmVkIG11bHRpcGxlIGNvbXBvbmVudHMgZm9yIHRoZSBwcm92aWRlZCBgW2NvbXBvbmVudF1gIGJpbmRpbmcuIFRoaXMgbWF5IGNhdXNlIFVJIGNvbmZsaWN0cy5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG91dCA9IGl0ZW1zWzBdO1xuXG4gICAgICAgIGlmIChvdXQubWF0Y2hlciBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gX2lkLm1hdGNoKG91dC5tYXRjaGVyKSB8fCB2YWx1ZS5tYXRjaChvdXQubWF0Y2hlcik7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW50cnk6IG91dCxcbiAgICAgICAgICAgICAgICBtYXRjaEdyb3VwczogcmVzdWx0Py5ncm91cHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBlbnRyeTogb3V0IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWRcbiAgICAgKiBDYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSByZWdleCBtYXRjaGVycyBhbmQgYWxpYXNlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDb21wb25lbnRSZWdpc3RlcmVkKHZhbHVlOiBzdHJpbmcsIGdyb3VwID0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlUmVnaXN0cmF0aW9uRW50cnkodmFsdWUsIGdyb3VwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBidW5kbGVcbiAgICAgKiBAcmV0dXJucyBUaGUgY29tcG9uZW50IGBPYmplY3RgIGlmIGEgY29tcG9uZW50IHdhcyByZXNvbHZlZCwgYG51bGxgIGlmIG5vIGNvbXBvbmVudCB3YXMgZm91bmRcbiAgICAgKiBgZmFsc2VgIGlmIHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgd2FzIGFuIGludmFsaWQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVDb21wb25lbnQoaWQ6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgbW9kdWxlczogKENvbXBpbGVkQ29tcG9uZW50IHwgQ29tcGlsZWRNb2R1bGUpW10pOiBPYmplY3QgfCBudWxsIHwgZmFsc2Uge1xuXG4gICAgICAgIHN3aXRjaCAoTGF6eUxvYWRlclNlcnZpY2UuY29uZmlnLmNvbXBvbmVudFJlc29sdmVTdHJhdGVneSkge1xuICAgICAgICAgICAgY2FzZSBDb21wb25lbnRSZXNvbHZlU3RyYXRlZ3kuUGlja0ZpcnN0OiB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlc1swXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXhhY3QgaWQgLT4gY2xhc3NuYW1lIG1hdGNoXG4gICAgICAgICAgICBjYXNlIENvbXBvbmVudFJlc29sdmVTdHJhdGVneS5NYXRjaElkVG9DbGFzc05hbWU6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzID1cbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihrID0+IGsubmFtZSA9PSBpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZ1enp5IGlkIC0+IGNsYXNzbmFtZSBtYXRjaFxuICAgICAgICAgICAgY2FzZSBDb21wb25lbnRSZXNvbHZlU3RyYXRlZ3kuRnV6enlJZENsYXNzTmFtZToge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pZCA9IGlkLnJlcGxhY2UoL1teYS16MC05X1xcLV0vaWcsICcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChfaWQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgTGF6eUxvYWRlclNlcnZpY2UuY29uZmlnLmxvZ2dlci5lcnIoXCJGdXp6eSBjbGFzc25hbWUgbWF0Y2hpbmcgc3RyaXBwZWQgYWxsIHN5bWJvbHMgZnJvbSB0aGUgSUQgc3BlY2lmaWVkIVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJ4ID0gbmV3IFJlZ0V4cChgXiR7aWR9KGNvbXBvbmVudHxtb2R1bGUpPyRgLCBcImlcIik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG1vZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2lkID0gbW9kLm5hbWUucmVwbGFjZSgvW15hLXowLTlfXFwtXS9pZywgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcngudGVzdChraWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgTGF6eUxvYWRlclNlcnZpY2UuY29uZmlnLmxvZ2dlci5lcnIoXCJGdXp6eSBjbGFzc25hbWUgbWF0Y2hpbmcgcmVzb2x2ZWQgbXVsdGlwbGUgdGFyZ2V0cyFcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBMYXp5TG9hZGVyU2VydmljZS5jb25maWcubG9nZ2VyLmVycihcIkZ1enp5IGNsYXNzbmFtZSBtYXRjaGluZyByZXNvbHZlZCBubyB0YXJnZXRzIVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIENvbXBvbmVudFJlc29sdmVTdHJhdGVneS5DdXN0b206IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTGF6eUxvYWRlclNlcnZpY2UuY29uZmlnLmN1c3RvbVJlc29sdmVyKG1vZHVsZXMgYXMgYW55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,26 @@
1
+ export var ComponentResolveStrategy;
2
+ (function (ComponentResolveStrategy) {
3
+ /**
4
+ * Match the fist component we find
5
+ * (best used for standalone components)
6
+ * @default
7
+ */
8
+ ComponentResolveStrategy[ComponentResolveStrategy["PickFirst"] = 0] = "PickFirst";
9
+ /**
10
+ * Perform an Exact ID to Classname of the Component
11
+ * case sensitive, zero tolerance.
12
+ */
13
+ ComponentResolveStrategy[ComponentResolveStrategy["MatchIdToClassName"] = 1] = "MatchIdToClassName";
14
+ /**
15
+ * Perform a fuzzy ID to classname match
16
+ * case insensitive, mutes symbols
17
+ * ignores "Component" and "Module" postfixes on class
18
+ * names
19
+ */
20
+ ComponentResolveStrategy[ComponentResolveStrategy["FuzzyIdClassName"] = 2] = "FuzzyIdClassName";
21
+ /**
22
+ * Use a user-provided component match function
23
+ */
24
+ ComponentResolveStrategy[ComponentResolveStrategy["Custom"] = 3] = "Custom";
25
+ })(ComponentResolveStrategy || (ComponentResolveStrategy = {}));
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvbGF6eS1sb2FkZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxDQUFOLElBQVksd0JBd0JYO0FBeEJELFdBQVksd0JBQXdCO0lBQ2hDOzs7O09BSUc7SUFDSCxpRkFBUyxDQUFBO0lBQ1Q7OztPQUdHO0lBQ0gsbUdBQWtCLENBQUE7SUFDbEI7Ozs7O09BS0c7SUFDSCwrRkFBZ0IsQ0FBQTtJQUVoQjs7T0FFRztJQUNILDJFQUFNLENBQUE7QUFDVixDQUFDLEVBeEJXLHdCQUF3QixLQUF4Qix3QkFBd0IsUUF3Qm5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGVudW0gQ29tcG9uZW50UmVzb2x2ZVN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCB0aGUgZmlzdCBjb21wb25lbnQgd2UgZmluZFxuICAgICAqIChiZXN0IHVzZWQgZm9yIHN0YW5kYWxvbmUgY29tcG9uZW50cylcbiAgICAgKiBAZGVmYXVsdFxuICAgICAqL1xuICAgIFBpY2tGaXJzdCxcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGFuIEV4YWN0IElEIHRvIENsYXNzbmFtZSBvZiB0aGUgQ29tcG9uZW50XG4gICAgICogY2FzZSBzZW5zaXRpdmUsIHplcm8gdG9sZXJhbmNlLlxuICAgICAqL1xuICAgIE1hdGNoSWRUb0NsYXNzTmFtZSxcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGEgZnV6enkgSUQgdG8gY2xhc3NuYW1lIG1hdGNoXG4gICAgICogY2FzZSBpbnNlbnNpdGl2ZSwgbXV0ZXMgc3ltYm9sc1xuICAgICAqIGlnbm9yZXMgXCJDb21wb25lbnRcIiBhbmQgXCJNb2R1bGVcIiBwb3N0Zml4ZXMgb24gY2xhc3NcbiAgICAgKiBuYW1lc1xuICAgICAqL1xuICAgIEZ1enp5SWRDbGFzc05hbWUsXG5cbiAgICAvKipcbiAgICAgKiBVc2UgYSB1c2VyLXByb3ZpZGVkIGNvbXBvbmVudCBtYXRjaCBmdW5jdGlvblxuICAgICAqL1xuICAgIEN1c3RvbVxufVxuXG5leHBvcnQgdHlwZSBOZ3hMYXp5TG9hZGVyQ29uZmlnID0gUGFydGlhbDx7XG4gICAgZW50cmllczogQ29tcG9uZW50UmVnaXN0cmF0aW9uW10sXG5cbiAgICBub3RGb3VuZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIG5vdEZvdW5kQ29tcG9uZW50OiBDb21wb25lbnRUeXBlPGFueT4sXG5cbiAgICBlcnJvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIGVycm9yQ29tcG9uZW50OiBDb21wb25lbnRUeXBlPGFueT4sXG5cbiAgICBsb2FkZXJEaXN0cmFjdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgbG9hZGVyRGlzdHJhY3RvckNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxhbnk+LFxuXG4gICAgbG9nZ2VyOiB7XG4gICAgICAgIGxvZzogKC4uLmFyZ3M6IGFueSkgPT4gdm9pZCxcbiAgICAgICAgd2FybjogKC4uLmFyZ3M6IGFueSkgPT4gdm9pZCxcbiAgICAgICAgZXJyOiAoLi4uYXJnczogYW55KSA9PiB2b2lkO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogV2hhdCBzdHJhdGVneSBzaG91bGQgYmUgdXNlZCB0byByZXNvbHZlIGNvbXBvbmVudHNcbiAgICAgKiBAZGVmYXVsdCBDb21wb25lbnRSZXNvbHZlU3RyYXRlZ3kuRnV6enlJZENsYXNzTmFtZVxuICAgICAqL1xuICAgIGNvbXBvbmVudFJlc29sdmVTdHJhdGVneTogQ29tcG9uZW50UmVzb2x2ZVN0cmF0ZWd5LFxuICAgIGN1c3RvbVJlc29sdmVyOiAocmVnaXN0cnk6IChDb21waWxlZENvbXBvbmVudCB8IENvbXBpbGVkTW9kdWxlKVtdKSA9PiBPYmplY3Rcbn0+O1xuXG50eXBlIFJlZ2lzdHJhdGlvbkNvbmZpZyA9IHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgZ3JvdXAgdG8gY2F0ZWdvcml6ZSBjb21wb25lbnRzLiBJZiBub3Qgc3BlY2lmaWVkLFxuICAgICAqIHdpbGwgZGVmYXVsdCB0byB0aGUgYGRlZmF1bHRgIGdyb3VwLlxuICAgICAqL1xuICAgIGdyb3VwPzogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIGxvYWQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9teS1wYWdlL215LXBhZ2UuY29tcG9uZW50JylcbiAgICAgKi9cbiAgICBsb2FkOiAoKSA9PiBhbnksXG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgYmVmb3JlIGEgY29tcG9uZW50IGlzIGxvYWRlZC5cbiAgICAgKiBJZiBpdCByZXR1cm5zIGBmYWxzZWAgdGhlIGNvbXBvbmVudCB3aWxsIG5vdCBiZSBsb2FkZWQuXG4gICAgICovXG4gICAgLy8gY2FuQWN0aXZhdGU6ICgpID0+IGJvb2xlYW5cblxuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgdHlwZSBDb21wb25lbnRSZWdpc3RyYXRpb24gPSAoXG4gICAgKHsgaWQ6IHN0cmluZyB9ICYgUmVnaXN0cmF0aW9uQ29uZmlnKSB8XG4gICAgKHsgbWF0Y2hlcjogc3RyaW5nW10gfCBSZWdFeHAgfCAoKHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW4pOyB9ICYgUmVnaXN0cmF0aW9uQ29uZmlnKVxuKTtcblxuZXhwb3J0IHR5cGUgRHluYW1pY1JlZ2lzdHJhdGlvbkFyZ3M8VCA9IGFueT4gPSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBncm91cD86IHN0cmluZyxcbiAgICBtYXRjaGVyPzogc3RyaW5nW10gfCBSZWdFeHAgfCAoKHZhbDogc3RyaW5nKSA9PiBib29sZWFuKSxcbiAgICBjb21wb25lbnQ/OiBULFxuICAgIGxvYWQ/OiAoKSA9PiBhbnk7XG59XG5cbi8qKlxuICogVGhpcyBpcyByb3VnaGx5IGEgY29tcGlsZWQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkQ29tcG9uZW50ID0ge1xuICAgICgpOiBDb21waWxlZENvbXBvbmVudCxcbiAgICDJtWZhYzogRnVuY3Rpb24sXG4gICAgybVjbXA6IHtcbiAgICAgICAgY29uc3RzO1xuICAgICAgICBjb250ZW50UXVlcmllcztcbiAgICAgICAgZGF0YTtcbiAgICAgICAgZGVjbGFyZWRJbnB1dHM7XG4gICAgICAgIGRlY2xzO1xuICAgICAgICBkZXBlbmRlbmNpZXM7XG4gICAgICAgIGRpcmVjdGl2ZURlZnM7XG4gICAgICAgIGVuY2Fwc3VsYXRpb247XG4gICAgICAgIGV4cG9ydEFzO1xuICAgICAgICBmYWN0b3J5O1xuICAgICAgICBmZWF0dXJlcztcbiAgICAgICAgZmluZEhvc3REaXJlY3RpdmVEZWZzO1xuICAgICAgICBnZXRTdGFuZGFsb25lSW5qZWN0b3I7XG4gICAgICAgIGhvc3RBdHRycztcbiAgICAgICAgaG9zdEJpbmRpbmdzO1xuICAgICAgICBob3N0RGlyZWN0aXZlcztcbiAgICAgICAgaG9zdFZhcnM7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGlucHV0cztcbiAgICAgICAgbmdDb250ZW50U2VsZWN0b3JzO1xuICAgICAgICBvblB1c2g6IGJvb2xlYW47XG4gICAgICAgIG91dHB1dHM7XG4gICAgICAgIHBpcGVEZWZzO1xuICAgICAgICBwcm92aWRlcnNSZXNvbHZlcjtcbiAgICAgICAgc2NoZW1hcztcbiAgICAgICAgc2VsZWN0b3JzOiBzdHJpbmdbXTtcbiAgICAgICAgc2V0SW5wdXQ7XG4gICAgICAgIHN0YW5kYWxvbmU6IGJvb2xlYW47XG4gICAgICAgIHN0eWxlczogc3RyaW5nW107XG4gICAgICAgIHRWaWV3O1xuICAgICAgICB0ZW1wbGF0ZTtcbiAgICAgICAgdHlwZTogRnVuY3Rpb247XG4gICAgICAgIHZhcnM6IG51bWJlcjtcbiAgICAgICAgdmlld1F1ZXJ5O1xuICAgIH07XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgcm91Z2hseSBhIGNvbXBpbGVkIG1vZHVsZVxuICovXG5leHBvcnQgdHlwZSBDb21waWxlZE1vZHVsZSA9IHtcbiAgICAoKTogQ29tcGlsZWRNb2R1bGUsXG4gICAgybVmYWM6IEZ1bmN0aW9uLFxuICAgIMm1aW5qOiB7XG4gICAgICAgIHByb3ZpZGVyczogYW55W10sXG4gICAgICAgIGltcG9ydHM6IGFueVtdO1xuICAgIH0sXG4gICAgybVtb2Q6IHtcbiAgICAgICAgYm9vdHN0cmFwOiBhbnlbXSxcbiAgICAgICAgZGVjbGFyYXRpb25zOiBGdW5jdGlvbltdLFxuICAgICAgICBleHBvcnRzOiBhbnlbXSxcbiAgICAgICAgaWQ6IHVua25vd24sXG4gICAgICAgIGltcG9ydHM6IGFueVtdLFxuICAgICAgICBzY2hlbWFzOiB1bmtub3duLFxuICAgICAgICB0cmFuc2l0aXZlQ29tcGlsZVNjb3BlczogdW5rbm93bixcbiAgICAgICAgdHlwZTogRnVuY3Rpb247XG4gICAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbXBpbGVkQnVuZGxlID0geyBba2V5OiBzdHJpbmddOiBDb21waWxlZENvbXBvbmVudCB8IENvbXBpbGVkTW9kdWxlOyB9O1xuXG5cbiJdfQ==