@angular/core 16.2.0-next.4 → 16.2.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.
Files changed (57) hide show
  1. package/esm2022/src/application_tokens.mjs +2 -1
  2. package/esm2022/src/core.mjs +2 -1
  3. package/esm2022/src/core_private_export.mjs +3 -1
  4. package/esm2022/src/core_render3_private_export.mjs +3 -2
  5. package/esm2022/src/di/contextual.mjs +7 -1
  6. package/esm2022/src/di/create_injector.mjs +1 -3
  7. package/esm2022/src/di/injector.mjs +1 -1
  8. package/esm2022/src/di/injector_compatibility.mjs +5 -2
  9. package/esm2022/src/di/provider_collection.mjs +17 -16
  10. package/esm2022/src/di/r3_injector.mjs +37 -2
  11. package/esm2022/src/errors.mjs +1 -1
  12. package/esm2022/src/hydration/annotate.mjs +60 -15
  13. package/esm2022/src/hydration/api.mjs +40 -17
  14. package/esm2022/src/hydration/cleanup.mjs +15 -6
  15. package/esm2022/src/hydration/utils.mjs +58 -20
  16. package/esm2022/src/linker/template_ref.mjs +4 -19
  17. package/esm2022/src/linker/view_container_ref.mjs +5 -13
  18. package/esm2022/src/metadata/directives.mjs +1 -1
  19. package/esm2022/src/render3/after_render_hooks.mjs +210 -0
  20. package/esm2022/src/render3/component_ref.mjs +11 -11
  21. package/esm2022/src/render3/debug/framework_injector_profiler.mjs +212 -0
  22. package/esm2022/src/render3/debug/injector_profiler.mjs +103 -0
  23. package/esm2022/src/render3/di.mjs +32 -2
  24. package/esm2022/src/render3/di_setup.mjs +11 -4
  25. package/esm2022/src/render3/hooks.mjs +3 -3
  26. package/esm2022/src/render3/index.mjs +2 -2
  27. package/esm2022/src/render3/instructions/all.mjs +2 -1
  28. package/esm2022/src/render3/instructions/change_detection.mjs +16 -9
  29. package/esm2022/src/render3/instructions/defer.mjs +19 -0
  30. package/esm2022/src/render3/instructions/di.mjs +5 -2
  31. package/esm2022/src/render3/instructions/shared.mjs +1 -1
  32. package/esm2022/src/render3/interfaces/view.mjs +1 -1
  33. package/esm2022/src/render3/jit/environment.mjs +2 -1
  34. package/esm2022/src/render3/node_manipulation.mjs +5 -5
  35. package/esm2022/src/render3/pipe.mjs +12 -3
  36. package/esm2022/src/render3/util/global_utils.mjs +7 -1
  37. package/esm2022/src/render3/util/injector_discovery_utils.mjs +460 -0
  38. package/esm2022/src/render3/util/misc_utils.mjs +12 -1
  39. package/esm2022/src/render3/view_manipulation.mjs +65 -0
  40. package/esm2022/src/render3/view_ref.mjs +3 -3
  41. package/esm2022/src/util/coercion.mjs +11 -1
  42. package/esm2022/src/version.mjs +1 -1
  43. package/esm2022/testing/src/logger.mjs +3 -3
  44. package/fesm2022/core.mjs +1854 -650
  45. package/fesm2022/core.mjs.map +1 -1
  46. package/fesm2022/rxjs-interop.mjs +1 -1
  47. package/fesm2022/rxjs-interop.mjs.map +1 -1
  48. package/fesm2022/testing.mjs +4023 -3540
  49. package/fesm2022/testing.mjs.map +1 -1
  50. package/index.d.ts +214 -10
  51. package/package.json +1 -1
  52. package/rxjs-interop/index.d.ts +1 -1
  53. package/schematics/migrations/guard-and-resolve-interfaces/bundle.js +13 -13
  54. package/schematics/migrations/remove-module-id/bundle.js +14 -14
  55. package/schematics/ng-generate/standalone-migration/bundle.js +3664 -2727
  56. package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
  57. package/testing/index.d.ts +1 -1
