Business as usual

Version 5.0.0 of Angular, pentagonal-donut is here! This major release contains an abundance of new features and bugfixes; its aim is to continue the Angular team’s focus on making it smaller, faster, and easier to use. But even though we’re still in awe of the release, it’s business as usual for the Angular team.

Angular 5 is here. Don’t know about you but we’re very excited that it’s finally here! It contains a lot of new features and bugfixes but we’re not going to cover them all here.

For the complete list of features and bugfixes, see the changelog.



Build Optimizer

Stephen Fluin, Developer Advocate at Google explained in a blog post announcing Angular 5 that as of version 5.0.0, production builds created with the CLI will now apply the build optimizer by default. The build optimizer —a tool included in their CLI for making users’ bundles smaller using the team’s semantic understanding of users’ Angular application— has a double job:

the Angular team was able to mark parts of users’ application as pure , which improves the tree shaking provided by the existing tools, removing additional parts of users’ application that aren’t needed.

, which improves the tree shaking provided by the existing tools, removing additional parts of users’ application that aren’t needed. the tool removes Angular decorators from users’ application’s runtime code. Decorators are used by the compiler, and aren’t needed at runtime and can be removed.

The aim of these jobs is to decrease the size of your JavaScript bundles, and increase the boot speed of your application for your users.

Angular Universal State Transfer API and DOM Support

Angular Universal focuses on helping developers to perform server-side rendering (SSR) of Angular applications. By rendering your Angular applications on the server and then bootstrapping on top of the generated HTML, you can add support for scrapers and crawlers that don’t support JavaScript, and you can increase the perceived performance of your application, Fluin explained.

There’s also ServerTransferStateModule and the corresponding BrowserTransferStateModule, which allows you to generate information as part of your rendering with platform-server, and then transfer it to the client side so that this information does not need to be regenerated. The team has also welcomed Domino to platform-server, which means that more DOM manipulations are supported out of the box within server-side contexts.

Compiler Improvements

The Angular compiler has been improved to support incremental compilation — This provides faster rebuilds, especially for production builds and builds with AOT. The Angular team has also added features to the Decorators and made it possible to ship smaller bundles by removing whitespace.

HttpClient

Developers appreciated the new HttpClient (introduced in version 4.3) so the team is now recommending HttpClient for all applications, and deprecating the previous @angular/http library .

To update to HttpClient, you’ll need to replace HttpModule with HttpClientModule from @angular/common/http in each of your modules, inject the HttpClient service, and remove any map(res => res.json()) calls, which are no longer needed.

CLI v1.5

Starting with v1.5 of the Angular CLI, the team added support for Angular v5.0.0 and will generate v5 projects by default. The build optimizer has been turned on by default, so developers can now benefit from smaller bundles.

They’ve also updated the way .tsconfig files are used to follow TypeScript standards more strictly. By default, the CLI configures TypeScript without files or include sections, so most developers won’t be affected by this.

New Router Lifecycle Events

There’s a new lifecycle events to the router which allows developers to track the cycle of the router from the start of running guards through to completion of activation.

The list of highlights is much longer so make sure to check out Stephen Fluin’s blog post.

Update October 31, 2017

Four more bugfixes — the release candidate tap is still open so that means the 10th rc. is here.

Update October 30, 2017

The ninth release candidate is here. I don’t know about you but we were definitely not expecting to see rc.8. Anyway, it’s here and it brings two bugfixes:

