UNPKG

@angular/core

Version:

Angular - the core framework

946 lines 88.8 kB
/** * @fileoverview added by tsickle * Generated from: packages/core/testing/src/test_bed.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { ApplicationInitStatus, Component, InjectFlags, Injector, NgModule, NgZone, Optional, SkipSelf, ɵclearOverrides as clearOverrides, ɵgetInjectableDef as getInjectableDef, ɵINJECTOR_SCOPE as INJECTOR_SCOPE, ɵivyEnabled as ivyEnabled, ɵoverrideComponentView as overrideComponentView, ɵoverrideProvider as overrideProvider, ɵstringify as stringify } from '@angular/core'; import { AsyncTestCompleter } from './async_test_completer'; import { ComponentFixture } from './component_fixture'; import { _getTestBedRender3, TestBedRender3 } from './r3_test_bed'; import { ComponentFixtureAutoDetect, ComponentFixtureNoNgZone, TestComponentRenderer } from './test_bed_common'; import { TestingCompilerFactory } from './test_compiler'; /** @type {?} */ let _nextRootElementId = 0; // WARNING: interface has both a type and a value, skipping emit /** * \@description * Configures and initializes environment for unit testing and provides methods for * creating components and services in unit tests. * * `TestBed` is the primary api for writing unit tests for Angular applications and libraries. * * Note: Use `TestBed` in tests. It will be set to either `TestBedViewEngine` or `TestBedRender3` * according to the compiler used. */ export class TestBedViewEngine { constructor() { this._instantiated = false; this._compiler = (/** @type {?} */ (null)); this._moduleRef = (/** @type {?} */ (null)); this._moduleFactory = (/** @type {?} */ (null)); this._compilerOptions = []; this._moduleOverrides = []; this._componentOverrides = []; this._directiveOverrides = []; this._pipeOverrides = []; this._providers = []; this._declarations = []; this._imports = []; this._schemas = []; this._activeFixtures = []; this._testEnvAotSummaries = (/** * @return {?} */ () => []); this._aotSummaries = []; this._templateOverrides = []; this._isRoot = true; this._rootProviderOverrides = []; this.platform = (/** @type {?} */ (null)); this.ngModule = (/** @type {?} */ (null)); } /** * Initialize the environment for testing with a compiler factory, a PlatformRef, and an * angular module. These are common to every test in the suite. * * This may only be called once, to set up the common providers for the current test * suite on the current platform. If you absolutely need to change the providers, * first use `resetTestEnvironment`. * * Test modules and platforms for individual platforms are available from * '\@angular/<platform_name>/testing'. * @param {?} ngModule * @param {?} platform * @param {?=} aotSummaries * @return {?} */ static initTestEnvironment(ngModule, platform, aotSummaries) { /** @type {?} */ const testBed = _getTestBedViewEngine(); testBed.initTestEnvironment(ngModule, platform, aotSummaries); return testBed; } /** * Reset the providers for the test injector. * @return {?} */ static resetTestEnvironment() { _getTestBedViewEngine().resetTestEnvironment(); } /** * @return {?} */ static resetTestingModule() { _getTestBedViewEngine().resetTestingModule(); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * Allows overriding default compiler providers and settings * which are defined in test_injector.js * @param {?} config * @return {?} */ static configureCompiler(config) { _getTestBedViewEngine().configureCompiler(config); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * Allows overriding default providers, directives, pipes, modules of the test injector, * which are defined in test_injector.js * @param {?} moduleDef * @return {?} */ static configureTestingModule(moduleDef) { _getTestBedViewEngine().configureTestingModule(moduleDef); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * Compile components with a `templateUrl` for the test's NgModule. * It is necessary to call this function * as fetching urls is asynchronous. * @return {?} */ static compileComponents() { return getTestBed().compileComponents(); } /** * @param {?} ngModule * @param {?} override * @return {?} */ static overrideModule(ngModule, override) { _getTestBedViewEngine().overrideModule(ngModule, override); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * @param {?} component * @param {?} override * @return {?} */ static overrideComponent(component, override) { _getTestBedViewEngine().overrideComponent(component, override); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * @param {?} directive * @param {?} override * @return {?} */ static overrideDirective(directive, override) { _getTestBedViewEngine().overrideDirective(directive, override); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * @param {?} pipe * @param {?} override * @return {?} */ static overridePipe(pipe, override) { _getTestBedViewEngine().overridePipe(pipe, override); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * @param {?} component * @param {?} template * @return {?} */ static overrideTemplate(component, template) { _getTestBedViewEngine().overrideComponent(component, { set: { template, templateUrl: (/** @type {?} */ (null)) } }); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * Overrides the template of the given component, compiling the template * in the context of the TestingModule. * * Note: This works for JIT and AOTed components as well. * @param {?} component * @param {?} template * @return {?} */ static overrideTemplateUsingTestingModule(component, template) { _getTestBedViewEngine().overrideTemplateUsingTestingModule(component, template); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * @param {?} token * @param {?} provider * @return {?} */ static overrideProvider(token, provider) { _getTestBedViewEngine().overrideProvider(token, (/** @type {?} */ (provider))); return (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); } /** * @template T * @param {?} token * @param {?=} notFoundValue * @param {?=} flags * @return {?} */ static inject(token, notFoundValue, flags) { return _getTestBedViewEngine().inject(token, notFoundValue, flags); } /** * @deprecated from v9.0.0 use TestBed.inject * @param {?} token * @param {?=} notFoundValue * @param {?=} flags * @return {?} */ static get(token, notFoundValue = Injector.THROW_IF_NOT_FOUND, flags = InjectFlags.Default) { return _getTestBedViewEngine().inject(token, notFoundValue, flags); } /** * @template T * @param {?} component * @return {?} */ static createComponent(component) { return _getTestBedViewEngine().createComponent(component); } /** * Initialize the environment for testing with a compiler factory, a PlatformRef, and an * angular module. These are common to every test in the suite. * * This may only be called once, to set up the common providers for the current test * suite on the current platform. If you absolutely need to change the providers, * first use `resetTestEnvironment`. * * Test modules and platforms for individual platforms are available from * '\@angular/<platform_name>/testing'. * @param {?} ngModule * @param {?} platform * @param {?=} aotSummaries * @return {?} */ initTestEnvironment(ngModule, platform, aotSummaries) { if (this.platform || this.ngModule) { throw new Error('Cannot set base providers because it has already been called'); } this.platform = platform; this.ngModule = ngModule; if (aotSummaries) { this._testEnvAotSummaries = aotSummaries; } } /** * Reset the providers for the test injector. * @return {?} */ resetTestEnvironment() { this.resetTestingModule(); this.platform = (/** @type {?} */ (null)); this.ngModule = (/** @type {?} */ (null)); this._testEnvAotSummaries = (/** * @return {?} */ () => []); } /** * @return {?} */ resetTestingModule() { clearOverrides(); this._aotSummaries = []; this._templateOverrides = []; this._compiler = (/** @type {?} */ (null)); this._moduleOverrides = []; this._componentOverrides = []; this._directiveOverrides = []; this._pipeOverrides = []; this._isRoot = true; this._rootProviderOverrides = []; this._moduleRef = (/** @type {?} */ (null)); this._moduleFactory = (/** @type {?} */ (null)); this._compilerOptions = []; this._providers = []; this._declarations = []; this._imports = []; this._schemas = []; this._instantiated = false; this._activeFixtures.forEach((/** * @param {?} fixture * @return {?} */ (fixture) => { try { fixture.destroy(); } catch (e) { console.error('Error during cleanup of component', { component: fixture.componentInstance, stacktrace: e, }); } })); this._activeFixtures = []; } /** * @param {?} config * @return {?} */ configureCompiler(config) { this._assertNotInstantiated('TestBed.configureCompiler', 'configure the compiler'); this._compilerOptions.push(config); } /** * @param {?} moduleDef * @return {?} */ configureTestingModule(moduleDef) { this._assertNotInstantiated('TestBed.configureTestingModule', 'configure the test module'); if (moduleDef.providers) { this._providers.push(...moduleDef.providers); } if (moduleDef.declarations) { this._declarations.push(...moduleDef.declarations); } if (moduleDef.imports) { this._imports.push(...moduleDef.imports); } if (moduleDef.schemas) { this._schemas.push(...moduleDef.schemas); } if (moduleDef.aotSummaries) { this._aotSummaries.push(moduleDef.aotSummaries); } } /** * @return {?} */ compileComponents() { if (this._moduleFactory || this._instantiated) { return Promise.resolve(null); } /** @type {?} */ const moduleType = this._createCompilerAndModule(); return this._compiler.compileModuleAndAllComponentsAsync(moduleType) .then((/** * @param {?} moduleAndComponentFactories * @return {?} */ (moduleAndComponentFactories) => { this._moduleFactory = moduleAndComponentFactories.ngModuleFactory; })); } /** * @private * @return {?} */ _initIfNeeded() { if (this._instantiated) { return; } if (!this._moduleFactory) { try { /** @type {?} */ const moduleType = this._createCompilerAndModule(); this._moduleFactory = this._compiler.compileModuleAndAllComponentsSync(moduleType).ngModuleFactory; } catch (e) { /** @type {?} */ const errorCompType = this._compiler.getComponentFromError(e); if (errorCompType) { throw new Error(`This test module uses the component ${stringify(errorCompType)} which is using a "templateUrl" or "styleUrls", but they were never compiled. ` + `Please call "TestBed.compileComponents" before your test.`); } else { throw e; } } } for (const { component, templateOf } of this._templateOverrides) { /** @type {?} */ const compFactory = this._compiler.getComponentFactory(templateOf); overrideComponentView(component, compFactory); } /** @type {?} */ const ngZone = new NgZone({ enableLongStackTrace: true, shouldCoalesceEventChangeDetection: false }); /** @type {?} */ const providers = [{ provide: NgZone, useValue: ngZone }]; /** @type {?} */ const ngZoneInjector = Injector.create({ providers: providers, parent: this.platform.injector, name: this._moduleFactory.moduleType.name }); this._moduleRef = this._moduleFactory.create(ngZoneInjector); // ApplicationInitStatus.runInitializers() is marked @internal to core. So casting to any // before accessing it. ((/** @type {?} */ (this._moduleRef.injector.get(ApplicationInitStatus)))).runInitializers(); this._instantiated = true; } /** * @private * @return {?} */ _createCompilerAndModule() { /** @type {?} */ const providers = this._providers.concat([{ provide: TestBed, useValue: this }]); /** @type {?} */ const declarations = [...this._declarations, ...this._templateOverrides.map((/** * @param {?} entry * @return {?} */ entry => entry.templateOf))]; /** @type {?} */ const rootScopeImports = []; /** @type {?} */ const rootProviderOverrides = this._rootProviderOverrides; if (this._isRoot) { class RootScopeModule { } RootScopeModule.decorators = [ { type: NgModule, args: [{ providers: [ ...rootProviderOverrides, ], jit: true, },] }, ]; rootScopeImports.push(RootScopeModule); } providers.push({ provide: INJECTOR_SCOPE, useValue: this._isRoot ? 'root' : null }); /** @type {?} */ const imports = [rootScopeImports, this.ngModule, this._imports]; /** @type {?} */ const schemas = this._schemas; class DynamicTestModule { } DynamicTestModule.decorators = [ { type: NgModule, args: [{ providers, declarations, imports, schemas, jit: true },] }, ]; /** @type {?} */ const compilerFactory = this.platform.injector.get(TestingCompilerFactory); this._compiler = compilerFactory.createTestingCompiler(this._compilerOptions); for (const summary of [this._testEnvAotSummaries, ...this._aotSummaries]) { this._compiler.loadAotSummaries(summary); } this._moduleOverrides.forEach((/** * @param {?} entry * @return {?} */ (entry) => this._compiler.overrideModule(entry[0], entry[1]))); this._componentOverrides.forEach((/** * @param {?} entry * @return {?} */ (entry) => this._compiler.overrideComponent(entry[0], entry[1]))); this._directiveOverrides.forEach((/** * @param {?} entry * @return {?} */ (entry) => this._compiler.overrideDirective(entry[0], entry[1]))); this._pipeOverrides.forEach((/** * @param {?} entry * @return {?} */ (entry) => this._compiler.overridePipe(entry[0], entry[1]))); return DynamicTestModule; } /** * @private * @param {?} methodName * @param {?} methodDescription * @return {?} */ _assertNotInstantiated(methodName, methodDescription) { if (this._instantiated) { throw new Error(`Cannot ${methodDescription} when the test module has already been instantiated. ` + `Make sure you are not using \`inject\` before \`${methodName}\`.`); } } /** * @template T * @param {?} token * @param {?=} notFoundValue * @param {?=} flags * @return {?} */ inject(token, notFoundValue, flags) { this._initIfNeeded(); if ((/** @type {?} */ (token)) === TestBed) { return (/** @type {?} */ (this)); } // Tests can inject things from the ng module and from the compiler, // but the ng module can't inject things from the compiler and vice versa. /** @type {?} */ const UNDEFINED = {}; /** @type {?} */ const result = this._moduleRef.injector.get(token, UNDEFINED, flags); return result === UNDEFINED ? (/** @type {?} */ (this._compiler.injector.get(token, notFoundValue, flags))) : result; } /** * @deprecated from v9.0.0 use TestBed.inject * @param {?} token * @param {?=} notFoundValue * @param {?=} flags * @return {?} */ get(token, notFoundValue = Injector.THROW_IF_NOT_FOUND, flags = InjectFlags.Default) { return this.inject(token, notFoundValue, flags); } /** * @param {?} tokens * @param {?} fn * @param {?=} context * @return {?} */ execute(tokens, fn, context) { this._initIfNeeded(); /** @type {?} */ const params = tokens.map((/** * @param {?} t * @return {?} */ t => this.inject(t))); return fn.apply(context, params); } /** * @param {?} ngModule * @param {?} override * @return {?} */ overrideModule(ngModule, override) { this._assertNotInstantiated('overrideModule', 'override module metadata'); this._moduleOverrides.push([ngModule, override]); } /** * @param {?} component * @param {?} override * @return {?} */ overrideComponent(component, override) { this._assertNotInstantiated('overrideComponent', 'override component metadata'); this._componentOverrides.push([component, override]); } /** * @param {?} directive * @param {?} override * @return {?} */ overrideDirective(directive, override) { this._assertNotInstantiated('overrideDirective', 'override directive metadata'); this._directiveOverrides.push([directive, override]); } /** * @param {?} pipe * @param {?} override * @return {?} */ overridePipe(pipe, override) { this._assertNotInstantiated('overridePipe', 'override pipe metadata'); this._pipeOverrides.push([pipe, override]); } /** * @param {?} token * @param {?} provider * @return {?} */ overrideProvider(token, provider) { this.overrideProviderImpl(token, provider); } /** * @private * @param {?} token * @param {?} provider * @param {?=} deprecated * @return {?} */ overrideProviderImpl(token, provider, deprecated = false) { /** @type {?} */ let def = null; if (typeof token !== 'string' && (def = getInjectableDef(token)) && def.providedIn === 'root') { if (provider.useFactory) { this._rootProviderOverrides.push({ provide: token, useFactory: provider.useFactory, deps: provider.deps || [] }); } else { this._rootProviderOverrides.push({ provide: token, useValue: provider.useValue }); } } /** @type {?} */ let flags = 0; /** @type {?} */ let value; if (provider.useFactory) { flags |= 1024 /* TypeFactoryProvider */; value = provider.useFactory; } else { flags |= 256 /* TypeValueProvider */; value = provider.useValue; } /** @type {?} */ const deps = (provider.deps || []).map((/** * @param {?} dep * @return {?} */ (dep) => { /** @type {?} */ let depFlags = 0 /* None */; /** @type {?} */ let depToken; if (Array.isArray(dep)) { dep.forEach((/** * @param {?} entry * @return {?} */ (entry) => { if (entry instanceof Optional) { depFlags |= 2 /* Optional */; } else if (entry instanceof SkipSelf) { depFlags |= 1 /* SkipSelf */; } else { depToken = entry; } })); } else { depToken = dep; } return [depFlags, depToken]; })); overrideProvider({ token, flags, deps, value, deprecatedBehavior: deprecated }); } /** * @param {?} component * @param {?} template * @return {?} */ overrideTemplateUsingTestingModule(component, template) { this._assertNotInstantiated('overrideTemplateUsingTestingModule', 'override template'); class OverrideComponent { } OverrideComponent.decorators = [ { type: Component, args: [{ selector: 'empty', template, jit: true },] }, ]; this._templateOverrides.push({ component, templateOf: OverrideComponent }); } /** * @template T * @param {?} component * @return {?} */ createComponent(component) { this._initIfNeeded(); /** @type {?} */ const componentFactory = this._compiler.getComponentFactory(component); if (!componentFactory) { throw new Error(`Cannot create the component ${stringify(component)} as it was not imported into the testing module!`); } // TODO: Don't cast as `InjectionToken<boolean>`, declared type is boolean[] /** @type {?} */ const noNgZone = this.inject((/** @type {?} */ (ComponentFixtureNoNgZone)), false); // TODO: Don't cast as `InjectionToken<boolean>`, declared type is boolean[] /** @type {?} */ const autoDetect = this.inject((/** @type {?} */ (ComponentFixtureAutoDetect)), false); /** @type {?} */ const ngZone = noNgZone ? null : this.inject(NgZone, null); /** @type {?} */ const testComponentRenderer = this.inject(TestComponentRenderer); /** @type {?} */ const rootElId = `root${_nextRootElementId++}`; testComponentRenderer.insertRootElement(rootElId); /** @type {?} */ const initComponent = (/** * @return {?} */ () => { /** @type {?} */ const componentRef = componentFactory.create(Injector.NULL, [], `#${rootElId}`, this._moduleRef); return new ComponentFixture(componentRef, ngZone, autoDetect); }); /** @type {?} */ const fixture = !ngZone ? initComponent() : ngZone.run(initComponent); this._activeFixtures.push(fixture); return fixture; } } if (false) { /** * @type {?} * @private */ TestBedViewEngine.prototype._instantiated; /** * @type {?} * @private */ TestBedViewEngine.prototype._compiler; /** * @type {?} * @private */ TestBedViewEngine.prototype._moduleRef; /** * @type {?} * @private */ TestBedViewEngine.prototype._moduleFactory; /** * @type {?} * @private */ TestBedViewEngine.prototype._compilerOptions; /** * @type {?} * @private */ TestBedViewEngine.prototype._moduleOverrides; /** * @type {?} * @private */ TestBedViewEngine.prototype._componentOverrides; /** * @type {?} * @private */ TestBedViewEngine.prototype._directiveOverrides; /** * @type {?} * @private */ TestBedViewEngine.prototype._pipeOverrides; /** * @type {?} * @private */ TestBedViewEngine.prototype._providers; /** * @type {?} * @private */ TestBedViewEngine.prototype._declarations; /** * @type {?} * @private */ TestBedViewEngine.prototype._imports; /** * @type {?} * @private */ TestBedViewEngine.prototype._schemas; /** * @type {?} * @private */ TestBedViewEngine.prototype._activeFixtures; /** * @type {?} * @private */ TestBedViewEngine.prototype._testEnvAotSummaries; /** * @type {?} * @private */ TestBedViewEngine.prototype._aotSummaries; /** * @type {?} * @private */ TestBedViewEngine.prototype._templateOverrides; /** * @type {?} * @private */ TestBedViewEngine.prototype._isRoot; /** * @type {?} * @private */ TestBedViewEngine.prototype._rootProviderOverrides; /** @type {?} */ TestBedViewEngine.prototype.platform; /** @type {?} */ TestBedViewEngine.prototype.ngModule; } /** * \@description * Configures and initializes environment for unit testing and provides methods for * creating components and services in unit tests. * * `TestBed` is the primary api for writing unit tests for Angular applications and libraries. * * Note: Use `TestBed` in tests. It will be set to either `TestBedViewEngine` or `TestBedRender3` * according to the compiler used. * * \@publicApi * @type {?} */ export const TestBed = ivyEnabled ? (/** @type {?} */ ((/** @type {?} */ (TestBedRender3)))) : (/** @type {?} */ ((/** @type {?} */ (TestBedViewEngine)))); /** * Returns a singleton of the applicable `TestBed`. * * It will be either an instance of `TestBedViewEngine` or `TestBedRender3`. * * \@publicApi * @type {?} */ export const getTestBed = ivyEnabled ? _getTestBedRender3 : _getTestBedViewEngine; /** @type {?} */ let testBed; /** * @return {?} */ function _getTestBedViewEngine() { return testBed = testBed || new TestBedViewEngine(); } /** * Allows injecting dependencies in `beforeEach()` and `it()`. * * Example: * * ``` * beforeEach(inject([Dependency, AClass], (dep, object) => { * // some code that uses `dep` and `object` * // ... * })); * * it('...', inject([AClass], (object) => { * object.doSomething(); * expect(...); * }) * ``` * * Notes: * - inject is currently a function because of some Traceur limitation the syntax should * eventually * becomes `it('...', \@Inject (object: AClass, async: AsyncTestCompleter) => { ... });` * * \@publicApi * @param {?} tokens * @param {?} fn * @return {?} */ export function inject(tokens, fn) { /** @type {?} */ const testBed = getTestBed(); if (tokens.indexOf(AsyncTestCompleter) >= 0) { // Not using an arrow function to preserve context passed from call site return (/** * @this {?} * @return {?} */ function () { // Return an async test method that returns a Promise if AsyncTestCompleter is one of // the injected tokens. return testBed.compileComponents().then((/** * @return {?} */ () => { /** @type {?} */ const completer = testBed.inject(AsyncTestCompleter); testBed.execute(tokens, fn, this); return completer.promise; })); }); } else { // Not using an arrow function to preserve context passed from call site return (/** * @this {?} * @return {?} */ function () { return testBed.execute(tokens, fn, this); }); } } /** * \@publicApi */ export class InjectSetupWrapper { /** * @param {?} _moduleDef */ constructor(_moduleDef) { this._moduleDef = _moduleDef; } /** * @private * @return {?} */ _addModule() { /** @type {?} */ const moduleDef = this._moduleDef(); if (moduleDef) { getTestBed().configureTestingModule(moduleDef); } } /** * @param {?} tokens * @param {?} fn * @return {?} */ inject(tokens, fn) { /** @type {?} */ const self = this; // Not using an arrow function to preserve context passed from call site return (/** * @this {?} * @return {?} */ function () { self._addModule(); return inject(tokens, fn).call(this); }); } } if (false) { /** * @type {?} * @private */ InjectSetupWrapper.prototype._moduleDef; } /** * @param {?} moduleDef * @param {?=} fn * @return {?} */ export function withModule(moduleDef, fn) { if (fn) { // Not using an arrow function to preserve context passed from call site return (/** * @this {?} * @return {?} */ function () { /** @type {?} */ const testBed = getTestBed(); if (moduleDef) { testBed.configureTestingModule(moduleDef); } return fn.apply(this); }); } return new InjectSetupWrapper((/** * @return {?} */ () => moduleDef)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9iZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3Rlc3Rpbmcvc3JjL3Rlc3RfYmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVFBLE9BQU8sRUFBZSxxQkFBcUIsRUFBbUIsU0FBUyxFQUFhLFdBQVcsRUFBa0IsUUFBUSxFQUFFLFFBQVEsRUFBZ0MsTUFBTSxFQUFFLFFBQVEsRUFBK0MsUUFBUSxFQUF3QixlQUFlLElBQUksY0FBYyxFQUF5QixpQkFBaUIsSUFBSSxnQkFBZ0IsRUFBRSxlQUFlLElBQUksY0FBYyxFQUFFLFdBQVcsSUFBSSxVQUFVLEVBQTJCLHNCQUFzQixJQUFJLHFCQUFxQixFQUFFLGlCQUFpQixJQUFJLGdCQUFnQixFQUFFLFVBQVUsSUFBSSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBRWpsQixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBQywwQkFBMEIsRUFBRSx3QkFBd0IsRUFBaUIscUJBQXFCLEVBQXFCLE1BQU0sbUJBQW1CLENBQUM7QUFDakosT0FBTyxFQUFrQixzQkFBc0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDOztJQUdwRSxrQkFBa0IsR0FBRyxDQUFDOzs7Ozs7Ozs7Ozs7QUFvRjFCLE1BQU0sT0FBTyxpQkFBaUI7SUFBOUI7UUFpSlUsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFFL0IsY0FBUyxHQUFvQixtQkFBQSxJQUFJLEVBQUMsQ0FBQztRQUNuQyxlQUFVLEdBQXFCLG1CQUFBLElBQUksRUFBQyxDQUFDO1FBQ3JDLG1CQUFjLEdBQXlCLG1CQUFBLElBQUksRUFBQyxDQUFDO1FB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