@@ -0,0 +1,212 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { EnvironmentInjector } from '../../di/r3_injector';
9
+ import { throwError } from '../../util/assert';
10
+ import { getComponentDef } from '../definition';
11
+ import { getNodeInjectorLView, NodeInjector } from '../di';
12
+ import { setInjectorProfiler } from './injector_profiler';
13
+ /**
14
+ * These are the data structures that our framework injector profiler will fill with data in order
15
+ * to support DI debugging APIs.
16
+ *
17
+ * resolverToTokenToDependencies: Maps an injector to a Map of tokens to an Array of
18
+ * dependencies. Injector -> Token -> Dependencies This is used to support the
19
+ * getDependenciesFromInjectable API, which takes in an injector and a token and returns it's
20
+ * dependencies.
21
+ *
22
+ * resolverToProviders: Maps a DI resolver (an Injector or an LView) to the providers configured
23
+ * within it This is used to support the getInjectorProviders API, which takes in an injector and
24
+ * returns the providers that it was configured with.
25
+ *
26
+ * standaloneInjectorToComponent: Maps the injector of a standalone component to the standalone
27
+ * component that it is associated with. Used in the getInjectorProviders API, specificially in the
28
+ * discovery of import paths for each provider. This is necessary because the imports array of a
29
+ * standalone component is processed and configured in its standalone injector, but exists within
30
+ * the component's definition. Because getInjectorProviders takes in an injector, if that injector
31
+ * is the injector of a standalone component, we need to be able to discover the place where the
32
+ * imports array is located (the component) in order to flatten the imports array within it to
33
+ * discover all of it's providers.
34
+ *
35
+ *
36
+ * All of these data structures are instantiated with WeakMaps. This will ensure that the presence
37
+ * of any object in the keys of these maps does not prevent the garbage collector from collecting
38
+ * those objects. Because of this property of WeakMaps, these data structures will never be the
39
+ * source of a memory leak.
40
+ *
41
+ * An example of this advantage: When components are destroyed, we don't need to do
42
+ * any additional work to remove that component from our mappings.
43
+ *
44
+ */
45
+ class DIDebugData {
46
+ constructor() {
47
+ this.resolverToTokenToDependencies = new WeakMap();
48
+ this.resolverToProviders = new WeakMap();
49
+ this.standaloneInjectorToComponent = new WeakMap();
50
+ }
51
+ reset() {
52
+ this.resolverToTokenToDependencies =
53
+ new WeakMap();
54
+ this.resolverToProviders = new WeakMap();
55
+ this.standaloneInjectorToComponent = new WeakMap();
56
+ }
57
+ }
58
+ let frameworkDIDebugData = new DIDebugData();
59
+ export function getFrameworkDIDebugData() {
60
+ return frameworkDIDebugData;
61
+ }
62
+ /**
63
+ * Initalize default handling of injector events. This handling parses events
64
+ * as they are emitted and constructs the data structures necessary to support
65
+ * some of debug APIs.
66
+ *
67
+ * See handleInjectEvent, handleCreateEvent and handleProviderConfiguredEvent
68
+ * for descriptions of each handler
69
+ *
70
+ * Supported APIs:
71
+ * - getDependenciesFromInjectable
72
+ * - getInjectorProviders
73
+ */
74
+ export function setupFrameworkInjectorProfiler() {
75
+ frameworkDIDebugData.reset();
76
+ setInjectorProfiler((injectorProfilerEvent) => handleInjectorProfilerEvent(injectorProfilerEvent));
77
+ }
78
+ function handleInjectorProfilerEvent(injectorProfilerEvent) {
79
+ const { context, type } = injectorProfilerEvent;
80
+ if (type === 0 /* InjectorProfilerEventType.Inject */) {
81
+ handleInjectEvent(context, injectorProfilerEvent.service);
82
+ }
83
+ else if (type === 1 /* InjectorProfilerEventType.InstanceCreatedByInjector */) {
84
+ handleInstanceCreatedByInjectorEvent(context, injectorProfilerEvent.instance);
85
+ }
86
+ else if (type === 2 /* InjectorProfilerEventType.ProviderConfigured */) {
87
+ handleProviderConfiguredEvent(context, injectorProfilerEvent.providerRecord);
88
+ }
89
+ }
90
+ /**
91
+ *
92
+ * Stores the injected service in frameworkDIDebugData.resolverToTokenToDependencies
93
+ * based on it's injector and token.
94
+ *
95
+ * @param context InjectorProfilerContext the injection context that this event occurred in.
96
+ * @param data InjectedService the service associated with this inject event.
97
+ *
98
+ */
99
+ function handleInjectEvent(context, data) {
100
+ const diResolver = getDIResolver(context.injector);
101
+ if (diResolver === null) {
102
+ throwError('An Inject event must be run within an injection context.');
103
+ }
104
+ const diResolverToInstantiatedToken = frameworkDIDebugData.resolverToTokenToDependencies;
105
+ if (!diResolverToInstantiatedToken.has(diResolver)) {
106
+ diResolverToInstantiatedToken.set(diResolver, new WeakMap());
107
+ }
108
+ // if token is a primitive type, ignore this event. We do this because we cannot keep track of
109
+ // non-primitive tokens in WeakMaps since they are not garbage collectable.
110
+ if (!canBeHeldWeakly(context.token)) {
111
+ return;
112
+ }
113
+ const instantiatedTokenToDependencies = diResolverToInstantiatedToken.get(diResolver);
114
+ if (!instantiatedTokenToDependencies.has(context.token)) {
115
+ instantiatedTokenToDependencies.set(context.token, []);
116
+ }
117
+ const { token, value, flags } = data;
118
+ instantiatedTokenToDependencies.get(context.token).push({ token, value, flags });
119
+ }
120
+ /**
121
+ *
122
+ * If the created instance is an instance of a standalone component, maps the injector to that
123
+ * standalone component in frameworkDIDebugData.standaloneInjectorToComponent
124
+ *
125
+ * @param context InjectorProfilerContext the injection context that this event occurred in.
126
+ * @param data InjectorCreatedInstance an object containing the instance that was just created
127
+ *
128
+ */
129
+ function handleInstanceCreatedByInjectorEvent(context, data) {
130
+ const { value } = data;
131
+ if (getDIResolver(context.injector) === null) {
132
+ throwError('An InjectorCreatedInstance event must be run within an injection context.');
133
+ }
134
+ // if our value is an instance of a standalone component, map the injector of that standalone
135
+ // component to the component class. Otherwise, this event is a noop.
136
+ let standaloneComponent = undefined;
137
+ if (typeof value === 'object') {
138
+ standaloneComponent = value?.constructor;
139
+ }
140
+ if (standaloneComponent === undefined || !isStandaloneComponent(standaloneComponent)) {
141
+ return;
142
+ }
143
+ const environmentInjector = context.injector.get(EnvironmentInjector, null, { optional: true });
144
+ // Standalone components should have an environment injector. If one cannot be
145
+ // found we may be in a test case for low level functionality that did not explictly
146
+ // setup this injector. In those cases, we simply ignore this event.
147
+ if (environmentInjector === null) {
148
+ return;
149
+ }
150
+ const { standaloneInjectorToComponent } = frameworkDIDebugData;
151
+ // If our injector has already been mapped, as is the case
152
+ // when a standalone component imports another standalone component,
153
+ // we consider the original component (the component doing the importing)
154
+ // as the component connected to our injector.
155
+ if (standaloneInjectorToComponent.has(environmentInjector)) {
156
+ return;
157
+ }
158
+ // If our injector hasn't been mapped, then we map it to the standalone component
159
+ standaloneInjectorToComponent.set(environmentInjector, standaloneComponent);
160
+ }
161
+ function isStandaloneComponent(value) {
162
+ const def = getComponentDef(value);
163
+ return !!def?.standalone;
164
+ }
165
+ /**
166
+ *
167
+ * Stores the emitted ProviderRecords from the InjectorProfilerEventType.ProviderConfigured
168
+ * event in frameworkDIDebugData.resolverToProviders
169
+ *
170
+ * @param context InjectorProfilerContext the injection context that this event occurred in.
171
+ * @param data ProviderRecord an object containing the instance that was just created
172
+ *
173
+ */
174
+ function handleProviderConfiguredEvent(context, data) {
175
+ const { resolverToProviders } = frameworkDIDebugData;
176
+ const diResolver = getDIResolver(context?.injector);
177
+ if (diResolver === null) {
178
+ throwError('A ProviderConfigured event must be run within an injection context.');
179
+ }
180
+ if (!resolverToProviders.has(diResolver)) {
181
+ resolverToProviders.set(diResolver, []);
182
+ }
183
+ resolverToProviders.get(diResolver).push(data);
184
+ }
185
+ function getDIResolver(injector) {
186
+ let diResolver = null;
187
+ if (injector === undefined) {
188
+ return diResolver;
189
+ }
190
+ // We use the LView as the diResolver for NodeInjectors because they
191
+ // do not persist anywhere in the framework. They are simply wrappers around an LView and a TNode
192
+ // that do persist. Because of this, we rely on the LView of the NodeInjector in order to use
193
+ // as a concrete key to represent this injector. If we get the same LView back later, we know
194
+ // we're looking at the same injector.
195
+ if (injector instanceof NodeInjector) {
196
+ diResolver = getNodeInjectorLView(injector);
197
+ }
198
+ // Other injectors can be used a keys for a map because their instances
199
+ // persist
200
+ else {
201
+ diResolver = injector;
202
+ }
203
+ return diResolver;
204
+ }
205
+ // inspired by
206
+ // https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-canbeheldweakly
207
+ function canBeHeldWeakly(value) {
208
+ // we check for value !== null here because typeof null === 'object
209
+ return value !== null &&
210
+ (typeof value === 'object' || typeof value === 'function' || typeof value === 'symbol');
211
+ }
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrX2luamVjdG9yX3Byb2ZpbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9kZWJ1Zy9mcmFtZXdvcmtfaW5qZWN0b3JfcHJvZmlsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFekQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFlBQVksRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUd6RCxPQUFPLEVBQXNJLG1CQUFtQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFN0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFNLFdBQVc7SUFBakI7UUFDRSxrQ0FBNkIsR0FDekIsSUFBSSxPQUFPLEVBQTZELENBQUM7UUFDN0Usd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQW9DLENBQUM7UUFDdEUsa0NBQTZCLEdBQUcsSUFBSSxPQUFPLEVBQTJCLENBQUM7SUFRekUsQ0FBQztJQU5DLEtBQUs7UUFDSCxJQUFJLENBQUMsNkJBQTZCO1lBQzlCLElBQUksT0FBTyxFQUE2RCxDQUFDO1FBQzdFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBb0MsQ0FBQztRQUMzRSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxPQUFPLEVBQTJCLENBQUM7SUFDOUUsQ0FBQztDQUNGO0FBRUQsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRTdDLE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDO0FB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Q0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBNEI7SUFDakQsSUFBSSxVQUFVLEdBQXdCLElBQUksQ0FBQztJQUUzQyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDMUIsT0FBTyxVQUFVLENBQUM7S0FDbkI7SUFFRCxvRUFBb0U7SUFDcEUsaUdBQWlHO0lBQ2pHLDZGQUE2RjtJQUM3Riw2RkFBNkY7SUFDN0Ysc0NBQXNDO0lBQ3RDLElBQUksUUFBUSxZQUFZLFlBQVksRUFBRTtRQUNwQyxVQUFVLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDN0M7SUFDRCx1RUFBdUU7SUFDdkUsVUFBVTtTQUNMO1FBQ0gsVUFBVSxHQUFHLFFBQVEsQ0FBQztLQUN2QjtJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxjQUFjO0FBQ2Qsb0dBQW9HO0FBQ3BHLFNBQVMsZUFBZSxDQUFDLEtBQVU7SUFDakMsbUVBQW1FO0lBQ25FLE9BQU8sS0FBSyxLQUFLLElBQUk7UUFDakIsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQzlGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtJbmplY3Rvcn0gZnJvbSAnLi4vLi4vZGkvaW5qZWN0b3InO1xuaW1wb3J0IHtFbnZpcm9ubWVudEluamVjdG9yfSBmcm9tICcuLi8uLi9kaS9yM19pbmplY3Rvcic7XG5pbXBvcnQge1R5cGV9IGZyb20gJy4uLy4uL2ludGVyZmFjZS90eXBlJztcbmltcG9ydCB7dGhyb3dFcnJvcn0gZnJvbSAnLi4vLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHtnZXRDb21wb25lbnREZWZ9IGZyb20gJy4uL2RlZmluaXRpb24nO1xuaW1wb3J0IHtnZXROb2RlSW5qZWN0b3JMVmlldywgTm9kZUluamVjdG9yfSBmcm9tICcuLi9kaSc7XG5pbXBvcnQge0xWaWV3fSBmcm9tICcuLi9pbnRlcmZhY2VzL3ZpZXcnO1xuXG5pbXBvcnQge0luamVjdGVkU2VydmljZSwgSW5qZWN0b3JDcmVhdGVkSW5zdGFuY2UsIEluamVjdG9yUHJvZmlsZXJDb250ZXh0LCBJbmplY3RvclByb2ZpbGVyRXZlbnQsIEluamVjdG9yUHJvZmlsZXJFdmVudFR5cGUsIFByb3ZpZGVyUmVjb3JkLCBzZXRJbmplY3RvclByb2ZpbGVyfSBmcm9tICcuL2luamVjdG9yX3Byb2ZpbGVyJztcblxuLyoqXG4gKiBUaGVzZSBhcmUgdGhlIGRhdGEgc3RydWN0dXJlcyB0aGF0IG91ciBmcmFtZXdvcmsgaW5qZWN0b3IgcHJvZmlsZXIgd2lsbCBmaWxsIHdpdGggZGF0YSBpbiBvcmRlclxuICogdG8gc3VwcG9ydCBESSBkZWJ1Z2dpbmcgQVBJcy5cbiAqXG4gKiByZXNvbHZlclRvVG9rZW5Ub0RlcGVuZGVuY2llczogTWFwcyBhbiBpbmplY3RvciB0byBhIE1hcCBvZiB0b2tlbnMgdG8gYW4gQXJyYXkgb2ZcbiAqIGRlcGVuZGVuY2llcy4gSW5qZWN0b3IgLT4gVG9rZW4gLT4gRGVwZW5kZW5jaWVzIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHRoZVxuICogZ2V0RGVwZW5kZW5jaWVzRnJvbUluamVjdGFibGUgQVBJLCB3aGljaCB0YWtlcyBpbiBhbiBpbmplY3RvciBhbmQgYSB0b2tlbiBhbmQgcmV0dXJucyBpdCdzXG4gKiBkZXBlbmRlbmNpZXMuXG4gKlxuICogcmVzb2x2ZXJUb1Byb3ZpZGVyczogTWFwcyBhIERJIHJlc29sdmVyIChhbiBJbmplY3RvciBvciBhbiBMVmlldykgdG8gdGhlIHByb3ZpZGVycyBjb25maWd1cmVkXG4gKiB3aXRoaW4gaXQgVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgdGhlIGdldEluamVjdG9yUHJvdmlkZXJzIEFQSSwgd2hpY2ggdGFrZXMgaW4gYW4gaW5qZWN0b3IgYW5kXG4gKiByZXR1cm5zIHRoZSBwcm92aWRlcnMgdGhhdCBpdCB3YXMgY29uZmlndXJlZCB3aXRoLlxuICpcbiAqIHN0YW5kYWxvbmVJbmplY3RvclRvQ29tcG9uZW50OiBNYXBzIHRoZSBpbmplY3RvciBvZiBhIHN0YW5kYWxvbmUgY29tcG9uZW50IHRvIHRoZSBzdGFuZGFsb25lXG4gKiBjb21wb25lbnQgdGhhdCBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFVzZWQgaW4gdGhlIGdldEluamVjdG9yUHJvdmlkZXJzIEFQSSwgc3BlY2lmaWNpYWxseSBpbiB0aGVcbiAqIGRpc2NvdmVyeSBvZiBpbXBvcnQgcGF0aHMgZm9yIGVhY2ggcHJvdmlkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGltcG9ydHMgYXJyYXkgb2YgYVxuICogc3RhbmRhbG9uZSBjb21wb25lbnQgaXMgcHJvY2Vzc2VkIGFuZCBjb25maWd1cmVkIGluIGl0cyBzdGFuZGFsb25lIGluamVjdG9yLCBidXQgZXhpc3RzIHdpdGhpblxuICogdGhlIGNvbXBvbmVudCdzIGRlZmluaXRpb24uIEJlY2F1c2UgZ2V0SW5qZWN0b3JQcm92aWRlcnMgdGFrZXMgaW4gYW4gaW5qZWN0b3IsIGlmIHRoYXQgaW5qZWN0b3JcbiAqIGlzIHRoZSBpbmplY3RvciBvZiBhIHN0YW5kYWxvbmUgY29tcG9uZW50LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGlzY292ZXIgdGhlIHBsYWNlIHdoZXJlIHRoZVxuICogaW1wb3J0cyBhcnJheSBpcyBsb2NhdGVkICh0aGUgY29tcG9uZW50KSBpbiBvcmRlciB0byBmbGF0dGVuIHRoZSBpbXBvcnRzIGFycmF5IHdpdGhpbiBpdCB0b1xuICogZGlzY292ZXIgYWxsIG9mIGl0J3MgcHJvdmlkZXJzLlxuICpcbiAqXG4gKiBBbGwgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCBXZWFrTWFwcy4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBwcmVzZW5jZVxuICogb2YgYW55IG9iamVjdCBpbiB0aGUga2V5cyBvZiB0aGVzZSBtYXBzIGRvZXMgbm90IHByZXZlbnQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGZyb20gY29sbGVjdGluZ1xuICogdGhvc2Ugb2JqZWN0cy4gQmVjYXVzZSBvZiB0aGlzIHByb3BlcnR5IG9mIFdlYWtNYXBzLCB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgd2lsbCBuZXZlciBiZSB0aGVcbiAqIHNvdXJjZSBvZiBhIG1lbW9yeSBsZWFrLlxuICpcbiAqIEFuIGV4YW1wbGUgb2YgdGhpcyBhZHZhbnRhZ2U6IFdoZW4gY29tcG9uZW50cyBhcmUgZGVzdHJveWVkLCB3ZSBkb24ndCBuZWVkIHRvIGRvXG4gKiBhbnkgYWRkaXRpb25hbCB3b3JrIHRvIHJlbW92ZSB0aGF0IGNvbXBvbmVudCBmcm9tIG91ciBtYXBwaW5ncy5cbiAqXG4gKi9cbmNsYXNzIERJRGVidWdEYXRhIHtcbiAgcmVzb2x2ZXJUb1Rva2VuVG9EZXBlbmRlbmNpZXMgPVxuICAgICAgbmV3IFdlYWtNYXA8SW5qZWN0b3J8TFZpZXcsIFdlYWtNYXA8VHlwZTx1bmtub3duPiwgSW5qZWN0ZWRTZXJ2aWNlW10+PigpO1xuICByZXNvbHZlclRvUHJvdmlkZXJzID0gbmV3IFdlYWtNYXA8SW5qZWN0b3J8TFZpZXcsIFByb3ZpZGVyUmVjb3JkW10+KCk7XG4gIHN0YW5kYWxvbmVJbmplY3RvclRvQ29tcG9uZW50ID0gbmV3IFdlYWtNYXA8SW5qZWN0b3IsIFR5cGU8dW5rbm93bj4+KCk7XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5yZXNvbHZlclRvVG9rZW5Ub0RlcGVuZGVuY2llcyA9XG4gICAgICAgIG5ldyBXZWFrTWFwPEluamVjdG9yfExWaWV3LCBXZWFrTWFwPFR5cGU8dW5rbm93bj4sIEluamVjdGVkU2VydmljZVtdPj4oKTtcbiAgICB0aGlzLnJlc29sdmVyVG9Qcm92aWRlcnMgPSBuZXcgV2Vha01hcDxJbmplY3RvcnxMVmlldywgUHJvdmlkZXJSZWNvcmRbXT4oKTtcbiAgICB0aGlzLnN0YW5kYWxvbmVJbmplY3RvclRvQ29tcG9uZW50ID0gbmV3IFdlYWtNYXA8SW5qZWN0b3IsIFR5cGU8dW5rbm93bj4+KCk7XG4gIH1cbn1cblxubGV0IGZyYW1ld29ya0RJRGVidWdEYXRhID0gbmV3IERJRGVidWdEYXRhKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcmFtZXdvcmtESURlYnVnRGF0YSgpOiBESURlYnVnRGF0YSB7XG4gIHJldHVybiBmcmFtZXdvcmtESURlYnVnRGF0YTtcbn1cblxuLyoqXG4gKiBJbml0YWxpemUgZGVmYXVsdCBoYW5kbGluZyBvZiBpbmplY3RvciBldmVudHMuIFRoaXMgaGFuZGxpbmcgcGFyc2VzIGV2ZW50c1xuICogYXMgdGhleSBhcmUgZW1pdHRlZCBhbmQgY29uc3RydWN0cyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIG5lY2Vzc2FyeSB0byBzdXBwb3J0XG4gKiBzb21lIG9mIGRlYnVnIEFQSXMuXG4gKlxuICogU2VlIGhhbmRsZUluamVjdEV2ZW50LCBoYW5kbGVDcmVhdGVFdmVudCBhbmQgaGFuZGxlUHJvdmlkZXJDb25maWd1cmVkRXZlbnRcbiAqIGZvciBkZXNjcmlwdGlvbnMgb2YgZWFjaCBoYW5kbGVyXG4gKlxuICogU3VwcG9ydGVkIEFQSXM6XG4gKiAgICAgICAgICAgICAgIC0gZ2V0RGVwZW5kZW5jaWVzRnJvbUluamVjdGFibGVcbiAqICAgICAgICAgICAgICAgLSBnZXRJbmplY3RvclByb3ZpZGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBGcmFtZXdvcmtJbmplY3RvclByb2ZpbGVyKCk6IHZvaWQge1xuICBmcmFtZXdvcmtESURlYnVnRGF0YS5yZXNldCgpO1xuICBzZXRJbmplY3RvclByb2ZpbGVyKFxuICAgICAgKGluamVjdG9yUHJvZmlsZXJFdmVudCkgPT4gaGFuZGxlSW5qZWN0b3JQcm9maWxlckV2ZW50KGluamVjdG9yUHJvZmlsZXJFdmVudCkpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVJbmplY3RvclByb2ZpbGVyRXZlbnQoaW5qZWN0b3JQcm9maWxlckV2ZW50OiBJbmplY3RvclByb2ZpbGVyRXZlbnQpOiB2b2lkIHtcbiAgY29uc3Qge2NvbnRleHQsIHR5cGV9ID0gaW5qZWN0b3JQcm9maWxlckV2ZW50O1xuXG4gIGlmICh0eXBlID09PSBJbmplY3RvclByb2ZpbGVyRXZlbnRUeXBlLkluamVjdCkge1xuICAgIGhhbmRsZUluamVjdEV2ZW50KGNvbnRleHQsIGluamVjdG9yUHJvZmlsZXJFdmVudC5zZXJ2aWNlKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBJbmplY3RvclByb2ZpbGVyRXZlbnRUeXBlLkluc3RhbmNlQ3JlYXRlZEJ5SW5qZWN0b3IpIHtcbiAgICBoYW5kbGVJbnN0YW5jZUNyZWF0ZWRCeUluamVjdG9yRXZlbnQoY29udGV4dCwgaW5qZWN0b3JQcm9maWxlckV2ZW50Lmluc3RhbmNlKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBJbmplY3RvclByb2ZpbGVyRXZlbnRUeXBlLlByb3ZpZGVyQ29uZmlndXJlZCkge1xuICAgIGhhbmRsZVByb3ZpZGVyQ29uZmlndXJlZEV2ZW50KGNvbnRleHQsIGluamVjdG9yUHJvZmlsZXJFdmVudC5wcm92aWRlclJlY29yZCk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogU3RvcmVzIHRoZSBpbmplY3RlZCBzZXJ2aWNlIGluIGZyYW1ld29ya0RJRGVidWdEYXRhLnJlc29sdmVyVG9Ub2tlblRvRGVwZW5kZW5jaWVzXG4gKiBiYXNlZCBvbiBpdCdzIGluamVjdG9yIGFuZCB0b2tlbi5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCBJbmplY3RvclByb2ZpbGVyQ29udGV4dCB0aGUgaW5qZWN0aW9uIGNvbnRleHQgdGhhdCB0aGlzIGV2ZW50IG9jY3VycmVkIGluLlxuICogQHBhcmFtIGRhdGEgSW5qZWN0ZWRTZXJ2aWNlIHRoZSBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluamVjdCBldmVudC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUluamVjdEV2ZW50KGNvbnRleHQ6IEluamVjdG9yUHJvZmlsZXJDb250ZXh0LCBkYXRhOiBJbmplY3RlZFNlcnZpY2UpIHtcbiAgY29uc3QgZGlSZXNvbHZlciA9IGdldERJUmVzb2x2ZXIoY29udGV4dC5pbmplY3Rvcik7XG4gIGlmIChkaVJlc29sdmVyID09PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcignQW4gSW5qZWN0IGV2ZW50IG11c3QgYmUgcnVuIHdpdGhpbiBhbiBpbmplY3Rpb24gY29udGV4dC4nKTtcbiAgfVxuXG4gIGNvbnN0IGRpUmVzb2x2ZXJUb0luc3RhbnRpYXRlZFRva2VuID0gZnJhbWV3b3JrRElEZWJ1Z0RhdGEucmVzb2x2ZXJUb1Rva2VuVG9EZXBlbmRlbmNpZXM7XG5cbiAgaWYgKCFkaVJlc29sdmVyVG9JbnN0YW50aWF0ZWRUb2tlbi5oYXMoZGlSZXNvbHZlcikpIHtcbiAgICBkaVJlc29sdmVyVG9JbnN0YW50aWF0ZWRUb2tlbi5zZXQoZGlSZXNvbHZlciwgbmV3IFdlYWtNYXA8VHlwZTx1bmtub3duPiwgSW5qZWN0ZWRTZXJ2aWNlW10+KCkpO1xuICB9XG5cbiAgLy8gaWYgdG9rZW4gaXMgYSBwcmltaXRpdmUgdHlwZSwgaWdub3JlIHRoaXMgZXZlbnQuIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBjYW5ub3Qga2VlcCB0cmFjayBvZlxuICAvLyBub24tcHJpbWl0aXZlIHRva2VucyBpbiBXZWFrTWFwcyBzaW5jZSB0aGV5IGFyZSBub3QgZ2FyYmFnZSBjb2xsZWN0YWJsZS5cbiAgaWYgKCFjYW5CZUhlbGRXZWFrbHkoY29udGV4dC50b2tlbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpbnN0YW50aWF0ZWRUb2tlblRvRGVwZW5kZW5jaWVzID0gZGlSZXNvbHZlclRvSW5zdGFudGlhdGVkVG9rZW4uZ2V0KGRpUmVzb2x2ZXIpITtcbiAgaWYgKCFpbnN0YW50aWF0ZWRUb2tlblRvRGVwZW5kZW5jaWVzLmhhcyhjb250ZXh0LnRva2VuISkpIHtcbiAgICBpbnN0YW50aWF0ZWRUb2tlblRvRGVwZW5kZW5jaWVzLnNldChjb250ZXh0LnRva2VuISwgW10pO1xuICB9XG5cbiAgY29uc3Qge3Rva2VuLCB2YWx1ZSwgZmxhZ3N9ID0gZGF0YTtcbiAgaW5zdGFudGlhdGVkVG9rZW5Ub0RlcGVuZGVuY2llcy5nZXQoY29udGV4dC50b2tlbiEpIS5wdXNoKHt0b2tlbiwgdmFsdWUsIGZsYWdzfSk7XG59XG5cbi8qKlxuICpcbiAqIElmIHRoZSBjcmVhdGVkIGluc3RhbmNlIGlzIGFuIGluc3RhbmNlIG9mIGEgc3RhbmRhbG9uZSBjb21wb25lbnQsIG1hcHMgdGhlIGluamVjdG9yIHRvIHRoYXRcbiAqIHN0YW5kYWxvbmUgY29tcG9uZW50IGluIGZyYW1ld29ya0RJRGVidWdEYXRhLnN0YW5kYWxvbmVJbmplY3RvclRvQ29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNvbnRleHQgSW5qZWN0b3JQcm9maWxlckNvbnRleHQgdGhlIGluamVjdGlvbiBjb250ZXh0IHRoYXQgdGhpcyBldmVudCBvY2N1cnJlZCBpbi5cbiAqIEBwYXJhbSBkYXRhIEluamVjdG9yQ3JlYXRlZEluc3RhbmNlIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBpbnN0YW5jZSB0aGF0IHdhcyBqdXN0IGNyZWF0ZWRcbiAqXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUluc3RhbmNlQ3JlYXRlZEJ5SW5qZWN0b3JFdmVudChcbiAgICBjb250ZXh0OiBJbmplY3RvclByb2ZpbGVyQ29udGV4dCwgZGF0YTogSW5qZWN0b3JDcmVhdGVkSW5zdGFuY2UpOiB2b2lkIHtcbiAgY29uc3Qge3ZhbHVlfSA9IGRhdGE7XG5cbiAgaWYgKGdldERJUmVzb2x2ZXIoY29udGV4dC5pbmplY3RvcikgPT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKCdBbiBJbmplY3RvckNyZWF0ZWRJbnN0YW5jZSBldmVudCBtdXN0IGJlIHJ1biB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQuJyk7XG4gIH1cblxuICAvLyBpZiBvdXIgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgYSBzdGFuZGFsb25lIGNvbXBvbmVudCwgbWFwIHRoZSBpbmplY3RvciBvZiB0aGF0IHN0YW5kYWxvbmVcbiAgLy8gY29tcG9uZW50IHRvIHRoZSBjb21wb25lbnQgY2xhc3MuIE90aGVyd2lzZSwgdGhpcyBldmVudCBpcyBhIG5vb3AuXG4gIGxldCBzdGFuZGFsb25lQ29tcG9uZW50OiBUeXBlPHVua25vd24+fHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzdGFuZGFsb25lQ29tcG9uZW50ID0gdmFsdWU/LmNvbnN0cnVjdG9yIGFzIFR5cGU8dW5rbm93bj47XG4gIH1cbiAgaWYgKHN0YW5kYWxvbmVDb21wb25lbnQgPT09IHVuZGVmaW5lZCB8fCAhaXNTdGFuZGFsb25lQ29tcG9uZW50KHN0YW5kYWxvbmVDb21wb25lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZW52aXJvbm1lbnRJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcnxudWxsID1cbiAgICAgIGNvbnRleHQuaW5qZWN0b3IuZ2V0KEVudmlyb25tZW50SW5qZWN0b3IsIG51bGwsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAvLyBTdGFuZGFsb25lIGNvbXBvbmVudHMgc2hvdWxkIGhhdmUgYW4gZW52aXJvbm1lbnQgaW5qZWN0b3IuIElmIG9uZSBjYW5ub3QgYmVcbiAgLy8gZm91bmQgd2UgbWF5IGJlIGluIGEgdGVzdCBjYXNlIGZvciBsb3cgbGV2ZWwgZnVuY3Rpb25hbGl0eSB0aGF0IGRpZCBub3QgZXhwbGljdGx5XG4gIC8vIHNldHVwIHRoaXMgaW5qZWN0b3IuIEluIHRob3NlIGNhc2VzLCB3ZSBzaW1wbHkgaWdub3JlIHRoaXMgZXZlbnQuXG4gIGlmIChlbnZpcm9ubWVudEluamVjdG9yID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge3N0YW5kYWxvbmVJbmplY3RvclRvQ29tcG9uZW50fSA9IGZyYW1ld29ya0RJRGVidWdEYXRhO1xuXG4gIC8vIElmIG91ciBpbmplY3RvciBoYXMgYWxyZWFkeSBiZWVuIG1hcHBlZCwgYXMgaXMgdGhlIGNhc2VcbiAgLy8gd2hlbiBhIHN0YW5kYWxvbmUgY29tcG9uZW50IGltcG9ydHMgYW5vdGhlciBzdGFuZGFsb25lIGNvbXBvbmVudCxcbiAgLy8gd2UgY29uc2lkZXIgdGhlIG9yaWdpbmFsIGNvbXBvbmVudCAodGhlIGNvbXBvbmVudCBkb2luZyB0aGUgaW1wb3J0aW5nKVxuICAvLyBhcyB0aGUgY29tcG9uZW50IGNvbm5lY3RlZCB0byBvdXIgaW5qZWN0b3IuXG4gIGlmIChzdGFuZGFsb25lSW5qZWN0b3JUb0NvbXBvbmVudC5oYXMoZW52aXJvbm1lbnRJbmplY3RvcikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gSWYgb3VyIGluamVjdG9yIGhhc24ndCBiZWVuIG1hcHBlZCwgdGhlbiB3ZSBtYXAgaXQgdG8gdGhlIHN0YW5kYWxvbmUgY29tcG9uZW50XG4gIHN0YW5kYWxvbmVJbmplY3RvclRvQ29tcG9uZW50LnNldChlbnZpcm9ubWVudEluamVjdG9yLCBzdGFuZGFsb25lQ29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTdGFuZGFsb25lQ29tcG9uZW50KHZhbHVlOiBUeXBlPHVua25vd24+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZiA9IGdldENvbXBvbmVudERlZih2YWx1ZSk7XG4gIHJldHVybiAhIWRlZj8uc3RhbmRhbG9uZTtcbn1cblxuLyoqXG4gKlxuICogU3RvcmVzIHRoZSBlbWl0dGVkIFByb3ZpZGVyUmVjb3JkcyBmcm9tIHRoZSBJbmplY3RvclByb2ZpbGVyRXZlbnRUeXBlLlByb3ZpZGVyQ29uZmlndXJlZFxuICogZXZlbnQgaW4gZnJhbWV3b3JrRElEZWJ1Z0RhdGEucmVzb2x2ZXJUb1Byb3ZpZGVyc1xuICpcbiAqIEBwYXJhbSBjb250ZXh0IEluamVjdG9yUHJvZmlsZXJDb250ZXh0IHRoZSBpbmplY3Rpb24gY29udGV4dCB0aGF0IHRoaXMgZXZlbnQgb2NjdXJyZWQgaW4uXG4gKiBAcGFyYW0gZGF0YSBQcm92aWRlclJlY29yZCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgaW5zdGFuY2UgdGhhdCB3YXMganVzdCBjcmVhdGVkXG4gKlxuICovXG5mdW5jdGlvbiBoYW5kbGVQcm92aWRlckNvbmZpZ3VyZWRFdmVudChcbiAgICBjb250ZXh0OiBJbmplY3RvclByb2ZpbGVyQ29udGV4dCwgZGF0YTogUHJvdmlkZXJSZWNvcmQpOiB2b2lkIHtcbiAgY29uc3Qge3Jlc29sdmVyVG9Qcm92aWRlcnN9ID0gZnJhbWV3b3JrRElEZWJ1Z0RhdGE7XG5cbiAgY29uc3QgZGlSZXNvbHZlciA9IGdldERJUmVzb2x2ZXIoY29udGV4dD8uaW5qZWN0b3IpO1xuICBpZiAoZGlSZXNvbHZlciA9PT0gbnVsbCkge1xuICAgIHRocm93RXJyb3IoJ0EgUHJvdmlkZXJDb25maWd1cmVkIGV2ZW50IG11c3QgYmUgcnVuIHdpdGhpbiBhbiBpbmplY3Rpb24gY29udGV4dC4nKTtcbiAgfVxuXG4gIGlmICghcmVzb2x2ZXJUb1Byb3ZpZGVycy5oYXMoZGlSZXNvbHZlcikpIHtcbiAgICByZXNvbHZlclRvUHJvdmlkZXJzLnNldChkaVJlc29sdmVyLCBbXSk7XG4gIH1cblxuICByZXNvbHZlclRvUHJvdmlkZXJzLmdldChkaVJlc29sdmVyKSEucHVzaChkYXRhKTtcbn1cblxuZnVuY3Rpb24gZ2V0RElSZXNvbHZlcihpbmplY3RvcjogSW5qZWN0b3J8dW5kZWZpbmVkKTogSW5qZWN0b3J8TFZpZXd8bnVsbCB7XG4gIGxldCBkaVJlc29sdmVyOiBJbmplY3RvcnxMVmlld3xudWxsID0gbnVsbDtcblxuICBpZiAoaW5qZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkaVJlc29sdmVyO1xuICB9XG5cbiAgLy8gV2UgdXNlIHRoZSBMVmlldyBhcyB0aGUgZGlSZXNvbHZlciBmb3IgTm9kZUluamVjdG9ycyBiZWNhdXNlIHRoZXlcbiAgLy8gZG8gbm90IHBlcnNpc3QgYW55d2hlcmUgaW4gdGhlIGZyYW1ld29yay4gVGhleSBhcmUgc2ltcGx5IHdyYXBwZXJzIGFyb3VuZCBhbiBMVmlldyBhbmQgYSBUTm9kZVxuICAvLyB0aGF0IGRvIHBlcnNpc3QuIEJlY2F1c2Ugb2YgdGhpcywgd2UgcmVseSBvbiB0aGUgTFZpZXcgb2YgdGhlIE5vZGVJbmplY3RvciBpbiBvcmRlciB0byB1c2VcbiAgLy8gYXMgYSBjb25jcmV0ZSBrZXkgdG8gcmVwcmVzZW50IHRoaXMgaW5qZWN0b3IuIElmIHdlIGdldCB0aGUgc2FtZSBMVmlldyBiYWNrIGxhdGVyLCB3ZSBrbm93XG4gIC8vIHdlJ3JlIGxvb2tpbmcgYXQgdGhlIHNhbWUgaW5qZWN0b3IuXG4gIGlmIChpbmplY3RvciBpbnN0YW5jZW9mIE5vZGVJbmplY3Rvcikge1xuICAgIGRpUmVzb2x2ZXIgPSBnZXROb2RlSW5qZWN0b3JMVmlldyhpbmplY3Rvcik7XG4gIH1cbiAgLy8gT3RoZXIgaW5qZWN0b3JzIGNhbiBiZSB1c2VkIGEga2V5cyBmb3IgYSBtYXAgYmVjYXVzZSB0aGVpciBpbnN0YW5jZXNcbiAgLy8gcGVyc2lzdFxuICBlbHNlIHtcbiAgICBkaVJlc29sdmVyID0gaW5qZWN0b3I7XG4gIH1cblxuICByZXR1cm4gZGlSZXNvbHZlcjtcbn1cblxuLy8gaW5zcGlyZWQgYnlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyL211bHRpcGFnZS9leGVjdXRhYmxlLWNvZGUtYW5kLWV4ZWN1dGlvbi1jb250ZXh0cy5odG1sI3NlYy1jYW5iZWhlbGR3ZWFrbHlcbmZ1bmN0aW9uIGNhbkJlSGVsZFdlYWtseSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIC8vIHdlIGNoZWNrIGZvciB2YWx1ZSAhPT0gbnVsbCBoZXJlIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09ICdvYmplY3RcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyk7XG59XG4iXX0=
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { resolveForwardRef } from '../../di/forward_ref';
9
+ import { throwError } from '../../util/assert';
10
+ let _injectorProfilerContext;
11
+ export function getInjectorProfilerContext() {
12
+ !ngDevMode && throwError('getInjectorProfilerContext should never be called in production mode');
13
+ return _injectorProfilerContext;
14
+ }
15
+ export function setInjectorProfilerContext(context) {
16
+ !ngDevMode && throwError('setInjectorProfilerContext should never be called in production mode');
17
+ const previous = _injectorProfilerContext;
18
+ _injectorProfilerContext = context;
19
+ return previous;
20
+ }
21
+ let injectorProfilerCallback = null;
22
+ /**
23
+ * Sets the callback function which will be invoked during certain DI events within the
24
+ * runtime (for example: injecting services, creating injectable instances, configuring providers)
25
+ *
26
+ * Warning: this function is *INTERNAL* and should not be relied upon in application's code.
27
+ * The contract of the function might be changed in any release and/or the function can be removed
28
+ * completely.
29
+ *
30
+ * @param profiler function provided by the caller or null value to disable profiling.
31
+ */
32
+ export const setInjectorProfiler = (injectorProfiler) => {
33
+ !ngDevMode && throwError('setInjectorProfiler should never be called in production mode');
34
+ injectorProfilerCallback = injectorProfiler;
35
+ };
36
+ /**
37
+ * Injector profiler function which emits on DI events executed by the runtime.
38
+ *
39
+ * @param event InjectorProfilerEvent corresponding to the DI event being emitted
40
+ */
41
+ function injectorProfiler(event) {
42
+ !ngDevMode && throwError('Injector profiler should never be called in production mode');
43
+ if (injectorProfilerCallback != null /* both `null` and `undefined` */) {
44
+ injectorProfilerCallback(event);
45
+ }
46
+ }
47
+ /**
48
+ * Emits an InjectorProfilerEventType.ProviderConfigured to the injector profiler. The data in the
49
+ * emitted event includes the raw provider, as well as the token that provider is providing.
50
+ *
51
+ * @param provider A provider object
52
+ */
53
+ export function emitProviderConfiguredEvent(provider, isViewProvider = false) {
54
+ !ngDevMode && throwError('Injector profiler should never be called in production mode');
55
+ injectorProfiler({
56
+ type: 2 /* InjectorProfilerEventType.ProviderConfigured */,
57
+ context: getInjectorProfilerContext(),
58
+ providerRecord: {
59
+ token: typeof provider === 'function' ? provider : resolveForwardRef(provider.provide),
60
+ provider,
61
+ isViewProvider
62
+ }
63
+ });
64
+ }
65
+ /**
66
+ * Emits an event to the injector profiler with the instance that was created. Note that
67
+ * the injector associated with this emission can be accessed by using getDebugInjectContext()
68
+ *
69
+ * @param instance an object created by an injector
70
+ */
71
+ export function emitInstanceCreatedByInjectorEvent(instance) {
72
+ !ngDevMode && throwError('Injector profiler should never be called in production mode');
73
+ injectorProfiler({
74
+ type: 1 /* InjectorProfilerEventType.InstanceCreatedByInjector */,
75
+ context: getInjectorProfilerContext(),
76
+ instance: { value: instance }
77
+ });
78
+ }
79
+ /**
80
+ * @param token DI token associated with injected service
81
+ * @param value the instance of the injected service (i.e the result of `inject(token)`)
82
+ * @param flags the flags that the token was injected with
83
+ */
84
+ export function emitInjectEvent(token, value, flags) {
85
+ !ngDevMode && throwError('Injector profiler should never be called in production mode');
86
+ injectorProfiler({
87
+ type: 0 /* InjectorProfilerEventType.Inject */,
88
+ context: getInjectorProfilerContext(),
89
+ service: { token, value, flags }
90
+ });
91
+ }
92
+ export function runInInjectorProfilerContext(injector, token, callback) {
93
+ !ngDevMode &&
94
+ throwError('runInInjectorProfilerContext should never be called in production mode');
95
+ const prevInjectContext = setInjectorProfilerContext({ injector, token });
96
+ try {
97
+ callback();
98
+ }
99
+ finally {
100
+ setInjectorProfilerContext(prevInjectContext);
101
+ }
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0b3JfcHJvZmlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2RlYnVnL2luamVjdG9yX3Byb2ZpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBTXZELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQW9JN0MsSUFBSSx3QkFBaUQsQ0FBQztBQUN0RCxNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQ2pHLE9BQU8sd0JBQXdCLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxPQUFnQztJQUN6RSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUMsc0VBQXNFLENBQUMsQ0FBQztJQUVqRyxNQUFNLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQztJQUMxQyx3QkFBd0IsR0FBRyxPQUFPLENBQUM7SUFDbkMsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELElBQUksd0JBQXdCLEdBQTBCLElBQUksQ0FBQztBQUUzRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLGdCQUF1QyxFQUFFLEVBQUU7SUFDN0UsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLCtEQUErRCxDQUFDLENBQUM7SUFDMUYsd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDOUMsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBNEI7SUFDcEQsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFFeEYsSUFBSSx3QkFBd0IsSUFBSSxJQUFJLENBQUMsaUNBQWlDLEVBQUU7UUFDdEUsd0JBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbEM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQ3ZDLFFBQXdCLEVBQUUsaUJBQTBCLEtBQUs7SUFDM0QsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFFeEYsZ0JBQWdCLENBQUM7UUFDZixJQUFJLHNEQUE4QztRQUNsRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUU7UUFDckMsY0FBYyxFQUFFO1lBQ2QsS0FBSyxFQUFFLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3RGLFFBQVE7WUFDUixjQUFjO1NBQ2Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0NBQWtDLENBQUMsUUFBaUI7SUFDbEUsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFFeEYsZ0JBQWdCLENBQUM7UUFDZixJQUFJLDZEQUFxRDtRQUN6RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUU7UUFDckMsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQztLQUM1QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBb0IsRUFBRSxLQUFjLEVBQUUsS0FBa0I7SUFDdEYsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFFeEYsZ0JBQWdCLENBQUM7UUFDZixJQUFJLDBDQUFrQztRQUN0QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUU7UUFDckMsT0FBTyxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUM7S0FDL0IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEIsQ0FDeEMsUUFBa0IsRUFBRSxLQUFvQixFQUFFLFFBQW9CO0lBQ2hFLENBQUMsU0FBUztRQUNOLFVBQVUsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBRXpGLE1BQU0saUJBQWlCLEdBQUcsMEJBQTBCLENBQUMsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztJQUN4RSxJQUFJO1FBQ0YsUUFBUSxFQUFFLENBQUM7S0FDWjtZQUFTO1FBQ1IsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUMvQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtyZXNvbHZlRm9yd2FyZFJlZn0gZnJvbSAnLi4vLi4vZGkvZm9yd2FyZF9yZWYnO1xuaW1wb3J0IHtJbmplY3Rpb25Ub2tlbn0gZnJvbSAnLi4vLi4vZGkvaW5qZWN0aW9uX3Rva2VuJztcbmltcG9ydCB0eXBlIHtJbmplY3Rvcn0gZnJvbSAnLi4vLi4vZGkvaW5qZWN0b3InO1xuaW1wb3J0IHtJbmplY3RGbGFncywgSW5qZWN0T3B0aW9ucywgSW50ZXJuYWxJbmplY3RGbGFnc30gZnJvbSAnLi4vLi4vZGkvaW50ZXJmYWNlL2luamVjdG9yJztcbmltcG9ydCB0eXBlIHtTaW5nbGVQcm92aWRlcn0gZnJvbSAnLi4vLi4vZGkvcHJvdmlkZXJfY29sbGVjdGlvbic7XG5pbXBvcnQge1R5cGV9IGZyb20gJy4uLy4uL2ludGVyZmFjZS90eXBlJztcbmltcG9ydCB7dGhyb3dFcnJvcn0gZnJvbSAnLi4vLi4vdXRpbC9hc3NlcnQnO1xuXG4vKipcbiAqIEFuIGVudW0gZGVzY3JpYmluZyB0aGUgdHlwZXMgb2YgZXZlbnRzIHRoYXQgY2FuIGJlIGVtaXR0ZWQgZnJvbSB0aGUgaW5qZWN0b3IgcHJvZmlsZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gSW5qZWN0b3JQcm9maWxlckV2ZW50VHlwZSB7XG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIGEgc2VydmljZSBpcyBpbmplY3RlZC5cbiAgICovXG4gIEluamVjdCxcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhbiBBbmd1bGFyIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgYW4gaW5qZWN0b3IuXG4gICAqL1xuICBJbnN0YW5jZUNyZWF0ZWRCeUluamVjdG9yLFxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIGFuIGluamVjdG9yIGNvbmZpZ3VyZXMgYSBwcm92aWRlci5cbiAgICovXG4gIFByb3ZpZGVyQ29uZmlndXJlZFxufVxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGRlZmluZXMgYW4gaW5qZWN0aW9uIGNvbnRleHQgZm9yIHRoZSBpbmplY3RvciBwcm9maWxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RvclByb2ZpbGVyQ29udGV4dCB7XG4gIC8qKlxuICAgKiAgVGhlIEluamVjdG9yIHRoYXQgc2VydmljZSBpcyBiZWluZyBpbmplY3RlZCBpbnRvLlxuICAgKiAgICAgIC0gRXhhbXBsZTogaWYgTW9kdWxlQSAtLXByb3ZpZGVzLS0+IFNlcnZpY2VBIC0taW5qZWN0cy0tPiBTZXJ2aWNlQlxuICAgKiAgICAgICAgICAgICAgICAgdGhlbiBpbmplY3QoU2VydmljZUIpIGluIFNlcnZpY2VBIGhhcyBNb2R1bGVBIGFzIGFuIGluamVjdG9yIGNvbnRleHRcbiAgICovXG4gIGluamVjdG9yOiBJbmplY3RvcjtcblxuICAvKipcbiAgICogIFRoZSBjbGFzcyB3aGVyZSB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyBjYWxsaW5nIGBpbmplY3RgIGlzIGxvY2F0ZWRcbiAgICogICAgICAtIEV4YW1wbGU6IGlmIE1vZHVsZUEgLS1wcm92aWRlcy0tPiBTZXJ2aWNlQSAtLWluamVjdHMtLT4gU2VydmljZUJcbiAgICogICAgICAgICAgICAgICAgIHRoZW4gaW5qZWN0KFNlcnZpY2VCKSBpbiBTZXJ2aWNlQSBoYXMgU2VydmljZUEgYXMgYSBjb25zdHJ1Y3Rpb24gY29udGV4dFxuICAgKi9cbiAgdG9rZW46IFR5cGU8dW5rbm93bj58bnVsbDtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdGVkU2VydmljZUV2ZW50IHtcbiAgdHlwZTogSW5qZWN0b3JQcm9maWxlckV2ZW50VHlwZS5JbmplY3Q7XG4gIGNvbnRleHQ6IEluamVjdG9yUHJvZmlsZXJDb250ZXh0O1xuICBzZXJ2aWNlOiBJbmplY3RlZFNlcnZpY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0b3JDcmVhdGVkSW5zdGFuY2VFdmVudCB7XG4gIHR5cGU6IEluamVjdG9yUHJvZmlsZXJFdmVudFR5cGUuSW5zdGFuY2VDcmVhdGVkQnlJbmplY3RvcjtcbiAgY29udGV4dDogSW5qZWN0b3JQcm9maWxlckNvbnRleHQ7XG4gIGluc3RhbmNlOiBJbmplY3RvckNyZWF0ZWRJbnN0YW5jZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckNvbmZpZ3VyZWRFdmVudCB7XG4gIHR5cGU6IEluamVjdG9yUHJvZmlsZXJFdmVudFR5cGUuUHJvdmlkZXJDb25maWd1cmVkO1xuICBjb250ZXh0OiBJbmplY3RvclByb2ZpbGVyQ29udGV4dDtcbiAgcHJvdmlkZXJSZWNvcmQ6IFByb3ZpZGVyUmVjb3JkO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHRocm91Z2ggdGhlIGluamVjdG9yIHByb2ZpbGVyXG4gKi9cblxuZXhwb3J0IHR5cGUgSW5qZWN0b3JQcm9maWxlckV2ZW50ID1cbiAgICBJbmplY3RlZFNlcnZpY2VFdmVudHxJbmplY3RvckNyZWF0ZWRJbnN0YW5jZUV2ZW50fFByb3ZpZGVyQ29uZmlndXJlZEV2ZW50O1xuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvdmlkZXIgdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJSZWNvcmQge1xuICAvKipcbiAgICogREkgdG9rZW4gdGhhdCB0aGlzIHByb3ZpZGVyIGlzIGNvbmZpZ3VyaW5nXG4gICAqL1xuICB0b2tlbjogVHlwZTx1bmtub3duPjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBwcm92aWRlciBpcyBjb25maWd1cmVkIGFzIHZpZXcgcHJvdmlkZXIuXG4gICAqL1xuICBpc1ZpZXdQcm92aWRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJhdyBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBQcm92aWRlclJlY29yZC5cbiAgICovXG4gIHByb3ZpZGVyOiBTaW5nbGVQcm92aWRlcjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgREkgY29udGFpbmVycyB0aGF0IHdlcmUgZm9sbG93ZWQgdG8gaW1wb3J0IHRoaXMgcHJvdmlkZXJcbiAgICovXG4gIGltcG9ydFBhdGg/OiBUeXBlPHVua25vd24+W107XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGNvbnN0cnVjdGVkIHdpdGhpbiBhbiBpbmplY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdG9yQ3JlYXRlZEluc3RhbmNlIHtcbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSBjcmVhdGVkIGluc3RhbmNlXG4gICAqL1xuICB2YWx1ZTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhIHNlcnZpY2UgdGhhdCBoYXMgYmVlbiBpbmplY3RlZCB3aXRoaW4gYW5cbiAqIEluamVjdG9yUHJvZmlsZXJDb250ZXh0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0ZWRTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIERJIHRva2VuIG9mIHRoZSBTZXJ2aWNlIHRoYXQgaXMgaW5qZWN0ZWRcbiAgICovXG4gIHRva2VuPzogVHlwZTx1bmtub3duPnxJbmplY3Rpb25Ub2tlbjx1bmtub3duPjtcblxuICAvKipcbiAgICogVmFsdWUgb2YgdGhlIGluamVjdGVkIHNlcnZpY2VcbiAgICovXG4gIHZhbHVlOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBGbGFncyB0aGF0IHRoaXMgc2VydmljZSB3YXMgaW5qZWN0ZWQgd2l0aFxuICAgKi9cbiAgZmxhZ3M/OiBJbnRlcm5hbEluamVjdEZsYWdzfEluamVjdEZsYWdzfEluamVjdE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEluamVjdG9yIHRoYXQgdGhpcyBzZXJ2aWNlIHdhcyBwcm92aWRlZCBpbi5cbiAgICovXG4gIHByb3ZpZGVkSW4/OiBJbmplY3Rvcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmplY3RvclByb2ZpbGVyIHtcbiAgKGV2ZW50OiBJbmplY3RvclByb2ZpbGVyRXZlbnQpOiB2b2lkO1xufVxuXG5sZXQgX2luamVjdG9yUHJvZmlsZXJDb250ZXh0OiBJbmplY3RvclByb2ZpbGVyQ29udGV4dDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmplY3RvclByb2ZpbGVyQ29udGV4dCgpIHtcbiAgIW5nRGV2TW9kZSAmJiB0aHJvd0Vycm9yKCdnZXRJbmplY3RvclByb2ZpbGVyQ29udGV4dCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIHByb2R1Y3Rpb24gbW9kZScpO1xuICByZXR1cm4gX2luamVjdG9yUHJvZmlsZXJDb250ZXh0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SW5qZWN0b3JQcm9maWxlckNvbnRleHQoY29udGV4dDogSW5qZWN0b3JQcm9maWxlckNvbnRleHQpIHtcbiAgIW5nRGV2TW9kZSAmJiB0aHJvd0Vycm9yKCdzZXRJbmplY3RvclByb2ZpbGVyQ29udGV4dCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIHByb2R1Y3Rpb24gbW9kZScpO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gX2luamVjdG9yUHJvZmlsZXJDb250ZXh0O1xuICBfaW5qZWN0b3JQcm9maWxlckNvbnRleHQgPSBjb250ZXh0O1xuICByZXR1cm4gcHJldmlvdXM7XG59XG5cbmxldCBpbmplY3RvclByb2ZpbGVyQ2FsbGJhY2s6IEluamVjdG9yUHJvZmlsZXJ8bnVsbCA9IG51bGw7XG5cbi8qKlxuICogU2V0cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIGR1cmluZyBjZXJ0YWluIERJIGV2ZW50cyB3aXRoaW4gdGhlXG4gKiBydW50aW1lIChmb3IgZXhhbXBsZTogaW5qZWN0aW5nIHNlcnZpY2VzLCBjcmVhdGluZyBpbmplY3RhYmxlIGluc3RhbmNlcywgY29uZmlndXJpbmcgcHJvdmlkZXJzKVxuICpcbiAqIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24gaXMgKklOVEVSTkFMKiBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgdXBvbiBpbiBhcHBsaWNhdGlvbidzIGNvZGUuXG4gKiBUaGUgY29udHJhY3Qgb2YgdGhlIGZ1bmN0aW9uIG1pZ2h0IGJlIGNoYW5nZWQgaW4gYW55IHJlbGVhc2UgYW5kL29yIHRoZSBmdW5jdGlvbiBjYW4gYmUgcmVtb3ZlZFxuICogY29tcGxldGVseS5cbiAqXG4gKiBAcGFyYW0gcHJvZmlsZXIgZnVuY3Rpb24gcHJvdmlkZWQgYnkgdGhlIGNhbGxlciBvciBudWxsIHZhbHVlIHRvIGRpc2FibGUgcHJvZmlsaW5nLlxuICovXG5leHBvcnQgY29uc3Qgc2V0SW5qZWN0b3JQcm9maWxlciA9IChpbmplY3RvclByb2ZpbGVyOiBJbmplY3RvclByb2ZpbGVyfG51bGwpID0+IHtcbiAgIW5nRGV2TW9kZSAmJiB0aHJvd0Vycm9yKCdzZXRJbmplY3RvclByb2ZpbGVyIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gcHJvZHVjdGlvbiBtb2RlJyk7XG4gIGluamVjdG9yUHJvZmlsZXJDYWxsYmFjayA9IGluamVjdG9yUHJvZmlsZXI7XG59O1xuXG4vKipcbiAqIEluamVjdG9yIHByb2ZpbGVyIGZ1bmN0aW9uIHdoaWNoIGVtaXRzIG9uIERJIGV2ZW50cyBleGVjdXRlZCBieSB0aGUgcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgSW5qZWN0b3JQcm9maWxlckV2ZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIERJIGV2ZW50IGJlaW5nIGVtaXR0ZWRcbiAqL1xuZnVuY3Rpb24gaW5qZWN0b3JQcm9maWxlcihldmVudDogSW5qZWN0b3JQcm9maWxlckV2ZW50KTogdm9pZCB7XG4gICFuZ0Rldk1vZGUgJiYgdGhyb3dFcnJvcignSW5qZWN0b3IgcHJvZmlsZXIgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBwcm9kdWN0aW9uIG1vZGUnKTtcblxuICBpZiAoaW5qZWN0b3JQcm9maWxlckNhbGxiYWNrICE9IG51bGwgLyogYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgICovKSB7XG4gICAgaW5qZWN0b3JQcm9maWxlckNhbGxiYWNrIShldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0cyBhbiBJbmplY3RvclByb2ZpbGVyRXZlbnRUeXBlLlByb3ZpZGVyQ29uZmlndXJlZCB0byB0aGUgaW5qZWN0b3IgcHJvZmlsZXIuIFRoZSBkYXRhIGluIHRoZVxuICogZW1pdHRlZCBldmVudCBpbmNsdWRlcyB0aGUgcmF3IHByb3ZpZGVyLCBhcyB3ZWxsIGFzIHRoZSB0b2tlbiB0aGF0IHByb3ZpZGVyIGlzIHByb3ZpZGluZy5cbiAqXG4gKiBAcGFyYW0gcHJvdmlkZXIgQSBwcm92aWRlciBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtaXRQcm92aWRlckNvbmZpZ3VyZWRFdmVudChcbiAgICBwcm92aWRlcjogU2luZ2xlUHJvdmlkZXIsIGlzVmlld1Byb3ZpZGVyOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgIW5nRGV2TW9kZSAmJiB0aHJvd0Vycm9yKCdJbmplY3RvciBwcm9maWxlciBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIHByb2R1Y3Rpb24gbW9kZScpO1xuXG4gIGluamVjdG9yUHJvZmlsZXIoe1xuICAgIHR5cGU6IEluamVjdG9yUHJvZmlsZXJFdmVudFR5cGUuUHJvdmlkZXJDb25maWd1cmVkLFxuICAgIGNvbnRleHQ6IGdldEluamVjdG9yUHJvZmlsZXJDb250ZXh0KCksXG4gICAgcHJvdmlkZXJSZWNvcmQ6IHtcbiAgICAgIHRva2VuOiB0eXBlb2YgcHJvdmlkZXIgPT09ICdmdW5jdGlvbicgPyBwcm92aWRlciA6IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyLnByb3ZpZGUpLFxuICAgICAgcHJvdmlkZXIsXG4gICAgICBpc1ZpZXdQcm92aWRlclxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogRW1pdHMgYW4gZXZlbnQgdG8gdGhlIGluamVjdG9yIHByb2ZpbGVyIHdpdGggdGhlIGluc3RhbmNlIHRoYXQgd2FzIGNyZWF0ZWQuIE5vdGUgdGhhdFxuICogdGhlIGluamVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVtaXNzaW9uIGNhbiBiZSBhY2Nlc3NlZCBieSB1c2luZyBnZXREZWJ1Z0luamVjdENvbnRleHQoKVxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZSBhbiBvYmplY3QgY3JlYXRlZCBieSBhbiBpbmplY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1pdEluc3RhbmNlQ3JlYXRlZEJ5SW5qZWN0b3JFdmVudChpbnN0YW5jZTogdW5rbm93bik6IHZvaWQge1xuICAhbmdEZXZNb2RlICYmIHRocm93RXJyb3IoJ0luamVjdG9yIHByb2ZpbGVyIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gcHJvZHVjdGlvbiBtb2RlJyk7XG5cbiAgaW5qZWN0b3JQcm9maWxlcih7XG4gICAgdHlwZTogSW5qZWN0b3JQcm9maWxlckV2ZW50VHlwZS5JbnN0YW5jZUNyZWF0ZWRCeUluamVjdG9yLFxuICAgIGNvbnRleHQ6IGdldEluamVjdG9yUHJvZmlsZXJDb250ZXh0KCksXG4gICAgaW5zdGFuY2U6IHt2YWx1ZTogaW5zdGFuY2V9XG4gIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB0b2tlbiBESSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggaW5qZWN0ZWQgc2VydmljZVxuICogQHBhcmFtIHZhbHVlIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW5qZWN0ZWQgc2VydmljZSAoaS5lIHRoZSByZXN1bHQgb2YgYGluamVjdCh0b2tlbilgKVxuICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0aGF0IHRoZSB0b2tlbiB3YXMgaW5qZWN0ZWQgd2l0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1pdEluamVjdEV2ZW50KHRva2VuOiBUeXBlPHVua25vd24+LCB2YWx1ZTogdW5rbm93biwgZmxhZ3M6IEluamVjdEZsYWdzKTogdm9pZCB7XG4gICFuZ0Rldk1vZGUgJiYgdGhyb3dFcnJvcignSW5qZWN0b3IgcHJvZmlsZXIgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBwcm9kdWN0aW9uIG1vZGUnKTtcblxuICBpbmplY3RvclByb2ZpbGVyKHtcbiAgICB0eXBlOiBJbmplY3RvclByb2ZpbGVyRXZlbnRUeXBlLkluamVjdCxcbiAgICBjb250ZXh0OiBnZXRJbmplY3RvclByb2ZpbGVyQ29udGV4dCgpLFxuICAgIHNlcnZpY2U6IHt0b2tlbiwgdmFsdWUsIGZsYWdzfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkluSW5qZWN0b3JQcm9maWxlckNvbnRleHQoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLCB0b2tlbjogVHlwZTx1bmtub3duPiwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgIW5nRGV2TW9kZSAmJlxuICAgICAgdGhyb3dFcnJvcigncnVuSW5JbmplY3RvclByb2ZpbGVyQ29udGV4dCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIHByb2R1Y3Rpb24gbW9kZScpO1xuXG4gIGNvbnN0IHByZXZJbmplY3RDb250ZXh0ID0gc2V0SW5qZWN0b3JQcm9maWxlckNvbnRleHQoe2luamVjdG9yLCB0b2tlbn0pO1xuICB0cnkge1xuICAgIGNhbGxiYWNrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0SW5qZWN0b3JQcm9maWxlckNvbnRleHQocHJldkluamVjdENvbnRleHQpO1xuICB9XG59XG4iXX0=