compiler-cli: avoid producing source mappings for host views (#19965) (2d508a3)

avoid producing source mappings for host views (#19965) (2d508a3) platform-server: add missing packages to the UMD global rollup config (4285b6c)

Update October 27, 2017

There’s still space for one more. rc.7 is here and it brings seven bugfixes. Are we there yet??

Update October 26, 2017

Another day, another candidate release — lucky number seven this time. Obviously, there are only bugfixes (four of them, to be exact) but it’s still a good reason to celebrate: one step closer to Angular 5.

Update October 24, 2017

Release candidates come in twos now: rc.4 and rc.5 were released earlier today — the former brings three bugfixes and the latter brings just one. Is today the day Angular 5 is released? We wish we knew the answer to this question.

Update October 19, 2017

The fourth release candidate only brings bugfixes (14 of them) and you know what that means!

In theory, Angular 5 should arrive next week — it remains to be seen if the schedule is respected but we’re seeing some good signs.

Bug fixes

animations: always fire inner trigger callbacks even if blocked by parent animations (#19753) (5a9ed2d), closes #19100

always fire inner trigger callbacks even if blocked by parent animations (#19753) (5a9ed2d), closes #19100 animations: ensure animateChild() works with all inner leave animations (#19006) (#19532) (#19693) (f42d317)

ensure animateChild() works with all inner leave animations (#19006) (#19532) (#19693) (f42d317) animations: ensure inner :leave animations do not remove node when skipped (#19532) (#19693) (d035175)

ensure inner :leave animations do not remove node when skipped (#19532) (#19693) (d035175) bazel: fix the output directory for extractor to be genfiles/ instead of bin/ (#19716) (405ccc7)

fix the output directory for extractor to be genfiles/ instead of bin/ (#19716) (405ccc7) common: attempt to JSON.parse errors for JSON responses (#19773) (04ab9f1)

attempt to JSON.parse errors for JSON responses (#19773) (04ab9f1) compiler: generate correct imports for type check blocks (#19582) (60bdcd6)

generate correct imports for type check blocks (#19582) (60bdcd6) compiler: prepare for future Bazel semantics of += (#19717) (836c889)

prepare for future Bazel semantics of += (#19717) (836c889) compiler-cli: diagnostics file paths relative to cwd, not tsconfig (#19748) (56774df)

diagnostics file paths relative to cwd, not tsconfig (#19748) (56774df) compiler-cli: do not add references to files outside of rootDir (#19770) (25cbc98)

do not add references to files outside of (#19770) (25cbc98) router: RouterLinkActive should update its state right after checking the children (#19449) (6f2939d), closes #18983

RouterLinkActive should update its state right after checking the children (#19449) (6f2939d), closes #18983 service-worker: add missing annotation for SwPush (#19721) (15a8429)

add missing annotation for SwPush (#19721) (15a8429) service-worker: freshness strategy should clone response for cache (#19764) (396c241)

freshness strategy should clone response for cache (#19764) (396c241) service-worker: PushEvent.data has to be decoded (#19764) (3bcf0cf)

PushEvent.data has to be decoded (#19764) (3bcf0cf) service-worker: use posix path resolution for generation of ngsw.json (#19527) (621f87b)

Update October 13, 2017

The third release candidate is here — it contains three bugfixes and four performance improvements.

Performance improvements

animations: reduce size of bundle by removing AST classes (#19539) (d5c9c5f)

reduce size of bundle by removing AST classes (#19539) (d5c9c5f) compiler: only type check input files when using bazel (#19581) (0b06ea1)

only type check input files when using bazel (#19581) (0b06ea1) compiler: skip type check and emit in bazel in some cases. (#19646) (a22121d)

skip type check and emit in bazel in some cases. (#19646) (a22121d) compiler: speed up loading of summaries for bazel. (#19581) (81167d9)

According to the old tentative schedule (the one which said that Angular 5 will become available on September 18 — find it below), there should be four release candidates in total. If this is still valid, there’s only one release candidate left!

Update October 6, 2017

The second release candidate is here — it contains 13 bugfixes and three performance improvements.

Performance improvements

compiler: don’t emit summaries for jit by default (b086891)

don’t emit summaries for jit by default (b086891) compiler: fix perf issue in loading aot summaries in jit compiler (fbc9537)

fix perf issue in loading aot summaries in jit compiler (fbc9537) compiler: only emit changed files for incremental compilation (745b59f)

Update September 29, 2017

The release candidate period has begun! The first release candidate is here — it contains over 30 bugfixes, six features, three performance improvements and one breaking change.

Get ready because Angular 5 will be here before you know it!

Features

animations: support negative query limit values (86ffacf), closes #19259

support negative query limit values (86ffacf), closes #19259 compiler: enabled strict checking of parameters to an @Injectable (#19412) (dfb8d21)

enabled strict checking of parameters to an (#19412) (dfb8d21) compiler: reuse the TypeScript typecheck for template typechecking. (#19152) (996c7c2)

reuse the TypeScript typecheck for template typechecking. (#19152) (996c7c2) core: support for bootstrap with custom zone (#17672) (344a5ca)

support for bootstrap with custom zone (#17672) (344a5ca) platform-server: add an API to transfer state from server (#19134) (cfd9ca0)

add an API to transfer state from server (#19134) (cfd9ca0) service-worker: introduce the @angular/service-worker package (#19274) (d442b68)

Performance improvements

compiler: make the creation of ts.Program faster. (#19275) (edd5f5a)

make the creation of faster. (#19275) (edd5f5a) compiler: only use tsickle if needed (#19275) (8f95b75)

only use tsickle if needed (#19275) (8f95b75) compiler: speed up watch mode (#19275) (6665d76)

Breaking changes

compiler: The method ngGetConentSelectors() , deprecated in Angular 4.0, has been removed. Use ComponentFactory.ngContentSelectors instead.

Update September 14, 2017

If the tentative schedule still stands, we should be days away from Angular 5. However, we might have to wait until next month. No matter when Angular 5 is released, one thing is certain: the countdown has begun.

The eighth beta was released yesterday with 11 bugfixes, a couple of breaking changes and three features.

Code refactoring

router: remove deprecated RouterOutlet properties (a9ef858)

remove deprecated properties (a9ef858) update angular to support TypeScript 2.4 (ca5aeba)

Features

compiler: deprecate i18n comments in favor of ng-container (#18998) (66a5dab)

deprecate i18n comments in favor of (#18998) (66a5dab) platform-server: provide a way to hook into renderModule* (#19023) (8dfc3c3)

provide a way to hook into renderModule* (#19023) (8dfc3c3) router: add ActivationStart/End events (8f79150)

Breaking changes

the Angular compiler now requires TypeScript 2.4.x.

router: RouterOutlet properties locationInjector and locationFactoryResolver have been removed as they were deprecated since v4.

Update September 4, 2017

The Angular team is racing towards the finish line [a.k.a. Angular 5]! The seventh beta contains 21 bugfixes and nine features, as well as two breaking changes. Let’s have a quick look at what beta.6 has to offer:

Features

http : deprecate @angular/http in favor of @angular/common/http (#18906) (72c7b6e)

: deprecate @angular/http in favor of @angular/common/http (#18906) (72c7b6e) common: accept object map for HttpClient headers & params (#18490) (1b1d5f1)

accept object map for HttpClient headers & params (#18490) (1b1d5f1) common: generate closure-locale.ts to tree shake locale data (#18907) (4878936)

generate to tree shake locale data (#18907) (4878936) compiler: set enableLegacyTemplate to false by default (#18756) (56238fe)

set to false by default (#18756) (56238fe) compiler-cli: add watch mode to ngc (#18818) (cf7d47d)

add watch mode to (#18818) (cf7d47d) compiler-cli: add watch mode to ngc (#18818) (06d01b2)

add watch mode to (#18818) (06d01b2) compiler-cli: lower metadata useValue and data literal fields (#18905) (0e64261)

lower metadata and literal fields (#18905) (0e64261) compiler-cli: lower metadata useValue and data literal fields (#18905) (c685cc2)

lower metadata and literal fields (#18905) (c685cc2) platform-server: provide a DOM implementation on the server (2f2d5f3), closes #14638

Code refactoring

core: remove deprecated OpaqueToken (#18971) (3c4eef8)

Breaking changes

core: OpaqueToken has been removed as it was deprecated since v4. Use InjectionToken instead.

has been removed as it was deprecated since v4. Use instead. compiler: the compiler option enableLegacyTemplate is now disabled by default as the <template> element has been deprecated since v4. Use <ng-template> instead. The option enableLegacyTemplate and the <template> element will both be removed in Angular v6.

Angular 4.4.0: First release candidate is here

In other news, the first release candidate for Angular 4.4.0 is here. It contains five bugfixes and two features, namely

compiler: allow multiple exportAs names (#18723) (7ec28fe)

allow multiple exportAs names (#18723) (7ec28fe) core: add option to remove blank text nodes from compiled templates (#18823) (b8b551c)

For the complete up to date list of features and bugfixes, check out the changelog.

Update August 30, 2017

The beta season is in full swing! The Angular team released beta.5 and there are plenty of things to look at: it contains 11 bugfixes, eight features and a lot of breaking changes. One thing’s sure — the 6th beta release will keep you busy; in comparison with beta.4, this one has a longer list of breaking changes, features and bugfixes.

Let’s have a quick look at the breaking changes:

router: RouterOutlet properties locationInjector and locationFactoryResolver have been removed as they were deprecated since v4.

properties and have been removed as they were deprecated since v4. compiler: – @angular/platform-server now additionally depends on @angular/platform-browser-dynamic as a peer dependency.

now additionally depends on as a peer dependency. common: Because of multiple bugs and browser inconsistencies, we have dropped the intl api in favor of data exported from the Unicode Common Locale Data Repository (CLDR). Unfortunately we had to change the i18n pipes (date, number, currency, percent) and there are some breaking changes.

I18n pipes

Breaking change: By default Angular now only contains locale data for the language en-US , if you set the value of LOCALE_ID to another locale, you will have to import new locale data for this language because we don’t use the intl API anymore.

Features: you don’t need to use the intl polyfill for Angular anymore. all i18n pipes now have an additional last parameter locale which allows you to use a specific locale instead of the one defined in the token LOCALE_ID (whose value is en-US by default). the new locale data extracted from CLDR are now available to developers as well and can be used through an API (which should be especially useful for library authors). you can still use the old pipes for now, but their names have been changed and they are no longer included in the CommonModule . To use them, you will have to import the DeprecatedI18NPipesModule after the CommonModule (the order is important):



import { NgModule } from '@angular/core'; import { CommonModule, DeprecatedI18NPipesModule } from '@angular/common'; @NgModule({ imports: [ CommonModule, // import deprecated module after DeprecatedI18NPipesModule ] }) export class AppModule { }

Don’t forget that you will still need to import the intl API polyfill if you want to use those deprecated pipes.

Date pipe

Breaking changes: the predefined formats ( short , shortTime , shortDate , medium , …) now use the patterns given by CLDR (like it was in AngularJS) instead of the ones from the intl API. You might notice some changes, e.g. shortDate will be 8/15/17 instead of 8/15/2017 for en-US . the narrow version of eras is now GGGGG instead of G , the format G is now similar to GG and GGG . the narrow version of months is now MMMMM instead of L , the format L is now the short standalone version of months. the narrow version of the week day is now EEEEE instead of E , the format E is now similar to EE and EEE . the timezone z will now fallback to O and output GMT+1 instead of the complete zone name (e.g. Pacific Standard Time ), this is because the quantity of data required to have all the zone names in all of the existing locales is too big. the timezone Z will now output the ISO8601 basic format, e.g. +0100 , you should now use ZZZZ to get GMT+01:00 .



Features new predefined formats long , full , longTime , fullTime . the format yyy is now supported, e.g. the year 52 will be 052 and the year 2017 will be 2017 . standalone months are now supported with the formats L to LLLLL . week of the year is now supported with the formats w and ww , e.g. weeks 5 and 05 . week of the month is now supported with the format W , e.g. week 3 . fractional seconds are now supported with the format S to SSS . day periods for AM/PM now supports additional formats aa , aaa , aaaa and aaaaa . The formats a to aaa are similar, while aaaa is the wide version if available (e.g. ante meridiem for am ), or equivalent to a otherwise, and aaaaa is the narrow version (e.g. a for am ). extra day periods are now supported with the formats b to bbbbb (and B to BBBBB for the standalone equivalents), e.g. morning , noon , afternoon , …. the short non-localized timezones are now available with the format O to OOOO . The formats O to OOO will output GMT+1 while the format OOOO will be GMT+01:00 . the ISO8601 basic time zones are now available with the formats Z to ZZZZZ . The formats Z to ZZZ will output +0100 , while the format ZZZZ will be GMT+01:00 and ZZZZZ will be +01:00 .

Bug fixes the date pipe will now work exactly the same across all browsers, which will fix a lot of bugs for safari and IE. eras can now be used on their own without the date, e.g. the format GG will be AD instead of 8 15, 2017 AD .



Currency pipe

Breaking change: the default value for symbolDisplay is now symbol instead of code . This means that by default you will see $4.99 for en-US instead of USD4.99 previously.

Deprecation: the second parameter of the currency pipe ( symbolDisplay ) is no longer a boolean, it now takes the values code , symbol or symbol-narrow . A boolean value is still valid for now, but it is deprecated and it will print a warning message in the console.

Features: you can now choose between code , symbol or symbol-narrow which gives you access to more options for some currencies (e.g. the canadian dollar with the code CAD has the symbol CA$ and the symbol-narrow $ ).



Percent pipe

Breaking change if you don’t specify the number of digits to round to, the local format will be used (and it usually rounds numbers to 0 digits, instead of not rounding previously), e.g. {{ 3.141592 | percent }} will output 314% for the locale en-US instead of 314.1592% previously.

common: NgFor has been removed as it was deprecated since v4. Use NgForOf instead. This does not impact the use of *ngFor in your templates.

has been removed as it was deprecated since v4. Use instead. This does not impact the use of in your templates. common: NgTemplateOutlet#ngOutletContext has been removed as it was deprecated since v4. Use NgTemplateOutlet#ngTemplateOutletContext instead.

has been removed as it was deprecated since v4. Use instead. core: Testability#findBindings has been removed as it was deprecated since v4. Use Testability#findProviders instead.

has been removed as it was deprecated since v4. Use instead. core: DebugNode#source has been removed as it was deprecated since v4.

has been removed as it was deprecated since v4. router: the values true , false , legacy_enabled and legacy_disabled for the router parameter initialNavigation have been removed as they were deprecated. Use enabled or disabled instead.

, , and for the router parameter have been removed as they were deprecated. Use or instead. core: DifferFactory.create no longer takes ChangeDetectionRef as a first argument as it was not used and deprecated since v4.

no longer takes ChangeDetectionRef as a first argument as it was not used and deprecated since v4. core: TrackByFn has been removed because it was deprecated since v4. Use TrackByFunction instead.

has been removed because it was deprecated since v4. Use instead. platform-webworker: PRIMITIVE has been removed as it was deprecated since v4. Use SerializerTypes.PRIMITIVE instead.

has been removed as it was deprecated since v4. Use instead. platform-browser: NgProbeToken has been removed from @angular/platform-browser as it was deprecated since v4. Import it from @angular/core instead.

has been removed from as it was deprecated since v4. Import it from instead. core: ErrorHandler no longer takes a parameter as it was not used and deprecated since v4.

no longer takes a parameter as it was not used and deprecated since v4. compiler: the option useDebug for the compiler has been removed as it had no effect and was deprecated since v4.

Just a quick reminder: Angular 5 is fast approaching

For the complete up to date list of features and bugfixes, check out the changelog.

Update August 3, 2017

Angular 5.0 beta is now in testing!

We’re on our way to the latest milestone in the path to Angular 5. As mentioned earlier this year, Angular 5 has a tentative release date in September. And so, as the summer continues, things are starting to move quickly with this upcoming release.

So, what’s up with Angular 5? Some new feature and performance improvements, but mostly a lot of bugfixes.

Features

compiler: add representation of placeholders to xliff & xmb

add representation of placeholders to xliff & xmb forms: add options arg to abstract controls

add options arg to abstract controls router: add events tracking activation of individual routes

Performance Improvements

latest tsickle to tree shake: abstract class methods & interfaces

core: use native addEventListener for faster rendering.

For the complete up to date list of features and bugfixes, check out the changelog.

Update July 17, 2017

What’s new in Angular 4.3?

First things first: Angular 4.3 is a minor release following the announced adoption of Semantic Versioning. This means that there are no breaking changes and that it is a drop-in replacement for 4.x.x, according to the blog post announcing the release. It contains 24 bugfixes and 12 features.

What’s new?

Say hello to HttpClient , a smaller, easier to use, and more powerful library for making HTTP Requests. More details here.

, a smaller, easier to use, and more powerful library for making HTTP Requests. More details here. New router life cycle events for Guards and Resolvers. Four new events: GuardsCheckStart , GuardsCheckEnd , ResolveStart , ResolveEnd join the existing set of life cycle event such as NavigationStart

, , , join the existing set of life cycle event such as Conditionally disable animations via a new attribute, [@.disabled]

Support for the emulated /deep/ CSS Selector (the Shadow-Piercing descendant combinator aka >>>) has been deprecated to match browser implementations and Chrome’s intent to remove. ::ng-deep has been added to provide a temporary workaround for developers currently using this feature.

For the complete list of features and bugfixes, have a look at the changelog.

Update June 29, 2017

It’s beta season!

Angular 4.2 was released in early June and now that the month is almost over, it’s time for the beta phase for 4.3 to begin.

Beta.0 has one feature [core: update zone.js to 0.8.12 (5ac3919)] and 12 bugfixes. There’s not much to tell but now that the beta phase has officially begun, we can look towards the [near] future —in our case, 4.3.

For more details about the bugfixes and feature, see the changelog.

Update June 9, 2017

Angular 4.2 is here and it comes bearing gifts, a.k.a five bug fixes, one feature [compiler-cli: introduce synchronous codegen API (b00b80a)] and two performance improvements:

animations: do not create a closure each time a node is removed (fe6b39d)

do not create a closure each time a node is removed (fe6b39d) animations: only apply :leave flags if animations are set to run (b55adee)

RC.2 was released earlier this month, shortly after the release of RC.1 and RC.0. It consisted of five bug fixes, three features and one performance improvement.

Features

compiler: emit typescript nodes from an output ast (#16823) (18bf772)

emit typescript nodes from an output ast (#16823) (18bf772) compiler-cli: produce template diagnostics error messages (#17125) (230255f)

produce template diagnostics error messages (#17125) (230255f) tsc-wrapped: always convert shorthand imports (#16898) (ea8a43d)

Performance improvement

animations: do not place enterId values on elements for querying purposes (#17150) (ad6a57e)

RC. 1 had seven bug fixes and three features, namely:

compiler: add location note to extracted xliff2 files (#16791) (08dfe91), closes #16531

add location note to extracted xliff2 files (#16791) (08dfe91), closes #16531 core: update zone.js to 0.8.10 and expose the flush method (#16860) (85d4c4b)

update zone.js to 0.8.10 and expose the flush method (#16860) (85d4c4b) tsc-wrapped: support template literals in metadata collection (#16880) (6e41add)

RC.0 consisted of 10 bug fixes, six features and one performance improvement.

Features

animations: introduce a wave of new animation features (16c8167)

introduce a wave of new animation features (16c8167) animations: introduce routeable animation support (f1a9e3c)

introduce routeable animation support (f1a9e3c) add .ngsummary.ts files to support AOT unit tests (547c363)

introduce TestBed.overrideProvider (#16725) (39b92f7)

(#16725) (39b92f7) compiler: support a non-null postfix assert (#16672) (b9521b5)

support a non-null postfix assert (#16672) (b9521b5) core: introduce fixture.whenRenderingDone for testing (#16732) (38c524d)

Performance improvement

animations: reduce size of animations bundle (712630c)

Update April 11, 2017

Now that Angular 4 is here, it’s time to worry about the next version. All jokes aside, it’s clear that Angular is more mature. Igor Minar, one of the keynoters at the ng-conf 2017 proudly announced that “the growth in Angular is fueled by people migrating from AngularJS to Angular.”

With maturity comes responsibility, so even though most people see major versions as breaking changes, for the Angular team they mean that they achieved a lot and they need extra time — hence the extended RC periods through which they collect feedback, Minar explained.

We also want to make sure it’s very simple for you to upgrade so we’re doing a lot to make sure major versions don’t mean big obstacles.

Angular 5: The countdown has begun

We don’t know a lot about the next version but we now know that it will be released in September/ October this year.

[version 5] is going to be a much better Angular and you’ll be able to take advantage of it much easier.

One of the biggest perks of Angular 4 is the fact that it is smaller, yet faster — changes were made under the hood to what AOT generated code looks like; their aim is to reduce the size of the generated code for users’ components by roughly 60 percent in most cases.

Angular 5 will be even better: Minar promised that it would be faster and smaller than Angular 4, the updates will be smooth and it will become simpler to compile Angular applications. Since the differences between Just-in-Time and Ahead-of-Time compilation can be frustrating, the latter will become the default, thus reducing friction.

Long-Term Support (LTS) for Angular

Minar revealed that all Google apps use the latest pre-release version of Angular and that the team feels very good about the stability of Angular. There are, of course, benefits to using the latest minor version but for those who cannot use it, the answer is Long-Term Support.

Version 4 is the first one to have LTS. For the next six months, the Angular team will be actively working on it [release features, bugfixes].

In October, version 4 will enter the long-term state and from then on only the critical fixes and security patches will be merged and released.

For more details about the road to version 5 and all the details presented at the ng-conf 2017, visit their YouTube channel.