Full Code of codelab-fun/codelab for AI

master fcd3caf8c656 cached
1647 files
6.9 MB
1.9M tokens
5049 symbols
1 requests
Download .txt
Showing preview only (7,717K chars total). Download the full file or copy to clipboard to get everything.
Repository: codelab-fun/codelab
Branch: master
Commit: fcd3caf8c656
Files: 1647
Total size: 6.9 MB

Directory structure:
gitextract_yuiyff9g/

├── .editorconfig
├── .firebaserc
├── .flooignore
├── .gitattributes
├── .gitignore
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .travis.yml
├── .vscode/
│   └── extensions.json
├── LICENSE
├── README.md
├── angular.json
├── apps/
│   ├── angular-thirty-seconds/
│   │   ├── browserslist
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   ├── create-snippet/
│   │   │   │   │   ├── create-snippet.component.html
│   │   │   │   │   ├── create-snippet.component.scss
│   │   │   │   │   ├── create-snippet.component.spec.ts
│   │   │   │   │   ├── create-snippet.component.ts
│   │   │   │   │   ├── create-snippet.module.ts
│   │   │   │   │   ├── snippet-info/
│   │   │   │   │   │   ├── snippet-info.component.html
│   │   │   │   │   │   ├── snippet-info.component.scss
│   │   │   │   │   │   └── snippet-info.component.ts
│   │   │   │   │   ├── snippet-modal/
│   │   │   │   │   │   ├── snippet-overview.component.html
│   │   │   │   │   │   ├── snippet-overview.component.scss
│   │   │   │   │   │   └── snippet-overview.component.ts
│   │   │   │   │   └── snippet-spinner/
│   │   │   │   │       ├── snippet-spinner.component.html
│   │   │   │   │       ├── snippet-spinner.component.scss
│   │   │   │   │       └── snippet-spinner.component.ts
│   │   │   │   ├── pull-requests-list/
│   │   │   │   │   ├── pull-requests-list.component.html
│   │   │   │   │   ├── pull-requests-list.component.scss
│   │   │   │   │   └── pull-requests-list.component.ts
│   │   │   │   └── shared/
│   │   │   │       ├── angular-sample.ts
│   │   │   │       ├── constants.ts
│   │   │   │       ├── consts.ts
│   │   │   │       ├── functions/
│   │   │   │       │   ├── generate-snippet.spec.ts
│   │   │   │       │   ├── generate-snippet.ts
│   │   │   │       │   ├── parse-snippet.spec.ts
│   │   │   │       │   ├── parse-snippet.ts
│   │   │   │       │   ├── test-data/
│   │   │   │       │   │   └── snippet.ts
│   │   │   │       │   └── validation/
│   │   │   │       │       ├── index.ts
│   │   │   │       │       └── validation.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── interfaces/
│   │   │   │       │   ├── branch.interface.ts
│   │   │   │       │   ├── commit-info.interface.ts
│   │   │   │       │   ├── github-auth.interface.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── pull-request.intreface.ts
│   │   │   │       │   ├── repo.interface.ts
│   │   │   │       │   ├── snippet.ts
│   │   │   │       │   └── user.interface.ts
│   │   │   │       └── services/
│   │   │   │           ├── github.service.ts
│   │   │   │           ├── snippet.service.spec.ts
│   │   │   │           └── snippet.service.ts
│   │   │   ├── assets/
│   │   │   │   └── .gitkeep
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.scss
│   │   │   └── test.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── blog/
│   │   ├── browserslist
│   │   ├── jest.config.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.scss
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── feed/
│   │   │   │   │   ├── feed.component.html
│   │   │   │   │   ├── feed.component.scss
│   │   │   │   │   ├── feed.component.spec.ts
│   │   │   │   │   └── feed.component.ts
│   │   │   │   ├── form/
│   │   │   │   │   ├── form.component.html
│   │   │   │   │   ├── form.component.scss
│   │   │   │   │   ├── form.component.spec.ts
│   │   │   │   │   └── form.component.ts
│   │   │   │   ├── post/
│   │   │   │   │   ├── post.component.html
│   │   │   │   │   ├── post.component.scss
│   │   │   │   │   ├── post.component.spec.ts
│   │   │   │   │   └── post.component.ts
│   │   │   │   ├── post.service.ts
│   │   │   │   └── single-post/
│   │   │   │       ├── single-post.component.html
│   │   │   │       ├── single-post.component.scss
│   │   │   │       └── single-post.component.ts
│   │   │   ├── assets/
│   │   │   │   ├── .gitkeep
│   │   │   │   └── fonts/
│   │   │   │       └── droid-sans/
│   │   │   │           └── Apache License.txt
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.scss
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── codelab/
│   │   ├── browserslist
│   │   ├── extra-webpack.config.js
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── admin/
│   │   │   │   │   ├── admin-routing.module.ts
│   │   │   │   │   ├── admin.component.css
│   │   │   │   │   ├── admin.component.html
│   │   │   │   │   ├── admin.component.spec.ts
│   │   │   │   │   ├── admin.component.ts
│   │   │   │   │   ├── admin.module.ts
│   │   │   │   │   ├── feedback/
│   │   │   │   │   │   ├── feedback-message-table/
│   │   │   │   │   │   │   ├── feedback-message-table.component.ts
│   │   │   │   │   │   │   ├── feedback-message-table.css
│   │   │   │   │   │   │   └── feedback-message-table.html
│   │   │   │   │   │   ├── feedback.component.css
│   │   │   │   │   │   ├── feedback.component.html
│   │   │   │   │   │   ├── feedback.component.spec.ts
│   │   │   │   │   │   ├── feedback.component.ts
│   │   │   │   │   │   ├── feedback.module.ts
│   │   │   │   │   │   └── github.service.ts
│   │   │   │   │   └── users/
│   │   │   │   │       ├── users.component.css
│   │   │   │   │       ├── users.component.html
│   │   │   │   │       ├── users.component.spec.ts
│   │   │   │   │       ├── users.component.ts
│   │   │   │   │       └── users.module.ts
│   │   │   │   ├── app-routing.module.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   ├── codelabs/
│   │   │   │   │   ├── about/
│   │   │   │   │   │   ├── about.component.html
│   │   │   │   │   │   ├── about.component.scss
│   │   │   │   │   │   ├── about.component.spec.ts
│   │   │   │   │   │   ├── about.component.ts
│   │   │   │   │   │   ├── about.module.ts
│   │   │   │   │   │   └── samples/
│   │   │   │   │   │       ├── fake-types.d.ts.not-really
│   │   │   │   │   │       ├── slides/
│   │   │   │   │   │       │   ├── ng-template.html
│   │   │   │   │   │       │   ├── slide-component.html
│   │   │   │   │   │       │   └── structural-directive.html
│   │   │   │   │   │       └── storing-code/
│   │   │   │   │   │           ├── backticks.html
│   │   │   │   │   │           ├── interpolations.ts
│   │   │   │   │   │           └── plain.html
│   │   │   │   │   ├── angular/
│   │   │   │   │   │   ├── angular-cli/
│   │   │   │   │   │   │   ├── angular-cli.component.css
│   │   │   │   │   │   │   ├── angular-cli.component.html
│   │   │   │   │   │   │   ├── angular-cli.component.ts
│   │   │   │   │   │   │   └── angular-cli.module.ts
│   │   │   │   │   │   ├── angular-routing.module.ts
│   │   │   │   │   │   ├── angular.module.ts
│   │   │   │   │   │   ├── component-tree/
│   │   │   │   │   │   │   ├── component-tree.component.css
│   │   │   │   │   │   │   ├── component-tree.component.html
│   │   │   │   │   │   │   ├── component-tree.component.ts
│   │   │   │   │   │   │   ├── component-tree.module.ts
│   │   │   │   │   │   │   ├── components-hierarchy-svg/
│   │   │   │   │   │   │   │   ├── components-hierarchy-svg.component.html
│   │   │   │   │   │   │   │   ├── components-hierarchy-svg.component.spec.ts
│   │   │   │   │   │   │   │   ├── components-hierarchy-svg.component.ts
│   │   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── module/
│   │   │   │   │   │   │           ├── app.module.ts
│   │   │   │   │   │   │           ├── box.component.ts
│   │   │   │   │   │   │           ├── circle.component.ts
│   │   │   │   │   │   │           └── index.html
│   │   │   │   │   │   ├── create-first-app/
│   │   │   │   │   │   │   ├── create-first-app.component.css
│   │   │   │   │   │   │   ├── create-first-app.component.html
│   │   │   │   │   │   │   ├── create-first-app.component.ts
│   │   │   │   │   │   │   ├── create-first-app.module.ts
│   │   │   │   │   │   │   ├── mode/
│   │   │   │   │   │   │   │   ├── mode.component.css
│   │   │   │   │   │   │   │   ├── mode.component.html
│   │   │   │   │   │   │   │   ├── mode.component.spec.ts
│   │   │   │   │   │   │   │   └── mode.component.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       ├── app-component/
│   │   │   │   │   │   │       │   ├── app.component.ts
│   │   │   │   │   │   │       │   ├── app.module.ts
│   │   │   │   │   │   │       │   ├── bootstrap.ts
│   │   │   │   │   │   │       │   └── index.html
│   │   │   │   │   │   │       └── index-html/
│   │   │   │   │   │   │           ├── bootstrap.ts
│   │   │   │   │   │   │           └── index.html
│   │   │   │   │   │   ├── custom-events/
│   │   │   │   │   │   │   ├── custom-events.component.css
│   │   │   │   │   │   │   ├── custom-events.component.html
│   │   │   │   │   │   │   ├── custom-events.component.ts
│   │   │   │   │   │   │   └── custom-events.module.ts
│   │   │   │   │   │   ├── dependency-injection/
│   │   │   │   │   │   │   ├── dependency-injection.component.css
│   │   │   │   │   │   │   ├── dependency-injection.component.html
│   │   │   │   │   │   │   ├── dependency-injection.component.ts
│   │   │   │   │   │   │   └── dependency-injection.module.ts
│   │   │   │   │   │   ├── forms/
│   │   │   │   │   │   │   ├── forms.component.css
│   │   │   │   │   │   │   ├── forms.component.html
│   │   │   │   │   │   │   ├── forms.component.ts
│   │   │   │   │   │   │   ├── forms.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── basic/
│   │   │   │   │   │   │           ├── app.1.html
│   │   │   │   │   │   │           ├── app.2.html
│   │   │   │   │   │   │           ├── app.3.html
│   │   │   │   │   │   │           ├── app.4.html
│   │   │   │   │   │   │           ├── app.5.html
│   │   │   │   │   │   │           ├── app.6.html
│   │   │   │   │   │   │           ├── app.component.5.ts
│   │   │   │   │   │   │           ├── app.component.ts
│   │   │   │   │   │   │           ├── app.html
│   │   │   │   │   │   │           ├── app.module.6.ts
│   │   │   │   │   │   │           ├── app.module.ts
│   │   │   │   │   │   │           ├── code.ts
│   │   │   │   │   │   │           ├── main.ts
│   │   │   │   │   │   │           └── styles.css
│   │   │   │   │   │   ├── material/
│   │   │   │   │   │   │   ├── material.component.css
│   │   │   │   │   │   │   ├── material.component.html
│   │   │   │   │   │   │   ├── material.component.ts
│   │   │   │   │   │   │   ├── material.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       ├── basic/
│   │   │   │   │   │   │       │   ├── app.1.html
│   │   │   │   │   │   │       │   ├── app.2.html
│   │   │   │   │   │   │       │   ├── app.3.html
│   │   │   │   │   │   │       │   ├── app.4.html
│   │   │   │   │   │   │       │   ├── app.component.ts
│   │   │   │   │   │   │       │   ├── app.html
│   │   │   │   │   │   │       │   ├── app.module.ts
│   │   │   │   │   │   │       │   ├── code.ts
│   │   │   │   │   │   │       │   └── main.ts
│   │   │   │   │   │   │       ├── step1/
│   │   │   │   │   │   │       │   ├── app.html
│   │   │   │   │   │   │       │   └── app.module.ts
│   │   │   │   │   │   │       ├── step2/
│   │   │   │   │   │   │       │   ├── app.html
│   │   │   │   │   │   │       │   └── app.module.ts
│   │   │   │   │   │   │       ├── step3/
│   │   │   │   │   │   │       │   └── app.html
│   │   │   │   │   │   │       └── step4/
│   │   │   │   │   │   │           ├── app.html
│   │   │   │   │   │   │           └── app.module.ts
│   │   │   │   │   │   ├── pipes/
│   │   │   │   │   │   │   ├── pipes.component.css
│   │   │   │   │   │   │   ├── pipes.component.html
│   │   │   │   │   │   │   ├── pipes.component.ts
│   │   │   │   │   │   │   ├── pipes.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── pipes/
│   │   │   │   │   │   │           ├── app.component.html
│   │   │   │   │   │   │           ├── app.component.ts
│   │   │   │   │   │   │           └── app.module.ts
│   │   │   │   │   │   ├── playground/
│   │   │   │   │   │   │   ├── angular-sample.ts
│   │   │   │   │   │   │   ├── playground.component.css
│   │   │   │   │   │   │   ├── playground.component.html
│   │   │   │   │   │   │   ├── playground.component.spec.ts
│   │   │   │   │   │   │   ├── playground.component.ts
│   │   │   │   │   │   │   └── playground.module.ts
│   │   │   │   │   │   ├── router/
│   │   │   │   │   │   │   ├── router.component.css
│   │   │   │   │   │   │   ├── router.component.html
│   │   │   │   │   │   │   ├── router.component.ts
│   │   │   │   │   │   │   ├── router.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── simple-router/
│   │   │   │   │   │   │           ├── app.component.html
│   │   │   │   │   │   │           ├── app.component.ts
│   │   │   │   │   │   │           ├── app.module.ts
│   │   │   │   │   │   │           ├── code.ts
│   │   │   │   │   │   │           ├── components/
│   │   │   │   │   │   │           │   ├── kitten.ts
│   │   │   │   │   │   │           │   └── puppy.ts
│   │   │   │   │   │   │           ├── index.html
│   │   │   │   │   │   │           └── main.ts
│   │   │   │   │   │   ├── structural-directives/
│   │   │   │   │   │   │   ├── bsod.css
│   │   │   │   │   │   │   ├── samples/
│   │   │   │   │   │   │   │   ├── mat-tab-nav-bar/
│   │   │   │   │   │   │   │   │   ├── alert.component.ts
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   └── tab.component.ts
│   │   │   │   │   │   │   │   ├── material-tabs/
│   │   │   │   │   │   │   │   │   ├── alert.component.ts
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.html
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   ├── app.solved.html
│   │   │   │   │   │   │   │   │   ├── break-my-computer.component.ts
│   │   │   │   │   │   │   │   │   ├── style.css
│   │   │   │   │   │   │   │   │   └── taet-led.component.ts
│   │   │   │   │   │   │   │   ├── material-tabs-structural-directive/
│   │   │   │   │   │   │   │   │   ├── alert.component.ts
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.html
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   ├── app.solved.html
│   │   │   │   │   │   │   │   │   ├── hideme.directive.solved.ts
│   │   │   │   │   │   │   │   │   ├── hideme.directive.ts
│   │   │   │   │   │   │   │   │   └── ignored.module.ts
│   │   │   │   │   │   │   │   ├── micro-syntax/
│   │   │   │   │   │   │   │   │   ├── code.ts
│   │   │   │   │   │   │   │   │   ├── ms.spec.ts
│   │   │   │   │   │   │   │   │   └── ms.ts
│   │   │   │   │   │   │   │   └── structural-directives/
│   │   │   │   │   │   │   │       ├── microsyntax.html
│   │   │   │   │   │   │   │       ├── ng-for-after.html
│   │   │   │   │   │   │   │       ├── ng-for-before.html
│   │   │   │   │   │   │   │       ├── ng-if-after.html
│   │   │   │   │   │   │   │       └── ng-if-before.html
│   │   │   │   │   │   │   ├── structural-directives.component.css
│   │   │   │   │   │   │   ├── structural-directives.component.html
│   │   │   │   │   │   │   ├── structural-directives.component.ts
│   │   │   │   │   │   │   └── structural-directives.module.ts
│   │   │   │   │   │   ├── templates/
│   │   │   │   │   │   │   ├── samples/
│   │   │   │   │   │   │   │   ├── data-binding-extra/
│   │   │   │   │   │   │   │   │   ├── app.component.html
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   ├── index.html
│   │   │   │   │   │   │   │   │   └── number-praiser.ts
│   │   │   │   │   │   │   │   ├── event-binding/
│   │   │   │   │   │   │   │   │   ├── app.component.html
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   └── app.module.ts
│   │   │   │   │   │   │   │   ├── event-binding-shortcuts/
│   │   │   │   │   │   │   │   │   └── app.component.html
│   │   │   │   │   │   │   │   └── reference-binding/
│   │   │   │   │   │   │   │       ├── app.component.html
│   │   │   │   │   │   │   │       ├── app.component.ts
│   │   │   │   │   │   │   │       └── app.module.ts
│   │   │   │   │   │   │   ├── templates.component.css
│   │   │   │   │   │   │   ├── templates.component.html
│   │   │   │   │   │   │   ├── templates.component.ts
│   │   │   │   │   │   │   └── templates.module.ts
│   │   │   │   │   │   └── typescript/
│   │   │   │   │   │       ├── typescript/
│   │   │   │   │   │       │   ├── code/
│   │   │   │   │   │       │   │   ├── app.ts
│   │   │   │   │   │       │   │   ├── code.ts
│   │   │   │   │   │       │   │   └── mini-exercise-test.ts
│   │   │   │   │   │       │   ├── typescript-svg/
│   │   │   │   │   │       │   │   ├── typescript-svg.component.html
│   │   │   │   │   │       │   │   ├── typescript-svg.component.spec.ts
│   │   │   │   │   │       │   │   └── typescript-svg.component.ts
│   │   │   │   │   │       │   ├── typescript.component.css
│   │   │   │   │   │       │   ├── typescript.component.html
│   │   │   │   │   │       │   └── typescript.component.ts
│   │   │   │   │   │       ├── typescript-routing.module.ts
│   │   │   │   │   │       └── typescript.module.ts
│   │   │   │   │   ├── codelabs-routing.module.ts
│   │   │   │   │   ├── codelabs.module.ts
│   │   │   │   │   └── extra/
│   │   │   │   │       ├── code-playground/
│   │   │   │   │       │   ├── code-playground.component.css
│   │   │   │   │       │   ├── code-playground.component.html
│   │   │   │   │       │   ├── code-playground.component.ts
│   │   │   │   │       │   └── code-playground.module.ts
│   │   │   │   │       ├── extra-routing.module.ts
│   │   │   │   │       ├── extra.module.ts
│   │   │   │   │       ├── rating-summary/
│   │   │   │   │       │   ├── rating-summary.component.css
│   │   │   │   │       │   ├── rating-summary.component.html
│   │   │   │   │       │   ├── rating-summary.component.ts
│   │   │   │   │       │   └── rating-summary.module.ts
│   │   │   │   │       └── visual-studio-code/
│   │   │   │   │           ├── visual-studio-code.component.css
│   │   │   │   │           ├── visual-studio-code.component.html
│   │   │   │   │           ├── visual-studio-code.component.ts
│   │   │   │   │           └── visual-studio-code.module.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── components/
│   │   │   │   │   ├── angular-routes/
│   │   │   │   │   │   ├── angular-routes.component.html
│   │   │   │   │   │   ├── angular-routes.component.scss
│   │   │   │   │   │   ├── angular-routes.component.ts
│   │   │   │   │   │   └── angular-routes.module.ts
│   │   │   │   │   ├── angular-test-runner/
│   │   │   │   │   │   ├── angular-test-runner.component.css
│   │   │   │   │   │   ├── angular-test-runner.component.html
│   │   │   │   │   │   ├── angular-test-runner.component.ts
│   │   │   │   │   │   └── tests.ts
│   │   │   │   │   ├── babel-test-runner/
│   │   │   │   │   │   ├── babel-helpers.ts
│   │   │   │   │   │   ├── babel-test-runner.component.css
│   │   │   │   │   │   ├── babel-test-runner.component.html
│   │   │   │   │   │   └── babel-test-runner.component.ts
│   │   │   │   │   ├── breadcrumb/
│   │   │   │   │   │   ├── breadcrumb.component.css
│   │   │   │   │   │   ├── breadcrumb.component.html
│   │   │   │   │   │   ├── breadcrumb.component.spec.ts
│   │   │   │   │   │   └── breadcrumb.component.ts
│   │   │   │   │   ├── buttons-nav-bar/
│   │   │   │   │   │   ├── buttons-nav-bar.component.html
│   │   │   │   │   │   ├── buttons-nav-bar.component.scss
│   │   │   │   │   │   ├── buttons-nav-bar.component.ts
│   │   │   │   │   │   ├── buttons-nav-bar.module.ts
│   │   │   │   │   │   ├── menu-fullscreen-widget/
│   │   │   │   │   │   │   ├── menu-fullscreen-widget.component.html
│   │   │   │   │   │   │   ├── menu-fullscreen-widget.component.scss
│   │   │   │   │   │   │   ├── menu-fullscreen-widget.component.spec.ts
│   │   │   │   │   │   │   └── menu-fullscreen-widget.component.ts
│   │   │   │   │   │   ├── menu-github-widget/
│   │   │   │   │   │   │   ├── menu-github-widget.component.css
│   │   │   │   │   │   │   ├── menu-github-widget.component.html
│   │   │   │   │   │   │   ├── menu-github-widget.component.ts
│   │   │   │   │   │   │   └── menu-github-widget.module.ts
│   │   │   │   │   │   └── menu-shortcut-widget/
│   │   │   │   │   │       ├── menu-shortcut-widget.component.css
│   │   │   │   │   │       ├── menu-shortcut-widget.component.html
│   │   │   │   │   │       ├── menu-shortcut-widget.component.ts
│   │   │   │   │   │       └── menu-shortcut-widget.module.ts
│   │   │   │   │   ├── codelab-components.module.ts
│   │   │   │   │   ├── codelab-progress-bar/
│   │   │   │   │   │   ├── codelab-progress-bar.component.css
│   │   │   │   │   │   ├── codelab-progress-bar.component.html
│   │   │   │   │   │   └── codelab-progress-bar.component.ts
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── codelab-styles.scss
│   │   │   │   │   ├── exercise/
│   │   │   │   │   │   ├── exercise.component.css
│   │   │   │   │   │   ├── exercise.component.html
│   │   │   │   │   │   └── exercise.component.ts
│   │   │   │   │   ├── exercise-playground/
│   │   │   │   │   │   ├── codelab-exercise-playground.component.css
│   │   │   │   │   │   ├── codelab-exercise-playground.component.html
│   │   │   │   │   │   └── codelab-exercise-playground.component.ts
│   │   │   │   │   ├── exercise-preview/
│   │   │   │   │   │   ├── exercise-preview.component.html
│   │   │   │   │   │   └── exercise-preview.component.ts
│   │   │   │   │   ├── external-link-directive/
│   │   │   │   │   │   ├── external-link-directive.directive.spec.ts
│   │   │   │   │   │   └── external-link-directive.directive.ts
│   │   │   │   │   ├── index/
│   │   │   │   │   │   ├── index.component.html
│   │   │   │   │   │   ├── index.component.scss
│   │   │   │   │   │   ├── index.component.ts
│   │   │   │   │   │   └── index.module.ts
│   │   │   │   │   ├── login/
│   │   │   │   │   │   ├── login.component.css
│   │   │   │   │   │   ├── login.component.html
│   │   │   │   │   │   ├── login.component.spec.ts
│   │   │   │   │   │   ├── login.component.ts
│   │   │   │   │   │   └── login.module.ts
│   │   │   │   │   ├── not-found/
│   │   │   │   │   │   ├── not-found.component.html
│   │   │   │   │   │   ├── not-found.component.scss
│   │   │   │   │   │   ├── not-found.component.ts
│   │   │   │   │   │   └── not-found.module.ts
│   │   │   │   │   ├── slides/
│   │   │   │   │   │   ├── closing-slide/
│   │   │   │   │   │   │   ├── codelab-closing-slide.component.css
│   │   │   │   │   │   │   ├── codelab-closing-slide.component.html
│   │   │   │   │   │   │   ├── codelab-closing-slide.component.spec.ts
│   │   │   │   │   │   │   └── codelab-closing-slide.component.ts
│   │   │   │   │   │   └── title-slide/
│   │   │   │   │   │       ├── ripple-animation/
│   │   │   │   │   │       │   ├── codelab-ripple-animation.component.css
│   │   │   │   │   │       │   ├── codelab-ripple-animation.component.html
│   │   │   │   │   │       │   ├── codelab-ripple-animation.component.spec.ts
│   │   │   │   │   │       │   └── codelab-ripple-animation.component.ts
│   │   │   │   │   │       ├── title-slide.component.css
│   │   │   │   │   │       ├── title-slide.component.html
│   │   │   │   │   │       ├── title-slide.component.spec.ts
│   │   │   │   │   │       └── title-slide.component.ts
│   │   │   │   │   └── slides-preview/
│   │   │   │   │       ├── codelab-preview.component.html
│   │   │   │   │       ├── codelab-preview.component.scss
│   │   │   │   │       └── codelab-preview.component.ts
│   │   │   │   ├── containers/
│   │   │   │   │   ├── full-layout/
│   │   │   │   │   │   ├── full-layout.component.html
│   │   │   │   │   │   ├── full-layout.component.scss
│   │   │   │   │   │   ├── full-layout.component.ts
│   │   │   │   │   │   ├── full-layout.module.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── directives/
│   │   │   │   │   ├── directives.module.ts
│   │   │   │   │   ├── nextSlide.directive.ts
│   │   │   │   │   ├── permissions/
│   │   │   │   │   │   ├── abstract-permission.ts
│   │   │   │   │   │   ├── can-load-admin/
│   │   │   │   │   │   │   └── can-load-admin.directive.ts
│   │   │   │   │   │   └── is-logged-in/
│   │   │   │   │   │       └── is-loggef-in.directive.ts
│   │   │   │   │   └── previousSlide.directive.ts
│   │   │   │   ├── shared/
│   │   │   │   │   ├── angular-code/
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── bootstrap.ts
│   │   │   │   │   │   ├── code.ts
│   │   │   │   │   │   └── index.html
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── codelabFile.ts
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── exercise-config.ts
│   │   │   │   │   │   ├── file-config.ts
│   │   │   │   │   │   └── test-info.ts
│   │   │   │   │   ├── services/
│   │   │   │   │   │   ├── access.service.ts
│   │   │   │   │   │   └── guards/
│   │   │   │   │   │       ├── admin-guard.ts
│   │   │   │   │   │       └── login-guard.ts
│   │   │   │   │   └── shared.module.ts
│   │   │   │   └── sync/
│   │   │   │       ├── sync.component.css
│   │   │   │       ├── sync.component.html
│   │   │   │       ├── sync.component.spec.ts
│   │   │   │       ├── sync.component.ts
│   │   │   │       └── sync.module.ts
│   │   │   ├── assets/
│   │   │   │   └── .gitkeep
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── locale/
│   │   │   │   ├── codelab.ru.xtb
│   │   │   │   └── messages.xmb
│   │   │   ├── main.ts
│   │   │   ├── manifest.webmanifest
│   │   │   ├── polyfills.ts
│   │   │   ├── service-worker.js
│   │   │   ├── styles.scss
│   │   │   ├── test.ts
│   │   │   └── typings.d.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── kirjs/
│   │   ├── browserslist
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.css
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── cv/
│   │   │   │   │   ├── resume.css
│   │   │   │   │   ├── resume.html
│   │   │   │   │   └── resume.scss
│   │   │   │   ├── kirjs.module.ts
│   │   │   │   └── modules/
│   │   │   │       ├── ast/
│   │   │   │       │   ├── ast-preview-runner/
│   │   │   │       │   │   ├── ast-preview-runner.component.css
│   │   │   │       │   │   ├── ast-preview-runner.component.html
│   │   │   │       │   │   ├── ast-preview-runner.component.ts
│   │   │   │       │   │   └── ast-preview-runner.module.ts
│   │   │   │       │   ├── ast.component.css
│   │   │   │       │   ├── ast.component.html
│   │   │   │       │   ├── ast.component.ts
│   │   │   │       │   ├── ast.module.ts
│   │   │   │       │   ├── babel-highlight/
│   │   │   │       │   │   └── babel-highlight-match.directive.ts
│   │   │   │       │   ├── debugger/
│   │   │   │       │   │   ├── debugger.component.css
│   │   │   │       │   │   ├── debugger.component.html
│   │   │   │       │   │   ├── debugger.component.spec.ts
│   │   │   │       │   │   ├── debugger.component.ts
│   │   │   │       │   │   └── debugger.ts
│   │   │   │       │   ├── new-progress-bar/
│   │   │   │       │   │   ├── new-progress-bar.component.css
│   │   │   │       │   │   ├── new-progress-bar.component.html
│   │   │   │       │   │   ├── new-progress-bar.component.ts
│   │   │   │       │   │   └── new-progress-bar.module.ts
│   │   │   │       │   ├── parse-hello-world-ast.ts
│   │   │   │       │   ├── samples/
│   │   │   │       │   │   ├── dec-to-bin-with-semicolons.js
│   │   │   │       │   │   ├── dec-to-bin.js
│   │   │   │       │   │   ├── eslint/
│   │   │   │       │   │   │   ├── eslint.js
│   │   │   │       │   │   │   └── eslint.test.js
│   │   │   │       │   │   ├── find-console-log/
│   │   │   │       │   │   │   ├── find-console-log-babel.solved.ts
│   │   │   │       │   │   │   ├── find-console-log-babel.ts
│   │   │   │       │   │   │   ├── find-console-log-regex.solved.js
│   │   │   │       │   │   │   ├── find-console-log.js
│   │   │   │       │   │   │   ├── find-console-log.test.js
│   │   │   │       │   │   │   ├── remove-console-log.solved.ts
│   │   │   │       │   │   │   ├── remove-console-log.test.js
│   │   │   │       │   │   │   ├── remove-console-log.ts
│   │   │   │       │   │   │   ├── traverse-console-log-babel.solved.ts
│   │   │   │       │   │   │   ├── traverse-console-log-babel.solved2.ts
│   │   │   │       │   │   │   └── traverse-console-log-babel.ts
│   │   │   │       │   │   ├── find-debugger/
│   │   │   │       │   │   │   ├── find-debugger-babel.solved.ts
│   │   │   │       │   │   │   ├── find-debugger-babel.ts
│   │   │   │       │   │   │   ├── find-debugger-regex.solved.js
│   │   │   │       │   │   │   ├── find-debugger.js
│   │   │   │       │   │   │   ├── find-debugger.test.js
│   │   │   │       │   │   │   ├── hint.js
│   │   │   │       │   │   │   ├── remove-debugger.solved.ts
│   │   │   │       │   │   │   ├── remove-debugger.test.js
│   │   │   │       │   │   │   ├── remove-debugger.ts
│   │   │   │       │   │   │   ├── traverse-debugger-babel.solved.ts
│   │   │   │       │   │   │   └── traverse-debugger-babel.ts
│   │   │   │       │   │   ├── find-fit/
│   │   │   │       │   │   │   ├── find-fit.js
│   │   │   │       │   │   │   ├── find-fit.solved.js
│   │   │   │       │   │   │   └── find-fit.test.js
│   │   │   │       │   │   ├── hello-world.json
│   │   │   │       │   │   ├── it-lines/
│   │   │   │       │   │   │   ├── it-lines.js
│   │   │   │       │   │   │   ├── it-lines.solved.js
│   │   │   │       │   │   │   └── it-lines.test.js
│   │   │   │       │   │   └── tricky.js
│   │   │   │       │   ├── size-picker/
│   │   │   │       │   │   ├── size-picker.component.css
│   │   │   │       │   │   ├── size-picker.component.html
│   │   │   │       │   │   ├── size-picker.component.spec.ts
│   │   │   │       │   │   ├── size-picker.component.ts
│   │   │   │       │   │   └── size-picker.module.ts
│   │   │   │       │   └── test-set/
│   │   │   │       │       ├── babel-test-runner/
│   │   │   │       │       │   ├── babel-test-runner.component.css
│   │   │   │       │       │   ├── babel-test-runner.component.html
│   │   │   │       │       │   └── babel-test-runner.component.ts
│   │   │   │       │       ├── test-set.component.css
│   │   │   │       │       ├── test-set.component.html
│   │   │   │       │       ├── test-set.component.spec.ts
│   │   │   │       │       └── test-set.component.ts
│   │   │   │       ├── binary/
│   │   │   │       │   ├── angular-flags/
│   │   │   │       │   │   ├── angular-flags.component.css
│   │   │   │       │   │   ├── angular-flags.component.html
│   │   │   │       │   │   ├── angular-flags.component.spec.ts
│   │   │   │       │   │   └── angular-flags.component.ts
│   │   │   │       │   ├── ascii/
│   │   │   │       │   │   ├── ascii.component.css
│   │   │   │       │   │   ├── ascii.component.html
│   │   │   │       │   │   ├── ascii.component.spec.ts
│   │   │   │       │   │   └── ascii.component.ts
│   │   │   │       │   ├── binary-flat/
│   │   │   │       │   │   ├── binary-flat.component.css
│   │   │   │       │   │   ├── binary-flat.component.html
│   │   │   │       │   │   ├── binary-flat.component.spec.ts
│   │   │   │       │   │   └── binary-flat.component.ts
│   │   │   │       │   ├── binary-gif/
│   │   │   │       │   │   ├── binary-gif.component.css
│   │   │   │       │   │   ├── binary-gif.component.html
│   │   │   │       │   │   ├── binary-gif.component.spec.ts
│   │   │   │       │   │   └── binary-gif.component.ts
│   │   │   │       │   ├── binary-inline/
│   │   │   │       │   │   ├── binary-display/
│   │   │   │       │   │   │   ├── binary-display.component.css
│   │   │   │       │   │   │   ├── binary-display.component.html
│   │   │   │       │   │   │   ├── binary-display.component.spec.ts
│   │   │   │       │   │   │   └── binary-display.component.ts
│   │   │   │       │   │   ├── binary-inline.component.css
│   │   │   │       │   │   ├── binary-inline.component.html
│   │   │   │       │   │   ├── binary-inline.component.spec.ts
│   │   │   │       │   │   ├── binary-inline.component.ts
│   │   │   │       │   │   └── binary-inline.module.ts
│   │   │   │       │   ├── binary-parser-demo/
│   │   │   │       │   │   ├── binary-parser-demo.component.css
│   │   │   │       │   │   ├── binary-parser-demo.component.html
│   │   │   │       │   │   ├── binary-parser-demo.component.spec.ts
│   │   │   │       │   │   └── binary-parser-demo.component.ts
│   │   │   │       │   ├── binary-plain/
│   │   │   │       │   │   ├── binary-plain.component.css
│   │   │   │       │   │   ├── binary-plain.component.html
│   │   │   │       │   │   ├── binary-plain.component.spec.ts
│   │   │   │       │   │   └── binary-plain.component.ts
│   │   │   │       │   ├── binary-view/
│   │   │   │       │   │   ├── array/
│   │   │   │       │   │   │   ├── array.component.css
│   │   │   │       │   │   │   ├── array.component.html
│   │   │   │       │   │   │   ├── array.component.spec.ts
│   │   │   │       │   │   │   └── array.component.ts
│   │   │   │       │   │   ├── binary-parent/
│   │   │   │       │   │   │   ├── binary-parent.component.html
│   │   │   │       │   │   │   ├── binary-parent.component.scss
│   │   │   │       │   │   │   ├── binary-parent.component.spec.ts
│   │   │   │       │   │   │   └── binary-parent.component.ts
│   │   │   │       │   │   ├── binary-view.module.ts
│   │   │   │       │   │   ├── bits/
│   │   │   │       │   │   │   ├── bits.component.css
│   │   │   │       │   │   │   ├── bits.component.html
│   │   │   │       │   │   │   ├── bits.component.spec.ts
│   │   │   │       │   │   │   └── bits.component.ts
│   │   │   │       │   │   ├── block/
│   │   │   │       │   │   │   ├── block.component.css
│   │   │   │       │   │   │   ├── block.component.html
│   │   │   │       │   │   │   ├── block.component.spec.ts
│   │   │   │       │   │   │   └── block.component.ts
│   │   │   │       │   │   ├── color/
│   │   │   │       │   │   │   ├── color.component.css
│   │   │   │       │   │   │   ├── color.component.html
│   │   │   │       │   │   │   ├── color.component.spec.ts
│   │   │   │       │   │   │   └── color.component.ts
│   │   │   │       │   │   ├── hex/
│   │   │   │       │   │   │   ├── hex.component.css
│   │   │   │       │   │   │   ├── hex.component.html
│   │   │   │       │   │   │   ├── hex.component.spec.ts
│   │   │   │       │   │   │   └── hex.component.ts
│   │   │   │       │   │   ├── inline/
│   │   │   │       │   │   │   ├── inline.component.css
│   │   │   │       │   │   │   ├── inline.component.html
│   │   │   │       │   │   │   ├── inline.component.spec.ts
│   │   │   │       │   │   │   └── inline.component.ts
│   │   │   │       │   │   ├── inline-root/
│   │   │   │       │   │   │   ├── inline-root.component.css
│   │   │   │       │   │   │   ├── inline-root.component.html
│   │   │   │       │   │   │   ├── inline-root.component.spec.ts
│   │   │   │       │   │   │   └── inline-root.component.ts
│   │   │   │       │   │   ├── number/
│   │   │   │       │   │   │   ├── number.component.css
│   │   │   │       │   │   │   ├── number.component.html
│   │   │   │       │   │   │   ├── number.component.spec.ts
│   │   │   │       │   │   │   └── number.component.ts
│   │   │   │       │   │   ├── object/
│   │   │   │       │   │   │   ├── object.component.css
│   │   │   │       │   │   │   ├── object.component.html
│   │   │   │       │   │   │   ├── object.component.spec.ts
│   │   │   │       │   │   │   └── object.component.ts
│   │   │   │       │   │   └── string/
│   │   │   │       │   │       ├── string.component.css
│   │   │   │       │   │       ├── string.component.html
│   │   │   │       │   │       ├── string.component.spec.ts
│   │   │   │       │   │       └── string.component.ts
│   │   │   │       │   ├── binary.component.html
│   │   │   │       │   ├── binary.component.scss
│   │   │   │       │   ├── binary.component.ts
│   │   │   │       │   ├── binary.module.ts
│   │   │   │       │   ├── bindec/
│   │   │   │       │   │   ├── bindec.component.css
│   │   │   │       │   │   ├── bindec.component.html
│   │   │   │       │   │   ├── bindec.component.spec.ts
│   │   │   │       │   │   └── bindec.component.ts
│   │   │   │       │   ├── bit/
│   │   │   │       │   │   ├── bit.component.css
│   │   │   │       │   │   ├── bit.component.html
│   │   │   │       │   │   ├── bit.component.spec.ts
│   │   │   │       │   │   └── bit.component.ts
│   │   │   │       │   ├── bitwise/
│   │   │   │       │   │   ├── bitwise.component.css
│   │   │   │       │   │   ├── bitwise.component.html
│   │   │   │       │   │   ├── bitwise.component.spec.ts
│   │   │   │       │   │   └── bitwise.component.ts
│   │   │   │       │   ├── color-indexing/
│   │   │   │       │   │   ├── color-indexing.component.css
│   │   │   │       │   │   ├── color-indexing.component.html
│   │   │   │       │   │   ├── color-indexing.component.spec.ts
│   │   │   │       │   │   └── color-indexing.component.ts
│   │   │   │       │   ├── compare/
│   │   │   │       │   │   ├── compare.component.css
│   │   │   │       │   │   ├── compare.component.html
│   │   │   │       │   │   ├── compare.component.spec.ts
│   │   │   │       │   │   └── compare.component.ts
│   │   │   │       │   ├── fake-gif/
│   │   │   │       │   │   ├── fake-gif.component.css
│   │   │   │       │   │   ├── fake-gif.component.html
│   │   │   │       │   │   ├── fake-gif.component.spec.ts
│   │   │   │       │   │   ├── fake-gif.component.ts
│   │   │   │       │   │   ├── gif-parser.ts
│   │   │   │       │   │   └── gif.ts
│   │   │   │       │   ├── gif-palette/
│   │   │   │       │   │   ├── gif-palette.component.css
│   │   │   │       │   │   ├── gif-palette.component.html
│   │   │   │       │   │   ├── gif-palette.component.spec.ts
│   │   │   │       │   │   └── gif-palette.component.ts
│   │   │   │       │   ├── hexdec/
│   │   │   │       │   │   ├── hexdec.component.css
│   │   │   │       │   │   ├── hexdec.component.html
│   │   │   │       │   │   ├── hexdec.component.spec.ts
│   │   │   │       │   │   └── hexdec.component.ts
│   │   │   │       │   ├── html-post/
│   │   │   │       │   │   ├── html-post.component.css
│   │   │   │       │   │   ├── html-post.component.html
│   │   │   │       │   │   ├── html-post.component.spec.ts
│   │   │   │       │   │   └── html-post.component.ts
│   │   │   │       │   ├── json/
│   │   │   │       │   │   ├── json.component.html
│   │   │   │       │   │   ├── json.component.scss
│   │   │   │       │   │   ├── json.component.spec.ts
│   │   │   │       │   │   └── json.component.ts
│   │   │   │       │   ├── memory/
│   │   │   │       │   │   ├── memory.component.css
│   │   │   │       │   │   ├── memory.component.html
│   │   │   │       │   │   ├── memory.component.spec.ts
│   │   │   │       │   │   └── memory.component.ts
│   │   │   │       │   ├── message/
│   │   │   │       │   │   ├── message.component.css
│   │   │   │       │   │   ├── message.component.html
│   │   │   │       │   │   ├── message.component.spec.ts
│   │   │   │       │   │   └── message.component.ts
│   │   │   │       │   ├── midi/
│   │   │   │       │   │   ├── midi.component.css
│   │   │   │       │   │   ├── midi.component.html
│   │   │   │       │   │   ├── midi.component.spec.ts
│   │   │   │       │   │   └── midi.component.ts
│   │   │   │       │   ├── parser/
│   │   │   │       │   │   ├── binary-parser.spec.ts
│   │   │   │       │   │   ├── binary-parser.ts
│   │   │   │       │   │   ├── parsers/
│   │   │   │       │   │   │   ├── abstract-parser.ts
│   │   │   │       │   │   │   ├── array-parser.spec.ts
│   │   │   │       │   │   │   ├── array-parser.ts
│   │   │   │       │   │   │   ├── bit-parser.spec.ts
│   │   │   │       │   │   │   ├── bit-parser.ts
│   │   │   │       │   │   │   ├── choice-parser.spec.ts
│   │   │   │       │   │   │   ├── choice-parser.ts
│   │   │   │       │   │   │   ├── common.ts
│   │   │   │       │   │   │   ├── debugger-parser.ts
│   │   │   │       │   │   │   ├── first-bit-parser.spec.ts
│   │   │   │       │   │   │   ├── object-parser.spec.ts
│   │   │   │       │   │   │   ├── object-parser.ts
│   │   │   │       │   │   │   ├── string-parser.spec.ts
│   │   │   │       │   │   │   ├── string-parser.ts
│   │   │   │       │   │   │   └── var-uint-parser.ts
│   │   │   │       │   │   ├── readers/
│   │   │   │       │   │   │   ├── abstract-reader.ts
│   │   │   │       │   │   │   └── string-reader.ts
│   │   │   │       │   │   └── utils.ts
│   │   │   │       │   ├── shared.ts
│   │   │   │       │   └── to-read/
│   │   │   │       │       ├── to-read.component.css
│   │   │   │       │       ├── to-read.component.html
│   │   │   │       │       ├── to-read.component.spec.ts
│   │   │   │       │       └── to-read.component.ts
│   │   │   │       ├── cellular-automation/
│   │   │   │       │   ├── board/
│   │   │   │       │   │   ├── board.component.css
│   │   │   │       │   │   ├── board.component.html
│   │   │   │       │   │   ├── board.component.spec.ts
│   │   │   │       │   │   └── board.component.ts
│   │   │   │       │   ├── cellular-automation-routing.module.ts
│   │   │   │       │   ├── cellular-automation.component.css
│   │   │   │       │   ├── cellular-automation.component.html
│   │   │   │       │   ├── cellular-automation.component.ts
│   │   │   │       │   ├── cellular-automation.module.ts
│   │   │   │       │   ├── oscilators/
│   │   │   │       │   │   ├── oscilators.component.css
│   │   │   │       │   │   ├── oscilators.component.html
│   │   │   │       │   │   ├── oscilators.component.spec.ts
│   │   │   │       │   │   └── oscilators.component.ts
│   │   │   │       │   ├── rule/
│   │   │   │       │   │   ├── rule.component.css
│   │   │   │       │   │   ├── rule.component.html
│   │   │   │       │   │   ├── rule.component.spec.ts
│   │   │   │       │   │   └── rule.component.ts
│   │   │   │       │   ├── rule3/
│   │   │   │       │   │   ├── rule3.component.css
│   │   │   │       │   │   ├── rule3.component.html
│   │   │   │       │   │   ├── rule3.component.ts
│   │   │   │       │   │   └── rule4/
│   │   │   │       │   │       ├── rule4.component.css
│   │   │   │       │   │       ├── rule4.component.html
│   │   │   │       │   │       ├── rule4.component.spec.ts
│   │   │   │       │   │       └── rule4.component.ts
│   │   │   │       │   └── rule8/
│   │   │   │       │       ├── rule8.component.css
│   │   │   │       │       ├── rule8.component.html
│   │   │   │       │       └── rule8.component.ts
│   │   │   │       ├── gomoku/
│   │   │   │       │   ├── board/
│   │   │   │       │   │   ├── board.component.html
│   │   │   │       │   │   ├── board.component.scss
│   │   │   │       │   │   ├── board.component.spec.ts
│   │   │   │       │   │   ├── board.component.ts
│   │   │   │       │   │   └── board.module.ts
│   │   │   │       │   ├── gomoku.component.css
│   │   │   │       │   ├── gomoku.component.html
│   │   │   │       │   ├── gomoku.component.ts
│   │   │   │       │   ├── gomoku.module.ts
│   │   │   │       │   ├── highlights.spec.ts
│   │   │   │       │   ├── highlights.ts
│   │   │   │       │   ├── renlib/
│   │   │   │       │   │   ├── I7.lib
│   │   │   │       │   │   ├── lines.lib
│   │   │   │       │   │   ├── moves.json
│   │   │   │       │   │   ├── parse.js
│   │   │   │       │   │   ├── ss.lib
│   │   │   │       │   │   └── test.lib
│   │   │   │       │   └── tools/
│   │   │   │       │       ├── tools.component.css
│   │   │   │       │       ├── tools.component.html
│   │   │   │       │       ├── tools.component.spec.ts
│   │   │   │       │       └── tools.component.ts
│   │   │   │       ├── gomoku-print/
│   │   │   │       │   ├── gomoku-print.component.css
│   │   │   │       │   ├── gomoku-print.component.html
│   │   │   │       │   ├── gomoku-print.component.ts
│   │   │   │       │   ├── gomoku-print.module.ts
│   │   │   │       │   ├── o/
│   │   │   │       │   │   ├── o.component.css
│   │   │   │       │   │   ├── o.component.html
│   │   │   │       │   │   ├── o.component.spec.ts
│   │   │   │       │   │   └── o.component.ts
│   │   │   │       │   └── x/
│   │   │   │       │       ├── x.component.css
│   │   │   │       │       ├── x.component.html
│   │   │   │       │       ├── x.component.spec.ts
│   │   │   │       │       └── x.component.ts
│   │   │   │       ├── home/
│   │   │   │       │   ├── home.component.css
│   │   │   │       │   ├── home.component.html
│   │   │   │       │   ├── home.component.spec.ts
│   │   │   │       │   ├── home.component.ts
│   │   │   │       │   ├── home.module.spec.ts
│   │   │   │       │   ├── home.module.ts
│   │   │   │       │   └── polaroid/
│   │   │   │       │       ├── polaroid.component.css
│   │   │   │       │       ├── polaroid.component.html
│   │   │   │       │       ├── polaroid.component.spec.ts
│   │   │   │       │       └── polaroid.component.ts
│   │   │   │       ├── msk/
│   │   │   │       │   ├── msk.component.css
│   │   │   │       │   ├── msk.component.html
│   │   │   │       │   ├── msk.component.spec.ts
│   │   │   │       │   ├── msk.component.ts
│   │   │   │       │   └── msk.module.ts
│   │   │   │       ├── music/
│   │   │   │       │   ├── music.component.css
│   │   │   │       │   ├── music.component.html
│   │   │   │       │   ├── music.component.spec.ts
│   │   │   │       │   ├── music.component.ts
│   │   │   │       │   └── music.module.ts
│   │   │   │       ├── qna/
│   │   │   │       │   ├── qna.component.css
│   │   │   │       │   ├── qna.component.html
│   │   │   │       │   ├── qna.component.spec.ts
│   │   │   │       │   ├── qna.component.ts
│   │   │   │       │   └── qna.module.ts
│   │   │   │       ├── regex/
│   │   │   │       │   ├── live/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── live-mock/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   ├── live-mock.component.css
│   │   │   │       │   │   │   ├── live-mock.component.html
│   │   │   │       │   │   │   ├── live-mock.component.spec.ts
│   │   │   │       │   │   │   ├── live-mock.component.ts
│   │   │   │       │   │   │   └── live-mock.module.ts
│   │   │   │       │   │   ├── live.module.ts
│   │   │   │       │   │   ├── live.service.spec.ts
│   │   │   │       │   │   ├── live.service.ts
│   │   │   │       │   │   └── poll/
│   │   │   │       │   │       ├── index.ts
│   │   │   │       │   │       ├── poll.component.css
│   │   │   │       │   │       ├── poll.component.html
│   │   │   │       │   │       ├── poll.component.spec.ts
│   │   │   │       │   │       ├── poll.component.ts
│   │   │   │       │   │       └── poll.module.ts
│   │   │   │       │   ├── regex.component.css
│   │   │   │       │   ├── regex.component.html
│   │   │   │       │   ├── regex.component.spec.ts
│   │   │   │       │   ├── regex.component.ts
│   │   │   │       │   └── regex.module.ts
│   │   │   │       ├── stack/
│   │   │   │       │   ├── simple-stack/
│   │   │   │       │   │   ├── simple-stack.component.css
│   │   │   │       │   │   ├── simple-stack.component.html
│   │   │   │       │   │   ├── simple-stack.component.spec.ts
│   │   │   │       │   │   └── simple-stack.component.ts
│   │   │   │       │   ├── stack-game/
│   │   │   │       │   │   ├── stack-function/
│   │   │   │       │   │   │   ├── stack-function.component.css
│   │   │   │       │   │   │   ├── stack-function.component.html
│   │   │   │       │   │   │   ├── stack-function.component.spec.ts
│   │   │   │       │   │   │   └── stack-function.component.ts
│   │   │   │       │   │   ├── stack-function-button/
│   │   │   │       │   │   │   ├── stack-function-button.component.css
│   │   │   │       │   │   │   ├── stack-function-button.component.html
│   │   │   │       │   │   │   ├── stack-function-button.component.spec.ts
│   │   │   │       │   │   │   └── stack-function-button.component.ts
│   │   │   │       │   │   ├── stack-game.component.css
│   │   │   │       │   │   ├── stack-game.component.html
│   │   │   │       │   │   ├── stack-game.component.spec.ts
│   │   │   │       │   │   └── stack-game.component.ts
│   │   │   │       │   ├── stack-routing.module.ts
│   │   │   │       │   ├── stack-test/
│   │   │   │       │   │   ├── stack-test.component.html
│   │   │   │       │   │   ├── stack-test.component.scss
│   │   │   │       │   │   ├── stack-test.component.spec.ts
│   │   │   │       │   │   └── stack-test.component.ts
│   │   │   │       │   ├── stack.component.css
│   │   │   │       │   ├── stack.component.html
│   │   │   │       │   ├── stack.component.spec.ts
│   │   │   │       │   ├── stack.component.ts
│   │   │   │       │   └── stack.module.ts
│   │   │   │       ├── streaming/
│   │   │   │       │   ├── common.ts
│   │   │   │       │   ├── overlay/
│   │   │   │       │   │   ├── overlay.component.html
│   │   │   │       │   │   ├── overlay.component.scss
│   │   │   │       │   │   ├── overlay.component.spec.ts
│   │   │   │       │   │   └── overlay.component.ts
│   │   │   │       │   └── streaming.module.ts
│   │   │   │       ├── svg/
│   │   │   │       │   ├── samples/
│   │   │   │       │   │   ├── app.component.ts
│   │   │   │       │   │   ├── app.module.ts
│   │   │   │       │   │   ├── attr/
│   │   │   │       │   │   │   └── app.component.ts
│   │   │   │       │   │   ├── bs.module.ts
│   │   │   │       │   │   ├── chart/
│   │   │   │       │   │   │   └── app.component.ts
│   │   │   │       │   │   ├── chart2/
│   │   │   │       │   │   │   ├── app.component.solved.ts
│   │   │   │       │   │   │   ├── app.component.ts
│   │   │   │       │   │   │   ├── app.module.ts
│   │   │   │       │   │   │   └── ticks.component.ts
│   │   │   │       │   │   ├── chart3/
│   │   │   │       │   │   │   ├── app.component.ts
│   │   │   │       │   │   │   ├── app.module.ts
│   │   │   │       │   │   │   └── ticks.component.ts
│   │   │   │       │   │   ├── chart4/
│   │   │   │       │   │   │   ├── app.component.solved.ts
│   │   │   │       │   │   │   ├── app.component.ts
│   │   │   │       │   │   │   ├── app.module.ts
│   │   │   │       │   │   │   └── ticks.component.ts
│   │   │   │       │   │   ├── index.html
│   │   │   │       │   │   ├── style.css
│   │   │   │       │   │   ├── sub.component.ts
│   │   │   │       │   │   └── svg/
│   │   │   │       │   │       └── app.component.ts
│   │   │   │       │   ├── svg-demo/
│   │   │   │       │   │   ├── svg-demo.component.css
│   │   │   │       │   │   ├── svg-demo.component.html
│   │   │   │       │   │   ├── svg-demo.component.spec.ts
│   │   │   │       │   │   └── svg-demo.component.ts
│   │   │   │       │   ├── svg-playground/
│   │   │   │       │   │   ├── svg-playground.component.css
│   │   │   │       │   │   ├── svg-playground.component.html
│   │   │   │       │   │   ├── svg-playground.component.spec.ts
│   │   │   │       │   │   └── svg-playground.component.ts
│   │   │   │       │   ├── svg-together/
│   │   │   │       │   │   ├── svg-together.component.css
│   │   │   │       │   │   ├── svg-together.component.html
│   │   │   │       │   │   ├── svg-together.component.spec.ts
│   │   │   │       │   │   └── svg-together.component.ts
│   │   │   │       │   ├── svg-together-result/
│   │   │   │       │   │   ├── svg-together-result.component.css
│   │   │   │       │   │   ├── svg-together-result.component.html
│   │   │   │       │   │   ├── svg-together-result.component.spec.ts
│   │   │   │       │   │   └── svg-together-result.component.ts
│   │   │   │       │   ├── svg.component.css
│   │   │   │       │   ├── svg.component.html
│   │   │   │       │   ├── svg.component.ts
│   │   │   │       │   ├── svg.module.ts
│   │   │   │       │   └── timer/
│   │   │   │       │       ├── timer.component.css
│   │   │   │       │       ├── timer.component.html
│   │   │   │       │       ├── timer.component.spec.ts
│   │   │   │       │       └── timer.component.ts
│   │   │   │       ├── svg-race/
│   │   │   │       │   ├── finish/
│   │   │   │       │   │   ├── finish.component.css
│   │   │   │       │   │   ├── finish.component.html
│   │   │   │       │   │   ├── finish.component.spec.ts
│   │   │   │       │   │   └── finish.component.ts
│   │   │   │       │   ├── little-car/
│   │   │   │       │   │   ├── little-car.component.css
│   │   │   │       │   │   ├── little-car.component.html
│   │   │   │       │   │   ├── little-car.component.spec.ts
│   │   │   │       │   │   └── little-car.component.ts
│   │   │   │       │   ├── player/
│   │   │   │       │   │   ├── player.component.css
│   │   │   │       │   │   ├── player.component.html
│   │   │   │       │   │   ├── player.component.spec.ts
│   │   │   │       │   │   └── player.component.ts
│   │   │   │       │   ├── race/
│   │   │   │       │   │   ├── race.component.css
│   │   │   │       │   │   ├── race.component.html
│   │   │   │       │   │   ├── race.component.spec.ts
│   │   │   │       │   │   └── race.component.ts
│   │   │   │       │   ├── svg-race.component.css
│   │   │   │       │   ├── svg-race.component.html
│   │   │   │       │   ├── svg-race.component.ts
│   │   │   │       │   ├── svg-race.module.ts
│   │   │   │       │   └── timer/
│   │   │   │       │       ├── timer.component.css
│   │   │   │       │       ├── timer.component.html
│   │   │   │       │       ├── timer.component.spec.ts
│   │   │   │       │       └── timer.component.ts
│   │   │   │       ├── sync/
│   │   │   │       │   ├── sync.component.css
│   │   │   │       │   ├── sync.component.html
│   │   │   │       │   ├── sync.component.spec.ts
│   │   │   │       │   ├── sync.component.ts
│   │   │   │       │   └── sync.module.ts
│   │   │   │       ├── test/
│   │   │   │       │   ├── test.component.css
│   │   │   │       │   ├── test.component.html
│   │   │   │       │   ├── test.component.spec.ts
│   │   │   │       │   ├── test.component.ts
│   │   │   │       │   └── test.module.ts
│   │   │   │       └── webassembly/
│   │   │   │           ├── ca/
│   │   │   │           │   ├── ca.module.ts
│   │   │   │           │   ├── single-cell/
│   │   │   │           │   │   ├── single-cell.component.css
│   │   │   │           │   │   ├── single-cell.component.html
│   │   │   │           │   │   ├── single-cell.component.spec.ts
│   │   │   │           │   │   └── single-cell.component.ts
│   │   │   │           │   └── single-grid/
│   │   │   │           │       ├── single-grid.component.css
│   │   │   │           │       ├── single-grid.component.html
│   │   │   │           │       ├── single-grid.component.spec.ts
│   │   │   │           │       └── single-grid.component.ts
│   │   │   │           ├── full-screen-runner/
│   │   │   │           │   ├── full-screen-runner.component.css
│   │   │   │           │   ├── full-screen-runner.component.html
│   │   │   │           │   ├── full-screen-runner.component.spec.ts
│   │   │   │           │   ├── full-screen-runner.component.ts
│   │   │   │           │   └── full-screen-runner.module.ts
│   │   │   │           ├── monaco-wat.ts
│   │   │   │           ├── samples/
│   │   │   │           │   ├── answer.wat
│   │   │   │           │   ├── base.js
│   │   │   │           │   ├── base.wat
│   │   │   │           │   └── old.wat
│   │   │   │           ├── tests/
│   │   │   │           │   ├── add-tests.ts
│   │   │   │           │   ├── common.ts
│   │   │   │           │   ├── disable-tests.ts
│   │   │   │           │   ├── enable-tests.ts
│   │   │   │           │   ├── evolve-cell.ts
│   │   │   │           │   ├── evolve-row.ts
│   │   │   │           │   ├── evolve.ts
│   │   │   │           │   ├── get-cell-score.ts
│   │   │   │           │   ├── get-index.ts
│   │   │   │           │   ├── load-cell.ts
│   │   │   │           │   ├── load-previous-cell.ts
│   │   │   │           │   ├── rotate.ts
│   │   │   │           │   ├── shift-tests.ts
│   │   │   │           │   └── store-cell-tests.ts
│   │   │   │           ├── utils.spec.ts
│   │   │   │           ├── utils.ts
│   │   │   │           ├── wasm-binary/
│   │   │   │           │   ├── test._wasm
│   │   │   │           │   ├── wasm-binary.component.css
│   │   │   │           │   ├── wasm-binary.component.html
│   │   │   │           │   ├── wasm-binary.component.spec.ts
│   │   │   │           │   ├── wasm-binary.component.ts
│   │   │   │           │   └── wasm-parser.ts
│   │   │   │           ├── webassembly-playground/
│   │   │   │           │   ├── error-message/
│   │   │   │           │   │   ├── error-message.component.css
│   │   │   │           │   │   ├── error-message.component.html
│   │   │   │           │   │   ├── error-message.component.spec.ts
│   │   │   │           │   │   └── error-message.component.ts
│   │   │   │           │   ├── monaco-directives/
│   │   │   │           │   │   ├── common.ts
│   │   │   │           │   │   ├── monaco-js-position.directive.ts
│   │   │   │           │   │   ├── monaco-load-answer.directive.ts
│   │   │   │           │   │   ├── monaco-scrolling.directive.ts
│   │   │   │           │   │   ├── monaco-wat-position.directive.spec.ts
│   │   │   │           │   │   └── monaco-wat-position.directive.ts
│   │   │   │           │   ├── runners/
│   │   │   │           │   │   └── wasm-test-runner/
│   │   │   │           │   │       ├── runner.js
│   │   │   │           │   │       ├── wasm-test-runner.component.html
│   │   │   │           │   │       ├── wasm-test-runner.component.scss
│   │   │   │           │   │       ├── wasm-test-runner.component.spec.ts
│   │   │   │           │   │       └── wasm-test-runner.component.ts
│   │   │   │           │   ├── viz/
│   │   │   │           │   │   ├── grid/
│   │   │   │           │   │   │   ├── grid.component.css
│   │   │   │           │   │   │   ├── grid.component.html
│   │   │   │           │   │   │   ├── grid.component.spec.ts
│   │   │   │           │   │   │   └── grid.component.ts
│   │   │   │           │   │   ├── viz.component.css
│   │   │   │           │   │   ├── viz.component.html
│   │   │   │           │   │   ├── viz.component.spec.ts
│   │   │   │           │   │   ├── viz.component.ts
│   │   │   │           │   │   └── viz.module.ts
│   │   │   │           │   ├── wasm-contents/
│   │   │   │           │   │   ├── wasm-contents.component.css
│   │   │   │           │   │   ├── wasm-contents.component.html
│   │   │   │           │   │   ├── wasm-contents.component.spec.ts
│   │   │   │           │   │   └── wasm-contents.component.ts
│   │   │   │           │   ├── web-assembly.service.spec.ts
│   │   │   │           │   ├── web-assembly.service.ts
│   │   │   │           │   ├── webassembly-code-mode/
│   │   │   │           │   │   ├── webassembly-code-mode.component.css
│   │   │   │           │   │   ├── webassembly-code-mode.component.html
│   │   │   │           │   │   ├── webassembly-code-mode.component.spec.ts
│   │   │   │           │   │   └── webassembly-code-mode.component.ts
│   │   │   │           │   ├── webassembly-playground.component.html
│   │   │   │           │   ├── webassembly-playground.component.scss
│   │   │   │           │   ├── webassembly-playground.component.spec.ts
│   │   │   │           │   ├── webassembly-playground.component.ts
│   │   │   │           │   └── webassembly-runner/
│   │   │   │           │       ├── webassembly-runner.component.css
│   │   │   │           │       ├── webassembly-runner.component.html
│   │   │   │           │       ├── webassembly-runner.component.spec.ts
│   │   │   │           │       ├── webassembly-runner.component.ts
│   │   │   │           │       └── webassembly-runner.module.ts
│   │   │   │           ├── webassembly.component.html
│   │   │   │           ├── webassembly.component.scss
│   │   │   │           ├── webassembly.component.spec.ts
│   │   │   │           ├── webassembly.component.ts
│   │   │   │           └── webassembly.module.ts
│   │   │   ├── assets/
│   │   │   │   ├── .gitkeep
│   │   │   │   └── runner/
│   │   │   │       └── index.html
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── locale/
│   │   │   │   ├── kirjs.ru.xtb
│   │   │   │   └── messages.xmb
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.css
│   │   │   └── test.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── lis/
│   │   ├── browserslist
│   │   ├── jest.config.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.css
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   └── modules/
│   │   │   │       └── rxjs/
│   │   │   │           ├── rxjs.component.css
│   │   │   │           ├── rxjs.component.html
│   │   │   │           ├── rxjs.component.spec.ts
│   │   │   │           ├── rxjs.component.ts
│   │   │   │           └── rxjs.module.ts
│   │   │   ├── assets/
│   │   │   │   └── .gitkeep
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.css
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   └── playground/
│       ├── browserslist
│       ├── jest.config.js
│       ├── src/
│       │   ├── app/
│       │   │   ├── app.component.html
│       │   │   ├── app.component.scss
│       │   │   ├── app.component.spec.ts
│       │   │   ├── app.component.ts
│       │   │   ├── app.module.ts
│       │   │   ├── code-sync/
│       │   │   │   ├── code-sync.component.css
│       │   │   │   ├── code-sync.component.html
│       │   │   │   ├── code-sync.component.spec.ts
│       │   │   │   ├── code-sync.component.ts
│       │   │   │   └── code-sync.module.ts
│       │   │   └── playground/
│       │   │       ├── angular-sample.ts
│       │   │       ├── playground.component.css
│       │   │       ├── playground.component.html
│       │   │       ├── playground.component.spec.ts
│       │   │       ├── playground.component.ts
│       │   │       └── playground.module.ts
│       │   ├── assets/
│       │   │   └── .gitkeep
│       │   ├── environments/
│       │   │   ├── environment.prod.ts
│       │   │   └── environment.ts
│       │   ├── index.html
│       │   ├── main.ts
│       │   ├── polyfills.ts
│       │   ├── styles.scss
│       │   └── test-setup.ts
│       ├── tsconfig.app.json
│       ├── tsconfig.json
│       ├── tsconfig.spec.json
│       └── tslint.json
├── create-issue.js
├── cypress/
│   ├── fixtures/
│   │   └── example.json
│   ├── integration/
│   │   └── codelab/
│   │       └── home.spec.js
│   ├── plugins/
│   │   ├── cy-ts-preprocessor.js
│   │   └── index.js
│   ├── support/
│   │   ├── commands.js
│   │   └── index.js
│   └── tsconfig.json
├── cypress.json
├── docs/
│   ├── CONTRIBUTING.md
│   ├── HOSTING.md
│   └── TRANSLATING.md
├── firebase.json
├── jest.config.js
├── libs/
│   ├── angular-ast-viz/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── angular-ast-viz.module.spec.ts
│   │   │   │   ├── angular-ast-viz.module.ts
│   │   │   │   ├── app.component.css
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   └── ast-tree/
│   │   │   │       ├── ast-tree.component.css
│   │   │   │       ├── ast-tree.component.html
│   │   │   │       ├── ast-tree.component.spec.ts
│   │   │   │       ├── ast-tree.component.ts
│   │   │   │       ├── ast-tree.module.ts
│   │   │   │       ├── short-name-babel.pipe.spec.ts
│   │   │   │       └── short-name-babel.pipe.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── angular-slides-to-pdf/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── angular-slides-to-pdf.component.ts
│   │   │   │   ├── angular-slides-to-pdf.module.spec.ts
│   │   │   │   └── angular-slides-to-pdf.module.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── browser/
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── browser-window/
│   │   │   │   │   ├── browser-window.component.css
│   │   │   │   │   ├── browser-window.component.html
│   │   │   │   │   └── browser-window.component.ts
│   │   │   │   ├── browser.module.ts
│   │   │   │   ├── preview-window/
│   │   │   │   │   ├── preview-window.component.html
│   │   │   │   │   ├── preview-window.component.scss
│   │   │   │   │   └── preview-window.component.ts
│   │   │   │   └── terminal-window/
│   │   │   │       ├── terminal-window.component.css
│   │   │   │       ├── terminal-window.component.html
│   │   │   │       └── terminal-window.component.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── code-demos/
│   │   ├── assets/
│   │   │   └── runner/
│   │   │       ├── README.md
│   │   │       ├── index.html
│   │   │       ├── js/
│   │   │       │   ├── mocha.js
│   │   │       │   ├── system-config.js
│   │   │       │   └── test-bootstrap.js
│   │   │       ├── ng-dts/
│   │   │       │   ├── bundler.ts
│   │   │       │   └── files.txt
│   │   │       ├── ng2/
│   │   │       │   ├── basic.ts
│   │   │       │   ├── ng-bundle.js
│   │   │       │   ├── ng2-runner.js
│   │   │       │   └── rxjs.operators.ts
│   │   │       ├── package.json
│   │   │       └── tsconfig.json
│   │   ├── index.ts
│   │   ├── jest.config.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── code-demo/
│   │   │   │   │   ├── code-demo.component.css
│   │   │   │   │   ├── code-demo.component.html
│   │   │   │   │   └── code-demo.component.ts
│   │   │   │   ├── code-demo-editor/
│   │   │   │   │   ├── code-demo-editor.component.ts
│   │   │   │   │   ├── code-demo-editor.injector.ts
│   │   │   │   │   ├── directives/
│   │   │   │   │   │   ├── code-demo-editor.auto-folding.directive.spec.ts
│   │   │   │   │   │   ├── code-demo-editor.auto-folding.directive.ts
│   │   │   │   │   │   ├── code-demo-editor.highlight.directive.ts
│   │   │   │   │   │   └── code-demo-editor.line-change.directive.ts
│   │   │   │   │   ├── editor.component.css
│   │   │   │   │   ├── themes/
│   │   │   │   │   │   └── devtools.json
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── utils.spec.ts
│   │   │   │   │       └── utils.ts
│   │   │   │   ├── code-demo-runner/
│   │   │   │   │   ├── code-demo-runner.component.css
│   │   │   │   │   ├── code-demo-runner.component.html
│   │   │   │   │   ├── code-demo-runner.component.spec.ts
│   │   │   │   │   └── code-demo-runner.component.ts
│   │   │   │   ├── code-demo.module.ts
│   │   │   │   ├── code-demos.module.spec.ts
│   │   │   │   ├── file-path/
│   │   │   │   │   ├── file-path.component.css
│   │   │   │   │   ├── file-path.component.html
│   │   │   │   │   ├── file-path.component.spec.ts
│   │   │   │   │   └── file-path.component.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── multitab-editor/
│   │   │   │   │   ├── editor-from-model/
│   │   │   │   │   │   ├── editor-from-model.component.css
│   │   │   │   │   │   ├── editor-from-model.component.html
│   │   │   │   │   │   ├── editor-from-model.component.spec.ts
│   │   │   │   │   │   └── editor-from-model.component.ts
│   │   │   │   │   ├── multitab-editor.component.css
│   │   │   │   │   ├── multitab-editor.component.html
│   │   │   │   │   ├── multitab-editor.component.spec.ts
│   │   │   │   │   └── multitab-editor.component.ts
│   │   │   │   ├── realtime-eval/
│   │   │   │   │   ├── realtime-eval.component.css
│   │   │   │   │   ├── realtime-eval.component.html
│   │   │   │   │   ├── realtime-eval.component.spec.ts
│   │   │   │   │   └── realtime-eval.component.ts
│   │   │   │   ├── runner/
│   │   │   │   │   ├── compile-ts-files.ts
│   │   │   │   │   └── prepare-templates.ts
│   │   │   │   └── shared/
│   │   │   │       ├── deps-order.service.spec.ts
│   │   │   │       ├── deps-order.service.ts
│   │   │   │       ├── helpers.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── loop-protection.service.spec.ts
│   │   │   │       ├── loop-protection.service.ts
│   │   │   │       ├── monaco-config.service.spec.ts
│   │   │   │       ├── monaco-config.service.ts
│   │   │   │       ├── monaco-replay.ts
│   │   │   │       ├── sandbox.ts
│   │   │   │       ├── script-loader.service.ts
│   │   │   │       ├── types-not-really.d.ts
│   │   │   │       ├── types.ts
│   │   │   │       ├── utils.ts
│   │   │   │       └── visitor.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── console/
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── console.component.css
│   │   │   │   ├── console.component.html
│   │   │   │   ├── console.component.spec.ts
│   │   │   │   ├── console.component.ts
│   │   │   │   ├── console.module.ts
│   │   │   │   └── display-dynamic.component/
│   │   │   │       ├── display-dynamic-component.component.css
│   │   │   │       ├── display-dynamic-component.component.html
│   │   │   │       ├── display-dynamic-component.component.spec.ts
│   │   │   │       └── display-dynamic-component.component.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── feedback/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── feedback-issue-dropdown/
│   │   │   │   │   ├── feedback-issue-dropdown.component.html
│   │   │   │   │   ├── feedback-issue-dropdown.component.scss
│   │   │   │   │   └── feedback-issue-dropdown.component.ts
│   │   │   │   ├── feedback-rating/
│   │   │   │   │   ├── feedback-rating.component.css
│   │   │   │   │   ├── feedback-rating.component.html
│   │   │   │   │   └── feedback-rating.component.ts
│   │   │   │   ├── feedback-widget/
│   │   │   │   │   ├── feedback-widget.component.html
│   │   │   │   │   ├── feedback-widget.component.scss
│   │   │   │   │   └── feedback-widget.component.ts
│   │   │   │   ├── feedback.module.spec.ts
│   │   │   │   ├── feedback.module.ts
│   │   │   │   ├── feedback.service.spec.ts
│   │   │   │   ├── feedback.service.ts
│   │   │   │   └── message.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── firebase/
│   │   ├── README.md
│   │   ├── jest.config.js
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── firebase.module.spec.ts
│   │   │   │   ├── firebase.module.ts
│   │   │   │   ├── sync-fire-store.directive.spec.ts
│   │   │   │   └── sync-fire-store.directive.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── firebase-login/
│   │   ├── index.ts
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── firebase-login.module.spec.ts
│   │   │   │   ├── firebase-login.module.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login-widget/
│   │   │   │   │   ├── login-widget.component.css
│   │   │   │   │   ├── login-widget.component.html
│   │   │   │   │   ├── login-widget.component.spec.ts
│   │   │   │   │   └── login-widget.component.ts
│   │   │   │   ├── login.service.spec.ts
│   │   │   │   └── login.service.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── intro/
│   │   ├── README.md
│   │   ├── generate/
│   │   │   ├── generate-thumbnails.ts
│   │   │   ├── helpers/
│   │   │   │   ├── const.ts
│   │   │   │   ├── slides.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils.ts
│   │   │   ├── slides.json
│   │   │   └── tsconfig.json
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── intro.component.css
│   │   │   │   ├── intro.component.html
│   │   │   │   ├── intro.component.ts
│   │   │   │   └── intro.module.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── live/
│   │   ├── README.md
│   │   ├── jest.config.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   └── lib/
│   │   │       ├── live-service.service.spec.ts
│   │   │       └── live-service.service.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── slides/
│   │   ├── README.md
│   │   ├── jest.config.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── arrows/
│   │   │   │   │   ├── slides-arrows.component.css
│   │   │   │   │   ├── slides-arrows.component.html
│   │   │   │   │   └── slides-arrows.component.ts
│   │   │   │   ├── deck/
│   │   │   │   │   ├── deck.component.html
│   │   │   │   │   ├── deck.component.scss
│   │   │   │   │   ├── deck.component.spec.ts
│   │   │   │   │   └── deck.component.ts
│   │   │   │   ├── full-screen-mode/
│   │   │   │   │   ├── full-screen-mode.service.spec.ts
│   │   │   │   │   ├── full-screen-mode.service.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── routing/
│   │   │   │   │   ├── slide-routes.ts
│   │   │   │   │   ├── slides-routing.directive.spec.ts
│   │   │   │   │   └── slides-routing.directive.ts
│   │   │   │   ├── shortcuts/
│   │   │   │   │   ├── shortcuts.directive.spec.ts
│   │   │   │   │   └── shortcuts.directive.ts
│   │   │   │   ├── slide/
│   │   │   │   │   ├── slide.directive.spec.ts
│   │   │   │   │   └── slide.directive.ts
│   │   │   │   ├── slides.module.spec.ts
│   │   │   │   └── slides.module.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   └── utils/
│       ├── karma.conf.js
│       ├── src/
│       │   ├── index.ts
│       │   ├── lib/
│       │   │   ├── analytics/
│       │   │   │   ├── analytics.service.spec.ts
│       │   │   │   └── analytics.service.ts
│       │   │   ├── differ/
│       │   │   │   ├── diffFilesResolver.ts
│       │   │   │   ├── differ.spec.ts
│       │   │   │   ├── differ.ts
│       │   │   │   └── fileHelpers.ts
│       │   │   ├── github-PR-service/
│       │   │   │   ├── github.module.ts
│       │   │   │   ├── github.service.ts
│       │   │   │   └── index.ts
│       │   │   ├── i18n/
│       │   │   │   └── i18n-tools.ts
│       │   │   ├── index.ts
│       │   │   ├── loaders/
│       │   │   │   └── loaders.ts
│       │   │   ├── loading-indicator/
│       │   │   │   ├── loading-indicator/
│       │   │   │   │   ├── loading-indicator.component.css
│       │   │   │   │   ├── loading-indicator.component.html
│       │   │   │   │   ├── loading-indicator.component.spec.ts
│       │   │   │   │   └── loading-indicator.component.ts
│       │   │   │   └── loading-indicator.module.ts
│       │   │   ├── pipes/
│       │   │   │   ├── pipes.module.ts
│       │   │   │   └── safeHtml.pipe.ts
│       │   │   ├── sandbox-runner/
│       │   │   │   ├── common.spec.ts
│       │   │   │   ├── common.ts
│       │   │   │   ├── runners/
│       │   │   │   │   ├── runner.ts
│       │   │   │   │   ├── webworker.spec.ts
│       │   │   │   │   └── webworker.ts
│       │   │   │   ├── sandbox-runner.module.ts
│       │   │   │   ├── test-runner-service.service.spec.ts
│       │   │   │   ├── test-runner.component.html
│       │   │   │   ├── test-runner.component.scss
│       │   │   │   ├── test-runner.component.spec.ts
│       │   │   │   ├── test-runner.component.ts
│       │   │   │   ├── test-runner.service.ts
│       │   │   │   ├── test-runner.spec.ts
│       │   │   │   ├── test-runner.ts
│       │   │   │   ├── typescript-checker-runner/
│       │   │   │   │   ├── typescript-checker-runner.component.css
│       │   │   │   │   ├── typescript-checker-runner.component.html
│       │   │   │   │   ├── typescript-checker-runner.component.spec.ts
│       │   │   │   │   ├── typescript-checker-runner.component.ts
│       │   │   │   │   └── typescript-checker-runner.module.ts
│       │   │   │   └── typescript-test-runner/
│       │   │   │       ├── typescript-test-runner.component.css
│       │   │   │       ├── typescript-test-runner.component.html
│       │   │   │       ├── typescript-test-runner.component.spec.ts
│       │   │   │       └── typescript-test-runner.component.ts
│       │   │   ├── sync/
│       │   │   │   ├── common.ts
│       │   │   │   ├── components/
│       │   │   │   │   ├── configure-sync/
│       │   │   │   │   │   ├── configure-sync.component.css
│       │   │   │   │   │   ├── configure-sync.component.html
│       │   │   │   │   │   ├── configure-sync.component.spec.ts
│       │   │   │   │   │   ├── configure-sync.component.ts
│       │   │   │   │   │   └── configure-sync.module.ts
│       │   │   │   │   ├── online-indicator/
│       │   │   │   │   │   ├── online-indicator.component.css
│       │   │   │   │   │   ├── online-indicator.component.html
│       │   │   │   │   │   ├── online-indicator.component.spec.ts
│       │   │   │   │   │   ├── online-indicator.component.ts
│       │   │   │   │   │   └── online-indicator.module.ts
│       │   │   │   │   ├── poll/
│       │   │   │   │   │   ├── common/
│       │   │   │   │   │   │   ├── bar-chart/
│       │   │   │   │   │   │   │   ├── bar-chart.component.html
│       │   │   │   │   │   │   │   ├── bar-chart.component.scss
│       │   │   │   │   │   │   │   ├── bar-chart.component.spec.ts
│       │   │   │   │   │   │   │   ├── bar-chart.component.ts
│       │   │   │   │   │   │   │   └── bar-chart.module.ts
│       │   │   │   │   │   │   ├── common.ts
│       │   │   │   │   │   │   ├── stars/
│       │   │   │   │   │   │   │   ├── stars.component.css
│       │   │   │   │   │   │   │   ├── stars.component.html
│       │   │   │   │   │   │   │   ├── stars.component.spec.ts
│       │   │   │   │   │   │   │   ├── stars.component.ts
│       │   │   │   │   │   │   │   └── stars.module.ts
│       │   │   │   │   │   │   ├── sync-poll.service.spec.ts
│       │   │   │   │   │   │   └── sync-poll.service.ts
│       │   │   │   │   │   ├── sync-poll-admin/
│       │   │   │   │   │   │   ├── sync-poll-admin.component.css
│       │   │   │   │   │   │   ├── sync-poll-admin.component.html
│       │   │   │   │   │   │   ├── sync-poll-admin.component.spec.ts
│       │   │   │   │   │   │   └── sync-poll-admin.component.ts
│       │   │   │   │   │   ├── sync-poll-presenter/
│       │   │   │   │   │   │   ├── choice-presenter/
│       │   │   │   │   │   │   │   ├── choice-presenter.component.css
│       │   │   │   │   │   │   │   ├── choice-presenter.component.html
│       │   │   │   │   │   │   │   ├── choice-presenter.component.spec.ts
│       │   │   │   │   │   │   │   └── choice-presenter.component.ts
│       │   │   │   │   │   │   ├── leaderboard/
│       │   │   │   │   │   │   │   ├── leaderboard-presenter/
│       │   │   │   │   │   │   │   │   ├── leaderboard-presenter.component.css
│       │   │   │   │   │   │   │   │   ├── leaderboard-presenter.component.html
│       │   │   │   │   │   │   │   │   ├── leaderboard-presenter.component.spec.ts
│       │   │   │   │   │   │   │   │   └── leaderboard-presenter.component.ts
│       │   │   │   │   │   │   │   ├── leaderboard-viewer/
│       │   │   │   │   │   │   │   │   ├── leaderboard-viewer.component.css
│       │   │   │   │   │   │   │   │   ├── leaderboard-viewer.component.html
│       │   │   │   │   │   │   │   │   ├── leaderboard-viewer.component.spec.ts
│       │   │   │   │   │   │   │   │   └── leaderboard-viewer.component.ts
│       │   │   │   │   │   │   │   ├── leaderboard.component.css
│       │   │   │   │   │   │   │   ├── leaderboard.component.html
│       │   │   │   │   │   │   │   ├── leaderboard.component.spec.ts
│       │   │   │   │   │   │   │   ├── leaderboard.component.ts
│       │   │   │   │   │   │   │   └── leaderboard.module.ts
│       │   │   │   │   │   │   ├── stars-presenter/
│       │   │   │   │   │   │   │   ├── stars-presenter.component.css
│       │   │   │   │   │   │   │   ├── stars-presenter.component.html
│       │   │   │   │   │   │   │   ├── stars-presenter.component.spec.ts
│       │   │   │   │   │   │   │   └── stars-presenter.component.ts
│       │   │   │   │   │   │   ├── sync-poll-presenter.component.css
│       │   │   │   │   │   │   ├── sync-poll-presenter.component.html
│       │   │   │   │   │   │   ├── sync-poll-presenter.component.spec.ts
│       │   │   │   │   │   │   └── sync-poll-presenter.component.ts
│       │   │   │   │   │   ├── sync-poll-viewer/
│       │   │   │   │   │   │   ├── sync-poll-viewer-choice/
│       │   │   │   │   │   │   │   ├── sync-poll-viewer-choice.component.css
│       │   │   │   │   │   │   │   ├── sync-poll-viewer-choice.component.html
│       │   │   │   │   │   │   │   ├── sync-poll-viewer-choice.component.spec.ts
│       │   │   │   │   │   │   │   └── sync-poll-viewer-choice.component.ts
│       │   │   │   │   │   │   ├── sync-poll-viewer.component.css
│       │   │   │   │   │   │   ├── sync-poll-viewer.component.html
│       │   │   │   │   │   │   ├── sync-poll-viewer.component.spec.ts
│       │   │   │   │   │   │   └── sync-poll-viewer.component.ts
│       │   │   │   │   │   ├── sync-poll.component.css
│       │   │   │   │   │   ├── sync-poll.component.html
│       │   │   │   │   │   ├── sync-poll.component.spec.ts
│       │   │   │   │   │   ├── sync-poll.component.ts
│       │   │   │   │   │   └── sync-poll.module.ts
│       │   │   │   │   ├── questions/
│       │   │   │   │   │   ├── common/
│       │   │   │   │   │   │   ├── common.ts
│       │   │   │   │   │   │   ├── question/
│       │   │   │   │   │   │   │   ├── question.component.html
│       │   │   │   │   │   │   │   ├── question.component.scss
│       │   │   │   │   │   │   │   ├── question.component.spec.ts
│       │   │   │   │   │   │   │   └── question.component.ts
│       │   │   │   │   │   │   ├── question-list/
│       │   │   │   │   │   │   │   ├── question-list.component.css
│       │   │   │   │   │   │   │   ├── question-list.component.html
│       │   │   │   │   │   │   │   ├── question-list.component.spec.ts
│       │   │   │   │   │   │   │   └── question-list.component.ts
│       │   │   │   │   │   │   ├── questions.service.spec.ts
│       │   │   │   │   │   │   └── questions.service.ts
│       │   │   │   │   │   ├── questions-admin/
│       │   │   │   │   │   │   ├── questions-admin.component.css
│       │   │   │   │   │   │   ├── questions-admin.component.html
│       │   │   │   │   │   │   ├── questions-admin.component.spec.ts
│       │   │   │   │   │   │   └── questions-admin.component.ts
│       │   │   │   │   │   ├── questions-presenter/
│       │   │   │   │   │   │   ├── questions-presenter.component.css
│       │   │   │   │   │   │   ├── questions-presenter.component.html
│       │   │   │   │   │   │   ├── questions-presenter.component.spec.ts
│       │   │   │   │   │   │   └── questions-presenter.component.ts
│       │   │   │   │   │   ├── questions-viewer/
│       │   │   │   │   │   │   ├── questions-viewer.component.css
│       │   │   │   │   │   │   ├── questions-viewer.component.html
│       │   │   │   │   │   │   ├── questions-viewer.component.spec.ts
│       │   │   │   │   │   │   └── questions-viewer.component.ts
│       │   │   │   │   │   ├── questions.component.css
│       │   │   │   │   │   ├── questions.component.html
│       │   │   │   │   │   ├── questions.component.spec.ts
│       │   │   │   │   │   ├── questions.component.ts
│       │   │   │   │   │   └── questions.module.ts
│       │   │   │   │   ├── registration/
│       │   │   │   │   │   ├── registration-admin/
│       │   │   │   │   │   │   ├── registration-admin.component.css
│       │   │   │   │   │   │   ├── registration-admin.component.html
│       │   │   │   │   │   │   ├── registration-admin.component.spec.ts
│       │   │   │   │   │   │   └── registration-admin.component.ts
│       │   │   │   │   │   ├── registration-presenter/
│       │   │   │   │   │   │   ├── registration-presenter.component.css
│       │   │   │   │   │   │   ├── registration-presenter.component.html
│       │   │   │   │   │   │   ├── registration-presenter.component.spec.ts
│       │   │   │   │   │   │   └── registration-presenter.component.ts
│       │   │   │   │   │   ├── registration-viewer/
│       │   │   │   │   │   │   ├── registration-viewer.component.css
│       │   │   │   │   │   │   ├── registration-viewer.component.html
│       │   │   │   │   │   │   ├── registration-viewer.component.spec.ts
│       │   │   │   │   │   │   └── registration-viewer.component.ts
│       │   │   │   │   │   ├── registration.component.css
│       │   │   │   │   │   ├── registration.component.html
│       │   │   │   │   │   ├── registration.component.spec.ts
│       │   │   │   │   │   ├── registration.component.ts
│       │   │   │   │   │   ├── sync-registration.module.ts
│       │   │   │   │   │   ├── sync-registration.service.spec.ts
│       │   │   │   │   │   └── sync-registration.service.ts
│       │   │   │   │   ├── sync-code-game/
│       │   │   │   │   │   ├── sync-code-game-admin/
│       │   │   │   │   │   │   ├── sync-code-game-admin.component.css
│       │   │   │   │   │   │   ├── sync-code-game-admin.component.html
│       │   │   │   │   │   │   ├── sync-code-game-admin.component.spec.ts
│       │   │   │   │   │   │   └── sync-code-game-admin.component.ts
│       │   │   │   │   │   ├── sync-code-game-presenter/
│       │   │   │   │   │   │   ├── sync-code-game-presenter.component.css
│       │   │   │   │   │   │   ├── sync-code-game-presenter.component.html
│       │   │   │   │   │   │   ├── sync-code-game-presenter.component.spec.ts
│       │   │   │   │   │   │   └── sync-code-game-presenter.component.ts
│       │   │   │   │   │   ├── sync-code-game-viewer/
│       │   │   │   │   │   │   ├── sync-code-game-viewer.component.css
│       │   │   │   │   │   │   ├── sync-code-game-viewer.component.html
│       │   │   │   │   │   │   ├── sync-code-game-viewer.component.spec.ts
│       │   │   │   │   │   │   └── sync-code-game-viewer.component.ts
│       │   │   │   │   │   ├── sync-code-game.component.css
│       │   │   │   │   │   ├── sync-code-game.component.html
│       │   │   │   │   │   ├── sync-code-game.component.spec.ts
│       │   │   │   │   │   ├── sync-code-game.component.ts
│       │   │   │   │   │   ├── sync-code-game.module.ts
│       │   │   │   │   │   ├── sync-code-game.service.spec.ts
│       │   │   │   │   │   ├── sync-code-game.service.ts
│       │   │   │   │   │   └── tests.ts
│       │   │   │   │   ├── sync-join-instructions/
│       │   │   │   │   │   ├── sync-join-instructions.component.css
│       │   │   │   │   │   ├── sync-join-instructions.component.html
│       │   │   │   │   │   ├── sync-join-instructions.component.spec.ts
│       │   │   │   │   │   ├── sync-join-instructions.component.ts
│       │   │   │   │   │   └── sync-join-instructions.module.ts
│       │   │   │   │   └── sync-sessions/
│       │   │   │   │       ├── sync-sessions.component.css
│       │   │   │   │       ├── sync-sessions.component.html
│       │   │   │   │       ├── sync-sessions.component.spec.ts
│       │   │   │   │       ├── sync-sessions.component.ts
│       │   │   │   │       └── sync-sessions.module.ts
│       │   │   │   ├── directives/
│       │   │   │   │   ├── all-viewer-values.directive.ts
│       │   │   │   │   ├── is-status.directive.ts
│       │   │   │   │   ├── sync-directives.module.ts
│       │   │   │   │   ├── sync-is-presenting.directive.spec.ts
│       │   │   │   │   ├── sync-presenter-value.directive.ts
│       │   │   │   │   ├── sync-user-value.directive.ts
│       │   │   │   │   └── sync-viewer-value.directive.ts
│       │   │   │   ├── services/
│       │   │   │   │   ├── common.ts
│       │   │   │   │   ├── firebase-info.service.ts
│       │   │   │   │   ├── sync-data.service.ts
│       │   │   │   │   ├── sync-db-wrapper.service.spec.ts
│       │   │   │   │   ├── sync-db.service.ts
│       │   │   │   │   ├── sync-session.service.spec.ts
│       │   │   │   │   └── sync-session.service.ts
│       │   │   │   ├── sync-button/
│       │   │   │   │   ├── sync-button.component.css
│       │   │   │   │   ├── sync-button.component.html
│       │   │   │   │   ├── sync-button.component.spec.ts
│       │   │   │   │   ├── sync-button.component.ts
│       │   │   │   │   └── sync-button.module.ts
│       │   │   │   ├── sync-playground/
│       │   │   │   │   ├── sync-playground-presenter/
│       │   │   │   │   │   ├── sync-playground-presenter.component.css
│       │   │   │   │   │   ├── sync-playground-presenter.component.html
│       │   │   │   │   │   ├── sync-playground-presenter.component.spec.ts
│       │   │   │   │   │   └── sync-playground-presenter.component.ts
│       │   │   │   │   ├── sync-playground-test/
│       │   │   │   │   │   ├── sync-playground-test.component.css
│       │   │   │   │   │   ├── sync-playground-test.component.html
│       │   │   │   │   │   ├── sync-playground-test.component.spec.ts
│       │   │   │   │   │   └── sync-playground-test.component.ts
│       │   │   │   │   ├── sync-playground.component.html
│       │   │   │   │   ├── sync-playground.component.scss
│       │   │   │   │   ├── sync-playground.component.spec.ts
│       │   │   │   │   └── sync-playground.component.ts
│       │   │   │   └── sync.module.ts
│       │   │   ├── test-results/
│       │   │   │   ├── common.ts
│       │   │   │   ├── file-aware-description/
│       │   │   │   │   ├── file-aware-description.component.css
│       │   │   │   │   ├── file-aware-description.component.html
│       │   │   │   │   ├── file-aware-description.component.spec.ts
│       │   │   │   │   └── file-aware-description.component.ts
│       │   │   │   ├── simple-tests-progress/
│       │   │   │   │   ├── simple-tests-progress.component.css
│       │   │   │   │   ├── simple-tests-progress.component.html
│       │   │   │   │   ├── simple-tests-progress.component.spec.ts
│       │   │   │   │   ├── simple-tests-progress.component.ts
│       │   │   │   │   └── simple-tests-progress.module.ts
│       │   │   │   ├── test-results/
│       │   │   │   │   ├── test-results.component.html
│       │   │   │   │   ├── test-results.component.scss
│       │   │   │   │   ├── test-results.component.spec.ts
│       │   │   │   │   └── test-results.component.ts
│       │   │   │   ├── test-results.module.ts
│       │   │   │   └── test-run-results/
│       │   │   │       ├── test-run-results.component.html
│       │   │   │       ├── test-run-results.component.scss
│       │   │   │       ├── test-run-results.component.spec.ts
│       │   │   │       └── test-run-results.component.ts
│       │   │   ├── testing/
│       │   │   │   └── mocks/
│       │   │   │       ├── angular-fire.ts
│       │   │   │       └── sync-db-service.ts
│       │   │   └── tracking/
│       │   │       ├── tracking.directive.ts
│       │   │       └── tracking.module.ts
│       │   └── test.ts
│       ├── tsconfig.json
│       ├── tsconfig.lib.json
│       ├── tsconfig.spec.json
│       └── tslint.json
├── ng2ts/
│   ├── .prettierignore
│   ├── api.service.ts
│   ├── app.component.ts
│   ├── app.html
│   ├── app.module.ts
│   ├── code.ts
│   ├── context/
│   │   ├── context.component.ts
│   │   ├── context.html
│   │   └── context.service.ts
│   ├── data-binding/
│   │   ├── DataBinding.ts
│   │   └── DataBindingModule.ts
│   ├── fuzzy-pipe/
│   │   └── fuzzy.pipe.ts
│   ├── main.ts
│   ├── ng2ts.ts
│   ├── search/
│   │   ├── search.component.html
│   │   └── search.component.ts
│   ├── style.css
│   ├── tests/
│   │   ├── ThumbsComponentCreateTest.ts
│   │   ├── ThumbsComponentUseTest.ts
│   │   ├── bootstrapTest.ts
│   │   ├── codelabTest.ts
│   │   ├── contextComponentUseTest.ts
│   │   ├── createComponentTest.ts
│   │   ├── createModuleTest.ts
│   │   ├── diInjectServiceTest.ts
│   │   ├── diInjectServiceTestBabel.ts
│   │   ├── formsTest.ts
│   │   ├── fuzzyPipeCreateTest.ts
│   │   ├── fuzzyPipeUseTest.ts
│   │   ├── materialTest.ts
│   │   ├── routerTest.ts
│   │   ├── templateAddActionTest.ts
│   │   ├── templateAllVideosTest.ts
│   │   ├── templatePageSetupTest.ts
│   │   ├── test.ts
│   │   ├── togglePanelComponentCreateTest.ts
│   │   ├── togglePanelComponentUseTest.ts
│   │   ├── videoComponentCreateTest.ts
│   │   └── videoComponentUseTest.ts
│   ├── thumbs/
│   │   ├── thumbs.component.ts
│   │   └── thumbs.html
│   ├── thumbs.app.module.ts
│   ├── toggle-panel/
│   │   ├── toggle-panel.component.ts
│   │   └── toggle-panel.html
│   ├── toggle-panel.app.module.ts
│   ├── typescript-intro/
│   │   ├── Codelab.ts
│   │   ├── Guest.ts
│   │   └── Main.ts
│   ├── upload/
│   │   ├── upload.component.html
│   │   └── upload.component.ts
│   ├── video/
│   │   ├── video-item.ts
│   │   ├── video-materialized.component.html
│   │   ├── video-wrapper.component.ts
│   │   ├── video.component.html
│   │   ├── video.component.ts
│   │   ├── video.index.html
│   │   └── video.service.ts
│   ├── video.app.module.ts
│   └── wrapper.component.ts
├── nx.json
├── package.json
├── tools/
│   ├── schematics/
│   │   └── slide/
│   │       ├── README.md
│   │       ├── files/
│   │       │   ├── code.bs
│   │       │   └── template.component.html
│   │       ├── index.ts
│   │       └── schema.json
│   └── tsconfig.tools.json
├── tsconfig.json
└── tslint.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
# Editor configuration, see http://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
max_line_length = off
trim_trailing_whitespace = false


================================================
FILE: .firebaserc
================================================
{
  "projects": {
    "default": "angular-presentation",
    "kirjs": "kirjs-kirjs"
  },
  "targets": {
    "angular-presentation": {
      "hosting": {
        "codelab": [
          "angular-presentation"
        ],
        "kirjs": [
          "kirjs-home"
        ],
        "codelab-next": [
          "codelab-next"
        ],
        "lis": [
          "lis-lis"
        ],
        "angular-ivy": [
            "angular-ivy"
        ]
      }
    }
  }
}


================================================
FILE: .flooignore
================================================
extern
node_modules
tmp
vendor
.idea/workspace.xml
.idea/misc.xml


================================================
FILE: .gitattributes
================================================
src/assets/monaco linguist-vendored


================================================
FILE: .gitignore
================================================
# See http://help.github.com/ignore-files/ for more about ignoring files.

# compiled output
/dist
/tmp
/out-tsc

# dependencies
/node_modules
yarn.lock

# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

# misc
/.sass-cache
/connect.lock
/coverage
/typings
.firebase
*.log
.floo

# e2e
/e2e/*.js
/e2e/*.map

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db



================================================
FILE: .nvmrc
================================================
10.17.0


================================================
FILE: .prettierignore
================================================
ng2ts
dist
coverage
libs/code-demos/assets/runner/ng2/ng-bundle.js
libs/code-demos/assets/runner/ng-dts/files.txt


================================================
FILE: .prettierrc
================================================
{
  "singleQuote": true
}


================================================
FILE: .travis.yml
================================================
dist: trusty
language: node_js
node_js:
  - "10"

env:
  matrix:
    - TRIGGER="format:check"
    - TRIGGER="lint"
    - TRIGGER="ng build --  --prod --source-map=false --build-optimizer=false"

script:
  - npm run $TRIGGER

notifications:
  email: false

cache:
  npm: true
  directories:
    - node_modules

deploy:
  provider: firebase
  project: "angular-presentation"
  token:
    secure: "ed9U/81s4sR9ihLEogOdbXlKin0/vhJdk9XaLLTv6jVxGG/n40tcwwsCze6F3sBTibjq90OJHZn1ip+4uDdF+BzdzJ+hjU0SCR4B/Fi3OtxW73vz//ou1BktVrkHh+kzyS+3AvLQ9xvkz1h57vfzgfW8V/Jhy3PviZXvoPO4ttOQs2HwbO3C0BvwIaneRlNDudRz/rIQDHxHPaR6Hh3gG69vBc6D0eWhbMbFcWr6kHN3t2ki3APFR3omtNhZIdrFF9icSkeQ1fwiMKKfQaxmHXT1HZhxSCfvcqYwIqqidcFWTpABlt+2MNpWjnPLJV0l4D2HGSVF4RWtLFqfHhm/cyJTB/1ejDB92U4bA5W/tSGGgry5mgvD2pGrRHqHt+awtP9G4hgrZB3oADj3Q0nbj4VRDMgAYbAvrRYSFzxeXg50j7NwogGh02osAGpBhZzJA1I93c2yEPmcu+ysG1FkCnggh65LYX3Zjyu2eRyuPj0kaT+5OhFUanpCYO2cM/pGFMnG8+InvwLKUKfAtgUrP6yefd5CGJZaWbLGemNue6teAyMVWye4Ep2swY3DW0di5Ikn5lrV2V33yzeNd2OoSQbCaBbFLEYrlHw1+/7yNf928jj4vG0TYJwdUhlZDWdkogFIGx5cyu7dNEa5UnlzhJFkqIoo77kQrD0PKCyoAVg="
  before_deploy:
    - npm run pre-deploy
  on:
    branch: release


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "nrwl.angular-console",
    "angular.ng-template",
    "esbenp.prettier-vscode"
  ]
}


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2017 Kirill Cherkashin

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
[![Join our Slack, #codelab channel](https://img.shields.io/badge/slack-%23codelab-yellowgreen)](https://nycjsorg.now.sh) [![Check out the demo](https://img.shields.io/badge/see%20the-Demo-brightgreen)](https://codelab.fun)

# Angular Codelab - [codelab.fun](https://codelab.fun)

Angular Codelab is a self-paced interactive Angular course:

<img alt="interactive exercises" src="https://user-images.githubusercontent.com/2545357/66274607-4d17a880-e84e-11e9-8ed0-a1ae678988a5.gif"  width="600">
 
- 🔥 Everything in the browser - **no setup needed**
- 🔥 **Interactive code samples** - Change the code and see the result immediately!
- 🔥 Hands-on **Exercises** to solidify your knowledge
- 🔥 **Free** - Made for Angular enthusiasts by Angular enthusiasts  
- 🔥 Written in Angular and **open source**

Try it out yourself at [codelab.fun](https://codelab.fun)

## Help us make Codelab.fun better

- [Contribute to the codebase](#contribute-to-the-codebase)
- [Host a live Angular Codelab event in your city](#host-a-live-angular-codelab-event-in-your-city)
- [Translate Codelab to your language](#translate-codelab-to-your-language)

### Contribute to the codebase

Codelab.fun is an Angular app!

It uses [angular-cli](https://cli.angular.io/) with [nx](https://nx.dev) and all materials are in a form of Angular components.

![image](https://user-images.githubusercontent.com/2545357/66277059-0edab300-e867-11e9-863e-340e6d888ea5.png)

See what [Good first issues](https://github.com/codelab-fun/codelab/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue) are available.

See [CONTRIBUTING.md](./docs/CONTRIBUTING.md) for detailed instructions.

### Host a live Angular Codelab event in your city

We have hosted multiple live codelab events in 10+ cities, and you can help us host one in yours!

See how in [HOSTING.md](./docs/HOSTING.md)

<img alt="People learning angular" src="https://user-images.githubusercontent.com/2545357/66275179-1fcdf900-e854-11e9-8c44-69e4368ba6c1.png"  width="600">

### Translate Codelab to your language

Currently codelab.fun is availble in English and Russian.

See [TRANSLATING.md](./docs/TRANSLATING.md) for how you can help us translate the codelab into your language.

Thanks to amazing [PoEditor](https://poeditor.com) for providing us with an open source licence


================================================
FILE: angular.json
================================================
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "",
  "projects": {
    "codelab": {
      "root": "apps/codelab",
      "sourceRoot": "apps/codelab/src",
      "projectType": "application",
      "architect": {
        "build": {
          "builder": "@angular-builders/custom-webpack:browser",
          "options": {
            "customWebpackConfig": {
              "path": "apps/codelab/extra-webpack.config.js"
            },
            "outputPath": "dist/apps/codelab",
            "index": "apps/codelab/src/index.html",
            "main": "apps/codelab/src/main.ts",
            "tsConfig": "apps/codelab/tsconfig.app.json",
            "polyfills": "apps/codelab/src/polyfills.ts",
            "aot": true,
            "assets": [
              "apps/codelab/src/assets",
              "apps/codelab/src/favicon.ico",
              "apps/codelab/src/manifest.webmanifest",
              {
                "glob": "**/*",
                "input": "node_modules/monaco-editor/",
                "output": "./assets/monaco/"
              },
              {
                "glob": "**/*",
                "input": "libs/intro/assets/",
                "output": "./assets/intro/"
              },
              {
                "glob": "**/*",
                "input": "libs/code-demos/assets/runner/",
                "output": "./assets/runner/"
              }
            ],
            "styles": ["apps/codelab/src/styles.scss"],
            "scripts": []
          },
          "configurations": {
            "ru": {
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": true,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "baseHref": "/ru/",
              "deployUrl": "/ru/",
              "fileReplacements": [
                {
                  "replace": "apps/codelab/src/environments/environment.ts",
                  "with": "apps/codelab/src/environments/environment.prod.ts"
                }
              ],
              "outputPath": "dist/apps/codelab/ru",
              "i18nFile": "apps/codelab/src/locale/codelab.ru.xtb",
              "i18nFormat": "xtb",
              "i18nLocale": "ru"
            },
            "production": {
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "fileReplacements": [
                {
                  "replace": "apps/codelab/src/environments/environment.ts",
                  "with": "apps/codelab/src/environments/environment.prod.ts"
                }
              ],
              "serviceWorker": false
            }
          }
        },
        "serve": {
          "builder": "@angular-builders/custom-webpack:dev-server",
          "options": {
            "browserTarget": "codelab:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "codelab:build:production"
            },
            "ru": {
              "browserTarget": "codelab:build:ru"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "codelab:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "apps/codelab/src/test.ts",
            "karmaConfig": "apps/codelab/karma.conf.js",
            "polyfills": "apps/codelab/src/polyfills.ts",
            "tsConfig": "apps/codelab/tsconfig.spec.json",
            "scripts": [],
            "styles": ["apps/codelab/src/styles.scss"],
            "assets": [
              "apps/codelab/src/assets",
              "apps/codelab/src/favicon.ico",
              "apps/codelab/src/manifest.webmanifest"
            ]
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "apps/codelab/tsconfig.app.json",
              "apps/codelab/tsconfig.spec.json"
            ],
            "exclude": []
          }
        }
      }
    },
    "browser": {
      "root": "libs/browser",
      "sourceRoot": "libs/browser/src",
      "projectType": "library",
      "prefix": "codelab",
      "architect": {
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/browser/tsconfig.lib.json",
              "libs/browser/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "console": {
      "root": "libs/console",
      "sourceRoot": "libs/console/src",
      "projectType": "library",
      "prefix": "codelab",
      "architect": {
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "libs/console/src/test.ts",
            "tsConfig": "libs/console/tsconfig.spec.json",
            "karmaConfig": "libs/console/karma.conf.js"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/console/tsconfig.lib.json",
              "libs/console/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "utils": {
      "root": "libs/utils",
      "sourceRoot": "libs/utils/src",
      "projectType": "library",
      "prefix": "codelab",
      "architect": {
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "libs/utils/src/test.ts",
            "tsConfig": "libs/utils/tsconfig.spec.json",
            "karmaConfig": "libs/utils/karma.conf.js"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/utils/tsconfig.lib.json",
              "libs/utils/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "kirjs": {
      "root": "apps/kirjs/",
      "sourceRoot": "apps/kirjs/src",
      "projectType": "application",
      "prefix": "kirjs",
      "schematics": {},
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "aot": true,
            "outputPath": "dist/apps/kirjs",
            "index": "apps/kirjs/src/index.html",
            "main": "apps/kirjs/src/main.ts",
            "polyfills": "apps/kirjs/src/polyfills.ts",
            "tsConfig": "apps/kirjs/tsconfig.app.json",
            "assets": [
              {
                "glob": "**/*",
                "input": "node_modules/monaco-editor/",
                "output": "./assets/monaco/"
              },
              "apps/kirjs/src/favicon.ico",
              "apps/kirjs/src/assets",
              {
                "glob": "**/*",
                "input": "libs/code-demos/assets/runner/",
                "output": "./assets/runner/"
              }
            ],
            "styles": ["apps/kirjs/src/styles.css"],
            "scripts": []
          },
          "configurations": {
            "ru": {
              "outputPath": "dist/apps/kirjs/ru",
              "aot": true,
              "i18nFile": "apps/kirjs/src/locale/kirjs.ru.xtb",
              "i18nFormat": "xtb",
              "i18nLocale": "ru"
            },
            "production": {
              "fileReplacements": [
                {
                  "replace": "apps/kirjs/src/environments/environment.ts",
                  "with": "apps/kirjs/src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "kirjs:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "kirjs:build:production"
            },
            "ru": {
              "browserTarget": "kirjs:build:ru"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "kirjs:build"
          },
          "configurations": {
            "ru": {
              "outputPath": "locale/",
              "outFile": "messages.ru.untranslated.xlf",
              "i18nFormat": "xlf",
              "i18nLocale": "ru"
            }
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "apps/kirjs/src/test.ts",
            "polyfills": "apps/kirjs/src/polyfills.ts",
            "tsConfig": "apps/kirjs/tsconfig.spec.json",
            "karmaConfig": "apps/kirjs/karma.conf.js",
            "styles": ["apps/kirjs/src/styles.css"],
            "scripts": [],
            "assets": ["apps/kirjs/src/favicon.ico", "apps/kirjs/src/assets"]
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "apps/kirjs/tsconfig.app.json",
              "apps/kirjs/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "angular-ast-viz": {
      "root": "libs/angular-ast-viz",
      "sourceRoot": "libs/angular-ast-viz/src",
      "projectType": "library",
      "prefix": "codelab",
      "architect": {
        "build": {
          "builder": "@nrwl/angular:package",
          "options": {
            "tsConfig": "libs/angular-ast-viz/tsconfig.lib.json",
            "project": "libs/angular-ast-viz/ng-package.json"
          },
          "configurations": {
            "production": {
              "project": "libs/angular-ast-viz/ng-package.prod.json"
            }
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "libs/angular-ast-viz/src/test.ts",
            "tsConfig": "libs/angular-ast-viz/tsconfig.spec.json",
            "karmaConfig": "libs/angular-ast-viz/karma.conf.js"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/angular-ast-viz/tsconfig.lib.json",
              "libs/angular-ast-viz/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "angular-slides-to-pdf": {
      "root": "libs/angular-slides-to-pdf",
      "sourceRoot": "libs/angular-slides-to-pdf/src",
      "projectType": "library",
      "prefix": "codelab",
      "architect": {
        "build": {
          "builder": "@nrwl/angular:package",
          "options": {
            "tsConfig": "libs/angular-slides-to-pdf/tsconfig.lib.json",
            "project": "libs/angular-slides-to-pdf/ng-package.json"
          },
          "configurations": {
            "production": {
              "project": "libs/angular-slides-to-pdf/ng-package.prod.json"
            }
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "libs/angular-slides-to-pdf/src/test.ts",
            "tsConfig": "libs/angular-slides-to-pdf/tsconfig.spec.json",
            "karmaConfig": "libs/angular-slides-to-pdf/karma.conf.js"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/angular-slides-to-pdf/tsconfig.lib.json",
              "libs/angular-slides-to-pdf/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "feedback": {
      "root": "libs/feedback",
      "sourceRoot": "libs/feedback/src",
      "projectType": "library",
      "prefix": "codelab",
      "architect": {
        "build": {
          "builder": "@nrwl/angular:package",
          "options": {
            "tsConfig": "libs/feedback/tsconfig.lib.json",
            "project": "libs/feedback/ng-package.json"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "libs/feedback/src/test.ts",
            "tsConfig": "libs/feedback/tsconfig.spec.json",
            "karmaConfig": "libs/feedback/karma.conf.js"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/feedback/tsconfig.lib.json",
              "libs/feedback/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "code-demos": {
      "root": "libs/code-demos",
      "sourceRoot": "libs/code-demos/src",
      "projectType": "library",
      "prefix": "codelab",
      "architect": {
        "build": {
          "builder": "@nrwl/angular:package",
          "options": {
            "tsConfig": "libs/code-demos/tsconfig.lib.json",
            "project": "libs/code-demos/ng-package.json"
          },
          "configurations": {
            "production": {
              "project": "libs/code-demos/ng-package.prod.json"
            }
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/code-demos/tsconfig.lib.json",
              "libs/code-demos/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "libs/code-demos/jest.config.js",
            "tsConfig": "libs/code-demos/tsconfig.spec.json",
            "setupFile": "libs/code-demos/src/test-setup.ts"
          }
        }
      }
    },
    "live": {
      "root": "libs/live",
      "sourceRoot": "libs/live/src",
      "projectType": "library",
      "prefix": "live",
      "architect": {
        "build": {
          "builder": "@nrwl/angular:package",
          "options": {
            "tsConfig": "libs/live/tsconfig.lib.json",
            "project": "libs/live/ng-package.json"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/live/tsconfig.lib.json",
              "libs/live/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "libs/live/jest.config.js",
            "tsConfig": "libs/live/tsconfig.spec.json"
          }
        }
      },
      "schematics": {}
    },
    "firebase-login": {
      "root": "libs/firebase-login",
      "sourceRoot": "libs/firebase-login/src",
      "projectType": "library",
      "prefix": "angular-presentation",
      "architect": {
        "build": {
          "builder": "@nrwl/angular:package",
          "options": {
            "tsConfig": "libs/firebase-login/tsconfig.lib.json",
            "project": "libs/firebase-login/ng-package.json"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "libs/firebase-login/src/test.ts",
            "tsConfig": "libs/firebase-login/tsconfig.spec.json",
            "karmaConfig": "libs/firebase-login/karma.conf.js"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/firebase-login/tsconfig.lib.json",
              "libs/firebase-login/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "blog": {
      "root": "apps/blog/",
      "sourceRoot": "apps/blog/src",
      "projectType": "application",
      "prefix": "codelab",
      "schematics": {
        "@nrwl/schematics:component": {
          "style": "scss"
        }
      },
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/apps/blog",
            "index": "apps/blog/src/index.html",
            "main": "apps/blog/src/main.ts",
            "polyfills": "apps/blog/src/polyfills.ts",
            "tsConfig": "apps/blog/tsconfig.app.json",
            "assets": ["apps/blog/src/favicon.ico", "apps/blog/src/assets"],
            "styles": ["apps/blog/src/styles.scss"],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "apps/blog/src/environments/environment.ts",
                  "with": "apps/blog/src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "20mb"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "blog:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "blog:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "blog:build"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "apps/blog/tsconfig.app.json",
              "apps/blog/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "apps/blog/jest.config.js",
            "tsConfig": "apps/blog/tsconfig.spec.json",
            "setupFile": "apps/blog/src/test-setup.ts"
          }
        }
      }
    },
    "angular-thirty-seconds": {
      "root": "apps/angular-thirty-seconds/",
      "sourceRoot": "apps/angular-thirty-seconds/src",
      "projectType": "application",
      "prefix": "codelab",
      "schematics": {
        "@nrwl/schematics:component": {
          "style": "scss"
        }
      },
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/apps/codelab/30",
            "index": "apps/angular-thirty-seconds/src/index.html",
            "main": "apps/angular-thirty-seconds/src/main.ts",
            "polyfills": "apps/angular-thirty-seconds/src/polyfills.ts",
            "tsConfig": "apps/angular-thirty-seconds/tsconfig.app.json",
            "assets": [
              {
                "glob": "**/*",
                "input": "node_modules/monaco-editor/",
                "output": "./assets/monaco/"
              },
              "apps/angular-thirty-seconds/src/favicon.ico",
              "apps/angular-thirty-seconds/src/assets",
              {
                "glob": "**/*",
                "input": "libs/code-demos/assets/runner/",
                "output": "./assets/runner/"
              }
            ],
            "styles": [
              "apps/angular-thirty-seconds/src/styles.scss",
              "node_modules/prismjs/themes/prism-okaidia.css",
              "node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css"
            ],
            "scripts": [
              "node_modules/prismjs/prism.js",
              "node_modules/prismjs/components/prism-typescript.min.js",
              "node_modules/prismjs/plugins/line-numbers/prism-line-numbers.js"
            ]
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "apps/angular-thirty-seconds/src/environments/environment.ts",
                  "with": "apps/angular-thirty-seconds/src/environments/environment.prod.ts"
                }
              ],
              "baseHref": "/30/",
              "deployUrl": "/30/",
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "60mb",
                  "maximumError": "70mb"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "angular-thirty-seconds:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "angular-thirty-seconds:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "angular-thirty-seconds:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "apps/angular-thirty-seconds/src/test.ts",
            "polyfills": "apps/angular-thirty-seconds/src/polyfills.ts",
            "tsConfig": "apps/angular-thirty-seconds/tsconfig.spec.json",
            "karmaConfig": "apps/angular-thirty-seconds/karma.conf.js",
            "styles": ["apps/angular-thirty-seconds/src/styles.scss"],
            "scripts": [],
            "assets": [
              "apps/angular-thirty-seconds/src/favicon.ico",
              "apps/angular-thirty-seconds/src/assets"
            ]
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "apps/angular-thirty-seconds/tsconfig.app.json",
              "apps/angular-thirty-seconds/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**"]
          }
        }
      }
    },
    "lis": {
      "projectType": "application",
      "schematics": {},
      "root": "apps/lis",
      "sourceRoot": "apps/lis/src",
      "prefix": "codelab",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/apps/lis",
            "index": "apps/lis/src/index.html",
            "main": "apps/lis/src/main.ts",
            "polyfills": "apps/lis/src/polyfills.ts",
            "tsConfig": "apps/lis/tsconfig.app.json",
            "aot": false,
            "assets": [
              "apps/lis/src/favicon.ico",
              "apps/lis/src/assets",
              {
                "glob": "**/*",
                "input": "node_modules/monaco-editor/",
                "output": "./assets/monaco/"
              },
              {
                "glob": "**/*",
                "input": "libs/code-demos/assets/runner/",
                "output": "./assets/runner/"
              }
            ],
            "styles": ["apps/lis/src/styles.css"],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "apps/lis/src/environments/environment.ts",
                  "with": "apps/lis/src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "5mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "10kb"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "lis:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "lis:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "lis:build"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "apps/lis/tsconfig.app.json",
              "apps/lis/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**", "!apps/lis/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "apps/lis/jest.config.js",
            "tsConfig": "apps/lis/tsconfig.spec.json",
            "setupFile": "apps/lis/src/test-setup.ts"
          }
        }
      }
    },
    "playground": {
      "projectType": "application",
      "schematics": {
        "@nrwl/angular:component": {
          "style": "scss"
        }
      },
      "root": "apps/playground",
      "sourceRoot": "apps/playground/src",
      "prefix": "codelab",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/apps/playground",
            "index": "apps/playground/src/index.html",
            "main": "apps/playground/src/main.ts",
            "polyfills": "apps/playground/src/polyfills.ts",
            "tsConfig": "apps/playground/tsconfig.app.json",
            "aot": true,
            "assets": [
              "apps/playground/src/favicon.ico",
              "apps/playground/src/assets",
              {
                "glob": "**/*",
                "input": "node_modules/monaco-editor/",
                "output": "./assets/monaco/"
              }
            ],
            "styles": ["apps/playground/src/styles.scss"],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "apps/playground/src/environments/environment.ts",
                  "with": "apps/playground/src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "20mb",
                  "maximumError": "25mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "10kb"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "playground:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "playground:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "playground:build"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "apps/playground/tsconfig.app.json",
              "apps/playground/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**", "!apps/playground/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "apps/playground/jest.config.js",
            "tsConfig": "apps/playground/tsconfig.spec.json",
            "setupFile": "apps/playground/src/test-setup.ts"
          }
        }
      }
    },
    "firebase": {
      "projectType": "library",
      "root": "libs/firebase",
      "sourceRoot": "libs/firebase/src",
      "prefix": "codelab",
      "architect": {
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/firebase/tsconfig.lib.json",
              "libs/firebase/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**", "!libs/firebase/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "libs/firebase/jest.config.js",
            "tsConfig": "libs/firebase/tsconfig.spec.json",
            "setupFile": "libs/firebase/src/test-setup.ts"
          }
        }
      },
      "schematics": {}
    },
    "intro": {
      "projectType": "library",
      "root": "libs/intro",
      "sourceRoot": "libs/intro/src",
      "prefix": "codelab",
      "architect": {
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/intro/tsconfig.lib.json",
              "libs/intro/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**", "!libs/intro/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "libs/intro/jest.config.js",
            "tsConfig": "libs/intro/tsconfig.spec.json",
            "setupFile": "libs/intro/src/test-setup.ts"
          }
        }
      },
      "schematics": {}
    },
    "slides": {
      "projectType": "library",
      "root": "libs/slides",
      "sourceRoot": "libs/slides/src",
      "prefix": "codelab",
      "architect": {
        "build": {
          "builder": "@nrwl/angular:package",
          "options": {
            "tsConfig": "libs/slides/tsconfig.lib.json",
            "project": "libs/slides/ng-package.json"
          },
          "configurations": {
            "production": {
              "tsConfig": "libs/slides/tsconfig.lib.prod.json"
            }
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "libs/slides/tsconfig.lib.json",
              "libs/slides/tsconfig.spec.json"
            ],
            "exclude": ["**/node_modules/**", "!libs/slides/**"]
          }
        },
        "test": {
          "builder": "@nrwl/jest:jest",
          "options": {
            "jestConfig": "libs/slides/jest.config.js",
            "tsConfig": "libs/slides/tsconfig.spec.json",
            "setupFile": "libs/slides/src/test-setup.ts"
          }
        }
      },
      "schematics": {}
    }
  },
  "defaultProject": "codelab",
  "schematics": {
    "@schematics/angular:component": {
      "prefix": "slides",
      "style": "css"
    },
    "@schematics/angular:directive": {
      "prefix": "slides"
    },
    "@nrwl/schematics:library": {
      "unitTestRunner": "karma",
      "framework": "angular"
    },
    "@nrwl/schematics:application": {
      "unitTestRunner": "karma",
      "e2eTestRunner": "protractor"
    },
    "@nrwl/schematics:node-application": {
      "framework": "express"
    },
    "@nrwl/angular:application": {
      "unitTestRunner": "jest",
      "e2eTestRunner": "cypress"
    },
    "@nrwl/angular:library": {
      "unitTestRunner": "jest"
    }
  },
  "cli": {
    "defaultCollection": "@nrwl/angular",
    "analytics": "2d33a6dc-15e8-4227-b14e-dedd96805cec"
  }
}


================================================
FILE: apps/angular-thirty-seconds/browserslist
================================================
# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
#
# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed

> 0.5%
last 2 versions
Firefox ESR
not dead
not IE 9-11

================================================
FILE: apps/angular-thirty-seconds/karma.conf.js
================================================
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function(config) {
  config.set({
    basePath: '../',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, '../coverage'),
      reports: ['html', 'lcovonly'],
      fixWebpackSourcePaths: true
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false
  });
};


================================================
FILE: apps/angular-thirty-seconds/src/app/app.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  selector: 'codelab-root',
  template: `
    <div class="wrapper">
      <router-outlet></router-outlet>
    </div>
  `,

  styles: [
    `
      .wrapper {
        margin: 0 60px;
        padding: 0 20px;
      }

      :host ::ng-deep {
        font-family: 'Helvetica Neue', sans-serif;
        font-weight: 300;
        padding: 0 20px;
        display: block;
      }
    `
  ]
})
export class AppComponent {}


================================================
FILE: apps/angular-thirty-seconds/src/app/app.module.ts
================================================
import { MatButtonModule } from '@angular/material/button';
import { MatTableModule } from '@angular/material/table';
import { BrowserModule } from '@angular/platform-browser';
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { RouterModule, Routes } from '@angular/router';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { monacoReady } from '@codelab/code-demos';
import { HttpClientModule } from '@angular/common/http';
import { CreateSnippetComponent } from './create-snippet/create-snippet.component';
import { CreateSnippetModule } from './create-snippet/create-snippet.module';
import { environment } from '../../../codelab/src/environments/environment';
import { AngularFireModule } from '@angular/fire';
import { PullRequestsListComponent } from './pull-requests-list/pull-requests-list.component';

export const angularFire = AngularFireModule.initializeApp(
  environment.firebaseConfig
);

const routes: Routes = [
  { path: '', redirectTo: 'list', pathMatch: 'full' },
  { path: 'list', component: PullRequestsListComponent },
  { path: 'new/:repoName/:repoOwner', component: CreateSnippetComponent },
  {
    path: 'new/:repoName/:repoOwner/:pullNumber',
    component: CreateSnippetComponent
  }
];

@NgModule({
  imports: [
    angularFire,
    BrowserModule,
    BrowserAnimationsModule,
    RouterModule.forRoot(routes),
    MatButtonModule,
    MatTableModule,
    HttpClientModule,
    CreateSnippetModule
  ],
  declarations: [AppComponent, PullRequestsListComponent],
  providers: [
    {
      provide: APP_INITIALIZER,
      useValue: monacoReady,
      multi: true
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.html
================================================
<div *ngIf="!isLoading; else loadingTmp" class="container">
  <h1>
    {{ isEditing ? '' : 'New' }} Snippet
    <button (click)="openPreview()" mat-button class="btn-submit">
      {{ isEditing ? 'Edit' : 'Create' }} Snippet
    </button>
  </h1>

  <codelab-snippet-info></codelab-snippet-info>

  <form [formGroup]="snippetForm">
    <section>
      <div class="input-block">
        <div>
          <label for="snippetTitle">
            Title <span class="required">*</span>
          </label>
          <mat-form-field>
            <input
              formControlName="title"
              maxlength="120"
              id="snippetTitle"
              type="text"
              matInput
            />
          </mat-form-field>
          <span class="input-info"> Maximum 120 symbols </span>
          <div
            *ngIf="
              snippetForm.get('title').touched &&
              snippetForm.get('title').invalid
            "
          >
            <div
              *ngIf="snippetForm.get('title').errors['required']"
              class="validation-message"
            >
              This field is required
            </div>
          </div>
        </div>
        <div>
          <label for="snippetLevel">
            Level <span class="required">*</span>
          </label>
          <mat-form-field>
            <mat-select formControlName="level" id="snippetLevel">
              <mat-option value="beginner">beginner</mat-option>
              <mat-option value="intermediate">intermediate</mat-option>
              <mat-option value="advanced">advanced</mat-option>
            </mat-select>
          </mat-form-field>
          <div
            *ngIf="
              snippetForm.get('level').touched &&
              snippetForm.get('level').invalid
            "
          >
            <div
              *ngIf="snippetForm.get('level').errors['required']"
              class="validation-message"
            >
              This field is required
            </div>
          </div>
        </div>

        <div>
          <label for="snippetTwitter">
            Your twitter handle
          </label>
          <mat-form-field>
            <input
              formControlName="twitter"
              id="snippetTwitter"
              type="text"
              matInput
            />
          </mat-form-field>
        </div>

        <div>
          <label for="tags"> Tags <span class="required">*</span> </label>
          <mat-form-field>
            <mat-chip-list #chipList>
              <mat-chip
                *ngFor="let tag of tags"
                [removable]="true"
                (removed)="removeTag(tag)"
              >
                {{ tag }}
              </mat-chip>
              <input
                #tagInput
                formControlName="tags"
                id="tags"
                [matAutocomplete]="auto"
                [matChipInputFor]="chipList"
                [matChipInputAddOnBlur]="true"
                [matChipInputSeparatorKeyCodes]="separatorKeysCodes"
                (matChipInputTokenEnd)="addTag($event)"
              />
            </mat-chip-list>
            <mat-autocomplete
              #auto="matAutocomplete"
              (optionSelected)="selectedTags($event)"
            >
              <mat-option
                *ngFor="let tag of filteredTags | async"
                [value]="tag"
              >
                {{ tag }}
              </mat-option>
            </mat-autocomplete>
          </mat-form-field>
          <span class="input-info"> Maximum 5 tags </span>
          <div
            *ngIf="
              snippetForm.get('tags').touched && snippetForm.get('tags').invalid
            "
          >
            <div
              *ngIf="snippetForm.get('tags').errors['required']"
              class="validation-message"
            >
              This field is required
            </div>
            <div
              *ngIf="snippetForm.get('tags').errors['tagsError']"
              class="validation-message"
            >
              {{ snippetForm.get('tags').errors['tagsError'] }}
            </div>
          </div>
        </div>
      </div>
    </section>

    <section>
      <div class="w-50">
        <label for="content"> Content <span class="required">*</span> </label>
        <mat-form-field>
          <textarea formControlName="content" id="content" type="text" matInput>
          </textarea>
        </mat-form-field>
        <div
          *ngIf="
            snippetForm.get('content').touched &&
            snippetForm.get('content').invalid
          "
        >
          <div
            *ngIf="snippetForm.get('content').errors['required']"
            class="validation-message"
          >
            This field is required
          </div>
          <div
            *ngIf="snippetForm.get('content').errors['linesError']"
            class="validation-message"
          >
            {{ snippetForm.get('content').errors['linesError'] }}
          </div>
        </div>
      </div>
      <div class="markdown-info">
        <markdown [data]="snippetForm.get('content').value"></markdown>
      </div>
    </section>

    <p (click)="hasBonus = !hasBonus" class="cursor-pointer">
      <span *ngIf="!hasBonus" class="icon-plus"> Add Bonus section </span>
      <span *ngIf="hasBonus" class="icon-minus"> Remove Bonus section </span>
    </p>
    <ng-container *ngIf="hasBonus">
      <section>
        <div class="w-50">
          <label for="bonus"> Bonus </label>
          <mat-form-field>
            <textarea formControlName="bonus" id="bonus" type="text" matInput>
            </textarea>
          </mat-form-field>
        </div>
        <div class="markdown-info">
          <markdown [data]="snippetForm.get('bonus').value"></markdown>
        </div>
      </section>
    </ng-container>

    <p (click)="hasLinks = !hasLinks" class="cursor-pointer">
      <span *ngIf="!hasLinks" class="icon-plus"> Add Links section </span>
      <span *ngIf="hasLinks" class="icon-minus"> Remove Links section </span>
    </p>
    <ng-container *ngIf="hasLinks">
      <section>
        <div class="w-50">
          <label for="links"> Links </label>
          <mat-form-field>
            <textarea formControlName="links" id="links" type="text" matInput>
            </textarea>
          </mat-form-field>
        </div>
      </section>
    </ng-container>

    <p (click)="hasDemo = !hasDemo" class="cursor-pointer">
      <span *ngIf="!hasDemo" class="icon-plus"> Add Demo section </span>
      <span *ngIf="hasDemo" class="icon-minus"> Remove Demo section </span>
    </p>
    <ng-container *ngIf="hasDemo">
      <section>
        <div class="w-100">
          <code-demo formControlName="demo" bootstrap="main"></code-demo>
        </div>
      </section>
    </ng-container>
  </form>
</div>

<ng-template #loadingTmp>
  <codelab-snippet-spinner></codelab-snippet-spinner>
</ng-template>


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.scss
================================================
:host {
  label {
    color: #3e515b;
  }

  textarea {
    width: 100%;
    height: 280px;
  }

  mat-form-field {
    width: 100%;
  }

  section {
    display: flex;
    margin: 30px 0;
  }

  .icon {
    justify-content: center;
    align-items: center;
    font-size: 15px;

    &-plus:before {
      content: '\FF0B';
      border: 1px solid #444;
      border-radius: 50%;
      color: #444;
    }

    &-minus:before {
      content: '\FF0D';
      border: 1px solid #444;
      border-radius: 50%;
      color: #444;
    }
  }

  .btn-submit {
    float: right;
    font-weight: 400;
    text-align: center;
    vertical-align: middle;
    border: 1px solid #213451;
    font-size: 14px;
    color: #fff;
    background-color: #213451;
    cursor: pointer;
  }

  .container {
    max-width: 850px;
    padding: 0 15px 30px 15px;
    margin: 0 auto;
    font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
  }

  .input-info {
    display: block;
    height: 10px;
    line-height: 10px;
    font-size: 0.625em;
    margin-top: -15px;
    color: #8b8b8b;
  }

  .markdown-info {
    width: 50%;
    padding: 15px 35px;
    border: 1px solid #a4b7c1;
    margin-left: 30px;
  }

  .input-block {
    width: 300px;

    div {
      margin-bottom: 25px;
      width: 100%;
    }
  }

  .required {
    color: red;
  }

  .cursor-pointer {
    cursor: pointer;
  }

  .w {
    &-100 {
      width: 100%;
    }

    &-50 {
      width: 50%;
    }
  }

  .validation-message {
    color: red;
    position: absolute;
    width: 100%;
    height: 1em;
    margin-top: 5px;
    line-height: 1em;
    font-size: 0.75em;
    text-align: left;
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.spec.ts
================================================
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { CreateSnippetComponent } from './create-snippet.component';
import { CreateSnippetModule } from './create-snippet.module';
import { ActivatedRoute } from '@angular/router';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { SnippetService } from '../shared/services/snippet.service';
import SpyObj = jasmine.SpyObj;
import { of } from 'rxjs';

describe('CreateSnippetComponent', () => {
  let component: CreateSnippetComponent;
  let fixture: ComponentFixture<CreateSnippetComponent>;
  let snippetService: SpyObj<SnippetService>;
  let activatedRoute: Partial<ActivatedRoute>;

  beforeEach(async(() => {
    activatedRoute = {
      snapshot: {
        params: {}
      }
    } as any;

    snippetService = jasmine.createSpyObj('snippetService', ['fetchPR']);

    TestBed.configureTestingModule({
      imports: [CreateSnippetModule, NoopAnimationsModule],
      providers: [
        {
          provide: ActivatedRoute,
          useFactory: () => activatedRoute
        },
        {
          provide: SnippetService,
          useValue: snippetService
        }
      ]
    }).compileComponents();
  }));

  beforeEach(() => {});

  xit('should create', () => {
    const repoName = 'name';
    const repoOwner = 'PIKACHU';
    const pullNumber = 689;

    activatedRoute = {
      snapshot: {
        params: {
          pullNumber,
          repoName,
          repoOwner
        }
      }
    } as any;

    snippetService.fetchPR.and.returnValue(of({}));

    fixture = TestBed.createComponent(CreateSnippetComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();

    expect(snippetService.fetchPR).toHaveBeenCalledWith(
      repoName,
      repoOwner,
      pullNumber
    );
  });
});


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.ts
================================================
import {
  ChangeDetectionStrategy,
  ChangeDetectorRef,
  Component,
  ElementRef,
  OnDestroy,
  ViewChild
} from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import {
  MatAutocomplete,
  MatAutocompleteSelectedEvent
} from '@angular/material/autocomplete';
import { MatChipInputEvent } from '@angular/material/chips';
import { MatDialog } from '@angular/material/dialog';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { Observable } from 'rxjs/internal/Observable';
import { finalize, map } from 'rxjs/operators';
import { ReplaySubject } from 'rxjs/internal/ReplaySubject';
import { SnippetOverviewComponent } from './snippet-modal/snippet-overview.component';
import {
  angularSampleCode,
  LINKS_PLACEHOLDER,
  MARKDOWN_PLACEHOLDER,
  TAGS_LIST
} from '../shared';
import { SnippetService } from '../shared/services/snippet.service';
import {
  markFormControlsAsTouched,
  validatorMaxLines,
  validatorMaxTags
} from '../shared/functions/validation';
import { parseSnippet } from '../shared/functions/parse-snippet';
import { SEPARATOR } from '../shared/consts';

interface SnippetFileInfo {
  sha: string;
  fileName: string;
  snippet: string;
  branchName: string;
}

function importSnippet(snippet) {
  const result = { ...snippet };
  result.links = (result.links || []).join(SEPARATOR);
  return result;
}

@Component({
  selector: 'codelab-create-snippet',
  changeDetection: ChangeDetectionStrategy.OnPush,
  templateUrl: './create-snippet.component.html',
  styleUrls: ['./create-snippet.component.scss']
})
export class CreateSnippetComponent implements OnDestroy {
  @ViewChild('tagInput', { static: false }) tagInput: ElementRef<
    HTMLInputElement
  >;
  @ViewChild('auto', { static: false }) matAutocomplete: MatAutocomplete;

  repoName: string;
  repoOwner: string;

  destroy = new ReplaySubject<void>(1);

  isLoading = false;
  isEditing = false;
  snippetFileInfo: SnippetFileInfo;

  TAGS_LIST = TAGS_LIST;
  tags: string[] = ['tip'];
  filteredTags: Observable<string[]>;

  snippetForm = this.fb.group({
    title: ['', Validators.required],
    twitter: [''],
    level: ['beginner', Validators.required],
    tags: [this.tags, [Validators.required, validatorMaxTags(5)]],
    content: [
      MARKDOWN_PLACEHOLDER,
      [Validators.required, validatorMaxLines(25)]
    ],
    bonus: [''],
    links: [LINKS_PLACEHOLDER],
    demo: [angularSampleCode]
  });

  hasBonus = false;
  hasLinks = false;
  hasDemo = false;

  separatorKeysCodes: number[] = [ENTER, COMMA];

  constructor(
    private fb: FormBuilder,
    private cd: ChangeDetectorRef,
    private activatedRoute: ActivatedRoute,
    private snippetService: SnippetService,
    public dialog: MatDialog
  ) {
    const pullNumber = this.activatedRoute.snapshot.params['pullNumber'];
    this.repoName = this.activatedRoute.snapshot.params['repoName'];
    this.repoOwner = this.activatedRoute.snapshot.params['repoOwner'];

    if (pullNumber) {
      this.isEditing = true;
      this.fetchPR(pullNumber);
    }

    this.filteredTags = this.snippetForm
      .get('tags')
      .valueChanges.pipe(
        map((tags: string) =>
          tags ? this._filterTags(tags.slice(-1)[0]) : this.TAGS_LIST.slice()
        )
      );
  }

  fetchPR(pullNumber: number) {
    this.isLoading = true;
    this.snippetService
      .fetchPR(this.repoName, this.repoOwner, pullNumber)
      .pipe(
        finalize(() => {
          this.isLoading = false;
          this.cd.markForCheck();
        })
      )
      .subscribe((snippetFileInfo: SnippetFileInfo) => {
        this.snippetFileInfo = snippetFileInfo;

        const snippet = importSnippet(parseSnippet(snippetFileInfo.snippet));
        if (snippet.demo) {
          this.hasDemo = true;
        }
        if (snippet.bonus) {
          this.hasBonus = true;
        }
        if (snippet.links) {
          this.hasLinks = true;
        }
        this.snippetForm.patchValue(snippet);
      });
  }

  ngOnDestroy() {
    this.destroy.next(null);
    this.destroy.complete();
  }

  openPreview() {
    if (this.snippetForm.valid) {
      this.dialog.open(SnippetOverviewComponent, {
        data: {
          formValue: this.getPreparedFormValue(this.snippetForm.value),
          isEditing: this.isEditing,
          fileInfo: this.snippetFileInfo
            ? {
                sha: this.snippetFileInfo['sha'],
                fileName: this.snippetFileInfo['fileName'],
                branchName: this.snippetFileInfo['branchName']
              }
            : null,
          repoName: this.repoName,
          repoOwner: this.repoOwner
        }
      });
    } else {
      markFormControlsAsTouched(this.snippetForm);
    }
  }

  getPreparedFormValue(value) {
    Object.keys(value['demo']).forEach(x => {
      const isChangedAndNotEmpty =
        this.hasDemo && value.demo[x] && value.demo[x] !== angularSampleCode[x];
      value['demo'][x] = isChangedAndNotEmpty ? value.demo[x] : null;
    });
    value['bonus'] = this.hasBonus ? value['bonus'] : null;
    value['links'] = this.hasLinks ? value['links'] : null;
    return value;
  }

  addTag(event: MatChipInputEvent): void {
    if (!this.matAutocomplete.isOpen) {
      const input = event.input;
      const value = event.value;
      if ((value || '').trim()) {
        this.tags.push(value.trim());
      }
      if (input) {
        input.value = '';
      }
      this.snippetForm.get('tags').patchValue(this.tags);
    }
  }

  removeTag(tag: string): void {
    const index = this.tags.indexOf(tag);
    if (index >= 0) {
      this.tags.splice(index, 1);
    }
    this.snippetForm.get('tags').patchValue(this.tags);
  }

  selectedTags(event: MatAutocompleteSelectedEvent): void {
    this.tags.push(event.option.viewValue);
    this.tagInput.nativeElement.value = '';
    this.snippetForm.get('tags').patchValue(this.tags);
  }

  private _filterTags(value: string): string[] {
    const filterValue = value ? value.toLowerCase() : null;
    return this.TAGS_LIST.filter(
      tag => tag.toLowerCase().indexOf(filterValue) === 0
    );
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CreateSnippetComponent } from './create-snippet.component';
import { SnippetInfoComponent } from './snippet-info/snippet-info.component';
import { ReactiveFormsModule } from '@angular/forms';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatButtonModule } from '@angular/material/button';
import { MatChipsModule } from '@angular/material/chips';
import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MarkdownModule } from 'ngx-markdown';
import { CodeDemoModule } from '@codelab/code-demos';
import { SnippetOverviewComponent } from './snippet-modal/snippet-overview.component';
import { SnippetSpinnerComponent } from './snippet-spinner/snippet-spinner.component';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { RouterModule } from '@angular/router';

const MAT_MODULES = [
  MatButtonModule,
  MatFormFieldModule,
  MatChipsModule,
  MatAutocompleteModule,
  MatSelectModule,
  MatInputModule,
  MatDialogModule,
  MatSnackBarModule
];

@NgModule({
  declarations: [
    CreateSnippetComponent,
    SnippetInfoComponent,
    SnippetOverviewComponent,
    SnippetSpinnerComponent
  ],
  entryComponents: [SnippetOverviewComponent],
  imports: [
    ...MAT_MODULES,
    CommonModule,
    ReactiveFormsModule,
    AngularFireAuthModule,
    MarkdownModule.forRoot(),
    CodeDemoModule,
    RouterModule
  ]
})
export class CreateSnippetModule {}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-info/snippet-info.component.html
================================================
<div class="snippets-info">
  This form will generate a snippet request for you.
</div>


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-info/snippet-info.component.scss
================================================
:host {
  .snippets-info {
    float: right;
    top: 40px;
    max-width: 50%;
    padding: 35px 35px 15px 35px;
    margin-left: 30px;
  }

  .nav {
    &-fixed-wrapper {
      position: fixed;
      right: 30px;
      bottom: 30px;
      z-index: 2000;
    }

    &-btn {
      border-radius: 50%;
      width: 45px;
      height: 45px;
      font-weight: bold;
      display: table;
      text-align: center;

      box-shadow: 0 3px 7px rgba(0, 0, 0, 0.9);

      &-go-up {
        background: #213451;
        color: white;
        cursor: pointer;
      }

      p {
        vertical-align: middle;
        display: table-cell;
      }
    }
  }

  .animated {
    animation-duration: 1s;
  }

  @keyframes fadeIn {
    from {
      opacity: 0;
    }

    to {
      opacity: 1;
    }
  }

  .fadeIn {
    animation-name: fadeIn;
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-info/snippet-info.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  selector: 'codelab-snippet-info',
  templateUrl: './snippet-info.component.html',
  styleUrls: ['./snippet-info.component.scss']
})
export class SnippetInfoComponent {}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-modal/snippet-overview.component.html
================================================
<h1 mat-dialog-title>
  Snippet Markdown
</h1>
<mat-dialog-content>
  <markdown [data]="snippetWithFormat"></markdown>
</mat-dialog-content>
<div class="snippet-modal-footer">
  <mat-dialog-actions>
    <button mat-button (click)="this.dialogRef.close()">
      Back to form
    </button>
    <button mat-button (click)="onSubmit()" cdkFocusInitial class="btn-submit">
      {{ isEditing ? 'Edit' : 'Create' }} Snippet
    </button>
  </mat-dialog-actions>
</div>

<ng-container *ngIf="isPRCreating">
  <codelab-snippet-spinner></codelab-snippet-spinner>
</ng-container>


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-modal/snippet-overview.component.scss
================================================
:host {
  h1 {
    color: #444;
  }

  .snippet-modal {
    &-footer {
      float: right;
    }
  }

  .btn-submit {
    float: right;
    font-weight: 400;
    text-align: center;
    vertical-align: middle;
    border: 1px solid #213451;
    font-size: 14px;
    color: #fff;
    background-color: #213451;
    cursor: pointer;
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-modal/snippet-overview.component.ts
================================================
import { Component, Inject, OnDestroy, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AngularFireAuth } from '@angular/fire/auth';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { MatSnackBar } from '@angular/material/snack-bar';
import { auth } from 'firebase/app';
import { finalize, switchMap, take, takeUntil } from 'rxjs/operators';
import { ReplaySubject } from 'rxjs/internal/ReplaySubject';
import { SnippetService } from '../../shared/services/snippet.service';
import { GitHubService } from '../../shared/services/github.service';
import { generateSnippet } from '../../shared/functions/generate-snippet';
import { SEPARATOR } from '../../shared/consts';

interface SnippetOverviewData {
  formValue: object;
  isEditing: boolean;
  fileInfo: {
    sha: string;
    fileName: string;
    branchName: string;
  };
  repoName: string;
  repoOwner: string;
}

function exportSnippet(snippet) {
  const result = { ...snippet };
  result.links = result.links ? result.links.split(SEPARATOR) : undefined;
  result.author = result.author || '** Your github username will be here **';
  result.bonus = result.bonus || undefined;
  return result;
}

@Component({
  selector: 'codelab-snippet-overview',
  templateUrl: './snippet-overview.component.html',
  styleUrls: ['./snippet-overview.component.scss']
})
export class SnippetOverviewComponent implements OnInit, OnDestroy {
  destroy = new ReplaySubject<void>(1);

  githubAuth;
  isPRCreating = false;

  isEditing: boolean;
  snippet: string;
  snippetWithFormat: string;

  constructor(
    public dialogRef: MatDialogRef<SnippetOverviewComponent>,
    private afAuth: AngularFireAuth,
    private snippetService: SnippetService,
    private githubService: GitHubService,
    private _snackBar: MatSnackBar,
    private router: Router,
    @Inject(MAT_DIALOG_DATA) public data: SnippetOverviewData
  ) {}

  ngOnInit() {
    this.isEditing = this.data.isEditing;
    this.snippet = generateSnippet(exportSnippet(this.data.formValue));
    // This is a temporary hack.
    // The version of markdown requires new lines between meta values, but github does not.
    this.snippetWithFormat = this.snippet.replace(
      /\n(title|author|twitter|level|tags|links):/g,
      '\n\n$1:'
    );
  }

  ngOnDestroy() {
    this.destroy.next(null);
    this.destroy.complete();
  }

  async onSubmit() {
    console.log('You can copy the snippet here:\n', this.snippet);
    this.isPRCreating = true;

    if (!(this.githubAuth && this.githubAuth.credential)) {
      await this.login();
    }

    if (this.isEditing) {
      this.snippetService
        .updatePR(
          this.githubAuth,
          this.snippet,
          this.data.fileInfo,
          this.data.repoName
        )
        .pipe(
          finalize(() => (this.isPRCreating = false)),
          takeUntil(this.destroy)
        )
        .subscribe(res =>
          this.navigateAndShowSnackBar(
            'Success',
            'Snippet updated',
            res['commit']['html_url']
          )
        );
    } else {
      this.snippetService
        .createPR(
          this.githubAuth,
          this.snippet,
          this.data.formValue['title'],
          this.data.repoName,
          this.data.repoOwner
        )
        .pipe(
          switchMap(res =>
            this.githubService.addLinkToEditForm(
              this.data.repoOwner,
              this.data.repoName,
              res['number']
            )
          ),
          switchMap(res =>
            this.githubService.addSnippetLabel(
              this.data.repoOwner,
              this.data.repoName,
              res['number']
            )
          ),
          finalize(() => (this.isPRCreating = false)),
          takeUntil(this.destroy)
        )
        .subscribe(res =>
          this.navigateAndShowSnackBar(
            'Pull request created',
            res['title'].replace('Add - new snippet: ', ''),
            res['html_url']
          )
        );
    }
  }

  navigateAndShowSnackBar(text: string, linkLabel: string, linkUrl: string) {
    this.dialogRef.close();
    this.router.navigate(['list']);
    const snakeBarRef = this._snackBar.open(text, linkLabel, {
      duration: 20000
    });
    snakeBarRef
      .onAction()
      .pipe(take(1))
      .subscribe(() => window.open(linkUrl));
  }

  async login() {
    const provider = new auth.GithubAuthProvider().addScope('repo');
    this.githubAuth = await this.afAuth.auth.signInWithPopup(provider);
    this.data.formValue['author'] = this.githubAuth.additionalUserInfo.username;
    this.snippet = generateSnippet(exportSnippet(this.data.formValue));
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-spinner/snippet-spinner.component.html
================================================
<div class="spinner-back-ground">
  <div class="centered-spinner">
    <div class="preload">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
  </div>
</div>


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-spinner/snippet-spinner.component.scss
================================================
.spinner-back-ground {
  position: fixed;
  width: 100%;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.2);
  z-index: 9999;
}

.centered-spinner {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100vw;
  height: 100vh;
}

.preload {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /*change these sizes to fit into your project*/
  width: 100px;
  height: 100px;
}

.preload div {
  border: 0;
  margin: 0;
  width: 40%;
  height: 40%;
  position: absolute;
  border-radius: 50%;
  animation: spin 2s ease infinite;
}

.preload :first-child {
  background: #19a68c;
  animation-delay: -1.5s;
}

.preload :nth-child(2) {
  background: #f63d3a;
  animation-delay: -1s;
}

.preload :nth-child(3) {
  background: #fda543;
  animation-delay: -0.5s;
}

.preload :last-child {
  background: #193b48;
}

@keyframes spin {
  0%,
  100% {
    transform: translate(0);
  }
  25% {
    transform: translate(160%);
  }
  50% {
    transform: translate(160%, 160%);
  }
  75% {
    transform: translate(0, 160%);
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-spinner/snippet-spinner.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  selector: 'codelab-snippet-spinner',
  templateUrl: './snippet-spinner.component.html',
  styleUrls: ['./snippet-spinner.component.scss']
})
export class SnippetSpinnerComponent {}


================================================
FILE: apps/angular-thirty-seconds/src/app/pull-requests-list/pull-requests-list.component.html
================================================
<div class="container">
  <div class="flex-header">
    <h1>Open pull requests</h1>
    <button
      mat-raised-button
      color="accent"
      class="align-center"
      [routerLink]="['/new', repoName, repoOwner]"
    >
      Create new snippet
    </button>
  </div>

  <table
    *ngIf="pullsList$ | async as pullsList; else loading"
    mat-table
    [dataSource]="pullsList"
  >
    <ng-container matColumnDef="number">
      <th mat-header-cell *matHeaderCellDef>#</th>
      <td mat-cell *matCellDef="let item" class="mat-cell-padding">
        {{ item.number }}
      </td>
    </ng-container>
    <ng-container matColumnDef="title">
      <th mat-header-cell *matHeaderCellDef>Title</th>
      <td mat-cell *matCellDef="let item" class="mat-cell-padding">
        <a
          href="https://github.com/{{ repoOwner }}/{{ repoName }}/pull/{{
            item.number
          }}"
          target="_blank"
          >{{ item.title }}</a
        >
      </td>
    </ng-container>
    <ng-container matColumnDef="login">
      <th mat-header-cell *matHeaderCellDef>Author</th>
      <td mat-cell *matCellDef="let item" class="mat-cell-padding">
        {{ item.user.login }}
      </td>
    </ng-container>
    <ng-container matColumnDef="created_at">
      <th mat-header-cell *matHeaderCellDef>Creation Date</th>
      <td mat-cell *matCellDef="let item" class="mat-cell-padding">
        {{ item.created_at | date: 'MM/dd/yyyy' }}
      </td>
    </ng-container>
    <ng-container matColumnDef="action">
      <th mat-header-cell *matHeaderCellDef>Action</th>
      <td mat-cell *matCellDef="let item" class="mat-cell-padding">
        <button
          mat-button
          color="warn"
          [routerLink]="['/new', repoName, repoOwner, item['number']]"
        >
          Edit
        </button>
      </td>
    </ng-container>
    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
  </table>
</div>

<ng-template #loading>
  loading ...
</ng-template>


================================================
FILE: apps/angular-thirty-seconds/src/app/pull-requests-list/pull-requests-list.component.scss
================================================
h1 {
  color: #444;
}

.container {
  max-width: 850px;
  padding: 0 15px 30px 15px;
  margin: 0 auto;
  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
}

table {
  width: 100%;
}

.mat-cell-padding {
  padding: 0 5px;
}

.flex-header {
  display: flex;
  justify-content: space-between;
}

.align-center {
  align-self: center;
}


================================================
FILE: apps/angular-thirty-seconds/src/app/pull-requests-list/pull-requests-list.component.ts
================================================
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { GitHubService } from '../shared/services/github.service';

const REPO_OWNER = 'nycJSorg';
const REPO_NAME = '30-seconds-of-angular';

@Component({
  selector: 'codelab-pull-requests-list',
  templateUrl: './pull-requests-list.component.html',
  styleUrls: ['./pull-requests-list.component.scss']
})
export class PullRequestsListComponent {
  repoOwner = REPO_OWNER;
  repoName = REPO_NAME;

  pullsList$ = this.githubService.getPullsList(this.repoOwner, this.repoName);

  displayedColumns = ['number', 'title', 'login', 'created_at', 'action'];

  constructor(private router: Router, private githubService: GitHubService) {}
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/angular-sample.ts
================================================
export const angularSampleCode = {
  'app.component.ts': `import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  template: \`<h1>Edit me </h1>\`
})
export class AppComponent {}`,
  'app.module.ts': `import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';

@NgModule({
  imports: [BrowserModule],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {}`,

  'main.ts': `import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);
`,
  'index.html': '<my-app></my-app>'
};


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/constants.ts
================================================
export const MARKDOWN_PLACEHOLDER = `
You can use markdown here.\n
Highlight \`important terms\` with backticks.\n
For examples use:
\`\`\`typescript
const language = 'English';
function theLanguageISpeak(language) {
  // English? No, only typescript!
  return 'typescript'
}
\`\`\``;

export const TAGS_LIST = [
  'components',
  'tip',
  'forms',
  'templates',
  'styling',
  'routing',
  'performance'
];

export const LINKS_PLACEHOLDER = `https://angular.io/
https://www.typescriptlang.org/`;


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/consts.ts
================================================
export const SEPARATOR = '\n';


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/functions/generate-snippet.spec.ts
================================================
import { testSnippetMd, testSnippetParsed } from './test-data/snippet';
import { generateSnippet } from './generate-snippet';

describe('GenerateSnippet', () => {
  it('generates a simple snippet', () => {
    const actual = generateSnippet(testSnippetParsed);
    expect(actual).toEqual(testSnippetMd);
  });

  it('generates a snippet without demo', () => {
    const testSnippet = { ...testSnippetParsed };
    delete testSnippet.demo;
    const actual = generateSnippet(testSnippet);
    expect(actual).not.toContain('file:');
  });

  it('generates a snippet without bonus', () => {
    const testSnippet = { ...testSnippetParsed };
    delete testSnippet.bonus;
    const actual = generateSnippet(testSnippet);
    expect(actual).not.toContain('bonus');
  });

  it('generates a snippet without links', () => {
    const testSnippet = { ...testSnippetParsed };
    delete testSnippet.links;
    const actual = generateSnippet(testSnippet);
    expect(actual).not.toContain('links');
  });
});


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/functions/generate-snippet.ts
================================================
import { Snippet } from '../interfaces/snippet';
import { angularSampleCode } from '../angular-sample';
import { SEPARATOR } from '../consts';

const config = {
  header: ['title', 'author', 'twitter', 'level', 'links', 'tags'],
  body: ['content', 'bonus']
};

function arrayToMarkdownList(tagsArray: Array<string>): string {
  return tagsArray
    .filter(a => a)
    .map(x => `- ${x}`)
    .join(`\n`);
}

function generateMdHeader(keys: string[], snippet: Snippet) {
  return keys
    .map(key => ({
      key,
      value: snippet[key]
    }))
    .filter(({ value }) => !!value)
    .map(({ value, key }) => {
      if (typeof value === 'string') {
        return `${key}: ${value}`;
      }
      if (Array.isArray(value)) {
        return `${key}:
${arrayToMarkdownList(value)}`;
      }
      throw new Error(key + 'is not a real key');
    })
    .join(SEPARATOR);
}

const ucFirst = s => {
  if (typeof s !== 'string') {
    return '';
  }
  return s.charAt(0).toUpperCase() + s.slice(1);
};

const extensionTolanguage = {
  ts: 'typescript',
  js: 'javascript'
};

function getFileLanguage(fileName) {
  const fileExtension =
    fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length) ||
    fileName;
  return extensionTolanguage[fileExtension] || fileExtension;
}

/**
 * Drop markdown "```language```" from the code
 */
function addMarkdownLanguageMark(code: string, filename: string) {
  return `\`\`\`${getFileLanguage(filename)}
${code}
\`\`\``;
}

function generateMdBody(keys: string[], snippet: Snippet) {
  return keys
    .map(key => ({
      key,
      value: snippet[key]
    }))
    .filter(({ value, key }) => !!value)
    .map(({ value, key }) => {
      return `# ${ucFirst(key)}
${value}
`;
    })
    .join(SEPARATOR);
}

function generateDemo(snippet) {
  if (!snippet.demo) {
    return '';
  }

  return (
    Object.entries(snippet.demo)
      .filter(([key, value]) => value && value !== angularSampleCode[key])
      .map(([key, value]) => {
        return `# file:${key}
${addMarkdownLanguageMark(value.toString(), key)}`;
      })
      .join(SEPARATOR) + SEPARATOR
  );
}

export function generateSnippet(snippet: Snippet) {
  const header = generateMdHeader(config.header, snippet);
  const body = generateMdBody(config.body, snippet);
  const demo = generateDemo(snippet);
  return `---
${header}
---
${body}
${demo}`;
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/functions/parse-snippet.spec.ts
================================================
import { parseSnippet } from './parse-snippet';
import {
  testSnippetEdgeCases,
  testSnippetMd,
  testSnippetMinimal,
  testSnippetParsed
} from './test-data/snippet';

describe('ParseSnippet', () => {
  it('parses a simple snippet', () => {
    const actual = parseSnippet(testSnippetMd);
    expect(actual).toEqual(testSnippetParsed);
  });

  it('testSnippetMinimal', () => {
    const actual = parseSnippet(testSnippetMinimal);
    expect(actual.bonus).toBe('');
    expect(actual.links).toEqual(undefined);
    expect(actual.demo).toEqual(undefined);
    expect(actual.content).toEqual('Content');
  });

  it('works when file names have spaces', () => {
    const actual = parseSnippet(testSnippetEdgeCases);

    expect(actual.demo).toEqual({
      'app.component.ts':
        "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'my-app',\n  template: `<h1>Edit me </h1>`\n})\nexport class AppComponent {}",
      'app.module.ts':
        "import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { AppComponent } from './app.component';\n" +
        '\n@NgModule({\n  imports: [BrowserModule],\n  declarations: [AppComponent],\n' +
        '  bootstrap: [AppComponent]\n})\nexport class AppModule {}',
      'main.ts':
        "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\nimport { AppModule } from './app.module';" +
        '\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n',
      'index.html': '<my-app></my-app>',
      'app.svg': '<circle r=100 fill=red></circle>'
    });
  });
});


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/functions/parse-snippet.ts
================================================
import { angularSampleCode } from '../angular-sample';

// @ts-ignore
// If you delete this you get a run time error.
// This is needed for gray-matter
window.Buffer = {
  from() {}
};

// @ts-ignore
const matter = require('gray-matter');

/**
 *
 * Takes markdown and returns content.
 * e.g. input:
 *
 * # LOL
 * 1
 * # HI
 * 2
 *
 * result:
 *
 * {LOL: "1", HI: "2"}
 */
function extractHeaders(str) {
  const match = ('\n' + str + '\n#').match(/\n#+.*\n[\s\S]*?(?=\n#)/g);
  return !match
    ? { content: str }
    : match.reduce((result, a) => {
        const [, header, content] = a.match(/^\n#+(.*)\n([\s\S]*)$/);
        result[header.trim().toLocaleLowerCase()] = content.trim();
        return result;
      }, {});
}

/**
 *
 * Takes markdown and returns content.
 * e.g. input:
 *
 * ---
 * title: Hello
 * tags:
 * - tips
 * - good-to-know
 * ---
 *
 * # LOL
 * 1
 * # HI
 * 2
 *
 * result:
 *
 * {title: "Hello", tags: ["tips", "good-to-know"], LOL: "1", HI: "2"}
 *
 */
function mdTextToJson(snippet: string) {
  const metaData = matter(snippet);
  return { ...extractHeaders(metaData.content), ...metaData.data };
}

/**
 * Drop markdown "```language```" from the code
 */
function stripMarkdownLanguageMark(code = '') {
  return code.replace(/```\w+\n/, '').replace(/\n```/, '');
}

function normalize(text) {
  return text ? text.replace(/↵/g, '\n') : '';
}

export function parseSnippet(snippetBody: string) {
  const snippet = mdTextToJson(snippetBody);
  snippet.content = normalize(snippet.content);
  snippet.bonus = normalize(snippet.bonus);

  const demoFiles = Object.entries(snippet)
    .filter(([key]) => key.startsWith('file:'))
    .reduce((files, [key, value]) => {
      files[key.replace(/^file:/, '').trim()] = stripMarkdownLanguageMark(
        value.toString()
      );
      return files;
    }, {});

  if (Object.keys(demoFiles).length) {
    snippet.demo = {
      ...angularSampleCode,
      ...demoFiles
    };
  }

  return snippet;
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/functions/test-data/snippet.ts
================================================
export const testSnippetMd = `---
title: title
author: author
twitter: kirjs
level: intermediate
links:
- gogel.com
- 123.com
tags:
- tip
---
# Content
Content

# Bonus
Wow bonus

# file:app.component.ts
\`\`\`typescript
import { Component } from '@angular/core';
 @Component({
  selector: 'my-app',
  templateUrl: './app.svg'
})
export class AppComponent {}
\`\`\`
# file:app.svg
\`\`\`svg
<circle r=100 fill=red></circle>
\`\`\`
`;

export const testSnippetParsed = {
  content: 'Content',
  bonus: 'Wow bonus',
  'file:app.component.ts':
    "```typescript\nimport { Component } from '@angular/core';\n @Component({\n  selector: 'my-app',\n  templateUrl: './app.svg'\n})\nexport class AppComponent {}\n```",
  'file:app.svg': '```svg\n<circle r=100 fill=red></circle>\n```',
  title: 'title',
  author: 'author',
  twitter: 'kirjs',
  level: 'intermediate',
  links: ['gogel.com', '123.com'],
  tags: ['tip'],
  demo: {
    'app.component.ts':
      "import { Component } from '@angular/core';\n @Component({\n  selector: 'my-app',\n  templateUrl: './app.svg'\n})\nexport class AppComponent {}",
    'app.module.ts':
      "import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { AppComponent } from './app.component';\n" +
      '\n@NgModule({\n  imports: [BrowserModule],\n  declarations: [AppComponent],\n  bootstrap: [AppComponent]\n})\nexport class AppModule {}',
    'main.ts':
      "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\nimport { AppModule } from './app.module';\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n",
    'index.html': '<my-app></my-app>',
    'app.svg': '<circle r=100 fill=red></circle>'
  }
};

export const testSnippetMinimal = `---
title: title
author: author
twitter: kirjs
level: intermediate
tags:
- tip
---
# Content
Content`;

export const testSnippetEdgeCases = `---
title: title
author: author
twitter: kirjs
level: intermediate
tags:
- tip
---
# Content
Content

# file: app.svg
\`\`\`svg
<circle r=100 fill=red></circle>
\`\`\`
`;


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/functions/validation/index.ts
================================================
export * from './validation';


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/functions/validation/validation.ts
================================================
import { FormArray, FormControl, FormGroup } from '@angular/forms';
import { AbstractControl } from '@angular/forms';

export function markFormControlsAsTouched(
  formGroup: FormGroup | FormArray
): void {
  Object.values(formGroup.controls).forEach(control => {
    if (control instanceof FormControl) {
      control.markAsTouched({ onlySelf: true });
    } else if (control instanceof FormGroup || control instanceof FormArray) {
      markFormControlsAsTouched(control);
    }
  });
}

export function validatorMaxTags(maximumTags: number) {
  return (control: AbstractControl) => {
    return Array.isArray(control.value) && control.value.length > maximumTags
      ? { tagsError: `Number of tags should be below ${maximumTags + 1}` }
      : null;
  };
}

export function validatorMaxLines(lines: number) {
  return (control: AbstractControl) => {
    return control.value.split('\n').length > lines
      ? { linesError: `This field shouldn't have more than ${lines} lines` }
      : null;
  };
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/index.ts
================================================
export * from './angular-sample';
export * from './constants';


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/branch.interface.ts
================================================
export interface Branch {
  ref: string;
  node_id: string;
  url: string;
  object: {
    type: string;
    sha: string;
    url: string;
  };
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/commit-info.interface.ts
================================================
export interface CommitInfo {
  message: string;
  content: string;
  branchName: string;
  filePath: string;
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/github-auth.interface.ts
================================================
import { User } from './user.interface';

export interface GithubAuth {
  additionalUserInfo: {
    profile: User;
  };
  credential: {
    accessToken: string;
  };
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/index.ts
================================================
export * from './branch.interface';
export * from './github-auth.interface';
export * from './repo.interface';
export * from './user.interface';
export * from './pull-request.intreface';
export * from './commit-info.interface';


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/pull-request.intreface.ts
================================================
export interface CreatePullRequest {
  title: string;
  body: string;
  branchName: string;
  labels?: Array<string>;
}

export interface PullRequest {
  title: string;
  html_url: string;
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/repo.interface.ts
================================================
export interface Repo {
  name: string;
  full_name: string;
  sha: string;
  url: string;
  git_refs_url: string;
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/snippet.ts
================================================
export type Snippet = Record<string, any>;


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/user.interface.ts
================================================
export interface User {
  login: string;
  repos_url: string;
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/services/github.service.ts
================================================
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { MatSnackBar } from '@angular/material/snack-bar';
import { Observable } from 'rxjs/internal/Observable';
import { catchError, map } from 'rxjs/operators';
import { throwError } from 'rxjs/internal/observable/throwError';
import { MonoTypeOperatorFunction } from 'rxjs/internal/types';
import {
  Branch,
  CommitInfo,
  CreatePullRequest,
  Repo,
  User
} from '../interfaces';

// TODO work on github api names
// Here is an example link: https://github.com/github-tools/github

@Injectable({
  providedIn: 'root'
})
export class GitHubService {
  private apiGithubUrl = 'https://api.github.com';
  private options: object;

  constructor(private http: HttpClient, private _snackBar: MatSnackBar) {}

  showSnackbarOnError<T>(message: string): MonoTypeOperatorFunction<T> {
    return catchError(() => {
      this._snackBar.open(message, '', { duration: 10000 });
      return throwError(new Error(message));
    });
  }

  setToken(token: string) {
    this.options = { headers: { Authorization: `token ${token}` } };
  }

  getRepo(owner: string, repoName: string): Observable<Repo> {
    requires(owner, 'Owner is required');
    requires(repoName, 'Repo name is required');

    const requestUrl = `${this.apiGithubUrl}/repos/${owner}/${repoName}`;
    return this.http
      .get<Repo>(requestUrl, this.options)
      .pipe(this.showSnackbarOnError("Can't get repo"));
  }

  getMyRepos(user: User): Observable<Repo[]> {
    requires(user, 'User is required');

    return this.http
      .get<Repo[]>(user.repos_url, this.options)
      .pipe(this.showSnackbarOnError("Can't fetch user repos"));
  }

  forkRepo(repo: Repo): Observable<Repo> {
    requires(repo, 'Repository is required');

    const requestUrl = `${this.apiGithubUrl}/repos/${repo.full_name}/forks`;
    return this.http
      .post<Repo>(requestUrl, {}, this.options)
      .pipe(this.showSnackbarOnError("Can't fork 30 secs repo"));
  }

  getMasterBranch(repo: Repo): Observable<Branch> {
    requires(repo, 'Repository is required');

    const requestUrl = `${this.apiGithubUrl}/repos/${repo.full_name}/git/refs/heads/master`;
    return this.http
      .get<Branch>(requestUrl, this.options)
      .pipe(
        this.showSnackbarOnError(
          `Can't fetch master branch of ${repo.full_name}`
        )
      );
  }

  createBranch(
    repo: Repo,
    baseBranch: Branch,
    branchName: string
  ): Observable<Branch> {
    requires(repo, 'Repository is required');
    requires(baseBranch, 'Base branch is required');
    requires(branchName, 'Branch name is required');

    const requestUrl = `${this.apiGithubUrl}/repos/${repo.full_name}/git/refs`;
    const branchRef = `refs/heads/${branchName}`;
    const requestData = {
      ref: branchRef,
      sha: baseBranch.object.sha
    };

    return this.http
      .post<Branch>(requestUrl, requestData, this.options)
      .pipe(
        this.showSnackbarOnError(
          `Can't create branch ${branchName} of base branch ${baseBranch.object.url}`
        )
      );
  }

  createCommit(repo: Repo, commitInfo: CommitInfo): Observable<any> {
    requires(repo, 'Repository is required');
    requires(commitInfo, 'Commit is required');

    const requestUrl = `${this.apiGithubUrl}/repos/${repo.full_name}/${commitInfo.filePath}`;
    const requestData = {
      message: commitInfo.message,
      branch: commitInfo.branchName,
      content: commitInfo.content
    };

    return this.http
      .put(requestUrl, requestData, this.options)
      .pipe(this.showSnackbarOnError("Can't create commit"));
  }

  createPullRequest(
    repo: Repo,
    user: User,
    pullRequest: CreatePullRequest
  ): Observable<any> {
    requires(repo, 'Repository is required');
    requires(user, 'User is required');
    requires(pullRequest, 'Pull request is required');

    const requestUrl = `${this.apiGithubUrl}/repos/${repo.full_name}/pulls`;
    const requestData = {
      title: pullRequest.title,
      head: `${user.login}:${pullRequest.branchName}`,
      base: 'master',
      body: pullRequest.body,
      labels: pullRequest.labels
    };

    return this.http
      .post(requestUrl, requestData, this.options)
      .pipe(this.showSnackbarOnError("Can't create pull request"));
  }

  getPullsList(owner: string, repoName: string): Observable<any> {
    return this.http
      .get<any>(
        `${this.apiGithubUrl}/repos/${owner}/${repoName}/pulls`,
        this.options
      )
      .pipe(
        map(res =>
          res.filter(
            x =>
              x['labels'].length &&
              x['labels'].map(y => y['name']).indexOf('snippet') > -1
          )
        ),
        this.showSnackbarOnError("Can't fetch user repos")
      );
  }

  getPullByPullNumber(
    owner: string,
    repoName: string,
    pullNumber: number
  ): Observable<any> {
    return this.http
      .get<any>(
        `${this.apiGithubUrl}/repos/${owner}/${repoName}/pulls/${pullNumber}`,
        this.options
      )
      .pipe(this.showSnackbarOnError("Can't get pull request"));
  }

  addLinkToEditForm(
    owner: string,
    repoName: string,
    pullNumber: number
  ): Observable<any> {
    return this.http
      .patch<any>(
        `${this.apiGithubUrl}/repos/${owner}/${repoName}/pulls/${pullNumber}`,
        {
          body: `Here you can edit snippet content: https://30.codelab.fun/new/${pullNumber}`
        },
        this.options
      )
      .pipe(this.showSnackbarOnError("Can't update pull request"));
  }

  addSnippetLabel(owner: string, repoName: string, issueNumber: number) {
    return this.http
      .patch<any>(
        `${this.apiGithubUrl}/repos/${owner}/${repoName}/issues/${issueNumber}`,
        { labels: ['snippet'] },
        this.options
      )
      .pipe(this.showSnackbarOnError("Can't get issues list"));
  }

  getPullFileByPullNumber(
    owner: string,
    repoName: string,
    pullNumber: number
  ): Observable<any> {
    return this.http
      .get<any>(
        `${this.apiGithubUrl}/repos/${owner}/${repoName}/pulls/${pullNumber}/files`,
        this.options
      )
      .pipe(this.showSnackbarOnError("Can't get pull request file"));
  }

  getSnippetBody(url) {
    return this.http
      .get<any>(url, this.options)
      .pipe(this.showSnackbarOnError("Can't get snippet body"));
  }

  updateFile(repoFullName, snippetData, fileInfo): Observable<any> {
    const requestUrl = `${this.apiGithubUrl}/repos/${repoFullName}/contents/${fileInfo['fileName']}`;
    const requestPayload = {
      message: `Snippet Update`,
      content: btoa(snippetData),
      sha: fileInfo['sha'],
      branch: fileInfo['branchName']
    };
    return this.http
      .put<any>(requestUrl, requestPayload, this.options)
      .pipe(this.showSnackbarOnError('Cannot update file'));
  }
}

function requires(expression: any, message: string) {
  if (!expression) {
    throw new Error(message);
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/services/snippet.service.spec.ts
================================================
import { TestBed } from '@angular/core/testing';
import { SnippetService } from './snippet.service';
import { GitHubService } from './github.service';
import { of } from 'rxjs';
import SpyObj = jasmine.SpyObj;

describe('SnippetService', () => {
  let gitHubService: SpyObj<GitHubService>;
  const repoName = '30seconds';
  const repoOwner = 'PIKACHU';
  const pullNumber = 689;

  beforeEach(() => {
    gitHubService = jasmine.createSpyObj('gitHubService', [
      'getPullByPullNumber',
      'getPullFileByPullNumber',
      'getSnippetBody'
    ]);

    TestBed.configureTestingModule({
      providers: [
        {
          provide: GitHubService,
          useValue: gitHubService
        }
      ]
    });
  });

  it('should be created', () => {
    const snippet = 'pirojok';
    const fileName = 'john';
    const contents_url = 'LOL';
    const branchName = 'branch';

    const service: SnippetService = TestBed.inject(SnippetService);

    gitHubService.getPullByPullNumber.and.returnValue(
      of({
        head: { ref: branchName }
      })
    );
    const sha = 'sa sha';

    gitHubService.getPullFileByPullNumber.and.returnValue(
      of([
        {
          contents_url,
          sha,
          filename: fileName
        }
      ])
    );

    gitHubService.getSnippetBody.and.returnValue(
      of({
        content: btoa(snippet)
      })
    );

    service.fetchPR(repoName, repoOwner, pullNumber).subscribe(result => {
      expect(result).toEqual({
        branchName,
        fileName,
        sha,
        snippet
      });
    });
  });
});


================================================
FILE: apps/angular-thirty-seconds/src/app/shared/services/snippet.service.ts
================================================
import { Injectable } from '@angular/core';
import { combineLatest, Observable, of } from 'rxjs';
import { debounceTime, map, switchMap } from 'rxjs/operators';
import slugify from 'slugify';
import { GitHubService } from './github.service';
import {
  Branch,
  CommitInfo,
  CreatePullRequest,
  GithubAuth,
  PullRequest,
  Repo,
  User
} from '../interfaces';

@Injectable({
  providedIn: 'root'
})
export class SnippetService {
  constructor(private githubService: GitHubService) {}

  fetchPR(repoName: string, repoOwner: string, pullNumber: number) {
    // todo move it to service later
    const pr$ = this.githubService.getPullByPullNumber(
      repoOwner,
      repoName,
      pullNumber
    );
    const file$ = this.githubService
      .getPullFileByPullNumber(repoOwner, repoName, pullNumber)
      .pipe(
        switchMap(([file]) => {
          return this.githubService.getSnippetBody(file['contents_url']).pipe(
            map(res => {
              const body = atob(res.content);
              return {
                ...res[0],
                body,
                sha: file['sha'],
                fileName: file['filename']
              };
            })
          );
        })
      );

    return combineLatest([file$, pr$]).pipe(
      map(([file, pr]) => {
        return {
          sha: file['sha'],
          fileName: file['fileName'],
          snippet: file['body'] as string,
          branchName: pr['head']['ref']
        };
      })
    );
  }

  updatePR(
    githubAuth: GithubAuth,
    snippetData: string,
    fileInfo: object,
    repoName: string
  ): Observable<any> {
    this.githubService.setToken(githubAuth.credential.accessToken);
    const user: User = githubAuth.additionalUserInfo.profile;

    return this.githubService.getMyRepos(user).pipe(
      switchMap((repos: Repo[]) => {
        const repo = repos.find(r => r.name === repoName);
        return this.githubService.updateFile(
          repo.full_name,
          snippetData,
          fileInfo
        );
      })
    );
  }

  createPR(
    githubAuth: GithubAuth,
    snippetData: string,
    title: string,
    repoName: string,
    repoOwner: string
  ): Observable<PullRequest> {
    requires(githubAuth, 'Github auth is required');
    requires(snippetData, 'Snippet is required');
    requires(title, 'Snippet title is required');

    this.githubService.setToken(githubAuth.credential.accessToken);

    const branchName = `new_snippet_${this.toLowerCaseAndSlugify(title)}`;
    const filePath = `contents/snippets/${this.toLowerCaseAndSlugify(
      title
    )}.md`;

    const user: User = githubAuth.additionalUserInfo.profile;
    return this.githubService.getRepo(repoOwner, repoName).pipe(
      switchMap((baseRepo: Repo) => {
        return this.githubService.getMyRepos(user).pipe(
          switchMap((repos: Repo[]) => {
            const repo = repos.find(r => r.name === repoName);
            return repo
              ? of(repo)
              : this.githubService.forkRepo(baseRepo).pipe(debounceTime(5000));
          }),
          switchMap((userRepo: Repo) => {
            return this.githubService.getMasterBranch(userRepo).pipe(
              switchMap((masterBranch: Branch) => {
                return this.githubService.createBranch(
                  userRepo,
                  masterBranch,
                  branchName
                );
              }),
              switchMap(() => {
                const commit: CommitInfo = {
                  message:
                    'I have added awesome snippet. Look at my awesome snippet!',
                  content: btoa(snippetData),
                  branchName: branchName,
                  filePath: filePath
                };
                return this.githubService.createCommit(userRepo, commit);
              }),
              switchMap(() => {
                const pullRequest: CreatePullRequest = {
                  title: `Add - new snippet: ${title}`,
                  body: 'Here is a new snippet. Hope you like it :)',
                  labels: ['snippet'],
                  branchName: branchName
                };
                return this.githubService.createPullRequest(
                  baseRepo,
                  user,
                  pullRequest
                );
              })
            );
          })
        );
      })
    );
  }

  private toLowerCaseAndSlugify(str: string) {
    return slugify(str.toLowerCase());
  }
}

function requires(expression: any, message: string) {
  if (!expression) {
    throw new Error(message);
  }
}


================================================
FILE: apps/angular-thirty-seconds/src/assets/.gitkeep
================================================


================================================
FILE: apps/angular-thirty-seconds/src/environments/environment.prod.ts
================================================
export const environment = {
  production: true
};


================================================
FILE: apps/angular-thirty-seconds/src/environments/environment.ts
================================================
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`.

export const environment = {
  production: false
};

/*
 * For easier debugging in development mode, you can import the following file
 * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
 *
 * This import should be commented out in production mode because it will have a negative impact
 * on performance if an error is thrown.
 */
// import 'zone.js/dist/zone-error';  // Included with Angular CLI.


================================================
FILE: apps/angular-thirty-seconds/src/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>AngularThirtySeconds</title>
    <base href="/" />

    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="icon"
      type="image/x-icon"
      href="apps/angular-thirty-seconds/src/favicon.ico"
    />
  </head>
  <body>
    <codelab-root></codelab-root>
  </body>
</html>


================================================
FILE: apps/angular-thirty-seconds/src/main.ts
================================================
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic()
  .bootstrapModule(AppModule)
  .catch(err => console.error(err));


================================================
FILE: apps/angular-thirty-seconds/src/polyfills.ts
================================================
/**
 * This file includes polyfills needed by Angular and is loaded before the app.
 * You can add your own extra polyfills to this file.
 *
 * This file is divided into 2 sections:
 *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
 *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
 *      file.
 *
 * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
 * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
 * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
 *
 * Learn more in https://angular.io/guide/browser-support
 */

/***************************************************************************************************
 * BROWSER POLYFILLS
 */

/** IE10 and IE11 requires the following for NgClass support on SVG elements */
// import 'classlist.js';  // Run `npm install --save classlist.js`.

/**
 * Web Animations `@angular/platform-browser/animations`
 * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
 * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
 */
// import 'web-animations-js';  // Run `npm install --save web-animations-js`.

/**
 * By default, zone.js will patch all possible macroTask and DomEvents
 * user can disable parts of macroTask/DomEvents patch by setting following flags
 * because those flags need to be set before `zone.js` being loaded, and webpack
 * will put import in the top of bundle, so user need to create a separate file
 * in this directory (for example: zone-flags.ts), and put the following flags
 * into that file, and then add the following code before importing zone.js.
 * import './zone-flags.ts';
 *
 * The flags allowed in zone-flags.ts are listed here.
 *
 * The following flags will work for all browsers.
 *
 * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
 * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
 * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
 *
 *  in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
 *  with the following flag, it will bypass `zone.js` patch for IE/Edge
 *
 *  (window as any).__Zone_enable_cross_context_check = true;
 *
 */

/***************************************************************************************************
 * Zone JS is required by default for Angular itself.
 */
import 'zone.js/dist/zone'; // Included with Angular CLI.

/***************************************************************************************************
 * APPLICATION IMPORTS
 */


================================================
FILE: apps/angular-thirty-seconds/src/styles.scss
================================================
@import '~@angular/material/prebuilt-themes/indigo-pink.css';

html,
body {
  margin: 0;
  padding: 0;
}


================================================
FILE: apps/angular-thirty-seconds/src/test.ts
================================================
// This file is required by karma.conf.js and loads recursively all the .spec and framework files

import 'zone.js/dist/zone-testing';
import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

declare const require: any;

// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);


================================================
FILE: apps/angular-thirty-seconds/tsconfig.app.json
================================================
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "../../../dist/out-tsc",
    "types": []
  },
  "exclude": ["test.ts", "**/*.spec.ts"],
  "include": ["**/*.ts"]
}


================================================
FILE: apps/angular-thirty-seconds/tsconfig.json
================================================
{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "types": ["jasmine"]
  }
}


================================================
FILE: apps/angular-thirty-seconds/tsconfig.spec.json
================================================
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "../../../dist/out-tsc",
    "types": ["jasmine", "node"]
  },
  "files": ["src/test.ts", "src/polyfills.ts"],
  "include": ["**/*.spec.ts", "**/*.d.ts"]
}


================================================
FILE: apps/angular-thirty-seconds/tslint.json
================================================
{
  "extends": "../../tslint.json",
  "rules": {
    "directive-selector": [true, "attribute", "codelab", "camelCase"],
    "component-selector": [true, "element", "codelab", "kebab-case"]
  }
}


================================================
FILE: apps/blog/browserslist
================================================
# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
#
# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed

> 0.5%
last 2 versions
Firefox ESR
not dead
not IE 9-11

================================================
FILE: apps/blog/jest.config.js
================================================
module.exports = {
  name: 'blog',
  preset: '../../jest.config.js',
  coverageDirectory: '../../coverage/apps/blog/'
};


================================================
FILE: apps/blog/src/app/app.component.html
================================================
<div routerLink="/">
  <h2><span>Angular Codelab Newsletter</span></h2>
  <img src="/assets/images/logo.png" />
</div>

<router-outlet></router-outlet>


================================================
FILE: apps/blog/src/app/app.component.scss
================================================
h2 {
  color: white;
  text-align: center;
  height: 70px;
  background-image: linear-gradient(to right, red, white);
  width: 90%;
}
div {
  width: 100%;
  display: flex;
}

span {
  margin: auto;
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
  margin-top: 20px;
}

img {
  height: 100px;
  margin-left: auto;
}


================================================
FILE: apps/blog/src/app/app.component.spec.ts
================================================
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { RouterTestingModule } from '@angular/router/testing';

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [RouterTestingModule],
      declarations: [AppComponent]
    }).compileComponents();
  }));

  it('should create the app', () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
    expect(app).toBeTruthy();
  });

  it(`should have as title 'blog'`, () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
    expect(app.title).toEqual('blog');
  });

  it('should render title in a h1 tag', () => {
    const fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('h1').textContent).toContain(
      'Welcome to blog!'
    );
  });
});


================================================
FILE: apps/blog/src/app/app.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  selector: 'codelab-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'blog';
}


================================================
FILE: apps/blog/src/app/app.module.ts
================================================
import { HttpClientModule } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { AngularFireDatabaseModule } from '@angular/fire/database';
import { ReactiveFormsModule } from '@angular/forms';
import { MatCardModule } from '@angular/material/card';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
import { BrowserModule } from '@angular/platform-browser';
import { RouterModule, Routes } from '@angular/router';
import { MarkdownModule } from 'ngx-markdown';

import { environment } from '../../../../apps/codelab/src/environments/environment';
import { AppComponent } from './app.component';
import { FeedComponent } from './feed/feed.component';
import { FormComponent } from './form/form.component';
import { PostService } from './post.service';
import { PostComponent } from './post/post.component';
import { SinglePostComponent } from './single-post/single-post.component';

export const angularFire = AngularFireModule.initializeApp(
  environment.firebaseConfig
);

const appRoutes: Routes = [
  { path: 'post/:id', component: PostComponent },
  { path: '', component: FeedComponent },
  { path: 'form', component: FormComponent }
];

@NgModule({
  declarations: [
    AppComponent,
    FormComponent,
    FeedComponent,
    PostComponent,
    SinglePostComponent
  ],
  imports: [
    BrowserModule,
    MarkdownModule.forRoot(),
    MatFormFieldModule,
    MatSelectModule,
    ReactiveFormsModule,
    HttpClientModule,
    AngularFireDatabaseModule,
    angularFire,
    MatCardModule,
    AngularFireAuthModule,
    MatSnackBarModule,

    RouterModule.forRoot(appRoutes, { initialNavigation: 'enabled' })
  ],
  providers: [PostService],
  bootstrap: [AppComponent],
  exports: [FormComponent]
})
export class AppModule {}


================================================
FILE: apps/blog/src/app/common.ts
================================================
export interface Post {
  key?: string;
  title: string;
  author: string;
  text: string;
  date: string;
  hidden: boolean;
}


================================================
FILE: apps/blog/src/app/feed/feed.component.html
================================================
<a routerLink="/form">Tell us what you have done!</a>

<div *ngFor="let post of posts$ | async">
  <codelab-single-post [post]="post" [full]="false"></codelab-single-post>
  <div></div>
</div>


================================================
FILE: apps/blog/src/app/feed/feed.component.scss
================================================


================================================
FILE: apps/blog/src/app/feed/feed.component.spec.ts
================================================
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { FeedComponent } from './feed.component';

describe('FeedComponent', () => {
  let component: FeedComponent;
  let fixture: ComponentFixture<FeedComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [FeedComponent]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(FeedComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: apps/blog/src/app/feed/feed.component.ts
================================================
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { PostService } from '../post.service';
import { Observable } from 'rxjs';
import { Post } from '../common';
import { map } from 'rxjs/operators';

@Component({
  selector: 'codelab-feed',
  templateUrl: './feed.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush,
  styleUrls: ['./feed.component.scss']
})
export class FeedComponent {
  posts$: Observable<Post[]>;

  constructor(private postService: PostService) {
    this.posts$ = this.postService.repo$.snapshotChanges().pipe(
      map(items => {
        return items
          .map(a => {
            return {
              ...a.payload.val(),
              key: a.payload.key
            };
          })
          .reverse();
      })
    );
  }
}


================================================
FILE: apps/blog/src/app/form/form.component.html
================================================
<h3>Tell us what's new</h3>
<form class="container" [formGroup]="myform" (ngSubmit)="onSubmit()">
  <input
    type="text"
    placeholder="Title"
    class="form-control"
    [formControl]="title"
    required
  />

  <input
    type="text"
    placeholder="Name"
    class="form-control"
    [formControl]="author"
    required
  />

  <textarea
    rows="5"
    class="form-control"
    [formControl]="text"
    placeholder="Text"
    required
    (keydown.control.enter)="onSubmit()"
  >
  </textarea>

  <button
    type="submit"
    class="btn btn-primary form-control"
    [attr.disabled]="myform.valid ? null : true"
  >
    Submit
  </button>
</form>

<a routerLink="">Back</a>


================================================
FILE: apps/blog/src/app/form/form.component.scss
================================================
.container {
  display: flex;
  flex-direction: column;
  width: 40%;
}

input,
textarea {
  width: 600px;
}

.form-control {
  margin: 2px;
}

textarea {
  overflow: auto;
  resize: vertical;
}


================================================
FILE: apps/blog/src/app/form/form.component.spec.ts
================================================
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { FormComponent } from './form.component';

describe('FormComponent', () => {
  let component: FormComponent;
  let fixture: ComponentFixture<FormComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [FormComponent]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(FormComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: apps/blog/src/app/form/form.component.ts
================================================
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { PostService } from '../post.service';
import { Router } from '@angular/router';
import { Post } from '../common';

@Component({
  selector: 'codelab-form',
  templateUrl: './form.component.html',
  styleUrls: ['./form.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class FormComponent {
  title = new FormControl('', Validators.required);
  author = new FormControl('', Validators.required);
  text = new FormControl('', Validators.required);
  date: Date;
  post: Observable<Post>;
  myform = new FormGroup({
    title: this.title,
    author: this.author,
    text: this.text
  });
  statusMessage = '';
  error = false;

  constructor(
    private http: HttpClient,
    private postService: PostService,
    private router: Router
  ) {}

  onSubmit() {
    const formValues: any = this.myform.getRawValue();
    this.postService
      .addPost(formValues)
      .then(({ key }) => {
        this.myform.reset();
        this.router.navigateByUrl(`post/${key}`);
      })
      .catch(() => {
        this.statusMessage = 'Error';
        this.error = true;
      });
  }
}


================================================
FILE: apps/blog/src/app/post/post.component.html
================================================
<ng-container *ngIf="post$ | async as post">
  <codelab-single-post
    [post]="post"
    [full]="true"
    [key]="key"
  ></codelab-single-post>
  <button routerLink="/">Back</button>
</ng-container>


================================================
FILE: apps/blog/src/app/post/post.component.scss
================================================
.text {
  overflow: hidden;
  max-height: 100px;
}


================================================
FILE: apps/blog/src/app/post/post.component.spec.ts
================================================
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { PostComponent } from './post.component';

describe('PostComponent', () => {
  let component: PostComponent;
  let fixture: ComponentFixture<PostComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [PostComponent]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(PostComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: apps/blog/src/app/post/post.component.ts
================================================
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Post } from '../common';
import { PostService } from '../post.service';
import { ActivatedRoute } from '@angular/router';
import { MarkdownModule } from 'ngx-markdown';

@Component({
  selector: 'codelab-post',
  templateUrl: './post.component.html',
  styleUrls: ['./post.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class PostComponent implements OnInit {
  post$: Observable<Post>;
  key: string;

  constructor(
    private postService: PostService,
    private route: ActivatedRoute
  ) {}

  ngOnInit() {
    this.key = this.route.snapshot.params['id'];
    this.post$ = this.postService.getPost(this.key);
  }
}


================================================
FILE: apps/blog/src/app/post.service.ts
================================================
import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireList } from '@angular/fire/database';
import { Observable } from 'rxjs';
import { Post } from './common';
import { database } from 'firebase/app';

@Injectable({
  providedIn: 'root'
})
export class PostService {
  repo$: AngularFireList<Post> = this.database.list('/posts', ref => {
    return ref.orderByChild('hidden').equalTo(null);
  });

  constructor(private database: AngularFireDatabase) {}

  getPostById(id: string) {
    return this.database.object(`posts/${id}`);
  }

  removePost(id: string) {
    return this.getPostById(id).remove();
  }

  updatePost(id: string, post: Partial<Post>) {
    return this.getPostById(id).update(post);
  }

  addPost(post: Post): any {
    return this.repo$.push({
      ...post,
      date: database.ServerValue.TIMESTAMP as string
    });
  }

  getPost(id: string): Observable<any> {
    return this.getPostById(id).valueChanges();
  }
}


================================================
FILE: apps/blog/src/app/single-post/single-post.component.html
================================================
<mat-card>
  <mat-card-content>
    <p class="head">
      <span class="title">{{ post.title }}</span>
      <span class="date"
        >by <span>{{ post.author }}</span> on
        {{ post.date | date: 'short' }}</span
      >
    </p>

    <div class="container">
      <markdown ngPreserveWhitespaces>
        <div [class.text]="!full" [innerHTML]="post.text"></div>
      </markdown>

      <span *ngIf="!full"><a routerLink="/post/{{ post.key }}">More</a> </span>
      <span *ngIf="full">
        <button (click)="edit()">Edit</button>
        <button (click)="delete()">Delete</button>
      </span>
    </div>
  </mat-card-content>
</mat-card>


================================================
FILE: apps/blog/src/app/single-post/single-post.component.scss
================================================
.date {
  float: right;
  margin-right: 5px;
}

.title {
  margin-top: 0px;
  margin-top: 0px;
  padding-left: 5px;
}

mat-card {
  margin-bottom: 10px;
  padding-bottom: 10px;
}
.text {
  overflow: hidden;
  max-height: 100px;
}

.gradient {
  position: absolute;
  height: 130px;
  bottom: 0;
  width: 100%;
}

.container {
  position: relative;
}


================================================
FILE: apps/blog/src/app/single-post/single-post.component.ts
================================================
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { AccessService } from '../../../../codelab/src/app/shared/services/access.service';
import { Post } from '../common';
import { PostService } from '../post.service';
import { Router } from '@angular/router';
import { MatSnackBar } from '@angular/material/snack-bar';

@Component({
  selector: 'codelab-single-post',
  templateUrl: './single-post.component.html',
  styleUrls: ['./single-post.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class SinglePostComponent {
  @Input() post: Post;
  @Input() full: boolean;
  @Input() key = '';

  constructor(
    private postService: PostService,
    private accessService: AccessService,
    private router: Router,
    private snackBar: MatSnackBar
  ) {}

  delete() {
    this.accessService.oldIsAdmin$.subscribe();
    this.post.hidden = true;
    this.postService
      .updatePost(this.key, this.post)
      .then(() => {
        this.router.navigateByUrl(``);
      })
      .catch(err => {
        this.snackBar.open(`ERR: ${err}`);
      });
  }
}


================================================
FILE: apps/blog/src/assets/.gitkeep
================================================


================================================
FILE: apps/blog/src/assets/fonts/droid-sans/Apache License.txt
================================================
Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: apps/blog/src/environments/environment.prod.ts
================================================
export const environment = {
  production: true
};


================================================
FILE: apps/blog/src/environments/environment.ts
================================================
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`.

export const environment = {
  production: false
};

/*
 * For easier debugging in development mode, you can import the following file
 * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
 *
 * This import should be commented out in production mode because it will have a negative impact
 * on performance if an error is thrown.
 */
// import 'zone.js/dist/zone-error';  // Included with Angular CLI.


================================================
FILE: apps/blog/src/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Blog</title>
    <base href="/" />

    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="icon" type="image/x-icon" href="favicon.ico" />
  </head>
  <body>
    <codelab-root></codelab-root>
  </body>
</html>


================================================
FILE: apps/blog/src/main.ts
================================================
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic()
  .bootstrapModule(AppModule)
  .catch(err => console.error(err));


================================================
FILE: apps/blog/src/polyfills.ts
================================================
/**
 * This file includes polyfills needed by Angular and is loaded before the app.
 * You can add your own extra polyfills to this file.
 *
 * This file is divided into 2 sections:
 *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
 *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
 *      file.
 *
 * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
 * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
 * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
 *
 * Learn more in https://angular.io/guide/browser-support
 */

/***************************************************************************************************
 * BROWSER POLYFILLS
 */

/** IE10 and IE11 requires the following for NgClass support on SVG elements */
// import 'classlist.js';  // Run `npm install --save classlist.js`.

/**
 * Web Animations `@angular/platform-browser/animations`
 * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
 * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
 */
// import 'web-animations-js';  // Run `npm install --save web-animations-js`.

/**
 * By default, zone.js will patch all possible macroTask and DomEvents
 * user can disable parts of macroTask/DomEvents patch by setting following flags
 * because those flags need to be set before `zone.js` being loaded, and webpack
 * will put import in the top of bundle, so user need to create a separate file
 * in this directory (for example: zone-flags.ts), and put the following flags
 * into that file, and then add the following code before importing zone.js.
 * import './zone-flags.ts';
 *
 * The flags allowed in zone-flags.ts are listed here.
 *
 * The following flags will work for all browsers.
 *
 * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
 * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
 * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
 *
 *  in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
 *  with the following flag, it will bypass `zone.js` patch for IE/Edge
 *
 *  (window as any).__Zone_enable_cross_context_check = true;
 *
 */

/***************************************************************************************************
 * Zone JS is required by default for Angular itself.
 */
import 'zone.js/dist/zone'; // Included with Angular CLI.

/***************************************************************************************************
 * APPLICATION IMPORTS
 */


================================================
FILE: apps/blog/src/styles.scss
================================================
/* You can add global styles to this file, and also import other style files */
@import '~@angular/material/prebuilt-themes/indigo-pink.css';
@font-face {
  font-family: 'Droid Sans';
  src: url('/assets/fonts/droid-sans/DroidSans.ttf') format('opentype');
}

@font-face {
  font-family: 'Droid Sans Bold';
  src: url('/assets/fonts/droid-sans/DroidSans-Bold.ttf') format('opentype');
}

body {
  font-family: 'Droid Sans', 'Droid Sans Bold';
}


================================================
FILE: apps/blog/src/test-setup.ts
================================================
import 'jest-preset-angular';


================================================
FILE: apps/blog/tsconfig.app.json
================================================
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "../../dist/out-tsc",
    "types": []
  },
  "exclude": ["src/test-setup.ts", "**/*.spec.ts"]
}


================================================
FILE: apps/blog/tsconfig.json
================================================
{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "types": ["node", "jest"]
  },
  "include": ["**/*.ts"],
  "angularCompilerOptions": {
    "enableIvy": true
  }
}


================================================
FILE: apps/blog/tsconfig.spec.json
================================================
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "../../dist/out-tsc",
    "types": ["jest", "node"]
  },
  "files": ["src/test-setup.ts"],
  "include": ["**/*.spec.ts", "**/*.d.ts"]
}


================================================
FILE: apps/blog/tslint.json
================================================
{
  "extends": "../../tslint.json",
  "rules": {
    "directive-selector": [true, "attribute", "codelab", "camelCase"],
    "component-selector": [true, "element", "codelab", "kebab-case"]
  }
}


================================================
FILE: apps/codelab/browserslist
================================================
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries

# You can see what browsers were selected by your queries by running:
#   npx browserslist

> 0.5%
last 2 versions
Firefox ESR
not dead
not IE 9-11 # For IE 9-11 support, remove 'not'.


================================================
FILE: apps/codelab/extra-webpack.config.js
================================================
const webpack = require('webpack');
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');

const findLoader = (webpackConfig, regex) => {
  return webpackConfig.module.rules
    .filter(rule => !!rule.use)
    .find(rule => rule.use.find(it => !!it.loader && regex.test(it.loader)));
};

module.exports = (webpackConfig, cliConfig) => {
  if (cliConfig.buildOptimizer) {
    const loader = findLoader(
      webpackConfig,
      /@angular-devkit\/build-optimizer.*\/webpack-loader/
    );

    const originalTest = loader.test;
    loader.test = file => {
      const isMonaco = !!file.match('node_modules/monaco-editor');
      return !isMonaco && !!file.match(originalTest);
    };
  }

  webpackConfig.plugins.push(new MonacoWebpackPlugin());

  return webpackConfig;
};


================================================
FILE: apps/codelab/karma.conf.js
================================================
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function(config) {
  config.set({
    basePath: '../',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, '../coverage'),
      reports: ['html', 'lcovonly'],
      fixWebpackSourcePaths: true
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false
  });
};


================================================
FILE: apps/codelab/src/app/admin/admin-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { AdminComponent } from './admin.component';
import { UsersComponent } from './users/users.component';
import { FeedbackComponent } from './feedback/feedback.component';

const routes = [
  {
    path: '',
    component: AdminComponent,
    children: [
      { path: 'users', component: UsersComponent },
      { path: 'feedback', component: FeedbackComponent }
    ]
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class AdminRoutingModule {}


================================================
FILE: apps/codelab/src/app/admin/admin.component.css
================================================
:host {
  display: block;
  max-width: 1000px;
  margin: 0 auto;
}

.wrapper {
  margin-top: 20px;
}


================================================
FILE: apps/codelab/src/app/admin/admin.component.html
================================================
<mat-card>
  <h2>Angular Codelab 🔥 Admin</h2>

  <nav mat-tab-nav-bar>
    <a
      *ngFor="let link of links"
      mat-tab-link
      routerLinkActive
      #rla="routerLinkActive"
      [routerLink]="link.link"
      [active]="rla.isActive"
    >
      {{ link.name }}
    </a>
  </nav>

  <div class="wrapper">
    <router-outlet></router-outlet>
  </div>
</mat-card>


================================================
FILE: apps/codelab/src/app/admin/admin.component.spec.ts
================================================
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { AdminComponent } from './admin.component';
import { AdminModule } from './admin.module';
import { getMockAngularFireProviders } from '@codelab/utils/src/lib/testing/mocks/angular-fire';
import { RouterModule } from '@angular/router';

describe('AdminComponent', () => {
  let component: AdminComponent;
  let fixture: ComponentFixture<AdminComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [AdminModule, RouterModule.forRoot([])],
      providers: [...getMockAngularFireProviders()]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(AdminComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: apps/codelab/src/app/admin/admin.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  selector: 'codelab-admin',
  templateUrl: './admin.component.html',
  styleUrls: ['./admin.component.css']
})
export class AdminComponent {
  readonly links = [
    { link: 'users', name: 'Users' },
    { link: 'feedback', name: 'Feedback' }
  ];
}


================================================
FILE: apps/codelab/src/app/admin/admin.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MatCardModule } from '@angular/material/card';
import { MatTabsModule } from '@angular/material/tabs';
import { AdminComponent } from './admin.component';
import { AdminRoutingModule } from './admin-routing.module';
import { FeedbackModule } from './feedback/feedback.module';
import { UsersModule } from './users/users.module';

@NgModule({
  imports: [
    AdminRoutingModule,
    CommonModule,
    FeedbackModule,
    UsersModule,
    MatCardModule,
    MatTabsModule
  ],
  declarations: [AdminComponent]
})
export class AdminModule {}


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback-message-table/feedback-message-table.component.ts
================================================
import {
  Component,
  Input,
  ViewChild,
  Output,
  EventEmitter,
  ChangeDetectionStrategy
} from '@angular/core';
import { MatMenuTrigger } from '@angular/material/menu';
import { MatTableDataSource } from '@angular/material/table';
import { MatSort } from '@angular/material/sort';
import { Message } from '@codelab/feedback/src/lib/message';

const clearTags = (value: string) =>
  value.replace(/<[^>]+>/g, '').replace(/Angular Codelab \/ /, '');
const clearAllTags = (values: Message[]): Message[] =>
  values.map((m: Message) => ({
    ...m,
    header: clearTags(m.header || 'No header')
  }));
const sortingDataAccessor = (item, property) => {
  switch (property) {
    case 'timestamp':
      return new Date(item.timestamp).toISOString();
    default:
      return item[property];
  }
};

@Component({
  selector: 'codelab-feedback-message-table',
  templateUrl: './feedback-message-table.html',
  styleUrls: ['./feedback-message-table.css'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class FeedbackMessageTableComponent {
  @ViewChild(MatSort, { static: true }) sort: MatSort;

  @Input('dataSource')
  set dataSourceSetter(values: Message[]) {
    this.dataSource.data = clearAllTags(values);
    this.dataSource.sortingDataAccessor = sortingDataAccessor;
    this.dataSource.sort = this.sort;
  }
  dataSource = new MatTableDataSource([]);

  closeReasons = [
    { name: '[Duplicate]', reason: '[Duplicate]' },
    { name: '[No fix]', reason: '[No fix]' },
    { name: '[Done]', reason: '[Done]' },
    { name: '[Nice message]', reason: '[Nice message, though not a real bug]' },
    { name: "[Can't reproduce]", reason: "[Can't reproduce]" }
  ];

  tableColumns = ['comment', 'name', 'header', 'timestamp', 'actions'];
}


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback-message-table/feedback-message-table.css
================================================
.done-row {
  background: #fcfcfc;
  color: #666;
}

.mat-column-comment {
  width: 55%;
  padding-right: 5px;
}

.mat-column-name {
  width: 10%;
  padding-right: 5px;
}

.mat-column-header {
  width: 20%;
  padding-right: 5px;
}

.mat-column-timestamp {
  width: 10%;
  max-width: 120px;
  padding-right: 5px;
}

.mat-column-actions {
  width: 5%;
  max-width: 20px;
}

table {
  width: 100%;
  overflow: hidden;
}


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback-message-table/feedback-message-table.html
================================================
<table mat-table [dataSource]="dataSource" matSort class="mat-elevation-z4">
  <ng-container matColumnDef="comment">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>comment</th>
    <td mat-cell *matCellDef="let element">
      {{element.comment}}
    </td>
  </ng-container>

  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>
      name
    </th>
    <td mat-cell *matCellDef="let element">{{element.name}}</td>
  </ng-container>

  <ng-container matColumnDef="header">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>header</th>
    <td mat-cell *matCellDef="let element">
      <a [routerLink]="element.href">{{ element.header}}</a>
    </td>
  </ng-container>

  <ng-container matColumnDef="href">
    <th mat-header-cell *matHeaderCellDef>href</th>
    <td mat-cell *matCellDef="let element">{{element.href}}</td>
  </ng-container>

  <ng-container matColumnDef="timestamp">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>timestamp</th>
    <td mat-cell *matCellDef="let element">
      {{element.timestamp|date}}
    </td>
  </ng-container>

  <ng-container matColumnDef="actions" stickyEnd>
    <th mat-header-cell *matHeaderCellDef></th>
    <td mat-cell *matCellDef="let element">
      <feedback-issue-dropdown [message]="element"></feedback-issue-dropdown>
    </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
  <tr
    mat-row
    *matRowDef="let row; columns: tableColumns"
    [class.done-row]="row.isDone"
  ></tr>
</table>


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback.component.css
================================================
.panel {
  margin-bottom: 10px;
}

mat-form-field {
  margin-left: 15px;
  margin-top: 5px;
  width: 120px;
}


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback.component.html
================================================
<div no-padding>
  <div>
    <mat-form-field>
      <mat-label>Feedback</mat-label>
      <mat-select
        [value]="filter$ | async"
        (selectionChange)="this.filter$.next($event.value)"
      >
        <mat-option value="all">All</mat-option>
        <mat-option value="done">Done</mat-option>
        <mat-option value="notDone">Undone</mat-option>
      </mat-select>
    </mat-form-field>

    <mat-form-field>
      <mat-label>Group by</mat-label>
      <mat-select
        [value]="group$ | async"
        (selectionChange)="group$.next($event.value)"
      >
        <mat-option value="nothing">Do not group</mat-option>
        <mat-option value="href">Slide URL</mat-option>
        <mat-option value="name">Name</mat-option>
      </mat-select>
    </mat-form-field>

    <mat-form-field>
      <input
        matInput
        [matDatepicker]="picker"
        placeholder="From"
        [(ngModel)]="datesForFilter.dateFrom"
        (dateChange)="changeDate()"
      />
      <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
      <mat-datepicker #picker></mat-datepicker>
    </mat-form-field>

    <mat-form-field>
      <input
        matInput
        [matDatepicker]="picker2"
        placeholder="To"
        [(ngModel)]="datesForFilter.dateTo"
        (dateChange)="changeDate()"
      />
      <mat-datepicker-toggle matSuffix [for]="picker2"></mat-datepicker-toggle>
      <mat-datepicker #picker2></mat-datepicker>
    </mat-form-field>
    <button mat-button (click)="clearDate()">Clear</button>
  </div>

  <div>
    <div *ngFor="let item of this.messages$ | async" class="panel">
      <mat-expansion-panel [expanded]="true" [hideToggle]="true">
        <mat-expansion-panel-header>
          <mat-panel-title>
            <h3>{{ item.key }}</h3>
          </mat-panel-title>
        </mat-expansion-panel-header>
        <codelab-feedback-message-table
          [dataSource]="item.value"
        ></codelab-feedback-message-table>
      </mat-expansion-panel>
    </div>
  </div>
</div>


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback.component.spec.ts
================================================
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FeedbackComponent } from './feedback.component';
import { FeedbackModule } from './feedback.module';
import { getMockAngularFireProviders } from '@codelab/utils/src/lib/testing/mocks/angular-fire';
import { GithubService } from './github.service';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';

describe('FeedbackComponent', () => {
  let component: FeedbackComponent;
  let fixture: ComponentFixture<FeedbackComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [FeedbackModule, NoopAnimationsModule],
      providers: [
        ...getMockAngularFireProviders(),
        { provide: GithubService, useValue: {} }
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(FeedbackComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback.component.ts
================================================
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { AngularFireDatabase, AngularFireList } from '@angular/fire/database';
import { Message } from '@codelab/feedback/src/lib/message';
import { BehaviorSubject, combineLatest, Observable } from 'rxjs';
import { map } from 'rxjs/operators';

type Filter = 'all' | 'done' | 'notDone';
type Grouping = 'nothing' | 'href' | 'name';

function groupBy(feedback: Array<Message>, grouping: Grouping) {
  const result = feedback.reduce((comment, item) => {
    const groupName = item[grouping];
    comment[groupName] = comment[groupName] || [];
    comment[groupName].push(item);
    return comment;
  }, {});

  return Object.keys(result).map(key => ({ key, value: result[key] }));
}

function normalize(feedback: Array<any>) {
  return feedback.map(item => ({
    ...(item.payload && item.payload.val()),
    key: item.key
  }));
}

function group([feedback, grouping]) {
  if (grouping === 'nothing') {
    return [
      {
        key: 'Messages',
        value: feedback
      }
    ];
  }
  if (grouping === 'name' || grouping === 'href') {
    return groupBy(feedback, grouping);
  }
  throw new Error('Unknown grouping: ' + grouping);
}

function filter([feedback, filterName, [fromDate, toDate]]) {
  let result;
  if (filterName === 'all') {
    result = feedback;
  }

  if (filterName === 'done') {
    result = feedback.filter(message => message.isDone);
  }

  if (filterName === 'notDone') {
    result = feedback.filter(message => !message.isDone);
  }

  const fromMs = fromDate ? new Date(fromDate).getTime() : null;
  const toMs = toDate ? new Date(toDate).getTime() + 86400000 : null; // add 24hrs to include the day of upper bound

  result = result.filter(msg => {
    const timestampMs = new Date(msg.timestamp).getTime();
    return (
      (fromMs ? timestampMs >= fromMs : true) &&
      (toMs ? timestampMs <= toMs : true)
    );
  });
  return result;
}

@Component({
  selector: 'codelab-feedback',
  templateUrl: './feedback.component.html',
  styleUrls: ['./feedback.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class FeedbackComponent implements OnInit {
  messages$: Observable<{ key: string; value: Message }[]>;
  filter$ = new BehaviorSubject<Filter>('notDone');
  dateFilter$ = new BehaviorSubject<[string, string]>(['', '']);
  group$ = new BehaviorSubject<Grouping>('nothing');

  datesForFilter = { dateFrom: '', dateTo: '' };

  constructor(private database: AngularFireDatabase) {}

  ngOnInit() {
    const feedback$: AngularFireList<any[]> = this.database.list('/feedback');

    const filteredMessages$ = combineLatest([
      feedback$.snapshotChanges().pipe(map(normalize)),
      this.filter$,
      this.dateFilter$
    ]).pipe(map(filter));

    this.messages$ = combineLatest([filteredMessages$, this.group$]).pipe(
      map(group)
    );
  }

  changeDate(clearDates = false) {
    if (clearDates) {
      this.datesForFilter = { dateFrom: '', dateTo: '' };
    }
    this.dateFilter$.next([
      this.datesForFilter.dateFrom || '',
      this.datesForFilter.dateTo || ''
    ]);
  }

  clearDate() {
    this.changeDate(true);
  }
}


================================================
FILE: apps/codelab/src/app/admin/feedback/feedback.module.ts
================================================
import { AngularFireDatabaseModule } from '@angular/fire/database';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { MatCardModule } from '@angular/material/card';
import { MatMenuModule } from '@angular/material/menu';
import { MatButtonModule } from '@angular/material/button';
import { MatSelectModule } from '@angular/material/select';
import { MatTableModule } from '@angular/material/table';
import { MatIconModule } from '@angular/material/icon';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatInputModule } from '@angular/material/input';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSortModule } from '@angular/material/sort';
import { MatNativeDateModule } from '@angular/material/core';
import { SlidesModule } from '@ng360/slides';
import { BrowserWindowModule } from '@codelab/browser';
import { FeedbackMessageTableComponent } from './feedback-message-table/feedback-message-table.component';
import { FeedbackComponent } from './feedback.component';
import { FeedbackModule as FeedbackLibModule } from '@codelab/feedback';

@NgModule({
  imports: [
    RouterModule,
    AngularFireDatabaseModule,
    AngularFireAuthModule,
    BrowserWindowModule,
    FormsModule,
    ReactiveFormsModule,
    CommonModule,
    SlidesModule,
    MatButtonModule,
    MatCardModule,
    MatMenuModule,
    MatSelectModule,
    MatTableModule,
    MatIconModule,
    MatDatepickerModule,
    MatNativeDateModule,
    MatFormFieldModule,
    MatInputModule,
    MatExpansionModule,
    MatSortModule,
    FeedbackLibModule
  ],
  declarations: [FeedbackComponent, FeedbackMessageTableComponent],
  exports: [FeedbackComponent],
  entryComponents: [FeedbackComponent]
})
export class FeedbackModule {}


================================================
FILE: apps/codelab/src/app/admin/feedback/github.service.ts
================================================
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class GithubService {
  repo = 'codelab-fun/codelab';

  constructor(private http: HttpClient) {}

  createIssue(issueData, accessToken) {
    const headers = { Authorization: 'token ' + accessToken };
    const options = { headers };
    return this.http.post(
      `https://api.github.com/repos/${this.repo}/issues`,
      issueData,
      options
    );
  }

  closeIssue(changes, issueId, accessToken) {
    const headers = { Authorization: 'token ' + accessToken };
    const options = { headers };
    return this.http.patch(
      `https://api.github.com/repos/${this.repo}/issues/${issueId}`,
      changes,
      options
    );
  }
}


================================================
FILE: apps/codelab/src/app/admin/users/users.component.css
================================================
table {
  width: 100%;
}


================================================
FILE: apps/codelab/src/app/admin/users/users.component.html
================================================
<table mat-table [dataSource]="admins$ | async" class="mat-elevation-z8">
  <ng-container matColumnDef="key">
    <th mat-header-cell *matHeaderCellDef>Key</th>
    <td mat-cell *matCellDef="let admin">{{ admin.key }}</td>
  </ng-container>

  <ng-container matColumnDef="isCurrentUser">
    <th mat-header-cell *matHeaderCellDef>You</th>
    <td mat-cell *matCellDef="let admin">
      {{ admin.isCurrentUser ? '⛱' : '' }}
    </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
</table>


================================================
FILE: apps/codelab/src/app/admin/users/users.component.spec.ts
================================================
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { UsersComponent } from './users.component';
import { UsersModule } from './users.module';
import { SyncDbService } from '@codelab/utils/src/lib/sync/services/sync-db.service';
import { of } from 'rxjs';
import { LoginService } from '@codelab/firebase-login';

describe('UsersComponent', () => {
  let component: UsersComponent;
  let fixture: ComponentFixture<UsersComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [UsersModule],
      providers: [
        {
          provide: SyncDbService,
          useValue: { list: () => ({ snapshots$: of([]) }) }
        },
        {
          provide: LoginService,
          useValue: {}
        }
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(UsersComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: apps/codelab/src/app/admin/users/users.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { LoginService } from '@codelab/firebase-login';
import { SyncDbService } from '@codelab/utils/src/lib/sync/services/sync-db.service';
import { map } from 'rxjs/operators';
import { firebaseToValuesWithKey } from '@codelab/utils/src/lib/sync/common';
import { combineLatest, Observable } from 'rxjs';
import { Permissions } from '../../shared/services/access.service';

export interface AdminDb {
  key: string;
  permissions: Record<Permissions, boolean>;
}

export interface Admin extends AdminDb {
  isCurrentUser: boolean;
}

export interface UserDb {
  admin: AdminDb[];
}

@Component({
  selector: 'codelab-users',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.css']
})
export class UsersComponent {
  readonly displayedColumns = ['isCurrentUser', 'key'];

  readonly admins = this.dbService.list('admin');
  private readonly allAdmins$ = this.admins.snapshots$.pipe(
    map(firebaseToValuesWithKey)
  );

  readonly admins$: Observable<Admin[]> = combineLatest([
    this.allAdmins$,
    this.loginService.uid$
  ]).pipe(
    map(([admins, currentUserUid]) => {
      return admins.map(admin => ({
        ...admin,
        isCurrentUser: admin.key === currentUserUid
      }));
    })
  );

  constructor(
    private readonly loginService: LoginService,
    private readonly dbService: SyncDbService<UserDb>
  ) {}
}


================================================
FILE: apps/codelab/src/app/admin/users/users.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UsersComponent } from './users.component';
import { MatCardModule } from '@angular/material/card';
import { MatTableModule } from '@angular/material/table';

@NgModule({
  declarations: [UsersComponent],
  entryComponents: [UsersComponent],
  imports: [CommonModule, MatTableModule, MatCardModule]
})
export class UsersModule {}


================================================
FILE: apps/codelab/src/app/app-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { LoginComponent } from './components/login/login.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import { AdminGuard } from './shared/services/guards/admin-guard';
import { LoginGuard } from './shared/services/guards/login-guard';

const routes: Routes = [
  {
    path: '',
    loadChildren: () =>
      import('./codelabs/codelabs.module').then(m => m.CodelabsModule)
  },
  {
    path: 'login',
    component: LoginComponent,
    canActivate: [LoginGuard]
  },
  {
    path: 'admin',
    loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),
    canActivate: [AdminGuard]
  },
  {
    path: 'sync',
    loadChildren: () =>
      import('./sync/sync.module').then(m => m.SyncAdminModule)
  },
  { path: '**', component: NotFoundComponent }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule {}


================================================
FILE: apps/codelab/src/app/app.component.ts
================================================
import { Component } from '@angular/core';

@Component({
  selector: 'codelab-root',
  template: '<router-outlet></router-outlet>'
})
export class AppComponent {}


================================================
FILE: apps/codelab/src/app/app.module.ts
================================================
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { monacoReady } from '@codelab/code-demos';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AngularFireDatabaseModule } from '@angular/fire/database';
import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { LoginModule } from './components/login/login.module';
import { menuRoutes } from './codelabs/angular/angular-routing.module';
import { MENU_ROUTES } from './common';
import { environment } from '../environments/environment';
import { NotFoundModule } from './components/not-found/not-found.module';
import { MatButtonModule } from '@angular/material/button';
import { DirectivesModule } from './directives/directives.module';
import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [
    AppRoutingModule,
    LoginModule,
    BrowserModule,
    BrowserAnimationsModule,
    HttpClientModule,
    AngularFireModule.initializeApp(environment.firebaseConfig),
    AngularFireAuthModule,
    AngularFireDatabaseModule,
    NotFoundModule,
    MatButtonModule,
    DirectivesModule
  ],
  declarations: [AppComponent],
  providers: [
    { provide: MENU_ROUTES, useValue: menuRoutes },
    { provide: APP_INITIALIZER, useValue: monacoReady, multi: true }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}


================================================
FILE: apps/codelab/src/app/codelabs/about/about.component.html
================================================
<slide-deck slideShortcuts slidesRouting slides-tracking>
  <div *slide cover>
    codelab.fun
  </div>

  <!--  TODO(anya):-->
  <div *slide cover>What is codelab.fun</div>
  <div *slide pic-label>
    Online interactive angular tutorial no setup
    <div class="no-setup" pic></div>
  </div>
  <div *slide pic-label>
    Interactive code samples
    <div class="examples" pic></div>
  </div>
  <div *slide pic-label>
    Hands on exercises
    <div class="exercises" pic></div>
  </div>
  <div *slide pic-label>
    All open source/Angular Ivy/on Github
    <div class="github" pic></div>
    <div class="issues" pic></div>
  </div>

  <div *slide pic-label>
    Regular offline contributors meetings
    <div class="community" pic></div>
  </div>
  <div *slide>
    <h2>20+ Live-events in 10+ countries</h2>
    <div pic class="img-todo"></div>
  </div>
  <div *slide>
    <h2>~1000 users a month</h2>
    <div pic class="img-todo"></div>
  </div>
  <div *slide>
    <h2>Almost 50 contributors</h2>
    <div pic class="img-todo"></div>
  </div>
  <!-- end  TODO(anya):-->
  <div *slide>
    <h2>Live-Stream "Звуки программистов"</h2>
    <h2>
      @kirjs and @thekiba_io meet on weekends and do long technical streams in
      russian, https://www.twitch.tv/kirjs
    </h2>
    <div pic class="img-todo"></div>
  </div>

  <!--
   Story
  -->
  <div *slide cover>Nov 11, 2016</div>
  <div *slide text>Angular 2.1</div>
  <div *slide text>Kirjs did not know Angular</div>
  <div *slide text>Move exercises to the browser</div>
  <!--  MORE - TBD-->

  <!--
   TODO: Runner story
  -->
  <div *slide>Running tests (mocha / babel + traversing AST)</div>
  <div *slide>
    - The goal is to quickly assess whether user's code does what we want.
  </div>
  <div *slide>
    - Initially the plan was to run unit tests in an iframe with TestBed, mocha
    + chai (code TBD)
  </div>

  <!--
     Types
  -->
  <div *slide text>Types</div>
  <div *slide text>There's no types (TODO: Explain)</div>

  <!--
      Creating slides
  -->
  <div *slide cover>Next level</div>

  <!--
      Creating slides
  -->
  <div cover *slide>Creating slides library with Angular</div>

  <div *slide>
    <h2>What's an ideal API for a presentation?</h2>
    <code-demo-editor
      language="html"
      [(ngModel)]="code.slides.component"
    ></code-demo-editor>
  </div>

  <div *slide>
    <h2>Can we use ng-template?</h2>
    <code-demo-editor
      language="html"
      [(ngModel)]="code.slides.template"
    ></code-demo-editor>
  </div>

  <div *slide>
    <h2>Can we use ng-template?</h2>
    <code-demo-editor
      language="html"
      [(ngModel)]="code.slides.directive"
    ></code-demo-editor>
  </div>

  <!--
    Highlighting directive
  -->
  <div *slide cover>
    Highlights
  </div>

  <div *slide>
    <h2>How to implement this?</h2>
    <div class="highlight-slides" pic></div>
  </div>

  <div *slide>
    <h2>We need a popup which</h2>
    <ul>
      <li>plays well with Monaco</li>
      <li>Updates when the code is updated</li>
      <li>Not obstructive</li>
    </ul>
  </div>

  <div *slide>
    <h2>We don't. We use highlight instead</h2>
    <!--    <code-demo-editor></code-demo-editor>-->
  </div>
  <div *slide>
    <h2>We don't. We use highlight instead</h2>
    <!--    <code-demo-editor></code-demo-editor>-->
  </div>

  <div *slide>
    <h2>Find position by regex or string</h2>
    <code-demo-editor [(ngModel)]="code.highlights.find"></code-demo-editor>
  </div>

  <div *slide>
    <h2>Add classes using Monaco's deltaDecorations</h2>
    <!--    TODO-->
  </div>

  <!--
      Code in a template
  -->
  <div *slide cover>Storing code samples</div>
  <div *slide>
    <h2>This can't be hard!</h2>
    <code-demo-editor
      language="html"
      [(ngModel)]="code.storingCode.plain"
    ></code-demo-editor>
  </div>
  <div *slide>
    <h2>Can we use multiline strings?</h2>
    <code-demo-editor
      language="html"
      [(ngModel)]="code.storingCode.backticks"
      [codeDemoHighlight]="code.storingCode.backticksMatch"
    ></code-demo-editor>
  </div>
  <div *slide>
    <h2>Custom interpolation to the rescue?</h2>
    <code-demo
      language="html"
      [(ngModel)]="code.storingCode.interpolation"
    ></code-demo>
  </div>

  <div *slide>
    <h2>Can we use ng-template?</h2>
    <!--    TODO-->
  </div>
  <div *slide>
    <h2>Can we use ngNonBindable?</h2>
    <!--    TODO-->
  </div>
  <div *slide>
    <h2>Can we use Script tag?</h2>
    <!--    TODO-->
  </div>
  <div *slide>
    <h2>Can we use Textarea?</h2>
    <!--    TODO-->
  </div>
  <div *slide>
    <h2>Textarea + ngNonBindable</h2>
    <!--    TODO-->
  </div>

  <div *slide>
    <h2>Code in the component</h2>
    <!--    TODO-->
  </div>

  <div *slide>
    <h2>raw-loader - code in files</h2>
    <!--    TODO-->
  </div>

  <!--
    Types
   -->

  <div *slide cover>
    Can we use figure out the types now?
  </div>

  <div *slide>
    <h2>Let's fake it!</h2>
    <code-demo-file-path path="fake-types.d.ts"></code-demo-file-path>
    <code-demo-editor [(ngModel)]="code.fakeTypes"></code-demo-editor>
  </div>

  <div *slide>
    <h2>Then webstorm started shouting at me.</h2>
    <div class="types-error" pic></div>
  </div>
  <div *slide>
    <h2>Let's fake it!</h2>
    <code-demo-file-path
      path="fake-types.d.ts.not-really"
    ></code-demo-file-path>
    <code-demo-editor [(ngModel)]="code.fakeTypes"></code-demo-editor>
  </div>
  <div *slide>
    <h2>Types work!</h2>
    <div class="types-work" pic></div>
  </div>

  <!--
   Feedback
  -->
  <div *slide>
    <h2>So we kinda ready for prime time, except nothing really works</h2>
    <!--    TODO-->
  </div>

  <div *slide>
    <h2>People will probably get really mad?</h2>
    <!--    TODO-->
  </div>

  <div *slide>
    <h2>Let's add feedback feature</h2>
    <!--    TODO screenshot-->
  </div>
  <div *slide>
    <h2>We use firebase</h2>
    <!--    TODO screenshot-->
  </div>

  <div *slide>
    <h2>
      We want the feedback to be as specific as possible, so we need to identify
      the slide
    </h2>
    <!--    TODO screenshot-->
  </div>

  <div *slide>
    <h2>We Already use routing, and each slide has a #</h2>
    <!--    TODO screenshot-->
  </div>

  <div *slide>
    <h2>We can't generate and ID</h2>
    <!--    TODO screenshot-->
  </div>
  <div *slide>
    <h2>We have to give an ID manually</h2>
    <!--    TODO screenshot-->
  </div>

  <div *slide>
    <h2>TADA</h2>
    <!-- Ugly code -->
  </div>

  <!--
    Success
   -->

  <!--
    Translations
   -->
  <div *slide cover>i18n</div>

  <div *slide>
    <h2>We use standard Angular i18n</h2>
    <!--    TODO: Code sample-->
  </div>
  <div *slide>
    <h2>But how can we translate code samples?</h2>
    <!--    TODO: Illustration-->
  </div>
  <div *slide>
    <ul>
      <li>Have strings in template with ids</li>
      <li>Then query it in the Component</li>
    </ul>
    {{ "@ViewChild('translations', { static: true }) translation;" }}
    <!--    TODO: Illustration-->
  </div>

  <div *slide text>
    How to we translate it in a way that scales?
  </div>

  <div *slide>
    <h2>Codelab uses PoEditor</h2>
    <div pic class="i18n-poeditor"></div>
  </div>

  <div *slide>
    <h2>Thanks PoEditor for providing us with an Open Source license!</h2>
    <div pic class="i18n-poeditor"></div>
  </div>

  <div *slide text>Anybody can help with translation</div>
  <div *slide text>- Already translated into Russian</div>

  <!--
    Optimizing everything.
   -->
  <!--  TODO(🦊):-->
  <div *slide>Let's make it faster</div>

  <div *slide>- изначальные проблемы:</div>
  <div *slide>очень долго пересобиралось, потому что пересоздавался iframe</div>
  <div *slide>
    типы задавались вручную, поэтому было проблемно подключать дополнительные
    библиотеки
  </div>
  <div *slide>- что сделано:</div>
  <div *slide>iframe стал переиспользоваться</div>
  <div *slide>инстанс ts compiler был переведен на watch режим</div>
  <div *slide>реализован bundler, который собирает типы в один файл</div>
  <div *slide>оптимизация бандла с пакетами, чтобы все сжималось</div>
  <div *slide>- что получили:</div>
  <div *slide>
    перезапуск вместо 0.5-1 сек стало почти мгновенно (показать демонстрацию)
  </div>
  <div *slide>размер бандла уменьшился в 2 раза (todo: посмотреть размер)</div>
  <div *slide>
    появилась возможность подключать любые библиотеки на этапе компиляции
  </div>
  <div *slide>Running tests (mocha / babel + traversing AST)</div>
  <div *slide>
    - The goal is to quickly assess whether user's code does what we want.
  </div>
  <div *slide>
    - Initially the plan was to run unit tests in an iframe with TestBed, mocha
    + chai (code TBD)
  </div>
  <div *slide>- Phase 2 - We started reusing iframe (code TBD)</div>
  <div *slide>- Special case testing bootstrapping the app (code TBD)</div>
  <div *slide>
    - We also added babel tests (babel can parse TypeScript) (code TBD)
  </div>
  <div *slide>- This works, we look at the code, not at the result.</div>
  <div *slide>Monaco</div>
  <div *slide>
    - The goal is to give users a type aware editor with SyntaxHighlighting
    quick, extensible
  </d
Download .txt
gitextract_yuiyff9g/

├── .editorconfig
├── .firebaserc
├── .flooignore
├── .gitattributes
├── .gitignore
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .travis.yml
├── .vscode/
│   └── extensions.json
├── LICENSE
├── README.md
├── angular.json
├── apps/
│   ├── angular-thirty-seconds/
│   │   ├── browserslist
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   ├── create-snippet/
│   │   │   │   │   ├── create-snippet.component.html
│   │   │   │   │   ├── create-snippet.component.scss
│   │   │   │   │   ├── create-snippet.component.spec.ts
│   │   │   │   │   ├── create-snippet.component.ts
│   │   │   │   │   ├── create-snippet.module.ts
│   │   │   │   │   ├── snippet-info/
│   │   │   │   │   │   ├── snippet-info.component.html
│   │   │   │   │   │   ├── snippet-info.component.scss
│   │   │   │   │   │   └── snippet-info.component.ts
│   │   │   │   │   ├── snippet-modal/
│   │   │   │   │   │   ├── snippet-overview.component.html
│   │   │   │   │   │   ├── snippet-overview.component.scss
│   │   │   │   │   │   └── snippet-overview.component.ts
│   │   │   │   │   └── snippet-spinner/
│   │   │   │   │       ├── snippet-spinner.component.html
│   │   │   │   │       ├── snippet-spinner.component.scss
│   │   │   │   │       └── snippet-spinner.component.ts
│   │   │   │   ├── pull-requests-list/
│   │   │   │   │   ├── pull-requests-list.component.html
│   │   │   │   │   ├── pull-requests-list.component.scss
│   │   │   │   │   └── pull-requests-list.component.ts
│   │   │   │   └── shared/
│   │   │   │       ├── angular-sample.ts
│   │   │   │       ├── constants.ts
│   │   │   │       ├── consts.ts
│   │   │   │       ├── functions/
│   │   │   │       │   ├── generate-snippet.spec.ts
│   │   │   │       │   ├── generate-snippet.ts
│   │   │   │       │   ├── parse-snippet.spec.ts
│   │   │   │       │   ├── parse-snippet.ts
│   │   │   │       │   ├── test-data/
│   │   │   │       │   │   └── snippet.ts
│   │   │   │       │   └── validation/
│   │   │   │       │       ├── index.ts
│   │   │   │       │       └── validation.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── interfaces/
│   │   │   │       │   ├── branch.interface.ts
│   │   │   │       │   ├── commit-info.interface.ts
│   │   │   │       │   ├── github-auth.interface.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── pull-request.intreface.ts
│   │   │   │       │   ├── repo.interface.ts
│   │   │   │       │   ├── snippet.ts
│   │   │   │       │   └── user.interface.ts
│   │   │   │       └── services/
│   │   │   │           ├── github.service.ts
│   │   │   │           ├── snippet.service.spec.ts
│   │   │   │           └── snippet.service.ts
│   │   │   ├── assets/
│   │   │   │   └── .gitkeep
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.scss
│   │   │   └── test.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── blog/
│   │   ├── browserslist
│   │   ├── jest.config.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.scss
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── feed/
│   │   │   │   │   ├── feed.component.html
│   │   │   │   │   ├── feed.component.scss
│   │   │   │   │   ├── feed.component.spec.ts
│   │   │   │   │   └── feed.component.ts
│   │   │   │   ├── form/
│   │   │   │   │   ├── form.component.html
│   │   │   │   │   ├── form.component.scss
│   │   │   │   │   ├── form.component.spec.ts
│   │   │   │   │   └── form.component.ts
│   │   │   │   ├── post/
│   │   │   │   │   ├── post.component.html
│   │   │   │   │   ├── post.component.scss
│   │   │   │   │   ├── post.component.spec.ts
│   │   │   │   │   └── post.component.ts
│   │   │   │   ├── post.service.ts
│   │   │   │   └── single-post/
│   │   │   │       ├── single-post.component.html
│   │   │   │       ├── single-post.component.scss
│   │   │   │       └── single-post.component.ts
│   │   │   ├── assets/
│   │   │   │   ├── .gitkeep
│   │   │   │   └── fonts/
│   │   │   │       └── droid-sans/
│   │   │   │           └── Apache License.txt
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.scss
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── codelab/
│   │   ├── browserslist
│   │   ├── extra-webpack.config.js
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── admin/
│   │   │   │   │   ├── admin-routing.module.ts
│   │   │   │   │   ├── admin.component.css
│   │   │   │   │   ├── admin.component.html
│   │   │   │   │   ├── admin.component.spec.ts
│   │   │   │   │   ├── admin.component.ts
│   │   │   │   │   ├── admin.module.ts
│   │   │   │   │   ├── feedback/
│   │   │   │   │   │   ├── feedback-message-table/
│   │   │   │   │   │   │   ├── feedback-message-table.component.ts
│   │   │   │   │   │   │   ├── feedback-message-table.css
│   │   │   │   │   │   │   └── feedback-message-table.html
│   │   │   │   │   │   ├── feedback.component.css
│   │   │   │   │   │   ├── feedback.component.html
│   │   │   │   │   │   ├── feedback.component.spec.ts
│   │   │   │   │   │   ├── feedback.component.ts
│   │   │   │   │   │   ├── feedback.module.ts
│   │   │   │   │   │   └── github.service.ts
│   │   │   │   │   └── users/
│   │   │   │   │       ├── users.component.css
│   │   │   │   │       ├── users.component.html
│   │   │   │   │       ├── users.component.spec.ts
│   │   │   │   │       ├── users.component.ts
│   │   │   │   │       └── users.module.ts
│   │   │   │   ├── app-routing.module.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   ├── codelabs/
│   │   │   │   │   ├── about/
│   │   │   │   │   │   ├── about.component.html
│   │   │   │   │   │   ├── about.component.scss
│   │   │   │   │   │   ├── about.component.spec.ts
│   │   │   │   │   │   ├── about.component.ts
│   │   │   │   │   │   ├── about.module.ts
│   │   │   │   │   │   └── samples/
│   │   │   │   │   │       ├── fake-types.d.ts.not-really
│   │   │   │   │   │       ├── slides/
│   │   │   │   │   │       │   ├── ng-template.html
│   │   │   │   │   │       │   ├── slide-component.html
│   │   │   │   │   │       │   └── structural-directive.html
│   │   │   │   │   │       └── storing-code/
│   │   │   │   │   │           ├── backticks.html
│   │   │   │   │   │           ├── interpolations.ts
│   │   │   │   │   │           └── plain.html
│   │   │   │   │   ├── angular/
│   │   │   │   │   │   ├── angular-cli/
│   │   │   │   │   │   │   ├── angular-cli.component.css
│   │   │   │   │   │   │   ├── angular-cli.component.html
│   │   │   │   │   │   │   ├── angular-cli.component.ts
│   │   │   │   │   │   │   └── angular-cli.module.ts
│   │   │   │   │   │   ├── angular-routing.module.ts
│   │   │   │   │   │   ├── angular.module.ts
│   │   │   │   │   │   ├── component-tree/
│   │   │   │   │   │   │   ├── component-tree.component.css
│   │   │   │   │   │   │   ├── component-tree.component.html
│   │   │   │   │   │   │   ├── component-tree.component.ts
│   │   │   │   │   │   │   ├── component-tree.module.ts
│   │   │   │   │   │   │   ├── components-hierarchy-svg/
│   │   │   │   │   │   │   │   ├── components-hierarchy-svg.component.html
│   │   │   │   │   │   │   │   ├── components-hierarchy-svg.component.spec.ts
│   │   │   │   │   │   │   │   ├── components-hierarchy-svg.component.ts
│   │   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── module/
│   │   │   │   │   │   │           ├── app.module.ts
│   │   │   │   │   │   │           ├── box.component.ts
│   │   │   │   │   │   │           ├── circle.component.ts
│   │   │   │   │   │   │           └── index.html
│   │   │   │   │   │   ├── create-first-app/
│   │   │   │   │   │   │   ├── create-first-app.component.css
│   │   │   │   │   │   │   ├── create-first-app.component.html
│   │   │   │   │   │   │   ├── create-first-app.component.ts
│   │   │   │   │   │   │   ├── create-first-app.module.ts
│   │   │   │   │   │   │   ├── mode/
│   │   │   │   │   │   │   │   ├── mode.component.css
│   │   │   │   │   │   │   │   ├── mode.component.html
│   │   │   │   │   │   │   │   ├── mode.component.spec.ts
│   │   │   │   │   │   │   │   └── mode.component.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       ├── app-component/
│   │   │   │   │   │   │       │   ├── app.component.ts
│   │   │   │   │   │   │       │   ├── app.module.ts
│   │   │   │   │   │   │       │   ├── bootstrap.ts
│   │   │   │   │   │   │       │   └── index.html
│   │   │   │   │   │   │       └── index-html/
│   │   │   │   │   │   │           ├── bootstrap.ts
│   │   │   │   │   │   │           └── index.html
│   │   │   │   │   │   ├── custom-events/
│   │   │   │   │   │   │   ├── custom-events.component.css
│   │   │   │   │   │   │   ├── custom-events.component.html
│   │   │   │   │   │   │   ├── custom-events.component.ts
│   │   │   │   │   │   │   └── custom-events.module.ts
│   │   │   │   │   │   ├── dependency-injection/
│   │   │   │   │   │   │   ├── dependency-injection.component.css
│   │   │   │   │   │   │   ├── dependency-injection.component.html
│   │   │   │   │   │   │   ├── dependency-injection.component.ts
│   │   │   │   │   │   │   └── dependency-injection.module.ts
│   │   │   │   │   │   ├── forms/
│   │   │   │   │   │   │   ├── forms.component.css
│   │   │   │   │   │   │   ├── forms.component.html
│   │   │   │   │   │   │   ├── forms.component.ts
│   │   │   │   │   │   │   ├── forms.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── basic/
│   │   │   │   │   │   │           ├── app.1.html
│   │   │   │   │   │   │           ├── app.2.html
│   │   │   │   │   │   │           ├── app.3.html
│   │   │   │   │   │   │           ├── app.4.html
│   │   │   │   │   │   │           ├── app.5.html
│   │   │   │   │   │   │           ├── app.6.html
│   │   │   │   │   │   │           ├── app.component.5.ts
│   │   │   │   │   │   │           ├── app.component.ts
│   │   │   │   │   │   │           ├── app.html
│   │   │   │   │   │   │           ├── app.module.6.ts
│   │   │   │   │   │   │           ├── app.module.ts
│   │   │   │   │   │   │           ├── code.ts
│   │   │   │   │   │   │           ├── main.ts
│   │   │   │   │   │   │           └── styles.css
│   │   │   │   │   │   ├── material/
│   │   │   │   │   │   │   ├── material.component.css
│   │   │   │   │   │   │   ├── material.component.html
│   │   │   │   │   │   │   ├── material.component.ts
│   │   │   │   │   │   │   ├── material.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       ├── basic/
│   │   │   │   │   │   │       │   ├── app.1.html
│   │   │   │   │   │   │       │   ├── app.2.html
│   │   │   │   │   │   │       │   ├── app.3.html
│   │   │   │   │   │   │       │   ├── app.4.html
│   │   │   │   │   │   │       │   ├── app.component.ts
│   │   │   │   │   │   │       │   ├── app.html
│   │   │   │   │   │   │       │   ├── app.module.ts
│   │   │   │   │   │   │       │   ├── code.ts
│   │   │   │   │   │   │       │   └── main.ts
│   │   │   │   │   │   │       ├── step1/
│   │   │   │   │   │   │       │   ├── app.html
│   │   │   │   │   │   │       │   └── app.module.ts
│   │   │   │   │   │   │       ├── step2/
│   │   │   │   │   │   │       │   ├── app.html
│   │   │   │   │   │   │       │   └── app.module.ts
│   │   │   │   │   │   │       ├── step3/
│   │   │   │   │   │   │       │   └── app.html
│   │   │   │   │   │   │       └── step4/
│   │   │   │   │   │   │           ├── app.html
│   │   │   │   │   │   │           └── app.module.ts
│   │   │   │   │   │   ├── pipes/
│   │   │   │   │   │   │   ├── pipes.component.css
│   │   │   │   │   │   │   ├── pipes.component.html
│   │   │   │   │   │   │   ├── pipes.component.ts
│   │   │   │   │   │   │   ├── pipes.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── pipes/
│   │   │   │   │   │   │           ├── app.component.html
│   │   │   │   │   │   │           ├── app.component.ts
│   │   │   │   │   │   │           └── app.module.ts
│   │   │   │   │   │   ├── playground/
│   │   │   │   │   │   │   ├── angular-sample.ts
│   │   │   │   │   │   │   ├── playground.component.css
│   │   │   │   │   │   │   ├── playground.component.html
│   │   │   │   │   │   │   ├── playground.component.spec.ts
│   │   │   │   │   │   │   ├── playground.component.ts
│   │   │   │   │   │   │   └── playground.module.ts
│   │   │   │   │   │   ├── router/
│   │   │   │   │   │   │   ├── router.component.css
│   │   │   │   │   │   │   ├── router.component.html
│   │   │   │   │   │   │   ├── router.component.ts
│   │   │   │   │   │   │   ├── router.module.ts
│   │   │   │   │   │   │   └── samples/
│   │   │   │   │   │   │       └── simple-router/
│   │   │   │   │   │   │           ├── app.component.html
│   │   │   │   │   │   │           ├── app.component.ts
│   │   │   │   │   │   │           ├── app.module.ts
│   │   │   │   │   │   │           ├── code.ts
│   │   │   │   │   │   │           ├── components/
│   │   │   │   │   │   │           │   ├── kitten.ts
│   │   │   │   │   │   │           │   └── puppy.ts
│   │   │   │   │   │   │           ├── index.html
│   │   │   │   │   │   │           └── main.ts
│   │   │   │   │   │   ├── structural-directives/
│   │   │   │   │   │   │   ├── bsod.css
│   │   │   │   │   │   │   ├── samples/
│   │   │   │   │   │   │   │   ├── mat-tab-nav-bar/
│   │   │   │   │   │   │   │   │   ├── alert.component.ts
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   └── tab.component.ts
│   │   │   │   │   │   │   │   ├── material-tabs/
│   │   │   │   │   │   │   │   │   ├── alert.component.ts
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.html
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   ├── app.solved.html
│   │   │   │   │   │   │   │   │   ├── break-my-computer.component.ts
│   │   │   │   │   │   │   │   │   ├── style.css
│   │   │   │   │   │   │   │   │   └── taet-led.component.ts
│   │   │   │   │   │   │   │   ├── material-tabs-structural-directive/
│   │   │   │   │   │   │   │   │   ├── alert.component.ts
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.html
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   ├── app.solved.html
│   │   │   │   │   │   │   │   │   ├── hideme.directive.solved.ts
│   │   │   │   │   │   │   │   │   ├── hideme.directive.ts
│   │   │   │   │   │   │   │   │   └── ignored.module.ts
│   │   │   │   │   │   │   │   ├── micro-syntax/
│   │   │   │   │   │   │   │   │   ├── code.ts
│   │   │   │   │   │   │   │   │   ├── ms.spec.ts
│   │   │   │   │   │   │   │   │   └── ms.ts
│   │   │   │   │   │   │   │   └── structural-directives/
│   │   │   │   │   │   │   │       ├── microsyntax.html
│   │   │   │   │   │   │   │       ├── ng-for-after.html
│   │   │   │   │   │   │   │       ├── ng-for-before.html
│   │   │   │   │   │   │   │       ├── ng-if-after.html
│   │   │   │   │   │   │   │       └── ng-if-before.html
│   │   │   │   │   │   │   ├── structural-directives.component.css
│   │   │   │   │   │   │   ├── structural-directives.component.html
│   │   │   │   │   │   │   ├── structural-directives.component.ts
│   │   │   │   │   │   │   └── structural-directives.module.ts
│   │   │   │   │   │   ├── templates/
│   │   │   │   │   │   │   ├── samples/
│   │   │   │   │   │   │   │   ├── data-binding-extra/
│   │   │   │   │   │   │   │   │   ├── app.component.html
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   │   │   │   ├── index.html
│   │   │   │   │   │   │   │   │   └── number-praiser.ts
│   │   │   │   │   │   │   │   ├── event-binding/
│   │   │   │   │   │   │   │   │   ├── app.component.html
│   │   │   │   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   │   │   │   └── app.module.ts
│   │   │   │   │   │   │   │   ├── event-binding-shortcuts/
│   │   │   │   │   │   │   │   │   └── app.component.html
│   │   │   │   │   │   │   │   └── reference-binding/
│   │   │   │   │   │   │   │       ├── app.component.html
│   │   │   │   │   │   │   │       ├── app.component.ts
│   │   │   │   │   │   │   │       └── app.module.ts
│   │   │   │   │   │   │   ├── templates.component.css
│   │   │   │   │   │   │   ├── templates.component.html
│   │   │   │   │   │   │   ├── templates.component.ts
│   │   │   │   │   │   │   └── templates.module.ts
│   │   │   │   │   │   └── typescript/
│   │   │   │   │   │       ├── typescript/
│   │   │   │   │   │       │   ├── code/
│   │   │   │   │   │       │   │   ├── app.ts
│   │   │   │   │   │       │   │   ├── code.ts
│   │   │   │   │   │       │   │   └── mini-exercise-test.ts
│   │   │   │   │   │       │   ├── typescript-svg/
│   │   │   │   │   │       │   │   ├── typescript-svg.component.html
│   │   │   │   │   │       │   │   ├── typescript-svg.component.spec.ts
│   │   │   │   │   │       │   │   └── typescript-svg.component.ts
│   │   │   │   │   │       │   ├── typescript.component.css
│   │   │   │   │   │       │   ├── typescript.component.html
│   │   │   │   │   │       │   └── typescript.component.ts
│   │   │   │   │   │       ├── typescript-routing.module.ts
│   │   │   │   │   │       └── typescript.module.ts
│   │   │   │   │   ├── codelabs-routing.module.ts
│   │   │   │   │   ├── codelabs.module.ts
│   │   │   │   │   └── extra/
│   │   │   │   │       ├── code-playground/
│   │   │   │   │       │   ├── code-playground.component.css
│   │   │   │   │       │   ├── code-playground.component.html
│   │   │   │   │       │   ├── code-playground.component.ts
│   │   │   │   │       │   └── code-playground.module.ts
│   │   │   │   │       ├── extra-routing.module.ts
│   │   │   │   │       ├── extra.module.ts
│   │   │   │   │       ├── rating-summary/
│   │   │   │   │       │   ├── rating-summary.component.css
│   │   │   │   │       │   ├── rating-summary.component.html
│   │   │   │   │       │   ├── rating-summary.component.ts
│   │   │   │   │       │   └── rating-summary.module.ts
│   │   │   │   │       └── visual-studio-code/
│   │   │   │   │           ├── visual-studio-code.component.css
│   │   │   │   │           ├── visual-studio-code.component.html
│   │   │   │   │           ├── visual-studio-code.component.ts
│   │   │   │   │           └── visual-studio-code.module.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── components/
│   │   │   │   │   ├── angular-routes/
│   │   │   │   │   │   ├── angular-routes.component.html
│   │   │   │   │   │   ├── angular-routes.component.scss
│   │   │   │   │   │   ├── angular-routes.component.ts
│   │   │   │   │   │   └── angular-routes.module.ts
│   │   │   │   │   ├── angular-test-runner/
│   │   │   │   │   │   ├── angular-test-runner.component.css
│   │   │   │   │   │   ├── angular-test-runner.component.html
│   │   │   │   │   │   ├── angular-test-runner.component.ts
│   │   │   │   │   │   └── tests.ts
│   │   │   │   │   ├── babel-test-runner/
│   │   │   │   │   │   ├── babel-helpers.ts
│   │   │   │   │   │   ├── babel-test-runner.component.css
│   │   │   │   │   │   ├── babel-test-runner.component.html
│   │   │   │   │   │   └── babel-test-runner.component.ts
│   │   │   │   │   ├── breadcrumb/
│   │   │   │   │   │   ├── breadcrumb.component.css
│   │   │   │   │   │   ├── breadcrumb.component.html
│   │   │   │   │   │   ├── breadcrumb.component.spec.ts
│   │   │   │   │   │   └── breadcrumb.component.ts
│   │   │   │   │   ├── buttons-nav-bar/
│   │   │   │   │   │   ├── buttons-nav-bar.component.html
│   │   │   │   │   │   ├── buttons-nav-bar.component.scss
│   │   │   │   │   │   ├── buttons-nav-bar.component.ts
│   │   │   │   │   │   ├── buttons-nav-bar.module.ts
│   │   │   │   │   │   ├── menu-fullscreen-widget/
│   │   │   │   │   │   │   ├── menu-fullscreen-widget.component.html
│   │   │   │   │   │   │   ├── menu-fullscreen-widget.component.scss
│   │   │   │   │   │   │   ├── menu-fullscreen-widget.component.spec.ts
│   │   │   │   │   │   │   └── menu-fullscreen-widget.component.ts
│   │   │   │   │   │   ├── menu-github-widget/
│   │   │   │   │   │   │   ├── menu-github-widget.component.css
│   │   │   │   │   │   │   ├── menu-github-widget.component.html
│   │   │   │   │   │   │   ├── menu-github-widget.component.ts
│   │   │   │   │   │   │   └── menu-github-widget.module.ts
│   │   │   │   │   │   └── menu-shortcut-widget/
│   │   │   │   │   │       ├── menu-shortcut-widget.component.css
│   │   │   │   │   │       ├── menu-shortcut-widget.component.html
│   │   │   │   │   │       ├── menu-shortcut-widget.component.ts
│   │   │   │   │   │       └── menu-shortcut-widget.module.ts
│   │   │   │   │   ├── codelab-components.module.ts
│   │   │   │   │   ├── codelab-progress-bar/
│   │   │   │   │   │   ├── codelab-progress-bar.component.css
│   │   │   │   │   │   ├── codelab-progress-bar.component.html
│   │   │   │   │   │   └── codelab-progress-bar.component.ts
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── codelab-styles.scss
│   │   │   │   │   ├── exercise/
│   │   │   │   │   │   ├── exercise.component.css
│   │   │   │   │   │   ├── exercise.component.html
│   │   │   │   │   │   └── exercise.component.ts
│   │   │   │   │   ├── exercise-playground/
│   │   │   │   │   │   ├── codelab-exercise-playground.component.css
│   │   │   │   │   │   ├── codelab-exercise-playground.component.html
│   │   │   │   │   │   └── codelab-exercise-playground.component.ts
│   │   │   │   │   ├── exercise-preview/
│   │   │   │   │   │   ├── exercise-preview.component.html
│   │   │   │   │   │   └── exercise-preview.component.ts
│   │   │   │   │   ├── external-link-directive/
│   │   │   │   │   │   ├── external-link-directive.directive.spec.ts
│   │   │   │   │   │   └── external-link-directive.directive.ts
│   │   │   │   │   ├── index/
│   │   │   │   │   │   ├── index.component.html
│   │   │   │   │   │   ├── index.component.scss
│   │   │   │   │   │   ├── index.component.ts
│   │   │   │   │   │   └── index.module.ts
│   │   │   │   │   ├── login/
│   │   │   │   │   │   ├── login.component.css
│   │   │   │   │   │   ├── login.component.html
│   │   │   │   │   │   ├── login.component.spec.ts
│   │   │   │   │   │   ├── login.component.ts
│   │   │   │   │   │   └── login.module.ts
│   │   │   │   │   ├── not-found/
│   │   │   │   │   │   ├── not-found.component.html
│   │   │   │   │   │   ├── not-found.component.scss
│   │   │   │   │   │   ├── not-found.component.ts
│   │   │   │   │   │   └── not-found.module.ts
│   │   │   │   │   ├── slides/
│   │   │   │   │   │   ├── closing-slide/
│   │   │   │   │   │   │   ├── codelab-closing-slide.component.css
│   │   │   │   │   │   │   ├── codelab-closing-slide.component.html
│   │   │   │   │   │   │   ├── codelab-closing-slide.component.spec.ts
│   │   │   │   │   │   │   └── codelab-closing-slide.component.ts
│   │   │   │   │   │   └── title-slide/
│   │   │   │   │   │       ├── ripple-animation/
│   │   │   │   │   │       │   ├── codelab-ripple-animation.component.css
│   │   │   │   │   │       │   ├── codelab-ripple-animation.component.html
│   │   │   │   │   │       │   ├── codelab-ripple-animation.component.spec.ts
│   │   │   │   │   │       │   └── codelab-ripple-animation.component.ts
│   │   │   │   │   │       ├── title-slide.component.css
│   │   │   │   │   │       ├── title-slide.component.html
│   │   │   │   │   │       ├── title-slide.component.spec.ts
│   │   │   │   │   │       └── title-slide.component.ts
│   │   │   │   │   └── slides-preview/
│   │   │   │   │       ├── codelab-preview.component.html
│   │   │   │   │       ├── codelab-preview.component.scss
│   │   │   │   │       └── codelab-preview.component.ts
│   │   │   │   ├── containers/
│   │   │   │   │   ├── full-layout/
│   │   │   │   │   │   ├── full-layout.component.html
│   │   │   │   │   │   ├── full-layout.component.scss
│   │   │   │   │   │   ├── full-layout.component.ts
│   │   │   │   │   │   ├── full-layout.module.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── directives/
│   │   │   │   │   ├── directives.module.ts
│   │   │   │   │   ├── nextSlide.directive.ts
│   │   │   │   │   ├── permissions/
│   │   │   │   │   │   ├── abstract-permission.ts
│   │   │   │   │   │   ├── can-load-admin/
│   │   │   │   │   │   │   └── can-load-admin.directive.ts
│   │   │   │   │   │   └── is-logged-in/
│   │   │   │   │   │       └── is-loggef-in.directive.ts
│   │   │   │   │   └── previousSlide.directive.ts
│   │   │   │   ├── shared/
│   │   │   │   │   ├── angular-code/
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── bootstrap.ts
│   │   │   │   │   │   ├── code.ts
│   │   │   │   │   │   └── index.html
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── codelabFile.ts
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── exercise-config.ts
│   │   │   │   │   │   ├── file-config.ts
│   │   │   │   │   │   └── test-info.ts
│   │   │   │   │   ├── services/
│   │   │   │   │   │   ├── access.service.ts
│   │   │   │   │   │   └── guards/
│   │   │   │   │   │       ├── admin-guard.ts
│   │   │   │   │   │       └── login-guard.ts
│   │   │   │   │   └── shared.module.ts
│   │   │   │   └── sync/
│   │   │   │       ├── sync.component.css
│   │   │   │       ├── sync.component.html
│   │   │   │       ├── sync.component.spec.ts
│   │   │   │       ├── sync.component.ts
│   │   │   │       └── sync.module.ts
│   │   │   ├── assets/
│   │   │   │   └── .gitkeep
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── locale/
│   │   │   │   ├── codelab.ru.xtb
│   │   │   │   └── messages.xmb
│   │   │   ├── main.ts
│   │   │   ├── manifest.webmanifest
│   │   │   ├── polyfills.ts
│   │   │   ├── service-worker.js
│   │   │   ├── styles.scss
│   │   │   ├── test.ts
│   │   │   └── typings.d.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── kirjs/
│   │   ├── browserslist
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.css
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── cv/
│   │   │   │   │   ├── resume.css
│   │   │   │   │   ├── resume.html
│   │   │   │   │   └── resume.scss
│   │   │   │   ├── kirjs.module.ts
│   │   │   │   └── modules/
│   │   │   │       ├── ast/
│   │   │   │       │   ├── ast-preview-runner/
│   │   │   │       │   │   ├── ast-preview-runner.component.css
│   │   │   │       │   │   ├── ast-preview-runner.component.html
│   │   │   │       │   │   ├── ast-preview-runner.component.ts
│   │   │   │       │   │   └── ast-preview-runner.module.ts
│   │   │   │       │   ├── ast.component.css
│   │   │   │       │   ├── ast.component.html
│   │   │   │       │   ├── ast.component.ts
│   │   │   │       │   ├── ast.module.ts
│   │   │   │       │   ├── babel-highlight/
│   │   │   │       │   │   └── babel-highlight-match.directive.ts
│   │   │   │       │   ├── debugger/
│   │   │   │       │   │   ├── debugger.component.css
│   │   │   │       │   │   ├── debugger.component.html
│   │   │   │       │   │   ├── debugger.component.spec.ts
│   │   │   │       │   │   ├── debugger.component.ts
│   │   │   │       │   │   └── debugger.ts
│   │   │   │       │   ├── new-progress-bar/
│   │   │   │       │   │   ├── new-progress-bar.component.css
│   │   │   │       │   │   ├── new-progress-bar.component.html
│   │   │   │       │   │   ├── new-progress-bar.component.ts
│   │   │   │       │   │   └── new-progress-bar.module.ts
│   │   │   │       │   ├── parse-hello-world-ast.ts
│   │   │   │       │   ├── samples/
│   │   │   │       │   │   ├── dec-to-bin-with-semicolons.js
│   │   │   │       │   │   ├── dec-to-bin.js
│   │   │   │       │   │   ├── eslint/
│   │   │   │       │   │   │   ├── eslint.js
│   │   │   │       │   │   │   └── eslint.test.js
│   │   │   │       │   │   ├── find-console-log/
│   │   │   │       │   │   │   ├── find-console-log-babel.solved.ts
│   │   │   │       │   │   │   ├── find-console-log-babel.ts
│   │   │   │       │   │   │   ├── find-console-log-regex.solved.js
│   │   │   │       │   │   │   ├── find-console-log.js
│   │   │   │       │   │   │   ├── find-console-log.test.js
│   │   │   │       │   │   │   ├── remove-console-log.solved.ts
│   │   │   │       │   │   │   ├── remove-console-log.test.js
│   │   │   │       │   │   │   ├── remove-console-log.ts
│   │   │   │       │   │   │   ├── traverse-console-log-babel.solved.ts
│   │   │   │       │   │   │   ├── traverse-console-log-babel.solved2.ts
│   │   │   │       │   │   │   └── traverse-console-log-babel.ts
│   │   │   │       │   │   ├── find-debugger/
│   │   │   │       │   │   │   ├── find-debugger-babel.solved.ts
│   │   │   │       │   │   │   ├── find-debugger-babel.ts
│   │   │   │       │   │   │   ├── find-debugger-regex.solved.js
│   │   │   │       │   │   │   ├── find-debugger.js
│   │   │   │       │   │   │   ├── find-debugger.test.js
│   │   │   │       │   │   │   ├── hint.js
│   │   │   │       │   │   │   ├── remove-debugger.solved.ts
│   │   │   │       │   │   │   ├── remove-debugger.test.js
│   │   │   │       │   │   │   ├── remove-debugger.ts
│   │   │   │       │   │   │   ├── traverse-debugger-babel.solved.ts
│   │   │   │       │   │   │   └── traverse-debugger-babel.ts
│   │   │   │       │   │   ├── find-fit/
│   │   │   │       │   │   │   ├── find-fit.js
│   │   │   │       │   │   │   ├── find-fit.solved.js
│   │   │   │       │   │   │   └── find-fit.test.js
│   │   │   │       │   │   ├── hello-world.json
│   │   │   │       │   │   ├── it-lines/
│   │   │   │       │   │   │   ├── it-lines.js
│   │   │   │       │   │   │   ├── it-lines.solved.js
│   │   │   │       │   │   │   └── it-lines.test.js
│   │   │   │       │   │   └── tricky.js
│   │   │   │       │   ├── size-picker/
│   │   │   │       │   │   ├── size-picker.component.css
│   │   │   │       │   │   ├── size-picker.component.html
│   │   │   │       │   │   ├── size-picker.component.spec.ts
│   │   │   │       │   │   ├── size-picker.component.ts
│   │   │   │       │   │   └── size-picker.module.ts
│   │   │   │       │   └── test-set/
│   │   │   │       │       ├── babel-test-runner/
│   │   │   │       │       │   ├── babel-test-runner.component.css
│   │   │   │       │       │   ├── babel-test-runner.component.html
│   │   │   │       │       │   └── babel-test-runner.component.ts
│   │   │   │       │       ├── test-set.component.css
│   │   │   │       │       ├── test-set.component.html
│   │   │   │       │       ├── test-set.component.spec.ts
│   │   │   │       │       └── test-set.component.ts
│   │   │   │       ├── binary/
│   │   │   │       │   ├── angular-flags/
│   │   │   │       │   │   ├── angular-flags.component.css
│   │   │   │       │   │   ├── angular-flags.component.html
│   │   │   │       │   │   ├── angular-flags.component.spec.ts
│   │   │   │       │   │   └── angular-flags.component.ts
│   │   │   │       │   ├── ascii/
│   │   │   │       │   │   ├── ascii.component.css
│   │   │   │       │   │   ├── ascii.component.html
│   │   │   │       │   │   ├── ascii.component.spec.ts
│   │   │   │       │   │   └── ascii.component.ts
│   │   │   │       │   ├── binary-flat/
│   │   │   │       │   │   ├── binary-flat.component.css
│   │   │   │       │   │   ├── binary-flat.component.html
│   │   │   │       │   │   ├── binary-flat.component.spec.ts
│   │   │   │       │   │   └── binary-flat.component.ts
│   │   │   │       │   ├── binary-gif/
│   │   │   │       │   │   ├── binary-gif.component.css
│   │   │   │       │   │   ├── binary-gif.component.html
│   │   │   │       │   │   ├── binary-gif.component.spec.ts
│   │   │   │       │   │   └── binary-gif.component.ts
│   │   │   │       │   ├── binary-inline/
│   │   │   │       │   │   ├── binary-display/
│   │   │   │       │   │   │   ├── binary-display.component.css
│   │   │   │       │   │   │   ├── binary-display.component.html
│   │   │   │       │   │   │   ├── binary-display.component.spec.ts
│   │   │   │       │   │   │   └── binary-display.component.ts
│   │   │   │       │   │   ├── binary-inline.component.css
│   │   │   │       │   │   ├── binary-inline.component.html
│   │   │   │       │   │   ├── binary-inline.component.spec.ts
│   │   │   │       │   │   ├── binary-inline.component.ts
│   │   │   │       │   │   └── binary-inline.module.ts
│   │   │   │       │   ├── binary-parser-demo/
│   │   │   │       │   │   ├── binary-parser-demo.component.css
│   │   │   │       │   │   ├── binary-parser-demo.component.html
│   │   │   │       │   │   ├── binary-parser-demo.component.spec.ts
│   │   │   │       │   │   └── binary-parser-demo.component.ts
│   │   │   │       │   ├── binary-plain/
│   │   │   │       │   │   ├── binary-plain.component.css
│   │   │   │       │   │   ├── binary-plain.component.html
│   │   │   │       │   │   ├── binary-plain.component.spec.ts
│   │   │   │       │   │   └── binary-plain.component.ts
│   │   │   │       │   ├── binary-view/
│   │   │   │       │   │   ├── array/
│   │   │   │       │   │   │   ├── array.component.css
│   │   │   │       │   │   │   ├── array.component.html
│   │   │   │       │   │   │   ├── array.component.spec.ts
│   │   │   │       │   │   │   └── array.component.ts
│   │   │   │       │   │   ├── binary-parent/
│   │   │   │       │   │   │   ├── binary-parent.component.html
│   │   │   │       │   │   │   ├── binary-parent.component.scss
│   │   │   │       │   │   │   ├── binary-parent.component.spec.ts
│   │   │   │       │   │   │   └── binary-parent.component.ts
│   │   │   │       │   │   ├── binary-view.module.ts
│   │   │   │       │   │   ├── bits/
│   │   │   │       │   │   │   ├── bits.component.css
│   │   │   │       │   │   │   ├── bits.component.html
│   │   │   │       │   │   │   ├── bits.component.spec.ts
│   │   │   │       │   │   │   └── bits.component.ts
│   │   │   │       │   │   ├── block/
│   │   │   │       │   │   │   ├── block.component.css
│   │   │   │       │   │   │   ├── block.component.html
│   │   │   │       │   │   │   ├── block.component.spec.ts
│   │   │   │       │   │   │   └── block.component.ts
│   │   │   │       │   │   ├── color/
│   │   │   │       │   │   │   ├── color.component.css
│   │   │   │       │   │   │   ├── color.component.html
│   │   │   │       │   │   │   ├── color.component.spec.ts
│   │   │   │       │   │   │   └── color.component.ts
│   │   │   │       │   │   ├── hex/
│   │   │   │       │   │   │   ├── hex.component.css
│   │   │   │       │   │   │   ├── hex.component.html
│   │   │   │       │   │   │   ├── hex.component.spec.ts
│   │   │   │       │   │   │   └── hex.component.ts
│   │   │   │       │   │   ├── inline/
│   │   │   │       │   │   │   ├── inline.component.css
│   │   │   │       │   │   │   ├── inline.component.html
│   │   │   │       │   │   │   ├── inline.component.spec.ts
│   │   │   │       │   │   │   └── inline.component.ts
│   │   │   │       │   │   ├── inline-root/
│   │   │   │       │   │   │   ├── inline-root.component.css
│   │   │   │       │   │   │   ├── inline-root.component.html
│   │   │   │       │   │   │   ├── inline-root.component.spec.ts
│   │   │   │       │   │   │   └── inline-root.component.ts
│   │   │   │       │   │   ├── number/
│   │   │   │       │   │   │   ├── number.component.css
│   │   │   │       │   │   │   ├── number.component.html
│   │   │   │       │   │   │   ├── number.component.spec.ts
│   │   │   │       │   │   │   └── number.component.ts
│   │   │   │       │   │   ├── object/
│   │   │   │       │   │   │   ├── object.component.css
│   │   │   │       │   │   │   ├── object.component.html
│   │   │   │       │   │   │   ├── object.component.spec.ts
│   │   │   │       │   │   │   └── object.component.ts
│   │   │   │       │   │   └── string/
│   │   │   │       │   │       ├── string.component.css
│   │   │   │       │   │       ├── string.component.html
│   │   │   │       │   │       ├── string.component.spec.ts
│   │   │   │       │   │       └── string.component.ts
│   │   │   │       │   ├── binary.component.html
│   │   │   │       │   ├── binary.component.scss
│   │   │   │       │   ├── binary.component.ts
│   │   │   │       │   ├── binary.module.ts
│   │   │   │       │   ├── bindec/
│   │   │   │       │   │   ├── bindec.component.css
│   │   │   │       │   │   ├── bindec.component.html
│   │   │   │       │   │   ├── bindec.component.spec.ts
│   │   │   │       │   │   └── bindec.component.ts
│   │   │   │       │   ├── bit/
│   │   │   │       │   │   ├── bit.component.css
│   │   │   │       │   │   ├── bit.component.html
│   │   │   │       │   │   ├── bit.component.spec.ts
│   │   │   │       │   │   └── bit.component.ts
│   │   │   │       │   ├── bitwise/
│   │   │   │       │   │   ├── bitwise.component.css
│   │   │   │       │   │   ├── bitwise.component.html
│   │   │   │       │   │   ├── bitwise.component.spec.ts
│   │   │   │       │   │   └── bitwise.component.ts
│   │   │   │       │   ├── color-indexing/
│   │   │   │       │   │   ├── color-indexing.component.css
│   │   │   │       │   │   ├── color-indexing.component.html
│   │   │   │       │   │   ├── color-indexing.component.spec.ts
│   │   │   │       │   │   └── color-indexing.component.ts
│   │   │   │       │   ├── compare/
│   │   │   │       │   │   ├── compare.component.css
│   │   │   │       │   │   ├── compare.component.html
│   │   │   │       │   │   ├── compare.component.spec.ts
│   │   │   │       │   │   └── compare.component.ts
│   │   │   │       │   ├── fake-gif/
│   │   │   │       │   │   ├── fake-gif.component.css
│   │   │   │       │   │   ├── fake-gif.component.html
│   │   │   │       │   │   ├── fake-gif.component.spec.ts
│   │   │   │       │   │   ├── fake-gif.component.ts
│   │   │   │       │   │   ├── gif-parser.ts
│   │   │   │       │   │   └── gif.ts
│   │   │   │       │   ├── gif-palette/
│   │   │   │       │   │   ├── gif-palette.component.css
│   │   │   │       │   │   ├── gif-palette.component.html
│   │   │   │       │   │   ├── gif-palette.component.spec.ts
│   │   │   │       │   │   └── gif-palette.component.ts
│   │   │   │       │   ├── hexdec/
│   │   │   │       │   │   ├── hexdec.component.css
│   │   │   │       │   │   ├── hexdec.component.html
│   │   │   │       │   │   ├── hexdec.component.spec.ts
│   │   │   │       │   │   └── hexdec.component.ts
│   │   │   │       │   ├── html-post/
│   │   │   │       │   │   ├── html-post.component.css
│   │   │   │       │   │   ├── html-post.component.html
│   │   │   │       │   │   ├── html-post.component.spec.ts
│   │   │   │       │   │   └── html-post.component.ts
│   │   │   │       │   ├── json/
│   │   │   │       │   │   ├── json.component.html
│   │   │   │       │   │   ├── json.component.scss
│   │   │   │       │   │   ├── json.component.spec.ts
│   │   │   │       │   │   └── json.component.ts
│   │   │   │       │   ├── memory/
│   │   │   │       │   │   ├── memory.component.css
│   │   │   │       │   │   ├── memory.component.html
│   │   │   │       │   │   ├── memory.component.spec.ts
│   │   │   │       │   │   └── memory.component.ts
│   │   │   │       │   ├── message/
│   │   │   │       │   │   ├── message.component.css
│   │   │   │       │   │   ├── message.component.html
│   │   │   │       │   │   ├── message.component.spec.ts
│   │   │   │       │   │   └── message.component.ts
│   │   │   │       │   ├── midi/
│   │   │   │       │   │   ├── midi.component.css
│   │   │   │       │   │   ├── midi.component.html
│   │   │   │       │   │   ├── midi.component.spec.ts
│   │   │   │       │   │   └── midi.component.ts
│   │   │   │       │   ├── parser/
│   │   │   │       │   │   ├── binary-parser.spec.ts
│   │   │   │       │   │   ├── binary-parser.ts
│   │   │   │       │   │   ├── parsers/
│   │   │   │       │   │   │   ├── abstract-parser.ts
│   │   │   │       │   │   │   ├── array-parser.spec.ts
│   │   │   │       │   │   │   ├── array-parser.ts
│   │   │   │       │   │   │   ├── bit-parser.spec.ts
│   │   │   │       │   │   │   ├── bit-parser.ts
│   │   │   │       │   │   │   ├── choice-parser.spec.ts
│   │   │   │       │   │   │   ├── choice-parser.ts
│   │   │   │       │   │   │   ├── common.ts
│   │   │   │       │   │   │   ├── debugger-parser.ts
│   │   │   │       │   │   │   ├── first-bit-parser.spec.ts
│   │   │   │       │   │   │   ├── object-parser.spec.ts
│   │   │   │       │   │   │   ├── object-parser.ts
│   │   │   │       │   │   │   ├── string-parser.spec.ts
│   │   │   │       │   │   │   ├── string-parser.ts
│   │   │   │       │   │   │   └── var-uint-parser.ts
│   │   │   │       │   │   ├── readers/
│   │   │   │       │   │   │   ├── abstract-reader.ts
│   │   │   │       │   │   │   └── string-reader.ts
│   │   │   │       │   │   └── utils.ts
│   │   │   │       │   ├── shared.ts
│   │   │   │       │   └── to-read/
│   │   │   │       │       ├── to-read.component.css
│   │   │   │       │       ├── to-read.component.html
│   │   │   │       │       ├── to-read.component.spec.ts
│   │   │   │       │       └── to-read.component.ts
│   │   │   │       ├── cellular-automation/
│   │   │   │       │   ├── board/
│   │   │   │       │   │   ├── board.component.css
│   │   │   │       │   │   ├── board.component.html
│   │   │   │       │   │   ├── board.component.spec.ts
│   │   │   │       │   │   └── board.component.ts
│   │   │   │       │   ├── cellular-automation-routing.module.ts
│   │   │   │       │   ├── cellular-automation.component.css
│   │   │   │       │   ├── cellular-automation.component.html
│   │   │   │       │   ├── cellular-automation.component.ts
│   │   │   │       │   ├── cellular-automation.module.ts
│   │   │   │       │   ├── oscilators/
│   │   │   │       │   │   ├── oscilators.component.css
│   │   │   │       │   │   ├── oscilators.component.html
│   │   │   │       │   │   ├── oscilators.component.spec.ts
│   │   │   │       │   │   └── oscilators.component.ts
│   │   │   │       │   ├── rule/
│   │   │   │       │   │   ├── rule.component.css
│   │   │   │       │   │   ├── rule.component.html
│   │   │   │       │   │   ├── rule.component.spec.ts
│   │   │   │       │   │   └── rule.component.ts
│   │   │   │       │   ├── rule3/
│   │   │   │       │   │   ├── rule3.component.css
│   │   │   │       │   │   ├── rule3.component.html
│   │   │   │       │   │   ├── rule3.component.ts
│   │   │   │       │   │   └── rule4/
│   │   │   │       │   │       ├── rule4.component.css
│   │   │   │       │   │       ├── rule4.component.html
│   │   │   │       │   │       ├── rule4.component.spec.ts
│   │   │   │       │   │       └── rule4.component.ts
│   │   │   │       │   └── rule8/
│   │   │   │       │       ├── rule8.component.css
│   │   │   │       │       ├── rule8.component.html
│   │   │   │       │       └── rule8.component.ts
│   │   │   │       ├── gomoku/
│   │   │   │       │   ├── board/
│   │   │   │       │   │   ├── board.component.html
│   │   │   │       │   │   ├── board.component.scss
│   │   │   │       │   │   ├── board.component.spec.ts
│   │   │   │       │   │   ├── board.component.ts
│   │   │   │       │   │   └── board.module.ts
│   │   │   │       │   ├── gomoku.component.css
│   │   │   │       │   ├── gomoku.component.html
│   │   │   │       │   ├── gomoku.component.ts
│   │   │   │       │   ├── gomoku.module.ts
│   │   │   │       │   ├── highlights.spec.ts
│   │   │   │       │   ├── highlights.ts
│   │   │   │       │   ├── renlib/
│   │   │   │       │   │   ├── I7.lib
│   │   │   │       │   │   ├── lines.lib
│   │   │   │       │   │   ├── moves.json
│   │   │   │       │   │   ├── parse.js
│   │   │   │       │   │   ├── ss.lib
│   │   │   │       │   │   └── test.lib
│   │   │   │       │   └── tools/
│   │   │   │       │       ├── tools.component.css
│   │   │   │       │       ├── tools.component.html
│   │   │   │       │       ├── tools.component.spec.ts
│   │   │   │       │       └── tools.component.ts
│   │   │   │       ├── gomoku-print/
│   │   │   │       │   ├── gomoku-print.component.css
│   │   │   │       │   ├── gomoku-print.component.html
│   │   │   │       │   ├── gomoku-print.component.ts
│   │   │   │       │   ├── gomoku-print.module.ts
│   │   │   │       │   ├── o/
│   │   │   │       │   │   ├── o.component.css
│   │   │   │       │   │   ├── o.component.html
│   │   │   │       │   │   ├── o.component.spec.ts
│   │   │   │       │   │   └── o.component.ts
│   │   │   │       │   └── x/
│   │   │   │       │       ├── x.component.css
│   │   │   │       │       ├── x.component.html
│   │   │   │       │       ├── x.component.spec.ts
│   │   │   │       │       └── x.component.ts
│   │   │   │       ├── home/
│   │   │   │       │   ├── home.component.css
│   │   │   │       │   ├── home.component.html
│   │   │   │       │   ├── home.component.spec.ts
│   │   │   │       │   ├── home.component.ts
│   │   │   │       │   ├── home.module.spec.ts
│   │   │   │       │   ├── home.module.ts
│   │   │   │       │   └── polaroid/
│   │   │   │       │       ├── polaroid.component.css
│   │   │   │       │       ├── polaroid.component.html
│   │   │   │       │       ├── polaroid.component.spec.ts
│   │   │   │       │       └── polaroid.component.ts
│   │   │   │       ├── msk/
│   │   │   │       │   ├── msk.component.css
│   │   │   │       │   ├── msk.component.html
│   │   │   │       │   ├── msk.component.spec.ts
│   │   │   │       │   ├── msk.component.ts
│   │   │   │       │   └── msk.module.ts
│   │   │   │       ├── music/
│   │   │   │       │   ├── music.component.css
│   │   │   │       │   ├── music.component.html
│   │   │   │       │   ├── music.component.spec.ts
│   │   │   │       │   ├── music.component.ts
│   │   │   │       │   └── music.module.ts
│   │   │   │       ├── qna/
│   │   │   │       │   ├── qna.component.css
│   │   │   │       │   ├── qna.component.html
│   │   │   │       │   ├── qna.component.spec.ts
│   │   │   │       │   ├── qna.component.ts
│   │   │   │       │   └── qna.module.ts
│   │   │   │       ├── regex/
│   │   │   │       │   ├── live/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── live-mock/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   ├── live-mock.component.css
│   │   │   │       │   │   │   ├── live-mock.component.html
│   │   │   │       │   │   │   ├── live-mock.component.spec.ts
│   │   │   │       │   │   │   ├── live-mock.component.ts
│   │   │   │       │   │   │   └── live-mock.module.ts
│   │   │   │       │   │   ├── live.module.ts
│   │   │   │       │   │   ├── live.service.spec.ts
│   │   │   │       │   │   ├── live.service.ts
│   │   │   │       │   │   └── poll/
│   │   │   │       │   │       ├── index.ts
│   │   │   │       │   │       ├── poll.component.css
│   │   │   │       │   │       ├── poll.component.html
│   │   │   │       │   │       ├── poll.component.spec.ts
│   │   │   │       │   │       ├── poll.component.ts
│   │   │   │       │   │       └── poll.module.ts
│   │   │   │       │   ├── regex.component.css
│   │   │   │       │   ├── regex.component.html
│   │   │   │       │   ├── regex.component.spec.ts
│   │   │   │       │   ├── regex.component.ts
│   │   │   │       │   └── regex.module.ts
│   │   │   │       ├── stack/
│   │   │   │       │   ├── simple-stack/
│   │   │   │       │   │   ├── simple-stack.component.css
│   │   │   │       │   │   ├── simple-stack.component.html
│   │   │   │       │   │   ├── simple-stack.component.spec.ts
│   │   │   │       │   │   └── simple-stack.component.ts
│   │   │   │       │   ├── stack-game/
│   │   │   │       │   │   ├── stack-function/
│   │   │   │       │   │   │   ├── stack-function.component.css
│   │   │   │       │   │   │   ├── stack-function.component.html
│   │   │   │       │   │   │   ├── stack-function.component.spec.ts
│   │   │   │       │   │   │   └── stack-function.component.ts
│   │   │   │       │   │   ├── stack-function-button/
│   │   │   │       │   │   │   ├── stack-function-button.component.css
│   │   │   │       │   │   │   ├── stack-function-button.component.html
│   │   │   │       │   │   │   ├── stack-function-button.component.spec.ts
│   │   │   │       │   │   │   └── stack-function-button.component.ts
│   │   │   │       │   │   ├── stack-game.component.css
│   │   │   │       │   │   ├── stack-game.component.html
│   │   │   │       │   │   ├── stack-game.component.spec.ts
│   │   │   │       │   │   └── stack-game.component.ts
│   │   │   │       │   ├── stack-routing.module.ts
│   │   │   │       │   ├── stack-test/
│   │   │   │       │   │   ├── stack-test.component.html
│   │   │   │       │   │   ├── stack-test.component.scss
│   │   │   │       │   │   ├── stack-test.component.spec.ts
│   │   │   │       │   │   └── stack-test.component.ts
│   │   │   │       │   ├── stack.component.css
│   │   │   │       │   ├── stack.component.html
│   │   │   │       │   ├── stack.component.spec.ts
│   │   │   │       │   ├── stack.component.ts
│   │   │   │       │   └── stack.module.ts
│   │   │   │       ├── streaming/
│   │   │   │       │   ├── common.ts
│   │   │   │       │   ├── overlay/
│   │   │   │       │   │   ├── overlay.component.html
│   │   │   │       │   │   ├── overlay.component.scss
│   │   │   │       │   │   ├── overlay.component.spec.ts
│   │   │   │       │   │   └── overlay.component.ts
│   │   │   │       │   └── streaming.module.ts
│   │   │   │       ├── svg/
│   │   │   │       │   ├── samples/
│   │   │   │       │   │   ├── app.component.ts
│   │   │   │       │   │   ├── app.module.ts
│   │   │   │       │   │   ├── attr/
│   │   │   │       │   │   │   └── app.component.ts
│   │   │   │       │   │   ├── bs.module.ts
│   │   │   │       │   │   ├── chart/
│   │   │   │       │   │   │   └── app.component.ts
│   │   │   │       │   │   ├── chart2/
│   │   │   │       │   │   │   ├── app.component.solved.ts
│   │   │   │       │   │   │   ├── app.component.ts
│   │   │   │       │   │   │   ├── app.module.ts
│   │   │   │       │   │   │   └── ticks.component.ts
│   │   │   │       │   │   ├── chart3/
│   │   │   │       │   │   │   ├── app.component.ts
│   │   │   │       │   │   │   ├── app.module.ts
│   │   │   │       │   │   │   └── ticks.component.ts
│   │   │   │       │   │   ├── chart4/
│   │   │   │       │   │   │   ├── app.component.solved.ts
│   │   │   │       │   │   │   ├── app.component.ts
│   │   │   │       │   │   │   ├── app.module.ts
│   │   │   │       │   │   │   └── ticks.component.ts
│   │   │   │       │   │   ├── index.html
│   │   │   │       │   │   ├── style.css
│   │   │   │       │   │   ├── sub.component.ts
│   │   │   │       │   │   └── svg/
│   │   │   │       │   │       └── app.component.ts
│   │   │   │       │   ├── svg-demo/
│   │   │   │       │   │   ├── svg-demo.component.css
│   │   │   │       │   │   ├── svg-demo.component.html
│   │   │   │       │   │   ├── svg-demo.component.spec.ts
│   │   │   │       │   │   └── svg-demo.component.ts
│   │   │   │       │   ├── svg-playground/
│   │   │   │       │   │   ├── svg-playground.component.css
│   │   │   │       │   │   ├── svg-playground.component.html
│   │   │   │       │   │   ├── svg-playground.component.spec.ts
│   │   │   │       │   │   └── svg-playground.component.ts
│   │   │   │       │   ├── svg-together/
│   │   │   │       │   │   ├── svg-together.component.css
│   │   │   │       │   │   ├── svg-together.component.html
│   │   │   │       │   │   ├── svg-together.component.spec.ts
│   │   │   │       │   │   └── svg-together.component.ts
│   │   │   │       │   ├── svg-together-result/
│   │   │   │       │   │   ├── svg-together-result.component.css
│   │   │   │       │   │   ├── svg-together-result.component.html
│   │   │   │       │   │   ├── svg-together-result.component.spec.ts
│   │   │   │       │   │   └── svg-together-result.component.ts
│   │   │   │       │   ├── svg.component.css
│   │   │   │       │   ├── svg.component.html
│   │   │   │       │   ├── svg.component.ts
│   │   │   │       │   ├── svg.module.ts
│   │   │   │       │   └── timer/
│   │   │   │       │       ├── timer.component.css
│   │   │   │       │       ├── timer.component.html
│   │   │   │       │       ├── timer.component.spec.ts
│   │   │   │       │       └── timer.component.ts
│   │   │   │       ├── svg-race/
│   │   │   │       │   ├── finish/
│   │   │   │       │   │   ├── finish.component.css
│   │   │   │       │   │   ├── finish.component.html
│   │   │   │       │   │   ├── finish.component.spec.ts
│   │   │   │       │   │   └── finish.component.ts
│   │   │   │       │   ├── little-car/
│   │   │   │       │   │   ├── little-car.component.css
│   │   │   │       │   │   ├── little-car.component.html
│   │   │   │       │   │   ├── little-car.component.spec.ts
│   │   │   │       │   │   └── little-car.component.ts
│   │   │   │       │   ├── player/
│   │   │   │       │   │   ├── player.component.css
│   │   │   │       │   │   ├── player.component.html
│   │   │   │       │   │   ├── player.component.spec.ts
│   │   │   │       │   │   └── player.component.ts
│   │   │   │       │   ├── race/
│   │   │   │       │   │   ├── race.component.css
│   │   │   │       │   │   ├── race.component.html
│   │   │   │       │   │   ├── race.component.spec.ts
│   │   │   │       │   │   └── race.component.ts
│   │   │   │       │   ├── svg-race.component.css
│   │   │   │       │   ├── svg-race.component.html
│   │   │   │       │   ├── svg-race.component.ts
│   │   │   │       │   ├── svg-race.module.ts
│   │   │   │       │   └── timer/
│   │   │   │       │       ├── timer.component.css
│   │   │   │       │       ├── timer.component.html
│   │   │   │       │       ├── timer.component.spec.ts
│   │   │   │       │       └── timer.component.ts
│   │   │   │       ├── sync/
│   │   │   │       │   ├── sync.component.css
│   │   │   │       │   ├── sync.component.html
│   │   │   │       │   ├── sync.component.spec.ts
│   │   │   │       │   ├── sync.component.ts
│   │   │   │       │   └── sync.module.ts
│   │   │   │       ├── test/
│   │   │   │       │   ├── test.component.css
│   │   │   │       │   ├── test.component.html
│   │   │   │       │   ├── test.component.spec.ts
│   │   │   │       │   ├── test.component.ts
│   │   │   │       │   └── test.module.ts
│   │   │   │       └── webassembly/
│   │   │   │           ├── ca/
│   │   │   │           │   ├── ca.module.ts
│   │   │   │           │   ├── single-cell/
│   │   │   │           │   │   ├── single-cell.component.css
│   │   │   │           │   │   ├── single-cell.component.html
│   │   │   │           │   │   ├── single-cell.component.spec.ts
│   │   │   │           │   │   └── single-cell.component.ts
│   │   │   │           │   └── single-grid/
│   │   │   │           │       ├── single-grid.component.css
│   │   │   │           │       ├── single-grid.component.html
│   │   │   │           │       ├── single-grid.component.spec.ts
│   │   │   │           │       └── single-grid.component.ts
│   │   │   │           ├── full-screen-runner/
│   │   │   │           │   ├── full-screen-runner.component.css
│   │   │   │           │   ├── full-screen-runner.component.html
│   │   │   │           │   ├── full-screen-runner.component.spec.ts
│   │   │   │           │   ├── full-screen-runner.component.ts
│   │   │   │           │   └── full-screen-runner.module.ts
│   │   │   │           ├── monaco-wat.ts
│   │   │   │           ├── samples/
│   │   │   │           │   ├── answer.wat
│   │   │   │           │   ├── base.js
│   │   │   │           │   ├── base.wat
│   │   │   │           │   └── old.wat
│   │   │   │           ├── tests/
│   │   │   │           │   ├── add-tests.ts
│   │   │   │           │   ├── common.ts
│   │   │   │           │   ├── disable-tests.ts
│   │   │   │           │   ├── enable-tests.ts
│   │   │   │           │   ├── evolve-cell.ts
│   │   │   │           │   ├── evolve-row.ts
│   │   │   │           │   ├── evolve.ts
│   │   │   │           │   ├── get-cell-score.ts
│   │   │   │           │   ├── get-index.ts
│   │   │   │           │   ├── load-cell.ts
│   │   │   │           │   ├── load-previous-cell.ts
│   │   │   │           │   ├── rotate.ts
│   │   │   │           │   ├── shift-tests.ts
│   │   │   │           │   └── store-cell-tests.ts
│   │   │   │           ├── utils.spec.ts
│   │   │   │           ├── utils.ts
│   │   │   │           ├── wasm-binary/
│   │   │   │           │   ├── test._wasm
│   │   │   │           │   ├── wasm-binary.component.css
│   │   │   │           │   ├── wasm-binary.component.html
│   │   │   │           │   ├── wasm-binary.component.spec.ts
│   │   │   │           │   ├── wasm-binary.component.ts
│   │   │   │           │   └── wasm-parser.ts
│   │   │   │           ├── webassembly-playground/
│   │   │   │           │   ├── error-message/
│   │   │   │           │   │   ├── error-message.component.css
│   │   │   │           │   │   ├── error-message.component.html
│   │   │   │           │   │   ├── error-message.component.spec.ts
│   │   │   │           │   │   └── error-message.component.ts
│   │   │   │           │   ├── monaco-directives/
│   │   │   │           │   │   ├── common.ts
│   │   │   │           │   │   ├── monaco-js-position.directive.ts
│   │   │   │           │   │   ├── monaco-load-answer.directive.ts
│   │   │   │           │   │   ├── monaco-scrolling.directive.ts
│   │   │   │           │   │   ├── monaco-wat-position.directive.spec.ts
│   │   │   │           │   │   └── monaco-wat-position.directive.ts
│   │   │   │           │   ├── runners/
│   │   │   │           │   │   └── wasm-test-runner/
│   │   │   │           │   │       ├── runner.js
│   │   │   │           │   │       ├── wasm-test-runner.component.html
│   │   │   │           │   │       ├── wasm-test-runner.component.scss
│   │   │   │           │   │       ├── wasm-test-runner.component.spec.ts
│   │   │   │           │   │       └── wasm-test-runner.component.ts
│   │   │   │           │   ├── viz/
│   │   │   │           │   │   ├── grid/
│   │   │   │           │   │   │   ├── grid.component.css
│   │   │   │           │   │   │   ├── grid.component.html
│   │   │   │           │   │   │   ├── grid.component.spec.ts
│   │   │   │           │   │   │   └── grid.component.ts
│   │   │   │           │   │   ├── viz.component.css
│   │   │   │           │   │   ├── viz.component.html
│   │   │   │           │   │   ├── viz.component.spec.ts
│   │   │   │           │   │   ├── viz.component.ts
│   │   │   │           │   │   └── viz.module.ts
│   │   │   │           │   ├── wasm-contents/
│   │   │   │           │   │   ├── wasm-contents.component.css
│   │   │   │           │   │   ├── wasm-contents.component.html
│   │   │   │           │   │   ├── wasm-contents.component.spec.ts
│   │   │   │           │   │   └── wasm-contents.component.ts
│   │   │   │           │   ├── web-assembly.service.spec.ts
│   │   │   │           │   ├── web-assembly.service.ts
│   │   │   │           │   ├── webassembly-code-mode/
│   │   │   │           │   │   ├── webassembly-code-mode.component.css
│   │   │   │           │   │   ├── webassembly-code-mode.component.html
│   │   │   │           │   │   ├── webassembly-code-mode.component.spec.ts
│   │   │   │           │   │   └── webassembly-code-mode.component.ts
│   │   │   │           │   ├── webassembly-playground.component.html
│   │   │   │           │   ├── webassembly-playground.component.scss
│   │   │   │           │   ├── webassembly-playground.component.spec.ts
│   │   │   │           │   ├── webassembly-playground.component.ts
│   │   │   │           │   └── webassembly-runner/
│   │   │   │           │       ├── webassembly-runner.component.css
│   │   │   │           │       ├── webassembly-runner.component.html
│   │   │   │           │       ├── webassembly-runner.component.spec.ts
│   │   │   │           │       ├── webassembly-runner.component.ts
│   │   │   │           │       └── webassembly-runner.module.ts
│   │   │   │           ├── webassembly.component.html
│   │   │   │           ├── webassembly.component.scss
│   │   │   │           ├── webassembly.component.spec.ts
│   │   │   │           ├── webassembly.component.ts
│   │   │   │           └── webassembly.module.ts
│   │   │   ├── assets/
│   │   │   │   ├── .gitkeep
│   │   │   │   └── runner/
│   │   │   │       └── index.html
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── locale/
│   │   │   │   ├── kirjs.ru.xtb
│   │   │   │   └── messages.xmb
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.css
│   │   │   └── test.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── lis/
│   │   ├── browserslist
│   │   ├── jest.config.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.component.css
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   ├── app.module.ts
│   │   │   │   └── modules/
│   │   │   │       └── rxjs/
│   │   │   │           ├── rxjs.component.css
│   │   │   │           ├── rxjs.component.html
│   │   │   │           ├── rxjs.component.spec.ts
│   │   │   │           ├── rxjs.component.ts
│   │   │   │           └── rxjs.module.ts
│   │   │   ├── assets/
│   │   │   │   └── .gitkeep
│   │   │   ├── environments/
│   │   │   │   ├── environment.prod.ts
│   │   │   │   └── environment.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── polyfills.ts
│   │   │   ├── styles.css
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   └── playground/
│       ├── browserslist
│       ├── jest.config.js
│       ├── src/
│       │   ├── app/
│       │   │   ├── app.component.html
│       │   │   ├── app.component.scss
│       │   │   ├── app.component.spec.ts
│       │   │   ├── app.component.ts
│       │   │   ├── app.module.ts
│       │   │   ├── code-sync/
│       │   │   │   ├── code-sync.component.css
│       │   │   │   ├── code-sync.component.html
│       │   │   │   ├── code-sync.component.spec.ts
│       │   │   │   ├── code-sync.component.ts
│       │   │   │   └── code-sync.module.ts
│       │   │   └── playground/
│       │   │       ├── angular-sample.ts
│       │   │       ├── playground.component.css
│       │   │       ├── playground.component.html
│       │   │       ├── playground.component.spec.ts
│       │   │       ├── playground.component.ts
│       │   │       └── playground.module.ts
│       │   ├── assets/
│       │   │   └── .gitkeep
│       │   ├── environments/
│       │   │   ├── environment.prod.ts
│       │   │   └── environment.ts
│       │   ├── index.html
│       │   ├── main.ts
│       │   ├── polyfills.ts
│       │   ├── styles.scss
│       │   └── test-setup.ts
│       ├── tsconfig.app.json
│       ├── tsconfig.json
│       ├── tsconfig.spec.json
│       └── tslint.json
├── create-issue.js
├── cypress/
│   ├── fixtures/
│   │   └── example.json
│   ├── integration/
│   │   └── codelab/
│   │       └── home.spec.js
│   ├── plugins/
│   │   ├── cy-ts-preprocessor.js
│   │   └── index.js
│   ├── support/
│   │   ├── commands.js
│   │   └── index.js
│   └── tsconfig.json
├── cypress.json
├── docs/
│   ├── CONTRIBUTING.md
│   ├── HOSTING.md
│   └── TRANSLATING.md
├── firebase.json
├── jest.config.js
├── libs/
│   ├── angular-ast-viz/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── angular-ast-viz.module.spec.ts
│   │   │   │   ├── angular-ast-viz.module.ts
│   │   │   │   ├── app.component.css
│   │   │   │   ├── app.component.html
│   │   │   │   ├── app.component.spec.ts
│   │   │   │   ├── app.component.ts
│   │   │   │   └── ast-tree/
│   │   │   │       ├── ast-tree.component.css
│   │   │   │       ├── ast-tree.component.html
│   │   │   │       ├── ast-tree.component.spec.ts
│   │   │   │       ├── ast-tree.component.ts
│   │   │   │       ├── ast-tree.module.ts
│   │   │   │       ├── short-name-babel.pipe.spec.ts
│   │   │   │       └── short-name-babel.pipe.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── angular-slides-to-pdf/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── angular-slides-to-pdf.component.ts
│   │   │   │   ├── angular-slides-to-pdf.module.spec.ts
│   │   │   │   └── angular-slides-to-pdf.module.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── browser/
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── browser-window/
│   │   │   │   │   ├── browser-window.component.css
│   │   │   │   │   ├── browser-window.component.html
│   │   │   │   │   └── browser-window.component.ts
│   │   │   │   ├── browser.module.ts
│   │   │   │   ├── preview-window/
│   │   │   │   │   ├── preview-window.component.html
│   │   │   │   │   ├── preview-window.component.scss
│   │   │   │   │   └── preview-window.component.ts
│   │   │   │   └── terminal-window/
│   │   │   │       ├── terminal-window.component.css
│   │   │   │       ├── terminal-window.component.html
│   │   │   │       └── terminal-window.component.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── code-demos/
│   │   ├── assets/
│   │   │   └── runner/
│   │   │       ├── README.md
│   │   │       ├── index.html
│   │   │       ├── js/
│   │   │       │   ├── mocha.js
│   │   │       │   ├── system-config.js
│   │   │       │   └── test-bootstrap.js
│   │   │       ├── ng-dts/
│   │   │       │   ├── bundler.ts
│   │   │       │   └── files.txt
│   │   │       ├── ng2/
│   │   │       │   ├── basic.ts
│   │   │       │   ├── ng-bundle.js
│   │   │       │   ├── ng2-runner.js
│   │   │       │   └── rxjs.operators.ts
│   │   │       ├── package.json
│   │   │       └── tsconfig.json
│   │   ├── index.ts
│   │   ├── jest.config.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── code-demo/
│   │   │   │   │   ├── code-demo.component.css
│   │   │   │   │   ├── code-demo.component.html
│   │   │   │   │   └── code-demo.component.ts
│   │   │   │   ├── code-demo-editor/
│   │   │   │   │   ├── code-demo-editor.component.ts
│   │   │   │   │   ├── code-demo-editor.injector.ts
│   │   │   │   │   ├── directives/
│   │   │   │   │   │   ├── code-demo-editor.auto-folding.directive.spec.ts
│   │   │   │   │   │   ├── code-demo-editor.auto-folding.directive.ts
│   │   │   │   │   │   ├── code-demo-editor.highlight.directive.ts
│   │   │   │   │   │   └── code-demo-editor.line-change.directive.ts
│   │   │   │   │   ├── editor.component.css
│   │   │   │   │   ├── themes/
│   │   │   │   │   │   └── devtools.json
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── utils.spec.ts
│   │   │   │   │       └── utils.ts
│   │   │   │   ├── code-demo-runner/
│   │   │   │   │   ├── code-demo-runner.component.css
│   │   │   │   │   ├── code-demo-runner.component.html
│   │   │   │   │   ├── code-demo-runner.component.spec.ts
│   │   │   │   │   └── code-demo-runner.component.ts
│   │   │   │   ├── code-demo.module.ts
│   │   │   │   ├── code-demos.module.spec.ts
│   │   │   │   ├── file-path/
│   │   │   │   │   ├── file-path.component.css
│   │   │   │   │   ├── file-path.component.html
│   │   │   │   │   ├── file-path.component.spec.ts
│   │   │   │   │   └── file-path.component.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── multitab-editor/
│   │   │   │   │   ├── editor-from-model/
│   │   │   │   │   │   ├── editor-from-model.component.css
│   │   │   │   │   │   ├── editor-from-model.component.html
│   │   │   │   │   │   ├── editor-from-model.component.spec.ts
│   │   │   │   │   │   └── editor-from-model.component.ts
│   │   │   │   │   ├── multitab-editor.component.css
│   │   │   │   │   ├── multitab-editor.component.html
│   │   │   │   │   ├── multitab-editor.component.spec.ts
│   │   │   │   │   └── multitab-editor.component.ts
│   │   │   │   ├── realtime-eval/
│   │   │   │   │   ├── realtime-eval.component.css
│   │   │   │   │   ├── realtime-eval.component.html
│   │   │   │   │   ├── realtime-eval.component.spec.ts
│   │   │   │   │   └── realtime-eval.component.ts
│   │   │   │   ├── runner/
│   │   │   │   │   ├── compile-ts-files.ts
│   │   │   │   │   └── prepare-templates.ts
│   │   │   │   └── shared/
│   │   │   │       ├── deps-order.service.spec.ts
│   │   │   │       ├── deps-order.service.ts
│   │   │   │       ├── helpers.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── loop-protection.service.spec.ts
│   │   │   │       ├── loop-protection.service.ts
│   │   │   │       ├── monaco-config.service.spec.ts
│   │   │   │       ├── monaco-config.service.ts
│   │   │   │       ├── monaco-replay.ts
│   │   │   │       ├── sandbox.ts
│   │   │   │       ├── script-loader.service.ts
│   │   │   │       ├── types-not-really.d.ts
│   │   │   │       ├── types.ts
│   │   │   │       ├── utils.ts
│   │   │   │       └── visitor.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── console/
│   │   ├── karma.conf.js
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── console.component.css
│   │   │   │   ├── console.component.html
│   │   │   │   ├── console.component.spec.ts
│   │   │   │   ├── console.component.ts
│   │   │   │   ├── console.module.ts
│   │   │   │   └── display-dynamic.component/
│   │   │   │       ├── display-dynamic-component.component.css
│   │   │   │       ├── display-dynamic-component.component.html
│   │   │   │       ├── display-dynamic-component.component.spec.ts
│   │   │   │       └── display-dynamic-component.component.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── feedback/
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── ng-package.prod.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── feedback-issue-dropdown/
│   │   │   │   │   ├── feedback-issue-dropdown.component.html
│   │   │   │   │   ├── feedback-issue-dropdown.component.scss
│   │   │   │   │   └── feedback-issue-dropdown.component.ts
│   │   │   │   ├── feedback-rating/
│   │   │   │   │   ├── feedback-rating.component.css
│   │   │   │   │   ├── feedback-rating.component.html
│   │   │   │   │   └── feedback-rating.component.ts
│   │   │   │   ├── feedback-widget/
│   │   │   │   │   ├── feedback-widget.component.html
│   │   │   │   │   ├── feedback-widget.component.scss
│   │   │   │   │   └── feedback-widget.component.ts
│   │   │   │   ├── feedback.module.spec.ts
│   │   │   │   ├── feedback.module.ts
│   │   │   │   ├── feedback.service.spec.ts
│   │   │   │   ├── feedback.service.ts
│   │   │   │   └── message.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── firebase/
│   │   ├── README.md
│   │   ├── jest.config.js
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── firebase.module.spec.ts
│   │   │   │   ├── firebase.module.ts
│   │   │   │   ├── sync-fire-store.directive.spec.ts
│   │   │   │   └── sync-fire-store.directive.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── firebase-login/
│   │   ├── index.ts
│   │   ├── karma.conf.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── firebase-login.module.spec.ts
│   │   │   │   ├── firebase-login.module.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── login-widget/
│   │   │   │   │   ├── login-widget.component.css
│   │   │   │   │   ├── login-widget.component.html
│   │   │   │   │   ├── login-widget.component.spec.ts
│   │   │   │   │   └── login-widget.component.ts
│   │   │   │   ├── login.service.spec.ts
│   │   │   │   └── login.service.ts
│   │   │   └── test.ts
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── intro/
│   │   ├── README.md
│   │   ├── generate/
│   │   │   ├── generate-thumbnails.ts
│   │   │   ├── helpers/
│   │   │   │   ├── const.ts
│   │   │   │   ├── slides.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils.ts
│   │   │   ├── slides.json
│   │   │   └── tsconfig.json
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── intro.component.css
│   │   │   │   ├── intro.component.html
│   │   │   │   ├── intro.component.ts
│   │   │   │   └── intro.module.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── live/
│   │   ├── README.md
│   │   ├── jest.config.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   └── lib/
│   │   │       ├── live-service.service.spec.ts
│   │   │       └── live-service.service.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   ├── slides/
│   │   ├── README.md
│   │   ├── jest.config.js
│   │   ├── ng-package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── lib/
│   │   │   │   ├── arrows/
│   │   │   │   │   ├── slides-arrows.component.css
│   │   │   │   │   ├── slides-arrows.component.html
│   │   │   │   │   └── slides-arrows.component.ts
│   │   │   │   ├── deck/
│   │   │   │   │   ├── deck.component.html
│   │   │   │   │   ├── deck.component.scss
│   │   │   │   │   ├── deck.component.spec.ts
│   │   │   │   │   └── deck.component.ts
│   │   │   │   ├── full-screen-mode/
│   │   │   │   │   ├── full-screen-mode.service.spec.ts
│   │   │   │   │   ├── full-screen-mode.service.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── routing/
│   │   │   │   │   ├── slide-routes.ts
│   │   │   │   │   ├── slides-routing.directive.spec.ts
│   │   │   │   │   └── slides-routing.directive.ts
│   │   │   │   ├── shortcuts/
│   │   │   │   │   ├── shortcuts.directive.spec.ts
│   │   │   │   │   └── shortcuts.directive.ts
│   │   │   │   ├── slide/
│   │   │   │   │   ├── slide.directive.spec.ts
│   │   │   │   │   └── slide.directive.ts
│   │   │   │   ├── slides.module.spec.ts
│   │   │   │   └── slides.module.ts
│   │   │   └── test-setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.lib.json
│   │   ├── tsconfig.lib.prod.json
│   │   ├── tsconfig.spec.json
│   │   └── tslint.json
│   └── utils/
│       ├── karma.conf.js
│       ├── src/
│       │   ├── index.ts
│       │   ├── lib/
│       │   │   ├── analytics/
│       │   │   │   ├── analytics.service.spec.ts
│       │   │   │   └── analytics.service.ts
│       │   │   ├── differ/
│       │   │   │   ├── diffFilesResolver.ts
│       │   │   │   ├── differ.spec.ts
│       │   │   │   ├── differ.ts
│       │   │   │   └── fileHelpers.ts
│       │   │   ├── github-PR-service/
│       │   │   │   ├── github.module.ts
│       │   │   │   ├── github.service.ts
│       │   │   │   └── index.ts
│       │   │   ├── i18n/
│       │   │   │   └── i18n-tools.ts
│       │   │   ├── index.ts
│       │   │   ├── loaders/
│       │   │   │   └── loaders.ts
│       │   │   ├── loading-indicator/
│       │   │   │   ├── loading-indicator/
│       │   │   │   │   ├── loading-indicator.component.css
│       │   │   │   │   ├── loading-indicator.component.html
│       │   │   │   │   ├── loading-indicator.component.spec.ts
│       │   │   │   │   └── loading-indicator.component.ts
│       │   │   │   └── loading-indicator.module.ts
│       │   │   ├── pipes/
│       │   │   │   ├── pipes.module.ts
│       │   │   │   └── safeHtml.pipe.ts
│       │   │   ├── sandbox-runner/
│       │   │   │   ├── common.spec.ts
│       │   │   │   ├── common.ts
│       │   │   │   ├── runners/
│       │   │   │   │   ├── runner.ts
│       │   │   │   │   ├── webworker.spec.ts
│       │   │   │   │   └── webworker.ts
│       │   │   │   ├── sandbox-runner.module.ts
│       │   │   │   ├── test-runner-service.service.spec.ts
│       │   │   │   ├── test-runner.component.html
│       │   │   │   ├── test-runner.component.scss
│       │   │   │   ├── test-runner.component.spec.ts
│       │   │   │   ├── test-runner.component.ts
│       │   │   │   ├── test-runner.service.ts
│       │   │   │   ├── test-runner.spec.ts
│       │   │   │   ├── test-runner.ts
│       │   │   │   ├── typescript-checker-runner/
│       │   │   │   │   ├── typescript-checker-runner.component.css
│       │   │   │   │   ├── typescript-checker-runner.component.html
│       │   │   │   │   ├── typescript-checker-runner.component.spec.ts
│       │   │   │   │   ├── typescript-checker-runner.component.ts
│       │   │   │   │   └── typescript-checker-runner.module.ts
│       │   │   │   └── typescript-test-runner/
│       │   │   │       ├── typescript-test-runner.component.css
│       │   │   │       ├── typescript-test-runner.component.html
│       │   │   │       ├── typescript-test-runner.component.spec.ts
│       │   │   │       └── typescript-test-runner.component.ts
│       │   │   ├── sync/
│       │   │   │   ├── common.ts
│       │   │   │   ├── components/
│       │   │   │   │   ├── configure-sync/
│       │   │   │   │   │   ├── configure-sync.component.css
│       │   │   │   │   │   ├── configure-sync.component.html
│       │   │   │   │   │   ├── configure-sync.component.spec.ts
│       │   │   │   │   │   ├── configure-sync.component.ts
│       │   │   │   │   │   └── configure-sync.module.ts
│       │   │   │   │   ├── online-indicator/
│       │   │   │   │   │   ├── online-indicator.component.css
│       │   │   │   │   │   ├── online-indicator.component.html
│       │   │   │   │   │   ├── online-indicator.component.spec.ts
│       │   │   │   │   │   ├── online-indicator.component.ts
│       │   │   │   │   │   └── online-indicator.module.ts
│       │   │   │   │   ├── poll/
│       │   │   │   │   │   ├── common/
│       │   │   │   │   │   │   ├── bar-chart/
│       │   │   │   │   │   │   │   ├── bar-chart.component.html
│       │   │   │   │   │   │   │   ├── bar-chart.component.scss
│       │   │   │   │   │   │   │   ├── bar-chart.component.spec.ts
│       │   │   │   │   │   │   │   ├── bar-chart.component.ts
│       │   │   │   │   │   │   │   └── bar-chart.module.ts
│       │   │   │   │   │   │   ├── common.ts
│       │   │   │   │   │   │   ├── stars/
│       │   │   │   │   │   │   │   ├── stars.component.css
│       │   │   │   │   │   │   │   ├── stars.component.html
│       │   │   │   │   │   │   │   ├── stars.component.spec.ts
│       │   │   │   │   │   │   │   ├── stars.component.ts
│       │   │   │   │   │   │   │   └── stars.module.ts
│       │   │   │   │   │   │   ├── sync-poll.service.spec.ts
│       │   │   │   │   │   │   └── sync-poll.service.ts
│       │   │   │   │   │   ├── sync-poll-admin/
│       │   │   │   │   │   │   ├── sync-poll-admin.component.css
│       │   │   │   │   │   │   ├── sync-poll-admin.component.html
│       │   │   │   │   │   │   ├── sync-poll-admin.component.spec.ts
│       │   │   │   │   │   │   └── sync-poll-admin.component.ts
│       │   │   │   │   │   ├── sync-poll-presenter/
│       │   │   │   │   │   │   ├── choice-presenter/
│       │   │   │   │   │   │   │   ├── choice-presenter.component.css
│       │   │   │   │   │   │   │   ├── choice-presenter.component.html
│       │   │   │   │   │   │   │   ├── choice-presenter.component.spec.ts
│       │   │   │   │   │   │   │   └── choice-presenter.component.ts
│       │   │   │   │   │   │   ├── leaderboard/
│       │   │   │   │   │   │   │   ├── leaderboard-presenter/
│       │   │   │   │   │   │   │   │   ├── leaderboard-presenter.component.css
│       │   │   │   │   │   │   │   │   ├── leaderboard-presenter.component.html
│       │   │   │   │   │   │   │   │   ├── leaderboard-presenter.component.spec.ts
│       │   │   │   │   │   │   │   │   └── leaderboard-presenter.component.ts
│       │   │   │   │   │   │   │   ├── leaderboard-viewer/
│       │   │   │   │   │   │   │   │   ├── leaderboard-viewer.component.css
│       │   │   │   │   │   │   │   │   ├── leaderboard-viewer.component.html
│       │   │   │   │   │   │   │   │   ├── leaderboard-viewer.component.spec.ts
│       │   │   │   │   │   │   │   │   └── leaderboard-viewer.component.ts
│       │   │   │   │   │   │   │   ├── leaderboard.component.css
│       │   │   │   │   │   │   │   ├── leaderboard.component.html
│       │   │   │   │   │   │   │   ├── leaderboard.component.spec.ts
│       │   │   │   │   │   │   │   ├── leaderboard.component.ts
│       │   │   │   │   │   │   │   └── leaderboard.module.ts
│       │   │   │   │   │   │   ├── stars-presenter/
│       │   │   │   │   │   │   │   ├── stars-presenter.component.css
│       │   │   │   │   │   │   │   ├── stars-presenter.component.html
│       │   │   │   │   │   │   │   ├── stars-presenter.component.spec.ts
│       │   │   │   │   │   │   │   └── stars-presenter.component.ts
│       │   │   │   │   │   │   ├── sync-poll-presenter.component.css
│       │   │   │   │   │   │   ├── sync-poll-presenter.component.html
│       │   │   │   │   │   │   ├── sync-poll-presenter.component.spec.ts
│       │   │   │   │   │   │   └── sync-poll-presenter.component.ts
│       │   │   │   │   │   ├── sync-poll-viewer/
│       │   │   │   │   │   │   ├── sync-poll-viewer-choice/
│       │   │   │   │   │   │   │   ├── sync-poll-viewer-choice.component.css
│       │   │   │   │   │   │   │   ├── sync-poll-viewer-choice.component.html
│       │   │   │   │   │   │   │   ├── sync-poll-viewer-choice.component.spec.ts
│       │   │   │   │   │   │   │   └── sync-poll-viewer-choice.component.ts
│       │   │   │   │   │   │   ├── sync-poll-viewer.component.css
│       │   │   │   │   │   │   ├── sync-poll-viewer.component.html
│       │   │   │   │   │   │   ├── sync-poll-viewer.component.spec.ts
│       │   │   │   │   │   │   └── sync-poll-viewer.component.ts
│       │   │   │   │   │   ├── sync-poll.component.css
│       │   │   │   │   │   ├── sync-poll.component.html
│       │   │   │   │   │   ├── sync-poll.component.spec.ts
│       │   │   │   │   │   ├── sync-poll.component.ts
│       │   │   │   │   │   └── sync-poll.module.ts
│       │   │   │   │   ├── questions/
│       │   │   │   │   │   ├── common/
│       │   │   │   │   │   │   ├── common.ts
│       │   │   │   │   │   │   ├── question/
│       │   │   │   │   │   │   │   ├── question.component.html
│       │   │   │   │   │   │   │   ├── question.component.scss
│       │   │   │   │   │   │   │   ├── question.component.spec.ts
│       │   │   │   │   │   │   │   └── question.component.ts
│       │   │   │   │   │   │   ├── question-list/
│       │   │   │   │   │   │   │   ├── question-list.component.css
│       │   │   │   │   │   │   │   ├── question-list.component.html
│       │   │   │   │   │   │   │   ├── question-list.component.spec.ts
│       │   │   │   │   │   │   │   └── question-list.component.ts
│       │   │   │   │   │   │   ├── questions.service.spec.ts
│       │   │   │   │   │   │   └── questions.service.ts
│       │   │   │   │   │   ├── questions-admin/
│       │   │   │   │   │   │   ├── questions-admin.component.css
│       │   │   │   │   │   │   ├── questions-admin.component.html
│       │   │   │   │   │   │   ├── questions-admin.component.spec.ts
│       │   │   │   │   │   │   └── questions-admin.component.ts
│       │   │   │   │   │   ├── questions-presenter/
│       │   │   │   │   │   │   ├── questions-presenter.component.css
│       │   │   │   │   │   │   ├── questions-presenter.component.html
│       │   │   │   │   │   │   ├── questions-presenter.component.spec.ts
│       │   │   │   │   │   │   └── questions-presenter.component.ts
│       │   │   │   │   │   ├── questions-viewer/
│       │   │   │   │   │   │   ├── questions-viewer.component.css
│       │   │   │   │   │   │   ├── questions-viewer.component.html
│       │   │   │   │   │   │   ├── questions-viewer.component.spec.ts
│       │   │   │   │   │   │   └── questions-viewer.component.ts
│       │   │   │   │   │   ├── questions.component.css
│       │   │   │   │   │   ├── questions.component.html
│       │   │   │   │   │   ├── questions.component.spec.ts
│       │   │   │   │   │   ├── questions.component.ts
│       │   │   │   │   │   └── questions.module.ts
│       │   │   │   │   ├── registration/
│       │   │   │   │   │   ├── registration-admin/
│       │   │   │   │   │   │   ├── registration-admin.component.css
│       │   │   │   │   │   │   ├── registration-admin.component.html
│       │   │   │   │   │   │   ├── registration-admin.component.spec.ts
│       │   │   │   │   │   │   └── registration-admin.component.ts
│       │   │   │   │   │   ├── registration-presenter/
│       │   │   │   │   │   │   ├── registration-presenter.component.css
│       │   │   │   │   │   │   ├── registration-presenter.component.html
│       │   │   │   │   │   │   ├── registration-presenter.component.spec.ts
│       │   │   │   │   │   │   └── registration-presenter.component.ts
│       │   │   │   │   │   ├── registration-viewer/
│       │   │   │   │   │   │   ├── registration-viewer.component.css
│       │   │   │   │   │   │   ├── registration-viewer.component.html
│       │   │   │   │   │   │   ├── registration-viewer.component.spec.ts
│       │   │   │   │   │   │   └── registration-viewer.component.ts
│       │   │   │   │   │   ├── registration.component.css
│       │   │   │   │   │   ├── registration.component.html
│       │   │   │   │   │   ├── registration.component.spec.ts
│       │   │   │   │   │   ├── registration.component.ts
│       │   │   │   │   │   ├── sync-registration.module.ts
│       │   │   │   │   │   ├── sync-registration.service.spec.ts
│       │   │   │   │   │   └── sync-registration.service.ts
│       │   │   │   │   ├── sync-code-game/
│       │   │   │   │   │   ├── sync-code-game-admin/
│       │   │   │   │   │   │   ├── sync-code-game-admin.component.css
│       │   │   │   │   │   │   ├── sync-code-game-admin.component.html
│       │   │   │   │   │   │   ├── sync-code-game-admin.component.spec.ts
│       │   │   │   │   │   │   └── sync-code-game-admin.component.ts
│       │   │   │   │   │   ├── sync-code-game-presenter/
│       │   │   │   │   │   │   ├── sync-code-game-presenter.component.css
│       │   │   │   │   │   │   ├── sync-code-game-presenter.component.html
│       │   │   │   │   │   │   ├── sync-code-game-presenter.component.spec.ts
│       │   │   │   │   │   │   └── sync-code-game-presenter.component.ts
│       │   │   │   │   │   ├── sync-code-game-viewer/
│       │   │   │   │   │   │   ├── sync-code-game-viewer.component.css
│       │   │   │   │   │   │   ├── sync-code-game-viewer.component.html
│       │   │   │   │   │   │   ├── sync-code-game-viewer.component.spec.ts
│       │   │   │   │   │   │   └── sync-code-game-viewer.component.ts
│       │   │   │   │   │   ├── sync-code-game.component.css
│       │   │   │   │   │   ├── sync-code-game.component.html
│       │   │   │   │   │   ├── sync-code-game.component.spec.ts
│       │   │   │   │   │   ├── sync-code-game.component.ts
│       │   │   │   │   │   ├── sync-code-game.module.ts
│       │   │   │   │   │   ├── sync-code-game.service.spec.ts
│       │   │   │   │   │   ├── sync-code-game.service.ts
│       │   │   │   │   │   └── tests.ts
│       │   │   │   │   ├── sync-join-instructions/
│       │   │   │   │   │   ├── sync-join-instructions.component.css
│       │   │   │   │   │   ├── sync-join-instructions.component.html
│       │   │   │   │   │   ├── sync-join-instructions.component.spec.ts
│       │   │   │   │   │   ├── sync-join-instructions.component.ts
│       │   │   │   │   │   └── sync-join-instructions.module.ts
│       │   │   │   │   └── sync-sessions/
│       │   │   │   │       ├── sync-sessions.component.css
│       │   │   │   │       ├── sync-sessions.component.html
│       │   │   │   │       ├── sync-sessions.component.spec.ts
│       │   │   │   │       ├── sync-sessions.component.ts
│       │   │   │   │       └── sync-sessions.module.ts
│       │   │   │   ├── directives/
│       │   │   │   │   ├── all-viewer-values.directive.ts
│       │   │   │   │   ├── is-status.directive.ts
│       │   │   │   │   ├── sync-directives.module.ts
│       │   │   │   │   ├── sync-is-presenting.directive.spec.ts
│       │   │   │   │   ├── sync-presenter-value.directive.ts
│       │   │   │   │   ├── sync-user-value.directive.ts
│       │   │   │   │   └── sync-viewer-value.directive.ts
│       │   │   │   ├── services/
│       │   │   │   │   ├── common.ts
│       │   │   │   │   ├── firebase-info.service.ts
│       │   │   │   │   ├── sync-data.service.ts
│       │   │   │   │   ├── sync-db-wrapper.service.spec.ts
│       │   │   │   │   ├── sync-db.service.ts
│       │   │   │   │   ├── sync-session.service.spec.ts
│       │   │   │   │   └── sync-session.service.ts
│       │   │   │   ├── sync-button/
│       │   │   │   │   ├── sync-button.component.css
│       │   │   │   │   ├── sync-button.component.html
│       │   │   │   │   ├── sync-button.component.spec.ts
│       │   │   │   │   ├── sync-button.component.ts
│       │   │   │   │   └── sync-button.module.ts
│       │   │   │   ├── sync-playground/
│       │   │   │   │   ├── sync-playground-presenter/
│       │   │   │   │   │   ├── sync-playground-presenter.component.css
│       │   │   │   │   │   ├── sync-playground-presenter.component.html
│       │   │   │   │   │   ├── sync-playground-presenter.component.spec.ts
│       │   │   │   │   │   └── sync-playground-presenter.component.ts
│       │   │   │   │   ├── sync-playground-test/
│       │   │   │   │   │   ├── sync-playground-test.component.css
│       │   │   │   │   │   ├── sync-playground-test.component.html
│       │   │   │   │   │   ├── sync-playground-test.component.spec.ts
│       │   │   │   │   │   └── sync-playground-test.component.ts
│       │   │   │   │   ├── sync-playground.component.html
│       │   │   │   │   ├── sync-playground.component.scss
│       │   │   │   │   ├── sync-playground.component.spec.ts
│       │   │   │   │   └── sync-playground.component.ts
│       │   │   │   └── sync.module.ts
│       │   │   ├── test-results/
│       │   │   │   ├── common.ts
│       │   │   │   ├── file-aware-description/
│       │   │   │   │   ├── file-aware-description.component.css
│       │   │   │   │   ├── file-aware-description.component.html
│       │   │   │   │   ├── file-aware-description.component.spec.ts
│       │   │   │   │   └── file-aware-description.component.ts
│       │   │   │   ├── simple-tests-progress/
│       │   │   │   │   ├── simple-tests-progress.component.css
│       │   │   │   │   ├── simple-tests-progress.component.html
│       │   │   │   │   ├── simple-tests-progress.component.spec.ts
│       │   │   │   │   ├── simple-tests-progress.component.ts
│       │   │   │   │   └── simple-tests-progress.module.ts
│       │   │   │   ├── test-results/
│       │   │   │   │   ├── test-results.component.html
│       │   │   │   │   ├── test-results.component.scss
│       │   │   │   │   ├── test-results.component.spec.ts
│       │   │   │   │   └── test-results.component.ts
│       │   │   │   ├── test-results.module.ts
│       │   │   │   └── test-run-results/
│       │   │   │       ├── test-run-results.component.html
│       │   │   │       ├── test-run-results.component.scss
│       │   │   │       ├── test-run-results.component.spec.ts
│       │   │   │       └── test-run-results.component.ts
│       │   │   ├── testing/
│       │   │   │   └── mocks/
│       │   │   │       ├── angular-fire.ts
│       │   │   │       └── sync-db-service.ts
│       │   │   └── tracking/
│       │   │       ├── tracking.directive.ts
│       │   │       └── tracking.module.ts
│       │   └── test.ts
│       ├── tsconfig.json
│       ├── tsconfig.lib.json
│       ├── tsconfig.spec.json
│       └── tslint.json
├── ng2ts/
│   ├── .prettierignore
│   ├── api.service.ts
│   ├── app.component.ts
│   ├── app.html
│   ├── app.module.ts
│   ├── code.ts
│   ├── context/
│   │   ├── context.component.ts
│   │   ├── context.html
│   │   └── context.service.ts
│   ├── data-binding/
│   │   ├── DataBinding.ts
│   │   └── DataBindingModule.ts
│   ├── fuzzy-pipe/
│   │   └── fuzzy.pipe.ts
│   ├── main.ts
│   ├── ng2ts.ts
│   ├── search/
│   │   ├── search.component.html
│   │   └── search.component.ts
│   ├── style.css
│   ├── tests/
│   │   ├── ThumbsComponentCreateTest.ts
│   │   ├── ThumbsComponentUseTest.ts
│   │   ├── bootstrapTest.ts
│   │   ├── codelabTest.ts
│   │   ├── contextComponentUseTest.ts
│   │   ├── createComponentTest.ts
│   │   ├── createModuleTest.ts
│   │   ├── diInjectServiceTest.ts
│   │   ├── diInjectServiceTestBabel.ts
│   │   ├── formsTest.ts
│   │   ├── fuzzyPipeCreateTest.ts
│   │   ├── fuzzyPipeUseTest.ts
│   │   ├── materialTest.ts
│   │   ├── routerTest.ts
│   │   ├── templateAddActionTest.ts
│   │   ├── templateAllVideosTest.ts
│   │   ├── templatePageSetupTest.ts
│   │   ├── test.ts
│   │   ├── togglePanelComponentCreateTest.ts
│   │   ├── togglePanelComponentUseTest.ts
│   │   ├── videoComponentCreateTest.ts
│   │   └── videoComponentUseTest.ts
│   ├── thumbs/
│   │   ├── thumbs.component.ts
│   │   └── thumbs.html
│   ├── thumbs.app.module.ts
│   ├── toggle-panel/
│   │   ├── toggle-panel.component.ts
│   │   └── toggle-panel.html
│   ├── toggle-panel.app.module.ts
│   ├── typescript-intro/
│   │   ├── Codelab.ts
│   │   ├── Guest.ts
│   │   └── Main.ts
│   ├── upload/
│   │   ├── upload.component.html
│   │   └── upload.component.ts
│   ├── video/
│   │   ├── video-item.ts
│   │   ├── video-materialized.component.html
│   │   ├── video-wrapper.component.ts
│   │   ├── video.component.html
│   │   ├── video.component.ts
│   │   ├── video.index.html
│   │   └── video.service.ts
│   ├── video.app.module.ts
│   └── wrapper.component.ts
├── nx.json
├── package.json
├── tools/
│   ├── schematics/
│   │   └── slide/
│   │       ├── README.md
│   │       ├── files/
│   │       │   ├── code.bs
│   │       │   └── template.component.html
│   │       ├── index.ts
│   │       └── schema.json
│   └── tsconfig.tools.json
├── tsconfig.json
└── tslint.json
Download .txt
Showing preview only (435K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5049 symbols across 618 files)

FILE: apps/angular-thirty-seconds/src/app/app.component.ts
  class AppComponent (line 27) | class AppComponent {}

FILE: apps/angular-thirty-seconds/src/app/app.module.ts
  class AppModule (line 51) | class AppModule {}

FILE: apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.ts
  type SnippetFileInfo (line 37) | interface SnippetFileInfo {
  function importSnippet (line 44) | function importSnippet(snippet) {
  class CreateSnippetComponent (line 56) | class CreateSnippetComponent implements OnDestroy {
    method constructor (line 95) | constructor(
    method fetchPR (line 120) | fetchPR(pullNumber: number) {
    method ngOnDestroy (line 147) | ngOnDestroy() {
    method openPreview (line 152) | openPreview() {
    method getPreparedFormValue (line 174) | getPreparedFormValue(value) {
    method addTag (line 185) | addTag(event: MatChipInputEvent): void {
    method removeTag (line 199) | removeTag(tag: string): void {
    method selectedTags (line 207) | selectedTags(event: MatAutocompleteSelectedEvent): void {
    method _filterTags (line 213) | private _filterTags(value: string): string[] {

FILE: apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.module.ts
  constant MAT_MODULES (line 21) | const MAT_MODULES = [
  class CreateSnippetModule (line 50) | class CreateSnippetModule {}

FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-info/snippet-info.component.ts
  class SnippetInfoComponent (line 8) | class SnippetInfoComponent {}

FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-modal/snippet-overview.component.ts
  type SnippetOverviewData (line 14) | interface SnippetOverviewData {
  function exportSnippet (line 26) | function exportSnippet(snippet) {
  class SnippetOverviewComponent (line 39) | class SnippetOverviewComponent implements OnInit, OnDestroy {
    method constructor (line 49) | constructor(
    method ngOnInit (line 59) | ngOnInit() {
    method ngOnDestroy (line 70) | ngOnDestroy() {
    method onSubmit (line 75) | async onSubmit() {
    method navigateAndShowSnackBar (line 139) | navigateAndShowSnackBar(text: string, linkLabel: string, linkUrl: stri...
    method login (line 151) | async login() {

FILE: apps/angular-thirty-seconds/src/app/create-snippet/snippet-spinner/snippet-spinner.component.ts
  class SnippetSpinnerComponent (line 8) | class SnippetSpinnerComponent {}

FILE: apps/angular-thirty-seconds/src/app/pull-requests-list/pull-requests-list.component.ts
  constant REPO_OWNER (line 5) | const REPO_OWNER = 'nycJSorg';
  constant REPO_NAME (line 6) | const REPO_NAME = '30-seconds-of-angular';
  class PullRequestsListComponent (line 13) | class PullRequestsListComponent {
    method constructor (line 21) | constructor(private router: Router, private githubService: GitHubServi...

FILE: apps/angular-thirty-seconds/src/app/shared/constants.ts
  constant MARKDOWN_PLACEHOLDER (line 1) | const MARKDOWN_PLACEHOLDER = `
  constant TAGS_LIST (line 13) | const TAGS_LIST = [
  constant LINKS_PLACEHOLDER (line 23) | const LINKS_PLACEHOLDER = `https://angular.io/

FILE: apps/angular-thirty-seconds/src/app/shared/consts.ts
  constant SEPARATOR (line 1) | const SEPARATOR = '\n';

FILE: apps/angular-thirty-seconds/src/app/shared/functions/generate-snippet.ts
  function arrayToMarkdownList (line 10) | function arrayToMarkdownList(tagsArray: Array<string>): string {
  function generateMdHeader (line 17) | function generateMdHeader(keys: string[], snippet: Snippet) {
  function getFileLanguage (line 49) | function getFileLanguage(fileName) {
  function addMarkdownLanguageMark (line 59) | function addMarkdownLanguageMark(code: string, filename: string) {
  function generateMdBody (line 65) | function generateMdBody(keys: string[], snippet: Snippet) {
  function generateDemo (line 80) | function generateDemo(snippet) {
  function generateSnippet (line 96) | function generateSnippet(snippet: Snippet) {

FILE: apps/angular-thirty-seconds/src/app/shared/functions/parse-snippet.ts
  method from (line 7) | from() {}
  function extractHeaders (line 27) | function extractHeaders(str) {
  function mdTextToJson (line 60) | function mdTextToJson(snippet: string) {
  function stripMarkdownLanguageMark (line 68) | function stripMarkdownLanguageMark(code = '') {
  function normalize (line 72) | function normalize(text) {
  function parseSnippet (line 76) | function parseSnippet(snippetBody: string) {

FILE: apps/angular-thirty-seconds/src/app/shared/functions/validation/validation.ts
  function markFormControlsAsTouched (line 4) | function markFormControlsAsTouched(
  function validatorMaxTags (line 16) | function validatorMaxTags(maximumTags: number) {
  function validatorMaxLines (line 24) | function validatorMaxLines(lines: number) {

FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/branch.interface.ts
  type Branch (line 1) | interface Branch {

FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/commit-info.interface.ts
  type CommitInfo (line 1) | interface CommitInfo {

FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/github-auth.interface.ts
  type GithubAuth (line 3) | interface GithubAuth {

FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/pull-request.intreface.ts
  type CreatePullRequest (line 1) | interface CreatePullRequest {
  type PullRequest (line 8) | interface PullRequest {

FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/repo.interface.ts
  type Repo (line 1) | interface Repo {

FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/snippet.ts
  type Snippet (line 1) | type Snippet = Record<string, any>;

FILE: apps/angular-thirty-seconds/src/app/shared/interfaces/user.interface.ts
  type User (line 1) | interface User {

FILE: apps/angular-thirty-seconds/src/app/shared/services/github.service.ts
  class GitHubService (line 22) | class GitHubService {
    method constructor (line 26) | constructor(private http: HttpClient, private _snackBar: MatSnackBar) {}
    method showSnackbarOnError (line 28) | showSnackbarOnError<T>(message: string): MonoTypeOperatorFunction<T> {
    method setToken (line 35) | setToken(token: string) {
    method getRepo (line 39) | getRepo(owner: string, repoName: string): Observable<Repo> {
    method getMyRepos (line 49) | getMyRepos(user: User): Observable<Repo[]> {
    method forkRepo (line 57) | forkRepo(repo: Repo): Observable<Repo> {
    method getMasterBranch (line 66) | getMasterBranch(repo: Repo): Observable<Branch> {
    method createBranch (line 79) | createBranch(
    method createCommit (line 104) | createCommit(repo: Repo, commitInfo: CommitInfo): Observable<any> {
    method createPullRequest (line 120) | createPullRequest(
    method getPullsList (line 143) | getPullsList(owner: string, repoName: string): Observable<any> {
    method getPullByPullNumber (line 161) | getPullByPullNumber(
    method addLinkToEditForm (line 174) | addLinkToEditForm(
    method addSnippetLabel (line 190) | addSnippetLabel(owner: string, repoName: string, issueNumber: number) {
    method getPullFileByPullNumber (line 200) | getPullFileByPullNumber(
    method getSnippetBody (line 213) | getSnippetBody(url) {
    method updateFile (line 219) | updateFile(repoFullName, snippetData, fileInfo): Observable<any> {
  function requires (line 233) | function requires(expression: any, message: string) {

FILE: apps/angular-thirty-seconds/src/app/shared/services/snippet.service.ts
  class SnippetService (line 19) | class SnippetService {
    method constructor (line 20) | constructor(private githubService: GitHubService) {}
    method fetchPR (line 22) | fetchPR(repoName: string, repoOwner: string, pullNumber: number) {
    method updatePR (line 59) | updatePR(
    method createPR (line 80) | createPR(
    method toLowerCaseAndSlugify (line 147) | private toLowerCaseAndSlugify(str: string) {
  function requires (line 152) | function requires(expression: any, message: string) {

FILE: apps/blog/src/app/app.component.ts
  class AppComponent (line 8) | class AppComponent {

FILE: apps/blog/src/app/app.module.ts
  class AppModule (line 60) | class AppModule {}

FILE: apps/blog/src/app/common.ts
  type Post (line 1) | interface Post {

FILE: apps/blog/src/app/feed/feed.component.ts
  class FeedComponent (line 13) | class FeedComponent {
    method constructor (line 16) | constructor(private postService: PostService) {

FILE: apps/blog/src/app/form/form.component.ts
  class FormComponent (line 15) | class FormComponent {
    method constructor (line 29) | constructor(
    method onSubmit (line 35) | onSubmit() {

FILE: apps/blog/src/app/post.service.ts
  class PostService (line 10) | class PostService {
    method constructor (line 15) | constructor(private database: AngularFireDatabase) {}
    method getPostById (line 17) | getPostById(id: string) {
    method removePost (line 21) | removePost(id: string) {
    method updatePost (line 25) | updatePost(id: string, post: Partial<Post>) {
    method addPost (line 29) | addPost(post: Post): any {
    method getPost (line 36) | getPost(id: string): Observable<any> {

FILE: apps/blog/src/app/post/post.component.ts
  class PostComponent (line 14) | class PostComponent implements OnInit {
    method constructor (line 18) | constructor(
    method ngOnInit (line 23) | ngOnInit() {

FILE: apps/blog/src/app/single-post/single-post.component.ts
  class SinglePostComponent (line 14) | class SinglePostComponent {
    method constructor (line 19) | constructor(
    method delete (line 26) | delete() {

FILE: apps/codelab/src/app/admin/admin-routing.module.ts
  class AdminRoutingModule (line 22) | class AdminRoutingModule {}

FILE: apps/codelab/src/app/admin/admin.component.ts
  class AdminComponent (line 8) | class AdminComponent {

FILE: apps/codelab/src/app/admin/admin.module.ts
  class AdminModule (line 21) | class AdminModule {}

FILE: apps/codelab/src/app/admin/feedback/feedback-message-table/feedback-message-table.component.ts
  class FeedbackMessageTableComponent (line 36) | class FeedbackMessageTableComponent {
    method dataSourceSetter (line 40) | set dataSourceSetter(values: Message[]) {

FILE: apps/codelab/src/app/admin/feedback/feedback.component.ts
  type Filter (line 7) | type Filter = 'all' | 'done' | 'notDone';
  type Grouping (line 8) | type Grouping = 'nothing' | 'href' | 'name';
  function groupBy (line 10) | function groupBy(feedback: Array<Message>, grouping: Grouping) {
  function normalize (line 21) | function normalize(feedback: Array<any>) {
  function group (line 28) | function group([feedback, grouping]) {
  function filter (line 43) | function filter([feedback, filterName, [fromDate, toDate]]) {
  class FeedbackComponent (line 76) | class FeedbackComponent implements OnInit {
    method constructor (line 84) | constructor(private database: AngularFireDatabase) {}
    method ngOnInit (line 86) | ngOnInit() {
    method changeDate (line 100) | changeDate(clearDates = false) {
    method clearDate (line 110) | clearDate() {

FILE: apps/codelab/src/app/admin/feedback/feedback.module.ts
  class FeedbackModule (line 53) | class FeedbackModule {}

FILE: apps/codelab/src/app/admin/feedback/github.service.ts
  class GithubService (line 7) | class GithubService {
    method constructor (line 10) | constructor(private http: HttpClient) {}
    method createIssue (line 12) | createIssue(issueData, accessToken) {
    method closeIssue (line 22) | closeIssue(changes, issueId, accessToken) {

FILE: apps/codelab/src/app/admin/users/users.component.ts
  type AdminDb (line 9) | interface AdminDb {
  type Admin (line 14) | interface Admin extends AdminDb {
  type UserDb (line 18) | interface UserDb {
  class UsersComponent (line 27) | class UsersComponent {
    method constructor (line 47) | constructor(

FILE: apps/codelab/src/app/admin/users/users.module.ts
  class UsersModule (line 12) | class UsersModule {}

FILE: apps/codelab/src/app/app-routing.module.ts
  class AppRoutingModule (line 36) | class AppRoutingModule {}

FILE: apps/codelab/src/app/app.component.ts
  class AppComponent (line 7) | class AppComponent {}

FILE: apps/codelab/src/app/app.module.ts
  class AppModule (line 40) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/about/about.component.ts
  class AboutComponent (line 10) | class AboutComponent implements OnInit {
    method constructor (line 31) | constructor() {}
    method ngOnInit (line 33) | ngOnInit() {}

FILE: apps/codelab/src/app/codelabs/about/about.module.ts
  class AboutModule (line 15) | class AboutModule {}

FILE: apps/codelab/src/app/codelabs/about/samples/storing-code/interpolations.ts
  class AppComponent (line 12) | class AppComponent {}
  class AppModule (line 19) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/angular-cli/angular-cli.component.ts
  class AngularCliComponent (line 11) | class AngularCliComponent {}

FILE: apps/codelab/src/app/codelabs/angular/angular-cli/angular-cli.module.ts
  class AngularCliModule (line 29) | class AngularCliModule {}

FILE: apps/codelab/src/app/codelabs/angular/angular-routing.module.ts
  class AngularRoutingModule (line 181) | class AngularRoutingModule {}

FILE: apps/codelab/src/app/codelabs/angular/angular.module.ts
  class AngularModule (line 9) | class AngularModule {}

FILE: apps/codelab/src/app/codelabs/angular/component-tree/component-tree.component.ts
  class ComponentTreeComponent (line 22) | class ComponentTreeComponent implements AfterViewInit {
    method constructor (line 107) | constructor(private exercises: Ng2TsExercises) {
    method ngAfterViewInit (line 112) | ngAfterViewInit() {

FILE: apps/codelab/src/app/codelabs/angular/component-tree/component-tree.module.ts
  class ComponentTreeModule (line 31) | class ComponentTreeModule {}

FILE: apps/codelab/src/app/codelabs/angular/component-tree/components-hierarchy-svg/components-hierarchy-svg.component.ts
  class ComponentsHierarchySvgComponent (line 8) | class ComponentsHierarchySvgComponent {}

FILE: apps/codelab/src/app/codelabs/angular/component-tree/samples/module/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/component-tree/samples/module/box.component.ts
  class BoxComponent (line 11) | class BoxComponent {

FILE: apps/codelab/src/app/codelabs/angular/component-tree/samples/module/circle.component.ts
  class CircleComponent (line 8) | class CircleComponent {

FILE: apps/codelab/src/app/codelabs/angular/create-first-app/create-first-app.component.ts
  class CreateFirstAppComponent (line 16) | class CreateFirstAppComponent implements OnInit {
    method ngOnInit (line 88) | ngOnInit() {

FILE: apps/codelab/src/app/codelabs/angular/create-first-app/create-first-app.module.ts
  class CreateFirstAppModule (line 32) | class CreateFirstAppModule {}

FILE: apps/codelab/src/app/codelabs/angular/create-first-app/mode/mode.component.ts
  class ModeComponent (line 8) | class ModeComponent implements OnInit {
    method constructor (line 49) | constructor() {}
    method ngOnInit (line 51) | ngOnInit() {}

FILE: apps/codelab/src/app/codelabs/angular/create-first-app/samples/app-component/app.component.ts
  class AppComponent (line 10) | class AppComponent {}

FILE: apps/codelab/src/app/codelabs/angular/create-first-app/samples/app-component/app.module.ts
  class AppModule (line 10) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/create-first-app/samples/index-html/bootstrap.ts
  class AppComponent (line 13) | class AppComponent {}
  class AppModule (line 20) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/custom-events/custom-events.component.ts
  class CustomEventsComponent (line 9) | class CustomEventsComponent {

FILE: apps/codelab/src/app/codelabs/angular/custom-events/custom-events.module.ts
  class CustomEventsModule (line 30) | class CustomEventsModule {}

FILE: apps/codelab/src/app/codelabs/angular/dependency-injection/dependency-injection.component.ts
  class DependencyInjectionComponent (line 10) | class DependencyInjectionComponent implements OnInit {
    method constructor (line 19) | constructor(private exercises: Ng2TsExercises) {
    method ngOnInit (line 23) | ngOnInit() {

FILE: apps/codelab/src/app/codelabs/angular/dependency-injection/dependency-injection.module.ts
  class DependencyInjectionModule (line 30) | class DependencyInjectionModule {}

FILE: apps/codelab/src/app/codelabs/angular/forms/forms.component.ts
  type FileHighlights (line 11) | interface FileHighlights {
  function formsConfig (line 17) | function formsConfig(code, highlights: FileHighlights = {}) {
  class FormsComponent (line 59) | class FormsComponent implements AfterViewInit {
    method constructor (line 125) | constructor(private exercises: Ng2TsExercises) {
    method ngAfterViewInit (line 129) | ngAfterViewInit() {

FILE: apps/codelab/src/app/codelabs/angular/forms/forms.module.ts
  class FormsCodelabModule (line 28) | class FormsCodelabModule {}

FILE: apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.component.5.ts
  class AppComponent (line 8) | class AppComponent {

FILE: apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.component.ts
  class AppComponent (line 8) | class AppComponent {

FILE: apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.module.6.ts
  class AppModule (line 13) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/forms/samples/basic/main.ts
  class MyResourceLoader (line 6) | class MyResourceLoader extends ResourceLoader {
    method get (line 7) | get(url: string): Promise<string> {

FILE: apps/codelab/src/app/codelabs/angular/material/material.component.ts
  type FileHighlights (line 17) | interface FileHighlights {
  function matExercise (line 22) | function matExercise(
  class MaterialComponent (line 61) | class MaterialComponent implements AfterViewInit {
    method constructor (line 149) | constructor(private exercises: Ng2TsExercises) {
    method ngAfterViewInit (line 153) | ngAfterViewInit() {
    method setTheme (line 157) | setTheme(theme) {

FILE: apps/codelab/src/app/codelabs/angular/material/material.module.ts
  class MaterialCodelabModule (line 36) | class MaterialCodelabModule {}

FILE: apps/codelab/src/app/codelabs/angular/material/samples/basic/app.component.ts
  class AppComponent (line 8) | class AppComponent {}

FILE: apps/codelab/src/app/codelabs/angular/material/samples/basic/app.module.ts
  class AppModule (line 20) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/material/samples/basic/main.ts
  class MyResourceLoader (line 6) | class MyResourceLoader extends ResourceLoader {
    method get (line 7) | get(url: string): Promise<string> {

FILE: apps/codelab/src/app/codelabs/angular/material/samples/step1/app.module.ts
  class AppModule (line 20) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/material/samples/step2/app.module.ts
  class AppModule (line 20) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/material/samples/step4/app.module.ts
  class AppModule (line 20) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/pipes/pipes.component.ts
  class PipesComponent (line 9) | class PipesComponent {
    method constructor (line 79) | constructor() {}

FILE: apps/codelab/src/app/codelabs/angular/pipes/pipes.module.ts
  class PipesModule (line 26) | class PipesModule {}

FILE: apps/codelab/src/app/codelabs/angular/pipes/samples/pipes/app.component.ts
  class AppComponent (line 7) | class AppComponent {

FILE: apps/codelab/src/app/codelabs/angular/pipes/samples/pipes/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/playground/playground.component.ts
  class PlaygroundComponent (line 10) | class PlaygroundComponent {
    method constructor (line 13) | constructor(
    method handleUpdate (line 27) | handleUpdate(code: any) {

FILE: apps/codelab/src/app/codelabs/angular/playground/playground.module.ts
  class PlaygroundModule (line 17) | class PlaygroundModule {}

FILE: apps/codelab/src/app/codelabs/angular/router/router.component.ts
  type FileHighlights (line 11) | interface FileHighlights {
  class RouterComponent (line 21) | class RouterComponent implements AfterViewInit {
    method constructor (line 55) | constructor(private exercises: Ng2TsExercises) {
    method ngAfterViewInit (line 59) | ngAfterViewInit() {

FILE: apps/codelab/src/app/codelabs/angular/router/router.module.ts
  class RouterCodelabModule (line 30) | class RouterCodelabModule {}

FILE: apps/codelab/src/app/codelabs/angular/router/samples/simple-router/app.component.ts
  class AppComponent (line 8) | class AppComponent {}

FILE: apps/codelab/src/app/codelabs/angular/router/samples/simple-router/app.module.ts
  class AppModule (line 18) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/router/samples/simple-router/components/kitten.ts
  class KittenComponent (line 7) | class KittenComponent {}

FILE: apps/codelab/src/app/codelabs/angular/router/samples/simple-router/components/puppy.ts
  class PuppyComponent (line 7) | class PuppyComponent {}

FILE: apps/codelab/src/app/codelabs/angular/router/samples/simple-router/main.ts
  class MyResourceLoader (line 6) | class MyResourceLoader extends ResourceLoader {
    method get (line 7) | get(url: string): Promise<string> {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/mat-tab-nav-bar/alert.component.ts
  class AlertComponent (line 9) | class AlertComponent {
    method constructor (line 10) | constructor() {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/mat-tab-nav-bar/app.component.ts
  class AppComponent (line 16) | class AppComponent {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/mat-tab-nav-bar/app.module.ts
  class AppModule (line 21) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/mat-tab-nav-bar/tab.component.ts
  class TabComponent (line 10) | class TabComponent {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs-structural-directive/alert.component.ts
  class AlertComponent (line 9) | class AlertComponent {
    method constructor (line 10) | constructor() {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs-structural-directive/app.component.ts
  class AppComponent (line 8) | class AppComponent {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs-structural-directive/app.module.ts
  class AppModule (line 14) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs-structural-directive/hideme.directive.solved.ts
  class HideMeDirective (line 11) | class HideMeDirective implements AfterViewInit {
    method constructor (line 12) | constructor(
    method toggleContentDisplay (line 23) | toggleContentDisplay(isDisplayed: boolean) {
    method ngAfterViewInit (line 31) | ngAfterViewInit() {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs-structural-directive/hideme.directive.ts
  class HideMeDirective (line 5) | class HideMeDirective {
    method constructor (line 6) | constructor() {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs-structural-directive/ignored.module.ts
  class IgnoredModule (line 9) | class IgnoredModule {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs/alert.component.ts
  class AlertComponent (line 9) | class AlertComponent {
    method constructor (line 10) | constructor() {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs/app.component.ts
  class AppComponent (line 8) | class AppComponent {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs/app.module.ts
  class AppModule (line 21) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs/break-my-computer.component.ts
  class BreakMyComputerComponent (line 10) | class BreakMyComputerComponent {
    method constructor (line 11) | constructor() {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/material-tabs/taet-led.component.ts
  class TaetLedComponent (line 16) | class TaetLedComponent {
    method constructor (line 17) | constructor() {}

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/samples/micro-syntax/ms.ts
  function parseTemplate (line 3) | function parseTemplate(template: string) {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/structural-directives.component.ts
  class StructuralDirectivesComponent (line 18) | class StructuralDirectivesComponent {
    method constructor (line 114) | constructor() {}
    method updateFontSize (line 116) | updateFontSize(diff) {

FILE: apps/codelab/src/app/codelabs/angular/structural-directives/structural-directives.module.ts
  class StructuralDirectivesModule (line 28) | class StructuralDirectivesModule {}

FILE: apps/codelab/src/app/codelabs/angular/templates/samples/data-binding-extra/app.component.ts
  class AppComponent (line 7) | class AppComponent {

FILE: apps/codelab/src/app/codelabs/angular/templates/samples/data-binding-extra/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/templates/samples/data-binding-extra/number-praiser.ts
  class BirthdayCardComponent (line 12) | class BirthdayCardComponent {

FILE: apps/codelab/src/app/codelabs/angular/templates/samples/event-binding/app.component.ts
  class AppComponent (line 7) | class AppComponent {

FILE: apps/codelab/src/app/codelabs/angular/templates/samples/event-binding/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/templates/samples/reference-binding/app.component.ts
  class AppComponent (line 7) | class AppComponent {

FILE: apps/codelab/src/app/codelabs/angular/templates/samples/reference-binding/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/codelab/src/app/codelabs/angular/templates/templates.component.ts
  class TemplatesComponent (line 18) | class TemplatesComponent implements OnInit {
    method constructor (line 32) | constructor() {}
    method ngOnInit (line 34) | ngOnInit() {

FILE: apps/codelab/src/app/codelabs/angular/templates/templates.module.ts
  class TemplatesModule (line 24) | class TemplatesModule {}

FILE: apps/codelab/src/app/codelabs/angular/typescript/typescript-routing.module.ts
  class EmptyTypeScriptComponent (line 11) | class EmptyTypeScriptComponent {}
  class TypeScriptRoutingModule (line 27) | class TypeScriptRoutingModule {}

FILE: apps/codelab/src/app/codelabs/angular/typescript/typescript.module.ts
  class TypeScriptModule (line 11) | class TypeScriptModule {}

FILE: apps/codelab/src/app/codelabs/angular/typescript/typescript/code/mini-exercise-test.ts
  function getFunctionNode (line 6) | function getFunctionNode(code) {

FILE: apps/codelab/src/app/codelabs/angular/typescript/typescript/typescript-svg/typescript-svg.component.ts
  class TypeScriptSvgComponent (line 7) | class TypeScriptSvgComponent implements OnInit {
    method constructor (line 8) | constructor() {}
    method ngOnInit (line 10) | ngOnInit() {}

FILE: apps/codelab/src/app/codelabs/angular/typescript/typescript/typescript.component.ts
  class TypeScriptComponent (line 17) | class TypeScriptComponent implements OnInit {
    method ngOnInit (line 26) | ngOnInit(): void {

FILE: apps/codelab/src/app/codelabs/codelabs-routing.module.ts
  class CodelabsRoutingModule (line 26) | class CodelabsRoutingModule {}

FILE: apps/codelab/src/app/codelabs/codelabs.module.ts
  class CodelabsModule (line 8) | class CodelabsModule {}

FILE: apps/codelab/src/app/codelabs/extra/code-playground/code-playground.component.ts
  class CodePlaygroundComponent (line 8) | class CodePlaygroundComponent {}

FILE: apps/codelab/src/app/codelabs/extra/code-playground/code-playground.module.ts
  class CodePlaygroundModule (line 15) | class CodePlaygroundModule {}

FILE: apps/codelab/src/app/codelabs/extra/extra-routing.module.ts
  class ExtraRoutingModule (line 45) | class ExtraRoutingModule {}

FILE: apps/codelab/src/app/codelabs/extra/extra.module.ts
  class ExtraModule (line 19) | class ExtraModule {}

FILE: apps/codelab/src/app/codelabs/extra/rating-summary/rating-summary.component.ts
  class RatingSummaryComponent (line 8) | class RatingSummaryComponent implements OnInit {
    method ngOnInit (line 9) | ngOnInit() {}

FILE: apps/codelab/src/app/codelabs/extra/rating-summary/rating-summary.module.ts
  class RatingSummaryModule (line 37) | class RatingSummaryModule {}

FILE: apps/codelab/src/app/codelabs/extra/visual-studio-code/visual-studio-code.component.ts
  class VisualStudioCodeComponent (line 8) | class VisualStudioCodeComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/codelab/src/app/codelabs/extra/visual-studio-code/visual-studio-code.module.ts
  class VisualStudioCodeModule (line 26) | class VisualStudioCodeModule {}

FILE: apps/codelab/src/app/common.ts
  type MenuRoutes (line 4) | type MenuRoutes = MenuRoute[];
  type MenuRoute (line 6) | interface MenuRoute extends Route {
  constant MENU_ROUTES (line 15) | const MENU_ROUTES = new InjectionToken<MenuRoutes>('menuRoutes');

FILE: apps/codelab/src/app/components/angular-routes/angular-routes.component.ts
  class AngularRoutesComponent (line 10) | class AngularRoutesComponent {
    method constructor (line 11) | constructor(@Inject(MENU_ROUTES) readonly menuRoutes) {}

FILE: apps/codelab/src/app/components/angular-routes/angular-routes.module.ts
  class AngularRoutesModule (line 11) | class AngularRoutesModule {}

FILE: apps/codelab/src/app/components/angular-test-runner/angular-test-runner.component.ts
  function addMetaInformation (line 29) | function addMetaInformation(sandbox, files: { [key: string]: string }) {
  class SimpleAngularTestRunnerComponent (line 66) | class SimpleAngularTestRunnerComponent
    method constructor (line 84) | constructor(
    method ngOnInit (line 89) | ngOnInit() {
    method ngOnChanges (line 112) | ngOnChanges(changes: SimpleChanges) {
    method ngAfterViewInit (line 118) | async ngAfterViewInit() {
    method ngOnDestroy (line 169) | ngOnDestroy() {

FILE: apps/codelab/src/app/components/angular-test-runner/tests.ts
  function handleTestMessage (line 1) | function handleTestMessage(message, tests) {

FILE: apps/codelab/src/app/components/babel-test-runner/babel-helpers.ts
  function matchesValue (line 9) | function matchesValue(actual, expected) {
  function matchesTemplateLiteral (line 36) | function matchesTemplateLiteral() {
  function matchesStringLiteral (line 43) | function matchesStringLiteral() {
  function babelTestSuite (line 55) | function babelTestSuite(filePath, tests) {
  type Predicate (line 82) | type Predicate = (node: TsTypes.Node) => boolean;
  class MiniTsQuery (line 84) | class MiniTsQuery {
    method constructor (line 85) | constructor(private readonly ast: TsTypes.Node) {}
    method some (line 87) | some(predicate: Predicate) {
    method findOne (line 99) | findOne(predicate) {
    method hasOne (line 111) | hasOne(predicate) {
    method hasIdentifier (line 115) | hasIdentifier(identifier: string) {
    method getIdentifier (line 119) | getIdentifier(identifier: string) {
    method hasConstructorParam (line 125) | hasConstructorParam(identifier: string, type: string) {
    method hasVariableDeclaration (line 133) | hasVariableDeclaration(identifier: string) {
    method hasDecorator (line 138) | hasDecorator(type: string) {
    method hasDecoratorValue (line 142) | hasDecoratorValue(decoratorType: string, property: string, type: strin...
    method hasProvider (line 160) | hasProvider(type: string) {
    method getDecorator (line 164) | getDecorator(type: string): TsTypes.Decorator {
    method traverse (line 177) | private traverse(node, callback) {
  function tsAstTestSuite (line 183) | function tsAstTestSuite(tests) {

FILE: apps/codelab/src/app/components/babel-test-runner/babel-test-runner.component.ts
  class BabelTestRunnerComponent (line 21) | class BabelTestRunnerComponent implements AfterViewInit, OnChanges {
    method constructor (line 28) | constructor() {}
    method ngOnChanges (line 32) | ngOnChanges(changes: SimpleChanges) {
    method run (line 38) | run(files: any) {
    method selectFile (line 63) | selectFile(file: FileConfig) {
    method ngAfterViewInit (line 67) | ngAfterViewInit(): void {

FILE: apps/codelab/src/app/components/breadcrumb/breadcrumb.component.ts
  class BreadcrumbComponent (line 10) | class BreadcrumbComponent {
    method constructor (line 14) | constructor(

FILE: apps/codelab/src/app/components/buttons-nav-bar/buttons-nav-bar.component.ts
  class ButtonsNavBarComponent (line 8) | class ButtonsNavBarComponent {}

FILE: apps/codelab/src/app/components/buttons-nav-bar/buttons-nav-bar.module.ts
  class ButtonsNavBarModule (line 29) | class ButtonsNavBarModule {}

FILE: apps/codelab/src/app/components/buttons-nav-bar/menu-fullscreen-widget/menu-fullscreen-widget.component.ts
  class MenuFullscreenWidgetComponent (line 9) | class MenuFullscreenWidgetComponent {
    method constructor (line 10) | constructor(private fullScreenService: FullScreenModeService) {}
    method openFullScreen (line 12) | openFullScreen() {

FILE: apps/codelab/src/app/components/buttons-nav-bar/menu-github-widget/menu-github-widget.component.ts
  class MenuGithubWidgetComponent (line 8) | class MenuGithubWidgetComponent {}

FILE: apps/codelab/src/app/components/buttons-nav-bar/menu-github-widget/menu-github-widget.module.ts
  class MenuGithubWidgetModule (line 11) | class MenuGithubWidgetModule {}

FILE: apps/codelab/src/app/components/buttons-nav-bar/menu-shortcut-widget/menu-shortcut-widget.component.ts
  class MenuShortcutWidgetComponent (line 9) | class MenuShortcutWidgetComponent {
    method constructor (line 10) | constructor(@Inject(MENU_ROUTES) readonly menuRoutes) {}

FILE: apps/codelab/src/app/components/buttons-nav-bar/menu-shortcut-widget/menu-shortcut-widget.module.ts
  class MenuShortcutWidgetModule (line 12) | class MenuShortcutWidgetModule {}

FILE: apps/codelab/src/app/components/codelab-components.module.ts
  class CodelabComponentsModule (line 62) | class CodelabComponentsModule {}

FILE: apps/codelab/src/app/components/codelab-progress-bar/codelab-progress-bar.component.ts
  class CodelabProgressBarComponent (line 9) | class CodelabProgressBarComponent implements AfterViewInit {
    method constructor (line 14) | constructor(public deck: SlidesDeckComponent) {}
    method ngAfterViewInit (line 16) | ngAfterViewInit() {
    method previewSlide (line 28) | previewSlide(index) {
    method goToSlide (line 33) | goToSlide(index) {

FILE: apps/codelab/src/app/components/exercise-playground/codelab-exercise-playground.component.ts
  class CodelabExercisePlaygroundComponent (line 10) | class CodelabExercisePlaygroundComponent extends CodelabExerciseComponent {

FILE: apps/codelab/src/app/components/exercise-preview/exercise-preview.component.ts
  class CodelabExercisePreviewComponent (line 13) | class CodelabExercisePreviewComponent extends CodelabExerciseComponent {
    method exercise (line 14) | set exercise(exercise) {

FILE: apps/codelab/src/app/components/exercise/exercise.component.ts
  function filterByFileType (line 5) | function filterByFileType(type: string, files: Record<string, string>) {
  function extractSolutions (line 14) | function extractSolutions(files: any[]) {
  function getChanges (line 24) | function getChanges(current, previous) {
  class CodelabExerciseComponent (line 38) | class CodelabExerciseComponent extends CodeDemoComponent {
    method constructor (line 41) | constructor(private readonly cdr: ChangeDetectorRef) {
    method showDogs (line 45) | showDogs() {
    method exercise (line 49) | set exercise(exercise) {
    method retrieveFile (line 66) | retrieveFile(file, code) {

FILE: apps/codelab/src/app/components/external-link-directive/external-link-directive.directive.ts
  class ExternalLinkDirectiveDirective (line 8) | class ExternalLinkDirectiveDirective {
    method constructor (line 9) | constructor({ nativeElement }: ElementRef) {

FILE: apps/codelab/src/app/components/index/index.component.ts
  class IndexComponent (line 8) | class IndexComponent {

FILE: apps/codelab/src/app/components/index/index.module.ts
  class IndexModule (line 26) | class IndexModule {}

FILE: apps/codelab/src/app/components/login/login.component.ts
  class LoginComponent (line 11) | class LoginComponent {
    method constructor (line 12) | constructor(
    method login (line 17) | login() {

FILE: apps/codelab/src/app/components/login/login.module.ts
  class LoginModule (line 12) | class LoginModule {}

FILE: apps/codelab/src/app/components/not-found/not-found.component.ts
  class NotFoundComponent (line 9) | class NotFoundComponent {

FILE: apps/codelab/src/app/components/not-found/not-found.module.ts
  class NotFoundModule (line 11) | class NotFoundModule {}

FILE: apps/codelab/src/app/components/slides-preview/codelab-preview.component.ts
  class CodelabPreviewComponent (line 11) | class CodelabPreviewComponent implements OnInit {
    method constructor (line 16) | constructor(
    method ngOnInit (line 23) | ngOnInit() {
    method expandToggle (line 41) | expandToggle() {

FILE: apps/codelab/src/app/components/slides/closing-slide/codelab-closing-slide.component.ts
  class CodelabClosingSlideComponent (line 8) | class CodelabClosingSlideComponent implements OnInit {
    method constructor (line 13) | constructor() {}
    method ngOnInit (line 15) | ngOnInit() {}

FILE: apps/codelab/src/app/components/slides/title-slide/ripple-animation/codelab-ripple-animation.component.ts
  class CodelabRippleAnimationComponent (line 8) | class CodelabRippleAnimationComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/codelab/src/app/components/slides/title-slide/title-slide.component.ts
  class TitleSlideComponent (line 8) | class TitleSlideComponent {

FILE: apps/codelab/src/app/containers/full-layout/full-layout.component.ts
  class FullLayoutComponent (line 10) | class FullLayoutComponent {
    method constructor (line 12) | constructor(@Optional() route: ActivatedRoute) {

FILE: apps/codelab/src/app/containers/full-layout/full-layout.module.ts
  class FullLayoutModule (line 11) | class FullLayoutModule {}

FILE: apps/codelab/src/app/directives/directives.module.ts
  class DirectivesModule (line 21) | class DirectivesModule {}

FILE: apps/codelab/src/app/directives/nextSlide.directive.ts
  class NextSlideDirective (line 7) | class NextSlideDirective {
    method constructor (line 8) | constructor(public deck: SlidesDeckComponent) {}
    method onClick (line 11) | onClick() {

FILE: apps/codelab/src/app/directives/permissions/abstract-permission.ts
  class AbstractPermission (line 11) | class AbstractPermission implements OnDestroy {
    method constructor (line 14) | constructor(
    method ngOnDestroy (line 20) | ngOnDestroy() {
    method render (line 25) | public render(observable: Observable<boolean>): void {

FILE: apps/codelab/src/app/directives/permissions/can-load-admin/can-load-admin.directive.ts
  class CanLoadAdminDirective (line 16) | class CanLoadAdminDirective extends AbstractPermission
    method constructor (line 18) | constructor(
    method ngOnInit (line 26) | ngOnInit() {

FILE: apps/codelab/src/app/directives/permissions/is-logged-in/is-loggef-in.directive.ts
  class IsLoggedInDirective (line 13) | class IsLoggedInDirective extends AbstractPermission implements OnInit {
    method constructor (line 14) | constructor(
    method ngOnInit (line 22) | ngOnInit() {

FILE: apps/codelab/src/app/directives/previousSlide.directive.ts
  class PreviousSlideDirective (line 7) | class PreviousSlideDirective {
    method constructor (line 8) | constructor(public deck: SlidesDeckComponent) {}
    method onClick (line 11) | onClick() {

FILE: apps/codelab/src/app/shared/angular-code/app.component.ts
  class AppComponent (line 7) | class AppComponent {}

FILE: apps/codelab/src/app/shared/angular-code/app.module.ts
  class AppModule (line 10) | class AppModule {}

FILE: apps/codelab/src/app/shared/angular-code/bootstrap.ts
  class MyResourceLoader (line 6) | class MyResourceLoader extends ResourceLoader {
    method get (line 7) | get(url: string): Promise<string> {

FILE: apps/codelab/src/app/shared/helpers/codelabFile.ts
  type FileType (line 3) | enum FileType {
  class CodelabFile (line 21) | class CodelabFile implements FileConfig {
    method TypeScriptFile (line 34) | static TypeScriptFile(name: string): CodelabFile {
    method TypeScriptTest (line 40) | static TypeScriptTest(name: string): CodelabFile {
    method Html (line 44) | static Html(name: string): CodelabFile {
    method Css (line 48) | static Css(name: string): CodelabFile {
    method constructor (line 52) | constructor(
    method setAfter (line 59) | public setAfter(after: string): CodelabFile {
    method clone (line 64) | public clone(): CodelabFile {
    method makeBootstrappable (line 68) | public makeBootstrappable(): CodelabFile {
    method makeHidden (line 74) | public makeHidden(): CodelabFile {
    method makeTest (line 79) | public makeTest(): CodelabFile {
    method setSolution (line 89) | public setSolution(solution: string): CodelabFile {
    method withHighlight (line 94) | public withHighlight(highlight: RegExp | RegExp[]) {
    method setCode (line 99) | public setCode(code: string): CodelabFile {

FILE: apps/codelab/src/app/shared/helpers/helpers.ts
  function exerciseWithConsoleLog (line 3) | function exerciseWithConsoleLog(moduleName: string, code: any, code2: an...
  function exercise (line 36) | function exercise(
  function test (line 56) | function test(moduleName: string, template: string): FileConfig {
  type SimpleImport (line 72) | interface SimpleImport {
  method imports (line 78) | imports(imports: Array<SimpleImport>) {
  method ngModule (line 85) | ngModule(
  method bootstrap (line 108) | bootstrap(
  function html (line 144) | function html(path = 'app', code, solution = '') {
  function stylesheet (line 153) | function stylesheet(code, solution = '') {
  function bootstrap (line 162) | function bootstrap(
  function circleAndBox (line 180) | function circleAndBox() {
  function boxAndCircle (line 189) | function boxAndCircle() {
  function displayAngularComponent (line 266) | function displayAngularComponent(
  function typeScriptWithConsoleLog (line 303) | function typeScriptWithConsoleLog(
  function javaScriptWithConsoleLog (line 327) | function javaScriptWithConsoleLog(
  function displayAngularComponentWithHtml (line 343) | function displayAngularComponentWithHtml(
  function solve (line 360) | function solve(exerciseConfig) {

FILE: apps/codelab/src/app/shared/interfaces/exercise-config.ts
  type ExerciseConfig (line 4) | interface ExerciseConfig {

FILE: apps/codelab/src/app/shared/interfaces/file-config.ts
  type FileConfig (line 1) | interface FileConfig {

FILE: apps/codelab/src/app/shared/interfaces/test-info.ts
  type TestInfo (line 3) | interface TestInfo {

FILE: apps/codelab/src/app/shared/services/access.service.ts
  type Permissions (line 8) | enum Permissions {
  class AccessService (line 14) | class AccessService {
    method constructor (line 30) | constructor(
    method can (line 35) | can(p: Permissions): Observable<boolean> {

FILE: apps/codelab/src/app/shared/services/guards/admin-guard.ts
  class AdminGuard (line 13) | class AdminGuard implements CanActivate {
    method constructor (line 14) | constructor(private _route: Router, private accessService: AccessServi...
    method canActivate (line 16) | canActivate(

FILE: apps/codelab/src/app/shared/services/guards/login-guard.ts
  class LoginGuard (line 10) | class LoginGuard implements CanActivate {
    method constructor (line 11) | constructor(private _route: Router, private loginService: LoginService...
    method canActivate (line 13) | canActivate(

FILE: apps/codelab/src/app/shared/shared.module.ts
  class SharedModule (line 31) | class SharedModule {}

FILE: apps/codelab/src/app/sync/sync.component.ts
  class SyncComponent (line 17) | class SyncComponent {
    method constructor (line 66) | constructor(

FILE: apps/codelab/src/app/sync/sync.module.ts
  class SyncModule (line 23) | class SyncModule {}
  class SyncAdminWrapperComponent (line 29) | class SyncAdminWrapperComponent {}
  class SyncAdminModule (line 39) | class SyncAdminModule {}

FILE: apps/codelab/src/polyfills.ts
  method indexOf (line 11) | indexOf() {
  method getuid (line 15) | getuid() {

FILE: apps/codelab/src/typings.d.ts
  type NodeModule (line 4) | interface NodeModule {

FILE: apps/kirjs/src/app/app.component.ts
  class AppComponent (line 9) | class AppComponent {
    method HandleLinker (line 13) | HandleLinker() {
    method constructor (line 25) | constructor(private router: Router) {

FILE: apps/kirjs/src/app/kirjs.module.ts
  class KirjsModule (line 189) | class KirjsModule {}

FILE: apps/kirjs/src/app/modules/ast/ast-preview-runner/ast-preview-runner.component.ts
  class AstPreviewRunnerComponent (line 18) | class AstPreviewRunnerComponent implements OnChanges {
    method update (line 25) | update() {
    method selectNode (line 29) | selectNode({ loc }) {
    method run (line 38) | run() {
    method ngOnChanges (line 50) | ngOnChanges(changes: SimpleChanges) {
    method constructor (line 54) | constructor() {}

FILE: apps/kirjs/src/app/modules/ast/ast-preview-runner/ast-preview-runner.module.ts
  class AstPreviewRunnerModule (line 12) | class AstPreviewRunnerModule {}

FILE: apps/kirjs/src/app/modules/ast/ast.component.ts
  function jsify (line 19) | function jsify(program) {
  class AstComponent (line 79) | class AstComponent {
    method constructor (line 205) | constructor() {}
    method matchTreePartsLoc (line 207) | matchTreePartsLoc(code) {
    method matchTreePartsBody (line 211) | matchTreePartsBody(code) {
    method matchTreePartsType (line 215) | matchTreePartsType(code) {
    method updateFontSize (line 219) | updateFontSize(diff) {

FILE: apps/kirjs/src/app/modules/ast/ast.module.ts
  class AstModule (line 45) | class AstModule {}

FILE: apps/kirjs/src/app/modules/ast/babel-highlight/babel-highlight-match.directive.ts
  class BabelHighlightDirective (line 9) | class BabelHighlightDirective implements AfterViewInit {
    method constructor (line 13) | constructor(private editorComponent: CodeDemoEditorComponent) {}
    method ngAfterViewInit (line 15) | ngAfterViewInit(): void {
  class MockaADASDASDASDASDASDModule (line 36) | class MockaADASDASDASDASDASDModule {}

FILE: apps/kirjs/src/app/modules/ast/debugger/debugger.component.ts
  class DebuggerComponent (line 11) | class DebuggerComponent implements OnInit {
    method constructor (line 15) | constructor() {}
    method run (line 17) | run() {
    method ngOnInit (line 21) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/ast/debugger/debugger.ts
  function weird (line 1) | function weird() {

FILE: apps/kirjs/src/app/modules/ast/new-progress-bar/new-progress-bar.component.ts
  class NewProgressBarComponent (line 15) | class NewProgressBarComponent implements AfterViewInit {
    method constructor (line 23) | constructor(public deck: SlidesDeckComponent) {}
    method ngAfterViewInit (line 25) | ngAfterViewInit() {
    method previewSlide (line 37) | previewSlide(index) {
    method goToSlide (line 42) | goToSlide(index) {

FILE: apps/kirjs/src/app/modules/ast/new-progress-bar/new-progress-bar.module.ts
  class NewProgressBarModule (line 11) | class NewProgressBarModule {}

FILE: apps/kirjs/src/app/modules/ast/parse-hello-world-ast.ts
  function isLoc (line 5) | function isLoc(node) {
  function isType (line 14) | function isType(node) {
  function isBody (line 18) | function isBody(node) {
  function removeLoc (line 22) | function removeLoc(path) {
  function removeExtra (line 28) | function removeExtra(path) {
  function locToMonacoLoc (line 34) | function locToMonacoLoc(loc, className) {
  function parseCode (line 45) | function parseCode(code) {
  function processCode (line 49) | function processCode(code, { remove = [] }: any) {
  function findHighlightsObjectProp (line 64) | function findHighlightsObjectProp(code: string, matchers: Array<any>) {
  function findHighlightsAll (line 82) | function findHighlightsAll(code: string, matcher) {
  function removeDoubleWhiteLines (line 101) | function removeDoubleWhiteLines(code) {

FILE: apps/kirjs/src/app/modules/ast/samples/dec-to-bin-with-semicolons.js
  function bin6BitsToDec (line 1) | function bin6BitsToDec(bin) {

FILE: apps/kirjs/src/app/modules/ast/samples/dec-to-bin.js
  function bin6BitsToDec (line 1) | function bin6BitsToDec(bin) {

FILE: apps/kirjs/src/app/modules/ast/samples/eslint/eslint.js
  function findFit (line 1) | function findFit(code, { babylon, babelTraverse, babelGenerator, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/eslint/eslint.test.js
  function testThings (line 1) | function testThings(findDebugger, callback, args) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/find-console-log-babel.solved.ts
  function findConsoleLogSolved (line 2) | function findConsoleLogSolved(code, { babylon, babelTraverse, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/find-console-log-babel.ts
  function findConsoleLogBabel (line 1) | function findConsoleLogBabel(code, { babylon, babelTraverse, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/find-console-log-regex.solved.js
  function findConsoleLog (line 1) | function findConsoleLog(code) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/find-console-log.js
  function findConsoleLog (line 1) | function findConsoleLog(code) {}

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/find-console-log.test.js
  function testThings (line 1) | function testThings(findConsoleLog, callback, args) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/remove-console-log.solved.ts
  function removeConsoleLogSolved (line 1) | function removeConsoleLogSolved(

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/remove-console-log.test.js
  function testThings (line 1) | function testThings(findConsoleLog, callback, args) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/remove-console-log.ts
  function removeConsoleLog (line 1) | function removeConsoleLog(

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/traverse-console-log-babel.solved.ts
  function traverseConsoleLogSolved (line 1) | function traverseConsoleLogSolved(

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/traverse-console-log-babel.solved2.ts
  function traverseConsoleLogSolved2 (line 1) | function traverseConsoleLogSolved2(code, { babylon, babelTraverse, types...

FILE: apps/kirjs/src/app/modules/ast/samples/find-console-log/traverse-console-log-babel.ts
  function traverseConsoleLog (line 1) | function traverseConsoleLog(code, { babylon, babelTraverse, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/find-debugger-babel.solved.ts
  function findDebuggerSolved (line 2) | function findDebuggerSolved(code, { babylon, babelTraverse, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/find-debugger-babel.ts
  function findDebuggerBabel (line 1) | function findDebuggerBabel(code, { babylon, babelTraverse, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/find-debugger-regex.solved.js
  function findDebugger (line 1) | function findDebugger(code) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/find-debugger.js
  function findDebugger (line 1) | function findDebugger(code) {}

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/find-debugger.test.js
  function testThings (line 1) | function testThings(findDebugger, callback, args) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/hint.js
  function hello (line 3) | function hello() {
  function hello3 (line 8) | function hello3() {
  function hello2 (line 13) | function hello2() {}
  function hello3 (line 16) | function hello3() {}

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/remove-debugger.solved.ts
  function removeDebuggerSolved (line 1) | function removeDebuggerSolved(

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/remove-debugger.test.js
  function testThings (line 1) | function testThings(findDebugger, callback, args) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/remove-debugger.ts
  function removeDebugger (line 1) | function removeDebugger(code, { babylon, babelTraverse, babelGenerator, ...

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/traverse-debugger-babel.solved.ts
  function traverseDebuggerSolved (line 1) | function traverseDebuggerSolved(code, { babylon, babelTraverse, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-debugger/traverse-debugger-babel.ts
  function traverseDebugger (line 1) | function traverseDebugger(code, { babylon, babelTraverse, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-fit/find-fit.js
  function findFit (line 1) | function findFit(code, { babylon, babelTraverse, babelGenerator, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-fit/find-fit.solved.js
  function findFit (line 1) | function findFit(code, { babylon, babelTraverse, babelGenerator, log }) {

FILE: apps/kirjs/src/app/modules/ast/samples/find-fit/find-fit.test.js
  function testThings (line 1) | function testThings(findDebugger, callback, args) {

FILE: apps/kirjs/src/app/modules/ast/samples/it-lines/it-lines.js
  function addItByLine (line 1) | function addItByLine(

FILE: apps/kirjs/src/app/modules/ast/samples/it-lines/it-lines.solved.js
  function addItByLine (line 1) | function addItByLine(

FILE: apps/kirjs/src/app/modules/ast/samples/it-lines/it-lines.test.js
  function testThings (line 1) | function testThings(findDebugger, callback, args) {

FILE: apps/kirjs/src/app/modules/ast/samples/tricky.js
  function hello (line 18) | function hello() {

FILE: apps/kirjs/src/app/modules/ast/size-picker/size-picker.component.ts
  class SizePickerComponent (line 8) | class SizePickerComponent {

FILE: apps/kirjs/src/app/modules/ast/size-picker/size-picker.module.ts
  class SizePickerModule (line 8) | class SizePickerModule {}

FILE: apps/kirjs/src/app/modules/ast/test-set/babel-test-runner/babel-test-runner.component.ts
  class BabelTestRunnerComponent (line 16) | class BabelTestRunnerComponent {
    method run (line 26) | run(files: Array<any>) {
    method firstFailingIndex (line 53) | firstFailingIndex() {
    method runTests (line 58) | runTests() {
    method ngOnInit (line 62) | ngOnInit() {

FILE: apps/kirjs/src/app/modules/ast/test-set/test-set.component.ts
  class TestSetComponent (line 8) | class TestSetComponent {

FILE: apps/kirjs/src/app/modules/binary/angular-flags/angular-flags.component.ts
  class AngularFlagsComponent (line 8) | class AngularFlagsComponent implements OnInit {
    method constructor (line 53) | constructor() {
    method syncCheckBoxes (line 57) | syncCheckBoxes() {
    method ngOnInit (line 61) | ngOnInit() {}
    method handleClick (line 63) | handleClick(checked: boolean, value: number) {

FILE: apps/kirjs/src/app/modules/binary/ascii/ascii.component.ts
  function encode (line 9) | function encode(from: number, to: number, encoding: string) {
  class AsciiComponent (line 26) | class AsciiComponent implements OnChanges {
    method constructor (line 54) | constructor() {
    method ngOnChanges (line 58) | ngOnChanges(changes: SimpleChanges): void {

FILE: apps/kirjs/src/app/modules/binary/binary-flat/binary-flat.component.ts
  function flatten (line 14) | function flatten(
  class BinaryFlatComponent (line 53) | class BinaryFlatComponent implements OnChanges {
    method constructor (line 61) | constructor(private readonly root: BinaryParentComponent) {}
    method update (line 63) | update(event, item) {
    method ngOnChanges (line 67) | ngOnChanges(changes: SimpleChanges): void {

FILE: apps/kirjs/src/app/modules/binary/binary-gif/binary-gif.component.ts
  class BinaryGifComponent (line 8) | class BinaryGifComponent {
    method binary (line 12) | set binary(binary: string) {

FILE: apps/kirjs/src/app/modules/binary/binary-inline/binary-display/binary-display.component.ts
  class BinaryDisplayComponent (line 8) | class BinaryDisplayComponent {
    method binary (line 11) | set binary(binary: string) {

FILE: apps/kirjs/src/app/modules/binary/binary-inline/binary-inline.component.ts
  class BinaryInlineComponent (line 11) | class BinaryInlineComponent implements OnChanges {
    method ngOnChanges (line 18) | ngOnChanges(changes: SimpleChanges): void {

FILE: apps/kirjs/src/app/modules/binary/binary-inline/binary-inline.module.ts
  class BinaryInlineModule (line 11) | class BinaryInlineModule {}

FILE: apps/kirjs/src/app/modules/binary/binary-parser-demo/binary-parser-demo.component.ts
  class BinaryParserDemoComponent (line 13) | class BinaryParserDemoComponent implements OnInit {
    method constructor (line 23) | constructor() {}
    method ngOnInit (line 25) | ngOnInit() {
    method generateCode (line 30) | generateCode() {

FILE: apps/kirjs/src/app/modules/binary/binary-plain/binary-plain.component.ts
  class BinaryPlainComponent (line 17) | class BinaryPlainComponent implements OnChanges {
    method highlighted (line 45) | get highlighted() {
    method ngOnChanges (line 51) | ngOnChanges() {
    method update (line 63) | update(chunk: any, value: any) {

FILE: apps/kirjs/src/app/modules/binary/binary-view/array/array.component.ts
  class ArrayComponent (line 8) | class ArrayComponent implements OnInit {
    method constructor (line 12) | constructor() {}
    method trackBy (line 14) | trackBy(i, data) {
    method ngOnInit (line 18) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/binary-view/binary-parent/binary-parent.component.ts
  class BinaryParentComponent (line 17) | class BinaryParentComponent implements OnInit, OnChanges {
    method constructor (line 27) | constructor() {}
    method ngOnInit (line 29) | ngOnInit() {
    method ngOnChanges (line 33) | ngOnChanges() {
    method regenerate (line 37) | regenerate() {
    method update (line 43) | update(chunk, value) {
    method updatePart (line 52) | updatePart(chunk, value) {

FILE: apps/kirjs/src/app/modules/binary/binary-view/binary-view.module.ts
  class BinaryViewModule (line 61) | class BinaryViewModule {}

FILE: apps/kirjs/src/app/modules/binary/binary-view/bits/bits.component.ts
  class BitsComponent (line 9) | class BitsComponent {
    method constructor (line 13) | constructor(private readonly root: BinaryParentComponent) {}
    method update (line 15) | update(value) {

FILE: apps/kirjs/src/app/modules/binary/binary-view/block/block.component.ts
  class BlockComponent (line 33) | class BlockComponent implements OnInit, OnChanges {
    method constructor (line 38) | constructor(
    method ngOnChanges (line 44) | ngOnChanges(changes) {
    method ngOnInit (line 55) | ngOnInit() {

FILE: apps/kirjs/src/app/modules/binary/binary-view/color/color.component.ts
  class ColorComponent (line 9) | class ColorComponent implements OnInit {
    method constructor (line 12) | constructor(private readonly root: BinaryParentComponent) {}
    method data (line 16) | get data() {
    method data (line 21) | set data(data) {
    method update (line 26) | update(value) {
    method updateBinary (line 34) | updateBinary(binary) {
    method ngOnInit (line 38) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/binary-view/hex/hex.component.ts
  class HexComponent (line 8) | class HexComponent implements OnInit {
    method constructor (line 11) | constructor() {}
    method ngOnInit (line 13) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/binary-view/inline-root/inline-root.component.ts
  class InlineRootComponent (line 8) | class InlineRootComponent implements OnInit {
    method constructor (line 13) | constructor() {}
    method ngOnInit (line 15) | ngOnInit() {}
    method display (line 17) | display(displayData: any) {

FILE: apps/kirjs/src/app/modules/binary/binary-view/inline/inline.component.ts
  class InlineComponent (line 10) | class InlineComponent implements OnInit {
    method constructor (line 14) | constructor(
    method data (line 21) | get data() {
    method data (line 26) | set data(data) {
    method updateValue (line 32) | updateValue(value) {
    method ngOnInit (line 36) | ngOnInit() {}
    method display (line 38) | display() {

FILE: apps/kirjs/src/app/modules/binary/binary-view/number/number.component.ts
  class NumberComponent (line 9) | class NumberComponent implements OnInit {
    method constructor (line 13) | constructor(private readonly root: BinaryParentComponent) {}
    method update (line 15) | update(value) {
    method updateBinary (line 23) | updateBinary(binary) {
    method ngOnInit (line 27) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/binary-view/object/object.component.ts
  class ObjectComponent (line 8) | class ObjectComponent implements OnInit {
    method constructor (line 12) | constructor(private cdr: ChangeDetectorRef) {}
    method ngOnInit (line 14) | ngOnInit() {}
    method trackBy (line 16) | trackBy(i, data) {
    method init (line 20) | init() {

FILE: apps/kirjs/src/app/modules/binary/binary-view/string/string.component.ts
  class StringComponent (line 9) | class StringComponent implements OnInit {
    method data (line 10) | get data() {
    method data (line 15) | set data(data) {
    method constructor (line 23) | constructor(private readonly root: BinaryParentComponent) {}
    method updateBinary (line 25) | updateBinary(binary) {
    method update (line 29) | update(value) {
    method ngOnInit (line 40) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/binary.component.ts
  class BinaryComponent (line 14) | class BinaryComponent {
    method evalMessage (line 377) | evalMessage() {
    method setLittleGifBinary (line 381) | setLittleGifBinary(value: string) {

FILE: apps/kirjs/src/app/modules/binary/binary.module.ts
  class BinaryModule (line 85) | class BinaryModule {}

FILE: apps/kirjs/src/app/modules/binary/bindec/bindec.component.ts
  class BindecComponent (line 8) | class BindecComponent implements OnInit {
    method constructor (line 14) | constructor() {}
    method size (line 16) | get size() {
    method convertedValue (line 20) | get convertedValue() {
    method getBaseValue (line 30) | getBaseValue(i: number) {
    method update (line 34) | update(value) {}
    method ngOnInit (line 36) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/bit/bit.component.ts
  class BitComponent (line 8) | class BitComponent implements OnInit, OnDestroy {
    method generate (line 18) | generate() {
    method ngOnDestroy (line 24) | ngOnDestroy() {
    method ngOnInit (line 28) | ngOnInit() {

FILE: apps/kirjs/src/app/modules/binary/bitwise/bitwise.component.ts
  class BitwiseComponent (line 8) | class BitwiseComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/color-indexing/color-indexing.component.ts
  type TableItem (line 3) | interface TableItem {
  type ColorTableHash (line 8) | interface ColorTableHash {
  class ColorIndexingComponent (line 17) | class ColorIndexingComponent implements OnInit {
    method constructor (line 27) | constructor() {
    method index (line 31) | index() {
    method generate (line 41) | generate() {
    method ngOnInit (line 52) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/compare/compare.component.ts
  class CompareComponent (line 8) | class CompareComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/fake-gif/fake-gif.component.ts
  type Chunk (line 13) | interface Chunk {
  class FakeGifComponent (line 25) | class FakeGifComponent implements AfterViewInit {
    method constructor (line 43) | constructor() {}
    method upload (line 45) | upload(file) {
    method update (line 59) | update(chunk, value) {
    method ngAfterViewInit (line 67) | ngAfterViewInit() {
    method updateChunk (line 74) | updateChunk({ chunk, value }) {

FILE: apps/kirjs/src/app/modules/binary/fake-gif/gif-parser.ts
  function gifParser (line 4) | function gifParser(t: { [key: string]: string }) {

FILE: apps/kirjs/src/app/modules/binary/fake-gif/gif.ts
  function lzw (line 1) | function lzw(minCodeSize, data, pixelCount) {

FILE: apps/kirjs/src/app/modules/binary/gif-palette/gif-palette.component.ts
  type Chunk (line 3) | interface Chunk {
  class GifPaletteComponent (line 15) | class GifPaletteComponent implements OnInit {
    method value (line 22) | get value() {
    method value (line 27) | set value(val: string) {
    method serialize (line 34) | serialize() {
    method ngOnInit (line 44) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/hexdec/hexdec.component.ts
  class HexdecComponent (line 8) | class HexdecComponent implements OnInit {
    method constructor (line 14) | constructor() {}
    method ngOnInit (line 16) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/html-post/html-post.component.ts
  class HtmlPostComponent (line 9) | class HtmlPostComponent {
    method constructor (line 12) | constructor(private sanitizer: DomSanitizer) {
    method param (line 17) | set param(html: string) {

FILE: apps/kirjs/src/app/modules/binary/json/json.component.ts
  function strToBin (line 3) | function strToBin(s: string) {
  class JsonComponent (line 14) | class JsonComponent implements OnInit {
    method constructor (line 31) | constructor() {}
    method handleLineChange (line 33) | handleLineChange({ value: code, lineNumber }) {
    method ngOnInit (line 115) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/memory/memory.component.ts
  class MemoryComponent (line 8) | class MemoryComponent implements OnInit {
    method constructor (line 18) | constructor() {}
    method allocValues (line 20) | allocValues(values, classes = []) {
    method highlightBoolean (line 38) | highlightBoolean(i: number) {
    method highlightShouldBe (line 43) | highlightShouldBe(i: number) {
    method highlightNumber (line 47) | highlightNumber(i: number) {
    method ngOnInit (line 56) | ngOnInit() {

FILE: apps/kirjs/src/app/modules/binary/message/message.component.ts
  function toByte (line 3) | function toByte(message) {
  method boolean (line 13) | boolean(message) {
  method uint16 (line 22) | uint16(message) {
  method uint17 (line 29) | uint17(message) {
  method uint32 (line 36) | uint32(message) {
  method hex (line 43) | hex(message) {
  method uint8 (line 50) | uint8(message) {
  method int8 (line 57) | int8(message) {
  method string (line 67) | string(message) {
  class MessageComponent (line 81) | class MessageComponent implements OnInit {
    method constructor (line 93) | constructor() {}
    method param (line 96) | set param(value: string) {
    method setDisplay (line 100) | setDisplay(value: string) {
    method ngOnInit (line 105) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/binary/midi/midi.component.ts
  class MidiComponent (line 12) | class MidiComponent implements OnInit {
    method constructor (line 18) | constructor() {}
    method updateBinary (line 20) | updateBinary(e: Event) {}
    method ngOnInit (line 22) | ngOnInit() {
    method upload (line 108) | upload(file) {

FILE: apps/kirjs/src/app/modules/binary/parser/binary-parser.ts
  type BaseConfig (line 10) | interface BaseConfig {
  class BinaryParser (line 18) | class BinaryParser {
    method constructor (line 22) | constructor() {
    method string (line 26) | string(name: string, config: StringParserConfig) {
    method varuint7 (line 31) | varuint7(name: string, config: Partial<VarUintParserConfig> = {}) {
    method varuint31 (line 36) | varuint31(name: string, config: Partial<VarUintParserConfig> = {}) {
    method choice (line 47) | choice(name: string, config: any) {
    method array (line 52) | array(name: string, config: any) {
    method bit (line 57) | bit(name: string, config: any) {
    method block (line 62) | block(name: string, parser) {
    method constBits (line 67) | constBits(value, config?: Partial<BaseConfig>) {
    method boolean (line 75) | boolean(name: string, config?: Partial<BaseConfig>) {
    method bit1 (line 79) | bit1(name: string, config?: Partial<BaseConfig>) {
    method bit2 (line 83) | bit2(name: string, config?: Partial<BaseConfig>) {
    method bit3 (line 87) | bit3(name: string, config?: Partial<BaseConfig>) {
    method bit8 (line 91) | bit8(name: string, config?: Partial<BaseConfig>) {
    method bit32 (line 95) | bit32(name: string, config?: Partial<BaseConfig>) {
    method bit24 (line 98) | bit24(name: string, config?: Partial<BaseConfig>) {
    method object (line 102) | object(name: string, config?: Partial<BaseConfig>) {
    method uInt16 (line 106) | uInt16(name: string, config?: Partial<BaseConfig>) {
    method uInt24 (line 117) | uInt24(name: string, config: any = {}) {
    method uInt32 (line 128) | uInt32(name: string, config?: Partial<BaseConfig>) {
    method uInt32le (line 139) | uInt32le(name: string, config?: Partial<BaseConfig>) {
    method uInt8 (line 148) | uInt8(name: string, config?: Partial<BaseConfig>) {
    method hex (line 160) | hex(name: string, config?: Partial<BaseConfig>) {
    method read (line 180) | read(reader, data: any = {}) {
    method readOrdered (line 184) | readOrdered(reader: BinaryReader, data: any = [], start = 0) {

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/array-parser.ts
  class BinaryArrayParser (line 5) | class BinaryArrayParser extends AbstractBinaryParser {
    method constructor (line 8) | constructor(private config) {
    method read (line 12) | read(
    method readOrdered (line 30) | readOrdered(

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/bit-parser.ts
  class BitParser (line 9) | class BitParser extends AbstractBinaryParser {
    method constructor (line 12) | constructor(private config) {
    method readWithLength (line 17) | readWithLength(
    method read (line 27) | read(
    method readOrdered (line 39) | readOrdered(

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/choice-parser.ts
  class BinaryChoiceParser (line 5) | class BinaryChoiceParser extends AbstractBinaryParser {
    method constructor (line 6) | constructor(private config) {
    method type (line 10) | get type() {
    method read (line 14) | read(
    method getParser (line 21) | getParser(data, resolver) {
    method readOrdered (line 41) | readOrdered(

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/common.ts
  type ParserConfig (line 1) | interface ParserConfig {
  type Endianness (line 5) | enum Endianness {
  type BinaryParserConfig (line 10) | interface BinaryParserConfig {
  function beToLe32 (line 18) | function beToLe32(val) {
  type ReadResult (line 27) | interface ReadResult {

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/debugger-parser.ts
  method read (line 6) | read(reader: BinaryReader, data: BinaryReaderResult) {
  method readOrdered (line 11) | readOrdered(reader: BinaryReader, data: BinaryReaderResult) {

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/object-parser.ts
  class BinaryObjectParser (line 4) | class BinaryObjectParser extends AbstractBinaryParser {
    method addStep (line 13) | addStep(name: string, parser: AbstractBinaryParser) {
    method read (line 17) | read(
    method readOrdered (line 32) | readOrdered(

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/string-parser.ts
  function bytesToChar (line 10) | function bytesToChar(a) {
  type StringParserConfig (line 14) | interface StringParserConfig extends ParserConfig {
  class StringParser (line 19) | class StringParser extends AbstractBinaryParser {
    method constructor (line 22) | constructor(private config: StringParserConfig) {
    method read (line 26) | read(
    method readOrdered (line 56) | readOrdered(

FILE: apps/kirjs/src/app/modules/binary/parser/parsers/var-uint-parser.ts
  type VarUintParserConfig (line 5) | interface VarUintParserConfig extends BaseConfig {
  class VarUintParser (line 13) | class VarUintParser extends AbstractBinaryParser {
    method constructor (line 16) | constructor(
    method converter (line 23) | static converter(n: string) {
    method read (line 27) | read(
    method readOrdered (line 54) | readOrdered(

FILE: apps/kirjs/src/app/modules/binary/parser/readers/abstract-reader.ts
  type BinaryReaderResult (line 1) | type BinaryReaderResult = any;

FILE: apps/kirjs/src/app/modules/binary/parser/readers/string-reader.ts
  class StringBinaryReader (line 3) | class StringBinaryReader implements BinaryReader {
    method constructor (line 6) | constructor(private s: string) {}
    method hasMore (line 8) | hasMore() {
    method peak (line 12) | peak(bits: number): BinaryReaderResult {
    method read (line 16) | read(bits: number): BinaryReaderResult {

FILE: apps/kirjs/src/app/modules/binary/parser/utils.ts
  function resolveLengthOrdered (line 1) | function resolveLengthOrdered(functionOrValue, data) {
  function resolveFunctionOrvalue (line 10) | function resolveFunctionOrvalue(functionOrValue, arg) {
  function resolveFunctionKeyOrValue (line 16) | function resolveFunctionKeyOrValue(val, data, resolve) {
  function resolveOrderedByKey (line 28) | function resolveOrderedByKey(key: string, data: any[]) {
  function resolveByKey (line 32) | function resolveByKey(key: string, data: any) {
  function strToBin (line 36) | function strToBin(str) {

FILE: apps/kirjs/src/app/modules/binary/shared.ts
  function bin2hex (line 1) | function bin2hex(bin: string) {

FILE: apps/kirjs/src/app/modules/binary/to-read/to-read.component.ts
  class ToReadComponent (line 8) | class ToReadComponent implements OnInit {
    method constructor (line 11) | constructor() {}
    method ngOnInit (line 13) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/cellular-automation/board/board.component.ts
  class BoardComponent (line 8) | class BoardComponent implements OnInit {
    method constructor (line 16) | constructor() {}
    method play (line 18) | public play() {
    method runTransform (line 22) | runTransform() {
    method ngOnInit (line 31) | ngOnInit() {

FILE: apps/kirjs/src/app/modules/cellular-automation/cellular-automation-routing.module.ts
  class CellularAutomationRoutingModule (line 17) | class CellularAutomationRoutingModule {}

FILE: apps/kirjs/src/app/modules/cellular-automation/cellular-automation.component.ts
  function inPlace (line 3) | function inPlace(rule) {
  function transform2d (line 30) | function transform2d(rule) {
  function appendTransform (line 68) | function appendTransform(rule) {
  class CellularAutomationComponent (line 112) | class CellularAutomationComponent {
    method inverse (line 115) | inverse(pattern) {

FILE: apps/kirjs/src/app/modules/cellular-automation/cellular-automation.module.ts
  class CellularAutomationModule (line 37) | class CellularAutomationModule {}

FILE: apps/kirjs/src/app/modules/cellular-automation/oscilators/oscilators.component.ts
  class OscilatorsComponent (line 8) | class OscilatorsComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/cellular-automation/rule/rule.component.ts
  class RuleComponent (line 8) | class RuleComponent implements OnInit {
    method constructor (line 13) | constructor() {}
    method ngOnInit (line 15) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/cellular-automation/rule3/rule3.component.ts
  class Rule3Component (line 8) | class Rule3Component implements OnInit, OnChanges {
    method constructor (line 16) | constructor() {}
    method ngOnChanges (line 18) | ngOnChanges() {
    method ngOnInit (line 36) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/cellular-automation/rule3/rule4/rule4.component.ts
  class Rule4Component (line 8) | class Rule4Component implements OnChanges {
    method ngOnChanges (line 13) | ngOnChanges() {

FILE: apps/kirjs/src/app/modules/cellular-automation/rule8/rule8.component.ts
  class Rule8Component (line 8) | class Rule8Component implements OnInit {
    method constructor (line 15) | constructor() {}
    method ngOnInit (line 17) | ngOnInit() {

FILE: apps/kirjs/src/app/modules/gomoku-print/gomoku-print.component.ts
  class GomokuPrintComponent (line 12) | class GomokuPrintComponent {

FILE: apps/kirjs/src/app/modules/gomoku-print/gomoku-print.module.ts
  class GomokuPrintModule (line 16) | class GomokuPrintModule {}

FILE: apps/kirjs/src/app/modules/gomoku-print/o/o.component.ts
  class OComponent (line 9) | class OComponent {}

FILE: apps/kirjs/src/app/modules/gomoku-print/x/x.component.ts
  class XComponent (line 9) | class XComponent {}

FILE: apps/kirjs/src/app/modules/gomoku/board/board.component.ts
  class BoardComponent (line 10) | class BoardComponent {
    method back (line 40) | back() {
    method forward (line 46) | forward() {
    method constructor (line 50) | constructor() {}
    method log (line 52) | log() {

FILE: apps/kirjs/src/app/modules/gomoku/board/board.module.ts
  class GomokuBoardModule (line 11) | class GomokuBoardModule {}

FILE: apps/kirjs/src/app/modules/gomoku/gomoku.component.ts
  class Node (line 10) | class Node {
    method constructor (line 17) | constructor(public position: [number, number]) {
    method addChild (line 21) | addChild(node: Node) {
  function buildTree (line 30) | function buildTree(moves, index, parentNode) {
  class RenlibGame (line 62) | class RenlibGame {
    method constructor (line 66) | constructor(private start) {
    method back (line 70) | back() {
    method moveTo (line 76) | moveTo(point) {
    method forward (line 88) | forward() {}
    method getPosition (line 90) | getPosition() {
  class GomokuComponent (line 123) | class GomokuComponent {

FILE: apps/kirjs/src/app/modules/gomoku/gomoku.module.ts
  class GomokuModule (line 25) | class GomokuModule {}

FILE: apps/kirjs/src/app/modules/gomoku/highlights.ts
  class Highlights (line 1) | class Highlights {
    method constructor (line 5) | constructor(public highlights = []) {}
    method redo (line 7) | redo() {
    method undo (line 15) | undo() {
    method toggle (line 23) | toggle([x, y], type) {
    method get (line 49) | get([x, y]) {
    method clear (line 58) | clear(point?) {

FILE: apps/kirjs/src/app/modules/gomoku/tools/tools.component.ts
  class ToolsComponent (line 9) | class ToolsComponent implements OnInit {
    method shortcut (line 90) | shortcut(a: number) {
    method handle (line 96) | handle(tool) {
    method constructor (line 104) | constructor() {
    method ngOnInit (line 108) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/home/home.component.ts
  class HomeComponent (line 8) | class HomeComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/home/home.module.ts
  class HomeModule (line 20) | class HomeModule {}

FILE: apps/kirjs/src/app/modules/home/polaroid/polaroid.component.ts
  class PolaroidComponent (line 8) | class PolaroidComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/msk/msk.component.ts
  class MskComponent (line 8) | class MskComponent implements OnInit {
    method constructor (line 106) | constructor() {}
    method ngOnInit (line 108) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/msk/msk.module.ts
  class MskModule (line 45) | class MskModule {}

FILE: apps/kirjs/src/app/modules/music/music.component.ts
  class MusicComponent (line 8) | class MusicComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/music/music.module.ts
  class MusicModule (line 9) | class MusicModule {}

FILE: apps/kirjs/src/app/modules/qna/qna.component.ts
  class QnaComponent (line 8) | class QnaComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/qna/qna.module.ts
  class QnaModule (line 43) | class QnaModule {}

FILE: apps/kirjs/src/app/modules/regex/live/live-mock/live-mock.component.ts
  class LiveMockComponent (line 12) | class LiveMockComponent implements OnInit, OnDestroy {
    method constructor (line 22) | constructor(private service: LiveService, private fb: FormBuilder) {}
    method ngOnInit (line 24) | ngOnInit() {
    method ngOnDestroy (line 35) | ngOnDestroy(): void {

FILE: apps/kirjs/src/app/modules/regex/live/live-mock/live-mock.module.ts
  class LiveMockModule (line 11) | class LiveMockModule {}

FILE: apps/kirjs/src/app/modules/regex/live/live.module.ts
  class LiveModule (line 9) | class LiveModule {}

FILE: apps/kirjs/src/app/modules/regex/live/live.service.ts
  type LiveInfo (line 5) | interface LiveInfo {
  type AllData (line 19) | type AllData<T = any> = Record<string, T>;
  class LiveService (line 24) | class LiveService<T = any> implements OnDestroy {
    method constructor (line 45) | constructor() {}
    method storeLiveInfo (line 47) | storeLiveInfo(data: LiveInfo): void {
    method storeMyData (line 53) | storeMyData(data: T): void {
    method ngOnDestroy (line 62) | ngOnDestroy() {

FILE: apps/kirjs/src/app/modules/regex/live/poll/poll.component.ts
  class PollComponent (line 9) | class PollComponent {
    method constructor (line 11) | constructor(readonly service: LiveService) {}
  class SlidesAnswerComponent (line 21) | class SlidesAnswerComponent implements OnInit {
    method constructor (line 23) | constructor(readonly service: LiveService) {}
    method ngOnInit (line 25) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/regex/live/poll/poll.module.ts
  class PollModule (line 10) | class PollModule {}

FILE: apps/kirjs/src/app/modules/regex/regex.component.ts
  class RegexComponent (line 8) | class RegexComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/regex/regex.module.ts
  class RegexModule (line 14) | class RegexModule {}

FILE: apps/kirjs/src/app/modules/stack/simple-stack/simple-stack.component.ts
  class SimpleStackComponent (line 8) | class SimpleStackComponent implements OnInit {
    method constructor (line 11) | constructor() {}
    method ngOnInit (line 13) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/stack/stack-game/stack-function-button/stack-function-button.component.ts
  class StackFunctionButtonComponent (line 10) | class StackFunctionButtonComponent {

FILE: apps/kirjs/src/app/modules/stack/stack-game/stack-function/stack-function.component.ts
  class StackFunctionComponent (line 9) | class StackFunctionComponent implements OnInit {
    method constructor (line 15) | constructor() {}
    method ngOnInit (line 17) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/stack/stack-game/stack-game.component.ts
  type StackFunction (line 3) | interface StackFunction {
  type Level (line 9) | interface Level {
  constant ANY_CHAR (line 15) | const ANY_CHAR = '*';
  class StackGameComponent (line 22) | class StackGameComponent implements OnInit {
    method canAddFunction (line 54) | canAddFunction(stack: string, func) {
    method calcStack (line 58) | calcStack() {
    method addFunction (line 76) | addFunction(func: StackFunction) {
    method removeFunction (line 81) | removeFunction() {
    method ngOnInit (line 86) | ngOnInit() {

FILE: apps/kirjs/src/app/modules/stack/stack-routing.module.ts
  class StackRoutingModule (line 12) | class StackRoutingModule {}

FILE: apps/kirjs/src/app/modules/stack/stack-test/stack-test.component.ts
  class StackTestComponent (line 9) | class StackTestComponent implements OnInit {
    method constructor (line 10) | constructor() {}
    method ngOnInit (line 12) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/stack/stack.component.ts
  class StackComponent (line 9) | class StackComponent implements OnInit {
    method constructor (line 135) | constructor() {}
    method ngOnInit (line 137) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/stack/stack.module.ts
  class StackModule (line 31) | class StackModule {}

FILE: apps/kirjs/src/app/modules/streaming/common.ts
  constant FLAME_LINK (line 3) | const FLAME_LINK = new InjectionToken('FLAME_LINK');
  type Guest (line 5) | interface Guest {
  type StreamSession (line 10) | interface StreamSession {

FILE: apps/kirjs/src/app/modules/streaming/overlay/overlay.component.ts
  class OverlayComponent (line 11) | class OverlayComponent implements OnInit {
    method constructor (line 24) | constructor(@Inject(FLAME_LINK) private flameLink: any) {}
    method ngOnInit (line 26) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/streaming/streaming.module.ts
  class StreamingModule (line 56) | class StreamingModule {}

FILE: apps/kirjs/src/app/modules/svg-race/finish/finish.component.ts
  class FinishComponent (line 9) | class FinishComponent implements OnInit {
    method constructor (line 12) | constructor() {}
    method ngOnInit (line 14) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/svg-race/little-car/little-car.component.ts
  class LittleCarComponent (line 9) | class LittleCarComponent {
    method color (line 15) | set color(color: string) {

FILE: apps/kirjs/src/app/modules/svg-race/player/player.component.ts
  class PlayerComponent (line 20) | class PlayerComponent implements OnInit, AfterViewInit, OnChanges {
    method ngOnChanges (line 33) | ngOnChanges(changes: SimpleChanges) {
    method calculateScore (line 39) | calculateScore() {
    method ngAfterViewInit (line 62) | ngAfterViewInit() {
    method calculateCarPosition (line 75) | calculateCarPosition() {
    method ngOnInit (line 87) | ngOnInit() {}
  function closestPoint (line 90) | function closestPoint(pathNode, point) {

FILE: apps/kirjs/src/app/modules/svg-race/race/race.component.ts
  class RaceComponent (line 14) | class RaceComponent implements AfterViewInit {
    method updateCurrentPlayer (line 44) | updateCurrentPlayer() {
    method ngAfterViewInit (line 51) | ngAfterViewInit() {
    method setScore (line 56) | setScore(name: string, score: number) {

FILE: apps/kirjs/src/app/modules/svg-race/svg-race.component.ts
  class SvgRaceComponent (line 16) | class SvgRaceComponent {
    method constructor (line 32) | constructor() {}

FILE: apps/kirjs/src/app/modules/svg-race/svg-race.module.ts
  class SafeHtml (line 23) | class SafeHtml implements PipeTransform {
    method constructor (line 24) | constructor(private readonly sanitizer: DomSanitizer) {}
    method transform (line 26) | transform(html) {
  class SvgRaceModule (line 55) | class SvgRaceModule {}

FILE: apps/kirjs/src/app/modules/svg-race/timer/timer.component.ts
  class TimerComponent (line 8) | class TimerComponent implements OnInit {
    method reset (line 11) | reset() {
    method constructor (line 15) | constructor() {
    method ngOnInit (line 23) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/svg/samples/app.component.ts
  class AppComponent (line 8) | class AppComponent {}

FILE: apps/kirjs/src/app/modules/svg/samples/app.module.ts
  class AppModule (line 10) | class AppModule {}

FILE: apps/kirjs/src/app/modules/svg/samples/attr/app.component.ts
  class AppComponent (line 19) | class AppComponent {
    method constructor (line 22) | constructor() {

FILE: apps/kirjs/src/app/modules/svg/samples/bs.module.ts
  class FakeTicksComponent (line 14) | class FakeTicksComponent {
  class AppModule (line 22) | class AppModule {}

FILE: apps/kirjs/src/app/modules/svg/samples/chart/app.component.ts
  function generateData (line 3) | function generateData() {
  class AppComponent (line 32) | class AppComponent {
    method constructor (line 39) | constructor() {
    method getIndex (line 45) | getIndex(a, b) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart2/app.component.solved.ts
  function generateData (line 3) | function generateData() {
  class AppComponent (line 34) | class AppComponent {
    method constructor (line 40) | constructor() {
    method getIndex (line 46) | getIndex(a, b) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart2/app.component.ts
  function generateData (line 3) | function generateData() {
  class AppComponent (line 33) | class AppComponent {
    method constructor (line 39) | constructor() {
    method getIndex (line 45) | getIndex(a, b) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart2/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/kirjs/src/app/modules/svg/samples/chart2/ticks.component.ts
  class TicksComponent (line 16) | class TicksComponent {
    method getIndex (line 22) | getIndex(i: number) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart3/app.component.ts
  function generateData (line 3) | function generateData() {
  class AppComponent (line 33) | class AppComponent {
    method constructor (line 39) | constructor() {
    method getIndex (line 45) | getIndex(a, b) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart3/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/kirjs/src/app/modules/svg/samples/chart3/ticks.component.ts
  class TicksComponent (line 16) | class TicksComponent {
    method getIndex (line 22) | getIndex(i: number) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart4/app.component.solved.ts
  function generateData (line 3) | function generateData() {
  class AppComponent (line 34) | class AppComponent {
    method constructor (line 40) | constructor() {
    method getIndex (line 46) | getIndex(a, b) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart4/app.component.ts
  function generateData (line 3) | function generateData() {
  class AppComponent (line 34) | class AppComponent {
    method constructor (line 40) | constructor() {
    method getIndex (line 46) | getIndex(a, b) {

FILE: apps/kirjs/src/app/modules/svg/samples/chart4/app.module.ts
  class AppModule (line 11) | class AppModule {}

FILE: apps/kirjs/src/app/modules/svg/samples/chart4/ticks.component.ts
  class TicksComponent (line 16) | class TicksComponent {
    method getIndex (line 22) | getIndex(i: number) {

FILE: apps/kirjs/src/app/modules/svg/samples/sub.component.ts
  class AppComponent (line 19) | class AppComponent {
    method constructor (line 22) | constructor() {

FILE: apps/kirjs/src/app/modules/svg/samples/svg/app.component.ts
  class AppComponent (line 9) | class AppComponent {
    method constructor (line 12) | constructor() {

FILE: apps/kirjs/src/app/modules/svg/svg-demo/svg-demo.component.ts
  class SvgDemoComponent (line 8) | class SvgDemoComponent implements OnInit {
    method codeInput (line 13) | set codeInput(value) {
    method ngOnInit (line 17) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/svg/svg-playground/svg-playground.component.ts
  class SvgPlaygroundComponent (line 8) | class SvgPlaygroundComponent implements OnInit {
    method constructor (line 11) | constructor() {}
    method ngOnInit (line 13) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/svg/svg-together-result/svg-together-result.component.ts
  class SvgTogetherResultComponent (line 9) | class SvgTogetherResultComponent implements OnInit {
    method constructor (line 15) | constructor(af: AngularFireDatabase) {
    method codeInput (line 26) | set codeInput(value) {
    method ngOnInit (line 30) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/svg/svg-together/svg-together.component.ts
  class SvgTogetherComponent (line 9) | class SvgTogetherComponent implements OnInit {
    method constructor (line 105) | constructor(af: AngularFireDatabase) {
    method codeInput (line 115) | set codeInput(value) {
    method submit (line 119) | submit() {
    method reset (line 125) | reset() {
    method ngOnInit (line 131) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/svg/svg.module.ts
  class SvgModule (line 46) | class SvgModule {}

FILE: apps/kirjs/src/app/modules/svg/timer/timer.component.ts
  class TimerComponent (line 8) | class TimerComponent implements OnInit {
    method reset (line 11) | reset() {
    method constructor (line 15) | constructor() {
    method ngOnInit (line 23) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/sync/sync.component.ts
  class SyncComponent (line 8) | class SyncComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/sync/sync.module.ts
  class SyncModule (line 25) | class SyncModule {}

FILE: apps/kirjs/src/app/modules/test/test.component.ts
  class TestComponent (line 8) | class TestComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/test/test.module.ts
  class TestModule (line 14) | class TestModule {}

FILE: apps/kirjs/src/app/modules/webassembly/ca/ca.module.ts
  class CaModule (line 11) | class CaModule {}

FILE: apps/kirjs/src/app/modules/webassembly/ca/single-cell/single-cell.component.ts
  class SingleCellComponent (line 8) | class SingleCellComponent implements OnInit {
    method constructor (line 11) | constructor() {}
    method ngOnInit (line 13) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/webassembly/ca/single-grid/single-grid.component.ts
  class SingleGridComponent (line 8) | class SingleGridComponent implements OnInit {
    method constructor (line 12) | constructor() {}
    method ngOnInit (line 14) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/webassembly/full-screen-runner/full-screen-runner.component.ts
  class FullScreenRunnerComponent (line 9) | class FullScreenRunnerComponent implements OnInit, OnChanges {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit() {}
    method ngOnChanges (line 24) | ngOnChanges() {
    method prepare (line 28) | prepare() {

FILE: apps/kirjs/src/app/modules/webassembly/full-screen-runner/full-screen-runner.module.ts
  class FullScreenRunnerModule (line 20) | class FullScreenRunnerModule {}

FILE: apps/kirjs/src/app/modules/webassembly/monaco-wat.ts
  type CompletionItem (line 27) | type CompletionItem = typeof languages.CompletionItem;
  type IModel (line 29) | type IModel = any;
  type IPosition (line 30) | type IPosition = any;
  type IRichLanguageConfiguration (line 31) | type IRichLanguageConfiguration = any;
  function getWatCompletionItems (line 35) | function getWatCompletionItems() {
  function watWordAt (line 1219) | function watWordAt(s: string, i: number) {

FILE: apps/kirjs/src/app/modules/webassembly/samples/base.js
  function drawOnCanvas (line 9) | function drawOnCanvas(canvas, arr) {
  function run (line 22) | async function run(code, canvas) {

FILE: apps/kirjs/src/app/modules/webassembly/tests/common.ts
  function colorMatchesExpected (line 4) | function colorMatchesExpected(a, i, c, test) {
  function outputCoordinates (line 8) | function outputCoordinates(config) {

FILE: apps/kirjs/src/app/modules/webassembly/utils.ts
  function extractFunction (line 6) | function extractFunction(name, code) {
  function prepareTableCode (line 13) | function prepareTableCode(code) {
  function extractTypeCode (line 38) | function extractTypeCode(code) {
  function getName (line 51) | function getName(code) {
  function getType (line 60) | function getType(code) {
  function serializeBlocks (line 65) | function serializeBlocks(blocks: CodeHelperBlock[]) {
  function populateBlocks (line 69) | function populateBlocks(blocks: BaseBlock[]): CodeHelperBlock[] {
  function extractBlocks (line 81) | function extractBlocks(
  function findNextNonMatchingClosingBrace (line 111) | function findNextNonMatchingClosingBrace(code: string) {
  function findPrevNonMatchingClosingBrace (line 115) | function findPrevNonMatchingClosingBrace(code: string) {
  function findMatchingBrace (line 119) | function findMatchingBrace(
  function extractExpressionByMatch (line 145) | function extractExpressionByMatch(regex, code) {
  function extractGlobalAccess (line 173) | function extractGlobalAccess(code) {
  function extractGlobals (line 178) | function extractGlobals(code, allCode) {
  function hasMemoryCalls (line 182) | function hasMemoryCalls(code) {
  function hasTypeCalls (line 186) | function hasTypeCalls(code) {
  function hasTableCalls (line 190) | function hasTableCalls(code, config) {
  function unique (line 194) | function unique(arr) {
  function populateTestCode (line 198) | function populateTestCode(
  function extractFunctionWithDependencies (line 227) | function extractFunctionWithDependencies(
  function hasGlobal (line 237) | function hasGlobal(name, code) {
  function extractFunctionDependencyNames (line 241) | function extractFunctionDependencyNames(
  function getMemoryCode (line 260) | function getMemoryCode(hasMemory: boolean) {
  function generateWatTestCode (line 269) | function generateWatTestCode({
  function extractAllFunctions (line 298) | function extractAllFunctions(code) {
  function extractAnswers (line 303) | function extractAnswers(code) {

FILE: apps/kirjs/src/app/modules/webassembly/wasm-binary/wasm-binary.component.ts
  class WasmBinaryComponent (line 14) | class WasmBinaryComponent {

FILE: apps/kirjs/src/app/modules/webassembly/wasm-binary/wasm-parser.ts
  function wasmParser (line 20) | function wasmParser() {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/error-message/error-message.component.ts
  class ErrorMessageComponent (line 9) | class ErrorMessageComponent implements OnInit {
    method constructor (line 12) | constructor() {}
    method ngOnInit (line 14) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/monaco-directives/common.ts
  type BaseBlock (line 6) | interface BaseBlock {
  type CodeHelperBlock (line 12) | interface CodeHelperBlock extends BaseBlock {
  type CodePath (line 18) | interface CodePath {
  function getCodeBlockHandler (line 23) | function getCodeBlockHandler(lang, type) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/monaco-directives/monaco-js-position.directive.ts
  function getName (line 25) | function getName(token) {
  function resolveToken (line 31) | function resolveToken(token, sourceFile) {
  function processBlocks (line 43) | function processBlocks(blocks: any[], sourceFile) {
  class MonacoJsPositionDirective (line 54) | class MonacoJsPositionDirective implements AfterViewInit {
    method constructor (line 58) | constructor(
    method ngAfterViewInit (line 62) | ngAfterViewInit() {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/monaco-directives/monaco-load-answer.directive.ts
  class MonacoWatLoadAnswerDirective (line 8) | class MonacoWatLoadAnswerDirective {
    method constructor (line 11) | constructor(
    method loadAnswer (line 15) | loadAnswer(config: any) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/monaco-directives/monaco-scrolling.directive.ts
  class MonacoScrollingDirective (line 8) | class MonacoScrollingDirective implements OnChanges {
    method constructor (line 12) | constructor(
    method ngOnChanges (line 16) | ngOnChanges(changes) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/monaco-directives/monaco-wat-position.directive.ts
  class MonacoWatPositionDirective (line 16) | class MonacoWatPositionDirective implements AfterViewInit {
    method constructor (line 20) | constructor(
    method ngAfterViewInit (line 24) | ngAfterViewInit() {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/runners/wasm-test-runner/runner.js
  function run (line 1) | async function run(code, { args, imports, name, memory }) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/runners/wasm-test-runner/wasm-test-runner.component.ts
  type TestResult (line 25) | interface TestResult {
  type TestConfig (line 31) | interface TestConfig {
  type WebAssemblyTestConfig (line 37) | interface WebAssemblyTestConfig extends TestConfig {
  function verifyGlobalsInTests (line 50) | function verifyGlobalsInTests(tests, globals) {
  function testsHaveMemory (line 71) | function testsHaveMemory(config: TestConfig) {
  function passOrNot (line 75) | function passOrNot(m: any, blockCode, allCode) {
  function webAssemblyModuleContentHandler (line 107) | function webAssemblyModuleContentHandler(
  function webAssemblyTestHandler (line 136) | function webAssemblyTestHandler(
  class WasmTestRunnerComponent (line 184) | class WasmTestRunnerComponent implements OnChanges {
    method constructor (line 189) | constructor(private readonly webAssemblyService: WebAssemblyService) {}
    method isFocused (line 191) | isFocused(test) {
    method runTests (line 195) | runTests() {
    method ngOnChanges (line 257) | ngOnChanges() {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/viz/grid/grid.component.ts
  type Figure (line 3) | interface Figure {
  type GridConfig (line 11) | interface GridConfig {
  type DrawCellConfig (line 51) | interface DrawCellConfig extends Figure {
  function drawCell (line 56) | function drawCell({
  function resolveFuncOrValueForItem (line 86) | function resolveFuncOrValueForItem(
  function resolveFuncOrValue (line 105) | function resolveFuncOrValue(funcOfValue: any, vizConfig, defaultValue) {
  class GridComponent (line 124) | class GridComponent implements OnChanges {
    method ngOnChanges (line 128) | async ngOnChanges(changes) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/viz/viz.component.ts
  class VizComponent (line 10) | class VizComponent implements OnInit {
    method ngOnInit (line 14) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/viz/viz.module.ts
  class VizModule (line 12) | class VizModule {}

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/wasm-contents/wasm-contents.component.ts
  function genGlobalStep (line 3) | function genGlobalStep() {
  function genMemory (line 12) | function genMemory(name) {
  function genTable (line 22) | function genTable() {
  function genElem (line 33) | function genElem() {
  function genRowSize (line 60) | function genRowSize() {
  function genModule (line 69) | function genModule() {
  function genFuncName (line 79) | function genFuncName(name) {
  class WasmContentsComponent (line 96) | class WasmContentsComponent {
    method loadFunction (line 100) | loadFunction(m) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/web-assembly.service.ts
  type Result (line 14) | interface Result<T> {
  function wat2wasm (line 20) | function wat2wasm(wat) {
  type RunConfig (line 31) | interface RunConfig {
  type RunResult (line 38) | interface RunResult {
  class WebAssemblyService (line 46) | class WebAssemblyService {
    method constructor (line 47) | constructor() {}
    method run (line 49) | run<T>(wat: string, js: string, wasmConfig: RunConfig) {
    method saveWasmFile (line 91) | saveWasmFile(code: string) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/webassembly-code-mode/webassembly-code-mode.component.ts
  class WebassemblyCodeModeComponent (line 18) | class WebassemblyCodeModeComponent implements OnChanges {
    method constructor (line 32) | constructor() {}
    method updateCode (line 34) | updateCode() {
    method ngOnChanges (line 41) | ngOnChanges(changes: SimpleChanges) {
    method loadAnswerFromConfig (line 57) | loadAnswerFromConfig(selectedMode: any) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/webassembly-playground.component.ts
  type WebassemblyPlaygroundInputs (line 10) | interface WebassemblyPlaygroundInputs {
  class WebassemblyPlaygroundComponent (line 27) | class WebassemblyPlaygroundComponent implements ControlValueAccessor {
    method registerOnChange (line 36) | registerOnChange(
    method registerOnTouched (line 42) | registerOnTouched(fn: any): void {}
    method setDisabledState (line 44) | setDisabledState(isDisabled: boolean): void {}
    method writeValue (line 46) | writeValue(code: WebassemblyPlaygroundInputs): void {
    method selectFunction (line 50) | selectFunction(path: CodePath) {
    method update (line 87) | update() {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/webassembly-runner/webassembly-runner.component.ts
  class WebassemblyRunnerComponent (line 10) | class WebassemblyRunnerComponent implements OnChanges {
    method constructor (line 20) | constructor(private readonly webAssemblyService: WebAssemblyService) {}
    method ngOnChanges (line 22) | async ngOnChanges(changes) {

FILE: apps/kirjs/src/app/modules/webassembly/webassembly-playground/webassembly-runner/webassembly-runner.module.ts
  class WebassemblyRunnerModule (line 10) | class WebassemblyRunnerModule {}

FILE: apps/kirjs/src/app/modules/webassembly/webassembly.component.ts
  function generateArray (line 25) | function generateArray(size = 89, callback) {
  function inPlace (line 30) | function inPlace(rule) {
  function transform2d (line 57) | function transform2d(rule) {
  function appendTransform (line 95) | function appendTransform(rule) {
  class WebassemblyComponent (line 139) | class WebassemblyComponent implements OnInit {
    method inverse (line 158) | inverse(pattern) {
    method constructor (line 477) | constructor() {}
    method ngOnInit (line 479) | ngOnInit() {}

FILE: apps/kirjs/src/app/modules/webassembly/webassembly.module.ts
  class WebassemblyModule (line 67) | class WebassemblyModule {}

FILE: apps/lis/src/app/app.component.ts
  class AppComponent (line 8) | class AppComponent {

FILE: apps/lis/src/app/app.module.ts
  class AppModule (line 45) | class AppModule {}

FILE: apps/lis/src/app/modules/rxjs/rxjs.component.ts
  class RxjsComponent (line 8) | class RxjsComponent implements OnInit {
    method constructor (line 114) | constructor() {}
    method ngOnInit (line 116) | ngOnInit() {}

FILE: apps/lis/src/app/modules/rxjs/rxjs.module.ts
  class RxjsModule (line 29) | class RxjsModule {}

FILE: apps/playground/src/app/app.component.ts
  class AppComponent (line 8) | class AppComponent {

FILE: apps/playground/src/app/app.module.ts
  class AppModule (line 54) | class AppModule {}

FILE: apps/playground/src/app/code-sync/code-sync.component.ts
  class CodeSyncComponent (line 8) | class CodeSyncComponent implements OnInit {
    method constructor (line 9) | constructor() {}
    method ngOnInit (line 11) | ngOnInit() {}

FILE: apps/playground/src/app/code-sync/code-sync.module.ts
  class CodeSyncModule (line 23) | class CodeSyncModule {}

FILE: apps/playground/src/app/playground/playground.component.ts
  class PlaygroundComponent (line 10) | class PlaygroundComponent {
    method constructor (line 13) | constructor(
    method handleUpdate (line 27) | handleUpdate(code: any) {

FILE: apps/playground/src/app/playground/playground.module.ts
  class PlaygroundModule (line 19) | class PlaygroundModule {}

FILE: libs/angular-ast-viz/src/lib/angular-ast-viz.module.ts
  class AngularAstVizModule (line 11) | class AngularAstVizModule {}

FILE: libs/angular-ast-viz/src/lib/app.component.ts
  class AppComponent (line 9) | class AppComponent implements OnInit {
    method ngOnInit (line 13) | ngOnInit() {
    method selectNode (line 17) | selectNode(node) {
    method generateAst (line 21) | generateAst(value: string) {

FILE: libs/angular-ast-viz/src/lib/ast-tree/ast-tree.component.ts
  class AstTreeComponent (line 28) | class AstTreeComponent implements OnInit {
    method split (line 34) | split(value) {
    method specialKeys (line 38) | get specialKeys() {
    method stringKeys (line 42) | get stringKeys() {
    method objectKeys (line 49) | get objectKeys() {
    method isArray (line 55) | get isArray() {
    method constructor (line 59) | constructor() {}
    method ngOnInit (line 61) | ngOnInit() {}

FILE: libs/angular-ast-viz/src/lib/ast-tree/short-name-babel.pipe.ts
  class ShortNameBabelPipe (line 6) | class ShortNameBabelPipe implements PipeTransform {
    method transform (line 7) | transform(value: string): any {

FILE: libs/angular-slides-to-pdf/src/lib/angular-slides-to-pdf.component.ts
  class AngularSlidesToPdfComponent (line 8) | class AngularSlidesToPdfComponent {
    method constructor (line 9) | constructor(private presentation: SlidesDeckComponent) {}
    method toPdf (line 11) | async toPdf() {

FILE: libs/angular-slides-to-pdf/src/lib/angular-slides-to-pdf.module.ts
  class AngularSlidesToPdfModule (line 10) | class AngularSlidesToPdfModule {}

FILE: libs/browser/src/lib/browser-window/browser-window.component.ts
  class BrowserWindowComponent (line 8) | class BrowserWindowComponent implements OnInit {
    method constructor (line 12) | constructor() {}
    method ngOnInit (line 14) | ngOnInit() {}

FILE: libs/browser/src/lib/browser.module.ts
  class BrowserWindowModule (line 20) | class BrowserWindowModule {}

FILE: libs/browser/src/lib/preview-window/preview-window.component.ts
  type PreviewWindowType (line 3) | type PreviewWindowType = 'console' | 'browser';
  class PreviewWindowComponent (line 10) | class PreviewWindowComponent {
    method url (line 11) | set url(url: string) {
    method url (line 17) | get url() {

FILE: libs/browser/src/lib/terminal-window/terminal-window.component.ts
  class TerminalWindowComponent (line 8) | class TerminalWindowComponent implements OnInit {
    method constructor (line 11) | constructor() {}
    method ngOnInit (line 13) | ngOnInit() {}

FILE: libs/code-demos/assets/runner/js/mocha.js
  function s (line 2) | function s(o, u) {
  function isArray (line 72) | function isArray(val) {
  function EventEmitter (line 81) | function EventEmitter() {}
  function on (line 120) | function on() {
  function Progress (line 264) | function Progress() {
  function Context (line 415) | function Context() {}
  function Hook (line 522) | function Hook(title, fn) {
  function visit (line 786) | function visit(obj, file) {
  function image (line 1102) | function image(name) {
  function Mocha (line 1124) | function Mocha(options) {
  function done (line 1550) | function done(failures) {
  function parse (line 1629) | function parse(str) {
  function shortFormat (line 1673) | function shortFormat(ms) {
  function longFormat (line 1696) | function longFormat(ms) {
  function plural (line 1714) | function plural(ms, n, name) {
  function Pending (line 1739) | function Pending(message) {
  function Base (line 1996) | function Base(runner) {
  function pad (line 2106) | function pad(str, len) {
  function inlineDiff (line 2119) | function inlineDiff(err, escape) {
  function unifiedDiff (line 2156) | function unifiedDiff(err, escape) {
  function errorDiff (line 2203) | function errorDiff(err, type, escape) {
  function escapeInvisibles (line 2228) | function escapeInvisibles(line) {
  function colorLines (line 2243) | function colorLines(name, str) {
  function sameType (line 2265) | function sameType(a, b) {
  function Doc (line 2310) | function Doc(runner) {
  function Dot (line 2395) | function Dot(runner) {
  function HTMLCov (line 2468) | function HTMLCov(runner) {
  function coverageClass (line 2494) | function coverageClass(coveragePctg) {
  function HTML (line 2561) | function HTML(runner) {
  function makeUrl (line 2774) | function makeUrl(s) {
  function error (line 2815) | function error(msg) {
  function fragment (line 2826) | function fragment(html) {
  function hideSuitesWithout (line 2850) | function hideSuitesWithout(classname) {
  function unhide (line 2863) | function unhide() {
  function text (line 2879) | function text(el, contents) {
  function on (line 2890) | function on(el, event, fn) {
  function JSONCov (line 2979) | function JSONCov(runner, output) {
  function map (line 3023) | function map(cov) {
  function coverage (line 3063) | function coverage(filename, data) {
  function clean (line 3103) | function clean(test) {
  function List (line 3145) | function List(runner) {
  function clean (line 3179) | function clean(test) {
  function JSONReporter (line 3211) | function JSONReporter(runner) {
  function clean (line 3259) | function clean(test) {
  function errorJSON (line 3275) | function errorJSON(err) {
  function Landing (line 3328) | function Landing(runner) {
  function List (line 3411) | function List(runner) {
  function Markdown (line 3485) | function Markdown(runner) {
  function Min (line 3583) | function Min(runner) {
  function NyanCat (line 3627) | function NyanCat(runner) {
  function draw (line 3697) | function draw(type, n) {
  function write (line 3867) | function write(string) {
  function Progress (line 3905) | function Progress(runner, options) {
  function Spec (line 3995) | function Spec(runner) {
  function TAP (line 4082) | function TAP(runner) {
  function title (line 4129) | function title(test) {
  function XUnit (line 4172) | function XUnit(runner, options) {
  function tag (line 4304) | function tag(name, attrs, close, content) {
  function cdata (line 4327) | function cdata(str) {
  function Runnable (line 4390) | function Runnable(title, fn) {
  function multiple (line 4578) | function multiple(err) {
  function done (line 4593) | function done(err) {
  function callFn (line 4650) | function callFn(fn) {
  function callFnAsync (line 4678) | function callFnAsync(fn) {
  function Runner (line 4781) | function Runner(suite, delay) {
  function next (line 5018) | function next(i) {
  function next (line 5074) | function next(suite) {
  function hookErr (line 5177) | function hookErr(_, errSuite, after) {
  function next (line 5203) | function next(err, errSuite) {
  function next (line 5318) | function next(errSuite) {
  function done (line 5352) | function done(errSuite) {
  function uncaught (line 5470) | function uncaught(err) {
  function start (line 5474) | function start() {
  function filterLeaks (line 5528) | function filterLeaks(ok, globals) {
  function extraGlobals (line 5571) | function extraGlobals() {
  function Suite (line 5658) | function Suite(title, parentContext) {
  function Test (line 6009) | function Test(title, fn) {
  function ignored (line 6242) | function ignored(path) {
  function highlight (line 6354) | function highlight(js) {
  function emptyRepresentation (line 6401) | function emptyRepresentation(value, type) {
  function jsonStringify (line 6504) | function jsonStringify(object, spaces, depth) {
  function withStack (line 6614) | function withStack(value, fn) {
  function isMochaInternal (line 6791) | function isMochaInternal(line) {
  function isNodeInternal (line 6800) | function isNodeInternal(line) {
  function BrowserStdout (line 6857) | function BrowserStdout(opts) {
  function Bar (line 6934) | function Bar() {}
  function kMaxLength (line 6952) | function kMaxLength() {
  function Buffer (line 6968) | function Buffer(arg) {
  function fromNumber (line 6996) | function fromNumber(that, length) {
  function fromString (line 7006) | function fromString(that, string, encoding) {
  function fromObject (line 7018) | function fromObject(that, object) {
  function fromBuffer (line 7043) | function fromBuffer(that, buffer) {
  function fromArray (line 7050) | function fromArray(that, array) {
  function fromTypedArray (line 7060) | function fromTypedArray(that, array) {
  function fromArrayBuffer (line 7072) | function fromArrayBuffer(that, array) {
  function fromArrayLike (line 7084) | function fromArrayLike(that, array) {
  function fromJsonObject (line 7095) | function fromJsonObject(that, object) {
  function allocate (line 7111) | function allocate(that, length) {
  function checked (line 7127) | function checked(length) {
  function SlowBuffer (line 7141) | function SlowBuffer(subject, encoding) {
  function byteLength (line 7227) | function byteLength(string, encoding) {
  function slowToString (line 7268) | function slowToString(encoding, start, end) {
  function arrayIndexOf (line 7374) | function arrayIndexOf(arr, val, byteOffset) {
  function hexWrite (line 7410) | function hexWrite(buf, string, offset, length) {
  function utf8Write (line 7437) | function utf8Write(buf, string, offset, length) {
  function asciiWrite (line 7446) | function asciiWrite(buf, string, offset, length) {
  function binaryWrite (line 7450) | function binaryWrite(buf, string, offset, length) {
  function base64Write (line 7454) | function base64Write(buf, string, offset, length) {
  function ucs2Write (line 7458) | function ucs2Write(buf, string, offset, length) {
  function base64Slice (line 7555) | function base64Slice(buf, start, end) {
  function utf8Slice (line 7563) | function utf8Slice(buf, start, end) {
  function decodeCodePointsArray (line 7663) | function decodeCodePointsArray(codePoints) {
  function asciiSlice (line 7681) | function asciiSlice(buf, start, end) {
  function binarySlice (line 7691) | function binarySlice(buf, start, end) {
  function hexSlice (line 7701) | function hexSlice(buf, start, end) {
  function utf16leSlice (line 7714) | function utf16leSlice(buf, start, end) {
  function checkOffset (line 7763) | function checkOffset(offset, ext, length) {
  function checkInt (line 7968) | function checkInt(buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 8048) | function objectWriteUInt16(buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 8091) | function objectWriteUInt32(buf, value, offset, littleEndian) {
  function checkIEEE754 (line 8276) | function checkIEEE754(buf, value, offset, ext, max, min) {
  function writeFloat (line 8284) | function writeFloat(buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 8315) | function writeDouble(buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 8520) | function base64clean(str) {
  function stringtrim (line 8532) | function stringtrim(str) {
  function toHex (line 8537) | function toHex(n) {
  function utf8ToBytes (line 8542) | function utf8ToBytes(string, units) {
  function asciiToBytes (line 8622) | function asciiToBytes(str) {
  function utf16leToBytes (line 8631) | function utf16leToBytes(str, units) {
  function base64ToBytes (line 8647) | function base64ToBytes(str) {
  function blitBuffer (line 8651) | function blitBuffer(src, dst, offset, length) {
  function decode (line 8679) | function decode(elt) {
  function b64ToByteArray (line 8689) | function b64ToByteArray(b64) {
  function uint8ToBase64 (line 8748) | function uint8ToBase64(uint8) {
  function EventEmitter (line 8971) | function EventEmitter() {
  function g (line 9112) | function g() {
  function isFunction (line 9227) | function isFunction(arg) {
  function isNumber (line 9231) | function isNumber(arg) {
  function isObject (line 9235) | function isObject(arg) {
  function isUndefined (line 9239) | function isUndefined(arg) {
  function cleanUpNextTick (line 9356) | function cleanUpNextTick() {
  function drainQueue (line 9368) | function drainQueue() {
  function Item (line 9406) | function Item(fun, array) {
  function noop (line 9420) | function noop() {}
  function Duplex (line 9508) | function Duplex(options) {
  function onend (line 9526) | function onend() {
  function forEach (line 9536) | function forEach(xs, f) {
  function PassThrough (line 9589) | function PassThrough(options) {
  function ReadableState (line 9666) | function ReadableState(options, stream) {
  function Readable (line 9733) | function Readable(options) {
  function readableAddChunk (line 9770) | function readableAddChunk(
  function needMoreData (line 9825) | function needMoreData(state) {
  function roundUpToNextPowerOf2 (line 9845) | function roundUpToNextPowerOf2(n) {
  function howMuchToRead (line 9857) | function howMuchToRead(n, state) {
  function chunkInvalid (line 9997) | function chunkInvalid(state, chunk) {
  function onEofChunk (line 10010) | function onEofChunk(stream, state) {
  function emitReadable (line 10027) | function emitReadable(stream) {
  function emitReadable_ (line 10041) | function emitReadable_(stream) {
  function maybeReadMore (line 10053) | function maybeReadMore(stream, state) {
  function maybeReadMore_ (line 10062) | function maybeReadMore_(stream, state) {
  function onunpipe (line 10116) | function onunpipe(readable) {
  function onend (line 10123) | function onend() {
  function cleanup (line 10135) | function cleanup() {
  function ondata (line 10160) | function ondata(chunk) {
  function onerror (line 10175) | function onerror(er) {
  function onclose (line 10189) | function onclose() {
  function onfinish (line 10194) | function onfinish() {
  function unpipe (line 10201) | function unpipe() {
  function pipeOnDrain (line 10218) | function pipeOnDrain(src) {
  function resume (line 10327) | function resume(stream, state) {
  function resume_ (line 10336) | function resume_(stream, state) {
  function flow (line 10353) | function flow(stream) {
  function fromList (line 10429) | function fromList(n, state) {
  function endReadable (line 10482) | function endReadable(stream) {
  function forEach (line 10503) | function forEach(xs, f) {
  function indexOf (line 10509) | function indexOf(xs, x) {
  function TransformState (line 10606) | function TransformState(options, stream) {
  function afterTransform (line 10617) | function afterTransform(stream, er, data) {
  function Transform (line 10643) | function Transform(options) {
  function done (line 10721) | function done(stream, er) {
  function WriteReq (line 10785) | function WriteReq(chunk, encoding, cb) {
  function WritableState (line 10791) | function WritableState(options, stream) {
  function Writable (line 10879) | function Writable(options) {
  function writeAfterEnd (line 10900) | function writeAfterEnd(stream, state, cb) {
  function validChunk (line 10914) | function validChunk(stream, state, chunk, cb) {
  function decodeChunk (line 10978) | function decodeChunk(state, chunk, encoding) {
  function writeOrBuffer (line 10992) | function writeOrBuffer(stream, state, chunk, encoding, cb) {
  function doWrite (line 11010) | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  function onwriteError (line 11020) | function onwriteError(stream, state, sync, er, cb) {
  function onwriteStateUpdate (line 11035) | function onwriteStateUpdate(state) {
  function onwrite (line 11042) | function onwrite(stream, er) {
  function afterWrite (line 11073) | function afterWrite(stream, state, finished, cb) {
  function onwriteDrain (line 11083) | function onwriteDrain(stream, state) {
  function clearBuffer (line 11091) | function clearBuffer(stream, state) {
  function needFinish (line 11178) | function needFinish(stream, state) {
  function prefinish (line 11187) | function prefinish(stream, state) {
  function finishMaybe (line 11194) | function finishMaybe(stream, state) {
  function endWritable (line 11206) | function endWritable(stream, state, cb) {
  function isArray (line 11252) | function isArray(ar) {
  function isBoolean (line 11257) | function isBoolean(arg) {
  function isNull (line 11262) | function isNull(arg) {
  function isNullOrUndefined (line 11267) | function isNullOrUndefined(arg) {
  function isNumber (line 11272) | function isNumber(arg) {
  function isString (line 11277) | function isString(arg) {
  function isSymbol (line 11282) | function isSymbol(arg) {
  function isUndefined (line 11287) | function isUndefined(arg) {
  function isRegExp (line 11292) | function isRegExp(re) {
  function isObject (line 11297) | function isObject(arg) {
  function isDate (line 11302) | function isDate(d) {
  function isError (line 11307) | function isError(e) {
  function isFunction (line 11315) | function isFunction(arg) {
  function isPrimitive (line 11320) | function isPrimitive(arg) {
  function isBuffer (line 11332) | function isBuffer(arg) {
  function objectToString (line 11337) | function objectToString(o) {
  function Stream (line 11422) | function Stream() {
  function ondata (line 11429) | function ondata(chunk) {
  function ondrain (line 11439) | function ondrain() {
  function onend (line 11455) | function onend() {
  function onclose (line 11462) | function onclose() {
  function onerror (line 11470) | function onerror(er) {
  function cleanup (line 11481) | function cleanup() {
  function assertEncoding (line 11564) | function assertEncoding(encoding) {
  function passThroughWrite (line 11748) | function passThroughWrite(buffer) {
  function utf16DetectIncompleteChar (line 11752) | function utf16DetectIncompleteChar(buffer) {
  function base64DetectIncompleteChar (line 11757) | function base64DetectIncompleteChar(buffer) {
  function deprecated (line 11859) | function deprecated() {
  function inspect (line 11904) | function inspect(obj, opts) {
  function stylizeWithColor (line 11960) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 11978) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 11982) | function arrayToHash(array) {
  function formatValue (line 11992) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 12123) | function formatPrimitive(ctx, value) {
  function formatError (line 12142) | function formatError(value) {
  function formatArray (line 12146) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 12181) | function formatProperty(
  function reduceToSingleString (line 12258) | function reduceToSingleString(output, base, braces) {
  function isArray (line 12282) | function isArray(ar) {
  function isBoolean (line 12287) | function isBoolean(arg) {
  function isNull (line 12292) | function isNull(arg) {
  function isNullOrUndefined (line 12297) | function isNullOrUndefined(arg) {
  function isNumber (line 12302) | function isNumber(arg) {
  function isString (line 12307) | function isString(arg) {
  function isSymbol (line 12312) | function isSymbol(arg) {
  function isUndefined (line 12317) | function isUndefined(arg) {
  function isRegExp (line 12322) | function isRegExp(re) {
  function isObject (line 12327) | function isObject(arg) {
  function isDate (line 12332) | function isDate(d) {
  function isError (line 12337) | function isError(e) {
  function isFunction (line 12345) | function isFunction(arg) {
  function isPrimitive (line 12350) | function isPrimitive(arg) {
  function objectToString (line 12364) | function objectToString(o) {
  function pad (line 12368) | function pad(n) {
  function timestamp (line 12388) | function timestamp() {
  function hasOwnProperty (line 12434) | function hasOwnProperty(obj, prop) {
  function map (line 12473) | function map(arr, mapper, that) {
  function clonePath (line 12485) | function clonePath(path) {
  function removeEmpty (line 12491) | function removeEmpty(array) {
  function escapeHTML (line 12500) | function escapeHTML(s) {
  function canonicalize (line 12512) | function canonicalize(obj, stack, replacementStack) {
  function buildValues (line 12565) | function buildValues(
  function Diff (line 12618) | function Diff(ignoreWhitespace) {
  function done (line 12625) | function done(value) {
  function execEditLength (line 12669) | function execEditLength() {
  function contextLines (line 12972) | function contextLines(lines) {
  function eofNL (line 12979) | function eofNL(curRange, i, current) {
  function which (line 13253) | function which(name) {
  function growl (line 13372) | function growl(msg, options, fn) {
  function timeslice (line 13543) | function timeslice() {

FILE: libs/code-demos/assets/runner/js/system-config.js
  function loadSystemModule (line 1) | function loadSystemModule(name, code) {

FILE: libs/code-demos/assets/runner/js/test-bootstrap.js
  function mochaBefore (line 1) | function mochaBefore() {
  function flattenTests (line 35) | function flattenTests(suite) {
  function mochaAfter (line 51) | function mochaAfter(runId) {

FILE: libs/code-demos/assets/runner/ng-dts/bundler.ts
  type FileModule (line 51) | interface FileModule {

FILE: libs/code-demos/assets/runner/ng2/ng-bundle.js
  function t (line 1) | function t(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null=...
  function n (line 1) | function n(e,t,n,r){var i,o=arguments.length,a=o<3?t:null===r?r=Object.g...
  function i (line 1) | function i(n,r){return function(e,t){r(e,t,n)}}
  function o (line 1) | function o(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect....
  function v (line 1) | function v(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;re...
  function a (line 1) | function a(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!...
  function l (line 1) | function l(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(a(argume...
  function s (line 1) | function s(e,t){this.id=e,this.url=t}
  function c (line 1) | function c(e,t,n,r){void 0===n&&(n="imperative"),void 0===r&&(r=null);va...
  function b (line 1) | function b(e,t,n){var r=g.call(this,e,t)||this;return r.urlAfterRedirect...
  function C (line 1) | function C(e,t,n){var r=w.call(this,e,t)||this;return r.reason=n,r}
  function O (line 1) | function O(e,t,n){var r=S.call(this,e,t)||this;return r.error=n,r}
  function T (line 1) | function T(e,t,n,r){var i=k.call(this,e,t)||this;return i.urlAfterRedire...
  function A (line 1) | function A(e,t,n,r){var i=I.call(this,e,t)||this;return i.urlAfterRedire...
  function N (line 1) | function N(e,t,n,r,i){var o=M.call(this,e,t)||this;return o.urlAfterRedi...
  function L (line 1) | function L(e,t,n,r){var i=j.call(this,e,t)||this;return i.urlAfterRedire...
  function U (line 1) | function U(e,t,n,r){var i=V.call(this,e,t)||this;return i.urlAfterRedire...
  function q (line 1) | function q(e){this.route=e}
  function W (line 1) | function W(e){this.route=e}
  function Y (line 1) | function Y(e){this.snapshot=e}
  function Z (line 1) | function Z(e){this.snapshot=e}
  function X (line 1) | function X(e){this.snapshot=e}
  function J (line 1) | function J(e){this.snapshot=e}
  function te (line 1) | function te(e,t,n){this.routerEvent=e,this.position=t,this.anchor=n}
  function re (line 1) | function re(){}
  function ae (line 1) | function ae(e){this.params=e||{}}
  function se (line 1) | function se(e){return new oe(e)}
  function ue (line 1) | function ue(e){var t=Error("NavigationCancelingError: "+e);return t[le]=...
  function ce (line 1) | function ce(e,t,n){var r=n.path.split("/");if(r.length>e.length)return n...
  function de (line 1) | function de(e,t){void 0===t&&(t="");for(var n=0;n<e.length;n++){var r=e[...
  function he (line 1) | function he(e,t){if(!e)throw new Error("\n      Invalid configuration of...
  function fe (line 1) | function fe(e,t){return t?e||t.path?e&&!t.path?e+"/":!e&&t.path?t.path:e...
  function me (line 1) | function me(e){var t=e.children&&e.children.map(me),n=t?m(m({},e),{child...
  function ve (line 1) | function ve(e,t){var n,r=Object.keys(e),i=Object.keys(t);if(!r||!i||r.le...
  function ye (line 1) | function ye(e){return Array.prototype.concat.apply([],e)}
  function ge (line 1) | function ge(e){return 0<e.length?e[e.length-1]:null}
  function _e (line 1) | function _e(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}
  function be (line 1) | function be(e){return p.ɵisObservable(e)?e:p.ɵisPromise(e)?d.from(Promis...
  function we (line 1) | function we(e,t,n){return n?function(e,t){return ve(e,t)}(e.queryParams,...
  function xe (line 1) | function xe(e,t){return function e(t,n,r){{if(t.segments.length>r.length...
  function Se (line 1) | function Se(e,t,n){this.root=e,this.queryParams=t,this.fragment=n}
  function Oe (line 1) | function Oe(e,t){var n=this;this.segments=e,this.children=t,this.parent=...
  function De (line 1) | function De(e,t){this.path=e,this.parameters=t}
  function Te (line 1) | function Te(e,n){return e.length===n.length&&e.every(function(e,t){retur...
  function Ie (line 1) | function Ie(e,n){var r=[];return _e(e.children,function(e,t){t===ie&&(r=...
  function Pe (line 1) | function Pe(){}
  function Me (line 1) | function Me(){}
  function Ne (line 1) | function Ne(e){return e.segments.map(function(e){return Ue(e)}).join("/")}
  function je (line 1) | function je(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(...
  function Fe (line 1) | function Fe(e){return je(e).replace(/%3B/gi,";")}
  function Le (line 1) | function Le(e){return je(e).replace(/\(/g,"%28").replace(/\)/g,"%29").re...
  function Ve (line 1) | function Ve(e){return decodeURIComponent(e)}
  function Be (line 1) | function Be(e){return Ve(e.replace(/\+/g,"%20"))}
  function Ue (line 1) | function Ue(e){return""+Le(e.path)+function(t){return Object.keys(t).map...
  function qe (line 1) | function qe(e){var t=e.match(ze);return t?t[0]:""}
  function Ye (line 1) | function Ye(e){this.url=e,this.remaining=e}
  function Ze (line 1) | function Ze(e){this._root=e}
  function Qe (line 1) | function Qe(e,t){var n,r;if(e===t.value)return t;try{for(var i=v(t.child...
  function Xe (line 1) | function Xe(e,t){var n,r;if(e===t.value)return[t];try{for(var i=v(t.chil...
  function Je (line 1) | function Je(e,t){this.value=e,this.children=t}
  function et (line 1) | function et(e){var t={};return e&&e.children.forEach(function(e){return ...
  function rt (line 1) | function rt(e,t){var n=tt.call(this,e)||this;return n.snapshot=t,ht(n,e),n}
  function it (line 1) | function it(e,t){var n=function(e,t){var n=new lt([],{},{},"",{},ie,t,nu...
  function at (line 1) | function at(e,t,n,r,i,o,a,s){this.url=e,this.params=t,this.queryParams=n...
  function st (line 1) | function st(e,t){void 0===t&&(t="emptyOnly");var n=e.pathFromRoot,r=0;if...
  function ut (line 1) | function ut(e,t,n,r,i,o,a,s,l,u,c){this.url=e,this.params=t,this.queryPa...
  function dt (line 1) | function dt(e,t){var n=ct.call(this,t)||this;return n.url=e,ht(n,t),n}
  function ht (line 1) | function ht(t,e){e.value._routerState=t,e.children.forEach(function(e){r...
  function ft (line 1) | function ft(e){var t=0<e.children.length?" { "+e.children.map(ft).join("...
  function mt (line 1) | function mt(e){if(e.snapshot){var t=e.snapshot,n=e._futureSnapshot;e.sna...
  function vt (line 1) | function vt(e,t){var n=ve(e.params,t.params)&&function(e,n){return Te(e,...
  function yt (line 1) | function yt(t,e,n){if(n&&t.shouldReuseRoute(e.value,n.value.snapshot)){(...
  function gt (line 1) | function gt(e,t,n,r,i){if(0===n.length)return bt(t.root,t.root,t,r,i);va...
  function _t (line 1) | function _t(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segment...
  function bt (line 1) | function bt(e,t,n,r,i){var o={};return r&&_e(r,function(e,t){o[t]=Array....
  function xt (line 1) | function xt(e,t,n){if(this.isAbsolute=e,this.numberOfDoubleDots=t,this.c...
  function St (line 1) | function St(e){return"object"==typeof e&&null!=e&&e.outlets?e.outlets[ie...
  function Et (line 1) | function Et(e,t,n){if(0===(e=e||new Ee([],{})).segments.length&&e.hasChi...
  function Ot (line 1) | function Ot(n,r,e){if(0===e.length)return new Ee(n.segments,{});var i=fu...
  function kt (line 1) | function kt(e,t,n){for(var r=e.segments.slice(0,t),i=0;i<n.length;){if("...
  function Dt (line 1) | function Dt(e){var n={};return _e(e,function(e,t){null!==e&&(n[t]=kt(new...
  function Tt (line 1) | function Tt(e){var n={};return _e(e,function(e,t){return n[t]=""+e}),n}
  function It (line 1) | function It(e,t,n){return e==n.path&&ve(t,n.parameters)}
  function At (line 1) | function At(e,t,n,r){this.routeReuseStrategy=e,this.futureState=t,this.c...
  function Mt (line 1) | function Mt(e){mt(e.value),e.children.forEach(Mt)}
  function Rt (line 1) | function Rt(e){return"function"==typeof e}
  function Nt (line 1) | function Nt(e){return e instanceof Ce}
  function Lt (line 1) | function Lt(t){return new d.Observable(function(e){return e.error(new jt...
  function Vt (line 1) | function Vt(t){return new d.Observable(function(e){return e.error(new Ft...
  function Bt (line 1) | function Bt(t){return new d.Observable(function(e){return e.error(new Er...
  function zt (line 1) | function zt(e,t,n,r,i){this.configLoader=t,this.urlSerializer=n,this.url...
  function qt (line 1) | function qt(e,t,n){if(""===t.path)return"full"===t.pathMatch&&(e.hasChil...
  function Ht (line 1) | function Ht(e){if(1===e.numberOfChildren&&e.children[ie]){var t=e.childr...
  function Wt (line 1) | function Wt(e,t,n){return(!(e.hasChildren()||0<t.length)||"full"!==n.pat...
  function Gt (line 1) | function Gt(e){return e.outlet||ie}
  function Yt (line 1) | function Yt(n,r,i,o){return function(e){return e.pipe(f.switchMap(functi...
  function Qt (line 1) | function Qt(e,t,n){var r=function(e){if(!e)return null;for(var t=e.paren...
  function Xt (line 1) | function Xt(e,t,n,r,i){void 0===i&&(i={canDeactivateChecks:[],canActivat...
  function $t (line 1) | function $t(e,n,r){var t=et(e),i=e.value;_e(t,function(e,t){i.component?...
  function en (line 1) | function en(){return f.switchMap(function(e){return d.combineLatest.appl...
  function tn (line 1) | function tn(a,s){return function(e){return e.pipe(f.mergeMap(function(t)...
  function on (line 1) | function on(e,t,n,r,i,o){this.rootComponentType=e,this.config=t,this.url...
  function an (line 1) | function an(e){for(var t=e;t._sourceSegment;)t=t._sourceSegment;return t}
  function sn (line 1) | function sn(e){for(var t=e,n=t._segmentIndexShift?t._segmentIndexShift:0...
  function ln (line 1) | function ln(e,t,n,r,i){if(0<n.length&&function(t,n,e){return e.some(func...
  function un (line 1) | function un(e,t,n){return(!(e.hasChildren()||0<t.length)||"full"!==n.pat...
  function cn (line 1) | function cn(e){return e.outlet||ie}
  function pn (line 1) | function pn(e){return e.data||{}}
  function dn (line 1) | function dn(e){return e.resolve||{}}
  function hn (line 1) | function hn(n,r,i,o,a){return function(e){return e.pipe(f.mergeMap(funct...
  function fn (line 1) | function fn(r,i){return function(e){return e.pipe(f.mergeMap(function(t)...
  function mn (line 1) | function mn(e,t,n,r){var i=Qt(e,t,r);return i.resolve?be(i.resolve(t,n))...
  function vn (line 1) | function vn(n){return function(e){return e.pipe(f.switchMap(function(e){...
  function yn (line 1) | function yn(){}
  function _n (line 1) | function _n(){}
  function xn (line 1) | function xn(e,t,n,r){this.loader=e,this.compiler=t,this.onLoadStartListe...
  function Cn (line 1) | function Cn(){}
  function En (line 1) | function En(){}
  function On (line 1) | function On(e){throw e}
  function kn (line 1) | function kn(e,t,n){return t.parse("/")}
  function Dn (line 1) | function Dn(e,t){return d.of(null)}
  function In (line 1) | function In(e,t,n,r,i,o,a,s){var l=this;this.rootComponentType=e,this.ur...
  function An (line 1) | function An(e,t,n,r,i){this.router=e,this.route=t,this.commands=[],null=...
  function Rn (line 1) | function Rn(e,t,n){var r=this;this.router=e,this.route=t,this.locationSt...
  function Nn (line 1) | function Nn(e){return""===e||!!e}
  function Fn (line 1) | function Fn(e,t,n,r,i){var o=this;this.router=e,this.element=t,this.rend...
  function Bn (line 1) | function Bn(){this.contexts=new Map}
  function zn (line 1) | function zn(e,t,n,r,i){this.parentContexts=e,this.location=t,this.resolv...
  function Hn (line 1) | function Hn(e,t,n){this.route=e,this.childContexts=t,this.parent=n}
  function Wn (line 1) | function Wn(){}
  function Yn (line 1) | function Yn(){}
  function Zn (line 1) | function Zn(){}
  function Xn (line 1) | function Xn(t,e,n,r,i){this.router=t,this.injector=r,this.preloadingStra...
  function Jn (line 1) | function Jn(e,t,n){void 0===n&&(n={}),this.router=e,this.viewportScrolle...
  function ir (line 1) | function ir(){return new p.NgProbeToken("Router",Tn)}
  function sr (line 1) | function sr(e,t){}
  function lr (line 1) | function lr(e,t,n){return n.scrollOffset&&t.setOffset(n.scrollOffset),ne...
  function ur (line 1) | function ur(e,t,n){return void 0===n&&(n={}),n.useHash?new h.HashLocatio...
  function cr (line 1) | function cr(e){if(e)throw new Error("RouterModule.forRoot() called twice...
  function pr (line 1) | function pr(e){return[{provide:p.ANALYZE_FOR_ENTRY_COMPONENTS,multi:!0,u...
  function dr (line 1) | function dr(e,t,n,r,i,o,a,s,l,u,c){void 0===l&&(l={});var p=new Tn(null,...
  function hr (line 1) | function hr(e){return e.routerState.root}
  function mr (line 1) | function mr(e){this.injector=e,this.initNavigation=!1,this.resultOfPreac...
  function vr (line 1) | function vr(e){return e.appInitializer.bind(e)}
  function yr (line 1) | function yr(e){return e.bootstrapListener.bind(e)}
  function _r (line 1) | function _r(){return[fr,{provide:p.APP_INITIALIZER,multi:!0,useFactory:v...
  function i (line 1) | function i(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null=...
  function o (line 1) | function o(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!...
  function s (line 1) | function s(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(o(argume...
  function d (line 1) | function d(){this.reflectionCapabilities=new a.ɵReflectionCapabilities}
  function g (line 1) | function g(e,t,n,r,i,o,a,s,l,u,c){this._metadataResolver=t,this._delegat...
  function O (line 1) | function O(e){var t={useJit:!0,defaultEncapsulation:a.ViewEncapsulation....
  function k (line 1) | function k(e){for(var t=e.length-1;0<=t;t--)if(void 0!==e[t])return e[t]}
  function P (line 1) | function P(){return null!==D&&D.apply(this,arguments)||this}
  function F (line 1) | function F(){var e=A.call(this)||this;if(e._cache=a.ɵglobal.$templateCac...
  function o (line 1) | function o(e){this._overrideUa=e}
  function a (line 1) | function a(){return new t.NgZone({enableLongStackTrace:!0})}
  function p (line 1) | function p(){}
  function t (line 1) | function t(e,t){function n(){this.constructor=e}i(e,t),e.prototype=null=...
  function a (line 1) | function a(){var e=null!==n&&n.apply(this,arguments)||this;return e._exp...
  function l (line 1) | function l(e){var n=this;this.url=e,this.promise=new Promise(function(e,...
  function p (line 1) | function p(e,t,n,r,i){this.existingProperties=e,this.attrPropMapping=t,t...
  function f (line 1) | function f(e){var t=d.call(this,e)||this;return t._directives=new Map,t}
  function y (line 1) | function y(e){var t=m.call(this,e)||this;return t._ngModules=new Map,t}
  function b (line 1) | function b(e){var t=g.call(this,e)||this;return t._pipes=new Map,t}
  function u (line 1) | function u(e,t,n,r){var i,o=arguments.length,a=o<3?t:null===r?r=Object.g...
  function v (line 1) | function v(){this.constructor=d}
  function y (line 1) | function y(e){var t=f.call(this)||this;return t._doc=e,t}
  function b (line 1) | function b(e,t){this._injector=e,this._compilerFactory=t}
  function x (line 1) | function x(e,t,n,r){this._compiler=e,this._directiveResolver=t,this._pip...
  function k (line 1) | function k(){}
  function f (line 1) | function f(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null=...
  function z (line 1) | function z(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;re...
  function U (line 1) | function U(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!...
  function q (line 1) | function q(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(U(argume...
  function H (line 1) | function H(e){if(":"!=e[0])return[null,e];var t=e.indexOf(":",1);if(-1==...
  function W (line 1) | function W(e){return"ng-container"===H(e)[1]}
  function l (line 1) | function l(e){return"ng-content"===H(e)[1]}
  function V (line 1) | function V(e){return"ng-template"===H(e)[1]}
  function c (line 1) | function c(e){return null===e?null:H(e)[0]}
  function p (line 1) | function p(e,t){return e?":"+e+":"+t:t}
  function o (line 1) | function o(e){var t=this,n=void 0===e?{}:e,r=n.closedByChildren,i=n.impl...
  function d (line 1) | function d(e){return n||(t=new i,n={base:new i({isVoid:!0}),meta:new i({...
  function t (line 1) | function t(e,t){0<t.notSelectors.length&&!t.element&&0==t.classNames.len...
  function h (line 1) | function h(){this.element=null,this.classNames=[],this.attrs=[],this.not...
  function a (line 1) | function a(){this._elementMap=new Map,this._elementPartialMap=new Map,th...
  function g (line 1) | function g(e,t,n){this.selector=e,this.cbContext=t,this.listContext=n,th...
  function oe (line 1) | function oe(r,i){function e(){for(var e=[],t=0;t<arguments.length;t++)e[...
  function ae (line 1) | function ae(e){var t=function(e){var t=e.classNames&&e.classNames.length...
  function se (line 1) | function se(e){return e?B.parse(e).map(ae):[]}
  method ViewEncapsulation (line 1) | get ViewEncapsulation(){return I}
  method ChangeDetectionStrategy (line 1) | get ChangeDetectionStrategy(){return P}
  method SecurityContext (line 1) | get SecurityContext(){return M}
  method MissingTranslationStrategy (line 1) | get MissingTranslationStrategy(){return N}
  function he (line 1) | function he(e){void 0===e&&(e=null),(this.modifiers=e)||(this.modifiers=...
  function ve (line 1) | function ve(e,t){void 0===t&&(t=null);var n=fe.call(this,t)||this;return...
  function _e (line 1) | function _e(e,t,n){void 0===t&&(t=null),void 0===n&&(n=null);var r=ye.ca...
  function xe (line 1) | function xe(e,t){void 0===t&&(t=null);var n=be.call(this,t)||this;return...
  function Ee (line 1) | function Ee(e,t){void 0===t&&(t=null);var n=Ce.call(this,t)||this;return...
  function Me (line 1) | function Me(e,t){return null==e||null==t?e==t:e.isEquivalent(t)}
  function Re (line 1) | function Re(e,t){var n=e.length;if(n!==t.length)return!1;for(var r=0;r<n...
  function Fe (line 1) | function Fe(e,t){this.type=e||null,this.sourceSpan=t||null}
  function Be (line 1) | function Be(e,t,n){var r=Le.call(this,t,n)||this;return"string"==typeof ...
  function qe (line 1) | function qe(e,t,n){var r=Ue.call(this,t,n)||this;return r.expr=e,r}
  function Ge (line 1) | function Ge(e,t,n){var r=He.call(this,t,n)||this;return r.node=e,r}
  function Ze (line 1) | function Ze(e,t,n,r){var i=Ye.call(this,n||t.type,r)||this;return i.name...
  function $e (line 1) | function $e(e,t,n,r,i){var o=Qe.call(this,r||n.type,i)||this;return o.re...
  function nt (line 1) | function nt(e,t,n,r,i){var o=Je.call(this,r||n.type,i)||this;return o.re...
  function ot (line 1) | function ot(e,t,n,r,i){var o=rt.call(this,r,i)||this;return o.receiver=e...
  function lt (line 1) | function lt(e,t,n,r,i){void 0===i&&(i=!1);var o=at.call(this,n,r)||this;...
  function pt (line 1) | function pt(e,t,n,r){var i=ut.call(this,n,r)||this;return i.classExpr=e,...
  function ft (line 1) | function ft(e,t,n){var r=dt.call(this,t,n)||this;return r.value=e,r}
  function yt (line 1) | function yt(e,t,n,r,i){var o=mt.call(this,Pe,i)||this;return o.metaBlock...
  function bt (line 1) | function bt(e,t,n,r){void 0===n&&(n=null);var i=gt.call(this,t,r)||this;...
  function St (line 1) | function St(e,t,n,r,i){void 0===n&&(n=null);var o=wt.call(this,r||t.type...
  function kt (line 1) | function kt(e,t){var n=Et.call(this,Te,t)||this;return n.condition=e,n}
  function It (line 1) | function It(e,t){var n=Dt.call(this,e.type,t)||this;return n.condition=e,n}
  function Mt (line 1) | function Mt(e,t,n){var r=Pt.call(this,t,n)||this;return r.value=e,r}
  function Nt (line 1) | function Nt(e,t){void 0===t&&(t=null),this.name=e,this.type=t}
  function Lt (line 1) | function Lt(e,t,n,r,i){var o=jt.call(this,n,r)||this;return o.params=e,o...
  function Ut (line 1) | function Ut(e,t,n,r,i,o){void 0===o&&(o=!0);var a=Vt.call(this,r||t.type...
  function Ht (line 1) | function Ht(e,t,n,r){var i=zt.call(this,n,r)||this;return i.receiver=e,i...
  function Yt (line 1) | function Yt(e,t,n,r){var i=Wt.call(this,n,r)||this;return i.receiver=e,i...
  function Qt (line 1) | function Qt(e,t,n){var r=Kt.call(this,t,n)||this;return r.entries=e,r}
  function $t (line 1) | function $t(e,t,n){this.key=e,this.value=t,this.quoted=n}
  function tn (line 1) | function tn(e,t,n){var r=Jt.call(this,t,n)||this;return r.entries=e,r.va...
  function on (line 1) | function on(e,t){var n=nn.call(this,e[e.length-1].type,t)||this;return n...
  function cn (line 1) | function cn(e,t){this.modifiers=e||[],this.sourceSpan=t||null}
  function hn (line 1) | function hn(e,t,n,r,i){void 0===r&&(r=null);var o=pn.call(this,r,i)||thi...
  function vn (line 1) | function vn(e,t,n,r,i,o){void 0===i&&(i=null);var a=fn.call(this,i,o)||t...
  function _n (line 1) | function _n(e,t){var n=yn.call(this,null,t)||this;return n.expr=e,n}
  function xn (line 1) | function xn(e,t){var n=bn.call(this,null,t)||this;return n.value=e,n}
  function Sn (line 1) | function Sn(e,t){(this.modifiers=t)||(this.modifiers=[]),this.type=e||null}
  function kn (line 1) | function kn(e,t,n,r){void 0===n&&(n=null);var i=En.call(this,t,n)||this;...
  function In (line 1) | function In(e,t,n,r,i){void 0===i&&(i=null);var o=Dn.call(this,r,i)||thi...
  function Mn (line 1) | function Mn(e,t,n,r){void 0===r&&(r=null);var i=Pn.call(this,n,r)||this;...
  function jn (line 1) | function jn(e,t,n,r,i,o,a,s){void 0===a&&(a=null);var l=Rn.call(this,a,s...
  function Vn (line 1) | function Vn(e,t,n,r){void 0===n&&(n=[]);var i=Fn.call(this,null,r)||this...
  function zn (line 1) | function zn(e,t,n){void 0===t&&(t=!1);var r=Bn.call(this,null,n)||this;r...
  function Wn (line 1) | function Wn(e,t){void 0===e&&(e=[]);var n=qn.call(this,null,t)||this;ret...
  function Kn (line 1) | function Kn(e,t,n){var r=Gn.call(this,null,n)||this;return r.bodyStmts=e...
  function Xn (line 1) | function Xn(e,t){var n=Zn.call(this,null,t)||this;return n.error=e,n}
  function Jn (line 1) | function Jn(){}
  function tr (line 1) | function tr(){}
  function nr (line 1) | function nr(e){var t=new ir;return t.visitAllStatements(e,null),t.varNames}
  function or (line 1) | function or(){var e=null!==rr&&rr.apply(this,arguments)||this;return e.v...
  function lr (line 1) | function lr(){var e=null!==ar&&ar.apply(this,arguments)||this;return e.e...
  function ur (line 1) | function ur(e,t){if(!t)return e;var n=new dr(t);return e.visitStatement(...
  function cr (line 1) | function cr(e,t){if(!t)return e;var n=new dr(t);return e.visitExpression...
  function hr (line 1) | function hr(e){var t=pr.call(this)||this;return t.sourceSpan=e,t}
  function fr (line 1) | function fr(e,t,n){return new Ve(e,t,n)}
  function mr (line 1) | function mr(e,t,n){return void 0===t&&(t=null),new _t(e,null,t,n)}
  function vr (line 1) | function vr(e,t,n){return void 0===t&&(t=null),void 0===n&&(n=null),null...
  function yr (line 1) | function yr(e,t,n){return void 0===t&&(t=null),void 0===n&&(n=null),new ...
  function gr (line 1) | function gr(e,t,n){return new Zt(e,t,n)}
  function _r (line 1) | function _r(e,t){return void 0===t&&(t=null),new en(e.map(function(e){re...
  function br (line 1) | function br(e,t,n,r,i){return new Ft(e,t,n,r,i)}
  function wr (line 1) | function wr(e,t,n){return new Ln(e,t,n)}
  function xr (line 1) | function xr(e,t,n){return new ht(e,t,n)}
  function Cr (line 1) | function Cr(e){var t="";if(e.tagName&&(t+=" @"+e.tagName),e.text){if(e.t...
  function Er (line 1) | function Er(e,t){return Or(e,":",t)}
  function Or (line 1) | function Or(e,t,n){var r=e.indexOf(t);return-1==r?n:[e.slice(0,r).trim()...
  function kr (line 1) | function kr(e,t,n){return Array.isArray(e)?t.visitArray(e,n):function(e)...
  function Dr (line 1) | function Dr(e){return null!=e}
  function Tr (line 1) | function Tr(e){return void 0===e?null:e}
  function Pr (line 1) | function Pr(){}
  function Nr (line 1) | function Nr(e){throw new Error("Internal Error: "+e)}
  function jr (line 1) | function jr(e,t){var n=Error(e);return n[Fr]=!0,t&&(n[Lr]=t),n}
  function Vr (line 1) | function Vr(e){return e.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}
  function Ur (line 1) | function Ur(e){for(var t="",n=0;n<e.length;n++){var r=e.charCodeAt(n);if...
  function zr (line 1) | function zr(e){if("string"==typeof e)return e;if(Array.isArray(e))return...
  function qr (line 1) | function qr(e){return"function"==typeof e&&e.hasOwnProperty("__forward_r...
  function Hr (line 1) | function Hr(e){return!!e&&"function"==typeof e.then}
  function Zr (line 1) | function Zr(e,t){for(var n=[],r=0;r<e;r++)n.push(t);return n}
  function Jr (line 1) | function Jr(e){var t=Qr.call(this,e.type)||this;return t.resolved=e,t.or...
  function ti (line 1) | function ti(){this.statements=[],this.literals=new Map,this.literalFacto...
  function ri (line 1) | function ri(){this.visitWrappedNodeExpr=ii,this.visitWriteVarExpr=ii,thi...
  function ii (line 1) | function ii(e){throw new Error("Invalid state: Visitor "+this.constructo...
  function oi (line 1) | function oi(e){return e instanceof Ve}
  function li (line 1) | function li(){}
  function ui (line 1) | function ui(e){return{identifier:{reference:e}}}
  function ci (line 1) | function ci(e,t){return ui(e.resolveExternalReference(t))}
  function di (line 1) | function di(e,t,n){this.filePath=e,this.name=t,this.members=n}
  function fi (line 1) | function fi(){this.cache=new Map}
  function vi (line 1) | function vi(e){return e.replace(/\W/g,"_")}
  function _i (line 1) | function _i(e){if(!e||!e.reference)return null;var t=e.reference;if(t in...
  function bi (line 1) | function bi(e){var t=e.reference;return t instanceof pi?t.filePath:"./"+...
  function wi (line 1) | function wi(e,t){return"View_"+_i({reference:e})+"_"+t}
  function xi (line 1) | function xi(e){return"RenderType_"+_i({reference:e})}
  function Ci (line 1) | function Ci(e){return"HostView_"+_i({reference:e})}
  function Si (line 1) | function Si(e){return _i({reference:e})+"NgFactory"}
  function Ei (line 1) | function Ei(e){return null!=e.value?vi(e.value):_i(e.identifier)}
  function Oi (line 1) | function Oi(e){return null!=e.identifier?e.identifier.reference:e.value}
  function Ti (line 1) | function Ti(e){var t=e.encapsulation,n=e.template,r=e.templateUrl,i=e.ht...
  function Pi (line 1) | function Pi(e){var t=e.isHost,n=e.type,r=e.isComponent,i=e.selector,o=e....
  function Mi (line 1) | function Mi(e){var t=e.type,n=e.name,r=e.pure;this.type=t,this.name=n,th...
  function Ri (line 1) | function Ri(){}
  function ji (line 1) | function ji(e){var t=e.type,n=e.providers,r=e.declaredDirectives,i=e.exp...
  function Li (line 1) | function Li(){this.directivesSet=new Set,this.directives=[],this.exporte...
  function Vi (line 1) | function Vi(e){return e||[]}
  function Ui (line 1) | function Ui(e){return e.reduce(function(e,t){var n=Array.isArray(t)?Ui(t...
  function zi (line 1) | function zi(e){return e.replace(/(\w+:\/\/[\w:-]+)?(\/+)?/,"ng:///")}
  function qi (line 1) | function qi(e,t,n){var r;return r=n.isInline?t.type.reference instanceof...
  function Hi (line 1) | function Hi(e,t){var n=e.moduleUrl.split(/\/\\/g);return zi("css/"+t+n[n...
  function Wi (line 1) | function Wi(e){return zi(_i(e.type)+"/module.ngfactory.js")}
  function Gi (line 1) | function Gi(e,t){return zi(_i(e)+"/"+_i(t.type)+".ngfactory.js")}
  function Zi (line 1) | function Zi(){}
  function Qi (line 1) | function Qi(t){return _r(Object.keys(t).map(function(e){return{key:e,val...
  function Xi (line 1) | function Xi(e,t){if(Array.isArray(e))return gr(e.map(function(e){return ...
  function $i (line 1) | function $i(e,t){var n=null;if(0<t){n=[];for(var r=0;r<t;r++)n.push(ke)}...
  function eo (line 1) | function eo(e){return""+Ji+e}
  function to (line 1) | function to(e,t){return"animation_"+e+"_"+t}
  function Mo (line 1) | function Mo(e){return no<=e&&e<=so||e==Po}
  function Ro (line 1) | function Ro(e){return fo<=e&&e<=mo}
  function No (line 1) | function No(e){return wo<=e&&e<=Do||vo<=e&&e<=_o}
  function jo (line 1) | function jo(e){return e===ro||e===ao}
  function Fo (line 1) | function Fo(e){return fo<=e&&e<=55}
  function Vo (line 1) | function Vo(e,t,n,r){this.file=e,this.offset=t,this.line=n,this.col=r}
  function zo (line 1) | function zo(e,t,n){void 0===n&&(n=null),this.start=e,this.end=t,this.det...
  function Yo (line 1) | function Yo(e,t,n){void 0===n&&(n=E.ParseErrorLevel.ERROR),this.span=e,t...
  function Ko (line 1) | function Ko(e,t){var n=bi(t),r=null!=n?"in "+e+" "+_i(t)+" in "+n:"in "+...
  function Zo (line 1) | function Zo(e,t,n){var r=new Bo("","in "+e+" "+t+" in "+n);return new Uo...
  function Xo (line 1) | function Xo(e,t){this.value=e,this.sourceSpan=t}
  function Jo (line 1) | function Jo(e,t,n){this.value=e,this.sourceSpan=t,this.i18n=n}
  function ta (line 1) | function ta(e,t,n,r,i){this.name=e,this.value=t,this.sourceSpan=n,this.v...
  function ra (line 1) | function ra(e,t,n,r,i,o,a,s){this.name=e,this.type=t,this.securityContex...
  function oa (line 1) | function oa(e,t,n,r,i,o,a){this.name=e,this.type=t,this.handler=n,this.t...
  function sa (line 1) | function sa(e,t,n,r,i,o,a,s,l,u){this.name=e,this.attributes=t,this.inpu...
  function ua (line 1) | function ua(e,t,n,r,i,o,a,s,l,u,c,p){this.tagName=e,this.attributes=t,th...
  function pa (line 1) | function pa(e,t,n,r){this.selector=e,this.attributes=t,this.sourceSpan=n...
  function ha (line 1) | function ha(e,t,n,r){this.name=e,this.value=t,this.sourceSpan=n,this.val...
  function ma (line 1) | function ma(e,t,n,r){this.name=e,this.value=t,this.sourceSpan=n,this.val...
  function ya (line 1) | function ya(e,t,n,r){this.vars=e,this.placeholders=t,this.sourceSpan=n,t...
  function ga (line 1) | function ga(){}
  function ba (line 1) | function ba(){}
  function wa (line 1) | function wa(){}
  function xa (line 1) | function xa(e,t){var n,r,i,o,a=[];if(e.visit)try{for(var s=z(t),l=s.next...
  function Ca (line 1) | function Ca(e,t){var n,r,i=[],o=!1;try{for(var a=z(t),s=a.next();!s.done...
  function Oa (line 1) | function Oa(e,t){this.value=e,this.sourceSpan=t}
  function Da (line 1) | function Da(e,t){this.children=e,this.sourceSpan=t}
  function Ia (line 1) | function Ia(e,t,n,r){this.expression=e,this.type=t,this.cases=n,this.sou...
  function Aa (line 1) | function Aa(e,t,n,r,i,o,a){this.tag=e,this.attrs=t,this.startName=n,this...
  function Ra (line 1) | function Ra(e,t,n){this.value=e,this.name=t,this.sourceSpan=n}
  function ja (line 1) | function ja(e,t,n){this.value=e,this.name=t,this.sourceSpan=n}
  function La (line 1) | function La(){}
  function Ba (line 1) | function Ba(){}
  function Ua (line 1) | function Ua(e){return e.id||za(e)}
  function za (line 1) | function za(e){return function(e){var t,n,r=Ur(e),i=function(e,t){for(va...
  function qa (line 1) | function qa(e){return e.id||Ha(e)}
  function Ha (line 1) | function Ha(e){var t=new Xa;return ts(e.nodes.map(function(e){return e.v...
  function Ga (line 1) | function Ga(){}
  function $a (line 1) | function $a(){return null!==Ka&&Ka.apply(this,arguments)||this}
  function Ja (line 1) | function Ja(e,t,n,r){return e<20?[t&n|~t&r,1518500249]:e<40?[t^n^r,18597...
  function es (line 1) | function es(e){var t=Ur(e),n=U([ns(t,0),ns(t,102072)],2),r=n[0],i=n[1];r...
  function ts (line 1) | function ts(e,t){var n;void 0===t&&(t="");var r=U(es(e),2),i=r[0],o=r[1]...
  function ns (line 1) | function ns(e,t){var n,r,i=U([2654435769,2654435769],2),o=i[0],a=i[1],s=...
  function rs (line 1) | function rs(e){var t=U(e,3),n=t[0],r=t[1],i=t[2];return n=as(n=as(n,r),i...
  function is (line 1) | function is(e,t){return os(e,t)[1]}
  function os (line 1) | function os(e,t){var n=(65535&e)+(65535&t),r=(e>>>16)+(t>>>16)+(n>>>16);...
  function as (line 1) | function as(e,t){var n=(65535&e)-(65535&t);return(e>>16)-(t>>16)+(n>>16)...
  function ss (line 1) | function ss(e,t){return e<<t|e>>>32-t}
  function ls (line 1) | function ls(e,t){return t>=e.length?0:255&e.charCodeAt(t)}
  function us (line 1) | function us(e,t,n){var r=0;if(n===Za.Big)for(var i=0;i<4;i++)r+=ls(e,t+i...
  function cs (line 1) | function cs(e){return e.reduce(function(e,t){return e+function(e){for(va...
  function ps (line 1) | function ps(e,t){for(var n="",r=Math.max(e.length,t.length),i=0,o=0;i<r|...
  function ds (line 1) | function ds(e,t){for(var n="",r=t;0!==e;e>>>=1)1&e&&(n=ps(n,r)),r=ps(r,r...
  function fs (line 1) | function fs(){}
  function ys (line 1) | function ys(e,t){var n=ms.call(this)||this;return n.mapName=t,n.internal...
  function gs (line 1) | function gs(){}
  function bs (line 1) | function bs(e){return e.map(function(e){return e.visit(_s)}).join("")}
  function xs (line 1) | function xs(t){var n=this;this.attrs={},Object.keys(t).forEach(function(...
  function Ss (line 1) | function Ss(e,t){this.rootTag=e,this.dtd=t}
  function Os (line 1) | function Os(e,t,n){var r=this;void 0===t&&(t={}),void 0===n&&(n=[]),this...
  function Ds (line 1) | function Ds(e){this.value=Ms(e)}
  function Ps (line 1) | function Ps(e){return void 0===e&&(e=0),Ts.call(this,"\n"+new Array(e+1)...
  function Ms (line 1) | function Ms(e){return As.reduce(function(e,t){return e.replace(t[0],t[1]...
  function Vs (line 1) | function Vs(){return null!==Rs&&Rs.apply(this,arguments)||this}
  function Us (line 1) | function Us(){}
  function zs (line 1) | function zs(e){return qa(e)}
  function Hs (line 1) | function Hs(){}
  function Ws (line 1) | function Ws(e){return e.toUpperCase().replace(/[^A-Z0-9_]/g,"_")}
  function Zs (line 1) | function Zs(e){return e===Gs||e.startsWith(Ys)}
  function Qs (line 1) | function Qs(e){return e instanceof Sa}
  function Xs (line 1) | function Xs(e){return Qs(e)&&1===e.nodes.length&&e.nodes[0]instanceof Ta}
  function $s (line 1) | function $s(e){return e.nodes[0]}
  function Js (line 1) | function Js(e,t){return void 0===t&&(t=0),""+Ks+e+(0<t?":"+t:"")+Ks}
  function el (line 1) | function el(e){var n={};return e.forEach(function(e,t){n[t]=xr(1<e.lengt...
  function tl (line 1) | function tl(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=argument...
  function nl (line 1) | function nl(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var i=t,o=new Map...
  function rl (line 1) | function rl(t,n){void 0===t&&(t={});var r={};return t&&Object.keys(t).le...
  function il (line 1) | function il(e,t){void 0===t&&(t=!0);var n=Ws(e);if(!t)return n;var r,i=n...
  function ol (line 1) | function ol(e){return("MSG_"+e).toUpperCase()}
  function cl (line 1) | function cl(e,t){var n=null;return function(){return n||(e.push(new dn(s...
  function pl (line 1) | function pl(e){if(this)throw new Error("Builder "+this.constructor.name+...
  function dl (line 1) | function dl(e){throw new Error("Invalid state: Visitor "+this.constructo...
  function hl (line 1) | function hl(e){return Array.isArray(e)?gr(e.map(hl)):xr(e,De)}
  function fl (line 1) | function fl(e,t){return 0<Object.getOwnPropertyNames(e).length?function(...
  function ml (line 1) | function ml(e){for(;(t=e[e.length-1])instanceof ht&&null===t.value;)e.po...
  function bl (line 1) | function bl(){this.values=[]}
  function wl (line 1) | function wl(e){var t={};return e instanceof la&&"ng-template"!==e.tagNam...
  function xl (line 1) | function xl(e,t,n){var r=mr(e,null,n);if(0<t.length)for(var i=0;i<t.leng...
  function Cl (line 1) | function Cl(e){var t=e.expressions,n=e.strings;return 1===t.length&&2===...
  function Sl (line 1) | function Sl(r,e){void 0===e&&(e=!1);var i=fr("t"),t=[],n=Dl(r)?i:new Bt(...
  function El (line 1) | function El(e){return Sl({name:e.name,type:e.type,deps:e.deps,typeArgume...
  function Ol (line 1) | function Ol(e,t,n){return e.map(function(e){return function(e,t,n){switc...
  function kl (line 1) | function kl(e){return new Qn(new ct(new Ve("Error"),[xr(e+" has a constr...
  function Dl (line 1) | function Dl(e){return void 0!==e.delegateType}
  function Tl (line 1) | function Tl(e){var t=null,n={name:e.name,type:e.type,typeArgumentCount:e...
  function Il (line 1) | function Il(e){return{statements:[],factory:br([new Rt("t",ke)],[new wn(...
  function Pl (line 1) | function Pl(e,t){if(null!=t){if(!Array.isArray(t))throw new Error("Expec...
  function Ml (line 1) | function Ml(e,t){if(!(null==t||Array.isArray(t)&&2==t.length))throw new ...
  function Nl (line 1) | function Nl(e,t){this.start=e,this.end=t}
  function Bl (line 1) | function Bl(){}
  function zl (line 1) | function zl(e,t,n,r){this.index=e,this.type=t,this.numValue=n,this.strVa...
  function ql (line 1) | function ql(e,t){return new Ul(e,E.TokenType.Character,t,String.fromChar...
  function Hl (line 1) | function Hl(e,t){return new Ul(e,E.TokenType.Operator,0,t)}
  function Yl (line 1) | function Yl(e){this.input=e,this.peek=0,this.index=-1,this.length=e.leng...
  function Kl (line 1) | function Kl(e){return wo<=e&&e<=Do||vo<=e&&e<=_o||e==bo||e==uo}
  function Zl (line 1) | function Zl(e){if(0==e.length)return!1;var t=new Gl(e);if(!Kl(t.peek))re...
  function Ql (line 1) | function Ql(e){return No(e)||Ro(e)||e==bo||e==uo}
  function Xl (line 1) | function Xl(e){return e===co||e===lo||e===Ao}
  function $l (line 1) | function $l(e){switch(e){case So:return ro;case Co:return oo;case Eo:ret...
  function tu (line 1) | function tu(e,t){this.start=e,this.end=t}
  function ru (line 1) | function ru(e,t){this.span=e,this.sourceSpan=t}
  function au (line 1) | function au(e,t,n,r,i){var o=iu.call(this,e,t)||this;return o.prefix=n,o...
  function uu (line 1) | function uu(){return null!==su&&su.apply(this,arguments)||this}
  function du (line 1) | function du(){return null!==cu&&cu.apply(this,arguments)||this}
  function mu (line 1) | function mu(e,t,n){var r=hu.call(this,e,t)||this;return r.expressions=n,r}
  function gu (line 1) | function gu(e,t,n,r,i){var o=vu.call(this,e,t)||this;return o.condition=...
  function wu (line 1) | function wu(e,t,n,r){var i=_u.call(this,e,t)||this;return i.receiver=n,i...
  function Su (line 1) | function Su(e,t,n,r,i){var o=xu.call(this,e,t)||this;return o.receiver=n...
  function ku (line 1) | function ku(e,t,n,r){var i=Eu.call(this,e,t)||this;return i.receiver=n,i...
  function Iu (line 1) | function Iu(e,t,n,r){var i=Du.call(this,e,t)||this;return i.obj=n,i.key=...
  function Mu (line 1) | function Mu(e,t,n,r,i){var o=Pu.call(this,e,t)||this;return o.obj=n,o.ke...
  function ju (line 1) | function ju(e,t,n,r,i){var o=Ru.call(this,e,t)||this;return o.exp=n,o.na...
  function Vu (line 1) | function Vu(e,t,n){var r=Fu.call(this,e,t)||this;return r.value=n,r}
  function zu (line 1) | function zu(e,t,n){var r=Bu.call(this,e,t)||this;return r.expressions=n,r}
  function Wu (line 1) | function Wu(e,t,n,r){var i=qu.call(this,e,t)||this;return i.keys=n,i.val...
  function Ku (line 1) | function Ku(e,t,n,r){var i=Gu.call(this,e,t)||this;return i.strings=n,i....
  function Xu (line 1) | function Xu(e,t,n,r,i){var o=Zu.call(this,e,t)||this;return o.operation=...
  function ec (line 1) | function ec(e,t,n){var r=$u.call(this,e,t)||this;return r.expression=n,r}
  function rc (line 1) | function rc(e,t,n){var r=tc.call(this,e,t)||this;return r.expression=n,r}
  function ac (line 1) | function ac(e,t,n,r,i){var o=ic.call(this,e,t)||this;return o.receiver=n...
  function uc (line 1) | function uc(e,t,n,r,i){var o=sc.call(this,e,t)||this;return o.receiver=n...
  function dc (line 1) | function dc(e,t,n,r){var i=cc.call(this,e,t)||this;return i.target=n,i.a...
  function vc (line 1) | function vc(e,t,n,r,i){var o=hc.call(this,new eu(0,null===t?0:t.length),...
  function _c (line 1) | function _c(){}
  function wc (line 1) | function wc(){}
  function Cc (line 1) | function Cc(){}
  function Ec (line 1) | function Ec(){}
  function Mc (line 1) | function Mc(e){var t=Vr(e.start)+"([\\s\\S]*?)"+Vr(e.end);return new Reg...
  function Nc (line 1) | function Nc(e){this._lexer=e,this.errors=[]}
  function Fc (line 1) | function Fc(e,t,n,r,i,o,a,s){this.input=e,this.location=t,this.absoluteO...
  function Vc (line 1) | function Vc(){this.errors=[]}
  function Uc (line 1) | function Uc(e,t){void 0===t&&(t=-1),this.path=e,this.position=t}
  function qc (line 1) | function qc(e,t,n){this.value=e,this.sourceSpan=t,this.i18n=n}
  function Wc (line 1) | function Wc(e,t,n,r,i,o){this.switchValue=e,this.type=t,this.cases=n,thi...
  function Yc (line 1) | function Yc(e,t,n,r,i){this.value=e,this.expression=t,this.sourceSpan=n,...
  function Zc (line 1) | function Zc(e,t,n,r,i){this.name=e,this.value=t,this.sourceSpan=n,this.v...
  function Xc (line 1) | function Xc(e,t,n,r,i,o,a){void 0===i&&(i=null),void 0===o&&(o=null),thi...
  function Jc (line 1) | function Jc(e,t){this.value=e,this.sourceSpan=t}
  function ep (line 1) | function ep(t,e,n){void 0===n&&(n=null);var r=[],i=t.visit?function(e){r...
  function np (line 1) | function np(){}
  function op (line 1) | function op(){this._placeHolderNameCounts={},this._signatureToName={}}
  function sp (line 1) | function sp(e){var o=new lp(ap,e);return function(e,t,n,r,i){return o.to...
  function up (line 1) | function up(e,t){this._expressionParser=e,this._interpolationConfig=t}
  function pp (line 1) | function pp(e,t){e.i18n=t}
  function hp (line 1) | function hp(e,t,n){void 0===e&&(e=Fl),void 0===t&&(t=!1),void 0===n&&(n=...
  function fp (line 1) | function fp(e,t){return void 0===t&&(t=null),{id:"string"==typeof t?t:e....
  function yp (line 1) | function yp(e,t){var n=e.description||"";return e.meaning&&(n=e.meaning+...
  function gp (line 1) | function gp(e){return e.replace(/^:/,"\\:")}
  function bp (line 1) | function bp(e){void 0===e&&(e=null),this.file=e,this.sourcesContent=new ...
  function wp (line 1) | function wp(e){e=e<0?1+(-e<<1):e<<1;var t="";do{var n=31&e;0<(e>>=5)&&(n...
  function Cp (line 1) | function Cp(e){if(e<0||64<=e)throw new Error("Can only encode value in t...
  function Ip (line 1) | function Ip(e){this._indent=e,this._classes=[],this._preambleLineCount=0...
  function Ap (line 1) | function Ap(e){this._escapeDollarInStrings=e}
  function Mp (line 1) | function Mp(e,n,t){if(void 0===t&&(t=!0),null==e)return null;var r=e.rep...
  function Rp (line 1) | function Rp(e){for(var t="",n=0;n<e;n++)t+="  ";return t}
  function Np (line 1) | function Np(e){return e.replace(/`/g,"\\`")}
  function Lp (line 1) | function Lp(){return jp.call(this,!1)||this}
  function Bp (line 1) | function Bp(){}
  function qp (line 1) | function qp(e){var t=Up.call(this)||this;return t.reflector=e,t._evalArg...
  function Wp (line 1) | function Wp(e){this.context=e}
  function Gp (line 1) | function Gp(t,n){return void 0===n&&(n=!1),_r(Object.keys(t).map(functio...
  function Yp (line 1) | function Yp(e){var t=e.type,n=e.bootstrap,r=e.declarations,i=e.imports,o...
  function Kp (line 1) | function Kp(e){var t=Sl({name:e.name,type:e.type,typeArgumentCount:0,dep...
  function Zp (line 1) | function Zp(e){var t=e.map(function(e){return function(e){return new ze(...
  function Qp (line 1) | function Qp(e,t){var n=gr(e.map(function(e){return e.value}));return t?b...
  function Xp (line 1) | function Xp(e){var t=[];return t.push({key:"name",value:xr(e.pipeName),q...
  function $p (line 1) | function $p(e,t,n){var r=_i(t.type);if(!r)return Nr("Cannot resolve the ...
  function ed (line 1) | function ed(){}
  function nd (line 1) | function nd(e,t,n,r,i,o){e=e||new bd;var a=rd({createLiteralArrayConvert...
  function rd (line 1) | function rd(e,t){return function(e,t){var n=new vd(e);return t.visit(n)}...
  function ud (line 1) | function ud(e,t,n,r,i,o){e=e||new bd;var a=function(e){return fr("currVa...
  function cd (line 1) | function cd(e,t){for(var n=[],r=0;r<e.temporaryCount;r++)n.push(dd(t,r))...
  function pd (line 1) | function pd(e,t){return"tmp_"+e+"_"+t}
  function dd (line 1) | function dd(e,t){return new dn(pd(e,t),sn)}
  function hd (line 1) | function hd(e,t){if(e!==ad.Expression)throw new Error("Expected an expre...
  function fd (line 1) | function fd(e,t){return e===ad.Statement?t.toStmt():t}
  function yd (line 1) | function yd(e){var t=md.call(this)||this;return t._converterFactory=e,t}
  function t (line 1) | function t(e,t){return(n._nodeMap.get(t)||t).visit(e)}
  function n (line 1) | function n(e,t){return t&&(r._nodeMap.get(t)||t).visit(e)}
  function _d (line 1) | function _d(e,t,n,r,i){this._localResolver=e,this._implicitReceiver=t,th...
  function wd (line 1) | function wd(){}
  function Sd (line 1) | function Sd(e,t,n,r){var i=xd.call(this,e,t,null,n)||this;return i.args=...
  function Od (line 1) | function Od(){this.strictStyling=!0}
  function Dd (line 1) | function Dd(e){var i=this;this.placeholders=[],this.index=0,e=e.replace(...
  function sh (line 1) | function sh(e){this._urlResolver=e,this._shadowCss=new Ed}
  function lh (line 1) | function lh(e){var t="styles";return e&&(t+="_"+_i(e.type)),t}
  function dh (line 1) | function dh(e,t,n){var r=uh.call(this,n,e)||this;return r.tokenType=t,r}
  function mh (line 1) | function mh(e){return'Unexpected character "'+(0===e?"EOF":String.fromCh...
  function vh (line 1) | function vh(e){return'Unknown entity "'+e+'" - use the "&#<decimal>;" or...
  function _h (line 1) | function _h(e,t,n){this._getTagDefinition=t,this._currentTokenStart=null...
  function bh (line 1) | function bh(e){return!Mo(e)||0===e}
  function wh (line 1) | function wh(e){return Mo(e)||62===e||47===e||e===co||e===lo||61===e}
  function xh (line 1) | function xh(e){return 59==e||0==e||!function(e){return wo<=e&&e<=Co||vo<...
  function Ch (line 1) | function Ch(e){return 59==e||0==e||!No(e)}
  function Sh (line 1) | function Sh(e){return wo<=e&&e<=Do?e-wo+vo:e}
  function Oh (line 1) | function Oh(e,t){if(e instanceof Oh)this.file=e.file,this.input=e.input,...
  function e (line 1) | function e(){return t.internalState.peek}
  function Th (line 1) | function Th(e,t){var n=this;return e instanceof Th?(n=kh.call(this,e)||t...
  function Mh (line 1) | function Mh(e,t,n){var r=Ih.call(this,t,n)||this;return r.elementName=e,r}
  function jh (line 1) | function jh(e){this.getTagDefinition=e}
  function Lh (line 1) | function Lh(e,t){this.tokens=e,this.getTagDefinition=t,this._index=-1,th...
  function Vh (line 1) | function Vh(e,t){return 0<e.length&&e[e.length-1]===t}
  function zh (line 1) | function zh(){return Bh.call(this,d)||this}
  function Kh (line 1) | function Kh(e){return e.replace(new RegExp("","g")," ")}
  function Qh (line 1) | function Qh(){}
  function Xh (line 1) | function Xh(e){return new Rh(ep(new Zh,e.rootNodes),e.errors)}
  function Jh (line 1) | function Jh(e){var t=new af;return new tf(ep(t,e),t.isExpanded,t.errors)}
  function rf (line 1) | function rf(e,t){return ef.call(this,e,t)||this}
  function sf (line 1) | function sf(){this.isExpanded=!1,this.errors=[]}
  function uf (line 1) | function uf(e,t,n){this.value=e,this.ngContentIndex=t,this.sourceSpan=n}
  function pf (line 1) | function pf(e,t,n){this.value=e,this.ngContentIndex=t,this.sourceSpan=n}
  function hf (line 1) | function hf(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}
  function vf (line 1) | function vf(e,t,n,r,i,o){this.name=e,this.type=t,this.securityContext=n,...
  function gf (line 1) | function gf(e,t,n,r,i,o){this.name=e,this.target=t,this.phase=n,this.han...
  function bf (line 1) | function bf(e,t,n,r){this.name=e,this.value=t,this.originalValue=n,this....
  function xf (line 1) | function xf(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}
  function Sf (line 1) | function Sf(e,t,n,r,i,o,a,s,l,u,c,p,d){this.name=e,this.attrs=t,this.inp...
  function Of (line 1) | function Of(e,t,n,r,i,o,a,s,l,u,c){this.attrs=e,this.outputs=t,this.refe...
  function Df (line 1) | function Df(e,t,n,r){this.directiveName=e,this.templateName=t,this.value...
  function If (line 1) | function If(e,t,n,r,i,o){this.directive=e,this.inputs=t,this.hostPropert...
  function Mf (line 1) | function Mf(e,t,n,r,i,o,a,s){this.token=e,this.multiProvider=t,this.eage...
  function Nf (line 1) | function Nf(e,t,n){this.index=e,this.ngContentIndex=t,this.sourceSpan=n}
  function Ff (line 1) | function Ff(){}
  function Bf (line 1) | function Bf(){return Lf.call(this)||this}
  function Uf (line 1) | function Uf(t,e,n){void 0===n&&(n=null);var r=[],i=t.visit?function(e){r...
  function Hf (line 1) | function Hf(e,t){return zf.call(this,t,e)||this}
  function Yf (line 1) | function Yf(e,t,n,r,i,o,a,s,l){var u=this;this.viewContext=e,this._paren...
  function Zf (line 1) | function Zf(e,t,n,r){var i=this;this.reflector=e,this._transformedProvid...
  function Qf (line 1) | function Qf(e,t){var n=t.useExisting,r=t.useValue,i=t.deps;return{token:...
  function Xf (line 1) | function Xf(e,t){var n=t.eager,r=t.providers;return new Af(e.token,e.mul...
  function $f (line 1) | function $f(e,i,o,a,s,l,u){e.forEach(function(e){var t=l.get(Oi(e.token)...
  function Jf (line 1) | function Jf(n,r){r.meta.selectors.forEach(function(e){var t=n.get(Oi(e))...
  function tm (line 1) | function tm(e){if(null==e||0===e.length||"/"==e[0])return!1;var t=e.matc...
  function am (line 1) | function am(e,t,n,r,i){if(this._exprParser=e,this._interpolationConfig=t...
  function um (line 1) | function um(){var e=null!==sm&&sm.apply(this,arguments)||this;return e.p...
  function cm (line 1) | function cm(e){return"@"==e[0]}
  function pm (line 1) | function pm(i,e,o,a){var s=[];return B.parse(e).forEach(function(e){var ...
  function fm (line 1) | function fm(e){var n=null,r=null,i=null,o=!1,a="";e.attrs.forEach(functi...
  function gm (line 1) | function gm(){return vm=vm||B.parse("*")[0]}
  function wm (line 1) | function wm(e,t,n){return _m.call(this,t,e,n)||this}
  function Sm (line 1) | function Sm(e,t,n,r,i,o,a){this._config=e,this._reflector=t,this._exprPa...
  function Om (line 1) | function Om(e,t,n,r,i,o,a,s){var l=this;this.reflector=e,this.config=t,t...
  function Dm (line 1) | function Dm(){}
  function Im (line 1) | function Im(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}
  function Pm (line 1) | function Pm(e){return e.trim().split(/\s+/g)}
  function Mm (line 1) | function Mm(e,t,n,r){this.isTemplateElement=e,this._ngContentIndexMatche...
  function Rm (line 1) | function Rm(e,t){var n=new B,r=H(e)[1];n.setElement(r);for(var i=0;i<t.l...
  function Fm (line 1) | function Fm(e){return e instanceof zc&&0==e.value.trim().length}
  function Lm (line 1) | function Lm(e){var t=new Map;return e.forEach(function(e){t.get(e.type.r...
  function Vm (line 1) | function Vm(e){return e instanceof mc&&(e=e.ast),e instanceof lu}
  function Bm (line 1) | function Bm(e){var t=e.charCodeAt(0);if(t==e.charCodeAt(e.length-1)&&(39...
  function Um (line 1) | function Um(e){return e.replace(/[a-z][A-Z]/g,function(e){return e.charA...
  function Hm (line 1) | function Hm(e,t){this._elementIndexExpr=e,this._directiveExpr=t,this._ha...
  function Wm (line 1) | function Wm(e,t){e.has(t)||e.set(t,e.size)}
  function Gm (line 1) | function Gm(e){var t=!1,n=e.indexOf("!important");-1!==n&&(e=0<n?e.subst...
  function Ym (line 1) | function Ym(e){switch(Cl(e)){case 1:return Ki.styleProp;case 3:return Ki...
  function Km (line 1) | function Km(){return zm||(zm={},Zm(M.HTML,["iframe|srcdoc","*|innerHTML"...
  function Zm (line 1) | function Zm(e,t){var n,r;try{for(var i=z(t),o=i.next();!o.done;o=i.next(...
  function Qm (line 1) | function Qm(){}
  function tv (line 1) | function tv(){var u=Xm.call(this)||this;return u._schema={},$m.forEach(f...
  function rv (line 1) | function rv(e,t){var n=new iv(t),r=ep(n,e),i=t.errors.concat(n.errors),o...
  function ov (line 1) | function ov(e){this.bindingParser=e,this.errors=[],this.styles=[],this.s...
  function av (line 1) | function av(){}
  function cv (line 1) | function cv(e){return/^data-/i.test(e)?e.substring(5):e}
  function pv (line 1) | function pv(e,t){t.push.apply(t,q(e.map(function(e){return ia.fromParsed...
  function dv (line 1) | function dv(){return{getUniqueId:function(e){void 0===e&&(e=0);var t=e;r...
  function fv (line 1) | function fv(e,t,n,r,i,o){void 0===n&&(n=0),void 0===r&&(r=null),this.ind...
  function mv (line 1) | function mv(e,t,n,r){return Js((r?"/":"")+e+t,n)}
  function vv (line 1) | function vv(e,t,n){var r=t.index,i=t.ctx;return t.isVoid?mv(e,r,i)+mv(e,...
  function yv (line 1) | function yv(t,n){return function(e){return"object"==typeof e&&e.type===s...
  function gv (line 1) | function gv(e){function t(e,t){return vv("#",e,t)}function n(e,t){return...
  function _v (line 1) | function _v(){}
  function wv (line 1) | function wv(e){return e.visit(bv)}
  function Cv (line 1) | function Cv(e,t,n,r){var i=[xr(function(e){return e.nodes.map(function(e...
  function Sv (line 1) | function Sv(){}
  function Ov (line 1) | function Ov(e,t,n){var r=[],i=function(e){var t=[];return e.nodes.forEac...
  function kv (line 1) | function kv(e){this.text=e}
  function Iv (line 1) | function Iv(){return null!==Dv&&Dv.apply(this,arguments)||this}
  function Mv (line 1) | function Mv(e){return Pv.call(this,il(e,!1))||this}
  function Rv (line 1) | function Rv(){}
  function Vv (line 1) | function Vv(e,t){return wr(fr(ul).bitwiseAnd(xr(e),null,!1),t)}
  function Bv (line 1) | function Bv(e,t,n){void 0===t&&(t=null),void 0===n&&(n=null);var r=e.typ...
  function n (line 1) | function n(e){var t=rl(m(m({},i),o),!1);return Kv(null,Ki.i18nPostproces...
  function l (line 1) | function l(e,t){"string"==typeof e?a.has(e)||(s.push.apply(s,q(Xv(e))),v...
  function zv (line 1) | function zv(e,t,n,r,i,o,a,s,l,u,c,p,d,h,f){var m=this;void 0===n&&(n=0),...
  function Wv (line 1) | function Wv(e,t,n,r){var i=qv.call(this)||this;return i.constantPool=e,i...
  function Kv (line 1) | function Kv(e,t,n){return mr(t,null,e).callFn(n,e)}
  function Zv (line 1) | function Zv(e){return mr(Ki.nextContext).callFn(1<e?[xr(e)]:[])}
  function Qv (line 1) | function Qv(e,t,n){var r=e.getLiteralFactory(t),i=r.literalFactory,o=r.l...
  function Xv (line 1) | function Xv(e){var t=U(H(e),2),n=t[0],r=xr(t[1]);return n?[xr(0),xr(n),r...
  function ey (line 1) | function ey(e,t){void 0===e&&(e=0),void 0===t&&(t=null),this.bindingLeve...
  function ty (line 1) | function ty(e){var t=se(e.value)[0];return[xr(5),hl(t)]}
  function ny (line 1) | function ny(e,t,n){void 0===n&&(n={});var r=n.interpolationConfig,i=n.pr...
  function ry (line 1) | function ry(e){return void 0===e&&(e=Fl),new om(new Rc(new Vl),e,new ev,...
  function iy (line 1) | function iy(e,t){switch(e){case M.HTML:return mr(Ki.sanitizeHtml);case M...
  function oy (line 1) | function oy(e){return e instanceof Qo||e instanceof $o||e instanceof va}
  function ay (line 1) | function ay(e){return e.every(oy)}
  function cy (line 1) | function cy(e,t,n){var r=new _l;return r.set("type",e.type),r.set("selec...
  function py (line 1) | function py(e,t){var n=[],r=t.providers,i=t.viewProviders;if(r||i){var o...
  function dy (line 1) | function dy(e,t,n){var r=cy(e,t,n);return py(r,e),{expression:mr(Ki.defi...
  function hy (line 1) | function hy(e,t,n){var r=new _l;if(e.inputs){var i=e.inputs,o=Object.key...
  function fy (line 1) | function fy(e,t,n){var r,i,o=cy(e,t,n);py(o,e);var a=e.selector&&B.parse...
  function my (line 1) | function my(e,t,n,r,i,o,a){var s=_i(t.type);s||Nr("Cannot resolver the n...
  function vy (line 1) | function vy(){throw new Error("unsupported")}
  function yy (line 1) | function yy(e,t){var n=[function(e,t){if(Array.isArray(e.predicate)){var...
  function gy (line 1) | function gy(e,t,n){var r,i,o=[],a=[],s=cl(a,sl);try{for(var l=z(e),u=l.n...
  function _y (line 1) | function _y(t){return yr(_r(Object.keys(t).map(function(e){return{key:e,...
  function by (line 1) | function by(e){return 0<e.length?yr(gr(e.map(function(e){return xr(e)}))...
  function wy (line 1) | function wy(e,t){var n=(e.selector||"").replace(/\n/g,"");return yr(mr(t...
  function xy (line 1) | function xy(e,a,t){var s=[],l=[],u=cl(l,sl);e.forEach(function(e){var t=...
  function Cy (line 1) | function Cy(e,t,p,n,d,r){var i=Object.keys(e.properties).length,o=fr("el...
  function Sy (line 1) | function Sy(e,t){return ud(null,e,t,"b",id.TrySimple,function(){return N...
  function Ey (line 1) | function Ey(e,t,n){var r=e.params(function(e){return n(t,e).currValExpr}...
  function Oy (line 1) | function Oy(e){return{hostAttributes:{},hostListeners:e.listeners,hostPr...
  function Dy (line 1) | function Dy(e){var t,n,r={},i={},o={},a={};try{for(var s=z(Object.keys(e...
  function Ty (line 1) | function Ty(e,t){var n=Oy(e),r=ry();return r.createDirectiveHostEventAst...
  function Py (line 1) | function Py(){}
  function My (line 1) | function My(e){void 0===e&&(e=new Vp),this.jitEvaluator=e,this.R3Resolve...
  function Vy (line 1) | function Vy(e){return m(m({},e),{predicate:Array.isArray(e.predicate)?e....
  function By (line 1) | function By(e){function t(t){i.hasOwnProperty(t)&&i[t].forEach(function(...
  function Uy (line 1) | function Uy(e,t){return e.hasOwnProperty(t)?new We(e[t]):void 0}
  function zy (line 1) | function zy(e){return{token:null===e.token?new ht(null):e.resolved===E.R...
  function qy (line 1) | function qy(e){return null==e?null:e.map(zy)}
  function Hy (line 1) | function Hy(e,t,n){var r=Dy(n||{}),i=Ty(r,t);if(i.length)throw new Error...
  function Wy (line 1) | function Wy(e){return e.reduce(function(e,t){var n=U(t.split(",").map(fu...
  function Gy (line 1) | function Gy(e){(e.ng||(e.ng={})).ɵcompilerFacade=new Ay}
  function Zy (line 1) | function Zy(e,t){return void 0===t&&(t=!1),null===e?t:e}
  function Xy (line 1) | function Xy(e,t,n,r){this._resourceLoader=e,this._urlResolver=t,this._ht...
  function Jy (line 1) | function Jy(){this.ngContentSelectors=[],this.styles=[],this.styleUrls=[...
  function ng (line 1) | function ng(e){this._reflector=e}
  function rg (line 1) | function rg(e){return A.isTypeOf(e)||F.isTypeOf(e)}
  function ig (line 1) | function ig(e,t){for(var n=e.length-1;0<=n;n--)if(t(e[n]))return e[n];re...
  function sg (line 1) | function sg(e,t){return og.call(this,e,t)||this}
  function mg (line 1) | function mg(e,t){this._implicitTags=e,this._implicitAttrs=t}
  function vg (line 1) | function vg(e){if(!e)return{meaning:"",description:"",id:""};var t=e.ind...
  function yg (line 1) | function yg(){this.closedByParent=!1,this.contentType=E.TagContentType.P...
  function _g (line 1) | function _g(e){return gg}
  function xg (line 1) | function xg(){return bg.call(this,_g)||this}
  function Og (line 1) | function Og(){return null!==Cg&&Cg.apply(this,arguments)||this}
  function Dg (line 1) | function Dg(){}
  function Ig (line 1) | function Ig(){this._locale=null}
  function Ag (line 1) | function Ag(){}
  function Ng (line 1) | function Ng(){return null!==Mg&&Mg.apply(this,arguments)||this}
  function Fg (line 1) | function Fg(){}
  function Vg (line 1) | function Vg(){this._locale=null}
  function Ug (line 1) | function Ug(){}
  function Gg (line 1) | function Gg(){return null!==zg&&zg.apply(this,arguments)||this}
  function Kg (line 1) | function Kg(){this._locale=null}
  function Qg (line 1) | function Qg(){}
  function $g (line 1) | function $g(e,t,n,r,i,o){void 0===e&&(e={}),void 0===i&&(i=N.Warning),th...
  function e_ (line 1) | function e_(e,t,n,r,i,o){void 0===e&&(e={}),this._i18nNodesByMsgId=e,thi...
  function n_ (line 1) | function n_(e,t,n,r,i){if(void 0===r&&(r=N.Warning),this._htmlParser=e,t...
  function r_ (line 1) | function r_(e,t,n){return void 0===n&&(n=null),kr(t,new i_(e),n)}
  function o_ (line 1) | function o_(e){this.ctx=e}
  function a_ (line 1) | function a_(e,t){return{key:e,value:t,quoted:!1}}
  function l_ (line 1) | function l_(e,t){this.reflector=e,this.alwaysGenerateDef=t,this.tokenInj...
  function h_ (line 1) | function h_(e,t){void 0===t&&(t=!1);var n=m_(e,t);return n[0]+".ngfactor...
  function f_ (line 1) | function f_(e){return e.replace(c_,".")}
  function m_ (line 1) | function m_(e,t){if(void 0===t&&(t=!1),e.endsWith(".d.ts"))return[e.slic...
  function v_ (line 1) | function v_(e){return".tsx"===e?".ts":e}
  function y_ (line 1) | function y_(e){return e.replace(u_,"")+".ngsummary.json"}
  function g_ (line 1) | function g_(e,t){void 0===t&&(t=!1);var n=m_(f_(e),t);return n[0]+".ngsu...
  function __ (line 1) | function __(e){return e+"NgSummary"}
  function C_ (line 1) | function C_(e){return x_.test(e)}
  function E_ (line 1) | function E_(e,t,n){return e.hasLifecycleHook(n,function(e){switch(e){cas...
  function n (line 1) | function n(){if(!r)throw new Error("Illegal state: Class "+t+" for type ...
  function i (line 1) | function i(e){var t=new Ii({isHost:!1,type:s.type,isComponent:s.isCompon...
  function D_ (line 1) | function D_(e,t,n,r,i,o,a,s,l,u,c,p){this._config=e,this._htmlParser=t,t...
  function T_ (line 1) | function T_(e){return function(e){return e?Array.from(new Set(e)):[]}(fu...
  function I_ (line 1) | function I_(e){return e instanceof pi||e instanceof ie}
  function M_ (line 1) | function M_(){return null!==P_&&P_.apply(this,arguments)||this}
  function R_ (line 1) | function R_(e){return e instanceof pi?e.name+" in "+e.filePath:zr(e)}
  function N_ (line 1) | function N_(e,t){var n=0;t.eager||(n|=4096),t.providerType===E.ProviderA...
  function j_ (line 1) | function j_(t,e,n,r){var i,o;return o=n===E.ProviderAstType.Directive||n...
  function F_ (line 1) | function F_(e,t){return t.identifier?e.importExpr(t.identifier.reference...
  function L_ (line 1) | function L_(e,t){var n=t.isValue?r_(e,t.value):F_(e,t.token),r=0;return ...
  function V_ (line 1) | function V_(e){var t=0;switch(e){case b_.AfterContentChecked:t=2097152;b...
  function B_ (line 1) | function B_(e,t,n,r){var i=r.map(function(e){return t.importExpr(e.compo...
  function H_ (line 1) | function H_(e){this.reflector=e}
  function G_ (line 1) | function G_(e){this._reflector=e}
  function Y_ (line 1) | function Y_(e){var t=new X_,n=Tp.createRoot();return(Array.isArray(e)?e:...
  function Z_ (line 1) | function Z_(){}
  function $_ (line 1) | function $_(e,t){var n=Q_.call(this,!1)||this;return n.referenceFilter=e...
  function eb (line 1) | function eb(e){this._reflector=e}
  function nb (line 1) | function nb(e,t){this.options=e,this.reflector=t}
  function ib (line 1) | function ib(){}
  function sb (line 1) | function sb(e,t,n,r,i,o,a,s,l,u,c){this.options=e,this.reflector=t,this....
  function db (line 1) | function db(e){this._reflector=e}
  function d (line 1) | function d(e,t,n,r){var l=[],i=n.map(function(e){var t=e.sourceSpan,n=e....
  function bb (line 1) | function bb(e,t,n,r,i,o,a){this.reflector=e,this.outputCtx=t,this.parent...
  function wb (line 1) | function wb(e,t){return 10<t.length?mb.callFn([fb,xr(e),xr(1),gr(t)]):mb...
  function xb (line 1) | function xb(e,t,n){return mr(si.unwrapValue).callFn([fb,xr(e),xr(t),n])}
  function Cb (line 1) | function Cb(e,t){return e.isAnimation?{name:"@"+e.name+"."+e.phase,targe...
  function Sb (line 1) | function Sb(e){var t=0;return e.first&&e.static?t|=268435456:t|=53687091...
  function Eb (line 1) | function Eb(e,t){return e?e+":"+t:t}
  function kb (line 1) | function kb(e,t,n,r){void 0===r&&(r=null),this._htmlParser=e,this._impli...
  function Ib (line 1) | function Ib(){return null!==Db&&Db.apply(this,arguments)||this}
  function Ab (line 1) | function Ab(e,t,n){this.srcFileUrl=e,this.genFileUrl=t,"string"==typeof ...
  function Mb (line 1) | function Mb(e,t){var n,r,i,o,a=[];try{for(var s=z(e.transitiveModule.pro...
  function Rb (line 1) | function Rb(e,t){var n,r;if(void 0===t&&(t=[]),"string"==typeof e)t.push...
  function Nb (line 1) | function Nb(e,t,n){var r=U(e.split("#"),2),i=r[0],o=r[1],a=t.resolveExte...
  function p (line 1) | function p(){return t=t||n.host.getOutputName(u.replace(/((\.ts)|(\.d\.t...
  function o (line 1) | function o(){return null!==d&&d.apply(this,arguments)||this}
  function Vb (line 1) | function Vb(e,t,n,r){this.host=e,this.staticSymbolCache=t,this.summaryRe...
  function Bb (line 1) | function Bb(e){return e.startsWith("___")?e.substr(1):e}
  function Ub (line 1) | function Ub(e){return e&&"resolved"===e.__symbolic?e.symbol:e}
  function zb (line 1) | function zb(e,t,n){var r=__(t.name);e.statements.push(br([],[new wn(n)],...
  function Wb (line 1) | function Wb(e,t,n){var r=qb.call(this)||this;return r.symbolResolver=e,r...
  function t (line 1) | function t(){}
  function Yb (line 1) | function Yb(e,t,n){this.outputCtx=e,this.symbolResolver=t,this.summaryRe...
  function Qb (line 1) | function Qb(e,t){var n=Kb.call(this)||this;return n.symbolCache=e,n.summ...
  function Xb (line 1) | function Xb(e){return e&&"call"===e.__symbolic}
  function n (line 1) | function n(e){return a.has(e)||a.set(e,r._createOutputContext(e)),a.get(e)}
  function Jb (line 1) | function Jb(e,t,n,r,i,o,a,s,l,u,c,p,d,h){this._config=e,this._options=t,...
  function ew (line 1) | function ew(e){e.statements.push(mr(si.ComponentFactory).toStmt())}
  function tw (line 1) | function tw(t,e,n,r){e.dependencies.forEach(function(e){e.setValue(t.get...
  function nw (line 1) | function nw(e,t,n){return e+(t?".shim":"")+".ngstyle"+n}
  function rw (line 1) | function rw(e,t,n,r){return lw(function(e,n,r,i){var o=new Set,a=[],s=fu...
  function iw (line 1) | function iw(e,t,n,r){return ow(rw(e,t,n,r))}
  function ow (line 1) | function ow(e){if(e.symbolsMissingModule&&e.symbolsMissingModule.length)...
  function aw (line 1) | function aw(o,a,s,e){var l=[],u=[],c=[],p=[],d=[],t=a.hasDecorators(e),h...
  function sw (line 1) | function sw(e,i,o,t){var a=[],s=[];return i.hasDecorators(t)&&i.getSymbo...
  function lw (line 1) | function lw(e){var n=[],r=new Map,t=new Set;e.forEach(function(e){e.ngMo...
  function uw (line 1) | function uw(e){return ow(lw(e))}
  function pw (line 1) | function pw(e,t){var n,r;if(void 0===t&&(t=0),!e)return"";var i=e.positi...
  function dw (line 1) | function dw(e){var t=jr(pw(e)+".");return t[cw]=!0,t.chain=e,t.position=...
  function yw (line 1) | function yw(e){return e&&"ignore"==e.__symbolic}
  function N (line 1) | function N(e){var t=V.symbolResolver.resolveSymbol(e);return t?t.metadat...
  function j (line 1) | function j(e){return P(A,e,M,0)}
  function F (line 1) | function F(t,e){if(t===A)return P(t,e,M+1,R);try{return P(t,e,M+1,R)}cat...
  function L (line 1) | function L(r){var t,e,n,i;if(Iw(r))return r;if(Array.isArray(r)){var o=[...
  function _w (line 1) | function _w(e,t,n,r,i){var o=this;void 0===n&&(n=[]),void 0===r&&(r=[]),...
  function ww (line 1) | function ww(e,t,n,r,i,o,a){var s=jr(e);return s[bw]=!0,n&&(s.advise=n),r...
  function xw (line 1) | function xw(e){return!!e[bw]}
  function Iw (line 1) | function Iw(e){return null===e||"function"!=typeof e&&"object"!=typeof e}
  function Aw (line 1) | function Aw(){}
  function Nw (line 1) | function Nw(e){var t=Mw.call(this)||this;return t.bindings=e,t}
  function jw (line 1) | function jw(e,t){var n=function(e,t){switch(e){case Cw:if(t&&t.className...
  function Fw (line 1) | function Fw(e,t){if(xw(e)){var n=e.position;return dw(jw({message:"Error...
  function Vw (line 1) | function Vw(e,t){this.host=e,this.staticSymbolCache=t,this.summaryCache=...
  function Bw (line 1) | function Bw(r){return{resolve:function(e,t){var n=r.resourceNameToFileNa...
  function Uw (line 1) | function Uw(){}
  function qw (line 1) | function qw(){this._summaries=new Map}
  function Hw (line 1) | function Hw(e,t,n,r,i){for(var o=r.createChildWihtLocalVars(),a=0;a<e.le...
  function Gw (line 1) | function Gw(e,t,n,r){this.parent=e,this.instance=t,this.className=n,this...
  function Kw (line 1) | function Kw(o,a,s){var e={};o.getters.forEach(function(t){e[t.name]={con...
  function n (line 1) | function n(){return e.lhs.visitExpression(i,t)}
  function r (line 1) | function r(){return e.rhs.visitExpression(i,t)}
  function Qw (line 1) | function Qw(e){this.reflector=e}
  function Xw (line 1) | function Xw(n,r,i,o){return function(){for(var e=[],t=0;t<arguments.leng...
  function tx (line 1) | function tx(e,t,n,r,i,o,a,s,l,u,c){this._metadataResolver=e,this._templa...
  function rx (line 1) | function rx(e,t,n,r,i){this.isHost=e,this.compType=t,this.compMeta=n,thi...
  function ix (line 1) | function ix(e){if(!e.isComponent)throw new Error("Could not compile '"+_...
  function ox (line 1) | function ox(){return{statements:[],genFilePath:"",importExpr:function(e)...
  function ax (line 1) | function ax(){}
  function lx (line 1) | function lx(e){void 0===e&&(e=null),this._packagePrefix=e}
  function dx (line 1) | function dx(e){return e.match(px)}
  function hx (line 1) | function hx(e){var t=e[ux.Path];return t=null==t?"":function(e){if("/"==...
  function mx (line 1) | function mx(e,t,n,r){this.host=e,this.staticSymbolResolver=t,this.messag...
  function yx (line 1) | function yx(e){this.directiveMatcher=e}
  function _x (line 1) | function _x(e){this.parentScope=e,this.namedEntities=new Map,this.childS...
  function t (line 1) | function t(t){var e=a.find(function(e){return e.inputs.hasOwnProperty(t....
  function wx (line 1) | function wx(e,t,n,r){this.matcher=e,this.directives=t,this.bindings=n,th...
  function Sx (line 1) | function Sx(e,t,n,r,i,o,a){var s=xx.call(this)||this;return s.bindings=e...
  function Ox (line 1) | function Ox(e,t,n,r,i,o,a,s){this.target=e,this.directives=t,this.bindin...
  function r (line 1) | function r(e){t.visit&&t.visit(e,n)||e.visit(t,n)}
  function i (line 1) | function i(e){e.forEach(r)}
  function n (line 1) | function n(){return null!==t&&t.apply(this,arguments)||this}
  function o (line 1) | function o(e,t,n,r){var i=Zone.current,o=Zone.AsyncTestZoneSpec;if(void ...
  function t (line 1) | function t(e,t,n){var r=this;this.componentRef=e,this.ngZone=t,this._aut...
  function u (line 1) | function u(){l=null,s&&s.assertPresent().resetDelegate()}
  function d (line 1) | function d(){if(null==l)throw new Error("The code should be running in t...
  function h (line 1) | function h(){d().flushMicrotasks()}
  function v (line 1) | function v(){return m?m.resetFakeAsyncZone():u()}
  function _ (line 1) | function _(e,t){function n(){this.constructor=e}g(e,t),e.prototype=null=...
  function b (line 1) | function b(e,t,n,r){var i,o=arguments.length,a=o<3?t:null===r?r=Object.g...
  function w (line 1) | function w(o,a,s,l){return new(s=s||Promise)(function(e,t){function n(e)...
  function x (line 1) | function x(n,r){var i,o,a,e,s={label:0,sent:function(){if(1&a[0])throw a...
  function C (line 1) | function C(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;re...
  function S (line 1) | funct
Condensed preview — 1647 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,705K chars).
[
  {
    "path": ".editorconfig",
    "chars": 245,
    "preview": "# Editor configuration, see http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = "
  },
  {
    "path": ".firebaserc",
    "chars": 462,
    "preview": "{\n  \"projects\": {\n    \"default\": \"angular-presentation\",\n    \"kirjs\": \"kirjs-kirjs\"\n  },\n  \"targets\": {\n    \"angular-pre"
  },
  {
    "path": ".flooignore",
    "chars": 66,
    "preview": "extern\nnode_modules\ntmp\nvendor\n.idea/workspace.xml\n.idea/misc.xml\n"
  },
  {
    "path": ".gitattributes",
    "chars": 36,
    "preview": "src/assets/monaco linguist-vendored\n"
  },
  {
    "path": ".gitignore",
    "chars": 559,
    "preview": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\n/dist\n/tmp\n/out-tsc\n\n# depe"
  },
  {
    "path": ".nvmrc",
    "chars": 8,
    "preview": "10.17.0\n"
  },
  {
    "path": ".prettierignore",
    "chars": 114,
    "preview": "ng2ts\ndist\ncoverage\nlibs/code-demos/assets/runner/ng2/ng-bundle.js\nlibs/code-demos/assets/runner/ng-dts/files.txt\n"
  },
  {
    "path": ".prettierrc",
    "chars": 26,
    "preview": "{\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": ".travis.yml",
    "chars": 1149,
    "preview": "dist: trusty\nlanguage: node_js\nnode_js:\n  - \"10\"\n\nenv:\n  matrix:\n    - TRIGGER=\"format:check\"\n    - TRIGGER=\"lint\"\n    -"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 115,
    "preview": "{\n  \"recommendations\": [\n    \"nrwl.angular-console\",\n    \"angular.ng-template\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "LICENSE",
    "chars": 11347,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 2306,
    "preview": "[![Join our Slack, #codelab channel](https://img.shields.io/badge/slack-%23codelab-yellowgreen)](https://nycjsorg.now.sh"
  },
  {
    "path": "angular.json",
    "chars": 34013,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"newProjectRoot\": \"\",\n  \"projects"
  },
  {
    "path": "apps/angular-thirty-seconds/browserslist",
    "chars": 388,
    "preview": "# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers\n# For additional inf"
  },
  {
    "path": "apps/angular-thirty-seconds/karma.conf.js",
    "chars": 967,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/app.component.ts",
    "chars": 473,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-root',\n  template: `\n    <div class=\"wrapp"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/app.module.ts",
    "chars": 1763,
    "preview": "import { MatButtonModule } from '@angular/material/button';\nimport { MatTableModule } from '@angular/material/table';\nim"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.html",
    "chars": 6971,
    "preview": "<div *ngIf=\"!isLoading; else loadingTmp\" class=\"container\">\n  <h1>\n    {{ isEditing ? '' : 'New' }} Snippet\n    <button "
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.scss",
    "chars": 1655,
    "preview": ":host {\n  label {\n    color: #3e515b;\n  }\n\n  textarea {\n    width: 100%;\n    height: 280px;\n  }\n\n  mat-form-field {\n    "
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.spec.ts",
    "chars": 1846,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { CreateSnippetComponent } from './cre"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.component.ts",
    "chars": 6176,
    "preview": "import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  OnDestroy,\n  ViewChild\n} from '@an"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/create-snippet.module.ts",
    "chars": 1768,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CreateSnippetComponen"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-info/snippet-info.component.html",
    "chars": 88,
    "preview": "<div class=\"snippets-info\">\n  This form will generate a snippet request for you.\n</div>\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-info/snippet-info.component.scss",
    "chars": 843,
    "preview": ":host {\n  .snippets-info {\n    float: right;\n    top: 40px;\n    max-width: 50%;\n    padding: 35px 35px 15px 35px;\n    ma"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-info/snippet-info.component.ts",
    "chars": 228,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-snippet-info',\n  templateUrl: './snippet-i"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-modal/snippet-overview.component.html",
    "chars": 571,
    "preview": "<h1 mat-dialog-title>\n  Snippet Markdown\n</h1>\n<mat-dialog-content>\n  <markdown [data]=\"snippetWithFormat\"></markdown>\n<"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-modal/snippet-overview.component.scss",
    "chars": 337,
    "preview": ":host {\n  h1 {\n    color: #444;\n  }\n\n  .snippet-modal {\n    &-footer {\n      float: right;\n    }\n  }\n\n  .btn-submit {\n  "
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-modal/snippet-overview.component.ts",
    "chars": 4715,
    "preview": "import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-spinner/snippet-spinner.component.html",
    "chars": 192,
    "preview": "<div class=\"spinner-back-ground\">\n  <div class=\"centered-spinner\">\n    <div class=\"preload\">\n      <div></div>\n      <di"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-spinner/snippet-spinner.component.scss",
    "chars": 1105,
    "preview": ".spinner-back-ground {\n  position: fixed;\n  width: 100%;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  background-colo"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/create-snippet/snippet-spinner/snippet-spinner.component.ts",
    "chars": 240,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-snippet-spinner',\n  templateUrl: './snippe"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/pull-requests-list/pull-requests-list.component.html",
    "chars": 2053,
    "preview": "<div class=\"container\">\n  <div class=\"flex-header\">\n    <h1>Open pull requests</h1>\n    <button\n      mat-raised-button\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/pull-requests-list/pull-requests-list.component.scss",
    "chars": 343,
    "preview": "h1 {\n  color: #444;\n}\n\n.container {\n  max-width: 850px;\n  padding: 0 15px 30px 15px;\n  margin: 0 auto;\n  font-family: He"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/pull-requests-list/pull-requests-list.component.ts",
    "chars": 722,
    "preview": "import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { GitHubService } from '../s"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/angular-sample.ts",
    "chars": 735,
    "preview": "export const angularSampleCode = {\n  'app.component.ts': `import { Component } from '@angular/core';\n\n@Component({\n  sel"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/constants.ts",
    "chars": 498,
    "preview": "export const MARKDOWN_PLACEHOLDER = `\nYou can use markdown here.\\n\nHighlight \\`important terms\\` with backticks.\\n\nFor e"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/consts.ts",
    "chars": 31,
    "preview": "export const SEPARATOR = '\\n';\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/functions/generate-snippet.spec.ts",
    "chars": 999,
    "preview": "import { testSnippetMd, testSnippetParsed } from './test-data/snippet';\nimport { generateSnippet } from './generate-snip"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/functions/generate-snippet.ts",
    "chars": 2376,
    "preview": "import { Snippet } from '../interfaces/snippet';\nimport { angularSampleCode } from '../angular-sample';\nimport { SEPARAT"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/functions/parse-snippet.spec.ts",
    "chars": 1615,
    "preview": "import { parseSnippet } from './parse-snippet';\nimport {\n  testSnippetEdgeCases,\n  testSnippetMd,\n  testSnippetMinimal,\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/functions/parse-snippet.ts",
    "chars": 1981,
    "preview": "import { angularSampleCode } from '../angular-sample';\n\n// @ts-ignore\n// If you delete this you get a run time error.\n//"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/functions/test-data/snippet.ts",
    "chars": 2073,
    "preview": "export const testSnippetMd = `---\ntitle: title\nauthor: author\ntwitter: kirjs\nlevel: intermediate\nlinks:\n- gogel.com\n- 12"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/functions/validation/index.ts",
    "chars": 30,
    "preview": "export * from './validation';\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/functions/validation/validation.ts",
    "chars": 1005,
    "preview": "import { FormArray, FormControl, FormGroup } from '@angular/forms';\nimport { AbstractControl } from '@angular/forms';\n\ne"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/index.ts",
    "chars": 63,
    "preview": "export * from './angular-sample';\nexport * from './constants';\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/branch.interface.ts",
    "chars": 146,
    "preview": "export interface Branch {\n  ref: string;\n  node_id: string;\n  url: string;\n  object: {\n    type: string;\n    sha: string"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/commit-info.interface.ts",
    "chars": 112,
    "preview": "export interface CommitInfo {\n  message: string;\n  content: string;\n  branchName: string;\n  filePath: string;\n}\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/github-auth.interface.ts",
    "chars": 168,
    "preview": "import { User } from './user.interface';\n\nexport interface GithubAuth {\n  additionalUserInfo: {\n    profile: User;\n  };\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/index.ts",
    "chars": 228,
    "preview": "export * from './branch.interface';\nexport * from './github-auth.interface';\nexport * from './repo.interface';\nexport * "
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/pull-request.intreface.ts",
    "chars": 191,
    "preview": "export interface CreatePullRequest {\n  title: string;\n  body: string;\n  branchName: string;\n  labels?: Array<string>;\n}\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/repo.interface.ts",
    "chars": 117,
    "preview": "export interface Repo {\n  name: string;\n  full_name: string;\n  sha: string;\n  url: string;\n  git_refs_url: string;\n}\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/snippet.ts",
    "chars": 43,
    "preview": "export type Snippet = Record<string, any>;\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/interfaces/user.interface.ts",
    "chars": 64,
    "preview": "export interface User {\n  login: string;\n  repos_url: string;\n}\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/services/github.service.ts",
    "chars": 6996,
    "preview": "import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { MatSnackBar } fr"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/services/snippet.service.spec.ts",
    "chars": 1579,
    "preview": "import { TestBed } from '@angular/core/testing';\nimport { SnippetService } from './snippet.service';\nimport { GitHubServ"
  },
  {
    "path": "apps/angular-thirty-seconds/src/app/shared/services/snippet.service.ts",
    "chars": 4592,
    "preview": "import { Injectable } from '@angular/core';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { debounceTime,"
  },
  {
    "path": "apps/angular-thirty-seconds/src/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/angular-thirty-seconds/src/environments/environment.prod.ts",
    "chars": 51,
    "preview": "export const environment = {\n  production: true\n};\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/environments/environment.ts",
    "chars": 662,
    "preview": "// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environm"
  },
  {
    "path": "apps/angular-thirty-seconds/src/index.html",
    "chars": 397,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>AngularThirtySeconds</title>\n    <base"
  },
  {
    "path": "apps/angular-thirty-seconds/src/main.ts",
    "chars": 375,
    "preview": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynami"
  },
  {
    "path": "apps/angular-thirty-seconds/src/polyfills.ts",
    "chars": 2839,
    "preview": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfi"
  },
  {
    "path": "apps/angular-thirty-seconds/src/styles.scss",
    "chars": 105,
    "preview": "@import '~@angular/material/prebuilt-themes/indigo-pink.css';\n\nhtml,\nbody {\n  margin: 0;\n  padding: 0;\n}\n"
  },
  {
    "path": "apps/angular-thirty-seconds/src/test.ts",
    "chars": 642,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/"
  },
  {
    "path": "apps/angular-thirty-seconds/tsconfig.app.json",
    "chars": 186,
    "preview": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../../dist/out-tsc\",\n    \"types\": []\n  },\n  \""
  },
  {
    "path": "apps/angular-thirty-seconds/tsconfig.json",
    "chars": 92,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"types\": [\"jasmine\"]\n  }\n}\n"
  },
  {
    "path": "apps/angular-thirty-seconds/tsconfig.spec.json",
    "chars": 227,
    "preview": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../../dist/out-tsc\",\n    \"types\": [\"jasmine\","
  },
  {
    "path": "apps/angular-thirty-seconds/tslint.json",
    "chars": 195,
    "preview": "{\n  \"extends\": \"../../tslint.json\",\n  \"rules\": {\n    \"directive-selector\": [true, \"attribute\", \"codelab\", \"camelCase\"],\n"
  },
  {
    "path": "apps/blog/browserslist",
    "chars": 388,
    "preview": "# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers\n# For additional inf"
  },
  {
    "path": "apps/blog/jest.config.js",
    "chars": 121,
    "preview": "module.exports = {\n  name: 'blog',\n  preset: '../../jest.config.js',\n  coverageDirectory: '../../coverage/apps/blog/'\n};"
  },
  {
    "path": "apps/blog/src/app/app.component.html",
    "chars": 152,
    "preview": "<div routerLink=\"/\">\n  <h2><span>Angular Codelab Newsletter</span></h2>\n  <img src=\"/assets/images/logo.png\" />\n</div>\n\n"
  },
  {
    "path": "apps/blog/src/app/app.component.scss",
    "chars": 341,
    "preview": "h2 {\n  color: white;\n  text-align: center;\n  height: 70px;\n  background-image: linear-gradient(to right, red, white);\n  "
  },
  {
    "path": "apps/blog/src/app/app.component.spec.ts",
    "chars": 1068,
    "preview": "import { TestBed, async } from '@angular/core/testing';\nimport { AppComponent } from './app.component';\nimport { RouterT"
  },
  {
    "path": "apps/blog/src/app/app.component.ts",
    "chars": 213,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-root',\n  templateUrl: './app.component.htm"
  },
  {
    "path": "apps/blog/src/app/app.module.ts",
    "chars": 2019,
    "preview": "import { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { AngularFireM"
  },
  {
    "path": "apps/blog/src/app/common.ts",
    "chars": 128,
    "preview": "export interface Post {\n  key?: string;\n  title: string;\n  author: string;\n  text: string;\n  date: string;\n  hidden: boo"
  },
  {
    "path": "apps/blog/src/app/feed/feed.component.html",
    "chars": 193,
    "preview": "<a routerLink=\"/form\">Tell us what you have done!</a>\n\n<div *ngFor=\"let post of posts$ | async\">\n  <codelab-single-post "
  },
  {
    "path": "apps/blog/src/app/feed/feed.component.scss",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/blog/src/app/feed/feed.component.spec.ts",
    "chars": 607,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { FeedComponent } from './feed.compone"
  },
  {
    "path": "apps/blog/src/app/feed/feed.component.ts",
    "chars": 796,
    "preview": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { PostService } from '../post.service';\nimpor"
  },
  {
    "path": "apps/blog/src/app/form/form.component.html",
    "chars": 687,
    "preview": "<h3>Tell us what's new</h3>\n<form class=\"container\" [formGroup]=\"myform\" (ngSubmit)=\"onSubmit()\">\n  <input\n    type=\"tex"
  },
  {
    "path": "apps/blog/src/app/form/form.component.scss",
    "chars": 195,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n  width: 40%;\n}\n\ninput,\ntextarea {\n  width: 600px;\n}\n\n.form-cont"
  },
  {
    "path": "apps/blog/src/app/form/form.component.spec.ts",
    "chars": 607,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { FormComponent } from './form.compone"
  },
  {
    "path": "apps/blog/src/app/form/form.component.ts",
    "chars": 1348,
    "preview": "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { HttpClient } from '@angular/common/"
  },
  {
    "path": "apps/blog/src/app/post/post.component.html",
    "chars": 201,
    "preview": "<ng-container *ngIf=\"post$ | async as post\">\n  <codelab-single-post\n    [post]=\"post\"\n    [full]=\"true\"\n    [key]=\"key\"\n"
  },
  {
    "path": "apps/blog/src/app/post/post.component.scss",
    "chars": 51,
    "preview": ".text {\n  overflow: hidden;\n  max-height: 100px;\n}\n"
  },
  {
    "path": "apps/blog/src/app/post/post.component.spec.ts",
    "chars": 607,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { PostComponent } from './post.compone"
  },
  {
    "path": "apps/blog/src/app/post/post.component.ts",
    "chars": 772,
    "preview": "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { "
  },
  {
    "path": "apps/blog/src/app/post.service.ts",
    "chars": 974,
    "preview": "import { Injectable } from '@angular/core';\nimport { AngularFireDatabase, AngularFireList } from '@angular/fire/database"
  },
  {
    "path": "apps/blog/src/app/single-post/single-post.component.html",
    "chars": 652,
    "preview": "<mat-card>\n  <mat-card-content>\n    <p class=\"head\">\n      <span class=\"title\">{{ post.title }}</span>\n      <span class"
  },
  {
    "path": "apps/blog/src/app/single-post/single-post.component.scss",
    "chars": 350,
    "preview": ".date {\n  float: right;\n  margin-right: 5px;\n}\n\n.title {\n  margin-top: 0px;\n  margin-top: 0px;\n  padding-left: 5px;\n}\n\nm"
  },
  {
    "path": "apps/blog/src/app/single-post/single-post.component.ts",
    "chars": 1115,
    "preview": "import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { AccessService } from '../../../../co"
  },
  {
    "path": "apps/blog/src/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/blog/src/assets/fonts/droid-sans/Apache License.txt",
    "chars": 11323,
    "preview": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licens"
  },
  {
    "path": "apps/blog/src/environments/environment.prod.ts",
    "chars": 51,
    "preview": "export const environment = {\n  production: true\n};\n"
  },
  {
    "path": "apps/blog/src/environments/environment.ts",
    "chars": 662,
    "preview": "// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environm"
  },
  {
    "path": "apps/blog/src/index.html",
    "chars": 327,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Blog</title>\n    <base href=\"/\" />\n\n  "
  },
  {
    "path": "apps/blog/src/main.ts",
    "chars": 375,
    "preview": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynami"
  },
  {
    "path": "apps/blog/src/polyfills.ts",
    "chars": 2839,
    "preview": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfi"
  },
  {
    "path": "apps/blog/src/styles.scss",
    "chars": 445,
    "preview": "/* You can add global styles to this file, and also import other style files */\n@import '~@angular/material/prebuilt-the"
  },
  {
    "path": "apps/blog/src/test-setup.ts",
    "chars": 30,
    "preview": "import 'jest-preset-angular';\n"
  },
  {
    "path": "apps/blog/tsconfig.app.json",
    "chars": 167,
    "preview": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../dist/out-tsc\",\n    \"types\": []\n  },\n  \"exc"
  },
  {
    "path": "apps/blog/tsconfig.json",
    "chars": 180,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"types\": [\"node\", \"jest\"]\n  },\n  \"include\": [\"**/*.ts\"]"
  },
  {
    "path": "apps/blog/tsconfig.spec.json",
    "chars": 207,
    "preview": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../dist/out-tsc\",\n    \"types\": [\"jest\", \"node"
  },
  {
    "path": "apps/blog/tslint.json",
    "chars": 195,
    "preview": "{\n  \"extends\": \"../../tslint.json\",\n  \"rules\": {\n    \"directive-selector\": [true, \"attribute\", \"codelab\", \"camelCase\"],\n"
  },
  {
    "path": "apps/codelab/browserslist",
    "chars": 430,
    "preview": "# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.\n# For addit"
  },
  {
    "path": "apps/codelab/extra-webpack.config.js",
    "chars": 789,
    "preview": "const webpack = require('webpack');\nconst MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');\n\nconst findLoad"
  },
  {
    "path": "apps/codelab/karma.conf.js",
    "chars": 967,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "apps/codelab/src/app/admin/admin-routing.module.ts",
    "chars": 593,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { AdminComponent } from"
  },
  {
    "path": "apps/codelab/src/app/admin/admin.component.css",
    "chars": 101,
    "preview": ":host {\n  display: block;\n  max-width: 1000px;\n  margin: 0 auto;\n}\n\n.wrapper {\n  margin-top: 20px;\n}\n"
  },
  {
    "path": "apps/codelab/src/app/admin/admin.component.html",
    "chars": 372,
    "preview": "<mat-card>\n  <h2>Angular Codelab 🔥 Admin</h2>\n\n  <nav mat-tab-nav-bar>\n    <a\n      *ngFor=\"let link of links\"\n      mat"
  },
  {
    "path": "apps/codelab/src/app/admin/admin.component.spec.ts",
    "chars": 876,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { AdminComponent } from './admin.compo"
  },
  {
    "path": "apps/codelab/src/app/admin/admin.component.ts",
    "chars": 308,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-admin',\n  templateUrl: './admin.component."
  },
  {
    "path": "apps/codelab/src/app/admin/admin.module.ts",
    "chars": 639,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCardModule } from "
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback-message-table/feedback-message-table.component.ts",
    "chars": 1760,
    "preview": "import {\n  Component,\n  Input,\n  ViewChild,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy\n} from '@angular/core';\n"
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback-message-table/feedback-message-table.css",
    "chars": 417,
    "preview": ".done-row {\n  background: #fcfcfc;\n  color: #666;\n}\n\n.mat-column-comment {\n  width: 55%;\n  padding-right: 5px;\n}\n\n.mat-c"
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback-message-table/feedback-message-table.html",
    "chars": 1551,
    "preview": "<table mat-table [dataSource]=\"dataSource\" matSort class=\"mat-elevation-z4\">\n  <ng-container matColumnDef=\"comment\">\n   "
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback.component.css",
    "chars": 110,
    "preview": ".panel {\n  margin-bottom: 10px;\n}\n\nmat-form-field {\n  margin-left: 15px;\n  margin-top: 5px;\n  width: 120px;\n}\n"
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback.component.html",
    "chars": 2044,
    "preview": "<div no-padding>\n  <div>\n    <mat-form-field>\n      <mat-label>Feedback</mat-label>\n      <mat-select\n        [value]=\"f"
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback.component.spec.ts",
    "chars": 1043,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\nimport { FeedbackComponent } from './feedback."
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback.component.ts",
    "chars": 3193,
    "preview": "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { AngularFireDatabase, AngularFireLis"
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/feedback.module.ts",
    "chars": 2057,
    "preview": "import { AngularFireDatabaseModule } from '@angular/fire/database';\nimport { AngularFireAuthModule } from '@angular/fire"
  },
  {
    "path": "apps/codelab/src/app/admin/feedback/github.service.ts",
    "chars": 785,
    "preview": "import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable({\n  provided"
  },
  {
    "path": "apps/codelab/src/app/admin/users/users.component.css",
    "chars": 25,
    "preview": "table {\n  width: 100%;\n}\n"
  },
  {
    "path": "apps/codelab/src/app/admin/users/users.component.html",
    "chars": 593,
    "preview": "<table mat-table [dataSource]=\"admins$ | async\" class=\"mat-elevation-z8\">\n  <ng-container matColumnDef=\"key\">\n    <th ma"
  },
  {
    "path": "apps/codelab/src/app/admin/users/users.component.spec.ts",
    "chars": 1041,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { UsersComponent } from './users.compo"
  },
  {
    "path": "apps/codelab/src/app/admin/users/users.component.ts",
    "chars": 1413,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { LoginService } from '@codelab/firebase-login';\nimport { Sync"
  },
  {
    "path": "apps/codelab/src/app/admin/users/users.module.ts",
    "chars": 428,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UsersComponent } from"
  },
  {
    "path": "apps/codelab/src/app/app-routing.module.ts",
    "chars": 1036,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { LoginComponen"
  },
  {
    "path": "apps/codelab/src/app/app.component.ts",
    "chars": 163,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-root',\n  template: '<router-outlet></route"
  },
  {
    "path": "apps/codelab/src/app/app.module.ts",
    "chars": 1580,
    "preview": "import { APP_INITIALIZER, NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nim"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/about.component.html",
    "chars": 10189,
    "preview": "<slide-deck slideShortcuts slidesRouting slides-tracking>\n  <div *slide cover>\n    codelab.fun\n  </div>\n\n  <!--  TODO(an"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/about.component.scss",
    "chars": 1656,
    "preview": ".screenshot {\n  /*background: url(\"images/sss\");*/\n}\n\n[cover] ::ng-deep {\n  line-height: 100vh;\n  text-align: center;\n  "
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/about.component.spec.ts",
    "chars": 614,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { AboutComponent } from './about.compo"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/about.component.ts",
    "chars": 1087,
    "preview": "import { Component, OnInit } from '@angular/core';\n\ndeclare const require;\n\n@Component({\n  selector: 'about',\n  template"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/about.module.ts",
    "chars": 578,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/samples/fake-types.d.ts.not-really",
    "chars": 2630,
    "preview": "interface RouteConfig {\n  path: string;\n  component: any;\n}\n\ndeclare module '@angular/core' {\n  export class EventEmitte"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/samples/slides/ng-template.html",
    "chars": 212,
    "preview": "<slide-deck>\n  <ng-template>\n    <h2>Awesome slide</h2>\n  </ng-template>\n  <ng-template>\n    <h2>Code sample</h2>\n  </ng"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/samples/slides/slide-component.html",
    "chars": 176,
    "preview": "<slide-deck>\n  <slide>\n    <h2>Awesome slide</h2>\n  </slide>\n  <slide>\n    <h2>Code sample</h2>\n  </slide>\n  <slide>\n   "
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/samples/slides/structural-directive.html",
    "chars": 185,
    "preview": "<slide-deck>\n  <div *slide>\n    <h2>Awesome slide</h2>\n  </div>\n  <div *slide>\n    <h2>Code sample</h2>\n  </div>\n  <div "
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/samples/storing-code/backticks.html",
    "chars": 332,
    "preview": "<div *slide id=\"angular-component\">\n  <code-editor>\n    {{` import { Component } from '@angular/core'; @Component({ sele"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/samples/storing-code/interpolations.ts",
    "chars": 542,
    "preview": "import { Component, NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport {"
  },
  {
    "path": "apps/codelab/src/app/codelabs/about/samples/storing-code/plain.html",
    "chars": 324,
    "preview": "<div *slide id=\"angular-component\">\n  <code-editor>\n    import { Component } from '@angular/core'; @Component({ selector"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/angular-cli/angular-cli.component.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/angular-cli/angular-cli.component.html",
    "chars": 7077,
    "preview": "<slide-deck slideShortcuts slidesRouting slides-tracking>\n  <codelab-progress-bar></codelab-progress-bar>\n  <slide-arrow"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/angular-cli/angular-cli.component.ts",
    "chars": 289,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-slides-angular-cli',\n  templateUrl: './ang"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/angular-cli/angular-cli.module.ts",
    "chars": 1028,
    "preview": "import { AngularCliComponent } from './angular-cli.component';\nimport { NgModule } from '@angular/core';\nimport { Router"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/angular-routing.module.ts",
    "chars": 5736,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { AngularRoutesComponen"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/angular.module.ts",
    "chars": 403,
    "preview": "import { NgModule } from '@angular/core';\nimport { AngularRoutingModule } from './angular-routing.module';\nimport { Full"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/component-tree.component.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/component-tree.component.html",
    "chars": 9480,
    "preview": "<div #translations style=\"display: none\">\n  <div\n    i18n=\"@@addComponentDecoratorAndSetSelectorToMyVideo\"\n    id=\"addCo"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/component-tree.component.ts",
    "chars": 3209,
    "preview": "import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport {\n  ExerciseConfigTemplate,\n  Ng2TsExercises"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/component-tree.module.ts",
    "chars": 1103,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { FormsModule } from '@"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/components-hierarchy-svg/components-hierarchy-svg.component.html",
    "chars": 9952,
    "preview": "<svg width=\"90vw\" height=\"60vh\" viewBox=\"0 0 780 540\">\n  <style>\n    /* TODO: Use proper fonts */\n    .parent {\n      fo"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/components-hierarchy-svg/components-hierarchy-svg.component.spec.ts",
    "chars": 735,
    "preview": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { ComponentsHierarchySvgComponent } fr"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/components-hierarchy-svg/components-hierarchy-svg.component.ts",
    "chars": 291,
    "preview": "import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n  selector: 'codelab-components-hierar"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/components-hierarchy-svg/index.ts",
    "chars": 54,
    "preview": "export * from './components-hierarchy-svg.component';\n"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/samples/module/app.module.ts",
    "chars": 350,
    "preview": "import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BoxCompone"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/samples/module/box.component.ts",
    "chars": 249,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'my-app',\n  template: `\n    <div>\n      <slides-cir"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/samples/module/circle.component.ts",
    "chars": 295,
    "preview": "import { Component, Input } from '@angular/core';\n\n@Component({\n  selector: 'slides-circle',\n  template:\n    '<div class"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/component-tree/samples/module/index.html",
    "chars": 147,
    "preview": "<!DOCTYPE >\n<head>\n  <style>\n    .circle {\n      border-radius: 50%;\n    }\n  </style>\n</head>\n<body>\n  <my-app>\n    Load"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/create-first-app.component.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/create-first-app.component.html",
    "chars": 16798,
    "preview": "<div #translations style=\"display: none\">\n  <div i18n=\"@@componentIsDecorator\" id=\"componentIsDecorator\">\n    @Component"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/create-first-app.component.ts",
    "chars": 5174,
    "preview": "import { Component, OnInit, ViewChild } from '@angular/core';\n\nimport { ng2tsConfig } from '../../../../../../../ng2ts/n"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/create-first-app.module.ts",
    "chars": 1057,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { FeedbackModule } from"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/mode/mode.component.css",
    "chars": 593,
    "preview": ".mode {\n  background-size: cover;\n  cursor: pointer;\n  background-repeat: no-repeat;\n  width: 60px;\n  height: 40px;\n  pa"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/mode/mode.component.html",
    "chars": 2087,
    "preview": "<div *ngIf=\"mode === 'web'\">\n  <h2 i18n>\n    Because we're building a browser web app, we need to pass\n    <b>BrowserMod"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/mode/mode.component.spec.ts",
    "chars": 729,
    "preview": "import { ComponentFixture, TestBed } from '@angular/core/testing';\nimport { NO_ERRORS_SCHEMA } from '@angular/core';\nimp"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/mode/mode.component.ts",
    "chars": 1180,
    "preview": "import { Component, OnInit } from '@angular/core';\n\n@Component({\n  selector: 'codelab-slides-ng-module-mode',\n  template"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/samples/app-component/app.component.ts",
    "chars": 243,
    "preview": "import { Component } from '@angular/core';\n\n@Component({\n  selector: 'hello-world',\n  template: `\n    <h1>Hello I'm an A"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/samples/app-component/app.module.ts",
    "chars": 279,
    "preview": "import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { AppCompone"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/samples/app-component/bootstrap.ts",
    "chars": 172,
    "preview": "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\nimport { AppModule } from './app.module';\n\np"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/samples/app-component/index.html",
    "chars": 201,
    "preview": "<!DOCTYPE >\n<body>\n  <hello-world>\n    Loading...\n  </hello-world>\n\n  <!--this is main.ts compiled.\n  Often build system"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/samples/index-html/bootstrap.ts",
    "chars": 621,
    "preview": "import { Component, NgModule } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-d"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/create-first-app/samples/index-html/index.html",
    "chars": 201,
    "preview": "<!DOCTYPE >\n<body>\n  <hello-world>\n    Loading...\n  </hello-world>\n\n  <!--this is main.ts compiled.\n  Often build system"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/custom-events/custom-events.component.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/custom-events/custom-events.component.html",
    "chars": 2284,
    "preview": "<slide-deck slideShortcuts slidesRouting slides-tracking>\n  <codelab-progress-bar></codelab-progress-bar>\n  <slide-arrow"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/custom-events/custom-events.component.ts",
    "chars": 1845,
    "preview": "import { Component } from '@angular/core';\nimport { ng2tsConfig } from '../../../../../../../ng2ts/ng2ts';\n\n@Component({"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/custom-events/custom-events.module.ts",
    "chars": 954,
    "preview": "import { CustomEventsComponent } from './custom-events.component';\nimport { NgModule } from '@angular/core';\nimport { Ro"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/dependency-injection/dependency-injection.component.css",
    "chars": 465,
    "preview": ".content-container {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  margin-top: 20px;\n}\n\n.center-preview {\n  m"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/dependency-injection/dependency-injection.component.html",
    "chars": 10725,
    "preview": "<div #translations style=\"display: none\">\n  <div\n    i18n=\"@@shorthandMakesProfessionAvailable\"\n    id=\"shorthandMakesPr"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/dependency-injection/dependency-injection.component.ts",
    "chars": 3360,
    "preview": "import { Component, OnInit, ViewChild } from '@angular/core';\nimport { Ng2TsExercises } from '../../../../../../../ng2ts"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/dependency-injection/dependency-injection.module.ts",
    "chars": 1028,
    "preview": "import { NgModule } from '@angular/core';\nimport { DependencyInjectionComponent } from './dependency-injection.component"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/forms.component.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/forms.component.html",
    "chars": 7954,
    "preview": "<div #translations style=\"display: none\">\n  ¬\n  <div i18n=\"AddFormsModule\" id=\"AddFormsModule\">\n    app.module.ts: Add F"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/forms.component.ts",
    "chars": 3733,
    "preview": "import { CodelabFile } from '../../../shared/helpers/codelabFile';\nimport { AfterViewInit, Component, ViewChild } from '"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/forms.module.ts",
    "chars": 938,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.1.html",
    "chars": 125,
    "preview": "<div class=\"field\">\n  *name:\n  <input name=\"username\" />\n</div>\n<div class=\"field\">\n  email:\n  <input name=\"email\" />\n</"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.2.html",
    "chars": 248,
    "preview": "<div class=\"field\">\n  *name:\n  <input [(ngModel)]=\"username\" name=\"username\" />\n</div>\n<div class=\"field\">\n  email:\n  <i"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.3.html",
    "chars": 257,
    "preview": "<div class=\"field\">\n  *name:\n  <input required [(ngModel)]=\"username\" name=\"username\" />\n</div>\n<div class=\"field\">\n  em"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.4.html",
    "chars": 339,
    "preview": "<div class=\"field\">\n  *name:\n  <input #usernameModel=\"ngModel\" [(ngModel)]=\"username\" required />\n  <div *ngIf=\"username"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.5.html",
    "chars": 398,
    "preview": "<div class=\"field\">\n  *name:\n  <input required #usernameModel=\"ngModel\" [(ngModel)]=\"username\" />\n  <div\n    *ngIf=\"user"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.6.html",
    "chars": 410,
    "preview": "<p>\n  <mat-form-field>\n    <input\n      matInput\n      value=\"Pirojok\"\n      placeholder=\"name\"\n      [(ngModel)]=\"usern"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.component.5.ts",
    "chars": 210,
    "preview": "import { Component } from '@angular/core';\n\n/* tslint:disable */\n@Component({\n  selector: 'my-app',\n  templateUrl: './ap"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.component.ts",
    "chars": 215,
    "preview": "import { Component } from '@angular/core';\n\n/* tslint:disable */\n@Component({\n  selector: 'my-app',\n  templateUrl: 'app."
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.module.6.ts",
    "chars": 513,
    "preview": "import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { AppCompone"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/app.module.ts",
    "chars": 338,
    "preview": "import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { AppCompone"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/code.ts",
    "chars": 39,
    "preview": "// I'm ignored\nexport const hi = 'hi';\n"
  },
  {
    "path": "apps/codelab/src/app/codelabs/angular/forms/samples/basic/main.ts",
    "chars": 747,
    "preview": "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\nimport { AppModule } from './app.module';\nim"
  }
]

// ... and 1447 more files (download for full content)

About this extraction

This page contains the full source code of the codelab-fun/codelab GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1647 files (6.9 MB), approximately 1.9M tokens, and a symbol index with 5049 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!