Compare commits

...

110 Commits

Author SHA1 Message Date
Igor Minar da984ad187 chore(release): cut the 1.0.2 debilitating-awesomeness release 2012-09-04 11:08:40 -07:00
Igor Minar 4015357ce5 chore(docs): don't rewrite colons in doc filenames 2012-09-04 11:08:40 -07:00
Igor Minar dc3d11ad19 chore(Rakefile): zip only the build dir 2012-09-04 11:08:40 -07:00
Igor Minar 0e1545eb04 revert: fix(ng-repeat) to work with primitive types
this commit was accidentaly merged. it needs more work and we don't
have CLA signature

This reverts commit 98d489712e.
2012-08-31 13:44:36 -07:00
Igor Minar ec7cabf5c9 docs(changelog): release notes for 1.0.2 and 1.1.0 releases 2012-08-31 13:23:23 -07:00
Jonathan Zacsh 3051beba2f fix(docs): Making sure gen_docs.sh looks for a globally installed copy of jasmine-node as well as local. 2012-08-30 22:38:54 -07:00
Fernando Correia 92304323b1 docs(tutorial): correct typos and clarify a few sections 2012-08-30 22:38:54 -07:00
Brice Burgess c28123a872 fix(docs): indicate support for passing a string as the controller property on $routeProvider's route object 2012-08-30 22:38:53 -07:00
brettcannon d798423813 doc(misc) Mention how attribute names map to directive names. 2012-08-30 22:38:52 -07:00
Sahat Yalkabov 2583e77cc7 doc(module) changed simpleApp to myApp in the Module page guide for consistency 2012-08-30 21:34:43 -07:00
Steve Nicolai f66836fee4 doc(devguide) - Fix typos and small grammatical errors in the developer guide. 2012-08-30 21:34:42 -07:00
Uri Goldshtein 0ccc445d53 Loading from Google CDN
As you guys had mansion, we can and need to do it through Google CDN for better performance,
so i've updated it accordingly
2012-08-30 21:34:42 -07:00
Tyson Benson b7d5fa1cbe docs(typos): fix typos in dev guide 2012-08-30 21:34:42 -07:00
German Galvis 8bb3942453 fix(scenario): Adding meta tag to avoid cache issues 2012-08-30 21:34:42 -07:00
phil 51a79cebcb docs(api): fix typo on home page
Refference -> Reference
2012-08-30 21:34:41 -07:00
csugden 36bcf64008 Update docs/content/guide/overview.ngdoc
Corrects video information
2012-08-30 21:34:41 -07:00
Jamie Krug 5c6630605b fix(docs): Fix typos and improve grammar. 2012-08-30 21:34:41 -07:00
Jamie Krug 125827406c fix(docs): Fix bad links. 2012-08-30 21:34:41 -07:00
Colin Frei 62c21422a6 docs(module) fix typo 2012-08-30 21:34:41 -07:00
Zhenbo Zhang 98d489712e fix(ng-repeat) to work with primitive types 2012-08-30 21:34:41 -07:00
Igor Minar 2cab2d8ef1 test(locationSpec): fix broken tests after vojta's commit 2012-08-30 16:54:07 -07:00
Vojta Jina 8fa2bb72bc fix(mocks): free up memory after every spec 2012-08-30 16:53:52 -07:00
Igor Minar d151f94937 chore(docs): ask GAE to serve docs-keywords.js 2012-08-30 15:59:29 -07:00
Igor Minar 5b74b7185b test(bootstrap): test exception siling during bootstrap
Closes #1018
2012-08-30 15:18:11 -07:00
Igor Minar 4f0be2ae4e test(ngApp): add missing test for [ng-app] bootstrap 2012-08-30 15:18:02 -07:00
Igor Minar bb9badeb2a fix(jqLite): better support for xhtml
it turns out that some stuff doesn't work in xhtml as it does in html.

for example   can't be innerHTML-ed and auto-closing of elements
doesn't work.

the reporter of the referenced issue claimed that innerHTML vs text on
script made a difference but that doesn't appear to be true in my testing.

I'm not including test for this because testacular doesn't currently
run tests in xhtml yet.

Closes #1301
2012-08-30 10:52:36 -07:00
Igor Minar c287c8361d chore(docs): correctly link docs images 2012-08-30 08:59:17 -07:00
Igor Minar ade7127c79 chore(Rakefile): fix the default task 2012-08-30 08:58:51 -07:00
Igor Minar d341483f1f chore(Rakefile): remove bogus symlink from build 2012-08-30 08:58:39 -07:00
Igor Minar b36acbc857 chore(docs): use symlinks to build docs
so that we can just edit source files without rebuilding docs.

this works for all docs files, except for those that are generated
or rewritten during build.
2012-08-28 16:08:03 -07:00
Igor Minar a4fea38b94 chore(Rakefile): various build script changes
- restructure rake tasks

  this splits up the concatination and minification into two
  tasks so that we can just build angular.js quickly without wasting
  time with minification which is often not needed when just debugging
  some issue on 3rd party site.

- use symlinks when creating final zip file

- switch from btar to zip

- get rid of version numbers from filenames

- rewrite version numbers in all index files

Closes #1226
2012-08-28 16:07:47 -07:00
Misko Hevery 300c5c0c99 doc($log): correct non-working example 2012-08-27 21:20:51 -07:00
Misko Hevery 152537c4e9 doc(guide): add concepts 2012-08-27 21:20:51 -07:00
Misko Hevery 8b46bf6bc9 fix(ngdoc): failing test 2012-08-27 21:20:50 -07:00
Colin Frei aef861eb41 doc(directive) correct typos 2012-08-27 21:20:50 -07:00
Misko Hevery f61d36861d fix(docs) typo 2012-08-27 21:20:50 -07:00
Misko Hevery 2af0348cea fix(ng-list): remove data bound flicker 2012-08-27 21:20:50 -07:00
Misko Hevery 78c5743494 doc(misc) updated getting started to reflect the new homepage 2012-08-27 21:20:49 -07:00
Misko Hevery 2cb9fbd043 doc(guide) simplify the guide home page 2012-08-27 21:20:49 -07:00
Igor Minar e9dad5dbf4 chore(Rakefile): rewrite version numbers in all index files 2012-08-27 12:25:40 -07:00
Igor Minar 54895fc2a1 chore(docs): support _escaped_fragment_ hack for crawler 2012-08-25 02:31:20 -07:00
Igor Minar 60a12b4161 chore(docs): use GAE and Google CDN for docs
Short summary: if you use local node server everything should work as before,
if you use GAE, everything should work now as well, but we pull assets from CDN.

- GAE doesn't support ':' in filenames, so I had to replace it with '_'
  but only in the filename, all servers were reconfigured to rewrite the
  urls from : to _ when doing file lookup
- We now pull angular assets from google CDN when deployed on GAE (locally
  or in production). When running on a non GAE server we pull assets from
  ../ directory as before
- Since only certain versions of Angular are available on CDN and we want
  to be able to autodeploy docs, I had to pin down the Angular files
  to a "stable" version when running on GAE
2012-08-24 15:00:36 -07:00
Igor Minar cd7e58ba41 docs(a): expose hidden docs
It seems that docs for these directive were previously hidden by accident
2012-08-24 14:59:52 -07:00
johnlindquist 9391475dc3 docs(ngRoute): fix typo
aftre -> after
2012-08-24 14:59:43 -07:00
phil 7840803add docs(tutorial): fix typo in step_00
Just removed an extra comma. No big deal.
2012-08-24 14:59:21 -07:00
Igor Minar 7d77de2834 fix($compile): denormalize directive templates
Since developers are allowed to customize start/end interpolation
strings, but third-party directive creators don't know about these
customizations, we should standardize on {{ }} in templates of
reusable (third-party) directives. During the compilation, these
templates are then denormalized to use whatever the custom
start/end symbol is, effectively translating the template into the
syntax of the runtime environment.

This addresses an issue raised at http://goo.gl/e8VPV

Existing code should not be affected by this change since project
that do use custom interpolation markers are not expected to use
{{ }} in existing directive templates.
2012-08-13 14:35:32 -07:00
Igor Minar ab044cada6 refactor($compile): code cleanup 2012-08-13 12:36:42 -07:00
Brian Ford d010e0cc7d fix(ngPluralize): fixes ng-pluralize when using non-standard start/end symbols
Closes #1134
2012-08-13 12:36:33 -07:00
Igor Minar 40f728b1aa style(ngPluralizeSpec): fix indentation 2012-08-13 12:36:22 -07:00
Igor Minar 23abb26405 feat($interpolate): expose start/end symbols in run phase
previously the startSymbol() and endSymbol() getters were exposed only via provider
in the config phase
2012-08-13 12:36:14 -07:00
Igor Minar fd55bc8e1d docs($interpolateProvider): fixing docs 2012-08-13 09:51:57 -07:00
Igor Minar 541aaa4e08 fix($interpolate): $interpolateProvider.endSymbol() returns startSymbol
I also added missing tests.
2012-08-13 09:51:45 -07:00
Igor Minar f22c422547 docs($interpolate): fix typo in description 2012-08-13 09:51:35 -07:00
Vojta Jina 0e461f0c07 docs($compileProvider): remove duplicate of .directive() 2012-08-12 11:04:32 -07:00
Vojta Jina 5074448443 docs: fix broken links to $compileProvider.directive() 2012-08-12 11:04:20 -07:00
Brian Ford 8d66af11e6 fix(docs): fixed documentation for using linky 2012-08-10 16:38:01 -07:00
Brian Ford 169948bb47 chore(ngDoc): add support for custom @usage metadata 2012-08-10 16:37:54 -07:00
Brian Ford 58d9469574 fix(docs): added note about using JSON3 as a polyfill for IE7 2012-08-10 16:37:42 -07:00
Brian Ford 8d858a2360 fix(docs): added note about needing JSON shim for IE7 and earlier 2012-08-10 16:36:56 -07:00
Igor Minar 5540748890 fix(option): support option elements in datalist
previously we expected to find option elements only within select element and if
that was not the case we throw an error. This made it impossible to include datalist
element with nested option elements in the template.

Closes #1165
2012-08-10 16:14:49 -07:00
unirgy f8a52be817 docs($rootScope): fix $on listener signature doc
Added args in $on() listener syntax declaration
2012-08-10 14:52:57 -07:00
Igor Minar 3b5f1105f6 test(jqLite): add missing test for $destroy event 2012-08-10 14:21:11 -07:00
Igor Minar 663ccc5449 fix(form): prevent page reload when form destroyed
this fix ensures that we prevent the default action on form submission
(full page reload) even in cases when the form is being destroyed as
a result of the submit event handler (e.g. when route change is
triggered).

The fix is more complicated than I'd like it to be mainly because
we need to ensure that we don't create circular references between
js closures and dom elements via DOM event handlers that would then
result in a memory leak.

Also the differences between IE8, IE9 and normal browsers make testing
this ugly.

Closes #1238
2012-08-10 14:21:02 -07:00
Igor Minar 263f47819f test(form): fix broken preventDefault test
the original test relied on incorrect assumptions about how jasmine async
tests work (when setTimeout is triggered) and how browser reloads a page
(the sequence of events) and thus the test passes even when the default
is not prevented.

this change fixes the test by registering an extra submit event handler
that checks if the default was prevented.

if the default was not prevented, the test will fail and the page will
be reloaded causing the test runner to panic.
2012-08-10 14:20:52 -07:00
Igor Minar 6b75475ce3 refactor(formSpec): group preventDefault specs into a describe 2012-08-10 14:20:28 -07:00
Igor Minar 07c354a8c0 docs(faq): update faq docs 2012-08-10 14:20:13 -07:00
Igor Minar 1391579599 docs(styles): fix the cog icon alignment 2012-08-10 14:19:57 -07:00
Vojta Jina 5d2bd1d84c chore(nodeserver): add font mime type 2012-08-10 14:19:47 -07:00
Vojta Jina bf77e212af docs(guide): hide scenario for directive example
scenario test for this example would be tricky, we need to teach
the runner how to inject mocks first.
2012-08-10 14:19:37 -07:00
Vojta Jina eef2f9c31e docs(design): fix icons
Copy fontawesome during build
2012-08-10 14:18:45 -07:00
brettcannon 438627c2c3 fix(docs): "in depth" -> "in-depth" 2012-08-10 14:18:06 -07:00
Igor Minar d3952b79c7 docs(readme): improve blurb about AngularJS in README.md 2012-07-19 21:48:45 -07:00
brettcannon 5ef9ed87d8 fix(docs): Capitalize Angular. 2012-07-19 15:23:21 -07:00
brettcannon 8c81a0f372 fix(docs): Fix a spelling mistake by replacing the noun with "it" 2012-07-19 15:04:29 -07:00
brettcannon bde931afd5 fix(docs): "were" -> "where" 2012-07-19 11:28:19 -07:00
brettcannon 6553fe68d1 fix(docs): Capitalize "URL". 2012-07-19 11:05:38 -07:00
Chris Dawson 13b5fd1b9d fix(docs): Fixed defer to timeout change in timer directive example 2012-07-19 10:04:22 -07:00
Chris Dawson 17209d5b4a fix(docs): Spelling errors 2012-07-19 10:01:50 -07:00
brettcannon 6f9a5721bc fic(docs): Consistently use __bold__ for things that must be done when moving the ng-controller declaration. 2012-07-19 09:57:58 -07:00
brettcannon 31c825607d fix(docs): Tweak some grammar and add some links relating to DI. 2012-07-19 09:54:53 -07:00
brettcannon ab6937e251 fix(docs): Capitalize "APIs" 2012-07-19 09:49:44 -07:00
brettcannon fbfda241f6 fix(docs): Capitalize "Angular". 2012-07-19 09:35:43 -07:00
brettcannon 206371b737 fix(docs): Capitalize Angular. 2012-07-19 09:26:34 -07:00
brettcannon b6b92bd866 fix(docs): Add a missing "the". 2012-07-19 09:09:52 -07:00
brettcannon 79f2d843a8 fix(docs): ngRepeater isn't a thing, ngRepeat is 2012-07-19 09:04:59 -07:00
brettcannon 64a9cd8f4f fix(docs): Remove a redundant "in". 2012-07-19 09:02:04 -07:00
brettcannon 7f6e1326f3 fix(docs): Grammatical fix 2012-07-18 15:48:08 -07:00
brettcannon 1fd2b3d402 fix(docs): Fixed some awkward wording 2012-07-18 15:42:29 -07:00
brettcannon d56d69cc83 fix(docs): Tweak formatting and wording of a list 2012-07-18 15:20:38 -07:00
brettcannon 01e726b2fa fix(docs): Don't want the present participle of "is" 2012-07-18 15:15:09 -07:00
brettcannon 1613621645 fix(docs): Adjectve accidentally made into an adverb 2012-07-18 12:16:14 -07:00
brettcannon 92a3d28218 fix(docs): Minor grammatical fix 2012-07-18 11:52:57 -07:00
Rishabh Rao 4c58501956 fix(docs): Fixed typo: changed ngRepeate to ngRepeat. 2012-07-16 12:33:19 -07:00
Jamie Krug c076fe08cf fix(docs): Fix spelling, punctuation and grammatical errors on dev guide bootstrap page. 2012-07-16 12:10:43 -07:00
Jamie Krug 2473412ba5 fix(docs): Fix spelling, punctuation and grammatical errors on dev guide compiler page. 2012-07-16 12:10:42 -07:00
Jamie Krug 1f2d50000e fix(docs): Fix spelling, punctuation and grammatical errors on dev guide overview page. 2012-07-16 12:10:33 -07:00
Kevin Old 5026315d6f fix(docs): correct typo 2012-07-16 11:40:21 -07:00
Igor Minar a8b04004e3 docs(readme): add blurb about AngularJS to README.md 2012-07-02 08:21:19 -07:00
Igor Minar f0a090ddf2 fix(docs): correctly generate sitemap 2012-07-02 08:21:19 -07:00
Igor Minar 6d9313a68d fix(docs): fix broken ng-docs specs 2012-07-02 08:21:19 -07:00
Vojta Jina 212f685e06 chore(changelog): fix typos in rc11 changelog 2012-06-25 20:36:41 -07:00
Igor Minar 35706ba482 chore(release): starting the 1.0.2 debilitating-awesomeness iteration 2012-06-25 12:52:32 -07:00
Igor Minar 9bef436b22 chore(release): cutting the 1.0.1 thorium-shielding release 2012-06-25 09:30:57 -07:00
Igor Minar 3f14a45aa5 docs(changelog): release notes for 1.0.1 thorium-shielding 2012-06-25 09:30:57 -07:00
Misko Hevery ffb270130a fix(browser): prevent ie from getting into redirect loop
Closes #1075
Closes #1079
Closes #1085
2012-06-22 10:21:31 -07:00
Igor Minar 0d57f1373f chore(release): starting the 1.0.1 iteration 2012-06-21 13:59:53 -07:00
Igor Minar 869143ec7d chore(logos): fix shield logo exports
the previous version is clipped at the top
2012-06-21 13:58:24 -07:00
Igor Minar 1e6d4d5f54 fix(logo): center A in the shield 2012-06-21 13:58:24 -07:00
Vojta Jina 3da4194f98 fix($location): url rewriting if element was removed
When user clicks a link, $location needs to intercept this event.  The <a> doesn't have to be target element of the DOM event, so it needs to traverse the DOM, to find first <a> parent.

If the target element was removed from DOM, during the same event, it would throw an exception. This fixes the issue.

Closes #1058
2012-06-20 12:18:48 -07:00
Misko Hevery ad5d2f2991 fix(doc) firefox icon rendering 2012-06-15 10:40:25 -07:00
118 changed files with 10130 additions and 1138 deletions
+14
View File
@@ -0,0 +1,14 @@
# Auto detect text files and perform LF normalization
* text=auto
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
+115 -1
View File
@@ -1,3 +1,117 @@
<a name="1.1.0"></a>
# 1.1.0 increase-gravatas (2012-08-31)
_Note: 1.1.x releases unlike 1.0.x are considered unstable.
[More info](http://blog.angularjs.org/2012/07/angularjs-10-12-roadmap.html)_
## Features
- **$http:** support custom reponseType
([e0a54f6b](https://github.com/angular/angular.js/commit/e0a54f6b206dc2b6595f2bc3a17c5932e7477545),
[#1013](https://github.com/angular/angular.js/issues/1013))
- **$interpolate:**
- provide contextual error messages
([d804bbcd](https://github.com/angular/angular.js/commit/d804bbcd51ec83bee1f4a3ccd42c3bd7eb38a988))
- expose start/end symbols in run phase
([58f121a5](https://github.com/angular/angular.js/commit/58f121a5c293ed57043e22ed526fdf99642fca81))
- **$sniffer:** auto detect CSP mode (currently requires Chrome on dev channel)
([167aa0c2](https://github.com/angular/angular.js/commit/167aa0c29c998be33c49d33302e099b36d1ce0be))
This release also contains all bug fixes available in [1.0.2](#1.0.2).
<a name="1.0.2"></a>
# 1.0.2 debilitating-awesomeness (2012-08-31)
## Bug Fixes
- **$compile:** denormalize directive templates
([dfe99836](https://github.com/angular/angular.js/commit/dfe99836cd98c2a1b0f9bde6216bd44088de275a))
- **$interpolate:** $interpolateProvider.endSymbol() returns startSymbol
([20348717](https://github.com/angular/angular.js/commit/20348717640c0ef405c9fdcc8fec5b566efc48b3))
- **jqLite:** better support for xhtml
([d3fa7a2e](https://github.com/angular/angular.js/commit/d3fa7a2e9e93c9dae13d852b28c878f7d6b7c420),
[#1301](https://github.com/angular/angular.js/issues/1301))
- **mocks:** free up memory after every spec
([1a8642aa](https://github.com/angular/angular.js/commit/1a8642aac2de40dccdab464e58dc164006c300bb))
- **e2e test runner:** Adding meta tag to avoid cache issues
([5318588d](https://github.com/angular/angular.js/commit/5318588d6e8ee9a31f4002affd6858d25305aabf))
- Directives:
- **form:** prevent page reload when form destroyed
([054d40f3](https://github.com/angular/angular.js/commit/054d40f338f9000cddcf7f0513af37328b88ef41),
[#1238](https://github.com/angular/angular.js/issues/1238))
- **ngList:** remove data bound flicker
([fa62ea81](https://github.com/angular/angular.js/commit/fa62ea810f6c701e898dd07c6c9228f13d5b5e02))
- **ngPluralize:** fixes ng-pluralize when using non-standard start/end symbols
([e85774f7](https://github.com/angular/angular.js/commit/e85774f709b9f681b0ff8d829b07568b0f844a62),
[#1134](https://github.com/angular/angular.js/issues/1134))
- **option:** support option elements in datalist
([9767f7bd](https://github.com/angular/angular.js/commit/9767f7bdd3e1ce6f65bdea992d67369ead13d813),
[#1165](https://github.com/angular/angular.js/issues/1165))
## Docs
- Conceptual Overview of AngularJS (high level overview of how things work):
<http://docs.angularjs.org/guide/concepts>
([7a5f25f6](https://github.com/angular/angular.js/commit/7a5f25f6671eb5f51b06615d74a05855ab79f31e))
- Lots of spelling, grammar and other fixes:
[9a710c78](https://github.com/angular/angular.js/commit/9a710c788d880785d2b02a9c5411eb15e9c278bf),
[847d2da0](https://github.com/angular/angular.js/commit/847d2da0f8d1e265eda7b4dd3e7eb52ac86d784e),
[dbefd671](https://github.com/angular/angular.js/commit/dbefd671e41c3bda481850bb7e566349e275d759),
[cab5e1d9](https://github.com/angular/angular.js/commit/cab5e1d9b363eac6fd31b15c5b86f30993e2f147),
[f00b6cca](https://github.com/angular/angular.js/commit/f00b6cca024a9418f353651f29c984f934575bd9),
[2e365168](https://github.com/angular/angular.js/commit/2e3651686c2bd84cf464ecc236c8ad77e61179df),
[536de148](https://github.com/angular/angular.js/commit/536de148214290f0b4a0595fa16c00da5e527e79),
[a1107e81](https://github.com/angular/angular.js/commit/a1107e81ebf2254caf75718de2e3ec773cce0c56),
[5ef9ed87](https://github.com/angular/angular.js/commit/5ef9ed87d82b109715a87e9aa1b1d5b63f515d3a),
[8c81a0f3](https://github.com/angular/angular.js/commit/8c81a0f3728b9308854ceb9bf392ec467b95d8eb),
[bde931af](https://github.com/angular/angular.js/commit/bde931afd5cf2483df236e06992666a0a4182794),
[6553fe68](https://github.com/angular/angular.js/commit/6553fe68d17d42ec25e0c592ceaa1077cc0ec4f6),
[13b5fd1b](https://github.com/angular/angular.js/commit/13b5fd1b9d60f1a9187da8a89db9272284ccdac4),
[17209d5b](https://github.com/angular/angular.js/commit/17209d5b4a579edf8425715b5cdf25bc5cd96711),
[31c82560](https://github.com/angular/angular.js/commit/31c825607dd524241c811ca3e401b119c810e977),
[ab6937e2](https://github.com/angular/angular.js/commit/ab6937e2518bfd77d9fe42e3d2e11fe4a7a16814),
[fbfda241](https://github.com/angular/angular.js/commit/fbfda241f616bcfe8273f501dd49120a3cb35fab),
[206371b7](https://github.com/angular/angular.js/commit/206371b7372c242db234ca8da12d1c7a8a322d54),
[b6b92bd8](https://github.com/angular/angular.js/commit/b6b92bd866e1d6d066f1c9bf1937496cd3e28664),
[79f2d843](https://github.com/angular/angular.js/commit/79f2d843a8458bfdc23fe9f179a1416fe21f7533),
[64a9cd8f](https://github.com/angular/angular.js/commit/64a9cd8f4fac1c518869a1c955fe60bd6ef76439),
[7f6e1326](https://github.com/angular/angular.js/commit/7f6e1326f3a7a6a2ba2dbd48dd6571ebe929a7c1),
[1fd2b3d4](https://github.com/angular/angular.js/commit/1fd2b3d402f36e395a1fe9ea7e3f91a1b2833426),
[d56d69cc](https://github.com/angular/angular.js/commit/d56d69cc8319f69135a17a9bb5ae394123b33c51),
[01e726b2](https://github.com/angular/angular.js/commit/01e726b2fa3fb0d2584c9bb8df116ff3a9f05879),
[16136216](https://github.com/angular/angular.js/commit/161362164532af3578c9e3e8b52cd80b15345add),
[92a3d282](https://github.com/angular/angular.js/commit/92a3d2821856c75eb95f8ec6ccf26d6a9b37fdd9),
[4c585019](https://github.com/angular/angular.js/commit/4c5850195699b1d982963f25399d24bf8b815f81),
[c076fe08](https://github.com/angular/angular.js/commit/c076fe08cf47e8af4b5e8845aed917ebb7dbd593),
[2473412b](https://github.com/angular/angular.js/commit/2473412ba55f7c47f2ca24311312ce95ee11949e),
[1f2d5000](https://github.com/angular/angular.js/commit/1f2d50000e82630bfce6eb9cf0a8da752fd1e826),
[5026315d](https://github.com/angular/angular.js/commit/5026315d6f4495d636d86ae2a022fb55cc0ca211),
[f0a090dd](https://github.com/angular/angular.js/commit/f0a090ddf256d0c144e705c0cdf4216d824140f9),
[6d9313a6](https://github.com/angular/angular.js/commit/6d9313a68d82654d389c0b2c3e4af148382f14be)) and more!
<a name="1.0.1"></a>
# 1.0.1 thorium-shielding (2012-06-25)
## Bug Fixes
- **$location:** don't throw exception while url rewriting if element was removed
([3da4194f](https://github.com/angular/angular.js/commit/3da4194f98fa0c1ad1e5ab159719e4b25799e6d4),
[#1058](https://github.com/angular/angular.js/issues/1058))
- **$location:** prevent ie from getting into redirect loop
([ffb27013](https://github.com/angular/angular.js/commit/ffb270130a4aaf3ddc2eb9d6211b46e1da136184),
[#1075](https://github.com/angular/angular.js/issues/1075),
[#1079](https://github.com/angular/angular.js/issues/1079),
[#1085](https://github.com/angular/angular.js/issues/1085))
<a name="1.0.0"></a>
# 1.0.0 temporal-domination (2012-06-13)
@@ -70,7 +184,7 @@
## Breaking Changes
- **$beforeRouteChange and $routeChangeStart events were renamed to $afterRouteChange and
- **$beforeRouteChange and $afterRouteChange events were renamed to $routeChangeStart and
$routeChangeSuccess**
This was done to make the naming consistent with $location events and also get events to
+12 -2
View File
@@ -1,10 +1,20 @@
AngularJS
=========
AngularJS lets you write client-side web applications as if you had a smarter browser. It lets use
good old HTML (or HAML, Jade and friends!) as your template language and lets you extend HTMLs
syntax to express your applications components clearly and succinctly. It automatically
synchronizes data from your UI (view) with your JavaScript objects (model) through 2-way data
binding. To help you structure your application better and make it easy to test AngularJS teaches
the browser how to do dependency injection and inversion of control. Oh yeah and it also helps with
server-side communication, taming async callbacks with promises and deferreds; and make client-side
navigation and deeplinking with hashbang urls or HTML5 pushState a piece of cake. The best of all:
it makes development fun!
* Web site: http://angularjs.org
* Tutorial: http://docs.angularjs.org/#!/tutorial
* Tutorial: http://docs.angularjs.org/tutorial
* API Docs: http://docs.angularjs.org
* Developer Guide: http://docs.angularjs.org/#!/guide
* Developer Guide: http://docs.angularjs.org/guide
Compiling
---------
+59 -89
View File
@@ -1,6 +1,13 @@
require 'yaml'
include FileUtils
## High level flow of the build:
##
## clean -> init -> concat -> minify -> package
##
content = File.open('angularFiles.js', 'r') {|f| f.read }
files = eval(content.gsub(/\};(\s|\S)*/, '}').
gsub(/angularFiles = /, '').
@@ -9,7 +16,7 @@ files = eval(content.gsub(/\};(\s|\S)*/, '}').
BUILD_DIR = 'build'
task :default => [:compile, :test]
task :default => [:package]
desc 'Init the build workspace'
@@ -19,12 +26,13 @@ task :init do
v = YAML::load( File.open( 'version.yaml' ) )
match = v['version'].match(/^([^-]*)(-snapshot)?$/)
NG_VERSION = Struct.new(:full, :major, :minor, :dot, :codename).
NG_VERSION = Struct.new(:full, :major, :minor, :dot, :codename, :stable).
new(match[1] + (match[2] ? ('-' + %x(git rev-parse HEAD)[0..7]) : ''),
match[1].split('.')[0],
match[1].split('.')[1],
match[1].split('.')[2].sub(/\D+.*$/, ''),
v['codename'])
v['codename'],
v['stable'])
end
@@ -35,8 +43,8 @@ task :clean do
end
desc 'Compile Scenario'
task :compile_scenario => :init do
desc 'Concat Scenario'
task :concat_scenario => :init do
concat_file('angular-scenario.js', [
'lib/jquery/jquery.js',
@@ -47,8 +55,9 @@ task :compile_scenario => :init do
], gen_css('css/angular.css') + "\n" + gen_css('css/angular-scenario.css'))
end
desc 'Compile JSTD Scenario Adapter'
task :compile_jstd_scenario_adapter => :init do
desc 'Concat JSTD Scenario Adapter'
task :concat_jstd_scenario_adapter => :init do
concat_file('jstd-scenario-adapter.js', [
'src/ngScenario/jstd-scenario-adapter/angular.prefix',
@@ -66,9 +75,9 @@ task :compile_jstd_scenario_adapter => :init do
end
desc 'Compile JavaScript'
task :compile => [:init, :compile_scenario, :compile_jstd_scenario_adapter] do
desc 'Concat AngularJS files'
task :concat => :init do
concat_file('angular.js', [
'src/angular.prefix',
files['angularSrc'],
@@ -98,99 +107,60 @@ task :compile => [:init, :compile_scenario, :compile_jstd_scenario_adapter] do
FileUtils.cp 'src/ngMock/angular-mocks.js', path_to('angular-mocks.js')
closure_compile('angular.js')
closure_compile('angular-cookies.js')
closure_compile('angular-loader.js')
closure_compile('angular-resource.js')
closure_compile('angular-sanitize.js')
closure_compile('angular-bootstrap.js')
closure_compile('angular-bootstrap-prettify.js')
rewrite_file(path_to('angular-mocks.js')) do |content|
content.sub!('"NG_VERSION_FULL"', NG_VERSION.full)
end
end
desc 'Minify JavaScript'
task :minify => [:init, :concat, :concat_scenario, :concat_jstd_scenario_adapter] do
[ 'angular.js',
'angular-cookies.js',
'angular-loader.js',
'angular-resource.js',
'angular-sanitize.js',
'angular-bootstrap.js',
'angular-bootstrap-prettify.js'
].each do |file|
closure_compile(file)
end
end
desc 'Generate docs'
task :docs => [:init] do
`node docs/src/gen-docs.js`
rewrite_file(path_to('docs/.htaccess')) do |content|
content.sub!('"NG_VERSION_FULL"', NG_VERSION.full)
[ path_to('docs/.htaccess'),
path_to('docs/index.html'),
path_to('docs/index-debug.html'),
path_to('docs/index-nocache.html'),
path_to('docs/index-jq.html'),
path_to('docs/index-jq-debug.html'),
path_to('docs/index-jq-nocache.html'),
path_to('docs/docs-scenario.html')
].each do |src|
rewrite_file(src) do |content|
content.sub!('"NG_VERSION_FULL"', NG_VERSION.full).
sub('"NG_VERSION_STABLE"', NG_VERSION.stable)
end
end
end
desc 'Create angular distribution'
task :package => [:clean, :compile, :docs] do
tarball = "angular-#{NG_VERSION.full}.tgz"
task :package => [:clean, :minify, :docs] do
zip_dir = "angular-#{NG_VERSION.full}"
zip_file = "#{zip_dir}.zip"
pkg_dir = path_to("pkg/angular-#{NG_VERSION.full}")
FileUtils.rm_r(path_to('pkg'), :force => true)
FileUtils.mkdir_p(pkg_dir)
FileUtils.ln_s BUILD_DIR, zip_dir
%x(zip -r #{zip_file} #{zip_dir})
FileUtils.rm zip_dir
[ path_to('angular.js'),
path_to('angular.min.js'),
path_to('angular-loader.js'),
path_to('angular-loader.min.js'),
path_to('angular-bootstrap.js'),
path_to('angular-bootstrap.min.js'),
path_to('angular-bootstrap-prettify.js'),
path_to('angular-bootstrap-prettify.min.js'),
path_to('angular-mocks.js'),
path_to('angular-cookies.js'),
path_to('angular-cookies.min.js'),
path_to('angular-resource.js'),
path_to('angular-resource.min.js'),
path_to('angular-sanitize.js'),
path_to('angular-sanitize.min.js'),
path_to('angular-scenario.js'),
path_to('jstd-scenario-adapter.js'),
path_to('jstd-scenario-adapter-config.js'),
].each do |src|
dest = src.gsub(/^.*\//, '').gsub(/((\.min)?\.js)$/, "-#{NG_VERSION.full}\\1")
FileUtils.cp(src, pkg_dir + '/' + dest)
end
FileUtils.mv zip_file, path_to(zip_file)
FileUtils.cp_r path_to('i18n'), "#{pkg_dir}/i18n-#{NG_VERSION.full}"
FileUtils.cp_r path_to('docs'), "#{pkg_dir}/docs-#{NG_VERSION.full}"
rewrite_file("#{pkg_dir}/angular-mocks-#{NG_VERSION.full}.js") do |content|
content.sub!('"NG_VERSION_FULL"', NG_VERSION.full)
end
[ "#{pkg_dir}/docs-#{NG_VERSION.full}/index.html",
"#{pkg_dir}/docs-#{NG_VERSION.full}/index-jq.html",
"#{pkg_dir}/docs-#{NG_VERSION.full}/index-nocache.html",
"#{pkg_dir}/docs-#{NG_VERSION.full}/index-jq-nocache.html",
"#{pkg_dir}/docs-#{NG_VERSION.full}/index-debug.html",
"#{pkg_dir}/docs-#{NG_VERSION.full}/index-jq-debug.html"
].each do |src|
rewrite_file(src) do |content|
content.gsub!(/'angular(.*)\.js/, '\'angular\1-' + NG_VERSION.full + '.js')
end
end
rewrite_file("#{pkg_dir}/docs-#{NG_VERSION.full}/docs-scenario.html") do |content|
content.sub!('angular-scenario.js', "angular-scenario-#{NG_VERSION.full}.js")
end
[ "#{pkg_dir}/docs-#{NG_VERSION.full}/appcache.manifest",
"#{pkg_dir}/docs-#{NG_VERSION.full}/appcache-offline.manifest"
].each do |src|
rewrite_file(src) do |content|
content.sub!('../angular.min.js', "angular-#{NG_VERSION.full}.min.js").
sub!('/build/docs/', "/#{NG_VERSION.full}/docs-#{NG_VERSION.full}/")
end
end
%x(tar -czf #{path_to(tarball)} -C #{path_to('pkg')} .)
FileUtils.cp path_to(tarball), pkg_dir
FileUtils.mv pkg_dir, path_to(['pkg', NG_VERSION.full])
puts "Package created: #{path_to(tarball)}"
puts "Package created: #{path_to(zip_file)}"
end
@@ -271,7 +241,7 @@ end
def closure_compile(filename)
puts "Compiling #{filename} ..."
puts "Minifying #{filename} ..."
min_path = path_to(filename.gsub(/\.js$/, '.min.js'))
@@ -289,7 +259,7 @@ end
def concat_file(filename, deps, footer='')
puts "Building #{filename} ..."
puts "Creating #{filename} ..."
File.open(path_to(filename), 'w') do |f|
concat = 'cat ' + deps.flatten.join(' ')
+1 -1
View File
@@ -2,6 +2,6 @@
@name API Reference
@description
Use the API Refference documentation when you need more information about a specific feature. Check out
Use the API Reference documentation when you need more information about a specific feature. Check out
{@link guide/ Developer Guide} for AngularJS concepts. If you are new to AngularJS we recomend the
{@link tutorial/ Tutorial}.
+9 -9
View File
@@ -24,8 +24,8 @@ initialization.
</html>
</pre>
* Place the `script` tag at the buttom of the page. Placing script tags at the end of the page
impreves app load time becouse the HTML loading is not blocked by loading of the `angular.js`
* Place the `script` tag at the bottom of the page. Placing script tags at the end of the page
improves app load time because the HTML loading is not blocked by loading of the `angular.js`
script. You can get the latest bits from {@link http://code.angularjs.org}. Please don't link
your production code to this URL, as it will expose a security hole on your site. For
experimental development linking to our site is fine.
@@ -34,12 +34,12 @@ initialization.
* Choose: `angular-[version].min.js` for a compressed and obfuscated file, suitable for use in
production.
* Place `ng-app` to the root of your application, typically on the `<html>` tag if you want
anugular to auto-bootstrap your application.
angular to auto-bootstrap your application.
<html ng-app>
* If you chose to use the old style directive syntax `ng:` then include xml-namespace in `html`
to make IE happy. (This is here for historical resons, and we no longer recomend use of
* If you choose to use the old style directive syntax `ng:` then include xml-namespace in `html`
to make IE happy. (This is here for historical reasons, and we no longer recommend use of
`ng:`.)
<html xmlns:ng="http://angularjs.org">
@@ -48,9 +48,9 @@ initialization.
# Automatic Initialization
Angular initializes automatically upon `DOMContentLoaded` event, at which point angular looks for
Angular initializes automatically upon `DOMContentLoaded` event, at which point Angular looks for
the {@link api/ng.directive:ngApp `ng-app`} directive which
designates your application root. If {@link
designates your application root. If the {@link
api/ng.directive:ngApp `ng-app`} directive is found then Angular
will:
@@ -78,7 +78,7 @@ will:
If you need to have more control over the initialization process, you can use a manual
bootstrapping method instead. Examples of when you'd need to do this include using script loaders
or the need to perform an operation before the Angular compiles a page.
or the need to perform an operation before Angular compiles a page.
Here is an example of manually initializing Angular. The example is equivalent to using the {@link
@@ -99,7 +99,7 @@ api/ng.directive:ngApp ng-app} directive.
</html>
</pre>
This sequence that your code should follow:
This is the sequence that your code should follow:
1. After the page and all of the code is loaded, find the root of the HTML template, which is
typically the root of the document.
+12 -14
View File
@@ -7,7 +7,7 @@
Angular's {@link api/ng.$compile HTML compiler} allows the developer to teach the
browser new HTML syntax. The compiler allows you to attach behavior to any HTML element or attribute
and even create new HTML element or attributes with custom behavior. Angular calls these behavior
extensions {@link api/ng.$compileProvider.directive directives}.
extensions {@link api/ng.$compileProvider#directive directives}.
HTML has a lot of constructs for formatting the HTML for static documents in declarative fashion.
For example if something needs to be centered, there is no need to provide instructions to the
@@ -60,7 +60,7 @@ api/ng.directive:ngBind `ng-bind`} directive.
</pre>
Directive is just a function which executes when the compiler encounters it in the DOM. See {@link
api/ng.$compileProvider.directive directive API} for in depth documentation on how
api/ng.$compileProvider#directive directive API} for in-depth documentation on how
to write directives.
Here is a directive which makes any element draggable. Notice the `draggable` attribute on the
@@ -104,12 +104,12 @@ Here is a directive which makes any element draggable. Notice the `draggable` at
<file name="index.html">
<span draggable>Drag ME</span>
</file>
</file>
</example>
The presence of `draggable` attribute an any element gives the element new behavior. The beauty of
this approach is that we have thought the browser a new trick, we have extended the vocabulary of
what browser understands in a way, which is natural to anyone who is familiar with HTML
The presence of `draggable` attribute on any element gives the element new behavior. The beauty of
this approach is that we have taught the browser a new trick. We have extended the vocabulary of
what the browser understands in a way, which is natural to anyone who is familiar with HTML
principles.
@@ -121,23 +121,21 @@ an element.
<img src="img/One_Way_Data_Binding.png">
This means that any changes to the data, need to be re-merged with the template and then
This means that any changes to the data need to be re-merged with the template and then
`innerHTML`ed into the DOM. Some of the issues are: reading user input and merging it with data,
clobbering user input by overwriting it, managing the whole update process, and lack of behavior
expressiveness.
Angular is different. Angular compiler consumes DOM with directives, not string templates. The
result is a linking function, which when combined with a scope model results in live view. The
view and scope model bindings are transparent, no action from the developer is needed to update
Angular is different. The Angular compiler consumes the DOM with directives, not string templates.
The result is a linking function, which when combined with a scope model results in a live view. The
view and scope model bindings are transparent. No action from the developer is needed to update
the view. And because no `innerHTML` is used there are no issues of clobbering user input.
Furthermore, angular directives can contain not just text bindings, but behavioral constructs as
Furthermore, Angular directives can contain not just text bindings, but behavioral constructs as
well.
<img src="img/Two_Way_Data_Binding.png">
The Angular approach produces stable DOM. This means that the DOM element instance bound to model
The Angular approach produces a stable DOM. This means that the DOM element instance bound to a model
item instance does not change for the lifetime of the binding. This means that the code can get
hold of the elements and register event handlers and know that the reference will not be destroyed
by template data merge.
+467
View File
@@ -0,0 +1,467 @@
@ngdoc overview
@name Conceptual Overview
@description
# Overview
This document gives a quick overview of the main angular components and how they work together.
These are:
* {@link concepts#startup startup} - bring up hello world
* {@link concepts#runtime runtime} - overview of angular runtime
* {@link concepts#scope scope} - the glue between the view and the controller
* {@link concepts#controller controller} - application behavior
* {@link concepts#model model} - your application data
* {@link concepts#view view} - what the user sees
* {@link concepts#directives directives} - extend HTML vocabulary
* {@link concepts#filters filters} - format the data in user locale
* {@link concepts#injector injector} - assembles your application
* {@link concepts#module module} - configures the injector
* {@link concepts#angular_namespace `$`} - angular namespace
<a name="startup"></a>
# Startup
This is how we get the ball rolling (refer to the diagram and example below):
<img class="pull-right" style="padding-left: 3em;" src="img/guide/concepts-startup.png">
1. Browser loads the HTML and parses it into a DOM
2. Browser loads `angular.js` script
3. Angular waits for `DOMContentLoaded` event
4. Angular looks for {@link api/ng.directive:ngApp ng-app}
{@link guide/directive directive}, which designates application boundary
5. {@link guide/module Module} specified in {@link
api/ng.directive:ngApp ng-app} (if any) is used to configure
the {@link api/AUTO.$injector $injector}
6. {@link api/AUTO.$injector $injector} is used to create the {@link
api/ng.$compile $compile} service as well as {@link
api/ng.$rootScope $rootScope}
7. {@link api/ng.$compile $compile} service is used to compile the DOM and link
it with {@link api/ng.$rootScope $rootScope}
8. {@link api/ng.directive:ngInit ng-init} {@link
guide/directive directive} assigns `World` to the `name` property on the {@link guide/scope
scope}
9. The `{{name}}` {@link api/ng.$interpolate interpolates} the expression to
`Hello World!`
<div class="clear">
</div>
<example>
<file name="index.html">
<p ng-init=" name='World' ">Hello {{name}}!</p>
</file>
</example>
<a name="runtime"></a>
# Runtime
<img class="pull-right" style="padding-left: 3em; padding-bottom: 1em;" src="img/guide/concepts-runtime.png">
The diagram and the example below describe how Angular interacts with browser's event loop.
1. Browsers event-loop waits for an event to arrive. Event is a user interactions, timer event,
or network event (response from a server).
2. The events callback gets executed. This enters the JavaScript context. The callback can
modify the DOM structure.
3. Once the callback finishes execution, the browser leaves the JavaScript context and
re-renders the view based on DOM changes.
Angular modifies the normal JavaScript flow by providing it's own event processing loop. This
splits the JavaScript into classical and Angular execution context. Only operations which are
applied in Angular execution context will benefit from angular data-binding, exception handling,
property watching, etc... Use $apply() to enter Angular execution context from JavaScript. Keep in
mind that in most places (controllers, services) the $apply has already been called for you by the
directive which is handling the event. The need to call $apply is reserved only when
implementing custom event callbacks, or when working with a third-party library callbacks.
1. Enter Angular execution context by calling {@link guide/scope scope}`.`{@link
api/ng.$rootScope.Scope#$apply $apply}`(stimulusFn)`. Where `stimulusFn` is
the work you wish to do in Angular execution context.
2. Angular executes the `stimulusFn()`, which typically modifies application state.
3. Angular enters the {@link api/ng.$rootScope.Scope#$digest $digest} loop. The
loop is made up of two smaller loops which process {@link
api/ng.$rootScope.Scope#$evalAsync $evalAsync} queue and the {@link
api/ng.$rootScope.Scope#$watch $watch} list. The {@link
api/ng.$rootScope.Scope#$digest $digest} loop keeps iterating until the model
stabilizes, which means that the {@link api/ng.$rootScope.Scope#$evalAsync
$evalAsync} queue is empty and the {@link api/ng.$rootScope.Scope#$watch
$watch} list does not detect any changes.
4. The {@link api/ng.$rootScope.Scope#$evalAsync $evalAsync} queue is used to
schedule work which needs to occur outside of current stack frame, but before the browser
view render. This is usually done with `setTimeout(0)`, but the `setTimeout(0)` approach
suffers from slowness and may cause view flickering since the browser renders the view after
each event.
5. The {@link api/ng.$rootScope.Scope#$watch $watch} list is a set of expressions
which may have changed since last iteration. If a change is detected then the `$watch`
function is called which typically updates the DOM with the new value.
6. Once Angular {@link api/ng.$rootScope.Scope#$digest $digest} loop finishes
the execution leaves the Angular and JavaScript context. This is followed by the browser
re-rendering the DOM to reflect any changes.
Here is the explanation of how the `Hello wold` example achieves the data-binding effect when the
user enters text into the text field.
1. During the compilation phase:
1. the {@link api/ng.directive:ngModel ng-model} and {@link
api/ng.directive:input input} {@link guide/directive
directive} set up a `keydown` listener on the `<input>` control.
2. the {@link api/ng.$interpolate &#123;&#123;name&#125;&#125; } interpolation
sets up a {@link api/ng.$rootScope.Scope#$watch $watch} to be notified of
`name` changes.
2. During the runtime phase:
1. Pressing an '`X`' key causes the browser to emit a `keydown` event on the input control.
2. The {@link api/ng.directive:input input} directive
captures the change to the input's value and calls {@link
api/ng.$rootScope.Scope#$apply $apply}`("name = 'X';")` to update the
application model inside the Angular execution context.
3. Angular applies the `name = 'X';` to the model.
4. The {@link api/ng.$rootScope.Scope#$digest $digest} loop begins
5. The {@link api/ng.$rootScope.Scope#$watch $watch} list detects a change
on the `name` property and notifies the {@link api/ng.$interpolate
&#123;&#123;name&#125;&#125; } interpolation, which in turn updates the DOM.
6. Angular exits the execution context, which in turn exits the `keydown` event and with it
the JavaScript execution context.
7. The browser re-renders the view with update text.
<div class="clear">
</div>
<example>
<file name="index.html">
<input ng-model="name">
<p>Hello {{name}}!</p>
</file>
</example>
<a name="scope"></a>
#Scope
The {@link guide/scope scope} is responsible for detecting changes to the model section and
provides the execution context for expressions. The scopes are nested in a hierarchical structure
which closely follow the DOM structure. (See individual directive documentation to see which
directives cause a creation of new scopes.)
The following example demonstrates how `name` {@link guide/expression expression} will evaluate
into different value depending on which scope it is evaluated in. The example is followed by
a diagram depicting the scope boundaries.
<div class="clear">
</div>
<div class="show-scope">
<example>
<file name="index.html">
<div ng-controller="GreetCtrl">
Hello {{name}}!
</div>
<div ng-controller="ListCtrl">
<ol>
<li ng-repeat="name in names">{{name}}</li>
</ol>
</div>
</file>
<file name="script.js">
function GreetCtrl($scope) {
$scope.name = 'World';
}
function ListCtrl($scope) {
$scope.names = ['Igor', 'Misko', 'Vojta'];
}
</file>
<file name="style.css">
.show-scope .doc-example-live.ng-scope,
.show-scope .doc-example-live .ng-scope {
border: 1px solid red;
margin: 3px;
}
</file>
</example>
</div>
<img class="center" src="img/guide/concepts-scope.png">
<a name="controller"></a>
# Controller
<img class="pull-right" style="padding-left: 3em; padding-bottom: 1em;" src="img/guide/concepts-controller.png">
Controller is the code behind the view. Its job is to construct the model and publish it to the
view along with callback methods. The view is a projection of the scope onto the template (the
HTML). The scope is the glue which marshals the model to the view and forwards the events to the
controller.
The separation of the controller and the view is important because:
* The controller is written in JavaScript. JavaScript is imperative. Imperative is a good fit
for specifying application behavior. The controller should not contain any rendering
information (DOM references or HTML fragments).
* The view template is written in HTML. HTML is declarative. Declarative is a good fit for
specifying UI. The View should not contain any behavior.
* Since the controller is unaware of the view, there could be many views for the same
controller. This is important for re-skinning, device specific views (i.e. mobile vs desktop),
and testability.
<div class="clear">
</div>
<example>
<file name="index.html">
<div ng-controller="MyCtrl">
Hello {{name}}!
<button ng-click="action()">
OK
</button>
</div>
</file>
<file name="script.js">
function MyCtrl($scope) {
$scope.action = function() {
$scope.name = 'OK';
}
$scope.name = 'World';
}
</file>
</example>
<a name="model"></a>
# Model
<img class="pull-right" style="padding-left: 3em; padding-bottom: 1em;" src="img/guide/concepts-model.png">
The model is the data which is used merged with the template to produce the view. To be able to
render the model into the view, the model has to be referenceable from the scope. Unlike many
other frameworks Angular makes no restrictions or requirements an the model. There are no classes
to inherit from or special accessor methods for accessing or changing the model. The model can be
primitive, object hash, or a full object Type. In short the model is a plain JavaScript object.
<div class="clear">
</div>
<a name="view"></a>
# View
<img class="pull-right" style="padding-left: 3em; padding-bottom: 1em;" src="img/guide/concepts-view.png">
The view is what the users sees. The view begins its life as a template, it is merged with the
model and finally rendered into the browser DOM. Angular takes a very different approach to
rendering the view, to most other templating systems.
* **Others** - Most templating systems begin as an HTML string with special templating markup.
Often the template markup breaks the HTML syntax which means that the template can not be
edited by an HTML editor. The template string is then parsed by the template engine, and
merged with the data. The result of the merge is an HTML string. The HTML string is then
written to the browser using the `.innerHTML`, which causes the browser to render the HTML.
When the model changes the whole process needs to be repeated. The granularity of the template
is the granularity of the DOM updates. The key here is that the templating system manipulates
strings.
* **Angular** - Angular is different, since its templating system works on DOM objects not on
strings. The template is still written in HTML string, but it is HTML (not HTML with
template sprinkled in.) The browser parses the HTML into DOM, and the DOM becomes the input to
the template engine know as the {@link api/ng.$compile compiler}. The compiler
looks for {@link guide/directive directives} which in turn set up {@link
api/ng.$rootScope.Scope#$watch watches} on the model. The result is a
continuously updating view which does not need template model re-merging. Your model becomes
the single source-of-truth for your view.
<div class="clear">
</div>
<example>
<file name="index.html">
<div ng-init="list = ['Chrome', 'Safari', 'Firefox', 'IE'] ">
<input ng-model="list" ng-list> <br>
<input ng-model="list" ng-list> <br>
<pre>list={{list}}</pre> <br>
<ol>
<li ng-repeat="item in list">
{{item}}
</li>
</ol>
</div>
</file>
</example>
<a name="directives"></a>
# Directives
A directive is a behavior or DOM transformation which is triggered by a presence of an attribute,
element name, or a class name. A directive allows you to extend the HTML vocabulary in a
declarative fashion. Following is an example which enables data-binding for the `contenteditable`
in HTML.
<example module="directive">
<file name="script.js">
angular.module('directive', []).directive('contenteditable', function() {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
// view -> model
elm.bind('blur', function() {
scope.$apply(function() {
ctrl.$setViewValue(elm.html());
});
});
// model -> view
ctrl.render = function(value) {
elm.html(value);
};
// load init value from DOM
ctrl.$setViewValue(elm.html());
}
};
});
</file>
<file name="index.html">
<div contentEditable="true" ng-model="content">Edit Me</div>
<pre>model = {{content}}</pre>
</file>
<file name="style.css">
div[contentEditable] {
cursor: pointer;
background-color: #D0D0D0;
margin-bottom: 1em;
padding: 1em;
}
</file>
</example>
<a name="filters"></a>
# Filters
{@link api/ng.$filter Filters} perform data transformation roles. Typically
they are used in conjunction with the locale to format the data in locale specific output.
They are follow the spirit of UNIX filters and follow similar syntax `|` (pipe).
<example>
<file name="index.html">
<div ng-init="list = ['Chrome', 'Safari', 'Firefox', 'IE'] ">
Number formatting: {{ 1234567890 | number }} <br>
array filtering <input ng-model="predicate">
{{ list | filter:predicate | json }}
</div>
</file>
</example>
<a name="module"></a>
<a name="injector"></a>
# Modules and the Injector
<img class="pull-right" style="padding-left: 3em; padding-bottom: 1em;" src="img/guide/concepts-module-injector.png">
An {@link api/AUTO.$injector injector} is a service locator. There is a single
{@link api/AUTO.$injector injector} per Angular {@link
api/ng.directive:ngApp application}. The {@link
api/AUTO.$injector injector} provides a way to look up an object instance by its
name. The injector keeps on internal cache of all objects so that repeated calls to get the same
object name result in the same instance. If the object does not exist, then the {@link
api/AUTO.$injector injector} asks the instance factory to create a new instance.
A {@link api/angular.Module module} is a way to configure the injector's instance factory, known
as a {@link api/AUTO.$provide provider}.
<div class='clear'></div>
<pre>
// Create a module
var myModule = angular.module('myModule', [])
// Configure the injector
myModule.factory('serviceA', function() {
return {
// instead of {}, put your object creation here
};
});
// create an injector and configure it from 'myModule'
var $injector = angular.injector('myModule');
// retrieve an object from the injector by name
var serviceA = $injector.get('serviceA');
// always true because of instance cache
$injector.get('serviceA') === $injector.get('serviceA');
</pre>
But the real magic of the {@link api/AUTO.$injector injector} is that it can be
used to {@link api/AUTO.$injector#invoke call} methods and {@link
api/AUTO.$injector#instantiate instantiate} types. This subtle feature is what
allows the methods and types to ask for their dependencies rather then to look for them.
<pre>
// You write functions such as this one.
function doSomething(serviceA, serviceB) {
// do something here.
}
// Angular provides the injector for your application
var $injector = ...;
///////////////////////////////////////////////
// the old-school way of getting dependencies.
var serviceA = $injector.get('serviceA');
var serviceB = $injector.get('serviceB');
// now call the function
doSomething(serviceA, serviceB);
///////////////////////////////////////////////
// the cool way of getting dependencies.
// the $injector will supply the arguments to the function automatically
$injector.invoke(doSomething); // This is how the framework calls your functions
</pre>
Notice that the only thing you needed to write was the function, and list the dependencies in the
function arguments. When angular calls the function, it will use the {@link
api/AUTO.$injector#invoke call} which will automatically fill the function
arguments.
Examine the `ClockCtrl` bellow, and notice how it list the dependencies in constructor. When the
{@link api/ng.directive:ngController ng-controller} instantiates
the controller it automatically provides the dependencies. There is no need to create
dependencies, look for dependencies, or even get a reference to the injector.
<example module="timeExampleModule">
<file name="index.html">
<div ng-controller="ClockCtrl">
Current time is: {{ time.now }}
</div>
</file>
<file name="script.js">
angular.module('timeExampleModule', []).
// Declare new object call time,
// which will be available for injection
factory('time', function($timeout) {
var time = {};
(function tick() {
time.now = new Date().toString();
$timeout(tick, 1000);
})();
return time;
});
// Notice that you can simply ask for time
// and it will be provided. No need to look for it.
function ClockCtrl($scope, time) {
$scope.time = time;
}
</file>
</example>
<a name="angular_namespace"></a>
# Angular Namespace
To prevent accidental name collision, Angular prefixes names of objects which could potentially
collide with `$`. Please do not use the `$` prefix in your code as it may accidentally collide
with Angular code.
@@ -253,7 +253,7 @@ describe('state', function() {
var mainCtrl = $controller(MainCtrl, {$scope: mainScope});
childScope = mainScope.$new();
var childCtrl = $controller(ChildCtrl, {$scope: childScope});
babyScope = $rootScope.$new();
babyScope = childCtrl.$new();
var babyCtrl = $controller(BabyCtrl, {$scope: babyScope});
}));
@@ -331,11 +331,11 @@ to entry point of your application (e.g. index.html)
### Crawling your app
If you want your AJAX application to be indexed by web crawlers, you rill need to add the following
If you want your AJAX application to be indexed by web crawlers, you will need to add the following
meta tag to the HEAD section of your document:
<pre><meta name="fragment" content="!" /></pre>
This statement causes a crawler to request links with empty `_escaped_fragment_` parameter so that
This statement causes a crawler to request links with an empty `_escaped_fragment_` parameter so that
your server can recognize the crawler and serve it HTML snapshots. For more information about this
technique, see {@link http://code.google.com/web/ajaxcrawling/docs/specification.html Making AJAX
Applications Crawlable}.
@@ -2,12 +2,12 @@
@name Developer Guide: Angular Services: Creating Services
@description
While angular offers several useful services, for any nontrivial application you'll find it useful
While Angular offers several useful services, for any nontrivial application you'll find it useful
to write your own custom services. To do this you begin by registering a service factory function
with a module either via the {@link api/angular.module Module#factory api} or directly
via the {@link api/AUTO.$provide $provide} api inside of module config function.
All angular services participate in {@link di dependency injection (DI)} by registering
All Angular services participate in {@link di dependency injection (DI)} by registering
themselves with Angular's DI system (injector) under a `name` (id) as well as by declaring
dependencies which need to be provided for the factory function of the registered service. The
ability to swap dependencies for mocks/stubs/dummies in tests allows for services to be highly
@@ -76,17 +76,17 @@ angular.module('myModule', [], function($provide) {
# Instantiating Angular Services
All services in Angular are instantiates services lazily, this means that a service will be created
All services in Angular are instantiated lazily. This means that a service will be created
only when it is needed for instantiation of a service or an application component that depends on it.
In other words, angular won't instantiate lazy services unless they are requested directly or
In other words, Angular won't instantiate lazy services unless they are requested directly or
indirectly by the application.
# Services as singletons
Lastly, it is important to realize that all angular services are application singletons. This means
that there is only one instance of a given service per injector. Since angular is lethally allergic
to the global state, it is possible to create multiple injectors, each with its own instance of a
Lastly, it is important to realize that all Angular services are application singletons. This means
that there is only one instance of a given service per injector. Since Angular is lethally allergic
to global state, it is possible to create multiple injectors, each with its own instance of a
given service, but that is rarely needed, except in tests where this property is crucially
important.
@@ -2,7 +2,7 @@
@name Developer Guide: Angular Services: Testing Angular Services
@description
Following is a unit test for the service in the example in {@link
The following is a unit test for the 'notify' service in the 'Dependencies' example in {@link
dev_guide.services.creating_services Creating Angular Services}. The unit test example uses Jasmine
spy (mock) instead of a real browser alert.
@@ -55,7 +55,7 @@ it('should clear messages after alert', function() {
* {@link dev_guide.services.understanding_services Understanding Angular Services}
* {@link dev_guide.services.creating_services Creating Angular Services}
* {@link dev_guide.services.managing_dependencies Managing Service Dependencies}
* {@link dev_guide.services.injecting_controllers Injecting Services Into Conrollers}
* {@link dev_guide.services.injecting_controllers Injecting Services Into Controllers}
## Related API
@@ -9,7 +9,7 @@ Angular sets these CSS classes. It is up to your application to provide useful s
* `ng-invalid`, `ng-valid`
- **Usage:** angular applies this class to an input widget element if that element's input does
notpass validation. (see {@link api/ng.directive:input input} directive).
not pass validation. (see {@link api/ng.directive:input input} directive).
* `ng-pristine`, `ng-dirty`
- **Usage:** angular {@link api/ng.directive:input input} directive applies `ng-pristine` class
@@ -24,7 +24,7 @@ because first the template (which is the uncompiled HTML along with any addition
directives) is compiled on the browser, and second, the compilation step produces a live view. We
say live because any changes to the view are immediately reflected in the model, and any changes in
the model are propagated to the view. This makes the model always the single-source-of-truth for
the application state, greatly simplifying the programing model for the developer. You can think of
the application state, greatly simplifying the programming model for the developer. You can think of
the view as simply an instant projection of your model.
Because the view is just a projection of the model, the controller is completely separated from the
@@ -14,9 +14,6 @@ displaying it to the user. You can pass expressions through a chain of filters l
The expression evaluator simply passes the value of name to
{@link api/ng.filter:uppercase uppercase filter}.
In addition to formatting data, filters can also modify the DOM. This allows filters to handle
tasks such as conditionally applying CSS styles to filtered output.
## Related Topics
@@ -16,7 +16,7 @@ this may seem obvious it usually is very difficult to be able to call an individ
typical project. The reason is that the developers often time mix concerns, and they end up with a
piece of code which does everything. It reads the data from XHR, it sorts it and then it
manipulates the DOM. With angular we try to make it easy for you to do the right thing, and so we
provide dependency injection for your XHR (which you can mock out) and we crated abstraction which
provide dependency injection for your XHR (which you can mock out) and we created abstraction which
allow you to sort your model without having to resort to manipulating the DOM. So that in the end,
it is easy to write a sort function which sorts some data, so that your test can create a data set,
apply the function, and assert that the resulting model is in the correct order. The test does not
+1 -1
View File
@@ -165,7 +165,7 @@ For example:
});
</pre>
Results in code bloat do to the need of temporary variable:
Results in code bloat due to the need of temporary variable:
<pre>
var greeterFactory = function(renamed$window) {
...;
+44 -45
View File
@@ -10,7 +10,7 @@ can be extended such that HTML can be turned into a declarative domain specific
# Invoking directives from HTML
Directives have camel cased names such as 'ngBind'. The directive can be invoked by translating
Directives have camel cased names such as `ngBind`. The directive can be invoked by translating
the camel case name into snake case with these special characters `:`, `-`, or `_`. Optionally the
directive can be prefixed with `x-`, or `data-` to make it HTML validator compliant. Here is a
list of some of the possible directive names: `ng:bind`, `ng-bind`, `ng_bind`, `x-ng-bind` and
@@ -72,9 +72,9 @@ Compilation of HTML happens in three phases:
1. First the HTML is parsed into DOM using the standard browser API. This is important to
realize because the templates must be parsable HTML. This is in contrast to most templating
systems that operate on strings, rather then on DOM elements.
systems that operate on strings, rather than on DOM elements.
2. The compilation of the DOM is performed by the call to {@link api/ng.$compile
2. The compilation of the DOM is performed by the call to the {@link api/ng.$compile
$compile()} method. The method traverses the DOM and matches the directives. If a match is found
it is added to the list of directives associated with the given DOM element. Once all directives
for a given DOM element have been identified they are sorted by priority and their `compile()`
@@ -109,8 +109,8 @@ Compilation of HTML happens in three phases:
## Reasons behind the compile/link separation
At this point you may wonder why is the compile process broken down to a compile and link phase.
To understand this, lets look at a real world example with repeater:
At this point you may wonder why the compile process is broken down to a compile and link phase.
To understand this, let's look at a real world example with repeater:
<pre>
Hello {{user}}, you have these actions:
@@ -125,7 +125,7 @@ The short answer is that compile and link separation is needed any time a change
a change in DOM structure such as in repeaters.
When the above example is compiled, the compiler visits every node and looks for directives. The
`{{user}}` is an example of {@link api/ng.$interpolate interpolation} directive. {@link
`{{user}}` is an example of an {@link api/ng.$interpolate interpolation} directive. {@link
api/ng.directive:ngRepeat ngRepeat} is another directive. But {@link
api/ng.directive:ngRepeat ngRepeat} has a dilemma. It needs to be
able to quickly stamp out new `li`s for every `action` in `user.actions`. This means that it needs
@@ -138,16 +138,16 @@ But compiling on every `li` element clone would be slow, since the compilation r
traverse the DOM tree and look for directives and execute them. If we put the compilation inside a
repeater which needs to unroll 100 items we would quickly run into performance problems.
The solution is to break the compilation process into two phases the compile phase where all of
The solution is to break the compilation process into two phases; the compile phase where all of
the directives are identified and sorted by priority, and a linking phase where any work which
links a specific instance of the {@link api/ng.$rootScope.Scope scope} and the specific
instance of an `li` is performed.
{@link api/ng.directive:ngRepeat ngRepeat} works by preventing the
compilation process form descending into `li` element. Instead the {@link
compilation process form descending into the `li` element. Instead the {@link
api/ng.directive:ngRepeat ngRepeat} directive compiles `li`
seperatly. The result of of the `li` element compilation is a linking function which contains all
of the directives contained in the `li` element ready to be attached to a specific clone of `li`
separately. The result of of the `li` element compilation is a linking function which contains all
of the directives contained in the `li` element, ready to be attached to a specific clone of the `li`
element. At runtime the {@link api/ng.directive:ngRepeat ngRepeat}
watches the expression and as items are added to the array it clones the `li` element, creates a
new {@link api/ng.$rootScope.Scope scope} for the cloned `li` element and calls the
@@ -156,18 +156,18 @@ link function on the cloned `li`.
Summary:
* *compile function* - The compile function is relatively rare in directives, since most
directives are concerned with working with a specific DOM element instance rather then
directives are concerned with working with a specific DOM element instance rather than
transforming the template DOM element. Any operation which can be shared among the instance of
directives should be moved to the compile function for performance reasons.
* *link function* - It is rare for the directive not to have a link function. Link function
* *link function* - It is rare for the directive not to have a link function. A link function
allows the directive to register listeners to the specific cloned DOM element instance as well
as to copy content into the DOM from the scope.
# Writing directives (short version)
In this example we will build a directive which displays the current time.
In this example we will build a directive that displays the current time.
<doc:example module="time">
<doc:source>
@@ -178,12 +178,12 @@ In this example we will build a directive which displays the current time.
angular.module('time', [])
// Register the 'myCurrentTime' directive factory method.
// We inject $defer and dateFilter service since the factory method is DI.
.directive('myCurrentTime', function($defer, dateFilter) {
// We inject $timeout and dateFilter service since the factory method is DI.
.directive('myCurrentTime', function($timeout, dateFilter) {
// return the directive link function. (compile function not needed)
return function(scope, element, attrs) {
var format, // date format
deferId; // deferId, so that we can cancel the time updates
timeoutId; // timeoutId, so that we can cancel the time updates
// used to update the UI
function updateTime() {
@@ -198,8 +198,8 @@ In this example we will build a directive which displays the current time.
// schedule update in one second
function updateLater() {
// save the deferId for canceling
deferId = $defer(function() {
// save the timeoutId for canceling
timeoutId = $timeout(function() {
updateTime(); // update DOM
updateLater(); // schedule another update
}, 1000);
@@ -208,20 +208,18 @@ In this example we will build a directive which displays the current time.
// listen on DOM destroy (removal) event, and cancel the next UI update
// to prevent updating time ofter the DOM element was removed.
element.bind('$destroy', function() {
$defer.cancel(deferId);
$timeout.cancel(timeoutId);
});
updateLater(); // kick of the UI update process.
updateLater(); // kick off the UI update process.
}
});
</script>
<div ng-controller="Ctrl2">
Date format: <input ng-model='format'> <hr/>
Current time is: <span my-current-time="format"></span
Date format: <input ng-model="format"> <hr/>
Current time is: <span my-current-time="format"></span>
</div>
</doc:source>
<doc:scenario>
</doc:scenario>
</doc:example>
@@ -257,7 +255,7 @@ In most cases you will not need such fine control and so the above can be simpli
different parts of this skeleton are explained in following sections. In this section we are
interested only isomers of this skeleton.
The first step in simplyfing the code is to rely on the deafult values. Therefore the above can be
The first step in simplyfing the code is to rely on the default values. Therefore the above can be
simplified as:
<pre>
@@ -273,7 +271,7 @@ simplified as:
});
</pre>
Most directives concern themselves only with instances not with template transformations allowing
Most directives concern themselves only with instances, not with template transformations, allowing
further simplification:
<pre>
@@ -290,7 +288,7 @@ further simplification:
The factory method is responsible for creating the directive. It is invoked only once, when the
{@link api/ng.$compile compiler} matches the directive for the first time. You can
perform any initialization work here. The method is invoked using the {@link
http://localhost:8000/build/docs/api/AUTO.$injector#invoke $injector.invoke} which
api/AUTO.$injector#invoke $injector.invoke} which
makes it injectable following all of the rules of injection annotation.
## Directive Definition Object
@@ -316,8 +314,8 @@ compiler}. The attributes are:
apply for the root of the template since the root of the template always gets a new scope.
* `{}` (object hash) - then a new 'isolate' scope is created. The 'isolate' scope differs from
normal scope that it does not prototypically inherit from the parent scope. This is useful
when creating reusable components, which should not accidentally read or modify data in
normal scope in that it does not prototypically inherit from the parent scope. This is useful
when creating reusable components, which should not accidentally read or modify data in the
parent scope. <br/>
The 'isolate' scope takes an object hash which defines a set of local scope properties
derived from the parent scope. These local properties are useful for aliasing values for
@@ -344,7 +342,7 @@ compiler}. The attributes are:
`scope: { localFn:'increment()' }`, then isolate scope property `localFn` will point to
a function wrapper for the `increment()` expression. Often it's desirable to pass data from
the isolate scope via an expression and to the parent scope, this can be done by passing a
map of local variable names and values into the expression wrapper fn. For example if the
map of local variable names and values into the expression wrapper fn. For example, if the
expression is `increment(amount)` then we can specify the amount value by calling the
`localFn` as `localFn({amount: 22})`.
@@ -383,7 +381,7 @@ compiler}. The attributes are:
the template loading is asynchronous the compilation/linking is suspended until the template
is loaded.
* `replace` - if set to `true` then the template will replace the current element, rather then
* `replace` - if set to `true` then the template will replace the current element, rather than
append the template to the element.
* `transclude` - compile the content of the element and make it available to the directive.
@@ -409,24 +407,24 @@ compiler}. The attributes are:
function compile(tElement, tAttrs, transclude) { ... }
</pre>
Compile function deals with transforming the template DOM. Since most directives do not do
template transformation, it is not used often. Examples which require compile functions are
directives which transform template DOM such as {@link
api/ng.directive:ngRepeat ngRepeat} or load the contents
asynchronously such as {@link api/ng.directive:ngView ngView}. The
compile functions takes the following arguments.
The compile function deals with transforming the template DOM. Since most directives do not do
template transformation, it is not used often. Examples that require compile functions are
directives that transform template DOM, such as {@link
api/ng.directive:ngRepeat ngRepeat}, or load the contents
asynchronously, such as {@link api/ng.directive:ngView ngView}. The
compile function takes the following arguments.
* `tElement` - template element - The element where the directive has been declared. It is
safe to do template transformation on the element and child elements only.
* `tAttrs` - template attributes - Normalized list of attributes declared on this element shared
between all directive compile functions. See {@link
#Attributes Attributes}
guide/directive#Attributes Attributes}.
* `transclude` - A transclude linking function: `function(scope, cloneLinkingFn)`.
NOTE: The template instance and the link instance may not be the same objects if the template has
been cloned. For this reason it is not safe in the compile function to do anything other the DOM
been cloned. For this reason it is not safe in the compile function to do anything other than DOM
transformation that applies to all DOM clones. Specifically, DOM listener registration should be
done in a linking function rather than in a compile function.
@@ -446,7 +444,7 @@ A compile function can have a return value which can be either a function or an
function link(scope, iElement, iAttrs, controller) { ... }
</pre>
Link function is responsible for registering DOM listeners as well as updating the DOM. It is
The link function is responsible for registering DOM listeners as well as updating the DOM. It is
executed after the template has been cloned. This is where most of the directive logic will be
put.
@@ -458,7 +456,8 @@ put.
already been linked.
* `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared
between all directive linking functions. See {@link #Attributes Attributes}
between all directive linking functions. See {@link
guide/directive#Attributes Attributes}.
* `controller` - a controller instance - A controller instance if at least one directive on the
element defines a controller. The controller is shared among all the directives, which allows
@@ -478,11 +477,11 @@ Executed after the child elements are linked. Safe to do DOM transformation in h
<a name="Attributes"></a>
## Attributes
The attributes object - passed as a parameter in the link() or compile() functions - is a way of
accessing:
The {@link api/ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the
link() or compile() functions - is a way of accessing:
* *normalized attribute names:* Since a directive such as 'ngBind' can be expressed in many ways
sucha s as 'ng:bind', or 'x-ng-bind', the attributes object allows for a normalize accessed to
such as 'ng:bind', or 'x-ng-bind', the attributes object allows for normalized accessed to
the attributes.
* *directive inter-communication:* All directives share the same instance of the attributes
@@ -577,7 +576,7 @@ To solve the issue of lack of isolation, the directive declares a new `isolated`
isolated scope does not prototypically inherit from the child scope, and therefore we don't have
to worry about accidentally clobbering any properties.
However 'isolated' scope creates a new problem: if a transcluded DOM is a child of the widget
However `isolated` scope creates a new problem: if a transcluded DOM is a child of the widget
isolated scope then it will not be able to bind to anything. For this reason the transcluded scope
is a child of the original scope, before the widget created an isolated scope for its local
variables. This makes the transcluded and widget isolated scope siblings.
+1 -1
View File
@@ -3,7 +3,7 @@
@description
Expressions are JavaScript-like code snippets that are usually placed in bindings such as `{{
expression }}`. Expressions are process by the {@link api/ng.$parse $parse}
expression }}`. Expressions are processed by {@link api/ng.$parse $parse}
service.
For example, these are all valid expressions in angular:
+3 -3
View File
@@ -186,10 +186,10 @@ To get a hold of the controller the directive specifies a dependency as shown in
The validation can occur in two places:
* **Model to View update** -
Whenever the bound model changes, all functions in {@link api/ng.directive:ngModel.NgModelController#$formatters NgModelController#$formatters} array are pipe-lined, so that each of these functions has an opportunity to format the value and change validity state of the form control through {@link api/ng.directive:ngModel.NgModelController#$setValidity NgModelController#$setValidity}.
Whenever the bound model changes, all functions in {@link api/ng.directive:ngModel.NgModelController#$formatters NgModelController#$formatters} array are pipe-lined, so that each of these functions has an opportunity to format the value and change validity state of the form control through {@link api/ng.directive:ngModel.NgModelController#$setValidity NgModelController#$setValidity}.
* **View to Model update** -
In a similar way, whenever a user interacts with a control, the controll calls {@link api/ng.directive:ngModel.NgModelController#$setViewValue NgModelController#$setViewValue}.
In a similar way, whenever a user interacts with a control it calls {@link api/ng.directive:ngModel.NgModelController#$setViewValue NgModelController#$setViewValue}.
This in turn pipelines all functions in {@link api/ng.directive:ngModel.NgModelController#$parsers NgModelController#$parsers} array, so that each of these functions has an opportunity to convert the value and change validity state of the form control through {@link api/ng.directive:ngModel.NgModelController#$setValidity NgModelController#$setValidity}.
In the following example we create two directives.
@@ -300,7 +300,7 @@ The following example shows how to add two-way data-binding to contentEditable e
});
// model -> view
ctrl.render = function(value) {
ctrl.$render = function(value) {
elm.html(value);
};
+16 -12
View File
@@ -12,10 +12,14 @@ on IE v8.0 or earlier.
To make your angular application work on IE please make sure that:
1. you **do not** use custom element tags such as `<ng:view>` (use the attribute version `<div
ng-view>` instead), or
1. You polyfill JSON.stringify if necessary (IE7 will need this). You can use
[JSON2](https://github.com/douglascrockford/JSON-js) or
[JSON3](http://bestiejs.github.com/json3/) polyfills for this.
2. if you **do use** custom element tags, then you must take these steps to make IE happy:
2. you **do not** use custom element tags such as `<ng:view>` (use the attribute version
`<div ng-view>` instead), or
3. if you **do use** custom element tags, then you must take these steps to make IE happy:
<pre>
<html xmlns:ng="http://angularjs.org">
@@ -25,7 +29,7 @@ To make your angular application work on IE please make sure that:
document.createElement('ng-include');
document.createElement('ng-pluralize');
document.createElement('ng-view');
// Optionally these for CSS
document.createElement('ng:include');
document.createElement('ng:pluralize');
@@ -41,7 +45,7 @@ To make your angular application work on IE please make sure that:
The **important** parts are:
* `xmlns:ng` - *namespace* - you need one namespace for each custom tay you are planning on
* `xmlns:ng` - *namespace* - you need one namespace for each custom tag you are planning on
using.
* `document.createElement(yourTagName)` - *creation of custom tag names* - Since this is an
@@ -52,7 +56,7 @@ The **important** parts are:
# Long Version
IE has an issues with element tag names which are not standard HTML tag names. These fall into two
IE has issues with element tag names which are not standard HTML tag names. These fall into two
categories, and each category has its own fix.
* If the tag name starts with `my:` prefix than it is considered an XML namespace and must
@@ -61,13 +65,13 @@ categories, and each category has its own fix.
* If the tag has no `:` but it is not a standard HTML tag, then it must be pre-created using
`document.createElement('my-tag')`
* If you have are planning on styling the custom tag with CSS selectors, then it must be
* If you are planning on styling the custom tag with CSS selectors, then it must be
pre-created using `document.createElement('my-tag')` regardless of XML namespace.
## The Good News
The good news is that these restrictions only apply to element tag names, and not to element
The good news is that these restrictions only apply to element tag names, and not to element
attribute names. So this requires no special handling in IE: `<div my-tag your:tag></div>`.
@@ -84,7 +88,7 @@ result):
</html>
</pre>
It should pares into the following DOM:
It should parse into the following DOM:
<pre>
#document
@@ -118,12 +122,12 @@ In IE, the behavior is that the `BODY` element has three children:
3. A corrupt self closing `/mytag`. This is corrupt since element names are not allowed to have
the `/` character. Furthermore this closing element should not be part of the DOM since it is
only used to delimitate the structure of the DOM.
only used to delineate the structure of the DOM.
## CSS Styling of Custom Tag Names
The to make CSS selector work with custom elements the custom element name must be shived with the
To make CSS selectors work with custom elements, the custom element name must be pre-created with
`document.createElement('my-tag')` regardless of XML namespace.
<pre>
@@ -133,7 +137,7 @@ The to make CSS selector work with custom elements the custom element name must
<script>
// needed to make ng-include parse properly
document.createElement('ng-include');
// needed to enable CSS reference
document.createElement('ng:view');
</script>
-30
View File
@@ -10,33 +10,3 @@ of the following documents before returning here to the Developer Guide:
* {@link misc/started Getting Started}
* {@link tutorial/index Angular Tutorial}
<hr>
## {@link overview Overview of Angular}
## {@link bootstrap Initializing Angular}
## {@link dev_guide.mvc About MVC in Angular}
* {@link dev_guide.mvc.understanding_model Understanding the Model Component}
* {@link dev_guide.mvc.understanding_controller Understanding the Controller Component}
* {@link dev_guide.mvc.understanding_view Understanding the View Component}
## {@link scope Angular Scope Objects}
## {@link compiler Angular HTML Compiler}
## {@link dev_guide.templates Angular Templates}
* {@link dev_guide.templates.filters Understanding Angular Filters}
* {@link forms Understanding Angular Forms}
## {@link dev_guide.services Angular Services}
* {@link dev_guide.services.understanding_services Understanding Angular Services}
* {@link dev_guide.services.creating_services Creating Angular Services}
* {@link dev_guide.services.managing_dependencies Managing Service Dependencies}
* {@link dev_guide.services.testing_services Testing Angular Services}
## {@link di About Dependency Injection}
+4 -4
View File
@@ -27,15 +27,15 @@ Important things to notice:
* Notice the reference to the `myApp` module in the `<html ng-app="myApp">`, it is what
bootstraps the app using your module.
<doc:example module='simpleApp'>
<doc:example module='myApp'>
<doc:source>
<script>
// declare a module
var simpleAppModule = angular.module('simpleApp', []);
var simpleAppModule = angular.module('myApp', []);
// configure the module.
// in this example we will create a greeting filter
simpleAppModule.filter('greet', function() {
myAppModule.filter('greet', function() {
return function(name) {
return 'Hello, ' + name + '!';
};
@@ -139,7 +139,7 @@ angular.module('myModule', []).
// This is an example of a run block.
// You can have as many of these as you want.
// You can only inject instances (not Providers)
// int the run blocks
// into the run blocks
});
</pre>
+25 -26
View File
@@ -11,22 +11,22 @@ succinctly. Out of the box, it eliminates much of the code you currently write t
binding and dependency injection. And it all happens in JavaScript within the browser making it an
ideal partner with any server technology.
Angular is what HTML would have been had it been design for applications. HTML is a great
Angular is what HTML would have been had it been designed for applications. HTML is a great
declarative language for static documents. It does not contain much in the way of creating
application, and as a result building web-applications is an exercise in *what do I have to do, so
applications, and as a result building web applications is an exercise in *what do I have to do, so
that I trick the browser in to doing what I want.*
Impedance mismatch between dynamic-applications and static-documents are often solved as:
Impedance mismatch between dynamic applications and static documents are often solved as:
* **library** - a collection of functions which are useful when writing web apps. Your code is
in charge and it calls into the library when it sees fit. i.e.: `jQuery`
* **frameworks** - a particular implementation of a web-application, where your code fills in
in charge and it calls into the library when it sees fit. E.g., `jQuery`.
* **frameworks** - a particular implementation of a web application, where your code fills in
the details. The framework is in charge and it calls into your code when it needs something
app specific. i.e.: `knockout`, `sproutcore`, etc...
app specific. E.g., `knockout`, `sproutcore`, etc.
Angular takes another approach. It attempts to minimize the impedance mismatch between document
centric HTML and what application needs by creating new HTML constructs. Angular teaches the
centric HTML and what an application needs by creating new HTML constructs. Angular teaches the
browser new syntax through a construct we call directives. Examples include:
* Data binding as in `{{}}`.
@@ -39,13 +39,13 @@ browser new syntax through a construct we call directives. Examples include:
## End-to-end solution
Angular tries to be an end to end solution, when building a web-application. This means it is
not a single piece in an overall puzzle of building a web-application, but an end-to-end solution.
Angular tries to be an end-to-end solution, when building a web application. This means it is
not a single piece in an overall puzzle of building a web application, but an end-to-end solution.
This makes Angular opinionated about how a CRUD application should be built. But while it is
opinionated, it also tries to make sure that its opinion is just a starting point, which you can
easily change. Angular comes with the following out-of-the-box:
* Everything you need to build a CRUD app in a cohesive set: Data-binding, basic templating
* Everything you need to build a CRUD app in a cohesive set: data-binding, basic templating
directives, form validation, routing, deep-linking, reusable components, dependency injection.
* Testability story: unit-testing, end-to-end testing, mocks, test harnesses.
* Seed application with directory layout and test scripts as a starting point.
@@ -53,9 +53,9 @@ easily change. Angular comes with the following out-of-the-box:
## Angular Sweet Spot
Angular simplifies the application development by presenting a higher level of abstraction to the
Angular simplifies application development by presenting a higher level of abstraction to the
developer. Like any abstraction, it comes at a cost of flexibility. In other words not every app
is a good fit for Angular. Angular was built for the CRUD application in mind, luckily CRUD
is a good fit for Angular. Angular was built for the CRUD application in mind. Luckily CRUD
applications represent at least 90% of the web applications. But to understand what Angular is
good at one also has to understand when an app is not a good fit for Angular.
@@ -67,7 +67,7 @@ using something closer to bare metal such as `jQuery` may be a better fit.
# An Introductory Angular Example
Below is a typical CRUD application which contains a form. The form values are validated, and
are used to compute the total, which is formatted to a particular local. These are some common
are used to compute the total, which is formatted to a particular locale. These are some common
concepts which the application developer may face:
* attaching data-model to the UI.
@@ -112,14 +112,14 @@ Try out the Live Preview above, and then let's walk through the example and desc
on.
In the `<html>` tag, we specify that it is an angular
application with the `ng-app` directive. The `ng-app' will cause the angular to {@link
application with the `ng-app` directive. The `ng-app` will cause Angular to {@link
bootstrap auto initialize} your application.
<html ng-app>
We load the angular using the `<script>` tag:
We load Angular using the `<script>` tag:
<script src="http://code.angularjs.org/angular-?.?.?.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/?.?.?/angular.min.js"></script>
From the `ng-model` attribute of the `<input>` tags, angular automatically sets up two-way data
binding, and we also demonstrate some easy input validation:
@@ -134,25 +134,25 @@ These input widgets look normal enough, but consider these points:
Model-View-Controller design pattern.
* Note that the HTML widget {@link api/ng.directive:input input}
has special powers. The input invalidates itself by turning red when you enter invalid data or
leave the the input fields blank. These new widget behavior make it easier to implement field
leave the the input fields blank. These new widget behaviors make it easier to implement field
validation common in CRUD applications.
And finally, the mysterious `{{ double curly braces }}`:
Total: {{qty * cost | currency}}
This notation, `{{ _expression_ }}`, is angular markup for data-binding. The expression itself can
This notation, `{{ _expression_ }}`, is Angular markup for data-binding. The expression itself can
be a combination of both an expression and a {@link dev_guide.templates.filters filter}: `{{
expression | filter }}`. Angular provides filters for formatting display data.
In the example above, the expression in double-curly braces directs angular to "Bind the data we
In the example above, the expression in double-curly braces directs Angular to "bind the data we
got from the input widgets to the display, multiply them together, and format the resulting number
into output that looks like money."
Notice that we achieved this application behavior not by calling angular methods, nor by
implementing application specific behavior as framework. We achieved the behavior because the
browser behaved more in line what is needed for dynamic web-application rather then what is needed
for static-document. Angular has lowered the impedance mismatch to the point where no
Notice that we achieved this application behavior not by calling Angular methods, nor by
implementing application specific behavior as a framework. We achieved the behavior because the
browser behaved more in line with what is needed for a dynamic web application rather then what is
needed for a static document. Angular has lowered the impedance mismatch to the point where no
library/framework calls are needed.
@@ -184,7 +184,7 @@ Angular frees you from the following pain:
* **Manipulating HTML DOM programmatically:** Manipulating HTML DOM is a cornerstone of AJAX
applications, but it's cumbersome and error-prone. By declaratively describing how the UI
should change as your application state changes, you are freed from low level DOM manipulation
tasks. Most applications written with angular never have to programmatically manipulate the
tasks. Most applications written with Angular never have to programmatically manipulate the
DOM, although you can if you want to.
* **Marshaling data to and from the UI:** CRUD operations make up the majority of AJAX
applications. The flow of marshaling data from the server to an internal object to an HTML
@@ -202,7 +202,6 @@ Angular frees you from the following pain:
# Watch a Presentation About Angular
Here is an early presentation on angular, but note that substantial development has occurred since
the talk was given in July of 2010.
Here is a presentation on Angular from May 2012.
<iframe width="560" height="315" src="http://www.youtube.com/embed/bfrn5VNpwsg" frameborder="0" allowfullscreen></iframe>
+10 -10
View File
@@ -28,7 +28,7 @@ watch {@link guide/expression expressions} and propagate events.
## Scope as Data-Model
Scope is the glue between application controller and the view. During the template {@link compiler
linking} phase the {@link api/ng.$compileProvider.directive directives} set up
linking} phase the {@link api/ng.$compileProvider#directive directives} set up
{@link api/ng.$rootScope.Scope#$watch `$watch`} expressions on the scope. The
`$watch` allows the directives to be notified of property changes, which allows the directive to
render the updated value to the DOM.
@@ -222,7 +222,7 @@ The normal flow of browser receiving an event is that it executes a correspondin
callback. Once the callback completes the browser re-renders the DOM and returns to waiting for
more events.
When the browser calls into JavaScript the code executes outside they Angular execution context,
When the browser calls into JavaScript the code executes outside the Angular execution context,
which means that Angular is unaware of model modifications. To properly process model
modifications the execution has to enter the Angular execution context using the {@link
api/ng.$rootScope.Scope#$apply `$apply`} method. Only model modifications which
@@ -231,9 +231,9 @@ directive listens on DOM events, such as {@link
api/ng.directive:ngClick `ng-click`} it must evaluate the
expression inside the `$apply` method.
After evaluating the expression `$apply` method performs a {@link
api/ng.$rootScope.Scope#$digest `$digest`}. In $digest phase the scope examines all
of the `$watch` expressions and compares them with previous value. This dirty checking, is done
After evaluating the expression, the `$apply` method performs a {@link
api/ng.$rootScope.Scope#$digest `$digest`}. In the $digest phase the scope examines all
of the `$watch` expressions and compares them with the previous value. This dirty checking is done
asynchronously. This means that assignment such as `$scope.username="angular"` will not
immediately cause a `$watch` to be notified, instead the `$watch` notification is delayed until
the `$digest` phase. This delay is desirable, since it coalesces multiple model updates into one
@@ -250,13 +250,13 @@ the `$digest` phase. This delay is desirable, since it coalesces multiple model
2. **Watcher registration**
During template linking directives register {@link
api/ng.$rootScope.Scope#$watch watches} on the scope. This watches will be
api/ng.$rootScope.Scope#$watch watches} on the scope. These watches will be
used to propagate model values to the DOM.
3. **Model mutation**
For mutations to be properly observed, you should make them only within the {@link
api/ng.$rootScope.Scope#$apply scope.$apply()}. (Angular apis do this
api/ng.$rootScope.Scope#$apply scope.$apply()}. (Angular APIs do this
implicitly, so no extra `$apply` call is needed when doing synchronous work in controllers,
or asynchronous work with {@link api/ng.$http $http} or {@link
api/ng.$timeout $timeout} services.
@@ -279,10 +279,10 @@ the `$digest` phase. This delay is desirable, since it coalesces multiple model
### Scopes and Directives
During the compilation phase, the {@link compiler compiler} matches {@link
api/ng.$compileProvider.directive directives} against the DOM template. The directives
api/ng.$compileProvider#directive directives} against the DOM template. The directives
usually fall into one of two categories:
- Observing {@link api/ng.$compileProvider.directive directives}, such as
- Observing {@link api/ng.$compileProvider#directive directives}, such as
double-curly expressions `{{expression}}`, register listeners using the {@link
api/ng.$rootScope.Scope#$watch $watch()} method. This type of directive needs
to be notified whenever the expression changes so that it can update the view.
@@ -299,7 +299,7 @@ correctly.
### Directives that Create Scopes
In most cases, {@link api/ng.$compileProvider.directive directives} and scopes interact
In most cases, {@link api/ng.$compileProvider#directive directives} and scopes interact
but do not create new instances of scope. However, some directives, such as {@link
api/ng.directive:ngController ng-controller} and {@link
api/ng.directive:ngRepeat ng-repeat}, create new child scopes
+53 -36
View File
@@ -4,54 +4,68 @@
#FAQ
### Why is this project called "angular"? Why is the namespace called "ng"?
### Why is this project called "AngularJS"? Why is the namespace called "ng"?
Because HTML has angular brackets and "ng" sounds like "angular".
Because HTML has Angular brackets and "ng" sounds like "Angular".
### Is <angular/> an HTML5 tag?
No, <angular/> is not an HTML5 tag. angular is an orthogonal project to HTML5; you can use the two
together.
### Is AngularJS a library, framework, plugin or a browser extension?
### Is angular a {library, framework, DOM manipulation library, widget library, native plugin}?
AngularJS fits the definition of a framework the best, even though it's much more lightweight than
a typical framework and that's why many confuse it with a library.
No, angular is none of these. You don't call its functions, it does not call your functions,
it does not provide a way to manipulate DOM, but does provide primitives to create UI projections
of your data. There are lots of existing widget libraries which you can integrate with angular.
It is 100% JavaScript, 100% client side and compatible with both desktop and mobile browsers.
AngularJS is 100% JavaScript, 100% client side and compatible with both desktop and mobile browsers.
So it's definitely not a plugin or some other native browser extension.
### Do I need to worry about security holes in angular?
Like with any technology, angular is not impervious to attack. angular does, however, provide
built-in protection from basic security holes including cross-site scripting and HTML injection
attacks. angular does round-trip escaping on all strings for you.
### Is AngularJS a templating system?
### Can I download the source, build, and host the angular environment locally?
Yes. See instructions in {@link downloading}.
### Is angular a templating system?
At the highest level, angular does look like a just another templating system. But there is one
important reason why angular templating system is different and makes it very good fit for
application development: bidirectional data binding. The template is compiled on the browser and
the compilation step produces a live view. This means you, the developer, don't need to write
At the highest level, Angular does look like a just another templating system. But there is one
important reason why Angular templating system is different and makes it very good fit for
application development: bidirectional data binding. The template is compiled in the browser and
the compilation step produces a live view. This means you, the developers, don't need to write
code to constantly sync the view with the model and the model with the view as in other
templating systems.
### Do I need to worry about security holes in AngularJS?
Like with any technology, AngularJS is not impervious to attack. angular does, however, provide
built-in protection from basic security holes including cross-site scripting and HTML injection
attacks. AngularJS does round-trip escaping on all strings for you and even offers XSRF protection
for server-side communication.
AngularJS was designed to be compatible with other security measures like Content Security Policy
(CSP), HTTPS (SSL/TLS) and server-side authentication and authorization that greatly reduce the
possible attack vectors and we highly recommended their use.
### Can I download the source, build, and host the AngularJS environment locally?
Yes. See instructions in {@link downloading}.
### What browsers does angular work with?
Webkit-based browsers (Safari, Chrome, iPhone, Android, WebOS, BlackBerry 6), Firefox, IE6 and
above. Note that CSS only works on IE7 and above.
Our we run our extensive test suite against the following browsers: Safari, Chrome, Firefox, Opera,
IE8, IE9 and mobile browsers (Android, Chrome Mobile, iOS Safari).
### What's angular's performance like?
angular takes ~300ms to load, render, and compile. In Chrome it uses about 2-5MB of memory. Your
app's performance will vary depending on how many bindings you use.
### What's Angular's performance like?
### How big is the angular bootstrap JS file that I need to include?
The startup time heavily depends on your network connection, state of the cache, browser used and
available hardware, but typically we measure bootstrap time in tens or hundreds of milliseconds.
The runtime performance will vary depending on the number and complexity of bindings on the page
as well as the speed of your backend (for apps that fetch data from the backend). Just for an
illustration we typically build snappy apps with hundreds or thousands of active bindings.
### How big is the angular.js file that I need to include?
The size of the file is < 29KB compressed and minified.
The size of the library itself is < 50KB compressed and obfuscated.
### Can I use the open-source Closure Library with angular?
@@ -60,22 +74,25 @@ in angular.
### Does angular use the jQuery library?
Yes, angular uses {@link http://jquery.com/ jQuery}, the open source DOM manipulation library.
If jQuery is not present in your script path, angular falls back on its own implementation of
{@link api/angular.element jQuery lite}. If jQuery is present in the path, angular uses it to
manipulate the DOM.
Yes, Angular can use {@link http://jquery.com/ jQuery} if it's present in your app when the
application is being bootstrapped. If jQuery is not present in your script path, Angular falls back
to its own implementation of the subset of jQuery that we call {@link api/angular.element jQLite}.
### What is testability like in angular?
Very testable. It has an integrated dependency injection framework. See
Very testable and designed this way from ground up. It has an integrated dependency injection
framework, provides mocks for many heavy dependencies (server-side communication). See
{@link api/ng service} for details.
### How can I learn more about angular?
Watch the July 28, 2010 talk
"{@link http://www.youtube.com/watch?v=elvcgVSynRg| Angular: A Radically Different Way of Building
AJAX Apps}".
### How is angular licensed?
The MIT License.
+24 -129
View File
@@ -2,142 +2,37 @@
@name Getting Started
@description
# Hello World!
We want you to have an easy time while starting to use Angular. We've put together the following steps on your path to
becoming an Angular expert.
A great way for you to get started with AngularJS is to create the tradtional
"Hello World!" app:
1. In your favorite text editor, create an HTML file
(for example, `helloworld.html`).
2. From the __Source__ box below, copy and paste the code into your HTML file.
(Double-click on the source to easily select all.)
3. Open the file in your web browser.
<doc:example>
<doc:source>
Hello {{'World'}}!
</doc:source>
</doc:example>
The resulting web page should look something like the following:
<img class="center" src="img/helloworld.png" border="1">
Now let's take a closer look at that code, and see what is going on behind
the scenes.
The `ng-app` tags tells angular to process the entire HTML page and bootstrap the app when the page
is loaded:
<pre>
<html ng-app>
</pre>
The next line downloads the angular script:
<pre>
<script src="http://code.angularjs.org/angular-?.?.?.min.js"></script>
</pre>
(For details on what happens when angular processes an HTML page,
see {@link guide/bootstrap Bootstrap}.)
Finally, this line in the `<body>` of the page is the template that describes
how to display our greeting in the UI:
<pre>
Hello {{'World'}}!
</pre>
Note the use of the double curly brace markup (`{{ }}`) to bind the expression to
the greeting text. Here the expression is the string literal 'World'.
Next let's look at a more interesting example, that uses AngularJS to
bind a dynamic expression to our greeting text.
# Hello AngularJS World!
This example demonstrates angular's two-way data binding:
1. Edit the HTML file you created in the "Hello World!" example above.
2. Replace the contents of `<body>` with the code from the __Source__ box below.
3. Refresh your browser window.
<doc:example>
<doc:source>
Your name: <input type="text" ng-model="yourname" placeholder="World">
<hr>
Hello {{yourname || 'World'}}!
</doc:source>
</doc:example>
After the refresh, the page should look something like this:
<img class="left" src="img/helloworld_2way.png" border="1" >
These are some of the important points to note from this example:
* The text input {@link guide/directive directive}
is bound to a model variable called `yourname`.
* The double curly braces notation binds the `yourname` model to the greeting text.
* You did not need to explicitly register an event listener or define an event handler for events!
Now try typing your name into the input box, and notice the immediate change to
the displayed greeting. This demonstrates the concept of angular's
{@link guide/dev_guide.templates.databinding bi-directional data binding}. Any changes to the input
field are immediately
reflected in the model (one direction), and any changes to the model are
reflected in the greeting text (the other direction).
1. Read the {@link guide/concepts conceptual overview}.<br/>Understand Angular's vocabulary and how all the Angular
components work together.
1. Do the {@link tutorial/ AngularJS Tutorial}.<br/>Walk end-to-end through building and application complete with tests
on top of a node.js web server. Covers every major AngularJS feature and show you how to set up your development
environment.
1. Download or clone the {@link https://github.com/angular/angular-seed Seed App project template}.<br/>Gives you a
starter app with a directory layout, test harness, and scripts to begin building your application.
# Anatomy Of An Angular App
#Further Steps
This section describes the 3 parts of an angular app, and explains how they map to the
Model-View-Controller design pattern:
##Watch Videos
## Templates
If you havent had a chance to watch the videos from the homepage, please check out:
* {@link http://www.youtube.com/watch?v=WuiHuZq_cg4&list=PL173F1A311439C05D&context=C48ac877ADvjVQa1PpcFONnl4Q5x8hqvT6tRBTE-m0-Ym47jO3PEE%3D Introduction to AngularJS}
* {@link http://www.youtube.com/watch?v=Yg-R1gchccg&list=PL173F1A311439C05D&context=C48ac877ADvjVQa1PpcFONnl4Q5x8hqvT6tRBTE-m0-Ym47jO3PEE%3D Creating Directives}
* {@link http://www.youtube.com/watch?v=IRelx4-ISbs&list=PL173F1A311439C05D&context=C48ac877ADvjVQa1PpcFONnl4Q5x8hqvT6tRBTE-m0-Ym47jO3PEE%3D Communicating with Servers}
Templates, which you write in HTML and CSS, serve as the View. You add elements, attributes, and
markup to HTML, which serve as instructions to the angular compiler. The angular compiler is fully
extensible, meaning that with angular you can build your own declarative language on top of HTML!
And visit our {@link http://www.youtube.com/user/angularjs YouTube channel} for more AngularJS video presentations and
tutorials.
##Subscribe
## Application Logic and Behavior
* Subscribe to the {@link http://groups.google.com/forum/?fromgroups#!forum/angular mailing list}. Ask questions here!
* Follow us on {@link https://twitter.com/intent/follow?original_referer=http%3A%2F%2Fangularjs.org%2F&region=follow_link&screen_name=angularjs&source=followbutton&variant=2.0 Twitter}
* Add us to your circles on {@link https://plus.google.com/110323587230527980117/posts Google+}
Application Logic and Behavior, which you define in JavaScript, serve as the Controller. With
angular (unlike with standard AJAX applications) you don't need to write additional listeners or
DOM manipulators, because they are built-in. This feature makes your application logic very easy to
write, test, maintain, and understand.
##Read more
## Data
The Model is referenced from properties on {@link guide/scope angular scope objects}.
The data in your model could be Javascript objects, arrays, or primitives, it doesn't matter. What
matters is that these are all referenced by the scope object.
Angular employs scopes to keep your data model and your UI in sync. Whenever something occurs to
change the state of the model, angular immediately reflects that change in the UI, and vice versa.
The following illustration shows the parts of an angular application and how they work together:
<img class="left" src="img/angular_parts.png" border="0" />
In addition, angular comes with a set of Services, which have the following properties:
* The services provided are very useful for building web applications.
* You can extend and add application-specific behavior to services.
* Services include Dependency-Injection, XHR, caching, URL routing, and browser abstraction.
# Where To Go Next
* If you like what you've learned so far, you should definitely check out our awesome {@link
tutorial/ Tutorial}, which walks you through the process of building real apps with AngularJS.
* For further explanations and examples of the AngularJS concepts presented on this page, see the
{@link guide/index Developer Guide}.
* For additional hands-on examples of using AngularJS, including more source code that you can
copy and paste into your own pages, take a look through the {@link cookbook/ Cookbook}.
The AngularJS documentation includes the {@link guide/index Developer Guide} covering concepts and the
{@link api/ API Reference} for syntax and usage.
+1 -1
View File
@@ -32,7 +32,7 @@ When you finish the tutorial you will be able to:
The tutorial guides you through the entire process of building a simple application, including
writing and running unit and end-to-end tests. Experiments at the end of each step provide
suggestions for you learn more about AngularJS and the application you are building.
suggestions for you to learn more about AngularJS and the application you are building.
You can go through the whole tutorial in a couple of hours or you may want to spend a pleasant day
really digging into it. If you're looking for a shorter introduction to AngularJS, check out the
+6 -5
View File
@@ -173,10 +173,11 @@ __`app/index.html`:__
<html ng-app>
The `ng-app` attribute is represents an Angular directive used to flag an element which Angular
should consider to be the root element of our application. This gives application developers the
freedom to tell Angular if the entire html page or only a portion of it should be treated as the
Angular application.
The `ng-app` attribute is represents an Angular directive (named `ngApp`; Angular uses
`name-with-dashes` for attribute names and `camelCase` for the corresponding directive name)
used to flag an element which Angular should consider to be the root element of our application.
This gives application developers the freedom to tell Angular if the entire html page or only a
portion of it should be treated as the Angular application.
* AngularJS script tag:
@@ -195,7 +196,7 @@ being the element on which the `ngApp` directive was defined.
This line demonstrates the core feature of Angular's templating capabilities a binding, denoted
by double-curlies `{{ }}` as well as a simple expression `'yet' + '!'` used in this binding.
The binding tells Angular, that it should evaluate an expression and insert the result into the
The binding tells Angular that it should evaluate an expression and insert the result into the
DOM in place of the binding. Rather than a one-time insert, as we'll see in the next steps, a
binding will result in efficient continuous updates whenever the result of the expression
evaluation changes.
+1 -1
View File
@@ -100,7 +100,7 @@ as follows:
on the `<body>` tag.
* The phone data is then attached to the *scope* (`$scope`) that was injected into our controller
function. The controller scope is a prototypically descendant of the root scope that was created
function. The controller scope is a prototypical descendant of the root scope that was created
when the application bootstrapped. This controller scope is available to all bindings located within
the `<body ng-controller="PhoneListCtrl">` tag.
+12 -10
View File
@@ -56,12 +56,12 @@ __`app/index.html`:__
We added a standard HTML `<input>` tag and used angular's
{@link api/ng.filter:filter $filter} function to process the input for the
`ngRepeate` directive.
{@link api/ng.directive:ngRepeat ngRepeat} directive.
This lets a user enter search criteria and immediately see the effects of their search on the phone
list. This new code demonstrates the following:
* Data-binding. This is one of the core features in Angular. When the page loads, Angular binds the
* Data-binding: This is one of the core features in Angular. When the page loads, Angular binds the
name of the input box to a variable of the same name in the data model and keeps the two in sync.
In this code, the data that a user types into the input box (named __`query`__) is immediately
@@ -71,7 +71,7 @@ the DOM to reflect the current state of the model.
<img class="diagram" src="img/tutorial/tutorial_03.png">
* Use of `filter` filter. The {@link api/ng.filter:filter filter} function uses the
* Use of the `filter` filter: The {@link api/ng.filter:filter filter} function uses the
`query` value to create a new array that contains only those records that match the `query`.
`ngRepeat` automatically updates the view in response to the changing number of phones returned
@@ -148,9 +148,9 @@ and title elements:
<html ng-app ng-controller="PhoneListCtrl">
Be sure to *remove* the `ng-controller` declaration from the body element.
Be sure to __remove__ the `ng-controller` declaration from the body element.
While using double curlies works fine in within the title element, you might have noticed that
While using double curlies works fine within the title element, you might have noticed that
for a split second they are actually displayed to the user while the page is loading. A better
solution would be to use the {@link api/ng.directive:ngBind
ngBind} or {@link api/ng.directive:ngBindTemplate
@@ -176,12 +176,14 @@ ngBindTemplate} directives, which are invisible to the user while the page is lo
Refresh the browser tab with the end-to-end test runner to see the test fail. To make the test
pass, edit the `index.html` template to add a `div` or `p` element with `id` `"status"` and content
with the `query` binding.
with the `query` binding, prefixed by "Current filter:". For instance:
* Add a `pause()` statement into an end-to-end test and rerun it. You'll see the runner pause; this
gives you the opportunity to explore the state of your application while it is displayed in the
browser. The app is live! You can change the search query to prove it. Notice how useful this is
for troubleshooting end-to-end tests.
<div id="status">Current filter: {{query}}</div>
* Add a `pause()` statement inside of an end-to-end test and rerun it. You'll see the runner pause;
this gives you the opportunity to explore the state of your application while it is displayed in
the browser. The app is live! You can change the search query to prove it. Notice how useful this
is for troubleshooting end-to-end tests.
# Summary
+2 -2
View File
@@ -63,7 +63,7 @@ necessary!
## Controller
__`app/js/controller.js`:__
__`app/js/controllers.js`:__
<pre>
function PhoneListCtrl($scope) {
$scope.phones = [
@@ -103,7 +103,7 @@ to the model.
The changes we made should be verified with both a unit test and an end-to-end test. Let's look at
the unit test first.
__`test/unit/controllerSpec.js`:__
__`test/unit/controllersSpec.js`:__
<pre>
describe('PhoneCat controllers', function() {
+6 -6
View File
@@ -22,7 +22,7 @@ GitHub}:
## Data
The `app/phones/phone.json` file in your project is a dataset that contains a larger list of phones
The `app/phones/phones.json` file in your project is a dataset that contains a larger list of phones
stored in the JSON format.
Following is a sample of the file:
@@ -104,7 +104,7 @@ to avoid any possible naming collisions.
Since angular infers the controller's dependencies from the names of arguments to the controller's
constructor function, if you were to {@link http://en.wikipedia.org/wiki/Minification_(programming)
minify} the JavaScript code for `PhoneListCtrl` controller, all of its function arguments would be
minified as well, and the dependency injector would not being able to identify services correctly.
minified as well, and the dependency injector would not be able to identify services correctly.
To overcome issues caused by minification, just assign an array with service identifier strings
into the `$inject` property of the controller function, just like the last line in the snippet
@@ -164,15 +164,15 @@ isolated from the work done in other tests.
* We created a new scope for our controller by calling `$rootScope.$new()`
* We called `scope.$new(PhoneListCtrl)` to get Angular to create the child scope associated with
the `PhoneListCtrl` controller.
* We called the injected `$controller` function passing the `PhoneListCtrl` function and the created
scope as parameters.
Because our code now uses the `$http` service to fetch the phone list data in our controller, before
we create the `PhoneListCtrl` child scope, we need to tell the testing harness to expect an
incoming request from the controller. To do this we:
* Request `$httpBackend` service to be injected into our `beforeEach` function. This is a mock
mock version of the service that in production environment facilitates all XHR and JSONP requests.
version of the service that in a production environment facilitates all XHR and JSONP requests.
The mock version of this service allows you to write tests without having to deal with
native APIs and the global state associated with them — both of which make testing a nightmare.
@@ -180,7 +180,7 @@ native APIs and the global state associated with them — both of which make tes
HTTP request and tell it what to respond with. Note that the responses are not returned until we call
the `$httpBackend.flush` method.
Now, we will make assertions to verify that the `phones` model doesn't exist on the scope, before
Now, we will make assertions to verify that the `phones` model doesn't exist on `scope` before
the response is received:
<pre>
+9 -4
View File
@@ -65,7 +65,7 @@ api/ng.directive:ngSrc ngSrc} directive. That directive prevents the
browser from treating the angular `{{ expression }}` markup literally, and initiating a request to
invalid url `http://localhost:8000/app/{{phone.imageUrl}}`, which it would have done if we had only
specified an attribute binding in a regular `src` attribute (`<img class="diagram" src="{{phone.imageUrl}}">`).
Using `ngSrc` (`ng-src`) prevents the browser from making an http request to an invalid location.
Using the `ngSrc` directive prevents the browser from making an http request to an invalid location.
## Test
@@ -87,7 +87,8 @@ views that we will implement in the upcoming steps.
You can now refresh the browser tab with the end-to-end test runner to see the tests run, or you
can see them running on {@link
http://angular.github.com/angular-phonecat/step-6/test/e2e/runner.html
angular's server}.
Angular's server}.
# Experiments
@@ -96,11 +97,15 @@ or Chrome's Web Inspector, or inspecting the webserver access logs, confirm that
making an extraneous request to `/app/%7B%7Bphone.imageUrl%7D%7D` (or
`/app/{{phone.imageUrl}}`).
The issue here is that the browser will fire a request for that invalid image address as soon as
it hits the `img` tag, which is before Angular has a chance to evaluate the expression and inject
the valid address.
# Summary
Now that you have added phone images and links, go to {@link step_07 step 7} to learn about angular
layout templates and how angular makes it easy to create applications that have multiple views.
Now that you have added phone images and links, go to {@link step_07 step 7} to learn about Angular
layout templates and how Angular makes it easy to create applications that have multiple views.
<ul doc-tutorial-nav="6"></ul>
+14 -13
View File
@@ -19,7 +19,7 @@ detail page is displayed.
The most important changes are listed below. You can see the full diff on {@link
https://github.com/angular/angular-phonecat/compare/step-6...step-7
GitHub}:
GitHub}.
## Multiple Views, Routing and Layout Template
@@ -35,7 +35,7 @@ template into what we call a "layout template". This is a template that is commo
our application. Other "partial templates" are then included into this layout template depending on
the current "route" — the view that is currently displayed to the user.
Application routes in angular are declared via the
Application routes in Angular are declared via the
{@link api/ng.$routeProvider $routeProvider}, which is the provider of the
{@link api/ng.$route $route service}. This service makes it easy to wire together
controllers, view templates, and the current
@@ -46,8 +46,8 @@ history (back and forward navigation) and bookmarks.
### A Note About DI, Injector and Providers
As you noticed the dependency injection is the core feature of AngularJS, so it's important for you
to understand a thing or two about how it works.
As you {@link tutorial/step_05 noticed}, {@link guide/di dependency injection} is the core feature of
AngularJS, so it's important for you to understand a thing or two about how it works.
When the application bootstraps, Angular creates an injector that will be used for all DI stuff in
this app. The injector itself doesn't know anything about what `$http` or `$route` services do, in
@@ -56,9 +56,9 @@ module definitions. The sole responsibilities of the injector are to load specif
definition(s), register all service providers defined in these modules and when asked inject
a specified function with dependencies (services) that it lazily instantiates via their providers.
Providers are objects that provide (create) instances of services and expose configuration apis
Providers are objects that provide (create) instances of services and expose configuration APIs
that can be used to control the creation and runtime behavior of a service. In case of the `$route`
service, the `$routeProvider` exposes apis that allow you to define routes for your application.
service, the `$routeProvider` exposes APIs that allow you to define routes for your application.
Angular modules solve the problem of removing global state from the application and provide a way
of configuring the injector. As opposed to AMD or require.js modules, Angular modules don't try to
@@ -79,8 +79,8 @@ angular.module('phonecat', []).
</pre>
In order to configure our application with routes, we need to create a module for our application.
We call this module `phonecatApp` and using the `config` api we request the `$routeProvider` to be
injected into our config function and use `$routeProvider.when` api to define our routes.
We call this module `phonecatApp` and using the `config` API we request the `$routeProvider` to be
injected into our config function and use `$routeProvider.when` API to define our routes.
Note that during the injector configuration phase, the providers can be injected as well, but they
will not be available for injection once the injector is created and starts creating service
@@ -114,14 +114,14 @@ directive:
__`app/index.html`:__
<pre>
<!doctype html>
<html ng-app="phonecat">
<html lang="en" ng-app="phonecat">
...
</pre>
## Controllers
__`app/js/controller.js`:__
__`app/js/controllers.js`:__
<pre>
...
function PhoneDetailCtrl($scope, $routeParams) {
@@ -140,11 +140,12 @@ route into the layout template, which makes it a perfect fit for our `index.html
__`app/index.html`:__
<pre>
<html ng-app="phonecat">
<html lang="en" ng-app="phonecat">
<head>
...
<script src="lib/angular/angular.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
</head>
<body>
@@ -155,7 +156,7 @@ __`app/index.html`:__
</pre>
Note that we removed most of the code in the `index.html` template and replaced it with a single
line containing a div with `ng-view` attribute. The code that we removed was placed into the
line containing a div with the `ng-view` attribute. The code that we removed was placed into the
`phone-list.html` template:
__`app/partials/phone-list.html`:__
@@ -234,7 +235,7 @@ to various URLs and verify that the correct view was rendered.
You can now refresh the browser tab with the end-to-end test runner to see the tests run, or you
can see them running on {@link
http://angular.github.com/angular-phonecat/step-7/test/e2e/runner.html
angular's server}.
Angular's server}.
# Experiments
+6 -6
View File
@@ -16,7 +16,7 @@ Now when you click on a phone on the list, the phone details page with phone-spe
is displayed.
To implement the phone details view we will use {@link api/ng.$http $http} to fetch
our data, and we'll flesh out the `phone-details.html` view template.
our data, and we'll flesh out the `phone-detail.html` view template.
The most important changes are listed below. You can see the full diff on {@link
https://github.com/angular/angular-phonecat/compare/step-7...step-8
@@ -59,7 +59,7 @@ show this data in the phone detail view.
We'll expand the `PhoneDetailCtrl` by using the `$http` service to fetch the json files. This works
the same way as the phone list controller.
__`app/js/controller.js`:__
__`app/js/controllers.js`:__
<pre>
function PhoneDetailCtrl($scope, $routeParams, $http) {
$http.get('phones/' + $routeParams.phoneId + '.json').success(function(data) {
@@ -77,11 +77,11 @@ route by the `$route` service.
## Template
The TBD placeholder line has been replaced with lists and bindings that comprise the phone details.
Note where we use the angular `{{expression}}` markup and `ngRepeater`s to project phone data from
Note where we use the angular `{{expression}}` markup and `ngRepeat` to project phone data from
our model into the view.
__`app/partials/phone-details.html`:__
__`app/partials/phone-detail.html`:__
<pre>
<img ng-src="{{phone.images[0]}}" class="phone">
@@ -121,7 +121,7 @@ TODO!
We wrote a new unit test that is similar to the one we wrote for the `PhoneListCtrl` controller in
step 5.
__`test/unit/controllerSpec.js`:__
__`test/unit/controllersSpec.js`:__
<pre>
...
describe('PhoneDetailCtrl', function(){
@@ -180,7 +180,7 @@ __`test/e2e/scenarios.js`:__
You can now refresh the browser tab with the end-to-end test runner to see the tests run, or you
can see them running on {@link
http://angular.github.com/angular-phonecat/step-8/test/e2e/runner.html
angular's server}.
Angular's server}.
# Experiments
+4 -4
View File
@@ -15,7 +15,7 @@ Navigate to one of the detail pages.
In the previous step, the details page displayed either "true" or "false" to indicate whether
certain phone features were present or not. We have used a custom filter to convert those text
strings into glyphs: ✓ for "true", and ✘ for "false". Let's see, what the filter code looks like.
strings into glyphs: ✓ for "true", and ✘ for "false". Let's see what the filter code looks like.
The most important changes are listed below. You can see the full diff on {@link
https://github.com/angular/angular-phonecat/compare/step-8...step-9
@@ -64,7 +64,7 @@ __`app/index.html`:__
...
</pre>
The syntax for using filters in angular templates is as follows:
The syntax for using filters in Angular templates is as follows:
{{ expression | filter }}
@@ -121,7 +121,7 @@ output.
# Experiments
* Let's experiment with some of the {@link api/ng.$filter built-in angular filters} and add the
* Let's experiment with some of the {@link api/ng.$filter built-in Angular filters} and add the
following bindings to `index.html`:
* `{{ "lower cap string" | uppercase }}`
* `{{ {foo: "bar", baz: 23} | json }}`
@@ -137,7 +137,7 @@ the following to index.html:
# Summary
Now that you have learned how to write and test a custom filter, go to {@link step_10 step 10} to
learn how we can use angular to enhance the phone details page further.
learn how we can use Angular to enhance the phone details page further.
<ul doc-tutorial-nav="9"></ul>
+4 -4
View File
@@ -13,7 +13,7 @@ In this step, you will add a clickable phone image swapper to the phone details
The phone details view displays one large image of the current phone and several smaller thumbnail
images. It would be great if we could replace the large image with any of the thumbnails just by
clicking on the desired thumbnail image. Let's have a look at how we can do this with angular.
clicking on the desired thumbnail image. Let's have a look at how we can do this with Angular.
The most important changes are listed below. You can see the full diff on {@link
https://github.com/angular/angular-phonecat/compare/step-9...step-10
@@ -40,7 +40,7 @@ function PhoneDetailCtrl($scope, $routeParams, $http) {
</pre>
In the `PhoneDetailCtrl` controller, we created the `mainImageUrl` model property and set its
default value to the first phone image url.
default value to the first phone image URL.
We also created a `setImage` event handler function that will change the value of `mainImageUrl`.
@@ -66,7 +66,7 @@ We bound the `ngSrc` directive of the large image to the `mainImageUrl` property
We also registered an {@link api/ng.directive:ngClick `ngClick`}
handler with thumbnail images. When a user clicks on one of the thumbnail images, the handler will
use the `setImage` event handler function to change the value of the `mainImageUrl` property to the
url of the thumbnail image.
URL of the thumbnail image.
<div style="display: none">
TODO!
@@ -105,7 +105,7 @@ __`test/e2e/scenarios.js`:__
You can now refresh the browser tab with the end-to-end test runner to see the tests run, or you
can see them running on {@link
http://angular.github.com/angular-phonecat/step-8/test/e2e/runner.html
angular's server}.
Angular's server}.
# Experiments
+14 -5
View File
@@ -13,7 +13,7 @@ In this step, you will improve the way our app fetches data.
The last improvement we will make to our app is to define a custom service that represents a {@link
http://en.wikipedia.org/wiki/Representational_State_Transfer RESTful} client. Using this client we
can make xhr requests for data in an easier way, without having to deal with the lower-level {@link
can make XHR requests for data in an easier way, without having to deal with the lower-level {@link
api/ng.$http $http} API, HTTP methods and URLs.
The most important changes are listed below. You can see the full diff on {@link
@@ -57,13 +57,22 @@ The {@link api/ngResource.$resource `$resource`} service makes it easy to create
lines of code. This client can then be used in our application, instead of the lower-level {@link
api/ng.$http $http} service.
__`app/js/app.js`.__
<pre>
...
angular.module('phonecat', ['phonecatFilters', 'phonecatServices']).
...
</pre>
We need to add 'phonecatServices' to 'phonecat' application's requires array.
## Controller
We simplified our sub-controllers (`PhoneListCtrl` and `PhoneDetailCtrl`) by factoring out the
lower-level {@link api/ng.$http $http} service, replacing it with a new service called
`Phone`. Angular's {@link api/ngResource.$resource `$resource`} service is easier to
use than `$http for interacting with data sources exposed as RESTful resources. It is also easier
use than `$http` for interacting with data sources exposed as RESTful resources. It is also easier
now to understand what the code in our controllers is doing.
__`app/js/controllers.js`.__
@@ -107,8 +116,8 @@ This is a simple statement that we want to query for all phones.
An important thing to notice in the code above is that we don't pass any callback functions when
invoking methods of our Phone service. Although it looks as if the result were returned
synchronously, that is not the case at all. What is returned synchronously is a "future" — an
object, which will be filled with data when the xhr response returns. Because of the data-binding
in angular, we can use this future and bind it to our template. Then, when the data arrives, the
object, which will be filled with data when the XHR response returns. Because of the data-binding
in Angular, we can use this future and bind it to our template. Then, when the data arrives, the
view will automatically update.
Sometimes, relying on the future object and data-binding alone is not sufficient to do everything
@@ -217,7 +226,7 @@ output.
# Summary
There you have it! We have created a web app in a relatively short amount of time. In the {@link
the_end closing notes} we'll cover were to go from here.
the_end closing notes} we'll cover where to go from here.
<ul doc-tutorial-nav="11"></ul>
+6 -6
View File
@@ -5,17 +5,17 @@
Our application is now complete. Feel free to experiment with the code further, and jump back to
previous steps using the `git checkout` or `goto_step.sh` commands.
For more details and examples of the angular concepts we touched on in this tutorial, see the
For more details and examples of the Angular concepts we touched on in this tutorial, see the
{@link guide/ Developer Guide}.
For several more examples of code, see the {@link cookbook/ Cookbook}.
When you are ready to start developing a project using angular, we recommend that you bootstrap
your development with the {@link https://github.com/angular/angular-seed angular seed} project.
When you are ready to start developing a project using Angular, we recommend that you bootstrap
your development with the {@link https://github.com/angular/angular-seed angular-seed} project.
We hope this tutorial was useful to you and that you learned enough about angular to make you want
to learn more. We especially hope you are inspired to go out and develop angular web apps of your
own, and that you might be interested in {@link misc/contribute contributing} to angular.
We hope this tutorial was useful to you and that you learned enough about Angular to make you want
to learn more. We especially hope you are inspired to go out and develop Angular web apps of your
own, and that you might be interested in {@link misc/contribute contributing} to Angular.
If you have questions or feedback or just want to say "hi", please post a message at {@link
https://groups.google.com/forum/#!forum/angular}.
Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

+1 -1
View File
@@ -15,7 +15,7 @@ describe('sitemap', function() {
var map = new SiteMap([new Doc({section: 'foo', id: 'a.b.c<>\'"&'})]);
expect(map.render()).toContain([
' <url>',
'<loc>http://docs.angularjs.org/#!/foo/a.b.c&lt;&gt;&apos;&quot;&amp;</loc>',
'<loc>http://docs.angularjs.org/foo/a.b.c&lt;&gt;&apos;&quot;&amp;</loc>',
'<changefreq>weekly</changefreq>',
'</url>'].join(''));
+1 -1
View File
@@ -12,7 +12,7 @@ function SiteMap(docs){
map.push('<?xml version="1.0" encoding="UTF-8"?>');
map.push('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
docs.forEach(function(doc){
map.push(' <url><loc>http://docs.angularjs.org/#!/' +
map.push(' <url><loc>http://docs.angularjs.org/' +
encode(doc.section) + '/' +
encode(doc.id) +
'</loc><changefreq>weekly</changefreq></url>');
+2 -2
View File
@@ -58,10 +58,10 @@ exports.Example.prototype.addSource = function(name, content) {
};
exports.Example.prototype.toHtml = function() {
return '<h1>Source</h1>\n' +
return '<h2>Source</h2>\n' +
this.toHtmlEdit() +
this.toHtmlTabs() +
'<h1>Demo</h1>\n' +
'<h2>Demo</h2>\n' +
this.toHtmlEmbed();
};
+21 -15
View File
@@ -12,8 +12,10 @@ process.on('uncaughtException', function(err) {
var start = now();
var docs;
writer.makeDir('build/docs/syntaxhighlighter').then(function() {
console.log('Generating Angular Reference Documentation...');
writer.makeDir('build/docs/', true).then(function() {
return writer.makeDir('build/docs/partials/');
}).then(function() {
console.log('Generating AngularJS Reference Documentation...');
return reader.collect();
}).then(function generateHtmlDocPartials(docs_) {
docs = docs_;
@@ -40,7 +42,10 @@ writer.makeDir('build/docs/syntaxhighlighter').then(function() {
function writeTheRest(writesFuture) {
var metadata = ngdoc.metadata(docs);
writesFuture.push(writer.copyDir('img'));
writesFuture.push(writer.symlinkTemplate('css'));
writesFuture.push(writer.symlinkTemplate('font'));
writesFuture.push(writer.symlink('../../docs/img', 'build/docs/img'));
writesFuture.push(writer.symlinkTemplate('js'));
var manifest = 'manifest="/build/docs/appcache.manifest"';
@@ -52,7 +57,7 @@ function writeTheRest(writesFuture) {
writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-jq.html',
writer.replace, {'doc:manifest': manifest}));
writer.replace, {'doc:manifest': ''}));
writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-jq-nocache.html',
writer.replace, {'doc:manifest': ''}));
@@ -64,26 +69,27 @@ function writeTheRest(writesFuture) {
writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-jq-debug.html',
writer.replace, {'doc:manifest': ''}));
writesFuture.push(writer.copyTpl('offline.html'));
writesFuture.push(writer.copyTpl('docs-scenario.html'));
writesFuture.push(writer.copyTpl('js/jquery.min.js'));
writesFuture.push(writer.copyTpl('js/jquery.js'));
writesFuture.push(writer.symlinkTemplate('offline.html'));
writesFuture.push(writer.output('js/docs-keywords.js',
writesFuture.push(writer.copyTemplate('docs-scenario.html')); // will be rewritten, don't symlink
writesFuture.push(writer.output('docs-scenario.js', ngdoc.scenarios(docs)));
writesFuture.push(writer.output('docs-keywords.js',
['NG_PAGES=', JSON.stringify(metadata).replace(/{/g, '\n{'), ';']));
writesFuture.push(writer.output('sitemap.xml', new SiteMap(docs).render()));
writesFuture.push(writer.output('docs-scenario.js', ngdoc.scenarios(docs)));
writesFuture.push(writer.output('robots.txt', 'Sitemap: http://docs.angularjs.org/sitemap.xml\n'));
writesFuture.push(writer.output('appcache.manifest',appCache()));
writesFuture.push(writer.copyTpl('.htaccess'));
writesFuture.push(writer.copyTemplate('.htaccess')); // will be rewritten, don't symlink
writesFuture.push(writer.copy('docs/src/templates/js/docs.js', 'js/docs.js'));
writesFuture.push(writer.copy('docs/src/templates/css/bootstrap.min.css', 'css/bootstrap.min.css'));
writesFuture.push(writer.copy('docs/src/templates/css/docs.css', 'css/docs.css'));
writesFuture.push(writer.symlinkTemplate('app.yaml'));
writesFuture.push(writer.symlinkTemplate('index.yaml'));
writesFuture.push(writer.symlinkTemplate('favicon.ico'));
writesFuture.push(writer.symlinkTemplate('main.py'));
}
function now() { return new Date().getTime(); }
function noop() {};
+16 -12
View File
@@ -52,9 +52,9 @@ Doc.prototype = {
Doc.METADATA_IGNORE.forEach(function(ignore){ keywords[ignore] = true; });
function extractWords(text) {
var tokens = text.toLowerCase().split(/[,\.\`\'\"\#\s]+/mg);
var tokens = text.toLowerCase().split(/[\.\s,`'"#]+/mg);
tokens.forEach(function(key){
var match = key.match(/^(([\$\_a-z]|ng\:)[\w\_\-]+)/);
var match = key.match(/^((ng:|[\$_a-z])[\w\-_]+)/);
if (match){
key = match[1];
if (!keywords[key]) {
@@ -201,7 +201,7 @@ Doc.prototype = {
}
});
flush();
this.shortName = this.name.split(/[\.:#]/).pop();
this.shortName = this.name.split(/[\.:#]/).pop().trim();
this.id = this.id || // if we have an id just use it
(((this.file||'').match(/.*\/([^\/]*)\.ngdoc/)||{})[1]) || // try to extract it from file name
this.name; // default to name
@@ -215,7 +215,7 @@ Doc.prototype = {
var text = trim(atText.join('\n')), match;
if (atName == 'param') {
match = text.match(/^\{([^}=]+)(=)?\}\s+(([^\s=]+)|\[(\S+)=([^\]]+)\])\s+(.*)/);
// 1 12 2 34 4 5 5 6 6 3 7 7
// 1 12 2 34 4 5 5 6 6 3 7 7
if (!match) {
throw new Error("Not a valid 'param' format: " + text);
}
@@ -451,12 +451,16 @@ Doc.prototype = {
dom.h('Usage', function() {
dom.h('In HTML Template Binding', function() {
dom.tag('code', function() {
dom.text('{{ ');
dom.text(self.shortName);
dom.text('_expression | ');
dom.text(self.shortName);
self.parameters(dom, ':', true);
dom.text(' }}');
if (self.usage) {
dom.text(self.usage);
} else {
dom.text('{{ ');
dom.text(self.shortName);
dom.text('_expression | ');
dom.text(self.shortName);
self.parameters(dom, ':', true);
dom.text(' }}');
}
});
});
@@ -729,11 +733,11 @@ function scenarios(docs){
function metadata(docs){
var pages = [];
docs.forEach(function(doc){
var path = (doc.name || '').split(/(\.|\:)/);
var path = (doc.name || '').split(/(\.|\:\s*)/);
for ( var i = 1; i < path.length; i++) {
path.splice(i, 1);
}
var shortName = path.pop();
var shortName = path.pop().trim();
if (path.pop() == 'input') {
shortName = 'input [' + shortName + ']';
+69
View File
@@ -0,0 +1,69 @@
application: docs-angularjs-org
version: 1
runtime: python27
api_version: 1
threadsafe: yes
default_expiration: "2h"
handlers:
- url: /
script: main.app
- url: /appcache.manifest
static_files: appcache.manifest
upload: appcache\.manifest
- url: /docs-scenario.html
static_files: docs-scenario.html
upload: docs-scenario\.html
- url: /docs-scenario.js
static_files: docs-scenario.js
upload: docs-scenario\.js
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico
- url: /docs-keywords.js
static_files: docs-keywords.js
upload: docs-keywords\.js
- url: /robots.txt
static_files: robots.txt
upload: robots\.txt
- url: /sitemap.xml
static_files: sitemap.xml
upload: sitemap\.xml
- url: /css
static_dir: css
- url: /font
static_dir: font
- url: /img
static_dir: img
- url: /js
static_dir: js
- url: /partials/(.+):(.+)
static_files: partials/\1_\2
upload: partials/.*
- url: /partials
static_dir: partials
- url: /syntaxhighlighter
static_dir: syntaxhighlighter
- url: /.*
static_files: index.html
upload: index.html
libraries:
- name: webapp2
version: "2.5.1"
+14
View File
@@ -19,6 +19,11 @@ img.AngularJS-small {
height: 1em;
}
.icon-cog {
line-height: 13px;
}
/* =============================== */
.form-search .dropdown-menu {
@@ -140,6 +145,11 @@ ul.events > li > h3 {
font-family: monospace;
}
.center {
display: block;
margin: 2em auto;
}
.diagram {
display: block;
margin: 2em auto;
@@ -170,3 +180,7 @@ ul.events > li > h3 {
color: white;
text-decoration: none;
}
.clear {
clear: both;
}
+239
View File
@@ -0,0 +1,239 @@
/* Font Awesome
the iconic font designed for use with Twitter Bootstrap
-------------------------------------------------------
The full suite of pictographic icons, examples, and documentation
can be found at: http://fortawesome.github.com/Font-Awesome/
License
-------------------------------------------------------
The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
http://creativecommons.org/licenses/by/3.0/ A mention of
'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
source code is considered acceptable attribution (most common on the web).
If human readable source code is not available to the end user, a mention in
an 'About' or 'Credits' screen is considered acceptable (most common in desktop
or mobile software).
Contact
-------------------------------------------------------
Email: dave@davegandy.com
Twitter: http://twitter.com/fortaweso_me
Work: http://lemonwi.se co-founder
*/
@font-face {
font-family: 'FontAwesome';
src: url('../font/fontawesome-webfont.eot');
src: url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svgz#FontAwesomeRegular') format('svg'), url('../font/fontawesome-webfont.svg#FontAwesomeRegular') format('svg');
font-weight: normal;
font-style: normal;
}
/* sprites.less reset */
[class^="icon-"], [class*=" icon-"] {
display: inline;
width: auto;
height: auto;
line-height: inherit;
vertical-align: baseline;
background-image: none;
background-position: 0% 0%;
background-repeat: repeat;
}
li[class^="icon-"], li[class*=" icon-"] {
display: block;
}
/* Font Awesome styles
------------------------------------------------------- */
[class^="icon-"]:before, [class*=" icon-"]:before {
font-family: FontAwesome;
font-weight: normal;
font-style: normal;
display: inline-block;
text-decoration: inherit;
}
a [class^="icon-"], a [class*=" icon-"] {
display: inline-block;
text-decoration: inherit;
}
/* makes the font 33% larger relative to the icon container */
.icon-large:before {
vertical-align: top;
font-size: 1.3333333333333333em;
}
.btn [class^="icon-"], .btn [class*=" icon-"] {
/* keeps button heights with and without icons the same */
line-height: .9em;
}
li [class^="icon-"], li [class*=" icon-"] {
display: inline-block;
width: 1.25em;
text-align: center;
}
li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] {
/* 1.5 increased font size for icon-large * 1.25 width */
width: 1.875em;
}
li[class^="icon-"], li[class*=" icon-"] {
margin-left: 0;
list-style-type: none;
}
li[class^="icon-"]:before, li[class*=" icon-"]:before {
text-indent: -2em;
text-align: center;
}
li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before {
text-indent: -1.3333333333333333em;
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.icon-glass:before { content: "\f000"; }
.icon-music:before { content: "\f001"; }
.icon-search:before { content: "\f002"; }
.icon-envelope:before { content: "\f003"; }
.icon-heart:before { content: "\f004"; }
.icon-star:before { content: "\f005"; }
.icon-star-empty:before { content: "\f006"; }
.icon-user:before { content: "\f007"; }
.icon-film:before { content: "\f008"; }
.icon-th-large:before { content: "\f009"; }
.icon-th:before { content: "\f00a"; }
.icon-th-list:before { content: "\f00b"; }
.icon-ok:before { content: "\f00c"; }
.icon-remove:before { content: "\f00d"; }
.icon-zoom-in:before { content: "\f00e"; }
.icon-zoom-out:before { content: "\f010"; }
.icon-off:before { content: "\f011"; }
.icon-signal:before { content: "\f012"; }
.icon-cog:before { content: "\f013"; }
.icon-trash:before { content: "\f014"; }
.icon-home:before { content: "\f015"; }
.icon-file:before { content: "\f016"; }
.icon-time:before { content: "\f017"; }
.icon-road:before { content: "\f018"; }
.icon-download-alt:before { content: "\f019"; }
.icon-download:before { content: "\f01a"; }
.icon-upload:before { content: "\f01b"; }
.icon-inbox:before { content: "\f01c"; }
.icon-play-circle:before { content: "\f01d"; }
.icon-repeat:before { content: "\f01e"; }
/* \f020 is not a valid unicode character. all shifted one down */
.icon-refresh:before { content: "\f021"; }
.icon-list-alt:before { content: "\f022"; }
.icon-lock:before { content: "\f023"; }
.icon-flag:before { content: "\f024"; }
.icon-headphones:before { content: "\f025"; }
.icon-volume-off:before { content: "\f026"; }
.icon-volume-down:before { content: "\f027"; }
.icon-volume-up:before { content: "\f028"; }
.icon-qrcode:before { content: "\f029"; }
.icon-barcode:before { content: "\f02a"; }
.icon-tag:before { content: "\f02b"; }
.icon-tags:before { content: "\f02c"; }
.icon-book:before { content: "\f02d"; }
.icon-bookmark:before { content: "\f02e"; }
.icon-print:before { content: "\f02f"; }
.icon-camera:before { content: "\f030"; }
.icon-font:before { content: "\f031"; }
.icon-bold:before { content: "\f032"; }
.icon-italic:before { content: "\f033"; }
.icon-text-height:before { content: "\f034"; }
.icon-text-width:before { content: "\f035"; }
.icon-align-left:before { content: "\f036"; }
.icon-align-center:before { content: "\f037"; }
.icon-align-right:before { content: "\f038"; }
.icon-align-justify:before { content: "\f039"; }
.icon-list:before { content: "\f03a"; }
.icon-indent-left:before { content: "\f03b"; }
.icon-indent-right:before { content: "\f03c"; }
.icon-facetime-video:before { content: "\f03d"; }
.icon-picture:before { content: "\f03e"; }
.icon-pencil:before { content: "\f040"; }
.icon-map-marker:before { content: "\f041"; }
.icon-adjust:before { content: "\f042"; }
.icon-tint:before { content: "\f043"; }
.icon-edit:before { content: "\f044"; }
.icon-share:before { content: "\f045"; }
.icon-check:before { content: "\f046"; }
.icon-move:before { content: "\f047"; }
.icon-step-backward:before { content: "\f048"; }
.icon-fast-backward:before { content: "\f049"; }
.icon-backward:before { content: "\f04a"; }
.icon-play:before { content: "\f04b"; }
.icon-pause:before { content: "\f04c"; }
.icon-stop:before { content: "\f04d"; }
.icon-forward:before { content: "\f04e"; }
.icon-fast-forward:before { content: "\f050"; }
.icon-step-forward:before { content: "\f051"; }
.icon-eject:before { content: "\f052"; }
.icon-chevron-left:before { content: "\f053"; }
.icon-chevron-right:before { content: "\f054"; }
.icon-plus-sign:before { content: "\f055"; }
.icon-minus-sign:before { content: "\f056"; }
.icon-remove-sign:before { content: "\f057"; }
.icon-ok-sign:before { content: "\f058"; }
.icon-question-sign:before { content: "\f059"; }
.icon-info-sign:before { content: "\f05a"; }
.icon-screenshot:before { content: "\f05b"; }
.icon-remove-circle:before { content: "\f05c"; }
.icon-ok-circle:before { content: "\f05d"; }
.icon-ban-circle:before { content: "\f05e"; }
.icon-arrow-left:before { content: "\f060"; }
.icon-arrow-right:before { content: "\f061"; }
.icon-arrow-up:before { content: "\f062"; }
.icon-arrow-down:before { content: "\f063"; }
.icon-share-alt:before { content: "\f064"; }
.icon-resize-full:before { content: "\f065"; }
.icon-resize-small:before { content: "\f066"; }
.icon-plus:before { content: "\f067"; }
.icon-minus:before { content: "\f068"; }
.icon-asterisk:before { content: "\f069"; }
.icon-exclamation-sign:before { content: "\f06a"; }
.icon-gift:before { content: "\f06b"; }
.icon-leaf:before { content: "\f06c"; }
.icon-fire:before { content: "\f06d"; }
.icon-eye-open:before { content: "\f06e"; }
.icon-eye-close:before { content: "\f070"; }
.icon-warning-sign:before { content: "\f071"; }
.icon-plane:before { content: "\f072"; }
.icon-calendar:before { content: "\f073"; }
.icon-random:before { content: "\f074"; }
.icon-comment:before { content: "\f075"; }
.icon-magnet:before { content: "\f076"; }
.icon-chevron-up:before { content: "\f077"; }
.icon-chevron-down:before { content: "\f078"; }
.icon-retweet:before { content: "\f079"; }
.icon-shopping-cart:before { content: "\f07a"; }
.icon-folder-close:before { content: "\f07b"; }
.icon-folder-open:before { content: "\f07c"; }
.icon-resize-vertical:before { content: "\f07d"; }
.icon-resize-horizontal:before { content: "\f07e"; }
.icon-bar-chart:before { content: "\f080"; }
.icon-twitter-sign:before { content: "\f081"; }
.icon-facebook-sign:before { content: "\f082"; }
.icon-camera-retro:before { content: "\f083"; }
.icon-key:before { content: "\f084"; }
.icon-cogs:before { content: "\f085"; }
.icon-comments:before { content: "\f086"; }
.icon-thumbs-up:before { content: "\f087"; }
.icon-thumbs-down:before { content: "\f088"; }
.icon-star-half:before { content: "\f089"; }
.icon-heart-empty:before { content: "\f08a"; }
.icon-signout:before { content: "\f08b"; }
.icon-linkedin-sign:before { content: "\f08c"; }
.icon-pushpin:before { content: "\f08d"; }
.icon-external-link:before { content: "\f08e"; }
.icon-signin:before { content: "\f090"; }
.icon-trophy:before { content: "\f091"; }
.icon-github-sign:before { content: "\f092"; }
.icon-upload-alt:before { content: "\f093"; }
.icon-lemon:before { content: "\f094"; }
+37 -2
View File
@@ -2,8 +2,43 @@
<html xmlns:ng="http://angularjs.org">
<head>
<title>AngularJS Docs E2E Test Runner</title>
<script type="text/javascript" src="../angular-scenario.js" ng:autotest></script>
<script type="text/javascript" src="docs-scenario.js"></script>
<script>
var gae = (location.pathname.split('/').length == 2),
headEl = document.head,
angularVersion = {
current: '"NG_VERSION_FULL"', // rewrite during build
stable: '"NG_VERSION_STABLE"'
};
addTag('script', {src: path('angular-scenario.js')}, function() {
addTag('script', {src: 'docs-scenario.js'}, function() {
angular.scenario.setUpAndRun();
});
});
function addTag(name, attributes, callback) {
var el = document.createElement(name),
attrName;
for (attrName in attributes) {
el.setAttribute(attrName, attributes[attrName]);
}
if (callback) {
el.onload = callback;
}
headEl.appendChild(el);
}
function path(name) {
return gae
? 'http://code.angularjs.org/' + angularVersion.stable + '/' +
name.replace(/\.js$/, '-' + angularVersion.stable + '.js')
: '../' + name;
}
</script>
</head>
<body>
</body>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.
+175
View File
@@ -0,0 +1,175 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
This is a custom SVG webfont generated by Font Squirrel.
Designer : Dave Gandy
Foundry : Fort Awesome
</metadata>
<defs>
<font id="FontAwesomeRegular" horiz-adv-x="900" >
<font-face units-per-em="1000" ascent="750" descent="-250" />
<missing-glyph horiz-adv-x="250" />
<glyph unicode="&#xd;" horiz-adv-x="250" />
<glyph horiz-adv-x="0" />
<glyph horiz-adv-x="0" />
<glyph unicode=" " horiz-adv-x="250" />
<glyph unicode="&#x09;" horiz-adv-x="250" />
<glyph unicode="&#xa0;" horiz-adv-x="250" />
<glyph unicode="&#x2000;" horiz-adv-x="375" />
<glyph unicode="&#x2001;" horiz-adv-x="751" />
<glyph unicode="&#x2002;" horiz-adv-x="375" />
<glyph unicode="&#x2003;" horiz-adv-x="751" />
<glyph unicode="&#x2004;" horiz-adv-x="250" />
<glyph unicode="&#x2005;" horiz-adv-x="187" />
<glyph unicode="&#x2006;" horiz-adv-x="125" />
<glyph unicode="&#x2007;" horiz-adv-x="125" />
<glyph unicode="&#x2008;" horiz-adv-x="93" />
<glyph unicode="&#x2009;" horiz-adv-x="150" />
<glyph unicode="&#x200a;" horiz-adv-x="41" />
<glyph unicode="&#x202f;" horiz-adv-x="150" />
<glyph unicode="&#x205f;" horiz-adv-x="187" />
<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0v0v0v0v0z" />
<glyph unicode="&#xf000;" horiz-adv-x="750" d="M3 727q10 23 34 23h675q25 0 35 -23t-8 -41l-298 -298v-313h121q16 0 27 -11t11 -26q0 -16 -11 -27t-27 -11h-375q-15 0 -26 11t-11 27q0 15 11 26t26 11h122v313l-298 298q-18 18 -8 41z" />
<glyph unicode="&#xf001;" horiz-adv-x="688" d="M0 112q0 24 11 44.5t30 35.5t45 24t55 9q13 0 24.5 -2t22.5 -5v388l500 144v-525q0 -23 -11 -43.5t-30 -36t-45 -24.5t-55 -9t-54.5 9t-44.5 24.5t-30 36t-11 43.5t11 43.5t30 35.5t44.5 24t54.5 9q24 0 47 -6v248l-312 -90v-377q0 -23 -11 -43.5t-30 -35.5t-45 -24 t-55 -9t-55 9t-45 24t-30 35.5t-11 43.5z" />
<glyph unicode="&#xf002;" horiz-adv-x="750" d="M0 437q0 65 24.5 122t67 99.5t99.5 67t122 24.5q64 0 121 -24.5t99.5 -67t67 -99.5t24.5 -122q0 -48 -13.5 -91t-38.5 -81l168 -167q9 -10 9 -23t-9 -22l-44 -44q-9 -9 -22 -9t-22 9l-168 168q-38 -25 -81 -38.5t-91 -13.5q-65 0 -122 24.5t-99.5 67t-67 99t-24.5 121.5z M125 437q0 -39 14.5 -73t40 -59.5t60 -40t73.5 -14.5t73 14.5t59.5 40t40 59.5t14.5 73t-14.5 73t-40 59.5t-59.5 40.5t-73 15t-73.5 -15t-60 -40.5t-40 -59.5t-14.5 -73zM194 437q0 25 9.5 46.5t25.5 37.5t37.5 25.5t46.5 9.5q10 0 16.5 -7t6.5 -17t-6.5 -16.5t-16.5 -6.5 q-30 0 -51 -21t-21 -51q0 -10 -6.5 -16.5t-16.5 -6.5t-17 6.5t-7 16.5z" />
<glyph unicode="&#xf003;" d="M0 56v587v32v19q0 23 16.5 39.5t39.5 16.5h19h750h19q23 0 39.5 -16.5t16.5 -39.5v-19v-30v-589q0 -23 -16.5 -39.5t-39.5 -16.5h-788q-23 0 -39.5 16.5t-16.5 39.5zM75 75h750v416q-15 -15 -28 -24q-29 -21 -61 -46t-64 -49q-19 -14 -36.5 -28t-32.5 -25q-3 -2 -6 -4.5 t-7 -5.5q-14 -11 -29.5 -22.5t-33.5 -22t-37.5 -17t-40.5 -6.5q-20 0 -39.5 6.5t-37 17t-33.5 22t-29 22.5q-4 3 -7 5.5t-6 4.5q-15 11 -32.5 25t-36.5 28q-32 24 -64 49t-61 46q-13 9 -28 24v-416zM75 643q0 -14 6 -30t16.5 -32t23 -30t26.5 -24q23 -17 49 -37l52 -38 q26 -20 50 -39t44 -34l22 -17q14 -11 28.5 -21t29 -17.5t27.5 -7.5h1h1q13 0 27.5 7.5t29 17.5t28.5 21l22 17q20 15 44 34t50 39l52 38q26 20 49 37q13 10 26 24t23.5 30t16.5 32t6 30v32h-750v-32z" />
<glyph unicode="&#xf004;" horiz-adv-x="846" d="M0 519q0 64 20 108t52.5 71.5t73.5 39.5t83 12q30 0 59 -10t54 -25t45.5 -32.5t35.5 -32.5q15 15 35.5 32.5t45.5 32.5t54 25t59 10q42 0 83 -12t73.5 -39.5t52.5 -71.5t20 -108q0 -44 -16.5 -83.5t-36 -69.5t-37 -48t-18.5 -19l-289 -288q-11 -11 -26 -11t-26 11 l-290 288q-1 1 -18 19t-36.5 48t-36 69.5t-16.5 83.5z" />
<glyph unicode="&#xf005;" horiz-adv-x="787" d="M0.5 465q4.5 13 25.5 16l238 35l106 215q10 20 23.5 20t22.5 -20l107 -215l237 -35q22 -3 26 -16t-11 -28l-172 -168l40 -236q4 -22 -7 -30t-30 3l-213 111l-212 -111q-20 -11 -31 -3t-7 30l41 236l-172 168q-16 15 -11.5 28z" />
<glyph unicode="&#xf006;" horiz-adv-x="787" d="M0.5 465q4.5 13 25.5 16l238 34l106 216q9 19 23 19t23 -19l107 -216l237 -34q22 -3 26 -16t-11 -28l-172 -168l40 -236q3 -16 -2 -24.5t-16 -8.5q-7 0 -19 5l-213 112l-212 -112q-12 -5 -19 -5q-11 0 -16 8.5t-3 24.5l41 236l-172 168q-16 15 -11.5 28zM136 421l100 -98 l29 -27l-7 -39l-24 -139l124 66l35 18l35 -18l124 -66l-23 139l-7 39l28 27l101 98l-139 20l-39 6l-18 35l-62 126l-62 -126l-17 -35l-39 -6z" />
<glyph unicode="&#xf007;" d="M0 34v7q11 19 19.5 40t17.5 42t19.5 40t25.5 34q7 7 15.5 13.5t19.5 10.5t23.5 5t25.5 3q37 6 77.5 12.5t78.5 12.5q4 17 7 34.5t8 33.5q-8 11 -16 21.5t-15.5 23t-13.5 28.5t-9 37q-2 11 -5 32.5t-6 44t-5.5 41t-2.5 22.5q0 25 10.5 56t33 58t58 45.5t84.5 18.5 t84.5 -18.5t58 -45.5t33 -58t10.5 -56q0 -4 -2.5 -22.5t-5.5 -41t-6 -44t-5 -32.5q-3 -21 -9 -37t-13.5 -28.5t-16 -23t-15.5 -21.5q5 -16 8 -33.5t7 -34.5q38 -6 78.5 -12.5t77.5 -12.5q13 -2 25.5 -3t23.5 -5t19.5 -10.5t15.5 -13.5q15 -15 25.5 -34t19.5 -40t17.5 -42 t19.5 -40v-7q-14 -8 -26.5 -18.5t-30.5 -15.5h-786q-18 5 -30.5 15.5t-26.5 18.5z" />
<glyph unicode="&#xf008;" d="M0 56v638q0 23 16.5 39.5t39.5 16.5h788q23 0 39.5 -16.5t16.5 -39.5v-638q0 -23 -16.5 -39.5t-39.5 -16.5h-788q-23 0 -39.5 16.5t-16.5 39.5zM56 75q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5 v-75zM56 250q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5v-75zM56 425q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5v-75zM56 600 q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5v-75zM225 75q0 -8 5.5 -13.5t13.5 -5.5h412q8 0 13.5 5.5t5.5 13.5v250q0 8 -5.5 13.5t-13.5 5.5h-412q-8 0 -13.5 -5.5t-5.5 -13.5v-250zM225 425 q0 -8 5.5 -13.5t13.5 -5.5h412q8 0 13.5 5.5t5.5 13.5v250q0 8 -5.5 13.5t-13.5 5.5h-412q-8 0 -13.5 -5.5t-5.5 -13.5v-250zM731 75q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5v-75zM731 250 q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5v-75zM731 425q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5v-75zM731 600 q0 -8 5.5 -13.5t13.5 -5.5h75q8 0 13.5 5.5t5.5 13.5v75q0 8 -5.5 13.5t-13.5 5.5h-75q-8 0 -13.5 -5.5t-5.5 -13.5v-75z" />
<glyph unicode="&#xf009;" d="M0 38v262q0 16 11 27t27 11h337q16 0 27 -11t11 -27v-262q0 -16 -11 -27t-27 -11h-337q-16 0 -27 11t-11 27zM0 450v263q0 15 11 26t27 11h337q16 0 27 -11t11 -26v-263q0 -16 -11 -26.5t-27 -10.5h-337q-16 0 -27 10.5t-11 26.5zM488 38v262q0 16 10.5 27t26.5 11h338 q15 0 26 -11t11 -27v-262q0 -16 -11 -27t-26 -11h-338q-16 0 -26.5 11t-10.5 27zM488 450v263q0 15 10.5 26t26.5 11h338q15 0 26 -11t11 -26v-263q0 -16 -11 -26.5t-26 -10.5h-338q-16 0 -26.5 10.5t-10.5 26.5z" />
<glyph unicode="&#xf00a;" d="M0 38v132q0 16 11 26.5t27 10.5h175q15 0 26 -10.5t11 -26.5v-132q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27zM0 320v110q0 16 11 26.5t27 10.5h175q15 0 26 -10.5t11 -26.5v-110q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27zM0 580v133q0 15 11 26t27 11 h175q15 0 26 -11t11 -26v-133q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27zM325 38v132q0 16 11 26.5t27 10.5h175q15 0 26 -10.5t11 -26.5v-132q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27zM325 320v110q0 16 11 26.5t27 10.5h175q15 0 26 -10.5t11 -26.5v-110 q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27zM325 580v133q0 15 11 26t27 11h175q15 0 26 -11t11 -26v-133q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27zM650 38v132q0 16 11 26.5t27 10.5h175q15 0 26 -10.5t11 -26.5v-132q0 -16 -11 -27t-26 -11h-175 q-16 0 -27 11t-11 27zM650 320v110q0 16 11 26.5t27 10.5h175q15 0 26 -10.5t11 -26.5v-110q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27zM650 580v133q0 15 11 26t27 11h175q15 0 26 -11t11 -26v-133q0 -16 -11 -27t-26 -11h-175q-16 0 -27 11t-11 27z" />
<glyph unicode="&#xf00b;" d="M0 38v132q0 16 11 26.5t27 10.5h145q15 0 26 -10.5t11 -26.5v-132q0 -16 -11 -27t-26 -11h-145q-16 0 -27 11t-11 27zM0 320v110q0 16 11 26.5t27 10.5h145q15 0 26 -10.5t11 -26.5v-110q0 -16 -11 -27t-26 -11h-145q-16 0 -27 11t-11 27zM0 580v133q0 15 11 26t27 11 h145q15 0 26 -11t11 -26v-133q0 -16 -11 -27t-26 -11h-145q-16 0 -27 11t-11 27zM295 38v132q0 16 11 26.5t27 10.5h530q15 0 26 -10.5t11 -26.5v-132q0 -16 -11 -27t-26 -11h-530q-16 0 -27 11t-11 27zM295 320v110q0 16 11 26.5t27 10.5h530q15 0 26 -10.5t11 -26.5v-110 q0 -16 -11 -27t-26 -11h-530q-16 0 -27 11t-11 27zM295 580v133q0 15 11 26t27 11h530q15 0 26 -11t11 -26v-133q0 -16 -11 -27t-26 -11h-530q-16 0 -27 11t-11 27z" />
<glyph unicode="&#xf00c;" d="M0 312.5q0 16.5 11 27.5l85 85q11 11 27.5 11t27.5 -11l178 -178q11 -11 27.5 -11t27.5 11l364 364q11 11 27.5 11t27.5 -11l85 -85q11 -11 11 -27.5t-11 -27.5l-444 -444q-11 -11 -30.5 -19t-35.5 -8h-43q-17 0 -36.5 8t-30.5 19l-257 258q-11 11 -11 27.5z" />
<glyph unicode="&#xf00d;" horiz-adv-x="750" d="M0 94q0 19 14 33l248 249l-248 244q-14 14 -14 33t14 33l49 49q14 14 33 14t33 -14l246 -246l246 246q14 14 33 14t33 -14l49 -49q14 -14 14 -33t-14 -33l-248 -249l248 -244q14 -14 14 -32.5t-14 -32.5l-49 -50q-14 -14 -33 -14t-33 14l-246 247l-247 -247 q-14 -14 -32.5 -14t-32.5 14l-49 49q-14 14 -14 33z" />
<glyph unicode="&#xf00e;" horiz-adv-x="750" d="M0 437q0 65 24.5 122t67 99.5t99.5 67t122 24.5q64 0 121 -24.5t99.5 -67t67 -99.5t24.5 -122q0 -48 -13.5 -91t-38.5 -81l168 -167q9 -10 9 -23t-9 -22l-44 -44q-9 -9 -22 -9t-22 9l-168 168q-38 -25 -81 -38.5t-91 -13.5q-65 0 -122 24.5t-99.5 67t-67 99t-24.5 121.5z M125 437q0 -39 14.5 -73t40 -59.5t60 -40t73.5 -14.5t73 14.5t59.5 40t40 59.5t14.5 73t-14.5 73t-40 59.5t-59.5 40.5t-73 15t-73.5 -15t-60 -40.5t-40 -59.5t-14.5 -73zM188 422v31q0 7 4.5 11.5t10.5 4.5h78v78q0 6 4.5 10.5t11.5 4.5h31q7 0 11.5 -4.5t4.5 -10.5v-78h78 q16 0 16 -16v-31q0 -16 -16 -16h-78v-78q0 -16 -16 -16h-31q-16 0 -16 16v78h-78q-6 0 -10.5 4.5t-4.5 11.5z" />
<glyph unicode="&#xf010;" horiz-adv-x="750" d="M0 437q0 65 24.5 122t67 99.5t99.5 67t122 24.5q64 0 121 -24.5t99.5 -67t67 -99.5t24.5 -122q0 -48 -13.5 -91t-38.5 -81l168 -167q9 -10 9 -23t-9 -22l-44 -44q-9 -9 -22 -9t-22 9l-168 168q-38 -25 -81 -38.5t-91 -13.5q-65 0 -122 24.5t-99.5 67t-67 99t-24.5 121.5z M125 437q0 -39 14.5 -73t40 -59.5t60 -40t73.5 -14.5t73 14.5t59.5 40t40 59.5t14.5 73t-14.5 73t-40 59.5t-59.5 40.5t-73 15t-73.5 -15t-60 -40.5t-40 -59.5t-14.5 -73zM188 422v31q0 7 4.5 11.5t10.5 4.5h219q16 0 16 -16v-31q0 -16 -16 -16h-219q-6 0 -10.5 4.5 t-4.5 11.5z" />
<glyph unicode="&#xf011;" horiz-adv-x="713" d="M0 356q0 89 41 166.5t115 128.5q6 3 14 3q7 -1 12 -8l42 -62q10 -16 -5 -26q-51 -35 -78.5 -88t-27.5 -114q0 -50 19 -94.5t52 -77.5t77.5 -52t94.5 -19q51 0 95.5 19t77.5 52t52 77.5t19 94.5q0 61 -28 114t-79 88q-6 3 -8 12q-1 6 3 14l43 62q5 6 12 7.5t14 -2.5 q73 -51 114.5 -128.5t41.5 -166.5q0 -74 -28 -138.5t-76.5 -113t-113.5 -76.5t-139 -28t-138.5 28t-113 76.5t-76.5 113t-28 138.5zM300 394v337q0 19 19 19h75q8 0 13.5 -5.5t5.5 -13.5v-337q0 -8 -5.5 -13.5t-13.5 -5.5h-75q-19 0 -19 19z" />
<glyph unicode="&#xf012;" d="M0 19v127q0 8 5.5 13.5t13.5 5.5h94q8 0 13 -5.5t5 -13.5v-127q0 -8 -5 -13.5t-13 -5.5h-94q-19 0 -19 19zM192 19v212q0 8 5.5 13.5t13.5 5.5h94q8 0 13 -5.5t5 -13.5v-212q0 -8 -5 -13.5t-13 -5.5h-94q-8 0 -13.5 5.5t-5.5 13.5zM384 19v330q0 8 5.5 13.5t13.5 5.5h94 q8 0 13.5 -5.5t5.5 -13.5v-330q0 -8 -5.5 -13.5t-13.5 -5.5h-94q-8 0 -13.5 5.5t-5.5 13.5zM577 19v486q0 8 5 13.5t13 5.5h94q8 0 13.5 -5.5t5.5 -13.5v-486q0 -8 -5.5 -13.5t-13.5 -5.5h-94q-8 0 -13 5.5t-5 13.5zM769 19v712q0 19 19 19h93q19 0 19 -19v-712 q0 -19 -19 -19h-93q-19 0 -19 19z" />
<glyph unicode="&#xf013;" horiz-adv-x="748" d="M0 320v111q0 7 7 9q19 5 39.5 8t40.5 5q4 0 8 0.5t9 1.5q5 14 10.5 27.5t12.5 27.5q-12 17 -26.5 36.5t-30.5 37.5q-5 5 0 12q19 23 40 44t44 40q5 5 12 0q11 -11 22.5 -20t23.5 -17q7 -5 14 -10.5t14 -10.5q26 14 55 23q3 28 6 51.5t8 45.5q2 8 9 8h111q9 0 9 -8 q4 -19 6.5 -38t5.5 -39l3 -20q14 -5 27.5 -10t26.5 -13q7 5 13 9.5t12 9.5q13 10 26 19t25 20q6 6 12 -1l11 -11q5 -5 11 -10q15 -14 30 -29.5t29 -32.5q4 -6 0 -12q-13 -15 -26 -32.5t-30 -40.5q15 -29 24 -58q12 -3 24.5 -4.5t25.5 -3.5q11 -2 23.5 -3.5t23.5 -3.5 q7 -2 7 -9v-111q0 -7 -7 -9q-18 -5 -38 -7.5t-40 -4.5q-5 -1 -9.5 -1.5t-9.5 -1.5q-5 -14 -10.5 -27.5t-12.5 -27.5q12 -17 26.5 -36.5t30.5 -37.5q5 -5 0 -12q-38 -47 -84 -84q-5 -5 -12 0q-11 11 -22.5 20t-23.5 17q-7 5 -14 10.5t-14 10.5q-26 -14 -55 -23 q-2 -23 -5.5 -48t-9.5 -49q-2 -8 -9 -8h-111q-7 0 -9 8q-3 19 -5.5 38t-5.5 39l-3 20q-14 5 -27.5 10t-26.5 13q-6 -5 -12.5 -9.5t-12.5 -9.5q-26 -18 -51 -39q-6 -6 -12 1q-5 5 -11 10.5t-11 10.5q-15 14 -30 29.5t-29 32.5q-5 6 0 12q15 18 29 37t27 36q-15 29 -24 58 q-12 3 -24.5 4.5t-24.5 3.5t-24.5 3.5t-23.5 3.5q-7 2 -7 9zM261 375q0 -24 9 -44.5t24.5 -35.5t36 -24t43.5 -9t43.5 9t35.5 24t24 35.5t9 44.5q0 23 -9 43.5t-24 35.5t-35.5 24t-43.5 9t-43.5 -9t-36 -24t-24.5 -35.5t-9 -43.5z" />
<glyph unicode="&#xf014;" horiz-adv-x="648" d="M0 582q0 8 0.5 16t0.5 17q11 6 32.5 10t47 7t52.5 5t49 3q-2 16 -1 32t7 33q1 4 6 11.5t18.5 15t40 13t71.5 5.5t71.5 -5.5t40 -13t18 -15.5t6.5 -12q6 -17 7 -32.5t-1 -31.5q22 -1 49 -3t53 -5t47 -7t32 -10q1 -9 1 -17v-16v-16q0 -8 -1 -17q-10 -6 -30.5 -10t-45.5 -7 t-51 -5t-48 -3t-37 -1.5t-16 -0.5l-95 -1h-13h-28q-19 0 -54 1q-2 0 -16.5 0.5t-36.5 1.5t-48 3t-51 5t-45.5 7t-30.5 10q0 9 -0.5 17t-0.5 16zM67 484q41 -5 84.5 -7.5t75.5 -3.5q9 -1 23 -1h74h73q14 0 23 1q33 1 76.5 3.5t84.5 7.5q-5 -76 -8 -154.5t-7 -154.5 q-1 -19 -1.5 -42.5t-2 -45.5t-6 -40.5t-14.5 -28.5q-12 -11 -42 -14.5t-58 -3.5h-236q-29 0 -58.5 3.5t-41.5 14.5q-10 10 -14.5 28.5t-6 40.5t-2 45.5t-1.5 42.5q-4 76 -7.5 154.5t-7.5 154.5zM147 383q1 -15 1 -28t1 -22q0 -11 1 -19q2 -34 3.5 -68t3.5 -67q1 -8 1 -17 v-20v-12q0 -6 0.5 -14t1.5 -19q1 -8 9.5 -14t13.5 -6q5 -1 10 -1t8 -1h11q5 0 5 19v286q0 8 -5.5 13.5t-13.5 5.5l-33 2q-8 0 -13 -5t-5 -13zM255.5 657q0.5 -6 1.5 -15q9 1 20 1h47l67 -1q1 9 1.5 15t-0.5 11q-11 3 -29.5 4.5t-38.5 1.5t-38.5 -1.5t-29.5 -4.5 q-1 -5 -0.5 -11zM292 94q0 -8 5 -13.5t13 -5.5h28q8 0 13.5 5.5t5.5 13.5v285q0 8 -11 13t-14 5h-15q-3 0 -14 -5t-11 -13v-285zM432 94q0 -19 4 -19h11q3 1 13 1.5t15 0.5q5 1 8.5 6.5t4.5 13.5q0 11 0.5 19t0.5 14q0 7 1 12v20q0 9 1 17q2 33 3 66.5t3 67.5q0 9 1 20 q1 9 1.5 22t1.5 28q0 8 -5 13t-13 5l-33 -2q-8 0 -13 -5.5t-5 -13.5v-286z" />
<glyph unicode="&#xf015;" d="M1 384.5q3 11.5 13 19.5l412 338q11 8 24 8t24 -8l126 -104v58q0 19 19 19h112q19 0 19 -19v-180l136 -112q10 -8 13 -19.5t-1 -22.5q-10 -24 -36 -24h-75v-300q0 -16 -10.5 -27t-26.5 -11h-206v225h-188v-225h-206q-16 0 -27 11t-11 27v300h-75q-25 0 -35 24 q-4 11 -1 22.5z" />
<glyph unicode="&#xf016;" horiz-adv-x="600" d="M0 56v638q0 23 16.5 39.5t39.5 16.5h219v-269q0 -23 16.5 -39.5t39.5 -16.5h269v-369q0 -23 -16.5 -39.5t-39.5 -16.5h-488q-23 0 -39.5 16.5t-16.5 39.5zM331 481v266h3l263 -263v-3h-266z" />
<glyph unicode="&#xf017;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -54 20.5 -102t56 -83.5t83.5 -56t102 -20.5t102 20.5t84 56t56.5 83.5 t20.5 102t-20.5 102t-56.5 84t-84 56.5t-102 20.5t-102 -20.5t-83.5 -56.5t-56 -84t-20.5 -102zM319 375v150q0 23 16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5v-127l90 -89q17 -17 17 -40t-17 -40q-8 -8 -18.5 -12t-21.5 -4t-21.5 4t-18.5 12l-106 106q-1 1 -1 2t-1 2 q-7 7 -10 14q-4 9 -4 22z" />
<glyph unicode="&#xf018;" d="M1 17l290 716q3 7 10.5 12t15.5 5h95l-4 -83h84l-4 83h95q8 0 15.5 -5t10.5 -12l290 -716q3 -7 -0.5 -12t-11.5 -5h-361l-13 250h-126l-13 -250h-361q-8 0 -11.5 5t-0.5 12zM394 389h112l-10 202h-92z" />
<glyph unicode="&#xf019;" d="M0 19v300q0 8 5.5 13.5t13.5 5.5h112q8 0 13.5 -5.5t5.5 -13.5v-169h600v169q0 8 5.5 13.5t13.5 5.5h112q8 0 13.5 -5.5t5.5 -13.5v-300q0 -19 -19 -19h-862q-19 0 -19 19zM169 461q3 8 19 8h150v244q0 15 10.5 26t26.5 11h150q16 0 27 -11t11 -26v-244h150q15 0 18 -8 t-8 -19l-246 -247q-11 -11 -27 -11t-27 11l-246 247q-11 11 -8 19z" />
<glyph unicode="&#xf01a;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -54 20.5 -102t56 -83.5t83.5 -56t102 -20.5t102 20.5t84 56t56.5 83.5 t20.5 102t-20.5 102t-56.5 83.5t-84 56t-102 20.5t-102 -20.5t-83.5 -56t-56 -83.5t-20.5 -102zM206 349q4 10 24 10h79v185q0 8 5.5 13.5t13.5 5.5h94q8 0 13.5 -5.5t5.5 -13.5v-185h79q20 0 24 -10t-10 -24l-136 -136q-9 -9 -23 -9q-13 0 -23 9l-136 136q-14 14 -10 24z " />
<glyph unicode="&#xf01b;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -54 20.5 -102t56 -83.5t83.5 -56t102 -20.5t102 20.5t84 56t56.5 83.5 t20.5 102t-20.5 102t-56.5 83.5t-84 56t-102 20.5t-102 -20.5t-83.5 -56t-56 -83.5t-20.5 -102zM206 401q-4 10 10 24l136 136q10 9 23 9q12 0 23 -9l136 -136q14 -14 10 -24t-24 -10h-79v-185q0 -8 -5.5 -13.5t-13.5 -5.5h-94q-8 0 -13.5 5.5t-5.5 13.5v185h-79 q-20 0 -24 10z" />
<glyph unicode="&#xf01c;" d="M0 38v282q0 16 4.5 37t10.5 35l139 324q6 14 21.5 24t30.5 10h488q15 0 30.5 -10t21.5 -24l139 -324q6 -14 10.5 -35t4.5 -37v-282q0 -16 -11 -27t-26 -11h-825q-16 0 -27 11t-11 27zM116 339h189l56 -113h187l57 113h179q-1 2 -1 4.5t-1 4.5l-125 290h-414l-125 -291 q-1 -1 -1 -3.5t-1 -4.5z" />
<glyph unicode="&#xf01d;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -54 20.5 -102t56 -83.5t83.5 -56t102 -20.5t102 20.5t84 56t56.5 83.5 t20.5 102t-20.5 102t-56.5 84t-84 56.5t-102 20.5t-102 -20.5t-83.5 -56.5t-56 -84t-20.5 -102zM258 220v310q0 9 8 14q8 4 15 0l269 -156q8 -3 8 -13t-8 -13l-269 -156q-4 -2 -8 -2q-3 0 -7 2q-8 5 -8 14z" />
<glyph unicode="&#xf01e;" horiz-adv-x="747" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5q66 0 127.5 -23t112.5 -65l76 76q16 16 27 11.5t11 -27.5v-217q0 -15 -11 -26q-10 -10 -25 -10l-217 -1q-23 0 -27.5 11.5t11.5 27.5l75 75q-35 26 -75.5 41t-84.5 15q-54 0 -102 -20.5t-83.5 -56.5t-56 -84t-20.5 -102 t20.5 -102t56 -83.5t83.5 -56t102 -20.5q49 0 93.5 17t79.5 47.5t58 72t29 90.5q1 6 7 12q7 5 14 4l75 -10q8 -1 12.5 -7t3.5 -14q-9 -69 -42 -128.5t-83 -103t-113.5 -68.5t-133.5 -25q-78 0 -146 29.5t-119 80.5t-80.5 119t-29.5 146z" />
<glyph unicode="&#xf021;" d="M3 160l70 206q4 13 18 20q15 6 28 2l206 -70q21 -7 21.5 -19t-19.5 -22l-95 -47q24 -36 57.5 -63t75.5 -41q51 -18 103 -13.5t97.5 26.5t80.5 61t53 90q2 8 8.5 11t14.5 1l71 -24q17 -7 12 -24q-25 -74 -75 -129t-114.5 -86.5t-139 -37.5t-147.5 19q-63 21 -113.5 62 t-84.5 98l-97 -47q-20 -11 -29.5 -2.5t-1.5 29.5zM95 495q25 73 75 128.5t114.5 87.5t138.5 38t148 -19q63 -22 113 -63t85 -98l97 48q20 10 29.5 1.5t1.5 -29.5l-70 -205q-4 -14 -18 -21q-15 -6 -28 -2l-206 70q-21 7 -21.5 19t19.5 22l95 47q-24 36 -58 63t-76 41 q-51 18 -103 13.5t-97 -26.5t-80 -61t-53 -90q-2 -8 -9 -11t-14 -1l-71 25q-8 2 -11 9t-1 14z" />
<glyph unicode="&#xf022;" d="M0 56v638q0 23 16.5 39.5t39.5 16.5h788q23 0 39.5 -16.5t16.5 -39.5v-638q0 -23 -16.5 -39.5t-39.5 -16.5h-788q-23 0 -39.5 16.5t-16.5 39.5zM75 75h750v525h-750v-525zM150 169v37q0 19 19 19h75q8 0 13.5 -5.5t5.5 -13.5v-37q0 -8 -5.5 -13.5t-13.5 -5.5h-75 q-19 0 -19 19zM150 319v37q0 19 19 19h75q8 0 13.5 -5.5t5.5 -13.5v-37q0 -8 -5.5 -13.5t-13.5 -5.5h-75q-19 0 -19 19zM150 469v37q0 19 19 19h75q8 0 13.5 -5.5t5.5 -13.5v-37q0 -8 -5.5 -13.5t-13.5 -5.5h-75q-19 0 -19 19zM338 169v37q0 8 5 13.5t13 5.5h375 q19 0 19 -19v-37q0 -19 -19 -19h-375q-8 0 -13 5.5t-5 13.5zM338 319v37q0 8 5 13.5t13 5.5h375q19 0 19 -19v-37q0 -19 -19 -19h-375q-8 0 -13 5.5t-5 13.5zM338 469v37q0 8 5 13.5t13 5.5h375q19 0 19 -19v-37q0 -19 -19 -19h-375q-8 0 -13 5.5t-5 13.5z" />
<glyph unicode="&#xf023;" horiz-adv-x="750" d="M0 56v300q0 23 16.5 40t39.5 17h57v85q0 52 20.5 98t56 80t83.5 54t102 20t102 -20t84 -54t56.5 -80t20.5 -98v-85h56q23 0 39.5 -17t16.5 -40v-300q0 -23 -16.5 -39.5t-39.5 -16.5h-638q-23 0 -39.5 16.5t-16.5 39.5zM225 413h300v85q0 29 -12 54.5t-32 44.5t-47.5 30 t-58.5 11t-58.5 -11t-47.5 -30t-32 -44.5t-12 -54.5v-85z" />
<glyph unicode="&#xf024;" d="M0 675q0 31 22 53t53 22t53 -22t22 -53q0 -20 -10 -36.5t-27 -27.5v-592q0 -8 -5.5 -13.5t-13.5 -5.5h-38q-8 0 -13 5.5t-5 13.5v592q-17 11 -27.5 27.5t-10.5 36.5zM150 203v364q0 16 9.5 32t23.5 24q51 27 92 42t70 22q34 8 61 9q33 0 60.5 -5.5t52.5 -14.5t48.5 -21 t48.5 -25q31 -14 71 -16q34 -2 80 7.5t101 42.5q14 8 23 3t9 -21v-365q0 -15 -9 -31.5t-23 -24.5q-55 -33 -101 -42.5t-80 -7.5q-40 2 -71 16q-25 13 -48.5 25t-48.5 21t-52.5 14.5t-60.5 5.5q-27 -1 -61 -9q-29 -7 -70 -22t-92 -43q-14 -8 -23.5 -2t-9.5 22z" />
<glyph unicode="&#xf025;" d="M0 356q0 54 18.5 104.5t50 94t75 79.5t93.5 62t104.5 40t108.5 14t108.5 -14t104.5 -40t93.5 -62t75 -79.5t50 -94t18.5 -104.5q0 -87 -36 -165l-13 -28l-81 -12q-13 -49 -52.5 -81t-92.5 -32v-19q0 -8 -5.5 -13.5t-13.5 -5.5h-38q-8 0 -13 5.5t-5 13.5v337q0 8 5 13.5 t13 5.5h38q8 0 13.5 -5.5t5.5 -13.5v-18q42 0 75.5 -21t53.5 -54l19 2q15 43 15 91q0 58 -31 109.5t-80 89.5t-109 60.5t-118 22.5t-118 -22.5t-108.5 -60.5t-79.5 -89.5t-31 -109.5q0 -46 14 -91l19 -2q20 33 53.5 54t75.5 21v18q0 8 5.5 13.5t13.5 5.5h38q8 0 13 -5.5 t5 -13.5v-337q0 -8 -5 -13.5t-13 -5.5h-38q-8 0 -13.5 5.5t-5.5 13.5v19q-53 0 -92.5 32t-52.5 81l-81 12l-13 28q-36 78 -36 165z" />
<glyph unicode="&#xf026;" horiz-adv-x="425" d="M0 286v178q0 8 5.5 13.5t13.5 5.5h196l153 153q23 23 39.5 16t16.5 -39v-476q0 -32 -16.5 -39t-39.5 16l-153 153h-196q-8 0 -13.5 5.5t-5.5 13.5z" />
<glyph unicode="&#xf027;" horiz-adv-x="600" d="M0 286v178q0 8 5.5 13.5t13.5 5.5h196l153 153q23 23 39.5 16t16.5 -39v-476q0 -32 -16.5 -39t-39.5 16l-153 153h-196q-8 0 -13.5 5.5t-5.5 13.5zM482 205q-4 15 4 29q39 67 39 141q0 73 -39 141q-8 14 -4 29t18 23t28.5 4t22.5 -18q49 -87 49 -179t-49 -179 q-11 -19 -33 -19q-8 0 -18 5q-14 8 -18 23z" />
<glyph unicode="&#xf028;" d="M0 286v178q0 8 5.5 13.5t13.5 5.5h196l153 153q23 23 39.5 16t16.5 -39v-476q0 -32 -16.5 -39t-39.5 16l-153 153h-196q-8 0 -13.5 5.5t-5.5 13.5zM482 205q-4 15 4 29q39 67 39 141q0 73 -39 141q-8 14 -4 29t18 23t28.5 4t22.5 -18q49 -87 49 -179t-49 -179 q-11 -19 -33 -19q-8 0 -18 5q-14 8 -18 23zM603 117q-3 15 5 29q67 105 67 229t-67 229q-8 14 -5 29t17 23t29 5t23 -17q38 -61 58 -129t20 -140t-20 -140t-58 -129q-5 -9 -14 -13.5t-18 -4.5q-11 0 -20 6q-14 8 -17 23zM723.5 30q-2.5 15 5.5 28q48 72 72 152t24 165 t-24 165t-72 152q-8 13 -5.5 28t16.5 24q13 8 28 5t24 -16q54 -81 81 -171.5t27 -186.5t-27 -186.5t-81 -171.5q-12 -17 -32 -17q-11 0 -20 6q-14 9 -16.5 24z" />
<glyph unicode="&#xf029;" horiz-adv-x="750" d="M0 0v341h341v-341h-341zM0 409v341h341v-341h-341zM68 68h205v205h-205v-205zM68 477h205v205h-205v-205zM136 136v69h69v-69h-69zM136 545v68h69v-68h-69zM409 0v341h204v-68h69v68h68v-205h-205v68h-68v-204h-68zM409 409v341h341v-341h-341zM477 477h205v205h-205 v-205zM545 0v68h68v-68h-68zM545 545v68h68v-68h-68zM682 0v68h68v-68h-68z" />
<glyph unicode="&#xf02a;" d="M0 0v750h75v-750h-75zM111 0v750h18v-750h-18zM174 0v750h57v-750h-57zM266 0v750h38v-750h-38zM349 0v750h37v-750h-37zM441 0v750h18v-750h-18zM495 0v750h75v-750h-75zM596 0v750h38v-750h-38zM688 0v750h19v-750h-19zM771 0v750h18v-750h-18zM825 0v750h75v-750h-75z " />
<glyph unicode="&#xf02b;" horiz-adv-x="750" d="M0 474v218q0 24 17 41t41 17h218q24 0 53 -12t46 -29l358 -358q17 -17 17 -41t-17 -41l-252 -252q-17 -17 -41 -17t-41 17l-358 358q-17 17 -29 46t-12 53zM94 600q0 -23 16.5 -39.5t39.5 -16.5t39.5 16.5t16.5 39.5t-16.5 39.5t-39.5 16.5t-39.5 -16.5t-16.5 -39.5z" />
<glyph unicode="&#xf02c;" horiz-adv-x="898" d="M0 475v217q0 24 17 41t41 17h217q24 0 53.5 -11.5t45.5 -29.5l321 -358q16 -17 16.5 -41t-16.5 -41l-252 -251q-17 -17 -41 -17.5t-41 17.5l-320 358q-16 18 -28.5 46.5t-12.5 52.5zM94 600q0 -23 16.5 -39.5t39.5 -16.5t39.5 16.5t16.5 39.5t-16.5 39.5t-39.5 16.5 t-39.5 -16.5t-16.5 -39.5zM379 749h83q24 0 53.5 -12t45.5 -29l321 -358q16 -18 16.5 -41.5t-16.5 -40.5l-252 -251q-17 -17 -41 -17.5t-41 17.5l-6 7l246 245q17 17 16.5 41t-16.5 41l-320 358q-15 16 -40.5 27t-48.5 13z" />
<glyph unicode="&#xf02d;" horiz-adv-x="835" d="M5 152q1 8 2 15.5t2 16.5q0 5 -2 10t-1 10q1 8 7.5 15.5t12.5 17.5q11 18 22 44t16 45q2 8 -0.5 15t-0.5 13q2 8 8 13.5t10 11.5q5 9 10.5 20.5t10.5 24t8 24.5t4 20t-1 16t0 14q3 8 10 13t12 12q5 6 10.5 17t11 24t9.5 25.5t5 22.5q1 6 -2 12t-1 13t9 14.5t13 15.5 q8 12 14 28.5t14.5 30t22.5 21t38 0.5l-1 -2q15 5 26 5h381q38 0 58 -28q20 -26 9 -63l-138 -442q-9 -31 -38 -52.5t-62 -21.5h-436q-5 0 -10 -1t-9 -6q-6 -10 0 -27q8 -21 29.5 -37t42.5 -16h462q14 0 28 10.5t18 23.5l151 482q2 8 2.5 14.5t-0.5 13.5q20 -7 30 -21 q20 -26 9 -63l-138 -442q-9 -32 -38 -53t-62 -21h-462q-20 0 -39 7t-36 19t-30 28.5t-20 35.5q-12 33 -1 62zM244 469q-5 -19 13 -19h300q8 0 15 5.5t9 13.5l12 37q2 8 -1.5 13.5t-11.5 5.5h-300q-8 0 -15.5 -5.5t-9.5 -13.5zM278 581q-2 -8 1.5 -13t11.5 -5h300q8 0 15 5 t10 13l11 38q2 8 -1.5 13.5t-11.5 5.5h-300q-8 0 -15 -5.5t-10 -13.5z" />
<glyph unicode="&#xf02e;" horiz-adv-x="600" d="M0 54v641q0 17 9 30.5t25 20.5q5 2 10 3t11 1h490q5 0 10.5 -1t10.5 -3q16 -7 25 -20.5t9 -30.5v-641q0 -17 -9 -30.5t-25 -19.5q-15 -7 -31.5 -3.5t-27.5 15.5l-207 207l-207 -207q-11 -12 -27.5 -15.5t-31.5 3.5q-16 7 -25 20t-9 30z" />
<glyph unicode="&#xf02f;" d="M0 19v169q0 23 9 43.5t24.5 35.5t36 24t43.5 9h675q23 0 43.5 -9t35.5 -24t24 -35.5t9 -43.5v-169q0 -19 -19 -19h-862q-19 0 -19 19zM131 94q0 -8 5.5 -13t13.5 -5h600q8 0 13.5 5t5.5 13v19q0 8 -5.5 13.5t-13.5 5.5h-600q-8 0 -13.5 -5.5t-5.5 -13.5v-19zM150 356v357 q0 15 11 26t27 11h318v-187q0 -24 16.5 -40.5t39.5 -16.5h188v-150h-600zM562 563v187l188 -187h-188z" />
<glyph unicode="&#xf030;" d="M0 56v525q0 23 16.5 40t39.5 17h179l28 61q9 21 32.5 36t46.5 15h216q23 0 46.5 -15t32.5 -36l28 -61h179q23 0 39.5 -17t16.5 -40v-525q0 -23 -16.5 -39.5t-39.5 -16.5h-788q-23 0 -39.5 16.5t-16.5 39.5zM216 319q0 -49 18.5 -91.5t50 -74.5t74.5 -50.5t91 -18.5 t91 18.5t74.5 50.5t50 74.5t18.5 91.5q0 48 -18.5 91t-50 74.5t-74.5 50t-91 18.5t-91 -18.5t-74.5 -50t-50 -74.5t-18.5 -91zM291 319q0 33 12.5 62t34 50.5t50.5 34t62 12.5t62 -12.5t50.5 -34t34 -50.5t12.5 -62t-12.5 -62t-34 -51t-50.5 -34.5t-62 -12.5t-62 12.5 t-50.5 34.5t-34 51t-12.5 62z" />
<glyph unicode="&#xf031;" horiz-adv-x="803" d="M0 0l1 39q5 2 14.5 4t23.5 4q45 9 53 16q8 5 24 33l114 300l135 354h36h26l5 -10l99 -235q16 -38 31 -74t29 -71t25.5 -63.5t20.5 -50.5q6 -14 14 -34t18 -46q11 -32 31 -73q12 -24 17 -28q10 -9 33 -12q12 -1 24 -4.5t26 -8.5q3 -18 3 -27v-5q0 -3 -1 -8q-21 0 -44 1 t-48 3q-26 2 -48.5 3t-42.5 1h-39q-16 0 -26 -1l-97 -5l-28 -1q0 10 0.5 19.5t1.5 18.5l63 13q28 7 33 12q6 4 6 13q0 7 -3 15l-23 56l-44 111l-218 1q-6 -14 -18 -47t-32 -87q-11 -31 -11 -41q0 -13 8 -21q7 -5 19.5 -8.5t30.5 -6.5q7 -2 41 -6v-29q0 -8 -1 -13 q-17 0 -59 2.5t-109 7.5l-24 -4q-21 -4 -40.5 -5.5t-39.5 -1.5h-10zM268 320q66 -1 105.5 -2t51.5 0l14 1q-9 25 -20 54.5t-25 63.5t-25 59.5t-19 42.5z" />
<glyph unicode="&#xf032;" horiz-adv-x="693" d="M0 0l1 46q13 3 33 6q19 3 34 6.5t27 8.5q4 7 6.5 13t3.5 12q3 16 4 39.5t1 54.5l-1 243q-1 19 -1.5 68t-2.5 130q-2 43 -6 53q-2 4 -6 5q-10 7 -34 8q-11 0 -56 6l-2 41l128 3l187 6h22q4 1 8 1h6q3 0 10.5 -0.5t19.5 -0.5h37q45 0 94 -13q9 -2 21 -6.5t26 -12.5 q31 -15 51 -37q22 -23 32 -51q5 -14 7.5 -28.5t2.5 -30.5q0 -35 -16 -63q-15 -28 -46 -51q-8 -6 -26.5 -15t-47.5 -23q87 -20 131 -71q45 -51 45 -115q0 -35 -14 -79q-11 -32 -35 -57q-32 -35 -69 -53q-38 -17 -100 -29q-34 -6 -97 -5l-97 2q-31 1 -67.5 -1t-79.5 -5 q-12 -1 -45.5 -2t-88.5 -3zM262 693q0 -6 0.5 -15.5t1.5 -21.5q1 -25 2 -58.5t0 -77.5v-48v-38q12 -2 25.5 -3t28.5 -1q86 0 130 32t44 110q0 55 -42 91q-41 37 -126 37q-26 0 -64 -7zM266 223l2 -132q0 -8 5 -21q36 -16 69 -16q64 0 107 20q40 19 60 55q9 18 14 40t5 49 q0 55 -21 88q-29 46 -69 61q-39 16 -122 16q-18 0 -30 -1.5t-20 -3.5v-70v-85z" />
<glyph unicode="&#xf033;" horiz-adv-x="515" d="M0 0l9 41q6 2 15.5 4.5t22.5 5.5q20 5 34.5 9.5t24.5 9.5q14 19 20 50l14 67l28 131l6 31q11 58 20 87t9 31l15 76l8 31l11 66l4 24v19q-22 11 -72 14q-7 0 -11.5 0.5t-8.5 0.5l10 51l159 -7q15 -1 24 -1h13q17 0 43.5 1t64.5 3q20 2 33.5 3t18.5 1q-1 -5 -1.5 -9.5 t-1.5 -9.5q-2 -5 -4 -11l-3 -14q-24 -8 -54 -15q-32 -8 -51 -15q-6 -16 -12 -43q-3 -12 -4.5 -22t-2.5 -18q-11 -49 -19.5 -86t-13.5 -63l-31 -152l-19 -77l-21 -115l-7 -22v-5q0 -3 1 -8q17 -4 31.5 -6.5t28.5 -4.5q2 0 10.5 -1t22.5 -3q-1 -9 -1.5 -16t-1.5 -13 q-1 -3 -2 -8t-3 -11q-4 0 -7 -0.5t-5 -0.5q-9 -1 -14 -1h-7h-5q-4 0 -9 2q-4 0 -22 2t-51 6l-99 1q-30 0 -88 -6q-19 -2 -31 -3t-18 -1z" />
<glyph unicode="&#xf034;" d="M0 562q7 18 17 54t22 90q4 16 6.5 26.5t4.5 15.5h28q2 -3 3 -5l2 -4q14 -28 20 -35q8 -2 63 -2q17 0 32.5 0.5t29.5 0.5l10 1l55 1l104 -1h141l27 5q5 4 13 26l2 6q1 3 3 8l21 1h5q3 0 8 -1q1 -19 0.5 -47.5t0.5 -67.5v-49v-28q0 -7 -0.5 -13.5t-1.5 -11.5 q-10 -4 -18 -5.5t-15 -3.5q-13 25 -26 63q-14 40 -18 45q-6 7 -13 10q-5 2 -30 2h-67h-15q-8 0 -17 -2q-3 -21 -3 -35l1 -74v-163l1 -175v-72q0 -35 5 -57q4 -2 10.5 -4t16.5 -4q2 0 10.5 -2t24.5 -6q13 -5 24 -9q2 -10 2 -16v-9v-5q0 -4 -1 -9h-17q-23 0 -43 1t-37 3 t-46.5 3t-72.5 1q-8 0 -28 -2t-53 -5q-14 -1 -22 -1.5t-12 -0.5q0 5 -0.5 8t-0.5 5l-1 12v5q9 15 39 24q46 13 66 24q2 5 3 12.5t2 15.5q2 33 3 86t0 125l-2 209q-1 44 -1 69.5t-2 35.5q0 4 -3 7q-2 3 -6 3q-8 2 -31 2h-62q-44 0 -58 -10q-20 -14 -59 -75q-11 -17 -17 -17 q-11 6 -17.5 11.5t-9.5 9.5zM675.5 112.5q2.5 6.5 15.5 6.5h59v512h-59q-13 0 -15.5 6.5t6.5 16.5l90 90q7 6 16 6q7 0 15 -6l90 -90q9 -10 6.5 -16.5t-16.5 -6.5h-58v-512h58q14 0 16.5 -6.5t-6.5 -15.5l-90 -91q-8 -6 -16 -6t-15 6l-90 91q-9 9 -6.5 15.5z" />
<glyph unicode="&#xf035;" horiz-adv-x="750" d="M0 114q0 9 6 15l91 90q9 10 15.5 7t6.5 -16v-59h512v59q0 13 6.5 16t16.5 -7l90 -90q6 -6 6 -15t-6 -15l-90 -91q-10 -9 -16.5 -6.5t-6.5 16.5v58h-512v-58q0 -14 -6.5 -16.5t-15.5 6.5l-91 91q-6 6 -6 15zM0 602q7 14 16.5 42.5t21.5 71.5q3 13 5.5 21t4.5 13h27 q4 -6 5 -7q13 -23 18 -28q1 0 17.5 -0.5t38.5 -0.5h44h36h60l9 1h53h99h203l26 3q6 5 12 22q1 2 2 4.5t3 6.5h19h14v-92v-39v-22q0 -6 -0.5 -10.5t-1.5 -9.5q-16 -5 -31 -7q-12 18 -25 50q-13 29 -17 36q-6 5 -13 7q-3 1 -20.5 1.5t-41.5 0.5h-50h-48h-14q-8 0 -17 -1 q-1 -9 -1.5 -16t-0.5 -12l2 -217l-1 -58q0 -30 6 -45q6 -3 26 -6q2 0 10 -2t22 -5q7 -2 13 -3.5t11 -3.5q1 -8 1.5 -12.5t0.5 -6.5t-0.5 -5t-0.5 -7h-16q-46 0 -77 3q-32 3 -115 3q-7 0 -26 -1.5t-51 -3.5q-13 -1 -21 -1.5t-12 -0.5q0 8 -1 10v10v4q10 13 36 19q44 10 64 20 q2 4 3 9.5t2 12.5q0 9 0.5 34.5t0.5 58.5t-0.5 69.5t-1 68t-1 52.5t-0.5 23q0 4 -3 6q-1 1 -6 3q-7 1 -29 1h-60q-10 0 -30.5 -0.5t-41.5 -1t-38 -2t-20 -3.5q-20 -12 -57 -60q-10 -14 -16 -14q-11 5 -17 9.5t-9 7.5z" />
<glyph unicode="&#xf036;" d="M0 38v56q0 15 11 26t27 11h825q15 0 26 -11t11 -26v-56q0 -16 -11 -27t-26 -11h-825q-16 0 -27 11t-11 27zM0 244v56q0 16 11 27t27 11h525q15 0 26 -11t11 -27v-56q0 -16 -11 -27t-26 -11h-525q-16 0 -27 11t-11 27zM0 450v56q0 16 11 27t27 11h750q15 0 26 -11t11 -27 v-56q0 -16 -11 -26.5t-26 -10.5h-750q-16 0 -27 10.5t-11 26.5zM0 656v57q0 15 11 26t27 11h450q15 0 26 -11t11 -26v-57q0 -15 -11 -26t-26 -11h-450q-16 0 -27 11t-11 26z" />
<glyph unicode="&#xf037;" d="M0 38v56q0 15 11 26t27 11h825q15 0 26 -11t11 -26v-56q0 -16 -11 -27t-26 -11h-825q-16 0 -27 11t-11 27zM38 450v56q0 16 10.5 27t26.5 11h750q16 0 27 -11t11 -27v-56q0 -16 -11 -26.5t-27 -10.5h-750q-16 0 -26.5 10.5t-10.5 26.5zM150 244v56q0 16 11 27t27 11h525 q15 0 26 -11t11 -27v-56q0 -16 -11 -27t-26 -11h-525q-16 0 -27 11t-11 27zM188 656v57q0 15 10.5 26t26.5 11h450q16 0 27 -11t11 -26v-57q0 -15 -11 -26t-27 -11h-450q-16 0 -26.5 11t-10.5 26z" />
<glyph unicode="&#xf038;" d="M0 38v56q0 15 11 26t27 11h825q15 0 26 -11t11 -26v-56q0 -16 -11 -27t-26 -11h-825q-16 0 -27 11t-11 27zM75 450v56q0 16 11 27t27 11h750q15 0 26 -11t11 -27v-56q0 -16 -11 -26.5t-26 -10.5h-750q-16 0 -27 10.5t-11 26.5zM300 244v56q0 16 11 27t27 11h525 q15 0 26 -11t11 -27v-56q0 -16 -11 -27t-26 -11h-525q-16 0 -27 11t-11 27zM375 656v57q0 15 11 26t27 11h450q15 0 26 -11t11 -26v-57q0 -15 -11 -26t-26 -11h-450q-16 0 -27 11t-11 26z" />
<glyph unicode="&#xf039;" d="M0 38v56q0 15 11 26t27 11h825q15 0 26 -11t11 -26v-56q0 -16 -11 -27t-26 -11h-825q-16 0 -27 11t-11 27zM0 244v56q0 16 11 27t27 11h825q15 0 26 -11t11 -27v-56q0 -16 -11 -27t-26 -11h-825q-16 0 -27 11t-11 27zM0 450v56q0 16 11 27t27 11h825q15 0 26 -11t11 -27 v-56q0 -16 -11 -26.5t-26 -10.5h-825q-16 0 -27 10.5t-11 26.5zM0 656v57q0 15 11 26t27 11h825q15 0 26 -11t11 -26v-57q0 -15 -11 -26t-26 -11h-825q-16 0 -27 11t-11 26z" />
<glyph unicode="&#xf03a;" d="M0 38v56q0 15 11 26t27 11h75q15 0 26 -11t11 -26v-56q0 -16 -11 -27t-26 -11h-75q-16 0 -27 11t-11 27zM0 244v56q0 16 11 27t27 11h75q15 0 26 -11t11 -27v-56q0 -16 -11 -27t-26 -11h-75q-16 0 -27 11t-11 27zM0 450v56q0 16 11 27t27 11h75q15 0 26 -11t11 -27v-56 q0 -16 -11 -26.5t-26 -10.5h-75q-16 0 -27 10.5t-11 26.5zM0 656v57q0 15 11 26t27 11h75q15 0 26 -11t11 -26v-57q0 -15 -11 -26t-26 -11h-75q-16 0 -27 11t-11 26zM225 38v56q0 15 11 26t27 11h600q15 0 26 -11t11 -26v-56q0 -16 -11 -27t-26 -11h-600q-16 0 -27 11 t-11 27zM225 244v56q0 16 11 27t27 11h600q15 0 26 -11t11 -27v-56q0 -16 -11 -27t-26 -11h-600q-16 0 -27 11t-11 27zM225 450v56q0 16 11 27t27 11h600q15 0 26 -11t11 -27v-56q0 -16 -11 -26.5t-26 -10.5h-600q-16 0 -27 10.5t-11 26.5zM225 656v57q0 15 11 26t27 11h600 q15 0 26 -11t11 -26v-57q0 -15 -11 -26t-26 -11h-600q-16 0 -27 11t-11 26z" />
<glyph unicode="&#xf03b;" d="M0 369v37q0 19 19 19h104v75q0 15 8 18t19 -8l105 -105q8 -8 8 -18q0 -9 -8 -17l-105 -105q-11 -11 -19 -8t-8 19v74h-104q-19 0 -19 19zM300 19v712q0 19 19 19h37q19 0 19 -19v-712q0 -19 -19 -19h-37q-19 0 -19 19zM450 38v56q0 15 11 26t27 11h375q15 0 26 -11 t11 -26v-56q0 -16 -11 -27t-26 -11h-375q-16 0 -27 11t-11 27zM450 244v56q0 16 11 27t27 11h300q15 0 26 -11t11 -27v-56q0 -16 -11 -27t-26 -11h-300q-16 0 -27 11t-11 27zM450 450v56q0 16 11 27t27 11h337q16 0 27 -11t11 -27v-56q0 -16 -11 -26.5t-27 -10.5h-337 q-16 0 -27 10.5t-11 26.5zM450 656v57q0 15 11 26t27 11h262q16 0 27 -11t11 -26v-57q0 -15 -11 -26t-27 -11h-262q-16 0 -27 11t-11 26z" />
<glyph unicode="&#xf03c;" d="M0 38v56q0 15 11 26t26 11h375q16 0 27 -11t11 -26v-56q0 -16 -11 -27t-27 -11h-375q-15 0 -26 11t-11 27zM0 244v56q0 16 11 27t26 11h300q16 0 27 -11t11 -27v-56q0 -16 -11 -27t-27 -11h-300q-15 0 -26 11t-11 27zM0 450v56q0 16 11 27t26 11h338q15 0 26 -11t11 -27 v-56q0 -16 -11 -26.5t-26 -10.5h-338q-15 0 -26 10.5t-11 26.5zM0 656v57q0 15 11 26t26 11h263q15 0 26 -11t11 -26v-57q0 -15 -11 -26t-26 -11h-263q-15 0 -26 11t-11 26zM525 19v712q0 19 19 19h37q8 0 13.5 -5.5t5.5 -13.5v-712q0 -8 -5.5 -13.5t-13.5 -5.5h-37 q-19 0 -19 19zM637 363q0 8 7 17l106 105q11 11 18.5 8t7.5 -19v-74h105q8 0 13.5 -5.5t5.5 -13.5v-37q0 -8 -5.5 -13.5t-13.5 -5.5h-105v-75q0 -15 -7.5 -18.5t-18.5 7.5l-106 106q-7 9 -7 18z" />
<glyph unicode="&#xf03d;" d="M-2 113v525q0 23 9 43.5t24.5 35.5t36 24t43.5 9h375q23 0 43.5 -9t36 -24t24.5 -35.5t9 -43.5v-169l251 272q9 9 20 9q5 0 11 -2q18 -8 18 -28v-690q0 -20 -18 -28q-17 -7 -31 7l-251 272v-168q0 -23 -9 -43.5t-24.5 -36t-36 -24.5t-43.5 -9h-375q-23 0 -43.5 9 t-36 24.5t-24.5 36t-9 43.5z" />
<glyph unicode="&#xf03e;" d="M0 56v638q0 23 16.5 39.5t39.5 16.5h788q23 0 39.5 -16.5t16.5 -39.5v-638q0 -23 -16.5 -39.5t-39.5 -16.5h-788q-23 0 -39.5 16.5t-16.5 39.5zM75 75h750v600h-750v-600zM150 150v51l135 176l92 -76l173 262l200 -207v-206h-600zM150 524q0 32 22 54t54 22q31 0 53 -22 t22 -54q0 -31 -22 -53t-53 -22q-32 0 -54 22t-22 53z" />
<glyph unicode="&#xf040;" horiz-adv-x="750" d="M0 0l67 204l423 423l137 -137l-423 -423zM140 199q0 -6 5 -11q4 -4 11 -4q6 0 10 4l337 337q10 10 0 21q-5 5 -11 5t-10 -5l-337 -336q-5 -5 -5 -11zM538 675l58 58q17 17 41 17t41 -17l28 -27l27 -28q17 -17 17 -41t-17 -41l-58 -58z" />
<glyph unicode="&#xf041;" horiz-adv-x="530" d="M0 485q0 55 21 103t57 84t84 57t103 21t103 -21t84 -57t57 -84t21 -103q0 -40 -12 -75t-30 -67l-179 -311q-18 -32 -44 -32t-44 32l-179 311q-18 32 -30 67.5t-12 74.5zM134 485q0 -27 10 -51t28 -42t42 -28t51 -10t51 10t41.5 28t28 42t10.5 51t-10.5 51t-28 41.5 t-41.5 28t-51 10.5t-51 -10.5t-42 -28t-28 -41.5t-10 -51z" />
<glyph unicode="&#xf042;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -54 20.5 -102t56 -83.5t83.5 -56t102 -20.5v525q-54 0 -102 -20.5 t-83.5 -56.5t-56 -84t-20.5 -102z" />
<glyph unicode="&#xf043;" horiz-adv-x="531" d="M0 266q0 39 11 75t31 67q10 16 33 47t50.5 72.5t53.5 90.5t42 102q5 17 17.5 24.5t26.5 5.5q15 2 27.5 -5.5t17.5 -24.5q16 -53 42 -102t53.5 -90.5t50.5 -72.5t33 -47q20 -31 31 -67t11 -75q0 -55 -21 -103.5t-57 -84.5t-84.5 -57t-103.5 -21t-103 21t-84 57t-57 84.5 t-21 103.5zM116 207q0 -28 19.5 -47t47.5 -19q27 0 46.5 19t19.5 47q0 18 -10 36q-3 4 -9 11.5t-12.5 18t-13 23t-10.5 25.5q-4 9 -11 7q-9 2 -11 -7q-4 -13 -11 -25.5t-13.5 -23t-12.5 -18t-8 -11.5q-11 -17 -11 -36z" />
<glyph unicode="&#xf044;" d="M0 150v450q0 31 12 58.5t32 47.5t47.5 32t58.5 12h525q2 0 5 -0.5t5 -0.5l-93 -93h-442q-23 0 -39.5 -16.5t-16.5 -39.5v-450q0 -23 16.5 -39.5t39.5 -16.5h525q23 0 39.5 16.5t16.5 39.5v217l94 94v-311q0 -31 -12 -58t-32.5 -47.5t-47.5 -32.5t-58 -12h-525 q-31 0 -58.5 12t-47.5 32.5t-32 47.5t-12 58zM308 158l53 161l318 318l108 -108l-318 -318zM423 307q3 -4 8 -4t8 4l250 249q9 9 0 17t-17 0l-249 -249q-9 -9 0 -17zM733 691l45 46q14 14 33 14t32 -14l22 -22l22 -22q13 -14 13.5 -32.5t-13.5 -32.5l-46 -45z" />
<glyph unicode="&#xf045;" d="M0 150v450q0 31 12 58.5t32 47.5t47.5 32t58.5 12h408q-3 -15 -3 -31v-25q-80 -10 -151 -38h-254q-23 0 -39.5 -16.5t-16.5 -39.5v-450q0 -23 16.5 -39.5t39.5 -16.5h525q23 0 39.5 16.5t16.5 39.5v54q8 5 15.5 10.5t15.5 13.5l63 62v-140q0 -31 -12 -58t-32.5 -47.5 t-47.5 -32.5t-58 -12h-525q-31 0 -58.5 12t-47.5 32.5t-32 47.5t-12 58zM188 190v18q0 81 27.5 152.5t84.5 125t143.5 84.5t204.5 32v113q0 28 14 34t34 -14l191 -191q13 -12 13 -32q0 -19 -13 -31l-191 -191q-20 -20 -34 -14t-14 34v127q-101 0 -178 -21t-130 -57t-83 -85 t-38 -105q-2 -13 -15 -13q-12 0 -14 13q-2 11 -2 21z" />
<glyph unicode="&#xf046;" d="M0 150v450q0 31 12 58.5t32 47.5t47.5 32t58.5 12h525q13 0 25 -3l-91 -91h-459q-23 0 -39.5 -16.5t-16.5 -39.5v-450q0 -23 16.5 -39.5t39.5 -16.5h525q23 0 39.5 16.5t16.5 39.5v159l94 94v-253q0 -31 -12 -58t-32.5 -47.5t-47.5 -32.5t-58 -12h-525q-31 0 -58.5 12 t-47.5 32.5t-32 47.5t-12 58zM188 472q0 16 11 27l48 48q11 11 27 11t27 -11l166 -166l319 320q11 11 27.5 11t27.5 -11l48 -48q11 -11 11 -27t-11 -27l-347 -347l-48 -48q-11 -11 -27 -11t-27 11l-49 48l-192 193q-11 11 -11 27z" />
<glyph unicode="&#xf047;" horiz-adv-x="750" d="M0 375q0 12 8 20l121 120q12 13 21 9t9 -21v-80h169v168h-81q-17 0 -21 9t9 21l120 121q8 8 20 8t20 -8l121 -121q12 -12 8.5 -21t-21.5 -9h-81v-168h169v80q0 17 9 21t21 -9l121 -120q8 -8 8 -20t-8 -20l-121 -120q-12 -13 -21 -9.5t-9 21.5v83h-169v-171h81 q18 0 21.5 -9t-8.5 -21l-121 -121q-8 -8 -20 -8t-20 8l-120 121q-13 12 -9 21t21 9h81v171h-169v-83q0 -17 -9 -21t-21 9l-121 120q-8 8 -8 20z" />
<glyph unicode="&#xf048;" horiz-adv-x="525" d="M0 37q0 -15 11 -26t26 -11h75q16 0 27 11t11 26v675q0 16 -11 27t-27 11h-75q-15 0 -26 -11t-11 -27v-675zM150 375q0 13 8 21l319 345q7 9 20 9q3 0 11 -2q17 -9 17 -29v-689q0 -20 -17 -28q-19 -7 -31 7l-319 344q-8 9 -8 22z" />
<glyph unicode="&#xf049;" d="M0 37q0 -15 11 -26t26 -11h75q16 0 27 11t11 26v675q0 16 -11 27t-27 11h-75q-15 0 -26 -11t-11 -27v-675zM150 375q0 13 8 21l319 345q7 9 20 9q3 0 11 -2q17 -9 17 -29v-689q0 -20 -17 -28q-19 -7 -31 7l-319 344q-8 9 -8 22zM525 375q0 13 8 21l319 345q7 9 20 9 q3 0 11 -2q17 -9 17 -29v-689q0 -20 -17 -28q-19 -7 -31 7l-319 344q-8 9 -8 22z" />
<glyph unicode="&#xf04a;" horiz-adv-x="750" d="M0 374.5q0 12.5 8 21.5l319 345q7 9 20 9q5 0 11 -3q17 -7 17 -28v-689q0 -20 -17 -28q-18 -8 -31 7l-319 344q-8 9 -8 21.5zM375 374.5q0 12.5 8 21.5l319 345q7 9 20 9q5 0 11 -3q17 -7 17 -28v-689q0 -20 -17 -28q-18 -8 -31 7l-319 344q-8 9 -8 21.5z" />
<glyph unicode="&#xf04b;" horiz-adv-x="659" d="M0 34v682q0 19 17 29q18 11 34 0l591 -340q17 -12 17 -30t-17 -30l-591 -340q-8 -5 -17 -5t-17 5q-17 10 -17 29z" />
<glyph unicode="&#xf04c;" horiz-adv-x="750" d="M0 34v682q0 14 10 24t24 10h239q14 0 24 -10t10 -24v-682q0 -14 -10 -24t-24 -10h-239q-14 0 -24 10t-10 24zM443 34v682q0 14 10 24t24 10h239q14 0 24 -10t10 -24v-682q0 -14 -10 -24t-24 -10h-239q-14 0 -24 10t-10 24z" />
<glyph unicode="&#xf04d;" horiz-adv-x="750" d="M0 34v682q0 14 10 24t24 10h682q14 0 24 -10t10 -24v-682q0 -14 -10 -24t-24 -10h-682q-14 0 -24 10t-10 24z" />
<glyph unicode="&#xf04e;" horiz-adv-x="750" d="M0 30v690q0 19 17 28q19 7 31 -7l319 -344q8 -9 8 -22t-8 -22l-319 -344q-8 -9 -20 -9q-3 0 -11 2q-17 8 -17 28zM375 30v690q0 19 17 28q19 7 31 -7l319 -344q8 -9 8 -22t-8 -22l-319 -344q-8 -9 -20 -9q-3 0 -11 2q-17 8 -17 28z" />
<glyph unicode="&#xf050;" d="M0 30v690q0 19 17 28q19 7 31 -7l319 -344q8 -9 8 -22t-8 -22l-319 -344q-8 -9 -20 -9q-3 0 -11 2q-17 8 -17 28zM375 30v690q0 19 17 28q19 7 31 -7l319 -344q8 -9 8 -22t-8 -22l-319 -344q-8 -9 -20 -9q-3 0 -11 2q-17 8 -17 28zM750 37q0 -15 11 -26t26 -11h75 q16 0 27 11t11 26v675q0 16 -11 27t-27 11h-75q-15 0 -26 -11t-11 -27v-675z" />
<glyph unicode="&#xf051;" horiz-adv-x="525" d="M0 30v690q0 19 17 28q19 7 31 -7l319 -344q8 -9 8 -22t-8 -22l-319 -344q-8 -9 -20 -9q-3 0 -11 2q-17 8 -17 28zM375 37q0 -15 11 -26t26 -11h75q16 0 27 11t11 26v675q0 16 -11 27t-27 11h-75q-15 0 -26 -11t-11 -27v-675z" />
<glyph unicode="&#xf052;" horiz-adv-x="750" d="M0 34v97q0 14 10 24t24 10h682q14 0 24 -10t10 -24v-97q0 -14 -10 -24t-24 -10h-682q-14 0 -24 10t-10 24zM3 290q-9 21 7 37l341 341q10 10 24 10t24 -10l341 -341q16 -16 7 -37q-8 -21 -31 -21h-682q-23 0 -31 21z" />
<glyph unicode="&#xf053;" horiz-adv-x="471" d="M0 373.5q0 18.5 14 32.5l328 329q14 14 33 14t33 -14l49 -49q14 -14 14 -33t-14 -33l-248 -249l248 -244q14 -14 14 -32.5t-14 -32.5l-49 -50q-14 -14 -33 -14t-33 14l-328 329q-14 14 -14 32.5z" />
<glyph unicode="&#xf054;" horiz-adv-x="471" d="M0 95q0 19 14 33l248 248l-248 245q-14 14 -14 32.5t14 32.5l49 50q14 14 33 14t33 -14l328 -329q14 -14 14 -33t-14 -33l-328 -328q-14 -14 -33 -14t-33 14l-49 49q-14 14 -14 33z" />
<glyph unicode="&#xf055;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM159 338q0 -7 4.5 -11.5t10.5 -4.5h147v-161q0 -7 4.5 -11.5t10.5 -4.5h78 q6 0 10.5 4.5t4.5 11.5v161h147q6 0 10.5 4.5t4.5 11.5v74q0 6 -4.5 10.5t-10.5 4.5h-147v162q0 7 -4.5 11.5t-10.5 4.5h-78q-6 0 -10.5 -4.5t-4.5 -11.5v-162h-147q-6 0 -10.5 -4.5t-4.5 -10.5v-74z" />
<glyph unicode="&#xf056;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM159 338q0 -7 4.5 -11.5t10.5 -4.5h402q6 0 10.5 4.5t4.5 11.5v74q0 6 -4.5 10.5 t-10.5 4.5h-402q-6 0 -10.5 -4.5t-4.5 -10.5v-74z" />
<glyph unicode="&#xf057;" horiz-adv-x="750" d="M0 376q0 72 27.5 141t82.5 124t124 82t141 27t141 -27t124 -82t82.5 -124t27.5 -141t-27.5 -141t-82.5 -124t-124 -82.5t-141 -27.5t-141 27.5t-124 82.5t-82.5 124t-27.5 141zM185 240l55 -54q5 -5 11 -5t11 5l114 114l103 -104q5 -5 11 -5t11 5l53 53q11 11 0 22 l-104 103l115 115q11 11 0 22l-55 55q-11 11 -22 0l-114 -115l-104 104q-11 11 -22 0l-52 -53q-5 -5 -5 -11t5 -11l103 -103l-114 -115q-10 -10 0 -22z" />
<glyph unicode="&#xf058;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM112 351.5q0 -9.5 7 -16.5l150 -150q7 -6 18 -11t21 -5h25q10 0 21 5t18 11l259 259 q7 7 7 16.5t-7 15.5l-50 50q-6 7 -15.5 7t-16.5 -7l-212 -213q-7 -7 -16.5 -7t-15.5 7l-104 104q-7 7 -16.5 7t-15.5 -7l-50 -49q-7 -7 -7 -16.5z" />
<glyph unicode="&#xf059;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM250 531l44 -55q6 -4 10 -5q6 0 10 4q8 6 18 11q8 4 18.5 7.5t21.5 3.5 q20 0 33 -10.5t13 -26.5q0 -17 -11.5 -30.5t-28.5 -28.5q-11 -9 -22 -19.5t-20 -24t-15 -30t-6 -37.5v-30q0 -5 4.5 -9.5t9.5 -4.5h77q6 0 10 4.5t4 9.5v25q0 18 12 31t29 28q12 10 24 21.5t21.5 26.5t16 33t6.5 42q0 32 -13 57t-34.5 41.5t-48.5 25t-54 8.5 q-30 0 -53.5 -7.5t-40 -16.5t-25 -17t-9.5 -9q-9 -9 -1 -18zM315 132q0 -5 4.5 -9.5t9.5 -4.5h77q6 0 10 4.5t4 9.5v74q0 14 -14 14h-77q-5 0 -9.5 -4t-4.5 -10v-74z" />
<glyph unicode="&#xf05a;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM269 418q0 -14 14 -14h40v-192h-37q-5 0 -9.5 -4.5t-4.5 -9.5v-66q0 -5 4.5 -9.5 t9.5 -4.5h189q5 0 9.5 4.5t4.5 9.5v66q0 5 -4.5 9.5t-9.5 4.5h-36v271q0 6 -4.5 10t-9.5 4h-142q-14 0 -14 -14v-65zM322 555q0 -6 4.5 -10.5t10.5 -4.5h88q5 0 9.5 4.5t4.5 10.5v77q0 6 -4.5 10t-9.5 4h-88q-6 0 -10.5 -4t-4.5 -10v-77z" />
<glyph unicode="&#xf05b;" horiz-adv-x="750" d="M0 338v75q0 8 5.5 13t13.5 5h80q9 41 29 77.5t48.5 65t65 48.5t77.5 29v80q0 19 19 19h75q8 0 13 -5.5t5 -13.5v-80q41 -9 77.5 -29t65 -48.5t48.5 -65t29 -77.5h80q8 0 13.5 -5t5.5 -13v-75q0 -19 -19 -19h-80q-9 -41 -29 -77.5t-48.5 -65t-65 -48.5t-77.5 -29v-80 q0 -8 -5 -13.5t-13 -5.5h-75q-19 0 -19 19v80q-41 9 -77.5 29t-65 48.5t-48.5 65t-29 77.5h-80q-19 0 -19 19zM178 319q14 -52 51.5 -89.5t89.5 -51.5v85q0 8 5.5 13t13.5 5h75q8 0 13 -5t5 -13v-85q52 14 89.5 51.5t51.5 89.5h-84q-19 0 -19 19v75q0 8 5.5 13t13.5 5h84 q-14 52 -51.5 89.5t-89.5 51.5v-84q0 -8 -5 -13.5t-13 -5.5h-75q-19 0 -19 19v84q-52 -14 -89.5 -51.5t-51.5 -89.5h85q8 0 13 -5t5 -13v-75q0 -8 -5 -13.5t-13 -5.5h-85z" />
<glyph unicode="&#xf05c;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -54 20.5 -102t56 -83.5t83.5 -56t102 -20.5t102 20.5t84 56t56.5 83.5 t20.5 102t-20.5 102t-56.5 84t-84 56.5t-102 20.5t-102 -20.5t-83.5 -56.5t-56 -84t-20.5 -102zM212 466q0 8 5 14l53 53q6 5 14 5t13 -5l78 -78l78 78q6 5 14 5t13 -5l53 -53q5 -6 5 -14t-5 -13l-78 -78l78 -78q12 -14 0 -27l-53 -53q-14 -12 -27 0l-78 78l-78 -78 q-5 -5 -13 -5t-14 5l-53 53q-12 13 0 27l79 78l-79 78q-5 5 -5 13z" />
<glyph unicode="&#xf05d;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -54 20.5 -102t56 -83.5t83.5 -56t102 -20.5t102 20.5t84 56t56.5 83.5 t20.5 102t-20.5 102t-56.5 84t-84 56.5t-102 20.5t-102 -20.5t-83.5 -56.5t-56 -84t-20.5 -102zM156 352q0 8 5 13l53 53q5 5 13 5t14 -5l83 -84q13 -12 27 0l158 159q6 5 14 5t13 -5l53 -53q5 -5 5 -13t-5 -14l-192 -192q-6 -5 -15 -9t-17 -4h-55q-8 0 -17 4t-15 9 l-117 117q-5 6 -5 14z" />
<glyph unicode="&#xf05e;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM113 375q0 -39 10.5 -74.5t30.5 -66.5l362 362q-31 20 -66.5 31t-74.5 11 q-54 0 -102 -20.5t-83.5 -56.5t-56 -84t-20.5 -102zM234 154q31 -20 66.5 -30.5t74.5 -10.5q54 0 102 20.5t84 56t56.5 83.5t20.5 102q0 39 -11 74.5t-31 66.5z" />
<glyph unicode="&#xf060;" horiz-adv-x="750" d="M0 375q0 19 14 33l328 329q14 14 33 14t33 -14l49 -49q14 -14 14 -33t-14 -33l-165 -165h411q20 0 33.5 -13.5t13.5 -33.5v-70q0 -19 -13.5 -32.5t-32.5 -13.5h-412l165 -165q14 -14 14 -33t-14 -33l-49 -49q-14 -14 -33 -14t-33 14l-328 328q-14 14 -14 33z" />
<glyph unicode="&#xf061;" horiz-adv-x="750" d="M0 341v70q0 19 13.5 32.5t32.5 13.5h412l-165 165q-14 14 -14 33t14 33l49 49q14 14 33 14t33 -14l328 -329q14 -14 14 -32.5t-14 -32.5l-328 -329q-14 -14 -33 -14t-33 14l-49 49q-14 14 -14 33t14 33l165 165h-412q-19 0 -32.5 13.5t-13.5 33.5z" />
<glyph unicode="&#xf062;" horiz-adv-x="750" d="M-0.5 375q-0.5 19 13.5 33l329 328q14 14 33 14t33 -14l328 -328q14 -14 14 -33t-14 -33l-49 -49q-14 -14 -32.5 -14t-32.5 14l-166 165v-412q0 -19 -13.5 -32.5t-32.5 -13.5h-70q-20 0 -33 13.5t-13 32.5v412l-165 -165q-14 -14 -33 -14t-33 14l-49 49q-14 14 -14.5 33z " />
<glyph unicode="&#xf063;" horiz-adv-x="750" d="M0 374q0 19 14 33l49 49q14 14 33 14t33 -14l165 -165v412q0 19 13.5 32.5t32.5 13.5h70q20 0 33 -13.5t13 -32.5v-412l166 165q14 14 32.5 14t32.5 -14l50 -49q14 -14 14 -33t-14 -33l-329 -328q-14 -14 -33 -14t-33 14l-328 328q-14 14 -14 33z" />
<glyph unicode="&#xf064;" d="M0 66q0 102 35 192t106.5 157.5t181 107t259.5 40.5v143q0 35 17.5 42.5t43.5 -17.5l240 -241q17 -16 17 -40q0 -23 -17 -40l-240 -241q-25 -25 -43 -17.5t-18 42.5v161q-128 -1 -225 -27.5t-164 -72t-105 -107t-48 -132.5q-2 -16 -18 -16h-1q-16 0 -18 16q-3 25 -3 50z " />
<glyph unicode="&#xf065;" horiz-adv-x="750" d="M0 42v255q0 26 13 31.5t32 -12.5l81 -81l134 134q6 6 15 6t16 -6l78 -78q6 -7 6 -16t-6 -15l-134 -134l81 -81q19 -19 13 -32t-32 -13h-254q-18 0 -30 12q-13 13 -13 30zM375 475q0 9 6 15l134 134l-81 81q-19 19 -13 32t32 13h254q18 0 30 -12q13 -13 13 -30v-255 q0 -26 -13 -31.5t-32 12.5l-81 81l-134 -133q-6 -7 -15 -7t-16 7l-78 77q-6 7 -6 16z" />
<glyph unicode="&#xf066;" horiz-adv-x="750" d="M0 99q0 9 6 16l134 133l-81 81q-19 19 -13 32t32 13h254q19 0 30 -12q13 -13 13 -30v-255q0 -26 -13 -31.5t-32 13.5l-81 81l-134 -134q-6 -7 -15 -7t-16 7l-78 78q-6 6 -6 15zM375 417v255q0 26 13 31.5t32 -13.5l81 -81l134 134q6 7 15 7t16 -7l78 -78q6 -6 6 -15 t-6 -16l-134 -133l81 -81q19 -19 13 -32t-32 -13h-254q-20 0 -30 12q-13 13 -13 30z" />
<glyph unicode="&#xf067;" horiz-adv-x="750" d="M0 340v70q0 19 13.5 32.5t32.5 13.5h248v247q0 20 13 33.5t33 13.5h70q19 0 32.5 -13.5t13.5 -32.5v-248h248q19 0 32.5 -13.5t13.5 -32.5v-70q0 -19 -13.5 -32.5t-32.5 -13.5h-248v-247q0 -20 -13.5 -33.5t-32.5 -13.5h-70q-19 0 -32.5 13.5t-13.5 32.5v248h-247 q-20 0 -33.5 13t-13.5 33z" />
<glyph unicode="&#xf068;" horiz-adv-x="750" d="M0 340v70q0 19 13.5 32.5t32.5 13.5h658q19 0 32.5 -13.5t13.5 -32.5v-70q0 -19 -13.5 -32.5t-32.5 -13.5h-657q-20 0 -33.5 13t-13.5 33z" />
<glyph unicode="&#xf069;" horiz-adv-x="697" d="M1 497q-5 18 5 35l35 61q10 17 28.5 21.5t35.5 -4.5l162 -94v187q0 20 13.5 33.5t33.5 13.5h69q20 0 33.5 -13.5t13.5 -32.5v-188l162 94q17 9 35.5 4.5t28.5 -21.5l34 -61q10 -17 5.5 -35t-21.5 -28l-163 -94l163 -94q17 -10 21.5 -28t-4.5 -35l-35 -61 q-10 -17 -28.5 -21.5t-35.5 4.5l-162 94v-187q0 -20 -13.5 -33.5t-33.5 -13.5h-69q-20 0 -33.5 13.5t-13.5 32.5v188l-162 -94q-17 -10 -35.5 -5t-28.5 22l-35 61q-9 17 -4.5 35t21.5 28l163 94l-163 94q-17 10 -22 28z" />
<glyph unicode="&#xf06a;" horiz-adv-x="750" d="M0 375q0 78 29.5 146t80.5 119t119 80.5t146 29.5t146 -29.5t119 -80.5t80.5 -119t29.5 -146t-29.5 -146t-80.5 -119t-119 -80.5t-146 -29.5t-146 29.5t-119 80.5t-80.5 119t-29.5 146zM316 613l6 -347q2 -14 15 -14h76q14 0 14 14l7 347q1 5 -4 10q-3 4 -10 4h-90 q-7 0 -10 -4q-4 -4 -4 -10zM319 125q0 -14 14 -14h85q5 0 9.5 4t4.5 10v82q0 6 -4.5 10t-9.5 4h-85q-14 0 -14 -14v-82z" />
<glyph unicode="&#xf06b;" d="M0 281v188q0 8 5.5 13.5t13.5 5.5h258q-27 0 -51 10t-42 28t-28.5 42t-10.5 51t10.5 51t28.5 41.5t42 28t51 10.5q29 0 55 -11.5t43 -33.5l75 -97l75 97q17 22 43 33.5t55 11.5q27 0 51 -10.5t42 -28t28.5 -41.5t10.5 -51t-10.5 -51t-28.5 -42t-42 -28t-51 -10h258 q8 0 13.5 -5.5t5.5 -13.5v-188q0 -8 -5.5 -13t-13.5 -5h-56v-207q0 -23 -16.5 -39.5t-39.5 -16.5h-638q-23 0 -39.5 16.5t-16.5 39.5v207h-56q-8 0 -13.5 5t-5.5 13zM220 619q0 -23 17 -39.5t40 -16.5h113l-73 94q-5 5 -15 11.5t-25 6.5q-23 0 -40 -16.5t-17 -39.5zM356 105 q0 -15 11 -26t27 -11h112q16 0 27 11t11 26v383h-188v-383zM509 563h114q23 0 40 16.5t17 39.5t-17 39.5t-40 16.5q-15 0 -25 -6.5t-15 -11.5z" />
<glyph unicode="&#xf06c;" d="M3 78q9 25 25.5 41.5t33.5 30.5q14 11 24 20.5t13 20.5q1 2 0 5t-5 11q-2 6 -5 13.5t-5 16.5q-12 75 6.5 139t56.5 114.5t91 86.5t111 56q38 14 83.5 16.5t95.5 3.5q28 0 59.5 1t60.5 5.5t53.5 13.5t39.5 25q10 10 18.5 19.5t18 16.5t20.5 11.5t27 4.5q23 0 33 -21 q62 -121 32 -283q-42 -228 -272 -347q-110 -57 -220 -57q-36 0 -72.5 6t-71.5 19q-11 4 -21.5 9.5t-21.5 10.5q-13 8 -26.5 14.5t-22.5 7.5q-5 -1 -11.5 -8t-13 -16.5t-12.5 -19t-10 -15.5q-6 -11 -12 -20t-11 -16q-11 -14 -29 -14h-2q-28 2 -39 17.5t-14 23.5q-13 18 -5 37 zM188.5 253.5q1.5 -15.5 13.5 -26.5q10 -9 24 -9q18 0 28 13q42 48 85.5 82t90.5 54.5t99.5 29t114.5 6.5q15 -2 26.5 9.5t12.5 26.5q0 16 -10.5 27.5t-26.5 11.5q-69 3 -130 -7t-116 -34t-104.5 -63t-97.5 -94q-11 -11 -9.5 -26.5z" />
<glyph unicode="&#xf06d;" horiz-adv-x="675" d="M0 214q0 58 30.5 119.5t82.5 111.5q-11 -75 0.5 -120.5t30.5 -71.5q22 -30 53 -44q-24 105 -14 204q4 42 15.5 87.5t34 90t58.5 85.5t89 74q-23 -49 -22 -90t11 -71q11 -35 34 -64q16 -19 30.5 -37.5t25 -42.5t16.5 -56.5t6 -78.5q-9 20 -27 32t-41 12q-32 0 -53.5 -22 t-21.5 -53q0 -16 5.5 -30t17 -25t30 -17t44.5 -6q44 4 77 31q13 12 25.5 29.5t20.5 43t10 60t-5 80.5h-1q52 -50 82.5 -111.5t30.5 -119.5q0 -54 -26.5 -94t-72.5 -66.5t-107 -40t-131 -13.5t-131.5 13.5t-107.5 40t-72.5 66.5t-26.5 94z" />
<glyph unicode="&#xf06e;" d="M0 352.5q0 21.5 12 40.5q38 61 87 109.5t105.5 82t118.5 51t127 17.5q66 0 128 -17.5t118 -50.5t105 -81.5t88 -110.5q11 -19 11 -40.5t-11 -39.5q-39 -62 -88 -110.5t-105 -81.5t-118 -50.5t-128 -17.5q-65 0 -127 17.5t-118.5 51t-105.5 82t-87 109.5q-12 18 -12 39.5z M75 353q32 -51 73 -93t89 -71t101.5 -45t111.5 -16t111.5 16t101.5 45t89 71t73 93q-39 63 -91.5 110.5t-115.5 76.5q25 -29 39 -65t14 -78q0 -47 -17.5 -87.5t-48.5 -71.5t-72 -48.5t-87 -17.5q-47 0 -87.5 17.5t-71.5 48.5t-48.5 71.5t-17.5 87.5q0 38 12.5 72.5 t33.5 62.5q-57 -29 -106 -74.5t-86 -104.5zM300 397q0 -11 8 -19.5t20 -8.5t20 8.5t8 19.5q0 38 26 64t64 26q12 0 20 8.5t8 19.5q0 12 -8 20t-20 8q-30 0 -57 -11.5t-46.5 -31t-31 -46.5t-11.5 -57z" />
<glyph unicode="&#xf070;" d="M0 374.5q0 21.5 12 40.5q38 61 87 109.5t105.5 82t118.5 51t127 17.5q26 0 51.5 -3.5t50.5 -8.5l43 77q4 7 12 9q6 3 14 -1l65 -37q7 -4 9.5 -11.5t-1.5 -14.5l-378 -675q-3 -7 -11 -9q-2 -1 -5 -1t-9 2l-66 37q-7 4 -9 11.5t2 14.5l32 56q-71 33 -131.5 87t-106.5 127 q-12 18 -12 39.5zM75 375q40 -64 93.5 -112t117.5 -77l28 51q-42 31 -67.5 78t-25.5 104q0 38 12.5 72.5t33.5 63.5q-57 -30 -106 -75t-86 -105zM300 419q0 -11 8 -19.5t20 -8.5t20 8.5t8 19.5q0 38 26 64t64 26q12 0 20 8.5t8 19.5q0 12 -8 20t-20 8q-30 0 -57 -11.5 t-46.5 -31t-31 -46.5t-11.5 -57zM453 75l43 78q102 12 186.5 70.5t142.5 151.5q-53 83 -128 138l37 67q45 -32 84 -73t71 -92q11 -19 11 -40.5t-11 -39.5q-78 -124 -191.5 -191.5t-244.5 -68.5zM528 210l139 249q2 -10 3 -19.5t1 -20.5q0 -36 -10.5 -68.5t-29.5 -59.5 t-45.5 -48t-57.5 -33z" />
<glyph unicode="&#xf071;" horiz-adv-x="850" d="M5 23.5q-14 23.5 6 56.5l368 637q18 33 46 33q26 0 46 -33l368 -637q19 -33 5.5 -56.5t-51.5 -23.5h-736q-38 0 -52 23.5zM160 113h530l-265 459zM370 434q0 6 4 10t9 4h84q5 0 9 -4t4 -10l-7 -182q0 -12 -13 -12h-70q-13 0 -13 12zM372 189q0 13 13 13h78q13 0 13 -13 l1 -49q0 -13 -13 -13h-78q-13 0 -13 13z" />
<glyph unicode="&#xf072;" d="M1 212l34 144q2 8 2 18t-2 18l-34 144q-2 8 2 13.5t12 5.5h45q8 0 17 -4.5t14 -10.5l85 -110q44 9 92 14t94 5h12l-61 283q-2 8 2.5 13t12.5 5h64q8 0 16 -4.5t12 -11.5l164 -285h157q29 0 58 -6.5t51.5 -17t36.5 -24t13 -27.5q1 -14 -13 -27.5t-36.5 -24t-51.5 -17 t-58 -6.5h-158l-163 -283q-4 -7 -12 -11.5t-16 -4.5h-64q-8 0 -12.5 5t-2.5 13l61 281h-12q-46 0 -94 5.5t-92 13.5l-85 -110q-12 -14 -31 -14h-45q-8 0 -12 5t-2 13z" />
<glyph unicode="&#xf073;" horiz-adv-x="750" d="M0 56v549q0 23 16.5 39.5t39.5 16.5h36v-69q0 -28 19.5 -47.5t47.5 -19.5h15q28 0 48 19.5t20 47.5v69h58v-69q0 -28 19.5 -47.5t47.5 -19.5h16q28 0 47.5 19.5t19.5 47.5v69h58v-69q0 -28 20 -47.5t48 -19.5h15q28 0 47.5 19.5t19.5 47.5v69h36q23 0 39.5 -16.5 t16.5 -39.5v-549q0 -23 -16.5 -39.5t-39.5 -16.5h-638q-23 0 -39.5 16.5t-16.5 39.5zM75 75h600v398h-600v-398zM129 592v128q0 12 9 21t21 9h15q13 0 21.5 -9t8.5 -21v-128q0 -12 -8.5 -20.5t-21.5 -8.5h-15q-12 0 -21 8.5t-9 20.5zM177 158q0 36 20 58.5t43.5 39t43.5 32 t20 36.5q0 20 -11.5 29t-28.5 9q-11 0 -20.5 -4.5t-16.5 -11.5q-4 -4 -7 -8t-6 -9l-34 23q7 14 20 27q11 11 27.5 19t40.5 8q35 0 61 -20.5t26 -58.5q0 -21 -9 -36.5t-23 -28t-30 -22.5t-30 -20t-23.5 -21t-9.5 -25h92v34h42v-73h-185q-1 6 -1.5 12t-0.5 11zM338 592v128 q0 12 8.5 21t20.5 9h16q12 0 21 -9t9 -21v-128q0 -12 -9 -20.5t-21 -8.5h-16q-12 0 -20.5 8.5t-8.5 20.5zM397 330v71h187v-34l-117 -232h-51l107 212q3 8 6 11l3 4v1q-3 0 -5 -1h-13h-75v-32h-42zM546 592v128q0 12 8.5 21t21.5 9h15q12 0 21 -9t9 -21v-128q0 -12 -9 -20.5 t-21 -8.5h-15q-13 0 -21.5 8.5t-8.5 20.5z" />
<glyph unicode="&#xf074;" d="M0 122v75q0 19 19 19h107q25 0 48.5 15.5t45.5 41t44 58.5t44 68q27 43 56 85.5t62 75.5t72 53.5t88 20.5h99v90q0 20 12 24t29 -10l163 -135q11 -9 11 -23q0 -13 -11 -22l-163 -136q-17 -14 -29 -10t-12 24v86h-99q-26 0 -49 -15.5t-45.5 -41t-44.5 -58.5t-44 -68 q-27 -44 -55.5 -86t-61.5 -75t-72.5 -53.5t-87.5 -20.5h-107q-8 0 -13.5 5t-5.5 13zM0 541v75q0 8 5.5 13.5t13.5 5.5h107q52 0 93.5 -23.5t76.5 -61.5q-18 -25 -34 -49.5t-31 -47.5q-25 31 -50.5 50t-54.5 19h-107q-8 0 -13.5 5.5t-5.5 13.5zM417 190q17 24 33 48.5 t31 48.5q25 -31 50.5 -50t54.5 -19h99v94q0 20 12 24t29 -10l163 -136q11 -9 11 -22q0 -14 -11 -23l-163 -135q-17 -14 -29 -10t-12 24v82h-99q-53 0 -93.5 23t-75.5 61z" />
<glyph unicode="&#xf075;" d="M0 421q0 68 35.5 128t96.5 104.5t143 70.5t175 26t175 -26t143 -70.5t96.5 -104.5t35.5 -128t-35.5 -128t-96.5 -104.5t-143 -70.5t-175 -26q-44 0 -84 6q-42 -32 -90.5 -55t-103.5 -35l-24 -4q-12 -2 -25 -4q-16 -2 -20 14v1q-2 7 3 11l9 10q10 11 19.5 21.5t17 24.5 t14 32.5t11.5 45.5q-81 45 -129 112.5t-48 148.5z" />
<glyph unicode="&#xf076;" horiz-adv-x="750" d="M0 311v139q0 8 5.5 13.5t13.5 5.5h187q8 0 13.5 -5.5t5.5 -13.5v-139q0 -13 11 -28t30.5 -28t47 -21.5t61.5 -8.5t61.5 8.5t47 21.5t30.5 28t11 28v139q0 8 5.5 13.5t13.5 5.5h187q8 0 13.5 -5.5t5.5 -13.5v-139q0 -65 -29.5 -121.5t-80.5 -98.5t-119 -66.5t-146 -24.5 t-146 24.5t-119 66.5t-80.5 98.5t-29.5 121.5zM0 544v187q0 19 19 19h187q19 0 19 -19v-187q0 -19 -19 -19h-187q-19 0 -19 19zM525 544v187q0 19 19 19h187q19 0 19 -19v-187q0 -19 -19 -19h-187q-19 0 -19 19z" />
<glyph unicode="&#xf077;" horiz-adv-x="750" d="M-0.5 173.5q-0.5 18.5 13.5 32.5l329 329q14 14 33 14t33 -14l328 -329q14 -14 14 -32.5t-14 -32.5l-49 -50q-14 -14 -33 -14t-33 14l-248 249l-244 -249q-14 -14 -33 -14t-33 14l-49 50q-14 14 -14.5 32.5z" />
<glyph unicode="&#xf078;" horiz-adv-x="750" d="M0 448.5q0 18.5 14 32.5l49 50q14 14 33 14t33 -14l248 -249l244 249q14 14 33 14t33 -14l49 -50q14 -14 14.5 -32.5t-13.5 -32.5l-329 -329q-14 -14 -33 -14t-33 14l-328 329q-14 14 -14 32.5z" />
<glyph unicode="&#xf079;" d="M1 502.5q-6 14.5 13 34.5l181 199q12 14 30 14t30 -14l181 -199q19 -20 13 -34.5t-32 -14.5h-117v-319h81q4 -5 6.5 -9.5t7.5 -9.5l119 -131h-327q-15 0 -26 11t-11 26v432h-117q-26 0 -32 14.5zM386 731h326q16 0 27 -11t11 -26v-431h117q26 0 32 -15t-13 -35l-181 -199 q-12 -14 -30 -14t-30 14l-181 199q-19 20 -13 35t32 15h117v318h-81q-4 5 -6.5 9.5t-7.5 9.5z" />
<glyph unicode="&#xf07a;" d="M0 694v37q0 19 19 19h113q8 0 18.5 -2t17.5 -4q3 -2 7 -7t7.5 -11.5t6 -13t3.5 -10.5l13 -61h658q17 0 28 -13t8 -29l-53 -282q-3 -12 -13 -20.5t-24 -8.5h-529l17 -82q2 -8 8.5 -13t14.5 -5h418q8 0 13.5 -5.5t5.5 -13.5v-38q0 -8 -5.5 -13t-13.5 -5h-80h-318h-51 q-8 0 -18 1.5t-17 4.5q-3 1 -7 6.5t-7.5 12t-6 13t-3.5 10.5l-105 496q-2 8 -8.5 13t-14.5 5h-83q-19 0 -19 19zM284 56q0 23 16.5 40t39.5 17q24 0 40.5 -17t16.5 -40t-16.5 -39.5t-40.5 -16.5q-23 0 -39.5 16.5t-16.5 39.5zM602 56q0 23 16.5 40t39.5 17t39.5 -17 t16.5 -40t-16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5z" />
<glyph unicode="&#xf07b;" d="M0 56v638q0 23 16.5 39.5t39.5 16.5h338q23 0 39.5 -16.5t16.5 -39.5t16.5 -39.5t39.5 -16.5h338q23 0 39.5 -17t16.5 -40v-525q0 -23 -16.5 -39.5t-39.5 -16.5h-788q-23 0 -39.5 16.5t-16.5 39.5z" />
<glyph unicode="&#xf07c;" d="M0 185v509q0 23 16.5 39.5t39.5 16.5h338q23 0 39.5 -16.5t16.5 -39.5t16.5 -39.5t39.5 -16.5h216q23 0 39.5 -17t16.5 -40v-108h-600q-18 0 -35 -6t-32 -16.5t-26 -25t-17 -31.5zM21 0l120 371q3 11 15 19t23 8h721l-127 -370q-3 -11 -15 -19.5t-23 -8.5h-714z" />
<glyph unicode="&#xf07d;" horiz-adv-x="375" d="M0.5 187q4.5 11 27.5 11h95v354h-95q-23 0 -27.5 10.5t11.5 26.5l150 151q10 10 26 10q15 0 25 -10l150 -151q16 -15 11.5 -26t-27.5 -11h-95v-354h95q23 0 27.5 -10.5t-11.5 -26.5l-150 -151q-10 -10 -26 -10q-15 0 -25 10l-150 151q-16 15 -11.5 26z" />
<glyph unicode="&#xf07e;" horiz-adv-x="750" d="M0 357q0 15 10 25l151 151q15 15 26 10.5t11 -26.5v-96h354v96q0 22 10.5 26.5t26.5 -11.5l151 -150q10 -10 10 -25t-10 -25l-151 -151q-15 -16 -26 -11t-11 27v96h-354v-96q0 -22 -10.5 -26.5t-26.5 11.5l-151 150q-10 10 -10 25z" />
<glyph unicode="&#xf080;" d="M0 56v638q0 23 17 39.5t40 16.5h787q23 0 39.5 -16.5t16.5 -39.5v-638q0 -23 -16.5 -39.5t-39.5 -16.5h-787q-23 0 -40 16.5t-17 39.5zM75 75h750v600h-750v-600zM150 129v177h99v-177h-99zM317 129v379h98v-379h-98zM485 129v289h99v-289h-99zM651 129v450h99v-450h-99z " />
<glyph unicode="&#xf081;" horiz-adv-x="750" d="M0 94v562q0 19 7.5 36.5t20 30t29.5 20t36 7.5h563q39 0 66.5 -27.5t27.5 -66.5v-562q0 -20 -7.5 -37t-20 -29.5t-30 -20t-36.5 -7.5h-563q-19 0 -36 7.5t-29.5 20t-20 29.5t-7.5 37zM98 273q39 -54 97 -82.5t127 -28.5q47 0 90 13t78 36t60.5 55t37.5 70q40 3 63 28 q7 7 2 16q-4 9 -15 7h-2q11 11 15 22q4 10 -4 16q-7 7 -16 1q-4 -2 -14.5 -5t-22.5 -3q-2 0 -3.5 0.5t-3.5 0.5q0 1 -0.5 2t-0.5 2q-8 30 -28 54t-46 35q2 2 3 4t3 4q3 8 0 16q-1 3 -6 8t-17 4q-1 2 -3 4q-6 6 -12 4q-12 -2 -24 -6l-1 1q-7 4 -15 -1q-29 -18 -48 -49 t-33 -66q-17 15 -28 20q-30 17 -63 31t-75 30q-7 2 -12 -2q-5 -3 -7 -10q-1 -13 4 -28.5t19 -30.5q-12 -3 -10 -16q6 -33 33 -49l-6 -6q-7 -7 -2 -16q2 -6 13 -18.5t32 -18.5q-3 -6 -3 -11t1 -7q3 -16 19 -24q-18 -12 -38.5 -16.5t-41.5 -3t-40.5 10t-34.5 22.5q-4 4 -9.5 4 t-9.5 -4q-11 -9 -2 -19z" />
<glyph unicode="&#xf082;" horiz-adv-x="750" d="M1 94v562q0 19 7.5 36.5t20 30t29.5 20t36 7.5h563q39 0 66.5 -27.5t27.5 -66.5v-562q0 -20 -7.5 -37t-20 -29.5t-30 -20t-36.5 -7.5h-237v314h84q6 0 10.5 4t4.5 10l6 82q0 7 -4 12q-5 5 -11 5h-90v36q0 20 5 26.5t26 6.5q12 0 27 -2t29 -5q3 0 6.5 0.5t5.5 2.5 q5 3 7 11l11 79q2 14 -12 17q-44 12 -92 12q-147 0 -147 -143v-41h-50q-16 0 -16 -16v-82q0 -6 4.5 -10.5t11.5 -4.5h50v-314h-192q-19 0 -36 7.5t-29.5 20t-20 29.5t-7.5 37z" />
<glyph unicode="&#xf083;" d="M0 56v638q0 23 16.5 39.5t39.5 16.5h788q23 0 39.5 -16.5t16.5 -39.5v-638q0 -23 -16.5 -39.5t-39.5 -16.5h-788q-23 0 -39.5 16.5t-16.5 39.5zM75 78h750v56h-750v-56zM75 559h750v113h-467l-7 -45h-276v-68zM130 655h154v45h-154v-45zM272 346q0 -37 14 -69.5t38 -56.5 t56.5 -38t69.5 -14t69.5 14t56.5 38t38 56.5t14 69.5t-14 69.5t-38 56.5t-56.5 38t-69.5 14t-69.5 -14t-56.5 -38t-38 -56.5t-14 -69.5zM328 346q0 25 9.5 47.5t26 39t39 26t47.5 9.5t47.5 -9.5t39 -26t26 -39t9.5 -47.5t-9.5 -47.5t-26 -39t-39 -26t-47.5 -9.5t-47.5 9.5 t-39 26t-26 39t-9.5 47.5zM363 346q0 -8 6 -14t14 -6q9 0 15 6t6 14q0 20 13.5 33t32.5 13v1q9 0 15 6t6 14q0 9 -6 15t-15 6q-36 0 -61.5 -26t-25.5 -62z" />
<glyph unicode="&#xf084;" d="M0.5 391.5q-2.5 52.5 14 108.5t53.5 107q36 51 83.5 85t98 48t99.5 8t90 -35q36 -26 57 -63.5t27.5 -82.5t-1.5 -93.5t-32 -95.5l195 -139l47 65l-49 35q-7 5 -8.5 13t3.5 15l23 32q5 7 13 8.5t15 -3.5l163 -116q7 -5 8 -13t-4 -15l-23 -33q-5 -7 -13 -8.5t-15 3.5 l-48 35l-47 -65l116 -83q20 -14 24.5 -39t-10.5 -45q-14 -20 -38.5 -24t-44.5 10l-376 269q-37 -38 -80.5 -61.5t-88 -31.5t-87 -0.5t-78.5 33.5q-41 29 -62.5 74t-24 97.5zM109 374.5q3 -19.5 13.5 -37t27.5 -29.5t37 -16.5t39.5 -1t37 14t29.5 27.5q17 24 18 53t-12 54 q28 -5 55 5.5t45 35.5q12 17 16.5 37t1 39.5t-14 37t-27.5 29.5t-37 16.5t-39.5 1t-37 -14t-29.5 -27.5q-17 -25 -18.5 -54t12.5 -54q-28 5 -55 -5.5t-45 -35.5q-12 -17 -16 -36.5t-1 -39z" />
<glyph unicode="&#xf085;" d="M0 391v84q0 6 5 6q14 4 29.5 6t30.5 4q4 0 7 0.5t7 0.5q6 21 17 42q-9 14 -20 28t-23 28q-5 5 0 9q14 17 30 33.5t33 30.5q6 4 9 -1q8 -8 17 -14.5t18 -13.5l21 -15q21 11 42 17q2 21 4.5 39t6.5 35q0 5 6 5h84q7 0 7 -6q2 -14 4.5 -28.5t4.5 -29.5l2 -15q20 -6 41 -17 q8 7 19 14q10 8 19.5 15t18.5 15q6 4 9 -1q5 -4 9 -8l8 -8l22 -22q12 -12 23 -25q3 -5 0 -9q-10 -11 -20 -24.5t-23 -30.5q6 -11 10.5 -22t8.5 -22q8 -2 17.5 -3t19.5 -3l18 -2q9 -1 17 -3q6 -2 6 -7v-84q0 -5 -5 -7q-14 -3 -29.5 -5t-30.5 -4q-4 0 -14 -2q-6 -20 -17 -41 q9 -14 20 -28t23 -28q4 -5 0 -9q-14 -17 -30 -33.5t-33 -30.5q-6 -4 -9 1q-8 7 -17 14t-18 13q-5 5 -10.5 8.5t-10.5 7.5q-21 -11 -42 -17q-2 -17 -4 -36.5t-7 -37.5q-2 -5 -7 -5h-84q-6 0 -6 5q-3 14 -5 29l-4 30l-2 15q-20 6 -41 17q-5 -4 -9.5 -7t-9.5 -7 q-10 -8 -19.5 -15t-18.5 -15q-6 -4 -9 1q-5 4 -8 8l-9 8q-11 11 -22.5 22t-22.5 25q-4 4 0 8q12 14 22.5 28.5t19.5 27.5q-10 20 -18 44q-8 2 -17.5 3t-19.5 3l-18 2q-9 1 -18 3q-5 2 -5 7zM197 432q0 -35 25 -60t60 -25t60 25t25 60t-25 60t-60 25t-60 -25t-25 -60z M524 188q-2 6 4 8q11 4 21 8t21 8q1 5 1.5 9t2.5 9t3.5 8.5t3.5 8.5q-7 10 -13 19.5t-12 19.5q-3 5 2 8l62 56q4 4 9 1q9 -7 17.5 -14t17.5 -15q18 7 35 8q5 11 10.5 21t10.5 19q3 5 8 3l80 -25q5 -2 5 -8q-2 -11 -4 -21.5t-4 -21.5q8 -6 14 -13t11 -15q12 1 23 1.5t22 0.5 q5 0 7 -5l18 -83q2 -5 -4 -7q-11 -5 -21 -8.5t-21 -7.5q-1 -5 -1.5 -9t-2.5 -9t-3.5 -8.5t-3.5 -7.5q7 -10 13.5 -19.5t11.5 -19.5q2 -5 -2 -8l-62 -57q-4 -4 -9 0q-8 7 -17 14t-17 14q-20 -7 -37 -8q-5 -11 -10 -21t-10 -19q-3 -5 -8 -3l-80 25q-5 2 -5 8q2 11 3.5 22 t3.5 22q-14 12 -24 27q-12 -2 -23.5 -2.5t-22.5 0.5q-5 0 -7 5zM560 607q0 5 5 7q10 2 20 4.5t20 4.5q2 4 3 8t3 8t4.5 7t4.5 7q-5 10 -9 19.5t-8 18.5q-2 4 2 8l64 42q5 3 8 -1q8 -7 14.5 -14.5t13.5 -15.5q16 3 33 3q12 18 24 33q3 3 8 2l69 -34q5 -3 3 -8 q-2 -10 -5.5 -19t-6.5 -19q10 -13 18 -29q11 -1 21.5 -1.5t20.5 -2.5q5 -2 5 -6l5 -77q0 -4 -5 -6q-10 -2 -19.5 -4.5t-20.5 -4.5q-2 -4 -3 -7.5t-3 -7.5q-3 -7 -8 -14q5 -10 9 -19.5t8 -18.5q2 -5 -3 -8l-63 -42q-5 -3 -8 1q-13 12 -28 30q-8 -2 -16.5 -3t-17.5 0 q-6 -9 -12 -17.5t-12 -16.5q-3 -3 -8 -1l-69 34q-5 2 -3 7q3 10 6 19.5t7 19.5q-6 6 -10.5 13t-8.5 15q-11 1 -21.5 1.5t-20.5 2.5q-5 0 -5 6zM658 203q-7 -22 3.5 -42.5t33.5 -27.5q22 -8 42.5 2.5t27.5 33.5q8 22 -2.5 42.5t-33.5 28.5q-22 7 -42.5 -3.5t-28.5 -33.5z M681 564q7 -20 26 -30q20 -9 40 -2.5t29 25.5q10 20 3 40t-26 29q-19 10 -39 3t-30 -26t-3 -39z" />
<glyph unicode="&#xf086;" d="M0 483q0 55 29 103.5t78.5 85t116 57.5t142.5 21t142.5 -21t116 -57.5t78 -85t28.5 -103.5q0 -56 -28.5 -104.5t-78 -84.5t-116 -57t-142.5 -21q-18 0 -35 1.5t-34 3.5q-34 -26 -73 -45t-84 -29q-20 -5 -40 -6q-12 -2 -16 11v1q-2 5 1.5 9t7.5 8q17 17 30 37t21 64 q-66 36 -105 91t-39 121zM305 136q8 4 12 7q13 -2 25 -2h24q93 0 173 26.5t139.5 72.5t93.5 108.5t34 134.5q0 19 -3 39q45 -36 71 -81.5t26 -98.5q0 -66 -39 -120.5t-105 -91.5q8 -44 21 -63.5t30 -36.5q4 -5 7.5 -9t1.5 -9q-1 -6 -6 -9.5t-10 -2.5q-11 2 -20.5 3.5 t-19.5 3.5q-88 19 -157 73q-17 -2 -34 -3.5t-35 -1.5q-66 0 -123.5 16t-105.5 45z" />
<glyph unicode="&#xf087;" horiz-adv-x="783" d="M0.5 222q-1.5 56 2 112t12.5 105q45 3 94 3t90 -10q6 -38 10 -91t5.5 -110t0.5 -111t-5 -94q-18 -2 -41.5 -2.5t-49 0.5t-50 1.5t-44.5 0.5q-10 38 -16.5 89t-8 107zM91 101q0 -16 11 -27t27 -11t26.5 11t10.5 27q0 15 -10.5 26t-26.5 11t-27 -11t-11 -26zM240 412 q22 10 35.5 19.5t24.5 21t22.5 26t30.5 34.5q16 16 28.5 26.5t23 20t19 20t17.5 25.5q16 29 21 65t13 68q0 7 7 11q19 3 35 -3.5t28 -17.5t19.5 -26t10.5 -28q6 -33 -1.5 -59.5t-19 -50.5t-22 -46.5t-11.5 -47.5q21 -9 51.5 -9.5t63.5 1t64 1.5t52 -8.5t28.5 -29t-5.5 -59.5 q0 -2 -2.5 -5.5t-5 -8t-4.5 -8.5l-2 -3q11 -11 16 -23t5 -20q1 -39 -32 -68q10 -15 11 -31.5t-4 -31.5t-14.5 -26.5t-21.5 -17.5q6 -34 -6 -58t-35.5 -38.5t-56.5 -20.5t-69 -6t-72.5 5t-67.5 14q-20 6 -39 14t-38.5 15t-41 11t-45.5 0q2 39 2.5 85t-1 93.5t-4.5 92.5t-7 82 z" />
<glyph unicode="&#xf088;" horiz-adv-x="783" d="M1 452q-1 21 7.5 37.5t24.5 30.5q-9 15 -10 31.5t3.5 31.5t14 26.5t21.5 17.5q-6 34 6 58t35.5 38.5t56.5 20.5t69 6t72.5 -5t67.5 -14q20 -6 39 -14t38.5 -15t41 -10.5t45.5 0.5q-2 -39 -2.5 -85.5t1 -94t4 -92.5t7.5 -82q-22 -10 -35.5 -19.5t-24 -21t-22.5 -26 t-31 -33.5q-15 -17 -27.5 -27.5t-23 -20t-19.5 -19.5t-18 -26q-16 -29 -20.5 -65t-13.5 -68q0 -8 -7 -11q-20 -3 -35.5 3.5t-27.5 17.5t-19.5 25.5t-10.5 28.5q-6 33 1.5 59.5t19 50.5t22 47t11.5 48q-21 9 -51.5 9t-63.5 -1.5t-63.5 -1.5t-52 8.5t-29 29t5.5 59.5 q1 1 3.5 5.5t5 8.5t3.5 8l2 3q-11 11 -16 23t-5 20zM568 630q1 54 5 94q18 2 42 2.5t49.5 0t50 -1.5t44.5 -1q10 -38 16 -89t7.5 -106.5t-2 -112t-12.5 -105.5q-45 -3 -93.5 -3t-90.5 10q-6 38 -10 91t-5.5 110t-0.5 111zM617 650q0 -16 11 -27t27 -11q15 0 26 11t11 27 q0 15 -11 26t-26 11q-16 0 -27 -11t-11 -26z" />
<glyph unicode="&#xf089;" horiz-adv-x="393" d="M0.5 465q4.5 13 25.5 16l238 34l106 216q9 19 23 19v-633l-212 -112q-20 -10 -31 -2t-7 30l41 236l-172 168q-16 15 -11.5 28z" />
<glyph unicode="&#xf08a;" horiz-adv-x="846" d="M0 519q0 64 20.5 108t53 71.5t73.5 39.5t82 12q30 0 59 -10t54 -25t45.5 -32.5t35.5 -32.5q15 15 36 32.5t46 32.5t53.5 25t58.5 10q42 0 83 -12t73.5 -39.5t52.5 -71.5t20 -108q0 -44 -16.5 -83.5t-36 -69.5t-37 -48t-18.5 -19l-288 -288q-13 -11 -27 -11q-15 0 -26 11 l-290 288q-1 1 -18 19t-36.5 48t-36 69.5t-16.5 83.5zM75 519q0 -32 13 -61.5t29 -53t29 -37.5l14 -14l263 -263l263 262q1 1 14 15t29 37.5t29 53t13 61.5q0 48 -14 78.5t-36.5 48t-50 23.5t-53.5 6q-25 0 -50.5 -12t-48 -29t-40 -34.5t-26.5 -28.5q-11 -14 -29 -14t-29 14 q-9 11 -26.5 28.5t-40 34.5t-48 29t-50.5 12q-26 0 -53.5 -6t-50 -23.5t-36.5 -48t-14 -78.5z" />
<glyph unicode="&#xf08b;" horiz-adv-x="825" d="M0 150v450q0 31 12 58t32.5 47.5t47.5 32.5t58 12h225v-94h-225q-23 0 -39.5 -16.5t-16.5 -39.5v-450q0 -23 16.5 -39.5t39.5 -16.5h225v-94h-225q-31 0 -58 12t-47.5 32.5t-32.5 47.5t-12 58zM248 285v180q0 16 11 26.5t27 10.5h209v143q0 20 19 28q19 7 32 -7l270 -270 q9 -9 9 -21.5t-9 -20.5l-270 -270q-9 -9 -21 -9q-5 0 -11 2q-19 8 -19 28v142h-209q-16 0 -27 11t-11 27z" />
<glyph unicode="&#xf08c;" horiz-adv-x="750" d="M0 94v562q0 19 7.5 36.5t20 30t29.5 20t37 7.5h562q39 0 66.5 -27.5t27.5 -66.5v-562q0 -20 -7.5 -37t-20 -29.5t-30 -20t-36.5 -7.5h-562q-39 0 -66.5 27.5t-27.5 66.5zM101 582q0 -28 19.5 -47.5t46.5 -19.5q28 0 47.5 19.5t19.5 47.5q0 27 -19.5 46.5t-47.5 19.5 q-27 0 -46.5 -19.5t-19.5 -46.5zM104 117q0 -5 4.5 -9.5t9.5 -4.5h98q6 0 10 4.5t4 9.5v345q0 14 -14 14h-98q-5 0 -9.5 -4t-4.5 -10v-345zM283 117q0 -5 4.5 -9.5t9.5 -4.5h98q6 0 10 4.5t4 9.5v187q0 28 8 47q15 31 55 31q32 0 42 -19q7 -11 7 -35v-211q0 -5 4 -9.5 t10 -4.5h100q6 0 10 4.5t4 9.5v233q0 72 -42 104q-40 31 -103 31q-50 0 -85 -23q-4 -3 -13 -12v12q0 14 -14 14h-95q-5 0 -9.5 -4t-4.5 -10v-345z" />
<glyph unicode="&#xf08d;" d="M1 461q4 38 21 80.5t47 82.5t65.5 68.5t71.5 43t68.5 14t56.5 -18.5q25 -18 34.5 -49.5t5.5 -70.5l141 -105q52 29 101.5 33.5t84.5 -21.5q25 -19 37.5 -50.5t11.5 -70.5t-14.5 -83.5t-39.5 -88.5l201 -193q5 -5 6 -12t-4 -12q-5 -8 -15 -8q-3 0 -9 2l-242 138 q-35 -37 -73.5 -63t-75.5 -38t-71 -9.5t-60 22.5q-35 26 -45 74.5t4 106.5l-141 106q-36 -15 -69 -15t-58 18q-24 18 -34 49.5t-6 69.5zM80 417.5q1 -7.5 8 -12.5q8 -7 22 -7q15 0 31.5 8t33.5 22t33.5 31.5t31.5 37.5q5 6 4 13.5t-8 12.5q-6 5 -13.5 4t-12.5 -8 q-37 -49 -65.5 -67.5t-34.5 -16.5q-6 5 -13.5 4t-12.5 -8q-5 -6 -4 -13.5zM219 368l170 -127q6 -4 11 -4q10 0 15 8q5 6 4 13.5t-7 12.5l-163 121q-15 -14 -30 -24zM393 141q-10 -16 4 -27q13 -10 33 -10q19 0 41 10t44.5 27t44.5 39t41 47q5 7 4 14.5t-8 12.5 q-6 5 -13.5 3.5t-12.5 -7.5q-24 -32 -48 -54.5t-45 -35.5t-36.5 -17t-22.5 2q-6 5 -13.5 3.5t-12.5 -7.5z" />
<glyph unicode="&#xf08e;" d="M0 150v450q0 31 12 58.5t32 47.5t47.5 32t58.5 12h284q-1 -7 -2 -13.5t-1 -14.5v-43q0 -11 3 -23h-284q-23 0 -39.5 -16.5t-16.5 -39.5v-450q0 -23 16.5 -39.5t39.5 -16.5h525q23 0 39.5 16.5t16.5 39.5v166q20 -15 44 -24t50 -10v-132q0 -31 -12 -58t-32.5 -47.5 t-47.5 -32.5t-58 -12h-525q-31 0 -58.5 12t-47.5 32.5t-32 47.5t-12 58zM338 255q0 12 8 20l376 377h-131q-12 0 -20 8t-8 20v42q-1 11 7.5 19.5t20.5 8.5h281q11 0 19.5 -8.5t8.5 -19.5v-42v-239q0 -12 -8.5 -20.5t-19.5 -7.5h-42q-12 0 -20 8t-8 20v131l-377 -376 q-8 -8 -20 -8t-20 8l-39 39q-8 8 -8 20z" />
<glyph unicode="&#xf090;" horiz-adv-x="825" d="M0 285v180q0 16 11 26.5t27 10.5h209v143q0 20 18 28q19 7 33 -7l270 -270q8 -9 8 -21.5t-8 -20.5l-270 -270q-9 -9 -21 -9q-4 0 -12 2q-18 8 -18 28v142h-209q-16 0 -27 11t-11 27zM450 0v94h225q23 0 39.5 16.5t16.5 39.5v450q0 23 -16.5 39.5t-39.5 16.5h-225v94h225 q31 0 58 -12t47.5 -32t32.5 -47.5t12 -58.5v-450q0 -31 -12 -58t-32.5 -47.5t-47.5 -32.5t-58 -12h-225z" />
<glyph unicode="&#xf091;" horiz-adv-x="825" d="M0 509v91q0 16 11 26.5t27 10.5h158q-1 6 -1 13v11v2q0 26 2 43t7.5 26.5t15.5 13.5t27 4h331q16 0 26.5 -4t16 -13.5t7.5 -26.5t2 -43v-13q0 -6 -1 -13h158q16 0 27 -10.5t11 -26.5v-91q0 -31 -22 -64t-59.5 -62.5t-88 -52t-108.5 -31.5q-25 -5 -44.5 -20.5t-19.5 -34.5 q0 -17 8.5 -25t19 -15t19.5 -15.5t11 -25.5q2 -11 -1 -23q-2 -7 11.5 -11.5t33 -9t40 -11t31.5 -16.5q6 -5 9.5 -19.5t4.5 -31.5q1 -16 -3 -28.5t-14 -12.5h-481q-10 0 -14 12.5t-3 28.5q1 17 4.5 31.5t9.5 19.5q11 10 31 16.5t39.5 11t33.5 9t12 11.5t-2 12v11 q1 17 10.5 25.5t20.5 15.5t19.5 15t8.5 25q0 19 -19.5 34.5t-45.5 20.5q-57 10 -107.5 32.5t-88 51.5t-59.5 62t-22 64zM75 509q0 -10 11.5 -26.5t33 -34.5t52 -35t68.5 -29q-12 39 -21.5 85.5t-16.5 92.5h-127v-53zM585 384q38 12 68.5 29t52 35t33 34.5t11.5 26.5v53h-128 q-6 -46 -15.5 -92.5t-21.5 -85.5z" />
<glyph unicode="&#xf092;" horiz-adv-x="750" d="M0 94v562q0 19 7.5 36.5t20 30t29.5 20t37 7.5h562q39 0 66.5 -27.5t27.5 -66.5v-562q0 -20 -7.5 -37t-20 -29.5t-30 -20t-36.5 -7.5h-562q-39 0 -66.5 27.5t-27.5 66.5zM94 321q0 -44 11 -82.5t41.5 -67t85.5 -45t143 -16.5t142.5 16.5t85.5 45t42 67t11 82.5 q0 73 -46 127q4 16 5 36t-1.5 39t-7.5 36t-12 29h-14q-42 -2 -74 -22t-63 -37l-7 1q-8 0 -18.5 1t-22 1.5t-20.5 0.5q-18 0 -35 -1t-33 -3q-31 17 -63 37t-74 22h-14q-8 -12 -12.5 -29t-7 -36t-1.5 -39t5 -36q-46 -54 -46 -127zM183 289q15 60 84 67q13 2 27 1.5t30 -1.5 q7 0 25.5 -1t25.5 -1t25.5 1t25.5 1q16 1 30 1.5t26 -1.5q70 -7 85 -67q8 -33 -3 -61.5t-24 -41.5q-20 -20 -66 -32t-99 -12t-99 12t-66 32q-13 13 -24 41.5t-3 61.5zM242 265q0 -23 11 -39t27 -16t27 16t11 39t-11 38.5t-27 15.5t-27 -15.5t-11 -38.5zM432 265 q0 -23 11 -39t27 -16t27 16t11 39t-11 38.5t-27 15.5t-27 -15.5t-11 -38.5z" />
<glyph unicode="&#xf093;" d="M0 19v300q0 8 5.5 13.5t13.5 5.5h112q8 0 13.5 -5.5t5.5 -13.5v-169h600v169q0 8 5.5 13.5t13.5 5.5h112q8 0 13.5 -5.5t5.5 -13.5v-300q0 -19 -19 -19h-862q-19 0 -19 19zM169 473.5q-3 7.5 8 18.5l246 247q11 11 27 11t27 -11l247 -247q11 -11 7.5 -18.5t-18.5 -7.5 h-150v-244q0 -16 -11 -27t-27 -11h-150q-16 0 -26.5 11t-10.5 27v244h-150q-16 0 -19 7.5z" />
<glyph unicode="&#xf094;" horiz-adv-x="786" d="M1 251q-1 17 0.5 33.5t3.5 36.5q2 17 3.5 35t4.5 32q7 32 15 62.5t22 57.5q10 20 22 39.5t26 38.5q5 7 10.5 12t11.5 10l22 22q11 11 24 21t28 18t32 16q16 8 33 14.5t35 13.5q34 14 76 25l1 1q22 6 41.5 8.5t38.5 2.5q29 0 55 -4.5t52 -9.5q20 -4 41.5 -7.5t45.5 -3.5h1 q14 0 30.5 2.5t32.5 2.5q12 0 22 -3t16 -12q11 -15 12.5 -35t-0.5 -37t-4 -34.5t1 -35.5q2 -11 5.5 -19t7.5 -18q4 -9 5.5 -19.5t3.5 -20.5q9 -51 7.5 -95.5t-11.5 -83t-27.5 -72.5t-39.5 -65q-18 -24 -38.5 -47.5t-45 -44.5t-54 -38t-65.5 -29q-37 -13 -77.5 -16.5 t-77.5 -5.5h-15q-51 0 -95 8t-94 8h-2q-17 0 -37.5 -5t-40.5 -6h-1q-18 0 -32 8.5t-21 20.5q-10 17 -8.5 35.5t6.5 33.5t5 32.5t-2.5 37t-6 39.5t-4.5 40z" />
<glyph unicode="&#xf095;" horiz-adv-x="1000" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
+22 -3
View File
@@ -22,12 +22,17 @@
baseUrl = location.href.replace(rUrl, indexFile),
jQuery = /index-jq[^\.]*\.html$/.test(baseUrl),
debug = /index[^\.]*-debug\.html$/.test(baseUrl),
gae = (baseUrl.split('/').length == 4),
headEl = document.getElementsByTagName('head')[0],
sync = true;
sync = true,
angularVersion = {
current: '"NG_VERSION_FULL"', // rewrite during build
stable: '"NG_VERSION_STABLE"'
};
addTag('base', {href: baseUrl});
addTag('link', {rel: 'stylesheet', href: 'css/bootstrap.min.css', type: 'text/css'});
addTag('link', {rel: 'stylesheet', href: 'http://angularjs.org/css/font-awesome.css', type: 'text/css'});
addTag('link', {rel: 'stylesheet', href: 'css/font-awesome.css', type: 'text/css'});
addTag('link', {rel: 'stylesheet', href: 'css/docs.css', type: 'text/css'});
if (jQuery) addTag('script', {src: debug ? 'js/jquery.js' : 'js/jquery.min.js'});
addTag('script', {src: path('angular.js')}, sync);
@@ -37,9 +42,23 @@
addTag('script', {src: path('angular-bootstrap.js') }, sync);
addTag('script', {src: path('angular-bootstrap-prettify.js') }, sync);
addTag('script', {src: 'js/docs.js'}, sync);
addTag('script', {src: 'js/docs-keywords.js'}, sync);
addTag('script', {src: 'docs-keywords.js'}, sync);
function path(name) {
if (gae) {
if (name.match(/^angular(-\w+)?\.js/) && !name.match(/bootstrap/)) {
name = '//ajax.googleapis.com/ajax/libs/angularjs/' +
angularVersion.stable +
'/' +
name.replace(/\.js$/, '.min.js');
} else {
name = 'http://code.angularjs.org/' +
angularVersion.stable +
'/' +
name.replace(/\.js$/, '-' + angularVersion.stable +'.min.js');
}
return name;
}
return '../' + name.replace(/\.js$/, debug ? '.js' : '.min.js');
}
+12
View File
@@ -0,0 +1,12 @@
indexes:
# AUTOGENERATED
# This index.yaml is automatically updated whenever the dev_appserver
# detects that a new type of query is run. If you want to manage the
# index.yaml file manually, remove the above marker line (the line
# saying "# AUTOGENERATED"). If you want to manage some indexes
# manually, move them above the marker line. The index.yaml file is
# automatically uploaded to the admin console when you next deploy
# your application using appcfg.py.
+1 -1
View File
@@ -96,7 +96,7 @@ docsApp.directive.docTutorialReset = function() {
' <ol>\n' +
' <li><p>Reset the workspace to step ' + step + '.</p>' +
' <pre>' + command + '</pre></li>\n' +
' <li><p>Refresh your browser or check the app out on <a href="http://angular.github.com/angular-phonecat/step-{{docTutorialReset}}/app">angular\'s server</a>.</p></li>\n' +
' <li><p>Refresh your browser or check the app out on <a href="http://angular.github.com/angular-phonecat/step-' + step + '/app">Angular\'s server</a>.</p></li>\n' +
' </ol>\n' +
' </div>\n';
}
+18
View File
@@ -0,0 +1,18 @@
import webapp2
from google.appengine.ext.webapp import template
class IndexHandler(webapp2.RequestHandler):
def get(self):
fragment = self.request.get('_escaped_fragment_')
if fragment:
fragment = '/partials' + fragment + '.html'
self.redirect(fragment, permanent=True)
else:
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write(template.render('index-nocache.html', None))
app = webapp2.WSGIApplication([('/', IndexHandler)])
+38 -18
View File
@@ -4,7 +4,7 @@
*/
var qfs = require('q-fs');
var Q = require('qq');
var OUTPUT_DIR = "build/docs/";
var OUTPUT_DIR = 'build/docs/';
var fs = require('fs');
exports.output = output;
@@ -17,29 +17,27 @@ function output(file, content) {
};
//recursively create directory
exports.makeDir = function(path) {
var parts = path.split(/\//);
exports.makeDir = function(p) {
var parts = p.split(/\//);
var path = ".";
//Sequentially create directories
var done = Q.defer();
(function createPart() {
if(!parts.length) {
done.resolve();
} else {
path += "/" + parts.shift();
qfs.isDirectory(path).then(function(isDir) {
if(!isDir) {
qfs.makeDirectory(path);
// Recursively rebuild directory structure
return qfs.exists(p).
then(function createPart(exists) {
if(!exists && parts.length) {
path += "/" + parts.shift();
return qfs.exists(path).then(function(exists) {
if (!exists) {
return qfs.makeDirectory(path).then(createPart, createPart);
} else {
return createPart();
}
});
}
createPart();
});
}
})();
return done.promise;
};
exports.copyTpl = function(filename) {
exports.copyTemplate = function(filename) {
return exports.copy('docs/src/templates/' + filename, filename);
};
@@ -59,8 +57,29 @@ exports.copy = function(from, to, transform) {
}
return output(to, content);
});
};
exports.symlink = symlink;
function symlink(from, to) {
return qfs.exists(to).then(function(exists) {
if (!exists) {
return qfs.symbolicLink(to, from);
}
});
}
exports.symlinkTemplate = symlinkTemplate;
function symlinkTemplate(filename) {
var dest = OUTPUT_DIR + filename,
dirDepth = dest.split('/').length,
src = Array(dirDepth).join('../') + 'docs/src/templates/' + filename;
return symlink(src, dest);
}
/* Replace placeholders in content accordingly
* @param content{string} content to be modified
* @param replacements{obj} key and value pairs in which key will be replaced with value in content
@@ -132,3 +151,4 @@ exports.toString = function toString(obj) {
function noop() {};
+1
View File
@@ -2,6 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Personal Log Scenario Runner</title>
<meta http-equiv="expires" content="0">
<script type="text/javascript" src="../../../src/scenario/angular-bootstrap.js" ng:autotest></script>
<script type="text/javascript" src="personalLogScenario.js"></script>
</head>
+19 -3
View File
@@ -1,4 +1,20 @@
#!/bin/bash
if [ ! -e gen_docs.disable ]; then
./node_modules/.bin/jasmine-node docs/spec --noColor && node docs/src/gen-docs.js
#!/usr/bin/env bash
JASMINE_NODE='jasmine-node'
if ! type -p "$JASMINE_NODE" >/dev/null 2>&1;then
# Locally (npm)-installed jasmine-node
local_jasmine='./node_modules/.bin/jasmine-node'
if [[ -x "$local_jasmine" ]];then
JASMINE_NODE="$local_jasmine"
else
echo 'Could not find a locally or globally installed executable of' \
'jasmine-node. Try: `npm install jasmine-node`.' >&2
exit 1
fi
fi
if [[ ! -e gen_docs.disable ]]; then
echo 'Testing, then building documentation...'
"$JASMINE_NODE" docs/spec --noColor && node docs/src/gen-docs.js
fi
+1
View File
@@ -2,6 +2,7 @@
<html xmlns:ng="http://angularjs.org" wiki:ng="http://angularjs.org">
<head>
<meta charset="utf-8">
<meta http-equiv="expires" content="0">
<title>&lt;angular/&gt; Docs Scenario Runner</title>
<script type="text/javascript" src="../../build/angular-scenario.js" ng:autotest></script>
<script type="text/javascript" src="i18n-e2e.js"></script>
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

@@ -1,5 +1,5 @@
%!PS-Adobe-3.0 EPSF-3.0
%%HiResBoundingBox: 0.000000 0.000000 270.000000 286.000000
%%HiResBoundingBox: 0.000000 0.000000 576.000000 733.000000
%APL_DSC_Encoding: UTF8
%APLProducer: (Version 10.7.4 (Build 11E53) Quartz PS Context)
%%Title: (Unknown)
@@ -9,7 +9,7 @@
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%Pages: 1
%%BoundingBox: 0 0 270 286
%%BoundingBox: 0 0 576 733
%%EndComments
%%BeginProlog
%%BeginFile: cg-pdf.ps
@@ -641,7 +641,7 @@ setpacking
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%PageBoundingBox: 0 0 270 286
%%PageBoundingBox: 0 0 576 733
%%BeginPageSetup
cg_md begin
bp
@@ -777,60 +777,60 @@ end ] /Cs2 exch/ColorSpace dr pop
/Cs1 SC
0.70200002 0.70200002 0.70200002 sc
q
0 0 270 286 rc
134.50345 286.50027 m
0.14711758 239.24472 l
21.309576 63.782761 l
131.34686 1.500285 l
247.69739 64.623795 l
268.85287 240.07863 l
0 0 576 733 rc
285 509.375 m
151.07672 462.24445 l
172.23918 286.78247 l
285.14185 224.72813 l
398.62698 287.6235 l
419.78247 463.07834 l
h
134.50345 286.50027 m
285 509.375 m
f
/Cs2 SC
0.64759099 0.110541 0.14820901 sc
253.08495 229.93858 m
131.34766 271.45135 l
131.34766 16.55443 l
233.36922 73.016136 l
406.42447 452.9386 m
284.68719 494.45135 l
284.68719 239.55443 l
386.70874 296.01614 l
h
253.08495 229.93858 m
406.42447 452.9386 m
f
0.84938598 0.106006 0.16429099 sc
12.765604 229.18932 m
30.899569 72.266991 l
131.34637 16.553787 l
131.34637 271.45712 l
166.10512 452.18933 m
184.23909 295.267 l
284.68588 239.55379 l
284.68588 494.45712 l
h
12.765604 229.18932 m
166.10512 452.18933 m
f
/Cs1 SC
0.949 0.949 0.949 sc
159.56511 144.66975 m
131.56966 203.13362 l
106.92307 144.66975 l
312.90463 367.66977 m
284.90918 426.13361 l
260.26257 367.66977 l
h
170.239 120.08728 m
96.02845 120.08728 l
79.426292 78.560425 l
48.544998 77.99012 l
131.34871 262.19614 l
217.03836 77.99012 l
188.41589 77.99012 l
323.57852 343.08728 m
249.36797 343.08728 l
232.76581 301.56042 l
201.88452 300.99011 l
284.68823 485.19614 l
370.3779 300.99011 l
341.7554 300.99011 l
h
170.239 120.08728 m
323.57852 343.08728 m
f
0.70200002 0.70200002 0.70200002 sc
131.34749 262.1965 m
131.56853 203.13387 l
159.56412 144.57025 l
131.34749 144.57025 l
131.34749 119.63145 l
170.23799 120.08707 l
188.41479 77.983162 l
217.96376 77.434608 l
284.68701 485.1965 m
284.90805 426.13385 l
312.875 367.625 l
284.75 367.625 l
284.68701 343.125 l
323.57751 343.08707 l
341.7543 300.98315 l
371.30328 300.4346 l
h
131.34749 262.1965 m
284.68701 485.1965 m
f
ep
end
+60 -60
View File
@@ -46,7 +46,7 @@
<key>Creator</key>
<string>Igor Minar</string>
<key>DisplayScale</key>
<string>1 0/72 in = 1 0/72 in</string>
<string>1 0/72 in = 1.0000 in</string>
<key>ExportShapes</key>
<array>
<dict>
@@ -148,41 +148,41 @@
<array>
<dict>
<key>Bounds</key>
<string>{{284.84766018978735, 248.30385248489227}, {86.61627414036225, 184.76191147289623}}</string>
<string>{{285.18700760649972, 248.30348312289235}, {86.616274140362918, 184.7619127031216}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>33</integer>
<integer>47</integer>
<key>Shape</key>
<string>Bezier</string>
<key>ShapeData</key>
<dict>
<key>UnitPoints</key>
<array>
<string>{-0.50000199999999995, -0.50000199999999995}</string>
<string>{-0.50000199999999995, -0.50000199999999995}</string>
<string>{-0.49745, -0.18033299999999999}</string>
<string>{-0.49745, -0.18033299999999999}</string>
<string>{-0.49745, -0.18033299999999999}</string>
<string>{-0.174236, 0.13663500000000001}</string>
<string>{-0.174236, 0.13663500000000001}</string>
<string>{-0.174236, 0.13663500000000001}</string>
<string>{-0.50000199999999995, 0.13663500000000001}</string>
<string>{-0.50000199999999995, 0.13663500000000001}</string>
<string>{-0.50000199999999995, 0.13663500000000001}</string>
<string>{-0.50000199999999995, 0.27161299999999999}</string>
<string>{-0.50000199999999995, 0.27161299999999999}</string>
<string>{-0.50000199999999995, 0.27161299999999999}</string>
<string>{-0.051004399999999998, 0.26914700000000003}</string>
<string>{-0.051004399999999998, 0.26914700000000003}</string>
<string>{-0.051004399999999998, 0.26914700000000003}</string>
<string>{0.15884999999999999, 0.497029}</string>
<string>{0.15884999999999999, 0.497029}</string>
<string>{0.15884999999999999, 0.497029}</string>
<string>{0.499998, 0.499998}</string>
<string>{0.499998, 0.499998}</string>
<string>{0.499998, 0.499998}</string>
<string>{-0.50000199999999995, -0.50000199999999995}</string>
<string>{-0.50000000000000044, -0.50000000000000022}</string>
<string>{-0.50000000000000044, -0.50000000000000022}</string>
<string>{-0.49744799999999412, -0.18033099999999691}</string>
<string>{-0.49744799999999412, -0.18033099999999691}</string>
<string>{-0.49744799999999412, -0.18033099999999691}</string>
<string>{-0.17456470884650166, 0.13634065677823681}</string>
<string>{-0.17456470884650166, 0.13634065677823681}</string>
<string>{-0.17456470884650166, 0.13634065677823681}</string>
<string>{-0.49927274182449377, 0.13634065677823681}</string>
<string>{-0.49927274182449644, 0.13634065677823681}</string>
<string>{-0.49927274182449244, 0.13634065677824014}</string>
<string>{-0.50000000000000044, 0.26894374386235298}</string>
<string>{-0.50000000000000044, 0.26894374386235476}</string>
<string>{-0.50000000000000044, 0.26894374386235476}</string>
<string>{-0.05100239999999534, 0.26914900000000563}</string>
<string>{-0.05100239999999534, 0.26914900000000563}</string>
<string>{-0.05100239999999534, 0.26914900000000563}</string>
<string>{0.15885200000000133, 0.49703099999999867}</string>
<string>{0.15885200000000133, 0.49703099999999867}</string>
<string>{0.15885200000000133, 0.49703099999999867}</string>
<string>{0.49999999999999956, 0.49999999999999978}</string>
<string>{0.49999999999999956, 0.49999999999999978}</string>
<string>{0.49999999999999956, 0.49999999999999978}</string>
<string>{-0.50000000000000044, -0.50000000000000022}</string>
</array>
</dict>
<key>Style</key>
@@ -391,11 +391,11 @@
</dict>
<dict>
<key>Bounds</key>
<string>{{202.044999428295, 248.30385248489222}, {168.49336609890284, 184.20602394696493}}</string>
<string>{{202.38452007755603, 248.30385264671821}, {168.49336609890284, 184.20602517348959}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>34</integer>
<integer>46</integer>
<key>Shape</key>
<string>pdfImport-2.1</string>
<key>Style</key>
@@ -604,11 +604,11 @@
</dict>
<dict>
<key>Bounds</key>
<string>{{166.26560383964951, 239.04286269955807}, {118.58077106105195, 254.90334964372681}}</string>
<string>{{166.60512448891055, 239.04286279972013}, {118.58077106105196, 254.90335134098538}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>35</integer>
<integer>45</integer>
<key>Shape</key>
<string>Bezier</string>
<key>ShapeData</key>
@@ -657,11 +657,11 @@
</dict>
<dict>
<key>Bounds</key>
<string>{{284.8476601897874, 239.04864650040588}, {121.73728039477793, 254.89692319834035}}</string>
<string>{{285.18718083904844, 239.0486466006067}, {121.737280394778, 254.89692489555597}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>36</integer>
<integer>44</integer>
<key>Shape</key>
<string>Bezier</string>
<key>ShapeData</key>
@@ -710,35 +710,35 @@
</dict>
<dict>
<key>Bounds</key>
<string>{{153.64711757812501, 224.00000000000006}, {268.70574951171875, 285}}</string>
<string>{{151.57672119140636, 224.125}, {268.70574951171875, 284.64686308491594}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>37</integer>
<integer>43</integer>
<key>Shape</key>
<string>Bezier</string>
<key>ShapeData</key>
<dict>
<key>UnitPoints</key>
<array>
<string>{1.28746e-05, -0.50000100000000003}</string>
<string>{1.28746e-05, -0.50000100000000003}</string>
<string>{-0.5, -0.33419199999999999}</string>
<string>{-0.5, -0.33419199999999999}</string>
<string>{-0.5, -0.33419199999999999}</string>
<string>{-0.42124299999999998, 0.28146399999999999}</string>
<string>{-0.42124299999999998, 0.28146399999999999}</string>
<string>{-0.42124299999999998, 0.28146399999999999}</string>
<string>{-0.0117345, 0.49999900000000003}</string>
<string>{-0.0117345, 0.49999900000000003}</string>
<string>{-0.0117345, 0.49999900000000003}</string>
<string>{0.421269, 0.27851300000000001}</string>
<string>{0.421269, 0.27851300000000001}</string>
<string>{0.421269, 0.27851300000000001}</string>
<string>{0.5, -0.33711799999999997}</string>
<string>{0.5, -0.33711799999999997}</string>
<string>{0.5, -0.33711799999999997}</string>
<string>{1.28746e-05, -0.50000100000000003}</string>
<string>{-0.0015987597885285254, -0.5}</string>
<string>{-0.0015987597885287474, -0.50000000000000011}</string>
<string>{-0.5, -0.3344244345296401}</string>
<string>{-0.5, -0.3344244345296401}</string>
<string>{-0.5, -0.3344244345296401}</string>
<string>{-0.42124300000000381, 0.28199536109606704}</string>
<string>{-0.42124300000000381, 0.28199536109606704}</string>
<string>{-0.42124300000000381, 0.28199536109606704}</string>
<string>{-0.0010708520179374403, 0.5}</string>
<string>{-0.0010708520179369962, 0.5}</string>
<string>{-0.0010708520179369962, 0.49999999999999778}</string>
<string>{0.42126899999999967, 0.2790407000241486}</string>
<string>{0.42126899999999967, 0.2790407000241486}</string>
<string>{0.42126899999999967, 0.2790407000241486}</string>
<string>{0.5, -0.33735406458603656}</string>
<string>{0.5, -0.33735406458603656}</string>
<string>{0.5, -0.33735406458603656}</string>
<string>{-0.0015987597885287474, -0.5}</string>
</array>
</dict>
<key>Style</key>
@@ -964,7 +964,7 @@
<key>Lock</key>
<string>NO</string>
<key>Name</key>
<string>Layer 1</string>
<string>Layer 2</string>
<key>Print</key>
<string>YES</string>
<key>View</key>
@@ -993,7 +993,7 @@
<key>MasterSheets</key>
<array/>
<key>ModificationDate</key>
<string>2012-06-11 20:32:08 +0000</string>
<string>2012-06-15 23:51:34 +0000</string>
<key>Modifier</key>
<string>Igor Minar</string>
<key>NotesVisible</key>
@@ -1074,7 +1074,7 @@
</dict>
</array>
<key>Frame</key>
<string>{{947, 686}, {710, 872}}</string>
<string>{{258, 0}, {1286, 1028}}</string>
<key>ListView</key>
<true/>
<key>OutlineWidth</key>
@@ -1088,15 +1088,15 @@
<key>SidebarWidth</key>
<integer>120</integer>
<key>VisibleRegion</key>
<string>{{0, 0}, {575, 733}}</string>
<string>{{80, 207.5}, {287.75, 222.25}}</string>
<key>Zoom</key>
<real>1</real>
<real>4</real>
<key>ZoomValues</key>
<array>
<array>
<string>Canvas 1</string>
<real>1</real>
<real>1</real>
<real>4</real>
<real>2</real>
</array>
</array>
</dict>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

+249 -248
View File
@@ -1,5 +1,5 @@
%!PS-Adobe-3.0 EPSF-3.0
%%HiResBoundingBox: 0.000000 0.000000 688.000000 178.000000
%%HiResBoundingBox: 0.000000 0.000000 792.000000 612.000000
%APL_DSC_Encoding: UTF8
%APLProducer: (Version 10.7.4 (Build 11E53) Quartz PS Context)
%%Title: (Unknown)
@@ -9,7 +9,7 @@
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%Pages: 1
%%BoundingBox: 0 0 688 178
%%BoundingBox: 0 0 792 612
%%EndComments
%%BeginProlog
%%BeginFile: cg-pdf.ps
@@ -641,7 +641,7 @@ setpacking
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%PageBoundingBox: 0 0 688 178
%%PageBoundingBox: 0 0 792 612
%%BeginPageSetup
cg_md begin
bp
@@ -836,293 +836,237 @@ end ] /Cs3 exch/ColorSpace dr pop
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
] def
/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs1 exch/ColorSpace dr pop
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
] def
/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs1 exch/ColorSpace dr pop
[ /CIEBasedABC 4 dict dup begin
/WhitePoint [ 0.9505 1.0000 1.0891 ] def
/WhitePoint [ 0.9505 1.0000 1.0891 ] def
/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def
/MatrixABC [ 0.4295 0.2318 0.0204 0.3278 0.6722 0.1111 0.1933 0.0960 0.9578 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs2 exch/ColorSpace dr pop
[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def
/DecodeA { { 1.8008 exp } bind exec} bind
def
/MatrixA [ 0.9642 1.0000 0.8249 ] def
/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def
/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def
end ] /Cs3 exch/ColorSpace dr pop
%%EndPageSetup
/MatrixABC [ 0.4295 0.2318 0.0204 0.3278 0.6722 0.1111 0.1933 0.0960 0.9578 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs2 exch/ColorSpace dr pop
[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def
/DecodeA { { 1.8008 exp } bind exec} bind
def
/MatrixA [ 0.9642 1.0000 0.8249 ] def
/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def
/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def
end ] /Cs3 exch/ColorSpace dr pop
%%EndPageSetup
0.60000002 i
/Cs1 SC
/Cs1 SC
0.80000001 0.80000001 0.80000001 sc
q
0 0 688 178 rc
176.74812 49.984085 m
176.74812 120.78504 l
185.90648 120.78504 l
229.23265 63.750435 l
q
0 0 792 612 rc
228.74812 284.98407 m
228.74812 355.78503 l
237.90648 355.78503 l
281.23267 298.75043 l
281.23267 355.78503 l
237.89432 120.78504 l
289.89432 355.78503 l
289.89432 284.98407 l
228.73584 49.984085 l
185.41418 107.51982 l
185.41418 49.984085 l
h
176.74812 49.984085 m
f
308.19809 52.757084 m
302.49023 50.575108 296.32993 49.488499 289.73062 49.488499 c
264.08719 49.488499 251.26088 61.782288 251.26088 86.374664 c
251.26088 109.64517 263.63925 121.2829 288.39111 121.2829 c
280.73584 284.98407 l
237.41418 342.51981 l
237.41418 284.98407 l
h
228.74812 284.98407 m
f
360.19809 287.75708 m
354.49023 285.5751 348.32993 284.48849 341.73062 284.48849 c
316.08719 284.48849 303.26089 296.78229 303.26089 321.37466 c
303.26089 344.64517 315.63925 356.2829 340.39111 356.2829 c
347.4917 356.2829 354.09549 355.2894 360.19809 353.30688 c
308.19809 110.38602 l
360.19809 345.38602 l
354.09549 347.69656 347.81989 348.85419 341.38028 348.85419 c
270.07437 113.85419 260.42374 104.69136 260.42374 86.374664 c
260.42374 66.736244 269.92365 56.912685 288.94119 56.912685 c
291.97458 56.912685 295.34091 57.311863 299.03973 58.105694 c
299.03973 82.165764 l
308.19809 82.165764 l
h
308.19809 52.757084 m
f
322.80499 77.313988 m
322.80499 120.78176 l
331.95868 120.78176 l
331.95868 77.313988 l
331.95868 63.716141 338.72659 56.90834 352.26227 56.90834 c
322.07437 348.85419 312.42374 339.69135 312.42374 321.37466 c
312.42374 301.73624 321.92365 291.91269 340.94119 291.91269 c
343.97458 291.91269 347.34091 292.31186 351.03973 293.10568 c
351.03973 317.16577 l
360.19809 317.16577 l
h
360.19809 287.75708 m
f
374.80499 312.314 m
374.80499 355.78177 l
383.95868 355.78177 l
383.95868 312.314 l
383.95868 298.71613 390.72659 291.90833 404.26227 291.90833 c
417.79367 291.90833 424.56161 298.71613 424.56161 312.314 c
372.56161 120.78176 l
424.56161 355.78177 l
433.72 355.78177 l
381.72 77.313988 l
381.72 58.757664 371.90063 49.483959 352.26227 49.483959 c
332.62411 49.483959 322.80499 58.757664 322.80499 77.313988 c
h
322.80499 77.313988 m
f
433.72 312.314 l
433.72 293.75766 423.90063 284.48395 404.26227 284.48395 c
384.62411 284.48395 374.80499 293.75766 374.80499 312.314 c
h
374.80499 312.314 m
f
459.21707 355.78491 m
407.21707 57.408146 l
459.21707 292.40814 l
496.25839 292.40814 l
444.25839 49.983799 l
398.06299 49.983799 l
398.06299 120.7849 l
h
407.21707 120.7849 m
f
457.47324 49.9828 m
447.96887 49.9828 l
483.16986 130.1239 l
518.37054 49.9828 l
508.22327 49.9828 l
499.06049 72.264427 l
475.64798 72.264427 l
478.17154 79.684296 l
495.99576 79.684296 l
482.77505 111.77191 l
h
496.25839 284.9838 l
450.06299 284.9838 l
450.06299 355.78491 l
h
459.21707 355.78491 m
f
509.47324 284.98279 m
499.96887 284.98279 l
535.16986 365.1239 l
570.37054 284.98279 l
560.22327 284.98279 l
551.06049 307.26443 l
527.64801 307.26443 l
530.17151 314.6843 l
547.99579 314.6843 l
534.77509 346.77191 l
h
509.47324 284.98279 m
f
f
580.026 284.9838 m
580.026 355.78491 l
558.2287 120.7849 l
571.69794 120.7849 578.43042 115.12138 578.43042 103.80305 c
578.43042 94.591537 571.84869 87.774872 558.67651 83.357361 c
582.98511 49.983799 l
570.90399 49.983799 l
548.37842 81.818558 l
548.37842 87.805794 l
561.90985 89.956886 568.67322 95.154831 568.67322 103.40387 c
568.67322 109.93683 564.91235 113.20982 557.39032 113.20982 c
537.18433 113.20982 l
610.2287 355.78491 l
623.69794 355.78491 630.43042 350.12137 630.43042 338.80304 c
630.43042 329.59152 623.84869 322.77487 610.67651 318.35736 c
634.98511 284.9838 l
622.90399 284.9838 l
600.37842 316.81857 l
600.37842 322.80579 l
613.90985 324.95688 620.67322 330.15485 620.67322 338.40387 c
620.67322 344.93683 616.91235 348.20981 609.39032 348.20981 c
589.18433 348.20981 l
589.18433 284.9838 l
h
h
580.026 284.9838 m
f
617.29883 120.78476 m
617.29883 70.380463 l
617.29883 56.782616 609.29364 49.983658 593.28302 49.983658 c
593.28302 57.408005 l
603.18652 57.408005 608.14044 61.736641 608.14044 70.380463 c
608.14044 120.78476 l
h
617.29883 120.78476 m
f
633.63721 52.46014 m
633.63721 60.877819 l
f
669.29883 355.78476 m
669.29883 305.38046 l
669.29883 291.78262 661.29364 284.98367 645.28302 284.98367 c
645.28302 292.40799 l
655.18652 292.40799 660.14044 296.73663 660.14044 305.38046 c
660.14044 355.78476 l
h
669.29883 355.78476 m
f
685.63721 287.46014 m
685.63721 295.87781 l
693.06586 293.23901 701.08435 291.91296 709.70166 291.91296 c
669.88049 56.912975 675.97418 61.370113 675.97418 70.288918 c
721.88049 291.91296 727.97418 296.37012 727.97418 305.28891 c
727.97418 312.86853 723.48145 316.67374 714.50482 316.67374 c
653.39075 81.673752 l
638.57324 81.673752 631.1579 88.104584 631.1579 100.97937 c
631.1579 114.51068 640.65326 121.28304 659.63544 121.28304 c
667.88458 121.28304 675.55713 120.28517 682.65771 118.30709 c
682.65771 109.88949 l
675.55713 112.53275 667.88458 113.85419 659.63544 113.85419 c
646.76044 113.85419 640.32526 109.56124 640.32526 100.97937 c
640.32526 93.39106 644.68042 89.594734 653.39075 89.594734 c
662.50482 89.594734 l
677.58411 89.594734 685.13257 83.154999 685.13257 70.288918 c
685.13257 56.420681 675.99194 49.488644 657.70166 49.488644 c
705.39075 316.67374 l
690.57324 316.67374 683.1579 323.10458 683.1579 335.97937 c
683.1579 349.51068 692.65326 356.28305 711.63544 356.28305 c
719.88458 356.28305 727.55713 355.28519 734.65771 353.3071 c
734.65771 344.8895 l
727.55713 347.53275 719.88458 348.85419 711.63544 348.85419 c
698.76044 348.85419 692.32526 344.56125 692.32526 335.97937 c
692.32526 328.39105 696.68042 324.59473 705.39075 324.59473 c
714.50482 324.59473 l
729.58411 324.59473 737.13257 318.155 737.13257 305.28891 c
737.13257 291.42068 727.99194 284.48865 709.70166 284.48865 c
701.08435 284.48865 693.06586 285.48215 685.63721 287.46014 c
h
h
685.63721 287.46014 m
f
0 0 0 sc
179.065 52.29694 m
179.065 123.09805 l
188.2233 123.09805 l
231.54478 66.063293 l
f
0 0 0 sc
231.065 287.29694 m
231.065 358.09805 l
240.2233 358.09805 l
283.5448 301.06329 l
283.5448 358.09805 l
240.2108 123.09805 l
292.21078 358.09805 l
292.21078 287.29694 l
231.05251 52.29694 l
187.72661 109.83282 l
187.72661 52.29694 l
h
179.065 52.29694 m
f
310.5148 55.071156 m
304.80685 52.889252 298.65097 51.802643 292.0473 51.802643 c
266.40384 51.802643 253.57788 64.096718 253.57788 88.688797 c
253.57788 111.95946 265.95596 123.59705 290.7124 123.59705 c
283.05249 287.29694 l
239.72661 344.83282 l
239.72661 287.29694 l
h
231.065 287.29694 m
f
362.5148 290.07117 m
356.80685 287.88925 350.65097 286.80264 344.0473 286.80264 c
318.40384 286.80264 305.57788 299.09671 305.57788 323.68881 c
305.57788 346.95947 317.95596 358.59705 342.7124 358.59705 c
349.80835 358.59705 356.41211 357.60355 362.5148 355.62109 c
310.5148 112.70016 l
362.5148 347.70016 l
356.41211 350.0108 350.13666 351.16818 343.70129 351.16818 c
272.39566 116.16819 262.74057 107.00565 262.74057 88.688797 c
262.74057 69.050529 272.24487 59.226974 291.25775 59.226974 c
294.29147 59.226974 297.66214 59.621628 301.36093 60.419838 c
301.36093 84.480034 l
310.5148 84.480034 l
h
310.5148 55.071156 m
f
325.121 79.629349 m
325.121 123.10176 l
334.27481 123.10176 l
334.27481 79.629349 l
334.27481 66.031647 341.04266 59.22834 354.5784 59.22834 c
324.39566 351.16818 314.74057 342.00565 314.74057 323.68881 c
314.74057 304.05054 324.24487 294.22696 343.25775 294.22696 c
346.29147 294.22696 349.66214 294.62164 353.36093 295.41983 c
353.36093 319.48004 l
362.5148 319.48004 l
h
362.5148 290.07117 m
f
377.121 314.62936 m
377.121 358.10175 l
386.27481 358.10175 l
386.27481 314.62936 l
386.27481 301.03165 393.04266 294.22833 406.5784 294.22833 c
420.1098 294.22833 426.87772 301.03165 426.87772 314.62936 c
374.87772 123.10176 l
426.87772 358.10175 l
436.03601 358.10175 l
436.03601 314.62936 l
436.03601 296.0733 426.21677 286.80396 406.5784 286.80396 c
334.94012 51.803959 325.121 61.073315 325.121 79.629349 c
h
325.121 79.629349 m
f
409.53391 123.1019 m
409.53391 59.725143 l
386.94012 286.80396 377.121 296.0733 377.121 314.62936 c
h
377.121 314.62936 m
f
461.53391 358.1019 m
461.53391 294.72516 l
498.57092 294.72516 l
446.57092 52.3008 l
498.57092 287.30081 l
452.37991 287.30081 l
400.37991 123.1019 l
h
409.53391 123.1019 m
f
459.79037 52.298141 m
450.28601 52.298141 l
485.487 132.44374 l
520.68768 52.298141 l
510.53598 52.298141 l
501.37766 74.579819 l
477.96069 74.579819 l
480.48865 82.004028 l
498.30862 82.004028 l
485.09207 114.0916 l
h
459.79037 52.298141 m
f
452.37991 358.1019 l
h
461.53391 358.1019 m
f
511.79037 287.29813 m
502.28601 287.29813 l
537.487 367.44373 l
572.68768 287.29813 l
562.53601 287.29813 l
553.37762 309.5798 l
529.96069 309.5798 l
532.48865 317.00403 l
550.30859 317.00403 l
537.09204 349.09161 l
h
511.79037 287.29813 m
f
582.34314 287.29694 m
530.34314 123.09805 l
560.54559 123.09805 l
574.01495 123.09805 580.74292 117.43898 580.74292 106.11619 c
580.74292 96.909142 574.16571 90.088005 560.99365 85.670769 c
585.30219 52.29694 l
573.21667 52.29694 l
550.6955 84.131691 l
550.6955 90.12352 l
564.22681 92.274475 570.99469 97.467834 570.99469 105.72161 c
570.99469 112.25443 567.22937 115.52296 559.703 115.52296 c
539.50146 115.52296 l
539.50146 52.29694 l
h
530.34314 52.29694 m
f
/Cs2 SC
0.64759099 0.110541 0.14820901 sc
619.61481 123.1019 m
619.61481 72.697609 l
619.61481 59.095158 611.60956 52.3008 595.59918 52.3008 c
595.59918 59.725002 l
605.50244 59.725002 610.4563 64.05378 610.4563 72.697609 c
610.4563 123.1019 l
h
619.61481 123.1019 m
f
635.9502 54.776783 m
635.9502 63.194389 l
643.37909 60.555656 651.39771 59.229687 660.01495 59.229687 c
672.1936 59.229687 678.28735 63.686829 678.28735 72.601181 c
678.28735 80.185112 673.79474 83.985817 664.81824 83.985817 c
655.7041 83.985817 l
640.8866 83.985817 633.47113 90.421173 633.47113 103.29616 c
633.47113 116.82754 642.96204 123.59975 661.94855 123.59975 c
670.19781 123.59975 677.87054 122.60188 684.97089 120.62388 c
684.97089 112.2062 l
677.87054 114.84938 670.19781 116.17104 661.94855 116.17104 c
649.07367 116.17104 642.63831 111.87782 642.63831 103.29616 c
642.63831 95.707779 646.9892 91.911324 655.7041 91.911324 c
664.81824 91.911324 l
679.89716 91.911324 687.4458 85.471725 687.4458 72.601181 c
687.4458 58.737247 678.30511 51.805355 660.01495 51.805355 c
651.39771 51.805355 643.37909 52.798702 635.9502 54.776783 c
h
635.9502 54.776783 m
f
/Cs1 SC
0.70200002 0.70200002 0.70200002 sc
83.181252 178.50018 m
-0.44589999 149.08699 l
12.726209 39.874538 l
81.216507 1.1081774 l
153.63634 40.398022 l
166.80409 149.60603 l
h
83.181252 178.50018 m
f
582.34314 358.09805 l
612.54559 358.09805 l
626.01495 358.09805 632.74292 352.439 632.74292 341.11618 c
632.74292 331.90915 626.16571 325.08801 612.99365 320.67078 c
637.30219 287.29694 l
81.217003 10.4783 l
625.21667 287.29694 l
602.6955 319.13168 l
602.6955 325.1235 l
616.22681 327.27448 622.99469 332.46783 622.99469 340.72162 c
622.99469 347.25443 619.22937 350.52295 611.703 350.52295 c
0.84938598 0.106006 0.16429099 sc
591.50146 350.52295 l
591.50146 287.29694 l
h
582.34314 287.29694 m
@@ -1412,6 +1356,63 @@ q#9d^l2KN<fDaA#e,.SmeGe%ug&C"1mJc_VqYpElrVlfks+13$s4dR)s+13$s+13$s24m'rqlZ\rpTl<
rk&0Vro!eDrqZWo!WN)/s8Murq#9^\hu:dt[/Q]sL]2SuE;jPMB)ZKCD#SPUJGtW/UAhS"b5U5rmf)t[
r0.0Ns8N#squ69fmJc)DfDa"n_>_(G[JmE0[f3r=_Z%^Wec+G)lMgDSq#:5`s8M0[])IKa=oLJ]/,g[j
'`JR@$2"S[#Q=tm#lYJ9=8pqQro!hUrlb9>rke^7qYp!`h>Y@lWW&%ZI/\*aB`;99<rQ+u>Q/45D#SYX
M#NqDZMquHhuVcorp]p_rr2'[[f?@'rpB^1rh07.r]^<"rX%fnnd!PJnd#-urX&Q?r[[t8r`oGHrfd>_
rkn`croO.Krq??grr)iqrVs&#rr)imrq??\roj@@rnRM*qq(i"rndY9rp'LQrq??frqqZRjo>>Zrqucl
qtU0arq69aqtL*crqucoS,`K`rlkA!r_`YKrZ1tMkm77qrY#2GrZM1hr[e%%q_8!grWr9(qZl?krY#3=
ro\k4huE]SrqZQbrp'LCrn@A%rm:Ydrl>#]rmUkurnRM7rpB^WrqHKk!W;lOs02P&qu6*ah#=naOoB"m
6iJD2&H2sq#1j+Z#6"u/&H3[K.K2@,:&\`'Jc;8?[JnAKh#?R;oD\Oaqu6T_s.B>jrpp!ardk+Hs+14,
s8Minao6Vc3rU3"&+9f'$iUtA./l@.;#Y#)GQ*?rPl@?TV>dXsYl:j*P5\)Q%f6M(#OD`q(B/g_on!.o
s8N#sr;6Bgq>U6fqu6NmrqHHIs/Q+urVlTkli,T:^Aaf)If<dT8cCRG,Q8MY%fQb5#Nc6i#Q>#.&H3IE
+T<nj2uZ8F<;pM/GlE[$TDl"m^])UZiVr6Do`"[cr;Q]Ts+13$s+14/s8L^NK)Rk2)ZC*C$2"T'$2tb?
2#^\XIf>l:Zi8#EeGeD*kl1#Ln,DnWo_\=\n,C?+ErI*Y#kA5h#lY).+TA\GqgndMs4dRIs8Murq#9g_
jo3g0_u?k=Sc4NGGlDFV@K':+:B!i^8,c'Y8cDKa=T2_-BE!)RKDq#4T`2%l\c0VJe,J2&kl1&Mo`"Ua
qu6Qnrmq+#s+13$s6'F]q#7Jr;#VL7$i:8*#lY/0)u`;*H2a`@bl6Q"n,E%[qYpEirp9[aqYoFPPQ!E<
$1\>l#l=l+7K2?Hrdk*Ss4dR=s8Mrqq>U'dnG_\Oir7[2df.Jia7@1JaSsE_d/MVqhYuR7li-DQoD\I_
q>U9jr;Q]6s+13$s+148s8MHcN;bX4&c2n-#lYS<5lQ<5\Gk:_nc&Carn%2Lrr2?b[/Nu&%e9l"#l"Z(
&H8-tqLS[Os4dR.s8N#srVQKhqXs[ZqYpEirVlf"s+13$s+14;s8MEbIJtSm$i:8'#lYkD@/d2*hZ!3I
r5ep;pAW>9E;gX2#Q@0kk^ic=s4dR)s+13$s+13$s7$'fnc".>,5qrH$2"T',5u]``;]6)rP/C3qu5IO
K`34q#j)Bk(&kuIr.4mTs4dR)s+13$s+13$s7?9ir;N#]-2n;L$2"T')ZFjXc2RCHs8N&trr20]R/SQ6
#jDTn#l]\[pjrIPs4dR)s+13$s+13$s7?9i_#?.h%/:/(#lY;4>Q2YAp9t"rs8MHcRf4E.#jDTn>lO5D
s0Vg\s+13$s+13$s+14Ds8MQf?2bE1$2=f*#Q?FVWrDRqs7QEkmf%h;'Boc$49";ls0Vg\s+13$s+13$
s+14Ds8KD),5qrH$2"T'$N=i?g]%/Xs763hj8N-Z$g\,t1&fo+rdk*Ys4dR)s+13$s+13$s7u]oo);Yg
%f6S'#lY\?V#L(ls6p!ea8R=_#k&#t0)jB"rIP!Xs4dR)s+13$s+13$s7u]oao3Xd#l=r$#lY).1]GGo
qlp+hs8Mlo?N(?$#Q?=Se,K;ss0r$_s+13$s+13$s+14Gs8JGc([MG,#Q@9ngA_&Ts6TdbR/RZc#Q?RZ
ec,Q!s0r$_s+13$s+13$s+14Gs8I$;&aTf&#Q@BqhZ!MYs6Tdb_u:D>#Q@HsjSo.0s0r$_s+13$s+13$
s+14Js8Mop?N(K%#lY).9`EuLrilFhs8L.>(\J%1#6&B:mXbDFs4dR)s+13$s+13$s8;orp&7ee%I=B"
#Q?[]fDb`Qs6Tdbb5N4M#Q=r,%K;RjpOW@Os4dR)s+13$s+13$s8;orq#4:m%dXK##Q>eD_>a>9s6Tdb
_u:AF#Q"`)/,m<_r.4mTs4dR)s+13$s+13$s8;orrr-C+&*sT$#Q>,1OT+mVs6TdbSGj)p#Q"`)?iK$`
rdk*Vs4dR)s+13$s+13$s7u]oIJsoW#O_rt#Q@9niirILs8H[1%/:),#6#S@TDnP8s0;UYs+13$s+13$
s+14Gs8K,!)YaR.#lY).')n6sos=\es8LjR0)c.R#Q"`)=oR"OrIP!Rs4dR)s+13$s+13$s7u]oiVkb7
$MXkp#lZUYb5V:Hs6p!eJc65X#Q"`)./p(Bo7?qEs4dR)s+13$s+13$s7u]or;M-D'ClD$#lY529)d<=
r42jus8Ke4-N4;M#Q"`)'E3=WiVrh-s/uCVs+13$s+13$s+14Ds8LIG1&_LJ#P\T(&,o3#a8YqJs7QEk
ec%l6$i:2.#6##0>5l\DqgndJs4dR)s+13$s+13$s7ZKlqu2QR([MD%#lYA62#a9Lo"Y5"s8Kt97fEkl
#Q>,19`DL"on!.As4dR)s+13$s+13$s7?9ilMbAo&F9Ys#lY52)?+"B^&I`Es8N&tlMcqF/cH1R#Q>,1
9`D9qmt(M8s4dR)s+13$s+13$s7?9irr1II:At^e#P\T(&H3sS?2g`#ir8r)s8M$WSc21Z)#aj:#Q>D9
<rTK*mXbD4s4dR)s+13$s+13$s7$'fqu4e<<;mEj#Q"f+$2tM8)ZD_qBE":t_>`<jm/HbMs8Murnc%\M
bl4C:DZ2]r)#asC#l=l+#6#kHDuRTPnU^_4s4dR)s+13$s+13$s6]jcqu5.FDuLXR#Q=qo#PAB%$N:Y:
(]GNU0`F67<rQe*D#RuE8H(UJ,lSY[')i4:#l"Z('E1H"OoEo1pOW@7s4dR)s+13$s+13$s6BX`r;PdV
S,PYO%J9qr#O_rt$2t;2%fR%4&cN=?$iUJ-#lY)+#Q>>73<".$]Dh$nqgnd8s4dR)s+13$s+13$s6'F]
rr2Kfao6kj3W9T_#4)TK#l"Z(#lY_@5lPp*Z2WY[q>UAEs-E]>s+13$s+13$s+14/s8MoplMeg&N;c]R
-2n>D#13\T$iV"B2#^h\MuL?fi;WKMrIP!1s4dR)s+13$s+13$s5*eTrr2cnn,Ci9Yl9@U>Q-Y^,Q8GW
%.=Dq#Q"`)%/pq>+T=.q9`Ao.O8cNce,J_5q#:5Cs,-j2s+13$s+13$s+14#s8N#sr;Q?fk5Nd-\Gi6%
MuJ&%CAq?7;uTYk:]=2i>5i47ErLakQN!ra_>`$bk5P&Qr;Q\Hs+14)s+13$s+13$s+13os8N#srVl]n
q#9d^l2KN<fDaA#e,.SmeGe%ug&C"1mJc_VqYpElrVlfks+13$s4dR)s+13$s+13$s24m'rqlZ\rpTl<
s+14)s+13$s+13$s+13$s+13$s4dR(
~> %APLeod
EI
0.60000002 i
0.70200002 0.70200002 0.70200002 sc
CM
134.74277 412.625 m
52.054291 383.52509 l
65.120667 275.1893 l
134.83035 236.875 l
204.89969 275.70859 l
217.96175 384.03998 l
h
134.74277 412.625 m
f
/Cs2 SC
0.64759099 0.110541 0.14820901 sc
209.7141 377.77936 m
134.54964 403.41068 l
Binary file not shown.
Binary file not shown.
+5 -1
View File
@@ -80,7 +80,10 @@ StaticServlet.MimeMap = {
'jpeg': 'image/jpeg',
'gif': 'image/gif',
'png': 'image/png',
'manifest': 'text/cache-manifest'
'manifest': 'text/cache-manifest',
// it should be application/font-woff
// but only this silences chrome warnings
'woff': 'font/opentype'
};
StaticServlet.prototype.handleRequest = function(req, res) {
@@ -105,6 +108,7 @@ StaticServlet.prototype.handleRequest = function(req, res) {
path = path.replace(match[0], '/index.html');
sys.puts('Rewrite to ' + path);
}
// end of docs rewriting
fs.stat(path, function(err, stat) {
+1 -1
View File
@@ -165,7 +165,7 @@ function JQLite(element) {
var div = document.createElement('div');
// Read about the NoScope elements here:
// http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx
div.innerHTML = '<div>&nbsp;</div>' + element; // IE insanity to make NoScope elements work!
div.innerHTML = '<div>&#160;</div>' + element; // IE insanity to make NoScope elements work!
div.removeChild(div.firstChild); // remove the superfluous div
JQLiteAddNodes(this, div.childNodes);
this.remove(); // detach the elements from the temporary DOM div.
+1 -1
View File
@@ -193,7 +193,7 @@ function setupModuleLoader(window) {
* @param {Function} directiveFactory Factory function for creating new instance of
* directives.
* @description
* See {@link ng.$compileProvider.directive $compileProvider.directive()}.
* See {@link ng.$compileProvider#directive $compileProvider.directive()}.
*/
directive: invokeLater('$compileProvider', 'directive'),
+1
View File
@@ -149,6 +149,7 @@ function Browser(window, document, $log, $sniffer) {
self.url = function(url, replace) {
// setter
if (url) {
if (lastBrowserUrl == url) return;
lastBrowserUrl = url;
if ($sniffer.history) {
if (replace) history.replaceState(null, '', url);
+23 -22
View File
@@ -31,7 +31,7 @@ var NON_ASSIGNABLE_MODEL_EXPRESSION = 'Non-assignable model expression: ';
* can then be used to link {@link ng.$rootScope.Scope scope} and the template together.
*
* The compilation is a process of walking the DOM tree and trying to match DOM elements to
* {@link ng.$compileProvider.directive directives}. For each match it
* {@link ng.$compileProvider#directive directives}. For each match it
* executes corresponding template function and collects the
* instance functions into a single template function which is then returned.
*
@@ -149,20 +149,6 @@ var NON_ASSIGNABLE_MODEL_EXPRESSION = 'Non-assignable model expression: ';
*
* @description
*/
/**
* @ngdoc function
* @name ng.$compileProvider#directive
* @methodOf ng.$compileProvider
* @function
*
* @description
* Register a new directive with compiler
*
* @param {string} name name of the directive.
* @param {function} directiveFactory An injectable directive factory function.
* @returns {ng.$compileProvider} Self for chaining.
*/
$CompileProvider.$inject = ['$provide'];
function $CompileProvider($provide) {
var hasDirectives = {},
@@ -174,17 +160,18 @@ function $CompileProvider($provide) {
/**
* @ngdoc function
* @name ng.$compileProvider.directive
* @name ng.$compileProvider#directive
* @methodOf ng.$compileProvider
* @function
*
* @description
* Register directives with the compiler.
* Register a new directives with the compiler.
*
* @param {string} name Name of the directive in camel-case. (ie <code>ngBind</code> which will match as
* <code>ng-bind</code>).
* @param {function} directiveFactory An injectable directive factroy function. See {@link guide/directive} for more
* info.
* @returns {ng.$compileProvider} Self for chaining.
*/
this.directive = function registerDirective(name, directiveFactory) {
if (isString(name)) {
@@ -310,6 +297,15 @@ function $CompileProvider($provide) {
}
};
var startSymbol = $interpolate.startSymbol(),
endSymbol = $interpolate.endSymbol(),
denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}')
? identity
: function denormalizeTemplate(template) {
return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol);
};
return compile;
//================================
@@ -323,7 +319,7 @@ function $CompileProvider($provide) {
// not be able to attach scope data to them, so we will wrap them in <span>
forEach($compileNode, function(node, index){
if (node.nodeType == 3 /* text node */) {
$compileNode[index] = jqLite(node).wrap('<span>').parent()[0];
$compileNode[index] = jqLite(node).wrap('<span></span>').parent()[0];
}
});
var compositeLinkFn = compileNodes($compileNode, transcludeFn, $compileNode, maxPriority);
@@ -589,14 +585,17 @@ function $CompileProvider($provide) {
}
}
if (directiveValue = directive.template) {
if ((directiveValue = directive.template)) {
assertNoDuplicate('template', templateDirective, directive, $compileNode);
templateDirective = directive;
$template = jqLite('<div>' + trim(directiveValue) + '</div>').contents();
compileNode = $template[0];
directiveValue = denormalizeTemplate(directiveValue);
if (directive.replace) {
$template = jqLite('<div>' +
trim(directiveValue) +
'</div>').contents();
compileNode = $template[0];
if ($template.length != 1 || compileNode.nodeType !== 1) {
throw new Error(MULTI_ROOT_TEMPLATE_ERROR + directiveValue);
}
@@ -909,6 +908,8 @@ function $CompileProvider($provide) {
success(function(content) {
var compileNode, tempTemplateAttrs, $template;
content = denormalizeTemplate(content);
if (replace) {
$template = jqLite('<div>' + trim(content) + '</div>').contents();
compileNode = $template[0];
+6 -1
View File
@@ -1,6 +1,11 @@
'use strict';
/*
/**
* @ngdoc directive
* @name ng.directive:a
* @restrict E
*
* @description
* Modifies the default behavior of html A tag, so that the default action is prevented when href
* attribute is empty.
*
+52 -28
View File
@@ -227,38 +227,62 @@ function FormController(element, attrs) {
</doc:scenario>
</doc:example>
*/
var formDirectiveDir = {
name: 'form',
restrict: 'E',
controller: FormController,
compile: function() {
return {
pre: function(scope, formElement, attr, controller) {
if (!attr.action) {
formElement.bind('submit', function(event) {
event.preventDefault();
});
}
var formDirectiveFactory = function(isNgForm) {
return ['$timeout', function($timeout) {
var formDirective = {
name: 'form',
restrict: 'E',
controller: FormController,
compile: function() {
return {
pre: function(scope, formElement, attr, controller) {
if (!attr.action) {
// we can't use jq events because if a form is destroyed during submission the default
// action is not prevented. see #1238
//
// IE 9 is not affected because it doesn't fire a submit event and try to do a full
// page reload if the form was destroyed by submission of the form via a click handler
// on a button in the form. Looks like an IE9 specific bug.
var preventDefaultListener = function(event) {
event.preventDefault
? event.preventDefault()
: event.returnValue = false; // IE
};
var parentFormCtrl = formElement.parent().controller('form'),
alias = attr.name || attr.ngForm;
addEventListenerFn(formElement[0], 'submit', preventDefaultListener);
if (alias) {
scope[alias] = controller;
}
if (parentFormCtrl) {
formElement.bind('$destroy', function() {
parentFormCtrl.$removeControl(controller);
if (alias) {
scope[alias] = undefined;
// unregister the preventDefault listener so that we don't not leak memory but in a
// way that will achieve the prevention of the default action.
formElement.bind('$destroy', function() {
$timeout(function() {
removeEventListenerFn(formElement[0], 'submit', preventDefaultListener);
}, 0, false);
});
}
extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
});
}
var parentFormCtrl = formElement.parent().controller('form'),
alias = attr.name || attr.ngForm;
if (alias) {
scope[alias] = controller;
}
if (parentFormCtrl) {
formElement.bind('$destroy', function() {
parentFormCtrl.$removeControl(controller);
if (alias) {
scope[alias] = undefined;
}
extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
});
}
}
};
}
};
}
return isNgForm ? extend(copy(formDirective), {restrict: 'EAC'}) : formDirective;
}];
};
var formDirective = valueFn(formDirectiveDir);
var ngFormDirective = valueFn(extend(copy(formDirectiveDir), {restrict: 'EAC'}));
var formDirective = formDirectiveFactory();
var ngFormDirective = formDirectiveFactory(true);
+1 -1
View File
@@ -1219,7 +1219,7 @@ var ngListDirective = function() {
ctrl.$parsers.push(parse);
ctrl.$formatters.push(function(value) {
if (isArray(value) && !equals(parse(ctrl.$viewValue), value)) {
if (isArray(value)) {
return value.join(', ');
}
+5 -2
View File
@@ -178,11 +178,14 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
whenExp = element.attr(attr.$attr.when), // this is because we have {{}} in attrs
offset = attr.offset || 0,
whens = scope.$eval(whenExp),
whensExpFns = {};
whensExpFns = {},
startSymbol = $interpolate.startSymbol(),
endSymbol = $interpolate.endSymbol();
forEach(whens, function(expression, key) {
whensExpFns[key] =
$interpolate(expression.replace(BRACE, '{{' + numberExp + '-' + offset + '}}'));
$interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +
offset + endSymbol));
});
scope.$watch(function() {
+7 -3
View File
@@ -521,7 +521,6 @@ var optionDirective = ['$interpolate', function($interpolate) {
return {
restrict: 'E',
priority: 100,
require: '^select',
compile: function(element, attr) {
if (isUndefined(attr.value)) {
var interpolateFn = $interpolate(element.text(), true);
@@ -530,8 +529,13 @@ var optionDirective = ['$interpolate', function($interpolate) {
}
}
return function (scope, element, attr, selectCtrl) {
if (selectCtrl.databound) {
return function (scope, element, attr) {
var selectCtrlName = '$selectController',
parent = element.parent(),
selectCtrl = parent.data(selectCtrlName) ||
parent.parent().data(selectCtrlName); // in case we are in optgroup
if (selectCtrl && selectCtrl.databound) {
// For some reason Opera defaults to true and if not overridden this messes up the repeater.
// We don't want the view to drive the initialization of the model anyway.
element.prop('selected', false);
+45 -7
View File
@@ -1,13 +1,13 @@
'use strict';
/**
* @ngdoc function
* @ngdoc object
* @name ng.$interpolateProvider
* @function
*
* @description
*
* Used for configuring the interpolation markup. Deafults to `{{` and `}}`.
* Used for configuring the interpolation markup. Defaults to `{{` and `}}`.
*/
function $InterpolateProvider() {
var startSymbol = '{{';
@@ -20,7 +20,8 @@ function $InterpolateProvider() {
* @description
* Symbol to denote start of expression in the interpolated string. Defaults to `{{`.
*
* @prop {string=} value new value to set the starting symbol to.
* @param {string=} value new value to set the starting symbol to.
* @returns {string|self} Returns the symbol when used as getter and self if used as setter.
*/
this.startSymbol = function(value){
if (value) {
@@ -38,14 +39,15 @@ function $InterpolateProvider() {
* @description
* Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
*
* @prop {string=} value new value to set the ending symbol to.
* @param {string=} value new value to set the ending symbol to.
* @returns {string|self} Returns the symbol when used as getter and self if used as setter.
*/
this.endSymbol = function(value){
if (value) {
endSymbol = value;
return this;
} else {
return startSymbol;
return endSymbol;
}
};
@@ -87,7 +89,7 @@ function $InterpolateProvider() {
* against.
*
*/
return function(text, mustHaveExpression) {
function $interpolate(text, mustHaveExpression) {
var startIndex,
endIndex,
index = 0,
@@ -139,7 +141,43 @@ function $InterpolateProvider() {
fn.parts = parts;
return fn;
}
};
}
/**
* @ngdoc method
* @name ng.$interpolate#startSymbol
* @methodOf ng.$interpolate
* @description
* Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.
*
* Use {@link ng.$interpolateProvider#startSymbol $interpolateProvider#startSymbol} to change
* the symbol.
*
* @returns {string} start symbol.
*/
$interpolate.startSymbol = function() {
return startSymbol;
}
/**
* @ngdoc method
* @name ng.$interpolate#endSymbol
* @methodOf ng.$interpolate
* @description
* Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
*
* Use {@link ng.$interpolateProvider#endSymbol $interpolateProvider#endSymbol} to change
* the symbol.
*
* @returns {string} start symbol.
*/
$interpolate.endSymbol = function() {
return endSymbol;
}
return $interpolate;
}];
}

Some files were not shown because too many files have changed in this diff Show More